4-1) 파일시스템 직접 만들어 보기
1. 파일시스템 직접 만들어 보기
지금까지 우리는 저장매체의 0번 섹터인 MBR부터 파티션 테이블 구조를 공부하였고, 드디어 원하는 파티션 영역에 시작까지 도착하였습니다. 이제 파티션 시작 섹터부터 마지막 섹터 내에 우리가 파일을 저장하고 관리할 파일시스템을 넣어보자. 이 실습은 무조건 필수는 아니나 파일시스템에 대해 어떤 것인지 잘 알 수 있는 좋은 실습일 것입니다.
1-1) 파일시스템 만들기 처음 고민할 것
아주 간단한 구조를 가진 파일시스템에 대해 고민을 먼저 해보고 구현을 해보겠습니다. 당연히 처음부터 모든 구조를 만들면 어려울 수 있으니, 최소한만 아래 내용을 참고하여 ChatGPT를 이용하여 만들어 봅시다.
빠른 실습을 위해 아래 소스를 받아 한번 실행 해보시고, 이후에는 본인이 직접 소스를 만들고 활용해보시는 것을 추천합니다.
파일시스템부트 코드
우선 파일시스템 가장 시작 위치(파일시스템 부트코드라고 하자)에는 파일시스템에 대한 필요한 정보를 고민해보겠습니다. [0번 섹터]
파일시스템 표시(8 BYTE) : 원하는 텍스트 / "Start_FS"
파일시스템 전체 크기(4 BYTE) : 100MB를 표시해보자.
파일시스템 생성 시간(4 BYTE) : 현재시간을 저장
파일시스템의 첫번째 폴더 위치(4 BYTE) : 1로 지정하여 1번 섹터를 가리키자
빈 공간(490 BYTE)
부트시그니처(2 BYTE) : 원하는 시그니처 지정해보자 / "AA BB"
파일 시스템 루트 폴더 / 파일 엔트리
첫번째 폴더(루트) 위치해야 할 정보는 무엇일까? 폴더 내 파일에 관한 정보에 들어가야 할 것은 몇 바이트씩 하면 좋을까?
처음이니 가볍게 파일시스템 1섹터(루트폴더)에 8개의 파일정보(파일엔트리)를 가질 수 있도록 해보겠습니다.(파일 엔트리 크기 32BYTE로 1섹터에 16개의 파일엔트리를 저장해보자)
파일명(14 BYTE)
파일인지 폴더인지 여부(1 BYTE) :00이면 파일, 11이면 폴더
파일 삭제 여부(1 BYTE) : 00이면 삭제 안함, FF이면 삭제
파일 크기(4 BYTE) : 파일의 크기 / 폴더는 0
파일의 생성시간(8 BYTE) : 파일 생성시간 기록
시작 섹터번호(4 BYTE) : 파일의 시작 섹터번호
텍스트로 저장된 파일 만들기
[ 루트 폴더(1번 섹터)]
루트 파일엔트리 1번 파일명 : SUBFOLDER / 폴더 시작섹터 : 5번
파일엔트리 2번 파일명 : FILE.TXT 시작섹터 : 100 번 파일크기 : 100섹터의 데이터 내용의 크기 (100번 섹터 내용) : "파일 시스템 첫 도전!"
[5번 섹터]
파일엔트리1번 파일명 : sub_file.txt 시작섹터 : 20번 파일크기 : 20섹터의 데이터 내용의 크기 (20번 섹터 내용) : "서브폴더 내 파일!!"
1-2) 파일시스템 만들고분석 해보기
소스(파일시스템 만들기 소스 , 파일시스템 분석 소스)
나만의 파일시스템 시스템 만들기
우선 위 소스를 실행 후 python으로 실행하여 봅시다. > python "나만의 파일 시스템 만들기.py" 위 소스를 실행하면 위의 요구사항대로 구현한 파일시스템 이미지가 생성됩니다.
HxD를 실행 한 뒤 도구 - 디스크 이미징 열기에서 위에서 생성한 파일시스템을 열어봅시다. 열어보면 섹터 기준을 넣으면 되는데 대부분 512byte가 1섹터이기 때문에 512로 설정됩니다.
0번 섹터(파일시스템 부트 섹터)한 번 분석해 봅시다.
파일시스템 표시(8Bytes) : Start_FS 로 원하는 파일시스템 시그니처로 지정(큰 의미 없음)
파일시스템 전체 크기(4 BYTE) 00 00 40 06 -> 06 40 00 00 = 104,857,600 = 100 Mbytes
파일시스템의 첫 번째 폴더 위치(4 BYTE) 01 00 00 00 = 1번 섹터 위치
1섹터 마지막 2바이트 : AA BB 로 우리가 임의 로 지정한 시그니처
사실 시그니처 부분은 우리가 필요할 수도 있고 필요하지 않는 영역이기는 하나, 만약 우리가 만든 파일시스템이 많은 사람이 쓰게 된다면, 다른 파일시스템과 구분을 하기 위한 용도로 사용 가능합니다. 시간 정보는 HxD 에서 +9시간을 더 해야 합니다. (UTC +9 한국시간)
바로 밑으로 내리면 1번 섹터이며 1번 파일엔트리를 살펴보겠습니다.
파일명 : SUBFOLDER
종류 : 11 (폴더)
삭제여부 : 00 (삭제 안함)
파일크기 : 0 BYTES
생성시간 (바뀔 수 있습니다.)
시작섹터 번호 : 05 00 00 00 -> 00 00 00 05, 5번 섹터에 해당 폴더 정보 위치
그럼 이제 2번 파일 엔트리를 분석해보도록 해봅시다. 1. 파일명 : FILE.txt 2. 종류 : 00 (파일) 3. 삭제여부 : 00 (삭제 안함) 4. 파일크기 : 1A 00 00 00 -> 00 00 00 1A (26 bytes) 5. 생성시간 6. 시작섹터 번호 : 64 00 00 00 -> 00 00 00 64 (16진수) -> 100(10진수) / 100번 섹터
우선 100번 섹터를 먼저 확인해보도록 하겠습니다. 어떤 값이 있는데 무엇인지 알 수 없으나 데이터가 는 것을 볼 수 있습니다.
subfolder의 데이터가 있는 5번 섹터를 한번 가보도록 해봅시다. 자세히 보면 다시 파일 엔트리가 위치는 것을 볼 수 있습니다. 즉, 하위 폴더에 파일이 위치가 있는 것 입니다.
파일명 : sub_file.txt
종류 : 00 (파일)
삭제여부 : 00 (삭제 안함)
파일크기 : 17 00 00 00 -> 00 00 00 17 (23 bytes)
생성시간
시작섹터 번호 : 14 00 00 00 -> 00 00 00 14 (16진수) -> 20(10진수) / 20번 섹터
[20번 섹터]
1-3) 파일 탐색기 만들기
나만의 파일시스템 탐색기 만들기
"2. 나만의 파일시스템 탐색기.py" 소스의 마지막을 보면 같은 폴더에 이미지 파일이 위치 해야 합니다. 먼저 "1. 나만의 파일시스템 만들기.py"를 실행하면 자동으로 생성되기 때문에 참고하시면 됩니다."
python 명령어를 통해 파일시스템 탐색기 파이썬 코드를 실행해보도록 합시다. > python "1. 나만의 파일 시스템 만들기.py" (파일시스템이미지.img가 만들어져 있으면 실행 할 필요 없음) > python "2. 나만의 파일 시스템 탐색기.py"
파일을 더블클릭 파일의 내용을 새창에서 확인이 가능합니다. 또한 우측에 파일엔트리 분석해서 나온 결과를 확인할 수 있습니다.
폴더 타입인 부분을 들어가면, 해당 폴더의 파일 엔트리를 분석해서 해당 폴더에 있는 파일을 확인할 수 있습니다. 하단에 Back to Root를 통해 최 상위 폴더로 갈 수 있습니다. (당연하게도 1번 섹터로 가서 리스트를 뿌려주면 되겠죠?)
New File을 선택하면 파일을 만들 수 있습니다. 또한, 파일명과 간단한 텍스트를 저장할 수 있습니다.
먼저 FILE.TXT 를 수정하여 저장도 가능합니다. 다만 저장하고 나서 재시작을 하거나 SUBFOLDER 갔다가 Back to Root 해야 반영됩니다. (탐색기 개선시 수정 해야 할 내용입니다. 요건 수정을 못했네요!)
저장 후 HxD에서 새로 이 이미지를 연 다음에 100섹터를 보면 우리가 수정한 내역이 저장 될 것입니다! 다만 그렇다면 100번 섹터의 내용만 수정하면 될까요? 당연히 파일 엔트리의 파일크기가 수정되어야 합니다.
이제 파일을 삭제한번 해보도록 합시다. 파일 선택 후 Delete File을 선택하면 파일이 삭제됩니다만... 우리는 위에서 처음 구조를 짤 때 파일 엔트리에 삭제여부만 FF 로 변경하는 것으로 하였습니다. 실제로 파일엔트리를 지우거나, 해당 파일의 섹터 영역을 직접 가서 지우는 것은 하지 않았습니다.
그렇기 때문에 단순하게 FF 여도 보이게 해주면 되겠죠? Show Deleted 를 체크하면 삭제한 파일도 보이는 상태입니다.
파일을 삭제 할 때 일일이 파일 엔트리를 지우는거 보다는 삭제되었다는 표시만 해주면 조금 편리하지 않을까요? 완벽히 지우기 위해서는 파일 엔트리를 지우고, 해당 섹터를 찾아가서 모두 0으로 덮어쓰거나 하는 방식을 해야 됩니다만.. 우리는 파일 용량이 매우 작기 때문에 상관 없지만, 용량이 매우 크다면 매우 많은 섹터를 사용하게 될 것입니다. 모든 섹터를 일일이 가서 지우는 건 오래 걸릴 것입니다.
2. 파일시스템 포맷하기
자 이제 파일시스템 포맷을 해보도록 합시다. 포맷하는 방법은 아주 간단합니다. 처음 우리가 이미지 생성한 소스를 그대로 다시 한번 실행하여 봅시다. 당연하게도 생성한 파일시스템 이미지명을 바꾸지 않았다면 초기버전으로 덮어썼을 것입니다.
이렇게 파일시스템의 구조를 다시 구축하는 것을 포맷으로 이해하시면 됩니다. 물론 이번에는 테스트를 위해 FILE.TXT, sub_file.txt, SUBFOLDER가 있긴 하지만 파일들에 대한 파일 엔트리가 모두 사라질 것이고, 어디에 무슨 파일이 있는지 알 수 없을 것입니다.
100번 섹터에 00 으로 덮어쓰지 않고 그냥 파일 엔트리 부분만 싹 정리해도 100번 섹터에 어떤 파일이 있었는지 알 수 없고, 그냥 새롭게 만들고 덮어쓰면서 새로 사용하게 되는 것입니다. 우리가 아는 usb, 디스크 포맷이 어떤것인지 이해가 되실거라고 생각됩니다!
우리가 만든 파일시스템은 우리의 탐색기로만 파일의 데이터가 어디에 있는지, 파일명이 무엇인지 파악을 할 수 있습니다. 윈도우나 다른 운영체제는 우리의 파일시스템 구조를 모르기 때문에 활용을 할 수 없는 것이죠.. 만약 제 USB에 위의 파일시스템 구조대로 섹터에 데이터를 입력하면, 우리가 만든 탐색기로만 USB를 읽고 쓰고 할 수 있을 것입니다.
다음 시간부터는 많이 사용하고 알려진 파일시스템에 대해서 분석해보도록 합시다.
Last updated