设备文件
在linux中,磁盘和分区都表示成文件, 磁盘的设备文件都是在 /dev/sd*
如下:
[root@localhost ~]# ll /dev/sd*
brw-rw----. 1 root disk 8, 0 Sep 4 03:11 /dev/sda
brw-rw----. 1 root disk 8, 1 Sep 4 03:11 /dev/sda1
brw-rw----. 1 root disk 8, 2 Sep 4 03:11 /dev/sda2
brw-rw----. 1 root disk 8, 3 Sep 4 03:11 /dev/sda3
结果解读
当前我的机器上有/dev/sda 一块硬盘,这个硬盘被分成1,2,3 三个分区
他们的命名规则就是 a,b,c .. 表示硬盘的顺序号, 1,2,3... 表示分区号
- 老式的硬盘IDE接口是hd开头
- sd开头的是最普及的SATA设备
什么是MBR?
MBR (Master Boot Record) 主引导程序
简单的说,有了它是系统的引导程序,可以引导体统从硬盘上启动, 换句话说,一旦硬盘的主引导程序被破坏后,就无法从直接从硬盘启动机器了,(可以尝试从光盘上启动)
组成
MBR 大小512字节,分如下三部分
- 主引导程序: 446字节
- 硬盘分区表DPT: 64字节
- 分区结束标记: 2字节
其中DPT是磁盘分区表, 总过64字节,如果每一个主分区占用16字节,那么受到磁盘分区表的限制,64/16=4 个分区, 其中至少有一个分区是主分区, 但是可以通过添加拓展分区,一个拓展分区下可以存在多个逻辑分区,打破这种分区受限的局面
为什么要分区?
linux中的分区,和window中划分C盘 D盘 F盘 是擦不多的,如果不分区, 系统上的所有数据,软件全部在一个盘符上,电脑出现故障这个盘符上的数据就会全部丢失,这就是为什么要去分区
硬盘的容量=主分区的容量+扩展分区的容量
扩展分区的容量=各个逻辑分区的容量之和
dd命令
作用:从指定的文件中抽取指定长度的数据,(从底成复制磁盘上的数据),而cp,是在文件系统的基础上进行拷贝
格式: dd if=输入文件 of=输出文件 bs=单位大小 count=重复数量
将输入文件中的内容输出到输出文件中
- count: 备份的次数
- skip: 从input源中跳过指定容量的数据
- seek: 从output源中跳过指定大小的数据
- ids: input中每块的单位字节数, 默认单位 字节
- ods: output中每块的单位字节数, 默认单位 字节
- bs: 包含 ids 和 ods ,默认单位 字节
注意下: 可以跳着写, 但是不能跳着读
例:比如,想破坏DPT,就是越过磁盘开头部分446字节,然后写入64字节
// 跳过446块, 每块1字节 , 写入64次,每次1字节
dd if=/dev/zero/ of=/dev/sda seek=446 obs=1 ids=1 count=64
dd if=/dev/zero/ of=/dev/sda seek=446 bs=1 count=64
备份MBR
如果想防止因为主引导程序被破坏导致系统启动不起来,可以尝试备份MBR文件,但是,最好需要把他备份到其他磁盘的分区去,不然也是白备份
dd if=/dev/sda of=mbr.bak bs=512 count=1
将/dev/sda 这第一块磁盘上的开头512字节(整好是MBR)备份到 mbr.bak文件中
还原MBR
反向备份
dd if=mbr.bak of=/dev/sda bs=512 count=1
常用 /dev/zero
创建指定大小的空文件
dd if=/dev/zero of=test bs=1M count=10
磁盘和分区的结构
一般逻辑分区的序号都是从5开始的
查看分区的情况
命令:
fdisk -l
################### 11111111 ########################
# 设备文件 容量
Disk /dev/sda: 42.9 GB, 42949672960 bytes, 83886080 sectors
# 每一个分区,都至少占用1个扇面, Units指定了每一个扇面的大小
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: 0x000ba572
# 分区的详情 开始位置 结束位置 , 他没可能被连续,但是绝对没重合
Device Boot Start End Blocks Id System
/dev/sda1 2048 4095 1024 83 Linux
/dev/sda2 * 4096 2101247 1048576 83 Linux
/dev/sda3 2101248 83886079 40892416 8e Linux LVM
################# 2222222222 ##########################
Disk /dev/mapper/VolGroup00-LogVol00: 40.2 GB, 40231763968 bytes, 78577664 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
################ 333333333333 ###########################
Disk /dev/mapper/VolGroup00-LogVol01: 1610 MB, 1610612736 bytes, 3145728 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
可以直接使用管道统计数量
[root@localhost ~]# fdisk -l | grep "Disk /d" | wc -l
3
详解fdisk
假设我们给电脑新添加了一块硬盘,想使用这个硬盘就得给他分区,格式化,再挂载上文件系统
其实有两种分区方式:
- fdisk 命令
- 限制大小2T
- parted 命令
- 不限制大小
fdisk创建分区
格式: fdisk /dev/[硬盘名]
按照提示往下进行
- m: 查看操作指令的帮助信息
- p: 列表查看分区信息
- n: 新建分区
- d: 删除分区
- t: 变更分区类型
- w: 保存分区设置 并退出
- q: 放弃保存分区信息,并退出
假如是这种情况: 新添加了一块硬盘,先分区,再把系统中的一个文件系统挂载到了这个分区上, 接着使用这个分区, 但是呢你又想去分区了, 在最后一步 w保存时,可能会失败,警告说,当前的磁盘正在被使用,下次reboot时,再为你创建新的分区设备文件
解决: 通过df 查看到哪个文件系统挂载到该分区了
然后unmount [文件系统], 再使用 partrobe(8),为新分区创建文件目录
partprobe命令: 告诉内核, 系统分区表被改动了, 调用 ioctl() 重新读取分区表
修改磁盘分区后不用重启, 使用partprobe更新磁盘变化
parted 命令
作用: 支持对大容量硬盘的分区 ( 兼容大小容量的硬盘 )
(相对于fdisk 他能自动保存)
使用parted 分区之后, 再使用 fdisk查看, fdisk -l /dev/[分区目录]
需要使用 parted /dev/[分区]/ p 才能看到最新的分区详情
[root@localhost ~]# parted /dev/sda
GNU Parted 3.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
# 使用print 打印出分区情况,及当前系统使用的什么文件系统
(parted) print
Model: ATA VMware Virtual I (scsi)
Disk /dev/sda: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 2097kB 1049kB primary
2 2097kB 1076MB 1074MB primary xfs boot
3 1076MB 42.9GB 41.9GB primary lvm
挂载
完成分区后格式化该分区, 接着就可以将文件系统挂载到该分区使用, 这时,该文件系统中的全部数据都存放在该分区中
格式化:
mkfs命令
格式: mkfs -t 文件系统类型
mkfs.ext4 [分区文件目录]
例: mkfs.ext4 /dev/sda1
(CentOS6使用 ext4 作为默认的文件系统。)
((CentOS7使用 xfs 作为默认的文件系统。)
挂载:
设置只读权限
mount -o ro [路径]
先创建一个空目录, 然后将这个分区挂载到这个空目录
mount [分区目录] [目标目录]
mount /dev/sdb1 /sdb1/