【🌿 持续更新】 瞧瞧我在Ubuntu系统上干了些什么!

🔧 设备基本信息

🖥️ 服务器设备(houjinliang)

项目 2080tiServer
ubuntu-server
3080Server
3080server
3090Server
3090server
3090Server2
3090server2
4090Server
4090server
4090Server2
4090server2
系统 Ubuntu
20.04.2 LTS
Ubuntu
20.04.6 LTS
Ubuntu
20.04.6 LTS
Ubuntu
20.04.5 LTS
Ubuntu
22.04.2 LTS
Ubuntu
22.04.3 LTS
Codename focal focal focal focal jammy jammy
内核 5.8.0-59-generic 5.4.0-218-generic 5.4.0-216-generic 5.15.0-139-generic 6.2.0-26-generic 6.8.0-85-generic
GPU GeForce RTX 2080 Ti NVIDIA GeForce RTX 3080 NVIDIA GeForce RTX 3090 NVIDIA GeForce RTX 3090 NVIDIA GeForce RTX 4090 NVIDIA GeForce RTX 4090
CPU Intel(R) Xeon(R) Bronze 3104 CPU @ 1.70GHz Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz Intel(R) Xeon(R) CPU E5-2699C v4 @ 2.20GHz Intel(R) Xeon(R) CPU E5-2699C v4 @ 2.20GHz Intel(R) Xeon(R) Gold 6271C CPU @ 2.60GHz Intel(R) Xeon(R) Gold 6271C CPU @ 2.60GHz
Mem 125.56 GB 251.77 GB 251.77 GB 251.75 GB 251.50 GB 251.47 GB
DL CUDA 11.3 + cuDNN 8.9.5 CUDA 11.3 + cuDNN 8.9.5 CUDA 11.3 + cuDNN 8.9.5 CUDA 11.3 + cuDNN 8.9.5 CUDA 11.6 + cuDNN 8.9.5
CUDA 12.1 + cuDNN 8.9.7
CUDA 12.4 + cuDNN 8.9.7
Path /home/data/houjinliang/cuda-11.3 /mnt/houjinliang/cuda-11.3 /mnt/houjinliang/cuda-11.3 /data/houjinliang/cuda-11.3 /mnt/houjinliang/cuda-12.1 /data/houjinliang/cuda-12.4
NV Driver 460.80 570.133.20 570.133.20 535.183.01 570.195.03 550.107.02
GCC 8.4.0 9.4.0 9.4.0 9.4.0 11.4.0 12.3.0

👨‍💻 个人设备

设备名称 系统配置 主要用途
LabPC-Ubt Windows 10 Pro + Ubuntu 22.04 教研室
ITX-Ubt Windows 11 Pro + Ubuntu 24.04 个人

🚀 深度学习(Conda + CUDA)环境搭建

  • 以3090Server<Ubuntu 18.04.6 LTS>为例/(2024.06.26)
  • PS:3090Server目前系统已更新至Ubuntu 20.04.6 LTS,但对下面的记录影响不大/(2025.06.11)

1. 系统信息确认

1
2
3
4
5
6
7
# 系统版本
Welcome to Ubuntu 18.04.6 LTS (GNU/Linux 5.4.0-150-generic x86_64)
Model name: Intel(R) Xeon(R) CPU E5-2699C v4 @ 2.20GHz
NVIDIA Corporation GA102 [GeForce RTX 3090] (rev a1)

# GCC版本 (重要:影响CUDA兼容性)
gcc version 7.5.0

2. Miniconda 安装配置

2.1 下载与安装

1
2
3
4
5
6
7
8
9
# 选择目录
cd /mnt/houjinliang/MyDownloadFiles

# 下载 Miniconda 安装包
wget -c https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
chmod +x Miniconda3-latest-Linux-x86_64.sh
./Miniconda3-latest-Linux-x86_64.sh

## 安装过程中会有选择安装路径的选择,直接选择默认路径. Press ENTER to confirm the location [/mnt/houjinliang/miniconda3] >>>

2.2 环境变量配置

conda init

  • 这里选择输入yes,然后会自动配置 ~/.bashrc,关闭Terminal然后再重启一个或者source ~/.bashrc,就能看到命令行前面的base了;
  • 如果是输入no的话,安装完成之后conda命令在终端是识别不到的,需要配置环境变量,手动输入下面的内容到 ~/.bashrc中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/mnt/houjinliang/miniconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
eval "$__conda_setup"
else
if [ -f "/mnt/houjinliang/miniconda3/etc/profile.d/conda.sh" ]; then
. "/mnt/houjinliang/miniconda3/etc/profile.d/conda.sh"
else
export PATH="/mnt/houjinliang/miniconda3/bin:$PATH"
fi
fi
unset __conda_setup
# <<< conda initialize <<<
1
2
3
4
5
# 配置环境变量
vim ~/.bashrc
source ~/.bashrc

## 这里vim用的不熟练就使用vscode打开这个‘~/.bashrc’文件,然后再末尾增加moniconda的配置文件
1
2
# 验证安装,检查基本信息
conda info

2.3 Conda & PyPI 的换源

  • Conda换源(我没换)

    参考: Miniconda安装使用教程-阿里云开发者社区,切换清华源

    1
    2
    3
    (base) houjinliang@3090server:~$ conda config --show-sources
    ==> /mnt/houjinliang/.condarc <==
    auto_activate_base: True
  • pip换源(我选择换了阿里云源)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 可以直接用命令的方式,如下.
    ## Writing to /mnt/houjinliang/.config/pip/pip.conf

    pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/

    # 或者是修改 ~/.config/pip/pip.conf (没有就创建一个), 内容如下:
    [global]
    index-url = https://mirrors.aliyun.com/pypi/simple/

    # 检查pip换源是否成功
    cat ~/.config/pip/pip.conf

重要配置项

  • 安装路径选择:/mnt/username/miniconda3 (个人目录)
  • 初始化设置:选择 yes 自动配置环境变量
  • 换源配置:阿里云PyPI源提升下载速度
  • 除了逐步的安装外,还可以使用下面的Miniconda快速部署脚本!
    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
    #!/bin/bash
    # Ubuntu深度学习环境快速配置脚本

    echo "开始配置Ubuntu深度学习环境..."

    # 1. 更新系统
    sudo apt update && sudo apt upgrade -y

    # 2. 安装基础工具
    sudo apt install -y wget curl vim git build-essential

    # 3. 下载Miniconda
    cd ~/
    wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
    chmod +x Miniconda3-latest-Linux-x86_64.sh
    ./Miniconda3-latest-Linux-x86_64.sh -b -p ~/miniconda3

    # 4. 配置conda环境
    echo 'export PATH="$HOME/miniconda3/bin:$PATH"' >> ~/.bashrc
    source ~/.bashrc

    # 5. 配置pip源
    pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/

    echo "基础环境配置完成!"
    echo "请手动配置CUDA和cuDNN..."

3. NVIDIA驱动确认

1
2
3
4
5
6
# 检查驱动版本
cat /proc/driver/nvidia/version

## NVRM version: NVIDIA UNIX x86_64 Kernel Module 515.65.01
## GCC version: gcc version 7.5.0
## 这里的驱动是服务器自带的,所以在给自己目录下安装CUDA的时候,可以不选择安装driver,影响不大。

4. CUDA Toolkit 安装

4.1 CUDA Tookit .run 文件的下载、执行

4.1.1 可视化的安装

1
2
3
4
5
6
7
8
# 下载CUDA 11.3.1
wget https://developer.download.nvidia.com/compute/cuda/11.3.1/local_installers/cuda_11.3.1_465.19.01_linux.run

# 添加执行权限
chmod +x cuda_11.3.1_465.19.01_linux.run

# 执行安装 (重要:不安装Driver,只安装Toolkit)
./cuda_11.3.1_465.19.01_linux.run

出现这样的不要害怕,直接`Continue`就好了,然后按照下面的步骤。

NPU_2024-06-26_11-29-59
NPU_2024-06-26_11-31-04
NPU_2024-06-26_11-31-37
NPU_2024-06-26_11-32-40
NPU_2024-06-26_11-34-55
NPU_2024-06-26_11-35-29
image-20240626114348562
NPU_2024-06-26_11-36-37
NPU_2024-06-26_11-37-23
  • 安装完成后的输出信息,这里可以看一下安装的内容/路径。

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    (base) houjinliang@3090server:~/MyDownloadFiles$ ./cuda_11.3.1_465.19.01_linux.run
    ===========
    = Summary =
    ===========

    Driver: Not Selected
    Toolkit: Installed in /mnt/houjinliang/cuda-11.3/
    Samples: Not Selected

    Please make sure that
    - PATH includes /mnt/houjinliang/cuda-11.3/bin
    - LD_LIBRARY_PATH includes /mnt/houjinliang/cuda-11.3/lib64, or, add /mnt/houjinliang/cuda-11.3/lib64 to /etc/ld.so.conf and run ldconfig as root

    To uninstall the CUDA Toolkit, run cuda-uninstaller in /mnt/houjinliang/cuda-11.3/bin
    ***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 465.00 is required for CUDA 11.3 functionality to work.
    To install the driver using this installer, run the following command, replacing <CudaInstaller> with the name of this run file:
    sudo <CudaInstaller>.run --silent --driver

    Logfile is /tmp/cuda-installer.log
  • 安装完成之后,最好把这个/tmp/cuda-installer.log文件删除了,如果不删的话,后面的用户再安装就会有影响。为了不妨碍他人,最好把这个删掉。

    1
    rm /tmp/cuda-installer.log

4.1.2 静默的安装

  • 后面又了解到了,还有一种“静默”安装的方式,直接使用命令来设置安装的包和路径
1
2
3
4
5
# 
./cuda_12.1.0_530.30.02_linux.run --silent --toolkit --toolkitpath=/mnt/houjinliang/cuda-12.1

# 记得删掉log
rm /tmp/cuda-installer.log

5. 环境变量配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 编辑 ~/.bashrc。 使用vim或vscode
vim ~/.bashrc

# 添加CUDA环境变量
# >>> cuda environment variables >>>
export CUDA_HOME=/mnt/houjinliang/cuda-11.3
export CUDA_PATH=$CUDA_HOME
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH
# <<< cuda environment variables <<<

# 更新环境变量
source ~/.bashrc

# 验证安装
nvcc -V
which nvcc
1
2
3
4
5
6
7
8
9
10
11
# CUDA Check
(base) houjinliang@3090server:~$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Mon_May__3_19:15:13_PDT_2021
Cuda compilation tools, release 11.3, V11.3.109
Build cuda_11.3.r11.3/compiler.29920130_0

# CUDA Check
(base) houjinliang@3090server:~$ which nvcc
/mnt/houjinliang/cuda-11.3/bin/nvcc

6. cuDNN 安装配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 下载cuDNN (需要NVIDIA开发者账号)
# cudnn-linux-x86_64-8.9.5.29_cuda11-archive.tar.xz

# 解压安装
tar xvJf cudnn-linux-x86_64-8.9.5.29_cuda11-archive.tar.xz
cd cudnn-linux-x86_64-8.9.5.29_cuda11-archive

# 复制文件到CUDA目录
cp lib/* ~/cuda-11.3/lib64/
cp include/* ~/cuda-11.3/include/
chmod +x ~/cuda-11.3/include/cudnn.h
chmod +x ~/cuda-11.3/lib64/libcudnn*

# 验证版本
cat ~/cuda-11.3/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

安装要点

  • ✅ 选择: CUDA Toolkit
  • ❌ 不选择: Driver (使用系统已安装的驱动)
  • 🎯 安装路径: /mnt/username/cuda-11.3
  • 🎯 环境变量: ~/.bashrc

7. (扩展内容) 多版本CUDA配置与切换

  • 我在4090server上安装了多个版本的CUDA,如何配置呢?
  • 安装部分就是正常安装,但是配置环境变量的时候需要注意一下!
    1
    2
    drwxrwxr-x 15 houjinliang houjinliang  4096 10月 23  2024 cuda-11.6/
    drwxrwxr-x 18 houjinliang houjinliang 4096 10月 4 00:04 cuda-12.1/

7.1 直接采用修改环境变量的方式修改当前生效的CUDA版本

1
2
3
vim ~/.bashrc
## 修改成修改版本的CUDA目录,例如11.6->12.1
source ~/.bashrc

7.2 使用多CUDA切换脚本

1
2
# 参考Github Repo Code
> https://github.com/murphyhoucn/HandyShellScripts/tree/main/MutiCUDA

📚 参考资料

1. 版本兼容性对照

1.1 CUDA与GCC版本对应

CUDA版本 支持的GCC版本 Ubuntu版本示例
CUDA 11.3 GCC 7.x, 8.x, 9.x Ubuntu 18.04 (GCC 7.5)
CUDA 11.6 GCC 7.x, 8.x, 9.x, 10.x Ubuntu 20.04 (GCC 9.4)
CUDA 12.4 GCC 8.x, 9.x, 10.x, 11.x, 12.x Ubuntu 22.04 (GCC 11.4)
CUDA v.s. Driver
CUDA v.s. Driver
ubuntu v.s. GCC
ubuntu v.s. GCC

1.2 CUDA Toolkit与Driver版本对应

CUDA版本 最低Driver版本 推荐Driver版本
CUDA 11.3 465.19.01+ 515.65.01
CUDA 11.6 510.47.03+ 525.xxx
CUDA 12.4 550.54.15+ 550.107.02

1.3 cuDNN版本对应

cuDNN版本 支持的CUDA版本 下载链接
cuDNN 8.9.5 CUDA 11.x NVIDIA Developer
cuDNN 8.9.7 CUDA 12.x NVIDIA Developer

2. 下载链接汇总

2.1 CUDA Toolkit

image-20241023145423648

2.2 cuDNN

image-20241024223544376
image-20241024223923702

2.3 Miniconda


💻 开发工具配置

Git & GitHub 配置

1. Git用户配置

  • 在Linux的Ubuntu发行版上一般都会默认安装了Git,所以不需要自己手动安装,拿来即用即可。
    1
    2
    3
    4
    5
    6
    7
    # 设置用户信息
    git config --global user.name "username_servername"
    git config --global user.email "your_email@example.com"

    # 查看配置
    git config user.name
    git config user.email

2. SSH密钥配置

  • 不需要担心Git的用户配置会对本服务器上的其他用户会产生影响。ssh-keygen生产的的用户密钥会保存在个人账号的目录下。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 生成SSH密钥
    ssh-keygen -t rsa -C "your_email@example.com"

    # 密钥保存在个人目录
    ls ~/.ssh/
    # id_rsa id_rsa.pub known_hosts

    # 复制公钥到GitHub
    cat ~/.ssh/id_rsa.pub
  • 复制id_rsa.pub文件下的内容,到Github的Setting中设置SSH Keys。如下。

    image-20231101105539214
    image-20231102171332923

3. 连接测试

1
2
3
4
5
6
# 测试GitHub连接
ssh -T git@github.com
# Hi username! You've successfully authenticated, but GitHub does not provide shell access.

# 克隆仓库测试
git clone git@github.com:username/repository.git

Git Install

这台4090server2服务器上没有git,使用deb包安装一个

1
wget http://archive.ubuntu.com/ubuntu/pool/main/g/git/git_2.34.1-1ubuntu1.11_amd64.deb
1
2
3
4
5
6
7
8
9
10
11
# 创建文件夹,安装到指定的目录`~/git/`
mkdir ~/git
dpkg -x ./git_2.34.1-1ubuntu1.11_amd64.deb ~/git

(base) houjinliang@4090server2:~/git$ ll
total 20
drwxr-xr-x 5 houjinliang houjinliang 4096 5月 20 20:14 ./
drwxr-x--- 14 houjinliang houjinliang 4096 10月 24 23:22 ../
drwxr-xr-x 3 houjinliang houjinliang 4096 5月 20 20:14 etc/
drwxr-xr-x 5 houjinliang houjinliang 4096 5月 20 20:14 usr/
drwxr-xr-x 3 houjinliang houjinliang 4096 5月 20 20:14 var/
1
2
3
4
5
6
7
8
9
10
11
# 编辑环境变量
vim ~/.bashrc

## 插入下面的内容
# >>> git environment variables >>>
export GIT_HOME=/data/houjinliang/git
export PATH=$GIT_HOME/usr/bin:$PATH
# <<< git environment variables <<<

# 更新环境变量
source ~/.bashrc
1
2
3
4
5
6
7
8
9
# 检查一下配置
(base) houjinliang@4090server2:~$ which git
/data/houjinliang/git/usr/bin/git

(base) houjinliang@4090server2:~$ git --version
git version 2.34.1

(base) houjinliang@4090server2:~$ git config user.name
hjl_4090server2

GPU监控工具

1. nvidia-smi (系统自带)

1
2
3
4
5
# 基本GPU信息查看
nvidia-smi

# 持续监控
watch -n 1 nvidia-smi

2. gpustat

1
2
3
4
5
6
# 安装
pip install gpustat

# 使用
gpustat
gpustat -i 1 # 每秒更新

3. nvitop (推荐)

1
2
3
4
5
# 安装
pip install nvitop

# 交互式监控
nvitop

nvitop

nvitop优势

  • 交互式界面,支持键盘操作
  • 详细的进程信息和资源使用
  • 支持进程管理操作

系统资源监控工具(TODO)

1. CPU + Mem

1.1 top

1.2 htop

2. 网络

2.1 通用网络工具

工具 主要功能 优点 缺点 推荐场景
nethogs 按进程显示流量 最直接回答你的问题,一目了然 需要额外安装,必须 sudo 首选! 快速定位哪个程序在占用网络。
iftop 按连接显示流量 能看到与哪个远程IP通信最频繁 不能直接显示进程名,需配合 ss 使用 分析网络连接,排查与特定服务器的通信问题。
nload 显示接口总流量 界面直观,简单易用 无法知道是哪个程序或连接 快速查看当前网速,判断网络是否通畅。
ss -tupn 查看所有连接和进程 系统自带,功能强大,信息最全 输出信息多,需要手动解读 深入排查网络问题,无图形界面环境下的首选。
系统监视器 图形化进程/资源监控 用户友好,无需命令行 功能不如专业命令行工具灵活 桌面用户,日常监控和任务管理。

2.2 监控端口流量

当系统开启了全局或透明代理后,区分哪些流量走了代理,哪些流量是直连,对于调试和隐私保护至关重要。
监控 Clash 代理(端口 7890)的流量,本质上就是监控所有 目标地址为 127.0.0.1:7890 的网络连接。任何走代理的进程都必须先连接到这个本地端口。

场景 推荐命令 说明
快速查看当前谁在用代理 sudo ss -tupn | grep ':7890' 最推荐,直接、准确、无需安装。
实时监控谁在用代理 watch -n 1 "sudo ss -tupn | grep ':7890'" 动态观察,非常方便。
查看代理总带宽占用 sudo nethogs 查看 clash 进程的流量,了解总体情况。
图形化查看代理总带宽 sudo nethogs-qt 桌面用户友好。
判断直连进程 结合 nethogsss 的结果进行反向推断 最实用的直连判断方法。
1
2
# 这个比较好用
watch -n 1 "sudo lsof -i :7890

📊 系统管理

用户管理

  • 实例:3080server

增减用户

  • user add

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    sudo useradd -d "/mnt/songwenming" -m -s "/bin/bash" songwenming
    sudo passwd songwenming

    # 查看用户和用户组
    user@3080server:/mnt$ cat /etc/passwd
    ……
    songwenming:x:1035:1035::/mnt/songwenming:/bin/bash
    ……

    user@3080server:/mnt$ cat /etc/group
    ……
    songwenming:x:1035:
    ……
  • user delete

    1
    sudo userdel -r songwenming

用户与用户组

  • 查看设备上的用户

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 两种方法获取当前设备的用户目录
    cat /etc/passwd # 方法一
    getent passwd # 方法二

    ## 这个文件包含了所有用户的基本信息,每一行代表一个用户。
    username:password_placeholder:UID:GID:comment:home_directory:login_shell

    # 两种方法获取当前设备的用户组目录
    cat /etc/group # 方法一
    getent group # 方法二

    ## 这个文件定义了所有的用户组。
    group_name:password_placeholder:GID:members_list
  • 查看特定用户的属于哪个组

    1
    2
    3
    4
    5
    6
    7
    8
    (base) houjinliang@3080server:~$ groups songwenming
    songwenming : songwenming

    (base) houjinliang@3080server:~$ groups houjinliang
    houjinliang : houjinliang sudo

    (base) houjinliang@4090server:~$ groups houjinliang
    houjinliang : houjinliang sudo ollama

sudo-特殊的组

  • sudo 权限是通过将用户添加到一个特定的用户组来实现的。
  • 在 Debian/Ubuntu 系统中,这个组通常是 sudo。
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
# 命令一,查看sudoers
user@3080server:/mnt$ sudo grep -rE '^%[a-zA-Z_]+' /etc/sudoers /etc/sudoers.d/
/etc/sudoers:%admin ALL=(ALL) ALL
/etc/sudoers:%sudo ALL=(ALL:ALL) ALL

# 命令二,查看sudo组中有哪个用户
user@3080server:/mnt$ getent group sudo
sudo:x:27:user
## user 拥有 sudo 权限

# 命令三,直接扫描所有 sudo 配置文件,找出所有被明确授权的用户和组。
user@3080server:/mnt$ sudo grep -rvE '^#|^$' /etc/sudoers /etc/sudoers.d/ | sed 's/#.*//'
/etc/sudoers:Defaults env_reset
/etc/sudoers:Defaults mail_badpass
/etc/sudoers:Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
/etc/sudoers:root ALL=(ALL:ALL) ALL
/etc/sudoers:houjinliang ALL=(ALL) ALL
/etc/sudoers:%admin ALL=(ALL) ALL
/etc/sudoers:%sudo ALL=(ALL:ALL) ALL

# 命令四,查看某一用户的sudo权限
# 如果用户有权限,系统会详细列出该用户可以执行的所有命令,如果用户没有权限,系统会明确告知
user@3080server:/mnt$ sudo -l -U user
匹配 %2$s 上 %1$s 的默认条目:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

用户 user 可以在 3080server 上运行以下命令:
(ALL : ALL) ALL

user@3080server:/mnt$ sudo -l -U houjinliang
匹配 %2$s 上 %1$s 的默认条目:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

用户 houjinliang 可以在 3080server 上运行以下命令:
(ALL) ALL
用户 (User) 权限级别 (Permission Level) 获得方式 (Method of Grant)
root 超级用户 (Superuser) 系统内置 (System Built-in)
user 完整 sudo 权限 (Full sudo Access) sudo 组成员 (Member of sudo Group)
houjinliang 完整 sudo 权限 (Full sudo Access) 直接在 sudoers 文件中指定 (Directly Named in sudoers)
ps:这里的sudo -l -U houjinliang的权限很奇怪,不在sudo组,但是在sudoers中指定了,这是因为之前使用ncvv的时候配置的。后面还是直接把houjinliang加入了sudo组。
1
2
# 把这个手动加的权限“(ALL) ALL”删掉 
user@3080server:~$ sudo vim /etc/sudoers

把用户加入sudo用户组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 把houjinliang加入sodo组
user@3080server:/mnt$ sudo usermod -aG sudo houjinliang

# 查看sudo组的用户
user@3080server:/mnt$ getent group sudo
sudo:x:27:user,houjinliang

# 查看houjinliang的权限
user@3080server:/mnt$ sudo -l -U houjinliang
匹配 %2$s 上 %1$s 的默认条目:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

用户 houjinliang 可以在 3080server 上运行以下命令:
(ALL : ALL) ALL

# 查看houjinliang所在的组
user@3080server:~$ groups houjinliang
houjinliang : houjinliang sudo
用户 (User) 权限级别 (Permission Level) 获得方式 (Method of Grant)
root 超级用户 (Superuser) 系统内置 (System Built-in)
user 完整 sudo 权限 (Full sudo Access) sudo 组成员 (Member of sudo Group)
houjinliang 完整 sudo 权限 (Full sudo Access) sudo 组成员 (Member of sudo Group)

用户权限

  • ssh with houjinliang

1. 设置750权限

1
2
3
4
5
6
7
8
9
10
11
# change permission
chmod 750 /mnt/houjinliang
# 7 (rwx): 所有者 读写执行
# 5 (r-x): 组用户 读取执行
# 0 (---): 其他用户 无权限

#所有者 (User - u): 权限是 7,二进制表示为 111,即 rwx(读、写、执行)。假设您是这个目录的所有者(比如用户 houjinliang),那么您拥有全部权限。
#所属组 (Group - g): 权限是 5,二进制表示为 101,即 r-x(读、执行)。与您在同一个用户组的其他成员可以读取目录内容(ls)和进入该目录(cd),但不能在该目录中创建或删除文件。
#其他人 (Other - o): 权限是 0,二进制表示为 000,即 ---(无权限)。除了所有者和所属组成员之外的任何其他用户,对这个目录没有任何权限。

## 这个个设置非常适合用来阻止其他普通用户访问您的目录,但它对 root 用户就像不存在一样。 管理员(root)依然可以自由地进入您的目录、读取、修改或删除里面的任何文件。

2. user是在sudo组的用户,能看到755用户(songwenming,755)的文件吗?

  • user 不是文件的所有者。
  • user不属于该文件的用户组,那么他就会被归类为“其他人”,权限是 0,因此他不能读取文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 普通用户755权限,不在组里的用户,可读
drwxr-xr-x 4 songwenming songwenming 4096 9月 4 19:59 songwenming/

user@3080server:/mnt$ cd songwenming/ # cd进入文件夹属于一种“执行(x)”权限
user@3080server:/mnt/songwenming$ ll
总用量 40
drwxr-xr-x 4 songwenming songwenming 4096 9月 4 20:29 ./
drwxr-xr-x 25 root root 4096 9月 4 19:56 ../
-rw------- 1 songwenming songwenming 31 9月 4 19:59 .bash_history
-rw-r--r-- 1 songwenming songwenming 220 4月 5 2018 .bash_logout
-rw-r--r-- 1 songwenming songwenming 3771 4月 5 2018 .bashrc
drwx------ 2 songwenming songwenming 4096 9月 4 19:58 .cache/
drwx------ 3 songwenming songwenming 4096 9月 4 19:58 .config/
-rw-r--r-- 1 songwenming songwenming 807 4月 5 2018 .profile
-rw-rw-r-- 1 songwenming songwenming 10 9月 4 20:29 try.py
-rw------- 1 songwenming songwenming 760 9月 4 20:29 .viminfo

user@3080server:/mnt/songwenming$ cat try.py
import os

3. user是在sudo用户组,能看750用户(houjinliang,750)的文件内容吗?

3.1 user,不加sudo.
1
2
3
4
5
6
7
8
# 750权限,不在用户组里的用户不可读,不可写,不可执行
# cd进入文件夹属于一种“执行(x)”权限
user@3080server:~$ cd /mnt/houjinliang/
-bash: cd: /mnt/houjinliang/: 权限不够

# cat, 读权限
user@3080server:~$ cat /mnt/houjinliang/MyDevProject/NPUDevCode/GitAuto.sh
cat: /mnt/houjinliang/MyDevProject/NPUDevCode/GitAuto.sh: 权限不够
3.2 user,加sudo.
1
2
3
4
5
6
7
8
9
user@3080server:~$ sudo cd /mnt/houjinliang/
[sudo] user 的密码:
sudo: cd:找不到命令

## 这里引申出一个内容——Linux 的命令的两种类型:外部命令 (External Command)和Shell 内建命令 (Shell Built-in Command)
## 具体解释见下文“Linux 命令的两种类型”

# 使用sudo就破解了权限
user@3080server:~$ sudo cat /mnt/houjinliang/MyDevProject/NPUDevCode/GitAuto.sh
3.3 终极方法,切换到root
  • !!!root是终极无敌权限,不管任何chmod!!!
  • 那情况显而易见,对于750的用户文件夹,也挡不住root用户的访问

root的登录

这里有一个有意思的地方,从user用户切换到root其实有两种方式(命令)

  • 方法一:切换到一个临时的 root Shell (推荐)

    • 命令:sudo -s 或 sudo su
    • 这会开启一个新的 Shell,而这个 Shell 的用户是 root。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      user@3080server:~$ sudo -s
      root@3080server:/home/user# exit
      user@3080server:~$

      user@3080server:~$ sudo su
      root@3080server:/home/user# exit
      user@3080server:~$

      ## Ctrl + D, 注销root用户,显示的是“exit"
  • 方法二:切换到一个完整的 root 登录环境

    • 命令:sudo -i 或 sudo su -
    • 这不仅会切换到 root 用户,还会加载 root 用户的完整环境变量,并把当前目录切换到 /root。这被认为是更规范、更安全的做法。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      user@3080server:~$ sudo -i
      root@3080server:~# 注销
      user@3080server:~$

      user@3080server:~$ sudo su -
      root@3080server:~# 注销
      user@3080server:~$

      ## Ctrl + D, 注销root用户,显示的的"注销"

Linux 命令的两种类型

引申出一个内容,sudo: cd:找不到命令。这是问题的核心。你可能会非常困惑:“cd 明明是一个命令,为什么 sudo 会说找不到它?”

原因是:Linux 的命令分为两种类型

  1. 外部命令 (External Command):
    • 这些是存在于磁盘上的独立程序文件,比如 /bin/ls, /bin/cat, /usr/bin/grep
    • 当你执行 ls 时,你的 Shell 会在 PATH 环境变量指定的路径中去查找一个叫做 ls 的可执行文件,然后运行它。
    • sudo 正是设计用来运行这些外部命令的。它会在一个安全的路径(secure_path)里去寻找这些程序。
  2. Shell 内建命令 (Shell Built-in Command):
    • 这些命令是 Shell 程序(比如你用的 bash)自身的一部分,它们不是磁盘上的独立文件
    • cd 就是一个最典型的内建命令。此外还有 pwd, echo, export, alias, exit 等。
    • sudo 无法找到 cd 命令,因为它不是一个独立的文件,所以 sudo 在所有程序路径里都找不到它,最终只能报告“找不到命令”。

为什么 cd 必须是内建命令?

想象一下,如果 cd 是一个外部程序。当你运行 cd /some/dir 时,系统会启动一个新的进程来运行 cd 这个程序。这个新进程会成功地把它自己的工作目录切换到 /some/dir,然后……它就退出了。你原来的那个 Shell 进程的工作目录完全没有受到任何影响

所以,为了能够改变当前 Shell 自身的环境(比如当前所在目录),cd 必须是 Shell “内置”的功能,直接在当前进程内执行。

磁盘管理 Disk Tools

  • 实例:3080server

1. 文件查询命令:ls

  • 查看文件以及文件夹大小
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # ll
    (py38mmyolo) houjinliang@3080server:~/userdoc/offlinefile$ ll
    总用量 26251480
    drwxrwxr-x 6 houjinliang houjinliang 4096 1月 10 21:36 ./
    drwxrwxr-x 9 houjinliang houjinliang 4096 1月 10 15:59 ../
    drwxr-xr-x 5 houjinliang houjinliang 4096 8月 26 2022 coco/
    -rw-rw-r-- 1 houjinliang houjinliang 6983030 1月 10 17:00 coco128.zip
    -rw-rw-r-- 1 houjinliang houjinliang 48639045 1月 10 16:21 coco2017labels.zip
    -rw-rw-r-- 1 houjinliang houjinliang 4372979 1月 10 14:48 curl-8.5.0.tar.gz
    -rw-rw-r-- 1 houjinliang houjinliang 12353723 1月 5 16:32 pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
    …………
    总用量 26251480
    总用量: 英文是 “total”。它表示当前目录下所有文件和目录所占用的磁盘块的总大小。
    26251480: 这是一个数字,单位是
  • 单位换算:
  • 我们之前估算过,26251480 块 ≈ 26,869,515,520 字节。
  • 26,869,515,520 字节 / 1024 = 26,243,708 KB
  • 26,243,708 KB / 1024 = 25,628 MB
  • 25,628 MB / 1024 ≈ 25.03 GB
1
2
3
4
5
6
7
8
9
10
11
# ll -hl
(py38mmyolo) houjinliang@3080server:~/userdoc/offlinefile$ ll -hl
总用量 26G
drwxrwxr-x 6 houjinliang houjinliang 4.0K 1月 10 21:36 ./
drwxrwxr-x 9 houjinliang houjinliang 4.0K 1月 10 15:59 ../
drwxr-xr-x 5 houjinliang houjinliang 4.0K 8月 26 2022 coco/
-rw-rw-r-- 1 houjinliang houjinliang 6.7M 1月 10 17:00 coco128.zip
-rw-rw-r-- 1 houjinliang houjinliang 47M 1月 10 16:21 coco2017labels.zip
-rw-rw-r-- 1 houjinliang houjinliang 4.2M 1月 10 14:48 curl-8.5.0.tar.gz
-rw-rw-r-- 1 houjinliang houjinliang 12M 1月 5 16:32 pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
…………
1
2
3
4
命令:ll -hl
等价于:ls -l -h -l

不过,`ls` 命令的选项可以合并,所以通常写作 `ls -hl`。因为 `ll` 本身就是 `ls -l`,所以这个命令实际上是 `ls -l -h`

选项解释:

  • -l: 我们已经知道了,表示使用长格式输出。
  • -h: 代表 “human-readable”(人类可读格式)。这是一个非常实用的选项,它会自动将文件大小(以及这里的 总用量)的单位从字节或块,转换为更易于阅读的 K(千字节)、M(兆字节)、G(吉字节)等单位。
    • 总用量: 含义与之前相同,表示当前目录下所有文件和目录所占用的磁盘块的总大小。
    • 26G: 这就是 -h 选项的功劳。它将之前那个不直观的数字 26251480(单位:块)转换成了人类可读的格式。
    • 您看到的输出是26G,这与我们计算出的25.03 GB非常接近。微小的差异可能源于:
      • 系统显示的舍入25.03 GB 在显示时可能会被舍入为 26G(虽然通常 25.03 会显示为 25G,但不同系统或版本的 ls 可能有不同的舍入逻辑)。
      • 块大小的定义:在某些系统或文件系统中,1 块可能被定义为 4096 字节(4 KB)。如果按这个标准计算:26251480 块 * 4096 字节/块 ≈ 107,527,426,560 字节 ≈ 100.15 GB。这与 26G 差距很大。因此,可以断定您系统的块大小是 1024 字节
      • 最可能的原因ls 命令在计算 total 时,其内部算法可能对单位转换做了特定的处理,导致显示为 26G。我们只需理解它代表大约 26 GB 的磁盘空间占用即可。

2. 磁盘查询命令与工具

2.1 磁盘查询: df & du

  • 磁盘查询, df。df 的全称是 “disk free”,它的核心作用是从文件系统(通常可以理解为磁盘分区)的宏观角度查看整体的使用情况。

    1
    2
    3
    4
    5
    6
    7
    8
    user@3080server:~$ df -h
    # -h 是 --human-readable(人类可读)的缩写。

    user@3080server:~$ df -T
    # df -T: 显示文件系统类型 (filesystem Type),比如 ext4, xfs, ntfs 等。

    user@3080server:~$ df -hT
    # df -hT: 结合起来使用,非常方便。
  • 磁盘查询,du。du 的全称是 “disk usage”,它与 df 完美互补。当 df 告诉你某个分区(比如 /)快满了,du 就能帮你找到到底是哪个目录或文件占用了大量空间

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    du -h /path/to/dir
    # 以易读格式显示指定目录下所有子目录的大小。如果目录很深,会输出大量信息。

    du -sh /path/to/dir: 这是最常用的组合!
    # -s (--summarize): 只显示总计大小,不显示子目录的。
    # -h: 易读格式。

    sudo du -sh /mnt/houjinliang
    # 示例:sudo du -sh /mnt/houjinliang 会计算并只显示 houjinliang 文件夹的总大小。

    sudo du --max-depth=1 -h /mnt/ | sort -rh
    # 计算 /mnt 目录下第一层所有文件夹的大小,并按从大到小排序

2.2 交互式磁盘空间分析器: ncdu

  • ncdu 命令 (交互式磁盘空间分析器)。这是一个强烈推荐的工具,可以看作是 du 的超级升级版。它不是系统自带的,但非常值得安装。功能: 它会扫描你指定的目录,然后提供一个可交互的、可视化的文本界面,让你能方便地按大小排序、进入子目录、甚至直接删除文件。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # - **如何安装:**
    - Debian/Ubuntu: `sudo apt update && sudo apt install ncdu`
    - CentOS/RHEL: `sudo yum install ncdu`

    # - **如何使用:**

    # 扫描 /mnt 目录
    sudo ncdu /mnt
    # 命令执行后会有一个扫描过程,扫描结束后你就可以用键盘方向键自由探索了。

2.3 物理磁盘的结构: lsblk & fdisk

  • 查看磁盘和分区结构的工具 (lsblk, fdisk)。有时候你不仅想看容量,还想了解物理磁盘的结构,比如“我的服务器上到底有几块硬盘?每块硬盘是怎么分区的?”
    1
    2
    3
    4
    5
    lsblk
    # - **`lsblk` (List Block Devices):** 以树状结构清晰地列出所有磁盘和分区,非常直观。

    sudo fdisk -l
    # - **`sudo fdisk -l` (需要 sudo):** 一个更传统、更强大的分区工具。`-l` 参数可以列出详细的分区表信息,比 `lsblk` 更底层。

2.4 du的组合运用

  • 查看文件夹大小

    1
    2
    3
    4
    # sudo du -sh /mnt/chenzhengtao/

    user@3080server:/mnt$ sudo du -sh /mnt/chenzhengtao/
    119G /mnt/chenzhengtao/
  • ⭐如要查看当前目录已经使用总大小及当前目录下一级文件或文件夹各自使用的总空间大小

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # du -h --max-depth=1

    (py38mmyolo) houjinliang@3080server:~$ du -h --max-depth=1
    6.5M ./.config
    8.0K ./.conda
    1.1G ./.vscode-server
    12G ./cuda-11.3
    86G ./userdoc
    8.0K ./.gnupg
    16K ./.ssh
    8.0K ./.nv
    2.7G ./.cache
    24G ./miniconda3
    125G .
  • 文件夹大小与排序

    1
    # sudo du --max-depth=1 -h /mnt/ | sort -rh
  • ⭐批量输出目录下的文件夹的大小,脚本

    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
    #!/bin/bash

    # ==============================================================================
    # 脚本名称: calculate_dir_sizes.sh
    # 描述: 计算指定目录下第一层所有子目录的大小。
    # 作者: Gemini
    # 日期: 2025-09-04
    # ==============================================================================

    # 定义要扫描的目标目录
    TARGET_DIR="/mnt"

    # --- 主逻辑 ---

    # 检查目标目录是否存在
    if [ ! -d "$TARGET_DIR" ]; then
    echo "错误: 目录 ${TARGET_DIR} 不存在。"
    exit 1
    fi

    echo "正在计算目录 [${TARGET_DIR}] 下所有文件夹的大小..."
    echo "--------------------------------------------------"

    # 循环遍历目标目录下的每一个项目
    # 使用 find 命令可以更精确地只选择目录,避免处理文件
    # -mindepth 1 -maxdepth 1 确保只处理第一层子目录
    find "${TARGET_DIR}" -mindepth 1 -maxdepth 1 -type d | while read -r dir; do
    # 使用 sudo du -sh 计算每个目录的总大小
    # -s (summarize) 表示只显示总计大小
    # -h (human-readable) 表示使用易读格式 (K, M, G)
    sudo du -sh "${dir}"
    done

    echo "--------------------------------------------------"
    echo "计算完成。"

🐳 容器化环境

  • 实例环境:4090server2

Docker 安装配置

1. Docker安装 (需要管理员权限)

需要管理员用户!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Step 1 更新包索引 & 安装依赖
sudo apt update
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release

# Step 2 添加Docker GPG密钥
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Step 3 添加Docker仓库
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Step 4 安装Docker
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io

# Step 5 启动Docker服务
sudo systemctl enable docker
sudo systemctl start docker

2. 用户权限配置

  • 为了让非管理员用户也能使用docker,需要建立用户组,赋予用户组内的用户权限
1
2
3
4
5
6
7
8
9
10
11
12
# 创建docker组
sudo groupadd docker

# 将当前用户加入 docker 组
sudo usermod -aG docker $USER
# 将xxx用户加入 docker 组
sudo usermod -aG docker xxx

# 查看docker用户组用户 - 方法1
getent group docker
# 查看docker用户组用户 - 方法2
grep '^docker:' /etc/group

3. Docker镜像或代理

3.1 配置镜像服务器(很多镜像服务器已经不能用了)

1
2
3
4
5
6
7
8
9
10
11
12
13
vim /etc/docker/daemon.json

# 在json配置文件中,输入以下配置
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}

# 重启docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker

3.2 配置网络代理

  • Docker 代理

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # Docker pull代理配置
    sudo mkdir -p /etc/systemd/system/docker.service.d
    sudo vim /etc/systemd/system/docker.service.d/proxy.conf

    # 添加代理配置
    # 在json配置文件中,输入以下配置 -> (7890端口号是因为clash是代理的这个端口)
    [Service]
    Environment="HTTP_PROXY=http://127.0.0.1:7890/"
    Environment="HTTPS_PROXY=http://127.0.0.1:7890/"
    Environment="NO_PROXY=localhost,127.0.0.1"

    # 重启Docker服务
    sudo systemctl daemon-reload
    sudo systemctl restart docker
  • Container 代理

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 用户级代理(这个就不需要管理员用户了,使用自己的用户登录)
    vim ~/.docker/config.json

    # 在json配置文件中,输入以下配置 -> (7890端口号是因为clash是代理的这个端口)
    {
    "proxies":
    {
    "default":
    {
    "httpProxy": "http://127.0.0.1:7890",
    "httpsProxy": "http://127.0.0.1:7890",
    "noProxy": "localhost,127.0.0.1,.example.com"
    }
    }
    }

4. 测试安装

1
2
# 测试Docker安装
docker run --rm hello-world

image-20241205160737158

使用 Docker 部署 Overleaf

Config

1
2
3
4
5
6
7
8
# Step 1:下载源码
git clone https://github.com/overleaf/toolkit.git ./overleaf-toolkit && cd overleaf-toolkit

# Step 2:初始化配置
bin/init

# Step 3:建立服务
bin/up

image-20241205161651945

1
2
3
4
5
# 启动服务
bin/start

# 结束服务
bin/stop

因为服务是在远程服务器上,为了在本地能直接方法,需要修改端口和外网访问

./config/overleaf.rc中,需要修改以下字段:

1
2
OVERLEAF_LISTEN_IP=xx.xx.xx.xx # 远程服务器IP
OVERLEAF_PORT=80 # 默认是80

Overleaf 容器启动之后,可以打开 http://xx.xx.xx.xx:xx/launchpad 注册管理员帐户。之后我们就可以用这个帐户登录 Overleaf 平台。

网上教程中还给出了一些复杂的配置,后面根据需要再配置吧。

Writen in later

因为Overleaf官网对于免费用户,只有20s的编译时间,超过时间限制则无法编译。对于这种情况,只能付费解决。如果面对我遇到这样的情况的话,我可能也会选择付费的方式。但在网上看到了可以在服务器上搭建自己的Overleaf,所以想跟着教程自己试一下。按照教程一步步走下来,最后也配置成功了。也许最后并不会使用自己配置的这个,但折腾永不停息,万一用到了呢?!


🚀 Network Proxy(TODO)

Command Proxy

Ubuntu配置 命令行Clash 教程 - 知乎 (zhihu.com)

终端使用代理加速的正确方式(Clash) | Ln’s Blog (weilining.github.io)
2024.01.10
这部分是再服务器上完成的!

1
2
3
4
gunzip clash-linux-amd64-v1.18.0.gz
mv clash-linux-amd64-v1.18.0 clash
chmod u+x clash
./clash
1
在 ~/.config/clash/config.yaml 写入订阅的内容

image-20240110153702123

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vim ~/.bashrc

## 写一个proxy和unproxy的函数
function proxy() {
export http_proxy=http://127.0.0.1:7890
export https_proxy=$http_proxy
echo -e "proxy on!"
}
function unproxy(){
unset http_proxy https_proxy
echo -e "proxy off"
}

source ~/.bashrc
1
2
3
4
(base) houjinliang@3080server:~/userdoc$ proxy
proxy on!
(base) houjinliang@3080server:~/userdoc$ unproxy
proxy off
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# wget www.baidu.com
(base) houjinliang@3080server:~/MyDownloadFiles$ wget www.baidu.com
--2025-11-11 22:58:02-- http://www.baidu.com/
Resolving www.baidu.com (www.baidu.com)... 240e:ff:e020:99b:0:ff:b099:cff1, 240e:ff:e020:98c:0:ff:b061:c306, 183.2.172.177, ...
Connecting to www.baidu.com (www.baidu.com)|240e:ff:e020:99b:0:ff:b099:cff1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html’

# wget www.google.com
(base) houjinliang@3080server:~/userdoc$ wget www.google.com
--2024-01-10 15:34:14-- http://www.google.com/
正在连接 127.0.0.1:7890... 已连接。
已发出 Proxy 请求,正在等待回应... 200 OK
长度: 未指定 [text/html]
正在保存至: “index.html.1”

# curl -I www.baidu.com
(base) houjinliang@3090server:~$ curl -I www.baidu.com
HTTP/1.1 200 OK

(base) houjinliang@4090server:~$ curl -I www.google.com
HTTP/1.1 200 OK

💻 双系统的安装与配置

LabPC-Ubt 20.04

在读研的这几年里,教研室的这台电脑应该是陪伴我最长时间的,本文就记录一些在这台电脑上面搞了些什么东西吧,文中用LabPC来表示教研室的电脑。

为LabPC购买了两个完全一样的480GB固态硬盘,在安装系统的时候,为了区分好系统是安装到了哪个盘里,首先是仅接入了一个SSD。当把Windows系统安装到这个SSD之后,再把另一个SSD接上,之后再去安装Ubuntu。因为在Ubuntu系统安装的分区时,能看到不同硬盘的标号,只要确定好哪个硬盘里安装好了Windows系统,在另外的一个空盘里进行分区和安装Ubuntu就好了。

1. 先安装Windows10

之前装Windows系统的时候,我都喜欢使用官方的安装工具MediaCreationTool_Win11_23H2,用这个工具做一个U盘启动工具,但这次做U盘启动盘的时候总是报错,其实之前也遇到过了这个问题!遇到这个问题的话,可以下载Windows的镜像文件,然后用Rufus来制作U盘启动盘。

2. 再安装Ubuntu 20.04

设备 类型 挂载点 格式化? 大小
/dev/sda1 ext4 / 200GB
/dev/sda2 ext4 /boot 2GB
/dev/sda3 ext4 /tmp 20GB
/dev/sda4 ext4 /usr 80GB
/dev/sda5 ext4 /var 50GB
/dev/sda6 ext4 /home 100GB
/dev/sda7 swap 20GB
这个分区最后还是证明太过于复杂了
image-20231208211750504
Snipaste_2023-12-08_12-46-32
  • 磁盘0:KIOXIA 480GB ▶ Ubuntu 20.04
  • 磁盘1:KINGSTON SSD
  • 磁盘2:1TB HDD
  • 磁盘3:KIOXIA 480GB ▶ Windows 10

3. 双系统引导界面美化+修改默认启动项

ubuntu-vim-1080p

在Ubuntu系统,按照如下的步骤使用该主题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 解压
$ tar xvJf Vimix-1080p.tar.xz

# 进入解压后的文件夹
$ cd Vimix-1080p

# 安装
$ sudo ./install.sh

# 修改启动设置
$ sudo gedit /etc/default/grub

# 修改完成之后,对更改进行更新,将电脑重启后可看到更新后的主题效果
$ sudo update-grub

一般我们需要更改其中的 GRUB_DEFAULT(默认启动项:这个编号是你开机时看到的若干个启动项从上到下的依次编号,记住!编号是从0开始的,意思是,第一项是0,第二项是1,以此类推)、GRUB_TIMEOUT_STYLE(是否显示倒计时,hidden的属性表示不会显示倒计时,注释掉该行则显示倒计时)、GRUB_TIMEOUT(等待时间,单位是秒)。
按自身需求更改后,保存即可。

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
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
# info -f grub -n 'Simple configuration'

GRUB_DEFAULT=2
# GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=30
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"
GRUB_THEME="/usr/share/grub/themes/Vimix/theme.txt"

4. Ubuntu系统时间正确,Windows系统时间错误

在Ubuntu系统中执行如下操作

1
2
3
sudo apt-get install ntpdate                    //在Ubuntu下更新本地时间
sudo ntpdate time.windows.com
sudo hwclock --localtime --systohc //将本地时间更新到硬件上

5. Ubuntu无法连接网络

5.1 有线网络-拨号上网

1
2
3
4
$ npu481@npu481-H310M:~$ cat /sys/class/net/enp5s0/carrier
1 # 输入为1证明网线连接到了网口上了,证明硬件层面没有什么问题!

# 至于是不是代表着“有线网卡的驱动安装好了”,我也不清楚

PC的有线网上网连接方式是拨号上网,所以我得先建立一个拨号的链接。
按照下面的操作,添加一个DSL/PPPoE

1
$ nm-connection-editor

image-20231207214319121

  • 上网接口即为网线,这里是enp5s0
  • 用户名输入为上网账号,西工大的上网账号即为学号;
  • 服务,空着
  • 密码即为西工大的上网密码
1
$ sudo apt-get update

使用上面这种方法有一种问题是,每次开机之后电脑都没有网络,必须手动到网络设置中把有线网打开。

5.2 pppoeconf

1
2
$ sudo apt-get install pppoeconf
# 按照提示,输入上网账号和秘密即可,以后就能自动拨号了。

几个常用命令

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
npu481@npu481-H310M:~$ sudo pon dsl-provider # 联网
Plugin rp-pppoe.so loaded.
npu481@npu481-H310M:~$ sudo poff # 断网
npu481@npu481-H310M:~$ plog # 在断网状态下查看日志
Dec 8 10:54:40 npu481-H310M pppd[9905]: Terminating on signal 15
Dec 8 10:54:40 npu481-H310M pppd[9905]: Connect time 0.1 minutes.
Dec 8 10:54:40 npu481-H310M pppd[9905]: Sent 16471 bytes, received 24941 bytes.
Dec 8 10:54:40 npu481-H310M pppd[9905]: Connection terminated.
Dec 8 10:54:40 npu481-H310M pppd[9905]: Sent PADT
Dec 8 10:54:40 npu481-H310M pppd[9905]: Exit.
npu481@npu481-H310M:~$ sudo pon dsl-provider # 联网
Plugin rp-pppoe.so loaded.
npu481@npu481-H310M:~$ ifconfig # 在联网状态下查看网络状态
enp5s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::8dd3:2a85:6bb9:f6e prefixlen 64 scopeid 0x20<link>
ether 18:c0:4d:56:b9:c0 txqueuelen 1000 (以太网)
RX packets 102253 bytes 132719087 (132.7 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 38868 bytes 5981990 (5.9 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (本地环回)
RX packets 5850 bytes 526989 (526.9 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5850 bytes 526989 (526.9 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1492
inet 10.71.10.187 netmask 255.255.255.255 destination 10.68.0.1
ppp txqueuelen 3 (点对点协议)
RX packets 56 bytes 7807 (7.8 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 66 bytes 10491 (10.4 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

通过pppoeconf设置后,每次开机就能自动拨号了,但这样出现了一个很奇怪的现象是,网络设置中,有线的那个选项没有了,并且出现了“有线未托管”的字样。这样用起来没有什么问题,但我并不知道出现这种问题的原因是什么!

image-20231208211916678

5.3 无线网络和蓝牙

USB无线网卡不知道怎么弄

后续:买的这个USB无线为网卡不支持Linux,蓝牙适配器也不支持Linx!好吧,就只能先这样将就这就这样用吧~

6. 在Ubuntu安装常用软件

‘deb’软件

  • Nutstore
  • Chrome
  • Sunlogin
  • VSCode
1
2
$ sudo apt-get install -f # 
$ sudo dpkg -i nautilus_nutstore_amd64.deb

CFW

  • Step 1, install and setup

Github上的CFW已经删库了,唉!只能在网上找一找别人之前做到备份了.

1
2
3
4
$ tar -zxvf Clash.for.Windows-0.20.39-x64-linux.tar.gz
$ mv 'Clash for Windows-0.20.39-x64-linux' CFW
$ cd CFW
$ ./cfw
  • Step 2, 在CFW的Profiles中加入自己的配置文件,然后在Proxies中选择一个节点
  • Step 3, 打开Ubuntu 设置,在网络 - VPN - 网络代理中加入配置。

image-20231207214319121

flameshot(火焰截图)

  • 安装和启动
1
2
$ sudo apt install flameshot
$ flameshot gui
  • 绑定键盘快捷键

image-20231208211830829

ITX-Ubt 24.04

双系统安装

  • 2025.08.27
  • 没有一个Linux系统感觉还是不太行,于是决定再安装一个双系统。
买了一个铭瑄的512GB硬盘,还搞了一个硬盘支架
IMG_20250827_112249
IMG_20250827_113756
手动安装
不要选错了硬盘
精简分区
检查硬盘与分区
安装了俩小时才装完!
系统版本

用户配置

  • 2025.08.27
  • ubtitx
  • root

Win + L锁屏后不熄屏

短按win+l 会锁屏,然后关显示器; 按win+l 持续几秒钟,就会采用你设置的关屏时间,设置成never就永远亮着了。

Flameshot

1
sh -c "QT_QPA_PLATFORM=wayland flameshot gui"

感觉应该是Ubuntu24的QT的问题,直接使用gui的这个命令不行,得改成上面这个有前缀的才可以!

Ubuntu24和Win11双系统,Windows时间不正确

1
2
3
4
sudo apt install ntpdate
sudo apt install util-linux-extra # 在ubuntu24中安装hwclock
sudo ntpdate time.windows.com # 第一条命令是同步时间
sudo hwclock --localtime --systohc # 第二条命令是转换并写入硬件时钟的命令

Grub 主题

Ubuntu 24.04隐藏Dock状态栏的Windows未挂载分区图标

中文输入法

  • 2025.08.27
  • 使用Fcitx5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
安装 Fcitx5 和相关模块
sudo apt update
sudo apt install fcitx5 fcitx5-chinese-addons fcitx5-pinyin

# 设置默认输入法框架。在弹出的窗口中,选择 Yes,然后在接下来的列表中选择 fcitx5,最后点击 OK。
im-config

# 系统设置 (Settings)
在Keyboard中添加中文键盘

# Fcitx5 设置 (Fcitx5 Configuration)
找到 Fcitx5 Configuration
添加Pinyin输入法

# 通过键盘快捷键 Ctrl + Space 来切换到拼音输入法
很奇怪!不知道为什么后面这个智能拼音没有了,后面只能重新用Fcitx5 Configuration 的Pinyin了
Screenshot from 2025-08-27 17-10-16
Screenshot from 2025-08-27 17-10-36

Proxy - clashverge

ITX-Ubt 22.04 WSL

用户配置

  • murphyitxwsl@MurphyWinITX
  • root

忘记用户的密码了

  • 重置root密码

    1
    2
    3
    # 1. 以管理员身份打开 PowerShell
    wsl.exe --user root
    passwd root
  • 重置murphyitxwsl用户密码

    1
    2
    wsl.exe --user root
    asswd murphyitxwsl

✨ 系统Error解决记录

系统升级问题 Server OS Update,Ubuntu 18.04 -> 20.04

  • 实例:3080server, 3090server

1. 问题背景

3080Server和3090Server都是Ubuntu 18.04版本,由于Ubuntu 18.04已经“寿命将尽”,很多软件的维护都结束了,现在出现了一个很大的问题!VSCode 1.85之后的版本使用SSH-remote连不上服务器了!天杀的!Damn!只有两种解决方法:

  • 根据对应的发行版,升级至 Ubuntu 20.04 LTS、Debian 10 或 RHEL 8
  • 降级到 VS Code 1.85

2. 解决方法(一) VSCode降级

VSCode降级:November 2023 (version 1.85),安装1.85.2版本,然后关闭自动更新。VSCode怎么关闭自动更新 - 知乎

先把VSCode降级之后,将就用了一段时间,后面决定,不能就这么妥协了,我得去把实验室的服务器更新一下!

3. 解决方法(二) Ubuntu 18.04 → 20.04 升级

3.1 升级步骤

1
2
3
# 系统更新比较简单,直接一行命令,然后一路Y或Enter就行了。

sudo do-release-upgrade

3.2 遇到的问题

  • 网络连接问题(这台服务器之前就有这个问题)

连不上网的问题是最大的,也不记录中间怎么排查的了,就直接贴一下教程了: https://blog.csdn.net/qq_35395195/article/details/135700359

找了好久的方法,这个方式是有效的!但是,如果按照他说起,再改回false的话,重启后的电脑还是之前连不上网络的状态,还需要重走一边教程。所以最后采取了保持true。这样重启后,会自动联网!

1
2
3
4
5
6
7
8
9
10
11
# 先停止NetworkManager服务
sudo systemctl stop NetworkManager

# 修改/etc/NetworkManager/NetworkManager.conf,将[ifupdown]的managed=false改为managed=true
sudo gedit /etc/NetworkManager/NetworkManager.conf

删除/var/lib/NetworkManager/NetworkManager.state(删除后会重新生成这个文件)
sudo rm /var/lib/NetworkManager/NetworkManager.state

启动NetworkManager服务
sudo systemctl start NetworkManager
  • NVIDIA驱动问题
  • 升级后重新安装显卡驱动
  • 在”软件与更新”中选择合适的驱动版本

nVidia驱动,这个问题比较好解决,因为有GUI桌面,直接在软件更新中把驱动换上就行。

1
2
3
4
5
6
7
# 修改SSH端口
sudo vim /etc/ssh/sshd_config

# Port xxxx
sudo systemctl restart sshd

## 但是!需要注意,不要改错文件了!我改了半天的ssh_config!我说怎么一直不生效!改错了!!!废了好大的劲!!!
  • 3090server升级遇到的问题

这次比较顺利,遇到的问题还是网络和驱动的问题。

首先,在还没有更新的时候查看了一下当前的网络配置,比较抽象,为什么是docker桥接的网络,不知道咋回事,不管了!

image-20250619135329540

更新完成之后遇到一个问题,之前的网线连接的网卡指示灯不亮,我不知道是还没有缓冲好还是咋了,我直接换了另外一个网卡了,指示灯亮了。然后使用nm-connection-editornmtui就配好了PPPOE,但是这时候的IP是跟之前不一样了,算了,也不管了,能用就行。

image-20250619140341789

第二个问题是切换英伟达驱动的时候遇到的!

1
2
3
# 两个命令解决。
sudo dpkg --configure -a
sudo apt update && sudo apt upgrade

image-20250619135639080

Failed to initialize NVML: Driver/library version mismatch

  • 实例:4090server

环境正常运行了很长一段时间,但是突然有一天,在运行程序的时候出现了这样一个报错!

1
ERROR: cuda is not available, try running on CPU

这个error是我自己的程序里写得报错提示,系统的cuda不可用了?!这是咋回事?!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(base) houjinliang@4090server:~$ nvidia-smi
Failed to initialize NVML: Driver/library version mismatch
NVML library version: 535.216

(base) houjinliang@4090server:~$ nvitop
NVML ERROR: RM has detected an NVML/RM version mismatch.

(sr_benchmark) houjinliang@4090server:~$ python
Python 3.8.19 (default, Mar 20 2024, 19:58:24)
[GCC 11.2.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> print(torch.cuda.is_available())
/mnt/houjinliang/miniconda3/envs/sr_benchmark/lib/python3.8/site-packages/torch/cuda/__init__.py:80: UserWarning: CUDA initialization: Unexpected error from cudaGetDeviceCount(). Did you run some cuda functions before calling NumCudaDevices() that might have already set an error? Error 804: forward compatibility was attempted on non supported HW (Triggered internally at ../c10/cuda/CUDAFunctions.cpp:112.)
return torch._C._cuda_getDeviceCount() > 0
False

鉴定为Ubuntu默认内核自动更新,导致与NVIDIA驱动程序不兼容.

Ubuntu开机卡在了紫屏,进入不了用户登陆界面

  • 示例 LabPC-Ubt

不知道怎么回事,有一次从Ubuntu启动的时候卡在了紫屏进不来系统了。也不知怎么解决网上搜了搜说是内核的问题,也有说是英伟达驱动的问题,不知道怎么回事,于是重启之后,在开机时候选择了Ubuntu的高级选项,然后选了一个Recovery模式的内核,可以进入登陆界面,但是显示缩放不正常,并且双屏中只有一个屏幕有输出图像。这个现象和英伟达显示驱动有问题一模一样,所以就打开了附加驱动,果然当前的选择是X.Org X Server,重新选择了Nvidia驱动之后,然后重启,正常选择Ubuntu就能正常进入系统了。

image-20231208211848886


【🌿 持续更新】 瞧瞧我在Ubuntu系统上干了些什么!
https://blog.cosmicdusty.cc/post/Tools/Working-With-Ubt/
作者
Murphy
发布于
2023年11月1日
许可协议