Linux From Scratch (나만의 리눅스 시스템 만들기)
운영체제가 무엇인지 물어본다면? 교과서적인 관점에서 보면 커널(Kernel)이 하는 역할로 답할 수 있을것이다. 하지만 보다 넓게 시스템의 관점에서 보면 단순하게 운영체제는 파일의 조합이라고 볼 수 있다. 다시말하면 운영체제의 최소단위는 파일이다. 그 파일들은 어떠한 값들이 기록되어있는 설정파일일 수도 있고, 실행 가능한 프로그램일 수도 있으며, 프로그램이 사용하는 라이브러리 파일일 수도 있다. 그런 파일이나 프로그램들이 물리적인 컴퓨터 자원을 적절하게 사용하도록 통합적으로 관리하는 커널도 따지고 보면 파일이다. 실제로도 실행 가능한 파일로 저장되어있다(내가 가진 시스템에서 리눅스 커널 파일은 /boot
디렉토리 내에 위치해있으며 사용자가 아닌 부트로더가 실행시킬수 있다). 이런 파일들을 적절한 위치에 배치하도록 만든 폴더 구조를 루트 파일 시스템이라고 부른다. 물론 이 파일들이 실행이 된다면 스토리지가 아닌 메모리(RAM)에 로딩된다.
$ ls /
bin dev home lib64 media opt root sbin srv sys usr vmlinuz
boot etc initrd.img lib mnt proc run snap swapfile tmp var
직접 터미널을 열어서 ls /
를 쳐보자. /
라는 위치에 다양한 폴더 혹은 파일이 있음을 알 수있다. 이것들이 도데체 무엇일까? 먼저 /
는 지금 내가 가진 운영체제 시스템을 구성하고있는 근본(Root) 위치이다. 운영체제 시스템(정확히는 Unix시스템)에서 모든 파일은 이 위치를 기점으로 존재한다. 운영체제에서 유저영역의 소프트웨어의 동작은 모두 이 범위 내에서 일어난다. 심지어 하드웨어도 /dev
디렉토리 밑에 소프트웨어로 추상화 되어 위치해 있기 때문에 응용프로그램이 컴퓨터의 하드웨어 자원을 읽고 쓸수 있다. 이런 파일시스템 구조와 파일들은 태초부터 존재했던 고정불변의 것이 아니다. 누군가가 각자의 목적과 시스템에 맞게 설계한것이다. 우분투 같은 리눅스 시스템은 범용적인 PC에서 사용되어야 하기 때문에 처음부터 수 많은 파일들이 위치해있다. 반면 리눅스로 구동되는 소형 임베디드 장비에서는 이런 아주 간소화된 파일 시스템이 구성되어있을 것이다. 안드로이드 같은 리눅스 시스템도 마찬가지로 그 사용목적에 맞게 파일들을 가지고 있으며 적절한 위치에 배치 되어있다. 이런 리눅스 시스템은 어떻게 만들어지는 것일까? LFS프로젝트를 통해 리눅스 시스템이 어떻게 만들어지는지 직/간접적으로 배워볼 수 있다.
LFS(Linux From Scratch)는 커스터마이즈된 나만의 리눅스 시스템을 만들기 위해, 소스코드 부터 시작해 Step by step으로 직접 구축할 수 있도록 매뉴얼을 제공하는 프로젝트이다. LFS 프로젝트는 Gerard Beekmans이라는 개발자에 의해 만들어졌으며 http://linuxfromscratch.org/lfs/ 에 있는 매뉴얼을 보고 직접 따라해볼수 있다. "from scratch" 라는 구문은 맨땅에, 처음부터 라는 의미이다. 말 그대로 리눅스 시스템을 처음부터 만들어보는 것이다. 리눅스 시스템이 동작하기 위해 어떤 파일들이 필요한지 어떤 위치에 어떻게 배치해야 하는지를 익히고, 그에 따라 필요한 프로그램의 소스코드를 일일이 받아서 빌드하여 시스템을 직접 구축한다. 이 프로젝트를 진행 해본다면 운영체제 시스템이라는 거대한 개념을 더욱 넓고, 정교하게 이해할 수 있을것이라고 확신한다. 소프트웨어 개발 업무에 도움이 되는것도 물론이다. 가령 이 프로젝트를 진행해보면 python 의 pip install <module>
명령이 수행되면 대략적으로 어떤일이 발생할 것인지를 직관적으로 느낄수(?) 있게 될 것이다.
이 문서는 내가 LFS 프로젝트(7.7 버전)을 진행하며 배웠던 것들을 정리한 작업이다. 그리고 마지막챕터에서는 라즈베리파이에서 동작하는 최소화된 리눅스 시스템을 직접 구축해보았는데 그것에 대한 기록이 있다. 잘못되었거나 궁금한것이 있다면 댓글로 남겨주시길 부탁드린다.
김지훈 (jihuun.k@gmail.com) 씀.