文章目录

1.存储基本知识

1.1 磁盘接口类型

  • 并行接口:指采用并行传输方式来传输数据的接口标准。

主要类型:IDE,133MB/s; SCSI ,640MB/s

  • 串行接口:指数据一位一位地顺序传送的接口标准。

特点:通信线路简单,只要一对传输线就可以实现双向通信,从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。

主要类型:SATA,6Gbps;SAS,6Gbps;USB,480MB
具体硬盘接口知识参考一下链接:
硬盘接口知多少

1.2 硬盘类型

1.2.1 设备类型

  • 机械硬盘
    机械硬盘(HDD):Hard Disk Drive,即是传统普通硬盘,主要由:盘
    片,磁头,盘片转轴及控制电机,磁头控制器,数据转换器,接口,缓存
    等几个部分组成。机械硬盘中所有的盘片都装在一个旋转轴上,每张盘片
    之间是平行的,在每个盘片的存储面上有一个磁头,磁头与盘片之间的距
    离比头发丝的直径还小,所有的磁头联在一个磁头控制器上,由磁头控制
    器负责各个磁头的运动。磁头可沿盘片的半径方向运动,加上盘片每分钟
    几千转的高速旋转,磁头就可以定位在盘片的指定位置上进行数据的读写
    操作。数据通过磁头由电磁流来改变极性方式被电磁流写到磁盘上,也可
    以通过相反方式读取。硬盘为精密设备,进入硬盘的空气必须过滤

  • 固态硬盘
    固态硬盘(SSD):Solid State Drive,用固态电子存储芯片阵列而制
    成的硬盘,由控制单元和存储单元(FLASH芯片、DRAM芯片)组成。固
    态硬盘在接口的规范和定义、功能及使用方法上与普通硬盘的完全相同,
    在产品外形和尺寸上也与普通硬盘一致

  • 对比

    • 相较于HDD,SSD在防震抗摔、传输速率、功耗、重量、噪音上有明显优
      势,SSD传输速率性能是HDD的2倍
    • 相较于SSD,HDD在价格、容量、使用寿命上占有绝对优势
    • 硬盘有价,数据无价,目前SSD不能完全取代HHD

1.2.2 设备文件

在linux中默认的存储设备的文件置于目录/dev/ 下面,且目前所有的存储设备的名称均为sd*。

  • 不同磁盘标识:a-z,aa,ab…
    例如: /dev/sda, /dev/sdb, …
  • 同一设备上的不同分区:1,2, …
    例如: /dev/sda1, /dev/sda5

1.2.3 硬盘存储术语

15-磁盘管理-LMLPHP

  • head: 磁头
  • track: 磁道
  • cylinder :柱面
  • sector :扇区
  • CHS(Cylinder-Head-Sector) :磁盘的分区方式,采用24bit位寻址,其中前10位表示cylinder,中间8位表示head,后6位表示sector,最大寻址空间8GB。
  • LBA(Logical block addressing) : LBA是一个整数,通过转换成CHS格式完成磁盘具体寻址 ,同时LBA采用48个bit位寻址,最大寻址空间128PB。由于CHS寻址方式的寻址空间在大概8GB以内,所以在磁盘容 量小于大概8GB时,可以使用CHS寻址方式或是LBA寻址方式 ;在磁盘容量大于大概8GB时,则只能使用LBA寻址方式

2 磁盘分区

2.1 MBR 和 GPT

2.1.1 MBR(Master Boot Record)主引导扇区

主引导记录(Master Boot Record,缩写:MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为(柱面磁头扇区)=(0,0,1)。在深入讨论主引导扇区内部结构的时候,有时也将其开头的446字节内容特指为“主引导记录”(MBR),其后是4个16字节的“磁盘分区表”(DPT),以及2字节的结束标志(55AA)。因此,在使用“主引导记录”(MBR)这个术语的时候,需要根据具体情况判断其到底是指整个主引导扇区,还是主引导扇区的前446字节。

硬盘主引导记录MBR由4个部分组成:

  • 主引导程序(偏移地址0000H–0088H),它负责从活动分 区中装载,并运行系统引导程序。
  • 出错信息数据区,偏移地址0089H–00E1H为出错信息, 00E2H–01BDH全为0字节。
  • 分区表(DPT,Disk Partition Table)含4个分区项,偏移地 址01BEH–01FDH,每个分区表项长16个字节,共64字节为 分区项1、分区项2、分区项3、分区项4
  • 结束标志字,偏移地址01FE–01FF的2个字节值为结束标志 55AA
    15-磁盘管理-LMLPHP
  • 启动代码: 主引导记录最开头是第一阶段引导代码。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后将控制权交给硬盘上的引导程序(如GNU GRUB)。它不依赖任何操作系统,而且启动代码也是可以改变的,从而能够实现多系统引导。
  • 硬盘分区表(DPT):如上图所示,64位分区表中,共4个分区, 每个分区占16位
    • 第1个字节 : 引导标志(80表示活动分区,00表示非活动分区)
    • 2-4个字节:
      • 2: 磁头号
      • 3字节前6位: 扇区号
      • 3字节后2位,4字节:柱面号
    • 5:分区类型(0 表示分区未使用)
    • 6-8个字节
      • 6:磁头号(分区结束CHS)
      • 7字节前6位:扇区号
      • 7字节后2位,8字节:柱面号(CHS)
    • 9-12 字节:分区起始LBA地址
    • 13-16字节:分区结束LBA地址
  • 结束标志字:结束标志字55,AA(偏移1FEH-偏移1FFH)最后两个字节,是检验主引导记录是否有效的标志。

15-磁盘管理-LMLPHP

2.1.2 ZBR (Zoned Bit Recording)

15-磁盘管理-LMLPHP
  由于传统的磁盘在使用时处于磁盘外面的磁道扇区空间相对于离圆形内部的扇区大,但是承载的字节数是一样的,这样分配的不合理,导致数据分布不均。因此为了提高硬盘容量以及以及提高读写速度,所以所以采用了ZBR技术,如上图所示,所有扇区的数据密度都是相同的。

  在较旧的磁盘驱动器中,外轨道和内轨道具有相同的扇区数,因此外磁道数据密度低。这是低效率的对可用空间的利用。在使用ZBR的硬盘,在最外面的环带中的轨道上的数据将具有最高数据传输率

2.1.3 GPT

  全局唯一标识分区表GUID Partition Table,缩写:GPT)是一个实体硬盘的分区表的结构布局的标准。它是可扩展固件接口(EFI)标准(被Intel用于替代个人计算机的BIOS)的一部分,被用于替代BIOS系统中的一32bits来存储逻辑块地址和大小信息的主引导记录(MBR)分区表。设计GPT的原因是为了解决传统的MBR分区只能分2T左右的硬盘空间。 支持128个分区,使用64位,支持8Z(512Byte/block)64Z (4096Byte/block)。使用128位UUID(Universally Unique Identifier) 表示磁盘 和分区 GPT分区表自动备份在头和尾两份,并有CRC校验位 。

15-磁盘管理-LMLPHP

  1. 保护MBR:
      保护MBR位于GPT磁盘的第一扇区,也就是0号扇区,有磁盘签名,MBR磁盘分区表和结束标志组成,没有引导代码。而且分区表内只有一个分区表项,这个表项GPT根本不用,只是为了让系统认为这个磁盘是合法的。
  2. GPT头
      GPT头位于GPT磁盘的第二个磁盘,也就是1号扇区,该扇区是在创建GPT磁盘时生成,GPT头会定义分区表的起始位置,分区表的结束位置、每个分区表项的大小、分区表项的个数及分区表的校验和等信息。
  3. 分区表
      分区表位于GPT磁盘的2-33号磁盘,一共占用32个扇区,能够容纳128个分区表项。每个分区表项大小为128字节。因为每个分区表项管理一共分区,所以Windows系统允许GPT磁盘创建128个分区。每个分区表项中记录着分区的起始,结束地址,分区类型的GUID,分区的名字,分区属性和分区GUID。
  4. 分区区域
       GPT分区区域就是用户使用的分区,也是用户进行数据存储的区域。分区区域的起始地址和结束地址由GPT头定义。
  5. GPT头备份
      GPT头有一个备份,放在GPT磁盘的最后一个扇区,但这个GPT头备份并非完全GPT头备份,某些参数有些不一样。复制的时候根据实际情况更改一下即可。
  6. 分区表备份
      分区区域结束后就是分区表备份,其地址在GPT头备份扇区中有描述。分区表备份是对分区表32个扇区的完整备份。如果分区表被破坏,系统会自动读取分区表备份,也能够保证正常识别分区。

2.1. BIOS+MBR && UEFI+GPT

uefilegacy是两种不同的引导方式。
  uefi新式的BIOSlegacy传统BIOS。你在UEFI模式下安装的系统,只能用UEFI模式引导;同理,如果你是在Legacy模式下安装的系统,也只能在legacy模式下进系统。uefi只支持64为系统且磁盘分区必须为gpt模式,传统BIOS使用Int 13中断读取磁盘,每次只能读64KB,非常低效,而UEFI每次可以读1MB,载入更快。此外,Win8,更是进一步优化了UEFI支持,号称可以实现瞬时开机。
  BIOS是英文"Basic Input Output System"的缩略词,直译过来后中文名称就是"基本输入输出系统"。其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。简单来说就是电脑开机后最先启动的一种程序,为操作系统的启动做准备,比如初始化cpu、内侧、主板等各个部分,然后将操作系统加载到内存启动操作系统,这个过程就是我们电脑从按开机键开始到最后看见桌面的整个过程。
  UEFI全称“统一的可扩展固件接口”(Unified Extensible Firmware Interface), 是一种详细描述类型接口的标准。这种接口用于操作系统自动从预启动的操作环境,加载到一种操作系统上。通俗的说,UEFI是一种新的主板引导初始化的标注设置,具有启动速度快、安全性高和支持大容量硬盘而闻名。出现这种技术的主要作用基本上就是为了实现开机快的效果。
   Legacy BIOS顾名思义就是指传统的BIOS,其中UEFI BIOS包括UEFI引导启动和Legacy引导启动。如下图所示
15-磁盘管理-LMLPHP
由此可见,UEFI方式减少了BIOS的自检过程,因此能够缩短开机时间,给用户带来良好的开机体验。在目前的系统运行方式中,出了win8是基于UEFI方式启动外,其余均为Legacy方式启动。

2.2 分区管理

2.2.1 parted

共有两种使用方式,一种是交互式的,另外一种是非交互式的方式。
parted命令使用

-h, --help 显示此求助信息
-l, --list 列出所有设别的分区信息
-s, --script 从不提示用户
-v, --version 显示版本
-m,--machine 显示机器可分析输出

  • print:打印分区表,或者分区

15-磁盘管理-LMLPHP
15-磁盘管理-LMLPHP

  • mklabel label-type:创建新的磁盘标签 (分区表),label-type可以是:“bsd”, “dvh”, “gpt”, “loop”,“mac”, “msdos”, “pc98”, or “sun” 一般的pc机都是msdos格式,如果分区大于2T则需要选用gpt格式的分区表。 (默认为msdos)
    15-磁盘管理-LMLPHP
  • mkpart PART-TYPE [FS-TYPE] START END :创建新的分区。part_type:primary,extended, logical
    15-磁盘管理-LMLPHP
  • select device:切换为对应设备
    15-磁盘管理-LMLPHP

  • rm NUMBER :删除对应分区 ,NUMBER表示print 命令中 看到的数字
    15-磁盘管理-LMLPHP

  • rescue START END:恢复 rm删掉的分区
    15-磁盘管理-LMLPHP

  • resizepart partition end :扩展分区,在centos6版本这个命令时resize
    15-磁盘管理-LMLPHP
    15-磁盘管理-LMLPHP

  • name partition name: 为分区取名字
  • unit UNIT: 在前面分区时,默认分区时数值的单位是M,这个参数改变默认单位,“kB”, “MB”, “GB”, “TB”
    15-磁盘管理-LMLPHP

  • check NUMBER:检查编号中所指定的文件系统是否有什么错误。(只存在于centos6)中。

2.2.2 fdisk && gdisk

fdisk与gdisk 的用法基本一致, 均是交互式的输入方式

-l:列出所有分区表信息

m :显示菜单和帮助信息
a :活动分区标记/引导分区
d :删除分区
l :显示分区类型
n :新建分区
p :显示分区信息
q :退出不保存
t :设置分区号
v :进行分区检查
w :保存修改
x :扩展应用,高级功能
#使用实例:
[root@MiWiFi-R3L-srv ~]# 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): p  

Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 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: 0x0000d3dc

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     1171875      584914   83  Linux
/dev/sdb2         1174000    11659263     5242632   83  Linux

Command (m for help): n
Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): p
Partition number (3,4, default 3): 3 
First sector (1171876-20971519, default 1173504): 11659264
Last sector, +sectors or +size{K,M,G} (11659264-20971519, default 20971519): +1G
Partition 3 of type Linux and of size 1 GiB is set

Command (m for help): p

Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 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: 0x0000d3dc

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     1171875      584914   83  Linux
/dev/sdb2         1174000    11659263     5242632   83  Linux
/dev/sdb3        11659264    13756415     1048576   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@MiWiFi-R3L-srv ~]#

partx用法
-a:增加制定的分区或读磁盘新增的分区
-d:删除制定或所有的分区
-l:列出分区
-t/--type:指定分区类型。dos,bsd,solaris,unix,或者gpt
-n/--nr M-N:指定分区范围

删除分区用:partx -d --nr M-N /dev/DEVICE 
添加分区:partx -a  /dev/DEVICE   
适用于centos6,7
centos6通知内核重新读取硬盘分区表  
新增分区用   
    partx -a  /dev/DEVICE     
    kpartx -a /dev/DEVICE -f: force  
删除分区用  
    partx -d --nr M-N /dev/DEVICE 
CentOS 5,7: 使用partprobe  
    partprobe [/dev/DEVICE] 
kpart 用法
-a     Add partition mappings
-r     Read-only partition mappings
-d     Delete partition mappings
-u     Update partition mappings
-l     List partition mappings that would be added -a
-p     set device name-partition number delimiter
-f     force creation of mappings; overrides 'no_partitions' feature
-g     force GUID partition table (GPT)
-v     Operate verbosely
-s     Sync mode. Don't return until the partitions are created

在linux中,如果映像文件(.img)含有分区表的话,那么用losetup这个程序来加载文件系统就有点力不从心了。因为losetup只能加载无分区的文件系统映像文件。不过有一个好东西配合losetup却可以来挂载带有分区表的映像文件。这就是kpartx了。

废话不多说,进入正题(其中X和Y要看你的挂接的情况而看了):

#先创建一个1G大小的映像文件来做实验
dd bs=4096 if=/dev/zero of=~/hd.img count=262144


#将映像文件挂接到loopX中去
losetup /dev/loopX ~/hd.img 

#对loopX进行分区
fdisk /dev/loopX

#我这里分了两个区,每个去512M大小
      Device Boot      Start         End      Blocks   Id  System
/dev/loopXpY            2048     1050623      524288   83  Linux
/dev/loopXpY         1050624     2097151      523264   83  Linux

#正戏来了,使用kpartd装载映像,使用kpartx是需要root用户的,因为是用root登录的,所以不用使用sudo。从前面的命令就可以看出来...
kpartx -av ~/hd.img

#装载之后,就可以在/dev/mapper/目录下看到两个loopXpY的文件了。

#接下来对loopXpY进行格式化了。
mkfs.vfat /dev/mapper/loopXpY

#然后挂载文件系统。
mount /dev/mapper/loop1p1 /media/hd1

#OK,罗嗦完了。
使用完映像文件的文件系统后,想退出的话,可以使用 kpartx -dv /dev/loopX 写卸载刚才挂接的东西。然后再使用losetup -d /dev/loopX断掉和映像文件的挂接关系。

其中,kpartx -a指定去添加哪个映像文件(add),-v是指挂到loop设备(verbose),-d就是delete的意思了。
partprobe  [/dev/DEVICE] 
-d:不更新内核;
-s:显示摘要和分区;
-h:显示帮助信息;
-v:显示版本信息。

2.2.3 普通文件分区

使用普通文件创建文件系统, 但是这个普通文件无法创建分区 ,理论上一个文件无法挂载在目录上, linux系统中直接将要挂载的文件与/dev/loop#的设备相关联, 通过对应loop设备挂载在目录上,在centos6中loop设备共有8个,如果需要更多的需要自己手动创建对应的块文件,centos7中 需要时系统会系统创建。

dd  if=/dev/zero  of=partfiles bs=1M count=102 
mkfs.ext4 partfiles
mount -o loop /app/partfiles  /mnt 

创建loop设备的命令需要使用到mknod命令

mknod:这个命令主要用于创建字符设备以及块设备
mknod [OPTION]... NAME TYPE [MAJOR MINOR]
OPTION:
-m 文件权限
-Z 文件上下文

[root@MiWiFi-R3L-srv dev]# mknod -m 660 loop8 c 7 8
[root@MiWiFi-R3L-srv dev]# ll | grep loop
brw-rw----. 1 root disk      7,   0 Aug  9 06:20 loop0
brw-rw----. 1 root disk      7,   1 Aug  9 06:20 loop1
brw-rw----. 1 root disk      7,   2 Aug  9 06:20 loop2
brw-rw----. 1 root disk      7,   3 Aug  9 06:20 loop3
brw-rw----. 1 root disk      7,   4 Aug  9 06:20 loop4
brw-rw----. 1 root disk      7,   5 Aug  9 06:20 loop5
brw-rw----. 1 root disk      7,   6 Aug  9 06:20 loop6
brw-rw----. 1 root disk      7,   7 Aug  9 06:20 loop7
crw-rw----. 1 root root      7,   8 Aug 15 21:56 loop8

  • loop设备简介

  在类 UNIX 系统里,loop 设备是一种伪设备(pseudo-device),或者也可以说是仿真设备。它能使我们像块设备一样访问一个文件。在使用之前,一个 loop 设备必须要和一个文件进行连接。这种结合方式给用户提供了一个替代块特殊文件的接口。因此,如果这个文件包含有一个完整的文件系统,那么这个文件就可以像一个磁盘设备一样被 mount 起来。

  上面说的文件格式,我们经常见到的是 cd 或 DVD 的 ISO 光盘镜像文件或者是软盘(硬盘)的 *.img 镜像文件。通过这种 loop mount (回环mount)的方式,这些镜像文件就可以被 mount 到当前文件系统的一个目录下。

  至此,顺便可以再理解一下 loop 之含义:对于第一层文件系统,它直接安装在我们计算机的物理设备之上;而对于这种被 mount 起来的镜像文件(它也包含有文件系统),它是建立在第一层文件系统之上,这样看来,它就像是在第一层文件系统之上再绕了一圈的文件系统,所以称为 loop。
默认情况下,用户使用mount -o loop /filename /mnt 这样的命令时系统会默认直接将文件与对应的loop设备相互关联, 可以使用losetup手动运行这个关联过程,

losetup
losetup [ -e encryption ] [ -o offset ] loop_device file
losetup [ -d ] loop_device
选项
-a 显示所有循环设备的状态。
-d 卸除设备。
-e <加密选项> 启动加密编码 。
-f 寻找第一个未使用的循环设备。
-o <偏移量>设置数据偏移量,单位是字节。
-r 关联设备只读
-j filename 查看分配给file的所有loop设备

[root@MiWiFi-R3L-srv ~]# losetup  /dev/loop3 floppy.img 
[root@MiWiFi-R3L-srv ~]# losetup -a
/dev/loop3: [fd00]:22 (/root/floppy.img)
[root@MiWiFi-R3L-srv ~]# losetup -j floppy.img 
/dev/loop3: [fd00]:22 (/root/floppy.img)
[root@MiWiFi-R3L-srv ~]# losetup -d /dev/loop3
[root@MiWiFi-R3L-srv ~]# losetup -a
[root@MiWiFi-R3L-srv ~]# 
[root@MiWiFi-R3L-srv ~]# losetup -r  /dev/loop3 floppy.img 
[root@MiWiFi-R3L-srv ~]# mount /dev/loop3 /mnt
mount: block device /dev/loop3 is write-protected, mounting read-only
[root@MiWiFi-R3L-srv ~]# cd /mnt
[root@MiWiFi-R3L-srv mnt]# touch 1
touch: cannot touch `1': Read-only file system
[root@MiWiFi-R3L-srv ~]# losetup   /dev/loop3 floppy.img 
[root@MiWiFi-R3L-srv ~]# mount -o loop  floppy.img  /mnt
[root@MiWiFi-R3L-srv ~]# cd /mnt 
[root@MiWiFi-R3L-srv mnt]# touch 1
[root@MiWiFi-R3L-srv mnt]# ll
total 13
-rw-r--r--. 1 root root     0 Aug 15 22:20 1
drwx------. 2 root root 12288 Aug 15 22:11 lost+found

可以通过设置/etc/grub.conf文件中下图所示对应位置, 可以保证loop设备 会在开机之后自动设置那么多个。
15-磁盘管理-LMLPHP

2.2.4 SWAP分区

  Linux内核为了提高读写效率速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存变少。当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。

  • swap 相关命令
    • mkswap :用于在一个文件或者设备上建立交换分区
      • -c:建立交换区前,先检查是否有损坏的区块
      • -U: 使用指定的UUID
      • -L: 指定标签
    • swapon:用于激活Linux系统中交换空间
      • -a :启用所有/etc/fstab 中指定的swap分区
      • -s : 查看所有的swap分区,相当于/proc/swaps
    • swapoff:用于关闭指定的交换空间(包括交换文件和交换分区)
      • -a :关闭所有/etc/fstab中指定的swap分区
[root@localhost proc]# mkswap /dev/sdb1
Setting up swapspace version 1, size = 1060252 KiB
no label, UUID=4f8eda7b-0619-4d65-b3bc-b9d554596920
[root@localhost proc]# swapon /dev/sdb1
[root@localhost proc]# lsblk
NAME                        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0                          11:0    1   55M  0 rom  
sda                           8:0    0   20G  0 disk 
├─sda1                        8:1    0  500M  0 part /boot
└─sda2                        8:2    0 19.5G  0 part 
  ├─VolGroup-lv_root (dm-0) 253:0    0 17.5G  0 lvm  /
  └─VolGroup-lv_swap (dm-1) 253:1    0    2G  0 lvm  [SWAP]
sdd                           8:48   0   30G  0 disk 
sdb                           8:16   0   10G  0 disk 
└─sdb1                        8:17   0    1G  0 part [SWAP]
sdc                           8:32   0   20G  0 disk 
sde                           8:64   0   40G  0 disk 

[root@localhost proc]# swapon  -s
Filename				Type		Size	Used	Priority
/dev/dm-1                               partition	2097148	0	-1
/dev/sdb1                               partition	1060252	0	-2

3 文件系统

  文件系统是操作系统用于明确存储设备或分区上的文件的方法 和数据结构;即在存储设备上组织文件的方法。操作系统中负 责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统。
  从系统角度来看,文件系统是对文件存储设备的空间进行组织 和分配,负责文件存储并对存入的文件进行保护和检索的系统 。具体地说,它负责为用户建立文件存入读出修改转 储文件控制文件的存取安全控制日志压缩加密等。
  支持的文件系统:/lib/modules/`uname –r`/kernel/fs`

3.1文件系统类型

Linux文件系统:
    ext2(Extended file system), ext3, ext4, xfs(SGI), btrfs(Oracle), reiserfs, jfs( AIX), swap 
光盘:
    iso9660 
Windows:
    FAT32, exFAT,NTFS Unix: FFS(fast), UFS(unix), JFS2
网络文件系统:
    NFS, CIFS 
集群文件系统:
    GFS2, OCFS2(oracle)
分布式文件系统
    fastdfs,ceph, moosefs, mogilefs, glusterfs, Lustre 
RAW:未经处理或者未经格式化产生的文件系统 

3.2 文件系统分类

根据其是否支持"journal"功能:  
    日志型文件系统: ext3, ext4, xfs, ... 
    非日志型文件系统: ext2, vfat 
文件系统的组成部分: 
    内核中的模块:ext4, xfs, vfat  
    用户空间的管理工具:mkfs.ext4, mkfs.xfs,mkfs.vfat 
Linux的虚拟文件系统:VFS 
查前支持的文件系统:cat /proc/filesystems 

3.3 VFS

  • 什么是vfs。
      我们知道文件系统的种类有很多。除了Linux标准的文件系统Ext2/Ext3/Ext4外,还有很多种文件系统 。linux通过叫做VFS的中间层对这些文件系统提供了完美的支持。在大部分情况下,用户通过libc和kernel的VFS交互,不需要关心底层文件系统的具体实现。
  • vfs的作用。
      vfs所隐含的思想是把表示很多不同种类文件系统的共同信息放入内核;其中有一个字段或函数来支持Linux所支持的所有实际文件系统所提供的任何操作。对所调用的每个读、写或其他函数,内核都能把它们替换成支持本地Linux文件系统、NTFS文件系统,或者文件所在的任何其他文件系统的实际函数。有了vfs,就能很容易实现不同文件系统之间的数据读写,因为它们对外接口都是一样的,都是vfs导出的通用接口。
    15-磁盘管理-LMLPHP

3.4 创建文件系统

在centos6中默认使用ext4文件系统, 在centos7中默认使用xfs文件件系统。一般使用mkfs这个命令创建文件系统

mkfs [options] [-t type] [fs-options] device [size] //通用型命令

  • device : 预备检查的硬盘分区,例如:/dev/sda1
  • -V : 详细显示模式
  • -t : 给定档案系统的型式,Linux 的预设值为 ext2 同mkfs.type 如mkfs.xfs
  • -c : 在制做档案系统前,检查该partition 是否有坏轨
  • -l bad_blocks_file : 将有坏轨的block资料加到 bad_blocks_file 里面
  • block : 给定 block 的大小
  • -L “Lable” 设置卷标

mke2fs:ext系列文件系统专用管理工具

  • -t {ext2|ext3|ext4}
  • -b {1024|2048|4096} 修改块大小
  • -L ‘LABEL’
  • -j: 相当于 -t ext3
    • mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3
  • -i #: 为数据空间中每多少个字节创建一个inode;此大 小不应该小于block的大小
  • -N #:指定分区中创建多少个inode
  • -I 一个inode记录占用的磁盘空间大小,128—4096
  • -m #: 默认5%,为管理人员预留空间占总空间的百分比
  • -O FEATURE[,…]:启用指定特性
  • -O ^FEATURE:关闭指定特性
  • inode与block的关系
    • inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的 block 号码; 由于实际中inode号与文件名分开存储
    • block:是用来放置文件内容数据地地方,若文件太大时,会占用多个 block 。在 Ext2+文件系统中所支持的block大小有1K,2K及4K三种而已。在格式化时block的大小就固定了,且每个 block 都有编号,以方便 inode 的记录。 block有一下注意点。
      • block 的大小与数量在格式化完就不能够再改变了(除非重新格式化);
      • 每个 block 内最多只能够放置一个文件的数据;
      • 如果文件大于 block 的大小,则一个文件会占用多个 block 数量;
      • 如果文件小于 block ,则该 block的剩余容量就不能够再被使用了(磁盘空间会浪费)
inode 面试题
1. 一个100M的磁盘分区,写入1K的文件或写入1M的文件,分别可以写入多少个?

分析:换算单位100M=1024000K ,1M=1024K 一个block=4K

如果写入1K的文件,由于1K的文件远小于1个block的大小,1个block就可以存一个1K的文件,所以1024000/4=25600 个文件.

如果写入1M的文件,优于1M的文件远大于1个block的大小,1个block存不下一个1M的文件,
因此,1M的文件需要1024/4=256个block块来存1M的文件,所以100M的空间最多能存1024000/256=400个文件.

2. 假设你的Ext4文件系统使用 4K block ,而该文件系统中有 10000 个小文件,每个文件大小均为 50bytes, 请问此时你的磁盘浪费多少容量?

分析:单位换算,一个block大小为 4K=4096 bytes 远大于一个文件的大小50bytes

因此一个block就浪费了 4096-50=4046,10000个文件就浪费10000*4046=40460000bytes
换算单位:浪费了38M左右的容量。
tune2fs查看/修改ext文件系统类型的属性信息。
 -l:查看指定文件系统超级块信息;super block  
 -L 'LABEL':修改卷标  
 -m #:修预留给管理员的空间百分比  
 -j: 将ext2升级为ext3  
 -O: 文件系统属性启用或禁用, –O ^has_journal  
 -o: 调整文件系统的默认挂载选项,–o ^acl   
 -U UUID: 修改UUID号 
 
e2label device [ new-label ] 修改ext文件系统卷标

blkid :块设备属性信息查看 
blkid [OPTION]... [DEVICE] 
-U UUID: 根据指定的UUID来查找对应的设备 
-L LABEL:根据指定的LABEL来查找对应的设备

findfs :查找分区  
findfs [options] LABEL=<label>  
findfs [options] UUID=<uuid> 
 
 
  • superblock
      超级块是文件系统特性的记录,包括其大小,块大小,空块和填充块及其各自的计数,inode表的大小和位置,磁盘块映射和使用信息,以及 块组的大小。
      一个EXT2文件系统时,基本的Linux文件系统的类型,分为块组,其中每个都包含,默认情况下,8192个块。同一文件系统上的默认块大小为4096 字节。因此,在块偏移8193,16385,24577等处存在超级块的备份副本。
      可以通过dumpe2fs 查看对应的文件系统超级块信息。
    centos6超级块组中有 8193个超级块, centos7 有32768个 超级块大小
dumpe2fs
-h:查看超级块信息,不显示分组信息 

在超级块数据有所丢失时,可以通过以下命令可以通过备份块回复超级块。
e2fsck -f -b 8193 /dev/hda2

15-磁盘管理-LMLPHP

dd if=/dev/zero of=/dev/sdb1 bs=1M count=10
e2fsck -f -b 24577  /dev/sdb1
或者 fsck -a /dev/sdb1
  • 文件系统的修复:
常发生于死机或者非正常关机之后 
挂载为文件系统标记为“no clean” 
注意:一定不要在挂载状态下修复 
fsck:Filesystem Check
fsck.FS_TYPE
    fsck -t FS_TYPE
    -a:自动修复错误
    -r:交互式修复错误

NOTE:FS_TYPE一定要与分区上已经的文件系统类型相同

e2fsck:ext系列文件专用的检测修复工具
    -y:自动回答为yes
    -f:强制修复

3.5 挂载

3.5.1 mount

一般的存储硬盘需要挂载在设备上时才可以使用。
挂载使用mount 命令
mount [-fnrsvw] [-t vfstype] [-o options] device dir
直接使用mount命令可以通过查看/etc/mtab文件显示当前已挂载的所有设备。

  • device:指明要挂载的设备

    1. 设备文件: 例如/dev/sda5
    2. 卷标: -L ‘LABEL’,例如 -L ‘MYDATA’
    3. UUID: -U UUID ,例如 -U ‘e1a3f485-d29d-4c97-926e-2f12f978cdbb’
    4. 伪文件系统名称:proc,sysfs ,devtmpfs,configfs
  • dir:挂载点

    1. 事先存在;建议使用空目录
    2. 进程正在使用中的设备无法被卸载
  • 常用选项:

    • -t vsftype: 指定要挂载的设备上的文件系统类型
    • -r readonly: 只读挂载:
    • -w read and write , 读写挂载
    • -n 不更新/etc/mtab(追踪当前系统所有文件系统的挂载卸载)
    • -a 自动挂载所有支持自动挂载设备:(定义在了/etc/fstab文件中,且挂载选项中支持自动挂载)
    • -L ‘LABEL’ :以卷标指定挂载设备
    • -U ‘UUID’:以UUID指定要挂载的设备
    • -B ,–bind:绑定目录到另一个目录上
  • -o options:(挂载文件系统的选项),多个选项使用逗号分隔

    • async:异步模式
    • sync:同步模式,内存更改时,同时写磁盘
    • atime/noatime:包含目录和文件
    • diratime/nodiratime:目录的访问时间戳
    • auto/noauto:是否支持自动挂载,是否支持-a选项
    • exec/noexec:是否支持将文件系统上运行应用程序
    • dev/nodev:是否支持在此文件系统上使用设备文件
    • suid/nosuid:是否支持suid和sgid权限
    • remount:重新挂载
    • ro:只读
    • rw:读写
    • user/nouser:是否允许普通用户挂载此设备,/etc/fstab使用
    • acl:启用此文件系统上的acl功能
    • loop: 使用loop设备

注:可以通过安装autofs安装包实现自动挂载,该安装包共有两个配置文件/etc/auto.misc,/etc/auto.master,在用户没有进入对应目录之后,过10分钟之后就会卸载对应目录,之后需要访问目录时才会挂载对应的目录。在配置文件/etc/sysconfig/autofs中可以配置对应对应的时间

  • /etc/auto.master 中有挂载目录,以及对应目录的mount map
  • /etc/auto.master 中有对应的mount map
[root@localhost /]# cat /etc/auto.master 
#
# Sample auto.master file
# This is a 'master' automounter map and it has the following format:
# mount-point [map-type[,format]:]map [options]
# For details of the format look at auto.master(5).
#
/misc	/etc/auto.misc   //--/misc是定义的自动mount的挂载点,/etc/auto.misc里定义了mount的动作(/etc/auto.misc一般为默认的mount文件,还可以自定义)
#
# NOTE: mounts done from a hosts map will be mounted with the
#	"nosuid" and "nodev" options unless the "suid" and "dev"
#	options are explicitly given.
#
/net	-hosts
#

[root@localhost /]# cat /etc/auto.misc 
#
# This is an automounter map and it has the following format
# key [ -mount-options-separated-by-comma ] location
# Details may be found in the autofs(5) manpage

cd		-fstype=iso9660,ro,nosuid,nodev	:/dev/cdrom

# the following entries are samples to pique your imagination
#linux		-ro,soft,intr		ftp.example.org:/pub/linux   //--将ftp.example.org的共享目录/pub/linux/自动挂载到/misc/linux/下
#boot		-fstype=ext2		:/dev/hda1
#floppy		-fstype=auto		:/dev/fd0
#floppy		-fstype=ext2		:/dev/fd0
#e2floppy	-fstype=ext2		:/dev/fd0
#jaz		-fstype=ext2		:/dev/sdc1
#removable	-fstype=ext2		:/dev/hdd


之后重启autofs服务即可


3.5.2 findmnt

findmnt :find a filesystem

  • -A, --all 打印所有的文件系统
  • -a, --ascii,使用ascii字符进行树格式化。
  • -s, --fstab 打印出/etc/fstab中的内容
  • -m, --mtab 打印出/etc/mtab中的内容
  • -D, --df 以类似df 的方式输出,这个选项相当于-o SOURCE,FSTYPE,SIZE,USED,AVAIL,USE%,TARGET,但不包含所有的伪文件系统,使用–all 打印所有文件系统
  • -k, --kernel 打印出/proc/self/mountinfo信息这个值是默认的。
  • -e, --evaluate 转换所有标签(标签,UUID,PARTUUID或PARTLABEL)的设备名称。
[root@MiWiFi-R3L-srv ~]# findmnt -e LABEL="/dev/media"
TARGET SOURCE    FSTYPE OPTIONS
/mnt   /dev/sdb1 ext4   rw,relatime,seclabel,barrier=1,data=writeback
  • -n ,–noheadings 不打印开头的行
  • -O ,–options list 通过挂载选项筛选文件系统。
[root@MiWiFi-R3L-srv /]# findmnt -O gid=5
TARGET   SOURCE FSTYPE OPTIONS
/dev/pts devpts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000

  • -o, --output list :确定打印出来的格式
SOURCE TARGET FSTYPE OPTIONS LABEL  UUID  
PARTLABEL  PARTUUID SIZE AVAIL USED FSROOT
  • -r, --raw 输出最原始的格式
  • -S, --source 根据挂载源查找
  • -T, --target 通过挂载源查找
  • -t, --types list 通过文件系统类型查找挂载
findfs 通过LABEL 或UUID查找对应的分区文件
[root@MiWiFi-R3L-srv /]# findfs LABEL=/dev/media
/dev/sdb1
[root@MiWii-R3L-srv /]# 

linux不支持嵌套挂载。

[root@MiWiFi-R3L-srv /]# mount /dev/sdb1 /mnt
[root@MiWiFi-R3L-srv mnt]# mkdir boot
[root@MiWiFi-R3L-srv mnt]# touch 1 2 3 4 5 6
[root@MiWiFi-R3L-srv mnt]# ls
1  2  3  4  5  6  boot  lost+found
[root@MiWiFi-R3L-srv mnt]# mount /dev/sdb1  boot/
[root@MiWiFi-R3L-srv mnt]# cd boot/
[root@MiWiFi-R3L-srv boot]# ls
1  2  3  4  5  6  boot  lost+found
[root@MiWiFi-R3L-srv boot]# cd boot/
[root@MiWiFi-R3L-srv boot]# ls


3.6 卸载

3.6.1 umount

-a:卸除/etc/mtab中记录的所有文件系统;
-h:显示帮助;
-n:卸除时不要将信息存入/etc/mtab文件中;
-r:若无法成功卸除,则尝试以只读的方式重新挂入文件系统;
-t<文件系统类型>:仅卸除选项中所指定的文件系统;
-v:执行时显示详细的信息;
-V:显示版本信息。

3.6.2 lsof

  lsoflist open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

  • 选项
    • -a 列出打开文件存在的进程
    • -c<进程名> 列出指定进程所打开的文件
    • -g 列出GID号进程详情
    • -d<文件号> 列出占用该文件号的进程
    • +d<目录> 列出目录下被打开的文件
    • +D<目录> 递归列出目录下被打开的文件
    • -N<目录> 列出使用NFS的文件
    • -n 不将IP转换成对应的主机名
    • -i<条件> [46][protocol][@hostname|hostaddr][:service|port]
      列出符合条件的进程。(4、6、协议、:端口、 @ip )
    • -p<进程号> 列出指定进程号所打开的文件
    • -u 列出UID号进程详情
    • -h 显示帮助信息
    • -v 显示版本信息
    • -s [p:s] p表示TCP或者UDP S表示对应协议的状态

示例展示:

[root@MiWiFi-R3L-srv fd]# lsof -sTCP:LISTEN  -itcp -n
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1493 root    3u  IPv4  11309      0t0  TCP *:ssh (LISTEN)
sshd    1493 root    4u  IPv6  11315      0t0  TCP *:ssh (LISTEN)
master  1572 root   12u  IPv4  11505      0t0  TCP 127.0.0.1:smtp (LISTEN)
master  1572 root   13u  IPv6  11506      0t0  TCP [::1]:smtp (LISTEN)


[root@MiWiFi-R3L-srv ~]# lsof -i :22
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1493 root    3u  IPv4  11309      0t0  TCP *:ssh (LISTEN)
sshd    1493 root    4u  IPv6  11315      0t0  TCP *:ssh (LISTEN)
sshd    5174 root    3r  IPv4  23371      0t0  TCP 192.168.31.63:ssh->192.168.31.110:58694 (ESTABLISHED)


[root@MiWiFi-R3L-srv ~]# lsof -u ^root
COMMAND  PID    USER   FD   TYPE             DEVICE SIZE/OFF   NODE NAME
qmgr    1585 postfix  cwd    DIR              253,0     4096 391243 /var/spool/postfix
qmgr    1585 postfix  rtd    DIR              253,0     4096      2 /
qmgr    1585 postfix  txt    REG              253,0   308104 656344 /usr/libexec/postfix/qmgr
qmgr    1585 postfix  mem    REG              253,0    66432 130338 /lib64/libnss_files-2.12.so
qmgr    1585 postfix  mem    REG              253,0   122056 130390 

3.6.3 fuser

  fuser命令用于报告进程使用的文件和网络套接字。fuser命令列出了本地进程的进程号,那些本地进程使用file,参数指定的本地或远程文件。对于阻塞特别设备,此命令列出了使用该设备上任何文件的进程。

-a:显示命令行中指定的所有文件;
-k:杀死访问指定文件的所有进程;
-i:杀死进程前需要用户进行确认;
-l:列出所有已知信号名;
-m:指定一个被加载的文件系统或一个被加载的块设备;
-n:选择不同的名称空间;
-u:在每个进程后显示所属的用户名。

fuser -km /mnt

3.7 linux中涉及存储的文件

3.7.1 /etc/fstab

<file system><dir><type><options><dump><pass>

  • - 要挂载的分区或存储设备.
  • - 要挂载设备或是分区的文件系统类型,支持许多种不同的文件系统:ext2, ext3, ext4, reiserfs,xfs, jfs, smbfs, iso9660, vfat, ntfs, swapauto。 设置成auto类型,mount 命令会猜测使用的文件系统类型,对 CDROM 和 DVD 等移动设备是非常有用的。
  • - 挂载时使用的参数,注意有些 参数是特定文件系统才有的,这里参数与mount挂载时的参数一致。
  • dump 工具通过它决定何时作备份. dump 会检查其内容,并用数字来决定是否对这个文件系统进行备份。 允许的数字是 0 和 1 。0 表示忽略, 1 则进行备份。大部分的用户是没有安装 dump 的 ,对他们而言 应设为 0。
  • fsck 读取 的数值来决定需要检查的文件系统的检查顺序。允许的数字是0, 1, 和2。 根目录应当获得最高的优先权 1, 其它所有需要被检查的设备设置为 2. 0 表示设备不会被 fsck 所检查。
# 普通文件挂载在目录中
/app/partfile /mnt/part ext4 defaults,loop 0 0      
# cdrom 挂载在目录中
/dev/sr0 /mnt/cdrom  iso9660 defaults 0 0
# 目录绑在另一个目录上 
/etc/sysconfig  /mnt/sysconfig none bind 0 0

3.7.2 /etc/mtab

  /etc/mtab 是供 mount/umount 进行读写的,是相对动态的。读的话,比如你在挂载一个文件系统时缺少一个参数,它就会自动去/etc/mtab 或者 /etc/fstab 里去查,如果找到的话,只要一个参数也够。写的话,比如你umount了一个文件系统,umount 就会删掉/etc/mtab 里面的相关记录。

3.7.3 /proc/partitions

  该文件中主要包括分区设备的主副设备号,块数,以及对应/dev目录下面的设备名,与/dev/devices 中的设备名,与主设备号相互对应

[root@localhost proc]# cat /proc/partitions 
major minor  #blocks  name

   8        0   20971520 sda
   8        1     512000 sda1
   8        2   20458496 sda2
   8       48   31457280 sdd
   8       16   10485760 sdb
   8       17     487424 sdb1
   8       32   20971520 sdc
   8       64   41943040 sde
 253        0   18358272 dm-0
 253        1    2097152 dm-1

major number :对应设备的类型
minor number :对应此设备类型的唯一标识

3.7.4 /proc/mounts

  由于linux 内核中引入了namespace的概念, 所以当名称空间里面挂载了不一样的设备, 这样会使得空间里面和外面的信息发现混乱, 所以出现了这个文件, 这个文件本身是/proc/self/mounts 的链接文件。防止查找的时候出错

在内存中查看分区信息方式:
1. cat /proc/mounts
2. lsblk
3. cat /proc/partitions
4. ls /dev/sda*  

在硬盘中查看分区信息
1. fdisk -l 

3.8 外置设备-CDROM

CDROM

  一般在使用图形化界面的时候,都会直接将外置设备自动挂载在/run/media/\<user\>/<label>目录下面。

创建ISO文件 共有两种方式,

  1. cp /dev/cdrom /root/centos7.iso
  2. mkisofs -r -o /root/etc.iso /etc
    可以通过以下脚本创建一个新的ISO文件。
#!/bin/bash

# by Chris Kloiber <ckloiber@redhat.com>
# Mods under CentOS by Phil Schaffner <pschaff2@verizon.net>

# A quick hack that will create a bootable DVD iso of a Red Hat Linux
# Distribution. Feed it either a directory containing the downloaded
# iso files of a distribution, or point it at a directory containing
# the "RedHat", "isolinux", and "images" directories.

# This version only works with "isolinux" based Red Hat Linux versions.

# Lots of disk space required to work, 3X the distribution size at least.

# GPL version 2 applies. No warranties, yadda, yadda. Have fun.

# Modified to add sanity checks and fix CentOS4 syntax errors

# TODO:
#   Add checks for available disk space on devices holding output and
#       temp files.
#   Add optional 3rd parameter to specify location of temp directory.
#   Create .discinfo if not present.

OS_VER=\
$((test -e /etc/fedora-release && rpm -qf /etc/fedora-release --qf "FC%{VERSION}") \
|| (test -e /etc/redhat-release && rpm -qf /etc/redhat-release --qf "EL%{VERSION}") \
|| echo OS_unknown)

case "$OS_VER" in
  EL[45]*|FC?)
        IMPLANT=/usr/lib/anaconda-runtime/implantisomd5
        if [ ! -f $IMPLANT ]; then
            echo "Error: $IMPLANT Not Found!"
            echo "Please install anaconda-runtime and try again."
            exit 1
        fi
        ;;
  EL6*|FC1?)
        IMPLANT=/usr/bin/implantisomd5
        if [ ! -f $IMPLANT ]; then
            echo "Error: $IMPLANT Not Found!"
            echo "Please install isomd5sum and try again."
            exit 1
        fi
        ;;
  OS_unknown)
        echo "Unknown OS."
        exit 1
        ;;
  *)
        echo "Fix this script for $OS_VER"
        exit 1
esac

if [ $# -lt 2 ]; then
        echo "Usage: `basename $0` source /destination/DVD.iso"
        echo ""
        echo "        The 'source' can be either a directory containing a single"
        echo "        set of isos, or an exploded tree like an ftp site."
        exit 1
fi

DVD_DIR=`dirname $2`
DVD_FILE=`basename $2`

echo "DVD directory is $DVD_DIR"
echo "ISO file is $DVD_FILE"

if [ "$DVD_DIR" = "." ]; then
    echo "Destinaton Directory $DVD_DIR does not exist"
    exit 1
else
    if [ ! -d "/$DVD_DIR" ]; then
        echo "Destinaton Directory $DVD_DIR must be an absolute path"
        exit 1
    else
        if [ "$DVD_FILE" = "" ] || [ -d "$DVD_DIR/$DVD_FILE" ]; then
            echo "Null ISO file name."
            exit 1
        fi
    fi
fi

which mkisofs >&/dev/null
if [ "$?" != 0 ]; then
    echo "mkisofs Not Found"
    echo "yum install mkisofs"
fi

which createrepo >&/dev/null
if [ "$?" != 0 ]; then
    echo "createrepo Not Found"
    echo "yum install createrepo"
fi

if [ -f $2 ]; then
    echo "DVD ISO destination $2 already exists. Remove first to recreate."
    exit 1
fi

# Make sure there is enough free space to hold the DVD image on the filesystem
# where the home directory resides, otherwise change ~/mkrhdvd to point to
# a filesystem with sufficient free space.

cleanup() {
    [ ${LOOP:=/tmp/loop} = "/" ] && echo "LOOP mount point = \/, dying!" && exit
    [ -d $LOOP ] && rm -rf $LOOP 
    [ ${DVD:=~/mkrhdvd} = "/" ] && echo "DVD data location is \/, dying!" && exit
    [ -d $DVD ] && rm -rf $DVD 
}

cleanup
mkdir -p $LOOP
mkdir -p $DVD

ls $1/*.iso &>/dev/null
if [ "$?" = 0 ]; then

    echo "Found ISO CD images..."

    CDS=`expr 0`
    DISKS="1"

    [ -w / ] || {   # Very portable, but perhaps not perfect, test for superuser.
        echo "Only 'root' may use this script for loopback mounts" 1>&2
        exit 1
    }

    for f in `ls $1/*.iso`; do
        mount -o loop $f $LOOP
        cp -av $LOOP/* $DVD
        if [ -f $LOOP/.discinfo ]; then
            cp -av $LOOP/.discinfo $DVD
            CDS=`expr $CDS + 1`
            if [ $CDS != 1 ] ; then
                DISKS=`echo ${DISKS},${CDS}`
            fi
        fi
        umount $LOOP
    done
else
    if [ -f $1/isolinux/isolinux.bin ]; then

        echo "Found FTP-like tree..."

        if [ -e $1/.discinfo ]; then
            cp -av $1/.discinfo $DVD
        else
# How does one construct a legal .discinfo file if none is found?
            echo "Error: No .discinfo file found in $1"
            cleanup
            exit 1
        fi
        cp -av $1/* $DVD
    else
        echo "Error: No CD images nor FTP-like tree found in $1"
        cleanup
        exit 1
    fi
fi

if [ -e $DVD/.discinfo ]; then
    awk '{ if ( NR == 4 ) { print disks } else { print ; } }' disks="ALL" $DVD/.discinfo > $DVD/.discinfo.new
    mv $DVD/.discinfo.new $DVD/.discinfo
else
    echo  "Error: No .discinfo file found in $DVD"
    cleanup
    exit 1
fi

rm -rf $DVD/isolinux/boot.cat
find $DVD -name TRANS.TBL | xargs rm -f

cd $DVD
createrepo -g repodata/comps.xml ./
mkisofs -J -R -v -T -o $2 -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 8 -boot-info-table $DVD
if [ "$?" = 0 ]; then

    echo ""
    echo "Image complete, create md5sum..."

#  $IMPLANT --force $2
# Don't like forced mediacheck? Try this instead.
    $IMPLANT --supported-iso --force $2

    echo "Start cleanup..."

    cleanup

    echo ""
    echo "Process Complete!"
    echo "Wrote DVD ISO image to $DVD_DIR/$DVD_FILE"
    echo ""
else
    echo "ERROR: Image creation failed, start cleanup..."

    cleanup

    echo ""
    echo "Failed to create ISO image $DVD_DIR/$DVD_FILE"
    echo ""
fi

该脚本来源于这个网站:https://wiki.centos.org/zh/TipsAndTricks/CDtoDVDMedia?highlight=(mkdvdiso)

刻录光盘

  • wodim –v –eject centos.iso

光驱控制:

  • eject 弹出光驱
  • eject -t 弹入光驱

blkid -U `sed -rn ‘S#^UUID=(.*) /app .*#\1p’ /etc/fstab`

4 常用工具

4.1 free

  • 语法:free [OPTIONS]
  • OPTIONS
    • -b:以Byte为单位显示内存使用情况。
    • -k:以KB为单位显示内存使用情况。
    • -m:以MB为单位显示内存使用情况。
    • -g:以GB为单位显示内存使用情况。
    • -o:不显示缓冲区调节列。
    • -s<间隔秒数>:持续观察内存使用状况。
    • -c counts :与-s一起使用显示[count]次
    • -t:显示内存总和列。
    • -V:显示版本信息。
[root@localhost /]# free 
             total       used       free     shared    buffers     cached
Mem:       1922072     317920    1604152        244      13760     183024
-/+ buffers/cache:     121136    1800936
Swap:      2097148          0    2097148

说明:在内核中 buffer/cache 占用的是内存空间。

  • cache:缓冲,当用户读一个文件之后, 系统会将文件保存进内核中的cache, 之后用户如果再次读取数据时,会直接从cache中读取文件,命中率越高,读取的速率越快
  • buffer:缓存,用户在写完数据之后直接将数据先写进内存中的buffer,等过一会之后再将数据写磁盘中。

4.2 dd

  • 语法: dd if=/PATH/FROM/SRC of=/PATH/TO/DEST
  • 参数
    • of=file : 写到所命名的文件而不是到标准输出
    • if=file : 从所命名文件读取而不是从标准输入
    • bs=size : 指定块大小(既是是ibs也是obs)
    • ibs=size : 一次读size个byte
    • obs=size : 一次写size个byte
    • cbs=size : 一次转化size个byte
    • skip=blocks : 从开头忽略blocks个ibs大小的块
    • seek=blocks : 从开头忽略blocks个obs大小的块
    • count=n : 只拷贝n个记录
    • conv=conversion[,conversion…] : 用指定的参数转换文件
      • 转换参数
      • ascii : 转换 EBCDIC 为 ASCII
      • ebcdic : 转换 ASCII 为 EBCDIC
      • lcase : 把大写字符转换为小写字符
      • ucase : 把小写字符转换为大写字符
      • nocreat : 不创建输出文件
      • noerror : 出错时不停止
      • notrunc : 不截短输出文件
      • sync : 把每个输入块填充到ibs个字节,不足部分用空(NUL)字 符补齐
  • 示例
[root@localhost /]# echo 1234567890  > f1
[root@localhost /]# echo abcdefgh > f2
[root@localhost /]# dd if=f1 of=f2 bs=1 count=4 skip=2 seek=3
4+0 records in
4+0 records out
4 bytes (4 B) copied, 0.000705302 s, 5.7 kB/s
[root@localhost /]# cat f2
abc3456[root@localhost /]# 
[root@localhost /]# dd if=f1 of=f2 bs=1 count=4 skip=2 seek=3 conv=notrunc
4+0 records in
4+0 records out
4 bytes (4 B) copied, 0.00459552 s, 0.9 kB/s
[root@localhost /]# cat f2
abc3456h
[root@localhost /]# echo abcdefgh >f2
[root@localhost /]# dd if=f1 of=f2 bs=1 count=4 skip=2 seek=3 conv=notrunc
4+0 records in
4+0 records out
4 bytes (4 B) copied, 0.00459552 s, 0.9 kB/s
[root@localhost /]# cat f2
abc3456h
[root@localhost /]# 


#备份MBR  
dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1 
#将本地的/dev/sdx整盘备份到/dev/sdy
dd if=/dev/sdx of=/dev/sdy 
#将/dev/sdx全盘数据备份到指定路径的image文件
dd if=/dev/sdx of=/path/to/image 
#备份/dev/sdx全盘数据,并利用gzip压缩,保存到指定路径 
dd if=/dev/sdx | gzip >/path/to/image.gz 
#将压缩的备份文件恢复到指定盘 
gzip -dc /path/to/image.gz | dd of=/dev/sdx 
#拷贝光盘数据到root文件夹下,并保存为cd.iso文件
dd if=/dev/cdrom of=/root/cd.iso 
#销毁磁盘数据
dd if=/dev/urandom of=/dev/sda1 

4.3 df

  • 语法:df [OPTION]... [FILE]...
  • OPTION
    • -a : 全部文件系统列表
    • -h,–human-readable : 方便阅读方式显示
    • -H : 等于“-h”,但是计算式,1K=1000,而不是1K=1024
    • -i : 显示inode信息
    • -k : 区块为1024字节
    • -l : 只显示本地文件系统
    • -m : 区块为1048576字节
    • –no-sync : 忽略 sync 命令
    • -P : 输出格式为POSIX
    • –sync : 在取得磁盘信息前,先执行sync命令
    • -T,–print-type : 文件系统类型
    • -t,–type
[root@localhost ~]# df -t ext4 -PFilesystem                   1024-blocks    Used Available Capacity Mounted on/dev/mapper/VolGroup-lv_root    17938864 1245060  15775892       8% //dev/sda1                         487652   40462    421590       9% /boot[r
10-04 20:59