소개

몇몇 리소스들, 파일 시스템이나 raw 디바이스, 테입 디바이스, IP 주소 같은 리소스들을 글로벌 존에서 논-글로벌 존으로 지정하는 것은 일반적으로 논-글로벌 존의 재부팅을 요구 합니다. 실제 프로덕션 환경에서 불운하지만 리소스의 지정 후에는 재부팅이 필요 하고 그러므로 솔라리스 관리자는 존을 백업하기 전에 데이타베이스 관리자와 백업 관리자의 승낙을 기다려야 합니다. 종종 재부팅의 기회가 주말의 마지막 몇분 밖에 주어지지 않는 경우도 있습니다.

이러한 일을 피하기 위해서, 적어도 파일 시스템과 raw 디바이스의 경우, 존의 설정을 먼저 조정한 다음에 관리 명령을 아래와 같이 제안드리는 순서대로 실행함으로써 가능합니다.

여기서 알려드리는 방법은 오직 파일 시스템의 관리 명령들이 글로벌 존에서 이루어지는 경우에만 적용 됩니다. 이러한 방법은 SPARC 용 솔라리스10의 어떠한 버전에서도 혹은 Sparse Zone 이나 Whole Root Zone 에서도 사용이 가능하지만 x86 버전과 Branded 존에서는 아직 테스트 되지 않았습니다.

여기서 고려되는 파일 시스템의 타입은 UFS, ZFS 그리고 LOFS (Loopback File System) 입니다. ZFS 의 경우 파일 시스템은 반드시 레가시 마운트 포인트로 지정되어야 하는데, 이것은 즉 기본적으로 어떠한 마운트 포인트도 갖지 않는 것을 의미 합니다. raw 디바이스의 경우 솔라리스 볼륨 메니저에 의해 생성된 것들만 고려 됩니다. 그러나 여기서 사용된 개념을 다른 솔라리스 디바이스에서도 이용할 수 있을 것입니다.


파일 시스템

먼저 우리는 파일 시스템과 디렉토리를 글로벌 존에 생성합니다:

# newfs /dev/md/rdsk/d35
# zpool create my_zpool c0t2d0
# zfs create my_zpool/my_zfs
# zfs set mountpoint=legacy my_zpool/my_zfs
# mkdir /my_lofs

그 다음 my_zone 이라고 불리는 논-글로벌 존을 설정합니다:

# zonecfg -z my_zone
zonecfg:my_zone> add fs
zonecfg:my_zone:fs> set dir=/my_ufs
zonecfg:my_zone:fs> set special=/dev/md/dsk/d35
zonecfg:my_zone:fs> set raw=/dev/md/rdsk/d35
zonecfg:my_zone:fs> set type=ufs
zonecfg:my_zone:fs> end
zonecfg:my_zone> add fs
zonecfg:my_zone:fs> set dir=/my_zfs
zonecfg:my_zone:fs> set special=my_zpool/my_zfs
zonecfg:my_zone:fs> set type=zfs
zonecfg:my_zone:fs> end
zonecfg:my_zone> add fs
zonecfg:my_zone:fs> set dir=/my_lofs
zonecfg:my_zone:fs> set special=/my_lofs
zonecfg:my_zone:fs> set type=lofs
zonecfg:my_zone:fs> end
zonecfg:my_zone> commit
zonecfg:my_zone> exit
#

부팅시에 논-글로벌 존의 파일 시스템을 마운트 파기 위해 다음의 작업을 수행합니다:

# zoneadm -z my_zone reboot

존의 파일시스템을 마운트 하려면 존이 온라인 상태이여야 합니다. 예를 들어 다음의 경우 /my_zone 이 zone 경로 입니다:

# mkdir /my_zone/root/my_ufs
# mkdir /my_zone/root/my_zfs
# mkdir /my_zone/root/my_lofs
# mount -F ufs /dev/md/dsk/d35 /my_zone/root/my_ufs
# mount -F zfs my_zpool/my_zfs /my_zone/root/my_zfs
# mount -F lofs /my_lofs /my_zone/root/my_lofs

참고로 마운트 포인트 디렉토리들이 반드시 존에 이미 생성이 되어 있어야 합니다.

이제 논-글로벌 존에서 df 커맨드의 출력값은 다음과 같을 것입니다:

# zlogin -l root my_zone df -h
Filesystem        size   used  avail capacity  Mounted on
/                 6.9G   5.5G   1.4G    81%    /
/dev              6.9G   5.5G   1.4G    81%    /dev
proc                0K     0K     0K     0%    /proc
ctfs                0K     0K     0K     0%    /system/contract
swap               13G   272K    13G     1%    /etc/svc/volatile
mnttab              0K     0K     0K     0%    /etc/mnttab
fd                  0K     0K     0K     0%    /dev/fd
swap               13G    16K    13G     1%    /tmp
swap               13G    32K    13G     1%    /var/run
/dev/md/dsk/d35   6.9G   5.5G   1.4G    81%    /my_ufs
my_zpool/my_zfs   7.9G   2.0G   5.8G    27%    /my_zfs
/my_lofs           22G    15G   6,1G    72%    /my_lofs

글로벌 존에서 동일한 병력의 출력 결과는 좀 다를 것입니다:

# df -h
Filesystem        size   used  avail capacity  Mounted on
/dev/md/dsk/d0     22G    15G   6,1G    72%    /
/devices            0K     0K     0K     0%    /devices
ctfs                0K     0K     0K     0%    /system/contract
proc                0K     0K     0K     0%    /proc
mnttab              0K     0K     0K     0%    /etc/mnttab
swap               13G   1,1M    13G     1%    /etc/svc/volatile
objfs               0K     0K     0K     0%    /system/object
/platform/sun4u-us3/lib/libc_psr/libc_psr_hwcap1.so.1
                   22G    15G   6,1G    72%
                   /platform/sun4u-us3/lib/libc_psr.so.1
/platform/sun4u-us3/lib/sparcv9/libc_psr/libc_psr_hwcap1.so.1
                   22G    15G   6,1G    72%
                   /platform/sun4u-us3/lib/sparcv9/libc_psr.so.1
fd                  0K     0K     0K     0%    /dev/fd
swap               13G    19M    13G     1%    /tmp
swap               13G    80K    13G     1%    /var/run
/dev/md/dsk/d3     20G   6.8G    13G    35%    /my_zone
/dev/md/dsk/d35   6.9G   5.5G   1.4G    81%    /my_zone/root/my_ufs
my_zpool/my_zfs   7.9G   2.0G   5.8G    27%    /my_zone/root/my_zfs

대신 my_zone 의 마운트 커맨드는 다음과 같이 나타날 것입니다. 글로벌 존, 논-글로벌 존 모두 출력되고 결과의 일부를 생략하였습니다:

# zlogin -l root my_zone mount | awk '{print $1, $2, $3, $4}'
/ on / read/write/setuid/devices/intr/largefiles/logging/xattr/
onerror=panic/dev=154001f
/dev on /dev read/write/setuid/devices/zonedevfs/dev=4e0000e
/proc on proc read/write/setuid/nodevices/zone=identity/dev=4bc000f
/system/contract on ctfs read/write/setuid/nodevices/zone=identity/
dev=4b8000f
/etc/svc/volatile on swap read/write/setuid/nodevices/xattr/zone=
identity/dev=4c4002b
/etc/mnttab on mnttab read/write/setuid/nodevices/zone=identity/
dev=4c0000f
/dev/fd on fd read/write/setuid/nodevices/zone=identity/dev=4e4000f
/tmp on swap read/write/setuid/nodevices/xattr/zone=identity/dev=
4c4002c
/var/run on swap read/write/setuid/nodevices/xattr/zone=identity/
dev=4c4002d
/my_ufs on /my_ufs read/write/setuid/devices/intr/largefiles/logging/
xattr/onerror=panic/dev=1540048
/my_zfs on my_zpool/my_zfs read/write/setuid/devices/exec/xattr/
atime/dev=401000b
/my_lofs on /my_lofs read/write/setuid/devices/dev=1540000
#
# mount | grep my_zone | awk '{print $1, $2, $3, $4}'
/my_zone/root/dev on /my_zone/dev read/write/setuid/devices/
zonedevfs/dev=4e0000e
/my_zone/root/proc on proc read/write/setuid/nodevices/zone=
identity/dev=4bc000f
/my_zone/root/system/contract on ctfs read/write/setuid/nodevices/
zone=identity/dev=4b8000f
/my_zone/root/etc/svc/volatile on swap read/write/setuid/nodevices/
xattr/zone=identity/dev=4c4002b
/my_zone/root/etc/mnttab on mnttab read/write/setuid/nodevices/
zone=identity/dev=4c0000f
/my_zone/root/dev/fd on fd read/write/setuid/nodevices/zone=
identity/dev=4e4000f
/my_zone/root/tmp on swap read/write/setuid/nodevices/xattr/
zone=identity/dev=4c4002c
/my_zone/root/var/run on swap read/write/setuid/nodevices/
xattr/zone=identity/dev=4c4002d
/my_zone/root/my_ufs on /dev/md/dsk/d35 read/write/setuid/
devices/intr/largefiles/logging/xattr/onerror=panic/dev=1540048
/my_zone/root/my_zfs on my_zpool/my_zfs read/write/setuid/devices
/exec/xattr/atime/dev=401000b
/my_zone/root/my_lofs on /my_lofs read/write/setuid/devices/
dev=1540000

논-글로벌 존의 파일 시스템을 재부팅 없이 언마운트 할 수 있습니다:

# umount /my_zone/root/my_ufs
# umount /my_zone/root/my_zfs
# umount /my_zone/root/my_lofs

기억해 둘 점으로 LOFS 는 글로벌 존의 어떠한 디렉토리도 참고할 수 있고 동시에 여러 존에 의해서도 공유 될 수 있습니다. 즉 만약 우리가 LOFS 마운트된 논-글로벌 존을 가지고 있고 새로운 파일 시스템을 글로벌존의 기본 디렉토리로 마운트 한다고 했을때 새로운 파일 시스템은 LOFS 마운트 포인트에 따라서 모든 존에서 접근이 가능합니다.

특별한 경우가 바로 /cdrom 디렉토리 입니다. 예를 들어 우리는 이 디렉토리를 논-글로벌 존에서 읽기 전용의 LOFS 로 마운트 할 수 있습니다:

# mkdir /my_zone/root/cdrom
# mount -F lofs -o ro /cdrom /my_zone/root/cdrom

그 다음 우리는 DVD 에 미디어를 집어 넣고 이것을 글로벌 존의 vold 를 이용해서 /cdrom/cdrom0 에 마운트 할 수 있습니다. 이 미디어의 내용은 my_zone 에서도 확인이 가능할 것입니다.

이것은 이후에 네이티브 마운트 포인트를 덮어 쓰기 위해 파일 시스템을 논-글로벌 존으로 마운트할때에 유용할 것입니다. 예를 들어 존의 /tmp 디렉토리가 swap 공간 바깥에 위치해서 재부팅 후에도 보존하길 원한다고 생각해 봅시다. 이러한 경우 우리는 본래 존의 tmpfs 파일 시스템을 아무도 사용하지 않을 경우 언마운트 할 수도 있지만 그 내부의 내용은 모두 지워 진다는 것을 알게 됩니다. 이때 우리는 좀 더 장기간 쓸 수 있는 파일 시스템을 /my_zone/root/tmp 에 마운트 시킬 수 있을 것입니다:

# umount /my_zone/root/tmp
# cp /my_zone/root/etc/vfstab /my_zone/root/etc/vfstab.ori
# sed '/tmpfs/s/swap/#swap/' /my_zone/root/etc/vfstab.ori > \
/my_zone/root/etc/vfstab
# cat > tmpconfig.txt << EOF
add fs
set dir=/tmp
set special=/dev/md/dsk/d36
set raw=/dev/md/rdsk/d36
set type=ufs
end
EOF
# zonecfg -z my_zone -f tmpconfig.txt
# mount -F ufs /dev/md/dsk/d36 /identity/root/tmp
# chmod 1777 /my_zone/root/tmp

최근에 한 작업을 재부팅 없이 되돌리기 위해서는 다음과 같은 작업을 수행 합니다:

# umount /my_zone/root/tmp
# mv /my_zone/root/etc/vfstab.ori /my_zone/root/etc/vfstab
# zonecfg -z my_zone remove fs dir=/tmp
# mount -F tmpfs swap /identity/root/tmp

만약 여러분의 존의 /var 디렉토리를 / 에 위치한 것 과 다른 파일 시스템을 이용하고 싶다면 이 것은 존을 설치 하기 존에(존의 초기 설정을 포함해서) /my_zone/root/var 에 마운트 되어 있어야 합니다. 추가적으로 만약 존이 이미 설치 되었다면 우리는 이것을 중단시키고 /var 디렉토리의 컨텐츠를 새로운 파일로 이동시키고 존을 다시 한번 부팅 시키기 전에 새로운 파일 시스템을 존의 /var 로 마운트 할 수 있습니다. 이러한 마이그레이션 작업은 논-글로벌 존의 재부팅 없이는 불가능합니다.

이 시점에서 존의 autoboot 파라미터를 결정 하는 것이 중요합니다. 왜냐하면 모든 서버들의 파일 시스템들은 반드시 존이 부팅 하기 전에 사용이 가능해야 하기 때문입니다. 존은 항상 svc:/system/zones 서비스가 초기화 되기 전에 부팅 됩니다. 글로벌 존에서 파일 시스템이 나중에 마운트 되기도 합니다, 왜냐하면 그 파일 시스템들이 다른 리소스에 의존성이 있기도 하고, 종종 논-글로벌 존에서 LOFS 형태로 마운트되어야 하기도 할 것입니다. 이러한 경우에 우리는 존의 autoboot 파라미터를 false 로 지정하고 존을 레가시 스크립트를 이용해서 부팅함으로써 존을 특정 파일을 테스트 한 후, 예를 들어 /mounted_path/flag_file 같은, 특정 조건을 테스트 한 후에 존의 부팅을 결정할 수 있습니다:

cat >> /etc/rc3.d/S99zones << EOF
[ -f /mounted_path/flag_file ] && zoneadm -z my_zone boot
EOF
chmod 744 /etc/rc3.d/S99zones
chown root:sys /etc/rc3.d/S99zones
echo 'zoneadm -z my_zone halt' >> /etc/rc0.d/K01zones
chmod 744 /etc/rc0.d/K01zones
chown root:sys /etc/rc0.d/K01zones


Raw 디바이스

새로운 raw 디바이스 /dev/md/rdsk/d321 를 논-글로벌 존에 추가 하기 위해서 다음과 같은 작업을 수행합니다:

# zonecfg -z my_zone
zonecfg:my_zone> add device
zonecfg:my_zone:device> set match=/dev/md/rdsk/d321
zonecfg:my_zone:device> end
zonecfg:my_zone> commit
zonecfg:my_zone> exit
#

이후에 변경 사항을 유효화 하기 위해 우리는 존을 재부팅 해야 합니다:

# zoneadm -z my_zone reboot

이제 만약 우리가 새로운 raw 디바이 /dev/md/rdsk/d322 를 동일한 존에 지정하려고 한다면 우리는 반드시 동일한 절차를 거쳐서 존을 재부팅 해야 합니다. 이것을 방지 하기 위해서는 정규 표현식을 이용해서 초기에 디바이스들을 서로 매칭 시키는 것입니다. 이것은 테잎 디바이스를 설정하는 것과 비슷합니다:

# cat > tapeconfig.txt << EOF
add device
set match=/dev/rmt/1*
end
EOF
# zonecfg -z my_zone -f tapeconfig.txt

이러한 설정은 각 디바이스의 배치를 /dev/rmt/1 에서 /dev/rmt/1n, /dev/rmt/1bc 형태로 매칭 시키도록 강제합니다:

# zlogin -l root my_zone ls /dev/rmt
1   1bn 1cb  1cn  1hb  1hn  1lb   1ln  1mb   1mn  1u   1ubn
1b  1c  1cbn 1h  1hbn  1l   1lbn  1m   1mbn  1n   1ub  1un

이 기능을 이용해서 우리는 수십 수천 가지의 raw 디바이스를 하나의 라인에 매칭 시킬 수 있습니다:

# cat > rawconfig.txt << EOF
add device
set match=/dev/md/rdsk/d3*
end
EOF
# zonecfg -z my_zone -f rawconfig.txt

그러나 우리는 raw 디바이스를 d301 부터 순서대로 d320 까지만 매칭 시키길 원할 수도 있습니다. 이러한 경우 d3 이나 d35 같은 디바이스를 매칭 시키는 것이 위험할 수도 있습니다. 왜냐하면 다른 존에 의해 사용 될 수 있고 특히 글로 벌 존에 의해서 사용될 수도 있는데 왜냐하면 my_zone 에 권한을 가진 사용자가 이러한 디바이스에 실수로 쓰기 작업을 할 수도 있기 때문입니다.

# ls /my_zone/root/dev/md/rdsk
d3   d302  d304  d306  d308  d310  d312  d314  d316  d318  d320
d301 d303  d305  d307  d309  d311  d313  d315  d317  d319

또다른 잘못된 접근으로는 /dev/rdsk/c0t2d0s* 같은 잘못된 표현을 사용해서 모든 디스크 슬라이스를 매치시키는 경우 입니다, c0t2d0s2 는 전체 디스크를 의미 하기 때문입니다. 사실 금지된 디바이스에 쓰기 작업을 하는 것은 거의 잘 일어 나지는 않을 것입니다 그러나 현명한 관리자라면 메인 디바이스를 논-글로벌 존에 노출 시키지는 않을 것입니다.

이러한 상황을 방지 하기 위해 우리는 raw 디바이스를 아래와 같은 방법으로 논-글로벌 존에 지정할 수 있습니다:

# cat > rawconfig.txt << EOF
add device
set match=/dev/md/rdsk/d3??
end
EOF
# zonecfg -z my_zone -f rawconfig.txt

이 방법은 raw 디바이스 d300 부터 d399 사이의 모든 새로운 raw 디바이스를 존에 올려 줍니다. 그러나 d3 혹은 d35 는 매치 시키지 않을 것입니다. 적절한 해결 방법은 소프트 파티션으로 이루어진 수백개의 서로 다른 그룹을 존에 지정하여 중복을 방지 하는 것입니다.

두번째이자 가장 흥미로운 장점은 우리는 새로운 소프트 파티션을 글로벌 존에서 매칭 범위 안에서 만들 수 있다는 것이고 이것은 논-글로벌 존을 재부팅 하지 않아도 자동으로 온라인 상태로 될 것입니다. 예를 들어 d301 부터 d320 까지 20 개의 raw 디바이스를 /dev/md/rdsk/d3?? 로 매칭 시킨 존이 있다고 했을때:

# ls /my_zone/root/dev/md/rdsk
d301  d303  d305  d307  d309  d311  d313  d315  d317  d319
d302  d304  d306  d308  d310  d312  d314  d316  d318  d320

여기서 우리는 새로운 소프트 파티션을 매칭 범위 안에서 생성할 것이고 이것은 논-글로벌 존에서 즉시 나타날 것입니다:

# metainit d321 -p /dev/rdsk/c0t2d0s0 5g
# ls /my_zone/root/dev/md/rdsk
d301  d303  d305  d307  d309  d311  d313  d315  d317  d319  d321
d302  d304  d306  d308  d310  d312  d314  d316  d318  d320

우리가 두개의 디스크 슬라이스를 d300 으로 합치고 새로운 소프트 파티션 d322 을 그 안에 만들었다고 하면, 물론 이 것은 권장 되는 방법은 아니지만, 다음과 같은 결과를 보게 될 것입니다.

# metainit d300 2 1 /dev/rdsk/c0t2d0s6 1 /dev/rdsk/c1t2d0s6
# metainit d322 -p d300 5g
# ls /my_zone/root/dev/md/rdsk
d300  d302  d304  d306  d308  d310  d312  d314  d316  d318  d320  d322
d301  d303  d305  d307  d309  d311  d313  d315  d317  d319  d321

디바이스 d300 은 이제 논-글로벌 존에서 사용 가능 합니다. 우리는 존의 유저들이 그것에 접근 하는 것을 막아야 합니다.

<논 글로벌 존의 code class="small"> /dev 디렉토리 는 zonedevfs 라고 불리는 특별한 옵션으로 부팅시에 /my_zone/dev 에 마운트 되는 LOFS 파일 시스템 입니다. 솔라리스10은 /my_zone/dev 디렉토리에 각각의 매칭 디바이스를 위해서 하나의 새로운 스페셜 파일 을 생성합니다:

# file /my_zone/dev/md/rdsk/d300
/my_zone/dev/md/rdsk/d300:      character special (85/300)
# ls -l /my_zone/dev/md/rdsk | head -6
total 0
crw-r-----   1 root     sys       85, 300 Mar  4 10:39 d300
crw-r-----   1 root     sys       85, 301 Mar  4 10:13 d301
crw-r-----   1 root     sys       85, 302 Mar  4 10:13 d302
crw-r-----   1 root     sys       85, 303 Mar  4 10:13 d303
crw-r-----   1 root     sys       85, 304 Mar  4 10:13 d304

이러한 파일들은 글로벌 존의 /device 디렉토리에 위치한 파일들을 가르키는 심볼릭 링크들은 아닙니다. 그러나 분리해서 관리되어 져야 합니다. 논-글로벌 존에 권한이 부여된 유저들은 이러한 파일들의 권한을 /dev 디렉토리 내에서 변경 할 수 있으나 삭제할 수는 없습니다. 그러나 우리는 존의 디바이스를 글로벌 존에서 삭제할 수 있습니다:

# rm /my_zone/dev/md/rdsk/d300

비록 우리가 온라인 존의 디바이스를 이러한 방법으로 제거 할 수 있다고 하더라도, 다음 재부팅 시에는 다시 동일하게 나타날 것입니다. 가장 문제가 없고 적절한 솔루션은 빈 파일들을 본래 파일을 대신해서 만드는 것입니다:

# touch /my_zone/dev/md/rdsk/d300
# zlogin -l root my_zone "file /dev/md/rdsk/d300"
/dev/md/rdsk/d300:      empty file
# zlogin -l root my_zone "ls -l /dev/md/rdsk" | head -6
total 0
-rw-r--r--   1 root     root           0 Mar  4 12:05 d300
crw-r-----   1 root     sys       85, 301 Mar  4 10:13 d301
crw-r-----   1 root     sys       85, 302 Mar  4 10:13 d302
crw-r-----   1 root     sys       85, 303 Mar  4 10:13 d303
crw-r-----   1 root     sys       85, 304 Mar  4 10:13 d304

새로운 빈 파일들은 논-글로벌 존의 유저에 의해 변경될 수 없고 재부팅 이후에도 그대로 남아 있을 것입니다.

다시 말해서 우리는 존에서 raw 디바이스를 더이상 필요로 하지 않고, 어디에서나 지울 수 있을 것입니다:

# metaclear d322
# rm /my_zone/dev/md/rdsk/d322
# metaclear d300
# rm /my_zone/dev/md/rdsk/d300

존의 설정을 변경하지 않고 또한 존이 재부팅될 필요도 없습니다.

마지막으로 위에서 언급한 모든 예제들을 실습하기 위해서 일반적인 존의 설정은 다음과 같아야 합니다:

# zonecfg -z my_zone info
zonepath: /my_zone
autoboot: true
pool:
fs:
        dir: /my_ufs
        special: /dev/md/dsk/d35
        raw: /dev/md/rdsk/d35
        type: ufs
        options: []
fs:
        dir: /my_zfs
        special: my_zpool/my_zfs
        raw not specified
        type: zfs
        options: []
fs:
        dir: /my_lofs
        special: /my_lofs
        raw not specified
        type: lofs
        options: []
fs:
        dir: /cdrom
        special: /cdrom
        raw not specified
        type: lofs
        options: [ro]
net:
        address: 192.168.0.35/24
        physical: bge0
device
        match: /dev/rmt/1*
device
        match: /dev/md/rdsk/d3??
#







이 글의 영문 원본은
Assigning System Resources to Solaris 10 Zones Without Reboot
에서 보실 수 있습니다.

"관리자코너" 카테고리의 다른 글

2008/06/16 11:41 2008/06/16 11:41

TRACKBACK :: http://blog.sdnkorea.com/blog/trackback/601

댓글을 달아 주세요

[로그인][오픈아이디란?]

◀ Prev 1  ... 80 81 82 83 84 85 86 87 88  ... 641  Next ▶