Arch Linux インストール : Linux AI サーバー構築その①

はじめに

 私生活が忙しくて全然更新できねぇ……。 

 さてSDXLの登場から結構な時間が過ぎ、ckptやLORAの種類が充実したためSD1.5環境から移行することにしました。ただ私が使用しているGPUは最低限の性能しかないGeForce RTX 3060 12GBですので、素のままではSDXLは荷が重いと思われます。とはいえすぐに諦めてしまうのは自作er兼Linuxおじさんとして恥ずべき事です。あらゆる手段を用いてSDXLを軽量化・高速化し、RTX 3060でも軽快に動作するようにしましたのでその経緯を記録します。

 まず行ったのはOSの載せ換えです。StableDiffusionはWindows・Macでも一応動きますが、Linuxで動かす場合に比べて遅くなります。Windows版SDに関しては登場当初と比べると大分マシになりましたが、それでも限界があります。WSL -Windows Subsystem for Linux- に環境を構築して妥協するという手もありますが、どうせならネイティブLinux環境で雁首カリカリにチューンナップする方が今後のAIオナニーQoLが上昇します。誇り高き日本男児(ひのもとおのこ)として日々のチンポシコシコクオリティ向上のため手間を惜しまず全力を尽くすのは当然のことです。

 というわけでこれまでWindowsを載せて動かしていたAI兼用ゲーミングデスクトップPCを潰して、Arch Linux AIサーバーへと転生させます。環境構築後にSDXLで試作してみた画像が以下になります。

 記事の最後にアイキャッチに使ったスク水ロリ妊婦ちゃんがいるので見てってね。

システム構成

ハードウェア構成

 ハードウェアに関しても一応書いておきます。10年前に組んだHaswell機からケース・電源・ファンと一部SATA SSDを流用して、中身をほぼ最新に置き換えた自作PCです。組んだ時期は去年の2023年6月です。

  • CPU: AMD Ryzen 7 7700
  • Cooler: AMD Wraith Prism (Retail)
  • RAM: DDR5-5200 64GB CL42 / CFD W5U5200CS-32Gx2
  • GPU: Nvidia GeForce RTX 3060 12GB / MSI GeForce-RTX-3060-VENTUS-2X-12G-OC
  • SSD
    • NVMe: Samsung 980 PRO with Heatsink 1TB (2023)
    • SATA: Plextor PX-256M5Pro 256GB (2013)
    • SATA: KIOXIA EXCERIA SSD-CK960S/N 960GB (2020)
  • M/B: ASUS PRIME B650M-A-CSM
  • Power: 760W / Seasonic Xseries SS-760XP2 Active PFC F3 (2013)
  • Case: CORSAIR Obsidian Series 350D アクリルパネル無し (2013)

 メモリを多めに載せているのはRamdiskを有効活用するためです。後述しますがLinux標準の一時ファイルシステムtmpfsをRamdiskとしてマウントし、そこにStableDiffusion本体を置くことで動作の高速化とSSDへの書き込み回数低減を図ります。

システム設計

 Arch Linuxのインストール作業に移る前に、LinuxをAIサーバーとして最も効率良く使えるシステム設計について考えて定義しておきます。

  • CUIオンリー
    • 演算リソースを最大限活かすためGUIは一切使わない。Xorg/Waylandなどのデスクトップ環境は搭載せず物理的なディスプレイやキーボード等の入出力機器も一切繋がない。
    • CPU内蔵GPUやオンボードオーディオ、また使用しないUSBポートは全てBIOS/UEFIで無効化し、電力消費を最小化する。筐体には電源ケーブルとLANケーブルのみを繋ぎ、LAN内の他の端末からSSHで接続して運用する。StableDiffusionは–Listenオプションを付けて起動し、LAN内の他の端末からウェブブラウザ越しに操作する。
  • tmpfs/Ramdiskの活用
    • Linux標準の一時ファイルシステムtmpfsをRamdiskとして最大限活用する。StableDiffusion本体をRamdisk上に置き、パフォーマンスを最大化しつつSSDへのダメージを最小化する。
    • amdisk……というよりRAMは揮発メモリなので電源を切ると消えてしまうため、本来は起動のたび手作業でSSD→Ramdiskへコピーペースト、同じくシャットダウンのたび手作業でRamdisk→SSDへバックアップ作業を行わなければならないが面倒臭いので、これらを自動化するsystemdサービスを書く。具体的にはrsyncコマンドを使う。
  • Sambaサーバーとしての活用
    • AIの生成物は内蔵SATA SSDに出力/保存し、Sambaを使ってLAN内で共有する。
    • –Listenオプション付きStableDiffusionはウェブブラウザが使える端末ならOSを問わず操作できる。Sambaでの共有を併用することで、LANにさえ接続していればWindows/Mac/Linux/iOS/AndroidのどのOSを搭載した端末であってもAI生成作業ならびにその後の加工・修整作業を行えるようにする。
  • Nvidia CUDAの最適化
    • 初期状態のNvidia CUDAはGPGPUとして運用する際に非効率な点が複数ある。例えば――サスペンドに対応していない・初期状態の最大TDPではワットパフォーマンスが非常に悪い・AI生成のような作業過程においてドライバのロード/アンロードを繰り返す――など。これらを最適化し、AIサーバーとしてのワットパフォーマンスを最大化する。

 Arch Linuxのインストール後、上記4点についてそれぞれの要件を満足させるようにシステム実装作業を行います。

Arch Linux インストール作業

事前準備

インストールメディアの準備

 Arch LinuxのインストールはUSBライブ環境から実機上で行います。インストールメディアのisoイメージはお好きなミラーサーバーからダウンロードしてください。私はJAIST -北陸先端科学技術大学院大学- から貰ってきました。

 JAIST Arch Linuxの最新iso置き場: https://ftp.jaist.ac.jp/pub/Linux/ArchLinux/iso/latest/

 現時点での最新は6月1日版です。(archlinux-2024.06.01-x86_64.iso)
 Arch Linuxはローリングリリース方式を採用しており、バージョンという概念が存在しません。インストールメディアのisoイメージに付された日付は飽くまで”x月y日時点での最新版だよ”という意味でしかなく、よほど古くない限りどの日付のものでも別に構いません。
 ダウンロードが完了したらisoイメージの整合性をチェックサムで照合しましょう。ごくごく稀にですが、ミラーサーバーが乗っ取られてファイルが不正なものに改竄されていることがあります。実際の事例としては2016年2月にLinux Mintのisoイメージが改竄されていました。
“Beware of hacked ISOs if you downloaded Linux Mint on February 20th!”: https://blog.linuxmint.com/?p=2994
 httpサーバーではなくhttpsサーバーからダウンロードしたなら気にするほどの危険性はありませんが、用心に越したことはありません。Windows環境であれば7-Zipでのチェックサムが便利です。今回はSHA256で確認します。

https://ftp.jaist.ac.jp/pub/Linux/ArchLinux/iso/latest/sha256sums.txt

4cc7e1c9f4e97b384f0d8731f317b5995bde256fcc17160d32359cab923c5892  archlinux-2024.06.01-x86_64.iso
4cc7e1c9f4e97b384f0d8731f317b5995bde256fcc17160d32359cab923c5892  archlinux-x86_64.iso
34616c90f015caec8e32243f5b8fd785bd07f333ec042b7ee3c985f12856239c  archlinux-bootstrap-2024.06.01-x86_64.tar.zst
34616c90f015caec8e32243f5b8fd785bd07f333ec042b7ee3c985f12856239c  archlinux-bootstrap-x86_64.tar.zst

 ”4cc7e1c9f4e97b384f0d8731f317b5995bde256fcc17160d32359cab923c5892″が一致しているのでisoイメージに改竄がないのが確認できました。これで一安心。

 続けてisoイメージのUSBメモリへ実際に書き込んでブータブルメディアを作ります。方法はOSによって違います。Macについては知らねぇ、勝手にやれ。

Windowsの場合:

 Rufusを使うのが良いでしょう。公式あるいは窓の杜からダウンロードするかMicrosoft Storeから入手しましょう。Wingetでもいいよ。
 Rufus公式: https://rufus.ie/
 窓の杜: https://forest.watch.impress.co.jp/library/software/rufus/
 Microsoft Store: https://apps.microsoft.com/detail/9pc3h3v7q9ch
 Wingetを使う場合、Windows Terminal上のPowershellで↓

PS C:\Users\your_username> winget install Rufus.Rufus

 ダウンロードできたらRufusを実行して書き込みましょう。以下のようにisoイメージのパスとUSBメモリのドライブレターを指定して、後は”スタート”を押せばいいだけです。

Linuxの場合

 ddコマンドを使います。homeディレクトリ直下に置いた上記のarchlinux-2024.06.01-x86_64.isoを/dev/sdbのUSBメモリに書き込む場合

# dd if=/home/your_username/archlinux-2024.06.01-x86_64.iso of=/dev/sdb bs=4M conv=fsync oflag=direct status=progress

 コマンド実行前に対象のUSBメモリをマウントしていないのを確認しておきましょう。パーティション番号を付けてはいけません。USBメモリ本体のパスを指定してください。上記の例の場合、/dev/sdbを/dev/sdb1のように書いてはいけません。

 以上でインストールメディアの準備は完了です。実地のインストール作業に移ります。

UEFIの設定

 インストール作業はArch LinuxのUSBライブ環境を使って行いますが、USBライブ環境起動のためにまずはUEFIの設定を変えなければいけません。ついでにLinux AIサーバーとしての用途にUEFIを最適化します。以下に例として用いるUEFIの画像は飽くまで私のマザーボードのもので、他のマザーボードでは異なる可能性があります。UEFIのバージョンは2024年6月時点で最新のものです。
 一部画像の日付・時間が違うのはスクリーンショット撮り忘れのためです。えへ。

M/B: ASUS PRIME B650M-A-CSM
UEFI: PRIME B650M-A BIOS 2613

Boot タグ:

 Secure Boot: Windows UEFI→Other OS

 Launch CSM: Disabled
 UEFIオンリー運用なのでCSMは不要。無効化します。

Ai Tweaker タグ: 自動オーバークロック無効化 & Curve Optimizer で省電力化

 現行のデスクトップPC向けCPUはIntel製/AMD製のどちらも、初期設定でCPUクーラーの冷却性能が許す限りオーバークロックし続けるようになっています。一昔前であれば変態オーバークロッカーがシリコンの焼き切れる瀬戸際のスリルを味わうためにやっていたような火遊びを工場出荷状態でやっているわけです。我々一般ユーザーがこのような過剰かつ異常な性能競争に付き合う義理はないので、自動オーバークロック設定を無効化し消費電力を低減します。電気代も高くなってるし。

 Ai Overclock Tuner: Manual

 Memory Frequency: DDR5-5200MHz
 RAMの動作周波数をマニュアルで決め打ち。

 ASUS Performance Enhancement: Disabled
 自動オーバークロックを無効化。

 Core Performance Boost: Disabled
 自動オーバークロックを無効化。

 Prochot VRM Throttling: Disable

 Peak Current Control: Enable

 Medium Load Boostit: Disabled

 Precision Boost Override: Disabled
 自動オーバークロックを無効化。

 CPU Boost Clock Override : Enabled (Negative) 850
 CPUのクロック周波数上限を増減させる機能です。ポジティブ方向で設定すると上限が上がり、ネガティブ方向で設定すると上限が下がります。この個体=Ryzen 7 7700の初期上限は5.35GHzだったのですが850MHzを割り引いて、4.5GHzを上限とします。

 Platform Thermal Throttle Limit: Manual 80
 システムの動作温度に上限を設ける機能です。80℃を上限としました。

 Curve Optimizerを有効化: All Cores
 Curve OptimizerはCPUの電圧変動カーブを調整する機能です。クロック周波数に比例してCPUの駆動電圧は変動します。この電圧変動カーブを一律の幅で上下させ望み通りの特性でCPUを動作させるのがこの機能です。 
 一般的には下げる方向で調整します。電圧変動カーブを下げれば下げるほどCPUの発する熱が減り、より高いクロック周波数で動作させられるからです。本来はオーバークロック時の周波数ブーストをより高めるために使う機能ですが、今回は省電力化のために用います。前述の通り自動オーバークロック設定を無効化し、さらに”CPU Boost Clock Override”設定でブーストクロックを4.5GHzに制限した上で電圧変動カーブを下げれば、省電力化・低発熱化できます。
 コア一つずつ調整することも可能ですが面倒なので、”All Cores”として全コアをまとめて制御します。

 All Core Curve Optimizer Sign: Negative
 ポジティブ方向で設定すると電圧変動カーブを一律の幅で上げ、ネガティブ方向で設定すると一律の幅で下げます。

 All Core Curve Optimizer Magnitude: 20
 Curve Optimizerで設定できる変動幅は+30ポイントから-30ポイントです。下げ幅に関しては-20ポイントまでが安全圏の下限値で、それより下げるとOSやアプリケーションがクラッシュする危険性が高まってしまいます。CPUの個体差によって安全圏は変わりますから検証を重ねればより設定を詰められるかもしれませんが、面倒なので-20ポイントに留めておきます。

Advanced タグ: iGPUと使用しないオンボードデバイスを無効化

USB Configuration:

 Legacy USB Support: Disabled

 USB Single Port Control:
 キーボードやマウス、ブータブルメディアを繋ぐポート1番・2番以外のUSBポートを無効化。消費電力を低減する。

SATA:

 使用しないSATAポート3番・4番を無効化。

Onboard Devices Configuration:

 Native ASPM: Enabled
 ネイティブASPMを有効化。

 HD Audio Controller: Disabled
 オンボードオーディオを無効化。 

 When system is in working state: Stealth Mode
 オンボードLEDもすべて消灯。

 USB power delivery in Soft Off state (S5): Disabled
 USB PDを無効化。

 PCIE Link Speed:
 使用しないPCI Expressポートの世代をGEN 1にする。使用するポートも接続デバイスと世代を合わせる。

NB Configuration:

 Primary Video Device: PCIE video

 Integrated Graphics: Disabled
 iGPU(CPU内蔵GPU)を無効化。初期インストール時およびUEFIの設定変更が必要なときのみdGPU(グラフィックボード)に映像ケーブルを繋ぎ、それ以外の場合は映像ケーブルを抜いておくことでグラボをAI処理に専念させる。

AMD CBS:

 Global C-state Control: Enabled

 ECC: Disabled
 ECCとは商用サーバーなどで用いられるメモリのエラー訂正機能です。このPCに搭載したRAMは非ECCメモリなので(明示的に)無効化します。

 Core Performance Boost: Disabled
 AMDの自動オーバークロック設定です。無効化します。

NBIO Common Options/Audio Configuration:
 NB Azalia: Disabled
 オンボードオーディオのコントローラーを無効化。

 SMU Common Options:
 ECO Mode: Enable

省電力設定が機能しているか確認

 以上でBIOS/UEFIの設定は完了です。設定を保存して再起動し、目論見通り機能しているか確かめます。 

 上下の画像はUEFI起動直後のメイン画面を省電力設定の前後で比較したものです。アイドル状態でのCPUコア電圧が0.552V低下し、CPUコア温度が12℃下がっています。自動オーバークロック無効化とCurve Optimizerを-20ポイントで設定した効果が如実に表れています。

 確認出来たら電源を切ります。その後ブータブルメディアとキーボードを生きているUSBポートに指して電源を入れればArch Linuxのインストール用USBライブ環境が起動します。

Secure EraseでSSDをリフレッシュ

 Arch Linuxをインストールする前に内蔵SSDのメモリセルをSecure Eraseでリフレッシュしておきましょう。新品であれば不要な作業ですが、以前から使っていたSSDを再利用する場合はメモリセルを消去することで読み出し/書き込み速度が回復します。この項目の作業はArch LinuxのUSBライブ環境で行います。

SATA SSDに対して

 hdparmコマンドを使います。まずはSecure Eraseにドライブが対応しているかの情報を確認します。以下は今回使うPCのマザーボードに繋がっているPlextor PX-256M5Pro 256GB (2013)の事例です。

# hdparm -I /dev/sda

 ドライブの情報がかなり詳細に出てきますが、今回確認すべきなのは”Security”の項目です。

Security:
                supported
        not     enabled
        not     locked
                frozen
        not     expired: security count
                supported: enhanced erase
        6min for SECURITY ERASE UNIT. 6min for ENHANCED SECURITY ERASE UNIT.
Logical Unit WWN Device Identifier: 0000000000000000
        NAA             : 0
        IEEE OUI        : 000000
        Unique ID       : 000000000

 ”supported: enhanced erase”とあるのでこのSSDはSecure Eraseとその拡張版であるSecure Erase Enhancedに対応していることが分かります。どうせなのでSecure Erase Enhancedの方を実行します。ただしSecure Eraseコマンドを発行するためには上記パラメータのうち”frozen”を”not frozen” に、”not enabled”を”enabled”に変えなければなりません。
 frozen状態を解凍するのは簡単で、PCを一度サスペンドすれば良いだけです。

# systemctl suspend

 キーボードの適当なキーを押してサスペンドを解除すれば、解凍されて”not frozen”になっているはずです。

 ”not enabled”を”enabled”にするにはドライブに対してパスワードを設定し、セキュリティを有効化します。パスワードは一時的に使うものなので何でも構いません。今回は子どもマンコ=child-vaginaにしました。

# hdparm --user-master u --security-set-pass child-vagina /dev/sda

 以上の工程を経た後にhdparm -Iコマンドを再実行すると以下の状態になっているはずです。

Security:
                supported
                enabled
        not     locked
        not     frozen
        not     expired: security count
                supported: enhanced erase
        6min for SECURITY ERASE UNIT. 6min for ENHANCED SECURITY ERASE UNIT.
Logical Unit WWN Device Identifier: 0000000000000000
        NAA             : 0
        IEEE OUI        : 000000
        Unique ID       : 000000000

 これでSecure Eraseを実行する準備が整いました。次のコマンドを発行するとメモリセルが完全消去されます。CIAでもデータの復旧が難しくなるので注意してください。

# hdparm --user-master u --security-erase-enhanced child-vagina /dev/sda

 Secure Eraseが完了するとセキュリティが無効化され、パスワードが解除されているはずです。もう一度hdparm -Iコマンドを実行し以下の状態になっていたら成功です。

Security:
                supported
        not     enabled
        not     locked
        not     frozen
        not     expired: security count
                supported: enhanced erase
        6min for SECURITY ERASE UNIT. 6min for ENHANCED SECURITY ERASE UNIT.
Logical Unit WWN Device Identifier: 0000000000000000
        NAA             : 0
        IEEE OUI        : 000000
        Unique ID       : 000000000

 これで/dev/sdaに対するSecure Eraseが完了しました。後は搭載しているSATA SSD全てに対して同じ作業を繰り返します。

NVMe SSDに対して

 まずドライブのfrozen状態を解凍します。やり方はSATA SSDの場合と同じで、サスペンドすれば良いだけです。

# systemctl suspend

 次にドライブがSecure Eraseに対応しているか確認します。以下は今回使うPCのマザーボードに繋がっているSamsung 980 PRO with Heatsink 1TB (2023)の事例です。

# nvme id-ctrl /dev/nvme0 -H | grep -E 'Format |Crypto Erase|Sanitize'

  [1:1] : 0x1   Format NVM Supported
  [29:29] : 0   No-Deallocate After Sanitize bit in Sanitize command Supported
    [2:2] : 0   Overwrite Sanitize Operation Not Supported
    [1:1] : 0x1 Block Erase Sanitize Operation Supported
    [0:0] : 0x1 Crypto Erase Sanitize Operation Supported
  [3:3] : 0     Format NVM Broadcast NSID (FFFFFFFFh) Supported
  [2:2] : 0x1   Crypto Erase Supported as part of Secure Erase
  [1:1] : 0     Crypto Erase Applies to Single Namespace(s)
  [0:0] : 0x1   Format Applies to All Namespace(s)
  [3:3] : 0     Controller Copy Format 3h Not Supported
  [2:2] : 0     Controller Copy Format 2h Not Supported
  [1:1] : 0     Controller Copy Format 1h Not Supported
  [0:0] : 0     Controller Copy Format 0h Not Supported

 このドライブはnvme-formatコマンドとnvme-sanitizeコマンドによるSecure Eraseに対応しているようです。今回はformatコマンドの方を使うことにします。
 formatコマンドはSATA SSDの場合で使ったhdparmよりも使い方がシンプルで簡単です。が、Secure Eraseの実行の前に考えておかなければならない事項があります。NVMeドライブに特有の”名前空間/Namespace”という概念についてです。
 現在の状態でlsblkコマンドを実行してみると以下の状態になっています。

$ lsblk -o NAME,SIZE

NAME          SIZE
sda         238.5G
sdb         894.3G
nvme0n1     931.5G

 上記の/dev/nvme0n1が対象のNVMeドライブです。一見すると”nvme0″に続く”n1″というのがパーティション番号に見えますが、まだパーティションを作っていないので違います。この”n1″は名前空間/Namespaceという機能によるものです。
 NVMeは記憶領域を区切ってシステムに別のドライブとして認識させることができます。その分割機能が名前空間/Namespaceです。ファームウェアレイヤーでの分割になるので一般的に使われるパーティション分割よりも独立性が高く、よりハードウェアの根源に近い(いわゆる低レベルな)分割機能です。
 例えば今回使うSamsung 980 PRO with Heatsink 1TB (2023)にNamespace 2を追加し容量を等分した場合、以下のようになると思われます。面倒臭いので実際にやってみることはしないけど。

$ lsblk -o NAME,SIZE

NAME          SIZE
sda         238.5G
sdb         894.3G
nvme0n1     465.8G
nvme0n2     465.8G

 ”nvme0″とはコントローラーの認識番号を指しています。続く”n1″と”n2″が名前空間/Namespaceの番号になります。「同じコントローラーチップに繋がっている別のSSD」としてシステムに認識されるわけです。デバイスが対応していればS.M.A.R.Tの情報も名前空間/Namespaceごとに個別のものになるようです。Samsung 980 PROが対応しているかどうかは知らんけど。
 以上の名前空間/Namespaceについての考え方を意識しつつ、nvme-formatコマンドでSecure Eraseを実行します。

# nvme format /dev/nvme0 -n 1 -s 2

 上記のコマンドのオプション”-n 1″はNamespace 1のことを指しています。「コントローラーnvme0の管理する全領域を単一の名前空間/Namespace 1に宛がえ」という意味になります。その後に続く”-s 2″はSecure Eraseのオプションです。このオプションについてはman nvme-formatに以下のように書かれています。

$ man nvme-format

       -s <ses>, --ses=<ses>
           Secure Erase Settings: This field specifies whether a secure erase should be performed as part of the format
           and the type of the secure erase operation. The erase applies to all user data, regardless of location
           (e.g., within an exposed LBA, within a cache, within deallocated LBAs, etc). Defaults to 0.
           ┌───────┬──────────────────────────────────────────┐
           │ Value │ Definition                               │
           ├───────┼──────────────────────────────────────────┤
           │ 0     │ No secure erase operation requested      │
           ├───────┼──────────────────────────────────────────┤
           │ 1     │ User Data Erase: All user data shall be  │
           │       │ erased, contents of the user data after  │
           │       │ the erase is indeterminate (e.g., the    │
           │       │ user data may be zero filled, one        │
           │       │ filled, etc). The controller may perform │
           │       │ a cryptographic erase when a User Data   │
           │       │ Erase is requested if all user data is   │
           │       │ encrypted.                               │
           ├───────┼──────────────────────────────────────────┤
           │ 2     │ Cryptographic Erase: All user data shall │
           │       │ be erased cryptographically. This is     │
           │       │ accomplished by deleting the encryption  │
           │       │ key.                                     │
           ├───────┼──────────────────────────────────────────┤
           │ 3–7   │ Reserved                                 │
           └───────┴──────────────────────────────────────────┘

 Secure Eraseを実行するには-s 1 or 2を使います。-s 1はユーザーデータのみを消去し、消去後は0フィルか1フィルされます。-s 2は暗号化消去で、SATA SSDの項で行った # hdparm –user-master u –security-erase-enhanced コマンドに相当します。まず-s 2を発行してみてダメだったら-s 1を発行すれば良いでしょう。

 これでSecure EraseによるSSDのメモリセルリフレッシュ作業は完了です。

インストール実作業

 ここからの作業はArchWikiのインストールガイドに従って行います。

 ArchWiki EN: https://wiki.archlinux.org/title/Installation_guide
 ArchWiki JP: https://wiki.archlinux.jp/index.php/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89

ライブ環境の状態確認

 USBライブ環境が起動したらまず正常稼働しているか確認します。

UEFIモードで起動しているか
# ls /sys/firmware/efi/efivars

 何らかの情報が表示されればUEFIモードで正常に起動できています。ディレクトリが存在しない場合、BIOSモードで起動してしまっているのでUEFIの設定を見直しましょう。

インターネットに正常に接続されているか

 Arch LinuxのUSBライブ環境では、インターネット接続に必要なサービス類がデフォルトで稼働しています。有線LAN+DHCPという一般的な構成であればLANケーブルさえ繋がっていればインターネットに接続できるはずです。無線LANの場合は以下を参照のこと。

 ArchWiki iwctl:https://wiki.archlinux.jp/index.php/Iwd#iwctl

 適当なサーバーにpingを打ってインターネットに接続できているか最終確認します。

$ ping google.com

 返答があったら正常に接続できています。Ctrl+Cでpingコマンドを強制終了してください。

システムクロックは正確か

 Arch LinuxのUSBライブ環境では、システムクロックを同期するsystemd-timesyncdがデフォルトで稼働しています。正常に動いているか確認だけしておきます。

# timedatectl status
パーティションとファイルシステムの作成

 ドライブにパーティションを作成し、適切なファイルシステムでフォーマットしていきます。現状のドライブ構成は以下の通りです。

$ lsblk

NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    0 238.5G  0 disk
sdb           8:16   0 894.3G  0 disk
nvme0n1     259:0    0 931.5G  0 disk

 システムドライブをNVMe SSDに充ててOSをインストールします。残りのSATA SSDはデータストレージとして扱い、homeディレクトリ下にマウントします。最終的なパーティション構成が下記になるようにパーティションを切っていきます。

NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    0 238.5G  0 disk
└─sda1        8:1    0 238.5G  0 part /home/your_username/plextor
sdb           8:16   0 894.3G  0 disk
└─sdb1        8:17   0 894.3G  0 part /home/your_username/kioxia
nvme0n1     259:0    0 931.5G  0 disk
├─nvme0n1p1 259:1    0   512M  0 part /boot
└─nvme0n1p2 259:2    0   931G  0 part /
パーティショニング

 パーティショニングには対話型ツールのgdiskを使います。GPTディスクのパーティショニングに便利なヤツ。

 gdisk: https://wiki.archlinux.jp/index.php/GPT_fdisk
https://wiki.archlinux.org/title/GPT_fdisk

 まずはNVMe SSDにブートローダーを置くEFIシステムパーティションを作成します。容量は512MiBとしました。

# gdisk /dev/nvme0n1

GPT fdisk (gdisk) version 1.0.10

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

Creating new GPT entries in memory.

Command (? for help): n
Partition number (1-128, default 1):
First sector (34-1953525134, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-1953525134, default = 1953525134) or {+-}size{KMGTP}: +512M
Hex code or GUID (L to show codes, Enter = 8300): ef00
Changed type of partition to 'EFI system partition'

Command (? for help): w

 充分なシステムメモリがあるのでswapは使いません。残りの領域はrootディレクトリとして扱いますので、一般的なLinuxファイルシステムでパーティションを作成します。

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

Command (? for help): w

 これで/dev/nvme0n1のパーティショニングが完了しました。後は残りのSATA SSDに対しても同じ作業を繰り返します。SATA SSDは単一パーティションの純粋なデータストレージとして扱うのでコマンドもシンプルです。

# gdisk /dev/sda

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

Command (? for help): w
# gdisk /dev/sdb

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

Command (? for help): w
パーティションのフォーマット

 EFIシステムパーティションのみFAT32で、残りはLinux標準のext4でフォーマットします。

# mkfs.fat -F 32 /dev/nvme0n1p1
# mkfs.ext4 /dev/nvme0n1p2

# mkfs.ext4 /dev/sda1

# mkfs.ext4 /dev/sdb1
ファイルシステムをマウント

 rootパーティションを適切なディレクトリにマウントします。

# mount /dev/nvme0n1p2 /mnt

 続けてEFIシステムパーティションを置くディレクトリを作成し、マウントします。

# mkdir /mnt/boot

# mount /dev/nvme0n1p1 /mnt/boot
コアパッケージをインストール
reflectorで最適なミラーサーバーを選択

 システムのコアとなるLinuxカーネルとbaseパッケージ、加えて代表的なファームウェアを公式リポジトリからダウンロードしインストールします。が、その前にreflectorの設定を見直しておきます。
 reflectorとは通信速度や通信プロトコル、国籍などに応じて公式リポジトリのミラーサーバーをソートしてくれるPythonスクリプトです。ソートされたサーバーリストはpacmanのミラーリスト /etc/pacman.d/mirrorlist に書き込まれるようにします。パッケージのインストール・アップグレード時の通信速度が著しく改善するので非常に便利なスクリプトです。
 以下のコマンドが今回のインストール時に使用したものです。

# reflector --protocol https --country JP,TW,KR --sort rate --latest 10 --save /etc/pacman.d/mirrorlist

 ”httpsプロトコルでSSL通信をしていて所在地が日本・台湾・韓国のいずれかのサーバーを、ダウンロードレートが速い順にソートして更新が新しい順に10個、pacmanのミラーリストに書き込め”という内容のオプションを付けたreflectorコマンドです。このコマンドで得られたミラーリストが以下の内容になります。

################################################################################
################# Arch Linux mirrorlist generated by Reflector #################
################################################################################

# When:       2024-06-13 23:38:55 UTC
# From:       https://archlinux.org/mirrors/status/json/
# Retrieved:  2024-06-13 23:38:35 UTC
# Last Check: 2024-06-13 23:34:44 UTC

Server = https://mirrors.cat.net/archlinux/$repo/os/$arch
Server = https://mirror.morgan.kr/archlinux/$repo/os/$arch
Server = https://mirror.twds.com.tw/archlinux/$repo/os/$arch
Server = https://ftp.lanet.kr/pub/archlinux/$repo/os/$arch
Server = https://archlinux.cs.nycu.edu.tw/$repo/os/$arch
Server = https://mirror.archlinux.tw/ArchLinux/$repo/os/$arch
Server = https://www.miraa.jp/archlinux/$repo/os/$arch
Server = https://free.nchc.org.tw/arch/$repo/os/$arch
Server = https://ftp.jaist.ac.jp/pub/Linux/ArchLinux/$repo/os/$arch

 reflectorに関してはシステムインストール後に定期的に自動実行されるように設定しますが、とりあえず今は後回し。

pacstrapコマンド実行

 pacstrapコマンドでコアパッケージをダウンロードしインストールします。

# pacstrap -K /mnt base linux linux-firmware

 コアパッケージ以外にもテキストエディタやその他の最低限必要なパッケージがありますが、それらはchrootでシステム内に入ってからpacmanコマンドでインストールします。

システムの初期設定
fstabを生成

 説明不要かもしれませんが、fstabは起動時にどのドライブをどのディレクトリにマウントするか設定するファイルです。最低限必要な記述とともに生成しておきます。

# genfstab -U /mnt >> /mnt/etc/fstab
chroot環境に移行

 インストールしたシステムにchrootで入ります。

# arch-chroot /mnt

 ここから先の初期設定はchroot環境下で行います。

タイムゾーンの設定

 タイムゾーンを設定します。アメリカのように東西で時差がある国では考慮が必要ですが、日本には地域による時差が存在せず全地域でUTC+9なので特に考慮は要りません。Region/CityはAsia/Tokyoとします。

# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

 続けてハードウェアクロックを生成します。

# hwclock --systohc
最低限必要なパッケージをインストール

 これ以降の作業をするのにテキストエディタが必須なのでインストールします。またその他の最低限必要なパッケージをインストールしておきます。

# pacman -S vim man-db man-pages texinfo

 有線LANのみで稼働させるなら必要ありませんが、Wifiのみで稼働させる場合は無線制御に関するパッケージをインストールしておいてください。さもないとライブUSB環境を抜けて再起動した後に何もできなくなります。ただしそうなってしまったとしてももう1度ラ イブUSB環境を起動しなおせば大丈夫です。chrootして足りなかったパッケージをインストールしましょう。

ロケール

 ロケールを設定します。JPロケールとUSロケールを生成しておいて言語・時刻設定はJPロケールにします。文字コードはもちろんUTF-8で。まずはlocale.genのen_US.UTF-8 UTF-8とja_JP.UTF-8 UTF-8をアンコメントします。

# vim /etc/locale.gen

--前略--

#en_SG.UTF-8 UTF-8
#en_SG ISO-8859-1
en_US.UTF-8 UTF-8
#en_US ISO-8859-1
#en_ZA.UTF-8 UTF-8

--中略--

#iu_CA UTF-8
#ja_JP.EUC-JP EUC-JP
ja_JP.UTF-8 UTF-8
#ka_GE.UTF-8 UTF-8
#ka_GE GEORGIAN-PS

--後略--

 JPロケールとUSロケールを生成します。

# locale-gen

Generating locales...
  en_US.UTF-8... done
  ja_JP.UTF-8... done
Generation complete.

 LANG環境変数を設定し、システム全体の言語・時刻などのロケールを設定します。

# vim /etc/locale.conf

LANG=ja_JP.UTF-8
ホストネームを名付ける

 ホストネームを設定し、サーバーにお名前を付けてあげます。好きな名前で構いませんが長い名前はやめておきましょう。例として子どもマンコ=child.vaginaにしておきます。ちなみに実際に名付けたホストネームは違いますよ、私はセキュリティ意識の高いロリコンなので。

# vim /etc/hostname

child.vagina

 これでこのサーバーのお名前は子どもマンコサーバーになりました。えっち。

rootパスワード

 スーパーユーザーのパスワードを設定します。できるだけ長く、かつ覚えやすくて非常識なパスワードが理想的です。例えば「女子小学生ども孕ませたいよぉ……」= I wanna impregnate elementary schoolgirls! などとしておくと良いでしょう。もちろん実際のパスは違います。

# passwd

(example)
i_wanna_impregnate_elementary_schoolgirls!
ブートローダー

 使用するブートローダーを選択し作成します。このサーバーはGPTディスクかつUEFI環境のみのさっぱりとしたシステム環境なので、最も汎用的かつ余計なパッケージが必要ないsystemd-bootを選びました。
 まずはEFIシステムパーティションにsystemd-bootをインストールします。

# bootctl install

 ブートローダーの設定を書きます。注意点として、ローダーの設定ファイルはインデントのTabを受け付けないので必ずSpaceを使うようにしてください。

# vim /boot/loader/loader.conf

default arch.conf
timeout 4
console-mode keep
editor no

 続けてローダーで指定したarch.confの中身を書きますが、いくつか事前準備が必要です。

 まずCPUのマイクロコードに関する作業をしましょう。マイクロコードとはCPUの命令セット更新やバグ修正を行うもので、OSが起動する前に動作する早期ローダーによって読み込まれなければなりません。マイクロコードのパッケージをインストールします。

# pacman -S amd-ucode

 前述の通りこのマシンに搭載されているCPUはAMD Ryzen 7 7700ですのでAMDのマイクロコードをインストールしましたが、Intel CPUを搭載している場合はintel-ucodeパッケージの方をインストールしてください。

 次にrootディレクトリのPARTUUIDを確認します。

# blkid

/dev/nvme0n1p1: UUID="5F52-44F1" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="EFI system partition" PARTUUID="1c3f69ef-2bb8-4eae-b25c-1b5b18797d9b"
/dev/nvme0n1p2: UUID="72b49c91-509c-4fe1-9a6b-dbd16be10d83" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="Linux filesystem" PARTUUID="b7f6a3ab-8265-49c5-a6ea-31fa20b67a31"
/dev/sdb1: UUID="756f2a24-13a5-43ee-b6c2-e4980a93e8ce" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="Linux filesystem" PARTUUID="49c94eba-832e-43f4-96c1-addf0e408799"
/dev/sda1: UUID="afc50575-e4ab-4dae-accf-c8761fe1be7e" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="Linux filesystem" PARTUUID="5df79103-bf49-4196-8aef-5b74180bea8f"

 /dev/nvme0np2のPARTUUID=b7f6a3ab-8265-49c5-a6ea-31fa20b67a31をメモするかスマホで写真を撮っておきましょう。次の作業で必要になります。

 以上で事前準備が完了したので、ローダーで指定したarch.confの中身を書きます。

# vim /boot/loader/entries/arch.conf

title Arch Linux
linux /vmlinuz-linux
initrd /amd-ucode.img
initrd /initramfs-linux.img
options root=PARTUUID=b7f6a3ab-8265-49c5-a6ea-31fa20b67a31 rw

 initrd /amd-ucode.imgの記述がマイクロコードに関する設定です。次の行のinitrd /initramfs-linux.imgは初期RAMディスクの設定ですが、マイクロコードの早期ロードはこれより前に行わなければなりません。そのため先に書きます。
 options以降の記述はrootディレクトリを指定するものですが、トラブル回避のためPARTUUIDで指定します。一般的なドライブ名である/dev/nvme0n1p2と指定しても動くことは動きますが、ドライブを差し替える等の理由でドライブ名も替わってしまった場合、起動不可能になります。PARTUUIDはドライブを差し替えようが永続的で変わらないため、こちらの記述法で指定した方が望ましいです。

 以上でシステムの初期設定は終了です。chroot環境から抜けます。

# exit

 これでArch Linuxシステムのインストール作業が全て完了しました。一度システムをシャットダウンします。

# shutdown now

 電源が切れたらArch LinuxインストールメディアのUSBメモリを抜いて、電源ボタンを押して再起動します。ここまでのインストール作業に間違いがなければSSD内に構築したArch Linuxシステムが起動します。失敗した場合でも慌てず騒がずインストールメディアを指しなおしてUSBライブ環境から修正作業を行ってください。

 今回はここまで。インストール完了後のシステム設定は次回やります。

 2024年07月07日
 お風呂でオシッコマン (in JP) = Pissman in a Bathtub (in EN)