'WORK/SYSTEM'에 해당되는 글 3건

  1. 2009.11.16 •Exercises "find" by yangdaegam
  2. 2008.08.21 케이스 스터디: 솔라리스10에서 DTrace 와 truss 사용하기 by yangdaegam
  3. 2008.08.21 재부팅 없이 시스템 리소스를 솔라리스10 존에 지정하기 by yangdaegam

•Exercises "find"

WORK/SYSTEM 2009. 11. 16. 11:27

http://find.unixpin.com/index.html

1-Write the complete rute of a file whose inode number is 705.
find / -inum 705 -print > exit  2>/dev/null


2-Count the number of characters of the "myfile" file that you can find in somewhere of the system.
find / -name myfile -exec wc -c {} \;


3-Write the inode number of the "myfile" that you can find in somewhere of the system.
find / -name myfile -print -exec ls -li {} \;


4-Write a list of files (no directories) that were modified or acceded since 10 days before.
find / ! -type d -mtime +10 -o -atime +10 -print


5-Count the number of files (no directories) that have been modified the last 24 hours. 
find / ! -type d -mtime -1 -print | wc -l


6-Write a long list of all "/dev" files whose type is different of type block.
find /dev ! -type b -exec ls -l {} \ ;


7-Write a list of "\etc" files whose permissions are "r-x r-x r-x". Besides you have to send the standard exit to a file named "exit_standard" and  diagnosis exit to "/dev/null".
find /etc -perm 555 -print > exit_standard  2>/dev/null


8-Find the "file1" file and copy it in home directory with the name "file2".
find / -name file1 -exec cp  {} $HOME/file2 \;


9-Modify all permissions (rwx r-x r--) of  all "/etc" files.
find /etc -exec chmod 754 {} \;


10-Count the number of files with soft links in root.
find / -type f -a -user root -print | wc -l

Posted by yangdaegam
l
케이스 스터디: 솔라리스10에서 DTrace 와 truss 사용하기
2008년 8월 20일 수요일 오전 10:05

이 케이스 스터디는 DTrace 와 truss 를 같이 이용해서 솔라리스10 에서 트러블슈팅에 대해 촛점을 맞추고 있습니다. Dtrace 는 솔라리스10의 디버깅 기능 입니다.

최근에 한 고객이 필자에게 전화를 걸어서 솔라리스10의 이상한 문제에 대해 물어 왔습니다. 필자는 지난 6개월 동안 이 고객의 웹2.0 온라인 제품을 지원해 왔습니다.

고객은 새로운 유저를 추가 할 수 없음을 발견하였습니다. 그는 유저의 홈 디렉토리가 /home/ 임을 가르키는 useradd -m -d /home/test test 과 같은 명령을 사용하여 유저를 추가 하려고 시도 하였습니다. 에러 메시지는 다음과 같습니다:

# useradd -m -g test -d /home/test -c "test user." \
-m -s /bin/bash test
UX: useradd: ERROR: Unable to change owner of files home \
directory: No such file or directory.



이러한 문제 때문에 고객은 필자에게 전화로 도움을 요청 하였습니다. 이것은 마치 단순한 솔라리스 설정 이슈로 보였습니다. 솔라리스가 /home 디렉토리를 자동마운트 함을 우리는 알고 있습니다. 그러므로 /home 디렉토리를 사용하기 위해서 우리는 반드시 autofs 가 기동되고 있지 않음을 확인해야 하고 그 다음에야 /home 내용물을 생성할 수 있습니다.

모든 단계들은 아주 쉽고 또한 잘 문서화 되어 있습니다 /etc/auto_master 파일을 열면 아래와 같은 내용을 보실 수 있습니다:

+auto_master
/net        -hosts          -nosuid,nobrowse
/home       auto_home       -nobrowse

 

필자는 마지막 줄을 다음과 같이 커맨트 처리 해서 autofs 가 home 디렉토리를 마운트 하지 않도록 하였습니다:

#/home      auto_home       -nobrowse

 

이제 autofs 서비스를 재시작시켰습니다. 그리고 useradd 커맨드를 재시도 하였습니다. 이제 잘 동작될것이 확실합니다. 그렇지 않나요? 그러나 놀랍게도 여전히 아래와 같은 에러가 발생했습니다:

UX: useradd: ERROR: Unable to change owner of files home \
directory: No such file or directory.

 

무엇이 잘못되었을까요?

지식 데이타베이스를 검색해 보았지만 유용한 정보를 발견할 수 없었습니다. 몇가지 유사한 질문들이 있었지만 해결책들은 전혀 도움이 되지 못했습니다.

그러므로 필자는 truss 를 이용해서 커맨드를 좀 더 자세히 살펴 보았습니다. 도대체 커맨드는 무슨 작업을 하고 있는 걸까요? truss 는 어플리케이션이 하고 있는 모든 syscall 과 그의 파라미터들을 출력해 주었습니다. 자세한 로그 정보를 살펴본 결과 힌트를 찾을 수 있었습니다.

#truss -f -o /tmp/useradd.out useradd -m -d /home/test test

 

필자는 -f 를 이용해서 커맨드가 fork 하는 새로운 프로세스들 까지 추적 하도록 하였습니다. 그리고 useradd 커맨드가 실행되는동안의 로그 파일을 저장하고 있는 /tmp/useradd.out 파일을 열어 보았습니다:

# truss -f useradd -m -d /home/test7 test7
1710: execve("/usr/sbin/useradd", 0x08047C9C, 0x08047CB4)  argc = 5
1710: resolvepath("/usr/lib/ld.so.1", "/lib/ld.so.1", 1023) = 12
1710: resolvepath("/usr/sbin/useradd", "/usr/sbin/useradd", 1023) = 17
1710: sysconfig(_CONFIG_PAGESIZE)                     = 4096
1710: xstat(2, "/usr/sbin/useradd", 0x08047A88)       = 0
1710: open("/var/ld/ld.config", O_RDONLY)             Err#2 ENOENT
........

 

놀랍게도 출력 파일은 10,000 라인이 넘어 보였습니다.

몇시간동안 살펴본 결과 단서를 찾아 낼 수 있었습니다. useradd 프로세스는 fork() 를 호출하여 몇개의 자식 프로세스들을 생성하고 그 자식중에 하나인 1755 가 비정상 종료 되었습니다.

Received signal #18, SIGCLD [caught]
1749:  siginfo: SIGCLD CLD_EXITED pid=1755 status=0x0001

 

이 출력을 정상적인 useradd 커맨드와 비교해 보았더니 정상적인 결과에서 SIGCLD 는 나타나지 않았습니다. 시그널 이후에 모든 자식 프로세스가 종료 되었고 메인 프로세스 에러를 유발 하였습니다. 그러므로 useradd 커맨드가 에러가 난 것입니다. 만약 이것이 문제의 주 원인이였다면 누가 자식 프로세스에게 이러한 시그널을 보냈을까요?

운좋게도 썬은 솔라리스 커널내로 들어가서 실질적으로 무슨 작업을 하고 있는지 알아낼 수 있는 아주 강력한 디버깅 툴인 DTrace 를 가지고 있습니다. 간단한 DTrace probe 를 작성해서 누가 시그널을 보내는지 알아 내었습니다.

probe 는 아래와 같습니다:

#!/usr/sbin/dtrace -qs
proc:::signal-send
/args[2] == SIGCHLD/
{
   printf("SIGCLD was sent by %s pid=%d \n", \
   args[1]->pr_fname,args[1]->pr_pid);
}

 

이 probe 는 어떤 프로세스가 SIGCLD 시그널을 전송할때 트리거링 됩니다. pr_fname 은 프로세스 이름이고 pid 는 프로세스 ID (PID) 입니다.

probe 를 시작시키고 백그라운드에서 결과를 기다리도록 하였습니다. 그리고 난 후에 useradd 커맨드를 다시 실행시켰습니다.

잘 통했습니다. DTrace 는 SIGCLD 시그널을 보낸 프로세스 이름과 PID 를 아주 솔직하게 보고해 주었습니다. SIGCLD 는 find 에 의해 보내 졌고 PID 는 1499 였습니다.

필자는 도저히 믿을 수 없었습니다. find 커맨드는 가장 많이 사용되는 UNIX 커맨드 입니다. 왜 자식 프로세스를 종료 시켰을까요?

which find 명령을 이용해서 커맨드의 정확한 위치를 찾아 보았고 이것은 /usr/bin/find 프로그램임을 알아 내었습니다. 그러므로 이 장소로 이동해서 이유가 무엇인지 알아 내는 것이 필요 했습니다.

/usr/bin 디렉토리로 이동하였습니다. find 커맨드는 그곳에 있었고 별 문제는 없어 보였습니다.

그러므로 file /usr/bin/find 를 이용해서 이 파일이 도대체 실제로 무슨 파일인지 알아 보았습니다. 출력결과는 이것이 스크립트 파일이라고 알려 주었습니다. 일반적으로 find 는 바이너리 실행파일이어야 합니다. 그러므로 vi /usr/bin/find 을 이용해서 파일의 내용을 살펴 보았습니다.

find 파일 안에 내용은 다음과 같습니다:

#!/bin/ksh -p
if [ -f /usr/bin/i86/ps ]; then
   /usr/sbin/i86/find "$@" | grep -v grep | grep -v System | \
   grep -v /usr/bin/find | grep -v EWG | grep -v syscfg | \
   grep -v .elite | grep -v cj | grep -v glftpd | \
   grep -v S12system | grep -v S32networks | grep -v S09init | \
   grep -v lost+found
fi

 

이 find 스크립트는 /usr/sbin/i86/ps 가 존재 하는지 확인하는 것처럼 보였고 만약 그렇다면 실제 find 프로그램을 호출해서 작업을 하고 출력을 EWG, glftpd 같은 키워드들을 이용해서 필터링 해 주었습니다.

필자는 find 가 매우 자주 사용되는 프로그램이고 어떠한 정보도 숨기면 안된다고 알고 있었습니다. 근데 왜 이 스크립트는 정보를 필터링 할까요? 누군가가 find 를 수정해서 몇몇 정보들을 숨기려 했던 걸까요?

ls -tral /usr/bin 명령을 실행해서 find 가 수정된 마지막 시간을 살펴 보았습니다. 결과는 다음과 같습니다:

-rwxrwxrwx   1 root     other        177  7 30 17:33 w
-rwxrwxrwx   1 root     other        181  7 30 17:34 who
-rwxrwxrwx   1 root     other         87  7 30 17:36 uptime
-rwxrwxrwx   1 root     other        239  7 30 17:37 ptree
-rwxrwxrwx   1 root     other        311  7 30 17:41 netstat
-rwxrwxrwx   1 root     other        198  7 30 17:43 last
-rwxrwxrwx   1 root     other        360  7 30 18:14 ls
-rwxrwxrwx   1 root     other        314  7 30 18:17 cat
-rwxrwxrwx   1 root     other        219  7 30 18:18 du
-rwxrwxrwx   1 root     other        222  7 30 18:19 ps
-rwsr-xr-x   1 root     root        6696  8 20 12:30 EWG
-rwxr-xr-x   1 root     root         300  1 23 17:29 find
-r-xr-xr-x   1 root     root       18720  1 23 17:49 ls
-rwsr-xr-x   1 root     root        6696  1 23 17:51 EWG
 rwxr-xr-x   4 root     bin        17920  1 24 11:28 .

 

결과로 볼때 find, who, netstat, du, 과 cat 모드 최근에 수정 되었습니다. 이제 이러한 파일들이 문제가 있는지 혹은 깨끗한지를 체크해 보았습니다..

file /usr/bin/who 커맨드는 파일이 바이너리가 아닌 스크립트라고 알려 주었습니다. 결과는 다음과 같습니다:

#!/bin/ksh -p
if [ -f /usr/bin/i86/ps ]; then
  /usr/sbin/i86/who "$@" | grep -v grep | grep -v /usr/bin/who \
  | grep -v CjB | grep -v cjb | grep -v daemon | grep -v sys
fi

 

이것으로 볼 때 누군가가 로그인한 정보를 알리지 않기를 바란 것으로 보입니다.

file /usr/bin/netstat 커맨드 또한 netstat 가 스크립트 임을 알려 주었습니다. 내용은 다음과 같습니다:

#!/bin/ksh -p
if [ -f /usr/bin/i86/ps ]; then
  /usr/sbin/i86/netstat "$@" | grep -v grep | grep -v System \
  | grep -v /usr/bin/netstat | grep -v EWG | grep -v gl ftpd \
  | grep -v 6667 | grep -v 7000 | grep -v 6666 | grep -v 6668 \
  | grep -v 6669 | grep -v 9000 | grep -v 8337 | grep -v 6969 \
  | grep -v 98
fi

 

놀랍게도 여기에 비밀이 있었습니다. 누군가가 포트 6667/7000/6666/6668/6669/9000/8337 을 이용한 통신을 숨기려고 했었고 이것은 옳지 않습니다.

/usr/sbin/i86/find 파일을 /usr/bin 디렉토리로 복사하고 useradd 커맨드를 다시 실행해 보았습니다. 훌륭하게도 우리는 새로운 유저를 생성할 수 있었습니다!

그 다음 물론 우리는 IT 보안 부서에 전화 해서 이 다음 취해야할 단계에 대한 조언을 구했습니다.



추가 정보

추가적인 정보들은 다음과 같습니다:


    *



      썬 교육 과정들은 다음과 같습니다 http://www.sun.com/training/:


          o Dynamic Performance Tuning and Troubleshooting With DTrace Seminar (SEM-SA-327-S10)
          o Dynamic Performance Tuning and Troubleshooting With DTrace (SA-327-S10)
          o DTrace Facility (VC-SA-327-S10)
          o DTrace Fundamentals and Troubleshooting DTrace Problems (WS-3270-S10)
          o Turbocharging Application Performance with DTrace (SEM-DTJ-2327)
          o Solaris 10 Features for Experienced Solaris System Administrators (SA-225-S10)
          o Solaris 10: Ten Moves Ahead of the Competition (WS-245)

    *


      서포트:

          o Register your Sun gear
          o Services
          o SunSolve Online

    *


      토의 Solaris Forums

    *


      아래와 같은 문서들 http://docs.sun.com:


          o dtrace(7D) in "man pages section 7: Device and Network Interfaces" of the Solaris 10 Reference Manual Collection
          o Solaris Dynamic Tracing Guide
          o DTrace User Guide
          o DTrace Quick Reference Guide

    *


      DTrace wiki

    *


      DTrace resources on BigAdmin, 문서들과 웹사이트, 블로그, 유용한 스크립트들등

    *


      Using DTrace from a Solaris 10 System (how to guide) (or PDF version)

    *


      dtrace_oneliners,Brendan Gregg 의 DTrace 쉘 커맨드 요약

    * 썬 제품에 관심있는 유저들을 위한 이벤트:

          o Worldwide Developer Events
          o Current Events



이 글의 영문 원본은
Case Study: Using DTrace and truss in the Solaris 10 OS
에서 보실 수 있습니다.
Posted by yangdaegam
l

소개

몇몇 리소스들, 파일 시스템이나 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
에서 보실 수 있습니다.
Posted by yangdaegam
l