Linux笔记

Linux概述

简介

摘自于百度百科

  1. Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。伴随着互联网的发展,Linux得到了来自全世界软件爱好者、组织、公司的支持。它除了在服务器操作系统方面保持着强劲的发展势头以外,在个人电脑、嵌入式系统上都有着长足的进步。使用者不仅可以直观地获取该操作系统的实现机制,而且可以根据自身的需要来修改完善这个操作系统,使其最大化地适应用户的需要.

  2. Linux不仅系统性能稳定,而且是开源软件。其核心防火墙组件性能高效、配置简单,保证了系统的安全。在很多企业网络中,为了追求速度和安全,Linux操作系统不仅仅是被网络运维人员当作服务器使用,Linux既可以当作服务器,又可以当作网络防火墙是Linux的 一大亮点。

  3. Linux与其他操作系统相比 ,具有开放源码、没有版权、技术社区用户多等特点 ,开放源码使得用户可以自由裁剪,灵活性高,功能强大,成本低。尤其系统中内嵌网络协议栈 ,经过适当的配置就可实现路由器的功能。这些特点使得Linux成为开发路由交换设备的理想开发平台。

提示符

[root@localhost ~]#

# 表示当前权限为超级管理员root(最高的管理级别,说白了就是我想干啥就干啥)
$ 表示普通用户的权限
root 表示当前用户为root
@ 表示在本地
localhost 表示主机的名称
~ 表示当前的路径(注意:~是用户家目录的简写,root的家目录为/root,普通用户的家目录为/home/用户名)

查询/帮助命令

查看系统内核版本

1
uname -r

ls命令:查看指定/当前路径中有哪些文件或目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 直接使用 ls, 表示显示当前路径下的内容,其余ls的复杂命令同理
ls
ll
ll -d

# 只显示指定目录下内容的名称
ls /

# 显示指定目录下内容的详细信息,简写为 ll
ls -l
ll

# 直接查看当前目录的信息
ll -d

ll(ls -l):每个字段的含义

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
# 查看根目录下的所有文件/目录的详细内容
ll /

total 68
lrwxrwxrwx. 1 root root 7 Aug 8 2018 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 Sep 17 11:01 boot
drwxr-xr-x 2 root root 4096 Jan 21 2019 data
drwxr-xr-x 19 root root 2980 Sep 17 12:38 dev
drwxr-xr-x. 87 root root 4096 Sep 29 17:39 etc
drwxr-xr-x. 8 root root 4096 Sep 29 17:09 home
lrwxrwxrwx. 1 root root 7 Aug 8 2018 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Aug 8 2018 lib64 -> usr/lib64
drwx------. 2 root root 16384 Aug 8 2018 lost+found
drwxr-xr-x. 2 root root 4096 Apr 11 2018 media
drwxr-xr-x. 2 root root 4096 Apr 11 2018 mnt
drwxr-xr-x. 4 root root 4096 Sep 17 11:04 opt
dr-xr-xr-x 91 root root 0 Sep 17 12:38 proc
dr-xr-x---. 13 root root 4096 Sep 29 17:28 root
drwxr-xr-x 26 root root 940 Sep 20 16:11 run
lrwxrwxrwx. 1 root root 8 Aug 8 2018 sbin -> usr/sbin
drwxr-xr-x. 2 root root 4096 Apr 11 2018 srv
dr-xr-xr-x 13 root root 0 Sep 17 16:44 sys
drwxrwxrwt. 8 root root 4096 Sep 29 17:41 tmp
drwxr-xr-x. 13 root root 4096 Aug 8 2018 usr
drwxr-xr-x. 19 root root 4096 Jan 21 2019 var

我们会发现每个文件或目录都具有相同的格式
解析:

以根目录下的etc为例说明
drwxr-xr-x. 87 root root 4096 Sep 29 17:39 etc

  1. 开头第一个字母:
  • - : 表示文件
  • d : 表示目录
  • f : 表示块设备文件
  • c : 表示字符设备文件
  • l : 表示链接文件
  • p : 管道文件
  • s : 套接字文件
  1. rwxr-xr-x

分为三个用户类型
前三个字母属于文件所有者的权限(u)
中间三个字母属于组内用户的权限(g)
最后三个字母属于组外用户的权限(o)

文件下:

  • - : 没有对应的权限
  • r : 可读
  • w : 可写
  • x : 可执行

目录下:

  • - : 没有对应的权限
  • r : 可查询此目录下文件名数据,比如ls命令
  • w : 可以建立新目录/删除已存在目录/修改已存在的目录
  • x : 具有执行的权限,简单地说,就是可以将该目录转换成家目录的能力,比如cd 命令。注意,x权限对于目录是极其重要的,如果没有该目录,表示你不能切换到该目录,更不能对其子目录或者文件进行操作,即使你有“r/w”权限。
  1. 87
    表示硬链接个数

  2. root root
    第一个root表示文件所有者
    第二个root表示组名

  3. 4096
    表示文件的大小,单位为字节

  4. Sep 29 17:39
    表示文件最后修改日期

  5. etc
    表示文件名

新建文件/目录

  • mkdir : 新建目录
  • touch : 新建文件

mkdir

1
2
3
4
# 在根目录下新建一个名为aaa的目录
mkdir /aaa
# 查看
ll /

进阶:

不加参数选项的mkdir只能建一层目录
如果想要建立多层目录的话?

1
2
3
4
5
6
7
# 在根目录下新建目录 /bbb1/bbb2/bbb3
mkdir /bbb1/bbb2/bbb3 # 发现行不通

# 加上 -p 选项
mkdir -p /bbb1/bbb2/bbb3 # 成功
#查看
ll /bbb1/bbb2

touch

1
2
3
4
# 在根目录下新建一个名为qqq.txt的文件
touch /qqq.txt
# 查看
ll /

进阶:

如果想要同时创建多个文件的话?

1
2
3
4
# 在根目录下同时创建名为q.txt w.txt e.txt 的三个文件
touch /{q,w,e}.txt
#查看
ll /

删除文件/目录

1
2
3
4
5
# 删除根目录下的 q.txt
rm /q.txt

# 暴力删除(不会出现操作提醒,直接删除)
rm -rf /w.txt

chmod 更改文件/目录权限

方法一

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
# 首先在/opt/下创建一个111.txt文件
touch /opt/111.txt
# 改为满权限
chmod 777 /opt/111.txt
# 递归赋予权限(使"此时"该目录下所有的文件或目录的权限都变为777)
mkdir /syz
chmod -R 777 /syz
ll /
# 在该目录下新建一个syz.txt文件
touch /syz/syz.txt
ll
-rw-r--r--. 1 root root 0 10月 8 18:54 syz.txt
# 那么现在有一个问题:
# 现在这个syz.txt,普通用户可以删除吗?
# 你可能会说不可以,因为这个文件的普通用户权限为只读,没有可写可执行权限
# 但是,其实是可以的
# 因为,这个文件是在 777 权限的目录下
# 所以,不懂得童鞋,去百度一下,目录的rwx 与 文件的rwx有什么不同

...

# 算了,说一下吧
# 文件下:
r: 可读(cat)
w: 可修改(vim)
x: 可以运行
# 目录下:
r: 可查看目录内容(ls)
w: 可以增加/删除/修改目录里的内容(mkdir/rmdir/rm)
x: 可以切换进该目录中(cd)

解析:
777指的是按照rwxrwxrwx的(二进制)顺序排列的权限

r表示4
w表示2
x表示1

:不清楚二进制的同学去百度或者问问其他的人

比如 rwxr-xr-x 在chmod中可以表示为755

明白了吧?
很简单的
ok

方法二

1
2
3
touch /opt/222.txt
chmod u-x,g+w /opt/222.txt
chmod o=r-x /opt/222.txt

或许有的同学不知道这个u是什么意思,其实细心的同学会发现,其实我在上面已经指出了它的含义了

来看:

rwxrwxrwx

分为三组,这个都知道吧?

前面三个字符属于u(所有者)
中间三个字符属于g(组内)
后面三个字符属于o(组外)

如果还是不明白什么意思,不要着急,后面会具体的讲这些问题.

u-x的意思就是,所有者的权限中去掉x权限
g+x的意思就是,组内的权限中加上w权限

其余的以此类推,这里不做演示了

四个帮助命令

1
2
3
4
5
6
7
8
9
#此处以ls查看命令为例

whatis ls

ls --help

man ls

info ls

终端使用技巧

  1. 查询历史命令
1
2
3
# history -c : 清空当前历史命令
# history -w : 将历史命令保存到历史命令文件 /root/.bash_histroy 中
history
  1. 清空终端屏幕
1
2
# 快捷键 ctrl + l
clear

安利一波😝:

上下键调用历史命令
Tab建自动补齐 –> 补齐:命令/文件名/目录名
!$ –> 调用上一条命令中的最后一个参数
!keyword –> 调用历史命令中含有当前关键字的,距离当前时间最近的那一条命令
date –> 显示系统时间
pwd –> 打印当前目录

了解路径

在Linux中,路径分为相对路径绝对路径

/ : 表示根目录
.. : 上一级目录

cd命令为切换路径

我们先来看一下根目录下有哪些目录

1
2
3
4
5
# ls为查看当前或者指定路径下有哪些文件/目录
ls /

bin data etc lib lost+found mnt proc run srv tmp var
boot dev home lib64 media opt root sbin sys usr website

由上面我们可以看到,根目录/下还有好多的子目录
接下来我们使用cd命令来切换到根目录中的其中一个目录中

1
cd /lib

切换目录之后,我们会发现提示符中的路径也发生了变化(由~变为了lib)

这种切换方式为绝对路径,因为是从/目录下开始的

我们当前路径在根目录/lib

我们使用ls命令来查看lib目录下又有哪些子目录

1
2
3
4
5
6
ls

binfmt.d dracut gcc kernel modules-load.d python3.6 sse2 tuned
cpp firewalld grub locale NetworkManager rpm sysctl.d udev
crda firmware kbd modprobe.d polkit-1 sendmail systemd yum-plugins
debug games kdump modules python2.7 sendmail.postfix tmpfiles.d

🐦🐦🐦🐦…
我举个例子来说明一下绝对路径吧

假设我们的当前用户是root,家目录在/root,我们需要查看根目录下的很多目录

如果按照上面的办法,先使用cd命令切换目录,然后再用ls查看的话太过于麻烦,怎么办呢?

这时候绝对路径就派上用场了

1
2
# 在当前目录 /root 下查看 /lib/python3.6 目录中的内容
ls /lib/python3.6

也就是说,绝对路径是以根目录为起点的一个树状完整目录

🐓🐓🐓🐓…
那什么是相对路径呢

假设我们现在已经使用cd命令切换到了根目录/下,我们想要查看根目录下lib目录下的python3.6,怎么办?
难道还是用ls /lib/python3.6吗?

可以是可以,但是显然再使用绝对路径就有点繁琐

我们可以使用相对路径
因为我们当前已经在根目录下了,所以不必再加上/

1
ls lib/python3.6

也就是说,相对路径是以当前路径为基准进行命令操作

也许你可能会说,不就是差了一个/号吗?
我这里只是举了一个例子来演示,实际情况下,能用相对路径就用相对路径,其余就使用绝对路径

举个例子吧

比如我们现在所在的路径是/lib/python3.6,我们想要查看/etc/rpm/目录下的内容,这时候使用相对路径就有点不切实际了,应该使用绝对路径来查看

懂了吧?

ok👌

Linux下的常见目录含义

  • boot : 相关的启动文件(引导程序,kernel等)
  • etc : 配置文件
  • tmp : 进程产生的临时文件存放位置
  • var : 存放经常变化的数据(数据库,日志,邮件,定时)
  • media : 设备挂载目录
  • mnt : 进程挂载
  • bin : 普通用户使用的命令 –> /usr/bin
  • sbin : 管理员使用的命令 –> /ust/sbin
  • dev : 设备文件
  • proc : 虚拟的文件系统/进程实时状态信息
  • usr : 系统文件

文件操作命令

vim编辑器的用法

具体用法见我的这篇博客vim的使用方法

1
2
3
# 当前目录下如果文件存在,会直接进入该文件中
vim test.txt
# 当前目录下不存在,会在当前目录下新建一个名为test.txt的文件

进入后想要退出的话:
:wq –> 保存并且退出
:!q –> 不保存强制退出

用户的家目录与虚拟控制台

用户的家目录问题

超级用户root的家目录 : /root
普通用户的家目录 : /home/zhangsan001

如何新建普通用户:

useradd zhangsan001
passwd zhangsan001

su - zhangsan001(切换身份的同时也切换家目录)
su zhangsan001(只切换身份)

虚拟控制台的使用技巧

切换方式:ctrl+alt+F2-F6
返回方式:alt+F1
测试方式:who和who am i

重定向技术

查看文件内容的命令

more: 不一次性的输出所有内容

1
2
3
# 使用more命令查看passwd
# 按下空格不断进行输出
more /etc/passwd

cat: 一次性输出所有内容

1
2
# 使用cat命令查看passwd
cat /etc/passwd

输出重定向

符号: >
形式: 覆盖

1
2
3
4
5
ls > abc.txt
cat abc.txt #查看

pwd > abc.txt #覆盖abc.txt之前的文本内容
cat abc.txt #查看

追加重定向

符号: >>
形式: 追加

1
2
3
4
ll >> abc.txt
pwd >> abc.txt
#查看
cat abc.txt

错误重定向

符号: 2>
形式: 覆盖

1
2
3
4
5
geafasdsa 2> abc.txt
cat abc.txt

etgasr 2> abc.txt
cat abc.txt

全部重定向

符号: &>
形式: 覆盖

1
2
3
4
5
6
# 正确命令
pwd &> aaa.txt
cat aaa.txt
# 错误命令
afssafa &> aaa.txt
cat aaa.txt

find命令

顾名思义,find是查找的意思

参数:

  • -type : 查找类型(f为文件类型,d为目录类型)
  • -user : 查找内容的所有者
  • -name : 查找内容的名称
  • -iname : 查找内容不区分大小写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 试着把find与重定向组合使用
# 查找根目录下,类型为文件,文件所有者为zhangsan001的文件,重定向到abc2.txt中
find / -type f -user zhangsan001 > abc2.txt

find / -type f -user zhangsan001 2> abc3.txt

find / -type f -user zhangsan001 &> abc4.txt

#按文件名查找名字中含有abc的文件或目录
find / -name "*abc*"
#按类型查找名字中含有abc的目录
find / -name "*abc*" -type d

#按用户查找
find / -name "*abc*" -type f -user zhangsan001

高级技巧:

1
2
3
4
5
# 以张三身份建立三个文件abc1.txt,abc2.txt,abc3.txt
# 测试查找这三个文件
find / -name "*abc*" -type f -user zhangsan001
# 高级技巧:查找并删除
find / -name "*abc*" -type f -user zhangsan001 -exec rm -rf {} \;

mv移动命令的四种用法

1
2
3
4
5
6
7
8
9
10
# 新建一个111.txt
touch 111.txt
# 把111.txt移动到/home/zhangsan001/目录下,并重命名为222.txt
mv 111.txt /home/zhangsan001/222.txt
# 新建一个222.txt文件,把222.txt移动到/root/目录下
mv 222.txt /root/
# /home/zhangsan001/目录下已经存在222.txt,尝试强力覆盖
mv -f /root/222.txt /home/zhangsan001/
# 移动目录
mv /root/qqq /home/zhangsan001/

cp复制命令的四种用法

1
2
3
4
5
6
7
8
9
10
# 复制当前目录下的 222.txt 文件到根目录下,并重命名为 333.txt
cp 222.txt /333.txt
# 复制当前目录下的 333.txt 到 /home/zhangsan001/ 目录下
cp 333.txt /home/zhangsan001/
# 如果目标位置出现同名文件,则不覆盖;如果想覆盖,可以使用 \cp 333.txt /
cp -n 333.txt /
# 复制目录,需要加上 -r 参数
cp -r qqq /
# 繁琐目录下的文件备份方法
cp /etc/sysconfig/network-scripts/{ifcfg-enp2s0,ifcfg-enp2s0.bak}

grep在文件内容中查找

格式:grep key filename

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 新建一个qqq.txt并写入内容
touch qqq.txt
echo -e "hello\nworld\nsafasfss\nasfsadasd\nword\nasfasfswordasfasf\nsafsafadfa\nfsaferfasasfword\n32114asfasr\n12434word" > qqq.txt
# 使用grep进行行的筛选
grep word qqq.txt
# 把上面命令的结果重定向到qqq1.txt中
grep word qqq.txt > qqq1.txt
cat qqq1.txt

# 新建一个aaa.txt,并写入内容
touch aaa.txt
echo -e "asafasd\nnetworkgefsafas\nafasfasfsarsfanetwork\aadfff\n12413315535networkasfarfwas\nasfasfasfnetwork"
# 筛选以network开头的行
grep "^network" aaa.txt
# 筛选以network结尾的行
grep "network$" aaa.txt

用户与组管理

用户管理之useradd命令

1
2
3
4
# 添加一个名为a001的新用户
useradd a001
# 设置密码
passwd a001

Linux系统底层的四个连锁反映

当添加好新用户时
系统自动创建该用户的家目录/home/a001
vim /etc/passwd(多了一行该用户的记录)
vim /etc/shadow(影子文件中多一行密码记录)
vim /etc/group(组信息文件中多一行记录,即自动创建同名组)

/etc/passwd 七个字段的含义

1
2
3
4
a001:x:504:505::/home/a001:/bin/bash
# 用户名:密码:用户ID:组ID:用户描述:家目录:shell

# 如何把普通用户改为超级管理员 -> 把该用户的用户ID改为0

/etc/group 四个字段的含义

a001:x:505:
test:x:502:harry,sam
组名:组密码:组ID:该组中包含的其他用户名

/etc/shadow 九个字段的含义

权限 000

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
a001:$6$9./UcZIY$GWuGRx6h7O4MEd3GHMyUylHCZRVkbwPoqg.98A/ogjXoNlylqzhjncXjO..vK7OTLaNLPKL8a8NII0C1i4ZIK0:16000:0:99999:7:::
# 用户名:加密后的密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码到期的警告时间:密码过期后的宽限天数:账号失效时间:保留字段

# 解析:
# 1. 用户名
# 2. 加密后的密码 -> 密码只是单独的 *或!! ,说明没有密码,无法登陆,也就是禁用了该用户
# 3. 密码最后一次修改日期 -> 以1970年1月1日作为标准时间,每过一天时间戳 +1
# 4. 两次密码的修改时间间隔 -> 和第三个字段相比,比如这里设置为10,那么这十天之内不可以该用户不可以修改密码
# 5. 密码有效期 -> 可以自行修改,一般是99999,意思是99999天内有效,不用管,除非你能活这么长时间
# 6. 密码到期的警告时间 -> 比如这里为7,在密码有效期还剩7天时,会自动警告
# 7. 密码过期后的宽限天数 -> 密码有效期内没有修改密码,可以再宽限你几天,具体几天看数值(可自定义),0 代表密码过期后立即失效, 1 代表密码永远不会失效
# 8. 账号失效时间 -> 需要用时间戳表示,就算密码有效期还没有到,只要我们设置了比有效期还要短的天数,那么密码也会立即失效
# 9. 保留字段

# 时间戳换算成年月日的方法
date -d "1970-01-01 19999 days"

# 年月日换算成时间戳的方法
# 注意 +%s 要连在一起写
echo $(($(date --date="2019-10-10" +%s)/86400+1))

用户的邮箱

路径:/var/spool/mail/用户名/

在添加新用户时自动创建

用户模板目录

路径:/etc/skel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 我们新建用户后,在其家目录中其实会有一些隐藏文件
cd /home/syz
ll -a
总用量 16
drwx------. 3 syz syz 99 10月 9 02:14 .
drwxr-xr-x. 7 root root 70 10月 9 01:58 ..
-rw-------. 1 syz syz 69 10月 9 02:14 .bash_history
-rw-r--r--. 1 syz syz 18 8月 3 2017 .bash_logout
-rw-r--r--. 1 syz syz 193 8月 3 2017 .bash_profile
-rw-r--r--. 1 syz syz 231 8月 3 2017 .bashrc
drwxr-xr-x. 4 syz syz 39 10月 6 11:12 .mozilla

# 其实,这些隐藏文件都是从 /etc/skel文件下拷贝过来的
ll -a /etc/skel
ll -a /etc/skel
总用量 24
drwxr-xr-x. 3 root root 78 10月 6 11:13 .
drwxr-xr-x. 90 root root 8192 10月 10 18:32 ..
-rw-r--r--. 1 root root 18 8月 3 2017 .bash_logout
-rw-r--r--. 1 root root 193 8月 3 2017 .bash_profile
-rw-r--r--. 1 root root 231 8月 3 2017 .bashrc
drwxr-xr-x. 4 root root 39 10月 6 11:12 .mozilla

相关测试:

shell测试

1
2
3
4
# 新建用户a002,并设置不能本地登录
# 参数 -s 表示设置shell
useradd -s /sbin/nologin a002
passwd a002

如何开启登录权限:直接修改/etc/passwd中的shell字段为/bin/login

注意:/sbin/nologin这种shell的典型应用场合是给FTP客户端用户来设置的。

其他参数测试

1
2
3
4
5
6
7
8
9
10
11
12
# -c : 用户描述
# -d : 指定新账户的家目录
# -m : 创建用户的家目录
# -u : 指定用户的id
# -d -m 通常组合使用
# -g : 指定为第一所属组(第一所属组只能有一个)
# -G : 指定为其他附属组
useradd -c "ordinary user" -m -d /var/a003 -u 333 a003
passwd a003
# 查看
tail -1 /etc/passwd
# a003:x:333:507:ordinary user:/var/a003:/bin/bash

用户管理之userdel命令

不彻底的删除方法

1
2
3
userdel a001
# 查看
tail -3 /etc/passwd

彻底的删除方法

1
2
# 同时删除对应的四个连锁反映
userdel -rf a003

用户管理之usermod命令

1
2
3
4
5
6
# 更改a002用户的id
usermod -u 600 a002
# 设置用户a002为不可本地登录
usermod -s /sbin/nologin a002
# 查看
tail -3 /etc/passwd

组管理之groupadd命令

1
2
3
4
# 新建一个名为g001的组
groupadd g001
# 查看
tail -3 /etc/group

组管理之groupdel命令

1
2
3
4
5
6
# 删除组g001
groupdel g001
# 查看
tail -3 /etc/group
# 不能删除用户的第一所属组
groupdel a002 // cannot remove the primary group of user 'a002'

(gpasswd,usermod)组和用户的关系

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
# 知识点1️⃣:gpasswd
# 格式: gpasswd [选项] 用户名 组名
# 把用户b001加入到组group1中
# -a : 添加
# -d : 删除
gpasswd -a b001 group1
# 同理
gpasswd -a b002 group1
gpasswd -a b003 group1
# 查看
tail -3 /etc/group
group1:x:604:b001,b002,b003
**********************************
# 把b003从组group1中移除
gpasswd -d b003 group1
# 查看
tail -3 /etc/group
**********************************
# 查看用户b001加入了哪些组
groups b001
b001 : b001 group1
# 我们会发现用户加入的新组归属于 其他附属组
**********************************
# 修改第一所属组的测试
gpasswd -a a002 group1
# 查看
groups a002
a002 : a002 group1
# 把group2作为用户a002的第一所属组
# 知识点2️⃣:usermod
# 格式: usermod [选项] 组名 用户名
# usermod 的选项和useradd比较类似,基本上都是同一个意思
# - g : 第一所属组
# - G : 其他附属组
# - c : 用户描述信息
# - L : 临时锁定用户(锁定会会发现/etc/shadow文件中的一长串密码开头多了一个字符)
# - U : 解锁用户(把/etc/shadow文件中变化的密码复原)
usermod -g group2 a002
groups a002
a002 : group2 group1
**********************************
# 修改附属组的测试
groups b001
b001 : b001 group1 group2
# 把组a002作为用户b001的其他附属组
usermod -G a002 b001
# 查看
groups b001
b001 : b001 a002

chown命令的使用方法

1
2
3
4
5
6
7
8
9
10
# 格式: chown 文件所有者:所属组名称 文件名称 

# 把文件qqq1.txt的文件所有者和所属组改为 b001 和 group1
chown b001:group1 qqq1.txt

# 把文件qqq1.txt的所属组改为root
chown :root qqq1.txt

# 把文件qqq1.txt的文件所有者改为b003
chown b003: qqq1.txt(自动以该用户私有组替换)

注:一个用户创建的文件,如果想要另一个用户对该文件进行访问/修改/执行,可以把另一个用户加入到这个文件的所属组中,然后使用chmod命令修改该文件的组内权限即可

runlevel运行级别

7种运行级别的含义:

1
2
3
4
5
6
7
8
9
10
vim /etc/inittab


    0 - halt #关机
    1 - Single user mode #单用户模式
    2 - Multiuser, without NFS (The same as 3, if you do not have networking) #多用户模式
    3 - Full multiuser mode #完整多用户模式
    4 - unused #备用
    5 - X11 #支持图形界面
    6 - reboot (Do NOT set initdefault to this) #重启

查看和改变运行级别的方法

1
2
3
4
5
6
7
8
9
10
# 查看运行级别
runlevel
# 改变运行级别
init n
# 总结关闭系统的方法
init 0
shutdown -h now
# 总结重启系统的方法
reboot
init 6

破解超级用户root的密码


Centos 7重置root密码

  1. 重启系统,在grub引导菜单,选择第一项,按e编辑启动配置文件

  2. 找到 linux16开头的行,在该行最后添加rd.break

  3. 按crtl+x启动

  4. 以读写的方式挂载根目录

    mount -o remount,rw /sysroot

  5. 切换根目录

    chroot /sysroot

  6. 使用passwd命令重置密码(注意bug乱码)

  7. 创建重置SELinux安全上下文的文件

    touch /.autorelabel

  8. 敲两次exit退出重启即可

高级权限

UMASK反掩码

root用户反掩码: 0022
普通用户反掩码: 0002

如何查看反掩码

1
umask

UMASK反掩码的作用

目录的缺省权限值=777-UMASK反掩码
文件的缺省权限值=777-UMASK反掩码-111

如何修改UMASK反掩码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 直接修改即可
umask 0011
*************************
# root用户测试
umask

mkdir 1111
touch 1111.txt
*************************
# 普通用户测试
useradd lisi
su - lisi
# 查看普通用户反掩码
umask
# 修改普通用户反掩码
umask 0011

mkdir 1111
touch 1111.txt

SUID权限弥补

主要针对文件
文件所有者执行位变为s或S(之前有x则为s,之前无x则为S,不懂的话没关系,继续往下看)

/usr/bin/passwd

passwd命令执行的脚本文件

1
2
3
ll /usr/bin/passwd  #可以看到文件所有者的执行位为s

-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd

测试SUID

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 新建一个普通用户
useradd a001
passwd a001
# 切换至该普通用户
su - a001
# 尝试修改该用户的密码
# 首先输入旧的密码,然后输入两遍新的密码
passwd
# 如果看到最后的提示字样 successfully,那么修改成功

**********************************************

# 返回root用户,去除passwd文件的SUID高级权限
exit
chmod u-s /usr/bin/passwd #去掉s后,普通用户便不可以自己修改密码
ll /usr/bin/passwd

# 再次切换到普通用户进行测试
su - a001
passwd

# passwd: Authentication token manipulation error
# 如果最后出现 error 的字样,说明该用户自己已经无法修改密码,只能root超级管理员来修改

s与S的区别

1
2
3
4
5
6
7
8
# 在上一步的基础上继续
chmod u+s,u-x /usr/bin/passwd
ll /usr/bin/passwd #会发现所有者执行位变为了S

chmod u+x /usr/bin/passwd
ll /usr/bin/passwd #会发现所有者执行位变为了s

# 经过我的测试,无论是S还是s,都可以普通用户自己修改密码

SGID权限弥补

主要针对目录

如果给某个目录加上了SGID高级,那么在这个文件中创建目录或者创建新文件,都将会继承这个目录的组

下面用例子来演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建一个新组
groupadd qqq
# 在根目录下创建一个新目录
mkdir /111
# 更改目录111的组
chown :qqq /111
# 查看111目录
ll /111
# 给111目录增加高级权限SGID
chmod g+s /111
# 测试
mkdir /111/222
touch /111/222.txt
ll /111/

STICK粘滞位

主要针对共享目录

组外(其他用户)的执行位变为t

linux中根目录下的tmp目录就是经典的例子

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 在根目录下创建一个共享目录share
mkdir /share
# 给share目录高级权限STICK
chmod o+t,o+w /share
#创建两个新用户
useradd zhangsan
useradd lisi
# 切换至其中一个用户
su - zhangsan
# 在/share共享目录下新建一个以该用户为名的txt文件
touch /share/zhangsan.txt
exit
# 切换至另一个用户
su - lisi
# 查看共享目录下的文件
ll /share/
# 试着删除该文件
rm -rf /share/zhangsan.txt
# 出现如下提示
rm: 无法删除"/share/zhangsan.txt": 不允许的操作

ACL访问控制列表

针对目录和文件

可以对一个文件设置用户的访问权限

设置文件的ACL信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 在根目录下新建一个txt文件
touch /123.txt
# 为123.txt设置acl
setfacl -m u:zhangsan:rw- /123.txt #设置用户zhangsan访问123.txt的权限只有读和写,没有执行权限
setfacl -m u:lisi:r-- /123.txt
# 查看123.txt,会发现后面多了一个加号+
ll /
# 查看acl信息
getfacl /123.txt

# 测试
su - zhangsan
vim /123.txt #写入内容,保存退出,成功
exit

su - lisi
vim /123.txt #写入内容,保存退出提示不可写入
exit

设置目录的ACL信息

1
2
3
4
5
6
7
8
9
10
11
12
mkdir /456
# 参数d表示在/456目录下新建目录或文件会自动继承目录/456的ACL信息
# 但要注意:ACL的真正效果仍然体现在对文件的操作上,对文件修改时才能看出效果
setfacl -m d:u:zhangsan:rwx /456
cd /456
touch ttt.txt
getfacl ttt.txt

# 当复制一个具有ACl属性的文件或目录时,默认情况下,ACL属性值是不会复制过去的
# 只有在 cp 后加上 -p 参数才可以
cp -p ttt.txt /tmp/cp_ttt.txt
# 如果移动一个具有ACL属性的文件或目录时,则会同时把ACL属性移动过去

删除ACL信息

1
2
3
4
5
6
# 不彻底的删除方式
setfacl -x u:lisi /123.txt #虽然去掉了lisi的权限,但是使用ll进行查看, + 号仍然存在
getfacl /123.txt

# 彻底的删除一个文件或者目录的所有的ACL信息
chacl -B /123.txt

chmod知识补充

sst = 421 = 7

chmod 7777 test.txt 相当于 rwsrwsrwt
chmod 6777 test.txt 相当于 rwsrwsrwx
chmod 4777 test.txt 相当于 rwsrwxrwx

以此类推

RPM软件包及YUM软件仓库的使用

RPM软件包的使用技巧

现在基本不用rpm了,但是应该还是要了解一下

1
2
3
4
5
6
7
8
9
10
# 如何查询指定软件包是否安装
rpm -q vsftpd

# 如何安装指定软件包
# i:立即安装
# v:显示安装进度
# 哈希进度提示
rpm -ivh ftp-0.17-51.1.el6.i686.rpm
# 如何删除指定软件包
rpm -e ftp #问题:依赖性关系(rpm -e httpd)

镜像文件的回环挂载

含义

回环设备( ‘loopback device’)允许用户以一个普通磁盘文件虚拟一个块设备。设想一个磁盘设备,对它的所有读写操作都将被重定向到读写一个名为 disk-image 的普通文件而非操作实际磁盘或分区的轨道和扇区。(当然,disk-image 必须存在于一个实际的磁盘上,而这个磁盘必须比虚拟的磁盘容量更大。)回环设备允许你这样使用一个普通文件。

回环挂载的用法

1
2
3
4
5
6
7
8
9
10
11
12
# 查看centos镜像文件的大小
du -sh CentOS-7-x86_64-DVD-1511.iso
# 创建挂载目录
mkdir /mnt/iso
# 回环挂载
# 注意自己镜像的位置和名称,没有镜像需要自己上传或下载到本地
mount -o loop /CentOS-7-x86_64-DVD-1511.iso /mnt/iso
# 查看
cd /mnt/iso
ll
# 查看映射情况
df -Th

卸载目录的方法

1
2
3
4
5
6
# 直接卸载即可
umount /mnt/iso
# 查看
cd /mnt/iso
ll
df -Th

YUM软件仓库的配置及使用

修改YUM软件仓库的配置文件

一定要将目录切换到YUM软件仓库的工作目录/etc/yum.repos.d/下才有效
工作目录下的配置文件必须以.repo结尾

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cd /etc/yum.repos.d/
vim centos7.repo
# 录入五个参数
********************************
[base]                     
name=CentOS7
baseurl=file:///mnt/iso
enabled=1  
gpgcheck=0
********************************
# ⬆️baseurl要填写绝对路径
# ⬆️enabled 为启用软件仓库
# ⬆️gpgcheck 为不校验软件包

# 验证软件仓库的方法
yum clean all
yum list #会看到很多个软件包

YUM常见命令使用技巧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 查询指定的软件包
yum search vsftpd
# 查询指定软件的详细信息
# 可以判断该软件包是否安装
yum info vsftpd
# 如何安装指定的软件包
yum install vsftpd
# 如何删除指定的软件包
yum erase vsftpd

# 成组删除
yum grouplist
# 如果要显示成功安装信息,则之前系统中应该没有装vsftpd包才可以
yum groupinstall 'FTP Server'
yum groupinstall 'PHP 支持'

# 查询可用软件包的版本全称
yum whatprovides vim

通过指定的FTP服务器设置YUM软件仓库源

1
2
3
4
5
[base]
name=centos7
baseurl=ftp://10.226.41.226/centos7
enabled=1
gpgcheck=0

通过真实的CentOS7服务器作为YUM软件仓库源

1
2
3
4
5
6
7
8
9
10
11
cd /etc/yum.repos.d/
ls
# 压缩
gzip centos7.repo
# 释放压缩
gunzip CentOS-Base.repo.gz
cat CentOS-Base.repo
# 注意:一定要保证在连接外网的前提下测试
yum clean all
# yum repolist 会出现 11,971个包
yum -y install mariadb-server

YUM软件仓库源常见错误的解决方法(yum.PID)

解决方法:按照提示信息将对应文件/run/yum.pid删除即可。

Crontab定时任务

用户定时任务的使用技巧

用户定时任务的格式

Minute Hour Day Month DayofWeek Command
分钟 小时 天 月 星期 命令

设置用户定时任务的步骤:

1
2
3
4
5
6
# 切换用户身份
su - zhangsan
# 设置定时任务
crontab -e #编辑该用户定时任务
crontab -l #查看该用户定时任务
crontab -r #删除该用户定时任务

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# a.zhangsan用户创建定时任务,要求:每天下午5:00关机。
su - zhangsan
crontab -e
0 17 * * * shutdown -h now

# b.lisi用户创建定时任务,要求:周一至周五朝九晚五每分钟发一条消息(wall 命令进行测试)。
su - lisi
crontab -e
* 9-17 * * 1-5 wall "hello,I'am lisi"

# c.lisi用户创建定时任务,要求:周一至周五朝九晚五每两小时发一条消息。
* 9-17/2 * * 1-5 wall "hello,I'am lisi"

# d.lisi用户创建定时任务,要求:周一至周五朝九晚五每两隔10分钟发一条消息。
*/10 9-17 * * 1-5 wall "hello,I'am lisi"

管理员对用户定时任务的管理方法

方法一:/var/spool/cron 用户定时任务的工作目录(查看;修改;删除),如果用户设置过定时任务,那么在该目录下会有与用户同名的文件

方法二:crontab -u lisi -l | -e | -r

用户定时任务的高级管理技巧

黑名单文件 /etc/cron.deny //默认存在
白名单文件 /etc/cron.allow //默认不存在,使用时,应删除cron.deny文件,再创建cron.allow文件,只有在cron.allow文件里的用户才可以设置定时任务

系统定时任务的使用技巧

系统定时任务的工作目录

/etc/cron.daily/ 日志回滚文件,该目录下的脚本文件每天会自动运行一次(触发时间:4:22)

/etc/cron.hourly/ 该目录下的脚本文件每小时(第一分钟)会自动运行一次

/etc/cron.weekly 该目录下的脚本文件每星期(周日的4:22)会自动运行一次

/etc/cron.monthly/ 该目录下的脚本文件每个月(1号的4:22)会自动运行一次

anacron系统

原理:系统定时任务的触发时间由于某种原因(例如停电)而错过了,anacron系统会保证
系统定时任务工作目录下的脚本会弥补运行的一种机制。

1
2
3
4
5
6
vim /etc/anacrontab

#period in days   delay in minutes   job-identifier   command
1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly

FS Management(文件系统管理)

Linux下的磁盘分区及其表示方法

磁盘的表示方法

/dev/sda—第一块磁盘(针对SCSI或串口磁盘)
/dev/sdb—第二块磁盘
/dev/sdc—第三块磁盘

/dev/hda,/dev/hdb,/dev/hdc,….(传统的IDE磁盘)
/dev/vda,/dev/vdb,/dev/vdc(虚拟磁盘)

分区的表示方法

/dev/sda1—第一块磁盘的第一个分区
/dev/sda2—第一块磁盘的第二个分区
/dev/sdb1—第二块磁盘的第一个分区
/dev/hda1—第一块磁盘的第一个分区(传统的IDE磁盘)
/dev/vdc5
/dev/vdb3

主分区,扩展分区和逻辑分区

一块400G的硬盘
C—100G—/dev/sda1(主)
D—50G—/dev/sda2(主)
E—50G—/dev/sda3(主)
/dev/sda4(扩展分区)
F—50G—/dev/sda5
G—50G—/dev/sda6
H—50G—/dev/sda7
I—50G—/dev/sda8

结论:

  • 主分区的个数至多4个;
  • 扩展分区是一个容器,其中可以包含多个逻辑分区;
  • 扩展分区的大小=各个逻辑分区大小之和+未划分的扩展分区大小;
  • 真正能使用的数据分区只能是主分区或者逻辑分区;
  • 磁盘的剩余空间 = 扩展分区 - 各逻辑分区之和;

为虚拟机添加一块磁盘

双击虚拟机 -> show virtual machine details(灯泡的图案) -> virtIO Disk 1 -> 下方add hardword -> bus type(scsi) -> finish

fdisk命令的使用技巧

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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# 查看是否添加成功
df -Th
# 为磁盘创建分区
fdisk /dev/sdb

# 下面是选项,n是添加分区,t是改变分区类型
m   print this menu
p   print the partition table
d   delete a partition(删除分区时,必须从后往前一个一个删除)
n   add a new partition(创建分区时,必须从前往后一个一个创建)
t   change a partitions system id
l   list known partition types
# 常用分区类型
    5  Extended
    7  HPFS/NTFS
    b  W95 FAT32
    82  Linux swap
    83  Linux –---------xfs, ext4, ext3,ext2
    8e  Linux LVM

w   write table to disk and exit
q   quit without saving changes

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

********************************************************************
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
演示⬇️

# 1️⃣第一步:添加分区,有些地方默认回车就可以,到 LAST 扇区 那里,需要填好分区的大小
命令(输入 m 获取帮助):n
Partition type:
p primary (2 primary, 0 extended, 2 free)
e extended
Select (default p): p
分区号 (3,4,默认 3):
起始 扇区 (21979136-67108863,默认为 21979136):
将使用默认值 21979136
Last 扇区, +扇区 or +size{K,M,G} (21979136-67108863,默认为 67108863):+5G
分区 3 已设置为 Linux 类型,大小设为 5 GiB

# 2️⃣第二步:p命令查看是否添加成功
命令(输入 m 获取帮助):p

磁盘 /dev/sdb:34.4 GB, 34359738368 字节,67108864 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 4096 字节
I/O 大小(最小/最佳):4096 字节 / 4096 字节
磁盘标签类型:dos
磁盘标识符:0x6bfb58cf

设备 Boot Start End Blocks Id System
/dev/sdb1 2048 20973567 10485760 83 Linux
/dev/sdb2 20973568 21979135 502784 82 Linux swap / Solaris
/dev/sdb3 21979136 32464895 5242880 83 Linux

# 3️⃣第三步:改变分区的类型
命令(输入 m 获取帮助):t
分区号 (1-3,默认 3):3
Hex 代码(输入 L 列出所有代码):82
已将分区“Linux”的类型更改为“Linux swap / Solaris”

# 4️⃣第四步:再次查看是否改变成功
命令(输入 m 获取帮助):p

磁盘 /dev/sdb:34.4 GB, 34359738368 字节,67108864 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 4096 字节
I/O 大小(最小/最佳):4096 字节 / 4096 字节
磁盘标签类型:dos
磁盘标识符:0x6bfb58cf

设备 Boot Start End Blocks Id System
/dev/sdb1 2048 20973567 10485760 83 Linux
/dev/sdb2 20973568 21979135 502784 82 Linux swap / Solaris
/dev/sdb3 21979136 32464895 5242880 82 Linux swap / Solaris

# 5️⃣第五步:保存退出
命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
正在同步磁盘。

更新磁盘分区表的方法

1
2
3
4
5
6
# 不重启,立即生效
partprobe
# 重启后生效
reboot
# 检查分区是否格式化成功
cat /proc/partitions

格式化磁盘分区的方法

常用格式:ext2,ext3,ext4,xfs,swap,vfat

(1)mkfs.xfs /dev/sdb1
(2)mkfs.ext4 /dev/sdb2
(3)mkfs.ext3 /dev/sdb5
(4)mkfs.vfat /dev/sdb3 (注意:在使用fdisk创建/dev/sdb3时,要将其类型修改为FAT32格式)
(5)mkswap /dev/sdb6 (注意:在使用fdisk创建/dev/sdb6时,要将其类型修改为SWAP格式)

注意:在格式化vfat的时候,会提示-bash: mkfs.vfat: command not found

解决:

1
2
3
4
5
6
7
# 1. 查询
yum provides mkfs.vfat #或者 yum whatprovides mkfs.vfat

# 2. 复制查询出的包名

# 3. 安装
yum -y install dosfstools.x86_64

使用分区存放数据

方法一:手动挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建一个挂载目录
mkdir /mmm1
# 挂载
mount /dev/sdb2 /mmm1
# 检查
df -Th(要知道各个字段信息的含义)
# 测试
cd /mmm1
touch 111.txt
mkdir 111
# 卸载目录
umount /mmm1
df -Th

方法二:自动挂载

1
2
3
4
5
6
7
8
9
10
vim /etc/fstab
# 文件前三个字段的含义
# 设备文件名/dev/sda1   挂载目标目录/   设备文件名对应的分区的类型ext4
/dev/sdb2               /mmm1                   ext4    defaults        0 0
# 查看挂载情况
df -Th #发现没有挂载上
# 重启
mount -a
# 再次查看,挂载成功
df -Th

方法三:UUID挂载

1
2
3
4
5
6
7
8
9
10
11
blkid   #显示已格式化的分区的UUID信息
# 注意:各物理设备的 UUID 号是系统定义好的,唯一的,用户无法修改。

# 方法一:通过mount命令实现手动挂载
mount UUID="0ef71ac1-ac8a-4be9-821e-d98bc21e23f7" /sdb1

# 方法二:通过/etc/fstab文件实现开机自动挂载
vim /etc/fstab
UUID="0ef71ac1-ac8a-4be9-821e-d98bc21e23f7" /sdb1  ext4  defaults  0 0
# 重启
mount -a

swap交换分区的管理

物理分区实现swap分区大小的变化

1
2
3
4
5
6
7
8
9
10
11
12
13
#查看内存的详细信息,其中包括交换分区的大小
free
total used free shared buff/cache available
Mem: 1877420 157032 1530176 9108 190212 1568576
Swap: 2097148 0 2097148

# 查看swap分区的信息
cat /proc/swaps
# 或(两者效果相同)
swapon -s

文件名 类型 大小 已用 权限
/dev/dm-1 partition 2097148 0 -2

计算swap的差值

1
2
3
4
5
# 要求将swap分区调整到2600000K
# 已有swap分区大小为 2097148k
# 使用 expr 命令来计算剩余所需大小
expr 2600000 - 2097148
502852 #需要创建一个502852k大小的swap分区

创建一个大小为502852大小的物理分区并将该分区类型修改为swap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 创建分区并修改类型(不会的同学翻阅上一节笔记,不要懒惰哦😊)
fdisk /dev/sdb # swap的代号为 82
# 格式化/dev/sda1 的磁盘
mkswap /dev/sdb2
# 修改/etc/fstab文件实现开机自动挂载
# 永久生效!!!
vim /etc/fstab
/dev/sdb2 swap swap defaults 0 0
# 注意:修改完开机自动挂载文件/etc/fstab后,使用mount -a 命令对SWAP分区无效
# 必须重启!!!!!!!!!!!!!!!!
swapon -s # 发现没有sdb2

# 手动挂载,激活交换分区
swapon /dev/sda1
# 验证
swapon -s
free
# 手动卸载
swapoff /dev/sda1
swapon -s

LVM逻辑卷管理

物理分区和物理卷

逻辑过程:

物理分区 -> 物理卷

1
2
3
4
5
6
7
8
9
10
11
12
# 创建分区
fdisk /dev/sdb
# 创建物理卷
pvcreate /dev/sdb5
# 删除物理卷
# 如果该物理卷已经加入到了 卷组 中,并且该 卷组 已经创建了 逻辑卷
# 那么应该首先释放该 物理卷 中的 PE 块, pvmove /dev/sdb5
# 然后把该物理卷从 卷组 中移除, vgreduce vg9 /dev/sdb5
# 然后就可以删除 物理卷 了
pvremove /dev/sdb5
# 查看物理卷
pvdisplay

卷组

关系: 物理卷 + 物理卷 + … = 卷组
卷组可以包含多个物理卷并且卷组的大小可以动态的调整

如何创建卷组

1
2
3
4
5
6
7
8
9
10
11
12
# 格式: vgcreate 卷组名 物理卷1 物理卷2 ...
vgcreate vg9 /dev/sdb1 /dev/sdb2

# 删除卷组
vgremove vg9
# 移除卷组中的物理卷
vgreduce vg9 /dev/sdb5

#查看卷组vg9的基本信息
vgdisplay -v vg9
# 查看卷组vg9的使用情况
vgdisplay -s

PE(物理块):它是卷组创建时要指定的基本逻辑单位,4M(默认),8M,12M…(4的整数倍即可)

逻辑卷

卷组中划拨出逻辑卷
逻辑卷的大小也可以动态的调整
约束条件:以PE的整数倍进行增加或减小

小提示💡:逻辑卷所占用的PE,可以跨越不同的物理卷

1
2
3
4
5
6
7
8
9
# 创建逻辑卷
# 格式: lvcreate -n 逻辑卷名称 -L 逻辑卷大小(加不加单位都可以) 卷组名
lvcreate -n lv0 -L 80 vg9 #创建了一个逻辑卷名称叫lv0,大小80M,位于卷组vg9中
# 逻辑卷格式化
mkfs.ext4 /dev/vg9/lv0
# 删除逻辑卷
lvremove /dev/vg9/lv0
# 查看
lvdisplay

例题一

动态的调整卷组的大小
动态的调整逻辑卷的大小

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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
创建三个物理分区,并将它们指定成三个大小都为100M的物理卷
再建立一个卷组vg9,当中要包含两个物理卷
在卷组vg9中创建两个逻辑卷lv0,lv1,大小分别是100M和40M,要求分别用xfs和ext4格式化,并自动挂载到目录/lvm0和/lvm1上
要求动态增加lv0是20M,减小lv1的大小12M
从卷组vg9中添加、删除物理卷进行测试

# 第一步:创建三个大小为100M的物理分区/dev/sdb5,/dev/sdb6./dev/sdb7,类型都改为 8e
fdisk /dev/sdb
partprobe #刷新
fdisk -l #查看

****************************************************************************

# 第二步:将物理分区/dev/sdb5建立成物理卷/dev/sdb5
pvcreate /dev/sdb5
pvcreate /dev/sdb6
pvcreate /dev/sdb7
# 查看
pvdisplay

****************************************************************************

# 第三步:把其中两个物理卷加入到新建的卷组vg9中
# 创建卷组vg9,包含物理卷/dev/sdb5和/dev/sdb6,默认PE大小4M
vgcreate vg9 /dev/sdb5 /dev/sdb6
# 查看
vgdisplay -v

****************************************************************************

# 第四步:创建逻辑卷
# 新建名为lv0,大小为100M的逻辑卷
lvcreate -n lv0 -L 100 vg9
# 新建名为lv1,大小为40M的逻辑卷
# -l : PE的个数,如果不做修改的话,PE默认大小为4M
# -L : 直接设置逻辑卷的大小
lvcreate -n lv1 -l 10 vg9
# 查看
lvdisplay

****************************************************************************

# 第五步:对逻辑卷进行格式化
mkfs.xfs /dev/vg9/lv0
mkfs. ext4 /dev/vg9/lv1
# 查看UUID
blkid

****************************************************************************

# 第六步:创建目标目录/lvm0和/lvm1
mkdir /lv0
mkdir /lv1

****************************************************************************

# 第七步:挂载
# 方式一:手动挂载
mount /dev/vg9/lv0 /lv0
# 方式二:开机自动挂载
# 不要用UUID挂载,有问题
vim /etc/fstab
/dev/vg9/lv0 /lv0 xfs defaults 0 0
# 重启
mount -a
# 查看
df -Th

****************************************************************************

# 第八步:增加文件系统的大小
# 增加文件系统大小 不必卸载 文件目录

# 1. 增加逻辑卷容量
lvresize -L +20M /dev/vg9/lv0 #增加逻辑卷lv0大小20M
# 注意:此时仅仅增加的是 逻辑卷lv0 的大小;
lvdisplay
# 逻辑卷 lv0 对应的 文件系统的大小 并未增加
# 测试方法:mount 命令将其挂载到目标目录上,用df -Th看其对应的文件系统大小仍然为100M

# 正确解法:
# 增加文件系统大小,目录一定要处于挂载上的状态,不然无法更新

# 2. 更新
xfs_growfs /dev/vg9/lv0 #更新逻辑卷lv0所对应的 xfs 文件系统的大小
# 或者
resize2fs /dev/vg9/lv0 #更新逻辑卷lv0所对应的 ext4, 3 文件系统的大小
# 再次用df -Th看文件系统大小也为120M了

**************************************************************************

# 第九步:减小文件系统的大小
# 1. 跟增加不同的是,ext4减小需要卸载目录,不先卸载文件目录的话会报错
umount /lv1

# 2. 更新
resize2fs /dev/vg9/lv1 28M #更新逻辑卷lv1所对应的ext2,3,4文件系统减小至28M
# 运行上边的命令会提示先运行 e2fsck -f /dev/vg9/lv1 ,要求先检查文件系统,运行该条命令就没有问题了。
# 3. 将逻辑卷lv1的大小减小至28M
lvresize -L -12M /dev/vg9/lv1
mount -a
# 查看
df -Th

**************************************************************************

# 第十步:向卷组vg9中添加新的物理卷
vgextend vg9 /dev/sdb7
vgdisplay -v

**************************************************************************

# 第十一步:从卷组vg9中删除物理卷
#释放与物理卷/dev/sdb5包含的PE
pvmove /dev/sdb5
#从卷组vg9中删除物理卷/dev/sdb5
vgreduce vg9 /dev/sdb5
#查看卷组vg9的基本信息
vgdisplay -v vg9
# 查看卷组vg9的使用情况
vgdisplay -s
# 注意:逻辑卷/dev/vg9/lv0所占用的PE可以跨越不同的物理分区

例题二

创建逻辑卷database,属于卷组datastore
逻辑卷的大小为10个扩展物理单元(PE)
PE的大小为16M
使用xfs文件系统格式化该逻辑卷,并自动挂载到/mnt/database上

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
76
77
78
# 第一步:创建三个物理分区,大小都为160M,类型为8e
fdisk /dev/sdb
8 24 171089 sdb8
8 25 171089 sdb9
8 26 171089 sdb10

**************************************************************************

# 第二步:创建物理卷
pvcreate /dev/sdb8
pvcreate /dev/sdb9
pvcreate /dev/sdb10
pvdisplay

**************************************************************************

# 第三步:创建卷组datastore,PE为16M,包含/dev/sdb8,/dev/sdb9
# -s : 设置PE的大小
vgcreate -s 16M datastore /dev/sdb8 /dev/sdb9
# 查看
vgdisplay -v datastore

**************************************************************************

# 第四步:创建逻辑卷database,大小为10个PE,即160M,并用xfs格式化。
lvcreate -l 10 -n database datastore
# 查看
lvdisplay
# 格式化为xfs格式
mkfs.xfs /dev/datastore/database
# 查看UUID
blkid

**************************************************************************

# 第五步:创建目标目录/mnt/database
mkdir /mnt/database

**************************************************************************

# 第六步:修改自动挂载文件
vim /etc/fstab
/dev/datastore/database /mnt/database xfs defaults 0 0
# 重启
mount -a
# 查看
df -Th
/dev/mapper/datastore-database xfs 154M 8.3M 146M 6% /mnt/database

**************************************************************************

# 第七步:调整逻辑卷database及其文件系统的大小为240M.
lvresize -L +80M /dev/datastore/database #增加逻辑卷大小80M
xfs_growfs /dev/datastore/database #更新逻辑卷所对应的xfs文件系统的大小。
# 查看
df -Th
lvdisplay

**************************************************************************

# 第八步:调整逻辑卷database及其文件系统大小为80M
lvresize -L -160M /dev/datastore/database #将逻辑卷的大小减小160M
xfs_growfs /dev/datastore/database #更新逻辑卷所对应的xfs文件系统的大小至80M。
# 查看
lvdisplay #逻辑卷的大小改变了
df -Th #挂载目录大小没变

# 发现挂载目录大小并没有改变
# 这是因为xfs格式只能增加,无法减小!!!!!!!!!!!!!
# 若是非要减小,只能重新格式化
# 这样做的话,文件里的东西就都被格式化了,不建议如此操作
# 如果真的想这么做,命令如下⬇️:

lvresize -L -160M /dev/datastore/database #将逻辑卷的大小减小160M
umount /dev/datastore/database #卸载目录
mkfs.xfs -f /dev/datastore/database #强制格式化
mount -a #重新挂载目录(之前已经配置过开机自启动)
df -Th

网络环境配置

配置静态IP地址

1
2
# 查看IP
ip a

配置防火墙

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
# 查看防火墙规则状态是否为关闭
systemctl status firewalld

systemctl start firewalld #开启iptables
systemctl status firewalld #查看iptables的状态
systemctl stop firewalld #关闭iptables

# 查看SElinux的状态是否为关闭状态
getenforce

getenforce #查看SELinux的状态
setenforce 0 #关闭SElinux
setenforce 1 #打开SElinux

将SElinux设置为关闭状态的永久生效方法
vim /etc/sysconfig/selinux #将 enforcing 改为 disabled

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted

删除旧的IP地址

1
ip addr del 192.168.122.51/24 dev eth0

配置新的静态IP地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="static"
ONBOOT="yes"
TYPE="Ethernet"
IPADDR=192.168.122.100 //IP地址
PREFIX=24 //子网掩码
GATEWAY=192.168.122.1 //网关
DNS1=202.207.48.3 //DNS服务器

# 重启网络服务
systemctl restart network

ip a #IP地址已经被修改成了192.168.122.100

配置动态IP地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 查看防火墙规则状态是否为关闭
systemctl status firewalld
# 查看SElinux的状态是否为关闭状态
getenforce

# 删除旧的IP地址
ip addr del 192.168.122.100/24 dev eth0

# 配置新的动态IP地址
vim /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE="eth0"
BOOTPROTO="dhcp"
ONBOOT="yes"
TYPE="Ethernet"

# 重启网络服务
systemctl restart network
ip a #IP 地址已经被修改成了192.168.122.X

补充知识

临时绑定多个IP地址当网卡eth0
ip addr add 192.168.122.X/24 dev eth0
ip a //可以查看到新绑定的IP地址

注意:如果重启网络服务(systemctl restart network ),则使用 ip addr del 192.168.122.51/24 dev eth0或者ip addr add 192.168.122.X/24 dev eth0命令删除或添加的IP地址会失效。

修改主机名

方法一:使用hostnamectl set-hostname 51命令,将主机名修改为51
注意:需要退出并重新登录后方可生效,主机名一旦修改,永久生效。

方法二:使用“vim /etc/hostname”命令,修改主机名配置文件,直接将文件中原来的主机名localhost.localdomain修改为新主机名
重新登录或者重启系统后,新主机名就会生效。

压缩与解压缩

tar命令(归档)的使用

创建tar包

1
2
3
4
# -c 创建归档包
# -v 显示详细的提示信息
# -f 指定文件名
tar -cvf etc.tar /etc

创建压缩的tar包

两种压缩技术: gzipbzip

gzip: ***.gz

1
2
3
4
5
# 在tar命令中添加一个参数 -z
tar -zcvf bgl.tar.gz /etc #压缩目录
# 查看压缩包的大小
du -sh etc.tar.gz
tar -zcvf file.tar.gz 111.txt 222.txt #压缩文件

bzip2: ***.bz2

1
2
3
# 在tar命令中添加一个参数 -j
tar -jcvf etc.tar.bz2 /etc #压缩目录
tar -jcvf file.tar.bz2 111.txt 222.txt #压缩文件

查询tar包中包含的文件目录列表

1
2
3
4
# -t 查看是否使用tar命令来归档的包
# -f 指定文件名
tar -tf aaa.tar.gz
tar -tf aaa.tar.bz2

释放tar包

1
2
3
4
5
# 默认释放在当前目录下
# 在tar命令中添加一个参数 -x
# 一般情况下使用: -xf 即可
tar -xzvf etc.tar.gz
tar -xjvf etc.tar.bz2

释放在指定目录下

1
2
3
# -C : 指定释放的目录
mkdir /666
tar -xjvf bgl.tar.bz2 -C /666

习题

使用bzip2压缩,将/etc目录归档并压缩到/root/backup.tar.bz2

1
tar -jcvf /root/backup.tar.bz2 /etc

压缩知识扩展

gzip压缩的两种技术

压缩技术一(gunzip,gzip)

覆盖源文件的压缩技术,但无法压缩目录

参数:

  • -d : 解压参数
  • -f : 强制覆盖以存在的同名压缩包
  • -v : 显示压缩过程
1
2
3
4
5
6
7
8
# 压缩
gzip -v {1,2,3}.txt #压缩效果是将源文件1.txt替换为1.txt.gz
# 注意:使用gzip命令压缩后,源文件就不存在了。
gzip -fv {1,2,3}.txt #如果目标位置有同名的压缩文件(1.txt.gz)存在,则覆盖

# 解压
gzip -d 111.txt.gz #解压的效果是将压缩文件111.txt.gz还原为111.txt。
gunzip 111.txt.gz #gunzip命令与gzip -d的效果解压相同。

压缩技术二(tar.gz)

归档压缩技术,同前

1
2
3
4
5
6
7
8
# 压缩
tar zcvf filename.tar.gz -C /tmp/

# 解压
tar zxvf filename.tar.gz

# 显示列表
tar tf filname.tar

bzip2压缩的两种技术

压缩技术一(bunzip2,bzip2)

覆盖源文件的压缩技术,但无法压缩目录

参数:

  • -d : 解压参数
  • -f : 强制覆盖以存在的同名压缩包
  • -v : 显示压缩过程
1
2
3
4
5
6
7
# 压缩
bzip2 {1,2,3}.txt #压缩效果是将源文件1.txt替换为1.txt.bz2
# 注意:使用bzip2命令压缩后,源文件就不存在了

# 解压
bzip2 -d 1.txt.bz2 #解压的效果是将压缩文件111.txt.bz2还原为111.txt
bunzip2 1.txt.bz2 #效果同上

压缩技术二(tar.bz2)

归档压缩技术,同前

1
2
3
4
5
6
7
8
9
# 压缩
tar jcvf filename.tar.bz2 descfilename

# 解压
tar jxvf filename.tar.bz2
tar --bzip xvf filename.tar.bz2

# 列表
tar tf filname.tar

zip压缩技术

不覆盖源文件的压缩技术

1
2
3
4
5
6
7
8
9
10
11
12
# 压缩
# 格式:zip filename.zip sourcefilename
zip 111.txt.zip 111.txt #压缩效果是将源文件111.txt压缩为111.txt.zip
# 注意:使用该命令压缩后,源文件仍然存在

# 压缩一个目录使用 -r 参数,-r 递归
zip -r 222.zip 222 #将目录222压缩为222.zip,压缩后源目录仍然存在

# 解压
# 格式:unzip filename.zip
unzip 222.zip #解压效果是将222.zip解压为222目录
#注意:如果当前位置已经有222目录,则会提示是否覆盖

autofs自动挂载

简介

autofs自动挂载器是一个监视目录的守护进程,并在目标子目录被引用时,自动执行预定义的NFS挂载。自动挂载器由autofs服务脚本管理,自动挂载器由auto.master一级配置文件进行配置,该文件引用了一个按惯例称作/etc/auto.misc或其他类似名称的二级配置文件。autofs与NFS两者之间配合用的还是比较多的

使用目的

autofs服务动态自动挂载各种文件系统。mount是用来挂载文件系统的,可以在启动的时候挂载也可以在启动后挂载。这就好像windows中的光驱自动打开功能,能够及时挂载动态加载的文件系统,免去了手动挂载的麻烦。在centos7.2系统下,对于本地固定设备,如硬盘可以使用mount挂载,而光盘,软盘,NFS,SMB等文件系统具有动态性,即需要的时候才有必要挂载,光驱和软盘一般知道什么时候需要挂载,但NFS,SMB共享等就不一定知道了,即一般不能及时知道NFS共享和SMB什么时候可以挂载,而autofs服务就提供这种功能,所以本章详细讲述了autofs自动挂载方式

需要安装的软件

1
2
3
4
5
6
7
# 安装
yum -y install autofs*
yum -y install nfs*

# 重启
systemctl start rpcbind
systemctl start nfs

测试

要求:将分区 /dev/sdb1 自动挂载到 /misc/aaa 目录下

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 第一步: 利用 fdisk 添加一块新磁盘
# 添加磁盘此处略过,不会的同学请去复习前面的内容,复习很重要哦
# 要求格式化为 ext4格式
mkfs.ext4 /dev/sdb1
blkid
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# 第二步: 具体配置
# 打开一级文件
vim /etc/auto.master #当访问/misc目录时,会自动查询二级文件/etc/auto.misc
# 打开二级文件
vim /etc/auto.misc
#填入以下内容
aaa -fstype=ext4 :/dev/sdb2
# 保存退出
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# 第三步: 重启服务
systemctl restart autofs
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# 第四步: 切换目录,触发文件挂载机制
cd /misc/aaa
# 查看是否挂载成功
df -Th

NFS自动挂载

简介

NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样

NFS最显而易见的优点:

  1. 节省本地存储空间,将常用的数据存放在一台NFS服务器上且可以通过网络访问,那么本地终端将可以减少自身存储空间的使用。

  2. 用户不需要在网络中的每个机器上都建有Home目录,Home目录可以放在NFS服务器上且可以在网络上被访问使用。

  3. 一些存储设备如软驱、CDROM和Zip(一种高储存密度的磁盘驱动器与磁盘)等都可以在网络上被别的机器使用。这可以减少整个网络上可移动介质设备的数量

测试

要求:将NFS服务器上发布的共享目录/home/guests/guest2019自动挂载到客户机/home/guests/guest2019

开两台虚拟机,一台作为服务器,另一台作为客户机来测试

服务器端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 建立共享目录
mkdir -p /home/guests/guest2019

# 修改NFS主配置文件
vim /etc/exports

# 填入以下内容
/home/guests/guest2019 10.211.55.0/24(rw,sync,no_root_squash)

# 解析:
# IP 字段表示允许IP地址范围在 10.211.55.0 网段的计算机访问共享目录 “/home/guests/guest2006”
# “rw”表示有读写权限
# “sync”表示数据同步写入内存和硬盘
# “no_root_squash”表示NFS服务器共享目录用户的属性,如果用户是root,那么这个共享目录具有root的权限

# 重启服务
systemctl restart nfs

# 设置开机自启动
systemctl enable nfs-server.service

客户端测试

方式一:手动挂载

1
2
3
4
5
6
7
8
9
10
11
12
# 在客户机行新建一个挂载目录 /syz
mkdir /syz

# 查看NFS服务器发布的共享资源信息
# 注意: 需要关闭服务器端的防火墙,不然会出现查询错误
showmount -e 10.211.55.5

# 手动挂载
mount 10.211.55.5:/home/guests/guest2019 /syz

# 查看是否挂载成功
df -Th

方式二:autofs自动挂载

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
# 隐含原则:
# 若将NFS服务器上发布的共享目录自动挂载到客户端的n层目录上
# 则将前n-1层目录放置于一级文件中
# 最后一层目录放入二级文件中
# 并且除了最后一层目录,其他目录都需提前建立号好

# 建立需要的目录
mkdir /home/guests

# 编辑一级文件
vim /etc/auto.master

# 填入以下内容
# auto.two_master 是我随便起的,自己编写一个记得住的名字即可
/home/guests /etc/auto.two_master

# 编辑二级文件
vim /etc/auto.two_master

# 填入以下内容
guest2019 -fstype=nfs,rw 10.211.55.5:/home/guests/guest2019

# 卸载 /syz 目录
umount /syz

# 查看是否卸载成功
df -Th

# 重启autofa服务
systemctl restart autofs
systemctl enable autofs

# 切换目录,触发autofa挂载机制
# 如果出现没有该目录,检查二级文件是否编写错误
cd /home/guests/guest2019

# 查看是否挂载成功
df -Th

本文标题:Linux笔记

文章作者:尚先森

发布时间:2019年09月29日 - 18:38:19

最后更新:2023年02月20日 - 18:08:34

原始链接:https://imauu.gitee.io/2019/09/29/Linux笔记/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

尚先森 wechat
有任何问题可以扫描上方二维码私聊我哦😊
您的支持是我创作的最大动力^_^