일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 뚝섬유원지
- 자전거
- 성수대교
- Podman
- 맛집
- 건대입구역
- 중식
- zabbix
- 2021
- 달리기
- 대전
- 힐링
- 10km
- GitHub
- docker
- 소모임
- DSEC
- 유산소
- 대구
- Grafana
- 한강
- Linux
- 러닝
- Python
- 오답노트
- 정보처리기사
- Kubernetes
- Run The Bridge
- Shell
- 하체
- Today
- Total
Run The Bridge
i-node 실습 본문
0. 들어가기 앞서
리눅스에서 i-node란 무엇이고, 어떤 의미를 갖는지 공부해보고 disk를 직접 mount 하여 i-noded가 full차면 어떤 현상이 발생하는지 알아보자.
추가로 linux에 quota라는것도 알아보자.
1. what is i-node
https://en.wikipedia.org/wiki/Inode
파일 또는 디렉토리와 같은 파일 시스템 개체를 설명하는 Unix 스타일 파일 시스템의 데이터 구조로
각 inode는 객체 데이터의 속성과 디스크 블록 위치를 저장한다.
파일 시스템 개체 속성에는 메타데이터(마지막 변경 시간, 액세스, 수정), 소유자 및 권한 데이터가 포함될 수 있다.
비트 | 내영 |
12-15 | 파일 형식(일반, 디렉터리, 문자 또느 블록 특별, 선입선출 파이프) |
9-11 | 실행 플래그 |
8 | 소유자 읽기 허가 |
7 | 소유자 쓰기 허가 |
6 | 소유자 실행 허가 |
5 | 그룹 읽기 허가 |
4 | 그룹 쓰기 허가 |
3 | 그룹 실행 허가 |
2 | 다른 사용자 읽기 허가 |
1 | 다른 사용자 쓰기 허가 |
0 | 다른 사용자 실행 허가 |
2. Why do you call me inode?
2002년에 Unix의 개척자 Dennis Ritchie 에게 질문이 주어졌는데,
그는 다음과 같이 대답했습니다.
"인덱스"가 최선의 추측입니다.
3. disk mount settings
VM을 종료하고 Vmware Workstation으로 disk를 하나 만들어 준다.
(ADD → NEXT → NETX(SCSI) → Create a new Virtual disk → NEXT → Finish)
VM을 부팅하고 다음 명령으로 disk가 잡혀있는지 확인한다.
맨위에 Disk /dev/sdb: 21.5GB가 잡혀있으면 정상적으로 disk가 생성된 것을 확인할 수 있다.
fdisk -l
---
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xd7ed4828
Device Boot Start End Blocks Id System
Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000a0e89
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 209715199 103808000 8e Linux LVM
Disk /dev/mapper/centos-root: 53.7 GB, 53687091200 bytes, 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/mapper/centos-swap: 2147 MB, 2147483648 bytes, 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/mapper/centos-home: 50.5 GB, 50457477120 bytes, 98549760 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
4. fdisk + /etc/fstab setting
fdisk로 파티션을 나눠도 되고, /etc/fstab에 등록해서 시스템 재부팅후에도 볼륨이 잡히게 설정할 수 있다.
먼저 fdisk를 통해 파티션을 나눠본다. 명령어를 모르면 'help' or 'm'을 입력하면 친절하게 볼 수 있다.
root@kube-master /dev # fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
g create a new empty GPT partition table
G create an IRIX (SGI) partition table
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partitions system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
---
우리는 새로운 파티션 테이블을 만드므로 'n'을 눌러준다
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
---
기본값으로 primary로 선택이니까 'p'를 누른다.
Select (default p): p
Partition number (1-4, default 1):
---
파티션 넘버를 지정하는것데 default로 설정한다.
나머지도 전부 기본값으로 enter를 누르고 마지막으로 'w'를 눌러 저장해준다.
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039):
Using default value 41943039
Partition 1 of type Linux and of size 20 GiB is set
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
---
다시 fdisk를 눌러보면 /dev/sdb1 파티션이 생긴것을 알 수 있다.
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xd7ed4828
Device Boot Start End Blocks Id System
/dev/sdb1 2048 41943039 20970496 83 Linux
---
이제 /etc/fstab에 설정을 넣어 영구적으로 mount 시킨다.
mkdir test
---
가장 아래줄에 /dev/sdb1를 /root/test라는 디렉토리에 ext3 파일형식으로 default권한을 가지며 0 0으로 설정한다.
# /etc/fstab
# Created by anaconda on Thu Jan 6 20:25:53 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=17d50087-d7ed-498b-a2e6-1935762aaaa1 /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
#/dev/mapper/centos-swap swap swap defaults 0 0o
/dev/sdb1 /root/test ext3 defaults 0 0
----
mkfs.ext3 /dev/sdb1
---
/etc/fstab에 관한 더 자세한 설명은 아래의 블로그에서 볼 수 있다.
https://storyerp.tistory.com/41
설정이 끝났으면 아래의 명령으로 저장한다.
mount -a
---
df -h 명령으로 mount 된 것을 확인할 수 있다.
root@kube-master ~ # df -h
/dev/sdb1 20G 45M 19G 1% /root/test
---
df -i 명령으로 해당 파일시스템에서 inode 총 개수를 알 수 있다.
사용가능한 inode개수는 130만개....쉘 스크립트를 짜서 충족시켜본다.
root@kube-master ~ # df -i test/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb1 1310720 11 1310709 1% /root/test
5. shell script를 통한 i-node pull test
열심히 i-node 만드는중.....
---
조금만 기다리면 IFree가 0 인것을 알 수 있다.
root@kube-master ~ # df -i ./test
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb1 110080 110080 0 100% /root/test
---
disk 사용량은 아직 널널하다.
root@kube-master ~ # df -h /dev/sdb1
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 20G 48M 19G 1% /root/test
---
이상태에서 만약 파일을 만들려고하면 어떻게 될까?
root@kube-master ~/test # touch test
touch: cannot touch ‘test’: No space left on device
당연하게도 만들 수 없다. 'No space left on device', 즉 device에 남는 공간이 없다는 뜻인데 disk 사용량은 충분하다.
리눅스에서는 disk 사용량도 중요하지만, 파일을 만들 때 i-node라고 하는 블록의 개수도 중요하다는 것을 알 수 있다.
만약 여러분이 'No space left on device'와 같은 오류를 보게된다면 'df -i ./'을 쳐서 i-node 개수를 확인해보자.
여기서 파일을 만들고 싶으면 당연하게도 안에 있는 파일을 삭제하면 만들 수 있다.
안에 존재하는 파일들을 삭제하고 touch로 새로운 파일을 생성하자 만들 수 있었다.
root@kube-master ~/test # touch testfile_inode
root@kube-master ~/test # ls
testfile_inode
---
umount를 할 때 다음과 같은 오류가 뜰 수 있는데, 하나의 세션이 /root/test 디렉토리에 접근해 있으면 'target is
busy' 라는 오류를 볼 수 있으니, 세션을 확인해서 해당 디렉토리를 빠져나오자.
root@kube-master ~ # umount /root/test
umount: /root/test: target is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
'Cloud > Linux' 카테고리의 다른 글
shell script master -5- (0) | 2022.01.21 |
---|---|
shell script master -4- (0) | 2022.01.13 |
shell script master -3- (0) | 2022.01.05 |
shell script master -2- (0) | 2022.01.03 |
shell script master -1- (2) | 2022.01.03 |