Hyper-V に Gentoo Linux を入れてみる

## 1. はじめに

Docker を導入するので，Hyper-V を有効にしたのですが，よくよく考えなくても Hyper-V をいじったことがなかったので，取り敢えず Linux を入れて遊んでみます．WSL で Ubuntu を入れたので，Arch Linux か Gentoo Linux を入れようと思っていたところに，Qiita に [Hyper-VにGentoo Linuxをinstallする](https://qiita.com/stkchp/items/c13abb4b43f3572ec094) が掲載されたので，Gentoo Linux をインストールすることにしました．いつもどおり，私の備忘録代わりのメモになります．

## 2. Hyper-V

コマンドプロンプトから `systeminfo` を実行して，Hyper-V の要件を満たすように BIOS(UEFI?) の
設定を変更します．`設定 → アプリ → (アプリと機能) → プログラムと機能 → Windows 機能の有効化または無効化` から `Hyper-V` に，今は必要ないですが，`Windows ハイパーバイザープラットフォーム` にチェックを付けて機能を有効にします．再起動が求められるので，支持に従います．

Google 先生に軽く聞いたところ，最近の Hyper-V は `既定のスイッチ` が作成されるので，仮想スイッチには，これを使います．仮想スイッチの外部，内部，プライベートなども暇をみて試してみたいです．

## 3. Gentoo Linux
基本的には，[Gentoo AMD64 Handbook](https://wiki.gentoo.org/wiki/Handbook:AMD64/ja) と [Hyper-V](https://wiki.gentoo.org/wiki/Hyper-V) のとおりに作業します．


前出の [Qiita の記事](https://qiita.com/stkchp/items/c13abb4b43f3572ec094) にあるとおり Ubuntu のインストールメディアを使います．[ここ](http://releases.ubuntu.com/18.04/ubuntu-18.04.1-desktop-amd64.iso) からダウンロードします．私は，WSL(Ubuntu) のターミナルで下記コマンドでダンロードしました．

```bash
$ cd ~/downloads/src （任意のディレクトリ）
$ curl -O http://releases.ubuntu.com/18.04/ubuntu-18.04.1-desktop-amd64.iso
$ sha256sum ubuntu-18.04.1-desktop-amd64.iso
```

`sha256sum` でハッシュ値を求め，(http://releases.ubuntu.com/18.04/SHA256SUMS) のチェックサムと比較します．

### 3.1 仮想マシンの作成

スタートメニューから `Hyper-V マネージャー` を起動します．`新規 → 仮想マシン` から `仮想マシン新規作成ウィザード` を起動して下記のように設定します（メモリやハードディスクの容量はお好みに）．

- 開始する前に
    → 次へ
- 名前と場所の指定
    → 名前: Gentoo Linux （なんでもかまいません）
    → 仮想マシンを別のマシンに格納するにチェック
    → 場所: C:\Users\xxxx\VM\ （フォルダを指定）
    → 次へ
- 世代の指定
    → 第 2 世代
    → 次へ
- メモリの割り当て
    → 起動メモリ: 512 GB, 動的メモリ使用にチェック（デフォルト）
    → 次へ
- ネットワークの構成
    → 接続: 既定のスイッチ
    → 次へ
- 仮想ハードディスクの接続
    仮想ハードディスクを作成する
    → サイズ: 32G
    → 次へ
    - インストールオプション
      → ブート CD/DVD-ROM からオペレーティングシステムをインストールするにチェック入れる
      → イメージファイル: ubuntu-18.04.1-desktop-amd64.iso
      → 次へ
- 要約
    → 完了

### 3.2 仮想マシンの設定

`Hyper-V マネージャー` 仮想マシン `Gentoo Linux` を選択すると，操作タブの下側に仮想マシン `Gentoo Linux` が表示されるので，設定のセキュリテイから `セキュアブートを有効にする` のチェックを外します．

### 3.3 インストール

操作タブの `Gentoo Linux` の `起動 → 接続` でコンソールが表示されます．しばらく待つと，XWindow(GUI) が 表示されるので，右クリックして `open terminal` を選択してターミナルを起動します．

#### 3.3.0 前準備
プロキシ環境の場合，プロキシの設定をします．

```bash
# export http_proxy=http://xxx.xxxx.xxxx.xxx:port
# export https_proxy=http://xxx.xxxx.xxxx.xxx:port
# export RSYNC_PROXY=xxx.xxxx.xxxx.xxx:port
```

#### 3.3.1 ディスクの設定
ハンドブックのとおりに下記のように設定します．

| パーティション | ファイルシステム | サイズ | 説明 |
| --- | --- | --- | ---|
| /dev/sda1 | (ブートローダ) | 2M | BIOSブートパーティション |
| /dev/sda2 | fat32 (UEFI使用) | 128M | ブート/EFIシステムパーティション |
| /dev/sda3 | (swap) | 512M  | スワップパーティション |
| /dev/sda4 | ext4 | 32G | ルートパーティション |

##### パーティションの作成

```bash
# lsblk （ディスクの確認 or fdisk -l）
# parted -a optimal /dev/sda
# mklabel gpt
# print
# rm N (N: パーティションが残っていれば削除)
# unit mib
# mkpart primary 1 3
# name 1 grub
# set 1 bios_grub on
# print
# mkpart primary 3 131
# name 2 boot
# mkpart primary 131 643
# name 3 swap
# mkpart primary 643 -1
# name 4 rootfs
# set 2 boot on
# quit
```

##### ファイルシステムの作成

```bash
# mkfs.vfat -F32 /dev/sda2
# mkfs.ext4 /dev/sda4
# mkswap /dev/sda3
# swapon /dev/sda3
```

##### マウント

```bash
# mkdir /mnt/gentoo
# mount /dev/sda4 /mnt/gentoo
# mkdir /mnt/gentoo/boot
# mount /dev/sda2 /mnt/gentoo/boot
```

#### 3.3.2 Stage3 のインストール

##### 日付の確認

```bash
# date
```

間違っていれば，修正します．

##### stage tarball のダウンロードと展開

残念ながら，`links` コマンドがないので，`firefox` で URL を確認して，`wget` で取得します．
firefox を立ち上げて，（プロキシの設定が必要なら行う） `https://www.gentoo.org/downloads/#other-arches` の Stage archives の `Stage3 (一番上)` の URL をコピーする．`stage3-amd64-yyyymmddT...Z.tar.xz` のようなファイル名になっていると思いますが，ハンドブック同様に `stage3-amd64-<release>.tar.xz` で表記します．

```bash
# cd /mnt/gentoo
# wget URL を貼り付け
# tar xpf stage3-amd64-<release>.tar.xz ==xattrs-include='*.*' ==numeric-owner
```

##### コンパイルオプションの設定

```bash
# vi /mnt/gentoo/etc/portage/make.conf
```

```make:make.conf
CFLAGS="-march=native -O2 -pipe"
CXXFLAGS="${CFLAGS}"
MAKEOPTS="-j2"
LINGUAS="en ja"
```

#### 3.3.3 ベースシステムのインストール

##### Gentoo ebuild リポジトリの設定

```bash
# mkdir /mnt/gentoo/etc/portage/repos.conf
# cp /mnt/gentoo/usr/share/portsge/config/repos.conf /mnt/gentoo/etc/portage/repos.conf/gentoo.conf
```

##### DNS 情報のコピー

```bash
# cp -L /etc/resolv.conf /mnt/gentoo/etc/
```

##### 必要なファイルシステムのマウント

```bash
# mount --types proc /proc /mnt/gentoo/proc
# mount --rbind /sys /mnt/gentoo/sys
# mount --make-rslave /mnt/gentoo/sys
# mount --rbind /dev /mnt/gentoo/dev
# mount --make-rslave /mnt/gentoo/dev

# test -L /dev/shm && rm /dev/shm && mkdir /dev/shm
# mount --types tmpfs --options nosuid,nodev,noexec shm /dev/shm
# chmod 1777 /dev/shm
```

##### 新しい環境に入る

```bash
# chroot /mnt/gentoo /bin/bash
# source /etc/profile
# export PS1="(chroot) $PS1"
```

Ubuntu のインストールメディアを使っているにで `export PS1="(chroot) $PS1"` でプロンプトの設定を変更しなくても `chroot` の環境と判別できますが，ハンドブックのとおりに指定しています．

##### ブートパーティションのマウント

```bash
# mkdir /boot
# mount /dev/sda2 /boot
```

`/dev/sda2` を再度マウントするのが分かりませんが，ハンドブックの支持に従います．

##### Portage の設定 & システムの更新

```bash
# emerge-webrsync
# emerge --sync
# eselect news list
# eselect news read
# eselect profile list
# emerge --ask --update --deep --newuse @world
# emerge --depclean
```

##### タイムゾーンの設定

```bash
# echo "Asia/Tokyo" > /etc/timezone
# emerge --config sys-libs/timezone-data
```

##### ロケールの設定

```bash
# nano -w /etc/locale.gen
# locale-gen
# eselect locale list
# eselect locale set 4
# less /etc/env.d/02locale
# env-update && source /etc/profile && export PS1="(chroot) $PS1" (環境のリロード)
```

```:locale.gen
en_US.UTF-8 UTF-8
ja_JP.UTF-8 UTF-8
```

#### 3.3.4 カーネルの構築

##### カーネルソースのインストール

amd64 ベースのシステムのカーネルは，[sys-kernel/gentoo-sources](https://packages.gentoo.org/packages/sys-kernel/gentoo-sources) パッケージを推奨してるようですが，利用できるバージョンの選択方法が `Gentoo Linux` 未経験者には敷居が高ったですw まさに一見さんお断りの雰囲気が漂っているように思いました．

`emerge --ask sys-kernel/gentoo-sources` でカーネルをインストールするのですが，この場合，`4.15.52` がインストールされます．最新の `4.17.11`(2018/08/03) をインストールするには，`emerge --ask sys-kernel/gentoo-sources:4.17.11` とする必要があります．ebuild が gentoo-sources-4.17.11.ebuild なので `emerge --ask sys-kernel/gentoo-sources-4.17.11` なんかにしたら怒られます．せめてどこかに明記して欲しかったです．カーネルの削除の項目でカーネルソースの保護の記述で気づきました．また，この方法は良くない (?) らしく `/etc/portage/package.accept_keywords/` で指定するのがお作法みたいです．まだ，よくわかっていません．

```bash
# echo "sys-kernel/gentoo-sources ~amd64" >> /etc/portage/package.accept_keywords/gentoo-sources
# emerge --ask sys-kernel/gentoo-sources
# ls -al /usr/src/linux
```

##### ハードウェア情報の取得 (lspci)

必要ないような気もしますが，ハンドブックに従います．

```bash
# emerge --ask sys-apps/pciutils
```

##### カーネルの設定

ここでも，Linux に疎いので少しハマりました．`make menuconfig` で `/` から `HYPERV` を検索して，`Selects (PARAVIRT)` や `Depends on (HYPERV)` の項目を `y` にしないと，設定項目が出てこないので，設定項目が出てこなければ確認します．

```bash
# cd /usr/src/linux
# make menuconfig
```

まず最初に，`Selects PARAVIRT` を有効にして，`Depends on: HYPERV` を有効にします．この 2 つを有効にすれば， `Hyper-V` の設定項目が表示されます．

```:PARAVIRT
Processor type and features
[*] Linux guest support
```

```:HYPERV
Device Drivers
 Microsoft Hyper-V guest support
  <*> Microsoft Hyper-V client drivers
  <*> Microsoft Hyper-V Utilities driver
  <*> Microsoft Hyper-V Balloon drivers
```

必要ない項目もあると思いますが，[Handbook](https://wiki.gentoo.org/wiki/Handbook:AMD64/ja) の設定と，[Hyper-V](https://wiki.gentoo.org/wiki/Hyper-V) の設定，前出の [Qiita の記事](https://qiita.com/stkchp/items/c13abb4b43f3572ec094) の設定を行います．

X Server を使う予定があれば，下記設定を追加します．

```bash
# nano -w /etc/portage/make.conf
```

```make:make.conf
VIDEO_CARDS="fbdev"
```

##### カーネルのコンパイルおよびインストール

````bash
# make && make modules_install
# make install
```

##### initramfsのビルド

今回はビルドしていませんが，必要なら行います．

```bash
# emerge --ask sys-kernel/genkernel
# genkernel --install initramfs
```

#### 3.3.5 システムの設定

##### fstab の設定

```bash
# nano -w /etc/fstab
```

```:fstab
/dev/sda2               /boot           vfat            noatime         0 1
/dev/sda3               none            swap            sw              0 0
/dev/sda4               /               ext4            noatime         0 1

/dev/cdrom              /mnt/cdrom      auto            noauto,user     0 0
```

##### ネットワークの設定

ホスト名を設定します．

```bash
# nano -w /etc/conf.d/hostname
```

```bash:hostname
hostname="hostname"
```

ドメイン名の設定が必要なら，`/etc/conf.d/net` に設定を追加します.

IPアドレスとルーティングの設定をします．ここでは，dhcp でアドレスを取得します．

```bash
# emerge --ask --noreplace net-misc/netifrc
# nano -w /etc/conf.d/net
```

```bash:net
config_eth0="dhcp"
```

##### ネットワークの自動起動

```bash
# cd /etc/init.d
# ln -s net.lo net.eth0
# rc-update add net.eth0 default
# nano -w /etc/hosts
```

```bash:hosts
127.0.0.1       hostname localhost
```

##### root パスワードの設定

```bash
# passwd
````

#### 3.3.6 ツールのインストール

##### システムロガーのインストール

```bash
# emerge --ask app-admin/metalog
# rc-update add metalog default
```

##### cron デーモンのインストール

```bash
# emerge --ask sys-process/cronie
# rc-update add cronie default
```
##### ファイルのインデックス作成ツールのインストール

```bash
# emerge --ask sys-apps/mlocate
```

##### sshd デーモンの起動

```bash
# rc-update add sshd default
```

##### ファイルシステムツールのインストール

```bash
# emerge --ask sys-fs/dosfstools
```

##### dhcp クライアントのインストール

```bash
# emerge --ask net-misc/dhcpcd
```

#### 3.3.7 ブートローダのインストール

##### ブートローダの設定

UEFI に GRUB(2) をインストールします．

```bash
# echo 'GRUB_PLATFOMS="efi-64"' >> /etc/portage/make.conf
# emerge --ask sys-boot:grub:2
# grub-install --target=x86_64-efi --efi-directory=/boot
# grub-mkconfig -o /boot/grub/grub.cfg
```

##### システムの再起動

再起動が終われば `Gentoo` が立ち上がっていると思います．

```bash
# exit
# cd
# umount -l /mnt/gentoo/dev{/shm,/pts,}
# umount -R /mnt/gentoo
# reboot
```

#### 3.3.8 インストール後の設定

ユーザの作成をします．

```bash
# useradd -m -G users,wheel,audio -s /bin/bash user
# passwd user
```

インストールに使用した不要なファイルを削除します．

```bash
# rm stage3-amd64-<release>.tar.xz
```

あとは、適当に環境を構築して遊んでみます．