Linux实现多硬盘数据存储

发布时间 2023-09-06 14:52:51作者: Endv
fdisk -l  查看可用磁盘设备
 1 / # fdisk -l
 2 Disk /dev/mmcblk1: 7456 MB, 7818182656 bytes, 15269888 sectors
 3 238592 cylinders, 4 heads, 16 sectors/track
 4 Units: sectors of 1 * 512 = 512 bytes
 5 
 6 Disk /dev/mmcblk1 doesn't contain a valid partition table
 7 Disk /dev/mmcblk1boot0: 4 MB, 4194304 bytes, 8192 sectors
 8 128 cylinders, 4 heads, 16 sectors/track
 9 Units: sectors of 1 * 512 = 512 bytes
10 
11 Disk /dev/mmcblk1boot0 doesn't contain a valid partition table
12 Disk /dev/mmcblk1boot1: 4 MB, 4194304 bytes, 8192 sectors
13 128 cylinders, 4 heads, 16 sectors/track
14 Units: sectors of 1 * 512 = 512 bytes
15 
16 Disk /dev/mmcblk1boot1 doesn't contain a valid partition table
17 Disk /dev/mmcblk0: 15 GB, 15931539456 bytes, 31116288 sectors
18 486192 cylinders, 4 heads, 16 sectors/track
19 Units: sectors of 1 * 512 = 512 bytes
20 
21 Device       Boot StartCHS    EndCHS        StartLBA     EndLBA    Sectors  Size Id Type
22 /dev/mmcblk0p1 *  0,32,33     8,73,1            2048     133119     131072 64.0M  c Win95 FAT32 (LBA)
23 /dev/mmcblk0p2    8,73,2      912,229,21      133120   31116287   30983168 14.7G 83 Linux

 

从上面可以得出:

/dev/mmcblk1:容量为7456 MB的磁盘。238592柱面,4个磁头,每个磁道16个扇区。磁盘上没有有效的分区表。

/dev/mmcblk1boot0和/dev/mmcblk1boot1是磁盘的引导区,大小为4 MB,但它们没有有效的分区表。

/dev/mmcblk0:容量为15 GB的磁盘。486192柱面,4个磁头,每个磁道16个扇区。包含两个分区:

  • /dev/mmcblk0p1是引导分区,大小为64.0M,使用Win95 FAT32(LBA)文件系统。
  • /dev/mmcblk0p2是第二个分区,大小为14.7G,使用Linux文件系统(ID为83)。

2.使用fdisk命令对磁盘进行分区

 1 / # fdisk /dev/mmcblk1
 2 
 3 The number of cylinders for this disk is set to 238592.
 4 There is nothing wrong with that, but this is larger than 1024,
 5 and could in certain setups cause problems with:
 6 1) software that runs at boot time (e.g., old versions of LILO)
 7 2) booting and partitioning software from other OSs
 8    (e.g., DOS FDISK, OS/2 FDISK)
 9 
10 Command (m for help):

此时命令栏提示输入'm',可以看到有如下参数:

 1 Command (m for help): m
 2 Command Action
 3 a       toggle a bootable flag
 4 b       edit bsd disklabel
 5 c       toggle the dos compatibility flag
 6 d       delete a partition
 7 l       list known partition types
 8 n       add a new partition
 9 o       create a new empty DOS partition table
10 p       print the partition table
11 q       quit without saving changes
12 s       create a new empty Sun disklabel
13 t       change a partition's system id
14 u       change display/entry units
15 v       verify the partition table
16 w       write table to disk and exit
17 x       extra functionality (experts only)
18 
19 Command (m for help): 

各指令含义如下:

  • a: 切换引导标志(toggle a bootable flag)
  • b: 编辑BSD磁盘标签(edit bsd disklabel)
  • c: 切换DOS兼容性标志(toggle the dos compatibility flag)
  • d: 删除分区(delete a partition)
  • l: 列出已知的分区类型(list known partition types)
  • n: 添加新分区(add a new partition)
  • o: 创建一个新的空DOS分区表(create a new empty DOS partition table)
  • p: 打印分区表(print the partition table)
  • q: 退出而不保存更改(quit without saving changes)
  • s: 创建一个新的空Sun磁盘标签(create a new empty Sun disklabel)
  • t: 更改分区的系统ID(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)) 继续往下,进行创建分区操作:
 1 Command (m for help): n
 2 Partition type
 3    p   primary partition (1-4)
 4    e   extended
 5 p
 6 Partition number (1-4): 1
 7 First sector (16-15269887, default 16): 
 8 Using default value 16
 9 Last sector or +size{,K,M,G,T} (16-15269887, default 15269887): +32M
10 
11 Command (m for help): n
12 Partition type
13    p   primary partition (1-4)
14    e   extended
15 
16 p
17 Partition number (1-4): 2
18 First sector (65552-15269887, default 65552): 
19 Using default value 65552
20 Last sector or +size{,K,M,G,T} (65552-15269887, default 15269887): 
21 Using default value 15269887
22 
23 Command (m for help): t
24 Partition number (1-4): 1
25 Hex code (type L to list codes): c
26 Changed system type of partition 1 to c (Win95 FAT32 (LBA))
27 
28 Command (m for help): a
29 Partition number (1-4): 1
30 
31 Command (m for help): w
32 The partition table has been altered.
33 Calling ioctl() to re-read partition table
34 [ 1334.059435]  mmcblk1: p1 p2

以下是对上面输入命令的详细解释:

  1. 使用命令'n'创建一个新的分区:
  • 选择主分区(primary partition)类型,输入'p'。
  • 输入分区号,这里选择1。
  • 输入起始扇区,默认为16,可以直接按回车键使用默认值。
  • 输入结束扇区或者分区大小,这里输入'+32M'表示分区大小为32MB。
  1. 使用命令'n'再次创建一个新的分区:
  • 选择主分区(primary partition)类型,输入'p'。
  • 输入分区号,这里选择2。
  • 输入起始扇区,默认为65552,可以直接按回车键使用默认值。
  • 输入结束扇区或者分区大小,这里使用默认值15269887。
  1. 使用命令't'设置分区类型:
  • 输入要设置类型的分区号,这里选择1。
  • 输入十六进制代码(Hex code),这里输入'c'表示将分区1的系统类型设置为Win95 FAT32(LBA)。
  1. 使用命令'a'设置引导标志:
  • 输入要设置引导标志的分区号,这里选择1。
  1. 使用命令'w'保存更改并退出:
  • 确认分区表已经被修改,并且调用ioctl()重新读取分区表。
  • 提示分区表已经被修改,并成功保存更改。

最后,磁盘分区表将被修改,分区1被设置为Win95 FAT32(LBA)类型,并且设置为引导分区。

请注意,这些操作可能会对磁盘上的数据产生影响,请确保在进行此类操作之前备份重要数据。

四、磁盘格式化

磁盘格式化是指在磁盘上创建文件系统以准备存储数据的过程。通过格式化,磁盘将被分区划分为逻辑块,并创建用于存储和组织文件的文件系统结构。格式化磁盘将清除磁盘上的所有数据,并为其提供一个干净的文件系统环境,使其可以开始存储新的数据。 这里,我们将上面的两个分区分别格式化为Fat32格式的文件系统和ext4格式的文件系统

  • 将'/dev/mmcblk1p1'格式化为Fat32格式的文件系统
  • 将'/dev/mmcblk1p2'格式化为ext4格式的文件系统

Fat32格式,使用命令如下:

1 mkfs.vfat -F 32 -n "boot" /dev/mmcblk1p1

 

每个选项的含义解释如下:

  • -F 32:指定创建的文件系统类型为FAT32。
  • -n MyVolume:设置卷标为"MyVolume",该卷标将作为文件系统的名称显示。
  • /dev/mmcblk1p1:是要格式化的设备或分区

ext4格式,使用命令如下:

1 mkfs.ext4 -F -L "rootfs" /dev/mmcblk1p2
2 -/bin/sh: mkfs.ext4: not found

 

每个选项的含义解释如下:

  • -F:强制进行格式化,即使设备已经被挂载。
  • -L "rootfs":设置文件系统的标签为"rootfs",该标签将作为文件系统的名称显示。
  • /dev/mmcblk1p2:要格式化的设备或分区。

这里我们的文件系统不支持mkfs.ext4格式,但是可以使用它的孪生兄弟“mke2fs”,指令如下:

1 mke2fs -F -L "rootfs" /dev/mmcblk1p2
 1 Filesystem label=rootfs
 2 OS type: Linux
 3 Block size=4096 (log=2)
 4 Fragment size=4096 (log=2)
 5 475136 inodes, 1900542 blocks
 6 95027 blocks (5%) reserved for the super user
 7 First data block=0
 8 Maximum filesystem blocks=4194304
 9 58 block groups
10 32768 blocks per group, 32768 fragments per group
11 8192 inodes per group
12 Superblock backups stored on blocks:
13         32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
14 / # 

 

现在我们已经将上面的两个分区格式化完成了,下一步就是挂载分区。

五、磁盘挂载

1.创建挂载点

首先,您需要选择一个目录作为挂载点。可以使用mkdir命令创建一个空目录作为挂载点,例如:

1 mkdir /mnt/boot

 

2.执行挂载命令

使用mount命令将文件系统挂载到指定的挂载点上,例如:

1 mount /dev/mmcblk1p1 /mnt/boot

 

使用“df”指令查看是否挂载成功,命令如下:

1 / # df -a
2 Filesystem           1K-blocks      Used Available Use% Mounted on
3 /dev/root             15141732    161948  14188824   1% /
4 devtmpfs                216388         0    216388   0% /dev
5 proc                         0         0         0   0% /proc
6 tmpfs                   249668         0    249668   0% /tmp
7 sysfs                        0         0         0   0% /sys
8 devpts                       0         0         0   0% /dev/pts
9 /dev/mmcblk1p1           32260         1     32260   0% /mnt/boot

 

很明显已经’/dev/mmcblk1p1‘分区已经成功挂载到’/mnt/boot‘目录下。

3.访问文件系统

现在,可以通过挂载点来访问和操作文件系统中的文件和目录。

例如,您可以使用cd命令进入挂载点,并使用其他文件操作命令进行文件的读取、写入等操作:

1 cd /mnt/boot
2 touch test.txt

 

然后掉电重启开发板,再次查看'/mnt/boot'下是否有test.txt文件:

1 / # ls /mnt/boot/
2 / # 

 

很明显是没有test.txt文件,磁盘的'/dev/mmcblk1p1'分区未进行挂载到'/mnt/boot'目录下,因此在'/mnt/boot'下是看不到test.txt文件的。

1 / # df -a
2 Filesystem           1K-blocks      Used Available Use% Mounted on
3 /dev/root             15141732    161948  14188824   1% /
4 devtmpfs                216388         0    216388   0% /dev
5 proc                         0         0         0   0% /proc
6 tmpfs                   249668         0    249668   0% /tmp
7 sysfs                        0         0         0   0% /sys
8 devpts                       0         0         0   0% /dev/pts

 

test.txt文件是保存在磁盘的'/dev/mmcblk1p1'分区,掉电后需要手动挂载到'/mnt/boot'该目录下,才能查看到test.txt文件,如下:

1 / # mount /dev/mmcblk1p1 /mnt/boot
2 [  179.885442] FAT-fs (mmcblk1p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
3 
4 / # ls /mnt/boot/
5 test.txt
6 / #

 

另一个分区挂载如下:

1 mkdir /mnt/rootfs
2 mount /dev/mmcblk1p2 /mnt/rootfs
3 / # df -h
4 Filesystem                Size      Used Available Use% Mounted on
5 /dev/root                14.4G    158.2M     13.5G   1% /
6 devtmpfs                211.3M         0    211.3M   0% /dev
7 tmpfs                   243.8M         0    243.8M   0% /tmp
8 /dev/mmcblk1p1           31.5M       512     31.5M   0% /mnt/boot
9 /dev/mmcblk1p2            7.1G     20.0K      6.8G   0% /mnt/rootfs

 

六、开机自动挂载

1.设备路径挂载

如果希望在系统启动时自动挂载分区,可以编辑/etc/fstab文件并添加相应的条目。例如:

1 #<file system>  <mount point>   <type>  <options>       <dump>  <pass>
2 proc            /proc           proc    defaults        0       0
3 tmpfs           /tmp            tmpfs   defaults        0       0
4 sysfs           /sys            sysfs   defaults        0       0
5 /dev/mmcblk1p1  /mnt/boot       vfat    defaults        0       0
6 /dev/mmcblk1p2  /mnt/rootfs     ext4    defaults        0       0

 

重新启动开发板,使用'df'命令查看是否自动挂载

1 / # df -h
2 Filesystem                Size      Used Available Use% Mounted on
3 /dev/root                14.4G    158.2M     13.5G   1% /
4 devtmpfs                211.3M         0    211.3M   0% /dev
5 tmpfs                   243.8M         0    243.8M   0% /tmp
6 /dev/mmcblk1p1           31.5M       512     31.5M   0% /mnt/boot
7 /dev/mmcblk1p2            7.1G     20.0K      6.8G   0% /mnt/rootfs

 

ok,自动挂载成功。

2.UUID挂载

另一种挂载方法,这里在教大家使用UUID来进行自动挂载,如下:

获取分区的UUID:使用以下命令各分区的UUID:

1 / # blkid 
2 /dev/mmcblk0p2: LABEL="rootfs" UUID="4bdc82c7-5e83-4992-9966-cd99a2317944" TYPE="ext4"
3 /dev/mmcblk0p1: LABEL="boot" UUID="DF8D-2A71" TYPE="vfat"
4 /dev/mmcblk1p2: LABEL="rootfs" UUID="54b75bd6-7cdf-4e80-aa48-1af163bf61f3" TYPE="ext2"
5 /dev/mmcblk1p1: TYPE="vfat"

 

编辑/etc/fstab文件并添加相应的条目。例如:

1 #<file system>  <mount point>   <type>  <options>       <dump>  <pass>
2 proc            /proc           proc    defaults        0       0
3 tmpfs           /tmp            tmpfs   defaults        0       0
4 sysfs           /sys            sysfs   defaults        0       0
5 UUID=54b75bd6-7cdf-4e80-aa48-1af163bf61f3   /mnt/rootfs ext4 defaults 0 0

 

保存后,重启开发板,成功自动挂载,如下:

1 / # df -h
2 Filesystem                Size      Used Available Use% Mounted on
3 /dev/root                14.4G    158.2M     13.5G   1% /
4 devtmpfs                211.3M         0    211.3M   0% /dev
5 tmpfs                   243.8M         0    243.8M   0% /tmp
6 /dev/mmcblk1p2            7.1G     20.0K      6.8G   0% /mnt/rootfs

 

在挂载文件系统时,您可以使用设备路径(如 /dev/mmcblk1p1)或文件系统的UUID来标识要挂载的分区。这两种方法各有一些区别和好处:

1.设备路径 (/dev/mmcblk1p1):

  • 标识分区的路径:使用设备路径是一种直接而简单的方法来标识要挂载的分区。它基于设备文件的物理路径,可以明确地指定要挂载的分区。例如,'/dev/mmcblk1p1' 表示第二个MMC类型的磁盘的第一个分区。
  • 相对容易记忆:设备路径通常较短且易于记忆,因为它们直接与设备文件的名称相关。

但是,设备路径可能会受到设备插入和拔出的影响。如果您的系统中存在多个磁盘或设备连接状态发生变化,设备路径可能会改变。

2.文件系统UUID:

  • 标识分区的唯一性:每个文件系统都有一个唯一的UUID(通用唯一标识符),用于识别分区。UUID是在创建文件系统时生成的,并且是全局唯一的。它不受设备连接状态的影响,因此即使设备路径发生变化,UUID仍将保持不变。
  • 稳定性和持久性:使用UUID来挂载分区可以提供更稳定和持久的挂载方式,因为即使重新启动系统或更改设备连接状态,UUID标识的分区仍然可以准确地被找到。
  • 更适合自动化和脚本:使用UUID可以更方便地进行自动化操作和脚本编写,因为UUID提供了一个固定的标识符来唯一标识特定的分区。

总的来说,使用设备路径或UUID进行挂载都是可行的方法,具体取决于您的需求和使用场景。如果您的系统中没有频繁插拔设备并且不涉及自动化操作,使用设备路径可能更加简单和直接。而如果您需要更稳定和持久的挂载方式,以及更适合自动化操作,使用UUID则更为可靠和推荐。

 

将2块空硬盘合并为“一块”,挂载到指定目录(/data)下,达到在一个目录使用2块硬盘所有空间的效果

 

同一目录无法重复挂载,后挂载的会覆盖之前挂载的磁盘。
但是现在需要将4块磁盘并行挂载,一同保存图片,该如何操作呢?

将4块磁盘合并到一个逻辑卷 进行挂载。

基本概念

  • PV(Physical Volume)- 物理卷
    物理卷在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘,也可以是raid设备。

  • VG(Volumne Group)- 卷组
    卷组建立在物理卷之上,一个卷组中至少要包括一个物理卷,在卷组建立之后可动态添加物理卷到卷组中。一个逻辑卷管理系统工程中可以只有一个卷组,也可以拥有多个卷组。

  • LV(Logical Volume)- 逻辑卷
    逻辑卷建立在卷组之上,卷组中的未分配空间可以用于建立新的逻辑卷,逻辑卷建立后可以动态地扩展和缩小空间。系统中的多个逻辑卷可以属于同一个卷组,也可以属于不同的多个卷组

  • PE(Physical Extent)- 物理块

 

操作步骤

1、检查

先检查一下目前磁盘的使用情况。
/home目录下只有45G大小,显然不够用。
df -h

 

2、查看磁盘

查看是否有空余的磁盘可用。
可以看到,有四块2T的磁盘分别为:/dev/sdb、/dev/sdc、/dev/sdd、/dev/sde 还没有挂载。
fdisk -l

 

3、创建分区

分别为4块硬盘创建分区,需要注意的是,与挂载单块磁盘不同,创建分区后需要修改分区类型。

连续敲以下命令即可:

1 n p 1 enter enter t l 8e w

命令详解:

n:创建分区
p:扩展分区
1:分区号(1-4)
t:修改分区类型
l:列出所有分区类型
8e:指Linux LVM
w:保存并退出

4、查看创建的分区

分区Id为8e,System为Linux LVM则表示成功。
fdisk -l

5、创建PV

pvcreate /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

6、查看PV

可以看到我们创建的4个物理卷。
pvdisplay

7、创建VG

lvm_data是vg组的名字,可以自定义
vgcreate lvm_data /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

8、创建LV

-L是指定大小、-n是自定义lv的名称
lvcreate -L 7800G -n lvmdata_1 lvm_data

9、查看分区

到这里分区就创建完成了,后面的步骤和挂载单块磁盘一样:格式化然后挂载。
fdisk -l 

10、格式化分区

mkfs.ext4 /dev/mapper/lvm_data-lvmdata_1

11、挂载到目录

将分区挂载到需要保存文件的目录即可。
mount /dev/mapper/lvm_data-lvmdata_1 /home/dev_xw

12、再次检查

挂载后,再次查看磁盘的使用情况。
可以看到有7.5T的空间。
df -h 

至此操作全部结束,可以保存文件。

 

 

      

 

 

 1 vgcreate lvm_data /dev/sdb1
 2 vgextend lvm_data /dev/sdc1
 3 vgextend lvm_data /dev/sdd1
 4 
 5 
 6 lvcreate -l 100%VG -n vg_data lvm_data
 7 mkfs -t ext4 /dev/lvm_data/vg_data
 8 mkdir /data
 9 
10 mount /dev/lvm_data/vg_data /data
11 df -h
12 
13 
14 在/etc/fstab文件末尾添加如下行:
15 
16 /dev/lvm_data/vg_data    /data     ext4    defaults    0 0

 

  创建多个vg

      vgcreate lvm_data1 /dev/sdo1
      vgextend lvm_data1 /dev/sdr1
      lvcreate -l 100%VG -n vg_data1 lvm_data1
      mkfs -t ext4 /dev/lvm_data1/vg_data1

      mkdir /data1
      mount /dev/lvm_data1/vg_data1 /data1

  

df -h,查看当前磁盘的情况

   parted /dev/sdd
       mklabel gpt
       mkpart
       quit