简单来说,文件系统就是文件在磁盘上的组织和存储方式。
磁盘设备的使用有三个步骤,第一创建新分区,第二指定文件系统,第三进行挂载。
没有文件系统的设备被称为裸设备。创建文件系统的过程叫做格式化
常见的文件系统fat32,ntfs,是windows所使用的。
ext2,ext3,ext4是linux推荐的文件系统。
不同文件系统支持的分区大小,单个文件大小,日志功能有区别,尤其是性能方面。
llinux不同版本支持的文件系统不同。即使不支持,通过安装驱动也可以读取。
mke2fs可以用来创建文件系统。
fsck可以用来检查文件系统是否损坏,也可以用来恢复文件。
注意,检查前必须讲该磁盘进行卸载。默认情况下,fsck可以默认自动检测文件系统,如果损坏严重,最好手动指定文件系统。每一个格式化的磁盘都会有一个lost found文件夹,用于存储恢复但是找不到位置的文件。
创建新分区和创建文件系统后,不能直接使用,必须进行挂载操作。
例子:
mount /dev/sda4 /mnt
两个参数分别是要挂载的磁盘分区(设备),和要挂载的地方
直接输入mount命令,显示已经挂载文件系统
我的显示如下
/dev/sda6 on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/cgroup type tmpfs (rw)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
none on /run/user type tmpfs (rw,noexec,nosuid,nodev,size=104857600,mode=0755)
none on /sys/fs/pstore type pstore (rw)
systemd on /sys/fs/cgroup/systemd type cgroup (rw,noexec,nosuid,nodev,none,name=systemd)
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,user=gdl)
/dev/sda1 on /media/gdl/CE3C2D083C2CED61 type fuseblk (rw,nosuid,nodev,allow_other,default_permissions,blksize=4096)
/dev/sda2 on /media/gdl/新加卷 type fuseblk (rw,nosuid,nodev,allow_other,default_permissions,blksize=4096)
/dev/sda3 on /media/gdl/新加卷1 type fuseblk (rw,nosuid,nodev,allow_other,default_permissions,blksize=4096)
/dev/sdb2 on /media/gdl/OS X Install ESD type hfsplus (rw,nosuid,nodev,uhelper=udisks2)
上面可以看到,sda6被直接挂载到根目录,这和我们在系统如何启动中学到的指示相同。mount可以指定挂载的文件系统,也可以指定挂载的方式。
tmpfs是内存中的模拟文件系统,一般将系统的临时目录使用内存处理。下面的显示系统的的所有文件系统
$cat /proc/mounts
rootfs / rootfs rw 0 0
sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
devtmpfs /dev devtmpfs rw,nosuid,size=32890056k,nr_inodes=8222514,mode=755 0 0
securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /run tmpfs rw,nosuid,nodev,mode=755 0 0
tmpfs /sys/fs/cgroup tmpfs ro,nosuid,nodev,noexec,mode=755 0 0
cgroup /sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd 0 0
pstore /sys/fs/pstore pstore rw,nosuid,nodev,noexec,relatime 0 0
cgroup /sys/fs/cgroup/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0
cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpuacct,cpu 0 0
cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,nosuid,nodev,noexec,relatime,net_prio,net_cls 0 0
cgroup /sys/fs/cgroup/devices cgroup rw,nosuid,nodev,noexec,relatime,devices 0 0
cgroup /sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0
cgroup /sys/fs/cgroup/pids cgroup rw,nosuid,nodev,noexec,relatime,pids 0 0
cgroup /sys/fs/cgroup/hugetlb cgroup rw,nosuid,nodev,noexec,relatime,hugetlb 0 0
cgroup /sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0
cgroup /sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0
cgroup /sys/fs/cgroup/perf_event cgroup rw,nosuid,nodev,noexec,relatime,perf_event 0 0
configfs /sys/kernel/config configfs rw,relatime 0 0
/dev/mapper/vg_root-lv_root / xfs rw,relatime,attr2,inode64,noquota 0 0
systemd-1 /proc/sys/fs/binfmt_misc autofs rw,relatime,fd=26,pgrp=1,timeout=300,minproto=5,maxproto=5,direct 0 0
hugetlbfs /dev/hugepages hugetlbfs rw,relatime 0 0
mqueue /dev/mqueue mqueue rw,relatime 0 0
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
/dev/vda1 /boot xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/mapper/vg_root-lv_var /var xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/mapper/vg_root-lv_home /home xfs rw,relatime,attr2,inode64,usrquota 0 0
/dev/mapper/vg_root-lv_opt /opt xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/mapper/vg_root-lv_tmp /tmp xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/mapper/vg_data-lv_data /DATA xfs rw,relatime,attr2,inode64,noquota 0 0
tmpfs /run/user/0 tmpfs rw,nosuid,nodev,relatime,size=6580192k,mode=700 0 0
tmpfs /run/user/1000 tmpfs rw,nosuid,nodev,relatime,size=6580192k,mode=700,uid=1000,gid=1000 0 0
tmpfs /run/user/1001 tmpfs rw,nosuid,nodev,relatime,size=6580192k,mode=700,uid=1001,gid=1001 0 0
对上述信息,红帽官方的解释是
The output found here is similar to the contents of /etc/mtab, except that /proc/mount is more up-to-date.
The first column specifies the device that is mounted, the second column reveals the mount point, and the third column tells the file system type, and the fourth column tells you if it is mounted read-only (ro) or read-write (rw). The fifth and sixth columns are dummy values designed to match the format used in /etc/mtab.
我们对其中的几个重要的文件系统做介绍
Device mapper是Linux2.6内核中提供的一种从逻辑设备到物理设备的映射机制,在该机制下,用户能够很方便的根据自己的需要实现对存储资源的管理。在具体管理时需要用到Linux下的逻辑卷管理器,当前比较流行的逻辑卷管理器有 LVM2(Linux Volume Manager 2 version)、EVMS(Enterprise Volume Management System)、dmraid(Device Mapper Raid Tool)等。
fdisk命令是linux应用最广泛的分区工具,即使在u盘版的救援模式的linux的都包含该工具。但是只能在MBR的分区机制上使用。
所有fdisk命令必须在root权限下执行,由于新安装的ubuntu没有设置root账户,应该先sudo passwd root进行设置。
fdisk -l 显示磁盘分区的信息
下面是我计算机的分区信息
root@gdl-System-Product-Name:/dev# fdisk -l
Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 sectors
Units = 扇区 of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x2f7feb50
设备 启动 起点 终点 块数 Id 系统
/dev/sda1 * 63 538511192 269255565 7 HPFS/NTFS/exFAT
分区 1 未起始于物理扇区边界。
/dev/sda2 538511360 1075382271 268435456 7 HPFS/NTFS/exFAT
/dev/sda3 1075382272 1513654271 219136000 7 HPFS/NTFS/exFAT
/dev/sda4 1513656318 1953523711 219933697 f W95 扩展 (LBA)
分区 4 未起始于物理扇区边界。
/dev/sda5 1513656320 1748721663 117532672 7 HPFS/NTFS/exFAT
/dev/sda6 1748723712 1936859135 94067712 83 Linux
我们逐行对上述信息进行解释:
块设备名称为/dev/sda,此设备的大小为1000.2GB,10737418240 bytes这是转换成字节后的大小,即:1000204886016/1024/1024/1024=931.51GB (注:bytes=B,表示“字节”,bit=b,表示“位”)
255个磁头,每个轨道上有63个扇区,一共有121601个柱面,我们可以计算得出,一共有25563121601=1953520065个扇区。
当然不可能有实际的255个磁头,这里的磁头是逻辑磁头。,也就是可以看做有255个盘面。扇区数=磁头数柱面数(扇区/轨道)。而磁盘的实际大小为扇区数*每扇区字节数,为512字节。
在显示中,系统是ID的解释内容,标识分区内容。起点和终点常见的是柱面号码。
可以用fdisk来修改分区表。
主要有两个 etc/mtab,etc/fstab。前者是系统已经装载的文件系统,而后者是系统准备装载的文件系统。当然我们也可以读取/proc/mount来读取当前的挂载信息。显然,每次mount和unmount后,都会对mtab进行更新。
主要文件内容如下
....
/dev/sda8 / ext4 rw,errors=remount-ro 0 0
proc /proc proc rw,noexec,nosuid,nodev 0 0
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
none /sys/fs/cgroup tmpfs rw 0 0
none /sys/fs/fuse/connections fusectl rw 0 0
none /sys/kernel/debug debugfs rw 0 0
....
字段含义依次是 驱动器,挂载点,文件系统,读写权限
fstab的主要文件内容如下
# device-spec mount-point fs-type options dump pass
LABEL=/ / ext4 defaults 1 1
/dev/sda6 none swap defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0
# Removable media
/dev/cdrom /mnt/cdrom udf,iso9660 noauto,owner,ro 0 0
# NTFS Windows 7 partition
/dev/sda1 /mnt/Windows ntfs-3g quiet,defaults,locale=en_US.utf8,umask=0,noexec 0 0
# Partition shared by Windows and Linux
/dev/sda7 /mnt/shared vfat umask=000 0 0
# mounting tmpfs
tmpfs /mnt/tmpfschk tmpfs size=100m 0 0
# mounting cifs
//pingu/ashare /store/pingu cifs credentials=/root/smbpass.txt 0 0
# mounting NFS
pingu:/store /store nfs rw 0 0
简单解释如下
device-spec是设备名,UUID,label等可以确定唯一分区或者数据源的标识
mount-point 挂载点
fs-type:文件系统类型
options :文件系统的参数
dump:dump程序对该分区进行备份的频率。0代表不备份。
pass:开机时fsck程序检查文件系统的顺序。0代表不检查。
另一种典型的文件系统结构是下面这个样子,主要是虚拟机服务器。
#
# /etc/fstab
# Created by anaconda on Thu Nov 16 06:08:34 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
#
/dev/mapper/vg_root-lv_root / xfs defaults 0 0
UUID=d7d28128-5f37-4949-86d2-352e2fa4adb9 /boot xfs defaults 0 0
/dev/mapper/vg_root-lv_home /home xfs defaults,usrquota 0 0
/dev/mapper/vg_root-lv_opt /opt xfs defaults 0 0
/dev/mapper/vg_root-lv_tmp /tmp xfs defaults 0 0
/dev/mapper/vg_root-lv_var /var xfs defaults 0 0
/dev/mapper/vg_root-lv_swap swap swap defaults 0 0
/dev/vg_data/lv_data /DATA xfs defaults 0 0
可以看到,使用的文件系统主要是xfs。这是linux服务器上比较推荐的文件系统。
那么,文件系统是如何工作的呢?不通文件系统又有什么区别呢?
在Linux操作系统中,默认编译了常见磁盘种类的驱动程序。这些驱动程序将磁盘封装为一个块设备,被成为 General Block Device Layer。各个文件系统就是在这个层次上建立的。
不同文件系统的操作方式并不相同。所以Linux在这些文件系统上架构了VFS层。应用程序通过VFS提供的API来操作文件系统。这些概念我们在上一节中介绍过。