首页 > 代码库 > Linux 是如何分区格式化磁盘并挂载使用的?

Linux 是如何分区格式化磁盘并挂载使用的?

    在 Linux 是去如何分区格式化一块磁盘分区的,并使用之?流程如下图

wKioL1PA5fvj5VhvAADvlciwNEs674.jpg

1、分区

 (1)、首先要,知道一块磁盘是否有空间没有划分分区的?

      划分分区是根据柱面(cylinders),有没有剩余的柱面才可以再划分分区,否则的话是不可以的。

      但是要注意的是:

                   我们最多可以划分4个主分区,如果查看磁盘上还有剩余的柱面(cylinders)的话,也是不可再划分分区了。也就是说这些剩余的柱面

      是再也没法使用了。除非重新对该磁盘划分分区。

查看是否有剩余柱面:

[root@Node1 ~]# 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: 0x00088117

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
/dev/sda2              26        7859    62914560   8e  Linux LVM
/dev/sda3            7859        8120     2103516   83  Linux
                      |           |
       		     \|/         \|/
           磁盘分区的开始柱面   磁盘分区的结束柱面

说明:

    可以使用上述方式,查看一个磁盘的是否有空闲。因为磁盘分区是根据“柱面cylinders”,

    所以,如果最后一个分区的结束柱面数小于磁盘的总的柱面数的话,表明该磁盘还有没有被划分的柱面。

    如果,最后一个分区的结束柱面数等于磁盘的总的柱面数的话,该磁盘的所有柱面都被划分分区了。

(2)、使用工具:【fdisk】【sfdisk】【parted】划分分区。

    【fdisk】是一个交互式的磁盘分区工具。

[root@Node1 ~]# fdisk /dev/sda -->进入【fdisk】的交互交界后使用下述的命令完成磁盘分区操作
                      m         查看fdisk的帮助
		      p         列出磁盘的分区情况
		      n         创建新的分区
		      d         删除分区
                      t         指定分区使用什么系统主要是跟文件系统相对应的。
		      w         保存退出
		      q         不保存退出

    这样就完成了磁盘的分区的创建。内核是自己不会识别刚创建的分区的。我们要在新创建的分区上安装软件(也就是格式化分区,也就是创建文件系统),

    内核必须要知道有该分区。否则的话是无法在该分区创建文件系统的。

2、让内核识别分区,CentOS 的5版本和 CentOS 的6版本使用的工具不一样。

    CentOS 5 使用【partitions】
    CentOS 6 使用【partx】或【kpartx】

   (1)、怎么知道内核是否识别到磁盘和分区呢?可以通过内核提供给用户空间的一个接口/proc 来查修内核工作的一些信息。

[root@Node1 ~]# cat /proc/partitions
major minor  #blocks  name

   8        0   83886080 sda
   8        1     204800 sda1
   8        2   62914560 sda2
   8        3    2103516 sda3
 253        0   20971520 dm-0
 253        1    2097152 dm-1
 253        2   10485760 dm-2
 253        3   20971520 dm-3

说明:上述标识的就是内核识别到的磁盘分区。如果你刚创建的分区没有列出来,就要通知内核了。

   (2)、怎么样,通知内核识别新建的分区

        【kpartx】是【partx】的升级版

 partx -a   DEVOCE
  kpartx -a  DEVOCE
  kpartx -f  DEVOCE 
  kpartx -fa DEVOCE

如果,内核识别到刚创建的分区了,就可以在该分区上创建指定的文件系统了。

       

3、格式化(创建文件系统)

   (1)、选择文件系统

    文件系统也是一个软件,它的作用就是直接管理磁盘上的文件的。该软件和平时的软件不同,它是直接做到内核的,通常把它做成内核的一个模块。能够实现同一类功能的软件很多,比如:可以管理磁盘上的文件的软件(文件系统)有:ext2、ext3、ext4、xfs、ufs、ceph、htrfs等。

     这文件系统各有各的特点,它们在不同场景有不同的表现能力。所以,我们要根据实际应用来选择管理我们磁盘的软件(文件系统)。这得先要了解它们各有什么特点。才可以根据实际应用,选择最符合应用需要的文件系统。比如:我们要存储的一个文件通常是16M,那么就要选择一个支持大文件存储的文件系统。有些文件系统支持的磁盘块(block),很大。假如我们创建文件系统时设置 block size 大小8M,2块block就可以把一个文件存储完了。如果我们创建文件系统的时候,的block 的大小为2M.

那么我们存储16M的数据得需要8个磁盘块。这8块需要块在磁盘上不一定是连续的,那么就会产生“异步IO”。速度肯定比我们把一个文件存储在一块磁盘块慢得多。

不过,我们选择的文件系统要支持大的磁盘块才可以。

     我们选择了最适合现在的应用的文件系统,操作系统支持才可以使用。因为文件系统是由内核管理的。那么怎么知道,我们使用的操作系统是否支持呢?以CentOS 6

为例:

[root@Node1 ~]# cat /proc/filesystems
nodev   sysfs
nodev   rootfs
nodev   bdev
nodev   proc
nodev   cgroup
nodev   cpuset
nodev   tmpfs
nodev   devtmpfs
nodev   binfmt_misc
nodev   debugfs
nodev   securityfs
nodev   sockfs
nodev   usbfs
nodev   pipefs
nodev   anon_inodefs
nodev   inotifyfs
nodev   devpts
nodev   ramfs
nodev   hugetlbfs
        iso9660
nodev   pstore
nodev   mqueue
nodev   selinuxfs
        ext4
nodev   rpc_pipefs
nodev   autofs

    通过上述方法,就可以知道:CentOS 6 是否支持我们选择的文件系统了。

用户是通过,VFS(虚拟文件系统),与底层的很多的文件系统打交道的。VFS是底层这些文件系统的一个抽象层。所以,我们可以这样认为只要VFS支持的文件系统。Linux系统都支持。

    注意:有时候我们会有这种情况:通过 linux 的官方,知道支持该文件系统,但是 CentOS 却不支持。这是什么原因呢?

    因为,在编译 linux 内核源代码的时候,把支持该文件系统的功能关闭了。如果,我们又想使用该文件系统呢,只有重新编译内核。

    我们可以通过查看文件 /boot/config-2.6.32-358.el6.i686  在编译内核的时候是如何配置的。我们也可以参考该配置文件,把支持该文件系统的功能开启后重新编译内核。

    (2)、使用工具安装文件系统(格式化)。【mkfs】或【mke2fs】

       格式化会把扇区(512)组织成块(block),而我们存储数据的时候,是以块来存储的,如:我们的块大小为2M,而我们要存储5M大小的文件。那么我们就需要使用3个磁盘块(block)来存储该文件。剩余的1M空闲,是不可用来存储其它文件数据的。它霸占了这1M的存储空间(浪费)所以,我们分区的时候要根据实际需要设定块(block)的大小。

       如果我们的分区磁盘空间完全被使用完,当系统管理员进行维护的时候,就就尴尬了。所以我们得有预留空间,给管理员执行维护操作.

       在 Windows 系统中,可以给不同的盘起不同的名称。Linux 系统也可以,不过称之为“卷标”。不过计算识别该分区还是根据设备号的。只不过是一个标识而已。

    【mke2fs】该命令对文件系统的可定制性很强,所以选择该命令来定制符合我们需要的文件系统。

Usage: mke2fs OPTIONS... DEVICE
   -c                        检测块的好坏再创建文件系统
   -t  {ext2,ext3,ext4}     指定文件系统
   -b   {1024,2048,4096}     指定块大小 
   -L   LABEL                指定卷标
   -j   相当于 -t ext3  
   -i   #   # 创建 innode 的百分比
   -N   #   直接指定可用的inode数
   -m  # 指定预留空间占整个分区空间的百分之五。Reserved block count 预留块数。默认预留5%

4、挂载

       在 Linux 系统,新的分区格式化好是不可以直接使用的,需要“挂载”才可以使用。这不像 Windows 。Linux 层次式的倒树状结构来管理目录文件,

   所有目录文件都属于根(/),当然我们访问某一个目录文件也要通常根(/),一级级访问。如下图:访问/var/log/message 的过程。从下图可以看得出我们访问一个文件要多次去查 inode table.为了提高查表的速度,系统会把 innode table缓存在内存的缓冲区中。不竟访问内存的速度要比访问磁盘的速度快得多。通常也会把用户访问过的目录文件与inode的对应关系缓存起来。下一次再访问该数据就可以直接到磁盘上去取数据了。这些数据通常会保存在 buffer 和 cached 中。

wKiom1PA6bfSOJAvAAIYxpo04ZM476.jpg

我们访问一个文件要经过很多查找过程,特别是文件所在的目录比较深的时候。所以,如果我们的文件

在Linux的目录树中离根(/)越近,访问该文件会比较快点。

     既然,我们访问磁盘中的文件入口只有一个(根),所以我们要把新格式化好的分区与根(/)下的一个目录关联起来。让它属于根(/)的一员。那么该目录就是

    该分区设备的访问入口了,但它还是属于根(/)的.这样就使得本无层次的分区有了层次结构(分区是属于文件树的第几层)了。挂载使用【mount】命令:

mount [option]... [-t fstype] [-o option] 设备 挂载点
                   指定文件系统  设备的选项参数
-t       fstype    指定文件系统类型(一般情况下不需要指定,自动识别)
-r       readonly   只读挂载
-w       read and  write   读写挂载
-L       以卷标指定设备, mount -L MYDATA 挂载点
-U       以UUID 的方式指定设备  mount UUID=‘uuid‘ 挂载点
-a       自动挂载所有(/etc/fstab文件中定义的)的支持自动挂载的所有设备
-n       挂载时,不更新/etc/mtab文件
-o   option   其实是指定在设备上操作数据时候的动作。
     async               异步I/O 往该分区写数据时候,是采用异步方式。数据暂时存放在内存中
                         然后再把数据一次性同步到磁盘上。虽然这在一定程序上提高了写操作的
                         性能,但是对于数据安全很高的应用就直接考虑了。
     sync                同步I/O 
     atime/noatime       文件和目录被访问时是否更新最近一次的访问时间戳比较繁忙的系统见议
                         关闭。因为,更新就需要写,增加额外的工作。如果可以忽略的话可以禁
                         止。                    
    auto/noauto          设备是否支持【mount -a】自动挂载.写在 /etc/fstab 文件中的设备才
                         可以使用该方法自动挂载。
    diratime/nodiratime  目录被访问时是更新最近一次的访问时间戳
    dev/nodev            是否支持在此设备上使用设备
    exec/noexec          是否允许执行此设备上的二进制程序文件
    suid/nosuid          是否支持在此设备的文件上使用suid
    remount              重新挂载,通常用于不卸载时重新挂载指定挂载选项
    ro                   只读 
    rw                   读写
    acl                  在此设备是否支持使用facl,默认不支持。

注意:挂载时可以不指定选项,只要默认选项符合你当前系统应用的要求,默认选项有哪些呢?

defaults
        Use default options: rw, suid, dev, exec, auto,  nouser,  async,and relatime.

显然,如果我们需要用到 acl 功能,就不可以使用默认了。

      Linux 系统识别设备是依靠设备号的,可以查看 /dev 目录中的设备文件(设备的一个访问入口罢了)。系统比较人性化,使用字符串来标识设备,如:sda1 表示第一块磁盘的第一分区。但是系统识别 sda1 设备还是靠设备号的。像我们还可以给分区创建一个卷标来标识该分区。所以我们挂载设备的时候标识挡挂载的设备就有多种方式了

如下:

使用UUID号来标识设备

[root@Node1 /]# mount -o acl UUID="47b2cb89-20de-4adb-8cc5-e45e172d0028" /mydata
[root@Node1 /]# mount | grep "\<sda3\>"
/dev/sda3 on /mydata type ext4 (rw,acl)

[root@Node1 /]# mount -o acl -U 47b2cb89-20de-4adb-8cc5-e45e172d0028 /mydata
[root@Node1 /]# mount | grep "\<sda3\>"
/dev/sda3 on /mydata type ext4 (rw,acl)

使用设备名称挂载设备

[root@Node1 /]# mount -o acl /dev/sda3 /mydata
[root@Node1 /]# mount | grep "\<sda3\>"
/dev/sda3 on /mydata type ext4 (rw,acl)

使用自定义的卷标挂载设备

[root@Node1 mydata]# mount -L MYDATA /mydata
[root@Node1 ~]# mount | grep "\<sda3\>"
/dev/sda3 on /mydata type ext4 (rw)

说明:虽然它们都可以标识设备并挂载成功,但是它们是有区别的,在主机很多磁盘的情况下。最好使用 UUID的方式挂载。

UUID是唯一的设备标识符,不会重复。是该设备的终身标志。如我们的***。


补充:

【blkid】查看指定块设备的信息

[root@Node1 ~]# blkid /dev/sda1
/dev/sda1: UUID="12e178c7-8a7e-4d2e-a33b-b3b17f8ef842" TYPE="ext4"

修改分区的各项参数属性:

tune2fs
      -j                     ext2 升级为 ext3.  注意:只可升级不可降级。但是,我们在挂载
                             的时候可以明确指定不使用,日志功能。
      -L   LABEL             修改卷标
      -m  #                  修改预留百分比
      -O  [^]FEATURE          启用指定特性,特性前加^,表示关闭此种特性。
      -o  [^]mount-options    开始或关闭指定的挂载选项


本文出自 “Linux” 博客,请务必保留此出处http://9528du.blog.51cto.com/8979089/1437388