简介
家中的服务器有 3 台全部安装的是 Ubuntu, 有时候需要折腾一下.
所以想用一个文档来记录 Ubuntu 上遇到过的问题, 另外就是做一个备忘录, 将已操作过的记录保存下来, 以便在其他服务器上重现, 避免重复查询资料.
优化建议
启用 Ubuntu Pro
Ubuntu Pro 是 Canonical 提供的企业级专业支持服务,个人用户和小团队可免费使用(最多 5 台设备,超过需付费)。它提供了长达 10 年的安全更新支持。
1 打开「软件和更新」,切换到「Ubuntu Pro」选项卡。
2 点击「启用 Ubuntu Pro」。
3 访问 Ubuntu Pro Dashboard 拿到分配给你的Token,填入「手动添加令牌」中,然后点击「确定」。


参考
Landscape Server
参考:
系统克隆
原来的系统安装在一块 PCIe Gen3 x4 的 M.2 固态上, 查阅资料得知这个插槽支持 PCIe Gen4 x4, 为了不浪费资源, 所以需要使用一块 PCIe Gen4 x4 的 M.2 固态替换原来那块系统盘, 但是又不想重新安装系统, 所以想通过系统克隆的方式迁移.
使用 dd 命令
备份数据:在进行克隆操作之前,确保你已经备份了重要数据,以防万一。
关闭系统:关闭你的 Ubuntu 系统,并插入新的 1T M.2 固态硬盘。
进入 Live 环境:使用 Ubuntu 安装介质(如 USB 启动盘)启动到 Live 环境。
打开终端:在 Live 环境中打开终端。
查找硬盘标识:使用
lsblk或fdisk -l命令查找新旧硬盘的标识(例如/dev/nvme0n1和/dev/nvme1n1)。克隆硬盘:使用
dd命令进行克隆。以下命令将旧硬盘克隆到新硬盘:sudo dd if=/dev/nvme0n1 of=/dev/nvme1n1 bs=4M status=progress注意:此操作将克隆整个硬盘,包括空闲空间,因此需要时间较长。
调整分区大小:克隆完成后,使用
gparted或fdisk调整新硬盘的分区大小以利用额外的空间。更新引导器:如果需要,更新引导器配置,例如使用
bootctl update。重启系统:重启系统,从新硬盘启动。
参考
- Ubuntu 硬盘克隆完全指南 高效实现数据备份与恢复
- Ubuntu 无损迁移、克隆系统
- Ubuntu 整系统迁移到另一个硬盘中
- Ubuntu 系统迁移实践
- 怎么把 ubuntu 移植到 centos 无界面系统中 ubuntu 系统迁移到新硬盘
使用群晖的 ABB
这个应该算是最简单的方法了, 正好我也有群晖, 所以直接使用这种方式恢复镜像即可.
参考
- 【NAS】整机备份还原 Windows/Linux 系统,群晖最强套件 ABB 教程
- 实体伺服器备份及还原-Linux
- Active Backup for Business 管理员指南 - 适用于 Linux
KVM
{% folding green, KVM 常用命令 %}
1. 安装 KVM 和 libvirt
首先,确保已安装 KVM 和 libvirt,这通常是管理 KVM 虚拟机的基础:
# 安装 KVM 和 libvirt
sudo apt update
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
# 启动并启用 libvirt 服务
sudo systemctl enable --now libvirtd
2. 虚拟机管理(使用 virsh)
virsh 是管理 KVM 虚拟机的命令行工具,以下是一些常见命令:
2.1 列出所有虚拟机
列出所有虚拟机,包括运行中的和已关闭的虚拟机:
sudo virsh list --all
2.2 启动虚拟机
启动指定的虚拟机:
sudo virsh start <vm_name>
例如:
sudo virsh start myvm
2.3 停止虚拟机
优雅地关闭虚拟机:
sudo virsh shutdown <vm_name>
如果虚拟机未响应,可以使用强制停止命令:
sudo virsh destroy <vm_name>
2.4 查看虚拟机的状态
查看虚拟机的详细状态:
sudo virsh dominfo <vm_name>
2.5 查看虚拟机的控制台
连接到虚拟机的控制台,适用于命令行界面虚拟机:
sudo virsh console <vm_name>
3. 虚拟机自启动
启用或禁用虚拟机的自启动(在系统重启时自动启动虚拟机):
3.1 启用自启动
sudo virsh autostart <vm_name>
3.2 禁用自启动
sudo virsh autostart --disable <vm_name>
3.3 查看自启动虚拟机列表
sudo virsh autostart --list
4. 创建、删除虚拟机
4.1 创建虚拟机
使用 XML 配置文件创建虚拟机:
sudo virsh create <xml_file>
例如:
sudo virsh create /path/to/your/vm_config.xml
4.2 删除虚拟机
删除虚拟机和关联的配置文件:
sudo virsh undefine <vm_name> --remove-all-storage
5. 虚拟机磁盘管理
5.1 查看虚拟机磁盘
查看虚拟机的磁盘配置:
sudo virsh vol-list --pool default
5.2 创建虚拟机磁盘
使用 qemu-img 创建一个虚拟硬盘镜像:
qemu-img create -f qcow2 /path/to/disk_image.qcow2 20G
5.3 增加虚拟机磁盘大小
增加虚拟机磁盘的大小(例如将磁盘大小增加 10GB):
qemu-img resize /path/to/disk_image.qcow2 +10G
6. 网络配置
6.1 查看网络桥接配置
列出所有虚拟网络:
sudo virsh net-list --all
6.2 启用虚拟网络
启用虚拟网络(例如默认的 default 网络):
sudo virsh net-start default
6.3 配置虚拟网络
使用 virsh 编辑虚拟网络的配置:
sudo virsh net-edit default
7. 备份和迁移虚拟机
7.1 虚拟机快照
创建虚拟机的快照:
sudo virsh snapshot-create-as <vm_name> <snapshot_name>
7.2 迁移虚拟机
迁移虚拟机到另一台主机(需要 libvirt 支持迁移):
sudo virsh migrate --live <vm_name> qemu+ssh://<user>@<remote_host>/system
8. 使用 virt-manager(图形界面)
8.1 安装 virt-manager
在 Ubuntu 上安装 virt-manager:
sudo apt install virt-manager
8.2 启动 virt-manager
运行 virt-manager 图形界面,管理虚拟机:
virt-manager
通过图形界面,你可以创建、启动、停止虚拟机,查看日志、资源使用情况等。
9. 监控虚拟机资源使用情况
9.1 查看虚拟机的 CPU、内存和磁盘使用情况
sudo virsh stats <vm_name>
9.2 查看虚拟机的实时性能数据
你可以使用 virt-top 命令来实时查看虚拟机的性能:
sudo virt-top
10. 安装虚拟机操作系统
通过 virt-install 安装一个新虚拟机操作系统:
sudo virt-install \
--name <vm_name> \
--vcpus 2 \
--memory 2048 \
--cdrom /path/to/iso_file.iso \
--disk size=20 \
--os-type linux \
--os-variant ubuntu20.04
{% endfolding %}
Cockpit
# 主服务
sudo apt install cockpit
# KVM 管理插件
sudo apt install cockpit-machines
Docker
Cockpit 强推 Podman 容器,Docker 管理插件在很早之前就没有维护了。好在民间有维护一个可用版本:chabad360/cockpit-docker: Cockpit UI for docker containers (ported from cockpit-podman) (github.com)。
git clone [email protected]:chabad360/cockpit-docker.git \
&& cd cockpit-docker \
&& export NODE_ENV=production \
&& make \
&& sudo make install
sudo make install 将包安装到 usr/local/share/cockpit/。这依赖于 dist 目标,该目标生成分发压缩包。你也可以运行 make rpm 来构建本地安装的 RPM。
在生产模式下,源文件会自动压缩和混淆。如果你想复制这个行为,请设置 NODE_ENV=production。
Sensors
wget https://github.com/ocristopfer/cockpit-sensors/releases/latest/download/cockpit-sensors.tar.xz && \
tar -xf cockpit-sensors.tar.xz cockpit-sensors/dist && \
mv cockpit-sensors/dist /usr/share/cockpit/sensors && \
rm -r cockpit-sensors && \
rm cockpit-sensors.tar.xz
软件更新-磁盘空间不足
有一天主机 /boot 空间分配太少了, 一到更新就报 磁盘空间不足:
此升级一共需要 188 M 的空闲空间,磁盘为 “/boot”。请额外释放至少 69.5 M 的 “/boot” 磁盘空间。您可以通过使用 “sudo apt remove”命令移除旧内核,还可以在 /etc/initramfs-tools/initramfs.conf 中添加“set COMPRESS=xz”选项来减少 initramfs 的大小。
删除旧内核
$ uname -r
6.8.0-48-generic
# dong4j @ station in ~/cockpit-docker on git:main o [16:35:06]
$ dpkg --list | grep linux-image
ii linux-image-6.8.0-45-generic 6.8.0-45.45~22.04.1 amd64 Signed kernel image generic
ii linux-image-6.8.0-48-generic 6.8.0-48.48~22.04.1 amd64 Signed kernel image generic
ii linux-image-generic-hwe-22.04 6.8.0-48.48~22.04.1 amd64 Generic Linux kernel image
# 删除旧内核
sudo apt remove --purge linux-image-6.8.0-45-generic
# 清理无用依赖
sudo apt autoremove --purge
# 删除旧内核后,更新 initramfs 文件以确保当前内核的文件是最新的
sudo update-initramfs -u
压缩减少 initramfs 文件大小
编辑 /etc/initramfs-tools/initramfs.conf 文件,添加 set COMPRESS=xz来压缩 initramfs 文件,从而减少空间占用。
编辑 initramfs.conf 文件
sudo vim /etc/initramfs-tools/initramfs.conf
COMPRESS=xz
# 更新 initramfs
sudo update-initramfs -u
自动清理旧内核
sudo apt install byobu
sudo byobu-disable
boot 扩容
参考:
Speedtest
来源: https://u.sb/debian-speedtest/
安装 Speedtest CLI
Speedtest CLI 是 Ookla 官方推出的 Linux / BSD 下的 CLI 工具,方便我们在服务器里直接测试公网带宽速度。
首先,导入 GPG Key 并添加源:
apt install -y lsb-release ca-certificates apt-transport-https curl gnupg dpkg
curl -sSL https://packagecloud.io/ookla/speedtest-cli/gpgkey | gpg --dearmor > /usr/share/keyrings/speedtest.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/speedtest.gpg] https://packagecloud.io/ookla/speedtest-cli/ubuntu/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/speedtest.list
然后更新系统并安装 speedtest:
apt update
apt install speedtest -y
使用 Speedtest CLI
安装完毕后我们即可使用默认的 speedtest 命令选择最近的节点并使用默认的网络测速,提示 Do you accept the license? [type YES to accept] 时,输入 YES 并回车即可:

高级用法
输入 speedtest -h 即可查看 speedtest 的命令参数:
root@debian ~ # speedtest -h
Speedtest by Ookla is the official command line client for testing the speed and performance of your internet connection.
Version: speedtest 1.1.1.28
Usage: speedtest [<options>]
-h, --help Print usage information
-V, --version Print version number
-L, --servers List nearest servers
-s, --server-id=# Specify a server from the server list using its id
-I, --interface=ARG Attempt to bind to the specified interface when connecting to servers
-i, --ip=ARG Attempt to bind to the specified IP address when connecting to servers
-o, --host=ARG Specify a server, from the server list, using its host's fully qualified domain name
-p, --progress=yes|no Enable or disable progress bar (Note: only available for 'human-readable'
or 'json' and defaults to yes when interactive)
-P, --precision=# Number of decimals to use (0-8, default=2)
-f, --format=ARG Output format (see below for valid formats)
--progress-update-interval=# Progress update interval (100-1000 milliseconds)
-u, --unit[=ARG] Output unit for displaying speeds (Note: this is only applicable
for ‘human-readable’ output format and the default unit is Mbps)
-a Shortcut for [-u auto-decimal-bits]
-A Shortcut for [-u auto-decimal-bytes]
-b Shortcut for [-u auto-binary-bits]
-B Shortcut for [-u auto-binary-bytes]
--selection-details Show server selection details
--ca-certificate=ARG CA Certificate bundle path
-v Logging verbosity. Specify multiple times for higher verbosity
--output-header Show output header for CSV and TSV formats
Valid output formats: human-readable (default), csv, tsv, json, jsonl, json-pretty
Machine readable formats (csv, tsv, json, jsonl, json-pretty) use bytes as the unit of measure with max precision
Valid units for [-u] flag:
Decimal prefix, bits per second: bps, kbps, Mbps, Gbps
Decimal prefix, bytes per second: B/s, kB/s, MB/s, GB/s
Binary prefix, bits per second: kibps, Mibps, Gibps
Binary prefix, bytes per second: kiB/s, MiB/s, GiB/s
Auto-scaled prefix: auto-binary-bits, auto-binary-bytes, auto-decimal-bits, auto-decimal-bytes
比较实用的有:
指定出口网卡:
speedtest -I 指定网卡名称
指定出口 IP:
speedtest -i IP 地址
注意指定网卡或 IP 后可能会出现 [error] Error: [0] Cannot open socket 的错误提示,忽略即可。
查看附近的测速节点列表:
speedtest -L
指定某个测速节点:
speedtest -s 测速节点 ID
systemd-networkd-wait-online.service
如果用 netplan 控制网络设备,同时把设备设置成固定 ip。如果对应的设备不存在,那么在系统启动后 systemd-networkd-wait-online.service 就会卡住几分钟,导致后续的服务无法执行。
这个问题有多种方式可以解决:
如何使用
NetworkManager管理网络, 可以在netplan配置文件中添加renderer: NetworkManager;修改
systemd-networkd-wait-online.service的超时时间:[Service] ExecStart= ExecStart=/usr/lib/systemd/systemd-networkd-wait-online --timeout=5使用
NetworkManager-wait-online.service代替;
因为我已经使用 NetworkManager 来接管网络了, 所以完全可以禁用 systemd-networkd-wait-online.service, 而且 NetworkManager 也自带一个 NetworkManager-wait-online.service, 可以避免依赖网络的自启动服务在启动时出现问题:
sudo systemctl disable systemd-networkd-wait-online.service \
&& sudo systemctl mask systemd-networkd-wait-online.service \
&& sudo systemctl stop systemd-networkd-wait-online.service
systemd mask的作用是 彻底屏蔽一个服务,防止它被启动,即使其他服务或依赖项尝试启动它,也不会生效。
操作 作用 是否可以被手动启动? 依赖的服务能否启动它? disable取消开机自启 ✅ 可以 systemctl start✅ 其他服务可以启动 mask完全屏蔽 ❌ 无法手动 start❌ 其他服务无法启动 简单理解:
- disable 只是禁止开机自启,但仍然可以手动或被其他服务调用启动。
- mask 彻底屏蔽,即使你手动 systemctl start 也不会启动,会报错:
Failed to start systemd-networkd-wait-online.service: Unit is masked.应用场景:
可以用 mask 来屏蔽那些 你不需要且可能干扰系统 的服务,比如:
- systemd-networkd-wait-online.service 影响启动速度(如果你用 NetworkManager )
- systemd-resolved.service 冲突(如果你用 dnsmasq )
- 某些自动更新服务(如果不希望它们运行)
