소프트웨어 엔지니어/일반

[소프트웨어 엔지니어] 리눅스 루트파일시스템

shroomie 2024. 10. 16. 12:07

* 앞으로 쓸 리눅스 부팅, yocto, device driver, kernel, dti 등등에 대해서 쓰기 전에.... 
오늘은 rootfs 에대해서 좀 자세히 알아볼께. 
(내가 쓰는 글을 하나둘씩 읽다보면 언젠가 조각이 맞춰지는 듯한 느낌을 받기 바라면서...)

우리가 ubuntu linux 처럼, 배포판 리눅스를 받으면 그 안에 
루트파일시스템도 있고, 커널도 있고, 패키지 메니져도 있고, systemd, systemctl 등등 그냥 사용하면 되지만,
만약!
임베디드 리눅스처럼 커스텀 리눅스를 개발해야 한다거나, 
아님.. 그냥 루트파일시스템이 궁금하거나 ^^ 하면 아래 글을 한번 읽어보면 좋아. 

자!. 나만의 리눅스를 만드려고
리눅스.org 에서 커널을 받아서 컴파일하고 부팅하려면,부팅이 안되. 
(많은 이유가 있겠지만, 이글은 루트파일스트템글이니까) 루트파일시스템이 커널코드에 없거든...
시스템이 부팅하려면 systemd (뭐 안드로이드는 initrc인가가 같은 역할을 할껀데..그랬던듯)
가 일도 해야 하고,어쩌고 해야 하는데, systemd 가 없다는 말이야. 
당연하겠지. systemd 도 파일인데, 파일을 모아놓은 시스템이 없으니...

해결책은? 당연히 루트파일스스템을 만들어야지. 
buildroot, yocto (이런거 어디서 많이 들어봤지.) 
저게 빌드시스템인데, 저툴(다 툴이야)을 사용하면 루트파일시스템도 만들수 있어. 그렇게 만들어서 
커널에 붙여(?) 줘야 나의 커스텀 리눅스 시스템이 제대로 작동한다는..

/

위에 '/' 가 root directory이고, (리눅스 시스템의 가장 상위디렉토리 인데, 윈도우로 하면 C:// 라고 생각하면 쉬울꺼 같아.) 
그 밑으로 필요한 디렉토리를 주르륵 만들고, 필요한 파일들을 복사 붙여넣어서.. 
아래와 같은 형태로 만들어주면 그게 루트파일시스템이야. 
 
cd / 
tree -L 1 .
.
├── Docker
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── greengrass
├── home
├── init
├── lib -> usr/lib
├── lib32 -> usr/lib32
├── lib64 -> usr/lib64
├── libx32 -> usr/libx32
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── snap
├── srv
├── sys
├── tmp
├── usr
└── var
이게 루트파일시스템이야!!

그런데 잘 보면 어디서 많이 본애들같지 않아? 
리눅스 아마 공부할때 많이 들어봤을  
dev 폴더도 보이고, sys 폴더도 보이고 , bin 폴더도 보이고. 익숙하지. 
맞아 그 공부하던 디렉토리들이 루트디렉토리 밑에 주르륵 있는거야.(리눅스 커널 코드 디렉토리랑은 다른거야....헤깔릴까봐)
각각 자기 목적에 맞는 파일들을 가지고 있는거지. 
systemd 는 어디에 있을까? 
/bin 디렉토리에 가보면 누군가(?) 컴파일해서 바이너리를 가져다 놓았을꺼야 
많이 사용하는 systemctl 프로그램도 /bin 디렉토리에 컴파일된 바이너리가 있으니. 우리가 편하게 사용할수 있는거야. 
만약에 너만의 systemctl 을 만들고 싶다면 
systemctl 오픈소스 깃헙찾아서, 코드 받아서, 수정한다음에, 너가 루트파일시스템만들때 bin 에 넣어놓으면 됨. (환경어쩌고는설명안한다..) 

그럼...홈디렉토리는 뭘까? 이런질문~ 환영합니다.