关于root、RAID、LVM

故事的起源在initramfs,前面了解了一下initramfs的基本资料,但是对为什么用它其实还不是很了解,所以,有好奇心便有了新知识。

关于rootfs

其实有些奇怪,rootfs不就在那里么。这需要辨析两个概念,filesystem和mounting。

filesystem是一个树形的结构。所有树的根就是root file system,也就是我们通常看到的‘/’,这也是我们在我们的文件系统中可以到达的最顶端了。如果我们在这个地方ls -F,我们可以看到我们拥有些什么样的文件,文件夹后面会跟一个“/”,符号链接的后面会有一个“@”,可执行文件的后面会跟一个“*”;在Gentoo系统里,我们还会看到,不同类型的文件给分配了不同的颜色。

而这整个文件系统的“根”(root)通常是存在硬盘的某个地方。大部分情况下,它是在硬盘的某个分区上;而其它时候,我们是把很多个partition合并起来给一个filesystem使用。不管是哪种情况,我们都需要把分区和文件系统关联(combine)起来,这个关联的过程就是mounting

也就是不管怎样,如果我们把一个文件系统叫做一个文件系统,它就应该是和某个存储介质关联的;和存储介质关联应该是文件系统建立以后才能完成的事,因为驱动载入是在文件系统下完成的。。。就是这个鸡生蛋,蛋生鸡的问题。所以,initial ramdisk这样一个假的root就先被加载,然后内核从这个假的root装载存储介质的驱动。。。到这里,root filesystem就可以和存储介质关联了哦,然后偷梁换柱,真正的root file system就这样被mounting了。

RAID

RAID是Redundant Array of Independent Disks的缩写,它是一种虚拟的磁盘技术,可以理解为它使得很多块硬盘看起来像一块。该机制是为了某块硬盘崩溃时,该硬盘上的数据不会丢失。

RAID是区分不同等级(或者说标准)的:

RAID0:并不能真正称为RAID的RAID。RAID的存在只是为了把很多硬盘联合起来,以提高读写速度,它并不具有数据保护功能,其中一个硬盘损坏,所有数据将受到影响。是的,是所有,因为它只是以不同块大小(以位或者字节为单位)向不同磁盘写数据而已。但是这种方式组织磁盘作为SWAP是不错选择。

RAID1:RAID1的磁盘是成对存在,每一对里面的两个盘互为备份(镜像)。因为其中一块盘忙的时候,可以对它的镜像盘操作,所以RAID1也有加速读写的作用。当然,提高了数据安全性的同时,也身高了成本。

RAID5:至少要3块盘来支持,简单理解为它拥有RAID0的速度,并拥有RAID1的可靠性。数据同样是分块往不同磁盘写,但是这些数据块在其他盘上是有备份的;如果其中一个盘挂了,我们仍然可以用其余的盘把数据恢复出来。不过RAID5仍然有较高的失败概率,这里有讨论,更好的替代方式是RAID1-0(用四块盘来保证速度和安全)。

LVM

LVM是Logical Volume Manager的缩写,也就是逻辑卷管理。它是介于文件系统和硬盘分区之间的一个逻辑层,或者说,LVM提供了一种虚拟分区机制。这意味着系统可识别的分区和具体的物理硬件分区(hard drive partitions)的分离,从而大大提高了磁盘管理的灵活性。比如,你嫌某个分区太小的时候,你可以方便的把它的容量给增大而不用改变你硬盘物理分区状况(重新给硬盘分区。。。除非在绝望的状态下才会的选择),甚至是系统运转的情况下来操作。

需要注意的是,GRUB不支持LVM。如果你把/boot放在LVM的某个分区下,你需要用GRUB2来找到它。

The basic building blocks of LVM are:

  • Physical volume (PV): Partition on hard disk (or even hard disk itself or loopback file) on which you can have volume groups. It has a special header and is divided into physical extents. Think of physical volumes as big building blocks which can be used to build your hard drive.
  • Volume group (VG): Group of physical volumes that are used as storage volume (as one disk). They contain logical volumes. Think of volume groups as hard drives.
  • Logical volume (LV): A "virtual/logical partition" that resides in a volume group and is composed of physical extents. Think of logical volumes as normal partitions.
  • Physical extent (PE): A small part of a disk (usually 4MB) that can be assigned to a logical Volume. Think of physical extents as parts of disks that can be allocated to any partition.

root=31:03

在另一篇文档里面有介绍MTD,这里就不再重复了。

在Flash作为主要存储器的嵌入式设备中,我们看到设置的启动参数是root=31:03,这里尝试对该参数进行解释。

由于在kernel启动未完成以前我们的设备文件不可用,所以,尽管在系统内,我们的Flash设备是通过MTD来挂载到系统的,但是,我们在启动时是不可以将mtd设备作为rootfs的挂载点的。因为我们通常用udev来管理我们的设备,而udev是需要rootfs或者tmpfs来提供支援的,换句话说,没有rootfs,我们没法启动udev,也就找不到MTD设备。不能挂载MTD,/dev/mtdblock 这个设备目录也就不存在,我们无法让kernel通过/dev/mtdblock/X这样的设备找到rootfs。

这个问题我们可以通过给kernel传递设备号的方式来解决,在linux系统中,mtdblock的主设备号是31,part号从0开始,那么以前的/dev/mtdblock/3就等同于31:03,以次类推,所以我们只需要修改bootloader传给kernel 的cmd line参数,使root=31:03(而不是/dev/mtdblock/X),就可以让kernel在udevd未起来之前成功的找到rootfs

另外一种方法就是给kernel传递未经归类的设备文件名,在udev未创建之前,所有的设备实际上已经通过sysfs 建立,mtdblockX的位置相对于/sys/block/mtdblockX/dev,这个文件里存放着mtdblockX的设备号,形式与上一种方式相同这时由于没有相应的udev规则,所有的设备都被隐含地映射到/dev目录下,mtdblockX对应于/dev/mtdbockX,这样我们给kernel传递root=/dev/mtdblock3,kernel发现/dev没有被建立,就自动从映射表里查找对应关系,最后取出/sys/block/mtdblockX/dev里的设备号,完成rootfs的挂载。

sysfs

Kernel 2.6新添加的一种机制,它是一个虚拟的文件系统,目的是根据内核中的设备model为用户空间提供一个“设备树”。用户空间的某些工具,比如udev和mdev,可以通过它来了解哪些设备是可用的,或者是通过它对某些设备进行configure。同时,在用户空间,这些工具可以根据sysfs动态的维护一个“/dev”,其中的那些nodes也就是系统当前可以使用的设备。

设备插入和移除的通知来源于hotplug机制,同样的,系统为hotplug机制提供了两个接口:/sbin/hotplug 和netlink。

sysfs+hotplug也就是以前的devfs,2.6以后的版本都已经放弃devfs。

比如我们可以查看/dev/zero的设备号:

zxluo@polaris:~$ cat /sys/class/mem/zero/dev
1:5

这里有一个从sysfs生成/dev的脚本(仅作演示,非实用):

#!/bin/bash

  # Populate block devices

  for i in /sys/block/*/dev /sys/block/*/*/dev
  do
    if [ -f $i ]
    then
      MAJOR=$(sed 's/:.*//' < $i)
      MINOR=$(sed 's/.*://' < $i)
      DEVNAME=$(echo $i | sed -e 's@/dev@@' -e 's@.*/@@')
      mknod /dev/$DEVNAME b $MAJOR $MINOR
    fi
  done

  # Populate char devices

  for i in /sys/bus/*/devices/*/dev /sys/class/*/*/dev
  do
    if [ -f $i ]
    then
      MAJOR=$(sed 's/:.*//' < $i)
      MINOR=$(sed 's/.*://' < $i)
      DEVNAME=$(echo $i | sed -e 's@/dev@@' -e 's@.*/@@')
      mknod /dev/$DEVNAME c $MAJOR $MINOR
    fi
  done

procfs (or the proc filesystem) is a special filesystem in UNIX-like operating systems that presents information about processes and other system information in a hierarchical file-like structure, providing a more convenient and standardized method for dynamically accessing process data held in the kernel than traditional tracing methods or direct access to kernel memory. Typically, it is mapped to a mount point named /proc at boot time

——————
无论在哪里做什么,只要坚持服务、创新、创造价值,其他的东西自然都会来的。
原文地址:https://www.cnblogs.com/pied/p/2878361.html