Linux 笔记 - 第六章 Linux 磁盘管理
一、前言
1.1 硬盘
硬盘一般分为 IDE 硬盘、SCSI 硬盘和 SATA 硬盘。在 Linux 中,IDE 接口的设备被称为 hd,SCSI 和 SATA 接口的设备则被称为 sd。第一块 硬盘被称作 sda,第2块被称作 sdb,以此类推。Linux 规定,一块硬盘上只能存在 4 个主分区,分别被命名为 sda1、sda2、sda3 和 sda4。逻辑分区则从 5 开始标识,每多一个逻辑分区,就在末尾的分区号上加 1。逻辑分区理论上没有数量限制。正是由于 Linux 系统中最多只能创建 4 个主分区,所以当你想多创建几个分区时,那么就应该在创建完第 3 个分区后,创建第四个分区时选择扩展分区,然后,在扩展分区中,再创建逻辑分区,扩展分区并不是真正的分区,而只是概念上的分区,逻辑分区才是实际的分区,且一块硬盘上最多只能创建一个扩展分区,逻辑分区理论上没有数量限制。
一般来说,每个系统都需要一个主分区来引导。每个分区中存放着引导整个系统所必须的程序参数。在 Windows 环境中常说的 C 盘就是一个主分区,它是硬盘的第一个分区,在 Linux 下被称为 sda1。Windows 中的 D、E、F 等属于逻辑分区,对应于 Linux 下的 sda5、sda6、sda7……。操作系统主体可以安装在主分区,也可以安装在逻辑分区,但引导程序必须安装在主分区内。
综上,硬盘分区表 64byte,共分为4组记录区,每一组记录区记录了该区段的起始与结束的磁柱号码,这四组记录就是主要(primary)分区或扩展(extended)分区,所以主要分区加上扩展分区最多只能有四个。由于操作系统(包括 Linux、Windows)的限制,扩展分区最多只能有一个,所以一块磁盘最多可以分为 3 个主分区加 1 个扩展分区,扩展分区的目的是使用额外的扇区来记录磁盘分割信息,扩展分区本身不能格式化。逻辑(logical)分区是由扩展分区持续切割出来的,作为数据存储的分区是主要分区和逻辑分区。逻辑分区的数量依操作系统不同而不同,在linux中,IDE硬盘最多有 59 个逻辑分区(/dev/hda5到/dev/hda63),SATA硬盘则最多有11个逻辑分区(/dev/sda5 到 /dev/sda15)。
1.2 文件系统
Windows 系统格式化硬盘时会指定格式为 FAT32 或者 NTFS,而 Linux 常见的文件系统格式有 Ext2、Ext3 或者 Ext4 等。Ext3 比 Ext2 多了日志功能,可以跟踪记录文件系统的变化,并将变化内容写入日志。当系统崩溃之后,就可以利用日志恢复文件系统,在很大程度上避免了数据的丢失。当系统崩溃之后,就可以利用日志恢复文件系统,在很大程度上避免了数据的丢失。Ext4 支持的最大文件系统容量和单个最大文件大小比 Ext3 都要大。ReiserFS 是 SuSE 默认的文件系统。swap 是交换分区,可以理解为虚拟内存。实际内存不够时,操作系统从内存中取出一部分暂时不用的数据,放在交换分区中。Windows 不会为 swap 单独划分一个分区,而是使用分页文件实现相同的功能。如何将 NTFS 格式的分区挂载到 Linux 下呢,我们可以通过安装 ntfs-3g 软件包来解决这个问题。
1.3 设备文件
/dev 是所有设备文件所在的目录,设备文件格式为 /dev/xxyN。其中,xx:标明分区所在设备的类型,如 hd(IDE 硬盘)或 sd(SCSI 硬盘);y:标明分区所在的设备,如 /dev/hda(第一个 IDE 硬盘)或 /dev/sdb(第二个 SCSI 硬盘);N:这个数字代表分区,前四个分区(主分区或扩展分区)是用数字从1排列到4,逻辑分区从5开始。
二、查看磁盘或者目录的容量
2.1 查看磁盘的容量命令 df -h
df - report file system disk space usage,可以查看已挂载磁盘的总容量、使用容量和剩余容量等。不加选项时,默认单位为 KB。主要选项有 -i、-h、-T、-k 和 -m。其中 -i 表示查看 inodes 使用状况;-T 可以查看文件系统类型;-h 最常用,表示使用合适的单位显示容量,系统会自动判断;-k 和 -m 分别表示以 K 和 M 为单位显示容量。常用格式为: df -h [Filesystem],如果不添加具体的 Filesystem 名称,那么会列出系统所有的分区 。
[root@ryan ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 19G 1.6G 16G 9% /
tmpfs 931M 0 931M 0% /dev/shm
/dev/sda1 190M 35M 145M 20% /boot
/dev/sr0 3.7G 3.7G 0 100% /mnt/cdrom
第1列为分区的名字,第2列为该分区的总容量,第3列为已使用容量,第4列为剩余容量,第5列为已使用容量的百分比,第6列为挂载点。
[root@ryan ~]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 ext4 19G 1.6G 16G 9% /
tmpfs tmpfs 931M 0 931M 0% /dev/shm
/dev/sda1 ext4 190M 35M 145M 20% /boot
/dev/sr0 iso9660 3.7G 3.7G 0 100% /mnt/cdrom
其中,/dev/shm 为内存挂载点,tmpfs 是 Linux/Unix 系统上的一种基于内存的文件系统,tmpfs 可以使用您的内存或 swap 分区来存储文件。iso9660 为光盘的文件系统类型。
2.2 查看目录或文件所占磁盘空间的大小命令 du -sh
du - estimate file space usage,用于查看目录或文件所占磁盘空间的大小,默认单位为 KB。格式为 du [-abckmsh] [文件或者目录名],主要选项有 -a、-b、-k、-m、-h、-c、-s。-a 表示列出全部文件和目录的大小,否则只会列出目录(包含子目录)的大小,而不包含文件的大小;-b、-k、-m 分别表示以 byte、KB、MB为单位输出;-h 表示系统自动调节单位;-c 表示最后加总;-s 表示只列出总和。常用格式为 du -sh filename。
[root@ryan ~]# du -sh /opt
1.1G /opt
综上,统计磁盘分区(即文件系统)的容量大小命令为:df -h;统计文件的实际内容大小命令为:ls -lh;统计目录或者文件占用磁盘空间的大小命令为:du -sh。
三、磁盘的分区
新的磁盘在使用之前需要先分区,语法格式为: fdisk [-l ] [设备名称],但是 fdisk 只能划分小于 2TB 的分区,如果要划分大于 2TB 的分区,则需要使用 GPT 分区格式,可利用 parted 命令来完成分区。不管使用哪种分区程序,我们在 Linux 上给新硬盘建立分区时都要遵循以下的顺序:建立主分区 → 建立扩展分区 → 建立逻辑分区 → 指定文件系统类型,格式化所有分区 → 挂载。
[root@ryan ~]# fdisk -l
Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 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: 0x0008da69
Device Boot Start End Blocks Id System
/dev/sda1 * 1 26 204800 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 26 157 1048576 82 Linux swap / Solaris
Partition 2 does not end on cylinder boundary.
/dev/sda3 157 2611 19717120 83 Linux
[root@ryan ~]# fdisk -l /dev/sda2
Disk /dev/sda2: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 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
进入分区模式:
按 m 进入分区菜单:
上面常用的几个菜单项:
d 删除一个分区;
l 打印分区类型对应的 ID 号;
n 添加一个分区;
p 打印分区表;
q 不保存退出;
w 保存退出。
四、磁盘格式化
磁盘分区好之后,还不能使用,需要对每一个分区进行格式化,其实就是安装文件系统。如 Windows 下有 Fat32 和 NTFS,CentOS 下有 ext2、ext3、ext4 等。
通过查看 /etc/filesystems 文件列出当前系统所支持的所有文件系统类型:
[root@ryan ~]# cat /etc/filesystems
ext4
ext3
ext2
nodev proc
nodev devpts
iso9660
vfat
hfs
hfsplus
可以使用 mke2fs、mkfs.ext2、mkfs.ext3 和 mkfs.ext4 等命令,对分区进行格式话,建议使用 mke2fs 命令,因为它的选项比较多,可以分成 ext2、ext3、ext4 的格式。常用选项有:-b 指定分区时设定每个数据区块占用的空间大小,默认为 4096 bytes,即 4K;-L 预设该分区的标签(Label);-t 用来指定文件系统的类型,如 ext2、ext3、ext4。如 mke2fs -t ext4 /dev/sdb5
命令 e2label 用于查看或修改分区的标签。
五、挂载/卸载磁盘
磁盘分区,然后格式化,此时磁盘已经是一个块设备文件,类型为 b,但是现在还不能直接在该磁盘分区中写入数据,而是先建立一个挂载点,挂载点是以目录的形式出现的。如果挂载点不存在,需要先手工创建挂载点,并且挂载点(目录)下必须是个空目录。如果不是空目录,一旦挂在了新的分区,该目录下以前的数据就看不到了,除非卸载该分区。
5.1 挂载磁盘
mount - mount a filesystem,挂载一个文件系统,如果不加任何选项,直接运行 mount 命令,则显示系统所有分区,挂载点,分区文件系统类型等信息:
[root@ryan ~]# 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/sr0 on /mnt/cdrom type iso9660 (ro)
常用选项还有 -a、-t 和 -o。-a 会挂载 /etc/fstab 中出现的所有磁盘分区;-t 选项用来指定挂载的分区类型,默认不指定会自动识别;-o 选项用来指定挂载的分区有哪些特性,即 /etc/fstab 配置文件中第 4 列的信息。如
[root@ryan ~]# mount /dev/sdb5 /newfolder
表示将分区 /dev/sdb5 挂载到 /newfolder 下,通常第一个参数可以是文件系统,LABEL 或 UUID。
5.2 /etc/fstab 配置文件
此配置文件中显示了系统启动时需要挂载的各个分区。
[root@ryan ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Nov 12 07:40:10 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=3974d6b2-aa5c-4a43-a296-bf3dc70654e9 / ext4 defaults 1 1
UUID=49d563ca-1c80-47bd-8721-ac2323568655 /boot ext4 defaults 1 2
UUID=796cdd24-f311-407c-9fa8-e272e5b5fd66 swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
第1列是分区的表示,可以写分区的 Label、分区的 UUID、也可以写分区名(/dev/sda1);第2列是挂载点;第3列分区的格式;第4列是 mount 的一些挂载参数,一般情况下,直接写 defaults 即可;第5列的数字表示是否被 dump 备份,1表示备份,0表示不备份;第6列的数字表示开机时是否自检磁盘,1和2都表示检测,1比2优先级高,0表示不检测。
也可以将需要挂载的命令写入 /etc/rc.local(此为软链接,实际指向 /etc/rc.d/rc.local 文件),系统启动最后会执行这个文件中的命令,这也就是让一些操作行为随系统启动而自动执行。
5.3 命令 blkid
blkid - command-line utility to locate/print block device attributes,获取分区的唯一标识 UUID,它是真正的唯一标志符,格式为:blkid [filesystem]。
[root@ryan ~]# blkid
/dev/sda3: UUID="3974d6b2-aa5c-4a43-a296-bf3dc70654e9" TYPE="ext4"
/dev/sda1: UUID="49d563ca-1c80-47bd-8721-ac2323568655" TYPE="ext4"
/dev/sda2: UUID="796cdd24-f311-407c-9fa8-e272e5b5fd66" TYPE="swap"
5.4 卸载磁盘
umount - unmount file systems,卸载文件系统,这个命令后可以跟挂载点,也可以跟分区名(如 /dev/hdb1),但是不可以跟 LABEL 和 UUID。如果遇到不能卸载的情况,可以跳转到其他目录,或者使用 umount -l 选项,表示延迟卸载。
六、关于 swap
swap 用来做虚拟内存,虽然 swap 无法代替物理内存,但不可缺少。swap 分区的作用是:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到 swap 空间中,等到那些程序要运行时,再从 swap 中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行 swap 交换。查看当前系统中是否已经启用 swap 分区:cat /proc/swaps。
通常建立 swap 有两种方法:1.建立 swap 分区;2.创建 swap 交换文件。运行速度:物理内存 > swap 分区 > swap 文件。当你的数据盘已经装了很多内容,不方便重新规划的话,也只好使用第二种方法,创建 swap 文件了。如果你只有一块磁盘,而且磁盘已经装了很多内容,所以就不可能再选择对磁盘格式化来给磁盘分区了,而是选择创建 swap 文件的方法。基本步骤是:建立 swapfile → 格式化为 swap 格式 → 启用该虚拟内存。使用 free 命令来查看内存的使用情况,包括物理内存和虚拟内存, -m 选项表示以 MB 为单位显示。
[root@ryan ~]# free -m
total used free shared buffers cached
Mem: 1861 200 1660 0 9 59
-/+ buffers/cache: 131 1730
Swap: 1023 0 1023