Mac の VirtualBox に archlinux をインストールしてみた

DIY だが OS 起動に必要なものが理解できてくる


Posted by Akira Masuda on Tue, Feb 11, 2020
Tags mac, virtualbox, archlinux, os, linux

archlinux を試してみたかった

OS を理解する上で、シンプルなところから理解したい。それには、シンプルな OS から始めるのが良さそう、ということで、archlinux を試してみることにした。

docker image ですぐに試すことはできるが、最近購入した NUC にインストールしたかったので、まず手始めに Mac の VirtualBox でインストールしてみる。 結果的に、VirtualBox で始めるのは非常によかった。インストールだけでも様々な仕組みの理解が必要になるし、ハードウェアにインストールすると最初からやり直すのが難しい

VirtualBox のインストール

よく使われる仮想化ソフト。Docker を普段使っているので、VirtualBox が古くなっていた。

brew cask install virtualbox

すでにインストールしている場合は、

brew cask upgrade virtualbox

で最新の VirtualBox (6.1.2) をインストールする。

archlinux のインストーラーの起動

OS イメージのダウンロードと VM の作成

Installation guide - ArchWiki に従っていく。

Index of /pub/Linux/ArchLinux/iso/2020.02.01 から iso ファイルをダウンロードしてくる。jaist のミラーページは http、つまり中間者攻撃が簡単に行えるため、ここでダウンロードした iso ファイルを信頼してはいけない。

そのままインストールしている例が散見されるが、本来は GPG を使って、正しい OS なのかどうか検証する必要がある。

Installation guide - ArchWiki にあるとおり、gpg をインストールして、iso ファイルの検証を行う。

brew install gnupg  
# Tips : locale は US にしておいたほうが、エラーログが出たときにググりやすいので英語にしておく
export LANG=en_US.UTF-8

Arch Linux - DownloadsChecksums から PGP signature をダウンロード。これと iso ファイルを照合する。

gpg --keyserver-options auto-key-retrieve --verify archlinux-2020.02.01-x86_64.iso.sig

gpg: assuming signed data in 'archlinux-2020.02.01-x86_64.iso'
gpg: Signature made Sat Feb  1 15:57:48 2020 JST
gpg:                using RSA key 4AA4767BBC9C4B1D18AE28B77F2D434B9741E8AC
gpg: Good signature from "Pierre Schmitz <pierre@archlinux.de>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 4AA4 767B BC9C 4B1D 18AE  28B7 7F2D 434B 9741 E8AC

早速 WARNING が出ているのだが、verify public key / Installation / Arch Linux Forums のスレッドによると、これは gpg の鍵に自分の鍵をまず認めてもらう必要がありそう。 Trust the Master Keys – Pierre Schmitz

「Good signature」と出ていれば問題なさそうだ。ここからすでにハードル高いのが、archlinux の DIY な世界。

tips:

VirtualBox では作成した vm の設定から、クリップボードの共有を実施しておく。

また、VM の View > Scaled Mode にしておくと、vm の画面が見やすくできたりする。

archlinux インストーラーの起動

How to install Arch Linux on VirtualBox の手順を参考に virtualbox で archlinux を起動する。 このとき、まずそのままの状態で起動すると「no bootable image installed」というメッセージが出て先に進まない。これは、起動時に読み込む iso イメージを設定していないから。

そこで、起動後の画面で、Devices > Optical Drives > Choose Disk image で上記のダウンロードしてきた archlinux の iso ファイルを指定する。 無事に起動したら、インストールの画面が表示されるため、「Boot Arch Linux」を選択し、インストール作業を実施していく。

起動後、インストールを実施していくのだが、ここからコマンドでの作業となる。Installation guide - ArchWiki を参考にする。

コマンドを virtualbox のウィンドウで入力するのは大変なので、VirtualBoxにArchLinuxをインストール、デスクトップ環境を構築する - Qiita の記事のように ssh の設定を行う。

そして、 sshd をスタートさせておけば、vm の 22 番ポートがホストでの 41231 に紐づく。

このままでは ssh できず、

passwd

で、root user のパスワードを設定する。これにより、Mac のターミナルから

ssh -p 41231 root@localhost
# 決めたパスワード

でログインすることができる。このほうが圧倒的に作業がしやすい。以下、Mac からの ssh で作業をおこなっていく

インターネットアクセスを確認する

インターネットから pacman というパッケージマネージャー経由でソフトウェアをインストールをしたり、また日時を合わせたり必要なため、インターネットが繋げる環境で OS の初期設定を実施する。(なくてもできそうだが、そのためにはまた手順が必要)

root@archiso ~ # ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:54:47:4f brd ff:ff:ff:ff:ff:ff

root@archiso ~ # ping google.com
PING google.com (172.217.25.78) 56(84) bytes of data.
64 bytes from nrt13s50-in-f78.1e100.net (172.217.25.78): icmp_seq=1 ttl=63 time=5.50 ms
64 bytes from nrt13s50-in-f78.1e100.net (172.217.25.78): icmp_seq=2 ttl=63 time=5.39 ms
^C
--- google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 5.386/5.443/5.501/0.057 ms

インターネットにアクセスできていることが確認できた。

block storage disk のパーティションをフォーマットする

virtualbox で初期設定した block storage は /dev/sda として archlinux のインストーラーに認識されている。

root@archiso ~ # parted -l
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 8590MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start  End  Size  Type  File system  Flags

この状態でも、/dev/sda は msdos としてジャーナリングされているが、archlinux を設定する上で、2 つパーティションが必要になるため、これらを作る。

パーティションのディスクサイズが小さい場合は、fdisk コマンドでもよいのだが、MBR 方式、GPT 方式の両方が作成できる parted コマンドをここでは使う。

root@archiso ~ # parted /dev/sda
GNU Parted 3.3
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel msdos
Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? yes
(parted) unit MB

(parted) mkpart
Partition type?  primary/extended? primary
File system type?  [ext2]? ext4
Start? 1
End? 4096
(parted) p
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 8590MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      1.05MB  4096MB  4095MB  primary  ext4         lba

(parted) mkpart
Partition type?  primary/extended? primary
File system type?  [ext2]? ext4
Start? 4096
End? 6144
(parted) p
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 8590MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      1.05MB  4096MB  4095MB  primary  ext4         lba
 2      4096MB  6144MB  2048MB  primary  ext4         lba

(parted) q

ここでは、シンプルに UEFI を利用せずに、BIOS で起動するため、パーティションは /dev/sda1 /dev/sda2 のみを利用する。 なぜ2つなのかは、Installation guide - ArchWikiExample layouts を従っているだけ。

root@archiso ~ # parted -l
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 8590MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  4096MB  4095MB  primary
 2      4096MB  6144MB  2048MB  primary

この状態になっていることを確認する。

/dev/sda2 を linux swap 領域にする

root@archiso ~ # mkswap /dev/sda2
Setting up swapspace version 1, size  1.9 GB (2047864832 bytes)
no label, UUID=bd07f22f-edae-4858-9b72-29e01b9a724a
root@archiso ~ # swapon /dev/sda2

/dev/sda2 を swap 領域に設定する。(正直、メモリ使わないので今回は必要ない気がするが)

/dev/sda1 をフォーマットして /mnt にマウントする

root@archiso ~ # mount /dev/sda1 /mnt
mount: /mnt: wrong fs type, bad option, bad superblock on dev/sda1, missing codepage or helper program, or other error.

root@archiso ~ #  mkfs.ext4 /dev/sda1
mke2fs 1.45.5 (07-Jan-20)
Creating filesystem with 999680 4k blocks and 249984 inodes
Filesystem UUID: 72faec4-2430-43f4-926-95ac0e656d0c
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

root@archiso ~ # mount dev/sda1 /mnt
成功した

最初の mount で失敗して気になったのだが、どうやら、parted で作成したパーティションで ext4 を指定したが、あれは反映されていなかった。 mkfs.ext4 /dev/sda1 によって無事に反映できている

root@archiso ~ # parted -l
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 859MB
Sector size (logicalphysical): 512B/512B
Partition Table: msdos
Disk Flas:

Number  Start   End     Size    Type     File system     Flags
 1      1049kB  4096MB  4095MB  primary  ext4
 2      4096MB  6144MB  2048MB  primary  linux-swap(v1)

File system がいい感じに設定できている。

(余談) paman が使えるか確認

archlinux のパッケージマネージャーは pacman であり、これが利用できるか確認する。

less /etc/pacman.d/mirrorlist

## Australia
Server = http://archlinux.melbourneitmirror.net/$repo/os/$arch
## United States
Server = http://mirrors.xmission.com/archlinux/$repo/os/$arch
## Belgium
Server = http://archlinux.mirror.kangaroot.net/$repo/os/$arch
## United States
Server = http://mirror.mia11.us.leaseweb.net/archlinux/$repo/os/$arch
## United States
Server = http://mirrors.xtom.com/archlinux/$repo/os/$arch

で速いミラーの場所を検知してくれる。日本からだとオーストラリア、US が浮上してくる。

ようやく archlinux のインストール(道のりは長い……

作成した /dev/sda1 パーティションが /mnt にマウントされているので、ここを linux インストール地とする(キャンプ地的な

root@archiso ~ # pacstrap /mnt base linux linux-firmware
==> Creating install root at /mnt
==> Installing packages to /mnt
:: Synchronizing package databases...
 core                                              134.2 KiB   116 KiB/s 00:01 [############################################] 100%
 extra                                            1641.2 KiB   200 KiB/s 00:08 [############################################] 100%
 community                                           4.8 MiB   220 KiB/s 00:22 [############################################] 100%
resolving dependencies...
:: There are 2 providers available for initramfs:
:: Repository core
   1) mkinitcpio
:: Repository extra
   2) dracut

Enter a number (default=1):
looking for conflicting packages...

Packages (116) acl-2.2.53-2  archlinux-keyring-20200108-1  argon2-20190702-2  attr-2.4.48-2  audit-2.8.5-6  bash-5.0.011-2
               bzip2-1.0.8-3  ca-certificates-20181109-3  ca-certificates-mozilla-3.50-1  ca-certificates-utils-20181109-3
               coreutils-8.31-3  cracklib-2.9.7-2  cryptsetup-2.3.0-1  curl-7.68.0-1  db-5.3.28-5  dbus-1.12.16-5
               device-mapper-2.02.186-5  diffutils-3.7-3  e2fsprogs-1.45.5-1  expat-2.2.9-3  file-5.38-3  filesystem-2019.10-2
               findutils-4.7.0-2  gawk-5.0.1-2  gcc-libs-9.2.0-4  gdbm-1.18.1-3  gettext-0.20.1-3  glib2-2.62.4-1  glibc-2.30-3
               gmp-6.1.2-3  gnupg-2.2.19-1  gnutls-3.6.12-1  gpgme-1.13.1-3  grep-3.4-1  gzip-1.10-3  hwids-20200204-1
               iana-etc-20200117-1  icu-65.1-2  iproute2-5.5.0-1  iptables-1:1.8.4-1  iputils-20190709-2  json-c-0.13.1-3
               kbd-2.2.0-5  keyutils-1.6.1-3  kmod-26-3  krb5-1.17.1-1  less-551-3  libarchive-3.4.1-1  libassuan-2.5.3-2
               libcap-2.30-1  libcap-ng-0.7.10-1  libcroco-0.6.13-1  libelf-0.177-2  libffi-3.2.1-4  libgcrypt-1.8.5-2
               libgpg-error-1.36-3  libidn2-2.3.0-1  libksba-1.3.5-2  libldap-2.4.48-2  libmnl-1.0.4-3
               libnetfilterconntrack-1.0.7-1  libnfnetlink-1.0.1-3  libnftnl-1.1.5-1  libnghttp2-1.39.2-2  libnl-3.5.0-2
               libpcap-1.9.1-2  libpsl-0.21.0-2  libsasl-2.1.27-2  libseccop-2.4.1-3  libsecret-0.20.1-1  libssh2-1.9.0-2
               libtsn1-4.16.0-1  libtipc-1.2.5-1  libunistring-0.9.10-2  libusb-1.0.23-2  libutil-linux-2.35.1-1
               libxml2-2.9.10-1  licenses-20191011-2  linux-api-headers-5.3.1-2  lz4-1:1.9.2-2  minitcpio-27-2
               mkinitcpio-busybox-1.31.1-1  mpfr-4.0.2-2  ncurses-6.1-7  nettle-3.5.1-2  npth-1.6-2  openssl-1.1.1.d-2
               p11-kit-0.23.20-2  pacman-5.2.1-4  pacman-mirrorlist-20200207-1  pam-1.3.1-2  pambase-20190105.1-2
               pciutils-3.6.2-2  pcre-8.43-2  pcre2-10.34-3  perl-5.30.1-1  pinentry-1.1.0-5  popt-1.16-12  procps-ng-3.3.15-2
               psmisc-23.3-2  readline-8.0.001-2  sed-4.8-1  shadow-4.8.1-1  sqlite-3.31.1-1  systemd-244.2-2
               systemd-libs-244.2-2  systemd-sysvcompat-244.2-2  tar-1.32-3  tzdata-2019c-3  util-linux-2.35.1-1  xz-5.2.4-2
               zlib-1:1.2.11-4  zstd-1.4.4-1  base-2-2  linux-5.5.2.arch1-1  linux-firmware-20200122.1eb2408-1

Total Download Size:    286.80 MiB
Total Installed Size:  1126.30 MiB

:: Proceed with installation? [Y/n]
:: Retrieving packages...
 iana-etc-20200117-1-any                           387.1 KiB   216 KiB/s 00:02 [############################################] 100%
 filesystem-2019.10-2-x8664                        27.8 KiB  0.00   B/ 00:00 [############################################] 100%
 linux-api-headers-5.3.1-2-any                     997.7 KiB   199 KiB/s 00:05 [############################################] 100%
 tzdata-2019c-3-x86_64                             341.5 KiB   242 KiB/s 00:01 [############################################] 100%
 glibc-2.30-3-x86_64                                 9.1 MiB   204 KiB/s 00:46 [############################################] 100%
 gcc-libs-9.2.0-4-x86_64                            28.3 MiB   192 KiB/s 02:31 [############################################] 100%
 ncurses-6.1-7-x86_64                             1067.1 KiB   213 KiB/s 00:05 [############################################] 100%
 readline-8.0.001-2-x86_64                         296.4 KiB   248 KiB/s 00:01 [############################################] 100%
 bash-5.0.011-2-x86_64                            1538.5 KiB   200 KiB/s 00:08 [############################################] 100%

…… しばらくかかる
 
(13/13) Rebuilding certificate stores...
pacstrap /mnt base linux linux-firmar  35.07s usr 10.28s system 2% cu 26:33.87 total
root has logged on pts/1 from 10.0.2.2.

この中身は OS の勉強になる箇所で、

  1. iana-etc : protocol などの設定 Arch Linux - iana-etc 20200117-1 (any)
  2. filesystem : filesystem の設定 Arch Linux - filesystem 2019.10-2 (x86_64)
  3. tzdata: タイムゾーンの設定
  4. glibc : GNU の標準 C ライブラリ。これによって、C を通じて syscall の呼び出しなどを簡単に行える。他のパッケージも glibc を利用して簡単に機能を実現している glibc | 日経 xTECH(クロステック)
  5. ncurses: text base interface を簡単に利用できるようにするためのライブラリ ncurses - Wikipedia
  6. bash : 言わずとしれたシェル

その他にも、gawk や grep, systemd などなど、archlinux を利用し始めるにあたり便利なものがインストールされている。

centos や ubuntu などインストールしたらすぐに使えるディストリビューションでは、ここらへんが最初から同梱されているが、pacman で逐一ダウンロードしていくのが archlinux がシンプルだが DIY である理由。 それでも pacman があり、base, linux などまとめてインストールできる方法が用意されているのはとても助かる(初学者には何を選んだらよいかわからんもんなぁ)

pacstrap /mnt linux でダウンロードを実施しているが、これは、Kernel - ArchWiki のように linux kernel をインストールしている。

「え、それじゃあ、これまで作業していた環境はいったい……?」 というのはもっともな話。そこで下記のコマンドを打つ。

root@archiso ~ # cat /etc/*-release
NAME=ArchLinux"
PRETTY_NAME="Arch Linux"
ID=arch
BUILD_ID=rolling
ANSI_COLOR="0;36"
HOME_URL="htps://www.archlinux.org/"
DOCUMENTATION_URL="https://wiki.archlinux.org/"
SUPPORT_URL="https://bbs.archlinux.org/"
BUG_REPORT_URL="https://bugs.archlinux.org/"
LOGO=archlinux

結果を見ると、こちらも archlinux である(よくよく思えば、最初のミラーサイトからダウンロードしてきたのも archlinux の iso)。 ただし、このイメージはそもそも archlinux の開発者が「これインストールに使ってやー」と提供しているイメージである。 Arch Linux - DownloadsIt is intended for new installations only. と記載されている。

なので、自分がカスタマイズする最小の構成を行うためには、pacman を利用して一つ一つダウンロードしてくる必要があった。

インストールが完了すると、/mnt の中に linux の ルートディレクトリができていることがわかる。

root@archiso ~ # ls /mnt
bin  boot  dv  etc  home  lib  lib64  lost+found  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

# もちろんダウンロードしてきたのも archlinux になっている
root@archiso ~ # cat /mnt/etc/*-release
NAMEArch Linux"
PRETTY_NAME="Arch Linux"
ID=arch
BUILD_ID=rolling
ANSI_COLOR="0;36"
HOME_URL="htts://www.archli
DOCUMENTATION_URL="https://wiki.archlinux.org/"
SUPPORT_URL="https://bbs.archlinux.org/"
BUG_REPORT_URL="https://bugs.archlinux.org/"
LOGO=archlinux

/dev/sda1パーティションに自分仕様の archlinux が入った。 あとは、作成したパーティションがハードウェアの起動時に読み込まれればようやく自分仕様の archlinux が起動する。

roo@archiso ~ # genfstab -U /mnt >> /mnt/etc/fstab

fstab とはなにか?

File System Table の略で、ディスクパーティション、ブロックデバイス、リモートファイルシステムが、どのように OS の file system にマウントされるべきかを定義している。fstab - ArchWiki

生成された fstab の中身

# <file system> <dir> <type> <options> <dump> <pass>
# /dev/sda1
UUID172faec4-2430-43f4-9926-95ac0e656d0c       /               ext4            rw,relatime     0 1
# /dev/sda2
UUID=bd07f22f-edae-4858-9b72-29e0b9a724a       none            swap            defaults

/dev/sda1 と /dev/sda2 に UUID が割り当てられ、それがルートディレクトリとして設定されている。

さて、pacman で linux をダウンロードしたときに、systemd もインストールされている。 systemd は linux が起動したら、はじめに起動するプロセス (PID 1) になっており、これが fstab を読み取り、mount service を実行することによって、設定されたパーティションが file system として認識されるようになる。systemd

古い linux では、これが sysvinit というプロセスだったが、systemd という linux 共通で使えて、かつ並列に処理が行なえ、設定が簡単に行えるものに置き換えることで、linux でのプロセス管理が楽になった。

特にコンテナ化された環境でプロセスの立ち上げや定期バッチのような処理を行う際、systemd で管理させると楽だったりする。 (crash したときにプロセスの再起動を設定できたりする。How to set up a systemd service to retry 5 times on a cycle of 30 seconds - Stack Overflow

インストールした archlinux へ初期設定を実施

chroot で仮想的にダウンロードした archlinux に入る

arch-chroot /mnt

これにより、ダウンロードしてきた自分仕様の archlinux に仮想的に入った状態で作業が行える。(今後は fstab の設定により、OS 起動時に systemd がマウントして、ここがルートディレクトリになる

[root@archiso /]# ln -sf /usr/share/zoneinfo/Japan /etc/localtime
[root@archiso /]# hwclock --systohc --utc
[root@archiso /]# locale-gen
Generating locales...
Generation complete.
[root@archiso /]# echo "LANG=en_US.UTF-8 /etc/locale.conf
[root@archiso /]# echo "virtualbox-archlinux" > /etc/hostname
[root@archiso /]# pacman -S dhcpcd
[root@archiso /]# systemctl enable dhcpcd
[root@archiso /]# passwd
New password:
Retype new password:

ここでは、OS のタイムゾーンを設定、locale (地域設定)、ホスト名、ダウンロードしてきた archlinux の root パスワードの設定を行った。 特に root のパスワード設定はしておかないと、OS 起動時に困るので必ず実施する。

また dhcpcd (DHCP client daemon) をインストールして有効にしておく。(ネットワークに接続する設定を固定にするのは辛い)

また、ファイルの編集で便利なので vim や ssh するために openssh をインストールする(ここはお好みで

[root@archiso /]# pacman -S vim
[root@archiso /]# pacman -S openssh
[root@archiso /]# systemctl enable sshd
Created symlink /etc/systemd/system/multi-user.target.wants/sshd.service → /usr/lib/systemd/system/sshd.service.
[root@archiso /]# pacman -S which

openssh パッケージに sshd は同梱されている。

【重要】GRUB2 の設定

/dev/sda1 にダウンロードされた自分仕様の archlinux の初期設定が完了し、最後に GRUB を利用してハードウェア起動時にブートされるように設定する。

GRUB (GNU GRand Unified Bootloader) とは

ハードウェアの電源を入れるといきなり OS が立ち上がるわけではなく、まずハードウェアに紐付いた BIOS や UEFI (いわゆる firmware) が起動する。その後、GRUB のような bootloader が立ち上がり、OS を起動するのである(過去には BIOS から直接 OS を起動させることもできたが、きっと OS 側でメンテナンスするのを止めて GRUB のような bootloader に処理を委譲したのだろう【推測】)。

例えば、bootloader を挟むことで、一つの PC に複数の OS をインストールして使いたい場合、dual boot の設定を行って、Windows と linux を起動時に選択するということができる。(最近では、docker や virtualbox で済むのであまりやらなくなってしまったが……)

参考:

archlinux に grub をインストールする

pacman でインストールするのだが、ここでインストールされるのは、grub2 である。

GRUB - ArchWiki に何を行っているのかが記載されている。

[root@archiso /]# pacman -S grub os-prober
resolving dependencies...
looking for conflicting packages...

Packages (2) grub-2:2.04-5  os-prober-1.77-1

Total Download Size:    6.69 MiB
Total Installed Size:  32.65 MiB

:: Proceed with installation? [Y/n] Y
:: Retrieving packages...
 grub-2:2.04-5-x86_64                                6.7 MiB   190 KiB/s 00:36 [############################################] 100%
 os-prober-1.77-1-x86_64                            16.8 KiB  0.00   B/s 00:00 [############################################] 100%
(2/2) checking keys in keyring                                                 [############################################] 100%
(2/2) checking package integrity                                               [############################################] 100%
(2/2) loading package files                                                    [############################################] 100%
(2/2) checking for file conflicts                                              [############################################] 100%
(2/2) checking available disk space                                            [############################################] 100%
:: Processing package changes...
(1/2) installing grub                                                          [############################################] 100%
Generate your bootloader configuration with:
  grub-mkconfig -o /boot/grub/grub.cfg
Optional dependencies for grub
    freetype2: For grub-mkfont usage
    fuse2: For grub-mount usage
    dosfstools: For grub-mkrescue FAT FS and EFI support
    efibootmgr: For grub-install EFI support
    libisoburn: Provides xorriso for generating grub rescue iso using grub-mkrescue
    os-prober: To detect other OSes when generating grub.cfg in BIOS systems [pending]
    mtools: For grub-mkrescue FAT FS support
(2/2) installing os-prober                                                     [############################################] 100%
:: Running post-transaction hooks...
(1/1) Arming ConditionNeedsUpdate...

[root@archiso /]# grub-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.

[root@archiso /]# grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-linux
Found initrd image: /boot/initramfs-linux.img
Found fallback initrd image(s) in /boot: initramfs-linux-fallback.img
done

[root@archiso /]# ls /boot/grub/
fonts  grub.cfg  grubenv  i386-pc  themes

最後に /boot/grub/grub.cfg が存在していることを確認する(重要)。

これでようやく archlinux のインストールと初期設定が完了。

[root@archiso /]# exit
exit

# ここはインストーラーの archlinux の中
root@archiso ~ # umount -R /mnt
root@archiso ~ # shutdown -h now

インストーラーのイメージを外す

このまま VM を再起動しても、インストーラーの archlinux が起動してしまう。そこから、「Start Existing OS」で /dev/sda1 の中に含まれた archlinux を起動してもよいのだが、どうせなら初期設定も完了しているし、カスタマイズした archlinux を起動したい。

そこで、インストーラーの disk を VirtualBox で除いてしまう。

これにより、設定した GRUB2 がダウンロードした archlinux を起動してくれる。

お疲れ様でした。

【付録】NG 集

上記の手順は、自分が試行錯誤してうまく起動できるところまで確認したものだが、その間に詰まったところがあったので下記に記載する。

VirtualBox から archlinux の VM を再起動したら grub が立ち上がった

grub の設定も完了して、勝手に vm スタートしてくれるかとおもったら、grub の画面になった。

パーティションは正しく認識しているようだが、本来は GRUB が archlinux をそのまま起動してもらいたいところ。

理由はネットからコピペしたコマンドにあった。

[root@archiso /]# grub-mkconfig –o /boot/grub/grub.cfg

Generating grub configuration file ...
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
insmod part_gpt
insmod part_msdos
if [ -s $prefix/grubenv ]; then
  load_env
fi
if [ "${next_entry" ] ; then
   set default="${next_entry"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   set default="0"
fi

……

おわかりだろうか……

実はこの –o のハイフンが -o (半角のマイナス) でないため、これは /boot/grub/grub.cfg を生成していない。 よって、grub は起動したものの grub.cfg がないものと思ってしまい、その結果、grub のみが立ち上がって archlinux が起動しないというわけだ。

ちなみに GRUB2 からは、

set root=(hd0,msdos1)
linux /boot/vmlinuz-linux root=/dev/sda1
initrd /boot/initramfs-linux.img
boot

にて起動ができる。しかし、/boot/grub/grub.cfg を見てのとおり、archlinux を boot するまでに様々な設定を GRUB2 がデフォルトで考えてくれているが、上記コマンドは linux を起動するまでのステップしか考慮していない。

ちなみに、上記コマンドで initrd の設定を忘れると下記のようなカーネルパニックを起こす。

また、上記コマンドで起動したとき、

drm:vmw_host_log vmwgfx *ERROR* Failed to send host log message

ようなエラーが発生した。boot - Why does “drm:vmw_host_log vmwgfx ERROR Failed to send host log message” show up and what can I do to fix it? - Unix & Linux Stack Exchange によると、Virtualbox がデフォルトで設定している VMSVGA が認識できないようだ。VBoxVGA に修正したら、起動は行えた。

OS 起動後、キーがリピートされて入力される?

GRUB2 の設定が正しく行えていない状態で archlinux を起動すると、キーがリピートされてログイン時のパスフレーズ入力が詰んだ。イメージ的には下記のような状態になってしまう。

login:  rrrrrrooooooooootttttttt

リソースが足りないのかと 2GB RAM, 2CPU 割り当ててみたが、状況は変わらなかった。

このとき、GRUB2 のプロンプトから直接起動していたため、グラフィックかキー入力周りが正常に機能していない可能性がある。

そんなこともあったので、/boot/grub/grub.cfg の存在確認や GRUB2 の設定のチェックはちゃんとしておきたいところ。

arch-chroot で失敗する

すでに別ターミナルで chroot が走っていると失敗するので、kill した。

root@archiso ~ # arch-chroot /mnt
mount: /mnt/proc: proc already mounted on /proc.
==> ERROR: failed to setup chroot /mnt

root@archiso ~ # ps aux | grep chroot
root        4776  0.0  0.3   7388  3908 pts/0    S    09:54   0:00 /bin/bash /usr/bin/arch-chroot /mnt

root@archiso ~ # kill 4776
root@archiso ~ # arch-chroot /mnt
[root@archiso /]#
comments powered by Disqus