linux之LVM

Linux 虚拟磁盘

分区

1、创建系统文件并分区且挂在目录

#!/bin/bash

# 定义文件系统路径
FILE_SYSTEM="/home/tmp/file-system.img"
LOOP_DEVICE="/dev/loop4"

rm -rf $FILE_SYSTEM

mkdir -p /home/tmp

# 创建1GB的文件系统
dd if=/dev/zero of=$FILE_SYSTEM bs=1M count=1024

# 检查 loop 设备是否存在,如果存在则解绑
if losetup | grep -q $LOOP_DEVICE; then
    echo "Loop device $LOOP_DEVICE exists, detaching..."
    losetup -d $LOOP_DEVICE
fi

# 将文件系统绑定到指定的loop设备
losetup $LOOP_DEVICE $FILE_SYSTEM

# 使用 parted 创建分区表并分区
parted $LOOP_DEVICE --script mklabel msdos
parted $LOOP_DEVICE --script mkpart primary ext4 1MiB 513MiB
parted $LOOP_DEVICE --script mkpart primary ext4 513MiB 100%

# 重新读取分区表
partprobe $LOOP_DEVICE

# 格式化分区
mkfs.ext4 ${LOOP_DEVICE}p1
mkfs.ext4 ${LOOP_DEVICE}p2

# 创建挂载点
mkdir -p /home/mnt/part1
mkdir -p /home/mnt/part2

# 挂载第一个分区为可读可写不可执行
mount ${LOOP_DEVICE}p1 /home/mnt/part1
mount -o remount,rw,noexec /home/mnt/part1

# 挂载第二个分区为可读可执行不可写
mount ${LOOP_DEVICE}p2 /home/mnt/part2
mount -o remount,ro,exec /home/mnt/part2

# 输出结果
echo "File system created and mounted successfully."
echo "Partition 1: /mnt/part1 (rw,noexec)"
echo "Partition 2: /mnt/part2 (ro,exec)"

2、卸载分区和挂在的目录

#!/bin/bash

# 指定的 loop 设备名称
LOOP_DEVICE="/dev/loop4"

# 挂载点
MOUNT_POINT1="/home/mnt/part1"
MOUNT_POINT2="/home/mnt/part2"

IMG_FILE="/home/tmp/file-system.img"

# 卸载第一个分区
if mount | grep -q $MOUNT_POINT1; then
    echo "Unmounting $MOUNT_POINT1..."
    umount $MOUNT_POINT1
else
    echo "$MOUNT_POINT1 is not mounted."
fi

# 卸载第二个分区
if mount | grep -q $MOUNT_POINT2; then
    echo "Unmounting $MOUNT_POINT2..."
    umount $MOUNT_POINT2
else
    echo "$MOUNT_POINT2 is not mounted."
fi

# 检查 loop 设备是否存在并解绑
if losetup | grep -q $LOOP_DEVICE; then
    echo "Detaching loop device $LOOP_DEVICE..."
    losetup -d $LOOP_DEVICE
else
    echo "Loop device $LOOP_DEVICE is not attached."
fi


# 清理挂载点
echo "Cleaning up mount points..."
rm -rf $MOUNT_POINT1
rm -rf $MOUNT_POINT2

# 删除创建的文件系统镜像文件

if [ -f $IMG_FILE ]; then
    echo "Removing $IMG_FILE..."
    rm -f $IMG_FILE
else
    echo "File $IMG_FILE does not exist."
fi

echo "Cleanup completed."

LVM

1、创建文件分区和LVM并实现挂载

#!/bin/bash

# 定义文件系统路径
FILE_SYSTEM="/home/cxd/tmp/file-system.img"
LOOP_DEVICE="/dev/loop4"

MOUNT_POINT1="/home/cxd/mnt/part1"
MOUNT_POINT2="/home/cxd/mnt/part2"

VG_NAME1="vg_part1"
VG_NAME2="vg_part2"
LV_NAME1="lv_part1"
LV_NAME2="lv_part2"

rm -rf $FILE_SYSTEM

mkdir -p /home/cxd/tmp

# 创建1GB的文件系统
dd if=/dev/zero of=$FILE_SYSTEM bs=1M count=1024

# 检查 loop 设备是否存在,如果存在则解绑
if losetup | grep -q $LOOP_DEVICE; then
    echo "Loop device $LOOP_DEVICE exists, detaching..."
    losetup -d $LOOP_DEVICE
fi

# 将文件系统绑定到指定的loop设备
losetup $LOOP_DEVICE $FILE_SYSTEM

# 使用 parted 创建分区表并分区
parted $LOOP_DEVICE --script mklabel msdos
parted $LOOP_DEVICE --script mkpart primary ext4 1MiB 513MiB
parted $LOOP_DEVICE --script mkpart primary ext4 513MiB 100%

# 重新读取分区表
partprobe $LOOP_DEVICE

# 创建物理卷
pvcreate ${LOOP_DEVICE}p1
pvcreate ${LOOP_DEVICE}p2

# 创建卷组
vgcreate $VG_NAME1 ${LOOP_DEVICE}p1
vgcreate $VG_NAME2 ${LOOP_DEVICE}p2

# 创建逻辑卷
lvcreate -l 100%FREE -n $LV_NAME1 $VG_NAME1
lvcreate -l 100%FREE -n $LV_NAME2 $VG_NAME2

# 格式化逻辑卷
mkfs.ext4 /dev/$VG_NAME1/$LV_NAME1
mkfs.ext4 /dev/$VG_NAME2/$LV_NAME2

# 创建挂载点
mkdir -p $MOUNT_POINT1
mkdir -p $MOUNT_POINT2

# 挂载第一个逻辑卷为可读可写不可执行
mount /dev/$VG_NAME1/lv_part1 $MOUNT_POINT1
mount -o remount,rw,noexec $MOUNT_POINT1

# 挂载第二个逻辑卷为可读可执行不可写
mount /dev/$VG_NAME2/$LV_NAME2 $MOUNT_POINT2
mount -o remount,ro,exec $MOUNT_POINT2

2、卸载

#!/bin/bash

# 定义变量
LOOP_DEVICE="/dev/loop4"
FILE_SYSTEM="/home/cxd/tmp/file-system.img"
MOUNT_POINT1="/home/cxd/mnt/part1"
MOUNT_POINT2="/home/cxd/mnt/part2"
VG_NAME1="vg_part1"
VG_NAME2="vg_part2"
LV_NAME1="lv_part1"
LV_NAME2="lv_part2"

# 卸载逻辑卷
umount $MOUNT_POINT1
umount $MOUNT_POINT2

# 删除逻辑卷
lvremove -y /dev/$VG_NAME1/$LV_NAME1
lvremove -y /dev/$VG_NAME2/$LV_NAME2

# 删除卷组
vgremove -y $VG_NAME1
vgremove -y $VG_NAME2

# 删除物理卷
pvremove -y ${LOOP_DEVICE}p1
pvremove -y ${LOOP_DEVICE}p2

# 解绑 loop 设备
losetup -d $LOOP_DEVICE

# 删除挂载点目录
rm -rf $MOUNT_POINT1
rm -rf $MOUNT_POINT2

# 删除文件系统镜像
rm -rf $FILE_SYSTEM

echo "LVM 逻辑卷、卷组和文件系统已成功删除和卸载。"

3、不创建分区,使用loop创建多个LVM,

#!/bin/bash

# 定义文件系统路径
FILE_SYSTEM="/home/tmp/file-system.img"
LOOP_DEVICE="/dev/loop4"

# 创建 1GB 文件系统镜像
dd if=/dev/zero of=$FILE_SYSTEM bs=1M count=1024

# 检查 loop 设备是否存在,如果存在则解绑
if losetup | grep -q $LOOP_DEVICE; then
    echo "Loop device $LOOP_DEVICE exists, detaching..."
    losetup -d $LOOP_DEVICE
fi

# 将文件系统镜像绑定到指定的 loop 设备
losetup $LOOP_DEVICE $FILE_SYSTEM

# 创建物理卷
pvcreate $LOOP_DEVICE

# 创建卷组
vgcreate vg_loop $LOOP_DEVICE

# 创建逻辑卷
lvcreate -l 50%FREE -n lv_part1 vg_loop
lvcreate -l 50%FREE -n lv_part2 vg_loop

# 格式化逻辑卷
mkfs.ext4 /dev/vg_loop/lv_part1
mkfs.ext4 /dev/vg_loop/lv_part2

# 创建挂载点
mkdir -p /home/mnt/part1
mkdir -p /home/mnt/part2

# 挂载第一个逻辑卷
mount /dev/vg_loop/lv_part1 /home/mnt/part1
mount -o remount,rw,noexec /home/mnt/part1

# 挂载第二个逻辑卷
mount /dev/vg_loop/lv_part2 /home/mnt/part2
mount -o remount,ro,exec /home/mnt/part2

3.1 LVM动态拓展

1. 添加物理卷并扩展卷组

假设你有一个新的磁盘或新的 loop 设备,你可以先将它初始化为物理卷,然后添加到现有的卷组。

# 假设你已经有一个新的 loop 设备 /dev/loop5
losetup /dev/loop5 /path/to/new-disk.img

# 创建物理卷
pvcreate /dev/loop5

# 将物理卷添加到卷组
vgextend vg_loop /dev/loop5
2. 扩展逻辑卷

扩展逻辑卷以使用新的可用空间:

# 扩展逻辑卷 lv_part1,使用卷组的所有剩余空间
lvextend -l +100%FREE /dev/vg_loop/lv_part1
3. 在线扩展文件系统

对于大多数现代文件系统,如 ext4xfs,你可以在文件系统挂载时在线扩展它们:

# 对 ext4 文件系统进行在线扩展
resize2fs /dev/vg_loop/lv_part1

# 如果使用的是 xfs 文件系统
# xfs_growfs /mount/point  # 例如 xfs_growfs /home/mnt/part1
posted @ 2024-09-03 22:48  ED1S0N  阅读(40)  评论(0)    收藏  举报