第二次作业
linux安全模型
Linux 安全模型是用于保护 Linux 操作系统和应用程序不受恶意攻击和未经授权访问的一系列机制和技术。它基于许多安全原则和最佳实践,如最小权限原则、分层防御、安全审计和安全监控等。以下是一些核心组件和技术,用于构建 Linux 安全模型的更多细节:
用户认证和授权:Linux 使用密码、密钥和其他身份验证机制来识别和验证用户身份,以便在应用程序和操作系统中授予适当的权限。用户账户管理和密码策略可以通过 PAM(Pluggable Authentication Modules)和其他身份验证和授权插件来进行配置和管理。此外,Linux 提供了许多工具和技术,如 LDAP、Kerberos、SSSD 等,以便将用户身份验证和授权集中管理。
访问控制:Linux 使用许多机制来限制用户和应用程序对文件、文件夹和系统资源的访问。其中,最常用的是文件权限和 SELinux 策略。文件权限是一种基于用户、用户组和其他权限的简单机制,用于控制文件和文件夹的访问。SELinux(Security-Enhanced Linux)是一种更高级别的访问控制机制,使用“标签”来控制文件、文件夹和进程的访问。除了 SELinux,还有其他访问控制技术,例如 AppArmor、Grsecurity 等。
安全审计和日志:Linux 提供了许多工具和技术,如 auditd、syslog、journalctl 等,用于记录和监控系统的活动和事件,以便识别潜在的安全问题和漏洞。审核的日志包括用户活动、系统事件和安全相关信息,如访问拒绝,成功和失败的身份验证尝试,以及系统设置的更改等。Linux 还支持日志聚合和分析,以帮助管理员更好地理解系统中发生的事件。
安全补丁和更新:Linux 发行版供应商定期发布安全更新和补丁,以修复已知的漏洞和弱点,从而提高系统的安全性。系统管理员应该定期检查这些更新并及时应用它们,以确保系统始终保持最新的安全性。
加密和安全通信:Linux 提供了许多加密和安全通信技术,如 SSL/TLS、SSH、IPSec 等,以确保数据在传输和存储过程中的机密性和完整性。SSL/TLS 用于保护 Web 服务器与客户端之间的通信。SSH 用于远程连接和管理服务器,以及在本地网络中进行安全文件传输。IPSec 用于安全地连接不同网络的节点,以确保通信链路的机密性和完整性。
安全监控和响应:Linux 提供了许多工具和技术,如 IDS、IPS、HIDS、NIDS 等,用于监控和响应系统的安全事件和攻击,以便及时采取措施防止安全问题进一步扩大。入侵检测系统(IDS)和入侵防御系统(IPS)可以检测和阻止恶意流量,以及针对应用程序和系统的攻击。主机入侵检测系统(HIDS)和网络入侵检测系统(NIDS)可以监视系统和网络事件,并提供实时警报和通知。
这些组件和技术一起构成了 Linux 安全模型,以保护 Linux 操作系统和应用程序免受恶意攻击和未经授权访问。
权限控制
Linux中权限控制分为几种:
1,普通的rwx权限,设置文件或者文件夹权限,用于控制用户或者用户组对文件或者文件夹的操作
2,selinux,设置selinux权限比较麻烦,也比较复杂
3,file access control list,文件访问控制列表,用于精准控制用户或者用户组的操,优先级高于普通权限
4,SUID,SGID,SOID:suid只能在二进制可执行文件上生效,其作用是当这个文件执行的时候,是以文件的uid权限执行的,比如passwd命令;SGID在目录上生效,表示以后这个目录下创建的文件和文件夹的组权限继承父目录;SOID一般应用在目录上,表示只能让用户删除自己创建的文件,不能删除其他用户创建的(root除外)
示例:
# 在/data下创建了一个1.log的文件,切换到duzy和main都能读但不能写
# 因为权限是rw-r--r--:表示用户组和其他人只能读,不能写
[root@localhost data]# cat 1.log
hello
[root@localhost data]# su - duzy
[duzy@localhost data]$ cat 1.log
hello
[root@localhost data]# su - main
[main@localhost data]$ cat 1.log
# duzy用户在/data目录下创建了一个ddr文件夹,删除了ddr文件的其他用户的可执行权限
# 那么main就不能进入ddr目录下,也不能查看ddr目录下的文件列表
[duzy@localhost data]$ mkdir ddr
[duzy@localhost data]$ ll
total 8
-rw-r-----. 1 root root 6 Apr 24 12:53 1.log
drwxrwxr-x. 2 duzy duzy 6 Apr 24 12:58 ddr
[duzy@localhost data]$ chmod o-x ddr/
[main@localhost data]$ cd ddr/
-bash: cd: ddr/: Permission denied
[main@localhost data]$ touch ddr/main.log
touch: cannot touch ‘ddr/main.log’: Permission denied
# duzy用户在/data目录下创建了一个文件,文件权限是其他人不能进行任何操作
[root@localhost data]# ll
-rw-rw----. 1 duzy duzy 15 Apr 24 12:54 d.log
[main@localhost ~]$ cat /data/d.log
cat: /data/d.log: Permission denied
# 给这个文件加上了facl权限,那么main用户就可以做任何操作了
[root@localhost data]# setfacl -m u:main:rwx d.log
[main@localhost data]$ cat d.log
hello for duzy
# /data目录没有设置SGID权限,任何创建的文件都是用户自己的权限
[main@localhost data]$ touch m.log
[main@localhost data]$ ll
total 8
-rw-rw-r--. 1 main main 0 Apr 24 13:05 m.log
# 给data目录加上SGID权限
[root@localhost data]# chmod 2777 /data
[root@localhost data]# ll / | grep data
drwxrwsrwx. 3 root root 56 Apr 24 13:05 data
# 再次创建文件,组权限就继承父目录的组权限了
[main@localhost data]$ touch m2.log
[main@localhost data]$ ll
total 8
-rw-rw-r--. 1 main root 0 Apr 24 13:06 m2.log
-rw-rw-r--. 1 main main 0 Apr 24 13:05 m.log
结合vim几种模式,学会使用vim几个常见操作
- 命令模式(Command mode):在命令模式下,用户可以使用一些快捷键和命令来移动光标、删除文本、复制和粘贴文本、查找和替换文本等。常用的命令包括:
- h、j、k、l:左、下、上、右移动光标
- x:删除当前光标所在的字符
- dd:删除当前行
- yy:复制当前行
- p:粘贴文本
- /:查找文本
- :wq:保存并退出
- 插入模式(Insert mode):在插入模式下,用户可以直接输入文本。可以通过按下 i、a、o、I、A、O 等命令进入插入模式。
- i:在当前光标所在位置插入文本
- a:在当前光标所在位置后插入文本
- o:在当前行后插入新行
- I:在当前行首插入文本
- A:在当前行尾插入文本
- O:在当前行前插入新行
- 可视模式(Visual mode):在可视模式下,用户可以选择任意数量的文本,并对其进行操作。可以通过按下 v、V、Ctrl+v 等命令进入可视模式。
- v:按字符选择文本
- V:按行选择文本
- Ctrl+v:按块选择文本
通过这三种模式的切换,用户可以高效地编辑文本。
文本处理三剑客
grep
全称是全局搜索正则表达式以及打印;处理文件是一行一行处理。
使用grep --help可以看出,除了grep命令字符本身,其它分为四部分:模式,杂项,输出控制,内容控制
模式选项(控制正则的模式):
Pattern selection and interpretation:
-E, --extended-regexp PATTERN is an extended regular expression 增强正则模式,就是shell中的
-F, --fixed-strings PATTERN is a set of newline-separated strings 固定模式,没有转义,全是常规字符
-G, --basic-regexp PATTERN is a basic regular expression (default)
-P, --perl-regexp PATTERN is a Perl regular expression
-e, --regexp=PATTERN use PATTERN for matching
-f, --file=FILE obtain PATTERN from FILE 从文件中获取匹配格式,按行处理
-i, --ignore-case ignore case distinctions 忽略大小写
-w, --word-regexp force PATTERN to match only whole words 只匹配单词
-x, --line-regexp force PATTERN to match only whole lines 只匹配行
-z, --null-data a data line ends in 0 byte, not newline 行以0结束而不是换行符结束
示例:
[duzy@cos85 ~]$ cat test
\t\n/s/q
[duzy@cos85 ~]$ cat test | grep "\t"
\t\n/s/q
[duzy@cos85 ~]$ cat test | grep -E "\t"
\t\n/s/q
[duzy@cos85 ~]$ cat test | grep -F "\t"
\t\n/s/q
//上面的例子可以看到如果想匹配\t的时候,常规模式和增强模式都只能匹配t,因为把\当作换行符来看了,但是-F固定模式就不同,它不会识别转义字符,全是当作常规字符处理
[duzy@cos85 ~]$ cat /etc/passwd | grep duzy
duzy:x:1000:1000::/home/duzy:/bin/bash
[duzy@cos85 ~]$ cat /etc/passwd | grep Duzy
[duzy@cos85 ~]$ cat /etc/passwd | grep -i Duzy
duzy:x:1000:1000::/home/duzy:/bin/bash
//-i,在匹配中忽略大小写
[duzy@cos85 ~]$ cat a
a
b
k
[duzy@cos85 ~]$ cat b
q
a
b
c
d
e
f
[duzy@cos85 ~]$ grep -f a b
a
b
//上面可以看出,-f是将a中的每一行拿到b中去匹配,符合就列出,有点像a和b的交集
杂项
[duzy@cos85 ~]$ cat b
q
awb
a
b
c
d
e
f
[duzy@cos85 ~]$ cat b | grep -v a
q
b
c
d
e
f
//-v,注意是小写v,表示取反,匹配的不显示,显示不匹配的
输出选项
[duzy@cos85 ~]$ cat /etc/passwd | grep -n nologin
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
//-n 显示行号
[duzy@cos85 ~]$ grep -nH nologin /etc/passwd
/etc/passwd:2:bin:x:1:1:bin:/bin:/sbin/nologin
/etc/passwd:3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
/etc/passwd:4:adm:x:3:4:adm:/var/adm:/sbin/nologin
/etc/passwd:5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
/etc/passwd:9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
//-H 显示文件名
[duzy@cos85 ~]$ grep -o duzy /etc/passwd
duzy
duzy
//-o:仅显示匹配的部分,不是整行
[duzy@cos85 ~]$ grep -d recurse test ~
/home/duzy/.viminfo:|4,39,3,21,1676991126,"/tmp/test/qqq.sh"
/home/duzy/.viminfo:-' 3 21 /tmp/test/qqq.sh
/home/duzy/.viminfo:|4,39,3,21,1676991126,"/tmp/test/qqq.sh"
//-d 如何处理文件夹:recurse:递归,筛选文件夹里面的文件;skip,跳过;read暂时不知
内容控制:
[duzy@cos85 ~]$ grep duzy /etc/passwd
duzy:x:1000:1000::/home/duzy:/bin/bash
[duzy@cos85 ~]$ grep -A5 duzy /etc/passwd
duzy:x:1000:1000::/home/duzy:/bin/bash
force:x:1001:1001::/home/force:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
main:x:1002:1002::/home/main:/bin/bash
[duzy@cos85 ~]$ grep -B5 duzy /etc/passwd
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
clevis:x:976:976:Clevis Decryption Framework unprivileged user:/var/cache/clevis:/sbin/nologin
gnome-initial-setup:x:975:975::/run/gnome-initial-setup/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
duzy:x:1000:1000::/home/duzy:/bin/bash
[duzy@cos85 ~]$ grep -5 duzy /etc/passwd
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
clevis:x:976:976:Clevis Decryption Framework unprivileged user:/var/cache/clevis:/sbin/nologin
gnome-initial-setup:x:975:975::/run/gnome-initial-setup/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
duzy:x:1000:1000::/home/duzy:/bin/bash
force:x:1001:1001::/home/force:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
main:x:1002:1002::/home/main:/bin/bash
//-A:after,输出匹配行后面的多少行,-B,before,输出匹配行前面的多少行;-int,输出匹配行前后多少行
同时筛选多个内容
[duzy@cos85 ~]$ grep -e duzy -e nologin /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
duzy:x:1000:1000::/home/duzy:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
//注意,多个匹配的
locate
会将所有的文件记录在数据库中,但是不是即时更新的,所以最近建立的文件用locate是找不到的
需要使用updatedb命令更新才行,然后locate会去硬盘上找所有没有记录的文件,
[duzy@cos85 ~]$ locate -r "test-.*\.oga"
/usr/share/sounds/freedesktop/stereo/audio-test-signal.oga
//使用正则表达式查找
find
find分为链接文件处理选项,文件路径,表达式和比较
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
链接文件处理选项定义如何处理链接文件,debugopts表示显示日志的等级,path表示查找的路径,表达式表示文件名符合表达式的文件被选择出来,比较是将文件的属性和比较中定义的属性对比,返回true的文件名被显示出来
链接文件选项:
-P 永远不要跟随符号链接。这是默认行为。当 find 检查或打印信息文件时,该文件是一个符号链接,所使用的信息应取自符号链接本身的属性。(默认)
-L 跟随符号链接。当 find 检查或打印有关文件的信息时,所使用的信息应该取自链接所指向的文件的属性,而不是链接本身(除非它是一个破碎的符号链接或 find 无法检查链接所指向的文件)。后面在比较选项中,测试的就不是链接文件本身的属性,而是源文件的属性
-H 除了在处理命令行参数时,不要跟随符号链接。当 find 检查或打印有关文件的信息时,所使用的信息应取自符号链接本身的属性。这种行为的唯一例外是,当命令行上指定的文件是一个符号链接时,可以解析该链接。
表达式:
-maxdepth和-mindepth:设计到文件夹时,最大和最小检查深度;如果两个选项的值一致,那么就只检查这个深度
-xautofs和-xdev:检查不要深入到autofs文件系统中和不要深入到其它文件系统的目录中
比对测试:
对比中的数值含义,+num表示大于这个数,-num表示小于这个数,num表示等于这个数。-empty表示文件或者文件夹是空。-fstype ext3文件系统时ext3,-gid n:表示组id是n时,-group gname:组名比对;-perm mode:表示匹配文件权限。
-perm +|-mode:表示文件权限大于或者小于mode。
操作:
-delete 删除文件,删除失败会报错
-exec,执行命令,查找出来的内容在exec中被{}引用
-path /etc -prune排除path执行的目录,path执行目录必须时查找目录的子目录
tar
tar zcvf :tar.gz格式
tar jcvf tar.bz2格式
tar Jcvf tar.xz格式
查看
tar -tvf name
切割
spilt -b size -d tar_file_name prefix-name
spilt -b 1M -d tar_name prefix-name
[root@cos85 ~]# du -sh local.tar.gz
269M local.tar.gz
[root@cos85 ~]# split -b 50M -d local.tar.gz local-part //-d表示用数字做后缀
[root@cos85 ~]# split -b 50M local.tar.gz local-test //没有-d,表示用字母做后缀
[root@cos85 ~]# ll | grep local
-rw-r--r--. 1 root root 52428800 Mar 13 23:45 local-part00
-rw-r--r--. 1 root root 52428800 Mar 13 23:45 local-part01
-rw-r--r--. 1 root root 52428800 Mar 13 23:45 local-part02
-rw-r--r--. 1 root root 52428800 Mar 13 23:45 local-part03
-rw-r--r--. 1 root root 52428800 Mar 13 23:45 local-part04
-rw-r--r--. 1 root root 19555029 Mar 13 23:45 local-part05
-rw-r--r--. 1 root root 281699029 Mar 13 23:42 local.tar.gz
合并
[root@cos85 ~]# cat local-part0* > local.tar.gz
sed
sed全程时stream editor(流编辑器)是对于行进行的操作
格式:
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
OPTION:结果进行的操作
-n:--quiet,只显示匹配的行,否则会显示所有操作后的文本
-e script:使用脚本代码对每行进行操作,多个命令需要多个-e
-f script-file:对每行使用脚本文件进行操作
--follow-symlinks:对符号链接也进行操作
-c, --copy:在使用-i对文本进行修改的时候,修改写入备份文件而不是原文
-s, --separate:对多个文件进行操作时,不将它们作为一个整体输入,而是视为单个输入
-u, --unbuffered:不使用缓存
-z, --null-data:对行的分割使用null符号
-i,将操作后的行写回,即操作源文件,-i.bak:将源文件进行备份再在源文件上进行修改,.bak是备份的后缀
-r,使用扩展正则
如果没有给出-e、——expression、-f或——file选项,则第一个非选项参数作为要解释的sed脚本。所有其余参数是输入文件的名称;如果没有输入文件,则读取标准输入
script:操作
input-file:操作的文件
script:
sed '/定位/操作/参数1/参数2/操作/参数1/参数2/...' 文件
p:打印匹配行 print
d:删除指定行 delete
a:在匹配行后面追加 append
i:在匹配行前面插入 insert
c:整行替换 change
r:将文件的内容读入 read
w:将文本写入文件 write
s:字符串替换(匹配正则表达式)switch
g:全局操作,否则只会对第一个进行操作
//注意,若最后一个操作没有参数,不需要添加'/'
//所示单个函数的操作,比如a i c,那么不需要添加/,操作+" "+参数即可
定位:
x x为指定的行号,$表示最后一行,sed -n '$p" /etc/passwd
x,y 指定从x到y的行号范围
/pattern/ 查询包含模式的行,比如/root/ 查找包含root字符串的行
/pattern1/,/pattern2/ 查询从模式pattern1到模式pattern2的行,谨慎使用,比如/root1/,/root2/ 查找到第一个root1到root2后,文本后再次出现root1 root2再次显示之间的范围
/pattern/, +n 从pattern行到之后的x行之间范围,同时也存在/pattern1/,/pattern2/的再查找情况(定位模式(行),+x行)
#如果用数字定位,那么后面直接跟操作:
[duzy@cos85 ~]$ sed '1,3s/9/00000000000/g' test
把1-3行中的所有9字符替换为000000000000
如果不加g参数,那么只会替换第一个9字符
# sed -n '/^c/s/^/qqqqqqqqqqqq/p' test
将以c开头的行筛选出来,在行首添加qqqqqqq,然后打印
如果不加-n,那么就会打印所有文本,如果没有p操作就不会打印出来
[duzy@cos85 ~]$ sed '/100/a wwwwwwwwwwwwwwwww' test
在包含100字符串的行的后面添加一行wwwwwwwwwwww
[duzy@cos85 ~]$ sed '/100/i wwwwwwwwwwwwwwwww' test
在包含100字符串的行的前面添加一行wwwwwwwwwwww
[duzy@cos85 ~]$ sed '/co/c wwwwwwwwwwwwwwwww' test
在包含100字符串的行替换为wwwwwwwwwwww
[duzy@cos85 ~]$ sed '1,3a wwwwwwwwwwwwwwwww' test
1-3行,每行后面追加一行wwwwwwwwww
sed高级用法
前后交换位置
[duzy@cos85 ~]$ head -n 1 test
cockpit-wsinstance:x:980:980:User for cockpit-ws instances:/nonexisting:/sbin/nologin
[duzy@cos85 ~]$ head -n 1 test | sed -rn "s/(.*)(980:980:)(.*)(nologin$)/\1\4\3\2/p"
cockpit-wsinstance:x:nologinUser for cockpit-ws instances:/nonexisting:/sbin/980:980:
括号是将匹配分组,上面的例子将整行分为4组,980之前一组,980一组,980和nologin之间的一组,nologin一组
使用\1 \2 \3 \4来指向各个组,然后交换\2和\4的位置可以将行中的内容交换位置
[duzy@cos85 ~]$ ip a | grep "192.168.75"
inet 192.168.75.100/24 brd 192.168.75.255 scope global noprefixroute ens160
[duzy@cos85 ~]$ ip a | grep "192.168.75" | sed -rn "s/(.*inet) +([0-9.]+).*/\2/p"
192.168.75.100
上面这个例子:是将开头到inet为一组,然后中间是一个或多个空格,再跟上一个或多个0-9或者.的匹配为第二组(就是ip),后面的无所谓啦,就用.*代替,这样第二组就是ip地址
变量命名规则
变量名遵循以下命名规则:
- 变量名只能由字母、数字和下划线组成,不能包含特殊字符。
- 变量名的第一个字符必须是字母或下划线,不能是数字。
- 变量名区分大小写,例如 name和Name 是两个不同的变量名。
- 变量名不能使用 Shell 中的保留关键字,如 if、then、else、fi、case、esac、for、while、do、done、function 等。
根据惯例,变量名使用小写字母,多个单词之间使用下划线分隔。例如,变量名可以是 name、age、home_address 等。另外,变量名也可以使用驼峰命名法,例如,变量名可以是 firstName、lastName 等。
建议在 Shell 脚本中使用易于理解和记忆的变量名,以便于维护和管理脚本。
系统变量
环境变量(Environment variables):环境变量是在 Shell 启动时创建的,用于存储系统和用户的配置信息。可以使用 export 命令将变量导出为环境变量。
# 在~/.bashrc文件中,定义了一个duzy变量,使用export将其导出为环境变量
# 就可以在shell中使用
[root@localhost ~]# cat ~/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
export duzy='hello'
[root@localhost ~]# source ~/.bashrc
[root@localhost ~]# echo $duzy
hello
位置变量
位置变量是shell脚本获取执行时输入的参数
$#:表示所有参数个数;
$@:所有参数的列表
$0:脚本名称
$1:表示第一个位置参数
$2:表示第二个位置参数,剩下的以此类推
[root@localhost data]# cat test.sh
#!/bin/bash
echo "all nums=>$#"
echo "script name=>$0"
echo "args list=>$@"
echo "1=>$1"
echo "2=>$2"
echo "3=>$3"
[root@localhost data]# /data/test.sh 1 2 3 4 56 7
all nums=>6
script name=>/data/test.sh
args list=>1 2 3 4 56 7
1=>1
2=>2
3=>3
只读变量
# 之前创建了一个变量duzy
[root@localhost data]# echo $duzy
hello
[root@localhost data]# duzy="qqq"
[root@localhost data]# echo $duzy
qqq
# 现在将其改为只读变量, 就不能被修改了
[root@localhost data]# cat ~/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
readonly duzy='hello'
[root@localhost data]# source ~/.bashrc
[root@localhost data]# echo $duzy
hello
[root@localhost data]# duzy="qqq"
-bash: duzy: readonly variable
局部变量
shell脚本函数内部变量,外部不能引用。使用local指定;
function foo() {
local name="John"
echo "Hello, $name!"
}
foo
状态变量
$?:表示上一个命令执行结果,0表示执行正常,非0表示错误
# 执行test脚本,查看状态变量
[root@localhost data]# ./test.sh
[root@localhost data]# echo $?
0
# 查看一个不存在的文件,查看状态变量
[root@localhost data]# cat qqq.log
cat: qqq.log: No such file or directory
[root@localhost data]# echo $?
1
鸡兔同笼问题
[root@hecs-34400 ~]# cat checken.sh
#!/bin/bash
set -u
head=$1
foot=$2
b=$(((foot-head*2)/2))
a=$((head-b))
if [ $b -lt 0 ] || [ $a -lt 0 ];then
echo "Wrong num!"
exit 1
fi
echo check:$a bunny:$b
创建100个用户
[root@localhost data]# cat create100users.sh
#!/bin/bash
prefix=duzyfortest_
uid=1300
for i in {1..100};do
id $prefix$i &> /dev/null
if [ $? -gt 0 ];then
echo $prefix$i is ok
useradd -u $uid$i -g test -M $prefix$i
if [ $? -eq 0 ];then
echo $prefix$i create ok
fi
echo "flectrag" | passwd --stdin $prefix$i
if [ $? -eq 0 ];then
echo $prefix$i set password ok
fi
fi
done
磁盘存储术语总结: head, track, sector, sylinder
- 磁头(Head):硬盘驱动器上的磁头是读写数据的机械臂,类似于唱片机的唱头。每个盘面上都有一个磁头,数据是通过磁头在盘片表面上读写的。
- 磁道(Track):硬盘驱动器上的盘片表面被分成许多同心圆的环状轨迹,每个轨迹称为一个磁道。一个磁头可以读取或写入一个磁道上的数据。
- 扇区(Sector):每个磁道被分成若干个弧形区域,每个区域称为一个扇区。每个扇区通常包含512字节的数据,用于存储文件数据、操作系统或应用程序。
- 柱面(Cylinder):由相同编号的磁道组成的集合,这些磁道位于不同的盘片上但在同一位置。当读写头移动时,它可以覆盖所有盘面上相同编号的磁道。
注意:硬盘的第一个扇区通常称为主引导记录(Master Boot Record,MBR)。它是一个特殊的区域,包含存储在硬盘上的分区表和引导程序,用于启动计算机。
主引导记录位于硬盘的第一个扇区(扇区0),它的大小为512个字节。主引导记录包含3个部分:分区表(Partition Table)、主引导代码(Master Boot Code)和硬盘签名(Disk Signature)。引导代码区域通常占据MBR的前446个字节,这部分空间用于存储引导程序的代码。分区表区域通常占据MBR的接下来64个字节,用于记录硬盘分区信息。
MBR格式:
MBR叫做主引导山区,是磁盘的第一个扇区,大小是512字节;
由三部分组成:bootloader:446字节;硬盘分区表64字节;结束标志位:2字节;
硬盘分区表中每个分区的结构如下:
第1字节:引导标识,80H表示活动分区,00H表示非活动分区
第2,3,4字节:起始磁头号,扇区号,柱面号
第5字节:分区类型,FAT16、NTFS,扩展分区之类的
第6,7,8字节:结束磁头号,扇区号,柱面号
第9,10,11,12字节:逻辑起始扇区号
第13,14,15,16字节:总扇区号
每个扇区占512字节
这样每个分区大小最大为4个字节个扇区(即最后4个字节占满):2^32*0.5kb=2T
GPT格式:
目前随着硬件的发展,以前用512字节为一个扇区的做法已经不合时宜,现在一般使用4096字节(4K)作为一个扇区,为了和以前的兼容,地址块的规划使用LBA,每个LBA块为512字节,第一个LBA块为LBA0,以此类推。
GPT一共使用了34个LBA块来记录分区信息,格式如下:
LBA0:PMBA,保护性MBR扇区,兼容MBA,PMBR的作用是当不支持GPT的分区工具读取这个扇区时,整个硬盘是一个保护分区,防止被破坏,UEFI并不从这里读取分区表。
LBA1:GPT表头记录,存储GPT表的元素据,签名、版本、表头大小、表头所在LBA号,备份所在LBA号等等
LBA2-33:实际记录分区信息,一共32个LBA,即32个512字节,每个GPT分区由128个字节记录,所以一共可以记录32*512/128=128个分区,每个分区的128字节信息中,除了必要的其他信息,由64位(8字节)用来记录始末LBA号,所以分区最大存储2^64*0.5K=17,179,869,184T
使用GPT来启动系统需要主板支持UEFI
总结学过的分区,文件系统管理,SWAP管理相关的命令及选项
fdisk命令使用
# 添加新硬盘sdb,sdc
[root@localhost ~]# fdisk -l
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000a8cef
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 41943039 19921920 8e Linux LVM
Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
# 使用fdisk对sdb进行操作,创建一个新分区
[root@localhost ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xabb03b85.
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +5G
Partition 1 of type Linux and of size 5 GiB is set
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 5G 0 part
sdc 8:32 0 20G 0 disk
sr0 11:0 1 4.2G 0 rom
# 对新分区创建文件系统并挂载
[root@localhost ~]# mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1342177280
40 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
[root@localhost ~]# mkdir /new1
[root@localhost ~]# mount /dev/sdb1 /new1/
[root@localhost ~]# df -Ph
Filesystem Size Used Avail Use% Mounted on
devtmpfs 894M 0 894M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 11M 900M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/rhel-root 17G 7.6G 9.4G 45% /
/dev/sda1 1014M 183M 832M 19% /boot
tmpfs 182M 12K 182M 1% /run/user/42
tmpfs 182M 0 182M 0% /run/user/0
/dev/sdb1 4.8G 20M 4.6G 1% /new1
tune2fs查看分区信息
# 使用tune2fs查看对应ext4文件系统信息
[root@localhost ~]# tune2fs -l /dev/sdb1
tune2fs 1.42.9 (28-Dec-2013)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: 6567ab61-f690-426a-9021-015a76a454d8
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 327680
Block count: 1310720
Reserved block count: 65536
Free blocks: 1252258
Free inodes: 327669
First block: 0
Block size: 4096
Fragment size: 4096
Group descriptor size: 64
Reserved GDT blocks: 639
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8192
Inode blocks per group: 512
Flex block group size: 16
Filesystem created: Fri May 5 10:06:51 2023
Last mount time: Fri May 5 10:07:10 2023
Last write time: Fri May 5 10:07:10 2023
Mount count: 1
Maximum mount count: -1
Last checked: Fri May 5 10:06:51 2023
Check interval: 0 (<none>)
Lifetime writes: 131 MB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256
Required extra isize: 28
Desired extra isize: 28
Journal inode: 8
Default directory hash: half_md4
Directory Hash Seed: 90db5006-df49-4634-bbb2-2ae69a6a57f9
Journal backup: inode blocks
xfs_info
# 创建xfs文件系统
[root@localhost ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p):
Using default response p
Partition number (2-4, default 2):
First sector (10487808-41943039, default 10487808):
Using default value 10487808
Last sector, +sectors or +size{K,M,G} (10487808-41943039, default 41943039): +1G
Partition 2 of type Linux and of size 1 GiB is set
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
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)
Syncing disks.
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 5G 0 part
└─sdb2 8:18 0 1G 0 part
sdc 8:32 0 20G 0 disk
sr0 11:0 1 4.2G 0 rom
[root@localhost ~]# mkfs.xfs /dev/sdb2
meta-data=/dev/sdb2 isize=512 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@localhost ~]# mkdir /new2
[root@localhost ~]# mount /dev/sdb2 /new2/
# 使用xfs_info查看分区信息
[root@localhost ~]# xfs_info /dev/sdb2
meta-data=/dev/sdb2 isize=512 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
fsck
# fsck命令使用
# 创建了一个文件并写入了数据
[root@localhost new1]# touch bigfile
[root@localhost new1]# vi bigfile
# 取消挂载
[root@localhost ~]# umount /new1
# 破坏分区的超级块
[root@localhost ~]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=10 seek=1 conv=notrunc
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.0025561 s, 410 MB/s
# 挂载报错
[root@localhost ~]# mount -a
mount: wrong fs type, bad option, bad superblock on /dev/sdb1,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so.
# 修复
[root@localhost ~]# fsck.ext4 -y /dev/sdb1
e2fsck 1.42.9 (28-Dec-2013)
/dev/sdb1 contains a file system with errors, check forced.
Resize inode not valid. Recreate? yes
Pass 1: Checking inodes, blocks, and sizes
Root inode is not a directory. Clear? yes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Root inode not allocated. Allocate? yes
/lost+found not found. Create? yes
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Block bitmap differences: +(0--8865) +(32768--33408) +(98304--98944) +(163840--164480) +(229376--230016) +(294912--295552) -(557056--589823)
Fix? yes
Free blocks count wrong for group #0 (23895, counted=23900).
Fix? yes
Free blocks count wrong for group #1 (32126, counted=32127).
Fix? yes
Free blocks count wrong for group #17 (0, counted=32768).
Fix? yes
Free blocks count wrong (1252255, counted=1285029).
Fix? yes
Inode bitmap differences: +1 +(3--10)
Fix? yes
Free inodes count wrong for group #0 (8179, counted=8181).
Fix? yes
Directories count wrong for group #0 (3, counted=2).
Fix? yes
Free inodes count wrong (327667, counted=327669).
Fix? yes
/dev/sdb1: ***** FILE SYSTEM WAS MODIFIED *****
/dev/sdb1: 11/327680 files (0.0% non-contiguous), 25691/1310720 blocks
# 挂载上去文件丢失了,估计是破坏超级块的时候写入多了
# 但是文件系统已经修复
[root@localhost ~]# mount -a
[root@localhost ~]# cd /new1/
[root@localhost new1]# ls
lost+found
swapon swapoff
# 创建一个1G的分区用于swap
[root@localhost new1]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n
Partition type:
p primary (2 primary, 0 extended, 2 free)
e extended
Select (default p):
Using default response p
Partition number (3,4, default 3):
First sector (12584960-41943039, default 12584960):
Using default value 12584960
Last sector, +sectors or +size{K,M,G} (12584960-41943039, default 41943039): +1G
Partition 3 of type Linux and of size 1 GiB is set
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
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)
Syncing disks.
# 重新读取分区表
[root@localhost new1]# partprobe /dev/sdb
[root@localhost new1]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 5G 0 part /new1
├─sdb2 8:18 0 1G 0 part /new2
└─sdb3 8:19 0 1G 0 part
sdc 8:32 0 20G 0 disk
sr0 11:0 1 4.2G 0 rom
# 创建swap分区并挂载上去
[root@localhost new1]# mkswap /dev/sdb3
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=1aa72846-3fb2-4ed0-96d7-3505e35ce7f9
[root@localhost new1]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 0 -2
[root@localhost new1]# cat /etc/fstab
UUID=1aa72846-3fb2-4ed0-96d7-3505e35ce7f9 swap swap defaults 0 0
[root@localhost new1]# swapon -a
[root@localhost new1]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 0 -2
/dev/sdb3 partition 1048572 0 -3
# 取消swap并检
[root@localhost new1]# free -g
total used free shared buff/cache available
Mem: 1 0 0 0 0 0
Swap: 2 0 2
[root@localhost new1]# swapoff -a
[root@localhost new1]# free -g
total used free shared buff/cache available
Mem: 1 0 0 0 0 0
Swap: 0 0 0
不同raid配置的原理
raid0
RAID 0使用条带化(striping)技术将数据块分散存储到多个硬盘中。具体来说,它将一个数据块分成多个块,然后将这些块分别存储到多个硬盘的对应位置上。例如,如果有两个硬盘,每个硬盘的空间大小为100G,那么当一个数据块的大小为200G时,RAID 0会将这个数据块分成两个块,每个块大小为100G,分别存储到两个硬盘上。这样,RAID 0能够同时从多个硬盘读取数据,从而提高读写性能。
优点:1,并行读写;2,易于管理和实现;
缺点:1,无冗余;2,故障率高
总结:无冗余,读写性能好,利用率1,至少两个硬盘
raid 1
RAID 1使用镜像(mirroring)技术将数据同时写入两个硬盘中。具体来说,每个数据块都会被写入到两个硬盘的相同位置上,从而保证数据的冗余和可靠性。
优点:具有高可靠性,具有镜像备份,良好的读性能,自动恢复
缺点:成本高,写入性能低,存储空间利用率低
总结:冗余高,读性能好,写性能差一些,利用率为1/2,至少两个硬盘
raid 5
RAID 5使用条带化(striping)和分布式奇偶校验(distributed parity)技术将数据块分散存储到多个硬盘中。具体来说,它将数据块分成多个条带,并将每个条带的奇偶校验数据存储到不同的硬盘上。
优点:提供数据冗余和可靠性,良好的读性能,易于维护和管理,成本低
缺点:写入性能较差,容量利用率低,重建时间长,磁盘故障率高
总结:有良好的冗余性,读性能好,写性能差,利用率为(n-1)/n,至少3个硬盘
raid 10
先做raid1 再做raid 0就是raid 10
优点:提供数据冗余和可靠性,提供良好的读写性能,适用于大容量存储,重建时间相对较短
缺点:成本较高,容量利用率较低
总结:冗余性好,安全性好,提供了50%的数据冗余性和更好的读/写性能,至少4个硬盘来实现
raid 01
先进行RAID 0条带化,然后再将RAID 0的结果进行RAID 1镜像备份
优点:提供高性能,提供数据冗余
缺点:成本较高,写入性能下降
总结:冗余性好,提供了50%的数据冗余性和更好的读/写性能,至少4个硬盘来实现
不影响业务对LVM磁盘扩容及缩容示例
扩容
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 5G 0 part /new1
├─sdb2 8:18 0 1G 0 part /new2
├─sdb3 8:19 0 1G 0 part [SWAP]
└─sdb4 8:20 0 13G 0 part
sdc 8:32 0 20G 0 disk
sr0 11:0 1 4.2G 0 rom
[root@localhost ~]# pvcreate /dev/sdb4
Physical volume "/dev/sdb4" successfully created.
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 rhel lvm2 a-- <19.00g 0
/dev/sdb4 lvm2 --- <13.00g <13.00g
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
rhel 1 2 0 wz--n- <19.00g 0
[root@localhost ~]# vgextend rhel /dev/sdb4
Volume group "rhel" successfully extended
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
rhel 2 2 0 wz--n- 31.99g <13.00g
[root@localhost ~]# lvextend -L +10G /dev/mapper/rhel-root
Size of logical volume rhel/root changed from <17.00 GiB (4351 extents) to <27.00 GiB (6911 extents).
Logical volume rhel/root successfully resized.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root rhel -wi-ao---- <27.00g
swap rhel -wi-ao---- 2.00g
[root@localhost ~]# blkid
/dev/mapper/rhel-root: UUID="c96a1b24-4a37-41ad-9461-86fcd9ed898a" TYPE="xfs"
[root@localhost ~]# xfs_growfs /dev/mapper/rhel-root
meta-data=/dev/mapper/rhel-root isize=512 agcount=4, agsize=1113856 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=4455424, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 4455424 to 7076864
[root@localhost ~]# df -Ph
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 27G 7.6G 20G 29% /
缩容
# 检查文件系统完备性
[root@localhost ~]# e2fsck -fy /dev/myvg/myvol
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/myvg/myvol: 11/262144 files (0.0% non-contiguous), 53326/1048576 blocks
# 缩容文件系统
[root@localhost ~]# resize2fs /dev/myvg/myvol 1G
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/myvg/myvol to 262144 (4k) blocks.
The filesystem on /dev/myvg/myvol is now 262144 blocks long.
# 缩容卷
[root@localhost ~]# lvreduce -L 1G /dev/myvg/myvol
WARNING: Reducing active logical volume to 1.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce myvg/myvol? [y/n]: y
Size of logical volume myvg/myvol changed from 4.00 GiB (1024 extents) to 1.00 GiB (256 extents).
Logical volume myvg/myvol successfully resized.
# 检查
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
myvol myvg -wi-a----- 1.00g
root rhel -wi-ao---- <27.00g
swap rhel -wi-ao---- 2.00g
存储从底层到高层的顺序:pv->vg->lv->fs
那么扩容就是从低到高
缩容就是从高到低

浙公网安备 33010602011771号