前言

手里有一台本科室友毕业不要了丢给我的上古联想小新轻薄本,六代 i5,4G 内存,250G 硬盘,之前一直闲置,最近有空了(不如说是给某些不良嗜好找点替代活动)折腾一下,让它发挥一下余热。

准备工作

这个部分在闲置笔记本上操作。

安装系统

  1. 下载官方镜像
  2. 使用诸如 Ventoy,Rufus 等等的启动盘制作工具制作启动盘。
  3. 进入 BIOS,使用启动盘启动。部分联想电脑解锁隐藏 BIOS 可以参考 https://www.bilibili.com/opus/795391586576891909
  4. 按照官方引导一步步安装系统即可,LVM(Logical Volume Management) 功能建议启用,方便后续分区调整。

SSH

  • 推荐安装时勾选 OpenSSH 的选项。
  • 安装时未勾选的话则手动进行安装
sudo apt install openssh-server 
sudo ps -e |grep ssh # 显示sshd即安装成功
sudo systemctl status ssh # 查看 ssh service 状态
sudo systemctl start ssh # 一般默认开启,没有开启则手动开启

合盖不睡眠

毕竟是当小服务器用,平时是合盖状态,默认会直接睡眠。

  1. 修改 Login Manager 的配置
sudo vim /etc/systemd/logind.conf
  1. #HandleLidSwitch=suspend 改为HandleLidSwitch=ignore
  2. 重启服务
sudo systemctl restart systemd-logind

此时你已经可以把闲置笔记本放到无人在意的角落了,全程用主力电脑远程 ssh 连接即可。

使用密钥代替密码

  1. 使用 ed25519 算法生成密钥(在本机终端而不是在闲置笔记本上操作)
ssh-keygen -t ed25519 -a 256 -C "xxx@xxx"
  1. 将密钥上传到服务器
cat ~/.ssh/id_ed25519.pub | ssh username@remote_host_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

# 你也可以使用更方便的命令
ssh-copy-id user@hostname.example.com

# windows 使用如下命令
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user@hostname.example.com "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
  1. 关闭 ssh 密码登录
sudo vim /etc/ssh/sshd_config
  1. 将其中的#PasswordAuthentication yes修改为PasswordAuthentication no
  2. 重启 sshd 服务
sudo systemctl restart sshd

Fastfetch

不得不品的一环。

sudo add-apt-repository ppa:zhangsongcui3371/fastfetch
sudo apt update
sudo apt install fastfetch

爽。

btop

sudo apt install btop

smartctl

检查一下硬盘状况

sudo apt install smartmontools
sudo smartctl -a /dev/nvme0n1 # 设备名称可以用 lsblk 查看

YABS

没事跑个分。

curl -sL https://yabs.sh | bash

断电自动关机

用笔记本当轻量服务器有一个好处,就是相当于自带了一个 UPS。 这里添加一个定时脚本,检测到断电以及低电量时自动关机。

  1. 确认电池标识符(如果是 BAT0 的话后续请自行修改,这台笔记本是 BAT1
ls /sys/class/power_supply/
  1. 创建并编辑脚本
sudo vim /usr/local/bin/battery_monitor.sh
  • 添加如下内容
#!/bin/bash

THRESHOLD=50

CAPACITY=$(cat /sys/class/power_supply/BAT1/capacity)
STATUS=$(cat /sys/class/power_supply/BAT1/status)

# Discharging && capacity < Threshold
if [ "$STATUS" = "Discharging" ] && [ "$CAPACITY" -lt "$THRESHOLD" ]; then
    # log
    echo "$(date): Battery is at $CAPACITY%. Shutting down safely." >> /var/log/battery_shutdown.log
    
    # safely shutdown
    /sbin/shutdown -h now
fi
  • 赋予脚本执行权限
sudo chmod +x /usr/local/bin/battery_monitor.sh
  1. 设置定时任务
sudo crontab -e
  • 末尾添加一行
* * * * * /usr/local/bin/battery_monitor.sh

Docker

说实话很多东西还是大公司提供的云服务用起来方便,自己对一些薅羊毛的自动化脚本也不感兴趣,所以只部署了网络唤醒和几个 PT 相关的容器。

  • 按照官方文档安装 Docker Engine 以及 Docker Compose。
  • 以下全部 Docker Compose 配置文件均通过 sudo docker compose up -d 启动。

配置代理

  1. 创建配置文件
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
  1. 添加以下内容
[Service]
Environment="HTTP_PROXY=http://IP:port"
Environment="HTTPS_PROXY=http://IP:port"
Environment="NO_PROXY=localhost,127.0.0.1"
  1. 重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

挂载 NTFS 设备

存储电影电视剧的硬盘原本在 Windows 上运行,考虑到兼容性和可迁移性,不做格式化,直接在 Linux 下挂载使用。

lsblk -f # 查看移动硬盘 UUID
id # 查看用户 id 
sudo mkdir -p /mnt/Videos # 创建你希望的挂载点
sudo vim /etc/fstab
  • 添加以下内容(需要根据实际UUID、挂载点、uid和gid修改)
UUID=371F208A1CC186D2 /mnt/Videos  ntfs-3g  defaults,uid=1000,gid=1000,dmask=022,fmask=133,windows_names  0  0
  • 测试挂载情况
sudo mount -a

验证无误的话下次开机会自动挂载

卸载设备

lsblk
sudo umount <MOUNTPOINTS>

Qbittorrent WebUI

玩 PT 还是少不了它。

services:
  qbittorrent:
    image: lscr.io/linuxserver/qbittorrent:5.1.4
    container_name: qbittorrent_5.1.4
    # network_mode: "host"
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
      - WEBUI_PORT=21088
      - TORRENTING_PORT=16881
    volumes:
      - ./config:/config
      # path for vuetorrent ui
      - ./vuetorrent:/vuetorrent
      # Download path
      - /mnt/Videos/Contents:/downloads
    ports:
      - "21088:21088"
      - "16881:16881"
      - "16881:16881/udp"
    restart: unless-stopped
  • 新版本首次登陆时账号为 admin,密码为随机生成,使用 sudo docker logs qbittorrent_5.1.4 查看。

IYUU

用于自动辅种

services:
  iyuuplus:
    image: iyuucn/iyuuplus-dev:latest
    container_name: IYUUPlus
    restart: unless-stopped
    ports:
      - "8780:8780"
    volumes:
      - ./iyuu:/iyuu
      - ./data:/data
    # user: "1000:1000"

MoviePilot

用于自动签到以及更多高级功能。

services:
  moviepilot:
    image: jxxghp/moviepilot-v2:2.8.1-1
    container_name: moviepilot-v2
    restart: unless-stopped
  
    stdin_open: true
    tty: true
    hostname: moviepilot-v2
    ports:
     - '13000:3000'
     - '13001:3001'
    volumes:
      - '/mnt/Videos:/media'
      - './config:/config'
      - './core:/moviepilot/.cache/ms-playwright'
      - '/var/run/docker.sock:/var/run/docker.sock:ro'
    environment:
      - 'NGINX_PORT=3000'
      - 'PORT=3001'
      - 'PUID=0'
      - 'PGID=0'
      - 'UMASK=000'
      - 'TZ=Asia/Shanghai'
      - 'SUPERUSER=admin'
      - 'SUPERUSER_PASSWORD=Password'

UpSnap

用于局域网内网络唤醒。

services:
  upsnap:
    container_name: upsnap
    image: ghcr.io/seriousm4x/upsnap:5 # images are also available on docker hub: seriousm4x/upsnap:5
    network_mode: host
    restart: unless-stopped
    volumes:
      - ./data:/app/pb_data