Arch Linux Windos Dualboot


### 概要
WindowsとLinux(Ubuntu)のデュアルブートでThinkPadE470を運用していたが、Ubuntuが最近重い感じる場面があり、またSPARKを用いた環境を研究で使うため構築していたが不要になったため心機一転ArchLinuxとi3wmを用いた環境を構築しようと考えた。




### 事前準備
**今回自身の環境(実機インストールの際)で成功した物を記す。**

- BIOSでセキュアーブートをOFFにする
- Windows10の高速スタートアップをOFFにする
- (arch用の)パーティションをWindows10のパーティションツールで作る
- インストールメディア(USB)の作成

### 環境の確認
BIOSからboot順位をいじりUSB(インストールメディア)を最上位にする

PCの環境がBIOSかUEFIかパーティションテーブルがMBRかGPTかを確かめる

##### **BIOS or UEFI**
"/sys/firmware/efi"が存在するか調べる(存在したらUEFI)

##### **MBR or GPT**
```bash
$ parted /dev/sdx print
```
で確認できる。(sdxのxは適宜自身で読み替えてほしい(一般的にはsda))

**自身の環境はUEFIとGPTだった!!**

### 言語の選択

##### **キーボードレイアウトの変更**
```bash
$ loadkeys jp106
```
##### **ロケールの変更**
```bash
$ nano /etc/locale.gen
```
"en_US.UTF-8 UTF-8"と"ja_JP.UTF-8 UTF-8"のコメントから外す

```bash
$ locale-gen
$ export LANG=en_US.UTF-8
```
arch wikiだと"ja_JP"だが、文字化けするため、一通り終わるまでは"en_US"にしておく

### **インターネットの接続(無線)**
有線だと何もせずにつながるらしい
無線の場合の接続方法を記述する(iwd使用)

```bash

$ iwctl

##### ここから下はiwdシェル
# デバイス(インターフェイス)の確認
$ device list

# wlan0が出るはず(自分は出なくて最初からインストールやり直した)

# ネットワークのスキャン
$ station wlan0 scan

# ネットワーク一覧
$ station wlan0 get-networks

# SSIDを指定し、ネットワーク接続
$ station wlan0 connect <SSID>

# パスフレーズの入力し接続

# iwdを抜ける
$ exit
#### ここまでiwdシェル
```

インターネットに接続しているかを調べるには以下のどちらかで確認できる

```
# ping -c 3 www.google.com
```
```
# ping -c 3 8.8.8.8
```

### **時計を合わせる**
NTPサーバとの同期

```bash
$ timedatectl set-ntp true
```

### **ドライブの準備**
**ここが最重要**
##### **デバイスの確認**
以下のコマンドでデバイス(パーテション)をすべて確認する

```bash
$ lsblk
```
インストール可能なデバイスは以下のコマンドで確認できる

```bash
$ lsblk | grep -v "rom\|loop\|airroot"
```

上述したようにsdxという表現を使うが、適宜自分で置き換えるように!!
また、目指すのはデュアルブートのため、パーティションは複数あるが、windows10のパーティションとリカバリー領域などのパーティションは触らないように(下手に触るとwindowsデータが消えたり、回復ができなくなる)

##### **新しいパーティションテーブルの作成**
パーティションは下記のコマンドで作成した(グラフィッカルな感じで使いやすい)

```bash
$ cfdisk /dev/sdx
```
必要なパーティションは下記の4つ

- /boot
- /
- swap
- /home

ただし、今回windows10によってEFIブートパーティションが存在するため、下記の3つのみパーティションを作る。(空いているパーティションはFree Spaceって表示されている)

- /:20G
- swap:8G
- /home:180G(Free Spaceの残り)

##### **ファイルシステムの作成**
以下のコマンドで正しくパーティションが用意できたか確認する

```bash
$ lsblk /sda/sdx
```
/(自分だとsda5)と/home(自分だとsda7)のファイルシステムを作成する。よく使われているext4を使用した

```bash
$ mkfs.ext4 /dev/sdxY
##### 自分だと下記のコマンド
$ mkfs.ext4 /dev/sda5
$ mkfs.ext4 /dev/sda7 
```
##### **swapの有効化**
swapパーティションの有効化

```bash
$ mkswap /dev/sdxY
$ swapon /dev/sdxY
```

##### **パーティションのマウント**
まず最初に/をマウントし、次に/bootと/homeをマウントする。/bootに関してはすでに存在しているEFIブートパーティションを用いる。

```bash
$ mount /dev/sdxR /mnt
$ mkdir -p /mnt/boot/efi
$ mount /dev/sdxB /mnt/boot/efi #今回作成したパーティションでなく以前からあるはず
$ mkdir -p /mnt/home
$ mount /dev/sdxH /mnt/home
```

### **インストール**
##### **ミラーの選択**
今回は日本のミラーが最上位に存在したため変更しなかった。
もし変更するなら下記のコードで

```bash
$ nano /etc/pacman.d/mirrorlist
```

##### **インストール**

```bash
$ pacstrap /mnt base base-devel linux linux-firmware
```
多分、少し時間かかる

##### **fstab作成**
fstabを知らなかったので軽く調べたら、マウントに関することを記述してあるファイルらしい。

```
$ genfstab -U /mnt >> /mnt/etc/fstab
```


### **システム内の諸設定**
##### **chrootでシステムに入る**
```bash
$ arch-chroot /mnt /bin/bash
```
多分、ここからキーボードがusに変わっていると思う
一時的だけど下記のコマンドを打てばjpで使える

```bash
$ loadkeys jp106
```
いろいろ必要なものをインストールする

```bash
$ pacman -Syy
$ pacman -S nano iwd
```

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

```bash
$ nano /etc/locale.gen
```
"en_US.UTF-8 UTF-8"と"ja_JP.UTF-8 UTF-8"のコメントから外す

```bash
$ locale-gen
$ echo LANG=en_US.UTF-8 > /etc/locale.conf
$ export LANG=en_US.UTF-8
```

##### コンソールフォントとキーマップ

```bash
$ nano /etc/vconsole.conf

##### 以下/etc/vconsole.confに記入
KEYMAP=jp106
FONT=lat9w-16
```

##### **タイムゾーンの設定**
hwclockでハードウェアクロックも設定
現在、arch側の時計の時間がずれている(dualbootによるwindowsとarchの時間のとり方による違いだと考える)　
一応、windows側の時間がずれていないためこのまま進めた

```bash
$ ln -sf /usr/share/zoneinfo/Asia/Tokyo /eetc/localtime
$ hwclock --systohc --utc
```

##### **hostname**
psp3000というhostnameにした

```bash
$ echo psp3000 > /etc/hostname
$ nano /etc/hosts
##### 以下/etc/hostsに追加
127.0.0.1	localhost
::1		localhost
127.0.1.1	psp3000.localdomain	psp3000
```

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

```bash
$ passwd
```

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

```bash
$ pacman -S grub efibootmgr intel-ucode
$ grub-install --target=x86_64-efi --efi-directory=/boot/efi --boot-directory=/boot/efi/EFI --bootloader-id=grub --recheck --debug
$ grub-mkconfig -o /boot/efi/EFI/grub/grub.cfg
```

##### **chroot**を抜ける

```bash
$ exit
```

##### **アンマウントして再起動**

```bash
$ umount -R /mnt
$ reboot
```
再起動するとGRUBからArchを起動できる。**しかし、GRUBにwindowsが載っていない。**(後ろで設定するためこのまま進める)
Archに入ってrootでログイン

### **ネットワークの再設定**
この時点でネットワークに接続できていないので設定する必要がある
systemd-networkd+iwdを使う
まず、systemd-networkd関連のサービスを有効化・起動しておく

```bash
$ systemctl enable systemd-networkd
$ systemctl start systemd-networkd

$ systemctl enable systemd-resolved
$ systemctl start systemd-resolved

# /etc/resolv.confにシンボリックリンクを設定
$ mv /etc/resolv.conf /etc/resolv.conf.bak
$ ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
```
同様にiwdも有効化・起動しておく

```bash
$ systemctl enable iwd
$ systemctl start iwd

$ iwctl

##### ここからiwdシェル
device list

# wlan0が出るので、以下これで設定する

station wlan0 scan
station wlan0 get-networks
station wlan0 connect <SSID>
exit
##### ここまでiwdシェル
```
ここまでやるとip aでwlan0に設定されているが、まだpingは通らない

"/etc/systemd/networkd/25-wireless.network"を作成し、以下のように記述

```
[Match]
Name=wlan0
[Network]
DHCP=yes
```
systemd-networkd再起動でネットワーク接続完了

```bash
$ systemctl restart systemd-networkd
# 接続確認
$ ping -c 3 8.8.8.8
```

iwd-ArchWikiによると、起動時に接続失敗する話があるためサービスの起動順位を設定しておく。

```bash
$ mkdir /etc/systemd/system/iwd.service.d
$ touch /etc/systemd/system/iwd.service.d/override.conf
```
"/etc/systemd/system/iwd.service.d/override.conf"に以下のように記述

```
[Unit]
After=systemd-udevd.service systemd-networkd.service
```
再起動し、ログイン後に再度pingして、ネットワーク接続できているか確認。

### Windowsとのデュアルブート

```bash
$ pacman -S os-prober
$ grub-mkconfig -o /boot/efi/EFI/grub.cfg
```

再起動し、WindowsとArchが両方起動できることの確認