LarkBoxにAlpine Linuxをインストール

May 17, 2023

linuxAlpineLinuxdocker

目次

はじめに

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 のマウントポイントをコメントアウトし、

/etc/fstab
#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にマウントポイント追加

/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に変更する

/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

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

~/.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の行がなければ追加します。

/etc/modules
ipv6

hostnameがlarkboxの場合、

/etc/hosts
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 を調べて設定します。

/etc/network/interfaces
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は適当に割り当てました。

/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

まとめ

LarkBoxにAlpineLinuxをインストールする方法を紹介しました。


Written by questions6768 who lives in Uji, Kyoto.