0.目录
1.创建分区
1.1 MBR
磁盘的最前端,即0号磁道,0号扇区(sector)称为MBR(Master Boot Record)。组成如下:
- Bootloader
MBR的前446字节是Bootloader,用来引导操作系统启动。 - 分区表
之后的64字节为分区表,每16个字节标识一个分区,所以一个磁盘最多划分为4个主分区。
若需划分4个以上的分区,可使用扩展分区。扩展分区指向磁盘中的某段空间,在这段空间中可标识各逻辑分区。逻辑分区可以像主分区一样格式化、挂载。
不论主分区有多少,只要使用逻辑分区,它的编号都是从5开始,1-4是主分区使用的。 - magic number
魔数,占2字节。用来标识当前MBR是否有效。
1.2 命令fdisk
命令fdisk,用于管理磁盘分区。
选项“-l”,列出指定磁盘上的分区情况,如不指定参数则列出所有分区。
[root@localhost ~]# fdisk -l /dev/sda
Disk /dev/sda: 85.9 GB, 85899345920 bytes
255 heads, 63 sectors/track, 10443 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: 0x00093481
Device Boot Start End Blocks Id System
/dev/sda1 * 1 64 512000 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 64 10444 83373056 8e Linux LVM
其中Boot项下带“*”的表示,操作系统安装在该分区;Start表示分区的起始柱面号,End为其结束柱面号1;Blocks为分区的块数量;Id用来标识该分区的类型。
管理分区只需直接跟指定设备即可,fdisk是交互式的,使用m键可查看各功能。
[root@localhost ~]# fdisk /dev/sda
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)
按键 | 意义 |
---|---|
n | 创建新分区 |
d | 删除分区 |
t | 更改分区类型(即system Id) |
l | 列出所有支持的分区类型 |
w | 保存退出 |
q | 不保存退出,即放弃本次修改 |
p | 效果同fdisk -l |
1.3 实际创建、更改分区过程
1.3.1 创建分区、更改分区类型
1、在/dev/sdb创建一个3G大小的主分区:
[root@local ~]# fdisk /dev/sdb
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): n # 新建
Command action
e extended
p primary partition (1-4)
p # 指定为主分区
Partition number (1-4): 1 # 分区编号
First cylinder (1-13054, default 1): # 该分区的第一个柱面的编号,直接回车表示使用默认
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-13054, default 13054): +3G # 指定该分区使用多少柱面,或直接指定其大小
2、其余空间分配给一个扩展分区:
Command (m for help): n
Command action
e extended
p primary partition (1-4)
e # 指定为扩展分区
Partition number (1-4): 2 # 分区编号
First cylinder (394-13054, default 394):
Using default value 394
Last cylinder, +cylinders or +size{K,M,G} (394-13054, default 13054):
Using default value 13054 # 扩展分区大小默认使用所有剩余空间
3、在此扩展分区上创建一个5G大小的逻辑分区:
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l # 指定创建逻辑分区。不论主分区有多少,逻辑分区的编号默认从5开始
First cylinder (394-13054, default 394):
Using default value 394
Last cylinder, +cylinders or +size{K,M,G} (394-13054, default 13054): +5G
4、查看目前已创建的分区:
Command (m for help): p
Disk /dev/sdb: 107.4 GB, 107374182400 bytes
255 heads, 63 sectors/track, 13054 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: 0x6f7a5b9a
Device Boot Start End Blocks Id System
/dev/sdb1 1 393 3156741 83 Linux
/dev/sdb2 394 13054 101699482+ 5 Extended
/dev/sdb5 394 1047 5253223+ 83 Linux
5、由Id可知各分区类型。现把sdb5更改为swap类型:
Command (m for help): t
Partition number (1-5): 5
Hex code (type L to list codes): 82 # swap类型对应的编码为82
Changed system type of partition 5 to 82 (Linux swap / Solaris)
6、再次查看,保存退出:
Command (m for help): p
Disk /dev/sdb: 107.4 GB, 107374182400 bytes
255 heads, 63 sectors/track, 13054 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: 0x6f7a5b9a
Device Boot Start End Blocks Id System
/dev/sdb1 1 393 3156741 83 Linux
/dev/sdb2 394 13054 101699482+ 5 Extended
/dev/sdb5 394 1047 5253223+ 82 Linux swap / Solaris
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
1.3.2 内核识别创建、更改的分区
使用命令fdisk创建分区完成,并不意味着内核已识别这些分区。文件/proc/partitions中显示的各分区,才是内核已经真正识别的分区。
如何让内核立即识别新创建的分区?
使用命令partx,其“-a”选项表示立即识别所有分区。之后再查看/proc/partitions进行验证,如执行该命令,提示系统忙,导致分区仍未被识别,则可多次执行该命令2。
分区被内核识别后方可进行后续的格式化操作。
2.格式化——以ext文件系统为例
2.1 创建各文件系统的命令
格式化分区,即在磁盘分区上创建文件系统。
命令mkfs.文件系统类型,后跟对应分区。即表示把指定分区格式化为对应的文件系统类型。
所以输入“mkfs”,使用命令补全,即可看到系统支持的所有这类命令,由此也可知系统当前支持哪些文件系统类型。
[root@local ~]# mkfs
mkfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.ext4dev mkfs.msdos mkfs.vfat
这些命令也可以统一起来,使用“mkfs -t 文件系统类型”来创建指定的文件系统。
2.2 创建、管理ext文件系统
上述的命令mkfs就可以创建ext系列文件系统,不过ext系列文件系统有自己的专用的更强大的工具。
2.2.1 创建
命令mke2fs,用于创建ext系列文件系统。
- 选项“-t”,指定要创建的文件系统类型,ext2、ext3、ext4。若不指定,默认为ext4。
- 选项“-b”,指定文件系统的块大小(1K、2K、4K),默认是4K。
- 选项“-L”,指定卷标。
- 选项“-j”,表示创建有日志(journal)功能的文件系统。实际的意思是创建ext3文件系统,因为相对于ext2,ext3引入了日志功能。
- 选项“-i”,指定每多少字节创建一个inode3。
- 选项“-N”,比“-i”好理解,该选项表示直接指定要创建的文件系统有多少个inode。
- 选项“-m”,指定预留给管理员使用的空间4。默认比例是5%。
- 选项“-O”,以某种特性创建文件系统。比如“has_journal”表示创建带日志的文件系统,意义同选项“-j”;使用脱字符表示取消某种特性进行创建(有的属性是默认的,不专门取消则表示启用)。更多特性详见man手册。
创建一个ext4文件系统(默认),块大小为4K(默认),卷标为sdb1的文件系统的命令即显示信息:
[root@local ~]# mke2fs -t ext4 -L sdb1 -b 4096 /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
Filesystem label=sdb1 # 卷标
OS type: Linux # 分区类型
Block size=4096 (log=2) # 块大小
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
197600 inodes, 789185 blocks # inode数量,块数量
39459 blocks (5.00%) reserved for the super user # 供管理员使用的保留空间
First data block=0
Maximum filesystem blocks=809500672
25 block groups # 包含25个块组
32768 blocks per group, 32768 fragments per group
7904 inodes per group # 每个块组inode数量,块数量
Superblock backups stored on blocks: # 超级块备份信息存储在哪些块
32768, 98304, 163840, 229376, 294912
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
2.2.2 修改
命令e2label,显示、修改ext文件系统卷标。
接上例,显示、修改设备/dev/sdb1的卷标:
[root@local ~]# e2label /dev/sdb1 # 显示
sdb1
[root@local ~]# e2label /dev/sdb1 mydata # 修改为mydata
[root@local ~]# e2label /dev/sdb1
mydata
命令tune2fs,修改一个ext文件系统的可调整的属性5。其各选项可类比命令mke2fs。
- 选项“-l”,显示指定文件系统superblock的信息。
- 选项“-j”,ext2文件系统升级到ext3,不会影响其中的数据。
- 选项“-L”,修改卷标。
- 选项“-m”,调整预留给管理员的空间的百分比。
选项“-O”,同mke2fs的“-O”,表示开启或关闭文件系统的某种特性(特性前加脱字符表示关闭)。超级块信息中的features即为文件系统当前开启的特性,其意义可在man手册中查看。
[root@local ~]# tune2fs -l /dev/sdb1 | grep features Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
选项“-o”,开启或关闭某种默认挂载选项(在挂载选项前加脱字符表示关闭)。超级块信息中的mount options的内容即为文件系统的默认挂载选项。
[root@local ~]# tune2fs -l /dev/sdb1 | grep "mount options" Default mount options: (none)
若后跟acl,可用于调整文件系统上的文件是否支持访问控制列表等等:
[root@local ~]# tune2fs -o acl /dev/sdb1 tune2fs 1.41.12 (17-May-2010) [root@local ~]# tune2fs -l /dev/sdb1 | grep "mount options" Default mount options: acl
其他挂载选项可在man手册查看。
2.2.3 检查修复
命令fsck,用于检查、修复文件系统6。这个命令是通用的,并非ext文件系统专有的命令。
- 选项“-t”,因为是通用的,所以要指明文件系统类型。
- 选项“-a”,无需与用户交互,自动修复所有文件系统。
这个选项看上去很方便,但效果未必好。比如一个文件快写完时,正好断电了。再次开机如果都修复的话,系统会把未完成的文件都删除(包括已经写过的部分),其实文件系统修复的意思就是把未完成的文件删除。这样对于一个本来快写完的文件,反而增加了更多麻烦。
命令e2fsck,则是ext文件系统专用的文件系统检测修复命令。
- 选项“-y”,对所有问题都使用yes。
- 选项“-f”,即使文件系统没有问题,也进行检测7。
命令blkid,查看设备属性,后直接跟设备名即可。
[root@local ~]# blkid /dev/sdb1
/dev/sdb1: LABEL="mydata" UUID="fb73508b-afbe-48a6-bb6f-b9cd866e37ff" TYPE="ext4"
实际上,引用一个设备,既可以使用其设备文件,也可使用LABEL或UUID。
选项“-L”,表示根据指定的卷标,查找该卷标对应的设备。
[root@local ~]# blkid -L mydata /dev/sdb1
选项“-U”,根据UUID,查找该UUID对应的设备
3.文件系统挂载、卸载
一个格式化之后的设备,若要被访问,必须与系统上的某个存在的目录关联起来。关联过程称为挂载,这个目录称为挂载点。
作为挂载点的目录下如果本来有文件,那么作为挂载点后这些文件会被隐藏8。
命令mount,用于挂载一个文件系统。
不加任何选项和参数,可显示当前系统所有已挂载的文件系统:
[root@local ~]# 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/sda3挂载到了根目录,文件系统类型为ext4,挂载选项为读写。
当该命令后跟设备文件9和挂载点时,即可起到挂载的作用:
[root@local ~]# mkdir /mydata
[root@local ~]# mount /dev/sdb1 /mydata
[root@local ~]# mount | grep sdb1
/dev/sdb1 on /mydata type ext4 (rw)
各选项:
- 选项“-a”,表示立即根据/etc/fstab中的内容进行挂载,对其中已经挂载的文件系统没有影响。
- 选项“-r”,表示进行只读挂载。挂载后的文件系统只能读,不能写。比如光盘就只能进行只读挂载,其他设备可根据需要而定。
- 选项“-w”,表示进行读写挂载。默认的挂载就是读写挂载。
- 选项“-n”,默认情况下,挂载与卸载文件系统的信息,会在/etc/mtab中显示10。选项“-n”表示挂载时不写入/etc/mtab中。
选项“-o”,挂载时可设置挂载特性,在选项“-o”后跟对应特性即可。
常用特性如下:名称 意义 sync/async 用于指定挂载的文件系统,在有进程访问它时,采用同步写入还是异步写入11。 atime/noatime 用于指定挂载的文件系统,在其上的文件被访问时是否立即更新atime12。 diratime/nodirtime 类似地,指定挂载的文件系统,在其上的目录被访问时是否立即更新atime。目录atime意义不大,一般可关闭。 remount 用于重新挂载文件系统,而不用先卸载,再挂载。 acl/noacl 用于指定挂载的文件系统,在其上创建的文件支持acl,默认不支持。13 -ro、-rw 同命令mount的-r、-w选项 dev/nodev 指定挂载的文件系统上,是否允许创建设备文件 exec/noexec 指定挂载的文件系统上,是否允许运行程序。一个未确定是否安全的设备,最好令其以不能运行程序的方式挂载。 suid/nosuid 指定是否允许挂载的文件系统上,SUID、SGID权限生效。 defaults 使用特性rw, suid, dev, exec, auto, nouser, async, relatime - 选项“-o loop”,把这个区分于上述特性单独列出。它用于挂载本地回环设备。多用于把光盘镜像文件(.ISO、.img等)作为回环设备,这样就可以把某一目录当做入口(即挂载点),访问镜像文件中的内容,而非一定要把镜像刻成光盘。
- 选项“–bind”,用于把一个目录“挂载”到另一个目录。这样同样的内容可在两个路径访问。设备关联至目录,此时变为目录关联至目录。效果看上去像链接文件,但实现机制肯定与链接不一样。
4.swap文件系统
由于内存大小有限,硬盘上应划分空间作为交换分区,当内存占用过多时,可由交换分区周转。交换分区大小一般是实际内存大小的1.5倍。
windows的交换分区用的是C盘;而linux上的交换分区,必须使用独立的文件系统(磁盘分区)。
命令mkswap,用于创建swap分区。
- 选项“-L”,指明卷标
接上例,设备/dev/sdb5的system ID是82,所以可在其上创建交换分区:
[root@local ~]# mkswap -L "my swap" /dev/sdb5
Setting up swapspace version 1, size = 5253216 KiB
LABEL=my swap, UUID=6c6b3fdf-d58f-47eb-b07b-138f5e556d02
创建完成后,可通过命令swapon和swapoff开启或禁用指定的交换分区。参数还是设备文件名、卷标或UUID。
接上例:
[root@local ~]# swapon /dev/sdb5 # 启用
[root@local ~]# free -h
total used free shared buffers cached
Mem: 980M 334M 645M 1.1M 28M 117M
-/+ buffers/cache: 189M 791M
Swap: 6.5G 0B 6.5G
[root@local ~]# swapoff -L "my swap" # 禁用
[root@local ~]# free -h
total used free shared buffers cached
Mem: 980M 331M 649M 1.1M 28M 117M
-/+ buffers/cache: 185M 794M
Swap: 1.5G 0B 1.5G
5./etc/fstab
除根文件系统外,其他文件系统都是不会开机自动挂载的。相关内容可在配置文件/etc/fstab中定义,开机后系统会根据该文件内容,把文件中列出的文件系统挂在到指定目录。
[root@local ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Nov 8 21:20:20 2016
#
# 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=7557f8bf-fd80-430e-b271-62bcf0ca615d / ext4 defaults 1 1
UUID=8ae82228-5875-4476-a9f2-d0d016a19a50 /boot ext4 defaults 1 2
UUID=67dc4e25-3f6e-474c-9a7d-c4dd6f93e574 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
每行记录一个文件系统的挂载信息,共6字段。
各字段意义:
- 设备
设备文件、卷标、UUID均可引用设备。 - 挂载点
注意swap类型的文件系统挂载点是swap。 - 文件系统类型
- 使用的挂载特性
若有多个,使用逗号隔开。 - 转储(备份)频率
0表示从不备份,1表示每天备份一次,2表示每隔1天备份一次等 - 自检次序
定义这些文件系统,开机后的自检次序。
0表示不自检,1表示首先自检,通常首先自检的只能是根文件系统。2表示第二个自检等等。
多个文件系统可同时自检,比如a文件系统和b文件系统都是第2个自检。不过这只会降低效率,效果不如逐个自检。
(完)
- 在centos7之后,这里分别显示的是开始扇区号和结束扇区号。 ↩
- centos 5可使用命令partprobe。 ↩
- inode和存储数据的block要有一个合适的比例。
如果inode过多,则可能出现block用完时,inode还有很多,这些inode所占的空间就会浪费;如果inode过少,则文件系统上能够创建的文件数量就很少,inode用完时剩余的block就会浪费。 ↩ - 一个文件系统创建时,系统会预留一段空间,以便于该分区其他空间被占满时,管理员仍可利用预留的空间进行某些必要的操作。 ↩
- 显然,一个已经创建的文件系统,某些属性就不能再进行变动,如块大小等。 ↩
- 为什么要进行文件系统检查、修复?
进程意外终止、系统崩溃等原因导致写入操作非正常终止时,可能会造成文件损坏,此时应该检测并修复文件系统。建议离线进行(即不要在挂载、或有用户正在访问的情况下检查,如有用户可以先踢掉)。 ↩ - 由此选项可看出,在对文件系统检查、修复前,系统是知道它是否已损坏的,应该是通过文件系统日志吧。 ↩
- 这些文件当然还在磁盘上,只不过无法通过操作系统访问到了。 ↩
- /dev/hd[a-d]#是红帽5上标识IDE设备的设备文件,序号依插槽而定;其他硬盘、U盘是/dev/sd[a-p]#,序号依系统识别各设备次序而定。
红帽6以后,所有硬盘、U盘设备文件都是/dev/sd[a-p]#,序号依系统识别各设备次序而定。
光盘设备一般为/dev/cdrom,/dev/dvd。 ↩ - 命令mount不加任何选项直接使用,显示的结果正是与/etc/mtab中的内容一致。
这也正是查看当前系统上已挂载的文件系统的两种方式。 ↩ - 进程要写入的内容,先到内存,再到磁盘。
同步写入:内存中的数据即时写入磁盘。
异步写入:内存中的数据暂存在内存,不立即写入磁盘。
异步写入的性能要优于同步写入,因为磁盘速度相对内存速度慢得多。 ↩ - 显然,对于一个文件系统上的文件被频繁访问的场景,不立即更新文件atime,可有效提高性能。如web服务器等。 ↩
- 一个不支持acl的文件系统,可令其重新挂载时支持acl。使用“mount -o remount,acl”即可。
该特性也可由命令tune2fs中的“-o”选项进行调整。不过“tune2fs -o”和“mount -o”所能调整的其他功能则并不相同。而且前者调整的文件系统挂载选项会显示在超级块信息中的“mount options”;后者调整的挂载特性会显示在命令mount结果中每行末尾的括号内。 ↩