背景
这份教程基于一次完整的从飞牛(fnOS)系统迁移到 Ubuntu 24.04.4 LTS Desktop + 1Panel + Docker 开源生态的硬核实践整理而成。整个过程经历了备份、重装、恢复、排错、优化的全流程,融入了长达数万字的对话中遇到的每一个“坑”和最终验证有效的解决方案。
本教程的最大特点:它不是一份理想化的官方文档,而是一份真实的排错实录,涵盖了从底层磁盘挂载(飞牛复杂的LVM/RAID结构)、SSH连接、1Panel快照恢复,到硬盘休眠配置、Docker代理设置、Cockpit反代等所有实际操作细节。
适用场景:飞牛系统(或其他NAS系统)迁移至Ubuntu + 1Panel,希望保留原有数据,并搭建更强大、更可控的家庭服务器环境。
一、备份
1.1 1Panel面板快照(最关键的一步)
在飞牛系统的1Panel中,必须使用“面板快照”功能,而不是普通的“网站备份”。普通的备份只包含网站文件,而面板快照能完整备份:
- 网站配置(域名、Nginx规则)
- 防火墙规则
- 计划任务
- 面板设置
操作步骤:
- 登录飞牛上的1Panel → 面板设置 → 快照
- 点击 “创建快照”,备份账号选择“服务器磁盘”
- 创建完成后,找到快照文件(通常在
/opt/1panel/backup/snapshot),将其复制到你的数据盘或外部存储设备(这一步非常重要,重装系统后会用到)
1.2 Docker数据备份
1Panel快照不包含Docker容器的内部数据(如Nextcloud的文件、数据库等),需要单独备份:
# 查看Docker数据目录(默认为/var/lib/docker)
docker info | grep "Docker Root Dir"
# 打包备份
sudo tar -czvf docker-backup.tar.gz /var/lib/docker
将打包文件也复制到外部存储。
1.3 记录关键信息
建议用笔记记录以下信息,恢复时能省去很多麻烦:
- 1Panel网络信息(如
1panel-network的子网、网关) - 数据库密码、应用密钥
- 域名配置
二、安装Ubuntu桌面版(24.04.4 LTS)
2.1 制作启动盘
- 从清华镜像源下载:
ubuntu-24.04.4-desktop-amd64.iso - 使用Rufus(Windows)或
dd命令写入U盘
2.2 安装过程中的关键选择
- 分区:如果你希望系统盘和数据盘分离,可以在安装时手动分区:
- EFI分区:512MB
/:建议60-80GB(ext4)/home:剩余空间(ext4)——这样以后重装系统可以保留用户数据
- 用户信息:设置用户名(如
king)、密码、主机名 - 软件选择:取消勾选“安装第三方图形驱动”和“安装媒体编解码器”,保持系统最小化
2.3 安装后的第一件事:换源
Ubuntu 24.04使用新的DEB822格式,编辑源文件:
# 备份原文件
sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak
# 编辑
sudo nano /etc/apt/sources.list.d/ubuntu.sources
替换为清华源内容:
Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu/
Suites: noble noble-updates noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
更新源:
sudo apt update && sudo apt upgrade -y
三、设置SSH远程连接(告别显示器)
Ubuntu桌面版默认只安装了SSH客户端,没有安装SSH服务端,需要手动安装:
# 安装SSH服务端
sudo apt install openssh-server -y
# 启动并设置开机自启
sudo systemctl enable --now ssh
# 检查状态
sudo systemctl status ssh
# 如果防火墙开启,放行SSH端口
sudo ufw allow ssh
此时就可以用另一台电脑的PuTTY或终端连接了:
ssh 用户名@你的UbuntuIP
避坑提醒:如果连接失败,可能是防火墙或服务未启动。用 sudo systemctl status ssh 检查,若显示 inactive,用 sudo systemctl start ssh 启动。
四、安装1Panel并恢复快照
4.1 安装1Panel
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh
sudo bash quick_start.sh
按提示设置1Panel端口、用户名、密码。
4.2 恢复Docker数据(先于面板快照恢复)
因为1Panel快照恢复时会尝试启动容器,所以需要先让Docker数据就位:
# 停止Docker服务
sudo systemctl stop docker
# 将备份的docker-backup.tar.gz解压覆盖
sudo tar -xzvf /path/to/docker-backup.tar.gz -C /
# 启动Docker服务
sudo systemctl start docker
4.3 恢复1Panel快照
- 登录1Panel → 面板设置 → 快照
- 点击 “导入快照”,选择之前备份的快照文件
- 等待导入完成,系统会自动重启1Panel服务
4.4 重建1Panel网络和修复应用
快照恢复后,可能会因为网络环境变化导致部分容器启动失败:
- 检查网络:在1Panel“容器-网络”中,查看是否存在
1panel-network。如果不存在,手动创建一个同名的bridge网络,填入之前记下的子网信息(如172.20.0.0/16) - 重建应用:在“应用商店-已安装”中,对显示异常的应用逐个点击 “重建”。重建时会读取已存在的Docker数据,不会丢失配置
在重建之前,必须先配置好Docker代理,否则恢复后重建应用时可能无法拉取镜像!
请先按照第七阶段的方法配置好Docker代理(包括修改 daemon.json、重启Docker、验证代理生效)。如果暂时无法配置代理,也可以使用离线导入镜像的方式(见第七阶段备选方案),但推荐优先配置代理。
💾 第五阶段:挂载飞牛的“复杂”硬盘(LVM/RAID)
这是整个迁移中最可能出现问题的环节,因为飞牛系统通常对每块硬盘都设置了单盘RAID + LVM,导致在Ubuntu下不能直接挂载。
5.1 识别磁盘结构
sudo lsblk -f
你会看到类似这样的输出:
sda
└─sda1 linux_raid_member
└─md0 LVM2_member
└─卷组-逻辑卷 ext4
这就是飞牛典型的单盘RAID1 + LVM结构:每块物理盘先做成一个独立的RAID1阵列(虽然是单盘),然后再用LVM管理。
5.2 安装必要工具
sudo apt install mdadm lvm2 smartmontools sdparm -y
5.3 组装RAID并激活LVM
# 扫描并组装所有可识别的RAID
sudo mdadm --assemble --scan
# 查看组装的RAID设备
cat /proc/mdstat
# 应该看到类似 md0 : active raid1 sda1[0] 的输出
# 扫描并激活LVM卷组
sudo vgscan
sudo vgchange -ay
# 查看逻辑卷
sudo lvs
sudo lvdisplay
你会看到类似这样的逻辑卷路径:
/dev/trim_2abfb71e_7982_4d6d_ac4e_8f81d4533fff/0/dev/trim_3bd2bc87_9c09_4efc_993b_fdc489e2d0a9/0/dev/trim_2dfb11ee_bcf4_4117_8add_df84633db194/0
5.4 挂载逻辑卷(数据无损)
# 创建挂载点
sudo mkdir -p /mnt/disk{1,2,3}
# 挂载(路径以实际lvs输出为准)
sudo mount /dev/trim_2abfb71e_7982_4d6d_ac4e_8f81d4533fff/0 /mnt/disk1
sudo mount /dev/trim_3bd2bc87_9c09_4efc_993b_fdc489e2d0a9/0 /mnt/disk2
sudo mount /dev/trim_2dfb11ee_bcf4_4117_8add_df84633db194/0 /mnt/disk3
5.5 验证数据
ls /mnt/disk1
ls /mnt/disk2
ls /mnt/disk3
如果能看见飞牛中的文件(如照片、视频),恭喜你——数据完好无损!
5.6 配置开机自动挂载(使用UUID)
# 获取文件系统UUID(不是LVM的UUID)
sudo blkid /dev/trim_2abfb71e_7982_4d6d_ac4e_8f81d4533fff/0
sudo blkid /dev/trim_3bd2bc87_9c09_4efc_993b_fdc489e2d0a9/0
sudo blkid /dev/trim_2dfb11ee_bcf4_4117_8add_df84633db194/0
编辑 /etc/fstab:
sudo nano /etc/fstab
添加类似以下三行(替换UUID为实际值):
UUID=06176f77-6bee-44c9-bd31-50276af711a4 /mnt/disk1 ext4 defaults,noatime 0 2
UUID=1e1a0d70-0e3f-444a-96e5-091d9b42b178 /mnt/disk2 ext4 defaults,noatime 0 2
UUID=f198112a-a62c-4184-b51b-ea478e07c97e /mnt/disk3 btrfs defaults,noatime 0 2
5.7 保存RAID配置(确保重启后自动组装)
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u
避坑提醒:第三个盘可能是btrfs文件系统,这是飞牛默认格式,可以直接挂载使用,无需转换。挂载后检查文件系统类型,确保在fstab中填写正确。
💤 第六阶段:硬盘休眠配置(保护机械盘)
使用 hd-idle 实现三块机械盘(sda、sdb、sdc)的自动休眠,并配置监控脚本记录健康状态。
6.1 安装hd-idle
sudo apt update
sudo apt install hd-idle -y
6.2 配置自动休眠策略
编辑配置文件 /etc/default/hd-idle:
sudo nano /etc/default/hd-idle
修改为以下内容:
START_HD_IDLE=true
# -i 0 保证默认不休眠(避免影响系统盘)
# -a 后面紧跟硬盘ID,-i 600 表示空闲600秒(10分钟)后休眠
HD_IDLE_OPTS="-i 0 -a sda -i 600 -a sdb -i 600 -a sdc -i 600"
参数解释:
-i 0:对其他未指定的磁盘不休眠-a sda -i 600:对/dev/sda设置10分钟无操作后休眠- 同理为sdb、sdc设置
6.3 启动服务
sudo systemctl enable hd-idle
sudo systemctl start hd-idle
# 查看状态
sudo systemctl status hd-idle
6.4 测试休眠
# 立即强制休眠(测试用)
sudo hdparm -y /dev/sdb
# 查看硬盘状态(应显示 standby)
sudo hdparm -C /dev/sdb
# 查看hd-idle空闲计时器
sudo hd-idle -t sda
sudo hd-idle -t sdb
sudo hd-idle -t sdc
注意:hd-idle -t 是显示空闲时间,不是强制休眠。强制休眠用 hdparm -y。
6.5 创建硬盘健康监控脚本
创建一个脚本,定期记录三块盘的SMART数据,观察休眠效果和健康状态。
脚本路径:/usr/local/bin/disk_health_monitor.sh
#!/bin/bash
# ================= 配置部分 =================
DISKS=("/dev/sda" "/dev/sdb" "/dev/sdc")
LOG_FILE="/var/log/disk_health_monitor.log"
# =============================================
# 检查 smartctl 是否安装
if ! command -v smartctl &> /dev/null; then
echo "$(date "+%Y-%m-%d %H:%M:%S") - 错误:未发现 smartctl,请先安装:sudo apt install smartmontools" | tee -a $LOG_FILE
exit 1
fi
# 如果日志文件不存在,创建表头
if [ ! -f "$LOG_FILE" ]; then
echo "时间 | 磁盘 | 运行小时 | 磁头起停(LCC) | 马达起停" > "$LOG_FILE"
echo "------------------------------------------------------------" >> "$LOG_FILE"
fi
# 循环处理每个磁盘
for DISK in "${DISKS[@]}"; do
if [ ! -b "$DISK" ]; then
echo "$(date "+%Y-%m-%d %H:%M:%S") | $DISK | 磁盘不存在,跳过" >> "$LOG_FILE"
continue
fi
DATE=$(date "+%Y-%m-%d %H:%M:%S")
# 提取关键数据
HOURS=$(sudo smartctl -a "$DISK" | grep "Power_On_Hours" | awk '{print $10}')
LOAD_CYCLES=$(sudo smartctl -a "$DISK" | grep "Load_Cycle_Count" | awk '{print $10}')
START_STOP=$(sudo smartctl -a "$DISK" | grep "Start_Stop_Count" | awk '{print $10}')
[ -z "$HOURS" ] && HOURS="N/A"
[ -z "$LOAD_CYCLES" ] && LOAD_CYCLES="N/A"
[ -z "$START_STOP" ] && START_STOP="N/A"
echo "$DATE | $DISK | $HOURS h | $LOAD_CYCLES | $START_STOP" >> "$LOG_FILE"
echo "记录成功: $DATE | $DISK | $HOURS h | $LOAD_CYCLES | $START_STOP"
done
赋予执行权限并设置定时任务(例如每天凌晨2点记录):
chmod +x /usr/local/bin/disk_health_monitor.sh
# 添加到crontab
sudo crontab -e
# 添加一行
0 2 * * * /usr/local/bin/disk_health_monitor.sh
避坑提醒:
- LVM可能会定期写入元数据,阻止磁盘休眠。如果发现硬盘始终不休眠,可以调整LVM配置(
/etc/lvm/lvm.conf中设置write_cache_state = 0),但会影响性能,建议先观察。 - 使用
iotop或iostat检查是否有进程频繁访问磁盘。
🌐 第七阶段:配置Docker局域网代理
由于网络环境限制,Docker拉取镜像需要代理。你的局域网内有代理主机(IP:192.168.1.112,端口:7897)。
7.1 编辑Docker配置文件
sudo nano /etc/docker/daemon.json
确保内容如下(注意JSON语法,最后一个花括号不能少):
{
"data-root": "/var/lib/docker",
"live-restore": true,
"log-driver": "json-file",
"log-opts": {
"max-file": "5",
"max-size": "100m"
},
"proxies": {
"http-proxy": "http://192.168.1.112:7897",
"https-proxy": "http://192.168.1.112:7897",
"no-proxy": "localhost,127.0.0.1,192.168.1.0/24"
},
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://registry.hub.docker.com",
"https://docker.1panel.live"
]
}
语法检查:
- 确保每个大括号、方括号都正确闭合
- 最后一个条目后面不能有逗号
7.2 重启Docker服务
sudo systemctl restart docker
7.3 验证代理是否生效
# 查看Docker环境变量
sudo systemctl show --property=Environment docker
# 测试拉取镜像
docker pull hello-world
如果拉取成功,且代理主机上有对应日志,说明配置正确。
避坑提醒:
- Windows防火墙:如果代理主机是Windows,记得在防火墙中放行7897端口,允许局域网访问
- 代理软件设置:确保代理软件(如Clash、v2ray)开启了“允许局域网连接”
🚀 第八阶段:拉取v2raya镜像(备用代理方案)
如果后续需要更灵活的代理(如透明代理),可以安装v2raya。
8.1 通过apt安装
# 添加官方源
wget -qO - https://apt.v2raya.org/key/public-key.asc | sudo tee /etc/apt/trusted.gpg.d/v2raya.asc
echo "deb https://apt.v2raya.org/ v2raya main" | sudo tee /etc/apt/sources.list.d/v2raya.list
# 安装
sudo apt update
sudo apt install v2raya -y
# 启动服务
sudo systemctl enable --now v2raya.service
8.2 访问Web界面
浏览器打开 http://你的IP:2017,创建管理员账号,导入节点即可。
8.3 配置Docker使用v2raya代理
v2raya默认HTTP代理端口为20171,可以修改Docker配置中的代理地址指向它:
"proxies": {
"http-proxy": "http://127.0.0.1:20171",
"https-proxy": "http://127.0.0.1:20171"
}
v2raya默认会开启HTTP代理端口(通常为
20171)和SOCKS5端口(20170)。如果你只是希望Docker通过代理拉取镜像,可以将Docker代理配置指向http://127.0.0.1:20171。如果你开启了v2raya的全局透明代理模式(例如使用TPROXY),则无需额外配置Docker代理,所有流量会自动走代理。请根据你的实际需求选择。
🔒 第九阶段:安全检查与证书配置
9.1 检查防火墙
# 查看防火墙状态
sudo ufw status
# 放行必要端口(如1Panel、SSH、HTTP/HTTPS)
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 9090/tcp # Cockpit端口
9.2 1Panel安全设置
- 登录1Panel,修改默认端口(建议改为非标准端口)
- 开启面板登录验证码
- 定期检查“安全-防火墙”中的端口放行规则
9.3 SSL证书申请
在1Panel中:
- 进入“网站” → “证书” → “申请证书”
- 选择ACME类型(如Let's Encrypt)
- 填写域名、邮箱,自动申请证书
- 在网站设置中启用HTTPS并选择申请的证书
🖥️ 第十阶段:安装Cockpit并配置反向代理
10.1 安装Cockpit
sudo apt install cockpit cockpit-storaged -y
sudo systemctl enable --now cockpit.socket
10.2 在1Panel中配置反向代理
- 在1Panel“网站”中创建新站点,域名例如
cockpit.你的域名.com - 启用HTTPS,选择已申请的SSL证书
- 设置反向代理地址:
http://127.0.0.1:9090
10.3 解决Cockpit反代后的访问问题
Cockpit默认只允许通过localhost或与服务器主机名匹配的域名访问。通过反向代理访问时,需要修改Cockpit配置:
sudo nano /etc/cockpit/cockpit.conf
添加以下内容:
[WebService]
AllowUnencrypted = true
Origins = https://cockpit.你的域名.com http://cockpit.你的域名.com
重启Cockpit服务:
sudo systemctl restart cockpit
避坑提醒:
- 如果页面能打开但样式丢失,检查Nginx配置是否传递了正确的Host头
- 如果出现403,通常是
Origins配置未正确添加
10.4 安装SMB共享插件(Ubuntu 24.04特供版)
官方源尚未支持24.04,需要手动下载适配22.04的deb包(在24.04上也能用):
# 安装Samba依赖
sudo apt install samba nfs-common policykit-1 -y
# 下载deb包
wget https://github.com/45Drives/cockpit-file-sharing/releases/download/v4.5.3-4/cockpit-file-sharing_4.5.3-4jammy_all.deb
# 安装
sudo dpkg -i cockpit-file-sharing_4.5.3-4jammy_all.deb
sudo apt --fix-broken install -y
sudo systemctl restart cockpit
现在通过Cockpit的“文件共享”插件可以方便地管理Samba共享。
☁️ 第十一阶段:安装Nextcloud并优化配置
11.1 1Panel应用商店安装
- 在1Panel“应用商店”中搜索Nextcloud,选择最新版安装
- 同时安装MariaDB和Redis(作为依赖)
- 数据目录建议放在SSD上的
/home/nextcloud_data(利用SSD高速读写)
11.2 配置反向代理(公网访问)
同Cockpit类似,在1Panel中为Nextcloud创建网站,设置域名和SSL。
11.3 修改Nextcloud配置文件
编辑 /home/nextcloud_data/config/config.php(路径以实际为准),添加以下配置解决反向代理问题:
'trusted_domains' =>
array (
0 => 'localhost',
1 => 'nc.你的域名.com',
),
'overwrite.cli.url' => 'https://nc.你的域名.com',
'overwritehost' => 'nc.你的域名.com',
'overwriteprotocol' => 'https',
'trusted_proxies' =>
array (
0 => '127.0.0.1', // 1Panel Nginx容器IP
),
'forwarded_for_headers' => array('HTTP_X_FORWARDED_FOR'),
11.4 集成ONLYOFFICE实现文档在线编辑
独立部署Collabora Online(推荐):
docker run -d --restart=always --name=collabora \
-p 9980:9980 \
-e "aliasgroup1=https://nc.你的域名.com" \
-e "extra_params=--o:ssl.enable=false --o:ssl.termination=true" \
--cap-add MKNOD \
collabora/code
在1Panel中为 office.你的域名.com 设置反向代理,并添加WebSocket支持。
在Nextcloud后台“管理设置”→“Office”中,填写服务器地址 https://office.你的域名.com。
🧹 第十二阶段:清理Snap与桌面优化
12.1 彻底禁用并删除Snap
Snap会占用系统资源且自动更新不可控,建议彻底移除:
# 1. 卸载所有Snap应用(除核心外)
sudo snap remove firefox snap-store firmware-updater
# 2. 卸载桌面集成组件
sudo snap remove gnome-42-2204 gtk-common-themes snapd-desktop-integration
# 3. 卸载snapd
sudo apt purge snapd -y
# 4. 删除残留目录
sudo rm -rf /var/cache/snapd /snap /var/lib/snapd ~/snap
# 5. 阻止Snap重新安装
sudo nano /etc/apt/preferences.d/nosnap.pref
# 添加:
Package: snapd
Pin: release a=*
Pin-Priority: -10
12.2 安装Edge浏览器(桌面备用)
# 添加微软仓库
curl -fSsL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor | sudo tee /usr/share/keyrings/microsoft-edge.gpg > /dev/null
echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/microsoft-edge.gpg] https://packages.microsoft.com/repos/edge stable main' | sudo tee /etc/apt/sources.list.d/microsoft-edge.list
# 安装
sudo apt update
sudo apt install microsoft-edge-stable -y
12.3 整理桌面图标
由于删除了Snap,一些桌面快捷方式可能失效,可以手动清理 ~/Desktop 和 ~/.local/share/applications 中的无效链接。
🕒 第十三阶段:设置定时清理脚本
在1Panel中创建计划任务,定期清理系统垃圾和Docker无用镜像。
脚本内容(保存为 /usr/local/bin/cleanup.sh):
#!/bin/bash
echo "--- 开始系统清理 [$(date)] ---"
# 清理孤儿依赖
apt-get autoremove -y
# 清理软件包缓存
apt-get autoclean -y
# 清理残留配置文件
dpkg -l | grep ^rc | awk '{print $2}' | xargs -r apt-get purge -y
# 清理Docker垃圾(虚悬镜像、停止的容器等)
docker system prune -af
# 清理系统日志,保留最近3天
journalctl --vacuum-time=3d
echo "--- 清理完成 ---"
在1Panel“计划任务”中创建新任务:
- 任务类型:Shell脚本
- 执行周期:每天凌晨3点(
0 3 * * *) - 脚本内容:直接粘贴上述代码,或填写脚本路径
✅ 第十四阶段:收尾与验证
- 检查所有服务:1Panel、Cockpit、Nextcloud、Jellyfin等是否正常运行
- 验证自动挂载:重启一次,确认
/mnt/disk*都已自动挂载 - 测试代理:执行
docker pull nginx看是否通过代理拉取 - 验证休眠:等待10分钟后,用
hdparm -C /dev/sdb查看磁盘状态 - 确认防火墙:确保只开放了必要端口
📝 最后的话
至此,你已完成从飞牛到自建Ubuntu服务器的完整迁移,并获得了一份详尽的操作记录。这份教程最大的价值在于真实——每一个步骤都经过实际验证,每一个“坑”都有对应的解决方案。
现在,你拥有的是一个完全可控、功能强大、且根据你的硬件(HP 600 SFF G3)和需求定制的家庭服务器。尽情享受这份折腾后的宁静与成就感吧!
如果有新的需求或问题,随时可以继续探索——这正是自建服务器的乐趣所在。
🧩 附:优化过程中的折腾记录与避坑指南
在迁移和调优过程中,围绕“构建轻量、可控、高效的Ubuntu桌面服务器”这一目标,进行了大量尝试。以下是详细记录,包括目的、尝试方案、最终选择及放弃原因,供日后参考。
1. 软件安装方式:从图形界面到命令行
目的:摆脱Snap版软件,改用原生Deb包或更轻量的方式安装应用。
| 尝试过的方案 | 遇到的问题 | 最终选择 | 放弃原因 |
|---|---|---|---|
| GNOME软件中心(Snap版) | 内存占用高,与系统风格不搭,已卸载 | Modren(轻量图形前端)+ APT命令行 | 软件中心本身不是问题,但Snap版不受控,卸载后改用更轻量的Modren,日常安装仍用命令行 |
| GDebi图形安装器 | 打开 .deb文件后窗口空白无响应 |
APT命令行(sudo apt install ./xxx.deb) |
GDebi图形界面在Ubuntu 24.04上可能存在Wayland或PolicyKit兼容问题,调试复杂,命令行稳定高效 |
| 手动解压Zotero | 解压后找不到可执行文件,或启动失败 | Flatpak版Zotero | 手动解压需要自己处理快捷方式和更新,Flatpak版自动更新、沙箱隔离,省心且官方支持 |
经验:图形工具虽好,但遇到兼容问题时不值得深究,直接换用命令行或Flatpak往往更快。
2. 处理文件关联(MIME类型)
这是最关键的一步。系统记住了一些文件格式要由 gnome-software 打开,我们需要把这个关联删掉。
bash
# 查看有哪些文件类型还关联着 gnome-software
grep -r "gnome-software" /usr/share/applications/ ~/.local/share/applications/
# 找到对应的 .desktop 文件(通常是 /usr/share/applications/org.gnome.Software.desktop),
# 它里面定义了支持哪些文件类型。如果只是想取消关联,可以备份后删除这个文件:
sudo mv /usr/share/applications/org.gnome.Software.desktop /usr/share/applications/org.gnome.Software.desktop.bak
# 更新桌面数据库
sudo update-desktop-database
3. 检查并停止后台服务
GNOME Software 有一个后台服务,负责检查更新和提供搜索功能。即使界面没了,它可能还在运行。
bash
# 查看服务状态
systemctl --user status gnome-software-service.service
# 如果存在且正在运行,停止它并禁用开机自启
systemctl --user stop gnome-software-service.service
systemctl --user disable gnome-software-service.service
💡 补充说明
做完以上步骤,重启一下系统或注销重新登录,再双击未知文件,应该就不会弹出那个搜索窗口了。
org.gnome.Software 作为系统组件,它的很多功能是通过插件实现的,比如支持 PackageKit(管理 deb 包)、fwupd(更新固件)等。所以彻底移除它可能会影响系统更新提示等功能,这一点你可以根据实际需要权衡。如果只是为了阻止未知文件弹窗,处理完第二步的文件关联可能就够了。
2. 浏览器硬件加速:从卡顿到流畅
目的:解决Edge浏览器滑动卡顿、CPU高的问题,让核显(Intel HD 630)参与渲染。
| 尝试过的方案 | 遇到的问题 | 最终选择 | 放弃原因 |
|---|---|---|---|
| 检查驱动、权限 | lspci识别,i915加载,但 chrome://gpu显示软件渲染 |
坚持权限修正(加入 render组) |
必须注销登录后权限才生效,这是基础步骤 |
| 调整Edge flags | 启用 Override software rendering list等无效 |
最终方案:在 edge://settings/system开启硬件加速并重启浏览器 |
之前忽视了这个最简单的开关,折腾了半天的启动参数和Xorg切换其实多余 |
| 切换到Xorg会话 | Xorg下硬件加速成功,但Wayland才是现代选择 | 继续使用Wayland | Edge本身支持Wayland硬件加速,只需正确开启并重启即可 |
经验:遇到硬件加速问题,先检查最简单的地方:设置开关、权限、重启。不要急于换会话。
3. 硬盘休眠:从“永不眠”到“自动睡”
目的:让三块机械盘(sda、sdb、sdc)在空闲时自动休眠,节能降噪。
| 尝试过的方案 | 遇到的问题 | 最终选择 | 放弃原因 |
|---|---|---|---|
| hd-idle配置 | 配置正确,但硬盘从不休眠 | 拆除RAID/LVM结构 | 根本原因是磁盘处于RAID+LVM管理下,底层元数据写入导致无法空闲 |
| 手动休眠测试 | hdparm -y在卸载分区后成功,挂载后无效 |
排查写入进程 | 发现挂载后文件系统元数据(如jbd2)有少量写入,通过 noatime挂载选项大幅减少 |
| 调整LVM/RAID配置 | 尝试修改LVM参数减少写入 | 彻底拆除 | 临时缓解不如根治,拆除后磁盘变为普通独立分区,休眠正常 |
| 改用hdparm -S | 让硬盘自管理休眠,但需要测试兼容性 | 最终使用hd-idle + 普通分区 | 拆除RAID/LVM后,hd-idle正常工作了 |
经验:硬盘不休眠先看底层结构,RAID/LVM是罪魁祸首。拆除后配合 noatime挂载选项,休眠问题迎刃而解。
4. 用户权限:让普通用户读写挂载点
目的:用户 king能直接读写 /mnt/disk*下的文件,无需每次sudo。
| 尝试过的方案 | 遇到的问题 | 最终选择 | 放弃原因 |
|---|---|---|---|
| 临时chown | 重启后失效(挂载点所有权重置) | 修改 /etc/fstab后固定所有权 |
对于ext4/btrfs,只需在挂载后 chown一次,所有权会保存在文件系统中,永久有效 |
| 通过uid/gid挂载 | 仅适用于FAT/NTFS | 放弃 | 不适用当前文件系统 |
| 创建storage组 | 可行但稍显复杂 | 直接chown | 单用户环境,直接chown最简单 |
经验:对于Linux原生文件系统,chown一次即可永久生效,无需每次挂载时指定。
5. 其他尝试与工具
| 工具/方案 | 目的 | 最终评价 |
|---|---|---|
| Firejail / Flatpak | 隔离运行国产软件(WPS、微信) | 未深入,但Flatpak是未来方向 |
| Docker版WPS | 尝试在容器中运行办公软件 | 资源占用大,配置复杂,放弃 |
| Mission Center | 系统监控(类似任务管理器) | 轻量好用,替代GNOME系统监视器 |
| rsync | 数据迁移 | 稳定可靠,配合 -avP显示进度,完美 |
| grsync | rsync图形前端 | 未实际使用,命令行已满足需求 |
📌 避坑指南总结
- 软件安装:优先用
apt或Flatpak,少折腾图形安装器。 - 硬件加速:先开设置开关,再查权限,最后考虑驱动。重启浏览器或注销登录很重要。
- 硬盘休眠:确认磁盘是普通独立分区,RAID/LVM会阻止休眠。挂载时加
noatime减少写入。 - 权限问题:
/mnt下的挂载点所有权可通过chown一次解决,无需每次挂载时指定。 - 遇到卡顿时:用
iotop、fatrace、iostat定位写入源,而不是盲目调整配置。
这次折腾虽然花费时间,但彻底理清了Ubuntu桌面服务器的关键配置点,以后重装系统可以照搬经验,少走弯路。
方案二:全局禁用所有休眠功能
如果希望从根本上杜绝系统进入任何形式的休眠,可以采用这个方案。这会屏蔽掉系统所有与休眠相关的“目标”(targets),相当于釜底抽薪。
操作步骤如下:
在终端中执行以下一条命令即可:
bash
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
这条命令会禁用所有与休眠相关的系统服务,让系统和应用程序都没有办法触发休眠。
如果想恢复休眠功能,可以执行:
bash
sudo systemctl unmask sleep.target suspend.target hibernate.target hybrid-sleep.target
评论