目录
目录
一、linux安全模型
linux安全涉及2个方面,一个是用户、一个是进程;这2项的资源分配过程都如下:
- Authentication:认证;根据登录信息进行验证
- Authorization:授权;验证完成根据不同用户授予不同权限
- Accouting|Audition:审计;
1、用户:
根据用户的uid来作为识别用户的唯一标识;linux中一切皆文件,所以通过设置用户对文件的所拥有的权限来对用户进行管理
管理员:uid: 0
root
普通用户: uid: 1-60000
系统用户:1-999(centos7及以后);1-499(centos7之前);
对守护进程获取资源进行权限分配(shell都为nologin)
登录用户:1000-60000(centos7及之后);500-60000(centos7之前)
给用户进行交互式登录(如pts、tty)
2、用户组:
为了批量对用户进行管理,可以通过设置用户组对文件的所拥有的权限,然后讲用户加入用户组的方式对用户权限进行管理;用户组分为:主要组(primary)和附加组(attached);私有组(private)只在创建用户时未指定主要组时产生;
一个用户必须属于一个主要组(primary group);可也以同时属于多个附加组(attached)
3、进程
进程权限可以通过安全上下文来管理;在默认进程运行中,进程拥有进程运行者的权限;简单理解就是root用户运行的进程将拥有和root同样的权限,这是非常危险的;
安全上下文:
安全上下文对进程运行所正常需要的文件进行标记,来确保进程不会操作到非正常需要的文件,以此来保障系统的安全运行
二、用户、用户组管理及权限设置
1、用户管理
1.1、用户的增删改查
增:useradd
useradd test #新建用户test ,根据配置文件信息,也会自动配置UID,新建家目录,shell
useradd test -u 2000 -d /home/test -s /bin/bash #新建用户test ,同时指定uid为 2000 、家目录/home/test、shell为;/sbin/nologin
rhel新建用户默认shell为/bin/bash
ununtu新建用户默认shell为/bin/sh;需要注意;
有些服务账号为了安全不用做登录账户,rhel需要指定 -s /sbin/nologin;ubuntu需要指定-s /usr/sbin/nologin
/etc/skel/
新建用户会有默认家目录,默认家目录下会有一些配置文件。
这些文件依据/etc/skel/ 下的文件生成,skel下有什么,用户的默认家目录里也会有什么。
可以在useradd -M 使用-M参数再创建user是不会创建家目录,需要手动创建,不会使用/etc/skel/下的默认文件
/etc/default/useradd :新建用户的默认信息配置文件。
如:shell类型、指定SKEL的路径
删:userdel
userdel test #删除用户test,但默认不会删除家目录、邮箱....
userdel -r test #删除用户test及所有信息,会同时删除家目录、邮箱...
改:usermod(可修改某一项或多项)
-u 1000 预设用户的UID为1000 (1000以上为普通用户uid)
-d /home/xx 修改家目录为 /home/xx
-s /bin/bash 修改shell为 /bin/bash
-g groupbane 修改主要组 例:usermod -g group1 test 修改test用户的主要组为group1
-G groupbane 修改附加组(只加入一个附加组) 例:usermod -G group2 test 修改test用户的附加组为group1
-aG groupbane 添加附加组(同时属于多个附加组) 例:usermod -aG group3 test 修改test用户的附加组,添加至组group1
usermod test -u 2000 -d /home/test1 -s /bin/bash -g zu1 -G fushuzu -aG fushuzu2 修改用户test的uid,家目录(修改前要先创建出家目录),shell,主要组或附加组
-M 虽然指定家目录,但是不创建家目录
-m 指定家目录后创建(默认项)
-r 指定为系统账户
查:id
id test 查看用户 test的信息,会显示用户名,uid,gid(主要组),所属组(所有组调用/etc/shadow)
getent passwd test #内查看单个用户test 的信息(共7列,以 :分隔开)
第一列:username用户名
第二列:密码,但已被移除,用x表示
第三列:用户的UID,不能重复
第四列:用户所属组ID,private group ID,任何用户都要有所属组,可以属于一个主要组或者一个或多个附加组
第五列:描述信息,如:邮箱,电话....
第六列:用户的家目录信息
第七列:用户的登录shell
1.2、用户密码的增删改查
查 :getent
getent shadow username #显示用户 username的密码信息(以:分割为9列)
例:test:$6$sdfdsfgfdg$............:18263:0:99999:7:::
第一列:用户名称
第二列:用户密码,非明文,加密方式在/etc/login.defs下ENCRYPT_METHOD项;第一个$$间是加密方式,第二个$$间是加密时间;
第三列:密码上次修改时间,是1970-1-1日(unix1969年诞生后的第一个元旦)距今天多少天
第四列:密码允许修改的最小间隔,0表示任意时间,1表示要想下次修改密码至少一天后才能修改,根据第三列时间来计算
第五列:密码多久后失效,密码修改多少天后失效,无法登录,根据第三列时间来计算;但可以根据第7列时间来延长失效时间
第六列:密码失效提示,据第五列时间多少天时,会提示你密码何时失效;如5,密码失效前5天会提示
第七列:密码失效延长时间,密码失效后,还允许几天可用,不会立即失效;
第八列:用户失效日期,直接指定用户失效日期
第九列:保留项
改:passwd
passwd username #为用户username 设置密码
-d 删除用户密码
-e 重置密码,使第三列变为0,密码立即失效,下次登录必须重新设置密码
-n 5 修改第四列允许修改最小有效间隔时间为5
-x 10 修改第五列密码将在10天后失效
-w 1 修改第六列,密码将在过期前1天提示
-i 2 修改第七列,密码大气候宽限2天
-l 锁定用户,此时只有root能切换到该用户,同时/etd/shadow文件下该用户第二列前出现!!;例:test:!!$6$sdfdsfgfdg$............:18263:0:99999:7:::
-u 解除锁定
--standin passwd --stdin test mima 将用户test 的密码修改为文档mima内的内容 (因密码需要加密,所以不能直接使用文本重定向,但8.0使用过能通过)
echo “123“ |passwd --stdin test 将用户test 的密码修改为123(也可以不带“”)
ubuntu不支持passwd --stdin命令;可以使用passwd "123456\n123456" |passwd usrname
改:chage
用法:chage -d 0 -m 0 -M 99999 -W 2 -I 3 -E 2022-11-11 username
-d 上次修改密码时间,一般不设置或者设置为0,表示下次登陆需修改密码
-m 5 修改第四列允许修改最小有效间隔时间为5
-M 10 修改第五列密码将在10天后失效
-W 1 修改第六列,密码将在过期前1天提示
-I 2 修改第七列,密码大气候W宽限2天
-E 2022-11-11 修改第8列,过期时间为2022-11-11,/etc/shadow下还是显示距离1970-1-1日的天数
2、用户组管理
/etc/group 存放用户组信息(以:分割为4列)
/etc/gshadow 存放用户组密码信息
user-group主要组关联性:一个用户必须属于一个主要组(私有组也是一种主要组),在创建一个用户时,若未将其划入组,则默认创建一个同名的私有组private group;
user-group附加组关联性:对于附加组attached group,一个用户可以同时属于0个,一个或者多个附加组;
2.1、用户组的增删改查
增 :groupadd
groupadd testzu #创建用户组 testzu
groupadd testzu -g 2000 #创建用户组 testzu,同时指定其组ID为2000
删 :groupdel
groupdel testzu #删除用户组 testzu
改: groupmod
-g 3000 #修改组ID为3000 例:groupmod testzu -g 2000
-n new #重命名组名称为new 例:groupmod testzu -n testzu1
查: getent group 组名 (以:分割为4列)
第一列:组名称
第二列:组密码,实际存放在/etc/gshadow
第三列:组ID
第四列:组成员
2.2、用户组密码的增删改查
gpasswd:管理组,
用法:gpasswd[-a user][-d user][-A user,...][-M user1,user2...][-r][-R] groupname
gpasswd groupname #为用户组设置密码
-a user:添加用户user到附加组
-d user:从附加组删除用户user
-r:删除密码
-A user:指定管理员为用户 user
-M user:指定组成员为用户 user和-A的用途差不多
-R:限制用户登入组,只有组中的成员才可以用newgrp加入该组
默认的,一个用户创建的文件属于其主要组,但是当这个用户同时属于其他的附加组时,在该用户shell下使用newgrp groupname,可以临时切换至其附加组groupname,此时创建的为文件属于其附加组;若用户组groupname有密码,在输入newgrp groupname后会提示需要输入组密码,此时即使该用户不在groupname组,不以此组为附加组或主要组,只要输入groupname组密码,创建的文件也属于groupname组;exit 退出临时切换组状态
gpasswd -d username groupname #从groupname组中删除用户username
三、用户、用户组权限管理及特殊权限
1、权限管理
su - username -c “command" #通过su命令直接让用户 username使用命令command,而不用切换用户
1.1、权限介绍
权限:是指文件/目录的所属用户user,所属的组group(所属用户不一定在所属组内),和其他other 对该文件/目录可进行什么操作的权限,
具体:对文件 r(读)w(写)x(执行)-(无对应权限)
对目录 r(可查看目录下文件属性)w(目录下可增删改文件)x(可进入该目录下)-(无对应权限)
查看:ls -ld
drwxr-x---. 3 root root 4096 Oct 26 04:01
第1个字母:一般为d表示此文件是目录,-表示为文档,l表示为链接,b表示为块设备...
第2-4字母:表示文件所有者User对该文件的权限
第5-7字母:表示文件所属组Group对该文件的权限
第8-10字母:表示其他Other对该文件的权限
1.1.1、普通文件权限
r:表示该文本文件可以被查看、拷贝内容,如:cat,less,more。。。
w:表示该文本文件内容可以被增删改,如vi,>>。。。
x:表示该文本文件可以作为脚本来执行,当一个脚本对其没有x权限时,除了root,其他用户无法执行该脚本
文件的所有者也受权限限制,但是文件所有者即使没有任何权限,也能通过修改文件权限来获取rwx权限;
root用户只受x权限限制:即root没有rx权限也能对文件进行读写,没有x权限就不能执行;但可以自己加x权限;
软连接的权限操作:修改软连接的权限其实是对指向文件进行操作
1.1.2、目录文件权限
r:表示该目录文件内的子文件可以被查看,有哪些子文件。如:ls。。。
w:表示该目录文件内子文件可以被增删,如touch、rm...修改子文件的所有者,所有组,touch,更改子文件权限。。。
x:表示可以进入该目录文件下,如cd;若只有r或w权限无x权限,虽然也能通过绝对路径对目录进行一些操作,如ls -l file;stat file;但是属于异常权限;
对于目录文件只有3种权限设置有意义:--- 无任何权限;r-x 有完整的读权限,rwx 有完整的读写权限(目录的w权限要慎重,普通用户有此权限可删除目录内任意文件);
特殊的:X权限
chmod -R a+x filename #递归为 filename内的所有文件都赋予x执行权限
chmod -R a+X filename #递归为 filename内的所有目录都赋予x执行权限,不对文本文件操作
1.2、权限编辑
chown:修改文件所有者
chown user filename #修改文件filename的所有者为user
chown :group filename #修改文件filenam的所属组为group
chown user:group filename #同时修改文件filenam的所有者为user,所属组为group
chgrp:修改文件所属组
chgrp group filename #修改文件filename 的所属组为group;等同 chown :group filename
1.2.1、字符和10进制
目录权限
0 --- 0
1 --x
2 -w-
3 -wx
4 r--
5 r-x 5
6 rw-
7 rwx 7
即:chmod 777 filename 等同于 chmod u+rwx,g+rwx,o+rwx filename
1.2.2、普通文件权限编辑
chmod 编辑文件权限
u 表示所有者user
g 表示所属组group
o 表示其他other
+r 表示增加权限r
-r 表示删除权限r
=rwx 表示编辑权限为rwx ,所有权限都有
chmod u+w filename #只修改文件 filename的所有者user的权限,增加w权限
chmod u+w,g-w,o=r-x filename #修改文件 filename的所有者user的权限,增加w权限,所属组group,取消w权限,其他other其权限为r-x权限
1.3、特殊权限①:针对普通用户
当文本出现s,S,t,T,这种情况是由于对文件有无x权限导致的显示差异,小写s,t 表示有x权限,S,T 表示没有x权限
①SUID(set uid)4
此权限常用于可执行文本,此文档在被任何非所有者用户执行时,可以临时获取到文档所有者的权限;文件背景为红色
例:root用户的文档此权限,普通用户执行时,可以获取到root权限进行一些操作,
如: /bin/passwd,用户可以使用passwd修改自己的密码 -rwsr-xr-x. 1 root root 33424 Feb 18 2022 /bin/passwd
chmod u+s filename 或 chmod 4755 filename #755为文件原权限;
chmod u-s filename 或 chmod 0755 filename #755为文件原权限;
②SGID(set gid)2
此权限常用于目录文件,任何用户在此目录内创建的文件,其所属组都属 于此目录文件所属组;文件背景为黄色
若用于可执行文本,用户在执行此文件将继承程序所属组的权限,没啥意义,进程将拥有所属组的权限???;那SGID+提升root组权限,是否具有root权限?,不行。用户首先需要x权限才能对sgid文件进行操作,但是可以做到无w权限将文件删除。
chmod g+s filename 或 chmod 2755 filename # 修改gid,755为文件原权限;
chmod g-s filename 或 chmod 0755 filename # 修改gid,755为文件原权限;
③sticky 1
此权限用于目录文件,有此权限的目录,任何用户在该目录下创建的文件,只有文件所有者和root可以删除
例:/tmp drwxrwxrwt. 10 root root 4096 Oct 27 20:17 .
chmod o+t filename
chmod o-t filename
1.4、缺省权限umask
缺省情况下,任何用户创建目录文件的最高权限是777,即 rwxrwxrwx;文本文件的最高权限是666,即 rw-rw-rw-(防止文本文件有问题被随意执行);但为了保证文件的安全,使用umask来限制非文件所有者的权限,umask是二进制数字,需要转化为字符,再用默认权限, rwxrwxrwx (目录)和 rw-rw-rw- (文本)减去umask扣除的权限
root用户的umask 二进制是0022 (只看后三位);即:--- -w- -w-;所以默认权限最大:rwx r-x r-x(目录) rw- r-- r--(文本)
普通用户的umask 二进制是0002(只看后三位);即:--- --- -w-;所以默认权限最大:rwx rwx r-x(目录)rw- rw- r--(文本)
umask 查看当前用户的umask
umask 0033 #临时修改当前用户的umask为 --- r-- r--(退出shell失效)
vim /etc/bashrc #通过修改环境变量文件永久修改所有用户的umask,添加:umask 222
vim ~/.bashrc #直接插入umask数值,永久修改当前用户的umash,添加:umask 222
(umask 777;touch a.txt) #()内的命令临时有效,即:先修改umask,再创建文件a.txt;执行完成后umask恢复默认
1.5、特殊权限②:针对root
lsattr filename #查看文件的管理员特殊权限;
chattr +i filename #文件赋予i特殊权限,文件将不能被修改属性、删除;
charrt -i filename #取消文件的i权限;
chattr +a filename #文件赋予a特殊权限,文件可以被查看、追加(>>);不能删除、修改、不能vi编辑;
2、acl权限
2.1、普通文件的acl权限
当一个文件需要对多个用户、用户组设置不同权限时,chmod 命令就不能满足需求了,这时候就需要通过使用acl来对文件设置特殊权限,使用完acl设置权限后在 drwxrwxrwx+ 权限的最后一个字符一个+号,表示有acl权限;其acl权限的优先级从上往下依次降低;
增加acl权限:
setfacl -m u:user:rwx filename #设置用户user对文件filename的acl权限为rwx
setfacl -m g:group:rwx filename #设置group组对文件filename的acl权限为rwx
移除acl权限:
setfacl -x u:user: filename #移除用户user对文件filename的acl权限
setfacl -x g:group: filename #移除group组对文件filename的acl权限
setfacl -d filename #清除文件 filename 的所有acl权限
查看acl权限:
getfacl mima1 #查看文件 mima1的acl权限有哪些设置,如下 ,
# file: mima1 =====> 文件名
# owner: root =====>所有者
# group: root =====>所属组
user::rw- =====>所有者权限 chmod修改
user:hx:rwx =====>acl设置的用户hx的权限
group::r-- =====>所属组权限 chmod修改
group:hanxin:rwx =====>acl设置的组hanxxin的权限
mask::rwx
other::r-- =====>其他的权限 chmod修改
2.2、目录文件的acl权限
目录文件的acl权限和文本文件不一样,目录文件的acl权限的意义是:在该目录下创建的文件继承了该目录的acl权限设置;其acl权限的优先级从上往下依次降低
增加acl权限:
setfacl -m d:u:hx:rw test #设置用户hx对目录文件 test的acl的default继承权限为rw
setfacl -m d:g:hanxix:r test #设置hanxin组对目录文件 test的acl的default继成权限为r
setfacl -m d:u::rw test #设置所有者用户对目录文件 test的acl的default继成权限为rw
setfacl -m d:g::r test #设置所属组对目录文件 test的acl的default继成权限为r
移除acl权限:
setfacl -x d:u:user: filename #移除用户user对目录文件filenameacl的default继成权限
setfacl -x d:g:group: filename #移除group组对目录文件filenameacl的default继成权限
setfacl -d filename #清除目录文件 filename 的所有acl的default继成权限
查看acl权限:
getfacl mima1 #查看目录文件 mima1的acl权限有哪些设置,如下
# file: test =====>文件名
# owner: root =====>所有者
# group: root =====>所属组
user::rwx =====>所有者权限 chmod修改
group::r-x =====>所属组权限 chmod修改
other::r-x =====>其余权限 chmod修改
default:user::rwx =====>所有者的继承权限
default:user:hx:rw- =====>上面添加的用户hx的集成权限
default:group::r-x =====>所属组的集成权限
default:group:hanxin:r-- =====>上面添加的用户组的继承权限
default:mask::rwx =====>缺省mask权限(所有的用户和组的继承权限不能比mask高,特殊的:所有者即使没有任何权限,也能进行所有操作)
default:other::r-x =====>其余的继承权限
修改umask:(修改目录文件acl)
setfacl -m d:mask:rwx filename
2.3、mask权限阈值
mask权限:
文件的mask权限默认为rw-;目录的mask权限默认为rwx;默认下非所有者的权限不能超过mask;mask作为权限阈值;
setfacl -m mask:rwx filename #设置文件的mask权限为rwx
说明:
默认权限=mask-umask;
最终权限=mask与acl
四、vim文本编辑器
文本编辑:VI/VIM编辑器;一次将整个文件加载至内存再处理
vi/vim 有四种模式:命令模式、编辑模式、末行模式、视图模式
vi/vim /etc/xxx #对/etc/xxx 文档进行编辑;此时先进入命令模式
vim配置文件:
全局:/etc/vimrc
用户:~/.vimrc
配置文件内容及建议设置
- syntax on #开启高亮
- set ts=4 #tab转为4 个空格
- set expandtab #开启tab自动转空格
- set shiftwidth=4 #设置缩进默认为4 个字符
- set cul #突出显示光标行,光标行带下划线
- set ai #开启自动缩进
- set paste #开启原格式粘贴
多文件打开
vim -o file1 file2 #2个文件按上下分屏同时打开
vim -O file1 file2 #2个文件按左右分屏同时打开
vim -d file1 file2 #直接对比2个文件,左右分屏显示差异;等同vimdiff
ctrl+w 然后按 ←→ 或者↑↓ 切换
:wqall #保存这2个文件并退出
1、命令模式
此模式下主要是查看文档内容并可进行简单编辑;任何模式下按Esc都可返回到命令模式。
查看文档内容:
⬅⬆⬇➡或者hjkl来进行左上下右的移动光标来查看文本
gg #光标跳转到首行行首
^ #跳转到光标行行首
$ # 跳转到光标行行尾
9G #光标跳转到第9行行首
G #光标跳转到尾行行首
ZZ #保存修改并退出
ZQ #不保存修改直接退出
0 #跳到光标行行首
^ #跳到光标上非空的第一个字符
$ #跳到光标行行尾
b #当前或前一个单词词首; 5b #依次跳转5个单词
w #跳到下一个单词词首;5w #依次跳转至5个单词
e #跳到下一个单词词尾;5e #依次跳转5个单词
>> #使光标所在行向右缩进;可配合 :set shiftwidth=4 调整缩进距离
<< #使光标所在行向左缩进;可配合 :set shiftwidth=5 调整缩进距离
( #跳至上一句;句子间以. 或者空格隔开
) #跳至下一句
{ #跳至上一个段落;段落间以空行隔开
} #跳至下一个断了;
ctrl+b #向上翻屏
ctrl+f #向下翻屏
替换命令:
r #然后输入字符,替换光标右侧第一个字符;
R #替换光标右侧多个字符,此时底部出现replace;输入多少个替换多少个;
简单编辑操作:
x #剪切光标右侧第一个字符,可以使用p/P粘贴
X #剪切光标左侧第一个字符
xp #将光标右侧2个字符切换位置
~ #光标当前字符切换大小写
J #删除当前行尾的换行符;即将此行和下一行合为一行
D #删除从当前光标到光标所在行尾的全部字符;等同 d$
d^ #删除光标至非空行首
dd 删除光标所在行 5dd 删除光标行及往下共5行内容
P/p 粘贴剪切板上内容,
- 剪切板上内容若为若干行时: P 粘贴至光标上一行;p 粘贴至光标下一行
- 剪切板上内容若为若干字符时:P 粘贴至光标所在字符左侧;p 粘贴至光标所在字符右侧
d0 #从光标左侧删除至行首
d$ #从光标右侧删除至行尾
dH #从光标左侧删除至首行
dL #从光标右侧删除至尾行
yy #复制光标行
5yy #复制光标行往下共5行内容 ;配合 P/p 粘贴,此时删除的内容在剪切板上,可以移动光标到某行,P 粘贴至光标上一行;p 粘贴至光标下一行
di" #光标在" "符号内时,删除""内的字符;其他字符 () <> {} [] `` "" '' 也可以
yi( #光标在( )符号内时,复制( )内的字符;其他字符 ()<> {} [] `` "" '' 也可以
100iipesc键 #在本行连续插入100次ip
100ihan回车 esc键 #插入100行,每行内容都是han
u #回退,返回上次操作,多次按 u 能多次回退
U #回退,取消本行所有操作
ctr+r #取消回退
切换到其他模式:
O #跳转到到当前光标的上一行行首并进入编辑模式
i # 跳转到光标左侧并进入编辑模式
a #跳转到光标右侧并进入编辑模式
I #跳转到光标所在行行首并进入编辑模式
A #跳转到光标所在行行尾并进入编辑模式
o #跳转到到当前光标的下一行行首并进入编辑模式
: 或者 / #进入末行模式
2、编辑模式(插入模式)
此模式下主要是对文档内容进行编辑;
⬅⬆⬇➡l来进行左上下右的移动光标,在光标处对文本内容进行增删
删除键 和 Del来对文档进行向左向右的删除
Enter键进行换行
切换到其他模式:
Esc 进入命令模式
3、末行模式
此模式下主要是对文档内容进行查找、复杂操作或批量编辑
:w #保存对当前文本的修改,但不退出;
:w filename #另存为 filename文件;
:r filename #将文件filename内容复制到当前光标处
:q #退出当前文本(未对文本进行操作时使用;若已修改,则会提示你未保存修改)
:wq #保存当前修改并退出(等同命令模式下直接ZZ)
:x #保存,等同 :wq
:X #对当前文件进行加密(然后输入2次加密密码,加密后不能正常查看)/解密(然后输入1次加密密码)
:q! 强制退出当前文本(已进行修改,但不保存)
:!command #在不退出当前文本的情况下,执行command命令,输出也会在当前界面底部显示
:r!command #将当前命令command的执行结果复制到光标处
:r! head -n 10 /tmp/aa|tail -n +5 #将/tmp/aa的5-10行追加到本文本内
输入“:”后,按↑↓箭头可以查看末行模式的历史命令
范围界定:
:% #表示全文,相当于1,$;
:$ #表示最后一行;$-1表示倒数第二行;
:1,7 #表示1-7行;
:3,+2 #表示3-5行,
:3;7;9 #表示第3 7 9行
:3,6d #表示删除3-6行,
:3,6y #表示复制3-6行,然后使用p或者P粘贴到光标下一行或上一行
:5,10 w>>/tmp/aa #将本文本的5-10行追加到/tmp/aa
:5,10 w!/tmp/aa #将本文本的5-10行覆盖到/tmp/aa
:/one/ #从当前行向下查找,直到匹配到出现one的所有行
:/one/,/two/ #从当前行向下,匹配到one的首行到匹配到two的首行的所有行
:/one/,$ #从当前行向下,匹配到one的首行到尾行的所有行
界定范围后的操作:
d #删除剪切,可配合p/P粘贴
y #复制,可配合p/P粘贴
w file #将范围内的行另存到指定文件file;输出至 file
r file #在指定位置插入file文件的所有内容;读取 file至
t 5 #将范围内的行复制到第5行后
m 7 #将范围内的行移动到第7行后
查找:
/abc #从光标处往下查找abc,此时按n继续往下查找下一个;按N逆向往上查找上一个
?abc #从光标处往上查找abc,此时按n继续往下查找上一个;按N逆向往下查找下一个
替换:(可以配合范围界定只替换部分区域,)
格式:s/a/b/ s#a#b# s@a@b@
:1,$s/aa/bb/g #从第1行至最后一行开始,将全文aa替换为bb(global或g表示将每行的所有aa都替换,没有global则表示只替换每行的第一个aa)
:5,10s/aa/bb/ #从第5行至10行,将每行的第一个aa替换为bb
:%s/aa/bb/ #全文替换,将每行的第一个aa替换为bb
:/aa/,/cc/s/aa/bb/ #从找到第一个aa到找到第一个cc这些行的范围内,将每行的第一个aa替换为bb
set功能:(若保存在vimrc文件下为默认配置,不需要带:号)
:set number #显示文本的行号
:set nonumber #取消显示行号
:set list #显示行尾标识$符号、table等特殊符号
:set nolist #取消显示特殊符号
:set ignorecase #忽略字符大小写;简写:set ic
:set noic #取消忽略字符大小写
:set autoindent #自动缩进:回车换行时,和上一行行首缩进同样的字符,用于写shell脚本;简写:set ai;当使用set ai,且当前行已经缩进时,再使用粘贴功能时,所粘贴内容每一行都会自动缩进
:set noai #取消自动缩进
:set paste #原格式粘贴;配合set ai使用,将粘贴内容原格式粘贴,不会再自动缩进
:set nopaste #取消原格式粘贴;
:set fileformat=dos #启用或将当前文档格式转化为win格式(类似unix2dos) 简写:set ff=dos
:set fileformat=unix #启用或将当前文档格式转化为unix格式 (类似dos2unix) 简写:set ff=unxi
:syntax on #开启语法高亮,建议开启
:syntax off #关闭语法高亮
:hlsearch #设置搜索内容高亮,所有文档中都高亮; 简写:shl
:nohlsearch #关闭搜索内容高亮;建议开启此项 简写:nohl
:set expandtab #启用tab键用8个空格代替,可配合set ts;简写 :set et
:set noexpandtab # 取消用tab键用空格代替,简写 :set noet
:set tabstop=4 #指定4个空格代替tab(敲tab时转化为个4空格)简写 :set ts=4
:set shifwidth=4 #设置缩进为4个字符;
:set cursorline #光标所在行带下划线突出显示 ;简写:set cul
:set nocursorline #取消光标行突出功能
:set key=1234 #设置加密密码为1234
:set key= #取消加密
:set all #查看所有的set功能
4、可视化模式
此模式下主要是对文档内容进行范围性的选择,然后复制或删除;在命令模式下按v或V或者ctrl+v,3种方式进行不同操作。
v #对文本进行条形选择,按v后左右移动光标选择一行某一部分,然后x删除,y复制;最后p粘贴
V #对文本进行多行选择(同ndd或nyy),按上下移动光标选择某几行,然后x删除,y复制;最后p粘贴
ctrl+v #对一行或多行进行矩形范围选择(如第5-10行的第20-40字节区域),按上下左右移动光标选择,然后x删除,y复制;最后p粘贴
对区域内进行添加:
- ctrl+v 选择,
- 按 I(大写的i)在所选区域左侧插入;A在右侧插入
- 输入内容如#;
- 然后按esc,#会应用到所选整个区域左侧
5、异常处理
主要是对文档异常问题进行处理(多人编辑同一文本或未正常退出编辑模式等)
vi编辑器原理:将xx文件加载至缓存,生成.xx.swp文件;在.swp文件内进行修改,保存退出时再将.swp文件变化加载至原xx文件。若意外终止vi编辑,则再次编辑时会提示已存在.xx.swp文件。
O #只读原文件
E #强制再次编辑
R #恢复.swp至原文件
D #删除.swp文件
五、其他文本处理工具
1、find
find #文件查找,在指定路径下依照 所有的条件列出选定文件,包括隐藏和所有子文件,默认递归所有路径;默认支持通配符;默认多个条件写在一起是并的关系
-maxdepth 3 #最多显示3级子目录文件;find /etc/ -maxdepth 3 -maxdepth 2
-mixdepth 2 #至少显示2级子目录文件
-depth #先处理文件,再处理目录本身,防止先处理文件夹影响文件;默认先显示目录文件
-name "*.cfg" #查找指定文件,以.cfg结尾的文件
-iname "*.cfg" #查找指定文件,不区分大小写以.cfg结尾的文件
-type p #查找文件类型为管道文件;f 普通文本、s 套接字文件、b 块设备、c 字符文件
-regex "pattern" #用正则表达式方式匹配整个路径pattern,而不是文件名,如".*\.conf"
-user root #查找属于用户root的文件
-nouser #查找用户被删除的用户文件
-empty #空文件或目录
-not 或 ! #表示非; ! -type d 表示非目录文件
-a #默认,可省略,多个条件且关系; -type d -a -type p
-o #多个条件为或关系 ; -type d -o -type p
非a且非b = 非(a或b)==> !\( -type d -o -type p \) =非目录、非管道文件, ( 右侧要留空格
非a或非b = 非(a且b)==> !\( -type d -a -type p \) =非目录 或 非管道文件,只要不是同时属于目录和管道的文件就行
-prune #排除,排除左边的条件; -path '/etc/serurity ' -a -prune; -a可以省略
-size 4k #以大小为过滤标准,4k表示3-4k,不含3k,含4k;+4k表示大于4k;-4k表示小于等于4-1k;
-atime 5 #默认以天为单位,24小时内为1天;5表示等于5到5+1天;+5表示大于5+1天;-1表示0-1天之内
-mtime
-ctime
-amin 5 #表示一分钟为单位;查找access时间;5表示等于5-5+1分钟,不含第5+1分钟;+5表示大于5+1分钟,-4表示小于4分钟
-mmin
-cmin
-perm 755 #指定权限755;
/222 :u g o 只要有一个满足x权限就行;-222 :u g o都要有x权限;-匹配的范围少
-006 :o有r且w权限 /006: o有r或w权限
-ls #找到文件后执行”ls file“
-fls file #查找到文件后执行“-ls > file
-exec ls {} \; #对查找到的文件执行 ls命令
示例:
find / -regex '/.*/.*/.*/.*\.conf' #查找/下的路径下目录级别为4级的以.conf结尾的文件
find /etc -path '/etc/serurity ' -a -prune #先查找出/etc下的所有文件,再排除/etc/serurity之后的文件
find /etc -path '/etc/security' -a -prune -o -name "*.conf" #查找/etc下,除security目录外的这些文件中.conf以结尾
find /etc \( -path "/etc/security" -o -path "/etc/systemd" -o -path "/etc/dbus-1" \) -a -prune -o -name "*.conf"
find /etc/ ! \( -path /etc/security* -o -path /etc/sustemd* \) -o -name '*.conf'
find /etc/ -name xx1 #在/etc/ 下查找文件名为xx1的文件位置
find / -size +300M #在/中查找大小大于300M大小的文件
find / -size +100 -size -300M #在/中查找大于100小于300M的文件
find / -user aaa #在/中查找所有者为aaa的文件
find /etc/ -user test -exec cp -arf {} /tmp/ \; #在/etc/下查找属于用户test的文件,将这些文件在不改变文件属性的情况下复制到/tmp/下
find /etc/ -user test -delete #直接删除找到的文件
find /etc/ -user test -fls filename #将找到的文件长格式信息保存到指定文件filename 中
find -type f name '*.txt' -print0 |xarge -n1 rm #以null字符作为find查找到的文件名分隔符,再将其删除;用于文件名中出现空格的情况
seq 60|xargs -i -P10 wget -P /data http://10.0.0.1/{}.html #并发执行10个进程,将60个下载点的编号以10为进程书来下载;
并发下载bilibili视频实例:
yum install python3-pip -y
pip3 install you-get
seq 60 | xargs -i -P3 you-get https://www.bilibili.com/video/BV14K411W11W7UF?p={}
2、grep
grep a /tmp/abc 逐行在内存引入/tmp/abc文本过滤 每行中含a的行,输出含a的行;也可使用 | 配合其他命令处理文档;
-i a 不区分大小写过滤a或者A
-v a 反向过滤不含a的行
-m 5 #只显示前5行
-n 过滤并显示行号
-e xx1 -e xx1 #多个-e一起使用,满足一个-e的内容即可
-w xxx #只匹配单独的单词xxx,而不显示其他包含xxx的单词,如xxxb不显示;
-A 5 过滤出内容行显示出后5行或个
-B 5 过滤出内容行显示前5行或个
-C 5 #过滤出内容行并显示前后各5 行
-E 使用正则表达式高级功能时使用,如?其余符号如^ $ . *可以不添加-E也能识别;等同egrep
-c xxx 统计关键字xxx出现次数
-o xxx #只显示字符 xxx,本行别的字符不显示;只要xxx存在,只显示xxx
-q xx #不显示查找到的内容,配合$?使用
-f file1 file2 #以file1的内容为条件来逐行过滤file2
-r #递归处理目录内内容,但不处理软连接
-R #递归并处理软连接指向的内容
示例:
grep -c processor /proc/cpuinfo #显示当前主机cpu核数
grep -v "#" /etc/bashrc #不显示文件 /etc/bashrc中含#的行;
grep -r ansible.cfg /etc/* #递归在/etc/所有文件中搜索ansible配置文件
3、printf
4、grep配合正则表达式
正则表达式:(匹配文本内容中的字符串)
通用技术,其他的编程语言的win系统也支持,并非linux特有的;分为基本正则表达式和扩展正则表达式
一般正则表达式需要用 "正则表达式 " 或 ' 正则表达式 ' ;
基本正则表达式在出现() {} | 这3个符号时使用 \ 进行转义
扩展的正则表达式 grep -E或egrep 来使用() {} | 这3个符号时可以省略“\”,不需要转义;
基本的正则表达式:
元字符:
* . ^ $ ? 通常配合grep来匹配文本内某些行内容;
^ $ #表示开头和结尾
. #任意一个字符、文字(也可以代表空,除了\n换行符);若放在[ ]内,仅表示符号. 无其他意义;
* #上一个字符连续重复任意次(0到无数次);"goo*gle"
.* #表示任意长度、任意字符; "goo.*gle"
n\? #上一个字符n出现0次或1次; "goo\?gle" ; 扩展的正则表达式 匹配次数可省略“\”;
n\+ #上一个字符n至少出现1次及以上; "goo\+gle" ; 扩展的正则表达式匹配次数可 省略“\”;
n\{8\} #上一个字符n出现8次; "goo\{8\}gle"; 扩展的正则表达式匹配次数可 省略“\”;
n\{1,3\} #上一个字符n出现1到3次; 扩展的正则表达式匹配次数可 省略“\”;
"[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\" #表示IPv4地址; 扩展的正则表达式 匹配次数可省略“\”;
[#$] #表示普通字符#$中的任意一个,[]中的元字符只表示普通字符
字母、数字、下划线都属于单词;其余字符都能分隔单词
^n 以n这个字符开头的行
n$ 以n这个字符结束的行
^$ 表示空行
^[[:blank:]]$ #表示空白行
\xxx 或 等同 \bxxx #表示以xxx开头的单词;"\
xxx\> 或 等同 xxx\b #表示以xxx结尾的单词; "google\>" ;
\xxx\> #表示单词xxx; "\\>" ; 等同 \bxxx\b
表达式1\|表达式2 # 表示表达式间的或关系,字符也可以;即a或者b "^#\|^$" ;扩展的正则表达式 省略“\”;
(abc) #单词abc作为一个整体,需要配合其他内容使用;
"(abc)\{2\}(ef)" #即 abc重复2次,即abcabcef;
反向引用:表达式内出现一个或多个()时;可以用\0,\1,\2...依次代表之前的 第1个 第2个 ...()内的内容;
如:grep -E "(ha{3}) hello \1" 即:grep “haaa hello haaa”
[xy] #[]内的任意一个字符
[^xy] #除了[]里的任意单个字符
[:lower:] #任意一个小写字母,使用示例:[[:lower:]]
[:upper:] #任意一个大写字母
[:alpha:] #任意一个大写或小写字母
[:alnum:] #任意一个数字
[:blank:] #空白字符
[:space:] #包括空格、制表符(水平和垂直)、换行符、回车...
[:cntrl:] #不可打印的控制字符(退格、删除、警铃....)
[:difit:] #十进制数字
[:xdifit:] #十六进制数字
[:print:] #可打印字符
[:graph:] #可打印的非空白字符
[:punct:] #标点符号
不常用:
\s #匹配任何非空白字符,包括空格、制表符、换页符等。等价[\f\r\t\v]。注意unicode正则表达式会匹配全角空格符
\S #匹配任何非空白字符。等价[^\f\t\t\v]
\w #匹配一个字母、数字、下划线、汉字、其他国家的文字字符。等价[_p:alnum:]字符]
\W #匹配一个非字母、数字、下划线、汉字、其他国家的文字字符。等价[^_[:alnum:]字符]
s/(a)(b)(c)/\2/ #后向引用;配合sed查找到abc,然后只显示第2个()内的内容,即b
^[0-9]*$ 数字
^\d{n}$ n位的数字
^\d{n,}$ 至少n位的数字
^\d{m,n}$ m-n位的数字
^(0|[1-9][0-9]*)$ 零和非零开头的数字
示例:
grep -v '^#\|#' /etc/bashrc #表示先过滤文件/etc/bashrc中的注释行和含#的行;再反向选择输出其余的行
grep -v '^#\|^$' /etc/bashrc #表示先过滤文件/etc/bashrc中的注释行和空行;再反向选择输出其余的行
grep '(ab)\{3}' /etc/bashrc #表示过滤文件 /etc/bashrc中的含ababab的行
六、shell脚本
1、shell变量
linux系统内置变量:PS1,PATH,SHELL,UID,$$,HOSTNAME,$?,HISTSIZE,PPID,BASHPID
$? #系统自带变量,表示上一个命令返回值0-255;0表示上条命令执行成功,1-255都表示失败;用来判断上条命令执行结果;
$$ #将始终返回与脚本关联的第一个进程 ID
$BASHPID #将显示当前 bash 的进程 ID
$PS1 #表示提示窗口 [root@Rocky8 ~]#
$PPID #表示当前进程的父进程ID
shell中指定$?变量值:
exit 200 #直接在shell中一个单独行添加行;指定状态变量$?的返回结果是200,并且后续命令不在执行,直接退出shell;
变量数据类型(shell不区分):
字符:
数值:整型、浮点型,bash不支持浮点数
变量命名要求:
区分大小写;
不要使用程序中的保留字和内置变量;如:if,for;
只能使用数字、字母及下划线(单词的组成);且不支持“-”;
变量命名习惯:
见名知意,以英文单词命名,体现出实际作用;
变量名大写;
局部变量小写
函数名小写;
大驼峰StudentFirstName:由多个单词组成,每个单词首字母大写,其余小写;
小驼峰studentFirstName:由多个单词组成,从第二个单词开始首字母大写,其余小写;
下划线:student_name
变量的定义和引用:
创建普通变量: NAME=12 ; NAME="12" ;USER=`whoami` ;ALL=$NAME$USER ; ALL="$NAME$USER"
调用变量:echo $NAME ;echo ${NAME} ;
取消普通变量:unset NAME1 NAME2 ... ;
临时变量只能在当前bash下使用,退出或切换bash临时变量失效(查看当前bash编号:echo $BASHPID);
在环境变量配置文件:/etc/profile /etc/profile.d/ ~/.bash_profile ; /etc/bashrc ~/.bashrc 下的变量不会随shell退出而失效
变量的内容:
可以使普通字符;可以用"字符"包围起来
也可以是其他变量;注意,2个变量名中间间隔符不能是_
也可以是命令执行结果;需要用 `command` 格式包围起来
变量分类:
普通变量只能在当期shell下使用;例:()内的临时shell中的变量执行完就失效;
环境变量可以在当前shell的所有子bash下使用;
本地变量只能在当前shell进程中某段代码片段中(通常指函数)生效
环境变量位置:
/etc/profile #对所有用户生效
/etc/profile.d/*.sh #对所有用户生效
/etc/bashrc #对所有用户生效
~/.bash_profile #对特定用户生效
~/.bashrc #对特定用户生效
profile :放一些定义的环境变量;运行的命令或脚本
bashrc :别名和函数;定义本地变量
临时创建环境变量:
export NAME=12
declare -x NAME=12
查看环境变量:
env
declare -x
export
printenv
只读变量(常量):如UID
查看只读变量:readonly -p ;declare -r
只能创建和删除,不能再次编辑;退出bash后失效;
创建只读变量: readonly NAME=12 ; declare -r NAME=12 ;
位置变量:
$1 $2 $3....${10}...${n} #依次表示执行脚本时后面跟的第1个,第2,第3,第10。。。第n个参数
$0 #表示脚本名称
$# #表示输入的位置变量数量
$* #表示所有参数;只有被" "引用时才和$@ 有差异,此时所有参数是一个整体的字符串;
$@ #表示所有参数;只有被" "引用时才和$* 有差异,此时所有参数都是独立的字符串;
set -- #清空所有位置变量
2、shell脚本:鸡兔同笼
30鸡和兔的头,80鸡和兔的脚,分别有几只鸡,几只兔?
[root@rocky ~]# ./chicken_rubbit.sh 30 80
the number of chicken: 10
the number of rubbit: 20
3、shell脚本:for循环
七、硬盘
硬盘存储术语 head:磁头 track:磁道 cylinder: 柱面; sector: 扇区,512bytes
八、分区结构差异
1、MBR
MBR分区:
0磁道0扇区512bytes:boot loader-444bytes;分区表-64bytes,每个分区需要16bytes来标识;结束标识:0x55 0xAA占2bytes。3个主分区+扩展分区(扩展分区内可分为多个逻辑分区);单分区最大2TB
GPT分区:
2、GPT
UEFI硬件支持GPT;可分为1024主分区+扩展分区;单分区最大18EB
支持128个分区,
九、分区操作、文件系统、swap操作
1、分区
分区的扇区soctor必须是连续的
查看:
fdisk -l #查看所有分区情况;如disklabel type、
fdisk -l /dev/sda #可查看某个分区或硬盘的使用情况
hexdump -Cn 512 /dev/sda #查看物理盘sda的前512Byte
备份mbr分区表:dd if=/dev/sda of=/back/mbr bs=1 count=64 skip=446 #备份sda的mbr至/back/mbr,跳过源文件of的前446B,每次执行1B,执行64次;seek是跳过目标文件of的bs次数
MBR分区:
(若分区数量大于4,可以先创建3个主分区,再创建一个扩展分区,再在扩展分区内分逻辑分区;或直接全分为扩展分区,再分逻辑分区)
fdisk /dev/sda txt &>>/dev/nill #按照txt内容自动分区,输出结果不在终端显示 (txt内为:n p +20G w q 回车 。。。)
fdisk /dev/sda #手动分区
p #查看当前分区
n #创建分区(前0-2047扇区共1MB保留,用来保证后续可以转换为GPT分区格式;创建分区所使用的扇区必须连续的)
p #创建主分区(最多只能创建4个主分区;若分区要4个,需要3个主分区,第四个为扩展分区,扩展分区内创建逻辑分区)
e #创建扩展分区(将除了前3个主分区外的所有空间都分给扩展分区,然后才能再p创建逻辑分区;也可先创建extend扩展分区,然后将全部创建逻辑分区。逻辑分区分区号从5开始;而且逻辑分区如6被删除,sdc7会变成sdc6,后面的都会前移,主分区不会变)
t #更改分区类型;8e 为lvm;82 为swap...
d #删除分区;
w #保存修改,立即生效;修改完要保存
q #退出不保存
GPT分区:
操作命令为gdisk /dev/sdb ;其余内容差不多;w保存后生效
parted高级分区:(实时生效)
1>格式: parted (磁盘)mkpart (分区格式gpt/msdos)
parted /dev/sdb mklabel gpt #/dev/sdb进行分区,分区格式为gpt 。也可按需要改为msdos(mbr)
2>格式: parted (磁盘)mkpart (分区类型一般都选primary) (开始) (结束)
parted /dev/sdb mkpart primary 0% 100% #创建分区为主分区,大小为全部。
或 parted /dev/sdb mkpart primary 1 100% # 默认单位为M,也可分多个区,大小可以用百分比,也可以用G、T调整。(第0M保留分区信息)
删除分区:
parted /dev/sdb rm 1 #删除分区1
查看:
parted -l #列出分区信息;也能看到mbr分区,但是label显示unknow;
刷新:
cat /proc/partitions #查看内核是否已识别新的分区
partprobe -s #重新设置内存中的内核分区表版本(一般是系统盘分区后,需要刷新分区表)
2、格式化
linux分区格式化后就会生成文件系统,格式化过程相当于对分区创建文件系统。会预留5%给root使用。
格式化过程:
立即划分一部分空间作为idode空间(元数据),若inode被使用完,即使BLOCK空间有剩余也不能再使用
将剩下的空间划分为block,每个block包含多个扇区,管理粒度更大,读取次数降低、效率提高。但block太大会造成空间浪费
mkfs.ext4 /dev/sda1 #将sda1分区格式化为ext4格式
-b 4094 #指定block块大小4094,即4M
mkfs.xfs /dev/sda2 #将sda2分区格式化为xfs格式
- i 8192 #每8KB空间分配一个inode(参考,自己分区xfs文件系统按照2k一个idnode)
-N 3000000 #当前分区一共创建3000000个indoe
此时,格式化完成的分区会生成唯一的SSID;block大小和inode数量,这些格式化完成后就不能再 需改
blkid /dev/sda1 #查看分区的UUID、TYPE、等信息
查看ext4文件系统信息
tune2fs -l /dev/sda1 #查看ext4文件系统分区 /dev/sda1的详细参数信息
dumpe2fs /dev/sda1 #查看ext4文件系统分区分组(将文件系统分为若干个block group,每个group组都有super block、GDT 、block bitmap、indoe bitmap、inode table、date blocks(真实的数据块))
如:
du #只能看到文件的date blocks大小,删除文件后,立即释放空间
df #能看到date blocks、super blick、等的占用空间;删除文件后,若文件正在使用,不会立即释放空间
查看xfs文件系统信息
xfs_info /dev/sda2 #查看xfs文件系统/dev/sda2的参数信息
文件系统修复
先解除挂载,再修复文件系统,只能修复文件系统
e2fsck /dev/sda1 #修复ext系列文件系统 /dev/sda1
-y #自动回答为yes
-f #强制修复
-p #自动进行安全的修复文件系统问题
xfs_repair
-f #修复文件而非设备
-n #只检查
-d #允许修复只读的挂载设备,在单用户下修复/根时使用,然后立即reboot
3、挂载
格式化后的文件系统需要挂载到系统目录下才能进行读写使用。
同一个设备可以同时挂在到多个文件;
同一个挂载点同时只能有一个设备被挂载;
临时挂载,重启后失效:
mount -t 文件系统 分区路径 挂载点路径 #文件系统若是linux原生文件系统,在不需要-t 指定;
mount /dev/sda1 /mnt #临时将sda1挂载到mnt目录
unount /mnt #取消分区挂载,或挂载点
注意:正在使用的文件系统是不能解除挂载的
fuser -v /date/mysql #查看当前哪个用户、进程在使用挂载点/date/mysql
fuser -km /date/mysql #踢掉对文件挂载点date/mysql的所有访问,包括自己
mount #列出所有挂载信息
查看:
df -h #查看挂载点空间信息,大小转换率1024
df -H #查看挂载点空间信息,大小转换率1000
df -i #查看挂载点inode信息,iNode使用情况
永久挂载:
将挂载信息写入/etc/fatab,建议使用UUID,盘符可能会飘,其内容如下:
/dev/sda1 / xfs defaults 0 0
第一列:文件系统所在分区路径(也可以是UUID)
第二列:文件系统的挂载点
第三列:文件系统的类型,如xfs、ext4 。。。
第四列:挂载参数,默认用defaults;defaults,_netdev表示在网络启动后挂载,在关闭网络前卸载,用于网络存储、vdo.....;ro 只读,
第五列:转储频率;0 不做分区备份(常用) ;1 每天转储;2 隔天转储
第六列:fsck检查的文件系统顺序;0 不自检(常用);1 优先自检,一般rootfs使用;2 非rootfs使用;
ls /dev/disk/by-uuid/ -l # 查看UUID:
修改完/etc/fstab后,使用下面命令:
mount -a #将fstab中未挂载的文件挂载,保证fstab立即生效
光盘:/dev/cr0; 光盘也需要挂载才能访问
u盘:lsblk #查看新增的U盘名称,再挂载
4、swap操作
swap:使用硬盘空间模拟内存,当内存空间不足时当做内存使用。swap可以直接类似lvm灵活扩容
/proc/sys/vm/swappiness #物理内存剩余空间量为%多少时,开始使用swap;为0则物理内存使用完再用swap
free -h #查看内存使用情况
fisk分区-swap格式化-swapon挂载
格式化:
mkswap /dev/sdb1 #将分区后的分区格式化为swap格式
挂载:
将挂载信息输入/etc/fstab,
格式:/dev/mapper/xxx none swap defaults 0 0
然后执行下面命令挂载或者重启
swapon -a #根据fstab内的所有swap分区内容挂载
取消swap,先修改/etc/fstab文件,或在swap挂在信息前加#,在按下面命令执行
swap -s #查看哪个设备作为swap使用
swapoff -a #根据fstab内的所有swap分区内容卸载
swapon /dev/sdb1 #将swap挂载
将文件作为swap:
dd if=/dev/zero of= /swapfile bs=1M count=1024
mkswap /swapfile
chmod 600 /swapfile
vim /fstab ;使用名称挂载 /swapfile none swap defaults 0 0
十、raid差异
RAID0:读写性能都提高,性能最好;读写时都进行并行处理,但没有冗余能力;数据分成若干份chunk分布到不同盘;
raid1:读性能提高写;写不变;数据有镜像的2份,能防止硬盘损坏造成的损失;有效空间为50%;
raid5:读写性能提升;通过将数据分为若干份和校验,数据能恢复;只能允许一块盘故障;有效空间(n-1)/n;RAID5校验数据均匀分布在n块盘上;raid4校验数据集中在一块盘上,这块盘故障率很高,已被淘汰
raid10:读写性能提升;2块盘先做raid1,再将2个raid1做成raid0;安全性比raid10高;有效空间为50%;
raid01:读写性能提升;2块盘先做raid0,再将2个raid1做成raid1;安全性比raid10低;有效空间为50%;
JBOD:将多块盘看成一块盘使用,没有冗余型,没有性能提升
十一、lvm操作
顺序:PV-VG-LV
pv
pvs #简单查看所有pv
pvdisplay /dev/sda #显示pv中某个物理设备信息
创建
pvcreate /dev/sda #将硬盘sda创建为物理卷(硬盘或分区都可;但分区需要修改分区ID和TYPE类型,fdisk 中使用t修改)
删除
pvremove /dev/sda #从pv中删除硬盘sda
vg
vgs #简单查看vg
vgdisplay #查看vg详细信息
创建
vgcreate vg1 /dev/sda -s 8M #将分区或硬盘加入vg1,此时在/dev/下生成vg1,同时指定pe大小为8M(硬盘或者分区必须属于pv;否则os会自动将分区和硬盘加入pv)
扩容
vgextend vg2 /dev/sdb #扩容sdb硬盘至vg2(可以使硬盘或者分区;分区要先修改ID和TYPE ,fdisk命令t修改)
删除
vgremove vg1 #删除vg1;但必须先删除vg1上的lv逻辑卷
缩容
vgreduce vg2 /dev/sdb #缩容vg2,sdb硬盘移出vf2(慎重)
lv
lvs #简单查看lvm
lvdisplay #查看lvm详细信息
创建
lvcreate -n lv-1 -L 2G vg2 #使用vg2创建lv-1,大小2G;使用的vg是vg2;
-l 45 #是指定空间大小为使用45个PE块;PE数量*PE大小=lvm大小
mkfs.xfs /dev/xx/lv-1 #格式化lv1为xfs格式再挂载就可以使用了,使用绝对路径。lvs查看lvm卷名字看绝对路径
扩容
lvextend /dev/vg2/lv1 -L +1G #扩容lv1逻辑卷大小扩容为1G;此时lsblk 查看块大小能看到,但df -h查看文件系统大小未更新
lvextend -r -l +100%free lvname #扩容lv1逻辑卷为vg所有空间,并自动更新文件系统大小,不需要使用下面的更新命令
更新文件系统
resize2fs /dev/vg2/lv01 #ext4文件系统刷新/dev/vg2/lv01,新扩容的1G就可以识别到;
xfs_growfs /mountpoint/xxx #xfs文件系统只能更新挂载点,才能识别到xfs文件系统的扩容空间
删除(先取消挂载)
lvremove /dev/vg2/lv1 #删除lv1,必须用绝对路径
缩容(移除硬盘)
lvreduce -L 8G -r /dev/xxx/lv01 #缩容lvm至8G,并更新文件系统;只支持ext系列,不支持xfs缩容,有大风险
lvm卷硬盘更换
首先要保障lvm剩余可用空间大小>需要更换硬盘sdc;不足需要先扩容lvm
pvmove /dev/sdc #将sdc盘的数据移动到lvm中的其余盘上
vgreduce vg1 /dev/sdc #先将sdc从对应的vg中移除
pvremove /dev/sdc #再从pv中移除sdc盘