如何獲取linux下命令源碼?
命令的源碼是一個(gè)軟件包為單元的,放在一個(gè)軟件包的源碼中。若要下載一個(gè)命令的源碼,就要把這個(gè)命令所屬的軟件包的源碼都下載下來。命令的源碼就在下載的源碼的相關(guān)文件夾內(nèi)。一般是src文件夾,對應(yīng)的主文件名稱為cmd.c,當(dāng)中cmd為詳細(xì)的命令,如ls命令的主程序文件為ls.c。
因?yàn)樵诓煌腖inux發(fā)行版上。源碼的獲取方法并不同樣。所以以下以Ubuntu和CentOS這兩種經(jīng)常使用的Linux發(fā)行版為樣例進(jìn)行說明。
1、Ubuntu中系統(tǒng)命令源碼的獲取方法
以32位Ubuntu14.04下,獲取ls命令的源碼為例,能夠使用例如以下的方法下載源碼:
1)使用which命令查看ls命令的位置,例如以下:
which ls # 輸出:/bin/ls
2)使用dpkg命令查詢ls命令所屬的包。例如以下:
dpkg -S /bin/ls # 輸出:coreutils: /bin/ls
3)使用apt-get命令來下載ls命令所在的包的源碼。例如以下:
apt-get source coreutils
注:
1)在使用dpkg時(shí)。若出現(xiàn)錯(cuò)誤。能夠使用sudo命令使其以root權(quán)限運(yùn)行。
2)使用apt-get source下載的源碼保存到當(dāng)前文件夾下。
。此外,當(dāng)我們知道了命令所屬的包后,也能夠到對應(yīng)的官方站點(diǎn)下載。
2、CentOS中系統(tǒng)命令源碼的獲取方法
以32位CentOS6.6下,獲取ls命令的源碼為例,能夠使用例如以下的方法下載源碼:
1)配置源碼的源
在CentOS中,源的配置文件為:/etc/yum.repos.d/CentOS-Base.repo,改動(dòng)該文件須要root權(quán)限。
打開該文件,查看該文件的內(nèi)容,在本人的機(jī)子上,該文件的內(nèi)容例如以下:
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client. You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?
release=$releasever&arch=$basearch&repo=extras
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib
#baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
該文件里有兩個(gè)變量:releasever和basearch。分別表示release版本號(hào)和分支,如本人的機(jī)子上,這兩個(gè)值分別為6和i386。注意。releasever并不會(huì)細(xì)分為次級(jí)版本號(hào)。即不會(huì)是6.6之類的。
從該文件的內(nèi)容能夠知道,該文件共同擁有5個(gè)節(jié)。也就是說本人的機(jī)子的軟件來源有5處,分別為base、updates、extras、centosplus和contrib。所以僅僅須要為例如以下的5處軟件源指定其源碼的源就可以。在文件的末尾加上例如以下的內(nèi)容:
[base-src]
name=CentOS-$releasever - Base src
baseurl=http://vault.centos.org/6.6/os/Source/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
[updates-src]
name=CentOS-$releasever - Updates src-centos
baseurl=http://vault.centos.org/6.6/updates/Source/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
[extras-src]
name=CentOS-$releasever - Extras src-centos
baseurl=http://vault.centos.org/6.6/extras/Source/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
[centosplus-src]
name=CentOS-$releasever - Plus src-centos
baseurl=http://vault.centos.org/6.6/centosplus/Source/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
[contrib-src]
name=CentOS-$releasever - Contrib src-centos
baseurl=http://vault.centos.org/6.6/contrib/Soruce/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
因?yàn)椴煌陌姹咎?hào)設(shè)置會(huì)有所不同,所以其設(shè)置會(huì)有所不同,方法可總結(jié)為例如以下:
(1)gpgkey與該文件里已有的節(jié)的gpgkey同樣
(2)為了確認(rèn)文件的存在和情況,能夠打開站點(diǎn)http://vault.centos.org/查看詳細(xì)的情況,再依據(jù)詳細(xì)的情況來填寫
(3)設(shè)置baseurl時(shí)須要依據(jù)自己的系統(tǒng)的版本號(hào)來設(shè)置,如本人的機(jī)子為CentOS-6.6,則在設(shè)置時(shí),相關(guān)的參數(shù)就設(shè)置為6.6。即http://vault.centos.org/后接的子路徑為6.6。
該文件的作用是為yum其及相關(guān)工作的下載提供一個(gè)源。如在使用yumdownloader(以下會(huì)講到)下載源碼時(shí)。會(huì)發(fā)生例如以下動(dòng)作:
(1)下載$baseurl/repodata/repomd.xml文件。若該repomd.xml文件比系統(tǒng)中的新。更新系統(tǒng)中的對應(yīng)的repomd.xml
(2)下載$baseurl/SPackages/中的對應(yīng)的源碼rpm包。
2)使用which命令查看ls命令的位置,例如以下:
which ls
# 輸出:/bin/ls
3)使用rpm命令查詢ls命令所屬的包,例如以下:
rpm -qf /bin/ls
# 輸出:coreutils-8.4-37.el6.i686
4)yumdownloader是一個(gè)從RPM源下載RPM的程序,能夠使用yumdownloader命令安裝源碼。例如以下:
yumdownloader --source coreutils-8.4-37.el6.i686
注:
(1)若yumdownloader命令沒有安裝,則能夠使用此命令安裝:yum install yum-utils。
(2)下載的文件在當(dāng)前文件夾下。能夠使用參數(shù)--destdir指定下載到哪一個(gè)文件夾。
5)使用yumdownloader下載到的是一個(gè)安裝包文件rpm,能夠使用例如以下的命令查詢r(jià)pm中的tar文件:
rpm -qpl coreutils-8.4-37.el6.src.rpm | grep tar
# 輸出:coreutils-8.4.tar.xz
6)使用rpm2cpio命令將rpm包文件轉(zhuǎn)換成cpio歸檔文件,再使用cpio命令,從cpio歸檔文件復(fù)制提取出一個(gè)歸檔文件。出例如以下:
rpm2cpio coreutils-8.4-37.el6.src.rpm | cpio -idv coreutils-8.4.tar.xz
# 輸出:
# coreutils-8.4.tar.xz
# 9561 blocks
cpio的man解釋為:cpio copies files into an archive
-i:與--extract等同。提取之意
-d:與--make-directories等同,當(dāng)有須要時(shí)創(chuàng)建一個(gè)載入文件夾
-v:列出文件的處理過程
7)使用tar命令對coreutils-8.4.tar.xz壓縮包進(jìn)行解壓縮,例如以下:
tar -xvf ./coreutils-8.4.tar.xz
至此,命令的源碼獲取完畢。