Ubuntu 使用备忘录:好记性不如烂笔头

random-pic-api

简介

家中的服务器有 3 台全部安装的是 Ubuntu, 有时候需要折腾一下.

所以想用一个文档来记录 Ubuntu 上遇到过的问题, 另外就是做一个备忘录, 将已操作过的记录保存下来, 以便在其他服务器上重现, 避免重复查询资料.

优化建议

启用 Ubuntu Pro

Ubuntu Pro 是 Canonical 提供的企业级专业支持服务,个人用户和小团队可免费使用(最多 5 台设备,超过需付费)。它提供了长达 10 年的安全更新支持。

1 打开「软件和更新」,切换到「Ubuntu Pro」选项卡。

2 点击「启用 Ubuntu Pro」。

3 访问 Ubuntu Pro Dashboard 拿到分配给你的Token,填入「手动添加令牌」中,然后点击「确定」。

20250215174904_W7jq8Wuq.webp

20250215150635_1GJSbDWq.webp

参考

Landscape Server

参考:


系统克隆

原来的系统安装在一块 PCIe Gen3 x4 的 M.2 固态上, 查阅资料得知这个插槽支持 PCIe Gen4 x4, 为了不浪费资源, 所以需要使用一块 PCIe Gen4 x4 的 M.2 固态替换原来那块系统盘, 但是又不想重新安装系统, 所以想通过系统克隆的方式迁移.

使用 dd 命令

  1. 备份数据:在进行克隆操作之前,确保你已经备份了重要数据,以防万一。

  2. 关闭系统:关闭你的 Ubuntu 系统,并插入新的 1T M.2 固态硬盘。

  3. 进入 Live 环境:使用 Ubuntu 安装介质(如 USB 启动盘)启动到 Live 环境。

  4. 打开终端:在 Live 环境中打开终端。

  5. 查找硬盘标识:使用lsblkfdisk -l命令查找新旧硬盘的标识(例如/dev/nvme0n1/dev/nvme1n1)。

  6. 克隆硬盘:使用dd命令进行克隆。以下命令将旧硬盘克隆到新硬盘:

    1
    sudo dd if=/dev/nvme0n1 of=/dev/nvme1n1 bs=4M status=progress

    注意:此操作将克隆整个硬盘,包括空闲空间,因此需要时间较长。

  7. 调整分区大小:克隆完成后,使用gpartedfdisk调整新硬盘的分区大小以利用额外的空间。

  8. 更新引导器:如果需要,更新引导器配置,例如使用bootctl update

  9. 重启系统:重启系统,从新硬盘启动。

参考

使用群晖的 ABB

这个应该算是最简单的方法了, 正好我也有群晖, 所以直接使用这种方式恢复镜像即可.

参考


KVM

KVM 常用命令

1. 安装 KVM 和 libvirt

首先,确保已安装 KVM 和 libvirt,这通常是管理 KVM 虚拟机的基础:

1
2
3
4
5
6
# 安装 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 列出所有虚拟机

列出所有虚拟机,包括运行中的和已关闭的虚拟机:

1
sudo virsh list --all

2.2 启动虚拟机

启动指定的虚拟机:

1
sudo virsh start <vm_name>

例如:

1
sudo virsh start myvm

2.3 停止虚拟机

优雅地关闭虚拟机:

1
sudo virsh shutdown <vm_name>

如果虚拟机未响应,可以使用强制停止命令:

1
sudo virsh destroy <vm_name>

2.4 查看虚拟机的状态

查看虚拟机的详细状态:

1
sudo virsh dominfo <vm_name>

2.5 查看虚拟机的控制台

连接到虚拟机的控制台,适用于命令行界面虚拟机:

1
sudo virsh console <vm_name>

3. 虚拟机自启动

启用或禁用虚拟机的自启动(在系统重启时自动启动虚拟机):

3.1 启用自启动

1
sudo virsh autostart <vm_name>

3.2 禁用自启动

1
sudo virsh autostart --disable <vm_name>

3.3 查看自启动虚拟机列表

1
sudo virsh autostart --list

4. 创建、删除虚拟机

4.1 创建虚拟机

使用 XML 配置文件创建虚拟机:

1
sudo virsh create <xml_file>

例如:

1
sudo virsh create /path/to/your/vm_config.xml

4.2 删除虚拟机

删除虚拟机和关联的配置文件:

1
sudo virsh undefine <vm_name> --remove-all-storage

5. 虚拟机磁盘管理

5.1 查看虚拟机磁盘

查看虚拟机的磁盘配置:

1
sudo virsh vol-list --pool default

5.2 创建虚拟机磁盘

使用 qemu-img 创建一个虚拟硬盘镜像:

1
qemu-img create -f qcow2 /path/to/disk_image.qcow2 20G

5.3 增加虚拟机磁盘大小

增加虚拟机磁盘的大小(例如将磁盘大小增加 10GB):

1
qemu-img resize /path/to/disk_image.qcow2 +10G

6. 网络配置

6.1 查看网络桥接配置

列出所有虚拟网络:

1
sudo virsh net-list --all

6.2 启用虚拟网络

启用虚拟网络(例如默认的 default 网络):

1
sudo virsh net-start default

6.3 配置虚拟网络

使用 virsh 编辑虚拟网络的配置:

1
sudo virsh net-edit default

7. 备份和迁移虚拟机

7.1 虚拟机快照

创建虚拟机的快照:

1
sudo virsh snapshot-create-as <vm_name> <snapshot_name>

7.2 迁移虚拟机

迁移虚拟机到另一台主机(需要 libvirt 支持迁移):

1
sudo virsh migrate --live <vm_name> qemu+ssh://<user>@<remote_host>/system

8. 使用 virt-manager(图形界面)

8.1 安装 virt-manager

在 Ubuntu 上安装 virt-manager:

1
sudo apt install virt-manager

8.2 启动 virt-manager

运行 virt-manager 图形界面,管理虚拟机:

1
virt-manager

通过图形界面,你可以创建、启动、停止虚拟机,查看日志、资源使用情况等。

9. 监控虚拟机资源使用情况

9.1 查看虚拟机的 CPU、内存和磁盘使用情况

1
sudo virsh stats <vm_name>

9.2 查看虚拟机的实时性能数据

你可以使用 virt-top 命令来实时查看虚拟机的性能:

1
sudo virt-top

10. 安装虚拟机操作系统

通过 virt-install 安装一个新虚拟机操作系统:

1
2
3
4
5
6
7
8
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

Cockpit

https://cockpit-project.org/

1
2
3
4
# 主服务
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)

1
2
3
4
5
git clone git@github.com: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

1
2
3
4
5
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 的大小。

删除旧内核

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ 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 文件

1
2
3
4
5
6
sudo vim /etc/initramfs-tools/initramfs.conf

COMPRESS=xz

# 更新 initramfs
sudo update-initramfs -u

自动清理旧内核

1
2
sudo apt install byobu
sudo byobu-disable

boot 扩容

参考:


Speedtest

来源: https://u.sb/debian-speedtest/

安装 Speedtest CLI

Speedtest CLIOokla 官方推出的 Linux / BSD 下的 CLI 工具,方便我们在服务器里直接测试公网带宽速度。

首先,导入 GPG Key 并添加源:

1
2
3
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

1
2
apt update
apt install speedtest -y

使用 Speedtest CLI

安装完毕后我们即可使用默认的 speedtest 命令选择最近的节点并使用默认的网络测速,提示 Do you accept the license? [type YES to accept] 时,输入 YES 并回车即可:

20250216223018_cLmr6owe.webp

高级用法

输入 speedtest -h 即可查看 speedtest 的命令参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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

比较实用的有:

指定出口网卡:

1
speedtest -I 指定网卡名称

指定出口 IP:

1
speedtest -i IP 地址

注意指定网卡或 IP 后可能会出现 [error] Error: [0] Cannot open socket 的错误提示,忽略即可。

查看附近的测速节点列表:

1
speedtest -L

指定某个测速节点:

1
speedtest -s 测速节点 ID

systemd-networkd-wait-online.service

如果用 netplan 控制网络设备,同时把设备设置成固定 ip。如果对应的设备不存在,那么在系统启动后 systemd-networkd-wait-online.service 就会卡住几分钟,导致后续的服务无法执行。

这个问题有多种方式可以解决:

  1. 如何使用 NetworkManager 管理网络, 可以在 netplan 配置文件中添加 renderer: NetworkManager;

  2. 修改 systemd-networkd-wait-online.service 的超时时间:

    1
    2
    3
    [Service]
    ExecStart=
    ExecStart=/usr/lib/systemd/systemd-networkd-wait-online --timeout=5
  3. 使用 NetworkManager-wait-online.service 代替;

因为我已经使用 NetworkManager 来接管网络了, 所以完全可以禁用 systemd-networkd-wait-online.service, 而且 NetworkManager 也自带一个 NetworkManager-wait-online.service, 可以避免依赖网络的自启动服务在启动时出现问题:

1
2
3
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 也不会启动,会报错:
1
Failed to start systemd-networkd-wait-online.service: Unit is masked.

应用场景:

可以用 mask 来屏蔽那些 你不需要且可能干扰系统 的服务,比如:

  1. systemd-networkd-wait-online.service 影响启动速度(如果你用 NetworkManager )
  2. systemd-resolved.service 冲突(如果你用 dnsmasq )
  3. 某些自动更新服务(如果不希望它们运行)

参考: