- 论坛徽章:
- 0
|
第一章 – 定制之前的预备工作
--------------------------------------------------------------------------------
这份文档是根据我的个人经验写成的,同时为简单起见忽略了许多d-i 的细节问题以及在非i386平台上的安装问题。我得承认我的计算机知识很有限,所以请小心谨慎地使用本文档。
--------------------------------------------------------------------------------
1.1 前提
要定制d-I需要的技术其实并不高深,如果你是一个Debian的新手,请先阅读我写的"Debian参考手册"
![]()
这个文件可以在debian-reference-en软件包或链接Debian参考手册中找到。
然后你起码要通读在链接Debian开发者乐园中的一些基本文件。
至于d-I的一些相关信息,请参阅:
Links from debian-installer (请耐心看完)
Sarge安装手册
安装报告
Document files in surversion repository as a part of alioth archive
请使用Debian安装报告模版将你发现的关于d-i的小错误发送到installation-reports 的psudo包。
如果你在使用本文档中的一些命令失败的话,请先安装这些软件,你可以使用auto-apt 软件包来完成。
虽然例子中的命令都是由root 用户进行,但我都都是由非特权用户用sudo或fakeroot 来进行的。
--------------------------------------------------------------------------------
1.2 d-i的启动阶段
在我们开始定制修改d-I之前,让我们先来学习一点d-I的基础知识。使用d-I在硬盘上创建一个新的GNU/Linux系统的过程可以划分为三个独立的阶段。以下是在i386平台上的启动过程的简单描述(内核2.4或2.6):
第一阶段: 从光盘启动基本系统
将"El Torito"格式的可启动光盘放入电脑
开机连接电源,BIOS读取光盘上的启动引导程序ISOLINUX
ISOLINUX读取光盘
ISOLINUX在光盘上寻找vmlinuz/initrd
ISOLINUX显示多重启动选择
ISOLINUX启动用户选择的相应内核并将initrd拷贝到内存虚拟磁盘RAMDISK (/dev/rd/0).
系统在内存虚拟磁盘上运行根文件系统
内核自动执行脚本/sbin/init
将内存虚拟磁盘上的根文件系统复制为tmpfs (2.4 ?)或shm (2.6 POSIX ?),以创建一个新的根文件系统
使用busybox中的init替换新创建的根文件系统中的/sbin/init
执行pivot_root进入新创建的根文件系统
在新的根文件系统中开始初始化,解析文件/etc/inittab.
运行/etc/init.d/pcmcia来初始化PCMCIA设备
运行/etc/init.d/rcS,其实是运行/etc/rcS.d/S[0-9][0-9]* 中的相应脚本
运行debian-installer,其实是运行/lib/debian-installer.d/S[0-9][0-9]*
光盘被自动检测并自动加载到/cdrom.
初始化U盘、软盘、硬盘、网卡等
其他事情
![]()
Start menu with newt front end by practically running:
§ DEBIAN_FRONTEND=newt§ export DEBIAN_FRONTEND§ exec /usr/bin/debconf -o d-i /usr/bin/main-menuMain menu is ordered using "installer-menu-item: nnn" entries in the udeb's debian/control file. These will be gathered in /var/lib/dpkg/status. (XXX Need to verify XXX)
prebaseconfig is run.
Selected items run in turn.
第二阶段:软件包安装的主体部分
获得udeb软件包并安装到RAMDISK,以使d-I能够读取光盘或连接互联网。
通过使用光盘或网络上的deb软件包在硬盘上安装一个新的、最小的GNU/Linux系统,挂载在/target。
在硬盘上安装启动引导器GRUB。
重新启动电脑使刚安装的最小系统开始工作。
第三阶段:配置新创建的系统
配置新创建的最小基本系统
从光盘或网络上添加更多的deb软件包
再配置新创建的系统
其他的启动方式与上述大同小异。
--------------------------------------------------------------------------------
1.3 启动引导器基础
这些是最流行的启动引导器:
SYSLINUX: 软盘、光盘和网络启动
Loadlin: 从DOS引导启动
Lilo: 支持小MBR的Linux启动
GRUB: 支持大MBR的启动
更多的信息请参阅Linux启动引导器之比较
d-I使用ISOLINUX来进行引导,ISOLinux,SYSLINUX和PXELINUX都是SysLinux的组成部分,更详细的信息请参阅其文档。
启动引导系统的一个重要特点是使用脚本/sbin/init 来自动启动程序,并使用pivot_root 命令来将root用户从正在运行的内核中移走。
参阅制作可启动的Linux光盘以及Timo的系统恢复光盘 以了解关于启动引导和系统恢复光盘更多的知识。
同时不使用光盘、U盘及其他可移动介质从windows安装Linux I也是相关的有趣的文章。
--------------------------------------------------------------------------------
1.4 initrd是什么?
initrd就是内存虚拟磁盘映像文件,虽然在Debian系统里它一般使用CRAMFS文件格式,但d-i使用EXT2文件格式并使用gzip进行压缩,系统内核可以直接读取这个经过压缩的initrd.gz文件。
--------------------------------------------------------------------------------
1.5 定制磁盘映像文件
以下是操作磁盘映像文件的基本方法。
--------------------------------------------------------------------------------
1.5.1 格式化软盘映像文件
可以使用loop设备来格式化软盘映像文件,比如说要格式化一个2.8M的MSDOS文件格式的软盘映像:
# dd if=/dev/zero of=imagefile0 bs=$((2880*1024)) count=1 ... # losetup /dev/loop0 imagefile0 # mkfs -t msdos -v -F12 -S512 /dev/loop0 mkfs.msdos 2.10 (22 Sep 2003) /dev/loop0 has 2 heads and 18 sectors per track, logical sector size is 512, using 0xf0 media descriptor, with 5760 sectors; file system has 2 12-bit FATs and 2 sectors per cluster. FAT size is 9 sectors, and provides 2863 clusters. Root directory contains 224 slots. Volume ID is 40d73f42, no volume label. # losetup -d /dev/loop0
--------------------------------------------------------------------------------
1.5.2 格式化硬盘映像文件
可以这样格式化一个10M的EXT2文件格式的,里面有一个简单的文本文件的硬盘映像:
# dd if=/dev/zero of=imagefile1 bs=1024 count=$((10*1024)) ... # losetup /dev/loop1 imagefile1 # mkfs -t ext2 -v /dev/loop1 ... Block size=1024 (log=0) Fragment size=1024 (log=0) 2560 inodes, 10240 blocks 512 blocks (5.00%) reserved for the super user ... # mount -t ext2 /dev/loop1 /mnt/imagemnt1 # cd /mnt/imagemnt1 # echo "Hello small file" >small_file # cd /mnt # umount /dev/loop1 # losetup -d /dev/loop1
--------------------------------------------------------------------------------
1.5.3 挂载硬盘映像文件
这些格式化后的磁盘映像文件可以直接挂载到文件系统并修改其中的内容。
# mount -t ext2 imagefile1 /mnt/imagemnt1 # cd /mnt/imagemnt1 # vim small_file ... edit and :wq # cd /mnt # umount /mnt/imagemnt1
--------------------------------------------------------------------------------
1.5.4 检查硬盘映像文件的大小
可以使用和常规文件系统相同的命令来获得磁盘映像文件的信息和剩余空间的大小,比如说:
# ls -l imagefile1 ... External file size of the disk image # tune2fs -l imagefile1 |less ... Abstract information in blocks # mount -t ext2 -o loop imagefile1 /mnt/imagemnt1 # df -h | grep imagefile1 ... Easy to read file usage in the disk image # umount imagefile1如果你想知道目录/some/where的大小,运行:
# du -hs /some/where
--------------------------------------------------------------------------------
1.5.5 修改硬盘映像文件的大小
这些格式化的磁盘映像文件的大小可以修改,比如说增加5M:
# ls -l imagefile1 -rw-r--r-- 1 root root 10485760 2004-06-22 19:38 imagefile1 # dd if=/dev/zero of=imagefile1 bs=1 seek=10485760 count=$((5*1024*1024)) # losetup /dev/loop1 imagefile1 # resize2fs /dev/loop2 ... # tune2fs -l /dev/loop2 | less ... # losetup -d /dev/loop2参阅 mount(8).
--------------------------------------------------------------------------------
[ previous ] [ Contents ] [ 1 ] [ 2 ] [ 3 ] [ A ] [ next ]
--------------------------------------------------------------------------------
定制d-I光盘映像文件
第二章 :一步一步定制d-i
--------------------------------------------------------------------------------
H下面我通过修改现成的d-I光盘映像定制一个我自己的d-I光盘文件映像,其中很少使用到源代码,这对于定制d-I可是一个好主意。
至于官方制作光盘的方法,请参阅debian-cd软件包
你使用上述方法修改了d-I光盘映像,为了让别人知道你的修改,你需要为subversion软件池提供一个补丁包,采用The subversion repository, Section 2.2.1中描述的方法。
请参阅d-i:如何修改现有的光盘映像以获得更详细的信息
--------------------------------------------------------------------------------
2.1 获得d-i光盘映像文件
--------------------------------------------------------------------------------
2.1.1 下载d-i光盘映像文件
首先,你要在网站d-i取d-i的最新光盘映像,我习惯使用最小网络安装光盘的映像,后面我将简单地称之为image.iso 。
最新的版本叫做d-i_sid ,它的软件包都是取自unstable,这当然比 d-i Sarge每日映像 更新,因为后者使用的是testing中的软件包而且是准备用做RC版本的。
--------------------------------------------------------------------------------
2.1.2 挂载d-I光盘映像
为了读取d-i光盘映像中的内容,你必须首先使用内核中的loop设备来挂载它:
# cd /mnt # mkdir -p /mnt/iso # mount -t iso9880 -o loop image.iso /mnt/iso ... # mount ... /mnt/iso/image.iso on /mnt/iso type iso9660 (rw,loop=/dev/loop0)
--------------------------------------------------------------------------------
2.1.3 建立一份d-i的工作复本
虽然挂载的光盘映像具有"rw"属性,但是由于它是建立在iso9660文件系统之上的,所以还不能进行编辑修改。我们需要把在ext3文件系统上再建立一个工作版本:
# cd /mnt # rm -rf image # kill old one # cp -a iso image你也可以使用rsync命令来完成这步工作以避免拷贝由mkisofs创建的TRANS.TBL文件:
# cd /mnt # rm -rf image # kill old one # mkdir image # rsync -a -H --exclude=TRANS.TBL iso/ image现在你可以看到d-I光盘上的内容并开始对它进行改造了[1]
# mc image ... browse contents
--------------------------------------------------------------------------------
2.2 获得最新源码
可以从Debian的subversion软件池和 unstable软件池的源代码包中获得d-I的最新源码。
--------------------------------------------------------------------------------
2.2.1 从subversion软件池获取
从d-i subversion软件池获得最新的d-I源码:
$ cd /some/where $ svn co svn://svn.debian.org:3691/d-i/trunk debian-installer
--------------------------------------------------------------------------------
2.2.2 从unstable软件池获取
获得d-i源码:
$ cd /some/where $ apt-get source some-package
--------------------------------------------------------------------------------
2.3 改造d-i的内部
--------------------------------------------------------------------------------
2.3.1 对d-i的简单改造
作为一个简单的例子,我们首先修改光盘映像当中的启动帮助屏幕isolinux/f1.txt,也就是现在挂载在主机上的文件/mnt/image/isolinux/f1.txt。从现在起,为简单起见,我说的文件都使用相对路径。
# cd /mnt/image/isolinux # vim f1.txt ... 随你修改 # cd ..
--------------------------------------------------------------------------------
2.3.2 改造d-i的第一启动阶段
你可以通过修改其中一个initrd 映像来定制第一启动阶段的d-i。
--------------------------------------------------------------------------------
2.3.2.1 制作可修改的initrd文件工作版本
在刚才挂载的d-I工作版本中,有几个用gzip格式压缩的initrd文件,分别是install/initrd.gz, install/2.6/initrd.gz和install/floppy/initrd.gz。这些文件一般都小于2,949,120字节,以便能容纳在一张2.8M软盘里,同时也使各种不同的BIOS能够读取。
如果你想修改定制initrd 文件,你必须建立该文件的工作版本,比如说要修改install/initrd.gz:
# cd /mnt # gunzip -c image/install/initrd.gz >initrd # mkdir initmnt # mount -o loop initrd initmnt ... # mount ... /mnt/initrd on /mnt/initmnt type ext2 (rw,loop=/dev/loop1) # cp -a initmnt initimage # umount initrd # mc initimage ...你可以在那里看到一个小的,但是完整的根目录系统。
--------------------------------------------------------------------------------
2.3.2.2 改造initrd 映像文件
你可以通过在chroot下编辑和安装udeb包的方式直接修改/mnt/initimage 文件中的内容。
--------------------------------------------------------------------------------
2.3.2.3 制作新的initrd 映像文件
一般来说命令mkinitrd(8)从/mnt/initimage创建一个CRAMFS格式的initrd。但是d-i 使用压缩的EXT2文件格式
你可以这样得到未压缩的、EXT2文件格式的磁盘映像文件:
# gunzip -c initrd.gz >initrd你可以使用文章如何修改定制磁盘映像文件,1.5节所说的方法来修改定制这个EXT2格式的磁盘映像文件,但要注意磁盘映像的大小。
--------------------------------------------------------------------------------
2.3.3 修改定制第二和第三启动阶段的d-i
你可以通过替换pool/*中的udeb和deb软件包来修改定制第二、第三启动阶段的d-I。注意在文件debian/changelog 中使用更高的版本数字号码以确保这些修改后的软件包可以使用。
你可能需要修改第一阶段中的某些相关部分。
--------------------------------------------------------------------------------
2.3.3.1 从源码创建一个定制的软件包
一个叫做some-package的包,有debian/control文件,其中Depends的值为package_lists ,你可以这样定制这个包:
$ sudo aptitude install package_lists gnupg build-essential $ cd /some/where/some-package .... make any modification you wish $ vi /some/where/some-package/debian/changelog .... make it newer version $ dpkg-buildpackage -rfakeroot注意修改完后在debian/changelog 中给出一个更高的版本号。
如果不使用aptitude 命令的话,还可以这样:
$ sudo apt-get build-dep some-package gnupg但是不要混合使用apt-get和aptitude命令
--------------------------------------------------------------------------------
2.3.3.2 将定制后的软件包放入poolmodified
你需要把udeb和deb软件包放到光盘映像文件的pool/*中以定制第二和第三阶段的系统安装。
以下命令为定制后的光盘映像文件创建新的Release和Packages文件以确认定制后的光盘符合Debian的要求(来源于Wiki):
Replace udeb and deb packages in pool/* with desired modified packages as needed.
Replace or add desired udeb and deb packages in pool/* as needed.
Create a config file config as:
· Dir {· ArchiveDir "/where/the/root/of/the/FTP/archive";· OverrideDir "indices";· CacheDir "indices";· };· · TreeDefault {· Directory "pool/";· };· · BinDirectory "pool/main" {· Packages "dists/sarge/main/debian-installer/binary-i386/Packages";· BinOverride "override";· ExtraOverride "override.extra";· };· · Default {· Packages {· Extensions ".udeb";· };· };Obtain override.sarge.main.gz file from any debian mirror and extract it to the indices/override. The override file contains section, priority and maintainer address information.
Create your custom indices/override.extra file.
Run following to update the index files.:
· # apt-ftparchive generate configRun (I need to verify this is right thing to do.)
· # rm -rf indices/override config另一种办法是你可以使用apt-move命令来创建Debian镜像。
--------------------------------------------------------------------------------
2.3.4 使用钩子(hooks)定制d-i
d-i中有一些run-parts类型的钩子(hooks),详情参阅Available hooks in d-i.
--------------------------------------------------------------------------------
2.3.5 为d-i定制内核
参阅为d-i定制内核这篇文章以了解官方的为d-I定制内核的方法。
以上讲述的是建立一个大的内核,我想你可以通过将新建的模块放入initrd 映像文件以建立一个模块化的定制内核。
--------------------------------------------------------------------------------
2.3.6 配置启动管理器ISOLINUX
许多的d-I光盘都使用ISOLINUX作为启动引导器,ISOLINUX是syslinux 软件包的一部分:
# rm /mnt/image/isolinux/boot.cat # cp /usr/share/syslinux/isolinux.bin /mnt/image/isolinux/isolinux.bin # vim /mnt/image/isolinux/isolinux.cfg ... configure multiboot注意ISOLINUX只能使用"普通的" ISO 9660格式的文件名,在isolinux.cfg. [2]中并不支持Rock Ridge或Joliet格式的文件名。在Linux操作系统下,你可以在挂载的时候使用"-o norock,nojoliet"参数来验证文件名不出错。
如果要调试ISOLINUX的一些启动问题,使用isolinux-debug.bin 文件来替换isolinux.bin。
文件isolinux/boot.cat 会由mkisofs 程序随后产生[3]。
--------------------------------------------------------------------------------
2.3.7 更新MD5SUM值
可以通过MD5SUM的方法来检测d-i光盘映像中每个文件,MD5SUM的值放在md5sum.txt文件中。 这个值每次定制后都要修改。以上面的简单修改d-i, 2.3.1节,这样调整md5sum.txt 文件:
# cd /mnt/image # mv md5sum.txt md5sum.old # grep -v -e " f1.txt$" md5sum.old >md5sum.txt # md5sum isolinux/f1.txt >> md5sum.txt这一步工作对于你修改了任何一个文件都是必要的。[4]
--------------------------------------------------------------------------------
2.4 创建新的d-i光盘
现在你可以创建定制的d-I光盘了,其ISOLINUX启动映像小于9396字节:
# cd /mnt # mkisofs -o new.iso -r \ -b isolinux/isolinux.bin -c isolinux/boot.cat \ -no-emul-boot -boot-load-size 4 \ -boot-info-table /mnt/image # cdrecord -v -eject dev=0,0 new.iso这是一些使用mkisofs命令的注意事项:
如果你希望使用-J 参数option to mkisofs, if you want a CD with Joliet filenames to support Windows-NT or Windows-95 machines.
如果你希望光盘上有TRANS.TBL 文件,使用-T参数。
如果你不希望复制大的文件树,使用-graft-points 参数。
如果你使用刻录机,用cdrecord命令时使用blank=fast参数。注意一些旧的电脑只能读 CD-R盘片而不能正确读CD-RW盘片。
--------------------------------------------------------------------------------
[ previous ] [ Contents ] [ 1 ] [ 2 ] [ 3 ] [ A ] [ next ]
--------------------------------------------------------------------------------
定制d-I磁盘映像文件
第三章 – 定制d-i的小提示
--------------------------------------------------------------------------------
3.1 从d-i内部连接外部主机
在启动的第一或第二阶段安装openssh-client-udeb 软件包就可以使用ssh 命令了,你可以:
Login to other machine to check man/ info pages.
Move files in and out of machine.
· $ bar"· $ ssh user@host "cat - baz
--------------------------------------------------------------------------------
[ previous ] [ Contents ] [ 1 ] [ 2 ] [ 3 ] [ A ] [ next ]
--------------------------------------------------------------------------------
定制d-I磁盘映像文件
附录 A
--------------------------------------------------------------------------------
本文件的最新版本可以从这里获得:
HTML格式(用于浏览器阅读)
PDF格式 (用于打印)
Debiandoc使用的SGML源码tar.gz文件
--------------------------------------------------------------------------------
定制d-I磁盘映像文件
脚注
1
你可以把以下文本加入到/etc/mc/mc.ext 文件中,这样你使用mc 命令时就可以用回车键来查看udeb软件包的内容,就好象操作deb软件包一样。
# udeb regex/\.udeb$ Open=%cd %p#deb View=%view{ascii} dpkg-deb -c %f2
如果你没有改动内核或者是initrd映像,你就可以不用修改isolinux.cfg文件。
3
我不能确定是否要删除isolinux/boot.cat 文件。
4
我总是很懒。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/21988/showart_143657.html |
|