IT/linux

initrd, mkinitrd 정리해두기 ;)

joanne* 2009. 4. 13. 16:25
 

출처 : http://linuxqna.com/700

 

1.개 요
커널 컴파일이후에 꼭 필요한 명령 중의 하나가 mkinitrd 명령어 이다.
일반적으로 /boot 밑에 mkinitrd-<kernel version>.img 파일을 만들면서 이 명령어를
쓰게 된다. 하지만 이 mkinitrd에 무엇이 들어가며 무엇이 들어가는지에 대하여
항상 궁금했었다. (나만의 생각인가..ㅠ.ㅠ)
그래서 한번 살펴 보고자 이렇게 글을 써본다.

2.mkinitrd 명령어에 대하여
가. 사용법
일반적으로 사용하는 방법은 아래와 같다.
mkinird <initrd-image> <kernel-version>
* initrd-image : 만들고자 하는 initrd의 파일명
* kernel-version : /lib/modules 밑에 존재하는 커널 버전명을 쳐 준다.

아래는 kernel 2.6.10 버전에 대한 initrd를 생성하는 예를 보여 준 것이다.

[root@test root]# mkinitrd /boot/initrd-2.6.10.img 2.6.10

나. mkinitrd의 옵션

--builtin=module : 모듈이 모듈형태로 동작하는 것이 아니라 커널내부 동작해야
하는 모듈이면 이 옵션을 사용하면 될 것이다.

-f : initrd-image 이름이 이미 존재면 덮어쓰기를 하게 해준다.

--fstab=fstab : 기본적으로 /etc/fstab를 참조하지만 자신이 만든 fstab 파일을
참조하게 만들 때 사용한다.

--preload=module : initrd가 실행할 때 SCSI 모듈이 올라오는 것을 기준으로
SCSI 모듈 전에 실행될 모듈을 지정할 때 사용한다.

--with=module : initrd가 실행할 때 SCSI 모듈이 올라오는 것을 기준으로
SCSI 모듈 후에 실행될 모듈을 지정할 때 사용한다.



3.initrd-<kernel-version>.img의 내용 확인
가. initrd-<kernel-version>.img 마운트 하기

[root@test boot]# file initrd-2.6.10.img
initrd-2.6.10.img: gzip compressed data, from Unix, max compression
/* gzip으로 압축된 것을 알 수 있음. */
[root@test boot]# cp initrd-2.6.10.img initrd-file.gz
[root@test boot]# gunzip initrd-file.gz
/* 압축이 풀리면서 initrd-file로 변경됨 */
[root@test boot]# mkdir initrd-mount
[root@test boot]# file initrd-file
initrd-2.6.10.img: ASCII cpio archive (SVR4 with no CRC)
/* cpio 명령어를 이용하여 파일 및 디렉토리가 압축된 것을 알수 있다. */
/* 2.4대에서는 이 부분에 cpio로 압축이 되어 있지 않아서 mount 옵션으로
마운트를 시켜서 확인할 수 있음 (mount -o loop initrd-file initrd-mount/ ) */
[root@test boot]# cp initrd-file initrd-mount/
[root@test boot]# cd initrd-mount
[root@test initrd-mount]# cpio -idmv < initrd-mount
/* 압축된 디렉토리 및 파일들이 풀리는 것이 보일 것이다. */

[root@test initrd-mount]# tree
// 이 명령어가 없으면 tree rpm 파일을 설치하세요.
.
|-- bin
| |-- hotplug -> /sbin/nash
| |-- insmod
| |-- modprobe -> /sbin/nash
| |-- nash
| |-- udev
| `-- udevstart -> udev
|-- dev
| |-- console
| |-- null
| |-- ram
| |-- systty
| |-- tty1
| |-- tty2
| |-- tty3
| `-- tty4
|-- etc
| `-- udev
| `-- udev.conf
|-- init
|-- lib
| |-- ext3.ko
| |-- jbd.ko
| |-- libata.ko
| |-- sata_nv.ko
| `-- sd_mod.ko
|-- loopfs
|-- proc
|-- sbin -> bin
|-- sys
`-- sysroot


나. initrd내의 트리별 내용
1)init : 이 파일은 nash에 있는 실행 파일로 우리 시스템의 /etc/rc.d/ 밑에 있는
파일들 처럼 최초에 실행되면 어떤 순서로 실행될 지가 정의 되어 있는
스크립트 파일이다. 이 파일이 없으면 linuxrc 파일이 있을 것이다.
[root@test initrd_mount]# file init
init: a /bin/nash script text executable

2) bin 디렉토리
가) insmod : /sbin/insmod.static 부분을 카피해서 가지고 있는 것이다.
최초로 부팅시에는 공유라이브러리를 사용하지 못하기 때문에
라이브러리가 필요없는 static 옵션을 주어 컴파일 한 insmod를 사용하여
필요한 모듈을 올리기 위하여 복사된 것이다.
나) nash : 이 파일은 명령어의 집합체라고 보는 것이 좋을 것이다.
여러가지의 명령어가 심볼릭 링크의 이름으로 동작하게끔 만들어진
명령이다. 쉘 역할을 하면서 몇 가지의 주요 명령어를 이용할 수 있다.
이것 또한 static으로 컴파일 된 것이다.
다) udev : 디바이스 관련 명령어로 어떤 디바이스가 연결되었는지 안되어
있는 지를 확인하여 올려주거나 삭제해 주는 역할을 한다.
/sbin/udev.static가 복사된 것이다.

3) dev 디렉토리
가) console : 시스템 콘솔에 있는 파일이나 디바이스 드라이버를 직접
입출력을 할 수 있도록 제공된 것이다.
나) null : 운영체제를 위하여 제공된 파일이며 null device를 실행하는 역할을
한다.
다) ram : ram 디바이스를 위하여 제공된 파일로 ram에 직접 입출력을
할 수 있게 해준다.
라) tty1~4 : 일반적으로 virtual terminals로 알려진 걸로 시스템으로 부터
올라오는 메세지를 화면상에 뿌려주는 역할을 한다.
마) systty : 키보드나 모니터가 없는 환경에서 심볼릭 링크를 이용하여
디바이스를 사용할 수 있게 해준다. 이것에 대한 자세한 사항은
인터넷 검색하여 사용해 보는 것도 재미있을 것 같다.

4) lib 디렉토리
이 디렉토리는 모듈을 가지고 있는 것을 알 수 있을 것이다. 이 부분에
있는 모듈이 바로 initrd가 올려주는 모듈들이다.

5)나머지 디렉토리
가) proc : procfs의 정보를 마운트 해주는 디렉토리이다.
mount -t proc none proc 를 이용하여 현재 /proc에 있는 내용이랑
동일한 것을 마운트 시킨다.

나) sys : sysfs의 정보를 마운트 해주는 디렉토리이다.
mount -t sysfs none sys 를 이용하여 마운트하며 proc과는 다른 정보를
볼 수 있습니다.

다) loopfs : loop 장치를 마운트하기 위한 디렉토리이다.
losetup 명령어를 이용하여 루프 장치를 정규 파일 또는 블럭 장치와
연결, 루프 장치와 분리, 루프 장치의 상태파악을 위하여 마운트 시켜
디렉토리이다.

라) sysroot : 실제 우리가 사용하는 디스크를 마운트 시켜주기 위한
디렉토리이다. 모든 initrd에서의 설정 내용이 다 실행된 이후에
pivot_root 명령어를 사용하여 우리가 현재 보고 있는 디렉토리를
“/”로 보여주는 것이다.

4.왜 initrd는 램 디스크라고 불리는 것일까?
initrd를 풀어서 안의 내용을 보면 모듈을 올리는데 필요한 것과 시스템에 필요한
정보를 마운트할 파일 시스템을 가지고 있는 것을 볼 수 있다.
하지만 모듈들을 잘 살펴보면 파일 시스템과 관련된 ext3.ko, xfs.ko 파일을 볼 수
있을 것이다. 이것은 파일 시스템이 구동되기 위하여 올라가야 하는 모듈들이다.
그럼, 이 모듈을 올려주는 역할을 하는 initrd는 어떻게 동작하기에 이런 모듈을
파일 시스템이 올라오기도 전에 구동되게 하는 것일까?
이것은 바로 부트로더의 역할 때문이다. 부트로더는 최초에 grub.conf나 lilo.conf에
설정된 디스크의 위치와 디렉토리 위치에서 vmlinuz와 initrd 파일을 램으로 복사하는
역할을 해준다. 이것은 결국 부팅시 사용되는 initrd는 램으로 복사된 initrd를 이용하
여 램상에서 동작을 하는 것이다. 결국 램을 디스크처럼 생각하고 그 곳에 tree에서
본 구조를 그대로 풀어서 init의 설정 내용대로 실행한 이후에 실제 우리가 사용하는
디스크로 넘어와 /sbin/init를 실행하게 된다.
결국 램에서 동작하면서 램을 디스크처럼 이용하기에 램 디스크라고 하는 것이다.

5.mkinitrd 명령어의 역할
가. initrd를 위한 파일 시스템을 구성한다.

나. 부팅시 필요한 모듈을 옮겨준다.
* 2.6 커널 : /etc/modprobe.conf 파일 참조
* 2.4 커널 : /etc/modules.conf 파일 참조
* modprobe.conf내의 usb-controller, scsi_hostadapter를 이용한 모듈만을 넘긴다.
* fstab를 검색하여 파일 시스템에 필요한 모듈을 올려준다.

다. initrd에서 필요한 파일 복사해 준다.

라. initrd에 있는 init를 생성 시켜준다.

* mkinitrd내의 RCFILE를 생성시켜주는 부분을 참조해 주세요..^^


[출처] initrd의 역할|작성자 진진진진