Linux学习笔记
前言:本系列笔记的参考由 2021韩顺平 一周学会Linux 总结而成,希望能给学习Linux的同学一些帮助。也感谢韩老师录制的视频给我带来了非常巨大的收获!
目录:
- 韩顺平老师的Linux基础学习笔记 (上)
- 韩顺平老师的Linux基础学习笔记 (下)
6. Linux 组管理
在Linux中的每个用户必须属于一个组,不能独立于组外。在Linux中每个文件有所有者、所在组、其它组的概念
- 所有者
- 所在组
- 其他组
- 改变用户所在的组
在 Linux中,每一个用户都要属于一个组
在 Linux 系统中,文件根据所有者及所有者所在的组分为三个概念
- 文件的所有者是谁。一般的,谁创建了这个文件,这个文件的所有者就是谁/可更改所有者
- 这个文件属于哪个组的,那么这个组中的用户对这个文件拥有一定的权限
- 对于
a.txt
这个文件来说,组2和组3就属于其他组,其他组的用户对a.txt
也拥有一定的权限
以上就是 Linux 对于文件的管理机制
6.1 文件/目录 所有者
一般为文件的创建者,谁创建了该文件,就自然的成为该文件的所有者
查看文件的所有者
语法:ls -ahl
其中第三列就是所有者
修改文件的所有者
语法:chown 用户名 文件名
-----使用root创建一个文件apple.txt,然后将其所有者修改成tom-----
[root@SanxCentOS7 home]# touch apple.txt
[root@SanxCentOS7 home]# ll
-rw-r--r--. 1 root root 0 10月 30 16:58 apple.txt
[root@SanxCentOS7 home]# chown ben apple.txt
[root@SanxCentOS7 home]# ll
-rw-r--r--. 1 ben root 0 10月 30 16:58 apple.txt
6.2 组的创建
语法:groupadd 组名
-----创建一个组moster-----
[root@SanxCentOS7 home]# groupadd moster
-----创建一个用户fox,并放入到moster组中-----
[root@SanxCentOS7 home]# useradd -g moster fox
[root@SanxCentOS7 home]# id fox
uid=1004(fox) gid=1006(moster) 组=1006(moster)
6.3 文件/目录 所在组
当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组
查看文件/目录所在组
语法:ls -ahl
-----使用fox来创建一个文件,查看该文件-----
[fox@SanxCentOS7 ~]$ touch ok.txt
[fox@SanxCentOS7 ~]$ ls -ahl
-rw-r--r--. 1 fox moster 0 10月 30 17:12 ok.txt
此时由于fox属于monster组,所以fox创建出来的文件所在组为monster
修改文件所在的组
语法:chgrp 组名 文件名
-----使用root用户创建文件orange.txt,查看当前这个文件属于哪个组,然后将这个文件所在组修改到fruit组-----
[root@SanxCentOS7 ~]# groupadd fruit
[root@SanxCentOS7 ~]# touch orange.txt
[root@SanxCentOS7 ~]# ls -ahl
-rw-r--r--. 1 root root 0 10月 30 17:19 orange.txt
[root@SanxCentOS7 ~]# chgrp fruit orange.txt
[root@SanxCentOS7 ~]# ls -ahl
-rw-r--r--. 1 root fruit 0 10月 30 17:19 orange.txt
6.4 修改所在组
其他组
除文件的所有者和所在组的用户外,系统的其他用户都是文件的其他组
改变用户所在组
在添加用户时,可以指定将该用户添加到那个组中,同样的用root的管理权限可以改变某个用户所在的组
改变用户所在组
usermod -g 新组名 用户名
usermod -d 新目录名 用户名
:改变该用户登录的初始目录
特别说明:用户需要有进入到新目录的权限
-----将fox这个用户从原来所在组,修改到animal组-----
[root@SanxCentOS7 home]# id fox
uid=1004(fox) gid=1006(moster) 组=1006(moster)
[root@SanxCentOS7 ~]# usermod -g animal fox
[root@SanxCentOS7 ~]# id fox
uid=1004(fox) gid=1008(animal) 组=1008(animal)
6.5 rwx 权限
ls -l 中显示的内容如下:
-rw-r--r--. 1 root root 131 10月 7 14:42 Hello.java
其中每个r开头及之后的2位为一组:- rw- r-- r--
权限实例:
-rw-r--r--. 1 root root 131 10月 7 14:42 Hello.java //普通文件
brw-rw----. 1 root disk 8, 0 11月 17 10:43 sda //块设备
crw-------. 1 root root 10, 234 11月 17 10:43 btrfs-control //字符设备
drwxr-xr-x. 3 root root 60 11月 17 10:43 bus //目录
lrwxrwxrwx. 1 root root 3 11月 17 10:43 cdrom -> sr0 //快捷方式
其中我们把 -rw-r--r--
这十位做一个说明:
-
第1位确定文件类型 ( d , - , l , c , b )
-
是普通文件
l
是链接,相当于 Windows 的快捷方式
d
是目录,相当于 Windows 的文件夹
c
是字符设备文件,比如鼠标、键盘
b
是块设备,比如硬盘 -
第2~4位确定所有者(该文件的所有者)拥有该文件的权限——User
-
第5~6位确定所属组(同用户组的用户)拥有该文件的权限——Group
-
第7~9位确定其他用户拥有该文件的权限——Other
⭐rwx 权限详解
-
rwx作用到文件
[r]
代表可读(Read):可以读取、查看[w]
代表可写(Write):可以修改,但是不代表可以删除该文件
删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件[x]
代表可执行(Execute):可以被执行
-
rwx作用到目录
[r]
代表可读(Read):可以读取、ls查看目录内容[w]
代表可写(Write):可以修改,对目录内可以 创建、删除、重命名目录[x]
代表可执行(Execute):可以进入该目录
文件及目录权限实例
ls -l 中显示的内容如下:
-rwxrw-r-- 1 root root 1213 Feb 2 09:39 abc
其中,第一个root代表root用户,第二个root代表文件所在组为root
- 10 个字符确定不同用户能对文件干什么
第一个字符代表文件类型:-、l、d、c、b
其余字符每 3 个一组 (rwx)、读 ®、写(w)、执行(x)
第一组 rwx :文件拥有者的权限是读、写和执行
第二组 rw- :与文件拥有者同一组的用户的权限是读、写但不能执行
第三组 r-- :不与文件拥有者同组的其他用户的权限是读不能写和执行
在Linux中,可用数字表示权限,上述权限可表示为:r=4、w=2、x=1,因此rwx=4+2+1=7
-rwxrw-r-- 1 root root 1213 Feb 2 09:39 abc
从左到右解析依次是:
第一组 rwx :文件拥有者的权限是读、写和执行
第二组 rw- :与文件拥有者同一组的用户的权限是读、写但不能执行
第三组 r-- :不与文件拥有者同组的其他用户的权限是读不能写和执行
1 如果是文件代表硬连接数,如果是目录代表子目录数
root 用户
root 组
1213 文件大小(字节),如果是文件夹,显示4096字节
Feb 2 09:39 最后修改日期
abc 文件名
6.6 修改权限 -chmod
概述:通过chmod指令,可以修改文件或者目录的权限
- 第一种方式:
+ 、- 、=
变更权限
u
: 所有者(是指文件或者是目录的拥有者)
q
:所有组
o
:其他用户
a
:所有人 ( u、g、o的总和 )
基本语法:
chmod u=rwx,g=rx,o=x 文件/目录名
1. u=rwx 代表给文件/目录的所有者赋予读写执行的权限
2. g=rx 代表给文件/目录的所属组的所有用户赋予读执行权限
3. o=x 代表给文件/目录的其他组的所有用户赋予执行权限
chmod o+w 文件/目录名
1. o+w 代表给文件/目录的所有者赋予写的权限
chmod a-x 文件/目录名
1. a-x 代表给文件/目录的所有者、所属组、其他人撤销执行的权限
案例:
1.给abc文件的所有者读写执行的权限,给所在组读执行权限,给其他组读执行权限
chmod u=rwx,g=rx,o=x abc
2.给abc文件的所有者除去执行的权限,增加组写的权限
chmod u-x,g+w abc
3.给abc文件的所有用户添加读的权限
chmod a+r abc
6.7 修改文件所有者 -chown
基本语法介绍
chown newowner 文件/目录
改变所有者chown newowner:newgroup 文件/目录
改变所有者和所在组
-R
:如果是目录,则使其下所有子文件或目录递归生效
案例演示:
-----将 /home/abc.txt文件的所有者修改成fox-----
核心命令:chown fox /home/abc.txt
[root@SanxCentOS7 home]# touch abc.txt
[root@SanxCentOS7 home]# ll
-rw-r--r--. 1 root root 0 11月 20 14:53 abc.txt
[root@SanxCentOS7 home]# chown fox /home/abc.txt
[root@SanxCentOS7 home]# ll
-rw-r--r--. 1 fox root 0 11月 20 14:53 abc.txt
-----将 /home/test 目录下所有的文件和目录所有者都修改成fox-----
核心命令:chown -R fox /home/test
[root@SanxCentOS7 test]# touch {1..5}.txt
[root@SanxCentOS7 test]# ll
-rw-r--r--. 1 root root 0 11月 20 14:55 1.txt
-rw-r--r--. 1 root root 0 11月 20 14:55 2.txt
[root@SanxCentOS7 home]# ll
drwx------. 3 xiaohong xiaohong 4096 10月 7 15:33 test
[root@SanxCentOS7 home]# chown -R fox /home/test/
[root@SanxCentOS7 home]# ll test/
-rw-r--r--. 1 fox root 0 11月 20 14:55 1.txt
-rw-r--r--. 1 fox root 0 11月 20 14:55 2.txt
[root@SanxCentOS7 home]# ll
drwx------. 3 fox xiaohong 4096 11月 20 14:55 test
6.8 修改文件所在组 -chgrp
基本语法介绍:
chgrp newgroup 文件/目录
改变所属组
-R
:如果是目录,则使其下所有子文件或目录递归生效
案例演示:
-----将/home/abc.txt文件的所在组修改成shaolin-----
核心代码:chgrp shaolin /home/abc.txt
[root@SanxCentOS7 home]# ll
-rw-r--r--. 1 fox root 0 11月 20 14:53 abc.txt
[root@SanxCentOS7 home]# groupadd shaolin
[root@SanxCentOS7 home]# chgrp shaolin /home/abc.txt
[root@SanxCentOS7 home]# ll
-rw-r--r--. 1 fox shaolin 0 11月 20 14:53 abc.txt
-----将/home/test目录下所有的文件和目录的所在组修改成shaolin-----
核心代码:chgrp -R shaolin /home/test
[root@SanxCentOS7 home]# ll
drwx------. 3 fox xiaohong 4096 11月 20 14:55 test
[root@SanxCentOS7 home]# chgrp -R shaolin /home/test/
[root@SanxCentOS7 home]# ll
drwx------. 3 fox shaolin 4096 11月 20 14:55 test
6.9 案例实践
1. 警察和土匪游戏
组:police、bandit
警察:jack、jerry
土匪:xh、xq
要求:
-
创建组
groupadd police groupadd bandit
-
创建用户
useradd -g police jack useradd -g police jerry useradd -g bandit xh useradd -g bandit xq
-
jack创建一个文件,自己可以读写本组人可以读,其他组没有任何权限
jack本人登录 touch testFile.txt chmod u=rw,g=r testFile.txt 也可以写chmod 640 testFile.txt
-
jack修改该文件,让其他组人可以读,本组人可以读写
chmod g=rw,o=r testFile.txt 也可以写chmod 664 testFile.txt
-
xh投靠警察,看看是否可以读写
usermod -g police xh
2. 西游记
groupadd sx
groupadd yg
useradd -g sx tangseng
passwd 123
useradd -g sx shaseng
passwd 123
useradd -g yg wukong
passwd 123
useradd -g yg bajie
passwd 123
登录wukong su - wukong
touch monkey.java
vim monkey.java
i
class monkey {
public static void main(String[] args) {
System.out.println("i am monkey");
}
}
:wq
chmod g+rw monkey.java
vim monkey.java
i
class monkey {
public static void main(String[] args) {
System.out.println("i am monkey");
System.out.println("i am pig");
}
}
:wq
usermod -g yg shaseng
su - shaseng
vim monkey.java
class monkey {
public static void main(String[] args) {
System.out.println("i am monkey");
System.out.println("i am pig");
System.out.println("我是沙僧,我是妖怪!");
}
}
:wq
注意:如果家目录下的文件可以允许组的其他成员访问
但家目录如果没有访问权限的话是不能访问家目录下的文件的
一般的在这道题中,需要对悟空的所属组提权chmod g+r+w+x wk
7. Linux 定时任务调度
7.1 crond 任务调度
crontab
进行定时任务的设置
概述:任务调度:是指系统在某个时间执行的特定的命令或程序
任务调度分类:
- 系统工作:有些重要的工作必须周而复始地执行。如病毒扫描等
- 个别用户工作:个别用户可能希望执行某些程序,比如对MySQL数据库的备份
基本语法:crontab [选项]
常用选项
选项 | 作用 |
---|---|
-e | 编辑 crontab 任务 |
-l | 查询 crontab 任务 |
-r | 删除当前用户所有的 crontab 任务 |
案例演示
设置任务调度文件:/etc/crontab
设置个人任务调度,执行 crondtab -e命令
接着输入任务到调度文件
如:*/1****ls -l /etc/ > /tmp/to.txt
意思就是每小时的每分钟执行 ls -l /etc/ > /tmp/to.txt命令
参数细节说明
项目 | 含义 | 范围 |
---|---|---|
第一个 “ * ” | 一个小时当中的第几分钟 | 0~59 |
第二个 “ * ” | 一天当中的第几小时 | 0~23 |
第三个 “ * ” | 一月当中的第几天 | 1~31 |
第四个 “ * ” | 一年当中的第几月 | 1~12 |
第五个 “ * ” | 一周当中的星期几 | 0~7(0和7都代表星期日) |
7.2 crond 时间规则
特殊符号的说明
特殊符号 | 含义 |
---|---|
* | 代表任何时间。比如第一个 " * " 就代表一小时中每分钟都执行一次的意思 |
, | 代表不连续的时间。比如 “0 8,12,16 * * * 命令”,就代表在每天的8:00分、12:00分、16:00分都执行一次命令 |
- | 代表连续的时间范围。比如 “0 5 * * 1-6命令”,代表在周一到周六的凌晨5:00执行命令 |
*/n | 代表每隔多久执行一次。比如 “*/10 * * * * 命令”,代表每隔10分钟就执行一遍命令 |
7.3 crond 任务实例
-----每隔1分钟,就将当前的日期信息,追加到/tmp/mydate文件中-----
crontab -e
i
*/1 * * * * date >> /tmp/mydate
esc
:wq
-----每隔1分钟,将当前日期和日历都追加到/home/mycal文件中-----
方案1:写两条指令
crontab -e
i
*/1 * * * * date >> /home/mycal
*/1 * * * * cal >> /home/mycal
esc
:wq
方案2:写shell脚本
vim /home/my.sh
i
date >> /tmp/mycal
cal >> /tmp/mycal
esc
:wq
crontab -e
i
*/1 * * * * /home/my.sh
esc
:wq
-----每天凌晨2:00将MySQL数据库testdb,备份到文件中-----
提示:mysqldump -u root -p密码 数据库 > /home/db.bak
crontab -e
i
0 2 * * * mysqldump -u root -p密码 testdb > /home/db.bak
esc
:wq
crond 相关指令
crontab -r
:终止任务调度crontab -l
:列出当前有哪些任务调度service crond restart
:重启任务调度
注意:在设置定时执行某个脚本的时候需要注意 该脚本文件的权限是否为可执行
7.4 at 定时任务
基本介绍:
-
at 命令 是一次性定时计划任务,at的守护进程atd会以后台模式运行,检查作业队列来运行
-
默认情况下,atd守护进程每60秒检查作业队列
有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业
-
at 命令 是一次性定时计划任务,执行完一个任务后不再执行此任务了
-
在使用 at 命令的时候,一定要保证atd进程的启动,可以使用相关指令来查看
ps -ef | grep atd
检测atd进程是否运行
基本语法:at [选项] [时间]
Ctrl + D结束at命令的输入
at 命令选项
选项 | 含义 |
---|---|
-m | 当指定的任务被完成后,将给用户发送邮件,即使没有标准输出 |
-I | atq 的别名 |
-d | atrm 的别名 |
-v | 显示任务将被执行的时间 |
-c | 打印任务的内容到标准输出 |
-V | 显示版本信息 |
-q <队列> | 使用指定的队列 |
-f <文件> | 从指定文件读入任务而不是从标准输入读入 |
-t <时间参数> | 以时间参数的形式提交要运行的任务 |
at 时间选项
at 指定时间的方法:
-
接受在当天的 hh : mm ( 小时 : 分钟 ) 式的时间指定。假如该时间已过去,那么就放在第二天执行
例如04:00 -
使用 midnight (深夜),noon (中午),teatime (饮茶时间,一般是下午4点) 等比较模糊的词语来指定时间
-
采用12小时计时制,即在时间后面加上AM (上午) 或 PM (下午) 来说明是上午还是下午。例如:12pm
-
指一命令执行的具体日期,指定格式为
month day
(月 日) 或mm/dd/yy
(月 / 日 / 年) 或 dd.mm.yy
(日.月.年) ,指定的日期必须跟在指定时间的后面。例如:04:00 2021-03-1
-
使用相对计时法。指定格式为:
now + count time-units
,now 就是当前时间,time-units 是时间单位
这里能够是 minutes (分钟)、hours (小时)、days (天)、weeks (星期)。count 是时间的数量,几天、几小时
例如:now + 5 minutes
-
直接使用 today (今天)、tomorrow (明天) 来指定完成命令的时间
at 实例
案例1:两天后的下午5点执行 /bin/ls /home
at 5pm + 2days
at> /bin/ls /home
案例2:atq命令来查看系统中没有执行的工作任务
atq
案例3:明天17点钟,输出时间到指定文件内 比如 /root/date100.log
at 5pm + tomorrow/1days
at> date > /root/date100.log
案例4:2分钟后,输出时间到指定文件内 比如 /root/date200.log
at now + 2 minutes
at> date > /root/date200.log
案例5:删除已经设置的任务,atrm 编号
atrm id
8. Linux 磁盘分区与挂载
8.1 磁盘分区机制
原理介绍:
- Linux来说无论有几个分区,分给哪一目录使用,它归根结底就只有1个根目录,一个独立且唯一的文件结构,Linux中每个分区都是用来组成整个文件系统的一部分
- Linux采用了一种叫 “载入” 的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来。这时要载入的一个分区将使它的存储空间在一个目录下获得
硬盘说明:
-
Linux硬盘分IDE硬盘和SCSI硬盘,目前基本上是SCSI硬盘
-
对于 IDE硬盘,驱动器标识符为 “hdx~”
其中 “hd” 表明分区所在设备的类型,这里是指IDE硬盘
“x” 为盘号 ( a 为基本盘,b 为基本从属盘,c 为辅助主盘,d 为辅助从属盘)
“~” 代表分区,前四个分区用数字1~4表示,他们是主分区或扩展分区,从5开始就是逻辑分区
例:hda3 表示为第一个 IDE硬盘上的第三个主分区或扩展分区,hdb2表示为第二个 IDE硬盘上的第二个主分区或扩展分区 -
对于 SCSI硬盘则标识为 “sdx~”,SCSI硬盘是用 “sd” 来表示分区所在设备的类型的,其余则和 IDE硬盘的表示方法一样
查看所有设备挂载情况
命令:lsblk
或 lsblk -f
[root@SanxCentOS7 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 35G 0 disk
├─sda1 8:1 0 953M 0 part /boot
├─sda2 8:2 0 1.9G 0 part [SWAP]
└─sda3 8:3 0 30G 0 part /
sr0 11:0 1 4.4G 0 rom /run/media/root/CentOS 7 x86_64
[root@SanxCentOS7 ~]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 5b774ccf-2a9a-40fd-8c7d-1f1e1a6cea43 /boot
├─sda2 swap eceb6033-464d-4f8a-8658-5798834bb207 [SWAP]
└─sda3 ext4 a1d5fbde-dd49-4508-b912-6cae553f7e53 /
sr0 iso9660 CentOS 7 x86_64 2020-11-04-11-36-43-00 /run/media/root/CentOS 7 x86_64
8.2 增加磁盘应用实例
添加硬盘的步骤:
1. 虚拟机添加磁盘
设置大小之后可以一直点下一步了
2. 分区
此时我们看到 磁盘sdb
目前还没有任何挂载信息
分区命令:fdisk /dev/sdb
命令操作:
- m 显示命令列表
- p 显示磁盘分区 相当于
fdisk -l
- n 新增分区
- d 删除分区
- w 写入并退出
说明:开始分区后输入n,新增分区,然后选择p,分区类型为主分区。两次回车默认剩余全部空间。最后输入w写入分区并退出,若不保存退出输入q
[root@SanxCentOS7 ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0x898a51a7 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):m
命令操作
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
g create a new empty GPT partition table
G create an IRIX (SGI) partition table
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
分区号 (1-4,默认 1):
起始 扇区 (2048-2097151,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-2097151,默认为 2097151):
将使用默认值 2097151
分区 1 已设置为 Linux 类型,大小设为 1023 MiB
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@SanxCentOS7 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 35G 0 disk
├─sda1 8:1 0 953M 0 part /boot
├─sda2 8:2 0 1.9G 0 part [SWAP]
└─sda3 8:3 0 30G 0 part /
sdb 8:16 0 1G 0 disk
└─sdb1 8:17 0 1023M 0 part
sr0 11:0 1 4.4G 0 rom
3. 格式化
sdb1 没有 UUID (磁盘分区唯一标识符),说明没有格式化
[root@SanxCentOS7 ~]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 5b774ccf-2a9a-40fd-8c7d-1f1e1a6cea43 /boot
├─sda2 swap eceb6033-464d-4f8a-8658-5798834bb207 [SWAP]
└─sda3 ext4 a1d5fbde-dd49-4508-b912-6cae553f7e53 /
sdb
└─sdb1
sr0 iso9660 CentOS 7 x86_64 2020-11-04-11-36-43-00
格式化命令:mkfs -t ext4 /dev/sdb1
,其中ext4是分区类型
[root@SanxCentOS7 ~]# mkfs -t ext4 /dev/sdb1
[root@SanxCentOS7 ~]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 5b774ccf-2a9a-40fd-8c7d-1f1e1a6cea43 /boot
├─sda2 swap eceb6033-464d-4f8a-8658-5798834bb207 [SWAP]
└─sda3 ext4 a1d5fbde-dd49-4508-b912-6cae553f7e53 /
sdb
└─sdb1 ext4 4a18776b-52f6-4575-94dc-b4e5652b8afd
sr0 iso9660 CentOS 7 x86_64 2020-11-04-11-36-43-00
4. 挂载
挂载:将一个分区与一个目录联系起来
挂载/卸载 语法:mount 设备名称 挂载目录
/ umount 设备名称或挂载目录
例如:
mount /dev/sdb1 /newdisk
umount /dev/sdb1 或者 umount /newdisk
注意:用命令行挂载重启后会失效
-----挂载-----
[root@SanxCentOS7 ~]# mkdir //newdisk
将分区sdb1挂载到根目录//newdisk下
[root@SanxCentOS7 ~]# mount /dev/sdb1 /newdisk
[root@SanxCentOS7 /]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 5b774ccf-2a9a-40fd-8c7d-1f1e1a6cea43 /boot
├─sda2 swap eceb6033-464d-4f8a-8658-5798834bb207 [SWAP]
└─sda3 ext4 a1d5fbde-dd49-4508-b912-6cae553f7e53 /
sdb
└─sdb1 ext4 4a18776b-52f6-4575-94dc-b4e5652b8afd /newdisk
sr0 iso9660 CentOS 7 x86_64 2020-11-04-11-36-43-00
-----卸载-----
[root@SanxCentOS7 /]# umount /dev/sdb1
[root@SanxCentOS7 /]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 5b774ccf-2a9a-40fd-8c7d-1f1e1a6cea43 /boot
├─sda2 swap eceb6033-464d-4f8a-8658-5798834bb207 [SWAP]
└─sda3 ext4 a1d5fbde-dd49-4508-b912-6cae553f7e53 /
sdb
└─sdb1 ext4 4a18776b-52f6-4575-94dc-b4e5652b8afd
sr0 iso9660 CentOS 7 x86_64 2020-11-04-11-36-43-00
实现永久挂载
永久挂载:通过修改 /etc/fstab
实现挂载
添加完成后,执行 mount -a
即刻生效
8.3 磁盘情况查询
查询系统整体磁盘使用情况
基本语法:df -h
查询指定目录的磁盘占用情况
基本语法:du -h /目录
查询指定目录的磁盘占用情况,默认为当前目录
-s 指定目录占用大小汇总
-h 带计量单位
-a 含文件
--max-depth=1 子目录深度
-c 列出明细的同时,增加汇总值
-----示例:查询 /opt 目录的磁盘占用情况,深度为1-----
du -h --max-depth=1 /opt
[root@SanxCentOS7 ~]# du -h --max-depth=1 /opt
4.0K /opt/rh
8.0K /opt
8.4 磁盘实用指令
-----统计/opt文件夹下文件的个数-----
ls -l /opt | grep "^-" | wc -l
-----统计/opt文件夹下目录的个数-----
ls -l /opt | grep "^d" | wc -l
-----统计/opt文件夹下文件的个数,包括子文件夹里的-----
ls -lR /opt | grep "^-" | wc -l
-----统计/opt文件夹下目录的个数,包括子文件夹里的-----
ls -lR /opt | grep "^d" | wc -l
-----以树状显示目录结构-----
tree /home
注意:首次需要运行 yum install tree
在 grep 命令中,“^” 表示行首(即开头)。所以,“^-” 表示以 “-” 开头的行
9. Linux 网络配置
原理图:
查看网络配置指令:
- Windows下:
CMD 中输入 ipconfig
- Linux下:
终端中输入 ifconfig
测试主机之间网络连通性
基本语法:ping IP地址/域名
,在Linux中可以使用CTRL+C停止ping操作
9.1 Linux 网络环境配置
方法1:自动获取
说明:登陆后,通过界面设置来自动获取IP
特点:Linux启动后会自动获取IP
缺点:每次自动获取的IP地址可能会不一样
方法2:指定IP
说明:直接修改配置文件来指定IP,并可以连接到外部网络
编辑 vim /etc/sysconfig/network-scripts/ifcfg-ens33
要求:将IP地址配置为静态的,比如 192.168.200.130
# 网络类型(通常是Ehternet)
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
# IP的配置方法(none/static/bootp/dhcp)引导时 不使用协议|静态分配IP|BOOTP协议|DHCP协议
BOOTPROTO="dhcp"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
# 随机ID
UUID="924d41f5-8937-4d70-9997-a373bfd4e144"
DEVICE="ens33"
# 系统启动的时候网络接口是否有效(yes/no)
ONBOOT="yes"
需要在下方添加的有:
# IP地址
IPADDR=192.168.200.130
# 网关
GATEWAY=192.168.200.2
# 域名解析器
DNS1=192.168.200.2
虚拟机中配置完成后,还需要配置虚拟网络的地址
点击虚拟机左上角的编辑,找到 “虚拟网络编辑器”
9.2 设置主机名和Hosts映射
步骤:
-
设置主机名
- 为了方便记忆,可以给Linux系统 设置主机名,也可以根据需要修改主机名
- 指令
hostname
可以查看主机名 - 修改文件在
/etc/hostname
指定 - 修改后,重启生效
-
设置Host映射
思考:如何通过主机名能够找到(比如ping)某个Linux系统?- Windows
在C:\Windows\System32\drivers\etc\hosts
文件指定即可
案例:192.168.200.130 hspedu100 - Linux
在/etc/hosts
文件指定
案例:192.168.200.1 ThinkPad-PC
- Windows
原理:主机名解析过程分析(Hosts、DNS)
- Hosts 是什么?
一个文本文件,用来记录 IP 和 Hostname (主机名) 的映射关系 - DNS
- DNS,就是 Domain Name System 的缩写,翻译过来就是域名系统
- 是互联网上作为域名和IP地址相互映射的一个分布式数据库
示例:用户在浏览器中输入了 www.baidu.com
-
浏览器先检查浏览器缓存中有没有该域名解析IP地址,有就先调用这个IP完成解析;如果没有就检查操作系统DNS解析器缓存,如果有直接返回IP完成解析。这两个缓存,可以理解为 本地解析器缓存
-
一般来说,当电脑第一次成功访问某一网站后,在一定时间内,浏览器或操作系统会缓存它的IP地址 (DNS解析记录)
如在 CMD窗口中输入ipconfig /displaydns //DNS域名解析缓存 ipconfig /flushdns //手动清理DNS缓存
-
如果本地解析器缓存没有找到对应映射,检查系统中Hosts文件中有没有配置对应的域名IP映射,如果有,则完成解析并返回
-
如果本地DNS解析器缓存和Hosts文件中均没有找到对应的IP,则到域名服务DNS进行解析域
10. Linux 进程管理
基本介绍:
-
在 Linux 中,每个 执行的程序 都称为一个进程。每一个进程都分配一个ID号 (pid,进程号)
-
每个进程都可能以两种方式存在。前台 与 后台
前台进程就是用户目前的屏幕上可以进行操作的应用进程
后台进程则是实际在操作,但是由于屏幕上无法看到的进程,通常使用后台的方式执行 -
一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中,直到关机才结束
10.1 显示系统执行的进程
基本介绍:ps命令是用来查看目前系统中,有哪些进程正在执行,以及它们执行的状况。可以不加任何参数
ps 显示的信息选项:
字段 | 说明 |
---|---|
PID | 进程识别号 |
TTY | 终端机号 |
TIME | 此进程所消耗CPU时间 |
CMD | 正在执行的命令或进程名 |
命令参数列表:
ps -a
:显示当前终端的所有进程信息ps -u
:以用户的格式显示进程信息ps -x
:显示后台进程运行的参数
ps
详解
-
指令:
ps -aux | grep xxx
,查看有没有xxx
服务在运行 -
指令说明
名称 说明 System V 展示风格 USER 用户名称 PID 进程号 %CPU 进程占用CPU的百分比 %MEM 进程占用物理内存的百分比 VSZ 进程占用的虚拟内存大小(单位:KB) RSS 进程占用的物理内存大小(单位:KB) TTY 终端名称,缩写 STAT 进程状态
其中 S-睡眠、s-表示该进程是会话的先导进程、N-表示进程拥有比普通优先级更低的优先级
R-正在运行、D-短期等待、Z-僵尸进程、T-被跟踪或停止等等STARTED 进程的启动时间 TIME CPU时间,即进程使用CPU的总时间 COMMAND 启动进程所用的命令和参数,如果过长会被截断显示
10.2 父子进程
要求:以全格式显示当前所有的进程,查看进程的父进程
指令:ps -ef
是以全格式显示当前所有的进程
-e
:显示所有进程-f
:全格式
ps -ef | grep xxx
10.3 终止进程
基本介绍:若是某个进程执行到一半需要停止或是已经消耗了很多的系统资源时,此时可以考虑终止该进程。使用 kill
命令来完成
基本语法:
kill 进程号
(功能描述:通过进程号终止进程)killall 进程名称
(功能描述:通过进程名称终止进程,也支持通配符,这在系统因负载过大而变得很慢时很有用)
常用选项:
-9
:表示强迫进程立即停止
-----案例1:踢掉某个非法登录的用户-----
ps -ef | grep sshd # 查看进程sshd
kill 4162 # 终止非法用户远程登录
-----案例2:终止远程登录服务sshd,在适当的时候再次重启sshd服务-----
kill 1022 # 终止远程登录服务sshd
ps -ef | grep sshd # 查看远程登录服务进程是否存在
/bin/systemctl start sshd.service # 重启远程登录服务sshd
ps -ef | grep sshd # 查看远程登录服务进程是否存在
-----案例3:终止多个gedit-----
killall gedit # 终止多个gedit进程
-----案例4:强制终止一个终端-----
root 6826 6819 0 17:39 pts/3 00:00:00 bash
root 7093 6819 0 17:41 pts/4 00:00:00 bash
[root@SanxCentOS7 ~]# kill 6826 # 无法终止bash进程
[root@SanxCentOS7 ~]# kill -9 6826 # 强制终止bash进程
10.4 查看进程树 pstree
基本语法:pstree [选项]
,可以更加直观的来看进程信息
常用选项:
-p
:显示进程的PID-u
:显示进程的所属用户
应用实例:
-----案例1:以树状的形式显示进程的PID-----
pstree -p
-----案例2:以树状的形式显示进程的用户ID-----
pstree -u
10.5 服务管理
基本介绍:
服务 (Service) 本质就是运行在后台的进程,通常都会监听某个端口,等待其他程序的请求,比如 (mysql, sshd, 防火墙等),因此我们又称为守护进程,是Linux非常重要的知识点
1. Service 管理指令
-
service 服务名 [start | stop | restart | reload | status]
-
在 CentOS7.0 后 很多服务不再使用service,而是 systemctl
-
service 指令管理的服务在
/etc/init.d
查看
Service 管理指令案例:
-----请用service指令,查看、关闭、启动 network-----
注意:需要在虚拟系统演示,因为网络连接会关闭
service network status | stop | restart
查看服务名:
-
使用 setup → \rightarrow →系统服务 就可以看到全部的服务名,带
*
号的为开机自启动,退出按Tab
-
/etc/init.d
看到 service 指令管理的服务ls -l /etc/init.d
2. Service 运行级别 (RunLevel)
Linux 系统有7种运行级别 (runlevel):最常用的是3和5
运行级别0:系统停机状态,系统默认运行级别不能为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登录
运行级别2:多用户状态(没有NFS),不支持网络
运行级别3:完全的多用户状态(有NFS),登录后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
开机流程说明:
CentOS 7后运行级别说明:
在 /etc/initab
进行了简化
multi-user.target: analogous to runlevel 3
graphical.target: analogous to runlevel 5
# 预览目前默认的运行级别
systemctl get-default
# 设置默认运行级别
systemctl set-default TARGET.target
5.1 指定运行级别
3. chkconfig 指令
基本介绍:
- 通过
chkconfig
命令可以给服务的各个运行级别设置 自启动/关闭 chkconfig
指令管理的服务在/etc/init.d
查看- 注意:CentOS 7 后,很多服务 使用systemctl 管理
chkconfig
基本语法
- 查看服务
chkconfig --list [|grep xxx]
chkconfig 服务名 --list
chkconfig --level 5 服务名 on/off
-----对network服务进行各种操作-----
[root@SanxCentOS7 ~]# chkconfig --list
注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。
要列出 systemd 服务,请执行 'systemctl list-unit-files'。
查看在具体 target 启用的服务请执行
'systemctl list-dependencies [target]'。
netconsole 0:关 1:关 2:关 3:关 4:关 5:关 6:关
network 0:关 1:关 2:开 3:开 4:开 5:开 6:关
-----对network服务在运行级别3中关闭自启动-----
chkconfig --level 3 network off
使用细节:
chkconfig
重新设置服务后自启动或关闭,需要重启机器reboot
4. systemctl 管理指令
基本语法:systemctl [start | stop | restart | status] 服务名
systemctl
指令管理的服务在 /usr/lib/systemd/system
查看
systemctl 设置服务的自启动状态
systemctl list-unit-files [| grep 服务名]
:查看服务开机启动状态,grep 可以进行过滤systemctl enable 服务名
:设置服务开机启动systemctl disable 服务名
:关闭服务开机启动systemctl is-enable 服务名
:服务名(查询某个服务是否是自启动)
注意:上面的指令都是针对运行级别3和5的自启动/关闭
-----查看当前防火墙的状况,关闭防火墙和重启防火墙-----
systemctl status firewalld
systemctl stop firewalld
systemctl restart firewalld
细节讨论
-
关闭或启用防火墙后,立即生效(telnet 测试某个端口即可)
telnet Linux虚拟机的IP 某个服务对应的端口号 注意:如果显示 "'telnet'不是内部或外部命令,也不是可运行的程序或批处理文件" 那么需要在 "启用或关闭Windows功能" 里勾选Telnet客户端
-
这种方式只是临时生效,当重启系统后,还是回归以前对服务的设置
-
如果希望设置某个服务自启动或关闭永久生效,要使用
systemctl [enable | disable] 服务名
5. 打开或关闭指定端口
在真正的生产环境往往需要防火墙打开,但是问题来了,如果我们把防火墙打开,那么外部请求数据包就不能跟服务器监听端口通讯,这时需要打开指定端口,比如80、22、8080等,那么如何操作呢?
firewall 指令
- 打开端口:
firewall-cmd --permanent --add-port=端口号/协议
- 关闭端口:
firewall-cmd --permanent --remove-port=端口号/协议
- 重新载入才能生效:
firewall-cmd --reload
- 查询端口是否开放:
firewall-cmd --query-port=端口号/协议
-----启用防火墙,测试111端口是否能telnet-----
不能
-----开放111端口-----
firewall-cmd --permanent --add-port=111/tcp
firewall-cmd --reload
firewall-cmd --query-port=111/tcp
-----再次关闭111端口-----
firewall-cmd --permanent --remove-port=111/tcp
firewall-cmd --reload
firewall-cmd --query-port=111/tcp
10.6 动态监控系统
1. 动态监控进程
基本介绍:top与ps指令很相似,它们都用来显示正在执行的进程
top与ps最大的不同之处,在于top在执行一段时间后可以更新正在运行的进程
基本语法:top [选项]
选项说明:
选项 | 功能 |
---|---|
-d 秒数 | 指定top命令每隔几秒更新,默认是3秒 |
-i | 使top不显示任何闲置或者僵尸进程 |
-p | 通过指定监控进程ID来仅仅监控某个进程的状态 |
僵尸进程:是指已经结束执行但是还没有被父进程回收的进程。在 Linux 系统中,当一个进程结束执行时,它会向其父进程发送一个信号,父进程收到信号后会回收该进程的资源。如果父进程在收到信号后并没有回收该进程的资源,那么该进程就会成为一个僵尸进程。僵尸进程不会占用 CPU 时间,但是会占用一些系统资源,如果系统中出现了大量僵尸进程,可能会导致系统资源不足
僵死进程:是指已经结束执行且父进程已经回收了其资源,但是该进程仍然存在于进程表中的进程。僵死进程不会占用 CPU 时间和系统资源,并且可以通过系统调用 wait()
来回收
字段 | 说明 |
---|---|
23:01:27 up 1:28 | 当前时间是23:01(晚上11点01分),系统已经运行了1小时28分钟 |
1 user | 目前有1个用户登录系统 |
load average: 0.00, 0.01, 0.05 | 负载平均值是衡量系统CPU使用率的度量。这三个数字分别代表过去1分钟,5分钟和15分钟的负载平均值。负载平均值为0.00意味着没有进程在等待CPU时间 |
Tasks: 158 total | 系统总共有158个进程 |
1 running | 1个进程当前正在运行 |
155 sleeping | 155个进程正在等待某些事件发生(即睡眠) |
2 stopped | 2个进程已被停止(即,它们已被信号停止) |
0 zombie | 0个进程处于僵尸状态(即,它们已终止但其父进程尚未等待它们) |
%Cpu(s): 0.2 us, 0.2 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st | 这显示了系统的CPU使用率。百分比表示以下内容 |
-us | 用于运行非内核代码(用户时间,包括nice时间)的时间 |
-sy | 用于运行内核代码(系统时间)的时间 |
-ni | 用于运行具有正nice值(低优先级)的代码的时间 |
-id | 空闲时间 |
-wa | 等待输入/输出(I/O)的时间 |
-hi | 处理硬件中断的时间 |
-si | 处理软件中断的时间 |
-st | 被虚拟机调度的时间(对于虚拟机内的操作系统) |
KiB Mem: 2027896 total | 系统的物理内存(RAM)总量为2027896 KB |
1144296 free | 目前有1144296 KB的内存没有被使用 |
493608 used | 目前有493608 KB的内存被使用 |
389992 buff/cache | 389992 KB的内存用于缓冲和缓存 |
KiB Swap: 1952764 total | 系统的交换空间总量为1952764 KB。当系统的物理内存很低时,就会使用交换空间 |
1952764 free | 目前有1952764 KB的交换空间没有被使用 |
0 used | 目前没有使用交换空间 |
1368680 avail Mem | 可用于使用的物理内存总量(即空闲内存加上buff/cache)为1368680 KB |
2. 动态监控的交互操作
交互操作说明:
操作 | 功能 |
---|---|
P | 以CPU使用率排序,默认就是此项 |
M | 以内存的使用率排序 |
N | 以PID排序 |
q | 退出top |
-----案例一:监视特定用户-----
top:输入此命令,按回车键,查看执行的进程
u:然后输入 "u" 回车,再输入用户名即可
-----案例二:终止指定进程-----
top:输入此命令,按回车键,查看执行的进程
k:然后输入 "k" 回车,再输入要结束的进程ID号
然后输入9,强制终止bash
-----案例三:指定系统状态更新的时间(每隔10秒自动更新)-----
top -d 10
10.7 监控网络状态 netstat
基本语法:netstat [选项]
选项说明:
-an
:按一定顺序排列输出-p
:显示哪个进程在调用
-----查看服务名为sshd的服务信息-----
netstat -anp | grep sshd
检测主机连接命令ping:是一种网络检测工具,它主要是用检测远程主机是否正常,或是两部主机间的网线或网卡故障
如:ping 对方的ip地址
11. RPM 与 YUM
基本介绍:RPM 用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中。它生成具有 .RPM
扩展名的文件
RPM 是 RedHat Package Manager (RedHat 软件包管理工具) 的缩写,类似 Windows 的 setup.exe,这一文件格式名称虽然打上了 RedHat 的标志,但理念是通用的
Linux 的分发版本都有采用 (SUSE, RedHat, CentOS 等等),可以算是公认的行业标准了
11.1 RPM 包的管理
RPM包的简单查询指令
- 查询已安装的 RPM 列表:
rpm -qa | grep xxx
如:rpm -qa | grep firefox
RPM 包名基本格式:
- 一个 RPM 包名:
firefox-68.10.0-1.el7.centos.x86_64
- 名称:firefox
- 版本号:68.10.0-1
- 适用操作系统:el7.centos.x86_64,表示 CentOS 7.x 的64位系统
如果是 i686、i386 表示32位系统,noarch 表示通用
RPM 包的其他指令:
# 查询所安装的所有RPM软件包
rpm -qa
rpm -qa | more
rpm -qa | grep xxx # 示例:rpm -qa | grep firefox
# 查询软件包是否安装
rpm -q 软件包名 # 示例rpm -q firefox
# 查询软件包信息
rpm -qi 软件包名 # 示例rpm -qi firefox
# 查询软件包中的文件
rpm -ql 软件包名 # 示例rpm -ql firefox
# 查询文件所属的软件包
rpm -qf 文件路径名 # 示例rpm -qf /etc/passwd、rpm -qf /root/install.log
11.2 RPM 包的安装与卸载
安装的基本语法:rpm -ivh RPM包全路径名称
卸载的基本语法:rpm -e RPM包的名称
# 安装firefox 软件包
rpm -ivh firefox RPM包的路径
# 删除 firefox 软件包
rpm -e firefox
细节讨论
-
如果其他软件包依赖于您要卸载的软件包,卸载时则会产生错误信息
如:$ rpm -e foo removing these packages would break dependencies:foo is needed by bar-1.0-1
-
如果我们一定要删除 foo 这个RPM包,可以添加参数
--nodeps
就可以强制删除,但是一般不推荐这样做,因为依赖于该软件包的程序可能无法运行$ rpm -e --nodeps foo
11.3 YUM
基本介绍:YUM 是一个 Shell 前端软件包管理器。基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包
YUM 的基本指令:
# 查询yum服务器是否有需要安装的软件
yum list | grep xxx(软件列表)
# 安装指定的yum包
yum install xxx #下载安装
-----案例:请使用yum的方式来安装firefox-----
rpm -e firefox
rpm -q firefox
yum list | grep firefox
yum install firefox
rpm -q firefox