업데이트:

태그:

카테고리:



파일시스템

파일 시스템은 파티션 안에서 파일을 조직화하는 방법이다.

파일 시스템은 디렉터리접근 컨트롤로만 이루어진다.
이는 파일에 대한 권한과 수정시간, 접근시간으로 이루어진다.

디렉터리는 파일처럼 구현되고, 파일접근권한은 소유권으로 추적된다.

  • 파일 시스템에 대한 manual 은 man fs
  • 현재 로드된 파일시스템은 cat /proc/filesystems
  • 자동으로 감지된(마운트된) 파일시스템 cat /etc/filesystems


일반적인 파일시스템

  • 리눅스의 일반적인 파일 시스템은 ext2이다.
    근데 이 친구는 파일시스템이 확인하는데에 오래걸린다는 것.


  • 그래서 ext3로 대체되었다.
    • 차이점은 journaling인데, 변경사항이 disk의 jounal에 일단 쓰여진다는 것이다.
    • 주기적으로 flush되면서 파일시스템에 변경사항을 작성한다.
      이렇게 파일시스템을 일관적인 상태로 유지해주는 역할을 한다.

ext2는 mkfs, mke2fs로,
ext3는 mke2fs -j 로 만들 수 있다.

ext2를 ext3로 바꿀수도 있는데, tune2fs -j로 할 수 있다.


  • ext4
    • 64비트를 만족시키는 ext3를 개발하다가 나타남.
    • ext3보다 큰 파일을 지원한다.
    • mkfs.ext4 lv이름으로 논리적 볼륨에 파일시스템을 얹어줄 수 있다.


이 외에도 정말 많다…



마운트

파일시스템을 파티션에 올려놓으면, 마운트할 수 있다.
파일시스템을 마운팅하는 것은 디렉터리를 사용할 수 있게 한다는 것이다.

파티션에 존재하지 않는 파일 시스템도 마운트할 수 있다.


유닉스 시스템에서, 모든 파일과 디렉터리는 하나의 큰 트리구조로 이루어져있다.(마치 DOM트리처럼….)

  • 파일에 접근하기위해선 root 폴더로부터의 전체 경로를 알 수 있어야하는데, 파일시스템을 컴퓨터에 추가함으로써 이를 알 수 있다.
    파일시스템을 사용할 수 있는 디렉터리를 mount point라고 부른다.


로컬 파일시스템 마운트

  • mkdir mkdir로 새로운 mount point를 생성할 수 있다.(파일시스템 사용할 수 있다.)


  • mount mount point가 생성되었고, 파일시스템이 파티션에 존재하면 mount 명령어는 mount point directory에 파일시스템을 마운트할 수 있다.

    • mount 명령어는 자동으로 파일시스템을 감지한다. 명시적으로 파일시스템을 지정하지않으면 /etc/filesystems를 먼저 확인한다.

    • 파일시스템이 존재하지 않으면 /proc/filesystems를 읽게된다.
    • 인자를 주지 않고 명령어를 실행하면 모든 마운트를 볼 수 있다.
    • 위의 파일시스템 생성 이후, mount -t ext4 lv이름 마운트할폴더 로 논리적 볼륨의 파일시스템의 마운트포인트를 지정해줄 수 있다.
  • umount umoount 명령어를 통해 파일시스템을 언마운트할 수 있다.



디스크

용어

  • platter, head, track, cylinder, sector 데이터는 자성을 가진 시각적 disk platter(접시)에 저장된다.
    이 접시들이 빠른 속도로 회전한다.
    이 데이터들은 head가 platter의 표면에 매우 가까운 상태에서 읽히게된다.

    데이터들은 track이라 불리는 동심원의 원에 작성된다.
    track zero란 대부분의 경우 원의 바깥에 있다. 특정 트랙을 찾기 위해 head의 위치를 옮기는데에 걸리는 시간을 seek time이라고 한다.
    종종 platter들이 서로의 위에 쌓이게되는데, 그래서 head가 특정 포지션 상에서 접근가능한 트랙의 집합을 cylinder라고한다.
    track들은 512바이트의 sector으로 나뉘게되는데, 영역들 사이에 사용되지 않은 gap들은 platter의 바깥에 위치한다.

    하드드라이브의 접근시간을 쪼개보면 head를 움직이는데에 걸리는 시간이 65%정도이고, rotational latency이 30%정도이다.


  • ide, scsi ide는 ata와 양립가능한 기기이다. 대부분의 데스크탑은 ata 기기를, 서버들은 scsi를 사용한다.

    • ata ata controller는 두 기기간 종속성을 조종한다.
      기기가 케이블로 선택가능한게 아니라면, 수동으로 조절해야한다.
      sata가 도입됨에따라 원래의 ata는 parallel ata로 불리게 된다.
      시각적 드라이브들은 종종 atapi라는 것을 사용하는데, SCSI 커뮤니케이션 프로토콜을 사용하는 ATA 인터페이스를 의미한다.

    • scsi(small computer system interface) scsi 컨트롤러는 2개 이상의 기기를 허용한다. 각 기기는 고유한 scsi id를 얻게되는데, scsi controller는 scsi id를 필요로하게된다.
      bit에 따라 8bit은 narrow, 16bit은 wide,
      속도에 따라 10Mhz 는 fast SCSI, 20Mhz는 ultra SCSI로 불린다.


  • block device 하드 디스크, 플로피 디스크, CD 같은 장치들은 block device라는 추상적인 층을 가지고 있다.
    이 층은 512바이트의 고정된 크기의 블록들로 데이터를 주고받는다.
    block device를 확인하려면 ls -l /dev/에서 filetype이 b인 것을 찾자.


  • character device 키보드, 마우스, 프린터 등의 장치. 바이트 단위로 전송한다.


  • solid state drive ssd는 기기를 움직일 필요없는 block device이다.
    flash memory와 동일한데, ssd는 하드보다 비싸지만 접근시간이 매우 빠르다.



장치 이름

  • ata device ata 장치들은 /dev/hd*로 시작한다.
    master - slave간의 관계를 가지게 되는데, 알파벳 순으로 /dev/hda가 master라면 /dev/hdb가 slave이다.

  • scsi device scsi 장치들도 비슷한데, /dev/sd*의 특징을 가진다.
    낮은 scsi 주소를 가진 scsi 디스크나 raid 컨트롤러를 추가하면 이름짓는 방식이 달라지게된다.

현대의 리눅스 시스템은 모든 기기들에대해 /dev/sd*을 사용한다.



장치 찾기

  • fdisk /sbin/fdisk -l커맨드로 커설이 식별하고있는 디스크의 종류를 알 수 있다.


  • dmesg 커널 부트 메세지는 dmesg로 부팅 이후에 보여진다.
    부팅하면서 커널에의해 하드디스크 장치들이 감지되기때문에 디스크 장치들에 대한 정보를 찾기 위해 dmesg를 사용할 수 있다.


  • lshw apt install lshw로 설치.(CentOS와 Redhat은 불가능)
    hardware의 리스트를 보여준다.
    디스크와 파티션의 많은 정보를 알 수 있다.


  • lsscsi 이 커맨드는 scsi 에 대한 정보를 제공한다.



디스크 분할

디스크를 분할하는 방법에 대해.

primary, extended, logical

리눅스는 한개 이상의 분할을 요구로한다.

  • 파티션의 기하학적 구조와 크기는 cylinder의 시작과 끝으로 결정된다.
  • 파티션은 3가지 종류가 있다.

    Partition Type naming
    Primary(max 4) 1-4
    Extended(max 1) 1-4
    Logical 5-
  • 각 파티션은 코드를 포함한 type field를 가진다. 이건 컴퓨터의 OS를 결정하거나 파일시스템을 분할한다.


파티션 이름

하드웨어 종류에 따라서 /dev/hd*, /dev/sdx이렇게 이름이 지어진다.
그 다음에 오는 숫자는 파티션 넘버로, 1부터 시작한다.

그렇기에, 4개의 primary partition은 1~4까지 이름지어지고, logical partition들은 5부터 시작한다.

  • /proc/partitions

    /proc/partitions파일은 분할된 장치들의 major, minor number를 보관하고있다.

    block의 개수와 장치이름은 /dev에 있다.

    major number는 장치, 드라이버의 타입에 상응하고, /proc/devices에 있다.
    major number는 이 장치와 함께 사용될 device driver를 결정한다.

    minor number는 이 장치 유형의 인스턴스를 고유하게 식별하는 번호이다.
    devices.txt파일에 major, minor number의 모든 리스트에 대한 커널트리가 있다.


lvm

lvm은 Logical Volume Manage의 약자로,

  1. 물리적인 저장공간을 그룹화
  2. 논리적인 공간의 크기 조절
  3. 데이터 이동

을 할 수 있다.

기존에 분할방법의 문제점은, 아래와 같은 상황일때,

project42의 크기를 늘리기 위해선 file system을 분리하고, 데이터를 백업하고, 파티션을 없애고 크기를 키워서 다시 생성하고, 데이터를 복구하고 파일시스템에 다시 mount하는 복잡한 절차가 필요하다.

하지만, LVM을 사용한다면,

LVM은 현재 마운트된 파일시스템과 장치 사이에서 가상의 층을 형성하고, 관리자가 사용하려는 마운트되어있는 상태의 파일시스템의 크기를 자유롭게 조정할 수 있게 한다.

LVM이 적절하게 사용되면, 파일시스템의 크기를 조절하기 위해 unmount하는 절차가 필요하지 않은 것이다.


용어

  • physical volume
    • 어떤 block device든지 가능하다.
    • disk, partition, RAID, iSCSI 등의 모든 장치는 volume group의 멤버가 될 수 있다.
    • pv로 시작하는 모든 커맨드는 physical volume을 관리한다.


  • volume group
    • block 장치들과 logical volume들 사이의 추상적인 층이다.
    • volume group 관련 커맨드는 vg를 사용한다.


  • logical volume
    • logical volume은 volume group 내에서 생성된다.
    • file system을 가진 lv들은 마운트될 수 있다.
    • 이와 관련된 명령어들은 mkfs, mount, fsck 등 표준 커맨드와 사용법이 비슷하다.


using lvm

  1. pvcreate로 volume group에 합칠 수 있는 physical volume을 만들어야한다.
    이 커맨드는 volume group에 사용될 수 있는 디스크나 파티션을 만든다.
    추가할 수 있는 장치는 /dev에 있으니, 확인하자.
    가상머신에서 저장공간(SCSI)를 하나 추가해주자!, 이후 pvcreate /dev/sda


  1. vgcreate 는 한 장치를 사용해 volume group을 만든다.
    이 volume group에는 더 추가될 수 있다.
    vgcreate vg /dev/sda


  1. lvcreate로 logical volume을 할당한다.
    lvcreate --size 500m vg

lvcreate를 잘 보자. lvcreate -L 2G -n tmp lvm -> lvm이라는 볼륨그룹에 tmp이라는 이름으로 (2기가) 용량으로 논리적 볼륨을 생성한다. 이후, lsblk에 논리적 볼륨이 나타나는 것을 볼 수 있다!

풀이

  1. lvcreate 로 논리적 볼륨에 사이즈를 할당하고, 볼륨그룹에 속하게 생성한다.
  2. /dev/myukang42-vg/… 이런식으로 파일이 생기는데, 여기에 파일시스템을 얹어주자 (mkfs ext4.이름)
  3. 이제 논리적 볼륨들에 파일시스템이 있으므로, 마운트를 할 수 있다. 여기에 mount를 해주도록하자.

댓글남기기