磁盘、分区、文件系统
来源:互联网 发布:优化蜜蜡是假的吗 编辑:程序博客网 时间:2024/05/18 08:16
一:磁盘
物理上来说,硬盘主要由若干盘片、机械手臂、读写磁头与主轴马达组成。盘片表面涂以磁性介质,用以存储数据。每个盘片有两面,都可记录信息。而读写主要是透过在机械手臂上的读写磁头来达成。实际运作时,主轴马达让盘片转动,然后机械手臂可伸展使磁头到达指定的位置,在盘片上进行读写动作。每个盘片有两个面,每个面都有一个磁头,
逻辑上来说,又有磁道(track)、扇区(Sector)和柱面(Cylinder)的概念:
当磁盘旋转时,磁头若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道(track)。这些磁道用肉眼是看不到的,磁盘上的信息便是沿着这样的轨道存放的。
盘片上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区,每个扇区存放512个字节的信息,磁盘驱动器在向磁盘读取和写入数据时,都是以扇区为单位。
柱面:磁盘通常由一组盘片构成,不同盘片相同半径的磁道所组成的圆柱称为柱面。每个盘面都被划分为数目相等的磁道,并从外缘的“0”开始编号。磁道与柱面都是表示不同半径的圆,在许多场合,磁道和柱面可以互换使用。
如下图所示:
通过以上这些参数可以得到硬盘的容量,基计算公式为:存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数
注意:早期的磁盘,每个磁道上的扇区数目是一样的,如下图所示:
越往外,扇区的面积也就越大。每个扇区的数据量是相同的,都是512字节。所以,外面扇区的数据密度低,里边扇区的数据密度高。
但是这样在外围扇区上,就浪费了大量面积,限制了磁盘的容量。后来为了增大磁盘容量,采用了线性寻址的新技术。每个磁道上扇区数变得不一样了,越往外磁道的扇区数目越多。现在的磁道扇区数目是一个换算平均值。如下图:
另外:当向硬盘中写入数据时,是先写入最外层的磁道,写满所有扇区之后,在向内层磁道写入。这就是为什么硬盘用久了,读写速度会变慢的原因。因为同样的角速度下,线速度越往外越快。
同样的时间,磁头在外面磁道可以扫过10个扇区的面积,读写10个扇区的数据,但在里面的磁道只能扫过1个扇区的面积,读写1个扇区的扇区。所以,此时可以做磁盘整理或者格式化,这样外面的磁道得到试用。
二:分区
主引导记录(Master Boot Record,MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,它存储在0号盘面的0号磁道的1号扇区上。系统在启动时主动去读取这个区块的内容,这样系统才会知道你的程序放在哪里且该如何进行启动。
在总共512字节的扇区中,MBR只占用了其中的446个字节,另外的64个字节记录了硬盘分区表(Disk Partition Table,DPT),最后两个字节“55”和“AA”,是分区的结束标志。它们共同组成了硬盘的主引导扇区。
64字节的硬盘分区表可以保存四个分区的信息,因此,所谓的“分区”,只是针对这64字节的分区表进行配置而已!
每个分区的信息占16个字节,其中记录了该分区开始和结束的磁道(柱面)号。也就是说,分区的最小单位是磁道(柱面)。这4个分区,可以称为主要分区或扩展分区。
所以对于采用MBR型分区结构的硬盘,最多只能识别4个主要分区。如果需要得到更多的分区,就需要使用扩展分区。扩展分区也是主要分区的一种,但它与主要分区的不同在于,扩展分区可以划分为无数个逻辑分区。
在Linux系统中,分区命名为sda1-sda4或者hda1-hda4(其中a表示硬盘编号可能是a、b、c等等)。在MBR硬盘中,分区号1-4是主分区(或者扩展分区),逻辑分区号只能从5开始。
在MBR分区表中,一个分区最大的容量为2T,且每个分区的起始柱面必须在这个disk的前2T内。若有一个3T的硬盘,根据要求至少要把它划分为2个分区,且最后一个分区的起始扇区要位于硬盘的前2T空间内。如果硬盘太大则必须改用GPT分区方式。
GPT磁盘分区样式支持最大分区为128 EB(Exabytes),并且磁盘的分区数没有上限,只受到操作系统限制。
三:文件系统
磁盘分区完毕后还需要进行格式化,之后操作系统才能够使用这个分区。因为每种操作系统所配置的文件属性/权限并不相同,为了存放这些文件所需的数据,因此需要将分区进行格式化,以成为操作系统能够利用的文件系统格式。
因此,每种操作系统能够使用的文件系统并不相同。比如:Windows使用NTFS文件系统,Linux使用ext4文件系统等。默认的情况下,Windows系统不会识别 Linux的Ext4的。
1:inode、block、硬链接、软链接
一般而言,一个分区只能够被格式化成为一个文件系统。
在Linux的文件系统中,除了文件的实际内容外,还包含很多文件属性,如文件权限、所有者、创建时间、修改时间、文件大小等。通常会将文件内容和文件属性两部份的数据分别存放在不同的区域。文件属性放置到 inode 中,实际数据则放置到block中。
另外,还有一个super block会记录整个文件系统的整体信息,比如inode和data block 的总量、使用量、剩余量,以及文件系统的格式与相关信息等。
每个inode与block都有编号。一个文件占用一个inode。除了记录文件属性之外,inode中还记录此文件的数据所在的block号; block存储文件的实际内容,每个block 内最多只能够放置一个文件的数据;若文件太大,会占用多个block。
如下图所示,文件系统先格式化出inode与block的区块,假设某一个文件的属数据放置在4号inode 内,而这个inode记录了文件数据的实际放置点为2,7,13,15这四个block中。这种数据存取的方法称为索引式文件系统(indexed allocation),Linux的文件系统就采用这种方式:
文件系统一开始就将 inode 与 block 规划好了,除非重新格式化(或者利用 resize2fs 等命令变更文件系统大小),否则 inode 与 block 固定后就不再变动。
另外,文件系统在格式化的时候基本上是分为多个柱面组的,每个柱面组都有独立的 inode/block/superblock 系统。
而且,还有一个block bitmap (区块对照表),该表记录了block的状态,比如哪些block是未使用的,哪些是已使用的。inode同样有一个记录inode状态的inodemap,记录那些inode是未使用的。
每个区段与 super block 的信息都可以使用 dumpe2fs 这个命令来查询!
如下图,表示一个分区的结构图:
inode是固定长度的记录项,包含文件的大部分信息。
另外,当创建一个目录时,会分配一个inode与至少一块block给该目录。其中,inode 记录该目录的相关权限与属性,并记录该目录分配到的那块block号码;而block则是记录,在这个目录下的,所有文件的文件名,以及该文件的inode号。结构图如下:
目录的block存储目录项,目录项包含该目录下,所有文件的文件名和inode号。通过inode号,就可以得到该文件的实际内容。
上图中,有两个目录项指向同一个inode。每个inode都有一个链接计数,其值是指向该inode的目录项数。只有当链接计数为0时,才可以删除文件。
这也是硬链接的基本原理。多个目录项对应到同一个 inode 号上,就是硬链接了。因此,一般来说,使用硬链接,磁盘的空间与inode的数目都不会改变!硬链接的限制有:不能跨文件系统;不能链接目录。
而软链接,就是在创建一个独立的文件,该文件的实际内容(数据块)中,包含了它所指向的文件的名字。
使用ln命令,可以创建硬链接或软链接。
2:挂载
Linux内的所有数据都是以文件的形态来呈现的,所有文件组成一个树状的层次结构,该结构以”/”为根目录。如下图所示:
这种树状层次结构,是如何与硬盘内的数据结合呢?这就是“挂载”(mount)了。
所谓的“挂载”,就是用一个目录作为进入点,将磁盘分区的数据放置在该目录下;也就是说,进入该目录就可以读取该分区的内容。这个动作称为“挂载”,进入点的目录称为“挂载点”。
整个Linux系统最重要的是根目录,因此根目录一定需要挂载到某个分区。其他的目录则可依需求,挂载到不同的分区。如下图:
四:命令
针对一个全新的硬盘,需要采取以下动作才能使用:
a:对磁盘进行分区;
b:对该分区进行格式化,以创建系统可用的文件系统;
c:若想要仔细一点,则可对刚刚创建好的文件系统进行检验;
d:在 Linux 系统上,创建挂载点,并将文件系统挂载上来;
1:分区
fdisk命令用于对磁盘进行分区操作,比如列出磁盘分区信息,增加分区,删除分区等。
通过fdisk -l命令,可以列出所有的磁盘信息;若要针对某块磁盘操作,则直接在fdisk后跟磁盘名即可:
# fdisk /dev/hdcThe number of cylinders for this disk is set to 5005.There is nothing wrong with that, but this is larger than 1024,and could in certain setups cause problems with:1) software that runs at boot time (e.g., old versions of LILO)2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK)Command (m for help):
注意,fdisk后跟的是磁盘名,而非分区名, 因此在/dev/hdc后无需加数字,否则会出错。 输入m后,可以列出所有帮助信息。
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 <==删除一个partition l list known partition types m print this menu n add a new partition <==新增一个partition o create a new empty DOS partition table p print the partition table <==在屏幕上显示分割表 q quit without saving changes <==不储存离开fdisk程序 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)
2:格式化
mkfs命令用来对分区进行格式化。该命令实际上是一个命令集合:
root@ubuntuhh:~# mkfs[Tab][Tab]mkfs mkfs.cramfs mkfs.ext3 mkfs.ext4dev mkfs.minix mkfs.ntfs mkfs.bfs mkfs.ext2 mkfs.ext4 mkfs.fat mkfs.msdos mkfs.vfat
使用mkfs -t ext3,实际上调用的是mkfs.ext3
3:挂载
mount命令就是用于将文件系统挂载到树状层级结构中,而umount命令则相反,用于解除挂载。
mount的标准用法是:mount –t type device dir
该命令,将类型为type,device上的文件系统,attach到dir上。dir之前的内容、拥有者以及访问模式等都不再可见。
自Linux2.4.0开始,允许将某些目录remount到其他目录上:mount--bind olddir newdir。执行上述命令后,同样的内容会出现在两个目录上,比如:
[root@hh ~]# mount --bind / /root/testdir2[root@hh ~]# ls /root/testdir2bin data lib misc proc salt-syndic.log sys zabbixboot dev lib64 mnt redis-3.0.5 sbin tmpcache etc lost+found net redis-3.0.5.tar.gz selinux usrcgroup home media opt root srv var
可见/root/testdir2的内容跟/一样了。甚至可以将单个文件remount到单个文件上。
[root@hh testdir]# touch 1.txt[root@hh testdir]# touch 2.txt[root@hh testdir]# mount --bind 1.txt 2.txt[root@hh testdir]# echo "hello, world" > 1.txt [root@hh testdir]# cat 2.txt hello, world
此时查看mount的输出:
[root@hh testdir]# mount/dev/mapper/vg_hh-lv_root 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).host:/ on /mnt/hgfs type vmhgfs (rw,ttl=1)vmware-vmblock on /var/run/vmblock-fuse type fuse.vmware-vmblock (rw,nosuid,nodev,default_permissions,allow_other)/ on /root/testdir2 type none (rw,bind)/root/testdir/1.txt on /root/testdir/2.txt type none (rw,bind)
但是,--bind只能处理单一文件系统,也就是说,如果olddir中的子目录存在submount的情况,则bind不会连同submount一起bind。比如,在上面例子的情况下:
[root@hh ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev/mapper/vg_hh-lv_root 27G 8.8G 17G 36% /tmpfs 747M 72K 747M 1% /dev/shm/dev/sda1 485M 63M 397M 14% /boot.host:/ 201G 105G 96G 53% /mnt/hgfs [root@hh ~]# ll testdir2/boottotal 0[root@hh ~]# ls /bootconfig-2.6.32-431.el6.x86_64 initramfs-3.8.13-16.2.1.el6uek.x86_64.img System.map-3.8.13-16.2.1.el6uek.x86_64config-3.8.13-16.2.1.el6uek.x86_64 lost+found vmlinuz-2.6.32-431.el6.x86_64efi symvers-2.6.32-431.el6.x86_64.gz vmlinuz-3.8.13-16.2.1.el6uek.x86_64grub symvers-3.8.13-16.2.1.el6uek.x86_64.gz
可见,/boot中的内容,并没有mount到/root/testdir2/boot目录下。如果希望submount一起挂载的情况,可以使用--rbind选项:
[root@hh ~]# umount /root/testdir2[root@hh ~]# ll testdir2total 0[root@hh ~]# mount --rbind / /root/testdir2[root@hh ~]# ls /root/testdir2bin data lib misc proc salt-syndic.log sys zabbixboot dev lib64 mnt redis-3.0.5 sbin tmpcache etc lost+found net redis-3.0.5.tar.gz selinux usrcgroup home media opt root srv var[root@hh ~]# ls /root/testdir2/bootconfig-2.6.32-431.el6.x86_64 initramfs-3.8.13-16.2.1.el6uek.x86_64.img System.map-3.8.13-16.2.1.el6uek.x86_64config-3.8.13-16.2.1.el6uek.x86_64 lost+found vmlinuz-2.6.32-431.el6.x86_64efi symvers-2.6.32-431.el6.x86_64.gz vmlinuz-3.8.13-16.2.1.el6uek.x86_64grub symvers-3.8.13-16.2.1.el6uek.x86_64.gzinitramfs-2.6.32-431.el6.x86_64.img System.map-2.6.32-431.el6.x86_64
可见,/boot已经mount到/root/testdir2/boot下了。
自linux2.5.1开始,允许将一个mount点移动到其他地方,使用以下命令即可:mount--move olddir newdir
proc文件系统不与任何设备关联,当挂载它时,可以指定任意字符串,比如proc,来表示一个设备。(不要使用none,否则umount时可能会有歧义)。
umount命令用于detach设备上的文件系统与树状文件层级的关联。可以通过文件系统的mount点,除了当该设备mount到多个目录上时,也可以通过给定设备来执行mount。
4:/etc/fstab和/etc/mtab
系统启动时,会根据/etc/fstab文件进行挂载。
/etc/fstab文件记录了各种文件系统的信息,每一行描述了一个文件系统。行中的字段以tabs或者空格进行分隔。以’#’开头的行是注释行。该文件中的行顺序很重要,因为fsck、mount和umount命令都是顺序遍历该文件进行工作的。
第一个字段,表示设备;第二个字段表示文件系统的mount点;第三个字段表示文件系统的类型;第四个字段表示文件系统的挂载选项;第五个字段用于dump命令,判断该文件系统是否需要dump,如果该字段为0,则表示无需dump;第六个字段用于fsck命令,决定在系统启动时文件系统的检查顺序。
文件/etc/fstab中,每行描述了哪些设备,使用什么选项,mount到哪个目录上。该文件通常用在以下三种场景下:
a:命令mount -a[-t type] [-O optlist],该命令会根据fstab文件中(合适的type,或者options)中的内容,进行mount,除了那些包含noauto关键字的行。使用-F选项,可以使得mount并行处理。
b:当用mount命令,处理在fstab中记录的某个文件系统时,可以仅给出设备,或者挂载点即可。
c:一般情况下,只有超级用户可以mount文件系统,但是,如果fstab文件中的某行包含user选项,则任何用户可以挂载相应的文件系统。
因此,比如文件中有内容:/dev/cdrom /cd iso9660 ro,user,noauto,unhide,则任何用户都可以将CDROM中上的iso9660文件系统进行挂载,直接使用以下命令即可:mount /dev/cdrom 或 mount /cd
只有执行mount的用户才可以进行umount,如果希望所有用户都可以umount则可以在fstab中,使用users来代替user。
mount和umount在文件/etc/mtab中,维护当前挂载的文件系统情况。如果mount命令不加任何参数,则该命令会打印出该文件中内容。
参考:
http://vbird.dic.ksu.edu.tw/linux_basic/0230filesystem_3.php
http://blog.csdn.net/badbad_boy/article/details/4313645
https://www.zhihu.com/question/20537787
http://vbird.dic.ksu.edu.tw/linux_basic/0230filesystem_1.php
- 磁盘、分区、文件系统
- linux 磁盘,分区,文件系统,挂载点。
- 磁盘的分区与文件系统
- linux中磁盘的分区,文件系统的创建,挂载
- 磁盘结构,原理,MBR,文件系统,分区,swap,加密,raid,配额
- 磁盘 分区
- 磁盘文件系统
- 磁盘文件系统
- 从零开始学习Linux 基础(二)—磁盘、分区与文件系统
- 大容量磁盘应用ext4文件系统分区与格式化(与ext3不同哦)
- linux下磁盘进行分区、文件系统创建、挂载和卸载
- 磁盘及文件系统管理(分区,挂载,卸载,信息展示与统计)
- LINUX 新增的磁盘不建立分区,直接建立文件系统并挂载怎么办?
- RHCE——向Linux系统添加磁盘、分区和文件系统
- linux 磁盘管理四部曲——(2)管理分区,文件系统类型格式化
- 该磁盘不能被分区,因为不能移动某些文件/未能修改分区图,因为文件系统验证失败
- 该磁盘不能被分区,因为不能移动某些文件/未能修改分区图,因为文件系统验证失败
- Linux磁盘列阵分区
- 2016蓝桥杯假期任务之《买不到的数目》
- G-数列有序!
- 把Java数组转换为List时的注意事项
- iOS开发之按钮重复点击取消响应事件优化
- 这些天关于Socket的一些心得
- 磁盘、分区、文件系统
- JSON 之 SuperObject(9): TSuperType
- huhx的android封神之路-------->Activity的生命周期
- Web中frame嵌套页面应用
- 实现让元素看不到的几种方式
- JSON 之 SuperObject(10): Merge、Clone、ForcePath
- H-进制转换
- Sublime Text3注册及汉化(支持Windows、MAC OS)
- 关于多线程和服务器