1. 机械硬盘
盘片:一般有两个盘片,每个盘片有两面,都可记录信息。
磁头:用来读取数据,如果强制性断电,磁头就会停留在盘片上;硬盘有数个盘片,每盘片两个面,每个面一个磁头。
磁道:盘片上的一圈我们叫做磁道,同一盘片不同半径的同心圆为磁道。
扇区:磁道上的一小段弧我们叫做一个扇区(扇形区)是512B,磁盘的读写以扇区为基本单位。磁盘的每一面被分为很多条磁道,即表面上的一些同心圆,越接近中心,圆就越小。在一些硬盘的参数列表上你可以看到描述每个磁道的扇区数的扇区数的参数,它通常用一个范围标识,例如373~746,这表示,最外圈的磁道有746个扇区,而最里面的磁道有373个扇区,因此可以算出来,磁道的容量分别是从186.5KB到373KB(190976B—381952B),一个扇区能存储512B的数据,如果在某个扇区中有任何一个字节不能被正确读写,则这个扇区为Badsector。
柱面:一般一个硬盘都是两张盘面,不同盘片相同半径的磁道所组成的圆柱称为柱面。
一台机器上可以插多块硬盘,机器一开机,需要先识别出硬盘的先后顺序来,第一块硬盘被识别成sda,sd(SATA)代表硬盘的接口,a代表第一号硬盘,那么再来一块硬盘会被识别成sdb,即第二块硬盘;sda1代表第一块硬盘的第一个区。
2. 添加硬盘
在虚拟机中我们来添加一块硬盘,
注意:SCSI接口的硬盘识别出来也是sd~
单击完成,然后启动虚拟机
对于Linux系统来说,一切皆文件,不管你加什么东西,加硬盘也是如此,在操作系统这边都会把你识别成一个文件,对于硬盘这种硬件,系统会把它识别为设备文件,存放的目录为/dev/
例如
[root@book ~]# ls /dev/sd
sda sda1 sda2 sda3 sdb
从上面可以看出,你这台机器有sda sdb这两个硬盘,sda分成了三个分区,分别为sda1 sda2 sda3,这里sdb没有做分区,就一块盘,这里sdb是我们新增的一块硬盘。
我们来查看这块硬盘的分区信息
[root@book ~]# fdisk -l /dev/sdb
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
硬盘名为:sdb 容量为:8GB
255个磁头 63个扇区 1044个柱面
Units
扇区的大小(逻辑/物理):512B
I/O大小:对硬盘来说,这里的input为往硬盘上写东西,输出为往硬盘外读内容,最小的操作单位为512B,即一个扇区,对应硬盘来说,就是一次读写512B。
硬盘是一个硬件设备,谁去控制硬件,只能通过操作系统去控制硬盘,操作系统级别你操作的是什么?是文件的读写。硬盘级别操作的是真实的数据,这一真实的数据它一次性读写是多大?512B
例如:你用vim编辑器编辑一个文件,在这个级别你编辑文件和硬盘是什么关系的,你写的内容是在内存里面的,在内存里面的内容是vim编辑器去控制的,vim编辑器是不能执行保存操作的,vim是一个应用程序,应用程序要想调用硬件,必须通过操作系统。因此,vim应用程序会把保存指令发给操作系统。
硬盘的一次读写处理的数据为512B,如果操作系统一次给你硬盘512B,文件很大的时候是不是效率很低。
实际上在操作系统级别有一个逻辑单位叫做block块,一个block块等于8个扇区的大小,即8*512B,操作系统一次性存文件大小为8*512B,这样效率就提高了,硬盘级别一次性处理512B。
3. 硬盘分区
[root@book ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x4968fc9e.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
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
u change display/entry units
v verify the partition table
w write table to disk and exit 保存退出
x extra functionality (experts only)
Command (m for help): n
Command action
e extended 扩展分区
p primary partition (1-4) 主分区 硬盘分区的时候最多只能分四个主分区,假如你分了四个主分区以后,你就分不出分区出来了,只能有这四个分区了
p
Partition number (1-4): 1
First cylinder (1-1044, default 1): 直接回车默认就从第一个柱面开始
第一个分区做如下比喻,这个环形的柱体就是相当于第一个分区
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1044, default 1044):
不懂柱面的概念没关系,这里还可以用大小来指定
Last cylinder, +cylinders or +size{K,M,G} (1-1044, default 1044): 10 这里指定第10个柱面为第一分区的最后一个柱面。
Last cylinder, +cylinders or +size{K,M,G} (1-1044, default 1044): +5G 这里用指定大小的形式给第一分区分了5G的大小
Last cylinder, +cylinders or +size{K,M,G} (1-1044, default 1044): +5G
Command (m for help): p 建完按p查看分区的情况
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xcfd86fc5
Device Boot Start End Blocks Id System
/dev/sdb1 1 654 5253223+ 83 Linux
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4):
Partition number (1-4): 2 建第二个主分区
First cylinder (655-1044, default 655): 起始柱面,回车默认
Using default value 655
Last cylinder, +cylinders or +size{K,M,G} (655-1044, default 1044): +1G
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xcfd86fc5
Device Boot Start End Blocks Id System
/dev/sdb1 1 654 5253223+ 83 Linux
/dev/sdb2 655 786 1060290 83 Linux
Partition number (1-4): 3
First cylinder (787-1044, default 787):
Using default value 787
Last cylinder, +cylinders or +size{K,M,G} (787-1044, default 1044): +1G
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xcfd86fc5
Device Boot Start End Blocks Id System
/dev/sdb1 1 654 5253223+ 83 Linux
/dev/sdb2 655 786 1060290 83 Linux
/dev/sdb3 787 918 1060290 83 Linux
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Selected partition 4 最多可以建4个主分区
First cylinder (919-1044, default 919):
Using default value 919
Last cylinder, +cylinders or +size{K,M,G} (919-1044, default 1044):直接回车把剩下的空间全部作为第四分区
Using default value 1044
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xcfd86fc5
Device Boot Start End Blocks Id System
/dev/sdb1 1 654 5253223+ 83 Linux
/dev/sdb2 655 786 1060290 83 Linux
/dev/sdb3 787 918 1060290 83 Linux
/dev/sdb4 919 1044 1012095 83 Linux
四个主分区全部建完
Command (m for help): n
You must delete some partition and add an extended partition first 如果想继续建分区发现建不了
如果想继续创建分区,先删掉一个主分区,然后创建一个扩展分区
Command (m for help): d 删除第四个分区
Partition number (1-4): 4
Command (m for help): n
Command action
e extended
p primary partition (1-4)
e 建扩展分区
Selected partition 4
First cylinder (919-1044, default 919):
Command action
e extended
p primary partition (1-4)
e
Selected partition 4
First cylinder (919-1044, default 919):
Using default value 919
Last cylinder, +cylinders or +size{K,M,G} (919-1044, default 1044):
Using default value 1044
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xcfd86fc5
Device Boot Start End Blocks Id System
/dev/sdb1 1 654 5253223+ 83 Linux
/dev/sdb2 655 786 1060290 83 Linux
/dev/sdb3 787 918 1060290 83 Linux
/dev/sdb4 919 1044 1012095 5 Extended 扩展分区
Command (m for help):
建了扩展分区以后,又可以继续创建分区了,这时候建的分区是扩展分区里面的空间
Command (m for help): n
First cylinder (931-1044, default 931): 940^H^H^H
Last cylinder, +cylinders or +size{K,M,G} (940-1044, default 1044): 940
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xcfd86fc5
Device Boot Start End Blocks Id System
/dev/sdb1 1 654 5253223+ 83 Linux
/dev/sdb2 655 786 1060290 83 Linux
/dev/sdb3 787 918 1060290 83 Linux
/dev/sdb4 919 1044 1012095 5 Extended
/dev/sdb5 919 930 96358+ 83 Linux
/dev/sdb6 940 940 8032+ 83 Linux
Command (m for help): w 保存退出
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@centOS6 ~]#
你可以不建主分区,但是你要注意只有主分区才可以装系统(启动分区)
分区分为:主分区、扩展分区、逻辑分区,逻辑分区是扩展分区里面分出来的
分区建完后执行一下partprobe
分区建完后还不能用,需要格式化
4. 格式化
格式化的过程就是创建文件系统的过程
[root@centOS6 ~]# mkfs.ext4 /dev/sdb1 将分区sdb1格式化
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
328656 inodes, 1313305 blocks
65665 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 28 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
5. 挂载
我们建出来的分区/dev/sdb1相当于是操作系统级别与物理硬盘的一个映射,对你来说/dev/sdb1就相当于一个硬件设备,硬件设备你是不能用的,你在操作的时候只能操作目录,只能操作文件夹,所以你必须要做一个映射,把底层的分区映射到一个具体的目录才可以使用。以后你往那个目录里面存东西就会把那些东西对应到分区/dev/sdb1,这个建立关系的过程就叫做挂载。
挂载具体怎么做:mount /dev/sdb1(源设备) /sdb1/(映射目录)
[root@centOS6 /]# mkdir sdb1
[root@centOS6 /]# mount /dev/sdb1 /sdb1
[root@centOS6 /]# ls /sdb1
lost+found
[root@centOS6 /]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 7406992 1435296 5588772 21% /
tmpfs 953244 0 953244 0% /dev/shm
/dev/sda1 194241 32045 151956 18% /boot
/dev/sdb1 5039592 10264 4766668 1% /sdb1
[root@centOS6 /]#
你想要往分区/dev/sdb1存东西怎么存,你只要往目录/sdb1里面存就可以了
6. 总结
Fdisk /dev/sdb新建分区
Partprobe更新分区表
Mkfs.ext4 /dev/sdb1格式化 还可以这么写mkfs.ex4 /dev/sdb{1..3}
Mount /dev/sdb1 /sdb1
可以通过d命令来删除分区
Command (m for help): d
Partition number (1-4): 2
7. 文件系统
Ext4 ext2 这些都是日志文件系统
Ext4适用于文件不多的场合,对应海量文件的场合,ext4这个系统就有点过时了
Xfs文件系统通常用于海量数据,建议用这个,centOS7就支持这个
Btrfs文件系统效率是最高的,但是有个特点,内存占用太高
Ntfs文件系统,win中用的文件系统
8.挂载详解
我们把硬盘分区比喻成一个密闭的水桶
往里面灌水、取水就相当于往硬盘里面写数据、读数据
由于水桶是密闭的我们就得接一根水管,这个水管就是挂载点
如果你要把分区/dev/sdb1挂载到/opt目录下
那么水桶就相当于/dev/sdb1,水管就相当于/opt
凿水管的过程就是mount的过程
Mount /dev/sdb1 /opt
有了水管之后,读写数据就可以通过水管来操作,你也只能通过水管来操作
你是不能直接操作水桶(硬盘)的
一个水桶可以凿多个水管
从水管/test1注入的水在水管/opt、/test2都可以看到
你从/opt取走了水,你在/test1、/test2中也可以感受到
多个目录共用一个源设备
[root@book /]# mount /dev/sdb1 /test1
[root@book /]# mount /dev/sdb1 /test2
[root@book /]# mount /dev/sdb1 /test3
[root@book /]# mount /dev/sdb1 /opt/
[root@book /]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 7406992 1444160 5579908 21% /
tmpfs 953244 0 953244 0% /dev/shm
/dev/sda1 194241 27584 156417 15% /boot
/dev/sdb1 774172 808 733204 1% /sdb1
/dev/sdb1 774172 808 733204 1% /test1
/dev/sdb1 774172 808 733204 1% /test2
/dev/sdb1 774172 808 733204 1% /test3
/dev/sdb1 774172 808 733204 1% /opt
[root@book /]# touch /opt/a.txt
[root@book /]# ls /opt/
a.txt lost+found
[root@book /]# ls /test1
a.txt lost+found
注意:/opt/这个目录本来是挂载在sda3的
/dev/sda3 7406992 1444288 5579780 21% /
如果opt目录找不到直接映射的分区,就往上一级目录去找,找到/对应的分区为/dev/sda3
如果mount /dev/sdb1 /opt,opt目录就直接映射到/dev/sdb1了,优先级更高,那么就不用往上一级目录去找了。
其实你把目录/opt理解成一个水管就行,通过水管能够看到的东西与你映射的分区有关,你把它对应哪个分区里面就是哪个分区的内容。
9.卸载
卸载目录就可以了
[root@book /]# umount /test1
10. df命令详解
用来检查文件系统的磁盘空间占用情况
[root@book ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 7406992 1444300 5579768 21% /
tmpfs 953244 0 953244 0% /dev/shm
/dev/sda1 194241 27584 156417 15% /boot
/dev/sdb1 774172 808 733204 1% /opt
文件系统 这个分区下 已用的块 可用的块
包含的块
一个块为
(512*8)
[root@book ~]# df -h 这种查看方式不准确
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 7.1G 1.4G 5.4G 21% /
tmpfs 931M 0 931M 0% /dev/shm
/dev/sda1 190M 27M 153M 15% /boot
/dev/sdb1 757M 808K 717M 1% /opt
有个奇怪的现象,你一分完区,分区里没有文件,为什么有部分块被占用了呢?
[root@book ~]# ls /opt/
lost+found
/dev/sdb1 774172 808 733204 1% /opt 占用了1%
这里面到底存了什么?文件系统
[root@book ~]# mount 这种查看方式可以看到文件系统的类型 读写
/dev/sda3 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/sdb1 on /opt type ext4 (rw)
10. du命令
统计指定目录下文件大小
[root@book ~]# du -sh /etc
29M /etc
11. 要存储一个文件需要存储哪些信息
两个方面:(1)文件的内容(2)文件的源数据(权限、属主、属组、文件大小、修改日期、文件名)
那么文件内容应该存放在哪里?
毫无疑问存放在硬盘当中
那么源数据应该存放在哪里?
当然是存放在硬盘,存在硬盘的什么地方?在硬盘的inode里面,
你这个硬盘分区一格式化完之后,都会把你这个硬盘分区分成两部分,硬盘在操作系统级别上的存储单位是block(512*8B),硬盘级别是一个扇区(512B),也就是说在操作系统级别,你可以把硬盘看成一堆block。
那么一个硬盘分区的block分成两部分block,一部分是数据block,专门存放文件数据;另一部分叫inode block,专门用来存放文件源数据的。
12. 查看一个文件的inode编号
[root@book ~]# ls -i install.log
130054 install.log
查看分区inode的占用情况
[root@book ~]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 479552 54833 424719 12% /
tmpfs 238311 1 238310 1% /dev/shm
/dev/sda1 51200 38 51162 1% /boot
不仅文件有inode编号,目录也有inode编号
13. 硬盘空间满有两种情况
(1)硬盘空间满了
例如存放一个很大的文件,一个文件就已经把你占满了;
(2)硬盘的inode的被耗完了
例如你硬盘里面存放了大量的空文件,即使是空文件,每个文件也必须分配inode号
举个形象的例子,一个教室有50个座位,来个50个学生全部坐下,座位就相当于inode号,再来学生就坐不下了,即使教室的空间体积还有很多;假设来了巨人,巨人的体积和教室的空间体积那么大,一个巨人就把教室给占满了,这种占满就相当于硬盘空间满了。
[root@book ~]# dd if=/dev/zero of=/sdb1/test bs=1G count=1
dd: writing `/sdb1/test': No space left on device
1+0 records in
0+0 records out
775282688 bytes (775 MB) copied, 4.8771 s, 159 MB/s 可以用来测试硬盘的速度
14.文件系统到底是什么鬼东西
首先要明白,硬盘分区的block被分成了如下block:
Super block、inode block、directory block、数据block
super block用来掌管全局,相当于一家之长,相当于说我这个硬盘上还有多少编号可以用,哪些编号是活跃状态,哪些可以被别人用。如果一个教室是一个文件系统,基本的储存单位为block块,block块比作一个个的人,这些人分成不同的角色,其中有个叫super block,老师就相当于super block,老师负责掌管教室里面的一切座位的分配,一个座位就相当于一个inode编号,一旦有人需要,先要问老师看是否有座位,然后老师就开始查是否有座位,一旦查到有空座位就会给你申请,老师就干这事。
inode block就相当于你每个人坐的座位,inode 编号就相当于你每个人的身份证号,唯一的。
文件系统就相当于下面的这张表,
下面举个例子来看一下cat /a.txt在文件系统中是怎样的一个寻址的过程,
首先cat /a.txt分成两个部分,第一个部分是根目录 / 第二部分是根下的a.txt
一切皆文件,根目录也不例外,是文件就得占用一个inode号
[root@book ~]# ls -id /
2 /
cat /a.txt 首先找到的是根/,如果你对根有读权限信息,可以走到指针那一步,指针就指到directory block,然后在directory block检索有没有a.txt,如果有a.txt就取到a.txt inode编号16832,找到inode编号就去找inode块。如果你有权限则可以通过inode块的指针找到数据块的a.txt里面的值123
[root@book ~]# ls -i /a.txt
16832 /a.txt
15. 为什么删了的数据可以恢复回来?
假如你要删掉/a.txt,那么a.txt的inode编号就会在super block里面标记为free,在老大super block这个位置认为18632这个编号是可以分配给别人的,紧接着在directory block里面把a.txt inode删掉,对应关系就没有了,然后在数据block块存123的那个块标记为free,意味着这个数据块可以给其他人存数据了。
这么一个过程走下来后,你会发现真正的数据根本就没被删掉,数据123还存放在数据block块里面。
数据恢复的过程是这样的,首先在super block里面把16832从free转变成busy状态,然后在directory block里面把a.txt 与16832的对应关系重新建立起来,同时找到对应的数据block块,把数据block块的free变成busy状态。这样数据就恢复成功。
你删除数数据,硬盘不去操作,立马关机,数据就在硬盘上一直存在。
那么数据是什么时候真正的没了呢?
只能是以覆盖的方式,如果你重新touch b.txt,刚好把16832分配给了b.txt,那么b.txt里面的内容就会把123对应的数据块给占用掉了,所以说硬盘上的真正删除工作只能是覆盖操作,用磁去覆盖磁。没有被覆盖的数据块的内容是有概率性的恢复回来的。
16. 最后说一下格式到底在干什么?
我们前面说过格式化的过程就是建立文件系统的过程,具体是如何建立的?
格式化就是把这些块全部建立起来,Super block、inode block、directory block、数据block,建立起来的这些信息也会占用空间的,所有你刚购买的硬盘,虽然是空盘,你会发现有一小部分空间被占用了,占用的这部分就是文件系统的信息。
17. 为什么建空文件也会占用硬盘空间呢?
既然是文件就会给你分配inode号,就会占用inode block来存储文件的源信息,一个block就会映射为硬盘的8个扇区,那就是512B*8=4KB,你是文件总会有路径吧,你会在directory block里面写上一条a.txt 16832信息。