|
1楼 大家都知道要做资料备份及设定档的备份。但有没有想过做整个系统的备份呢?例如自己不小心rm -rf或是chmod -R 777敲得太快後面打了/ 之後还没来得及打目录就按了Enter;系统被入侵;断电导致整个硬碟完蛋;又或是系统被自己莫名其妙地搞坏了最终都不懂怎麼修复等等。这时候似乎只有重装了,但Gentoo重装可不是一件轻松的事喔!如果你做了整个系统的备份就不用怕了!Windows里有Ghost,linux下有Partimage 和Mondorescue,但始终我还是觉得unix常见的工具反而是最具灵活性的。 用LiveCD或Knoppix开机,并将根分区挂好:/mnt/gentoo。如果你的/boot,/usr用的是独立的分区或硬碟,你必须把它们分别挂到/mnt/gentoo/boot ,/mnt/gentoo/usr等目录里。然後: 代码: quote: -------------------------------------------------------------------------------- # cd /mnt/gentoo # tar -cz --exclude-from /mnt/gentoo/root/exclude-list -pivO * | split -a 1 -b 700m - /path/to/mybackup.tar.gz- -------------------------------------------------------------------------------- 这样会产生好几个包mybackup.tar.gz-a, mybackup.tar.gz-b等等,每个最大700m(方便烧碟)。 exclude-list可以事先写好,类似这样: usr/portage/distfiles var/tmp/portage home/yourusername/music home/yourusername/video 并放到你的gentoo分区的/root里。 注意存放备份包的地方要有足够的空间,如果在不同的分区,事先要挂好。 还原的时候,先要在有关的分区上重建档案系统,并象以上所说的那样挂载好,然後: 代码: quote: -------------------------------------------------------------------------------- # cd /mnt/gentoo # cat /path/to/mybackup.tar.gz-* | tar xzvf - -------------------------------------------------------------------------------- 为什麼要用LiveCD启动呢?这是因为运行中的系统并非静态,不应该简单地去tar根目录;有的程序如partimage甚至要求卸载备份的分区。当然也有可以在运行中的系统做完全备份的程序啦,Mondorescue就是一个例子;这些程序都颇为复杂,不过有兴趣的朋友可以自己试试。 我自己有个分区装了个後备系统。这样每当其他系统出了问题,我不至於没机子用。这个後备系统我平时很少用,更不会去瞎调;但我机子的grub是从这里装的,备份或抢修其他分区也是在这里做的。这个後备系统本来是Knoppix的硬碟安装(因为现在Knoppix硬碟安装实在是太容易了),不过我已经把它换成了gentoo了(已经有了备份就什麼都不用怕了)! ##################################### 越来越多的Linuxer开始对尚处在测试中的2.6内核产生了兴趣,确实它非常具有吸引力,众多的特性让人眼花潦乱。我也从2.4全面转到了2.6内核之下,享受着新特性带来的新鲜体验。 不过不少兄弟在编译新内核时或多或少的遇到了一些问题,看来新娘的盖头也不是那么容易揭开的:) 因此我打算写一些文章来介绍编译新内核时的一些应该注意的地方,以减少兄弟们在编译新内核时的麻烦。由于我的水平十分有限,写这样的文章实在是勉为其难。文中肯定有错误疏失之处,还请兄弟们多多包涵:) 第一部分,准备: 要使用新的内核首先当然要取得新内核的源码,内核的官方网站是http://www.kernel.org 在上面可以得到最新的内核。2.6的更新是相当快的,你可以在命令行下使用finger @kernel.org命令来快速得到当前最新的内核列表。在这篇文章中我将以2.6.0-test6为准。 下载了内核源码之后,我们要使用tar jxvf linux-2.6.0-test6.tar.bz2来提取源码,如果你下载的是以tgz结尾的压缩包就使用zxvf参数来解压。我强烈建议你不要使用/usr/src/linux这个目录来存放源码,因为使用这个目录你需要手工在/usr/include目录下作一些符号链接,这实在不是一个好主意。所以我建议你为源码单独建一个目录,这里我们的目录是/src/linux-2.6.0-test6。 |
|
|
|
- 共有16篇贴子
|
2楼 要编译与正常运行新的内核你需要升级一些软件包,这些信息在源码目录下的Documentation/Changes文件中,请根据你的实际情况选择升级。这其中我强调一下你应该升级Module-Init-Tools,不要被你当前系统中depmod -V输出的版本号迷惑(在RH9中它的输出是2.4.22,感觉好象要比Changes中所要求的要高,实际上它们使用不同的版本规则)。新的Module-Init-Tools在下面的网址中取得:http://www.kernel.org/pub/linux/kernel/people/rusty/modules/ 我使用的是0.9.14。如果你下载的是源码使用如下步骤进行编译 ./configure --prefix=/ make moveold 这一步会将你以前的insmod, modprobe, rmmod和 lsmod重命名为insmod.old, modprobe.old, rmmod.old lsmod.old。 make make install 然后使用 ./generate-modprobe.conf /etc/modprobe.conf 将原来的/etc/modules.conf转换到/etc/modprobe.conf 如果你使用devfs系统你还需要复制modprobe.devfs 到/etc目录下。 当你升级完相关软件包之后,准备工作就算完成了,下面我们将进入到编译阶段。 第二部分 编译: 2.6的build系统与2.4有很大的不同,实际上是更加简单与方便了。第一步我们要进入源码目录 cd /src/linux-2.6.0-test6 make mrproper 这时我们就已经在源码目录下了,make mrproper是用来清除一些老的配置文件、过时的已编译文件,打补丁遗留的备份文件等工作的。如果你是从官方网站下载并且是第一次编译这一步可以不作。事实上就算你以前编译过,在打了一些补丁或者重新更改设置后再次编译也可不作这一步,这方面的内容我将在以后的补遗中作解释。现在你只管按步就般的作不用考虑它。 下面我们就可以进行内核的配置了。 先介绍一下新内核中的图形界面配置工具: 新内核中有两个GUI配置工具,过去的make xconfig现在是一个使用QT库作为界面方案的配置工具了,所以你要使用它必需先安装QT库。一般的发行版光盘中都包含了这个软件包。 另一个是make gconfig这是一个使用GTK库作为界面方案的工具,同样你要使用它就要先安装GTK库。这两个工具与原来的GUI工具在界面上有很大的变化,更加符合一般图形界面程序的使用习惯。 而传统的控制台配置工具menuconfig则没什么太大的变化基本上保持了原来的样子,不喜欢花里糊哨的GUI工具的兄弟还是用这个吧:) 下面我们就要开始配置内核了,新内核的build系统有一个新的特性,它会在启动配置工具时读取你当前的系统配置,从而保持与你当前配置相同的选项。而在2.4中它则是配置为默认选项的。这个特性其实是为了方便你以后的升级工作,在内核特性变化不大的情况下可以直接以当前的选项为基础从而省去逐项配置的麻烦。但由于我们现在是从2.4来升级的,它们之间的差别太大了,所以这反而会给我们造成麻烦。有两种方法可以让2.6以默认选项来启动配置工具,第一种就是将你当前的配置文件也就是/boot/config-XXX移除,另一种是在执行配置工具前先执行make defconfig.我推荐这种方法。 在2.6中还添加了几个以调试为目的的make选项,它们是allyesconfig、allnoconfig、allmodconfig分别表示将所有选项加载为y、将所有选项加载为n、将所有选项加载为m。它们是为内核开发人员与测试人员准备的,与我们的关系不大。 下面我们开始配置内核,这里使用的工具为menuconfig。首先在命令行模式下执行: make menuconfig 在闪过几行字之后就出现了如图1 的界面 在界面的上部是配置工作的使用说明,使用箭头键在各选项间移动,使用enter进入下一层菜单,每个选项上的高亮字母是键盘快捷方式,使用它可以快速的到达你想设置的菜单项上。在括号中按y将这个项目编译进内核中,按M编译为模块,按N为不选择。按?将打印这个选项的帮助信息,按esc将返回到上层菜单。GUI工具的基本概念也与之类似我们就不详细讨论了。在后面我将主要使用menuconfig来设置各个选项,选项的次序以它为准,其它工具中各选项也基本与之对应。 |
|
|
|
|
3楼 第一项 Code maturity level options (代码成熟度选项) 按enter进入后选项如下 Prompt for development and/or incomplete code/drivers 默认情况下是选择的,这将会在设置界面中显示还在开发或者还没有完成的代码与驱动.你应该选择它,因为有许多设备可能必需选择这个选项才能进行配置,实际上它是安全的。 Select only drivers expected to compile cleanly 选择这个选项你将不会看到一些已知的存在问题的驱动程序选项,默认的情况下也是选择的。如果你有设备没有找到驱动选项,你可以将这一项去掉,或许就可以找到相关驱动了,不过它可能是有BUG的。 Select only drivers that don't need compile-time external firmware 如果你不需要在内核对一些外部设备的固件作map支持就选择它,这也是默认选项。 第二项 General setup 其中的选项如下 Support for paging of anonymous memory 这个选项将使你的内核支持虚拟内存,也就是让你的计算机好象拥有比实际内存更多 多的内存空间用来执行很大的程序。默认是选择的。 System V IPC 为进程提供通信机制,这将使系统中各进程间有交换信息与保持同步的能力。有些程序只有在选Y的情况下才能运行,所以不用考虑,这里一定要选。 [ ] BSD Process Accounting 这里选择Y将会让内核为用户层的进程建立一个帐目(进程通过一个特殊的系统调用来通知内核),当程序退出时内核会将进程的相关信息记录到帐目文件中,主要包括进程的创建时间、 创建者,内存占用等信息。如果你需要就Y吧:) Sysctl support 这将提供一个接口让你可以动态的更改一些核心参数与变量,而不需要重新启动系统。打开这个选项将会增加内核的体积至少8KB。如果你的内核仅用制作安装与恢复系统系统盘那么可以不选,以减少对内存的占用。 [ ] Kernel .config support 这将会把内核的配置信息与相关的文档说明编译进内核中,以后可以使用一些工具来提取它用来重新构建内核,一般不用选它。 [ ] Remove kernel features (for embedded systems) ---> 这个选项将会把一些特性从内核中移除,以减少内核体积。对于桌面用户来讲,这可不是一个好主意,所以不要选它。至于其中的内容我会在以后的补遗中介绍。 第三项 Loadable module support (可加载模块选项) 其选项如下: Enable loadable module support 这个选项可以让你的内核支持模块,模块是什么呢?模块是一小段代码,编译后可在系统内核运行时动态的加入内核,从而为内核增加一些特性或是对某种硬件进行支持。一般一些不常用到的驱动或特性可以编译为模块以减少内核的体积。在运行时可以使用modprobe命令来加载它到内核中去(在不需要时还可以移除它)。 一些特性是否编译为模块的原则是,不常使用的,特别是在系统启动时不需要的驱动可以将其编译为模块,如果是一些在系统启动时就要用到的驱动比如说文件系统,系统总线的支持就不要编为模块了,否在无法启动系统。(当然还有一些变通的方法,我以后会提到) [ ] Module unloading 这个选项可以让你卸载不再使用的模块,如果不选的话你将不能卸载任何模块(有些模块一旦加载就不能卸载,不管是否选择了这个选项)。不选择这个选项会让你的内核体积减小一点 [ ] Module versioning support (EXPERIMENTAL) 这个选项将让你可以使用其它版本内核中编译的模块,不过并不可靠,所以一般我们不选择它 Automatic kernel module loading 一般情况下,如果我们的内核在某些任务中要使用一些被编译为模块的驱动或特性时,我们要先使用modprobe命令来加载它,内核才能使用。不过,如果你选择了这个选项,在内核需要一些模块时它可以自动调用modprobe命令来加载需要的模块,这是个很棒的特性,当然要选Y喽:) |
|
|
|
|
4楼 第四项 Processor type and features Subarchitecture Type (PC-compatible) 这是一个比较新的特性,主要的目的是使Linux可以支持多种PC标准,一般我们使用的PC机是遵循所谓IBM兼容结构(pc/at)。这个选项可以让你选择一些其它架构。我们一般选择PC-compatible就可以了。 Processor family (Pentium-4/Celeron(P4-based)/Xeon) 这个不用我讲了吧,你是什么CPU就选什么吧:) [ ] Generic x86 support 这个选项提供了对X86系列CPU最大的兼容性,用来支持一些很少见的x86体系的CPU,它可能会降低一些系统性能。所以如果你的CPU能够在上面的列表中找到就不要选这个吧。 [ ] HPET Timer Support 这也是一个新的特性,HPET是intel制定的新的用以代替传统的8254(PIT)中断定时器与RTC的定时器,全称叫作高精度事件定时器。如果你有一台较新的机器就选它吧,一般它是一个安全的选项,即使你的硬件不支持HPET也不会造成问题,因为它会自动用8254替换。 Symmetric multi-processing support 这个也不用多讲了吧,如果你使用多处理器系统就选吧,如果你和我一样使用一个单CPU系统还是把它请出去吧。 ( Maximum number of CPUs (2-255) 这里用来配置让Linux最多支持几路CPU,根据你的需要选择。 Preemptible Kernel 这可是个新特性,几乎所有介绍2.6的文章都会提到,这就是可抢先式内核。也就是说被一些优先级很高的程序可以先与一些低优先级的程序执行,即使这些程序是在核心态下执行(这实际上仍然不是真正的抢先式内核)。从而减少内核潜伏期,提高系统的响应。当然在一些特殊的点的内核是不可抢先的,比如内核中的调度程序自身在执行时就是不可被抢先的。这个特性可以提高桌面系统、实时系统的性能,所以还是选上吧。 Machine Check Exception 如果你的系统出现一些问题比如CPU过热,内核将会在屏幕上打印相关信息来提醒你。这个功能是需要硬件支持的。你可以查看/proc/cpuinfo看看是否有mce标志,有的话就选吧。如果你十分十分的不幸,选了它之后出现问题,可以在启动时加nomce参数来关闭它。 Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4 打开这个选项将会检查你机器上可能存在的问题,如果有一个非致命错误出现将会自动的修复并且记录,这可以帮助你查出程序出现问题的原因,是一个不错的选项,当然它只能用在AMD Athlon/Duron / Intel Pentium 4这类CPU上。如果你正好在用它们中的一个你就选吧。 check for P4 thermal throttling interrupt. 如果打开这个选项,在P4的CPU温度过高(也就是P4的温控装置起作用)时会在屏幕上显示出相关的信息,根据你的情况选择吧。 < > Toshiba Laptop support 这个选项是针对Toshiba笔记本的,可以用来访问Toshiba的系统管理模式,也就是可以直接设置BIOS。不过要注意它只在Toshiba自己的BIOS中起作用。假如你有一台Toshiba笔记本,可惜它的BIOS是Phoenix的,那这个选项仍然是梁山军师----无用:) < > Dell laptop support 这个同上面的选项基本相同,自己看着办吧:) < > /dev/cpu/microcode - Intel IA32 CPU microcode support 这个选项将让你可以更新Intel IA32系列处理器的微代码,当然你还必须在文件系统选项中选择devfs才能正常的使用它。如果你把它译为模块你还需要在modprobe.conf中加上这一行alias char-major-10-184 microcode 内核本身并不带有微代码的二进制文件,你可以到这个网址去得到新的信息 < > /dev/cpu/*/msr - Model-specific register support 这个选项桌面用户一般用不到,它主要用在Intel的嵌入式CPU中的,这个寄存器的作用也依赖与不同的CPU类型而有所不同,一般可以用来改变一些CPU原有物理结构的用途,但不同的CPU用途差别也很大。 |
|
|
|
|
5楼 < > /dev/cpu/*/cpuid - CPU information support 这会在/dev/cpu中建立一系列的设备文件,用以让过程去访问指定的CPU。一般不用选。 < > BIOS Enhanced Disk Drive calls determine boot disk (EXPERIMENTAL) 这将可以打开实模式下BIOS中的增强磁盘设备服务,以决定从哪个磁盘上启动。这一般是安全的,不过大多数BIOS提供商都没有实现这个特性。 High Memory Support (off) 如果你有大容量的内存(超过4G)你要选它,以使内核可以使用这部分内存。偶是没这命啦这部分永远为OFF,如果你有你就ON吧。 [ ] Math emulation 在你的CPU上如果没有数学协处理器的话,打开这个选项可以让内核模拟一个,以提升浮点计算能力,不过慢的可以。如果你使用的不是古董CPU的话(486SX以前的)这一项你永远都不需要。 MTRR (Memory Type Range Register)support 在Intel p6家族的处理器中(Ppro、 PII和更新的)有一个内存类型范围寄存器,可用来控制处理器访问的内存范围。打开它一般可以提升显卡的显示性能,所以我们当然要在这说Y喽:) 第五项 Power management options (ACPI, APM)(高级电源管理) Power Management support 如果你想让你的Linux支持高级电源管理(也就是平常我们说的软关机、系统休眠等)需要选择它。 [ ] Software Suspend (EXPERIMENTAL) 选择这个选项你可以挂起你的计算机(有点象XP中的休眠),打开这项功能后,你可以使用swsusp或者shutdown -z 来挂起你的计算机。这样系统会将你当前正在进行的工作(也就是当前内存中的内容)作成一个镜象保存到你的交换分区中,在你下一次启动时使用启动参数“resume=/dev/你的交换分区”,内核就会将上一次的工作内核从镜象文件中恢复到内存,这可以大大提高系统的启动速度。当你不想恢复上次的工作时向内核传递参数“noresume"。不过系统启动后你的交换分区将不可以使用,你可以使用mkswap命令来重新格式化你的交换分区。这个功能不需要高级电源管理的支持。很不错的功能,我一直有用,大家也来试试吧:) [ ] Suspend-to-Disk Support 这个选项与上面的功能基本相同,不过更灵活一些,可以通过下面的子选项来指定一个专用的交换分区来保存内存镜象。 () Default resume partition 与上面的选项配合,来指定保存镜象的分区。 ACPI (Advanced Configuration and Power Interface) Support ---> 从这里进入ACPI电源管理的配置界面,要注意ACPI与APM不能同时使用,如果你同时配置了这两者,那么在系统启动时如果发现一个可工作的ACPI设备那么APM将被关闭,ACPI会被加载: ACPI Support 这个选项应该不用我多说了,要想让你的系统使用ACPI来管理你的电源就要选上它,另外要想让它起作用,你还要在系统中安装acpid守护程序。 Sleep States (EXPERIMENTAL) 选择这个选项可以使你的系统具有挂起的功能,也就是说你可以暂时中断你的工作,让你的系统处与一种低电能消耗的状态(sleep state),你此时的系统状态会保存在内存或者磁盘上(取决于挂起的深度),当你需要时再恢复到正常的工作状态。但由于各种系统之间的差别,目前这项功能并不完善。只有很少的设备可以完美的支持这个特性,所以不建议一般用户使用它。 < > AC Adapter 这是用来支持移动系统中的交流适配器的,以指示当前系统是不是在使用交流电,对于台式机不需要这个选项。 < > Battery 这个选项用于通过/proc/acpi/battery来向用户提供移动系统中的电池状态信息。同上面那个选项一样对台式机没有作用。 <*> Button 这个选项用于注册基于电源按钮的事件,比如power, sleep等,当你按下按钮时事件将发生,一个守护程序将读取/proc/acpi/event,并执行用户在这些事件上定义的动作比如让系统关机。 <*> Fan 这个选项提供对系统风扇的控制支持,可以通过用户层的程序来对系统风扇进行控制(比如打开,关闭,读取当前风扇的运行状态等,不过只有极少数的硬件支持它)。 |
|
|
|
|
6楼 <*> Processor 打开这个选项将让你的系统具有处理IDIE状态的能力,也就是说可以让你的处理器在空闲时节省电能。个人认为这个选项是一定要选的。 <*> Thermal Zone 当你的系统温度过高时,ACPI可以利用这个选项来控制你的系统,及时调整系统的工作状态以保护你的CPU,非常棒的一个特性一定要选呀,要不然也就不用使用ACPI了。(当然这需要硬件的支持) < > ASUS/Medion Laptop Extras 这主要是为ASUS生产的笔记本电脑准备的,以提供对这些系统上那些额外的按钮们的支持,用户可以通过它们来打开或者关闭LCD的背光,调整亮度、定制LED的闪烁指示等功能。用户可以通过/proc/acpi/asus来改变这些设置。 < > Toshiba Laptop Extras 这个选项是对Toshiba笔记本提供特别支持的,它的作用同上面的选项基本相同,如果你有一台这样的本本的话就选它吧。 [ ] Debug Statements 如果选择它当ACPI出现错误时会打印出详细的信息,这将会增加内核的体积大约50k,如果没有必要还是不要选它吧。 [ ] Relaxed AML 选择它的话ACPI翻译器将会放松对AML的错误检查,一些笔记本电脑可能需要它才能正常的使用ACPI(一些糟糕的桌面机可能也需要它,如果你的系统使用ACPI时出现问题不妨选上它试试) #################################### 1.首先确定内核支持ppp.如下: Network device support ---> <*> PPP (point-to-point protocol) support <*> PPP support for async serial ports <*> PPP support for sync tty ports 2.安装rp-pppoe. 3.然后再来设置ADSL。这一处,我们要用命令。 #adsl-setup Welcome to the Roaring Penguin ADSL client setup. First, I will run some checks on your system to make sure the PPPoE client is installed properly... Looks good! Now, please enter some information: USER NAME >>> Enter your PPPoE user name (default XXX): 在这里输入ADSL的用户名 INTERFACE >>> Enter the Ethernet interface connected to the ADSL modem For Solaris, this is likely to be something like /dev/hme0. For Linux, it will be ethn, where 'n' is a number. (default eth0):上网用的网卡接口. 默认eth0 Do you want the link to come up on demand, or stay up continuously? If you want it to come up on demand, enter the idle time in seconds after which the link should be dropped. If you want the link to stay up permanently, enter 'no' (two letters, lower-case.) NOTE: Demand-activated links do not interact well with dynamic IP addresses. You may have some problems with demand-activated links. >>> Enter the demand value (default no):是按需拨号还是持续拨号.按需是填写空闲时间如60(秒).默认的是持续拨号. DNS Please enter the IP address of your ISP's primary DNS server. If your ISP claims that 'the server will provide DNS addresses', enter 'server' (all lower-case) here. If you just press enter, I will assume you know what you are doing and not modify your DNS setup. >>> Enter the DNS information here:域名解析服务器.可填server自动寻找.也可直接填地址. PASSWORD >>> Please enter your PPPoE password:输入密码 >>> Please re-enter your PPPoE password:再输入一次 FIREWALLING Please choose the firewall rules to use. Note that these rules are very basic. You are strongly encouraged to use a more sophisticated firewall setup; however, these will provide basic security. If you |
|
|
|
|
7楼 set up firewalling yourself. Otherwise, the firewall rules will deny access to all standard servers like Web, e-mail, ftp, etc. If you are using SSH, the rules will block outgoing SSH connections which allocate a privileged source port. The firewall choices are: 0 - NONE: This script will not set any firewall rules. You are responsible for ensuring the security of your machine. You are STRONGLY recommended to use some kind of firewall rules. 1 - STANDALONE: Appropriate for a basic stand-alone web-surfing workstation 2 - MASQUERADE: Appropriate for a machine acting as an Internet gateway for a LAN >>> Choose a type of firewall (0-2):防火墙设置. 0-无防火墙 1-基本工作站. 2-局域网网关. ** Summary of what you entered ** Ethernet Interface: eth0 User name: XXX Activate-on-demand: No DNS: Do not adjust Firewalling: MASQUERADE >>> Accept these settings and adjust configuration files (y/n)? 确认保存退出. 连接adsl使用命令:adsl-start 断开adsl使用命令:adsl-stop 可能遇到一种情况是.adsl拨号上网后.打不开网站.也PING不通.确认前面步骤没错的情况下.拨号连上后使用命令: route add default ppp0 二. 如果是ADSL做网关.开机直接上网那种..就只用设置好IP. DNS. 网关(ADSL的IP址)即可. ##################################### 一,什么是BabyLinux 二,为什么要做这样一个linux 三,什么人适合读这篇文档 四,应该具备的知识 五,linux系统引导过程简介 六,编译内核 七,编译busybox 八,制作根文件系统 九,制作ramdisk映象文件 十,内核与busybox的整合 十一,安装测试和内容调整 十二,babylinux中的BUG 十三,接下来要做的事情 十四,参考文献 一,什么是BabyLinux BabyLinux不是一个完整的发行版,他是利用原有的一套完整的linux系统的内核原代码和编译工具,利用busybox内建的强大功能,在一张软盘上做的一个很小的linux系统.他具备一个linux系统的基本特征,支持linux系统最常用的一百多个命令,支持多种文件系统,支持网络等等,你可以把他当做一张linux起动盘和修复盘来用,你也可以把他当做一个静态路由的路由器软件,当然,你也可以把他当做一个linux玩具,向你的朋友炫耀linux可以做的多么小.我把他叫做BabyLinux因为他很小巧,小的很可爱,像一个刚刚出生的小baby. 二,为什么要作这样一个linux 先说说我一开始的想法,当我一开始接触linux的时候,看到书上说,linux通常安装只需要60M左右的空间,但是我发现装在我硬盘上的Redhat 6.0确要占据好几百M的空间.为什么我的linux这么大呢? 后来我发现,装在我机器上的那么多东西只有不到30%是我平时常用的,还有30%是我极少用到的,另外的40%基本上是不用的.于是,我和大多数初学者一样,开始抱怨,为什么linux不能做的精简一点呢?于是,我萌发了自己裁减系统的想法.可惜那个时候我还没有听说过有LFS和Debain.等到我积累了足够的linux知识后,我开始制作这样一个小系统. 制作这样一个小系统最大的意义在于,你可以通过制作系统了解linux的启动过程,学会ramdisk的使用,让你在短时间内学到更多的linux知识.当然,你会得到很大的乐趣.这个项目只是做一个具有基本特征的linux系统,如果你想自己做一个具有完整功能的linux,请阅读Linux From Scratch (LFS)文档. 三,什么人适合读这篇文档 如果你是一个linux爱好者,并且很想了解linux的启动过程和系统的基本结构,而且是一个喜欢动手研究小玩意的人,那么这个文档可以满足你的需求.如果你仅仅是用linux来做一些普通的日常工作,而不在乎你的linux到底怎么工作,那么这份文档也许不太适合你.另外,如果你是linux爱好者,但是目前还是一个刚刚入门的newbi,我建议你先把linux命令学好.不过我想我会尽可能的把这份文档写详细一些,如果你有足够的毅力,或许一个newbi也能成功做一个babylinux.或者,你遇到一件很不巧的事情,比如你的老婆来例假了,你的这个周末就泡汤了,那么阅读这篇文档并做一个linux小玩具可以打发你的时间. |
|
|
|
|
8楼 四,应该具备的知识 在做一个babylinux之前,你应当已经会应用linux最常用的命令.并且至少有一次成功编译并安装系统内核的经历,会通过编译源代码来安装软件.如果你具备了这些条件,那么做这样一个小系统会很顺利,如果你还没有掌握这些知识,你可能会遇到一些困难.但是只要有毅力,也可以成功.你不需要具备编程的知识,因为我的目标是:让具有中等以上linux水平的爱好者可以通过阅读文档轻松完成这个项目.关于一张软盘上的linux还有一个很著名的linux叫LOAP (Linux On A Floppy) 但是他是由比较专业的人员需要编写很多程序完成的.而且没有关于他制作过程的文档. 五,linux系统引导过程简介 首先,主板的BIOS会读取硬盘的主引导记录(MBR),MBR中存放的是一段很小的程序,他的功能是从硬盘读取操作系统核心文件并运行,因为这个小程序太小了,因此通常这个小程序不具备直接引导系统内核的能力,他先去引导另一个稍微大一点的小程序,再由这个大一点的小程序去引导系统内核.在linux系统中这样的小程序有LILO和GRUB.在这个项目中,我决定用LILO来做系统引导程序.在软盘上启动linux系统的过程和在硬盘上启动的过程相似. Linux系统内核被引导程序装入内核并运行后,linux内核会检测系统中的各种硬件.并做好各种硬件的初始化工作,使他们在系统正式运行后能正常工作.之后内核做的最后一个工作是运行 /sbin下的init程序,init是英文单词initialization(初始化)的简称,init程序的工作是读取/etc/inittab文件中描述的指令,对系统的各种软硬件环境做最初化设定.最后运行mingetty等待用户输入用户名登录系统.所有的工作就这么简单,虽然linux启动的时候有很多内容,看上去十分高深,但是都不过是对这个过程的扩充.明白了这个道理,你可以写一些脚本程序让他在系统启动的特定时间运行完成任务.事实上系统内核并不关心/sbin下的init是不是真的init,只要是放在/sbin下名叫init的可执行程序他都可以执行.可以做以下实验: 编写一个非常简单的C程序: main() { printf(“hello,world! ”); } 保存后以init.c保存他,并用gcc编译. #gcc –-static -o init init.c 这里的--static 参数告诉gcc把这个程序静态联接,这样这个程序不倚赖任何库就能运行.把编译好的init程序拷贝到/sbin下,备份好原来的那个.重新启动系统最后系统的输出结果是: hello,world! 然后停在那里.做这个实验以前先确定你知道如何把系统恢复到原来的状态,有一个简单的方法,在内核启动前给他加上init=参数,比如你原先的init被你改成了init.bak 只要在启动的时候给内核加上init=/sbin/init.bak就可以用原来的init程序启动系统. 做完以上实验,就明白了内核和init程序之间的关系.此外,init程序不一定是一个二进制可执行程序,他可以是一个bash脚本,一个指向另一个程序的联接,他的位置也并不一定要在/sbin下,只要在启动内核时,给内核加上init参数就能被运行,比如,开始时给内核加上init=/bin/bash参数,内核在最后一步就直接运行bash给出提示符,不用登录系统就可以输入命令了.其功能类似单用户模式启动系统. /sbin/init 程序只是内核默认运行的第一个程序. 六,编译一个linux系统内核 1,编译前的规划和准备 在编译内核前,请先确定你的需求,把你的需求罗列成一张详细的表格.你需要让内核支持什么硬件,支持多少种分区类型和文件系统,支持哪些网卡,支持哪些网络协议.等等.请尽可能详细的罗列这些内容,但是你也不要太贪心,因为你所有能利用的空间只有1440K,如果你编译出一个大于1440K或很接近这个数字的内核,你的这个项目就不能完成了,你已经没有空间再放ramdisk映象文件,除非你原意再多出一张软盘,做一个两张软盘的小linux系统.对于声卡驱动之类,我劝你还是放弃吧,因为一个声卡驱动也许只让你的内核增大了十多K,但是你有了一个声卡驱动就务必要有一个播放器吧,否则声卡驱动就没有意义,可一个播放器的大小可不是一张软盘可以装得下的.在我先前制作的babylinux内核有900多K,其中,文件系统部分站了大部分,因为我的目标是把他做成一个系统修复盘.因此我在内核中编译7种文件系统的支持,每减少一个文件系统就可以减小几十甚至200多K的内核大小.越是复杂,越是安全的文件系统,其支持模块也越大,比如在linux下FAT模块只有32K,VFAT只有17K,但是ext3的模块就有86K,JFS达到216K,reiserfs模块是224K,可以想像,编译一个支持7个文件系统的900多K的内核,文件系统部分就占了600K以上的空间,所以如果某一个文件系统是你根本不用的,那么还是不要编译进内核把,这样至少可以省下100多K的空间.对于其他的驱动,比如网卡,通常大小只有8,9K,最大的也不过10多K,因此可以把常用的网卡芯片的驱动都编译进去.另外如果你想让你的babylinux支持U盘,那么scsi的驱动模块也是不可小看的,他通常要接近150K,因为U盘是被当做scsi设备来驱动的.另外你还需要让你的内核支持即插即用,这些都是不小的空间开销,我的建议是你放弃一两个你不用的文件系统.总之,你最后编译出来的内核大小最好不要超过900K,否则你在busybox里只能编译进去很少的命令. |
|
|
|
|
9楼 在我编译的busybox中,我编译进去120多个命令,基本上把busybox支持的命令都包括进去了.加上小系统所必需的文件系统目录,/dev下的设备文件,以及/etc下几个必需的配置文件,做成ramdisk压缩后的大小是440多K, 加上900K左右的内核刚好可以放入一张1440K软盘,请注意,你应该留下至少50K的空间,因为我们要在软盘上创建一个ext2文件系统,而文件系统本生需要占据大概25K的磁盘空间.另外lilo的引导文件boot.b的大小是5.7K,还有装上lilo后自动产生的map文件也要10多K的空间,map文件的具体大小由内核安装的实际大小决定,通常不会超过30K. 综上所述,请遵循下面的公式: 内核大小+文件系统压缩印象文件+50K <= 1440K 另外一点需要说明的是:以上所罗列的文件系统模块大小是察看我现在使用的Redhat 9 的 /lib/modules下的模块文件得到的,实际编译进内核大小会小一点,因为我们用make bzImage 在内核源代码目录树下生成的内核是经过压缩过的. 如果你对以上说的内容不太明白也没有关系,我会在下面的内容中做详细的说明. 2,必需编译进内核的内容 首先,我们制作的这个小系统是基于一张软盘的,因此,你的内核必需支持软盘.另外对IDE硬盘和cdrom的支持也是不可少的,否则做出来的babylinux就没有实用价值,因为他不能访问硬盘和光盘上的内容这样的linux虽然可以做的更小,但是制造一个完全没有用的东西是浪费时间.其他的包括framebuffer等,如果你需要支持在字符界面下以高分辨率显示,以看到更多的屏幕内容,那么就必需把framebuffer支持编译进内核,此外在高分辨率下使用的8x8字体也必需编译进去.否则即使你给内核传递了vga= 参数,内核会因为没有可用的小字体而自动转跳到低分辨率模式下,这是以前困扰我好几天想不明白的事情,后来通过反复试验才明白原来是缺少字体的文体.这里我先大致提一下需要注意的事情.在下一小节具体编译时,我会继续就某些细节问题说明. 3,关于内核的版本 我是在Redhat 9 linux系统下打造的babylinux小系统.使用的是Redhat 9 自带的2.4.20版的内核. 为什么我不用最新的2.6的内核? 一开始我也企图用最新的内核,但是通过试验我发现,在用最新的2.6.9内核的情况下,我编译一个all-no的(即所有内容都选N,不支持任何硬件,只有一个最基本的内核)最小化内核就要460K左右,如果我在这个基础上再加入几种文件系统和必要的驱动,那么内核的大小就不能装下一张1440K 的软盘,而我用2.4.20的内核编译一个最小化的内核只需要217K,的大小.如果优化了gcc参数他还能再小些.这样我就立即省下了200多K的空间,在平时,200多K的内容微不足道,但是在babylinux里,这个数目是整个空间的 1/7,相当于一个reiserfs文件系统模块的大小.当然,我也尝试了2.2以及更老的内核,但是他们缺少我需要的东西,因此最后权衡下来用2.4的内核是比较合理的.如果你用的是2.6内核的FC系统,那么最好还是去下载一个2.4版的内核,www.kernel.org 有各个时期的内核可以下载. 4, 内核的配置 如果你对linux内核的配置和编译已经很熟悉了,请跳过这一段,直接看busybox的编译. 以root身份登录系统 进入/usr/src/linux目录 [root@gucuiwen root]# cd /usr/src/linux 如果你下载了一个2.4版本的内核,为了避免麻烦,请将他拷贝到/usr/src下,然后接压缩,再做一个指向他的名为linux的链接.虽然这并不是必需的,但是根据我以往的经验,如果我把linux源代码放在其他目录下解开并编译,偶然会有一些莫名其妙的小问题发生. #cp linux-2.4.20.bz2 /usr/src/ #cd /usr/src #tar xfvj linux-2.4.20.bz2 如果是tar.gz格式,可以这样解开 #tar xfvz linux-2.4.20.tar.gz 为了方便,做一个到目录linux-2.4.20的连接: #ln -s linux-2.4.20 linux 进入linux源代码目录: #cd linux 清理源代码树: #make mrproper 运行配置程序: |
|
|
|
|
10楼 code maturity level options 先选择N,当我们配置好常规的东西,要加入framebuffer支持时再将这一项选择Y,因为在2.4.20中,framebuffer支持尚属于实验性代码.如果不在code maturity level options选择为Y,将不能配置framebuffer. Loadable module support 选择N,为了简化系统的制作,我在这个项目中不选择可加载内核模块的支持. processor type and features processor family 中选择你需要的CPU类型,如果你想让老至386,新到P4的CPU都能运行babaylinux那么请选择386CPU,否则请按自己的实际情况选择. 其他选项都选择N.这些在babylinux中都是不需要的. General setup networking support 选择Y PCI support 选择Y 除非你不用PCI设备,不过一般人都是需要的,因为现在网卡大部分是PCI的. System V ipc 选择Y systrl support选择Y kernel support for ELF 选择Y 其余内容都可以选择N,如果有特殊需求,比如的网卡是ISA的,那么请将相应的内容选上.但是不能贪心,时刻牢记,我们能利用的空间只有 1440K ,内核的大小绝不能超过 900K,任何不必要的东西都应该从内核中去除. memory technology devices (MTD) Parallel port support Plug and Play configuration 以上三个大项中的所有内容选择N block devices Normal floppy disk support Loopback device support RAM disk support initial RAM disk (initrd) support Per partition statics in /proc/partitions 以上几项选择Y,其余全部选择N. 这里的选项比较重要,我想重点说明一下.对于软盘的支持,那是不必说的,那是必备的. loopback device 即回环设备,我们平时用命令 #mount -o loop somecd.ISO /mnt/cdrom 挂装光盘映象文件,或者其他文件系统映象文件时就用到了内核中的loopback 模块,如果没有编译进这个模块,你将不能用上面的命令挂装光盘映象和文件系统映象. 个人认为这个功能是非常重要的,所以编译了进去. RAM disk support 即内存磁盘(比较贴切的说法是虚拟磁盘,即拨出一部分内存当做磁盘用).这是制作babylinux项目中的核心内容,由于一张软盘的空间有限,babylinux的根文件系统是用gzip压缩法高度压缩的,在运行时,将解压缩后的文件拷贝到一个RAM disk运行,所以在运行时,你在根文件系统上的所有操作实际上是在内存上进行的.但是在形式上和在真正的磁盘上运行一样.只不过放在RAM disk上的所有内容会在系统关机后全部消失. 不仅在运行babylinux时用到ramdisk,我们在制作压缩的根文件系统时也要用到ramdisk,学习ramdisk的使用是做一个babylinux的重要目的之一. 在linux中,还支持另外一种虚拟磁盘,叫做shm, (shared memory),这种虚拟磁盘机制比ramdisk更加先进,ramdisk的大小是固定的,由编译内核时候的default ram disk size 决定.默认为4096K(4M),也可以在内核装载前加上ramdisk_size=参数来决定他的大小,但是系统一旦启动,ramdisk的大小是不能改变的,而shm的大小却动态的改变.默认情况下为物理内存的一半,当系统需要更多内存的时,他就自动缩小.系统内存富余时,他自动增大,这样可以充分灵活的利用内存空间,shm通常用来作为系统的磁盘高速缓存,存放系统运行中的临时文件等.redaht 的linux在默认情况下都有shm的支持,可以用mount和df察看他的挂装点和大小,如下命令: [root@gucuiwen linux]# mount /dev/hda1 on / type ext3 (rw) none on /proc type proc (rw) usbdevfs on /proc/bus/usb type usbdevfs (rw) none on /dev/pts type devpts (rw,gid=5,mode=620) /dev/hda6 on /home type ext3 (rw) /dev/hda5 on /oracle type ext3 (rw) none on /dev/shm type tmpfs (rw) /dev/hda7 on /var type ext3 (rw) [root@gucuiwen linux]# df -h |
|
|
|
|
11楼 /dev/hda1 2.9G 2.7G 26M 100% / /dev/hda6 3.8G 1.8G 1.8G 50% /home /dev/hda5 5.7G 677M 4.8G 13% /oracle none 125M 0 125M 0% /dev/shm /dev/hda7 711M 91M 584M 14% /var 虽然shm有这么多的优点,我还是选择了ramdisk,因为ramdisk可以很方便地在系统启动的时候加载,而shm却没那么容易,下面就来讲一下关于内核启动时加载ramdisk映象的相关内容. initial RAM disk (initrd) support 即初始化ramdisk支持,这个选项让内核有能力在内核加载阶段就能装入RAMDISK,并运行其中的内容,否则只能在系统运行阶段用ramdisk ,我们平时在编译了一个新内核后,如果你的根文件系统用的是ext3,而你没有把ext3编译进内核,而只作为一个模块编译了,那么就需要用mkinitrd命令做一个initrd (initializtion ramdisk),这个ramdisk里放了ext3的模块,这样内核在加载根文件系统前就能正确识别ext3文件系统.否则,内核加载的最后一步就会出现kernel panic cant not find init .... 的错误. 在babylinux项目中,这个选项是必需的,这里的作用是把解压的根文件系统映象装入ramdisk. Per partition statics in /proc/partitions 这个选项不是必需的,但是我发现如果我不把这个功能编译进内核,那么当我在挂装文件系统的时候会有些小问题,比如我不能以简写的挂装命令来挂装文件系统.我不确定到底是不是这个选项的关系,但是把这个选项编译进内核只增大一点点内核空间,所以为了避免麻烦,我把他编译了进去. Multi-device support (RAID and LVM) Cryptography support (CryptoAPI) 这两个大项全部选择N,因为在个人用PC上,及少牵涉到这两项,如果你真的有RAID设备或者LVM,那么就自己摸索着配置一下吧. Networking options 这一大项中,只需要把下列项目编译进内核: Packet socket :mmapped IO TCP/IP networking 对于IP:advanced router这项,如果你想重点把babylinux用做静态路由软件,那么把这项编译进去,而对于network packet filtering (replaces ipchains)这一项,没有必要编译进去了,因为busybox没有提供iptables工具来设置包过滤防火墙.同样,unix domain sockets这项也不必选择,只有运行X的情况下才需要选这项. Telephony Support 选择N ATA/IDE/MFM/RLL support 选择Y,然后下面的'IDE,ATA and ATAPI Block Devices'按钮就被激活 下面几项请选择Y,其余都可以是N. Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support Include IDE/ATA-2 DISK support Auto-Geometry Resizing support Include IDE/ATA CDROM support 如果你的内核要运行在一台很老的pentium或486上,请把CMD640 chipset bugfix/support编译进去,因为那时候主板的CMD640 IDE控制芯片大多有莫名其妙的BUG,把这项编译进去会修复这个bug. 下面几个大项: SCSI support Fusion MPT device support IEEE 1394(FireWire) support I2O device support 全部选择N,这里可能有你想要的好东西,比如1394接口驱动,但是在babylinux上意义不大,而且我们的空间只有1440K. 下面一个大项: Network device support 选择Y,这样就可以支持网卡了,其余都选择N.然后点Ethernet(10 or 100 Mbit)按钮选择你需要的网卡驱动,你可以把最常见的几种Reltek8139,NE2000,3COM等网卡编译进内核.虽然网卡的驱动通常都很小,但是不要太贪心,选2~3个就足够了,否则你的内核就会一下子多出几十K.在我先前编译的babylinux内核中,我把via-rhine网卡编译了进去,是因为我打造babylinux的机器上只有一块那个芯片的网卡. 如果你发现你需要的网卡是灰色的,不能点,那么先确定他上一级的选项已经点了,比如你想选NE2000的网卡,就必需先选择ELSA,VLB,PCI and on board controllers.如果还不能点,那么请确定是否已经把PCI的支持选项选上了,(在Geneal setup)里.没有PCI的支持,PCI的网卡将不能选. |
|
|
|
|
12楼 可能你是个有钱人,在自己的PC上用千兆网卡,那么请在千兆网卡那一栏选择. 接下来几个大项: Amateur Radio support IrDA (infrared) support ISDN subsystem Old CD-ROM drivers (not SCSI,not IDE) Input core support 全部选择N. 接下来的Charcter devices是很重要的一项,他和Bloack devices一样重要,我将重点讲述. 除了Virtual terminal和Support for console on terminal两项,其他全选N. Virtual terminal 即虚拟终端,这是一般linux必备选项.否则你的linux启动后,在屏幕看不到任何东西.另外还负责键盘输入信息等等.只有在某些嵌入式linux应用场合才会不要这个选项,因为这些linux通常都不用操作. Support for console on terminal 在虚拟终端上的控制台.他支持在终端上各种信息的输出,这也是必备的. 接下来的几个大项: Multimedia devices Crypto Hardware support 全部选择N. 再接下来的那部分File sytems可是重头戏喔. 这部分不用我太罗嗦了吧,自己需要支持什么就选什么. 但是其中有三个是你必需选的: /proc file system support 缺了他,很多命令和软件就不能运行. Second extended fs support BabyLinux的基本文件系统. ISO 9660 CDROM filesytem support 除非你不想用光盘. 另外,诸如磁盘限额(Quota support),Reiserfs的DEBUG模式(Enable reiserfs debug mode) 等就不用编译进去了.这些东西意义不大,确要无端的增大内核大小.请牢记一点:编译出来的内核大小不要超过900K. Tip:是不是看的很累啊,我写得更累,别急,内核配置部分马上要好了. 最后一个Console drivers 这是支持linux在字符模式下高分辨率显示的内核模块.前面三个全部选择Y, Frame-buffer support按钮是灰色的不能选,别急,回到第一个大选项: Code maturity level options 选择Y,就可以激活这个按钮了. 下面几个选项需要选择Y: Support for framebuffer devices VESA VGA graphics console 你也可以选择其他的显卡驱动,比如nVidia的,但是VESA和VGA是通用性最好的,只要不是几十年前的黑白显卡(我只听说过,没见过),都兼容VESA和VGA,因此,为了制作好的BabyLinux的通用性,请选择这个驱动. Support only 8 pixels wide fonts 这个一定要选,否当你给内核传递vga=788参数,让linux在字符界面下高分辨率显示的时候,系统会因为找不到合适的小字体而返回到低分辨率模式. 好了!所有内核的配置工作到这里就全部完成了,剩下的几个大项全部选N就行了. 保存后退出,配置程序会自动生成一个隐藏的配置文件.config 下面是我配置好的.config文件内容.如果你懒的自己去配置,那么直接把这个.config拷贝到你的源代码目录下就能直接用了.(已经去掉了#开头的注释行) CONFIG_X86=y CONFIG_UID16=y CONFIG_EXPERIMENTAL=y CONFIG_M586=y CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INVLPG=y CONFIG_X86_CMPXCHG=y CONFIG_X86_XADD=y CONFIG_X86_BSWAP=y CONFIG_X86_POPAD_OK=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_X86_L1_CACHE_SHIFT=5 CONFIG_X86_USE_STRING_486=y CONFIG_X86_ALIGNMENT_16=y CONFIG_X86_PPRO_FENCE=y CONFIG_NOHIGHMEM=y CONFIG_NET=y CONFIG_PCI=y CONFIG_PCI_GODIRECT=y CONFIG_PCI_DIRECT=y CONFIG_SYSVIPC=y CONFIG_SYSCTL=y CONFIG_KCORE_ELF=y CONFIG_BINFMT_ELF=y CONFIG_BLK_DEV_FD=y CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=4096 CONFIG_BLK_DEV_INITRD=y CONFIG_PACKET=y CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IDE=y CONFIG_BLK_DEV_IDE=y CONFIG_BLK_DEV_IDEDISK=y CONFIG_IDEDISK_MULTI_MODE=y CONFIG_BLK_DEV_IDECD=y |
|
|
|
|
13楼 CONFIG_NETDEVICES=y CONFIG_NET_ETHERNET=y CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_VT=y CONFIG_VT_CONSOLE=y CONFIG_REISERFS_FS=y CONFIG_EXT3_FS=y CONFIG_JBD=y CONFIG_FAT_FS=y CONFIG_VFAT_FS=y CONFIG_RAMFS=y CONFIG_ISO9660_FS=y CONFIG_JFS_FS=y CONFIG_NTFS_FS=y CONFIG_PROC_FS=y CONFIG_EXT2_FS=y CONFIG_MSDOS_PARTITION=y CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" CONFIG_VGA_CONSOLE=y CONFIG_VIDEO_SELECT=y CONFIG_VIDEO_IGNORE_BAD_MODE=y CONFIG_FB=y CONFIG_DUMMY_CONSOLE=y CONFIG_FB_VESA=y CONFIG_VIDEO_SELECT=y CONFIG_FBCON_CFB8=y CONFIG_FBCON_CFB16=y CONFIG_FBCON_CFB24=y CONFIG_FBCON_CFB32=y CONFIG_FBCON_FONTWIDTH8_ONLY=y CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y 5,编译内核 #make dep #make bzImage 下面是最后编译结果: Boot sector 512 bytes. Setup is 4733 bytes. System is 845 kB make[1]: Leaving directory `/usr/src/linux-2.4.20-8/arch/i386/boot' 我用上面的配置得到了一个845k的内核. 编译好的内核放在/usr/src/linux-2.4.20-8/arch/i386/boot下.将他拷贝在一个安全的地方备用. 建立一个专放babylinux材料的目录 #mkdir /babylinux 建立一个做babylinux根文件系统的目录 #mkdir /babylinux/rootfs 备份内核 #cp /usr/src/linux-2.4.20-8/arch/i386/boot/bzImage /babylinux/ 七,编译busybox 1,busybox简介 busybox是一个集成了一百多个最常用linux命令和工具的软件,他甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却只有区区1M左右的大小.我们平时用的那些linux命令就好比是分力式的电子元件,而busybox就好比是一个集成电路,把常用的工具和命令集成压缩在一个可执行文件里,功能基本不变,而大小却小很多倍,在嵌入式linux应用中,busybox有非常广的应用,另外,大多数linux发行版的安装程序中都有busybox的身影,安装linux的时候案ctrl+alt+F2就能得到一个控制台,而这个控制台中的所有命令都是指向busybox的链接. Busybox的小身材大作用的特性,给制作一张软盘的linux带来了及大方便. 2,busybox的用法 可以这样用busybox #busybox ls 他的功能就相当运行ls命令 最常用的用法是建立指向busybox的链接,不同的链接名完成不同的功能. #ln -s busybox ls #ln -s busybox rm #ln -s busybox mkdir 然后分别运行这三个链接: #./ls #./rm #./mkdir 就可以分别完成了ls rm 和mkdir命令的功能.虽然他们都指向同一个可执行程序busybox 但是只要链接名不同,完成的功能就不同,busybox就是这么的神奇. 很多linux网站都提供busybox的源代码下载.目前版本是busybox1.0正式版. 3,配置busybox busybox的配置程序和linux内核菜单配置方式简直一模一样.熟悉用make menuconfig方式配置linux内核的朋友很容易上手. #cp busybox-1.00.tar.gz /babylinux #cd /babylinux #tar xvfz busybox-1.00.tar.gz #cd busybox-1.00 #make menuconfig 下面是需要编译进busybox的功能选项,其他的可以根据需要自选,但是同样不要太贪心. General Configuration应该选的选项 Show verbose applet usage messages Runtime SUID/SGID configuration via /etc/busybox.conf Build Options Build BusyBox as a static binary (no shared libs) 这个选项是一定要选择的,这样才能把busybox编译成静态链接的可执行文件,运行时才独立于其他函数库.否则必需要其他库文件才能运行,在单一个linux内核不能使他正常工作. |
|
|
|
|
14楼 Installation Options Don't use /usr 这个选项也一定要选,否则make install 后busybox将安装在原系统的/usr下,这将覆盖掉系统原有的命令.选择这个选项后,make install后会在busybox目录下生成一个叫_install的目录,里面有busybox和指向他的链接. 其他选项都是一些linux基本命令选项,自己需要哪些命令就编译进去,一般用默认的就可以了. 配置好后退出并保存. 4,编译并安装busybox #make #make install 编译好后在busybox目录下生成子目录_install,里面的内容: drwxr-xr-x 2 root root 4096 11月 24 15:28 bin lrwxrwxrwx 1 root root 11 11月 24 15:28 linuxrc -> bin/busybox drwxr-xr-x 2 root root 4096 11月 24 15:28 sbin 其中可执行文件busybox在bin目录下,其他的都是指向他的符号链接. 我编译出来的busybox可执行文件是935K,加上符号链接,整个_install目录是952K.加上845K的内核不是已经超过1440K了吗?别担心,我们将对整个根文件系统做大幅度的压缩. 八,制作根文件系统 1,基本目录结构 #cd /babylinux/rootfs #mkdir etc usr var tmp proc home root dev 其中etc,proc和dev是一定要建的,bin和sbin不用建,因为busybox中已经有了. 其他的可以象征性的建几个就可以了. 拷贝busybox #cp -R /babylinux/busybox-1.00/_install/* /babylinux/rootfs/ 2,建立设备文件名 #cd /babylinux/rootfs/dev 你可以用mknod手工建立,也可以直接从原系统的/dev目录下拷贝过来. 手工建立的方法: #ls -l /dev/console crw------- 1 root root 5, 1 11月 30 09:02 /dev/console 这样就查看到了console设备的主设备号是5,辅设备号是1,是一个标记为C的字符设备. 于是,我们可以用mknod建立一个同样的设备文件: #mknod console c 5 1 但是手工方法建立太麻烦了,通常直接从/dev下把需要的设备文件拷贝过来. 这些设备文件是特殊文件,在拷贝时一定要加上-R参数才能拷贝. #cp -R /dev/console ./ #cp -R /dev/null ./ #cp -R /dev/zero ./ ... 以下是我认为需要的设备名: cdrom fd0 hda14 hda4 hdb11 hdb19 hdc hdc16 hdc6 hdd13 hdd3 loop2 ram2 console fd0H1440 hda15 hda5 hdb12 hdb2 hdc1 hdc17 hdc7 hdd14 hdd4 loop3 tty0 fb hda hda16 hda6 hdb13 hdb3 hdc10 hdc18 hdc8 hdd15 hdd5 loop4 tty1 fb0 hda1 hda17 hda7 hdb14 hdb4 hdc11 hdc19 hdd hdd16 hdd6 loop5 tty2 fb1 hda10 hda18 hda8 hdb15 hdb5 hdc12 hdc2 hdd1 hdd17 hdd7 null tty3 fb2 hda11 hda19 hdb hdb16 hdb6 hdc13 hdc3 hdd10 hdd18 hdd8 ram tty4 fb3 hda12 hda2 hdb1 hdb17 hdb7 hdc14 hdc4 hdd11 hdd19 initctl ram0 tty5 fb4 hda13 hda3 hdb10 hdb18 hdb8 hdc15 hdc5 hdd12 hdd2 loop1 ram1 zero 其中,fd0,hda,ram,ram1,tty1,null,zero,loop1,fb0,fb等是必备的. 其它的hda,hda1,hdb等可以根据实际需要决定.但是上表中的选择是比较合理的,即能满足大部分的需要,有没有不用的设备浪费空间.注意,千万不要把/dev下的设备全拷贝过来,那将产生大约420K的/dev目录,这对babylinux来说太大了. 3,建立etc目录下的配置文件 busybox.conf group inittab motd passwd resolv.conf shadow- fstab init.d issue mtab profile shadow 其中init.d是一个目录,从busybox-1.00源代码目录下拷贝过来. #cp -R /babylinux/busybox-1.00/examples/bootflopyp/etc/init.d /babylinux/rootfs/etc/ busybox.conf是一个空文件. 其他文件的内容如下: fstab /dev/fd0 / ext2 defaults 0 0 none /proc proc defaults 0 0 /dev/cdrom /mnt/cdrom udf,iso9660 noauto,owner,kudzu,ro 0 0 /dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0 |
|
|
|
|
15楼 root:x:0:root inittab ::sysinit:/etc/init.d/rcS ::askfirst:/bin/sh tty2::respawn:/bin/getty 38400 tty2 tty3::respawn:/bin/getty 38400 tty3 tty4::respawn:/bin/getty 38400 tty4 # Stuff to do when restarting the init process ::restart:/bin/init # Stuff to do before rebooting ::ctrlaltdel:/bin/reboot ::shutdown:/bin/umount -a -r ::shutdown:/bin/swapoff -a issue Baby Linux release 0.1 motd mtab passwd root::0:0:root:/root:/bin/ash profile # /etc/profile: system-wide .profile file for the Bourne shells echo echo export PS1="[u@h w]$" echo "Done" alias ll='ls -l' alias du='du -h' alias df='df -h' alias rm='rm -i' echo resolv.conf nameserver 202.96.209.5 nameserver 202.96.209.6 shadow root:$1$$adltAB9Sr/MSKqylIvSJT/:12705:0:99999:7::: shadow- root:$1$DWU.tenP$B7ANiXoGoiZMwJR6Ih8810:12705:0:99999:7::: 其中有很多是从原系统的/etc下拷贝过来修改的,如果你是一个具有中等以上水平的linux爱好者,那么应该一看就明白了,当然,你也可以根据自己的需要修改这些文件.其中最重要的是fstab和inittab,busybox内建的init程序用到的inittab文件的语法和一般的不一样,不能直接把原系统/etc下inittab文件拷贝过来.可以把busybox-1.00目录下的示例文件拷贝过来修改用.具体请看busybox的文档.busybox的init也可以不用inittab.但是在我制作babylinux过程中有一个非常奇怪的bug.所有/sbin下的busybox链接在做成压缩的根文件系统,解压后都不能正常运行,显示找不到该命令.只有当我在/bin下做这些链接时才能运行.具体原因还不太清除,所以你需要做下面的工作: #cd /babylinux/rootfs/sbin #ls chroot getty ifconfig losetup pivot_root reboot swapoff sysctl fdisk halt init mkswap poweroff route swapon telnetd 查看到sbin下有上述链接 转到bin下 #cd /babylinux/rootfs/bin 重新做这些链接: #ln -s busybox chroot #ln -s busybox getty #ln -s busybox ifconfig ... 然后把sbin下的链接删除,以节省空间 #rm -rf /babylinux/rootfs/sbin/* 再把原先inittab中所有的sbin改成bin init.d下的文件: rcS 请确保这个文件是可执行的,否则请改成可执行的: #chmod u+x rcS rcS的内容: #! /bin/sh mount -o remount,rw / /bin/mount -a >/etc/mtab echo echo echo echo echo -en " Welcom to 33[0;32mBabyLinux33[0;39m " echo -en "33[0;36m " echo echo -en "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ " echo -en "+ This is a tiny linux system based on a floppy.It contains " echo -en "+ more than 100 basic Linux commands and tools.The kernel of " echo -en "+ this tiny system support all kinds of normal filesystems. " echo -en "+ linux ext2,ext3,jfs,reiserfs and windows fat,vfat,ntfs[readonly] " echo -en "+ is supported! So it is a powerful small system you can use it " echo -en "+ as a linux and windows rescue disk.Beside this,the kernel also " echo -en "+ contains the drivers of Reltek8139,NE2000,via-rhine ethernet " echo -en "+ adpater. you can configure the IPaddress and netmask with tools " echo -en "+ 'ifconfig' and config the default gateway with command 'route'. " echo -en "+ Is there anything else? Haha,this is a telnet server build-in " echo -en "+ you can type 'telnetd' to startd it and thus your friends can " |
|
|
|
|
16楼 echo -en "+ 33[0;32mAll these great features are powered by BusyBox 1.033[0;36m " echo -en "+ This is a free system tool developed by GuCuiwen. " echo -en "+ RUN YOUR OWN RISK of using it ! if you have any problem please " echo -en "+ mailto : win2linux@163.com Enjoy!! " echo -en "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ " echo -en "33[0;39m " hostname BabyLinux 可以自己作相应的修改. 以上是babylinux根文件系统的所有内容,他的总大小应该在1M左右. [root@gucuiwen baby]# du -hs 1.1M . 九,制作ramdisk映象文件 babylinux根文件系统所有东西都放在/babylinux/rootfs下,我们将利用ramdisk把这些内容做成ramdisk映象文件并压缩他. 以下主要是ramdisk的用法,看完以下内容,你应当学会ramdisk的使用. [root@gucuiwen babylinux]# dd if=/dev/zero of=/dev/ram1 dd: 正在写入 ‘/dev/ram1’: 设备上没有空间 读入了 8193+0 个块 输出了 8192+0 个块 zero是一个特殊的设备,表示全部为0的字符块.上面这条命令的意思是把系统的第一个ramdisk用全部为0的数据填充,因为ramdisk默认大小为4M,因此当读满8192个块(每块512字节)后,显示'设备上没空间'.这很正常,/dev/ram1已经被填充满了. 如果指定块的大小: [root@gucuiwen babylinux]# dd if=/dev/zero of=/dev/ram1 bs=1M count=4 读入了 4+0 个块 输出了 4+0 个块 不会有错误提示,这里演示了dd的一般用法,接下来还要频繁用到dd命令. 在/dev下有很多ramdisk设备,ram1,ram2,ram3.... 一般用第一个就可以了. 填充后,ram1就有可空间,可以在这个空间上创见一个文件系统: [root@gucuiwen babylinux]# mkfs.ext2 -m0 /dev/ram1 mke2fs 1.32 (09-Nov-2002) Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) 1024 inodes, 4096 blocks 0 blocks (0.00%) reserved for the super user First data block=1 1 block group 8192 blocks per group, 8192 fragments per group 1024 inodes per group Writing inode tables: done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 37 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. 将ram1挂装到文件系统中: 先建立一个挂装点: #mkdir /mnt/ram 挂上ram1: #mount /dev/ram1 /mnt/ram 将先前做好的babylinux根文件系统拷贝到ram1上. #cp -R /babylinux/rootfs/* /mnt/ram 做完以上几步,你应就白了ramdisk设备的含义,他是和hda1,hdb1,一样的块设备,用mount挂到文件系统下后就可以访问,往里放东西,但是所有的东西在内存上.关机将丢失所有东西. 拷贝好babylinux根文件系统后卸载ram1: #umount /dev/ram1 这时,虽然不能通过/mnt/ram这个挂装点访问ram1中的内容了,但是他却切切实实得在内存中存在. 再用dd把这个ram1以映象方式取出来: [root@gucuiwen babylinux]# dd if=/dev/ram1 of=/babylinux/ramdisk.img 读入了 8192+0 个块 输出了 |
|
|
|
