Linux从入门到入坑

发布时间:2022-06-26 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Linux从入门到入坑脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

Linux简介

Linux操作系统

Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于posix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux有上百种不同的发行版,如基于社区开发的DebianArchlinux,和基于商业开发的[red hat Enterprise Linux](https://baike.baidu.COM/ITem/Red Hat EnterPRise Linux/10770503)、SUSE、[oracle Linux](https://baike.baidu.com/item/Oracle Linux/6876458)等

Linux从入门到入坑

目前市面上较知名的发行版有:ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OPEnSUSE、Arch Linux、SolusOS 等。

Linux从入门到入坑

总结:

  • Windows 收费闭操作系统,主要用于日常办公、游戏、娱乐多一些 -
  • Linux 免费的,开源的,主要用于服务器领域,性能稳定,安全
  • Unix 用于封闭的硬件环境,企业的应用依赖于定制化开发

内核

  1. 什么是操作系统? 操作系统是负责整个系统最基本功能和系统管理,包括内核、设备驱动程序、启动引导程序、命令行shell或其它种类的用户界面、基本的文件管理工具和系统工具。

Linux从入门到入坑

用户界面是操作系统的外在表象,内核是操作系统的内在核心。

  1. 什么是内核? 内核由一系列程序组成,包括负责响应中断的中断服务程序、负责管理多个进程从而分享处理器时间的调度程序、负责管理地址空间的内存管理程序、网络、进程间通信的系统服务程序等。

内核负责管理系统的硬件设备。

  1. 内核空间 VS 用户空间 内核空间表示内核拥有的内存空间,用户空间表示用户程序执行时的内存空间。

内核拥有直接访问硬件设备的所有权限,用户程序不能直接访问硬件设备,因此用户程序通过系统调用和内核通信来运行。

Linux内核

​ 操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的子设备组成计算机的发动机。但是没有软件来操作和控制它,自身是不能工作的。完成这个控制工作的软件就称为操作系统,在Linux的语中被称为“内核”,也可以称为“核心”。Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。

主要的子程序

  • 系统调用接口
  • 进程管理
  • 内存管理
  • 虚拟文件系统

Linux内核的功能

1、进程管理

内核负责创建和销毁进程,并处理它们与外部世界的联系(输入和输出)。不同进程间通讯(通过信号,管道,或者进程间通讯原语)对整个系统功能来说是基本的,也由内核处理。另外,调度器,控制进程如何共享CPU,是进程管理的一部分。更通常地,内核的进程管理活动实现了多个进程在一个单个或者几个CPU 之上的抽象。

2、内存管理

计算机的内存是主要的资源,处理它所用的策略对系统性能是至关重要的。内核为所有进程的每一个都在有限的可用资源上建立了一个虚拟地址空间。内核的不同部分与内存管理子系统通过一套函数调用交互,从简单的malloc/free对到更多更复杂的功能。

3、文件系统

Unix 在很大程度上基于文件系统的概念;几乎Unix中的任何东西都可看作一个文件。内核在非结构化的硬件之上建立了一个结构化的文件系统,结果是文件的抽象非常多地在整个系统中应用。另外,Linux 支持多个文件系统类型,就是说,物理介质上不同的数据组织方式。例如,磁盘可被格式化成标准Linux的ext3文件系统,普遍使用的FAT 文件系统,或者其他几个文件系统。

4、设备控制

几乎每个系统操作终都映射到一个物理设备上。除了处理器,内存和非常少的别的实体之外,全部中的任何设备控制操作都由特定于要寻址的设备相关的代码来进行,这些代码称为设备驱动.。内核中必须嵌入系统中出现的每个外设的驱动,,从硬盘驱动到键盘和磁带驱动器。内核功能的这个方面是本书中的我们主要感兴趣的地方。

5、网络

网络必须由操作系统来管理,因为大部分网络操作不是特定于某一个进程:进入系统的报文是异步事件。报文在某一个进程接手之前必须被收集,识别,分发。系统负责在程序和网络接口之间递送数据报文,它必须根据程序的网络活动来控制程序的执行。另外,所有的路由和地址解析问题都在内核中实现。

Linux的发展历程

https://www.linuxprobe.com/origin-of-linux.htML

Linux从入门到入坑

centos7 的安装

见博客:http://101.37.172.180:8848/archives/vmware虚拟机安装centos7

初识Shell

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

Linux从入门到入坑

Shell 分类

常见的Shell类型有sh, bash, csh, tcsh, ash,bash shell 是Linux默认的shell,

Shell 语法

命令:整条shell命令的主体部分

选项:会影响会微调命令的行为,通常以-或者--开头

参数: 命令作用的对象(长参数,短参数)

bash的基本特性

自动补全

[root@localhost ~]# yum install -y bash-completion.noarch 

快捷键

  • Ctrl + l - 清屏

  • Ctrl + A - 光标移到行首

  • Ctrl + E - 光标移到行尾

  • Ctrl + W - 清除光标之前一个单词

  • Ctrl + K - 清除光标到行尾的字符

  • Ctrl + T - 交换光标前两个字符

  • Ctrl + V - 输入控制字符 如Ctrl+v ,会输入^M

  • Ctrl + F - 光标后移一个字符

  • Ctrl + B - 光标前移一个字符

  • Ctrl + H - 删除光标前一个字符

历史命令

[root@localhost ~]# history 

选项

  • -c:将目前shell中的所有history命令消除(只清空缓存,不清空文件)
  • -a:将目前新增的命令写入 histfiles , 默认写入 ~/.bash_history
  • -d:删除指定的历史命令
  • -r:将 histfiles 内容读入到目前shell的history记忆中
  • -w:将目前history记忆的内容写入到 histfiles
  • 使用 ! 执行历史命令
# history [n] n为数字,列出最近的n条命令
[root@localhost ~]# history -w histfiles.txt 1 
[root@localhost ~]# history -c ! number 执行第几条命令 ! command 从最近的命令查到以 command 开头的命令执行 
!! 执行上一条

命令别名(alias)

[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 ~]# alias cathis='cat /root/.bash_history'
[root@localhost ~]# cathis

取消别名

[root@localhost ~]# unalias cathis='cat /root/.bash_history'

man手册

查看某个命令的 man手册

[root@localhost ~]# man ls

下载安装中文版的man手册

[root@localhost ~]# yum -y install man-pages-zh-CN.noarch
[root@localhost ~]# echo alias cman='man -M /usr/share/man/zh_CN' >> /root/.bashrc	
[root@localhost ~]# source .bashrc
[root@localhost ~]# cman ls

文件管理

文件系统目录结构

在Linux中,文件以树状图的形式表现出来。其中/ 为根目录 只有一个根目录 。所以也称之为单根文件系统

Linux从入门到入坑

  • /bin:(Red Hat7以后,该目录被淘汰) bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。

  • /boot: 这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。

  • /dev : dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。

  • /etc: etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。

  • /home:(普通用户家目录) 用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve。

  • /root: 该目录为系统管理员,也称作超级权限者的用户主目录。

  • /lib: lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。

  • /lost+found: 这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。

  • /media: linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。

  • /mnt: 系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。

  • /opt: opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。

  • /proc: proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。 这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:

    echo 1 > /proc/Sys/net/ipv4/icmp_echo_ignore_all
    
  • /sbin: s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。

  • /selinux: 这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。

  • /srv: 该目录存放一些服务启动之后需要提取的数据。

  • /sys

    这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs 。

    sysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。

    该文件系统是内核设备树的一个直观反映。

    当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。

  • /tmp: tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的。

  • /usr: usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。

  • /usr/bin: 系统用户使用的应用程序。

  • /usr/sbin: 超级用户使用的比较高级的管理程序和系统守护程序。

  • /usr/src: 内核源代码默认的放置目录。

  • /VAR: var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

  • /run: 是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。

文件定位 路径

路径的作用:定位文件

绝对路径:从根目录下出发的路径称为绝对路径

相对路径:相对于当前目录下出发的路径称为相对路径

[root@localhost ~]# cd [路径]
#相对路径
[root@localhost ~]# mkdir test
[root@localhost ~]# cd test
#绝对路径
[root@localhost ~]# cd /root/test

文件管理 (文件操作)

文件(touch)

[root@localhost ~]# touch [fiile-name] # 无则创建,有则修改时间
[root@localhost ~]# touch file1 file2 file3
[root@localhost ~]# touch /home/{file4,file4}
[root@localhost ~]# touch test{1..1000}
# 创建test1-test1000 文件
[root@localhost ~]# touch test{1,10}
# 创建test1 和 test10

目录(mkdir)

[root@localhost ~]# mkdir dir
[root@localhost ~]# mkdir dir1 dir2 dir3
[root@localhost ~]# mkdir dir{1..5}
[root@localhost ~]# mkdir -p /dir/test/dir1
# 递归创建
选项:
	-v:将创建的结果打印出来
	-p:递归创建

拷贝(cp)

[root@localhost ~]# cp [目标file/目录] [目的file/目录]
[root@localhost ~]# cp /root/dir/test test1
参数
-a:相当于 -pdr 的意思,至于 pdr 请参考下列说明;(常用)

-d:若来源档为连结档的属性(link file),则复制连结档属性而非文件本身;

-f:为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;

-i:若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)

-l:进行硬式连结(hard link)的连结档创建,而非复制文件本身;

-p:连同文件的属性一起复制过去,而非使用默认属性(备份常用);

-r:递归持续复制,用于目录的复制行为;(常用)

-s:复制成为符号连结档 (symbolic link),亦即『捷径』文件;

移动(mv)

[root@localhost ~]# mv file1 /root/dir	# 将file1移动到/root/dir
[root@localhost ~]# mv file2 /root/dir/file20 
# 将file2 移动到 /root/dir 目录下, 并改名为 file20
[root@localhost ~]# mv file3 file4 
# 将file3改名为file4

删除(rm)

[root@localhost ~]# rm -f(强制删除) [file_name]
[root@localhost ~]# rm -r(递归删除) [file_name] # 删除目录
[root@localhost ~]# rm -i [file_name] # 交互模式删除
[root@localhost ~]# rm -rf [file_name]

查看(cat)

除此之外还有:tac less more tail tailf

cat:从上往下(正常顺序)打开

tac:从下网上打开

more:显示进度 (空格翻页、q退出)

head:默认从前面查看10行

tail:从后面查看

tailf:实时追踪

管道符、重定向于环境变量

重定向

  • 输入输出

    • 标准输入
    • 标准正确输出1
    • 标准错误输出2
  • 输出重定向

    • '>' : 覆盖重定向
    • '>>' : 追加重定向
    • '2>' : 覆盖重定向错误输出数据流
    • '2>>' : 追加重定向错误输出数据流
  • 输入重定向

    • '<':覆盖输入重定向
    • '<<':追加输入重定向
  • 标准输出和错误输出各自重定向至不同位置

    [root@localhost ~]# commmand 1> /path/file.out 2> /path/error.out /dev/null
    
  • 合并标准输出和错误输出为同一个数据流进行重定向

    • '&amp;>':覆盖重定向
    • '&>>': 追加重定向
    • '2>&1': 将错误流重定向到标准输出文件中
    • '1>&2': 将正确流重定向到标准错误输出文件中
  • 标准输入

[root@localhost ~]# cat > output <<EOF
> 123
> 456
> 678
> EOF
[root@localhost ~]# cat >> output <<EOF
> 789
> 456
> 123
> EOF
[root@localhost ~]# cat output 

管道符命令

通俗来说,把前一个命令原本要输出到屏幕上的内容当成后一个命令的数据 两个命令用 " | " 分隔开

[root@localhost ~]# 命令1 | 命令2 | 命令3
[root@localhost ~]#  grep "/sbin/noLOGin" /etc/passwd | wc -l
15

通过管道符重置用户密码

[root@localhost ~]# echo redhat | passwd --stdin root
Changing password for user root. 
passwd: all authentication tokens updated successfully. 

命令行的通配符

  • '*': 代表匹配所有
[root@localhost ~]# ls -l /dev/sda*
brw-rw----. 1 root disk 8, 0 Oct 18 07:32 /dev/sda
brw-rw----. 1 root disk 8, 1 Oct 18 07:32 /dev/sda1
brw-rw----. 1 root disk 8, 2 Oct 18 07:32 /dev/sda2
  • '?': 代表匹配单个字符
[root@localhost ~]# ls -l /dev/sda?
brw-rw----. 1 root disk 8, 1 Oct 18 07:32 /dev/sda1
brw-rw----. 1 root disk 8, 2 Oct 18 07:32 /dev/sda2
  • 除了使用[0-9]来匹配 0~9 之间的单个数字,也可以用[135]这样的方式仅匹配这三个指定 数字中的一个,若没有匹配到,则不会显示出来:
[root@localhost ~]# ls -l /dev/sda[0-9]
brw-rw----. 1 root disk 8, 1 Oct 18 07:32 /dev/sda1
brw-rw----. 1 root disk 8, 2 Oct 18 07:32 /dev/sda2

[root@localhost ~]# ls -l /dev/sda[135]
brw-rw----. 1 root disk 8, 1 Oct 18 07:32 /dev/sda1

重要的环境变量

​ 变量是计算机系统用于保存可变值的数据类型。在 Linux 系统中,变量名称一般都是大 写的,这是一种约定俗成的规范。我们可以直接通过变量名称来提取到对应的变量值。Linux 系统中的环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录、邮件 存放位置等。

变量名 作用
HOME 用户的主目录(及家目录)
SHELL 用户在使用的Shell解释器的名称
HISTSIZE 输出的历史命令条数
HISTFILESIZE 保持的历史命令条数
MAIL 邮件保存路径
LANG 系统语言,语系名称
RANDOM 生成一个随机数字
ps1 Bash解释器的提示符
PATH 定义解释器搜索用户执行命令的路径
EDITOR 用户默认的文本编辑器

我们可以自己定义变量,例如定义一个变量WORKDIR,方便直接到达用户工作的目录,如下:

[root@localhost ~]# useradd user1
[root@localhost ~]# echo 123 | passwd --stdin user1 
Changing password for user user1.
passwd: all authentication tokens updated successfully.
[root@localhost ~]# mkdir /home/user1/test
[root@localhost ~]# WORKDIR=/home/user1/test/
[root@localhost ~]# cd $WORKDIR
[root@localhost test]# pwd
/home/user1/test

但是,这样的变量不具有全局性,作用范围也有限,默认情况下不能被其他用户所使用。可以使用export命令将其提升为全局变量。

[root@localhost ~]# export WORKDIR

小工具

tr命令

[root@localhost ~]# tr [option] [set1] [set2]
常用选项
-d: 删除
案例1:
将/etc/passwd文件中的前5行的内容转换为大写后保存在/tmp/passwd.out中
[root@localhost ~]# head -n 5 /etc/passwd | tr 'a-z' 'A-Z' > /tmp/passwd.out
[root@localhost ~]# cat /tmp/passwd.out 
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

案例2:
[root@localhost ~]# who
root     pts/0        2021-10-18 17:51 (192.168.88.1)
[root@localhost ~]# who | tail -n 1 | tr 'a-z' 'A-Z' > /tmp/who.out
[root@localhost ~]# cat /tmp/who.out 
ROOT     PTS/0        2021-10-18 17:51 (192.168.88.1)

wc命令(统计)

常用选项:
-l: 显示行数
-w: 单词数
-c: 字符数

cut命令(切割命令)

常用选项:
-d: 指定分割符
-f: 指定字段

sort命令(排序文件)

常用选项:
-f: 忽略大小写
-r: 逆序
-t: 字段分割符
-k #: 以指定字段为标准排序
-n: 以数值进行排序
-u: 排序后去重

uniq命令(去重)

常用选项:
-c: 仅显示每行重复出现的次数
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行
案例:
[root@localhost ~]# cut -d: -f6-10 /etc/passwd | cut -f3 | sort -n | uniq -c      1 /bin:/sbin/nologin
      1 /home/user1:/bin/bash
      1 /root:/bin/bash
      1 /root:/sbin/nologin
      1 /sbin:/bin/sync
      4 /:/sbin/nologin
      1 /sbin:/sbin/halt
      1 /sbin:/sbin/nologin
      1 /sbin:/sbin/shutdown
      1 /usr/games:/sbin/nologin
      1 /var/adm:/sbin/nologin
      1 /var/empty/sshd:/sbin/nologin
      1 /var/ftp:/sbin/nologin
      1 /var/lib/chrony:/sbin/nologin
      1 /var/spool/lpd:/sbin/nologin
      1 /var/spool/mail:/sbin/nologin
      1 /var/spool/postfix:/sbin/nologin

文本编辑器

Linux上也有图形化的文本编辑器,类似windows的记事本,但是很多时候我们也只能用命令行来管理Linux操作系统,所以必须要掌握命令行的文本编辑器软件。

目前常见的文本编辑器有:

  • nano: 在debain系列的系统上会比较常见,但是在其他的发行版中也可以安装
  • vi: 所有的Unix link 系统都会内置vi 文本编辑器,其他的文本编辑器则不一定会存在
  • vim: 具有程序编辑能力的文本编辑器,可以主动以字体颜色辨别语法的正确性,方便设计程序

目前vim是使用最多的,也是比较推荐的Linux文本编辑器

什么是vim

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

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

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

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

Linux从入门到入坑

vi/vim的使用

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

命令模式

刚刚启动vim的时候就进入了命令模式

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

以下是常用的几个命令:

  • i : 切换到命令模式(在当前字符的前面输入)
  • a : 切换命令模式(在当前字符后买你输入)
  • o : 切换命令模式(在当前行的下一行输入)
  • x : 删除当前光标所在位置的字符
  • ':' : 切换到末行模式,在最底下一行输入命令

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

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

输入模式

进入输入模式的命令上面讲到

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

  • 字符按键及Shift组合,输入字符
  • ENTER 回车键,换行
  • DEL 删除键,删除光标后面的一个字符
  • hjkl : 方向键,不过这个只能在命令模式中使用
  • ESC ,退出输入模式,切换到命令模式
  • HOME/END,移动光标到行首/行尾
  • Page Up/Page Down,上/下翻页

末行模式

在命令模式下按下:(英文冒号) 就可以进入末行模式,在末行模式下可用的命令非常多。基本命令有:

  • q :退出但不保存
  • w : 写入(保存)
  • x :保存并退出

Linux从入门到入坑

详细用法

  • 移动光标的方法
h 或 向左 箭头键 (←) 光标向左移动一个字符
j 或 向下 箭头键(↓) 光标向下移动一个字符
k 或 向上 箭头键(↑) 光标向上移动一个字符
l 或 向右 箭头键 (→) 光标向右移动一个字符
[Ctrl] + [f] 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用)
[Ctrl] + [b] 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用)
[Ctrl] + [d] 屏幕『向下』移动
[Ctrl] + [u] 屏幕『向上』移动半页
+ 光标移动到非空格符的下一行
- 光标移动到非空格符的上一行
n+空格 或者 nl/nh 那个 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环境变量

root@localhost ~]# vim .vimrc	# 当前用户生效
root@localhost ~]# vim /etc/vimrc	# 全局生效
# 行号
显示:set number,简写为set nu
取消显示:set nonumber,简写为set nonu
# 括号匹配
匹配:set showmatch,简写为set sm
取消:set nosm
# 自动缩进
启用:set ai
禁用:set noai
# 高亮搜索
启用:set hlsearch
禁用:set nohlsearch
# 语法高亮
启用:syntax on
禁用:syntax off
# 忽略字符的大小写
启用:set ic
不忽略:set noic
# 获取帮助
: help

文件基本属性与文件查找

文件属性

文件时间

​ 任何一个操作系统都有时间的概念,时间的概念主要用于对文件和系统中发生的时间进行记录,在Linux中, 可以使用stat查看linux系统中文件的时间

stat

用于显示文件时间和inode内容

stat [选项]... 文件...

实例

  • 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:改变时间(状态)
    • 当文件状态被改变的时候,这个时间就会发生变化

文件类型

​ Linux系统和Windows系统有很大的区别,Windows系统查看文件的后缀名就可以知道这个是什么类型的文 件,比如: test.jpg 这个是一个图片,如果你在windows上双击打开,就会使用支持查看图片的软件打 开。

Linux系统就根本不看文件的后缀名,你认为这个是什么文件,你就使用什么工具打开这个文件,如果打开错 误,就会报错,看下面的案例

root@localhost ~]# cat file
cat: file: Is a directory

​ 当你以为file是个文件,使用cat命令查看的时候,cat会提示你这个是个文件夹,你才反应过来,应该使用cd 命令打开。 所以在Linux中,我们需要使用和windows不一样的方法来判断这个文件的类型。

方法一: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

方法二: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)

文件查找

which

用于查找文件

which命令会在环境变量$PATH设置的目录里查找符合条件的文件

[root@localhost ~]# which [filename...]

实例

  • 查看ls命令的可执行文件在哪个目录
[root@localhost ~]# which ls
lias ls='ls --color=auto'
/usr/bin/ls
# which会先告诉你ls其实是一个别名
# 然后显示出来ls所在的具体位置

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

  • 查看poweroff在什么目录
[root@localhost ~]# which poweroff
/usr/sbin/poweroff

locate

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

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

[root@localhost ~]# yum -y install mlocate

locate命令的使用方式如下

[root@localhost ~]# locate [选项]...[范本样式]...

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

  • 手动更新,输入 updatedb
  • 默认情况下,updatedb 会每天自动执行一次

选项

  • -c:只输出找到的数量
  • -n:至多显示 n个输出
  • -i:忽略大小写
  • -r:使用基本正则表达式
  • --regex:使用扩展正则表达式
  • -d DBPATH:使用 DBPATH 指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db

实例

  • 查找passwd文件所在的位置
root@localhost ~]# updatedb
# 更新数据库并不是每次查找都需要,但是建议更新数据库来保证数据是最新的
[root@localhost ~]# locate passwd
  • 查找ens33网卡配置文件所在的位置
[root@localhost ~]# locate -r ens33$
/etc/sysconfig/network-scripts/ifcfg-ens33
# $在正则表达式中表示以什么结尾,所以ens33$表示的是以ens33结尾的文件

find

实时查找工具,通过遍历指定路径下的文件系统来完成文件的查找

工作特点:

  • 查找速度略慢
  • 精确查找
  • 实时查找
  • 可以满足多种条件的匹配

使用方法如下

find [选项] [路径] [查找条件 + 处理动作]
# 查找路径:指定具体目录路径,默认是当前文件夹
# 查找条件:指定的查找标准(文件名/大小/类型/权限等),默认是找出所有文件
# 处理动作:对符合条件的文件做什么操作,默认输出屏幕

查找条件

  • 根据文件名查找
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天以内

atime: 文件访问时间

ctime: 文件状态修改时间

mtime: 文件内容修改时间

  • 按照文件属主,属组查找
[root@localhost ~]# find /home -user atopos # 属主是atopos的文件
[root@localhost ~]# find /home -group atopos
[root@localhost ~]# find /home -user atopos -group atopos
[root@localhost ~]# find /home -user atopos -a -group root
[root@localhost ~]# find /home -user atopos -o -group root
[root@localhost ~]# find /home -nouser # 没有属主的文件
[root@localhost ~]# find /home -nogroup # 没有属组的文件

其中-a是和,-o是或

  • 按文件类型
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] 任意一个数字

处理动作

  • -print:默认的处理动作,显示到屏幕上
  • -ls:类似与对查找到的文件执行ls -l命令
  • -delete: 删除查找到的文件
  • -fls /path/to/somefile:查找到的所有文件的长格式信息保存至指定的文件中
  • -ok COMMAND{}:对查找到的文件执行由COMMAND指定的命令,需要确认
  • -exec COMMAND{}:对查找到的文件执行由COMMAND指定的命令,不需要确认
  • {}:用于引用查找到的文件名自生

实例

  • 查找/var目录下属主为root,且属组为mail的所有文件或目录
[root@localhost ~]# find /var -user root -a -group mail
  • 查找/usr目录下不属于root,bin或Hadoop的所有文件或目录
[root@localhost ~]# find /usr -not -user root -not -user bin -not -user Hadoop(centos)
[root@localhost ~]# find /usr -not (-user root -user bin -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 -a -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系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须向管理员申请一个账号,然后输入这个账号的身份进入系统。

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

  • 系统上每个进程(运行的程序)都是作为特定用户运行的
  • 每个文件是由一个特定的用户拥有
  • 访问文件和目录收到用户的限制
  • 与正在运行的进程相关联的用户确定该进程可以访问的文件和目录

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

  • 用户账号的添加,删除和修改
  • 用户口令的管理
  • 用户组的管理

用户和用户组的查看

id

现实用户的ID,以及所属群组的ID

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

[root@localhost ~]# id [OPTION]... [USER]
  • g:显示用户所属群组的ID
  • -G:显示用户所属附加组的ID
  • -n:显示用户,所属群组或者附加组的名称
  • -r:显示实际ID
  • -u:显示用户ID

uid的约定

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

  • 0:超级管理员,也就是root,在Linux系统中拥有绝对的权力
  • 1~999:系统用户,系统用户往往是用来约束系统中的服务用的
  • 1000+:普通用户,可以用来登录和使用Linux操作系统

关于root用户

  • uid是0
  • 拥有操作系统的所有权利
  • 该用户有权力覆盖文件系统上普通权限
  • 安装后者删除软件并管理系统文件和目录
  • 大多数设备只能有root控制

实例

  • 查看当前登录用户的信息
[root@localhost ~]# id
uid=0(root) gid=0(root) 组=0(root) 环境
=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
  • 查看文件的拥有者

Linux从入门到入坑

  • 查看运行进程的用户名
[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]

相关的文件

Linux一切皆文件,所以用户和用户组相关的信息也都是保存在文本文件中的

passwd文件

用于保存用户信息,一般第一行是root用户,下面都是其他用户

[root@localhost ~]# head -n 1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 这个格式为用户名:密码:uid:gid:描述:家目录:登陆后执行的命令

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

group文件

用户和组的对应关系,会保存在group这个文件中

[root@localhost ~]# head -n 1 /etc/group
root:x:0:
# 这个格式是组名:口令:组标识号:组内用户列表

用户组管理

Linux从入门到入坑

groupadd 添加用户组

groupadd 命令用于创建一个新的工作组,新工作组的信息将被添加到系统文件中

[root@localhost ~]# groupadd [选项] 组名

选项

  • -g:指定新建工作组的ID
  • -r:创建系统工作组,系统工作组的ID小于500
  • -k:覆盖配置文件/etc/login.defs
  • -o:允许添加组ID号不唯一的工作组
  • -f:如果指定的组已经存在,此选项将失明了仅以成功的状态退出,当与 -g 一起使用,并且指定的 GID_MIN已经存在时,选择另一个唯一的GID(即-g关闭)

实例

[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:

groupmod 修改用户组

groupmod命令用于更改用户组识别码或者名称

[root@localhost ~]# groupmod [选项] 名称

选项

  • -g:将组ID改为GID
  • -n:改名
  • -o:允许重复使用GID

实例

  • 修改fd组的名称为finance
[root@localhost ~]# groupmod -n finance fd
[root@localhost ~]# tail -n 1 /etc/group
finance:x:4000:

groupdel:删除用户组

groupdel命令用于删除群组

需要从系统上删除群组时,可用groupdel(group delete)指令来完成这项工作。倘若该群组中仍包括某些用 户,则必须先删除这些用户后,方能删除群组。

[root@localhost ~]# groupdel 组名

实例

  • 删除一个用户组
[root@localhost ~]# groupadd test
[root@localhost ~]# groupdel test

gpasswd:用户组成员管理

gpasswd 是 Linux 下工作组文件 /etc/group 和 /etc/gshadow 管理工具,用于将一个用户添加到组或者从组 中删除

[root@localhost ~]# gpasswd [选项] 组名

选项

  • -a:将用户添加到组里面
  • -d:从组里删除用户
  • -A:指定管理员
  • -M:指定组成员和-A的用途差不多
  • -R:限制用户登入组,只有组中的用户才可以用newgrp加入该组

实例

  • 创建用户test,并且加入it组
[root@localhost ~]# useradd test
[root@localhost ~]# gpasswd -a test it
正在将用户“test”加入到“it”组中
[root@localhost ~]# cat /etc/group |grep it:
it:x:3000:test
# 在组文件中,可以看到这个组的成员
[root@localhost ~]# id test
uid=6667(test) gid=6667(test) 组=6667(test),3000(it)
# 在用户的信息中,可以看到这个用户的所属组

用户管理

useradd:添加用户

uaeradd可以用来添加新的用户

[root@localhost ~]# useradd [选项] 用户名

新建用户home目录下的bash开头的文件时从/etc/skel/中复制过去的

如果创建一个用户时,未指定任何选项,系统会创建一个和用户名相同的组作为用户的 Primary Group

选项

  • -c comment:指定一段注释性描述
  • -d :指定用户的主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录
  • -m:创建用户的主目录
  • -g:指定用户所属的用户组,默认会创建一个和用户名差不多的用户组
  • -G:指定用户的附加组,一个用户可以属于多个附加组
  • -s:指定用户登录的shell
  • -u:指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号
  • -r:创建系统用户

实例

  • 添加一般用户
[root@localhost ~]# useradd test1
  • 为添加的用户指定相应的用户组
[root@localhost ~]# useradd -g root test2
  • 为新添加的用户指定home目录
[root@localhost ~]# useradd -m /home/test3 test3
  • 创建一个不给登录的用户
[root@localhost ~]# useradd -s /sbin/nologin test4

usermod:修改用户信息

usermod用于修改用户的的各类设定

[root@localhost ~]# usermod [选项] 用户名

选项

  • -c:修改用户账号的备注信息

  • -a:追加,默认的修改是覆盖

  • -d:修改用户登入时的目录

  • -e:修改账号的有效期限

  • -f:修改在密码过期后多少天关闭该账号

  • -g:修改用户所属群组

  • -G:修改用户所属附加组

  • -l:修改用户账号的名称

  • -L:锁定用户密码,使密码无效

  • -a:修改用户登录后使用是shell

  • -u:修改用户uid

  • -U:解除密码锁定

实例

  • 更改登录的目录
[root@localhost ~]# useradd user01
[root@localhost ~]# usermod -d /home user01
[root@localhost ~]# su - user01
-bash-4.2$ pwd
/home
  • 改变用户的UID
[root@localhost ~]# usermod -u 6666 user01

userdel:删除用户

userdel命令用于删除用户账号

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

[root@localhost ~]# userdel [-r] 用户账号

选项

  • -r:删除用户登入目录以及目录中所有的文件

passwd文件中的shell

查看/etc/passwd文件会发现每一行的最后面是我们登录成功以后执行的命令,其中有两种命令使用最为频繁

  • /bin/bash:这个是Linux命令行工具,我么你正常登录后默认进入的就是这个命令行
  • /sbin/nologin:如果写成nologin,那么用户将无法登录,有些用户是作为进程权限管理而存在的,不需 要登录。如果提供登录的功能反而不安全,所以写成nologin

cat一下/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 -s /bin/vi test
[root@localhost ~]# tail -n 1 /etc/passwd
test:x:1000:1000::/home/test:/bin/vi

我们切换到test用户就会发现用户默认进入vi编辑页面

login.defs

useradd参照文件

创建用户时对用户的一些限制,对root用户无效

[root@atopos ~]# vim /etc/login.defs
MAIL_DIR /var/spool/mail
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
CREATE_HOME yes
ENCRYPT_METHOD SHA512
[root@atopos ~]# vim /etc/default/useradd
SHELL=/bin/bash

chage

[root@localhost ~]# chage [选项] 用户

选项

  • -d, --lastday 最近日期 将最近一次密码设置时间设为“最近日期”
  • -E, --expiredate 过期日期 将帐户过期时间设为“过期日期”
  • -h, --help 显示此帮助信息并推出
  • -I, --inactive INACITVE 过期 INACTIVE 天数后,设定密码为失效状态
  • -l, --list 显示帐户年龄信息
  • -m, --mindays 最小天数 将两次改变密码之间相距的最小天数设为“最小天数”
  • -M, --maxdays 最大天数 将两次改变密码之间相距的最大天数设为“最大天数”
  • -R, --root CHROOT_DIR chroot 到的目录 -W, --warndays 警告天数 将过期警告天数设为“警告天数”

实例

[root@atopos ~]# useradd user01
[root@atopos ~]# echo 123456 |passwd --stdin user01
更改用户 user01 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@atopos ~]# chage -d 0 user01 # 强制用户在下次登录的时候换密码

用户密码管理

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

passwd命令

[root@localhost ~]# passwd [选项...] 账号名称

选项

  • -n mindays:指定最短使用期限
  • -x maxdays:指定最大使用期限
  • -w warndays:提前多少天开始警告
  • -i inactivedays:非活动期限
  • --stdin:从标准输入接收用户密码

实例

[root@localhost ~]# echo "123456" | passwd --stdin username

sudo:提权

以root用户的身份授权普通用户

文件权限

基本权限 UGO

文件权限时控制某个用户或者用户组访问某个文件的方式

Linux从入门到入坑

UGO设置基本权限

权限对象

U:属主

G:属组

O:其他人

权限类型

r:读 数字:4

w:写 数字:2

x:执行 数字:1

权限管理

chown:更改文件的属组和属主

[root@localhost ~]# chown user01:user01 file
# 更改属主和属组
[root@localhost ~]# chown :user01 file
# 只更改属组
[root@localhost ~]# chown user01 file
# 只更爱属主

chmod:更改文件权限

对象:u g o a

赋值符号:+ - =

权限类型:r w x 也可以用数字

[root@localhost ~]# chown u+x file	# 属主增加执行全新啊
[root@localhost ~]# chown a=rwx	file	# 所有用户赋予rwx权限
[root@localhost ~]# chown ug=rw,o=r	file	# 属主属组赋予读写,其他人只读

# 使用数字
[root@localhost ~]# chown 644 file	# 属主拥有读写权限,属组和其他用户只读

chown:改变某个文件的属主属组

chmod:改变某个文件自身的权限

r,w,x权限对文件和目录的意义区别

权限 对文件的影响 对目录的影响
r(读取) 可以读取文件的内容 可以列出目录的内容,可以使用ls相关命令
w(写入) 可以更改文件的内容 可以创建或删除目录中的文件,可以使用touch,rm等相关命令
x(执行) 可以执行可执行文件 可以访问目录里面的内容,可以使用cd等相关命令

目录权限跟文件权限无关

ACL设置基本权限(r,w,x)

UGO设置基本权限:只能一个用户或者一个组或者其他人

ACL的基本用法

[root@localhost ~]# setfacl [选项] 文件/目录

选项

  • -m:添加acl设定参数
  • -x:删除acl设定参数
  • -b:移除所有的acl设定参数
  • -R:递归添加acl设定参数
  • -d:添加默认的acl设定参数(目录)

实例

[root@atopos ~]# ll file1
-rw-r--r--. 1 centos it 0 9月 4 11:03 file1
[root@atopos ~]# getfacl file1
# file: file1
# owner: centos
# group: it
user::rwgroup::r--
other::r--
[root@atopos ~]# setfacl -m u:centos:rw file1 # 增加用户权限
[root@atopos ~]# setfacl -m u:user05:- file1 # 增加用户权限
[root@atopos ~]# setfacl -m o::rw file1 # 修改其他人权限
[root@atopos ~]# ll file1
-rw-rw-rw-+ 1 centos it 0 9月 4 11:03 file1
[root@xwz ~]# getfacl file1
# file: file1
# owner: centos
# group: it
user::rwuser:centos:rwuser:user05:---
group::r--
mask::rwother::rw-
[root@xwz ~]# setfacl -m g:hr:r file1 # 增加组权限
[root@xwz ~]# setfacl -x g:hr file1 # 删除组权限
[root@xwz ~]# setfacl -b file1 # 删除所有acl权限

mask

mask决定了用户对文件的的最高权限,说白了,mask和acl共同控制用户对文件的权限,如果mask权限为r--,acl权限为rwx,则最后的权限只能时r--

mask 权限,指的是用户或群组能拥有的最大 ACL 权限,也就是说,给用户或群组设定的 ACL 权限不能超过 mask 规定的权限范围,超出部分做无效处理。

设置mask权限

[root@atopos ~]# setfacl -m m::--- file1
[root@atopos ~]# getfacl file1
# file: file1
# owner: centos
# group: it
user::rwgroup::r-- 		#effective:---
mask::---
other::---

default

一般正对访问目录,默认权限独立与该目录本身的权限,规定了在该目录中创建文件的默认acl权限

default可以指定在目录中创建的新文件的初始acl权限

实例

用户centos能够对/home以及以后再/home下创建的文件具有读写执行权限

[root@atopos ~]# setfacl -m u:centos:rwx /home
[root@atopos ~]# setfacl -m d:u:centos:rwx /home
[root@atopos ~]# getfacl /home
getfacl: Removing leading '/' From absolute path names
# file: home
# owner: root
# group: root
user::rwx
user:centos:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:centos:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

特殊权限

文件除了上述的r,w,x基本权限,还有三个特殊权限:suid,sgid,sbit(sticky)

suid

suid 属性只能运用在可执行文件上,含义是开放文件所有者的权限给其他用户,即当用户执行该执行文件 时,会拥有该执行文件所有者的权限。如果给一个非二进制文件文件附加 suid 权限,则会显示大写S,属于无效。

普通用户能够执行 passwd 命令修改自己的密码,修改密码其实就是修改 /etc/shadow 这个文件,查 看 /etc/passwd 这个文件的权限,发现除了 root 其他人没有写权限,但是普通用户能够成功执行 passwd ,其原因就在于 passwd 这个命令的权限是 rwsrw---- ,其中 s 的作用就是让执行命令的人具有和 该命令拥有者相同的权限。

[root@atopos ~]# ll /usr/bin/passwd 
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

实例

[root@localhost ~]# su - user1
[user1@localhost ~]$ passwd
更改用户 user1 的密码 。
为 user1 更改 STRESS 密码。
(当前)UNIX 密码:
  • 保持这个会话,新建一个会话,查看系统进程,可以看到当前是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

sgid

sgid 属性可运用于文件或者目录,运用在文件的含义是开放文件所属组的权限给其他用户,即当用户执行 该执行文件时,会拥有该执行文件所属组用户的权限。如果给一个非二进制文件文件附加 sgid 权限,则会 显示大写S,属于无效。

运用在目录上的含义是,在该目录下所有用户创建的文件或者目录的所属组都和其一样。即如 果 /home/user1 目录具有 sgid 权限,且所属组是 user1 ,则任何用户在 /home/user1 下创建的子目录 或者文件的所属组都是 user1 。

实例

  • 设置sgid,让用户在workdir下创建的文件都属于worker组
[root@atopos ~]# mkdir workdir
[root@atopos ~]# chmod g+s workdir/
[root@atopos ~]# cd workdir/
[root@atopos workdir]# touch file2
[root@atopos workdir]# ll
total 0
-rw-r--r--. 1 root root   0 Jan 13 07:04 file
-rw-r--r--. 1 root worker 0 Jan 13 07:05 file2

sbit(sticky)

sticky 权限只能运用于目录上,含义是该目录下所有的文件和子目录只能由所属者删除,即使其的权限是777 或者其他。一个公共目录,每个人都可以创建文件,删除自己的文件,但不能删除别人的文件(仅对目录有效)

实例

  • 设置sbit,让普通用户只能创建文件,不能删除文件
[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

chattr文件属性

chattr命令用来改变文件的属性

这项指令可以改变存放在文件或者目录属性,这些属性共有一下8种模式:

  • a:让文件或目录仅供附加用途
  • b:不更新文件或目录的最后存取时间
  • c:将文件或目录压缩后存放
  • d:将文件或目录排除在倾倒操作之外
  • i:不得任意更动文件或目录
  • s:保密性删除文件或目录
  • S:即时更新文件或目录
  • u:预防意外删除
[root@localhost ~]# chattr [-RV][+/-/=<属性>][文件或目录...

选项

  • -R:递归处理,将指定目录下的所有文件及子目录一并处理
  • -v <版本编号>:设置文件或目录版本
  • -V:显示指令执行过程
  • +<属性>:开启文件或目录的该项属性
  • -<属性>:关闭文件或目录的该项属性
  • = <属性>:指定文件或目录的该项属性

实例

  • 使用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: 不允许的操作

umask

umask命令指定在建立文件时预设的权限掩码,进程 新建文件、目录的默认权限会收到umask的影响, umask表示要减掉得到权限。

umask可用来设定[权限掩码]。[权限掩码]是由3个八进制的数字所组成,将现有的存取权限减掉权限掩码后, 即可产生建立文件时预设的权限。

[root@localhost ~]# umask [选项][权限掩码]

选项

  • -S:以文字的方式来表示权限掩码

实例

  • 查看当前用户的umask权限
[user01@atopos ~]$ umask
0002
  • 查看最终所有的权限
[user01@atopos ~]$ umask -S
u=rwx,g=rwx,o=rx
  • 修改umask数值(临时)
[user01@atopos ~]$ umask 0000
[user01@atopos ~]$ mkdir dir1
[user01@atopos ~]$ ll
total 0
drwxrwxrwx. 2 user01 user01 6 Jan 13 07:28 dir1
  • 修改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
------------------

进程process

什么是进程

进程是cpu进行资源分配的最小单位,是一个在系统中运行的程序

进程是已启动的可执行程序的运行实例,进程有一下部分组成:

  • 已分配的内存空间
  • 安全属性,包括所有权凭据和特权
  • 进程代码的一个或多个执行线程
  • 进场状态

进程:程序运行的过程,动态,有生命周期及运行状态

进程类型

守护进程:在系统引导启动过程中启动的进程,跟终端无关

前台进程:跟终端相关,通过终端启动的进程

进程的生命周期

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

Centos5/6:init

centos7: systemd

进程状态:

子进程继承父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代 码。随后,子进程可能exec自己的程序代码。通常,父进程在子进程运行期间处于睡眠(sleeping)状态。 当子进程完成时发出(exit)信息请求,在退出时,子进程已经关闭或丢弃了其资源环境,剩余的部分称之 为僵尸(zombie)。父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的 程序代码。

进程状态

在多任务处理操作系统中,每个CPU(或核心)在一个时间点上只能处理一个进程。在进程运行时,它对 CPU时间和资源分配的要求会不断变化,从而为进程分配一个状态,它随着环境要求而改变。

R:运行状态(runing): 表明进程要么在运行中要么在运行队列里,并不意味着进程一定在运行中。

S:睡眠状态(sleeping):意味着进程在等待事件的完成(这里的睡眠有时候也叫做可中断睡眠)

D:磁盘睡眠状态(Disk sleep): 有时候也叫做不可中断睡眠,在这个状态的进程通常会等待IO的结束

T:停止状态(stopped):可以通过发送SIGSTOP信号给进程来停止(T)进程。这个被暂停的进程可以通过 发送SIGCNT信号让进程继续运行。

Z:僵尸状态(zombie):通知父进程回收所有的资源

X:死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

  • 僵尸进程:当一个进程fork一个子进程之后,如果子进程退出,而父进程没有利用wait 或者 waitpid 来获取子进程的状态信息,那么子进程的状态描述符依然保存在系统中。
  • 孤儿进程:当一个父进程fork一个子进程之后,父进程突然被终止了,那么这个子进程就成为了一 个孤儿进程,它会被init进程接管
  • 参考博客:僵尸进程与孤儿进程解析_TerryZjl的博客-CSDN博客_僵尸进程和孤儿进程的区别

查看进程

ps命令

静态查看进程ps 注: ps -aux 不同于 ps aux

常用组合:aux
u:以用户为中心组织进程状态信息显示
a:与终端相关的进程;
x:与终端无关的进程;
~]# ps -uax
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
用户 进程ID CPU占用 内存占用
VSZ:Virtual memory SiZe 虚拟内存集
RSS:ReSident Size 常驻内存集———其他的都可以放入交换内存中
STAT:进程状态
R:running
S:interruptable sleeping
D:uninterruptable sleeping
T:stopped
Z:zombie
+:前台进程
l:多线程进程
N:低优先级进程
<:高优先级进程
s:session leader
START:启动时间
TIME:运行占据cpu的累积时长
COMMAND:由哪个命令来启动的相关进程
常用组合:ps -ef
-e:显示所有进程
-f:显示完整格式程序信息
常用组合:ps -eFH
-F:显示完成格式的进程信息
-H:以进程层级格式显示进程相关信息
常用组合:eo,axo
自定义想要查询的字段值
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
-axo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wcha n:14,comm
ni:nice值
pri:priority,优先级
psr:processor,CPU
rtprio:实时优先级
[root@atopos ~]# ps aux |less
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.3 193720  6768 ?        Ss   05:38   0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?        S    05:38   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    05:38   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S<   05:38   0:00 [kworker/0:0H]
root          7  0.0  0.0      0     0 ?        S    05:38   0:00 [migration/0]
root          8  0.0  0.0      0     0 ?        S    05:38   0:00 [rcu_bh]

USER:运行进程的用户

PID:进程ID

%CPU:CPU占用率

%MEM:内存占用率

VSZ:占用虚拟内存

RSS:占用实际内存 驻留内存

TTY:程序运行的终端

STAT:进程状态 man ps(/STATE)

  • R(runing):运行状态
  • S(sleeping):浅度睡眠状态
  • D(disk sleep):磁盘睡眠状态
  • T(stopped):停止进程
  • X(dead):死亡状态
  • Z(zombie):僵尸状态

START:进程的启动时间

TIME:进程占用CPU的总时间

COMMAND:进程文件,进程名

[root@atopos ~]# ps aux --sort %cpu |less # 按照CPU使用率排序
[root@atopos ~]# ps aux --sort -%cpu |less
[root@atopos ~]# ps aux --sort rss |less
[root@atopos ~]# ps aux --sort -rss |less
[root@atopos ~]# yum -y install httpd
[root@atopos ~]# systemctl start httpd
[root@atopos ~]# ps auxf |grep httpd # 按照父子进程层级显示
root 29276 0.0 0.0 112724 988 pts/1 S+ 14:25 0:00
_ grep --color=auto httpd
root 29267 0.2 0.2 230408 5192 ? Ss 14:24 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29268 0.0 0.1 232492 3160 ? S 14:25 0:00 _
/usr/sbin/httpd -DFOREGROUND
apache 29269 0.0 0.1 232492 3160 ? S 14:25 0:00 _
/usr/sbin/httpd -DFOREGROUND
apache 29270 0.0 0.1 232492 3160 ? S 14:25 0:00 _
/usr/sbin/httpd -DFOREGROUND
apache 29271 0.0 0.1 232492 3160 ? S 14:25 0:00 _
/usr/sbin/httpd -DFOREGROUND
apache 29272 0.0 0.1 232492 3160 ? S 14:25 0:00 _
/usr/sbin/httpd -DFOREGROUND
[root@xwz ~]# ps -ef # 精简显示

自定义显示字段

[root@atopos ~]# cat /run/sshd.pid
[root@atopos ~]# ps aux |grep sshd
[root@atopos ~]# pgrep -l sshd
[root@atopos ~]# pidof sshd

查看进程树(需要安装pstree)

[root@atopos ~]# pstree

top命令

动态显示系统相关资源的管理器,有点类似于windows当中的任务管理器

[root@atopos ~]# top
[root@atopos ~]# top -d 1 # 一秒钟刷新一次
[root@atopos ~]# top -d 1 -p 6995 # 查看指定PID
[root@atopos ~]# top -d 1 -p 6995,1 # 查看多个PID进程
[root@atopos ~]# top -d 1 -u apache # 查看指定用户的进程
[root@atopos ~]# top -d 1 -b -n 2 > top.txt # 将2次top信息写入到文件

Linux从入门到入坑

第1行:系统时间、运行时间、登录终端数、系统负载(三个数值分别为1分钟、5分钟、15分钟内的平 均值,数值越小意味着负载越低)。

第2行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。

第3行:用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源 百分比等。

第4行:物理内存总量、内存使用量、内存空闲量、作为内核缓存的内存量。(buffer和cache之间的区 别,cache是提高cpu和内存之间的数据交换速度,buffer是io设备和存储设备之间的缓冲区)

第5行:虚拟内存总量、虚拟内存使用量、虚拟内存空闲量、已被提前加载的内存量。

进程信息:

  • h|?:帮助
  • M:按内存的使用排序
  • P:按CPU使用排序
  • N:以PID的大小排序
  • R:对排序进行反转
  • f:自定义显示字段
  • 1:显示所有CPU的负载
  • k:输入信号
  • < :向前
  • > :向后
  • z:彩色
  • W:保存top环境设置 ~/.toprc

信号控制进程

[root@atopos ~]# kill -l # 列出所有支持的信号
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42)
SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47)
SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52)
SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57)
SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62)
SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

常用信号

信号 信号名 作用
1 SIGHUP 重新加载配置
2 SIGINT 键盘中断^C
3 SIGQUIT 键盘退出
9 SIGKILL 强制终止
15 SIGTERM 终止(正常结束),缺省信号
18 SIGCONT 继续
19 SIGSTOP 停止
20 SIGTSTP 暂停
[root@atopos ~]# ps aux |grep sshd
root 6995 0.0 0.2 112756 4356 ? Ss 9月09 0:00
/usr/sbin/sshd -D
root 31872 5.0 0.2 160844 5620 ? Ss 18:56 0:00 sshd:
root@pts/1
root 31917 0.0 0.0 112728 988 pts/1 S+ 18:56 0:00 grep --
color=auto sshd
[root@atopos ~]# kill -1 6995 # 重新加载配置文件

实例

测试信号9和信号15

[root@atopos ~]# touch file1 file2
[root@atopos ~]# tty
/dev/pts/1
[root@atopos ~]# vim file1
[root@atopos ~]# tty
/dev/pts/2
[root@atopos ~]# vim file2
[root@atopos ~]# ps aux |grep vim
root 32072 0.2 0.2 151532 5064 pts/1 S+ 19:09 0:00 vim file1
root 32127 0.1 0.2 151532 5080 pts/2 S+ 19:09 0:00 vim file2
root 32176 0.0 0.0 112728 988 pts/3 S+ 19:09 0:00 grep --
color=auto vim
[root@atopos ~]# kill 32072
[root@atopos ~]# kill -9 32127
[root@atopos ~]# killall vim # 杀死所有vim进程

测试信号18和信号19

[root@atopos ~]# ps aux |grep httpd
root 29267 0.0 0.2 230408 5192 ? Ss 14:24 0:01
/usr/sbin/httpd -DFOREGROUND
apache 29268 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29269 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29270 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29271 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29272 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
root 32229 0.0 0.0 112724 988 pts/3 S+ 19:14 0:00 grep --
color=auto httpd
[root@atopos ~]# kill -19 29267
[root@atopos ~]# ps aux |grep httpd
root 29267 0.0 0.2 230408 5192 ? Ts 14:24 0:01
/usr/sbin/httpd -DFOREGROUND
apache 29268 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29269 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29270 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29271 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29272 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
root 32231 0.0 0.0 112724 984 pts/3 S+ 19:15 0:00 grep --
color=auto httpd
[root@atopos ~]# kill -18 29267
[root@atopos ~]# ps aux |grep httpd
root 29267 0.0 0.2 230408 5192 ? Ss 14:24 0:01
/usr/sbin/httpd -DFOREGROUND
apache 29268 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29269 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29270 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29271 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29272 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
root 32233 0.0 0.0 112724 984 pts/3 S+ 19:15 0:00 grep --
color=auto httpd

踢出远程登录用户

[root@atopos ~]# w
19:21:16 up 1 day, 6:26, 4 users, load average: 0.00, 0.01, 0.05
USER TTY From LOGIN@ idle JCPU PCPU WHAT
root :0 :0 四11 ?xdm? 2:05m 0.50s
/usr/libexec/GNOME-se
root pts/0 :0 四11 5days 1.36s 0.36s -bash
root pts/1 192.168.222.1 18:56 4.00s 0.14s 0.02s w
centos pts/2 192.168.222.1 19:21 3.00s 0.04s 0.04s -bash
[root@atopos ~]# pkill -u centos
[root@atopos ~]# pkill -t pts/2 # 终止pts/2上所有进程
[root@atopos ~]# pkill -9 -t pts/2 # 终止pts/2上所有进程,并结束pts/2

进程优先级 nice

Linux进程调度及多任务

每个CPU(或CPU核心)在一个时间点上只能处理一个进程,通过时间片技术,Linux实际能够运行的进程 (和线程数)可以超出实际可用的CPU及核心数量。Linux内核进程调度程序将多个进程在CPU核心上快速 切换,从而给用户多个进程在同时运行的假象。(并发)

相对优先级

由于不是每个进程都与其他进程同样重要,可告知进程调度程序为不同的进程使用不同的调度策略。常 规系统上运行的大多数进程所使用的的调度策略为SCHED_OTHER(也称为SCHED_NORMAL),但还有其他 一些调度策略用于不同的目的。SCHED_OTHER调度策略运行的进程的相对优先级称为进程的nice值, 可以有40种不同级别的nice值。

进程优先级 0-99:实时优先级,数字越小,优先级越低

00-139:静态优先级,数字越小,优先级越高

进程默认启动时nice为0,优先级为120

Linux从入门到入坑

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

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

查看进程的nice级别

使用ps查看

[root@atopos ~]# ps axo pid,command,nice --sort=nice
[root@atopos ~]# 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@atopos ~]# nice -n -5 sleep 6000 &
[root@atopos ~]# ps axo command,pid,nice |grep sleep
[root@atopos ~]# nice -n -20 systemctl start httpd
[root@atopos ~]# ps axo pid,command,nice,cls |grep httpd
10146 /usr/sbin/httpd -DFOREGROUN 0 TS
10161 /usr/sbin/httpd -DFOREGROUN 0 TS
10162 /usr/sbin/httpd -DFOREGROUN 0 TS
10163 /usr/sbin/httpd -DFOREGROUN 0 TS
10164 /usr/sbin/httpd -DFOREGROUN 0 TS
10165 /usr/sbin/httpd -DFOREGROUN 0 TS
10167 grep --color=auto httpd 0 TS

更改现有进程的nice级别

  • 使用top更改nice级别

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

  • 使用shell更改nice级别
[root@atopos ~]# sleep 7000 &
[2] 10267
[root@atopos ~]# renice -20 10267
10267 (进程 ID) 旧优先级为 0,新优先级为 -20

存储管理

磁盘管理

认识Linux上的磁盘

从工作原理区分

机械硬盘HDD

固态硬盘SSD

Linux从入门到入坑

从磁盘尺寸区分

SATA

Linux从入门到入坑

HDD

Linux从入门到入坑

从磁盘主要接口区分

SATA(Serial ATA)

SAS(Serial Attached SCSI)

Linux从入门到入坑

磁盘设备的命名

物理磁盘:/dev/sd[a-z]

KVM虚拟化/dev/vd[a-z]/dev/sd[a-z]

设备命名:

IDE:/dev/hd

SCSI,SATA,SAS,usb/dev/sb

不同设备上:[a-z]

同一设备上:[1,2,3,,]

分区方式的区别

mbr <2TB Fdisk 4个主分区,扩展分区,逻辑分区

gpt >2TB gdisk 128个分区

MBR: 使用32位表示扇区数,分区不超过2T ,按柱面进行分区,4个主分区;3主分区+1扩展(N个逻辑分 区)。

GPT:支持128个分区,使用64位,使用128位UUID(Universally unique Identifier) 表示磁盘和分区 GPT 分区 表自动备份在头和尾两份

注意:从MBR转到GPT,或从GPT转换到MBR会导致数据全部丢失

存储结构与磁盘划分

Linux上的目录结构前面有详细的结束,可以看前面的内容

物理设备的命名规则

常见的硬件设备及其文件名称

硬件设备 文件名称
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

文件系统与数据资料

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

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

格式化后发生的事情

  • 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从入门到入坑

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

Linux从入门到入坑

mount 挂载硬件设备

[root@atopos ~]# mount 设备名 挂载点

选项

-a:挂载所有在/etc/fstab中定义的磁盘设备

-t:指定文件系统的类型

直接使用Mount,只是临时挂载,必须将分区信息写入/etc/fstab中,在使用mount -a挂载信息文件中的设备

Linux从入门到入坑

第一个字段:挂载的设备

  • 一般为设备的路径+设备名称,也可以写唯一识别码(UUID,Universally Unique Identifier)

第二个字段:挂载的目录

  • 指定要挂载到那个目录下面,需要事前创建好该目录

第三个字段:格式类型

  • 指定文件的格式类型,

第四个字段:权限选项

  • 若设置为defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async

第五个字段:是否备份

  • 若为1则开机后使用dump进行磁盘备份,为0则不备份

第六个字段:是否自检

  • 若为1则开机后自动进行磁盘自检,为0则不自检

umount 撤销挂载

撤销已经挂载的设备文件 umount [挂载点/设备文件]

[root@atopos ~]# umount /dev/sdb1

添加磁盘设备

fdisk 管理磁盘分区

[root@atopos ~]# fdisk [磁盘名称]
选项
  • m:查看可用的全部参数
  • n:添加新的分区
  • d:删除某个分区文件
  • l:列出所有可用的分区类型
  • t:改变某个分区的类型
  • p:查看分区信息
  • w:保存并退出
  • q:不保存直接退出
挂载磁盘的步骤
1. 添加一块磁盘
2. 使用fdisk创建分区
3. 使用mkfs.ext4进行文件系统格式化
4. 使用mount挂载分区

du 查看文件数据的占用量

[root@atopos ~]# du [选项] [文件]
[root@atopos ~]# du -sh /*
0	/app
0	/bin
113M	/boot
0	/dev
35M	/etc
0	/home
0	/lib
0	/lib64
0	/media
0	/mnt
0	/opt
du: cannot access ‘/proc/20259/task/20259/fd/4’: No such file or directory
du: cannot access ‘/proc/20259/task/20259/fdinfo/4’: No such file or directory
du: cannot access ‘/proc/20259/fd/4’: No such file or directory
du: cannot access ‘/proc/20259/fdinfo/4’: No such file or directory
0	/proc
44K	/root
9.6M	/run
0	/sbin
0	/srv
0	/sys
0	/tmp
1.4G	/usr
368M	/var
选项
  • -a或-all:显示目录中个别文件的大小。
  • -b或-bytes:显示目录或文件大小时,以byte为单位。
  • -c或--total:除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
  • -D或--dereference-args:显示指定符号连接的源文件大小。
  • -h或--human-readable:以K,M,G为单位,提高信息的可读性
  • -H或--si 与-h参数相同,但是K,M,G是以1000为换算单位。
  • -k或--kilobytes:以1024 bytes为单位。
  • -l或--count-links:重复计算硬件连接的文件。
  • -L<符号连接>或--dereference<符号连接>:显示选项中所指定符号连接的源文件大小。
  • -m或--megabytes:以1MB为单位。
  • -s或--summarize:仅显示总计。
  • -S或--separate-dirs:显示个别目录的大小时,并不含其子目录的大小。
  • -x或--one-file-xystem:以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
  • -X<文件>或--exclude-from=<文件> 在<文件>指定目录或文件。
  • --exclude=<目录或文件>:略过指定的目录或文件。
  • --max-depth=<目录层数>:超过指定层数的目录后,予以忽略。
  • --help:显示帮助。
  • --version:显示版本信息。

df 查看文件系统占用情况

pass

添加交换分区

SWAP(交换)分区是一种通过在硬盘中预先划分一定的空间,然后将把内存中暂时不常用的数据临时 存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术

在生产环境中,交换分区的大小一般为真实物理内存的1.5~2倍

[root@atopos ~]# mkswap /dev/sdb1
Setting up swapspace version 1, size = 5242876 KiB
no label, UUID=494ce424-6f8e-4dc7-a1f7-7df45da24928
[root@atopos ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.8G        195M        1.1G        9.5M        469M        1.3G
Swap:          2.0G          0B        2.0G
[root@atopos ~]# sw
swaplabel    swapoff      swapon       switch_root  
[root@atopos ~]# swapon /dev/sdb1 
[root@atopos ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.8G        200M        1.1G        9.5M        469M        1.3G
Swap:          7.0G          0B        7.0G

命令

mkswap [磁盘路径]	# 格式化swap
swapon [磁盘路径]	# 挂载swap分区
swapoff [磁盘路径]	# 卸载swap分区
参数:
-a:全部

磁盘容量配额

实例

描述:

  • 创建5个用户user1,user2,user3,user4,user5,密码和用户名相同,初始组为usergrp组。
  • 5个用户都可以取得300M的磁盘使用空间,文件数量不限。超过250M,给于提示。
  • usergrp这个组内成员最大使用空间1GB。
  • 如果有用户超过soft限制,给14天的宽限时间。
准备磁盘
  • 创建分区
[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/sdb
sdb   sdb1  
[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% /
dev@R_585_1262@                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
准备用户
[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
确保文件系统支持
  • 检查挂载点是否支持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)
[root@atopos ~]# 

安装 quota
  • 软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
  • 硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。

quotacheck主要参数

  • -a:扫描所有在/etc/mtab内含有quota参数的文件系统
  • -u:针对用户扫描文件与目录的使用情况,会新建一个aquota.user文件
  • -g:针对用户组扫描文件与目录的使用情况,会新增一个aquota.group文件
  • -v:显示扫描过程的信息
[root@atopos ~]# yum install -y quota
开启 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
编辑配额配置
[root@atopos ~]# edquota -u user1

Linux从入门到入坑

  • 可以将针对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      
测试
[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 ~]$

quota 命令

Linux quota命令用于显示磁盘已使用的空间与限制。

执行quota指令,可查询磁盘空间的限制,并得知已使用多少空间

选项:

  • -g 列出群组的磁盘空间限制。
  • -q 简明列表,只列出超过限制的部分。
  • -u 列出用户的磁盘空间限制。
  • -v 显示该用户或群组,在所有挂入系统的存储设备的空间限制。
  • -V 显示版本信息。

ln 链接

[root@atopos ~]# ln [选项] 源文件 目标文件

选项

  • -s:创建“符号链接”(如果不带-s参数,则默认创建硬链接
  • -f:强制创建文件或目录的链接
  • -i:覆盖前先询问
  • -v:显示创建链接的过程

链接方式

在Linux系统中存在硬链接和软连接两种文件

  • 硬链接(hard link):
    • 可以将它理解为一个“指向原始文件inode的指针”,系统不为它分配独立的inode和文件。所 以,硬链接文件与原始文件其实是同一个文件,只是名字不同。我们每添加一个硬链接,该文 件的inode连接数就会增加1;而且只有当该文件的inode连接数为0时,才算彻底将它删除。 换言之,由于硬链接实际上是指向原文件inode的指针,因此即便原始文件被删除,依然可以 通过硬链接文件来访问。需要注意的是,由于技术的局限性,我们不能跨分区对目录文件进行链接。

Linux从入门到入坑

  • 软链接(也称为符号链接[symbolic link]):
    • 仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。但是, 当原始文件被删除后,链接文件也将失效,从这一点上来说与Windows系统中的“快捷方式”具 有一样的性质

Linux从入门到入坑

软链接和硬链接的区别

硬链接的特点

  • 不论是修改源文件(test 文件),还是修改硬链接文件(test-hard 文件),另一个文件中的 数据都会发生改变。
  • 不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件都可以被访问。
  • 硬链接不会建立新的 inode 信息,也不会更改 inode 的总数。
  • 硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode号是重新计算的 硬链接不能连接目录

软链接的特点

  • 不论是修改源文件(check),还是修改软链接文件(check-soft),另一个文件中的数据都会 发生改变。
  • 删除软链接文件,源文件不受影响。而删除原文件,软链接文件将找不到实际的数据,从而显 示文件不存在。
  • 软链接会新建自己的 inode 信息和 block,只是在 block 中不存储实际文件数据,而存储的是 源文件的文件 名及 inode 号。
  • 软链接可以链接目录。 软链接可以跨分区

实例

软链接

[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

RAID(独立冗余磁盘阵列)

LVM(逻辑卷管理器)

脚本宝典总结

以上是脚本宝典为你收集整理的Linux从入门到入坑全部内容,希望文章能够帮你解决Linux从入门到入坑所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。