- 파일시스템 - * 파일시스템이란? 파일과그안에든 자료를저장하고찾기쉽도록유지관리하는방법 * 파일시스템의종류 FAT 32 : window 9x 시리즈의파일시스템 NTFS : windows NT4.0, window 2000 이상의파일시스템 EXT2 : 구버전리눅스에서사용하는파일시스템 EXT3 : 현재리눅스에서널리사용되는파일시스템 UFS : 유닉스파일시스템 ( 솔라리스) NFS : 네트워크파일시스템 * 자기디스크 하드디스크, 플로피디스크등이있다. 1 하드디스크구조 플래터 : 비자성체인비금속( 알루미늄) 원판(disk) 표면에자성체인산화금속막을양면에도장(coating) 한것이다. 플래터위에촘촘히트랙을만들고섹터로구분하여데이터를저장할수있는공간을만들어준다. 포맷이라는작업을통하여구획을나누어주어야플래터에데이터를기록할수있다. 2 물리적구조 : 1. 트랙 : 디스크의표면에서헤더가돌아가는원모양의섹터들의모임이다. 2. 섹터 : 트랙을부채꼴모양으로분할한영역으로주소가부여되고 I/O의단위 1Sector = 512Byte 3. 실린더 : 동일한길이의반지름을가지는트랙들이상하로모여구성되는모임이다. 4. 클러스터 : 여러개의섹터를묶은단위. 3 기억용량의단위하드용량 = 트랙 섹터 면수 바이트실린더수 = 트랙수 KB(Kilo Byte) : 1,024Byte = 2 10 = 103 MB(Mega Byte) : 1,024KByte =2 20 = 106 GB(Giga Byte) : 1,024MByte = 2 30 = 109-47-
* 파일시스템의구조 VTOC 디스크라벨(Disk Label) VTOC 에서는디스크의첫번째섹터(512 바이트) 를차지하며, 각파티션에대한정보를담는다. 부트블록 (Boot Block) VTOC 다음의 15 섹터를차지하며, 부팅시최초실행되는 Bootstrap 프로그램이여기에위치한다. 또한디렉토리의가장상위에있는.(root directory)' 도여기에위치한다. 프라이머리슈퍼블록 (Primary Super Block) 16 섹터크기이며, 다음과같은정보를포함한다. 데이터블록의개수 실린더그룹의개수 데이터블록의크기및조각 (Fragment) 블록그룹번호 (block group number) 블록크기 (Block size) 그룹당블록수 (Block per group) 하드웨어정보 마운트포인트정보 ( 마운트횟수 (Mount count)) 파일시스템상태정보 매직넘버 (Magic Number) 개정레벨 (Rebision Level) 프리블록 (Free blocks) 프리 inode (Free Inode) 첫번째 Inode (First Inode) 백업슈퍼블록 (Backup Super Block) 백업슈퍼블록은슈퍼블록의중요성때문에각실린더그룹마다하나씩복사하여존재한다. 슈퍼블록이손상되더라도충분히복구가가능해진다. 따라서 실린더그룹블록 (Cylinder Group Block) 각실린더그룹에는다음과같은정보가저장된다. I-노드의개수 실린더그룹에속한데이터블록의개수 디렉토리의개수 실린더그룹내에사용하지않는블록, I-노드개수 데이터블록 (Data Blocks) 실린더그룹별데이터블록의기본크기는 8192 바이트다.(8KB) -48-
*i 노드테이블 : 실린더그룹에대한 I 노드들의정보를담고있다. 총 15 개의데이터블록포인터를가지고있다. 파일의종류와접근모드 inode 가어느파일에해당하는지나타내는정보와, 접근권한을나타내는정보가저장 파일의소유자및그룹에대한 UID와 GID 파일의크기 파일에마지막으로접근, 변조, i노드가변경된시간 데이터저장에사용된총데이터블록의수데이터저장된블록에대한포인터맨앞의 12블록은 inode 가실제데이터를가르키고있다. 간접블록과, 이중간접블록, 삼중간접블록은해당데이터를 i- 노드는이러한데이터블록에대한참조(Index) 정보를가지고있다. 각파일은각실린더그룹에속하며하나의 i- 노드에의해구성된다. i-node에는데이터블록에대해총 15 개의참조정보가있으며, 12번째데이터블록까지기본으로사용되며, 파일의크기가 96KB 를넘으면 13 번째의확장참조자가사용된다. 12번째까지데이터블록포인터는각각 8KB 의데이터블럭을가리킨다.(12 * 8=96KB) 13번째는파일이 16MB 이하의경우에사용된다. 2048 개의데이터블록포인터를갖는다. 16384KB ( 2048 * 8) 13번째포인터까지사용한경우최대파일의크기는 96+16384=16480KB 14번째는 32GB, 15번째는 70TB 까지이론상으로가능하다. 확장참조자가다시포인터만을가진간접데이터블록을한번더거치게된다. 사실상파일시스템에서크기가 1TB 이상인파일은존재할수없다. * 가상파일시스템 (The Virtual File System) < 구조 (The VFS structure) > VFS 는모든파일시스템이필요로하는일련의펑션을정의하고있다. 이러한인터페이스는세종류 대상과관련된일련의동작으로구성된다. 즉파일시스템, 아이노드, 열린파일이다. VFS 는커널에서지원하는파일시스템타입을알고있다. 이는커널구성동안에만들어지는테이블 을사용한다. 이테이블내의각엔트리가하나의파일시스템타입을정의한다. 즉파일시스템타입 의이름과펑션에대한포인터이다. 어떤파일시스템이마운트될때그에맞는마운트펑션이불려진다. 이펑션이디스크의슈퍼블 록을읽는것을담당하며, 내부변수를초기화하고 vfs에마운트된파일시스템디스크립터를돌려준 다. 파일시스템이마운트된후에 vfs 펑션은물리적인파일시스템루틴을접근하는데이디스크립터를 사용한다. 마운트된파일시스템디스크립터는모든파일시스템타입에공통된며가지의데이터를포 함한다. 물리적파일시스템커널코드에의해제공되는펑션에대한포인터와물리적인파일시스템 코드에필요한고유정보이다. 파일시스템디스크립터에포함된펑션포인터는 VFS가파일시스템내 부루틴을접근하는것을허용한다. 두가지의다른디스크립터가 VFS 에의해사용된다. 아이노드디스크립터와열린파일디스크립터이 -49-
다. 각디스크립터는사용중인파일에관련된정보와물리적인파일시스템코드에의해제공되는일련의동작을갖고있다. 아이노드디스크립터는어떤파일에대해서도사용되는펑션에대한포인터를포함하는데비해 (e.g. create, unlink) 파일디스크립터는열린파일에대해서만작동하는펑션에대한포인터를갖는다. (e.g. read, write) User process System calls System calls interface VFS FAT32 NTFS EXT2 EXT3 Buffer Cache Device dirvers Disk controler Linux kernel Hardware < 원리(Principle) > 리눅스커널은파일에대한시스템콜이있을때사용되어지는버츄얼파일시스템계층을갖고있다. VFS 는파일과관련시스템콜을다루는중간계층이며입출력을처리하기위해물리적인파일시스템코드에서필요한펑션을부른다. 이러한간접메커니즘은여러개의파일시스템형태의통합을쉽게하기위해유닉스계열운영체제에흔히사용된다. 어떤프로세스가파일관련시스템콜을일으킬때커널은 VFS 에포함된펑션을부른다. 이펑션은구조와독립적인조작을실행하고그요청을물리적인파일시스템코드에포함된펑션으로연결해준다. 물리적인파일시스템코드가구조에의존하는동작을담당한다. 파일시스템코드는장치에대해 I/O를요청하기위해버퍼캐쉬펑션을사용한다. 이구조가옆그림에설명되어있다. [ 장치파일(Device special files) ] 유닉스계열운영체제에서장치는특수파일에의해서접근될수있다. 장치파일은파일시스템에서어떤공간을사용하지는않는다. 이들은단지장치드라이버의접근점에불과하다. 두가지형태의장치특수파일이존재한다. 캐릭터와블록스페셜파일이다. 전자는캐릭터모드로입출력동작을허용하고후자는버퍼캐시기능을통해블록모드로데이터가쓰여져야한다. 특수파일에대해서입출력(I/O) 요청이일어날경우이들은가상장치드라이버((pseudo) device driver) 로포워딩된다. 특수파일은장치형태를구별해주는메이저넘버와각각의유니트를구별해주는마이너넘버로표현된다. [ 저널링파일시스템 ( Journaling FileSystem ) - ext3 파일시스템 ] 리눅스의표준파일시스템은 ext2 파일시스템입니다. Ext2 파일시스템은리눅스의표준파일시스템으로오랜동안안정적이고뛰어난성능을보여왔습니다. 그러나 ext2 파일시스템은정전이나시스템장애로인하여비정상적으로시스템이셧다운되었을때파일시스템이언마운트되지않은경우나 Maximal mount에도달하였을때데이터의손실을막기위하여데이터구조일치성을파일시스템이체크하도록되어있는데, 파일시스템이작을경우에는무의미할뿐더러파일시스템이큰경우에는부팅하는데상당한오랜시간이걸리는문제점이있습니다. 그래서부팅할때의시간을단축하면서비정상적인시스템종료시파일시스템을체크하지않고인덱스(index) 에대한로그를기록하여문제발생시이를복구할수있는대체파일시스템이요구되어등장한것이저널리파일시스템입니다. 리눅스에서지원하는저널링파일시스템으로 ext3, reiserfs, XFS 등이많이사용되고있습니다. 레드햇리눅스 9 버전은 ext2 파일시스템의대안으로 ext3 파일시스템을기본파일시스템으로지원합니다. Ext3 파일시스템은 ext2 파일시스템과호환성을유지하는파일시스템입니다. [ext3 파일시스템의이점 ] < ext3 파일시스템의가용성과데이터무결성 ( Data Integrity ) > 앞서언급한대로 ext2 파일시스템은예기치못한정전이나시스템충돌로인하여시스템이비정상종료되었을때다시부팅시파일일치성을 e2fsck 프로그램에의해서점검하게됩니다. Ext2 파일시스템에서는파일데이터를바로동기화시키지않기때문에이러한비상사태가일어나게되면데이터일치성이맞질않기때문에부팅시이를점검하게되는것입니다. 데이터일치성점검은파일시스템크기에따라서걸리는시간이달라질수있습니다. 수기가바이트의파일시스템을갖고있는경우라면파일시스템을체크하는데있어서상당한오래걸리며, 이시간동안에시스템을사용할수없는단점이있습니다. 그러나 ext3 파일시스템은변경되는파일데이터를바로동기화시키기때문에시스템이급작스럽게정지되더라도다음부팅시에는파일시스템을체크하지않고, 구조일치성 -50-
을체크하는데불과몇초밖에걸리지않기때문에부팅속도가빨라지는이점이있습니다. 항상파 일시스템의일치성을유지하고있어서데이터무결성을보장해주는이점이있습니다. < ext2 파일시스템에서 ext3 파일시스템으로변환용이 > 레드햇리눅스에서저널링파일시스템으로 reiserfs 파일시스템대신에 ext3를채택하게된것은 기존의 ext2 파일시스템과의호환성과변환이쉽기때문입니다. Tune2fs 프로그램으로사용하면 ext2 파일시스템에저널 ( journal ) 을추가하여 ext3 로변환할수있으며 ( 이때 tune2fs - j 파티 션 ) 으로저널링을추가해준다. 레드햇리눅스 9에서는 e2fsprogs 프로그램을지원하고있어서이 프로그램이설치되어있으면 ext3 파일시스템을거꾸로 ext2 파일시스템으로사용할수있게해줍 니다. 이와같이 ext3파일시스템은 ext2 파일시스템에서쉽게변환할수있는이점이있습니다. < 속도 > ext3 파일시스템은하드디스크의헤더동작을최적화시켜주기때문에동일한데이터를여러차례 반복저장하더라도 ext2 파일시스템에비해빠른속도를제공합니다. Ext3 파일시스템에서는데이 터일치성속도를최적화할수있는 data=writeback, data=ordered, data=journal 등세가지저널링 모드를제공하는데, /etc/fstab 파일에서마운트옵션으로저널링모드값을 data = 모드값 형태로 지정해주어사용할수있습니다. 레드햇리눅스에서는기본저널링기본값으로 data=ordered를지원 하며, 이모드는블록이순서대로디스크에저장되면서완전한데이터일치성을갖도록해줍니다. * fsck (File system check) 파일시스템이완전한상태를유지하고있는가를검사하고, 잘못된 것은바로잡아주는명령 사용법 #fsck [ 옵션] 검사파일시스템 [ 옵션] -a : 검사도중발견된에러를자동으로복구 -r : 검사도중에러가발견되면복구할것인가를묻는다. -V : 검색중각종정보를자세하게보여준다. 사용예 #fsck a /dev/hda1 * 사용량측정 df : 디스크의여유공간을보여준다 사용법 #df[ 옵션] 파일시스템 [ 옵션] -I : 블록여유용량대신 inode 사용정보를보고 -k, h : 여유용량을킬로바이트와메가바이트단위로출력 사용예 # df h /dev/hda du : 디스크의사용량을보여준다 사용법 #du[ 옵션] 디렉토리, 파일명 -s : 총합계만출력 -a : 크기가계산된각파일의크기를출력 -b,h,k : 메가바이트단위로출력 사용예 # du h /root *fdisk명령어 파티션생성명령 사용법 #fdisk/dev/ 장치명 명령 설명 a 부트파티션저장 l 지원가능한파티션보기 n 새파티션생성 t 파티션시스템유형변경 w 파티션정보저장 p 파티션설정상태확인 q 파티션정보및종료 d 파티션삭제 -51-
예) 파티션생성실습 Add 버튼을눌러하드디스크를추가한다. 용량은대충 0.3G 로잡자. -52-
1 디스크인식확인 fdisk l 장치명예 ) # fdisk -l /dev/hd* # fdisk -l /dev/sd* 2 디스크파티션생성 fdisk 장치명예 ) # fdisk /dev/sdb command (m for help) : fdisk 명령새로운파티션생성 : n Primary 또는 : P ( e extended, P Primary ) 파티션번호 :1( 파티션번호:1-4) 첫시작점선택 : 첫번째실린더선택 1 (1-307 size, default 1) 파티션크기선택 : +100M 3 파일시스템생성 # mkfs.ext3 /dev/sdb1 또는 mkfs -t ext3 /dev/sdb1 ext3 으로포맷, 4 마운트하기 #mkdir/user2 # mount -t ext3 /dev/sdb1 /user2 /user2 를이제사용하면된다. -53-
5 부팅시자동마운트 #vi/etc/fstab 부팅시마운트정보를저장하고있는파일저장후종료 * LVM (Logical Volume Manage) 여러개의하드디스크를 1개의파일시스템으로사용용량이작은 2개의하드디스크를이용할때서버운영시대용량의전용파일시스템공간마련용어요약 PhysicalVolume:/dev/hda1,/dev/hdb1 Volume Group : Physical Volume을합쳐서 1개의물리적그룹으로만드는것 Logical Volume : Volume Group 을나눠서논리적그룹으로나눔 (1 개이상) Physical Extent : PV가갖는일정한블록 Logical Extent : LV가갖는일정한블록 Mother Board Primary Secondary SCSI 장치 100GB SCSI 0:0 /dev/sda 100GB SCSI 0:1 /dev/sdb /lvmdata / 파티션 SWAP /mydata 200GB SCSI 0:2 /dev/sdc 실습 ) 1 LVM 할영역을만든다 # fdisk /dev/sda => /dev/sda3 를만든다. # fsiak /dev/sdb => /dev/sdb2 를만든다. 2 /dev/sda3 와 /dev/sdb2 의파티션타입을변경한다. commend : t Partition number (1-4): Hexcode:8e commend : p commend : w # reboot -54-
3 물리적인볼륨생성생성한디스크를 LVM으로사용하기위한선처리작업 pvcreate 장치명 # pvcreate /dev/sda3 #pvcreate/dev/sdb2 4 만든여러개의물리적볼륨을하나로묶자. 선처리작업을마친장치들을하나의가상그룹으로작성 vgcreate 가상그룹명장치명 # vgcreate SVG /dev/sda3 /dev/sdb2 # vgdisplay => 전체용량확인 5 볼륨파티션생성여러개의장치를사용가능한디스크로작성 lvcreate L 디스크용량 n 논리그룹명가상그룹명 볼륨그룹 /dev/svg 를논리그룹 /dev/svg/svg로분리 6 ext3으로포맷 # mkfs.ext3 /dev/svg/svg 7 마운트한다. #mkdir/user3 # mount /dev/svg/svg /user3 #df 8 LVM 지우기 #cd~ # umount /user3 # lvremove /dev/svg/svg #vgremovesvg * 디스크쿼터(QUOTA) 파일시스템마다사용자나그룹이생성할수있는파일의용량및개수를제한하는것 리부팅 /etc/fstab 수정 또는리마운팅 쿼터 DB 생성 # vi /etc/fstab 옵션부분에 defaults,usrquota 추가 # mount o remount,usrquota /RAIDdisk # cd /RAIDdisk # touch quota.user # chmod 600 quota.user # quotacheck a m # convertquota /RAIDdisk 시스템적용 # quotaon /RAIDdisk 개인별쿼터설정 # edquota 사용자 ID 1 저장공간을먼저만든다, ( 실습예는위에서 VLM 으로만든공간을사용해서한다. LVM 7번까지마운트한후) -55-
2 quota 를이용할사용자를만들자. # adduser -d /user3/qtest1 qtest1 # passwd qtest1 123456 # adduser -d /user3/qtest2 -p 12345 qtest2 # adduser -d /user3/qtest3 -p 12345 qtest3 3 /etc/fstab 수정한다. #vi/etc/fstab /dev/svg/svg /user3 ext3 defaults,usrquota 1 2 를추가 4 리마운드해준다. # mount -o remount /user3 #mount(rw,usrquota 가추가되었는지확인) #cd/user3 5 쿼터데이터베이스생성 # touch quota.user # chmod 600 quota.user 사용자만사용할수있도록사용자권한을쓰기, 읽기를주자. 6 쿼터데이터베이스정보입력 #quotacheck-a-m # convertquota -u /user3 # edquota -u qtest1-56-
soft 는 5M(5120), hard는 7M(7168) 로제한 7 쿼터적용 #cd #quotaon/user3 9 다른사용자도똑같이적용시킨다. # edquota -p qtest1 qtest2 8 쿼터사용자로로그인해서사용용량을초가할수있는지확인해보자. ctrl+alt+f3 =>qtest1으로 로그인 $ cp /boot/vmlinuz-2.6.11-1.1369_fc4 test1 => 1.6M 사용 $ cp test1 test2 => 총3.2M 저장 $ cp test1 test3 => 총4.8M 저장 $ cp test1 test4 => 총6.4M 저장 $ cp test1 test5 총 8M가되지만하드한도초과로 1M만저장되어 test5 는완전한파일이되지않는다. -57-