上一篇: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(物理機)添加引導