반응형
오늘은 Linux 에서 File system에 대한 간단한 설명과 이를 이용하여 실제 물리적 Disk에 대해 File system을 사용하여 마운트하는 방법을 정리하고 LVM과 NFS를 구성하여 정리해 보려고 한다.
1) Linux Basic I / O Stack
- 가상 파일 시스템(Virtual File System, VFS):
- VFS는 리눅스 커널의 일부로, 다양한 파일 시스템을 통일된 인터페이스로 접근할 수 있게 해줍니다.
- VFS는 파일, 디렉토리, 마운트, 인증 등 파일 시스템 관련 작업을 추상화하여 제공합니다.
- 애플리케이션은 VFS 인터페이스를 통해 파일 시스템과 상호작용하므로, 실제 사용 중인 파일 시스템의 종류를 몰라도 됩니다.
- VFS는 파일 시스템 간 투명한 전환을 가능하게 하고, 디스크 입출력 시 공통적인 작업을 처리합니다.
- 파일 시스템(File System):
- 파일 시스템은 데이터를 디스크에 저장하고 관리하는 방법을 정의합니다.
- 리눅스에는 다양한 파일 시스템이 지원됩니다. 예를 들어 ext4, XFS, btrfs 등이 있습니다.
- 각 파일 시스템은 데이터 저장, 메타데이터 관리, 파일 및 디렉토리 구조 등을 다루는 자체 메커니즘을 가지고 있습니다.
- 파일 시스템은 장치 드라이버와 직접 상호작용하여 디스크 입출력을 처리합니다.
2) FileSystem 생성 및 관리
### Create filesystem
[root@amzn2_lab01p ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 8G 0 disk
└─xvda1 202:1 0 8G 0 part /
xvdb 202:16 0 10G 0 disk
[root@ ~]# lsblk -o +SERIAL
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT SERIAL
nvme1n1 259:0 0 10G 0 disk vol0a6bcacc2f8419027
nvme0n1 259:1 0 8G 0 disk vol096f219309d55c8a3
├─nvme0n1p1 259:2 0 8G 0 part /
└─nvme0n1p128 259:3 0 1M 0 part
> https://docs.aws.amazon.com/ebs/latest/userguide/identify-nvme-ebs-device.html
[root@amzn2_lab01p ~]# mkfs -t ext4 /dev/xvdb
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2151677952
...(생략)...
### mount
[root@amzn2_lab01p ~]# mount /dev/xvdb /app
[root@amzn2_lab01p ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 467M 0 467M 0% /dev
tmpfs tmpfs 477M 0 477M 0% /dev/shm
tmpfs tmpfs 477M 404K 476M 1% /run
tmpfs tmpfs 477M 0 477M 0% /sys/fs/cgroup
/dev/xvda1 xfs 8.0G 2.8G 5.3G 34% /
tmpfs tmpfs 96M 0 96M 0% /run/user/1000
/dev/xvdb ext4 9.7G 24K 9.2G 1% /app
### check journal info
[root@amzn2_lab01p ~]# dumpe2fs /dev/xvdb | grep -i journal
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Journal inode: 8
Journal backup: inode blocks
Journal features: journal_64bit
Journal size: 128M
Journal length: 32768
Journal sequence: 0x00000002
Journal start: 1
### blkid
[root@amzn2_lab01p ~]# blkid
/dev/xvda1: LABEL="/" UUID="584a9aa3-3944-4412-83d4-601901aea52d" TYPE="xfs" PARTLABEL="Linux" PARTUUID="47a8e07d-0c1d-41b6-92af-bcf3b1e2ff88"
/dev/xvdb: UUID="1d02ee7e-5065-4c20-ae93-9aa54bb8f403" TYPE="ext4"
### fstab
[root@amzn2_lab01p ~]# cat /etc/fstab
#
UUID=584a9aa3-3944-4412-83d4-601901aea52d / xfs defaults,noatime 1 1
UUID=1d02ee7e-5065-4c20-ae93-9aa54bb8f403 /app ext4 defaults 0 0
<device name> <mount point> <fs type> <mount options> <dump> <fsck option>
<dump> : 0은 백업하지 않음. 1은 dump로 backup을 할지를 결정
<fsck option> : 0은 fsck로 체크하지 않음. 1은 root file system, 다른 파티션들은 2
3) File System 관련 도구
- fuser : umount 시 사용중인 프로세스 확인 및 정리 시 주로 사용.
- -u: 사용중인 프로세스 & 사용자 확인
- -k : 해당 프로세스 kill 진행.
- lsof 명령어로도 확인 가능
- fsck, e2fsck, xfs_repiar > 파일시스템을 점검하고 손상된 파일시스템 복구 수행.
- 참고 자료 : Red Hat 문서
- du : 서브디렉토리들의 크기를 알기에 유용함, df -h 파일시스템 full 정리시 주로 사용.
[root@amzn2_lab01p ~]# umount /mnt
umount: /mnt: target is busy.
[root@amzn2_lab01p ~]# fuser -u /mnt
/mnt: 3821c(ec2-user)
[root@amzn2_lab01p ~]# ps -ef | grep 3821
ec2-user 3821 3820 0 07:57 pts/1 00:00:00 -bash <= bash 로그인쉘.
[root@amzn2_lab01p ~]# fuser -k /mnt
/mnt: 3821c
### using lsof command.
[root@amzn2_lab01p ~]# lsof +D /mnt
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 3821 root cwd DIR 202,16 4096 2 /mnt
$ sudo mount file-system
$ sudo umount file-system
$ sudo xfs_repair -n block-device
$ sudo mount file-system
[root@amzn2_lab01p DATA]# ll
total 4
-rw-rw-r-- 1 ec2-user ec2-user 11 Sep 27 06:44 a
drwxrwxr-x 2 ec2-user ec2-user 6 Sep 27 06:44 bb
drwxr-xr-x 2 root root 22 Oct 12 08:07 test
drwxr-xr-x 2 root root 36 Oct 12 08:11 test2_dir
[root@amzn2_lab01p ~]# du -hs /DATA
1.5G /DATA
[root@amzn2_lab01p DATA]# du -ah . | sort -h
0 ./bb
4.0K ./a
4.0K ./test2_dir/a_file
511M ./test2_dir/temp.log
512M ./test2_dir
1.0G ./test
1.0G ./test/test.log
1.5G .
4) LVM 및 파티션 관리
- 전체적인 LVM 구성 과정 요약 : PV -> VG -> LV -> filesystem
- PV : Physical Volume / PV는 LVM을 통해 관리되는 실제 물리적 저장 공간을 제공
- VG : 하나 이상의 PV를 그룹화한 것입니다. VG는 LVM에서 논리 볼륨(LV)을 생성하기 위한 저장 공간의 풀 역할을 합니다.
- LV : VG 내에서 할당된 논리적 저장 공간. 파일 시스템이 생성되고 데이터가 저장됨
[root@amzn2_lab01p DATA]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 8G 0 disk
└─xvda1 202:1 0 8G 0 part /
xvdc 202:32 0 100G 0 disk
xvdd 202:48 0 100G 0 disk
[root@amzn2_lab01p DATA]# pvcreate /dev/xvdc
Physical volume "/dev/xvdc" successfully created.
[root@amzn2_lab01p DATA]# pvcreate /dev/xvdd
Physical volume "/dev/xvdd" successfully created.
[root@amzn2_lab01p DATA]# pvdisplay
--- Physical volume ---
PV Name /dev/sdc
VG Name vg_data
PV Size 100.00 GiB / not usable 4.00 MiB ### PE size * num of PE
Allocatable yes
PE Size 4.00 MiB ### 기본값은 4MiB 지만 변경 가능, 8MiB 등..
Total PE 25599 : ### 총 PE 수
Free PE 25599
Allocated PE 0
PV UUID dNbTfM-pKVU-o7rb-DRsp-uIT0-W1mG-PYfD8r
--- Physical volume ---
PV Name /dev/sdd
VG Name vg_data
PV Size 100.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 25599
Free PE 25599
Allocated PE 0
PV UUID F5RgfP-LvdJ-9HOd-D7F0-ZLGH-utn7-KU2kIT
[root@amzn2_lab01p DATA]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdc vg_data lvm2 a-- <100.00g <100.00g
/dev/sdd vg_data lvm2 a-- <100.00g <100.00g
[root@amzn2_lab01p DATA]# vgcreate vg_data /dev/xvdc /dev/xvdd
Volume group "vg_data" successfully created
[root@amzn2_lab01p DATA]# vgs
VG #PV #LV #SN Attr VSize VFree
vg_data 2 0 0 wz--n- 199.99g 199.99g
[root@amzn2_lab01p DATA]# lvcreate -n app -L 50G vg_data
Logical volume "app" created.
[root@amzn2_lab01p DATA]# lvcreate -n applog -L 30G vg_data
Logical volume "applog" created.
[root@amzn2_lab01p DATA]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
app vg_data -wi-a----- 50.00g
applog vg_data -wi-a----- 30.00g
### filesystem : /dev/mapper/ 디렉토리에 존재
[root@amzn2_lab01p DATA]# mkfs -t xfs /dev/mapper/vg_data-app
meta-data=/dev/mapper/vg_data-app isize=512 agcount=4, agsize=3276800 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=13107200, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=6400, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
- VG, LV 관리 : 축소, 확장, 삭제
- LV축소의 경우 축소 불가한 파일시스템 타입(xfs)도 있고 파일시스템 축소 작업은 데이터 손실을 초래할 수 있으므로 일반적으로 삭제 후 재생성을 권장.
### VG확장
[root@amzn2_lab01p DATA]# vgextend vg_data /dev/xvde
Volume group "vg_data" successfully
### LV 확장
[root@amzn2_lab01p DATA]# vgs
VG #PV #LV #SN Attr VSize VFree
vg_data 3 2 0 wz--n- <249.99g <169.99g
[root@amzn2_lab01p DATA]# lvextend /dev/vg_data/app -L +20G
[root@amzn2_lab01p DATA]# lvextend /dev/vg_data/app -l +100%FREE / 남은 VG전체 할당.
[root@amzn2_lab01p DATA]# xfs_growfs /dev/mapper/vg_data-app / 파일시스템 확장
### LV 축소 : !!축소가 불가한 파일시스템 타입(xfs)도 있고 축소 작업은 데이터 손실을 초래할 수
있으므로 일반적으로 삭제 후 재생성 권장.
[root@amzn2_lab01p DATA]# umount /app
[root@amzn2_lab01p DATA]# wipefs -a /dev/mapper/vg_data-app
/dev/mapper/vg_data-app: 4 bytes were erased at offset 0x00000000 (xfs): 58 46 53 42
> 파일 시스템의 서명을 삭제. 미수행 후 lvcreate시 아래 경고 문구 출력 (큰 문제는 없음)
WARNING: xfs signature detected on /dev/vg_data/app at offset 0. Wipe it? [y/n]: y
[root@amzn2_lab01p DATA]# lvremove /dev/vg_data/app
Do you really want to remove active logical volume vg_data/app? [y/n]: y
- vgchange : VG에 대한 접근 여부 설정 / Active-Standby 구조에서 공유 스토리지 볼륨을 사용할 때, 특정 서버(Active 서버)에서만 볼륨 접근 가능하도록 설정하는 경우, 장애 발생되어 자동으로 Standby로 failover시 HA솔루션 내에 vgchange 가 사용될 수 있음.
[root@amzn2_lab01p DATA]# vgchange -a n vg_data // 비활성화
0 logical volume(s) in volume group "vg_data" now active
[root@amzn2_lab01p DATA]# vgchange -a y vg_data // 활성화
2 logical volume(s) in volume group "vg_data" now active
5) Network File system 구성
NFS Server 작업
### Server 단
[root@amzn2_lab01p ~]# yum install nfs-utils
[root@amzn2_lab01p ~]# vim /etc/exports
/DATA 13.125.214.84(rw,sync,no_root_squash)
<공유할_디렉터리> <클라이언트_IP 또는 호스트명>(옵션)
* rw: 읽기 및 쓰기 권한을 모두 허용.
* ro: 읽기 전용 권한을 허용.
* sync: 클라이언트의 쓰기 요청이 완료될 때까지 서버가 응답하지 않음.
* async: 클라이언트의 쓰기 요청을 비동기적으로 처리.
* no_subtree_check: 서브 디렉터리에 대한 체크를 하지 않음.
* no_root_squash: 클라이언트의 root 사용자에게도 서버의 root 권한을 부여.
* root_squash: 클라이언트의 root 사용자를 일반 사용자로 변환하여 권한을 제한.
[root@amzn2_lab01p ~]# systemctl enable nfs-server.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@amzn2_lab01p ~]# service nfs-server status
Redirecting to /bin/systemctl status nfs-server.service
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
Drop-In: /run/systemd/generator/nfs-server.service.d
└─order-with-mounts.conf
Active: inactive (dead)
[root@amzn2_lab01p ~]# service nfs-server start
Redirecting to /bin/systemctl start nfs-server.service
[root@amzn2_lab01p ~]# exportfs -v
/DATA 3.39.253.128(rw,sync,wdelay,hide,no_subtree_check,sec=sys,secure,no_root_squash,no_all_squash)
[root@amzn2_lab01p ~]# rpcinfo -p | grep nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100227 3 udp 2049 nfs_acl
NFS Client 작업
### Client 단
[root@nfs_client01 ~]# mount -t nfs 43.201.72.5:/DATA /nfs
[root@nfs_client01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 467M 0 467M 0% /dev
tmpfs 477M 0 477M 0% /dev/shm
tmpfs 477M 412K 476M 1% /run
tmpfs 477M 0 477M 0% /sys/fs/cgroup
/dev/xvda1 8.0G 1.9G 6.2G 23% /
tmpfs 96M 0 96M 0% /run/user/1000
43.201.72.5:/DATA 8.0G 4.3G 3.8G 53% /nfs
/> fstab :
43.201.72.5:/DATA /nfs nfs defaults 0 0
* NFS마운트옵션 :
https://docs.aws.amazon.com/ko_kr/efs/latest/ug/mounting-fs-nfs-mount-settings.html
[root@nfs_client01 /]# mount | grep nfs
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
43.201.72.5:/DATA on /nfs type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.31.14.146,local_lock=none,addr=43.201.72.5)
해당 글을 통해 "Linux 파일 시스템의 개요 및 관리 방법" 그리고 "LVM", "NFS" 에 대한 기본적인 개념 및 구성 방법을 정리하며, 헷갈릴 수 있는 부분과 실제 사용 시 도움이 될 수 있는 내용을 추가하였다.
반응형
댓글