Monthly Archives: March 2011

Linux #19 : Installation Apache + PHP + Subversion

PHP개발을 위해 Apache와 Subversion을 구축 할 때 사용했던 App와 설치 옵션 들입니다.

SQLite
Link : http://www.sqlite.org/
Current Source version : 3.6.15

$ ./configure
$ make;make install

Linux(RHEL)에 설치된 Version을 사용해도 되고 Source Version을 별도로 설치해서 사용해도 됩니다.

BDB (Berkeley DB)
Link : http://www.oracle.com/technetwork/database/berkeleydb/downloads/index.html
Current Source version : 4.7.25

$ cd $BASE/build_unix
$ ../dist/configure --prefix=/usr/local
$ make install

Apr과 Apr-util은 다른 이것 저것들을 해보기 위해서 설치 했습니다. 개인적으로 App들을 개별적인 Directory에 관리하는 걸 선호해서 prefix를 일일이 설정 해 주기도 합니다.

Apr
Link : http://apr.apache.org/
Current Source version : 1.3.5

$ ./configure --prefix=/usr/local/apr

Apr-util
Link : http://apr.apache.org/
Current Source version : 1.3.7

$ ./configure --prefix=/usr/local/apr --with-berkeley-db=/usr/local/lib --with-apr=/usr/local/apr --with-ldap

Apache
Link : http://httpd.apache.org/
Current Source version : 2.2.11

$ ./configure --prefix=/usr/local/apache2 --enable-proxy --enable-proxy-http --enable-proxy-balancer --enable-dav --enable-rewrite --enable-deflate --enable-headers --enable-logio --enable-expires --enable-so --with-berkeley-db=/usr --with-expat=builtin --with-ldap --enable-authnz-ldap=shared --enable-ldap=shared --with-ssl=/usr --enable-ssl --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr

Subversion
Link : http://subversion.tigris.org/
Current Source version : 1.6.3

$ ./configure --with-apxs=/usr/local/apache2/bin/apxs --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr --with-berkeley-db=db.h:/usr/local/include:/usr/local/lib:db-4.7 --with-sqlite=/usr/local/sqlite --with-neon=/usr/local --with-ssl

PHP
Link : http://www.php.net/
Current Source version : 5.2.8

$ ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=/usr/local//mysql --with-gd --with-pear --with-ldap --enable-sysvsem --enable-sysvshm --enable-sysvmsg --with-gettext --with-curl -enable-gd-native-ttf --with-pic --enable-wddx --with-kerberos --with-mcrypt --enable-mbstring --enable-sockets --with-freetype-dir --with-jpeg-dir --with-snmp --enable-ucd-snmp-hack --enable-pcntl --with-zlib

혹 compile이 안되고 아래와 같은 Error가 있을 경우, libtool-ltdl을 설치합니다.

/usr/bin/ld: cannot find -lltdl
collect2: ld returned 1 exit status
$ yum install libtool-ltdl.x86_64 libtool.x86_64 or libtool-ltdl.i386 libtoolxi386

그럼, 이제 PHP와 Subversion을 사용하기 위한 Apache를 설정합니다.

PHP 관련 설정

$ vi /usr/local/apache2/conf/httpd.conf
..
# PHP
Include conf/extra/httpd-php.conf
..
$ vi /usr/local/apache2/conf/extra/https-php.conf
#
# PHP is an HTML-embedded scripting language which attempts to make it
# easy for developers to write dynamically generated webpages.
#
LoadModule php5_module modules/libphp5.so
#
# Cause the PHP interpreter to handle files with a .php extension.
#
AddHandler php5-script .php
AddType text/html .php
#
# Add index.php to the list of files that will be served as directory
# indexes.
#
DirectoryIndex index.php
#
# Uncomment the following line to allow PHP to pretty-print .phps
# files as PHP source code:
#
#AddType application/x-httpd-php-source .phps

Subversion관련 설정

$ vi /usr/local/apache2/conf/httpd.conf
..
# SVN
Include conf/extra/httpd-svn.conf
..
$ vi /usr/local/apache2/conf/extra/https-svn.conf
DAV svn
SVNPath /home/www/svn/project1
# Apache의 authentication을 사용할 경우
AuthType Basic
AuthName "Secure Area"
AuthUserFile /usr/local/apache2/.htaccess
Require valid-user jeff

.htaccess File을 생성할 필요가 있으므로 아래와 같이..

$ /usr/local/apache2/bin/htpasswd -c /usr/local/apache2/.htaccess jeff
New password:

SVN과 관련 된 Repository를 생성 한다. 위 설정대로라면

$ svnadmin create /home/www/svn/project1

이후 WebDAV를 경유해서 Repository에 접근 할 시 아래와 같은 에러가 발생 한다면


Could not open the requested SVN filesystem

$ tail -f /usr/local/apache2/log/error_log
(20014)Internal error: SQLite compiled for 3.6.15, but running with 3.3.7
Could not fetch resource information. [500, #0]
Could not open the requested SVN filesystem [500, #200030]
Could not open the requested SVN filesystem [500, #200030]

이는 PHP를 먼저 설치하고 Subversion을 설치 할 경우 아래와 같은 Error가 나는 경우가 있는데, 이는 /usr/local/apache2/modules/mod_dav_svn.so이 SQLite의 3.6.15가 설치되었음에도 불구하고 3.3.7을 보고 있는 경우로 PHP Module인 libphp5.so가 입력되어 있으면 libphp5.so로 인해 Subversion을 도입시에 같은 오래된 library를 link해 버리는 문제가 있습니다.
따라서 PHP Module을 comment 처리 한 후에 Subversion을 재설치하면 해결이 됩니다.

Linux #18 : NetDump를 통한 Crash Dump

Linux Kernel의 Crash Dump를 취득하기 위해서는 DiskDump, NetDump, Kdump가 있는데, kdump는 RHEL5에서 부터 구현되는 기능으로 여기서는 NetDump에 대해서 다루도록 하겠습니다.

NetDump는 Crash Dump를 Network를 통해서 NetDump Server로 설정된 Server에 저장하게 됩니다. Local Disk에 저장하게 되는 DiskDump의 경우 별도의 File System을 준비 해 줘야 하는 불편함이 있으므로, NetDump가 훨씬 유용하게 사용할 수 있을 듯 합니다.

그럼, 먼저 NetDump Server를 설정하는 방법을 확인 하도록 하겠습니다.

NetDump Server가 설치되어 있는지를 먼저 확인 합니다.

# rpm -q netdump-server
netdump-server-0.7.16-10

설치되어 있지 않다면, Yum이나 Up2date 또는 RPM을 직접 받아서 설치를 합니다.
설치 후 Reboot시 항상 자동으로 기동이 되도록 chkconfig를 통해서 등록을 합니다.

# chkconfig netdump-server on
# service netdump-server start
or
# /etc/init.d/netdump-server start

혹시 netdump 계정에 대한 Password가 설정되어 있지 않다면 설정을 해 둡니다.

NetDump Server에서 Crash Dump는 /var/crash에 저장이 됩니다.

그럼, NetDump Client를 각 서버에 설치를 하고 Server와 통신할 수 있도록 설정을 합니다.
역시 Client가 설치되어 있는지를 먼저 확인하고,

# rpm -q netdump
netdump-0.7.16-2

/etc/sysconfig/netdump를 변경 해 줍니다. 여러 설정들이 있지만 여기서는 NetDump Server의 IP정보 입력과 인증을 위한 DSA 공개키를 등록 하거나, Secure한 Network 상에 모든 서버들이 존재한다면 DSA 공개키 등록없이 사용하는 설정을 공유 하도록 하겠습니다.

NetDump Server의 IP 정보 입력

# vi /etc/sysconfig/netdump
..
NETDUMPADDR=10.37.100.1

DSA 공개키의 등록

# service netdump propagate
or
# /etc/init.d/netdump propagate
[email protected]'s password:

DSA 공개키 등록없이 접근 가능하게 하는 방법

Cleint에서
# vi /etc/sysconfig/netdump
..
NETDUMPKEYEXCHANGE=none
..

Server에서
# vi /etc/netdump.conf
secure=0

후 각각 Restart

그리고, NetDump Server와 동일하게 Client도 기동을 해 줍니다.

# chkconfig netdump on
# service netdump start
or
# /etc/init.d/netdump start
initializing netdump [ OK ]
initializing netconsole [ OK ]

Message from XXXXX@XXXXXX at Mon Mar 21 15:17:24 2011 ...
XXXXXXX kernel: [...network console startup...]

Dump가 시작이 되면, 위에서 설명한 것 처럼 NetDump Server의 /var/crash/YYYY-MM-DD-hh:mm과 같이 Directory가 만들어지고 그 안에 vmcore-incomplete가 작성되고, Dump가 완성되면 vmcore file이 생성됩니다.

# ll 10.37.100.31-2011-03-16-22\:28/
total 15351800
-rw------- 1 netdump netdump 10075 Mar 19 13:33 log
-rw------- 1 netdump netdump 9395240960 Mar 19 13:29 vmcore
-rw------- 1 netdump netdump 9395240960 Mar 19 13:33 vmcore-incomplete

Crash Dump는 문제가 발생하였을 시에 발생하게 됨으로 netdump start 이후에는 vmcore, vmcore-incomplete file은 없고, log에
[…network console startup…] 라는 Message를 확인 할 수 있을 것입니다.

이걸로 NetDump로 Crash Dump를 취득가능하게 되고, 취득 된 Crash Dump는 이후에 Crash와 Kernel-debuginfo RPM을 설치하여 분석 가능하게 됩니다.

Linux #17 : OpenLDAP Installation Guide

OpenLDAP은 Lightweight Directory Access Protocal로 Windows의 Active Directory와 같은 Linux의 인증관리 시스템입니다. 이 시스템을 이용하여 Unix Based Authentication과는 별도록 Account를 통합 관리 할 수 있습니다.

OpenLDAP 공식 Page : http://www.openldap.org

2011년 현재(3월 기준) 2.4.23의 stable version을 받을 수 있고, OpenLDAP을 설치하기 위해서는 아래와 같은 Application을 추가로 설치를 해 주시면 됩니다.
필자는 Source Version을 통해서 설치를 하였기 때문에 RPM을 이용한 설치 방법에 대해서는 기술하지 않도록 하겠습니다.

OpenLDAP 설치 전 필요한 Source들은 Berkeley DB, Crypt Library, GNUTLS Library, OpenSSL입니다. 현재 Version은 각기 다를 수 있고 System상에 설치된 Version들을 그대로 활용 할 수도 있습니다.

Install Berkeley DB
Berkely DB for Oracle : http://www.oracle.com/technology/products/berkeley-db/db/index.html

Installed Version : db-4.6.21
# cd build_unix/
# ../dist/configure --prefix=/usr
# make;make install

Install CRYPT Library
libcrypt : ftp://ftp.gnupg.org/gcrypt/libgcrypt/

Installed Version : libcrypt-1.4.4
# ./configure
# make;make install

Install GNUTLS
gnutls : http://www.gnu.org/software/gnutls/

Installed Version : gnutls-2.6.3
# ./configure
# make; make install

Install openssl
openssl : http://www.openssl.org

Installed Version : openssl-0.9.8.h
# ./configure --prefix=/usr shared
# make;make install

Install openLDAP Server

Installed Version : openldap-2.4.19
# ./configure --prefix=/usr/local/openldap --sysconfdir=/etc --localstatedir=/var --without-kerberos --without-cyrus-sasl --with-tls=openssl --enable-syslog --disable-ipv6 --enable-lastmod --enable-crypt --enable-ppolicy --enable-syncrepl
# make depend;make
# make install

현재 안정적인 Version인 2.4.23에 대해서도 install을 진행 해 보았고, 문제없이 설치되는 것을 확인 했습니다.
설치 후 OpenLDAP을 위한 Group과 User Account를 만들어 주고 관련 작업들을 진행합니다.

# /usr/sbin/groupadd -g 55 ldap
# /usr/sbin/useradd -u 55 -g 55 -d /usr/local/openldap -M -s /bin/false -c "openLDAP User" ldap
# mkdir /var/run/openldap;chown ldap:ldap /var/run/openldap
# mkdir /var/log/ldap:chown ldap:ldap /var/log/ldap
# mv /var/openldap-data /var/lib/ldap
# mkdir /var/lib/ldap/[Domain Name]
# cp /var/lib/ldap/DB_CONFIG.example /var/lib/ldap/[Domain Name]/DB_CONFIG
# chown -R ldap:ldap /var/lib/ldap
# chown -R ldap:ldap /etc/openldap

OpenLDAP Server가 설치 되었습니다. 다음 내용은 Linux #18 : OpenLDAP Configuration Guide 입니다. 빠른 시일 내에 올리도록 하겠습니다.

Linux #16 : Static Route Configuration

Linux에서 Static Route를 설정은 “route”를 통해서 가능하다. 또, 아래와 같이 routing 된 Network의 정보를 확인 할 수 있다.

$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.37.114.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.37.0.0 10.37.114.1 255.255.0.0 UG 0 0 0 eth0
10.42.0.0 10.37.114.1 255.255.0.0 UG 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
0.0.0.0 10.37.114.1 0.0.0.0 UG 0 0 0 eth0

기본적인 사용방법은

route add -net [IP Addess Segment] netmask [NetMask Information] gw [Gateway Information]

$ route add -net 10.44.0.0 netmask 255.255.0.0 gw 10.37.114.1

$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.37.114.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.37.0.0 10.37.114.1 255.255.0.0 UG 0 0 0 eth0
10.42.0.0 10.37.114.1 255.255.0.0 UG 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
10.44.0.0 10.37.114.1 255.255.0.0 UG 0 0 0 eth0
0.0.0.0 10.37.114.1 0.0.0.0 UG 0 0 0 eth0

add option을 통해서 10.44.0.0/255.255.0.0가 Gateway 10.37.114.1로 추가 된 것을 확인 할 수 있다.
삭제를 할 경우는 add 대신 del을 사용하면 된다.

route del -net [IP Addess Segment] netmask [NetMask Information] gw [Gateway Information]

$ route del -net 10.44.0.0 netmask 255.255.0.0 gw 10.37.114.1

그런데, 여기서 Server가 부팅이 될 때 자동으로 Static route를 추가한다고 생각해 보자. 그럼, 보통 /etc/rc.local 과 같은 기동시 자동으로 동작하도록 설정을 하거나 하는데, 이럴 경우는 “/etc/init.d/network restart”에 의해 Network가 재기동 될 때는 개별적으로 추가를 해 줘야 한다.
이런 경우 “/etc/sysconfig/static-routes”라는 file을 생성하여 아래와 같이 정보를 입력 해 주시면 Network만 재기동 할 시에도 자동으로 Static Route가 설정 되게 된다. 입력 방법은 아래와 같다.

$ more /etc/sysconfig/static-routes
any net 10.37.0.0/16 gw 10.37.114.1
any net 10.42.0.0/16 gw 10.37.114.1

이 방법이 유용한 것은 Rebooting시에 Static Route을 설정 하고, Online 상태에서 Network 재기동 했을 시 혹시 Static Route를 추가 하는 작업을 잊어 버렸을 때 발생 할 수 있는 문제점을 없애주는 것이다. 인간은 망각의 동물이라.. 필자도 가끔 잊어 버리곤 해서 뒤늦게 문제점을 발견하고 추가를 했던 경우가 간혹 있었다.
또한, 관리하는 서버가 많다보니 매번 똑같은 걸 입력하기 싫어서 아래와 같이 Scripts를 만들었다.

$ more config-static-routes
#!/bin/sh
GATEWAY=`/sbin/ifconfig eth0 | grep "inet addr:" | awk '{print $2};' | awk -F ":" '{print $2};' | awk -F "." '{print $1"."$2"."$3"."1};'`
Printmsg "INFO" "Add route : net 10.37.0.16 gw $GATEWAY"
echo "any net 10.37.0.0/16 gw $GATEWAY" > /etc/sysconfig/static-routes
Printmsg "INFO" "Add route : net 10.42.0.16 gw $GATEWAY"
echo "any net 10.42.0.0/16 gw $GATEWAY" >> /etc/sysconfig/static-routes

간단한거지만, 매번 같은 서버를 구축 할 때 유용하게 사용하고 있다.

Linux #15 : LVM에서 Logical Volume의 Resizing

지난 시간에 LVM에서의 Logical Volume 생성에 대해서 배웠는데 LVM에서 생성된 File System은 VG의 Size 한도 안에서 확장이 가능하고, File System에 따라서 별도의 Format 작업이 없이 확장 가능하기도 하다. 필자는 IBM AIX를 다룰 때 JFS2를 사용 했었는데, 이 Volume이 Onlice상에서 확장 가능한 Volume이었고, Oracle에서 Raw Device를 사용할 경우 해당 Raw Device에 대해 LVM으로 구성하여 복잡한 작업없이 Logical Volume을 확장 했던 적이 있었다.

Logical Volume의 확장은 정상적으로 동작 했을 경우에는 문제가 되지 않지만, 문제가 발생했을 경우에는 모든 Data를 손실할 경우도 있으므로 작업 전에 반드시 Data를 Backup 할 것을 권유하고 싶다.

LVM의 Logical Volume을 확장하기 위해서 “lvextend”라는 command가 사용된다.
지난 시간에 작성한 Logical Volume인 “/dev/vg001/MyTechies”를 참조 해 보자.

$ lvdisplay /dev/vg001/MyTechies
--- Logical volume ---
LV Name /dev/vg001/MyTechies
VG Name vg001
LV UUID j7037M-1uii-KO6a-ov6t-ub6C-Pm42-DPeGEj
LV Write Access read/write
LV Status available
# open 0
LV Size 40.00 GB
Current LE 1280
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0

아래와 같이 확장시킬 File System(/dev/vg001/MyTechies)은 Online 상태에 있으며, /home/lvm2test에 mount 되어 있다.


$ mount
/dev/sda2 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda6 on /home type ext3 (rw,nodev)
/dev/sda1 on /boot type ext3 (rw,noexec,nosuid,nodev)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/mapper/vg001-MyTechies on /home/lvm2test type ext3 (rw)

$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 31G 3.4G 26G 12% /
/dev/sda6 43G 889M 40G 3% /home
/dev/sda1 99M 17M 77M 18% /boot
tmpfs 1006M 0 1006M 0% /dev/shm
/dev/mapper/vg001-MyTechies
40G 177M 38G 1% /home/lvm2test

lvextend를 통해서 10G를 확장 시켜 보면


$ lvextend -L +10G /dev/vg001/MyTechies
Extending logical volume MyTechies to 50.00 GB
Logical volume MyTechies successfully resized

정상적으로 확장이 되었다는 Message를 확인 할 수 있고, “lvdisplay”로 확인을 하면,


$ lvdisplay /dev/vg001/MyTechies
--- Logical volume ---
LV Name /dev/vg001/MyTechies
VG Name vg001
LV UUID j7037M-1uii-KO6a-ov6t-ub6C-Pm42-DPeGEj
LV Write Access read/write
LV Status available
# open 1
LV Size 50.00 GB
Current LE 1600
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0

LV Size가 40.00 GB에서 50.00 GB로 확장 된 것을 확인 할 수 있다. 그리고, “resize2fs”를 통해서 File System을 확장 해 주면 된다.
여기서 File System을 축소 할 경우에는 해당 File System의 Unmount가 반드시 필요하지만, 확장시에는 Online상태에서 Resize가 가능하다.

$ resize2fs /dev/vg001/MyTechies
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/vg001/MyTechies is mounted on /home/lvm2test; on-line resizing required
Performing an on-line resize of /dev/vg001/MyTechies to 13107200 (4k) blocks.
The filesystem on /dev/vg001/MyTechies is now 13107200 blocks long.

$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 31G 3.4G 26G 12% /
/dev/sda6 43G 889M 40G 3% /home
/dev/sda1 99M 17M 77M 18% /boot
tmpfs 1006M 0 1006M 0% /dev/shm
/dev/mapper/vg001-MyTechies
50G 180M 47G 1% /home/lvm2test

또한 정상적으로 확장 된 것을 확인 할 수 있다.
그럼, 이제 축소를 시켜보자. File System의 축소는 위에서 이야기 했던 것 처럼 먼저 Umount가 선행 되어야 한다.

$ umount /home/lvm2test/

또한, 축소를 할 경우에는 File System의 Size를 변경 시킨 후 행할 필요가 있다. 이는 Defragment와 동일한 개념으로 생각하면 된다.
먼저 “e2fsck”를 이용하여 File System의 정합성을 체크하고, “resize2fs”로 Size를 축소하면 된다.

$ e2fsck -f /dev/vg001/MyTechies
e2fsck 1.39 (29-May-2006)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/vg001/MyTechies: 12/6553600 files (8.3% non-contiguous), 251734/13107200 blocks

$ resize2fs /dev/vg001/MyTechies 40G => Size를 40G로 축소
resize2fs 1.39 (29-May-2006)
Resizing the filesystem on /dev/vg001/MyTechies to 10485760 (4k) blocks.
The filesystem on /dev/vg001/MyTechies is now 10485760 blocks long.

그런 다음 resize2fs를 통해 축소된 Size와 동일하게 Logical Volume Size도 축소를 시켜주면 된다.
이때 “lvreduce” command가 사용된다.

$ lvreduce -L 40G /dev/vg001/MyTechies
WARNING: Reducing active logical volume to 40.00 GB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce MyTechies? [y/n]: y => Y를 입력
Reducing logical volume MyTechies to 40.00 GB
Logical volume MyTechies successfully resized

$ lvdisplay /dev/vg001/MyTechies
--- Logical volume ---
LV Name /dev/vg001/MyTechies
VG Name vg001
LV UUID 4i5MxQ-qxNA-JzR1-HC3V-I041-hwvz-Q31rva
LV Write Access read/write
LV Status available
# open 0
LV Size 40.00 GB
Current LE 1280
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0

축소 작업에서는 확장할 때 보다 문제가 발생할 가능성이 많으므로, 중요한 Data는 반드시 Backup 먼저 한 후 작업을 하길 바랍니다.

Linux #14 : LVM에서 Logical Volume 생성하기

지난 시간에 LVM의 구성확인을 위한 Command에 대해서 확인을 했고, 이번엔 Logical Volume을 생성하기위한 방법에 대해서 설명하도록 하겠습니다.

LVM은 지난시간에 설명 한 것과 같이 PV(Physical Volume), VG(Volume Group), LV(Logical Volume) 순으로 구성된다고 했는데, LV를 생성하기 위해선 먼저 PV를 만들고 VG를 구성한 뒤 VG 위에 LV를 생성하면 됩니다.

일단 PV를 구성하기 위해서는 PV를 구성하기 위한 Device를 확인해야 하는데 이때는 Linux File System에 대한 지식이 좀 필요하겠네요. SCSI Device를 LVM 용도로 추가 하였고, /dev/sdb Device라면 “fdisk”와 같은 명령어로 확인이 가능하겠죠.

$ fdisk -l /dev/sdb
Disk /dev/sdb: 85.8 GB, 85899345920 bytes
255 heads, 63 sectors/track, 10443 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdb doesn't contain a valid partition table

PV를 생성하기 위해서는 “pvcreate” 명령어를 사용하면 된다.

$ pvcreate -v /dev/sdb
Set up physical volume for "/dev/sdb" with 167772160 available sectors
Zeroing start of device /dev/sdb
Physical volume "/dev/sdb" successfully created

위와 같이 PV 생성하였고, 생성 된 PV는 “pvscan”으로 확인 가능합니다.

$ pvscan
PV /dev/sdb lvm2 [80.00 GB]
Total: 1 [80.00 GB] / in use: 0 [0 ] / in no VG: 1 [80.00 GB]

그럼 이제 VG 생성이 가능하게 되는데 “vgcreate”를 사용하여 생성하면 됩니다.

vgcreate [VGNAME] [DEVICE]
$ vgcreate -v vg001 /dev/sdb
Wiping cache of LVM-capable devices
Adding physical volume '/dev/sdb' to volume group 'vg001'
Archiving volume group "vg001" metadata (seqno 0).
Creating volume group backup "/etc/lvm/backup/vg001" (seqno 1).
Volume group "vg001" successfully created

또, 생성 된 VG에 대해서 “vgdisplay”로 확인 하면,

$ vgdisplay
--- Volume group ---
VG Name vg001
System ID
Format lvm2
Metadata Areas 1
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 1
Act PV 1
VG Size 80.00 GB
PE Size 4.00 MB
Total PE 20479
Alloc PE / Size 0 / 0
Free PE / Size 20479 / 80.00 GB
VG UUID C8n1rc-3p2U-0TD2-NS0N-XtOJ-zgKs-clDWPy

여기서 확인 해 볼 필요가 있는 건 지난 시간에 설명을 했던 PE (Physical Extent)에 관한 것인데, LV를 생성할 때 할당되는 Block에 관한 것으로 VG에서 PE Size를 설정하는 것이 가능하기 때문이다. 1개의 LV에 할당 가능한 최대의 PE수는 65535 Block이기 때문에 PE Size의 크기에 따라 LV의 최대 Size가 변하게 된다. 그러나, 너무 크다면 LV의 Size의 조절범위가 커지기 때문에 불필요한 용량이 늘어날 수도 있기 때문에 주의가 필요하다. Default PE Size는 4MB(4096KB)로 아래와 같은 Option을 추가하는 것으로 PE Size의 변경이 가능하다. 일단 VG를 만든 이후에는 변경을 못하게 됨으로 VG 생성 전에 적절한 Sizing을 통해 PE Size를 결정 해 줄 필요가 있다.

$ vgcreate -v -s32m vg001 /dev/sdb
Wiping cache of LVM-capable devices
Adding physical volume '/dev/sdb' to volume group 'vg001'
Archiving volume group "vg001" metadata (seqno 0).
Creating volume group backup "/etc/lvm/backup/vg001" (seqno 1).
Volume group "vg001" successfully created

$ vgdisplay
--- Volume group ---
VG Name vg001
System ID
Format lvm2
Metadata Areas 1
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 1
Act PV 1
VG Size 79.97 GB
PE Size 32.00 MB
Total PE 2559
Alloc PE / Size 0 / 0
Free PE / Size 2559 / 79.97 GB
VG UUID ZVQ1xJ-8vdF-5C2C-fBgS-fX3h-8yZG-r5dcjM

4MB 일 때와 32MB 일때의 PE 갯수가 변한 건 확일 할 수 있죠, 32MB일때는 VG Size가 79.97 GB인것도 다르죠.
VG까지 생성 했다면 이제 드디어 LV의 생성이 가능하게 됩니다. LV의 생성은 “lvcreate”를 이용하면 되고

lvcreate -n[LV NAME] -L[LV SIze] [VG]
$ lvcreate -v -nMyTechies -L40G vg001
Setting logging type to disk
Finding volume group "vg001"
Archiving volume group "vg001" metadata (seqno 3).
Creating logical volume MyTechies
Creating volume group backup "/etc/lvm/backup/vg001" (seqno 4).
Found volume group "vg001"
Creating vg001-MyTechies
Loading vg001-MyTechies table
Resuming vg001-MyTechies (253:0)
Clearing start of logical volume "MyTechies"
Creating volume group backup "/etc/lvm/backup/vg001" (seqno 4).
Logical volume "MyTechies" created

그리고, “lvdisplay”로 확인 가능합니다.

$ lvdisplay
--- Logical volume ---
LV Name /dev/vg001/MyTechies
VG Name vg001
LV UUID j7037M-1uii-KO6a-ov6t-ub6C-Pm42-DPeGEj
LV Write Access read/write
LV Status available
# open 0
LV Size 40.00 GB
Current LE 1280
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0

LV를 생성하게 되면 LV에 대한 Device명은 /dev/[VG Name]/[LV Name]이 됩니다. 위에서 보면 /dev/vg001/MyTechies를 확인 할 수 있습니다. 그리고, “vgdisplay” 통해 확인 하면,

$ vgdisplay
--- Volume group ---
VG Name vg001
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 79.97 GB
PE Size 32.00 MB
Total PE 2559
Alloc PE / Size 1280 / 40.00 GB
Free PE / Size 1279 / 39.97 GB
VG UUID ZVQ1xJ-8vdF-5C2C-fBgS-fX3h-8yZG-r5dcjM

생성 된 LV 만큼, LV에 대한 정보면 Allocated 된 Size 정보, 남은 용량등을 확인 할 수 있습니다. 이 이후에는 LV를 format하고 mount를 하여 사용하면 되겠죠. Format은 mkfs, mkfs.ext3 Filesystem에 따라 해 주시면 되고,

$ mkfs.ext3 /dev/vg001/MyTechies
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
5242880 inodes, 10485760 blocks
524288 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
320 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 28 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

Mount를 작업을 거치면 사용가능하게 됩니다.

다음 시간에는 LVM에서 생성된 LV의 ReSizing에 대해서 설명을 하도록 하겠습니다.

Linux #13 : LVM (Logical Volume Manager)의 구성 확인

Logical Volume Manager인 LVM을 통해서 Volume을 생성하고, 확인 하는 방법에 대해서 정리 해 보려고 한다.
LVM은 여러개의 Partition을 한 개의 Disk(File system)으로 사용하기 위한 Disk 관리 기능이다. LVM을 사용하면 아래와 같은 장점이 있다.

1. 여러개의 Disk를 1개의 File System로 구성 가능
2. Partition Size의 변경이 용이
3. Snapshot과 같은 기능의 사용이 가능

우선 Physical Volume(PV) 정보를 확인 할 필요가 있고, 아래와 같이 “pvdisplay”로 확인 가능하다.

$ pvdisplay
--- Physical volume ---
PV Name /dev/sda2
VG Name VolGroup00
PV Size 111.69 GB / not usable 1018.00 KB
Allocatable yes (but full)
PE Size (KByte) 32768
Total PE 3574
Free PE 0
Allocated PE 3574
PV UUID dz7rf6-xEaU-WPEY-RRbg-7Gd5-CbJA-L2NFQy

Physical Volume은 Physical Device를 의미하며 LVM의 관리정보가 추가 된 Partition을 표시 해 주고 있다.
PE Size, Total PE, Free PE, Allocated PE, PE라는 용어가 있는데, 이는 Physical Extent로 저장영역의 최소단위이다.
이후에 만들어지게 될 Logical Volume은 이 PE를 필요한 만큼 배분하여 가상적인 Partition을 작성하는 걸 의미하고, 위 정보에 의하며 PE Size는 32MBytes로, 총수는 3574개이고, Free는 없으며, 모든 PE가 사용되고 있다고 볼 수 있다.

Physical Volume의 다음 단계는 VG(Volume Group)가 되는데, VG는 Physical Volume을 구성하는 가상의 저장장치를 의미한다. Volume Group을 생성하는 것으로 여러개의 Physical Volume을 한개의 큰 File system(Disk)로 System 에서 인식하는게 가능하게 된다. Volume Group에 대한 정보는 “vgdisplay”를 통해서 확인 가능하다.

$ vgdisplay
--- Volume group ---
VG Name VolGroup00
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 3
Open LV 3
Max PV 0
Cur PV 1
Act PV 1
VG Size 111.69 GB
PE Size 32.00 MB
Total PE 3574
Alloc PE / Size 3574 / 111.69 GB
Free PE / Size 0 / 0
VG UUID qKtkYK-FaRH-zUfi-0ECP-A5J7-f1W4-7ffYSa

Volume Group이 구성된 이후엔 마지막 단계인 Logical Volume(LV)이 구성되는데, Logical Volume은 Volume Group상에서 생성된 가상 Partition이고, 이는 “lvdisplay”로 확인 가능하다.

$ lvdisplay
--- Logical volume ---
LV Name /dev/VolGroup00/LogVol02
VG Name VolGroup00
LV UUID S6gx2z-GcWu-9hmx-kHK3-YcpT-RsSy-a9yzcJ
LV Write Access read/write
LV Status available
# open 1
LV Size 107.69 GB
Current LE 3446
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:3

--- Logical volume ---
LV Name /dev/VolGroup00/LogVol01
VG Name VolGroup00
LV UUID fPqNNh-hJTA-N6cU-Ndzh-CRMP-rylz-hK56ay
LV Write Access read/write
LV Status available
# open 1
LV Size 2.00 GB
Current LE 64
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:4

--- Logical volume ---
LV Name /dev/VolGroup00/LogVol00
VG Name VolGroup00
LV UUID W00Fr8-AaxC-nloz-nXmO-j1Ma-qaRY-yOmuQJ
LV Write Access read/write
LV Status available
# open 1
LV Size 2.00 GB
Current LE 64
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:5

따라서, 정리를 해 보면 어떤 Device가 추가 되면 Physical Device에서 Physical Volume을 생성하고, PV에서 Volume Group을 할당하고, Volume Group상에서 Logical Volume이 존재하게 된다는 것이고, 이는 Physical Device -> PV Create -> VG Create -> LV Create를 통해서 순차적으로 생성가능하게 된다.

LVM에서의 File System 생성은 Linux #14 : LVM에서 Logical Volume 생성하기에서 설명하도록 하겠다.

Linux #12 : Default Gateway Configuration

Default Gateway 설정은 route command를 통해서 가능합니다.
현재의 설정을 아래와 같이 확인 가능합니다.

$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.37.114.0 * 255.255.255.0 U 0 0 0 eth0
172.16.111.0 10.37.114.1 255.255.255.0 UG 0 0 0 eth0
10.37.0.0 10.37.114.1 255.255.0.0 UG 0 0 0 eth0
10.42.0.0 10.37.114.1 255.255.0.0 UG 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
default 10.37.114.1 0.0.0.0 UG 0 0 0 eth0

Default Gateway의 실시간 변경을 위해서는 현재 설정된 Default Gateway를 일단 삭제 할 필요가 있습니다.
따라서 아래와 같이 실행을 해 준 다음 설정을 행하면 됩니다.

$ route delete default
$ route add default gw 10.37.114.1

Redhat 계열의 Linux의 경우 아래 File을 수정함으로서 Reboot시 자동으로 적용되게 할 수 있습니다.

$ vi /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=TESTSERVER
GATEWAY=10.37.114.1

설정이 완료 된 Default를 Network Restart를 통해 반영 할 수 있습니다.

$ /etc/init.d/network restart &

&를 추가하여 Background로 동작하게 하면 보다 안전하게 Restart가 가능합니다.