パン屑の轍

ボドゲとかプログラミングとかゲームとか

Macbook Air+ArchLinux+Btrfs+SingleBoot

  • Macbook Air 2012 Mid
  • MacbookにArchLinuxを入れる場合はファームウェアのアップデートなどを受け取るためにMacOSを残すのが一般的
  • 今回はストレージ容量が少ない(100GBちょっと)ので、MacOSを削除して、ArchLinuxだけにする
  • RootFSにbtrfsを使う

MacOSにインストールUSBを作成する

macOS の起動可能なインストーラを作成する方法 - Apple サポート

上の公式ページを見て、インストールUSBを作成する。

MacOSを削除する前にファームウェアに関係する設定は済ませてしまう必要がある。

起動音オフ
$ nvram SystemAudioVolume=%00
$ nvram SystemAudioVolume=%00

二回やるといいらしいので、上のコマンドでは二回実行している。

ArchLinuxを入れてから、ファームウェア設定を変えたい場合はMacインストールUSBを使用する。

ArchLinuxのインストールUSBを作成する。

Arch Linux JP Project - ダウンロード

上のArchLinux公式ページからisoイメージをダウンロードして、インストールUSBを作成する。 特に詰まる要素はないので割愛。

USBスティックをMacbookに挿して、Optionキーを押しながら起動すると起動ディスクを選択できるのでUSBスティックを選択して起動。

ArchLinuxをインストールする

パーティションファイルシステム

以下のようにパーティションファイルシステムを作成する。 パーティションMBRではなく、GPTにする必要がある。 パーティションを切るときはpartedかcgdiskを使う。

Device Size FS Type
/dev/sda1 512MB vfat (mkfs.vfat /dev/sda1)
/dev/sda2 <RAMの二倍> Linux swap (mkswap /dev/sda2 && swapon /dev/sda2)
/dev/sda3 残り全部 btrfs (mkfs.btrfs /dev/sda3)

この辺りは参考ページを見れば簡単。

btrfsを使っているのでここからが最初のハマりどころ。 btrfs subvolumeを作成して、適切なオプションでマウントする。

loadkeys jp106 #日本語キーボードの場合のみ
mount /dev/sda3 /mnt
btrfs subvolume create /mnt/@root 
btrfs subvolume create /mnt/@var
btrfs subvolume create /mnt/@snapshots
umount /mnt
mount -o noatime,compress=lzo,space_cache,subvol=@root /dev/sda3 /mnt
mount -o noatime,compress=lzo,space_cache,subvol=@var /dev/sda3 /mnt/var
mount -o noatime,compress=lzo,space_cache,subvol=@snapshots /dev/sda3 /mnt/.snapshots
mount /dev/sda1 /mnt/boot

Wifiの有効化

pacstrapというコマンドラインツールでArchLinuxのコアとなるパッケージをインストールするが、インターネット接続が必要なため、MacbookWifiを有効化する。

Wifiの有効化にはwpa_supplicantとwpa_cliを使う。

まずはwpa_supplicantの設定ファイルを以下のように作成する。

  • /etc/wpa_supplicant/wifi.conf (設定ファイルの名前は任意)
ctrl_interface=/run/wpa_supplicant
update_config=1

wpa_supplicantを起動してwpa_cliWifiプロファイルを作成。 dhcpdでIPアドレスを取得する。

wpa_supplicant -B -i <wifi device> -c /etc/wpa_supplicant/wifi.conf
wpa_cli
: 以下wpa_cli上のコマンド
scan
scan_results
add_network 0
set_network 0 ssid "<SSID>"
set_network 0 psk "<encrypted key>"
enable_network 0
: <C-c>でwpa_cliから抜ける
dhcpd <wifi device>

set_networkのダブルクォーテーションは必須。

RootFSの構築

pacstrapを使ってRFSを構築する。

pacstrap /mnt base base-devel btrfs-progs wpa_supplicant iw wireless_tools dialog vim
genfstab -U /mnt > /mnt/etc/fstab
arch-chroot /mnt

/etc/fstabの内容を書き換える。 subvolume(/var, /.snapshots)のエントリをコメントアウトする。 最終的には以下のような内容になる。

UUID=</dev/sda3のUUID>    /    btrfs    rw,noatime,compress=lzo,ssd,discard,space_cache,subvolid=<subvolid>,subvol=@root 0 0

UUID=</dev/sda1のUUID>    /boot  vfat <option デフォルトのまま使う>

各種設定

  • locale
echo en_US.UTF-8 UTF-8 >> /etc/locale.gen
echo ja_JP.UTF-8 UTF-8 >> /etc/locale.gen
locale-gen
  • 時刻設定
ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime 
hwclock --systohc --utc 
  • hostname
echo <your name> >> /etc/hostname
  • vconsole.conf
echo 'KEYMAP=jp106' >> /etc/vconsole.conf
  • network
systemctl enable systemd-networkd
systemctl enable systemd-resolved
systemctl enable dhcpcd.service
  • ユーザ追加・sudo設定
useradd -m -g users -G wheel -s /bin/bash <you> && passwd <you>
sudo pacman -S sudo

上記コマンド実行後、visudoを実行して%wheelの行をコメントアウトする。

  • initialramdisk

/etc/mkinitcpio.confを編集する。 HOOKSエントリにkeyboardをbtrfsを追加する。 編集後以下を実行して、initramdiskを作成。

mkinitcpio -p linux

BootLoaderの設定

grubをインストールする

pacman -S grub dosfstools efibootmgr
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=arch_grub --recheck --debug
grub-mkconfig -o /boot/grub/grub.cfg
mkdir /boot/EFI/boot
cp /boot/EFI/arch_grub/grubx64.efi  /boot/EFI/boot/bootx64.efi

これだけではFileSystemをマウントできないので以下を実行。

pacman -S refind-efi
cp /usr/share/refind/refind_x64.efi /boot/EFI/Boot/bootx64.efi
cp -r /usr/share/refind/drivers_x64/ /boot/EFI/Boot/

/boot/EFI/BOOT/refind.confを以下のように作成

scanfor manual
timeout 1 # -1 for immediate
menuentry "Blah" {
  loader vmlinuz-linux
  initrd initramfs-linux.img
  options "root=PARTUUID=<PARTUUID> rw rootflags=subvol=@root add_efi_memmap"
}

PARTUUIDはblkid /dev/sda3コマンドで確認できる。

exitしてrebootすれば起動する(はず)

参考