- Linux基础部分(上)
- 一、Linux命令行
- 二、文件管理
- 三、文件基本属性与文件查找
- 四、用户权限管理
- 五、文件权限管理
- 六、进程管理
- 七、存储管理
Linux基础部分(上)
一、Linux命令行
1、初识shell
虽然我们已经安装好了系统,但是光会安装不会操作是不够的。我们还要像玩手机一样熟悉并记忆操作方法。
shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。实际上shell是一个命令解释器,它解释用户输入的命令并且把用户的意图传达给内核。(可以理解为用户与内核之间的翻译官角色)
我们可以使用shell实现对Linux系统的大部分管理,例如:
- 文件管理
- 用户管理
- 权限管理
- 磁盘管理
- 软件管理
- 网络管理
- ....
使用shell的两种方式
- 交互式命令行
- 默认等待用户输入命令,输入一行回车后执行一行命令
- 效率低 适合少量的工作
- shell脚本
- 将需要执行的命令和逻辑判断语句都写入一个文件中,一起运行
- 效率高 适合完成复杂,重复性工作
2、bash shell提示符
登录Linux系统之后,默认进入交互式的命令行界面,在光标前边会出现提示符
[root@localhost ~]#
[用户名@主机名 目录名]权限标识
- 用户名
- 当前登录的用户
- 主机名
- 当前这台主机的名字,默认叫
localhost
- 目录名
- 当前光标所在的目录
- 当前用户家目录表示成
~
- 权限标识
- 超级管理员权限就表示为
#
- 普通用户标识为
$
这个提示符格式被$PS1
控制,我们可以查看这个变量
[root@localhost ~]# echo $PS1
[\u@\h \W]\$
# \u表示是用户名 \h表示的是主机名 \W表示的当前所在目录 \$是权限标识
[root@localhost ~]# export PS1="{\u@\h}\W \$"
{root@localhost}~ $
# 可以通过export命令修改PS1变量,让提示符可以根据你的习惯变化
3、shell语法
命令 选项 参数
[root@localhost ~]# cal --year -m 2020
- 命令
cal
是命令,用于查看日历- 选项
--year
是选项,表示显示一整年,这个是一个长选项,也就是单词都拼全了,需要两条-
符号-m
是短选项,是首字母,表示每个星期的星期一作为第一天- 对于有些命令而言,可以不写选项,这样命令会有个默认的行为
- 短选项可以多个合并在一起,比如上面的命令可以写成
-ym
其中y是year简写,可以和m写在一起,而长选项不支持写在一起 - 参数
2020
是参数,参数是命令作用的对象,表示查看的是2020年的日历
我们也可以查看这个命令的所有选项
[root@localhost ~]# cal --help
用法:
cal [选项] [[[日] 月] 年]
选项:
-1, --one 只显示当前月份(默认)
-3, --three 显示上个月、当月和下个月
-s, --sunday 周日作为一周第一天
-m, --monday 周一用为一周第一天
-j, --julian 输出儒略日
-y, --year 输出整年
-V, --version 显示版本信息并退出
-h, --help 显示此帮助并退出
4、常用命令
Linux的常见命令比较多,这边只列出初学者最常用的部分命令,大家可以根据命令意思去进行练习。
注意Linux会准确的识别出命令的大小写,所以大家需要注意大小写的问题。命令选项和参数之间是用空格进行分隔,请大家在输入的时候注意不要缺失空格。
学习Linux最重要的就是以下三个方面
1. 命令的积累
2. 原理的掌握
3. 大量的实战
下面就是开始第一步,积累基础的命令
4.1、ls
用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录)
ls [-alrtAFR] [name...]
4.1.1、选项
- -a:显示所有文件及目录 (.开头的隐藏文件也会列出)
- -l:除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出
- -r:将文件以相反次序显示(原定依英文字母次序)
- -t:将文件依建立时间之先后次序列出
- -A:同 -a ,但不列出 "." (目前目录) 及 ".." (父目录)
- -F:在列出的文件名称后加一符号;例如可执行档则加 "*", 目录则加 "/",链接加"@"
[root@CloudCourseCentos7 etc]# ls -F
adjtime e2fsck.conf ld.so.conf pm/ shadow-
aliases environment ld.so.conf.d/ polkit-1/ shells
aliases.db ethertypes libaudit.conf popt.d/ skel/
alternatives/ exports libnl/ postfix/ ssh/
anacrontab favicon.png@ libuser.conf ppp/ ssl/
asound.conf filesystems locale.conf prelink.conf.d/ statetab
audisp/ firewalld/ localtime@ printcap statetab.d/
audit/ fstab login.defs profile subgid
bash_completion.d/ gcrypt/ logrotate.conf profile.d/ subuid
bashrc gnupg/ logrotate.d/ protocols sudo.conf
binfmt.d/ GREP_COLORS lvm/ python/ sudoers
centos-release groff/ machine-id rc0.d@ sudoers.d/
centos-release-upstream group magic rc1.d@ sudo-ldap.conf
chkconfig.d/ group- makedumpfile.conf.sample rc2.d@ sysconfig/
chrony.conf grub2.cfg@ man_db.conf rc3.d@ sysctl.conf
chrony.keys grub.d/ mke2fs.conf rc4.d@ sysctl.d/
cron.d/ gshadow modprobe.d/ rc5.d@ systemd/
cron.daily/ gshadow- modules-load.d/ rc6.d@ system-release@
cron.deny gss/ motd rc.d/ system-release-cpe
cron.hourly/ host.conf mtab@ rc.local@ terminfo/
cron.monthly/ hostname my.cnf redhat-release@ tmpfiles.d/
crontab hosts my.cnf.d/ resolv.conf tuned/
cron.weekly/ hosts.allow NetworkManager/ rpc udev/
crypttab hosts.deny networks rpm/ updatedb.conf
csh.cshrc init.d@ nsswitch.conf rsyslog.conf vconsole.conf
csh.login inittab nsswitch.conf.bak rsyslog.d/ vimrc
dbus-1/ inputrc openldap/ rwtab virc
default/ iproute2/ opt/ rwtab.d/ wgetrc
depmod.d/ issue os-release@ sasl2/ wpa_supplicant/
dhcp/ issue.net pam.d/ securetty X11/
DIR_COLORS kdump.conf passwd security/ xdg/
DIR_COLORS.256color kernel/ passwd- selinux/ xinetd.d/
DIR_COLORS.lightbgcolor krb5.conf pkcs11/ services yum/
dracut.conf krb5.conf.d/ pki/ sestatus.conf yum.conf
dracut.conf.d/ ld.so.cache plymouth/ shadow yum.repos.d/
[root@CloudCourseCentos7 etc]#
- -R:若目录下有文件,则以下之文件亦皆依序列出
- -h:将显示出来的文件大小以合适的单位显示出来
4.1.2、实例
- 查看当前目录下的文件
[root@localhost ~]# ls
- 查看根目录下的文件,查看/usr目录下的文件
[root@localhost ~]# ls /
[root@localhost ~]# ls /usr
- 查看当前目录下所有文件,包括隐藏文件
[root@localhost ~]# ls -a
- 查看当前目录下文件详情,包括隐藏文件
[root@localhost ~]# ls -lha
- 查看当前目录下的文件,并且显示出目录,文件,程序的区别
[root@localhost ~]# ls -F
anaconda-ks.cfg dirb/ dird/ file2 file4 ping*
dira/ dirc/ dire/ file1 file3 file5
# 可以看到普通文件只有文件名,可执行文件后面带*,文件夹后面带/
- 查看当前目录下的文件,如果有文件夹,那么将文件夹中的文件也显示出来
[root@localhost ~]# ls -FR
# dir这是一个目录,在这个目录下的文件也全部显示出来
[root@localhost ~]# ls -FRl
# 显示详细的信息
4.1.3、扩展知识
[root@localhost ~]# ls -ahl
总用量 24K
dr-xr-x---. 3 root root 139 4月 2 14:00 .
dr-xr-xr-x. 17 root root 224 6月 21 2020 ..
-rw-------. 1 root root 128 4月 2 09:37 .bash_history
-rw-r--r--. 1 root root 18 12月 29 2013 .bash_logout
-rw-r--r--. 1 root root 176 12月 29 2013 .bash_profile
-rw-r--r--. 1 root root 176 12月 29 2013 .bashrc
-rw-r--r--. 1 root root 100 12月 29 2013 .cshrc
drwxr-xr-x. 2 root root 32 4月 2 14:00 dir
-rw-r--r--. 1 root root 129 12月 29 2013 .tcshrc
-rw-r--r--. 1 root root 0 4月 2 14:00 test.txt
- 第一列共10位,第1位表示文档类型,
d
表示目录,-
表示文件,l
表示链接文件,b
表示可随机存取的设备,如U盘等,c
表示一次性读取设备,如鼠标、键盘等。后9位,依次对应三种身份所拥有的权限,身份顺序为:owner、group、others,权限顺序为:readable、writable、excutable。如:-r-xr-x---
的含义为当前文档是一个文件,拥有者可读、可执行,同一个群组下的用户,可读、可写,其他人没有任何权限。 - 第二列表示链接数,表示有多少个文件链接到inode号码。
- 第三列表示拥有者
- 第四列表示所属群组
- 第五列表示文档容量大小,单位字节
- 第六列表示文档最后修改时间,注意不是文档的创建时间哦
- 第七列表示文档名称。以点(.)开头的是隐藏文档
4.2、cd
用于切换当前工作目录
cd [dirName]
4.2.1、实例
- 跳转到
/usr/bin
目录下
[root@localhost ~]# cd /usr/bin
- 跳到自己的 home 目录
[root@localhost bin]# cd ~
- 跳到目前目录的上一层
[root@localhost ~]# cd ..
4.3、pwd
显示工作目录
pwd [-LP]
- -L 打印 $PWD 变量的值,如果它命名了当前的工作目录
- -P 打印当前的物理路径,不带有任何的符号链接
默认情况下,pwd
的行为和带-L
选项一致
[root@localhost ~]# export PWD=/usr/bin
[root@localhost bin]#
# 修改了$PWD变量,会导致当前光标的路径发生变化,等同于cd切换了路径
4.4、clear
用于清除屏幕
clear
4.5、echo
用于字符串的输出
echo [-neE] 字符串
4.5.1、选项
-
-n:不输出行尾的换行符
-
-e
:允许对下面列出的加反斜线转义的字符进行解释
- \ 反斜线
- \a 报警符(BEL)
- \b 退格符
- \c 禁止尾随的换行符
- \f 换页符
- \n 换行符
- \r 回车符
- \t 水平制表符
-
\v 纵向制表符
-
-E 禁止对在STRINGs中的那些序列进行解释
4.5.2、实例
- 显示出
hello world
[root@localhost ~]# echo "hello world"
- 用两行显示出
hello world
[root@localhost ~]# echo -e "hello\nworld"
- 输出
hello world
的时候让系统发出警报音
[root@localhost ~]# echo -e "hello\aworld"
5、系统命令
5.1、poweroff
用于关闭计算器并切断电源
poweroff [-n] [-w] [-d] [-f] [-i] [-h]
5.1.1、选项
- -n: 在关机前不做将记忆体资料写回硬盘的动作
- -w: 并不会真的关机,只是把记录写到 /var/log/wtmp 档案里
- -d: 不把记录写到 /var/log/wtmp 文件里
- -i: 在关机之前先把所有网络相关的装置先停止
- -p: 关闭操作系统之前将系统中所有的硬件设置为备用模式。
5.2、reboot
用来重新启动计算机
reboot [-n] [-w] [-d] [-f] [-i]
5.2.1、选项
- -n: 在重开机前不做将记忆体资料写回硬盘的动作
- -w: 并不会真的重开机,只是把记录写到 /var/log/wtmp 档案里
- -d: 不把记录写到 /var/log/wtmp 档案里(-n 这个参数包含了 -d)
- -f: 强迫重开机,不呼叫 shutdown 这个指令
- -i: 在重开机之前先把所有网络相关的装置先停止
5.3、whoami
用于显示自身用户名称
[root@localhost ~]# whoami
root
6、快捷键
快捷键 | 作用 |
---|---|
^C(^代表CTRL) | 终止前台运行的程序 |
^D | 退出 等价exit |
^L | 清屏 |
^A | 光标移动到命令行的最前端 |
^E | 光标移动到命令行的后端 |
^U | 删除光标前所有字符 |
^K | 删除光标后所有字符 |
^R | 搜索历史命令,利用关键词 |
7、帮助命令
7.1、history
history [n] n为数字,列出最近的n条命令
7.1.1、选项
- -c:将目前shell中的所有history命令消除
- -a:将目前新增的命令写入histfiles, 默认写入
~/.bash_history
- -r:将histfiles内容读入到目前shell的history记忆中
- -w:将目前history记忆的内容写入到histfiles
7.1.2、实例
- 将history的内容写入一个新的文件中
[root@localhost ~]# history -w histfiles.txt
- 情况所有的history记录,注意并不清空
~/.bash_history
文件
[root@localhos t ~]# history -c
- 使用
!
执行历史命令。 ! number
执行第几条命令! command
从最近的命令查到以command
开头的命令执行!!
执行上一条
[root@localhost ~]# history
1 history
2 cat .bash_history
3 ping -c 3 baidu.com
4 history
[root@localhost ~]# !3
# 这里是执行第三条命令的意思
7.2、help
显示命令的帮助信息
help [-dms] [内置命令]
7.2.1、选项
- -d:输出每个主题的简短描述
- -m:以伪 man 手册的格式显示使用方法
- -s:为每一个匹配 PATTERN 模式的主题仅显示一个用法
7.2.2、实例
- 查看echo的帮助信息
[root@localhost ~]# help echo
7.3、man
显示在线帮助手册页
man 需要帮助的命令或者文件
7.3.1、快捷键
按键 | 用途 |
---|---|
空格键 | 向下翻一页 |
PaGe down | 向下翻一页 |
PaGe up | 向上翻一页 |
home | 直接前往首页 |
end | 直接前往尾页 |
/ | 从上至下搜索某个关键词,如“/linux” |
? | 从下至上搜索某个关键词,如“?linux” |
n | 定位到下一个搜索到的关键词 |
N | 定位到上一个搜索到的关键词 |
q | 退出帮助文档 |
7.3.2、手册的结构
结构名称 | 代表意义 |
---|---|
NAME | 命令的名称 |
SYNOPSIS | 参数的大致使用方法 |
DESCRIPTION | 介绍说明 |
EXAMPLES | 演示(附带简单说明) |
OVERVIEW | 概述 |
DEFAULTS | 默认的功能 |
OPTIONS | 具体的可用选项(带介绍) |
ENVIRONMENT | 环境变量 |
FILES | 用到的文件 |
SEE ALSO | 相关的资料 |
HISTORY | 维护历史与联系方式 |
7.3.3、安装中文man手册
中文man手册翻译的并不完整,但是也可以安装作为一个参考,下面是安装命令,目前可能不能理解是什么意思,后续学习之后就可以看懂命令的含义了。
yum -y install man-pages-zh-CN.noarch
echo "alias cman='man -M /usr/share/man/zh_CN'" >> .bashrc
source .bashrc
7.3.4、实例
- 查看echo的man手册
[root@localhost ~]# man echo
ECHO(1) General Commands Manual ECHO(1)
NAME(名称)
echo - 显示一行文本
SYNOPSIS(总览)
echo[OPTION]... [STRING]...
DESCRIPTION(描述)
允许在标准输出上显示STRING(s).
-n 不输出行尾的换行符.
-e 允许对下面列出的加反斜线转义的字符进行解释.
-E 禁止对在STRINGs中的那些序列进行解释.
7.4、alias
用于设置指令的别名
7.4.1、实例
- 查看系统当前的别名
[root@localhost ~]# alias # 查看系统当前的别名
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@localhost ~]# ll
总用量 4
-rw-------. 1 root root 1241 8月 22 2018 anaconda-ks.cfg
drwxr-xr-x. 2 root root 19 8月 21 12:15 home
[root@xwz ~]# type -a ls # 查看命令类型
ls 是 ls --color=auto 的别名
ls 是 /usr/bin/ls
- 修改别名,比如使用wl来查看IP地址相关信息
[root@localhost ~]# alias wl='ip address'
[root@localhost ~]# wl
- 为了让别名永久生效,可以讲修改别名的命令写入
bashrc
文件,这个文件中的命令会在每次登陆命令行的时候执行
[root@localhost ~]# echo "alias wl='ip address'" >> /etc/bashrc
二、文件管理
我们知道Linux的目录结构为树状结构,最顶级的目录为根目录 /。
其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们。
在开始本教程前我们需要先知道什么是绝对路径与相对路径。
- 绝对路径
- 路径的写法,由根目录
/
写起,例如:/usr/share/doc
这个目录 - 相对路径
- 路径的写法,不是由
/
写起,例如由/usr/share/doc
要到/usr/share/man
底下时,可以写成:cd ../man
这就是相对路径的写法。
1、文件管理命令
几个常见的处理目录的命令
- ls(英文全拼:list files): 列出目录及文件名
- cd(英文全拼:change directory):切换目录
- pwd(英文全拼:print work directory):显示目前的目录
- mkdir(英文全拼:make directory):创建一个新的目录
- rmdir(英文全拼:remove directory):删除一个空的目录
- cp(英文全拼:copy file): 复制文件或目录
- rm(英文全拼:remove): 删除文件或目录
- mv(英文全拼:move file): 移动文件与目录,或修改文件与目录的名称
1.1、touch(创建新文件)
用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。
touch 文件名
1.1.1、实例
- 创建新空白文件
[root@localhost ~]# touch newfile
1.2、mkdir (创建新目录)
创建新的目录的
mkdir [-mpv] 目录名称
1.2.1、选项
- -m:配置文件的权限喔!直接配置,不需要看默认权限 (umask)
- -p:帮助你直接将所需要的目录(包含上一级目录)递归创建起来!
- -v:显示目录创建的过程
1.2.2、实例
[root@localhost ~]# mkdir dir
# 创建一个新的文件夹叫dir
[root@localhost ~]# mkdir a/b/c
mkdir: 无法创建目录"a/b/c": 没有那个文件或目录
# 无法直接创建多层目录
[root@localhost ~]# mkdir -p a/b/c
# 加上-p选项之后可以自动创建父级目录
[root@localhost ~]# mkdir -pv dir1/dir2
mkdir: 已创建目录 "dir1"
mkdir: 已创建目录 "dir1/dir2"
# 显示详细的创建过程
1.3、cp (复制文件或目录)
拷贝文件和目录
cp [选项]... 源文件... 目录
1.3.1、选项
- -a:相当於 -pdr 的意思,至於 pdr 请参考下列说明;(常用)
- -d:若来源档为连结档的属性(link file),则复制连结档属性而非文件本身;
- -f:为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;
- -i:若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
- -l:进行硬式连结(hard link)的连结档创建,而非复制文件本身;
- -p:连同文件的属性一起复制过去,而非使用默认属性(备份常用);
- -r:递归持续复制,用於目录的复制行为;(常用)
- -s:复制成为符号连结档 (symbolic link),亦即『捷径』文件;
- -u:若 destination 比 source 旧才升级 destination !
- -v:显示复制的详细过程
1.3.2、实例
[root@localhost ~]# mkdir /home/dir{1,2}
[root@localhost ~]# touch install.log
[root@localhost ~]# cp -v install.log /home/dir1
# 复制文件到目录下
[root@localhost ~]# cp -v install.log /home/dir1/abc.txt
# 复制文件到目录下,并且重命名为abc.txt
[root@localhost ~]# cp -rv /etc /home/dir1
# 复制目录
[root@localhost ~]# cp -rv /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/passwd /etc/hostname /home/dir2
# 将多个文件复制到同一个目录
[root@localhost ~]# cp -rv /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/passwd /etc/hostname .
# 将多个文件复制到当前目录
[root@localhost ~]# type -a cp
cp 是 cp -i 的别名
cp 是 /usr/bin/cp
[root@localhost ~]# cp -rv /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33.bak
[root@localhost ~]# cp -rv /etc/sysconfig/network-scripts/{ifcfg-ens33,ifcfg-ens33.bak}
[root@localhost ~]# cp -rv /etc/sysconfig/network-scripts/ifcfg-ens33{,-old}
# 备份配置文件
1.4、mv(移动文件与目录,或修改名称)
移动文件与目录,或修改名称
mv [选项]... 源文件... 目录
1.4.1、选项
- -f:force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
- -i:若目标文件 (destination) 已经存在时,就会询问是否覆盖!
- -u:若目标文件已经存在,且 source 比较新,才会升级 (update)
- -v:显示复制的详细过程
1.4.2、实例
[root@localhost ~]# mv file1 /home/dir3
# 将file1移动到/home/dir3
[root@localhost ~]# mv file2 /home/dir3/file20
# 将file2移动到/home/dir3,并且改名file20
[root@localhost ~]# mv file4 file5
# 将file4改名为file5
1.5、rm (移除文件或目录)
移除文件或目录
rm [选项]... 文件...
1.5.1、选项
- -f:就是 force 的意思,忽略不存在的文件,不会出现警告信息;
- -i:互动模式,在删除前会询问使用者是否动作
- -r:递归删除啊!最常用在目录的删除了!这是非常危险的选项!!!
1.5.2、实例
[root@localhost ~]# cd /home
[root@localhost home]# rm -rf dir1
2、文本文件查看
在Linux中一切皆文件,说的就是Linux利用文本文件来保存系统所有的设置。
我们在Linux中想实现一个功能,不可避免的需要查看文本文件,修改文本文件。
2.1、cat
用于打开文本文件并显示出来
cat [选项]... [文件]...
2.1.1、选项
- -n:由 1 开始对所有输出的行数编号
- -b:和 -n 相似,只不过对于空白行不编号。
- -s:当遇到有连续两行以上的空白行,就代换为一行的空白行。
- -A:显示控制字符。
2.1.2、实例
- 查看anaconda-ks.cfg文件
[root@localhost ~]# cat anaconda-ks.cfg
- 查看anaconda-ks.cfg文件,并且显示行号
[root@localhost ~]# cat -n anaconda-ks.cfg
2.2、less
可以随意浏览文件,支持翻页和搜索,支持向上翻页和向下翻页
2.2.1、实例
[root@localhost ~]# less anaconda-ks.cfg
2.3、head
查看文件的开头部分的内容
head [选项]... [文件]...
2.3.1、参数
- -q:隐藏文件名,默认是隐藏
- -v:显示文件名
- -c<数目>:显示的字节数。
- -n<行数>:显示的行数。
2.3.2、实例
- 查看文件的前6行
[root@localhost ~]# head -n 6 anaconda-ks.cfg
2.4、tail
会把文本文件里的最尾部的内容显示在屏幕上
tail [选项]... [文件]...
2.4.1、参数
- -f:循环读取
- -q:隐藏文件名,默认隐藏
- -v:显示文件名
- -c<数目>:显示的字节数
- -n<行数>:显示文件的尾部 n 行内容
- -s:与-f合用,表示在每次反复的间隔休眠S秒
2.4.2、实例
- 查看文件anaconda-ks.cfg尾部的3行
[root@localhost ~]# tail -n 3 anaconda-ks.cfg
- 查看日志的实时更新情况
[root@localhost ~]# tail -f /var/log/messages
# ctrl+c退出
- 查看文件anaconda-ks.cfg从第10行到结尾
[root@localhost ~]# tail -n +10 anaconda-ks.cfg
2.5、grep
针对文件内容进行过滤,本工具属于文本三剑客,后续会详细讲解,目前只要求初学者掌握最基本的实例即可
2.5.1、实例
[root@xwz ~]# grep 'root' /etc/passwd
# 在/etc/passwd的文件中找出有root的行
[root@xwz ~]# grep '^root' /etc/passwd
# 在/etc/passwd中找出root开头的行
[root@xwz ~]# grep 'bash$' /etc/passwd
# 在/etc/passwd中找出bash结尾的行
3、文本文件编辑
在Linux中只掌握文本查看是远远不够的,我们还需要掌握编辑文本文件。
Linux上也有图形化的文本编辑器,类似于windows的记事本,但是很多时候我们只能用命令行来管理Linux操作系统,所以必须要掌握命令行的文本编辑器软件。
目前常见的命令行文本编辑器
- nano:在debain系列的系统上会比较常见,但是其他的Linux发行版也都可以安装
- vi:所有的 Unix Like 系统都会内建 vi 文本编辑器,其他的文本编辑器则不一定会存在。
- vim:具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。
目前vim是使用的最多的,也是比较推荐的,下面就来讲一下vim
3.1、什么是 vim?
Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。
连 vim 的官方网站 (http://www.vim.org) 自己也说 vim 是一个程序开发工具而不是文字处理软件。
vim是一个纯命令行文本编辑器,很多文本编辑的功能都是通过键盘快捷键的方式完成,所以我们需要记住常用的键位,在vim官方网站上我们可以找到vim键盘图的完整版,不过对于初学者来说,我们只需要知道常用的就可以了。
3.2、vi/vim 的使用
基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和末行模式(Last line mode)。 这三种模式的作用分别是:
3.2.1、命令模式
用户刚刚启动 vi/vim,便进入了命令模式。
此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i
,并不会输入一个字符,i
被当作了一个命令。
以下是常用的几个命令:
- i切换到输入模式,以输入字符。
- x删除当前光标所在处的字符。
- :切换到末行模式,以在最底一行输入命令。
若想要编辑文本:启动Vim,进入了命令模式,按下i,切换到输入模式。
命令模式只有一些最基本的命令,因此仍要依靠末行模式输入更多命令。
3.2.2、输入模式
在命令模式下按下i
就进入了输入模式。
在输入模式中,可以使用以下按键:
- 字符按键以及Shift组合,输入字符
- ENTER,回车键,换行
- BACK SPACE,退格键,删除光标前一个字符
- DEL,删除键,删除光标后一个字符
- 方向键,在文本中移动光标
- HOME/END,移动光标到行首/行尾
- Page Up/Page Down,上/下翻页
- Insert,切换光标为输入/替换模式,光标将变成竖线/下划线
- ESC,退出输入模式,切换到命令模式
3.2.3、末行模式
在命令模式下按下:
(英文冒号)就进入了末行模式。
末行模式可以输入单个或多个字符的命令,可用的命令非常多。
在末行模式中,基本的命令有:
- :q退出程序
- :w保存文件
按ESC键可随时退出末行模式。
简单的说,我们可以将这三个模式的关系用下图来表示:
3.3、vi/vim使用实例
有些linux发行套件上并没有安装vim,我们可以安装一下,下面提供了centos的安装命令
[root@localhost ~]# yum -y install vim
# yum是在线安装软件的命令,后面会有详细的介绍,这边直接使用
vi和vim大部分的操作完全一模一样,所以会使用vim自然也会使用vi
3.3.1、编辑一个文档
直接输入vim 文件名
就能够进入 vim 的一般模式了。请注意,记得 vim 后面一定要加文件名,不管该文件存在与否!
[root@localhost ~]# vim file.txt
输入这条命令之后,会看到如下画面
按下i
进入输入模式(也称为编辑模式),开始编辑文字
在命令模式之中,只要按下i
,o
,a
等字符就可以进入输入模式了!
在编辑模式当中,你可以发现在左下角状态栏中会出现--INSERT--
的字样,那就是可以输入任意字符的提示。
这个时候,键盘上除了 Esc 这个按键之外,其他的按键都可以视作为一般的输入按钮了,所以你可以进行任何的编辑。
好了,假设我已经按照上面的样式给他编辑完毕了,那么应该要如何退出呢?是的!没错!就是给他按下 Esc 这个按钮即可!马上你就会发现画面左下角--INSERT--
的不见了!
输入:wq后回车即可保存离开,注意其中的冒号必须是英文输入法下的冒号!
现在我们就成功创建了一个文件,查看文件的内容吧
[root@localhost ~]# ls -lh file.txt
[root@localhost ~]# cat file.txt
3.4、vi/vim按键说明
除了上面简易范例的 i, Esc, :wq 之外,其实 vim 还有非常多的按键可以使用。
下面将会列举出vim非常多的常用按键,初学者只需要浏览一遍,记住大概vim有哪些功能,等后面大量使用vim的时候,再来翻阅笔记,并且在多次使用中把这些功能记住。
3.4.1、命令模式
下面的操作都是在命令模式下进行的
移动光标的方法
h 或 向左箭头键(←) | 光标向左移动一个字符 |
---|---|
j 或 向下箭头键(↓) | 光标向下移动一个字符 |
k 或 向上箭头键(↑) | 光标向上移动一个字符 |
l 或 向右箭头键(→) | 光标向右移动一个字符 |
[Ctrl] + [f] | 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用) |
[Ctrl] + [b] | 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用) |
[Ctrl] + [d] | 屏幕『向下』移动半页 |
[Ctrl] + [u] | 屏幕『向上』移动半页 |
+ | 光标移动到非空格符的下一行 |
- | 光标移动到非空格符的上一行 |
n | 那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。例如 20 则光标会向后面移动 20 个字符距离。 |
0 或功能键[Home] | 这是数字『 0 』:移动到这一行的最前面字符处 (常用) |
$ 或功能键[End] | 移动到这一行的最后面字符处(常用) |
H | 光标移动到这个屏幕的最上方那一行的第一个字符 |
M | 光标移动到这个屏幕的中央那一行的第一个字符 |
L | 光标移动到这个屏幕的最下方那一行的第一个字符 |
G | 移动到这个档案的最后一行(常用) |
nG | n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu) |
gg | 移动到这个档案的第一行,相当于 1G 啊! (常用) |
n | n 为数字。光标向下移动 n 行(常用) |
文本的搜索与替换
/word | 向光标之下寻找一个名称为 word 的字符串。 (常用) |
---|---|
?word | 向光标之上寻找一个字符串名称为 word 的字符串。 |
n | 这个 n 是英文按键。代表重复前一个搜寻的动作。 |
N | 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。 |
:n1,n2s/word1/word2/g | n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 (常用) |
:1,$s/word1/word2/g 或 :%s/word1/word2/g | 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !(常用) |
:1,$s/word1/word2/gc 或 :%s/word1/word2/gc | 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用) |
删除/剪切、复制与粘贴
x, X | 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用) |
---|---|
nx | n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。 |
dd | 删除/剪切光标所在的那一整行(常用) |
ndd | n 为数字。删除/剪切光标所在的向下 n 行,例如 20dd 则是删除 20 行 (常用) |
d1G | 删除光标所在到第一行的所有数据 |
dG | 删除光标所在到最后一行的所有数据 |
d$ | 删除游标所在处,到该行的最后一个字符 |
d0 | 那个是数字的 0 ,删除光标所在处,到该行的最前面一个字符 |
yy | 复制游标所在的那一行(常用) |
nyy | n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行(常用) |
y1G | 复制游标所在行到第一行的所有数据 |
yG | 复制游标所在行到最后一行的所有数据 |
y0 | 复制光标所在的那个字符到该行行首的所有数据 |
y$ | 复制光标所在的那个字符到该行行尾的所有数据 |
p, P | p 为将已复制的数据在光标下一行贴上,P 则为贴在光标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用) |
J | 将光标所在行与下一行的数据结合成同一行 |
c | 重复删除多个数据,例如向下删除 10 行,[ 10c ] |
u | 复原前一个动作。(常用) |
[Ctrl]+r | 重做上一个动作。(常用) |
. | 重复前一个动作。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用) |
进入输入或取代的编辑模式
i, I | 进入输入模式(Insert mode): i 为『从目前光标所在处输入』, I 为『在目前所在行的第一个非空格符处开始输入』。 (常用) |
---|---|
a, A | 进入输入模式(Insert mode): a 为『从目前光标所在的下一个字符处开始输入』, A 为『从光标所在行的最后一个字符处开始输入』。(常用) |
o, O | 进入输入模式(Insert mode): 这是英文字母 o 的大小写。o 为在目前光标所在的下一行处输入新的一行; O 为在目前光标所在的上一行处输入新的一行!(常用) |
r, R | 进入取代模式(Replace mode): r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下 ESC 为止;(常用) |
[Esc] | 退出编辑模式,回到一般模式中(常用) |
末行模式下的储存、离开等指令
:w | 将编辑的数据写入硬盘中(常用) |
---|---|
:w! | 若文件属性为『只读』时,强制写入该文件。不过,到底能不能写入, 还是跟你对该文件的权限有关 |
:q | 离开 vi (常用) |
:q! | 若曾修改过文件,又不想储存,使用 ! 为强制离开不储存。 |
:wq | 储存后离开,若为 :wq! 则为强制储存后离开 (常用) |
ZZ | 这是大写的 Z 喔!如果修改过,保存当前文件,然后退出!效果等同于(保存并退出) |
:x | 效果等同于(保存并退出) |
:X | 大写的X,用于加密文件 |
ZQ | 不保存,强制退出。效果等同于:q!。 |
:w [filename] | 将编辑的数据储存成另一个文件(类似文件另存为) |
:r [filename] | 在编辑的数据中,读入另一个文件的数据。亦即将 『filename』 这个文件内容加到光标所在行后面 |
:n1,n2 w [filename] | 将 n1 到 n2 的内容储存成 filename 这个文件。 |
:! command | 暂时离开 vi 到bash命令行下执行 command 的显示结果!例如 『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的文件信息! |
vim环境变量修改
:set nu | 显示行号,设定之后,会在每一行的前缀显示该行的行号 |
---|---|
:set nonu | 与 set nu 相反,为取消行号! |
三、文件基本属性与文件查找
1、文件时间
任何一个操作系统都有时间的概念,时间的概念主要用于对文件和系统中发生的时间进行记录,在Linux中,可以使用stat查看Linux系统中文件的时间
1.1、stat
用于显示文件时间和 inode 内容,inode相关的知识会在后面的磁盘管理章节详细讲解,这边主要来看文件的时间
stat [选项]... 文件...
1.1.1、实例
- stat查看文件时间,这边为了我们方便看得懂,建议改为英文系统环境
[root@localhost ~]# export LANG="en_US.UTF-8"
# 改回中文是LANG="zh_CN.UTF-8"
[root@localhost ~]# stat anaconda-ks.cfg
File: ‘anaconda-ks.cfg’
Size: 1241 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 33574979 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:admin_home_t:s0
Access: 2021-04-04 17:54:09.700844151 +0800
Modify: 2021-04-04 16:53:30.524854041 +0800
Change: 2021-04-04 16:53:30.524854041 +0800
Birth: -
- Access:访问时间,也叫atime
- 当文件被访问的时候,这个时间就会发生改变
- Linux文件运行的时候查看文件又频繁数量又大,如果每次atime发生变化的时候都记入硬盘,或造成很大的压力。RHEL6开始relatime,atime延迟修改,必须满足其中一个条件:
- 自上次atime修改后,已达到86400秒
- 发生写操作时
- Modify:修改时间,也叫mtime
- 当文件内容发生变化的时候,这个时间就会发生改变
- Change:改变时间,也叫ctime
- 当文件状态被改变的时候,这个时间就会发生修改
2、文件类型
Linux系统和Windows系统有很大的区别,Windows系统查看文件的后缀名就可以知道这个是什么类型的文件,比如:test.jpg
这个是一个图片,如果你在windows上双击打开,就会使用支持查看图片的软件打开。
Linux系统就根本不看文件的后缀名,你认为这个是什么文件,你就使用什么工具打开这个文件,如果打开错误,就会报错,看下面的案例
[root@localhost ~]# cat file
cat: file: Is a directory
当你以为file是个文件,使用cat命令查看的时候,cat会提示你这个是个文件夹,你才反应过来,应该使用cd命令打开。 所以在Linux中,我们需要使用和windows不一样的方法来判断这个文件的类型。
2.1、方法一:ls
使用ls可以查看当前目录下有哪些文件,我们会发现文件夹和文件的颜色并不一样,所以我们可以简单的通过颜色来进行判断,不过这种判断的方式并不准确,因为不同的Linux发行套件颜色的标准并不一样,不同的远程管理工具对颜色的理解也有偏差,比如可能把蓝色显示为淡蓝色,而淡蓝色又显示成其他颜色。所以最推荐的做法是通过ls -l
查看第一个字母:
- -普通文件(文本文档,二进制文件,压缩文件,电影,图片。。。)
- d目录文件(蓝色)
- b块设备文件(块设备)存储设备硬盘,U盘 /dev/sda,/dev/sda1
- c字符设备文件(字符设备)打印机,终端 /dev/tty1,/dev/zero
- s套接字文件
- p管道文件
- l链接文件(淡蓝色)
[root@localhost ~]# type ll
ll 是 ls -l --color=auto 的别名
[root@localhost ~]# ll -d /etc/hosts /bin/ls /home /dev/sda /dev/tty1 /etc/grub2.cfg /dev/log /run/dmeventd-client
-rwxr-xr-x. 1 root root 117680 10月 31 2018 /bin/ls
srw-rw-rw-. 1 root root 0 4月 4 16:54 /dev/log
brw-rw----. 1 root disk 8, 0 4月 4 16:54 /dev/sda
crw--w----. 1 root tty 4, 1 4月 4 16:56 /dev/tty1
lrwxrwxrwx. 1 root root 22 4月 4 16:49 /etc/grub2.cfg -> ../boot/grub2/grub.cfg
-rw-r--r--. 1 root root 158 6月 7 2013 /etc/hosts
drwxr-xr-x. 2 root root 6 4月 11 2018 /home
prw-------. 1 root root 0 4月 4 16:54 /run/dmeventd-client
对于初学者而言,我们现在只要知道可以通过这样的方式查看文件的类型,并且能够知道-
和d
的意思即可。后面在学习的过程中,会慢慢的将所有文件类型都掌握的。
2.2方法二:file
file是专门用来查看文件的类型的命令,有时候也可以使用
[root@localhost ~]# file /etc/hosts
/etc/hosts: ASCII text
[root@localhost ~]# file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=ceaf496f3aec08afced234f4f36330d3d13a657b, stripped
[root@localhost ~]# file /dev/sda
/dev/sda: block special
[root@localhost ~]# file /dev/tty1
/dev/tty1: character special
[root@localhost ~]# file /etc/grub2.cfg
/etc/grub2.cfg: symbolic link to ../boot/grub2/grub.cfg
[root@localhost ~]# file /home
/home: directory
[root@localhost ~]# file /run/dmeventd-client
/run/dmeventd-client: fifo (named pipe)
2.3、方法三:stat
这个命令上面已经介绍过了,在输出结果中也是可以看到文件的类型
3、文件查找
在windows中可以在文件管理器中很方便的输入文件名查找文件,然而Linux的文件查找功能更加的方便,并且功能更加的强大,现在就介绍三个用于查找文件的命令。
在这三种查找命令中功能最强大的是find
命令,所以在学习的时候,which
和locate
需要掌握,find
命令需要熟练掌握!
3.1、which
用于查找文件
which指令会在环境变量$PATH
设置的目录里查找符合条件的文件
which [文件...]
3.1.1、补充知识:环境变量
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
简单的理解就是告诉操作系统在程序运行的时候,有一些默认的设置是什么。
比如上面我们修改了LANG
变量,就是一个环境变量,会影响到显示的语言是中文还是英文。
比如在讲解pwd
命令的时候,我们修改了$PWD
变量,就影响了当前所处的文件夹。
在我们使用shell命令行输入命令的时候,其实每个命令都是有一个可执行文件去完成我们下达的任务,这个可执行文件在操作系统中是分布在不同的文件夹中的,我们总不能每次执行的时候都要告诉操作系统这个文件在哪里,那么就算是查看一个文件,我们都需要输入如下的命令:
[root@localhost ~]# /usr/bin/ls -lh
# 在Linux中,ls的可执行程序在/usr/bin目录下
这样就太麻烦了,所以就指定了一个环境变量$PATH
,这个变量中有很多的目录地址,当我们执行命令的时候,操作系统就会到这些目录中查找,是否存在你所输入的命令。如果有那么就会去执行。
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
如果你想让自己安装的某个软件可以在操作系统的任意位置直接输入文件名执行,那么你也可以把自定义的目录加入到这个$PATH
中
3.1.2、实例
- 查看ls命令的可执行文件在什么目录
[root@localhost ~]# which ls
alias ls='ls --color=auto'
/usr/bin/ls
# which会先告诉你ls其实是一个别名
# 然后显示出来ls所在的具体位置
小知识:我们在执行ls
的时候,其实执行的是ls --color=auto
这条命令,在显示文件的时候使用不同的颜色表示不同的文件类型,如果我们想执行ls
本体,而不想执行别名,我们可以输入\ls
就可以了,这样就不会有不同的颜色表示文件类型了。
- 查看poweroff在什么目录
[root@localhost ~]# which poweroff
/usr/sbin/poweroff
3.2、locate
用于查找符合条件的文件,他会去保存文件和目录名称的数据库内,查找合乎范本样式条件的文件或目录
在centos7的最小化安装中,并没有自带locate命令,我们需要输入如下命令进行安装。
[root@localhost ~]# yum -y install mlocate
# 注意,在安装的时候需要确保虚拟机有网络
locate的使用方式如下
locate [选项]... [范本样式]...
在使用locate之前,需要更新一下数据库,因为locate只会在数据库中查找文件所在的位置,所以locate查找速度极快,缺点就是数据库更新并不是实时的,更新数据库有两种方式:
- 手动更新,输入
updatedb
- 默认情况下,
updatedb
会每天自动执行一次
3.2.1、选项
- -c:只输出找到的数量
- -n:至多显示 n个输出
- -i:忽略大小写
- -r:使用基本正则表达式
- --regex:使用扩展正则表达式
- -d DBPATH:使用 DBPATH 指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db
3.2.2、实例
- 查找passwd文件所在的位置
[root@localhost ~]# updatedb
# 更新数据库并不是每次查找都需要,但是建议更新数据库来保证数据是最新的
[root@localhost ~]# locate passwd
- 查找ens33网卡配置文件所在的位置
[root@localhost ~]# locate -r ens33$
/etc/sysconfig/network-scripts/ifcfg-ens33
# $在正则表达式中表示以什么结尾,所以ens33$表示的是以ens33结尾的文件
关于正则表达式,我们会在后续文本三剑客中详细学习
3.3、find
实时查找工具,通过遍历指定路径下的文件系统完成文件查找
工作特点:
- 查找速度略慢
- 精确查找
- 实时查找
- 可以满足多种条件匹配
find [选项] [路径] [查找条件 + 处理动作]
查找路径:指定具体目录路径,默认是当前文件夹
查找条件:指定的查找标准(文件名/大小/类型/权限等),默认是找出所有文件
处理动作:对符合条件的文件做什么操作,默认输出屏幕
3.3.1、查找条件
- 根据文件名查找
[root@localhost ~]# find /etc -name "ifcfg-ens33"
[root@localhost ~]# find /etc -iname "ifcfg-ens33" # 忽略大小写
[root@localhost ~]# find /etc -iname "ifcfg*"
- 按文件大小
[root@localhost ~]# find /etc -size +5M # 大于5M
[root@localhost ~]# find /etc -size 5M # 等于5M
[root@localhost ~]# find /etc -size -5M # 小于5M
[root@localhost ~]# find /etc -size +5M -ls # 找到的处理动作-ls
- 指定查找的目录深度
[root@localhost ~]# find / -maxdepth 3 -a -name "ifcfg-ens33" # 最大查找深度
# -a是同时满足,-o是或
[root@localhost ~]# find / -mindepth 3 -a -name "ifcfg-ens33" # 最小查找深度
- 按时间找
[root@localhost ~]# find /etc -mtime +5 # 修改时间超过5天
[root@localhost ~]# find /etc -mtime 5 # 修改时间等于5天
[root@localhost ~]# find /etc -mtime -5 # 修改时间5天以内
- 按照文件属主、属组找,文件的属主和属组,会在下一篇详细讲解。
[root@localhost ~]# find /home -user xwz # 属主是xwz的文件
[root@localhost ~]# find /home -group xwz
[root@localhost ~]# find /home -user xwz -group xwz
[root@localhost ~]# find /home -user xwz -a -group root
[root@localhost ~]# find /home -user xwz -o -group root
[root@localhost ~]# find /home -nouser # 没有属主的文件
[root@localhost ~]# find /home -nogroup # 没有属组的文件
- 按文件类型
[root@localhost ~]# find /dev -type d
- 按文件权限,文件权限会在下一篇详细讲解
[root@localhost ~]# find / -perm 644 -ls
[root@localhost ~]# find / -perm -644 -ls # 权限小于644的
[root@localhost ~]# find / -perm 4000 -ls
[root@localhost ~]# find / -perm -4000 -ls
- 按正则表达式
[root@localhost ~]# find /etc -regex '.*ifcfg-ens[0-9][0-9]'
# .* 任意多个字符
# [0-9] 任意一个数字
- 条件组合
- -a:多个条件and并列
- -o:多个条件or并列
- -not:条件取反
3.3.2、处理动作
- ‐print:默认的处理动作,显示至屏幕
- ‐ls:类型于对查找到的文件执行
ls ‐l
命令 - ‐delete:删除查找到的文件
- ‐fls /path/to/somefile:查找到的所有文件的长格式信息保存至指定文件中
- *‐ok COMMAND {}*:对查找到的每个文件执行由COMMAND指定的命令,需要确认
- *‐exec COMMAND {} *:对查找到的每个文件执行由COMMAND指定的命令,不需要确认
- {}:用于引用查找到的文件名称自身
下面的实例大家学习完后续用户权限管理之后,就可以完全看的懂了
3.3.3、实例
- 查找/var目录下属主为root,且属组为mail的所有文件或目录
[root@localhost ~]# find /var ‐user root ‐group mail
- 查找/usr目录下不属于root,bin或Hadoop的所有文件或目录
[root@localhost ~]# find /usr ‐not ‐user root ‐a ‐not ‐user bin ‐a ‐not ‐user centos
[root@localhost ~]# find /usr ‐not \(‐user root ‐o ‐user bin ‐o ‐user hadoop\)
- 查找/etc目录下最近一周内容曾被修改过的文件或目录
[root@localhost ~]# find /etc/ ‐mtime ‐7
- 查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录
[root@localhost ~]# find / \(‐nouser ‐o ‐nogroup\) ‐a ‐atime ‐7
- 查找/etc目录下大于1M且类型为普通文件的所有文件或目录
[root@localhost ~]# find /etc ‐size +1M ‐type f
- 查找/etc目录下所有用户都没有写权限的文件
[root@localhost ~]# find /etc ‐not ‐perm /222
- 查找/etc目录下至少一类用户没有执行权限的文件
[root@localhost ~]# find /etc ‐not ‐perm ‐111
- 查找/etc/init.d目录下,所有用户都执行权限,且其它用户写权限的文件
[root@localhost ~]#find /etc/init.d ‐perm ‐113
四、用户权限管理
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
为了更加方便的管理多个用户,就出现了用户组的概念,关于用户和用户组:
- 系统上的每个进程(运行的程序)都是作为特定用户运行
- 每个文件是由一个特定的用户拥有
- 访问文件和目录受到用户的限制
- 与正在运行的进程相关联的用户确定该进程可访问的文件和目录
实现用户账号的管理,要完成的工作主要有如下几个方面:
- 用户账号的添加、删除与修改
- 用户口令的管理
- 用户组的管理
1、用户和用户组查看
1.1、id
用于显示用户的ID,以及所属群组的ID
id会显示用户以及所属群组的实际与有效ID。若两个ID相同,则仅显示实际ID。若仅指定用户名称,则显示目前用户的ID。
id [OPTION]... [USER]
- -g:显示用户所属群组的ID。
- -G:显示用户所属附加群组的ID。
- -n:显示用户,所属群组或附加群组的名称。
- -r:显示实际用户ID。
- -u:显示有效用户ID。
1.1.1、uid的约定
Linux操作系统会依据用户的uid数值来判定这个用户的角色,分别如下
- 0:超级管理员,也就是root,在linux系统中拥有所有权力
- 1~999:系统用户,系统用户往往是用来约束系统中的服务的
- 1000+:普通用户,可以用来登陆和使用Linux操作系统
关于root用户
- uid是0
- 拥有操作系统所有权力
- 该用户有权力覆盖文件系统上的普通权限
- 安装或删除软件并管理系统文件和目录
- 大多数设备只能由root控制
1.1.2、实例
- 查看当前登陆的用户信息
[root@localhost ~]# id
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
- 查看文件的拥有者
[root@localhost ~]# ll anaconda-ks.cfg
-rw-------. 1 root root 1241 4月 4 16:53 anaconda-ks.cfg
- 查看运行进程的用户名,ps命令会在后面进程管理部分讲解
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S 09:06 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 09:06 0:01 [ksoftirqd/0]
root 4 0.1 0.0 0 0 ? R 09:06 0:09 [kworker/0:0]
root 5 0.0 0.0 0 0 ? S< 09:06 0:00 [kworker/0:0H]
1.2、相关的文件
之前说过Linux一切皆文件,所以用户和用户组相关的信息也都是保存在文本文件中的,下面列举出相关的文件。
1.2.1、passwd文件
用于保存用户的信息,一般第一行是root用户,下面都是其他用户
[root@localhost ~]# head -n 1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 这个格式为用户名:密码:uid:gid:描述:家目录:登陆后执行的命令
1.2.2、shadow文件
格式中密码占位置太长了,所以使用x来替代,Linux系统会到shadow中查找x部分的的密码内容
[root@localhost ~]# head -n 1 /etc/shadow
root:$6$frokclXSnQa8EbKs$pWElbjPlmxjYh30tr8qLsTQVOhuPg7GmW9Sanm2yXAK8TNMgje1gyc/vwPgqvmSMf6VaoEvveM0gFvtETmXy/.::0:99999:7:::
# 这个格式为用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段
格式不需要大家记住,只需要知道关于这个用户的密码和有效期都在这个文件中即可。 密码在passwd
文件中会使用加密算法加密,所以别想知道我的密码是什么,加密算法默认是$6
,这个类型6的加密算法是sha-512。我们也可以在man手册中看到对shadow文件的详细解释。
[root@localhost ~]# man 5 shadow
# man手册一个有9个章节,其中第5个章节是对文件格式的说明
# 对man手册感兴趣的同学,也可以自己在网上查找学习man手册的更多内容
1.2.3、group文件
用户和组的对应关系,会保存在group文件中
[root@localhost ~]# head -n 1 /etc/group
root:x:0:
# 这个格式是组名:口令:组标识号:组内用户列表
3、用户组管理
3.1、添加用户组:groupadd
groupadd 命令用于创建一个新的工作组,新工作组的信息将被添加到系统文件中
groupadd [选项] 组
3.1.1、选项
- -g:指定新建工作组的 id;
- -r:创建系统工作组,系统工作组的组ID小于 500;
- -K:覆盖配置文件
/etc/login.defs
- -o:允许添加组 ID 号不唯一的工作组。
- -f:如果指定的组已经存在,此选项将失明了仅以成功状态退出。当与 -g 一起使用,并且指定的GID_MIN已经存在时,选择另一个唯一的GID(即-g关闭)。
3.1.2、实例
- 按照下图创建组,并且指定gid,并且检查是否成功
[root@localhost ~]# groupadd hr -g 1000
[root@localhost ~]# groupadd sale -g 2000
[root@localhost ~]# groupadd it -g 3000
[root@localhost ~]# groupadd fd -g 4000
[root@localhost ~]# tail -n 4 /etc/group
hr:x:1000:
sale:x:2000:
it:x:3000:
fd:x:4000:
3.2、修改用户组:groupmod
groupmod命令用于更改群组识别码或名称
groupmod [选项] 组
3.2.1、选项
- -g:将组 ID 改为 GID
- -n:改名为 NEW_GROUP
- -o:允许使用重复的 GID
3.2.2、实例
- 修改fd组的名字为finance
[root@localhost ~]# groupmod -n finance fd
[root@localhost ~]# tail -n 1 /etc/group
finance:x:4000:
3.3、删除用户组:groupdel
groupdel命令用于删除群组
需要从系统上删除群组时,可用groupdel(group delete)指令来完成这项工作。倘若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。
groupdel [组名]
3.3.1、实例
- 删除一个用户组
[root@localhost ~]# groupadd test
[root@localhost ~]# groupdel test
3.4、用户组成员管理:gpasswd
gpasswd 是 Linux 下工作组文件 /etc/group 和 /etc/gshadow 管理工具,用于将一个用户添加到组或者从组中删除
gpasswd [选项] 组
3.4.1、选项
- -a:添加用户到组;
- -d:从组删除用户;
- -A:指定管理员;
- -M:替换组中的全部用户列表,不包含在内的用户将会从组中删除;
- -R:限制用户登入组,只有组中的成员才可以用newgrp加入该组。
3.4.2、实例
- 创建用户itadmin,并且将其加入it组
[root@localhost ~]# useradd itadmin
[root@localhost ~]# gpasswd -a itadmin it
正在将用户“itadmin”加入到“it”组中
[root@localhost ~]# cat /etc/group |grep it:
it:x:3000:itadmin
# 在组文件中,可以看到这个组的成员
[root@localhost ~]# id itadmin
uid=6667(itadmin) gid=6667(itadmin) 组=6667(itadmin),3000(it)
# 在用户的信息中,可以看到这个用户的所属组
4、用户管理
4.1、添加用户:useradd
useradd可以用来添加新的用户账号
useradd [选项] 用户名
4.1.1、选项
- -c comment:指定一段注释性描述。
- -d 目录:指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
- -m:创建用户的主目录
- -g 用户组:指定用户所属的用户组,默认会创建一个和用户名同名的用户组。
- -G 用户组:用户组 指定用户所属的附加组,一个用户可以属于多个附加组。
- -s Shell文件:指定用户的登录Shell。
- -u 用户号:指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
4.1.2、实例
- 添加一般用户
[root@localhost ~]# useradd user01
- 为添加的用户指定相应的用户组
[root@localhost ~]# useradd -g root user02
- 为新添加的用户指定home目录
[root@localhost ~]# useradd -d /home/test user03
- 建立一个不给登录的用户
[root@localhost ~]# useradd -s /sbin/nologin user04
- 查看用户描述信息
[root@localhost ~]# cat /etc/passwd |grep user02
user02:x:1004:1004:this is nginx user:/home/user02:/bin/bash
4.2、切换用户:su
su命令用户Linux系统中的用户切换
4.2.1、用法:
su [选项] 用户名
4.2.2、常用选项:
-
:以目标用户的环境变量启动新会话。这将模拟用户完全登录到新用户账户,包括其家目录、环境变量等。-c 命令
:执行指定的命令,并在执行完毕后返回原始用户。-s shell
:使用指定的 shell 替代目标用户的默认 shell。
4.3、修改用户:usermod
usermod命令用于修改用户帐号
usermod可用来修改用户帐号的各项设定
usermod [选项] 登录
4.3.1、选项
- -c<备注>:修改用户帐号的备注文字。
- -a:追加,默认的修改是覆盖
- -d登入目录>:修改用户登入时的目录。
- -e<有效期限>:修改帐号的有效期限。
- -f<缓冲天数>:修改在密码过期后多少天即关闭该帐号。
- -g<群组>:修改用户所属的群组。
- -G<群组>:修改用户所属的附加群组。
- -l<帐号名称>:修改用户帐号名称。
- -L:锁定用户密码,使密码无效。
- -s:修改用户登入后所使用的shell。
- -u:修改用户ID。
- -U:解除密码锁定。
4.3.2、实例
- 更改登录的目录
[root@localhost ~]# usermod -d /home user01
[root@localhost ~]# su - user01
-bash-4.2$ pwd
/home
- 改变用户的uid
[root@localhost ~]# usermod -u 6666 user02
4.4、删除用户:userdel
userdel命令用于删除用户帐号
userdel可删除用户帐号与相关的文件。若不加参数,则仅删除用户帐号,而不删除相关文件
userdel [-r][用户帐号]
4.4.1、选项
- -r:删除用户登入目录以及目录中所有文件
4.4.2、实例
- 删除用户账号
[root@localhost ~]# userdel user04
- 删除用户账户和家目录
[root@localhost ~]# userdel -r user03
5、passwd文件中的shell
查看/etc/passwd
文件会发现在每行的最后是登录成功之后执行的命令,有两种是使用最为频繁的:
- /bin/bash:这个是Linux的命令行工具,我们正常登陆之后默认就是进入命令行
- /sbin/nologin:如果写成nologin,那么用户将无法登录,有些用户是作为进程权限管理而存在的,不需要登录。如果提供登录的功能反而不安全,所以写成nologin
[root@localhost ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
我们可以新建一个用户,然后尝试自定义登录成功之后执行的命令,用来加深印象。
[root@localhost ~]# useradd test01
[root@localhost ~]# tail -n 1 /etc/passwd
test01:x:1000:1000::/home/test01:/bin/vi
切换到test01用户,会发现自动进入vi的界面,说明最后的这个段内容就是用户登录之后会运行的程序
6、用户密码管理
root用户可以直接设置普通用户密码,普通用户必须要提供原密码,才可以修改自己密码。
6.1、passwd
passwd命令用来更改使用者的密码
passwd [选项...] <帐号名称>
6.1.1、选项
- -k:保持身份验证令牌不过期
- -d:删除已命名帐号的密码(只有根用户才能进行此操作)
- -l:锁定指名帐户的密码(仅限 root 用户)
- -u:解锁指名账户的密码(仅限 root 用户)
- -x:密码的最长有效时限(只有根用户才能进行此操作)
- -n:密码的最短有效时限(只有根用户才能进行此操作)
- -w:在密码过期前多少天开始提醒用户(只有根用户才能进行此操作)
- -i:当密码过期后经过多少天该帐号会被禁用(只有根用户才能进行此操作)
- -S:报告已命名帐号的密码状态(只有根用户才能进行此操作)
- --stdin:从标准输入读取令牌(只有根用户才能进行此操作)
6.1.2、实例
- 修改test01用户密码
[root@localhost ~]# passwd test01
更改用户 test01 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
- 使用管道符设置用户密码
[root@localhost ~]# echo 123456 | passwd --stdin test01
更改用户 test01 的密码 。
passwd:所有的身份验证令牌已经成功更新。
6.2、login.defs文件
/etc/login.defs
文件是用来创建用户时进行一定的限制,但是优先级低于/etc/passwd
和/etc/shadow
,如果有冲突的地方,系统会以/etc/passwd
和/etc/shadow
为准
下面是这个文件的内容,egrep命令我们后续会讲到,这边可以理解为不看文件的注释和空行。
[root@localhost ~]# egrep -v '^[ ]*$|^#' /etc/login.defs
MAIL_DIR /var/spool/mail # 系统消息(邮件)文件夹
PASS_MAX_DAYS 99999 # 密码有效最大天数
PASS_MIN_DAYS 0 # 密码有效最小天数
PASS_MIN_LEN 5 # 密码长度
PASS_WARN_AGE 7 # 密码失效警告倒计时
UID_MIN 1000 # 用户UID最小1000
UID_MAX 60000 # 用户UID最大60000
SYS_UID_MIN 201 # 系统用户UID最小201
SYS_UID_MAX 999 # 系统用户UID最大999
GID_MIN 1000 # 用户组GID最小1000
GID_MAX 60000 # 用户组GID最大60000
SYS_GID_MIN 201
SYS_GID_MAX 999
CREATE_HOME yes # 创建家目录
UMASK 077 # 创建文件/目录的权限掩码
USERGROUPS_ENAB yes # 创建用户时同时生成组是 如果此处是no 创建的用户 会是gid=100(users)groups=100(users)
ENCRYPT_METHOD SHA512 # 加密 方法 sha 512 这个方法生成的密码在/etc/shadow里面的第二列会以$6$开头
6.3、chage
chage是用于更改用户密码过期信息
chage [选项] 登录
6.3.1、选项
- -d:将最近一次密码设置时间设为“最近日期”
- -E 过期日期:将帐户过期时间设为“过期日期”
- -I INACITVE:设置密码过期多少天后后,将密码设定为失效状态
- -l:显示帐户时间信息
- -m 最小天数:设置两次改变密码之间相距的最小天数
- -M 最大天数:设置将两次改变密码之间相距的最大天数
- -W 警告天数:设置密码过期前的警告天数
6.3.2、实例
- 强制用户在下次登录的时候换密码
[root@localhost ~]# chage -d 0 test01
[root@localhost ~]# logout
You must change your password now and login again!
更改用户 test01 的密码 。
为 test01 更改 STRESS 密码。
(当前)UNIX 密码:
小知识:当你新建用户的时候,用户的home目录下会有一些默认的隐藏文件,这些隐藏文件是在创建用户的时候从/etc/skel/
中复制过去的。
7、sudoers
Linux是多用户多任务的操作系统, 共享该系统的用户往往不只一个。出于安全性考虑, 有必要通过useradd创建一些非root用户, 只让它们拥有不完全的权限; 如有必要,再来提升权限执行。
sudo就是来解决这个需求的: 这些非root用户不需要知道root的密码,就可以提权到root,执行一些root才能执行的命令。
sudo [选项] [用户名] [命令]
7.1、sudo命令执行过程
- 当用户执行sudo时,系统会主动寻找
/etc/sudoers
文件,判断该用户是否有执行sudo的权限 - 确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认
- 若密码输入成功,则开始执行sudo后续的命令
7.2、赋予用户sudo操作的权限
通过useradd添加的用户,并不具备sudo权限。在ubuntu/centos等系统下, 需要将用户加入admin组或者wheel组或者sudo组。以root用户身份执行如下命令, 将用户加入wheel/admin/sudo组。
usermod -a -G wheel <用户名>
如果提示wheel组不存在, 则还需要先创建该组
groupadd wheel
7.3、配置文件
sudo的权限控制可以在/etc/sudoers
文件中查看到。一般来说,通过cat /etc/sudoers指令来查看该文件, 会看到如下几行代码。
[root@localhost ~]# egrep -v '^[ ]*$|^#' /etc/sudoers
=====省略=====
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
对/etc/sudoers文件进行编辑的代码公式可以概括为
授权用户/组 主机=[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,...
字段1 字段2 =[(字段3)] [字段4] 字段5
凡是[ ]中的内容, 都能省略; 命令和命令之间用,
号分隔,字段3、字段4,是可以省略的。
- "字段1"不以%号开头的表示"将要授权的用户",以%号开头的表示"将要授权的组"。
- "字段2"表示允许登录的主机, ALL表示所有,;如果该字段不为ALL,表示授权用户只能在某些机器上登录本服务器来执行sudo命令
- 比如:
jack mycomputer=/usr/sbin/reboot,/usr/sbin/shutdown
表示: 普通用户jack在主机(或主机组)mycomputer上, 可以通过sudo执行reboot和shutdown两个命令 - "字段3"如果省略, 相当于(root:root),表示可以通过sudo提权到root,如果为(ALL)或者(ALL:ALL), 表示能够提权到(任意用户:任意用户组)。
- "字段4"的可能取值是NOPASSWD:。请注意NOPASSWD后面带有冒号:。表示执行sudo时可以不需要输入密码。
- 比如:
lucy ALL=(ALL) NOPASSWD: /bin/useradd
表示: 普通用户lucy可以在任何主机上, 通过sudo执行/bin/useradd命令, 并且不需要输入密码 - 比如:
peter ALL=(ALL) NOPASSWD: ALL
,表示: 普通用户peter可以在任何主机上, 通过sudo执行任何命令, 并且不需要输入密码。 - "字段5"是使用逗号分开一系列命令,这些命令就是授权给用户的操作; ALL表示允许所有操作。命令都是使用绝对路径, 这是为了避免目录下有同名命令被执行,从而造成安全隐患。
- 如果你将授权写成如下安全性欠妥的格式:
lucy ALL=(ALL) chown,chmod,useradd
那么用户就有可能创建一个他自己的程序, 也命名为userad, 然后放在它的本地路径中, 如此一来他就能够使用root来执行这个"名为useradd的程序"。这是相当危险的!
7.4、编辑配置文件
在实践中,去编辑/etc/sudoers
文件,系统提示我没权限,这是因为/etc/sudoers
的内容如此敏感,以至于该文件是只读的。所以,编辑该文件前,请确认清楚你知道自己正在做什么。
强烈建议通过visudo
命令来修改该文件,通过visudo
修改,如果配置出错,会有提示。
官方文档推荐的做法,不是直接修改/etc/sudoers
文件,而是将修改写在/etc/sudoers.d/
目录下的文件中。如果使用这种方式修改sudoers,需要在/etc/sudoers
文件的最后行,加上#includedir /etc/sudoers.d
一行(默认已有)。需要注意,这个#includedir /etc/sudoers.d
中的#
并不是注释,请勿修改。
7.5、sudo选项
- -u:以指定用户或 ID 运行命令(或编辑文件)
- -l:显示出自己(执行 sudo 的使用者)的权限
- -b:将要执行的指令放在后台执行
- -i: 以目标用户身份运行一个登录 shell;可同时指定一条命令。相当于切换到root,不过只需要用户自己的密码即可。
7.6、实例
- 以管理员身份查看shadow文件
[root@localhost ~]# useradd user
[root@localhost ~]# echo 123456 | passwd --stdin user
[root@localhost ~]# usermod -a -G wheel user
[root@localhost ~]# su - user
[user@localhost ~]$ cat /etc/shadow
cat: /etc/shadow: 权限不够
[user@localhost ~]$ sudo -u root cat /etc/shadow
[sudo] user 的密码:
[user@localhost ~]$ sudo cat /etc/shadow
# sudo -u root用的比较多,可以被精简为sudo
- 查看下列示例
papi ALL=(root) NOPASSWD: /bin/chown,/usr/sbin/useradd
* 表示: 用户papi能在所有可能出现的主机上, 提权到root下执行`/bin/chown`, 不必输入密码; 但运行`/usr/sbin/useradd`命令时需要密码
* 在具有sudo操作的用户下, 执行`sudo -l`可以查看到该用户被允许和被禁止运行的命令
- 查看下列示例
papi ALL=/usr/sbin/,/sbin/,!/usr/sbin/fdisk
* 命令前面加上!号表示取消该命令
* 用户papi在所有可能出现的主机上, 能够运行目录/usr/sbin和/sbin下所有的程序, 但fdisk除外。
- 默认情况下输入一次sudo可以保持15分钟不再要求输入密码,如果想要延长这个时间,可以修改配置文件
[root@localhost ~]# visudo
Defaults env_reset,pwfeedback,timestamp_timeout=60
# 这个是改成60分钟才会需要再次输入密码,并且输入密码的时候会显示*号
五、文件权限管理
1、文件权限
文件权限设置:可以赋予某个用户或组,能够以何种方式,访问某个文件
Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。
为了保护系统的安全性,Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。
在 Linux 中我们通常使用以下两个命令来修改文件或目录的所属用户与权限:
- chown (change ownerp) : 修改所属用户与组。
- chmod (change mode) : 修改用户的权限。
在 Linux 中我们可以使用 ll 或者 ls –l 命令来显示一个文件的属性以及文件所属的用户和组
每个文件的属性由左边第一部分的 10 个字符来确定(如下图)。
从左至右用 0-9 这些数字来表示。
- 第 0 位确定文件类型,第 1-3 位确定属主(该文件的所有者)拥有该文件的权限。
- 第4-6位确定属组(所有者的同组用户)拥有该文件的权限,第7-9位确定其他用户拥有该文件的权限。
- 其中,第 1、4、7 位表示读权限,如果用
r
字符表示,则有读权限,如果用-
字符表示,则没有读权限; - 第 2、5、8 位表示写权限,如果用
w
字符表示,则有写权限,如果用-
字符表示没有写权限;第 3、6、9 位表示可执行权限,如果用x
字符表示,则有执行权限,如果用-
字符表示,则没有执行权限。
2、修改文件属主chown
chown用于设置文件所有者和文件关联组的命令
chown 需要超级用户root
的权限才能执行此命令
chown [选项]... [所有者][:[组]] 文件...
2.1、选项
- -R: 处理指定目录以及其子目录下的所有文件
- -v: 显示详细的处理信息
2.2、实例
- 设置所有者为root
[root@localhost ~]# chown root anaconda-ks.cfg
- 将文件的拥有者设置为user01,允许使用的组设置为it
[root@localhost ~]# chown user01:it file.txt
- 将目录下的所有文件拥有者设置为user01,允许使用的组设置为it
[root@localhost ~]# chown -R user01:it dir/*
3、修改文件权限chmod
chmod是控制用户对文件的权限的命令
chmod [选项]... 模式[,模式]... 文件...
3.1、模式
mode : 权限设定字串,格式如下 :
[ugoa...][[+-=][rwx]...][,...]
u
表示该文件的拥有者,g
表示与该文件的拥有者属于同一个群体(group)者,o
表示其他以外的人,a
表示这三者皆是。+
表示增加权限、-
表示取消权限、=
表示唯一设定权限。r
表示可读取,w
表示可写入,x
表示可执行r``w``x
权限对文件和目录的意义
权限 | 对文件的影响 | 对目录的影响 |
---|---|---|
r(读取) | 可以读取文件的内容 | 可以列出目录的内容(文件名),可以使用ls命令 |
w(写入) | 可以更改文件的内容 | 可以创建或删除目录中的任一文件,可以使用touch、rm命令 |
x(可执行) | 可以作为命令执行文件 | 可以访问目录的内容(取决于目录中文件的权限),可以使用cd命令 |
3.2、八进制语法
chmod命令可以使用八进制数来指定权限。文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件所有者(User)的读、写、执行,用户组(Group)的读、写、执行以及其它用户(Other)的读、写、执行。历史上,文件权限被放在一个比特掩码中,掩码中指定的比特位设为1,用来说明一个类具有相应的优先级。
# | 权限 | rwx | 二进制 |
---|---|---|---|
7 | 读 + 写 + 执行 | rwx | 111 |
6 | 读 + 写 | rw- | 110 |
5 | 读 + 执行 | r-x | 101 |
4 | 只读 | r-- | 100 |
3 | 写 + 执行 | -wx | 011 |
2 | 只写 | -w- | 010 |
1 | 只执行 | --x | 001 |
0 | 无 | --- | 000 |
例如, 765 将这样解释:
- 所有者的权限用数字表达:属主的那三个权限位的数字加起来的总和。如 rwx ,也就是 4+2+1 ,应该是 7。
- 用户组的权限用数字表达:属组的那个权限位数字的相加的总和。如 rw- ,也就是 4+2+0 ,应该是 6。
- 其它用户的权限数字表达:其它用户权限位的数字相加的总和。如 r-x ,也就是 4+0+1 ,应该是 5。
3.3、选项
- -f: 若该文件权限无法被更改也不要显示错误讯息
- -v: 显示权限变更的详细资料
- -R: 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
3.4、实例
- 限制用户user1对
file
文件的写入
[root@localhost ~]# chmod a-w /home/user1/file
[root@localhost ~]# ls -lh /home/user1/file
-r--r--r--. 1 user1 user1 0 4月 13 10:56 /home/user1/file
[root@localhost ~]# su - user1
上一次登录:二 4月 13 10:47:41 CST 2021pts/1 上
[user1@localhost ~]$ echo "hello world" >> file
-bash: file: 权限不够
- 限制用户user1删除dir目录下的文件
[root@localhost ~]# chmod a-w /home/user1/dir/
[root@localhost ~]# ls -lhd /home/user1/dir
dr-xr-xr-x. 2 user1 user1 18 4月 13 10:58 /home/user1/dir
[root@localhost ~]# su - user1
上一次登录:二 4月 13 10:57:11 CST 2021pts/1 上
[user1@localhost ~]$ cd dir/
[user1@localhost dir]$ rm -rf test
rm: 无法删除"test": 权限不够
对目录有w权限,可以在目录中创建新文件,可以删除文件夹中的文件(跟文件权限无关),至于为什么可以这样,我们在磁盘管理的部分讲解。
4、文件访问控制列表
文件访问控制列表(Access Control Lists,ACL)是Linux开的一套新的文件系统权限管理方法。
传统的Linux文件系统的权限控制是通过user、group、other与r(读)、w(写)、x(执行)的不同组合来实现的。随着应用的发展,这些权限组合已不能适应现时复杂的文件系统权限控制要求。例如,我们可能需把一个文件的读权限和写权限分别赋予两个不同的用户或一个用户和一个组这样的组合。传统的权限管理设置起来就力不从心了。
文件访问控制列表可以针对文件单独设置某个用户或者用户组队文件的管理权限。
4.1、getfacl命名
获取文件访问控制列表的详细内容
getfacl [-aceEsRLPtpndvh] file ...
4.1.1、选项
- -a:仅显示文件访问控制列表
- -d:仅显示默认的访问控制列表
- -c:不显示注释表头
- -e:显示所有的有效权限
- -E:显示无效权限
- -R:递归显示子目录
- -t:使用制表符分隔的输出格式
4.1.2、实例
- 查看acl权限列表
[root@localhost ~]# getfacl anaconda-ks.cfg
# file: anaconda-ks.cfg
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
- 查看acl权限列表,不显示注释表头
[root@localhost ~]# getfacl -c anaconda-ks.cfg
user::rwx
group::r-x
other::r-x
4.2、setfacl命令
用来设置更精确的文件权限
setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
4.2.1、选项
- -m:更改文件的访问控制列表
- -M:从文件读取访问控制列表条目更改
- -x:根据文件中访问控制列表移除条目
- -X:从文件读取访问控制列表条目并删除
- -b:删除所有扩展访问控制列表条目
- -k:移除默认访问控制列表
- -d:应用到默认访问控制列表的操作
- -R:递归操作子目录
4.2.2、实例
- 给指定用户添加acl权限
- 首先用户user1是没有
/workdir
的权限的
[root@localhost ~]# groupadd worker
[root@localhost ~]# mkdir /workdir
[root@localhost ~]# chown root:worker /workdir
[root@localhost ~]# chmod 770 /workdir # 不允许其他用户对目录的权限
[root@localhost ~]# ll -d /workdir/
drwxrwx---. 2 root worker 6 4月 14 09:14 /workdir/
[root@localhost ~]# su - user1
[user1@localhost ~]$ cd /workdir/
-bash: cd: /workdir/: 权限不够
- 单独给予user1的可读和可进入权限
[root@localhost ~]# setfacl -m u:user1:rx /workdir/
[root@localhost ~]# getfacl -c /workdir
user::rwx
user:user1:r-x # 成功添加user1对workdir的权限
group::rwx
mask::rwx
other::---
[root@localhost ~]# su - user1
[user1@localhost ~]$ cd /workdir/
[user1@localhost workdir]$ ll -d
drwxrwx---+ 2 root worker 6 4月 14 09:14 . # 权限位后面多了一个"+",表示存在ACL权限
[user1@localhost workdir]$ touch file
touch: 无法创建"file": 权限不够
- 移除user1的访问控制列表权限
[root@localhost ~]# setfacl -x u:user1 /workdir/
[root@localhost ~]# getfacl -c /workdir/
user::rwx
group::rwx
mask::rwx
other::---
- 创建worker2组,然后给这个组访问acl的权限,将user1加入worker2组验证是否成功
[root@localhost ~]# groupadd worker2
[root@localhost ~]# setfacl -m g:worker2:rwx /workdir
[root@localhost ~]# usermod -aG worker2 user1
[root@localhost ~]# su - user1
[user1@localhost ~]$ cd /workdir/
[user1@localhost workdir]$ touch file
- 对workdir设置的acl权限并不会被之后在workdir下创建的子文件和子目录继承,可以设置默认ACL权限,来让目录下面的新建文件和文件夹都继承父目录的权限
[root@localhost ~]# setfacl -b /workdir
[root@localhost ~]# setfacl -m d:u:user1:rx /workdir
# 在前面加上一个d,就可以设置默认facl权限
[root@localhost ~]# getfacl -c /workdir
user::rwx
group::rwx
other::---
default:user::rwx # 前面多出来了default
default:user:user1:r-x
default:group::rwx
default:mask::rwx
default:other::---
[root@localhost ~]# touch /workdir/newfile
[root@localhost ~]# getfacl -c /workdir/newfile
user::rw-
user:user1:r-x #effective:r-- # 新建的文件会自动继承
group::rwx #effective:rw-
mask::rw-
other::---
5、mask有效权限
mask 权限,指的是用户或群组能拥有的最大 ACL 权限,也就是说,给用户或群组设定的 ACL 权限不能超过 mask 规定的权限范围,超出部分做无效处理。
注意上面的案例,在newfile的facl中,有一个mask权限是rw-
,所以我们即使给了user1r-x
权限,在实际生效的时候,x
也不会有的,注意后面的提示#effective:r--
表示x
权限并没有赋予。
5.1、实例
- 修改上面案例中的newfile的mask权限
[root@localhost ~]# setfacl -m m::rwx /workdir/newfile
[root@localhost ~]# getfacl -c /workdir/newfile
user::rw-
user:user1:r-x
group::rwx
mask::rwx
other::---
6、特殊权限
文件除了上述的r
,w
,x
权限以外,还有三个特殊权限:suid,sgid,sticky
6.1、suid
suid 属性只能运用在可执行文件上,含义是开放文件所有者的权限给其他用户,即当用户执行该执行文件时,会拥有该执行文件所有者的权限。如果给一个非二进制文件文件附加suid权限,则会显示大写S,属于无效。
普通用户能够执行passwd
命令修改自己的密码,修改密码其实就是修改/etc/shadow
这个文件,查看/etc/passwd
这个文件的权限,发现除了root
其他人没有写权限,但是普通用户能够成功执行passwd
,其原因就在于passwd
这个命令的权限是-rwsr-xr-x
,其中s
的作用就是让执行命令的人具有和该命令拥有者相同的权限。
[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd
6.1.1、实例
- 切换成普通用户输入修改密码命令
[root@localhost ~]# su - user1
[user1@localhost ~]$ passwd
更改用户 user1 的密码 。
为 user1 更改 STRESS 密码。
(当前)UNIX 密码:
- 保持这个会话别端口,新建一个ssh会话,查看系统进程,可以看到当前是调用root用户执行的passwd命令
[root@localhost ~]# ps -aux |grep passwd
root 7521 0.0 0.1 170760 2052 pts/0 S+ 10:24 0:00 passwd
- 如果想自己添加suid权限,可以输入下面两个命令
chmod u+s file
chmod 4765 file
要设置特殊权限,可以使用chmod
命令的4位数字表示法,其中第一位用于特殊权限,后三位分别代表所有者、组和其他用户的权限。特殊权限的设置如下:
- 4
: 设置setuid。 - 2
: 设置setgid。 - 1
: 设置sticky bit。
以下是一些设置特殊权限的例子:
- 设置setuid: chmod u+s file
- 设置setgid: chmod g+s file
- 设置sticky bit: chmod o+t /dir
如果你想要将特殊权限与其他权限组合使用,可以这样:
- 设置文件的setuid和可读可执行权限:chmod 4555 file
- 设置目录的setgid和可读可执行可进入权限:chmod 2775 /dir
请注意,特殊权限的设置需要谨慎,因为它们可能会影响系统的安全性和文件的访问控制。通常,只有系统管理员或有经验的用户才会设置这些权限。
6.2、sgid
sgid 属性可运用于文件或者目录,运用在文件的含义是开放文件所属组的权限给其他用户,即当用户执行该执行文件时,会拥有该执行文件所属组用户的权限。如果给一个非二进制文件文件附加sgid权限,则会显示大写S,属于无效。
运用在目录上的含义是,在该目录下所有用户创建的文件或者目录的所属组都和其一样。即如果/home/user1
目录具有sgid权限,且所属组是user1
,则任何用户在/home/user1
下创建的子目录或者文件的所属组都是user1
。
6.2.1、实例
- 设置sgid,让用户在workdir下创建的文件都属于worker组
[root@localhost /]# chmod g+s workdir/
[root@localhost /]# cd workdir/
[root@localhost workdir]# touch file
[root@localhost workdir]# ls -l
总用量 0
-rw-rw----+ 1 root worker 0 4月 14 11:05 file
6.3、sticky
sticky 权限只能运用于目录上,含义是该目录下所有的文件和子目录只能由所属者删除,即使其的权限是777或者其他。一个公共目录,每个人都可以创建文件,删除自己的文件,但不能删除别人的文件(仅对目录有效)。
6.3.1、实例
- 设置sticky,让普通用户只能创建文件,不能删除文件
[root@localhost ~]# chmod 777 /workdir/
[root@localhost ~]# chmod o+t /workdir/
[root@localhost ~]# su - user1
[user1@localhost ~]$ cd /workdir/
[user1@localhost workdir]$ touch user1file
[user1@localhost workdir]$ exit
登出
[root@localhost ~]# su - user2
[user2@localhost ~]$ cd /workdir/
[user2@localhost workdir]$ touch user2file
[user2@localhost workdir]$ rm -rf user1file # 不给删除别人的文件
rm: 无法删除"user1file": 不允许的操作
[user2@localhost workdir]$ rm -rf user2file # 只能删除自己的文件
[user2@localhost workdir]$ ll
总用量 0
-rw-rw----+ 1 user1 worker 0 4月 14 11:11 user1file
7、chattr文件属性
chattr命令用于改变文件属性。
这项指令可改变存放在文件或目录属性,这些属性共有以下8种模式:
- a:让文件或目录仅供追加用途
- b:不更新文件或目录的最后存取时间
- c:将文件或目录压缩后存放
- i:不得任意更动文件或目录
- s:保密性删除文件或目录
- S:即时更新文件或目录
- u:预防意外删除
chattr [-RV][+/-/=<属性>][文件或目录...]
7.1、选项
- -R:递归处理,将指定目录下的所有文件及子目录一并处理
- -v <版本编号>:设置文件或目录版本
- -V:显示指令执行过程
- + <属性>:开启文件或目录的该项属性
- - <属性>:关闭文件或目录的该项属性
- = <属性>:指定文件或目录的该项属性
7.2、实例
- 用chattr命令防止系统中某个关键文件被修改
[root@localhost ~]# chattr +i /etc/resolv.conf
[root@localhost ~]# lsattr /etc/resolv.conf
----i----------- /etc/resolv.conf
[root@localhost ~]# echo test >> /etc/resolv.conf
-bash: /etc/resolv.conf: 权限不够
- 让某个文件只能往里面追加数据,但不能删除,适用于各种日志文件
[root@localhost ~]# chattr +a /var/log/messages
[root@localhost ~]# lsattr /var/log/messages
-----a---------- /var/log/messages
[root@localhost ~]# echo > /var/log/messages # 不允许清空日志
-bash: /var/log/messages: 不允许的操作
8、umask
umask命令指定在建立文件时预设的权限掩码,进程 新建文件、目录的默认权限会收到umask的影响,umask表示要减掉得到权限。
umask可用来设定[权限掩码]。[权限掩码]是由3个八进制的数字所组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时预设的权限。
umask [选项][权限掩码]
8.1、选项
- -S:以文字的方式来表示权限掩码
8.2、实例
- 查看当前用户的umask权限
[root@localhost ~]# umask
0022
- 查看最终有的权限
[root@localhost ~]# umask -S
u=rwx,g=rx,o=rx
- 修改umask的数值(临时)
[root@localhost ~]# umask 0000
[root@localhost ~]# mkdir dir
[root@localhost ~]# ll
总用量 4
drwxrwxrwx. 2 root root 6 4月 14 11:25 dir
-rw-rw-rw-. 1 root root 0 4月 14 11:25 file
- 修改umask的数值(永久)
[root@localhost ~]# vim /etc/profile
--------------
59 if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
60 umask 002
61 else
62 umask 022
63 fi
---------------
[root@localhost ~]# source /etc/profile # 立即在当前shell中生效
- 通过umask决定新建用户
HOME
目录的权限
[root@localhost ~]# vim /etc/login.defs
-----------------
61 # The permission mask is initialized to this value. If not specified,
62 # the permission mask will be initialized to 022.
63 UMASK 077
------------------
六、进程管理
1、进程
进程是一个在系统中运行的程序
进程是已启动的可执行程序的运行实例,进程有以下组成部分
- 已分配内存的地址空间
- 安全属性,包括所有权凭据和特权
- 进程代码的一个或多个执行线程
- 进程状态
程序:二进制文件,静态/bin/date
,/usr/sbin/httpd
,/usr/sbin/sshd
,/usr/local/nginx/sbin/ngix
进程:是程序运行的过程,动态,有生命周期及运行状态
2、进程类型
守护进程:在系统引导过程中启动的进程,跟终端无关的进程
前台进程:跟终端相关,通过终端启动的进程
3、进程的生命周期
父进程复制自己的地址空间(fork)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程ID(PID),满足跟踪安全性之需。PID和父进程ID(PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进程都是第一个系统进程的后代。
4、systemd简介
首先 systmed 是一个用户空间的程序,属于应用程序,不属于 Linux 内核范畴。Systemd 是 Linux 系统中最新的初始化系统(init),它主要的设计目标是克服 sysvinit(这个是centos6中的初始化系统)固有的缺点,提高系统的启动速度。
Linux内核加载启动后,用户空间的第一个进程就是初始化进程,这个程序的物理文件约定位于/sbin/init
,当然也可以通过传递内核参数来让内核启动指定的程序。这个进程的特点是进程号为1,代表第一个运行的用户空间进程。不同发行版采用了不同的启动程序,主要有以下几种主流选择:
- 以 Ubuntu 为代表的 Linux 发行版采用 upstart
- centos7.0 版本之前的 System V init
- centos7.0 版本的 systemd
centos7上所有的进程都是systemd的后代,systemd的功能繁多,不仅用来管理服务,还可以管理挂载点,定义定时任务等。这些工作都是由编辑相应的配置单元文件完成的。
4.1、systemd unit 类型
systemd需要管理的功能比较多,所以支持的配置单元类型也比较繁多,我们在日常使用Linux的过程中对系统服务的管理最多,所以我们主要了解一下service
类型即可,其他类型作为一个了解,下面列举出所有类型详细的解释。
单元类型 | 文件格式 | 描述 |
---|---|---|
Service unit | .service | 服务类 |
Target unit | .target | 一个 unit 服务组,用于模拟实现运行级别 |
Automount unit | .automount | 文件系统自动挂载点 |
Device unit | .device | 内核识别的设备文件 |
Mount unit | .mount | 文件系统挂载点 |
Path unit | .path | 文件或目录 |
Scope unit | .scope | 外部创建的进程 |
Slice unit | .slice | A group of hierarchically organized units that manage system processes. |
Snapshot unit | .snapshot | 系统快照 |
Socket unit | .socket | 套接字 |
Swap unit | .swap | 标识 swap 设备 |
Timer unit | .timer | systemd 的计时器 |
4.2、unit 文件保存位置
我们目前了解到文件所在的位置即可,关于文件内部的格式与如何修改这些文件,我们会在后续的服务搭建过程中细讲。
目录 | 描述 |
---|---|
/usr/lib/systemd/system/ | RPM 包安装时分发的 unit 文件 |
/run/systemd/system/ | systemd 运行时创建的文件 |
/etc/systemd/system/ | systemctl enable 创建的 unit 文件 |
5、管理系统服务
systemd 的主要命令行工具是systemctl
systemctl [选项...] {命令} ...
5.1、systemctl常用命令
这边列举出来的命令会在后面的学习过程中经常用到,所以大家只要对本部分中系统管理的命令合集有一个影响即可。
命令 | 描述 |
---|---|
systemctl start name.service | 启动服务 |
systemctl stop name.service | 停止服务 |
systemctl restart name.service | 重启服务(没启动的服务会启动) |
systemctl try-restart name.service | 只重启正在运行的服务 |
systemctl reload name.service | 重载配置文件 |
systemctl status name.service systemctl is-active name.service | 检查服务状态检查服务是否启动 |
systemctl list-units --type service --all | 显示所有的服务状态 |
systemctl enable name.service | 启用开机自启服务 |
systemctl disable name.service | 停用自启服务 |
systemctl status name.service systemctl is-enabled name.service | 检查服务状态查看服务是否自启 |
systemctl list-unit-files --type service | 查看所有服务 |
systemctl list-dependencies --after | 列出在指定服务之前启动的服务(依赖) |
systemctl list-dependencies --before | 列出在指定服务之后启动的服务(被依赖) |
6、ps
ps命令用于显示当前进程的状态,类似于 windows 的任务管理器
ps [选项]
6.1、选项
- -a:列出所有的进程
- -e:列出所有的进程,等同于
-A
- -f:显示不包含资源使用率的相关信息
- ‐H:以进程层级格式显示进程相关信息
- -w:显示加宽可以显示较多的信息
- -u:显示较详细的信息
- -x:显示其他使用者的行程
显示信息的格式说明
列名 | 说明 |
---|---|
USER | 进程拥有者 |
PID | 进程ID |
%CPU | 占用的 CPU 使用率 |
%MEM | 占用的内存使用率 |
VSZ | 占用的虚拟内存大小 |
RSS | 占用的常驻内存大小 |
TTY | 执行的终端编号 |
STAT | 该进程的状态* |
START | 进程开始时间 |
TIME | CPU使用时间 |
COMMAND | 所执行的命令 |
*STAT表示的进程状态有如下几种:
-
D: 无法中断的休眠状态 ,将一直等待事件的发生或等待某种系统资源
-
R: 正在执行中
-
S: 可中断状态
-
T: 暂停执行
-
Z
: 不存在但暂时无法消除,也叫僵尸进程
-
每个进程在运行结束后都会处于僵死状态,等待父进程调用进而释放系统资源,处于该状态的进程已经运行结束,但是它的父进程还没有释放其系统资源
-
W: 没有足够的内存可分配
-
<: 高优先序的进程
-
N: 低优先序的进程
-
+:前台进程
-
l:多线程进程
-
s:主进程(先导进程)
6.2、实例
- 常用组合:ps aux
u:以用户为中心组织进程状态信息显示
a:与终端相关的进程;
x:与终端无关的进程;
[root@localhost ~]# ps aux | head -n 5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 128144 6656 ? Ss 5月10 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 5月10 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 5月10 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 5月10 0:00 [kworker/0:0H]
- 常用组合:ps -ef
-e:显示所有进程
-f:显示完整格式程序信息
[root@localhost ~]# ps -ef |head -n 10
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 5月10 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 5月10 ? 00:00:00 [kthreadd]
root 3 2 0 5月10 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 5月10 ? 00:00:00 [kworker/0:0H]
root 6 2 0 5月10 ? 00:00:00 [kworker/u256:0]
root 7 2 0 5月10 ? 00:00:00 [migration/0]
root 8 2 0 5月10 ? 00:00:00 [rcu_bh]
root 9 2 0 5月10 ? 00:00:01 [rcu_sched]
root 10 2 0 5月10 ? 00:00:00 [lru-add-drain]
- 常用组合:ps -efH
查看进程以层级格式(类似于pstree命令)
[root@localhost ~]# ps -efH
root 1 0 0 14:26 ? 00:00:00 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 479 1 0 14:26 ? 00:00:00 /usr/lib/systemd/systemd-journald
root 500 1 0 14:26 ? 00:00:00 /usr/sbin/lvmetad -f
root 507 1 0 14:26 ? 00:00:00 /usr/lib/systemd/systemd-udevd
root 615 1 0 14:27 ? 00:00:00 /sbin/auditd
polkitd 638 1 0 14:27 ? 00:00:00 /usr/lib/polkit-1/polkitd --no-debug
dbus 639 1 0 14:27 ? 00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root 646 1 0 14:27 ? 00:00:00 /usr/sbin/NetworkManager --no-daemon
root 649 1 0 14:27 ? 00:00:00 /usr/sbin/irqbalance --foreground
root 653 1 0 14:27 ? 00:00:00 /usr/lib/systemd/systemd-logind
root 655 1 0 14:27 ? 00:00:00 /usr/sbin/crond -n
chrony 661 1 0 14:27 ? 00:00:00 /usr/sbin/chronyd
root 662 1 0 14:27 ? 00:00:00 login -- root
- 按照CPU使用率排序查看所有进程
[root@localhost ~]# ps aux --sort %cpu # 递增
[root@localhost ~]# ps aux --sort -%cpu # 递减
- 按照实际内存使用排序查看所有进程
[root@localhost ~]# ps aux --sort rss # 递增
[root@localhost ~]# ps aux --sort -rss # 递减
- 按照父子进程显示ssh服务的层级关系
[root@localhost ~]# ps auxf |grep sshd
# ps -efH
root 6814 0.0 0.2 112756 4320 ? Ss 09:06 0:00 /usr/sbin/sshd -D
root 7097 0.0 0.2 158760 5576 ? Ss 09:06 0:00 \_ sshd: root@pts/0
root 7337 0.1 0.2 158760 5588 ? Ss 10:21 0:00 \_ sshd: root@pts/1
root 7364 0.0 0.0 112724 988 pts/1 S+ 10:24 0:00 \_ grep --color=auto sshd
- 自定义显示格式
[root@localhost ~]# ps -axo user,pid,ppid,%mem,%cpu,command --sort -%cpu
- 查看指定进程的PID,多种查看的方式
[root@localhost ~]# cat /run/sshd.pid
[root@localhost ~]# ps aux |grep sshd
[root@localhost ~]# pgrep -l sshd
[root@localhost ~]# pidof sshd
- 查看进程树
[root@localhost ~]# yum install -y psmisc
[root@localhost ~]# pstree
[root@localhost ~]# pstree --help
7、top
top命令用于实时显示 process 的动态
top [选项]
[root@localhost ~]# top
[root@localhost ~]# top -d 1 # 一秒钟刷新一次
[root@localhost ~]# top -d 1 -p 6995 # 查看指定PID
[root@localhost ~]# top -d 1 -p 6995,1 # 查看多个PID进程
[root@localhost ~]# top -d 1 -u apache # 查看指定用户的进程
[root@localhost ~]# top -d 1 -b -n 2 > top.txt # 将2次top信息写入到文件
第1行:系统时间、运行时间、登录终端数、系统负载(三个数值分别为1分钟、5分钟、15分钟内的平 均值,数值越小意味着负载越低)。
第2行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。
第3行:用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源 百分比等。
第4行:物理内存总量、内存使用量、内存空闲量、作为内核缓存的内存量。(buffer和cache之间的区 别,cache是提高cpu和内存之间的数据交换速度,buffer是io设备和存储设备之间的缓冲区)
第5行:虚拟内存总量、虚拟内存使用量、虚拟内存空闲量、已被提前加载的内存量。
7.1、选项
- -d: 改变显示的更新速度,或是在交互式指令列( interactive command)按 s
- -c: 切换显示模式,共有两种模式,一是只显示程序的名称,另一种是显示完整的路径与名称
- -S: 累积模式,会将己完成或消失的子行程 ( dead child process ) 的 CPU time 累积起来
- -s: 安全模式,将交互式指令取消, 避免潜在的危机
- -i: 不显示任何闲置 (idle) 或无用 (zombie) 的行程
- -n: 更新的次数,完成后将会退出 top
- -b: 显示模式,搭配 "n" 参数一起使用,可以用来将 top 的结果输出到文件内
- -z:彩色
7.2、交互模式快捷键
快捷键 | 功能 |
---|---|
空格 | 立即刷新 |
P | 根据CPU使用多少排序 |
T | 根据时间、累计排序 |
q | 退出top命令 |
m | 切换显示内存信息 |
t | 切换显示进程和CPU状态信息 |
c | 切换显示命令名称和完整命令行 |
M | 根据内存的大小排序 |
W | 将当前设置写入 ~/.toprc 文件中,这是top配置文件推荐方法 |
N | 以PID的大小排序 |
z | 彩色 |
7.3、实例
- 显示进程信息,每个1秒钟刷新一次
[root@localhost ~]# top -d 1
- 显示完整命令
[root@localhost ~]# top -c
- 更新两次后终止更新显示
[root@localhost ~]# top -n 2
- 显示指定的进程信息
[root@localhost ~]# top -p 7097
8、kill
kill 命令用于删除执行中的程序或工作
kill 可将指定的信号送至程序。预设的信号为 SIGTERM(15),可将指定程序终止
kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]
8.1、选项
- -l <信号编号>: 若不加<信号编号>选项,则 -l 参数会列出全部的信号名称
- -s <信号名称或编号>:指定要送出的信息
- [程序]:[程序]可以是程序的PID或是PGID
使用 kill -l 命令列出所有可用信号,最常用的信号如下
编号 | 信号名 | 作用 |
---|---|---|
1 | SIGHUP | 重新加载配置 |
2 | SIGINT | 键盘中断^C |
3 | SIGQUIT | 键盘退出 |
9 | SIGKILL | 强制终止 |
15 | SIGTERM | 终止(正常结束),缺省信号 |
18 | SIGCONT | 继续 |
19 | SIGSTOP | 停止 |
20 | SIGTSTP | 暂停^Z |
8.2、例
- 杀死所有的ping命令,在linux命令中,使用反引号`包含的命令会优先执行,并将执行的结果作为参数提供给命令。
[root@localhost ~]# kill `pgrep ping`
- 强制杀死进程
[root@localhost ~]# kill -9 `pgrep ping`
- 温柔的杀死进程
[root@localhost ~]# kill -15 `pgrep ping`
- 重新加载配置
[root@localhost ~]# kill -HUP pid
[root@localhost ~]# kill -1 pid
9、pkill
pkill 用于杀死一个进程,与 kill 不同的是它会杀死指定名字的所有进程,类似于 killall 命令
pkill [选项] name
9.1、选项
- name: 进程名
- -u:指定用户名
- -t:指定终端
9.2、实例
- 结束所有的sshd进程
[root@localhost ~]# pkill sshd
- 结束用户user1的所有进程
[root@localhost ~]# pkill -u user1
- 终止pts/2上所有进程
[root@localhost ~]# pkill -t pts/2
- 终止pts/2上所有进程,并结束pts/2
[root@localhost ~]# pkill -9 -t pts/2
- 查看远程登录用户,并踢出用户
[root@localhost ~]# w
15:02:26 up 5:21, 2 users, load average: 0.05, 0.03, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 14:41 20:34 0.02s 0.02s -bash
root pts/0 192.168.175.1 14:42 2.00s 0.05s 0.01s w
user1 pts/1 192.168.175.1 14:40 20:34 0.02s 0.02s -bash
[root@localhost ~]# pkill -u user1
10、进程优先级 nice
10.1、Linux进程调度及多任务
每个CPU(或CPU核心)在一个时间点上只能处理一个进程,通过时间片技术,Linux实际能够运行的进程 (和线程数)可以超出实际可用的CPU及核心数量。Linux内核进程调度程序将多个进程在CPU核心上快速 切换,从而给用户多个进程在同时运行的假象。(并发)
10.1.1、相对优先级
由于不是每个进程都与其他进程同样重要,可告知进程调度程序为不同的进程使用不同的调度策略。常规系统上运行的大多数进程所使用的的调度策略为SCHED_OTHER(也称为SCHED_NORMAL),但还有其他 一些调度策略用于不同的目的。SCHED_OTHER调度策略运行的进程的相对优先级称为进程的nice值, 可以有40种不同级别的nice值。
进程优先级 0-99:实时优先级,数字越小,优先级越低
00-139:静态优先级,数字越小,优先级越高
进程默认启动时nice为0,优先级为120
nice值越高表示优先级越低,例如+19,该进程容易将CPU使用量让给其他进程
nice值越低表示优先级越高,例如-20,该进程更倾向于不让出CPU
10.1.2、查看进程的nice级别
- 使用ps查看
[root@localhost ~]# ps axo pid,command,nice --sort=nice
[root@localhost ~]# ps axo pid,command,nice,cls --sort=-nice
TS表示该进程使用的调度策略为SCHED_OTHER
- 使用top查看
NI:实际nice级别
PR:将nice级别显示为映射到更大优先级队列,-20映射到0,+19映射到39
- 启动具有不同nice级别的进程
启动进程的时候为进程指定nice值
启动进程时,通常会继承父进程的nice级别,默认为0
[root@localhost ~]# nice -n -20 vim
[root@localhost ~]# ps axo command,pid,nice |grep vim
10.2、PRI
在top命令中可以看到有PR这个数值,PR 和 nice 值,都会影响进程执行的优先级。PR 由 OS 内核动态调整,用户不能调整(PR 值越低,进程执行的优先级越高)。
nice值用户可以自己调整,在用户调整了nice值后系统会通过如下公式来调整新的PR值,从而确定这个进程在系统中的优先级
PR(新) = PR(旧) + nice
PR值是OS动态调整的,但是PR的最终值还是需要由OS分析决定的
-
更改现有进程的nice级别
-
使用top更改nice级别
r 调整进程的优先级(Nice Level) (-20高) - - - 0 - - - (19低)
- 使用shell更改nice级别
[root@localhost ~]# sleep 7000 &
[2] 10267
[root@localhost ~]# renice -20 10267
10267 (进程 ID) 旧优先级为 0,新优先级为 -20
11、jobs
jobs 命令可以用来查看当前终端放入后台的任务
jobs [-lnprs] [任务声明 ...]
11.1、将任务放入到后台
Linux 命令放入后台的方法有两种:
- 在命令后面加入
空格 &
。使用这种方法放入后台的命令,在后台处于执行状态 - 命令执行过裎中按 Ctrl+Z 快捷键,命令在后台处于暂停状态
11.1.1、实例
- 将任务放入后台,然后查看任务
- "+"号代表最近一个放入后台的工作,也是工作恢复时默认恢复的工作
- "-"号代表倒数第二个放入后台的工作
[root@localhost ~]# top &
[root@localhost ~]# vi &
[root@localhost ~]# ping baidu.com > /dev/null &
# 让ping运行,但是不显示结果
[root@localhost ~]# jobs
[1] 已停止 top
[2]- 已停止 vi
[3]+ 运行中 ping baidu.com > /dev/null &
11.2、将任务恢复到前台
fg 命令用于把后台工作恢复到前台执行
fg %工作号
注意,在使用此命令时,% 可以省略,但若将% 工作号全部省略,则此命令会将带有 + 号的工作恢复到前台。另外,使用此命令的过程中, % 可有可无。
11.2.1、实例
- 将top恢复到前台
- 命令虽然是对的,但是top这种需要交互的任务是无法后台的,所以也恢复不了
[root@localhost ~]# top &
[1] 20584
[root@localhost ~]# jobs
[1]+ 已停止 top
[root@localhost ~]# fg 1
11.3、后台任务恢复到后台运行
前面讲过,使用Ctrl+z
快捷键的方式,可以将前台工作放入后台,但是会处于暂停状态,可以使用bg命令
bg %工作号
这里的 % 可以省略
11.3.1、实例
- 将ping命令暂停到后台,然后恢复后台运行
[root@localhost ~]# ping baidu.com > /dev/null
^Z # 这边按下了Ctrl+z
[1]+ 已停止 ping baidu.com > /dev/null
[root@localhost ~]# jobs
[1]+ 已停止 ping baidu.com > /dev/null
[root@localhost ~]# bg %1
[1]+ ping baidu.com > /dev/null &
[root@localhost ~]# jobs
[1]+ 运行中 ping baidu.com > /dev/null &
12、nohup
虽然可以将程序放在后台运行,但是一旦关闭远程连接那么程序就会中断,如果我们想要将程序一直保持在后台运行,那么我们可以有如下三个选择:
- 把需要在后台执行的命令加入
/etc/rc.local
文件,让系统在启动时执行这个后台程序。这种方法的问题是,服务器是不能随便重启的,如果有临时后台任务,就不能执行了 - 使用系统定时任务,让系统在指定的时间执行某个后台命令。这样放入后台的命令与终端无关,是不依赖登录终端的
- 使用 nohup 命令
nohup 命令&
注意,这里的‘&’表示此命令会在终端后台工作;反之,如果没有‘&’,则表示此命令会在终端前台工作。
12.1、实例
- 让一个任务后台运行
[root@localhost ~]# nohup ping baidu.com &
我们退出远程连接,然后重新登录回来,会看到ping baidu.com
依旧在运行,查看~/nohup.out
文件可以看到程序执行输出的内容
[root@localhost ~]# ps aux |grep ping
root 7157 0.0 0.0 149968 1988 ? S 14:12 0:00 ping baidu.com
[root@localhost ~]# tail -f nohup.out
七、存储管理
我们在计算机中保存的文件大都是保存在电脑硬盘中,部分同学还会将自己的文件存储在网盘中,网盘中的文件只能说是用来做备份,并不能像本地硬盘上的数据那样随时使用,我们在学习存储管理的时候主要学习的就是如何对自己计算机上的硬盘进行管理,目前我们主流的硬盘主要有两种形态,一种是及机械硬盘(HDD),一种是的固态硬盘(SSD)
1、硬盘工作原理
1.1、机械硬盘HDD
机械硬盘是靠机械马达以固定的速度转动磁盘,然后再有机械臂的摆动,让磁头可以读取盘片上的磁性信息,这种工作原理的硬盘我们成为机械硬盘。
由于机械硬盘是依靠机械的运动来读写数据的,大家都知道机械在长时间运转的过程中是会产生一定的损耗,所以机械硬盘虽然理论上寿命很长,但随着时间的变长,机械磨损变大,导致磁头定位的误差变大,从而影响到硬盘的速度,这个就是为什么你的老电脑开机缓慢,运行卡顿的原因了。
1.2、固态硬盘SSD
固态硬盘依靠主控芯片来将数据的二进制信息写入浮栅晶体管中,以这样的原理实现数据的读取和写入。
固态硬盘在读取和写入数据的时候完全是依靠数字电路实现的,所以并没有机械硬盘的机械磨损,而且也没有在磁盘上定位读写的延迟,所以固态硬盘的数据读写效率是远远高于机械硬盘的,但是也有一定的缺点,由于浮栅晶体管的设计原理,每次数据的读写,都会让浮栅晶体管所需要的电压更高,一定寿命以后,固态硬盘就会失效。并且固态硬盘如果发生了损坏,数据恢复的难度是大于机械硬盘的,所以为了可靠性,企业目前还是在大量使用机械硬盘的。
2、硬盘设备命名
一台服务器往往会配备有多块硬盘,Linux中为了区分不同的硬盘,会使用不同的命名来将硬盘设备标识,Linux系统对物理设备会使用sd[a-z]
的方式来命名。物理硬盘上的详细分区会使用数字的方式来进行标识,比如sda
设备上的多个分区会标识为sda[1,2,3....]
3、分区表
为了让系统能够识别和管理物理设备上的不同分区,需要在物理设备前加上一些数据用于记录分区的情况,这些数据就是分区表数据,目前分区表有两种主流的格式:
- MBR
- 管理的硬盘大小不能超过2T
- 有主分区和扩展分区两种,不管是哪种分区,总数不能超过4个分区
- 扩展分区内部可以逻辑上划分多个区域,但是在分区表中都算在一个分区内
- 如果作为系统盘,必须要设置一个激活分区,用于存放系统的引导文件
- GPT
- 管理硬盘大小不能超过18EB,目前人类还没制造出单块这么大的硬盘
- 理论上支持无限分区,在win10系统上,最多可以分128个分区
- 如果作为系统盘,必须要创建一个EFI分区,用于存放系统的引导文件建议ESP分区512M,对齐8扇区4096字节
电脑启动的时候:
MBR分区表会找到活动的分区,从里面加载系统启动;
GTP分区表会查找EFI分区,没有是开不了机的,所以GPT分区表情况下需要建立ESP,MSR分区。
MSR是微软保留的引导分区,分区一般不会坏因此一般不需要。
ESP建立512MB,对齐到扇区整数倍是指一次读写几个扇区(例如新建个txt只写一个字符,依旧占用4K,除非越写越大超过4K,占4K的整数倍),并不是越大越好也不是越小越好,根据实际需求,一般是4KB。
4、管理分区
- 列出块设备
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 49G 0 part
├─centos-root 253:0 0 47G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
sdc 8:32 0 20G 0 disk
sr0 11:0 1 1024M 0 rom
- 创建分区命令
fdisk 管理MBR分区
gdisk 管理GPT分区
parted 高级分区操作
- 重新设置内存中的内核分区表版本
partprobe
4.1、parted 命令
- parted的操作都是实时生效的,小心使用
- 格式:
parted [选项]... [设备 [命令 [参数]...]...]
- 操作命令:
cp [FROM-DEVICE] FROM-MINOR TO-MINOR #将文件系统复制到另一个分区
help [COMMAND] #打印通用求助信息,或关于 COMMAND 的信息
mklabel 标签类型 #创建新的磁盘标签 (分区表)
mkfs MINOR 文件系统类型 #在 MINOR 创建类型为“文件系统类型”的文件系统
mkpart 分区类型 [文件系统类型] 起始点 终止点 #创建一个分区
mkpartfs 分区类型 文件系统类型 起始点 终止点 #创建一个带有文件系统的分区
move MINOR 起始点 终止点 #移动编号为 MINOR 的分区
name MINOR 名称 #将编号为 MINOR 的分区命名为“名称”
print [MINOR] #打印分区表,或者分区
quit #退出程序
rescue 起始点 终止点 #挽救临近“起始点”、“终止点”的遗失的分区
resize MINOR 起始点 终止点 #改变位于编号为 MINOR 的分区中文件系统的大小
rm MINOR #删除编号为 MINOR 的分区
select 设备 #选择要编辑的设备
set MINOR 标志 状态 #改变编号为 MINOR 的分区的标志
- 查看分区情况
[root@localhost ~]# parted /dev/sda print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sda: 53.7GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system 标志
1 1049kB 1075MB 1074MB primary xfs 启动
2 1075MB 53.7GB 52.6GB primary lvm
[root@localhost ~]# parted /dev/sdb print
错误: /dev/sdb: unrecognised disk label
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:
- 设置磁盘的分区表
# [root@localhost ~]# parted /dev/sdb mklabel msdos
[root@localhost ~]# parted /dev/sdb mklabel gpt
信息: You may need to update /etc/fstab.
[root@localhost ~]# parted /dev/sdb print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name 标志
- 对磁盘进行分区
[root@localhost ~]# parted /dev/sdb mkpart primary 1 200M
信息: You may need to update /etc/fstab.
[root@localhost ~]# parted /dev/sdb print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name 标志
1 1049kB 200MB 199MB primary
- 删除分区
[root@localhost ~]# parted /dev/sdb rm 1
信息: You may need to update /etc/fstab.
[root@localhost ~]# parted /dev/sdb print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name 标志
- 修改磁盘为mbr分区,注意会丢失所有数据
[root@localhost ~]# parted /dev/sdb mklabel msdos
警告: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do
you want to continue?
是/Yes/否/No? yes
信息: You may need to update /etc/fstab.
4.2、fdisk工具
管理磁盘分区
fdisk [磁盘名称]
fdisk命令中的参数以及作用
参数 | 作用 |
---|---|
m | 查看全部可用的参数 |
n | 添加新的分区 |
d | 删除某个分区信息 |
l | 列出所有可用的分区类型 |
t | 改变某个分区的类型 |
p | 查看分区信息 |
w | 保存并退出 |
q | 不保存直接退出 |
[root@localhost ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Apr 12 04:20:38 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=ff13d896-a59e-430d-8d14-3997d19f5de9 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
/dev/sdb1 /data1 ext4 defaults 0 0
/dev/sdb2 /data2 ext4 defaults 0 0
4.3、gdisk工具
- 类fdisk 的GPT分区工具
5、存储结构与磁盘划分
Linux系统中常见的目录名称以及相应内容
目录名称 | 应放置文件的内容 |
---|---|
/boot | 开机所需文件—内核、开机菜单以及所需配置文件等 |
/dev | 以文件形式存放任何设备与接口 |
/etc | 配置文件 |
/home | 用户家目录 |
/bin | 存放单用户模式下还可以操作的命令 |
/lib | 开机时用到的函数库,以及/bin与/sbin下面的命令要调用的函数 |
/sbin | 开机过程中需要的命令 |
/media | 用于挂载设备文件的目录 |
/opt | 放置第三方的软件 |
/root | 系统管理员的家目录 |
/srv | 一些网络服务的数据文件目录 |
/tmp | 任何人均可使用的“共享”临时目录 |
/proc | 虚拟文件系统,例如系统内核、进程、外部设备及网络状态等 |
/usr/local | 用户自行安装的软件 |
/usr/sbin | Linux系统开机时不会使用到的软件/命令/脚本 |
/usr/share | 帮助与说明文件,也可放置共享文件 |
/var | 主要存放经常变化的文件,如日志 |
/lost+found | 当文件系统发生错误时,将一些丢失的文件片段存放在这里 |
表示路径的方式:
- 绝对路径指的是从根目录(/)开始写起的文件或目录名称
- 相对路径则指的是相对于当前路径的写法
6、物理设备的命名规则
常见的硬件设备及其文件名称
硬件设备 | 文件名称 |
---|---|
IDE设备 | /dev/hd[a-d] |
SCSI/SATA/U盘 | /dev/sd[a-p] |
软驱 | /dev/fd[0-1] |
打印机 | /dev/lp[0-15] |
光驱 | /dev/cdrom |
鼠标 | /dev/mouse |
磁带机 | /dev/st0或/dev/ht0 |
一般的硬盘设备都会是以“/dev/sd”开头,分区编号按照如下规则:
- 主分区或扩展分区的编号从1开始,到4结束;
- 逻辑分区从编号5开始。
设备文件名称
7、文件系统与数据资料
文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。Linux系统支持数十种的文件系统,而最常见的文件系统如下所示。
日志式与索引式区别
文件系统 | 解释 |
---|---|
Ext3 | 是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分之百地保证资料不会丢失。它会把整个磁盘的每个写入动作的细节都预先记录下来,以便在发生异常宕机后能回溯追踪到被中断的部分,然后尝试进行修复。 |
Ext4 | Ext3的改进版本,作为RHEL 6系统中的默认文件管理系统,它支持的存储容量高达1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4文件系统能够批量分配block块,从而极大地提高了读写效率。 |
XFS | 是一种高性能的日志文件系统,而且是RHEL 7中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为18EB,这几乎满足了所有需求。 |
格式化后会发生如下事情
- 日志式文件系统先干掉inode表,索引式文件系统先干掉第一个索引,表示空间可用。
- Linux创建一个硬盘地图'superblock',记录此filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
- inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block 号码,默认一个inode表格128字节,一个block记录消耗4B,记录满了后会新建inode用于扩展。
- 该文件的访问权限(read、write、execute);
- 该文件的所有者与所属组(owner、group);
- 该文件的大小(size);
- 该文件的创建或内容修改时间(ctime);
- 该文件的最后一次访问时间(atime);
- 该文件的修改时间(mtime);
- 文件的特殊权限(SUID、SGID、SBIT);
- 该文件的真实数据地址(point)。
- block:用于存储数据
计算机系统在发展过程中产生了众多的文件系统,为了使用户在读取或写入文件时不用关心底层的硬盘结构,Linux内核中的软件层为用户程序提供了一个VFS(Virtual File System,虚拟文件系统)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。
7.1、mkfs工具
- Linux mkfs(英文全拼:make file system)命令用于在特定的分区上建立 linux 文件系统。
- 格式:
mkfs [-V] [-t fstype] [fs-options] filesys [blocks]
- 选项:
- device : 预备检查的硬盘分区,例如:/dev/sda1
- -V : 详细显示模式
- -t : 给定档案系统的型式,Linux 的预设值为 ext2
- -c : 在制做档案系统前,检查该partition 是否有坏轨
- -l bad_blocks_file : 将有坏轨的block资料加到 bad_blocks_file 里面
- block : 给定 block 的大小
- 实例,使用parted分区,然后使用mkfs创建ext4文件系统
[root@localhost ~]# parted /dev/sdb mklabel gpt
[root@localhost ~]# parted /dev/sdb mkpart primary 0 10G
[root@localhost ~]# mkfs.ext4 /dev/sdb1
[root@localhost ~]# parted /dev/sdb print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name 标志
1 1049kB 10.0GB 9999MB ext4 primary
7.2、mount
挂载文件系统mount 文件系统 挂载目录
mount命令中的参数以及作用
参数 | 作用 |
---|---|
-a | 挂载所有在/etc/fstab中定义的文件系统 |
-t | 指定文件系统的类型 |
临时挂载文件系统
系统在重启后挂载就会失效
[root@node-1 ~]# mkdir backup
[root@node-1 ~]# mount /dev/sda2 /root/backup
如果想让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”,写入到/etc/fstab文件中。
用于挂载信息的指定填写格式中,各字段所表示的意义
字段 | 意义 |
---|---|
设备文件 | 一般为设备的路径+设备名称,也可以写唯一识别码(UUID,Universally Unique Identifier) |
挂载目录 | 指定要挂载到的目录,需在挂载前创建好 |
格式类型 | 指定文件系统的格式,比如Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等 |
权限选项 | 若设置为defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async |
是否备份 | 若为1则开机后使用dump进行磁盘备份,为0则不备份 |
是否自检 | 若为1则开机后自动进行磁盘自检,为0则不自检 |
- 实例,挂载分区
/dev/sdb1
到/mnt/volume1
下,并且设置为永久自动挂载
[root@localhost ~]# mkdir -p /mnt/volume1
[root@localhost ~]# mount /dev/sdb1 /mnt/volume1
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 47G 995M 46G 3% /
devtmpfs 979M 0 979M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 8.5M 982M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/sda1 1014M 133M 882M 14% /boot
tmpfs 199M 0 199M 0% /run/user/0
/dev/sdb1 9.1G 37M 8.6G 1% /mnt/volume1
# 先卸载sdb1
[root@localhost ~]# umount /dev/sdb1
[root@localhost ~]# vim /etc/fstab
# 最后一行加上
/dev/sdb1 /mnt/volume1 ext4 defaults 0 0
[root@localhost ~]# mount -a
# 测试是否正确配置,fstab上的设备挂一遍试试看,万一错了重启系统会失败。
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 47G 995M 46G 3% /
devtmpfs 979M 0 979M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 8.5M 982M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/sda1 1014M 133M 882M 14% /boot
tmpfs 199M 0 199M 0% /run/user/0
/dev/sdb1 9.1G 37M 8.6G 1% /mnt/volume1
7.3、umount
撤销已经挂载的设备文件umount [挂载点/设备文件]
[root@node-1 ~]# umount /dev/sda2
挂载实验:
#进行了格式化后
#[root@localhost ~]# mkfs.ext4 /dev/sdb1
#未挂载sdb1前,此时file0创建在sda1上
[root@localhost ~]# mkdir /mnt/disk1
[root@localhost ~]# touch /mnt/disk1/file0
[root@localhost ~]# ll /mnt/disk1/
-rw-r--r-- 1 root root 0 6月 9 19:44 file0
#挂载sdb1,file0消失
[root@localhost ~]# mount /dev/sdb1 /mnt/disk1/
[root@localhost ~]# ll /mnt/disk1/
drwx------ 2 root root 16384 6月 9 19:42 lost+found
#此时file0创建在sda1
[root@localhost ~]# touch /mnt/disk1/file1
[root@localhost ~]# ll /mnt/disk1/
-rw-r--r-- 1 root root 0 6月 9 19:48 file1
drwx------ 2 root root 16384 6月 9 19:42 lost+found
#卸载sdb1,file1消失,file0出现
[root@localhost ~]# umount /dev/sdb1
[root@localhost ~]# ll /mnt/disk1/
-rw-r--r-- 1 root root 0 6月 9 19:44 file0
7.4、df
用于显示文件系统的磁盘空间使用情况
df [选项]
常用选项
-h
:以人类可读的格式显示磁盘空间,使用K、M、G等单位。-T
:显示文件系统类型。
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 47G 995M 46G 3% /
devtmpfs 979M 0 979M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 8.5M 982M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/sda1 1014M 133M 882M 14% /boot
tmpfs 199M 0 199M 0% /run/user/0
/dev/sdb1 9.1G 37M 8.6G 1% /mnt/volume1
7.5、du
查看某个目录下文件数据的占用量
du [选项] [文件]
[root@localhost ~]# du -sh /etc
23M /etc
8、添加交换分区
SWAP(交换)分区是一种通过在硬盘中预先划分一定的空间,然后将把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术
在生产环境中,交换分区的大小一般为真实物理内存的1.5~2倍
[root@localhost ~]# umount /dev/sdb2
[root@localhost ~]# mkswap /dev/sdb2
mkswap: /dev/sdb2: warning: wiping old ext4 signature.
Setting up swapspace version 1, size = 5241852 KiB
no label, UUID=6707cde0-c7df-4557-b99b-45fbf5b36dcd
[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 1.8G 149M 1.0G 9.5M 601M 1.4G
Swap: 2.0G 0B 2.0G
[root@localhost ~]# swapon /dev/sdb2
[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 1.8G 153M 1.0G 9.5M 601M 1.4G
Swap: 7.0G 0B 7.0G
[root@localhost ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Apr 12 04:20:38 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=ff13d896-a59e-430d-8d14-3997d19f5de9 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
/dev/sdb1 /data1 ext4 defaults 0 0
/dev/sdb2 swap swap defaults 0 0
9、磁盘容量配额
简单理解就是可以通过磁盘配额限制某个用户能够使用多大的空间
9.1、quota
9.1.1、实例切入
描述:
- 创建5个用户user1,user2,user3,user4,user5,密码和用户名相同,初始组为usergrp组。
- 5个用户都可以取得300M的磁盘使用空间,文件数量不限。超过250M,给于提示。
- usergrp这个组内成员最大使用空间1GB。
- 如果有用户超过soft限制,给14天的宽限时间。
9.1.2、准备磁盘
- 创建分区
[root@atopos ~]# 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 (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): +2G
Partition 1 of type Linux and of size 2 GiB is set
Command (m for help): p
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 label type: dos
Disk identifier: 0x29af810b
Device Boot Start End Blocks Id System
/dev/sdb1 2048 4196351 2097152 83 Linux
- lsblk 查看当前分区情况
[root@atopos ~]# 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
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 2G 0 part
sr0 11:0 1 1024M 0 rom
- 格式化分区的文件系统
[root@atopos ~]# 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
131072 inodes, 524288 blocks
26214 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
- 创建目录并挂载
[root@atopos ~]# mkdir /mnt/mountpoint1
[root@atopos ~]# mount /dev/sdb1 /mnt/mountpoint1/
[root@atopos ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos-root xfs 17G 2.2G 15G 13% /
devtmpfs devtmpfs 898M 0 898M 0% /dev
tmpfs tmpfs 910M 0 910M 0% /dev/shm
tmpfs tmpfs 910M 9.7M 901M 2% /run
tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 146M 869M 15% /boot
tmpfs tmpfs 182M 0 182M 0% /run/user/0
overlay overlay 17G 2.2G 15G 13% /var/lib/docker/overlay2/ea6bd330b5a7154860e3e7b90affaf8b12673a6f71ff35665ecea39a47e3bce0/merged
/dev/sdb1 ext4 2.0G 6.0M 1.8G 1% /mnt/mountpoint1
9.1.3、准备用户
[root@atopos ~]# setenforce 0
# 临时关闭SELinux
[root@atopos ~]# getenforce
Permissive
[root@atopos ~]# groupadd usergrp
[root@atopos ~]# for i in {1..5}; do useradd -g usergrp -b /mnt/mountpoint1 user$i; done
9.1.4、确保文件系统支持
- 检查挂载点是否支持quota配置
[root@atopos ~]# mount | grep mountpoint1
/dev/sdb1 on /mnt/mountpoint1 type ext4 (rw,relatime,seclabel,data=ordered)
- 重新挂载,让文件系统支持quota配置
[root@atopos ~]# mount -o remount,usrquota,grpquota /mnt/mountpoint1/
[root@atopos ~]# mount | grep mountpoint1
/dev/sdb1 on /mnt/mountpoint1 type ext4 (rw,relatime,seclabel,quota,usrquota,grpquota,data=ordered)
9.1.5、安装 quota
- 软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
- 硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。
quotacheck主要参数
- -a:扫描所有在/etc/mtab内含有quota参数的文件系统
- -u:针对用户扫描文件与目录的使用情况,会新建一个aquota.user文件
- -g:针对用户组扫描文件与目录的使用情况,会新增一个aquota.group文件
- -v:显示扫描过程的信息
[root@atopos ~]# yum install -y quota
9.1.6、开启 quota
[root@atopos ~]# quotacheck -avug
quotacheck: Your kernel probably supports journaled quota but you are not using it. Consider switching to journaled quota to avoid running quotacheck after an unclean shutdown.
quotacheck: Scanning /dev/sdb1 [/mnt/mountpoint1] done
quotacheck: Cannot stat old user quota file /mnt/mountpoint1/aquota.user: No such file or directory. Usage will not be subtracted.
quotacheck: Cannot stat old group quota file /mnt/mountpoint1/aquota.group: No such file or directory. Usage will not be subtracted.
quotacheck: Cannot stat old user quota file /mnt/mountpoint1/aquota.user: No such file or directory. Usage will not be subtracted.
quotacheck: Cannot stat old group quota file /mnt/mountpoint1/aquota.group: No such file or directory. Usage will not be subtracted.
quotacheck: Checked 8 directories and 15 files
quotacheck: Old file not found.
quotacheck: Old file not found.
[root@atopos ~]# quotaon -avug
/dev/sdb1 [/mnt/mountpoint1]: group quotas turned on
/dev/sdb1 [/mnt/mountpoint1]: user quotas turned on
9.1.7、编辑配额配置
[root@atopos ~]# edquota -u user1
- 可以将针对user1的限制复制给user2
[root@atopos ~]# edquota -p user1 -u user2
- 查看限制情况
[root@atopos ~]# repquota -as
*** Report for user quotas on device /dev/sdb1
Block grace time: 7days; Inode grace time: 7days
Space limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 20K 0K 0K 2 0 0
user1 -- 16K 245M 293M 4 0 0
user2 -- 16K 245M 293M 4 0 0
user3 -- 16K 0K 0K 4 0 0
user4 -- 16K 0K 0K 4 0 0
user5 -- 16K 0K 0K 4 0 0
9.1.8、测试
[user1@atopos ~]$ dd if=/dev/zero of=bigfile bs=10M count=50
sdb1: warning, user block quota exceeded.
sdb1: write failed, user block limit reached.
dd: 写入"bigfile" 出错: 超出磁盘限额
记录了30+0 的读入
记录了29+0 的写出
307183616字节(307 MB)已复制,1.96853 秒,156 MB/秒
[user1@atopos ~]$ du -sh *
293M bigfile
[user1@atopos ~]$
9.1.9、quota 命令
Linux quota命令用于显示磁盘已使用的空间与限制。
执行quota指令,可查询磁盘空间的限制,并得知已使用多少空间
选项:
- -g 列出群组的磁盘空间限制。
- -q 简明列表,只列出超过限制的部分。
- -u 列出用户的磁盘空间限制。
- -v 显示该用户或群组,在所有挂入系统的存储设备的空间限制。
- -V 显示版本信息。
9.2、xfs_quota
专门针对XFS文件系统来管理quota磁盘容量配额服务
xfs_quota [参数] 配额 文件系统
- -c参数用于以参数的形式设置要执行的命令
- -x参数是专家模式
硬盘使用量的软限制和硬限制分别为3MB和6MB;创建文件数量的软限制和硬限制分别为3个和6个。
[root@localhost ~]# xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 test' /boot
[root@localhost ~]# xfs_quota -x -c report /boot
User quota on /boot (/dev/sda1)
Blocks
User ID Used Soft Hard Warn/Grace
---------- --------------------------------------------------
root 115516 0 0 00 [--------]
test 0 3072 6144 00 [--------]
[root@localhost ~]# su - test
[test@localhost ~]$ dd if=/dev/zero of=/boot/tom bs=5M count=1
1+0 records in
1+0 records out
5242880 bytes (5.2 MB) copied, 0.00350676 s, 1.5 GB/s
[test@localhost ~]$ dd if=/dev/zero of=/boot/tom bs=8M count=1
dd: error writing ‘/boot/tom’: Disk quota exceeded
1+0 records in
0+0 records out
4194304 bytes (4.2 MB) copied, 0.00760235 s, 552 MB/s
10、软硬方式链接
在Linux系统中存在硬链接和软连接两种文件。
- 硬链接(hard link):
- 可以将它理解为一个“指向原始文件inode的指针”,系统不为它分配独立的inode和文件。所以,硬链接文件与原始文件其实是同一个文件,只是名字不同。我们每添加一个硬链接,该文件的inode连接数就会增加1;而且只有当该文件的inode连接数为0时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件inode的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,我们不能跨分区对目录文件进行链接。
- 软链接(也称为符号链接[symbolic link]):
- 仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。但是,当原始文件被删除后,链接文件也将失效,从这一点上来说与Windows系统中的“快捷方式”具有一样的性质。
10.1、ln
用于创建链接文件
ln [选项] 目标
ln命令中可用的参数以及作用
参数 | 作用 |
---|---|
-s | 创建“符号链接”(如果不带-s参数,则默认创建硬链接) |
-f | 强制创建文件或目录的链接 |
-i | 覆盖前先询问 |
-v | 显示创建链接的过程 |
软链接演示
[root@localhost ~]# echo "hello" > test
[root@localhost ~]# ln -s test test123
[root@localhost ~]# cat test123
hello
[root@localhost ~]# ls -l test
-rw-r--r--. 1 root root 6 Apr 12 06:10 test
[root@localhost ~]# rm -f test
[root@localhost ~]# cat test123
cat: test123: No such file or directory
硬链接演示
[root@localhost ~]# echo "hello" > test
[root@localhost ~]# ln test test123
[root@localhost ~]# cat test123
hello
[root@localhost ~]# ls -l test
-rw-r--r--. 2 root root 6 Apr 12 06:12 test
[root@localhost ~]# rm -f test
[root@localhost ~]# cat test123
hello
评论区