无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 4459|回复: 3
打印 上一主题 下一主题

用 qemu-bnd 实现vhd 的加载. 2016.11.27 更新

  [复制链接]
跳转到指定楼层
1#
发表于 2016-11-25 20:52:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dos时代菜鸟 于 2016-12-1 20:59 编辑

因为 这个想法是 受 ubuntu kylin 论坛
ubuntu挂载vdi
http://www.ubuntukylin.com/ukyli ... iewthread&tid=27107
(出处: Ubuntu Kylin技术论坛)
的启发,所以 在 ubuntu kylin 论坛也发了贴.

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


利用 qemu-nbd 实现 虚拟硬盘的挂载
实现需要安装 qemu-utils  ,ubuntu下安装qemu-utils: sudo apt-get install qemu-utils
脚本用法:
1、挂载: sh vhd4.sh "vhd文件路径"
如:
sh vhd4.sh "/home/a/VirtualBox VMs/xp_sp3_l/xp_sp3_l.vhd"
脚本会在 vhd文件所在目录 针对上面的具体命令也就是 ”/home/a/VirtualBox VMs/xp_sp3_l/“ 下生成 名为 "xp_sp3_l.vhd.v_disk/p1"的文件夹以供挂载 vhd的第一个分区,并把使用的qemu-nbd 设备写入 “xp_sp3_l.vhd.v_disk/nbdx.tmp”

2、卸载: sh uvhd4.sh "vhd文件路径"
如:
sh vhd4.sh "/home/a/VirtualBox VMs/xp_sp3_l/xp_sp3_l.vhd"
脚本会根据 ”/home/a/VirtualBox VMs/xp_sp3_l/xp_sp3_l.vhd.v_disk/nbdx.tmp“ 的内容 卸载 qemu-nbd 设备,并删除 文件夹 “/home/a/VirtualBox VMs/xp_sp3_l/xp_sp3_l.vhd.v_disk/”

qemu-nbd.mount-sh-4.3.zip (2.55 KB, 下载次数: 49)

更新:
2016.11.26
    增加自动判断可用qemu-nbd 设备的功能
    增加循环判断是否挂/卸载成功功能
2016.11.27
    增加防止重复挂载vhd功能,防止因为读写问题导致vhd数据被毁
    增加支持带空格的vhd文件路径做脚本参数


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


vhd4.sh






uvhd4.sh



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 ....

复制代码




评分

参与人数 3无忧币 +15 收起 理由
wintoflash + 5 很给力!
fv132545 + 5 很给力!
zmac2007 + 5

查看全部评分

2#
发表于 2016-11-26 17:07:56 | 只看该作者
牛逼,好方法啊,
回复

使用道具 举报

3#
发表于 2016-11-26 20:47:36 | 只看该作者
菜鸟不知道怎么用

点评

看图  详情 回复 发表于 2016-11-26 21:35
回复

使用道具 举报

4#
 楼主| 发表于 2016-11-26 21:35:09 | 只看该作者
fv132545 发表于 2016-11-26 20:47
菜鸟不知道怎么用

看图
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-12-10 19:47

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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