검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 프로그램과 명령어/관리와 유지보수
참조 원문 : 5 Tips To Speed Up Linux Software Raid Rebuilding And Re-syncing

  원문 작성자가 기본 상태로 2TB 디스크 5개를 사용해 RAID 6를 구성했을 때 처리 속도가 초당 약 4000K로 완성까지 걸리는 시간이 대략 22시간이었다는 실제 사례를 들면서 이 속도를 더 빠르게 만드는 팁을 공개했기에 소개합니다.

1. /proc/sys/dev/raid/{speed_limit_max,speed_limit_min} 커널 변수
  /proc/sys/dev/raid/speed_limit_min 은 리빌드가 아닌 활동이 어레이에 있을 때의 "목표" 리빌드 속도를 나타내는 설정 파일입니다. 속도는 초당 킬로바이트(kibibyte=1024)이며 어레이 당 속도가 아닌 디바이스 당 속도입니다. 디폴트 값은 1000입니다.

  /proc/sys/dev/raid/speed_limit_max 는 리빌드가 아닌 활동이 어레이에 없을 때의 "목표" 리빌드 속도를 나타내는 설정 파일입니다. 디폴트 값은 200000입니다.

  현재 한계 값은 아래 명령어로 볼 수 있습니다.
# sysctl dev.raid.speed_limit_min
# sysctl dev.raid.speed_limit_max
  주의: 아래 내용은 리눅스 소프트웨어 레이드의 리빌딩 속도를 높여주지만 전체적인 시스템 부하, CPU 및 메모리의 사용률을 증가시킵니다.

  속도를 높이기 위해 아래 명령어를 입력합니다.
echo 값 > /proc/sys/dev/raid/speed_limit_min
또는
sysctl -w dev.raid.speed_limit_min=값
예:
# sysctl -w dev.raid.speed_limit_min=50000
  디폴트 자체를 변경하려면 /etc/sysctl.conf 파일에 아래처럼 두 옵션을 추가합니다. 참고로 CPU와 메모리로 인해 제한을 받을 수도 있습니다.
dev.raid.speed_limit_min = 50000
dev.raid.speed_limit_max = 2000000 (어레이의 구성 디스크가 4~5개인 경우)
dev.raid.speed_limit_max = 5000000 (어레이의 구성 디스크가 6~12개인 경우)

2. read-ahead 옵션 설정
  레이드 디바이스 당 readahead(단위는 512바이트 섹터) 값을 설정합니다. 방법은 아래와 같습니다.
# blockdev --setra 65536 /dev/mdX (장치명을 알맞게 변경)
## 아래는 read-ahead를 32 MiB로 설정하는 예 ##
# blockdev --setra 65536 /dev/md0
# blockdev --setra 65536 /dev/md1

3. RAID 5와 RAID 6의 stripe-cache_size 설정
  RAID 5와 RAID 6일 때만 가능한 설정으로 싱크 성능을 3~6배 높여줍니다. 어레이의 모든 쓰기 작업에 대한 동기화와 어레이에 문제가 발생했을 때 실시하는 모든 읽기 작업에 사용하는 stripe cache의 크기(디바이스 당 페이지 수)를 변경합니다. 디폴트 값은 256입니다. 가능한 값은 17~32768입니다. 이 값을 높이면 특정 상황에서 시스템 메모리를 더 사용하여 속도를 높일 수 있습니다. 이 값을 너무 높이면 시스템을 메모리 부족 상태로 만들 수 있습니다. 아래 공식을 사용합니다.
메모리 사용량 = 시스템_페이지_크기 * 구성 디스크의 개수 * stripe_cache_size
  아래는 /dev/md0의 stripe_cache_size 값을 16MiB로 설정하는 예입니다.
# echo 16384 > /sys/block/md0/md/stripe_cache_size
  아래는 /dev/md3의 stripe_cache_size 값을 32MiB로 설정하는 예입니다.
# echo 32768 > /sys/block/md3/md/stripe_cache_size

4. 모든 디스크의 NCQ 비활성화
  아래는 bash로 반복문을 사용하여 /dev/sda부터 /dev/sde까지의 NCQ를 비활성화하는 예입니다.
for i in sd[abcde]
do
  echo 1 > /sys/block/$i/device/queue_depth
done

5. 비트맵 옵션
  비트맵은 crash가 발생하거나 디바이스 제거 후 다시 추가했을 때의 리빌드 시간을 최적화시켜줍니다. 아래의 명령어로 사용할 수 있습니다.
# mdadm --grow --bitmap=internal /dev/md0
  어레이 리빌드나 싱크가 끝나면 다시 비활성화합니다.
# mdadm --grow --bitmap=none /dev/md0

결과
  작성자의 경우 속도가 4000K에서 51000K로 높아졌다고 합니다.
# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath]
md5 : active raid1 sde2[2](S) sdd2[3](S) sdc2[4](S) sdb2[1] sda2[0]
      530048 blocks [2/2] [UU]
md0 : active raid6 sde3[4] sdd3[3] sdc3[2] sdb3[1] sda3[0]
      5855836800 blocks level 6, 64k chunk, algorithm 2 [5/5] [UUUUU]
      [============>........]  resync = 61.7% (1205475036/1951945600) finish=242.9min speed=51204K/sec

RAID 리빌딩/복구 작업을 모니터링하는 방법
  현재 사용 중인 어레이에 대한 정보를 담고 있는 /proc/mdstat 파일을 보면 됩니다. 이때 watch 명령어를 활용하면 진행상황을 실시간으로 볼 수 있습니다.
# watch -n1 cat /proc/mdstat
  mdadm 명령어로 특정 어레이에 대한 자세한 정보를 볼 수 있습니다.
# mdadm --detail /dev/md2
  iostat 명령어로 디스크 사용현황을 볼 수 있습니다.
# watch -n1 iostat -k 1 2
2013/07/17 00:54 2013/07/17 00:54
Posted
Filed under 프로그램과 명령어/관리와 유지보수
참조 원문 : CentOS system administration using text-based user interfaces

  Curses 라이브러리를 사용하는 dialog를 통해 스크립트에서 나름 GUI 느낌이 나게 스크립트를 짜는 예제입니다. CentOS라면 보통은 dialog가 설치되어 있지 않으므로 yum을 사용해서 설치해야 합니다.

  아래 예제에서는 메뉴, 진행률 막대의 기본 사용법을 볼 수 있습니다.
#!/bin/bash

#The dialog part. By default, the chosen menu item goes to STDERR (2). From there it's redirected to a temp file (/tmp/temp_file) in the script.

/usr/bin/dialog --title "Delete /tmp content" --menu "Delete /tmp content older than:" 10 30 0 1 "1 day" 2 "2 days" 2> /tmp/temp_file

#Get the choice by reading the /tmp/temp_file
option=`cat /tmp/temp_file`

#Remove the temp file
rm -f /tmp/temp_file

#Clear the screen for better readibility
/usr/bin/clear

#Create a function to delete the temp content. It accepts as an argument a number of days. Any content older than this number will be deleted.
function delete_tmp {
    /bin/echo "Deleting files and directories older than $1 day(s) in /tmp"
    /bin/find /tmp/ -type f -mtime +$1 -exec rm {} -rf \;
    #Show a dialog gauge with the progress
    /bin/echo "50" | /usr/bin/dialog --gauge "Deleting files" 10 30 0
    #For better visual effect wait 1 second before continuing
    /bin/sleep 1
    /bin/find /tmp/ -type d -mtime +$1 -exec rm {} -rf \;
    #Show a dialog gauge with the progress again
    /bin/echo "100" | /usr/bin/dialog --gauge "Deleting directories" 10 30 50
    /bin/sleep 1
    #Clear the screen
    /usr/bin/clear
}

#Go through a conditional statement
#First check if $option is not null. Option is null usually when the cancel button from the menu is pressed.
if [ -z $option ]; then
    /bin/echo 'Cancel pressed. Exiting.'
#Check if the first option is chosen
elif [ $option -eq 1 ]; then
    delete_tmp 1
#Check the second option
elif [ $option -eq 2 ]; then
    delete_tmp 2
fi
  실행하면 두 가지 선택사항이 나오는데 첫 번째는 /tmp 디렉토리 내에 있는 파일들 중 최종 수정 시간이 하루 이상 지난 파일들을 삭제하는 것이고, 두 번째는 이틀 이상 지난 파일을 삭제하는 것입니다. 선택하면 진행률 막대도 나오는 것을 볼 수 있습니다. 메뉴와 게이지의 인자로 있는 10과 30은 각각 텍스트 박스의 높이와 너비를 텍스트 문자로 쟨 값입니다. 메뉴에 있는 세 번째 인자는 내부 선택 공간의 높이고 네 번째 인자는 처음에 선택되어 있는 항목의 번호입니다. 게이지의 세 번째 인자는 진행률 막대의 시작지점을 비율 값으로 나타낸 것입니다.

  배포판에 따라 명령어의 경로명이 다를 수 있습니다. 가령 데비안 계열의 경우 find의 기본 위치가 /usr/bin/find 입니다. 이런 문제 때문에 스크립트 윗 부분에서 OS 및 배포판을 감지하여 그에 맞는 경로명을 변수에 보관하거나 which 같은 명령어로 즉석에서 알아내서 변수로 보관한 뒤 명령어를 사용할 때 그 변수를 활용하는 것이 더 좋습니다.

2013/07/16 13:18 2013/07/16 13:18
Posted
Filed under 프로그램과 명령어/관리와 유지보수
참조 원문 : Find USB device details in Linux/Unix using lsusb command

1. lsusb를 통해 얻을 수 있는 정보
$ lsusb
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 05c8:021e Cheng Uei Precision Industry Co., Ltd (Foxlink)
Bus 001 Device 007: ID 0cf3:3005 Atheros Communications, Inc. AR3011 Bluetooth
Bus 002 Device 003: ID 0781:5567 SanDisk Corp. Cruzer Blade
  • Bus 002 : SanDisk USB가 연결된 버스 번호
  • Device 003 : 002 버스의 세 번째 장치임을 뜻함. 첫 번째 장치는 Linux Foundation 2.0 root hub, 두 번째 장치는 Intel Corp. Integrated Rate Matching Hub
  • ID 0781:5567 : 콜론 왼쪽에 있는 번호는 제조사 ID, 콜론 오른쪽에 있는 번호는 장치 ID
  • SanDisk Corp. Cruzer Blade : 제조사 및 장치명

2. 머신에 있는 USB 포트 개수 확인
$ find /dev/bus/
/dev/bus/
/dev/bus/usb
/dev/bus/usb/002
/dev/bus/usb/002/006
/dev/bus/usb/002/005
/dev/bus/usb/002/004
/dev/bus/usb/002/002
/dev/bus/usb/002/001
/dev/bus/usb/001
/dev/bus/usb/001/007
/dev/bus/usb/001/003
/dev/bus/usb/001/002
/dev/bus/usb/001/001

3. 연결된 USB 장치의 자세한 정보 출력
$ lsusb -D /dev/bus/usb/002/005
Device: ID 0951:1643 Kingston Technology DataTraveler G3 4GB
Couldn't open device, some information will be missing
Device Descriptor:
  bLength 18
  bDescriptorType 1
  bcdUSB 2.00
  bDeviceClass 0 (Defined at Interface level)
  bDeviceSubClass 0
  bDeviceProtocol 0
  bMaxPacketSize0 64
  idVendor 0×0951 Kingston Technology
  idProduct 0×1643 DataTraveler G3 4GB
  bcdDevice 1.00
  iManufacturer 1
  iProduct 2
  iSerial 3
  bNumConfigurations 1
  Configuration Descriptor:
    bLength 9
    bDescriptorType 2
    wTotalLength 32
    bNumInterfaces 1
    bConfigurationValue 1
    iConfiguration 0
    bmAttributes 0×80
      (Bus Powered)
    MaxPower 200mA
    Interface Descriptor:
      bLength 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 2
      bInterfaceClass 8 Mass Storage
      bInterfaceSubClass 6 SCSI
      bInterfaceProtocol 80 Bulk-Only
      iInterface 0
      Endpoint Descriptor:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0×81 EP 1 IN
        bmAttributes 2
          Transfer Type Bulk
          Synch Type None
          Usage Type Data
        wMaxPacketSize 0×0200 1x 512 bytes
        bInterval 0

4. 모든 USB 포트 및 연결된 USB 장치의 자세한 정보 출력
$ lsusb -v

5. 시스템에 있는 모든 대용량 저장 장치 출력
  아래 결과로 대용량 저장 장치가 3개 있음을 알 수 있습니다.
$ lsusb -v | grep -Ei '(idVendor|Mass\ Storage)'
idVendor 0×2006
bInterfaceClass 8 Mass Storage
idVendor 0×0781 SanDisk Corp.
bInterfaceClass 8 Mass Storage
idVendor 0×0951 Kingston Technology
bInterfaceClass 8 Mass Storage

6. USB 장치들의 프로토콜 버전 출력
$ lsusb -v | grep -i bcdusb
bcdUSB 1.10
bcdUSB 2.00
bcdUSB 2.00
bcdUSB 2.00
  버전에 따른 속도는 아래와 같습니다.
  • USB 1.1 : 12Mb/s
  • USB 2.0 : 480Mb/s
  • USB 3.0 : 5Gb/s

7. USB 포트가 지원하는 속도를 트리 형태로 출력
$ lsusb -t
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/2p, 480M
   |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/6p, 480M
   |__ Port 1: Dev 6, If 0, Class=stor., Driver=usb-storage, 480M
   |__ Port 1: Dev 6, If 1, Class=vend., Driver=, 480M
   |__ Port 2: Dev 7, If 0, Class=stor., Driver=usb-storage, 480M
   |__ Port 3: Dev 5, If 0, Class=stor., Driver=usb-storage, 480M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/2p, 480M
   |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/6p, 480M
   |__ Port 3: Dev 3, If 0, Class='bInterfaceClass 0x0e not yet handled', Driver=uvcvideo, 480M
   |__ Port 3: Dev 3, If 1, Class='bInterfaceClass 0x0e not yet handled', Driver=uvcvideo, 480M
   |__ Port 4: Dev 7, If 0, Class='bInterfaceClass 0xe0 not yet handled', Driver=btusb, 12M
   |__ Port 4: Dev 7, If 1, Class='bInterfaceClass 0xe0 not yet handled', Driver=btusb, 12M
2013/07/15 14:33 2013/07/15 14:33
Posted
Filed under 프로그램과 명령어/관리와 유지보수
  지금에서야 이런 기본 명령어가 있다는 걸 알았다는 게 좀 신기하군요. 블록 디바이스명을 트리 형태로 보여주고 그와 함께 메이저 및 마이너 번호, 용량, 마운트 포인트 등을 출력하는 명령어로 USB의 장치명을 찾을 때 특히 유용할 것 같습니다.
$ lsblk
NAME                         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                            8:0    0    20G  0 disk
├─sda1                         8:1    0   243M  0 part /boot
├─sda2                         8:2    0     1K  0 part
└─sda5                         8:5    0  19.8G  0 part
  ├─ubuntu--vg-root (dm-0)   252:0    0  15.8G  0 lvm  /
  └─ubuntu--vg-swap_1 (dm-1) 252:1    0     4G  0 lvm  [SWAP]
sr0                           11:0    1  1024M  0 rom 
2013/07/15 12:55 2013/07/15 12:55
Posted
Filed under 프로그램과 명령어/관리와 유지보수
참조 원문 : Create and Restore manual Logical Volume Snapshots

1. 소개
  LV(Logical Volume) 스냅샷을 생성하면 로지컬 볼륨의 현재 상태를 고정시켜 쉽게 백업하거나 스냅샷을 찍었을 때의 상태로 되돌릴 수 있습니다. 쉽게 말하자면 백업 대상인 파일들이 계속 변한다면 백업이 불가능하므로 특정 시간을 기준으로 파일들의 내용을 얼려버리는 겁니다. 이에 대한 개념과 원리는 밑에서 따로 설명합니다. 참고로 이 스냅샷은 VMware에서 같은 이름의 유사한 기능으로 존재합니다.


2. 이 글에서 다룰 내용
  이 글에서는 LVM(Logical Volume Manager)을 다룰 줄 모른다는 가정하에 1기가 용량을 가진 가짜 하드 드라이브 /dev/sdb를 가지고 아래의 내용을 진행합니다.
  1. /dev/sdb 드라이브에 2개의 파티션을 만든다. 이 파티션들은 "8e Linux LVM" 타입으로 설정할 것이며 PV(Physical Volume)을 생성하는데 사용한다.
  2. 두 파티션을 생성하면 pvcreate 명령어로 PV를 생성한다.
  3. 새로운 VG(Volume Group)를 생성하고 ext4 파일시스템으로 300MB짜리 LV(Logical Volume)를 1개 생성한다.
  4. 새로운 LV를 마운트하고 실험용 데이터를 넣는다.
  5. 스냅샷을 찍고 실험용 데이터를 삭제한다.
  6. LV 스냅샷을 사용해 롤백한다.


3. LV(Logical Volume) 생성
3.1. LVM(Logical Volume Manager)의 기본 개념
  LVM을 사용하면 다수의 PV(Physical Volume)로 구성된 하나의 VG(Volume Group)를 생성할 수 있습니다. 하드 드라이브 전체가 PV일 수도 있고 하나의 파티션이 PV일 수도 있습니다. 일단 VG를 생성하면 그것을 이루고 있는 PV의 구조는 신경쓰지 않으면서 다수의 LV(Logical Volume)를 생성할 수 있습니다. VG에 PV를 추가하면 VG의 크기를 확장할 수 있으며 이를 통해 그 안에 새로운 LV를 생성하거나 기존의 LV를 확장할 수 있습니다.

3.2. 파티션 생성
  먼저 2개의 파티션을 PV용으로 생성합니다. 사실 파티션을 2개 만드는 이유는 2개의 PV로 하나의 VG를 만드는 것을 보여주기 위한 것일 뿐 별다른 의미는 없으므로 디스크 전체를 하나의 파티션으로 만들어 작업해도 상관 없습니다. 아래가 작업 대상인 물리 디스크의 정보입니다.
# fdisk -l /dev/sdb

Disk /dev/sdb: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders, total 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x335af99c

   Device Boot      Start         End      Blocks   Id  System
  fdisk로 2개의 파티션을 생성합니다. 물론 fdisk로 안 해도 상관 없습니다.
# fdisk /dev/sdb
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1):
Using default value 1
First sector (2048-2097151, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): +400M

Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
Partition number (1-4, default 2): 2
First sector (821248-2097151, default 821248):
Using default value 821248
Last sector, +sectors or +size{K,M,G} (821248-2097151, default 2097151): +200M

Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 8e
Changed system type of partition 2 to 8e (Linux LVM)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
  아래는 위 작업으로 생성한 파티션을 출력한 모습입니다.
# fdisk -l /dev/sdb

Disk /dev/sdb: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders, total 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x335af99c

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048      821247      409600   8e  Linux LVM
/dev/sdb2          821248     1230847      204800   8e  Linux LVM

3.3. PV(Physical Volume) 생성
  이제 pvcreate 명령어로 두 파티션을 PV로 만듭니다.
# pvcreate /dev/sdb[1-2]
  Writing physical volume data to disk "/dev/sdb1"
  Physical volume "/dev/sdb1" successfully created
  Writing physical volume data to disk "/dev/sdb2"
  Physical volume "/dev/sdb2" successfully created

3.4. VG(Volume Group) 생성
  vgcreate 명령어로 /dev/sdb1과 /dev/sdb2라는 PV로 구성됐으며 "volume_group"이라는 이름을 가진 하나의 VG를 생성합니다.
# vgcreate volume_group /dev/sdb1 /dev/sdb2
  Volume group "volume_group" successfully created
  vgdisplay 명령어를 사용하면 VG의 정보를 볼 수 있습니다.
# vgdisplay
  --- Volume group ---
  VG Name               volume_group
  System ID            
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               592.00 MiB
  PE Size               4.00 MiB
  Total PE              148
  Alloc PE / Size       0 / 0  
  Free  PE / Size       148 / 592.00 MiB
  VG UUID               37jef7-3q3E-FyZS-lMPG-5Jzi-djdO-BgPIPa

3.5. LV(Logical Volume) 생성
  이제 LV를 생성할 수 있습니다. LV의 크기는 당연히 VG의 크기를 넘을 수 없습니다. 여기서는 크기가 200MB이고 "volume1"이란 이름으로 생성하겠습니다.
# lvcreate -L 200 -n volume1 volume_group
  Logical volume "volume1" created
  lvdisplay 명령어를 사용하면 LV의 정보를 볼 수 있습니다.
# lvdisplay
  --- Logical volume ---
  LV Path                /dev/volume_group/volume1
  LV Name                volume1
  VG Name                volume_group
  LV UUID                YcPtZH-mZ1J-OQQu-B4nj-MWo0-yC18-m77Vuz
  LV Write Access        read/write
  LV Creation host, time debian, 2013-05-08 12:53:17 +1000
  LV Status              available
  # open                 0
  LV Size                200.00 MiB
  Current LE             50
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:0
  위의 LV Path 값을 이용하여 LV에 ext4 파일시스템을 생성합니다.
# mkfs.ext4 /dev/volume_group/volume1

4. LV(Logical Volume) 스냅샷
  드디어 이 글에서 설명하고자 하는 주제에 도달했습니다. 이제 위에서 만든 LV에 데이터를 넣고 스냅샷을 생성한 후 그 데이터를 지우고 스냅샷을 이용해 복구하겠습니다.

4.1. 스냅샷의 개념
  스냅샷을 이해하려면 먼저 LV가 무엇으로 구성되어 있는가와 데이터를 어떻게 저장하는가를 이해해야 합니다. 이 개념은 심볼릭 링크와 비슷합니다. 파일에 대한 심볼릭 링크를 만들면 실제 파일을 복사하지 않고 그 파일이 있는 위치만 보관하듯이 LV도 그런 정보만 보관하며 아래의 두 가지 기초 정보로 구성되어 있습니다.
  • 메타데이터 포인터들
  • 데이터 블록
  스냅샷을 생성하면 LVM은 모든 메타데이터 포인터를 별도의 LV에 복사합니다. 메타데이터는 용량을 별로 차지하지 않으므로 생성 자체만 생각한다면 2GB 크기의 LV를 5MB 크기의 스냅샷 볼륨이 커버하는 것도 가능합니다. 스냅샷 볼륨의 크기는 원본 LV의 데이터에 변화가 발생할 때만 커집니다. 그 이유는 원본 LV에 있는 파일을 삭제하거나 수정할 때마다 그 파일(데이터)을 스냅샷 볼륨에 복사하기 때문입니다. 작업 중에 변경사항이 많이 발생하지 않는다면 원본 LV의 5~10% 정도의 크기로 스냅샷 볼륨을 생성하면 됩니다. 변경사항이 많이 발생한다면 10% 보다 훨씬 많이 필요할 수 있습니다.

4.2. 실험용 데이터 복사 후 스냅샷 생성
  먼저 "volume1"을 위한 마운트 포인트 디렉토리를 생성하고 마운트를 합니다.
# mkdir /mnt/volume1
# mount /dev/volume_group/volume1 /mnt/volume1
  마운트 포인트에 들어가서 실험용 데이터를 복사합니다.
# cd /mnt/volume1
# cp -r /sbin/ .
# du -s sbin/
8264    sbin/
  이제 LV의 스냅샷을 생성합니다. 이 스냅샷은 별도의 LV에 저장되기 때문에 사실상 별도의 LV를 생성하게 됩니다. 아래 명령어는 20MB 크기의 "volume1_snapshot"이란 스냅샷용 LV를 생성합니다.
# lvcreate -s -L 20M -n volume1_snapshot /dev/volume_group/volume1
  Logical volume "volume1_snapshot" created
  lvs 명령어로 생성된 스냅샷용 LV를 확인합니다.
# lvs
  LV               VG           Attr     LSize   Pool Origin  Data%  Move Log Copy%  Convert
  volume1          volume_group owi-aos- 200.00m
  volume1_snapshot volume_group swi-a-s-  20.00m      volume1   0.06
  스냅샷이 생성됐으므로 "volume1"의 데이터를 변경하기 위해 복사했던 파일들을 삭제합니다.
# cd /mnt/volume1
# rm -fr
# rm -fr sbin/
  실행 후 lvs 명령어로 "volume1_snapshot"의 Data%를 보면 값이 올라간 것을 확인할 수 있습니다. 원한다면 스냅샷 볼륨을 마운트하여 "volume1"의 원본 데이터가 여전히 존재하는 것을 확인할 수 있습니다.

4.3. LV 스냅샷을 이용한 복구
  복구를 진행하기 전에 /mnt/volume1/sbin이 없는 것을 확인합니다.
# du -s /mnt/volume1/sbin
du: cannot access `/mnt/volume1/sbin': No such file or directory
  LV 스냅샷을 이용한 복구는 두 단계로 이루어집니다.
  • 다음 번 LV 활성화 때 스냅샷 복구가 진행되도록 예약
  • LV 비활성화 후 활성화
  스냅샷 복구를 예약하기 위해 아래 명령어를 실행합니다.
# lvconvert --merge /dev/volume_group/volume1_snapshot
  Can't merge over open origin volume
  Merging of snapshot volume1_snapshot will start next activation.
  사용 중인 볼륨에 스냅샷을 병합하는 것은 불가하므로 다음 활성화 때 병합(즉, 복구)하겠다는 메시지가 나옵니다. 그러므로 복구를 진행하려면 "volume1"을 재활성화해야 합니다. 먼저 "volume1"을 언마운트 후 볼륨을 비활성화 및 활성화합니다.
# umount /mnt/volume1
# lvchange -a n /dev/volume_group/volume1
# lvchange -a y /dev/volume_group/volume1
  마지막으로 LV "volume1"을 다시 마운트하여 데이터가 복구된 것을 확인합니다.
# mount /dev/volume_group/volume1 /mnt/volume1
# du -s /mnt/volume1/sbin
8264    /mnt/volume1/sbin
2013/07/14 23:04 2013/07/14 23:04
Posted
Filed under 프로그램과 명령어/관리와 유지보수
참조 원문 : Setting Up Logrotate on RedHat Linux

1. 소개
  Logrotate는 로그가 많이 쌓이는 상용 서버를 관리하는 관리자를 위한 유틸리티로 디스크 공간을 아끼면서 시스템이 용량 부족으로 뻗는 것을 방지합니다. 일반적으로 이런 문제를 막는 방법은 /var 마운트 포인트를 별도의 파티션이나 로지컬 볼륨으로 설정하는 것이지만 logrotate는 로그 파일을 일정 조건에 따라 다음 파일로 순환시키고 관리하여 해결합니다. 기본적으로 logrotate는 /etc/cron.daily/에 있는 cron 파일을 통해 하루에 한 번씩 실행됩니다.
$ ls -al /etc/cron.daily/logrotate
-rwxr-xr-x 1 root root 372 12월  1  2012 /etc/cron.daily/logrotate

2. Logrotate 설정
  Logrotate를 설정하려면 아래 두 파일을 수정해야 합니다.
  • /etc/logrotate.conf
  • /etc/logrotate.d/ 디렉토리에 있는 서비스별 설정 파일
  /etc/logrotate.conf 파일은 일반 및 디폴트 설정을 담고 있습니다. 어떤 로그 파일에 대한 설정에서 관련 항목이 없다면 그 항목은 이 파일에 있는 내용을 따릅니다. 아래는 파일 내용의 예입니다.
# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
    missingok
    monthly
    create 0664 root utmp
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0660 root utmp
    rotate 1
}

# system-specific logs may be configured here
  • weekly : 로그 파일을 주 단위로 순환시킨다.
  • rotate 4 : 4주 분량의 로그 파일을 보관한다.
  • create : 순환 후 새로운 빈 로그 파일을 생성한다.
  • include : 해당 디렉토리에 있는 파일들을 읽어서 적용한다.
  /etc/logrotate.d/ 디렉토리에는 각 서비스별 설정 파일이 있습니다.

3. 새로운 서비스의 로그를 logrotate의 관리하에 두기
  /var/log/sample.log라는 로그 파일이 있고 이 파일을 매일 순환시키길 원한다고 가정하면 /etc/logrotate.d/ 디렉토리에 새로운 파일을 생성(파일명은 원하는 것으로 생성하나 보통은 서비스명을 사용)하여 아래의 내용을 작성하여 저장합니다.
/var/log/linuxcareer.log {
    missingok
    notifempty
    compress
    size 20k
    daily
    create 0600 root root
}
  참고로 같은 디렉토리에 있는 다수의 로그 파일에 같은 설정을 적용하길 원한다면 와일드카드(*)를 사용할 수 있습니다. 예를 들어 파일명에 /var/log/mylogs/*.log 라고 적는다면 /var/log/mylogs/ 디렉토리 안에 .log 확장자를 가진 모든 파일을 순환시킵니다.

  위의 예제에 있는 각 항목에 대한 설명은 아래와 같습니다.
  • missingok : 로그 파일이 없어도 에러를 출력하지 않습니다.
  • notifempty : 파일이 비어있다면 순환하지 않습니다.
  • compress : 순환 대상을 gzip으로 압축합니다.
  • size : 로그 파일의 크기가 20k보다 클 때만 순환합니다.
  • daily : 매일 순환합니다.
  • create : 퍼미션은 600, 소유자와 소유 그룹은 root로 새로운 로그 파일을 생성합니다.
  그 외에도 많은 옵션이 존재하며 man logrotate를 통해 확인할 수 있습니다.


2013/07/12 15:44 2013/07/12 15:44
Posted
Filed under 프로그램과 명령어/관리와 유지보수
참조 원문 : 25 Useful Basic Commands of APT-GET and APT-CACHE for Package Management

apt-get이란?
  소프트웨어 패키지의 설치, 제거, 업그레이드, 전체 OS의 업그레이드에 사용하는 커맨드 라인 프로그램.

apt-cache란?
  apt 소프트웨어 패키지 캐시를 검색하기 위한 커맨드 라인 도구. 소프트웨어 패키지 검색, 패키지 정보 수집, 데비안 기반 시스템에 설치할 수 있는 패키지 검색에 사용.

APT-CACHE 명령어 예제
1. 사용할 수 있는 모든 패키지 출력
$ apt-cache pkgnames

2. 검색어와 연관된 패키지 이름과 설명 출력
$ apt-cache search 패키지명

3. 패키지 정보 확인
$ apt-cache show 패키지명

4. 특정 패키지의 의존성 확인
$ apt-cache showpkg 패키지명

5. 캐시 현황 확인
$ apt-cache stats


APT-GET 명령어 예제
1. 시스템 패키지 업데이트
  'update' 명령어는 /etc/apt/sources.list 파일에 적힌 곳을 참고하여 패키지 인덱스 파일을 재동기화할 때 사용합니다.

2. 소프트웨어 패키지 업그레이드
  현재 설치된 모든 소프트웨어 패키지를 업그레이드합니다. 다만 업그레이드를 위해 현재 설치된 패키지 중 일부를 제거해야 하거나 다른 패키지를 추가로 설치해야 하는 패키지는 업그레이드를 하지 않습니다.
$ sudo apt-get upgrade
  의존성을 갖추기 위해 소프트웨어 패키지가 추가/삭제되는 것을 개의치 않는다면 아래 명령어를 사용합니다.
$ sudo apt-get dist-upgrade

3. 특정 패키지를 설치하거나 업그레이드
  하나 이상의 패키지를 설치하거나 업그레이드할 때 install 서브 커맨드를 사용합니다. 다수의 패키지를 설치하거나 업그레이드할 땐 대상 패키지를 전부 나열합니다. 또한 와일드카드를 사용할 수도 있습니다.
$ sudo apt-get install 패키지명
$ sudo apt-get install '*검색명*'

4. 업그레이드 없이 설치만 하거나 설치하지 않고 업그레이드만 하기
  '-no-upgrade' 서브 커맨드를 사용하면 이미 설치된 패키지가 업그레이드되는 것을 방지하면서 설치할 수 있으며, '-only-upgrade' 서브 커맨드를 사용하면 반대로 새로운 패키지는 설치하지 않으면서 이미 설치된 패키지를 업그레이드할 수 있습니다.
$ sudo apt-get install 패키지명 --no-upgrade
$ sudo apt-get install 패키지명 --only-upgrade

5. 설정 파일을 보존하면서 패키지 제거
$ sudo apt-get remove 패키지명

6. 패키지 완전히 제거
$ sudo apt-get purge 패키지명

7. 내려받은 패키지 파일(.deb)을 로컬 저장소에서 삭제하여 디스크 공간 확보
  오래되서 지금은 받을 수 없는 패키지를 보관하는 /var/cache/apt/archives/와 /var/cache/apt/archives/partial/ 디렉토리는 건들이지 않습니다.
$ sudo apt-get clean

8. 패키지의 소스 코드만 내려받기
$ sudo apt-get --download-only source 패키지명

9. 패키지의 소스 코드를 내려받아 압축 풀기
$ sudo apt-get source 패키지명

10. 패키지의 소스 코드를 내려받아 압축을 풀고 컴파일
$ sudo apt-get --compile source 패키지명

11. 패키지를 현재 디렉토리에 내려받기만 하고 설치하지 않기
$ sudo apt-get download 패키지명

12. 패키지의 변경사항(Change Log) 확인
$ sudo apt-get changelog 패키지명

13. 패키지 캐시를 업데이트하고 의존성에 문제가 없는지 확인
$ sudo apt-get check

14. 해당 패키지의 소스를 컴파일하기 위해 필요한 패키지 설치
$ sudo apt-get build-dep 패키지명

15. 내려받은 패키지 파일(.deb) 중 이젠 못 받을 정도로 쓸모 없는 것들만 로컬 저장소에서 삭제하여 디스크 공간 확보
  오래되서 지금은 받을 수 없는 패키지를 보관하는 /var/cache/apt/archives/ 디렉토리를 비웁니다.
$ sudo apt-get autoremove 패키지명

16. 과거에 다른 패키지의 의존성 때문에 자동으로 설치했었지만 지금 필요없는 패키지 제거
$ sudo apt-get autoremove
  뒤에 패키지명을 추가로 적으면 remove로 해당 패키지를 제거 후 위 명령어를 사용한 효과가 일어납니다. 그러므로 해당 패키지와 관계된 것들은 물론이고 그와 무관하지만 의존성 문제로 더 이상 필요없게 된 다른 패키지까지 모두 제거됩니다.
2013/07/10 12:50 2013/07/10 12:50
Posted
Filed under 프로그램과 명령어/관리와 유지보수
참조 원문 : Configuring 2 mirrored disks on Ubuntu Linux

  디스크 2개로 미러링을 구성하는 방법을 소개합니다. 데비안 계열의 배포판을 기준으로 설명하고 있지만 패키지 설치를 제외한 대부분의 작업은 배포판과 상관 없이 가능할 것입니다.

  당연히 소프트웨어 RAID이므로 별도의 컨트롤러를 사용할 때와 달리 머신의 자원(CPU, RAM)을 소모하지만 요즘 컴퓨터의 성능을 생각하면 문제가 되진 않습니다. 다만 쓰기 작업 자체는 좀 느려질 수도 있다고 합니다.

필요한 소프트웨어 설치
  리눅스에서 사용하는 표준 RAID 관리 툴은 mdadm이며 최근 배포판이라면 저장소에 있을 겁니다. apt-get으로 설치합니다.
$ sudo apt-get install mdadm
  생각지도 못하게 의존성으로 인해 postfix를 설치하는데 postfix도 설정한다면 RAID에 문제가 있을 때 메일을 보내줘서 유용하지만 설정하지 않아도 상관 없습니다.

디스크 파티셔닝
  이 예제에서는 디스크 전체를 사용하여 RAID를 구성합니다. 부착 후 장치명 확인은 fdisk -l로 확인할 수 있으며 root 권한이 필요하므로 root 계정이 아니라면 sudo가 필요합니다. 구성할 디스크의 이름은 sdb와 sdc인 것으로 가정합니다. 이 둘을 미러링으로 구성하여 /data에 마운트하겠습니다.

  먼저 파티셔닝이 필요합니다. 아래는 sdb를 설정하는 과정입니다.
$ sudo fdisk /dev/sdb
(fdisk 실행 후)
n         ; 새 파티션 생성
p         ; 프라이머리 파티션 생성
1         ; 파티션 번호 선택
엔터       ; 시작 섹터(디폴트로 첫 섹터)
엔터       ; 마지막 섹터(디폴트로 끝 섹터)
t         ; 타입 변경
fd        ; "Linux raid auto detect" 선택
w         ; 변경사항 저장 후 종료
  같은 과정을 /dev/sdc에 대해서도 실시합니다.

RAID 생성
  아래는 RAID 생성 방법과 출력 예입니다.
$ sudo mdadm --create /dev/md0  --level=mirror --raid-devices=2 /dev/sdb1 /dev/sdc1
(부팅 용으로 사용할 때 주의사항 및 최종 확인에서 y 입력)
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
  이것으로 두 리얼 블록 디바이스를 미러 모드로 설정하여 /dev/md0라는 가상 디바이스를 생성했습니다. 이제 RAID 초기화를 설정했으므로 미러가 구성(construction)되며 두 디바이스의 내용이 동기화됩니다.(두 디바이스에 내용이 없으므로 지금 상황에선 중요하지 않습니다.) /proc/mdstat 파일을 확인하면 /dev/dm0 디바이스가 시작됐는지, 미러는 재구성됐는지, 재구성(reconstruction)이 완료되기까지 남은 시간은 얼마인지 알 수 있습니다.
$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdc1[1] sdb1[0]
      52394880 blocks super 1.2 [2/2] [UU]
      [===>.................]  resync = 17.9% (9400064/52394880) finish=3.5min speed=200000K/sec
  재구성(reconstruction)은 안 쓰는 I/O 대역폭을 사용하기 때문에 작업 중 시스템의 I/O 속도에 큰 영향을 끼치지 않습니다. 또한 재구성 작업은 투명성 있게 진행하기 때문에 미러가 재구성 중이더라도 디바이스를 사용할 수 있습니다. 그러므로 포맷하고 마운트해서 사용할 수도 있습니다.

mdadm.conf 파일 생성
  다른 배포판과 마찬가지로 우분투에서는 부팅 과정에서 시스템이 모든 디바이스를 스캔하여 자동으로 RAID를 작동시킵니다. 그래서 사실은 mdadm.conf 파일을 설정할 필요가 없습니다. 하지만 배우는 입장이므로 RAID 설정을 작성해볼 가치가 있습니다. 우분투의 경우 이 파일의 위치는 /etc/mdadm/mdadm.conf이며 설정하기 가장 쉬운 방법은 아래 명령어를 사용한 후 그 결과를 파일에 추가하는 겁니다.
$ sudo mdadm --detail --scan --verbose

리부팅 후 md 디바이스 이름이 변하는 문제
  만약 여기서 리부팅을 하면 md0의 이름에서 뒤의 숫자가 랜덤으로 바뀌고 /dev/md 디렉토리가 생기면서 그 안에 디바이스에 대한 심볼릭 링크가 생깁니다. 아마도 부팅 시 새로운 디바이스를 인식하면서 udev가 맘대로 벌이는 일 같은데 이 현상은 생성한 디바이스에 대한 정보를 initrd(initial ramdisk) 파일에 업데이트하여 막을 수 있으며 방법은 아래와 같습니다.
$ sudo update-initramfs -u
  이때 앞서 설명했던 방법을 통해 mdadm.conf 파일에 생성한 디바이스 정보를 입력하지 않았다면 경고가 나올 수 있는데 실제로 문제가 되진 않습니다.
  그리고 리부팅을 통해 파일 이름이 변하는 것이 나쁘다고 볼 수는 없는 게 /dev/md 디렉토리에 적절한 이름으로 심볼릭 링크를 만들어주기 때문에 경우에 따라선 더 좋을 수도 있습니다. 만약 부팅 이미지를 업데이트하지 않고 리부팅을 해서 디바이스명을 시스템이 알아서 바꾸게 만들기로 했다면 다음 단계에서 /etc/fstab 파일에 엔트리를 등록하기 전에 리붓을 해야 합니다. 그렇지 않으면 부팅 시 md0의 파일명이 변해서 마운트 과정에서 에러가 발생합니다.

RAID 메타디바이스에 파일시스템 생성 및 마운트
  아까 생성했던 디바이스를 원하는 파일시스템으로 포맷합니다.
$ sudo mkfs.ext4 /dev/md0
  마운트포인트를 만들고 마운트를 합니다.
$ sudo mkdir /data
$ sudo mount /dev/md0 /data
  그리고 부팅 시 자동으로 마운트하도록 /etc/fstab에 추가합니다. 앞에서 initrd 파일을 업데이트하지 않고 리부팅해서 디바이스명이 바꼈다면 /dev/md 디렉토리에 생성된 링크 파일명을 /dev/md0 대신 입력합니다.
/dev/md0    /data    ext4    defaults    0    0
2013/07/05 23:37 2013/07/05 23:37