LarkBoxにAlpine Linuxをインストール
May 17, 2023
linux AlpineLinux docker目次
はじめに
LarkBoxのOSはAlpine Linuxとし、dockerと必要最小限のアプリだけ動かすようにします。他に必要なアプリは全てdocker-composeで動かすようにします。
本記事は、LarkBoxにAlpine Linuxをインストールした際の手順の備忘録です。
Alpine Linuxのインストール
Alpine LinuxのサイトからEXTENDEDパッケージをダウンロードし、インストールします。はじめは、STANDARDパッケージをインストールしようとしたのだけど、STANDARDパッケージは最小限すぎてpingすら入っていない状態であまりにも使いにくい。Alpine Linuxに対して、128GBのストレージはあまりにも広大なので、ここはEXTENDEDパッケージのほうがいいと思う。
ダウンロードしたISOファイルalpine-extended-3.17.3-x86_64.isoをUSBメモリに焼いて、そこからブートします。
Windows上でISOファイルをUSBメモリに焼くには、Rufusなどのツールを使用すればよい。
ブートしたら、rootでログインします。(rootのパスワードは無し)
Welcome to Alpine Linux 3.17
Kernel 5.15.104-0-lts on an x86_64 (/dev/tty1)
localhost login: root
で、Alpine Linuxのインストール開始。
# setup-alpine
によりインストールを開始します。Alpine Linuxのインストーラは、メジャーなデストリビューションのインストーラのようにいけてない。1つ1つ対話的に設問に応答していく必要があります。
LarkboxのeMMCにはWindows Homeがプリインストールされていたが、迷わず削除。ここにルートとswapを置き、SSD1TBに/var(150GB)と /home(850GB)を置くことにします。直接インストールするのはdockerだけで、必要なアプリはdocker-composeでインストールするように考えています。そのため、dockerが使う/varは大き目に確保することとします。 ルートは遅いeMMCではなく、SSDに入れるべきという考えもあると思う。当方もそう思いやってはみたもののあまり変わらなかったので、eMMCがルートで大丈夫だと思う。
インストール時の応答は以下。
Select keyboard layout: jp
Available variants: jp
Enter system hostname: larkbox
Which one do you want to initialize?: wlan0
Type the wireless network name to connect to: *******
Type the "*******" network Pre-Shared Key: *******
Ip address for wlan0: 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
TP/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
New Password:
Retype password:
Which SSH server? (‘openssh’, ‘dropbear’ or ‘none’): openssh
Which disk(s) would you like to use?: mmcblk0
How would you like to use it?: sys
一旦電源OFF。
# poweroff
shutdownじゃないんだね。
インストールの続き
USBメモリを抜いてeMMCからブートするようにBIOSの設定を変更。再びrootでログイン。今度は先ほど設定したパスワードが必要。あとは粛々とインストールを進める。
念のため、ネットワークがつながっていることを確認。
# ip a
パッケージのリポジトリを更新しておきます。
/etc/apk/repositoriesを以下のように修正
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
でルート権限を得て続行。
ネットワーク設定
最初の一連のインストールは setup-alpine スクリプトで行いましが、個別の項目だけインストールする /sbin/setup-xxxx スクリプトが用意されています。
例えば、インストールスクリプトのうち、ネットワークの設定部分は
# /sbin/setup-interfaces
により再設可能です。
ディスクの設定
初期のインストールでは、eMMCにルートとswapのパーティションを切り、システムをインストールしましたが、増設した1TB SSDは手つかずのまま。そこで、次に1TB SSDを有効化します。
# setup-disk
SSD1TBに/var(250GB)と /home(750GB)を置くように設定したいのですが、setup-diskスクリプトでは、1つのパーティションしか切れないようだ。
Available disks are:
sda (1024.2 GB ATA NT-1TB-TM )
Which disk(s) would you like to use? (or '?' for help or 'none') [sda]
How would you like to use it? ('sys', 'data', 'lvm' or '?' for help) [?] data
これで、ディスクどうなったか見てみると、
# df -h
Filesystem Size Used Available Use% Mounted on
devtmpfs 10.0M 0 10.0M 0% /dev
shm 3.8G 0 3.8G 0% /dev/shm
/dev/mmcblk0p3 110.2G 1.2G 103.4G 1% /
tmpfs 576.6M 228.0K 576.4M 0% /run
/dev/mmcblk0p1 511.0M 272.0K 510.7M 0% /boot/efi
/dev/sda2 934.0G 0 934.0G 0% /var
cgroup_root 10.0M 0 10.0M 0% /sys/fs/cgroup
SSD1TB(sda)に/varが作成された。 一旦/varパーティションを削除し、あらためて/var(250GB)と /home(750GB)を作成します。
GPTパーティション作成ツールを取得
# apk add -U gptfdisk sgdisk
パーティション再作成
# gdisk /dev/sda
により、/dev/sdaのパーティションを切りなおす。gdiskは会話形式でコマンドを入力する昔ながらのユーザインターフェース。
# gdisk /dev/sda
GPT fdisk (gdisk) version 1.0.5
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help):
まず、「p」コマンドで現在のパーティションテーブルを見てみる。
Command (? for help): p
Disk /dev/sda: 1953525168 sectors, 931.5 GiB
Model: M.2 2242-1TB SSD
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): F11ECC42-74C4-9F43-B19D-377D495AB597
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 2048, last usable sector is 1953525134
Partitions will be aligned on 2048-sector boundaries
Total free space is 0 sectors (0 bytes)
Number Start (sector) End (sector) Size Code Name
1 2048 8390655 4.0 GiB 8200
2 8390656 1953525134 927.5 GiB 8300
2つのパーティションが出来ているのがわかる。ちなみに、1つ目はswapで2つ目は/varにマウントされている。 「d」コマンドで2つのパーティションを削除。
Command (? for help): d
Partition number (1-2): 2
「p」コマンドで結果を確認。
Command (? for help): p
Disk /dev/sda: 1953525168 sectors, 931.5 GiB
Model: M.2 2242-1TB SSD
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): F11ECC42-74C4-9F43-B19D-377D495AB597
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 2048, last usable sector is 1953525134
Partitions will be aligned on 2048-sector boundaries
Total free space is 1945134479 sectors (927.5 GiB)
Number Start (sector) End (sector) Size Code Name
1 2048 8390655 4.0 GiB 8200
「n」コマンドで、新たに /var にマウントする150GBのパーティションを作成する。
Command (? for help): n
Partition number (2-128, default 2):
First sector (8390656-1953525134, default = 8390656) or {+-}size{KMGTP}:
Last sector (8390656-1953525134, default = 1953525134) or {+-}size{KMGTP}: +150GB
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'
「n」コマンドでさらにもう1つ、/home にマウントするパーティションを作成する。サイズは残り全て。
Command (? for help): n
Partition number (3-128, default 3):
First sector (322963456-1953525134, default = 322963456) or {+-}size{KMGTP}:
Last sector (322963456-1953525134, default = 1953525134) or {+-}size{KMGTP}:
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'
「p」コマンドで結果を確認。
Command (? for help): p
Disk /dev/sda: 1953525168 sectors, 931.5 GiB
Model: M.2 2242-1TB SSD
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): F11ECC42-74C4-9F43-B19D-377D495AB597
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 2048, last usable sector is 1953525134
Partitions will be aligned on 2048-sector boundaries
Total free space is 0 sectors (0 bytes)
Number Start (sector) End (sector) Size Code Name
1 2048 8390655 4.0 GiB 8200
2 8390656 322963455 150.0 GiB 8300 Linux filesystem
3 322963456 1953525134 777.5 GiB 8300 Linux filesystem
思い通りに出来たようだ。あとは「w」コマンドで書き出して終了。
Command (? for help): w
この時点で /var は今作成した /dev/sda3 に変わっているので、元に戻しておく。
ディスクの UUID を確認し、
# blkid
/dev/mmcblk0p3: UUID="4594ac58-ef59-420e-93f1-423b09cb92ee" TYPE="ext4"
/dev/mmcblk0p2: UUID="387d4b96-060b-4906-80a7-0c066015d468" TYPE="swap"
/dev/mmcblk0p1: UUID="801B-8E71" TYPE="vfat"
/dev/sda3: UUID="6fca045e-7ff5-48b4-98ff-ddaa479e01d4" TYPE="ext4"
/dev/sda2: UUID="edfd404f-4589-4316-916b-4bc974e0c457" TYPE="ext4"
/dev/sda1: UUID="6bd886d9-10d7-414b-88f9-f6c66d3aab72" TYPE="swap"
/etc/fstabの /var のマウントポイントをコメントアウトし、
#UUID=edfd404f-4589-4316-916b-4bc974e0c457 /var ext4 defaults 1 2
一旦リブートする。
# reboot
ディスクをフォーマット
# mkfs.ext4 /dev/sda2
# mkfs.ext4 /dev/sda3
ディスクの UUID を確認
# blkid
/dev/mmcblk0p3: UUID="4594ac58-ef59-420e-93f1-423b09cb92ee" TYPE="ext4"
/dev/mmcblk0p2: UUID="387d4b96-060b-4906-80a7-0c066015d468" TYPE="swap"
/dev/mmcblk0p1: UUID="801B-8E71" TYPE="vfat"
/dev/sda3: UUID="6fca045e-7ff5-48b4-98ff-ddaa479e01d4" TYPE="ext4"
/dev/sda2: UUID="edfd404f-4589-4316-916b-4bc974e0c457" TYPE="ext4"
/dev/sda1: UUID="6bd886d9-10d7-414b-88f9-f6c66d3aab72" TYPE="swap"
/etc/fstabにマウントポイント追加
UUID=edfd404f-4589-4316-916b-4bc974e0c457 /var ext4 defaults 1 2
UUID=6fca045e-7ff5-48b4-98ff-ddaa479e01d4 /home ext4 defaults 1 2
リブート
# reboot
確認
# df -h
Filesystem Size Used Available Use% Mounted on
devtmpfs 10.0M 0 10.0M 0% /dev
shm 2.8G 0 2.8G 0% /dev/shm
/dev/mmcblk0p3 110.2G 1.2G 103.3G 1% /
tmpfs 576.6M 228.0K 576.4M 0% /run
/dev/mmcblk0p1 511.0M 272.0K 510.7M 0% /boot/efi
/dev/sda2 232.7G 60.4M 220.8G 0% /var
/dev/sda3 700.2G 72.0M 664.5G 0% /home
cgroup_root 10.0M 0 10.0M 0% /sys/fs/cgroup
システムのインストール完了。
環境整備
いつも使う環境にしておく。
Dockerを入れる
# apk add --no-cache docker docker-compose
# service docker start
# rc-update add docker boot
もしapkでエラーだったら、先ほど/varを作り直したことが原因かもしれない。
# mkdir /var/cache
# mkdir /var/cache/apk
自分のログインアカウントをdockerグループに入れておく
# addgroup ログインアカウント docker
Alpine Linuxのデフォルトのシェルはashなのでbashにする。
bashのインストール。
# apk add bash-completion
/etc/passwdのログインシェルをashから使い慣れたbashに変更する
root:x:0:0:root:/root:/bin/bash
...
自分のアカウント:x:1001:1001:Linux User,,,:/home/自分のアカウント:/bin/bash
...
ホームディレクトリに.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
# 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
ホームディレクトリに.vimrcを置く。
set mouse-=a
これくらいかな。
インストールには、以下の記事を参考にしました。
https://qiita.com/mo_chiee/items/f539df1bd172f41bc85a
Alpine Linux 3.10.3インストール手順
https://qiita.com/tohka383/items/e7d758a6281fa45e5e16
Docker on Alpine Linux on VirtualBox
IPv6対応
ここまで記載した記事は、ネットワークはIPv4で稼働することが前提でした。昨今自宅用のネット回線でIPoEが普及してきており、IPoE環境に移行した場合、IPv4シングルスタック前提のサーバでは不便が生じることも懸念されます。そこで、本節では、Alpine LinuxサーバをIPv4とIPv6両対応のデュアルスタック化する手順をまとめます。
変更するファイルは /etc/modules, /etc/hosts, /etc/network/interfaces の3つです。
たぶん最初から入っているとは思いますが、/etc/modulesにipv6の行がなければ追加します。
ipv6
hostnameがlarkboxの場合、
127.0.0.1 localhost
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 を調べて設定します。
auto lo
iface lo inet loopback
auto wlan0
iface wlan0 inet static
address 192.168.1.xx
netmask 255.255.255.0
gateway 192.168.1.1
hostname larkbox
iface wlan0 inet6 static
address 2400:xxxx:yyyy:zzzz::xx
netmask 64
gateway 2400:xxxx:yyyy:zzzz:tttt:uuuu:vvvv:wwww
以上設定後、再起動すればデュアルスタックサーバの設定が完了です。
動作確認
$ ip a
2: wlan0: <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は適当に割り当てました。
{
"ipv6": true,
"fixed-cidr-v6": "fd6d:aaaa:bbbb:cccc::/64"
}
設定後、再起動。
あとはIPv6対応が必要なコンテナを生成するためのdocker-compose.ymlの記述に以下を追記。
...
networks:
default:
enable_ipv6: true
ipam:
config:
- subnet: fd6d:aaaa:bbbb:dddd::/64
gateway: fd6d:aaaa:bbbb:dddd::1
まとめ
LarkBoxにAlpineLinuxをインストールする方法を紹介しました。