云计算百科
云计算领域专业知识百科平台

只学够用的Linux!零基础核心知识点(下)

目录

引言:

2.1 网络下载 wget /curl/aria2c

wget(最简单,适合普通下载)

curl(通用 http 工具,不仅能下载,还能发网络请求)

aria2c(多线程下载神器,大文件强烈推荐)

2.2 打包和压缩 tar /zip/unzip /7z

tar 命令

zip /unzip(和 Windows 互通)

7z(高压缩率)

2.3 文档处理补充 wc /grep/sed

wc 文本统计

grep 文本搜索,查找日志关键字

sed 文本替换,批量字符串替换

2.4 符号链接和硬链接 ln

符号链接(软链接,Windows 快捷方式)

硬链接 ln(不带 – s)

2.5 后台任务和终端复用器 bg/fg/jobs/nohup/screen/tmux

传统后台任务管理

不被挂断的任务

终端复用器 (tmux   screen)

2.6 系统资源查询

任务管理器 top /htop

进程中止 kill /pkill 

磁盘相关

网络状态查看

2.7 磁盘挂载 mount /umount

什么是挂载?

2.8 环境变量

export 设置环境变量

PATH(最重要环境变量)

LD_LIBRARY_PATH 动态库路径

2.9 Bash 配置文件~/.bashrc source

2.10 拾遗补缺

watch:定时重复执行命令

tee:同时输出到终端 + 保存文件

diff:比较文件差异

uname 查看系统内核信息

终端容易误触快捷键汇总

结语:


 

引言:

上篇文章讲了关于学习Linux时必须了解的核心基础知识,感兴趣的可以阅读:只学够用的Linux!零基础核心知识点(上)-CSDN博客,

这一章将继续介绍一些实际使用中非常常见的功能,不过它们是否需要学习因人而异。如果你认为完全用不到某个小节的内容,可以直接跳过。

另外,阅读第 1 章后读者应该已经对 Linux 初步熟悉了,因此从第 2 章开始,本教程的写作风格将会变得精简。


2.1 网络下载 wget /curl/aria2c

这一节将介绍三个工具wget、curl 和 aria2c, 服务器环境没有浏览器,下载文件全部依靠命令行工具,其中wget 最易用,aria2c 最强大,三个工具熟悉其中一个就够用。

wget(最简单,适合普通下载)

# 安装
sudo apt install wget -y

# 基础下载,保存为原文件名
wget https://example.com/file.zip

# -O 指定保存文件名
wget -O myfile.zip https://example.com/file.zip

# -P 指定下载保存到某个目录
wget -P /data/downloads https://example.com/file.zip

# -c 断点续传,大文件网络中断后接着下
wget -c https://example.com/file.zip

curl(通用 http 工具,不仅能下载,还能发网络请求)

#安装
sudo apt install curl -y

# -O大写,使用远程原文件名保存
curl -O https://example.com/file.zip

# -o小写,自定义保存文件名
curl -o myfile.zip https://example.com/file.zip

# -L 跟随网页重定向,绝大多数下载链接必须加这个参数
curl -L -O https://example.com/file.zip

# 断点续传
curl -L -C – -O https://example.com/file.zip

aria2c(多线程下载神器,大文件强烈推荐)

类似 Windows IDM 下载器,支持多线程并发下载,默认自带断点续传

#安装
sudo apt install aria2 -y

#基础下载
aria2c https://example.com/file.zip

# -x -s 设置并发线程,16线程加速下载
aria2c -x 16 -s 16 https://example.com/file.zip

# -o 指定文件名
aria2c -o myfile.zip https://example.com/file.zip

# -d 指定保存目录
aria2c -d /data/downloads https://example.com/file.zip

小提示:AI 大模型权重文件体积巨大,优先使用aria2c。


2.2 打包和压缩 tar /zip/unzip /7z

本节将介绍以下工具:tar, zip, unzip, 7z。

tar:Linux 原生打包工具,可以保留权限、所有者元信息;zip:跨 Windows 最通用;7z:压缩率最高。

tar 是一个打包工具,但它可以帮忙调用 gzip, zstd 等压缩工具实现打包+压缩。同时 tar 可以将 Linux 文件系统里的对象元数据储存(例如所有者、所属用户组、对象权限等),因此在 Linux 里 tar 是最地道的打包方式。

tar 命令

这几个参数几乎永远都一起使用,因此可以直接背下来,它们的含义分别是:

  • c:创建归档
  • x:解包归档
  • v:显示正在处理的文件
  • z:使用 gzip 压缩/解压
  • f:后面紧跟归档文件名

# 仅打包(不压缩)
tar -cvf archive.tar dir/

# 解包
tar -xvf archive.tar

# 打包+gzip压缩 .tar.gz
tar -cvzf archive.tar.gz dir/

# 解压tar.gz
tar -xvzf archive.tar.gz

高级提速用法:

# 1. 多线程 gzip 压缩
# tar 默认调用的 gz 压缩器仅支持单线程压缩,pigz 压缩器支持多线程,速度更快
# 首先确保安装了 pigz 这个软件包
sudo apt install pigz -y
# 然后压缩/解压时去除 -z 参数,使用 -I 指定压缩器为 pigz
tar -I pigz -cvf archive.tar.gz dir/
tar -I pigz -xvf archive.tar.gz

# 2. zstd 压缩
# zstd 是相比 gzip 更好的压缩算法,它更快,而且通常压缩率更高
# 首先确保安装了 zstd 这个软件包
sudo apt install zstd -y
# 然后压缩/解压时去除 -z 参数,使用 –zstd 指定使用 zstd 算法
tar –zstd -cvf archive.tar.zst dir/
tar –zstd -xvf archive.tar.zst

zip /unzip(和 Windows 互通)

#安装
sudo apt install zip unzip -y

#压缩目录 -r递归
zip -r archive.zip dir/

#解压
unzip archive.zip

7z(高压缩率)

sudo apt install p7zip-full -y

#压缩 a代表add添加
7z a archive.7z dir/

#解压 x代表解压
7z x archive.7z

注意:7z 压缩速度慢,适合归档备份,不适合日常快速打包。


2.3 文档处理补充 wc /grep/sed

服务器排查日志、批量修改配置文件必用三件套。

wc 文本统计

如果你有一个纯文本,需要统计它的长度和行数信息,可以使用 wc 命令。

  • 命令:wc(意为 word count)
  • 用途:统计文本信息
  • 核心参数:
    • 位置参数:想统计文件的路径
    • -l:只统计行数
    • -w:只统计单词数
    • -c:只统计字节数
    • -m:只统计字符数

不加任何参数时,wc 默认统计行数、单词数、字节数,输出格式如下:

[行数] [单词数] [字节数] [文件名]

# 默认输出:行数 单词数 字节数 文件名
wc test.txt

# -l只统计行数
wc -l test.txt

# -w统计单词
wc -w test.txt

# -c统计字节
wc -c test.txt

grep 文本搜索,查找日志关键字

简要常用参数:-i忽略大小写,-n显示行号,-r递归搜索,-v反向过滤,-C显示上下文

如果你希望在文本中搜索某个模式(pattern),grep 是一个非常强大的工具。

  • 命令:grep(意为 global regular expression print)
  • 用途:文本搜索
  • 核心参数:
    • 位置参数 1:搜索内容的正则表达式
    • 位置参数 2:想搜索文件的路径
    • -i:忽略大小写
    • -n:显示行号
    • -r:递归搜索目录
    • -v:显示不匹配的行
    • -w:只匹配完整单词
    • -F:按普通字符串匹配,不解析正则表达式
    • -C 行数:显示匹配行前后各 n 行

grep 是一个强大的工具,因此参数非常多,上面我只挑选了最核心的参数,下面是一些示例。

#查找包含error的行
grep "error" access.log

#显示匹配行+行号
grep -n "error" access.log

#递归搜索整个logs目录所有文件
grep -r "error" logs/

#-v反向,过滤掉debug行,只看剩下内容
grep -v "debug" access.log

#-C 2 打印匹配行,同时打印前后各2行上下文
grep -C 2 "error" access.log

# 打印包含单词err的行,不会匹配error中的err
grep -w "err" access.log

#-F把搜索内容当普通字符串,不解析正则符号. *
grep -F "192.168.1.100" access.log

sed 文本替换,批量字符串替换

如果你希望在文本中替换某个字符串,可以使用 sed 命令,其查找部分默认按照正则表达式解释。

  • 命令:sed(意为 stream editor)
  • 用途:文本编辑(常用于字符串替换)
  • 核心参数:
    • 位置参数 1:替换方式
    • 位置参数 2:想修改文件的路径
    • -i:直接修改源文件,保存后不可恢复!

指定替换方式的位置参数 1 的最常用的用法如下:

#输出到终端预览替换效果,不会修改原文件
sed 's/旧字符串/新字符串/g' test.txt

#-i直接修改源文件,全部替换(g代表全局)
sed -i 's/Before/After/g' test.txt

#分隔符可以换成! #,避免路径斜杠冲突
sed -i 's!/opt/old!/opt/new!g' test.txt

 -i参数代表直接修改源文件,操作前务必备份文件!

这里提一下备份文件操作,如何备份原始日志文件 test_log.txt :

cp test_log.txt test_log.txt.bak

逐段解析:

cp:copy 复制命令    test_log.txt:源文件,我们的原始日志, test_log.txt.bak:备份文件,后缀.bak是行业通用备份后缀,方便一眼识别是备份文件

如果想把备份文件还原回原日志文件:

cp test_log.txt.bak test_log.txt

这里可以拓展一下在备份的时候可以加上时间戳,防止多次备份覆盖旧备份:

cp test_log.txt test_log.txt.$(date +%Y%m%d_%H%M%S).bak

$(date +%Y%m%d_%H%M%S):命令替换,执行 date 命令,拼接年月日_时分秒,示例生成文件名就是:test_log.txt.20261017_203010.bak

sed 自带备份参数:

在执行sed替换,同时生成备份文件:

sed -i.bak 's/error/ERR/g' test_log.txt

注意:-i和.bak中间不能有空格,不能写成 -i .bak,会报错!


2.4 符号链接和硬链接 ln

符号链接(软链接,Windows 快捷方式)

符号链接相当于一个快捷方式,如果原始文件/目录是 a,那么创建一个符号链接 b 指向 a 后,通过 b 就可以直接访问到 a,如图所示:

 

语法:ln -s 原文件/目录 链接路径

#创建链接link.txt指向original.txt
ln -s original.txt link.txt

#创建家目录下project软链接指向/data/project
ln -s /data/project ~/project

特性:

  • 删除软链接不会影响原文件;删除原文件,软链接失效变红(断链)
  • 可以跨磁盘、跨分区;目录、文件都可以做软链接 实战场景:磁盘满了,把数据迁移到新盘,创建软链接保持旧路径不变,代码不需要修改路径。
  • mv /mnt/disk_a/project_data /mnt/disk_b
    ln -s /mnt/disk_b/project_data /mnt/disk_a/project_data

    硬链接 ln(不带 – s)

    硬链接和符号链接不同,它并不是一个“快捷方式”。创建硬链接后,两个文件名的地位完全相同,它们共同指向同一个 inode(文件数据节点),就仿佛两个 C 语言指针指向同一个对象。如图所示:

    Linux 会记录一个 inode 被多少个文件名引用,这个数量称为链接数。创建上述硬链接后,链接数为 2;删除 original.txt 或 hardlink.txt 中任意一个后,链接数变成 1,文件数据仍然存在。只有两个文件名都被删除后,链接数才会归零,文件数据才会被删除。

    通过 ln 命令也能创建硬链接,只有同文件系统的文件可以创建硬链接:ln 原对象 链接名

    # 创建硬链接 link.txt 指向 original.txt
    ln original.txt link.txt

    特性重点:

  • 多个文件名指向同一个磁盘 inode 数据;删除其中一个,数据不会消失,全部删除才删除数据。
  • 不能跨分区,不能给目录创建硬链接,只支持普通文件。
  • 硬链接是不会消耗多倍存储空间的,文件只会被储存一遍。

  • 2.5 后台任务和终端复用器 bg/fg/jobs/nohup/screen/tmux

    在一个 Shell 中,运行一个命令后它就独占了整个 Shell,如果这个命令很耗时,那此时就无法再运行第二个命令了。这时候我们有多种解决方案,分别是 Linux 传统的前后台任务机制以及更为强大易用的终端复用器。此外,本节还会提供“SSH 断开后运行的任务被终止”的解决方案。

    痛点场景:SSH 远程服务器跑训练任务,如果关闭终端 / 网络断开,普通进程直接被杀掉。

    传统后台任务管理

    (1)将前台任务挂到后台

    假如运行了一个极为耗时的命令:

    sleep 3600

    此时希望将其切到后台,让开 Shell,那么可以按键盘快捷键 Ctrl + Z。此时 Shell 会弹出提醒,代表着命令已经被挂到后台,同时已经被暂停了:

    如果我们希望在后台它继续运行,需要使用命令:

    bg

    此时 Shell 会弹出提醒,代表挂到后台的任务重新开始在后台运行了:

    (2)直接新建后台任务

    如果你已经知道一个命令很耗时,打算直接把它挂到后台,那么可以在命令的末尾添加 & 符号,代表直接新建后台任务:

    sleep 1800 &

    此时,执行完命令后它就直接进入后台并继续运行了,不会占用 Shell,同时会弹出提醒:

    (3)将后台任务取回前台

    若要将后台任务取回前台,可以使用命令:

    fg

    如果此时有多个后台任务,默认取回最近一个。也可以通过序号来指定,首先用命令列出所有后台任务:

    jobs

    会以列表打印出所有后台任务和任务的状态:

    [1] Running sleep 3600 &
    [2]- Running sleep 1800 &
    [3]+ Stopped sleep 2400

    然后使用 %序号 来指定要取回前台的后台任务:

    fg %1 # 取回任务1
    fg %2 # 取回任务2
    fg %3 # 取回任务3

    不被挂断的任务

    对于普通任务,当 SSH 或者 Shell 关闭时,任务都会收到来自 Shell 的 SIGHUP 信号而被终止。如果希望任务在 SSH 或者 Shell 关闭时继续正常运行,就需要 nohup 命令了。

    nohup:挂断 SSH 进程不会被杀

    SIGHUP 信号:ssh 断开会发送这个信号终止程序,nohup 屏蔽该信号。

    在命令前添加 nohup 即可创建不被挂断的任务:

    nohup python train.py

    如果希望直接创建不被挂断的后台任务,可以使用:

    nohup python train.py &

    如果希望把任务的输出导出保存为文件,可以使用下面的写法(最常见的组合):

    nohup python train.py >train.log 2>&1 &

                                        │             │        └─ 挂到后台

                                        │             └────── 将 stderr 写入 stdout(即 train.log)

                                        └───────────────── 将 stdout 写入 train.log

    终端复用器 (tmux   screen)

    (1)tmux 工具(强烈推荐,替代 nohup,AI 训练首选)

    比 nohup 好用,会话独立,断开 ssh 再重连可以恢复之前终端界面。

    #安装
    sudo apt install tmux

    #新建会话并命名
    tmux new -s train

    # 在tmux窗口里面随便跑程序 python train.py
    # 脱离会话(后台继续跑)快捷键:Ctrl+B,松开,再按D

    #查看所有会话
    tmux ls

    #重新接入会话
    tmux attach -t train

    示例:

    (2)screen 工具

    //没有的话首先安装
    sudo apt install screen
    //创建会话
    screen -S train
    // 脱离 Ctrl+A 松开 D
    // 查看已有的会话
    screen -ls
    // 指定会话名重新进入
    screen -r train

    重要提醒:远程跑长时间任务优先tmux,不建议裸用 nohup。


    2.6 系统资源查询

    Windows 有任务管理器来查看系统资源的使用情况,相同的,Linux 也有丰富的工具来查询和管理系统资源,本节将会介绍以下工具:

    • 任务管理器(CPU、内存和进程):top, htop
    • 进程中止:kill, pkill
    • 磁盘状态查看:du, df, lsblk, iotop
    • 网络状态查看:ifconfig, iftop, nload

    任务管理器 top /htop

    本节将会介绍查看管理 CPU、内存和进程的任务管理器 top 和 htop,前者是绝大多数 Linux 发行版都会自带的系统组件,后者需要手动安装,但是更为强大和好用。

    (1)top 工具(table of processes)

    使用 top 命令即可打开任务管理器,打开后用 q 或 Ctrl + C 退出。top 会占满终端并自动刷新,界面如下:

    首先看到顶部的五行信息,理解如下:

    top – 16:30:14 up 25 min, 2 users, load average: 0.15, 0.52, 0.59
    当前时间;系统已运行时间;当前登录用户数;过去 1、5、15 分钟的平均负载
    Tasks: 299 total, 1 running, 297 sleeping, 1 stopped, 0 zombie
    进程总数;正在运行的进程数;休眠进程数;已停止进程数;僵尸进程数
    %Cpu(s): 4.0 us, 8.0 sy, 0.0 ni, 88.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
    用户进程占用;内核占用;调整过 nice 的进程占用;CPU 空闲;等待 I/O;硬件中断;软件中断;被虚拟机宿主机占用
    MiB Mem : 3863.4 total, 601.0 free, 1190.3 used, 2308.9 buff/cache
    物理内存总量;空闲内存;已使用内存;缓冲区和缓存
    MiB Swap: 3867.0 total, 3867.0 free, 0.0 used, 2673.1 avail Mem
    Swap 总量;Swap 空闲;Swap 已使用;预计可用物理内存

    除了显示当前系统的状态外,top 还能显示和管理进程,这就是下面的表格显示的内容。首先看到表头,每一列的含义是:

    • PID – 进程编号
    • USER – 启动该进程的用户
    • PR – 进程调度优先级,数值越小优先级越高
    • NI – 进程 nice 值,数值越小优先级越高
    • VIRT – 虚拟内存总量
    • RES – 实际驻留在物理内存中的大小
    • SHR – 共享内存大小
    • S – 进程状态:R 运行,S 可中断睡眠,D 不可中断睡眠,T 已暂停,Z 僵尸进程,I 空闲内核线程
    • %CPU – CPU 使用率
    • %MEM – 物理内存使用率
    • TIME+ – 进程累计占用 CPU 的时间
    • COMMAND – 进程对应的命令或程序名

    然后我们就可以用 ↑ ↓ 和 PGUP PGDN,来滚动和翻页整个表格了,除此之外,还可以输出大写 P 以 CPU 占用排序,输入大写 M 以内存占用排序。

    (2)htop 工具

    htop 相当于加强版的 top,它的界面更美观易用,同时功能也更强大,一般来说我更喜欢用 htop。首先安装它:sudo apt install htop -y

    使用 htop 命令即可打开任务管理器,打开后用 q 或 Ctrl + C 退出。htop 会占满终端并自动刷新,界面如下:

    可以发现,htop 最明显的区别就是界面更美观了,还有一个区别就是 htop 不仅可以纯键盘操作,还可以用鼠标操作。例如可以用滚轮来滚动进程列表,点击表头可以切换排序列以及排序方向,点击下方的按钮可以选择功能。

    因此 htop 的使用难度就很低了,这里简单介绍一下两个常用的功能:

    • 搜索:按 F3 或者鼠标点击 Search 按钮,接着就可以用关键字搜索进程了。
    • 中止:高亮选中一行进程后按 F9 或者鼠标点击 Kill 按钮,会进入信号发送界面,选择 15 SIGTERM 发送来请求中止进程,或者发送 9 SIGKILL 来强制中止进程。

    进程中止 kill /pkill 

    上一节介绍的 htop 已经有中止进程的功能了,不过 Linux 自身也有专门的命令。

    (1)kill 命令:杀死指定 ID 进程

    使用 kill 进程ID 来杀死进程,进程 ID 可以通过 top 或者 htop 查到。

    kill 默认发送 SIGTERM 即请求中止进程,如果进程已经完全卡死不响应,可以发送 SIGKILL 来强制中止进程,使用 kill -9 进程ID

    #通过PID杀进程,PID来自top/htop
    kill 12345

    #强制杀死卡死进程 SIGKILL
    kill -9 12345

    (2)pkill 命令:杀死指定正则表达式的进程

    使用 pkill 正则表达式 来杀死进程,所有进程名匹配上正则表达式的进程都会被一起杀死,因此可能一次杀多个。

    pkill 默认匹配进程名,如果想匹配完整的启动命令,可以使用 -f 参数,例如:

    pkill -f "python.*train.py"

    同样,pkill 默认发送 SIGTERM 即请求中止进程,如果进程已经完全卡死不响应,可以发送 SIGKILL 来强制中止进程,使用 pkill -9 正则表达式

    #pkill按进程名字匹配批量杀进程
    pkill -f "python train.py"
    pkill -9 -f "python train.py"

    磁盘相关

    (1)du(disk usage):统计目录 / 文件实际占用磁盘大小

    -s 参数表示只显示汇总结果,不每行列出所有对象的大小,-h 参数让容量自动使用 KB、MB、GB 等易读单位。du -sh 的调用方式基本上是最常用的固定搭配:

    # -s汇总,-h人类可读单位KB/MB/GB
    du -sh /var/log # 查看一个目录的总大小
    du -sh /var/log/* # 查看一个目录下所有对象的大小

    (2)df:查看整个文件系统挂载分区剩余空间

    -h 参数让容量自动使用 KB、MB、GB 等易读单位,因此最常使用的是:

    df -h

    (3)lsblk:查看机器全部磁盘、分区和挂载关系(找 U 盘新硬盘)

    lsblk

    输出类似:

    NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS

    sda 8:0 0 500G 0 disk

    ├─sda1 8:1 0 1G 0 part /boot

    └─sda2 8:2 0 499G 0 part /

    sdb 8:16 0 2T 0 disk

    └─sdb1 8:17 0 2T 0 part /data

    示例:

    其中重要的列有:

    • NAME – 设备名称
    • SIZE – 容量
    • TYPE – 类型,例如 disk 为整块磁盘,part 为分区
    • MOUNTPOINTS – 挂载位置

    (4)iotop 工具:查询磁盘 I/O

    有时候磁盘空间并没有满,但系统仍然非常卡,这可能是某个程序正在大量读写磁盘。此时可以使用 iotop 查看各进程的磁盘读写情况。

    //安装
    sudo apt install iotop
    //运行
    sudo iotop

    它的使用方式和 top 类似,会实时显示各进程的磁盘读写速度。其中主要关注:

    • DISK READ – 磁盘读取速度
    • DISK WRITE – 磁盘写入速度
    • COMMAND – 对应的程序

    按方向键可以导航,按 q 可以退出。

    网络状态查看

    (1)ifconfig 命令:查询网络接口

    ifconfig 可以查看计算机的网络接口、IP 地址以及网络流量等信息。

    #ifconfig查看网卡ip(旧工具)
    sudo apt install net-tools
    #运行
    ifconfig

    示例:

    现代系统替代 ifconfig 命令:ip addr

    这里最常关注的是:

    • eth0 – 网络接口名称(一般物理网口以 eth, ens, eno, enp 开头)
    • inet – IPv4 地址和子网掩码
    • inet6 – IPv6 地址和前缀长度
    • RX – 接收的数据包累计数量和累计大小
    • TX – 发送的数据包累计数量和累计大小

    另外,ifconfig 是比较经典的工具,现在较新的 Linux 系统主要使用 ip 命令代替它,使用 ip addr 命令的效果和 ifconfig 类似。

    (2)iftop 工具:查询网络连接流量

    如果想知道“到底是哪个远程地址正在占用网络”,可以使用 iftop。

    # 安装
    sudo pat install iftop -y
    #运行
    sudo iftop

    iftop 会实时显示本机与其他地址之间的网络连接以及对应流量,因此比较适合排查:

    • 哪个服务器正在大量传输数据
    • 当前主要连接到了哪些地址
    • 哪条网络连接占用了最多带宽

    如果计算机有多个网卡,可以指定网络接口:

    sudo iftop -i eth0

    按 q 退出。

    (3)nload 工具:查询网卡总流量

    如果并不关心具体是哪个连接,只想看看当前总下载和上传速度,那么 nload 会更加直观。

    #安装
    sudo apt install nload -y
    #运行
    nload

    界面中会分别显示:

    Incoming

    当前下载速度

    Outgoing

    当前上传速度

    如果计算机存在多个网络接口,可以使用 ← 和 → 切换。按 q 退出。


    2.7 磁盘挂载 mount /umount

    什么是挂载?

    对于 Windows 用户来说,挂载是很陌生的概念。因为 Windows 如果接入了新磁盘,格式化后就直接显示为新盘符了(例如 E:\\ 盘)。

    Linux 没有 Windows 盘符概念;磁盘必须挂载到某个目录节点才能访问。 桌面版 Ubuntu 插入 U 盘自动挂载;服务器版不会自动挂载,需要手动操作。

    看到下图示例,假如一台计算机有两块磁盘分别为 A 和 B,我们可以让 A 磁盘储存根目录,称为系统盘,可以让 B 磁盘仅储存用户的用户文件,成为用户盘。那么,就可以将 B 磁盘的文件系统挂载到 /home 目录下,这样,所有储存在 /home 目录里面的内容,实际写入的磁盘是 B,而其他的目录均写入磁盘 A。

    本节主要讲可移动设备(例如U盘、移动硬盘)的挂载和卸载。

    挂载磁盘

    插入设备后,可以先使用前面介绍过的 lsblk 查看,例如:

    NAME              SIZE TYPE MOUNTPOINTS

    sda                   500G disk

    └─sda1            500G part  /

    sdb                     64G disk

    └─sdb1              64G part

    这里 /dev/sda1 已经挂载到根目录 /,而新插入的 /dev/sdb1 的 MOUNTPOINTS 为空,说明它还没有挂载。

    注意,通常需要挂载的是磁盘中的分区,例如 /dev/sdb1,而不是整块磁盘 /dev/sdb。

    #1.先lsblk确认设备,例如新U盘分区 /dev/sdb1

    #2.创建挂载点空目录
    sudo mkdir -p /mnt/usb

    #3.挂载分区到目录,使用mount
    sudo mount /dev/sdb1 /mnt/usb

    #4.用完卸载!!拔出U盘前必须umount,防止数据损坏
    #注意命令是umount,不是unmount!!
    sudo umount /mnt/usb

    踩坑提示:卸载提示target is busy,说明有终端或者程序还在进入这个挂载目录,切到别的目录再卸载。


    2.8 环境变量

    在 Linux 的安装教程、软件配置和开发环境中,经常可以看到下面这样的命令:

    export PATH="/opt/myapp/bin:$PATH"

    export LD_LIBRARY_PATH="/opt/myapp/lib:$LD_LIBRARY_PATH"

    export CUDA_VISIBLE_DEVICES=0,1,2,3

    这些命令都与环境变量有关。本节将简单介绍环境变量是什么,并重点介绍两个非常常见的特殊环境变量:PATH 和 LD_LIBRARY_PATH。

    export 设置环境变量

    普通 Shell 变量默认只属于当前 Shell。从当前 Shell 启动其他程序时,这些程序并不会自动获得普通变量。

    如果希望变量能够传递给当前 Shell 启动的程序,可以使用 export 将其导出为环境变量:

    #导出环境变量
    export MY_VAR="hello world"

    #查看全部环境变量
    env

    #临时只对这一条命令生效,不改变全局环境
    CUDA_VISIBLE_DEVICES=0 python train.py

    简单理解:

    • 普通变量:主要供当前 Shell 自己使用。
    • 环境变量:除了当前 Shell 可以使用,还会传递给它启动的子进程。

    可以使用 env 查看当前环境中的所有环境变量

    环境变量的用法和普通 Shell 变量类似,在上篇文章的 1.7节 已经讲过。不过有一个用法需要注意,环境变量既可以设置到当前 Shell 的环境中(重启 Shell 后失效),并传递给之后启动的子进程,也可以临时仅给某个命令使用。临时使用的语法为:

    MY_ENV=my-env-value  要运行的命令

    例如在 Python 人工智能训练中极为常见的指定计算卡的用法,就是临时设定的环境变量:

    CUDA_VISIBLE_DEVICES=0 python train.py

    PATH(最重要环境变量)

    PATH 是 Linux 中最重要的环境变量之一,它决定了 Shell 去哪些目录寻找命令。

    使用 echo $PATH 查看当前的 PATH,将会显示一个使用冒号 : 分隔的目录列表

    如果要新增一个 PATH 目录,可以用下面的命令。请注意一定不要覆盖 PATH,而是用冒号拼接,因为如果直接覆盖 PATH 会导致其他大多数命令 Shell 全部都找不到了。

    可以使用 which 查看某个命令实际对应的位置:which ls。一般来说会输出:/usr/bin/ls。即 Shell 通过遍历 PATH 后,在 /usr/bin/ls 找到了 ls 命令。

    例如:

    #查看PATH
    echo $PATH

    #千万不要直接PATH=xxx会把系统命令全部搞丢!!!追加写法
    export PATH="/opt/myapp/bin:$PATH"

    #which查看命令实际程序位置
    which ls

    另外,PATH 中越靠前的目录优先级越高。如果不同目录中存在同名命令,Shell 通常会优先找到排在前面的那个。

    LD_LIBRARY_PATH 动态库路径

    很多 Linux 程序并不是把所有功能都包含在自己的可执行文件中,而是运行时还需要加载一些动态链接库,当程序运行时需要找到这些库文件,而这类动态链接库文件通常以 .so 结尾动态库,这个变量告诉系统去哪里找库文件,例如:

    libexample.so
    libexample.so.1

    如果说上一节的 PATH 是告诉 Shell 到哪些目录寻找可执行程序,那么 LD_LIBRARY_PATH 就是告诉动态链接器到哪些额外目录寻找动态链接库。

    #正确设置 LD_LIBRARY_PATH 后,程序就可能正常找到对应的库。
    export LD_LIBRARY_PATH="/opt/myapp/lib:$LD_LIBRARY_PATH"

    #ldd查看程序依赖哪些动态库
    ldd /usr/bin/ls

    与 PATH 类似,LD_LIBRARY_PATH 中也可以包含多个目录,使用 : 分隔,并且靠前的目录具有更高的查找优先级:

    export LD_LIBRARY_PATH="/path/a:/path/b:$LD_LIBRARY_PATH"


    2.9 Bash 配置文件~/.bashrc source

    在前面的内容中,我们已经接触过环境变量、命令别名等配置。不过如果只是在终端直接写 export、alias,关闭终端时就会全部失效;写进.bashrc每次打开终端会自动加载。

    .bashrc 是什么?

    .bashrc位于家目录,~/.bashrc,它的文件名以 . 开头,因此它属于隐藏文件,可以使用 ll 别名或者 ls -al 查看它。

    .bashrc 本质上就是一份 Shell 脚本。每次启动交互式 Bash 时,Bash 通常会读取并执行其中的内容。因此,平时可以直接在 Bash 中执行的很多配置命令,也可以写进 .bashrc,让它们以后自动执行。

    #编辑
    nano ~/.bashrc

    (1)长期保存环境变量

    例如前文介绍过,如果希望将 /opt/myapp/bin 加入 PATH,直接在终端中执行时,只对当前 Shell 生效。如果把这一行加入 ~/.bashrc(位置一般不重要,加到末尾即可):

    #环境变量
    export PATH="/opt/myapp/bin:$PATH"

    这样每次打开Bash时都会执行这条命令。

    (2)设置命令别名

    我们可以自己设定别名,给一个比较长的命令取一个更短的名字,例如:

    #命令别名,简化长命令
    alias ll='ls -alF'
    alias cac='conda activate'

    如果直接在Shell中执行 alias 同样只是临时生效,写入 .bashrc 后,每次打开Bash 都会自动创建这些别名。

    不过一般建议 .bashrc 主要用于 Shell 配置,不要在里面加入耗时很长、需要用户输入或者会产生大量输出的命令,否则每次打开 Shell 都会受到影响。

    (3)新加载 .bashrc

    修改 .bashrc 后,新打开的 Bash 通常会读取新的配置,因此最简单的方法是关闭并重新打开终端。如果不想重新打开终端,也可以让当前 Bash 立即重新执行 .bashrc:

    #完整形式
    source ~/.bashrc
    #简写等同
    . ~/.bashrc

    小知识:source venv/bin/activate本质就是执行脚本修改当前 shell 环境。


    2.10 拾遗补缺

    补充几个非常实用、但内容较少的命令。

    watch:定时重复执行命令

    watch 可以每隔一段时间(默认 2 秒)重复执行某个命令,并不断刷新终端中的显示结果,需要退出时按 Ctrl + C。示例如下:

    #每2秒刷新一次看GPU状态
    watch nvidia-smi

    #-n 指定间隔秒数 du=disk usage 查看磁盘占用 -s 只输出总和
    #每隔一秒查看一次output目录有多大
    watch -n 1 du -sh ./output

    tee:同时输出到终端 + 保存文件

    > 重定向只输出文件,屏幕看不到;tee 两者兼顾

    不加 -a 的 tee 是覆盖:先清空这个文件,再写入新内容。

    #输出会直接进入文件,不显示在终端
    ls > files.txt
    #输出到终端 + 将内容保存到文件
    ls | tee file.txt
    #-a追加写入
    ls | tee -a file.txt

    diff:比较文件差异

    diff 可以比较两个文件的内容差异:

    #普通对比
    diff old.txt new.txt

    如果两个文件完全相同,通常不会输出任何内容;如果存在差异,则会显示发生变化的位置和内容。

    更常见的统一格式:

    #-u统一格式,可读性更高,+新增,-删除
    diff -u old.txt new.txt

    输出中:

    • 以 – 开头的内容表示旧文件中的内容
    • 以 + 开头的内容表示新文件中的内容

    例如:

    -Hello

    +Hello World

    表示原来的 Hello 被修改成了 Hello World。

    uname 查看系统内核信息

    直接执行 uname 一般会输出 Linux,即内核名称。通常我们使用 -a 参数打印出完整信息,这样更实用,执行 uname -a 后,我手上的 Ubuntu 24.04.4 LTS 输出以下内容:

    #打印完整内核硬件信息
    uname -a

    #查看Ubuntu发行版本号
    cat /etc/os-release

    例如:

    终端容易误触快捷键汇总

    在终端中,有些快捷键可能会因为误触导致看着像“卡住” 或任务突然暂停:

    快捷键现象恢复操作
    Ctrl+S 终端卡住,敲字符无输出 按Ctrl+Q恢复输出
    Ctrl+Z 程序暂停挂后台 输入fg切回前台
    Ctrl+C 中断正在运行程序,通常无法恢复 重新运行命令
    Ctrl+D 直接退出当前 shell 重新打开 / 重连 ssh

    结语:

    本章没有去深挖 inode 原理、进程信号的内核源码,而是优先解决我们平时用服务器最常遇到的痛点:文件怎么高速下载、大文件怎么打包、长时间任务怎么防止断连中断、磁盘满了怎么排查、动态库和 PATH 环境变量该怎么配置。这些工具不是孤立的,在实际工作中经常组合使用:用aria2c下载数据集,tar解压,grep筛选日志,tmux挂起训练,htop和nload监控资源。

    学习建议:不要死记硬背,收藏本文,遇到实际业务场景回来复制示例敲一遍。 后面可以自己学习系统服务 systemctl、rsync 同步、防火墙 ufw 等进阶工具。

     

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 只学够用的Linux!零基础核心知识点(下)
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!