├── Debian ├── aria2 │ ├── aria2.conf │ └── aria2.service ├── btrfs.md ├── cd-player.md ├── desktop.md ├── index.md ├── libimobiledevice.md ├── osx-kvm.md ├── schedule │ ├── daily_archive.service │ ├── daily_archive.sh │ ├── daily_archive.timer │ ├── daily_iPhoneBackup.service │ ├── daily_iPhoneBackup.sh │ ├── daily_iPhoneBackup.timer │ ├── monthly_clearArchive.service │ ├── monthly_clearArchive.sh │ └── monthly_clearArchive.timer └── vmware.md ├── MidiPi └── index.md ├── PeerTube └── index.md └── README.md /Debian/aria2/aria2.conf: -------------------------------------------------------------------------------- 1 | enable-rpc=true 2 | rpc-listen-all=true 3 | rpc-allow-origin-all=true 4 | 5 | dir=/mnt/Documents/Files/Downloads 6 | 7 | disk-cache=64M 8 | file-allocation=falloc 9 | no-file-allocation-limit=64M 10 | 11 | continue=true 12 | always-resume=false 13 | max-resume-failure-tries=0 14 | remote-time=true 15 | 16 | input-file=/home/megabits/.aria2/aria2.session 17 | save-session=/home/megabits/.aria2/aria2.session 18 | save-session-interval=1 19 | force-save=false 20 | 21 | max-file-not-found=10 22 | max-tries=0 23 | retry-wait=10 24 | max-concurrent-downloads=5 25 | max-connection-per-server=16 26 | split=64 27 | min-split-size=4M 28 | piece-length=1M 29 | allow-piece-length-change=true 30 | http-accept-gzip=true 31 | reuse-uri=false 32 | no-netrc=true 33 | allow-overwrite=false 34 | auto-file-renaming=true 35 | content-disposition-default-utf8=true 36 | -------------------------------------------------------------------------------- /Debian/aria2/aria2.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description = aria2c 3 | After = network.target 4 | StartLimitIntervalSec = 30 5 | StartLimitBurst = 2 6 | 7 | [Service] 8 | User=megabits 9 | Type = simple 10 | ExecStart = /usr/bin/aria2c --conf-path=/home/megabits/.aria2/aria2.conf 11 | Restart = on-failure 12 | RestartSec = 10s 13 | 14 | [Install] 15 | WantedBy = multi-user.target 16 | -------------------------------------------------------------------------------- /Debian/btrfs.md: -------------------------------------------------------------------------------- 1 | # Debian 使用 Btrfs 文件系统实现快照和恢复 2 | 3 | 我们大家都用过虚拟机,虚拟机可以打快照,弄坏了就可以回档。但这件事在真机上并不好实现。在 Linux 中我们可以借助 Btrfs 做到这一点。Btrfs 在文件系统中集成了快照功能,但由于手动创建和恢复比较麻烦,所以需要一些工具配合。 4 | 5 | 最常见的工具是 Snapper,但由于 Snapper 是为 OpenSUSE 设计的,并没有考虑其他发行版的情况,所以在 Debian 上需要手动做一些事。假如你的 Debian 安装了桌面环境,我这里比较推荐使用 Btrfs Assistant。基本上是装好了开箱即用的。但遇到无法进入桌面环境的情况就会很尴尬了,因为你对现在系统上 Btrfs 的状况缺乏了解,很可能会睁眼瞎不知该怎么回档。所以如果你想要更加的安全,我还是建议从头配置 Snapper,之后再来安装图形界面的管理工具。 6 | 7 | ## 分区 8 | 9 | 在安装 Debian 时使用专家安装,如果你是第一次碰专家安装,建议网上找找安装过程的视频先看一遍避免出错。使用专家安装的目的是为了能够在每个步骤之后停下。 10 | 11 | 分区时首先创建一个 500M 左右的 `EFI` 分区,这部分没什么特别的。接下来你有两个选择: 12 | 13 | 1. 使用全盘加密。在加密分区外创建一个 1G 左右的 `boot` 分区,再创建加密分区,在加密分区中创建 `/` 和 `swap`。 14 | 2. 不使用全盘加密,直接创建 `/` 和 `swap`。 15 | 16 | 不管选哪个,都要记得创建 Btrfs 格式的分区。然后不必在 Btrfs 中创建除了 `/` 之外的分区。我们可以之后再创建。 17 | 18 | 在分区完成后,不要着急安装。此时按下 `Crtl+Alt+F3` 等切换到其他的有命令行的 TTY。 19 | 20 | ## 重建子分区 21 | 22 | 首先用 `df -h` 查看一下现在挂载的磁盘。你会看到类似下面的列表: 23 | 24 | ```bash 25 | Filesystem Size Used Avail Use% Mounted on 26 | ... 27 | /dev/nvme0n1p3 231G 62G 168G 27% /target 28 | /dev/nvme0n1p1 285M 5.9M 279M 3% /target/boot/efi 29 | ``` 30 | 31 | 这其中我们可以看到 Debian 安装程序将目标磁盘挂载到了 `/target` 下。我这里没有使用加密,如果使用了加密分区还有 KVM 之类的,则左侧的 `/dev/nvme0n1p3` 会变成 `/dev/mapper/VolumeGroupName-LogicVolumeName` 之类的东西。将这个列表记住,可以用手机拍个照之类的。 32 | 33 | 为了对其进行修改,我们要先把子分区一层一层地卸载,然后把整个分区的根挂载出来。我这里没有加密,如果你有加密的话,`boot` 分区会在加密分区的外部,也同样需要单独卸载。 34 | 35 | ```bash 36 | umount /target/boot/efi 37 | umount /target 38 | mount /dev/nvme0n1p3 /mnt 39 | ``` 40 | 41 | 这时如果我们来看 `/mnt` 的内容,就会看到一个: 42 | 43 | ```bash 44 | @rootfs 45 | ``` 46 | 47 | 这个 `@rootfs` 就是我们的各种麻烦事的万恶之源了。我们将它重命名为 `@`。 48 | 49 | ```bash 50 | mv @rootfs @ 51 | ``` 52 | 53 | 接下来创建一个专门用于存放 Snapper 快照的子分区。 54 | 55 | ```bash 56 | btrfs subvolume create @snapshots 57 | ``` 58 | 59 | 也可以简写为 60 | 61 | ```bash 62 | btrfs su cr @snapshots 63 | ``` 64 | 65 | 你也可以创建一些其他你想要分别管理的子分区。不过越多一会越麻烦。 66 | 67 | ```bash 68 | btrfs su cr @home 69 | btrfs su cr @log 70 | btrfs su cr @cache 71 | btrfs su cr @crash 72 | btrfs su cr @tmp 73 | btrfs su cr @spool 74 | ... 75 | ``` 76 | 77 | 接下来把这个根卸载。 78 | 79 | ```bash 80 | umount /mnt 81 | ``` 82 | 83 | 接下来我们要把刚刚创建的子分区一个一个挂载上。注意这里 efi 在不同的分区上,`@snapshots` 要挂载到 `.snapshots` 文件夹上。在那之前不要忘了用 `mkdir` 创建这些目标文件夹。 84 | 85 | 有一点很需要注意的是顺序,要先 mount 外层的目录,否则会产生一些非预期的行为。 86 | 87 | ```bash 88 | mount -o rw,noatime,compress=zstd,subvol=@ /dev/nvme0n1p3 /target 89 | mkdir /target/.snapshots 90 | mount -o rw,noatime,compress=zstd,subvol=@snapshots /dev/nvme0n1p3 /target/.snapshots 91 | mount -o rw,noatime,compress=zstd,subvol=@home /dev/nvme0n1p3 /target/home 92 | ... 93 | mount /dev/nvme0n1p2 /target/boot # 也许会有 94 | mount /dev/nvme0n1p1 /target/boot/efi 95 | ``` 96 | 97 | 之后我们还要修改 `/target/etc/fstab` 来让系统记住这些子分区。 98 | 99 | 在文件的上方,我们会找到这样一行: 100 | 101 | ```bash 102 | UUID=0bd3d1d3-6814-4703-8796-c200c2f07552 / btrfs subvol=@rootfs 0 0 103 | ``` 104 | 105 | 我们要把这一行的参数修改成我们刚刚挂载使用的参数,之后有多少子分区就写多少行。 106 | 107 | ```bash 108 | UUID=0bd3d1d3-6814-4703-8796-c200c2f07552 / btrfs rw,noatime,compress=zstd,subvol=@ 0 0 109 | UUID=0bd3d1d3-6814-4703-8796-c200c2f07552 /.snapshots btrfs rw,noatime,compress=zstd,subvol=@snapshots 0 0 110 | UUID=0bd3d1d3-6814-4703-8796-c200c2f07552 /home btrfs rw,noatime,compress=zstd,subvol=@home 0 0 111 | ... 112 | ``` 113 | 114 | 保存,回到安装用的 TTY 完成剩下的安装步骤。 115 | 116 | ## 配置 Snapper 117 | 118 | 首先安装 Snapper。 119 | 120 | ```bash 121 | sudo apt install snapper 122 | ``` 123 | 124 | 为了防止 Snapper 自动创建的快照干扰我们工作,先给他处理掉。 125 | 126 | ```bash 127 | cd / 128 | sudo umount .snapshots 129 | sudo rm -r .snapshots 130 | ``` 131 | 132 | 接下来让 Snapper 接管根目录。注意这里的根是指子分区中的 @,不是磁盘上真正的根。 133 | 134 | ```bash 135 | sudo snapper -c root create-config / 136 | ``` 137 | 138 | 然后我们来做一些配置,大家可以按需调整。 139 | 140 | ```bash 141 | sudo systemctl disable snapper-boot.timer # 禁用开机快照 142 | sudo snapper -c root set-config 'TIMELINE_CREATE=no' # 禁用定时快照(可选) 143 | sudo nano /etc/snapper/configs/root # 可以调整定时快照的选项 144 | sudo nano /lib/systemd/system/snapper-timeline.timer # 调整定时快照的清理周期 145 | sudo snapper -c root set-config 'ALLOW_GROUPS=sudo' # 免 sudo 使用 146 | sudo snapper -c root set-config 'SYNC_ACL=yes' # 精确保存文件权限 147 | sudo nano /etc/apt/apt.conf.d/80snapper # 调整是否在 apt 执行时快照 148 | ``` 149 | 150 | 接下来你可以继续让 Snapper 接管每一个子分区。 151 | 152 | ```bash 153 | sudo snapper -c root create-config /home 154 | ··· 155 | ``` 156 | 157 | 最后再重新把保存快照的子分区挂载上。 158 | 159 | ```bash 160 | sudo btrfs su del /.snapshots 161 | sudo mkdir .snapshots 162 | sudo mount -av 163 | ``` 164 | 165 | 接下来我们就可以自由的创建快照了。 166 | 167 | ## 快照管理 168 | 169 | 创建快照非常简单。如果你的系统中只有一个 `@` 子分区需要管理,`-c root` 还可以省略。 170 | 171 | ```bash 172 | sudo snapper --config root create --description "Aha!" 173 | ``` 174 | 175 | 或简写为: 176 | 177 | ```bash 178 | sudo snapper -c root create -d "Aha!" 179 | ``` 180 | 181 | 来看看我们创建的快照。 182 | 183 | ```bash 184 | sudo snapper list 185 | ``` 186 | 187 | ``` 188 | # | Type | Pre # | Date | User | Cleanup | Description | Userdata 189 | ----+--------+-------+--------------------------+----------+---------+----------------------+--------- 190 | 0 | single | | Sat Jan 6 17:02:13 2024 | root | | Aha! | 191 | ``` 192 | 193 | 删除快照也十分简单。 194 | 195 | ```bash 196 | sudo snapper -c root del 0 197 | ``` 198 | 199 | 麻烦的是回档。 200 | 201 | ## 恢复快照 202 | 203 | 虽然我们可以直接使用 Snapper 恢复快照,但这个过程一点都不让人省心。与其说是帮你恢复快照,Snapper 不如说是给你创建了一个目标快照的可读写副本,至于进入快照还有把那个副本替换成真的快照之类的麻烦事就得自己干了。所以我们需要使用一个脚本。 204 | 205 | ```bash 206 | sudo apt install python3-btrfsutil 207 | git clone 'https://github.com/jrabinow/snapper-rollback.git' 208 | cd snapper-rollback 209 | sudo cp snapper-rollback.py /usr/local/sbin/snapper-rollback 210 | sudo cp snapper-rollback.conf /etc/ 211 | ``` 212 | 213 | 然后我们需要编辑一下配置文件。 214 | 215 | ```bash 216 | sudo nano /etc/snapper-rollback.conf 217 | ``` 218 | 219 | 把最后面这一行取消注释,改成你硬盘的分区。 220 | 221 | ```bash 222 | dev = /dev/nvme0n1p3 223 | ``` 224 | 225 | 之后就可以用它来回档了。执行完成后重启系统。 226 | 227 | ```bash 228 | sudo snapper-rollback 229 | ``` 230 | 231 | 在完成回档之后,还会产生一个备份用的子分区。如果不删除还会一直占用空间。可以用以下的方式删除,那些备份用的分区名字很好认。 232 | 233 | ```bash 234 | sudo mount -o subvolid=0 /dev/nvme0n1p3 /mnt 235 | cd /mnt 236 | sudo btrfs subvolume delete 237 | sudo umount /mnt 238 | ``` 239 | 240 | 不过 snapper-rollback 应该只能用来给 `@` 回档,其他的东西还是要用 Btrfs Assistant 或者 snapper-gui 比较方便。 241 | 242 | 243 | ## 救急 244 | 245 | 有时候我们会遇到系统都进不去的情况,为了防患于未然,我们还需要其他工具。安装 grub-btrfs 就可以在 GRUB 中显示当前系统中的所有快照。因为 Debian 中没有这个包,所以需要自己编译安装。 246 | 247 | ```bash 248 | sudo apt install inotify-tools 249 | git clone https://github.com/Antynea/grub-btrfs.git 250 | cd grub-btrfs 251 | sudo make install 252 | sudo systemctl start grub-btrfsd 253 | sudo systemctl enable grub-btrfsd 254 | ``` 255 | 256 | 以后再执行 `sudo update-grub` 的时候也会跟着把快照写进去。 257 | 258 | ## 增加新的子分区 259 | 260 | 有时候我们在安装完成之后还想增加新的子分区。比如说我们安装了 KVM 但不想要备份 KVM 的文件(因为太大了)。这时候该怎么办呢? 261 | 262 | 首先创建一个新的文件夹用于挂载 btrfs 真正的 root,然后挂载。如果忘了是哪个盘的话,可以用 `df -h` 再确认一下。 263 | 264 | ```bash 265 | sudo mkdir /mnt/btrfsroot 266 | sudo mount -o subvol=/ /dev/nvme0n1p3 /mnt/btrfsroot/ 267 | ``` 268 | 269 | 接下来创建新的子分区,然后解除挂载。 270 | 271 | ```bash 272 | cd /mnt/btrfsroot 273 | sudo btrfs su cr @images 274 | cd .. 275 | sudo umount btrfsroot 276 | ``` 277 | 278 | 和之前一样编辑 `/target/etc/fstab` 在其中添加新子分区的信息。 279 | 280 | ```bash 281 | UUID=0bd3d1d3-6814-4703-8796-c200c2f07552 /var/lib/libvirt/images btrfs rw,noatime,compress=zstd,subvol=@images 0 0 282 | ``` 283 | 284 | 最后重新挂载所有分区就完成了。 285 | 286 | ```bash 287 | sudo mount -av 288 | ``` 289 | 290 | 以上就是我最近研究 Btrfs 快照的一些经验了,希望能对你有所帮助。 291 | 292 | ## 参考资料 293 | 294 | [Installing Debian with BTRFS, Snapper backups and GRUB-BTRFS - A. Nagatani 永谷](https://freedium.cfd/https://medium.com/@inatagan/installing-debian-with-btrfs-snapper-backups-and-grub-btrfs-27212644175f) 295 | 296 | [Debian 12: Fighting with OpenSUSE Snapper! - Stephen's Tech Talks](https://www.youtube.com/watch?v=b4vTKg-qW_0) 297 | -------------------------------------------------------------------------------- /Debian/cd-player.md: -------------------------------------------------------------------------------- 1 | # 在 Debian 上使用 Mac mini 的红外接收器控制 CD 播放 2 | 3 | 这个需求可以说是相当小众了,毕竟像我这么怀旧的人不多。因为我在用 2014 款的 Mac mini 当家里的服务器,所以我很想发挥它最大的作用,而且我有很多 CD。这一代的机器本身是没有光驱的,但我有一个外接的苹果光驱。我用的是初代的苹果遥控器,整个配置做好后可以实现如下功能: 4 | 5 | - 按播放键开始播放/暂停 6 | - 音量增减 7 | - 上一曲/下一曲 8 | - 长按菜单键弹出光盘 9 | 10 | ## 安装声卡驱动 11 | 12 | 这里我们使用 piewire。虽然实际上是只用 palse 的接口的,不过把能装的都装了反正以后也要用。如果你的电脑带声音之类的都配置好了,可以跳过这一章节。 13 | 14 | ```bash 15 | sudo apt install pipewire pipewire-audio pipewire-alsa pipewire-jack pipewire-pulse 16 | systemctl enable --user --now wireplumber 17 | ``` 18 | 19 | 测试一下声音正不正常 20 | 21 | ```bash 22 | sudo apt-get install alsa-utils 23 | alsamixer # 调一下系统音量要么听不见 24 | speaker-test 25 | ``` 26 | 27 | ## 安装播放器 28 | 29 | ```bash 30 | sudo apt install mplayer 31 | ``` 32 | 33 | 编辑 mplayer 的配置文件 `.mplayer/config` 在其中加入如下内容: 34 | 35 | ```bash 36 | cache=2048 # 不加的话放 CD 会卡 37 | volume=70 38 | lircc=Yes # 接收遥控器 39 | ``` 40 | 41 | 然后插一张碟测试一下。播放时候可以按 9 和 0 来调节音量。! 和 @ 可以上一曲下一曲。 42 | 43 | 44 | ```bash 45 | mplayer cdda:// 46 | ``` 47 | 48 | ## 配置 lirc 49 | 50 | 首先下载 Mac mini 红外接收器的配置文件。通过观察文件可以发现,苹果的接收器不是一个真的红外接收器,它并不会把实际的信号给你,只是告诉你它识别到了什么,识别不到的就当不存在了。 51 | 52 | ```bash 53 | sudo apt install lirc 54 | sudo systemctl enable lircd 55 | irdb-get update 56 | irdb-get download apple/macmini.lircd.conf 57 | sudo mv macmini.lircd.conf /etc/lirc/lircd.conf.d/ 58 | ``` 59 | 60 | 重启服务,尝试检测遥控器。在执行下面的命令后对着按遥控器,如果输出了按键就成功了。 61 | 62 | ```bash 63 | sudo systemctl restart lircd 64 | irw /var/run/lirc/lircd 65 | ``` 66 | 67 | ## 配置遥控器操作 68 | 69 | 编辑下面的文件,写入配置。这个文件的结构很简单,可以参照 lirc 的帮助文档阅读。这个文件是给 mplayer 读的。 70 | 71 | ```bash 72 | nano ~/.lircrc 73 | ``` 74 | 75 | ```bash 76 | begin 77 | button = KEY_VOLUMEUP 78 | prog = mplayer 79 | config = volume 1 80 | repeat = 1 81 | end 82 | 83 | begin 84 | button = KEY_VOLUMEDOWN 85 | prog = mplayer 86 | config = volume -1 87 | repeat = 1 88 | end 89 | 90 | begin 91 | button = KEY_FORWARD 92 | prog = mplayer 93 | config = seek_chapter 1 94 | end 95 | 96 | begin 97 | button = KEY_REWIND 98 | prog = mplayer 99 | config = seek_chapter -1 100 | end 101 | 102 | begin 103 | button = KEY_PLAY 104 | prog = mplayer 105 | config = pause 106 | end 107 | 108 | begin 109 | button = KEY_MENU 110 | prog = mplayer 111 | config = quit 112 | ignore_first_events = 10 113 | end 114 | ``` 115 | 116 | 在另一个命令行窗口中打开 mplayer 调试。用遥控器按键看有没有反应。不出意外应该就已经可以用了。 117 | 118 | ## 配置后台启动 119 | 120 | 现在虽然已经可以遥控了,但是还得我们先自己把 mplayer 打开,就非常的麻烦。所以接下来我们来让它自动打开。 121 | 122 | 新建一个脚本文件,我的文件放在 `~/scripts/irexec_mplayer_run.sh` 这里。 123 | 124 | ```bash 125 | #!/usr/bin/env bash 126 | 127 | echo "Start Playing audio CD."; 128 | mplayer_processes=$(pgrep mplayer 2>/dev/null) 129 | 130 | if [[ -z "$mplayer_processes" ]]; then 131 | mplayer -ao pulse cdda:// 132 | fi 133 | ``` 134 | 135 | 这个脚本的内容是在检测 mplayer 是否已经运行,如果没有则运行。 136 | 137 | 接下来编辑 `/etc/lirc/irexec.lircrc`,将其中全部内容删除,改为下面的内容。这个文件是给 irexec 读的,它和上面准备的给 mplayer 读的文件不冲突,绑定到同一按键上的操作会同时执行。 138 | 139 | ```bash 140 | begin 141 | button = KEY_PLAY 142 | prog = irexec 143 | config = /home/megabits/scripts/irexec_mplayer_run.sh 144 | end 145 | 146 | begin 147 | button = KEY_MENU 148 | prog = irexec 149 | config = eject 150 | ignore_first_events = 10 151 | end 152 | ``` 153 | 154 | 接下来我们要将 irexec 的服务调整为用户所有。这主要是因为声卡驱动是在用户权限下执行的。先把服务停止,然后移动文件位置。 155 | 156 | ```bash 157 | sudo systemctl stop irexec.service 158 | sudo systemctl disable irexec.service 159 | sudo mv /lib/systemd/system/irexec.service /lib/systemd/user/ 160 | ``` 161 | 162 | 在对应的位置加入或修改为下面的内容: 163 | 164 | ```bash 165 | [Unit] 166 | ... 167 | After=pulseaudio.service 168 | Wants=pulseaudio.service 169 | [Service] 170 | ... 171 | Environment="XDG_RUNTIME_DIR=/run/user/1000" 172 | Environment="PULSE_RUNTIME_PATH=/run/user/1000/pulse/" 173 | [Install] 174 | WantedBy=default.target 175 | ``` 176 | 177 | 以用户权限启动服务并允许其在开机后自动恢复运行。 178 | 179 | ```bash 180 | loginctl enable-linger $(whoami) 181 | sudo systemctl daemon-reload 182 | systemctl --user enable irexec.service 183 | systemctl --user start irexec.service 184 | ``` 185 | 186 | 接下来应该就可以正常使用了。 187 | 188 | ## 参考资料 189 | 190 | [LIRC: linux infrared remote control - Dan's Cheat Sheets](https://cheat.readthedocs.io/en/latest/lirc.html#why-is-this-so-hard) 191 | 192 | [LIRCによるMplayerの操作+ALSA設定 - Ficusonline Forum](https://forum.ficusonline.com/t/lirc-mplayer-alsa/70) 193 | 194 | [Welcome to the LIRC 0.10.0rc1 Manual - LIRC](https://www.lirc.org/html/index.html) 195 | 196 | [LIRC Configuration - Zorin Forum](https://forum.zorin.com/t/lirc-configuration/8829) 197 | 198 | -------------------------------------------------------------------------------- /Debian/desktop.md: -------------------------------------------------------------------------------- 1 | # 桌面环境备忘录 2 | 3 | 最近用 M1 Air 安装了 Asahi Linux,桌面主力从 Debian 转到了 Fedora。所以更新一下这篇文章。 4 | 5 | 从 FlatPak 安装: 6 | - Extension Manager 7 | - dconf Editor 8 | 9 | 接下来安装常用软件包。 10 | 11 | - ibus-rime:中文输入法,同时安装东风破(plum)和雾凇拼音方案。 12 | - ibus-mozc:日语输入法。 13 | - vlc:路障。(或者 mpv) 14 | - ghex:HEX 编辑器。 15 | - meld:文件对比工具。 16 | - gear-lever:App Image 管理工具。 17 | - default-jdk:咖啡冒热气。 18 | - wireshark:脆脆鲨。 19 | 20 | ```bash 21 | sudo usermod -a -G wireshark $(whoami) 22 | sudo chmod +x /usr/bin/dumpcap 23 | ``` 24 | 25 | ## Gnome 插件 26 | 27 | - Clipboard Indicator:剪贴板管理器。 28 | - Dash to Dock:快捷启动当 Dock 用。 29 | - Blur my Shell:各种界面模糊。 30 | - AppIndicator and KStatusNotifierItem Support:传统通知图标支持。 31 | - Just Perfection:界面微调。 32 | - Burn My Windows:窗口开关特效。 33 | - Focused Window D-Bus:给其他程序提供接口。 34 | - TailScale-QS:TailScale 开关。 35 | - Battery Health Charging:限制只充 80% 36 | 37 | 38 | ## 美化 39 | 40 | [Fluent-icon-theme](https://github.com/vinceliuice/Fluent-icon-theme) 41 | 42 | ## 防精分 43 | 44 | [Toshy](https://github.com/RedBearAK/toshy): 在 Linux 上使用 macOS 的快捷键。 45 | 46 | ### 输入法 47 | 48 | 虽然说 Rime 装雾凇拼音就可以了(按 F4 切换方案)。不过因为 macOS 的使用习惯现在是 CapsLock 切中英文,所以这边也要统一一下。 49 | 50 | 打开 Rime 的设置,应该在 `~/.config/ibus/rime/default.yaml`。找到切换的部分,改成下面这样就可以了。 51 | 52 | ```bash 53 | ascii_composer: 54 | good_old_caps_lock: false # 这里改成 false 55 | switch_key: 56 | Caps_Lock: commit_code # 这里改成 commit_code 57 | Shift_L: noop # 这里改成 noop 58 | ... 59 | ``` 60 | 61 | ### 修改手势 62 | 63 | 关闭 Tap to Click。 64 | 65 | ## 调整滚动速度 66 | 67 | ### 调整全局触摸板速度 68 | 69 | Gnome 可以直接调整的触摸板速度是有极限的。剩下的就得直接改参数了。参阅:[Adjust Touchpad Scrolling Speed in Ubuntu 22.04 | 23.04 GNOME Wayland](https://ubuntuhandbook.org/index.php/2023/05/adjust-touchpad-scrolling-ubuntu/)。 70 | 71 | 先随便写一个尺寸让他吐出真的尺寸来,之后直接退出就可以。找到 Kernel specified touchpad size 记下来。 72 | 73 | ```bash 74 | sudo libinput measure touchpad-size 100x100 75 | ``` 76 | 77 | 用刚刚记下来的尺寸乘放大比例,算出一个数字写上去。 78 | 79 | ```bash 80 | sudo libinput measure touchpad-size 45x28 81 | ``` 82 | 83 | 按指示把触控板摸一遍,然后退出。按指示把输出粘贴到 `/etc/udev/hwdb.d/60-evdev-local.hwdb` 中。 84 | 85 | ```bash 86 | sudo systemd-hwdb update 87 | sudo udevadm trigger /dev/input/event* 88 | ``` 89 | 90 | 最后重启生效。 91 | 92 | ### 调整 Firefox 93 | 94 | Firefox 很多东西都得单独调,似乎和 Wayland 不是很对付。 95 | 96 | 从地址栏进入 `about:config`,搜索 `mousewheel.default.delta_multiplier_y` 改成需要的数字即可。 97 | 98 | ## 删除桌面文件夹 99 | 100 | 桌面在 Gnome 里没有意义,但是不能直接删掉。 101 | 102 | 需要先在 `.config` 里面建立一个假的 Desktop 文件夹。然后在 `.config/user-dirs.dirs` 里修改使其指向刚刚创建的假文件夹。然后把真的 Desktop 删掉眼不见心不烦。 103 | 104 | 需要整理的东西大概就是这么多。 105 | -------------------------------------------------------------------------------- /Debian/index.md: -------------------------------------------------------------------------------- 1 | # 2024 我对我的 Mac mini 做了什么 2 | 3 | 最近我一连更新了几篇文章,关于对我的 Mac mini 2014 的 Debian 改造。大头都写完了之后我准备写一篇文章把这些东西都串起来,让大家对这次改造有一个整体的认识,也算是我自己的备忘。 4 | 5 | 这台 Mac mini 2014 是我的第一台 Mac。我的 App PomoNow 的第一版是在这个机器上开发的,这台电脑的键盘我直到现在都还在使用。在有了新电脑之后,我也尽可能的利用这台电脑,把它拿来当作家里的服务器,给我提供各种文件备份和共享服务。而我也一直在上面运行 OS X。 6 | 7 | 继续用 OS X 做服务器的原因非常简单,文件共享可以直接在偏好设置里开,对我的需求来讲非常的省心。我差不多就是用这 Mac 当 NAS 用。而且还可以用于 CI/CD。当时我还在用 Xcode Server。 8 | 9 | 比较有趣的是,这台 Mac mini 是苹果最后一款可以同时安装 SSD 和 HDD 的型号。这台机器是只有 HDD,8G 内存的机型,但是主板上却保留了 SSD 的接口。虽然是苹果自己的特殊接口,但是华强北早就给我们解决了。所以我来日本之后就给这个机器加了 NVME SSD。然后 HDD 现在也是 2T 的了。 10 | 11 | 之后 OS X 变成了 macOS,苹果也终于把这台机器 Drop 了。但没过多久,OpenCore Legacy Patcher 被搞出来了,所以我就继续在这台机器上运行最新的 macOS。追求最新的 macOS 主要有两个原因,一个是 CI/CD 必须得支持最新的 Xcode,另外一个是公开到公网上的服务不更新可能会有 0day。 12 | 13 | 直到最近,这台电脑越来越不正常了。不知道是旧的驱动和 Sonoma 合不来还是怎样,显卡驱动经常会崩溃,然后会顺带让 Window Server 卡死 CPU 100%。一大早听见那个声音还感觉电表要倒转了。尤其在元旦附近这种现象发生越来越频繁了。为了彻底解决这个问题我终于决定把 macOS 刷成 Linux,然后把 macOS 关进虚拟机,让其自生自灭。 14 | 15 | 接下来我就按整个流程的顺序详细讲一下我都做了什么。 16 | 17 | ## 安装系统 18 | 19 | 因为是做服务器平时不会碰,所以我完全没有安装图形环境。就是纯命令行的非常干净的 Debian。之所以选择 Debian 一方面是我对 Debian 系比较熟悉,我的主力 Linux 电脑也是 Debian。另外也是出了问题教程好找,就算找不到 Debian 的,Ubuntu 的也能凑活用。剩下就没什么特别大的原因了。 20 | 21 | 安装时候配置了用了 Btrfs,参见文章:[Debian 使用 Btrfs 文件系统实现快照和恢复](btrfs.md)。 22 | 23 | 我将 HDD 挂载到了 `/mnt/Documents` 也是 Btrfs。 24 | 25 | ## 安装 Wi-Fi 驱动 26 | 27 | 这台机器距离路由器很远,不好拉线,所以我还是走无线网络了。无线网卡的驱动一般不是自由软件,所以要把非自由软件源打开,然后自己装。 28 | 29 | ```bash 30 | sudo apt install broadcom-sta-dkms network-manager 31 | ``` 32 | 33 | 然后进 `nmtui` 连 Wifi 就可以了。 34 | 35 | ## File Browser 36 | 37 | [File Browser](https://filebrowser.org) 是一个轻量的文件管理 Web UI,功能刚好够用,我非常推荐。可以直接装也可以在 Docker 里装。需要的朋友可以自己去官网看看。 38 | 39 | 因为要让这个东西开机启动,要写一个 systemd 服务。服务一般都放在 `/etc/systemd/system/` 中。注意这里要写好用户,因为我们不希望有人用 root 权限乱改东西,也不希望以 root 权限创建文件别的程序无法访问。 40 | 41 | ```bash 42 | [Unit] 43 | Description=File Browser Service 44 | After=network.target 45 | 46 | [Service] 47 | User=user 48 | Group=group 49 | Type=simple 50 | Restart=on-failure 51 | RestartSec=5s 52 | ExecStart=filebrowser -d /etc/filebrowser/filebrowser.db 53 | 54 | [Install] 55 | WantedBy=multi-user.target 56 | ``` 57 | 58 | 接下来创建 /etc/filebrowser/ 文件夹,用 sudo 运行一次 `filebrowser`,之后把产生的 filebrowser.db 文件 chown 改成自己的。 59 | 60 | 可以用 `sudo filebrowser config set` 修改地址为 0.0.0.0 开放给局域网,也可以同时修改端口。可以用 `sudo filebrowser user add [username] [password] --perm.admin` 命令添加一个新的 admin。 61 | 62 | 最后用 systemctl 启动服务就可以了。 63 | 64 | 这里讲个题外话。systemd 真的是比 launchd 好用太多了。macOS 的 launchd 甚至都没办法直接看到日志,必须要指定一个输出文件才行。 65 | 66 | ## frp 67 | 68 | frp 是一个很好用的内网穿透工具。用于把部分服务公开到外网。我以前是用 ngrok 的,但是 ngrok 的配置十分麻烦。不但需要自己生成证书,自己编译二进制,证书过期了还得重来。只是当年 frp 的连接非常不稳定动不动就断我才没有采用。过了这几年 frp 取得了长足的进步,现在也没什么大问题了,所以我已经全面转向使用 frp。 69 | 70 | 配置 frp 非常简单只需要下载对应的二进制,写好配置文件执行即可。只是有一点要注意,官方文档给出的 systemd 服务是不会在遇到故障的时候自动重启的,于是我做了一些修改。 71 | 72 | ```bash 73 | [Unit] 74 | Description=frp client 75 | After=network.target syslog.target 76 | Wants=network.target 77 | StartLimitIntervalSec=30 78 | StartLimitBurst=2 79 | 80 | [Service] 81 | Type=simple 82 | ExecStart=/home/megabits/frp/frpc -c /home/megabits/frp/frpc.toml 83 | Restart=on-failure 84 | RestartSec=10s 85 | 86 | [Install] 87 | WantedBy=multi-user.target 88 | ``` 89 | 90 | ## Tailscale 91 | 92 | 同时为了那些并不想要暴露到外网的服务,我使用 [Tailscale](https://tailscale.com) 来访问。其安装也可以直接参考官网即可,实在是简单的不行。只是不要忘了启用它的服务。 93 | 94 | ```bash 95 | sudo systemctl enable --now tailscaled 96 | ``` 97 | 98 | ## Syncthing 99 | 100 | [Syncthing](https://syncthing.net) 是一个同步文件的工具。我用它来实现类似云盘的同步功能,配合 File Browser,我的 Mac mini 可以完全替代云盘。因为 Debian 自带的版本比较老,建议按照[说明](https://apt.syncthing.net)添加官方源。 101 | 102 | 安装完成后以用户态启动服务,之后可以通过 8384 端口访问 WebUI。 103 | 104 | ```bash 105 | sudo systemctl enable --now syncthing@$(whoami) 106 | syncthing --paths // 找到配置文件。 107 | ``` 108 | 109 | 此外因为 Syncthing 是开源软件,公共节点都是志愿者提供的,所以在穿透内网的情况下速度较慢,可以自己搭建中继。 110 | 111 | 安装方法和前面一样从官方源安装。 112 | 113 | ```bash 114 | sudo apt install syncthing-relaysrv 115 | ``` 116 | 117 | 之后先编辑 `/etc/default/syncthing-relaysrv` 添加 token 参参数,关闭 NAT,然后再启动服务。 118 | 119 | ```bash 120 | NAT=false 121 | RELAYSRV_OPTS=-token=myToken 122 | ``` 123 | 124 | ```bash 125 | sudo systemctl start --now strelaysrv 126 | sudo systemctl status strelaysrv 127 | ``` 128 | 129 | 在日志中可以看到访问的 URI。在所有参数最后添加 Token 即可填入设置, 加上两个本地连接,替换 ListenAddress 默认的 default。 130 | 131 | ``` 132 | relay://0.0.0.0:22067/?id=AAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA- 133 | AAAAAAA-AAAAAAA&networkTimeout=2m0s&pingInterval=1m0s&statusAddr=%3A22070&token=myToken, quic://0.0.0.0:22000, tcp://0.0.0.0:22000 134 | ``` 135 | 136 | 有条件还可以自建发现服务器。不过发现服务器不是太影响传输速度,在乎隐私的朋友可以考虑。共享文件时常见的过滤规则可以参见这个 [Gist](https://gist.github.com/marksharrison/ec7646f9539a770f2e86b53c7fc7d309)。 137 | 138 | ## 自动备份 139 | 140 | 对于同步的重要文件,我还会对其进行定期云备份。 141 | 142 | 我在 Oracle Cloud 有注册一个免费的 VPS,并配置了 100GB 的存储块。比较有趣的是,如果我想在 Oracle Cloud 上获得同样容量的对象存储需要花钱,存储块却不用。 143 | 144 | 于是我在 VPS 中也安装了 Syncthing,然后用一个备份专用的文件夹加密同步。再通过计划任务将需要备份的文件打包存入这个文件夹。即实现了一个虽然原始但十分有效的备份逻辑。脚本如下: 145 | 146 | ```bash 147 | #!/bin/bash 148 | 149 | date_string=$(date +'%Y-%m-%d_%H-%M-%S') 150 | 151 | tar --absolute-names --exclude .sync -zcf /mnt/Documents/Backups/Archive/Developer_$date_string.tar.gz /mnt/Documents/Files/Developer 152 | chmod g+rw /mnt/Documents/Backups/Archive/Developer_$date_string.tar.gz 153 | chown megabits:megabits /mnt/Documents/Backups/Archive/Developer_$date_string.tar.gz 154 | backup_files_dev=($(ls -tr "/mnt/Documents/Backups/Archive/Developer_"*.tar.gz)) 155 | 156 | if [[ ${#backup_files_dev[@]} -gt 7 ]]; then 157 | num_files_to_delete=$(( ${#backup_files_dev[@]} - 7 )) 158 | files_to_delete=("${backup_files_dev[@]:0:$num_files_to_delete}") 159 | rm "${files_to_delete[@]}" 160 | fi 161 | ``` 162 | 163 | 这里做了三件事,一个是用 tar 打包保存,保存时排除了 Resilio Sync 的索引文件。之后设置权限确保 Resilio Sync 可以读。最后再检查文件夹中超过一周的文件并删除。我只保留最近一周的备份。 164 | 165 | 脚本写完后用 systemd timer 触发。一样放在 `/etc/systemd/system/` 中首先是 timer 文件: 166 | 167 | ```bash 168 | [Unit] 169 | Description=Run every day 170 | 171 | [Timer] 172 | OnCalendar=*-*-* 05:00:00 173 | 174 | [Install] 175 | WantedBy=timers.target 176 | ``` 177 | 178 | 然后是 service 文件: 179 | 180 | ```bash 181 | [Unit] 182 | Description=Daily Archive 183 | [Service] 184 | ExecStart=/home/megabits/scripts/daily_archive.sh 185 | ``` 186 | 187 | 这里可以看到这个脚本会在每天凌晨五点执行。之后一样在 systemctl 中启用可以了。注意启用时只要启用 timer 即可,不必对 service 进行操作。 188 | 189 | ## 自动手机备份 190 | 191 | 备份使用 libimobiledevice 来实现,参见文章:[Debian 使用 libimobiledevice 实现苹果设备无线备份](libimobiledevice.md)。 192 | 193 | 之后用类似的思路配置 systemd timer 即可。 194 | 195 | ## 文件共享 196 | 197 | 文件共享使用 Samba 和 Netatalk 来实现,其中 Netatalk 是用于支持苹果的 AFP 共享协议的。可以支持诸如 Time Machine 备份等功能。而且因为 AFP 的速度要比 Samba 快好多倍,是一定要搞的。 198 | 199 | 至于为什么速度差这么多,这很可能是苹果的问题。在支持 M1 的 macOS 发布之后,苹果更新的 samba 驱动就有非常严重的性能问题。参见这一篇文章:[M1登場以降 macOSのSMB実装がずっとやらかしている件](https://www.note.lespace.co.jp/n/n53b8d7135039)。 200 | 201 | 不过我们首先来配置 Samba。基本上按网上讲的做就可以。如果要让 Samba 共享的设备名称不要显示成全大写,可以在配置文件的全局设置中加入 `mdns name = mdns`。另外不要忘了设置 Samba 用户的密码:`sudo smbpasswd -a megabits`。 202 | 203 | Netatalk 在 debian 上的配置较为麻烦。主要是因为这个包不在 stable 源中,所以我们要先在系统中添加不稳定源。打开 `/etc/apt/sources.list`。添加: 204 | 205 | ```bash 206 | # Unstable 207 | deb http://deb.debian.org/debian/ unstable main 208 | deb-src http://deb.debian.org/debian/ unstable main 209 | ``` 210 | 211 | 为了防止 apt 使用不稳定源更新仓库导致系统变得不稳定(笑),我们还要调整 apt 的设置。编辑 `/etc/apt/preferences.d/default-release` 改为: 212 | 213 | ```bash 214 | Package: * 215 | Pin: release o=Debian,a=unstable 216 | Pin-Priority: 10 217 | ``` 218 | 219 | Netatalk 的配置文件不像 Samba 那么好找,这里我写一下: 220 | 221 | ```bash 222 | [Global] 223 | log level = default:warn 224 | log file = /var/log/afpd.log 225 | zeroconf = yes 226 | hostname = Home-Server 227 | save password = yes 228 | valid users = megabits 229 | 230 | [Files] 231 | path = /mnt/Documents/Files 232 | ... 233 | ``` 234 | 235 | ## KVM 236 | 237 | 之后我通过 KVM 安装了 macOS 和 Windows 的虚拟机,过程参见文章:[Debian 安装 macOS Sonoma KVM 虚拟机](osx-kvm.md)。 238 | 239 | ## CD 播放 240 | 241 | 因为电脑上插了一个光驱,我还配置了 CD 播放器,可以用苹果的遥控器遥控,过程参见文章:[在 Debian 上使用 Mac mini 的红外接收器控制 CD 播放](cd-player.md)。 242 | 243 | ## Cockpit 244 | 245 | [Cockpit](https://cockpit-project.org) 是一个 RedHat 做的轻量服务器管理面板。基本上照着官网的装就可以了。我多装了两个插件。 246 | 247 | ```bash 248 | sudo apt install cockpit-pcp cockpit-machines 249 | ``` 250 | 251 | ## Aria2 252 | 253 | 这里的配置大同小异,需要的话可以直接参照文件夹: [aria2](https://github.com/megabitsenmzq/Tutorials/tree/master/Debian/aria2)。 254 | 255 | ## Caddy 256 | 257 | 接下来安装了 [Caddy](https://caddyserver.com) 用来改善 WebUI 的体验,顺便跑 [AriaNG](https://github.com/mayswind/AriaNg)。 258 | 259 | 我这里踩了一个坑,就是 Caddy 的静态服务器似乎无论如何都读不到用户目录的文件。即便我确认了文件的访问权限是没有问题的。最后我在 `/etc/caddy` 中创建了一个 `www` 文件夹,把东西放在里面。 260 | 261 | 我的 Caddyfile 大致内容如下: 262 | 263 | ```bash 264 | :8003 { 265 | root * /etc/caddy/www 266 | log 267 | encode gzip 268 | file_server browse 269 | } 270 | 271 | :80 { 272 | redir https://{host}{uri} permanent 273 | } 274 | ``` 275 | 276 | ## 总结 277 | 278 | 整个过程我折腾了一周左右,正好赶上元旦放假。虽然花了很多时间,但过程中也学到了很多东西,我对 Linux 系统的认识又进了一步。很多以前靠我自己可能解决不了的东西这次也能在不 Google 的前提下依靠自己的经验解决了。总的来说还是很顺利的,没碰到特别大的坑。 279 | 280 | 另外我还有一台安装了 Debian 的 MBP,有一些需要调整的地方也做了[笔记](desktop.md)。 281 | -------------------------------------------------------------------------------- /Debian/libimobiledevice.md: -------------------------------------------------------------------------------- 1 | # Debian 使用 libimobiledevice 实现苹果设备无线备份 2 | 3 | 我个人对 iCloud 是零信任的,因为以前出过很大问题。所以我自然也不会信任 iCloud 的设备备份。在 macOS 或 Windows 上我们可以使用 iMazing 来做备份,虽然这东西要钱而且越来越贵了。而在 Linux 上,我们可以使用 libimobiledevice 来备份。这篇文章主要聚焦于无线备份,如不需要无线备份则可直接从 apt 安装 libimobiledevice 并参照下面的备份命令即可。 4 | 5 | 但是 libimobiledevice 并不完美,在 Windows 和 macOS 上,它可以正常通过无线方式连接到设备,但在 Linux 上则不工作。其原因在于使用的 usbmuxd 不支持这一功能。于是有人从头重写开发了 usbmuxd2,可以直接替换 usbmuxd 使用。 6 | 7 | ## 编译基本组件 8 | 9 | 因为 Debian 的包比较老,我们需要从头编译很多东西。总之先来装依赖吧。 10 | 11 | ```bash 12 | sudo apt install git build-essential autoconf automake libtool-bin pkg-config clang libssl-dev libcurl4-openssl-dev avahi-utils 13 | ``` 14 | 15 | 然后把这五个包的源代码下载下来。 16 | 17 | ```bash 18 | git clone https://github.com/libimobiledevice/libplist.git 19 | git clone https://github.com/libimobiledevice/libimobiledevice-glue.git 20 | git clone https://github.com/tihmstar/libgeneral.git 21 | git clone https://github.com/libimobiledevice/libtatsu 22 | git clone https://github.com/libimobiledevice/libimobiledevice.git 23 | ``` 24 | 25 | 其中 libplist 用于读取苹果的 plist 格式。libimobiledevice-glue 和 libgeneral 都是 libimobiledevice 中的工具依赖的公共代码。 26 | 27 | 之后依次进入文件夹编译 28 | 29 | ```bash 30 | ./autogen.sh 31 | make 32 | sudo make install 33 | sudo ldconfig 34 | ``` 35 | 36 | ## 配置 Avahi 37 | 38 | Avahi 是用来做局域网发现的,用它可以找到网络中的 bonjour 设备。按如下所示修改配置文件 `/etc/avahi/avahi-daemon.conf`。 39 | 40 | ```bash 41 | domain-name=local # 这一行去掉注释 42 | publish-hinfo=yes # 默认是 no 43 | publish-workstation=yes # 默认是 no 44 | ``` 45 | 46 | 再启动服务。 47 | 48 | ```bash 49 | sudo systemctl enable --now avahi-daemon.service 50 | ``` 51 | 52 | 另外虽然说咱们都已经在用 ssh 登陆了,这方面应该没问题,不过还是注意下需要装 ssh 服务器。 53 | 54 | ```bash 55 | sudo apt-get install openssh-server 56 | sudo systemctl enable --now ssh.service 57 | ``` 58 | 59 | 下面的命令可以显示当前网络中扫描到的设备: 60 | 61 | ```bash 62 | avahi-browse -a 63 | ``` 64 | 65 | 然后这里还可能要删除一个不太需要的后台服务,它会一直在系统日志里报错,很烦。 66 | 67 | ```bash 68 | sudo apt remove --purge avahi-autoipd 69 | ``` 70 | 71 | ## 编译 usbmuxd2 72 | 73 | 这个作者写的代码只能用 clang 编,所以需要多一步。编译前需要打开文件 `usbmuxd2/Muxer.cpp` 加入 `#include `,这是目前版本的一个 bug,之后可能会修复。 74 | 75 | ```bash 76 | https://github.com/tihmstar/usbmuxd2.git 77 | ./autogen.sh 78 | ./configure CC=clang CXX=clang++ 79 | make 80 | sudo make install 81 | sudo ldconfig 82 | ``` 83 | 84 | 重启一下。之后启动服务。 85 | 86 | ```bash 87 | sudo systemctl enable usbmuxd 88 | sudo systemctl start usbmuxd 89 | ``` 90 | 91 | ## 尝试连接 92 | 93 | 先将 iOS 设备用 USB 线接到电脑上,在设备上输入密码信赖电脑。然后执行 `idevice_id` 查看设备列表,可能会看到这样的结果: 94 | 95 | ```bash 96 | 00008030-000572092A30802E (USB) 97 | 00008030-000572092A30802E (Network) 98 | ``` 99 | 100 | 如果其中包含 Network 则表示成功。你还可以使用 `ideviceinfo` 命令查看设备信息,应该会输出一大堆东西。 101 | 102 | ## 尝试备份 103 | 104 | 备份的命令非常简单,如果只配对这一个设备,也可以不具体指定。我的命令中还指定了搜索网络设备。执行后就会立即开始备份。 105 | 106 | ```bash 107 | idevicebackup2 backup --full --network --udid 00008030-000572092A30802E backup_folder 108 | ``` 109 | 110 | idevicebackup2 还有很多的的选项,具体可以参见官方文档。 111 | 112 | ## 小技巧 113 | 114 | 在备份文件夹中使用 `plistutil -p Status.plist` 来打印这个状态文件,来获得诸如备份时间之类的信息。 115 | 116 | 定时备份可以创建 systemd timer 来实现,但要注意局域网备份只有在手机解锁的状态下才有效。锁屏的时候是找不到设备的。 117 | 118 | ## 参考资料 119 | 120 | [Untether iOS – Step by Step - Numerous Networks](https://www.numerousnetworks.co.uk/guides/untether-ios-step-by-step/) 121 | 122 | [Raspberry PiでAltServerを動かす - さおとめらいふ](https://jun3010.me/raspberrypi-altserver.html) 123 | 124 | [Automatically backup the iPhone to the Raspberry-Pi - VALINET](https://valinet.ro/2021/01/20/Automatically-backup-the-iPhone-to-the-Raspberry-Pi.html) 125 | -------------------------------------------------------------------------------- /Debian/osx-kvm.md: -------------------------------------------------------------------------------- 1 | # Debian 安装 macOS Sonoma KVM 虚拟机 2 | 3 | 我配置这个虚拟机主要是用于持续集成,对图形性能之类的毫无要求。KVM 已经非常的好用了。整个过程基本上看 OSX-KVM 的 Readme 就能弄出来,但是他写的东一块西一块的。本文希望可以防止大家踩坑。同时,本教程针对的是在图形界面的 virt-manager 中进行管理的安装方式,和 OSX-KVM 默认的从命令行直接启动方式不同,这一点请大家注意。 4 | 5 | ## 安装 KVM 6 | 7 | 首先安装 KVM 相关组件。 8 | 9 | ```bash 10 | sudo apt install virt-manager qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils libguestfs-tools genisoimage virtinst libosinfo-bin 11 | ``` 12 | 13 | 加用户组。 14 | 15 | ```bash 16 | sudo adduser $(whoami) libvirt 17 | sudo adduser $(whoami) libvirt-qemu 18 | ``` 19 | 20 | 启动 KVM 的网络服务 21 | ```bash 22 | sudo virsh net-start default 23 | sudo virsh net-autostart default 24 | ``` 25 | 26 | ## 准备安装镜像 27 | 28 | 将 OSX-KVM 下载下来。 29 | 30 | ```bash 31 | git clone https://github.com/kholia/OSX-KVM.git 32 | cd OSX-KVM 33 | ``` 34 | 35 | 将其提供的 OpenCore 启动镜像(用于引导)复制到 libvirt 的目录里。虽然也可以把镜像换成自己下载的最新版,但是因为它提供的这个版本会默认以详细模式启动,有助于检查问题,所以暂时用他的。 36 | 37 | ```bash 38 | sudo cp OpenCore/OpenCore.qcow2 /var/lib/libvirt/images/ 39 | ``` 40 | 41 | 然后我们还要将启动 macOS 需要的固件也拷贝过去。 42 | 43 | ```bash 44 | sudo cp OVMF_CODE.fd /var/lib/libvirt/images/ 45 | sudo cp OVMF_VARS.fd /var/lib/libvirt/images/ 46 | ``` 47 | 48 | 接下来我们要准备安装镜像。这里要分成你是在已有的 macOS 上准备还是在 Linux 上准备。安装方法也会略有不同,在后面我会具体说明。这里推荐在 macOS 上准备,比较省心。 49 | 50 | ### 在 macOS 上准备 51 | 52 | 这里推荐大家使用 [Mist](https://github.com/ninxsoft/Mist) 工具下载安装镜像,下载时请选择 .app 格式保存。 53 | 54 | 接下来我们使用 macOS 提供的工具来创建空 DMG 文件并挂载。 55 | 56 | ```bash 57 | hdiutil create -o "Sonoma-full.dmg" -size 15g -layout GPTSPUD -fs HFS+J 58 | hdiutil attach -noverify -mountpoint /Volumes/install_build "Sonoma-full.dmg" 59 | 60 | ``` 61 | 62 | 使用 macOS 安装程序提供的工具来制作启动盘。 63 | 64 | ```bash 65 | sudo "Install macOS Sonoma.app/Contents/Resources/createinstallmedia" --volume /Volumes/install_build 66 | ``` 67 | 68 | 弹出做好的安装盘。 69 | 70 | ```bash 71 | hdiutil detach "/Volumes/Install macOS Sonoma" 72 | ``` 73 | 74 | 把 DMG 格式转换成 KVM 可以使用的格式。有这一个文件就好。 75 | 76 | ```bash 77 | hdiutil convert Sonoma-full.dmg -format UDRW -o Sonoma-full.img 78 | ``` 79 | 80 | ### 在 Linux 上准备 81 | 82 | 首先要加装 genisoimage 和 dmg2img。 83 | 84 | ```bash 85 | sudo apt-get install genisoimage dmg2img 86 | ``` 87 | 88 | 从 [Mr. Macintosh](https://mrmacintosh.com/macos-ventura-13-full-installer-database-download-directly-from-apple/) 下载安装包放在 OSX-KVM 的目录下。 89 | 90 | 执行下面的命令来把安装镜像转换成 ISO 格式,同时把 OSX-KVM 提供的安装脚本也放进去。 91 | 92 | ```bash 93 | mkisofs -allow-limited-size -l -J -r -iso-level 3 -V InstallAssistant -o InstallAssistant.iso InstallAssistant.pkg scripts/run_offline.sh 94 | ``` 95 | 96 | 然后还要下载用来开机的 Recovery 启动盘。使用 OSX-KVM 提供的脚本即可。脚本会下载一个 `BaseSystem.dmg`,我们需要将其转换为 img 以供虚拟机使用。 97 | 98 | ``` 99 | ./fetch-macOS-v2.py 100 | dmg2img -i BaseSystem.dmg BaseSystem.img 101 | ``` 102 | 103 | 记得把产生的 `InstallAssistant.iso` 和 `BaseSystem.img` 两个文件都移动到 `/var/lib/libvirt/images/` 中。 104 | 105 | ## 配置虚拟机 106 | 107 | 首先安装模版。之后就可以在 virt-manager 中看到名为 macOS 的虚拟机了。 108 | 109 | ```bash 110 | virsh --connect qemu:///system define macOS-libvirt-Catalina.xml 111 | ``` 112 | 113 | 接下来打开 virt-manager 的设置允许 XML 编辑。双击打开 macOS 虚拟机,先不要开机,直接进到 XML 标签页来修改。 114 | 115 | 为了能让 Sonoma 正常开机,我们需要将文件中的两处 Penryn 修改为 Haswell-noTSX。老架构 Sonoma 不支持了。 116 | 117 | 在文件开头指定固件的部分,需要修改地址指向 `/var/lib/libvirt/images/`。 118 | 119 | ```xml 120 | /var/lib/libvirt/images/OVMF_CODE.fd 121 | /var/lib/libvirt/images/OVMF_VARS.fd 122 | ``` 123 | 124 | 删除含有 mac_hdd_ng 镜像的磁盘。也就是这一段: 125 | 126 | ```xml 127 | 128 | 129 | 130 | 131 | 132 |
133 | 134 | ``` 135 | 136 | 对于含有 OpenCore 镜像的硬盘,要将文件位置改成指向 `/var/lib/libvirt/images/OpenCore.qcow2`。 137 | 138 | ```xml 139 | 140 | 141 | ``` 142 | 143 | 接下来就要分情况了。 144 | 145 | ### 在 macOS 上准备的安装盘 146 | 147 | 对于含有 `BaseSystem.img` 的硬盘,将其改为指向 `/var/lib/libvirt/images/Sonoma-full.img`。 148 | 149 | ```xml 150 | 151 | 152 | ``` 153 | 154 | ### 在 Linux 上准备的安装盘 155 | 156 | 对于含有 `BaseSystem.img` 的镜像,将其改为指向 `/var/lib/libvirt/images/BaseSystem.img`。 157 | 158 | ```xml 159 | 160 | 161 | ``` 162 | 163 | 接下来点保存,如果语法正确的话,理论上不应该报错。 164 | 165 | 在左侧列表中创建一个磁盘,类型保持硬盘,选择 `InstallAssistant.iso`。在 xml 画面中确认磁盘的 type 属性是 raw,将 cache 属性改为 writeback。 166 | 167 | 最后两个系统都一样,在左侧列表中创建一个磁盘,用于当作虚拟机的系统盘。 168 | 169 | ## 安装虚拟机 170 | 171 | 开机,准备装系统。 172 | 173 | ### 在 macOS 上准备的安装盘 174 | 175 | 直接按正常流程安装即可。 176 | 177 | ### 在 Linux 上准备的安装盘 178 | 179 | 先分区。分区完成后打开终端(终端可以在顶上菜单里面打开)。在终端中运行打包进去的脚本。这个脚本会把安装程序拷贝到正确的位置然后执行。 180 | 181 | ```bash 182 | sh /Volumes/InstallAssistant/run_offline.sh 183 | ``` 184 | 185 | 之后正常完成安装即可。 186 | 187 | 安装完成后,可以关闭虚拟机,将用于安装的磁盘全部删除,注意别把 OpenCore 给删了。 188 | 189 | ## 顺带提一下 Windows 190 | 191 | 在 KVM 中安装 Windows 相比来讲简单多了,这里主要是讲两点。 192 | 193 | 首先驱动这里可以下载 [virtio-win](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/)。 194 | 195 | 然后为了能让共享文件夹正常工作,我们还要下载 [WinFSP](https://github.com/winfsp/winfsp/releases/)。安装之后将系统中的 VirtIO-FS Service 这个服务启用,然后改成自动。 196 | 197 | ## 从 macOS 远程管理虚拟机 198 | 199 | 要从另一台 macOS 上远程管理 KVM 虚拟机,可以用 brew 安装 virt-manager。 200 | 201 | 首先在 Linux 上打开远程管理,编辑 `/etc/libvirt/libvirtd.conf` 文件,写上这两行: 202 | 203 | ```bash 204 | unix_sock_group = "libvirt" 205 | unix_sock_rw_perms = "0770" 206 | ``` 207 | 208 | 在 macOS 上安装。 209 | 210 | ```bash 211 | brew tap jeffreywildman/homebrew-virt-manager 212 | brew install virt-manager virt-viewer 213 | ``` 214 | 215 | 之后就可以通过下面的命令来管理虚拟机了。注意 no-fork 参数不加会崩溃。 216 | 217 | ```bash 218 | virt-manager --connect="qemu+ssh://USER@HOSTNAME/system?socket=/var/run/libvirt/libvirt-sock" --no-fork 219 | ``` 220 | 221 | 但是如果你只做了上面这些事,你会发现一个问题就是远程桌面打不开。这是因为远程桌面默认不接受外部访问。所以我们需要编辑虚拟机,在左侧列表中选择 Display Spice,然后在右侧将 Address 改为 All Interfaces。这样应该就可以打开了。 222 | 223 | 但是还有另外一个问题,Spice 从局域网走的话很慢,不如 VNC。所以我们可以进入 XML 编辑界面,将所有与 Spice 相关的东西全部删除,注意只要有一样 Spice 的东西还留着,就没办法保存修改,就会报错。全删除之后在左侧列表里重新添加 VNC 类型的 Display 就可以了。别忘了改 All Interface。 224 | 225 | 以后再执行的时候就可以省略连接命令,直接在 GUI 里连接就好。 226 | 227 | ```bash 228 | virt-manager --no-fork 229 | ``` 230 | 231 | ## 结论 232 | 233 | 最后的结论就是。如果不是有什么大病,咱还是用 VMware 吧,折腾死了,有这时间干点啥不好。用 [VMware Unlocker](https://github.com/theJaxon/unlocker) 可以解锁安装 macOS 的功能。 234 | 235 | ## 参考资料 236 | 237 | [OSX-KVM - GitHub](https://github.com/kholia/OSX-KVM/blob/master/notes.md) 238 | 239 | [How to install KVM server on Debian 9/10 Headless Server - Nix Craft](https://www.cyberciti.biz/faq/install-kvm-server-debian-linux-9-headless-server/) 240 | 241 | [Share Folder Between Windows Guest and Linux Host in KVM using virtiofs - Debug Point](https://www.debugpoint.com/kvm-share-folder-windows-guest/) 242 | 243 | [Remote virt-manager from Mac OS - Gist](https://gist.github.com/davesilva/da709c6f6862d5e43ae9a86278f79188) 244 | -------------------------------------------------------------------------------- /Debian/schedule/daily_archive.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Daily Archive 3 | [Service] 4 | ExecStart=/home/megabits/scripts/daily_archive.sh 5 | -------------------------------------------------------------------------------- /Debian/schedule/daily_archive.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | date_string=$(date +'%Y-%m-%d_%H-%M-%S') 4 | 5 | tar --absolute-names --exclude .sync --exclude ZiLi -zcf /mnt/Documents/Backups/Archive/Developer_$date_string.tar.gz /mnt/Documents/Files/Developer 6 | chmod g+rw /mnt/Documents/Backups/Archive/Developer_$date_string.tar.gz 7 | chown megabits:megabits /mnt/Documents/Backups/Archive/Developer_$date_string.tar.gz 8 | backup_files_dev=($(ls -tr "/mnt/Documents/Backups/Archive/Developer_"*.tar.gz)) 9 | 10 | if [[ ${#backup_files_dev[@]} -gt 7 ]]; then 11 | num_files_to_delete=$(( ${#backup_files_dev[@]} - 7 )) 12 | files_to_delete=("${backup_files_dev[@]:0:$num_files_to_delete}") 13 | rm "${files_to_delete[@]}" 14 | fi 15 | 16 | tar --absolute-names --exclude .sync -zcf /mnt/Documents/Backups/Archive/Creator_$date_string.tar.gz /mnt/Documents/Files/Creator 17 | chmod g+rw /mnt/Documents/Backups/Archive/Creator_$date_string.tar.gz 18 | chown megabits:megabits /mnt/Documents/Backups/Archive/Creator_$date_string.tar.gz 19 | backup_files_cre=($(ls -tr "/mnt/Documents/Backups/Archive/Creator_"*.tar.gz)) 20 | 21 | if [[ ${#backup_files_cre[@]} -gt 7 ]]; then 22 | num_files_to_delete=$(( ${#backup_files_cre[@]} - 7 )) 23 | files_to_delete=("${backup_files_cre[@]:0:$num_files_to_delete}") 24 | rm "${files_to_delete[@]}" 25 | fi 26 | -------------------------------------------------------------------------------- /Debian/schedule/daily_archive.timer: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Run every day 3 | 4 | [Timer] 5 | OnCalendar=*-*-* 05:00:00 6 | 7 | [Install] 8 | WantedBy=timers.target 9 | -------------------------------------------------------------------------------- /Debian/schedule/daily_iPhoneBackup.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description = "Daily iPhone Backup" 3 | 4 | [Service] 5 | ExecStart = /home/megabits/scripts/daily_iPhoneBackup.sh 6 | -------------------------------------------------------------------------------- /Debian/schedule/daily_iPhoneBackup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | idevicebackup2 backup --full --network --udid /mnt/Documents/Backups/iDevices/ 4 | -------------------------------------------------------------------------------- /Debian/schedule/daily_iPhoneBackup.timer: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Run every day 3 | 4 | [Timer] 5 | OnCalendar=*-*-* 23:00:00 6 | 7 | [Install] 8 | WantedBy=timers.target 9 | -------------------------------------------------------------------------------- /Debian/schedule/monthly_clearArchive.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description = "Monthly Clear Archive" 3 | 4 | [Service] 5 | ExecStart = /home/megabits/scripts/monthly_clearArchive.sh 6 | -------------------------------------------------------------------------------- /Debian/schedule/monthly_clearArchive.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | target_directory="/mnt/Documents/Files" 4 | 5 | find "$target_directory" -type d -name ".sync" -exec rm -rf {}/Archive \; 6 | -------------------------------------------------------------------------------- /Debian/schedule/monthly_clearArchive.timer: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Run every month 3 | 4 | [Timer] 5 | OnCalendar=*-*-1 05:00:00 6 | 7 | [Install] 8 | WantedBy=timers.target 9 | -------------------------------------------------------------------------------- /Debian/vmware.md: -------------------------------------------------------------------------------- 1 | # VMware 安装指南 2 | 3 | ## 下载 4 | 5 | VMware 被博通收购之后下载变得极其难找。还好我们可以直接从 VMware 的更新服务器下:[VMware Downloads](https://softwareupdate.vmware.com/cds/vmw-desktop/)。 6 | 7 | ## 安装 8 | 9 | 首先安装软件本体,不管是 Workstation 还是 Player,流程都是一样的。 10 | 11 | 给安装文件执行权限,然后运行安装就可以了。 12 | 13 | ```sh 14 | chmod +x VMware-Workstation-17.5.2-23775571.x86_64.bundle 15 | sudo ./VMware-Workstation-17.5.2-23775571.x86_64.bundle 16 | ``` 17 | 18 | 安装过程中会报错无法安装内核驱动,属于正常现象。这是因为 VMware 的官方内核驱动没支持最近几个 Linux 内核版本,大概是被弃坑了。这里我们需要安装一个第三方 Fork 的内核驱动。 19 | 20 | ### 安装内核驱动 21 | 22 | 使用此[教程](https://github.com/nan0desu/vmware-host-modules/wiki)中提供的方法进行安装,仓库地址在[GitHub](https://github.com/nan0desu/vmware-host-modules/)。可以看到仓库中给每一个 VMware 版本都做了一个分支。 23 | 24 | 针对最新版本 17,不管是 Workstation 还是 Player,安装步骤都是一样的。根据你的内核版本选择合适的分支。我这里使用的是 Debian Testing,目前是 6.10。 25 | 26 | ```sh 27 | git clone -b workstation-17.5.2-k6.9+ https://github.com/nan0desu/vmware-host-modules.git 28 | cd vmware-host-modules 29 | apt-get install linux-headers-$(uname -r) 30 | make 31 | sudo make install 32 | ``` 33 | 34 | 将编译好的驱动注册给 VMware。 35 | 36 | ```sh 37 | make tarballs && sudo cp -v vmmon.tar vmnet.tar /usr/lib/vmware/modules/source/ && sudo vmware-modconfig --console --install-all 38 | ``` 39 | 40 | 最后使用 dkms 激活内核驱动。注意我下面的命令给分支加了 `origin` 标记,如果你没把分支 checkout 到本地的话,不这样写会报错。 41 | 42 | ```sh 43 | sudo apt install dkms 44 | git rev-list origin/master..origin/dkms | git cherry-pick --no-commit --stdin 45 | sudo dkms add . 46 | ``` 47 | 48 | 之后 VMware 应该就可以打开了。 49 | 50 | 这里有一点要注意,在 VMware Tools 安装之前,打开图形加速会导致虚拟机没有画面。所以需要先关闭图形加速,安装完系统和 VMware Tools 之后再次打开。这个问题目前无解,只能等修。 51 | 52 | 不知道 VMware Workstation 以后还会不会给 Linux 好好提供后续支持,希望别等什么时候就彻底弃坑了。 53 | 54 | ## 屏幕缩放 55 | 56 | Mac 用户大概知道 VMware Fusion 是有一个使用 Retina 原生分辨率还是缩放分辨率的选项的,这一选项在 Linux 中并不存在。但是我们可以通过一些设置达到类似的效果,否则一些老系统在 4K 的屏幕上真的完全没法看。 57 | 58 | 打开 `preferences.ini` 文件,其在 Linux 上存在于 `~/.vmware` 目录中,如果安装的是 Player,可在文件中添加如下内容: 59 | 60 | ``` 61 | pref.autoFit = "TRUE" 62 | pref.autoFitGuestToWindow = "FALSE" 63 | pref.autoFitFullScreen = "stretchGuestToHost" 64 | ``` 65 | 66 | 如果安装的是 WorkStation,则可直接在偏好设置中修改。将“主机分辨率跟随虚拟机”关闭,“虚拟机分辨率跟随主机”打开(或者关闭也行),将全屏分辨率选项设置为拉伸。之后只要把虚拟机的分辨率设置成 1080p 即可。但要注意放大效果只会在全屏状态生效。 67 | 68 | 鉴于目前 WorkStation 对个人也免费了,说实话我觉得没什么只用 Player 的必要。 69 | -------------------------------------------------------------------------------- /MidiPi/index.md: -------------------------------------------------------------------------------- 1 | # 用树莓派(等)为 USB Midi 键盘增添连接方式 2 | 3 | 我在去年买了一个 M-Audio 的 Midi 键盘,用来连接电脑或者 iPad 弹琴。但是由于琴摆放的位置没有办法拉充电线,所以我能弹琴多久很大程度上取决于设备还有多少电。前一阵子从朋友手里白嫖了个橘子派,鉴于在练琴的时候其实并不需要多高的音质,我决定用这个设备给自己做一个钢琴的音源。 4 | 5 | 我首先会介绍如何配置 USB Midi 设备发出声音,再介绍如何通过 Midi over BLE 广播 Midi 信号,最后介绍如何通过 Midi over Wifi 来广播 Midi 信号。 6 | 7 | ## 系统配置 8 | 9 | 由于我使用的是橘子派而不是树莓派,我遇到了一些只有这边才会遇到的问题,其他开发板可以选择性掠过本节。 10 | 11 | 橘子派能安装的最新版本 Armbian 内核关闭了 Midi 功能。在各种论坛研究一圈之后,发现旧版本的 Armbian 内核是开了的,于是我下载了使用旧版内核的系统。 12 | 13 | (注意使用旧版本系统仅限于本教程前半部分 USB Midi 设备,假如你需要配置蓝牙 Midi,则必须自己编译新内核。可自己 Google 如何编译 Armbian,在编译选项中开启:Device Drivers > Sound card support > Advanced Linux Sound Architecture > Sequencer Support )。参考 [How to Compile Armbian: Step-by-Step Tutorial for Beginners](https://www.youtube.com/watch?v=Fg966ivZlrc) 和 [Armbian - using kernel-config](https://zuckerbude.org/armbian-using-kernel-config/)。 14 | 15 | 进去之后正常更新系统,旧版镜像要久一点。橘子派还需要在系统中启用声音,使用自带的配置工具 `sudo armbian-config`,启用 System > Kernel > SY210 - Manage device tree overlays > analog-codec 。 16 | 17 | 橘子派可能会等待网络服务激活后才进入系统,导致开机时间非常长,使用下面的命令关闭它: 18 | 19 | ```sh 20 | sudo systemctl disable NetworkManager-wait-online 21 | ``` 22 | 23 | 你还可以使用 `systemd-analyze blame` 命令查看服务的启动时间,关闭一些其他你不需要的服务。 24 | 25 | ## 安装 [FluidSynth](http://www.fluidsynth.org) 26 | 27 | Debian 源中自带的 FluidSynth 版本比较低,是 1.x 的。由于旧版本的 FluidSynth 并不能自动连接 Midi 设备,我们需要手动编译新版。 28 | 29 | 为了安装依赖,我们先要调整 apt 源,在文件中取消几个 deb-src 源前面的注释。 30 | 31 | 32 | ```sh 33 | sudo nano /etc/apt/sources.list 34 | sudo apt-get update 35 | ``` 36 | 37 | 安装所有需要的依赖包然后编译。 38 | 39 | ```sh 40 | sudo apt-get build-dep fluidsynth --no-install-recommends 41 | git clone https://github.com/FluidSynth/fluidsynth 42 | cd fluidsynth/ 43 | mkdir build 44 | cd build 45 | cmake .. 46 | sudo make install 47 | ``` 48 | 49 | 接下来在命令行中执行 fluidsynth 确认是否正常。如果出现了找不到库的情况的话,首先应该尝试更新链接库。 50 | 51 | ```sh 52 | sudo ldconfig 53 | ``` 54 | 55 | 如果这样不行的话,可以添加环境变量。(下面的代码是临时的,永久修改可以自己 Google 一下。) 56 | 57 | ```sh 58 | export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH 59 | ``` 60 | 61 | 确认可以正常运行之后就可以进入下一步骤了。 62 | 63 | (本节参阅 [Github](https://github.com/FluidSynth/fluidsynth/wiki/BuildingWithCMake)) 64 | 65 | 66 | ## 获取 Sound Font 67 | 68 | 如果你尝试过直接用 apt 安装 FluidSynth 的话,你应该会看到它推荐的几个包:fluidr3mono-gm-soundfont、timgm6mb-soundfont、fluid-soundfont-gm。这些都是 Sound Font。但是他们可能不够好听,并不能达到你的要求,这时候你就可以去一些第三方网站下载,比如 [SoundFont4U](https://sites.google.com/site/soundfonts4u/)。 69 | 70 | FluidSynth 支持 SF2/SF3 格式的音源文件,不支持 SFZ,请注意不要搞错。将下载的音源复制为 `/usr/local/share/soundfonts/default.sf2` 即可使用。 71 | 72 | ## 测试声音 73 | 74 | 先运行一次测试是否能够正常出声,这里我使用了 GM 音源。建议先用 `alsamixer` 把声音调大一点。 75 | 76 | ```sh 77 | fluidsynth -is -a alsa -m alsa_seq -o midi.autoconnect=1 78 | ``` 79 | 80 | 解释一下参数: 81 | 82 | - a,m 输入输出使用的音频驱动。 83 | - is 作为服务静默运行。 84 | - g 力度阈值,这里设置的大一点,以防一些设备音量太小。 85 | - o 细节参数,这里设置了自动连接 Midi 设备 midi.autoconnect。 86 | 87 | (本节参阅 [Github](https://github.com/FluidSynth/fluidsynth/wiki/UserManual)) 88 | 89 | 运行之后弹一下连接的键盘,看看有没有声音,比较慢的设备可能需要等一段时间才会显示已连接。按照目前的设置,音量应该会蛮大的,如果声音特别小,可以打开 `alsamixer` 调整一下音量,并使用 `sudo alsactl store` 保存状态。确认可以正常演奏之后,就可以进行下一步了。 90 | 91 | ## FluidSynth 启动服务 92 | 93 | 为了能够让 FluidSynth 开机启动我们需要自己写一个服务:`sudo nano /etc/systemd/system/fluidsynth.service`。在文件中输入: 94 | 95 | ```sh 96 | [Unit] 97 | Description=FluidSynth Daemon 98 | After=sound.target 99 | 100 | [Service] 101 | ExecStart=/usr/local/bin/fluidsynth -is -a alsa -m alsa_seq -z 64 -c 2 -g 1 -o synth.cpu-cores=4 -o midi.autoconnect=1 102 | 103 | [Install] 104 | WantedBy=multi-user.target 105 | ``` 106 | 107 | 解释一下这里多出来的几个参数: 108 | 109 | - z 缓存大小,可以使用 64 128 256 等“整数”。 110 | - c 缓存个数,一般为 2 或 3。 111 | - o 多了一个设置 CPU 核心数的选项 synth.cpu-cores,你可以根据自己的开发板来设置。可以装一个 htop 数条条看几个核。 112 | 113 | 激活服务: 114 | 115 | ```sh 116 | sudo systemctl enable --now fluidsynth 117 | ``` 118 | 119 | 之后理论上就应该能正常弹琴了。假如听不到声音,可以用 `journalctl -u fluidsynth` 来查看服务的日志,看看是出了什么问题。如果你只需要用 USB 来连接一下 Midi 设备的话,下面就可以不用看了。 120 | 121 | 参考文章: 122 | 123 | - [Raspberry Pi Zero をMIDI音源ボックス化](http://artteknika.hatenablog.com/entry/2017/04/28/185509) 124 | - [Orange Pi USB MIDI Host](http://hunke.ws/posts/orange-pi-usb-midi-host/) 125 | 126 | ## Midi over Bluetooth Low Energy 127 | 128 | 除了直接用这个做音源,我还有希望能够通过 BLE 转发 USB 设备的 Midi 信号到其他设备上方便连接。首先要下载 BlueZ,由于 BlueZ 默认是没有开启 Midi 功能的,所以需要自己编译。此外这里使用的 BlueZ 是一个经过修改的版本,提供了 Midi Server 的功能。不过这个程序有一个蛮烦人的问题,那就是无法同时发送音符,也就是说弹和弦时候,声音永远都对不齐。所以这个就推荐各位自己考虑一下要不要装吧。 129 | 130 | ```sh 131 | git clone https://github.com/megabitsenmzq/bluez/ 132 | sudo apt install -y build-essential 133 | sudo apt install -y autotools-dev libtool autoconf automake 134 | sudo apt install -y libasound2-dev 135 | sudo apt install -y libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev 136 | cd bluez 137 | ./bootstrap 138 | ./configure --enable-midi --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc --localstatedir=/var 139 | sudo make install 140 | ``` 141 | 142 | 之后测试一下开启服务端并用其他支持 Bluetooth Midi 的软件来搜索,如 iOS 下的 Garageband。 143 | 144 | ```sh 145 | sudo btmidi-server -v -n "Midi over BLE" 146 | ``` 147 | 148 | 如果出现了 `MGMT_OP_SET_LE failed: Not Supported`,就说明设备不支持 BLE。在确认一切正常后打开另外一个终端窗口,连接好 Midi 设备并扫描。注意在这之前要先用别的设备连接上 Bluetooth Midi,BlueZ 只有在有设备连接时才会创建 Midi 通道。 149 | 150 | ```sh 151 | aconnect -l 152 | ``` 153 | 154 | 在列表中找到你自己的蓝牙设备和创建的 "Midi over BLE"。比如我的输出结果是: 155 | 156 | ```sh 157 | client 0: 'System' [type=kernel] 158 | 0 'Timer ' 159 | 1 'Announce ' 160 | client 14: 'Midi Through' [type=kernel] 161 | 0 'Midi Through Port-0' 162 | client 20: 'Keystation 88' [type=kernel,card=0] 163 | 0 'Keystation 88 MIDI 1' 164 | 1 'Keystation 88 MIDI 2' 165 | client 128: 'Midi over BLE' [type=user,pid=2104] 166 | 0 'Midi over BLE ' 167 | ``` 168 | 169 | 这里可以看到我的键盘 "Keystation 88" 编号是 20,"Midi over BLE" 默认编号是 128。 170 | 171 | ```sh 172 | aconnect 20:0 128:0 173 | ``` 174 | 175 | 这样就可以把两个通道连接起来了。去键盘上按几个键,看看连接的设备会不会发出声音。一切正常就可以进行下一步了。 176 | 177 | ## Midi over BLE 启动服务 178 | 179 | 新建一个服务:`sudo nano /lib/systemd/system/btmidi.service`,在文件中输入: 180 | 181 | ```sh 182 | [Unit] 183 | Description=MIDI Bluetooth connect 184 | After=bluetooth.target sound.target multi-user.target 185 | Requires=bluetooth.target sound.target 186 | 187 | [Service] 188 | Type=simple 189 | User=root 190 | Group=root 191 | WorkingDirectory=/root 192 | StandardOutput=syslog 193 | StandardError=syslog 194 | SyslogIdentifier=btmidi 195 | Restart=always 196 | ExecStart=/usr/bin/btmidi-server -n "Midi over BLE" 197 | 198 | [Install] 199 | WantedBy=multi-user.target 200 | ``` 201 | 202 | 激活服务: 203 | 204 | ```sh 205 | sudo systemctl enable btmidi.service 206 | sudo systemctl start btmidi.service 207 | ``` 208 | 209 | 接下来配置自动连接 Midi 通道,这里我们使用 udev 来在蓝牙设备发生变化时自动连接。首先来写一个连接脚本: 210 | 211 | ```sh 212 | touch linkble.sh 213 | chmod a+x linkble.sh 214 | nano linkble.sh 215 | ``` 216 | 217 | 这个脚本会自动连接 card=0 和设备 128。 218 | 219 | ```sh 220 | #!/bin/bash 221 | 222 | CLIENT_ID=$(aconnect -i | grep "Midi over BLE" | cut -d':' -f1 | cut -d' ' -f2) 223 | 224 | CARD_ID=$(aconnect -i | grep "card=" | cut -d':' -f1 | cut -d' ' -f2) 225 | 226 | if [ -z "$CARD_ID" ]; then 227 | echo "Error: No MIDI device found with card=" 228 | exit 1 229 | fi 230 | 231 | aconnect "$CARD_ID:0" "$CLIENT_ID:0" 232 | 233 | if [ $? -eq 0 ]; then 234 | echo "Successfully connected MIDI device (card=$CARD_ID:0) to client $CLIENT_128_ID:0" 235 | else 236 | echo "Error: Failed to connect MIDI device to client $CLIENT_128_ID:0" 237 | exit 1 238 | fi 239 | 240 | aconnect "$CARD_ID:1" "$CLIENT_ID:0" 241 | 242 | if [ $? -eq 0 ]; then 243 | echo "Successfully connected MIDI device (card=$CARD_ID:1) to client $CLIENT_128_ID:0" 244 | else 245 | echo "Warning: Could not connect MIDI device card=$CARD_ID:1, likely only one port" 246 | fi 247 | 248 | exit 0 249 | ``` 250 | 251 | 注意这里要把键盘的名字改成自己的。之所以要用设备名来连接,是因为设备编号是不稳定的。接下来建立规则 `sudo nano /etc/udev/rules.d/44-bt.rules`,在文件中输入: 252 | 253 | ```sh 254 | ACTION=="add|remove", SUBSYSTEM=="bluetooth", RUN+="/home/user-name/linkble.sh" 255 | ``` 256 | 257 | 刷新规则: 258 | 259 | ```sh 260 | sudo udevadm control --reload-rules 261 | ``` 262 | 263 | 这样就可以在其他设备连接到 BLE 的时候自动连接通道了。 264 | 265 | 参考文章: 266 | 267 | - [RASPBERRY PI 3B AS USB/BLUETOOTH MIDI HOST](https://neuma.studio/rpi-as-midi-host.html) 268 | - [BlueZ with MIDI over BLE Support](https://tttapa.github.io/Pages/Ubuntu/Software-Installation/BlueZ.html) 269 | 270 | ## Midi over Wifi 271 | 272 | 首先需要激活虚拟 Midi 设备模块。 273 | 274 | ```sh 275 | modprobe snd-virmidi 276 | aconnect -l 277 | ``` 278 | 279 | 如果输出中出现了几个虚拟 Midi 设备就说明设置成功了。为了能让模块永久启用,我们来建立一个配置文件 `sudo nano /etc/modules-load.d/snd-virmidi.conf`,在文件中输入: 280 | 281 | ```sh 282 | snd-virmidi 283 | ``` 284 | 285 | 保存并重启。 286 | 287 | 接下来安装 raveloxmidi: 288 | 289 | ```sh 290 | sudo apt-get install -y git pkg-config libasound2-dev libavahi-client-dev autoconf automake 291 | sudo apt-get install avahi-daemon 292 | git clone -b experimental https://github.com/ravelox/pimidi.git 293 | cd pimidi/raveloxmidi/ && ./autogen.sh && ./configure && make -j2 294 | sudo make install 295 | ``` 296 | 297 | 假如你的网络不支持 ipv6,就需要配置一下 avahi-daemon,打开文件:`sudo nano /etc/avahi/avahi-daemon.conf`,按照下面的值来设置,注意一些行需要取消注释。 298 | 299 | ```sh 300 | use-ipv6=no 301 | publish-addresses=yes 302 | publish-aaaa-on-ipv4=no 303 | ``` 304 | 305 | 接下来查看可用的设备编号: 306 | 307 | ```sh 308 | amidi -l 309 | ``` 310 | 311 | 打开 `aconnect -l` 来看一下设备在其中的编号,看一下 Midi 键盘的编号和第一个虚拟设备的编号,我的是 28:0 24:0,把它们连接起来。注意这里的顺序,一定是把键盘通道发送给虚拟设备通道。 312 | 313 | ```sh 314 | aconnect 28:0 24:0 315 | ``` 316 | 317 | 我这里第一个虚拟 Midi 设备的编号是 hw:2,0,记住这个值。为 raveloxmidi 建立一个配置文件:`/etc/raveloxmidi.conf`,在文件中输入: 318 | 319 | ```sh 320 | alsa.input_device = hw:2,0 321 | network.bind_address = 0.0.0.0 322 | logging.enabled = yes 323 | logging.log_level = normal 324 | ``` 325 | 326 | 接下来启动测试: 327 | 328 | ```sh 329 | sudo raveloxmidi -dN -c /etc/raveloxmidi.conf 330 | ``` 331 | 332 | 如果程序正常运行了你应该就可以在其他地方连接它。这里以 macOS 上的 Garageband 为例: 333 | 334 | 打开 “音频 Midi 音频设置” 并在菜单中打开显示 “Midi 音频工作室”。之后在 “Midi 音频工作室” 的菜单或者工具栏上打开 “Midi 网络设置”。启用 “会话1”。在目录中选择 raveloxmidi,点连接。 335 | 336 | 打开 Garageband 弹几个音试一试,如果正常出声就是成功了。 337 | 338 | ## Midi over Wifi 启动服务 339 | 340 | 新建一个服务:`sudo nano /etc/systemd/system/raveloxmidi.service`,在文件中输入: 341 | 342 | ```sh 343 | [Unit] 344 | After=local-fs.target network.target 345 | Description=raveloxmidi RTP-MIDI network server 346 | 347 | [Install] 348 | WantedBy=multi-user.target 349 | 350 | [Service] 351 | User=root 352 | ExecStartPre=/usr/bin/aconnect 'Keystation 88':0 24:0 353 | ExecStart=/usr/local/bin/raveloxmidi -dN -c /etc/raveloxmidi.conf 354 | ``` 355 | 356 | 注意 Midi 设备的名称要改成自己的。激活服务: 357 | 358 | ```sh 359 | sudo systemctl enable raveloxmidi.service 360 | sudo systemctl start raveloxmidi.service 361 | ``` 362 | 363 | 服务没有启动成功也没关系,可能是因为我们之前已经手动连接过一次 Midi 设备了,重启试试就好。 364 | 365 | (本节参阅:[Github](https://github.com/ravelox/pimidi/blob/master/FAQ.md)) 366 | 367 | ## 锁定文件系统 368 | 369 | 用 `armbian-config` 就可以使文件系统只读,但需要额外安装 buzybox,要么会报错不好使。 370 | 371 | ```sh 372 | apt install busybox-static 373 | ``` 374 | 375 | 参考文章: 376 | 377 | - [Using a Raspberry Pi as a RTP-MIDI Gateway for macOS](https://blog.tarn-vedra.de/pimidi-box/) 378 | - [Raspberry Pi as USB/Bluetooth MIDI host](https://neuma.studio/raspberry-pi-as-usb-bluetooth-midi-host/) 379 | 380 | ## 后记 381 | 382 | 最后我还是没能把这些都装好,新内核老内核都有各自的问题,无法两全。在我重新编译的内核的系统中,虽然两边的程序都能正常运行了,但是 alsa 却开始定时输出一些噪音,非常的诡异。真心推荐大家不要购买 Orange Pi Zero,这个板子很要人命。假如你用的是其他的板子,那按照我的教程来弄应该就可以正常使用了。 383 | -------------------------------------------------------------------------------- /PeerTube/index.md: -------------------------------------------------------------------------------- 1 | # 搭建易于访问的私人 PeerTube 实例 2 | 3 | 本文旨在描述如何通过虚拟主机与对象存储,配置易于私人使用的 PeerTube 实例。教程并不适用供大规模访问的网站架设。 4 | 5 | 虽然说只要 VPS 访问起来没有问题,不用对象存储也是没有问题的。但从经费的角度上,购买高带宽的对象存储总要比高带宽的 VPS 来的省钱。所以对于本文的目标读者,我还是建议使用对象存储。 6 | 7 | ## 事前准备 8 | 9 | 1. 一台 VPS(本文以 Ubuntu/Debian 为例) 10 | 2. 对象存储服务(本文以 Backblaze B2 为例) 11 | 3. 个人域名或子域名 12 | 4. 习惯使用 Linux 的大脑 13 | 14 | ## 配置对象存储 15 | 16 | 首先你需要配置一个供 PeerTube 保存其影片的对象存储池。PeerTube 支持 Amazon S3,或 Backblaze B2,你用哪个都行。 17 | 18 | ### 访问密钥 19 | 20 | 你需要从你选择的服务商建立一个访问用的 Key,并将: 21 | 22 | 1. App Key ID 23 | 2. App Key 24 | 25 | 记录下来以备稍后使用。 26 | 27 | ### 存储池 28 | 29 | 之后建立一个给 PeerTube 使用的池,并将池设置为**公开(Public)**,记录下: 30 | 31 | 1. 名字 32 | 2. 终结点(Endpoint,即对象存储的主域名) 33 | 3. 地区(只有 Amazon S3 需要) 34 | 35 | ### 配置 CORS 36 | 37 | CORS 其实就是防盗链。你肯定不希望什么网站都外链你的视频出去播放。在上一步已经设置为公开的基础上,点击 **“CORS Rules”** 按钮进行配置。 38 | 39 | 选择:Share everything in this bucket with this one origin. 40 | 41 | 并在其下方写下你将会使用的域名。需包含 https://,端口号可以没有。 42 | 43 | CORS 配置大概需要十分钟左右的时间来生效,正好可以来安装我们的网站。 44 | 45 | ## 安装 PeerTube 46 | 47 | PeerTube 的安装是非常麻烦的,所以有很多人会选择使用 Docker 进行安装,但假如你对 Docker 并不熟悉,后续配置的时候可能会十分头疼。所以这里我们将直接进行安装。本文默认你在非 root 的 sudo user 下进行操作,其他情况请自行调整。 48 | 49 | ### 前置准备 50 | 51 | 安装 Node.js: 52 | 53 | ``` 54 | sudo apt install build-essential gnupg curl wget unzip 55 | 56 | curl -sL https://deb.nodesource.com/setup_lts.x | sudo bash - 57 | 58 | sudo apt install nodejs 59 | sudo npm i -g yarn 60 | ``` 61 | 62 | 安装其他包: 63 | 64 | ``` 65 | sudo apt install git python-dev ffmpeg postgresql postgresql-contrib redis-server 66 | ``` 67 | 68 | 此处我们没有安装 nginx,因为我将会在后文使用 Caddy2 作为 Web 服务器。 69 | 70 | 启动数据库: 71 | 72 | ``` 73 | sudo systemctl enable --now postgresql redis-server 74 | ``` 75 | 76 | 建立 PeerTube 用户并设置其密码: 77 | 78 | ``` 79 | sudo useradd -m -d /var/www/peertube -s /bin/bash peertube 80 | sudo passwd peertube 81 | ``` 82 | 83 | 配置 PostgreSQL 用户和数据库: 84 | 85 | ``` 86 | sudo -u postgres createuser -P peertube 87 | sudo -u postgres createdb -O peertube -E UTF8 -T template0 peertube_prod 88 | 89 | sudo -u postgres psql -c "CREATE EXTENSION pg_trgm;" peertube_prod 90 | sudo -u postgres psql -c "CREATE EXTENSION unaccent;" peertube_prod 91 | ``` 92 | 93 | 此处第一条命令后你会被要求输入数据库的访问密码,后面我们会用到。 94 | 95 | ### 安装 PeerTube 96 | 97 | 首先进入到 peertube 用户下: 98 | 99 | ``` 100 | su - peertube 101 | ``` 102 | 103 | 下载最新版的 PeerTube: 104 | 105 | ``` 106 | mkdir config storage versions && cd versions 107 | wget https://github.com/Chocobozzz/PeerTube/releases/download/v4.0.0/peertube-v4.0.0.zip 108 | unzip peertube-v4.0.0.zip 109 | ln -s /var/www/peertube/versions/peertube-v4.0.0 ../peertube-latest 110 | ``` 111 | 112 | 本文编写时 PeerTube 的最新版本是 4.0,其他版本可以从 [GitHub](https://github.com/Chocobozzz/PeerTube/releases) 获取。 113 | 114 | 安装: 115 | 116 | ``` 117 | cd ../peertube-latest 118 | yarn install --production --pure-lockfile 119 | ``` 120 | 121 | 安装过程中可能会出现一些警告,不用管他。 122 | 123 | ### 调整配置文件 124 | 125 | 首先从模版创建新的配置文件并打开: 126 | 127 | ``` 128 | cp config/default.yaml /var/www/peertube/config/default.yaml 129 | cp config/production.yaml.example /var/www/peertube/config/production.yaml 130 | nano /var/www/peertube/config/production.yaml 131 | ``` 132 | 133 | 此处使用的是 nano 编辑器,使用方法非常简单,99.9% 的时候都只用 Crtl+O 保存,Ctrl+X 退出。 134 | 135 | 需要改动的地方有以下几点: 136 | 137 | ``` 138 | webserver: 139 | https: true 140 | hostname: 'peertube.imlala.best' # 你的域名 141 | port: 443 142 | ``` 143 | 144 | 如果你希望使用 http 进行测试,可以暂时改为 80 端口。 145 | 146 | ``` 147 | database: 148 | hostname: 'localhost' 149 | port: 5432 150 | ssl: false 151 | suffix: '_prod' 152 | username: 'peertube' 153 | password: 'password' # 刚刚设置的数据库密码 154 | pool: 155 | max: 5 156 | ``` 157 | 158 | ``` 159 | object_storage: 160 | enabled: true # 改为启用 161 | endpoint: 's3.us-west-002.backblazeb2.com' # 你的对象存储池终结点 162 | # region: 'us-east-1' # 你的对象存储地区(如果需要的话) 163 | credentials: 164 | access_key_id: 'xxxxxx' # 你的 App Key ID 165 | secret_access_key: 'xxxxxx' # 你的 App Key 166 | max_upload_part: 2GB 167 | streaming_playlists: 168 | bucket_name: 'PeerTube' # 你的对象存储池名字 169 | prefix: 'streaming-playlists:' # 串流子文件夹名,注意结尾的冒号 170 | videos: 171 | bucket_name: 'PeerTube' # 你的对象存储池名字 172 | prefix: 'videos:' # 影片子文件夹名,注意结尾的冒号 173 | ``` 174 | 175 | 可以根据自己的实际需要填写,如果你不准备用对象存储,这里可以不改。串流列表和影片的池可以不是一个,如果不是一个的话,可以将两行子文件夹名用井号注释掉,如果是一个则必须要有子文件夹名。 176 | 177 | ``` 178 | transcoding: 179 | enabled: false # 关闭转码 180 | ``` 181 | 182 | 如果你的 VPS 性能很强可以不改,一般的便宜 VPS 都不太带的动转码的工作,我建议你在自己的电脑上转好了再上传。确保视频格式为 H264 音频格式为 AAC。 183 | 184 | ``` 185 | tracker: 186 | enabled: false ## 关闭 P2P 187 | ``` 188 | 189 | 因为我们的实例是自用的,开着 P2P 没什么意义,所以关掉。P2P 还会影响从对象存储串流。这里的选项并没有办法完全关闭 WebTorrent,我们后面会继续讲。 190 | 191 | 最后不要忘了保存。 192 | 193 | ### 启动 PeerTube 194 | 195 | 这里先用 `Exit` 命令回到之前的用户下,之后启动 PeerTube 服务: 196 | 197 | ``` 198 | sudo systemctl enable --now peertube 199 | ``` 200 | 201 | 检查一下运行有无问题: 202 | 203 | ``` 204 | sudo systemctl status peertube 205 | ``` 206 | 207 | 我们还需要修改默认的管理员密码,回到 peertube 用户下操作: 208 | 209 | ``` 210 | su - peertube 211 | cd peertube-latest && NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run reset-password -- -u root 212 | ``` 213 | 214 | 注意此处因为要拉起 Node.js,到出现输入密码提示的速度非常慢,如果误操作多按了回车什么的,可以用 Crtl+C 取消重来。 215 | 216 | 完成后再次用 `Exit` 命令回到之前的用户下。 217 | 218 | ## 安装 Caddy 219 | 220 | Caddy 是一款非常现代且易于配置的 Web 服务器,还可以自动从 Let's Encrypt 签发 HTTPS 证书,我也很推荐你在其他场合尝试使用 Caddy。 221 | 222 | 用以下命令添加 Caddy 的源并安装: 223 | 224 | ``` 225 | sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https 226 | curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/caddy-stable.asc 227 | curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list 228 | sudo apt update 229 | sudo apt install caddy 230 | ``` 231 | 232 | 编辑 Caddy 配置文件: 233 | 234 | ``` 235 | sudo nano /etc/caddy/Caddyfile 236 | ``` 237 | 238 | 将文件的内容替换为以下内容并保存: 239 | 240 | ``` 241 | peertube.imlala.best { # 你的域名 242 | reverse_proxy 127.0.0.1:9000 243 | } 244 | ``` 245 | 246 | 启动 Caddy 服务: 247 | 248 | ``` 249 | sudo systemctl enable --now caddy 250 | ``` 251 | 252 | 检查运行有无问题: 253 | 254 | ``` 255 | sudo systemctl status caddy 256 | ``` 257 | 258 | 此时如果出现端口被占用的问题,说明你可能在运行 nginx 一类的其他 Web 服务器。如果出现无法注册 HTTPS 证书一类的问题,可以检查一下防火墙和 CDN 配置,比如关掉 Cloudflare 的代理再试。 259 | 260 | 现在你可以打开你的网站试试看了,如果不出意外应该已经可以打开了。你可以用 root 和刚才设置的密码来登录。如果访问不了可以检查防火墙配置。 261 | 262 | ## 其他必要配置 263 | 264 | 在 PeerTube 的管理页面中我们可以对服务器做进一步的自定义。我这里挑选一些重要的来讲一下。 265 | 266 | ### 管理面板 267 | 268 | 首先我建议你安装 privacysettings 插件,它可以将新上传的影片锁定为站内访问,对一个自用的节点非常实用。 269 | 270 | 在 Configuration > Basic 下,你可以将 SEARCH 和 FEDERATION 里面的项目全部勾掉,来进一步提高自闭程度。记得点保存设置。 271 | 272 | ### 我的账户面板 273 | 274 | 还记得我们刚才提到的 P2P 影响对象存储访问的问题吗?我很怀疑这其实是一个 Bug,在 Tracker 已经被禁用的情况下,P2P 应该不可用才对,但 Web Torrent 却还在浏览器上运行。这基本上等于是把我们用来提速的对象给存储架空了。即便在不用对象存储的条件下,我依然发现它要比直连慢得多,对于私人使用来说怎么都是关掉为好。 275 | 276 | 我们需要在 “我的账户” 的 Settings 中找到 “帮助分享正在播放的视频” 勾掉。记得点保存设置。这一选项需要在每个用户的设置里面进行调整,非常的麻烦,不过因为我们是自己用,所以影响不是特别大。希望这一问题能在以后的版本中得到解决。 277 | 278 | PeerTube 的中文翻译也不是很完整,有时候有有时候没有。 279 | 280 | ## 排错 281 | 282 | 在 PeerTube 的 “管理” 的 “系统” 菜单下的 Jobs 中可以看到正在执行的任务。如 “move-to-object-storage ” 就是将上传的视频移动到对象存储的任务,你可以在其报告中看到一些相关的错误提示。如果对象存储无法访问,可以检查 CORS 是否正确,极端情况下可以先改成允许所有网站访问进行测试。还有可能是因为对象存储没有设置为 Public。 283 | 284 | 如完全按照本教程配置,播放器应该会在播放时右下角显示 HTTP 字样(电脑版页面),而不是上传下载速度,否则请检查是否已关闭 “帮助分享正在播放的视频”。 285 | 286 | ## 参考资料 287 | 288 | [PeerTube Github](https://github.com/Chocobozzz/PeerTube/) 289 | 290 | [PeerTube Docs](https://docs.joinpeertube.org/) 291 | 292 | [荒岛 PeerTube v3:终于支持直播功能啦](https://lala.im/7688.html) 293 | 294 | [知乎 Xpitz PeerTube 安装教程:如何搭建视频分享平台](https://zhuanlan.zhihu.com/p/357738044)(想要用 Docker 装的可以参考此文) 295 | 296 | ## 结语 297 | 298 | 我早就有想搭一个 PeerTube 的想法但是一直没有付诸实践,主要就是因为安装过于麻烦。这次教程用自用节点的角度尽可能细致的梳理了安装步骤,希望能够帮到有同样想法的朋友。 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Tutorials 2 | 3 | [用树莓派(等)为 USB Midi 键盘增添连接方式](MidiPi/index.md)(2019/8/14) 4 | 5 | [搭建易于访问的私人 PeerTube 实例](PeerTube/index.md)(2022/2/10) 6 | 7 | Debian 相关 8 | 9 | [2024 我对我的 Mac mini 做了什么](Debian/index.md) (2024/1/15) 10 | 11 | [Debian 使用 Btrfs 文件系统实现快照和恢复](Debian/btrfs.md)(2024/1/11) 12 | 13 | [Debian 使用 libimobiledevice 实现苹果设备无线备份](Debian/libimobiledevice.md)(2024/1/11) 14 | 15 | [Debian 安装 macOS Sonoma KVM 虚拟机](Debian/osx-kvm.md) (2024/1/12) 16 | 17 | [在 Debian 上使用 Mac mini 的红外接收器控制 CD 播放](Debian/cd-player.md) (2024/1/13) 18 | 19 | [桌面环境备忘录](Debian/desktop.md) (2024/2/13) 20 | 21 | 文章版权所有,转载请注明作者。 22 | --------------------------------------------------------------------------------