今回は残課題の⑩を調査します。

【関連記事】


【キーワード】
boot
  • 2019/8/30
/bootの中をもうちょっと調べる

【PC-Linuxビルド】(2019/07/09:ビルド後編)ではカーネルイメージをインストールしたところで満足したが/bootの中にインストールされたinitrdとか、複数あるvmlinuzから3.14.79版がどう選ばれるのかを調べたい。

  • /bootにインストールされたイメージは、どうやって選ばれるのか?
Linuxがブートするまでを読んだ。/boot/grub/menu.lstに起動するOSが書いてあるとあるが、そんなファイルはない。私のLinux(Ubuntu14 )とは環境が異なるっぽい。

システムの起動Linuxのブートシーケンスの基礎まとめを読んだ。うーん...。これも違うな。

8.11. カーネルのインストールを読んだ。コレ当たりかも?

8.11.1. Debian カーネルパッケージの特徴
Debian カーネルパッケージはカーネルイメージ (vmlinuz-version) をインストールします。カーネルの設定 (config-version) とシンボルテーブル (System.map-version) は /boot/ に置かれます。シンボルテーブルは開発者がカーネルエラーメッセージの意味を理解する際の手助けになります。それどころかシンボルテーブルがなければ、カーネルの「oops」(「oops」とはカーネル空間で起こるユーザ空間プログラムのセグメンテーション違反に相当するエラーです。言い換えれば、不正なポインタを参照して値を取得したことで生成されるメッセージです) に含まれる情報は、数字で表したメモリアドレスだけになります。アドレスとシンボルや関数名を対応付けるテーブルがなければ、この情報は役に立ちません。モジュールは /lib/modules/version/ ディレクトリにインストールされます。
カーネルパッケージの設定スクリプトは自動的に initrd イメージを生成します。initrd はブートローダによってメモリに読み込まれる小さなシステムで (このため「init RAM ディスク」と名付けられています)、Linux カーネルは initrd を使って完全な Debian システムを含むデバイス (たとえば SATA ディスクのドライバ) にアクセスするために必要なモジュールを読み込みます。最後に、カーネルパッケージの post-installation スクリプトが /vmlinuz、/vmlinuz.old、/initrd.img、/initrd.img.old のシンボリックリンクを更新します。これらはそれぞれインストールされた最新の 2 つのカーネルとカーネルに対応する initrd イメージを指します。
これらの作業のほとんどは /etc/kernel/*.d/ ディレクトリの中にあるフックスクリプトが担っています。たとえば、grub との統合は、カーネルがインストールまたは削除された際に update-grub を呼び出す /etc/kernel/postinst.d/zz-update-grub と /etc/kernel/postrm.d/zz-update-grub が担っています
カーネルインストール後、/etc/kernel/postinst.d/zz-update.grub、/etc/kernel/postrm.d/zz-update.grub、というスクリプトが/vmlinuz、/vmlinuz.old、/initrd.img、initrd.img.oldというシンボリックリンクを更新するとのこと。早速、ルートディレクトリをls -lしてみたが、リンクは古いままだった(3.13.0-24のまま)。ハズレ。
$ ls -l /
合計 101
drwxr-xr-x   2 root root  4096  2月 17  2019 bin
drwxr-xr-x   5 root root  1024  8月 30 04:22 boot
drwxrwxr-x   2 root root  4096  2月 17  2019 cdrom
drwxr-xr-x  19 root root  4200  8月 27 23:03 dev
drwxr-xr-x 144 root root 12288  8月 27 23:03 etc
drwxr-xr-x   3 root root  4096  2月 17  2019 home
lrwxrwxrwx   1 root root    33  2月 17  2019 initrd.img -> boot/initrd.img-3.13.0-24-generic
lrwxrwxrwx   1 root root    33  2月 17  2019 initrd.img.old -> boot/initrd.img-3.13.0-24-generic
drwxr-xr-x  23 root root  4096  2月 17  2019 lib
drwxr-xr-x   2 root root  4096  2月 17  2019 lib32
drwxr-xr-x   2 root root  4096  2月 17  2019 lib64
drwxr-xr-x   2 root root  4096  2月 17  2019 libx32
drwx------   2 root root 16384  2月 17  2019 lost+found
drwxr-xr-x   2 root root  4096  4月 19  2014 media
drwxr-xr-x   2 root root  4096  4月 11  2014 mnt
drwxr-xr-x   4 root root  4096  2月 24  2019 opt
dr-xr-xr-x 149 root root     0  8月 27 23:03 proc
drwx------   2 root root  4096  2月 17  2019 root
drwxr-xr-x  24 root root   820  8月 30 04:12 run
drwxr-xr-x   2 root root 12288  2月 17  2019 sbin
drwxr-xr-x   2 root root  4096  4月 19  2014 srv
dr-xr-xr-x  13 root root     0  8月 30 04:23 sys
drwxrwxrwt   4 root root  4096  8月 30 04:17 tmp
drwxr-xr-x  12 root root  4096  2月 17  2019 usr
drwxr-xr-x  13 root root  4096  4月 22  2014 var
lrwxrwxrwx   1 root root    30  2月 17  2019 vmlinuz -> boot/vmlinuz-3.13.0-24-generic
よくわかんないので、/bootの下をpavement1234でgrepしてみることに。まずは1階層目(/boot/*)をgrepしたらたいした情報得られず。
$ sudo grep pavement1234 /boot/*
grep: /boot/efi: ディレクトリです
grep: /boot/grub: ディレクトリです
grep: /boot/lost+found: ディレクトリです
バイナリファイル /boot/vmlinuz-3.14.79-pavement1234 に一致しました
次に2階層目(/boot/*/*)をチェック。/boot/glub/grub.cfgにpavement1234の記載が沢山みつかった。私がちゃんとチェックできてなかっただけですね。
$ sudo grep pavement1234 /boot/*/*
grep: /boot/efi/EFI: ディレクトリです
grep: /boot/grub/fonts: ディレクトリです
/boot/grub/grub.cfg:    linux   /vmlinuz-3.14.79-pavement1234 root=/dev/mapper/ubuntu--vg-root ro  quiet splash $vt_handoff
/boot/grub/grub.cfg:    initrd  /initrd.img-3.14.79-pavement1234

/boot/grub/grub.cfg:    menuentry 'Ubuntu, with Linux 3.14.79-pavement1234' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.14.79-pavement1234-advanced-e949b89d-bd34-49f2-8e9e-742e7ff1d2df' {
/boot/grub/grub.cfg:            echo    'Linux 3.14.79-pavement1234 をロード中...'
/boot/grub/grub.cfg:            linux   /vmlinuz-3.14.79-pavement1234 root=/dev/mapper/ubuntu--vg-root ro  quiet splash $vt_handoff
/boot/grub/grub.cfg:            initrd  /initrd.img-3.14.79-pavement1234
/boot/grub/grub.cfg:    menuentry 'Ubuntu, with Linux 3.14.79-pavement1234 (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.14.79-pavement1234-recovery-e949b89d-bd34-49f2-8e9e-742e7ff1d2df' {
/boot/grub/grub.cfg:            echo    'Linux 3.14.79-pavement1234 をロード中...'
/boot/grub/grub.cfg:            linux   /vmlinuz-3.14.79-pavement1234 root=/dev/mapper/ubuntu--vg-root ro recovery nomodeset
/boot/grub/grub.cfg:            initrd  /initrd.img-3.14.79-pavement1234

grep: /boot/grub/locale: ディレクトリです
grep: /boot/grub/x86_64-efi: ディレクトリです
/boot/grub/grub.cfgを開いてみた。DO NOT EDIT THIS FILEと書いてある。grub-mkconfigが自動生成するからいじるなと。取り急ぎvmlinuz-3.14.79-pavement1234、initrd.img-3.14.79-pavement1234を指しているエントリーを水色にしてみた。他に3.13.0-165、3.13.0-24のエントリーがあった。
$ vi /boot/grub/grub.cfg
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
  set have_grubenv=true
  load_env
fi
if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   set default="0"
fi

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
else
  menuentry_id_option=""
fi

export menuentry_id_option

if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}
function recordfail {
  set recordfail=1
  if [ -n "${have_grubenv}" ]; then if [ -z "${boot_once}" ]; then save_env recordfail; fi; fi
}
function load_video {
  if [ x$feature_all_video_module = xy ]; then
    insmod all_video
  else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
  fi
}

if [ x$feature_default_font_path = xy ] ; then
   font=unicode
else
insmod part_gpt
insmod lvm
insmod ext2
set root='lvmid/grVCX7-Mt6k-1mmr-6K0f-nyxz-1ydy-pZQnfb/ZUiBL7-YYjo-fK8P-5NTK-vtrd-Qoxm-2sYcRl'
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=root --hint='lvmid/grVCX7-Mt6k-1mmr-6K0f-nyxz-1ydy-pZQnfb/ZUiBL7-YYjo-fK8P-5NTK-vtrd-Qoxm-2sYcRl'  e949b89d-bd34-49f2-8e9e-742e7ff1d2df
else
  search --no-floppy --fs-uuid --set=root e949b89d-bd34-49f2-8e9e-742e7ff1d2df
fi
    font="/usr/share/grub/unicode.pf2"
fi

if loadfont $font ; then
  set gfxmode=auto
  load_video
  insmod gfxterm
  set locale_dir=$prefix/locale
  set lang=ja_JP
  insmod gettext
fi
terminal_output gfxterm
if [ "${recordfail}" = 1 ] ; then
  set timeout=30
else
  if [ x$feature_timeout_style = xy ] ; then
    set timeout_style=hidden
    set timeout=0
  # Fallback hidden-timeout code in case the timeout_style feature is
  # unavailable.
  elif sleep --interruptible 0 ; then
    set timeout=0
  fi
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
if background_color 44,0,30,0; then
  clear
fi
### END /etc/grub.d/05_debian_theme ###

### BEGIN /etc/grub.d/10_linux ###
function gfxmode {
    set gfxpayload="${1}"
    if [ "${1}" = "keep" ]; then
        set vt_handoff=vt.handoff=7
    else
        set vt_handoff=
    fi
}
if [ "${recordfail}" != 1 ]; then
  if [ -e ${prefix}/gfxblacklist.txt ]; then
    if hwmatch ${prefix}/gfxblacklist.txt 3; then
      if [ ${match} = 0 ]; then
        set linux_gfx_mode=keep
      else
        set linux_gfx_mode=text
      fi
    else
      set linux_gfx_mode=text
    fi
  else
    set linux_gfx_mode=keep
  fi
else
  set linux_gfx_mode=text
fi

export linux_gfx_mode
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-e949b89d-bd34-49f2-8e9e-742e7ff1d2df' {
    recordfail
    load_video
    gfxmode $linux_gfx_mode
    insmod gzio
    insmod part_gpt
    insmod ext2
    set root='hd0,gpt2'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2  32cca90b-9d4a-4c55-878e-88b027b3d116
    else
      search --no-floppy --fs-uuid --set=root 32cca90b-9d4a-4c55-878e-88b027b3d116
    fi
    linux   /vmlinuz-3.14.79-pavement1234 root=/dev/mapper/ubuntu--vg-root ro  quiet splash $vt_handoff
    initrd  /initrd.img-3.14.79-pavement1234
}
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-e949b89d-bd34-49f2-8e9e-742e7ff1d2df' {
    menuentry 'Ubuntu, with Linux 3.14.79-pavement1234' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.14.79-pavement1234-advanced-e949b89d-bd34-49f2-8e9e-742e7ff1d2df' {
        recordfail
        load_video
        gfxmode $linux_gfx_mode
        insmod gzio
        insmod part_gpt
        insmod ext2
        set root='hd0,gpt2'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2  32cca90b-9d4a-4c55-878e-88b027b3d116
        else
          search --no-floppy --fs-uuid --set=root 32cca90b-9d4a-4c55-878e-88b027b3d116
        fi
        echo    'Linux 3.14.79-pavement1234 をロード中...'
        linux   /vmlinuz-3.14.79-pavement1234 root=/dev/mapper/ubuntu--vg-root ro  quiet splash $vt_handoff
        echo    '初期 RAM ディスクをロード中...'
        initrd  /initrd.img-3.14.79-pavement1234
    }
    menuentry 'Ubuntu, with Linux 3.14.79-pavement1234 (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.14.79-pavement1234-recovery-e949b89d-bd34-49f2-8e9e-742e7ff1d2df' {
        recordfail
        load_video
        insmod gzio
        insmod part_gpt
        insmod ext2
        set root='hd0,gpt2'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2  32cca90b-9d4a-4c55-878e-88b027b3d116
        else
          search --no-floppy --fs-uuid --set=root 32cca90b-9d4a-4c55-878e-88b027b3d116
        fi
        echo    'Linux 3.14.79-pavement1234 をロード中...'
        linux   /vmlinuz-3.14.79-pavement1234 root=/dev/mapper/ubuntu--vg-root ro recovery nomodeset
        echo    '初期 RAM ディスクをロード中...'
        initrd  /initrd.img-3.14.79-pavement1234
    }

    menuentry 'Ubuntu, with Linux 3.13.0-165-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-165-generic-advanced-e949b89d-bd34-49f2-8e9e-742e7ff1d2df' {
        recordfail
        load_video
        gfxmode $linux_gfx_mode
        insmod gzio
        insmod part_gpt
        insmod ext2
        set root='hd0,gpt2'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2  32cca90b-9d4a-4c55-878e-88b027b3d116
        else
          search --no-floppy --fs-uuid --set=root 32cca90b-9d4a-4c55-878e-88b027b3d116
        fi
        echo    'Linux 3.13.0-165-generic をロード中...'
        linux   /vmlinuz-3.13.0-165-generic.efi.signed root=/dev/mapper/ubuntu--vg-root ro  quiet splash $vt_handoff
        echo    '初期 RAM ディスクをロード中...'
        initrd  /initrd.img-3.13.0-165-generic
    }
    menuentry 'Ubuntu, with Linux 3.13.0-165-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-165-generic-recovery-e949b89d-bd34-49f2-8e9e-742e7ff1d2df' {
        recordfail
        load_video
        insmod gzio
        insmod part_gpt
        insmod ext2
        set root='hd0,gpt2'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2  32cca90b-9d4a-4c55-878e-88b027b3d116
        else
          search --no-floppy --fs-uuid --set=root 32cca90b-9d4a-4c55-878e-88b027b3d116
        fi
        echo    'Linux 3.13.0-165-generic をロード中...'
        linux   /vmlinuz-3.13.0-165-generic.efi.signed root=/dev/mapper/ubuntu--vg-root ro recovery nomodeset
        echo    '初期 RAM ディスクをロード中...'
        initrd  /initrd.img-3.13.0-165-generic
    }
    menuentry 'Ubuntu, with Linux 3.13.0-24-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-24-generic-advanced-e949b89d-bd34-49f2-8e9e-742e7ff1d2df' {
        recordfail
        load_video
        gfxmode $linux_gfx_mode
        insmod gzio
        insmod part_gpt
        insmod ext2
        set root='hd0,gpt2'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2  32cca90b-9d4a-4c55-878e-88b027b3d116
        else
          search --no-floppy --fs-uuid --set=root 32cca90b-9d4a-4c55-878e-88b027b3d116
        fi
        echo    'Linux 3.13.0-24-generic をロード中...'
        linux   /vmlinuz-3.13.0-24-generic root=/dev/mapper/ubuntu--vg-root ro  quiet splash $vt_handoff
        echo    '初期 RAM ディスクをロード中...'
        initrd  /initrd.img-3.13.0-24-generic
    }
    menuentry 'Ubuntu, with Linux 3.13.0-24-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-24-generic-recovery-e949b89d-bd34-49f2-8e9e-742e7ff1d2df' {
        recordfail
        load_video
        insmod gzio
        insmod part_gpt
        insmod ext2
        set root='hd0,gpt2'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2  32cca90b-9d4a-4c55-878e-88b027b3d116
        else
          search --no-floppy --fs-uuid --set=root 32cca90b-9d4a-4c55-878e-88b027b3d116
        fi
        echo    'Linux 3.13.0-24-generic をロード中...'
        linux   /vmlinuz-3.13.0-24-generic root=/dev/mapper/ubuntu--vg-root ro recovery nomodeset
        echo    '初期 RAM ディスクをロード中...'
        initrd  /initrd.img-3.13.0-24-generic
    }
}

### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_linux_xen ###

### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/20_memtest86+ ###
### END /etc/grub.d/20_memtest86+ ###

### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/30_uefi-firmware ###
menuentry 'System setup' $menuentry_id_option 'uefi-firmware' {
    fwsetup
}
### END /etc/grub.d/30_uefi-firmware ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f  ${config_directory}/custom.cfg ]; then
  source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###
  • 最後に/boot/grub/grub.cfgの先頭に書いてあったgrub-mkconfigについて調べてみる。
上にも書いたが、grub-mkconfigが/boot/grub/grub.cfgを自動生成するようだ。
$ vi /boot/grub/grub.cfg
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
今回のお題 - GRUB を設定する ~ GRUB 2 編を読んだ。詳細は割愛するが、どうもこういうことらしい。
GRUB 2 設定ファイルは/boot/grub/grub.cfgだが、このファイルを直接編集するのではなく/etc/default/grub/etc/grub.d/にあるファイルに設定を書き、grub-mkconfigに-oオプションを指定して/boot/grub/grug.cfgを出力する。
/etc/default/grub、/etc/grub.d/*をくまなく調べたが、当然ながらpavement1234は直接書かれてなかった。恐らくインストール時に一時的にシェル変数にxxx-pavement1234が設定されgrub-mkconfigが実行されるのだと思う。
$ ls -l /etc/grub.d
合計 76
-rwxr-xr-x 1 root root  9791  1月 17  2019 00_header
-rwxr-xr-x 1 root root  6058  4月 11  2014 05_debian_theme
-rwxr-xr-x 1 root root 11608  4月 11  2014 10_linux
-rwxr-xr-x 1 root root 10412  4月 11  2014 20_linux_xen
-rwxr-xr-x 1 root root  1992  3月 12  2014 20_memtest86+
-rwxr-xr-x 1 root root 11692  4月 11  2014 30_os-prober
-rwxr-xr-x 1 root root  1418  1月 17  2019 30_uefi-firmware
-rwxr-xr-x 1 root root   214  4月 11  2014 40_custom
-rwxr-xr-x 1 root root   216  4月 11  2014 41_custom
-rw-r--r-- 1 root root   483  4月 11  2014 README

続く
IMG-20190828-WA0023


詳解 Linuxカーネル 第3版
Daniel P. Bovet
オライリー・ジャパン
2007-02-26


組み込みLinuxシステム構築 第2版
Karim Yaghmour
オライリージャパン
2009-10-26


Linuxデバイスドライバ 第3版
Jonathan Corbet
オライリージャパン
2005-10-22



スポンサードリンク