一、APT倉庫目錄結構
1.1 版本代號
sid,still in development,該版本和unstable版本是一樣的。
版本可以從多個側面來進行命名。
第一,從release的角度進行命名。比如,buster、jessie、stretch
第二,使用數字編碼,比如7、8、9,然后還有小版本,7.11、8.9
第三,對於當前最新的開發版本,又可以命名為stable、unstable和testing分支,當前的unstable又可以叫做sid。
第四,同樣的對於上一個開發版本,可以命名為oldstable、上上個版本,oldoldstable。
1.2 dists目錄
這個里面即是各個版本的包倉庫,如果當前的開發版本是stretch,那么stable目錄是到stretch的軟連接,其它的依次類推。
1.3 dists子目錄
dists的子目錄分為release和suite兩大類,release即buster、jessie和stretch這些,而suite即unstable、testing和stable等。
再進一步的子目錄又分為contrib、main和non-free。
再進一步的子目錄里面是binary-xxx、source,binary-xxx 里面是對應二進制包的元數據,Packages.gz,source里面是對應的源碼包的元數據,即Sources.gz。
通過它們可以找到真正的二進制包和源碼包。
1.4 pool目錄
真正的debian的二進制包和源碼包是在根目錄下面的這個pool目錄下。
1.5 main、contrib和non-free
全部是free的包在main中,
全部是non-free的包在non-free中
依賴於non-free的包仔contrib中。
這些即是components
1.6 xxx-updates
proposed-updates里面的一些包也會放在這里。
1.7 xxx-proposed-updates
在穩定版的基礎上的更新也會進行release,比如7.1、7.2、7.3等等,這些release被稱為point release,而這個proposed-updates就是為下一次的point release做准備工作的,也就是說,對穩定版本的更新先放在proposed-updates里面,然后積累到了一定的量之后發布point release。
1.8 xxx-backports
就是同一個發行版的unstalble、testing中的包,在stable下重新編譯,使之可以在stable版本下使用。
1.9 xxx-backports-sloppy
就是下一個發行版的unstalbe、testing中的包,在old stable下重新編譯,使之可以在old stable版本下使用,比如stretch的tesing中的包,使之可以在jessie的stable中使用,就上傳到這個文件夾里面。
1.10 xxx-kfreebsd
kfreebsd指的是使用freebsd kernel的debian發行版。
1.11 xxx-kfreebsd-proposed-updates
同xxx-proposed-updates
1.12 update的最小粒度是包嗎?
這些不重要,重要的是,更新之后,所用的包就是新版本的包了。
2 debian開發的流水線
2.1 debian分支開發的順序
unstable->testing->stable
debian的開發分支叫做unstabel/sid,當需求開發完,並且bug差不多了之后,會froze掉,進入testing分支,這個階段只是修改bug,當bug解完了,進入下一個stable分支。
3 源
3.1 sources.list文件的結構
每個源占一行
deb是二進制包,deb-src是源碼包
deb uri distribution [component1] [component2] [...]
distribution就是suite和release。
二 、debian repository 目錄結構
下面是簡化的Ubuntu源的目錄結構。
NOTE:
所有的兄弟文件夾(父目錄相同的文件夾)都只展開第一個
Pool文件夾的四個子文件夾里,存放的是按照字母順序分類的各個軟件包
每個repo的文件夾會有出入,實際以你使用的為准
重要的文件(夾)和解釋
根目錄下至少有兩個文件夾:dists和pool。dists文件夾里存儲的是關於軟件包的信息數據,包括:文件名稱、大小、位置、校驗碼等。而pool文件下是具體的軟件包存放位置,單獨把文件放在pool文件夾里是為了防止文件的重復。
Release/InReleas
文件位於𝐴𝑅𝑉𝐻𝐼𝑉𝐸𝑅𝑂𝑂𝑇/𝑑𝑖𝑠𝑡𝑠/
DISCTRIBUTION 文件夾內,InRelease文件是內部自認證的,而Release文件需要伴隨Release.gpg文件出現。這個文件包含該發布版(所在的文件夾)的索引文件和對應的hash。內部所列文件的位置是相對該文件的。比如上面的的source.list內容,為了獲取main組件,apt會掃描
http://mirrors.163.com/ubuntu/dists/precise/Release文件得到main/binary-amd64/Packages.gz組合成最終的地址http://mirrors.163.com/ubuntu/dists/precise/main/binary-amd64/Packages.gz。這里面就是precise發布版里main組件的所有軟件索引。
以binary-$arch命名的文件夾里是二進制文件的目錄,源文件的目錄在source文件夾。
Package列出的文件是相對於$ARCHIVE_ROOT的。
Packages 和 Sources目錄是是控制文件,包括索引、翻譯和差異等。
.deb文件是debian的包文件
.dsc是debian的源碼描述文件
.tar是打包的文件
.gz和.bz2是壓縮的文件
Release 文件的內容
上面已經說到,release文件就是索引文件。除了具體文件的hash和位置之外,一般還有其他的信息。
下面是release為文件的截圖,注意:這只截取了開頭的部分,完整的內容請參看實際的文件。
可選項,這些提供了一些repo的基本信息
Description: 描述
Origin:repo的來源
Label:標簽說明
Suite: 套件,就是前面說的distribution
Codename: 發布的代號
決定repo布局的選項
Components: 對應前面的組件
Architectures:系統的架構
功能性的選項
Date:release文件的創建日期
Valid-Util:保質期
MD5Sum, SHA1, SHA256: 指使文件的位置和認證索引文件的真偽,包括:
checksum
文件大小
文件名
其中四個選項是server端必須的:
SHA256
Suite and/or Codename
Architectures
Components
Package文件的內容
文件dists/𝐷𝐼𝑆𝑇/
COMP/binary-$ARCH/Packages是二進制包的索引。這個文件分成很多段,每一段是一個具體文件包的說明,上圖是一個包的完整實例。其中包括的選項有:
Filename:文件名,相對於$ARCHIVE_ROOT的路徑(必須)
Size: 文件大小,byte為單位(必須)
MD5Sum, SHA1,SHA256:加密hash,驗證wfjm(推薦)
Description-md5(可選)
Sources文件的內容
文件𝐷𝐼𝑆𝑇/
COMP/source/Sources被稱為源碼文件索引。它們和Packages文件相似,分為很多段,每一段描述一個源碼文件包。
幾個重要的選項有:
Directory: 文件包所在的目錄
Package: 文件名
version: 版本號
Priority: 優先級,包括source、optional等選項
Files: 包括的文件
Checksums-Sha1(256): 校驗和
apt-get 的流程
apt的工作流程:
apt程序解析source.list,根據后面的uri和發行版得到release的文件的位置
dns解析url的ip,請求release文件,解析組件的release文件和package文件,根據package文件里的內容找到所要裝的文件包,並驗證所有文件的合法性。
如果文件包有依賴(depends),繼續使用上述的方法定位到依賴的安裝包。安裝所有依賴后,再安裝該軟件包。
如果文件包沒有依賴,直接安裝。
定制自己的source.list文件
1.找到repo的根目錄($ARCHIVE_ROOT),就是包含dists和pool目錄的那個目錄,記為
2.打開dists目錄,記下其中的子目錄名稱,找到自己要使用的版本名
3.打開pool目錄,找到里面的組件名稱
4.編寫自己的source.list,格式為deb url codename component。
5.更新一下:sudo apt-get update。