開發與維運

打造類手機刷機的win10 recovery鏡像

本文關鍵字:打造小於4G的win10精簡鏡像,打造類手機刷機的win10 recovery鏡像,打造統一bootloader分區 as pc recovery,非romos

眾所周知,windows系統不支持mount,其系統盤下往往有windows,user(documents and settings),programfiles這三大文件,在使用過程中,安裝程序和用戶都有可能往這三個文件夾中寫東西使得系統盤變大,其中user和programfiles文件夾最容易變動,這使得使用windows,總免不了要經常重裝系統。雖然windows安裝完成後,有給desktop,document,video,photo,download文件夾換位置的功能,但是並不能達到使較穩定的os文件夾和極易變動的prog+docs這二大件分開的目的。而如果存在有一種類linux的mount,就可以隨意將這二個文件夾指向到其它位置和大點的盤符,系統盤本身不易變動不再需要頻繁去裝且可單獨備份/清理,(因為分離了前者,後二者整個刪掉也可以做到相當於清理系統)。

在手機平臺上,刷手機recovery/刷ROM/恢復手機/雙清/應用緩存清理,這些技術很流行,手機系統的rom往往專門針對某個型號,給手機刷機的第一步搞的recovery,如果此步失敗或斷電中斷,手機極容變磚。只是PC不容易這樣,其實手機刷機和PC裝機有很大共同之處,只是PC的設計就是給重裝各種OS開放的,PC上的系統比較通用,即使windows也有幾種版本。因此PC上有bios和uefi這樣的方案。bios是寫死在硬件上的,OS往往自帶bootloader作為第二層,像windows的bootmgr,ntldr,linux系的grub,然後才是OSkernel+APP,那麼uefi就是PC專門直接開放給軟件層省去BIOS的方案,UEFI約定各OS將他們的BOOTLOADER做在硬盤第一分區的recovery,uefi的第一分區esp,就相當於手機上的recovery,複雜的bootloader可以是預安裝環境,如windows pe,如群暉的webassit,如apple mac的在線重裝界面。

那麼看出來了嗎,我們這裡有好幾個分離,1,將OS文件夾與DOCS+PROGS文件夾分離。這使得達到極大免重裝(易雙清)數據mount到其它盤,雙清就相當於清理數據盤。2,將recovery和os分離,這樣系統壞了並不會導致不能重裝,(且易刷機,配合recovery裡面的軟件極易拿來刷機,這才是重點),易雙清和易刷機這樣的方案都有了,才像手機。

好了,下面我們來給PC打造這樣一個uefi分區as recovery rom的功能,並。我們最後將產生一個<5G的多區段img,這個img包含了recovery,os(系統只讀且固態,但非ramos,維持在4G),data template,本著能雙清就不要刷機的類手機原則,所以這個img一旦弄好最大用途只是拿來給別的同型號機器刷機。

材料:laomaotao winpe,我們主要依賴裡面的diskgen做鏡像和恢復而不是ghost,因為後者有缺陷稍後會談到,還有CPRA_X64FRE_ZH-CN_ZZZ+++.iso這個win10鏡像。

它展開有4.58G比4G大,我們需要用一些手段把它放到4G空間中去。準備工作:用U盤做一個laomaotao啟動U盤,把這個ISO拷進去。好了,使用u盤上的laomaotao啟動PC(我在一臺只有一張16G的SSD盤的筆記本上做):

1,製造system img和recovery img

打開diskgen dev v4.9.6.564 free,把16G硬盤分成4個區,依次是400mb esp,100 msr,然後是4G的windows分區(ntfs),後面剩下10G,先分200M出來承載data template(ntfs),剩下先不用。(在鏡像做好後,將鏡像恢復到一臺具體PC的數據區時,這個PC的數據區可以用所有剩下的部分,用diskgen的動態擴展分區就可以了),那我為什麼不用上呢?注意:我這是在做鏡像,而不是在使用鏡像,是基於方便測試目的。

使用winntsetup安裝這個iso到4G空間上,啟動分區設為400m esp(如果不選這裡安裝後重啟了,後期你只能用啟動分區修復工具修復,它會將C盤下的efi文件模板拷到esp分區並做好bcd修改),等ISO安裝完後就會將win10的bootloader拷進去。重點來了,上面提到ISO展開是實際佔用4.58G的,所在在winntsetup上我們務必在右上角使用compact os方案,選第一個xpress4k方案,安裝完後大約是3g的樣子(為了使分區更小,你還可以找到dism++,點開空間回收,把硬鏈接選上,還可以騰出200-300M的空間)

ISO安裝完成,拔掉U盤,重啟系統,等它第一次運行,用戶名和密碼就用admin,admin。系統第一次進去完成,把必要的驅動裝上(為了不讓意料外的結果發生,最好斷網離線安裝驅動,事先把驅動解開放U盤,否則系統有時會下載更新包),插上U盤,進入winpe,還可以使用dism++精簡一次多餘的驅動,然後你再找到系統盤,刪掉csystem32driverstor裡的FileRepository。又節省了幾百M。其實此時C盤下的efi文件模板也可以刪掉(如果你是winntsetup直接選的那麼400m esp),增加驅動+幾次精簡過後,windows區還是維持3G左右的樣子,這正是我們要的結果。------- 但卻不是ghost這種軟件想看到的結果,如果你查看windows分區屬性,會發現compactos之後的windows實際上是4-5G的,按正常方法把這個分區ghost備份下來,再還原到一個4G大的空間時,會提示空間不足無法還原。我試了diskgen的分區備份/恢復到鏡像pmf文件也是一樣

所以我們得把整個分區img拍下來。

我們在diskgen中新建一個硬盤鏡像,保存到U盤命名為win10formypc.img,鏡像大小400+100+4096+200=4696M,然後分別對應左邊算式的位置建立ESP,msr,os,datatemplate區並格式化。現在我們右擊這個虛擬硬盤的4096系統區,點克隆分區,把做好的16G硬盤上的4G系統區複製過來,按文件複製方式,發現是成功的。把它恢復到原來16G中的4G系統區,拔掉U盤,系統也是可以啟動的。

這樣我們就完成了製造系統分區(這個鏡像依然只是拿來測試的,我只是跟你說明這種方法可以,這個系統還需要強化,把windows和docs+progs分區)。

再次U盤進入laomaotao,打開diskgen,右擊老毛桃所在的400mU盤分區,文件複製把裡面的boot文件夾(含10pe64.wim和boot.sdi)複製到我們16G硬盤上的400m esp分區,400M只剩50M不到了。打開bootice,選擇esp裡的bcd,編輯添加一條指向到boot/10pe64.wim和boot/boot.sdi的wim啟動項,命名為lmt recovery,點一次保存當前配置,再點一次保存全局配置。拔掉U盤,開機測試是可以啟動winpe的。

插上U盤重進winpe(依然使用U盤上的winpe),,利用給4G系統區拍鏡像的方法,把recovery區拍進u盤上的win10formypc.img

2,強化system img和建立data template img

好了,現在我們研究分離windows和docs+progs的方法。利用windows中的mklink。

插上U盤重進winpe重進winpe,一直注意到data template區是以D盤符顯示的。先改註冊表,下面的修改中,D即是把C中的文件夾轉移到data template的註冊修改,打開註冊表編輯器,定位到16G硬盤系統區中的C:WindowsSystem32configsoftware,加載配置單元。將其掛載到任意根下,我掛的是HKEY_USER,因為這裡條目少,命名為111,把下面的內容存為reg,導入,即會修改111中的對應內容。請自行研究註冊表文件中對應修改的意義:

Windows Registry Editor Version 5.00

[HKEY_USERS\111\Wow6432Node\Microsoft\Windows\CurrentVersion]
"CommonFilesDir"="D:\\Program Files (x86)\\Common Files"
"CommonFilesDir (x86)"="D:\\Program Files (x86)\\Common Files"
"CommonW6432Dir"="D:\\Program Files\\Common Files"
"ProgramFilesDir"="D:\\Program Files (x86)"
"ProgramFilesDir (x86)"="D:\\Program Files (x86)"
"ProgramW6432Dir"="D:\\Program Files"

[HKEY_USERS\111\Microsoft\Windows\CurrentVersion]
"CommonFilesDir"="D:\\Program Files\\Common Files"
"CommonFilesDir (x86)"="D:\\Program Files (x86)\\Common Files"
"CommonW6432Dir"="D:\\Program Files\\Common Files"
"ProgramFilesDir"="D:\\Program Files"
"ProgramFilesDir (x86)"="D:\\Program Files (x86)"
"ProgramW6432Dir"="D:\\Program Files"

[HKEY_USERS\111\Microsoft\Windows\CurrentVersion\Explorer\ShellFolders]
"Common Start Menu"="D:\\ProgramData\\Microsoft\\Windows\\StartMenu"
"Common Programs"="D:\\ProgramData\\Microsoft\\Windows\\StartMenu\\Programs"
"Common Administrative Tools"="D:\\ProgramData\\Microsoft\\Windows\\StartMenu\\Programs\\Administrative Tools"
"Common Startup"="D:\\ProgramData\\Microsoft\\Windows\\StartMenu\\Programs\\Startup"
"OEM Links"="D:\\ProgramData\\OEMLinks"
"Common Templates"="D:\\ProgramData\\Microsoft\\Windows\\Templates"
"Common AppData"="D:\\ProgramData"

;其中這二條有一些16進制programdata,可以手動改下,注意鑑別,發現是對應C:\\文件夾的就改成D:\\對應文件夾,注意\\和\
;[HKEY_USERS\111\Microsoft\WindowsNT\CurrentVersion\ProfileList]:ProgramData
;[HKEY_USERS\111\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders]

卸載配置單元即保存了修改結果,然後打開pe中的cmd,複製粘貼執行下列命令:

xcopy "C:\Program Files" "D:\Program Files\" /E /H /K /X /Y /C
xcopy "C:\Program Files (x86)" "D:\Program Files (x86)\" /E /H /K /X /Y /C
rmdir /s /q "C:\Program Files"
rmdir /s /q "C:\Program Files (x86)"
mklink /J "C:\Program Files" "D:\Program Files"
mklink /J "C:\Program Files (x86)" "D:\Program Files (x86)"
xcopy C:\ProgramData D:\ProgramData\ /E /H /K /X /Y /B /C
rmdir /s /q C:\ProgramData
mklink /J C:\ProgramData D:\ProgramData

如果無誤的話,它實際上完成的是文件硬鏈接操作,上面是關於program files,programdata和program files(x86)的。下面是關於user的。

Windows Registry Editor Version 5.00

[HKEY_USERS\111\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders]
"Common Desktop"="D:\\Users\\Public\\Desktop"
"Common Documents"="D:\\Users\\Public\\Documents"
"CommonMusic"="D:\\Users\\Public\\Music"
"CommonPictures"="D:\\Users\\Public\\Pictures"
"CommonVideo"="D:\\Users\\Public\\Videos"

;其中這二條有一些16進制programdata,可以手動改下,注意鑑別,發現是對應C:\Users的就改成D:\Users,注意\\和\,S-1-5-21-3843801140-3458922274-3296897442-500是你的admin用戶
;[HKEY_USERS\111\Microsoft\WindowsNT\CurrentVersion\ProfileList] 下的 Default、ProfilesDirectory、Public
;[HKEY_USERS\111\Microsoft\WindowsNT\CurrentVersion\ProfileList\S-1-5-21-3843801140-3458922274-3296897442-500]下的 ProfileImagePath
;下面這條特殊處理,在pe中看不到,只有在退出PE進入硬盤系統後才能看到。C:\Windows\System32\config\default
;[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ShellFolders] 下的值看到數據中有 C:\Users的都改過來。

卸載配置單元,然後是執行硬鏈和轉移操作:

xcopy C:\Users D:\Users\ /E /H /K /X /Y /B /C
rmdir /s /q "D:\Users\Default User"
mklink /J "D:\Users\Default User" D:\Users\Default
cacls "D:\Users\Default User" /S:"D:PAI(D;;CC;;;WD)(A;;0x1200a9;;;WD)(A;;FA;;;SY)(A;;FA;;;BA)"
rmdir /s /q C:\Users
mklink /J C:\Users D:\User

注意到d:userdefault需要重新賦權。生成的d盤僅200m不到。所以為它預留的200m是足夠的。

都無誤後,按1中給系統拍鏡像的方法,格式化win10formypc.img中的系統區,把硬盤中的新系統區和data template區拍進win10formypc.img

重啟進入系統,完成!!這個<5G的鏡像打包後大約2-3G,以後在新機或本機還原時就進winpe,打開dg還原/重做鏡像,其中datatemplate你需要擴展到你本機硬盤上剩下所有空間,這就是刷機,如果用這樣的IMG做出來的系統垃圾多了,就稍微用清理工具清一下C盤,或整個刪D盤。


(此處不設回覆,掃碼到微信參與留言,或直接點擊到原文)

qrcode.png

Leave a Reply

Your email address will not be published. Required fields are marked *