概要:
LXC は、Linux カーネルのコンテナ機能のユーザースペースインターフェースであるオペレーティングシステムレイヤの仮想化技術です。アプリケーションソフトウェアシステムをソフトウェアコンテナにパッケージ化し、アプリケーションソフトウェア自体のコードと必要なオペレーティングシステムのコアおよびライブラリを含みます。
1. カーネルのコンパイル#
1.1. カーネル設定の調整#
このリポジトリを使用して設定を簡単に追加します
git fetch https://github.com/lateautumn233/android_kernel_docker main
git merge -s ours --no-commit --allow-unrelated-histories --squash FETCH_HEAD
git read-tree --prefix=docker -u FETCH_HEAD
echo "source \"docker/Kconfig\"" >> arch/arm64/Kconfig
git commit -m -a "Imported docker/ from https://github.com/lateautumn233/android_kernel_docker"
その後、自分でコンパイルします
🥵🥵🥵
1.2. カーネルパッチ#
- 可能性のある panic 状況を修正
--- orig/net/netfilter/xt_qtaguid.c 2020-05-12 12:13:14.000000000 +0300
+++ my/net/netfilter/xt_qtaguid.c 2019-09-15 23:56:45.000000000 +0300
@@ -737,7 +737,7 @@
{
struct proc_iface_stat_fmt_info *p = m->private;
struct iface_stat *iface_entry;
- struct rtnl_link_stats64 dev_stats, *stats;
+ struct rtnl_link_stats64 *stats;
struct rtnl_link_stats64 no_dev_stats = {0};
@@ -745,13 +745,8 @@
current->pid, current->tgid, from_kuid(&init_user_ns, current_fsuid()));
iface_entry = list_entry(v, struct iface_stat, list);
+ stats = &no_dev_stats;
- if (iface_entry->active) {
- stats = dev_get_stats(iface_entry->net_dev,
- &dev_stats);
- } else {
- stats = &no_dev_stats;
- }
/*
* If the meaning of the data changes, then update the fmtX
* string.
- cgroup に cpuset プレフィックスが欠けているのを修正
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -3786,6 +3786,10 @@ static int cgroup_add_file(struct cgroup_subsys_state *css, struct cgroup *cgrp,
cfile->kn = kn;
spin_unlock_irq(&cgroup_file_kn_lock);
}
+ if (cft->ss && (cgrp->root->flags & CGRP_ROOT_NOPREFIX) && !(cft->flags & CFTYPE_NO_PREFIX)) {
+ snprintf(name, CGROUP_FILE_NAME_MAX, "%s.%s", cft->ss->name, cft->name);
+ kernfs_create_link(cgrp->kn, name, kn);
+ }
return 0;
}
具体的なカーネルのコンパイル
以下省略 n 字
2. termux で lxc をインストールする#
pkg update && pkg install root-repo && apt install lxc tsu
2.1. lxc コンテナの設定と起動#
まず、cgroup をマウントする必要があります
tsu
mount -t tmpfs -o mode=755 tmpfs /sys/fs/cgroup
mkdir -p /sys/fs/cgroup/devices
mount -t cgroup -o devices cgroup /sys/fs/cgroup/devices
lxc-setup-cgroups #必要ないかもしれません
コンテナを作成します
# 作成前にネットワーク設定を変更してください
以下の2.1を参照してネットワークを設定します
lxc-create -t download -n my-container -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images --no-validate
# 順にディストリビューション バージョン アーキテクチャを入力します
# その後、起動します
lxc-start -n my-container -d -F
# すぐにエラーが表示されました
#Failed to mount cgroup at /sys/fs/cgroup/systemd: Operation not permitted
#[!!!!!!] Failed to mount API filesystems.
#Exiting PID 1...
# 解決策1
echo "lxc.init.cmd = /sbin/init systemd.unified_cgroup_hierarchy=0" >> $PREFIX/share/lxc/config/common.conf.d/systemd.conf
# 解決策2
mkdir -p /sys/fs/cgroup/systemd && mount -t cgroup cgroup -o none,name=systemd /sys/fs/cgroup/systemd
lxc コンテナのパスワードを調整します
chroot path /bin/su -
lxc-attach -n my-container passwd
コンテナ内で dns 解決を設定します
echo -e "[Match]\nName=wlan0\n\n[Network]\nDHCP=yes\n\n[DHCP]\nRouteMetric=120" \
> /etc/systemd/network/21-wireless.network
systemctl restart systemd-networkd
2.1. ネットワークの設定#
現在テスト済みのネットワーク設定は 2 種類あります
2.1.1 ホストモードを使用#
コンテナを作成する前に以下の調整を行います
sed -i 's/lxc\.net\.0\.type = empty/lxc.net.0.type = none/g' $PREFIX/etc/lxc/default.conf
ホスト下で docker を実行したい場合は、次に以下の調整を行う必要があります
コンテナ内で起動するには入力してください !!!
update-alternatives --set iptables /usr/sbin/iptables-legacy
iptables -t filter -F
# 起動できた場合は、以下のコマンドを使用する必要はありません
iptables -t filter -X
echo 8.8.8.8 > /etc/resolv.conf
systemctl stop systemd-resolved
systemctl disable systemd-resolved
# systemctl enable systemd-networkd
2.1.1 veth モードを使用#
以下は初回に設定する必要があります
apt install dnsmasq wget -y
# デフォルトのlxc設定を変更します
echo -e "lxc.net.0.type = veth \
\nlxc.net.0.link = lxcbr0 \
\nlxc.net.0.flags = up \
\nlxc.net.0.hwaddr = 00:16:3e:xx:xx:xx" \
> $PREFIX/etc/lxc/default.conf
# lxc-netを変更します
wget https://qiuqiu233.top/d/linux-deploy/lxc/lxc-net -O $PREFIX/libexec/lxc/lxc-net && chmod a+x $PREFIX/libexec/lxc/lxc-net
デバイスを再起動するたびに veth を使用したい場合は
$PREFIX/libexec/lxc/lxc-net start
ニャーニャーニャーニャーニャー