无忧启动论坛

标题: 从 固定VHD与只读squashfs引导LINUX, UBUNTU ARCH Fedora Opensuse Mageia五种 [打印本页]

作者: 2011niumao    时间: 2014-6-29 15:33
标题: 从 固定VHD与只读squashfs引导LINUX, UBUNTU ARCH Fedora Opensuse Mageia五种
本帖最后由 2011niumao 于 2022-10-16 10:59 编辑

从 固定VHD系统与只读squashfs系统引导LINUX, UBUNTU ARCH Fedora Opensuse Mageia五种

新教程(还在以下原来的百度云链接下载)

制作vhd的UBUNTU.pdf

在虚拟机内可以直接复制粘贴 pdf 教程里的命令和代码,这样就对网友们友好多了。

local文件里增加的代码也可以看第572楼,573楼:

http://bbs.wuyou.net/forum.php?m ... 0&extra=#pid4689869


新版ntfs-3g-2021与新版grubsmall2022(没有新系统)。 新版grubsmall2022的菜单针对的是以下部署,

vhd文件名为 ubt.vhd ,和两个引导文件 vmlinuz initrd.img 一起放在一个硬盘根分区下

如果你的部署与此不同,根据具体情况编辑grub2菜单来调整引导参数,编辑一下菜单即可。

注释:如果依照mydracut教程制作的Fedora的vhd,squashfs不能引导,编辑grub2菜单,把root参数改用LABEL=XXXX(不含中文),这里XXXX是vhd文件所在分区卷标。并在其后面加入 selinux=0, 如下代码所示,即可正确引导。
  1. linux         /vmlinuz  root=LABEL=XXXX  kloop=/Fedora.vhd kroot=/dev/mapper/loop0p1 selinux=0
复制代码

以下旧信息

引导只读squashfs系统的方法请下载链接中的更新好的mydracut.zip文件。内含说明。
https://pan.baidu.com/s/18NTBbzlVLdHXxUcnpXFMNw
提取码 w4af

用户名 所有密码都是 ubuntu .
用户名密码,root密码都是ubuntu .
,
        安装grub2的参考命令:
        sudo mount /dev/mapper/loop2p1 /mnt
        sudo grub-install  --root-directory=/mnt  /dev/loop2

(新版的/usr/share/initramfs-tools/scripts/local-bottom/ntfs_3g。可以直接覆盖本地同名文件。旧版关机时会引起panic)
  1. #!/bin/sh

  2. set -e
  3. case "${1}" in
  4.         prereqs)
  5.                 exit 0
  6.                 ;;
  7. esac

  8. if [ "${ROOTFSTYPE}" = ntfs ] || [ "${ROOTFSTYPE}" = ntfs-3g ] || \
  9.    [ "${LOOPFSTYPE}" = ntfs ] || [ "${LOOPFSTYPE}" = ntfs-3g ] || [ -n "$KLOOP" ] || [ -n "$SQUASHFS" ]
  10. then
  11.         mkdir -p /run/sendsigs.omit.d
  12.         pidof @ount.ntfs-3g >> /run/sendsigs.omit.d/ntfs-3g
  13. fi
  14. exit 0
复制代码

mydracut.zip

1.34 MB, 下载次数: 538, 下载积分: 无忧币 -2

引导固定vhd只读squashfs的linux

ubuntukloopnew.zip

406.8 KB, 下载次数: 101, 下载积分: 无忧币 -2

详细注释

ntfs_3g.zip

387 Bytes, 下载次数: 39, 下载积分: 无忧币 -2

依照此附件编辑或者覆盖ntfs_3g


作者: 2011niumao    时间: 2014-6-29 15:37
本帖最后由 2011niumao 于 2014-12-13 18:34 编辑

UBUNTU制作可以引导VHD系统的initrd.img 的方法
http://pan.baidu.com/s/1mgFi1Qg

0.在windows系统下
使用virtualbox软件建立固定大小的vhd虚拟磁盘文件.
推荐16g大小.注意不可以使用动态大小的vhd,只能使用固定大小的vhd.
下载并使用UBUNTU安装盘将UBUNTU系统安装在vhd上面====只分一个主分区来挂载/目录.分成多个主分区请看注释。

注释:分成多个主分区也可以的。如果有多个分区,注意修改vlooppart参数的值,使得它指向/分区。例如vhd分三个区,/挂载在第三个分区,则引导参数改为 vlooppart=p3。此外不支持逻辑分区。所以如果分区较多,可以使用gpt格式磁盘。如果不分区或分区个数不超过4,可以使用mbr格式并把所有分区设定为主分区。

以下制作能够直接引导vhd内UBUNTU系统的initrd.img文件:

1.首先安装kpartx,kpartx-boot,util-linux,dm-setup一些软件。
可以在新立得中搜索安装。也可以使用命令。
打开一个终端,输入
  1. sudo apt-get install kpartx kpartx-boot util-linux dmsetup
复制代码

2.修改两个文件:local  mkinitramfs
先备份两个文件
  1. sudo cp /usr/share/initramfs-tools/scripts/local ./local.backup
  2. sudo cp /usr/sbin/mkinitramfs ./mkinitramfs.backup
复制代码

再依次修改两个文件:
修改local文件
  1. sudo gedit /usr/share/initramfs-tools/scripts/local
复制代码

再将本附件所带的local文件用gedit打开,找到如下部分
  1.         ##############################################################
  2.         #                         TO BOOT FROM VHD                   #
  3.         ##############################################################
  4.         for x in $(cat /proc/cmdline); do
  5.         case $x in
  6.         vloop=*)
  7.                 VLOOP="${x#vloop=}"
  8.                 ;;
  9.         vlooppart=*)
  10.                 VLOOPPART="${x#vlooppart=}"
  11.                 ;;
  12.         vloopfstype=*)
  13.                 VLOOPFSTYPE="${x#vloopfstype=}"       
  14.                 ;;
  15.         vloopcheck=*)
  16.                 VLOOPCHECK="${x#vloopcheck=}"       
  17.                 ;;
  18.         esac
  19.         done
  20.         if [ "$VLOOP" ]; then
  21.                 if [ "$mountroot_status" != 0 ]; then
  22.                         if [ ${FSTYPE} = ntfs ] || [ ${FSTYPE} = vfat ]; then
  23.                                 panic "
  24.                 Could not mount the partition ${ROOT}.
  25.                 This could also happen if the file system is not clean because of an operating
  26.                 system crash, an interrupted boot process, an improper shutdown, or unplugging
  27.                 of a removable device without first unmounting or ejecting it.  To fix this,
  28.                 simply reboot into Windows, let it fully start, log in, run 'chkdsk /r', then
  29.                 gracefully shut down and reboot back into Windows. After this you should be
  30.                 able to reboot again and resume the installation.
  31.                 (filesystem = ${FSTYPE}, error code = $mountroot_status)"
  32.                         fi
  33.                 fi
  34.        
  35.                 mkdir -p /host
  36.                 mount -o move ${rootmnt} /host

  37.                 str=${VLOOP}

  38.                 disk_files="/host${str}"                       
  39.                
  40.                 # FIXME This has no error checking
  41.                 modprobe loop
  42.                 kpartx -av "${disk_files}"
  43.                 sleep 3
  44.                
  45.                 # Get the vloop filesystem type if not set
  46.                 if [ -z "${VLOOPFSTYPE}" ]; then
  47.                         FSTYPE="unknown"
  48.                 else
  49.                         FSTYPE="${VLOOPFSTYPE}"
  50.                 fi
  51.                 if [ "$FSTYPE" = "unknown" ] && [ -x /sbin/blkid ]; then
  52.                         FSTYPE=$(/sbin/blkid -s TYPE -o value "/dev/mapper/loop0${VLOOPPART}")
  53.                         [ -z "$FSTYPE" ] && FSTYPE="ext4"
  54.                 fi
  55.                
  56.                 if [ ${readonly} = y ]; then
  57.                         roflag=-r
  58.                 else
  59.                         roflag=-w
  60.                 fi
  61.                
  62.                 [ -z "$VLOOPCHECK" ] && VLOOPCHECK="no"
  63.                 if [ "$VLOOPCHECK" = "yes" ] ; then
  64.                 echo "checking vloop / filesystem, please wait....."
  65.                 fsck.${FSTYPE} -a "/dev/mapper/loop0${VLOOPPART}"
  66.                 fi
  67.                        
  68.                 mount -t ${FSTYPE} "/dev/mapper/loop0${VLOOPPART}" ${rootmnt}       

  69.                 if [ -d ${rootmnt}/host ]; then
  70.                         mount -o move /host ${rootmnt}/host
  71.                 fi
  72.         fi
  73.         ##############################################################
  74.         #                     end,      TO BOOT FROM VHD             #
  75.         ##############################################################
复制代码

拷贝到/usr/share/initramfs-tools/scripts/local 文件的相同位置处。
这个位置在文件最后几行上面,最后结果,接着上面的这段后面是以下几行。
  1. [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-bottom"
  2.         run_scripts /scripts/local-bottom
  3.         [ "$quiet" != "y" ] && log_end_msg
  4. }
复制代码

该文件结束。

注释: 新增两个控制参数: vloopfstype=ext4 ---说明vhd中根文件系统的文件系统类型。
vloopcheck=yes 或 no  ---控制启动时强制做一次磁盘检查。比较简陋。如果没有特殊需要不用理会。
3 修改mkinitramfs文件
  1. sudo gedit /usr/sbin/mkinitramfs
复制代码

找到# util-linux,在其下插入以下几行:
  1. copy_exec /sbin/losetup /sbin
  2. copy_exec /sbin/kpartx /sbin
  3. copy_exec /sbin/shutdown /shutdown
  4. cp -a /sbin/fsck*  ${DESTDIR}/sbin/
  5. copy_exec /sbin/e2fsck /sbin
  6. touch ${DESTDIR}/etc/initrd-release
  7. touch ${DESTDIR}/version
复制代码

最后该处几个语句为
  1. # util-linux
  2. copy_exec /sbin/blkid /sbin
  3. copy_exec /sbin/losetup /sbin
  4. copy_exec /sbin/kpartx /sbin
  5. copy_exec /sbin/shutdown /shutdown
  6. cp -a /sbin/fsck*  ${DESTDIR}/sbin/
  7. copy_exec /sbin/e2fsck /sbin
  8. touch ${DESTDIR}/etc/initrd-release
  9. touch ${DESTDIR}/version
复制代码

记得保存一下。

第四步第五步可选。不执行也可以的。实际上只有在使用ubuntu内核引导其他LINUX发行版
特别是使用systemd的发行版时候才需要第四步第五步。但是据说UBUNTU在14.10版本也要
使用systemd了。所以这一步到时候也许也必须作了。其方法来自于互联网
http://www.freedesktop.org/wiki/ ... RootStorageDaemons/
http://www.freedesktop.org/wiki/Software/systemd/InitrdInterface/

4.附件ntfs-3g_ntfsprogs-2014.2.15.fixed 是已经修改好的ntfs-3g源码.
对他手工编译安装.
打开一个终端.进入该目录.依次执行以下命令:
  1. ./configure
  2. make
  3. sudo make install
复制代码

(这一步是为了在使用了 systemd 的linux系统中避免关机时候出现 buffer I/O 错误
====UBUNTU计划在14.10版中使用systemd
====也许到时候会有官方的避免出现 buffer  I/O 错误的机制 发布出来.
目前只有这个重编译 ntfs-3g源码 的方法====实际上是 systemd 官方推荐的方法)


5.编辑文件:/usr/share/initramfs-tools/scripts/local-bottom/ntfs_3g .

  1. sudo gedit /usr/share/initramfs-tools/scripts/local-bottom/ntfs_3g
复制代码

将以下拷贝覆盖原始内容即可。
  1. #!/bin/sh
  2. ##set -e
  3. ##case "${1}" in
  4. ##        prereqs)
  5. ##                exit 0
  6. ##                ;;
  7. ##esac

  8. if [ "${ROOTFSTYPE}" = ntfs ] || [ "${ROOTFSTYPE}" = ntfs-3g ] || \
  9.    [ "${LOOPFSTYPE}" = ntfs ] || [ "${LOOPFSTYPE}" = ntfs-3g ]
  10. then
  11.         mkdir -p /run/sendsigs.omit.d
  12.         pidof mount.ntfs >> /run/sendsigs.omit.d/ntfs-3g
  13.         pidof mount.ntfs-3g >> /run/sendsigs.omit.d/ntfs-3g
  14. fi
  15. #####################################################################
  16. ##the following maybe help to resolve the buffer I/O error problem
  17. ##when reboot or halt.
  18. #####################################################################

  19. if [ -d /run/initramfs -a -f /init ]
  20. then
  21.         mkdir -p /run/initramfs/dev /run/initramfs/host /run/initramfs/proc /run/initramfs/root /run/initramfs/run /run/initramfs/sys /run/initramfs/tmp
  22.         rm -rf   /lib/modules
  23.         for xxx in /*
  24.           do       
  25.         if [ ${xxx} = "/dev" -o ${xxx} = "/host" -o ${xxx} = "/proc" -o ${xxx} = "/root" -o ${xxx} = "/run" -o ${xxx} = "/sys" -o ${xxx} = "/tmp" ];
  26.         then
  27.                 :
  28.         else
  29.                 cp -a ${xxx} /run/initramfs/  1>/dev/null 2>&1;
  30.         fi
  31.         done
  32.         unset xxx
  33. fi
  34. ####################################################################
  35. exit 0
复制代码



6.生成initrd.img文件
  1. sudo /usr/sbin/mkinitramfs -o ~/initrd.img (可以加上版本号得到其他内核版本的initrd.img)
复制代码

7,引导设置有两种方式: grub2 grub4dos .
当然最好是自动搜索确定UUID并把它传给内核.
这样只需要设置启动到grub4dos grub2就可以了.不需要手工修改menu.lst grub.cfg.
而设置启动,对于win7 可以使用bootice编辑修改BCD文件.对于winxp,可以编辑修改boot.ini文件做到.
参看 grub通用启动器20130724 的说明.


grub4dos比较简单好用,但是不能用于UEFI-gpt的电脑.只能用于BIOS-MBR.
grub4dos自动搜索UUID的菜单例子
  1. title VBUNTUFIX uuid-auto-probe
  2. find --set-root --ignore-floppies --ignore-cd /vbuntufix/vbuntufix.vhd
  3. uuid ()
  4. kernel /vbuntufix/vmlinuz  root=UUID=%?% vloop=/vbuntufix/vbuntufix.vhd vlooppart=p1
  5. initrd /vbuntufix/initrd.img
复制代码

grub2适用于UEFI与 BIOS,应用范围较广。
grub2自动探测UUID的菜单
  1. menuentry 'VBUNTUFIX linux' --class ubuntu --class gnu-linux --class gnu --class os {
  2.         recordfail
  3.         insmod gzio
  4.         insmod part_msdos
  5.         insmod part_gpt
  6.         insmod ext2
  7.         insmod ntfs
  8.         insmod probe
  9.         insmod search
  10.         search --no-floppy -f --set=aabbcc /vbuntufix/vbuntufix.vhd
  11.         set root=${aabbcc}
  12.         probe -u --set=ddeeff ${aabbcc}
  13.         linux        /vbuntufix/vmlinuz root=UUID=${ddeeff} vloop=/vbuntufix/vbuntufix.vhd vlooppart=p1
  14.         initrd        /vbuntufix/initrd.img
  15. }
复制代码


作者: yang77    时间: 2014-6-29 23:12
很牛的教程,支持一个
作者: 七彩云南    时间: 2014-6-30 17:42
好,非常好。

不知道VBOX的方法能否用在VMWare上,准备把VMWare下的Linux做个VHD实机用。
作者: totootao    时间: 2014-7-1 21:48
今天使用virtualbox安装了麒麟系统的vhd,用楼主提供的工具引导进入系统后,无法使用wifi,请问楼主制作ubuntu vhd时 wifi是如何设置的?
作者: 得意情长剑    时间: 2014-7-17 23:50
牛教程。
作者: 毅然决然    时间: 2014-8-3 06:50
2011niumao 发表于 2014-6-29 15:37
UBUNTU制作可以引导VHD系统的initrd.img 的方法
http://pan.baidu.com/s/1xVvXG

好详细啊!学习学习!
作者: 黑色→风格    时间: 2014-8-6 00:48
很有研究价值,谢谢楼主分享
作者: czswuyou    时间: 2014-8-6 11:20
好好学习研究一下
支持楼主
支持论坛
作者: mouxiaoyi    时间: 2014-8-18 20:06
2011niumao 发表于 2014-6-29 15:37
UBUNTU制作可以引导VHD系统的initrd.img 的方法
http://pan.baidu.com/s/1xVvXG

这个方法适用于任何版本的Ubuntu吗
作者: mouxiaoyi    时间: 2014-8-19 20:34
mouxiaoyi 发表于 2014-8-18 20:06
这个方法适用于任何版本的Ubuntu吗

LZ你好。我按照方法来做,,不能挂载根系统。。我是这样做的,以13.04为例:在vbox创建ubuntu1304.vhd,并在ubuntu13.04中按照lz的方法创建initrd.img-13.04,依然采用13.04的vmlinuz,,,使用这三个文件在grub2中引导,,,这样做对不对。。。我对lz的理解有误吗。。。vhd配置问题?vmlinuz不应该使用系统的缺省内核?求解答。

QQ截图20140819202808.jpg (145.84 KB, 下载次数: 481)

QQ截图20140819202808.jpg

作者: 2011niumao    时间: 2014-8-20 10:10
mouxiaoyi 发表于 2014-8-19 20:34
LZ你好。我按照方法来做,,不能挂载根系统。。我是这样做的,以13.04为例:在vbox创建ubuntu1304.vhd,并 ...

从图片看已经成功识别挂载vhd了。做法没有问题。
根分区没有挂载成功。
你的 vhd 文件内部的分区比较多,看样子是3个???如果有逻辑分区。似乎是不行的。
根分区是逻辑分区?
在引导时候grub2菜单界面按e,把vlooppart=p1 改为 vlooppart=p5 试试看。
或者手动对vhd分区,保证都是主分区。

作者: mouxiaoyi    时间: 2014-8-20 11:06
2011niumao 发表于 2014-8-20 10:10
从图片看已经成功识别挂载vhd了。做法没有问题。
根分区没有挂载成功。
你的 vhd 文件内部的分区比较多 ...

两个,都是主分区,15.5G,510M
作者: 2011niumao    时间: 2014-8-20 12:11
mouxiaoyi 发表于 2014-8-20 11:06
两个,都是主分区,15.5G,510M

注意到照片中的两句:
add map loop0p2 .....
add map loop0p5.....
所以vhd文件中有分区对应于 p2 p5.但是p5一般是逻辑分区(对于mbr的vhd)。
所以怀疑vhd文件中有逻辑分区。
正常情况应该是
add map loop0p1 .....
add map loop0p2 .....

注意调整vlooppart参数使得他对应到vhd中主分区的序号。
作者: 2011niumao    时间: 2014-8-20 20:32
mouxiaoyi 发表于 2014-8-19 20:34
LZ你好。我按照方法来做,,不能挂载根系统。。我是这样做的,以13.04为例:在vbox创建ubuntu1304.vhd,并 ...

在更新到最新的 ubuntu1404 中简单测试一下后,发现逻辑分区也许可以的。
所以你可以试试引导时候把vlooppart=p1 更改为 vlooppart=p5  也许就可以了。
作者: mouxiaoyi    时间: 2014-8-21 19:12
看了楼主的另一篇文章,,把第三个文件init也修改了,然后成功了。
作者: 2011hjcjie    时间: 2014-9-2 09:53
本帖最后由 2011hjcjie 于 2014-9-2 09:56 编辑

新买笔记本,按以前台式机安装方法测试,启动失败(GPT)。
是否不支持 haswell平台的原因,(我新买的电脑CPU I7-4710mQ; 显卡 NVIDIA gtx880m)
---回复主题错误,请无视...

作者: hulala    时间: 2014-9-25 12:01
楼主,按照你的GRUB4DOS菜单,好像找不到第二个分区下面的 archvhd/arch.vhd文件。


title Archlinux uuid-auto-probe
find --set-root --ignore-floppies --ignore-cd /archvhd/arch.vhd
uuid ()
kernel  /archvhd/vmlinuz-linux root=UUID=%?%  vloop=/archvhd/arch.vhd vlooppart=p2
initrd  /archvhd/initramfs-linux.img

IMG_20140924_195017.jpg (192.71 KB, 下载次数: 463)

VHD

VHD

作者: 2011niumao    时间: 2014-9-25 12:40
hulala 发表于 2014-9-25 12:01
楼主,按照你的GRUB4DOS菜单,好像找不到第二个分区下面的 archvhd/arch.vhd文件。

菜单没有错阿。我这里用的很好的。
请检查菜单是否有拼写错误,文件 /archvhd/arch.vhd 路径是不是正确。
特别是会不会多一个空格。
我有几次多了一个=后面空格引导失败的情况。

最后可以考虑升级grub4dos   把最新版grub4dos的grldr  grldr.mbr 拿来覆盖原来的同名文件即可。
作者: 2011niumao    时间: 2014-9-25 12:43
hulala 发表于 2014-9-25 12:01
楼主,按照你的GRUB4DOS菜单,好像找不到第二个分区下面的 archvhd/arch.vhd文件。

也可以把root=UUID=%?% 改为 root=/dev/sdax  这样的。
或者手工查出 UUID .用UUID的值替换掉 %?% 。
作者: hulala    时间: 2014-9-26 16:06
2011niumao 发表于 2014-9-25 12:43
也可以把root=UUID=%?% 改为 root=/dev/sdax  这样的。
或者手工查出 UUID .用UUID的值替换掉 %?% 。

用你的菜单,启动一次会看到UUID,然后重启用UUID的值填上,替换掉 %?%后可以启动了,是不是语句没有把得到UUID的值给到第4句?
作者: 2011niumao    时间: 2014-9-26 17:04
本帖最后由 2011niumao 于 2014-9-26 17:06 编辑
hulala 发表于 2014-9-26 16:06
用你的菜单,启动一次会看到UUID,然后重启用UUID的值填上,替换掉 %?%后可以启动了,是不是语句没有把得 ...


成功就好。应该是你说的那样。
不过 看不出为什么传递不过来。
作者: sherylynn    时间: 2014-11-24 22:13
Ubuntu升级到14.10,请问一下楼主制作方法有改变么
systemd在社区已经吵的沸沸扬扬的
作者: 2011niumao    时间: 2014-11-25 08:45
sherylynn 发表于 2014-11-24 22:13
Ubuntu升级到14.10,请问一下楼主制作方法有改变么
systemd在社区已经吵的沸沸扬扬的

这里的制作方法已经是适用于 使用systemd的LINUX系统 的了 。所以不需要改变。
不过近期来感觉对固定大小VHD分区更好。
在WIN7 下制作好 mbr格式固定大小24G vhd,分为
320M  fat32 EFI分区。2G SWAP分区。其余给 / 分区。
这样不至于空间紧张。
作者: William叔叔    时间: 2014-12-12 15:02
为什么大神不出一个视频教程,逐步教大家安装细节,配合文字不是效果更好吗,我一直再用大神的方法做的VHD-ubuntu,并且配合大神给的启动器我编辑的启动菜单主题(不知发给大神的主题包有没有被采纳更新到新版的启动器里面),我把VHD系统迁移到了移动硬盘上,随处带随时用,又好看又方便啊,很多人看了也惊艳不已。

我最近有空不介意我帮忙录一个ubuntu的VHD制作教程吧,先做好你审核一下在发出来这样应该让很多尝试VHD-linux新手容易明白得多。

离开好久我又来了,其实我很想知道有没有可能启动子VHD呢,因为我每次进行稍大动作的修改,我都会回到windows将原本的vhd系统磁盘差分一个子磁盘,将子磁盘挂载启动到vmware(用vmware是因为Vbox好像不能启动子VHD所以用)里面在修改,就算失败也不影响我的原有系统使用,什么时候有修改就这样用,当然没事谁也不会老改系统,正常用不折腾也就不会不稳定,这样我稳定使用很久也不重装系统,有修改就用vmware试一下,但是vmware不能模拟显卡,所以我想如果能启动到差分磁盘我就可以大胆一点装独显驱动了,当然只是想知道是否有这个可能性和方法,毕竟很想装独显驱动,但是之前失败了几次,每次我都重装unity才没事,需求一般所以一直就集显了事,但是不知道这样的想法有没有可能啊。
作者: 2011niumao    时间: 2014-12-12 20:09
William叔叔 发表于 2014-12-12 15:02
为什么大神不出一个视频教程,逐步教大家安装细节,配合文字不是效果更好吗,我一直再用大神的方法做的VHD- ...

欢迎William叔叔回来.
你发的主题我很喜欢,感觉很炫.已经合并到新版的VHD系统和启动器(2014-12-06)中了.
链接见
http://pan.baidu.com/s/1hqopezq
制作好的有引导VHD功能的initrd.img的下载链接
http://pan.baidu.com/s/1mgFi1Qg
没有制作视频是因为主要困难是UBUNTU系统的安装---这方面教程已经比较多了.
如果安装好了UBUNTU系统,那么制作有引导VHD功能的initrd应该就不难了.
也可以到上面第二个链接直接下载制作好的来使用,不用自己制作了.

当然欢迎你制作一个教学视频.审核谈不上,可以看看帮助补充完善也许没有问题.

显卡驱动问题一直比较难.不过最近UBUNTU更新很多.建议更新到最新的14041,内核版本
是今天刚刚更新的3.16.0-28.也可以在新立得里面手动安装.也许就不需要专有驱动了.
作者: is286    时间: 2014-12-13 13:44
为什么ubuntu的vhd都好大好大啊

作者: 2011niumao    时间: 2014-12-13 13:49
is286 发表于 2014-12-13 13:44
为什么ubuntu的vhd都好大好大啊

哦.只是设计的大了.如果设置小,例如8G左右,也没有问题.
但就只安装系统和一些简单软件了.
如果要求体积小,可以下载或自己制作LIVE系统.一般1G左右.
作者: jxdeng    时间: 2015-1-2 21:04
安装LZ 的大法,我做了一个ubuntukylin 1404 的 VHD,有稍稍不成功。一是一定要把新定制的 ubkylin.vhd , initrd.img-3.16.0-23-generic , vmlinuz-3.16.0-23 等放到ubuntu 文件夹吗? 自定义一个ubkylin文件夹可以吗?
二是 VHD文件内一定要安装装kpartx,kpartx-boot,util-linux,dm-setup一些软件吗?
作者: 2011niumao    时间: 2015-1-2 22:26
jxdeng 发表于 2015-1-2 21:04
安装LZ 的大法,我做了一个ubuntukylin 1404 的 VHD,有稍稍不成功。一是一定要把新定制的 ubkylin.vhd , i ...

二中kpartx kpartx-boot 是必须的.另外两个util-linux dm-setup 是不是必须没有仔细验证过.欢迎你测试后给出结论.
一当然不一定非要叫ubuntu了,可以更改为任意名字.只要手工编辑菜单,把文件的路径修改好就可以了.目录叫ubuntu主要是为了新手方便,不需要编辑菜单
作者: jxdeng    时间: 2015-1-4 15:58
感谢LZ, 我做的 ubuntukylin 1404 的 VHD,启动成功。看来kpartx,kpartx-boot 是必须的。不知其它非ubuntu LIUNX 能否依此法成功? 我较急需要一个SUSE linux 9/10 Ent server 的VHD系统。
作者: 2011niumao    时间: 2015-1-4 16:17
本帖最后由 2011niumao 于 2015-1-4 18:02 编辑
jxdeng 发表于 2015-1-4 15:58
感谢LZ, 我做的 ubuntukylin 1404 的 VHD,启动成功。看来kpartx,kpartx-boot 是必须的。不知其它非ubuntu ...


一般LINUX原理上应该都是可以的.但是具体实现由于命令不同变化很大.
例如ARCH上是 partx 命令 而不是 kpartx .VHD的根分区挂载在 /dev/loop0p1 而不是 /dev/mapper/loop0p1 .
这一点似乎ARCH与其他linux一样.UBUNTU自己特殊.

至于 SUSE, 也可以先安装到固定大小VHD中.然后使用UBUNTU定制的vmlinuz initrd.img去引导VHD的SUSE.
只要把UBUNTU系统 /lib/modules/下的同版本子目录 拷贝到VHD的/lib/modules/ 下就可以引导起来.
使用上没有大问题.

或者 使用ARCH的制作好的可以引导VHD的内核来引导SUSE.方法相同.
本帖链接有下载===制作好的可以引导VHD的UBUNTU ARCHLINUX的内核及其 内核模块目录(点zip文件)
作者: 2011niumao    时间: 2015-1-9 15:00
标题: Fedora21与OPENSUSE13.2可VHD启动
本帖最后由 2011niumao 于 2015-1-11 10:51 编辑
jxdeng 发表于 2015-1-4 15:58
感谢LZ, 我做的 ubuntukylin 1404 的 VHD,启动成功。看来kpartx,kpartx-boot 是必须的。不知其它非ubuntu ...


发布一个制作可引导固定大小VHD的dracut制作方法.包含Fedora 与 Opensuse两种.但都是桌面版的.
Fedora 21 与 OPENSUSE13.2 .
按理也可以适用于服务器版本.可以尝试一下.
点击一楼链接,下载其中的  mydracut.zip 文件

作者: 2011niumao    时间: 2015-1-9 15:50
本帖最后由 2011niumao 于 2015-1-9 15:52 编辑

上传两个制作好的可以引导固定大小的VHD系统的 dracut , 都是精简过的.我使用正常.
opensuse 13.2 64位 的两个引导文件 在 dracut-opensuse.zip 中. 版本  3.16.6-2-desktop .
fedora 21 64位 的两个引导文件 在 dracut-fedora.zip 中  版本 3.17.7-300.fc21.x86_64

请到一楼链接下载.另外从UBUNTU使用来看 64位的内核也可以引导32位系统.
所以如果是32位的固定大小VHD的LINUX系统,也可以试试使用他们引导.
作者: jxdeng    时间: 2015-1-10 17:40
恭喜LZ又拓宽了VHD_LINUX的应用范围。感谢LZ提供的内核。我测试了一下。全部成功。又学到了新的 dracut 。但是 我在改造 suse linux server 11 时 碰到了困难。1、kpartx kpartx-boot 不知怎么装 ? 2、它的内核为2.6.27-19-5 ,我用LZ的3.8.0-39版内核,上去后,一败涂地。 不知有何方法。请教 LZ  .
作者: 2011niumao    时间: 2015-1-10 22:58
本帖最后由 2011niumao 于 2015-1-10 23:12 编辑
jxdeng 发表于 2015-1-10 17:40
恭喜LZ又拓宽了VHD_LINUX的应用范围。感谢LZ提供的内核。我测试了一下。全部成功。又学到了新的 dracut 。 ...


多谢反馈.对于suse linux server 11不了解.
第一点 一个好的方面是 应该不需要要安装kpartx kpartx-boot.似乎只有UBUNTU使用kpartx-tool.
其他linux都是使用 partx  一般都是已经预装好的.
可以在终端敲入 partx 看看是什么反应.
或者 先制作一个固定大小VHD ,起名字比如说 ubuntu.vhd .在suse系统里面,在终端 输入
  1. partx -av ubuntu.vhd
复制代码
如果有 add loop0p1 什么的就说明可识别挂载vhd,从而也可引导.
第二点 是否需要suse系统能读写ntfs分区===如果你想把suse 制作成固定大小vhd 放在ntfs分区上===就需要安装ntfs-3g 不过这个手工编译修改过的ntfs-3g 就可以.应该不成问题.
第三点 就是制作initrd了.这里有两种模式,
一种是使用dracut---这意味着系统和initrd都使用systemd,这时候可以使用mydracut里面介绍的操作.  
一种是initrd还是传统的,没有使用systemd的initramfs ,可以像ARCH那样直接修改 init文件.

不管是哪一种,有一个相同的思路是:  根据引导参数,设置变量  vloop vlooppart .
在系统挂载根目录以前,判断vloop是不是非空.如果非空,则 把vhd所在分区(一般ntfs)挂载在 /host 上,
把vhd文件利用partx命令挂在 loop设备上,再把root变量的内容 修改为 /dev/loop0$VLOOPPART ,就行了.

以下就交给原始代码继续引导即可,   
作者: 2011niumao    时间: 2015-1-11 10:47
标题: Mageia4可以VHD启动
本帖最后由 2011niumao 于 2015-1-11 10:54 编辑

更新了mydracut.zip  加入了对于Mageia4的制作dracut教程.
上传了Mageia4 64位的可以引导固定VHD的dracut 版本 3.14.27-desktop-1.mga4
文件名 dracut-mageia.zip ==================请在1楼链接查找下载.

发现一个关键点 应该修改的配置文件是 /etc/dracut.conf
把其中两行修改为
  1. # dracut modules to add to the default
  2. add_dracutmodules+=" systemd "

  3. # additional kernel modules to the default
  4. add_drivers+=" fuse loop "
复制代码

就是说 内核模块 fuse  loop 必须加入到 dracut中.
至于fedora21 opensuse13.2 它是默认加入所有内核模块到dracut中.
Mageia4不是默认.那就必须明确声明了.
作者: jxdeng    时间: 2015-1-11 16:48
本帖最后由 jxdeng 于 2015-1-11 16:58 编辑

LZ威武。又攻下一城。 有时间的话能否攻攻centOS / SUSE SERVER 。对suse server 11 我再次探索:1、用LZ现成的openSUSE132的内核,能走一段,到“starting show plymouth boot screen....”死机。停在“vgaarb: device changed decodes: PCI:0000:0:02.0, OLDDECODEW=IO+MEM,DECODES=IO+MEN:OWNS=io+mem " 。

2、用LZ的ARCH 内核 3.14.6.1-ARCH,lib/modules 目录替换。已验证 partx 正常。启动时,报 找不到 “vmlinuz-linux-3.14.6-1-ARCH”文件的错误。引导串没有问题。奇怪。
3、它的 initramfs/local 好像没有?
作者: 2011niumao    时间: 2015-1-11 17:05
本帖最后由 2011niumao 于 2015-1-11 17:24 编辑
jxdeng 发表于 2015-1-11 16:48
LZ威武。又攻下一城。 有时间的话能否攻攻centOS / SUSE SERVER 。对suse server 11 我再次探索:1、用LZ现 ...


呵呵 多谢助威.主要是对server没有需求,不会花太多时间装配它.  
1 这个估计是已经挂载上vhd了.但转换到vhd内系统以后有一个版本不一致的问题.vmlinuz是新版本,系统未必能配合的上---毕竟系统是配合2.7 的---差别太大.
2 估计是vmlinuz-linux-3.14.6-1-ARCH的路径没有写对.
3 请判断一下你的suse 是否是dracut?还是 initramfs 方法是在终端执行
sudo dracut -o ~/dracut-test
看看输出是什么 就可以判断出来的,
如果是 dracut 那么按照mydracut.zip文件中mageia子目录提供的正确方法操作,应该可以.
4 没有local目录也正常的.如果方便,并且判断系统使用的是传统的initramfs,请你发一份 init 文件上来.大概是 /usr/share/initramfs-tools/init 这个文件.
感觉还是直接制作一个当前版本的initramfs比较好====使用 ARCH那种模式(因为UBUNTU的方式往往与其他linux不同).
作者: jxdeng    时间: 2015-1-15 18:19
本帖最后由 jxdeng 于 2015-1-15 18:52 编辑

今天有时间,拿LZ的dracut-mageia 试了一下 Suse svr 11 , 发现比dracut-opensese 走的更远。几乎成了。但存在不少问题。
1、第一个错在 Mounting /sysroot..... 报 EXT4-fs (loop0p1):VFS:can't find ext4 filesystem
2、第二个错在 Failed to mount /sysroot ,以后就是stop 所有启动起来的服务,进到了 Emergence shell.
另:Suse svr 11 无 dracut 。所以可以肯定 是initramfs 。但是又没有/usr/share/initramfs-tools/init 文件。
整个系统下搜索遍了,无init 文件。奇怪。
3、vmlinuz-linux-3.14.6-1-ARCH的路径没有错,我换3.17.6-1-ARCH版就可以走一段。一样 走到mount: unknown filesystem type "swap". 就进入Emergence shell。
我估计:我的系统的分区跟LZ 的不一样。有时间再试试。
作者: 2011niumao    时间: 2015-1-15 22:39
本帖最后由 2011niumao 于 2015-1-23 17:05 编辑
jxdeng 发表于 2015-1-15 18:19
今天有时间,拿LZ的dracut-mageia 试了一下 Suse svr 11 , 发现比dracut-opensese 走的更远。几乎成了。但 ...


1,2是一个错.因为不能正确挂载根文件系统.看来毛病是我写代码时候把vhd上的根文件系统限制为ext4了.检查了05-vhdmount.sh的全部内容
  1.         mount -t ext4 -o rw /dev/loop0$VLOOPPART  $NEWROOT
  2.         if [ -n "$VLOOP" -a -d $NEWROOT/host ]; then
  3.         mount -R /host $NEWROOT/host
  4.         fi
  5. fi
  6. exit 0
复制代码

倒数第六行这一句
  1. mount -t ext4 -o rw /dev/loop0$VLOOPPART  $NEWROOT
复制代码

中的 ext4 应该更改为你实际的VHD上根分区的文件系统类型. 然后再重新制作dracut.
用新的dracut引导看看.
3 的错误奇怪.可以试试把 /etc/fstab 的swap先注释掉试试.
作者: Evergreen    时间: 2015-1-16 04:04
如果能学会这个就好了,多谢楼主的劳动,谢谢
作者: carbonjiao    时间: 2015-1-16 13:18
建议在  
                mount -t ${FSTYPE} "/dev/mapper/loop0${VLOOPPART}" ${rootmnt}       

                if [ -d ${rootmnt}/host ]; then
                        mount -o move /host ${rootmnt}/host
                fi
改成
                mount -t ${FSTYPE} "/dev/mapper/loop0${VLOOPPART}" ${rootmnt}       
                [ -d ${rootmnt}/host ] || mkdir -p ${rootmnt}/host
                if [ -d ${rootmnt}/host ]; then
                        mount -o move /host ${rootmnt}/host
                fi
作者: jxdeng    时间: 2015-1-16 16:07
今天做了一个mageia4 利用LZ的vmlinuz-mageia/dracut-mageia 内核 能启动到图形桌面。但 键盘鼠标无反应。自己按LZ提供的方法生成内核时,发现
执行dracut -i /home/niumao/mydracut/05-vhdmount.sh /lib/dracut/hooks/pre-mount/05-vhdmount.sh --install  " blkid  partx ntfs-3g fusermount  mount.fuse mount.ntfs-3g"     /home/niumao/dracut-mageia  3.14.27-desktop-1.mga4
时,出现报错。而且 该/lib/dracut/hooks/pre-mount/05-vhdmount.sh 在mageia4 中不存在,我省掉了。还加上了--force 参数。不知是否有问题。
我在分析 suse svr11 时发现 该系统要编译内核后才支持Ext4 。所以 我把 LZ 提示的 “mount -t ext4 -o rw /dev/loop0$VLOOPPART  $NEWROOT” 更改为ext3 后重新生成dracut-mageia 。结果还不如LZ的内核。LZ能否提供一个支持ext3的dracut-mageia。我可以试试
是否支持suse svr 11 。




作者: 2011niumao    时间: 2015-1-16 23:14
carbonjiao 发表于 2015-1-16 13:18
建议在  
                mount -t ${FSTYPE} "/dev/mapper/loop0${VLOOPPART}" ${rootmnt}       

已经采用.谢谢了.学习过你的关于ARCH LOOP的帖子.很受启发的.
作者: 2011niumao    时间: 2015-1-16 23:18
本帖最后由 2011niumao 于 2015-1-16 23:30 编辑
jxdeng 发表于 2015-1-16 16:07
今天做了一个mageia4 利用LZ的vmlinuz-mageia/dracut-mageia 内核 能启动到图形桌面。但 键盘鼠标无反应。 ...


修改了一下05-vhdmount.sh文件.使得可以自动探测vhd上根分区的文件系统类型.--见一楼链接的mydracut-new.zip文件.
用新的05-vhdmount.sh制作了dracut-mageia ,使用lsinitrd看了看,有ext3的驱动的.
一楼链接的 dracut-mageia-new.zip
我这里测试感觉很成功,比旧版本好.请你也试试看,也许可以成功.如果失败最好能给出错误提示,
作者: 2011niumao    时间: 2015-1-16 23:27
本帖最后由 2011niumao 于 2015-1-16 23:28 编辑
jxdeng 发表于 2015-1-16 16:07
今天做了一个mageia4 利用LZ的vmlinuz-mageia/dracut-mageia 内核 能启动到图形桌面。但 键盘鼠标无反应。 ...


这个dracut 命令需要把 niumao 更改为你的用户名.另外 mydracut目录应该放在 /home/用户名 这个家目录下.  
这个错误是在制作时候没有找到 05-vhdmount.sh 这个文件,从而没有放到dracut里面去.引导时也就找不到了.

执行完 dracut命令后 ,可以执行
  1. lsinitrd /home/用户名/dracut-mageia
复制代码
看看其中内容.
作者: 2011niumao    时间: 2015-1-17 15:08
本帖最后由 2011niumao 于 2015-1-17 15:14 编辑
jxdeng 发表于 2015-1-16 16:07
今天做了一个mageia4 利用LZ的vmlinuz-mageia/dracut-mageia 内核 能启动到图形桌面。但 键盘鼠标无反应。 ...


这个mageia4的系统能启动到桌面就说明成功了.
没有鼠标和键盘是一个老毛病--我也老遇到---一般是因为版本不一致引起的.
或者在/lib/modules/下没有当前内核的对应子目录.

可以自己安装最新的内核 版本是 3.14.7-desktop-1.mga4
或者到一楼链接下载 文件是 3.14.7-desktop-1.mga4.zip
解压 复制到 /lib/modules/下 .修改权限
  1. sudo chmod 755 -R /lib/modules/3.14.7-desktop-1.mga4
复制代码


此外如果使用这个dracut-mageia引导 suse ser 系统,也需要对 suse ser 如上操作,
把3.14.7-desktop-1.mga4 放在 /lib/modules/ 下并修改权限为755.
作者: jxdeng    时间: 2015-1-18 12:26
用新版本 dracut-mageia-new 来引导suse svr 11 仍不能启动到图形桌面。但是,Ext3 文件系统能mount上了。 看了一下日志:
Ntfs-3g[334]处报:Mounted /dev/sda3(Read-Write,label “VHD”,NTFS 3.1)。应该 /dev/sda3已被占用。接下来,报 Mounting /sysroot…..  警告。
====================================================
Sysroot.mount: Directory /sysroot to mount over is not empty, mounting anyway.  
Mount: /dev/sda3 is already mounted or /sysroot busy
/dev/sda3 is already mount on /host
/dev/sda3 is already mount on /sysroot/host
Sysroot.mount mount process exited.   
Failed to mount /sysroot.
接下来就stop 所有服务。进入emergency mode , 进命令行。
我感觉,好像是 /dev/sda3 设备被 占用了,或者 Server 系统的不同,sysroot 不能被正确挂载。应该是最后一公里的问题了。
另:我再使用 Dracut-opensuse-new 测试了一把,基本上也是上述原因。

作者: jxdeng    时间: 2015-1-18 12:29
本帖最后由 jxdeng 于 2015-1-18 13:22 编辑
2011niumao 发表于 2015-1-17 15:08
这个mageia4的系统能启动到桌面就说明成功了.
没有鼠标和键盘是一个老毛病--我也老遇到---一般是因为 ...


原来的3.12.21-desktop-2.mga4 目录要删除吗?
呵。测试了。不用管原来的。cp 进来新的就行了。mouse/keyb 都可以了。请问LZ ,怎么通过升级的方式更改?
作者: 2011niumao    时间: 2015-1-18 14:10
本帖最后由 2011niumao 于 2015-1-18 16:04 编辑
jxdeng 发表于 2015-1-18 12:29
原来的3.12.21-desktop-2.mga4 目录要删除吗?
呵。测试了。不用管原来的。cp 进来新的就行了。mouse ...


是不用管原来的东西.相当于同时安装了两个版本的内核驱动模块而已.
升级方式就是在Mageia系统中更新到最新就可以.一般会安装最新内核.
  1. sudo urpmi --auto-update
复制代码


作者: 2011niumao    时间: 2015-1-18 14:20
本帖最后由 2011niumao 于 2015-1-18 14:39 编辑
jxdeng 发表于 2015-1-18 12:26
用新版本 dracut-mageia-new 来引导suse svr 11 仍不能启动到图形桌面。但是,Ext3 文件系统能mount上了。  ...


感觉是最后一个问题了.如何修改还需要琢磨琢磨.
进入emergency shell原因一般是  
由于某种原因,内存系统dracut没有接受 修改root后的值/dev/loop0p1 ,而是使用原来引导参数的值 /dev/sda3 .这样挂载根目录失败.进入emergency shell.
按照这里的错误提示
现在是 ===内存系统已经把/dev/sda3挂载到/sysroot上了,再挂载到/host就会出错.进入emergency shell 感觉只要加入一个卸载命令就好.
整个过程没有转换到VDH上的系统.所以与suse ser 无关.

目前有一个手工挂载的解决方法.在emergency shell 内,手工敲入命令
  1. umount /sysroot
  2. mount -t ntfs-3g -o rw /dev/sda3 /host
  3. partx -av /host/VHD文件名字,就是vloop的值
  4. mount -t ext3 -o rw /dev/loop0p1 /sysroot
  5. systemctl switch-root /sysroot /sbin/init
复制代码

这时候应该进入VHD系统继续引导了.
如果/host不存在.可以先建立一个. /dev/loop0p1 里面的p1要更改为 vlooppart的值.
作者: 2011niumao    时间: 2015-1-18 14:23
其实就是把 init 的后续命令手工敲入一遍.
好处是可以通过它直接看到能不能引导到vhd,引导进入vhd以后会不会有其他毛病,例如会不会不认识键盘鼠标.
作者: 2011niumao    时间: 2015-1-18 16:24
本帖最后由 2011niumao 于 2015-1-18 16:30 编辑
jxdeng 发表于 2015-1-18 12:26
用新版本 dracut-mageia-new 来引导suse svr 11 仍不能启动到图形桌面。但是,Ext3 文件系统能mount上了。  ...


修订了一下05-vhdmount.sh.在挂载/host以前,判断/sysroot是否已挂载, 如果是则先卸载/sysroot.
按理可以处理这里的出错信息了.
制作了两个dracut-mageia-ro dracut-mageia-rw .一样的,只是挂载vhd根目录时候一个是只读挂载(在后续引导时候会检查根分区错误并重新以可写方式挂载根分区),一个是直接可写挂载.在我这儿测试都通过没有问题.
文件是 newdracut-mageia.zip..  一楼链接下载.请测试看看是否可用.

作者: 2011niumao    时间: 2015-1-18 16:28
本帖最后由 2011niumao 于 2015-1-22 17:06 编辑

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
作者: jxdeng    时间: 2015-1-18 16:53
本帖最后由 jxdeng 于 2015-1-18 17:00 编辑

      利用LZ提供的手动命令,查到了问题,mount /dev/loop0p1 时 老是mount不上, 改一下p2,结果成了(/dev/loop0p2 on /hostroot type ext3 (ro,relatime,data=ordered)) 。原来是建分区时,sda1 给了swap ,sda2 给 / 。更改vlooppart=p1为更改vlooppart=p2后。重启系统,还是只能到emergency shell。 但是,远远不是原来的问题了。
然后执行systemctl switch-root /sysroot /sbin/init ,奇迹出现了。VHD 上根上的root  /sbin/init带起来的东西都起来了。不过 中间有不少错误,走到gdm Xserver 时 停下了。字符界面可以登录了。好啊!成功了90%。感谢LZ的指导。看来SERVER 系统还是不一样。剩下的问题,怎样进入XWINDOW。
     忘了,上面只是用了dracut-opensuse 内核。

作者: 2011niumao    时间: 2015-1-18 18:27
hehe 恭喜.基本上成功了.
作者: 2011niumao    时间: 2015-1-18 20:47
jxdeng 发表于 2015-1-18 16:53
利用LZ提供的手动命令,查到了问题,mount /dev/loop0p1 时 老是mount不上, 改一下p2,结果成了(/d ...

新制作dracut-opensuse上传.放在了一楼链接子目录 dracut-opensuse下面.
还有对应的 内核驱动模块子目录 ,即复制到 /lib/modules/ 下的目录.
请下载测试.
(fedora mageia等也上传了.和内核驱动目录一起  放在对应名字子目录下.)
作者: jxdeng    时间: 2015-1-19 19:05
今天测试了LZ最新的内核版本,dracut-opensuse 与前面的版本一样。只能进到emergency1 shell。手动 systemctl switch-root /sysroot /sbin/init ,可启动系统。图形界面仍起不来。可手动登陆进入命令行 shell。
使用新版 dracut-mageia ,有一点与上不同,可一路启动到命令行 shell 。图形界面仍出不来。提供此点测试供LZ参考。
我感觉,svr 版的Linux 经过内核的狂改,不知道还要修改哪些地方,才能顺利启动?或许用LZ的方法在该系统上修改可以一试,但是我发现dracut 等配置都不一样,难下手。

作者: 2011niumao    时间: 2015-1-19 20:18
本帖最后由 2011niumao 于 2015-1-19 20:21 编辑
jxdeng 发表于 2015-1-19 19:05
今天测试了LZ最新的内核版本,dracut-opensuse 与前面的版本一样。只能进到emergency1 shell。手动 systemc ...


感谢测试与反馈。看来还是原配好,捆绑不成夫妻。
能启动到命令行界面 ,按理就是成功了。
不能进入图形界面,应该是因为内核vmlinuz与vhd内系统软件版本差别较大引起的。
一般把  /lib/modules/以内核版本号为名字的子目录  拷贝到vhd里面的  /lib/modules/  下可以解决驱动版本匹配的问题。
但现在版本号差别太大,就驱动不起来了。

应该是做一个原生的initrd才能解决图形界面问题。一般步骤是
1,  编译ntfs-3g。
2,  改写init文件,加入引导vhd的代码。
3, 修改 制作init文件的配置,使得所需要的模块,内核驱动模块(loop fuse ),二进制命令文件(blkid partx losetup等)都给塞进到initrd.
4 , 制作initrd  一般是命令 mkinitramfs 或者 命令 dracut 两种。
也可以尝试  先执行 1,3,4,  得到一个initrd。然后打开 initrd ,对其中的init进行编辑---即执行第二步。最后cpio命令再打包制作成 initrd 。也是一种方法。
作者: jxdeng    时间: 2015-1-20 18:43
本帖最后由 jxdeng 于 2015-1-20 18:45 编辑

报告了坏消息,今天报告好消息,用LZ最新的内核版本dracut-fedora ,在centOS6.6 上测试,成功启动到图形界面。/sbin/init过程报错不少。显卡驱动有稍稍问题。看来,kpartx 是个好工具。 只能说 suse svr 11 是另类。 还需要继续努力。
作者: jxdeng    时间: 2015-1-20 18:46
本帖最后由 jxdeng 于 2015-1-20 18:51 编辑
2011niumao 发表于 2015-1-19 20:18
感谢测试与反馈。看来还是原配好,捆绑不成夫妻。
能启动到命令行界面 ,按理就是成功了。
不能进入 ...


是不是一定进行1. 系统原来的ntfs-3g 不行吗? 我试着做 ntfs-3g 的make ,好像缺makefile文件。
作者: 2011niumao    时间: 2015-1-20 22:54
jxdeng 发表于 2015-1-20 18:43
报告了坏消息,今天报告好消息,用LZ最新的内核版本dracut-fedora ,在centOS6.6 上测试,成功启动到图形界 ...

非常感谢测试与反馈. 有一点请留意一下.kpartx命令似乎只限于UBUNTU.其他LINUX  如 fedora arch opensuse 都是使用partx 命令.
很奇怪.感觉是UBUNTU比较独立,刻意与其他LINUX保持距离,

手工编译ntfs-3g目的是防止关机出现 buffer I/O 错误.
如果不做的话,引导进入系统是可以的,但是关机时候会出错.再开机要做磁盘检查.
主要是关机时候会最后卸载根目录而先卸载 /host ,但根目录在vhd上,vhd在 /host设备上.会有冲突
这是过去的经验了.现在不知会如何呢.
作者: 2011niumao    时间: 2015-1-22 17:11
本帖最后由 2011niumao 于 2015-2-15 11:38 编辑

重新完善了一下作为hook脚本的05-vhdmount.sh文件。
最新版05-vhdmount.sh的代码如下.这个是最终版吧.原来有很多bug,反复测试才定下来.
版权声明:本段代码为楼主原创.唯一首发在无忧启动论坛.
如果需要使用或者引用,请保留注释中 by niumao 的完整字段并应对无忧启动论坛表示以感谢.
  1.         ########################################################################
  2.         ###                 BOOT FROM VHD, VLOOP by niumao                   ###
  3.         ########################################################################

  4.         VLOOP=$(getarg vloop=)
  5.         VLOOPPART=$(getarg vlooppart=)
  6.         VLOOPFSTYPE=$(getarg vloopfstype=)
  7.         HOSTFSTYPE=$(getarg hostfstype=)

  8.         export VLOOP
  9.         export VLOOPPART
  10.         export VLOOPFSTYPE
  11.         export HOSTFSTYPE

  12.         if [ -n "$VLOOP" ]; then
  13.        
  14.                 ### reset the value of the root variable
  15.                 HOSTDEV="${root#block:}"
  16.                 [ -n "$VLOOPPART" ]  ||  root=/dev/loop0
  17.                 [ -n "$VLOOPPART" ]  &&  root=/dev/mapper/loop0$VLOOPPART
  18.                 export  root
  19.                 realroot="$root"
  20.                 if ismounted "$NEWROOT"; then
  21.                         umount    "$NEWROOT"
  22.                 fi
  23.                   
  24.                 ###  auto probe the fs-type of the partition in which vhd-file live and mount it  /host
  25.                 mkdir -p /host
  26.                 if  [  -z "${HOSTFSTYPE}"  ]; then
  27.                         HOSTFSTYPE="$(blkid -s TYPE -o value "$HOSTDEV")"
  28.                         [  -z "${HOSTFSTYPE}" -o  "${HOSTFSTYPE}" = "ntfs" ] && HOSTFSTYPE="ntfs-3g"
  29.                 fi
  30.                 mount -t "${HOSTFSTYPE}" -o rw   "${HOSTDEV}"    /host
  31.            
  32.                 ### mount the vhd-file on a loop-device
  33.                 if [ "${VLOOP#/}" != "${VLOOP}" ]; then
  34.                         modprobe loop
  35.                         kpartx -av  "/host$VLOOP"
  36.                         [ -e "$realroot" ] ||  sleep 3
  37.                 fi
  38.            
  39.                 ### mount the realroot / in vhd-file on $NEWROOT
  40.                 [ -e "$realroot" ] ||  sleep 3
  41.                 if  [  -z  "${VLOOPFSTYPE}"   ];  then
  42.                         VLOOPFSTYPE="$(blkid -s TYPE -o value "$realroot")"
  43.                         [ -z "${VLOOPFSTYPE}" ] && VLOOPFSTYPE="ext4"
  44.                 fi
  45.                 mount  -t  "${VLOOPFSTYPE}"   -o   rw   $realroot    $NEWROOT
  46.            
  47.                 ### mount /host in initrd to /host of the realrootfs
  48.                 [ -d $NEWROOT/host ] || mkdir -p $NEWROOT/host
  49.                 mount -R  /host  $NEWROOT/host
  50.                
  51.         fi

  52.         ########################################################################
  53.         ###                 End,  BOOT FROM VHD, VLOOP by niumao             ###
  54.         ########################################################################
复制代码

作者: wwkk007    时间: 2015-1-22 20:04
提示: 作者被禁止或删除 内容自动屏蔽
作者: 2011niumao    时间: 2015-1-24 13:28
标题: 能挂载必能引导!!!
本帖最后由 2011niumao 于 2015-1-28 11:07 编辑

关于其他格式虚拟硬盘的一点思考
这里提供的方法,
例如 UBUNTU 改写local脚本 ,ARCH改写 init 脚本 ;而fedora opensuse mageia使用dracut的LINUX发行版则使用 插入一个hook脚本,就是 05-vhdmount.sh 到挂载真实根目录之前的流程中.
应该是适合于其他虚拟格式的虚拟硬盘.

例如 raw格式===可以直接使用这里的方法和制作好的initrd等引导. 因为本质上固定大小vhd就是raw格式,再在末尾附加了一个扇区而已.
例如 img格式===模拟的是一个分区,而不是一个硬盘.或者说 img文件内部不能再分区.
只需要把mount 文件 到loop设备 这个阶段中的 partx 那一句删除,   mount 真实根分区到 $NEWROOT 阶段中的 mount语句 改成
  1. mount -t $VLOOPFSTYPE -o  loop,ro   $realroot $NEWROOT
复制代码
就可以吧?当然只是猜测,逻辑上是对的.实际实现可能需要调整. 比如启动参数中vloop调整为loop , vlooppart舍弃===因为img不分区,没有分区选择了.

注释 img格式虚拟硬盘的引导问题,UBUNTU与ARCH已经解决,UBUNTU就是WUBI方式安装.其代码在local脚本中是 if [ "LOOP"] ... if 这一段.正在 if [ "VLOOP" ] ... if代码上面.实际上VLOOP这一段代码就是模仿LOOP,也就是WUBI,来实现的.所以这里引导固定大小VHD的方法实际上也就是一种新的WUBI模式而已.而ARCHLINUX的img格式引导,则有carbonjiao给出了一个解决,使用的是hook.详情可百度.这里提倡修改init的方法实现img格式的引导,也是一种简便的思路.

例如 qcow2格式===这里的挂载命令不适合.但在网络上查到了直接在LINUX内挂载qcow2虚拟硬盘的命令.应该也是可以的.
只需要把所需要的dracut模块 ,内核驱动 二进制命令文件 相应的hook脚本塞入到dracut内部就行了.
总之一句话:能在LINUX系统内部挂载的虚拟硬盘格式,一定能引导. 能挂载必能引导。
作者: jxdeng    时间: 2015-2-1 14:46
最近没时间测试LZ的成果,今天测了一下 1月21日的版本,用dracut-fedora 成功启动redhat ent svr 6.4 。证实了LZ的“能挂必能引”的结论。但还是在引导过程中有BUG,在Starting Switch Root... 时报错。
我查了一下,报:Specified switch root patn /sysroot does not seem to be an OS tree,os-release file is missing 。
initrd-switch-root-service:main process exited. 看来通用性上 还有些问题。
不过,好的消息是,用命令: systemctl switch-root /sysroot /sbin/init .可强制进入VHD_LINUX. 图像界面也能起来。
作者: 2011niumao    时间: 2015-2-1 17:08
本帖最后由 2011niumao 于 2015-2-2 12:11 编辑
jxdeng 发表于 2015-2-1 14:46
最近没时间测试LZ的成果,今天测了一下 1月21日的版本,用dracut-fedora 成功启动redhat ent svr 6.4 。证 ...
很好的测试消息.感谢jxdeng.真不敢想像fedora能带起来图形界面.
至于那个错误,应该不是很严重.只是缺少一个标志文件而已.
估计systemd要求linux-vhd系统在 /etc/下面有一个文件,名字为 os-release .自己可以建立一个.内容为空即可.例如
  1. sudo touch /etc/os-release
复制代码
有了这个,systemd 就知道它引导的是一个linux系统.就可以通过了.
作者: 2011xiongdeyuan    时间: 2015-2-2 10:27
很牛的教程,支持一个
作者: 东风唯笑    时间: 2015-2-2 12:21
hi,不知道对于想使用uefi启动安装linux的vhd如何做?
作者: jxdeng    时间: 2015-2-2 12:51
东风唯笑 发表于 2015-2-2 12:21
hi,不知道对于想使用uefi启动安装linux的vhd如何做?

在引导时,使用LZ 的 grubefi 。其它的都是一样的。
作者: jxdeng    时间: 2015-2-2 13:11
本帖最后由 jxdeng 于 2015-2-2 14:22 编辑

     恭喜LZ, 我把Fedora 21 的 os-release 文件copy 一份到redhat ent svr 6.4 的/etc 下(它本身没有该文件!)。重启,一路顺畅,直到 login : 完美了。
    但你的脚步还需要改进。我再测试redhat ent svr  5.8 时,使用的是 LV 。在启动时找不到 /sysroot 。或者这个 vlooppart=p? 不好定义。手动敲 parx -av /host/redhat/redhat5.vhd 时 正常。但是敲 mount -t ext4 -o rw /dev/loop0? /sysroot 时, 报 can't find ext4 filesystem . 不知裸设备 LV 的 怎样挂载? 我的分区是:
part /boot --fstype ext3 --size=100
part pv.2 --size=0 --grow
volgroup vg_sys --pesize=32768 pv.2
logvol swap --fstype swap --name=lv_swap --vgname=vg_sys --size=1000
logvol / --fstype ext3 --name=lv_root --vgname=vg_sys --size=1000
logvol /tmp --fstype ext3 --name=lv_tmp --vgname=vg_sys --size=400
logvol /var --fstype ext3 --name=lv_var --vgname=vg_sys --size=2000
logvol /usr --fstype ext3 --name=lv_usr --vgname=vg_sys --size=800
logvol /oracle --fstype ext3 --name=lv_oracle --vgname=vg_sys --size=2400
logvol /home/appc --fstype ext3 --name=lv_topsic --vgname=vg_sys --size=2000

望LZ研究一把。
作者: 2011xiongdeyuan    时间: 2015-2-2 16:25
很牛的教程{:soso_e119:}
作者: 2011niumao    时间: 2015-2-2 18:50
本帖最后由 2011niumao 于 2015-2-2 20:25 编辑
jxdeng 发表于 2015-2-2 13:11
恭喜LZ, 我把Fedora 21 的 os-release 文件copy 一份到redhat ent svr 6.4 的/etc 下(它本身没有该 ...


总算完美了.应该是同喜阿.呵呵.至于LV ,没有接触过.准备学学.恐怕要较长时间了.
不过方法不变,就是先在真实的 linux系统 里面挂载,能成功挂载就想办法把所需要的文件加入到initrd或者dracut里面.
另外就是注意挂载成功以后根分区的名字?或是路径?指的是在/dev/下的根分区的名字.这个有可能是 /dev/loop0px  但也有可能是其他名字.
这样可能需要再改动05-vhdmount.sh文件才行.因为那里面根分区是写死了的(硬编码),是/dev/loop0px类型.
还有:你敲入的mount命令 -t ext4 应该是 -t ext3 吧?因为后面分区信息全是 ext3,没有ext4 .根分区也是ext3.
作者: jxdeng    时间: 2015-2-3 16:40
2011niumao 发表于 2015-2-2 18:50
总算完美了.应该是同喜阿.呵呵.至于LV ,没有接触过.准备学学.恐怕要较长时间了.
不过方法不变,就是先 ...

还有:你敲入的mount命令 -t ext4 应该是 -t ext3 吧?因为后面分区信息全是 ext3,没有ext4 .根分区也是ext3
====================================================================跟上面没关系,ext3/4 都不行。 ext3/4 都是建在LV 上的。在脚本中需要先挂载 LV (我的是 /dev/sda2 ),这是关键,然后是 mount 文件系统,如 ext3/4 。 你的脚本只需判断一下,是 文件系统,直接 mount , 是LV 先挂LV,再mount 文件系统。可试试。
作者: jxdeng    时间: 2015-2-3 16:47
本帖最后由 jxdeng 于 2015-2-3 17:54 编辑

      奇怪 各SVR版都没有os-release 文件。我把各桌面版的os-release文件,放到相对应的SVR版中,哈哈,全成了。原先Suse svr 11 也能一路顺风进到 login:。
     还存在一个问题: shutdown 停不下来。不知何故? Suse svr 11  仍启不到图形界面。看来与此无关,是系统对显卡的支持问题。对VHD 封装的LINUX ,安装显卡驱动怎么办?
=============================
另: 我想编译ntfs-3g,LZ的修改包该放到哪个目录? 用什么用户进行make? , 我编译时 老报找不到 makefile 文件。
作者: 2011niumao    时间: 2015-2-3 18:22
jxdeng 发表于 2015-2-3 16:40
还有:你敲入的mount命令 -t ext4 应该是 -t ext3 吧?因为后面分区信息全是 ext3,没有ext4 .根分区也是ext ...

道理是这样.可是一个不知道判断命令和挂载LVM的命令.是不是mount就可以呢.还有root变量的值需要更改一下.
所以还不好下手.

另外,我怀疑Fedora本身就有从LVM启动的功能的,好象从一个网友的提问看出来的,就是 Fedora默认安装是安装在LVM上的.要是这样,只要找到这个机制就可以了.正在查找中.

关于显卡,感觉与真实机器一样吧 .真实机器怎么安装,vhd就怎么安装.只是有一个问题,如果你使用其他发行版本内核,可能使用不了在vhd内部安装好的显卡驱动,版本不会一样吧.或者你用其他版本内核启动后安装显卡驱动?不太好说,总觉得很乱了.

ntfs-3g文件解压放在那里都行.我一般放在主目录以内.需要安装  gcc g++ build-essential 这几个文件.就可以了.
作者: 2011niumao    时间: 2015-2-3 18:30
jxdeng 发表于 2015-2-3 16:40
还有:你敲入的mount命令 -t ext4 应该是 -t ext3 吧?因为后面分区信息全是 ext3,没有ext4 .根分区也是ext ...

请教一个问题.比如,现在你在一个真实linux系统中.另一个硬盘或者分区上有一个 LVM.
怎么识别出这个LVM, 并且挂载其中某个逻辑卷到一个指定目录上呢?
能否把命令都写出来看看.我是刚刚学习,对于LVM 没有感觉.
作者: jxdeng    时间: 2015-2-3 18:58
      终于把Suse Svr 11 折腾出图形界面了。原来 在VM 中安装时 系统使用了 Driver   ”vboxvideo" 虚拟显卡。在本地启动时,较新的机器不认。如 Intel HD 4400 就不认。 XSERVER 起不来。 对 /etc/X11/xorg.conf 进行配置 改成 Driver  “vesa" 。 重启机器或 startx 即可。 但是虚拟机 又麻烦了。到此 LZ的 ”能挂必能启“ 的结论基本正确。还望解决LV 上的系统。完美了。LZ伟大!
作者: 2011niumao    时间: 2015-2-3 19:01
jxdeng 发表于 2015-2-3 18:58
终于把Suse Svr 11 折腾出图形界面了。原来 在VM 中安装时 系统使用了 Driver   ”vboxvideo" 虚拟显 ...

牛!!!恭喜.
LVM命令我自己百度得差不多了.可是需要一段时间才能解决.相信能成功.
作者: 2011xiongdeyuan    时间: 2015-2-4 09:15
这个方法适用于任何版本的Ubuntu吗
作者: 2011niumao    时间: 2015-2-4 10:57
是适合于任何版本的.包括1504将来的版本.因为对于systemd已经作了处理.
作者: jxdeng    时间: 2015-2-4 18:01
2011xiongdeyuan 发表于 2015-2-4 09:15
这个方法适用于任何版本的Ubuntu吗

这个方法还适合任何版本的LINUX ,包括桌面版/SERVER版。思想是活的,方法是死的。但是,还有待改进。
作者: jxdeng    时间: 2015-2-5 16:24
本帖最后由 jxdeng 于 2015-2-5 16:26 编辑

LZ: 问题又来了,我想试试 Suse svr 12 。使用LZ最新的dracut-opensuse 。结果不成功。一怒之下,使用了LZ的 hook 方法。定制了该版本的dracut-suse12。亟希望成功,可惜,还是不成功。核心问题 还是报 /sysroot  没有mount 上来。
手动 mount -t ntfs-3g -o rw /dev/sda2 /host 时,报
ntfs-3g-mount: failed to access mountpoint /host: No such file or directory .
为何没有 host 目录?
不知是你的脚本没有建起目录来,还是我的设备名有变化?
2、 另请问LZ,在使用 dracut -i 时 用普通用户还是超级用户? 两种用户我都使用了。报的是同样的错:
dracut module 'fcoe' will not be installed because command 'dcbtool  fipvlan lldpad ' could not be found!
dracut-install: ERROR: installing 'ntfs-3g'
dracut-install: ERROR: installing 'mount.ntfs-3g'
所以,不知成了么?
作者: 2011niumao    时间: 2015-2-5 18:44
本帖最后由 2011niumao 于 2015-2-5 18:56 编辑
jxdeng 发表于 2015-2-5 16:24
LZ: 问题又来了,我想试试 Suse svr 12 。使用LZ最新的dracut-opensuse 。结果不成功。一怒之下,使用了LZ ...


1.需要手工建立/host目录.即 在dracut环境下 mkdir -p /host  再挂载才可以.
2.制作dracut必须使用root用户的. fcoe的错误没什么.我这里也报错.一些依赖没有安装.那个也不需要的.
但 ntfs-3g报错是不行的---因为必须有ntfs-3g才可以以读写方式挂载ntfs分区.这样才能启动ntfs分区
上的vhd .所以这个ntfs-3g必须加入到 dracut.
看错误信息是没有成功编译安装 ntfs-3g.需要重新编译安装ntfs-3g.
作者: 2011niumao    时间: 2015-2-5 18:47
本帖最后由 2011niumao 于 2015-2-5 19:00 编辑
jxdeng 发表于 2015-2-5 16:24
LZ: 问题又来了,我想试试 Suse svr 12 。使用LZ最新的dracut-opensuse 。结果不成功。一怒之下,使用了LZ ...


一个好消息是 已经解决了引导固定VHD上LVM的linux系统问题.但是框架变化大,正在整理中.
决定抛弃vloop  vlooppart.改为使用kloop kroot klvm三个参数.
新的引导方式命名为kloop方式===意思是基于kpartx + loop 的引导方式.旧的引导方式可以称为vloop引导方式.
估计等几天就可以整理好做好上传.
作者: 2011niumao    时间: 2015-2-8 11:40
标题: KLOOP引导
本帖最后由 2011niumao 于 2015-2-8 14:30 编辑

发布使用KLOOP制作的两个内存初始化镜像盘.请到一楼链接的KLOOP子目录中下载详细的使用说明和引导文件.
使用说明内容摘要
   KLOOP的模式起源于无忧启动论坛网友 jxdeng 提出的一个想法: 使用vloop方式引导VHD上的LVM.这样需要对于vloop模式进行改造.
   重新整合的vloop模式改名字,命名为KLOOP.指的是基于kpartx命令和LOOP设备的引导方式.
   它可以引导无分区的img系统,固定vhd系统,固定vhd并且使用LVM系统,  以及硬盘分区上LVM系统(未测试).
   KLOOP的主要参数有四个: root kloop kroot klvm.
2. root参数还是指vhd文件所在硬盘分区.其值是 root=/dev/sdax 或者 root=UUID=XXXXXXXXXXXXX.
   kloop参数与vloop一样,只是改个名字而已. 他的值是 vhd文件带路经的名称.
   例如 kloop=/ubuntu/Fedoralvm.vhd
3. kroot的值是LINUX启动以后根分区的设备名称.
   例如 kroot=/dev/mapper/loop0p1
   与旧参数vlooppart的对应关系如下
   如果旧参数 vlooppart=p3,则 kroot=/dev/mapper/loop0p3
   如果旧参数 vlooppart=p1,则 kroot=/dev/mapper/loop0p1
   即 /dev/mapper/loop0再加上旧参数vlooppart的值,就是新参数 kroot的值.
   可以看出,使用 kroot 的好处是---根设备完全由用户指定,这样就有很大的自由来控制启动过程.
4. 如果使用了固定VHD上的LVM ,则可以设定 klvm 的值为卷组(volume group)的名称,应该是物理卷组的名称.
   例如 使用VirtualBox把Fedora21按照默认方式安装在一个固定大小的vhd中.此时
   参数 klvm=fedora   而参数 kroot=/dev/mapper/fedora-root


作者: 2011niumao    时间: 2015-2-8 11:44
标题: KLOOP引导菜单例子
本帖最后由 2011niumao 于 2015-2-10 11:19 编辑

对于固定VHD上使用LVM的系统,使用KLOOP制作的内存初始化镜像盘引导时的菜单例子:  
grub2菜单.
  1. menuentry " Fedoralvm.vhd-kloop " --class  fedora {
  2.         insmod gzio
  3.         insmod part_msdos
  4.         insmod part_gpt
  5.         insmod ext2
  6.         insmod ntfs
  7.         insmod probe
  8.         set root=(hd0,1)
  9.         search --no-floppy -f --set=aabbcc  /ubuntu/Fedoralvm.vhd
  10.         set root=${aabbcc}
  11.         probe -u --set=ddeeff ${aabbcc}
  12.         linux        /ubuntu/vmlinuz-fedora root=UUID=${ddeeff} kloop=/ubuntu/Fedoralvm.vhd kroot=/dev/mapper/fedora-root klvm=fedora
  13.         initrd        /ubuntu/dracut-fedora-kloop
  14. }
复制代码
grub4dos菜单
  1. title 启动 Fedoralvm.vhd-kloop
  2. find --set-root --ignore-floppies --ignore-cd /ubuntu/Fedoralvm.vhd
  3. uuid ()
  4. kernel  /ubuntu/vmlinuz-fedora  root=UUID=%?%  kloop=/ubuntu/Fedoralvm.vhd   kroot=/dev/mapper/fedora-root   klvm=fedora
  5. initrd  /ubuntu/dracut-fedora-kloop
复制代码

作者: 2011niumao    时间: 2015-2-8 12:01
本帖最后由 2011niumao 于 2015-2-8 12:07 编辑

一点说明:为了维持代码的简单性,制作KLOOP的内存初始化镜像盘时候把vloop代码舍弃了.(UBUNTU中还删除了loop代码).
这样,不能使用vloop参数引导KLOOP的内存盘.也不能使用KLOOP引导菜单引导过去的vloop方式的内存盘.
就是
以KLOOP方式制作的内存初始化镜像盘只能使用 kloop kroot klvm参数引导.
过去的制作方法,统称为vloop方式,制作的内存初始化镜像盘只能使用 vloop vlooppart参数引导.



作者: 2011niumao    时间: 2015-2-8 18:26
本帖最后由 2011niumao 于 2015-2-8 19:02 编辑
jxdeng 发表于 2015-2-2 13:11
我的分区是:
part /boot --fstype ext3 --size=100
part pv.2 --size=0 --grow
volgroup vg_sys --pesize=32768 pv.2
logvol swap --fstype swap --name=lv_swap --vgname=vg_sys --size=1000
logvol / --fstype ext3 --name=lv_root --vgname=vg_sys --size=1000
logvol /tmp --fstype ext3 --name=lv_tmp --vgname=vg_sys --size=400
logvol /var --fstype ext3 --name=lv_var --vgname=vg_sys --size=2000
logvol /usr --fstype ext3 --name=lv_usr --vgname=vg_sys --size=800
logvol /oracle --fstype ext3 --name=lv_oracle --vgname=vg_sys --size=2400
logvol /home/appc --fstype ext3 --name=lv_topsic --vgname=vg_sys --size=2000
如果使用KLOOP测试,建议 grub2 参数如下.
但是LVM这一块不太熟悉.所用命令比较简陋,未必能应付太一般的情况.默认情况也许能行===指lv设备是/dev/mapper/vgname-lvname 这样的情况.
  1. kloop=vhd文件带路径名称  kroot=/dev/mapper/vg_sys-lv_root  klvm=vg_sys
复制代码
注释 如果是真实硬盘分区上的LVM,则设置 kloop=1 ,也可以启动到真实硬盘上LVM安装的LINUX.(在虚拟机上测试成功)
作者: jxdeng    时间: 2015-2-9 15:13
本帖最后由 jxdeng 于 2015-2-9 15:35 编辑

LZ乃神人也。恭喜!支持LVM的dracut就出来了。
我放下手上的事情也要试一下。我使用了LZ的dracut-fedora-kloop 来启 redhat SVR 5.8 。配上
linux  /redhat/vmlinuz-fedora root=UUID=${ddeeff} kloop=/redhat/redhat5.vhd kroot=/dev/mapper/vg_sys-lv_root  klvm=vg_sys 后,
启动机器。一路狂奔。可惜,还是在最后的某个位置停下来了。随后进入MAINTENANCE 状态。出错位置在:
cheching filesystems
fsck.ext3: No such file or directory while trying to open /dev/vg_sys/lv_root
/dev/vg_sys/lv_root:
The superblock could not be read or does not describe a correct ext2.

当然,前面还有重要的报错:
udevd-event[2568]: run_program: ressize 256 too short
udevd-event[2287]:wait_for_sysfs: waiting for '/sys/deices/pci0000:00/0000:00:1f.2/ata3/host2/ioerr_cnt' failed

奇怪:maintenance 状态,不能登录进去。我才有手工切换:
systemctl switch-root /sysboot /sbin/init  进入maintenance 后,登录成功。再mount 发现LV只有 lv_root 和
lv_usr 挂载上了。其它的lv 一个也没挂上去。估计跟前面的出错有关。提供的测试不知是否有用?
总之,要赞一个!希望能成功。

=======================================
又:
我在虚机中启动时,看了一下 grub.conf 配置。
它是这样写的:kernel /vmlinuz-2.6.18-308.el5 ro root=/dev/vg_sys/lv_root crashkernel=128M@16M rhgb quiet
这跟kloop 的写法:/dev/mapper/vg_sys-lv_root 有些不一样。还跟前面启动的报错 也相关。
作者: 2011niumao    时间: 2015-2-9 16:52
jxdeng 发表于 2015-2-9 15:13
LZ乃神人也。恭喜!支持LVM的dracut就出来了。
我放下手上的事情也要试一下。我使用了LZ的dracut-fedora-k ...

谢谢测试.LVM这方面的功能只能是一种探讨测试阶段.逐步完善吧.
可以试试设置
  1. kroot=/dev/vg_sys/lv_root
复制代码
其他不变.
LVM启动其实需要一个配置文件,好象是 /etc/lvm.conf,但如果把这个文件放在dracut里面就只能启动这一台机器了.与希望通用性不一致.就没有理会了.
作者: jxdeng    时间: 2015-2-9 17:36
指定 kroot=/dev/vg_sys/lv_root 。结果一样。
作者: 2011niumao    时间: 2015-2-9 21:37
本帖最后由 2011niumao 于 2015-2-9 21:39 编辑

dddddsssssss   
作者: 2011niumao    时间: 2015-2-9 21:38
本帖最后由 2011niumao 于 2015-2-9 21:46 编辑
jxdeng 发表于 2015-2-9 15:13
LZ乃神人也。恭喜!支持LVM的dracut就出来了。
我放下手上的事情也要试一下。我使用了LZ的dracut-fedora-k ...


你的lvm采取名字 /dev/vg-name/lv-name这种方式命名设备,这一块我还不太了解.也不知道该怎么理解这个错误.需要一个信息:
进入maintence后,请执行一下 ls /dev/mapper/  看看其中有没有 vg_sys-lv_root这个设备.
此外  你这里手工switch以前有没有手工执行mount命令?如果没有,说明/sysroot已经自动挂载而且是正确挂载了.也就是说 kroot参数没有错误.
看起来/dev/vg_sys/lv_root是启动后根分区的设备名称.可以检查一下虚拟机里面的 /etc/fstab 可以看到根分区的设备.请确认一下

因为在dracut检查参数klvm非空以后,就执行两个命令:
  1. vgscan
  2. vgchange -ay  
复制代码
查询卷组和激活卷组的逻辑卷.接着就挂载kroot指定的逻辑分区到根分区,就进入switch-root阶段了.
有可能是这两个命令执行后逻辑卷组的名字和/etc/fstab里面的名字不一样造成的错误.

作者: 2011niumao    时间: 2015-2-9 22:43
jxdeng 发表于 2015-2-9 15:13
LZ乃神人也。恭喜!支持LVM的dracut就出来了。
我放下手上的事情也要试一下。我使用了LZ的dracut-fedora-k ...

很奇怪的是.我使用fedora默认安装到固定vhd上.使用kroot=/dev/mapper/fedora-root 或者 kroot=/dev/fedora/root 都可以引导成功 .也可能是 设备没有准备就绪 的原因 胡乱猜测而已..
作者: yGeo    时间: 2015-2-9 23:15
有vhd安装Debian的解决方案吗
作者: 2011niumao    时间: 2015-2-10 09:28
yGeo 发表于 2015-2-9 23:15
有vhd安装Debian的解决方案吗

应该与UBUNTU一样的.现在有两种方案了.一种是vloop方法,见一楼链接的VHDBOOTDIYv7.一种是新的KLOOP方法,还在测试阶段,教程过几天能出来.
作者: jxdeng    时间: 2015-2-10 11:34
本帖最后由 jxdeng 于 2015-2-10 11:38 编辑
2011niumao 发表于 2015-2-9 21:38
你的lvm采取名字 /dev/vg-name/lv-name这种方式命名设备,这一块我还不太了解.也不知道该怎么理解这个错 ...




我的/etc/fstab 的第一行为:
/dev/vg_sys/lv_root         /        ec3         defaults        1 1
===================================================================
虚机里启动后 mount 的结果有:
/dev/mapper/vg_sys-lv_root on / type ext3 (rw)
===================================================================
在switch之前:mount 的部分结果:
/dev/sda3  on  /host type fuseblk(........................)
/dev/mapper/vg_sys-lv_root on /sysroot type ext3 (..........)
/dev/mapper/vg_sys-lv_usr  on /sysroot/usr type ext3(........)
====================================================================
在switch之后:mount 的部分结果:
/dev/mapper/sys_sys-lv_root on / type ext3 (rw)
/dev/mapper/sys_sys-lv_tmp  on /tmp type ext3(rw)
/dev/mapper/sys_sys-lv_usr  on /usr type ext3(rw)
/dev/mapper/sys_sys-lv_topsic on /home/topsic type ext3(rw)
/dev/mapper/sys_sys-lv_oracle on /oracle type ext3(rw)
............................
=========================================================

switch之前,根设备是mount上去了,而且按你命名方式,挂载了所有的LV 。问题的关键是 vhd 启动的 LV设备命名方式 与 虚拟机启动后的LV 设备命名方式不同。我的版本
RedHat Server 5.8 。

作者: yGeo    时间: 2015-2-10 12:41
2011niumao 发表于 2015-2-10 09:28
应该与UBUNTU一样的.现在有两种方案了.一种是vloop方法,见一楼链接的VHDBOOTDIYv7.一种是新的KLOOP方法, ...

好,谢谢。我先去尝试一下vloop,LZ辛苦了




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net./) Powered by Discuz! X3.3