banner
late autumn

lateautumn

一个什么都不会的职中生
github
email
telegram
bilibili

Android原生運行Lxc

image.png
簡介:
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 -a -m "Imported docker/ from https://github.com/lateautumn233/android_kernel_docker"

然後再自行編譯
🥵🥵🥵

1.2. 內核補丁#

1. 修復可能存在的 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.

2. 修復 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;
 }

3. 禁用 ANDROID_PARANOID_NETWORK

scripts/config --file arch/arm64/configs/<defconfig> -
d ANDROID_PARANOID_NETWORK

1.3. 檢查內核配置#

生成完整內核配置後檢查

wget https://raw.githubusercontent.com/lxc/lxc/main/src/lxc/cmd/lxc-checkconfig.in -O lxc-checkconfig
chmod a+x lxc-checkconfig
CONFIG=out/.config lxc-checkconfig

具體編譯內核
以下省略 n 字

2. 安裝 lxc 模塊#

下載此magisk 模塊安裝並重啟

2.1. 啟動 lxc 容器#

隨便找一個終端軟件執行

. /data/lxc/env.sh

創建容器

lxc-create -t download -n my-container -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images
# 依次填入發行版 版本號 架構
# 然後啟動
lxc-start -n my-container -d -F

調整 lxc 容器密碼

chroot path /bin/su -
lxc-attach -n my-container passwd

2.1. 配置網絡#

(可選,默認 veth 可以不修改)

2.1.1 使用 host 模式#

sed -i 's/lxc\.net\.0\.type = veth/lxc.net.0.type = none/g' /data/lxc/etc/lxc/default.conf

喵喵喵喵喵

參考文章:#

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。