본문 바로가기
이카루스의 날개/LINUX

리눅스 파일시스템 및 마운트

by 윙혼 2013. 12. 26.

파일시스템 관리

리눅스 file system 구조

부트블록
(Boot Block)
Block group 0Block group 1

  ....

Block group n - 1  Block group n


그리고 각 block 그룹은 아래처럼 구성되어 있다.

>

super blockgroup descriptorblock 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 번호 등]를 저장하고있는 부분.
- 파일 하나당 하나의 아이노드가 사용됨.
- 파일의 형태와 무관하게 아이노드 블록을 가지게 됨

데이터 블록

- 실제 데이터 내용이 저장되는 디스크 영역

*file type

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

mount -t 파일시스템타입 -o 옵션 device 마운트포인터

ex) mount -t ext3 -o ro,nosuid /dev/sdc1 /mnt/data

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 명령의 메뉴얼 페이지를 
참고 바랍니다.

*** 마운트 설정 예제 ***
/var/log 디렉토리의 모든 파일을 다른 파티션으로 옮겨서 관리하기

옮기는 디스크 파티션을 /dev/sdc1 으로 가정한다.
fdisk /dev/sdc 로 주 파티션을 전체크기로 하나로 만든다.
그다음 mkfs -t ext3 /dev/sdc1
mount /dev/sdc1  /mnt/d3p1
cp -rp /var/log/*  /mnt/d3p1
그다음 rm -rf /var/log/* 
그리고 /etc/fstab 파일을 편집기로 열어서 맨 아래에
LABEL=/var/log  /var/log ext3 defaults 1 2 
추가한다.
그리고 e2label  /dev/sdc1 /var/log  로 라벨명을 설정한다.
그다음 확인은 
umount -a ; mount -a  한다음
df 명령어로 확인하였을때
/dev/sdc1             198M  7.4M  180M   4% /var/log

장치명과 마운터포인터가 제대로 표시되면 성공.


'이카루스의 날개 > LINUX' 카테고리의 다른 글

리눅스 파일 타입  (0) 2013.12.31
파일시스템 생성작업  (0) 2013.12.26
작업예약 schedule - cron / at  (0) 2013.12.23
vi 편집기  (0) 2013.12.14
페도라 리눅스  (0) 2013.12.14

댓글