1,Debian 的ISO鏡像
  從Debian官方網站或其鏡像站點的FTP服務器上取得Debian的安裝程序盤(businesscard.iso,大約幾十M)和網絡安裝盤(也就是基本系統安裝盤netinst.iso,一百多M)的ISO鏡像,分別將其解壓到(好像是用tar命令,具體記不清了)不同目錄中(如 /home/installer和/home/base)
  2,配置網絡
  在一部機器上安裝Debian基本系統--用netinst.iso,配置好網絡。配置方法因聯網方式不同而不同,這裏我們給出最常用的ADSL配置方法:安裝系統時拔掉網線,安裝程序提示自動配置網絡失敗,確定後選暫不配置網絡,也可以連着網安裝時自動配置網絡成功後選返回再選暫不配置。安裝配置好並進入系統後以root用户身份運行pppoeconf命令,按提示操作,結束後用pon dsl-provider 命令加載驅動程序模塊並撥號上網,poff命令可斷開與網絡的連接。
  3,獲得deb包。
  聯網並配置基本系統的源(Debian獨特的軟件包管理機制,提供軟件包池的服務器叫做源,其實是一個../pool目錄)並下載需要的包。聯網後運行 apt-setup命令並按提示操作設置源,apt-get install 命令從源下載並安裝軟件包,加-d參數是隻下載不安裝,這裏我們列舉一些必要的apt和dpkg命令
  apt是對dpkg前端的封裝,能自動滿足依賴關係。Debian的apt先進的包管理機制也是我們選它的憑據之一。但Debian非常追求穩定致使軟件版本不是最新,我們也不追求新花樣,況且新的軟件要經過一段時間beta才能投入生產。注意在這裏往往是試驗很多次的地方,需要重裝好多次基本系統,因此建議用一張可引導軟盤或光盤運行tar命令來備份整個系統。因為要試驗很多次才能確定我們真正需要的包,建議用CVS(或RCS)管理我們每次下載的包(CVS不僅能管理文本文件,如源代碼,還能管理二進制文件)為了達到所見即所得的效果還可以直接安裝下載的包而不加-d參數。這裏暫沒有給出CVS命令及參數,請具體查詢CVS使用手冊。但我們都知道對源碼文件管理的命令通過添加參數-KB便可實現對二進制文件的管理。
  cvs 命令格式如下:
  cvs [ global_options ] command [ command_options ] [ command_args ]
  我們篩選的deb包現列如下:
  桌面環境 gnome-desktop-envioroment;
  控制枱下的中文環境 zhcon;
  編譯器 automake,autorun,m4,binutils,buildessential,debhelper,cvs,rcs,make、gcc、g++,subversion;
  xserver和字體 xwindown-system-core、xfonts-100dpi、xfonts-75dpi、xlibs;
  中文環境 zh-autoconvert、xfonts-intl-chinese,常用字體以下有介紹;
  圖片相關 gimp;
  郵件 evolution;
  文檔處理 gedit;
  APT前端 synaptic;
  瀏覽器 mozilla-psm、mozilla-firefox、mozilla-firefox-gnome- support、mozilla-firefox- locale-zh-cn;
  多媒體 tome;
  選Gnome桌面環境是因為它結構更好,更穩定,穩重樸實,效率更高,各大廠商都支持它。我們選擇各軟件的原因是經過多方的比較,可以説他們是各方面的佼佼者。通過使用很容易發現他們均功能強大,各方面支持良好。
  4,中文化。
  Debian支持中文不是很好,因此我們要自己支持,除了安裝ttf-arphic-bkai00mp、ttf-arphic-bsmi00lp、 ttf-arphic-gkai00mp、ttf-arphic-gbsn00lp幾個字體包以外還要安裝並設置通用輸入法平台SCIM,安裝SCIM需要至少安裝scim、scim-chinese等幾個包,配置它要在/etc/X11/下寫一配置文件。如果你想加入非官方的字體,比如你從方正買的字體,我建議打成deb包安裝,當然bin也行,只是安裝程序多寫一些罷了。以上我們的deb包準備全了,別忘了給他們備個份。在本次安裝盤的定製過程中,我們採用了較簡單的方法完成了中文環境的設置--均通過對base-config的修改來一次實現(就是base-config那個包的源碼裏有予配製文件,改一下,編譯了替換tar出來的網絡安裝盤裏那個)。
  5,修改基本系統。
  把我們第一步解壓到/home/base下的基本系統進行刪減(Debian的基本系統仍然是可修改的。注意:別動udeb包,那是安裝程序組件!)將精選後的deb包放到某一目錄下,如/home/basesys。這要憑經驗進行,弄錯了會造成系統不穩定,因此這一步是可選的。完成這一步後我們所需的 deb包已準備齊了。
  6,建立軟件池。
  從/var/cache/apt/archives/和/home/basesys (基本系統的)下拷出我們的包放在同一目錄下,如/home/debs-src。並把我們自己的包(包括自己編譯,下載非官方的....)一併放入。使用 apt-move命令將/home/debs-src/下的deb包move到另一目錄如/home/debs-dst/下。接着運行腳本1(參看附錄 1),將/home/debs-dst/下的deb包全部移到/home/base/pool/下。
  7,獲得重載文件。
  下載/debian/indices/overrides..*.gz到/home/base/pool目錄的同級目錄下的indices(/home/deb/indices),解壓縮overrides文件,並保有原壓縮文件。
  8,生成Packages.gz 和 Release :
  建腳本apt.conf、customcd-di.conf、customcd.conf且均存放在custom中
  在含有pool 和 dists文件的目錄下運行以下命令:
 

apt-ftparchive -c custom/apt.conf generate custom/customcd-di.conf

  apt-ftparchive -c custom/apt.conf release dists/sarge >dists/sarge/Release

  apt-ftparchive -c custom/apt.conf generate custom/customcd.conf


  腳本apt.conf、customcd-di.conf、customcd.conf請參看附錄1。
  9,md5校驗:
 

cd /home/deb/

  mv md5sum.txt md5sum.old

  grep -v -e " f1.txt$" md5sum.old >md5sum.txt

  md5sum isolinux/f1.txt >> md5sum.txt

  10,生成iso:

  cd /home/base/

  mkisofs -T -J -R -no-emul-boot -boot-info-table -b isolinux/isolinux.bin -c boot.cat -o debian.iso /home/base/


  11,自己修改的其他的deb包過程:tasksel,base-config:
  Deb包的製作方法,請參看附錄3。
  Tasksel:
  download tasksel_**.tar.gz( 注意版本),解壓!我們要求在系統安裝過程中只需我們選擇“中文桌面”安裝程序就可自動安裝所有包。進入tasks,修改文件:desktop(修改後的 desktop文件參看附錄4)。由於我們只希望桌面環境是GNOME,所以還要修改文件chinese-s、chinese-s-desktop,去掉其中的KDE部分。
  打包:
 

dpkg-buildpackage -rfakeroot;

  base-config:

  download base-config_**.tar.gz( 注意版本),解壓後我們可看一下其中的目錄:主要目錄有debian、lib,我們可任選其中的文件完成我們的工作如:postinst、finish等。

  這裏我們只是為滿足需求,所以並沒有按照官方的做法依次進行。比如修改debian什麼的,我們只選擇了base-config最後運行部分:finish文件,並在其中加入了以下代碼:

  #apt-get install fonts

  apt-get install ttf-arphic-bkai00mp

  apt-get install ttf-arphic-bsmi00lp

  #90im-scim

  echo -e "export LANG=zh_CN" "\nexport XMODIFIERS=@im=SCIM" "\nexport GTK_IM_MODULE=scim" "\nscim -d" >/etc/X11/Xsession.d/90im-scim


  通過以上修改中文環境就可在系統運行時配製好了。
  打包:
  dpkg-buildpackage -rfakeroot;
  不要忘了替換!
  12,尾聲。
  我們想開發出的是嵌入式操作系統,而現在我們只完成了編譯環境的設置。路還很長,我們做的還遠遠不夠,許多工作在等我們,我們將不懈地努力。Linux世界是自由的世界,任何想圓夢的人都可在這裏找到圓夢之路。謹以此文獻給那些想圓夢的人,希望她能給你們帶來一些幫助。
  
  附錄0:
  參考資料:
  Debian APT HOWTO
  Debian GNU/Linux FAQ
  DebianInstallerBuild
  cdd
  Hacking the debian-installer ISO image
  《Red Hat Linux 安全與優化》
  Debian 的官方網站資料
  附錄1
  腳本1
  

#!/bin/bash

  

  function print_usage {

  echo

  echo "copy-new-debs-to-pool [--move] [--keep-old] dir-to-copy add-to-dir"

  echo

  echo "paths must be absolute"

  echo "and must point to the directory in which the pool subdirectory resides"

  echo "The pool directory must have main contrib and non-free subdirectories"

  echo

  }

  

  if [ "$1" = "--move" ] ; then

  MOVE=1

  if [ "$2" = "--keep-old" ] ; then

  KEEP=1

  else

  KEEP=0

  fi

  else

  MOVE=0

  if [ "$1" = "--keep-old" ] ; then

  KEEP=1

  else

  KEEP=0

  fi

  fi

  

  if [ -z "$1" ]; then

  print_usage

  exit

  fi

  

  if [ -z "$2" ]; then

  print_usage

  exit

  fi

  

  if [ $MOVE -eq 1 -a -z "$3" ]; then

  print_usage

  exit

  else

  if [ $KEEP -eq 1 -a -z "$3" ]; then

  print_usage

  exit

  fi

  fi

  

  if [ $MOVE -eq 1 -a $KEEP -eq 1 -a -z "$4" ]; then

  print_usage

  exit

  fi

  

  if [ $MOVE -eq 0 -a $KEEP -eq 0 ]; then

  RC1DIR=$1

  RC2DIR=$2

  else

  if [ $MOVE -eq 1 -a $KEEP -eq 1 ]; then

  RC1DIR=$3

  RC2DIR=$4

  else

  RC1DIR=$2

  RC2DIR=$3

  fi

  fi

  

  echo "Copying from $RC1DIR to $RC2DIR"

  

  TMPFILE=`tempfile`

  

  cd $RC1DIR

  find pool -type f | sort >$TMPFILE

  rc1base=$RC1DIR

  rc2base=$RC2DIR

  cd -

  for rc1file in `cat $TMPFILE`; do

  pkgfullname=`basename $rc1file`

  pkgname=`echo $pkgfullname | cut -f1 -d_`

  rc1ver=`echo $pkgfullname | cut -f2 -d_`

  pooldir=`dirname $rc1file`

  pkgend=`echo $pkgfullname | cut -f3 -d_`

  rc2file=`ls $rc2base/$pooldir/$pkgname\_*\_$pkgend 2>/dev/null`

  if [ "$rc2file" ]; then

  rc2maxver="!!!!!!!!!!!!!!!!!"

  rc2maxfile="!!!!!!!!!!!!!!!!"

  for rc2match in $rc2file; do

  rc2pkgfullname=`basename $rc2match`

  rc2ver=`echo $rc2pkgfullname | cut -f2 -d_`

  if [ "$rc2ver" ">" "$rc2maxver" ];

  then rc2maxver=$rc2ver

  rc2maxfile=$rc2match

  fi

  done

  rc2file=$rc2maxfile

  if [ $rc1ver '>' $rc2maxver ] ; then

  echo "Copying $rc1file newer than $rc2file"

  if [ $MOVE -eq 1 ] ; then

  mv -f $rc1base/$rc1file `dirname $rc2base/$rc1file`

  if [ $KEEP -eq 1 ]; then

  echo "Not removing obsolete $rc2file"

  else

  echo "Removing obsolete $rc2file"

  rm -f $rc2base/$rc2file

  fi

  else

  cp $rc1base/$rc1file `dirname $rc2base/$rc1file`

  if [ $KEEP -eq 1 ]; then

  echo "Not removing obsolete $rc2file"

  else

  rm -f $rc2base/$rc2file

  fi

  fi

  continue

  fi

  else

  echo "Copying $pkgname not in $RC2DIR"

  install -d $RC2DIR/`dirname $rc1file`

  if [ $MOVE -eq 1 ]; then

  mv -f $RC1DIR/$rc1file `dirname $RC2DIR/$rc1file`

  else

  cp $RC1DIR/$rc1file `dirname $RC2DIR/$rc1file`

  fi

  fi

  done

  

  rm -f $TMPFILE

  

  popd

  apt.conf:

  

  APT {

  FTPArchive {

  Release {

  Origin "debian-cd";

  Label "yoursarge";

  Suite "testing";

  Version "0.1";

  Codename "sarge";

  Architectures "i386";

  Components "main contrib";

  Description "Your Sarge CD Set";

  };

  };

  };

  customcd-di.conf:

  

  Dir {

  ArchiveDir "/home/cdrom";

  OverrideDir "indices";

  CacheDir "/tmp";

  };

  

  TreeDefault {

  Directory "pool/";

  };

  

  BinDirectory "pool/main" {

  Packages "dists/sarge/main/debian-installer/binary-i386/Packages";

  BinOverride "override.sarge.main";

  ExtraOverride "override.sarge.extra.main";

  };

  

  Default {

  Packages {

  Extensions ".udeb";

  Compress ". gzip";

  };

  

  Contents {

  Compress "gzip";

  };

  };

  

  customcd.conf:

  

  Dir {

  ArchiveDir "/home/cdrom";

  OverrideDir "indices";

  CacheDir "/tmp";

  };

  

  TreeDefault {

  Directory "pool/";

  };

  

  BinDirectory "pool/main" {

  Packages "dists/sarge/main/binary-i386/Packages";

  BinOverride "override.sarge.main";

  ExtraOverride "override.sarge.extra.main";

  };

  

  BinDirectory "pool/contrib" {

  Packages "dists/sarge/contrib/binary-i386/Packages";

  BinOverride "override.sarge.contrib";

  ExtraOverride "override.sarge.extra.contrib";

  };

  

  BinDirectory "pool/non-free" {

  Packages "dists/sarge/non-free/binary-i386/Packages";

  BinOverride "override.sarge.non-free";

  ExtraOverride "override.sarge.extra.non-free";

  };

  

  Default {

  Packages {

  Extensions ".deb";

  Compress ". gzip";

  };

  

  Contents {

  Compress "gzip";

  };

  };

  

  

  腳本apt.conf:

  APT {

  FTPArchive {

  Release {

  Origin "debian-cd";

  Label "yoursarge";

  Suite "testing";

  Version "0.1";

  Codename "sarge";

  Architectures "i386";

  Components "main contrib";

  Description "Your Sarge CD Set";

  };

  };

  };

  

  腳本customcd-di.conf:

  Dir {

  ArchiveDir "/debian";

  OverrideDir "indices";

  CacheDir "/tmp";

  };

  

  TreeDefault {

  Directory "pool/";

  };

  

  BinDirectory "pool/main" {

  Packages "dists/sarge/main/debian-installer/binary-i386/Packages";

  BinOverride "override.sarge.main";

  ExtraOverride "override.sarge.extra.main";

  };

  

  Default {

  Packages {

  Extensions ".udeb";

  Compress ". gzip";

  };

  

  Contents {

  Compress "gzip";

  };

  };

  

  腳本customcd.conf :

  Dir {

  ArchiveDir "/debian";

  OverrideDir "indices";

  CacheDir "/tmp";

  };

  

  TreeDefault {

  Directory "pool/";

  };

  

  BinDirectory "pool/main" {

  Packages "dists/sarge/main/binary-i386/Packages";

  BinOverride "override.sarge.main";

  ExtraOverride "override.sarge.extra.main";

  };

  

  BinDirectory "pool/contrib" {

  Packages "dists/sarge/contrib/binary-i386/Packages";

  BinOverride "override.sarge.contrib";

  ExtraOverride "override.sarge.extra.contrib";

  };

  

  BinDirectory "pool/non-free" {

  Packages "dists/sarge/non-free/binary-i386/Packages";

  BinOverride "override.sarge.non-free";

  ExtraOverride "override.sarge.extra.non-free";

  };

  

  Default {

  Packages {

  Extensions ".deb";

  Compress ". gzip";

  };

  

  Contents {

  Compress "gzip";

  };

  };


  
  
  附錄2
  deb包的製作:
  首先請準備好以下工具:
  dpkg、dpkg-deb、 dpkg-dev、dh-make、debhelper、devscripts、fakeroot、lintian
  建立方法1(重編譯Debian包好的source包);
  apt-get source package;
  cd package-version;
  cd debian;
  編輯 rules;
  然後退回原目錄dpkg-buildpackage -rfakeroot;
  建立方法2(編譯非Debian包好的source包);
  獲取源碼後(tar.gz)untar;
  改目錄為package-version;
  cd package-version;
  dh-make;
  cd debian;
  編輯 rules;
  然後退回原目錄dpkg-buildpackage -rfakeroot;
  
  附錄3
  desktop文件:
 

Task: desktop

  Relevance: 8

  Section: user

  Description: Desktop environment

  This task provides basic "desktop" software, including a variety

  of session managers, file managers and web browsers. It incorporates

  both the GNOME and KDE desktops, and provides a display manager

  which lets the user choose between the two.

  Key:

  x-window-system-core

  # The basics of gnome, not the whole thing.

  gnome-desktop-environment

  # This could probably be reduced more.

  Packages:

  gdm

  gnome

  planner

  totem

  rhythmbox

  # gnome whines if there's no xscreensaver

  xscreensaver

  # a screen saver does silly things without this

  fortune-mod

  menu

  mozilla-firefox

  mozilla-psm

  mozilla-firefox-gnome- support

  mozilla-firefox- locale-zh-cn

  gftp

  gaim

  evolution

  # mozilla printing

  gimp

  # openoffice is the best word processor / office suite at the moment

  #openoffice.org-bin

  # openoffice.org-l10n-zh-cn

  # commented out for reason explained in changelog 2.11

  # openoffice.org

  # openoffice.org-help-en

  # openoffice.org-help-zh-cn

  myspell-en-us

  myspell-en-gb

  totem

  jfbterm

  zhcon

  language-env

  zh-autoconvert

  debian-zh-faq-s

  manpages-zh

  doc-linux-zh-s

  fortune-zh

  rxvt-ml

  mlterm

  rxvt-unicode-ml

  cpanel

  scim-chinese

  scim-tables-zh

  chinput

  stardic

  x-ttcidfont-conf

  xfonts-intl-chinese

  xfonts-intl-chinese-big

  ttf-arphic-gbsn00lp

  ttf-arphic-gkai00mp

  unifont

  bg5ps

  vim

  less

  subversion

  gcc

  debhelper

  build-essential