JKS 포맷의 인증서는 java 계열 인증설정시 많이 사용한다.




예를 들어 아래와 같이 파일이 있다고 하자.

 - 메인 인증서 : test.com.crt

 - 개인키 : test.com.key

 - 체인인증서 : chain1.crt , chain2.crt

 - 루트인증서 : trustcaroot.crt




1. pem 형식으로 파일 압축하기

crt 및 개인키로 인증서를 적용하기 위해 pem 형식으로 변환

( 개인키 -> 메인인증서 -> 체인인증서 -> 루트인증서 순서이다.)

$ cat test.com.key test.com.crt chain1.crt chain2.crt trustcaroot.crt > test.com.pem



2. openssl 을 이용하여 pem -> pkcs12 포맷으로 변환

( test.com.pem 을 test.com.p12 로 변환 )

$ openssl pkcs12 -export -out test.com.p12 -in test.com.pem

변환 시 패드워드는 임의로 지정한다.



3. keytool 을 이용하여 pkcs12 -> jks 포맷으로 변환

( test.com.p12 을 test.com.jks 로 변환 )

$ keytool -importkeystore -srckeystore test.com.p12 -srcstoretype pkcs12 -destkeystore test.com.jks -deststoretype jks

패스워드는 위의 openssl 사용 시 사용했던 패스워드를 사용한다.



4. 변환된 인증서 확인

$ keytool -list -keystore test.com.jks


Enter keystore password:

 

Keystore type: JKS

Keystore provider: SUN

 

Your keystore contains 1 entry

 

1, Jan 18, 2016, PrivateKeyEntry,

Certificate fingerprint (SHA1): B4:8D:C1:78:55:56:28:87:BA:39:EB:52:44:38:C1:11:5C:2B:43:93


공인된 인증서는 대행업체나 인증업체에서 발급받는다.



인증 파일 목록

 - 메인 인증서

 - 개인키

 - 체인인증서

 - 루트인증서


예를 들어 

 - 메인 인증서 : test.com.crt

 - 개인키 : test.com.key

 - 체인인증서 : chain1.crt , chain2.crt

 - 루트인증서 : trustcaroot.crt

있다고 하자.





1. MOD-SSL 활성 시키기

아파치 ssl 모듈을 활성화 시켜야한다

$ sudo a2enmod ssl

$ sudo service apache2 restart



2. 체인인증서 하나로 합치기

체인인증서가 2개이상일 경우이고 자신이 사용하는 web server 설정에 체인인증서를 여러개 설정하지 못하는 경우에는 여러개의 체인인증서를 하나로 합쳐야 한다.


$ sudo cat chain1.crt chain2.crt > chain.pem






3. SSL 설정

기본 ssl 사이트 설정은 apache2 기준으로 /etc/apache2/sites-available/default-ssl.conf 에 존재한다.


인증서들은 /etc/apache2/ssl 에 위치 한다고 가정한다.

체인인증서는 하나로 합친 chain.crt 를 사용한다.


$ sudo vi /etc/apache2/sites-available/default-ssl.conf


<IfModule mod_ssl.c>

        <VirtualHost _default_:443>

                ServerAdmin webmaster@localhost

 

                DocumentRoot /var/www/html

<생략.....>


        SSLEngine on

       SSLCertificateFile    /etc/apache2/ssl/test.com.crt

       SSLCertificateKeyFile /etc/apache2/ssl/test.com.key

       SSLCertificateChainFile /etc/apache2/ssl/chain.pem

       SSLCACertificateFile /etc/apache2/ssl/trustcaroot.crt

<생략.....>



4. ssl 설정 사이트 활성화 시키기

위에서 설정한 default-ssl.conf 설정을 활성화 시키자.

$ sudo a2ensite default-ssl.conf

$ sudo service apache2 reload




5. 확인

브라우저를 통해 test.com 에 접속해본다. 

몽고디비 3.2가 특정 시간이 지난후 연결이 해제되는 문제가 발생했다. 몽고디비를 인증모드로 설정해서 그런것인지 테스트는 안해보았고 급해서 3.0 으로 다시 다운그레이드를 진행했다.



mongodb 3.0 apt repository 등록

$ echo "deb http://repo.mongodb.org/apt/ubuntu precise/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list


$ sudo apt-get update

$ sudo apt-get install --force-yes sudo apt-get install -y mongodb-org=3.0.0 mongodb-org-server=3.0.0 mongodb-org-shell=3.0.0 mongodb-org-mongos=3.0.0 mongodb-org-tools=3.0.0


// 다운그레이드시에는 --force-yes 옵션을 붙여야한다.





# echo {package-name} | sudo dpkg --set-selections 


예를 들어 mongodb를 업그레이드 시키고 싶지 않다면


# echo "mongodb-org hold" | sudo dpkg --set-selections
# echo "mongodb-org-server hold" | sudo dpkg --set-selections
# echo "mongodb-org-shell hold" | sudo dpkg --set-selections
# echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
# echo "mongodb-org-tools hold" | sudo dpkg --set-selections




참고 : https://www.virtualbox.org/manual/ch04.html



4.2.2.1. Installing the Linux Guest Additions

The VirtualBox Guest Additions for Linux are provided on the same virtual CD-ROM file as the Guest Additions for Windows described above. They also come with an installation program guiding you through the setup process, although, due to the significant differences between Linux distributions, installation may be slightly more complex.

Installation generally involves the following steps:

  1. Before installing the Guest Additions, you will have to prepare your guest system for building external kernel modules. This works similarly as described inSection 2.3.2, “The VirtualBox kernel module”, except that this step must now be performed in your Linux guest instead of on a Linux host system, as described there.

    Again, as with Linux hosts, we recommend using DKMS if it is available for the guest system. If it is not installed, use this command for Ubuntu/Debian systems:

    sudo apt-get install dkms

    or for Fedora systems:

    yum install dkms

    Be sure to install DKMS before installing the Linux Guest Additions. If DKMS is not available or not installed, the guest kernel modules will need to be recreated manually whenever the guest kernel is updated using the command

    /etc/init.d/vboxadd setup

    as root.

  2. Insert the VBoxGuestAdditions.iso CD file into your Linux guest's virtual CD-ROM drive, exactly the same way as described for a Windows guest in Section 4.2.1.1, “Installation”.

  3. Change to the directory where your CD-ROM drive is mounted and execute as root:

    sh ./VBoxLinuxAdditions.run

For your convenience, we provide the following step-by-step instructions for freshly installed copies of recent versions of the most popular Linux distributions. After these preparational steps, you can execute the VirtualBox Guest Additions installer as described above.

4.2.2.1.1. Ubuntu

  1. In order to fully update your guest system, open a terminal and run

    apt-get update

    as root followed by

    apt-get upgrade
  2. Install DKMS using

    apt-get install dkms
  3. Reboot your guest system in order to activate the updates and then proceed as described above.







정리  하면 

#sudo apt-get update
#sudo apt-get upgrade
#sudo apt-get install dkms
#sudo apt-get install gcc
#sudo apt-get install build-essential linux-headers-`uname -r`
#sudo /etc/init.d/vboxadd setup

// guest Addition 마운트하고 마운트 폴더내에서 
#sudo ./VBoxLinuxAdditions.run

이렇게 했는데도 Could not find the X.org or XFree86 Windows System이 뜬다면 아래와 같이 해라. (Guestadditions 는 X.Org libraries를 필요로한다.)
#sudo apt-get install xserver-xorg xserver-xorg-core
#sudo ./VBoxLinuxAdditions.run


이래도 안되면 그냥 ssh 연결해서 하자..ㅜㅜ

생각해보니까 ubuntu Server를 설치한 내가 왜 굳이 guest additions 를 설치하려고 했을까.. 





참고 : 

http://guguru.tistory.com/category/%5B%EA%B8%B0%EC%88%A0%EA%B2%80%ED%86%A0%20%26%20%EC%95%84%EC%9D%B4%ED%85%9C%5D

http://superlinuxer.com/DRBD

http://www.nidc.kr/customer/content.asp?board=tec&uid=967&board_group=2&params=skey=subject%5Epage=

http://www.drbd.org/docs/about/





DRBD 란?



DRBD는 블럭 디바이스를 HA(High Availabilty, 고가용성) 구성을 위한 Network Raid-1(mirroring) 유틸이다.

서비스 중단에 따른 Service Downtime 을 최소화하기 위해 사용된다.

DRBD 는 Raid-1 처럼 mirroring 만 하는 유틸이므로 linux heartbeat 와 같은 HA유틸과 같이 사용하는 것을 추천한다.



DRBD는 실제 사용하는 블럭 디바이스의 I/O 명령을 대신 받아서 처리한다.  실제 블럭 디바이스에 데이터를 쓰고 해당 데이터를 네트워크를 통해 mirroring 되는 장치로 보낸다.

예를 들어 /dev/sda 란 실제 블럭 디바이스가 있고 이를 중간에서 대신 처리하는 drbd 디바이스인 /dev/drbd0 가 있다면 모든 연산은 /dev/drbd0 로 보내면 이 연산을 /dev/sda 로 drbd가 대신 처리하고 network를 통해 다른 노드의 mirroring 되는 장비로 보낸다.


DRBD 상태는 primary 와 secondary 가 있으며 primary 에서만 연산이 가능하다. secondary는 primary를 계속 mirroring 한다.









DRBD 설치




설치 환경



OS : Ubuntu 14.014 LTS

DRBD : DRBD 8.4.4

 

primary ip : 192.168.3.11

primary hostname : drbd-1

primary device : /dev/sdb  # 실제 mirroring 할 디바이스


secondary ip : 192.168.3.12

secondary hostname : drbd-2

secondary device : /dev/sdc  # 실제 mirroring 할 디바이스







1. /etc/hosts(primary , secondary 둘다 설정)

drbd 설정시 hostname 을 통해 노드를 구분함으로 이를 /etc/hosts파일에 등록해야한다.


$ vi /etc/hosts

192.168.3.11    drbd-1

192.168.3.12    drbd-2




2. 패키지 설치 및 kernel module 로드(primary , secondary 둘다 설정)

$ sudo apt-get install drbd8-utils

$ sudo modprobe drbd


module 로드 확인

$ lsmod | grep drbd




3. DRBD 설정(primary , secondary 둘다 설정)

설정 파일은 /etc/drbd.d/ 에 넣으면 된다. 이전 버전의 경우는 /etc/drbd.conf 이다.

현재는 /etc/drbd.conf 에서 /etc/drbd.d/ 하위의 설정파일을 불러 오는 방법을 쓴다.


$ cat /etc/drbd.conf

# You can find an example in  /usr/share/doc/drbd.../drbd.conf.example

include "drbd.d/global_common.conf";

include "drbd.d/*.res";



# drbd 설정 파일 만들기

$ sudo vi /etc/drbd.d/{name}.res

resource "{resource_name}"

{

protocol {A | B | C};

disk {on-io-error detach;}

               syncer {

                        }


                 on {primary-hostname} {

                     device /dev/{drbd_logical_name};

                     disk /dev/{raw_device_name};

                     address {ip}:{port};

                     meta-disk internal;

                             }


                on {secondary-hostname} {

                     device /dev/{drbd_logical_name};

                     disk /dev/{raw_device_name};

                     address {ip}:{port};

                     meta-disk internal;

                             }

}


{}  인 곳에 내용을 넣어주면 된다.
- resource : 임의의 리소스 이름을 넣으면 된다.
- protocol : 동기화 방식인데, A는 비동기 방식으로 속도는 빠르나 데이터 손실의 위험이 있다. B는 메모리 까지만 동기화 방식으로 속도가 A보다는 느리지만 꽤빠른편이고 데이터 손실 위험은 A보다 적다. C는 동기 방식으로 primary 에서의 연산이 secondary에서도 완료되어야 작업이 완료되는 방식으로 속도는 제일 느리나 데이터 신뢰성을 높다. 데이터의 안정성은 C가 제일 좋다.
- on : 노드를 구분한다. hostname을 써주면 된다.
- device : drbd 논리 디바이스 이름이다. 해당 이름은 임의로 주면 drbd 동작시 해당 이름의 논리 디바이스를 만든다. 전통적으로는 drbd0, drbd1 이런 식으로 이름짓는다.
- disk : 실제 디바이스 이름을 넣는다. 
- address : ip와 port를 넣는다.
- meta-disk : drbd 가 동작하기 위한 메타데이터 저장 공간이며 디바이스를 따로 지정할 수 도 있지만 internal로 지정하면 disk 항복에 지정된 실제 디바이스의 공간중 128MB를 이용하여 메타 데이터용으로 쓴다.


                                                                                                                                                                          


예) $ sudo vi /etc/drbd.d/drbd_test.res


resource "test01"

{

protocol C;

disk {on-io-error detach;}

               syncer {

                        }


                 on drbd-1 {

                     device /dev/drbd0;

                     disk /dev/sdb;

                     address 192.168.3.11:7791;

                     meta-disk internal;

                             }


                 on drbd-2 {

                     device /dev/drbd0;

                     disk /dev/sdc;

                     address 192.168.3.12:7791;

                     meta-disk internal;

                                }

}


위 설정을 보면 drbd-1의 /dev/sdb 와 drbd-2의 /dev/sdc 간 mirroring 을 한다는 것이다.







4. DRBD 실행(primary , secondary 둘다 )

drbd-1$ sudo service drbd start

drbd-2$ sudo service drbd start





5. METADATA 생성(primary , secondary 둘다 )

* 주의 : Metadata 생성전 DRBD 볼륨으로 사용할 공간은 파일시스템이 생성되어 있지 않아야한다.

미리 파일시스템이 생성된 상태라면 아래와 같은 에러가 발생할 경우

Command 'drbdmeta 1 v08 /dev/xxx internalcreate-md' terminated with exit code 40


dd를 이용하여 MBR 영역을 없애주어야한다.

$ dd if=/dev/zero of=/dev/sdb bs=1M count=128



# Metadata 생성 명령

$ sudo drbdadm create-md all


위 명령을 수행하면 device 에 지정했던(/dev/drbd0) 디바이스가 생성된다.




6. DRBD primary 만들기(primary 에서 명령)

DRBD 가 처음실행되면 secondary/secondary로 동작한다. 이를 primary/secondary로 만들어 mirroring이 진행될 수 있게 해야한다.


primary 로 사용할 drbd-1 호스트에서 아래의 명령을 호출한다.


$ sudo drbdadm primary {resource_name}


# 위의 예제 설정에서는 resource_name 이 test01이었다.

예) $ sudo drbdadm primary test01











DRBD 모니터링



정상 동작하는지 확인해보자.


모니터링 명령으로는

$ cat /proc/drbd

$ sudo drbdadm role {resource_name}

$ sudo service drbd status

가 있다.


$ cat /proc/drbd

version: 8.4.3 (api:1/proto:86-101)

srcversion: 88927CDF07AEA4F7F2580B2 

 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----

    ns:50 nr:117650 dw:117695 dr:3746 al:2 bm:9 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0


$ sudo drbdadm role {resource_name}

예)

$ sudo drbdadm role test01

Primary/Secondary



$ sudo service drbd status

drbd driver loaded OK; device status:

version: 8.4.3 (api:1/proto:86-101)

srcversion: 88927CDF07AEA4F7F2580B2 

m:res  cs         ro                 ds                 p  mounted   fstype

0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C  /tmp/mnt  ext3 










DRBD 운영




1. 파일 시스템으로 포맷하고 mount 하기

primary 노드에서 디바이스를 ext3 로 포맷팅하고 mount

* 주의 : /dev/sdb 를 포맷팅하는 것이 아니라 이를 대신 처리해주는 drbd 논리 디바이스인 /dev/drbd0에 수행해야한다.


$ sudo mkfs.ext3 /dev/drbd0

$ sudo mount /dev/drbd0 /mnt


* 주의 : secondary 노드의 블록 디바이스는 mirroring 만 되는 것이다. mount 되지 않는다. secondary 노드의 블록 디바이스를 mount 하기 위해서는 primary를 secondary 로 만들고 secondary 를 primary 로 만들어야한다.





2. mirroring 확인

primary 노드에서 마운트 진행하였고 여기에 파일을 하나 만든다.

drbd-1$ sudo touch /mnt/test


secondary 에 mirroring 되는지 확인하기 위해 secondary를 primary로 만들 것이다.

primary 노드는 하나밖에 지정못하므로 primary 를 우선 secondary 로 만들어야한다. secondary 로 만들기 전에 우선 umount 해야한다.


# primary를 secondary 만들기

drbd-1$ sudo umount /mnt

drbd-1$ sudo drbdadm secondary test01 #test01은 resource_name이다.


# secondary를 primary 만들기

drbd-2$ sudo drbdadm primary test01


# secondary 노드 였던 drbd-2에서 마운트하여 확인하기

drbd-2$ sudo mount /dev/drbd0 /mnt

drbd-2$ ls -al /mnt



확인해보면 drbd-1에서 생성했던 test 란 파일이 보일 것이다.









3. secondary를 primary 만들기

secondary를 primary 로 만드는 경우는 primary 노드가 죽었을 때 이다.

primary 노드가 죽었다면 secondary를 primary 로 만들어 서비스를 지속시켜야한다.


secondary 노드에서 아래의 명령을 통해 확인하면 primary 노드의 연결이 끊긴것을 확인할 수 있다.


drbd-2$ cat /proc/drbd

version: 8.4.3 (api:1/proto:86-101)

srcversion: 88927CDF07AEA4F7F2580B2 

 0: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r-----

    ns:0 nr:43 dw:43 dr:1456 al:0 bm:2 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0



drbd-2$ sudo service drbd status

drbd driver loaded OK; device status:

version: 8.4.3 (api:1/proto:86-101)

srcversion: 88927CDF07AEA4F7F2580B2 

m:res  cs            ro                 ds                 p  mounted  fstype

0:r0   WFConnection  Secondary/Unknown  UpToDate/DUnknown  C



secondary 를 primary 로 만든다.


drbd-2 $ sudo drbdadm primary {resource_name}


예) resource_name 이 test01일때

drbd-2 $ sudo drbdadm primary test01




secondary 를 primary로 만들었는지 확인

drbd-2$ cat /proc/drbd

version: 8.4.3 (api:1/proto:86-101)

srcversion: 88927CDF07AEA4F7F2580B2 

 0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r-----

    ns:0 nr:43 dw:43 dr:2912 al:0 bm:2 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0


drbd-2$ sudo service drbd status

drbd driver loaded OK; device status:

version: 8.4.3 (api:1/proto:86-101)

srcversion: 88927CDF07AEA4F7F2580B2 

m:res  cs            ro               ds                 p  mounted  fstype

0:r0   WFConnection  Primary/Unknown  UpToDate/DUnknown  C








4. secondary 노드를 교체

 위의 상황처럼 primary 가 죽거나 secondary 가 죽거나 하여 mirroring 할 경로를 바꾸어야할 때


예를 들어 secondary 였던 drbd-2 의 장애로 drbd-3 에 mirroring 을 해야할 경우이다.



우선 primary 의 설정파일을 drbd-3로 바꾼다.

drbd-1 $ sudo vi /etc/drbd.d/{name}.res


예)

drbd-1 $ sudo vi /etc/drbd.d/test.res


resource "test01"

{

protocol C;

disk {on-io-error detach;}

               syncer {

                        }


                 on drbd-1 {

                     device /dev/drbd0;

                     disk /dev/sdb;

                     address 192.168.3.11:7791;

                     meta-disk internal;

                             }


                 on drbd-3 {

                     device /dev/drbd0;

                     disk /dev/sdb;

                     address 192.168.3.13:7791;

                     meta-disk internal;

                                }

}


그리고 secondary 로 사용할 drbd-3 에도 동일하게 설정하고 drbd를 실행시킨다. 실행시키면 primary 의 연결을 대기한다.


drbd-3 $ sudo service drbd start



그리고 drbd-1 에서 drbd-3 로 연결하는 명령을 수행한다.


drbd-1 $ sudo drbdadm connect test01   # test01은 .res 파일 내의 resource_name 이다.


  1. 대학생 2019.09.03 16:16

    pacemaker의 resource부분에 drbd를 넣고싶은데 혹시 방법을 아시는지 궁금합니다.
    답변 부탁드립니다.

    • 단세포소년 2019.09.06 12:08 신고

      답글이 늦었습니다.

      죄송하게도 제가 pacemaker 에 대한 지식이 없어서 답변을 드리기 힘들겠네요.

  2. ㅇㅇ 2019.12.19 17:31

    만약 /dev/drbd0 을 /d 라는 파일에 마운트를 시켯다면 /d라는 파일에 들어가는 데이터만 drbd가 처리를 하는건가요?

    • 단세포소년 2019.12.27 12:00 신고

      답변이 늦었네요.

      예 그렇습니다.

      더 정확히는 파일단위가 아니라 블럭단위입니다.

1. 하위 디렉토리 파일 내용 치환


$ find ./ -type f | xargs sed -i 's/from/to/g'

현재 디렉토리 내의 모든 파일들의 내용중 from 을 to로 바꾼다.



2. 하위 디렉토리 파일 이름 변경


find ./ -name "*from*"  | sed -e 'p' -e "s/from/to/g" |xargs -n 2 mv

현재 디렉토리 내의 모든 파일, 디렉토리의 이름중 from이 포함된 파일, 디렉토리의 이름의 from을 to로 바꾼다.

예) test_from_test -> test_to_test




은근 필요할 때가 많더라. 

오랜만에 글 올렸는데 짧다..

  1. ㅇㅇㅇ 2020.02.12 17:43

    첫문장에 type 앞에 - 가 빠졌네요

    하여튼 내용 너무 좋았습니다. 감사합니다.

/etc/fstab 에 네트워크 드라이브/저장소를 자동 mount 하게 설정하는 경우 시스템 재시작시 마운트를 하지 못하여 대기를 하는 경우가 있다.

이 문제는 시스템이 네트워크를 설정하고 연결하기 전에 /etc/fstab 의 mount 를 시도하기 때문이다.


예를 들어

/etc/fstab

  192.168.1.1:/usr/local    /mnt    nfs    defaults     0    0

위와 같은 경우 192.168.1.1:/usr/local 에 대한 mount 가  네트워크 연결보다 먼저 일어나기 때문에 시스템 시작시 자동 마운트 되지 않는다. 심한 경우는 해당 경로를 마운트하기 위해 무한대기한다.



이와 같이 네트워크를 통한 저장소를 /etc/fstab 에 등록할때에는 mount 옵션에 _netdev 를 추가해주어야한다.

 192.168.1.1:/usr/local    /mnt    nfs    defaults,_netdev     0    0

_netdev 옵션은 네트워크에 연결후 마운트하라는 옵션이다. 이렇게 해야 시스템 시작시 문제 없이 해당 네트워크 경로로 자동 마운트 된다.




% 기록 위주라 보니 글에 정성은 미포함이다...

  1. ㅇㅇ 2018.01.04 02:35

    감사합니다~

apt-get 에서 repository 를 cdrom 으로 잡는 방법


네트워크를 못쓰는 상황이나 급하게 패키지를 설치해야 하는 경우가 존재한다.

나의 경우는 네트워크를 못쓰는 상황이었다. 


이때 방법이 설치 cd 를 이용하는 방법이다. 설치 cd 에는 기본적인 패키지들은 존재한다.



만약 cd 의 디바이스가 /dev/sr0 라고 한다면



$ sudo mount -o loop /dev/sr0 /media/cdrom


# 왜 /media/cdrom 이냐면 /etc/apt/apt.conf.d/00CDMountPoint  설정에 그렇게 잡혀 있다. 왠만하면 이 경로 쓰자.

Acquire::cdrom {

  mount "/media/cdrom";

};

Dir::Media::MountPath "/media/cdrom";



/media/cdrom 경로를 repository 로 등록하면 된다.



$ sudo apt-cdrom add -d /media/cdrom -m


그런후 /etc/apt/sources.list 를 확인하면


deb cdrom:[Ubuntu-Server..~~~~~~~~~~~] raring main restricted

라고 적혀있을 것이다.



$ sudo apt-get update

후에 패키지 설치하면 된다.


끝.


급하게 쓴 글이라.. 


추가적인 부분은 google 에게 물어라.



폴더내 모든 문서의 특정 문자열 치환


find ./ -type f |xargs sed -i 's/{바꿀문자열}/{새로운문자열}/g'


만약 특정 폴더에 파일이 많고 파일의 내용중 TEST 를 test 로 바꾼다면


find ./ -type f |xargs sed -i 's/TEST/test/g'






폴더내 파일중 특정 이름의 파일을 바꿀 경우


$ find ./ -name "*{바꿀문자열}*"  | sed -e 'p' -e "s/{바꿀문자열}/{새로운문자열}/g" |xargs -n 2 mv



만약 특정 폴더에 'TEST' 문자열이 들어가는 폴더나 파일의 이름을 'TEST' 대신 'test' 로 바꾼다면

예) TEST_aa   -> test_aa


$ find ./ -name "*TEST*"  | sed -e 'p' -e "s/TEST/test/g" |xargs -n 2 mv



만약 특정 폴더에 'TEST' 문자열이 들어가는 폴더만 이름을 'TEST' 대신 'test' 로 바꾼다면


$ find ./ -name "*{TEST}*" -type d  | sed -e 'p' -e "s/TEST/test/g" |xargs -n 2 mv

  1. a91558972@gmail.com 2022.05.02 21:43

    감사해요... 한 줄기 빛과 같습니다 일일이 이름 바꿀생각만 하면 .. 으 ... ㅜㅜ 감사합니다

만약 현재 우분투 12.04를 사용하고 있고 새로운 버전인 13.10이 나왔다고 했을 때 아래의 명령을 통해 쉽게 릴리즈 버전으로 업그레이드 할 수 있다.

$ do-release-upgrade 

http://tmdgus.tistory.com/116


http://www.troot.co.kr/tc/2671


http://stackoverflow.com/questions/16360689/invalid-parameters-error-when-trying-to-insert-module-that-accesses-exported-s  - insert module 시 Invaild parameters 오류 발생시, 모듈 컴파일시 undefined 오류 발생시 해결법




1. 특정 모듈 컴파일시 필요한것


1. 커널 소스 헤더와 의존되는 모듈이 있다면 해당 모듈의 심볼 테이블이다. 

심볼 테이블의 이름은 Module.symvers 이다.

심볼 테이블은 모듈을 컴파일하면 해당 디렉토리에 생성되며 함수의 위치 정보를 가지고 있다.


2. 커널 소스 혹은 커널 헤더

sudo apt-get install linux-source 나 sudo apt-get install linux-headers-x.x.x 을 통해 받을수 있다. 대체로 위치는 /usr/src 에 존재한다.




2. 특정 모듈 컴파일시 Makefile


obj-m = {modulename}.o

{modulename}-y = {file}.o

PWD = $(shell pwd)

ccflags-y += {추가할 헤더경로}

KBUILD_EXTRA_SYMBOLS = {참조할 심볼 테이블}

all:  
         make -C {헤더나 소스 최상위 경로} M=$(PWD) modules  

clean:  
        make -C {헤더나 소스 최상위 경로} M=$(PWD) clean


예들 들어 

1. test.ko 란 모듈을 제작하려고 하고 해당 모듈은 소스파일 /test/foo.c , /test/bar.c 로 이루어져 있다고 하자. 

그리고 /test/include/foo.h , /test/include/bar.h 헤더가 존재한다고 하자.  그리고 libtest.ko 의 함수를 test.ko 에서 사용한다고 하자.


2. libtest.ko 란 모듈은 소스파일 /libtest/libtest.c 로 이루어져 있다고 하자. 헤더는 따로 없다.


그리고 /usr/src/linux-headers-3.10 에 헤더파일들이 존재한다고 하자.

* 커널 헤더는 sudo apt-get install linux-headers 명령을 통해 받을수 있다. 혹은 그냥 커널 소스 자체를 받아도 된다.



이때 test.ko 에 대한 Makefile 은 /test/ 안에 생성해야한다.

obj-m += test.o

test-y := foo.o bar.o

PWD = $(shell pwd)

ccflags-y += -I/test/include

KBUILD_EXTRA_SYMBOLS += /libtest/Module.symvers

all:

         make -C /usr/src/linux-headers-3.10/ M=${PWD} modules

clean:

         make -C /usr/src/linux-headers-3.10/ M=${PWD} clean



libtest.ko 에 대한 Makefile은 /libtest/ 안에 생성한다.

obj-m += libtest.o

PWD = $(shell pwd)

all:

         make -C /usr/src/linux-headers-3.10/ M=${PWD} modules

clean:

        make -C /usr/src/linux-headers-3.10/ M=${PWD} clean



컴파일은 해당 디렉토리에 가서 make all 하면된다.

test.ko 는 libtest.ko의 함수를 사용하기 때문에 libtest.ko 의 심볼 테이블이 필요하다. 그러므로 libtest.ko 를 우선 컴파일 해야한다.

libtest.ko 를 컴파일하면 해당 디렉토리에 Module.symvers 심볼 테이블 파일이 생성된다.

그후 test.ko 를 컴파일하면 이상없이 컴파일 될것이다.



3. Makefile 설명


1. obj-m : 생성할 모듈 이름이다. 예를 들어 test.ko 를 생성하고 싶다면 test.o 를 인자로 주면된다.(test.ko 가 아니다.)

 obj-m += test.o


2. {module_name}-y : 해당 모듈을 구성하는 소스리스트를 적어주면된다. 주의할 것은 .o 이지 .c 가 아니다. 예를들어 test.ko 를 구성하는 소스가 foo.c, bar.c 라면

 test-y := foo.o bar.o


3. PWD = $(shell pwd) : 그냥 현재 경로이다.


4. ccflags-y : 이것은 컴파일시 gcc 에 포함할 옵션이다. 예를들어 참조하는 헤더의 위치가 /home/include 라면 이 경로는 gcc가 암시적으로 참조하지 않는다. 따라서 옵션을 주어 해당경로에서도 헤더를 찾으라고 해야한다. 헤더가 위치한 경로를 주는 옵션은 대문자 I 이다.

 ccflags-y += -I/home/include



5. KBUILD_EXTRA_SYMBOLS : 참조할 심볼 테이블 파일의 경로이다. 심볼 테이블 파일의 이름은 Module.symvers 이다. 예를 들어 참조하는 심볼 테이블의 경로가 /libtest/Module.symvers 라면

 KBUILD_EXTRA_SYMBOLS += /libtest/Module.symvers


6. all , clean : 여기의 make -C 옵션 값은 커널 헤더 최상위 경로거나 커널 소스 최상위 경로이면 된다.

셋중 하나면 된다. 중요한 것은 현재 커널 버젼 uname -r 과 동일해야한다는 것이다.

 make -C /usr/src/linux-headers-$(shell uname -r)/ M=$(PWD)  modules

혹은

 make -C /usr/src/linux-$(shell uname -r)/ M=$(PWD)  modules

혹은 

 make -C /lib/modules/$(shell uname -r)/build M=$(PWD)  modules

기본 linux/xxxx.h 헤더는 /usr/src/linux-$(shell uname -r)/include 에서 찾는다.




4. 예시



아래와 같이 많이 쓴다.

CONFIG_TEST = m

obj-$(CONFIG_TEST) += test.o


test-y := super.o inode.o dir.o file.o locks.o addr.o ioctl.o \

export.o caps.o snap.o 


PWD = $(shell pwd)

BASE_DIR =  $(shell dirname $(PWD))

#ccflags-y += -I/home/user/include

#KBUILD_EXTRA_SYMBOLS += /home/user/lib/Module.symvers


all:

make -C /usr/src//linux-headers-$(shell uname -r)/ M=$(PWD) ccflags-y+=-I$(BASE_DIR)/include KBUILD_EXTRA_SYMBOLS+=$(BASE_DIR)/net/Module.symvers  modules


clean:

make -C /usr/src/linux-headers-$(shell uname -r)/ M=$(PWD) clean

대충 이런식으로 많이 쓴다.

ccflags-y 나 KBUILD_EXTRA_SYMBOLS 변수 같은 경우

cflags-y += -I${BASE_DIR}/include 이런식으로 쓰면 오류가 나더라.

그래서  make cflags-y += -I${BASE_DIR}/include 이런식으로 make 명령에 직접 옵션으로 붙인다.




5. 모듈 추가


추가는 쉽다.

해당 모듈이 존재하는 디렉토리에서 

sudo insmod test.ko 라고 치면 된다. 여기서 중요한 점은 test.ko 가 libtest.ko 의 함수를 쓴다면 우선 libtest.ko 모듈을 로드한 후에 test.ko 를 로드해야한다.


insmod 는 해당 모듈이 존재하는 곳에서 로드하는 방법이고 modprobe를 사용하기 위해서는

/lib/modules/`uname -r`/kernel/ 밑에 적절한 디렉토리를 선택하거나 디렉토리를 생성하고 .ko 파일을 복사하면 된다.

복사한 후에는 modprobe 로 추가하기 전에 depmod -a 명령을 우선 수행해서 복사한 .ko 파일을 인식시켜야한다.


$ sudo depmod -a

$ sudo modprobe {module}.ko



아 그리고 test.ko 가 libtest.ko 의 함수를 사용할 때 즉 test.ko 가 libtest.ko 를 의존할때는 libtest.ko 를 우선 로드후에 test.ko를 로드해야한다.





6. 모듈 정보 보기


modinfo {모듈경로}


예를 들어

$ modinfo /lib/modules/3.11.8/kernel/fs/xfs/xfs.ko

filename:       /lib/modules/3.11.8/kernel/fs/xfs/xfs.ko
license:        GPL
description:    SGI XFS with ACLs, security attributes, realtime, large block/inode numbers, no debug enabled
author:         Silicon Graphics, Inc.
alias:          fs-xfs
srcversion:     F107BA901126B3EA796F27D
depends:        libcrc32c
intree:         Y
vermagic:       3.11.8 SMP mod_unload modversions 



7. 오류


만약 컴파일 중에 undefined 에러나, 모듈을 insmod 중에 Invalid parameters 에러가 발생한다면 현재 모듈이 다른 모듈의 함수를 사용했을 경우다. 이때는 사용하려는 해당 모듈이 컴파일 되기전에 함수에 대한 심볼 테이블이 필요하다.

만약 foo.ko 가 bar.ko 의 함수를 사용한다면 우선 bar.ko 를 컴파일 한다. 컴파일하면 해당 폴더에 Module.symvers 란 파일이 생성된다. 이 파일을 foo.ko 가 컴파일될 폴더에 복사한후 foo.ko를 컴파일하면 에러 없이 컴파일되고 에러 없이 insmod 될 것이다.
혹은 makefile 에 KBUILD_EXTRA_SYMBOLS += {Module.symvers} 를 추가한다.




글이 참.. 설명 능력좀 키워야하나..



  1. 전자둥이 2021.03.17 12:59 신고

    많은 도움이 되었습니다. 감사합니다

참고 : 

http://www.thegeekstuff.com/2013/06/compile-linux-kernel/

http://mintnlatte.tistory.com/314

http://bbanghee.wordpress.com/2010/08/05/make%EC%9D%98-j-%EC%98%B5%EC%85%98%EC%9D%80-%EC%8B%A4%EC%A0%9C%EB%A1%9C-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8F%99%EC%9E%91%ED%95%98%EB%8A%94%EA%B0%80/ - make j 옵션 설명



1. 우분투 - 커널 deb 패키지 만들어 설치하기


커널을 그냥 컴파일하여 설치하는 방식이 아닌 패키지를 만들어 설치하는 방법으로 커널 패키지를 생성시키면 여러대의 우분투의 커널을 업그레이드하고 싶을 때 따로따로 컴파일 필요없이 패키지를 만들어 쉽게 설치할 수 있다.

하지만 이 방법은 컴파일에 꽤 오랜시간이 걸린다.



1.1 필요 패키지 설치

$ sudo apt-get install build-essential libncurses5-dev bin86 kernel-package




1.2 커널 소스 다운로드

$ sudo apt-get install linux-source  # 현재 설치된 버전의 커널 소스를 다운받는다.

혹은


https://www.kernel.org/ 사이트에서 원하는 커널 버전을 다운로드한다.

예를 들어

$ sudo wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.10.tar.xz 

받은 커널 파일은 압출을 푼다.

$ sudo tar linux-3.10.tar.xz


커널 소스는 /usr/src 에 위치시키는 것이 좋다.



1.3 컴파일 설정 파일 가져오기

모든 설정을 하기는 힘들다. 따라서 이미 설치된 커널의 설정파일을 가져다가 쓴다.

/boot 폴더에 config 로 시작하는 파일이 커널 설정 파일이며 이를 커널 소스 디렉토리에 넣는다.

$ sudo cp /boot/config-`uname -r` /usr/src/linux-3.x.x/.config


커널 소스 디렉토리에서 아래의 명령을 수행하고 load 를 선택하고 .config 를 선택하여 설정파일을 로드한다.

$ sudo make menuconfig

혹은


$ sudo make oldconfig 

oldconfig 는 현재 설치된 커널 버전의 설정 파일을 자동으로 가져온다. 위의 sudo cp 명령을 자동으로 해준다고 생각하면된다.



1.4 컴파일 설정 바꾸기

$ sudo make menuconfig 

혹은 

$ sudo vi .config

를 통해 설치할 모듈을 선택한다.

(따로 포함시킬 모듈이 없다면  설정은 굳이 바꾸지 않아도 된다.)




1.5 커널을 컴파일하고 패키지화 한다.

$ sudo make-kpkg clean

$ sudo make-kpkg --initrd kernel_image kernel_headers kernel_source modules_image


make-kpkg 시 target 리스트는 $ sudo make-kpkg --target 명령을 수행하면 리스트가 출력된다.




1.6 커널 패키지 설치

커널이 정상적으로 컴파일 되면 linux-xxxxx.deb , linux-headers-xxxxx.deb 가 생성되고 이 패키지를 설치하면 커널이 업그레이드된다.

$ sudo dpkg -i *.deb

$ sudo reboot






2. 일반적인 커널 컴파일




1.1 커널 소스 다운로드

$ sudo apt-get install linux-source  # 현재 설치된 버전의 커널 소스를 다운받는다.

혹은


https://www.kernel.org/ 사이트에서 원하는 커널 버전을 다운로드한다.

예를 들어

$ sudo wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.10.tar.xz 

받은 커널 파일은 압출을 푼다.

$ sudo tar linux-3.10.tar.xz


커널 소스는 /usr/src 에 위치시키는 것이 좋다.




1.2 컴파일 설정 파일 가져오기

모든 설정을 하기는 힘들다. 따라서 이미 설치된 커널의 설정파일을 가져다가 쓴다.

/boot 폴더에 config 로 시작하는 파일이 커널 설정 파일이며 이를 커널 소스 디렉토리에 넣는다.

$ sudo cp /boot/config-`uname -r` /usr/src/linux-3.x.x/.config


커널 소스 디렉토리에서 아래의 명령을 수행하고 load 를 선택하고 .config 를 선택하여 설정파일을 로드한다.

$ sudo make menuconfig

혹은


$ sudo make oldconfig 

oldconfig 는 현재 설치된 커널 버전의 설정 파일을 자동으로 가져온다. 위의 sudo cp 명령을 자동으로 해준다고 생각하면된다.



1.3 컴파일 설정 바꾸기

$ sudo make menuconfig 

혹은 

$ sudo vi .config

를 통해 설치할 모듈을 선택한다.

(따로 포함시킬 모듈이 없다면  설정은 굳이 바꾸지 않아도 된다.)



1.4 커널 컴파일 하기

$ sudo make  
#컴파일 속도를 향상시키기 위해서 sudo make -j8 옵션을 주면 된다. -j 옵션은 주어진 개수만큼 동시에 빌드를 수행한다.
자세한 정보는 위 참조를 확인하라.

$ sudo make modules

$ sudo make modules_install

$ sudo make install 

sudo make install 시 vmlinuz-x.x.x , System.map-x.x.x , initrd.img-x.x.x , config-x.x.x 파일이 /boot 에 복사되면 grub.cfg 파일이 자동으로 갱신된다. 따라서 grub.cfg 를 수동으로 수정하지 않아도 된다.

$ sudo reboot







3. 우분투 커널을 패키지로 쉽게 설치하기


# ubuntu kernel 을 패키지로 설치하는 방법도 있다.

http://kernel.ubuntu.com/~kernel-ppa/mainline/  여기가서 원하는 커널 버전을 받는다.

linux-header-..._all.deb

linux-headers-..._i386(amd64).deb

linux-image-..._i386(amd64).deb

32bit면 i386, 64bit면 amd 64 받으면 된다. 위의 3개의 패키지를 다 받아야 한다.




$ sudo dpkg -i linux-header-..._all.deb

$ sudo dpkg -i linux-headers-..._amd64.deb

$ sudo dpkg -i linux-image-..._amd64.dev



3개의 패키지를 다 설치한다. 귀찮으면 sudo dpkg -i linux* 

설치후 재부팅한다.

$ sudo reboot 



재부팅후 kernel 버전 확인 한다.

$ uname -a



 

만약 daum 의 ubuntu 저장소를 추가하고 싶다면

echo deb http://ftp.daum.net/ubuntu/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/daum.list

 

명령을 내려라.

 

현재 내 우분투 버전에서는 아래와 같이 입력된다.

 

deb http://ftp.daum.net/ubuntu/ raring main

 

내 우분투의 버전이 raring 이기 때문이다. lsb_release -sc 는 내 리눅스의 패키지 버전을 나타내준다.

 

위 방법은 저장소를 추가하는 방법이다. apt-get install 로 설치시 daum 사이트로 연결될지는 장담못한다.

 

 

 

저장소를 아예 바꾸고 싶다면 vi 로 /etc/apt/sources.list 를 열고

 

:%s/kr.archive.ubuntu.com/ftp.daum.net/g 명령을 통해 저장소위치를 치환해버려라.

 

혹은 sed -i 's/kr.archive.ubuntu.com/ftp.daum.net/g' /etc/apt/sources.list

sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"

혹은 

sudo sync; echo 3 | sudo tee /proc/sys/vm/drop_caches


메모리 캐시는 테스트 하기 전에 캐싱되지 않은 실제적인 테스트 결과를 얻기위해 사용한다.

NTP 는 시간을 동기화 하기 위해 쓰이는 프로그램이다.

기본 설정값은 공공의 time server (예를 들어 0.ubuntu.pool.ntp.org ..) 에서 시간을 받아 동기화 한다.


외부 네트워크와 단절된 보안을 요구하는 네트워크 환경에서 time server 를 두고 내부에 모든 서버가 time server의 시간으로 동기화 하는 방법을 사용할 수 있다. 이때 내부 네트워크에서만 동작되는 time server 를 local time server 라고 부른다.

설정은 아주 간단하다.



예제 정의


예를 들어 외부 네트워크와 연결이 단절된 사설 네트워크 내에서 한대의 time server가 동작하고 10대의 클라이언트가 있다고 가정하자.

Time server address : 192.168.0.1

client address : 192.168.1.1~10



NTP 설치


Ubuntu 기준으로

$ sudo apt-get install ntp


NTP 설정에 따라 서버로 동작할지 클라이언트로 동작할지 둘다로 동작할지 결정된다.



Time Server 설정


/etc/ntp.conf 설정


#server 0.ubuntu.pool.ntp.org # 외부 네트워크와 단절되어 있으므로 주석 처리

#server 1.ubuntu.pool.ntp.org # 외부 네트워크와 단절되어 있으므로 주석 처리

#server 2.ubuntu.pool.ntp.org # 외부 네트워크와 단절되어 있으므로 주석 처리

#server 3.ubuntu.pool.ntp.org # 외부 네트워크와 단절되어 있으므로 주석 처리

#server ntp.ubuntu.com # 외부 네트워크와 단절되어 있으므로 주석 처리

server 127.127.1.0  # 로컬 타임 서버로 동작하기 위한 설정 꼭 127.127.1.0 입력

restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap # client 접근 허용





Client 설정


/etc/ntp.conf 설정


#server 0.ubuntu.pool.ntp.org # 외부 네트워크와 단절되어 있으므로 주석 처리

#server 1.ubuntu.pool.ntp.org # 외부 네트워크와 단절되어 있으므로 주석 처리

#server 2.ubuntu.pool.ntp.org # 외부 네트워크와 단절되어 있으므로 주석 처리

#server 3.ubuntu.pool.ntp.org # 외부 네트워크와 단절되어 있으므로 주석 처리

#server ntp.ubuntu.com # 외부 네트워크와 단절되어 있으므로 주석 처리

server 192.168.0.1  # 로컬 타임 서버의 주소를 입력




정리


타임 서버로 동작 시킬 장비 ntp 설정에는 server 127.127.1.0 을 추가하고 restrict 를 통해 클라이언트의 접근을 허용한다.

클라이언트로 동작 시킬 장비 ntp 설정에는 server {타임서버-주소} 를 추가하여 로컬 타임서버에게 시간을 받아 동기화 할 수 있도록 한다.

보안 문제상 만약 로컬 타임 서버만 외부 네트워크와 연결되어 있다면 server 0.ubuntu.pool.ntp.org 와 같이 공공의 타임 서버에 대한 설정값에 주석을 하지않고 공공의 타임 서버와 시간을 동기화 하고 자신의 시간을 로컬내의 클라이언트와 동기화하는 방법 또한 사용할 수 있다.




http://sourceforge.net/projects/iperf/ - iperf 소스 배포


두 장비(연결)사이의 네트워크 속도를 측정하는 유틸로 네트워크 설정(bonding, switch)을 제대로 했는지 확인하는 수단으로 좋다. 

하나의 장비를 서버, 하나의 장비를 클라이언트로 실행하여 두 연결 사이의 속도를 측정하는 방법을 사용한다.

사용법 또한 매우 간단하다.

이것 찾게된 이유는 switch 10G 환경에서 장비 bonding 시 실제로 속도가 예상치만큼 나오는지 설정이 잘 되었는지 확인해보고 싶었다.


설치


$ sudo apt-get install iperf



실행


서버


$ iperf -s

------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[  4] local 192.168.3.23 port 5001 connected with 192.168.3.20 port 38194
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-10.1 sec   113 MBytes  94.1 Mbits/sec




클라이언트


$ iperf -c {server-ip}

TCP window size: 22.9 KByte (default)

------------------------------------------------------------
[  3] local 192.168.3.20 port 38194 connected with 192.168.3.23 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   113 MBytes  94.7 Mbits/sec



기타 옵션


-s 서버 모드

-c <server ip or domain> 클라이언트 모드

-u UDP 사용 (기본 TCP)

-p port (기본포트는 5001)

-w TCP Window 크기(socket buffer 사이즈)(ex -w 10M, -w 10K)

-t 측정시간(초)


sudo 를 사용하는 환경에서 원격지에 파일 보내기



파일을 보낼때 우리는 흔히 scp 를 이용한다. 이때 sudo 환경이라면 아래와 같이 실행할 것이다.

 $ sudo scp {sourcefile} {hostname}:/targetfile

위의 명령어의 경우 ubuntu와 같이 {hostname}의 장비가 root 를 사용하지 못하고 sudo 를 통해 권한을 이양받아 실행하는 환경이고 targetfile root 소유라면 이 명령어는 실패한다. (물론 targetfile 에 쓰기권한이 있다면 scp 써도 문제 없다.)

sudo scp {sourcefile} root:{hostname}:/targetfile 이렇게 실행하면 안되냐는 말이 있을것이다. ubuntu 의 경우 정책상 root의 비밀번호가 없다. 즉 root로 로그인이 불가능하다.(물론 sudo passwd 명령어도 root 패스워드 만들어주면 되지만 sudo를 쓰는 이유가 훼손된다.)


이때는 아래와 같이 하자.

 $ ssh {hostname} "echo '`cat {sourcefile}`' | sudo tee {targetfile}"


tee 명령어를 사용한 이유는 리다이렉션은 쉘내장명령어라 sudo의 영향을 받지 않기 때문이다.

위의 명령어도 하나의 문제가 발생한다. ssh 를 통해 단일 명령어 실행시 sudo 와 같이 입력이 발생하는 경우 no tty ~~~~ 에러가 발생한다. 

이때는 패스워드 없이 sudo 사용하기 라고 구글링하거나 http://onecellboy.tistory.com/292 이 링크를 참고해라. sudo 실행시 패스워드를 묻지 않게 하는 방법이다.


간단하게 예를 들어 sourcefile의 내용이 "hello linux" 라면
ssh {hostname} "echo '`cat {sourcefile}`' | sudo tee {targetfile}" 는
ssh {hostname} "echo 'hello linux' | sudo tee {targetfile}" 로 바뀌어 명령이 호출된다.


내가 위의 내용들을 정리해본 이유는 ubuntu 에서 미리 시스템 설정파일을 만들고 원격지에 /etc/network/interface와 같이 시스템설정 파일을 대체하려고 했는데 시스템설장 파일이 root 소유라 scp 로는 되지 않아서이다.


참고로 ssh {hostname} "echo '`cat {sourcefile}`' | sudo tee {targetfile}" 명령어는 백쿼트(backquote) 와 명령어 중첩, 리다이렉션 대신 tee를 활용한 명령이다.

구글링으로 "backquote shell script", "쉘 백쿼트" , "명령어 중첩", "tee" 를 검색하여 위 명령어를 확실히 이해하는 것도 좋다.





방법이 하나 더 있다.

그냥 원격지 장비의 /tmp 에 파일을 scp 한후 mv 명령으로 옮기는 것이다. (/tmp 디렉토리는 누구나 쓸수 있다.)

 $ scp {sourcefile} {hostname}:/tmp/

 $ ssh {hostname} "sudo mv /tmp/{sourcefile} {targetfilepath}" 


예를 들어

내 장비의 testfile 을 원격지(1.1.1.1) 장비의 /etc/target 으로 보내고 싶다.

scp testfile 1.1.1.1:/tmp

ssh 1.1.1.1 "sudo mv /tmp/testfile /etc/target"  이런식으로 하면된다.


패스워드 없이 sudo 실행하게 설정


sudo 는 root의 권한을 대리로 사용하게 하는 명령어로 ubuntu 와 같이 정책적으로 root 로그인을 막은 리눅스 운영체제에서 사용된다. 

sudo 로 실행하게 되면 현재 사용자의 패스워드를 요청한다. 

sudo 시 패스워드 요청없이 그냥 바로 실행하고 싶다면 아래와 같이 실행해라.


 $ echo "{user} ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/{user}

 $ sudo chmod 0440 /etc/sudoers.d/{user} 


예를 들어 test 란 사용자가 sudo 시 패스워드 요청없이 실행하고 싶다면

$ echo "test ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/test
$ sudo chmod 0440 /etc/sudoers.d/test



활용


위 설정을 하게 되면 sudo 시 패스워드를 입력안해도 되는 장점도 있지만 

진짜 유용할 때는 ssh로 명령내릴 때이다. 예를 들어 ssh 10.10.10.10 "sudo chmod 0777 /test" 시 sudo가 패스워드를 요청하는데 ssh 로 sudo 실행시  no tty 어쩌구 에러가 난다. 터미널 환경이 아니라는 말이다.

이때 위의 설정을 하면 패스워드를 안물어보므로 이런 문제도 안생긴다.



sudo 설정 후 root 권한의 디렉토리에 파일을 전송하고 싶다면(root는 사용하지 않고)

 ssh test-server "sudo /etc/config" < config.conf


ubuntu 같은 경우 root로 로그인을 할 수 없는게 기본 정책이다.(sudo passwd 하면 root 비번 만들어 진다.)

이럴 경우 root 권한이 필요한 명령어의 경우 sudo 로 실행하게 되는데 이때 리다이렉션이 문제이다.


예를 들어 test 란 파일이 있다. 이 파일의 소유주와 그룹은 root 이다. 이때 이 파일에 "hello" 란 글을 쓰고 싶다.

이때 우리는 echo "hello" > test 라고 실행한다. 혹은 sudo echo "hello" > test 라고 실행할 것이다. 이렇게 실행하면 아래와 같은 경고가 발생한다.

user@a$ echo "hello" > test
-bash: test: Permission denied 


이럴때는 tee 란 명령어를 이용하자. 이 명령어는 리다이렉션하고 하는 일이 동일하다. 표준입력을 파일에 저장한다. 다른 점은 리다이렉션은 쉘내장명령어도 tee는 그냥 명령어다.

user@a$  echo "hello" | sudo tee test
[sudo] password for user:
hello


아주 잘 된다. 


또한 root 사용이 불가능 하기 때문에 원격지 장비의 root 폴더에 파일을 전송하기가 매우 까다롭다.

scp 를 이용해도 root 사용 불가기 때문에 scp 로 /tmp 폴더에 파일 이동후 ssh 로 연결하여 파일을 mv 로 옮기는 작업을 한다.

이렇게 하지 말고 아래의 방법을 사용하라.

 ssh test-server "sudo tee test.conf" < test.conf

아 물론 이 방법을 사용하기 위해서는 패스워드 없이 sudo 명령을 사용할 수 있도록 설정을 해야한다. ssh 로 즉시 명령 실행행시 terminal 이 지정되지 않기 때문에 패스워드를 입력할 수 없어 오류 메세지가 발생한다. sudo 설정은 블로그에 정리 되어 있다.

우분투 13.04를 설치하고 나서 네트워크 인터페이스가 p255p1 이런식으로 보였다.

이것은 udev rule 에 의해 선정되는 이름으로 네트워크 카드의 위치가 바뀌거나 뺏다껴도 똑같은 이름을 유지하라는 식의 편의를 위해 제공되지만 난 eth0 eth1 같은 옛날 방식의 이름을 원했다.


구글링을 통해 /lib/udev/rules.d/ 의 몰 지워라. 혹은 /etc/udev/rules.d/70-persistent-net.rules 를 지워라. 혹은 grub의 biosdevname 인가 모 어쩌구를 0으로 만들어라. 등등 방법이 많았다.

네트워크 인터페이스 같은 경우 eth* 를 p*p* 로 바꾸는 룰을 /etc/udev/rules.d/70-persistent-net.rules 에 적으므로 이것을 지우면 되는 경우가 많다고 한다. 

근데 내 경우에는 안되었다. 왜일까?


1. UDEV Rules 을 통한 방법


어째든  /etc/udev/rules.d/70-persistent-net.rules 내에 룰을 만들어 p255p1 같은 이름의 인터페이스가 아닌 eth0 같은 이름이 나오도록 하기 위해 룰을 하나 작성했다. 설명은 생략하겠다.(udev 메뉴얼하고 /lib/udev/rules.d 의 룰들을 대충 참고했다. 내가 설명을 못하겠다.)


$ vi  /etc/udev/rules.d/70-persistent-net.rules

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*|p*p*", NAME="eth%n"


그래도 대충 설명한다. 네트워크 인터페이스가 추가되면 특히 이름이 p255p1 같은거면 eth 로 이름을 바꾸는데 eth 뒤에 추가되는 순서대로 적어라. 예를들면 p255p1 추가되고 eth0가 추가 되었다고 하면 p255p1 은 eth0 로 eth0 은 eth1 로 이름이 명명될 것이다. (데스크탑에서는 됐는데 nic 가 4개있는 서버에서 테스트해볼 작정이다. 테스트 해봤는데 된다. ㅋㅋ)


네트워크 인터페이스 명은 아래의 명령을 실행하면 보인다.

 $ cat /proc/net/dev



2. GRUB 설정을 통한 방법


$  vi /etc/default/grub 

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
# info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=2
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="" #<---- 이 설정을 GRUB_CMDLINE_LINUX_DEFAULT="biosdevname=0" 로 변한다
GRUB_CMDLINE_LINUX="


GRUB_CMDLINE_LINUX_DEFAULT 에 "biosdevname=0" 를 추가해주면 p1p1, p1p2, ... 이 아닌 eth0, eth1, ... 전통적인 네트워크 인터페이스이름으로  명명될 것이다.





3. 추가적으로 특정 맥어드래스에게 특정 인터페이스 이름 지정하기


$ vi /etc/udev/rules.d/70-persistent-net.rules


SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:25:90:CB:4E:E6", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" 

긴 설명은 하지 않겠다.





추가적인 정보로 아래의 링크는 /etc/udev/rules.d/70-persistent-net.rules 를 이용하여 특정 맥어드래스에게 특정 인터페이스 이름을 지정하는 방법이다.

http://mickvaites.com/2009/06/ubuntu-changing-network-device-id-udevrules-d/

참고 : 

http://netatalk.sourceforge.net/ - 공식 사이트

http://baekis1185.tistory.com/m/post/view/id/67

http://trip2me.tistory.com/46

http://jswlinux.tistory.com/entry/%EC%98%A4%ED%94%88%EC%9D%B8%EB%94%94%EC%95%84%EB%82%98%EC%97%90%EC%84%9C-%EB%A7%A5-%ED%8C%8C%EC%9D%BC%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%93%B0%EA%B8%B0 

http://lpbox.co.kr/lp/read.php?id=Linux&main_No=59&sub_No=AAAAA

http://spring2.way2java.net:2080/138

http://stve.cx/2011/07/netatalk-2-2-b4/ - "...CNID DB" 에러 출력시 문제 해결법

http://www.blog.10deam.com/tag/netatalk/



appletalk 이란?


appletalk(애플토크)는 애플사가 컴퓨터 네트워킹을 위해 개발한 프로토콜이다. 프린터나 서버(폴더..) 등의 리소스를 주고 받을 수 있게 되어있다.

samba(CIFS) 하고 비슷하다. 윈도우가 CIFS라면 애플은 appletalk



netatalk 이란?


appletalk 프로토콜을 구현한 리눅스 서버 프로그램이다. 

비슷한 예로 윈도우의 CIFS 프로토콜을 구현한 리눅스 서버 프로그램은 SAMBA다.




netatalk 설치 (ubuntu 기준)


패키지 설치

$ apt-get install netatalk



버전 및 설정파일 위치 확인

$ afpd -v 

afpd 2.2.1 - Apple Filing Protocol (AFP) daemon of Netatalk

This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version. Please see the file COPYING for further information and details.

afpd has been compiled with support for these features:

          AFP versions:
1.1 2.0 2.1 2.2 3.0 3.1 3.2 3.3 
DDP(AppleTalk) Support: Yes
         CNID backends: dbd last tdb 

             afpd.conf:
/etc/netatalk/afpd.conf
   AppleVolumes.system: /etc/netatalk/AppleVolumes.system
  AppleVolumes.default: /etc/netatalk/AppleVolumes.default
    afp_signature.conf: /etc/netatalk/afp_signature.conf
      afp_voluuid.conf: /etc/netatalk/afp_voluuid.conf
         afp_ldap.conf: not supported
       UAM search path: /usr/lib/netatalk/
  Server messages path: /etc/netatalk/msg/
              lockfile: /var/run/afpd.pid




설정
/etc/default/netatalk , /etc/netatalk/afpd.conf 을 바꾸어 주자.(주석만 풀자)

$ vi /etc/default/netatalk

ATALK_UNIX_CHARSET='LOCALE'
ATALK_MAC_CHARSET='MAC_KOREAN'
export ATALK_UNIX_CHARSET
export ATALK_MAC_CHARSET
CNID_METAD_RUN=yes
AFPD_RUN=yes

AFPD_MAX_CLIENTS=20
ATALKD_RUN=no
PAPD_RUN=no
TIMELORD_RUN=no
A2BOOT_RUN=no


$ vi /etc/netatalk/afpd.conf

-setuplog "default log_info /var/log/afpd.log"
- -tcp -noddp  -uamlist uams_clrtxt.so,uams_dhx.so,uams_dhx2.so -nosavepassword

#-setuplog 는 로그가 저장될 위치
# uams_clrtxt.so, uams_dhx.so, uams_dhx2.so 는 인증방법이다.
# 인증은 자동으로 리눅스 인증 /etc/passwd , /etc/shadow 를 이용함으로 따로 사용자를 추가할 필요는 없다.
# cleartxt 인증은 패스워드 최대 길이가 8 이가 때문에 패스워드가 8 글자보다 길다면 인증되지 않는다. 주의하자.
   cleartxt 인증을 사용하는 클라이언트가 접속할때 서버의 로그인 패스워드가 8보다 길어 인증이 실패하는 경우가 있었다.ㅜㅜ
   개고생함..
# dhx 인증은 패스워드 최대 길이가 64이다.
# dhx2 인증은 패스워드 최대 길이가 256이다.




volume 을 생성하자.
/etc/netatalk/AppleVolumes.default 파일에 생성할 volume을 작성하면 된다.
문법은 
경로    볼륨명    옵
이다.
아래는 예제이다.

$ vi /etc/netatalk/AppleVolumes.default

/home    "Home Directory" allow:root,user    cnidscheme:dbd
/tmp              "tmp"  allow:root,shh  cnidscheme:tdb


#/home 은 공유할 경로
#"Home Directory" 는 appletalk 으로 연결시 보이는 볼륨명이다.
#allow:root,user 는 접속을 허용할 사용자 목록이다.
# cnidscheme 는 스키마를 저장할 데이터베이스이다. dbd는 버클리db이다. tdb, last 는 잘 모르겠다.
  http://netatalk.sourceforge.net/2.2/htmldocs/configuration.html 참고하라.
  난 그냥 tdb 사용하거나 버클리db 설치하고 dbd 쓴다.


netatalk 실행

$ service neatalk start




접속하기

맥 키고 finder 실행후 command + k 누르면 접속창 뜨는데 'afp://ip주소' 쓰고 확인누르면 로그인창 뜬다. 로그인하면 volume 목록 뜨고 접속하면된다.




장애 대처

  • cnidscheme 를 dbd 로 했을 때 클라이언트로 접속시 에러(someting wrong with the volume's CNID DB, using ...)를 출력하고 읽기전용으로 되는 경우가 있다. 이문제는 2가지다 CNID_METAD_RUN=no 이거나 버클리db가 설치되어 있지 않기 때문이다.
    버클리db 를 설치하자
    $ apt-cache search libdb
    $ apt-get install libdb5.1-dev db-util db5.1-util
    이미 버클리 db가 설치되어 있는데도 이런 에러가 발생한다면 모든 공유 폴더의 .AppleDB를 지우자
    rm -rf .AppleDB
    그리고 /etc/defulat/netatalk 의 CNID_METAD_RUN=yes 로 하자.
    참조: http://stve.cx/2011/07/netatalk-2-2-b4/

  • 클라이언트 접속시 파일 목록이 안보이거나 파일이나 폴더를 생성할 수 없을때는 공유한 해당 폴더의 권한문제이다. 로그인한 계정이 해당 폴더에 권한이 있는지 확인하자.

  • 클라이언트 접속시 로그인되지 않는다면 로그인계정의 패스워드 길이를 확인하자.
    /var/log/afpd.log 보면 접속한 클라이언트가 쓰는 인증방식이 있다. clearttxt 인증 방식의 경우는 패스워드 최대길이가 8이라고 위에서 언급했다. 서버 계정의 패스워드 길이를 확인하고 바꿔라.

  • 클라이언트로 접속시 "서버 버전 지원하지않는다"라고 하는 경우가 있다. 이거 어찌어찌 고쳤는데 위 설정만 잘 지키면 이런 메세지 안나올것이다.
    예상하기로는 /etc/default/netatalk 설정에서 
    AFPD_GUEST=nobody 이 설정값을 주었는데 /etc/netatalk/afpd.conf 파일에서 인증방식에 uams_guest.so 를 추가하지 않아서 이런 문제가 발생한것 같다. 혹은 클라이언트의 인증방식을 서버가 지원하지 않는 경우이다. 예를들어 클라이언트가 cleartext인증방식인데 서버는 uams_clrtxt.so 모듈을 로드하지 않을 경우이다. 이때는 /etc/netatalk/afpd.conf 에서 -uamlist  uams_clrtxt.so 을 추가하자. 
    혹시 다른 해결책이나 에러 발생원인을 확인한 사람있으면 댓글좀 달아줬으면 좋겠다. 
    내가 확인결과 클라이언트의 인증방식을 서버가 지원하지 않아서 생기는 문제였다. 서버의 인증모듈 uams_xx 를 다 로드해버리자. 



참고:
https://wiki.archlinux.org/index.php/Avahi

https://en.wikipedia.org/wiki/Zero-configuration_networking

http://linux.die.net/man/1/avahi-browse

http://linux.die.net/man/5/avahi-daemon.conf

http://www.linuxplanet.com/linuxplanet/reports/6826/1

http://qnibus.com/blog/bonjour-and-zeroconf/

http://zeroconf.sourceforge.net/

http://www.zeroconf.org/

http://www.dns-sd.org/

http://marknelson.us/2011/10/25/dns-service-discovery-on-windows/



avahi 란?


zero configuration networking(zeroconf)의 구현체이다. 이것은 멀티케스트 DNS/DNS-SD 서비스 발견을 포함한다. 이 프로그램은 자신의 서비스를 네트워크에 알리고 다른 알려진 네트워크 서비스를 발견한다. 예를 들어 네트워크 프린터나 공유 파일(samba, nfs ...)등 자신의 서비스를 알리거나 찾는다. 

zero configuration networking(zeroconf)의 리눅스 구현인 avahi 와 애플 구현인 bonjour 가 있다. windows 구현은 upnp 인가?

zero confiuration networking 은 NDS 서버 설정이나 ip를 이용하지 않은 networking 즉 DHCP환경이 없는 네트워크에서 peer to peer 연결이나 wireless 환경에서 수동설정없이 자동으로 네트워킹을 할 수 있는 환경을 만들어 준다.

예) eth1.10 이라는 network interface가 있고 이것을 dhcp 로 설정했다. 하지만 dhcp가 없는 환경이고 따라서 이 network interface는 ip를 할당받지 못한다. 이때 avahi 는 자동으로 ip을 할당받는다.

eth1.10   Link encap:Ethernet  HWaddr 00:25:90:68:50:a5  
          inet6 addr: fe80::225:90ff:fe68:50a5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:582 errors:0 dropped:0 overruns:0 frame:0
          TX packets:906 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:109106 (109.1 KB)  TX bytes:284017 (284.0 KB)

eth1.10:avahi Link encap:Ethernet  HWaddr 00:25:90:68:50:a5  
          inet addr:169.254.7.247  Bcast:169.254.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

보는 바와 같이 eth1.10은 ip할당에 실패했고 avahi는 eth1.10에 대한 가상 network interface를 만들고 이에 ip를 자동 할당했다.

  • addressing (allocating IP addresses to hosts)
    호스트에 대한 ip 주소 자동 할당
  • naming (using names to refer to hosts instead of IP addresses)
    ip 주소를 대신하는 호스트에 대한 이름
  • service discovery (finding services on the network automatically) 
    자동으로 네트워크내의 서비스 발견


avahi 활용


  • avahi daemon 실행

$ service avahi-daemon start




  • avahi-browse 로 서비스 발견(-a 는 모든 서비스 검색을 뜻함)

$ avahi-browse -a

+   eth0 IPv4 gmyi [00:0c:29:27:4e:a5]                      Workstation          local

+   eth0 IPv4 0 [00:25:90:68:50:a4]                         Workstation          local

+   eth1 IPv6 nas-gateway                                   Microsoft Windows Network local

+   eth1 IPv4 nas-gateway                                   Microsoft Windows Network local

+   eth0 IPv6 nas-gateway                                   Microsoft Windows Network local

+   eth0 IPv4  iMac (2)                           VNC Remote Access    local

+   eth1 IPv6 nas-gateway                                   Apple File Sharing   local

+   eth1 IPv6 TimeCapsule                                   Apple File Sharing   local

여러 서비스가 발견된다.




  • avahi-browse 로 ip 주소 얻기

$ avahi-browse -alr

=   eth1 IPv4 nas-gateway                                   Apple File Sharing   local

   hostname = [nas-gateway.local]

   address = [192.168.3.23]

   port = [548]

   txt = []

=   eth0 IPv6 nas-gateway                                   Apple File Sharing   local

   hostname = [nas-gateway.local]

   address = [fe80::225:90ff:feab:8176]

   port = [548]

   txt = []

=   eth0 IPv6 TimeCapsule                                   Apple File Sharing   local

   hostname = [a.local]

   address = [fe80::1278:d2ff:fe3f:301e]

   port = [548]

   txt = []

=   eth0 IPv4 DS713plus                                     Apple File Sharing   local

   hostname = [DS713plus.local]

   address = [192.168.1.55]

   port = [548]

   txt = []




  • avahi-browse 로 얻은 호스트네임과 ip 주소로 연결해보기

$ avahi-browse -alr

=   eth1 IPv4 nas-gateway                                   Apple File Sharing   local

   hostname = [nas-gateway.local]

   address = [192.168.3.23]

   port = [548]

   txt = []

$ ping 192.168.3.23

$ ping nas-gateway.local

특이하게도 nas-gateway.local 이란 호스트이름이 /etc/hosts 에 등록되어 있는 않은데도 ping nas-gateway.local 로 ping 이 보내진다. 즉 ip 주소가 없는 서비스도 hostname은 생성되기 때문에 avahi 란? 에서 언급했던 dns 와 ip 주소가 없는 네트워크 환경에서 peer to peer 가 가능하다는 것이 입증되었다.

$ avahi-browse -alr

=   eth0 IPv6 test                                    _smb._tcp       local

   hostname = [test.local]

   address = [fe80::a00:27ff:fe3c:af67]

   port = [3934]

$ ping test.local

이거 핑이 간다. 

확실히 네트워크 설정을 수동으로 잡지 않고서도 (혹은 실패해도) 자동으로 호스트네임이나 ip 주소가 생성되고 서비스가 된다는 것이 신기하다.



  • avahi 를 이용하여 나만의 서비스 알리기(publish)

우선 /etc/avahi/service 밑에 원하는 이름의 서비스를 등록한다.
$ vi /etc/avahi/service/mytest.service

<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">

<service-group>
  <name replace-wildcards="yes">%h</name>

  <service>
    <type>_mytest._tcp</type>
    <port>9876</port>
  </service>
</service-group>

$ service avahi-daemon restart


다른 호스트에서 avahi-browse 를 이용하여 mytest 서비스가 발견되는지 확인
다른 호스트(컴퓨터)에서 아래의 명령 수행

# 특정 서비스를 검색할 때는 아래와 같이 서비스명(_mytest._tcp)를 입력하면된다.
$ avahi-browse -lr _mytest._tcp

+   eth1 IPv6 nas-gateway                                   _mytest._tcp         local
+   eth1 IPv4 nas-gateway                                   _mytest._tcp         local
+   eth0 IPv6 nas-gateway                                   _mytest._tcp         local
=   eth1 IPv6 nas-gateway                                   _mytest._tcp         local
   hostname = [nas-gateway.local]
   address = [fe80::225:90ff:feab:8176]
   port = [9876]
   txt = []
=   eth1 IPv4 nas-gateway                                   _mytest._tcp         local
   hostname = [nas-gateway.local]
   address = [192.168.3.23]
   port = [9876]
   txt = []
=   eth0 IPv6 nas-gateway                                   _mytest._tcp         local
   hostname = [nas-gateway.local]
   address = [fe80::225:90ff:feab:8176]
   port = [9876]
   txt = []


놀랍다. 검색이 되었다. 




IP 자동 할당


우선 avahi-autoipd 패키지를 설치한다.

$ apt-get install avahi-autoipd


만약 eth1을 avahi-autoipd 로 ip를 자동 할당 받고 싶다면

$ avahi-autoipd -D eth1

$ ifconfig eth1:avahi

eth1:avahi Link encap:Ethernet  HWaddr 00:25:90:9b:56:8a  
        inet addr:169.254.8.33  Bcast:169.254.255.255  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          Memory:dfa20000-dfa40000 

ip 가 할당된 것을 볼수 있다. ip 가 할당되면 장비에 우선 접속은 가능하므로 실제 eth1에 대한 ip는 ssh던 모던 원격지에서 설정 가능하게 된다.(모니터가 없는 장비에 유용하다. avahi-autoipd 가 ip를 할당 받고 avahi-daemon 이 서비스를 알려주고 있다면 avahi-browse를 통해서 서비스를 검색하고 호스트네임으로 접속이 가능하기 때문이다.)



avahi 어디에 활용 할까?


여러 장치를 설치해야할때 일일히 해당 장비로 가서 네트워크등을 설정하기 힘들다. avahi-daemon 이 돌고 있다면 원격지에서 서 avahi-browse 로 검색해서 호스트이름으로 ssh 접속해서 네트워크나 기타 설정등을 해주면 된다.

소형장비의 경우 모니터나 기타 표시 장치가 없다. 또한 소형장비는 아무곳에서나 설치될 수 있다. avahi를 이용한다면 해당 장비가 어디에 설치되든 어디로 옮기든 문제가 되지 않는다. 자동으로 네트워크를 설정(호스트네임, ip 주소)하기 때문에 서비스를 검색하면 해당 소형장비에 대한 서비스 목록과 호스트네임, ip 주소가 나오기 때문에 어렵지 않게 해당 장비에 접속할 수 있다. 이런 소형장비의 경우 avahi를 이용하여 자신의 서비스명(예를 들어 mysmalldevice )을 알리고 데스트탑의 전용 서비스 검색 툴을 이용하여 해당 소형장비를 검색하여 사용할 수 있게 하는 것들이 많다.


점보 프레임(Jumbo Frame)


인터넷에서 데이터가 전송될때는 한번에 최대 1500바이트까지 전송된다. (몇몇 장비는 1492바이트) 이를 MTU(Maximum Transmission Unit)가 1500바이트 라고 말한다. 1GB파일을 전송 받으려 해도 실제로는 1500바이트씩 쪼개져서 전송된다는 뜻이다.

1990년 이더넷 표준이 제정될 당시는 기술이 부족해 회선의 품질이 조악했다. 바꿔말하면 전송하다가 오류가 많이 났다. 그래서 최대 1500 바이트면 충분하다고 생각했다. 실제로는 더 잘게 쪼개서 보냈으니 말이다.

하지만 요즘와서는 회선의 품질이 좋아졌다. 그래서 오류가 잘 발생하지 않는다. 그리고 1GB짜리를 1500씩 잘게 쪼개는 것보다 좀 더 크게 쪼개는게 덜 힘들것이다. (무를 10조각 내는게 힘든지 2조각 내는게 힘든지 생각해보자. 칼질 횟수 줄어들면 당연히 덜 힘들고 금방 한다) 그래서 나온게 점보 프레임(Jumbo Frame)이다.

점보프레임은 표준은 아니다. [알테온웹시스템즈](Alteon WebSystems, 2000년 10월에 Nortel에 합병)에서 만든 ACEnic 기가비트 NIC(Network Interface Card, 네트워크 인터페이스 카드, 쉽게 말해 랜카드)에서 처음 소개된 기술일 뿐이다. 하지만 널리 쓰이게 되어 결국 산업표준 까지 되게 되었다.

현재는 점보프레임을 이용할때, 9000 바이트를 기준으로 하는 MTU를 사용한다. 9000(9K)바이트는 산업 표준이다. 9000바이트 미만까지 지원하는 장비도 있고, 그 이상을 지원하는 장비도 있다. 하지만 기준은 어디까지나 9000바이트다. 1500에서 9000이니 6배나 커진 셈이다.

점보 프레임을 사용하려면 [스위치]와 [NIC]에서 모두 지원해야 한다. 요즘 나오는 기가비트 스위치와 기가비트 NIC는 대부분 지원할 것이다. (단지 문제가 있다면 최대 MTU가 얼마냐가 다를 뿐이다) 같은 허브에 연결된 장비끼리만 점보프레임을 이용해 전송할 수 있다.

그러나 점보 프레임이 무조건 좋다고 생각하는건 금물이다. 일단 호환성은 안좋다. 지원안되거나 호환안되는 장비끼리는 통신이 제한된다. 그리고 단지 쪼개는 횟수를 1/6으로 줄인것이다. 바꿔말하면 금방 쪼개는 경우(즉 CPU가 좋은 경우)에는 속도 향상을 느끼지 못할 것이다. 점보 프레임이 처음 나온 때가 2000년대 초반이라는걸 감안해야 한다. 요즘 나오는 CPU를 사용할 때는 점보프레임으로 인한 성능 향상이 미미하다. 10Gbps정도는 되어야 성능차이가 보일 것이다.

----

위에서 MTU가 1500, 1492인경우가 있다고 했다.

만약 자신의 인터넷라인이 1492 MTU를 지원한는데, 이를 1500으로 놓고 인터넷을 하면 많이 느려진다. (1500짜리를 1492 + 8 로 두번에 걸쳐서 전송한다. 1500은 윈도우의 기본값이다) 인터넷 속도를 높여주는 유틸이 하는 일 중 하나가 사용자의 최적의 MTU값을 찾아주는 것이다. 보통 4352(FDDI, 광랜), 1500(이더넷), 1492(IEEE 802.3/802.2), 1480(PPPoE(WAN 미니 포트)) 중 한개이다.






리눅스 MTU 변경 방법


  • MTU 확인
    $ ifconfig

eth0      Link encap:Ethernet  HWaddr 00:25:90:ab:81:76  
          inet addr:192.168.3.23  Bcast:192.168.3.255  Mask:255.255.252.0
          inet6 addr: fe80::225:90ff:feab:8176/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:47443039 errors:0 dropped:319996 overruns:0 frame:0
          TX packets:20381556 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:17193961472 (17.1 GB)  TX bytes:15043026859 (15.0 GB)
          Memory:df920000-df940000 


  • MTU 변경
    $ ifconfig eth0 mtu 9000

eth0      Link encap:Ethernet  HWaddr 00:25:90:ab:81:76  
          inet addr:192.168.3.23  Bcast:192.168.3.255  Mask:255.255.252.0\
          inet6 addr: fe80::225:90ff:feab:8176/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:9000  Metric:1
          RX packets:47443039 errors:0 dropped:319996 overruns:0 frame:0
          TX packets:20381556 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:17193961472 (17.1 GB)  TX bytes:15043026859 (15.0 GB)
          Memory:df920000-df940000 




1. 커널 모듈 소스이 있는 디렉토리로 가서 Makefile을 만들자.


$ vi Makefile


2. 다음의 라인을 추가하자. (모듈 이름을 foo라고 하자)


obj-m = foo.o

KVERSION = $(shell uname -r)

all:

make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules

clean:

make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean


3. make 명령어로 모듈을 컴파일하자. (모듈 컴파일은 어떠한 사용자라도 가능하다.)


$ make


마지막으로 foo.ko이라는 모듈이 생성될 것이다.

참고 : 

http://www.linux-mag.com/id/7839/ - bcache 와 flashcache 에 대한 이론 설명

http://download.synology.com/download/ds/userguide/Synology_SSD_Cache_White_Paper.pdf - synology ssd 활용



1.bache (kernel 3.10 부터 포함이란다.)
기본 사이트에서 받은 kernel 모듈은 커널 3.2 기반이라 3.8을 사용하는 나로써는 왠지 문제가 될것 같았다.

https://gist.github.com/terrorobe/4128237 - Build bcache debian kernel (데비안 커널에서 bcache 설치)

http://bcache.evilpiepirate.org/ - bcache 공식 사이트

http://www.accelcloud.com/2012/04/18/linux-flashcache-and-bcache-performance-testing/ - Linux flashcache and bcache performance testing

http://pommi.nethuis.nl/ssd-caching-using-linux-and-bcache/ - SSD caching using Linux and bcache, 하드웨어 구성(harddisk 용량속도에 따른 ssd 용량) ,  Benchmark 정리도 있음, attach deattch 설명도 잘 되어 있음

https://wiki.archlinux.org/index.php/Bcache - bcache archlinux wiki 사용법

https://gist.github.com/TheAnonymous/5787963 - bcache tutorial (bcache 가 포함된 리눅스 커널 3.10 을 컴파일함 - redhat 계열) , 추가로 실행 스크립트 도 작성되어 있다.

http://habrahabr.ru/post/182372/ - bcache 커널 모듈 컴파일 방법

http://www.spinics.net/lists/linux-bcache/msg00581.html - bcache 제어 방법 (예를 들어 stop, 상태보기)

http://www.linux-mag.com/id/7847/ - bache 벤치마킹 자료 (bcache 스케줄 방식에 따른 자료)


2. dm-cache

http://blog.kylemanna.com/linux/2013/06/30/ssd-caching-using-dmcache-tutorial/ - ssd caching using dm-cache tutorial


3. Flashcache 

http://www.sebastien-han.fr/blog/2012/11/15/make-your-rbd-fly-with-flashcache/ - MAKE YOUR RBD FLY WITH FLASHCACHE


4. 커널 컴파일

http://mojolog.com/385




 block cache 종류

 dm-cache (by Redhat - in the 3.9 Kernel, so it should be in ubuntu 13.10)

 Flashcache (developed and used by facebook)

 Bcache (developed and used by Google )

 EnhanceIO (by STEC; based on Flashcache)





BCACHE

특징 :sequential I/O 에 대해서는 캐시가 적용되지 않는다. random I/O 에서만 캐시가 적용된다.


BCACHE 설치 - Ubuntu (커널 3.10에 bcache 포함됨)
redhat 계열은 https://gist.github.com/TheAnonymous/5787963 참고하세요

 # 커널 3.10 에 bcache 가 포함되어있다. 커널 3.10을 받아 컴파일한다.

$ apt-get install build-essential libncurses5-dev
필요 패키지

$ cd /usr/src

$ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.10.tar.xz

$ tar xvf linux-3.10.tar.xz

$ cp /boot/config-`uname -r` .config

$ make oldconfig  
# 이때 CONFIG_BCACHE 를 y 로 만들어야 합니다. 만약 지났쳤다면 vim .config 를 통해 CONFIG_BCACHE=y 를 추가해주세요

$ make-kpkg clean

$ make-kpkg --initrd kernel_image kernel_headers kernel_source modules_image
# 상위 폴더에 .deb 를 만든다.

$ cd ..

$ dpkg -i * .deb 
# linux-image-XXXXX.deb , linux-headers-XXXXX.deb 가 생겨있다. 이걸 설치하면된다.

$ reboot




# ubuntu kernel 을 패키지로 설치하는 방법도 있다.

http://kernel.ubuntu.com/~kernel-ppa/mainline/  여기가서 원하는 커널 버전을 받는다.

linux-header-..._all.deb

linux-headers-..._i386(amd64).deb

linux-image-..._i386(amd64).deb

32bit면 i386, 64bit면 amd 64 받으면 된다. 위의 3개의 패키지를 다 받아야 한다.


$ sudo dpkg -i linux-header-..._all.deb

$ sudo dpkg -i linux-headers-..._amd64.deb

$ sudo dpkg -i linux-image-..._amd64.dev


3개의 패키지를 다 설치한다. 귀찮으면 sudo dpkg -i linux* 

설치후 재부팅한다.

$ sudo reboot 


재부팅후 kernel 버전 확인 한다.

$ uname -a




BCACHE-TOOL 설치 

 # bcache-tools 는 bcache 유틸이다.

# bcache-tools 다운로드
# git 에서 받을 꺼니까 apt-get install git 으로 git 패키지를 우선 설치하자.

$ git clone http://evilpiepirate.org/git/bcache-tools.git

$ cd bcache-tools

# bcache-tools 를 컴파일하기 위해서는 uuid.h 가 필요하다. libuuid , uuid-dev 설치하자.
$ apt-get install uuid-dev libuuid

$ make

$ make install



BCACHE 사용하기 

자세한 사항은 공식문서 참조
http://evilpiepirate.org/git/linux-bcache.git/tree/Documentation/bcache.txt?h=bcache-dev

# 가정한다.
# /dev/sdc 를 ssd 로 cache 로 사용할것이다.
# /dev/sdb 를 내가 사용할 블럭디바이스이다.


#backing device 포맷
$ make-bcache -B /dev/sdb

#cache device 포맷 (옵션으로 -w4k -b1M --writeback 을 주어도 된다.)
$ make-bcache -C /dev/sdc
#혹은
$ make-bcache -w4k -b1M --writeback -C /dev/sdc


#하나의 cache 블럭디바이스에 여러개의 backing 디바이스로 구성하고 싶다면
$ make-bcache -B /dev/sda /dev/sdb -C /dev/sdc 


#backing/cache device 등록 - udev 없이 수동 등록하는 것이다. 패스해도됨
#중간에 bcache를 중단했을 시 이걸로 등록해도 된다.
$ echo /dev/sdb > /sys/fs/bcache/register
$ echo /dev/sdc > /sys/fs/bcache/register


#위의 결과 /dev/bcache<N> 디바이스가 생성된다. (예를들어 /dev/bcache0)
#udev 룰에 따른 디바이스는 /dev/bcache/by-uuid/<uuid> 혹은 /dev/bcache/by-label/<label> 로 더 잘 구분할 수 있다.


#backing device 상태보기
# no cache : 캐시를 사용중이지 않다. (attach 시켜야함)
# clean : 캐시 세트에 부분이고(캐시중) dirty data가 없다
# dirty : 캐시 세트에 부분이고(캐시중) dirty data 가 있다.
$ cat /sys/block/sdb/bcache/state


#attach , 만약 상태가 no cache 라면 cache set과 attach 시켜야한다.
$ echo /dev/sdc | /sys/fs/bcache/register
$ ls /sys/fs/bcache
34abebd9-eb8a-4556-8d6c-6166d2850379  register  register_quiet
$ echo 34abebd9-eb8a-4556-8d6c-6166d2850379 > /sys/block/sdb/bcache/attach
# 뜻은 34abeb... cache 세트에 sdb 장치를 추가하겟다는 의미이다.


#bcache 세트 보기
#ls -al /sys/fs/bcache/<uuid>
$ ls -al /sys/fs/bcache/03248efas654e
...(생략)
bdev0 -> ../../../sdb
cache0 -> ../../../sdc
...(생략)

# 정확하게는 아니지만 이런식으로 현재 세트의 Block deivce 와 cache device를 알수 있다.


#cache mode를 변경할때, 기본값은 write through 이다. 하지만 속도 측면에서 write back 이 빠르다.
#cache mode를 write back 으로 변경
$ echo writeback > /sys/block/sdb/bcache/cache_mode


#scheduler 변경 (벤치마킹 자료를 보면 random I/O 시 cfq 가 좋고, sequntial I/O noop 가 좋았다.)
#스케줄관련 IOPS 벤치마크는  
http://www.linux-mag.com/id/7847/ 참고하라.
$ cat /sys/block/sdb/queue/scheduler
noop [deadline] cfq
$ echo cfg > /sys/block/sdb/queue/scheduler


#cache device block_size 변경(하드웨어 섹터 크기와 똑같이 하는 것이 좋다고 한다.)
# /sys/block/<cdev>/bcache/block_size
$ echo 4k > /sys/block/sdc/bcache/block_size


#cache device bucket size 변경 (기본값은 512k)
# /sys/block/<cdev>/bcache/bucket_size
$ echo 1M > /sys/block/sdc/bcache/bucket_size

#cache


#bache 디바이스를 포맷하고 mount 하여 사용할 수 있다.
$ mkfs.ext4 /dev/bcache0
$ mount /dev/bache0 /mnt


#재부팅후 bcache 디바이스가 등로만 되어있고 backing 디바이스가 활성화되지 않는다면 bcache 디바이스를 생성되지 않는다. backing 디바이스가 활성화 중인지 확인하고 활성화 되지 않고 있다면 강제로 활성화 시키면 된다. backing 디바이스가 활성화 되는 순간 bcache 디바이스는 생성된다.
$ cat /sys/block/sdb/bcache/running
0
$ echo 1 > /sys/block/sdb/bcache/running


#bcache 는 sequential I/O에 대해서는 캐시하지 않는다. 하지만 만약 벤치마킹이나 sequential I/O 에 대해서도 캐시하고 싶다면 이 기능을 끄면된다.
$ echo 0 > /sys/block/bcache0/bcache/sequential_cutoff

# 다시 기본값(4 MB)으로 돌리고 싶다면
$ echo 4M > /sys/block/bcache0/bcache/sequential_cutoff



## backing device 제어, 모니터링
## /sys/block/<bdev>/bcache , /sys/block/bcache*/bcache , (만약 attached 되어있다면) /sys/fs/bcache/<cset-uuid>/bdev*  디렉토리에서 제어나 모니터링을 할 수 있다.


#cache mode 확인
$ cat /sys/block/sdb/bcache/cache_mode
writethrough [writeback] writearound none

#cache mode 변경(예는 writeback 으로 변경)
$ echo writeback > /sys/block/sdb/bcache/cache_mode


#bacache 동작중인지 확인(결과가 1이면 동작중, 0이면 정지중, /sys/block/bcache0 폴더 자체가 없다면 backing, caching device 가 등록자체가 안된것이다.)
$ cat /sys/block/bcache0/bcache/running
$ cat /sys/block/sdb/bcache/running  # backing device 에서 동작확인


#bcache 일시 중지
$ echo 0 > /sys/block/bcache0/bcache/running 
#혹은 backing device 에 직접 명령
$ echo 0 > /sys/block/sdb/bcache/runnig


#bcache 완전 중지 (중지시 /dev/bcache 디바이스가 사라진다.) 완전 중지보다는 detach 후 정지 시키는 것이 좋다.
$ echo 1 > /sys/block/bcache0/bcache/stop
#혹은 backing device 에 직접 명령
$ echo 1 > /sys/block/sdb/bcache/stop


#bcache 중지 시킨후(/dev/bcache 사라진후) 다시 구동시킬때 (cache device 인지 backing device 인지는 make-bcache 명령으로 포맷팅시 구별되므로 문제 없다.)
$ echo /dev/sdb > /sys/fs/bcache/register
# 혹은
$ make-bcache -B /dev/sdb


# dirty data(backing device 에 동기화 되지 않은 데이터) 확인
$ cat /sys/block/bcache0/bcache/dirty_data


#bcache 에 등록한 블럭 디바이스의 uuid 확인
#이 uuid 는 bcache 로 포맷팅된 블럭 디바이스에 대해서만 확인가능하다.(bcache 용 uuid이다.) 
$ probe-bcache /dev/sdb
611410d2-0d0f-4c9c-b775-2b5a16385495: UUID="" TYPE="bcache"



## Backing device stats
## /sys/block/<backing dev>/bcache/stats_total/ 아래에 backing device 의 상태가 있다. 예를들어 cache_hit
# 예를들어 cache hit 률을 알고 싶을때
$ cat /sys/block/sdb/bcache/stats_total/cache_hits



참고 : 

http://blog.naver.com/PostView.nhn?blogId=jamesy&logNo=60150726922 - 커널 모듈 로드되지 않았을 때 도움이 됨

http://chonnom.com/bbs/board.php?bo_table=B19&wr_id=168&page=6 - ipmi 아이피 설정에 도움이 됨 

http://en.wikipedia.org/wiki/Intelligent_Platform_Management_Interface - 여긴 위키

http://openipmi.sourceforge.net/ - OpenIPMI 사이트 (모듈)

http://ipmitool.sourceforge.net/ - ipmitool 사이트 (api 를 구현한 유틸)




필요조건

1. IPMI version 1.5 이상을 지원하는 Hardware Platform(메인보드)
2. Serial Over LAN 기능을 사용하기 위한 RMCP+ protocol이 지원되는 Hardware Platform.
3. SMBUS를 통해 BMC와 통신하기 위한 UDP 623 port의 개방.
※ BMC : Baseboard Management Controllers. IPMI compliant micro controllers that handle system event management. These are usually available as cPCI cards.


설치

 #Redhat , fedora, centos
 $yum install -y OpenIPMI OpenIPMI-tools

 #Ubuntu
 $sudo apt-get install openipmi ipmitool


모듈 로드

 $modprobe ipmi_si

 $modprobe ipmi_devintf


유저 설정

 #유저 리스트 확인
 $ipmitool user list 1
 ID  Name     Callin  Link Auth IPMI Msg   Channel Priv Limit
 2   ADMIN            false   false      true       ADMINISTRATOR

 #ID 변경
 $ipmitool user set name 2 admin

 #패스워드 변경 (예. p@sswOrd)
 $ipmitool user set password 2 p@sswOrd

 #유저 추가 (없는 ID 값에다가 추가하면된다. 예제는 3번에 testuser 를 추가)
 $ipmitool user set name 3 testuser

 #유저 권한 ( ipmitool user priv <user_id> <privilege level> [<channel number>]  )
 $ipmitool user priv 3 4 1


유저권한 설명

 3

  서버를 관리할 수는 있지만 사용자를 추가하거나 삭제할 수 없음

 4

  모든 권한 



IP 설정

 # IPMI ip 설정 확인
 $ipmitool lan print 1

 # ip static 으로 설정
 $ipmitool lan set 1 ipsrc static

 # ip 주소 변경
 $ipmitool lan set 1 ipaddr 192.168.3.3

 # ip netmask 변경
 $ipmitool lan set 1 netmask 255.255.255.0

 # 기본 게이트웨이 변경
 $ipmitool lan set 1 defgw ipaddr 192.168.0.1


 # 대체로 web 관리자가 있으므로 ip 설정후 웹브라우저를 통해 접속하면 관리가 편하다.


apt-fast 란?

apt-fast 는 apt-get 의 wrapper 쉘스크립트입니다. apt-fast 는 apt 의 다운로드 속도를 높여주기위해 사용합니다.


설치

$ sudo add-apt-repository ppa:apt-fast/stable

$ sudo apt-get update

$ sudo apt-get install apt-fast axel

$ sudo apt-get install aria2 (요즘은 이게 설치되어야하는듯)



apt-fast 관련 자세한 사항은 참고 사이트보세요

http://www.maketecheasier.com/apt-fast-speed-up-package-download-in-ubuntu/2012/06/29

http://www.webupd8.org/2012/10/speed-up-apt-get-downloads-with-apt.html

http://ubuntuguide.net/install-apt-fast-download-accelerator-in-ubuntu-12-0411-1010-04

https://github.com/ilikenwf/apt-fast -- [gitub] apt-fast 




apt-get 의 저장소를 변경해도 다운로드 성능을 향상시킬수 있다. apt-fast 보다 차라리 저장소를 변경해라.

우리나라 저장소중 http://ftp.daum.net/ubuntu/ 이곳이 낫다.

/etc/apt/source.list 파일을 열고 http://ftp.daum.net/ubuntu/ 을 형식에 맞게 추가하고 apt-get update 후 apt-get install 을 해보라. 속도 겁나 빠르다.

http://blog.naver.com/PostView.nhn?blogId=sihal7&logNo=110118208571 - Linux iSCSI 설치

www.cisco.com/web/KR/products/pc/snp/5400/iscs_wp.pdf - CSCO iSCSI 설명

http://www.thecus.com/download/howtoguide/HowtoConnecttoaniSCSITargetUsingWindows.pdf - Windows iSCSI initiator

http://www.cyberciti.biz/tips/howto-setup-linux-iscsi-target-sanwith-tgt.html - Linux tgtadm: Setup iSCSI Target ( SAN )

http://www.cuddletech.com/articles/iscsi/ - A Quick Guide to iSCSI on Linux

http://www.cyberciti.biz/tips/howto-setup-linux-iscsi-target-sanwith-tgt.html - Linux tgtadm: Setup iSCSI Target ( SAN )

http://linux-iscsi.org/wiki/Main_Page

http://ceph.com/dev-notes/adding-support-for-rbd-to-stgt/ - Adding Support for RBD to stgt

http://www.hastexo.com/resources/hints-and-kinks/turning-ceph-rbd-images-san-storage-devices - LIO 를 이용한 방법

http://permalink.gmane.org/gmane.comp.file-systems.ceph.user/2028 - iscsi target은 무엇이 좋은지 모가 괜찮은지에 대해 토론

http://www.spinics.net/lists/ceph-users/msg00569.html - RBD + iSCSI 에 대해 TGT + librbd 를 찾았다는 내용

http://scst.sourceforge.net/comparison.html - SCSI TARGETS 들의 비교표

http://www.linux-iscsi.org/wiki/Features#cite_note-scstaio-3 - SCSI TARGETS 들의 비교표

http://lwn.net/Articles/424004/ - SCST vs LIO

http://wjkim-info.tistory.com/707 - 윈도우에서 iscsi 연결법




iSCSI Target 종류에는 아래와 같이 있음

Linux LIO, Sun COMSTAR, Other IET, Other SCST, Other STGT

모든 내용을 정리하기가 힘들어 링크만 걸었습니다. 굵은 글씨가 제가 보고 도움이 많이 되었던 사이트들 입니다. scst 는 커널 컴파일하고 모듈 올리고 실행시키다가 잘 안되고 포기했습니다.




lio/tcm (tcm 은 kernel 2.6.38 부터 LIO 로부터 합병한 새로운 generic Target Core Module 이다. 3.1 부터 iSCSI 를 지원한다.)

http://linux-iscsi.org/wiki/Main_Page - linux-iscsi

http://wiki.alpinelinux.org/wiki/Linux_iSCSI_Target_(TCM)

http://linux-iscsi.org/wiki/ISCSI - iscsi target 만들기

** 데모용으로 쓸 때는 set attribute demo_mode_write_protect=0 authentication=0 generate_node_acls=1 cache_dynamic_acls=1 을 지정해서 쓰자
** 설정 후에는 saveconfig 하자.

target 재시작은 /etc/init.d/target restart




tgt 

http://stgt.sourceforge.net/ - tgt project

https://wiki.archlinux.org/index.php/TGT_iSCSI_Target

http://cbspd.egloos.com/5689126 - tgt 설치법

https://github.com/fujita/tgt - tgt 소스

http://ceph.com/dev-notes/adding-support-for-rbd-to-stgt/ - tgt + ceph rbd

http://fedoraproject.org/wiki/Scsi-target-utils_Quickstart_Guide




scst (kernel 컴파일이 필요하다. ㅜㅜ 커널소스 받아야한다.)

http://scst.sourceforge.net/

http://scst.sourceforge.net/iscsi-scst-howto.txt - scst source 설치

https://launchpad.net/~ast/+archive/scst2 - ubuntu package 설치
   https://help.launchpad.net/Packaging/PPA - ppa (Personal Package Archive) 에 대한 설명

http://www.zimbio.com/Ubuntu+Linux/articles/5vq_mlaTjIT/How+To+Install+SCST+on+Ubuntu - how to install scst on ubuntu (source 설치에 도움이 많이 됨)

http://www.tomlecluse.be/blog/20110902/scst-and-scstadmin-ubuntu-1104 - Scst and scstadmin on Ubuntu 11.04

[scst source 설치시 커널 소스는 꼭 받아야할듯]


 


Initiator

http://www.open-iscsi.org/ - Open-iSCSI

http://linux-iscsi.org/wiki/Core-iSCSI - Core-iSCSI (kernel)

Core-iSCSI 가 Open-iSCSI 보다 향상된 기능과 성능을 갖고 알려진 문제를 해결했다 한다.



iscsitarget

http://iscsitarget.sourceforge.net/

 

 


참고:

http://damduc.tistory.com/256
http://blog.daum.net/donfig/3163924
http://newstars.tistory.com/201
http://blog.naver.com/PostView.nhn?blogId=xrodie&logNo=10043856773
http://kldp.org/node/124067
http://community.365managed.com/?document_srl=1112
http://www.ciokorea.com/m/news/6/11672/%EA%B8%B0%EA%B3%A0%20%7C%20802.11ac%EC%9D%98%20%EC%9E%A5%EB%8B%A8%EC%A0%90%EA%B3%BC%20%EB%B6%88%ED%8E%B8%ED%95%9C%20%EC%A7%84%EC%8B%A4
http://cafe.daum.net/redhat/DK8S/10?docid=1HjQ8DK8S1020090724131640
http://lesstif.tistory.com/262
http://idccc.com/wordpress/archives/165
http://neonis.tistory.com/9 - mode 0 테스트한 결과도 있음
http://gmyoul.tistory.com/entry/%EC%9A%B0%EB%B6%84%ED%88%ACubuntu%EC%97%90%EC%84%9C-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EB%B3%B8%EB%94%A9bonding-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0
http://rafi.inha.ac.kr/~wbstory/tc/wbstory/69
http://backdrift.org/howtonetworkbonding - bonding 설정 (모든 리눅스 버전에 대해 써있다.)
http://www.cyberciti.biz/howto/question/static/linux-ethernet-bonding-driver-howto.php - 본딩 드라이브 옵션값 의미 써있음
http://shibaboy.com/?tag=link-aggregation - link aggregation 설명
http://wp.goodchois.kr/devtip/archives/332 - NIC 티빙(설명이 좋다.)
https://help.ubuntu.com/community/UbuntuBonding - 우분투  공식 bonding 법(multi bonding 가능함)
http://shibaboy.com/?p=221 - bonding 모드 설명 자세함
http://ftth3.tistory.com/253 - 멀티 본딩 , multi bonding 에 관한 내용


http://www.knom.or.kr/knom-review/v8n1/8.pdf - mode 0(round-robin) 벤치마크 자료


http://www.cisco.com/en/US/tech/tk389/tk213/technologies_configuration_example09186a0080094470.shtml - CISCO 스위치 lacp(link aggregation control protocol, 802.3ad) 설정법





Bonding 이란?



NIC 카드 이중화로 여러 NIC카드를 논리적으로 묶어 대역폭을 늘리거나 가용성을 위해 사용하는 방법이다.

리눅스에서는 Bonding, 윈도우에서는 Teaming, 시스코에서는 EtherChannel이라고 부른다.

표준은 Link Aggregation 이라고 한다.

몇몇 본딩 모드는 스위치의 EtherChannel 기능이 지원 되어야 한다. EtherChannel 이 off되어 있거나 지원하지 않는다면 몇몇 본딩 모드는 사용할 수 없거나 기능이 떨어진다.


Bonding mode




  •  mode 0 : Round-robin
    첫번째 가능한 슬레이브부터 마지막까지 순차적으로 전송한다. 이 모드는 부하분산과 failover를 제공한다.
    active-active,
    이론상 슬레이브 수만큼의 배수대로 대역폭을 확장가능한다.
    스위치에서 지원한다면 hashing 없이 load balancing 된다.
  • mode 1 : Active-backup
    bond에서 하나의 슬레이브만 활성화된다. 다른 슬레이브는 standby 상태로 대기하다. 활성중이 슬레이브가 fail 된 경우 standby 슬레이브가 활성화 된다.
    대역폭은 활성화된 슬레이브의 대역폭을 갖는다. primary를 직접설정하지 않으면 failback 되지 않는다.
  • mode 2 : balance-xor (load balancing + failover)
    0과 비슷하지만 xor연산을 이용하여 목적지 Mac과 근원지 Mac을 이용하여 분배한다. ( (출발지 mac XOR 목적지 mac) modula 슬레이브 개수
    fault tolerance load balancing 을 위한 XOR 으로 설정한다. 이 방식은 인터페이스가 slave 네트워크 카드들의 하나에 대한 Mac address imcoming request Mac address를 연결하는 방식이다.

  • mode 3 : broadcast (failover)
    모든 슬레이브 인터페이스로 전송한다. 이것은 failover를 제공한다(mirror). 하나의 슬레이브만큼 대역폭을 갖는다. 특별한 상황에서 사용한다. 그 특별한 경우는 랜카드가 절대로, 절대로 죽어서는 안되고 패킷이 절대로 절대로 없어지면 안되는 서버에 사용된다.
    스위치의 지원이 필요없다.

  • mode 4 / LACP : 802.3ad (link aggregation)
    switch aggregation group을 생성해야한다. (switch 802.3ad 를 지원해야한다.) 
    같은 속도와 duplex 설정을 공유하는 aggregation group을 만들어야한다. /수신은 active aggregator 안에서 모든 슬레이브에서 수행된다이론상 슬레이브 수만큼의 배수대로 대역폭을 확장가능한다.

  • mode 5 : balance-tlb
    스위치의 지원이 필요없다.
    이 모드는 특별한 지원이 OS 자체적으로 구동가능한 방법으로 각 링크의 현재 로드에 따라 보내는 데이터는 분산되어 전송된다. 데이터의 수신은 현재 slave쪽으로만 가게되며 해당 slave가 fail시 다른 slave가 MAC주소를 넘겨받아 수신한다. 데이터를 보낼 때에 드라이버가 MAC address를 링크의 것으로 바꿔 보내지만 받을 때에는 그냥 남겨둔다.

  • mode 6 : balance-alb
    mode 4 즉 802.3ad 를 스위치가 지원하지 않는다면 이 모드인 mode 6를 사용하면된다.
    스위치의 지원이 필요없다.
    이 모드는 mode 5와 같이 동작하지만 데이터 수신 시에서 load-balancing을 하는데 두개의 링크에서 ARP negotiation을 토앟여 동작한다. MAC 주소 트릭을 이용하여 데이터를 보내고 받을 때에 load-balancing을 하게 된다.



  • Require switch supports modes
    1. mode 0 (balance-rr) - 트래픽은 hashing 없이 load balancing 된다.
    2. mode 4 (802.3ad) - 기본적으로 해당 모드는 스위치에서 지원 off되어 있다.
    3. mode 2 (balance-xor) - 받는 쪽의 receiver에 의하여 트래픽은 hashed되고 balancing 된다.

  • Generic modes (switch의 지원없이도 kernel과 driver를 통해 자체적 구동이 가능)
    1. mode 3 (broadcast)
    2. mode 5 (balance-tlb)
    3. mode 6 (balance-alb)


참고



 본딩을 하기 위해서는 서버뿐만 아니라 스위치에서도 설정이 필요하며, mode 1인 active-backup은 굳이 스위치의 설정은 별도로 필없없다. 시스코 스위치에서 본딩을 하여 대역폭 확장을 확실히 하기위해서는 mode 0 가 아닌 mode 4(시스코에서는 LACP-link aggregation ) 를 써야한다.

 본딩은 리눅스 커널에서 본딩 기능이 지원되어야하고 최적의 성능을 위해서는 스위치가 EtherCannel 이 지원되어야한다.



설정



 Ubuntu

 모듈 설치

apt-get install ifenslave


인터페이스 추가

$vi /etc/network/interfaces

auto bond0
iface bond0 inet static
address xxx.xxx.xxx.xxx
netmask xxx.xxx.xxx.xxx
gateway xxx.xxx.xxx.xxx
#broadcast xxx.xxx.xxx.xxx
post-up ifenslave bond0 eth0 eth1


모듈 설정

$vi /etc/modprobe.d/aliases.conf  # 딴 이름이어도 된다.

alias bond0 bonding
options bonding mode=4 miimon=100

#bonding 뒤의 값들은 옵션이다.
#miimon 은 해당 밀리초마다 인터페이스를 체크한다는 의미이다.
#mode 는 자신이 원하는 모드 번호를 넣으면 됩니다. 예제는 mode 4라고 가정했습니다.
#모듈 옵션은 http://www.cyberciti.biz/howto/question/static/linux-ethernet-bonding-driver-howto.php 을 보아라.
#modinfo bonding 으로도 모듈의 정보를 볼 수 있다.


시스템 재부팅시 본딩 모듈이 로드되지 않아 네트워크가 다운되는 경우가 있는데 이경우 /etc/rc.local 을 수정하거나 /etc/modules 에 모듈을 추가하는 방법이있다. 둘중 하나만 쓰면된다. 참고로 /etc/modules 에다가 설정하는 것이 의미상 맞는것 같다.


$vi /etc/modules

bonding mode=4 miimon=100 lacp_rate=1

#bonding 뒤의 값들은 옵션이다.
#mode 값은 자신의 본딩 모드 번호를 넣으면된다. 예제는 mode 4 라고 가정했습니다.
#lacp_rate 는 LACPDU 패킷을 전송하기 위해 링크 파트너를 요청하는 옵션이다. 1 은 1초마다 요청하는 것이고 0은 30초마다 요청하는 것이다. 고성능을 위해서는 1 즉 fast 가 좋다. 

$vi /etc/rc.local

modprobe bonding mode=4

#시스템 부팅시 최초한번 실행되는 스크립트이다. /etc/modules 가 쓰기 싫다면 이거 사용하면된다.
#mode 값은 자신의 본딩 모드 번호를 넣으면된다. 예제는 mode 4 라고 가정했습니다.


aliases.conf 수정
# 모듈 이름의 별명을 붙이는 것이다. 아래 예제과 같이 작성하면 modprobe bond0 라고 하면 modprobe bonding 과 같은 의미이다.
# 모듈을 자동으로 올리게도 한다.
#자세한 설명은 
http://linux.die.net/man/5/modprobe.d 참조하라.

#
# 꼭 aliases.conf 가 아닌 다른 이름으로해도된다. 예를들어 bonding.conf 라고해도 된다.

$vi /etc/modprobe.d/aliases.conf  

alias bond0 bonding
options bonding mode=4 miimon=100


## 위에 /etc/modprobe.d/ 에 작업하는거는 하나의 큰 문제가 있다. 그 문제는 여러개의 본딩 모드를 제공하지 못한다는 것이다. 예를 들어 bond0 은 mode 1 , bond1 은 mode 4 를 사용하고 싶은데 위의 방법으로하면 마지막에 설정한 하나의 본딩 mode로 bond0, bond1이 동일해진다. 이때는 multi bonding 을 사용하여야한다. 관련 내용은 구글링해보아라.


시스템 재부팅

$sudo reboot

#/etc/init.d/networking restart 명령어로 네트워크만 재시작 해줄경우 bonding 구성이 안될수 있다. 이때는 시스템을 재부팅해야한다.



기타

#bonding 구성확인
$cat /proc/net/bonding/bond0


#bonding 인터페이스 확인
$ifconfig


#bonding 모듈 로드확인
$ lsmod | grep bonding


#bonding 인터페이스 up
$ifconfig bond0 up
$ifup bond0


#라우팅 테이블 확인
$route -n


#ubuntu 10.04 버전 이후로는 /etc/network/intervaces 에 대해 아래의 문법도 지원한다.
auto eth0
iface eth0 inet manual
bond-master bond0

auto eth1
iface eth1 inet manual
bond-master bond0

auto bond0
iface bond0 inet static
address xxx.xxx.xxx.xxx
gateway xxx.xxx.xxx.xxx
netmask xxx.xxx.xxx.xxx

bond-mode 802.3ad
bond-miimon 100
bond-lacp-rate 4
bond-slaves none



참고해라. 위의 방식은 mutil bonding 즉 하나의 장비에 여러개의 다른 bonding mode를 가지지 못한다. 예를 들어 bond0 는 mode 2, bond1 은 mode 4 로 두개의 bonding 의 mode를 다르게 하지 못한다는 것이다.
서로 다른 bonding 모드를 지원하기 위해서는 아래의 링크를 보아라.






Multi bonding 이란?



기존의 /etc/modprobe.d/alias.conf 와 post-up ifenslaves를 사용하는 방식은 한장비에 서로 다른 bonding mode 를 여러개 두지 못햇다. mode를 다르게 해도 마지막 설정된 bonding mode 로 동일하게 적용되었다.

아래의 방식은 한 장비에 여러개의 서로다른 bonding mode 를 두는 방식을 지원한다.

 ubuntu

 ifenslave 설치
 
 ubuntu 12.04 이전버전
 $ sudo apt-get install ifenslave

 ubuntu 12.04와 그 이후버전
 $ sudo apt-get install ifenslave-2.6



모듈 등록 (재부팅시 자동으로 커널 모듈 로딩)

 # /etc/modules 파일에 bonding 추가
 $ sudo vi /etc/modules
 bonding



네트워크 서비스 중단 및 bonding 모듈 로딩

 $ sudo stop networking 
 or
 $ sudo service networking stop


 # bonding 모듈 로딩
 $ sudo modprobe bonding



인터페이스 설정

# /etc/network/interfaces 설정

$ sudo vi /etc/network/interfaces

#eth0 is manually configured, and slave to the "bond0" bonded NIC
auto eth0
iface eth0 inet manual
bond-master bond0

#eth1 ditto, thus creating a 2-link bond.
auto eth1
iface eth1 inet manual
bond-master bond0

# bond0 is the bonded NIC and can be used like any other normal NIC.
# bond0 is configured using static network information.
auto bond0
iface bond0 inet static
address 192.168.1.10
gateway 192.168.1.1
netmask 255.255.255.0
# bond0 uses standard IEEE 802.3ad LACP bonding protocol
bond-mode 4
# or 모드 이름으로도 가능
#bond-mode 802.3ad
bond-miimon 100
bond-lacp-rate 1
bond-slaves none



# bond-mode 는 이름으로도 가능하고 번호로도 가능하다. 예를 들어 bond-mode active-backup 이라해도 되고 bond-mode 1 이라고 해도 된다.

# bond-slaves none 빼면 안되더라.


네트워크 서비스 구동

 $ sudo start networking
 or
 $ sudo service networking start


본딩 구성 확인

 # /proc/net/bonding/bond0 를 확인

 $ cat /proc/net/bonding/bond0

Ethernet Channel Bonding Driver: v3.5.0 (November 4, 2008)

Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer2 (0)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

802.3ad info
LACP rate: fast
Aggregator selection policy (ad_select): stable
bond bond0 has no active aggregator

Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0c:29:f5:b7:11
Aggregator ID: N/A

Slave Interface: eth2
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0c:29:f5:b7:1b
Aggregator ID: N/A



기타 - 인터페이스 up/down

 $ sudo ifup bond0

 $ sudo ifdown bond0




장애시


 # 구성이 잘안된다 싶고 service networing start 에서 멈춰있거나 service networing stop 이 안되면 bonding 모듈을 언로딩하고 해라.
 $ modprobe -r bonding  
 $ service networking stop


 #  bond-slaves none 을 확인해라.
 이게 없으면 이상하게 service networing start 시 무한 대기하더라.














  1. 찡빠 2017.03.04 01:36

    단일서버에 4port릉 하나의본딩으로묶고 두개의스위치에 2port씩 연결하고 lacp로 설정하면 작동잘되나요?
    안된다고하면 어떻게 설정 해야할가요?

  2. 익명 2019.05.28 09:17

    비밀댓글입니다

+ Recent posts