カーネルの実体
Linux カーネルは vmlinux というファイル 1 つで構成されている。 実際には vmlinux そのままではなく、gzip で圧縮された vmlinuz というファイルが、/boot 配下に置かれている。
$ ls -l /boot/
total 113612
-rw-r--r--. 1 root root 137701 May 28 17:12 config-3.10.0-514.21.2.el7.x86_64
drwxr-xr-x. 2 root root 39 Jun 13 15:37 grub/
drwx------. 6 root root 111 Jun 29 09:37 grub2/
-rw-------. 1 root root 38189435 Jun 13 15:29 initramfs-0-rescue-2c0164cc85e344b6837514530c15f0d7.img
-rw-------. 1 root root 37708703 Jun 13 15:33 initramfs-3.10.0-514.21.2.el7.x86_64.img
-rw-------. 1 root root 26103785 Jun 27 02:58 initramfs-3.10.0-514.21.2.el7.x86_64kdump.img
-rw-r--r--. 1 root root 277955 May 28 17:13 symvers-3.10.0-514.21.2.el7.x86_64.gz
-rw-------. 1 root root 3114214 May 28 17:12 System.map-3.10.0-514.21.2.el7.x86_64
-rwxr-xr-x. 1 root root 5396288 Jun 13 15:29 vmlinuz-0-rescue-2c0164cc85e344b6837514530c15f0d7
-rwxr-xr-x. 1 root root 5396288 May 28 17:12 vmlinuz-3.10.0-514.21.2.el7.x86_64
以下、掻い摘んで説明。
- vmlinuz-3.10.0-514.21.2.el7.x86_64: カーネルの実体
- initramfs-3.10.0-514.21.2.el7.x86_64.img: 初期 RAM ディスク
- System.map-3.10.0-514.21.2.el7.x86_64: vmlinux のシンボルファイルでデバッグ用に用いられる。カーネル起動には不要。
- grub2: ブートローダーが格納されている
file コマンドによりファイルタイプを判別できる。
$ file vmlinuz-3.10.0-514.21.2.el7.x86_64
vmlinuz-3.10.0-514.21.2.el7.x86_64: Linux kernel x86 boot executable bzImage, version 3.10.0-514.21.2.el7.x86_64 (mockbuild@x86-037.build.eng.bos.red, RO-rootFS, swap_dev 0x5, Normal VGA
ちなみに、file コマンドがどのようにファイルタイプを識別しているかというと、ファイルの先頭部分を読み込んで、データパターンを探しているんですね。 識別ルールは /usr/share/file/magic で定義されています。
$ cat /usr/share/file/magic | grep 'boot sector'
0x1FE leshort 0xAA55 x86 boot sector
#30 search/481 \x55\xAA x86 boot sector
#(11.s-2) uleshort 0xAA55 x86 boot sector
#If the boot sector fails to read any other sector,
#If the boot sector fails to find needed program in the root directory,
#If the boot sector fails to read any other sector,
#If the boot sector fails to find needed program in the root directory,
>>>>>>>50 uleshort >6 \b, Backup boot sector %u
#>>>>>>>50 uleshort =6 \b, Backup boot sector %u (usual)
>>>>>>>50 uleshort <6 \b, Backup boot sector %u
>0x1FE leshort 0xAA55 \b, x86 hard disk boot sector
>0x1FE leshort 0xAA55 \b, x86 hard disk boot sector
>0x1FE leshort 0xAA55 \b, x86 hard disk boot sector
>0x1FE leshort 0xAA55 \b, x86 hard disk boot sector
>0x1FE leshort 0xAA55 \b, x86 hard disk boot sector
# strength is changed to try these patterns before "x86 boot sector"
>497 leshort 0 x86 boot sector
# Linux boot sector thefts.
>0x1e6 belong !0x454c4b53 style boot sector
この
0x1FE leshort 0xAA55 x86 boot sector
ですが、“ファイルの先頭から「1FE」バイト目に「リトル・エンディアン」で「0xAA55」という 2 バイト値があれば、Linux カーネルのブート・ファイルであるとしろ” という意味です。
よって、実際に見てみると、
$ hexdump -C /boot/vmlinuz-3.10.0-514.21.2.el7.x86_64 | less
00000150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 |.............. .|
00000160 50 60 2e 72 65 6c 6f 63 00 00 20 00 00 00 e0 41 |P`.reloc.. ....A|
00000170 00 00 20 00 00 00 e0 41 00 00 00 00 00 00 00 00 |.. ....A........|
00000180 00 00 00 00 00 00 40 00 10 42 2e 74 65 78 74 00 |......@..B.text.|
00000190 00 00 30 0b 52 00 00 42 00 00 30 0b 52 00 00 42 |..0.R..B..0.R..B|
000001a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 |.............. .|
000001b0 50 60 2e 62 73 73 00 00 00 00 d0 02 ea 00 30 4d |P`.bss........0M|
000001c0 52 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |R...............|
000001d0 00 00 00 00 00 00 80 00 00 c8 00 00 00 00 00 00 |................|
000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff |................|
000001f0 ff 20 01 00 b3 20 05 00 00 00 ff ff 00 00 55 aa |. ... ........U.|
↑ここ
ありましたね。これがブートフラグ ( 0xAA55 ) です