本篇文章聊一聊如何在 Ubuntu 24.04 上搭建基础开发环境。

写在前面

两年前我写过一篇《在笔记本上搭建高性价比的 Linux 学习环境:基础篇》,随着时间推移,里面的一些内容需要更新了。

如果你对这些话题感兴趣:

  • 为什么要在裸机上运行 Linux
  • 用笔记本跑 Linux 比云服务器能省多少钱
  • 该选择哪个 Linux 发行版

可以去看看之前那篇文章,这里就不再重复了。

最近经常要配置系统环境,索性整理成这篇文章,也方便后面写相关内容时少点重复。

Ubuntu 24.04 系统安装指南

Ubuntu 24.04 的安装过程保持了一贯的简单直观。无论你是新手还是老用户,只需要三个步骤就能完成:下载系统镜像、制作启动盘、安装系统。

如果你已经在使用 Ubuntu 但还没升级到 24.04 版本,可以参考我之前写的《抢先体验 Ubuntu 22.04 Jammy Jellyfish》这篇文章来完成升级。升级完成后,你可以直接跳过下面文章安装相关的内容。

选择合适的系统镜像

你可以直接访问 Ubuntu 官方24.04 版本的发布网站获取需要的镜像:

如果你需要其他 CPU 架构(比如 ARM)的镜像,可以去 Ubuntu 官方的 CD 镜像站下载:

选择建议:对于服务器和虚拟机,我通常选择“服务器版”镜像。而对于笔记本这类需要显示器支持、外设管理、电源管理的设备,我会选择“桌面版”镜像。

制作系统安装引导盘的两种方法

在制作系统引导盘时,我一般会使用两款工具:Balena Etcher 或者 Ventoy。

如果你选择使用 Etcher,建议直接去 Etcher GitHub 的发布页面下载最新版本。使用起来也很简单,只需要打开软件,选择下载好的系统镜像文件,就能快速制作出一个引导安装盘。

使用软件制作启动盘

另一个选择是 Ventoy,这是一个更全能的维护工具。相比 Etcher 制作的一次性专用安装盘,Ventoy 的使用方式特别便捷:只要把系统镜像文件直接拷贝到 U 盘就能用来引导安装了。(使用可以参考之前的文章《开源的全能维护 U 盘工具:Ventoy》)

之所以跟大家介绍这两种方案,是因为在实际使用中,可能会碰到一些硬件设备不兼容 Ventoy。遇到这种情况时,用 Etcher 这种传统方式反而能够更稳定地完成系统安装。

系统安装步骤

Ubuntu 24.04 的安装过程和之前版本相比变化不大,基本上跟随安装向导一步步操作即可。

一路“下一步”,完成安装

不过这里有几点实用建议:

对于笔记本用户来说,建议在安装过程中先断开网络连接。这样可以加快整个安装流程,系统更新的事情可以等到进入系统后更换更快的软件源再进行。

另外需要注意的是,不要在安装时勾选“安装三方驱动”选项。因为安装程序的发布时间较早,如果你使用较新的硬件,这个选项可能会导致安装器崩溃。

Ubuntu 24.04 系统基础配置指南

接下来我们要对系统进行一些基础但重要的配置,在之前的文章基础上做进一步优化。

安装 OpenSSH Server

我习惯用一台主力设备来统一管理其他设备。正如我在《2024年终,个人设备盘点》中提到的,我现在使用的是 MacBook Air M3。为了方便在局域网中实现跨设备管理,我们需要在新安装的系统上配置 SSH 服务器。

安装完系统后,打开终端,首先更新软件包索引并安装 openssh-server

sudo apt update && sudo apt install -y openssh-server

这里我们先不执行 upgrade 命令。因为在更换软件源之前,升级所有软件包会耗费大量时间,我们把这步放到后面再做。

SSH 免密登录配置

当我们完成程序安装后,可以通过 ssh username@host-ip 命令来访问 Linux 设备。如果你的本地用户名和 Linux 设备上的登录用户名相同,那么可以直接省略 username。

第一次连接时,你会看到这样的提示:

# ssh 10.11.12.231

The authenticity of host '10.11.12.231 (10.11.12.231)' can't be established.
ED25519 key fingerprint is SHA256:xyz......
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.11.12.231' (ED25519) to the list of known hosts.

连接成功后,你会看到熟悉的 Ubuntu 系统欢迎界面:

# ssh 10.11.12.231                                          
Welcome to Ubuntu 24.04.1 LTS (GNU/Linux 6.8.0-41-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

Expanded Security Maintenance for Applications is not enabled.

251 updates can be applied immediately.
115 of these updates are standard security updates.
To see these additional updates run: apt list --upgradable

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status

soulteary@ThinkBook-14-G6-IRL:~$ 

但是每次输入密码确实挺烦的,我们来配置下免密登录(ssh-copy-id <你的密钥路径> <目标机器地址>),让工作更顺畅:

# ssh-copy-id -i ~/.ssh/your-key-path 10.11.12.231

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/soulteary/.ssh/your-key-path.pub"
The authenticity of host '10.11.12.231 (10.11.12.231)' can't be established.
ED25519 key fingerprint is SHA256:xyz......
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
soulteary@10.11.12.231's password: 

Number of key(s) added:        1

Now try logging into the machine, with:   "ssh '10.11.12.231'"
and check to make sure that only the key(s) you wanted were added.

现在再用 ssh 登录时,就不用输入密码了,轻松又安全。

执行特权命令时不用重复输入密码

在日常使用 Linux 系统时,不管是通过 SSH 远程登录设备,还是直接打开本地终端,当我们需要执行一些系统维护操作(比如更新软件包)时,都会遇到这样的情况:使用 sudo 命令后,系统会要求我们输入密码。

sudo apt update
[sudo] password for soulteary: 

虽然这个设计出发点是安全考虑,但在个人使用场景下,频繁输入密码确实会影响工作效率。其实我们可以通过一个更优雅的方式来解决这个问题:在 sudoers.d 目录下创建独立的用户权限规则文件,而不是直接修改系统的默认配置。

只需要执行下面这条命令:

echo "`whoami` ALL=(ALL) NOPASSWD:ALL" | sudo tee "/etc/sudoers.d/dont-prompt-$USER-for-sudo-password"

设置完成后,我们先按 CTRL+D 退出当前会话,然后重新使用 ssh <设备 IP> 登录系统。这时候再执行任何需要 sudo 权限的命令,就不会再提示输入密码了,整个操作流程会更加顺畅。

更换软件源并更新系统

在 Ubuntu 24.04 中,系统引入了全新的软件源配置格式。现在的源配置文件内容更加结构化且清晰,主要包含了软件类型 (Types)、源地址 (URIs)、版本代号 (Suites) 以及组件 (Components) 等信息。

# cat /etc/apt/sources.list.d/ubuntu.sources

Types: deb
URIs: http://archive.ubuntu.com/ubuntu/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

为了加快国内用户的下载速度,我们可以用一行命令将源切换到清华镜像:

sudo sed -i 's/\(archive\|security\).ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list.d/ubuntu.sources && sudo apt update && sudo apt upgrade -y

切换完源后,建议执行上文中一直没有执行过的系统更新 upgrade 命令了:

sudo apt update && sudo apt upgrade -y

因为更换了国内的软件源,所以安装过程中可以节约大量时间。

sudo reboot

由于首次更新会包含内核更新,我们需要执行重启操作,让内核和各种补丁生效。

安装基础的系统软件工具

在配置 Linux 开发环境时,有一些基础且实用的系统工具是必不可少的。下面我来分享下这些工具的安装方法,它们能让你的开发工作更加顺畅。

首先是一些基础开发工具包,包括 build-essential(编译工具)、git(版本控制)、curl 和 wget(文件下载)、net-tools(网络工具)等:

# 安装基础开发工具
sudo apt install -y build-essential git curl wget net-tools

其次是一些系统监控工具,它们能帮助你实时观察系统状态:

# 安装系统监控软件
sudo apt install -y neofetch glances htop iftop iotop bmon dstat

最后是文本处理和终端管理工具:

# 安装常用文本工具
sudo apt install -y vim jq
# 安装常用终端复用工具
sudo apt install -y tmux screen

当然,这只是一个基础配置建议,你完全可以根据自己的实际需求来增减工具。比如如果你更习惯使用 nano 编辑器,可以用 nano 替换 vim;如果你不需要终端复用,可以去掉 tmux 和 screen 的安装。

上面的每个工具都有其特定用途:

  • htopglances用于系统资源监控
  • iftopiotop 分别用于网络和磁盘 IO 监控
  • tmuxscreen 让你能更好地管理终端会话
  • jq 则是一个强大的 JSON 处理工具

选择合适的工具,能让你的开发工作事半功倍。

ZSH 的快速安装与简单配置

我日常中的 SHELL 环境是 ZSH,搭配经典的开源软件 OH-MY-ZSH,能够节约大量时间。网上已经有很多关于它们的详细介绍,这里我就直接分享一下最实用的安装和配置步骤。

在开始之前,首先需要安装 zshgit 我们前面已经装好了):

sudo apt install -y zsh

虽然 OH-MY-ZSH 官网提供了标准安装方式,但考虑到网络环境不稳定的问题,我们可以使用“清华镜像源”来加速安装:

git clone https://mirrors.tuna.tsinghua.edu.cn/git/ohmyzsh.git
REMOTE=https://mirrors.tuna.tsinghua.edu.cn/git/ohmyzsh.git sh ohmyzsh/tools/install.sh
rm -rf ohmyzsh

安装过程中会询问是否将 zsh 设置为默认 shell,大家可以根据个人需求选择。安装完成后,我们就可以开始打造自己的专属终端了。

这里我要分享一个非常实用的插件 zsh-autosuggestions。它不同于普通的自动补全,而是会根据你的历史命令智能提示,让终端操作更加顺滑:

git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

安装好插件后,需要修改配置文件来启用它:

sed -i 's/plugins=(git)/plugins=(git zsh-autosuggestions)/' ~/.zshrc

我在多个设备上都安装了OH-MY-ZSH,为了方便区分,我会给非主力设备换个主题:

sed -i 's/ZSH_THEME="robbyrussell"/ZSH_THEME="half-life"/' ~/.zshrc

Docker 基础环境配置

首先,让我们从 Docker 的基础安装开始。我写了一个完整的安装脚本,它会自动完成证书配置、软件源设置和Docker的安装。

sudo apt install -y ca-certificates curl gnupg lsb-release

curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

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

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/ \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

sudo gpasswd -a ${USER} docker

将上面的内容保存为 docker.sh,然后执行 bash docker.sh,等待安装完成后,我们可以通过运行 docker info 命令来验证安装是否成功。输出结果会显示 Docker 的详细信息,包括版本号、运行状态、系统配置等。

# docker info

Client: Docker Engine - Community
 Version:    27.5.0
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.19.3
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.32.4
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 27.5.0
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: systemd
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: inactive
 Runtimes: runc io.containerd.runc.v2
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: bcc810d6b9066471b0b6fa75f557a15a1cbf31bb
 runc version: v1.2.4-0-g6c52b3f
 init version: de40ad0
 Security Options:
  apparmor
  seccomp
   Profile: builtin
  cgroupns
 Kernel Version: 6.8.0-41-generic
 Operating System: Ubuntu 24.04.1 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 20
 Total Memory: 62.32GiB
 Name: ThinkBook-14-G6-IRL
 ID: b9a0619f-1a5d-4810-97e4-db3491519cea
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

有时候,我们需要在企业环境中统一管理 Docker 的网络访问,包括镜像获取、存储和访问认证。这时候就需要为 Docker 配置代理服务器。代理配置分为两个部分:Docker 服务守护进程 (dockerd) 代理配置、Docker 客户端代理配置。

先从 Docker 后端服务开始:

# 创建专门的配置目录
sudo mkdir -p /etc/systemd/system/docker.service.d

# 创建代理配置
sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf << EOF
[Service]
Environment="HTTP_PROXY=http://proxy-host:port"
Environment="HTTPS_PROXY=http://proxy-host:port"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"
EOF

# 重新加载配置并重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker

接着,配置 Docker 客户端的代理(影响 docker build 过程):

# 创建配置目录
mkdir -p ~/.docker

# 创建或编辑配置文件
tee ~/.docker/config.json << EOF
{
 "proxies": {
   "default": {
     "httpProxy": "http://proxy-host:port",
     "httpsProxy": "http://proxy-host:port",
     "noProxy": "localhost,127.0.0.1,docker-registry.example.com,.corp"
   }
 }
}
EOF

完成配置后,我们可以通过简单的命令来验证代理是否生效。

# 检查服务级别代理
sudo systemctl show --property=Environment docker

# 检查配置是否生效
docker run --rm alpine wget -qO- http://ipinfo.io

在实际配置时,请将 proxy-host:port 替换为实际的代理服务器地址和端口,如果你有不需要代理的地址,尤其是局域网内的私有仓库的地址,可以使用 NO_PROXY/noProxy 来指定不需要代理的地址。如果你的地址需要鉴权,可以使用下面的 URL 格式:http://user:password@proxy-host:port

如果你想继续折腾下 Docker 和 GPU 环境联动,可以参考下面两篇文章:《基于 Docker 的深度学习环境:入门篇》、《基于 Docker 的深度学习环境:Windows 篇》(基于 WSL2 Linux 环境)。

Python 基础环境配置

在我 2022 年的文章中曾介绍过 Conda 这个实用工具:“使用 Conda 简化 Python 程序环境准备工作”。趁着这篇文章,让我们一起来看看 2025 年最新的使用方法和一些实用技巧。

我们可以在 Conda 官网存档网站 找到各种 CPU 架构的安装包,相比较几年前的 500M 的安装包体积,现在已经膨胀到了 1GB 左右的尺寸:

我们以 Ubuntu(x86架构)为例,安装过程非常简单。首先下载安装包:

curl -LO https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh

如果你想要更快的下载速度,推荐使用Conda 的清华源。我测试时速度能达到 120MB/s,一个 1GB 出头的安装包仅需 8 秒就能下载完成。

# curl -LO -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"        https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2024.10-1-Linux-x86_64.sh

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1051M  100 1051M    0     0   118M      0  0:00:08  0:00:08 --:--:--  120M

下载完成后,还是只需要一个命令就能启动安装:

bash Anaconda3-2024.10-1-Linux-x86_64.sh

安装完成后,强烈建议配置国内镜像源来提升使用体验。使用 vim ~/.condarc编辑配置文件,添加清华源相关配置:

channels:
  - defaults
show_channel_urls: true
default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

配置完成后,按下 CTRL+D 退出登录,然后再次 ssh 到设备上(重新登录使配置生效)。接下来,我们可以通过以下命令来验证配置是否正常:

conda clean -i
conda create -n myenv numpy

如果下载速度飞快,那么说明配置正常。

最后

这篇文章就先写到这里,接下来的文章,来折腾一个有趣的硬件设备。

–EOF