磁盘管理

磁盘管理

@(0001学习博客)

1.磁盘的基础知识

1.1机械硬盘(HDD:Hard Disk Drive)

机械硬盘由多块盘片组成,它们都绕着主轴旋转。每块盘片上下方都有读写磁头悬浮在盘片上下方,它们与盘片的距离极小。在每次读写数据时盘片旋转,读写磁头被磁臂控制着不断的移动来读取其中的数据。

所有的盘片都是同时同步转动,所有的磁头也是同步移动。

磁盘在物理上划分了扇区、磁道和柱面。如果划分了分区,则分区是逻辑上柱面的分隔边界。

读写磁头在停止状态下,在盘片旋转时磁头扫过的一圈轨迹称为磁道,所有的磁道都是同心圆。从盘片外圈开始向内数,磁道号从0开始逐数增加。

每个磁道以512字节等分为多个弧段。所以外圈磁道的扇区数较多,内圈磁道的扇区数较少,有些硬盘参数上写的磁道扇区数通常用一个范围来标识,如373-768表示最外圈磁道有768个扇区,最内圈有373个扇区,这就可以计算出每个磁道的字节数。

每个扇区512字节,扇区是磁盘控制器的最小读写单元。

盘片同步旋转,转动一个角度,外圈比内圈的线速度更快,磁头能够扫过的扇区数更多,因此读写越外圈磁道中的数据比越内圈更快。

向磁盘写数据是从外圈柱面向内圈柱面写的,只有写完一个柱面才写下一个柱面。因此磁盘用过一段时间后存储东西的速度会有所减慢就是因为外圈柱面已经用掉了。

1.2分区

分区是为了在逻辑上将某些柱面隔开形成边界。它是以柱面为单位来划分的,首先划分外圈柱面,然后不断向内划分。

由于读写越外圈磁道中的数据比越内圈更快,所以第一个分区在读写性能上比后面的分区更好。在Windows操作系统上,C盘的速度是最快的,越后面的区越慢就是这个原因。

在磁盘数据量非常大的情况下,划分分区的好处是扫描块位图等更快速:不用再扫描整块磁盘的块位图,只需扫描对应分区的块位图。

1.3 MBR分区方法

MBR:主引导记录(Master Boot Record),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区.由于这一扇区承担有不同于磁盘上其他普通存储空间的特殊管理职能,作为管理整个磁盘空间的一个特殊空间,它不属于磁盘上的任何分区,因而分区空间内的格式化命令不能清除主引导记录的任何信息。主引导扇区由三个部分组成(共占用512个字节):

  • 主引导程序即主引导记录(MBR)(bootloader,占446个字节):可在FDISK程序中找到,它用于硬盘启动时将系统控制转给用户指定的并在分区表中登记了的某个操作系统。
  • 磁盘分区表项(DPT,Disk Partition Table):由四个分区表项构成(每个16个字节)。
  • 结束标志(占2个字节):AA55

在Linux中,MBR格式的磁盘主分区号从1-4,扩展分区号从2-4,逻辑分区5+;

MBR最大支持2T(32位表示扇区,2^32*512)。

hexdump  -C  /dev/sda -n512   # 查看sda硬盘的前512个字节
dd  if=/dev/sda    of=/data/MBR_bak    bs=1 count=512    # 备份sda这块银盘的前512字节至/data/MBR_bak文件

1.4 GPT分区

GPT:GUID(Globals Unique Identifiers) partition table 支持128个分区,使用64位,支持8Z( 512Byte/block )64Z ( 4096Byte/block)

2.分区命令:

小技巧: 对于在vmare 下直接添加的硬盘,在不重启机器的情况下通过fdisk -l或lsblk都无法识别刚刚新加的硬盘,我们可以通过这条命令来识别刚刚添加的硬盘;

第一步:
ls  /sys/class/scsi_host/
host0host1host2

第二步:
echo "- - -" >  /sys/class/scsi_host/host0/scan
echo "- - -" >  /sys/class/scsi_host/host1/scan
echo "- - -" >  /sys/class/scsi_host/host2/scan

第三步:
lsblk
fdisk  -l                 # 即可看到刚刚添加的硬盘

2.1 fdisk 针对MBR分区

fdisk - manipulate disk partition table

如果一个存储设备已经分过区,那么它可能是mbr格式的,也可能是gpt格式的,如果已经是mbr格式的,则只能继续使用fdisk进行分区,如果已经是gpt格式的,则只能使用gdisk进行分区。
使用fdisk分区,它只能实现MBR格式的分区
fdisk [选项] device

[root@CentOS7 ~]#fdisk /dev/sda 
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): m                                   # m获取帮助
Command action
   a   toggle a bootable flag                               
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition                                       # 删除分区
   g   create a new empty GPT partition table    # 创建一个新的GPT分区表
   G   create an IRIX (SGI) partition table
   l   list known partition types                          # 罗列各种分区类型(82 代表swap)
   m   print this menu                                        # 显示帮助信息
   n   add a new partition                                  # 添加一个新分区
   o   create a new empty DOS partition table  
   p   print the partition table                           # 显示现有分区信息
   q   quit without saving changes                    # 仅退出,不保存
   s   create a new empty Sun disklabel
   t   change a partition's system id                 # 修改分区id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit                    # 保存并退出
   x   extra functionality (experts only)           # 额外功能(仅限专家)

新建逻辑分区:(同样的操作可新建主分区)

[root@CentOS7 ~]#fdisk /dev/sda 
Command (m for help): n                 # 新建分区
All primary partitions are in use       
Adding logical partition 7    # 此处显示所有的主分区都在使用中,只能添加逻辑分区7
First sector (220209152-419430399, default 220209152): +5G        # 一般直接回车,表示新建的分区从磁盘220209152-419430399哪个data block开始
Partition 7 of type Linux and of size 5 GiB is set
Command (m for help): w
The partition table has been altered!

通过fdisk -l命令查看分区已经建好

分区结束,w保存退出。如果不保存,则按q退出。
因为上面的fdisk操作是在内存中执行的,w保存退出后,系统内核还未识别该分区。
cat /proc/partition

所以要通过命令让内核识别分区,才能进行格式化:

CentOS 5:partprobe [device]
CentOS 6,7:
partx, kpartx
partx -a [device]
kpartx -af [device]

注意:如果是删除分区,我们也要同步,命令为:
partx -d --nr 1-2 /dev/sdb 表示同步删除/dev/sdb里的1-2分区

注意:一般分区完结尾出现“Syncing disks.” 则已经同步完成,不再需要执行partprobe

补充:
在用shell写脚本的过程中,如何新建分区:

echo -e "n\np\n\n\n+1G\nw\n"   | fdisk /dev/sdc    # 利用echo管道 在sdc建立一个1G的主分区;
# 第二种方法;
fdisk /dev/sdc  << EOF     #利用多行重定向输入

2.2 parted 分区工具

parted - a partition manipulation program
parted [options] [device [command [options...]...]]

parted支持mbr格式和gpt格式的磁盘分区。它的强大在于可以一步到位而不需要不断的交互式输入

parted [options] [device [command [options...]...]]
# option:
	-l lists partition layout on all block devices ,显示全部块设备

# command [options...]...  
	print  Display the partition table.
	mkpart part-type [fs-type] start end
	# Make a part-type partition for filesystem fs-type (if specified), beginning at start and ending at end (by default in megabytes).  fs-type can be  one  of "btrfs", "ext2", "ext3", "ext4", "fat16", "fat32", "hfs", "hfs+", "linux-swap", "ntfs", "reiserfs", or "xfs".  part-type should be one of "primary", "logical", or "extended".

示例:
parted /dev/sdc  mkpart  extended  ext4  9666 12000   #表示将

3.文件系统,格式化

文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统;

从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,安全控制,日志,压缩,加密等;

各种类型的文件系统:

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:未经处理或者未经格式化产生的文件系统

格式化的过程就是创建文件系统的过程,可以使用mkfs(make filesystem)工具进行格式化,也可以使用该工具家族的其他工具如mkfs.ext4/mkfs.xfs等专门针对文件系统的工具。

查看当前系统支持的文件系统:cat /proc/filesystems

补充:

  • buffer:缓冲器,在将数据写入磁盘前,数据是存放在buffer上的,然后再写入磁盘;buffer决定写入速度
  • cache:缓存,cpu读取磁盘的数据是从cache中读取的,也就是说cache性能越好,读取磁盘数据越快;

3.1 mkfs命令

mkfs - build a Linux filesystem
该命令在制作ext系统文件格式时调用的是mke2fs命令
mkfs [options] [-t type] [fs-options] device [size]

要查看支持的文件系统类型,只需简单的输入mkfs然后按两下tab键,就可以列出各文件系统对应的格式化命令,这些就是支持的文件系统类型:

CentOS 6:
[root@CentOS6 ~]#mkfs
mkfs          mkfs.cramfs   mkfs.ext2     mkfs.ext3     mkfs.ext4     mkfs.ext4dev  mkfs.msdos    mkfs.vfat 
# # #
CentOS 7:
[root@CentOS7 ~]#mkfs
mkfs         mkfs.btrfs   mkfs.cramfs  mkfs.ext2    mkfs.ext3    mkfs.ext4    mkfs.fat     mkfs.minix   mkfs.msdos   mkfs.vfat    mkfs.xfs     

也可以直接
mkfs -t type  /device    # 确定格式化的文件类型

3.2 mke2fs工具

mke2fs,是ext系列文件系统专用管理工具。该工具创建文件系统时,会从/etc/mke2fs.conf配置中读取默认的配置项。
mke2fs - create an ext2/ext3/ext4 filesystem

mke2fs [ -c | -l filename ] [ -b block-size ] [ -D ] [ -f fragment-size ] [ -g blocks-per-group ] [ -G number-of-groups ] [ -i bytes-per-inode ] [ -I inode-size ] [ -j ] [ -J journal-options ] [ -N number-of-inodes ] [ -n ] [ -m reserved-blocks-percentage ] [ -o creator-os ] [ -O feature[,...]  ] [ -q  ]  [  -r  fs-revision-level  ]  [  -E  extended-options ] [ -v ] [ -F ] [ -L volume-label ] [ -M last-mounted-directory ] [ -S ] [ -t fs-type ] [ -T usage-type ] [ -U  UUID ] [ -V ] device [ blocks-count ]

mke2fs -O journal_dev [ -b block-size ] [ -L volume-label ] [ -n ] [ -q ] [ -v ] external-journal [ blocks-count ]
###
# option:
	-t fs-type  # 指定要创建的文件系统类型(ext2,ext3 ext4),若不指定,则从/etc/mke2fs.conf中获取默认的文件系统类型。
	-b block-size  # 指定每个block的大小,有效值有1024、2048和4096,单位是字节。
	-I inode-size  # 指定inode大小,单位为字节。一般128或256字节
	-i bytes-per-inode  # 指定每多少个字节就为其分配一个inode号。值越大,说明一个文件系统中分配的inode号越少,更适用于存储大量大文件,值越小,inode号越多,更适用于存储大量小文件。该值不能小于一个block的大小,因为这样会造成inode多余。注意,创建文件系统后该值就不能再改变了。
	-c   # 创建文件系统前先检查设备是否有bad blocks。
	-f fragment-size   # 指定fragments的大小,单位字节。
	-g blocks-per-group  # 指定每个块组中的block数量。不建议修改此项。
	-G number-of-groups  # 该选项用于ext4文件系统(严格地说是启用了flex_bg特性),指定虚拟块组(即一个extent)中包含的块组个数,必须为2的幂次方。对于ext4文件系统来说,使用extent的功能能极大提升其性能。
	-j   # 创建带有日志功能的文件系统,即ext3。如果要指定关于日志方面的设置,在-j的基础上再使用-J指定,不过一般默认即可,具体可指定的选项看man文档。 
	-L new-volume-label  # 指定卷标名称,名称不得超出16字节。一般设定为挂载点的名字
	-m reserved-blocks-percentage   # 指定文件系统保留block数量的比例,保留一部分block,可以降低物理碎片。默认比例为5%。
	-N number-of-inodes  # 强制指定该文件系统应该分配多少个inode号,它会覆盖通过计算得出inode数量的结果(根据block大小、数量和每多少字节分配一个inode得出Inode数量),但是不建议这么做。
	-q   # 安静模式,可用于脚本中
	-S   # 重建superblock和group descriptions。在所有的superblock和备份的superblock都损坏时有用。它会重新初始化superblock和group descriptions,但不会改变inode table、bmap和imap(若真的改变,该分区数据就全丢了,还不如重新格式化)。在重建superblock后,应该执行e2fsck来保证文件系统的一致性。但要注意,应该完全正确地指定block的大小,其改选项并不能完全保证数据不丢失。
	-v   # 输出详细执行过程 
	-O  FEATURE[,...]   # 启用指定特性
	-O ^FEATURE    # 关闭指定特性

以上mke2fs命令常用选项有:
-b :每个block大小
-L :创建卷标
-i :每多少个block分配一个inode
-t :创建的文件类型
-m :预留块数量
示例:
CentOS 6:

[root@CentOS7 ~]#mke2fs -t ext4 -b 4096 -L hahahaha  /dev/sda6
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=hahahaha
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1342177280
40 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done 

CentOS 6

[root@CentOS6 ~]#mke2fs -t ext4 -b 4096 -L mydata /dev/sda6
mke2fs 1.41.12 (17-May-2010)
Filesystem label=mydata
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
328656 inodes, 1312604 blocks
65630 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1346371584
41 block groups
32768 blocks per group, 32768 fragments per group
8016 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736

Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 38 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

3.3 e2label 查看、设置卷标

查看:e2label device
设定:e2label device LABEL
> tune2fs -L NEWLABEL /device 也可以修改卷标

注意:此命令只针对ext文件系统做卷标,且只有格式化后才能设置卷标

3.4 tune2fs 工具

查看或修改ext系列文件系统的某些属性
tune2fs - adjust tunable filesystem parameters on ext2/ext3/ext4 filesystems

tune2fs  [OPTIONS]  device
# option:
	-l  # 查看超级块的内容
	-j:ext2 --> ext3; (ext2不带日志系统,ext3带日志系统)
	-L LABEL:修改卷标;
	-m # 调整预留空间百分比;
	-U UUID: 修改UUID号
		tune2fs -U `uuidgen` # 以随机生成的uuid作为修改的uuid号
	-O [^]FEATHER:开启或关闭某种特性:
		acl :开启acl功能
		^acl:关闭acl功能
		(acl(access control list,访问控制列表)功能详见文件权限管理)


tune2fs  -l  /dev/sda1    # 查看该分区超级块内容
Default mount options:    user_xattr acl      # 其中的这一项含有acl表示开了acl功能

tune2fs  -o ^acl  /dev/sda1           # 表示关闭acl功能

4.查看文件系统状态信息

4.1 lsbik

lsblk - list block devices 列出设备及其状态(主要列出非空设备)
lsblk [options] [device...]

lsblk -f查看到文件系统类型,和文件系统的uuid和挂载点

4.2 blkid

blkid - locate/print block device attributes 定位/输出设备属性信息

blkid -L LABEL:根据LABEL定位设备
blkid -U UUID:根据UUID定位设备

4.3 du

du - estimate file space usage 评估文件的空间占用情况

du [OPTION]... [FILE]...
du [OPTION]... --files0-from=F
# option:
	-a, --all:列出目录中所有文件的统计信息,默认只会列出目录中子目录的统计信息,而不列出文件的统计信息
	-h, --human-readable:人性化显示大小
	-0, --null:以空字符结尾,即"\0"而非换行的"\n"
	-S, --separate-dirs:不包含子目录的大小
	-s, --summarize:对目录做总的统计,不列出目录内文件的大小信息
	-c,--total:对给出的文件或目录做总计。在统计非同一个目录文件大小时非常有用。见下文例子。
	-d,--max-depth:指定显示时的目录深度,默认会递归显示所有层次(centos7)
	--max-depth=N:只列出给定层次的目录统计,如果N=0,则等价于"-s"(centos6)
	-x, --one-file-system:忽略不同文件系统上的文件,不对它们进行统计
	-X, --exclude-from=FILE:从文件中读取要排除的文件
	--exclude=PATTERN:指定要忽略不统计的文件

注意区分du /etcdu -a /etc

[root@CentOS7 ~]#du -a /etc |wc -l
3505                          # 递归显示全部的文件的统计信息                                

[root@CentOS7 ~]#du  /etc |wc -l
734                           # 只显示目录的信息
[root@CentOS7 ~]#find /etc -type d  | wc -l
734

注意:du -d1 /etcdu --max-depth=1 /etc效果相同
du -exclude=FILE /usr的用法:

[root@CentOS6 ~]#du -h --max-depth=1 --exclude=/usr/lib64 /usr
136K	/usr/local
310M	/usr/lib
7.6M	/usr/include
12K	/usr/src
1.8G	/usr/share
4.0K	/usr/games
32M	/usr/sbin
36M	/usr/libexec
4.0K	/usr/etc
269M	/usr/bin
2.5G	/usr

结合find使用

[root@xuexi ~]# find /boot/ -type f -name "*.img" -print0 | xargs -0 du -ch
28K     /boot/grub2/i386-pc/core.img
4.0K    /boot/grub2/i386-pc/boot.img
592K    /boot/initrd-plymouth.img
44M     /boot/initramfs-0-rescue-d13bce5e247540a5b5886f2bf8aabb35.img
17M     /boot/initramfs-3.10.0-327.el7.x86_64.img
16M     /boot/initramfs-3.10.0-327.el7.x86_64kdump.img
76M     total

4.4 df

df - report file system disk space usage 显示文件系统空间使用情况

df [OPTION]... [FILE]...
# option
	-h:人性化转换大小的显示单位
	-i:统计inode使用情况而非空间使用情况
	-l, --local:只列出本地文件系统的使用情况,不列出网络文件系统信息
	-T, --print-type:同时输出文件系统类型
	-t, --type=TYPE:只列出给定文件系统的统计信息
	-x, --exclude-type=TYPE:指定不显示的文件系统类型的统计信息

注意:df是读取每个文件系统的superblock信息,所以评估速度非常快。由于是读取superblock,所以如果目录下挂载了另一个文件系统,是不会将此挂载的文件系统计入目录大小的。

4.5 dumpe2fs

dumpe2fs - dump ext2/ext3/ext4 filesystem information
dumpe2fs prints the super block and blocks group information for the filesystem present on device.
显示ext系列文件系统的super block 和block groups信息

[root@CentOS7 ~]#dumpe2fs -h /dev/sda6
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   hahahaha
Last mounted on:          <not available>
Filesystem UUID:          8525fe09-c310-4a16-9f38-23ff43051e80
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              327680
Block count:              1310720
Reserved block count:     65536
Free blocks:              1252258
Free inodes:              327669
First block:              0
Block size:               4096
Fragment size:            4096
Group descriptor size:    64
Reserved GDT blocks:      639
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Flex block group size:    16
Filesystem created:       Sat Nov 24 16:00:45 2018
Last mount time:          n/a
Last write time:          Sat Nov 24 16:00:46 2018
Mount count:              0
Maximum mount count:      -1
Last checked:             Sat Nov 24 16:00:45 2018
Check interval:           0 (<none>)
Lifetime writes:          131 MB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:	          256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      f4ca6814-6107-4432-a987-4bc22801a5b9
Journal backup:           inode blocks
Journal features:         (none)
Journal size:             128M
Journal length:           32768
Journal sequence:         0x00000001
Journal start:            0

4.6 findfs 查找分区

findfs [options] LABEL=<label>
findfs [options] UUID=<uuid>

示例:
findfs `grep /data  /etc/fstab  | cut -d" "  -f1`   

5.文件系统检测与修复

注意:一定不要在挂载状态下修复

fsck: File System Check
fsck.FS_TYPE
fsck -t FS_TYPE
-p: 自动修复错误
-r: 交互式修复错误
FS_TYPE一定要与分区上已经文件类型相同

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

6.挂载和卸载文件系统

根文件系统这外的其它文件系统要想能够被访问,都必须通过“关联”至根文件系统上的某个目录来实现,此关联操作即为“挂载”;此目录即为“挂载点”;
挂载点:mount_point,用于作为另一个文件系统的访问入口;
(1) 事先存在;
(2) 应该使用未被或不会被其它进程使用到的目录;
(3) 挂载点下原有的文件将会被隐藏;

注意:1、一个挂载点同一时间只能挂一个设备!
2、一个设备可以挂载在多个文件夹下,只不过看到的内容都是一样的
3、挂载点最好是空文件夹,否则原来的文件会被隐藏

6.1 mount

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:挂载点
    • 事先存在;建议使用空目录
    • 进程正在使用中的设备无法被卸载

补充:
如何在不重启的情况阿霞在虚拟机识别新增的硬盘
echo "- - -" > /sys/class/scsi_host/host0/scan

mount      # 通过查看/etc/mtab文件显示当前已挂载的所有设备,该文件自动更新,记载设备挂载情况
mount  label=name   /data/mnt    # 用卷标挂载
mount   UUID="e206a05c-e04e-400c-8081-01fa18e079d4"   /data/mnt   # 用UUID挂载,由于uuid稳定唯一,所以尽量用uuid去挂载

# option:
	-t vsftype:指定要挂载的设备上的文件系统类型
	-r: readonly,只读挂载
	-w: read and write, 读写挂载
	-n: 不更新/etc/mtab,mount不可见 (cat /proc/mounts可见)
	-a:自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中有auto功能)
	-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功能
	noacl:关闭acl功能
		mount -o noacl,remount  /dev/sdb1  /data/mnt 
	loop: 使用loop设备
	
	defaults:相当于rw, suid, dev, exec, auto, nouser, async

findmnt MOUNT_POINT|device   # 查看挂载情况,已经挂载显示相应挂载情况,无挂载则无输出;可用于写脚本
	findmnt /data/mnt  &> /dev/dull  ||  mount /dev/sdb2  /data/mnt

lsof MOUNT_POINT
fuser -v MOUNT_POINT   # 查看正在访问指定文件系统的进程

fuser -km MOUNT_POINT  # 终止所有在正访问指定的文件系统的进程

umount DEVICE
umount MOUNT_POINT   # 卸载

因此,mount命令可将将分区、文件夹(-B)、文件(loop) 都可以挂载在空文件夹上

补充:loop设备,可以在文件系统中创建一个设备文件,该设备文件可以分区,可以挂载
centos6 最多只能挂8个loop设备
ls /dev/loop*
但是,可以创建
mknod /dev/loop8 b 7 8 centos6上创建第8个loop设备

dd if=/dev/zero  of=/data/test_loop  bs=1M  count=500  # 创建loop设备
mkfs.ext4  test_loop   # 格式化
mount -o loop  test_loop  /data/mnt   # 挂载,centos6上需加-o loop选项,即我们实现了将一个文件挂载在文件夹上。

6.2 /etc/fstab

我们挂载的命令执行结束后仅仅只是在内存在结束,一旦重启原来的挂载关系都不存在,所以我们要修改配置文件/etc/fstab来保存修改,这样才永久挂载

该文件很重要,最好备份。
如果出现故障

要挂载的设备或伪文件系统
1.设备文件
LABEL:LABEL=""
UUID:UUID=""
伪文件系统名称:proc, sysfs
2.挂载点
文件系统类型
3.挂载选项:defaults
4.转储频率:0:不做备份 1:每天转储 2:每隔一天转储
5.自检次序: 0:不自检 1:首先自检;一般只有rootfs才用1

mount -a 无需重启,挂载/etc/fstab中的所有文件系统

注意:对于loop、光盘、文件夹、一般在fatab中写设备名
一些特殊挂载在/etc/fatab:

补充:

mknod - make block or character special files   # 创建特殊文件
mknod  [OPTION]...  NAME  TYPE   [MAJOR MINOR]

# type:
b      # create a block (buffered) special file
c, u   # create a character (unbuffered) special file


mknod  zero  c 1 5  在 当前设备里创建zero文件,类似/dev/zero文件;注意,要提前cd至该设备的挂载目录里。
ll /dev/zero  /data/zero
crw-r--r--. 1 root root 1, 5 Dec 12 17:31 /data/zero
crw-rw-rw-. 1 root root 1, 5 Dec 12 14:54 /dev/zero

补充:
简单删除一块磁盘的分区
dd if=/dev/zero of=/dev/sdb bs=1 count=512

7.swap

交换文件、交换分区,也叫虚拟内存,是系统RAM的补充
swapon -s # 查看swap信息
创建swap分区;
第一步:fidisk 一个单独的分区,注意将分区类型改为82!
第二步:makeswap 格式化
第三步:修改/etc/fatab配置文件
第四步:swapon -a 激活全部swap

swapon  [OPTION]...  [DEVICE]  # 启用swap
	-a:激活所有的交换分区;
	-p PRIORITY:指定优先级
swapoff [OPTION]... [DEVICE]   # 禁用swap

/etc/fstab文件中,可以在defaults后面跟pri=value 设置优先级,值越高优先级越高

练习:
1、根据挂载文件名查出该设备名称。
blkid -U `grep /data /etc/fstab | sed -r "s/UUID=([^ ]*) .*/\1/" `
findfs `grep /data /etc/fstab | cut -d" " -f1 `

实验1:修改/etc/fstab 中的uuid,可能导致无法启动,怎么修复
1.根据提示,输入root的密码进入bash;
2.在修改/etc/fstab 文件时会提示我们该文件为只读文件,无法修改。
3.重新挂载/目录
mount -o rw,remount /dev/sda2 / 重新挂载根目录
4.再 vim /etc/fstab 修改配置文件,将最后两位修改为0 0即可。
5.正常重启

实验2:将一个文件夹迁移至一个新的磁盘分区,如将/home目录迁移至新的分区/dev/sdc1。

为避免在cp过程中别的用户在修改/home,我们可以在操作cp前这么操作
init 1 切换至单用户,也就是说别的终端不允许访问,只允许单用户终端访问,结束操作后再切回至init 5

1 建立新分区
2 建立文件系统
3 mkdir /mnt/home
mount /dev/sda6 /mnt/home
4 cp -av /home/* /mnt/home
5 tar cvf /app/home.tar /home
scp remote
6 init 1 断开网络,在远程不要执行
7 rm -rf /home/*
8 vim /etc/fstab
UUID=b0421d9a-8072-4be5-9526-070535ac0a8e /home ext4 defaults 0 0
9 mount -a
umount /mnt/home
10 init 5 还到原有模式

注意:跟 “/” 目录无法迁移

3.将CentOS6的CentOS-6.9-x86_64-bin-DVD1.iso和CentOS-6.9-x86_64-bin-DVD2.iso两个文件,合并成一个CentOS-6.9-x86_64-Everything.iso文件,并将其配置为yum源.

首先现将两个光盘合成一个

mkdir /data/centos6.9    创建一个空文件夹
cp -av  /misc/cd/*   /data/centos6.9  # 将正在挂载这的光盘dvd1的内容复制进刚刚创建的centos6.9的空文件夹
eject #将dvd1弹出

再放入dvd2
\cp -av /misc/cd/*  /data/centos6.9  # 因为dvd1与dvd2有很多相同的文件,所以在cp前加\表示使用cp的原命令,否则复制过程中每一个相同的文件都会提醒是否覆盖

mkisofs -r -o  CentOS-6.9-x86_64-Everything.iso   /data/centos6.9  # 制作iso

注意:制作的这个iso文件只能当yum源使用,无法作为系统启动光盘,如果要作为系统启动盘使用还需要去官网下载mkdvdiso脚本制作。

然后挂载

mount  -o loop  /data/ CentOS-6.9-x86_64-Everything.iso      /data/mnt

修改配置文件/etc/yum.repo.d/base.repo

最后

yum clean all
yum repolist 

4.创建一个2G的文件系统,块大小为2048byte,预留1%可用空间,文件系统ext4,卷标为TEST,要求此分区开机后自动挂载至/test目录,且默认有acl挂载选项.

fdisk  /dev/sdb   # 先分出一个2G的分区

mke2fs  -t ext4  -m 1  -b 2048  -L test   /dev/sdb1     # 创建文件系统,块大小为2048byte,预留1%可用空间,文件系统ext4,卷标为TEST

vim  /etc/fstab      # 修改配置文件
UUID=cb17acad-ad9c-40b1-bab1-aa11a9ff9741 /test    ext4  defaults,acl  0 0    #添加此条

mount  -a

5.写一个脚本,完成如下功能:
(1) 列出当前系统识别到的所有磁盘设备
(2) 如磁盘数量为1,则显示其空间使用信息
否则,则显示最后一个磁盘上的空间使用信息

#!/bin/bash
a=`lsblk -l | grep "sd[a-z]\>"  |wc -l`
b=`lsblk -l | grep "sd[a-z]\>" |cut -d" " -f1  |head -n1`
c=`lsblk -l | grep "sd[a-z]\>" |cut -d" " -f1  |tail -n1`


[ $a -eq 1 ]  && echo "`fdisk -l /dev/$b`"  || echo "`fdisk -l /dev/$c`"

注意:跟 “/” 目录无法迁移

posted @ 2018-12-18 09:22  N_34崧泰  阅读(507)  评论(0编辑  收藏  举报