UnRaid配置

大类
Env
Life
技术标签
环境增强
垃圾佬
优先级
Medium
开始日期
May 2, 2023
状态
In Progress
Public
Public
最后更新
May 9, 2023

最基础配置

破解Unraid

 

安装基本工具

  • 然后是各种基础配置
    • 温度监控:Dynamix System Temp
    • 基础命令行工具(Nerd Tool):screen、iotop、python等

然后是代理

  • 网络上教程基本是推荐用docker,但我觉得用docker意味着emhttpd刚启动的时候代理没法用,感觉还不如直接写在usb里
  • 倒腾了一套unraid clash脚本
    • $ 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.d
    • unraid_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)
    • 改了绿色字体(从红色改成了很浅的绿色(要不然谁看得出来他正不正常啊(
notion image
 
  • 安装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中魔改
 
  • 目前我配置了这些:
    • notion image
    • 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就没了

配置Pyenv

调试Slackware安装Pyenv
  • NerdTool装这些
    • notion image
  • 然后shell里装这些
    • spkg 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
    • 实际上就是Chroot的效果
  • 想要实现群晖那样的效果,肯定得魔改sshd
  • 研究了一波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

  • 我配了这些App:
notion image
  • 我个人分成了这些:
    • 基础设施
      • Acronis的备份服务器和备份Agent,用于管理备份
      • ddns-go,DDNS,我和Cloudflare一起用
      • fail2ban,屏蔽ssh爆破,主要是因为unraid的syslog空间有限制,不管他的话syslog一下就满了
      • proxy-server,提供一个内网穿透服务
    • 监控设施
      • netdata/portainer,懂得都懂(
      • scrutiny,新发现的一个神奇的SMART监控(然而刚买的盘就报要完蛋了(
    • 存储相关
      • Alist,用于提供本机存储的WebDAV以及网盘功能
      • Aria2、qBittorrentEE,懂得都懂(
  • 感觉足够了(
    • 再来个npc和nps(