0%

Linux 命令指南

概述

发展

  • 1991 Linus Linux 0.0.1 版,代码为 8K 行。Linux 加入了 GNU,整体基于 GPL 协议,允许开源、分享传播、修改。
  • 现在使用的 Linux 版本是 Manjaro 20.0.3 (安装版本,滚动更新)

特点

  • 免费、开源
  • 稳定、高效、省资源
  • 安全性:病毒相对较少,不容易更新崩,崩了基本能自救。
  • 多任务多用户多线程
  • 庞大的社区支持、生态环境好
  • 应用方向
    • 服务器:主流
    • 嵌入式:稳定、对网络支持性好,低成本、方便修改、对内存和文件管理优越(最小只要 4m 内存)
    • 桌面环境:近年来飞速发展,目前选择 KDE

组成

Kernel:内核:核心程序,管理硬件设备、系统线程进程、内存、交换空间、文件系统、守护进程等。
Shell:人机交互界面,连接了用户与 Linux 内核,让用户高效、安全、低成本地使用 Linux 内核。。

  • 如 Bourne shell(sh),Korn shell(ksh)、C shell (csh)、Bourne-again shell(bash)、Z SHell(zsh)、CHange SHell(chsh)、tcsh。常用 bash

User Application:用户应用程序:如 Chromium、GIMP 等
Files System:文件系统

Linux 文件系统

linux 所有设备都是文件

  • /:根目录,Linux 有且只有一个根目录,所有东西从这开始,一般只放目录,/home 指的是根目录下的 home 目录。
  • /bin :BINaries,常用二进制可执行命令文件,如 lstarmvcat 等。
  • /boot:linux 系统启动时引导相关文件,如 Linux 的内核文件:/boot/vmlinuz,系统引导管理器。
  • /dev :DEVices,系统中所有特殊设备文件, 存放 Linux 系统下的设备文件,访问该目录下某个文件,相当于访问设备,常用的是挂载光驱 mount /dev/cdrom/mnt
  • /etc :ETCetera,系统配置文件,如 /etc/inittab/etc/fstab/etc/init.d/etc/X11/etc/sysconfig/etc/xinetd.d
  • /home:存放普通用户的根目录,如 /home/user_name
  • /root:存放 root 用户的相关文件,系统管理员 root 的家目录
  • /lib :LIBraries,库文件,存放不能直接运行的,却是许多程序运行所必需的一些函数库文件。
  • /mnt:MouNT,临时挂载其他的文件系统,如光驱、软驱
  • /media :挂载本地磁盘或其他存储设备
  • /opt:OPTion,第三方软件放置目录
  • /proc:PROCesses,虚拟的目录,是系统内存的映射,可直接访问这个目录来获取系统信息。
  • /sbin:Super BINaries, Superuser BINaries,存放具有一定权限(root)才可以使用的命令。如 fdiskshutdownmount 等。一般用户只能查看,不能使用
  • /srv | SeRVices | 网络服务进程所需的数据文件。常见的服务例如 WWWFTP 等。
  • /sys | SYStem | 虚拟文件系统,主要记录与内核相关的信息,包括目前已加载的内核模块与内核检测到的硬件设备信息,同样不占硬盘容量
  • /tmp:一般用户或正在执行的程序临时文件存放目录,任何人都可以访问,重要数据不可放置在此目录下
  • /usr| Unix System/Software/Shared Resources | 系统应用程序和相关文件,“Unix 操作系统软件资源” 所放置的目录,不是用户数据。 FHS 建议所有的软件开发者应该将他们的数据合理的放置到这个目录下的子目录,而不是自行新建该软件自己独立的目录。用户工具与应用程序
    • /usr/bin :存放应用程序
    • /usr/share :存放共享数据
    • /usr/lib :系统使用的函数库目录,
    • /usr/local:存放软件升级包。
    • /usr/share/doc:系统说明文件存放目录。
    • /usr/share/man:程序说明文件存放目录
  • /etc/fstab | FileSystem TABle | 文件/etc/fstab 包含了静态文件系统信息,定义了存储设备和分区整合到整个系统的方式。mount 命令会读取这个文件,确定设备和分区的挂载选项。
  • /tmp | TeMPorary | 公用的临时文件存储点/var | VARiable | 存放经常变化的文件。比方说各种服务的日志文件 account/cache/lib/log/tmp/mail/spool/var/log/message:所有的登录文件存放目录/var/spool/mail:邮件存放的目录/var/run 程序或服务启动后,其 PID 存放在该目录下
  • /lost+found:系统异常产生错误时,会将一些遗失的片段放置在此目录下

万物皆文件

  • /proc:文件虚拟系统:用于内核与内核模块向进程 process 发送信息的机制,该伪文件系统允许与内核内部数据结构交互,获取有关进程的有用信息,在运行中改变设置,与其他文件系统不同,/proc存在于内存而不是硬盘中

    • 系统中的任一个进程,在 proc 的子目录中都有一个同名的进程 ID,可找到 cmdline、mem、root、stat、statm 及 status
    • 系统信息:/proc/stat:包括 CPU 占用情况、磁盘空间、内存对换、中断等
    • IO 信息:/proc/ioports
    • 网络相关:/proc/net/*
    • CPU 信息:/proc/cpuinfo 中包含中央处理器的当前准确信息
    • 负载信息:/proc/loadavg:系统负载信息
    • 系统内存信息:/proc/meminfo:系统内存的详细信息
  • 日志文件:Out of memory

    1
    sudo grep "Out of memory" /var/log/syslog

文件类别

文件属性

  • 蓝色:目录文件
  • 绿色:可执行文件:内置命令、内建于 shell 的命令(如 cd)、用户程序、shell 脚本等
  • 蓝色:链接文件:link
  • 红色:压缩文件:tar、zip 等
  • 灰色:其他文件

路径

  • 目录路径
    • 不带尾斜杠:指整个目录,包括目录本身
    • 带尾斜杠:指目录中的文件,不包括目录本身
  • 文件路径不用带尾斜杠
  • 绝对路径:以 / 开头的,从根目录去描述该文件或文件夹的路径。
  • 相对路径:从当前目录去描述某文件或文件夹下的路径。
    • .:表示当前目录,pwd
    • ..:表示上一级目录,即父目录
    • 根目录下的 ... 都表示当前目录

安装软件

apt:Advanced Packaging Tool

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
# debian
debian

# ubuntu
apt/apt-get
# redhat-centos
yum install python

# .deb
gdebi

# .rpm, RPM Package Manager
fedora
wget https://….rpm
rpm -i helloworld.rpm

rpm -i xx.rpm # 安装
rpm -ivh name.rpm
rpm -e pkg1 # 删除
rpm -U file1.rpm # 升级
rpm -q # 查询
rpm -V # 校验已安装的软件包
rpm -K # 校验软件包中的文件

# tar.gz
tar -vxf helloworld.tar.gz
./configure
make
make install


# 查看安装了哪些软件
dpkg -l
apt list --installed | grep xx

命令常识

  • 大小写敏感:Linux 中文件名与命令名是大小写敏感的,File1file1 是两个不同的文件名
  • 隐藏文件. 开头的文件是隐藏文件,一般作为一些配置使用,ls 不能列出,需要 ls -a
  • 文件扩展名:Linux 没有文件扩展名的概念,但应用程序有,所以才有对应的扩展名。
  • 文件名:Linux 支持长文件名,可包括空格、格点符号,但:请不要在文件名中使用空格,标点符号只使用 ._-
  • console:控制台,硬件,早期的对电脑进行操作的计算机部件,一个电脑只有一个 console
  • tty(teletypewriter):硬件,输入的,电传打字机
  • terminal:终端,硬件,早期物理终端,多个用户操作同一电脑
  • shell:软件程序,操作系统的操作界面
  • Command Line:命令行:

基本命令

  • 文件目录管理
1
2
3
4
5
6
增: touch、mkdir
删: rm、rmdir
改: cd、mv、cp、vi
看: ls、stat、du、tail
查: find、grep、which、whereis
打包: tar、zip、unzip
  • 用户权限管理
1
2
3
4
5
看: id
改: su、sudo、passwd
用户: useradd、userdel、usermod
组: groupadd、groupdel、groupmod
文件: chmod、chown、chgrp
  • 系统管理
1
2
3
4
5
服务: systemctl
性能监控: top、free、nvidia-simi、iostat
磁盘: du、df、lsblk、mount、umount
网络: ping、ssh、scp、wget、netstat
进程: ps、kill、nohup

终端快捷键

  • Tab:自动补全
  • Ctrl+a:移动光标到行首,即 Home
  • Ctrl+e:移动光标到行尾,即 End
  • ALT + F:跳向下一个空格
  • ALT + B:跳回上一个空格
  • Ctrl+u:剪切光标到行首的所有内容
  • Ctrl+k:剪切光标到行尾的所有内容
  • Ctrl+&:恢复上面删除的单词
  • Ctrl+y:将剪切的文本粘贴到光标位置
  • Shift + Insert:向终端内粘贴文本
  • Ctrl+s 暂停当前程序,暂停后按下任意键恢复运行
  • Ctrl+q 继续屏幕输出
  • Ctrl+z 将当前程序放到后台运行,恢复到前台为命令 fg
  • Ctrl+l:清屏,即 clear 命令
  • Shift+PgUp:将终端显示向上滚动,类 pgup
  • Shift+PgDn:将终端显示向下滚动,类 pgdn
  • Ctrl+r搜索命令历史
  • Ctrl+p:历史中的上一条命令,即 up
  • Ctrl+n:历史中的下一条命令,即 down
  • Ctrl+d:关闭,exit
  • Ctrl+c:终止进程/命令
  • CTRL+F:forward one window:向前
  • CTRL+B: backward one window:向后滚屏
  • CTRL + SHIFT + V: 粘贴(Linux 中不需要复制的动作,文本被选择就自动被复制)

技巧

  • 文本编辑器:vi/vim 必备

  • tab 补全:补全命令、补全目录、补全命令参数

  • date:显示或设置系统时间与日期

  • cal:日历 calendar

  • history:终端执行过的所有命令,history 5:最近使用的 5 个命令

    • !n:执行对应序号的命令
    • !!:调用上一个命令
  • Shell 通配符

    ; 同一行的分隔符
    * 匹配 0 或多个字符,常用来匹配多个文件
    匹配任意一个字符文件名通配符(单个文件)
    [list]:匹配 list 中的任意单一字符
    [!list]: 匹配 除 list 中的任意单一字符以外的字符
    [c1-c2]: 匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z]
    {string1,string2,...}:匹配 string1 或 string2 (或更多) 其一字符串
    {c1..c2}: 匹配 c1-c2 中全部字符 如{1..10}

alias

alias:设置命令的别名

1
2
alias update='sudo pacman -Syyu'
alias py = 'python'

xdg-open

xdg-open:默认方式打开文件

1
xdg-open 'aa.txt'

watch

watch:每 2 秒重复执行命令

1
2
3
4
# 实时查看
watch -n 0.5 -d nvidia-smi
-n # 时间间隔,单位为 s
-d # 高亮显示差异部分

常用

1
2
3
4
5
6
7
8
9
10
11
12
#查看目录下最大的十个文件
du -h|sort -h -r|head -n 10
#xargs使管道输入的每一行,都执行xargs 参数的命令
#统计代码行数
find . -name "*.cpp" -o -name "*.h" |xargs wc -l

# 查找一天内改动过的文件(加 -delete 可删除)
find ./ -mtime -1 -type f
#命令行快速查找代码
grep -G "xxx"
#快速终止进程
ps -a | grep chrome |xargs kill -9

批处理

  • ; 从左到右依次执行命令(前后无逻辑关系,不管是否正确,都会一个个执行)
1
ls; cd / ;
  • &&:从左到右依次执行命令,中间有一个失败则停止(顺序执行)
    • ||:前面的执行成功,后面的不会执行,前面的执行失败,后面的会执行(二选一)
1
command1 && command2 && command3 || command_final;

|:管道

| :管道输出,把上一个命令的结果交给|的后面的命令处理

  • 管道:利用缓冲传输介质内存或文件连接两个进程;按字符流读写,先进先出,解决互斥同步
1
2
ls | grep aa
ls /bin /usr/bin | sort |uniq |less

& 后台执行

  • &:在后台执行
    • &&】前面的执行成功,才会执行后面的,前面的执行不成功,后面的不会执行
1
2
# 前面在后台跑,然后执行后面的程序
pwd & cat index.html

I/O 重定向

  • 后台程序使用 nohup 时, 会默认将输出写入 nohup.out 文件,输出较多时 nohup.out 会不断的增大,此时需对输出进行重定向
    • 0:标准输入
    • 1:标准输出
    • 2:标准错误信息输出
1
2
3
4
5
6
7
8
9
10
11
ls -l /usr/bin > ls-output.txt # > 重定向标准输出到文件,覆盖原文件
ls -l /usr/bin >> ls-output.txt # >> 重定向标准输出到文件,追加到原文件后
ls -l /usr/none 2> ls-error.txt # 2> 重定向标准错误

< # 重定向输入
ls >/dev/null 2>&1

# 只输出错误信息
nohup ./program >/dev/null 2> {log_file_path} &
# 连错误信息也不需要
nohup ./program >/dev/null 2>&1 &

web 服务器

1
2
# 将当前目录下的所有文件以端口号 7777 暴露给所处网络的所有用户
python -m http.server 7777

帮助信息 -whereis/whatis/man/help

whereis:查看命令的执行路径
whatiswhatis command:查看命令的简要说明
infoinfo command:查看命令的详细描述
which:查看命令的可执行程序位置
man:manual:显示命令手册页,对用户命令、系统调用、c 库函数、设备与网络接口、文件格式、游戏与屏保、环境/表/宏、系统管理员命令和后台运行命令的帮助。具体参数与使用方法
help:获取帮助,查看命令的用法和相关参数。
type:显示命令的类别,说明怎样解释一个命令行。
apropos:显示一系列适合的命令。

which/where

which:在 PATH 变量指定的路径中,搜索某个命令的位置,并返回第一个搜索结果

1
2
3
4
-n  指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名
-p  与-n 参数相同,但此处的包括了文件的路径
-w  指定输出时栏位的宽度
-V  显示版本信息

whereis:whereis 命令是定位可执行文件、源代码文件、帮助文件在文件系统中的位置。

1
2
3
4
5
6
7
-b 定位可执行文件
-m 定位帮助文件
-s 定位源代码文件
-u 搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件
-B 指定搜索可执行文件的路径
-M 指定搜索帮助文件的路径
-S 指定搜索源代码文件的路径

维护

  • debian 系的所有操作记录在 /var/log/auth.log

参考资料

文件与目录管理

touch

touch:创建文件或更改文件的时间,更新时间戳:文件的访问和修改时间改为当前时间。(建立空文件夹)

1
2
3
4
5
6
-a 或--time=atime 或--time=access 或--time=use  只更改存取时间
-c 或--no-create  不建立任何文档
-d  使用指定的日期时间,而非现在的时间
-f  此参数将忽略不予处理,仅负责解决 BSD 版本 touch 指令的兼容性问题
-m 或--time=mtime 或--time=modify  只更改变动时间
-r  把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同 -t  使用指定的日期时间,而非现在的时间

mkdir

mkdir:make directories:创建目录

1
2
3
4
# 递归多级创建,已存在则不创建,不报错,好用
mkdir -p aa/bb/cc

mkdir -m 777 dd # 设置权限

rm

rm :remove:删除文件或目录

1
2
3
4
5
rm -r dir1  # recursive 递归删除
rm -f aa # 强制删除,系统不再提示
rm -i *.txt # 删除前需确认
rm *.log # 删除.log 后缀文件
rm -rf dir1 # 删除非空目录

rmdir

rmdir :remove empty directory:删除空目录

1
2
rmdir -p aa  # 递归删除
rmdir -v # 显示执行过程

cd

cd:Change Directory, 切换工作目录,cd mydir

1
2
3
cd - # 返回进入此目录之前所在的目录
cd .. # 返回上级目录
cd ~ # 返回当前用户主目录

mv/cp/rename

mv:move:移动或重命名现有的文件或目录。

1
2
3
4
5
-b :若需覆盖文件,则覆盖前先行备份
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖
-u :若目标文件已经存在,且 source 比较新,才会更新(update)
-t : --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY,即指定 mv 的目标目录,该选项适用于移动多个源文件到一个目录的情况,此时目标目录在前,源文件在后

cp:copy:复制文件或目录,并保持文件的权限、属主和时间戳

1
2
3
4
5
6
7
8
9
10
-t --target-directory 指定目标目录
-n --no-clobber 不要覆盖已存在的文件(使前面的 -i 选项失效)
-f --force 强行复制文件或目录,不论目的文件或目录是否已经存在
-u --update 使用这项参数之后,只会在

cp -a tool /home/vpser/www /*把 tool 目录,复制到 www 目录下 */
cp -r sourceFolder newFolder # 递归复制文件夹
cp -p # 连同文件的属性一起复制,常用地备份
cp -i # interactive,若目标文件存在,则在覆盖前询问
cp -u # update,源文件的修改时间较目的文件更新时,或是对应的目的文件并不存在,才复制文件

rename:rename:文件批量改名,

1
2
rename .rm .remb *把所有文件的后辍由 rm 改为 rmvb
renam "re/A-Z/a-z/" *把所有文件名中的大写改为小写

ln

ln:link:创建硬链接或符号链接

1
2
3
4
5
6
7
8
9
10
11
-b 删除,覆盖以前建立的链接
-d 允许超级用户制作目录的硬链接
-f 强制执行
-i 交互模式,文件存在则提示用户是否覆盖
-n 把符号链接视为一般目录
-s 软链接(符号链接)
-v 显示详细的处理过程
选择参数:

-S “-S<字尾备份字符串> ”或 “--suffix=<字尾备份字符串>”
-V “-V<备份方式>”或“--version-control=<备份方式>”

sort

sort

1
2
3
sort name.txt
sort -r name.txt #降序
sort -t: -k 3n /etc/passwd |more # 以第三个字段对/etc/passwd 的内容排序

vi/vim

vi:visual improved:文本编辑

1
2
3
4
vim +10 aa.txt # 打开文件并跳到第 10 行
vim +/hello aa.txt # 打开文件跳到第一个匹配的行
vim -R aa.txt # 只读方式打开
:w !sudo tee %

rsync

rsync:remote sync:远程同步,linux 下的数据镜像备份工具,增量传输数据

  • 特点:会检查发送发和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)
  • 功能
    • 镜像保存
    • 增量同步
    • 远程拷贝 scp
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
67
68
69
70
71
72
73
74
75
# 常用
rsync -avz --delete -e 'ssh -p 28949' --chown=0:0 /cygdrive/d/workspace/rsync_test
root@47.89.xxx.xxx:/root


# -e: 指定ssh的端口
rsync -avz -e 'ssh -p 28949' root@47.89.xxx.xxx:/root/rsync_test /cygdrive/d/workspace
rsync -avzP --chown=0:0 --chmod=644 /cygdrive/d/workspace/test root@192.168.xx.xx::test

#还有一种更先进的chmod方式,可以指定到具体的文件夹和文件
--chmod=Dg+s,ug+w,Fo-w,+X
--chmod=D2775,F664
#D代表目录,F代表文件,ugo,应该代表user、group、other
rsync -avzP --chown=0:0 --chmod=644 --exclude='Suite' /cygdrive/d/workspace/test root@192.168.xx.xxx::test

rsync -a source [destination] # 可递归同步 + 同步元信息
rsync -r source [destination] # 将源目录同步到目标目录
rsync -r source1 source2 destination # 多个目录同步到目标目录

rsync /etc/fstab /tmp # 在本地同步
rsync -r /etc 172.16.10.5:/tmp # 将本地/etc 目录拷贝到远程主机的/tmp 下,以保证远程/tmp 目录和本地/etc 保持同步
rsync -r 172.16.10.5:/etc /tmp # 将远程主机的/etc 目录拷贝到本地/tmp 下,以保证本地/tmp 目录和远程/etc 保持同步
rsync /etc/ # 列出本地/etc/目录下的文件列表
rsync 172.16.10.5:/tmp/ # 列出远程主机上/tmp/目录下的文件列表

rsync -avz --delete source/ destination
rsync -avu --delete /home/user/A/* /home/user/B/

# -v: 显示 rsync 的详细过程,-vvv 时会有更详细的信息
# 加了--delete 才会保证是镜像副本,否则 rsync 只确保源目录的所有内容都复制到目标目录,
rsync -av --exclude='*.txt' source/ destination # 排除一些文件
rsync -av --exclude='dir1/*' source/ destination
rsync -av --exclude={'dir1/*','test.txt'} source/ destination

rsync -av --exclude={'dir_root_name/dir1/*','dir_root_name/dir2/*'} ./dir_root_name user@ip:/home/user/project_dir # dir_root_name在project_dir下

rsync -anv source/ destination
-a:递归同步 + 同步元信息
-n:模拟执行,并不是真正执行
-v:将结果输出到终端

-a、--archive 参数表示存档模式,保存所有的元数据,比如修改时间(modification time)、权限、所有者等,并且软链接也会同步过去。
--append 参数指定文件接着上次中断的地方,继续传输。
--append-verify 参数跟--append 参数类似,但会对传输完成后的文件进行一次校验。如果校验失败,将重新发送整个文件。
-b、--backup 参数指定在删除或更新目标目录已经存在的文件时,将该文件更名后进行备份,默认行为是删除。更名规则是添加由--suffix 参数指定的文件后缀名,默认是~。
--backup-dir 参数指定文件备份时存放的目录,比如--backup-dir=/path/to/backups。
--bwlimit 参数指定带宽限制,默认单位是 KB/s,比如--bwlimit=100。
-c、--checksum 参数改变 rsync 的校验方式。默认情况下,rsync 只检查文件的大小和最后修改日期是否发生变化,如果发生变化,就重新传输;使用这个参数以后,则通过判断文件内容的校验和,决定是否重新传输。
--delete 参数删除只存在于目标目录、不存在于源目标的文件,即保证目标目录是源目标的镜像。
-e 参数指定使用 SSH 协议传输数据。
--exclude 参数指定排除不进行同步的文件或文件夹,支持通配符,比如--exclude="*.iso", --exclude "output"
--exclude-from 参数指定一个本地文件,里面是需要排除的文件模式,每个模式一行。
--existing、--ignore-non-existing 参数表示不同步目标目录中不存在的文件和目录。
-h 参数表示以人类可读的格式输出。
-h、--help 参数返回帮助信息。
-i 参数表示输出源目录与目标目录之间文件差异的详细情况。
--ignore-existing 参数表示只要该文件在目标目录中已经存在,就跳过去,不再同步这些文件。
--include 参数指定同步时要包括的文件,一般与--exclude 结合使用。
--link-dest 参数指定增量备份的基准目录。
-m 参数指定不同步空目录。
--max-size 参数设置传输的最大文件的大小限制,比如不超过 200KB(--max-size='200k')。
--min-size 参数设置传输的最小文件的大小限制,比如不小于 10KB(--min-size=10k)。
-n 参数或--dry-run 参数模拟将要执行的操作,而并不真的执行。配合-v 参数使用,可以看到哪些内容会被同步过去。
-P 参数是--progress 和--partial 这两个参数的结合。
--partial 参数允许恢复中断的传输。不使用该参数时,rsync 会删除传输到一半被打断的文件;使用该参数后,传输到一半的文件也会同步到目标目录,下次同步时再恢复中断的传输。一般需要与--append 或--append-verify 配合使用。
--partial-dir 参数指定将传输到一半的文件保存到一个临时目录,比如--partial-dir=.rsync-partial。一般需要与--append 或--append-verify 配合使用。
--progress 参数表示显示进展。
-r 参数表示递归,即包含子目录。
--remove-source-files 参数表示传输成功后,删除发送方的文件。
--size-only 参数表示只同步大小有变化的文件,不考虑文件修改时间的差异。
--suffix 参数指定文件名备份时,对文件名添加的后缀,默认是~。
-u、--update 参数表示同步时跳过目标目录中修改时间更新的文件,即不同步这些有更新的时间戳的文件。
-v 参数表示输出细节。-vv 表示输出更详细的信息,-vvv 表示输出最详细的信息。
--version 参数返回 rsync 的版本。
-z 参数指定同步时压缩数据。

参数

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
最常用的选项组合是"avz",即压缩和显示部分信息,并以归档模式传输
-v:显示 rsync 过程中详细信息。可以使用"-vvvv"获取更详细信息。
-P:显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显示进度信息的)。
-n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看 rsync 是如何工作的。
-a --archive :归档模式,比-r 更强,除了会递归同步外,还会同步元信息(如修改时间、权限等)等同于"-rtopgDl"。
-r --recursive:递归到目录中去。
-t --times:保持 mtime 属性。强烈建议任何时候都加上"-t",否则目标文件 mtime 会设置为系统时间,导致下次更新
:检查出 mtime 不同从而导致增量传输无效。
-o --owner:保持 owner 属性(属主)。
-g --group:保持 group 属性(属组)。
-p --perms:保持 perms 属性(权限,不包括特殊权限)。
-D :是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。
-l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
-z :传输时进行压缩提高效率。
-R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。用法见下文示例。
--size-only :默认算法是检查文件大小和 mtime 不同的文件,使用此选项将只检查文件大小。
-u --update :仅在源 mtime 比目标已存在文件的 mtime 新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。
-d --dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝 dir1 目录,使用该选项将拷贝 dir1 但不拷贝 file1。
--max-size :限制 rsync 传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"--max-size=1.5m")
--min-size :限制 rsync 传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
--exclude :指定排除规则来排除不需要传输的文件。
--delete :以 SRC 为主,对 DEST 进行同步。多则删之,少则补之。注意"--delete"是在接收端执行的,所以它是在
:exclude/include 规则生效之后才执行的。
-b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀。
--backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
-e :指定所要使用的远程 shell 程序,默认为 ssh。
--port :连接 daemon 时使用的端口号,默认为 873 端口。
--password-file:daemon 模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程 shell 认证的密码,而是 rsync 模块认证的密码。
-W --whole-file:rsync 将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效。
--existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。
--ignore-existing:要求只更新目标端不存在的文件。和"--existing"结合使用有特殊功能,见下文示例。
--remove-source-files:要求删除源端已经成功传输的文件。

ls

ls:List Directory Contents:列出目录下的内容

1
2
3
4
5
6
7
8
9
10
11
12
ls -lh
-a 所有,包括.开头的隐藏文件
-t 时间排序
-d 仅列出目录
-l 详细信息,列出文件夹的内容,一行一个文件
-R 递归列出所有文件,(内容较多)
ls -lih
inode 文件种类和权限 硬链接个数 属主 所归属的组 文件或目录大小 最后访问或修改时间 名称
2095119 -rw-r--r-- 1 root root 0 11-16 14:43 test.log
# 文件种类和权限:-rw-r--r--,-表示为文件,权限三位一组,三组,表示属主、所归属的用户组,其它用户
# 硬链接个数: 数值为1,即无硬链接,仅它本身

tree

tree:以树状格式显示文件目录

1
tree -L 2

lsof

lsof:list open files:查看文件。

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
-a 列出打开文件存在的进程
-c<进程名> 列出指定进程所打开的文件
-g 列出 GID 号进程详情
-d<文件号> 列出占用该文件号的进程
+d<目录> 列出目录下被打开的文件
+D<目录> 递归列出目录下被打开的文件
-n<目录> 列出使用 NFS 的文件
-i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号> 列出指定进程号所打开的文件
-u 列出 UID 号进程详情
-h 显示帮助信息
-v 显示版本信息

# 列出谁在使用某个文件
lsof {file_path}
# 列出谁在使用某个端口
lsof -i :8090
# 列出某个用户打开的文件信息
lsof -u username
# 列出某个程序进程所打开的文件信息
lsof -c mysql
# 通过某个进程号显示该进程打开的文件
lsof -p 123123
# 网络连接
lsof -i
# tcp 连接
lsof -i cp
# 列出某个用户的所有活跃的网络端口
lsof -a -u test -i

file/stat

file:查看文件类型或文件属性信息

cat/more/less

cat:catenate:查看文件,连接两个或者更多文本文件或以标准输出形式打印文件内容

more:按页显示文件内容

less:按页显示文件内容,允许在文件中滚动浏览并检索信息,不加载整个文件件的前提下显示文件内容,常用来看大型日志文件

1
2
3
4
5
6
cat filename
-n number:给所有输出行编号
-s squeeze-blank:将所有连续的多个空行替换为一个空行

# 查找 record.log 中包含 AAA,但不包含 BBB 的记录的总数:
cat -v record.log | grep AAA | grep -v BBB | wc -l

echo

echo:输出

1
2
echo 'text' > a.txt  # 覆盖写入
echo 'text' >> b.txt # 追加写入,如果文件不存在则创建

tee

tee:读取标准输入的数据,并将内容输出成文件

1
2
3
4
5
tee -a # append,追加
tee -i # ignore-interrupts,忽略中断信号

tee file1 file2 # 在两个文件中复制内容
echo 'text' | tee -a file1 # 将text追加到file1

wc

wc:打印行、字和字节数

1
2
3
4
5
wc 统计文本的行数、字数、字符数(word count)
-m 统计文本字符数
-w 统计文本字数
-l 统计文本行数
ls |wc -l # 统计有多少个文件

tail/head

tail -10 aa.log:文件的尾部 10 行,常用于查看日志输出

head -20 aa.log:文件的头部 20 行

1
2
3
4
tail -f aa.log # 实时查找,对于日志输出很有用
tail -5 -f firlename
-5 显示指定行数 5
-f 执行后会等待,如果有新行添加到尾部,会继续输出新的行。常用来动态地看日志

pwd

pwd:print working directory,显示当前工作目录的绝对路径

diff

diff:比较单个文件或目录内容

1
2
3
4
5
6
7
-c 上下文模式,显示全部内文,并标出不同之处
-u 统一模式,以合并的方式来显示文件内容的不同
-a 只会逐行比较文本文件
-N 在比较目录时,若文件 A 仅出现在某个目录中,预设会显示:Only in 目录。若使用 -N 参数,则 diff 会将文件 A 与一个空白的文件比较
-r 递归比较目录下的文件
比较的时候忽略空白符
$ diff -w name_list.txt name_list_new.txt

tree

tree:以树状格式显示文件目录

1
tree -L 2

lsattr

lsattr:list file attributes,显示文件扩展属性。

chattr:全拼 change file attributes,改变文件的扩展属性。

fzf

fzf:fuzzy finder:基于 golang 的输入模糊关键词定位文件或文件夹。

find

find:文件夹中查找文件或目录,支持正则,find [path][选项][expression]

locate:基于 mlocate 包,非实时查找,需提前建立与更新索引数据库,从而快速查询:locate string

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
find /home/user_name -name aa.py
find ./ -size 0 |xargs rm -f &删除大小为零的文件
find . -name "*.py"
find /etc -name "[A-Z]*.txt" -print
# 删除两天前的文件
find ./ -ctime +2 -exec rm {} \;
-print# 将匹配的文件输出到标准输出
-exec # 对匹配的文件执行该参数所给出的 shell 命令
-name # 按照文件名查找文件
-type # 查找某一类型的文件
-iname # 不区分大小
-gid
-uid
-group # 组
-user # 用户
-empty #查找所有空文件
-path
-perm # 权限
644
-size # 大小
+5M # 大于5MB,
5M # 等于5MB
-5M # 小于5MB
-mount
-nouser
-nogroup
-(a/m/c)time #访问时间、修改时间、改变时间
-maxdeoth # 目录

grep

grep:global search regular expression and pring out the line:基于正则表达式查找满足条件的行

  • 数据查找定位,select * from student where ...
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
grep pattern file
-i 忽略大小写
-v 不显示匹配的行
-o 将每个匹配的内容用独立的行显示
-A n:当前行及后 n 行
-B n:当前行及前 n 行
-C n:当前行及前后 n 行
-E 使用扩展正则表达式
grep pattern -r dir/ # 递归搜索

在文件中查找字符串(不区分大小写)
grep -n 'Complete' .vimrc
在.vimrc 中找到 Complete 并显示行数


# 输出成功匹配的行,以及该行之后的三行
grep -A 3 -i "example" demo_text

在一个文件夹中递归查询包含指定字符串的文件
$ grep -r "ramesh" *

更多示例:Get a Grip on the Grep! – 15 Practical Grep Command Examples
ls -l | grep '.jar' 查找当前目录中的所有 JAR 文件

grep 'test' d* 显示所有以 d 开头的文件中包含测试的行。

grep 'test' aa bb cc 显示在 AA,BB,CC 文件中匹配测试的行。

grep '[a-z]{5}' aa 显示所有包含每个字符串至少有 5 个连续小写字符的字符串的行。

-c 计算找到‘搜寻字符串’(即 pattern)的次数
-i 忽略大小写的不同,所以大小写视为相同
-n 输出行号
-v 反向选择,打印不匹配的行
-r 递归搜索
--color=auto 将找到的关键词部分加上颜色显示

awk

awk:根据定位到的数据行处理其中的分段,利器,but,Python 牛*。

  • 名字来源于三个作者的简称
  • 数据切片,select name from student

sed

sed:stream editor:流编辑器:根据定位到的数据行修改数据

  • 数据修改,update student set name=..
  • 流程:
    • 从输入读取一行数扰
    • 根据所提供的编辑器命令匹配数据
    • 按命令修改流中的数据
    • 将新的数据输出到 stdout
1
2
3
4
5
6
7
sed options script file
# options
-e # 该选项会将其后跟的脚本命令添加到已有的命令中
-f # 该选项会将其后文件中的脚本命令添加到已有的命令中
-n # 默认情况下,sed 会在所有的脚本执行完毕后,会自动输出处理后的内容,而该选项会屏蔽自动输出,需使用 print 命令来完成输出
-i # 此选项会直接修改源文件
# script

替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[address]s/pattern/replacement/flags
# address:要操作的具体行
# pattern:要替换的内容
# replacement:要替换的新内容
# flag
n # 0-512之间的数字,指定目标字符串第n次出现时才替换
g # 对数据中所有匹配的到的内容进行替换,若无g flag,只在第一次匹配成功时替换
p # 打印与替换命令中指定的模式匹配的行,此标记通常与-n选项一起使用
w file # 将缓冲区的内容写到指定的file文件
& # 用正则表达式替换
\n # 匹配第n个子串,该子串之前在pattern用\(\)指定
\ # 转义(&、\等)

sed 's/test/trial/w test.txt' data2.txt
sed 's/cat/dog/3' a.txt # 数字,用新文本替换第3处模式匹配的地方
sed -e 's/brwn/green/;s/dog/cat/' a.txt

[address]c\用于替换的新文本
 c 命令表示将指定行中的所有内容,替换成该选项后面的字符串。该命令的基本格式为:
 sed '3c\
> This is a changed line of text.' data6.txt

删除

1
2
3
4
5
6
7
8
9
[address]d
# 不加行数,带-i参数会删除文件的所有内容
sed 'd' data1.txt
# 删除第2、3行
sed -i '2,3d' a.txt
# 删除第1-3行
sed '/1/,/3/d' data6.txt
# 删除第3行至结尾
sed '3,$d' data6.txt

1
2
3
4
5
6
7
8
9
10
11
[address]a(或 i)\新文本内容
a # 匹配后添加
i # 匹配前添加
# 第三行前插入新行
sed '3i\
> This is an inserted line.' data6.txt

# 第一行后插入多行
sed '1a\
> This is one line of new text.\
> This is another line of new text.' data6.txt

转换

  • y:唯一可处理单个字符的 sed 脚本命令
1
2
3
4
[address]y/inchars/outchars/

# 对inchars与outchars进行一对一的映射(若长度不同,会r)
sed 'y/123/789/' data8.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
p # 打印
c # 更改
y # 转换 N D P
sed '$/.$//' filename # 将 dos 下的文件转为 unix,\r\n-->\n


# 在第2行后添加
sed -i '2a\11111111111111' a.txt

sed -a # 在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行
sed -c # 用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用"\"续行
sed -i # 在当前行之前插入文本。多行时除最后一行外,每行末尾需用"\"续行
sed -d # 删除行

地址除了可以写行号,还可以写正则表达式,用/ /之间的元字符表示
元字符 功能 示例
^ 行首定位符 /^my/ 匹配所有以my开头的行
$ 行尾定位符 /my$/ 匹配所有以my结尾的行
. 匹配除换行符以外的单个字符 /m…y/ 匹配包含字母m,后跟两个任意字符,再跟字母y的

fuser

fuser:查询给定文件或目录的用户或进程信息

1
2
3
4
5
fuser {file_path}
-v # 显示更全的信息
# 一切皆文件w
# 查看显卡使用者
sudo fuser -v /dev/nvidia*

打包与压缩

gz:即 gzip,通常仅能压缩一个文件。

tar:linux 系统下的打包工具, 仅打包,不压缩。

tgz:即 tar.gz:先用 tar 打包,再用 gz 压缩得到的文件。

zip:与 gzip 相似的算法,可打包压缩多个文件,压缩率低于 tgz

rar:打包压缩文件,最初用于 Dos,基于 Windows 系统。

  • 在压缩比率上: tar.bz2>tgz>tar
  • 占用空间与压缩比率成反比: tar.bz2 < tgz < tar
  • 耗费时间(打包,解压)
    打包:tar.bz2>tgz>tar
    解压: tar.bz2>tar>tgz

tar

tar:打包为 .tar 的打包文件或解开(也可配合 -z 参数进行 gzip 对 .gz 文年的压缩或解压)

  • .tgz,可看作 .tar.gz 的缩写,使用上基本无区别,优先使用 .tgz,避免 windows 下的自动重命名时 a.tar(1).gz 这种情况
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
# .tar  tarball
tar -cvf aa.tar dirname/ # 创建 tar 文件,打包归档,非压缩,将文件夹打包到aa.tar
tar -cvf test.tar aa.txt bb.txt # 将aa.txt与bb.txt打包到test.tar

tar -xvf aa.tar -C dirname/ # 解压 tar 文件,将归档文件释放出来

# .tgz
tar -zcvf examples.tgz examples # 调用gzip进行压缩
tar -zxvf examples.tgz -C /path # 调用gzip解压到指定路径

# .tar.bz,比.tgz压缩比率更大,占用空间更小,但解压时比较耗费CPU时间
tar -jxvf bbb.tar.bz2 dir_path # 解压到拽定咱径


tar -tvf aa.tar # 查看 tar 包含的文件

# 加密压缩
tar -czvf - {file_name} |openssl des3 -salt -pbddf2 -k user_name123456 | dd of={filename.tgz}
tar -czvf - {file_name} |openssl des3 -salt -pbkdf2 -k user_name123456 -out /path/to/file.tgz
# 加密压缩
tar -zcvf - {file_dir} |openssl des3 -salt -k password | dd of=xxx.tgz
# 解密:带有 - ,将释放所有文件
# -k password可以不使用,执行完命令后会让你输入密码
dd if=xxx.tgz |openssl des3 -d -k password|tar zxf -

# 加密解压
openssl des3 -d -k password -salt -in /path/to/file.tar.gz | tar xzf - /path/to/file_dir

# 参数
必要参数,以下五个只能用到其中一个
-c create,建立压缩档案
-x 解压
-t 查看内容
-r 向压缩归档文件后追加文件
-u 更新原压缩包中的文件
-A 新增压缩文件到已存在的压缩
-B 设置区块大小
-c 建立新的压缩文件
-d 记录文件的差别
-r 添加文件到已经压缩的文件
-u 添加改变了和现有的文件到已经存在的压缩文件
-x 从压缩的文件中提取文件
-t 显示压缩文件的内容
-z 调用 gzip 进行.gz文件的压缩或解压
-j 支持 bzip2 解压文件
-Z 支持 compress 解压文件
-v 显示操作过程
-l 文件系统边界设置
-k 保留原有文件不覆盖
-m 保留文件不被覆盖
-W 确认压缩文件的正确性

配合以可选参数
-v
-b 设置区块数目
-C 切换到指定目录
-f 指定压缩文件
--help 显示帮助信息
--version 显示版本信息

zip/unzip

zip:打包并压缩成文件名为 .zip 的文件,无参数可解压,需要用 unzip 来解压

uzip:解压缩 zip 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# .zip
zip file1.zip file1
zip -r file1.zip file1 file2 dir1
zip aa.zip hello.java sss.java bb.java
# 加密压缩
zip -re filename.zip filename 回车,输入2次密码
zip -rP passwork filename.zip filename passwork是要输入的密码

# unzip 解压缩.zip
unzip a.zip # 解压到当前文件夹
unzip -l a.zip # 显示 zip 里的内容
unzip -d /temp a.zip # 将 zip 里的内容解压到指定文件夹
unzip -l a.zip #显示 zip 内的内容
unzip -t test.zip # 查看 zip 文件是否损坏
unzip -v test.zip # 显示文件列表及对应的压缩比率
unzip -n -d /temp test.zip # 不覆盖已存在的文件
unzip -o -d /temp test.zip # 覆盖时不提示

# 加密解压
unzip filename.zip 按提示输入密码
unzip -P passwork filename.zip passwork是要解压的密码,这个不会有提示输入密码的操作

gzip/gunzip

gzip:压缩成 .gz 的压缩文件,也可用 -d 选项变成解压

gunzip:将 .gz 压缩文件解压,也呆用 gzip 加 -d 参数代替

1
2
3
4
# .gz
gzip -9 file1 # 最大程序压缩
gzip -d aa.gz # 解压.gz 文件
gzip -l aa.gz # 显示压缩比率

bzip2/bunzip2

bzip2:压缩成 .bz2 的压缩文件(也可用 -d 选项变成解压)

bunzip2:将 .bz2 压缩文件解压,也可用 bzip2 加 -d 选项代替

1
2
3
# .bz
bzip2 filename
bzip2 -d aa.bz2

rar/unrar

rar

1
2
3
# .rar
rar a file1.rar filename1 filename2
rar x file1.rar

bzip2/bunzip2

1
2
3
# .bz
bzip2 filename
bzip2 -d aa.bz2

其他

compress:压缩成 .Z 的压缩文件,也可用 -d 参数变成解压

uncompress:将 .Z 压缩文件解压,也可用 compress 加 -d 参数代替

恢复

  • 做好备份
1
2
# ntfsundelete:需要先将对应的盘 umount
ntfsundelete /dev/sda1 -t 3d # 最近 3 天删除的文件

用户与权限管理

用户属性

  • name:用户名
  • password:登录密码
  • uid:用户识别号
  • gid:用户的组的识别好
  • description:用户个人资料
  • home:用户的主目录,通常在/home 下,目录名与帐户名相同
  • shell:用户登录后启动的 shell,默认为/bin/bash

查看

/etc/passwd

1
cat /etc/passwd | grep user_name

id/users/who/whoami/logname

id:显示用户当前的 uid、gid 与用户所属的组列表

w/who:查询 utmp 文件并显示当前系统用户及其运行的进程信息,查询 utmp 文件并报告当前登录的用户,默认输出包括用户名、终端类型、登录日期及远程主机

users/whoami/logname:显示当前用户的名称

groups:显示指定用户所属的组列表

login/logout

login/logout:登录/退出登录

shutdown/reboot

shutdown:关机

reboot:重启

1
2
3
4
5
6
7
8
# 关闭系统并立即关机
shutdown -h now
# 10 分钟后关机
shutdown -h +10
# 重启
shutdown -r now
# 重启期间强制进行系统检查
shutdown -Fr now

pwck

pwck:检测帐户

last/lastlog/lastb

last:显示每月登录的用户信息

lastlog 显示最近登录用户的用户名、登录端口和登录时间

lastb 显示登录系统失败用户的相关信息

logger 允许用户将自己的消息发送到日志工具中

su

su:substitute user:切换用户,su username 超级用户使用这个命令可以切换到任何其他用户而不用输入密码

passwd

passwd:密码设置,passwd username 先输入旧密码,再输入新密码

1
passwd -d username # 删除密码

useradd/userdel/usermod

useradd:用户添加

userdel

usermod:修改已有的用户信息

newusers:批量添加/更新一组帐户

1
2
3
4
5
6
7
8
9
10
useradd m user_name # 添加用户
passwd user_name # 设置用户密码
userdel -r user_name # 带 r 时会删除/home 目录下的用户目录
usermod -G group_name user_name # 将 user_name 用户添加到 group_name 组
usermod -g group_name user_name # 将 user_name 用户添加到 group_name 组,并从原组织删除


# 配置用户不能访问别人的用户目录
cd /home
sudo chmod 760 ./*

chage

chage:密码过期

sudo

sudo 允许授权用户执行超级用户或者其它用户的命令

id 显示用户的 id 以及群组的 id

1
2
3
sudo -i # 提升用户权限
sudo -s # 打开特殊的 shell
sudo su # 进入root权限

groupadd/groupdel/groupmod

相关文件

  • /etc/passwd
  • /etc/group

groups:显示组

groupadd:添加组

groupdel:删除组帐户

groupmod:修改组

newgrp

权限管理

文件权限

文件权限

1
2
3
4
5
6
7
8
9
10
11
12
$ ls -l
total 16
----rw-r-- 1 morvan morvan 34 Oct 12 09:51 t1.py
-rw----r-- 1 morvan morvan 80 Oct 12 09:57 t2.py
-rw-rw-r-- 1 morvan morvan 12 Oct 12 09:56 t3
-rwxrw-r-- 1 morvan morvan 55 Oct 13 17:28 t.py

d rwx r-x r-x
Type: 很多种 (最常见的是 - 为文件, d 为文件夹, 其他的还有 l, n … 这种东西, 真正自己遇到了, 网上再搜就好, 一次性说太多记不住的).
User: 后面跟着的三个空是使用 User 的身份能对这个做什么处理 (r 能读; w 能写; x 能执行; - 不能完成某个操作).
Group: 一个 Group 里可能有一个或多个 user, 这些权限的样式和 User 一样.
Others: 除了 User 和 Group 以外人的权限.

在这里, 像 -rw-rw-r-- 这种, 就是权限的说明. 细节展示在下面的图中. 在下图中, 这串字符得拆成 4 个部分,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ls -l
drwxr-xr-x 3 user_name user_name 4096 05-16
# d rwx r-x r-x
# type user 拥有者权限 group 所属用户组权限 other 其他用户权限
d: type:文件类型
- d:目录
- l:软链接
- b:块设备
- c:字符设备
- s:socket:网络套接字
- p:管道
- -:普通文件
rwx:421:7
755
- 7:用户:r+w+x:4+2+1,所有者有读取、写入、执行的权限
- 5:组:r+x:4+0+1,同组用户只有读取、执行权限
- 5:任何人:r:4+0+0,其他用户只有读取权限

  • d:目录
  • r:Read,读,4,读取内容;浏览目录,
  • w:Write,写,2,新增/修改;删除移动
  • x:eXecute,执行,1,运行;进入
1
2
3
4
5
6
drwxr-xr-x 22 user_name user_name    4096  4 月 27 01:48 project
#目录,可读定执行 7,执行读 3,执行 1
-rw-r--r-- 1 user_name user_name 3841532 5 月 18 1999 razorback.mp3
#普通文件,rw 读写 6,r2,r2
-r--------
所有者仅可读(4),组及其他无任何权限(0)

chmod

chmod:change mode:设置文件或目录的权限,读取、写入、执行的权限

1
2
3
4
5
6
7
8
9
10
chmod [谁] [怎么修改] [哪个文件]
chmod ugo +rwx file/dir

chmod u+r test.py
#给指定文件的属主和属组所有权限(包括读、写、执行)
chmod ug+rwx script1.sh
chmod g-rwx script1.sh
chmod a+x myscript # 增加脚本可执行权限
chmod -R ug_rwx dir1 # 递归修改权限
chmod -R ugo+rwx dir1 # 权限大开,user,group,others可读写执行
  • [谁]:

    • u:对 User 修改
    • g:对 Group 修改
    • o:对 Others 修改
    • a:对 all 修改
  • [怎么修改]:

    • , -, =: 作用的形式, 加上, 减掉, 等于某些权限
    • r, w, x 或者多个权限一起, 比如 rx
  • [哪个文件]

    • 施加操作的文件, 可以为多个

chown

chown:change owener:改变文件或目录的拥有者或所属群组

1
2
chown user_name:user_names ./aa.py  拥有者改为 user_name,属组改为 user_names
-R

chgrp

chgrp:CHange GRouP 改变文件或目录的所属群组

groupadd\groupdel\groupmod 群组管理

用户登录记录与相关状态

  • /var/log:这里的文件包含了大量的信息:
  • 连接时间日志–由多个程序执行,把纪录写入到/var/log/wtmp 和/var/run/utmp,login 等程序更新 wtmp 和 utmp 文件,使系统管理员能够跟踪谁在何时登录到系统。进程统计–由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(pacct 或 acct)中写一个纪录。进程统计的目的是为系统中的基本服务提供命令使用统计。

错误日志–由 syslogd(8)执行。各种系统守护进程、用户程序和内核通过 syslog(3)向文件/var/log/messages 报告值得注意的事件。另外有许多 UNIX 程序创建日志。像 HTTP 和 FTP 这样提供网络服务的服务器也保持详细的日志。 常用的日志文件如下:

access-log 纪录 HTTP/web 的传输

acct/pacct 纪录用户命令

aculog 纪录 MODEM 的活动

btmp 纪录失败的纪录

lastlog 纪录最近几次成功登录的事件和最后一次不成功的登录

messages 从 syslog 中记录信息(有的链接到 syslog 文件)

sudolog 纪录使用 sudo 发出的命令

sulog 纪录使用 su 命令的使用

syslog 从 syslog 中记录信息(通常链接到 messages 文件)

utmp 纪录当前登录的每个用户

wtmp 一个用户每次登录进入和退出时间的永久纪录

xferlog 纪录 FTP 会话

utmp、wtmp 和 lastlog 日志文件是多数重用 UNIX 日志子系统的关键–保持用户登录进入和退出的纪录。有关当前登录用户的信息记录在文件 utmp 中;登录进入和退出纪录在文件 wtmp 中;最后一次登录文件可以用 lastlog 命令察看。数据交换、关机和重起也记录在 wtmp 文件中。所有的纪录都包含时间戳。这些文件(lastlog 通常不大)在具有大量用户的系统中增长十分迅速。例如 wtmp 文件可以无限增长,除非定期截取。许多系统以一天或者一周为单位把 wtmp 配置成循环使用。它通常由 cron 运行的脚本来修改。这些脚本重新命名并循环使用 wtmp 文件。通常,wtmp 在第一天结束后命名为 wtmp.1;第二天后 wtmp.1 变为 wtmp.2 等等,直到 wtmp. 7。

每次有一个用户登录时,login 程序在文件 lastlog 中察看用户的 UID。如果找到了,则把用户上次登录、退出时间和主机名写到标准输出中,然后 login 程序在 lastlog 中纪录新的登录时间。在新的 lastlog 纪录写入后,utmp 文件打开并插入用户的 utmp 纪录。该纪录一直用到用户登录退出时删除。utmp 文件被各种命令文件使用,包括 who、w、users 和 finger。

下一步,login 程序打开文件 wtmp 附加用户的 utmp 纪录。当用户登录退出时,具有更新时间戳的同一 utmp 纪录附加到文件中。wtmp 文件被程序 last 和 ac 使用。

  • wtmp 和 utmp 文件是二进制文件,需要使用:who、w、users、last 和 ac 来查看
1
2
3
4
5
6
7
# 查看登录和退出时间
last -f /var/log/wtmp
(1)-p:显示每个用户的连接时间 
(2)-d:显示每天的连接时间 
(3)-y:显示年份,和-d配合使用

/var/log/secure 文件寻找可疑IP登陆次数

系统管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 系统版本信息
uname -m && cat /etc/*release

# cpu信息
lscpu
# 内存信息
lsmem

# GPu显卡信息
nvidia-smi

pip install gpustat

gpustat -i

系统服务

init

init:改变系统运行级别

1
sudo init 5

systemctl

systemctl:管理服务的主要工具, 它整合了 chkconfig 与 service 功能于一体。

1
2
3
4
5
6
7
8
9
systemctl is-enabled mysqld.service  #查询服务是否开机启动
systemctl enable mysqld.service #开机运行服务
systemctl disable mysqld #取消开机运行
systemctl start mysqld #启动服务
systemctl stop mysqld #停止服务
systemctl restart mysqld #重启服务
systemctl reload mysqld #重新加载服务配置文件
systemctl status mysqld #查询服务运行状态
systemcta --failed #显示启动失败的服务
1
2
3
systemctl start mysqld
# 相当于
service mysqld start
1
2
3
# 没有systemctl时需要用chkconfig添加开机自启动
chkconfig --list
chkconfig sshd on

dmesg

dmesg:diagnostic message:查看最后一次系统引导的日志(开)

1
dmesg -T

硬件管理

一切皆文件

1
2
3
4
5
6
7
8
9
10
11
cat /proc/version # 系统内核信息
cat /proc/cpuinfo
cat /proc/cpuinfo | grep processor |wc -l # cpu 核的个数
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c # 查看有几个逻辑cpu, 包cpu型号
# L1/L2/L3 cached
cat /sys/devices/system/cpu/cpu0/cache/index0/size # index1/size
cat /proc/meminfo
arch # 显示架构
lshw -c video # 查看 GPU显卡

sudo lspci | grep -e VGA

显卡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# nvidia显卡驱动卸载
sudo /usr/bin/nvidia-uninstall

# nvidia显卡驱动安装
# 命令行模式
# 获取可用驱动信息
ubuntu-drivers devices
# 前面找 driver,后面找 recommend
# 安装
sudo apt install nvidia-driver-xxx
# 或者
sudo ubuntu-drivers autoinstall
# 安装完成后重启
sudo reboot now
# 重启后查看显卡状态
nvidia-smi


# 重新加载NVIDIA内核模块
sudo modprobe nvidia
# 查看驱动程序是否成功加载
lsmod | grep nvidia
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
# 最全的查看显卡信息
lshw -c video

lspci | grep -i vga # 得到的十六进制的可以从:http://pci-ids.ucw.cz/mods/PC/10de/2204中查看

#
nvidia-smi
nvidia-smi -pm 1 # 开启持久模式


# 调整运行功率,保证最大功率时候的温度不会超过75C
sudo nvidia-smi -pl 200

lspci | grep -i nvidia
nvidia-smi -L # 查看型号
nvidia-smi -q # 查询所有GPU的相关信息
nvidia-smi -q -i 0 # 查询0号GPU的相关信息
nvidia-smi -q -f xx.txt # 将查询的信息输出到文件

# 重置 GPU 状态,可用于清除双位 ECC 错误或 恢复挂起的 GPU。需要 -i 切换到目标特定设备。 仅在 Linux 上可用。
nvidia-smi --gpu-reset
nvidia-smi -r

# windows下:
1. 在“设备管理器”的“显示适配器”选项卡下,找到驱动程序
2. 禁用它
3. 按 Win + Ctrl +Shift + B(显示器将闪烁)
4. 启用驱动程序

lspci/dmidecode/biosdecode/lscpu

dmidecode:全面的硬件浏览

biosdecode:bios 信息

lspci:查看硬件插槽

lsmod:显示 linux 内核的模块信息

lscpu:查看 cpu 的相关信息

1
2
3
# manjaro
mhwd # 查 gpu 驱动
inxi -FX # 所有硬件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
lscpu
Architecture: #架构
CPU(s): #逻辑 cpu 颗数
Thread(s) per core: #每个核心线程
Core(s) per socket: #每个 cpu 插槽核数/每颗物理 cpu 核数
CPU socket(s): #cpu 插槽数
Vendor ID: #cpu 厂商 ID
CPU family: #cpu 系列
Model: #型号
Stepping: #步进
CPU MHz: #cpu 主频
Virtualization: #cpu 支持的虚拟化技术
L1d cache: #一级缓存(google 了下,这具体表示表示 cpu 的 L1 数据缓存)
L1i cache: #一级缓存(具体为 L1 指令缓存)
L2 cache: #二级缓存

uname

uname:显示一些重要的系统信息,例如内核名称、主机名、内核版本号、处理器类型之类的信息

1
uname -a

screenfetch

screenfetch:显示系统相关信息

显卡状态

  • 遇到的问题:显卡风扇在转,但系统中无法 lshw 到显卡信息:电通了,但接触不良,需要重新拔插下
1
2
3
4
5
6
7
8
# 查看显卡信息
lspci | grep -i nvidia
lspci | grep -i vga

# 查看指定显卡的详细信息("00:0f.0"是显卡的代号)
lspci -v -s 00:0f.0

nvidia-smi

时间配置

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
date
# 显示系统当前时间与日期
timedatectl status

# 查看所有可用时区
timedatectl list-timezones

# 设置上海时区
timedatectl set-timezone "Asia/Shanghai"
# 设置世界时,即UTC
timedatectl set-timezone UTC


# 设置时间
timedatectl set-time 15:58:30
# 设置日期
timedatectl set-time 20151120
# 设置日期和时间
timedatectl set-time '16:10:40 2015-11-20'

# 硬件时钟
timedatectl | grep local
# 硬件时钟设置为本地时区
timedatectl set-local-rtc 1
# 硬件时钟设置为世界时
timedatectl set-local-rtc 0

性能监控

top

top/htop:显示、管理执行中的程序,动态监控

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
top
top - 15:12:36 up 33 min, 4 users, load average: 0.90, 0.91, 1.02
# 系统当前时间 系统运行时间 当前登录用户数 过去 1 分钟 5 分钟 15 分钟的平均负载 1 核为 1、8 核为 8
任务: 305 total, 1 running, 304 sleeping, 0 stopped, 0 zombie
# 总的进程数 正在运行的进程数 睡眠的进程数 停止的进程数 僵尸进程数
%Cpu(s): 12.3 us, 5.2 sy, 0.0 ni, 81.5 id, 0.1 wa, 0.8 hi, 0.1 si, 0.0 st
# us: 用户模式占用的 CPU 百分比
# sy:系统模式...
# ni:改变过优先级的用户占用的
# id:CPU等待输入输出的进程占用的(空闲CPU)
# hi: 硬件中断请求服务占用的 CPU
# si: 软件中断请求占用的 CPU
# st:虚拟时间即虚拟机 CPU 占用
MiB Mem : 15950.2 total, 6405.0 free, 6602.1 used, 2943.1 buff/cache
# 物理内存总量,单位为 kb 空间内存 已使用的 作为缓冲的内存量
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 7965.8 avail Mem
# 交换分区总量...
PID USER PR NI VIRT RES SHR %CPU %MEM TIME+ COMMAND
2347 user_name 20 0 1197184 538296 239120 S 18.2 3.3 7:41.88 chromium
PID: 进程号
USER: 进程所属用户
PR: 优先级,数值越小优先级越高
NI: 优先级,数值越小优先级越高
VIRT: 进程占用的虚拟内存大小,单位为 kb
RES: 常驻内存,进程占用的物理内存的大小,单位为 kb
SHR: 共享内存大小,单位为 KB,即一个进程的实际占用内存的 RES-SHR
S:进程状态 S 睡眠,R 运行
%CPU: 占 CPU 百分比
%MEM: 占内存百分比
TIME+: 共占用的 CPU 时间
COMMAND: 进程名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
当服务器拥有多个 cpu 的时候可以使用“1”快捷键来切换是否展示显示各个 cpu 的详细信息;
<Space>:立即刷新
s:设置刷新时间间隔
c:显示完整的程序命令
t::显示或隐藏进程和 CPU 状态信息
m:显示或隐藏内存状态信息
l:显示或隐藏 uptime 信息
f:增加或减少进程显示标志
S:累计模式,会把已完成或退出的子进程占用的 CPU 时间累计到父进程的 MITE+
# P:按%CPU 使用率降序
# T:按 MITE+排行
# M:按%MEM 内存使用率降序
u:指定显示用户进程
r:修改进程 renice 值
b:高亮显示当前运行进程
kkill:进程
i:只显示正在运行的进程
W:保存对 top 的设置到文件^/.toprc,下次启动将自动调用 toprc 文件的设置。
h:帮助命令。
q:退出
# 显示指定的进程信息
top -p pid

uptime

uptime:系统负载 - 用了多久

1
2
3
[user_name@user_nameer ~]$ uptime
07:32:10 up 43 min, 6 users, load average: 0.26, 0.53, 0.51
# load average 后的数字分别表示计算机在 1min、5min、15min 内的平均负载

free

free:以字节为单位输出内存使用量

  • Linux 与 Windows 不同,Windows 是只在需要内存时才为应用程序分配内存,Linux 是无论物理内存多大,将对其充分利用。采用划分出 cache、buffers 来实现
    • buffer:缓冲:在写入数据时,先将分散的写入操作保存到内存中,当达到一定程度再集中写入硬盘,减少磁盘碎片和硬盘的反复寻道,加速数据的写入过程(但一定程度延缓了数据的写入)
    • cache:页高速缓存:将读取出来的数据保存在内存中,再次读时直接从内存中读取,加快数据读取
      • 数据一旦被访问,短期内就可能再次被访问。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
free
-t 汇总
-g GB
-m MB
-k KB
-b 字节
total 总计 used 已用 free 空闲 共享 缓冲/缓存 可用
内存: 15949 2620 11535 289 1793 12741
交换: 0 0 0
total:物理内存总大小
used:已使用的物理内存大小
free:空闲的物理内存大小
shared:多个进程共享的内存大小
buffers/cached:磁盘缓存的大小

vmstat

vmstat:Virtual Meomory statistics:虚拟内存统计信息,可实时动态监视操作系统的虚拟内存、进程、CPU 活动。

iostat-iotop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
iostat -x 1 10
Linux 5.4.0-42-generic (dl) 08/10/2020 _x86_64_ (8 CPU)

# cpu 用户模式,带 nice 的用户模式,系统模式,等待输入输出完成时间,维护另一个虚拟处理器,空间时间
avg-cpu: %user %nice %system %iowait %steal %idle
7.79 0.00 1.00 0.06 0.00 91.15

Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
loop0 0.00 0.00 0.00 0.00 934 0 0
loop1 0.00 0.00 0.00 0.00 4062 0 0
sda 3.05 187.98 147.20 167.51 307487357 240780505 274011344
sdb 0.79 52.61 130.98 0.00 86061868 214254484 0

sudo iotop -oP
  • 注:如果%iowait 的值过高,表示硬盘存在 I/O 瓶颈,%idle 值高,表示 CPU 较空闲,如果%idle 值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量。%idle 值如果持续低于 10,那么系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU。

pmap

pmap:进程的内存使用情况

nvidia-smi

nvidia-smi:nvidia 显卡状态

显示说明
Fan风扇转速(0%–100%),N/A 表示没有风扇
TempGPU 温度(GPU 温度过高会导致 GPU 频率下降)
Perf性能状态,从 P0(最大性能)到 P12(最小性能)
PwrGPU 功耗
Persistence-MOFF/ON,持续模式的状态(持续模式耗能大,但在新的 GPU 应用启动时花费时间更少)
Bus-IdGPU 总线,domain🚌device.function
Disp.ADisplay Active,表示 GPU 的显示是否初始化
Memory-Usage显存使用率
Volatile GPU-UtilGPU 使用率
ECC是否开启错误检查和纠正技术,0/DISABLED, 1/ENABLED
Compute M.计算模式,0/DEFAULT,1/EXCLUSIVE_PROCESS,2/PROHIBITED

TCC/WDDM:NVIDIA 高性能 GPU(如 Tesla, Quadro)可以配置为 TCC(Tesla Compute Cluster)模式或 WDDM(Windows Display Driver Model)模式。
二者区别在于,TCC 模式下,GPU 完全用于计算,并不需要本地显示功能;而 WDDM 模式下,GPU 同时扮演计算卡 + 显卡的角色。
显存占用和 GPU 占用是两个不一样的东西,显卡是由 GPU 和显存等组成的,显存和 GPU 的关系有点类似于内存和 CPU 的关系。跑 caffe 代码的时候显存占得少,GPU 占得多,跑 TensorFlow 代码的时候,显存占得多,GPU 占得少。

  • nvidia-smi -pm 1:设定持久模式,没人用 GPU 时驱动不自动卸载,一直处于加载模式
    • 如果不加载这个,driver 频繁卸载加载,GPU 频繁被初始化,会导致 GPU 死机,CPU 访问 PCIe config registers 时间过长导致 softlock。
1
2
# 屏蔽指定显卡
nvidia-smi drain -p 0000:89:00.0 -m 1

ethstatus- 带宽

1
2
ip a # 查看网卡名
ethstatus -i {网卡名}

磁盘管理

du-df-lsblk-fdisk

du:Disk Usage:显示目录或者文件所占的磁盘空间

lsblk:列出块设备

df:disk free:显示文件系统的磁盘使用情况,默认 df -k 字节为单位

fdisk:显示磁盘分区情况

1
2
3
4
5
6
7
8
9
df -k kb
-h humen
-T 类型

du -sh *
-s 统计汇总
-h
--max-depth=1 当前目录下一级子文件和子目录占用的磁盘容量
lsblk -f # 查看硬盘格式

mkfs

mkfs:格式化

1
2
3
4
mkfs.ext4 /dev/sdb1 # 将硬盘格式化为 ext4 格式

sudo blkid #查看电脑上所有硬盘分区的卷标及 uuid
sudo fdisk -l # 查看硬盘所在路径,挂载的节点

sync

sync:将缓存同步到磁盘

awk

awd:格式化文本语言

mount-umount

mount:挂载文件系统

umount:卸除文件系统

1
2
mkdir /data
sudo mount /dev/sdb1 /data

parted:磁盘分区工具

自动挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
# 开机自动挂载
lsblk # 确认待挂载分区设备名: 如/dev/sdb1
# 查看 uuid
ls -l /dev/disk/by-uuid
# sudo vi /etc/fstab,在/的下一行添加
/dev/disk/by-uuid/xxxxxx /data ext4 defaults 0 0
<file system> <mount point> <type> <options> <dump> <pass>
第 1 列是设备名或者卷标,如/dev/sda1
第 2 列是挂载点(也就是挂载目录),如/mnt/data
第 3 列是所要挂载设备的文件系统或者文件系统类型,如 auto(自动侦测)、ext2、ext3 等
第 4 列是挂载选项,通常使用 defaults 就可以,如 auto(系统自动挂载),defaults( rw, suid, dev, exec, auto, nouser, and async.),noauto(开机不自动挂载),nouser(只有超级用户可以挂载),user 任何用户都可以挂载等
第 5 列设置是否使用 dump 备份,置 0 为不备份,置 1,2 为备份,但 2 的备份重要性比 1 小
第 6 列设置是否开机的时候使用 fsck 检验所挂载的磁盘,置 0 为不检验,置 1,2 为检验,但置 2 盘比置 1 的盘晚检验

dd

dd:Disk Dump

1
2
# ISO 写入 U 盘
dd if==/home/user_name/Documents/hello.iso of=/dev/sdb1

mdadm

mdadm:raid 设置工具

LVM 磁盘扩充

  • Ubuntu Linux 安装时默认 / 只占用了 200G,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看
df -h

# 使用剩下的所有扩展到LVM中
sudo lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv

# 扩展指定的大小(当然扩充大小不能大于磁盘实际剩余大小)
sudo lvextend -L 50G /dev/mapper/ubuntu--vg-ubuntu--lv

# 对上面的操作应用上(重新计算)
resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv


# 查看
lvdisplay
vgdisplay

用户管理

1
2
3
4
5
6
7
8
# 添加组
sudo groupadd docker
# 将用户添加到组
sudo useradd -a -G docker user_name

# 文件夹权限配无思无虑
chmod 770 -R /home/path
chmod +s /home/path # #### 确保之后添加进去的文件夹也继承同样的权限

网络管理

相关文件

  • /etc/sysconfig/network:系统网络配置文件,包含主机最基本的网络信息用于系统启动
  • /etc/sysconfig/netword-scripts/ifcfg-ethX:以太网接口配置文件
  • /etc/sysconfig/network-scripts/route-ethX:以太网接口的静态路由配置文件
  • /etc/hosts:完成主机名映射为 IP 地址的静态解析功能
  • /etc/resolv.conf:配置域名服务客户端的配置文件,用于指定域名服务器的位置
  • /etc/host.conf:配置域名服务客户端的控制文件

netstat

列出所有端口 (包括监听和未监听的):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
netstat -a
netstat -ntl 查看端口占用情况 *
netstat -anp | grep 3306 # 端口是否被占用

# 参数
-t: TCP 端口
-u: UDP 端口
-l: 仅显示监听套接字
-p: 显示进程标识符和程序名称,每个套接字/端口属于一个程序
-a:显示本机所有连接和监听地端口

-n:网络 IP 地址的形式,显示当前建立的有效连接和端口
-r:显示路由表信息
-s:显示按协议的统计信息
-v:显示当前有效的连接
-t:显示所有 TCP 协议连接情况
-u:显示所有 UDP 协议连接情况
-i:显示自动配置端口的状态
-l:仅仅显示连接状态为 listening 的服务网络状态
-p:显示 pid/program name

列出所有 tcp 端口:

1
netstat -at

列出所有有监听的服务状态:

1
netstat -l

看 -hostname-ip-ifconfig

hostname:显示主机名

ip:ip a:查看 ip

ifconfig:设置网络接口

nmtui

nmtui:终端连网

ping

ping:Packet InterNet Grouper:检测网络的连通性

arping

arping:发送 arp 请求到一个相邻主机

能 Ping 通、ssh 服务已开,但无法通过该 IP ssh 登录

1
2
# 检查是否有IP冲突(若有多个MAC地址,则为冲突)
arping -l etho 192.168.1.1

telnet

telnet:远程登入

tc

tc:显示和维护流量控制设置

ssh

ssh:secure shell,登录到远程主机

  • linux 默认打开,sshd 服务,监听端口 22
1
2
3
4
5
6
7
ssh -V
ssh

# 查看 ssh口
netstat -anp | grep ssh
# 修改ssh端口
vi /etc/ssh/sshd_config
  • 修改 ssh 端口
1
2
3
4
5
6
7
8
9
10
11
# 默认端口为 22

netstat -anp |grep 22 # 查看端口占用
netstat -anp |grep ssh # 查看进程占用的端口

sudo vi /etc/ssh/sshd_config
# port 22 这行
systemctl restart sshd.service

# 修改后,需要在防火墙iptables等规则中进行放行

scp

scp:SSH:基于 ssh 协议的文件传输

1
2
3
4
5
6
7
8
9
10
11
# 上传
scp /path/filename username@servername:/path/
scp -r local_dir username@servername:remote_dir # 上传目录
# 下载
scp username@servername:/path/filename /var/www/local_dir(本地目录)
scp -r username@servername:/var/www/remote_dir/(远程目录) /var/www/local_dir(本地目录)

# 参数
scp -P port_number /path/to/local/file username@remote_host:/path/to/remote/directoryx # -P:指定要连接的端口号
scp -v /path/to/local/file username@remote_host:/path/to/remote/directory # 显示详细的传输过程信息
scp -n /path/to/local/file username@remote_host:/path/to/remote/directory # 跳过已存在的文修的

wget

wget:下载工具:支持 HTTP\HTTPS\FTP 三个常见 TCP/IP 协议的网络下载工具,wget=world wide web+get

1
2
3
4
5
6
7
8
9
wget http://www.baidu.com  #index.html
wget -O /home/user_name/aa.html http://www.baidu.com #output-document,指定下载目录和文件名
wget –limit-rate=300k http:/....
wget -i file.txt #从 file.txt 下载多个文件
wget -b 后台下载
wget -o download.log URL 将软件输出信息保存到文件;-a 为追加
wget -c http://www.baidu.com #断点续传
wget --file-user=USERNAME --file-password=PASSWORD url #ftp 下载
-t,--tries=NUMBER 是否下载次数(0 表示无穷次)

进程管理

进程状态

  • R:runnable:运行 (正在运行或在运行队列中等待)
  • S:sleeping 中断 (休眠中, 受阻, 在等待某个条件的形成或接受到信号)
  • D:uninterruptible sleep:不可中断 (收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
  • Z:zombie/defunct:僵死 (进程已终止, 但进程描述符存在, 直到父进程调用 wait4() 系统调用后释放)
  • T:traced or stopped 停止 (进程收到 SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU 信号后停止运行运行)

ps-pstree

ps:Processes Status:正在运行的进程的信息。

pstree:pstree:查看进程间关系

  • 参数
1
2
3
4
5
6
7
8
9
10
11
12
ps -aux | grep :显示所有进程与状态
-a 终端机下的所有进程,包括其他用户的
-A 所有进程
-e 所有进程
-c 显示真正的指令名称,不包含路径、参数等提示
-f 用 ASCII 字符显示树状结构,表示进程间的相互关系
-u 以用户为主的格式显示
-x 后台进程运行的参数
-o 自定义格式
# 状态,父进程,进程ID,启动时间,运行时间,命令
ps -eo ostat,ppid,pid,lstart,etime,cmd
ps -ef
  • 输出信息
1
2
3
4
5
6
7
8
9
10
11
12
13
user_name  716  0.2  0.5 739704 84564 ?        Sl   09:56   0:07 albert
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER: 进程拥有者
PID: pid
%CPU: 占用的 CPU 使用率
%MEM: 占用的记忆体使用率
VSZ: 占用的虚拟记忆体大小
RSS: 占用的记忆体大小
TTY: 终端的次要装置号码 (minor device number of tty)
STAT: 该行程的状态,linux 的进程有 5 种状态:
START: 进程开始时间
TIME: 执行的时间
COMMAND:所执行的指令
1
pstree -p

kill-sleep

kill:杀掉执行中的程序或工作(本意是用来向进程发射信号的)

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
ps aux | grep chromium # 查询 chromium 的进程
kill -s 9 pid # -s 9 为传递给进程的信号为 9,即强制、尽快终止进程

# 查看所有信号
kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX


signal.SIGTERM:请求进程终止运行,也可以称为默认终止信号。
signal.SIGKILL:立即终止进程的运行,无法被捕获或忽略。
signal.SIGINT:相当于键盘上 Ctrl+C 的中断信号,通常用于请求应用程序退出。
signal.SIGSTOP:请求进程暂停运行,可以被恢复(通过 SIGCONT)。


# 常用
kill -2 pid # 中断进程
kill -9 pid # 强制关闭
kill -15 pid # 正常关闭
  • 注:Windows
sig 值说明
SIGABRT异常终止
SIGFPE浮点错误
SIGILL非法指令
SIGINTCtrl+C 信号
SIGSEGV非法存储区访问
SIGTERM终止请求

nohup

nohup:不挂断地运行命令,用户退出系统后程序继续工作

  • &:置与后台运行,放在所需命令行结尾
1
2
3
nohup python aa.py >my.log &  # 加上&,后台运行程序,
jobs -l #只能查看当前终端
ps -ef
1
2
3
nohup python test.py >> train.log 2>&1 &
# nohup
# >> train.log
  • nohup:不挂断地运行,即在退出帐号时继续运行
  • python train_net.py:运行 Python 程序,注意由 VS Code 的项目管理机制,需 cd 到项目的文件夹再运行 Python 程序
  • >> train.log:将运行 Python 程序时的输出输出到指定文件,如 train.log
  • 2>&1:将错误内容重定向输入到标准输出中,即在 train.log 会有正常 print 的标准输出,及如果程序出错了的报错。
    • 0 表示 stdin 标准输入,用户键盘输入的内容
      1 表示 stdout 标准输出,输出到显示屏的内容
      2 表示 stderr 标准错误,报错内容
  • &:置于后台运行

pidof-pkill-bg-fg-jobs

pidof:打印出正在运行的程序的进程 ID

bg:使一个被挂起的进程在后台执行

fg:挂起程序

jobs:显示后台程序

1
2
3
4
pidof chromium # 查出来
kill pid_id # 作掉
kill -USR2 $(pidof chromium)
pkill -f chromium # 直接作掉

资源限制

ulimit

ulimit:获取或设置指定资源的使用限制。

  • 进程的资源限制通常是在系统初始化时由 init 进程建立的,然后由每个后续进程继承。这就意味着为了影响一个用户的所有后续进程,需要将资源限制的设置构造在 shell 之中(如 bash 中的 ulimit)
  • 超出资源限制值会报错?而不是最大只能使用这么多?不太实用的样子
1
ulimit -a # 查看当前资源限制

利器

at-crontab

at:在特定的时间执行一次性的任务

atq:列出用户的计划任务,如果是超级用户将列出所有用户的任务,结果的输出格式为:作业号、日期、小时、队列和用户名

atrm:根据 job number 删除 at 任务

batch:在系统负荷允许的情况下执行 at 任务,就是在系统空闲的情况下才执行 at 任务

  • at 指定模式
    • 当于的 hh:mm(小时: 分钟)的时间指定,若时间已过去,则置于第二天,如 04:00
    • 能使用 midnight、noon、teatime(饮茶时间,一般是下午 4 点)等模糊的词语来指定时间
    • 12 小时计时制,即在时间后加上 AM 或 PM,如 12pm
    • 能指定命令执行的具体日期,指定格式为 month day 或 mm/dd/yy 或 dd.mm.yy,指定的日期必须跟在指定时间的后面。如:04:00 2009-03-1
    • 相对计时法:如 now + 5 minutes 04pm + 3 days
    • 能够直接使用 today(今天)、tomorrow(明天)来指定完成命令的时间。
1
2
3
4
5
6
7
8
9
10
11
at [选项] [时间]
Ctrl + D 结束 at 命令的输入
-m 当指定的任务被完成后,将给用户发送邮件,即使没有标准输出
-I atq 的别名
-d atrm 的别名
-v 显示任务将被执行的时间
-c 打印任务的内容到标准输出
-V 显示版本信息
-q <队列> 使用指定的队列
-f <文件> 从指定文件读入任务而不是从标准输入读入
-t <时间参数> 以时间参数的形式提交要运行的任务

crontab:cron table,任务调度,定时执行任务

  • cron:系统服务 crond,重复运行某些被设定好确定的运行时间的任务,每月、每周、每天、甚至每分钟运行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
crontab -u
-u:指定用户
-e:编辑
-l:显示 crontab 文件,
-r:删除某个用户的 crontab 文件,若不指定用户,则默认删除当前用户的 crontab
-i:在删除用户的 crontab 文件时出示确认提示

设置一个每十分钟执行一次的计划任务
*/10 * * * * /home/ramesh/check-disk-space
# 分 时 日 月 星期
# 分 minute[0-59]时 hour[0-23]日 day[1-31]月 month[1-12]周 week[0-7],0 或代表星期日
***** command # 默认每分钟执行一次
3,15 * * * * command # 每小时第 3 和第 15 分钟执行
3,15 8-11 */2 * * command # 每隔两天的上午 8 点到 11 点的第 3 和第 15 分钟执行
3,15 8-11 ** 1 command # 每个星期 1 的上午 8 点到 11 点的第 3 和第 15 分钟执行
30 9 * * * systemctl mysqld restart # 每天 9:30 重启 mysqld
*/15**** /home/user_name/test.sh

nice:用指定的优先级运行命令

renice:修改优先级

convert

convert:格式转换利器

  • 需 FFmpeg 及 ImageMagick
1
2
3
4
5
6
7
8
9
10
11
convert xxx.jpg xxx.png
convert xxx.gif xxx.bmp
convert xxx.tiff xxx.pcx

convert -resize 1920x1080 xxx.jpg new_xxx.jpg
convert -sample 50%x50% xxx.jpg new_xxx.jpg
convert -rotate 270 xxx.jpg new_xxx.jpg
# 在图像的 10,80 位置采用 60 磅的全黑 Helvetica 字体写上 Hello, World!
convert -fill black -pointsize 60 -font helvetica -draw 'text 10,80 "Hello, World!" ‘ hello.jpg helloworld.jpg
# 将 png 连接成 gif
convert -layers Optimize -delay 4/100 png/output*.png clip.gif

回收站

1
2
3
4
5
6
shell
sudo apt install trash-cli


echo "alias rm='trash-put'" >> ~/.bashrc
source ~/.bashrc
  • 参考:开源项目
  • 基本操作:
    • trash-put:将文件或目录移入回收站;
      trash-empty:清空回收站;
      trash-list:列出回收站中的文件;
      restore-trash:还原回收站中的文件;
      trash-rm:删除回首站中的单个文件;

Shell 编程

常识

  • 初始目标:shell 编程:基本语法、shell 变量、表达式、shell 脚本、shell 流程控制
  • Now:了解 Shell 常识即可,Python 脚本为主,Python 牛*
  • $var :对变量取值
  • $$ :进程号
  • $0 :命令名
  • # :注释

输入输出

变量

1
2
3
4
declare name
name = user_name
echo $name
echo Number_{1..5} # 花括号展示

环境变量

环境变量:可由系统、用户、Shell 以及其他程序来设定,可赋值为数字、文本、文件名、设备以及其他类型的数据

  • 环境变量的名称一般是大写的(约定俗成)
    • PATH:决定了 shell 将到哪些目录中寻找命令或程序
    • HISTSIZE:历史记录数
    • LOGNAME:当前用户的登录名
    • HOSTNAME:指主机的名称
    • SHELL:当前用户 Shell 类型
    • LANGUGE:语言相关的环境变量,多语言可以修改此环境变量
    • MAIL:当前用户的邮件存放目录
    • PS1:基本提示符,对于 root 用户是 #,对于普通用户是 $
  • HOME:当前用户主目录
  • set:显示当前 Shell 所有变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量。
  • env:显示与当前用户相关的环境变量,还可以让命令在指定环境中运行。
  • export:显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量。
  • echo $PATH
  • 添加环境变量时使用绝对路径。
1
2
3
4
/etc/profile 全局用户,应用于所有的Shell。
/$HOME/.profile 当前用户,应用于所有的Shell。
/etc/bash_bashrc 全局用户,应用于Bash Shell。
~/.bashrc 局部当前,应用于Bash Sell。
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
# 临时环境变量
# 会立即生效,但窗口关闭后会失效
export PATH=$PATH:/要添加的路径
# PATH: 变量名,指添加以 PATH 这个环境变量中
# $PATH: 指把新添加的环境变量与原先的环境变量重新赋值给 PATH 这个变量(多个变量间是用:分隔的)
# 自定义任意变量名 路径值
export MyVar=/usr/local/dev

#引用方法 以:分割 加$引用

export PATH=$PATH:$MyVar/sdk/go/bin:$MyVar/sdk/java/bin


# 永久生效
# /etc/bashrc:系统全局环境变量设定
# 1.指定用户: vi ~/.bashrc,在其后添加
export PATH=$PATH:/要添加的路径
# 然后,source ~/.bashrc

# 针对单个用户有效的环境变量配置和启动程序
# 2. 指定用户:vi ~/.bash_profile,在其后添加
export PATH=$PATH:/要添加的路径
# 然后,source ~/.bash_profile

# /etc/profile:系统级的环境变量和启动程序,会对所有用户生效
# 3. 所有用户:vi /etc/profile,在其后添加
export PATH=$PATH:/要添加的路径
# 然后,source /etc/profile

# env 查看所有环境变量
env | grep PATH

export TEST="Test.."
# unset 清除环境变量
unset TEST
  • 首先读入全局环境变量设定档 /etc/profile,然后根据其内容读取额外的设定的文档,如 /etc/profile.d/etc/inputrc
  • 根据不同使用者帐号,于其家目录内读取 ~/.bash_profile
  • 读取失败则会读取 ~/.bash_login
  • 再次失败则读取 ~/.profile(这三个文档设定基本上无差别,仅读取上有优先关系);
  • 最后,根据用户帐号读取 ~/.bashrc

helloworld

1
vi helloworld.sh
1
2
3
4
5
6
7
#!/bin/bash

for ((i=0; i<10; i++))do
echo "helloworld"
done

exit 0
1
2
chmod 755 helloworld.sh
./helloworld.sh

命令行写入文件的权限问题

1
2
3
4
5
6
# bash将一个字串作为完整命令来执行,从而将sudo的影响拓展到整条命令
sudo bash -c 'echo "nameserver 114.114.114.144" >> /etc/resolv.conf'
# 管道+tee,让teesudo,从标准输入中读入信息并将其写入标准输出或文件中
echo "nameserver 114.114.114.144"|sudo tee -a /etc/resolv.conf
# 提升shell权限
sudo -s # sudo su -root

常用参数

1
2
3
4
cmd [-options] [arguments]
# 三元素:命令 选项 参数
-单字符
--单词
  • -a
    • all,全部,所有 (ls\lsattr\uname)
    • archive: 存档(cp\rsync)
    • append: 附加(tar -A,7z)
  • -b
    • blicksize:块大小,带参数(du,df)
    • batch: 批处理模式
  • -c
    • commands:执行命令,带参数
    • creat: 创建
  • -d
    • debug:调试
    • delete:删除
    • directory:目录(ls)
  • -e
    • execute:执行,带参数(xterm, perl)
    • edit:编辑
    • exclude:排除
  • -f
    • force:强制,不经确认(cp, rm, mv)
    • file:文件,带参数(tar)
    • configuration file : 指定配置文件 (有些守护进程拥有此选项,如 ssh , lighttpd)
  • -h
    • –help:帮助
    • human readable:人性化显示(ls,du,df
    • headers:头部
  • -i
    • interactive:交互模式,提示 (rm, mv)
    • include:包含
  • -k
    • keep:保留
    • kill
  • -l
    • long listing format:长格式(ls)
    • list:列表
    • load:读取(gcc, emacs)
  • -m
    • message:消息(cvs)
    • manual:手册(whereis)
    • create home:创建 home 目录(usermod, useradd)
  • -n
    • number : 行号、编号 (cat , head , tail , pstree , lspci)
    • no : (useradd , make)
  • -o
    • output : 输出 (cc , sort)
    • options : 选项 (mount)
  • -p
    • port : 端口,带参数 (很多网络工具拥有此选项,如 ssh , lftp )
    • protocol : 协议,带参数
    • passwd : 密码,带参数
  • -q
    • quiet : 静默
  • -r
    • reverse : 反转
    • recursive : 递归 (cp , rm , chmod -R)
  • -s
    • silent : 安静
    • size : 大小,带参数
    • subject
  • -t
    • tag
    • type:类型(mount)
  • -u
    • user:用户名、UID,带参数
  • -v
    • verbose:冗长
    • version:版本
  • -w
    • width : 宽度
    • warning : 警告
  • -x
    • exclude : 排除 (tar , zip)
  • -y
    • yes
  • -z
    • zip : 启用压缩 (bzip , tar , zcat , zip , cvs)

遇到的问题

写 log,文件大小为 0

  • 文件大小为 0 是因为 Linux 对写入内容不是马上写入,而是缓存到一定大小后一次性写入。
    默认好像 4kb 写一次。多运行一段时间可以看到写入的内容。也可以按需设置立即写入
  • Linux 默认页大小为 4KB:以页为单位管理内存,即将磁盘数据加载到内存或将内存中的数据写入磁盘,操作系统是以页为单位来操作的。

/boot 配置的大小太小,需清理旧的内核

1
2
3
4
5
6
7
8
uname -a
dpkg --get-selections | grep linux
sudo apt purge linux-image-3.19.0-20-generic # 或sudo apt remove linux-image-3.19.0-20-generic
sudo apt purge linux-headers-3.19.0-20-generic
sudo apt purge linux-modules-3.19.0-20-generic
# 手动更新配置
sudo update-grub2
sudo reboot now
  • Failed to initialize NVML: Driver/library version mismatch
    • 原因:因为联网 ubuntu 自己把 GPU 的驱动更新了,导致 Nvidia 显卡 Kernel Module 与 Driver Version 不一致
1
2
3
4
5
6
7
8
9
sudo apt-get install dkms

cd /usr/src
ls
# 打开nvidia开头的,后缀就是版本号
sudo dkms install -m nvidia -v 410.79


sudo apt-mark hold nvidia-driver-525

  • 问题:NVIDIA-SMI has failed because it couldn’t communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running
  • 原因分析:这个错误是由于 linux 内核版本自动更新,内核版本与驱动版本不适配的原因,为了确保以后不会再出现该问题,
  • 方案一:优先
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 查看已安装的内核
dpkg --get-selections | grep linux-image
unmae -a

sudo apt-get install dkms
# 470.82.00 是在 ll /usr/src 中看到的
sudo dkms install -m nvidia -v 470.82.00

# 标用内核自动更新
sudo vi /etc/apt/apt.conf.d/10periodic
# 将双引号中的 1 全部改为 0 ,然后保存


# --- 附 ---
# 关闭内核更新,使用当前内核
sudo apt-mark hold linux-image-generic linux-headers-generic
linux-image-generic set on hold.
linux-headers-generic set on hold.

# 重启内核更新
sudo apt-mark unhold linux-image-generic linux-headers-generic
  • 方案二:一共分三步来解决
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
# --- 1、固定内核版本 ---
uname -r
uname -a
cd /boot
ls

sudo vi /etc/default/grub # 修改为需要的版本
# --- 修改内容: START ---
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.4.0-90-generic"
# --- 修改内容: END ---

sudo update-grub # 更新
/etc/default/grub文件里修改

# --- 2、重新安装驱动 ---
sudo apt purge nvidia*
ubuntu-drivers devices
sudo apt-get install nvidia-driver-495 nvidia-settings nvidia-prime #一般安装推荐的就行
ll /usr/src/ #查看是否安装好

这里有个问题可能会由于gcc版本过低问题而报错无法生成deb包,因此我们还需修改gcc版本,在修改完gcc版本后再去进行第三步就行。
# --- 3、重新生成deb包 ---
sudo apt install dkms

sudo dkms install -m nvidia -v 495.44
sudo reboot #重启

xx are installed in ‘/home/user_name/.local/bin’ which is not on PATH

1
2
3
4
5
6
vi ~/.bashrc
# 在文件最后添加路径,该路径来源于第一步中安装 pip 时发出的警告
export PATH=/home/user_name/.local/bin:$PATH

# 保存后,激活之
source ~/.bashrc

  • 问题:lesspipe: command not found
  • 解决方案:运行下面这行,实现命令行内可以正常使用 bin 下的命令,比如 source、ls 等
1
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

  • WARNING:You do not appear to have an NVIDIA GPU supportedd by the xxx.xxx.xx NVIDIA Linux graphics driver installed in this system.
  • 解决方案:
    • 显卡驱动版本不对
    • 显卡松动,系统“看不到”这个硬件

  • Linux 下不能连接: ppa.launchpad.net 的问题(中科大软件源)
  • 替换:
1
2
3
4
sudo vi  /etc/apt/sources.list.d/ubuntu-toolchain-r-ubuntu-test-xenial.list
# 将文件中http://ppa.launchpad.net替换为https://launchpad.proxy.ustclug.org
deb https://launchpad.proxy.ustclug.org/ubuntu-toolchain-r/test/ubuntu xenial main
sudo apt-get update

Nvidia 驱动安装


  • 问题:Linux 的 Nvidia 驱动安装时:The target kernel has CONFIG_MODULE_SIG set, which means that it supports cryptographic signatures on kernel modules. On somex systems, the kernel may refuse to load modules without a valid signature from a trusted key. This system also has UEFI Secure Boot enabled; many distributions enforce module signature verification on UEFI systems when Secure Boot is enabled. Would you like to sign the NVIDIA kernel module?
  • 解决方案:BIOS 中关闭 secureboot,

  • 问题:NVIDIA A 100-PCIE-40 GB with CUDA capability sm_80 is not compatible with the current PyTorch installation. The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_70 sm_75. If you want to use the NVIDIA A 100-PCIE-40 GB GPU with PyTorch, please check the instructions at Start Locally | PyTorch
    • 大概意思就是: NVIDIA A 100-PCIE-40 GB 带有的 CUDA 算力是 8.0,它和现有的 PyTorch 版本不匹配,现有的 PyTorch 版本支持的 CUDA 算力是 3.7,5.0,6.0,7.0,7.5。
      算力查看:CUDA GPUs - Compute Capability | NVIDIA Developer
      CUDA 与算力
CUDA 版本最小算力收到弃用消息,但仍然可以运行默认算力最大算力
5.5 以前1.0N/A1.0
6.01.01.01.0
6.51.11.x2.0
7.x2.0N/A2.0
8.02.02.x2.06.2
9.x3.0N/A3.07.0
10.x3.0N/A3.07.5 (3.0 deprecated in 10.2)
11.x3.53.x, 5.05.28.6 (11.0:8.0, 11.1:8.6)

支持的 CUDA 算力是与安装的 cuda 的版本有关的,cuda 10.2 仅仅支持 3.7,5.0,6.0,7.0 算力,不支持 8.0 算力。而 cuda 11 是支持 8.0 算力的。
需要装 cuda 11.0 + 对应的 PyTorch

1
2
# CUDA 11.0
pip install torch==1.7.1+cu110 torchvision==0.8.2+cu110 torchaudio==0.7.2 -f https://download.pytorch.org/whl/torch_stable.html
1
2
3
GeForce RTX 3060 with CUDA capability sm_86 is not compatible with the current PyTorch installation.
The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_70.
If you want to use the GeForce RTX 3060 GPU with PyTorch, please check the instructions at https://pytorch.org/get-started/locally/

  • 问题: The following packages have been kept back
  • 解决方案:因为某个软件包的依赖关系发生了改变,如果要升级这些软件包,必须安装依赖包,这些软件包就会被列在”The following packages have been kept back”里面。
    • sudo apt-get dist-upgrade:强制更新软件包到最新版本,并自动解决缺少的依赖包

  • 问题:buff/cache 占用过高
  • 解决方案:
    buff(Buffer Cache)是一种 I/O 缓存,用于内存和硬盘的缓冲,是 io 设备的读写缓冲区。根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。
    cache(Page Cache)是一种高速缓存,用于 CPU 和内存之间的缓冲 ,是文件系统的 cache。
    清除 buff/cache
    sync:将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件
    echo 1 > /proc/sys/vm/drop_caches:清除 page cache
    echo 2 > /proc/sys/vm/drop_caches:清除回收 slab 分配器中的对象(包括目录项缓存和 inode 缓存)。slab 分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的 pagecache。
    echo 3 > /proc/sys/vm/drop_caches:清除 pagecache 和 slab 分配器中的缓存对象。
    /proc/sys/vm/drop_caches 的值,默认为 0
1
2
3
4
> sync
> echo 1 > /proc/sys/vm/drop_caches
> echo 2 > /proc/sys/vm/drop_caches
> echo 3 > /proc/sys/vm/drop_caches

  • 问题:交换内存占用太多导致变卡
  • 解决方案:
1
2
3
4
# 禁用所有交换
swapoff -a
# 重新打开交换
swapon -a

nginx 非 root 用户可启动

1
2
3
4
5
6
7
8
9
chown root:root nginx
chmod 755 nginx
chmod u+s nginx

# 测试
nginx -t

# 重启nginx
nginx -s reload
  • bus error(core dumped)
  • 原因:更新时 .so 文件没有更新完整
给博主来一杯卡布奇诺