====== LXC の追加 ======
\\
[[https://linuxcontainers.org/ja/lxc/introduction/|{{:max3xx_devel:customize_firmware:add_container_lxc:lxc_logo.png?400|LXC Containers}}]]
**コンテナ型仮想化環境**の中でも歴史の長い [[https://ja.wikipedia.org/wiki/LXC|LXC]] を入れてみます。
===== セットアップ =====
==== 準備 ====
[[max3xx_devel:customize_firmware:update_packages:start|]] でパッケージを更新しておきます。
==== LXC パッケージの追加 ====
**apt install** でパッケージを追加します。
root@max3xx-devel:/# apt install lxc lxc-templates lxc-utils
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
arch-test binutils binutils-aarch64-linux-gnu binutils-common bridge-utils busybox-static cloud-image-utils
debootstrap dirmngr distro-info dns-root-data dnsmasq-base fakechroot fakeroot genisoimage gnupg gnupg-l10n
gnupg-utils gpg gpg-agent gpg-wks-client gpg-wks-server gpgconf gpgsm ibverbs-providers libaio1 libassuan0
libbinutils libboost-iostreams1.74.0 libboost-thread1.74.0 libctf-nobfd0 libctf0 libcurl3-gnutls libdaxctl1
libdistro-info-perl libdpkg-perl libfakechroot libfakeroot libfile-fcntllock-perl libfuse3-3 libgdbm-compat4
libgdbm6 libgfapi0 libgfrpc0 libgfxdr0 libglusterfs0 libibverbs1 libiscsi7 libksba8 liblxc-common liblxc1
libmpdec3 libndctl6 libnpth0 libnuma1 libpam-cgfs libperl5.34 libpmem1 libpmemobj1 libpython3-stdlib
libpython3.10-stdlib librados2 librbd1 librdmacm1 liburing2 lxcfs media-types mmdebstrap perl perl-modules-5.34
pinentry-curses python3 python3.10 qemu-block-extra qemu-utils rsync uidmap uuid-runtime
Suggested packages:
binutils-doc mtools squid-deb-proxy-client debian-archive-keyring dbus-user-session pinentry-gnome3 tor shunit2
wodim cdrkit-doc parcimonie xloadimage scdaemon debian-keyring gcc | c-compiler patch git bzr fuse3 gdbm-l10n
qemu-user-static btrfs-tools lvm2 lxctl apt-transport-tor binfmt-support dpkg-dev genext2fs perl-doc proot
qemu-user squashfs-tools-ng libterm-readline-gnu-perl | libterm-readline-perl-perl make
libtap-harness-archive-perl pinentry-doc python3-doc python3-tk python3-venv python3.10-venv python3.10-doc
python3-braceexpand
The following packages will be REMOVED:
busybox
The following NEW packages will be installed:
arch-test binutils binutils-aarch64-linux-gnu binutils-common bridge-utils busybox-static cloud-image-utils
debootstrap dirmngr distro-info dns-root-data dnsmasq-base fakechroot fakeroot genisoimage gnupg gnupg-l10n
gnupg-utils gpg gpg-agent gpg-wks-client gpg-wks-server gpgconf gpgsm ibverbs-providers libaio1 libassuan0
libbinutils libboost-iostreams1.74.0 libboost-thread1.74.0 libctf-nobfd0 libctf0 libcurl3-gnutls libdaxctl1
libdistro-info-perl libdpkg-perl libfakechroot libfakeroot libfile-fcntllock-perl libfuse3-3 libgdbm-compat4
libgdbm6 libgfapi0 libgfrpc0 libgfxdr0 libglusterfs0 libibverbs1 libiscsi7 libksba8 liblxc-common liblxc1
libmpdec3 libndctl6 libnpth0 libnuma1 libpam-cgfs libperl5.34 libpmem1 libpmemobj1 libpython3-stdlib
libpython3.10-stdlib librados2 librbd1 librdmacm1 liburing2 lxc lxc-templates lxc-utils lxcfs media-types
mmdebstrap perl perl-modules-5.34 pinentry-curses python3 python3.10 qemu-block-extra qemu-utils rsync uidmap
uuid-runtime
0 upgraded, 81 newly installed, 1 to remove and 3 not upgraded.
Need to get 31.5 MB of archives.
After this operation, 138 MB of additional disk space will be used.
Do you want to continue? [Y/n]
Do you want to continue? [Y/n]
Get:1 http://ports.ubuntu.com/ubuntu-ports jammy/main arm64 busybox-static arm64 1:1.30.1-7ubuntu3 [920 kB]
Get:2 http://ports.ubuntu.com/ubuntu-ports jammy/main arm64 media-types all 7.0.0 [25.5 kB]
Get:3 http://ports.ubuntu.com/ubuntu-ports jammy/main arm64 libmpdec3 arm64 2.5.1-2build2 [89.0 kB]
Get:4 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main arm64 libpython3.10-stdlib arm64 3.10.6-1~22.04.2ubuntu1 [1828 kB]
....
Setting up liblxc1 (1:5.0.0~git2209-g5a7b9ce67-0ubuntu1) ...
Setting up lxc-utils (1:5.0.0~git2209-g5a7b9ce67-0ubuntu1) ...
Created symlink /etc/systemd/system/multi-user.target.wants/lxc-monitord.service → /lib/systemd/system/lxc-monitord.s
ervice.
Created symlink /etc/systemd/system/multi-user.target.wants/lxc-net.service → /lib/systemd/system/lxc-net.service.
Created symlink /etc/systemd/system/multi-user.target.wants/lxc.service → /lib/systemd/system/lxc.service.
Setting up lxc dnsmasq configuration.
Setting up lxc (1:5.0.0~git2209-g5a7b9ce67-0ubuntu1) ...
Setting up lxc-templates (3.0.4-5) ...
Setting up liblxc-common (1:5.0.0~git2209-g5a7b9ce67-0ubuntu1) ...
Processing triggers for dbus (1.12.20-2ubuntu4.1) ...
Processing triggers for initramfs-tools (0.136ubuntu6.7) ...
Processing triggers for libc-bin (2.35-0ubuntu3.1) ...
root@max3xx-devel:/#
\\
==== MA-X3xx 環境向け改変版パッケージのインストール ====
MA-X3xx の動作環境でうまく動作しない部分((DNS Server として pdnsd が起動しているので、dnsmasq の DNS 機能を無効化する必要があります))と、テンプレート((Alpine Linux のテンプレートが壊れていて、コンテナが作成できません))が壊れている部分を修正したパッケージを、入れ替える形でインストールします。
^ File ^ STAT ^ SHA1SUM ^ Note |
|{{ :max3xx_devel:customize_firmware:add_container_lxc:lxc-templates_3.0.4-5_arm64.deb |}}|2023/04/13 14:04 84.9 KB|62fabf8ed0fe11d7f2d957e512822ae3f6db6aba|Alpine Linux テンプレート修正|
|{{ :max3xx_devel:customize_firmware:add_container_lxc:lxc-utils_5.0.0_git2209-g5a7b9ce67-0ubuntu1_arm64.deb |}} |2023/04/13 14:04 443.4 KB|61df5c3fa823ac6f37a2743483258ad89caad916|dnsmasq, iptables 変更|
\\
==== データ領域 mount 設定の追加 (Optional) ====
LXC の仮想環境は **/var/lib/lxc** 以下に配置されるため、起動時に eMMC/SD/SSD など((使用するデバイスは環境により選択してください))の領域を /var/lib/lxc に mount する設定をしておきます。
root@max3xx-devel:/etc/systemd/system# nano -w var-lib-lxc.mount
[Unit]
Description=LXC eMMC
[Mount]
What=/dev/mmcblk0p2
Where=/var/lib/lxc
Type=ext4
Options=noatime
[Install]
WantedBy=multi-user.target
※ **What** の部分を mount するデバイスに応じて変更してください。
\\
**.mount** ファイルを保存したら、自動で mount するように設定しておきます。
root@max3xx-devel:/etc/systemd/system# systemctl enable var-lib-lxc.mount
Created symlink /etc/systemd/system/multi-user.target.wants/var-lib-lxc.mount → /etc/systemd/system/var-lib-lxc.mount.
root@max3xx-devel:/etc/systemd/system#
\\
==== ファームウェアの作成/実機への適用 ====
[[max3xx_devel:build_firmware:start|]] の手順でファームウェアを作成し、実機のファームウェアを更新します。
user1@max3xx-devel:~/work$ sudo ./build_firm.sh -k ../src/linux-kernel -r max3xx_jammy_rootfs -o firmware/lxc_firmware.img
....
adding: k3-am642-centurysys-metis-ext-02.dtbo (deflated 77%)
adding: k3-am642-centurysys-metis-mod-01.dtbo (deflated 52%)
adding: k3-am642-centurysys-metis-mod-02.dtbo (deflated 52%)
* Firmware filename: /home/user1/work/firmware/lxc_firmware.img
Archive: /home/user1/work/firmware/lxc_firmware.img
Length Method Size Cmpr Date Time CRC-32 Name
-------- ------ ------- ---- ---------- ----- -------- ----
1404928 Stored 1404928 0% 2023-04-13 10:37 f4443553 kmod.img
4231352 Stored 4231352 0% 2023-04-13 10:38 01c418ba initramfs.img
113537024 Stored 113537024 0% 2023-04-13 10:37 829762e9 rootfs.img
17172488 Defl:N 7284572 58% 2023-04-13 10:37 1fb808bf kernel.img
143194 Defl:N 32634 77% 2023-04-13 10:37 3f4db7a3 .config
54817 Defl:N 12585 77% 2023-04-13 10:37 70571b03 k3-am642-centurysys-metis-00.dtb
55231 Defl:N 12691 77% 2023-04-13 10:37 9cf86377 k3-am642-centurysys-metis-01.dtb
7132 Defl:N 1662 77% 2023-04-13 10:37 b006b511 k3-am642-centurysys-metis-ext-01.dtbo
7838 Defl:N 1834 77% 2023-04-13 10:37 24ce757a k3-am642-centurysys-metis-ext-02.dtbo
579 Defl:N 280 52% 2023-04-13 10:37 045db4c9 k3-am642-centurysys-metis-mod-01.dtbo
579 Defl:N 280 52% 2023-04-13 10:37 045db4c9 k3-am642-centurysys-metis-mod-02.dtbo
-------- ------- --- -------
136615162 126519842 7% 11 files
done.
please remove working directory '/home/user1/work/build_1681349838' manually.
user1@max3xx-devel:~/work$
user1@max3xx-devel:~/work$ ls -l firmware/
total 216328
-rw-r--r-- 1 root root 94987000 Apr 12 18:00 firmware.img
-rw-r--r-- 1 root root 126521792 Apr 13 10:38 lxc_firmware.img <---- 通常より 30MiB ほど大きい
user1@max3xx-devel:~/work$
\\
{{:max3xx_devel:customize_firmware:add_container_lxc:lxc_firmware_00.png|}}
\\
=== LXC インストール済みファームウェア ===
[[download_software:max3xx:max3xx_lxc_firmware:start|]] に置いてあります。
\\
===== コンテナの作成 =====
ファームウェアを更新して再起動し、実機に SSH でログインします。
==== テンプレートの確認 (Optional) ====
LXC はテンプレートから作成するのが簡単なので、テンプレート一覧を確認してみます。
root@metis:~# ls /usr/share/lxc/templates/
lxc-alpine lxc-centos lxc-fedora lxc-oci lxc-plamo lxc-sparclinux lxc-voidlinux
lxc-altlinux lxc-cirros lxc-fedora-legacy lxc-openmandriva lxc-pld lxc-sshd
lxc-archlinux lxc-debian lxc-gentoo lxc-opensuse lxc-sabayon lxc-ubuntu
lxc-busybox lxc-download lxc-local lxc-oracle lxc-slackware lxc-ubuntu-cloud
MA-X3xx のアーキテクチャ((ARM64)) では使用できないテンプレート((例えば、sparclinux))も含まれていますが、Alpine Linux や本体と同じ Ubuntu などが使えます。
\\
==== コンテナの作成 ====
試しに、軽量の Alpine Linux のテンプレートを使用してコンテナを作成してみます。
root@metis:~# lxc-create -n alpine -t alpine -- -r edge
Obtaining an exclusive lock... done
==> Fetching and/or verifying APK keys
alpine-devel@lists.alpinelinux.org-4a6a0840.rsa.pub: OK
alpine-devel@lists.alpinelinux.org-5243ef4b.rsa.pub: OK
alpine-devel@lists.alpinelinux.org-524d27bb.rsa.pub: OK
alpine-devel@lists.alpinelinux.org-5261cecb.rsa.pub: OK
alpine-devel@lists.alpinelinux.org-58199dcc.rsa.pub: OK
alpine-devel@lists.alpinelinux.org-58cbb476.rsa.pub: OK
alpine-devel@lists.alpinelinux.org-58e4f17d.rsa.pub: OK
alpine-devel@lists.alpinelinux.org-5e69ca50.rsa.pub: OK
alpine-devel@lists.alpinelinux.org-60ac2099.rsa.pub: OK
alpine-devel@lists.alpinelinux.org-6165ee59.rsa.pub: OK
alpine-devel@lists.alpinelinux.org-61666e3f.rsa.pub: OK
alpine-devel@lists.alpinelinux.org-616a9724.rsa.pub: OK
alpine-devel@lists.alpinelinux.org-616abc23.rsa.pub: OK
alpine-devel@lists.alpinelinux.org-616ac3bc.rsa.pub: OK
alpine-devel@lists.alpinelinux.org-616adfeb.rsa.pub: OK
alpine-devel@lists.alpinelinux.org-616ae350.rsa.pub: OK
alpine-devel@lists.alpinelinux.org-616db30d.rsa.pub: OK
Obtaining an exclusive lock... done
==> Installing Alpine Linux in /var/lib/lxc/alpine/rootfs
(1/25) Installing alpine-baselayout-data (3.4.0-r0)
(2/25) Installing musl (1.2.3_git20230322-r3)
(3/25) Installing busybox (1.36.0-r7)
Executing busybox-1.36.0-r7.post-install
(4/25) Installing busybox-binsh (1.36.0-r7)
(5/25) Installing alpine-baselayout (3.4.0-r0)
Executing alpine-baselayout-3.4.0-r0.pre-install
Executing alpine-baselayout-3.4.0-r0.post-install
(6/25) Installing ifupdown-ng (0.12.1-r2)
(7/25) Installing libcap2 (2.68-r2)
(8/25) Installing openrc (0.46-r4)
Executing openrc-0.46-r4.post-install
(9/25) Installing mdev-conf (4.4-r0)
(10/25) Installing busybox-mdev-openrc (1.36.0-r7)
(11/25) Installing alpine-conf (3.15.1-r2)
(12/25) Installing alpine-keys (2.4-r1)
(13/25) Installing alpine-release (3.18_alpha20230329-r0)
(14/25) Installing ca-certificates-bundle (20230106-r1)
(15/25) Installing libcrypto3 (3.1.0-r3)
(16/25) Installing libssl3 (3.1.0-r3)
(17/25) Installing ssl_client (1.36.0-r7)
(18/25) Installing zlib (1.2.13-r1)
(19/25) Installing apk-tools (2.14.0_rc1-r0)
(20/25) Installing busybox-openrc (1.36.0-r7)
(21/25) Installing busybox-suid (1.36.0-r7)
(22/25) Installing scanelf (1.3.7-r1)
(23/25) Installing musl-utils (1.2.3_git20230322-r3)
(24/25) Installing libc-utils (0.7.2-r4)
(25/25) Installing alpine-base (3.18_alpha20230329-r0)
Executing busybox-1.36.0-r7.trigger
OK: 13 MiB in 25 packages
==> Container's rootfs and config have been created
Edit the config file /var/lib/lxc/alpine/config to check/enable networking setup.
The installed system is preconfigured for a loopback and single network
interface configured via DHCP.
To start the container, run "lxc-start -n alpine".
The root password is not set; to enter the container run "lxc-attach -n alpine".
root@metis:~#
\\
コンテナのリストを確認してみます。
root@metis:~# lxc-ls --fancy
NAME STATE AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED
alpine STOPPED 0 - - - false
root@metis:~#
\\
==== コンテナの起動 ====
作成したコンテナを起動してみます。
root@metis:~# lxc-start -n alpine
root@metis:~#
起動したようです。DHCP でアドレスを取得するまで少し時間をおいてから、再びコンテナのリストを確認してみます。
root@metis:~# lxc-ls --fancy
NAME STATE AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED
alpine RUNNING 0 - 10.0.3.197 - false
root@metis:~#
状態が **"RUNNING"**、アドレス 10.0.3.197 で起動していることが確認できました。
\\