VirtualBoxにAlpine Linuxをインストールする

May 18, 2023

linuxAlpineLinuxVirtualBox

目次

はじめに

筆者はミニPC「Larkbox」にAlpine Linuxを入れて自宅サーバーにしています。ところが、Larkboxのストレージとして追加した中華製1TB SSDが大はずれで、4か月で使用不能となってしまいました。自宅サーバーが突然死する不便さが身に染みたので、もう1台サーバーを用意することにしました。とりあえず予備機なので、仮想環境でいいか、ということでVirtualBox上にAlpine Linux環境を作ることにしました。

せっかくVirtualBoxで動作させるのですから、調子に乗ってデスクトップ環境まで入れてみました。

本記事は、VirtualBox上にAlpine Linuxをインストールした際の備忘録です。

仮想マシンの設定

VirtualBoxを起動し、
仮想マシン(M)> 新規(N)…
により新規vmを作成。

VirtualBox1.png

「仮想ハードディスクの作成」でディスクサイズを指定。Alpine Linux自体は2GB~4GBでも動作すると思いますが、dockerを使ってアプリを起動させようとするとイメージの分だけディスクが必要になるので、本格的に使うなら256GBくらいはあったほうがよいと思います。

VirtualBox2.png

メモリは4GBは割り当てたいところ。インストーラーから起動するように、起動順序を変更し、「光学」を先頭にしておきます。

VirtualBox3.png

プロセッサは稼働させるPCリソースに応じて適宜に。

VirtualBox4.png

デスクトップ環境を入れる予定なので、ビデオメモリーはmaxに。コントローラーはVMSVGA推薦のようだけど、VNOXSVGAにすると、デスクトップ環境を入れたときに、より多彩な解像度を選べる。

VirtualBox5.png

ストレージには、インストールメディアのisoイメージを追加しておきます。isoイメージはここからEXTENDED(x86_64)パッケージを入手します。STANDARDパッケージでもいいのですが、STANDARDは最小限すぎて使いずらいです。

VirtualBox6.png

独立したサーバとして使用するので、ネットワークはブリッジアダプターを選択します。mac版のVirtualBoxでブリッジアダプターを使用する場合は、アダプタータイプを「準仮想化ネットワーク」にしないと、ネットワークが遅くて使い物になりません。

VirtualBox7.png

USB3.0 を有効に。

VirtualBox8.png

以上の設定を終えたら、vmを起動。

Alpine Linuxのインストール

vmを起動すると、インストーラーが起動します。

VirtualBox9.png

root(パスワード無)でログインします。

Welcome to Alpine Linux 3.17
Kernel 5.15.104-0-lts on an x86_64 (/dev/tty1)

localhost login: root

以下のコマンドで、インストールを開始。

# setup-alpine

Alpine Linuxのインストーラは、メジャーなデストリビューションのインストーラのようにいけてない。1つ1つ対話的に設問に応答していく必要があります。

インストール時の応答は以下。

Select keyboard layout: jp
Available variants: jp
Enter system hostname: alpine
Which one do you want to initialize?: eth0
Ip address for eth0: 192.168.1.xx
Netmask?: 255.255.255.0
Gateway: 192.168.1.1
DNS domain name? home.arpa
DNS nameserver(s)?: 192.168.1.1
New password: *******
Retype Password: *******
Which timezone are you in?: Asia/Tokyo
HTTP/FTP proxy URL?: none
Which NTP client to run? (‘busybox’, ‘openntpd’, ‘chrony’, or ‘none’):chrony
Enter mirror number (1-43) or URL to add: 1
Setup a user? (enter a lower-case koginname, or 'no') [no] my_login_name
Full name for user my_login_name [my_login_name] My Full Name
Changing password for my_login_name
New Password: *******
Retype password: *******
Which SSH server? (‘openssh’, ‘dropbear’ or ‘none’): openssh
Which disk(s) would you like to use?: sda
How would you like to use it?: sys 

一旦電源OFF。

# poweroff

shutdownじゃないんだね。

インストールの続き

インストールメディアを抜いて、起動順序をハードディスクを先頭に変更して、再度vmを起動。 再びrootでログイン。こんどは、先ほど設定したパスワードが必要。ここで、パスワードが不要だったら、インストールメディアをアンマウントし忘れてませんか?

ログイン後、念のため、ネットワークがつながっていることを確認。

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:d6:78:f8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.xx/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 scope global dynamic flags 100
       valid_lft 14367sec preferred_lft 12567sec
    inet6 fe80::a00:27ff:fed6:78f8/64 scope link
       valid_lft forever preferred_lft forever

パッケージのリポジトリを更新しておきます。

/etc/apk/repositoriesのコメントアウトをはずす。dockerを使う場合はv3.17/communityだけはずす。デスクトップ環境を使用する場合は全部はずす。

/etc/apk/repositories
#/media/cdrom/apks
http://dl-cdn.alpinelinux.org/alpine/v3.17/main
http://dl-cdn.alpinelinux.org/alpine/v3.17/community
http://dl-cdn.alpinelinux.org/alpine/edge/main
http://dl-cdn.alpinelinux.org/alpine/edge/community
http://dl-cdn.alpinelinux.org/alpine/edge/testing

次のコマンドで更新。

# apk update
# apk upgrade

sudo の許可

# apk add sudo
# visudo
# %wheel ALL=(ALL) ALL

%wheel ALL=(ALL) ALL

に変更

自分のログインアカウントをwheelに追加

# addgroup  自分のログインアカウント wheel

ここまできたら、コンソールではなく、sshで別のターミナルから自分のアカウントで接続可能になります。 以降、sshで接続した端末から、

$ sudo su

でルート権限を得て続行できます。

環境整備

いつも使う環境にしておく。

Dockerを入れる

# apk add --no-cache docker docker-cli-compose
# service docker start
# rc-update add docker boot

自分のログインアカウントをdockerグループに入れておく

# addgroup ログインアカウント docker

Alpine Linuxのデフォルトのシェルはashなのでbashにする。

bashのインストール。

# apk add bash-completion

/etc/passwdのログインシェルをashから使い慣れたbashに変更する

/etc/passwd
root:x:0:0:root:/root:/bin/bash
   ...
自分のアカウント:x:1001:1001:Linux User,,,:/home/自分のアカウント:/bin/bash
   ...

ホームディレクトリに.bashrcを置く。

.bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
#export PS1="[\w]\\$ "
export PS1="\[\e[32m\][\w]\[\e[0m\]\\$ "
alias vi='vim'
alias cls='clear'
alias ll='ls -l --color=auto'
date

ホームディレクトリに.bash_profileを置く。

.bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

vimのインストール

# apk add vim

vimでマウスを使用しない設定

.vimrc
set mouse-=a

サーバとして使うだけならこれで完成。

あとは、必要に応じてアプリを入れていく。本サイトでは、以下のアプリのインストール手順の記事を置いてます。

引き続き、調子に乗ってデスクトップ環境を入れる。

デスクトップ環境の構築

デスクトップ環境のインストール

Alpine Linux用のデスクトップ環境Xfceを入れます。

apkリポジトリのコメントアウトを外す。

/etc/apk/repositories
#/media/cdrom/apks
http://dl-cdn.alpinelinux.org/alpine/v3.17/main
http://dl-cdn.alpinelinux.org/alpine/v3.17/community
http://dl-cdn.alpinelinux.org/alpine/edge/main
http://dl-cdn.alpinelinux.org/alpine/edge/community
http://dl-cdn.alpinelinux.org/alpine/edge/testing
# apk update
# apk upgrade --update-cache --available

パッケージのインストール

# setup-xorg-base xfce4 xfce4-terminal lightdm-gtk-greeter xfce4-screensaver dbus-x11

VirtualBox用Videoパッケージのインストール

# apk add xf86-video-vboxvideo xf86-video-vesa

マウスのゲストーホスト間のシームレスな移動、共有フォルダーのマウント等の便利機能

# apk add virtualbox-guest-additions virtualbox-guest-modules-virt

ここで以下のようなエラーが出た場合は、apkリポジトリを変更する必要あり。どうもVirtualBox用Videoパッケージを置いていないミラーサイトもあるようだ。

ERROR: unable to select packages:
  virtualbox-guest-modules-virt (no such package):
    required by: world[virtualbox-guest-modules-virt]

/etc/modulesを修正

/etc/modules
af_packet
ipv6
vboxpci
vboxdrv
vboxnetflt

Inputパッケージのインストール

# apk add xf86-input-mouse xf86-input-keyboard

キーボードレイアウト

# apk add setxkbmap

日本語キーボードのキーマップを使用する場合は、xorg.confを設定する

/etc/X11/xorg.conf
Section "InputClass"
	Identifier	"Keyboard Default"
	MatchIsKeyboard	"yes"
	Option		"XkbLayout" "jp"
EndSection

dbus開始

# rc-update add dbus

デスクトップのアイコンを入れる

# apk add faenza-icon-theme

ログイン画面をカスタマイズ

SLiM - Simple Login Manager

# apk add slim
# apk add slim-themes

デスクトップ環境開始

# rc-update add lightdm

または

# rc-update add slim

lightdmは何の変哲もないログイン画面だけど、slimはカッコいい!

slim_login.png

SLiMのテーマ一覧

$ ls  /usr/share/slim/themes/
alpinelinux          fingerprint          lunar                rainbow              wave
capernoited          flat                 mindlock             rear-window          zenwalk
debian-moreblue      flower2              parallel-dimensions  scotland-road
default              lake                 previous             subway

テーマはslim.confで変更する。切り替わるのはログイン画面だけだけど。

/etc/slim.conf
    ...
# current theme, use comma separated list to specify a set to
# randomly choose from
current_theme       alpinelinux
    ...

デスクトップ便利機能

シャットダウンとリブート許可

# apk add elogind polkit-elogind

または

# apk add polkit consolekit2

fuse(独自ファイルシステム構築のライブラリ)をインストール

# apk add gvfs-fuse gvfs-smb
# apk add fuse-openrc
# rc-update add fuse

fuseを入れない場合、File Managerの表示は生のlinuxのファイルシステムのまま。

without_fuse.png

fuseを入れると、ComputerやNetworkやTrushなどが使用できる。

with_fuse.png

USBデバイスの自動マウント

# apk add thunar-volman udisks2

仕上げ

# apk update
# apk upgrade --update-cache --available
# poweroff

再起動するとデスクトップが立ち上がる。

desktop1.png

ディスプレイサイズは、
Applications>Settings>Display
で変更すればよい。

デスクトップの壁紙を変更するには、
Applications>Settings>Desktop
で変更すればよい。

デフォルトの壁紙置き場は、/usr/share/backgrounds/xfce/

desktop21.png

Webブラウザ

Webブラウザを入れてみたいのだが、、、

Chromeのオープンソース版という位置づけの、Chromiumがあったので試してみる

# apk add chromium
# apk add ttf-freefont

なんとなくよさげだが、フォントがないせいか、これだけでは日本語が豆腐マークになる。

googleの日本語フォントを入れる。

$ mkdir ./note
$ cd ./note
$ wget https://noto-website.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip
$ unzip NotoSansCJKjp-hinted.zip
$ cd ..
$ sudo mv note /usr/share/fonts
$ sudo fc-cache -fv

うまくいった。

chromium.png

サーバとしてならともかく、クライアントとして使えるかは未知数。

ドキュメント作成環境

筆者はviで十分だけど、必要に応じて、

# apk add leafpad
とか
# apk add emacs

leafpadはデスクトップ環境で使用するテキストエディタ

日本語入力 iBus-anthy をインストール

# apk add ibus-anthy dbus-x11 python2 python3 zenity

日本語キーボードに切り替える

$ setxkbmap jp

.bashrcに追記

.bashrc
export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODUEL=ibus

iBus 起動設定

Applications > Settings > Session and Startup > Applications Autostart

IBus Daemonエントリを追加

ibus.png

Applications > Settings > iBus Preferences > General

Ctrl+スペースで日本語入力に切り替わるようにする

ibus_pref1.png

Applications > Settings > iBus Preferences > Input Method

日本語入力と直接入力の切り替えができるようにする

ibus_pref2.png

デスクトップのカスタマイズ

Xfceでは、テーマを変更することにより、見栄えを変えることが可能です。

例えば、こんなかんじ。

xfce4-bigsur.png

これは長くなるんで別記事で紹介します。

IPv6対応

ここまで記載した記事は、ネットワークはIPv4で稼働することが前提でした。昨今自宅用のネット回線でIPoEが普及してきており、IPoE環境に移行した場合、IPv4シングルスタック前提のサーバでは不便が生じることも懸念されます。そこで、本節では、Alpine LinuxサーバをIPv4とIPv6両対応のデュアルスタック化する手順をまとめます。

変更するファイルは /etc/modules, /etc/hosts, /etc/network/interfaces の3つです。

たぶん最初から入っているとは思いますが、/etc/modulesにipv6の行がなければ追加します。

/etc/modules
ipv6

hostnameがalpineの場合、

/etc/hosts
127.0.0.1       larkbox
192.168.1.xx    larkbox larkbox.home.arpa
::1             localhost ipv6-localhost ipv6-loopback localhost.localdomain
fe00::0         ipv6-localnet
ff00::0         ipv6-mcastprefix
ff02::1         ipv6-allnodes
ff02::2         ipv6-allrouters
ff02::3         ipv6-allhosts

/etc/network/interfacesにIPv4とIPv6両方のネットワーク情報を定義します。IPv6プレフィックスが 2400:xxxx:yyyy:zzzz::/64とし、 ゲートウェイのIPv6グローバルアドレス 2400:xxxx:yyyy:zzzz:tttt:uuuu:vvvv:wwww を調べて設定します。

/etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 192.168.1.xx
        netmask 255.255.255.0
        gateway 192.168.1.1
iface eth0 inet6 static
        address 2400:xxxx:yyyy:zzzz::xx
        netmask 64
        gateway 2400:xxxx:yyyy:zzzz:tttt:uuuu:vvvv:wwww

以上設定後、再起動すればデュアルスタックサーバの設定が完了です。

動作確認

$ ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether hh:hh:hh:hh:hh:hh brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.xx/24 scope global wlan0
       valid_lft forever preferred_lft forever
    inet6 2400::xxxx:yyyy:zzzz::xx/64 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::iiii:jjjj:kkkk:llll/64 scope link
       valid_lft forever preferred_lft forever

次にdockerの動作環境をIPv6対応しておきます。fd6d:aaaa:bbbb:cccc::/64は適当に割り当てました。

/etc/docker/daemon.json
{
  "ipv6": true,
  "fixed-cidr-v6": "fd6d:aaaa:bbbb:cccc::/64"
}

設定後、再起動。

あとはIPv6対応が必要なコンテナを生成するためのdocker-compose.ymlの記述に以下を追記。

docker-compose.yml
  ...
  
networks:
  default:
    enable_ipv6: true
    ipam:
      config:
        - subnet: fd6d:aaaa:bbbb:dddd::/64
          gateway: fd6d:aaaa:bbbb:dddd::1

まとめ

VirtualBox6.1上にAlpine Linuxをインストールする方法を紹介しました。


Written by questions6768 who lives in Uji, Kyoto.