まえがき
皆さんArch Linuxをインストールしてますか?私は最近しました。でも何かと面倒なんですよね。ディスクイメージISOのダウンロードは遅いし、dd
の書き込みも時間かかるし、シリアルコンソールはクソほど使いづらいし。何よりウェブの記事からコピペができない!住めば都だけど、住むまでがちょっと面倒なんですよね(そういうところも可愛いんだけど)。
しかし、USBメディアを使わずにインストールできるとしたらどうでしょうか。
既存環境からarch-chrootする
こんな感じに。実はすでに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):
この段階ではまだ実際にパーティションは消えてない。ここからq
やCtrl + 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.
無事消し飛ばすことができた。
パーティション作成
目標とするパーティションレイアウトを以下に示す。
パーティション | 容量 | フォーマット | Hex code |
---|---|---|---|
/boot |
512MB | FAT32 | ef00 (EFI system partition) |
SWAP領域 | 8GB | swap | 8200 (Linux swap) |
/ |
残り全部 | xfs | 8300 (Linux filesystem) |
/boot
はMBRではなくEFIにする。
swapは省略する人も多い(確かにメモリをたくさん積んだデスクトップでは必要性は薄いと思う)が、ノートPCではhibernateで使うので、個人的には絶対あった方が良いと思う。サーバー用途でもある程度は確保しておきたい。今回は解説ということで8GBだけ確保する。
Linuxのルート領域のファイルシステムはxfs
とする。別にext4、btrfsでも何でもいい。/home
は分けない。
/boot
領域を作る
再度sudo gdisk /dev/sda
を実行し、n
でまずは/boot
用のパーティションを作る。
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):ef00
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.
これでパーティションの作成が完了した。
[!INFO] Hex codeについて 最後にGUIDのコード入力を迫られたとき、
L
と入力するといろいろ教えてくれる。Hex code or GUID (L to show codes, Enter = 8300): 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
のようにずらずらと出てくるので、万が一コードを知らなくてもタイプがしっかり決まってればここから探して入力すればよい(これだけ見て入力するのはなかなかハードルが高いが)。
各パーティションをフォーマットする
/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などインストールしても肝心のカーネルをロードできず起動できなくなってしまう。
万が一/boot
をmount
し忘れて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画面から見えたりするので識別可能な文字列にしておくと分かりやすい。
環境によっては /boot/EFI/boot/bootx64.efi
に置かないとブートローダーを見つけてくれないことがあるので、
# mkdir /boot/EFI/Boot/
# cp /boot/EFI/arch_linux/grubx64.efi /boot/EFI/Boot/bootx64.efi
というように /boot/EFI/Boot
(もしくは /boot/EFI/boot
)にも置くと良い。
[!WARNING] Hex codeについて
この段階で既存環境が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をどれにするかなどを記載したものだ。このファイルの生成に使うgenfstab
はarch-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
というように清書しておく。
あとはもう横から作業すべき工程はないので、再起動をかけて目的のディスクから起動するだけだ。
[!INFO] OS側から再起動後に自動でBIOSに入る 別のディスクから起動したいのに、ぼんやりしてるとDeleteを押しそびれてBIOSに入れずまた元のディスクから起動してしまうことはないだろうか。こういうときは
sudo s reboot --firmware-setup
が役に立つ。再起動時に確実にBIOSに入れて便利だ。
最後に
USBメディアからやることと変わらなくね?という指摘は胸に仕舞っておいてください。
次回、Arch Linux入れたらやることメモ | endaaman.meに続きます。