1. 程式人生 > >[轉]從零開始:在Linux上覆蓋安裝WINDOWS通用教程(dd)

[轉]從零開始:在Linux上覆蓋安裝WINDOWS通用教程(dd)

備份 虛擬 livecd tfs ocean syntax 文件夾 尋找 font

完整自制尚不方便,還有許多改進的地方.
現在可以達到在單硬盤,無救援模式的情況下安裝Winodws.
再也不需要強制要求內存大於鏡像包大小了.

本例所給的wget後鏈接均可用,教程是完整的.

(原文鏈接:https://moeclub.org/2017/08/31/361/)

環境 DigitalOcean 512M Debian8 x64
目標 Windows Think PC (Windows 7 Embedded)


      此教程適用於具有以下特征的機器:

    1. 宿主機提供的VNC
    2. 能夠隨意更換內核
    3. GURB引導啟動

      準備工作:

    • 較高版本的WINDOWS主機 (提供高版本的DISM API)
    • Windwos原版鏡像 (個人版,企業版
      服務器版)
    • DISM++ (打補丁,制作鏡像)

以下步驟在DigitalOcean上測試成功:

      制作可用的鏡像文件:

    1. 下載鏡像:下載地址個人版,企業版 服務器版
    2. 提取install.wim文件:解壓或掛載都行,提取該文件到’E:\install.wim‘.
      文件路徑\sources\install.wim
    3. 創建一個vhd虛擬磁盤:
      示例:盤符為’V‘,路徑為’D:\win.vhd‘,大小為5120M.

      1. 以管理員身份打開命令提示符,然後輸入:
      2. diskpart
      3. CREATE VDISK FILE=”D:\win.vhd” TYPE=FIXED MAXIMUM=5120
      4. SELECT VDISK FILE=”D:\win.vhd”
      5. ATTACH VDISK
      6. CLEAN
      7. CREATE PARTITION PRIMARY
      8. FORMAT FS=NTFS QUICK
      9. ASSIGN LETTER=V
    4. 在D盤創建一個文件夾’D:\MOUNT‘,打開DISM++
      點文件–>掛載映像–>點第一個瀏覽,找到’E:\install.wim‘–>點第二個瀏覽,找到’D:\MOUNT‘–>不選中只讀模式–>確定
    5. 在DISM++裏進行優化,安裝語言包,添加VirtIO驅動等操作
      備份下載VirtIO驅動
    6. 完成後,點文件–>另存為映像–>保存在’D:\install.wim‘,等待任務完成
    7. 點文件–>釋放映像–>點第一個瀏覽,找到’D:\install.wim‘–>點第二個瀏覽,找到’V:\‘–>只選中添加引導和格式化–>確定–>在彈出的’引導修復-BIOS’對話框中點擊更多–>找到盤符為V的磁盤分區–>確定
    8. 等待完成,在資源管理器中,在盤符為V的磁盤分區點擊右鍵–>彈出.
      如有報錯請認真看以上步驟.
    9. 使用gunzip工具壓縮打包壓縮’D:\win.vhd‘
      用法:gzip.exe -k9 D:\win.vhd.等待壓縮完成.
      可點擊gunzip for windows下載工具,或使用備份下載鏈接下載此工具.
      解壓文件,將’bin‘目錄中的文件放置’%WINDIR%/SYSTEM32‘文件夾中,即可方便在命令提示符中使用.
      實際上剛剛得到的’D:\win.vhd‘就是一個可直接dd的文件.
    10. 上傳到可用HTTP直接下載的地方,最好不要包含跳轉.

      更新grub配置文件:

    1. 下載 Debian netboot mini.iso 到’/boot‘文件夾內.
      1 wget -qO /boot/mini.iso https://moeclub.org/get-deb-livecd
    2. 在/boot文件夾/子目錄內尋找GRUB配置文件.

      • 如果GRUB的配置文件為’grub.cfg’:
        在文件的末尾添加
        1 2 3 4 5 6 menuentry "Boot mini" { set isoimage="/boot/mini.iso" loopback loop (hd0,1)$isoimage linux (loop)/linux auto=true LANG=en_US.UTF-8 KEYTABLE=us netcfg/dhcp_options="Configure network manually" netcfg/dhcp_failed=note netcfg/get_nameservers=8.8.8.8 hostname=MoeClub domain=MoeClub.org -- quiet initrd (loop)/initrd.gz }
      • 如果GRUB的配置文件為’grub.conf’:
    3. 獲取本機的IP,子網掩碼,網關並記錄下來.
      一般控制臺最下面有這些參數.
      如果沒辦法獲取到這三項參數,可以用以下命令獲取.
      代碼片段摘自 Debian(Ubuntu)網絡安裝/重裝一鍵腳本
      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 DEFAULTNET="$(ip route show |grep -o ‘default via [0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.*‘ |head -n1 |sed ‘s/proto.*\|onlink.*//g‘ |awk ‘{print $NF}‘)" [ -n "$DEFAULTNET" ] && IPSUB="$(ip addr |grep ‘‘${DEFAULTNET}‘‘ |grep ‘global‘ |grep ‘brd‘ |head -n1 |grep -o ‘[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}/[0-9]\{1,2\}‘)" IPv4="$(echo -n "$IPSUB" |cut -d‘/‘ -f1)" NETSUB="$(echo -n "$IPSUB" |grep -o ‘/[0-9]\{1,2\}‘)" GATE="$(ip route show |grep -o ‘default via [0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}‘ |head -n1 |grep -o ‘[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}‘)" [ -n "$NETSUB" ] && MASK="$(echo -n ‘128.0.0.0/1,192.0.0.0/2,224.0.0.0/3,240.0.0.0/4,248.0.0.0/5,252.0.0.0/6,254.0.0.0/7,255.0.0.0/8,255.128.0.0/9,255.192.0.0/10,255.224.0.0/11,255.240.0.0/12,255.248.0.0/13,255.252.0.0/14,255.254.0.0/15,255.255.0.0/16,255.255.128.0/17,255.255.192.0/18,255.255.224.0/19,255.255.240.0/20,255.255.248.0/21,255.255.252.0/22,255.255.254.0/23,255.255.255.0/24,255.255.255.128/25,255.255.255.192/26,255.255.255.224/27,255.255.255.240/28,255.255.255.248/29,255.255.255.252/30,255.255.255.254/31,255.255.255.255/32‘ |grep -o ‘[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}‘${NETSUB}‘‘ |cut -d‘/‘ -f1)" [ -n "$GATE" ] && [ -n "$MASK" ] && [ -n "$IPv4" ] || { ipNum() { local IFS=‘.‘ read ip1 ip2 ip3 ip4 <<<"$1" echo $((ip1*(1<<24)+ip2*(1<<16)+ip3*(1<<8)+ip4)) } SelectMax(){ ii=0 for IPITEM in `route -n |awk -v OUT=$1 ‘{print $OUT}‘ |grep ‘[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}‘` do NumTMP="$(ipNum $IPITEM)" eval "arrayNum[$ii]=‘$NumTMP,$IPITEM‘" ii=$[$ii+1] done echo ${arrayNum[@]} |sed ‘s/\s/\n/g‘ |sort -n -k 1 -t ‘,‘ |tail -n1 |cut -d‘,‘ -f2 } [[ -z $IPv4 ]] && IPv4="$(ifconfig |grep ‘Bcast‘ |head -n1 |grep -o ‘[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}‘ |head -n1)" [[ -z $GATE ]] && GATE="$(SelectMax 2)" [[ -z $MASK ]] && MASK="$(SelectMax 3)" } PubIPv4="$(wget -qO- checkip.amazonaws.com)" [ -n "$IPv4" ] && [ -n "$PubIPv4" ] && { [ "$IPv4" != "$PubIPv4" ] && IPv4="$(echo "$IPv4; $PubIPv4")" } [ -n "$GATE" ] && [ -n "$MASK" ] && [ -n "$IPv4" ] && { echo -e "IPv4:\t\033[33m$IPv4\033[0m\nMASK:\t\033[33m$MASK\033[0m\nGATE:\t\033[33m$GATE\033[0m" } || { echo "Error! Not found network config. " }
    4. 進入VNC界面,然後在SSH終端輸入重啟命令.
      在VNC界面中可以看到啟動菜單,選擇’Boot mini‘

      安裝WINDOWS鏡像:

    • 此時進入Debian的安裝界面,註意對話框頂部.
      • 如果出現的是
        Download debconf preconfiguration file
        請按兩次ESC鍵,選擇倒數第二個:
        Execute a shell
        選中Continue,並按回車
      • 如果出現的是
        Configure the network
        請按要求填入網絡參數,等待出現
        Download debconf preconfiguration file
        按兩次ESC鍵,選擇倒數第二個:
        Execute a shell
        選中Continue,並按回車
    • 使用ls /dev命令可查看硬盤狀況
      可知DigitalOcean機器的硬盤為’/dev/vda‘
    • 接下使用dd命令進行應用鏡像,也可以使用自己的鏡像.
      1 wget -qO- https://moeclub.org/get-win7embx86 |gunzip -dc |dd of=/dev/vda
    • 待完成後,輸入reboot命令
      就可看到久違的WINDOWS啟動界面.按照正常步驟安裝.
    • 安裝完成後,如果沒有網絡,你需要自行完善網絡配置.
    • 遠程桌面服務如果沒有意外,我提供的鏡像會自動打開.

提示:在安裝步驟時鼠標位置不好找,可能不太適應.
請嘗試使用空格鍵回車鍵Tab鍵方向鍵進行操作.

    • 在磁盤管理中,點擊’C‘盤,右鍵選擇’擴展卷‘,可以直接’增加‘C盤的空間.

      後記:

    • 你可以在裝有Hyper-V的機器上,掛載這個vhd鏡像,然後完成安裝步驟,優化.
      再進行壓縮vhd鏡像,然後dd安裝.可能效果更佳.
    • 文章只是提供一個思路,和實現的例子.更多期待你們去嘗試.

      提供一些可直接使用的鏡像

    • Windows Embedded 8.1 x86
      1 wget -qO- https://moeclub.org/get-win8.1embx86 |gunzip -dc |dd of=/dev/vda

[轉]從零開始:在Linux上覆蓋安裝WINDOWS通用教程(dd)