1. 程式人生 > 其它 >將pebuilder變成dibuilder.sh,將di tools集入boot層(4):打包pve debs,利用pve代替pd打造你的bearmetal多os系統並集入boot

將pebuilder變成dibuilder.sh,將di tools集入boot層(4):打包pve debs,利用pve代替pd打造你的bearmetal多os系統並集入boot

技術標籤:minstackos實訓

本文關鍵字:sed 部分替換,debootstrap多源處理,merge multiple deb source into 1

在《將pebuilder變成dibuilder.sh,將di tools集入boot層(2):發明minstack live os》中,我們講到了針對單個deb repo路徑進行debootstrap打包差異化部分,產生巨集deb的的操作,在那文中,其本質是“利用dpkg -e加後配置指令碼代替apt,使apt動態配置包變成靜態包+後配置指令碼”,為了這種極致化目的,我們甚至用ar代替dpkg -e,甚至都不用到dpkg -i,這一切都是為了讓deb包的處理變得足夠portable:

這裡有二個處理,1,藉助工具,從網上的debian源出發,在本地建立一個部分源,2,藉助dibuilder.sh,將這些源重新remastering形成新發行版。
這些處理最終遺留了二個大問題,1,我們的操作是針對單個deb repo進行的,而現實(apt)的情況是,一個系統往往是針對多個倉庫(/etc/apt/sources.list/sources.d)條目進行的update/install,debootstrape只允許你指定一個,2,我們沒有解決依賴問題。(3,也許還要算上3,我們的後配置指令碼是排除了control/preinstall指令碼的,這個應該無法避免,除非我們保留源差異化deb包,而且這種包並不能dpkg -i安裝,因為它不能像升級包一樣去掩蓋(類似mount -o)同位置下的檔案,會提示之前的包已經將檔案放到那個位置了。)4,上文中,我們採用netiso作為基包測試debootstrap,但實際上我們應該用tdl-initramfs作為基包。而不是一個iso。不過,使用iso的結果也是正確的。但我們是以tdl-initramfs作為基礎remastering發行的,所以最好用後者。

廢話不多說。下面講述整理一個pve-initramfs所需的debs,得到其基礎包的過程(至於後配置和解決依賴的部分,以後有機會再強化吧),開始!

1,得到pve debs

上文求得xorg基礎包用的是debootstrape,debootstrap要求一個單一的mirror url,而我們現在面臨多源多庫的情形:

我們把single suite/codename/release->compent->arch的路徑叫做一個源,這就是debootstrape最後那個引數指定的mirror url,形如:

Suite: oldoldstable
Version: 8.11
Codename: jessie    我們把它稱為源
Date: Sat, 06 Jul 2019 09:36:16 UTC
Architectures: amd64 armel armhf i386
Components: main contrib non-free    我們把它稱為庫

一般,一個debian映象點會維護三個連續的版本,一個是oldoldstable,一個是oldstable,一個是stable,由於debian進化到了10,那個oldoldstable就是jessie8,jessie只是oldoldstable的連結。
而一個正常的debian版,不光是http://mirrors.xxx.com/debian/ jessie main這裡的內容,還有http://mirrors.xxx.com/debian-security/ jessie/updates main這裡的內容,比如,按aliyun它的映象新增教程,應該是這二條:

deb http://mirrors.aliyun.com/debian/ jessie main
deb http://mirrors.aliyun.com/debian-security/ jessie/updates main

(代表一個源庫的就是源release中指定的各個庫的packages/packages.gz/packages.bz2檔案,你/etc/apt/sources.list寫好源庫配置,sudo apt-get update後,packages中的軟體條目會寫入/var/lib/apt/lists,下面實踐一下,
首先將上面二條源庫配置寫入。然後:
sudo rm -rf /var/lib/apt/lists/*
sudo rm -rf /var/lib/apt/lists/partial/*
上面命令為了解決可能出現的waitting headers,也是為了清空上次的安裝資訊源庫資料庫。
再sudo apt-get update;sudo apt list | wc -l,在一個純粹的debian netinstall iso安裝出的系統中,會得出42000多條軟體包記錄,包括系統已安裝,待安裝等,即使/var/lib/apt/lists沒任何內容,sudo apt list也是能顯示已安裝的包的[installed,local])

而我們要的效果是,在這個netinstall iso中安裝出的本地虛擬機器系統中,我們需要維護一個由mirrors.aliyun.com產生的本地子源,以使得我們能利用/etc/apt/sources.list中單條deb http://10.211.55.2:8000/downloads/mirrors/debian jessie main main-security-updates pve-no-subscription,就足以能支援安裝完sudo apt install --no-install-recommends proxmox-ve(main-security-updates實際上就是release檔案中把debian-security/ jessie/updates main作為debian的子庫整合進來之後的效果,而proxmox-ve,是http://download.proxmox.com/debian/pve/dists/jessie/整合進來的子庫效果)。

這個操作的背後邏輯是:http://10.211.55.2:8000/downloads/mirrors/debian jessie main main-security-updates pve-no-subscription,這三個源main main-security-updates pve-no-subscription整合進來之後,對應的packages是要保證其正確性的,否則apt-update之後,它不會提示你安裝,而僅會提示你說“deps unmet,依賴未達到”,意思就是說你提供的源是不健全的是壞的,而在配合以前的dibuilder.sh指令碼中,為了能使檔名中包含+,~的deb包名能做在onedrive中被hosting,我們修改和定製了release檔案和packages/paackages.gz檔案,由於這些檔案的修改當初僅預設作為配合dibuilder.sh中簡單的remastering,所以並沒有太多考慮(比如它所在的源其實不支援apt-get,也不好用於debootstrape),裡面經過修過的檔案當然不能放在/etc/apt/sources.list中用(自然會導致deps unmet),而我們現在想使之正確用於debootstrape和apt-get,放在sources.list中使用(支援sudo apt install --no-install-recommends proxmox-ve)。

所以我們要重新提供正確的packages版本,直接從http://mirrors.aliyun.com/debian/dists/jessie/main/binary-amd64/Packages.gz https://mirrors.aliyun.com/debian-security/dists/jessie/updates/main/binary-amd64/Packages.gz http://download.proxmox.com/debian/pve/dists/jessie/pve-no-subscription/binary-amd64/Packages.gz下載截止目前最新的pakcages再經過如下處理即可(暫時不需要一開始就涉及到下載debs):

我們一步一步來:

(我們之前在dibuilder.sh是嚴格按官方路徑存放debs的,現在我們統一將debs放到dists下下級的目錄中:這樣更合理,因為我們是求得一個定製源的子庫------ 基於此,我們來修改獲得packages)

cat Packages | sed -e ‘s/Filename: .*//Filename: /g’ > NewPackages (首先把路徑去掉)

然後把三個packages中的路徑都修改為各自的dists/jessie/main/binary-amd64/deb/下,dists/jessie/main-security-updates/binary-amd64/deb/下,和dists/jessie/pve-no-subscription/binary-amd64/deb/下,這個/deb/的上級也可以放各自dists的vmlinuz,cdl-initramfs,tdi-initramfs,grub files等等,------ 將索引邏輯僅保留在packages中單獨編輯,deb檔案全部無層次,這樣維護方便。由於我們的發行版是部分拉取總庫形成的,這樣資料夾中不會有大量檔案其實也合理。dibuilder.sh對應下載陣列/下載/解壓邏輯處要改一下

然後,cat Packages | sed ‘s/(Filename: .)+(..deb)/\1-\2/’ | sed ‘s/(Filename: .)+(..deb)/\1-\2/’ | sed ‘s/(Filename: .)~(..deb)/\1-\2/’ > NewPackages (第一次替換+號後,還有少許+號殘留,最後一次替換~,你其實可以在上面輸出為NewPackages前 | grep "Filename: " 檢視驗證結果)

然後在本地wc -c Packages,md5sum,sha1sum,sha256sum Packages,用得出的結果修改Releases

這樣packages就修改完成了,用deb http://10.211.55.2:8000/downloads/mirrors/debian jessie main main-security-updates pve-no-subscription寫的sources.list在sudo apt install --no-install-recommends proxmox-ve時能出現正確的提示而不是deps unmet了。

然後是得到main-security-updates與pve-no-subscription的debs,main的我們在前面已經通過debootstrape得到過了。把源庫配置恢復為aliyun.com的二條,pve的用deb http://download.proxmox.com/debian/pve jessie pve-no-subscription

sudo rm -rf /var/cache/apt/archives/*
sudo apt install -y --download-only --force-yes --no-install-recommends proxmox-ve > 2.txt (由於這是多源結構不可能用debootstrap之類的工具,這條拿掉2.txt,會提示2個升級,161個新裝,共163個包要下載到/var/cache/apt/archives中去)

提取debs:

(main的新加部分90個)mkdir main-deb;cat 2.txt |  grep http://10.211.55.2:8000 | awk '{print $4,$6,$5}'| sed -e 's/ /_/g' | sed -e 's/:/%3a/g' |while read line; do sudo cp -f /var/cache/apt/archives/$line.deb main-deb; done
(security的部分35個)mkdir sec-deb;cat 2.txt |  grep http://mirrors.aliyun.com/debian-security ....
(pve的部分38個)mkdir pve-deb;cat 2.txt |  grep http://download.proxmox.com/debian ....

實際測試用deb http://10.211.55.2:8000/downloads/mirrors/debian jessie main main-security-updates pve-no-subscription安裝sudo apt install --no-install-recommends proxmox-ve。

首先是修改/etc/hosts,只需要修改或加入一條,本地公網IP 對應主機名,之後hostname --ip-adress能得到那個公網IP就行了,這步是必要的,否則會在安裝配置處出錯。提示E: Sub-process /usr/bin/dpkg returned an error code (1),網上安裝pve的教程的其它部分可以忽略。

重新啟動,pve 在 grub advanced 4.4.134-1,也是預設的第一條,但是點開用advance原來的3.0.16也可以,所以我們完全可以從90m的pve-deb結果中排除二個大deb,得到約20m的pve結果。

2,得到pve的意義:代替虛擬boot作暫代方案。用pve/lxc代替openfaas/container

第一部分實際上就是利用pve實質上就是一些debian包的本質來完成的:

Proxmox VE ships as a set of Debian packages, so you can install it on top of a standard Debian installation. After configuring the repositories Section 3.1, you need to run: apt-get update apt-get install proxmox-ve,及https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_Stretch這樣的教程。

這個好處較exsi這種從核心開始封閉生產的系統大了去了:它可以用於作為我的暫代方案。

其實這個想法很久了,最初是為了實現parallels boot+oslevelvm app level vm in 1+guestos=all in the boot,後來它發展我的整個方案:一個企圖將統一語言統一平臺統一開發組成的最小開發棧實現做入boot的方案,這種子系統,虛擬機器,app容器合一的架構特性保證了虛擬到各os的app共享同樣級別的virutal appliance基礎(甚至硬體統一)
在實踐中,想用virtual boot firmware+libos做,發現難度較高,業界對此方案的支援處在早期,故現在轉為基於linux普通方式做。在《一個統一的parallel bootloader efi設想:免PE,同時引導多個系統》和《一種虛擬boot作通用bootloader及一種通用qemu os的設想》開始一直是這種思路的嘗試。在群暉等bearmetal上折騰過,甚至想買個裸金屬雲伺服器折騰。
故目前的實現僅是採用某些方案的一個暫代,僅介紹在雲主機上安裝pve和各種常見和專用qemu的unix系雲OS

更多考慮:

pve更像是一個debian dists。而不是一個deb bundle。當然它也可以做成xorg的巨集deb包。不過這不是我的方向,make tdl-initrd-pve才是。所以只要在倉庫中維護可remastering to dists的包就好了,不要巨集包化加靜態加後配置(這個僅適合cdi整合,其實這個是為了cdi考慮的,並不一開始考慮用在xorg包巨集化上面),
為什麼不使用Qubes os。。因為它是基於xen過時的。而pve同時有OS級虛擬(kvm)和OS內APP虛擬(lxc)
而且lxc container template完全可以用packer或debootstrap生成。免去用docker-cli這樣的東西生成。甚至可以將minstackos裝在雲端,生成sket腳手架映象用。
為什麼選擇4而不是更高版?
雖然Support for Proxmox VE 4.4 ends on June 30, 2018,但我們為了與以前相容還是用jessie pve
另,pve 4的剛好沒有lvm。thin lvm有個好聽的名字叫精簡置備,比qcow2這種更有優勢,但local storage更適合除錯和初級使用。


無論如何,我們安裝了pve,就實現了用雲主機支援快照的方式使用本地osle,在不支援再虛擬化的雲主機上,lxc式的容器更容易instant commit,甚至未來我們將其單盤化裝在mbp的分割槽中,裸金屬方向使用mbp搭建pve雲(附帶解決mbp下無線網絡卡不可用,開機亮度過高這些debian在mbp上的安裝使用問題)。