私が気にする100の事象

気にしなければ始まらない。

Arch LinuxをVirtualBoxでインストール

昨日の日記(12021年6月27日)です。 天気は晴れ。

(追記:最初は題名を「Arch LinuxVirtualBoxにインストール」にしていたのですが、 「VirtualBoxを用いて、作られたVMに対してArchLinuxをインストール」なので、 「Arch LinuxVirtualBoxにインストール」というのは少しおかしいとの指摘を受けました。というわけで題名を修正しました。 12021-07-02)

Arch LinuxVirtualBoxでインストール

しのなぎさんの監修のもと、 Arch LinuxVirtualBoxにインストールしました。 僕がやった手順を記録として雑に(時間の都合上)残しておきます。 これは次回、僕が一人でちゃんとインストールできるように残しています。

私は今までまともに*1Linuxを触ったことがないので、 おかしなことを書いているかもしれません。 そのときは教えて下さい(細かいことでも助かります)。

しのなぎさんがいてくれたことで、 本来1~2週間くらいかかっていたインストール作業が 3時間ほどでインストールできました。 懇切丁寧に分かりやすく教えてくれて、 感謝しかありません。 仏です。

基本的に以下の2つのサイトを参照しながらインストールを進めていきます。

wiki.archlinux.jp

techlog.page

ところどころに前提があり、 Linuxに触れたことがない私にとっては難しいところがあったので、 それについても書いておきます。

VirtualBoxについて

まずVirtualBoxにArch Linuxをインストールすることについてですが、 VirtualBoxはパソコンの中で動くパソコンみたいなものです。 仮想化されたパソコン、 もう少し厳密に言うと、 VirtualBoxの中で別のOSを実行することができる仮想化ソフトウェアです。

既存のOS(ホストOS)上にVirtualBoxをインストールして、 このVirtualBoxの中で 他のOS(ゲストOS)を実行することができます。

今回、ホストOSはWindows 10で、 ゲストOSが今回インストールするArch Linuxとなります。

本来なら、パソコンがあって、 そのパソコンにCDやUSBを差し込んで、 Arch Linuxをインストールする必要がありますが、 今回はVirtualBox(というパソコン)に Arch Linuxをインストールさせます。

え、なんでパソコンじゃなくて、 VirtualBoxにインストールするの? と思ったかもしれませんが、 まあ単に財政上の理由です。 私はPCを1つしか持っていませんし、 USBも1つしか持っていません。 ディスクを読み取るための機械も持っていないため、 デュアルブートすることも容易ではないですし、 デュアルブートには様々なリスクがあることを知っています。 というのも、一度だけ、友達が私の(今は亡き)ノートPCくんに elementary OSをデュアルブートで落としてくれたことがあるので、 (このときはお友達がほぼ全てやってくれたので、 どうやったかは分かりません) デュアルブートだと少し面倒くさいことが起こることを少し知っています。 どういうことが起きたかを書くと、 話の腰を折りかねないので、 ここには書きません。

まあ、とにかくそういうこともあり、 今回はArch LinuxVirtualBoxにインストールしたのです。 許して。

VirtualBoxのダウンロード

www.virtualbox.org

ここからダウンロードできます。

VirtualBox側の設定

VirtualBoxは仮想のパソコンという話を先程しましたが、 仮想のパソコンというのもあり、 設定をすれば様々な仮想のパソコンを作ることができます。 具体的にいうと、 ハードウェアの容量とか、 CPUの数とかです。

VirtualBox側の設定については、 以下のブログを参考にすればうまくいきます。 細かい設定はお好みですが、 僕はハードウェアの容量を256GB、 CPUの数を2個にしました。

www.nemotos.net

f:id:skytomo:20210629081609p:plain

あと、忘れないでほしいのが、 設定 > システム > マザーボード > 「EFIを有効化」のところにチェックを入れることです。

これは何なのかということですが、 まずブートローダくんというのがいます。 ブートローダくんはOSを起動させるのが仕事です。 ではその、ブートローダくんを起動させるのは誰かというと、 BIOS, UEFIとかが起動させます。 BIOS, UEFIブートローダを起動させるのが仕事です。 たいていのOSはBIOSUEFIがどっちも入っているみたいなのですが、 (追記:OSにはBIOSUEFIは入っておらず、マザーボードファームウェアとして存在します。 12021-07-02) 「EFIを有効化」しないとBIOSが起動します。 これを聞くと、BIOSよりUEFIの方がより良いように聞こえますが、 実際そうみたいで、 ざっくり言うと、 BIOSの後継がUEFIなので、 UEFIの方がいいらしい(本当に??)です。 ちなみに、 BIOSは、具体的なやつファームウェアのことで、 UEFIは、ファームウェアの規格なので、 こうやって一緒くたにして並べると怒られるようなので、 ここに補足として書いておきます。 あれですね、USBメモリとUSBみたいなものです。 (USBメモリのことをUSBって言うのと同じ感じです) BIOSの後継がUEFIというより、 BIOSの後に、UEFIという規格ができました、の方が正確なのかもしれません。

EFIUEFIって何か違うのかと思った方、鋭いですね。 EFIUEFIは少し違います。 UEFIは、Intelが発表したEFIを元にして作られたものらしいです。 細かい違いはあれど、そこまで違いを分かっていなくてもいいので、 ここでは割愛します。 というか、私も具体的な違いを知りません。

話を戻すと、 UEFIを使うとsystemd-boot、 BIOSだとGRUBが起動するみたいです。

ISOファイルを読み込む

ISOファイルはディスクみたいなものです。

設定 > ストレージ > コントローラ > 属性の右にあるディスクのアイコンを選択して、 そこからArch LinuxのISOファイルを選択します。 Arch LinuxのISOファイルは頑張ってダウンロードしてください。 1GB弱あります。

Arch Linuxのインストール

そしたら設定の画面を閉じて、 起動ボタンを押してみましょう。

少し待つと、 画面に文字が表示されます。 僕は根本的なことを理解していなかったので、 この時点でインストールできたのかと思っていたのですが、 違いました。 今、画面にあるのは、 ディスクから読み込んでいるLinuxが動いているのであって、 PCにLinuxが入っているわけではありません。

ここからは、 ディスクから読み込んでいるLinuxで、 PCにLinuxをインストールする作業になります。

ディスクから読み込んでいるLinuxは、 お母さんLinuxみたいな感じで、 これからPCにインストールされるLinuxは、 赤ちゃんLinuxみたいな感じだと思えばいいかもしれません。

キーボードレイアウトの設定

さて、これからお母さんLinuxの中で、 赤ちゃんLinuxを作るわけですが、 その前にキーボードレイアウトの設定をしておきましょう。 デフォルトだとUSキーボードなので、 日本語キーボードレイアウトに設定するには以下のように設定します。

# loadkeys jp106

#は打ち込みません。 入力を受け付けるプロンプトが一般ユーザではシェルによって違うらしいのですが、 普通は先頭に$もしくは%が付いているようです。 一方、スーパーユーザ(ルート権限、管理者権限)は先頭が#となります。 つまり、今は管理者権限ということですね。

とにかく上のコマンドを打つと日本語キーボードレイアウトになるはずです。

インターネットの接続

ここで、本来なら(実機なら?)、*2 ノートパソコンの場合は、Wi-Fiの接続設定をする必要があったりするですが、 今回はVirtualBoxに入れるため、 細かい設定をする必要がありません。

# ping archlinux.jp

確認のために、上のコマンドを打ってpingが帰ってくるか確認してみましょう。 Windowsと違ってLinuxpingコマンドは何回もpingを打ってくれるので、 気が済んだら、Ctrl+Cで終了します。

システムクロックの更新

# timedatectl set-ntp true

システムクロックを更新します。 これをする理由は知りません。

パーティションの作成とフォーマット

さて、ここから、パーティションの設定をします。

# fdisk -l

fdiskを使ってデバイスを確認することができます。

f:id:skytomo:20210630203152p:plain

/dev/sda/のところに256GiB*3と書かれていることがわかります。

/dev/というのは、deviceという意味で、 そこには色々なデバイスが入っています。 キーボードとかCPUとかです。 「デバイスが入っている?」と思った方もいるかも知れませんが、 UNIX哲学では、 「すべてをファイルとして扱う」ので、 マウスとかキーボードとかCPUとかもファイルとして扱われます。 それらのデバイスという名のファイルは/dev/に入っています。

/dev/sdaというのはハードディスクですね。 さて、このハードディスクを(少なくとも)2つに分割しなければなりません。 今回は、techlogの記事に従ってパーティションを分けることにしてみましょう。

f:id:skytomo:20210630231340p:plain

techlogの記事に従うと、 こんな感じでパーティションを分けることになります。 先端の512MiBが、 赤ちゃんLinuxを起動させるUEFIくんの居場所になります。 UEFIの居場所には名前がついていて、 「EFIシステムパーティション」と呼ばれます。

残りの部分はメインのパーティションとなり、 Windowsで言うところのCドライブみたいなやつになります。

ちなみに、ArchWikiに書かれている方法でパーティションをすると、 EFIシステムパーティションが後ろの方に来ます。 これは好みの問題ですが、 EFIシステムパーティションが後ろの方に来るのは少し気持ち悪いので、 techlogではEFIシステムパーティションが先頭の方に来るように設定しています。

あとはtechlogに書かれている通りに打ち込みます。

# gdisk /dev/sda
: o (新たなテーブル)
: n (新たなパーティション)
: (エンターキーを押します)
: (エンターキーを押します)
: +512M (先頭から512MiB分まで)
: ef00 (EFIシステムパーティションの作成)
: n
:(全ての質問にエンターキーを押します)
: w (書込)

これで、/dev/sda1/dev/sda2ができました。 おおっと、まだフォーマットできていません。 techlogによると、

EFIシステムパーティションは、FAT32でフォーマットされていなければいけません。sda1はFAT32で、sda2はext4でフォーマットします。

とのことなので、そのための設定をします。

# mkfs.fat -F32 /dev/sda1
# mkfs.ext4 /dev/sda2

このコマンドを打つと、無事フォーマットされます。

パーティションのマウント

ハードディスクのパーティションの作成とフォーマットが完了しました。

さて、これから、赤ちゃんLinuxを実際に作っていくことになるのですが、 お母さんLinux/mntのところで赤ちゃんLinuxを作っていきます。 人間でいうと、/mntはお母さんの子宮に当たります。 /mntは子宮です。

/mntにこれから作っていくわけですが、 /dev/sda2/mntに、 /dev/sda1/mnt/bootに、 マウントします。 マウントとは、Wikipediaによると、 OSからファイルシステムを使えるようにするための手続きのことです。

# mount /dev/sda2 /mnt
# mkdir /mnt/boot
# mount /dev/sda1 /mnt/boot

このコマンドを打つことによって、 お母さんLinuxの子宮(/mnt/)に/dev/sda2が、 赤ちゃんLinuxboot部分に/dev/sda1が接続されます。 まあ、あたかも子宮の中に赤ちゃんができるように見えますが、 実際には、子宮の中にはマウントポイントがあるだけです。

bootについてですが、 ブートはbootに来る必要があるので、 mount /dev/sda1 /mnt/bootをするわけです。

インストール、そして新システムの中へ

インストールする前に、 ミラーを設定しておきます。 しのなぎさん曰く 「アメリカから落とすより日本のサーバから落とした方が速いですよね?」 とのことなので、 techlogに書かれている通りに、 しのなぎさんイチオシのサーバを設定します*4

# cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.backup
# vim /etc/pacman.d/mirrorlist

vimで以下を頭に入力します。

Server = http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/$repo/os/$arch
Server = http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/$repo/os/$arch

ここらへんはもう本当にtechlogに書かれている通りなんですが、

pacstrapで/mnt以下にシステムをインストールします。 arch-chrootで新システムへ入ります。

# pacstrap /mnt base linux linux-firmware
# genfstab -U /mnt >> /mnt/etc/fstab
# arch-chroot /mnt

これをします。

pacmanコマンドというのがあるのですが、 Arch Linux の主要な機能のひとつである、 パッケージマネージャです。 pacstrapは内部的にpacmanを呼び出して、 特定の場所にパッケージをインストールします。 つまり1行目で/mntbaselinuxlinux-firmwareをインストールすることになります。

2行目は何だったか忘れちゃった。

3行目のchrootはchange rootで、ルートディレクトリを変えます。 こうすることで、作業がしやすくなります。 赤ちゃんLinuxを操作するにあたって、 お母さんLinuxからいじるよりも、 実際に赤ちゃんLinuxの中に入っていじった方がやりやすいですものね。

新システムの設定

一方その頃赤ちゃんでは――

techlogに従い、 必要なものをここでインストールします。

# pacman -S vim

techlogに書かれている、 intel-ucodeIntelをなんかするやつですが、 (追記:「なんかするやつ」は曖昧過ぎですね。ArchWikiの「Intel または AMD の CPU を使っている場合はマイクロコードのアップデートを有効にしてください。」の部分に対応するやつで、しのなぎさん曰く「マイクロコードのアップデートをしてくれるやつ」とのことです。) 今回はVirtualBox上で動かすので、 インストールする必要がありません。 iwdWi-Fiを使うときに必要になるのですが、 これも今回はVirtualBox上で動かすので、 インストールする必要がありません。

タイムゾーンの設定をします。

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

ローカリゼーションの設定をします。

# locale-gen
# vim /etc/locale.conf
LANG=en_US.UTF-8

ネットワーク設定

ホストネームファイルを決めます。 ArchWikiによると、 ホストネームとはネットワーク上でマシンを識別するために作られる唯一の名前です。 まあコンピュータに名前を付ける感じだと思ってください。

# vim /etc/vconsole.conf
myhostname

myhostnameの部分はお好みの名前に設定してください。

同じ名前をhostsにも記述します。 hostsはホスト名とIPアドレスを対応させるためのファイルです。

# vim /etc/hosts
127.0.0.1    localhost
::1     localhost
127.0.1.1   myhostname.localdomain  myhostname

rootパスワードの設定をします。

# passwd

systemd-bootのインストール

ArchWikiには次のようなことが書かれています。

Linux に対応しているブートローダーを選択してインストールしてください。Intel または AMD の CPU を使っている場合はマイクロコードのアップデートを有効にしてください。

しのなぎさんはsystemd-bootが好みだそうなので、 今回はtechlogに従って、 systemd-bootをインストールします。

# bootctl --path=/boot install
# vim /boot/loader/loader.conf
default arch.conf
timeout 3
console-mode keep
editor no
# blkid -o export /dev/sda2 | grep ^PARTUUID >>/boot/loader/entries/arch.conf
# vim /boot/loader/entries/arch.conf
# title archlinux
# linux /vmlinuz-linux
# initrd /intel-ucode.img
# initrd /initramfs-linux.img
# options root=PARTUUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw

起動用のディスクをPARTUUIDで指定します。

これは起動時にsda1とsda2がうっかりすり変わることがあるかららしいです。 つまりoptions root=sda1とすると、 確率的に起動しなくなったりするわけですね。

bootctl listで確認してから再起動します。

# bootctl list
# exit
# reboot

さて、これで再起動します。

これでうまく行ったら成功です。

しのなぎさんが 「起動しなかったときは『絶望』ですね」 と言っていましたが、 私は2箇所の打ち間違いがあって、 一度「絶望」しました。 ああーこれが「絶望」なんですね、 という話をしました。 打ち間違いを修正して、 再度再起動したら… うまく行きました!

やった~~~!

しのなぎさんも拍手してくれました、嬉しい*5

とまあこんな感じで、 日記2割、覚書8割の文章を書き終えます。

6月28日から書き始めていたのですが、 忘れないようにちゃんと書こうとしたら、 8980→9655文字のクソデカ文章が出来上がって、 日付は7月1日になっていました。

まあ、最近はまともな長い日記を書いていなかったので、 たまにはこういうのもいいかもしれません (と、いつもこんな調子ですが💦)

*1:DockerとかWSLとかあと学校の授業で触ったくらいです。コマンドもcdとかpwdとかlsとかまあファイル移動のコマンドくらいしか知りません

*2:追記:実機でも有線接続であれば特に何もしなくても問題がなければインターネットに接続されるそうです。 12021-07-02

*3:GiBはギビバイトですね。1GB=1000KBですが、1GiB=1024KBとなります。もともと、SI接頭辞の $ 109 $ を表すギガを使って、 $ 109 $ バイトに比較的に近い $ 230 $ バイトのことを1ギガバイトと言っていましたが、ややこしいので、二進接頭辞としてギビ(Gi)が制定されました(IEC 60027-2、IEC 80000-13:2008及びIEEE 1541-2002)。

*4:場所や環境によってスピードは違うので、自分好みのがあるならそれを設定しましょう、とも言っていました

*5:しのなぎさんは要所、要所でうまくいったら拍手をしてくれるので、嬉しいです。本当に褒め方が上手いですね。褒められると伸びるので、伸びます。もう伸びるしかない。