Linux磁盘和文件系统

  当我们拿到一块全新的磁盘的时候,我们并不能直接使用,而是需要经过分区、格式化、挂载后,才能被操作系统识别并写入和读取数据。不同的操作系统的文件系统有所不同,因此对磁盘的划分方式也不一样。

一.磁盘

1.结构

  在计算机领域,磁盘是现在使用最多、性价比最高的存储介质。随着存储技术的不断发张,磁盘又分为机械硬盘和固态硬盘。机械硬盘主要由:盘片、磁头、盘片转轴和磁头控制器、数据转换器、接口等几部分组成。数据存储在盘片上,在电机的带动下盘片高速旋转,每个盘片的存储面上有一个磁头,磁头负责对盘片上数据的写入和读取。因此,电脑突然断电会使得正在写入的文件完整性被破坏,日常使用中应该防止电脑突然断电。
磁盘结构如图所示:
Linux磁盘和文件系统
磁头:(head) 负责读取和写入数据到盘片上,每一个盘面对应一个磁头
磁道:(track) 把磁盘划分为许多同心圆,从外到里依次编号为0-1023
扇区:(sector) 把磁道划分为很多扇区,是为磁盘的最小存储单元,每一个扇区为512bytes
柱面:(cylinder) 同一磁盘的所有盘片圆心都在转轴上,每一个盘面的相同编号磁道共同组成柱面,例如所有盘面的0磁道组成了0柱面。

2.磁盘的寻址方式

  磁盘的寻址方式可分为CHS和LBA。
CHS

采用24bit寻址,因此最大寻址空间为2^24*512byte=8GB
地址的前10bit表示柱面(cylinder),因此柱面的最大数量为:2^10=1024  
中间8bit为磁头(head),磁头数等于盘面数,最大盘面数为:2^8=256
最后6bit为扇区(sector),每一磁道可划分的扇区数为2^6=64  

LBA

  LBA是一个整数,通过转换成CHS格式完成磁盘具体寻址,采用48bit寻址,因此最大空间支持128PB

因此,当磁盘容量小于8GB时,使用CHS或LBA寻址方式都可以。但磁盘容量大于8GB时,只能使用LBA寻址方式。

二.磁盘分区

  对磁盘的结构和寻址方式有了一定了解以后,接下来我们就可以对磁盘进行分区了。

1.分区方式

分区方式包括:MBR和GPT
MBR

  MBR:Master Boot Record,于1982年发布,使用32bit标识扇区数,最大分区为2T,按柱面划分。其中整块磁盘的第0磁道第0扇区记录了OS引导程序和分区信息,因此这一块扇区对整块磁盘是很重要的。

 0磁道0扇区:512bytes
            446bytes:boot loader
            64bytes:分区表,每16bytes标识一个分区,因此MBR最多可划分为
                            4个主分区或者3主分区+1扩展(扩展可分为n个逻辑分区)  

GPT

  GPT:GUID partition table 支持128个分区,无主次之分。采用128bit表示磁盘和分区GPT分区表,自动备份在头和尾,相比于MBR而言,GPT可以适应更大级别的数据量和具有分区信息备份功能。

2.linux中的分区方法

  在linux系统中,对SCSI、SATA、SAS接口的硬盘都命名为sd,后面跟上a,b,c,d…来命名,同一块银盘的不同分区则词用1,2,3…来区别命名。
lsblk

lsblk命令用于列出块设备信息,查看磁盘是够已经被OS识别。
[root@centos7~]#lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  200G  0 disk 
├─sda1   8:1    0    1G  0 part /boot
├─sda2   8:2    0   50G  0 part /
├─sda3   8:3    0   30G  0 part /data
├─sda4   8:4    0    1K  0 part 
└─sda5   8:5    0    3G  0 part [SWAP]
sdb      8:16   0   20G  0 disk 
sr0     11:0    1  3.7G  0 rom  /media/cdrom

parted

parted命令用于对磁盘分区的划分,其操作都是实时生效的,因此使用的时候应该慎重。
parted /dev/sdb mklabel gpt|msdos  指定磁盘为MBR或GPT
parted /dev/sdb print              打印磁盘分区信息到屏幕上
parted /dev/sdb mkpart primary     创建分区,默认单位为M
parted /dev/sdb rm 1               删除分区 1

fdisk和gdisk

gdisk是一个类fdisk的GPT分区工具,其使用方法和fdisk一样
fdisk -l [-u] [device] 查看分区
fdisk /dev/sda 之后将进入交互界面
fdisk子命令:
   p 分区列表 
   t 更改分区类型 
   n 创建新分区 
   d 删除分区 
   v 校验分区 
   u 转换单位 
   w 保存并退出 
   q 不保存并退出

分区完成后,需要通过以下命令同志内核重新读取硬盘分区表

查看内核是否已经识别新的分区:

cat /proc/partitions

centos6通知内核重新读取硬盘分区表

新增分区用
partx -a /dev/DEVICE
kpartx -a /dev/DEVICE -f: force
删除分区用
partx -d --nr M-N /dev/sdb

CentOS 5,7: 使用partprobe
partprobe /dev/sdb

三.文件系统
  文件系统是操作系统用于明确存储设备上的文件和数据结构,负责管理和存储数据的软件结构。不同的操作系统有不同的文件系统,以下是linux中常见的文件系统:

  ext2:适用于那些分区容量不是太大,更新也不频繁的情况,例如 /boot 分区。
   ext3:是 ext2 的改进版本,其支持日志功能,能够帮助系统从非正常关机导致的异常中恢复。它通常被用作通用的文件系统
   ext4:是 ext 文件系统的最新版。提供了很多新的特性,包括纳秒级时间戳、创建和使用巨型文件(16TB)、最大1EB的文件系统,以及速度的提升
   xfs:SGI,支持最大8EB的文件系统
   swap: linux中的交换内存,采用一块硬盘分区作为swap分区,物理内存会将使用频率不高的文件放到swap中。

为新分区创建文件系统

mkfs

mkfs.FS_TYPE /dev/DEVICE 其中FS_TYPE为文件系统
mkfs -t FS_TYPE /dev/DEVICE 也可以用-t后面加上文件系统
    -L : 设定卷标

mke2fs

mke2fs是ext系列文件系统专用管理工具
-t {ext2|ext3|ext4} 指定文件系统
-b {1024|2048|4096} 指定分区中一个块的大小
-L 'LABEL'          指定卷标
-j: 相当于 -t ext3
-i #: 为数据空间中每多少个字节创建一个inode;此大小不应该小于block的大小
-N #:指定分区中创建多少个inode
-I :单个inode记录占用的磁盘空间大小,128---4096
-m #: 默认5%,为管理人员预留空间占总空间的百分比
-O FEATURE[,...]:启用指定特性
-O ^FEATURE:关闭指定特性

tune2fs

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

四.挂载

  当我们完成了对硬盘创建文件系统之后,最后一步挂载之后我们就可以愉快的使用新硬盘了。

挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为

mount

mount 查看当前已挂载的所有设备
mount DEVICE MOUNT_POINT 
其中DEVICE为要挂载的设备。
       1.设备文件,例如/dev/sdb2
       2.卷标,例如-L '/mnt/sda1'
       3.UUID,设备的唯一标识,128bit
MOUNT_POINT为挂载点,一般为一个空文件夹。

mount常用命令选项
-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   

卸载

umount DEVICE
umount MOUNT_POINT

以上命令的挂载在系统重启之后会失效,永久挂载的话需要把挂载信息写入/etc/fstab中

/etc/fstab每行定义一个要挂载的文件系统,每一列则为不同的选项。

tmpfs                   /dev/shm                                  tmpfs   defaults        0 0  
1                         2                                                    3        4                5 6

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

完成以上几部,我们就可以愉快的使用新硬盘了,但对于硬盘更高级的挂载和文件系统的设置,使得硬盘上的数据更加安全,则需要更深入的学习和掌握。