SlideShare une entreprise Scribd logo
1  sur  53
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

GPU仮想化最前線 - KVMGTとvirtio-gpu -
GPU仮想化最前線 - KVMGTとvirtio-gpu -GPU仮想化最前線 - KVMGTとvirtio-gpu -
GPU仮想化最前線 - KVMGTとvirtio-gpu -zgock
 
コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線Motonori Shindo
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けモノビット エンジン
 
自宅サーバ仮想化
自宅サーバ仮想化自宅サーバ仮想化
自宅サーバ仮想化anubis_369
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫Yuta Imai
 
10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤTakashi Hoshino
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Etsuji Nakai
 
不揮発メモリ(NVDIMM)とLinuxの対応動向について
不揮発メモリ(NVDIMM)とLinuxの対応動向について不揮発メモリ(NVDIMM)とLinuxの対応動向について
不揮発メモリ(NVDIMM)とLinuxの対応動向についてYasunori Goto
 
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理NTT DATA Technology & Innovation
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!kwatch
 
SpectreとMeltdown:最近のCPUの深い話
SpectreとMeltdown:最近のCPUの深い話SpectreとMeltdown:最近のCPUの深い話
SpectreとMeltdown:最近のCPUの深い話LINE Corporation
 
仮想化環境におけるパケットフォワーディング
仮想化環境におけるパケットフォワーディング仮想化環境におけるパケットフォワーディング
仮想化環境におけるパケットフォワーディングTakuya ASADA
 
UnboundとNSDの紹介 BIND9との比較編
UnboundとNSDの紹介 BIND9との比較編UnboundとNSDの紹介 BIND9との比較編
UnboundとNSDの紹介 BIND9との比較編hdais
 
その ionice、ほんとに効いてますか?
その ionice、ほんとに効いてますか?その ionice、ほんとに効いてますか?
その ionice、ほんとに効いてますか?Narimichi Takamura
 
Yocto bspを作ってみた
Yocto bspを作ってみたYocto bspを作ってみた
Yocto bspを作ってみたwata2ki
 
iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方歩 柴田
 

Tendances (20)

GPU仮想化最前線 - KVMGTとvirtio-gpu -
GPU仮想化最前線 - KVMGTとvirtio-gpu -GPU仮想化最前線 - KVMGTとvirtio-gpu -
GPU仮想化最前線 - KVMGTとvirtio-gpu -
 
コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
レシピの作り方入門
レシピの作り方入門レシピの作り方入門
レシピの作り方入門
 
Linux Namespace
Linux NamespaceLinux Namespace
Linux Namespace
 
自宅サーバ仮想化
自宅サーバ仮想化自宅サーバ仮想化
自宅サーバ仮想化
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
 
10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
不揮発メモリ(NVDIMM)とLinuxの対応動向について
不揮発メモリ(NVDIMM)とLinuxの対応動向について不揮発メモリ(NVDIMM)とLinuxの対応動向について
不揮発メモリ(NVDIMM)とLinuxの対応動向について
 
Ext4 filesystem(1)
Ext4 filesystem(1)Ext4 filesystem(1)
Ext4 filesystem(1)
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
SpectreとMeltdown:最近のCPUの深い話
SpectreとMeltdown:最近のCPUの深い話SpectreとMeltdown:最近のCPUの深い話
SpectreとMeltdown:最近のCPUの深い話
 
仮想化環境におけるパケットフォワーディング
仮想化環境におけるパケットフォワーディング仮想化環境におけるパケットフォワーディング
仮想化環境におけるパケットフォワーディング
 
UnboundとNSDの紹介 BIND9との比較編
UnboundとNSDの紹介 BIND9との比較編UnboundとNSDの紹介 BIND9との比較編
UnboundとNSDの紹介 BIND9との比較編
 
その ionice、ほんとに効いてますか?
その ionice、ほんとに効いてますか?その ionice、ほんとに効いてますか?
その ionice、ほんとに効いてますか?
 
Yocto bspを作ってみた
Yocto bspを作ってみたYocto bspを作ってみた
Yocto bspを作ってみた
 
iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方
 

En vedette

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!デベロッパーネットワーク
 

En vedette (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
 

Similaire à 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
 
MINCS – containers in the shell script
MINCS – containers in the shell scriptMINCS – containers in the shell script
MINCS – containers in the shell scriptMasami Hiramatsu
 
20160827 第24回シェル芸勉強会LT Bash on Windows環境非破壊ハンズオン
20160827 第24回シェル芸勉強会LT Bash on Windows環境非破壊ハンズオン20160827 第24回シェル芸勉強会LT Bash on Windows環境非破壊ハンズオン
20160827 第24回シェル芸勉強会LT Bash on Windows環境非破壊ハンズオンkunst1080
 

Similaire à 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
 
MINCS – containers in the shell script
MINCS – containers in the shell scriptMINCS – containers in the shell script
MINCS – containers in the shell script
 
20160827 第24回シェル芸勉強会LT Bash on Windows環境非破壊ハンズオン
20160827 第24回シェル芸勉強会LT Bash on Windows環境非破壊ハンズオン20160827 第24回シェル芸勉強会LT Bash on Windows環境非破壊ハンズオン
20160827 第24回シェル芸勉強会LT Bash on Windows環境非破壊ハンズオン
 

Plus de 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
 

Plus de 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
 

Dernier

新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 
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
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
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
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 

Dernier (9)

新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 
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
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
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
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 

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