Linux——卷

news/2024/12/22 21:37:39 标签: Linux, , LVM, VG, PV

Linux——

介绍

最近做的项目,涉及到对系统的一些维护,有些盘没有使用,需要创建逻辑盘并挂载到指定目录下。有些软件需要依赖空的逻辑盘(LVM)。

先简单介绍一下的一些概念,有分区、物理存储介质、物理组、逻辑。下面介绍一下概念:

概念介绍参考文章:

  • https://cloud.tencent.com/developer/article/2429857
  • https://blog.csdn.net/yufuloo/article/details/80929116
  • https://blog.csdn.net/qq_37871657/article/details/143209437
  • 分区(Partition) :是在物理存储介质上(磁盘)上划分出来的独立存储区域,每个分区可以视为一个独立的磁盘,格式化后可挂载到文件系统目录下使用。
  • 物理存储介质(The physical media) :这里指系统的存储设备:硬盘,如:/dev/hda、/dev/sda等等,是存储系统最低层的存储单元。
  • 物理(physical volume,PV :物理就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。是用来构建组的基本单元,通常不会被直接挂载,而是通过组合成组,然后从组中创建逻辑
  • 组(Volume Group,VGLVM组类似于非LVM系统中的物理硬盘,其由物理组成。可以在组上创建一个或多个“LVM分区”(逻辑),LVM组由一个或多个物理组成。是逻辑的基础。
  • 逻辑(Logical Volume, LV)LVM的逻辑类似于非LVM系统中的硬盘分区,在逻辑之上可以建立文件系统(比如/home或者/usr等)。逻辑组中的可分配存储空间,它类似于传统的磁盘分区,提供了更多的灵活性,可以在无需重新分区的情况下,动态调整大小。
  • 设备:无论是物理还是逻辑,都是/dev​下的块设备,可以通过块设备管理工具来对其直接操作,比如:k8s上的符合OCI标准的块设备Storage Class、PVPVC

分盘

记录一下分盘实战操作。

第一个场景:VG中分配剩余的磁盘空间创建LVM

场景描述

c89b24d7e5db3242baaa934217e78b7

  • OS:ubuntu24.04
  • 系统磁盘有500GB,系统默认只给根分区分配了100GB,剩余400GB未分配LVM
  • 存在VG/dev/mapper/ubuntu--vg
  • 存在LVM/dev/mapper/ubuntu--vg-ubuntu--lv​,挂载到根分区
  • 任务:需要将VG中剩余的空间分配给系统目录使用
操作步骤
  1. 查看组信息:

    vgdisplay
    
  2. 分出可用空间

    如果组有可用的未分配空间,可以创建新的 LVM 逻辑

    sudo lvcreate -L <size>G -n new_lv_name ubuntu--vg
    

    这里 <size>​ 是要分配的大小(如 10​),new_lv_name​ 是新逻辑名字,比如 data1​。

  3. 格式化新的逻辑

    sudo mkfs.ext4 /dev/ubuntu--vg/new_lv_name
    
  4. 挂载新逻辑到文件系统:

    sudo mkdir /mnt/new_lv_name
    sudo mount /dev/ubuntu--vg/new_lv_name /mnt/new_lv_name
    
  5. 更新 /etc/fstab

    如果想要系统启动时自动挂载,请编辑 /etc/fstab

    echo '/dev/ubuntu--vg/new_lv_name /mnt/new_lv_name ext4 defaults 0 2' | sudo tee -a /etc/fstab
    

    <文件系统> <挂载点> <类型> <选项> <转储> <检查>

经过上面步骤的操作,顺利的将剩余磁盘分配出来,创建了新的LVM并挂载到文件系统使用,同时支持开机自动挂载。

可以使用如下命令查看相关信息:

  • LVM信息:

    lvdisplay
    
  • 的信息:

    lsblk
    

第二个场景:从已存在的LVM中分配出空间,分配给新的LVM

场景描述
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 50G 0 loop
sda 8:0 0 447.1G 0 disk
sda1 8:1 0 1G 0 part /boot/efi
sda2 8:2 0 2G 0 part /boot
sda3 8:3 0 444.1G 0 part
ubuntu--vg-ubuntu--lv 252:0 0 100G 0 lvm /
ubuntu--vg-new--lv 252:1 0 344G 0 lvm /data
  • 项目需要安装阿里巴巴开源的软件open-local,它需要一块空的逻辑,也就是空闲块设备,可以作为存储底座

  • 并且对设备的类型有要求,逻辑具有更多的功能

    不同类型 PV 所支持的存储能力也不同。

    类型动态分配PV扩容PV快照原生块设备IO限流临时监控数据
    LVM(共享盘类型)支持支持支持支持支持支持支持
    Device(独占盘类型)支持不支持不支持支持不支持不支持支持
  • 同时,机器的VG中没有空闲的空间了,只能从现有的LVM中分离出部分空间

  • 同时,保证现有的LVM空间中的数据不丢失

操作步骤

建议提前备份数据,再尝试以下操作

  1. 查看当前系统信息

    lsblk
    
  2. umount当前LVM

    umount /data
    
  3. 杀死占用mount目录的进程

    sudo lsof +D /data
    kill -9 xxx
    
  4. 对文件系统检查

    sudo e2fsck -f /dev/ubuntu-vg/new-lv
    

    如果有提示被占用,建议重启操作系统,注意把/etc/fstab​中开机自动挂载的配置注释掉

  5. 缩小文件系统,确保缩小后的空间还能容纳之前的数据

    此操作将文件系统调整为 144GB(344GB - 200GB),确保在缩小逻辑时不会丢失数据。现在就有200GB的可用空间。

    sudo resize2fs /dev/ubuntu-vg/new-lv 144G
    
  6. 缩小逻辑

    这将把逻辑的大小调整为 144GB,释放出 200GB 的空间

    sudo lvreduce -L 144G /dev/ubuntu-vg/new-lv
    
  7. 创建新的逻辑

    sudo lvcreate -L 200G -n open-local-lv ubuntu-vg
    
  8. 格式化新的逻辑

    sudo mkfs.ext4 /dev/ubuntu-vg/open-local-lv
    
  9. 恢复旧逻辑挂载点

    mount /dev/ubuntu-vg/new-lv /data
    lsblk
    lvdisplay
    

    注:记得把/etc/fstab​文件中的注释去掉

这样就完成了需求,分离出了200GB的LVMopen-local​使用,且恢复了原来的文件系统和文件。

第三个场景:使用本地持久作为k8s集群的块存储

https://kubernetes.io/blog/2019/01/15/container-storage-interface-ga/

场景描述

为k8s集群创建本地的块存储设备

操作步骤
  1. 创建虚拟磁盘文件,将其绑定到循环设备(循环设备不建议在生产环境中使用,这里只是本地测试使用

    $ loop_file="/tmp/test-image-storage.img"
    $ sudo dd if=/dev/zero of=$loop_file bs=1M count=2500
    $ sudo losetup /dev/loop0 $loop_file
    
  2. 创建存储类

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: local-storage
    provisioner: kubernetes.io/no-provisioner
    volumeBindingMode: WaitForFirstConsumer
    
  3. 创建持久

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: test-block-pv
    spec:
      capacity:
        storage: 10Gi
      volumeMode: Block
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      storageClassName: local-storage
      local:
        path: /dev/loop0
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - NODE_NAME
    
  4. 创建持久claim

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: test-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
      volumeMode: Block
      storageClassName: local-storage
    
  5. 测试pod示例

    apiVersion: v1
    kind: Pod
    metadata:
      name: large-image-pod
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - NODE_NAME
      volumes:
        - name: test-image-storage
          persistentVolumeClaim:
            claimName: test-pvc
      containers:
        - name: app-container
          image: xxx
          command: ["/bin/sh", "-c"]
          args:
            - sleep 6000
          volumeDevices:
            - devicePath: /dev/xxx
              name: test-image-storage
    


http://www.niftyadmin.cn/n/5795921.html

相关文章

【从零开始入门unity游戏开发之——C#篇21】C#面向对象的封装——`this`扩展方法、运算符重载、内部类、`partial` 定义分部类

文章目录 一、this扩展方法1、扩展方法的基本语法2、使用扩展方法3、扩展方法的注意事项5、扩展方法的限制6、总结 二、运算符重载1、C# 运算符重载2、运算符重载的基本语法3. 示例&#xff1a;重载加法运算符 ()4、使用重载的运算符5、支持重载的运算符6、不能重载的运算符7、…

String.prototype.padStart() 方法来实现日不足两位时补充零

你可以使用 String.prototype.padStart() 方法来实现日不足两位时补充零&#xff0c;这样代码更简洁。padStart() 会在字符串的前面填充指定的字符&#xff0c;直到字符串达到给定的长度。对于你的需求&#xff0c;padStart(2, 0) 会将 day 补充成两位数&#xff08;如果 day 是…

亚信安全与方天股份达成战略合作,双向奔赴助力数字化转型

近日&#xff0c;亚信安全科技股份有限公司&#xff08;以下简称“亚信安全”&#xff09;正式与青岛方天科技股份有限公司&#xff08;以下简称“方天股份”&#xff09;签订合作框架协议。双方强强携手&#xff0c;在网络安全运营平台共建、信息化项目安全支撑、政企市场拓展…

Elasticsearch:使用 Open Crawler 和 semantic text 进行语义搜索

作者&#xff1a;来自 Elastic Jeff Vestal 了解如何使用开放爬虫与 semantic text 字段结合来轻松抓取网站并使其可进行语义搜索。 Elastic Open Crawler 演练 我们在这里要做什么&#xff1f; Elastic Open Crawler 是 Elastic 托管爬虫的后继者。 Semantic text 是 Elasti…

Vue(二)

1.Vue生命周期 Vue生命周期就是一个Vue实例从 创建 到 销毁 的整个过程。生命周期四个阶段&#xff1a; 创建阶段&#xff1a;创建响应式数据。 挂载阶段&#xff1a;渲染模板。 更新阶段&#xff1a;修改数据&#xff0c;更新视图。 销毁阶段&#xff1a;销毁Vue实例。 …

网络安全基础知识分享

目录 一. 网络安全的定义 二. 常见的网络安全威胁 三. 网络安全防范措施 四. 结语 随着数字化时代的到来&#xff0c;网络安全已成为全球范围内关注的热点问题。无论是个人用户&#xff0c;还是企业和政府机构&#xff0c;都面临着越来越多的网络安全威胁。黑客攻击、数据泄…

使用C#绘制具有平滑阴影颜色的曼德布洛特集分形

示例使用复数类在 C# 中轻松绘制曼德布洛特集分形解释了如何通过迭代方程绘制曼德布洛特集:

高级java每日一道面试题-2024年12月18日-并发篇-Thread 类中的start()和 run()方法有什么区别 ?

如果有遗漏,评论区告诉我进行补充 面试官: Thread 类中的start()和 run()方法有什么区别 ? 我回答: 在Java中&#xff0c;Thread类是用于创建和管理线程的。了解Thread类中的start()和run()方法之间的区别&#xff0c;对于深入理解Java并发编程至关重要。以下是这两个方法的…