1.让Gentoo能够跨平台使用选择这套Prefix的位置将Gentoo Prefix放在symlink里2. Gentoo环境配置3. Pyenv配置4. Daemon配置需求实现服务配置5. Cron配置安装Cron6. 自动备份
1.让Gentoo能够跨平台使用
- Gentoo Prefix的配置就是用host的compiler把整套系统编译一波。编译好之后,Gentoo Prefix的位置就不能变了。
- 由于我们经常换slot,每次编译Gentoo都需要5个小时以上,所以为了避免不断地重复编译,我们需要找到一个每个机器都通用,固定不变,且可写的目录
- 想到用/tmp:每个机器上都存在、可写
- /tmp有空间限制,所以还是得放在自己的目录里 → 使用符号链接
选择这套Prefix的位置
- 链接位置:/tmp/.mistyenv/gentoo
- 实际位置:~/.infra
- 一开始是放在/tmp/gentoo-misty的
- 后来发现,/tmp有sticky权限,所以别人创建的文件我无法操作,这导致同一台机器如果因为账号被ban,那么如果我第二次分到同一台机器,就无法再次创建环境了
- 我们放在/tmp/.mistyenv/gentoo,这样多层的目录只要我们把父目录设为777,这样及时账号被封,虽然无法删除.mistyenv,但是里面的文件都是可以修改的
- 相应的,在用户那边我们选择将整个方案放在
~/.infra
里,这样整洁一点
将Gentoo Prefix放在symlink里
- Gentoo默认不允许Prefix放在symlink上,需要手动export一个flag
- 虽然能够无视警告直接安装,但是在emerge的过程中会出现问题:
- https://bugs.gentoo.org/776937
- libkmod、libudev等so的symlink路径不对,导致链接失败
- 解决方法:在bootstrap的时候,cd到prefix里面,循环跑,循环修复路径,这样就不会失败了
while true; do (cd ./usr/lib64 && ls ../../lib64/libkmod.so.2.* && ln -sf ../../lib64/libkmod.so.2.* libkmod.so); sleep 1; done
2. Gentoo环境配置
Emerge了这些常用工具
# basic mosh app-misc/screen app-misc/tmux zsh dev-vcs/git virtual/awk vim app-misc/ca-certificates # network (nc & dig) netcat net-dns/bind-tools # monitor & debugger htop iftop lsof sys-apps/daemonize gdb node_exporter strace btop app-misc/jq # downloader aria2 rclone # py dep (pyenv) sys-libs/readline sys-libs/zlib sys-libs/ncurses-compat sys-libs/ncurses dev-libs/libffi dev-libs/libffi-compat dev-libs/openssl xz-utils sqlite # compiler clang # database dev-db/redis
3. Pyenv配置
Gentoo自带的Python没有Python2,也没有方便的shim功能,所以肯定还是Pyenv更方便。
- Gentoo Prefix上Pyenv的困难在于要让pyenv的python-build找到正确的lib dir和include dir
- 这部分功能在Python3由setup.py控制
- 需要修改self.compiler.inc_dirs和self.compiler.lib_dirs
- 修改好,带Patch的Pyenv见:https://github.com/NyaMisty/pyenv
- 带了2.7.18和3.11.3的patch,后续有需要再更新
4. Daemon配置
需求
Linux发行版重要的一环就是各种daemon的配置,定时任务、各种服务都依赖于daemon来管理,而无root环境正缺少这种东西。
- 作为无root、便携的方案,我们肯定不能用systemd这种与namespace深度绑定的实现,而是需要找到一个十分轻量的工具
- Gentoo自带了openrc,但是他只跟Gentoo自己的生态契合,更多的是走/etc/rc.XXX那一套,其实并不适合我们的需求
- 同时他也需要能满足基本的配置需求,比如变量替换、模板等等
实现
经过挑选,发现golang版本的supervisord完美符合要求
使用系统crontab -e加入启动supervisord的脚本
# m h dom mon dow command */1 * * * * nc -z 127.1 39101 || echo '~/.infra/supervisord/supervisord -c ~/.infra/supervisord/supervisord.conf -d' | script -qef /dev/null >/dev/null 2>&1
服务配置
基于Daemon我们就可以配置服务了。我们配置了这些服务。
- node_exporter:用于监测服务是否正常
- crond:用于将定时任务纳入到Prefix里面管理,方便迁移,避免忘了手动配crontab -e
- 数据库等
5. Cron配置
定时任务纳入到Prefix里面管理会方便配置的统一储存与备份,也方便迁移。
安装Cron
在Gentoo里面有很多种crond,但是他们都没有针对Prefix做适配,所有的crond包都依赖Gentoo的cronbase包,而这个包直接硬编码了所有的路径,因此用Gentoo自带的crond并不可行。
找来找去,发现busybox有自带的crontab和crond,