不用 docker 的原因是,有些时候需要创建不同版本库的开发环境,这个时候,其实只是引用路径的不同,文件系统甚至是 directory 的,而不是 image,当然 LXD 貌似也没有提供类似 docker 的分层的文件系统,主要是我也不大懂 docker。
有一说一,后面其实发现 alpine 除了空间占用小一些,其他都是劣势,比如 musl 的 CRT,居然不能打印调用栈,我也是服气了,下面的内容来自之前的学习,大概是能建立起一个可以用的系统容器。
下面比如 a1、a2 是 alpine instance。
这个 profile 就是 default profile,后续从不同 image(发行版本)创建 container 时,会使用这里的 storage、network 等的配置
这里使用了 alpine 3.18 的 image,由于 container 可以直接保存东西,所以直接拉起来,这里 ash 是不会运行 ~/.profile
的,如果是从 sshd 登陆进去的才会,所以这种情况下需要 source 一下 shell 的配置文件。
$ lxc launch images:alpine/3.18 a1
$ lxc exec a1 ash
比如挂载 host /wwwdata
到 a1 相关目录,之后删除这个挂载,这里的前提是文件其实是只读的,如果需要挂载读写的文件系统,需要创建一个用户权限 map 配置,在容器内的 /etc 相关配置中,不过感觉也不是很方便。
$ lxc config device add a1 sharedwww disk source=/wwwdata/ path=/var/www/html/
$ lxc config device remove a1 sharedwww
用 alpine 容器还遇到问题,比如拉起 cincau 映射 host 端口到容器,容器内的 proxy,居然一直长连接到内部服务器,从不关闭连接,人家 ngnix proxy 就做得很好,由于遇到上面说的 musl CRT 不能打印堆栈,就没有继续研究下去了。
作为封闭的开发环境感觉还行,作为 production 的容器,首先不能用 alpine image,其次,还有不少需要摸索调整的东西吧。
先记录一下。
学习了一下 OTP 这个东西,比如用的是 LuaOTP。
区分为 OTP、TOTP、HOTP 这三种,OTP 英文展开为 One Time Password,是服务端对客户端的一次性密码,属于双因素验证的范畴。
TOTP 这里,公式中的一个参与计算的因子是时间,比如这个时间因子,可以 30 秒更新一次,那这个一次性密码,也是 30 秒更新一次。
HOTP 有一个 counter 的概念,每次用过后都会变化,每次都生成新的,对应的是该一次性密码的使用次数。
上述 LuaOTP 支持 Google Authenticator,浏览器 JS 这边用的是菜鸟教程介绍的qrcodejs,用来生成二维码图片。
当然也可以不生成图片,而是导出字符串,Google Authenticator 也同样支持字符串导入。
之前不大理解这一套,搞了一下,发现也没有那么难。