|
|
本帖最后由 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 内容如下:
- #!/bin/sh
- # 通过 qemu-nbd 实现 vhd 的挂载 ,事先需要安装 qemu-utils , name:vhd4.sh
- # 需要事先 sudo apt-get install qemu-utils
- # 在vhd所在目录新建名为 "v_disk.vhd文件名/p1" 的目录
- # 判断 qemu-nbd 提供的可用于虚拟的 /dev/nbdX 共X=16个,将判断结果存入 目录 "vhd文件名.v_disk" 中的nbdx.tmp 中
- # 把 vhd 文件 虚拟到 /dev/nbdX ,并把 /dev/nbdXp1 挂载到目录 "vhd文件名.v_disk/p1"
- #根据vhd文件路径和名称 确定变量 VhdPath 用于建立挂载目录
- VhdPath=$(realpath "$1").v_disk
- #如果 位置已经被挂载,就退出。
- if [ `df|grep "$VhdPath"|wc -l` -eq 1 ] ;then
- echo 不能重复挂载!
- exit
- fi
- sudo mkdir "$VhdPath/p1" -p
- #找出16个nbd设备中第一个可用于虚拟vhd 的设备 赋值给变量 x
- #如果16个设备 均已被占用 ,那么 x=16
- for x in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ; do
- if ! [ -b /dev/nbd${x}p1 ] ; then
- break
- fi
- done
- #如果 变量 x 不等于 16 就将第一个可用的 nbd 设备写入 挂载目录 下的 nbdx.tmp中, 并挂载 vhd 文件.
- if [ $x -ne 16 ] ;then
- echo nbd${x}>~/nbdx.tmp
- sudo mv ~/nbdx.tmp "$VhdPath/nbdx.tmp"
- echo 正在挂载......
- echo "`realpath "$1"` ==> /dev/nbd${x}"
- echo "/dev/nbd${x}p1 ==> $VhdPath/p1"
- sudo modprobe nbd
- sudo qemu-nbd -c /dev/nbd${x} "`realpath "$1"`"
- #循环 直到 nbd 设备挂载成功
- while ! [ -b /dev/nbd${x}p1 ] ; do
- sleep 1
- echo -n .
- done
- sudo mount /dev/nbd${x}p1 "$VhdPath/p1"
- else
- echo 没有可用的'"qemu-nbd"'设备来挂载虚拟硬盘!
- fi
- echo . && echo End ....
复制代码
|
评分
-
查看全部评分
|