安卓手机部署ubuntu的lxc容器,并安装好dockerd

打印 上一主题 下一主题

主题 682|帖子 682|积分 2046

1. 前置作业

刷机获取root是必须的,而且必须要有一个支持docker的内核。
检测当前装备支持docker的方法:
安装Termux并初始化。 这里给个安装包下载链接:[termux app链接]。
下载Moby的脚本用于检查缺少的内核功能
  1. pkg update
  2. pkg install wget tsu
  3. wget https://raw.githubusercontent.com/moby/moby/master/contrib/check-config.sh
  4. chmod +x check-config.sh
  5. sed -i '1s_.*_#!/data/data/com.termux/files/usr/bin/bash_' check-config.sh
  6. sudo ./check-config.sh
复制代码
查看CONFIG都是绿字就行。

编译支持docker的安卓内核的方法,就不在此写了,有很多链接可以参考。
比如:自界说小米10pro(代号cmi)的kernel内核,并开启安卓支持docker
2. 开始安装ubuntu的lxc容器,以及安装dockerd

0. 安装termux

这一步就不用说了,由于下面都是在termux里执行的。本身验证内核是否符合要求,就已经要求安装好termux了。这里再发一下安装包下载链接(赚赚积分):[termux app链接]。
再安装好openssh,并利用ssh连接进termux,这样背面的下令都可以进行复制粘贴,不易出错。pkg安装一下就行。
1. 安装lxc(仅第一次要执行)

  
  1. pkg  install  root-repo   #它会添加新源
  2. termux-change-repo    # 选择Mirror group -> 选择Mirrors in China
  3. pkg  install  tsu  lxc  which  vim
复制代码
2. 设置cgroup和网络(仅第一次要执行)

执行如下下令检查cgroup版本:
  
  1. tsu
  2. 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.d/ubuntu.conf
复制代码
假如你是 cgroup2 版本 执行
  
  1. echo "lxc.init.cmd = /sbin/init systemd.unified_cgroup_hierarchy=0" >> $PREFIX/share/lxc/config/common.conf.d/ubuntu.conf
复制代码
修改cgroup自动挂载脚本,cgroup1 和 cgroup2 都要执行
  
  1. # vim开启鼠标的话,可输入“:set mouse=n”关闭
  2. # 修改/data/data/com.termux/files/usr/bin/lxc-setup-cgroups文件:
  3. vi /data/data/com.termux/files/usr/bin/lxc-setup-cgroups
  4. --- a/lxc-setup-cgroups   2020-07-24 05:01:51.000000000 +0800
  5. +++ b/lxc-setup-cgroups   2023-10-30 12:28:23.758527725 +0800
  6. @@ -3,9 +3,7 @@ set -e
  7.  export PATH=$PATH:/system/xbin:/system/bin
  8. -if ! mountpoint -q /sys/fs/cgroup; then
  9. -       mount -t tmpfs -o mode=755,nodev,noexec,nosuid tmpfs /sys/fs/cgroup
  10. -fi
  11. +mount -t tmpfs -o mode=755,nodev,noexec,nosuid tmpfs /sys/fs/cgroup
  12.  for cg in blkio cpu cpuacct cpuset devices freezer memory; do
  13.         if [ ! -d "/sys/fs/cgroup/${cg}" ]; then
  14. @@ -16,3 +14,7 @@ for cg in blkio cpu cpuacct cpuset devic
  15.                 mount -t cgroup -o "${cg}" cgroup "/sys/fs/cgroup/${cg}" || true
  16.         fi
  17.  done
  18. +
  19. +mkdir -p /sys/fs/cgroup/systemd;
  20. +mount -t cgroup cgroup -o none,name=systemd /sys/fs/cgroup/systemd;
  21. +
复制代码
设置网络,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
复制代码
3. 挂载cgroup(以后每次重启装备后,都要执行)

  
  1. sudo umount /sys/fs/cgroup
  2. sudo umount /debug_ramdisk/.magisk/mirror/sys/fs/cgroup
  3. # 上面两个umount只需安装新lxc容器,需要执行。主要用于排除对lxc的干扰。
  4. tsu -s "lxc-setup-cgroups"
复制代码
4. 安装ubuntu的 lxc 容器(仅第一次要执行)

  
  1. tsu
  2. lxc-create -t download -n ubuntu -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images --no-validate 
  3. # 然后选择“ubuntu”, “bionic”,“arm64” ## !!注意不要选成amd64了
  4. # 等待系统下载完成  
复制代码
到这里,先别急着启动系统,由于假如启动了 你会发现不知道登录用户名和密码
  
  1. # vim开启鼠标的话,可输入“:set mouse=n”关闭
  2. # 使用vi设置root密码:
  3. vi  /data/data/com.termux/files/usr/var/lib/lxc/ubuntu/rootfs/etc/shadow
  4. --- a/shadow    2023-10-31 08:57:36.605348208 +0800
  5. +++ b/shadow    2023-10-31 08:58:10.808684949 +0800
  6. @@ -1,4 +1,4 @@
  7. -root:*:19598:0:99999:7:::
  8. +root:paa5KD6arxLr2:19598:0:99999:7:::
  9.  daemon:*:19598:0:99999:7:::
  10.  bin:*:19598:0:99999:7:::
  11. # 修改密码,就是修改用户名后 2 个:之间的内容,星号改为:paa5KD6arxLr2,这个密码的明文是123456
复制代码
5. 启动lxc容器

第一次启动,利用如下下令启动,并立刻做一些设置:(仅第一次要执行)
  
  1. lxc-start -n ubuntu -d -F    # 启动 ubuntu 系统
  2. #登录用户名为root,密码为123456
  3. #登录lxc容器后,再在lxc容器里,执行如下配置命令:
  4. passwd root #启动后,立即使用passwd修改root密码
  5. #修改源
  6. echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main restricted universe multiverse" > /etc/apt/sources.list
  7. echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list
  8. echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list
  9. echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list
  10. apt update
  11. # 没有网络的话,需要修复一下
  12. ### vi /etc/resolv.conf  #修改dns(apt更新不了,就修改dns,然后ping一下www.baidu.com)
  13. ### 例如修改为:
  14. ### nameserver 8.8.8.8
  15. ### nameserver 8.8.4.4
  16. # 测试一下 apt update, 还是没有网络的话,执行以下 2 条命令:
  17. ### groupadd -g 3003 aid_inet  执行这命令可能提示 aid_inet 已经存在,那就执行第 2 条命令即可
  18. ### usermod -G nogroup -g aid_inet _apt
  19. #安装sshd,并配置root登录允许,开机自启动
  20. apt install openssh-server
  21. vi /etc/ssh/sshd_config  #修改为:PermitRootLogin yes
  22. systemctl restart sshd
  23. #改时区
  24. date
  25. ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  26. date
复制代码
以后每次重启装备,利用如下下令启动:(以后每次重启装备后,都要执行)
  
  1. tsu -s "lxc-start -n ubuntu"
复制代码
6. 设置路由和网络(以后每次重启装备后,都要执行)(这部门可以先执行,然后再启动lxc容器)

  
  1. # 以下命令需要在lxc容器外面执行
  2. # 开启网络转发
  3. tsu -s "sysctl -w net.ipv4.ip_forward=1"
  4. # 清理安卓防火墙
  5. tsu -s "iptables -t filter -F"
  6. tsu -s "iptables -t filter -X"
  7. tsu -s "iptables -t nat -F"
  8. tsu -s "iptables -t nat -X"
  9. tsu -s "iptables -t raw -F"
  10. tsu -s "iptables -t raw -X"
  11. tsu -s "iptables -t mangle -F"
  12. tsu -s "iptables -t mangle -X"
  13. # 添加路由
  14. tsu -s "ip rule add pref 1 from all lookup main"
  15. tsu -s "ip rule add pref 2 from all lookup default"
  16. # 这里的192.168.1.1需要换成自己当前网络的网关ip或路由器的ip
  17. tsu -s "ip route add default via 192.168.1.1 dev wlan0"
  18. tsu -s "ip rule add from all lookup main pref 30000"
复制代码
7. lxc里安装dockerd(仅第一次要执行)

在lxc容器里执行这些下令,安装 dockerd:
  
  1. # 安装最新版docker,适合高版内核比如5.10
  2. curl -fsSL https://get.docker.com -o get-docker.sh
  3. sh get-docker.sh
  4. # 若安装低版本docker,适合底版内核比如3.19,用这个命令:
  5. # apt install docker.io
  6. update-alternatives --set iptables /usr/sbin/iptables-legacy  # 切换到传统iptables模式
  7. # 启用 docker
  8. service docker start
  9. service docker restart
  10. systemctl enable docker
  11. # 测试docker是否正常工作
  12. docker run hello-world
复制代码
[重点] docker 镜像运行失败修复:
假如hello-world运行失败,则需要下载runc文件:[runc链接]。更换/usr/bin/runc文件,并添加可执行权限。
同时需要在lxc容器外部,再执行:
  
  1. tsu
  2. echo "lxc.cgroup.devices.allow = a " >> /data/data/com.termux/files/usr/share/lxc/config/common.conf.d/ubuntu.conf
复制代码
3. 其他补充

1. 目录挂载(仅第一次要执行)

在/data/data/com.termux/files/usr/share/lxc/config/common.conf.d/ubuntu.conf设置文件里,添加目录挂载,将安卓系统的system、data、sdcard目录挂载进去,方便利用。最终该设置文件里的内容如下:
  
  1. lxc.init.cmd = /sbin/init systemd.unified_cgroup_hierarchy=0
  2. lxc.cgroup.devices.allow = c 10:200 rwm
复制代码
 2. dns自动重置文件修复(仅第一次要执行)

lxc的dns设置文件/etc/resolv.conf会自动重置,需要这样设置:
  
  1. # 在lxc容器内部,执行如下配置:
  2. rm  -f  /etc/resolv.conf  #删除旧文件(旧文件是一个软链接)
  3. echo "nameserver 8.8.8.8" > /etc/resolv.conf
  4. systemctl   stop   systemd-resolved
  5. systemctl   disable   systemd-resolved
  6. systemctl   mask  systemd-resolved​
复制代码
3. 停止容器的方法

  
  1. # 方法一:
  2. sudo lxc-stop -n 容器名  -k   # 强行停止 termux,lxc 容器并不会停止,所以还是需要用命令
  3. # 方法二:
  4. # 进入容器,执行 `poweroff` 命令
复制代码
4. 这里把我用的termux启动lxc容器的脚本,提供给大家参考:

  
  1. # cat start_ubuntu.sh
  2. #!/data/data/com.termux/files/usr/bin/bash
  3. BootLog() {
  4.         echo `date` >> myboot.log
  5.         echo `id` >> myboot.log
  6.         echo `pwd` >> myboot.log
  7.         env >> myboot.log
  8.         echo "============================================" >> myboot.log
  9. }
  10. BootLog
  11. termux-wake-lock
  12. tsu -s "sysctl -w net.ipv4.ip_forward=1"
  13. tsu -s "iptables -t filter -F"
  14. tsu -s "iptables -t filter -X"
  15. tsu -s "iptables -t nat -F"
  16. tsu -s "iptables -t nat -X"
  17. tsu -s "iptables -t raw -F"
  18. tsu -s "iptables -t raw -X"
  19. tsu -s "iptables -t mangle -F"
  20. tsu -s "iptables -t mangle -X"
  21. tsu -s "ip rule add pref 1 from all lookup main"
  22. tsu -s "ip rule add pref 2 from all lookup default"
  23. tsu -s "ip route add default via 192.168.1.1 dev wlan0"
  24. tsu -s "ip rule add from all lookup main pref 30000"
  25. tsu -s "lxc-setup-cgroups"
  26. tsu -s "lxc-start -n ubuntu"
复制代码
 5. 补充其他题目办理

办理平凡用户不能用sudo的方法
  
  1. mount -n -o remount,suid /
复制代码
办理平凡用户不能联网的方法
  
  1. usermod -g aid_inet 用户名
复制代码
初始密码修改为其他自界说值的方法
  
  1. sudo chroot $PREFIX/var/lib/lxc/容器名/rootfs bin/passwd
  2. 按提示
  3. 输入密码 回车
  4. 再次输入密码 回车
复制代码
其他参考链接:
1. https://www.cnblogs.com/ifwz/p/17592111.html 
2. https://www.jianshu.com/p/1c3aa39d9eb4
4. 遗留题目

假如要拿手机当服务器来跑docker,还需要办理电池的题目。由于既然是跑服务,肯定是24小时接电源适配器的,这样时间长了,手机电池绝对遭不住。轻则鼓包漏气、后盖起翘,重则起火就得不偿失了。本人可不负担,请自行负担结果哦。
但古人有言,祸福相依,手机的电池,并非只会带来坏处。假如我们处理处罚恰当,相称于给我们的服务器自带了一个UPS,岂不美哉。
方法暂不公开了,如需技能协助,可以邮件我:w._heng@163.com,¥50 for 啤酒。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

知者何南

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表