网红
WSL2 改成桥接网络* 这些功能都还在预览版里, 文档里还没所以记录一下。
好处:
+ 从外部访问 WSL2 不再会有玄学问题。
+ 让 WSL2 支持 IPv6。
wsl \-\-version 输出的版本号在 0.67.6.0 以上。 %USERPROFILE%\.wslconfig , 写入下面几行来换用 Virtual Switch, 把 br1 改成你刚创建的 Virtual Switch 名字。[wsl2]
networkingMode = bridged
vmSwitch = br15. 编辑或创建 WSL 内部的 /etc/wsl.conf , 写入下面几行来启用 systemd 。[boot]
systemd=true6. 用你喜欢的工具配置 WSL 的网络, 就像正常的 Linux 一样。 wsl \-\-shutdown ; bash 重启 WSL2。使用 systemd-nspawn 和 qemu-user-static 运行跨架构容器纯软件虚拟化效率很低, 不适合 CPU 密集型程序。
另外如果用 docker 的话有现成的镜像。
安装 qemu 和设置 binfmt
```
pacman -S archlinuxcn/qemu-user-static archlinuxcn/binfmt-qemu-static
systemctl restart systemd-binfmt
``
现在的内核不需要拷贝 qemu\-*\-static 到容器里。 比较老的内核可能要检查/proc/sys/fs/binfmt_misc/qemu-*` 并拷贝 interpreter。
容器 rootfs
可以用 Debian, ArchLinuxARM 的 systemd 起不来(启动 bash 是没问题的)。
```
debootstrap --include=systemd-container --components=main,universe --arch=arm64 stable ./debian-arm
```
网络
systemd-networkd 启动不了, 装个 dhcpcd 就能开机自动从 host0 获取 IP 地址。
其它的应该和正常的 systemd-nspawn 容器一样。
使用 systemd-networkd 配置 bridge 时。
如果这个 bridge 在 systemd-networkd 配置完网络之前都是空的(比如打算等网络起来之后再往里面添加其它接口), 那么应该在 .network 文件中加上
[Link]
RequiredForOnline=no
这是因为 systemd-networkd 会把不包含任何接口的网桥视为 down 状态, 不指定 RequiredForOnline=no 的话就一定会阻塞 systemd\-networkd\-wait\-online.service 。
这里 args 的源代码
```
#include
int main(int argc, char *argv[]) {
for (int i = 0; i < argc; i++) {
printf("argv[%d]=%s\n", i, argv[i]);
}
}
```
而且 bash 里的 * 本身就是与环境相关会有不同结果的典范。。。
在这个例子中也可以看出, 在当前目录下面有匹配 z* 的文件 z2 的时候, z* 会被 bash 展开为 z2 ,
但是如果没有这种文件, bash 会把 z* 直接传给命令。
换个没有做特殊处理的 shell 就不行了, 和我预想的一样, 在 busybox 中 [[ 就是一个普通的命令。
网红