by redblue (弗朗西斯科)
【 一 】
安装 lxc
手机打开 termux
一键更换北京大学源,执行
echo "deb https://mirrors.pku.edu.cn/termux/termux-main stable main" > PREFIX/etc/apt/sources.list
安装 lxc
pkg update
pkg install root-repo
pkg install lxc
【 二 】
关于 cgroup
tsu
—— 检测 cgroup 版本
mount | grep cgroup
注意看 /sys/fs/cgroup type cgroup2 这行,
根据显示的信息,我的是 cgroup2
如果你是 cgroup1 版本,执行
(执行 1 次即可,以后每次启动 无需再次执行)
echo "lxc.init.cmd = /sbin/init systemd.unified_cgroup_hierarchy" >>; /PREFIX/share/lxc/config/common.conf
如果你是 cgroup2 版本 执行
(执行 1 次即可,以后每次启动 无需再次执行)
echo "lxc.init.cmd = /sbin/init systemd.unified_cgroup_hierarchy=0" >> /PREFIX/share/lxc/config/common.conf
配置网络,cgroup1 和 cgroup2 都要执行
(执行 1 次即可,以后每次启动 无需再次执行)
sed -i 's/lxc\.net\.0\.type = empty/lxc.net.0.type = none/g' /data/data/com.termux/files/usr/etc/lxc/default.conf
【 三 】
挂载 cgroup
共 2 条命令
(以后每次重新启动 lxc 都需要执行)
sudo mount -t tmpfs -o mode=755 tmpfs /sys/fs/cgroup && sudo mkdir -p /sys/fs/cgroup/devices && sudo mount -t cgroup -o devices cgroup /sys/fs/cgroup/devices && sudo mkdir -p /sys/fs/cgroup/systemd && sudo mount -t cgroup cgroup -o none,name=systemd /sys/fs/cgroup/systemd
sudo lxc-setup-cgroups
【 四 】
启动 lxc
tsu
lxc-create -t download -n my-container -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images --no-validate
ubuntu 22.04 为例
输入
ubuntu
jammy
arm64
等待完成
到这里,先别急着启动系统,因为如果启动了 你会发现不知道登录用户名和密码
mt 管理器,打开
/data/data/com.termux/files/usr/var/lib/lxc/ubuntu/rootfs/etc/shadow
这个文件,把 root 和 ubuntu 用户后的密码改一下,改为这个加密密码
paa5KD6arxLr2
[具体细节]
修改密码,就是修改用户名后 2 个:之间的内容
修改前
root:*:19525:0:99999:7:::
ubuntu:!:19525:0:99999:7:::
修改后
root:paa5KD6arxLr2:19525:0:99999:7:::
ubuntu:paa5KD6arxLr2:19525:0:99999:7:::
启动 ubuntu 系统
lxc-start -n ubuntu -d -F
lxc-start -n my-container -d -F
输入用户名 和 密码
root 和 ubuntu 的密码都是 123456
建议 root 用户登录
【 五 】
ubuntu 系统后续配置
进入 ubuntu 系统以后,
( 1 )
执行
sudo passwd root
可以修改 root 用户密码
( 2 )
更换为清华大学源
ubuntu22.04 更换清华大学源
共 4 条命令
echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse" > /etc/apt/sources.list
echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb http://ports.ubuntu.com/ubuntu-ports/ jammy-security main restricted universe multiverse" >> /etc/apt/sources.list
( 3 )
修改 dns:
echo "nameserver 8.8.8.8" > /etc/resolv.conf
但是这个文件会自动重置,也就是说安卓 lxc 有一个 dns 会自动重置的问题,
解决办法 在这篇文章末尾
[ 关于安卓 lxc 容器 dns 自动重置的
解决办法 ]
试着执行
apt update
如果做了以上操作,
apt update 还是没有网络的话,
执行以下 2 条命令
-
执行第 1 条命令可能提示 aid_inet 已经存在,那就执行第 2 条命令即可
groupadd -g 3003 aid_inet
usermod -G nogroup -g aid_inet _apt
执行
apt update
成功
( 4 )
ssh 连接
apt install openssh-server
修改 ssh 配置文件,允许 root 用户的 ssh 连接,
nano /etc/ssh/sshd_config
找到并用 #注释掉这行
PermitRootLogin prohibit-password
然后在它下面 1 行添加
PermitRootLogin yes
重启 sshd 服务
systemctl restart sshd
( 5 )
改时区
描述:日期时间不对,需要改下时区
执行
date
发现日期时间不对
执行以下命令
(即设定时区 让它自动校正时间)
sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
执行
date
发现时间自动校正了
【 六 】
lxc 里运行 docker
安装 docker
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
配置路由
(以后每次重新启动 lxc 都需要执行一次)
apt install iproute2
getway=(sudo ip route get 8.8.8.8 | awk '{ for(i=1; i<=NF; i++) { if(i == "via") { print (i+1); break; } } }')
sudo ip rule add pref 1 from all lookup main
sudo ip rule add pref 2 from all lookup default
sudo ip route add default via getway dev wlan0
sudo ip rule add from all lookup main pref 30000
调整防火墙规则
(以后每次重新启动 lxc 都需要执行一次)
update-alternatives --set iptables /usr/sbin/iptables-legacy
调整防火墙
(以后每次重新启动 lxc 都需要执行一次)
iptables -t filter -F
- 如果可以正常使用了就不需要下面的命令
iptables -t filter -X
[重点] docker 镜像运行失败修复
先下载文件 runc-arm64.zip,
下载点这里
下载以后,解压,
把里面的 runc 文件替换到
/data/data/com.termux/files/usr/var/lib/lxc/ubuntu/rootfs/usr/bin/ 下面
termux里
tsu
echo "lxc.cgroup.devices.allow = c 10:200 rwm" >> /data/lxc/share/lxc/config/common.conf
这个是不用换runc了,但是要多执行的一步
【 七 】
dns 重置问题
关于安卓 lxc 容器 dns 自动重置的
解决办法 V3
具体描述:
解决重启 lxc 会重置 dns 的问题
解决一些 docker 操作会 重置 dns 的问题
《 一 》
如果你只是想,这一次解决当下容器问题
那么手动在容器里执行,
echo "nameserver 8.8.8.8" > /etc/resolv.conf
systemctl stop systemd-resolved
systemctl disable systemd-resolved
启动docker
service docker start
service docker restart
安装面板
docker pull wangbinxingkong/fast
docker run --restart always --name fast -p 8081:8081 -d -v /var/run/docker.sock:/var/run/docker.sock wangbinxingkong/fast
《 二 》
如果你想永久解决问题,那么进行以下操作
(设置一次,永久有效
重启 lxc 也不需要 再次操作)
( 1 )
修复 rc.local (修复显示 condition failed)
chmod +x rc.local
( 2 )
vi /etc/rc.local
或者
apt install nano
nano /etc/rc.local
加入以下内容 (一共 5 行)
#!/bin/sh
systemctl start systemd-resolved
echo "nameserver 8.8.8.8" > /etc/resolv.conf
systemctl stop systemd-resolved
systemctl disable systemd-resolved
保存,并退出
( 3 )
执行
systemctl enable rc-local
但是发现报错了
解决办法 ——
切换目录
cd /lib/systemd/system
编辑文件
vi rc-local.service
或者
nano rc-local.service
在末尾空 1 行 ,再添加 (一共 3 行)
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
重新执行
systemctl enable rc-local
会看到提示如下
Created symlink /etc/systemd/system/rc-local.service → /lib/systemd/system/rc-local.service.
Created symlink /etc/systemd/system/multi-user.target.wants/rc-local.service → /lib/systemd/system/rc-local.service.
这样就成了
再次执行
systemctl enable rc-local
即可
( 4 )
停止容器
sudo lxc-stop -n 容器名 -k
(另外要注意,强行停止 termux,lxc 容器并不会停止,所以还是需要用命令)
启动容器
sudo lxc-start -n 容器名
【 八 】
普通用户相关问题
( 1 )
lxc 普通用户不能用 sudo 解决方法
执行
mount -n -o remount,suid /
- 后续可以加到 rc.local 里,就不用每次手动执行了
( 2 )
lxc 普通用户不能联网 解决方法
- 用户名填 ubuntu
usermod -g aid_inet 用户名
【 九 】
【 写在最后 】
[补充]
( 1 )
调整 lxc 容器密码 V5
- 上面文章中是通过改 etc/shadow 文件,来改密码,我们也可以通过执行命令来改密码
- 设置容器初始 root 用户密码 或者忘记密码情况下 重置 root 用户密码
- 容器启动或者不启动,命令都有效
- 支持数字字母
改 root 用户密码 ,termux 里执行
sudo chroot PREFIX/var/lib/lxc/容器名/rootfs bin/passwd
按提示
输入密码 回车
再次输入密码 回车
即可!