Ubuntu: Softwares and Configurations
Ubuntu (Desktop) 新安装之后的一些初始化配置,作为个人备忘(省略了很多细节)。
安装 (Alongside with Windows)
现在的安装向导已经很完善了,在此不赘述。
过一遍系统设置
显示设置、时间同步、登录 Ubuntu Single Sign-On 等。
时间同步
Ubuntu 默认使用 ntp.ubuntu.com
服务器,不过我的机器所在的网络(我系实验室内网)屏蔽了对外的 NTP 协议,于是无法和默认 NTP Server 同步。但内网里面有个 NTP 服务器可以用。
可以修改 /etc/systemd/timesyncd.conf
文件 [Time]
一节的 NTP=
来指定一个能够访问的 NTP 服务器。
文档: https://ubuntu.com/server/docs/network-ntp
检查专有驱动
如果有 Nvidia 显卡,检查一下是不是用的最新专有驱动,显示为 (proprietary, tested)
。
(安装系统时即可以选择安装专有驱动。如果当时没选,现在也可以装)
更新系统
调整 APT 软件源(如需要)
不知为何,我虽然人在 HK,但所在的网络访问默认源 http://hk.archive.ubuntu.com
很慢。如有类似需要,可更换软件镜像源。
sudo apt update
sudo apt upgrade
JetBrains IDEs
目前我使用 snap 安装,如
snap install --classic clion
不知 JetBrains Toolbox 何时上架 snapcraft,如有,用 Toolbox 来管理 JetBrains 系 IDE 也不失为一种选择。
字体
我没有复杂的字体管理需求。偶尔有少量字体(例如配合 powerlevel10k 使用的 Nerd-Fonts)想要自行下载安装,可以用下列简易的方法(适合单用户):
mkdir ~/.fonts
将下载的字体都复制到上述文件夹中,然后刷新字体缓存
fc-cache -f -v
命令行工具
需要用到的小工具,如 vim
, tmux
, git
, zsh
, gpg
, scdaemon
, htop
, curl
等,如果没有,自行用 apt
安装,不再赘述。
命令行工具的配置文件用自己维护的 dotfiles
(托管于 GitHub),git clone
后运行里面的配置脚本即可。
SSH Server
如果没有安装 SSH Server (Ubuntu Desktop 很可能没装),先 apt install ssh
然后按自己需求修改下 /etc/ssh/sshd_config
配置文件。
用户目录下配置好 $HOME/.ssh/authorized_keys
以便远程登录。
Syncthing
添加 Syncthing 的 APT 源安装。文档:https://syncthing.net/downloads/
启动服务用 sudo systemctl start syncthing@<username>
以用户权限启动。
另外记得 enable
。然后去 localhost:8384
配置一下就好。
Docker
Follow 官方文档。
添加当前用户到 docker 用户组可以免去每次操作 Docker 时的 sudo
:
sudo usermod -aG docker <username>
NVIDIA-Docker
需要在 Docker containers 里面调用 NVIDIA GPU 的话,安装 NVIDIA-Docker2.
Follow this guide: NVIDIA Toolkit Install Guide - Docker
C++ 环境
构建系统我用 CMake 和 Ninja。编译器套件用 GCC 或 LLVM(Clang)。
如无特殊需求,用 apt 解决一切问题,采用默认版本(Ubuntu 20.04 默认的 GCC 是 9.x.x)。
sudo apt install build-essential cmake ninja-build
CMake 用默认版本就够了,也可以添加 Kitware 的源,装最新版。不过平时用 CLion 的时候我都是用 CLion bundled CMake。
目前 Ubuntu 20.04 LTS 官方源里的 LLVM 版本是 11,如果想装最新的可以用 LLVM 的源,或它的一键脚本:
sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"
但这一步并没有为 clang
创建快捷方式,即只有 /usr/bin/clang-12
而没有 /usr/bin/clang
。如要创建快捷方式甚至将 clang
设置为默认的 cc/c++
编译器,可以使用 update-alternatives
:
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-12 10 \
--slave /usr/bin/clangd clangd /usr/bin/clangd-12
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-12 10
# 设置 clang 为默认 cc/c++ compiler. 如果不需要,跳过这步,保留 GCC 为默认。
sudo update-alternatives --install /usr/bin/cc cc /usr/bin/clang 30 \
--slave /usr/share/man/man1/cc.1.gz cc.1.gz /usr/share/man/man1/clang-12.1.gz
sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++ 30 \
--slave /usr/share/man/man1/c++.1.gz c++.1.gz /usr/share/man/man1/clang-12.1.gz
Ref: update-alternatives-clang.sh
Visual Studio Code
官网下载 .deb
包,安装后自动添加 APT source list。
安装后登录 GitHub(或 Microsoft)账号,开启设置同步。
防火墙
可以 sudo apt install ufw
.
记得如果是通过 SSH 操作,一定要先 sudo ufw allow <ssh port>
然后再 sudo ufw enable
免得把自己挡在外面。
浏览器
我习惯使用 Firefox,直接登录 Firefox account 等待同步即可。插件基本都会自动安装,但安装后都需要自行重新配置。
Mailvelope 插件 + GnuPG Backend
要使用 Mailvelope 浏览器插件并使用 GnuPG 的 Keyring,可能要自行编译安装 gpgme-json。(Ubuntu 20.10 及以后版本的 APT 官方源中似乎已经添加了 gpgme-json
包,拭目以待。20.04 LTS 我们暂时还是采取编译安装的办法)。我安装到 /opt/gpgme
目录下,以避免与其他 APT 安装的软件混淆。
sudo mkdir /opt/gpgme
sudo chown -R <username>:<groupname> /opt/gpgme
# Install dependencies (if not installed yet)
sudo apt install autoconf automake libgpg-error-dev libassuan-dev
# Get the source code
git clone https://dev.gnupg.org/source/gpgme.git
cd gpgme
./autogen.sh
./configure --prefix=/opt/gpgme
make && make install
然后根据 Mailvelope 的 GitHub Wiki 创建一个 App Manifest File 即可使用。
中文输入法
(TODO. 我习惯使用 ibus-rime
)
LaTeX 环境
不需要追新的话,直接安装源里的 meta-package。最近几年 TeX Live 的发布节奏是在每年 4 月出新的 Release,与 Ubuntu 的 LTS 版本发布时间差不多,所以 Ubuntu LTS 版本通常打包的是上一年的 TeX Live 大版本。
sudo apt install texlive-full
反正如果及时跟进 Ubuntu LTS 的 dist upgrade 的话,我们安装的 TeX Live 也不会太旧。
然后需要配置一下 VS Code 和 PDF 阅读器之间的 Sync。
CUDA 相关
(待补充。这里如果使用 apt 安装 CUDA meta-package 可能导致前面提到的 Nvidia 显卡专有驱动被升级,不过没关系,最后能用就好)
Python
(待补充。可以直接用系统默认的 python3,如果有机器学习、数据处理等需要的话也可以选择 Anaconda 发行版。我个人习惯使用 pyenv。)
GDM Login Screen with Multiple Monitors
(待补充。)
系统目录结构
我们希望大致了解一个 Linux 发行版的 Directory Tree。 每个 Linux 发行版(乃至其他的类 Unix 系统)对于一些文件目录相关问题的处理方式可能有细微的差别,例如:
- 用户用系统默认包管理器安装的软件,应该放在
/usr/local/
下面还是放在/usr/
下面? - 如果一个软件不遵守 FHS,那么某 Linux 发行版为该软件打包时,文件的存放位置应该遵循软件原本的设定,还是改成遵循发行版的设定?
这里具体讨论 Ubuntu 的 Directory Tree。 Ubuntu 基本遵循 Filesystem Hierarchy Standard,官方描述文档: https://help.ubuntu.com/lts/installation-guide/armhf/apcs02.html
细节在此不赘述。一些值得留意的事项:
- 系统默认包管理器,即 dpkg/apt,安装的软件包,文件通常分布在
/usr/
下各个文件夹(除/usr/local
)中。 - 根目录下的
/{bin,sbin,lib,lib32,lib64,libx32}
实际上是一些软链接,它们的本体在/usr/
下。 - 对于新安装的 Ubuntu 系统,
/usr/local/
目录下只有预设的bin
,etc
,include
,lib
等目录结构,但没有任何文件。- 系统管理员手动(并非使用 APT 包管理器)下载的软件 binary 或编译安装的软件,推荐放在
/usr/local/
下。放在这里的软件,可供系统中的所有用户使用。例如,Docker-Compose 的官方文档就是建议将docker-compose
这个可执行文件直接下载到/usr/local/bin/
中。 - 在多用户环境中,如果一个没有 sudo 权限的用户想编译安装自己的软件包,我通常喜欢安装在
$HOME/.local/
下。
- 系统管理员手动(并非使用 APT 包管理器)下载的软件 binary 或编译安装的软件,推荐放在
- Snap 安装的软件包在
/snap
下,并不遵循bin
,lib
,include
,share
等 convention,而是 each one in its own subdirectory. 如/snap/clion
.
备份
$HOME
目录:可以直接全部备份,Ubuntu Desktop 有自带的备份 GUI。重装系统之后,也可以直接恢复。/usr/
目录:除/usr/local/
外,其余/usr/*
目录不建议手动干预。可以导出一份 APT 安装的软件列表,以后如果重装系统,可以用 APT 重新安装这些软件。/etc/
目录(大部分系统配置文件):可以用etckeeper
管理或手动备份,但在重装系统后若需恢复此目录,需谨慎,最好不要无脑覆盖。