GentooPrefix无Root通用便携环境

大类
CloudResource
Env
技术标签
云服务-白嫖
环境增强
优先级
Medium
开始日期
May 1, 2023
状态
In Progress
Public
Public
最后更新
Jul 22, 2023

1.让Gentoo能够跨平台使用

  • Gentoo Prefix的配置就是用host的compiler把整套系统编译一波。编译好之后,Gentoo Prefix的位置就不能变了。
  • 由于我们经常换slot,每次编译Gentoo都需要5个小时以上,所以为了避免不断地重复编译,我们需要找到一个每个机器都通用,固定不变,且可写的目录
    • 想到用/tmp:每个机器上都存在、可写
    • /tmp有空间限制,所以还是得放在自己的目录里 → 使用符号链接
22年7月编译Gentoo
23年5月编译gentoo
 

选择这套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的过程中会出现问题:
  • 解决方法:在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
 

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,
 

6. 自动备份