2011niumao 发表于 2014-6-29 15:33:19

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

本帖最后由 2011niumao 于 2017-3-21 15:22 编辑

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


使用overlay机制,可以从一个目录内引导linux,这个为多系统玩家提供了方便,不需要再为每个系统单独分区了。
具体使用参看一楼的第一个链接的mydracut-new.zip文件。

主要想法是,把系统所在子目录作为upperdir,同一分区的另一个空目录作为workdir,内存一个目录作为lowerdir,就可以
叠合成为一个overlay文件系统,再把它挂载在根上就可以了。

引导只读squashfs系统的方法请下载链接中的更新好的mydracut.zip文件。内含说明。
https://pan.baidu.com/s/1c19AJQC#list/
发布一个基于ghostplant的简化的UBUNTU 1604 系统.同时有小grub启动器和制作vhd方法的mydracut文件。
有vhd(8G大小)与 live 两种版本 可供把玩.
用户名 所有密码都是 ubuntu .

以下连接都已经失效。请勿点击。

发布两个ISO,就是把live系统制作成iso文件了。请到一楼第一个链接下载。
有基于ghostplant简化的ubuntu1604版本和完整ubuntu1604两种版本。
用户名密码,root密码都是ubuntu .UBT-small.iso文件说明

      UBT-small.iso文件系统与vhd squashfs系统一致,都是ubuntu-1604,更新到最新(4.4.0-62)。
      用户名 密码 root密码都是ubuntu。      有如下用法:

1.      可以直接从VirtualBox启动,并且可以EFI启动和传统bios-mbr启动。

2.      可以和发行版live-cd一样通过grub4dos,grub2启动。
      需要把UBT-small.iso vmlinuz initrd.img三个文件放在某一个硬盘分区根目录的ubuntu子目录下。
      (如果没有ubuntu子目录可以手动建立一个)
      再设置引导,使用小grub通用启动器2017(菜单已经写好,不必修改)。


3.      可以把ISO文件放到/grub/IMGS目录下,利用网友制作的自动ISO菜单直接启动
      (只限于grub4dos启动)。

4.      启动后可以使用主目录的UCloner中的UCloner_CN或UCloner_EN(双击),
      依照提示操作,将/cdrom/casper/中的文件UBT-small.squashfs 恢复到硬盘分区。

5.      也可以预先在WINDOWS系统下准备好一个固定大小的vhd虚拟磁盘,
      例如名字为UBT-small.vhd,
      进行初始化和建立一个分区,格式化并将其标记为活动分区。
      (右键我的电脑--管理--创建vhd--初始化--建立简单卷--标记为活动分区)

      再启动到UBT-small的ISO系统(或live系统)中,打开一个终端,进入到vhd文件所在目录,
      运行
      sudo kpartx -av UBT-small.vhd
      记住其显示的输出,里面有类似于 /dev/mapper/loop2p1 型字段。

      图形界面打开主目录的UCloner子目录,双击UCloner_CN(UCloner_EN),
      依提示操作,将/cdrom/casper/中文件UBT-small.squashfs恢复到某个固定大小VHD硬盘的分区,
      此时弹出对话框中 / 分区手动填写,如 /dev/mapper/loop2p1(与kpartx命令的输出一致) .
      文件系统手动填写ext4 ,其他空白。然后一直下一步或输入y回车让其恢复系统。

      注意,grub2应该空白,等待系统恢复完毕以后再手动安装。
      安装grub2的参考命令:
      sudo mount /dev/mapper/loop2p1 /mnt
      sudo grub-install--root-directory=/mnt/dev/loop2

yang77 发表于 2014-6-29 23:12:48

很牛的教程,支持一个

2011niumao 发表于 2014-6-29 15:37:28

本帖最后由 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一些软件。
可以在新立得中搜索安装。也可以使用命令。
打开一个终端,输入
sudo apt-get install kpartx kpartx-boot util-linux dmsetup
2.修改两个文件:localmkinitramfs
先备份两个文件
sudo cp /usr/share/initramfs-tools/scripts/local ./local.backup
sudo cp /usr/sbin/mkinitramfs ./mkinitramfs.backup
再依次修改两个文件:
修改local文件
sudo gedit /usr/share/initramfs-tools/scripts/local
再将本附件所带的local文件用gedit打开,找到如下部分
        ##############################################################
        #                         TO BOOT FROM VHD                   #
        ##############################################################
        for x in $(cat /proc/cmdline); do
        case $x in
        vloop=*)
                VLOOP="${x#vloop=}"
                ;;
        vlooppart=*)
                VLOOPPART="${x#vlooppart=}"
                ;;
        vloopfstype=*)
                VLOOPFSTYPE="${x#vloopfstype=}"       
                ;;
        vloopcheck=*)
                VLOOPCHECK="${x#vloopcheck=}"       
                ;;
        esac
        done
        if [ "$VLOOP" ]; then
                if [ "$mountroot_status" != 0 ]; then
                        if [ ${FSTYPE} = ntfs ] || [ ${FSTYPE} = vfat ]; then
                                panic "
                Could not mount the partition ${ROOT}.
                This could also happen if the file system is not clean because of an operating
                system crash, an interrupted boot process, an improper shutdown, or unplugging
                of a removable device without first unmounting or ejecting it.To fix this,
                simply reboot into Windows, let it fully start, log in, run 'chkdsk /r', then
                gracefully shut down and reboot back into Windows. After this you should be
                able to reboot again and resume the installation.
                (filesystem = ${FSTYPE}, error code = $mountroot_status)"
                        fi
                fi
       
                mkdir -p /host
                mount -o move ${rootmnt} /host

                str=${VLOOP}

                disk_files="/host${str}"                       
               
                # FIXME This has no error checking
                modprobe loop
                kpartx -av "${disk_files}"
                sleep 3
               
                # Get the vloop filesystem type if not set
                if [ -z "${VLOOPFSTYPE}" ]; then
                        FSTYPE="unknown"
                else
                        FSTYPE="${VLOOPFSTYPE}"
                fi
                if [ "$FSTYPE" = "unknown" ] && [ -x /sbin/blkid ]; then
                        FSTYPE=$(/sbin/blkid -s TYPE -o value "/dev/mapper/loop0${VLOOPPART}")
                        [ -z "$FSTYPE" ] && FSTYPE="ext4"
                fi
               
                if [ ${readonly} = y ]; then
                        roflag=-r
                else
                        roflag=-w
                fi
               
                [ -z "$VLOOPCHECK" ] && VLOOPCHECK="no"
                if [ "$VLOOPCHECK" = "yes" ] ; then
                echo "checking vloop / filesystem, please wait....."
                fsck.${FSTYPE} -a "/dev/mapper/loop0${VLOOPPART}"
                fi
                       
                mount -t ${FSTYPE} "/dev/mapper/loop0${VLOOPPART}" ${rootmnt}       

                if [ -d ${rootmnt}/host ]; then
                        mount -o move /host ${rootmnt}/host
                fi
        fi
        ##############################################################
        #                     end,      TO BOOT FROM VHD             #
        ##############################################################
拷贝到/usr/share/initramfs-tools/scripts/local 文件的相同位置处。
这个位置在文件最后几行上面,最后结果,接着上面的这段后面是以下几行。
        [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-bottom"
        run_scripts /scripts/local-bottom
        [ "$quiet" != "y" ] && log_end_msg
}
该文件结束。

注释: 新增两个控制参数: vloopfstype=ext4 ---说明vhd中根文件系统的文件系统类型。
vloopcheck=yes 或 no---控制启动时强制做一次磁盘检查。比较简陋。如果没有特殊需要不用理会。
3 修改mkinitramfs文件
sudo gedit /usr/sbin/mkinitramfs
找到# util-linux,在其下插入以下几行:
copy_exec /sbin/losetup /sbin
copy_exec /sbin/kpartx /sbin
copy_exec /sbin/shutdown /shutdown
cp -a /sbin/fsck*${DESTDIR}/sbin/
copy_exec /sbin/e2fsck /sbin
touch ${DESTDIR}/etc/initrd-release
touch ${DESTDIR}/version
最后该处几个语句为
# util-linux
copy_exec /sbin/blkid /sbin
copy_exec /sbin/losetup /sbin
copy_exec /sbin/kpartx /sbin
copy_exec /sbin/shutdown /shutdown
cp -a /sbin/fsck*${DESTDIR}/sbin/
copy_exec /sbin/e2fsck /sbin
touch ${DESTDIR}/etc/initrd-release
touch ${DESTDIR}/version
记得保存一下。

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

4.附件ntfs-3g_ntfsprogs-2014.2.15.fixed 是已经修改好的ntfs-3g源码.
对他手工编译安装.
打开一个终端.进入该目录.依次执行以下命令:
./configure
make
sudo make install
(这一步是为了在使用了 systemd 的linux系统中避免关机时候出现 buffer I/O 错误
====UBUNTU计划在14.10版中使用systemd
====也许到时候会有官方的避免出现 bufferI/O 错误的机制 发布出来.
目前只有这个重编译 ntfs-3g源码 的方法====实际上是 systemd 官方推荐的方法)


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

sudo gedit /usr/share/initramfs-tools/scripts/local-bottom/ntfs_3g
将以下拷贝覆盖原始内容即可。
#!/bin/sh
##set -e
##case "${1}" in
##        prereqs)
##                exit 0
##                ;;
##esac

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

if [ -d /run/initramfs -a -f /init ]
then
        mkdir -p /run/initramfs/dev /run/initramfs/host /run/initramfs/proc /run/initramfs/root /run/initramfs/run /run/initramfs/sys /run/initramfs/tmp
        rm -rf   /lib/modules
        for xxx in /*
        do       
        if [ ${xxx} = "/dev" -o ${xxx} = "/host" -o ${xxx} = "/proc" -o ${xxx} = "/root" -o ${xxx} = "/run" -o ${xxx} = "/sys" -o ${xxx} = "/tmp" ];
        then
                :
        else
                cp -a ${xxx} /run/initramfs/1>/dev/null 2>&1;
        fi
        done
        unset xxx
fi
####################################################################
exit 0


6.生成initrd.img文件
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的菜单例子
title VBUNTUFIX uuid-auto-probe
find --set-root --ignore-floppies --ignore-cd /vbuntufix/vbuntufix.vhd
uuid ()
kernel /vbuntufix/vmlinuzroot=UUID=%?% vloop=/vbuntufix/vbuntufix.vhd vlooppart=p1
initrd /vbuntufix/initrd.img
grub2适用于UEFI与 BIOS,应用范围较广。
grub2自动探测UUID的菜单
menuentry 'VBUNTUFIX linux' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        insmod gzio
        insmod part_msdos
        insmod part_gpt
        insmod ext2
        insmod ntfs
        insmod probe
        insmod search
        search --no-floppy -f --set=aabbcc /vbuntufix/vbuntufix.vhd
        set root=${aabbcc}
        probe -u --set=ddeeff ${aabbcc}
        linux        /vbuntufix/vmlinuz root=UUID=${ddeeff} vloop=/vbuntufix/vbuntufix.vhd vlooppart=p1
        initrd        /vbuntufix/initrd.img
}

2011niumao 发表于 2015-12-6 10:02:04

crown2kiss 发表于 2015-12-5 18:38
大神ubuntu是成功了,但是安装CentOS-7-x86_64-DVD-1503-01.iso这个系统,木有/lib/dracut/hooks/pre-mount ...

这个文件是自己制作dracut时候加入进去的阿.你需要把制作dracut命令的参数中的路径 /home/niumao/mydracut中的 niumao 更改为你自己的用户名.

2011niumao 发表于 2016-4-6 21:13:41

可能是菜单中还有错误路径信息。应该是没有挂载好根分区。注意看看菜单各个文件的路径。
另外有时候需要检查一下local文件。有时候升级后会把一些修改丢失了。
看看以下菜单
menuentry " UBUNTU-1604.vhd " --classubuntu {
        insmod gzio
        insmod part_msdos
        insmod part_gpt
        insmod ext2
        insmod ntfs
        insmod probe
        set vhdfile="/ubt/UBUNTU-1604.vhd"
        set root=(hd0,1)
        search --no-floppy -f --set=aabbcc$vhdfile
        set root=${aabbcc}
        probe -u --set=ddeeff ${aabbcc}
        loopback loop0 $vhdfile
        linux        (loop0,1)/vmlinuz root=/dev/sda5 rwkloop=$vhdfilekroot=/dev/mapper/loop0p1
        initrd        (loop0,1)/initrd.img
}

可以修改标题 ,vhdfile的值为vhd文件的路径,loop0p1 (loop0,1)中的1表示第一个主分区,看你的vhd内分区酌情修改。

2011niumao 发表于 2015-12-31 16:39:42

推荐一种grub2菜单写法

本帖最后由 2011niumao 于 2016-4-6 21:29 编辑

典型例子menuentry " UBUNTU-1604.vhd " --classubuntu {
      insmod gzio
      insmod part_msdos
      insmod part_gpt
      insmod ext2
      insmod ntfs
      insmod probe
      set vhdfile="/ubt/UBUNTU-1604.vhd"
      set root=(hd0,1)
      search --no-floppy -f --set=aabbcc$vhdfile
      set root=${aabbcc}
      probe -u --set=ddeeff ${aabbcc}
      loopback loop0 $vhdfile
      linux      (loop0,1)/vmlinuz root=/dev/sda5 rwkloop=$vhdfilekroot=/dev/mapper/loop0p1
      initrd      (loop0,1)/initrd.img优点
1)设置了变量vhdfile ,可以使得三处的vhd文件统一使用该变量代替,便于修改和移植。
以后只需要修改变量 vhdfile的值就可以了。

2)使用loopback命令,引导文件在vhd文件内。这样只需要一个固定vhd文件。不用再手工把引导文件复制出来。
但是这个方法只适用于grub2 ,不适用grub4dos(除非vhd文件连续存放或碎片不超过32)。

注意这里要求 修改定制的可以引导固定vhd的 initrd.img要直接替换掉原先的/boot/initrd.img-XXXX-generic.

3)正常情况下升级后不需要修改引导菜单了。也不需要复制vmlinuz——XXXXX-geneic   initrd.img-XXXXX-generic出来了,

七彩云南 发表于 2014-6-30 17:42:19

好,非常好。

不知道VBOX的方法能否用在VMWare上,准备把VMWare下的Linux做个VHD实机用。

totootao 发表于 2014-7-1 21:48:50

今天使用virtualbox安装了麒麟系统的vhd,用楼主提供的工具引导进入系统后,无法使用wifi,请问楼主制作ubuntu vhd时 wifi是如何设置的?

得意情长剑 发表于 2014-7-17 23:50:35

牛教程。

毅然决然 发表于 2014-8-3 06:50:52

2011niumao 发表于 2014-6-29 15:37
UBUNTU制作可以引导VHD系统的initrd.img 的方法
http://pan.baidu.com/s/1xVvXG



好详细啊!学习学习!

黑色→风格 发表于 2014-8-6 00:48:45

{:3_153:}很有研究价值,谢谢楼主分享

czswuyou 发表于 2014-8-6 11:20:36

好好学习研究一下
支持楼主
支持论坛

mouxiaoyi 发表于 2014-8-18 20:06:28

2011niumao 发表于 2014-6-29 15:37
UBUNTU制作可以引导VHD系统的initrd.img 的方法
http://pan.baidu.com/s/1xVvXG



这个方法适用于任何版本的Ubuntu吗
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 从 固定VHD与只读squashfs引导LINUX, UBUNTU ARCH Fedora Opensuse Mageia五种