Featured image of post systemd

systemd

systemd

preface

Recently, I’ve been setting up a file backup server and need to use RESTIC to perform backups on a regular basis.

These are the tutorials I found.

redhat

I use rhel btw. 其实 rocky 也差不多, 但是 rhel 对于个人可以免费使用(16 台设备), 尝试一下. 我看了这篇 博客, 关于免费使用 rhel 的. 但是博客写于 2022 年, 里面提到的 management/systems 这个地址已经不存在了.

免费使用的思路很简单:

  • 下载镜像
  • 安装
    • 登录账号(当然要先注册啦), 登录的时候不要使用邮箱, 而是使用用户名, 上面博客提到的.
    • 可能登录不上, 要去同意一个条款, 请看 这里
    • 软件源选择 redhat cdn
  • 似乎就结束了. 博客中要选择机器, 但是现在似乎不用了, 但是要每年更新一个订阅信息, 到时候再说吧.

zfs

我有 4 块 1T 的空闲硬盘, 是用于备份数据的, 备份用的软件是 restic, 关于这个软件, 我其实有点担心, 因为 restic 使用的都是一些索引, 我很怕: 因为磁盘某一比特的翻转, 导致我整个备份的 repo 都废了. 我考虑了使用 raid5. 进入 bios, 发现我手上的这款 thinkserver 没有内置 raid; 上几款购物平台, 没有什么想要的 raid 卡; 想到 lvm, 因为红帽系的 fs 默认是 xfs + lvm. 忽然脑袋里灵光一现: zfs 在召唤我.

这有篇博客, 这是他相对应的视频.

installation

我的安装参照了这篇博客 和这篇文档

我的操作如下, 请注意, 我用的是 rhel9.5

  1. for el9(enterprise linux)
1
dnf install https://zfsonlinux.org/epel/zfs-release-2-3$(rpm --eval "%{dist}").noarch.rp
  1. install software itself
1
2
3
sudo dnf config-manager --disable zfs
sudo dnf config-manager --enable zfs-kmod
sudo dnf install zfs
  1. load module right now
1
sudo modprobe zfs
  1. enable module at each boot
1
echo "zfs" | sudo tee /etc/modules-load.d/zfs.conf

拍案: 不要轻易自己切换内核版本, 因为 module 是跟内核版本的, 放在 /lib/modules/xxx 中. 自己切换了内核版本后, 可能会导致: 一些 module 无法被加载.

create raid zpool

1
sudo zpool create mypool raidz1 /dev/sda /dev/sdb /dev/sdc /dev/sdd

mount on /home

1
sudo zfs set mountpoint=/home mypool

当然啦, 我是把原本 lvm 分区删掉了:

  1. delete /home volumn
1
sudo lvremove /dev/mapper/rhel_rocky-home
  1. delete entry in /etc/fstab

  2. extend the root volumn

1
sudo lvextend -l +100%FREE /dev/mapper/rhel_rocky-root

拍案: zfs set mountpoint 是持久化的, 重启后依然有效, 不必添加表项到 /etc/fstab.

samba

考虑到, 我们有业务: Jackson, Jenny, Diana, …

为他们创建在服务器的共享, 需要如下步骤

  1. add linux group
1
sudo groupadd market
  1. add linux user
1
sudo useradd -m -G market jackson
  1. smbpasswd for user
1
sudo smbpasswd -a jackson

可以通过如下命令验证 samba 用户

1
sudo pdbedit -L

homes

/etc/samba/smb.conf 是 samba 服务的配置文件, 他默认提供了一些内容, 其中 homes 非常好.

1
2
3
4
5
6
[homes]
	comment = Home Directories
	valid users = %S, %D%w%S
	browseable = No
	read only = No
	inherit acls = Yes

这个 %S 就是 samba 用户, 具体看 man(5) smb.conf. 其实我也不太清楚, 问问 GPT, 特别是第二个 %D%w%S 更是没有看懂.

我下面有一个需求, 我要让 jennifer/simon 可以查看其他用户的家目录共享, 我可以:

1
2
3
4
5
6
7
# /etc/samba/smb.conf
[homes]
	comment = Home Directories
	valid users = %S, %D%w%S, simon, jennifer
	browseable = No
	read only = No
	inherit acls = Yes

同时, 我需要让 jennifer/simon 加入到其他用户的组里面, 并把相应用户的家目录权限设置为 rwxrwx—(755)

1
2
sudo chmod 770 /home/{diana,emily,jackson,jenny,tiana}
sudo usermod -aG diana,emily,jackson,jenny,tiana jennifer

验证一下 ?

1
2
3
4
5
6
7
$ smbclient //rhel.lan/jenny -U jennifer%22240076
smb: \> ls
  .                                   D        0  Tue Feb 11 20:48:31 2025
  ..                                  D        0  Tue Feb 11 20:48:31 2025
  .bashrc                             H      492  Tue Feb 11 20:40:07 2025
  .bash_logout                        H       18  Tue Feb 11 20:40:07 2025
  .bash_profile                       H      141  Tue Feb 11 20:40:07 2025

确实能正常工作.

共享目录

在 /etc/samba/smb.conf 中追加一条记录. valid users 设置为 market 这个组中的用户.

1
2
3
4
5
# /etc/samba/smb.conf
[market]
  path = /home/market
  writable = yes
  valid users = @market

restic

这里 quickstart 几乎演示了怎么玩.

  1. restic init --repo <repo> 创建仓库
  2. restic backup /path/to/src --repo <repo> 将 src 备份进 repo 中
  3. restic snapshots --repo <repo> 查看快照
  4. restic mount /mount/point -repo <repo> 挂载出来, 可以在挂载的时候加上 --allow-other 这个选项.

还有一些小细节啥的, 比方说可以从环境变量RESTIC_PASSWORD处读取密码, 这可以用在非交互式环境等. 比方说我的这个 systemd 定期备份脚本.

mount.cifs

可以使用 mount.cifs 来挂载远程的 samba 共享到本地. 因为我这里是局域网, 所以我明文的进行挂载, 但是这样不好, 如果有程序读取 .bash_history 那么也废了一半. 我这里在挂载的时候, 写了一个只读的选项, 就是怕误操作.

1
mount.cifs //<host>/<share> /mount/point -o ro,username=<xxx>,password=<xxx>

systemd executes restic on a regular basis

我写了一个脚本, 仓库在这里

值得注意的一点: 需要将 backup.service 的 service’s type 设置为 notify, 然后在 python 中设置: systemd.daemon.notify("READY=1"), 不然就会出现一个现象: systemctl start backup.service 后不返回, 如果 <C-c>, 那么可以在 systemctl status backup.service 的时候发现 failed, 这是因为没有变成守护进程: 没有与控制终端分离. 即使用了 python-daemon, 那其实也有问题, 不信可以试试.

这也是我参考别人的

效果

windows server 2016 openssh

installation openssh

我看了这篇博客. 请看前半段, 后面 firewall 的设置可以不看, 看下面.

firewall: allow openssh port

我看了 stackoverflow 这篇帖子

省流:

1
netsh advfirewall firewall add rule name="Open SSH Port 22" dir=in action=allow protocol=TCP localport=22 remoteip=any

set ssh public key on windows server

我看了这篇博客.

里面需要注意一下几点

  1. windows openssh-server 需要手动 PubkeyAuthentication yesStrictModes no
  2. Administrator 用户的 authorized_keys 需要单独设置 administrators_authorized_keys

具体请看上面博客.

haskell

注意一个问题, 如果是新装的 rhel9, cabal install hlint 的时候可能会有一些报错, 需要安装 32bit 的 libc

1
sudo dnf install gmp-devel