Linux实现多硬盘数据存储
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
以下是对上面输入命令的详细解释:
- 使用命令'n'创建一个新的分区:
- 选择主分区(primary partition)类型,输入'p'。
- 输入分区号,这里选择1。
- 输入起始扇区,默认为16,可以直接按回车键使用默认值。
- 输入结束扇区或者分区大小,这里输入'+32M'表示分区大小为32MB。
- 使用命令'n'再次创建一个新的分区:
- 选择主分区(primary partition)类型,输入'p'。
- 输入分区号,这里选择2。
- 输入起始扇区,默认为65552,可以直接按回车键使用默认值。
- 输入结束扇区或者分区大小,这里使用默认值15269887。
- 使用命令't'设置分区类型:
- 输入要设置类型的分区号,这里选择1。
- 输入十六进制代码(Hex code),这里输入'c'表示将分区1的系统类型设置为Win95 FAT32(LBA)。
- 使用命令'a'设置引导标志:
- 输入要设置引导标志的分区号,这里选择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