picaj的分享

Linux基础部分(上)

一、Linux命令行

1、初识shell

虽然我们已经安装好了系统,但是光会安装不会操作是不够的。我们还要像玩手机一样熟悉并记忆操作方法。

shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。实际上shell是一个命令解释器,它解释用户输入的命令并且把用户的意图传达给内核。(可以理解为用户与内核之间的翻译官角色)

image-46

我们可以使用shell实现对Linux系统的大部分管理,例如:

  1. 文件管理
  2. 用户管理
  3. 权限管理
  4. 磁盘管理
  5. 软件管理
  6. 网络管理
  7. ....

使用shell的两种方式

2、bash shell提示符

登录Linux系统之后,默认进入交互式的命令行界面,在光标前边会出现提示符

[root@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

我们也可以查看这个命令的所有选项

[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、选项
[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]#
4.1.2、实例
[root@localhost ~]# ls
[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
  1. 第一列共10位,第1位表示文档类型,d表示目录,-表示文件,l表示链接文件,b表示可随机存取的设备,如U盘等,c表示一次性读取设备,如鼠标、键盘等。后9位,依次对应三种身份所拥有的权限,身份顺序为:owner、group、others,权限顺序为:readable、writable、excutable。如:-r-xr-x---的含义为当前文档是一个文件,拥有者可读、可执行,同一个群组下的用户,可读、可写,其他人没有任何权限
  2. 第二列表示链接数,表示有多少个文件链接到inode号码。
  3. 第三列表示拥有者
  4. 第四列表示所属群组
  5. 第五列表示文档容量大小,单位字节
  6. 第六列表示文档最后修改时间,注意不是文档的创建时间哦
  7. 第七列表示文档名称。以点(.)开头的是隐藏文档
4.2、cd

用于切换当前工作目录

cd [dirName]
4.2.1、实例
[root@localhost ~]# cd /usr/bin
[root@localhost bin]# cd ~
[root@localhost ~]# cd ..
4.3、pwd

显示工作目录

pwd [-LP]

默认情况下,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、选项

:允许对下面列出的加反斜线转义的字符进行解释

4.5.2、实例
[root@localhost ~]# echo "hello world"
[root@localhost ~]# echo -e "hello\nworld"
[root@localhost ~]# echo -e "hello\aworld"

5、系统命令

5.1、poweroff

用于关闭计算器并切断电源

poweroff [-n] [-w] [-d] [-f] [-i] [-h]
5.1.1、选项
5.2、reboot

用来重新启动计算机

reboot [-n] [-w] [-d] [-f] [-i]
5.2.1、选项
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、选项
7.1.2、实例
[root@localhost ~]# history -w histfiles.txt
[root@localhos t ~]# history -c
[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、选项
7.2.2、实例
[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、实例
[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
[root@localhost ~]# alias wl='ip address'
[root@localhost ~]# wl
[root@localhost ~]# echo "alias wl='ip address'" >> /etc/bashrc

二、文件管理

我们知道Linux的目录结构为树状结构,最顶级的目录为根目录 /。

其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们。

在开始本教程前我们需要先知道什么是绝对路径与相对路径。

1、文件管理命令

几个常见的处理目录的命令

1.1、touch(创建新文件)

用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。

touch 文件名
1.1.1、实例
[root@localhost ~]# touch newfile
1.2、mkdir (创建新目录)

创建新的目录的

mkdir [-mpv] 目录名称
1.2.1、选项
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、选项
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、选项
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、选项
1.5.2、实例
[root@localhost ~]# cd /home
[root@localhost home]# rm -rf dir1

2、文本文件查看

在Linux中一切皆文件,说的就是Linux利用文本文件来保存系统所有的设置。

我们在Linux中想实现一个功能,不可避免的需要查看文本文件,修改文本文件。

2.1、cat

用于打开文本文件并显示出来

cat [选项]... [文件]...
2.1.1、选项
2.1.2、实例
[root@localhost ~]# cat 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、参数
2.3.2、实例
[root@localhost ~]# head -n 6 anaconda-ks.cfg
2.4、tail

会把文本文件里的最尾部的内容显示在屏幕上

tail [选项]... [文件]...
2.4.1、参数
2.4.2、实例
[root@localhost ~]# tail -n 3 anaconda-ks.cfg
[root@localhost ~]# tail -f /var/log/messages 
# ctrl+c退出
[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操作系统,所以必须要掌握命令行的文本编辑器软件。

目前常见的命令行文本编辑器

目前vim是使用的最多的,也是比较推荐的,下面就来讲一下vim

3.1、什么是 vim?

Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。

简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。

连 vim 的官方网站 (http://www.vim.org) 自己也说 vim 是一个程序开发工具而不是文字处理软件。

vim是一个纯命令行文本编辑器,很多文本编辑的功能都是通过键盘快捷键的方式完成,所以我们需要记住常用的键位,在vim官方网站上我们可以找到vim键盘图的完整版,不过对于初学者来说,我们只需要知道常用的就可以了。

image-47

3.2、vi/vim 的使用

基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和末行模式(Last line mode)。 这三种模式的作用分别是:

3.2.1、命令模式

用户刚刚启动 vi/vim,便进入了命令模式。

此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。

以下是常用的几个命令:

若想要编辑文本:启动Vim,进入了命令模式,按下i,切换到输入模式。

命令模式只有一些最基本的命令,因此仍要依靠末行模式输入更多命令。

3.2.2、输入模式

在命令模式下按下i就进入了输入模式。

在输入模式中,可以使用以下按键:

3.2.3、末行模式

在命令模式下按下:(英文冒号)就进入了末行模式。

末行模式可以输入单个或多个字符的命令,可用的命令非常多。

在末行模式中,基本的命令有:

按ESC键可随时退出末行模式。

简单的说,我们可以将这三个模式的关系用下图来表示:

image-48

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

输入这条命令之后,会看到如下画面

image-49

按下i进入输入模式(也称为编辑模式),开始编辑文字

在命令模式之中,只要按下i,o,a等字符就可以进入输入模式了!

在编辑模式当中,你可以发现在左下角状态栏中会出现--INSERT--的字样,那就是可以输入任意字符的提示。

这个时候,键盘上除了 Esc 这个按键之外,其他的按键都可以视作为一般的输入按钮了,所以你可以进行任何的编辑。

image-50

好了,假设我已经按照上面的样式给他编辑完毕了,那么应该要如何退出呢?是的!没错!就是给他按下 Esc 这个按钮即可!马上你就会发现画面左下角--INSERT--的不见了!

image-51

输入:wq后回车即可保存离开,注意其中的冒号必须是英文输入法下的冒号!

image-52

现在我们就成功创建了一个文件,查看文件的内容吧

[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、实例
[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: -

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查看第一个字母:

[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命令,所以在学习的时候,whichlocate需要掌握,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、实例
[root@localhost ~]# which ls
alias ls='ls --color=auto'
    /usr/bin/ls
# which会先告诉你ls其实是一个别名
# 然后显示出来ls所在的具体位置

小知识:我们在执行ls的时候,其实执行的是ls --color=auto这条命令,在显示文件的时候使用不同的颜色表示不同的文件类型,如果我们想执行ls本体,而不想执行别名,我们可以输入\ls就可以了,这样就不会有不同的颜色表示文件类型了。

[root@localhost ~]# which poweroff
/usr/sbin/poweroff
3.2、locate

用于查找符合条件的文件,他会去保存文件和目录名称的数据库内,查找合乎范本样式条件的文件或目录

在centos7的最小化安装中,并没有自带locate命令,我们需要输入如下命令进行安装。

[root@localhost ~]# yum -y install mlocate
# 注意,在安装的时候需要确保虚拟机有网络

locate的使用方式如下

locate [选项]... [范本样式]...

在使用locate之前,需要更新一下数据库,因为locate只会在数据库中查找文件所在的位置,所以locate查找速度极快,缺点就是数据库更新并不是实时的,更新数据库有两种方式:

3.2.1、选项
3.2.2、实例
[root@localhost ~]# updatedb
# 更新数据库并不是每次查找都需要,但是建议更新数据库来保证数据是最新的
[root@localhost ~]# locate passwd
[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]    任意一个数字
3.3.2、处理动作

下面的实例大家学习完后续用户权限管理之后,就可以完全看的懂了

3.3.3、实例
[root@localhost ~]# find /var ‐user root ‐group mail
[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\)
[root@localhost ~]# find /etc/ ‐mtime ‐7
[root@localhost ~]# find / \(‐nouser ‐o ‐nogroup\) ‐a ‐atime ‐7
[root@localhost ~]# find /etc ‐size +1M ‐type f
[root@localhost ~]# find /etc ‐not ‐perm /222
[root@localhost ~]# find /etc ‐not ‐perm ‐111
[root@localhost ~]#find /etc/init.d ‐perm ‐113

四、用户权限管理

Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。

为了更加方便的管理多个用户,就出现了用户组的概念,关于用户和用户组:

实现用户账号的管理,要完成的工作主要有如下几个方面:

1、用户和用户组查看

1.1、id

用于显示用户的ID,以及所属群组的ID

id会显示用户以及所属群组的实际与有效ID。若两个ID相同,则仅显示实际ID。若仅指定用户名称,则显示目前用户的ID。

id [OPTION]... [USER]
1.1.1、uid的约定

Linux操作系统会依据用户的uid数值来判定这个用户的角色,分别如下

关于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

image-53

[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、选项
3.1.2、实例

image-54

[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、选项
3.2.2、实例
[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、选项
3.4.2、实例
[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、选项
4.1.2、实例
[root@localhost ~]# useradd user01
[root@localhost ~]# useradd -g root user02
[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、常用选项:
4.3、修改用户:usermod

usermod命令用于修改用户帐号

usermod可用来修改用户帐号的各项设定

usermod [选项] 登录
4.3.1、选项
4.3.2、实例
[root@localhost ~]# usermod -d /home user01
[root@localhost ~]# su - user01
-bash-4.2$ pwd
/home
[root@localhost ~]# usermod -u 6666 user02
4.4、删除用户:userdel

userdel命令用于删除用户帐号

userdel可删除用户帐号与相关的文件。若不加参数,则仅删除用户帐号,而不删除相关文件

userdel [-r][用户帐号]
4.4.1、选项
4.4.2、实例
 [root@localhost ~]# userdel user04
[root@localhost ~]# userdel -r user03

5、passwd文件中的shell

查看/etc/passwd文件会发现在每行的最后是登录成功之后执行的命令,有两种是使用最为频繁的:

[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的界面,说明最后的这个段内容就是用户登录之后会运行的程序

image-55

6、用户密码管理

root用户可以直接设置普通用户密码,普通用户必须要提供原密码,才可以修改自己密码。

6.1、passwd

passwd命令用来更改使用者的密码

passwd [选项...] <帐号名称>
6.1.1、选项
6.1.2、实例
[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、选项
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命令执行过程
  1. 当用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限
  2. 确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认
  3. 若密码输入成功,则开始执行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,是可以省略的。

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选项
7.6、实例
[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除外。
[root@localhost ~]# visudo
Defaults env_reset,pwfeedback,timestamp_timeout=60
# 这个是改成60分钟才会需要再次输入密码,并且输入密码的时候会显示*号

五、文件权限管理

1、文件权限

文件权限设置:可以赋予某个用户或组,能够以何种方式,访问某个文件

Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。

为了保护系统的安全性,Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。

在 Linux 中我们通常使用以下两个命令来修改文件或目录的所属用户与权限:

在 Linux 中我们可以使用 ll 或者 ls –l 命令来显示一个文件的属性以及文件所属的用户和组

image-56

每个文件的属性由左边第一部分的 10 个字符来确定(如下图)。

image-57

从左至右用 0-9 这些数字来表示。

2、修改文件属主chown

chown用于设置文件所有者和文件关联组的命令

chown 需要超级用户root的权限才能执行此命令

chown [选项]... [所有者][:[]] 文件...
2.1、选项
2.2、实例
[root@localhost ~]# chown root anaconda-ks.cfg
[root@localhost ~]# chown user01:it file.txt
[root@localhost ~]# chown -R user01:it dir/*

3、修改文件权限chmod

chmod是控制用户对文件的权限的命令

chmod [选项]... 模式[,模式]... 文件...
3.1、模式

mode : 权限设定字串,格式如下 :

[ugoa...][[+-=][rwx]...][,...]
权限 对文件的影响 对目录的影响
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 将这样解释:

3.3、选项
3.4、实例
[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: 权限不够
[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、选项
4.1.2、实例
[root@localhost ~]# getfacl anaconda-ks.cfg 
# file: anaconda-ks.cfg
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
[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、选项
4.2.2、实例
[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/: 权限不够
[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": 权限不够
[root@localhost ~]# setfacl -x u:user1 /workdir/
[root@localhost ~]# getfacl -c /workdir/
user::rwx
group::rwx
mask::rwx
other::---
[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
[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、实例
[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,wx权限以外,还有三个特殊权限: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 密码:
[root@localhost ~]# ps -aux |grep passwd
root       7521  0.0  0.1 170760  2052 pts/0    S+   10:24   0:00 passwd
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、实例
[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、实例
[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种模式:

chattr [-RV][+/-/=<属性>][文件或目录...]
7.1、选项
7.2、实例
[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、选项
8.2、实例
[root@localhost ~]# umask
0022
[root@localhost ~]# umask -S
u=rwx,g=rx,o=rx
[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
[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中生效
[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、进程的生命周期

image-58

父进程复制自己的地址空间(fork)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程ID(PID),满足跟踪安全性之需。PID和父进程ID(PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进程都是第一个系统进程的后代。

4、systemd简介

首先 systmed 是一个用户空间的程序,属于应用程序,不属于 Linux 内核范畴。Systemd 是 Linux 系统中最新的初始化系统(init),它主要的设计目标是克服 sysvinit(这个是centos6中的初始化系统)固有的缺点,提高系统的启动速度。

Linux内核加载启动后,用户空间的第一个进程就是初始化进程,这个程序的物理文件约定位于/sbin/init,当然也可以通过传递内核参数来让内核启动指定的程序。这个进程的特点是进程号为1,代表第一个运行的用户空间进程。不同发行版采用了不同的启动程序,主要有以下几种主流选择:

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、选项

显示信息的格式说明

列名 说明
USER 进程拥有者
PID 进程ID
%CPU 占用的 CPU 使用率
%MEM 占用的内存使用率
VSZ 占用的虚拟内存大小
RSS 占用的常驻内存大小
TTY 执行的终端编号
STAT 该进程的状态*
START 进程开始时间
TIME CPU使用时间
COMMAND 所执行的命令

*STAT表示的进程状态有如下几种:

: 不存在但暂时无法消除,也叫僵尸进程

6.2、实例
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]
-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]
查看进程以层级格式(类似于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
[root@localhost ~]# ps aux --sort %cpu     # 递增
[root@localhost ~]# ps aux --sort -%cpu    # 递减
[root@localhost ~]# ps aux --sort rss     # 递增
[root@localhost ~]# ps aux --sort -rss    # 递减
[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
[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、选项
7.2、交互模式快捷键
快捷键 功能
空格 立即刷新
P 根据CPU使用多少排序
T 根据时间、累计排序
q 退出top命令
m 切换显示内存信息
t 切换显示进程和CPU状态信息
c 切换显示命令名称和完整命令行
M 根据内存的大小排序
W 将当前设置写入 ~/.toprc 文件中,这是top配置文件推荐方法
N 以PID的大小排序
z 彩色
7.3、实例
[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、选项

使用 kill -l 命令列出所有可用信号,最常用的信号如下

编号 信号名 作用
1 SIGHUP 重新加载配置
2 SIGINT 键盘中断^C
3 SIGQUIT 键盘退出
9 SIGKILL 强制终止
15 SIGTERM 终止(正常结束),缺省信号
18 SIGCONT 继续
19 SIGSTOP 停止
20 SIGTSTP 暂停^Z
8.2、例
[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、选项
9.2、实例
[root@localhost ~]# pkill sshd
[root@localhost ~]# pkill -u user1
[root@localhost ~]# pkill -t 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

image-59

nice值越高表示优先级越低,例如+19,该进程容易将CPU使用量让给其他进程

nice值越低表示优先级越高,例如-20,该进程更倾向于不让出CPU

10.1.2、查看进程的nice级别
[root@localhost ~]# ps axo pid,command,nice --sort=nice
[root@localhost ~]# ps axo pid,command,nice,cls --sort=-nice

TS表示该进程使用的调度策略为SCHED_OTHER

NI:实际nice级别

PR:将nice级别显示为映射到更大优先级队列,-20映射到0,+19映射到39

启动进程的时候为进程指定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分析决定的

r 调整进程的优先级(Nice Level) (-20高) - - - 0 - - - (19低)

[root@localhost ~]# sleep 7000 &
[2] 10267
[root@localhost ~]# renice -20 10267
10267 (进程 ID) 旧优先级为 0,新优先级为 -20

11、jobs

jobs 命令可以用来查看当前终端放入后台的任务

jobs [-lnprs] [任务声明 ...]
11.1、将任务放入到后台

Linux 命令放入后台的方法有两种:

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、实例
[root@localhost ~]# top &
[1] 20584
[root@localhost ~]# jobs
[1]+  已停止               top
[root@localhost ~]# fg 1
11.3、后台任务恢复到后台运行

前面讲过,使用Ctrl+z快捷键的方式,可以将前台工作放入后台,但是会处于暂停状态,可以使用bg命令

bg %工作号

这里的 % 可以省略

11.3.1、实例
[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

虽然可以将程序放在后台运行,但是一旦关闭远程连接那么程序就会中断,如果我们想要将程序一直保持在后台运行,那么我们可以有如下三个选择:

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

机械硬盘是靠机械马达以固定的速度转动磁盘,然后再有机械臂的摆动,让磁头可以读取盘片上的磁性信息,这种工作原理的硬盘我们成为机械硬盘。

image-60

由于机械硬盘是依靠机械的运动来读写数据的,大家都知道机械在长时间运转的过程中是会产生一定的损耗,所以机械硬盘虽然理论上寿命很长,但随着时间的变长,机械磨损变大,导致磁头定位的误差变大,从而影响到硬盘的速度,这个就是为什么你的老电脑开机缓慢,运行卡顿的原因了。

1.2、固态硬盘SSD

固态硬盘依靠主控芯片来将数据的二进制信息写入浮栅晶体管中,以这样的原理实现数据的读取和写入。

image-61

固态硬盘在读取和写入数据的时候完全是依靠数字电路实现的,所以并没有机械硬盘的机械磨损,而且也没有在磁盘上定位读写的延迟,所以固态硬盘的数据读写效率是远远高于机械硬盘的,但是也有一定的缺点,由于浮栅晶体管的设计原理,每次数据的读写,都会让浮栅晶体管所需要的电压更高,一定寿命以后,固态硬盘就会失效。并且固态硬盘如果发生了损坏,数据恢复的难度是大于机械硬盘的,所以为了可靠性,企业目前还是在大量使用机械硬盘的。

image-62

image-63

image-64

2、硬盘设备命名

一台服务器往往会配备有多块硬盘,Linux中为了区分不同的硬盘,会使用不同的命名来将硬盘设备标识,Linux系统对物理设备会使用sd[a-z]的方式来命名。物理硬盘上的详细分区会使用数字的方式来进行标识,比如sda设备上的多个分区会标识为sda[1,2,3....]

3、分区表

为了让系统能够识别和管理物理设备上的不同分区,需要在物理设备前加上一些数据用于记录分区的情况,这些数据就是分区表数据,目前分区表有两种主流的格式:

image-64

image-65

image-66

电脑启动的时候:

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 [选项]... [设备 [命令 [参数]...]...]
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  标志
[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 不保存直接退出

gif-67

[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工具

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”开头,分区编号按照如下规则:

设备文件名称

image-68

7、文件系统与数据资料

文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。Linux系统支持数十种的文件系统,而最常见的文件系统如下所示。

日志式与索引式区别

image-69

image-70

文件系统 解释
Ext3 是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分之百地保证资料不会丢失。它会把整个磁盘的每个写入动作的细节都预先记录下来,以便在发生异常宕机后能回溯追踪到被中断的部分,然后尝试进行修复。
Ext4 Ext3的改进版本,作为RHEL 6系统中的默认文件管理系统,它支持的存储容量高达1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4文件系统能够批量分配block块,从而极大地提高了读写效率。
XFS 是一种高性能的日志文件系统,而且是RHEL 7中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为18EB,这几乎满足了所有需求。

格式化后会发生如下事情

计算机系统在发展过程中产生了众多的文件系统,为了使用户在读取或写入文件时不用关心底层的硬盘结构,Linux内核中的软件层为用户程序提供了一个VFS(Virtual File System,虚拟文件系统)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。

image-71

7.1、mkfs工具
mkfs [-V] [-t fstype] [fs-options] filesys [blocks]
[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则不自检
[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 [选项]

常用选项

[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、实例切入

描述:

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
[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、确保文件系统支持
[root@atopos ~]#  mount | grep mountpoint1
/dev/sdb1 on /mnt/mountpoint1 type ext4 (rw,relatime,seclabel,data=ordered)
[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主要参数

[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
[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指令,可查询磁盘空间的限制,并得知已使用多少空间

选项:

9.2、xfs_quota

专门针对XFS文件系统来管理quota磁盘容量配额服务

xfs_quota [参数] 配额 文件系统

硬盘使用量的软限制和硬限制分别为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系统中存在硬链接和软连接两种文件。

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

评论区