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管理或手动备份,但在重装系统后若需恢复此目录,需谨慎,最好不要无脑覆盖。