Linux 系统笔记
笔记来源-B站尚硅谷视频+菜鸟教程+各种网页补充+本计算机截图
适合刚入门小白,主要内容为Linux下面常用命令,Shell编程内容。
linux简介
应用领域
- 服务器领域-最常见,开源免费,稳定高效
- 嵌入式领域
- 个人桌面领域 -薄弱环节,比不上Mac OS 及windows,其实ubuntu还不错了。
linux内核与发行版
-
一个完整的 Linux发行版包括了内核 与一些其他与文件相关的操作,用户管理系统,和软件包管理器等一系列软件。
-
可用uname -a (英文全拼:unix name)命令显示系统信息
Linux 文件系统
目录结构
-
在 Linux 或 Unix 操作系统中,所有的文件和目录都被组织成以一个根节点开始的倒置的树状结构,根节点使用/表示。
-
使用 ls 查看根目录
-
目录 | 作用 |
---|---|
/bin | 存放着linux这个目录存放着最经常使用的命令 |
/sbin | Superuser Binaries ,这里存放的是系统管理员使用的系统管理程序 |
/bin /sbin /usr/bin /usr/sbin 下面命令在任意路径下面都可以用,对于其他的可执行文件如果想要在任意路径下面都可用,需要写入$PATH中 | |
/boot | 启动 Linux 时使用的一些核心文件, 最初给系统分区时候,必须创建该分区 |
/dev | 该目录下存放的是 Linux 的外部设备,比如磁盘,Linux将硬件映射为文件来使用 |
/media | 类windows的其他设备,例如U盘、光驱等等,识别后linux会把设备放到这个目录下 |
/etc | 目录用来存放所有的系统管理所需要的配置文件 |
/home | 在 Linux 中,每个用户都有一个自己的目录,相当于Windows中的User |
/lib | lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库 |
/root | 该目录为系统管理员,也称作超级权限者的用户主目录 |
/usr | usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户安装的应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录 |
/var | 经常被修改的目录放在这个目录下。包括各种日志文件。 |
/mnt | 临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了 |
/tmp | 用来存放一些临时文件的 |
文件操作命令
-
绝对路径:从根目录/出发的路径
-
相对路径:相对路径不是从根目录 / 开始写起,而是从当前所在的工作目录开始写起。其中用 . 表示当前目录和用 … 表示父目录。linux对于每个文件夹都隐藏了两个特殊的目录。
-
常见命令
- pwd
- 打印当前目录的绝对路径
- cd
- 切换当前工作目录,可使用绝对路径和相对路径。
- cd / 返回根目录; cd ~ 返回home目录; cd .. 返回上层目录。
- ls [选项] [目录地址]
- 显示当前目录中的文件及文件夹
- 其中选项 -a 表示显示隐藏,-l 为列表显示,常用 ls -la 简写ll
- mkdir [新建目录名]
- 创建单级目录 mkdir aaa/bbb/ ccc 注意aaa/bbb 需要存在。
- 创建多级目录 mkdir -p 目录名称
- rm [选项] [文件或目录名称]
- 删除文件或者文件夹,需要文件夹为空
- -r 递归删除,可以删除非空文件夹 -f 表示强制删除不需要提示
- touch [filename]
- 创建一个空文件,touch file1 file2 可以同时创建很多文件
- cp [ src] [des]
- 完成源文件向目的文件/目录 或者 源目录向目的目录的复制(需要-r)
- -r 递归复制,使用后可以复制源目录
- cp -r src_dir des_dir ----->将src_dir整个文件夹复制到des文件夹下, 生成 det_dir/src_dir
- cp -r src_dir/* des_dir ------>将src_dir下的所有内容复制到des文件下
- mv [ src] [des]
- 移动文件 mv a.txt b/
- 重命名文件 mv a.txt b.txt
查看文件内容命令
-
cat [file]
- 只读方式查看一个文件内容,文件多页时会一下子显示完,导致前面的看不到
- 常用 cat - n a.txt|more,其中-n显示行号,|为管道符将前面的结果送到后面,more分页显示
-
more [file]
- more以后可以使用空格换页,回车换行,Ctrl+F下滚屏,Ctrl+B上滚屏,Ctrl+C 停止
-
less [file]
- 常用来查看日志等大文件,不是一次读入所有内容,根据显示需要加载内容。
-
输出重定向符号> 删除重建方式 ,>>追加方式
- ls -la> a.txt
- echo “export PYTHONPATH= newPythonPath:$PYTHONPATH” >> ~/.bashrc 上述echo打印字符串重定向追加到bashrc文件中。 字符串可以永久增加newPythonPath到PYTHONPATH中。
-
head [选项] [filename]
- 默认显示文件的头10行, 可以使用-n 指定
- head -n 1 data.json 显示data.json 第一行内容
-
tail [选项] [filename]
- 默认显示文件的尾10行, 可以使用-n 指定
- tail -f filename 可以实时显示文件更新
-
ln -s src dst
- 软链接,类似于window中的快捷方式。
- 删除软链接直接就 rm 软链接名称
- cd 到软链接dst文件夹会跳到src的文件夹
-
find
-
find [搜索路径] -name filename 按照指定完整文件名称查找
-
find [搜索路径] -user username 按照用户名查找
-
find 范围 -size +20M(表示大于20M) (-20k小于20k的文件,等于直接输入数字)
-
-
grep “regex”
- 实现过滤查找,常与管道符|结合 ls -la | grep “.txt” 查找列表包含以.txt内容
- -n 显示行号 -i 忽略大小写
压缩与解压缩
- gzip/guzip file
- zip/uzip file
- tar [选项] [file/dir]
- tar -zcvf a.tar.gz a1.txt a2.txt — 将 a1.txt a2.txt打包并压缩为a.tar.gz
- tar -zxvf a.tar.gz -C 解压的目录 —将a.tar.gz 解压到指定目录
- 选项 中 -c 产生打包文件 -v 显示详细信息 -f 指定压缩后的文件名称 -z 打包时候压缩/解压 -x 解包t
- pwd
用户管理+组管理
- Linux 系统是一个多用户多任务的操作系统(典型的可以多个用户同时使用SSH访问一台设备)
- 用户的角色是通过用户ID(UID)和组ID(GID)识别的,一个UID是唯一标识一个系统用户的账号,每个用户都可以有自己的home目录
- 组常用来管理权限,比如指定develper组拥有对某些文件读写权限,将用户加入developer后组后, 该用户拥有对这些文件的读写权限
- 用户与组对应关系:每个用户至少属于一个组,一个组包括任意数量用户
- 在/etc 目录中四个文件与用户和组管理相关,其中 /etc/passwd - 用户相关信息, /etc/shadow 用户密码 ,/etc/group-组信息,/etc/gshadow- 密码
用户管理
-
查看所有用户-- 在 /etc/passwd 中查看,每一行为一个用户,包括7个字段,字段间使用:分开,字段一次代表用户名:密码:UID:GID:用户描述:home dir:使用的shell类型
-
添加用户
- sudo useradd -m username #ubuntu中使用-m后才能产生该用户的家目录,同时默认创建一个同名的组。
- sudo useradd -g groupid username # 创建用户时指定组
-
重置密码:passwd 用户名
-
删除用户:userdel 用户名
-
查看当前用户:whoami
-
查询任意用户:id 用户名 返回UID,GID,group
-
修改用户: usermod [选项] 用户名
- 其中 -s 用户使用的shell , -g 组编号
cat /etc/passwd
#root:x:0:0:root:/root:/bin/bash
#daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
#bin:x:2:2:bin:/bin:/usr/sbin/nologin
#sys:x:3:3:sys:/dev:/usr/sbin/nologin
#sync:x:4:65534:sync:/bin:/bin/sync
#games:x:5:60:games:/usr/games:/usr/sbin/nologin
#...
#ws:x:1000:1000:ws,,,:/home/ws:/bin/bash
#ajia:x:1001:1000::/home/ajia:/bin/sh
########################
#用户名:密码:id号:group号:用户描述:home dir:使用的shell类型
# root id=0, gid=0 超级用户
# bin,sys 程序用户,编号1~499:这个范围是保留给系统用户使用的UID
# ws,ajia 普通账户UID,编号500~65535
sudo useradd -m tom # 添加用户tom
id tom
#用户id=1001(tom) 组id=1002(tom) 组=1002(tom) 默认创建一个同名的组
sudo passwd tom # 为tom设置密码
whoami #ws
id ws #用户id=1000(ws) 组id=1000(ws) 组=1000(ws)
sudo usermod -g 1000 tom #将tom 加入 组1000中
id tom #用户id=1001(tom) 组id=1000(ws) 组=1000(ws)
sudo userdel tom #删除tom
id tom # id: “tom”:无此用户
组管理
-
查看用户所在的所有组 groups
-
添加组 groupadd [-g GID] 组名
-
删除组 groupdel 组名
-
更改组 groupmod [-g GID -n groupname] 组名
groups ws #查看ws所在的所有组 #ws : ws adm cdrom sudo dip plugdev lpadmin lxd sambashare sudo groupadd -g 1200 lol # 添加组lol,设置GID=1200 cat /etc/group #配置文件/etc/group中查看组添加情况 # lol:x:1200: sudo usermod -a -G lol ws # 使用usermod 配合参数-a -G 组名,将ws加入lol组,而不离开自己原先组 groups ws # ws : ws adm cdrom sudo dip plugdev lpadmin lxd sambashare lol sudo groupdel lol #删除组 lol groups ws #ws : ws adm cdrom sudo dip plugdev lpadmin lxd sambashare
文件权限管理
文件和目录权限 对于每个文件或者目录都有三种权限需要设置,文件所有者权限,所在组权限,其他组权限。
文件权限修改:
rwx作用于文件,r表示文件可读,w表示文件可写,x表示文件可执行;
rwx作用与目录, r可以使用ls查看,w表示对目录内内容创建删除及重命名该目录,x表示可cd
-
chown 用户名 文件名 #change owner 修改文件的所有者
-
chgrp 组名 文件名 #改变了组但是没有更改文件所有者
-
修改具体rwx权限 chmod命令
-
使用运算符配合各种组的简称来更改权限
简称 u(user-所有者)、 g(group-组)、o(other-其他组) 、a( all)
= 表示直接赋予 chmod u=rwx,g=rw,o=r 文件名
-表示减少一个权限 g-r
+表示添加一种权限 g+r
-
使用数字变更权限(推荐)其中r=4, w=2,x=1
chmod u=rwx,g=rx,o=x a.sh 相当于 chmod 751 a.sh
-
ws@ws-System-Product-Name:~/Public$ ls -l
总用量 8
-rw-rw-r-- 1 ws ws 0 12月 25 15:13 a.txt
-rw-rw-r-- 1 ws ws 0 12月 25 15:13 b.txt
-rw-rw-r-- 1 ws ws 0 12月 25 15:21 c.txt
-rw-rw-r-- 1 ws ws 117 12月 25 16:53 d.tar.gz
drwxrwxr-x 2 ws ws 4096 12月 25 16:56 ws_pic
ws@ws-System-Product-Name:~/Public$ sudo chown tom a.txt #将a.txt让tom拥有
#-rw-rw-r-- 1 tom ws 0 12月 25 15:13 a.txt
ws@ws-System-Product-Name:~/Public$ sudo chgrp lol a.txt #将a.txt让组lol拥有
#-rw-rw-r-- 1 tom lol 0 12月 25 15:13 a.txt
ws@ws-System-Product-Name:~/Public$ sudo chmod u=rwx,g=rw a.txt
#a.txt 受用者权限为 rwx,所在组权限rw,其他为默认自读权限
#-rwxrw-r-- 1 tom lol 0 12月 25 15:13 a.txt*
ws@ws-System-Product-Name:~/Public$ sudo chmod 764 b.txt
#-rwxrw-r-- 1 ws ws 0 12月 25 15:13 b.txt*
资源管理
磁盘管理
- 总体磁盘使用查询: df -h
- du [选项] [目录名称] --disk usage命令用于显示目录或文件的大小。
- -h 显示计量单位,以K,M,G为单位,提高信息的可读性
- -a 包含所有文件
- -s 只显示包含汇总信息
- –max-depth=<目录层数> 超过指定层数的目录后,予以忽略
- 常用命令
- 查询某目录下面文件个数:ls -l | grep “^-”| wc -l # (wc 查询字节、word、line 个数)
- 递归查询某目录下面文件个数:ls -lR | grep “^-”| wc -l
- 查询某目录下面目录个数:ls -l | grep “^d”| wc -l
- 递归查询某目录下面目录个数:ls -lR | grep “^d”| wc -l
进程管理
-
进程概念
-
查看进程命令
ps -aux: all 进程, user模式、x显示后台进程 ,配合 |grep 使用
ps -ef|grep xxx
-
终止进程:
kill -9 进程ID 先查询进程后终止。
Shell编程
Shell概念
Shell 是一个命令行解析器,它为用户提供了一个向Linux内核发起请求以便运行程序的界面系统级程序;用户可以使用Shell来启动、挂起、停止甚至编写一些程序。
例子使用Shell 开启深度学习模型训练:
#!/bin/sh
CUDA_VISIBLE_DEVICES=0,1,2,3\
python examples/mgmt_source_pretrain.py \
-ds market1501 -dt dukemtmc\
-a resnet50_AB_mult_parts\
--margin 0.0 --num-instances 4 \
-b 64 -j 4 --warmup-step 10 \
--lr 0.00035 --milestones 40 70 \
--iters 200 --epochs 80 --eval-step 5 \
--logs-dir logs/market1501TOdukemtmc/mgmt_pretrain \
--data-dir /home/ws/submit/data/reid_dataset/
- 脚本以#!/bin/bash 表示使用bash来解释
- 长命令可通过加 \ 的方式来进行换行拆分,\后面不能有空格,便于阅读。比如上面python 命令参数过长
- 单行注释使用#,多行注释使用 :<< ! 注释内容 !
- 如果该文件有执行权限,可以 xxx/xx.sh执行;若无可以 sh xx.sh执行
Shell 变量
Shell 变量就起作用域来讲,可分为局部变量(函数内有效),全局变量(shell进程有效,我们开启的一个终端就是一个Shell进程),环境变量 (当前Shell进程进行及当前进程的子进程有效,如果我们在shell终端内,执行 sh xxx/xxx.sh,相当了开启了shell子进程),具体可见 Shell变量的作用域。
-
Shell 普通变量定义 变量名=值 ,定义只读变量 readonly 变量名=值,注意 "="两端没有空格。
-
使用Shell变量 $变量名 或者 ${变量名}
-
撤销变量: unset 变量名,其中只读变量不可unset
-
有些系统设置好的变量,我们直接可使用,比如HOME、PWD、SHELL、USER等,可以使用set查看所有系统设置好的变量,建议使用set|more 分页查看。
-
Shell 支持一维数组,数组名=(值1 值2 … 值n), 使用时 ${数组名[下标]}
#!/bin/sh
echo "system variable USER=${USER}"
echo "system variable SHELL= $SHELL"
echo "system variable PATH= $PATH"
VALUE_B=2
echo "VALUE_B=${VALUE_B}"
unset VALUE_B
echo "VALUE_B=${VALUE_B}"
###########output###########
system variable USER=ws
system variable SHELL= /bin/bash
system variable PATH= /home/ws/.vscode-server/bin/ccbaa2d27e38e5afa3e5c21c1c7bef4657064247/bin:/home/ws/anaconda3/bin:/home/ws/anaconda3/condabin:/home/ws/.vscode-server/bin/ccbaa2d27e38e5afa3e5c21c1c7bef4657064247/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/cuda-11.1/bin:/usr/local/cuda-11.1/bin
VALUE_B=2
VALUE_B=
###############################
export 定义环境变量,方便子线程使用。 在 shell 中执行程序时,shell 会提供一组环境变量。export 可新增,修改或删除环境变量,供后续执行的程序使用。export 的效力仅限于该次登陆操作。export [变量名称]=[变量设置值], ok以一个例子来说,我们需要执行一个a.py 文件,但是该文件需要一些python包依赖,执行前我们需要将这些包导入到PYTHONPATH 系统设置的变量中,这样执行a.py 文件,我们可以找到相应包了
export PYTHONPATH=$PYTHONPATH:/home/ws
#PYTHONPATH变量值设为原来PYTHONPATH值($PYTHONPATH)+新加值(/home/ws),这是使用:分割相当于win7中的";", 提醒一点题外话,注意$PYTHONPATH:/home/ws 与 /home/ws:$PYTHONPATH的顺序,如果两个路径有相同的python package话,sys.path 是按顺序检查,注意别使用错package了。
python a.py
未使用eport前:
使用eport后:
如果使用sh xx/a.sh命令启动shell脚本,shell 脚本中执行了python b.py, 其中shell脚本 a.sh及python文件b.py 中使用到的相当路径,都是相当于执行sh xx/a.sh命令的路径
位置参数变量:我们在执行Shell脚本时候,可以同时传入一些参数,位置参数变量就是为了获取命令行中的参数。
- $n 其中 n位数字,$0 代表脚本本身,$1-$n表示脚本后续传入参数,其中大于10时候使用${10}表示第10个位置参数。
- $* 表示将表示命令行中的所有位置参数,不过看成一个整体
- $@ 表示将命令行中的所有位置参数 ,不过区分对待
- $# 表示所有位置参数的个数
#!bash/bin
echo "$1 $2"
echo "$*"
echo "$@"
echo "number of parameters is $#"
###############output#############
#执行脚本时候输入位置参数 10 20
10 20
10 20
10 20
number of parameters is 2
Shell表达式
Shell中支持算术运算,算数运算符有加减乘除取余: + , − , ∗ , / , % +,-,*,/,\% +,−,∗,/,%
- $[expression] , $[4+5], 推荐
- $((expression)), $((4+5))
- `expr 4 + 5 ` , 注意使用的着重号,不是单引号。而且运算符和操作数间有空格
关系运算符还是常用的6组等于、不等于,大于,大于等于,小于,小于等于:-eq, -ne, -gt, -ge,-lt,-le
布尔运算符:使用[ ], 对于与和或运算符的前后表达式都执行,这点与||和&&不同。
逻辑运算符:!(取反),&&(与运算),||(或运算)。使用[[ ]], 注意与或运算同C一样,如果可以根据前面表达式推算出结果,后面表达式便不执行。
#!bash/bin
A=$[3+2]
B=$[3+3]
echo "A=${A},B=${B}"
if [ $A -lt $B ]
then
echo "A < B"
elif [ $A -eq $B ]
then
echo "A = B"
else
echo "A > B"
fi
if [ $A -lt 6 -o $B -lt 6 ]
then
echo "A,B 至少1个小于5"
fi
echo "######################"
if [[ $A -lt 6 || $B -lt 6 ]]
then
echo "A,B 至少1个小于5"
fi
C=$(ls|grep ".txt")
echo "$C"
#############output##############
A=5,B=6
A < B
A,B 至少1个小于5
######################
A,B 至少1个小于5
a.txt
b.txt
c.txt
$(linux 命令),可以将Linux命令结果返回, 如上面C=$(ls|grep “.txt”)
Shell 控制语句
if
if [ 条件判断式 ]
then
执行代码
fi
if [ 条件判断式1 ]
then
执行代码1
elif [ 条件判断式1 ]
then
执行代码2
else
执行代码3
fi
#注意表达式两端空格
case
case 变量 in
value1)
执行代码1
;;
value2)
执行代码2
;;
*)
执行default
;;
esac
for
for 变量 in value1 value2 value1
do
代码
done
while
while [ 条件表达式 ]
do
代码
done
Shell function
- 函数定义,其中关键字function可有可无,没有形参,直接在函数体使用位置参数(或函数体使用某个变量,在调用时候需要输入相同变量名)
- 函数调用 func 参数1 参数2
- 如果函数有返回值,使用$?来临时表示,其中$?最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
- 可以直接调用函数,将返回值作为if判断条件表达式,其中0为 True,非0为False,这点跟其他语言不同
function func(){
代码
[return xx]
}
#!/bin/bash
function getSum(){
SUM=$[$1+$2]
echo "SUM is ${SUM}"
return ${SUM}
}
getSum 2 3
MYSUM=$?
echo "MYSUM is ${MYSUM}"
function demoFun1(){
return 0
}
function demoFun2(){
return 12
}
if demoFun1
then
echo true
else
echo false
fi
if demoFun2
then
echo true
else
echo false
fi
##################output##############
SUM is 5
MYSUM is 5
true
false
linux分区挂载卸载
挂载
将物理硬盘的多个分区挂载在文件目录上面,通过访问这个目录其实就是访问这个磁盘上的内容
- 查看挂载情况 lsblk -f
- 文件分区标号含义:
- sda1 - sd 表示硬盘的类性 ,a 表示第几块物理硬盘 , 表示该物理硬盘上的第几号分区 (sda为我的机械硬盘)
- nvme0n1 为我固态硬盘
如何挂载- 未测试
存储介质选择—》硬盘分区操作;创建分区来容纳文件系统;创建分区,这个分区可以是整个硬盘也可以是部分硬盘----》创建文件系统(我们在存储数据之前,你必须使用文件系统对其分区进行格式化)----》把它挂载到虚拟目录----》写入配置文件/etc/fstab
1. 添加硬盘以后使用 lsblk (-f) 就可以看到有一个未分区的硬盘
2. 创建分区: fdisk /dev/磁盘名称
3. 格式化 mkfs -t ext4 /dev/分区
4. 挂载 mount /dev/sdb1 mount/(文件系统某目录) 取消挂载是umount 该文件目录/ 磁盘分区
5. 永久挂载 修改配置文件/etc/fstab,完成后 执行mount -a
其他命令
-
date
-
显示标准的年月日时分秒
-
date “+%Y-%m-%d %H:%M:%S” #使用格式匹配显示自己想要的格式
-
-
cal
- 显示日历