Linux 目录文件与文件系统

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)
  • 每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的

file

目录结构

目录有特定的用途,一般用来存放相同类型的文件信息,以便于查找文件。下面主要根据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]
选项与参数

  1. 与时间有关的选项
    • -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

file

  1. 与用户或群组有关的选项

    • -uid :根据文件拥有者的用户UID查找
    • -gid n :根据文件归属群组GID查找
    • -user :根据拥有者账号名称,如admin
    • -group :根据文件群组名称
    • -nouser/-nogroup :查找文件拥有者不存在/etc/passwd 或 群组不存在 /etc/group的文件
  2. 与文件权限有关的选项

    • -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
  1. 额外可进行的动作
    • -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 命令选项

  1. 打包/查看/解压,-c、-t、-x 选项只能用一个
    • -c :创建打包文件。
    • -t :查看打包文件的内容含那些文件。
    • -x :解打包或解压缩
  2. 解压缩方式,-z、-j、-J 选项只能用一个
    • -z :通过 gzip 方式压缩或解压缩。文件名建议命名 *.tar.gz
    • -j :通过 bzip2 方式压缩或解压缩。文件名建议命名 *.tar.bz2
    • -J :通过 xz 方式压缩或解压缩。文件名建议命名 *.tar.xz
  3. 解压缩文件
    • -v :压缩或解压缩时显示信息
    • -f filename :-f 后面立即接被处理文件名
    • -C(大写) 目录 :解压到指定目录
  4. 其他选项
    • -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 等级对比

file

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组成。

file

LVM 设置

file

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 可以创建快照备份,占用容量小,恢复备份方便。

file

# 为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并将快照备份恢复进去

参考资料

未经作者允许,禁止转载。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇