Linux 系统用的有几年了,平时一些常规操作也基本够用,但一直没有系统梳理学习过。对于一些整体基础概念,总感觉缺乏系统性思维。每次遇到问题,也是没针对性的Google,解决问题的时间成本较高。
本次希望通过系统梳理学习,起到高屋建瓴的作用,帮助未来能快速处理问题,同时也想让自己具备基础的运维能力。
本系列文章重在贯通Linux核心知识点,不追求大而全,以常用、实用为主。
当前学习书籍主要是:《鸟哥的Linux私房菜:基础学习篇 第四版》
介绍
GNU/Linux 是一种计算机操作系统:一系列能让您与计算机进行交互操作并运行其它程序的程序。
操作系统由多种基础程序构成。它们使计算机可以与用户进行交流并接受指令,读取数据或将其写入硬盘、磁带或打印机,控制内存的使用,以及运行其它软件。操作系统最重要的组成部分是内核。在 GNU/Linux 系统中,Linux 就是内核组件。而该系统的其余部分主要是由 GNU 工程编写和提供的程序组成。因为单独的 Linux 内核并不能成为一个可以正常工作的操作系统,所以我们更倾向使用 “GNU/Linux” 一词来表达人们通常所说的 “Linux”。
Linux 内核是在1991年10月5日由芬兰计算机天才 Linus Torvalds 首次发布的,它主要受到 Minix 和 Unix 思想启发。Linux 是一个多用户、多任务、支持多线程和多CPU的操作系统。
Linux也是自由软件和开放源代码软件发展中最著名的例子。只要遵循GNU 通用公共许可证(GPL),任何个人和机构都可以自由地使用Linux的所有底层源代码,也可以自由地修改和再发布。
Linux Kernel(内核)官网:https://www.kernel.org/
Linux 发行版
Linux 发行版是由“Linux Kernel + Free Software + Documentations(Tools)+ 可完整安装的程序”所制成的一套完整的系统。
一些流行的主流Linux发布版,包括Debian(及其衍生版本Ubuntu、Linux Mint)、Fedora(及其相关版本Red Hat Enterprise Linux、CentOS)和openSUSE等。Linux发行版包含Linux内核和支撑内核的实用程序和库,通常还带有大量可以满足各类需求的应用程序。
由于Linux是自由软件,任何人都可以创建一个符合自己需求的Linux发行版。
目录概览
Linux 发行版较多,为了规范系统目录结构,每个目录下放置什么数据,制定了 FHS(Filesystem Hierarchy Standard)标准规范。
目录树
在Linux下面,所有的文件与目录都是由根目录(/)开始的。目录树(directory tree)的主要特性有:
- 目录树的启始点为根目录(/)
- 每一个目录不止能使用本地端的 partition 的文件系统,也可以使用网络上的 filesystem(如 NFS)
- 每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的
目录结构
目录有特定的用途,一般用来存放相同类型的文件信息,以便于查找文件。下面主要根据FHS及主流版本定义的目录结构。
目录 | 描述 |
---|---|
/ | 根目录,只包含所有文件结构的最顶层的目录 |
/bin | 存放可执行文件,普通用户和 root 都可以执行。软连接到 /usr/bin/ |
/boot | 系统启动目录,保存与系统启动相关的文件,如内核文件和启动引导程序(grub)文件等 |
/dev | 存放设备驱动程序,如 /dev/sd |
/etc | 配置文件保存位置。如用户信息、服务的启动脚本、常用服务的配置文件等 |
/home | 普通用户的家目录 |
/lib | 系统调用的函数库,软连接到 /usr/bin/ |
/media | 挂载目录,系统建议用来挂载媒体设备,如光盘、DVD等 |
/mnt | 挂载目录,系统建议临时文件系统或额外的设备,如U盘、移动硬盘和其他操作系统的分区 |
/opt | 第三方软件的安装位置,非发行版自带的需额外安装的软件,也有人习惯把软件安装到 /usr/local |
/run | 系统开机后所产生的各项信息 |
/root | root的主目录。普通用户主目录在 /home 下 |
/sbin | 存放用于系统管理的「必需」的程序(二进制文件),一般普通用户不会使用,root用户使用。软连接到 /usr/sbin/ |
/srv | 服务数据目录。一些系统服务启动之后,可以在这个目录中保存所需要的数据 |
/tmp | 临时目录。系统存放临时文件的目录,所有用户都可以访问和写入。不保存重要数据,建议每次开机清空该目录 |
/lost+found | 当系统意外崩溃或意外关机时,产生的一些文件碎片会存放在这里。在系统启动的过程中,fsck 工具会检查这里,并修复已经损坏的文件系统。 |
/proc | 虚拟文件系统。保存系统的内核、进程、外部设备状态和网络状态,数据保存在内存上,不占用硬盘 |
/sys | 虚拟文件系统。和 /proc/ 目录相似 |
/usr | Unix Software Resource,此目录用于存储系统软件资源。 |
/usr/local | 手工安装的软件保存位置。功能与 /opt 类似,建议一般源码包安软件安装在此 |
/usr/share | 应用程序的资源文件保存位置,如帮助文档、说明文档和字体目录 |
/usr/src | 源码包保存位置。有些人更习惯手工下载的源码包保存到 /usr/local/src/ 目录,内核源码保存到 /usr/src/linux/ 目录 |
/usr/include | C/C++ 等编程语言头文件的放置目录 |
/var | 用于存储动态数据,例如缓存、日志文件、软件运行过程中产生的文件 |
/var/lib | 程序运行中需要调用或改变的数据保存位置。如 MySQL 的数据库保存在 /var/lib/mysql/ 目录中 |
/var/log | 登陆文件放置的目录,其中所包含比较重要的文件如 /var/log/messages, /var/log/wtmp 等 |
/var/run | 一些服务和程序运行后,它们的 PID(进程 ID)保存位置 |
/var/spool | 里面主要都是一些临时存放,随时会被用户所调用的数据,例如 /var/spool/mail/ 存放新收到的邮件,/var/spool/cron/ 存放系统定时任务。 |
/var/www | RPM 包安装的 Apache 的网页主目录 |
根据文件类型分类目录
目录类型 | 存储的文件类型 |
---|---|
二进制目录 | 包含二进制文件或者源文件编译之后的文件,例如: /bin, /sbin,等等目录 |
配置目录 | 包含系统的配置文件 例如: /etc, /boot |
数据目录 | 存储数据文件, 例如: /home,/root,等 |
内存目录 | 包含那些不占用物理内存空间的设备文件。 例如: /dev, /proc, /sys. |
Usr (Unix 系统资源) | 包含可读的,共享的数据。例如: /usr/bin, /usr/lib,等等 |
var (可变目录) | 包含数据比较大的文件,例如: /var/log,/var/cache,等 |
非标准目录 | 不属于 FHS 标准的目录,例如: lost+found,/run,等 |
文件与目录管理
目录管理
特殊符号 | 作用 |
---|---|
. | 当前目录 |
.. | 上级目录 |
– | 上次所在目录 |
~ | 当前登录用户的主目录 |
~用户名 | 指定用户的主目录 |
目录相关指令
- cd :切换目录
- pwd :显示当前目录
- mkdir :创建一个新目录,选项 -p 递归创建目录
- rmdir :删除一个空目录,选项 -p 连同上层空目录一起删除,此命令仅删除空目录,如果有内容需要用 rm -r 删除
- ls :查看目录信息
ls 命令 是Linux重要且常用的命令了,下面是ls的常用参数:
- -a :显示全部的文件,包括隐藏文件
- -h :以人们易读的方式显示文件或目录大小,如 1KB、234MB、2GB 等
- -i :显示 inode 节点信息
- -l :长数据串行出,包含文件的属性与权限等等数据。命令别名 ll
- -n :以 UID 和 GID 分别代替文件用户名和群组名显示出来
- -S :以文件大小大小排序,而不是用文件名排序
- -t :以时间排序,而不是用文件名排序
- –full-time :以完整时间模式 (包含年、月、日、时、分)输出
- –time={atime,ctime} :输出 access 时间或改变权限属性时间(ctime),而不是内容变更时间
文件管理
在 Linux 系统中,一切都是文件,若有例外,那就是进程。
文件(名称)总是大小写敏感的。
文件类型:
- 一般文件(Regular files – ): 包括程序、可执行文件和纯文本文件等
- 目录文件(Directory files d): 显示为蓝色。是个目录
- 块文件类型(Block file b)
- 字符设备类型文件(Character device file c)
- 命名管道(Named pipe file p)
- 符号链接文件(Symbolic link file l)
- Socket file (s)
文件相关命令
- file :确定文件类型。不关心文件扩展名是什么。选项 -s 用于特殊文件,参数 * 获取当前目录所有文件类型
- touch :常用于创建空白文件,还可以用于刷新文件的访问时间或修改时间属性
- rm :删除文件。选项 -r 递归删除 -f 强制,参数 * 匹配当前目录的部分文件
- cp :复制文件或目录
- mv :移动文件与目录,或改名
cp 命令选项
- -r :拷贝目录及其子目录。 r 是递归的意思。
- cp file1 file2 directoryname :拷贝多个文件或目录到指定目标目录
- -p :保留文件属性
- -u -v :保证拷贝源文件比被覆盖同名文件要新
mv命令选项
- -f :如果目标文件已经存在,不会询问而直接覆盖
- -i :覆盖文件时询问
- mv source1 source2 source3 …. directory :移动多个文件或目录,最一个参数必须是“目录”
mv 命令可以修改文件或目录名称,但如果大量修改文件名,可以使用 rename 命令。
# 修改当前目录下的文件名
rename 's/搜索文本/替换文本/' *
rename 's/DVD版第/\.E/' *
读取文件
读取查阅一个文件的内容(不是编辑),有多种命令,适用不同场景。
读取文件相关命令
- cat :由第一行开始显示文件内容。选项 -n 打印行号
- tac :从最后一行开始显示,可以看出 tac 是 cat 的倒着写。
- more :一页一页显示文件内容。快捷键有 回车键 向下滚动一行,空格键 向下滚动一页,b键向上回滚一页,正斜杠(/) 向下查找指定字符串
- less :与more类似,功能更强大。
- head :只看头几行。选项 -n 行数
- tail :取出后面几行。选项 -n 后接行数, -f 表示持续侦测后面的文件(实时查看日志有用)
- od :以二级制的方式读取文件内容。选项 -a 利用默认字符输出,-c 适用ASCII字符输出。
less 命令 用于查看大文本,功能比more更丰富
- 空白键 : 向下翻一页
- [pagedown] :向下翻一页
- [pageup] :向上翻一页
- ↑ :向上一行
- ↓ :向下一行
- /字符串 :向下搜寻“字符串”
- ?字符串 :向上搜寻“字符串”
- n :重复前一个搜寻
- N :反向的重复前一个搜寻
- g :前进到文本的第一行
- G :前进到文本的最后一行
- q :退出less
搜索文件
- which :寻找可执行文件。选项 -a 将PATH目录所有指令文件列出,默认只列出第一个。参数 指令名称。示例 which ls。
- whereis :在一些特定目录中寻找文件文件名。主要是针对 /bin /sbin 下面的可执行文件,whereis -l 查看whereis查询的目录。
- locate :通过指定文件名查找文件。与find不同的是,locate通过查询后台进程建立的文件数据库,速度更快
- find :查找指定目录下的特定文件。
locate 命令,用于快速全局查找文件(非实时的,可以使用 updatedb命令 更新文件数据库)
- -i :忽略大小写
- -l :输出查找的前几行
- -S :输出locate适用的文件数据库信息,如有文件/目录总数量
- -r :后接正则表达式
# 查找/home/web目录下的前10个index.php文件 locate -l 10 -r \/home\/web\/.*index\.php
find 命令,查询指定目录的特定文件
命令格式:find [PATH] [option] [action]
选项与参数
- 与时间有关的选项
- -mtime n :查找在n天前的“24小时内”被更改过内容的文件
- -mtime +n :查找在n天之前(不含n天本身)被更改的文件
- -mtime -n :查找在n天之内(含n天本身)被更改的文件
- -newer file :file为一个存在的文件,查找比 file 还要新的文件
# 查找近24小时内更新为你教案
find / -mtime 0
# 根据文件查找新文件
find /etc -newer /etc/passwd
# 查找时间区别,下图发现具体区别
find / -mtime 4
find / -mtime +4
find / -mtime -4
-
与用户或群组有关的选项
- -uid :根据文件拥有者的用户UID查找
- -gid n :根据文件归属群组GID查找
- -user :根据拥有者账号名称,如admin
- -group :根据文件群组名称
- -nouser/-nogroup :查找文件拥有者不存在/etc/passwd 或 群组不存在 /etc/group的文件
-
与文件权限有关的选项
- -name :查找文件名,支持模糊查找
- -size [+-]SIZE:查找文件大小比SIZE 大或小的文件,SIZE单位 c 表示Byte字节、k 表示1024Bytes
- -type TYPE :查找文件类型为 TYPE 的文件,类型主要有 一般正规文件 (f), 设备文件 (b, c),
目录 (d), 链接文件 (l), socket (s), 及 FIFO (p) 等属性 - -perm mode :查找文件权限“等于”mode的文件,如 -perm 0777
- -perm -mode :查找文件权限“必须包含mode权限”的文件
- -perm /mode :查找文件权限“包含任一mode权限”的文件
# 文件名模糊查找
find . -name "test*"
# 文件大小查找
find . -size +50k
# 文件权限
find . -perm -0700
- 额外可进行的动作
- -exec command :command 为其他指令
# 将查找到的文件详细列出
find / -perm -0700 -exec ls -l {} \;
- {} 表示“由find找到的文件”,放置到{}的位置
- -exec 一直到 \; 关键字,不能省略
- 因为“;”在bash环境有特殊含义,因此要转义
文件解压缩
Linux 支持的压缩指令非常多,不同的指令所用的压缩技术并不相同。下面列出几个常见的压缩文件扩展名:
- *.Z :compress 程序压缩的文件;
- *.zip :zip 程序压缩的文件;
- *.gz :gzip 程序压缩的文件;
- *.bz2 :bzip2 程序压缩的文件;
- *.xz :xz 程序压缩的文件;
- *.tar :tar 程序打包的数据,并没有压缩过;
- *.tar.gz :tar 程序打包的文件,其中并且经过 gzip 的压缩
- *.tar.bz2 :tar 程序打包的文件,其中并且经过 bzip2 的压缩
- *.tar.xz :tar 程序打包的文件,其中并且经过 xz 的压缩
常见压缩命令
- gzip :应用最广的压缩指令。选项 -v 显示压缩比等信息,-d 解压缩,-# #为数字表示压缩等级,1~9,默认-6。
- zcat :查看gzip压缩包内容。
- bzip2 :压缩率优于gzip。选项与gzip类似,增加选项 -k 保留原始文件。
- bzcat/bzmore/bzless/bzgrep :查看bzip2压缩包内容。
- xz :压缩率优于bzip2,压缩比最好(也更耗时)。选项与bzip2类似。
- xzcat/xzmore/xzless/xzgrep :查看xz压缩包内容。
# gizp 压缩(注意压缩后会删除原文件,仅保留压缩文件)
gzip -v file
# gzip 解压缩
gzip -d 文件.gz
# bzip2 压缩(保留原文件)
bzip2 -vk file
# bzip2 解压缩
bzip2 -d file.bz2
# xz 压缩(压缩率最高!)
xz -vk file
tar 打包指令
以上压缩指令只能针对单一文件进行压缩,如果想压缩一个目录或多个文件,在Linux系统中需要先打包。
tar 命令选项
- 打包/查看/解压,-c、-t、-x 选项只能用一个
- -c :创建打包文件。
- -t :查看打包文件的内容含那些文件。
- -x :解打包或解压缩
- 解压缩方式,-z、-j、-J 选项只能用一个
- -z :通过 gzip 方式压缩或解压缩。文件名建议命名 *.tar.gz
- -j :通过 bzip2 方式压缩或解压缩。文件名建议命名 *.tar.bz2
- -J :通过 xz 方式压缩或解压缩。文件名建议命名 *.tar.xz
- 解压缩文件
- -v :压缩或解压缩时显示信息
- -f filename :-f 后面立即接被处理文件名
- -C(大写) 目录 :解压到指定目录
- 其他选项
- -p(小写):保留备份数据的原权限与属性
- -P(大写):保留绝对路径
- –exclude=FILE :压缩时排查FILE文件,支持模糊匹配
# 仅打包文件或目录
tar -cv -f test.tar test
# 打包并压缩文件或目录,使用gzip方式
tar -zcv -f test.tar.gz test
# 解压缩
tar -zxv -f test.tar.gz
# 解压缩到指定目录
tar -zxv -f test.tar.gz -C test_dir/
其他压缩或备份工具
- dd :备份完整的分区(partition)或磁盘(disk),因为dd可以读取磁盘的sector数据
- cpio :备份任何数据,包括设备文件。需要搭配find等命令使用
可执行文件
环境变量 PATH 可以帮助我们输入命令时,自动找到可执行文件。
# 查看当前用户搜索命令的路径
echo $PATH
返回结果中,每个目录用冒号(:)分隔,执行命令时会依次查找。
可以修改PATH变量,如下面追加/root目录
PATH="${PATH}:/root"
注意事项:
- 同身份使用者默认的PATH不同,默认能够随意执行的指令也不同
- PATH是可以修改的
- 使用绝对路径或相对路径直接指定某个指令的文件名来执行,会比搜寻PATH来的正确
- 指令应该要放置到正确的目录下,执行才会比较方便
磁盘与文件系统
文件系统
一个可以被挂载的数据通常称为“文件系统, filesystem”而不是分区 (partition)。
基本上 Linux 的传统文件系统为 Ext2 ,该文件系统内的信息主要有:
- superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
- inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block 号码;
- block:实际记录文件的内容,若文件太大时,会占用多个 block ;
- 组成部分:boot sector, superblock, inode bitmap, block bitmap, inode table,data block 等六大部分;
- 存储方式:Ext2 文件系统的数据存取为索引式文件系统(indexed allocation),需要磁盘重组的原因就是文件写入的 block 太过于离散了,此时文件读取的性能将会变的很差所致。 这个时候可以通过磁盘重组将同一个文件所属的 blocks 汇整在一起;
- block大小:data block 是用来放置文件内容数据地方,在 Ext2 文件系统中所支持的 block 大小有
1K, 2K 及 4K 三种而已; - inode大小:inode 记录文件的属性/权限等数据,其他重要项目为: 每个 inode 大小均为固定,有128/256Bytes 两种基本容量。每个文件都仅会占用一个 inode 而已; 因此文件系统能够创建的文件数量与 inode 的数量有关;
- 日志式文件系统 (journal):会多出一块记录区,随时记载文件系统的主要活动,可加快系统复原时间,防止断电或意外情况下数据丢失。此功能在 Ext3/Ext4 中支持。
文件系统命令
- dumpe2fs 设备文件名 :查看文件系统信息。选项 -h 仅列出 superblock 数据。
- df :查看所有文件系统的整体磁盘使用量。选项 -h 容量以易读方式展示,-T 显示filesystem名称 如(ext4)
- du :查看文件或目录的磁盘使用量。选项 -h 容量以易读方式展示,-s 列出目录总量
# 查看文件系统信息,使用 blkid 查看当前系统被格式化的文件系统
dumpe2fs /dev/sda1 | less
# 查看文件系统的使用量
df -hT
# 自动查看某个目录所在文件系统的情况
df -hT /etc
# 查看文件的容量
du -h file
# 查看某个目录的总容量
du -sh dir
# 查看当前目录或某个目录下的子目录容量
du -sh ./*
du -sh /etc/*
磁盘分区
磁盘的使用必需要经过:分区、格式化与挂载。
分区命令
- lsblk :查看系统上的所有磁盘。选项 -d 仅列出磁盘(不列出分区),-f 同时展示分区的文件系统名称
- blkid :查看设备的UUID参数。
- parted :查看磁盘的分区表类型与分区信息。
- gdisk :使用 GPT分区。可以对一个新磁盘或有空闲容量的磁盘分区。会话中输入 ? 可以查看命令。
- partprobe :更新分区表信息。分区后需要执行此命令更新系统核心的分区表信息。选项 -s 展示更新信息。
# 查看所有磁盘
lsblk -f
# 查看设备或分区的UUID
blkid
# 查看磁盘分区表类型,其中Partition Table表明分区表类型,如gpt
parted /dev/sda print
# 磁盘分区,使用GPT分区。以分区的磁盘需要先查看下分区表类型
gdisk /dev/sdb
# 更新分区表,分区后使用此命令更新核心分区表
partprobe -s
分区格式化命令
- mkfs.* :格式化分区。支持ext4/xfs等文件系统,tab键可以查看所有文件系统。选项 -b 设置block的大小 1k 2k 4k.
- fsck.* :检查修复分区文件系统
# 格式化分区为 ext4 文件系统格式
mkfs.ext4 /dev/sdb2
mkfs.ext4 -b 4k /dev/sdb2
# 检查分区文件系统
fsck.ext4 /dev/sdb5
磁盘挂载
挂载点是目录,这个目录是进入磁盘分区(文件系统)的入口。挂载前需注意:
- 同一文件系统不能重复挂载到不同的挂载点(目录);
- 同一目录不能重复挂载多个文件系统;
- 作为挂载点的目录,理论上应该是空目录(没有数据);
- 如果用来挂载的目录不是空目录,挂载文件系统后,原目录下的数据会暂时消失,等卸载此文件系统后内容会显示出来。
挂载命令
- mount :挂载文件系统。选项 -a 按照配置文件挂载,-t 指定挂载的文件系统类型,-o 额外参数
- umount :卸载设备文件或文件系统。选项 -f 强制卸载(如 NFS无法读取时使用)
# 挂载方式
# mount [-t 文件系统] LABEL='' 挂载点
# mount [-t 文件系统] UUID='' 挂载点
# mount [-t 文件系统] 设备文件名 挂载点
# 系统可以自动识别文件系统类型,默认可以不用-t指定,UUID可以用blkid命令查看
mount UUID="e0a6af55-26e7-4cb7-a515-826a8bd29e90" /data/xfs
mount /dev/sdb2 /data/mount_dir
# 查看目录的挂载
df -hT /data/mount_dir
# 挂载光盘
mount /dev/sr0 /data/cdrom
# 根目录重新挂载,一些意外情况时需要
mount -o remount,rw,auto /
# 挂载一个目录到另一个目录,类似软链接
mount --bind /var /data/var
# 卸载文件系统,后面可以接挂载点或设备文件名
umount /data/mount_dir
umount /dev/sdb2
# 本地局域网内挂载NFS
# 若使用群晖作为NFS服务端,在控制面版里开启NSF协议,共享文件内设置NSF权限
# Ubuntu 挂载NFS,需要先安装下组件
# sudo apt install nfs-kernel-server
mount -t nfs 192.168.3.2:/volume1/share /mnt
设置开机挂载
以上使用mount命令手动挂载,Linux系统重启后需要重复挂载。如果想开机自动挂载,需要配置 /etc/fstab。配置前注意事项:
- 根目录 / 是必须挂载的,而且一定要先于其它 mount point 被挂载进来;
- 其它 mount point 必须为已创建的目录,可任意指定,但一定要遵守必须的系统目录架构原则 (FHS);
- 所有 mount point 在同一时间之内,只能挂载一次;
- 所有 partition 在同一时间之内,只能挂载一次;
- 如若进行卸载,您必须先将工作目录移到 mount point(及其子目录) 之外。
查看已配置的开机挂载
cat /etc/fstab
每行配置的各项参数说明:
- file system :文件系统/设备。可以填写设备文件名 如/dev/sdb1,文件系统的UUID 如UUID=xxx,文件系统的LABEL名称 如 LABEL=xxx
- mount point :挂载点。填写挂载点目录,如 /data/mount_dir
- type :文件系统类型。如 xfs, ext4, vfat, reiserfs, nfs等
- options :参数。mount命令中 -o 选择里的参数,默认值 defaults
- dump :是否备份。已不需要,直接填 0
- pass :检验扇区。已不需要,直接填 0
# 编辑自动挂载配置文件,先检查分区是否被挂载、目录是否有挂载等
vim /etc/fstab
UUID="32cd9cee-8a99-470d-9a63-8c0b1c5e541b" /data/mount_dir ext4 defaults 0 0
# 配置后,执行挂载命令
mount -a
# 查看是否挂载
df /data/mount_dir
挂载特殊设备loop
系统可以挂载一些特殊设备,比如一个镜像文件,或一个大文件等。
# 挂载.iso镜像文件,进入挂载点目录就可以读取镜像内容了
mount -o loop /tmp/CentOS-7.0-1406-x86_64-DVD.iso /data/centos_dvd
# 创建类似镜像文件的loop设备文件
# dd 命令创建 1M * 512 大小的一个大文件
dd if=/dev/zero of=/tmp/loopdev bs=1M count=512
# 格式化大文件
mkfs.ext4 /tmp/loopdev
# 挂载大文件
blkid /tmp/loopdev
mount -o loop UUID="XXX" /data/mount_loop
制作大文件设备,并进行挂载,是很多虚拟机系统使用的一种挂载方法,如VMware等。
磁盘阵列 RAID
RAID — “ Redundant Arrays of Inexpensive Disks, RAID ” — 容错式廉价磁盘阵列。
RAID 可以通过一个技术(软件或硬件),将多个较小的磁盘整合成为一个较大的磁盘设备;而这个较大的磁盘功能不仅仅是储存,还具有数据保护的功能。
RAID 优点:
- 数据安全与可靠性 :当磁盘损毁时,数据能够安全的救援或恢复;
- 读写性能 :例如 RAID 0 可以加强读写性能,让你的系统 I/O 部分改善;
- 容量 :可以让多个磁盘组合起来,让单一文件系统可以有相当大的容量。
hardware RAID
上面介绍的是软件磁盘阵列(software RAID),还有一种硬件磁盘阵列,是通过磁盘阵列卡从硬件上实现的RAID。对于系统来说,硬件磁盘阵列就是一个大磁盘,与一般硬盘一样挂载到 /dev/sd。
RAID 等级
- RAID-0 :等量模式,性能最佳。数据会被等量放置在各个硬盘上,读写性能都更好。数据丢失风险也很高,只有其中一个硬盘损坏都会导致整体数据丢失。
- RAID-1:映射模式,完整备份。让同一份数据,完整保存在两个磁盘上。需要相同的硬盘容量,若容量不一致则按照最小容量来。受制于数据传输增加,写入性能可能不佳,读取性能不影响。由于两个磁盘数据一模一样,损坏任何一个,数据都是完整保留的,因此数据安全性较高。
- RAID-5 :性能与数据备份的均衡考虑。至少需要3个磁盘。读取数据较高,写入性能略差。支持损坏一个硬盘,数据仍能恢复。
- RAID-6 :与RAID-5类似。至少需要4个硬盘。支持损坏两个硬盘,数据恢复。
- Spare Disk :预备磁盘的功能。RAID可以设置备用硬盘,当某个硬盘故障时,自动重建数据。
RAID 等级对比
RAID 设置
使用 mdadm
命令实现RAID,选项与参数:
- –create :创建RAID
- –auto=yes :通知mdadm是否创建设备文件,并分配一个未使用的次设备号。一般yes即可,其他值牵涉到是否允许分区
- –chunk=N :指定chunk大小,单位KB,默认64KB
- –raid-devices=N :使用几个磁盘或分区作为RAID设备
- –spare-devices=N :使用几个磁盘或分区作为备用设备(Spare Disk)
- –level=[015] :RAID等级,一般建议 0 1 5
- –detail :查询RAID设备详细信息
- –manage :管理RAID设备
- –add :将设备追加到此RAID
- –remove :将设备移除此RAID
- –fail :将设备设置为出错状态
# 创建RAID5磁盘阵列
mdadm --create /dev/md0 --auto=yes --level=5 --chunk=256 --raid-devices=4 --spare-devices=1 /dev/sdc{1,2,3,4,5}
# 查询RAID信息
mdadm --detail /dev/md0
# 查看系统RAID
cat /proc/mdstat
# 创建后的RAID,跟分区一样,可以被格式化为不同的文件系统并挂载
mkfs.ext4 /dev/md0
mount /dev/md0 /srv/raid
# 设置设备出错,可以模式RAID设备故障,查看利用备用磁盘自动重建
mdadm --manage /dev/md0 --fail /dev/vda7
开机自启RAID并自动挂载
# 查看RAID UUID
mdadm --detail /dev/md0 | grep -i uuid
# 设置 mdadm.conf
vim /etc/mdadm/mdadm.conf
编辑内容如下
ARRAY /dev/md0 UUID=8f4638a7:e9ba335a:366d6393:1b1fc532
# 设置开机自动挂载,与其他文件系统挂载类似
blkid /dev/md0
vim /etv/fstab
umount /dev/md0; mount -a
关闭 RAID
# 卸载
umount /srv/raid
# 注释开机自启挂载
vim /etc/fstab
# 覆盖RAID的metadata及分区superblock
dd if=/dev/zero of=/dev/md0 bs=1M count=50
mdadm --stop /dev/md0
dd if=/dev/zero of=/dev/vda5 bs=1M count=10
dd if=/dev/zero of=/dev/vda6 bs=1M count=10
dd if=/dev/zero of=/dev/vda7 bs=1M count=10
# 注释mdadm配置
vim /etc/mdadm/mdadm.conf
# 查看RAID是否存在
cat /proc/mdstat
逻辑卷轴 LVM
LVM — Logical Volume Manager — 逻辑卷轴管理员。
LVM 是将几个分区或磁盘通过软件组合成为一块看起来是独立的大磁盘(VG),然后将这块大磁盘再经过分区成为可使用分区(LV),最终就能够挂载使用。
LVM 最主要用处是实现一个可以弹性调整容量的文件系统。VG通过添加PV扩容,LV可以通过转移PE,实现容量伸缩。
与LVM相关的组成部分:
- PV — Physical Volum — 实体卷轴 :分区或磁盘调整系统识别码为8e,再经过pvcreate转为PV。是LVM最底层的实体卷轴。
- VG — Volume Group — 卷轴群组 :多个PV整合成一个VG,即是一个大磁盘。容量不限制。
- PE — Physical Extent — 实体范围区块 :类似于文件系统的block,是LVM最小的存储区块。
- LV — Logical Volume — 逻辑卷轴 :类似于分区,VG会被分隔成多个LV。每个LV是由多个PE组成。
LVM 设置
LVM 整体创建流程,从磁盘分区到最后格式化挂载:
# 磁盘分区设置 LVM 分区类型码,根据提示,输入 t -> 分区号 -> 8e00
gdisk /dev/sdc
# 1. PV阶段
# 查看系统所有的PV
pvscan
# 显示系统的PV状态
pvdisplay
# 创建PV
pvcreate /dev/sdc1
# 移除PV属性
pvremove /dev/sdc1
# 2. VG阶段
# 创建VG,-s 后接PE大小,单位可为 m g t
vgcreate -s 16M vghoopan /dev/sdc{1,2,3}
# 查看系统的VG
vgscan
# 显示VG状态
vgdisplay vghoopan
# 删除VG
vgremove vghoopan
# 在VG内增加额外的PV
vgextend vghoopan /dev/sdc4
# 在VG内移除PV
vgreduce vghoopan /dev/sdc4
# 3. LV阶段
# 创建LV,-L 后接容量 单位 M G T,-l 后接PE个数,-n 后接LV名称
lvcreate -L 2G -n lvhoopan vghoopan
# 查看系统所有LV
lvscan
# 查看LV详情
lvdisplay /dev/vghoopan/lvhoopan
# 4.文件系统阶段
mkfs.ext4 /dev/vghoopan/lvhoopan
# 后面挂载即可
LV 伸缩
已创建并挂载的LV,可以扩大或缩小使用容量。以下以 Ext4 文件系统为例。
LV 扩大容量
# 扩展LV的物理容量
lvextend -L +5G /dev/vghoopan/lvhoopan
# 扩展vg所有剩余容量
lvextend /dev/vghoopan/lvhoopan -l+100%FREE
# 扩展文件系统的逻辑容量
resize2fs /dev/vghoopan/lvhoopan 5G
# 直接扩展文件系统到整个物理容量
resize2fs -p /dev/vghoopan/lvhoopan
# 查看文件系统
df -lh
LV 缩小容量
# 卸载文件系统
umount /srv/lvhoopan
# 强行对lv执行文件系统检测
e2fsck -f /dev/vghoopan/lvhoopan
# 缩小文件系统的逻辑容量
resize2fs /dev/vghoopan/lvhoopan 2G
# 缩小LV的物理容量
lvreduce -L 2G /dev/vghoopan/lvhoopan
# 挂载
mount /dev/vghoopan/lvhoopan /srv/lvhoopan
LV 快照
LV 可以创建快照备份,占用容量小,恢复备份方便。
# 为lvhoopan创建快照
# -s snapshot快照功能之意
# -n 后接快照名称
# -l 后接数字,使用多少个PE作为快照区
lvcreate -s -l 26 -n snaphoopan /dev/vghoopan/lvhoopan
# 挂载快照,可以看到快照的内容
mount /dev/vghoopan/snaphoopan /srv/snaphoopan
# 利用快照整体恢复
# 注意:不能直接格式化原LV,因为快照与原LV共用数据
# 一般步骤是:1.打包备份快照数据 2.卸载删除快照LV 3.卸载并格式化原LV 4.挂载原LV并将快照备份恢复进去