一个小练习:构建一个基于U盘的Linux系统

发布于 2022-09-18 05:06:54 字数 6768 浏览 11 评论 0

有些网友还是觉得MaxWit Linux太复杂,不易入门,我想了个小东东,这个比较容易——构建一个基于U盘的Linux系统

这个小练习不但为研究MaxWit Linux打下基础,而且其过程本身也有会有收获,有兴趣的朋友一起来讨论!初拟内容及过程如下,有待大家共同完善:

1准备工作
1.1硬盘分区
1.2安装GNU Toolchain
1.3安装其他必备软件
1.4安装grub2

2编译Linux内核
2.1获取最新Linux内核源码
2.2Linux内核源码目录树
2.3内核编译步骤
2.4内核关键选项逐条详解
2.5使用新内核
2.6常见问题分析及解决

3制作initrd
3.1initrd的作用
3.2initrd的工作机制
3.3initrd的组成
3.4initrd制作
3.5常见问题分析及解决

4制作标准版rootfs
4.1rootfs的组成
4.2编译sysvinit
4.3编译bash
4.4编译coreutils
4.5编译其他核心组件
4.6常见问题分析及解决

5使用Busybox制作简化版rootfs
5.1Busybox介绍
5.2Busybox编译选项
5.3Busybox编译及安装
5.4常见问题分析及解决

6进一步完善你的系(Xorg、GNOME等)




[ 本帖最后由 conke 于 2009-11-16 11:38 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

紫罗兰の梦幻 2022-09-25 05:06:54

目标:在u盘上做一个linux基本系统
一:在硬盘B上做一个基本系统(用源码)
   主要步骤:
       1(假设在虚拟机中实验)另外加上一个硬盘B,在硬盘A正常系统上编译kernel并用一个holle world!C程序(静态链接方式)测试kernel能否正常运行。(如果启动信息中有  holle world, no find信息说明kernel正常启动了)

       2在硬盘A系统上mount硬盘B, 在硬盘B上做一个rootfs,并移植一个grub(注意cp lib)。

       3编译bash,coreutils,sysvinit。(注意在make install 步骤时候指定正确的路径,防止覆盖原系统的文件造成系统崩溃)

二:(在第一步成功的情况下进行此步)把u盘挂到原系统中,在测试系统时候在bios中设置从usb中启动,其余各步骤与第一步相同。

[ 本帖最后由 469412293 于 2009-11-16 10:38 编辑 ]

旧伤还要旧人安 2022-09-25 05:06:54

一、构建一个基于U盘的linux系统,主要包括3个方面:
1.在U盘安装grub;
2.编译kernel;
3.制作rootfs。

二、要想构建的U盘linux系统能够正常工作,必须保证上面的三方面都正确无误,(即使三方面单独测试成功,也并不能保证系统的正常工作)为了便于检查错误和测试方便,可以分别对三方面进行测试。

1.grub的安装及测试

假设在U盘上制作rootfs的分区为sdb1,而且挂载在/USB目录。
在/USB目录创建/USB/boot目录,从本机上将grub拷贝到/USB/boot下,并对menu.lst(或者是grub.cfg)进行一些修改。接着对U盘安装grub并重启,设置从U盘开始启动。如果U盘的grub安装成功,本机开机启动时的grub菜单选项中会出现/USB/boot/grub/menu.lst中你修改的内容。

2.kernel的编译和测试

哪位好心人来写下kernel的编译吧。 。关于kernel选项的讨论可以参考http://linux.chinaunix.net/bbs/thread-1144165-1-1.html

3.rootfs的制作

(1)静态链接的init
(2)动态链接的init
(3)安装bash
(4)安装coreutils
(5)安装sysvinit

(待续)

残龙傲雪 2022-09-25 05:06:54

构建一个简单的U盘启动的linux系统主要有四个阶段:
1.在U盘安装Grub,先将u盘挂载到本机硬盘上(假设u盘为/dev/sdb1,挂载目录为/ulinux),再将/boot/grub目录复制到/ulinux/目录下,修改mennu.lst,设置启动选项,然后安装grub到U盘上, 重启,在BIOS中将USB设备优先级设置为最高,启动U盘,进入之前U盘menu.lst设置好的菜单即U盘grub安装成功。
2.编译kernel.注意:硬盘驱动以及文件系统是必须的
3.测试kernel是否能够正常运行,可以在/ulinux目录下新建bin目录,并编写一个init.c程序,内容为printf("Hello World!\n") ; 编译,静态链接并生成一个init的可执行文件,重启,如果屏幕上显示Hello World!,该kernel可正常运行,否则重新编译kernel;
4.制作rootfs
(1)编译bash
(2)编译coreutils
(3)编译sysvinit
注意安装时路径要指定清楚,否则可能会覆盖系统分区下面的文件!!

木森分化 2022-09-25 05:06:54

通常来说:
系统启动的过程是
cpu->bios->grub->ker+initrd ===》rootfilesystem
我们所构建的usb_linux系统,其实际意义和windows的PE一样,就是一个非常简单的临时系统,但是这个系统在某些特殊情况下有非常大的意义!
    如:当你的系统崩溃了,而这里面有非常重要的资料!怎么般?到数据恢复的地方去? 这样当然可以,但是从时效 和 RMB来说都是非常不好的!
   那么为什么不作PE系统 而作 LINUX 呢? 很简单, LINUX 支持 的几乎所有文件系统格式,是PE不可比拟的!
好了进如正题!
   构建USB系统第一步: 格式划 目标盘(USB),并适当分区!和 制作一个简单的rootfs
                       1.将目标盘插入平台机,然后使用命令 #mkfs  /dev/hdb  y  然后可以分区 #fdisk /dev/hdb  具体怎么分就看你了!!
                       2.在目标盘上,制作一个简单的rootfs(如 lib, bin, sbin, dev, boot,sys,etc...其他的要什么加什么!总之前面几个一般是不能少的!)
               第二步: 在目标盘(USB)上安装GRUB
                        1,setup (hdb1), (后面的数字是,你的USB在电脑上的第几个硬盘)
                    其他的我也不记得怎么作了 高手请和大家说下!
               第三步:我们可以,检测一下grub是否能够正常工作了!
                        1,gcc 一个 hello maxwit!这个可以用动态链接,或静态链接的形式,不过,如果是动态链接的划 在lib目录下要有相应的lib*.so*哦!!
                        2.修改menu.lst拉!或着在grub中手动引导拉!这个就不具体说了
                        3.注意最后几行如果有 hello maxwit! 字样 说明你离成功不远了
                        没有就返回第一步!!!
               第四步,我们可以编译一个自己的KER,自己制作一个initrd 放到目标USB上的boot目录下(也可以放到其他地方去,但是一定能够让grub找到!!!)
                     当让我们也可以从官方网站上下载拉!!当然那样的话,还不如用官方的专门的usb系统呢,容易多了!
               第五步,当然是测试,和 show
好了就说到这里!本人是新手,肯定有很多错误和不足,欢迎大家拍砖头 : :

满意归宿 2022-09-25 05:06:54

简单linux系统的四部分:
1. grub
2. kernel
3. initrd (这部分不是必要地)
4. rootfs

1. grub  在u盘上安装grub, 这步中,把主机上grub复制到U盘上的ROOT分区, 然后就不知如何在U盘上安装GRUB来引导U盘上的系统了????

4. rootfs的制作是一个不断测,不断反复的过程.
  roofs包括sysinit, bash, coreuntil   这三部分的安装.  
但在这之前要做一些测试
1.这步中,首先用一个简单的hello程序,作为init测试一下rootfs.  用 动态编译和静态编译 两种方式态编译测. 两种方式都通过后, 还可以作些其他的测试
在这里我有一个问题:
     我在U盘上系统:
        grub >  root (hd1,1)     #系统在U盘的第一个分区
        grub >  linux /boot/vmlinuz-2.26.31  root=/dev/sdb1 init=/bin/bash    #我想用U盘来起动bash
        grub > initrd /boot/initrd-2.26.31
        grub > boot
       这样起动后,  提示 can't find /bin/bash

        但先前测试hello却没有问题.   hello更名为/sbin/init
        grub > root (hd1,1)
        grub > linux /boot/vmlinuz-2.26.31  root=/dev/sdb1
        grub > nitrd /boot/initrd-2.26.31
        grub > boot

   这样就可以正常显示了 .

        Ps:    root (hd1,1) 这里必须注意, root后有空格,  hd1,1 中间不能有空格.
                    对于init 指定bash,  不能起动,  我猜是没有对应的动态连接库..
*************************************************************************************************************
上面的 提示 can't find /bin/bash       是因为rootfs下lib 下没有支持bash运行动态连接库 .

[ 本帖最后由 taoxie17 于 2009-11-16 11:08 编辑 ]

淡淡の花香 2022-09-25 05:06:54

看了各位大侠写的关于打造U盘Linux系统,小弟在这里有些疑问希望各位大侠们帮着解决下,为了更好的说明问题,我会列出打造U盘Linux系统的一些关键步骤来引出问题。

因为现在手头没有现成的U盘 所以我将用Virtual Box来虚拟出一块独立的硬盘(它可以被理解成一块移动硬盘之类,同样可以说明问题)。

好了,现在可以开始打造系统了。

首先,我们手上有了这么一块硬盘(VB虚拟的),我们要使用源码编译一个Linux的系统,使它一接上电源就能启动。 所以,这一步我先把这个硬盘分区格式化,在工作系统上使>用fdisk即可。 这一步没什么问题。

第二步,安装grub
       因为系统的启动过程是 BIOS加电自检->BIOS在启动盘(这里我们的目标硬盘)上寻找启动分区->将引导权交给启动分区中的主引导记录(这里就是grub了)->最后由grub>来加载内核引导系统了。 所以现在需要安装grub, 昨天conke已经演示了一遍怎样安装grub,好像是先把grub拷贝到目标硬盘上,然后使用了grub shell的setup安装grub? 因为>小弟基础不好,conke只是很快的就操作过去了,所以我没看清楚究竟是怎么弄的,我自己的理解是,setup的作用是把grub写进到MBR当中去,不过我自己用的是grub2 发现没有se
tup命令,所以grub没能安装成功。希望有心的大侠能告诉我一下grub应该怎么安装,有朋友告诉我,我的工作系统上有grub但不代表有grub源程序,而安装grub要用到grub的源程
序,这一点我也是搞步清楚,希望哪位解释一下。谢谢

第三步,安装kernel
        因为前一天已经学习了内核编译,并且能用自己编译的内核跑起系统来了,所以这一步我已经能够自己解决了,相关知识可以参考“笔记:制作基于X86架构最简配置并且>
不需要initrd的linux kernel”的帖子。 不过内核编译完成后还是要测试一下是否能成功运行,这里最好的方法在内核启动后打印出点信息来,所以在这里我们想到了init进程,>众所周知init进程是linux系统的第一个进程,内核启动完成后就会执行它,所以我们可以写一个程序打印出一个信息来告诉我们内核已经启动了,比如就一句printf("Kernel Started!\n")就可以了 不过在这里注意要使用静态编译 方法:gcc -o test test.c -static ,原因是因为刚刚建立的系统还还没有库文件,所以只能把那些库文件的源码都一起编>译进程序代码中去了,关于静态编译与动态编译的区别这里不再赘述,有兴趣的可以去看看相关的帖子。程序编译好了以后 在grub中的menu.lst相应的位置追加上一句 init=“这>里就是test的存放路径” 即可。 对了,补充一点,从安装grub开始,我们就要在目标磁盘上建立文件系统组织了,主要是创建一些必要目录来存放grub,内核等。

第四步,为我们的系统添加一些常用的shell
        这里我们使用bash,安装包为bash-4.0.tar.gz, 解压后会有个bash-4.0的文件夹,主要是配置sysvinit,bash,coreutils三个包,这里面有最常用的shell命令 比如ls在
sysvinit里面 cp在coreutils里面。昨天conke也演示了一遍怎样安装这些shell,可是我也没有看清楚具体是怎么做的,我记得这3个是有对应的软件包,里面有自己的makefile的
,因为我记得要使用configure去配置它们 还加上了--prefix= 作前缀,这样做是为了把bash安装到目标硬盘上而不是工作系统中,为了说明前缀和路径的关系,我们还专门打开>了makefile文件看过。 不过我怎么就没找到sysvinit,bash,coreutils呢? 希望哪位高人能够指点指点啊!

昨天我们的课就讲到了这里,以上就是我对打造U盘系统的大概框架的理解,如果有什么错误也希望高人们指出!谢谢

补充:关于第四步安装bash 是我理解错了,bash-4.0.tar.gz这个包中只有bash 它的功能只是命令解释器 具体的命令在sysvinit和coreutils中 它们是另外安装的。

[ 本帖最后由 paocaka 于 2009-11-16 12:10 编辑 ]

救星 2022-09-25 05:06:54

首先我们要在另外一块硬盘上安装一个GRUB,这个硬盘挂载在我们系统的/ULINUX上,我们可以把我们操作用的系统上的/BOOT/GRUB中的STAGE1和STAGE2拷贝到U盘上,安装一下。把原先的硬盘拔掉,这样我们可以测试一下新的硬盘上的GRUB,当开机后出现可选择进入系统的菜单后,证明GRUB安装成功。
    然后我们可以编译一个新的KERNEL,选上必选的选项,如硬盘驱动,文件系统格式,可执行文件等。把编译过的KERNEL拷贝到新的硬盘上。现在我们就需要测试一下我们新的KERNEL是否能使用,步骤如下: 1 写一个名为INIT.C的“HELLO WORD”程序,使用GCC -STATIC  INIT.C -O INIT编译一下,把产生的文件COPY到/ULINUX上,然后重起机器。2 改一下GRUB,把KERNEL地址指定到我们新的KERNEL上,载把INIT指定为INIT.C,启动,界面出现"HELLO WORD”的话证明KERNEL是可以使用的。这里有个比较重要的地方,我们刚刚编译INIT.C的时候使用的是静态编译,如果我们用动态编译INIT.C的话,重启之后就出不来“HELLO WORD”了,因为静态编译是把所需的库函数也封装在一起,而动态编译却没有,我们新的硬盘上又没有所需要的库函数,所以不会出现“HELLO WORD"。怎样才能使动态编译的运行起来能,我们使用LDD INIT.C可以找到INIT.C所需要的库函数,我们把这些库函数COPY到/ULINUX上,然后重启,我们可以发现又可以打印出“HELLO WORD"。
    接着我们需要在新的硬盘上制作一个ROOTFS,需要编译的有BASH,COREUTILS,SYSVINIT,这边要特别注意安装时要指定路径,不然就会把原系统上的文件给覆盖掉,后果就是你很可能要重装系统了,所以安装时要特别小心。

流心雨 2022-09-25 05:06:54

回复五楼setset01的帖子:
构建USB系统第一步: 格式划 目标盘(USB),并适当分区!和 制作一个简单的rootfs
                       1.将目标盘插入平台机,然后使用命令 #mkfs  /dev/hdb  y  然后可以分区 #fdisk /dev/hdb  具体怎么分就看你了!!

你先mkfs /dev/hdb y,然后fdisk /dev/hdb ?

第三步:我们可以,检测一下grub是否能够正常工作了!
                        1,gcc 一个 hello maxwit!这个可以用动态链接,或静态链接的形式,不过,如果是动态链接的划 在lib目录下要有相应的lib*.so*哦!!
                        2.修改menu.lst拉!或着在grub中手动引导拉!这个就不具体说了
                        3.注意最后几行如果有 hello maxwit! 字样 说明你离成功不远了
                        没有就返回第一步!!!   

这个不是检测grub时候正常工作的,是测试rootfs的一部分。

放我走吧 2022-09-25 05:06:54

回复6楼taoxie17:
     我在U盘上系统:
        grub >  root (hd1,1)     #系统在U盘的第一个分区
        grub >  linux /boot/vmlinuz-2.26.31  root=/dev/sdb1 init=/bin/bash    #我想用U盘来起动bash
        grub > initrd /boot/initrd-2.26.31
        grub > boot
       这样起动后,  提示 can't find /bin/bash

你指定的init是/bin/bash,你bash安装了吗?你可以把hello改名成bash,(当然是指你还没有安装bash),我想应该也是可以的。或者
grub >  linux /boot/vmlinuz-2.26.31  root=/dev/sdb1 init=/bin/bash    改成
grub >  linux /boot/vmlinuz-2.26.31  root=/dev/sdb1 init=/bin/hello

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文