본문 : http://www.ischo.net -- 조인상 //시스템 엔지니어

+++++++++++++++++++++++++++++++++++++++++++++++++++++++


출처 : http://www.systemadmin.pe.kr



Filesystem 만들기

새 디스크를 붙일 때 disksetup 명령어를 사용하는데, 보통 이때에 파일시스템을 만들어 버린다. 그러나 기존에 사용하던 파일시스템을 변경하고자 할때에는 mkfs란 명령어를 사용하여 파일시스템 종류를 변경시킬 수 있다. 파일시스템을 새로 만들면 사용하고 있던 데이터 구조가 변경되는 관계로 모든 데이터가 사용할 수 없게 되므로 반드시 데이터를 백업 받아 두어야 한다.

mkfs: vxfs 파일시스템

가장 일반적으로 vxfs 파일시스템을 만드는 형식은 다음과 같으며 다른 파라미터 값들은 안 주어도 디폴트로 적용된다.
# mkfs [-F vxfs] [-o specific_options] special size
-F vxfs 파일시스템을 vxfs 타입으로 한다는 의미이다.
-o bsize= 블록 크기를 주는 곳으로 디폴트는 1024이다. 2048,4096,8192 값을 줄 수
있다. 이 값은 파일시스템상에서 파일들에 대한 블록 크기이다. 큰 값을 줄수록
I/O 속도는 조금 향상되나 디스크 낭비가 보다 크다.
special 블록 디바이스에 대한 슬라이스 명을 준다.
size size는 prtvtoc 명령어로 정보를 보았을 때 맨 우측에 나타난 각 슬라이스
에 대한 length 값을 주면 된다.
[#] mkfs –F vxfs –o bsize=4096 /dev/dsk/c0b0t0d0s1 32768:

현재의 파일 시스템을 구성하는 데 사용된 명령어를 “-m” 옵션을 이용하면 알 수 있다.
[#] mkfs –F vxfs –m /dev/dsk/c0b0t0d0s1
mkfs -F vxfs -o ninode=65536,bsize=1024,version=4,inosize=256,logsize=1024,nola4

mkfs: ufs 파일시스템

형식은 vxfs의 경우와 같으나 옵션 사용이 조금 다르다.
[#] mkfs [-F ufs] [-o specific_options] special size
-F ufs ufs 파일시스템으로 만들라는 의미이다.
-o bsize= 블록 크기를 4096이나 8192가 사용되며 디폴트는 4096 이다.
cgsize= 실린더 그룹당 디스크 실린더의 수로, 1에서 32 값이 사용된다.
Cylinder group < 3/4 MB : 디폴트는 16
3/4 MB <Cylinder group < 1.5 MB : 디폴트는 12
Cylinder group > 1.5 MB : 디폴트는 8
cgsize 값을 적게 줄수록 inode 수가 증가한다. 수십 기가바이트의 파일시스템에서
지나치게 inode 수를 많이 만들면 fsck 명령어가 제어하는 한계가 있다. 부팅할 때
자동으로 파일시스템을 검사하는데 실패를 하게 되어 파일시스템에 깨어지므로
조심하여야 한다. 특별한 경우가 아니면 이 옵션은 사용하지 않는다.
special 블록 디바이스에 대한 슬라이스 명을 준다.
size size는 prtvtoc 명령어로 정보를 보았을 때 맨 우측에 나타난 각 슬라이스
에 대한 length 값을 주면 된다.
파일시스템 Troubleshooting

File system full

File system full이 발생하였을 때 find 명령어를 사용하여 필요한 파일을 찾아 조치할 수 있다. 일반 파일시스템이 차거나 루트 파일시스템이 꽉 차면 사용자나 시스템의 사용에 제한을 받는다. 시스템 관리자는 파일시스템이 꽉찬 원인을 찾아 파일을 지우거나 다른 곳으로 이동시켜야 한다. find 명령어를 이용하면 어느 정도 원인을 찾는데 도움이 된다.

find 명령어

아래의 예제에서 처럼, /는 루트 파일시스템을 찾으라는 의미이고 .을 줄때에는 현재 작업 디렉토리 즉 현재의 파일시스템을 기준으로 찾으라는 의미이다.
[#] find / -type f –size +40000 –xdev –print :
40000은 block 수이므로 20MB 이상의 파일을 찾으라

[#/] find path-list expression –print
[#/] find / -type f –size +40000 –xdev –print :
40000은 block 수이므로 20MB 이상의 파일을 찾으라
-xdev 찾을 범위가 리모트가 아닌 현재 시스템 내에만 국한 시킬 때
-name pattern pattern과 일치하는 파일을 찾아라
-user username /etc/passwd에 인증된 사용자 이름으로 등록된 파일
-type (fdl) f : 일반 파일, d: 디렉토리, l: 심볼릭 링크
-mtime n n 일 전에 수정한 파일을 찾을 때; 1은 오늘, 2 는 어제 수정한 파일
-atime n n 일 전에 액세스한 파일을 찾을 때; 1은 오늘, 2 는 어제 액세스한 파일
-size +-n +n : n block보다 큰 파일, -n: n block 보다 작은 파일

파일의 종류에 따라 수정되거나 안될 수도 있는데 이를 확인하기 위해 file 이란 명령어를 사용한다.
표시된 내용 중에서 text라 표시되는 파일들만이 대부분 R/W 가능하다.
[#/] file * : 현재 디렉토리 모두를 표시

특정 명령어를 실행하였는데 원인 모르게 에러가 날 때 그 원인을 찾고자 할 때 유용한 명령어로 truss를 사용한다. 이는 system call과 signal들을 대상으로 trace를 걸 때 사용한다.
[#/] truss [option] command : 현재 디렉토리 모두를 표시
-p process_id “ps –ef” 할 때의 PID 번호를 말한다
-a 각 exec system call에 전달된 argument string들을 보이라
-e 각 exec system call에 전달된 environment string들을 보이라
-f fork된 process들을 trace 걸 때
-t 주어진 call만 trace 걸 때
-o filename 출력을 파일로 보관할 때

[#/] truss –fa –o /tmp/aa find . –print : find에 대한 truss를 걸때
[#/] truss find –f –o /tmp/aa : find에 대한 truss를 걸때

truss 명령어를 사용하여 어떤 에러 메시지가 출력되면, strings란 명령어를 이용하여 binary program내에 특정 텍스트 스트링을 찾는데 유용하다.
[#/] strings [–a] [–o] [-number] filename
#strings –a –10 /usr/bin/mouseadmin

문제 있는 process가 발견되면 kill 명령어로 해당 프로세스를 제거해야 한다. 그러나 zombie같은 process들은 kill로도 제거되지 않는 경우가 많다. 이런 경우는 rebooting 해야지만 제거된다. 일반적으로 zombie 같은 process는 어플리케이션에 bug가 있을 때 주로 생기며 “ps –ef”를 하였을 때 “defunt”로 표시되는 process를 말한다.

#kill –9 pid

kill 이외에도 특정 사용자나 file, file system을 제어하는데 fuser 명령어를 사용해야 할 때도 있다.

기타

Pipes

파이프(pipes)란 말 의미를 생각해 보면 어느 한쪽과 다른 한쪽을 연결시켜주는 역할을 한다. 유닉스에서는 명령들을 서로 연결시켜주는 역할을 한다. 파이프의 기호는 “|” 이다. 수행과정은 파이프의 왼쪽 출력을 받아 파이프 오른쪽의 입력으로 사용하여 처리한다.

사용법

작업 디렉토리에 있는 파일들을 리스트하라는 ls 명령어의 표준 출력을 받아 그 갯수를 알아보자.
[#/]ls | wc -l
45

페이지 단위로 보여주는 more를 이용하면 리스트되는 내용을 쉽게 알아볼 수 있다.
[#] ls –al|more

리스트한 내용을 프린터로 출력하는 방법이다.
[#] ls –al| lp –d prt0

Filter

파이프는 일종의 필터의 한 종류로 기능을 한다. 연속적으로 진행되는 각각의 프로그램이 데이터를 갖고 어떤 연산을 처리한다고 하자. 이때 각 프로그램은 다음 프로그램으로 그 결과를 넘겨주기 전에 데이터를 필터시킨다. 연산들을 파이프처리하기 전에 데이터상에서 연산들을 수행하는 프로그램들을 종종 필터라 부른다.


Redirection

보통 명령어들의 표준 입력은 키보드가 된다. 여기서 입력이 가해지기 때문이다. 그리고 표준 출력은 화면이 될 것이다. 이때 표준 출력을 다른 곳으로 지정할 수 있는데 이를 리다이렉트라 한다. 즉 출력 방향을 재설정해 준다는 의미이다. 그래서 리다이렉션이란 다른 파일로부터 입력을 받거나 혹 출력시키는 방향을 지시한다는 의미로 사용된다.

가령 ls란 명령을 내렸을 때 그 결과가 화면에 표시된다. 그러나 아래와 같이 특정 파일로 저장할 수도 있다. 그러면 명령어의 결과가 화면에 뿌려주는 것이 아니라 /tmp/test.ls란 파일로 저장이 된다.
[#] ls –al > /tmp/test.ls

리다이렉션에는 몇가지 기호를 사용하는데, 리다이렉션 출력( >), 리다이렉션 입력(<), 파일에 추가(>>)가 이용된다.

Redirection Output : >

다음은 ls –al 한 표준 출력을 tmp란 파일의 입력으로 받아들이라는 명령이다. tmp 파일의 내용을 cat 명령어로 보면 크기가 0 바이트임을 알 수 있는데, 이는 처음에 ls –al 했을때 tmp 파일에는 아직 그 결과가 저장되지 않았기 때문이다. 그냥 ls –al 하면 결과 값이 저장되었기 때문이 크기가 잡혀 있다.
$ ls -al>tmp
$ cat tmp
………….
-rw-r--r-- 1 shchoi other 0 Dec 24 13:58 tmp
$ ls –al
………….
-rw-r--r-- 1 shchoi other 509 Dec 24 13:58 tmp

표준 출력을 받아들이는 > 의 오른 쪽에는 디바이스 드라이버 즉 프린터, 터미널, 테이프나 플라피 드라이버 일 수도 있다. 만약 lp1 이란 프린터를 사용하고 있다면 /etc/hosts란 파일 내용을 lp1 프린터로 출력시킬 수 있다. 물론 정상적으로 프린트하려면 ‘lp –d lp1 /etc/hosts’와 같은 방식을 사용하면 된다.
[#] cat /etc/hosts > /dev/lp1

또 banner 명령어를 이용하여 상대 터미널에 장난을 걸 수도 있다. 상대방 터미널은 who란 명령을 내리면 어느것이라는 것을 짐작할 수 있고 그 터미널이 pts010 이라면 아래와 같이 하면 작업 중이던 pts010 사용자는 깜짝 놀랄 수도 있다. vi로 작업중에 화면에 메시지가 뿌려지더라도 <CTRL+ l>하면 정상복구 된다.
[#] banner “Hey, what’s doing?” > /dev/pts010



Redirection Input : <

hello란 파일에 보내고자 하는 내용이 있다고 할 때, root 사용자가 shchoi 사용자에게 mail 명령어로 메시지를 전달해 보자. mail 명령어는 hello 파일을 입력 받아 shchoi 사용자의 터미널로 메시지를 보내게 된다.
[#] mail shchoi < hello


Adding to file : >>


File 특성

File Mode

‘ls –al’을 하였을 때 첫번째 항에는 10개의 문자(-rw-r--r--)가 있는데, 그 중에 맨 앞의 문자는 파일의 특성을 지칭한다.
-rw-r--r-- 1 shchoi other 480 Apr 4 1998 .cshrc

파일의 특성은 다음 중의 하나로 정의될 것이다:
d 파일이 디렉토리이다.
l 파일이 symbolic link이다.
b 파일이 block special file이다.
c 파일이 character special file 이다.
m 파일이 XENIX shared data (memory) file 이다.
p 파일이 fifo (named pipe) special file이다.
s 파일이 XENIX semaphore이다.
- 파일이 regular file 이다

File Permission

파일 사용에 대한 액세스 권한에 관하여 정의한 부분이다. 3 문자씩이 1 셋트로 세 그룹으로 나누어 진다.
rwxrwxrwx

file permission의 속성들에 관하여 알아보자:
r 읽을수 있는 파일
w 기록이 가능한 파일
x 실행이 가능한 파일
- 부여된 퍼미션이 없다.
l 액세스하는데 강제 락킹(mandatory file and record locking)이 발생한다. 그래서 한번에 한 사용자
만이 파일을 액세스 할 수 있다.
t 디렉토리에 있는 sticky bit를 설정한다. Sticky bit가 디렉토리에 설정되었을 때, 그
디렉토리에 있는 파일은 그 파일 소유자나 root 만이 삭제 할 수 있다.

세 그룹으로 구성되는데, 첫부분 3 문자는 사용자(user), 두번째 3 문자는 그룹(group), 마지막 세 문자는 다른 사용자(other)를 위한 부분이다.
-rw-r--r-- 1 shchoi dba 480 Apr 4 1998 test

가령 파일이 위와 같다면, test란 파일에 대하여 사용자는 shchoi이며 그룹은 dba에 속해 있다. 퍼미션과 관련하여, 사용자 shchoi는 test란 파일에 대해 읽고 쓸수 있는 권한은 있으나 실행시킬 권한은 없다(rw-). 그룹 dba중 shchoi 사용자를 제외한 dba 그룹에 속한 사용자는 이 파일에 대해 읽을 수 있는 권한만 있고 다른 권한은 없다(r--). 마지막으로 다른 사용자들은 읽을 수 있는 권한만 있다(r--). 만약 권한이 없는 사용자가 파일을 수정하려면 “permission denied”란 메시지를 보게 될 것이다.

Wildcard 사용

디렉토리나 파일 조작에 와일드 카드라는 특수한 문자를 이용하면 편리할 때가 있다.
? 단일 문자
* 임의의 문자 그룹
[ ] 하이픈(-)을 이용하여 문자들이나 범위를 표시

사용 예를 들어 보자.
현재 디렉토리에서 f로 시작하는 모든 파일을 리스트하라.
[#] ls –al f*

현재 디렉토리에서 k로 끝나는 모든 파일을 리스트하라.
[#] ls –al *k

현재 디렉토리에서 ? 갯수 만큼된 모든 파일을 리스트하라.
[#] ls –al ???

현재 디렉토리에서 file로 시작하고 끝이 1에서4로된 파일들을 리스트하라.
[#] ls –al file[1-4]

현재 디렉토리에서 s나 t로 시작하고 file이란 이름으로된 모든 파일을 리스트하라.
[#] ls –al [st]file




File 압축

파일들을 압축하면 파일을 전송하거나 백업 받을 때 그 데이터 량이 줄어들어 시간이 절약되어 효율적인 관리와 운용이 된다. 관련된 명령어들로는 compress, uncompress, zcat등이 있다.

compress 명령어

단순히 compress 명령어를 이용할 때에는 파일 한 개만 압축한다. uncompress도 압축을 풀지만 compress의 옵션 –d를 이용하면 압축을 풀 수도 있다. 해당 파일 이름에 대문자 Z를 가진 확장명 이름으로 생기며 원본 파일은 없어지고 압축된 파일 이름으로만 존재한다. 가령 menu란 파일을 압축한다고 하여보자.
[#] ls –al menu
-rw-r--r-- 1 shchoi other 1167 Dec 23 18:22 menu
[#] compress menu
[#] ls –al menu
-rw-r--r-- 1 shchoi other 708 Dec 23 18:22 menu.Z

임의의 디렉토리 밑에 있는 파일들 전체를 압축하고 할 때에는 wildcard 문자 *를 이용하면 가능하나 임의의 디렉토리밑에 있는 또다른 디렉토리가 있다면 이 디렉토리들은 압축하지 못한다. 여기에 있는 파일들만 압축한다면 압축하는 의미가 없을 것이다. compress 명령어는 디렉토리를 압축하지 못하는 예를 들어보자. 그러면 아래와 같이 에러가 발생한다.
[#] ls –al
drwxr-xr-x 4 shchoi other 96 Dec 28 15:00 file1
[#]compress file1
UX:compress: INFO: file1: -- not a regular file: unchanged

한 디렉토리밑에 있는 모든 파일과 디렉토리들을 압축하려면 tar나 cpio 명령어를 이용하여 한 개의 파일로 만들어 버린후에 압축한다면 가능하다. 지금부터 하는 작업은 test1 디렉토리밑에 있는 파일들과 디렉토리들을 압축한다고 하여보자.
$ test1> ls -al
drwxr-xr-x 2 shchoi other 96 Dec 28 14:59 subfile1
drwxr-xr-x 2 shchoi other 96 Dec 28 15:00 subfile2

다음은 tar를 이용하여 통 파일로 만들어 보자. .tar나 .cpio 확장명은 안 붙여도 이상은 없으나 나중에 무슨 포멧으로 만들었는지를 알아보기 위해 사용한 포멧명을 붙여주는 것이 좋다. 다음 tar와 cpio 각각에 대해 통파일로 만들어 보았다. 통파일 이름은 임의의 특성있는 이름으로 주면 된다. 그리고 마지막에 통파일로 만든 후에 위에서 언급한 한 개의 파일을 압축하는 방식을 사용하면 된다.

$ tar cvf tcomp.tar *
a subfile1/ 0 tape blocks
a subfile1/cake 1 tape block
a subfile2/ 0 tape blocks
a subfile2/hello 1 tape block
$ ls -al
drwxr-xr-x 2 shchoi other 96 Dec 28 14:59 subfile1
drwxr-xr-x 2 shchoi other 96 Dec 28 15:00 subfile2
-rw-r--r-- 1 shchoi other 20480 Dec 28 15:11 tcomp.tar
$ compress tcomp.tar
$ ls –al tcomp*
-rw-r--r-- 1 shchoi other 1616 Dec 28 15:11 tcomp.Z

$ find . -print|cpio -ocvB >tcomp.cpio
.
subfile1
subfile1/cake
subfile2
subfile2/hello
10 blocks
$ ls -al
total 12
drwxr-xr-x 4 shchoi other 96 Dec 28 15:21 .
drwxr-xr-x 3 shchoi other 1024 Dec 28 15:02 ..
drwxr-xr-x 2 shchoi other 96 Dec 28 14:59 subfile1
drwxr-xr-x 2 shchoi other 96 Dec 28 15:00 subfile2
-rw-r--r-- 1 shchoi other 5120 Dec 28 15:21 tcomp.cpio
$ compress tcomp.cpio
$ ls –al tcomp*
-rw-r--r-- 1 shchoi other 500 Dec 28 15:21 tcomp.cpio.Z

위의 결과를 비교해 보면 tar에 비해 cpio가 압축률이 더 좋음을 알 수 있다. 압축이 되면 파일 끝에 Z 확장명이 붙음을 알 수 있다. 압축을 푸는 방법은 다음과 같이 –d 옵션을 이용하고 압축된 파일 이름을 적어 주면 된다. 압축된 파일을 원하는 장소나 디렉토리로 이동시킨후 다음과 같은 방법으로 tar나 cpio 각각에 대해 압축을 풀어주면 된다.
$compress –d tcomp.tar.Z
$tar xvf tcomp.tar

$ compress –d tcomp.cpio.Z
$ cpio -icduvB < tcomp.cpio
.
subfile1
subfile1/cake
subfile2
subfile2/hello
10 blocks



uncompress 명령어

uncompress나 compress –d 명령어나 같은 결과를 얻는다. 사용하는 방법은 다음과 같다.

$ compress –d tcomp.cpio.Z
$ uncompress tcomp.cpio.Z

zcat 명령어

이 명령어도 압축을 푸는데 사용한다. 아래와 같이 cpio로 압축되어 있는 파일을 풀어보자.
$ ls –al tcomp*
-rw-r--r-- 1 shchoi other 501 Dec 28 16:11 tcomp.cpio.Z
$ zcat tcomp.cpio|cpio -icdvB
.
subfile1
Existing "subfile1/cake" same age or newer
subfile2
Existing "subfile2/hello" same age or newer
10 blocks

$ ls –al tcomp*
-rw-r--r-- 1 shchoi other 1619 Dec 28 16:15 tcomp.tar.Z
$ zcat tcomp.tar.Z|tar xvf -
x subfile1/, 0 bytes, 0 tape blocks
x subfile1/cake, 73 bytes, 1 tape block
x subfile2/, 0 bytes, 0 tape blocks
x subfile2/hello, 18 bytes, 1 tape block
(*.222.18.148)