訳あって、いまさらLMDE2をインストール

<!---
訳あって、いまさらLMDE2をインストール
-->

もう少しすれば、きっと LMDE "3" などというタイトルで発表されるのでしょうけど、 [LMDE2](_https://linuxmint.com/download_lmde.php "Download LMDE2 Betsy") "Linux Mint Debian Edition" を手許のノートPCにインストールし、カーネルビルドも含めて、少しずつ環境構築しています。

## 何でいまさらLMDE2？ ##
一言で表すと『カーネルバージョンが 3.x の安定版が使いたかった』という目的に合っているから。

著者の勤め先では、自社製品用の Linux デバイスドライバを販売しているのですが、これを Ubuntu (カーネルバージョン 4.x) 上で試したら正常にインストール出来ず。だったら開発元がテスト済みと言っている 3.x 環境ではどうなるのか、という検証をしたかったのです。

そういえば、パソコン上に『きちんと』Linuxをインストールして使うのは何年振りだろう、カーネル3.x になった後だよなぁ、という程度の経験値です。VM 環境上の Ubuntu Linux ベースでクロスコンパイル環境を作るのは何度かやってましたが、今は WSL(Windows Subsystem for Linux) に移行しました。VM 上にあった GUI 環境はディスクスペースを圧迫するので WSL 移行と同時に消し去ってます。cygwin も WSL 導入と共にお蔵入り、最新の PC には cygwin を入れてません。

当然、いろいろな設定変更でぶち当たった問題は、Web上で同様の話題を探して解決したものです。先行してチャレンジした方々には感謝ですが、自分の環境用に『全部』まとめた記事では無いので、備忘録としてひと通りの流れをまとめます。

## どうして Debian ? ##
これは正直、(筆者の)趣味です。

例えば長期サポート版(LTS) なら Ubuntu 14.04 LTS はカーネルバージョン 3.13 ですから、まだサポート期限内で上記の目的に合います。なので『どうしてDebian?』というツッコミに対しては『個人の趣味です』と答えるしか無いです。
そもそも GUI に cinnamon という、これも多数派では無さそうなインターフェイスを採用してますから、趣味丸出しですね。

## 趣味で良いの ? ##
趣味と実益を兼ねて、ということで勘弁して下さい。

今回使っている実験台(評価環境!!)は ThinkPad T430(メモリ16GB, HDD500GB) という会社所有PCです。ちょっと古くて重いのと、昨年から ThinkPad X1 が支給されたので(我儘を通して買ってもらった、だな)、出番が中途半端気味になっていたので、これ幸いと実験台に(評価環境!!)。

処理能力には不自由を感じてません。SSD 入れていた時は文句無しでした(持ち運びには重いけど)。諸事情で今は HDD に戻っていますが、ここに色々とボリューム感のあるツールを突っ込んでも、割と頑張ってくれるだろうという期待はあります。さらに、Express Card I/F 経由で PCI Express が使えるというのが、今回の環境構築を検討する一番重要な引き金。冒頭の『勤め先』の『自社製品』というのは、PCI / PCI Express 等のネットワークカードで、これの Linux ドライバを手許でも使える、となった訳です。

## では、作業開始 ##
という訳で、『LMDE2をノートPCに導入して環境構築した際のまとめ』です。
<br>後述しますが、Windows10 とのデュアルブートにするので、
* Windows10 
* LMDE2

のインストール用メディアを事前に作っておきます。また、Windows10 は ISO イメージも別に用意しておきます。というか、事前にそれぞれの ISO イメージをダウンロードした後、Windows10 環境で ISO イメージ -> メディア作成を行いました。
※今回は DVDメディアで OS インストールしてます。また、Windows10 の ISO イメージは KVM 経由で稼働させるOSのインストール用として USB メモリに一時保管しています。

### Windows10 とのデュアルブート ###
Windows10 のインストールを最初に行います。

※MBR 時代の名残りで、Windows OS を先にインストールする癖から抜けていません。もしかしたら現行の OS + UEFI はインストール手順は関係無いのかな。誰か御教示頂けると嬉しいです。

パーティション構造を検討する際に、Windows10 の領域は小さめにして、出来るだけ大きな領域を LMDE2 が使えるようにしました。
というのも、Windows10領域にインストールするアプリケーションは『Windows環境でないと"絶対に"動作しないもの』に限りたいからです。通常のオフィスアプリケーションなどは LMDE2/KVM - Windows10 上にインストールする予定です。KVM からの Windows10 は、少し実験的な要素もあるのですが、これはまた別の機会に。

という訳で、500GBのうち64GBをWindows10、1GBを未使用とし、残り400GBを LMDE2用として確保(この時はこの領域も空き)しました。
※ Windows10 パーティションの次のパーティションを Windows10はアップデート時に使う、という記述を見付けたので、1GBの空き領域を確保しています。先頭パーティションは Windows10 インストール時に自動的に確保されるので、構成は以下になりました。尚、各パーティションの容量は Linux 上の fdisk で表示されたものを転記してます。

| パーティション | 目的              | 容量 | タイプ |
|:-----------------:|:----|:--:|:--------------- |
| 1 | システム予約済み | 549MB | NTFS |
| 2 | Windows10          | 62GB | NTFS |
| 3 | Windowsアップデート対策(空き) | 1GB | 未フォーマット |
| 4 | LMDE2              | 402GB | ext4 |


### LMDE2 のインストール ###
LMDE2メディアから起動した後、ディスプレイに表示されたインストール用のCD/DVDアイコンをクリックすれば良い。

気を付けるのはインストール先のパーティション指定とタイムゾーン位だと思います。また、ここではWindows10パーティションをLMDE2から見える(マウントする)設定は特に行っていませんが、これは必要になった時に改めて行います。

### インストール後、最初にやったこと ###

```
~$ LANG=C xdg-user-dirs-gtk-update
```

home ディレクトリの日本語フォルダ名を英語にrenameしておきます。
ダイアログボックスにある『Don't ask me this again』にチェックを忘れずに(元に戻ってしまうのでしょう)。念の為に再起動して端末から home ディレクトリを確認。
※ GUI環境だけで操作するのなら日本語フォルダ名で問題無いのでしょうけど、Linux 系使う時は、端末からのアクセスが相変わらず多いので、フォルダ名を指定する際に日本語入力をいちいち使いたくない、という理由です。

```
~$ sudo apt update
~$ sudo apt upgrade -y
~$ sudo apt dist-upgrade -y
```
これらはおなじみ。Linuxインストール直後に行うパッケージバージョンの取得と最新版のインストール。
※cinnamon において、3行目を忘れて再起動してしまうと "cinnamon settings daemon" のエラー -> GUIログインが出来なくなる可能性大。その時は慌てずにCTRL-ALT-F1キーでコンソールモードに入って `sudo apt dist-upgrade -y` を行うと治ると思います。

この後、好きなツールのインストールとか、デスクトップ画面を変更するとか、色々とやりたくなるのですが、今回は次項からの作業が重要かつ危険なので、ここはぐっと抑えて次に進みます。

### カーネル再構築の準備 ###

```
~$ sudo apt install -y ncurses-dev device-tree-compiler bc
```

カーネルのビルド作業に必要最小限のアプリケーションをインストールします。make とか gcc もインストールする例を拝見しましたが、今回使った環境は上記だけで作業可能でした。

さて、LMDE2で導入したカーネルバージョン(3.16.0.5)と同じバージョンのRTパッチは、残念ながら提供されていませんでした。そこで、このカーネルバージョンのソースコードからのビルドはスキップして、V3.x の RTパッチと同じソースコードをダウンロードすることにしました。結果としてカーネルバージョンをアップデートしました(V3.16.0.5 -> 3.18.91)。

[kernel.org](_https://www.kernel.org/ "kernel.org") からソースコードパッケージと RTパッチをダウンロードします。

```
~$ wget https://cdn.kernel.org/pub/linux/kernel/v3.x/linux-3.18.91.tar.gz
~$ wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/3.18/patch-3.18.91-rt97-rt98-rc1.patch.gz
```
### カーネルソースコードの展開とRTパッチの導入 ###

```
/usr/src $ sudo tar xfz 'カーネルソースコードの tar.gzファイルを指定'
/usr/src $ sudo ln -s ./linux-3.18.91 linux
/usr/src $ cd ./linux
```
ビルドを行うパッケージに対して linux というシンボリックリンクを作っておき、以降はシンボリックリンク先での作業になります。

次に RTパッチを導入します。ここでは省略していますが、上記ソースをビルドして(普通に)動作するかどうか、事前に確かめておくのも良いと思います。RTパッチ導入でどの程度リアルタイム性が改善されるのか等、データ取っておくのも良いし。その場合は次項のカーネルのビルドとインストールを先に行った後、再起動を行います。

```
/usr/src/linux $ zcat 'パッチファイルを指定' | sudo patch -p1
```
### カーネルのビルド ###

```
/usr/src $ sudo make oldconfig
```
カーネルビルドに必要な各種パラメータ値を事前に取得します。ここではカーネルバージョンが異なるため、新しい設定項目について色々と質問されますが、手っ取り早く全てEnter(デフォルト値)としても良いかも知れません。

```
/usr/src $ sudo make menuconfig
```

ここでメニュー形式の設定を呼び出しているのは、各設定項目の目視という意味もあります。前項の `make oldconfig` の時にすっ飛ばした設定をやり直す、という理由も含まれています(えーそーです設定し忘れた項目を直しましたよ)。

```
/usr/src $ sudo make -j4
/usr/src $ sudo make modules -j4
```

マルチプロセッサ構成なので末尾に同時処理数を設定していますが、約45分掛かりました。HDD アクセスタイムが遅いため、と割り切り。
上述した ThinkPad X1 で全く同じLinux環境を VM 環境下で構築・ビルドした時は30分でした。最新の内部接続SSDは最強ですね。


```
/usr/src $ sudo make modules_install
/usr/src $ sudo make install
/usr/src $ sudo reboot
```
ビルド済みモジュールとカーネルをインストールした後、再起動します。
インストールするバージョンが違うので、カーネルファイルのファイル名が違うことや、``make install `` の時に grub の設定追加が実行されているのは、事前に確認済みです。なので、上記は連続して再起動まで行っているように見えますが、本来は各種ファイル名の競合や grub 設定を念の為に見直すという注意も、状況によっては大事だと思います。


再起動したら uname コマンドでバージョンチェック。

```
~$ uname -a
Linux マシン名 3.18.91-rt98 #1 SMP PREEMPT RT 曜日とビルド日時 x86_64 GNU/Linux
~$
```
カーネルバージョンがビルドしたものになっていること、RT パッチが導入されていること(RTの文字が追加されている)など、ビルド日時が合っていることと併せて確認しておきます。上記は日本語で書いた以外は実際に表示されたものを書き写してます。


## まとめ ##
まだまだ作業途中なのですが、最低限の導入作業は終了したので、情報のまとめとして今回の記事としました。
ちなみに、今後行う作業は以下を考えてます。

* 日本語入力の設定
* Windows 環境とのネットワーク接続(Samba)
* KVM の導入
* Exchange Server との接続とメールクライアントの設定
* エディタ・開発支援環境の導入
* など、など。

これらは、LMDE2 だけでは業務上支障があり、少なからずWindowsアプリの力を借りる必要があること、そうは言っても LMDE2 の中で仕事が済むに越したことは無いという、半分は『希望』も混在してます。