Linux from Scratch-8.3に挑戦してみた

#はじめに
学校でLinux初心者の私がLinux from Scratchに挑戦しました。
結果から言うと、[LFS8.3](http://lfsbookja.osdn.jp/8.3-ja/)ではブートまで行ってもログインが出来なかったので、[LFS8.3-systemd](http://lfsbookja.osdn.jp/8.3-sysdja/index.html)を見ながらやり、なんとかログインまで行くことが出来ました。

#Linux初心者
今までなんとなくでCentOS7をセットアップした経験はあるのですが、Linuxやkernelについての知識はまだまだなので、基礎的なところから記録していきます。詳しいこととかよくわからないので、ざっくり掴んでいきます。

<dl>
<dt>kernelってなに？</dt>
<dd>OSの中核</dd>
<dt>ディストリビューションってなに？</dt>
<dd>やりたいことをやる上で必要なものを集めた塊</dd>
<dt>Linux from Scratchってなに？</dt>
<dd>ユーザが自分自身でゼロからLinuxシステムをビルドする</dd>
</dl>

ここまで調べて、kernelは自動車で言うところのエンジンで、ディストリビューションはタイヤやボディ、ライトといった関係に近いかなと思いました。
その上で、自作ディストリビューションとはkernelというエンジンをもとに自分好みの車を作るというイメージを持ちました。

#環境
ホストシステムはUbuntu18.04でやりました。
デスクトップのPCです。

## Ubuntuのセットアップ
[初心者でもわかるサイト](https://eng-entrance.com/ubuntu-install)を見てPCのセットアップからです。第二章のホストシステムの準備からパーティションは以下のように分けました。前にLFS8.3で挑戦したので、その時区切ったパーティションの名残が残っていますが、ホストの領域とLFSの領域、swap領域の３つに区切りました。

- /dev/sda1 ext4 基本パーティション
- /dev/sda2 ext4 基本パーティション
 - /mnt/lfsにマウント
- /dev/sda4 swap 基本パーティション

<details><summary>余談</summary>
LFSとは関係ありませんが、セットアップが完了したところで問題が発生。今回使っていたマシンには無線LANアダプタが搭載されていないことが判明。しかも、Wi-Fi USBアダプタも認識してくれません。勘弁してほしい。
`lsusb`コマンドなどを使い、USBとして認識はされているが、Wi-Fiアダプタと認識されていないことがわかりました。
有線LANがある上の階に移動し、[ここ](http://mnikoru.jugem.jp/?eid=1052)を参考にしてどうにかでました。
LFSをやる過程で何度もUbuntuの再セットアップをしていますが、そのたびにデスクトップPCを上の階の有線LANにつなげていました。
</details>

#Linux from Scratch - Version 8.3-systemd 
[Linux from Scratch](http://lfsbookja.osdn.jp/)の公式ページの[1.1オンライン参照]の[LFS 8.3-systemd](http://lfsbookja.osdn.jp/8.3-sysdja/index.html)を見てやっていきました。

##序文
「なぜ様々なディストリビューションがある中で、わざわざLFSするのか？」ということや最低限必要な知識、ドキュメントの表記の仕方などが書かれています。「ii対象読者」「vi必要な知識」「vii本書の表記」は読んでおいたほうがいいと思います。

## 第一章 はじめに
このドキュメントの構成や変更履歴などが書かれています。「1.1LFSをどうやって作るか」では各章でどのようなことをやるかが説明されています。読んでおくとざっくりと流れがつかめるかもしれません。

## 第二章 ビルド作業のための準備
###2. ホストシステムの準備
ここからが本番です。LFSをやるためにホストシステムをセットアップしていきます。「2.3作業段階ごとのLFS構築」は各作業が終わるごとに読み返したほうが理解につながると思います。
<details><summary>余談</summary>
私は「2.2ホストシステム要件」のスクリプトを実行したところ、bashのところでエラーが出ました。ホストシステムがUbuntuだったので、bashではなくdashだったのがいけなかったようです。[ここ](https://qiita.com/tashua314/items/86c87ababa42064ce5ed)を見て解決しました。
</details>

###3. パッケージとパッチ
ここでは必要なパッケージをダウンロードします。

###4. 準備作業の仕上げ
LFSユーザを追加してsourcesディレクトリの設定とかします。

###5. 一時的環境の構築
/mnt/lfs/sourcesの中で各パッケージを解凍してコンパイルしていきます。
全般的なコンパイル手順にも書いてありますが、手順を確認しておくと、

```bash
#tarコマンドでパッケージを解凍
sources$ tar -xf hoge-4.0.tar.gz
#解凍して出来たディレクトリにcdコマンドで入る。
sources$ cd hoge-4.0
#各パッケージに対応するページに書かれている処理を実行しコンパイルしていく。以下は例。
sources/hoge-4.0$ ./configure --prefix=/tools
sources/hoge-4.0$ make
sources/hoge-4.0$ make install #パッケージによってはビルド用のディレクトリを作成することもある。
#パッケージのコンパイルが終わったら、ディレクトリを削除する
sources/hoge-4.0$ cd /mnt/lfs/sources
sources$ rm -r hoge-4.0
```

同じパッケージをconfigオプションなどを変えて何度かコンパイルするので、あとで邪魔にならないように消しておきます。
全て終えたら、必要なら「5.33のストリップ」をし、「5.36所有者の変更」をします。

##第三章 LFSシステムの構築
###6. 基本的なソフトウェアのインストール
ソフトウェアをインストールする前にディレクトリのマウントやchroot環境に移ります。
ここからは、作業を途中で中断(chroot環境から出る)し、また再開する際に以下に記す手順が必要になります。
<dl>
<dt>再開手順.1</dt>
<dd>作業を再開するときは「6.2.2. /dev のマウントと有効化」「6.2.3.仮想カーネルファイルシステムのマウント」の処理をやってから「6.4.Chroot環境への移行」でchroot環境に移行します。</dd>
</dl>

パッケージのコンパイルは「2.5.一時的環境の構築」と同様にやっていきます。
パッケージのコンパイルが終わったら、必要であればストリップをし、「6.79.仕切り直し」でchroot環境から一度抜け、新たなchrootコマンドにより入り直します。
また、再開の手順が以下のように少し変わります。

<dl>
<dt>再開手順.2</dt>
<dd>ここからは作業を再開する際に「6.2.2」「6.2.3」の処理を実行したら、chrootコマンドだけは「6.79. 仕切り直し」のコマンドを用いてchroot環境に入ります。</dd>
</dl>

###7. システム設定
ここからは基本的には各ページに従ってコマンドを実行していきますが、私の視点から書いていきます。

<dl>
<dt>7.2.全般的なネットワークの設定</dt>
<dd>私は「7.2.3.ホスト名の設定」だけを実行しました。</dd>
<dt>7.4.デバイスの管理</dt>
<dd>必要であればやります。私はやっていません。</dd>
<dt>7.5.システムクロックの設定</dt>
<dd>「7.5.1.ネットワークによる時刻同期」以外はやりました。</dd>
<dt>7.6. Linux コンソールの設定</dt>
<dd>コンソール設定は以下のようにしました。</dd>
</dl>

```bash
cat > /etc/vconsole.conf << "EOF"
KEYMAP=jp106
FONT=Lat2-Terminus16
EOF
```
<dl>
<dt>7.7. システムロケールの設定</dt>
<dd>/etc/locale.confファイルの生成では<@ modifiers>と書かれているところは書かなくてもいいようです。</dd>
</dl>

「7.8./etc/inputrcファイルの生成」「7.9. /etc/shellsファイルの生成」「 7.10. Systemdの利用と設定」の内容を実行してLFSシステムのブート設定へ入ります。

###8. LFS システムのブート設定
<dl>
<dt>8.2./etc/fstabファイルの生成</dt>
<dd>`fdisk -l`でパーティションを確認した後に以下のようにして生成しました。</dd>
</dl>

```bash
cat > /etc/fstab << "EOF"
# Begin /etc/fstab

# file system  mount-point  type     options             dump  fsck
#                                                              order

/dev/sda2     /            ext4    defaults            1     1
/dev/sda4     swap         swap     pri=1               0     0

# End /etc/fstab
EOF
```

<dl>
<dt>8.3.Linux-4.18.5</dt>
<dd>2.5.一時的環境の構築のとき同様の手順でコンパイルしていきます。</dd>
<dt>8.4. GRUB を用いたブートプロセスの設定</dt>
<dd>「8.4.1. はじめに」は私は実行しませんでした。しかし、やっておいたほうがいいのだと思います。</dd>
<dt>8.4.4. GRUB 設定ファイルの生成</dt>
<dd>ここはパーティションやファイルシステムに気をつけて実行します。"GNU/Linux"に関しては好きな言葉を入れていいようでしたので、私は"OrenoLinux"にしました。</dd>
</dl>

```bash
cat > /boot/grub/grub.cfg << "EOF"
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5

insmod ext4
set root=(hd0,2)

menuentry "OrenoLinux, Linux 4.18.5-lfs-8.3-systemd" {
        linux   /boot/vmlinuz-4.18.5-lfs-8.3-systemd root=/dev/sda2 ro
}
EOF
```

###9. 作業終了
いよいよ架橋です。
「9.1.作業終了」と「9.3システムの再起動」を実行し、マシンを再起動させます。
再起動すると暗い画面が表示され、/boot/grub/grub.cfgファイルに入力した内容が表示されるので、Enterキーで選択します。
行け！「俺のLinux」！

##第四章 失敗
ブートはしました。したんです。しかし、キーボードを認識していないようで、Enterキーを押しても反応しません。ログインが出来ません。

###GRUBコマンド
とりあえずGRUBコマンドを叩いて、ホストマシンのUbuntuを起動させます。キーの位置が変わったりするので気をつけてください。

```bash
grub >> set pager=1
grub >> set root=(hd0,1)
grub >> linux /boot/vmlinuz-4.15.0-36-generic root=/dev/sda1
grub >> initrd /boot/initrd.img-4.15.0-36-generic
grub >> boot
```

私はUSBポートにキーボードを繋いでいたのですが、いろいろなポートに差してみたり、コンソールの設定を確認してみたりしたのですが、うんともすんとも言いません...

そこに
**「PS/2キーボードを使ってみてはどうか」**
という意見を頂き、繋いでみたところ、なんと！
初めてPS/2キーボードを使いましたが、ちゃんとキーボードを認識し、ログインまで達することが出来ました！(ﾊﾟﾁﾊﾟﾁ
他のPCだと繋いだ状態からブートすれば、USBでもちゃんと反応したのですが、なぜか私のは反応しませんでした...

#所感
SystemVで挑戦しては躓き、USBキーボードは反応しなかったりと、とても長い道のりに感じました。
しかし、ここまでこれたのも、私だけの力ではなく周りの人たちの力添えのおかげです。本当にありがとうございました！

#参考にさせていただいたページ
[【初心者でもわかる】Ubuntuのインストール方法まとめ](https://eng-entrance.com/ubuntu-install)
[Ubuntuは初期状態ではrootが使えない（パスワード未設定）ようになっている](http://linux40.hateblo.jp/entry/20070903/1188797994)
[無線LANUSB子機　WI-U2-433DM　Linux（Ubuntu系)ドライバー入手](http://mnikoru.jugem.jp/?eid=1052)
[環境変えたらシェルスクリプトがエラーになった](https://qiita.com/tashua314/items/86c87ababa42064ce5ed)
[vimで方向キーがABCDを入力してしまう問題の解決](https://qiita.com/blue_camel/items/e2bd59a3b33acd5edfd0)
[LFS|クロの思考ノート](http://note.kurodigi.com/category/lfs/)
[ Linux From Scratch で自作ディストリビューションづくり-1](https://www.miraclelinux.com/tech-blog/r2zvo8)
[Linux 上の GRUB 2 がブートできなくなったときの対処方法](https://jp.linux.com/news/linuxcom-exclusive/418274-lco20140625)