8.3.1. カーネル のインストール
        
        
          カーネルの構築は、カーネルの設定、コンパイル、インストールの順に行っていきます。
          本書が行っているカーネル設定の方法以外については、カーネルソースツリー内にある README ファイルを参照してください。
        
        
          コンパイルするための準備として以下のコマンドを実行します。
        
        
make mrproper
        
          これによりカーネルソースが完全にクリーンなものになります。
          カーネル開発チームは、カーネルコンパイルするなら、そのたびにこれを実行することを推奨しています。 tar
          コマンドにより伸張しただけのソースではクリーンなものにはなりません。
        
        
          メニュー形式のインターフェースによりカーネルを設定します。 カーネルの設定方法に関する一般的な情報が 
          http://www.linuxfromscratch.org/hints/downloads/files/kernel-configuration.txt
          にあるので参照してください。 BLFS では LFS
          が取り扱わない各種パッケージに対して、必要となるカーネル設定項目を説明しています。 
          http://www.linuxfromscratch.org/blfs/view/8.0/longindex.html#kernel-config-index
          を参照してください。 さらに詳しくカーネルの構築や設定を説明している http://www.kroah.com/lkn/ もあります。
        
        
          ![[注記]](../images/note.png) 
          
            注記
          
          
            カーネル設定を行うにあたって、分かりやすいやり方として make
            defconfig を実行する方法があります。
            これを実行することで基本的な設定がなされ、現在のシステム構成が考慮された、より良い設定が得られるかもしれません。
          
          
            以下の機能項目についての有効無効を確認してください。
            不適切である場合にはシステムが正常動作しなかったり起動できなかったりするかもしれません。
          
          
Device Drivers  --->
  Generic Driver Options  --->
   [ ] Support for uevent helper [CONFIG_UEVENT_HELPER]
   [*] Maintain a devtmpfs filesystem to mount at /dev [CONFIG_DEVTMPFS]
         
        
          システムに特定の機能性が必要になれば、それだけ多くのオプションが必要となります。 例えば BLFS
          パッケージにて必要となるオプションについては 
          BLFS Index of Kernel Settings
          (http://www.linuxfromscratch.org/blfs/view/8.0/longindex.html#kernel-config-index)
          を参照してください。
        
        
          ![[注記]](../images/note.png) 
          
            注記
          
          
            ホストシステムが UEFI を利用している場合は、上の 'make defconfig' によって EFI
            に関連するカーネルオプションが自動的に追加されます。
          
          
            LFS のカーネルを UEFI を利用したホストシステム環境内からブートする場合は本オプションを指定する必要があります。
          
          
Processor type and features  --->
   [*]   EFI stub support  [CONFIG_EFI_STUB]
          
            LFS 環境にて UEFI を取り扱う詳細な方法は lfs-uefi.txt ヒント 
            http://www.linuxfromscratch.org/hints/downloads/files/lfs-uefi.txt
            に示されているので参照してください。
          
         
        
          
            上の設定項目の説明
          
          
            - 
              Support for
              uevent helper
- 
              
                本項目を有効にすることで、デバイス管理を Udev/Eudev により行ないます。
               
- 
              Maintain a
              devtmpfs
- 
              
                本項目は、カーネルにより事前登録される自動化デバイスノードを生成します。 これは Udev
                が動作していなくても行われます。 Udev はその上で起動し、パーミッション管理やシンボリックリンクの追加を行います。
                Udev/Eudev を利用する場合には本項目を有効にすることが必要です。
               
 
        
make menuconfig
        
          
            追加する make 環境変数の意味:
          
          
            - 
              LANG=<host_LANG_value>
              LC_ALL=
- 
              
                これはホストのロケール設定を指示するものです。 この設定は UTF-8 での表示設定がされたテキストコンソールにて
                menuconfig の ncurses による行表示を適切に行うために必要となります。
               
                <host_LANG_value>の部分は、ホストの$LANG変数の値に置き換えてください。$LC_ALLあるいは$LC_CTYPEの値を設定することもできます。
 
 
        
          上のコマンドではなく、状況によっては make
          oldconfig を実行することが適当な場合もあります。 詳細についてはカーネルソース内の
          README ファイルを参照してください。
        
        
          カーネル設定は行わずに、ホストシステムにあるカーネル設定ファイル .config をコピーして利用することもできます。 そのファイルが存在すればの話です。
          その場合は linux-4.9.9
          ディレクトリにそのファイルをコピーしてください。 もっともこのやり方はお勧めしません。
          設定項目をメニューから探し出して、カーネル設定を一から行っていくことが望ましいことです。
        
        
          カーネルイメージとモジュールをコンパイルします。
        
        
make
        
          カーネルモジュールを利用する場合 /etc/modprobe.d
          ディレクトリ内での設定を必要とします。 モジュールやカーネル設定に関する情報は 7.3.「デバイスとモジュールの扱いについて」や linux-4.9.9/Documentation
          ディレクトリにあるカーネルドキュメントを参照してください。 また modprobe.d(5) も有用です。
        
        
          カーネル設定においてモジュールを利用することにした場合、モジュールをインストールします。
        
        
make modules_install
        
          カーネルのコンパイルが終わったら、インストールの完了に向けてあと少し作業を行います。 /boot ディレクトリにいくつかのファイルをコピーします。
        
        
          ![[注意]](../images/caution.png) 
          
            注意
          
          
            ホストシステムが独立した /boot パーティションを用いている場合はファイルをそこにコピーします。
            これを簡単に行うために、作業前に /boot をホストの /mnt/lfs/boot にバインドしておく方法があります。
            ホストシステム の root
            ユーザーとなって以下を実行します。
          
          
mount --bind /boot /mnt/lfs/boot
         
        
          カーネルイメージへのパスは、利用しているプラットフォームによってさまざまです。 そのファイル名は、好みにより自由に変更して構いません。
          ただし vmlinuz という語は必ず含めてください。
          これにより、次節で説明するブートプロセスを自動的に設定するために必要なことです。 以下のコマンドは x86
          アーキテクチャーの場合の例です。
        
        
cp -v arch/x86/boot/bzImage /boot/vmlinuz-4.9.9-lfs-8.0
        
          System.map はカーネルに対するシンボルファイルです。
          このファイルはカーネル API の各関数のエントリポイントをマッピングしています。
          同様に実行中のカーネルのデータ構成のアドレスを保持します。
          このファイルは、カーネルに問題があった場合にその状況を調べる手段として利用できます。
          マップファイルをインストールするには以下を実行します。
        
        
cp -v System.map /boot/System.map-4.9.9
        
          カーネル設定ファイル .config は、上で実行した
          make menuconfig
          によって生成されます。 このファイル内には、今コンパイルしたカーネルの設定項目の情報がすべて保持されています。
          将来このファイルを参照する必要が出てくるかもしれないため、このファイルを保存しておきます。
        
        
cp -v .config /boot/config-4.9.9
        
          Linux カーネルのドキュメントをインストールします。
        
        
install -d /usr/share/doc/linux-4.9.9
cp -r Documentation/* /usr/share/doc/linux-4.9.9
        
          カーネルのソースディレクトリは所有者が root
          ユーザーになっていません。 我々は chroot 環境内の root
          ユーザーとなってパッケージを展開してきましたが、展開されたファイル類はパッケージ開発者が用いていたユーザー ID、グループ ID
          が適用されています。 このことは普通はあまり問題になりません。
          というのもパッケージをインストールした後のソースファイルは、たいていは削除するからです。 一方 Linux
          のソースファイルは、削除せずに保持しておくことがよく行われます。
          このことがあるため開発者の用いたユーザーIDが、インストールしたマシン内の誰かの ID に割り当たった状態となりえます。
          その人はカーネルソースを自由に書き換えてしまう権限を持つことになるわけです。
        
        
          ![[注記]](../images/note.png) 
          
            注記
          
          
            カーネルの設定は、BLFS をインストールしていくにつれて、設定を更新していかなければならないことが多々あります。
            一般にパッケージのソースは削除することが通常ですが、カーネルのソースに関しては、カーネルをもう一度新たにインストールするなら、削除しなくて構いません。
          
          
            カーネルのソースファイルを保持しておくつもりなら linux-4.9.9 ディレクトリにおいて chown -R 0:0 を実行しておいてください。
            これによりそのディレクトリの所有者は root
            ユーザーとなります。
          
         
        
          ![[警告]](../images/warning.png) 
          
            警告
          
          
            カーネルを説明する書の中には、カーネルのソースディレクトリに対してシンボリックリンク /usr/src/linux の生成を勧めているものがあります。 これはカーネル 2.6
            系以前におけるものであり LFS システム上では生成してはなりません 。 ベースとなる LFS
            システムを構築し、そこに新たなパッケージを追加していこうとした際に、そのことが問題となるからです。
          
         
        
          ![[警告]](../images/warning.png) 
          
            警告
          
          
            さらに include ディレクトリ (/usr/include) にあるヘッダーファイルは、必ず Glibc のコンパイルによって得られるものでなければなりません。
            つまり 6.7.「Linux-4.9.9 API ヘッダー」
            によってインストールされた、健全化 (sanitizing) したものです。
            したがって生のカーネルヘッダーや他のカーネルにて健全化されたヘッダーによって上書きされてしまうのは避けなければなりません。
          
         
       
      
        
          8.3.2. Linux
          モジュールのロード順の設定
        
        
          たいていの場合 Linux モジュールは自動的にロードされます。 しかし中には特定の指示を必要とするものもあります。
          モジュールをロードするプログラム、modprobe または insmod は、そのような指示を行う目的で
          /etc/modprobe.d/usb.conf を利用します。 USB
          ドライバー (ehci_hcd, ohci_hcd, uhci_hcd)
          がモジュールとしてビルドされていた場合には、それらを正しい順でロードしなければならず、そのために /etc/modprobe.d/usb.conf ファイルが必要となります。 ehci_hcd は
          ohci_hcd や uhci_hcd よりも先にロードしなければなりません。
          これを行わないとブート時に警告メッセージが出力されます。
        
        
          以下のコマンドを実行して /etc/modprobe.d/usb.conf
          ファイルを生成します。
        
        
install -v -m755 -d /etc/modprobe.d
cat > /etc/modprobe.d/usb.conf << "EOF"
# Begin /etc/modprobe.d/usb.conf
install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true
install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true
# End /etc/modprobe.d/usb.conf
EOF