시스템/LinuxSystem2011.03.05 15:36
시스템/클라우드2011.02.07 00:14

Linux의 쓰임새가 점차 대형화, 고속화를 요구하게 되면서, 많은 부분이 그에 맞추어 향상되고 있다. 64 Bit 프로세서, 기가바이트(Giga Byte : 2^30 Byte)대의 메모리, 기가비트급 네트웍, 테라바이트(Tera Byte : 2^40 Byte) 심지어 페라바이트(Pera Byte : 2^50 Byte) 규모의 파일시스템... 이루 말할 수 없는 변화가 시시각각 일어나고 있다.

올해 초, Linux Kernel 2.4 가 발표되면서 많은 기능 향상과 추가가 이루어졌다. 위에 언급한 기업수준의 규모를 어느 정도 만족시킬 수 있게 되었다. 그중에 눈에 띄는 것이 바로 LVM를 기본으로 지원한다는 것이다.

 

1. LVM 이란?


    LVM 은 Logical Volume Manager 의 약자로서, 저장장치들을 좀더 효율적이고 유연하게 관리할 수 있는 커널의 부분과 프로그램을 말한다. 처음에는 IBM에서 개발되었는데, 그후에 OSF(현재는 OpenGroup http://www.opengroup.org)에서 차용을 하여 OSF/1 operating system 에서 쓰였다. 지금은 HP-UX, Digital Unix operating system, AIX 등의 상용 유닉스에서 쓰고 있다. 리눅스 버전은 현재 HP-UX의 것을 모델로 하여 Sistina Software 사(http://www.sistina.com)에서 open source로 개발하고 있다.


    LVM 을 이해하려면 먼저 Software RAID (Redundant Array of Inexpensive Drives)를 언급해야 하는데, 이 둘은 비슷하면서도 큰 차이가 있다.
    비슷한 점은 여러 물리적인 디스크들을 하나의 논리적인 디스크처럼 다룰 수 있게 함으로서 조합방법에 따라 고용량, 고속, 데이터의 무결성을 실현하는 점이다.
    하지만 분명하게 다른 점이 있는데. lvm은 raid보다 관리 및 확장이 비교적 쉬운 반면, raid에는 lvm에는 없는 disk mirroring(RAID level 1), Parity Stripe (RAID level 4,5) 등의 방식이 있어서 속도 또는 데이터의 무결성을 보장 받을 수 있다.


    그러나 이런 차이점에도 불구하고 lvm가 주목을 받는 이유는 다음과 같다.


    ·쉬운 관리.
    ·서로 다른 많은 디바이스 조합 지원.
    ·직관적인 저장 장치로의 접근.
    ·뛰어난 확장성.
    ·믿을만한 안전성과 효율.
    ·스냅샷 기능 지원.  


    이와 같은 특징들로 인해 사용자들이 얻는 이득은 많다.


    우선, pc 급 시스템 사용자들의 가장 큰 고민 중의 하나가 시스템을 처음 설치할 때에 파티션의 구성을 어떻게 할 것인가 일 것이다. 파티션은 한번 구성해 놓으면 바꾸기가 쉽지 않기 때문이다. 또 파티션이 가득 차기라도 하면 어렵게 백업을 하거나 눈물을 머금고(?) 자료를 지워야 할 경우도 심심치 않게 생기기 마련이다. 하지만 LVM를 쓰면 간단하게 저장공간을 확장, 축소 할 수 있기 때문에 그런 고민을 덜 수 있다.


    다른 예로, 중소형 서버에서는 비교적 적은 비용으로 대용량 저장 장치를 구현하는 것이 가능해진다. 그리고, 백업 없이 기존의 환경을 유지한 채 확장이 가능하기 때문에 (물론 백업은 *언제나* 중요하다.) 유지보수면에서 상당한 이득이 있을 것이다.

 

2. 기본 지식


    일반적으로 유닉스 시스템에서 저장 장치를 쓰는 방법은 그 장치의 블록 디바이스(Block Device)에 파일 시스템 (File System)을 만들어서 (다른 표현으로는 포맷(Format)한다라고 하지만 유닉스의 세계에서는 잘 쓰지 않는다.) 디렉토리에 마운트 시키는 것이다. 예를 들어, 두번째 버스의 프라이머리 ide 디스크의 첫번째 파티션에 reiserfs 파일 시스템을 만든 후, /debian/ftp 라는 디렉토리에 마운트를 시킨다면 다음과 같은 절차를 밟을 것이다.


    # mkfs -t reiserfs /dev/hdc1
    # 화면에 나오는 질문에 y 라고 답변
    # mount -t reiserfs /dev/hdc1 /debian/ftp


    lvm을 써도 마찬가지 절차를 밟는다. 단지, 실제 블록 디바이스가 아닌 가상의 블록 디바이스를 쓴다는 점이 틀리다.



    <그림 1>


    실제적으로 lvm은 커널에서 파일 시스템과 블록 디바이스 사이에 위치하여 동작한다. 일반적인 방식과 lvm에 의해 동작하는 방식의 차이는 <그림1>에 잘 나타나 있다.


    lvm의 동작 방식의 이해와 활용을 위해서는 몇 가지 용어에 대한 사전지식이 필요하다.

     

    1)  VG, PV, LV


    VG(Volume Group)은 LVM의 가장 기본적인 요소이다. 쉽게 말하자면 가상 디스크라고 할 수 있는데, 하나 이상의 실제 물리적으로 존재하는 블록 디바이스가 모여서 VG를 이루게 된다.


    그 물리적인 블록 디바이스를 PV(Physical Volume)라고 하는데, 거의 대부분의 장치를 PV로 쓸 수 있다. 하드디스크 및 그 파티션, 소프트웨어/하드웨어 RAID 장치, 심지어 Loopback 블록 디바이스(파일 시스템상의 파일을 블록 디바이스처럼 쓸 수 있게 해준다)까지도 말이다.


    PV와 대비되는 것이 LV(Logical Volume)이다. 이것은 가상 파티션이라고도 할 수 있는데, VG를 적당히 나누어 할당한 것이 LV이다. 사용자는 LV를 일반 디스크나 파티션처럼 쓰면 된다.


    정리하자면, <그림2>를 보면 알 수 있듯이, 하나 이상의 PV가 모여 VG를 이루고, VG를 가상적으로 나누어 할당하면 LV이 된다.

    < 그림 2 >


    참고적으로, 한 시스템에서 VG는 최대 99개까지 만들 수 있고, 하나의 VG에는 PV, LV 모두 최대 256개까지 할당할 수 있다.

     

    2)  PE와 LE


    PE(Physical Extent)와 LE(Logical Extent)는 각각 물리적 할당단위와 논리적 할당단위를 뜻한다. 이 둘은 물리
    적인 위치나 크기는 같다.
    그러므로 PE가 LV에 할당되면 LE가 된다라고 볼 수 있다.


    <그림3>를 보면 PE, LE의 관계가 잘 설명되어 있다.

    < 그림 3 >


    VG를 나누어 LV로 할당할 때 LVM은 하드디스크의 섹터처럼 작은 단위로 하지 않고 적당한 크기의 PE로 하게 된다. 그 이유는 할당단위가 극히 작으면, 할당정보가 엄청나게 커지고, 그에따라 시스템의 성능도 느려질 것이다. 또한 할당할 수 있는 크기에도 한계가 생길 것이다. PE의 크기는 VG를 만들 때에 정해지는데, 그에 따라서 VG의 최대 크기가 정해진다. 하나의 VG에는 65536개까지 PE를 할당할 수 있고, PE의 크기는 최소 8KB에서 2배씩 늘어나 최대 512MB까지이다. 그러므로 VG의 최대 크기의 범위는 최소 512MB(8KB x 65536)에서 최대 32TB(512MB x 65536)일 것이다.

     

    3)  VGDA


    PV의 앞 부분에는 VGDA(Volume Group Descriptor Area)라는 부분이 있어서 VG의 모든 정보가 기록된다. 같은 VG에 속해 있는 PV들은 VGDA의 내용이 같다.


    그 내용은, VG의 이름, 상태, 속해있는 PV, LV들, PE, LE들의 할당 상태 등이다. LVM은 이 VGDA 를 참조하고, 갱신하면서 모든 일을 수행한다.

     

    4)  Linear Mapping LV 와 Striped Mapping LV


    앞서 언급한 대로 LVM은 소프트웨어 RAID를 어느 정도는 대체할 수 있다. lvm에서는 두 가지 방식으로 LV를 만들 수 있는데, Linear RAID 와 대응되는 Linear Mapping 방식과 RAID Level 0 과 대응되는 Striped Mapping 방식이 그것이다.  


    두 방식의 차이점은 두개 이상의 비어있는 PV를 가지고 있는 VG에 LV를 할당할 때에, PE를 어떻게 배치시키는가 이다.


    Linear Mapping 방식은 일반적인 것으로써, PE를 순차적으로 할당시킨다. 예를 들어 <그림4>의 왼쪽 그림을
    보면, 각각 3개의 PE가 있는 PV1, PV2으로 이루어진 VG1에 4개의 LE를 가진 LV1을 할당한다고 할 때에, LVM은 먼저 PV1에 3개의 PE를 순차적으로 할당하고 나머지 1개의 PE는 PV2에 할당한다.


    반면, Striped Mapping 방식은 <그림4>의 오른쪽 그림에 나타나 있듯이, 위에서와 같은 환경으로 할당한다고 할 때에, PE는 적당한 크기의 조각들(stripes?)로 나누어진다. LVM는 그것을 두 PV에 분산하여 할당하게 된다. 그러므로 두 PV들에 할당된 PE의 갯수는 같다.




    Striped Mapping 방식의 목적은 두개 이상의 PV를 동시에 읽고 씀으로서, 속도 향상을 바랄 수가 있다는 것이다. 물론, PV들이 서로 독립적인 장치이어야지, 같은 장치 내의 파티션들이라면 오히려 역효과가 날 것이다.

     

    5)  Snapshots  


    규모가 큰 시스템에서 서비스의 중지없이 백업을 할 때에 가장 큰 문제점이 백업도중에 데이터가 변경되는 것이다. 그러면 백업 자체가 무용지물이 될 수도 있기 때문이다.


    그런 문제를 해결하려면 어느 시점에 데이터가 변경되지 못하게 고정시키는 것인데, 그런 기능을 구현한 것이 Snapshot LV이다.


    Snapshot LV는 기존의 LV를 복사하며 별도의 읽기 전용의 LV를 만드는 것이기 때문에, 데이터 변경을 걱정하지 않고 백업을 마칠 수 있을 것이다.  


    [출처] http://www.linuxlab.co.kr/docs/01-05-4.htm

Posted by AnonyMous_H@CK
TAG lvm, 리눅스
시스템/LinuxSystem2010.12.13 03:09
리눅스 백업 관련 명령어

tar
- 로컬영역을 백업한다.
- tar cvfpz [백업파일] [대상파일]

예)# tar cvfpz home.tar.gz /home - /home 디렉토리를 home.tar.gz로 압축하여 백업한다.

dump
- dump [option] [backup_name] [dump_file]

option
- 0~9 : 덤프레벨 0은 전체백업이고 나머지는 부분백업이다.
- f : 백업할 미디어 및 파일명 지정

예)
# dump -0f home_backup /home - /home디렉토리를 home_backup이란 이름으로 dump한다.
# dump -0f usr_backup /dev/sda5 - /dev/sda5 파티션을 usr_backup이란 이름으로 dump한다.

restore
- dump된 파일을 복구한다.
- restore [option] [dump_file]

option
-i : 대화식으로 복구 파일을 선택 후 복원
-f : 백업 파일명으로 지정
-r : 전체 복원

---------------------------------------------------------------------------------------------

예) dump 명령어를 이용해 /home 폴더를 백업해 보자.

# mkdir backup - 백업할 폴더를 생성한다.
# cd backup

# dump -0f home-backup /home - /home폴더를 home-backup 이름으로 dump한다.
  DUMP: Date of this level 0 dump: Mon Nov 17 16:16:36 2008
  DUMP: Dumping /dev/sda6 (/home) to home-backup
  DUMP: Label: /home
  DUMP: Writing 10 Kilobyte records
  DUMP: mapping (Pass I) [regular files]
  DUMP: mapping (Pass II) [directories]
  DUMP: estimated 1890 blocks.
  DUMP: Volume 1 started with block 1 at: Mon Nov 17 16:16:41 2008
  DUMP: dumping (Pass III) [directories]
  DUMP: dumping (Pass IV) [regular files]
  DUMP: Closing home-backup
  DUMP: Volume 1 completed at: Mon Nov 17 16:16:42 2008
  DUMP: Volume 1 1820 blocks (1.78MB)
  DUMP: Volume 1 took 0:00:01
  DUMP: Volume 1 transfer rate: 1820 kB/s
  DUMP: 1820 blocks (1.78MB) on 1 volume(s)
  DUMP: finished in 1 seconds, throughput 1820 kBytes/sec
  DUMP: Date of this level 0 dump: Mon Nov 17 16:16:36 2008
  DUMP: Date this dump completed:  Mon Nov 17 16:16:42 2008
  DUMP: Average transfer rate: 1820 kB/s
  DUMP: DUMP IS DONE
# ls -l
-rw-r--r-- 1 root root 1863680 11월 17 16:16 home-backup

# file home-backup
home-backup: new-fs dump file (little endian), This dump Mon Nov 17 16:16:36 2008, Previous dump Thu Jan  1 09:00:00 1970, Volume 1, Level zero, type: tape header, Label /home, Filesystem /home, Device /dev/sda6, Host server3, Flags 3
- dump를 통해 생성된 home-backup파일의 파일 종류를 알아본다.

# du -sh home-backup
1.8M    home-backup
- dump를 통해 생성된 home-backup파일의 용량을 알아본다.

# restore -rf home-backup - dump인 home-backup파일의 전체를 복원한다.

# ls
aquota.user  install.log.syslog  ks.cfg  lost+found  protoss  terran  test1  test2  test3  zerg
home-backup  restoresymtable                 
# ls /home
aquota.user  install.log.syslog  ks.cfg  lost+found  protoss  terran  test1  test2  test3  zerg
- 원본 폴더와 비교해 보면 같은 파일이 복원된 것을 알 수 있다.

---------------------------------------------------------------------------------------------

예) dump를 통해 백업된 파일을 필요한 파일 또는 폴더를 선택해서 복원해 보자.

# ls -l
-rw-r--r-- 1 root root 1863680 11월 17 16:16 home-backup

# restore -if home-backup - -i 옵션을 통해 필요한 파일 또는 폴더를 복원할 수 있다.
restore > help                  - dump -i 모드에서의 도움말을 확인 할 수 있다.
Available commands are:
        ls [arg] - list directory
        cd arg - change directory
        pwd - print current directory
        add [arg] - add `arg' to list of files to be extracted
        delete [arg] - delete `arg' from list of files to be extracted
        extract - extract requested files
        setmodes - set modes of requested directories
        quit - immediately exit program
        what - list dump header information
        verbose - toggle verbose flag (useful with ``ls'')
        prompt - toggle the prompt display
        help or `?' - print this list
If no `arg' is supplied, the current directory is used
restore > ls
aquota.user         lost+found/        test1/           zerg/
install.log.syslog  protoss/            test2/
ks.cfg                 terran/              test3/

restore > add test1
restore > add test2
restore > add test3 - 복원할 파일 또는 폴더를 선택한다.
restore > ls
aquota.user         lost+found/        *test1/           zerg/
install.log.syslog  protoss/            *test2/
ks.cfg                 terran/               *test3/          - 복원할 파일 또는 폴더에 '*'가 붙여져 있다.

restore > extract   - dump파일에서 필요한 파일 또는 폴더를 푼다.
You have not read any volumes yet.
Unless you know which volume your file(s) are on you should start
with the last volume and work towards the first.
Specify next volume # (none if no more volumes): 1
set owner/mode for '.'? [yn] y

restore > quit       - 복원이 끝났으면 dump -i 모드를 종료한다.
# ls -l
합계 1836
-rw-r--r--  1 root  root  1863680 11월 17 16:16 home-backup
drwx------ 18 test1 test1    4096 11월 17 10:09 test1
drwx------  4 test2 test2    4096 11월 17 10:10 test2
drwx------  3 test3 test3    4096 11월 12 09:33 test3
- 선택한 파일 또는 폴더가 복원 된 것을 확인 할 수 있다.

---------------------------------------------------------------------------------------------

dd (Disk Dump)
- dd if=[input_device] of=[output_device]

예) /dev/sda1 (= /boot) 파티션을 dd를 이용해 백업해 보자.

# fdisk /dev/sda - fdisk를 이용해 /dev/sda13 파티션을 새로 생성

# df -l
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda2              9920624   1125780   8282776  12% /
/dev/sda7              9920592   3505976   5902548  38% /usr
/dev/sda6              9920592    154972   9253552   2% /home
/dev/sda5              9920592    490128   8918396   6% /var
/dev/sda1               101086     11128     84739  12% /boot
tmpfs                   512776         0    512776   0% /dev/shm
/dev/sda8              1929068      2880   1828196   1% /data1

# dd if=/dev/sda1 of=/dev/sda13
208782+0 records in
208782+0 records out
106896384 bytes (107 MB) copied, 17.1724 seconds, 6.2 MB/s
- /boot 파티션을 확인한 다음 dd 명령어를 이용해 디스크를 덤프시킨다.

# mkdir /boot-dd
# mount /dev/sda13 /boot-dd
- 마운트 할 폴더를 생성한 다음 dd로 생성한 /dev/sda13을 /boot-dd에 마운트 시킨다.

# ls /boot-dd
System.map-2.6.18-92.el5  grub                           lost+found   symvers-2.6.18-92.el5.gz
config-2.6.18-92.el5          initrd-2.6.18-92.el5.img  message     vmlinuz-2.6.18-92.el5
# ls /boot
System.map-2.6.18-92.el5  grub                           lost+found   symvers-2.6.18-92.el5.gz
config-2.6.18-92.el5          initrd-2.6.18-92.el5.img  message     vmlinuz-2.6.18-92.el5
- 원본 폴더와 비교해 보면 같은 파일이 복원된 것을 알 수 있다.

[출처] http://bban2.tistory.com/68


DD명령어 활용

기능 : 부트 플로피나 스왑파일을 만드는 특수한 복사를 위한 명령어이다.

사용법 : dd 옵션

of=file : 표준출력대신 지정한 파일에 작성한다.

if=file : 표준입력대신 지정한 파일에서 불러들인다.

ibs=size : 지정한 사이즈만큼 읽는다.

obs=size : 지정한 사이즈만큼 쓴다.

bs=size : 지정한 사이즈만큼 읽고 쓴다.

count=n : 입력블록의 ibs크기만큼 복사한다.

conv=ascii : EBCDIC->ASCII로 변환

conv=ebcdic : ASCII->EBCDIC로 변환

conv=ibm : ASCII코드호환을 EBCDIC코드로 변환

conv=swab : 입력되는 두 바이트의 순서를 바꾼다. 입력파일에서 짝이 맞지 않는 하나의 비트가 남으면 , 마지막 바이트는 단순히 복사된다.

활용

dd if=kernel-image of=/dev/fd0 bs=1440 -> 커널이미지(부팅디스크)를 fd0디스크에 1.4mb 사이즈로 복사함

[출처] http://blog.naver.com/koleekr7/100092813697

NAME
       dd - 한 파일을 복사하는 동한 변환한다.

SYNOPSIS
       dd  [--help]  [--version]  [if=file]  [of=file] [ibs=bytes] [obs=bytes]
       [bs=bytes]  [cbs=bytes]  [skip=blocks]   [seek=blocks]   [count=blocks]
       [conv={ascii,ebcdic,ibm,block,unblock,lcase,ucase,swab,noerror,notrunc,
       sync}]

DESCRIPTION
       이 문서는 더이상 최신 정보를 담고 있지않다.  그래서,  몇몇틀릴  경우 도
       있고,  부족한  경우도  있을  것이다.  완전한매뉴얼을 원하면, Texinfo 문
       서를 참조하기 바란다.

       이 매뉴얼 페이지는 dd 명령의 GNU  버전에  대한  것이다.  dd 명령은 지정
       한  블럭크기만큼 파일을 복사하는데, 사용된다.  초기값으로는 표준 입력과
       표준 출력을 사용한다.  또한 선택적으로 그 파일의 변환도 수행한다.  (즉,
       파일을 특정 크기로 나누는데, 주로 사용됩니다. - 옮긴이 말)

OPTIONS
       사용될 수 있는 블럭 크지 지정의 문자들은 다음과 같다:
       b=512, c=1, k=1024, w=2, xm=number m

       --help 도움말을 보여주고 마친다.

       --version
              버전 정보를 보여주고 마친다.

       if=file
              표준 입력 대신에 지정한 file을 입력 대상으로 한다.

       of=file
              표준 출력 대신에 지정한 file을 출력 대상으로 한다.  conv=notrunc
              옵션을 사용하지 않는 한은, seek= 바이트 크기에 따라 ( seek= 크기
              가 0아닌 한) 지정한 크기에 따라 출력 파일을 자른다.

       ibs=bytes
              한번에 bytes 바이트씩 읽는다.

       obs=bytes
              한번에 bytes 바이트씩 쓴다.

       bs=bytes
              한번에 bytes 바이트씩 읽고 쓴다.  ibs, obs 값 무시.

       cbs=bytes
              한번에 bytes 바이트씩 변환한다.

       skip=blocks
              입력 시작에서 blocks 단위 만큼 ibs 크기를 건너띈다.(가령 skip=5,
              ibs=10 이면, 처음 50바이트를건너띄어 작업을 계속한다.)

       seek=blocks
              출력 시작에서 blocks 단위 만큼 ibs 크기를 건너띈다.

       count=blocks
              입력의 blocks 의 ibs 크기만큼만 복사한다.

       conv=conversion[,conversion...]
              대상 파일로 복사할 때, conversion 으로 변환 한다.
              Conversions:
              ascii  EBCDIC 코드를 ASCII 코드로.

              ebcdic ASCIi 코드를 ebcdic 코드로.

              ibm    ASCII 코드를 alternate EBCDIC 코드로.

              block  cbs 단위로 변환 할 때 읽은 것 안에 있는 줄바꿈 문자들을공
                     백 문자로 바꾼다.

              unblock
                     cbs 단위로 변환 할 때 읽은 것 안에 있는 공백 문자들을줄바
                     꿈 문자로 바꾼다.

              lcase  대문자를 소문자로

              ucase  소문자를 대문자로

              swab   입력되는 두 바이트의 순서를 바꾼다.  유닉스의 dd 명 령 과
                     달 리, 이것은 읽혀질 짝이 맞지 않는 추가 바이트 하나가 생
                     겼을 때는그냥 그대로 작업한다.  즉, 입력 파일에서 짝이 맞
                     지 않는 하나의 바이트가 남으면, 마지막 바이트는 그냥 단순
                     히 복사된다.  (이것의 순서가 바뀌지 않는한)

              noerror
                     오류를 읽어도 계속 한다.

              notrunc
                     출력 파일을 자르지 않는다.

              sync   ibs 블럭 크기와 obs 블럭 크기가 차이가 있을 경우, 그 여백
                     을 NULL문자로 채운다.


[참조]
Dump & restore 명령어와 NFS 서버를 이용한 OS 백업 및 복구(카페가입필요) - http://cafe.naver.com/eitlinux/54
파일시스템 복구 - http://blog.naver.com/etrangers/80015699686

Posted by AnonyMous_H@CK
시스템/LinuxSystem2010.09.24 23:45
CentOS 4.xx 버전에서는 'netconfig' 라는 명령어를 통해서 네트워크 설정을 했으나
CentOS 5.xx 버전부터는 그 명령어가 사라지고 'setup'이라는 명령어를 통해서 설정해야 한다.

[root@localhost ~]# setup

Posted by AnonyMous_H@CK
시스템/LinuxSystem2010.08.31 15:31

# dmesg
 - 부팅시에 하드웨어적인 에러 파악
 - 시스템의 부팅과정에서 출력된 메세지
   (하드웨어나 시스템 체크)

# cat /var/log/messgaes
 - 운영중에 장애난 사항 파악
 - 시스템의 작동 메세지나 데몬들의 에러로그

[example]
# dmesg | grep error   (or fail*  or down등)
# cat /var/log/messages | grep error*       (or reboot  or down등)

[출처] http://pilot1002.blog.me/40058114739

Posted by AnonyMous_H@CK