
前言
闲来无事折腾手边的旧设备,从上边的图可以看到,这是一台小米MIX2S,CPU为高通骁龙845,内存8G,这个配置在如今作为备用机可能勉强够用,但是在正面场合已经难堪大用,不过切换到Linux环境,这个性能下设备的可玩性还是很高的;
Termux就满足了这个需求,其能够在手机上提供一个相对完整的Linux使用体验,但是尽管通过proot-distro等工具能够实现运行Ubuntu、Debian等主流Linux发行版,但其仍然很难说是真正意义上运行了完整的Linux,其原因在于,虽然Android底层服务基于Linux,但大部分厂商的Android内核都是非常魔改的产物,并且为了安全考虑,很多内核区域其实是很难以用户身份访问的,即使Termux引出了一些Android底层的Linux接口,但其基本都是”残废”的,即使通过root也很难将这些缺失内容进行适配、补全,这也导致像是snap、docker、systemctl等软件或工具无法在Termux环境下运行;
不过众所周知,一切软件层面的问题都可以套用经典的“向上套一层”来解决,解决思路也很简单,docker等软件包的运行需要一个完整的Linux环境,而Termux不具备这个特性,那么我们在Termux下创建这个环境就完事了,通过QEMU,我们可以很简单的实现这一步;
CAUTION注意,由于壳中壳中壳,性能必然有损耗,折腾这玩意纯属图一乐,仅用于证明手机运行完整Linux运行docker的可能性,切勿应用于生产环境
准备工作
正式开始之前,让我们先进性一些简单的配置,以及准备一些要用到的东西
使用ssh连接你的Termux
通过ssh,你可以很方便的使用电脑连接Termux以获得完整的键盘输入,且后续我们的文件中转也需要用到它
当然你要是乐意戳玻璃板,那当我没说,直接跳过
首先需要为Termux安装openssh,这是运行ssh服务的基础,如果下载缓慢,可以搜索一下相关换源教程
pkg updatepkg install openssh
接下来只需要通过简单的指令即可运行ssh服务
sshd
此外,还需要为你的当前用户设置一个密码,这是你通过ssh连接的凭据,你可以随时通过这个命令重置密码(注意没有回显,且重置密码不需要旧密码)
passwd
正常来说,通过ssh连接,你需要知道目标设备的用户名、ip地址/域名地址、每次连接通过指令来获取未免太过麻烦,将获取信息的部分写入.bashrc
以使得开机自动开启ssh服务并显示用户名、ip信息会非常方便
echo "echo 用户 \$(whoami) 登入" >> ~/.bashrcecho "sshd" >> ~/.bashrcecho "echo ssh 已开启 Port:8022" >> ~/.bashrcecho "ifconfig | grep inet" >> ~/.bashrc
如果你有vi、vim之类的编辑工具,也可以自行编辑~/目录下的.bashrc(注意转义字符);
Termux下ssh服务默认端口为8022
,所以直接写进去了,作为一种提示手段;
通过重启Termux,你可以看到以下内容:
用户 u0_a250 登入ssh 已开启 Port:8022Warning: cannot open /proc/net/dev (Permission denied). Limited output. inet 127.0.0.1 netmask 255.0.0.0 inet 100.100.178.53 netmask 255.255.255.252 inet 10.91.24.176 netmask 255.255.240.0 broadcast 10.91.31.255~ $
其中可以清晰的看到当前Termux环境下,用户名为u0_a250,且除了回环地址外有两个可用地址,这边我的WIFI网段为10.91.16.0——10.91.31.255,所以在相同WIFI环境下,其它设备应该使用以下命令连接到Termux环境
ssh -p 8022 u0_a250@10.91.24.176
这里我们使用电脑连接到Termux,输入密码登录(注意密码默认不会回显)
保持手机屏幕长亮或插上电源,可以使得CPU不会降频以节省功耗,不然操作起来会非常卡顿
安装QEMU运行环境
pkg updatepkg install qemu-utilspkg install qemu-system-aarch64-headless
qemu-utils | QEMU基础工具集,不包含模拟器 |
qemu-system-aarch64-headless | 用于无图形界面(headless)模拟 ARM 64 位(AArch64) 架构的模拟器软件包 |
如果你不清楚你的设备架构,可以在Termux中使用如下命令查询:
uname -m
一般来说,现在的安卓手机普遍是aarch64架构,但不排除有部分设备使用了x86,如果碰巧你的设备正好就是,那么也可以使用下面的指令安装对应的模拟器软件包,其它稀奇古怪的环境请自行参考:
pkg updatepkg install qemu-system-x86-64-headless
CAUTION注意,aarch64架构也同样能够通过QEMU运行x86-64的虚拟机,不过由于转译原因性能会有更多的折损,并且可能还有小概率遇到指令未实现导致的一些问题,例如亲测aarch64设备运行x86-64虚拟机环境下的Alpine、Debian使用nodejs-sharp组件,可能会在构建过程中遇到非法指令导致构建失败;
所以不管出于何种角度,都建议使用对应的模拟器架构
准备镜像文件和引导文件
为了尽可能减小性能损耗,不建议使用Ubuntu等大型的发行版镜像,这里我们使用Alpine-virt-aarch64,非常小巧(不到80MB),你可以在Alpine官网找到它
🔗这里有一个链接
Alpine提供了多种类型的镜像,这里我们选择针对虚拟机优化的VIRTUAL分支,架构选择aarch64,复制链接地址后通过wget工具下载到Termux,不过在此之前建议新建一个文件夹
mkdir QEMU-Alpine-aarch64cd QEMU-Alpine-aarch64wget https://dl-cdn.alpinelinux.org/alpine/v3.22/releases/aarch64/alpine-virt-3.22.0-aarch64.iso
除了镜像文件外,还需要为镜像准备一个引导文件,这里可以通过以下指令获取它:
wget https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd
这是一个简单的UEFI,我们使用它来加载iso镜像
安装Alpine-aarch64
现在,我们已经在QEMU-Alpine-aarch64文件夹中准备好了所需的镜像和引导文件,接下来我们开始进行安装步骤
创建存储卷
就像在PC上安装系统一样,我们需要准备一块”硬盘”,或者我更愿意将其称之为存储卷/存储镜像,通过下面指令可以分配一块20G的虚拟存储卷,由于可能需要经常调整,我们将其写入一个bash脚本:
qemu-img create -f qcow2 virt-alpine-20G.img 20g
之后,我们可以简单通过以下调用这个bash脚本以创建存储卷
sh create-image.sh
qcow2 是一种虚拟磁盘镜像格式,全称是 QEMU Copy-On-Write version 2。它是 QEMU 最常用的磁盘格式之一,具有动态分配空间、快照、压缩、加密等特性。最重要的是,它是一种动态分配文件(稀疏文件),初始文件很小,随着数据写入逐渐增大,直到设定的最大容量;
所以如果你不想考虑空间用完后的扩容问题,可以一次性设置一个很大的值(甚至超出设备的物理存储),直到qcow2存储卷的物理空间占用超出设备极限时才会发生异常;
从镜像启动
这里给出我使用的安装启动脚本:
qemu-system-aarch64 \ -m 512m \ -cpu cortex-a72 \ -smp cpus=2 \ -M virt \ -bios QEMU_EFI.fd \ -nographic \ -device virtio-scsi-device \ -device scsi-cd,drive=cdrom \ -drive if=none,file=alpine-virt-3.22.0-aarch64.iso,id=cdrom,media=cdrom \ -drive file=virt-alpine-20G.img,if=virtio,format=qcow2 \
其中指出通过QEMU_EFI.fd
作为BIOS启动,挂载qcow2
的硬盘镜像virt-alpine-20G.img
,以及挂载alpine-virt-3.22.0-aarch64.iso
作为光盘镜像,如果你将它们存储在了其它地方,记得补上路径;
-m 512m
指出分配内存512m,-smp cpus=2
表示分配2个虚拟CPU核心,这些资源足够安装镜像使用;
之后,使用脚本挂载硬盘和镜像启动虚拟机:
sh install.sh
CAUTION注意,由于某些未知原因,Termux环境下QEMU相关操作组合键不生效,进入QEMU虚拟机后除非虚拟机内部运行结束,否则只能通过杀死进程的方式退出QEMU,这也就是为什么前面建议使用电脑通过ssh的方式操作Termux,可以通过结束ssh访问来间接杀死进程
如果一切正常,你将看到如下启动进程(折叠了部分非关键启动日志):
~/QEMU-Alpine-aarch64 $ ls ↵QEMU_EFI.fd alpine-virt-3.22.0-aarch64.iso create-image.sh install.sh virt-alpine-20G.img~/QEMU-Alpine-aarch64 $ sh install.sh ↵
22 collapsed lines
GNU GRUB version 2.12
/----------------------------------------------------------------------------\ |*Linux virt | | | | | | | | | | | | | | | | | | | | | | | | | \----------------------------------------------------------------------------/
Use the ^ and v keys to select which entry is highlighted. Press enter to boot the selected OS, `e' to edit the commands before booting or `c' for a command-line. The highlighted entry will be executed automatically in 0s. Booting `Linux virt'38 collapsed lines
OpenRC 0.62.2 is starting up Linux 6.12.31-0-virt (aarch64)
* /proc is already mounted * Mounting /run ... [ ok ] * /run/openrc: creating directory * /run/lock: creating directory * /run/lock: correcting owner * Caching service dependencies ... [ ok ] * Caching service dependencies ... [ ok ] * Remounting devtmpfs on /dev ... [ ok ] * Mounting /dev/mqueue ... [ ok ] * Mounting modloop ... * Verifying modloop * modloop: waiting for service (50 seconds) * modloop: waiting for service (40 seconds) [ ok ] * Mounting security filesystem ... [ ok ] * Mounting debug filesystem ... [ ok ] * Mounting persistent storage (pstore) filesystem ... [ ok ] * Mounting efivarfs filesystem ... [ ok ] * Mounting bpf filesystem ... [ ok ] * Starting busybox mdev ... [ ok ] * Scanning hardware for mdev ... [ ok ] * Loading hardware drivers ... * hwdrivers: waiting for service (50 seconds) [ ok ] * Loading modules ... [ ok ] * Setting system clock using the hardware clock [UTC] ... [ ok ] * Checking local filesystems ... [ ok ] * Remounting filesystems ... [ ok ] * Mounting local filesystems ... [ ok ] * Configuring kernel parameters ... [ ok ] * Creating user login records ... [ ok ] * Cleaning /tmp directory ... [ ok ] * Setting hostname ... [ ok ] * Starting busybox syslog ... [ ok ] * Starting firstboot ... [ ok ]
Welcome to Alpine Linux 3.22Kernel 6.12.31-0-virt on aarch64 (/dev/ttyAMA0)
localhost login: root ↵
当出现localhost login:
时,输入root
回车即可登入根文件系统
开始安装流程
虽然登录了系统,一些基础指令也操作正常,但当前的系统被加载在了虚拟内存中,一旦关机则会丢失所有数据,我们需要将系统安装到存储卷中,使用以下指令启动安装程序:
setup-alpine
CAUTION注意,安装程序开始后,除非提示输入,否则不要在等待操作的过程中轻易按下任何按键以及回车,否则安装程序可能会获取到错误的输入导致系统安装失败
1.设置设备名称
也就是登陆设备后显示在bash前边的名称,回车使用默认名称localhost,也可以自行修改(注意支持小写字母和数字),这里我们使用alpine作为设备名称,输入alpine回车
Hostname----------Enter system hostname (fully qualified form, e.g. 'foo.example.org') [localhost] alpine ↵
2.设置网络设备接口
Interface-----------Available interfaces are: eth0.Enter '?' for help on bridges, bonding and vlans.Which one do you want to initialize? (or '?' or 'done') [eth0] ↵Ip address for eth0? (or 'dhcp', 'none', '?') [dhcp] ↵Do you want to do any manual network configuration? (y/n) [n] ↵
没啥好说的,网络设备选择eth0,IP地址分配选择dhcp自动处理,不进行手动网络配置,直接回车三次即可
3.设置root密码
Root Password---------------Changing password for rootNew password: ******** ↵Retype password: ******** ↵
输入你要为root用户设置的密码,注意没有回显,确认两次输入完成后回车即可
4.设置时区
Timezone----------Africa/ Egypt Iran PolandAmerica/ Eire Israel PortugalAntarctica/ Etc/ Jamaica ROCArctic/ Europe/ Japan ROKAsia/ Factory Kwajalein SingaporeAtlantic/ GB Libya TurkeyAustralia/ GB-Eire MET UCTBrazil/ GMT MST US/CET GMT+0 MST7MDT UTCCST6CDT GMT-0 Mexico/ UniversalCanada/ GMT0 NZ W-SUChile/ Greenwich NZ-CHAT WETCuba HST Navajo ZuluEET Hongkong PRC leap-seconds.listEST Iceland PST8PDT posixrulesEST5EDT Indian/ Pacific/
Which timezone are you in? (or '?' or 'none') [UTC] Asia/Shanghai ↵
使用亚洲/上海时间即可,输入Asia/Shanghai回车
5.代理服务配置
Proxy-------HTTP/FTP proxy URL? (e.g. 'http://proxy:8080', or 'none') [none] ↵
按默认设置回车即可,不需要启用代理服务
6.网络时钟协议[NTP]
Network Time Protocol-----------------------Wed Jun 11 20:33:26 CST 2025Which NTP client to run? ('busybox', 'openntpd', 'chrony' or 'none') [busybox] ↵
按默认设置回车即可
7.设置镜像源
APK Mirror------------ (f) Find and use fastest mirror (s) Show mirrorlist (r) Use random mirror (e) Edit /etc/apk/repositories with text editor (c) Community repo enable (skip) Skip setting up apk repositories
Enter mirror number or URL: [1] c ↵
Community repository enabled
Community repository enabled (f) Find and use fastest mirror (s) Show mirrorlist (r) Use random mirror (e) Edit /etc/apk/repositories with text editor (c) Community repo disable (skip) Skip setting up apk repositories
Enter mirror number or URL: [1] 14 ↵
这里先输入c ↵
启用社区软件镜像(默认只会加入核心软件镜像),再输入14 ↵
表示清华源,当然你也可以输入f ↵
使用能够找到的最快的源(受限于网络环境,完整测试镜像源可能需要一些时间);
此外,输入s ↵
可以查看支持的镜像列表(空格可翻页),这里列举一些在国内推荐的镜像源:
Enter mirror number or URL: [1] s ↵
Available mirrors:13 collapsed lines
1) dl-cdn.alpinelinux.org2) uk.alpinelinux.org3) mirror.yandex.ru4) mirrors.gigenet.com5) mirror1.hs-esslingen.de6) mirror.leaseweb.com7) mirror.fel.cvut.cz8) alpine.mirror.far.fi9) alpine.mirror.wearetriple.com10) mirror.clarkson.edu11) mirror.aarnet.edu.au12) mirrors.dotsrc.org13) ftp.halifax.rwth-aachen.de14) mirrors.tuna.tsinghua.edu.cn15) mirrors.ustc.edu.cn16) mirrors.nju.edu.cn17) mirror.lzu.edu.cn7 collapsed lines
18) mirror.accum.se19) mirror.xtom.com.hk20) mirror.csclub.uwaterloo.ca21) pkg.adfinis.com22) mirror.ps.kz23) mirrors.ircam.fr24) mirror.math.princeton.edu25) mirrors.sjtug.sjtu.edu.cn23 collapsed lines
26) ftp.icm.edu.pl27) mirror.ungleich.ch28) mirrors.edge.kernel.org29) ap.edge.kernel.org30) eu.edge.kernel.org31) alpine.yourlabs.org32) mirror.reenigne.net33) quantum-mirror.hu34) tux.rainside.sk35) alpine.cs.nycu.edu.tw36) mirror.ihost.md37) mirror.ette.biz38) mirror.lagoon.nc39) alpinelinux.c3sl.ufpr.br40) foobar.turbo.net.id41) alpine.ccns.ncku.edu.tw42) mirror.dst.ca43) mirror.kumi.systems44) mirror.sabay.com.kh45) alpine.northrepo.ca46) mirror.bardia.tech47) mirrors.ocf.berkeley.edu48) mirrors.pardisco.co49) mirrors.aliyun.com50) mirror.alwyzon.net51) mirrors.bfsu.edu.cn19 collapsed lines
52) ftpmirror2.infania.net53) repo.iut.ac.ir54) mirror.fcix.net55) alpine.sakamoto.pl56) mirror.2degrees.nz57) mirror.kku.ac.th58) mirror.uepg.br59) mirrors.neusoft.edu.cn60) ftp.udx.icscoe.jp61) alpinelinux.mirror.garr.it62) mirrors.hostico.ro63) mirror.serverion.com64) ftp.lysator.liu.se65) mirror.mangohost.net66) mirror.bahnhof.net67) mirror.vinehost.net68) mirror.hyperdedic.ru69) mirror.5i.fi70) mirror.jingk.ai71) mirror.nyist.edu.cn18 collapsed lines
72) mirrors.itwrx.org73) repo.jing.rocks74) mirror.marwan.ma75) mirror.pilotfiber.com76) alpine.koyanet.lv77) mirrors.hosterion.ro78) mirror.tux.si79) mirrors.lax.silicloud.com80) mirrors.tyo.silicloud.com81) mirrors.neterra.net82) mirror.twds.com.tw83) mirrors.jcut.edu.cn84) mirror.raiolanetworks.com85) elmirror.cl86) alpinelinux.mirrors.ovh.net87) debian.ethz.ch88) mirror.leitecastro.com89) pkg.adfinis-on-exoscale.ch90) mirrors.hust.edu.cn1 collapsed line
91) ftp2.crifo.org
8.用户及ssh服务设置
User------Setup a user? (enter a lower-case loginname, or 'no') [no] ↵Which ssh server? ('openssh', 'dropbear' or 'none') [openssh] ↵Allow root ssh login? ('?' for help) [prohibit-password] yes ↵Enter ssh key or URL for root (or 'none') [none] ↵
前两行分别是询问是否添加一个用户和确认使用的ssh服务类型,我这里只需要使用root用户,ssh服务按照默认所以直接回车两次即可;
第三行比较重要,这里我们要填入yes,允许root用户通过ssh使用密码登录,因为我们只有一个root用户,如果不允许使用ssh登录,之后的文件传输就无从下手了;
最后一行需要为root用户添加一个ssh密钥,因为我们开启了密码登录,所以直接回车按照默认设置为none;
9.确认安装位置
Disk & Install----------------Available disks are: vda (21.5 GB 0x1af4 )
Which disk(s) would you like to use? (or '?' for help or 'none') [none] vda ↵
The following disk is selected: vda (21.5 GB 0x1af4 )
How would you like to use it? ('sys', 'data', 'crypt', 'lvm' or '?' for help) [?] sys ↵
WARNING: The following disk(s) will be erased: vda (21.5 GB 0x1af4 )
WARNING: Erase the above disk(s) and continue? (y/n) [n] y ↵
安装磁盘选择vda,也就是我们挂载到虚拟机的先前创建的存储卷,输入sys安装完整系统,输入y立即进行格式化并安装;
CAUTION注意,如果到了这一步有不同的选项出现,多半是在等待过程中进行了错误的键入,可以看到默认选择的安装磁盘是
none
,如果键盘缓冲区中刚好有输入未被处理,安装程序很有可能在这一步直接读取到回车,按照none
进行配置,当不选择有效的安装磁盘位置时,会将前面的配置保存,然后啥也不干就结束安装流程
10.结束,关机退出
当你看到如下部分,安装已经顺利完成,且设备名称已经变成了我们最开始设置的名称,这里我们输入poweroff关机退出
Adding boot menu entry for UEFI Firmware Settings ...done
Installation is complete. Please reboot.alpine:~# poweroff ↵
从存储卷启动
这里给出启动脚本:
qemu-system-aarch64 \ -m 2G \ -cpu cortex-a72 \ -smp cpus=2 \ -boot order=cd \ -M virt \ -bios QEMU_EFI.fd \ -nographic \ -drive file=virt-alpine-20G.img,if=virtio,format=qcow2 \ -device e1000,netdev=nde1,id=d-net1 \ -netdev user,id=nde1,hostfwd=tcp::2222-:22 \
安装镜像已经完成了其使命,就不需要挂载到虚拟机了,启动脚本为虚拟机分配了2G内存,2个虚拟CPU核心,以QEMU_EFI.fd
为BIOS引导,挂载virt-alpine-20G.img
作为硬盘镜像,比起安装启动,这里还添加了一张e1000网卡并设置该网卡进行端口转发,将虚拟机内的22
端口映射到外部的2222
端口(一般ssh默认端口为22,所以我们需要将虚拟机的22端口映射到外部);
如果你要添加多个端口映射,可以参考这一段:
-netdev user,id=nde1,hostfwd=tcp::2222-:22,hostfwd=tcp::9922-:9922,hostfwd=tcp::8080-:80,hostfwd=tcp::4321-:4321 \
准备就绪后,运行脚本以启动虚拟机
sh run.sh
如果一切正常,将会有如下的启动进程(折叠了部分非关键启动日志)
~/QEMU-Alpine-aarch64 $ ls ↵QEMU_EFI.fd alpine-virt-3.22.0-aarch64.iso create-image.sh install.sh run.sh virt-alpine-20G.img~/QEMU-Alpine-aarch64 $ sh run.sh ↵26 collapsed lines
error: no suitable video mode found.
GNU GRUB version 2.12
/----------------------------------------------------------------------------\ |*Alpine Linux v3.22, with Linux virt | | UEFI Firmware Settings | | | | | | | | | | | | | | | | | | | | | | | \----------------------------------------------------------------------------/
Use the ^ and v keys to select which entry is highlighted. Press enter to boot the selected OS, `e' to edit the commands before booting or `c' for a command-line. The highlighted entry will be executed automatically in 0s. Booting `Alpine Linux v3.22, with Linux virt'
Loading Linux virt ...Loading initial ramdisk ...
47 collapsed lines
OpenRC 0.62.2 is starting up Linux 6.12.33-0-virt (aarch64)
* /proc is already mounted * Mounting /run ... [ ok ] * /run/openrc: creating directory * /run/lock: creating directory * /run/lock: correcting owner * Caching service dependencies ... [ ok ] * Remounting devtmpfs on /dev ... [ ok ] * Mounting /dev/mqueue ... [ ok ] * Mounting security filesystem ... [ ok ] * Mounting debug filesystem ... [ ok ] * Mounting persistent storage (pstore) filesystem ... [ ok ] * Mounting efivarfs filesystem ... [ ok ] * Mounting bpf filesystem ... [ ok ] * Starting busybox mdev ... [ ok ] * Scanning hardware for mdev ... * mdev: waiting for service (50 seconds) [ ok ] * Loading hardware drivers ... * hwdrivers: waiting for service (50 seconds) * hwdrivers: waiting for service (40 seconds) [ ok ] * Loading modules ... [ ok ] * Setting system clock using the hardware clock [UTC] ... [ ok ] * Checking local filesystems .../dev/vda3: clean, 3204/1220608 files, 151492/4875264 blocksfsck.fat 4.2 (2021-01-31)/dev/vda1: 5 files, 78/130811 clusters [ ok ] * Remounting root filesystem read/write ... [ ok ] * Remounting filesystems ... [ ok ] * Activating swap devices ... [ ok ] * Mounting local filesystems ... [ ok ] * Configuring kernel parameters ... [ ok ] * Creating user login records ... [ ok ] * Setting hostname ... [ ok ] * Starting networking ... * lo ... [ ok ] * eth0 ...udhcpc: started, v1.37.0udhcpc: broadcasting discoverudhcpc: broadcasting select for 10.0.2.15, server 10.0.2.2udhcpc: lease of 10.0.2.15 obtained from 10.0.2.2, lease time 86400 * networking: waiting for service (50 seconds) [ ok ] * Seeding random number generator ... * Saving 256 bits of creditable seed for next boot [ ok ] * Starting busybox syslog ... [ ok ] * Starting busybox crond ... [ ok ] * Starting busybox ntpd ... [ ok ] * Starting sshd ... [ ok ]
Welcome to Alpine Linux 3.22Kernel 6.12.33-0-virt on aarch64 (/dev/ttyAMA0)
alpine login: root ↵Password: ******** ↵Welcome to Alpine!
7 collapsed lines
The Alpine Wiki contains a large amount of how-to guides and generalinformation about administrating Alpine systems.See <https://wiki.alpinelinux.org/>.
You can setup the system with the command: setup-alpine
You may change this message by editing /etc/motd.
alpine:~#
出现alpine login:
时输入用户名root
,紧接着输入密码(注意没有回显),随后即可进入终端
检查镜像源
Alpine的镜像源配置文件是/etc/etc/apk/repositories,我们使用cat指令查看它:
alpine:~# cat /etc/apk/repositories ↵#/media/cdrom/apkshttp://mirrors.tuna.tsinghua.edu.cn/alpine/v3.22/mainhttp://mirrors.tuna.tsinghua.edu.cn/alpine/v3.22/communityalpine:~#
如果community源被注释掉了,可以使用vi编辑这个文件,去掉注释状态
#/media/cdrom/apkshttp://mirrors.tuna.tsinghua.edu.cn/alpine/v3.22/main#http://mirrors.tuna.tsinghua.edu.cn/alpine/v3.22/communityhttp://mirrors.tuna.tsinghua.edu.cn/alpine/v3.22/community
你也可以添加一些其它镜像源到这里
与外部的文件交互
当启动参数存在对22端口转发时(例如先前的启动脚本设置了将外部的2222端口转发到内部的22端口),我们可以直接使用电脑,通过ssh连接到alpine的终端,同样的,使用scp指令可以进行两台设备之间的文件交互,例如:
scp -P 2222 ./temp.txt root@10.91.24.176:~/ # 将当前工作目录下的temp.txt复制到虚拟机的root用户目录scp -P 2222 -r ./folder root@10.91.24.176:~/ # 将当前工作目录下的folder文件夹复制到虚拟机的root用户目录scp -P 2222 root@10.91.24.176:~/temp.txt ./ # 将虚拟机root用户目录下的temp.txt复制到当前工作目录scp -P 2222 -r root@10.91.24.176:~/folder ./ # 将虚拟机root用户目录下的folder文件夹复制到当前工作目录
根据自己设备和配置情况修改端口和IP即可;
如果觉得麻烦,也可以使用带有SFTP服务的终端,这里推荐Tabby Terminal,其自带文件功能,可以通过图形化操作,这里不过多赘述
安装docker
获取软件包
apk updateapk add docker
apk包管理器和Ubuntu、Debian的apt包管理器略有不同,使用上述指令安装docker
启动服务
service docker start
如果你想要开机启动,可以使用以下指令:
rc-update add docker default
设置镜像源
自从某个时间点起,从国内就很难正常连接上docker的镜像服务器了,想要正常拉取镜像,我们需要添加一些其它镜像源:
{ "registry-mirrors": [ "https://docker.m.daocloud.io", "https://docker.imgdb.de", "https://docker-0.unsee.tech", "https://docker.hlmirror.com", "https://docker.1ms.run", "https://func.ink", "https://lispy.org", "https://docker.xiaogenban1993.com" ]}
需要手动在etc下建立docker文件夹,并将上面的内容保存至/etc/docker/daemon.json;
之后,重启docker服务
service docker restart
换个方式搜索镜像
再之前docker服务还能够正常访问时间,能够通过命令行直接检索,但目前即使添加了镜像源,检索功能仍然不好使,这里建议直接使用开放了网页服务的镜像站进行检索,如上方镜像源列表的最后一条
https://docker.xiaogenban1993.com
CAUTION注意,拉取镜像时最好带上具体版本标签,不要直接使用latest标签,由于不同镜像源之间不一定会时刻保持最新,有时候拉取latest 并不一定能够获取到最新版本(这里就遇到过拉取gitea/gitea
镜像后修改布局文件无法启动的问题,原因是拉到旧版了,修改的位置不支持导致错误)
简单测试
如图,创建虚拟机时将外部8080端口映射到虚拟机内部80端口,拉取了
gitea/gitea:1.24.0-rc0
镜像,将容器内3000端口映射到容器外80端口,完成一些简单配置后,我们就可以使用手机的IP:8080
访问到gitea页面了,一切正常;
除此之外,还对Nginx、Nodejs、Ubuntu(壳中壳中壳中壳)等镜像进行了测试,除了Nodejs执行构建时巨巨巨慢之外,也没有别的其它问题了;