kernel make deb-pkg分析記錄

target是 deb-pkg倦淀,在文件Make.package

   71 PHONY += deb-pkg
   72 deb-pkg:
   73     $(MAKE) clean
   74     $(CONFIG_SHELL) $(srctree)/scripts/package/mkdebian
   75     $(call cmd,src_tar,$(KDEB_SOURCENAME))
   76     origversion=$$(dpkg-parsechangelog -SVersion |sed 's/-[^-]*$$//');\
   77         mv $(KDEB_SOURCENAME).tar.gz ../$(KDEB_SOURCENAME)_$${origversion}.orig.tar.gz
   78     +dpkg-buildpackage -r$(KBUILD_PKG_ROOTCMD) -a$$(cat debian/arch) $(DPKG_FLAGS) -i.git -us -uc

展開

  • make clean
  • sh scripts/package/mkdebian 執(zhí)行這個腳本
  • 調用 cmd_src_tar $(KDEB_SOURCENAME)
  • origversion=$$(dpkg-parsechangelog -SVersion |sed 's/-[^-]*$$//'); mv $(KDEB_SOURCENAME).tar.gz ../$(KDEB_SOURCENAME)_$${origversion}.orig.tar.gz
  • dpkg-buildpackage -r$(KBUILD_PKG_ROOTCMD) -a$$(cat debian/arch) $(DPKG_FLAGS) -i.git -us -uc 打包

mkdebian

code太長不貼~

  • 定義變量:
    • version
    • packageversion
    • revision
    • sourcename
    • packagename = linux-image-$version
    • kernel_headers_packagename=linux-headers-$version
    • dbg_packagename=$packagename-dbg
    • debarch
  • mkdir -p debian/source/
  • echo "1.0" > debian/source/format
  • echo $debarch > debian/arch
  • cat <<EOF > debian/changelog 填充簡單內容
  • cat <<EOF > debian/copyright 無所謂了
  • cat <<EOF > debian/control
    173 Source: $sourcename
    174 Section: kernel
    175 Priority: optional
    176 Maintainer: $maintainer
    177 Build-Depends: bc, rsync, kmod, cpio, bison, flex | flex:native $extra_build_depends
    178 Homepage: http://www.kernel.org/
    179 
    180 Package: $packagename
    181 Architecture: $debarch
    182 Description: Linux kernel, version $version
    183  This package contains the Linux kernel, modules and corresponding other
    184  files, version: $version.
    185 
    186 Package: $kernel_headers_packagename
    187 Architecture: $debarch
    188 Description: Linux kernel headers for $version on $debarch
    189  This package provides kernel header files for $version on $debarch
    190  .
    191  This is useful for people who need to build external modules
    192 
    193 Package: linux-libc-dev
    194 Section: devel
    195 Provides: linux-kernel-headers
    196 Architecture: $debarch
    197 Description: Linux support headers for userspace development
    198  This package provides userspaces headers from the Linux kernel.  These headers
    199  are used by the installed headers for GNU glibc and other system libraries.
    200 Multi-Arch: same
    201 
    202 Package: $dbg_packagename
    203 Section: debug
    204 Architecture: $debarch
    205 Description: Linux kernel debugging symbols for $version
    206  This package will come in handy if you need to debug the kernel. It provides
    207  all the necessary debug symbols for the kernel and its modules.
    
    這里包的數(shù)量定了。
  • cat <<EOF > debian/rules 創(chuàng)建這個文件并賦予執(zhí)行權限
    211 #!$(command -v $MAKE) -f
    212 
    213 srctree ?= .
    214 
    215 build:
    216     \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \
    217     KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile
    218 
    219 binary-arch:
    220     \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \                                                                                                                                                            
    221     KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile intdeb-pkg
    222 
    223 clean:
    224     rm -rf debian/*tmp debian/files
    225     \$(MAKE) clean
    226 
    227 binary: binary-arch
    
    有3個target,默認target是編譯內核。

cmd_src_tar $(KDEB_SOURCENAME)

  • KDEB_SOURCENAME ?= linux-$(KERNELRELEASE)
  • $(srctree)/scripts/setlocalversion --save-scmversion;
    從git等代碼管理工具中取版本號(大概這個意思)
  • tar -I $(KGZIP) -c $(RCS_TAR_IGNORE) -f $(2).tar.gz --transform 's:^:$(2)/:S' (TAR_CONTENT) $(3);
    • KGZIP = gzip
    • TAR_CONTENT := $(KBUILD_ALLDIRS) .config .scmversion Makefile
    • export KBUILD_ALLDIRS := $(sort $(filter-out arch/%,$(vmlinux-alldirs)) LICENSES arch include scripts tools)
    • export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn --exclude CVS --exclude .pc --exclude .hg --exclude .git
    • 總結:將命令展開,就是將linux源碼打成 tar.gz包底燎。

origversion=$$(dpkg-parsechangelog -SVersion |sed 's/-[^-]*$$//'); mv $(KDEB_SOURCENAME).tar.gz ../$(KDEB_SOURCENAME)_$${origversion}.orig.tar.gz

重命名源碼包

dpkg-buildpackage -r$(KBUILD_PKG_ROOTCMD) -a$$(cat debian/arch) $(DPKG_FLAGS) -i.git -us -uc

  • 編譯
    上面生成的debian/rule文件中默認target就是內核編譯
  • 打包

dpkg-buildpackage

dpkg-buildpackage 流程參考這里
主要流程就是 : clean -----> build -----> build_binary ------>簽名 ------> 打包等弹砚。

上面步驟生成的debian/rules中包含了 build build_binary步驟双仍。

build

215 build:
216     \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \
217     KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile

這個就是直接開始內核編譯了。

build-binary

219 binary-arch:
220     \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \                                                                                                                                                            
221     KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile intdeb-pkg

intdeb-pkg這個target在文件scripts/Makefile.package中:

   85 PHONY += intdeb-pkg
   86 intdeb-pkg:                                                                                                                                                                                                     
   87     +$(CONFIG_SHELL) $(srctree)/scripts/package/builddeb

builddeb這個代碼較長桌吃,關鍵流程如下:

  • 定義變量朱沃,包含包名、安裝位置等關鍵信息
     49 version=$KERNELRELEASE
     50 tmpdir="$objtree/debian/tmp"
     51 kernel_headers_dir="$objtree/debian/hdrtmp"
     52 libc_headers_dir="$objtree/debian/headertmp"
     53 dbg_dir="$objtree/debian/dbgtmp"
     54 packagename=linux-image-$version
     55 kernel_headers_packagename=linux-headers-$version
     56 libc_headers_packagename=linux-libc-dev
     57 dbg_packagename=$packagename-dbg
    
  • 安裝System.map內核配置文件
       93     cp System.map "$tmpdir/boot/System.map-$version"
       94     cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version"
    
  • 安裝內核鏡像
     96 cp "$($MAKE -s -f $srctree/Makefile image_name)" "$tmpdir/$installed_image_path"
    
  • 安裝模塊
      105 if is_enabled CONFIG_MODULES; then
    106     INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_install
    107     rm -f "$tmpdir/lib/modules/$version/build"
    108     rm -f "$tmpdir/lib/modules/$version/source"
    109     if [ "$ARCH" = "um" ] ; then
    110         mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
    111         rmdir "$tmpdir/lib/modules/$version"
    112     fi
    113     if [ -n "$BUILD_DEBUG" ] ; then
    114         for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do
    115             module=lib/modules/$module
    116             mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module)
    117             # only keep debug symbols in the debug file
    118             $OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module
    119             # strip original module from debug symbols
    120             $OBJCOPY --strip-debug $tmpdir/$module
    121             # then add a link to those
    122             $OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module
    123         done
    124 
    125         # resign stripped modules
    126         if is_enabled CONFIG_MODULE_SIG_ALL; then
    127             INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_sign
    128         fi
    129     fi
    130 fi
    
  • 安裝其他文件
      167 # Build kernel header package
    168 (cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles"
    169 (cd $srctree; find arch/*/include include scripts -type f -o -type l) >> "$objtree/debian/hdrsrcfiles"
    170 (cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles"
    171 (cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles"
    172 if is_enabled CONFIG_STACK_VALIDATION; then
    173     (cd $objtree; find tools/objtool -type f -executable) >> "$objtree/debian/hdrobjfiles"
    174 fi
    175 (cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles"
    176 if is_enabled CONFIG_GCC_PLUGINS; then
    177     (cd $objtree; find scripts/gcc-plugins -name \*.so -o -name gcc-common.h) >> "$objtree/debian/hdrobjfiles"
    178 fi
    179 destdir=$kernel_headers_dir/usr/src/linux-headers-$version
    180 mkdir -p "$destdir"
    181 (cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -)
    182 (cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -)
    183 (cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be
    184 ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build"
    185 rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles"
    
  • 打包
    • 頭文件 create_package "$kernel_headers_packagename" "$kernel_headers_dir"
    • libc頭文件 create_package "$libc_headers_packagename" "$libc_headers_dir"
    • 內核 create_package "$packagename" "$tmpdir"
    • debug包
          194 if [ -n "$BUILD_DEBUG" ] ; then
          195     # Build debug package
          196     # Different tools want the image in different locations
          197     # perf
          198     mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/
          199     cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/
          200     # systemtap
          201     mkdir -p $dbg_dir/usr/lib/debug/boot/
          202     ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version
          203     # kdump-tools
          204     ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version
          205     create_package "$dbg_packagename" "$dbg_dir"
          206 fi
      

總結

完全清楚了茅诱。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末逗物,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瑟俭,更是在濱河造成了極大的恐慌敬察,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尔当,死亡現(xiàn)場離奇詭異莲祸,居然都是意外死亡,警方通過查閱死者的電腦和手機椭迎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門锐帜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人畜号,你說我怎么就攤上這事缴阎。” “怎么了简软?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵蛮拔,是天一觀的道長。 經(jīng)常有香客問我痹升,道長建炫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任疼蛾,我火速辦了婚禮肛跌,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己衍慎,他們只是感情好转唉,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著稳捆,像睡著了一般赠法。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乔夯,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天砖织,我揣著相機與錄音,去河邊找鬼驯嘱。 笑死镶苞,一個胖子當著我的面吹牛,可吹牛的內容都是我干的鞠评。 我是一名探鬼主播茂蚓,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼剃幌!你這毒婦竟也來了聋涨?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤负乡,失蹤者是張志新(化名)和其女友劉穎牍白,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抖棘,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡茂腥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了切省。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片最岗。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖朝捆,靈堂內的尸體忽然破棺而出般渡,到底是詐尸還是另有隱情,我是刑警寧澤芙盘,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布驯用,位于F島的核電站,受9級特大地震影響儒老,放射性物質發(fā)生泄漏蝴乔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一贷盲、第九天 我趴在偏房一處隱蔽的房頂上張望淘这。 院中可真熱鬧剥扣,春花似錦巩剖、人聲如沸铝穷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽曙聂。三九已至,卻和暖如春鞠鲜,著一層夾襖步出監(jiān)牢的瞬間宁脊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工贤姆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留榆苞,地道東北人。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓霞捡,卻偏偏與公主長得像坐漏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子碧信,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內容