a3VtYQ2e9uA1のブログ

特記事項はありません

VirtualBoxでArch Linuxを使う

これまで記事にしてきた実験,特にコンピュータ実機を用いた実験では,Arch Linuxをインストールしたラップトップを使用していました.
例えばこれら↓

a3vtyq2e9ua1.hatenablog.com

a3vtyq2e9ua1.hatenablog.com

『ハッキングラボ』をやってみた関係でVirtualBoxが充実してきたので,この際仮想環境上にArch Linux環境を作ってしまおうということでその手順をまとめました.

初めてArchをインストールしたときに手順書を作っておいたので,それを参照しながら作業を行いました.手順書を書いたのが2014年なので当然今では上手くいかない箇所もあり,詰まったら適当に回避しています.
したがって,以下の記述には誤っている箇所や意味のない操作が含まれているかもしれません.あらかじめご了承ください.

ディスクイメージのダウンロード

https://www.archlinux.org/download/ からISOファイルをダウンロードしてきます.基本的には地理的に一番近いサーバ,つまり日本のサーバを選択するのが良いと思います.Archのインストールイメージは1ヶ月ごとに更新され,本稿記述時の最新版はarchlinux-2020.07.01-x86_64.isoでした.今回はそれを用います.

ダウンロードが完了したら一応MD5ハッシュ値を確認しておきます.Windowsの場合下の方法で確認できます.

certutil -hashfile <ダウンロードしたファイル> MD5

このとき出力された値とダウンロードページに掲載されている値が一致していれば問題ありません.もし違っている場合,ファイルが壊れているかニセモノを掴まされた可能性があります.

f:id:a3VtYQ2e9uA1:20200722223618p:plain
ダウンロードしたISOファイルのMD5ハッシュ値を計算し,公式の情報と比較する.一致している

仮想マシンの設定

仮想マシンの設定は以下の通りです.

この辺りは好きに設定して構いません.

Arch Linuxのインストール

基本的には公式インストールガイドの通りにやればいいのですが,ひと通り紹介していきます.

起動

仮想マシン光学ドライブにダウンロードしたISOファイルを割り当てて起動します.

f:id:a3VtYQ2e9uA1:20200722223829p:plain
仮想光学ドライブから起動した

上の画面が表示されたら一番上の項目を選択します.しばらく色々と表示されて,最終的にrootのプロンプトが表示されます.

キーマップの設定

デフォルトではUS配列なので,日本語配列に設定します.

# loadkeys jp106

パーティショニング

実機にインストールする場合は/bootや/home等を分けた方が良いのですが,ここではルートパーティションスワップパーティションの2つだけを作っていきます.

cfdiskによるパーティション分け

ハードディスクは/dev/sdaであるとし,パーティションを切っていきます.ここではcfdiskを用います.

# cfdisk /dev/sda

まず,今回の仮想マシンbiosなのでdosを選択します.
(gptワカラナイ)

[New]を選択し,ルートパーティションの大きさを決めます.ここでは14GBを割り当てました.次にパーティションの種類を問われるので[primary]を選択します.すると,/dev/sda1が作成されます.
/dev/sda1が選択された状態(左側に>>がある)で左端の[Bootable]を選択します.これで/dev/sda1にBootフラグが立ちました.

続いてカーソルキー↓を押してFree spaceを選択し,[New]を選択します.空いた2GBはスワップ領域に割り当てるためそのままEnterを押します.これもprimaryとします.
/dev/sda2が選択された状態で[Type]を選択します.表示された一覧から「82 Linux swap / Solaris」を選択します.

最終的にこんな感じになります.

f:id:a3VtYQ2e9uA1:20200722223918p:plain
14GBの/dev/sda1と2GBの/dev/sda2が存在している

以上の設定が完了したら[Write]を選択したあと注意をよく読んでyesと入力し,設定した内容を実際にハードディスクに書き込みます.その後[Quit]でcfdiskを終了します.

ファイルシステムの作成とスワップの有効化

作成した/dev/sda1をext4でフォーマットします.

# mkfs.ext4 /dev/sda1

/dev/sda1を/mntにマウントします.

# mount /dev/sda1 /mnt

/dev/sda2にスワップを設定します.

# mkswap /dev/sda2
# swapon /dev/sda2

インターネット接続の確認と時刻合わせ

ip addrネットワークアダプタごとの状態が表示されます.lo等のデバイスは無視し,ethenpと表示されているデバイスIPアドレスが設定されていることを確認します.私の環境ではenp0s310.0.2.15が割り当てられていました.
ping 8.8.8.8等でインターネットにアクセスできることを確認します.

インターネット接続が確認出来たらシステムクロックを更新します.

# timedatectl set-ntp true

ベースシステムのインストール

OSの中枢となるソフトウェアをダウンロードしてきてハードディスクにインストールします.pacstrapを用います.

# pacstrap /mnt base base-devel linux linux-firmware

baseにはbashやtar等最小限の動作に必要なパッケージが,base-develにはgccやsudo等が含まれています.linuxカーネルとモジュールで,linux-firmwareファームウェアファイルです.

GRUBブートローダをインストールします.

# pacstrap /mnt grub-bios

ネットワーク接続に必要なパッケージをインストールします.

# pacstrap /mnt dialog netctl dhcpcd

テキストエディタとしてVimをインストールします.

# pacstrap /mnt vim

パッケージのインストールが完了したらfstabを作ります.fstabとはパーティションやブロックデバイスのマウント方法を記述したもので,/etc/fstabに書かれます.書式は決まっているので自分で書いても構いませんが,ここでは簡略化のため自動で生成させます.

# genfstab -U /mnt >> /mnt/etc/fstab

chroot環境における各種設定

chrootとは見かけ上のルートディレクトリを変更するコマンドです.これを用いて,新しくインストールしたシステムを疑似的に操作し設定を行います.詳しくはここを参照してください.

下のコマンドを実行して,/mntすなわち/dev/sda1をルートとしたchroot環境に入ります.

# arch-chroot /mnt

タイムゾーンの設定

シンボリックリンクを作成してタイムゾーンを設定します.日本以外に設定する場合は/Asia/Tokyoの部分を適宜書き換えてください.

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

時刻を設定します.

# hwclock -w --utc

ロケールの設定

/etc/locale.genを編集して,使用するロケールをアンコメントします.
vim /etc/locale.genを実行し,en_US.UTF-8 UTF-8ja_JP.UTF-8 UTF-8の前の#を削除して上書き保存します.
その後ロケールを生成します.

# locale-gen

LANG環境変数を設定します.

# echo LANG=en_US.UTF-8 > /etc/locale.conf
# export LANG=en_US.UTF-8

コンソールの設定

キーマップの設定を永続化します. vim /etc/vconsole.confを実行し,以下のように記述します.

KEYMAP=jp106

ネットワークの設定

ホスト名を設定します./etc/hostnameにホスト名を記述します.ここではarch-vboxとします.

# echo arch-vbox > /etc/hostname

/etc/hostsを設定します.vim /etc/hostsを実行し,下を追記します.

127.0.0.1   localhost
::1         localhost
127.0.1.1   arch-vbox.localdomain   arch-vbox

initramfsの作成

initramfsとはシステムが起動するときに一時的なルートファイルシステムをRAMに読み込むために用いる方式です.以下のコマンドを実行しinitramfsを生成します.

# mkinitcpio -p linux

途中モジュールaic94xxwd719xに対し警告が出るかもしれませんが問題ありません.

GRUBのインストール

ブートローダであるGRUBをインストールします.ハードディスク/dev/sdaにインストールする場合以下のようにします.

# grub-install /dev/sda

No error reported.と表示されれば成功です.
続いてGRUBの設定ファイルを生成します.設定は/boot/grub/grub.cfgに記述されます.

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

rootパスワードの設定

rootにパスワードを設定します.passwdを実行し,設定したいパスワードを入力してください.

chroot環境から出て再起動する

以上で基本的な設定が完了したので,chrootを抜けて再起動します.
exitchrootを抜けます.続いてumount /mntでハードディスクをアンマウントします.

rebootで再起動し,仮想マシン光学ドライブからISOファイルの割り当てを除去しておきます.
次からはハードディスクにインストールしたArch Linuxを起動し設定を行っていきます.

再起動後の設定

仮想マシンを再起動するとハードディスクからGRUBが読み込まれ,そのままArch Linuxが起動すると思います.正常に起動しなかった場合はこれまでの手順を確認してください.

ログインプロンプト(下の画面)が表示されたら,login: のあとにrootを入力してEnterを押し,パスワードを入力してログインします.パスワードは印字されませんがそのまま入力してEnterを押してください.

f:id:a3VtYQ2e9uA1:20200722224046p:plain
Archのログインプロンプト

プロンプトが表示されればログイン成功です.
ただ,この状態ではネットワークに接続できていません.インストールのときはISOから起動したシステムが自動で設定してくれていたわけですが,今回はハードディスクからの起動でまだその設定を行っていないからです.ということで設定していきます.

ネットワークの設定

まず,ip linkを実行してネットワークアダプタを調べます.私の環境では下のような出力でした.

f:id:a3VtYQ2e9uA1:20200722224139p:plain
ip linkの出力.loとenp0s3が存在することが分かる

ここから,loenp0s3という2つのアダプタがあることが分かります.仮想マシンに設定しているNATはenp0s3なので,これを設定します.

ネットワークの設定にはnetctlというソフトウェアを利用します./etc/netctl/下にプロファイルを置いておくことで,netctlはプロファイルをもとに自動で設定してくれます.

まず,例をもとにプロファイルを作ります./etc/netctl/examples/にプロファイルの例が置いてあるので,それを/etc/netctl/にコピーして利用します.今回設定するプロファイル名はmy_profileとしておきます.

# cp /etc/netctl/example/ethernet-dhcp /etc/netctl/my_profile

vim /etc/netctl/my_profileを実行しこれを書き換えます.
2行目の

Interface=eth0

の部分を

Interface=enp0s3

に置き換え,上書き保存します.

作成したプロファイルを使って接続を開始します.

# netctl start my_profile

しばらく待ってip addrpingを実行すれば,IPアドレスが割り当てられインターネットに接続できるようになっていると思います.
以下を実行すれば,OS起動時に自動的に接続が開始されます.

# netctl enable my_profile

ユーザの追加

いつまでもrootで操作するのは安全上好ましくありません.よって一般ユーザを設定します.ここではユーザ名とグループ名をtaroとします.

まずtaroグループを追加します.

# groupadd taro

次にtaroというユーザを追加します.

# useradd -s /bin/bash -g taro -m taro

useraddコマンドのオプションの意味は次の通りです.

  • -s /bin/bash : ログインシェルを/bin/bashとする
  • -g taro : ユーザのグループをtaroとする
  • -m : ユーザのホームディレクトリを作成する(/home/taro)
  • taro : ユーザ名はtaroとする

続いてtaroのパスワードを設定します.以下を実行しパスワードを設定します.

# passwd taro

さて,パッケージをインストールする等システムに重大な影響を与える操作を行う際はroot権限が必要になります.しかしパッケージをインストールするのにいちいちrootでログインして操作するなんてことはやっていられないでしょう.そこで,taroとしてログインしている際にもsudoコマンドによって一時的にroot権限を与えられるようにします.

taroでsudoできるようにするためにはsudoersを編集します. sudoersを編集するためにはvisudoを用います.
visudoviがないと動かないため,vimviとすることにします.下を実行して,/usr/bin/vi/usr/bin/vimシンボリックリンクとします.

# ln -s /usr/bin/vim /usr/bin/vi

その後,visudoを実行して,ファイル中ほどの

root ALL=(ALL) ALL

という記述に続き以下のように追記します.操作はVimと同じです.

%taro ALL=(ALL) ALL

以上の操作によって,taroグループに属するユーザにrootと同等の権限を与えることができるようになりました.

一般ユーザでの操作

rootからログアウトしてtaroでログインします.logoutコマンドでログアウトすれば再びログインプロンプトが表示されるため,ユーザ名にtaro,パスワードにtaroのパスワードを指定してログインします.rootにおいてプロンプトの表示は#でしたが,taroでは$になっていると思います.

パッケージの操作

パッケージはpacmanで操作します.これにはroot権限が必要です.

インストールされているパッケージを全て更新するには以下を実行します.

$ sudo pacman -Syu

taroのパスワードが要求されるので,パスワードを入力してEnterを押せばパッケージの更新ができます.
ところで,初めてsudoを実行した場合,何やら文句が表示されたのちにパスワードが要求されると思います.

We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.

これは極めて重要なことなので心に留めておいて損はないと思います.

さて,パッケージをインストールするには以下を実行します.今回はneofetchというソフトをインストールしてみます.

$ sudo pacman -S neofetch

電源操作

shutdownreboot等のコマンドを実行する際にはroot権限が必要になります.したがってtaroにログインした状態で仮想マシンの電源を切るには下のように実行します.

$ sudo shutdown now

おまけ

/etc/vconsole.confに以下の記述を付け足しrebootすることで,コンソールフォントをスマートにできます.

FONT=Lat2-Terminus16

なお,このファイルの編集にはroot権限が必要です.

デフォルトのフォントでneofetchした際の出力は

f:id:a3VtYQ2e9uA1:20200722224241p:plain
デフォルトフォントでneofetch

の通りですが,Lat2-Terminus16では

f:id:a3VtYQ2e9uA1:20200722224302p:plain
スマートになった.気がする

となります.