Windows不分區VHD裝Linux多系統(四):VM虛擬機里Ubuntu18引導修改


上一篇:Windows不分區VHD裝Linux多系統(三):VM虛擬機安裝ubuntu18.04  

下一篇:Windows不分區VHD裝Linux多系統(五):Win7(物理機)添加引導  

 

######################################################################################## 

這里要先感謝

無憂論壇  和 論壇里niumao

我將niumao的教程做進一步實踐整理,避免新人踩坑。

#########################################################################################

 

如果你用VHD引導win系統那很容易。只是在上篇裝ubuntu18改成裝windows系統就可以了。

在VHD中裝Ubuntu最終目的還是要讓物理機能引導VHD開啟ubuntu,但是默認的引導不能滿足要求。

 

說下VHD引導Ubuntu的思路(是無憂論壇里2011niumao大佬的想法):

開機,引進到grub4dos-->vmlinuz-5.4.0-42-generic --> initrd.img-5.4.0-42-generic--自動識別掛載VHD,進入ubuntu系統。

關鍵是initrd.img-5.4.0-42-generic里不認識VHD這個文件,因為是Win公司的程序。

那么就用kpartx來識別掛載VHD,這時就需要重新編譯ubuntu里的initrd.img-5.4.0-42-generic文件,把kpartx添加進去。

(可以用其他的引導,這里grub4dos舉例)

 

 參看文章:文章一       文章二

更詳細使用請看2011niumao大佬提供的readme-ubuntukloop.zip壓縮包里 PDF說明文件

下載:https://pan.baidu.com/s/18NTBbzlVLdHXxUcnpXFMNw   提取碼 w4af

  

向虛擬機里傳輸文件:

思路一,安裝VM自帶的VM-tool ,安裝麻煩,而且會在之后正常引導后有殘留文件,也有可能影響系統。

思路二,在物理機win7系統上建立網頁(http)和ftp服務,這樣就可以上傳下載文件了。(這個方便 ,選這個)

思路三,DiskGenius-v5.1.1.696 專業版也可以訪問磁盤內容,ubuntu 系統的磁盤格式是EXT4的,所以要新版才支持。

               其他版本4.8不支持EXT4,只能看到磁盤看不到文件和文件夾。修改過的文件要重新加載磁盤才能顯示新文件。

    注意這個工具只能從虛擬機里拷到物理機里文件,反之不行(因為權限問題)。

     這個工具好處就是即便虛擬機開機情況下,也可以使用。

 

在物理機win7上開啟網頁服務器和FTP服務器,把文件傳輸到虛擬機的ubuntu18里。

在解壓的文件夾中找到MyWebServer.exe這個軟件運行,點擊瀏覽 選擇任意一個目錄,做為網站的服務目錄,這在桌面新建一個web文件夾來存放文件。

點瀏覽選擇web目錄,點擊啟動(Start)

 

FTP服務器也一樣  

 

 

在物理機上打開CMD窗口,看看物理機的IP是多少,命令行輸入ipconfig /all,我的IP是 192.168.3.11(你的不一定和我的一樣)

C:\Users\Administrator>ipconfig /all

測試:

打開瀏覽器 輸入你的IP ,我的這里是192.168.3.11,看到有列表的文件夾和文件,

說明就可以了,你的web文件夾里也隨便放點東西,要不顯示不出來。

 

 好了,網頁服務能正常訪問。

啟動VM虛擬機進入ubuntu18系統里,我們先修改apt源為163的。國外的源太慢了。

在ubuntu18里,在桌面右鍵--打開終端,先看看對外網的范圍能不能通

 

 輸入下面命令,看到有64bytes開頭的返回值 就說明網是通的。

$ ping -c 2 baidu.com

 

 備份默認源

$ cd /etc/apt
$ sudo cp sources.list{,.bak}
$ ll

 

更換apt-get源一:推薦

設置apt-get源為aliyun(阿里雲)
桌面--左下角九個點--全軟件和更新--ubuntu軟件--下載自--其他站點--中國--mirrors.aliyun.com--選擇服務器
等待自動更新完成

更換apt-get源二:

在ubuntu18里打開火狐瀏覽器,輸入物理機的IP地址,下載sources.list腳本文件運行來更換apt-get源

 保存文件,默認是保存到當前用戶的 主目錄/下載文件夾里

重復上面操作,將local 、mkinitramfs、ntfs_3g 這幾個文件下載下來(linux文件沒有后綴,不像win的文件)

 

打開終端輸入,中文輸入,點右上角那個zh(英)來切換輸入法

$ sudo mv /etc/apt/sources.list{,.bak}
$ sudo mv ~/下載/sources.list /etc/apt/

 

源安裝完,執行更新命令

$ sudo apt-get update

 

等一會,下載完成

 

 apt-get源更換結束

=======================  開始修改  ====================================

總結,要修改的文件:

init (修改 4 處)
local  (修改 3 處)
mkinitramfs (修改 1 處)
modules (修改 1 處)
ntfs_3g (修改 1 處)

安裝所用的軟件

$ sudo apt-get install kpartx kpartx-boot util-linux dmsetup lvm2 lftp

 備份文件、將下載的文件移動到對應目錄

$ sudo cp /usr/share/initramfs-tools/init{,.bak}
$ sudo cp /usr/share/initramfs-tools/scripts/local{,.bak}
$ sudo cp /usr/sbin/mkinitramfs{,.bak}
$ sudo cp /etc/initramfs-tools/modules{,.bak}
$ sudo cp /usr/share/initramfs-tools/scripts/local-bottom/ntfs_3g{,.bak}

$ sudo mv ~/下載/local /usr/share/initramfs-tools/scripts/
$ sudo mv ~/下載/mkinitramfs /usr/sbin/
$ sudo mv ~/下載/ntfs_3g /usr/share/initramfs-tools/scripts/local-bottom/

$ sudo chmod 777 /usr/sbin/mkinitramfs

 

編輯文件一:init (修改 4 處)
$ sudo gedit /usr/share/initramfs-tools/init

 一處:

修改init里面約第32行的
mount -t tmpfs -o "noexec,nosuid,size=10%,mode=0755" tmpfs /run
修改為
mount -t tmpfs -o "noexec,size=20%,mode=0755" tmpfs /run
就是刪除 nosuid, 選項。

二處:

在大約67行處增加

  export KLOOP=
  export KROOT=
  export KLVM=
  export HOSTFSTYPE=
  export KLOOPFSTYPE=
  export SQUSHFS=
  export UPPERDIR=
  export LOWERDIR=
  export WORKDIR=
  export QEMUNBD= 

 三處:

在大約229行處增加

	kloop=*)
		KLOOP=${x#kloop=}
		;;
	kroot=*)
		KROOT=${x#kroot=}
		;;
	klvm=*)
		KLVM=${x#klvm=}
		;;
	hostfstype=*)
		HOSTFSTYPE=${x#hostfstype=}
		;;
	kloopfstype=*)
		KLOOPFSTYPE=${x#kloopfstype=}
		;;
	squashfs=*)
		SQUASHFS=${x#squashfs=}
		;;
	upperdir=*)
		UPPERDIR=${x#upperdir=}
		;;
	lowerdir=*)
		LOWERDIR=${x#lowerdir=}
		;;
	workdir=*)
		WORKDIR=${x#workdir=}
		;;
	qemunbd=*)
		QEMUNBD=${x#qemunbd=}
		;;  

四處:

在大約376行處增加
unset kloop
unset kroot
unset klvm
unset hostfstype
unset kloopfstype
unset squashfs
unset upperdir
unset lowerdir
unset workdir
unset qemunbd

修改init執行權限、所屬用戶和組。(防止出現引導過程中找不到Init文件。Failed to execute  /init Error -13)

sudo chmod 755 /usr/share/initramfs-tools/init
sudo chown root:root /usr/share/initramfs-tools/init

  

 

編輯文件二:local  (修改 3 處)
$ sudo gedit /usr/share/initramfs-tools/scripts/local

一處:

在約191行增加

if [ -z "$KLOOP" ] && [ -z "$SQUASHFS" ] && [ -z "$UPPERDIR" ] && [ -z "$QEMUNBD" ] ; then

二處:

在約260行增加

fi

三處:

在約261行增加

	#########################################################
	#                       kloop by niumao			#
	#########################################################

if [ -n "$KLOOP" ]; then

	### reset the value of the root variable 
	HOSTDEV="${ROOT}"
	NEWROOT="${rootmnt}"
	[ -n "$KROOT" ] && ROOT="$KROOT"
	[ -n "$KROOT" ] || ROOT="/dev/loop0"
	export ROOT
	realroot="$ROOT"

	###  auto probe the fs-type of the partition in which vhd-file live and mount it  /host 
	mkdir -p /host
	if [ -e ${NEWROOT}${KLOOP} ]; then
		mount --move $NEWROOT /host
	else	
		if [ -z "$HOSTFSTYPE" ]; then
			HOSTFSTYPE="$(blkid -s TYPE -o value "${HOSTDEV}")"
			[ -z "$HOSTFSTYPE"  -o "${HOSTFSTYPE}" = "ntfs" ] && HOSTFSTYPE="ntfs-3g"
		fi
		[ "${HOSTFSTYPE}" = "ntfs-3g" ] || modprobe ${HOSTFSTYPE}
		mount -t ${HOSTFSTYPE} -o rw  ${HOSTDEV}  /host
	fi
	
	### mount the vhd-file on a loop-device 
	if [ "${KLOOP#/}" !=  "${KLOOP}" ]; then       	
		modprobe  loop  
		kpartx -av /host${KLOOP}
		[ -e "$realroot" ] || sleep 3
	fi

	### probe lvm on vhd-file
	if [ -n "$KLVM" ];  then
		modprobe dm-mod
		vgscan
		vgchange  -ay  ${KLVM}
		[ -e "$realroot" ] ||  sleep 3
	fi 

	if [ "${readonly}" = "y" ] ; then
		roflag="-r"
	else
		roflag="-w"
	fi
	 
	### mount the realroot / in vhd-file on $NEWROOT 
	if [ -z "${KLOOPFSTYPE}" ]; then
		KLOOPFSTYPE="$(blkid -s TYPE -o value "$realroot")"
		[ -z "${KLOOPFSTYPE}" ] && KLOOPFSTYPE="ext4"
	fi
	[ -e "$realroot" ] || sleep 3
	mount    ${roflag} -t "${KLOOPFSTYPE}"  $realroot $NEWROOT
	
	### mount /host in initrd to /host of the realrootfs
	[ -d  ${NEWROOT}/host ] || mkdir -p ${NEWROOT}/host 
	mount --move /host   ${NEWROOT}/host
fi

if [ -n "$SQUASHFS" ];  then

	### reset the value of the root variable 
	HOSTDEV="${ROOT}"
	NEWROOT="${rootmnt}"
	
	###  auto probe the fs-type of the partition in which vhd-file live and mount it  /host 
	mkdir -p /host
	if [ -e ${NEWROOT}${SQUASHFS} ]; then
		mount --move $NEWROOT /host
	else	
		if [ -z "$HOSTFSTYPE" ]; then
			HOSTFSTYPE="$(blkid -s TYPE -o value "${HOSTDEV}")"
			[ -z "$HOSTFSTYPE"  -o "${HOSTFSTYPE}" = "ntfs" ] && HOSTFSTYPE="ntfs-3g"
		fi
		[ "${HOSTFSTYPE}" = "ntfs-3g" ] || modprobe ${HOSTFSTYPE}
		mount -t ${HOSTFSTYPE} -o rw  ${HOSTDEV}  /host
	fi
	
	###try to boot from squashfs
	modprobe overlay
	mkdir  -p /run/lowerdir /run/upperdir  /run/workdir
	mount  /host$SQUASHFS  /run/lowerdir
	mount  -t overlay overlay -o lowerdir=/run/lowerdir,upperdir=/run/upperdir,workdir=/run/workdir    $NEWROOT

	### mount /host in initrd to /host of the realrootfs
	[ -d  ${NEWROOT}/host ] || mkdir -p ${NEWROOT}/host 
	mount --move /host   ${NEWROOT}/host
fi	

if [ -n "$UPPERDIR" ] && [ -n "$WORKDIR" ];  then

	### reset the value of the root variable 
	HOSTDEV="${ROOT}"
	NEWROOT="${rootmnt}"
	
	###  auto probe the fs-type of the partition in which vhd-file live and mount it  /host 
	mkdir -p /host
	if [ -e ${NEWROOT}${UPPERDIR} ]; then
		mount --move $NEWROOT /host
	else	
		if [ -z "$HOSTFSTYPE" ]; then
			HOSTFSTYPE="$(blkid -s TYPE -o value "${HOSTDEV}")"
			[ -z "$HOSTFSTYPE"  -o "${HOSTFSTYPE}" = "ntfs" ] && HOSTFSTYPE="ntfs-3g"
		fi
		[ "${HOSTFSTYPE}" = "ntfs-3g" ] || modprobe ${HOSTFSTYPE}
		mount -t ${HOSTFSTYPE} -o rw  ${HOSTDEV}  /host
	fi
		
	###try to boot from dir
	modprobe overlay
	mkdir  /run/lowerdir 
	mount  -t overlay overlay -o lowerdir=/run/lowerdir,upperdir=/host$UPPERDIR,workdir=/host$WORKDIR  $NEWROOT

	### mount /host in initrd to /host of the realrootfs
	[ -d  ${NEWROOT}/host ] || mkdir -p ${NEWROOT}/host 
	mount --move /host   ${NEWROOT}/host
fi	


if  [ -n "$QEMUNBD" ] ; then

	### reset the value of the root variable 
	HOSTDEV="${ROOT}"
	NEWROOT="${rootmnt}"
	[ -n "$KROOT" ] && ROOT="$KROOT"
	[ -n "$KROOT" ] || ROOT="/dev/loop0"
	export ROOT
	realroot="$ROOT"

	###  auto probe the fs-type of the partition in which vhd-file live and mount it  /host 
	mkdir -p /host
	if [ -e $NEWROOT$QEMUNBD ]; then
		mount --move $NEWROOT /host
	else	
		if [ -z "$HOSTFSTYPE" ]; then
			HOSTFSTYPE="$(blkid -s TYPE -o value "${HOSTDEV}")"
			[ -z "$HOSTFSTYPE"  -o "${HOSTFSTYPE}" = "ntfs" ] && HOSTFSTYPE="ntfs-3g"
		fi
		[ "${HOSTFSTYPE}" = "ntfs-3g" ] || modprobe ${HOSTFSTYPE}
		mount -t ${HOSTFSTYPE} -o rw  ${HOSTDEV}  /host
	fi
	
	### mount the vhd-file on a loop-device 
	if [ "${QEMUNBD#/}" !=  "${QEMUNBD}" ]; then       	
		modprobe  nbd max_part=8 
		modprobe  loop
		[ -e  /dev/nbd0 ] || sleep 3 
		qemu-nbd  -c /dev/nbd0  /host${QEMUNBD}
		kpartx -av /dev/nbd0
		[ -e "$realroot" ] || sleep 3
	fi

	if [ "${readonly}" = "y" ] ; then
		roflag="-r"
	else
		roflag="-w"
	fi
	 
	### mount the realroot / in vhd-file on $NEWROOT 
	if [ -z "${KLOOPFSTYPE}" ]; then
		KLOOPFSTYPE="$(blkid -s TYPE -o value "$realroot")"
		[ -z "${KLOOPFSTYPE}" ] && KLOOPFSTYPE="ext4"
	fi
	[ -e "$realroot" ] || sleep 3
	mount    ${roflag} -t "${KLOOPFSTYPE}"  $realroot $NEWROOT
	
	### mount /host in initrd to /host of the realrootfs
	[ -d  ${NEWROOT}/host ] || mkdir -p ${NEWROOT}/host 
	mount --move /host   ${NEWROOT}/host
fi

	#########################################################
	#                       kloop by niumao			#
	#########################################################

  

編輯文件三:mkinitramfs (修改 1 處)
$ sudo gedit /usr/sbin/mkinitramfs 

 處一:

在約320處添加

# util-linux,added by niumao
copy_exec /sbin/blkid /sbin
copy_exec /sbin/losetup /sbin
copy_exec /sbin/kpartx /sbin
copy_exec /bin/ntfs-3g /bin
copy_exec /sbin/vgscan /sbin
copy_exec /sbin/shutdown /shutdown
copy_exec /usr/bin/qemu-nbd /bin
touch ${DESTDIR}/etc/initrd-release
touch ${DESTDIR}/version

  

 

編輯文件四:向modules文件追加三行內容,loop、fuse、dm-mod
/etc/initramfs-tools/modules

  

$ sudo echo "loop" >> /etc/initramfs-tools/modules 
$ sudo echo "fuse" >> /etc/initramfs-tools/modules
$ sudo echo "dm-mod" >> /etc/initramfs-tools/modules 
$ sudo echo "overlay " >> /etc/initramfs-tools/modules 

  

編輯文件五:向ntfs_3g文件增加內容
$ sudo gedit /usr/share/initramfs-tools/scripts/local-bottom/ntfs_3g 

替換ntfs-3g目的是防止關機出現 buffer I/O 錯誤引導階段能夠以可寫方式掛載ntfs分區上的vhd(如果沒有錯誤可以不替換ntfs_3g)

注:以下ntfs-3g代碼原作者更新時間(2021-0311,更新鏈接

#!/bin/sh

set -e
case "${1}" in
	prereqs)
		exit 0
		;;
esac

if [ "${ROOTFSTYPE}" = ntfs ] || [ "${ROOTFSTYPE}" = ntfs-3g ] || \
   [ "${LOOPFSTYPE}" = ntfs ] || [ "${LOOPFSTYPE}" = ntfs-3g ] || [ -n "$KLOOP" ] || [ -n "$SQUASHFS" ] 
then
	mkdir -p /run/sendsigs.omit.d
	pidof @ount.ntfs-3g >> /run/sendsigs.omit.d/ntfs-3g
fi
exit 0

 

注:以下ntfs-3g代碼原作者更新時間(2020-0307),此文件棄用,用上面的

#!/bin/sh

##set -e
##case "${1}" in
##	prereqs)
##		exit 0
##		;;
##esac

if [ "${ROOTFSTYPE}" = ntfs ] || [ "${ROOTFSTYPE}" = ntfs-3g ] || \
   [ "${LOOPFSTYPE}" = ntfs ] || [ "${LOOPFSTYPE}" = ntfs-3g ] || [ -n "$KLOOP" ] || [ -n "$SQUASHFS" ] || [ -n "QEMUNBD" ]
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
	pidof qemu-nbd >> /run/sendsigs.omit.d/qemu-nbd
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

  

 開始生成initrd.img文件,查看當前/boot 目錄下的initrd.img文件版本

$ ls /boot 

 

 下面的版本號填你自己看到的,這里是5.4.0-42

$ sudo /usr/sbin/mkinitramfs -o ~/initrd.img-5.4.0-42-generic

     注:參數-o,o是小寫

不出意外的話可以在home(主目錄)中找到生成的文件  

 

 接着,把initrd.img-5.4.0-42-generic、vmlinuz-5.4.0-42-generic用FTP軟件傳回到物理機上。

上面的install命令中已經安裝好了FTP客戶端,這時也保證物理機上的FTP服務軟件啟動狀態。

向物理機傳文件

$ lftp 192.168.3.11
ftp> put ~/initrd.img-5.4.0-42-generic
ftp> put /boot/vmlinuz-5.4.0-42-generic

 

將ubuntu里的文件拷貝出來和裝好ubuntu的vhd文件放同一目錄。

 

下一篇:Windows不分區VHD裝Linux多系統(五):Win7(物理機)添加引導  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM