分12前回,Plamo-7.1から採用することにしたinitrdの概要を紹介しました。その際に触れたように,initrdはドライバ・モジュールを組み込むことに特化したLinuxシステムで,機能はシンプルなものの,Linuxシステムを運用するためのファイル一式が必要なことを紹介しました。それらのファイルを過不足なく揃え,適切に配置してinitrdイメージを作成するのがmkinitramfsスクリプトです。今回はこのスクリプトの処理を解説しながらinitrdの作り方を紹介しましょう。/sbin/mkinitramfs前回,initrd上のinitスクリプトをつまみ読みしながら処理の流れを概観したように,initrd上には「ルートファイルシステムをマウントするために必要なドライバ・モジュール」と「それらモジュールをカーネルに組み込むためのコマンド(実行ファイル)⁠」⁠,「⁠それら実行ファイルが必要とする共有ライブラリ」などが必要となります。mkinitramfsはこれら必要なファイルを集めてinitrdイメージを作るツールです。mkinitramfsはシンプルなシェルスクリプトなものの,全文を掲載するには長すぎるので,つまみ読みしながら処理の流れを紹介してみます。このスクリプトは,見だしのようにPlamo-7.1環境では/sbin/mkinitramfsにありますので,全体を見たい方はそちらでご確認ください。このコードのオリジナルはBLFSのサイトで参照できます。必要なコマンドの準備mkinitramfsでは,最初の30行ほどで内部処理用のcopyコマンドを定義したり,ドライバ・モジュールのディレクトリを確認するなどの初期化処理を行った後,initrd上で使うコマンドを$binfilesと$sbinfilesに指定していきます。doneこれらのうち,$binfilesに指定したコマンド(の実行ファイル)はinitrdのbinディレクトリに,$sbinfilesに指定した実行ファイルはsbinディレクトリに,それぞれコピーされます。dmsetupが追加されるので,initrdに含まれる実行ファイルは総計27個となります。次に/tmpディレクトリに作業用の一時ファイル($unsorted)とディレクトリ($WDIR)を用意します。$unsortedは先に指定した27個の実行ファイルが必要とする共有ライブラリを調べる際に使うファイルで,後述するように各実行ファイルにlddした結果を収めていきます。,$WDIRはCPIOイメージを作る際の作業ディレクトリになります。次に,$WDIRにディレクトリ構造を作ります。initrdはシンプルなものの独立したLinux環境なので,ルートファイルシステムのディレクトリ構造一式が必要となります。$WDIR/usr/bininitrd用の/dev/consoleと/dev/nullを作ります。ほとんどのデバイスファイルはudevdが動的に作るものの,udevdのメッセージを表示したり,不要なメッセージを捨てたりするデバイスファイルはあらかじめ用意しておく必要があります。3実行ファイルと共有ライブラリのコピーまず,udev用の設定ファイルやルールファイルを,動作中の環境から作業用ディレクトリへコピーします。done代入している部分は省略したものの,89行目で使っている$DATADIR/$INITINは/usr/share/mkinitramfs/init.inで,あらかじめ用意してあるこのファイルを,initrd上のinitとしてインストールします。このファイルは前回紹介しました。$WDIR/initドライバ・モジュールを組み込むためのkmodを$binfilesのリストに追加します。念のため,古いmodule-init-toolsを使っている場合も考慮しています。fi次に$binfilesに指定したコマンド(実行ファイル)を作業用ディレクトリ内へコピーします。$binfilesにはコマンド名しか指定していないため,実行ファイルが/bin/にあるのか/usr/bin/にあるのかをチェックして(102行目⁠)⁠,利用する共有ライブラリの情報を$unsortedに記録(103行目)してから,作業用ディレクトリのbin/以下にコピーしていきます。ここで使っているcopyは,省略した部分(5~22行目)で定義している内部コマンドで,宛先を$WDIR内に限定したコピーです。done同様に$sbinfilesに指定したコマンド(実行ファイル)を作業用ディレクトリ内へコピーします。こちらの実行ファイルは/sbin/以下にあるはずなので一手間省けますが,共有ライブラリは忘れずにチェックします。ここまでで,initrdに組み込む実行ファイルが必要とする共有ライブラリの一覧(重複あり)が$unsortedに記録されました。done次に,$unsortedに集めた共有ライブラリのリストからsortとuniqを使って重複を除き,残ったライブラリを作業ディレクトリのlib/以下にコピーします。155~157行目は,lddコマンドでは共有ライブラリとして表示されるものの,カーネルが提供する仮想的なライブラリで実体は存在しない"linux-vdso.1"や"linux-gate.so.1"を省く処理です。doneこのあたり,コードとしてはそれほど凝ったことをしているわけではないものの,initrdを自作しようと苦労したことがある人間にとって,これだけの処理でinitrdに必要な共有ライブラリが揃うというのは,結構「目から鱗」な体験でした。udevは/lib/udevに支援用の実行ファイルがあるので,それらをまとめて作業用ディレクトリにコピーします。Linuxとりまとめ役。人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。