Ubuntu Kylin技术论坛

 找回密码
查看: 3462|回复: 2

用 qemu-nbd 挂载 虚拟硬盘的 脚本,2016.11.26 改进.

[复制链接]
  • TA的每日心情
    开心
    2018-1-4 15:46
  • 签到天数: 38 天

    [LV.5]常住居民I

    发表于 2016-11-26 18:30:09 | 显示全部楼层 |阅读模式
    本帖最后由 dos时代菜鸟 于 2016-11-27 14:39 编辑

    感谢 ubuntu挂载vdi
    http://www.ubuntukylin.com/ukyli ... iewthread&tid=27107
    (出处: Ubuntu Kylin技术论坛)

    就是 用 qemu-nbd 把 vhd 挂到 /dev/nbdX (x=0~15)
    再把 /dev/nbdXp1 (X=0-15) 也就是 vhd的第一个分区 挂到 vhd所在目录里的新建目录上.
    卸载 过程 与之相反
    这里面需要 考虑  当前可用的 /dev/nbdX 要 0-15 的 排查, 记住 X 是多少,卸载的时候 好用到.当然这个都 是脚本自动完成的.




    vhd4.sh
    1. #!/bin/sh
    2. # 通过 qemu-nbd 实现 vhd 的挂载 ,事先需要安装 qemu-utils , name:vhd4.sh
    3. # 需要事先 sudo apt-get install qemu-utils
    4. # 在vhd所在目录新建名为 "v_disk.vhd文件名/p1" 的目录
    5. # 判断 qemu-nbd 提供的可用于虚拟的 /dev/nbdX 共X=16个,将判断结果存入 目录 "vhd文件名.v_disk" 中的nbdx.tmp 中
    6. # 把 vhd 文件 虚拟到 /dev/nbdX ,并把 /dev/nbdXp1 挂载到目录 "vhd文件名.v_disk/p1"

    7. #根据vhd文件路径和名称 确定变量 VhdPath 用于建立挂载目录
    8. VhdPath=$(realpath "$1").v_disk

    9. #如果 位置已经被挂载,就退出。
    10. if [ `df|grep "$VhdPath"|wc -l` -eq 1 ]  ;then
    11.         echo 不能重复挂载!
    12.         exit
    13. fi

    14. sudo mkdir "$VhdPath/p1" -p

    15. #找出16个nbd设备中第一个可用于虚拟vhd 的设备 赋值给变量 x
    16. #如果16个设备 均已被占用 ,那么 x=16
    17. for x in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  16 ; do
    18.         if  ! [ -b /dev/nbd${x}p1 ] ; then
    19.                 break
    20.         fi
    21. done

    22. #如果 变量 x 不等于 16 就将第一个可用的 nbd 设备写入 挂载目录 下的 nbdx.tmp中, 并挂载 vhd 文件.
    23. if [ $x -ne 16 ] ;then
    24.         echo nbd${x}>~/nbdx.tmp
    25.         sudo mv ~/nbdx.tmp "$VhdPath/nbdx.tmp"
    26.         echo 正在挂载......          
    27.         echo "`realpath "$1"` ==> /dev/nbd${x}"
    28.         echo "/dev/nbd${x}p1 ==> $VhdPath/p1"
    29.         sudo modprobe nbd
    30.         sudo qemu-nbd -c /dev/nbd${x} "`realpath "$1"`"
    31.         #循环 直到 nbd 设备挂载成功
    32.         while  ! [ -b /dev/nbd${x}p1 ] ; do
    33.                 sleep 1
    34.                 echo -n .
    35.         done
    36.         sudo mount /dev/nbd${x}p1 "$VhdPath/p1"
    37. else
    38.         echo 没有可用的'"qemu-nbd"'设备来挂载虚拟硬盘!
    39. fi
    40. echo . && echo End ....
    复制代码




    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x

    评分

    参与人数 1麒麟币 +8 收起 理由
    handsome_feng + 8 赞一个!

    查看全部评分

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-1-4 15:46
  • 签到天数: 38 天

    [LV.5]常住居民I

     楼主| 发表于 2016-11-26 19:38:09 | 显示全部楼层
    本帖最后由 dos时代菜鸟 于 2016-11-26 21:47 编辑

    脚本中用到:
    1.shell 脚本语句:
       if  [];then fi  条件语句
       while [];do done  循环语句
       for x in   ;do  done   循环语句
       breek 跳出循环
       ! [] 条件的应用, 数值对比 字符串对比 运算,  特定设备判定
    2.shell 命令
       mount  umount   分区挂载与卸载
       ` ` 包裹的命令结果输出传递
        变量的设置
       mkdir 文件夹的建立 , rm 删除, cp 拷贝,sleep 延时
      read 读取文件
    3.第三方软件
       qume-utils (qume-nbd) 虚拟硬盘支持组件


    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-1-4 15:46
  • 签到天数: 38 天

    [LV.5]常住居民I

     楼主| 发表于 2017-5-9 15:04:56 | 显示全部楼层
    本帖最后由 dos时代菜鸟 于 2017-5-10 08:40 编辑

    更新下,可以一次自动挂载 虚拟盘中的全部分区。
    附件 附卸载脚本。
    用到了 awk ,df ,fdisk ,正则, 用来计算分析 虚拟硬盘文件分区 信息 和 挂载信息。



    vhd5.sh 内容
    1. #!/bin/sh
    2. # 通过 qemu-nbd 实现 vhd 的挂载 ,事先需要安装 qemu-utils , name:vhd5.sh
    3. # 需要事先 sudo apt-get install qemu-utils
    4. # 在vhd所在目录新建名为 "v_disk.vhd文件名" 的目录
    5. # 把 vhd 文件 虚拟到 /dev/nbdX ,并把虚拟硬盘的各分区 /dev/nbdXpY 挂载到目录 "vhd文件名.v_disk/nbdXpY"

    6. #用法 vhd5.sh vhd文件名 

    7. #判断是否存在vhd文件
    8. if ! [ -f "$1" ] ;then
    9.         echo 文件没找到!
    10.         exit
    11. fi

    12. #根据vhd文件路径和名称 确定变量 VhdPath 用于建立挂载目录 和分区
    13. VhdPath=$(realpath "$1").v_disk

    14. #判断虚拟硬盘文件是否已经被挂载了
    15. if [ `df --output=target | awk -v pl="${VhdPath}" -v a=0 '$0~"^" pl "/nbd[0-9]+p[0-9]+$" {a+=1} END {print a}'` -ge 1 ] ; then
    16.         echo 不可重复挂载!
    17.         exit
    18. fi

    19. #找出16个nbd设备中第一个可用于虚拟 vhd 的设备 赋值给变量 x
    20. #如果16个设备 均已被占用 ,那么 x=16
    21. for x in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  16 ; do
    22.         zj=`df --output=source | awk -v x=${x} -v a="true" '$1~"^/dev/nbd[0-9]+p[0-9]+$" {if (substr($1,9,length(x))==x) { a="false" }} END {print a}'`
    23.         if [ "$zj" = "true" ] ; then
    24.                 break
    25.         fi
    26. done
    27. #如果 变量 x 不等于 16 就将第一个可用的 nbd 设备 挂载 vhd 文件.
    28. if [ $x -ne 16 ] ;then
    29.         echo 正在挂载......          
    30.         echo "`realpath "$1"` ==> /dev/nbd${x}"
    31.         sudo modprobe nbd
    32.         sudo qemu-nbd -c /dev/nbd${x} "`realpath "$1"`"
    33.         #10秒内 循环判断 虚拟硬盘可用分区数量,用已明确 虚拟硬盘是否已经被挂载且有可用于挂载的分区,如果否,就卸之并退出。
    34.         #挂载需要时间,而且15秒 都不能 挂上,也就可以不用挂了。       
    35.         for n in  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  ; do                
    36.                 echo -n .
    37.                 sleep 1
    38.                 px=`sudo fdisk -l /dev/nbd${x}|awk -v a=0 '$1~"^/dev/nbd[0-9]+p[0-9]+$"&&$6!~"^[5f]$"&&$6!="85" {a+=1} END {print a}'`
    39.                 if [ ${px} -ge 1 ] ;then
    40.                         break
    41.                 fi
    42.         done
    43.         if  [ $px -eq 0 ] ;then
    44.                 echo 虚拟硬盘文件不可用,或者没有可用分区!
    45.                 sudo qemu-nbd -d /dev/nbd${x}
    46.                 exit
    47.         else
    48.                 echo 发现可用分区! $px
    49.         fi

    50.         #创建挂载目录
    51.         sudo mkdir "$VhdPath" -p
    52.         #找出虚拟硬盘的各个 可用分区并 逐一挂载。
    53.         for x in `sudo fdisk -l /dev/nbd${x}|awk '$1~"^/dev/nbd[0-9]+p[0-9]+$"&&$6!~"^[5f]$"&&$6!="85" {print substr($1,6)}'` ; do
    54.                 sudo mkdir "${VhdPath}/${x}" -p
    55.                 echo "/dev/${x} ==> ${VhdPath}/${x}"
    56.                 #循环判断分区是否成功挂载 挂载成功就进行下一分区的挂载。               
    57.                 while [ `df --output=target | awk -v a=0 -v pl="${VhdPath}/${x}" '$0~"^"pl"$" {a+=1} END {print a}'` -eq 0 ] ; do
    58.                         echo -n ..
    59.                         sudo mount /dev/${x} "${VhdPath}/${x}"
    60.                         sleep 1
    61.                 done
    62.                 echo .
    63.         done
    64. else
    65.         echo 没有可用的'"qemu-nbd"'设备来挂载虚拟硬盘!
    66. fi
    67. echo End ....

    复制代码



    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|Ubuntu Kylin    

    GMT+8, 2019-7-23 16:08 , Processed in 0.048082 second(s), 11 queries , File On.

    Copyright ©2013-2019 Ubuntu Kylin. All Rights Reserved .

    ICP No. 15002470-2 Tianjin

    快速回复 返回顶部 返回列表