Run The Bridge

i-node 실습 본문

Cloud/Linux

i-node 실습

anfrhrl5555 2022. 1. 12. 21:58
728x90

0. 들어가기 앞서

리눅스에서 i-node란 무엇이고, 어떤 의미를 갖는지 공부해보고 disk를 직접 mount 하여 i-noded가 full차면 어떤 현상이 발생하는지 알아보자.

 

추가로 linux에 quota라는것도 알아보자.


1. what is i-node

https://en.wikipedia.org/wiki/Inode

 

inode - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Data structure describing a file-system object (e.g. file, directory) that stores the attributes and disk block location(s) of the object data The inode (index node) is a data structur

en.wikipedia.org

 

파일 또는 디렉토리와 같은 파일 시스템 개체를 설명하는 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

 

리눅스 /etc/fstab 설정

/etc/fstab 파일은 파일 초밥 템 정보를 저장하고 있는 파일입니다. 이 파일의 정보가 조금이라도 잘못 저장되면 부팅이 정상적으로 되지 않으니 주의해야 합니다. /etc/fstab 파일에서

storyerp.tistory.com

 

설정이 끝났으면 아래의 명령으로 저장한다.

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))

728x90

'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
Comments