Linux 系统笔记
笔记来源-B站尚硅谷视频+菜鸟教程+各种网页补充+本计算机截图 适合刚入门小白,主要内容为Linux下面常用命令,Shell编程内容。
linux简介
应用领域
- 服务器领域-最常见,开源免费,稳定高效
- 嵌入式领域
- 个人桌面领域 -薄弱环节,比不上Mac OS 及windows,其实ubuntu还不错了。
linux内核与发行版
Linux 文件系统
目录结构
目录 | 作用 |
---|
/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 系统是一个多用户多任务的操作系统(典型的可以多个用户同时使用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
sudo useradd -m tom
id tom
sudo passwd tom
whoami
id ws
sudo usermod -g 1000 tom
id tom
sudo userdel tom
id tom
组管理
文件权限管理
文件和目录权限 对于每个文件或者目录都有三种权限需要设置,文件所有者权限,所在组权限,其他组权限。 文件权限修改:
? rwx作用于文件,r表示文件可读,w表示文件可写,x表示文件可执行;
? rwx作用与目录, r可以使用ls查看,w表示对目录内内容创建删除及重命名该目录,x表示可cd
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
ws@ws-System-Product-Name:~/Public$ sudo chgrp lol a.txt
ws@ws-System-Product-Name:~/Public$ sudo chmod u=rwx,g=rw a.txt
ws@ws-System-Product-Name:~/Public$ sudo chmod 764 b.txt
资源管理
磁盘管理
- 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 -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}"
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
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个位置参数。
- $* 表示将表示命令行中的所有位置参数,不过看成一个整体
- $@ 表示将命令行中的所有位置参数 ,不过区分对待
- $# 表示所有位置参数的个数
echo "$1 $2"
echo "$*"
echo "$@"
echo "number of parameters is $#"
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一样,如果可以根据前面表达式推算出结果,后面表达式便不执行。
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"
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
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
其他命令
|