본문 바로가기

학부_대학원/대학원_학과공부정리

[initrd] Initial RAM disk

SMALL

initrd 란?


initrd는 initial RAM disk 의 약어이다. 초기 nitrd는 실제 루트 파일 시스템을 사용할 수있게되기 전에 마운트되는 초기 루트 파일 시스템이다.

램 디스크 또는 주 기억 장치 활용 저장법은 디스크가 아닌 램을 이용하여 디스크 드라이브를 구현하는 방식

initrd는 커널에 바인딩되어 커널 부팅 절차의 일부로 동작한다. 그리고 initrd는 커널의 2단계 부트 프로세스의 일부로서 동작한다.

이때, 프로레스의 일부로 마운트되고 모듈을 로드하여 실제 파일 시스템을 사용가능하게 만드는 역할과 실제 사용될 루트 파일 시스템에 도달하게 한다.

initrd에는 커널 모듈을 커널에 설치하는 insmod tool과 같이 최소한의 디렉토리와 실행 파일의 집합이 포함되어 있다.

우리가 많이 사용하는 데스크, 서버 시스템의 경우와 initrd는 나중에 실제 사용될 파일 시스템을 부팅? 시키기 위한 일시적인 단계의 시스템이다.

하지만 스토리지가 없는 임베디드 시스템에서는 initrd는 영구적인 루트 파일 시스템이다. 


initrd 분석


initrd 이미지에는 Linux 시스템의 2 단계 부팅을 지원하는 데 필요한 실행 파일과 시스템 파일이 들어 있다.

리눅스가 돌아가는 버전에 따라 다르지만, initrd를 생성하는 방법은 매우 다양하다. fedora core3 이전 버전의 initrd는 loop device이다

* 즉, image file이 마치 일반적인 block device인 것 처럼 만들어 마운트될 수 있게 하는 디바이스 드라이버이다.

(이미지 파일을 일반적인 block device 로 사용하는 것이라고 생각하시면 쉽습니다)

만약에 루프 디바이스가 현재 커널에서 지원하지 않는다면 커널 설정에서 변경할 수 있다. 

Device Drivers > Block Devices > Loopback Device Support [kernel configuration]



Manually building a custom initial RAM disk


많은 리눅스 시스템을 사용하는 임베디드 시스템에서는 저장공간(하드 드라이브)가 존재하지 않기 때문에, initrd는 계속 사용되는 루트 파일 시스템으로

취급한다. 밑의 코드는 initrd 이미지를 어떻게 생성하는지에 대한 코드를 보여주고 있다. 

표준 Linux 데스크탑을 사용하므로 임베디드 대상없이 수행 할 수 있다. 하지만 타겟이 다른 아키택쳐일 경우 크로스 컴파일이 필요한 내용을 제외하고,

initrd에 적용되는 개념은 동일하다.


2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/bin/bash
 
# Housekeeping...
rm -/tmp/ramdisk.img
rm -/tmp/ramdisk.img.gz
 
# Ramdisk Constants
RDSIZE=4000
BLKSIZE=1024
 
# Create an empty ramdisk image
dd if=/dev/zero of=/tmp/ramdisk.img bs=$BLKSIZE count=$RDSIZE
 
# Make it an ext2 mountable file system
/sbin/mke2fs --0 -b $BLKSIZE /tmp/ramdisk.img $RDSIZE
 
# Mount it so that we can populate
mount /tmp/ramdisk.img /mnt/initrd -t ext2 -o loop=/dev/loop0
 
# Populate the filesystem (subdirectories)
mkdir /mnt/initrd/bin
mkdir /mnt/initrd/sys
mkdir /mnt/initrd/dev
mkdir /mnt/initrd/proc
 
# Grab busybox and create the symbolic links
pushd /mnt/initrd/bin
cp /usr/local/src/busybox-1.1.1/busybox .
ln -s busybox ash
ln -s busybox mount
ln -s busybox echo
ln -s busybox ls
ln -s busybox cat
ln -s busybox ps
ln -s busybox dmesg
ln -s busybox sysctl
popd
 
# Grab the necessary dev files
cp -/dev/console /mnt/initrd/dev
cp -/dev/ramdisk /mnt/initrd/dev
cp -/dev/ram0 /mnt/initrd/dev
cp -/dev/null /mnt/initrd/dev
cp -/dev/tty1 /mnt/initrd/dev
cp -/dev/tty2 /mnt/initrd/dev
 
# Equate sbin with bin
pushd /mnt/initrd
ln -s bin sbin
popd
 
# Create the init file
cat >> /mnt/initrd/linuxrc << EOF
#!/bin/ash
echo
echo "Simple initrd is active"
echo
mount -t proc /proc /proc
mount -t sysfs none /sys
/bin/ash --login
EOF
 
chmod +/mnt/initrd/linuxrc
 
# Finish up...
umount /mnt/initrd
gzip -9 /tmp/ramdisk.img
cp /tmp/ramdisk.img.gz /boot/ramdisk.img.gz
cs


initrd를 생성하기 위해서 empty 파일 생성으로 시작한다.  4mb파일을 생성하고 1k block 사이즈를 가진다.

mke2fs (make to filesytem)명령어를 이용해서 empty파일을 ext2 파일시스템으로 구성한다. 

그리고 loop device로 해당 빈 파일을 /mnt/initrd에 마운트 시킨다.

이제 마운트 지점에서 initrd에 채울 수있는 ext2 파일 시스템을 나타내는 디렉토리가 생겼습니다. 

나머지 스크립트 대부분은이 해당 파일 시스템에 사용할 파일들을 채우는 내용으로 진행된다. 

루트 파일 시스템에서 사용할 하위 디렉토리를 생성한다. 예를 들어 /bin, /sys,  /dev, /proc 을 만든다. 

매우 작게 만든다 libc와 같은 내용은 포함하지 않는다.

루트 파일 시스템에 busybox를 이용하여 가용성을 높인다. 우리가 많이 사용하는 리눅스 명령어(awk, sed insmod)와 같은 것을 사용하게 해준다.

busybox를 /bin에 복사한다. 그리고 필요한 심볼릭 링크를 생성한다. 

다음 단계는 소수의 특수 장치 파일을 만드는 것입니다. 나는 현재의 / dev 서브 디렉토리에서 -a 옵션 (아카이브)을 사용하여 속성을 보존한다.

다음 단계는 linuxrc 파일을 생성하는 것이다. 커널이 ramdisk를 마운트 한 후 초기화에 사용하는 파일이다.

가장 먼저 찾는 파일은 init파일이지만 해당 파일이 존재하지 않으면 그 다음으로 찾는 파일이 linuxrc 파일을 시작 스크립트로 사용한다.

해당 파일에서 /proc 파일 시스템 마운트, /sys 파일 시스템 마운트 등 기본적인 환경 설정이 수행된다. 

그리고 ash(shell)을 호출하여 루트 파일 시스템과 상호 작용할수 있게한다.

마지막으로 루트 파일 시스템이 만들어 졌다.

마운트 해제 한 다음 gzip을 사용하여 압축하고 , 결과 파일 (ramdisk.img.gz)은 /boot 서브 디렉토리에 복사되므로 GNU GRUB을 통해로드 할 수 있습니다.



[참조] http://icarus21.tistory.com/entry/Loop-Device
[출처] https://www.ibm.com/developerworks/library/l-initrd/


LIST

'학부_대학원 > 대학원_학과공부정리' 카테고리의 다른 글

OS Remote Detection - [2]  (0) 2018.03.19
[QEMU] qocw2 파일 포맷  (0) 2018.03.07
[QEMU] 주변장치 추가  (0) 2018.03.05
[QEMU] DBI 번역  (0) 2018.02.27
[QEMU] Execution 분석  (0) 2018.02.26