linux和磁盘(2):文件系统和磁盘管理

文件系统

简单来说,文件系统就是文件在磁盘上的组织和存储方式。
磁盘设备的使用有三个步骤,第一创建新分区,第二指定文件系统,第三进行挂载。
没有文件系统的设备被称为裸设备。创建文件系统的过程叫做格式化
常见的文件系统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.

我们对其中的几个重要的文件系统做介绍

  • rootfs使用中特殊文件系统,具有以下的特点
  1. 它是系统自己创建并加载的第一个文件系统;
  2. 该文件系统的挂载点就是它自己的根目录项对象;
  3. 该文件系统仅仅存在于内存中。
  • sysfs 文件系统总是被挂载在 /sys 挂载点上。sysfs 与 proc 相比有很多优点,最重要的莫过于设计上的清晰。sysfs 给应用程序提供了统一访问设备的接口,但可以看到, sysfs 仅仅是提供了一个可以统一访问设备的框架,但究竟是否支持 sysfs 还需要各设备驱动程序的编程支持。
  • proc 是正在运行的内核信息映射 /进程信息 /内存资源信息
    磁盘分区信息等等。
  • cgroup 基于内存,参见https://blog.csdn.net/define_us/article/details/83655385
  • debugfs 同样基于内存,用于内核调试。
  • configfs 文件系统是一种基于ram的文件系统,用于配置内核对象
  • hugetlbfs linux提供的大页面支持机制。我们知道内存页的单位是4kb,但是对于现代计算机更大的页面“似乎”更好。所有存储在hugetlbfs文件系统的文件都会以2MB为页大小进行读取。
  • mqueue linux进程间消息队列通信机制。
  • **/dev/mapper/vg_root-lv_**等我们留到下节来解释

Device Mapper机制

Device mapper是Linux2.6内核中提供的一种从逻辑设备到物理设备的映射机制,在该机制下,用户能够很方便的根据自己的需要实现对存储资源的管理。在具体管理时需要用到Linux下的逻辑卷管理器,当前比较流行的逻辑卷管理器有 LVM2(Linux Volume Manager 2 version)、EVMS(Enterprise Volume Management System)、dmraid(Device Mapper Raid Tool)等。

linux和磁盘(2):文件系统和磁盘管理_第1张图片
linux和磁盘(2):文件系统和磁盘管理_第2张图片

磁盘管理

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来操作文件系统。这些概念我们在上一节中介绍过。

你可能感兴趣的:(操作系统和编译器)