在覺得自己內功已經很強的前提下想參與到linux核心的開發一共有兩個重要的工作要做,如果沒有接觸過核心源碼,本文也可以看看,因為幾乎所有的開原始碼都遵循本文所提到的這種方式。這兩個工作是:
1.用git下載源碼樹,建立自己的開發分支,修改/添加代碼,產生補丁
2.配置一個支援透明純文字的郵件用戶端,用於向maillist發送郵件
第一個工作的配置很簡單,主要就是幾條命令,但是能否修改代碼或者說能否看懂核心取決於多日的修鍊。這裡僅介紹如何環境的配置和使用。
1.安裝git,安裝即可,不需要閱讀其文檔,因為我們不必自己建立工作環境,所有一切都是複製的。
2.複製一個開發環境,這是linus的源碼樹
git-clone http://www.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git (有的公司會封掉不常用的連接埠,因此使用熟知的http是比較合適的)
3.建立一個自己的分支,在master之外建立自己的開發分支my,master作為基準分支,在my分支上所作的修改需要以master為基準產生補丁檔案
git-branch my
4.切換到自己的my分支
git-checkout my
5.對my分支進行隨意的修改,添加新功能等操作,隨意的check in/out,不必擔心損壞原始檔案,不用擔心受到別人的影響,因為所有的操作都是本地進行的,別忘了,這是git,而不是svn/cvs
6.插一個問題:難道不需要更新源碼嗎?我怎樣才知道有新的功能加入或者別人修正了bug,而我需要更新(再來一個git-clone?)
回答:一般是不需要頻繁更新的,這不是svn/cvs,這是git。git的所有正式歸併動作都由專人並且在專有時間進行,經常瀏覽maillist和kernel.org擷取最新訊息,並且一定要熟悉linux核心版本號碼的意義,然後再根據自己的情況更新,不用git-clone,而是git-pull。git和svn/cvs最大的不同我覺得在於其歸併方式,svn/cvs幾乎都是公司內部使用的,鏈路都是區域網路或者起碼也是VPN,每個使用者之間的訪問都是對等的,並且人們很容易訪問到一個中心伺服器,然後都把工作提交到那裡,提交即簽入(check in),而git就不同了,大家所在地的網路環境均不同,個人之間幾乎無法共用資訊(比如無法像區域網路使用者那樣輕易共用一個磁碟等等),中心伺服器的位置以及管理都是問題,因此git的提交方式使用標準email的方式--maillist,提交並不是簽入,簽入由專人進行,簽入之前需要maillist成員的共同檢驗。
7.產生補丁。這個補丁產生為一個純文字檔案,然後你自己添加一些說明之後就可以直接向maillist發送email了,我們在maillist上看到的主題為[patch x/y] XXX:...的郵件內文其實就是補丁加入描述後的文本
git-format-patch master
8.發送email。注意,這個工作可不是簡單的,maillist有嚴格的規定,不光對補丁的品質,就連郵件的格式都有嚴格規定,因此最好是在linux下發送,要知道,kernel hacker那幫傢伙是不用其它系統的,並且他們對linux的感情可能以及到了哲學的高度,如果讓他們看到你的郵件中有windows的影子,...。因此下面主要說一下郵件用戶端的設定。
第二個工作的配置相對複雜一些,不過如果理解郵件協議的話還是很簡單的,而且和第一個工作正好相反,一旦配置好了,以後就可以一勞永逸了,而第一個工作,配置好git和核心源碼樹僅僅是一個開始。郵件系統簡單的說就是兩個大模組,一個是發信,另一個是收信,和日常的平信一樣,普通電子信件對發送沒有什麼要求,你可以隨意填寫一個發送人的郵箱,哪怕就是假的也無所謂,可以隨便填寫一個收件者的郵箱,存不存在也無所謂(《凡卡》中的凡卡茹科夫給爺爺寫信,雖然投遞了,但是爺爺永遠都不會收到),但是對於收信要求就高了,必須認證通過的才能開啟信箱,資訊流動從來就是單向的,說什麼是沒有人管的,但是誰能聽卻必須嚴格控制,資訊接收者必須確保這個資訊是發給自己的。電子郵件系統的這兩大模組由smtp和pop協議完成(還有其它的協議,但是這兩個是最基本和最簡單的),簡單說,smtp協議完成信件從發出至到達收件者郵箱的過程,是一個推的過程,而pop協議完成郵件從收件者郵箱到收件者的過程,是一個拉的過程。類比日常平信,幾乎都是在寫好後直接送到郵局,而收信人卻無法保證信件到達的第一時間被通知到,因此幾乎每座公寓或者學校都有有郵箱,需要每個人自己決定什麼時候開啟郵箱查看是否有郵件,有個前提,郵箱基本都是上鎖的,你必須有鑰匙。
我本人使用的作業系統是linux,郵件用戶端自然也就選擇mutt了。mail用戶端也是可以的,它的配置和使用方式要比mutt簡單的多,比如使用mail發信,很簡單,mail -v 收件者地址,然後互動輸入內容即可
1.建立一個工作目錄
mkdir /root/kernel-hack-mail
mkdir /root/kernel-hack-mail/mail
#mkdir /root/kernel-hack-mail/cert #如果需要認證的話
cd /root/kernel-hack-mail
2.編輯mutt的設定檔
vi mutt.conf
其內容中最重要的是兩方面的內容,發信和收信:
發信--委託給郵件傳輸代理程式(sendmail/msmtp...)(類似委託給郵局)
set sendmail="/usr/bin/msmtp" #指示郵件傳輸代理程式程式
set use_from=yes
set from=mimiran@gmail.com #指示發信人地址,當然也可以在msmtp的設定檔中指示
set envelope_from=yes
收信--自己從郵箱中取
set pop_user=mimiran@gmail.com #自己的郵箱標識
set pop_pass="123456" #自己郵箱的鑰匙
set pop_host=pop://X.Y.Z.K #自己郵箱所在地
3.編輯郵件傳輸代理程式msmtp的設定檔
vi sndmail.conf
其內容是
host X.Y.P.Q #相當於對端的郵局
port 25 #這個都知道
4.運行mutt吧
mutt -F mutt.conf
5.按shift-G可以收郵件,按m可以發郵件,很快捷,並且完全基於文本,編輯郵件時使用的是vim,很快捷地可以使用:.!cat命令將文字檔作為郵件內文。反正有很多快速鍵,UI上都說明了,下面是一個剛進入mutt後的介面頂部:
q:Quit d:Del u:Undel s:Save m:Mail r:Reply g:Group ?:Help
按下m鍵,開始發送吧(個人認為help沒有用,自己摸索更好些,再說好的軟體根本不需要help)
最後,git和email的結合,完美地將互連網組織成了一個巨型Team Dev