Ubuntu 相关汇总

◇ 服务器相关

今天试用了阿里云 ECS,简单记录一下使用过程,供日后参考。

操作系统选择的是 Ubuntu 22.04 Uefi 版。

创建实例后,使用 Finalshell 进行连接。

Finalshell 官网地址:https://www.hostbuf.com/t/988.html

▷ 更新软件和数据

连接后,可以先更新一下数据,当前是 root 用户模式:

1
2
3
4
5
# 更新本地软件包仓库的元数据
apt update

# 更新所有软件包到最新版本
apt upgrade

更新过程中会出现:
kexec

这里选择了系统默认选项:No。

kexec 是一个工具,允许在不完全重启计算机的情况下加载新内核,可以提高系统升级的效率。

如果只是执行 apt upgrade 并且希望立即应用系统更新,而无需完全重启系统,可以选择 kexec。这样可以节省重启所需的时间,它仅加载新内核,而不重新引导整个系统。

如果更偏向传统的完全系统引导过程,或者担心 kexec 可能会引起系统稳定性问题,可以选择不执行 kexec,让系统通过完整的系统引导加载程序过程进行重启。这样,可以确保系统更新后的稳定性。

然后更新过程中又出现:
Daemons using outdated libraries

这里依旧采取了默认选项,直接回车。

“Daemons using outdated libraries" 表明某些系统服务 (daemons) 仍在使用旧版本的共享库 (libraries)。

需要重新启动这些服务以确保它们使用最新的库。

更新完成后继续输入命令:

1
2
3
4
5
6
7
8
9
# 进一步更新,处理依赖相关
apt dist-upgrade

# 删除不必要的软件和依赖
apt autoclean
apt autoremove

# 重启
reboot

▷ 创建并切换用户

一直使用 root 用户有风险也不推荐,所以需要创建一个新用户:

1
2
3
4
5
6
# 创建用户
adduser <user_name>
# 将用户加入到 sudo 用户组
usermod -aG sudo <user_name>
# 切换用户
su - <user_name>

如果是桌面端:
Ubuntu Desktop 的默认 root 密码是随机的,即每次开机都有一个新的 root 密码。
我们可以在终端输入命令 sudo passwd,然后输入当前用户的密码,enter,终端会提示我们输入新的密码并确认,此时的密码就是 root 新密码。
修改成功后,输入命令 su root,再输入新的密码即可切换 root 用户。

▷ 终端 SSH 连接

之后我们也可以直接在自己本地电脑的终端连接云服务器:

1
ssh <user_name>@<host>

⚠ 输入命令后会出现提示:

1
2
3
The authenticity of host 'x.xxx.xxx.xxx (x.xxx.xxx.xxx)' can't be established.
ECDSA key fingerprint is SHA256:UhRRjpRJtmYjTJRC53q4T5igf3kgkWGwu3yK8/wr+44.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

需要输入 yes 而不是直接回车,因为它默认并不是 yes。否则会连接失败,显示:

1
Host key verification failed.

▷ 修改 SSH 配置

打开配置文件:

1
sudo vim /etc/ssh/sshd_config

修改配置文件,记得防火墙放行相应端口:

1
2
3
4
# 修改默认端口号
Port xx
# 禁止 root 用户登录
PermitRootLogin no

重启 SSH 服务,使变更生效:

1
sudo service sshd restart

其他设备登录:

1
ssh <uesr_name>@<host> -p xx

▷ 取消密码登录权限

进一步安全设置,只使用公私钥登录。

本地生成密钥:

1
ssh-keygen -t rsa -b 4096 -C "vps"

服务器在家目录下,创建一个 .ssh 文件夹:

1
mkdir .ssh

上传公钥:

1
scp -P xx <path_of_id_rsa.pub> <username>@<host>:/home/<username>/.ssh/authorized_keys

服务器修改公钥权限:

1
chmod 600 ~/.ssh/authorized_keys

打开 SSH 配置文件:

1
sudo vim /etc/ssh/sshd_config

禁止密码登录:

1
PasswordAuthentication no

重启 SSH 服务,使变更生效:

1
sudo service sshd restart

▷ 修改主机名

主机名保存在 /etc/hostname,直接打开修改即可 (需要 root 权限)。

◇ Docker 相关

▷ 安装

之前已经在 Windows 中体验过了 (参见:链接)。使用 Docker 要比直接安装程序干净一些,管理起来也更方便。现在在 Ubuntu 里安装一下:

- 准备工作

在安装之前,需要先卸载冲突的软件包:

1
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

上面的命令使用了一个 for 循环来一一卸载这些软件包,如果它们存在的话。

下面介绍 Docker 的 2 种安装方法,官方建议使用第一种方法:

- 安装方法一:使用 APT 软件源安装

首次安装 Docker Engine 之前,需要设置 Docker 资源库。之后便可以从版本库中安装和更新 Docker。

* 添加 Docker 官方的 GPG 密钥

首先,安装必要工具:

1
2
3
4
5
# 更新系统的包信息列表
sudo apt-get update

# 安装必要的工具,包括证书管理工具、网络传输工具 curl,以及GPG (GNU Privacy Guard)
sudo apt-get install ca-certificates curl gnupg

然后,创建一个目录 /etc/apt/keyrings,并设置该目录的权限,以便后续步骤可以将 Docker 的 GPG 密钥存储在这个目录中,安全地验证 Docker 软件包的签名:

1
sudo install -m 0755 -d /etc/apt/keyrings

一些参数解释:

  • install: 用于安装文件或目录。本次它被用于创建目录。

  • -m 0755: 这是 install 命令的一个选项,用于设置创建的目录的权限。0755 是一个八进制权限掩码,它指定了目录的权限:

    • 第一个数字 0 表示没有任何特殊权限。
    • 第二个数字 7 表示所有者 (owner) 有读、写和执行权限 (4+2+1)。
    • 第三个数字 5 表示所属组 (group) 有读和执行权限 (4+0+1)。
    • 第四的数字 5 表示其他用户也有读和执行权限 (4+0+1)。

    这是一个典型的设置用于存储密钥文件的目录。

  • -d: 也是 install 命令的选项,表示要创建一个目录。

之后,从 Docker 官方网站下载 GPG 密钥,解码并转换为二进制格式,将其保存在 /etc/apt/keyrings/docker.gpg 文件中。这个密钥文件将用于后续的软件包验证,以确保下载的 Docker 软件包没有被篡改或损坏:

1
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

该命令分为 2 个部分:

  • | 前的部分表示使用 curl 工具来从指定的 URL 下载数据。curl 是一个命令行工具,用于在 Linux 系统上进行网络数据传输。

    • -f 表示如果 HTTP 请求失败 (返回码大于等于 400),就不显示 HTTP 错误页面,而是直接退出。
    • -s 表示在静默模式下执行,不显示进度信息。
    • -S 表示即使在静默模式下,仍然显示错误消息。这个选项通常与 -s 一起使用,以便在需要时显示错误信息。
    • -L 表示遵循任何重定向,以确保能够下载正确的数据。

    从上面的解释可以看出,这个命令表示:安静地 (不显示进度),但如果发生错误就显示错误信息,从给定的 URL 下载数据,如果遇到重定向就自动跟随重定向。

    如果 HTTP 请求失败,则不下载数据并立即退出。如果 URL 不存在或者其他任何原因导致 HTTP 请求失败,那么 curl 将退出,不会有任何数据传递给 shell,因此 shell 也不会执行任何操作。

    这就避免了执行可能下载一半的脚本。这对于从网络上下载并执行脚本的操作来说是非常重要的安全措施。

  • | 是管道操作符,用于将前一个命令的输出传递给后一个命令。

  • | 后的部分使用 sudo 权限来执行 gpg 命令。gpg 是 GNU Privacy Guard,用于处理加密和数字签名等操作。

    • --dearmor: 是 gpg 命令的选项,告诉 GPG 将 ASCII 封装的密钥转换为二进制格式。
    • -o 也是 gpg 命令的选项,它指定将解码后的 GPG 密钥保存到指定的文件路径 /etc/apt/keyrings/docker.gpg 中。

最后,将文件的权限更改为允许所有用户都能读取,确保后续操作可以访问该密钥文件,在软件包验证过程中使用它:

1
sudo chmod a+r /etc/apt/keyrings/docker.gpg

chmod: 用于修改文件或目录的权限。

a+r: 是 chmod 命令的参数,指定了要修改的权限。a 代表所有用户,+r 表示增加读权限。

* 将 Docker 的仓库信息添加到 APT 源

创建一个包含 Docker 官方 APT 源信息的文本字符串,并将它写入指定文件,以便系统后续可以从该源下载和安装 Docker 软件包,同时使用正确的签名密钥进行验证:

1
2
3
4
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

echo 用于创建一个文本字符串,并将它发送到标准输出。文本内容如下:

1
deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable

其中:

  • deb 是 APT 源的声明,表示它是一个二进制软件包源。

  • [···] 方括号中的内容是 APT 源的元数据信息,由 2 部分组成:

    • arch="$(dpkg --print-architecture)" 是一个内联命令,用于获取当前系统的架构 (amd64、i386 等)。

    • signed-by=/etc/apt/keyrings/docker.gpg 指定了使用前面创建的密钥文件中的 GPG 密钥进行签名验证。

  • https://download.docker.com/linux/ubuntu 是Docker 官方 APT 源的 URL。

  • "$(. /etc/os-release && echo "$VERSION_CODENAME")" 是一个内联命令,用于获取当前系统的 Ubuntu 版本代号:

    • . 是一个在 Shell 脚本中常见的操作符,用于在当前 Shell 环境中执行指定的脚本文件。

    • /etc/os-release 是一个文件,通常包含有关操作系统的信息,包括版本信息、发行名称等。

    • && 是逻辑 AND 操作符,它用于执行命令 1,如果命令 1 成功执行,即返回退出代码为 0,则继续执行命令 2。

    • echo "$VERSION_CODENAME" 是 Shell 中的 echo 命令,用于将环境变量 VERSION_CODENAME 的值输出到标准输出,里面通常包含了当前 Ubuntu 系统的版本代号,例如"Focal"或"Bionic"。

  • stable 指定 Docker 的发行版本为稳定版本。

| 为管道操作符,用于将前一个命令的输出传递给后一个命令。

tee 是一个命令,用于将标准输入的内容写入指定的文件,即 /etc/apt/sources.list.d/docker.list,它是一个 APT 源的配置文件。

> /dev/null: 表示将标准输出重定向到 /dev/null,这样就不会在终端上显示输出。

最后生成的 /etc/apt/sources.list.d/docker.list 文件内容如下:

1
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu   jammy stable

完成后需要更新一下,获取最新信息:

1
sudo apt-get update
* 安装 Docker 最新版
1
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

- 安装方法二:使用脚本安装

官方不建议在生产环境中使用便捷脚本,但它对创建符合需求的配置脚本很有用。

在本地运行从互联网下载的脚本之前,请务必对其进行检查。安装前,请先熟悉脚本的潜在风险和限制。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 下载脚本
curl -fsSL https://get.docker.com -o install-docker.sh

# 查看当前目录
ls
# 查看脚本内容
cat install-docker.sh

# 查看脚本的执行步骤而不实际执行
sudo sh install-docker.sh --dry-run

# root 模式执行脚本,进行安装
sudo sh install-docker.sh

如果使用便捷脚本安装了 Docker,应该直接使用软件包管理器升级 Docker。而不应该重新运行脚本。

如果试图重新安装主机上已经存在的软件源,重新运行脚本可能会导致问题。

▷ 测试

⚠ 一般情况下,Docker 守护进程会自动启动。

在基于 RPM 的发行版 (如 CentOS、Fedora、RHEL 或 SLES) 上,可能需要使用相应的 systemctlservice 命令手动启动它。

如果需要手动启用,可以执行以下命令:

1
sudo service docker start

本次安装过程中,无需手动启用。

(非 root 用户默认情况下无法运行 Docker 命令,推荐 添加用户至 Docker 用户组)

我们可以通过运行 hello-world 镜像来验证是否安装成功:

1
sudo docker run hello-world

此命令将下载测试镜像并在容器中运行。容器运行后,它会打印一条确认信息并退出。

▷ 添加用户至 Docker 用户组

在某些 Linux 发行版上,系统会在使用软件包管理器安装 Docker Engine 时自动创建该组。在这种情况下,无需手动创建该组。

本次安装过程中,无需手动创建。

1
2
3
4
5
# 手动创建Docker用户组
sudo groupadd docker

# 添加当前用户至 Docker 用户组
sudo usermod -aG docker $USER

退出并重新登录,以便重新评估当前用户的组员资格。

或者直接运行以下命令激活对组的更改:

1
newgrp docker

如果在将用户添加到 Docker 组之前,最初使用 sudo 运行 Docker CLI 命令,可能会出现以下错误:

1
2
WARNING: Error loading config file: /home/user/.docker/config.json -
stat /home/user/.docker/config.json: permission denied

这个错误说明 ~/.docker/ 目录的权限设置不正确,原因是之前使用了 sudo 命令。

要解决这个问题,要么删除 ~/.docker/ 目录 (它会自动重建,但任何自定义设置都会丢失),要么使用以下命令更改其所有权和权限:

1
2
sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
sudo chmod g+rwx "$HOME/.docker" -R

chown 用于设置文件或目录的所有者或权限。
"$USER":"$USER" 表示将文件的所有者和组都设置为当前用户。
-R 表示递归更改目录中的所有文件和子目录的所有者。
g+rwx 用来设置权限,g 为组权限,r 为读取权限,w 为写入权限,x 为执行权限。

本次安装过程中,没有遇到此问题。

▷ 注册和启动服务

许多现代 Linux 发行版都使用 systemd 来管理系统启动时启动哪些服务。在 Debian 和 Ubuntu 上,Docker 服务默认在启动时启动。

要在其它 Linux 发行版启动时自动启动 docker 和 containerd,可以运行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# systemd
# 开机自启
sudo systemctl enable docker.service
sudo systemctl enable containerd.service
# 禁用自启
sudo systemctl disable docker.service
sudo systemctl disable containerd.service
# 手动启用
sudo systemctl start docker
sudo systemctl start containerd
# 查询状态
systemctl status docker
systemctl status containerd

# Upstart
# 手动启用
sudo service docker start
sudo service docker containerd
# 查询状态
service docker status
service containerd status

本次安装过程中,无需手动设置。

▷ 其它配置

Linux 中 Docker 镜像、容器等文件的默认保存路径在 /var/lib/docker/ 中。一般来说无需更改。

▷ 更新方法

更新方法同 “方法一” 安装步骤,使用 APT 进行安装升级。

如果使用便捷脚本安装了 Docker,同样应该使用软件包管理器升级 Docker。重新运行便捷脚本没有任何好处。如果试图重新安装主机上已经存在的软件源,重新运行脚本可能会导致问题。

▷ 卸载方法

卸载 Docker Engine、CLI、containerd 和 Docker Compose 软件包:

1
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras

purge 表示卸载软件包并删除其配置文件。

但是主机上的镜像、容器、卷或自定义配置文件不会自动删除。

要删除所有镜像、容器和卷,可以执行以下操作:

1
2
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

同时需要手动删除任何已编辑的配置文件。

◇ 命令相关

▷ APT 包管理器相关

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
40
41
42
# 更新本地软件包仓库的元数据
apt update

# 列出当前系统所有可用的软件包
apt list
# 列出当前系统已安装的软件包
apt list --installed
# 列出当前系统可更新的软件包
apt list --upgradable

# 列出特定软件包的更新信息
# grep 命令用于过滤筛选指定字符
apt list --upgradable | grep <package_name>
# 查看特定软件包的信息
apt show <package_name>

# 更新所有软件包到最新版本
# 不引入新的依赖关系或删除旧的软件包
# 如果存在依赖性问题,需要下载或删除某些依赖,此软件包不会被升级,会被保留下来
apt upgrade
# 升级已安装的软件包
# 处理更复杂的依赖关系变化,通常在进行系统发行版升级时使用
apt dist-upgrade
# 更新所有软件包到最新版本并自动确认
apt upgrade -y

# 只更新特定软件包
apt install --only-upgrade <package_name>
# 更新特定软件包到特定版本
apt install <package_name>=<desired_version>

# 卸载一个已安装的软件包,但保留其配置文件
apt remove <package_name>
# 卸载并清除软件包的配置
apt purge <package_name>
# 删除为了满足某些依赖安装的,但现在不再需要的软件包
apt autoremove

# 删除 /var/cache/apt/archives 目录的软件包缓存 (除了锁文件)
apt clean
# 删除过时的软件包缓存
apt autoclean

▷ 系统版本相关

1
2
3
4
5
6
7
# 查看系统版本
lsb_release -a

# 检查是否有新的发行版可用,并询问是否要升级
do-release-upgrade
# 从一个长期支持(LTS)版本升级到另一个LTS版本
do-release-upgrade -d

▷ 其它

其它 Linux 通用命令参见:链接

◇ 参考内容

  1. Ubuntu 22.04 升级教程:从 Ubuntu 20.04 升级到 Ubuntu 22.04 方法. https://www.bandwagonhost.net/12638.html
  2. 【新手指南】阿里云轻量应用云服务器从购买到使用 |开源周末 Open Source Weekend. https://youtu.be/W5ljAuqxTP8
  3. Install Docker Engine on Ubuntu. https://docs.docker.com/engine/install/ubuntu/
  4. Linux post-installation steps for Docker Engine. https://docs.docker.com/engine/install/linux-postinstall/
  5. SSH connection problem with “Host key verification failed…” error. https://askubuntu.com/questions/45679/ssh-connection-problem-with-host-key-verification-failed-error
  6. 如何清除 APT 缓存来回收宝贵的磁盘空间. https://linux.cn/article-12787-1.html
  7. 举例子说明ubuntu中remove,autoremove,purge区别. https://www.cnblogs.com/gdut-gordon/p/12054960.html
  8. ubuntu默认root密码. https://developer.aliyun.com/article/518069
  9. 保护好你的小鸡!保姆级服务器安全教程!. https://blog.laoda.de/archives/how-to-secure-a-linux-server/