设备文件

I/O Ports: I/O设备地址
一切皆文件:open(), read(), write(), close()

  • 设备类型:
    块设备:block,存取单位“块”,磁盘
    字符设备:char,存取单位“字符”,键盘
  • 设备文件:关联至一个设备驱动程序,进而能够跟与之对应硬件设备进行通信
  • 设备号码:
    主设备号:major number, 标识设备类型
    次设备号:minor number, 标识同一类型下的不同设备(编号)
    注意:这个设备编码就是用ll查看设备文件时显示在设备文件大小的那两个数字
    早期centos中的IDE接口硬盘设备文件名为 /dev/hda,hdb,hdc. 从centos6开始都用/dev/sda,sdb,sdc 不区分硬盘接口类型了。

设备文件一些相关概念

  • 磁盘设备的设备文件命名:/dev/DEV_FILE
    SCSI, SATA, SAS, IDE,USB: /dev/sd
  • 虚拟磁盘:/dev/vd 、 /dev/xvd
  • 不同磁盘标识:a-z,aa,ab…
    /dev/sda, /dev/sdb, ...
  • 同一设备上的不同分区:1,2, ...
    /dev/sda1, /dev/sda5
  • 硬盘存储术语
    head:磁头
    track:磁道
    cylinder:柱面,柱面数量即为磁道的数量
    sector:扇区,512bytes(512B)
    盘面:一个盘的两个面之一,一个盘上下两个盘面,磁头数即为盘面的数量

磁盘寻址格式CHS和LBA

光盘工艺分类:

  • 早期CHS分类的光盘就是每个磁道相同扇区,导致内圈小,外圈大。磁盘的整体性能受限于最内圈的技术限制,同时外圈利用率很低。
  • 后来的ZBR(Zoned Bit Recording)的磁盘扇区制造格式,将每个磁道的扇区制作数量不同,外圈多内圈少,不分磁道,柱面(磁头)等等,直接从扇区0开始指定某个扇区即可。

CHS

采用24bit位寻址
其中前10位表示cylinder,中间8位表示head,后面6位表示sector
最大寻址空间8GB

  • 计算方式:2^6*2^10*512B*2^8/1024/1024/1024=8GB
  • 注意寻址是从0开始的,比如8位的磁头数量是0-255,不是1-256.
  • 一个柱面的大小:2^6*512B*2^8/1024/1024=8MB

LBA(logical block addressing)

LBA是一个整数,通过转换成CHS格式完成磁盘具体寻址
ATA-1规范中定义了28位寻址模式,以每扇区512位组来计算,ATA-1所定义的28位LBA上限达到128 GiB(2^28*512/1024/1024/1024
=128)。2002年ATA-6规范采用48位LBA,同样以每扇区512位组计算容量上限可达128 Petabytes
由于CHS寻址方式的寻址空间在大概8GB以内,所以在磁盘容量小于大概8GB时,可以使用CHS寻址方式或是LBA寻址方式;在磁盘容量大于8GB时,则只能使用LBA寻址方式

  • 注意目前都是用的LBA寻址方式,硬盘也早以都是按照不同磁道不同扇区数量格式制作的了。后面的MBR分区格式的LBA为32位,最大一个分区支持2TB。

Centos6上是fdisk按照柱面分区起始点和结束点,Centos7上按照ZBR格式直接以扇区分起始点结束点,注意差别(centos5早期的划分都是按照整柱面来分区,必须最小8M来分区,centos6开始可以无需必须在柱面边界分区了)

  • 注意fdisk -l中的blocks下面的数字的单位都是1KB,不论是6还是7版本。

磁盘管理

使用分区空间

  1. 设备识别
  2. 设备分区
  3. 创建文件系统
  4. 标记文件系统(标识此分区用于做什么)
  5. 在/etc/fstab文件中创建条目(开机挂载)
  6. 挂载新的文件系统

为什么分区

  1. 优化I/O性能
  2. 实现磁盘空间配额限制
  3. 提高修复速度
  4. 隔离系统和程序
  5. 安装多个OS
  6. 采用不同文件系统

分区

两种分区方式:MBR,GPT

  • MBR: Master Boot Record,1982年,使用32位表示扇区数,分区不超过2T
    如何分区:按分区表里的起始结束位置来分区。(注意单个硬盘不能大于2T不然不支持)
    0磁道0扇区:512bytes
    446bytes: boot loader
    64bytes:分区表,其中每16bytes标识一个分区
    2bytes: 55AA
  • MBR分区中一块硬盘最多有4个主分区,也可以3主分区+1扩展(N个逻辑分区)
  • 分区表在0扇区,他不是一个文件,就是0扇区里面存储的从447位byte开始到510位byte结束的数据,注意一个byte就是一个8位二进制数8bit。
  • 如果想要查看它,可把/dev/sda当做文件,看它前面的512字节即可
    命令为 hexdump -C -n 512 /dev/sda

image


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

  1. 主引导程序(偏移地址0000H--0088H),它负责从活动分区中装载,并运行
    系统引导程序
    地址:0-136共137个字节
  2. 出错信息数据区,偏移地址0089H--00E1H为出错信息,00E2H--01BDH全为
    0字节
    地址:(137-225)(226-445)前面地址一共446字节,注意从0开始的。
  3. 分区表(DPT,Disk Partition Table)含4个分区项,偏移地址01BEH--01FDH,
    每个分区表项长16个字节,共64字节为分区项1、分区项2、分区项3、分区项4
  4. 结束标志字,偏移地址01FE--01FF的2个字节值为结束标志55AA

GPT分区

GPT全局唯一标识磁盘分区表:GUID(Globals Unique Identifiers) partition table 支持128个分区
使用64位,支持8Z( 512Byte/block )64Z ( 4096Byte/block)
使用128位UUID(Universally Unique Identifier) 表示磁盘和分区 GPT分区表
自动备份在头和尾两份,并有CRC校验位
UEFI (统一扩展固件接口)硬件支持GPT,使操作系统启动

注意:GUID是32位的16进制,是微软用来实现UUID标准而创立的,它是目前最通用的一种UUID。而UUID通用唯一识别码是一种软件建构的标准,用它代表一个设备编号,最大就是2^128,基本上不会出现相同的两个UUID,注意它俩一个是标准,一个是真正的实现,有细微差别。同时也要注意它俩和GPT并不是同一类别的概念,别混淆。


image


BIOS对应引导启动MBR分区格式硬盘

UEFI对应引导启动GPT分区格式硬盘

管理分区

列出块设备

lsblk

创建分区使用:

fdisk 创建MBR分区
gdisk 创建GPT分区
parted 高级分区操作

重新设置内存中的内核分区表版本

partprobe (Centos7)

parted命令

parted的操作都是实时生效的,小心使用

用法:parted [选项]... [设备 [命令 [参数]...]...]

parted /dev/sdb mklabel gpt|msdos :

  • 制作分区表,但并没有真正分区,只是说先预留格式,比空硬盘(数据全是0)多了前面的分区表头的格式。
    parted /dev/sdb print
  • 打印分区的信息
    parted /dev/sdb mkpart primary 1 200 (默认单位M)
  • 上面的命令分出来199M的一个主分区 ,可以继续分 不过起始位置就要改为201了。
    parted /dev/sdb rm 1
  • 删除对应硬盘对应编号的分区
    parted –l
  • 列出所有硬盘分区信息

parted注意点:

  1. parted可以交互式,直接输入parted然后回车即可,然后输入help可以查询帮助。也可以按照上面的命令非交互式进行分区。
  2. 注意分区的时候一定要连续分区,不能多个位置分成一个分区,也不能两个分区有重叠部分
  3. MBR格式,一个硬盘的主分区如果删除也不会影响其他主分区的编号,但是逻辑分区如果删除掉一个,则所有的编号会往前移动一个(原因就和MBR逻辑分区的寻址方式有关,一个指向下一个,所以必须从逻辑分区的第一个开始到最后)
  4. 注意parted立即生效,因此有风险,少用。
  5. 注意,分区方式只有两种 GPT和MBR,两种方式不能相互转换,转换的话所有的文件就会丢失(用mklabel命令)。分区方式和文件格式(比如fat32,ntfs,ext4,xfs等等)是两个概念,先分区,再在分区上创建文件格式,别搞混淆。

fdisk(gdisk) 命令

(gdisk /dev/sdb 类fdisk 的GPT分区工具)
fdisk -l [-u] [device...] 查看分区
fdisk /dev/sdb 管理分区(交互式)
子命令:
p 分区列表
t 更改分区类型
n 创建新分区
d 删除分区
v 校验分区
u 转换单位
w 保存并退出
q 不保存并退出

同步分区表

  • 查看内核是否已经识别新的分区
    cat /proc/partations
  • 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]

注意点:

  1. fdisk虽然能支持gpt的查看等,但最好不要用它创建GPT格式分区(fdisk g命令),用gdisk命令更加适用。
  2. 分区的时候只分扩展分区也是可以的,不过就不能装系统(活动分区必须用主分区来做,用来引导启动系统,只能有一个活动分区)
  3. 如果分区的时候,两个分区中间的扇区不连贯,留下了部分没有用 的分区,则下次再分区的时候如果用默认的起始扇区会掉入两个分区中间的夹缝中,需要注意。
  4. 注意分到第四个分区(假如前面都是主分区)时,选择扩展分区,然后剩下的容量全部分给它才好。(不然剩下的部分就无法使用了),然后这时候再分的逻辑分区才会在扩展分区内分,才可以使用(扩展分区无法直接使用)
  5. 删除逻辑分区则其他逻辑分区的编号会往前移,不会出现跳跃的情况。删除主分区,主分区的编号不会变。如果删除扩展分区,则所有的逻辑分区都会消掉。
  6. 因为5的原因,描述设备名(尤其是逻辑分区)最好不要用分区名/dev/sdb7等方式
  7. fdisk的操作都在内存里,只有w退出才开始真正分区。退出后可以用下面几个命令查看分区是否完成:
    lsblk
    ll /dev/sdb*
    cat /proc/patririons
    fdisk -l /dev/sdb
    • 但是注意,前面3个命令都是查看内存中读入到的硬盘分区信息,最后一个命令才是真正读硬盘上的分区表(第0个扇区,mbr格式)的信息,有时候会不同步。
    • 就比如继续分机器中已经有的老硬盘的未分区的部分(或者是删除分区),则w退出后则前3个命令和最后一个不同步。
    • centos7里面用partprobe命令即可同步,centos6里面如果是新分出老硬盘的分区,用partx -a /dev/sda命令同步;如果是删除掉老硬盘的分区,则用patrx -d --nr 6-7 /dev/sda 命令。(其中6-7代表被删除的分区编号)
    • 更多关于partx命令参考man帮助,很详细,此命令就是为了把硬盘信息同步到内核内存中的。
  8. 如果创建其他用法的分区(centos7创建分区默认都是83),最好用t选项修改标签来注明,虽然不修改也不影响使用,但注明标签的好习惯最好养成。
  9. 注意fdisk后面如果跟的是一个分区而不是硬盘,则进行操作的时候虽然也不报错,但这是错误的行为,设备名也会有问题,注意不要这样使用。
  10. 注意gdisk使用的时候不要用它来管理MBR分区格式的硬盘,不然会进行转换而导致数据丢失。

文件系统

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

Linux文件系统(可用lsblk -f或blkid命令查看):
ext2(Extended file system) :适用于那些分区容量不是太大,更新也不频繁的情况,
例如 /boot 分区
ext3:是 ext2 的改进版本,其支持日志功能,能够帮助系统从非正常关机导致的异常中恢复。它通常被用作通用的文件系统
ext4:是 ext 文件系统的最新版。提供了很多新的特性,包括纳秒级时间戳、创建和使用巨型文件(16TB)、最大1EB的文件系统,以及速度的提升
xfs:SGI,支持最大8EB的文件系统
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:未经处理或者未经格式化产生的文件系统,就是分区之后不创建文件系统,直接0101来进行数据存储。有时候会使用这种方式(比如数据库,大量多次读写操作,为了提升效率会直接不分系统直接写,当然也会有管理的方式)

linux文件系统分类

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

创建文件系统(格式化)

mkfs命令:

  1. mkfs.FS_TYPE /dev/DEVICE
    ext4
    xfs
    btrfs
    vfat
  2. mkfs -t FS_TYPE /dev/DEVICE
    -L 'LABEL' 设定卷标,类似windows中的本地磁盘这些注释信息。

创建ext文件系统

mke2fs:ext系列文件系统专用管理工具(此命令基本上被mkfs淘汰)

-t {ext2|ext3|ext4} 指定文件系统类型,不加的话默认为ext2
-b {1024|2048|4096} 指定块大小
-L ‘LABEL’ 设置卷标
-j 相当于 -t ext3
例如:mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3
-i # 指定(根据分区空间的总大小来判断)每多少个字节则创建一个inode;这个#的大小不应该小于block大小,(相当于根据分区大小间接指定了inode的数量)

  • 如果#小于block大小,则inode数量比这个分区可容纳的文件的数量(假如都是小文件,则一个block存储一个)还要多,不合理。
    -N # 指定分区中创建多少个inode
    -I 一个inode记录占用的磁盘空间大小,128---4096 ,默认为256字节
    -m # 默认5%,为管理人员预留空间占总空间的百分比,直接跟数字不用加百分号%
    -O FEATURE[,...] 启用指定特性
    -O ^FEATURE 关闭指定特性

文件系统标签

它是指向设备的另一种方法与设备无关

  • blkid:块设备属性信息查看
    blkid [OPTION]... [DEVICE]
    -U UUID 根据指定的UUID来查找对应的设备
    -L LABEL 根据指定的LABEL来查找对应的设备
  • e2label:管理ext系列文件系统的LABEL
    e2label DEVICE [LABEL]
  • findfs :查找分区
    findfs [options] LABEL=<label>
    findfs [options] UUID=<uuid>
    例子:查找挂载的文件夹/data对应的设备名:
17:50[root@centos7 ~]# sed -nr '/\/data/s/^.*=([^[:space:]]+).*/\1/p' /etc/fstab |xargs blkid -U
/dev/sda3

tune2fs

  • tune2fs:重新设定ext系列文件系统可调整参数的值
    -l 查看指定文件系统超级块信息;super block
    -L 'LABEL’ 修改卷标
    -m # 修改预留给管理员的空间百分比,后面的数字不需要加百分号%
    -j 将ext2升级为ext3
    -O 文件系统属性启用或禁用, –O ^has_journal
    -o 调整文件系统的默认挂载选项,–o ^acl
    -U UUID 修改UUID号
  • dumpe2fs:
    将磁盘块分组管理
    -h:查看超级块信息,不显示分组信息,等价于tune2fs -l

文件系统超级块和节点表等元数据存放方式


image


文件系统检测和修复

常发生于死机或者非正常关机之后
挂载为文件系统标记为“no clean”
注意:一定不要在挂载状态下修复

  • fsck: File System Check,这个命令使用时会自动识别文件系统,然后间接调用fsck.FS_TYPE命令来执行,可以用tab键补全查看所有的命令。
    fsck.FS_TYPE
    fsck -t FS_TYPE
    -p 自动修复错误
    -r 交互式修复错误
    FS_TYPE 一定要与分区上已经文件类型相同
  • e2fsck:ext系列文件专用的检测修复工具
    -y 自动回答为yes
    -f 强制修复

注意点:

  1. ext2不支持日志功能,之后的版本都支持。日志功能写入的时候是先写入日志中,然后再写入硬盘中真正的文件保存的地方进行修改,这样可以避免直接写入文件时掉电损坏文件的风险。这样的坏处就是占用更多的硬盘空间。
  2. 分布式文件系统就是把一个文件先进行分块,分成小份,然后将每块存到不同的服务器中,同时每一块也会多存几份(至少3份)到其他服务器中进行备份,但并不是存到所有的服务器里面,而是按照一定规则存到几个服务器里,这样既存储同时又进行了备份,也没占用特别大的空间
  3. linux中的命令在不同的文件系统都可以使用,是因为它运行在虚拟层(虚拟文件系统层)。这种思想在很多地方都会用到,比如java的多系统使用就是因为有java虚拟机。但有些文件系统有特定的命令,这些命令就不能通用了。
  4. 只要对分区创建了文件系统,(vfat等太旧的文件系统没有)则系统就会随机对其分配一个UUID(注意和GUID的区别,GUID是微软用来实现UUID创立的,上面有介绍,更详细的请查看其他资料),分配之后除非重新创建文件系统或者特意修改,它基本上就不会改变,也不会重复。这在集群式计算机中非常有用。
  5. 卷标可以创建的时候加上也可以不加,如果加上的话最好写上挂载目录信息。
  6. 文件系统block块代表存储文件最小的一个单位,一个文件可以多个占用多个块,但是它的最后的数据如果不到一块也会占用一块,因此如果分区要存储的文件都是小文件最好不要把块设置的过大,不然浪费空间(一个小文件占一个块,块内其他空间都浪费掉了)
  7. tune2fs -l /dev/sda1查看ext文件系统格式的分区时,注意到acl挂载。centos7上新创建的分区自动就会挂载acl功能,但是centos6上不会自动挂载acl功能,要用tune2fs -o acl /dev/sda6 给它加上,要是想要取消则加一个^符号,即为tune2fs -o ^acl /dev/sda6.
    但设置之后同时必须要重新挂载这个分区,才能真正使用acl功能。(利用unmount 和 mount命令重新挂在一次即可,其实原因就是因为tune2fs它修改的是dumpe2fs或者tune2fs -l中的默认挂载选项(Default mount options),必须重新挂载。如果没有挂载也没有acl的时候,也可用后面的 mount 设备 挂载点 -o acl 一条命令可直接挂上并修改)
  8. tune2fs -l /dev/sdb2 里面显示的filesystem state=clean 表示文件系统正常。
    若破坏文件系统:dd if=/dev/zero of=/dev/sdb2 bs=1M count=10 ,则 tune2fs -l /dev/sdb2 无法显示(因为文件系统类似分区,也有节点表等等信息,被破坏无法识别和判断了)。
    它会报出Bad magic number等字样,这个magic number就是file命令查看文件类型时用来判断文件的标识信息,它就在文件头部,因为被破坏了,所以显示这个样的结果。
    如果想要修复这个问题,要么重新格式化(会删除所有数据),要么用fsck /dev/sdb2 (后面可加上-y) 命令修复
    但需要注意fsck命令修复之前必须要取消挂载,以免其他用户或者程序仍在访问它
    • 注意fsck命令这种修复不能确保里面文件不丢失,仅仅能确保里面除了刚才那10M覆盖内容之外的部分可以被修复。
  9. 超级块的查看可以用dumpe2fs /dev/sdb2 (注意只能是ext格式,只要带有e2fs的都是只能支持ext格式的分区,xfs的命令用xfs的特定命令查看,可以输入xfs用tab按键补全,比如xfs_info命令)

挂载

挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为
卸载:为解除此关联关系的过程
把设备关联挂载点:mount Point
mount
卸载时:可使用设备,也可以使用挂载
umount 设备名|挂载点

  • 注意挂载点下原有文件在挂载完成后会被临时隐藏
  • 挂载点目录一般为空

用mount命令挂载文件系统

挂载方法:mount DEVICE MOUNT_POINT
mount(只输入mount):通过查看/etc/mtab文件显示当前已挂载的所有设备
mount [-fnrsvw] [-t vfstype] [-o options] device dir
device:指明要挂载的设备;
(1) 设备文件:例如/dev/sda5
(2) 卷标:-L 'LABEL', 例如 -L 'MYDATA'
(3) UUID, -U 'UUID':例如 -U '0c50523c-43f1-45e7-85c0-a126711d406e'
(4) 伪文件系统名称:proc, sysfs, devtmpfs, configfs
dir:挂载点
挂载点要事先存在,建议新创建目录,然后使用这个空目录
进程正在使用中的设备无法被卸载

mount常用命令选项

-t vsftype 指定要挂载的设备上的文件系统类型
-r readonly,只读挂载,即使root账号也无法更改里面的文件
-w read and write, 读写挂载
-n 不更新/etc/mtab,mount不可见
-a 自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中有auto功能,其中defaults默认选项包含有auto功能)
-L 'LABEL' 以卷标指定挂载设备
-U 'UUID' 以UUID指定要挂载的设备
-B, --bind 绑定目录到另一个目录上(相当于目录挂载到目录上,它不是软链接,也不是硬链接

  • 查看内核追踪到的已挂载的所有设备
    cat /proc/mounts (cat /etc/mtab)

-o中的选项

-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设备
defaults:相当于rw, suid, dev, exec, auto, nouser, async

卸载命令

查看挂载情况

findmnt MOUNT_POINT|device : 这个既可以查看设备又可以查看挂载点,可以根据echo $? 判断是否挂载有文件

查看正在访问指定文件系统的进程

lsof MOUNT_POINT
fuser -v MOUNT_POINT

终止所有在正访问指定的文件系统的进程

fuser -km MOUNT_POINT

卸载

umount DEVICE
umount MOUNT_POINT

注意点:

  1. 注意挂在前先创建分区,然后创建文件系统格式,然后再挂载(包括写入fstab),这三步。
  2. 挂载的时候如果挂载点目录不是空的,则里面包含的文件会被隐藏,就相当于暂时找不到这些文件但是空间仍然被占用了,因此不要挂载到非空目录上,要挂载到新建的空目录上。
  3. 一个设备可以挂载到多个挂载点目录上,每个目录都可访问里面的内容也都可以修改。但是多个设备不能挂载到一个挂载点目录上,如果这样做的话,最新的挂载设备会覆盖掉上一个挂载设备的挂载信息。(取消这个挂载之后之前挂载的设备就会重新显示出来)
  4. 卸载挂载点的时候,如果有用户或者进程正在访问这个挂载点内文件,则无法卸载,可以用fuser -km mount_point 命令踢出所有占用的用户或进程,然后再取消挂载。
    当然比较和谐的方式有1.wall广播(不过是全部广播了) 2.echo "please do not occupy dirname" > /dev/pts(tty)/#
  5. 挂载最好用UUID,不要用设备名,卷标等
  6. 只读挂载即使root账号也无法修改挂载后设备内文件内容。
  7. -n 选项在centos7中,用mount命令仍然可以看到挂在信息,因为mount命令看的实际上是/etc/mtab文件中的内容,它指向了/proc/self/mounts(/proc/mounts也指向它)
    但是在centos6中,则无法看到了,其mount命令看的就是/etc/mtab文件,而-n选项让挂载信息不更新进去,因此看不到,但如果用cat /proc/mounts 仍然可以看到挂载信息。
Centos7:
19:37[root@centos7 ~]# ll /etc/mtab /proc/mounts
lrwxrwxrwx. 1 root root 17 Mar 22 15:36 /etc/mtab -> /proc/self/mounts
lrwxrwxrwx  1 root root 11 Mar 26 19:40 /proc/mounts -> self/mounts
Centos6:
19:40[root@Centos6 ~]# ll /etc/mtab /proc/mounts
-rw-r--r--. 1 root root 488 Mar 26 19:40 /etc/mtab
lrwxrwxrwx. 1 root root  11 Mar 26 19:41 /proc/mounts -> self/mounts
  1. -B --bind选项如上所写,既不是软链接也不是硬链接,但就是同一个目录,挂载后mount命令中显示的挂载信息是设备挂载,但实际上就是文件夹挂载。
  2. 一个硬盘即使不分区,也可以直接在上面创建文件系统,然后挂载使用,(跳过分区的步骤).这样的话相当于整个硬盘一个大分区,但实际上用hexdump -C -n 512命令可以看到它并没有分区表格式,因此还不能完全把它当做一个大分区来理解。
  3. 如果硬盘全满也没有办法增加新的硬盘了,同时硬盘也全部分区完毕了。此时需要新的文件系统(比如swap等等)那把一个文件当做一个分区对它创建文件系统(centos6虽然支持xfs,但是没有管理工具,可以用yum install xfs安装)也是可以的。比如:
19:53[root@centos7 ~]# dd if=/dev/zero of=/data/bigfileDisk bs=1M count=300
300+0 records in
300+0 records out
314572800 bytes (315 MB) copied, 0.428576 s, 734 MB/s
19:53[root@centos7 ~]# file /data/bigfileDisk 
/data/bigfileDisk: data
19:54[root@centos7 ~]# mkfs.ext4 /data/bigfileDisk 
mke2fs 1.42.9 (28-Dec-2013)
/data/bigfileDisk is not a block special device.
Proceed anyway? (y,n) y
………………………………
blkid无法直接查看,加上路径之后可以查看
19:57[root@centos7 ~]# blkid /data/bigfileDisk
/data/bigfileDisk: UUID="1f212236-8241-4903-950b-6a03d4d82448" TYPE="ext4" 
20:00[root@centos7 /data]# mkdir /mnt/bigfileDisk
20:01[root@centos7 /data]# mount bigfileDisk /mnt/bigfileDisk/
20:01[root@centos7 /data]# df(或者df /dev/loop0)
………………………………
/dev/sr0        10491772 10491772         0 100% /run/media/root/CentOS 7 x86_64
/dev/loop0        289285     2062    267767   1% /mnt/bigfileDisk
20:04[root@centos7 /data]# lsblk (或者lsblk /dev/loop0)
NAME  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
………………………………
loop0   7:0    0  300M  0 loop /mnt/bigfileDisk
20:04[root@centos7 /data]# losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         1  0 /data/bigfileDisk
20:09[root@centos7 /data]# losetup -a
/dev/loop0: [2051]:89185 (/data/bigfileDisk)
  • 注意创建之后无法用blkid来查看它,因为他不是一个blk文件,但可以blkid加上路径之后查看,然后就可以创建新的空文件夹,将其进行挂载。(挂载之前没有loop将其对应,因此无法用df直接显示)
  • 注意centos7可以直接挂载,但是centos6上必须用mount -o loop 设备名(其实是文件名) 挂载点 的方式才可挂载。
  • 挂载之后loop自动对应了文件,此时便可以用df查看,df查看结果会用/dev/loop#的方式代表这个文件,同时也可用lsblk命令看到loop#。但是centos6里面用df命令仍然看不到loop的标识,它显示的就是这个文件本身挂载到文件夹上。
  • 用losetup [-a] 选项可以看到loop设备和对应的文件(6和7都可以,但是6里面必须加上-a)
  • 注意7上面每使用一个loop它都会自动创建一个新的,而6上面默认一开始只有8个loop设备。
Centos6:
19:41[root@Centos6 ~]# ll /dev/loop*
brw-rw----. 1 root disk 7, 0 Mar 26 19:39 /dev/loop0
brw-rw----. 1 root disk 7, 1 Mar 26 19:39 /dev/loop1
brw-rw----. 1 root disk 7, 2 Mar 26 19:39 /dev/loop2
brw-rw----. 1 root disk 7, 3 Mar 26 19:39 /dev/loop3
brw-rw----. 1 root disk 7, 4 Mar 26 19:39 /dev/loop4
brw-rw----. 1 root disk 7, 5 Mar 26 19:39 /dev/loop5
brw-rw----. 1 root disk 7, 6 Mar 26 19:39 /dev/loop6
brw-rw----. 1 root disk 7, 7 Mar 26 19:39 /dev/loop7
Centos7:
20:31[root@centos7 /data]# ll /dev/loop*
brw-rw---- 1 root disk  7,   0 Mar 26 20:01 /dev/loop0
crw-rw---- 1 root disk 10, 237 Mar 26 20:01 /dev/loop-control
  • 我们可以用losetup /dev/loop# /data/bigfiletest2 的命令让它手动对应关联loop设备到文件,然后挂载的时候就可以用mount /dev/loop# /mnt/mntbigfiletest2 的命令方式挂载了,不再需要mount -o loop,(也可以直接mkfs.ext4 /dev/loop# 对其进行分区,就相当于是用 /dev/loop#指代了之前的那个文件) 挂载后则6中此时也可以用df命令看到这个文件对应的loop标识而不是文件本身了。
  • 6中默认只有8个loop,可以用mknod /dev/loop100 b 7 8的命令来创建新的loop设备。其中100自己写,7(文件类型)不能更改,8(同一个文件类型编号)可以更改。rm -f /dev/loop100 可以直接删除这个文件,取消关联则要难过losetup -d /dev/loop#。
  • 6中也可更改 /boot/grub/grub.conf 中加入 max loop=200 修改启动设置,直接启动创建200个设备。此时需要重启生效。

  • 文件挂载到空目录之后便可以把挂载点/mnt/bigfileDisk 当做一个硬盘挂载点来使用各种命令,如果需要拷贝里面的文件则只需要拷贝这个文件即可。但是需要注意拷贝完文件到其它主机上需要将它重新挂载之后才能查看里面的内容(就相当于把它模拟成一个硬盘,或者当作一个U盘使用)
  • 这就是属于虚拟化技术,VMware的硬盘模拟也是按照这种方式把文件模拟成硬盘使用,不过它是有格式的,上面的例子里创建文件的数据都是0,就相当于raw格式(没有格式)。
  1. du /dir -sh 可以显示dir文件夹内所有文件的大小总和,df /dir 则可以看到dir里面所占数据(它应该比du的要大,因为df还包含更多其他数据,比如元数据,节点表等等)
    • 如果用dd if=/dev/zero of=/data/bigfile bs=1M count=100 seek=20480,则ll显示为21G,du和df都仍然显示100M,这也称为空洞文件或者稀疏文件
    • 用ll命令看到的是逻辑大小,用du df看到的则是实际大小。
20:23[root@centos7 /data]# dd if=/dev/zero of=/data/bigfile bs=1M count=100 seek=20480
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.127369 s, 823 MB/s
20:23[root@centos7 /data]# ll bigfile -h
-rw-r--r-- 1 root root 21G Mar 26 20:23 bigfile  
20:24[root@centos7 /data]# df /data/ -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        50G  280M   50G   1% /data   
20:24[root@centos7 /data]# du bigfile -h
100M    bigfile
  1. mount -o ro,remount /dev/sdb1 (或者 /mnt/sdb1,两个任何中任何写一个即可) :重新挂载并修改为只读(注意修改挂载选项只会修改这一项,不会覆盖掉其他项)

    • 只要修改挂载选项都要重新挂载,要么两个命令先卸载,再挂载。要么一个命令直接remount
    • relatime选项会在:1.距离最新读取的时间一天以上,它会更新读的时间。2.或者说修改时间比读的时间还要新,则再次读的时候它会更新
    • noatime可以关闭更新文件读时间,可以减少系统负载
    • async异步模式更改数据的时候是先放入buffer缓冲区中,过一段时间再真正写入硬盘空间中。这样可以提高写的速率,但有丢失数据的风险(断电等故障)
    • 挂载的时候-o 命令就是修改Default mount options里面的挂载选项,可以直接加上acl(查看前面的tune2fs注意点),也可以用多个选项然后remount的命令修改选项。
  2. 可以修改label的命令:
    mkfs -L 卷标 设备
    mke2fs -L 卷标 设备
    e2label 设备 卷标
    tune2fs -L 卷标 设备
    更多想起来再补充~

挂载点和/etc/fstab

配置文件系统体系
被mount、 fsck和其它程序使用
系统重启时保留文件系统体系
可以在设备栏使用文件系统卷标
使用mount -a 命令挂载/etc/fstab中的所有文件系统

文件挂载配置文件

/etc/fstab每行定义一个要挂载的文件系统

  1. 要挂载的设备或伪文件系统
    设备文件(直接写设备名比如 /dev/sdb2)
    LABEL:LABEL=""
    UUID:UUID=""
    伪文件系统名称:proc, sysfs
  2. 挂载点
  3. 文件系统类型:ext4,xfs,iso9660,nfs,none
  4. 挂载选项:defaults ,acl,bind(文件夹) ,loop(文件挂载)
  5. 转储频率:0:不做备份 1:每天转储 2:每隔一天转储
  6. fsck检查的文件系统的顺序:允许的数字是0 1 2
    0:不自检
    1:首先自检;一般只有rootfs才用
    2:非rootfs使用

注意点

  1. 挂载时候的名称最好用UUID避免删除硬件后其设备名发生改变引起错误。xfs文件格式的分区挂载点根目录下没有lost+found,ext系列文件格式挂载点根目录下有这个文件夹,就是为了当发生错误时里面的文件无法找到自己所在位置时将其放入lost+found文件夹内。
  2. 注意挂载选项中就算不写defaults,写上其他的选项,但是挂载的时候也同样会有defaults里包含的选项,除非写的其它选项正好对应defaults里的选项将其修改了,就比如前面的 mount -o 选项,remount 设备 命令类似, 这个是追加并不是覆盖,不是说写了选项则就只有选项的内容了,还包括有defaults里面的内容。除非追加的内容修改了defaults里的选项会把默认选项相对应的那一项给改掉,其他的仍然不变。
  3. 在/etc/fstab 里面新增加的挂载选项,用 mount -a 则可以让它生效挂载上(前提是支持auto选项)。但是如果修改一个已经挂载过的设备的选项的话,用mount -a命令则无效了 ,此时要么用取消再重新挂载两个命令,要么用mount -o remount 设备|挂载点 一条命令。
  4. 修复信息
    • Centos6: 如果fstab里面的信息有错误,则centos6启动时会报错,修复它需要输入root账户的密码,然后将fstab里面的错误的那一行最后一位检测改为0,即忽略错误检测(或者已知哪一行错误,把它注释掉,或者将其错误的部分改为正确的。这3种方式均可),但是需要注意,此时挂载的根目录是只读的(虽然mount显示的是rw),因此需要重新挂载根设备mount -o remount,rw / ,然后才能修改fstab。修改之后reboot即可。(如果用修改最后一位为0的方式,一定要进入系统之后修改这一行fstab为正确的,不能以后每次开机仍然错着它,仅仅只是将它忽略开机,这种做法不可取)
    • Centos7:同理,开机的时候先按esc按键取消图形界面遮挡,可以看到也是出现错误,但需要等待1分30秒它检测是否能够跳过这个错误,然后输入密码和上面的步骤一样了。(此时7里面已经挂载的硬盘是rw挂载,不需要像6中一样要重新挂载)注意这里只能用注释错误行或者将错误地方改为正确两种方法,最后一位改为0下次开机并不能忽略检测。
  5. /etc/fstab特殊文件永久(开机)挂载
    • 挂载分区(装好文件系统)
    • 硬盘(不分区但装好文件系统)
    • 硬盘(不分区也不装文件系统,直接二进制0101来用,此时只能用设备名挂载方式),- 挂载文件(全是0的二进制raw格式文件装好文件系统之后,上面有介绍)
    • 目录的挂载(bind)
    • (非本地)远程共享目录或者文件的挂载(之后再详细更新接介绍)
    • ISO光盘格式文件的挂载(附加知识点:可以直接cp原始安装光盘挂载的目录到硬盘,新命名文件写上iso后缀,这样就相当于创建一个ISO文件,比如cp /dev/sr0 /data/centos7.iso,注意拷贝的原文件直接就是/dev/sr0 不是光盘挂载的位置/run/media/####)。此时挂载这个文件时需要注意centos7上相当于隐藏了mount -o loop选项,它会直接再次分配loop#对应这个iso文件进行挂载;centos6上必须写上或者提前手动分配loop。用这种写入fstab的方式挂载iso就可以永久挂载光盘文件到http服务网站上做yum源了。(当然如果之前用的是 软链接ln -s /misc/cd /var/www/html/yumrepertory 这种方式的,就不需要写入fstab了)
    • 注意不论是iso还是bigfileDisk这种都相当于是文件挂载,只是说他们两个的文件系统格式不相同,一个是iso9660,一个是ext4.
    • 文件挂载的特别注意点:挂载普通文件(非光盘iso文件)都是需要用/dev/loop#(回环挂载)将其对应,然后再挂载到目录中的,注意普通文件挂载选项处写defaults即可(也可以加上loop,不加也行7中它会自动分配,6里面必须要加上)
    • 但是(普通文件中的)光盘文件在写入fstab中时可以用UUID的方式挂载,其他普通文件不可以,挂载时必须写文件名,不然无法找到这个文件开机会出错误。
    • 重要建议:是只要是普通文件挂载(普通文件,iso文件,文件当做swap用)都要用文件名的方式挂载,这样就不会开机出现错误了。
      挂载格式例子如下:
首先找依照相关挂载信息各种命令(找把文件当做硬盘的那个文件相关信息):
13:28[root@centos7 ~]# blkid /dev/loop0
/dev/loop0: LABEL="fileDisktt" UUID="1f212236-8241-4903-950b-6a03d4d82448" TYPE="ext4" 
13:28[root@centos7 ~]# findfs /dev/loop0
/dev/loop0
13:29[root@centos7 ~]# findmnt /dev/loop0
TARGET           SOURCE     FSTYPE OPTIONS
/mnt/bigfileDisk /dev/loop0 ext4   rw,relatime,data=ordered
13:29[root@centos7 ~]# losetup -a
/dev/loop0: [2051]:89185 (/data/bigfileDisk)
13:31[root@centos7 ~]# mount 
省略……………………
/data/bigfileDisk on /mnt/bigfileDisk type ext4 (rw,relatime,data=ordered)

然后/etc/fstab里面部分格式参考:
UUID=b846b132-1872-4599-829c-daa681da4d13 swap                    swap    defaults        0 0  #swap分区
/data/bigfileDisk                         /mnt/bigfileDisk        ext4    defaults        0 0  #普通文件挂载做硬盘,选项是defaults,也可写上loop,7中可以不写,6中必须写。经测试注意此时必须用文件名来挂载,不可以用UUID,不然开机无法查询到这个UUID
/boot                                     /mnt/boot               none    bind            0 0  #文件夹挂载到文件夹,此时虽然mount命令中看到的是包含/boot的设备名比如/dev/sda挂载到/mnt/boot下,但实际上就是文件夹挂载到文件上了
/data/centos7.iso                         /mnt/iso                iso9660  loop            0 0  #iso文件做硬盘, 写上loop或者不写都行,因为是光盘,他会被判断为只读挂载 

处理交换文件和分区

  • swap交换分区是系统RAM的补充,Swap 分区支持虚拟内存。当没有足够的RAM 保存系统处理的数据时会将数据写入 swap 分区
  • 当系统缺乏 swap 空间时,内核会因 RAM 内存耗尽而终止进程。配置过多swap 空间会造成存储设备处于分配状态但闲置,造成浪费,过多 swap 空间还会掩盖内存泄露

    推荐系统 swap 空间

    系统中的RAM量 推荐的swap空间 允许休眠的swap空间 建议大小
    低于2GB RAM量的两倍 RAM量的三倍
    2GB-8GB 等于RAM量 RAM量的两倍
    8GB-64GB 4GB到RAM量的0.5倍 RAM凉的1.5倍
    超过64GB 独立负载(至少4GB) 不建议使用休眠功能

    注意大内存可以自己设定swap分区,不一定非得按照表格建议

挂载交换分区

基本设置包括:

  1. 创建交换分区或者文件(把文件当做swap来使用)
  2. 使用mkswap写入特殊签名(或者用MBR的fdisk中t选项更改标签,注意GTP的gdisk分区方式标签不一样)
  3. 在/etc/fstab文件中添加适当的条目,使其开机挂载
  4. 使用swapon -a 激活交换空间(立即启动swap分区)

启用:swapon

swapon [OPTION]... [DEVICE]
-a:激活所有的交换分区
-p PRIORITY:指定优先级
/etc/fstab 在第4列中:pri=value

禁用:swapoff [OPTION]... [DEVICE]

SWAP的优先级

  • 可以指定swap分区0到32767的优先级,值越大优先级越高
  • 如果用户没有指定,那么核心会自动给swap指定一个优先级,这个优先级从-1开始,每加入一个新的swap分区,用户并没有指定其优先级的,则会给这个优先级减1
  • 先添加的swap的缺省优先级比较高,除非用户自己指定一个优先级,而用户定的优先级(是正数)永远高于核心缺省指定的优先级(是负数)
  • 优化性能:分布存放,高性能磁盘存放

注意点:

  1. 总体步骤再次总结:创建分区,改标签(不改也行最好改),创建swap文件格式,写入fstab,启动swap分区。
  2. 用free -h 查看内存和swap信息,在centos7中和centos6中有区别,其中的free空间可以将buffer/cache空间拿过来使用,因此6中有第二行显示,7中没有(但7中也是这个原理,buffer和cache不用的时候可以当做free空间用作它用)
  3. 用dd if=/dev/zero of=dev/null bs=6G(大块数据) count=1 可以简单的强行占用所有内存空间测试swap。但是有些大程序如果内存太小运行时会自动关闭。
  4. 最好用高速磁盘(SSD,或者HHD的外圈也就是编号小的扇区或者柱面)来用作swap分区提供更好的性能。
  5. 创建swap文件格式的命令不同于mkfs.FS ,用专有格式化命令mkswap.
  6. 创建好swap分区格式之后,注意它与之前的普通分区挂载稍微有区别。swap挂载的挂载点不是一个空文件夹,在fstab中直接就是swap(前面不加/),后面的类型也是swap。 改完fstab文件后,不重启立即挂载的命令是swapon -a(类似普通文件格式分区挂载mount -a)
UUID=3925deed-69a6-45b7-b44e-1027ab9b7caf swap                    swap    defaults        0 0
  1. cat /proc/swaps 或者swap -s 命令可以更加清楚看到swap来自哪个分区,优先级等信息。因此可以修改swap分区的优先级让更好性能的swap分区优先使用。修改优先级要在fstab中的defaults处加上pri=value用逗号分隔(此时defaults可以不写了)。

    • 但修改完选项仍未生效(和普通分区修改选项一样),此时要重新挂载,可用swapoff /dev/sd*# 禁用之后然后再 swapon -a 或者swapon /dev/sd*#
  2. 如果一个主机即没有多于内存插口也没有多于硬盘插口,但内存不够想要增加Swap分区,则可以用一个文件来做swap分区,操作类似上面的把文件当做普通分区,只不过文件系统格式,fstab设置和挂载命令不同而已。(注意要用想要做swap的这个文件名来挂载,不要用UUID,不然开机无法识别,测试过之后就是这样)例子:
先保证sdc2分区中至少有足够空间装swap文件,将其挂载到一个目录并开机自动挂载(以免这个分区没有挂载则swap文件分区找不到,当然这只是测试用的,实际上直接在根分区或者其他分区设置这个swap文件即可)
dd if=/dev/zero of=/dev/sdc2/swappagefile bs=1M count=2048
mkswap /mnt/dev/sdc2/swappagefile
修改fstab
/mnt/dev/sdc2/swappagefile  swap    swap   defaults 0 0
swapon -a
free -h

注意提示权限安全问题:
11:48[root@centos7 /mnt/dev/sdc2]# swapon -a
swapon: /mnt/dev/sdc2/swappagefile: insecure permissions 0644, 0600 suggested.
  • 注意用文件当做swap方式,有权限的安全问题,最好改成
    chmod 600 /mnt/dev/sdc2/swappagefile,避免普通用户查看文件中内容
  • 不过用文件创建的swap的方式比用分区性能更差。
  • 想要删除此文件创建的swap分区,则先卸载 swapoff /mnt/dev/sdc2/swappagefile ,然后rm删除它即可
  • 同样的其他的swap硬盘类的分区想要删除只需要卸载即可,然后这个硬盘分区就可以重新分区或者格式化用作它用。

移动介质

挂载意味着使外来的文件系统看起来如同是主目录树的一部分
访问前,介质必须被挂载
摘除时,介质必须被卸载
按照默认设置,非根用户只能挂载某些设备(光盘、 DVD、软盘、 USB等等)
挂载点通常在/media 或/mnt下

使用光盘

-在图形环境下自动启动挂载/run/media/< user >/< label > 否则就必须被手工挂载
mount /dev/cdrom /mnt/

  • 操作光盘:
    eject 弹出光盘
    eject -t 弹入光盘
  • 创建ISO文件
    cp /dev/cdrom /root/centos.iso :./dev/cdrom就是软连接到/dev/sr0
    mkisofs -r -o /root/etc.iso /etc :类似于tar ,把/etc下的文件打包成光盘iso文件。
  • 刻录光盘
    wodim –v –eject centos.iso

挂载USB介质

  • 查看USB设备是否识别
    lsusb
  • 被内核探测为SCSI设备
    /dev/sdaX、 /dev/sdbX或类似的设备文件
  • 在图形环境中自动挂载
    图标在[计算机]窗口中创建
    挂载在/run/media/<user>/<label>
  • 手动挂载
    mount /dev/sdb1 /mnt
  • 注意U盘必须是fat格式 NTFS格式不支持

查看文件系统常用的工具

文件系统空间占用等信息的查看工具

df [OPTION]... [FILE]...
-H 以10为单位
-T 文件系统类型
-h human-readable
-i inodes instead of blocks
-P 以Posix兼容的格式输出

查看某目录总体空间占用状态

du [OPTION]... DIR
-h human-readable
-s summary
--max-depth=# 指定最大目录层级

注意点

  1. df只能查看已经挂载上的设备或文件信息
  2. -P用于对应显示,当文件名比较长的时候对齐可用它
  3. 默认du显示当前文件夹内每个文件的大小,以K为单位(注意默认是有单位的),加上-s显示当前文件夹内所有文件大小总和
  4. du -sh /* :看根下面所有文件夹大小
  5. 这两个命令都是显示真实大小,ll显示逻辑大小

工具dd

dd 命令:convert and copy a file

用法:

dd if=/PATH/FROM/SRC of=/PATH/TO/DEST bs=# count=#
if=file 从所命名文件读取而不是从标准输入
of=file 写到所命名的文件而不是到标准输出
ibs=size 一次读size个byte
obs=size 一次写size个byte
bs=size block size, 指定块大小(既是是ibs也是obs)
cbs=size 一次转化size个byte
skip=blocks 从开头忽略blocks个ibs大小的块
seek=blocks 从开头忽略blocks个obs大小的块
count=n 复制n个bs

conv=conversion[,conversion...] 用指定的参数转换文件

转换参数:
ascii 转换 EBCDIC 为 ASCII
ebcdic 转换 ASCII 为 EBCDIC
lcase 把大写字符转换为小写字符
ucase 把小写字符转换为大写字符
nocreat 不创建输出文件
noerror 出错时不停止
notrunc 不截短输出文件
sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐
fdatasync 写完成前,物理写入输出文件

MBR备份

备份MBR

dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1

破坏MBR中的bootloader

dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446
示例:有一个大与2K的二进制文件fileA。现在想从第64个字节位置开始读取,需要读取的大小是128Bytes。又有fileB,想把上面读取到的128Bytes写到第32个字节开始的位置,替换128Bytes,实现如下
dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc

硬盘备份:

dd if=/dev/sdx of=/dev/sdy :将本地的/dev/sdx整盘备份到/dev/sdy
dd if=/dev/sdx of=/path/to/image :将/dev/sdx全盘数据备份到指定路径的image文件
dd if=/dev/sdx | gzip >/path/to/image.gz :备份/dev/sdx全盘数据,并利用gzip压缩,保存到指定路径

恢复:

dd if=/path/to/image of=/dev/sdx :将备份文件恢复到指定盘
gzip -dc /path/to/image.gz | dd of=/dev/sdx :将压缩的备份文件恢复到指定盘

拷贝内存资料到硬盘

dd if=/dev/mem of=/root/mem.bin bs=1024 : 将内存里的数据拷i贝到root目录下的mem.bin文件

从光盘拷贝iso镜像

dd if=/dev/cdrom of=/root/cd.iso : 拷贝光盘数据到root文件夹下,并保存为cd.iso文件

  • 用cp和dd都可以直接创建iso文件

销毁磁盘数据

dd if=/dev/urandom of=/dev/sda1
利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据,执行此操作
以后,/dev/sda1将无法挂载,创建和拷贝操作无法执行

得到最恰当的block size

dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
dd if=/dev/zero of=/root/1Gb.file bs=2048 count=500000
dd if=/dev/zero of=/root/1Gb.file bs=4096 count=250000
通过比较dd指令输出中命令的执行时间,即可确定系统最佳的block size大小

测试硬盘写速度(写入哪就是测那个硬盘,下同)

dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000 conv=fdadasync

测试硬盘读速度

dd if=/root/1Gb.file bs=64k | dd of=/dev/null (它会利用内存,最好每次都清一下内存再测)

  • 这只是简单测试,并不准确

注意点:

  1. 不写count的话,默认是拷贝文件内所有内容。ibs和obs可以让一次性读写的块的大小分别设置不同的数值。
  2. dd if=/dev/zero bs=1 count=200 >/data/testdd 可以直接重定向到一个文件,也可以用of,也可以用管道先压缩然后在重定向到一个文件,比如上面的硬盘备份。
  3. dd默认先写入缓存buffer,等待一段时间后后台再写入文件,用conv=fdatasync可以写入缓存区之后,结束整个命令后直接写入磁盘文件中。可以用这个命令简单测试磁盘速度。
  4. conv=notrunc 选项代表着如果输入文件的字符块数比输入文件字符块数小,则输入到输出文件替换的时候只替换修改的部分(seek之后,seek+count之前),输入文件原本的前后其他部分仍然保留不变。如果不加上这个选项,则输入之后输出文件的被替换部分(seek之后所有的字符块)之后的所有字符块都将被消掉写入输入的字符块内容,不论长短。