Ubuntu Linux:定製Ubuntu安裝CD(轉)

BSDLite發表於2007-08-15
Ubuntu Linux:定製Ubuntu安裝CD(轉)[@more@]定製Ubuntu CD的過程並不複雜,但是她有一些繁瑣和過分的講究。我對這過程的所知並不完美,因此,希望有人可以作適當修改。

安裝CD有三個主要部分:

啟動引導器:(如ISOLINUX用於amd64/i386,yaboot用於powerpc)開機時核心映象的選擇與配置;

Debian安裝程式(d-i):其實就是一個特殊的微Ubuntu系統;

Debian軟體庫:放在"pool"和"dists"目錄,它將佔據光碟的大部分空間。

建立這個新的CD就包涵了這三部分的修改。

用"Presseed"檔案修改安裝行為

當CD啟動時,Linux核心就被裝載且開始安裝任務。安裝程式的行為可以用一個"preseed"檔案來修改,這些檔案給Debian安裝程式(d-i)回答如何配置軟體包或其它相關的問題。如果您仔細看你的安裝CD,您會找到這些選項(例如server,expert,oem)都有對應的preseed檔案。

所以,假設您想在一群的相同配置電腦上安裝breezy,並且您已經知道安裝時必問問題的答案(您所在的國家和時區,您你的鍵盤佈局,您的網路設定,您需要如何分割槽等等)。您可以透過"preseed"在一簡單的配置檔案裡回答這些問題.

改變isolinux.cfg確定您的preseed

首先,您必須告訴"d-i"找到您的preseed檔案的正確位置。在標準的光碟上有個/preseed目錄;您可以把您的這些檔案放這裡。您要修改啟動引導器的配置檔案/isolinux/isolinux.cfg中的相關核心引數,來告訴"d-i"找到這個檔案。我的檔案裡有下列行:

DEFAULT /install/vmlinuz

APPEND preseed/file=/cdrom/preseed/learnexchange.seed kbd-chooser/method=us debian-installer/locale=en_CA vga=normal initrd=/install/initrd.gz ramdisk_size=16384 root=/dev/rd/0 DEBCONF_PRIORITY=critical debconf/priority=critical rw --

"DEFAULT"是指我在boot提示符下直接按Enter鍵裝載的核心。APPEND 包涵了要傳給核心的引數。preseed/file 是這兒最重要的引數;接著的那兩個指出我的鍵盤佈局用及本地為加拿大;DEBCONF_PRIORITY 用來確定我不想看到不必要的配置軟體包提問。

根據你的情況小心修改這檔案.

寫preseed檔案

這裡有很多例項;看看這個在安裝盤裡的--server.seed:

# Don't install usplash.

d-i base-installer/kernel/linux/extra-packages-2.6 string

# Desktop system not installed; don't waste time and disk space copying it.

d-i archive-copier/desktop-task string ubuntu-standard

d-i archive-copier/ship-task string

# Only install the standard system and language packs in the second stage.

base-config base-config/package-selection string ~t^ubuntu-standard$

base-config base-config/language-pack-patterns string language-pack-$LL

# No language support packages.

base-config base-config/install-language-support boolean false

(Note that the version of this file on breezy CD images was buggy: it set base-config/package-selection to "~tubuntu-standard" rather than "~t^ubuntu-standard$". Use the new version in preference; the old one will break with Ubuntu 6.04.)

首先注意格式,有 4 個部分:

取得變數的程式名稱

答案的變數名

變數型別

變數值

兩個要注意的地方:現在,d-i 期望有精確的型別和值;在breezy這個版本不支援用 來處理多行(新的版本支援)。

我建議您從一些現有的 preseed 來修改--這兒有一個可以用的 點選。 如果您沒能在這兒找到,那就試著執行這些命令:

debconf-get-selections --installer > somefile.txt

debconf-get-selections >> somefile.txt

這會輸出一個您在安裝時候作出的選擇的列表;這檔案相當地長,並且實際上不那麼適合用在安裝盤裡。特別是,NOTE: debconf-get-selections 會在型別和只之間放 2 個空格。您得在把她放在安裝盤上以前修改他們。

如果您想讓 d-i 安裝額外的軟體包,或者一個最小的系統,您需要在preseed裡修改 "base-config base-config/package-selection"。This should be set to an aptitude pattern; see the aptitude documentation for more information on these. 例如,標準安裝一個SSH服務,用這一行:

base-config base-config/package-selection string ~t^ubuntu-standard$|~t^ubuntu-desktop$|~n^openssh-server$

To install support for additional languages, a different mechanism is available, namely to preseed the detailed locale question asked by the installer in expert mode. See the first column of /usr/share/i18n/SUPPORTED for the locale names you can use here. 例如, 增加孟加拉語和泰米爾語的支援,用這一行:

d-i localechooser/supported-locales multiselect ba_IN, ta_IN

修改pool目錄,增加或刪除軟體包

也許制定您自己的安裝CD的主要原因是想改變所安裝軟體包;特別是您想增加一些包到CD裡。這有好幾個方法來做到,不需要完全地理解。最容易的事情是建立一個最小的倉庫放您想要增加的包,再在製作光碟映象檔案之前合併到光碟檔案體系裡。這兒棘手的地方是:製作讓Debian軟體包管理系統知道這個倉庫的相關檔案;寫一個更高版本的Release檔案;並簽上 GPG 。下面是我所做的。

. 選定一個檔案目錄作為您的工作空間;在這個目錄裡,

mkdir -p dists/breezy/extras/binary-i386 pool/extras/ isolinux preseed

把您修改過的isolinux.cfg放在目錄isolinux/,把您的preseed檔案放在目錄preseed裡。 Put your modified isolinux.cfg in isolinux/, and your preseed file in preseed/.

. 把您需要的所有額外的包放在目錄 pool/extras/ 裡。您還需要包括一個新版本的 ubuntu-keyring 包,我將馬上解釋一下

. 建立並編輯檔案dists/breezy/extras/binary-i386/Release,寫入下面的內容:

Archive: breezy

Version: 5.10

Component: extras

Origin: Ubuntu

Label: Ubuntu

Architecture: i386

. 把您做的修改這樣合併到CD裡:

掛載您下載的官方ISO檔案:mount /path/to/iso /some/mountpoint/ -o loop

b. 把光碟裡的全部檔案複製到某個目錄(您會需要1到2G的空間);我用rsync:sudo rsync -azvb --delete --backup-dir=/yeowe/usr/cdbuilder/old/ $MOUNT $BUILD ( 這兒的 $MOUNT 是掛載點,$BUILD 是額外的包的目錄)

c. 最重要的地方. 我們將用apt-ftparchive工具來產生軟體包相關和更高版本的Release檔案。我們還要用GPG來籤這個Release檔案。安裝程式會用包ubuntu-keyring 的公匙來檢測簽名。但是您的簽名不一樣。所以您得建立一個新版本的 ubuntu-keyring 包。這做起來很容易,但是要確保正確無誤。下面是執行的命令:

apt-get source ubuntu-keyring

cd ubuntu-keyring--2005.01.11/keyring

gpg --import < ubuntu-archive-keyring.gpg

gpg --list-keys "Your Name"

gpg --export FBB75451 437D05B5 YOURKEYID > ubuntu-archive-keyring.gpg

cd ..

dpkg-buildpackage -rfakeroot -m"Your Name -k"Your Name "

cp ubuntu-keyring*deb $BUILD/pool/extras/

OK -- what we've done here is import the 2 Ubuntu keys into your main keyring, then exported them along with your own key into a replacement keyring. "YOURKEYID" should be replaced with the 8-digit hexadecimal code that gpg tells you when you do the --list-keys command above. And really, the best policy would be to do all that first, and copy a version into your $STAGE file structure so that you have it permanently available.

Note: If you do not have an existing gpg signing key, use the following code:

gpg --gen-key

Accept all defaults, select "No expiry", and enter an appropriate passphrase.

In order to use apt-ftparchive, we will need to provide it with some defaults. Create the files "apt-ftparchive-deb.conf, "apt-ftparchive-udeb.conf", and "apt-ftparchive-extras.conf" as follows (substitude $BUILD for the absolute path to your BUILD directory, and /path/to/indices to the location of the indices files, which you can download from ):

apt-ftparchive-deb.conf:

Dir {

ArchiveDir "$BUILD";

};

TreeDefault {

Directory "pool/";

};

BinDirectory "pool/main" {

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

BinOverride "/path/to/indices/override.breezy.main";

ExtraOverride "path/to/indices/override.breezy.extra.main";

};

Default {

Packages {

Extensions ".deb";

Compress ". gzip";

};

};


Contents {

Compress "gzip";

};

apt-ftparchive-udeb.conf:

Dir {

ArchiveDir "$BUILD";

};

TreeDefault {

Directory "pool/";

};

BinDirectory "pool/main" {

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

BinOverride "/path/to/indices/override.breezy.main.debian-installer";

};

Default {

Packages {

Extensions ".udeb";

Compress ". gzip";

};

};

Contents {

Compress "gzip";

};

apt-ftparchive-extras.conf:

Dir {

ArchiveDir "$BUILD";

};

TreeDefault {

Directory "pool/";

};

BinDirectory "pool/extras" {

Packages "dists/breezy/extras/binary-i386/Packages";

};

Default {

Packages {

Extensions ".deb";

Compress ". gzip";

};

};

Contents {

Compress "gzip";

};

. 現在就用apt-ftparchive來建立Packages和Release檔案:

cd $BUILD

sudo apt-ftparchive -c $APTCONF generate /path/to/apt-ftparchive-deb.conf

sudo apt-ftparchive -c $APTCONF generate /path/to/apt-ftparchive-udeb.conf

sudo apt-ftparchive -c $APTCONF generate /path/to/apt-ftparchive-extras.conf

$APTCONF is a file somewhere that looks about like this:

APT::FTPArchive::Release::Origin "Ubuntu";

APT::FTPArchive::Release::Label "Ubuntu";

APT::FTPArchive::Release::Suite "breezy";

APT::FTPArchive::Release::Version "5.10";

APT::FTPArchive::Release::Codename "breezy";

APT::FTPArchive::Release::Architectures "i386";

APT::FTPArchive::Release::Components "main restricted extras";

APT::FTPArchive::Release::Description "Ubuntu Breezy";

給Release檔案籤gpg:

sudo gpg --default-key "MY GPG KEY ID" --output $BUILD/dists/breezy/Release.gpg -ba $BUILD/dists/breezy/Release

*. Regenerate the md5 checksums:

cd $BUILD

find . -type f -print0 | xargs -0 md5sum > md5sum.txt

. 現在可以來生成光碟映象檔案:

sudo mkisofs -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -J -hide-rr-moved -o $IMAGE -R $BUILD/

‘$IMAGE’表示您的光碟映象檔案.

. 最後,可以用cdrecord或其它燒錄工具來燒錄您的CD了:

sudo nice -18 cdrecord dev=ATA:1,1,0 speed=12 --blank=fast -v -gracetime=2 -tao $IMAGE

that will burn the image on the second cd drive; if your cd-burner is the first or only cd-drive, change dev argument to ATA:1,0,0. I strongly recommend using rewritable media -- I've burned a LOT of coasters on this project.

好了,搞定! 如果誰感興趣,我寫了一個小指令碼(很簡單)來自動完成這個步驟。我想我正好可以放在這兒

#!/bin/bash

# usage

# update-learningexchange.sh kubuntu|ubuntu|xubuntu

# a very primitive script with no structure of controls etc

# no default behaviour, etc etc

# all ofthis should be trivial to implement but my

# bash syntax sucks

# obvious thing to do would be to convert to python

# & add a simple gtk front end too

# but I'm rushed at the moment

# Notes;Bugs:

# REMEMBER: this absolutely will not work if you haven't built a new version of ubuntu-keyring

# package & included that in $STAGE/pool/extras/! You do that thusly:

# apt-get source ubuntu-keyring

# cd ubuntu-keyring-version-info/keyring

# gpg --import < ubuntu-server-keyring.gpg

# gpg --output=ubuntu-server-keyring.gpg --export "ubuntu" "Your Name"

# dpkg-buildpackage -rfakeroot -m"My Name "

# cp ../ubuntu-keyring*deb $BUILD/pool/extras/

# VARIABLES

# this script relies on the existence of several files and directories:

# Original = $ORIG: location of the "clean", unmodified CD .iso

# CD mount point = $MOUNT: mount point of clean CD

# Staging area = $STAGE: where you keep all your files

# this area should include main dirs isolinux/, pool/, and dists/ at a minimum

# as written the script assumes you have a directory pool/extras with your

# extra debs, and that dists/breezy/extras/binary-i386/Release exists (copy it over

# from dists/breezy/main/binary-i386, and replace "main" with "extras")

# There is no doubt a better way to do this but it involves work...

# Building Area = $BUILD: location where your changes are merged into the "clean" directory

# structure.

# Image location = $IMAGE: name of the new .iso file you want to build

# apt.conf file = $APTCONF: location of the file used to feed instructions to apt-ftparchive

ORIG="/var/www/jigdo/$1-breezy-install-i386.iso"

STAGE="/home/matt/LearningExchangeCD/$1/"

MOUNT=/mnt/iso/

BUILD="/yeowe/usr/cdbuilder/$1"

IMAGE="/yeowe/usr/cdbuilder/$1-learningexchange.iso"

APTCONF=/home/matt/LearningExchangeCD/apt.conf

# sync with latest image

sudo umount $MOUNT

sudo mount $ORIG $MOUNT -o loop

# sudo rsync -azvb --delete --exclude="language-pack*" --backup-dir=/yeowe/usr/cdbuilder/old/ $MOUNT $BUILD

sudo rsync -azvb --delete $MOUNT $BUILD

# now get rid of the old ubuntu-keyring package

sudo rm -r $BUILD/pool/u/ubuntu-keyring/

# note I've excluded a few files, shouldn't matter much for you I reckon

sudo rsync -avzb --exclude='*~' --exclude='INSTRUCTIONS.txt' --backup-dir=/yeowe/usr/cdbuilder/old/ --exclude='example-preseed.txt' $STAGE $BUILD

# generate Packages, Release, Release.gpg

# first thing to realize is, that we only need to generate the Packages files,

# the top-level Release file, and top-level Release.gpg.

# everything else should be in your $STAGE file structure or usable unchanged

# in the original form

# remove Release file otherwise you'll have trouble writing to it.

sudo rm $BUILD/dists/breezy/Release*

# ubuntu-keyring must be included in main/, so main NEEDS to be rebuilt!

for component in main extras; do

sudo apt-ftparchive packages "$BUILD/pool/$component/" > "$BUILD/dists/breezy/$component/binary-i386/Packages"

gzip -c "$BUILD/dists/breezy/$component/binary-i386/Packages" |

sudo tee "$BUILD/dists/breezy/$component/binary-i386/Packages.gz" > /dev/null

done

sudo apt-ftparchive -c $APTCONF release $BUILD/dists/breezy > $BUILD/dists/breezy/Release

# gpg options: -ba = armored, detached-sig

sudo gpg --output $BUILD/dists/breezy/Release.gpg -ba $BUILD/dists/breezy/Release

# build the actual image. Note the options to mkisofs, which make the image bootable

sudo chown -R root:root $BUILD/isolinux $BUILD/preseed

sudo mkisofs -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -J -hide-rr-moved -o $IMAGE -R $BUILD/

# burn the image to 2nd cd drive on most setups

sudo nice -18 cdrecord dev=ATA:1,1,0 speed=12 --blank=fast -v -gracetime=2 -tao $IMAGE

CategoryDocumentation CategoryCleanup

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-958877/,如需轉載,請註明出處,否則將追究法律責任。

相關文章