目录
1.Linux文件系统
1.1存储结构
linux文件的存储方式为
- inode:记录文件的属性(权限,大小,拥有者,时间),并且记录该文件在数据区分配的数据区的区块号
- 数据区块:记录真正的数据,大文件占用多个区块
- 超级区块:记录文件系统整体信息,inode与数据区的总量、使用量
目录也是一样的也有inode,但是目录数据区的内容如下
所以文件的名字是存在目录中的,inode本生不记录文件名。
使用ls命令时加上-i可查看文件和目录对应的inode
1.2挂载点
每个文件系统都有独立的inode、区块、超级区块等信息,把文件系统与目录树结合称为【挂载】,挂载点是个目录,通过该目录即可访问该文件系统。
输出ls -lid / /root /home命令,因为他们都是独立的文件系统挂载点,所以inode可以一样,且xfs文件最顶层的目录一般为64和128号,所以这三个挂载点的inode相同。
建立硬连接(cp -l)时,两个文件的inode是一样的,所以改动任意一处硬连接的数据,所有的内容都改动
1.3查看磁盘使用情况
- df [文件或目录]:列出文件系统的整体磁盘使用量
- df -h:以GB、MB、KB等格式进行显示
- df -i:不同磁盘容量显示,而是显示inode的数量
- df -h test:显示test文件所在文件系统的使用情况
- du:查看文件系统的磁盘使用量(查看目录下文件的使用情况)
- -h:同上
- du -s:仅列出所用容量,我们可以用来统计当前目录下所占用情况,使用ls是显示的指定该目录所占容量,而不包括下面的所有文件。
- du -a:列出所有的文件与目录容量,因为默认只统计目录下面的文件量
1.4硬连接和符号连接
硬连接的本质就是一个数据区对应了多个文件,这多个文件的inode都指向该数据区的内容。
所以你删除一个硬连接,真正的内容不会被删除,另外一个硬连接还是可以正常访问的,但是硬连接不能跨文件系统,这点很好理解。
符号链接就是个快捷方式,当源文件被删除了符号链接就打不开了。由符号链接建立的文件会创建它独有的inode和数据区。
- ln:源文件 目标文件:创建一个硬连接
- ln -s:建立符号连接
2.磁盘操作
2.1查看磁盘分区情况
- lsblk [磁盘文件]:列出系统上所有的磁盘列表
- lsblk -f:同时列出对应的文件系统和uuid
- parted [磁盘文件] print:列出磁盘的分区表类型和分区信息
2.2磁盘分区
- MBR分区表使用fdisk命令分区,GPT使用gdisk命令。使用步骤
- mkfs.[文件系统] 设备名称:创建文件系统
- mkfs.xfs /dev/sdb1 :格式化/dev/sdb1为xfs文件系统
- mount [设备] [挂载的目录] :挂载文件系统
- 永久挂载需要修改/etc/fstab
/etc/fstab中的条目为:
[设备/UUID等] [挂载点] [文件系统] [文件系统参数] [dump?] [fsck?]
后面4个直接写默认的即可。
3.压缩与打包
tar打包文件(无压缩),压缩只能针对文件不能是目录,所以需要使用tar命令把多个文件打包为一个文件进行压缩;为了方便一般使用打包+压缩的方式,后缀为 *.tar.gz等等,Linux压缩方式有很多种,通过规范后缀名来识别文件是用的哪种压缩方式。
3.1gzip
gzip应用最广,后缀为*.gz。
gzip [参数] 文件名
- -d:解压缩,也可以单纯使用gzip的解压缩命令gunzip命令进行解压缩
- -v:显示压缩的详细信息
- -#:#为1-9的数字,表示压缩等级,1速度快,但是压缩比最差,9最慢,但是压缩比最好。默认6
压缩后原始文件不保留,生成一个.gz的文件。
3.2bzip2
升级版的gzip,压缩比更高了,后缀名为.bz2。
bizp2 [参数] 文件名
- -d:解压缩,或者用bunzip2命令代替
- -v:显示压缩的详细信息,压缩比
- -k:保留原始文件
- -#:与gzip相同
3.3xz
压缩比更高了,但是压缩的时间较长,用法一模一样,后缀为.xz。
xz [参数] 文件名
解压缩为unxz
3.4tar打包
打包命令,生成的后缀为.tar文件。
①:这三个参数只能出现一个
- -c:打包
- -x:解包
- -t:查看打包文件的内容含义哪些文件名
②:打包并且压缩的参数,这三个参数最多只能出现一个
- -z:通过gzip的支持进行压缩/解压缩;文件名最好为*.tar.gz
- -j:通过bzip2的支持进行压缩/解压缩;文件名最好为*.tar.bz2
- -J:通过xz的支持进行压缩/解压缩;文件名最好为*.tar.xz
其他参数:
- -v:压缩/解压缩的过程中显示详细信息
- -f [filename]:-f后面要立刻接文件名,不能把-f参数放在前面,建议单独分出来
- -C 目录:用于在特点目录进行解压缩
tar命令不像压缩命令一样;tar需要自行指定文件名,且我们不要乱取名。
示例:
单纯的打包操作,不压缩:
tar -cv -f test.tar aa.txt bb:将aa.txt文件和bb目录打包为test.tar包
tar -xv -f test.tar:将test.tar包解包出来,解到当前路径下
tar -xv -f test.tar -C /etc:将test.tar解包到/etc下
打包并压缩:
tar -zcvf t.tar.gz aa.txt bb:将aa.txt文件和bb目录打包为一个文件并且使用gzip进行压缩(bzip2使用-j)
tar -zxvf t.tar.gz :使用gzip解压缩并且解包。
只有根据包的名称知道是用何种解压缩方式,又或者是没有压缩,所以后缀是十分重要的。
从上述的规律看出,我们只需要记住:
打包使用-cvf,解包使用-xvf即可,如有压缩的情况只需记住常用的-z(gzip)、-j(bzip2)即可
4.账号管理和ACL权限设置
4.1用户管理
/etc/shadow文件示例:bin:*:18353:0:99999:7:::
每一栏的作用分别为:①账号名称、②密码、③最近修改密码日期、④密码不可被修改日期、⑤密码需要重新修改的天数、⑥密码需要修改期限前的警告天数、⑦密码过期后的宽限天数、⑧账号失效日期、⑨保留
上面的日期都是1970.1.1的间隔天数,可以使用下面的查看某日期到1970的天数
echo $(($(date -d "2015/05/04" +%s)/86400+1))
反过来查看相隔天数的日期date -d "1970/01/01 17932 days"
- groups:查看当前用户所在的组,第一个显示的是初始用户组,其他的为有效用户组
- newgrp:切换初始用户组,当前用户必须在该组内
- useradd:添加新的用户,添加好后需要passwd修改密码
- -u:指定uid
- -d:指定用户的家目录,目录不存在自动创建
- -g:指定用户的初始用户组,默认组名和用户名同名
- -G:可以指定该用户的有效用户组
- -s:指定shell文件
- -r:创建一个系统账号
- -D:查看useradd的默认值,该值存在于/etc/default/useradd文件中
文件①/etc/default/useradd
# useradd defaults file
GROUP=100 //默认用户组,已弃用
HOME=/home //家目录的基准目录
INACTIVE=-1 //密码失效后的宽限日期,-1永不过期,0表示密码过期后立即失效(建议值)
EXPIRE= //密码失效时间,这些日期都是距离1970年1月1日的天数
SHELL=/bin/bash //默认shell
SKEL=/etc/skel //用户家目录的模板
CREATE_MAIL_SPOOL=yes //建立用户的邮箱,默认在/var/spool/mail下
文件②/etc/login.defs
MAIL_DIR /var/spool/mail //默认邮箱的放置目录
PASS_MAX_DAYS 99999 //多久需要修改密码的天数,/etc/shadow的第5栏
PASS_MIN_DAYS 0 //多久不可重新设置密码,0随时修改,/etc/shadow的第4栏
PASS_MIN_LEN 5 //密码最短的字符长度,已经废弃
PASS_WARN_AGE 7 //密码失效前多少天提示用户,/etc/shadow的第6栏
UID_MIN 1000 //使用者最小uid
UID_MAX 60000 //最大uid
SYS_UID_MIN 201 //系统账号的最小uid
SYS_UID_MAX 999 //系统账号最大uid
GID_MIN 1000 //用户自定义用户组的最小gid
GID_MAX 60000 //最大gid
SYS_GID_MIN 201 //同上
SYS_GID_MAX 999
CREATE_HOME yes //是否主动建立用户家目录
UMASK 077 //家目录的权限
USERGROUPS_ENAB yes //userdel删除用户时,是否删除初始用户组,前提是改组没有其他人
ENCRYPT_METHOD SHA512 //密码的加密
- passwd:修改密码,root可以修改所有人的密码,使用 passwd 用户名
- --stdin:通过管道的数据作为密码
- -l:lock该用户,即将/etc/shadow的第二栏前面加上!使密码失效
- u:unlock
- -S:列出密码相关参数
- -n:后面接天数,shadow的第4栏,多久不可修改密码的天数
- -x::shadow的第5栏,多久内必须修改密码
- -w:shadow第6栏,密码过期的警告天数
- -i:密码失效日期,shadow第7栏
- -e:使用户的密码失效,下次登录时必须修改密码
- -d:是账号无口令
- chage:同passwd功能差不多,修改shadow文件
- -l:查看详细密码参数
- -d:修改shadow第3栏,最近一次修改密码的日期,设置为0可强制使用户下次登录重设密码
- -m:第4栏,密码最短保留天数
- -M:第5栏,密码多久需要重新修改
- -W:第6栏,密码过期前警告天数
- -I:第7栏,密码失效日期inactive
- -E:第8栏,账号失效日
- userdel:删除用户
- -r:连同家目录一起删除,删除前最好find / -username查出该用户的文件,将其手动删除
- usermod:修改用户账号,就是根据实际情况更改用户的有关属性,修改文件
- -c:账号的说明,即paswd第5栏
- -d:修改家目录,passwd第6栏
- -e:shadow第8栏,账号失效日
- -g:修改初始用户组,passwd的第4栏,同newgrp
- -G:修改用户支持的用户组,即修改/etc/group
- -a:与-G合用,添加用户组,而不是-G默认的替换,如usermod -a -G wheel lxc
- -l:修改账号名称,passwd的第1栏
- -s:修改shell
- -u:设置uid,passwd第3栏
- -L:锁定
- -U:解锁
前面的useradd、usermod、userdel只能root使用
- id:查看本用户的相关的uid/gid等信息,root用户可以查看别的用户信息
- chsh:修改当前用户的shell文件
4.2组管理
主要是管理/etc/group和/etc/gshadow两个文件。
/etc/group文件示例:lxc:x:1001: ①组名、②密码、③gid、④组内的成员,用逗号分隔
/etc/gshadow文件示例:lxc:!:: ①组名、②密码,!表示没有密码,也表示没有用户组管理员、③用户组管理员的账号、④组内的成员,和group文件相同
- groupadd:添加组
- -g:特定的gid
- -r:建立系统用户组
- groupmod:修改group相关参数
- -g:修改gid
- -n:修改名称
- groupdel:删除组,不能删除用户的初始用户组,如果能删也要确认一下
- gpasswd:用户组管理员功能,组管理员的功能是管理一个组的成员,可以管理用户加入/移除该用户组
- ①root做的操作有:
- gpasswd groupname:设置组的密码
- gpasswd -A user1,user2…… groupname:将-A后面参数的用户变为group的组管理员
- gpasswd -r groupname:删除该组的密码
- gpasswd -R:让组密码栏失效
- gpasswd -M user1,user2…… groupname:将用户加入到这个组中
- ②组管理员可以执行的操作有:
- gpasswd -a user groupname:将用户加入到这个组
- gpasswd -d user groupname:将用户从这个组删除
4.3ACL权限管理
setfacl 选项 文件名:设定ACL权限
- -m:添加后面的acl参数给文件/目录,不可与-x合用
- -x:删除后面的acl参数
- -b:删除所有acl设置参数
- -k:删除默认的acl参数
- -R:递归设置子目录
- -d:设置默认acl参数,只对目录有效,在该目录新建的数据会引用此默认值
①针对特定用户使用【u:用户账号:权限】:setfacl -m u:lxcc:rx aa.txt。特别的如果用户账号为空代表文件拥有者。
②针对特定组使用【g:用户组名:权限】:setfacl -m g:lxc1:rw aa.txt 。同上,如果为空代表本组
③针对有效权限设置使用【m:权限】:即getfacl中的mask,用户或用户组所设置的权限必须在mask范围内存在,否则的话也不能生效。
getfacl 文件名:查看acl等信息
目录的ACL的权限默认不会继承到它的子目录或文件,如果想让子目录/文件都继承的话需要使用默认权限设置:d:[u|g:[user|group]:权限],就是在前面加上一个额外的d,即可实现继承,和-R的区别就是,新建的文件也会自动继承。
4.4用户身份切换
su [-] [选项] [username]:身份切换命令,省略username就是切换root用户;如果中间加上-的话,就是以login shell进行登录,不加是以nologin shell启动,且当前很多环境是不会变的,所以最好加上-
- -c:仅进行一次命令,后面接对应的命令,如su - -c "cat /etc/shadow" root,使用root身份临时查看shadow文件,需要先输入root的密码
sudo:允许一个已授权用户以超级用户或者其它用户的角色运行一个命令,而无需root的密码
- -u:后面接预切换的用户,若无此项默认切换身份为root
- -b:将命令放到后台执行
- -l:查看当前用户能给sudo的命令
如sudo -u sshd touch /tmp/hi,用系统用户sshd的身份创建一个文件,该文件的拥有者是sshd
只有/etc/sudoers文件中指定的用户才能运行sudo这个命令,只需输入自己的密码即可开始执行
visudo:修改/etc/sudoers文件提供的命令,不建议直接vim修改。
如何修改sudoers文件?基本语法为: 使用者账号 登录者的来源主机=(可切换的身份) 可执行的命令
如root ALL=(ALL) ALL :代表root用户可使用sudo,且来源主机可以是任何主机,可以切换任何人的身份去执行任何命令。
①某个用户可使用root所有命令
增加 lxc ALL=(ALL) ALL
②利用组批量设置
centos7默认sudoers里就有这么一行:%wheel ALL=(ALL) ALL,其中前面的%,代表是一个组,wheel是组名,表示只要是这个组的用户都能够执行sudo命令切换身份,执行任何操作。
③无需密码的设置
只需在按照lxc ALL=(ALL) NOPASSWD:ALL,就表示sudo切换身份时lxc不用输入自己的密码。
④有限制的命令操作
上面的设置可以让用户能做任何事,包括修改root的密码,不太好,我们需要加以限制。
如 lxc ALL=(root) /usr/bin/passwd ,就是让lxc用户仅能够切换root,执行passwd命令,注意这里的可执行命令这一栏一定要填绝对路径,否则报错。
上面的操作并不能解决lxc能够修改root密码的问题,lxc依然能够使用 sudo passwd修改,可以使用 lxc ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root 修改解决该问题,即lxc用户只能sudo切换为root,且不能修改root的密码
其中可以支持正则表达式,!的作用是不允许执行。 多个命令中间必须有空格。
⑤通过变量设置
前面的都是单个用户或组的设置,也可以通过变量方式设置,就是将多个用户一起定义为一个变量,如mywork,然后myworl ALL=(ALL) xxx,来减少工作量。不一定是多个用户一个变量也可以是多个操作一个变量。
⑥sudo搭配su
可以设置一些用户可以执行的命令为 su - ,即允许他们登入管理员账号。
4.5用户信息传递
- w、who:查询目前已登录在系统的用户
- lastlog:查询每个账号最近登录的日期,调用/var/log/lastlog文件
- last:查询系统最近登录的信息
- write:用户对谈,使用 write 对方账号 [使用者所在的终端界面],ctrl+d结束输入
- mesg:查看当前用户是否接收信息
- n:不接受任何信息,如mesg n,当前用户就不会接收任何信息,除了root发送的
- y:接收信息
- wall:向系统上的所有在线用户发送信息
- mail:发送邮件,格式为【mail -s"邮件标题" 用户账号@localhost】,再输入邮件内容,最后以一个 . 结束;除了命令行输入内容外,还可以使用<重定向文件作为内容,如mial -s "hello" root@localhost < /root/a.txt。
- 接受者使用mail命令查看邮件,输入邮件的编号即可查看,按?显示所有可操作的按键