唠唠闲话

入坑 Linux 后,陆续接触了很多设备:双系统的笔记本,腾讯云,天翼云,华为云,Azure 云国内+国外,阿里云,实验室服务器,宿舍台式机。。。。每次接手新设备都要进行一番魔改,本篇是为了新设备上进行配置而整理的教程。

工作区习惯:~/workspace 存放项目,~/download 存放下载文件,~/software 存放额外安装的软件,比如 Julia 之类。

1
2
cd ~
mkdir -p download software workspace

用户及用户组

创建新用户

1
sudo adduser $USER

配置权限

1
sudo usermod -aG sudo $USER

添加管理员权限并配置免密 sudo visudo

1
<用户名>  ALL=(ALL:ALL) NOPASSWD:ALL

设置服务器名称,比如 aliyun

1
sudo hostnamectl set-hostname aliyun

通常需确保 /etc/hosts 存在相应记录,比如

1
127.0.0.1  aliyun

文件管理器设置

本节针对桌面系统的 ubuntu,因为个人装了中文版,文件管理器的快捷目录为中文路径,改用英文比较方便。

1
2
cd ~/.config
vi user-dirs.dirs

修改如下:

1
2
3
4
5
6
7
8
XDG_DESKTOP_DIR="$HOME/desktop"
XDG_DOWNLOAD_DIR="$HOME/download"
XDG_TEMPLATES_DIR="$HOME/template"
XDG_PUBLICSHARE_DIR="$HOME/public"
XDG_DOCUMENTS_DIR="$HOME/document"
XDG_MUSIC_DIR="$HOME/music"
XDG_PICTURES_DIR="$HOME/picture"
XDG_VIDEOS_DIR="$HOME/video"

基础软件及配置

快捷安装

通过命令行安装的基础应用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 更新软件包源列表
sudo apt update
# 基础工具
sudo apt install vim git nginx curl tmux tree -y
# 编译相关
sudo apt install make gcc flex bison -y
# Json 解析工具
sudo apt install jq -y
# Apache HTTP 工具 | 比如 htpasswd 命令
sudo apt install apache2-utils -y
# net-tools 工具包,比如 ifconfig 等命令
sudo apt install net-tools -y
# 安装 gdebi
sudo apt install gdebi -y
# Java 运行环境
sudo apt install openjdk-11-jdk -y

注:用 sudo dpkg -i xxx.deb 也能安装 .deb 文件,区别在 gdebi 会自动处理依赖问题,而前者需要手动处理。

安装 oh-my-zsh,使用脚本一键安装

1
curl -sSL https://qiniu.wzhecnu.cn/scripts/oh-my-zsh-p10k.sh | bash

如果有访问校园网的需求,可以装个 openconnect

1
sudo apt install openconnect -y

注:一般不建议在公网服务器上连接校园网,因为走 VPN 的网络较慢。如果要传输文件,可以反过来,从校园网连公网进行传输。

Nginx 重装

一些特殊情况,比如 nginx 配置文件损坏,或装了多个 Nginx 冲突等,可以通过以下命令清理 Nginx 并重装

1
2
3
4
sudo apt-get remove nginx nginx-common -y
sudo apt-get purge nginx nginx-common -y
sudo apt-get autoremove -y
sudo apt-get install nginx -y

更新 apt 镜像

更改 sudo 默认镜像(可选):

1
2
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
sudo vim /etc/apt/sources.list

以 Ubuntu20 清华镜像为例,将原文件内容替换为以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse

注:Ubuntu 每个版本都有一个动物名,20 对应的是镜像源的 focal,全称 Focal Fossa,马达加斯加的一种猫科动物。

可选的镜像站:

如果提示无法连接上 dl.google.com:80,将 sources.list.d 中的 google-chrome.list 移除即可:

1
sudo mv /etc/apt/sources.list.d/google-chrome.list /etc/apt/google-chrome.list.bak

这个列表允许用户添加第三方软件源,比如 Google Chrome。

网速监控及测试

安装网络相关工具

1
2
3
4
5
6
# 网络监控
sudo apt install nethogs -y
# 网络测速
sudo apt install speedtest-cli -y
# 测试两个节点之间的网络传递速度
sudo apt-get install iperf -y

sudo nethogs 查看当前网络流量, sudo nethogs -d 5 每 5 秒刷新一次。

1
2
3
4
5
PID USER     PROGRAM                    DEV        SENT      RECEIVED
? root ...10.18.5:6379-10.10.18. 0.000 0.485 KB/sec
? root ...10.18.7:56514-10.10.18 0.000 0.336 KB/sec
? root ...10.18.7:56456-10.10.18 0.000 0.054 KB/sec
? root ...10.18.7:56480-10.10.18 0.000 0.027 KB/sec

speedtest-cli 测试网络带宽:

1
2
3
4
5
6
7
8
9
10
❯ speedtest-cli
Retrieving speedtest.net configuration...
Testing from China Education and Research Network Center (49.52.5.48)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by China Unicom 5G (Shanghai) [19.52 km]: 46.222 ms
Testing download speed................................................................................
Download: 92.46 Mbit/s
Testing upload speed......................................................................................................
Upload: 100.13 Mbit/s

iperf3 测试两个节点之间的网络传递速度:

1
2
3
4
5
6
7
8
9
10
11
# 服务器 1
iperf -s
# 服务器 2
❯ iperf -c 服务器1的IP
------------------------------------------------------------
Client connecting to 172.23.148.37, TCP port 5001
TCP window size: 289 KByte (default)
------------------------------------------------------------
[ 3] local 172.23.148.38 port 58616 connected with 172.23.148.37 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 96.0 MBytes 80.5 Mbits/sec

命令行录屏

TODO.

asciinema + svg-term-cli

1
sudo apt install asciinema -y

默认运行 $SHELL 进行录制,可通过 chsh -s $(which zsh) 修改默认 shell 为 zsh。

配置 ssh

通常,公网服务器自带 openssh,但如果是台式机一类的设备,需要手动安装后才能用 ssh 远程连接

1
sudo apt install openssh-server -y

配置密钥

在本地生成密钥对,然后将公钥上传到服务器,这样就可以通过密钥登录服务器,而不需要输入密码。

1
ssh-keygen -t rsa -b 4096 -C "youremail@example.com" -f ~/.ssh/my_server

这里几个参数都是可选的,做个简单说明:

  • -t 指定密钥类型,比如 rsadsaecdsaed25519,默认为 rsa
  • -b 指定密钥长度,默认为 2048
  • -C 添加注释信息,比如邮箱,方便区分密钥,邮箱通常会被追加在公钥文件 .pub 的末尾
  • -f 指定密钥文件名,比如 my_server,默认为 id_rsa

如果有多个服务器,建议使用不同密钥,并用 -f 指定文件名来区分。当然多个服务器可以用同一个密钥,出于安全考虑不推荐。另一方面,对于 GitHub/GitLab/Gitee 等公开服务,公钥会用于标识账号,这种情况则不允许使用同一个密钥。

生成密钥后,会在 ~/.ssh 目录下生成两个文件,一个是私钥 my_server,一个是公钥 my_server.pub,将公钥上传到服务器,比如

1
ssh-copy-id -i ~/.ssh/my_server.pub user@aliyun

当然,个人更习惯的方式是手动复制 my_server.pub 文件内容,然后登录服务器,粘贴到 ~/.ssh/authorized_keys 文件中。

完成后,在本地修改 ~/.ssh/config 文件,比如添加如下内容

1
2
3
4
5
Host aliyun
HostName <服务器 IP>
User <用户名>
IdentityFile ~/.ssh/my_server
IdentitiesOnly yes

这样就可以通过 ssh aliyun 登录服务器了。

p.s. 如果遇到错误,可以执行 ssh -v aliyun 查看日志信息。

安全配置

允许远程登录后,服务器存在被攻击的风险。如果启用密码登录,应避免使用弱口令,比如 1234,qwert 等;以及避免创建常见名称的用户,比如 test,tmp 等,之前实验室就曾发现被人挖矿,排查发现是创建了一个名为 tmp 的用户,且设置了弱口令。

为了提高安全性,可以更改默认端口号,禁止 root 用户登录等。

sudo vim /etc/ssh/sshd_config 编辑配置文件:

1
2
3
4
5
6
# 端口号
Port 22
# 禁止 root 用户登录
PermitRootLogin no
# 禁止密码登录
PasswordAuthentication no

我通常在配置免密后就禁用了密码登录,但如果用户较多的情况,出于方便考虑第三个选项可以不弄。更多安全策略参考之前的这篇:「服务器使用教程(五) | DevOps」。

分区与挂载

!!! 注意,分区和挂载是非常敏感的操作,所有命令在执行前必须确保自己有足够的了解,重要数据需做好备份。

输入 lsblk (list block devices)查看当前磁盘分区情况,比如

1
2
3
4
5
6
7
❯ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 378K 0 rom
vda 252:0 0 40G 0 disk
├─vda1 252:1 0 1M 0 part
└─vda2 252:2 0 40G 0 part /
vdb 252:16 0 260G 0 disk

上边结果显示,系统中有两个磁盘设备:vdavdb

  • vda: 40GB 的磁盘,并且它已经被分为两个分区:
    • vda1: 1MB 大小的分区,可能是某种特殊用途的保留分区,例如EFI系统分区(但通常这类分区会更大)或者boot loader相关的分区
    • vda2: 40GB 大小的分区,它已经被挂载在根目录(/)上
  • vdb: 260GB 的磁盘
  • sr0: 光驱设备,大小 378KB,通常对应实体的 CD/DVD 驱动器

vdb 分为两个分区,其中一个挂载到 /storage 用于存放文件,以下是具体步骤:

  1. 启动分区程序
    进入 fdisk 工具进行分区:sudo fdisk /dev/vdb

  2. 创建新分区

    • fdisk 提示符下,按 n 创建新分区
    • 选择分区类型:默认情况下是主分区(primary),默认即可
    • 指定分区号:默认情况下是 1,保持默认
    • 设置起始扇区:可以接受默认值,通常从 2048 开始
    • 设置结束扇区或分区大小:对于一个 130G 大小的分区,可以指定 +130G
  3. 再次创建新分区

    • 再次按 n 创建第二个新分区
    • 类似进行操作
  4. 写入分区表

    • 确认分区没有问题后,按 w 保存更改并退出 fdisk
  5. 格式化新分区
    这里创建了两个分区 /dev/vdb1/dev/vdb2,对其进行格式化:

    1
    2
    sudo mkfs.ext4 /dev/vdb1
    sudo mkfs.ext4 /dev/vdb2

输入 lsblk -f,可以看到 vdb 分了两个分区,并且已经格式化了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
❯ lsblk -f
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sr0 iso966 config-2
2023-11-04-20-03-32-00
vda
├─vda1

└─vda2
ext4 2a95978d-b614-45a5-9246-8a4b11300562 21.8G 39% /
vdb
├─vdb1
│ ext4 ea99600a-cb73-4977-9bc6-61cd7b5062c9
└─vdb2
ext4 cac15e64-e02b-44a4-b0f8-10a8bcfb8cb3

现在,挂载硬盘:

1
2
3
4
# 创建挂载点
sudo mkdir /storage
# 挂载分区
sudo mount /dev/vdb1 /storage

mount 命令只是临时挂载分区,在系统重启后这个挂载就不会被保留。每次系统启动时,它都会读取 /etc/fstab 文件来决定挂载信息。如果需要永久挂载,可以编辑 /etc/fstab 文件,添加以下行:

1
/dev/vdb1    /storage    ext4    defaults    0    2

保存文件后,执行 sudo mount -a 测试是否有错误,该命令用于挂载 /etc/fstab 文件中所有未挂载的文件系统。

完成后,执行 df -h 查看当前的挂载情况

1
2
3
4
5
6
7
8
9
10
11
df -h
Filesystem Size Used Avail Use% Mounted on
udev 7.6G 0 7.6G 0% /dev
tmpfs 1.6G 1.6M 1.6G 1% /run
/dev/vda2 40G 16G 22G 42% /
tmpfs 7.6G 0 7.6G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 7.6G 0 7.6G 0% /sys/fs/cgroup
tmpfs 1.6G 0 1.6G 0% /run/user/0
tmpfs 1.6G 0 1.6G 0% /run/user/1000
/dev/vdb1 127G 28K 121G 1% /storage

桌面端软件

以下内容适用于 Ubuntu20.04 的桌面系统,其他版本应该也适用,但可能会有些许差异。大部分软件都是通过 .deb 文件安装,比如 vscode,chrome 等。

安装 vscode

1
2
curl -o code.deb -L http://go.microsoft.com/fwlink/?LinkID=760868
sudo gdebi code.deb

安装 Chrome 浏览器

1
2
wget -c https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo gdebi google-chrome-stable_current_amd64.deb

安装 Linux QQ

1
2
wget -c https://dldir1.qq.com/qqfile/qq/QQNT/852276c1/linuxqq_3.2.5-21453_amd64.deb
sudo gdebi linuxqq_3.2.5-21453_amd64.deb

安装 Linux WPS

1
2
wget -c https://wps-linux-personal.wpscdn.cn/wps/download/ep/Linux2019/11711/wps-office_11.1.0.11711_amd64.deb
sudo gdebi wps-office_11.1.0.11711_amd64.deb

安装截图工具 deepin-screenshot 与 QQ 截图非常类似的工具(在 ubuntu22 中该工具改名了,且界面有点丑)

1
sudo apt-get install deepin-screenshot -y

设置快捷键
screenshot

截图页底部工具栏允许一些简单的设置,建议修改保存路径,以及使用“自动保存并复制到剪贴板”的模式。

文本复制工具:

1
sudo apt install xclip -y

然后编辑 .bash_aliases

1
alias copy="xclip -selection clipboard"

需要复制文件内容时,可以用 cat filename | copy 命令,然后粘贴即可。

安装百度网盘,进入官网,下载 deb 文件并安装
package

安装 Zoom:在 官网下载 deb 文件并安装
package

安装飞书:官网链接

OBS 录屏软件

OBS 是开源的录屏软件和直播软件,功能强大,安装教程参考官网

  1. 安装依赖 ffmpeg

    1
    sudo apt install ffmpeg -y
  2. 可选内容,如果需要录屏 + 录像功能

    1
    sudo apt install v4l2loopback-dkms -y

    按提示设置重启密码
    深度截图_google-chrome_20220123165057

  3. 依次输入以下命令,安装 obs 软件

    1
    2
    3
    sudo add-apt-repository ppa:obsproject/obs-studio
    sudo apt update
    sudo apt install obs-studio -y
  4. 可能存在的问题,文件下载失败(可能和网络有关)
    深度截图_选择区域_20220123171637
    可行方案为手动安装 libfite,将下载地址的域名 cn.archive. 改为 archive.

    1
    2
    wget -c http://archive.ubuntu.com/ubuntu/pool/universe/f/flite/libflite1_2.1-release-3_amd64.deb
    sudo gdebi libflite1_2.1-release-3_amd64.deb
  5. 安装完成后,在软件页面打开 obs
    深度截图_选择区域_20220123171955

基本使用

  1. 点击设置 -> 输出,修改解码方式以及输出文件
    深度截图_gnome-terminal-server_20220123172856

  2. 点击 “+” 新建采集窗口,选择软件,点击开始录制
    20220123172635

  3. 录制结束后,点击停止
    20220123172822

GIF 动图录制

参考链接: Ubuntu 录制 gif 动态图

  1. 下载工具 byzanz

    1
    sudo apt-get install byzanz
  2. 命令行输入 byzanz-record --help 查看帮助选项
    20220128161139

  3. 常用选项:

    • -d 设置录制时间
    • --delay=<秒数> 设置录制开始延时
    • -x, -y 设置录制矩形区域左上位置的 x 坐标, y 坐标,默认为 0, 0
    • -w, -h 设置录制矩形的宽度,高度
  4. 示例

    1
    byzanz-record -x 0 -y 0 -w 10 -h 20 -d 5 --delay=2 ~/test.gif

    参数说明:

    • 录制区域左上角起
    • 区域为宽 10 高 20 的矩形
    • 动画时间设置 5 秒,延迟 2 秒录制
    • 文件保存在 ~/test.gif
  5. 录制区域的确定

    • 方法 1:用 pyautogui.position() 获取
    • 方法 2:终端输入 xwininfo,提示选择区域,鼠标操作后会返回区域的详细信息,比如
      深度截图_code_20220128163626

GIF 压缩工具

  1. 用 byzanz 录制的 gif 文件可能比较大,可配合 gifsicle 压缩文件,GitHub 下载地址

    1
    wget -c https://github.com/kornelski/giflossy/archive/refs/tags/1.91.tar.gz

    注:直接用 apt-install gifsicle 下载的版本还不支持 loosy 参数,因而建议源码安装

  2. 下载后解压文件,依次执行下边命令

    1
    2
    3
    4
    tar -zxvf giflossy-1.91.tar.gz # 解压文件
    bash bootstrap.sh # 生成 configure 文件
    ./configure # 生成 make install 文件
    sudo make install # 源码安装-可能需要权限
  3. gifsicle 的使用语法如下,其中 --lossy 参数值越高,文件压缩后越小

    1
    gifsicle -O3 --lossy=80 -o lossy-compressed.gif input.gif

当然,也有些在线的压缩网站,比如 docsmall 或者 压缩图

设置桌面应用图标

参考链接:http://www.slfish.com/363.html

举个例子,创建文件 usr/share/applications/clash.desktop

1
2
3
4
5
6
7
8
[Desktop Entry]
Encoding=UTF-8
Name=clash
Exec=/home/username/software/clash/cfw
Terminal=false
Type=Application
Categories=Application;Network;
StartupNotify=true

创建后,可以在主菜单中找到 clash。

TODO:补充常见参数及释义。

搜狗输入法

TODO

https://shurufa.sogou.com/linux/guide

PATH 环境变量

关联知识

我们在终端输入命令时,通常不需要输入完整路径,比如运行 Python 输入 python 而不是 /usr/bin/python。通过执行 which 可以查看实际执行文件的路径,比如不同 conda 环境输入 python 运行的程序不同,因此执行 which python 返回的路径也不同。

一些基础命令,比如 pwd, echo, source, which,用 which 查询会提示你是内置命令(built-in command)。而其他大多数命令,比如 git, vim, nginx 等等,都是省略文件路径的命令。更具体地,执行 git 时,系统会在 PATH 给的路径中依次查找,如果存在该可执行文件则运行。因此,如果要省略绝对路径来执行某个文件,可以将该路径添加到 PATH 中。

一般地,用户启动 bash 时,会经过这几个文件:/etc/environment => /etc/profile => ~/.bashrc,一些情况(比如用 ssh 连接服务器)还会经过 ~/.bash_pofile。前两个是系统级别的文件,对所有用户生效,而 .bash_profile/.bashrc 只对用户生效。(zsh 类似,.bashrc 改成 .zshrc 即可)

简单说,我们可以通过修改 PATH 环境变量使可执行文件不需要输入路径就能执行,用户级别的修改可以在 ~/.bashrc 中进行,系统级别的修改可以在 /etc/environment/etc/profile 中进行。

修改 PATH

习惯上,可以将 $HOME/.local/bin 添加到环境变量 PATH 中,然后可执行文件存放或者链接到该目录:

1
2
# 创建目录
mkdir -p $HOME/.local $HOME/.local/bin

然后在 .bashrc/.zshrc 中添加如下内容,其中冒号用于分隔路径

1
export PATH=$HOME/.local/bin:$PATH

安装 Conda 环境

推荐安装 miniconda,其比 Anaconda 更轻量级,只包含了 Python 和 Conda ,而没有预装多余的库。

1
2
wget -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh

如果存在多个用户,可将 conda 安装在系统目录下,比如 /opt/conda,这样所有用户都可以使用而不必单独配置。这一情况下,用户数据通常保存在 $HOME/.local$HOME/.conda 下。

为 Conda 和 Pip 修改镜像源

1
2
3
4
5
6
7
# Conda 换源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes
# pip 换源
pip install pip -U # 更新
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

pip 可以通过 -i 指定镜像源,在 .bashrc/.zshrc 中添加别名

1
2
alias tspip="pip install -i https://pypi.tuna.tsinghua.edu.cn/simple"
alias pypi='pip install -i https://pypi.python.org/simple'

安装 askchat

askchat 是一个在终端调用 ChatGPT 的工具,命令行爱好者狂喜。使用 pip 安装并创建软链接,方便不同环境调用

1
2
3
4
pip install askchat --upgrade
ln `which ask` $HOME/.local/bin/ask
ln `which askchat` $HOME/.local/bin/askchat
ln `which chatenv` $HOME/.local/bin/chatenv

设置环境变量

1
2
3
4
export OPENAI_API_KEY=
export OPENAI_API_BASE=
export OPENAI_API_BASE_URL=
export OPENAI_API_MODEL

askchat 支持使用配置文件,通过执行

1
2
# 创建初始配置,默认使用系统环境变量
askchat --generate-config

~/.askchat/.env 下创建配置信息,可手动修改该文件。

更多用法参考官方文档

安装 thefuck

thefuck 也是一个命令行工具,但命令输入错误时,输入 fuck 它便会提供正确命令,如果配合 oh-my-zsh 插件使用,双击 Esc 键可在当前位置生成正确命令

安装方式:

1
pip3 install thefuck

安装后需要在 .zshrc/.bashrc 中追加 eval "$(thefuck --alias)"

安装 Jupyter

推荐使用 Jupyterlab,通过 pip 或 conda 安装,建议在 base 环境下执行

1
conda install jupyter

设置访问密钥并初始化配置文件

1
2
jupyter-lab password
jupyter-lab --generate-config

修改配置文件 ~/.jupyter/jupyter_lab_config.py

1
2
3
4
5
6
# 设置允许访问的 IP 地址
c.ServerApp.ip = '0.0.0.0' # 或者 '*'
# 设置默认打开位置
c.ServerApp.root_dir = '/home/username/workspace'
# 自定义访问端口
c.ServerApp.port = 6000

如果要将 conda 其他环境下的 Python 添加到 Jupyter,不需要重新安装一次 jupyter,切换到该环境安装 ipykernel 就够了:

1
2
3
conda activate <该环境>
conda install ipykernel
python -m ipykernel install --user --name=<kernal 名称>

jupyter 是一个 web 服务,如果需要,可以用 nginx 配置访问域名,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 80; # default_server;
# you don't have to change these
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
# here, set your domain name if existing
server_name jupyter.yourmail.com;
# The following lines configure the proxy server
location / {
proxy_pass http://127.0.0.1:8888/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_read_timeout 86400;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

配置 CUDA 环境

知乎有很多教程,比如:

这里使用后者。

确认显卡信息

查看电脑上的显卡信息,lspci | grep VGA,比如:

1
2
❯ lspci | grep -i vga
01:00.0 VGA compatible controller: NVIDIA Corporation Device 2204 (rev a1)

只显示了设备号 2204 ,可通过PCI ID 数据库查询实际驱动,或者更新 PCI ID 数据库后再查询:

1
2
3
4
5
6
7
❯ sudo update-pciids
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 304k 100 304k 0 0 144k 0 0:00:02 0:00:02 --:--:-- 144k
Done.
❯ lspci | grep -i vga
01:00.0 VGA compatible controller: NVIDIA Corporation GA102 [GeForce RTX 3090] (rev a1)

下载和安装驱动

查看可安装的显卡驱动型号,后缀 recommend 是系统推荐安装的版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
zhihong@bleu:~$ sudo ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:01.1/0000:01:00.0 ==
modalias : pci:v000010DEd00002204sv00001462sd00003881bc03sc00i00
vendor : NVIDIA Corporation
model : GA102 [GeForce RTX 3090]
driver : nvidia-driver-550-server - distro non-free
driver : nvidia-driver-545-open - distro non-free
driver : nvidia-driver-535-open - distro non-free
driver : nvidia-driver-535-server-open - distro non-free
driver : nvidia-driver-535 - distro non-free recommended
driver : nvidia-driver-470 - distro non-free
driver : nvidia-driver-550-server-open - distro non-free
driver : nvidia-driver-535-server - distro non-free
driver : nvidia-driver-470-server - distro non-free
driver : nvidia-driver-545 - distro non-free
driver : xserver-xorg-video-nouveau - distro free builtin

安装 nvidia-smi 及驱动:

1
sudo ubuntu-drivers autoinstall

也可以选择在官网下载和安装驱动。

安装 CUDA

访问 CUDA 官网,根据系统进行选择:

20240407181044

这里通过网络安装最新版本 12.04

1
2
3
4
5
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
# sudo apt-get install gdebi -y # 也可以用 dpkg
sudo gdebi cuda-keyring_1.1-1_all.deb
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-4

完成后,在 .bashrc/.zshrc 中添加环境变量:

1
2
3
export CUDA_HOME=/usr/local/cuda
export PATH=${CUDA_HOME}/bin:${PATH}
export LD_LIBRARY_PATH=${CUDA_HOME}/lib64:$LD_LIBRARY_PATH

source 更新环境变量,然后执行 nvcc --version 查看版本信息。

可以下载多个版本的 CUDA,通过修改环境变量来切换版本,比如:

1
2
export PATH=/usr/local/cuda-11.4/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.4/lib64:$LD_LIBRARY_PATH

此外,可以修改 /etc/profile 文件,使其对所有用户生效:

1
2
3
export CUDA_HOME=/usr/local/cuda
export PATH=${CUDA_HOME}/bin:${PATH}
export LD_LIBRARY_PATH=${CUDA_HOME}/lib64:$LD_LIBRARY_PATH

安装 cuDNN

cuDNN(CUDA Deep Neural Network library)是一个 GPU 加速的库,用于深度学习神经网络。它由 NVIDIA 提供,旨在提高深度学习框架在 NVIDIA GPU 上的运行效率和速度。cuDNN 提供了高度优化的实现,支持常见的深度学习操作,比如卷积、池化、归一化以及激活函数等。cuDNN 能够自动处理许多底层的优化,因此开发者可以专注于设计和实现模型的高层逻辑,而无需深入了解 GPU 编程的细节。

同 CUDA 安装,访问官网,根据系统选择:

20240407181022

一些命令前边装 CUDA 已经执行过,所以直接用 apt 安装即可:

1
sudo apt-get -y install cudnn-cuda-12

如果前边装的是 11 版本,则使用 sudo apt-get -y install cudnn-cuda-11

开发类软件

安装 docker 及新版 docker-compose

1
2
3
4
5
6
sudo apt install docker.io -y
## 下载 v2.22.0 版本
curl -L https://github.com/docker/compose/releases/download/v2.22.0/docker-compose-`uname -s`-`uname -m` -o ~/download/docker-compose
## 赋予执行权限,并移动到系统目录
chmod +x ~/download/docker-compose
sudo mv ~/download/docker-compose /usr/bin/

创建 Docker 用户组,并将用户添加到其中,以免 sudo 运行 docker

1
2
3
4
5
6
# 创建用户组
sudo groupadd docker
# 将用户添加到 docker
sudo usermod -aG docker $USER
# 查看当前 docker 用户列表
sudo cat /etc/group | grep docker

创建 docker 目录用于存放镜像,并修改访问权限,比如

1
2
3
sudo mkdir -p /srv/docker
sudo chown :sudo /srv/docker
sudo chmod 770 /srv/docker

安装 nvm,nvm 是 nodejs 的版本管理工具,通过 nvm 可以安装多个版本的 nodejs,并在不同项目中切换不同版本的 nodejs

1
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

通常需要重启终端才能生效,或者执行 source ~/.bashrc

通过 nvm 安装 nodejs

1
nvm install 18

一些旧系统,比如 ubuntu18,安装新版 nodejs 可能存在问题,可以选择安装旧版 nodejs,比如

1
nvm install 16.15.1

更换镜像源:

1
npm config set registry https://r.cnpmjs.org/

注意,淘宝镜像源证书已过期,不再推荐使用。

wsl 系统

wsl 系统的 ubuntu 也可以用来当做服务器使用。

https://zhuanlan.zhihu.com/p/545822239

安装

上次装的时候,没记录下来,TODO。

局域网访问 wsl Ubuntu

参考知乎:SSH 连接局域网内 WSL Ubuntu 方法

安装 openssh,修改配置文件,以及重新启动 ssh 服务

1
2
3
4
5
6
sudo apt install openssh-server
sudo vim /etc/ssh/sshd_config
# 配置ssh参数
# Port 22
# PasswordAuthentication yes
sudo service ssh --full-restart

通过 ipconfig 或者 hostname -I 获取 wsl 的 ip 地址,比如 172.23.1.1

以管理员权限启动 PowerShell,将 windows 的 2222 端口转发到 wsl 的 22 端口

1
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=2222 connectaddress=172.23.1.1 connectport=22

防火墙开启入站规则,输入命令:

1
netsh advfirewall firewall add rule name=WSL2 dir=in action=allow protocol=TCP localport=2222

偏好配置

这部分内容根据自己喜好进行。

VsCode

必备插件:简体中文,Markdown, Copilot(TODO)

Git 设置

git 配置别名,默认编辑器等

1
2
3
4
5
6
7
8
9
# 保存 git 连接信息
git config --global credential.helper cache
# 设置别名
git config --global alias.discard "restore --staged *"
git config --global alias.oneline "log --oneline"
git config --global alias.amend "commit --no-edit --amend"
git config --global alias.difffile "diff --stat"
# 修改默认编辑器为 vscode
git config --global core.editor "code --wait"

也可以直接修改 ~/.gitconfig 文件:

1
2
3
4
5
6
7
8
9
10
11
[alias]
oneline = log --oneline
amend = commit --no-edit --amend
discard = restore --staged *
difffile = diff --stat
[core]
editor = code --wait
[diff]
tool = vscode
[credential]
helper = store

命令行设置

别名可以用于简化命令,建议写在单独文件,然后用 source 引入,比如

1
source $HOME/.zsh_aliases

一些比较复杂的命令,可以写成 shell 函数,以下是个人使用的别名列表:

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# tmux
alias tl="tmux ls"
alias tn="tmux new -s"
alias ta="tmux attach -t"
alias tk="tmux kill-session -t"

# edit zsh config
alias vzsh="vim ~/.zshrc"
alias valias="vim ~/.zsh_aliases"
alias szsh="source ~/.zshrc"
alias salias="source ~/.zsh_aliases"
alias czsh="code ~/.zshrc"
alias calias="code ~/.zsh_aliases"

# docker
alias dup="docker-compose up -d"
alias ddown="docker-compose down"
alias drestart="docker-compose restart"
alias dlog="docker-compose logs -f"
dockerin(){
docker exec -it $1 /bin/bash
}

# create short cut
lnfile() {
ln $1 $HOME/.local/bin/
}
# sort by file size
dusort() {
du -sh * | sort -h
}
sdusort(){
sudo du -sh * | sort -h
}

# conda
alias cda="conda activate"
alias cdd="conda deactivate"
alias cdenv="conda env list"
alias cdenvd="conda env remove --name"
# cuda
alias c0="CUDA_VISIBLE_DEVICES=0"
alias c1="CUDA_VISIBLE_DEVICES=1"
alias c2="CUDA_VISIBLE_DEVICES=2"
alias c3="CUDA_VISIBLE_DEVICES=3"
alias c4="CUDA_VISIBLE_DEVICES=4"
alias c5="CUDA_VISIBLE_DEVICES=5"
alias c6="CUDA_VISIBLE_DEVICES=6"
alias c7="CUDA_VISIBLE_DEVICES=7"

# test network
curltest(){
curl -I https://google.com
}
pingtest(){
ping -c2 -i3 www.baidu.com
}

# OpenAI service
export OPENAI_API_BASE=
export OPENAI_API_BASE_URL=
export OPENAI_API_KEY=

# pip install
alias tspip="pip install -i https://pypi.tuna.tsinghua.edu.cn/simple"
alias pypi='pip install -i https://pypi.python.org/simple'

如果有多个服务器,可以写一个函数,对别名进行同步,比如

1
2
3
4
5
6
7
8
upalias (){
echo "update aliases to $1"
scp $HOME/.zsh_aliases $1
}
update_all_aliases (){
upalias myserver:/home/username/
upalias myserver2:/home/username/
}

坚果云

(旧教程)

坚果云简介

坚果云是一款很实用的办公软件。我平常手机,平板和电脑间的文件交互都是用坚果云。
坚果云的优点是使用免费,即时更新而且速度快。虽然每月只有 1G 的上传流量和 3G 的下载流量,但基本办公完全够用。

安装教程

安装参考了这篇博客:Ubuntu 安装坚果云

  1. 官网下载 .deb 文件,并用命令行安装

    1
    sudo gdebi nautilus_nutstore_amd64.deb
  2. 修复依赖关系

    1
    sudo apt-get install -f
  3. 查看启动命令

    1
    grep Exec /usr/share/applications/nutstore-menu.desktop 

    若 grep 未安装,先执行 sudo apt-get install grep

可能问题

安装完成后,点击图标没有反应,问题原因:二进制组件需解压到 ~/.nutstore/dist, 但默认安装过程文件解压失败。解决方法:

  1. 根据系统下载二进制组件: 64位系统32位系统,或者使用命令行

    1
    2
    3
    4
    5
    # 64 位
    wget https://www.jianguoyun.com/static/exe/installer/nutstore_linux_dist_x64.tar.gz -O nut_64.tar.gz

    # 32 位
    # wget https://www.jianguoyun.com/static/exe/installer/nutstore_linux_dist_x86.tar.gz -O nut_32.tar.gz
  2. 创建目录,并将刚刚下载的文件解压到 ~/.nutstore/dist

    1
    2
    mkdir -p ~/.nutstore/dist
    tar -xzf nut_64.tar.gz -C ~/.nutstore/dist

这时就能正常启动了。

编程软件

安装 Julia

官网下载最新版 Julia,当前版本为 1.9.4

1
2
3
4
wget -c https://julialang-s3.julialang.org/bin/linux/x64/1.9/julia-1.9.4-linux-x86_64.tar.gz
tar -zxvf julia-1.9.4-linux-x86_64.tar.gz
# 如果全局安装,可以将目录解压到 /opt/,后边的环境变量也相应修改
mv julia-1.9.4 $HOME/software/julia19

添加环境变量

1
export PATH=$HOME/software/julia19/bin:$PATH

安装 IJulia,用于 Jupyter 系列

1
2
3
using Pkg
Pkg.add("IJulia")
# Pkg.build("IJulia") #

如果存在多个 Julia 环境,需要执行 build 选项,将其他 Julia 版本的 kernel 添加到 Jupyter 中。

sagemath

SageMath 是一个基于 GPL 协议的开源数学软件。它使用 Python 作为通用接口,将现有的许多开源软件包整合在一起,构建一个统一的计算平台。参考sage 中文文档

软件安装方法如下:

  1. 安装依赖

    1
    sudo apt-get install libssl-dev # 安装依赖
  2. 命令行安装,需等待较长时间

    1
    sudo apt-get install sagemath-jupyter -y # 安装软件

    也可以直接在官网下载免安装版并解压,比如

    1
    wget -c https://mirrors.aliyun.com/sagemath/linux/64bit/sage-9.4-Ubuntu_20.04-x86_64.tar.bz2
  3. 在终端输入 sage 运行软件
    深度截图_选择区域_20211204030836

  4. 指定使用 jupyter-notebook 运行

    1
    sage -n --notebook=jupyter

    如果使用 apt-get 的方式安装 SageMath,直接运行 jupyter-notebook 也能看到 sagemath

Mathematica

Mathematica(MMA) 是一款科学计算软件,很好地结合了数值和符号计算引擎、图形系统、编程语言、文本系统、和与其他应用程序的高级连接。很多功能在相应领域内处于世界领先地位,它也是使用最广泛的数学软件之一。

安装教程如下:

  1. 这里下载 12.1 版本(.sh 文件),或者直接用 wget
    1
    wget -c https://wdm.undo.icu/wyd/Mathematica/12.1.0.0/MMA_12.1.0_Linux_zh_CN.sh
  2. 进入文件所在目录,打开终端,输入 chmod a+x <文件名> 赋予执行权限
  3. sudo ./<文件名> 运行安装,按窗口提示进行
  4. 激活参看 Github 博客,或者这里

腾讯系列

以下为刚装 Ubuntu 电脑做的尝试,比较旧了,不保证可用(2021)

一些国内常用软件,比如 QQ,微信,腾讯会议,在 Ubuntu 上安装比较麻烦,最简易的方式是借助 deepin 系统。深度操作系统(deepin)是一款致力于为全球用户提供美观易用、安全稳定服务的 Linux 发行版,同时也一直是排名最高的来自中国团队研发的 Linux 发行版。

参考链接:deepin-wine

  1. 首次使用时,运行如下命令将移植仓库添加到系统中

    1
    wget -O- https://deepin-wine.i-m.dev/setup.sh | sh

    执行完成显示内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    大功告成,现在可以试试安装更新deepin-wine软件了,如:
    微信:sudo apt-get install com.qq.weixin.deepin
    QQ:sudo apt-get install com.qq.im.deepin
    TIM:sudo apt-get install com.qq.office.deepin
    钉钉:sudo apt-get install com.dingtalk.deepin
    完整列表见 https://deepin-wine.i-m.dev/
    🌟 尽量将main restricted universe multiverse这几个系统源都启用(自行百度),免得依赖问题多。
    🌟 安装后需要注销重登录才能显示应用图标。
    🌟 出了问题?先去github主页看README,再看别人提过的issue,再百度搜搜,避免直接就提issue。

    提示信息:启用系统源 main, restricted, universe, multiverse
    解决方法参考 CSDN 的教程,关于系统源和 apt 的工作原理,博客暂不深入,只贴启用系统源的方法

    1
    2
    3
    4
    sudo add-apt-repository universe
    sudo add-apt-repository main
    sudo add-apt-repository restricted
    sudo add-apt-repository multiverse
  2. 在尝试安装 QQ 时,报错下边问题

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    正在读取软件包列表... 完成
    正在分析软件包的依赖关系树
    正在读取状态信息... 完成
    com.qq.weixin.deepin:i386 已经是最新版 (3.4.0.38deepin6)。
    您也许需要运行“apt --fix-broken install”来修正上面的错误。
    下列软件包有未满足的依赖关系:
    com.qq.weixin.deepin:i386 : 依赖: deepin-elf-verify:amd64 (>= 0.0.16.7-1)
    依赖: deepin-wine6-stable:amd64 (>= 6.0.0.19-1)
    依赖: deepin-wine-helper:i386 (>= 5.1.25-1) 但是它将不会被安装
    依赖: fonts-wqy-microhei:i386
    依赖: fonts-wqy-zenhei:i386
    E: 有未能满足的依赖关系。请尝试不指明软件包的名字来运行“apt --fix-broken install”(也可以指定一个解决办法)。

    这是因为无法连接上 cn.archive.ubuntu.com,解决方法参考了博客园

    1
    2
    3
    # 先备份源列表文件
    cp /etc/apt/sources.list ~/
    sudo vim /etc/apt/sources.list

    修改 sources.list 文件,可以用 vim 或者用 vscode,将软件源 cn.archive.ubuntu.com 替换为其他软件源,比如 mirrors.163.com,然后执行更新

    1
    2
    sudo apt --fix-broken install
    sudo apt update
  3. 安装微信,QQ,钉钉,腾讯会议

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 安装 微信
    # 需等待较长时间
    sudo apt-get install com.qq.weixin.deepin
    # 安装 QQ
    sudo apt-get install com.qq.im.deepin
    # 安装 钉钉
    sudo apt-get install com.dingtalk.deepin
    # 安装腾讯会议
    sudo apt-get install com.tencent.meeting.deepin
  4. 可能的乱码问题,比如腾讯会议
    20220420000415
    参考了这个 issue 以及 CSDN 的解决方法

    1. 网上搜索下载 Windows 的 simsun.ttc 字体
    2. 将字体文件 simsun.ttc 移动到软件目录中,比如腾讯会议
      1
      2
      # 软件目录: ~/.deepinwine/<软件名称>/drive_c/windows/Fonts/
      cp simsun.ttc ~/.deepinwine/Deepin-WeMeet/drive_c/windows/Fonts/
  5. 录音问题,比如腾讯会议:进入会议后,选择系统默认麦克风;电脑右上角有麦克风的标识,默认音量为 0,需手动拉高。
    深度截图_选择区域_20220422110458
    如果直接在设置界面测试麦克风,好像会闪退,必须开启会议,麦克风图标出现后,才能正常测试。微信 QQ 的录音同理。

还有摄像头问题没有解决,不过正常会议可以进行,就先不捣鼓了。

注:从软件目录看,deepin 的原理好像是将 windows 的软件放在容器中,里边有不少 exe 文件。