まえがき

皆さんArch Linuxをインストールしてますか?俺は最近しました。でも何かと面倒なんですよね。ディスクイメージISOのダウンロードは遅いし、ddの書き込みも時間かかるし、シリアルコンソールはクソほど使いづらいし。何よりウェブの記事からコピペができない!住めば都だけど、住むまでがちょっと面倒なんですよね(そういうところも可愛いんだけど)。

しかし、USBメディアを使わずにインストールできるとしたらどうでしょうか。

既存環境からarch-chrootする

chroot.png

こんな感じに。実はすでにArch Linuxが動いてる環境があればUSBメディアは要らないんですよね。使い慣れたターミナルとエディタで作業できて、コピペもできるならやる気出ませんか?ほとんど新しいSSDを買ってきてそこに引っ越しをするような人向けにはなってしまいますが、USBメディアを使わずインストールする手順を解説していこうと思います。できる横着は積極的にしていこうの精神でやっていきましょう。

ディスクのセットアップ

まず、インストールしたいディスクを取り付けてデバイス名を確認する。

~ $ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop0         7:0    0 27.9G  0 loop /var/lib/lxd/storage-pools/default
sda           8:0    0 59.6G  0 disk
├─sda1        8:1    0  100M  0 part
└─sda2        8:2    0 59.5G  0 part
sdb           8:16   0  5.5T  0 disk /mnt/6t
nvme0n1     259:0    0  1.9T  0 disk
├─nvme0n1p1 259:1    0  512M  0 part /boot
├─nvme0n1p2 259:2    0 31.5G  0 part [SWAP]
└─nvme0n1p3 259:3    0  1.8T  0 part /

今回は捨てる予定だった古い64GBのSSDにインストールしてみる。上記では /dev/sda が振られている。

gdiskを使ってディスクの初期化とパーティション切りを行う。

~ $ sudo gdisk /dev/sda
GPT fdisk (gdisk) version 1.0.7

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present


***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by
typing 'q' if you don't want to convert your MBR partitions
to GPT format!
***************************************************************


Command (? for help):

特殊な対話インターフェイスになっているが、?を打てば大体わかる上に使うコマンドも限られているので恐れることはない。

pで現在のレイアウトが確認できる。

Command (? for help): p
Disk /dev/sda: 125045424 sectors, 59.6 GiB
Model: C300-CTFDDAC064M
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 62BB587A-795A-4F49-8361-14E4DC462A1B
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 125045390
Partitions will be aligned on 2048-sector boundaries
Total free space is 4717 sectors (2.3 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          206847   100.0 MiB   0700  Microsoft basic data
   2          206848       125042687   59.5 GiB    0700  Microsoft basic data
Command (? for help):

ディスクの初期化

今回用意したディスクにはゴミが残っているので、その消し方もついでに示す。新品のディスクを使うばあいは読み飛ばしてほしい。

パーティションの削除にはdを使う。

Command (? for help): d
Partition number (1-2): 2

Command (? for help): d
Using 1

Command (? for help): p
Disk /dev/sda: 125045424 sectors, 59.6 GiB
Model: C300-CTFDDAC064M
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): A191A1C1-E1DD-4D4C-9226-DC1FE4BBAF19
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 125045390
Partitions will be aligned on 2048-sector boundaries
Total free space is 125045357 sectors (59.6 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name

Command (? for help):

この段階ではまだ実際にパーティションは消えてない。ここからqCtrl + Cなどで脱出すればディスクには何も起きないので焦らないでほしい(まだ引き返せるぞ!)。

パーティションの削除を実際にディスクに適用するにはwを使用する。実行する前に改めてバックアップの確認すること。

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sda.
The operation has completed successfully.

無事消し飛ばすことができた。

パーティション作成

目標とするパーティションレイアウトを以下に示す。

容量 フォーマット
/boot 512MB FAT32
SWAP領域 8GB swap
/ 残り全部 xfs

/bootはMBRではなくEFI対応にする。

swapは省略する人も多い(確かにメモリをたくさん積んだデスクトップでは必要性は薄いと思う)が、ノートPCではhibernateに使うので必須である。またサーバー用途でもある程度は確保しておきたい。今回は解説ということで8GBだけ確保する。

Linuxのルート領域のファイルシステムはxfsとする。別にext4、btrfsでも何でもいい。/homeは分けない。

/boot領域を作る

再度sudo gdisk /dev/sdaを実行し、nでパーティションを作る。

Command (? for help): n
Partition number (1-128, default 1): 1
First sector (34-125045390, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-125045390, default = 125045390) or {+-}size{KMGTP}: +512MB
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): L

最後にGUIDのコード入力を迫られるが、Lで教えてくれるらしいので確認してみる。

Enterを連打してページをめくると、

Type search string, or <Enter> to show all codes:
0700 Microsoft basic data                0701 Microsoft Storage Replica
0702 ArcaOS Type 1                       0c01 Microsoft reserved
2700 Windows RE                          3000 ONIE boot
3001 ONIE config                         3900 Plan 9

   ... 省略 ...

8200 Linux swap                          8300 Linux filesystem
8301 Linux reserved                      8302 Linux /home


   ... 省略 ...

ed01 Lenovo system partition             ef00 EFI system partition

   ... 省略 ...

fc00 VMWare kcore crash protection       fd00 Linux RAID
Hex code or GUID (L to show codes, Enter = 8300):ef00

のようにずらずらと出てくる。今回使うのは

種別 コード
/boot ef00 EFI system partition
swap 8200 Linux swap
/ 8300 Linux filesystem

の三つである。先頭はEFIにするのでef00と入力してEnterを押すと最初のパーティションが確定する。

swap領域を作る

再度nで2つ目のパーティションを切る。

Command (? for help): n
Partition number (2-128, default 2):
First sector (34-125045390, default = 1050624) or {+-}size{KMGTP}:
Last sector (1050624-125045390, default = 125045390) or {+-}size{KMGTP}: +8GB
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): 8200
Changed type of partition to 'Linux swap'

/領域を作る

同様にしてnで最後の/のパーティションを作る。

Command (? for help): n
Partition number (3-128, default 3):
First sector (34-125045390, default = 17827840) or {+-}size{KMGTP}:
Last sector (17827840-125045390, default = 125045390) or {+-}size{KMGTP}:
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'

最後は範囲が最終セクタまででありGUIDもLinuxファイルシステムだったので全部デフォルト値となり、何も入力せずEnter連打するだけで目的の設定となった。

確認して書き込み

iで詳細を確認してから、

Command (? for help): i
Partition number (1-3): 1
Partition GUID code: C12A7328-F81F-11D2-BA4B-00A0C93EC93B (EFI system partition)
Partition unique GUID: E6F203F6-56AD-4D8D-9146-D999C99553BC
First sector: 2048 (at 1024.0 KiB)
Last sector: 1050623 (at 513.0 MiB)
Partition size: 1048576 sectors (512.0 MiB)
Attribute flags: 0000000000000000
Partition name: 'EFI system partition'

Command (? for help): i
Partition number (1-3): 2
Partition GUID code: 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F (Linux swap)
Partition unique GUID: 3285F962-5EDB-4973-BA93-109048C10527
First sector: 1050624 (at 513.0 MiB)
Last sector: 17827839 (at 8.5 GiB)
Partition size: 16777216 sectors (8.0 GiB)
Attribute flags: 0000000000000000
Partition name: 'Linux swap'

Command (? for help): i
Partition number (1-3): 3
Partition GUID code: 0FC63DAF-8483-4772-8E79-3D69D8477DE4 (Linux filesystem)
Partition unique GUID: C9F0FD3C-E8B0-49D0-A901-FB70D5678913
First sector: 17827840 (at 8.5 GiB)
Last sector: 125045390 (at 59.6 GiB)
Partition size: 107217551 sectors (51.1 GiB)
Attribute flags: 0000000000000000
Partition name: 'Linux filesystem'

w で書き込む。

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sda.
The operation has completed successfully.

これでパーティションの作成が完了した。

各パーティションをフォーマットする

/bootをFAT32でフォーマット

既存環境から作業してるばあいは sudo pacman -S dosfstools してから、

~ $ sudo mkfs.fat -F 32 /dev/sda1
mkfs.fat 4.2 (2021-01-31)

でFAT32にする。

mkswapでスワップ領域として明示する

~ $ sudo mkswap /dev/sda2
Setting up swapspace version 1, size = 8 GiB (8589930496 bytes)
no label, UUID=c5cf7953-8c40-40b3-8402-f066ad380228

スワップ領域として使用開始するにはswaponコマンドを使うが、ここではまだ実行しないでおく)

/をxfsでフォーマット

sudo pacman -S xfsprogsしてから、

~ $ sudo mkfs.xfs -b size=4096 /dev/sda3
meta-data=/dev/sda3              isize=512    agcount=4, agsize=3350549 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=0
data     =                       bsize=4096   blocks=13402193, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=6544, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
Discarding blocks...Done.

でフォーマット。ブロックサイズは4kが良いらしいので-b size=4096を付けた。

Arch Linuxをインストールする

ディスクのマウント

/mnt/arch に新OSの/が乗るようにマウントする。/mnt直下はごちゃってることが多いので避けた。

  • /dev/sda3/mnt/arch
  • /dev/sda1/mnt/arch/boot

となればよい。必ず/から先にマウントすること。 今回の例の場合は、

~ $ sudo mkdir /mnt/arch
~ $ sudo mount /dev/sda3 /mnt/arch
~ $ sudo mkdir /mnt/arch/boot
~ $ sudo mount /dev/sda1 /mnt/arch/boot

という感じ。

Arch Linuxをインストールする。

sudo pacman -S arch-install-scriptsで初期化に必要なスクリプト群をインストールしてから、

$ sudo pacstrap /mnt/arch base linux linux-firmware

でインストールする。 このとき/boot(外から見たら/mnt/arch/boot)がマウントされた状態であること をちゃんと確認する。というのも、linuxをインストールするときにカーネルイメージを/bootに配置する都合、/bootがmountされていないと、このあとGRUBなどインストールしても肝心のカーネルをロードできず起動できなくなってしまう。

万が一/bootmountし忘れてpacstrapをしちゃったばあいは、sudo pacman -S linux/bootにカーネルの再配置できる。

arch-chrootで新しい環境に入って初期環境をセットアップする

最低限chroot下でやることは以下の二つだけだ。

  • rootユーザーのパスワードを設定
  • ネットワークにつなぐためのライブラリの用意
# passwd
# pacman -S networkmanager

だけすればいい。ログインできてインターネットに繋がるなら、後は新しく作った環境からどうとでもなるはずだ。

GRUBをインストールする

# pacman -S grub efibootmgr
# grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=arch_linux

arch_linux のところは好きに変えて良い。MBのUEFI画面から見えたりするので識別可能な文字列にしておくと分かりやすい。

grub-installが失敗する

この段階で既存環境がMBR(非EFI)環境だとgrub-installが失敗するので、インストールUSBメモリが必要になる。その場合はたった一回grub-installを打ち込むためだけにUSB用意→USBから起動→/マウント→/bootマウント→arch-chroot→……としないと行けないのでかなり面倒くさい(経験談)。

あとは、

# grub-mkconfig -o /boot/grub/grub.cfg

で設定ファイルを吐けば、Arch Linuxを起動できるディスクが完成しているはずだ。

fstabの生成

ブートするだけならfstabは不要であるが、パーティション切りから解説したので一応触れておく。fstabはどのパーティションをどこにマウントするかやswapをどれにするかなどを記載したものだ。このファイルの生成に使うgenfstabarch-install-scriptsに含まれるので、chrootせずに外から生成してみる。

まず、/dev/sda2がswapになるので、

~ $ sudo swapon /dev/sda2

でswapを有効化する。その後、

~ $ sudo genfstab -U /mnt/arch | sudo tee /mnt/arch/etc/fstab
# /dev/sda3
UUID=20c6afcb-9c78-4dbc-a53e-96812ca8dcc9       /               xfs             rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota   0 1

# /dev/sda1
UUID=4B91-FC1E          /boot           vfat            rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro       0 2

# /dev/nvme0n1p2
UUID=d49ee1d8-7d8b-4b3a-b468-ea8b6f58fac3       none            swap            defaults        0 0

# /dev/sda2
UUID=c5cf7953-8c40-40b3-8402-f066ad380228       none            swap            defaults        0 0

fstabに書き込む。これだと既存環境に由来する

# /dev/nvme0n1p2
UUID=d49ee1d8-7d8b-4b3a-b468-ea8b6f58fac3       none            swap            defaults        0 0

という記載が混じっているので、そういったものは手でその記載を削って、

# /dev/sda3
UUID=20c6afcb-9c78-4dbc-a53e-96812ca8dcc9       /               xfs             rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota   0 1

# /dev/sda1
UUID=4B91-FC1E          /boot           vfat            rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro       0 2

# /dev/sda2
UUID=c5cf7953-8c40-40b3-8402-f066ad380228       none            swap            defaults        0 0

というように清書しておく。

あとはもう横から作業すべき工程はないので、再起動をかけて目的のディスクから起動するだけだ。

OS側から再起動後に自動でBIOSに入る

別のディスクから起動したいのに、ぼんやりしてるとDeleteを押しそびれてBIOSに入れずまた元のディスクから起動してしまうことはないだろうか。こういうときはsudo s reboot --firmware-setupが役に立つ。再起動時に確実にBIOSに入れて便利だ。

最後に

USBメディアからやることと変わらなくね?という指摘は胸に仕舞っておいてください。