最基础配置
破解Unraid
- 首先是破解,我自己破的,参考了SpringHack的代码,但是他是走的patchelf,我是走的LD_PRELOAD,代码简单好测试
安装基本工具
- 然后是各种基础配置
- 温度监控:Dynamix System Temp
- 基础命令行工具(Nerd Tool):screen、iotop、python等
然后是代理
- 网络上教程基本是推荐用docker,但我觉得用docker意味着emhttpd刚启动的时候代理没法用,感觉还不如直接写在usb里
$ ll /boot/config/clash
total 23M
-rw------- 1 root root 5.6M May 7 01:34 Country.mmdb
-rw------- 1 root root 114 May 7 02:25 README.md
-rw------- 1 root root 16K May 7 01:34 cache.db
-rw------- 1 root root 17M May 7 01:30 clash
-rw------- 1 root root 3.9K May 7 01:30 config.yaml
drwx------ 3 root root 16K May 7 02:20 dashboard
-rw------- 1 root root 289 May 7 02:05 unraid_clash.sh
-rw------- 1 root root 386 May 7 02:04 update_clash_conf
update_clash_conf是cron配置,自动从服务器拉取订阅更新,把他ln到/etc/cron.dunraid_clash.sh是启动脚本,在go里面用这两行调用它# Start Clash
source /boot/config/clash/unraid_clash.sh
#!/bin/sh
cp /boot/config/clash/clash /tmp/clash
chmod 777 /tmp/clash
(/tmp/clash -d /boot/config/clash >/tmp/clash.log 2>&1 &)
sleep 4
PROXYURL="http://127.0.0.1:7890"
export HTTP_PROXY=$PROXYURL
export HTTPS_PROXY=$PROXYURL
export http_proxy=$PROXYURL
export https_proxy=$PROXYURL
Dashboard美化
- 找了网上的二次元美化,拿过来发现6.12不太适配,魔改了一波:
- 改了导航栏(从#nav-block变成了.nav-tile)
- 改了绿色字体(从红色改成了很浅的绿色(要不然谁看得出来他正不正常啊(
- 安装Theme Engine,然后把这些文件放到对应位置,再选择Theme为MistyTheme-dark即可
配置Persistent
Persistent的思路(Copy? Link? Mount?)
- Unraid每次重启之后,只有/boot(u盘)和/mnt(磁盘阵列)里面的东西会保留
- Unraid一般用这些方法保存配置:
- 系统启动的时候复制:如/etc/passwd
- 服务启动的时候复制:如sshd_config,每次/etc/rc.d/rc.sshd重启的时候会从/boot/config/ssh复制
- 软连接:如/root/.ssh,会被link到 /boot/config/ssh/root
- mount:如/var/lib/docker,要么通过docker.img挂载,要么通过mount -o bind挂载
- 结合场景考虑:
- home目录(如/root等):由于变化频繁,拷贝不现实;涉及ssh的权限问题,link也不现实;所以只能直接mount -o bind
- /usr/local/bin:这些目录本身里面有问题,而且不能删,所以mount和软连接需要额外处理。考虑到/usr/local/bin 并不需要经常修改,所以我们呢选择在启动的时候复制
- /etc下的各种东西:这些东西必须在emhttpd启动之前复制过去,所以必须要在/boot/config/go里面配置
- 一般是/etc/docker/daemon.json、/etc/sudoers等
- Persistent存储的位置
- home目录、bin目录均需要经常读写,所以存在u盘里并不可行
- 根据约定俗成,/mnt/user/appdata下建立一个文件夹显然是最优解
- /etc等配置文件修改不频繁,则应存在/boot/config下
Persistent的实现
- 我们使用这两套设施来在不同时刻执行Persistent操作
- User Script应用:
- 可以配置At Startup of Array、At Stopping of Array
- /mnt/user依赖于Array启动,所以在这里执行persist到/mnt的操作
- /boot/config/go魔改:
- 在/boot/config/go中配置source /boot/config/initscript,在initscript中魔改
- 目前我配置了这些:
- mount_home:/root、/opt/pyenv等常读写目录的Persistent
- /root会bind到/mnt/user/appdata/homes/root,/opt/pyenv会bind到/mnt/user/appdata/pyenv,提前建好文件夹
#!/bin/bash
mount -o bind /mnt/user/appdata/homes/root /root
mkdir -p /opt/pyenv; chmod 777 /opt/pyenv
mount -o bind /mnt/user/appdata/pyenv /opt/pyenv
umount_home:对应卸载脚本- 注:似乎由于User Script异步运行,所以umount不及时,系统自己的卸载/mnt/user的流程会失败,所以我们自己umount + rmdir,否则/mnt/user会一直提示
Transport endpoint not connected
#!/bin/bash
set -e
umount -f /root
umount -f /opt/pyenv
umount -f /mnt/user && rmdir /mnt/user
sync_usr:/usr等常读不常写目录的Persistent- 通过rsync合并/mnt/user/appdata/extra-usr目录到/usr
#!/bin/bash
rsync -avhP /mnt/user/appdata/extra-usr/. /usr
配置Shell
- 我直接用的我自己的NyaMisty/.misty_envconf_pub,直接就能用
- 需要结合上面的mount_home,否则重启之后home就没了
- 然后,我接着嫖SpringHack佬的spkg包管理器脚本
配置Pyenv
调试Slackware安装Pyenvspkg update
spkg install guile
spkg install libpwquality
#spkg install gcc-objc
spkg install nvi
#spkg install gcc-gfortran
spkg install glibc-profile
spkg install gcc
spkg install gc
spkg install slackpkg
spkg install aspell-tk
spkg install glibc-i18n
spkg install gettext
spkg install readline
spkg install gcc-g++
#spkg install gcc-gnat
spkg install kernel-headers
spkg install tk
spkg install dialog
spkg install make
spkg install gnupg
#spkg install gcc-go
spkg install time
#spkg install gcc-brig
#spkg install gcc-gdc
spkg install binutils
spkg install bison
spkg install glibc
spkg install zlib
spkg install bzip2
spkg install xz
spkg install icu4c
spkg install ncurses
spkg install sqlite
配置SSH兼容
配置SSH连接兼容
- UnRaid用的OpenSSH 9.1,少ssh-rsa 这个HostKeyAlgorithm,需要补上
- 需要改的sshd_config在/boot/config/ssh/sshd_config里
- 加上:
HostkeyAlgorithms +ssh-rsa
配置SFTP兼容
- 群晖的SFTP进去之后是跟SMB一样只显示User Share,而不是显示rootfs
- 研究了一波ssh的代码,发现sftp受sshd_config里Subsystem配置,一般有两种
- /usr/libexec/sftp-server:很早就有了,单独的程序,方便魔改,但不方便chroot
- internal-sftp:后来加的,直接在sshd内部运行,方便chroot(不需要动态库依赖),但不方便魔改
- 找了一圈,没有好的/usr/libexec/sftp-server的wrapper
- 只有一个OpenSSH 4.9时代的scponly,早已年久失修
- 只能自己魔改OpenSSH,考虑了一下,认为可以直接LD_PRELOAD进去hook OpenSSH
SFTP Chroot的开发历程
- 开发的问题解决了之后,只要patch依稀/etc/rc.d/rc.sshd的/usr/sbin/sshd调用,加上LD_PRELOAD就可以了
$ cat /boot/config/sftp_chroot/patch_ssh_rc.sh
#!/bin/bash
sed -i 's|/usr/sbin/sshd|LD_PRELOAD=/boot/config/sftp_chroot/sftp_chroot.so /usr/sbin/sshd|' /etc/rc.d/rc.sshd
/etc/rc.d/rc.sshd restart
配置各种App
- 我个人分成了这些:
- 基础设施
- Acronis的备份服务器和备份Agent,用于管理备份
- ddns-go,DDNS,我和Cloudflare一起用
- fail2ban,屏蔽ssh爆破,主要是因为unraid的syslog空间有限制,不管他的话syslog一下就满了
- proxy-server,提供一个内网穿透服务
- 监控设施
- netdata/portainer,懂得都懂(
- scrutiny,新发现的一个神奇的SMART监控(然而刚买的盘就报要完蛋了(
- 存储相关
- Alist,用于提供本机存储的WebDAV以及网盘功能
- Aria2、qBittorrentEE,懂得都懂(