파일시스템 관리
리눅스 file system 구조
부트블록
(Boot Block) |
Block group 0 |
Block group 1 |
.... |
Block group n - 1 |
Block group n |
그리고 각 block 그룹은 아래처럼 구성되어 있다.
>
super block |
group descriptor |
block bitmap |
inode bitmap |
inode table |
data blocks |
*. 이러한 파일시스템 구조는 파일시스템 생성시 만들어진다.
부트블록(부트섹터)
- 운영체제를 부팅시키기 위해 필요한 코드를 저장
- 대부분의 파일스템들은 부트블록으로 시작
- 하드웨어가 부팅에 필요한 코드를 부트블록에서 찾는다.
슈퍼블록
- 블록 그룹의 가장 앞에 위치.
- 파일시스템과 관련된 정보를 담고 있음. 파일 시스템의 전체 크기,마운트정보 등..
- 리눅스 운영체제는 슈퍼블록의 정보를 사용하여 파일시스템을 관리함.
- 다른 블록그룹에 있는 슈퍼블록도 똑 같은 내용을 가지고 있는 사본이다.
. 매직넘버 - ext 파일시스템의 슈퍼블록임을 의미하는 숫자
. 마운트횟수 - 얼마나 많이 마운트 되었는지를 나타낸다.
.블록그룹번호 - 파일시스템내에서 몇 번째 블록인지를 나타내는 번호
블록크기 - 파일시스템의 기본 블록크기를 바이트 단위로 표시(예를들면 1024byte)
그룹당 블록수 - 하나의 그룹에 속하는 블록 갯수
free blocks - 할당되지 않은 block 갯수
free inode - 할당되지 않은 inode 갯수
first inode - 파일시스템내의 가장 첫 번째 inode 번호
group 디스크립터 table
- 해당 파일시스템 내의 모든 블록 그룹에 대한 정보를 기록.
- 다른 블록그룹에 있는 group 디스크립터 영역도 똑 같은 내용을 가지고 있는 사본이다.
. 첫 번째 inode table block 의 블록번호
. 그룹내의 free block 갯수
. 그룹내의 inode 갯수
. 디렉토리갯수
block bitmap - 블록 그룹에서 블록의 할당 상태를 나타내는 맵, 블록을 할당하거나 해제 할 때 사용된다.
inode bitmap - inode 의 할당 상태를 나타내는 맵, inode를 할당하거나 해제 할 때 사용
아이노드(inode = index node) 블록
- 파일의 정보[접근권한/소유주/파일크기/inode 번호 등]를 저장하고있는 부분.
- 파일 하나당 하나의 아이노드가 사용됨.
- 파일의 형태와 무관하게 아이노드 블록을 가지게 됨
데이터 블록
- 실제 데이터 내용이 저장되는 디스크 영역
filesystem mount
- 리눅스에서 파일시스템에 접근하기 위해서 마운트라는 개념을 사용한다.
- 모든 블록장치파일은 마운트를 하지 않으면 사용할 수 없다.
- mswindows 의 C: 나 D: 같은 드라이버 문자를 통해서 장치파일에 접근할 수는 없다.
시스템의 마운트 정보는 df(disk free) 명령으로 확인할 수 있다.
man mount
MOUNT(8) Linux Programmer's Manual MOUNT(8)
NAME
mount - mount a file system
SYNOPSIS
mount [-lhV]
mount -a [-fFnrsvw] [-t vfstype] [-O optlist]
mount [-fnrsvw] [-o options [,...]] device | dir
mount [-fnrsvw] [-t vfstype] [-o options] device dir
DESCRIPTION
All files accessible in a Unix system are arranged in one big tree, the
file hierarchy, rooted at /. These files can be spread out over sev-
eral devices. The mount command serves to attach the file system found
on some device to the big file tree. Conversely, the umount(8) command
will detach it again.
[root@river root]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda2 2016044 117772 1795860 7% /
/dev/hda1 295564 13284 267020 5% /boot
/dev/hda5 3020140 1987440 879284 70% /home
/dev/hda8 1004024 24536 928484 3% /private1
/dev/hda10 1004024 16428 936592 2% /private2
none 256900 0 256900 0% /dev/shm
/dev/hda7 2016016 34572 1879032 2% /tmp
/dev/hda3 10080520 2924472 6643980 31% /usr
/dev/hda6 3020140 112892 2753832 4% /var
/dev/hdb2 10807976 845260 9413696 9% /home1
기본출력은 block 단위이다.
대부분의 사용자에게 좀 더 익숙한 byte 단위로 출력하려면 아래처럼 -h 옵션을 추가하면 된다.
[root@river root]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda2 2.0G 116M 1.8G 7% /
/dev/hda1 289M 13M 261M 5% /boot
/dev/hda5 2.9G 1.9G 859M 70% /home
/dev/hda8 981M 24M 907M 3% /private1
/dev/hda10 981M 17M 915M 2% /private2
none 251M 0 251M 0% /dev/shm
/dev/hda7 2.0G 34M 1.8G 2% /tmp
/dev/hda3 9.7G 2.8G 6.4G 31% /usr
/dev/hda6 2.9G 111M 2.7G 4% /var
/dev/hdb2 11G 826M 9.0G 9% /home1
[root@river root]#
각 파일시스템의 총 용량,현재 사용량, 남은 공간등의 정보를 확인할 수 있다. /dev/shm 을 제외한 각 라인은
리눅스 파일시스템 정보이다. 파티션 설정은 되어 있으나 마운트 되지 않은 정보는 출력되지 않는데 그러한 정보는
파티션 설정 명령어인 fdisk 명령으로 확인할 수 있다.
[root@river root]# fdisk -l
Disk /dev/hda: 40.0 GB, 40060403712 bytes
255 heads, 63 sectors/track, 4870 cylindevs
Units = cylindevs of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 38 305203+ 83 Linux
/dev/hda2 39 293 2048287+ 83 Linux
/dev/hda3 294 1568 10241437+ 83 Linux
/dev/hda4 1569 4870 26523315 f Win95 Ext'd (LBA)
/dev/hda5 1569 1950 3068383+ 83 Linux
/dev/hda6 1951 2332 3068383+ 83 Linux
/dev/hda7 2333 2587 2048256 83 Linux
/dev/hda8 2588 2714 1020096 83 Linux
/dev/hda9 2715 2779 522081 82 Linux swap
/dev/hda10 2780 2906 1020096 83 Linux
Disk /dev/hdb: 20.0 GB, 20060135424 bytes
255 heads, 63 sectors/track, 2438 cylindevs
Units = cylindevs of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hdb1 * 1 51 409626 83 Linux
/dev/hdb2 52 1418 10980427+ 83 Linux
/dev/hdb3 1419 2055 5116702+ 83 Linux
/dev/hdb4 2056 2438 3076447+ f Win95 Ext'd (LBA)
/dev/hdb5 2056 2372 2546271 83 Linux
[root@river root]#
이 시스템은 ide 타입은 디스크가 2개 연결되어 있으며 각각 primary master와 primary slave 이다.
그리고 첫 번째 디스크에는 10개의 파티션 정보가 있으며 주 파티션의 세 개, 확장 파티션 1개, 그리고
확장 파티션 안에 있는 논리 파티션이 6개 있다. 그 중 하나는 스왑파티션으로(/dev/hda9) 가상메모리로
사용될 영역이다. 리눅스에서 주 파티션은 최대 4개까지 만들 수 있으며 나머지는 확장 파티션 안에 있어야
한다.
출력결과에서
/dev/hda4 1569 4870 26523315 f Win95 Ext'd (LBA)
이 부분이 확장 파티션을 의미한다.
마운트는 파일시스템을 붙이는 것을 의미한다. 쉽게 생각하면 파일시스템이 생성되어 있는
블록장치 파일을 특정 디렉토리에 연결하는 작업으로 생각해도 된다.
마운트 명령어 자체는 단순하며 디바이스 이름과 파일시스템 타입을 알고 있으면 된다.
그 두 가지만 알면 리눅스에서 지원하는 모든 파일시스템에 접근할 수 있다. 그 두 가지를 알아보자
장치명
마운트 대상은 하드디스크, 시디롬, 플로피디스크등 블록장치 파일이 일반적인 대상이다.
하드디스크는 ide 타입과 scsi 디스크 타입으로 나눠볼 수 있는데
ide 타입의 디스크 장치는
hda : primary master
hdb : promary slave
hdc : secondary master
hdd : secondary slave
위와 같은 이름을 갖는다. scsi 디스크인 경우에는 첫번째가 sda 두 번째 디스크는 sdb 와 같은 형태로 이름이
붙게 되며 디스크 안에 분할된 파티션의 이름은 순서대로 sda1, sda2 와 같은 이름을 갖는다.
ide 타입인 경우에는 hda1, hda2 ... 의 이름을 갖는다.
파일시스템의 종류.
minix : 과거에 리눅스가 minix 머신에서 돌아갈 때, 리눅스가 사용한 파일시스템. 현재는 사용안됨.
xiafs,extfs : 과거의 리눅스 파일시스템. 지금은 사용하지 않는다.
ext2fs : 리눅스 파일시스템. 현재는 많이 사용하지는 않는다.
ext3fs : 리눅스 파일시스템. ext2 파일시스템에 이어서 나온 파일시스템, 요즘은 ext2fs 대신 이 파일시스템이 많이 사용된다.
vfat : fat16, fat32를 리눅스에서 지원하기 위해서 개발된 가상의 파일시스템.
ntfs : windows nt 파일시스템
iso9660 : 시디롬 파일 시스템
nfs : network file system. 이 파일 시스템을 사용하기 위해서는 nfs 서버가 구성되어 있어야 한다.
*. ext2 와 ext3 파일시스템 비교
ext2 의 단점
- 갑작스러운 시스템 다운(정전)이 되었을 경우 마운트해제되지 않은 데이터들에 대한 데이터가 유실되는 일이 종종 있었다.
-. 모든 파일시스템은 마운트할 수 있는 횟수가 제한되어 있었다.
그래서 ext2 파일 시스템에서는 마운트 제한(maximum mount)에 도달하였을 경우에 데이터 유실을 방지하기 위해서
fsck를 실행하도록 되어 있었다.
- fsck를 실행하더라도 한계가 있었다
즉, 파일시스템의 크기에 따라서 fsck를 실행하는 것이 무의미한 작업일 경우가 있었다.
파일시스템의 크기가 너무 작을 경우 fsck로 점검하는 것이 무의미했다.
그리고 파일시스템의 크기가 너무 큰 경우에는 시간이 너무 오래 걸려서
복구작업과 부팅시간이 너무 오래 걸리는 단점이 있었다.
ext3의 장점 :
- ext3 파일시스템에서는 기록된 인덱스 로그를 이용하여 복구할 수 있도록 하였다.
그래서 갑작스러운 시스템 다운시 부팅시간을 단축할 수 있게 되었다.
즉, fsck로 파일시스템을 일일이 채크하지 않아도 인덱스로그를 이용하기 때문에
복구시간과 부팅시간이 단축된다는 점이다.
*. 저널링 파일 시스템의 종류에는 ext3, reiserfs, XFS등이 있다.대표적인 것이 ext3이다.
마운트 명령어 형식.
mount -t 파일시스템타입 디바이스명 마운트포인터
ex)
mount -t vfat /dev/hda1 /mnt/mswin
mount -t iso9660 /dev/hdc /mnt/cdrom
mount -t ext3 /dev/sad5 /home
블록장치가 더 이상 필요하지 않으면 마운트 해제(흔히 unmount 라고도 한다) 할 수 있다.
unmount 한 장치는 다시 마운트 할때까지 아무도 사용할 수 없다. 만약 시디롬을 다 사용하고
시디를 꺼내려면 반드시 시디롬 장치파일을 unmount 해야 한다. unmount 하는 명령어는 umount 이다
umount
umount 마운트포인터 또는 디바이스파일명. 일반적으로 마운터 포인터를 많이 사용한다.
umount 마운트포인터 또는 디바이스파일명. 일반적으로 마운터 포인터를 많이 사용한다.
ex)
[root@river private1]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda2 2016044 117772 1795860 7% /
/dev/hda1 295564 13284 267020 5% /boot
/dev/hda5 3020140 1987440 879284 70% /home
/dev/hda8 1004024 24536 928484 3% /private1
/dev/hda10 1004024 16428 936592 2% /private2
none 256900 0 256900 0% /dev/shm
/dev/hda7 2016016 34572 1879032 2% /tmp
/dev/hda3 10080520 2924472 6643980 31% /usr
/dev/hda6 3020140 112896 2753828 4% /var
/dev/hdb2 10807976 845260 9413696 9% /home1
[root@river private1]#
테스트로 /hda8을 언마운트해보자.
[root@river private1]# umount /private1
umount: /private1: device is busy
[root@river private1]#
[root@river private1]# pwd
/private1
[root@river private1]#
사용중이라는 메세지가 출력되었다. 사용 중인 장치파일은 언마운트 되지 않는다.
현재의 디렉토리가 /private1 이므로 hda8 장치는 사용 중이다.
[root@river private1]# cd ..
[root@river /]# umount /private1
[root@river /]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda2 2016044 117772 1795860 7% /
/dev/hda1 295564 13284 267020 5% /boot
/dev/hda5 3020140 1987440 879284 70% /home
/dev/hda10 1004024 16428 936592 2% /private2
none 256900 0 256900 0% /dev/shm
/dev/hda7 2016016 34572 1879032 2% /tmp
/dev/hda3 10080520 2924472 6643980 31% /usr
/dev/hda6 3020140 112904 2753820 4% /var
/dev/hdb2 10807976 845260 9413696 9% /home1
[root@river /]#
/private1 디렉토리가 보이지 않는다. 마운트 해제 되었다.
이제 다시 마운트 해보자.
[root@river /]# mount -t ext3 /dev/hda8 /private1
[root@river /]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda2 2016044 117772 1795860 7% /
/dev/hda1 295564 13284 267020 5% /boot
/dev/hda5 3020140 1987440 879284 70% /home
/dev/hda8 1004024 24536 928484 3% /private1
/dev/hda10 1004024 16428 936592 2% /private2
none 256900 0 256900 0% /dev/shm
/dev/hda7 2016016 34572 1879032 2% /tmp
/dev/hda3 10080520 2924472 6643980 31% /usr
/dev/hda6 3020140 112920 2753804 4% /var
/dev/hdb2 10807976 845260 9413696 9% /home1
[root@river /]#
다시 mount 된 것을 확인 할 수 있다. 이 상태에서 /private1 디렉토리에 파일을 만들면
/dev/hda8 영역에 만들어진다.
그리고 마운트가 해제 된 상태에서 파일을 만들면 그 파일은 /dev/hda2 만들어진다.
다른 장치파일들도 다 마찬가지이다.
장치명과 파일시스템이 다르더라도 마운트 형식과 의미는 같다.
마운트 설정 파일이 etc 디렉토리 밑에 있다. 파일명은 fstab 이며 아래와 같은 포맷으로 되어 있다.
[root@river /]# cat /etc/fstab
LABEL=/ / ext3 defaults 1 1
LABEL=/boot1 /boot ext3 defaults 1 2
none /dev/pts devpts gid=5,mode=620 0 0
LABEL=/tmp /home ext3 defaults 1 2
LABEL=/var1 /private1 ext3 defaults 1 2
LABEL=/private2 /private2 ext3 defaults 1 2
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0
LABEL=/tmp1 /tmp ext3 defaults 1 2
LABEL=/usr /usr ext3 defaults 1 2
LABEL=/var /var ext3 defaults 1 2
/dev/hdb2 /home1 ext3 defaults 1 2
/dev/hda9 swap swap defaults 0 0
/dev/cdrom /mnt/cdrom udf,iso9660 noauto,owner,kudzu,ro 0 0
[root@river /]#
* 자세한 내용은 메뉴얼 페이지를 참조
가장 왼쪽은 디바이스명이나 LABEL 명이 온다. 두 번째는 마운트 포인터, 그리고 세 번째는 파일시스템타입,
네번째는 옵션으로 defaults 는 읽기, 쓰기에 해당된다. 그리고 마지막에 숫자는 부팅 시 파일시스템 체크 여부에 관한
것으로 숫자 0이 적혀있는 장치명에 대해서는 부팅 시 파일시스템 검사를 하지 않겠다는 의미이다.
부팅 시 /etc/fstab 파일이 읽혀지며 fstab에 설정되어 있는 마운트 장치명은 자동으로 마운트 되게 할 수 있다.
그리고 fstab는 mount 명령이 참조하는 파일이기도 하다. fstab 설정이 잘못되면 부팅이 정상적으로 되지 못한다.
fstab 파일설정이 위와 같다면
mount -t ios9660 /dev/cdrom /mnt/cdrom 대신에
mount /dev/cdrom 또는 mount /mnt/cdrom 으로 해도 된다. mount 명령은 mount 명령의 인수를
fstab 파일의 각 행에서 찾은 후 일치하는 부분이 있다면 mount 명령의 생략된 부분을 그것으로 대체한다.
fedora 9 에서는 내용이 조금 다릅니다. 아래와 같습니다.
[root@bega /]# cat /etc/fstab
UUID=8bd23abd-ca18-4609-a374-c407bf0b84b2 / ext3 defaults 1 1
UUID=1e12d149-8e26-401c-aa12-64fc2b5c0fdc /data ext3 defaults 1 2
UUID=69a544e6-4c4a-4a6f-a16a-0b3e6cb99d10 /home ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
UUID=30aa3f23-7e43-4599-9e1a-a2700c26b77e swap swap defaults 0 0
/dev/sdb1 /d2p1 ext2 defaults 1 1
LABEL=/d2p2 /d2p2 ext3 defaults 1 1
UUID=9fd45246-21fd-4b55-8e09-585d7741b363 /d2p6 ext3 defaults 1 1
[root@bega /]#
UUID 라는것으로 LABEL 명이나 장치명을 대신할 수 있습니다.
UUID (Universal Unique IDentifier) 는 네트워크 상에 있는 개체 식별자라는 의미로
디스크 장치도 서버상에서 하나의 개체 식별자로서 구분하겠다는 의미입니다.
*. 장치명에 label 을 보거나 설정하는 명령은 아래와 같습니다.
[root@bega /]# e2label
Usage: e2label device [newlabel] <= label 을 설정하거나 수정할때.
[root@bega /]# e2label /dev/sda1 <= 장치의 label을 확인할때.
/
[root@bega /]# e2label /dev/sda3
/home
[root@bega /]#
UUID 값은 파일시스템 생성시 자동으로 할당되며 수정할 수도 있습니다.
UUID 값 수정 및 확인은 tune2fs 명령어로 할 수 있습니다.
[root@bega /]# tune2fs -l /dev/sda3 | grep UUID
Filesystem UUID: 69a544e6-4c4a-4a6f-a16a-0b3e6cb99d10
*. UUID 값을 변경하려면 아래와 같이 하면 됩니다.
[root@bega /]# tune2fs -l /dev/sdb5 | grep UUID
Filesystem UUID: 5c20e325-6c0f-48e5-b22c-621a450182fb
[root@bega /]# tune2fs -U random /dev/sdb5
tune2fs 1.40.8 (13-Mar-2008)
[root@bega /]# tune2fs -l /dev/sdb5 | grep UUID
Filesystem UUID: f75ca609-97c1-4802-b8fe-164d376aed8d <= 변경되었습니다.
[root@bega /]#
*. UUID 값을 제거하는것은 위에 random 대신에 clear 를 적어주면 됩니다.
그리고 random 대신에 time 을 적어주더라도 마찬가지로 무작위로 UUID 값을
할당하게 됩니다. 그러나 file system 생성시 UUID 값이 할당되므로 굳이 직접
생성하는 경우는 잘 없으리라고 생각됩니다.
*. UUID 값을 다른 값으로 변경하는 경우 그 장치명이 사용하는 UUID 값이
fstab 에 등록되어 있는 장치라면 fstab 파일을 열어서 UUID 값을 일치하게 직접 수정해
주어야 합니다.
그렇지 않으면 부팅시 그 장치가 마운트가 되지 않고 정상적인 부팅이 안될 수 있습니다.
** 마운트할때 디폴트로 적용되는 옵션과 fstab 에 설정되어 있는 defaults 항목은
메뉴얼 페이지를 보면 아래의 옵션이 적용된다고 되어있습니다.
defaults
Use default options: rw, suid, dev, exec, auto, nouser, and async.
옵션설명 -
rw : 읽기,쓰기
ro : 읽기전용
suid : setuid 퍼미션 허용
nosuid:setuid 퍼미션 허용하지 않음
exec : 실행파일 실행권한 허용
noexec: 실행파일 실행권한 허용하지 않음
user:일반유저에게 마운트권한 허용
nouser : 일반사용자에게는 마운트 권한 허용하지 않음
auto : mount -a 명령어로 마운트할 경우 자동마운트 허용
*. 나머지 옵션에 대해서는 fstab file및 mount 명령의 메뉴얼 페이지를
참고 바랍니다.