今天抽時間折騰了一套無盤的 win10,簡單來講,使用 ipxe 網絡啟動,將 win10 安裝到網絡的 iscsi 硬盤(存在服務器上的單獨文件)中,然后正常啟動。這中間主要使用的幾個軟件工具及作用如下:
我用的 virtualbox 進行的測試,virtualbox 中創建了 openwrt,ubuntu, wins 三個虛擬機。并且在同一個內網中。openwrt 用來做網關和提供 dhcp 服務,因此需要雙網卡。ubutu 我為了主機訪問文件方便,也弄了個雙網卡。具體的使用和配置可以從網上搜索。wins 配置從網絡啟動,不添加硬盤,不從 uefi 啟動。
因為我的 openwrt 僅僅提供基本的網絡服務,因此其他的服務都是在 ubuntu 這個系統中的,包括 tftpd 服務,因此需要將 tftpd 的訪問信息攔截并轉發到 ubuntu 中。dnsmasq YYDS!!。在/etc/dnsmasq.conf 中添加下面的內容
dhcp-option-force=211,60i #這個好像是設置超時的
dhcp-option=option:tftp-server,192.168.1.127 #這個設置真實的tftp服務器的,這個ip就是ubuntu系統在內網中的服務器,不能跨網段,本文中調到的這個ip需要換成實際的
dhcp-boot=ipxe/netboot.xyz.kpxe,192.168.1.127,192.168.1.127 #這個是bios方式的ipx啟動文件,后面的是tftp服務對應的域名和ip
dhcp-match=set:efi-x86_64,option:client-arch,7 #這兩行是efi啟動方式,我沒有測試過
dhcp-boot=tag:efi-x86_64,ipxe/netboot.xyz.efi,192.168.1.127
下面這些其實都可以扔到 openwrt 中,只是我沒有想著擴充 openwrt,好像硬盤只有 1G 還是多少的。ubuntu 系統安裝 docker, tgt。
apt-get -y remove docker docker-engine docker.io containerd runc
apt-get -y update
apt-get -y install ca-certificates curl gnupg lsb-release tgt
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update -y
apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
#普通用戶想要執行docker命令可以在普通用戶權限下運行這個添加權限
#sudo usermod -aG docker $USER
ipxe 等服務的 docker 啟動配置
version: '3'
services:
tftp:
image: pghalliday/tftp
restart: always
volumes:
- ./buildout/buildout:/var/tftpboot:rw
ports:
- "69:69/udp"
- "69:69/tcp"
logging:
driver: "json-file"
samba:
image: andyzhangx/samba:win-fix
command: "-r -w WORKGROUP -s \"share;/share;yes;no;yes;all;all\" "
restart: always
environment:
- TZ=CST6CDT
- NMBD=true
- FILEMASK=0777
- DIRECTORYMASK=0777
- FORCEGROUP=root
- FORCEUSER=root
- USERID=0
- GROUPID=0
volumes:
- /data:/share #/data中的目錄將被顯示在共享文件的share中
ports:
- "139:139"
- "445:445"
logging:
driver: "json-file"
web:
image: nginx:alpine
restart: always
ports:
- "80:80"
volumes:
- ./buildout:/var/www/html:rw
- /data:/var/www/html/buildout/iso:rw
- ./nginx-site.conf:/etc/nginx/conf.d/default.conf:rw
logging:
driver: "json-file"
配置中的 nginx 的配置文件:
server {
listen 80;
server_name localhost;
root /var/www/html/buildout;
index index.php index.html index.htm;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
client_max_body_size 512m;
client_body_buffer_size 512m;
autoindex on;
location / {
try_files $uri $uri/ /index.html;
}
}
roles/netbootxyz/files/ipxe/local/general.h 中添加如下配置,開啟 sanboot 相關功能
#define PXE_STACK /* PXE stack in iPXE - you want this! */
#define PXE_MENU /* PXE menu booting */
#define DOWNLOAD_PROTO_NFS /* Network File System Protocol */
#define SANBOOT_PROTO_ISCSI /* iSCSI protocol */
#define SANBOOT_PROTO_AOE /* AoE protocol */
#define SANBOOT_PROTO_IB_SRP /* Infiniband SCSI RDMA protocol */
#define SANBOOT_PROTO_FCP /* Fibre Channel protocol */
#define SANBOOT_PROTO_HTTP /* HTTP SAN protocol */
#define PXE_CMD /* PXE commands */
user_overrides.yml 中修改相關配置:
boot_domain: 192.168.1.127
bootloader_http_enabled: true
我寫了個小腳本來進行 netbootxyz 的編譯:
#!/bin/bash
cd netboot.xyz
docker build -t localbuild -f Dockerfile .
docker run --rm -it -v $(pwd)/../buildout:/buildout localbuild
netbootxyz 構建出的 menu.ipxe 中添加下面的內容(我的在 buildout 目錄中):
#item --gap Default: 這行下面添加
item win10_boot ${space} win10_64_boot
item win10_install ${space} win10_64_install
#下面的添加到最后
:win10_boot
echo "boot win10 from iscsi"
set keep-san 1
#ip地址需要注意,對于默認的tgt來說,iqn之前的冒號前有個1
sanboot iscsi:192.168.1.127:::1:iqn.rix.test.win:win10 || goto mainmenu
:win10_install
echo "install win10 to iscsi"
imgfree
set keep-san 1
sanhook iscsi:192.168.1.127:::1:iqn.rix.test.win:win10
kernel http://${boot_domain}/wimboot
initrd http://${boot_domain}/iso/win10/boot/bcd BCD
initrd http://${boot_domain}/iso/win10/boot/boot.sdi boot.sdi
initrd http://${boot_domain}/iso/win10/sources/boot.wim boot.wim
boot
上面的 iso/win10 目錄下存放的是從 win10 鏡像中解壓縮出來的文件
我的 tgt 沒有放到 docker 中,所以單獨配置下吧。在/etc/tgt/conf.d 目錄下隨便添加一個.conf 后綴的文件,內容如下:
<target iqn.rix.test.win:win10>
backing-store /data/disks/win.img
</target>
上面的那個 iqn 是很重要的,配置啟動的時候需要用到。然后使用下列命令創建一個磁盤鏡像:
fallocate -l 40G /data/disks/win10.img
我將所有磁盤鏡像,windows 的安裝文件啥的都扔在/data 目錄下。重啟并檢查 tgt:
sudo systemctl restart tgt
sudo tgtadm --mode target --op show #這個命令應該可以看到我們的iqn以及對應的磁盤文件
win10 的虛擬機啟動,如果準備工作正確的話,會看到 netboot.xyz 的界面,并且看到我們添加的自定義的菜單,然后選賊 win10_install。正確的話,會啟動 win10 的安裝流程,這個在虛擬機中運行的時候,等待的時間比較長,也可能是以為我給虛擬機分配的內存比較少??傊?,如果看到 win10 的選擇語言的選項,就說明正常了。
如果這個時候按照正常的安裝邏輯的話,在安裝程序啟動后,會找不到磁盤。所以,我們在語言之后,要選擇“修復計算機”->“疑難解答”->“命令行提示符”然后在彈出的命令行中輸入以下代碼:
net use \\192.168.1.127\share
\\192.168.1.127\share\win10\sources\setup.exe
第一行表示使用共享目錄。第二行執行共享目錄下 win10 目錄中原始的安裝程序。之后和正常的 win10 安裝一樣了。最后到倒計時重啟。重啟后,選擇 win10_64_boot 這項進行啟動,以后都可以使用這個來進行啟動。
使用流程除了從網絡啟動外,其他的和有磁盤的方式沒太大區別。默認的情況下,數據也可以保存,數據保存是自動通過網絡保存到服務器上的,只是啟動的過程比較慢,文件讀寫涉及到網卡速度,估計大文件會比較慢。
使用這種方式創建的無盤系統只是作為一個參考,比不得專業的無盤系統的效率。
重裝系統,一個很常見的名詞。
很多人對重裝系統也有需求。隨便搜搜某寶,各種相關店鋪一堆,可見很多人不會這項技能。
授人以魚不如授人以漁,接下來介紹一個我認為最簡單的方法。
首先請出本文的主角,''Media Creation Tool'',其為微軟官方推薦裝系統工具。
官方網頁
點擊紅箭頭的位置,下載軟件。最新軟件名為“MediaCreationTool2004”。如果網頁打不開,可以關注我私信我取軟件。
1.以管理員身份運行軟件,進入到以下界面
點擊接受,靜候...
2.點擊 為另一臺電腦創建安裝介質(U盤、DVD或ISO文件),此處我們選擇U盤,U盤需要至少為8G。
點擊下一步,選擇對應U盤,然后自動下載解析Win10文件
至此,Win10系統盤已經制作完畢,后續介紹如何重裝系統。