2010. 11. 3. 13:01

Ubuntu File Type 이해하기

directory나 정규 파일(regular file)등은 가장 자주 사용되는 file type중 하나입니다. 그러나, Linux에서는 몇개의 더 많은 file type이 있습니다. Command로 여러 type의 file을 생성, 검색, 그리고 나열할 수 있습니다.
컴퓨터에 연결된 H/W Component에 접근이 제공되는 file을 device file이라고 합니다. 이러한 device file에는 character device와 block device가 있습니다. 다른 위치로 부터 동일한 file 접근을 가지는 hard link와 soft link를 만들 수 있습니다. 종종 user에 의해 named pipe나 socket등을 사용하여, 다른 이들과 통신할 수 있는 access point를 제공받을 수 있습니다.


정규(Regular) 파일 사용하기

정규 파일은 데이터 파일(문서, 음악, 이미지, ...)와 명령(바이너리, Script)로 구성되어 있습니다. file 명령으로 파일의 타입을 구별할 수 있습니다.
$ cd /usr/share/doc
$ file doc-base/install-docs.html
doc-base/install-docs.html: XML  document text
$ file doc-base/copyright
doc-base/copyright: ASCII English text
$ file doc-base/doc-base.html
doc-base/doc-base.html: directory
$ file doc-base/changelog.gz
doc-base/changelog.gz: gzip compressed data, from Unix, max compression
$ file /usr/share/doc/foo2zjs/manual.pdf
/usr/share/doc/foo2zjs/manual.pdf: PDF document, version 1.4

데이터를 저장할 수 있는 응용프로그램에 의해 정규 파일 생성이 이뤄질 수 있습니다. 만약 시작시 비어있는 파일을 만들기는 많은 방법이 있는데 그 중 일부는 다음과 같습니다.
$ ls
$ touch newfile.txt
$ > newfile2.txt
$ ls -la
total 8
drwxr-xr-x 2 greenfish greenfish 4096 2010-10-19 00:21 .
drwxr-xr-x 3 greenfish greenfish 4096 2010-10-19 00:20 ..
-rw-r--r-- 1 greenfish greenfish    0 2010-10-19 00:21 newfile2.txt
-rw-r--r-- 1 greenfish greenfish    0 2010-10-19 00:20 newfile.txt

위와 같이 ls -l 을 이용하여 파일 타입을 확인할 수 있습니다.
10문자의 permission 정보(-rw-r--r--)가 정규 파일임을 확인시켜 줍니다. 그리고 다음과 같이 실행 파일도 확인해줍니다.
$ ls -l /usr/bin/apropos
lrwxrwxrwx 1 root root 6 2010-09-30 16:27 /usr/bin/apropos -> whatis
$ file /usr/bin/apt-key
/usr/bin/apt-key: POSIX shell script text executable
$ file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped

apropos 명령은 소유자, 그룹, 그리고 다른 명령(whatis)에 의해 실행됨을 알 수 있습니다. apt-key는 shell script 파일임을 알 수 있으며, ls 명령 파일은 binary 실행 파일임을 알 수 있습니다.


Directory 사용하기

directory는 file과 subdirectory의 집합체입니다. directory는 root(/)로 부터 계층적으로 구성되어 있으며, / 문자로 구별되어 있습니다. directory는 GUI상에서 접근할때는 folder라고 불려지기도 합니다.

새로운 directory를 만들려면, mkdir을 사용합니다. 아래는 그 예를 보여주고 있습니다.
$ mkdir /tmp/new
$ mkdir -p /tmp/a/b/c/new
$
mkdir -m 700 /tmp/new2
$ ls -la /tmp/new2
total 8
drwx------  2 greenfish greenfish 4096 2010-10-19 00:33 .
drwxrwxrwt 10 root      root      4096 2010-10-19 00:33 ..

첫번째는 /tmp/new를 생성하는 것을 보여줍니다. 두번째는 a, b, c, new subdirectory를 차례대로 만들어 줍니다. 세번째는 drwx----- 권한으로 생성합니다.


symbolic link와 hard link 사용하기

file이나 directory를 file system의 다른 directory에 복사하는 대신, link를 사용하면, 많은 위치에서 부터 동일한 file로 접근할 수 있습니다. linux는 soft link(symbolic link)와 hard link를 지원합니다.

만약 임의의 file을 가리키고 있는 symbolic link를 open하거나 변경할 때, 당신이 실행한 명령은 link의 대상 file이나 directory를 접근하는 것처럼 행동합니다. symbolic link를 통해서는 대상의 권한이나 소유를 확인할 수 없습니다. symbolic link는 target에 대해 다른 disk partition에도 위치할 수 있습니다. 심지어, 대상이 존재하지 않더라도, symbollic link는 존재할 수 있습니다.

hard link는 file에만 사용할 수 있으며, 동일한 physical file에 다양한 이름을 부여할 수 있도록 합니다. 모든 physical file은 file 그 자체가 있으므로, 최소한 한개 이상의 hard link를 가지고 있는 셈입니다. 동일한 phisical file을 가리키는 추가적인 hard link는 대상 file과 동일한 disk partition에 있어야 합니다. (사실, hard link는 inode 번호가 동일한 file입니다.) 권한, 소유, 날짜 혹은 hard link의 내용을 변경하는 것은 같은 대상을 가리키고 있는 다른 hard link에도 영향을 줍니다. 그러나 하나의 link를 지우는것이 대상 file을 지우지는 못합니다. 즉 마지막 link가 지워져야 비로소 대상 file의 삭제가 이뤄집니다.
$ touch myfile
$ ln myfile myfile-hardlink
$ ln -s myfile myfile-symlink
$ ls -li myfile*
133615 -rw-r--r-- 2 greenfish greenfish 0 2010-10-19 00:52 myfile
133615 -rw-r--r-- 2 greenfish greenfish 0 2010-10-19 00:52 myfile-hardlink
133619 lrwxrwxrwx 1 greenfish greenfish 6 2010-10-19 00:52 myfile-symlink -> myfile

hard link와 symbolic link를 만들었으며, ls -li 명령을 통해 그 결과를 확인하고 있습니다. -li 옵션은 각 file의 inode의 연결을 보여주도록 합니다. myfile과 myfile-hardlink는 133615 inode를 공유하고 있습니다. 이에 반해 myfile-symlink는 다른 inode값으로 되어 있습니다. 권한 부분에서, hard link는 -로 표시되어 file로 간주되지만, symbolic link는 l로 표시되어 있습니다. symbolic link는 그 file을 접근할 때, 대상 파일에 대해 굳이 알 필요는 없습니다.


Device File 사용하기

응용 프로그램이 Hardware랑 통신이 필요할 때가 있을 때, device file을 통해 접근할 수 있습니다. 해당 file들은 /dev directory에 저장되어 잇습니다. device는 block device(저장 매체 등등)와 character device(serial port나 terminal device 등등)으로 구분됩니다.

각각의 device file들은 major number(device의 종류를 가리킴)와 연계되어 있습니다. 예를 들어, terminal(tty) device는 major character device 4로 표현되며, SCSI hard disk는 8로 되어 있습니다.
$ ls -l /dev/tty0 /dev/sda1
brw-rw---- 1 root disk 8, 1 2010-10-18 16:43 /dev/sda1
crw--w---- 1 root root 4, 0 2010-10-18 16:42 /dev/tty0

device 이름과 숫자는 man MAKEDEV으로 확인할 수 있습니다. 대부분의 device file은 부팅시 자동으로 생성됩니다. 그래서 대부분의 사람들은 device file을 손수 만드는 경우는 없습니다. 그러나 mknod 명령으로 당신만의 고유한 device file을 생성할 수 있습니다.


Named pipe와 Socket 사용하기

다른 process와 통신을 원한다면, pipe(|)을 사용할 수 있습니다. 그러나 특정 상황의 처리를 위한 통신을 제공하기 위해서는 naed pipe나 socket이 필요합니다. named pipe는 local system의 process간 통신을 위해서 사용됩니다. 그리고 network를 통한 통신은 socket이 사용됩니다.

named pipe와 socket은 /tmp directory에 종종 저장됩니다. 그것의 예와 당신만의 named pipe를 생성하기 위한 그 예는 아래와 같습니다.
$ ls -l /tmp/.X11-unix/X0
srwxrwxrwx 1 root root 0 2010-10-18 16:43 /tmp/.X11-unix/X0
$ mkfifo mypipe
$ ls -l mypipe
prw-r--r-- 1 greenfish greenfish 0 2010-10-19 01:17 mypipe