newhaneul

[Operating System] Final Exam Class 1 Fall 2025 (Week 9-10: File System) 본문

4. University Study/Operating System

[Operating System] Final Exam Class 1 Fall 2025 (Week 9-10: File System)

뉴하늘 2025. 12. 10. 17:14
728x90

본 포스팅은 인하대학교 김기창 교수님의 [202502-EEC4406-001] Operating System을 수강하고 공부한 내용을 정리하기 위한 포스팅입니다.

 

Question: 

1. Do following in myfd (as in lecture6-fs.docx) and show the block contents, inode numbers and block numbers of ex1.c and ex1. You should analyze the inode table and d8, d9 directory files to compute inode and block numbers of ex1 and ex1.c. Note this is not programming problem; you just analyze myfd meta blocks and directory file blocks to compute the inode numbers and block number of ex1 and ex1.c. Explain in detail how you have computed them.

 

mkdir d8
cd d8
mkdir d9
cd d9
vi ex1.c
(type some simpel c code)
gcc –o ex1 ex1.c

 

1. myfd에서 아래 명령어를 ex1.c ex1 block content, inode번호, 블록번호를 계산하시오 (lecture6-fs.docx 에서처럼 myfd 만들 ). inode table, d8, d9 디렉토리 파일 등을 분석해서 계산하기 바랍니다. 문제는 코딩 문제가 아니고 myfd 메타블록과 디렉토리 파일 블록들을 분석하는 문제입니다. 풀이 과정을 자세히 기술하기 바랍니다.

 

mkdir d8
cd d8
mkdir d9
cd d9
vi ex1.c
(type some simpel c code)
gcc –o ex1 ex1.c

 

 

Answer:

 

먼저 ‘myfd’의 디스크를 위와 같이 생성할 수 있습니다. 'dd bs=1024 count=1440 if=/dev/zero of=myfd' 명령어를 사용하여 생성할 수 있고, 디스크의 정보는 아래와 같습니다.

  • block size = 1024 (=1K Bytes)
  • count = 1440 (block 개수)
  • if=/dev/zero (입력 파일)
  • of=myfd (출력 파일 이름이 myfd인 디스크 생성

따라서 총 1.44 MB (1KB * 1440 = 1440KB) 크기의 디스크를 생성합니다.

 

처음에 디스크 안에 무수히 많은 0으로 채워진 ‘/dev/zero’ 파일이 입력되었기 때문에 0x400에 위치하는 Super Block은 모두 0으로 되어져 있음을 확인할 수 있습니다.

이제 ‘mkfs -t ext2 myfd’ 명령어를 이용해 myfd를 ‘ext2’ 형식으로 변환해줍니다.

 

변환한 다음 mount를 진행합니다.

 

"temp" 디렉토리를 만들고 ‘mount -o loop myfd temp’ 명령어를 통해 myfd 디스크와 temp 디렉토리를 서로 연결해주었습니다.

그 다음 문제에서 요구한대로 간단한 “ex1.c” 파일을 생성하고 컴파일 한 뒤 umount 하였습니다.

 

 

ex1.c

이제 ‘xxd myfd > x; vi x’를 진행한 다음 파일 시스템 변화를 확인해보겠습니다.

 

 Super Block이 시작되는 위치에서 값들의 의미들은 아래와 같습니다.

  • 0~4Byte (b8 00 00 00): m_inodes_count에 해당되고, 10진수로 변환하면 184임을 알 수 있습니다. 즉, 최대 184개의 inodes를 사용할 수 있습니다.
  • 5~8Byte (a0 05 00 00): m_blocks_count에 해당되고, 10진수로 변환하면 1440임을 알 수 있습니다. 즉, 블록 크기 1KB로 format했을 때의 총 Block 수와 일치합니다.
  • 9~12Byte (48 00 00 00) / 13~16Byte (71 05 00 00): 각각 m_r_blocks_count와 m_free_blocks_count에 해당되고, 10진수로 변환하면 각각 72, 1393임을 알 수 있습니다.

Group Descriptor (0x800) 

  • 0~3Byte (08 00 00 00 → 0x8): bg_block_bitmap에 해당되고, 10진수로 변환하면 8임을 알 수 있습니다. 즉, 0x8 x 0x400 = 0x2000에 해당됩니다.
  • 4~7Byte (09 00 00 00 → 0x9): bg_inode_bitmap에 해당되고, 10진수로 변환하면 9임을 알 수 있습니다. 즉, 0x15 x 0x400 = 0x2400에 해당됩니다. 
  • 8~11Byte (0a 00 00 00 → 0xa): bg_inode_table에 해당되고, 10진수로 변환하면 10임을 알 수 있습니다. 즉, 0x10 x 0x400 = 0x2800에 해당됩니다.

 

DBM (0x2000)

DBM의 경우 'ff ff ff ff ff ff 1f’인것을 확인할 수 있습니다. 변환을 진행하면 '1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0001 1111'이 됩니다. 따라서 Block 개수는 53개임을 알 수 있습니다.

 

IBM (0x2400)

IBM의 경우 'ff 7f'인 것을 확인할 수 있습니다. 변환을 진행하면 ‘1111 1111 0111 1111'이 됩니다. 따라서 Block 개수는 15개임을 알 수 있습니다.

 

Inode Table (0x2880)

root 디렉토리에 대한 정보를 확인하기 위해 Inode table의 주소인 0x2800으로 이동합니다. 이때 root 디렉토리는 inode table 2번에 위치하기 때문에 root 디렉토리의 inode table 주소는 0x2880입니다. 여기에서 확인해야 할 것은 Block location을 가리키는 ‘2100 0000’ 입니다.

 

root 디렉토리의 파일 위치는 앞서 확인한 block location을 사용하여 0x21 x 0x400 = 0x8400임을 계산할 수 있습니다.

 

Root File Location (0x8400)

0x8400을 확인해보니 root 디렉토리 안에 생성된 f1 파일이 존재함을 확인하였습니다. struct를 참고하여 해석해 보면

 

1)

m_inode = '02 00 00 00' → '00 00 00 02 ' → 2번 inode

m_inode = '0c 00' → '00 0c' → 12 recode length

m_name_len = '01' → 1 name length

m_file_type = '02' → 2 directory file

m_name = '2e 00 00 00' → “.” name

 

2)

m_inode = '02 00 00 00' → '00 00 00 02' → 2번 inode

m_inode = '0c 00' → '00 0c' → 12 recode length

m_name_len = '02' → 2 name length

m_file_type = '02' → 2 directory file

m_name = '2e 2e 00 00' → “..” name

 

3)

m_inode = '0b 00 00 00' → '00 00 00 0b' → 11번 inode

m_inode = '14 00' → '00 14' → 20 recode length

m_name_len = '0a' → 10 name length

m_file_type = '02' → 2 directory file

m_name = '6c 6f 73 74 2b 66 6f 75 6e 64' → “lost+found” name

 

4)

m_inode = '0c 00 00 00' → '00 00 00 0c' → 12번 inode

m_inode = 'd4 03' → '03 d4' → 980 recode length

m_name_len = '02' → 2 name length

m_file_type = '02' → 2 directory file

m_name = '64 38 00 00' → “d8” name

 

"d8" 파일의 inode가 12번임을 확인하였으니, 0x2800 + 0x80 * (12 - 1) = 0x2d80 계산을 통해 "d8" 파일의 inode table 주소로 이동합니다.

 

d8 Inode Table (0x2d80)

0x2d80에서 "d8'의 block location을 확인한 결과 = '01 04' → 0x401 = 1025번째 block 에 위치하는 것을 알 수 있습니다.

 

따라서 "root/temp/d8" 디렉토리 주소는 0x401 * 0x400 = 0x100400에 존재하고 있습니다.

 

d8 File Location (0x100400)

파일 주소로 이동하여 확인해본 결과, '.' 파일과 '..' 파일, 그리고 ‘d9’ 디렉토리가 존재함을 알 수 있습니다. 이는 현재 보고 있는 ‘d8’ 디렉토리가 ‘d9’ 디렉토리의 상위 디렉토리 이기 때문입니다.

 

5)

m_inode = '0d 00 00 00' → '00 00 00 0d' → 13번 inode

m_inode = 'e8 03' → '03 e8' → 1000 recode length

m_name_len = '02' → 2 name length

m_file_type = '02' → 2 directory file

m_name = '64 39 00 00' → “d9” name

 

"/root/temp/d8/d9 " 디렉토리의 inode가 13번임을 확인하였으니, 0x2800 + 0x80 * (13 - 1) = 0x2e00 계산을 통해 inode table 주소로 이동합니다.

 

d9 Inode Table (0x2e00)

0x2e00에서 "d9'의 block location을 확인한 결과 = '2f' → 0x2f = 47번째 block에 위치 하는 것을 알 수 있습니다.

 

따라서 "root/temp/d8/d9" 디렉토리 주소는 0x2f * 0x400 = 0xbc00에 존재하고 있습니다.

 

d9 File Location (0xbc00)

파일 주소로 이동하여 확인해본 결과, '.' 파일과 '..' 파일, 그리고 ‘ex11.c.swp’ 파일, ‘ex1.cc.swx’ 파일이 존재함을 알 수 있습니다. 이를 통해 현재 보고 있는 ‘d9’ 디렉토리에 위치한 ‘ex1.c’ 파일과 ‘ex1’ 파일이 존재함을 알 수 있습니다.

 

6)

m_inode = '0e00 00 00' → '00 00 00 0e' → 14번 inode

m_inode = '14 00' → '00 14' → 200 recode length

m_name_len = '03' → 3 name length

m_file_type = '01' → 1 file

m_name = '65 78 31 31 2e 63 2e 73 77 70' → ’70 77 73 2e 63 2e 31 31 78 65’ → “ex11.c.swp” name

 

7)

m_inode = '0f00 00 00' → '00 00 00 0f' → 15번 inode

m_inode = 'd4 03' → '03 d4' → 980 recode length

m_name_len = '05' → 5 name length

m_file_type = '01' → 1 file

m_name = '65 78 31 2e 63 63 2e 73 77 78' → ’70 77 73 2e 63 63 2e 31 31 78 65’ → “ex1.cc.swx” name

 

"/root/temp/d8/d9/ex11.c.swp" 파일의 inode가 14번임을 확인하였으니, 0x2800 + 0x80 * (14 - 1) = 0x2e80 계산을 통해 inode table 주소로 이동합니다.

 

ex11.c.swp Inode Table (0x2e80)

0x2e80에서 "ex11.c.swp'의 block location을 확인한 결과 '30' → 0x30 = 48번째 block에 위치하는 것을 알 수 있습니다.

 

따라서 "root/temp/d8/d9/ex11.c.swp" 파일 주소는 0x30 * 0x400 = 0xc000에 존재하고 있습니다.

 

 

ex11.c.swp File Location (0xc000)

파일 주소로 이동하여 확인해본 결과, ‘ex11.c.swp’ 파일의 내용을 확인할 수 있었습니다. 무수하게 많은 C언어 코드 정보들이 16진수로 구성되어져 있었습니다.

 

마찬가지로 "/root/temp/d8/d9/ex1.cc.swx " 파일의 inode가 15번임을 확인하였으니, 0x2800 + 0x80 * (15 - 1) = 0x2f00 계산을 통해 inode table 주소로 이동합니다.

 

 

ex1.cc.swx Inode Table (0x2f00)

0x2f00에서 "ex1.cc.swx'의 block location을 확인한 결과 ‘48' → 0x48 = 72번째 block에 위치하는 것을 알 수 있습니다.

 

따라서 "root/temp/d8/d9/ex1.cc.swx" 파일 주소는 0x48 * 0x400 = 0x12000에 존재하고 있습니다.

 

ex1.cc.swx File Location (0x12000)

파일 주소로 이동하여 확인해본 결과, ‘ex1.cc.swx’ 파일의 내용을 확인할 수 있었습니다. 제가 구현했던 ‘ex1.c’ 파일의 C언어 코드 정보들이 16진수로 구성되어져 있었습니다. 따라서 해당 파일이 제가 작성한 C언어 코드임을 확인하였습니다.

 

 

정리하면 이번 문제를 진행하면서 차례대로 ‘temp’, ‘temp/d8’, ‘temp/d8/d9’, ‘temp/d8/d9/ex11.c.swp’, ‘temp/d8/d9/ex1.cc.swx’ 파일의 경로를 바탕으로 블록 주소를 이동하면서 파일 및 디렉토리에 담겨진 정보를 확인할 수 있었습니다. 또한 72번째 블록에 제가 작성한 C언어 코드가 포함되어 있음을 확인하였습니다. 최종적으로 ‘ex1.c’ 파일을 만든 뒤 C언어를 작성하고 컴파일하게 되면 파일 시스템 내에서 어떤 변화가 일어나는지 알 수 있었습니다.

728x90