SlideShare a Scribd company logo
1 of 53
Download to read offline
initramfs について
                     Kansai Debian Meeting 20101024

                               西山和広
                             Good-Day Inc.




Powered by Rabbit 0.6.4
Who am I?
 twitter: @znz
 fingerprint

 sec   4096R/B4222F7A 2010-06-27 [expires: 2040-08-10]
       Key fingerprint = B863 D6DC C2B9 57B8 5238 6CE0 262E D8DB B422 2F7A
 uid                  Kazuhiro NISHIYAMA <zn@...>
 uid                  Kazuhiro NISHIYAMA (ZnZ) <zn@...>
 uid                  Kazuhiro NISHIYAMA <nisiyama@...>
 uid                  Kazuhiro NISHIYAMA (znz) <kzhr.nsym@...>
 ssb   4096R/FAFB96B8 2010-06-27




                                                                      1/52
Agenda
 initrd/initramfs とは?

 いろいろなところからの Linux の起動

 initramfs について

 initramfs のカスタマイズ

 ./init の処理内容



                         2/52
initrd/initramfs とは?
  Linux の起動途中に使われる root ファイル
  システム

  この中で本当の root ファイルシステム
  (real root) をマウント

  実体は gzip された cpio アーカイブ
    昔は ext2 のディスクイメージファイル

    gzip の代わりに lzma のこともある
    (casper/initrd.lz)
                             3/52
Linux の起動
いろいろなところからの Linux の起動について
initramfs が起動中のどの部分になるのかの説明のため




                                 4/52
USB/HDD から起動
 BIOS (起動順位で USB/HDD が上)

 MBR (grub などのブートローダー)

 vmlinuz (カーネル) + initrd (の中の /init)

 real root (/dev/sda1 とか) の /sbin/init
 (MD, LVM2, LUKS などでも OK)

 /etc/inittab の処理とか

                                         5/52
光学ドライブから起動
 BIOS (起動順位で光学ドライブが上)

 El Torito (isolinux などのブートローダー)

 vmlinuz (カーネル) + initrd (の中の /init)

 real root   (filesystem.squashfs + aufs とか)   の /sbin/
 init

 /etc/inittab の処理とか

                                                     6/52
ネットワークから起動
 BIOS (起動順位で NIC が上)

 PXE boot (pxelinux などのブートローダー)

 vmlinuz (カーネル) + initrd (の中の /init)

 real root   (NFS とか)   の /sbin/init

 /etc/inittab の処理とか


                                       7/52
real root の場所
カーネルに root=UUID=xxx などで指定
  ローカルディスク (root=/dev/sda1 など)

  光学ドライブ (root=/dev/hdc など)

  NFS (nfsroot=192.168.0.1:/path/to/
  nfsroot など)

など


                                       8/52
/proc/cmdline (1)
  カーネルのコマンドライン引数

  カーネルパラメーター

  起動後に /proc/cmdline で見えるもの

  grub などで vmlinuz の後ろに書いている
  もの



                               9/52
/proc/cmdline (2)
  initramfs の処理で使うものが多い

  カーネル自体が処理するものもある

  real root で起動するプログラムが参照する
  目的で使っても良いが、カーネルや
  initramfs が使うものと衝突しないように注
  意



                          10/52
/proc/cmdline (3)
良く使われるものの例
quiet

  起動中のコンソールへの出力を減らす

ro / rw

  initramfs の中で real root を readonly mount する
  かどうか



                                           11/52
/proc/cmdline (4)
init=/path/to/real_init

  /sbin/init の代わりに実行するプログラムを指定

acpi=off apm=off など

  カーネルが処理

text

  /etc/init.d/gdm3 が「grep -wqs text /proc/
  cmdline」でチェックしている

                                             12/52
/proc/cmdline (5)
root=/path/to/blockdevice

  ルートファイルシステムとしてマウントするデバイスを
  指定

boot=local / boot=nfs / boot=casper /
boot=live

  real root を mount するのに使うスクリプトを指定




                                    13/52
update-initramfs
  initramfs はパッケージの中身ではない

  update-initramfs コマンドで生成や更新
  (カーネルのパッケージのインストール時などは dpkg-trigger で遅延実
  行)


  /usr/share/initramfs-tools/ や /etc/
  initramfs-tools/ を元に生成

  「sudo update-initramfs -u -k all」などで
  更新
                                        14/52
initramfs の調べ方
  mkdir -p /tmp/initrd && (cd /tmp/initrd && { zcat /boot/initrd.img-* | cpio -idm; })

  # initramfs-tools(8)
  mkdir tmp/initramfs
  cd tmp/initramfs
  gunzip -c /boot/initrd.img-2.6.18-1-686 | 
  cpio -i -d -H newc --no-absolute-filenames

  # linux-2.6/Documentation/initrd.txt
  mkdir /tmp/imagefile
  cd /tmp/imagefile
  gzip -cd /boot/imagefile.img | cpio -imd --quiet




などのように展開(カレントディレクトリにばらまかれるので展開
場所には注意)




                                                                                         15/52
initramfs の中身 (1)
./init

  カーネルが実行するプログラム
  ✓ Debian 系の場合は /bin/sh のシェルスクリプト

  ✓ Redhat 系の場合は以前確認したときは nash だっ
    た

./scripts

  ./init から読み込まれたり実行されたりするプログラム

                                     16/52
initramfs の中身 (2)
./bin や ./sbin

  busybox など

./conf や ./etc

  設定ファイル

./lib や ./usr

  ライブラリやカーネルモジュールなど

                      17/52
initramfs のカスタマイズ
 /etc/initramfs-tools/ 以下のファイルを編集
 したり、ファイルを追加したり。

 Debian Live のようにパッケージなら /usr/
 share/initramfs-tools/ 以下にファイルを追
 加する。




                               18/52
/etc/initramfs-tools (1)
initramfs.conf

update-initramfs.conf

  update-initramfs や mkinitramfs の設定ファイル

modules

  initramfs の中でロードするモジュール(後でロードす
  ればいいものは /etc/modules を使う)



                                           19/52
/etc/initramfs-tools (2)
conf.d/

  initramfs の conf/conf.d/ に入る。

hooks/

  /usr/share/initramfs-tools/hooks/ と同様に
  initramfs 作成時に実行される。




                                           20/52
/etc/initramfs-tools (3)
scripts/

  /usr/share/initramfs-tools/scripts/ と一緒に
  initramfs の scripts/ に入る。

(リカバリディスクを作成するときに scripts/local-premount/recovery を
作った。)




                                                 21/52
hooks/
  /usr/share/initramfs-tools/hook-
  functions の関数で initramfs の中身を生成
    copy_exec で追加しておきたいバイナリをコピー
    (ldd でわかる範囲内で使っているライブラリを含
    めてコピーされる)

    manual_add_modules でモジュールをコピー

    その他のファイルを追加や削除など



                                    22/52
scripts/
  カスタマイズする処理本体

  live 関係なら以下のようなものが入る。
  (BOOT=live のときに使われる)

     live

     live-bottom/

     live-functions

     live-helpers

     live-premount/
                          23/52
./init の処理内容 (1)
ソースは initramfs-tools 0.98.4 から。
(initramfs-tools 由来のコードのライセンスは GPL2 or later です)


           #!/bin/sh

           echo "Loading, please wait..."


このメッセージが出たところからが initramfs
の中の処理


                                                   24/52
./init の処理 (2) dir
initramfs 内の ディレクトリの準備

  [ -d /dev ] || mkdir -m 0755 /dev
  [ -d /root ] || mkdir -m 0700 /root
  [ -d /sys ] || mkdir /sys
  [ -d /proc ] || mkdir /proc
  [ -d /tmp ] || mkdir /tmp
  mkdir -p /var/lock
  mount -t sysfs -o nodev,noexec,nosuid none /sys
  mount -t proc -o nodev,noexec,nosuid none /proc




                                                    25/52
./init の処理 (3) dev
initramfs 内の /dev や udev の準備

  # Note that this only becomes /dev on the real filesystem if udev's scripts
  # are used; which they will be, but it's worth pointing out
  tmpfs_size="10M"
  if [ -e /etc/udev/udev.conf ]; then
          . /etc/udev/udev.conf
  fi
  if ! mount -t devtmpfs -o mode=0755 none /dev; then
          echo "W: devtmpfs not available, falling back to tmpfs for /dev"
          mount -t tmpfs -o size=$tmpfs_size,mode=0755 udev /dev
          [ -e /dev/console ] || mknod -m 0600 /dev/console c 5 1
          [ -e /dev/null ] || mknod /dev/null c 1 3
  fi
  mkdir /dev/pts
  mount -t devpts -o noexec,nosuid,gid=5,mode=0620 none /dev/pts || true
  > /dev/.initramfs-tools
  mkdir /dev/.initramfs




                                                                                26/52
./init (4) export
後で起動するシェルスクリプトなどのために、
いくつかのシェル変数は環境変数に
後半はスペースの都合で同じ行に詰めています


  # Export the dpkg architecture
  export DPKG_ARCH=
  . /conf/arch.conf

  # Set modprobe env
  export MODPROBE_OPTIONS="-qb"

  # Export relevant variables
  export ROOT=; export ROOTDELAY=; export ROOTFLAGS=; export ROOTFSTYPE=
  export IP=; export BOOT=; export BOOTIF=; export UBIMTD=; export break=
  export init=/sbin/init; export quiet=n; export readonly=y
  export rootmnt=/root; export debug=; export panic=; export blacklist=
  export resume=; export resume_offset=



                                                                            27/52
./init (5) conf
conf ファイルの読み込み

    # Bring in the main config
    . /conf/initramfs.conf
    for conf in conf/conf.d/*; do
            [ -f ${conf} ] && . ${conf}
    done
    . /scripts/functions




                                          28/52
./conf/initramfs.conf
./conf/initramfs.conf の中身の例
(real root を探す処理が BOOT で決まる)

     % egrep '^[^#]' conf/initramfs.conf
     MODULES=most
     BUSYBOX=y
     KEYMAP=n
     COMPRESS=gzip
     BOOT=local
     DEVICE=
     NFSROOT=auto



                                           29/52
./conf/conf.d の中身の例
 % ls conf/conf.d
 resume
 % cat conf/conf.d/resume
 RESUME=UUID=ae891314-2104-480c-bdd8-6de40e6edb72




                                                    30/52
./init (6) cmdline
カーネルのコマンドライン引数 (/proc/
cmdline) の解析

    # Parse command line options
    for x in $(cat /proc/cmdline); do
             case $x in
             init=*)
                     init=${x#init=}
                  ;;
             root=*)
                     ROOT=${x#root=}
                     case $ROOT in
                     LABEL=*)
                            ROOT="${ROOT#LABEL=}"
    (省略)

                                                    31/52
./init (7) noresume
   if [ -n "${noresume}" ]; then
           export noresume
           unset resume
   else
           resume=${RESUME:-}
   fi

   # cmdline 処理の一部:
          resume=*)
                  RESUME="${x#resume=}"
               ;;
          resume_offset=*)
                  resume_offset="${x#resume_offset=}"
               ;;
          noresume)
                  noresume=y
               ;;

                                                        32/52
./init (8) netconsole
  [ -n "${netconsole}" ] && 
  modprobe netconsole netconsole="${netconsole}"

  # cmdline 処理の一部:
          netconsole=*)
                  netconsole=${x#netconsole=}
               ;;

スペースの都合で改行を入れています




                                                   33/52
./init (9) maybe_break
maybe_break は処理の途中でシェルを起動で
きる場所

    maybe_break top

    # cmdline 処理の一部:
            break=*)
                     break=${x#break=}
                 ;;
            break)
                     break=premount
                 ;;

                                         34/52
scripts/functions:
maybe_break (1)
  # scripts/functions の一部:
  maybe_break()
  {
          if [ "${break:-}" = "$1" ]; then
                  panic "Spawning shell within the initramfs"
          fi
  }




                                                                35/52
scripts/functions:
maybe_break (2)
ubuntu (lucid) の initramfs-tools
0.92bubuntu78(以降 ubuntu 版の話がある場合はこのバージョ
ン)の場合、Debian と違って複数指定可能



  # scripts/functions の一部:
  maybe_break()
  {
          if echo "${break}" | egrep -q "(,|^)$1(,|$)"; then
                  panic "Spawning shell within the initramfs"
          fi
  }


                                                                36/52
functions: panic (1)
起動時に root ファイルシステムが見つからなくて「(initramfs)」で止まる
ことがあるのはこれ。


    # scripts/functions の一部:
    panic()
    {
            if [ -x /sbin/usplash_write ]; then
                    /sbin/usplash_write "QUIT"
            fi

           if command -v chvt >/dev/null 2>&1; then
                   chvt 1
           fi

           # Disallow console access
           if [ -n "${panic}" ]; then
                   sleep ${panic}
                   reboot
           fi
           modprobe i8042
           modprobe atkbd
           echo "$@"
           REASON="$@" PS1='(initramfs) ' /bin/sh -i </dev/console >/dev/console 2>&1
    }



                                                                                        37/52
functions: panic (2)
数字か「.」以外の文字があると無視するように
なっている。

    # cmdline 処理の一部:
           panic=*)
                    panic="${x#panic=}"
                    case ${panic} in
                    *[![:digit:].]*)
                            panic=
                         ;;
                    esac
                ;;

                                          38/52
functions: panic (3)
ubuntu 版だと run_scripts がある。

     # scripts/functions の一部:
     panic()
     {
             if [ -x /sbin/usplash_write ]; then
                     /sbin/usplash_write "QUIT"
             fi
             chvt 1

            # Disallow console access
            if [ -n "${panic}" ]; then
                    sleep ${panic}
                    reboot
            fi

            modprobe i8042
            modprobe atkbd

            run_scripts /scripts/panic

            echo $@
            PS1='(initramfs) ' /bin/sh -i </dev/console >/dev/console 2>&1
     }


                                                                             39/52
run_scripts (1)
  指定されたディレクトリの中の実行可能ファ
  イルを実行

  prereqs で依存関係を指定できる

  ORDER に tsort (トポロジカルソート) 結果
  をキャッシュしている




                            40/52
run_scripts (2)
   # scripts/functions の一部:
   run_scripts()
   {
           initdir=${1}
           [ ! -d ${initdir} ] && return

          if [ -f ${initdir}/ORDER ]; then
                  . ${initdir}/ORDER
          elif command -v tsort >/dev/null 2>&1; then
                  runlist=$(get_prereq_pairs | tsort)
                  call_scripts ${2:-}
          else
                  get_prereqs
                  reduce_prereqs
                  call_scripts
          fi
   }


                                                        41/52
prereqs
引数が prereqs の時に依存するものを echo す
る。(複数ある場合はスペース区切りで列挙)

          PREREQ=""

          prereqs()
          {
                 echo "$PREREQ"
          }

          case $1 in
          # get pre-requisites
          prereqs)
                 prereqs
                 exit 0
                 ;;
          esac


                                  42/52
./init (10) init-top
フックを実行

  # Don't do log messages here to avoid confusing usplash
  run_scripts /scripts/init-top




                                                            43/52
init (11) load_modules
./conf/modules に書いてあるモジュールをロー
ド(/etc/initramfs-tools/modules で設定)

  maybe_break modules
  [ "$quiet" != "y" ] && log_begin_msg "Loading essential drivers"
  load_modules
  [ "$quiet" != "y" ] && log_end_msg



自動認識できないモジュールやはやめにロード
しないといけないモジュールに使う。


                                                                     44/52
./init (12) mount
mountroot は「. /scripts/${BOOT}」で定義
される。(parse_numeric は ROOT=major:minor のような指定を処
理している)


  maybe_break premount
  [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/init-premount"
  run_scripts /scripts/init-premount
  [ "$quiet" != "y" ] && log_end_msg

  maybe_break mount
  log_begin_msg "Mounting root file system"
  . /scripts/${BOOT}
  parse_numeric ${ROOT}
  maybe_break mountroot
  mountroot
  log_end_msg



                                                                          45/52
./script/local
            run_scripts /scripts/local-top


のようなフックを実行したり"${ROOT}" で指
定されているデバイスをマウントしたりマウン
トできなかったときに

  panic "ALERT!   ${ROOT} does not exist.   Dropping to a shell!"



で「(initramfs) 」のシェルに落ちたりする。

                                                                    46/52
./init (13) bottom
最初の方でマウントした sysfs と proc を本当
の root ファイルシステム (real root) に移動
する。

  maybe_break bottom
  [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/init-bottom"
  run_scripts /scripts/init-bottom
  [ "$quiet" != "y" ] && log_end_msg

  # Move virtual filesystems over to the real filesystem
  mount -n -o move /sys ${rootmnt}/sys
  mount -n -o move /proc ${rootmnt}/proc




                                                                        47/52
./init (14) check init
  validate_init() {
          checktarget="${1}"

         # Work around absolute symlinks
         if [ -d "${rootmnt}" ] && [ -h "${rootmnt}${checktarget}" ]; then
                 case $(readlink "${rootmnt}${checktarget}") in /*)
                         checktarget="$(chroot ${rootmnt} readlink ${checktarget} )"
                     ;;
                 esac
         fi

         # Make sure the specified init can be executed
         if [ ! -x "${rootmnt}${checktarget}" ]; then
                 return 1
         fi

         # Upstart uses /etc/init as configuration directory :-/
         if [ -d "${rootmnt}${checktarget}" ]; then
                 return 1
         fi
  }




                                                                                       48/52
./init (15) check init
   # Check init bootarg
   if [ -n "${init}" ]; then
           if ! validate_init "$init"; then
                   echo "Target filesystem doesn't have requested ${init}."
                   init=
           fi
   fi

   # Common case: /sbin/init is present
   if [ ! -x "${rootmnt}/sbin/init" ]; then
           # ... if it's not available search for valid init
           if [ -z "${init}" ] ; then
                   for inittest in /sbin/init /etc/init /bin/init /bin/sh; do
                           if validate_init "${inittest}"; then
                                   init="$inittest"
                                   break
                           fi
                   done
           fi

          # No init on rootmount
          if ! validate_init "${init}" ; then
                  panic "No init found. Try passing init= bootarg."
          fi
   fi



                                                                                49/52
./init (16) unsetenv
   # don't leak too much of env - some init(8) don't clear it
   # (keep init, rootmnt)
   unset debug
   unset MODPROBE_OPTIONS
   unset DPKG_ARCH
   unset ROOTFLAGS
   unset ROOTFSTYPE
   unset ROOTDELAY
   unset ROOT
   unset IP
   unset BOOT
   unset BOOTIF
   unset UBIMTD
   unset blacklist
   unset break
   unset noresume
   unset panic
   unset quiet
   unset readonly
   unset resume
   unset resume_offset

                                                                50/52
./init (17) exec init
klibc-utils パッケージ由来の run-init で real
root の /sbin/init などを実行

    # Chain to real filesystem
    exec run-init ${rootmnt} ${init} "$@" 
     <${rootmnt}/dev/console 
     >${rootmnt}/dev/console
    panic "Could not execute run-init."




                                              51/52
real root での処理
   sysvinit

         /etc/inittab に従って処理

   upstart

         /etc/init/*.conf に従って処理

   など



Powered by Rabbit 0.6.4            52/52

More Related Content

What's hot

コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線Motonori Shindo
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)NTT DATA Technology & Innovation
 
不揮発メモリ(NVDIMM)とLinuxの対応動向について
不揮発メモリ(NVDIMM)とLinuxの対応動向について不揮発メモリ(NVDIMM)とLinuxの対応動向について
不揮発メモリ(NVDIMM)とLinuxの対応動向についてYasunori Goto
 
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)Kuniyasu Suzaki
 
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
Interrupt Affinityについて
Interrupt AffinityについてInterrupt Affinityについて
Interrupt AffinityについてTakuya ASADA
 
AlmaLinux と Rocky Linux の誕生経緯&比較
AlmaLinux と Rocky Linux の誕生経緯&比較AlmaLinux と Rocky Linux の誕生経緯&比較
AlmaLinux と Rocky Linux の誕生経緯&比較beyond Co., Ltd.
 
Ceph アーキテクチャ概説
Ceph アーキテクチャ概説Ceph アーキテクチャ概説
Ceph アーキテクチャ概説Emma Haruka Iwao
 
やってはいけない空振りDelete
やってはいけない空振りDeleteやってはいけない空振りDelete
やってはいけない空振りDeleteYu Yamada
 
GPU仮想化最前線 - KVMGTとvirtio-gpu -
GPU仮想化最前線 - KVMGTとvirtio-gpu -GPU仮想化最前線 - KVMGTとvirtio-gpu -
GPU仮想化最前線 - KVMGTとvirtio-gpu -zgock
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Masahito Zembutsu
 
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...NTT DATA Technology & Innovation
 
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)NTT DATA Technology & Innovation
 
細かすぎて伝わらないかもしれない Azure Container Networking Deep Dive
細かすぎて伝わらないかもしれない Azure Container Networking Deep Dive細かすぎて伝わらないかもしれない Azure Container Networking Deep Dive
細かすぎて伝わらないかもしれない Azure Container Networking Deep DiveToru Makabe
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールMITSUNARI Shigeo
 
ARM Trusted FirmwareのBL31を単体で使う!
ARM Trusted FirmwareのBL31を単体で使う!ARM Trusted FirmwareのBL31を単体で使う!
ARM Trusted FirmwareのBL31を単体で使う!Mr. Vengineer
 
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)NTT DATA Technology & Innovation
 

What's hot (20)

コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線
 
ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
 
不揮発メモリ(NVDIMM)とLinuxの対応動向について
不揮発メモリ(NVDIMM)とLinuxの対応動向について不揮発メモリ(NVDIMM)とLinuxの対応動向について
不揮発メモリ(NVDIMM)とLinuxの対応動向について
 
レシピの作り方入門
レシピの作り方入門レシピの作り方入門
レシピの作り方入門
 
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
 
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
Interrupt Affinityについて
Interrupt AffinityについてInterrupt Affinityについて
Interrupt Affinityについて
 
AlmaLinux と Rocky Linux の誕生経緯&比較
AlmaLinux と Rocky Linux の誕生経緯&比較AlmaLinux と Rocky Linux の誕生経緯&比較
AlmaLinux と Rocky Linux の誕生経緯&比較
 
Ceph アーキテクチャ概説
Ceph アーキテクチャ概説Ceph アーキテクチャ概説
Ceph アーキテクチャ概説
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
やってはいけない空振りDelete
やってはいけない空振りDeleteやってはいけない空振りDelete
やってはいけない空振りDelete
 
GPU仮想化最前線 - KVMGTとvirtio-gpu -
GPU仮想化最前線 - KVMGTとvirtio-gpu -GPU仮想化最前線 - KVMGTとvirtio-gpu -
GPU仮想化最前線 - KVMGTとvirtio-gpu -
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
 
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
 
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
 
細かすぎて伝わらないかもしれない Azure Container Networking Deep Dive
細かすぎて伝わらないかもしれない Azure Container Networking Deep Dive細かすぎて伝わらないかもしれない Azure Container Networking Deep Dive
細かすぎて伝わらないかもしれない Azure Container Networking Deep Dive
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
 
ARM Trusted FirmwareのBL31を単体で使う!
ARM Trusted FirmwareのBL31を単体で使う!ARM Trusted FirmwareのBL31を単体で使う!
ARM Trusted FirmwareのBL31を単体で使う!
 
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
 

Viewers also liked

WebSocketのキホン
WebSocketのキホンWebSocketのキホン
WebSocketのキホンYou_Kinjoh
 
なんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudy
なんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudyなんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudy
なんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudyPOStudy
 
トランザクションの並行処理制御
トランザクションの並行処理制御トランザクションの並行処理制御
トランザクションの並行処理制御Takashi Hoshino
 
アジャイルメトリクス実践ガイド
アジャイルメトリクス実践ガイドアジャイルメトリクス実践ガイド
アジャイルメトリクス実践ガイドHiroyuki Ito
 
[RSGT2017] つらい問題に出会ったら
[RSGT2017] つらい問題に出会ったら[RSGT2017] つらい問題に出会ったら
[RSGT2017] つらい問題に出会ったらTakahiro Kaihara
 
導入に困っているあなたに贈る スクラム導入コミュニケーション術
導入に困っているあなたに贈る スクラム導入コミュニケーション術導入に困っているあなたに贈る スクラム導入コミュニケーション術
導入に困っているあなたに贈る スクラム導入コミュニケーション術Kouki Kawagoi
 
エンジニアだけどもっとユーザーに価値を届けたいからスクラムマスター始めました
エンジニアだけどもっとユーザーに価値を届けたいからスクラムマスター始めましたエンジニアだけどもっとユーザーに価値を届けたいからスクラムマスター始めました
エンジニアだけどもっとユーザーに価値を届けたいからスクラムマスター始めましたYusuke Amano
 
共感する開発のことだけ考えた。
共感する開発のことだけ考えた。共感する開発のことだけ考えた。
共感する開発のことだけ考えた。shoji_yamada
 
「実録!となりのJenkins2.0」 - 第7回大阪 / 第9回(東京)Jenkins勉強会 #jenkinsstudy
「実録!となりのJenkins2.0」 - 第7回大阪 / 第9回(東京)Jenkins勉強会 #jenkinsstudy「実録!となりのJenkins2.0」 - 第7回大阪 / 第9回(東京)Jenkins勉強会 #jenkinsstudy
「実録!となりのJenkins2.0」 - 第7回大阪 / 第9回(東京)Jenkins勉強会 #jenkinsstudyKazuhito Miura
 
世界と事例から学ぶ、プロダクトオーナーの「素養」としてのアジャイルメトリクス
世界と事例から学ぶ、プロダクトオーナーの「素養」としてのアジャイルメトリクス世界と事例から学ぶ、プロダクトオーナーの「素養」としてのアジャイルメトリクス
世界と事例から学ぶ、プロダクトオーナーの「素養」としてのアジャイルメトリクスHiroyuki Ito
 
アジャイルコーチが現場で学んだプロダクトオーナーの実際と勘所 POの二番目に大事なことと
アジャイルコーチが現場で学んだプロダクトオーナーの実際と勘所 POの二番目に大事なこととアジャイルコーチが現場で学んだプロダクトオーナーの実際と勘所 POの二番目に大事なことと
アジャイルコーチが現場で学んだプロダクトオーナーの実際と勘所 POの二番目に大事なこととYasui Tsutomu
 
【kintone便利に使おうシリーズ】[vol.07 プロセス管理]
【kintone便利に使おうシリーズ】[vol.07 プロセス管理]【kintone便利に使おうシリーズ】[vol.07 プロセス管理]
【kintone便利に使おうシリーズ】[vol.07 プロセス管理]Cybozucommunity
 
kintoneの検索高速化への取り組み
kintoneの検索高速化への取り組みkintoneの検索高速化への取り組み
kintoneの検索高速化への取り組みRyo Mitoma
 
Webセキュリティと W3CとIETFの仕様
Webセキュリティと W3CとIETFの仕様Webセキュリティと W3CとIETFの仕様
Webセキュリティと W3CとIETFの仕様yuki-f
 
Waterfall cafeで働くBot
Waterfall cafeで働くBotWaterfall cafeで働くBot
Waterfall cafeで働くBotKazuki Nakajima
 
エンジニアが働きたい場所で働けるために、チームに必要なこと
エンジニアが働きたい場所で働けるために、チームに必要なことエンジニアが働きたい場所で働けるために、チームに必要なこと
エンジニアが働きたい場所で働けるために、チームに必要なことYuki Okada
 
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato KinugawaCODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato KinugawaCODE BLUE
 
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 SpringGoでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 SpringYahoo!デベロッパーネットワーク
 

Viewers also liked (20)

WebSocketのキホン
WebSocketのキホンWebSocketのキホン
WebSocketのキホン
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
なんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudy
なんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudyなんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudy
なんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudy
 
トランザクションの並行処理制御
トランザクションの並行処理制御トランザクションの並行処理制御
トランザクションの並行処理制御
 
Docker 1.12 の衝撃
Docker 1.12 の衝撃Docker 1.12 の衝撃
Docker 1.12 の衝撃
 
アジャイルメトリクス実践ガイド
アジャイルメトリクス実践ガイドアジャイルメトリクス実践ガイド
アジャイルメトリクス実践ガイド
 
[RSGT2017] つらい問題に出会ったら
[RSGT2017] つらい問題に出会ったら[RSGT2017] つらい問題に出会ったら
[RSGT2017] つらい問題に出会ったら
 
導入に困っているあなたに贈る スクラム導入コミュニケーション術
導入に困っているあなたに贈る スクラム導入コミュニケーション術導入に困っているあなたに贈る スクラム導入コミュニケーション術
導入に困っているあなたに贈る スクラム導入コミュニケーション術
 
エンジニアだけどもっとユーザーに価値を届けたいからスクラムマスター始めました
エンジニアだけどもっとユーザーに価値を届けたいからスクラムマスター始めましたエンジニアだけどもっとユーザーに価値を届けたいからスクラムマスター始めました
エンジニアだけどもっとユーザーに価値を届けたいからスクラムマスター始めました
 
共感する開発のことだけ考えた。
共感する開発のことだけ考えた。共感する開発のことだけ考えた。
共感する開発のことだけ考えた。
 
「実録!となりのJenkins2.0」 - 第7回大阪 / 第9回(東京)Jenkins勉強会 #jenkinsstudy
「実録!となりのJenkins2.0」 - 第7回大阪 / 第9回(東京)Jenkins勉強会 #jenkinsstudy「実録!となりのJenkins2.0」 - 第7回大阪 / 第9回(東京)Jenkins勉強会 #jenkinsstudy
「実録!となりのJenkins2.0」 - 第7回大阪 / 第9回(東京)Jenkins勉強会 #jenkinsstudy
 
世界と事例から学ぶ、プロダクトオーナーの「素養」としてのアジャイルメトリクス
世界と事例から学ぶ、プロダクトオーナーの「素養」としてのアジャイルメトリクス世界と事例から学ぶ、プロダクトオーナーの「素養」としてのアジャイルメトリクス
世界と事例から学ぶ、プロダクトオーナーの「素養」としてのアジャイルメトリクス
 
アジャイルコーチが現場で学んだプロダクトオーナーの実際と勘所 POの二番目に大事なことと
アジャイルコーチが現場で学んだプロダクトオーナーの実際と勘所 POの二番目に大事なこととアジャイルコーチが現場で学んだプロダクトオーナーの実際と勘所 POの二番目に大事なことと
アジャイルコーチが現場で学んだプロダクトオーナーの実際と勘所 POの二番目に大事なことと
 
【kintone便利に使おうシリーズ】[vol.07 プロセス管理]
【kintone便利に使おうシリーズ】[vol.07 プロセス管理]【kintone便利に使おうシリーズ】[vol.07 プロセス管理]
【kintone便利に使おうシリーズ】[vol.07 プロセス管理]
 
kintoneの検索高速化への取り組み
kintoneの検索高速化への取り組みkintoneの検索高速化への取り組み
kintoneの検索高速化への取り組み
 
Webセキュリティと W3CとIETFの仕様
Webセキュリティと W3CとIETFの仕様Webセキュリティと W3CとIETFの仕様
Webセキュリティと W3CとIETFの仕様
 
Waterfall cafeで働くBot
Waterfall cafeで働くBotWaterfall cafeで働くBot
Waterfall cafeで働くBot
 
エンジニアが働きたい場所で働けるために、チームに必要なこと
エンジニアが働きたい場所で働けるために、チームに必要なことエンジニアが働きたい場所で働けるために、チームに必要なこと
エンジニアが働きたい場所で働けるために、チームに必要なこと
 
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato KinugawaCODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
 
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 SpringGoでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring
 

Similar to initramfsについて

第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西Masahide Yamamoto
 
Infinite Debian - Platform for mass-producing system every second
Infinite Debian - Platform for mass-producing system every secondInfinite Debian - Platform for mass-producing system every second
Infinite Debian - Platform for mass-producing system every secondTaisuke Yamada
 
A_road_to_AMBER_simulations_ver_1.0
A_road_to_AMBER_simulations_ver_1.0A_road_to_AMBER_simulations_ver_1.0
A_road_to_AMBER_simulations_ver_1.0Satoshi Kume
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on dockerHiroshi Miura
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on dockerHiroshi Miura
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0Kiwamu Okabe
 
Functions
FunctionsFunctions
Functionsdo_aki
 
20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_BetaKohei KaiGai
 
ふつうのLinuxプログラミング
ふつうのLinuxプログラミングふつうのLinuxプログラミング
ふつうのLinuxプログラミングShuhei KONDO
 
コンテナ情報交換会2
コンテナ情報交換会2コンテナ情報交換会2
コンテナ情報交換会2Masahide Yamamoto
 
dofilewrite and vn_write
dofilewrite and vn_writedofilewrite and vn_write
dofilewrite and vn_writekusabanachi
 
Lxc cf201207-presen
Lxc cf201207-presenLxc cf201207-presen
Lxc cf201207-presenKouhei Maeda
 
Hatochan's Resume 20130216@Koedolug
Hatochan's Resume 20130216@KoedolugHatochan's Resume 20130216@Koedolug
Hatochan's Resume 20130216@KoedolugKentaro Hatori
 
Yocto bspを作ってみた
Yocto bspを作ってみたYocto bspを作ってみた
Yocto bspを作ってみたwata2ki
 
MINCS – containers in the shell script
MINCS – containers in the shell scriptMINCS – containers in the shell script
MINCS – containers in the shell scriptMasami Hiramatsu
 

Similar to initramfsについて (20)

Mincs 日本語版
Mincs 日本語版Mincs 日本語版
Mincs 日本語版
 
第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西
 
Infinite Debian - Platform for mass-producing system every second
Infinite Debian - Platform for mass-producing system every secondInfinite Debian - Platform for mass-producing system every second
Infinite Debian - Platform for mass-producing system every second
 
A_road_to_AMBER_simulations_ver_1.0
A_road_to_AMBER_simulations_ver_1.0A_road_to_AMBER_simulations_ver_1.0
A_road_to_AMBER_simulations_ver_1.0
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
カーネルモジュールプログラミング超入門 #1(仮)
カーネルモジュールプログラミング超入門 #1(仮)カーネルモジュールプログラミング超入門 #1(仮)
カーネルモジュールプログラミング超入門 #1(仮)
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0
 
Gingerbread
GingerbreadGingerbread
Gingerbread
 
Functions
FunctionsFunctions
Functions
 
20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta
 
about DakotagUI
about DakotagUIabout DakotagUI
about DakotagUI
 
ふつうのLinuxプログラミング
ふつうのLinuxプログラミングふつうのLinuxプログラミング
ふつうのLinuxプログラミング
 
コンテナ情報交換会2
コンテナ情報交換会2コンテナ情報交換会2
コンテナ情報交換会2
 
dofilewrite and vn_write
dofilewrite and vn_writedofilewrite and vn_write
dofilewrite and vn_write
 
実は怖くないDevOps
実は怖くないDevOps実は怖くないDevOps
実は怖くないDevOps
 
Lxc cf201207-presen
Lxc cf201207-presenLxc cf201207-presen
Lxc cf201207-presen
 
Hatochan's Resume 20130216@Koedolug
Hatochan's Resume 20130216@KoedolugHatochan's Resume 20130216@Koedolug
Hatochan's Resume 20130216@Koedolug
 
Yocto bspを作ってみた
Yocto bspを作ってみたYocto bspを作ってみた
Yocto bspを作ってみた
 
MINCS – containers in the shell script
MINCS – containers in the shell scriptMINCS – containers in the shell script
MINCS – containers in the shell script
 

More from Kazuhiro Nishiyama

lilo.linux.or.jp を buster から bullseye に上げた
lilo.linux.or.jp を buster から bullseye に上げたlilo.linux.or.jp を buster から bullseye に上げた
lilo.linux.or.jp を buster から bullseye に上げたKazuhiro Nishiyama
 
小規模個人アプリをRails 7.xにバージョンアップした話
小規模個人アプリをRails 7.xにバージョンアップした話小規模個人アプリをRails 7.xにバージョンアップした話
小規模個人アプリをRails 7.xにバージョンアップした話Kazuhiro Nishiyama
 
Ruby リファレンスマニュアル改善計画 2022 進捗報告
Ruby リファレンスマニュアル改善計画 2022 進捗報告Ruby リファレンスマニュアル改善計画 2022 進捗報告
Ruby リファレンスマニュアル改善計画 2022 進捗報告Kazuhiro Nishiyama
 
fukuoka03-rubima-reboot-rubyist-magazine-reboot.pdf
fukuoka03-rubima-reboot-rubyist-magazine-reboot.pdffukuoka03-rubima-reboot-rubyist-magazine-reboot.pdf
fukuoka03-rubima-reboot-rubyist-magazine-reboot.pdfKazuhiro Nishiyama
 
rubykaigi2022-rurema-history-and-future.pdf
rubykaigi2022-rurema-history-and-future.pdfrubykaigi2022-rurema-history-and-future.pdf
rubykaigi2022-rurema-history-and-future.pdfKazuhiro Nishiyama
 
qemuのriscv64にDebianを入れてみた
qemuのriscv64にDebianを入れてみたqemuのriscv64にDebianを入れてみた
qemuのriscv64にDebianを入れてみたKazuhiro Nishiyama
 
workflow,job,step の使い分けの基準を考える
workflow,job,step の使い分けの基準を考えるworkflow,job,step の使い分けの基準を考える
workflow,job,step の使い分けの基準を考えるKazuhiro Nishiyama
 
あまり知られていないRubyの便利機能
あまり知られていないRubyの便利機能あまり知られていないRubyの便利機能
あまり知られていないRubyの便利機能Kazuhiro Nishiyama
 
Dockerのオフィシャルrubyイメージとは?
Dockerのオフィシャルrubyイメージとは?Dockerのオフィシャルrubyイメージとは?
Dockerのオフィシャルrubyイメージとは?Kazuhiro Nishiyama
 
チャットボットのススメ
チャットボットのススメチャットボットのススメ
チャットボットのススメKazuhiro Nishiyama
 
Action Cableで簡易チャットを作ってみた
Action Cableで簡易チャットを作ってみたAction Cableで簡易チャットを作ってみた
Action Cableで簡易チャットを作ってみたKazuhiro Nishiyama
 
最近のrubyのインストール方法
最近のrubyのインストール方法最近のrubyのインストール方法
最近のrubyのインストール方法Kazuhiro Nishiyama
 

More from Kazuhiro Nishiyama (20)

lilo.linux.or.jp を buster から bullseye に上げた
lilo.linux.or.jp を buster から bullseye に上げたlilo.linux.or.jp を buster から bullseye に上げた
lilo.linux.or.jp を buster から bullseye に上げた
 
小規模個人アプリをRails 7.xにバージョンアップした話
小規模個人アプリをRails 7.xにバージョンアップした話小規模個人アプリをRails 7.xにバージョンアップした話
小規模個人アプリをRails 7.xにバージョンアップした話
 
Ruby リファレンスマニュアル改善計画 2022 進捗報告
Ruby リファレンスマニュアル改善計画 2022 進捗報告Ruby リファレンスマニュアル改善計画 2022 進捗報告
Ruby リファレンスマニュアル改善計画 2022 進捗報告
 
fukuoka03-rubima-reboot-rubyist-magazine-reboot.pdf
fukuoka03-rubima-reboot-rubyist-magazine-reboot.pdffukuoka03-rubima-reboot-rubyist-magazine-reboot.pdf
fukuoka03-rubima-reboot-rubyist-magazine-reboot.pdf
 
rubykaigi2022-rurema-history-and-future.pdf
rubykaigi2022-rurema-history-and-future.pdfrubykaigi2022-rurema-history-and-future.pdf
rubykaigi2022-rurema-history-and-future.pdf
 
qemuのriscv64にDebianを入れてみた
qemuのriscv64にDebianを入れてみたqemuのriscv64にDebianを入れてみた
qemuのriscv64にDebianを入れてみた
 
systemd 再入門
systemd 再入門systemd 再入門
systemd 再入門
 
Ruby 3.0.0 コネタ集
Ruby 3.0.0 コネタ集Ruby 3.0.0 コネタ集
Ruby 3.0.0 コネタ集
 
livedoor天気API終了対応
livedoor天気API終了対応livedoor天気API終了対応
livedoor天気API終了対応
 
Wireguard 実践入門
Wireguard 実践入門Wireguard 実践入門
Wireguard 実践入門
 
workflow,job,step の使い分けの基準を考える
workflow,job,step の使い分けの基準を考えるworkflow,job,step の使い分けの基準を考える
workflow,job,step の使い分けの基準を考える
 
あまり知られていないRubyの便利機能
あまり知られていないRubyの便利機能あまり知られていないRubyの便利機能
あまり知られていないRubyの便利機能
 
Dockerのオフィシャルrubyイメージとは?
Dockerのオフィシャルrubyイメージとは?Dockerのオフィシャルrubyイメージとは?
Dockerのオフィシャルrubyイメージとは?
 
チャットボットのススメ
チャットボットのススメチャットボットのススメ
チャットボットのススメ
 
Dokku の紹介
Dokku の紹介Dokku の紹介
Dokku の紹介
 
Action Cableで簡易チャットを作ってみた
Action Cableで簡易チャットを作ってみたAction Cableで簡易チャットを作ってみた
Action Cableで簡易チャットを作ってみた
 
Ruby svn to git
Ruby svn to gitRuby svn to git
Ruby svn to git
 
Ruby 2.6 Update
Ruby 2.6 UpdateRuby 2.6 Update
Ruby 2.6 Update
 
最近のrubyのインストール方法
最近のrubyのインストール方法最近のrubyのインストール方法
最近のrubyのインストール方法
 
Language update 2018 - ruby
Language update 2018 - rubyLanguage update 2018 - ruby
Language update 2018 - ruby
 

Recently uploaded

Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 

Recently uploaded (7)

Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 

initramfsについて

  • 1. initramfs について Kansai Debian Meeting 20101024 西山和広 Good-Day Inc. Powered by Rabbit 0.6.4
  • 2. Who am I? twitter: @znz fingerprint sec 4096R/B4222F7A 2010-06-27 [expires: 2040-08-10] Key fingerprint = B863 D6DC C2B9 57B8 5238 6CE0 262E D8DB B422 2F7A uid Kazuhiro NISHIYAMA <zn@...> uid Kazuhiro NISHIYAMA (ZnZ) <zn@...> uid Kazuhiro NISHIYAMA <nisiyama@...> uid Kazuhiro NISHIYAMA (znz) <kzhr.nsym@...> ssb 4096R/FAFB96B8 2010-06-27 1/52
  • 3. Agenda initrd/initramfs とは? いろいろなところからの Linux の起動 initramfs について initramfs のカスタマイズ ./init の処理内容 2/52
  • 4. initrd/initramfs とは? Linux の起動途中に使われる root ファイル システム この中で本当の root ファイルシステム (real root) をマウント 実体は gzip された cpio アーカイブ 昔は ext2 のディスクイメージファイル gzip の代わりに lzma のこともある (casper/initrd.lz) 3/52
  • 5. Linux の起動 いろいろなところからの Linux の起動について initramfs が起動中のどの部分になるのかの説明のため 4/52
  • 6. USB/HDD から起動 BIOS (起動順位で USB/HDD が上) MBR (grub などのブートローダー) vmlinuz (カーネル) + initrd (の中の /init) real root (/dev/sda1 とか) の /sbin/init (MD, LVM2, LUKS などでも OK) /etc/inittab の処理とか 5/52
  • 7. 光学ドライブから起動 BIOS (起動順位で光学ドライブが上) El Torito (isolinux などのブートローダー) vmlinuz (カーネル) + initrd (の中の /init) real root (filesystem.squashfs + aufs とか) の /sbin/ init /etc/inittab の処理とか 6/52
  • 8. ネットワークから起動 BIOS (起動順位で NIC が上) PXE boot (pxelinux などのブートローダー) vmlinuz (カーネル) + initrd (の中の /init) real root (NFS とか) の /sbin/init /etc/inittab の処理とか 7/52
  • 9. real root の場所 カーネルに root=UUID=xxx などで指定 ローカルディスク (root=/dev/sda1 など) 光学ドライブ (root=/dev/hdc など) NFS (nfsroot=192.168.0.1:/path/to/ nfsroot など) など 8/52
  • 10. /proc/cmdline (1) カーネルのコマンドライン引数 カーネルパラメーター 起動後に /proc/cmdline で見えるもの grub などで vmlinuz の後ろに書いている もの 9/52
  • 11. /proc/cmdline (2) initramfs の処理で使うものが多い カーネル自体が処理するものもある real root で起動するプログラムが参照する 目的で使っても良いが、カーネルや initramfs が使うものと衝突しないように注 意 10/52
  • 12. /proc/cmdline (3) 良く使われるものの例 quiet 起動中のコンソールへの出力を減らす ro / rw initramfs の中で real root を readonly mount する かどうか 11/52
  • 13. /proc/cmdline (4) init=/path/to/real_init /sbin/init の代わりに実行するプログラムを指定 acpi=off apm=off など カーネルが処理 text /etc/init.d/gdm3 が「grep -wqs text /proc/ cmdline」でチェックしている 12/52
  • 14. /proc/cmdline (5) root=/path/to/blockdevice ルートファイルシステムとしてマウントするデバイスを 指定 boot=local / boot=nfs / boot=casper / boot=live real root を mount するのに使うスクリプトを指定 13/52
  • 15. update-initramfs initramfs はパッケージの中身ではない update-initramfs コマンドで生成や更新 (カーネルのパッケージのインストール時などは dpkg-trigger で遅延実 行) /usr/share/initramfs-tools/ や /etc/ initramfs-tools/ を元に生成 「sudo update-initramfs -u -k all」などで 更新 14/52
  • 16. initramfs の調べ方 mkdir -p /tmp/initrd && (cd /tmp/initrd && { zcat /boot/initrd.img-* | cpio -idm; }) # initramfs-tools(8) mkdir tmp/initramfs cd tmp/initramfs gunzip -c /boot/initrd.img-2.6.18-1-686 | cpio -i -d -H newc --no-absolute-filenames # linux-2.6/Documentation/initrd.txt mkdir /tmp/imagefile cd /tmp/imagefile gzip -cd /boot/imagefile.img | cpio -imd --quiet などのように展開(カレントディレクトリにばらまかれるので展開 場所には注意) 15/52
  • 17. initramfs の中身 (1) ./init カーネルが実行するプログラム ✓ Debian 系の場合は /bin/sh のシェルスクリプト ✓ Redhat 系の場合は以前確認したときは nash だっ た ./scripts ./init から読み込まれたり実行されたりするプログラム 16/52
  • 18. initramfs の中身 (2) ./bin や ./sbin busybox など ./conf や ./etc 設定ファイル ./lib や ./usr ライブラリやカーネルモジュールなど 17/52
  • 19. initramfs のカスタマイズ /etc/initramfs-tools/ 以下のファイルを編集 したり、ファイルを追加したり。 Debian Live のようにパッケージなら /usr/ share/initramfs-tools/ 以下にファイルを追 加する。 18/52
  • 20. /etc/initramfs-tools (1) initramfs.conf update-initramfs.conf update-initramfs や mkinitramfs の設定ファイル modules initramfs の中でロードするモジュール(後でロードす ればいいものは /etc/modules を使う) 19/52
  • 21. /etc/initramfs-tools (2) conf.d/ initramfs の conf/conf.d/ に入る。 hooks/ /usr/share/initramfs-tools/hooks/ と同様に initramfs 作成時に実行される。 20/52
  • 22. /etc/initramfs-tools (3) scripts/ /usr/share/initramfs-tools/scripts/ と一緒に initramfs の scripts/ に入る。 (リカバリディスクを作成するときに scripts/local-premount/recovery を 作った。) 21/52
  • 23. hooks/ /usr/share/initramfs-tools/hook- functions の関数で initramfs の中身を生成 copy_exec で追加しておきたいバイナリをコピー (ldd でわかる範囲内で使っているライブラリを含 めてコピーされる) manual_add_modules でモジュールをコピー その他のファイルを追加や削除など 22/52
  • 24. scripts/ カスタマイズする処理本体 live 関係なら以下のようなものが入る。 (BOOT=live のときに使われる) live live-bottom/ live-functions live-helpers live-premount/ 23/52
  • 25. ./init の処理内容 (1) ソースは initramfs-tools 0.98.4 から。 (initramfs-tools 由来のコードのライセンスは GPL2 or later です) #!/bin/sh echo "Loading, please wait..." このメッセージが出たところからが initramfs の中の処理 24/52
  • 26. ./init の処理 (2) dir initramfs 内の ディレクトリの準備 [ -d /dev ] || mkdir -m 0755 /dev [ -d /root ] || mkdir -m 0700 /root [ -d /sys ] || mkdir /sys [ -d /proc ] || mkdir /proc [ -d /tmp ] || mkdir /tmp mkdir -p /var/lock mount -t sysfs -o nodev,noexec,nosuid none /sys mount -t proc -o nodev,noexec,nosuid none /proc 25/52
  • 27. ./init の処理 (3) dev initramfs 内の /dev や udev の準備 # Note that this only becomes /dev on the real filesystem if udev's scripts # are used; which they will be, but it's worth pointing out tmpfs_size="10M" if [ -e /etc/udev/udev.conf ]; then . /etc/udev/udev.conf fi if ! mount -t devtmpfs -o mode=0755 none /dev; then echo "W: devtmpfs not available, falling back to tmpfs for /dev" mount -t tmpfs -o size=$tmpfs_size,mode=0755 udev /dev [ -e /dev/console ] || mknod -m 0600 /dev/console c 5 1 [ -e /dev/null ] || mknod /dev/null c 1 3 fi mkdir /dev/pts mount -t devpts -o noexec,nosuid,gid=5,mode=0620 none /dev/pts || true > /dev/.initramfs-tools mkdir /dev/.initramfs 26/52
  • 28. ./init (4) export 後で起動するシェルスクリプトなどのために、 いくつかのシェル変数は環境変数に 後半はスペースの都合で同じ行に詰めています # Export the dpkg architecture export DPKG_ARCH= . /conf/arch.conf # Set modprobe env export MODPROBE_OPTIONS="-qb" # Export relevant variables export ROOT=; export ROOTDELAY=; export ROOTFLAGS=; export ROOTFSTYPE= export IP=; export BOOT=; export BOOTIF=; export UBIMTD=; export break= export init=/sbin/init; export quiet=n; export readonly=y export rootmnt=/root; export debug=; export panic=; export blacklist= export resume=; export resume_offset= 27/52
  • 29. ./init (5) conf conf ファイルの読み込み # Bring in the main config . /conf/initramfs.conf for conf in conf/conf.d/*; do [ -f ${conf} ] && . ${conf} done . /scripts/functions 28/52
  • 30. ./conf/initramfs.conf ./conf/initramfs.conf の中身の例 (real root を探す処理が BOOT で決まる) % egrep '^[^#]' conf/initramfs.conf MODULES=most BUSYBOX=y KEYMAP=n COMPRESS=gzip BOOT=local DEVICE= NFSROOT=auto 29/52
  • 31. ./conf/conf.d の中身の例 % ls conf/conf.d resume % cat conf/conf.d/resume RESUME=UUID=ae891314-2104-480c-bdd8-6de40e6edb72 30/52
  • 32. ./init (6) cmdline カーネルのコマンドライン引数 (/proc/ cmdline) の解析 # Parse command line options for x in $(cat /proc/cmdline); do case $x in init=*) init=${x#init=} ;; root=*) ROOT=${x#root=} case $ROOT in LABEL=*) ROOT="${ROOT#LABEL=}" (省略) 31/52
  • 33. ./init (7) noresume if [ -n "${noresume}" ]; then export noresume unset resume else resume=${RESUME:-} fi # cmdline 処理の一部: resume=*) RESUME="${x#resume=}" ;; resume_offset=*) resume_offset="${x#resume_offset=}" ;; noresume) noresume=y ;; 32/52
  • 34. ./init (8) netconsole [ -n "${netconsole}" ] && modprobe netconsole netconsole="${netconsole}" # cmdline 処理の一部: netconsole=*) netconsole=${x#netconsole=} ;; スペースの都合で改行を入れています 33/52
  • 35. ./init (9) maybe_break maybe_break は処理の途中でシェルを起動で きる場所 maybe_break top # cmdline 処理の一部: break=*) break=${x#break=} ;; break) break=premount ;; 34/52
  • 36. scripts/functions: maybe_break (1) # scripts/functions の一部: maybe_break() { if [ "${break:-}" = "$1" ]; then panic "Spawning shell within the initramfs" fi } 35/52
  • 37. scripts/functions: maybe_break (2) ubuntu (lucid) の initramfs-tools 0.92bubuntu78(以降 ubuntu 版の話がある場合はこのバージョ ン)の場合、Debian と違って複数指定可能 # scripts/functions の一部: maybe_break() { if echo "${break}" | egrep -q "(,|^)$1(,|$)"; then panic "Spawning shell within the initramfs" fi } 36/52
  • 38. functions: panic (1) 起動時に root ファイルシステムが見つからなくて「(initramfs)」で止まる ことがあるのはこれ。 # scripts/functions の一部: panic() { if [ -x /sbin/usplash_write ]; then /sbin/usplash_write "QUIT" fi if command -v chvt >/dev/null 2>&1; then chvt 1 fi # Disallow console access if [ -n "${panic}" ]; then sleep ${panic} reboot fi modprobe i8042 modprobe atkbd echo "$@" REASON="$@" PS1='(initramfs) ' /bin/sh -i </dev/console >/dev/console 2>&1 } 37/52
  • 39. functions: panic (2) 数字か「.」以外の文字があると無視するように なっている。 # cmdline 処理の一部: panic=*) panic="${x#panic=}" case ${panic} in *[![:digit:].]*) panic= ;; esac ;; 38/52
  • 40. functions: panic (3) ubuntu 版だと run_scripts がある。 # scripts/functions の一部: panic() { if [ -x /sbin/usplash_write ]; then /sbin/usplash_write "QUIT" fi chvt 1 # Disallow console access if [ -n "${panic}" ]; then sleep ${panic} reboot fi modprobe i8042 modprobe atkbd run_scripts /scripts/panic echo $@ PS1='(initramfs) ' /bin/sh -i </dev/console >/dev/console 2>&1 } 39/52
  • 41. run_scripts (1) 指定されたディレクトリの中の実行可能ファ イルを実行 prereqs で依存関係を指定できる ORDER に tsort (トポロジカルソート) 結果 をキャッシュしている 40/52
  • 42. run_scripts (2) # scripts/functions の一部: run_scripts() { initdir=${1} [ ! -d ${initdir} ] && return if [ -f ${initdir}/ORDER ]; then . ${initdir}/ORDER elif command -v tsort >/dev/null 2>&1; then runlist=$(get_prereq_pairs | tsort) call_scripts ${2:-} else get_prereqs reduce_prereqs call_scripts fi } 41/52
  • 43. prereqs 引数が prereqs の時に依存するものを echo す る。(複数ある場合はスペース区切りで列挙) PREREQ="" prereqs() { echo "$PREREQ" } case $1 in # get pre-requisites prereqs) prereqs exit 0 ;; esac 42/52
  • 44. ./init (10) init-top フックを実行 # Don't do log messages here to avoid confusing usplash run_scripts /scripts/init-top 43/52
  • 45. init (11) load_modules ./conf/modules に書いてあるモジュールをロー ド(/etc/initramfs-tools/modules で設定) maybe_break modules [ "$quiet" != "y" ] && log_begin_msg "Loading essential drivers" load_modules [ "$quiet" != "y" ] && log_end_msg 自動認識できないモジュールやはやめにロード しないといけないモジュールに使う。 44/52
  • 46. ./init (12) mount mountroot は「. /scripts/${BOOT}」で定義 される。(parse_numeric は ROOT=major:minor のような指定を処 理している) maybe_break premount [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/init-premount" run_scripts /scripts/init-premount [ "$quiet" != "y" ] && log_end_msg maybe_break mount log_begin_msg "Mounting root file system" . /scripts/${BOOT} parse_numeric ${ROOT} maybe_break mountroot mountroot log_end_msg 45/52
  • 47. ./script/local run_scripts /scripts/local-top のようなフックを実行したり"${ROOT}" で指 定されているデバイスをマウントしたりマウン トできなかったときに panic "ALERT! ${ROOT} does not exist. Dropping to a shell!" で「(initramfs) 」のシェルに落ちたりする。 46/52
  • 48. ./init (13) bottom 最初の方でマウントした sysfs と proc を本当 の root ファイルシステム (real root) に移動 する。 maybe_break bottom [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/init-bottom" run_scripts /scripts/init-bottom [ "$quiet" != "y" ] && log_end_msg # Move virtual filesystems over to the real filesystem mount -n -o move /sys ${rootmnt}/sys mount -n -o move /proc ${rootmnt}/proc 47/52
  • 49. ./init (14) check init validate_init() { checktarget="${1}" # Work around absolute symlinks if [ -d "${rootmnt}" ] && [ -h "${rootmnt}${checktarget}" ]; then case $(readlink "${rootmnt}${checktarget}") in /*) checktarget="$(chroot ${rootmnt} readlink ${checktarget} )" ;; esac fi # Make sure the specified init can be executed if [ ! -x "${rootmnt}${checktarget}" ]; then return 1 fi # Upstart uses /etc/init as configuration directory :-/ if [ -d "${rootmnt}${checktarget}" ]; then return 1 fi } 48/52
  • 50. ./init (15) check init # Check init bootarg if [ -n "${init}" ]; then if ! validate_init "$init"; then echo "Target filesystem doesn't have requested ${init}." init= fi fi # Common case: /sbin/init is present if [ ! -x "${rootmnt}/sbin/init" ]; then # ... if it's not available search for valid init if [ -z "${init}" ] ; then for inittest in /sbin/init /etc/init /bin/init /bin/sh; do if validate_init "${inittest}"; then init="$inittest" break fi done fi # No init on rootmount if ! validate_init "${init}" ; then panic "No init found. Try passing init= bootarg." fi fi 49/52
  • 51. ./init (16) unsetenv # don't leak too much of env - some init(8) don't clear it # (keep init, rootmnt) unset debug unset MODPROBE_OPTIONS unset DPKG_ARCH unset ROOTFLAGS unset ROOTFSTYPE unset ROOTDELAY unset ROOT unset IP unset BOOT unset BOOTIF unset UBIMTD unset blacklist unset break unset noresume unset panic unset quiet unset readonly unset resume unset resume_offset 50/52
  • 52. ./init (17) exec init klibc-utils パッケージ由来の run-init で real root の /sbin/init などを実行 # Chain to real filesystem exec run-init ${rootmnt} ${init} "$@" <${rootmnt}/dev/console >${rootmnt}/dev/console panic "Could not execute run-init." 51/52
  • 53. real root での処理 sysvinit /etc/inittab に従って処理 upstart /etc/init/*.conf に従って処理 など Powered by Rabbit 0.6.4 52/52