리눅스 파일 시스템의 종류와 구조
> 디스크 디바이스
* Block Device
- 무작위로 액세스 할 수 있는 하드 디스크 장치에는 블록 장치라는 추상화 계층이 있어서 고정 크기 (보통 512바이트) 블록으로 형식을 지정할 수 있다.
- 블록은 다른 블록에 대한 액세스와 독립적으로 액세스 할 수 있다.
root #
# lsblk
# blkid (root 권한에서만 수행됨)
> 디스크 디바이스 이름 지정
* ATA(IDE) 디바이스 이름 지정
- /dev/hd로 시작하고 뒤에 단위 문자로 끝난다 (/dev/hda, /dev/hdb...)
* SCSI 디바이스 이름 지정
- /dev/sd 로 시작하고 단위문자로 끝난다 (/dev/sda, /dev/sdb, /devsdaa...)
- lvm 볼륨은 일반적으로 /dev/md0, /dev/md1 등으로 표시
> 디스크 디바이스 찾기
* /sbin/fdisk 또는 /usr/sbin/fdisk 를 이용하여 커널이 볼 수 있는 디스크 디바이스를 찾을 수 있다.
# fdisk -l | grep Disk
# fdisk -l | grep 'Disk /dev/sd'
* 하드웨어 리스트 보기
# lshw | more (tool 설치 : # yum install lshw)
* lsscsi 명령어
- 모든 SCSI 디바이스와 에뮬레이터 디바이스에 대해 읽기 쉬운 포맷으로 출력
# lsscsi
# lsscsi -c
* /proc 파일 시스템을 이용한 SCSI 디바이스 찾기
# cat /proc/scsi/scsi
- Debian 계열에서는 해당 기능이 비활성화 되어 있는 경우도 있다.
# config_scsi_proc_fs 를 set 로 설정 후 재 컴파일
> 파일 시스템에 대하여
* 파일시스템에 대한 매뉴얼
# man fs
* 리눅스 커널이 현재 지원하고 있는 파일시스템 보기 (in momory, disk 에 없다)
# cat /proc/filesystems | grep -v nodev (no device)
* 리눅스에서 mount 명령어 입력시 -t 옵션이 없어도 자동으로 탐지하는 파일시스템 형식 목록
# cat /etc/filesystems
# cat /etc/filesystems | grep -v nodev
* 리눅스 파일시스템 확인하기
# df -T
# fsck -N /dev/sda1
# lsblk -f
# blkid /dev/sda1
# mount | grep "^/dev"
# file -sL /dev/sda1
# cat /etc/fstab
> 리눅스의 일반 파일 시스템
* ext2
- 2GB 파일 크기 지원, 255바이트 파일 이름 길이 지원
* ext3
- journalling 기능 추가 (디스크의 journal에 먼저 기록하고, journal 이 주기적으로 파일 시스템에 변경 내용을 기록하는 것)
- 2TB 까지 파일 크기 지원
* ext4 (Debian 계열)
- 2008년 이후 버전에서 가용
- 16TB까지 지원
* xfs
- 확장성이 뛰어난 고성능 파일시스템 RedHat Enterprise 7의 기본 파일 시스템
- Irix 용으로 제작, FreeBSD 에서도 사용
- Redhat/CentOS 영역 외부의 distrebutions에서는 거의 사용되지 않음
* vfat
- 플로피디스크 fat12, ms-dos fat16, 대용량 디스크 fat32의 형태로 존재
- 보안, 링크같은 기능이 없다
- 다른 OS(Windows) 사이에서 데이터를 교환하는데 사용
* iso 9660
- cdrom 의 표준 형식
디스크 추가 설치 및 관리
> 디스크 파티션
* 디스크 추가 확인
# fdisk -l
# fdisk /dev/sdb
m (help)
n (add a new partition)
p (primary)
1 (partition number)
2048 (firstsector)
+2G
w (write table to disk and exit)
> 파티션에 파일 시스템 넣기
* 파일 시스템을 만드는 실행 파일 들 (/sbin/mk*)
# ls -llS /sbin/mk*
* 파티션에 파일 시스템 넣기
# mkfs.ext4 /dev/sdb1
# file -sL /dev/sdb1
> 파일 시스템 점검
* fsck 툴은 파일시스템의 에러를 점검하는데 사용되는 툴로 사용자가 직접 조작하는 툴이다.
# ls / sbin/*fsck*
* /etc/fstab 의 마지막 컬럼의 의미
- 시스템 부팅 시 파일시스템 점검 여부 설정
0: fsck 명령을 수행하지 않음
1: 루트 파일시스템을 점검
2: 나열된 순서대로 점검
파일시스템 마운트
> 파일 시스템 mounting
* 파티션에 파일 시스템을 생성한 다음에는 mount 해야 사용할 수 있다
- 파일 시스템 mount 는 디렉토리를 사용
- 파티션을 mount 한다고 하는 대신 파일 시스템을 mount 한다고 함
* 모든 Unix 시스템에서는
- 모든 파일과 디렉토리는 거대한 파일 트리의 한 부분이다.
- 파일에 접근하기 위해서는 "/"(root) 에서부터 전체 경로를 알아야만 한다.
- 컴퓨터에 파일 시스템을 추가할 때 파일 트리의 특정 부분을 가용하게 만들어야 한다.
- 파일 시스템이 가용하도록 만든 디렉토리를 mount point 라고 한다.
> 로컬 파일 시스템 mount 하기
* 마운트
# mkdir /home/project1
# mount -t ext4 /dev/sdb1 /home/project1
* 마운트 해제
# umount /home/project1
> mount 파일 시스템 형식과 /etc/filesystems 및 /proc/filesystems
* mount 명령은 먼저 /etc/filesystems 파일을 검사한다. (파일 시스템을 분명하게 정의하지 않을 때)
- mount 명령은 파일 검사 시 no dev 라인은 건너 뛴다.
* /etc/filesystems 파일이 존재하지 않거나 파일의 마지막 라인이 * 단일 라인으로 끝나는 경우
- mount 명령은 /proc/filesystems 파일을 읽는다
# cat /etc/filesystems
# cat /proc/filesystems | grep -v nodev
> mount 된 파일 시스템 보기
* mount된 모든 파일 시스템을 보여준다.
# mount | grep /dev/sdb1
* 커널이 파일 형태로 파일 시스템 정보를 제공하는 것으로 하드 디스크에 파일 형식으로는 존재하지 않는다
# cat /proc/mounts | grep /dev/sdb1
* 커널에 의해 업데이트되지 않고 mount 명령어에 의해 유지된다.
# cat /etc/mtab | grep /dev/sdb1
* df 명령어
- mount 된 각 파일 시스템의 여유 공간을 포함하여 보다 많은 정보를 사용자 친화적 방식으로 보여준다.
- 파티션의 크기, 여유 공간, 사용된 기가 바이트 및 백분율 및 마운트 포인트를 볼 수 있다.
# df -h
* du 명령어
- 파일 및 디렉토리의 디스크 사용을 요약하여 보여준다.
- 마운트 지점에서 du를 사용하면 해당 파일 시스템에 사용되는 디스크 공간을 효과적으로 볼 수 있다
- 각 하위 디렉토리를 재귀적으로 표시할 수 있지만 -s 옵션은 상위 디렉토리에 대한 전체 요약을 제공하며 종종 -h와 함께 사용된다.
즉 마운트 지점에서의 du -sh 는 해당 파티션에서 파일 시스템이 사용하는 총 크기를 나타낸다.
> 파일 시스템 영구적으로 mount 하기
* /etc/fstab (백업 필수)
- 파일시스템 테이블은 파일 시스템 목록을 포함하여 부팅시 자동으로 마운트할 수 있는 옵션이 포함되어 있다.
# vi /etc/fstab
# mount -a (적용)
> mount 포인트의 보안
* ro (read-only) 옵션
- 파일 시스템을 읽기 전용으로 마운트하여 어느 누구도 쓸 수 없게 만드는 것
# mount -t ext4 -o ro /dev/sdb2 /home/project2
* noexec (no execution) 옵션
- mount 된 파일 시스템에서는 binary 나 script가 실행되지 못하도록 하는 것
# mount -t ext4 -o noexec /dev/sdb2 /home/project2
# chown -R linux:linux project2
# cp /bin/cat /home/project2
# /home/project2/cat /etc/hosts
# echo echo hello > /home/project2/helloscript
# chmod +x /home/project2/helloscript
# /home/project2/helloscript
* nosuid (no setuid) 옵션
- nosuid 옵션은 mount 된 파일 시스템에서 binary 파일에 setuid 비트를 설정할 수는 있으나 무시한다
# mount -o nosuid /dev/sdb3 /home/nosuid
# ls -ld nosuid/
# cp /bin/sleep /home/nosuid
# ls -ld /home/nosuid/sleep
# chown root:root /home/nosuid/sleep
# chmod 4755 /home/nosuid/sleep
# ls -ld /home/nosuid/sleep
# /home/nosuid/sleep 500&
# ps -f 14952
리눅스 파일 시스템의 종류와 구조
> USB flash drive 읽기
* vfat 형식으로 윈도우에서 포맷된 USB 플래시 드라이블르 리눅스에서 인식하여 파일 읽기
# lsblk
# mkdir -p /mnt/USB
# mount -t vfat /dev/sdb1 /mnt/USB
# cd /mntUSB
# ls
* NTFS 형식으로 윈도우에서 포맷된 USB 플래시 드라이브를 리눅스에서 인식하여 파일 읽기
# yum install epel-release
# yum install ntfs-3g
# mkdir -p /mnt/USB
# mount /dev/sdb4 /mnt/USB
# ls -l /mnt/USB
> 디스크 swap 파티션 (Disk Partition) 만들기
* 새로운 파티션을 swap 영역으로 추가하기
# mkswap /dev/sdb1
# swapon /dev/sdb1
# swapon -s
* 기존 디스크 파티션을 swap 영역으로 추가하기
# mount /dev/sdb1 /home/project1
# dd if=/dev/zero of=/home/project1/swapfile bs=1024 count=100
# mkswap /home/project1/swapfile
# swapon /home/project1/swapfile
# swapon -s