将LFS系统通过grub装到优盘上启动

2023-05-16

    最近在搞LFS,就是通过自己动手,亲自编译源代码的方式,建立自己的linux发行版。通过这个过程可以详细的深入了解linux内部的工作方式,对理解操作系统的机制有很大的帮助。

    做这个项目,光是建立合适的宿主系统环境就是花了一个星期,因为LFS也不是从无到有直接凭空构造出来的,需要一个宿主操作系统。搞了一个星期,用过ubuntu做个宿主系统,后来换了kali linux,还是跌在了第一步上,只是编译通过了binutils,但是编译gcc怎么都同不过。后来,终于过了这一关。原来是宿主系统的gcc版本太高了。我换成了gcc-4.4就没问题了,之后的工作主要就是编译、安装,不断的重复。

    按照LFS手册做好之后,主要的工作就是设法启动起来。因为我是用loop文件来模拟一个分区做的,所以我将其复制到优盘上,想从优盘启动。于是,我想法现将grub写入优盘。没有分分区的优盘貌似难以写入,于是我用fdisk分了一个区:

    fdisk /dev/sdb

    n :命令n建立一个新的分区,然后一直回车下去就可以了

    a :命令a将第一个分区设为可启动的

    w:将新的分区信息写入设备

   

    mkfs -t ext4 /dev/sdb1

    将sdb1分区格式化为ext4文件系统,然后才可以i将此分区挂载使用。

    不分区的话会出现一下错误信息:

    /usr/sbin/grub2-bios-setup: warning: this GPT partition label contains no BIOS Boot Partition; embedding won't be possible.
    /usr/sbin/grub2-bios-setup: warning: 无法嵌入。在此次安装中 GRUB 只能通过使用块列表安装。但是块列表是不可信赖的,不推荐使用。.
    /usr/sbin/grub2-bios-setup:错误: will not proceed with blocklists.

    将grub写入优盘的方法:

    mount /dev/sdb1 /media/disk 将sdb1分区挂载到/media/disk 目录

    grub-install --root-directory=/media/disk --no-floppy /dev/sdb --force

    --root-directory=/media/disk 选项指定将grub的配置文件信息生成到/media/disk目录下

    /dev/sdb 指定将启动程序写入到/dev/sdb的mbr中 
    grub2-mkconfig -o /media/disk /boot/grub/grub.cfg

    此命令将自动扫描系统中的分区,检查各个分区中是否安装有系统,然后根据检测到的信息生成或者更新grub的配置文件grub.cfg。具体而言,就是生成开机时由grub引导程序显示的选项。

    然后,使用一下命令将由LFS生产的所有目录文件复制到sdb1分区中:

    cp -rf /mnt/lfs* /media/disk

    一定要使用-f选项,强制复制所有文件,否则有一些特殊文件无法复制。

    然后更改优盘上的grub.cfg文件(/media/disk/boot/grub/grub.cfg),将和lfs有关的启动项信息的根分区修正,因为我们是在宿主系统中检查并更新的grub.cfg文件的,这种情况下是将硬盘识别为hd0,而优盘识别为hd1的,但是如果从优盘启动的话,就反过来了,这时优盘是hd0,硬盘是hd1.所以我们手动修正gurb.cfg:

menuentry "unknown Linux distribution (on /dev/sdb1)" --class gnu-linux --class gnu --class os {
    insmod part_msdos
    insmod ext2
    set root='(hd0,msdos1)' #之前是set root='(hd1,msdos1)'
    search --no-floppy --fs-uuid --set=root 7972d858-eb3f-49b4-8f90-6805a8661946
    linux /boot/vmlinuz-3.16.2-lfs-7.6 root=/dev/sdb1 #这里一定要对,不管宿主系统中的优盘分区被标识成什么,比如/dev/sdb /dev/sdc,这里都要写/dev/sdb1。这样才能正确的加载根文件系统。

    initrd    /boot/initrd.img-3.14-kali1-686-pae #下面将对此进行详细介绍

}

    上面的:initrd    /boot/initrd.img-3.14-kali1-686-pae 这一行是我们手动加载的,原生的LFS制作出来是没有考虑这个的。但我们要从优盘启动,就要使用这种技术--initrd,即init ram disk。如果从硬盘分区启动,这个就没必要了。因为我们要从优盘启动,所以需要虚拟内存磁盘,用于系统启动时作为临时的根文件系统,否则无法加载根文件系统,因为这种情况下我们是将优盘这种介质作为根文件系统介质的,但是系统启动时,还未加载优盘的驱动程序,这就导致系统无法识别优盘,也就无法加载根文件系统。所以我们用到了initrd。具体的initrd的详细介绍请自行百度。我们这里使用的initrd.img-3.14-kali1-686-pae文件是从宿主系统中的/boot目录下直接复制过来的,嗯,版本差距不大,实践证明可以直接正确的使用。

    注意,LFS根文件系统中的/etc/inittab和/etc/fstab内容要正确,尤其是/etc/fstab文件中要正确的指定根文件系统(/dev/sdb)

    好了,准备好之后就可以重启从优盘启动了。

    利用次方法,我还将优盘分了两个区,将LFS装载在了第二个分区,修改了grub的配置文件,指定了正确的根文件系统,成功启动。

    因为我的宿主系统还配置了6G的交换分区,所以我将这个分区重新格式化为ext4文件系统并将其设置为可启动的活动分区,将LFS复制到了次分区之下,更新grub配置文件,这种情况只需要指定正确的根文件系统就可以了。

    通过这个过程,我也深刻的理解了linux命令行工作方式的强大。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将LFS系统通过grub装到优盘上启动 的相关文章

  • 从操作系统内核解释电脑死机原理

    关于电脑死机的原因或者说原理 xff0c 即电脑为什么会死机 xff0c 电脑死机时计算机底层都发生了什么 一直不太明白 xff0c 在网上也查过相关的资料 xff0c 但是都没有找到自己想要的 网上谈的都是外部导致电脑死机的原因 xff0
  • 自己动手写操作系统第二章 pmtest1.asm分析

    34 pm inc 34 描述符 Usage Descrptor Base Limit Attr Base dd Limit dd Low 20 bits available Attr dw lower 4 bits of higher b
  • Linux 0.11 内核在内核空间创建进程时不使用写时复制技术

    在Linux0 12内核完全剖析中 xff0c 有这样一段话 34 由于创建新进程的过程是通过完全复制父进程代码段和数据段的方式实现 xff0c 因此在首次使用fork 创建新进程init 时 xff0c 为了确保新进程用户态栈中没有进程0
  • putty 登陆VMware虚拟机下的linux系统

    物理机的操作系统是Windows XP 虚拟机是在VMware上安装的CentOS xff0c 版本是5 6 因为每次登陆虚拟机鼠标会被限定在虚拟机的登陆界面 xff0c 所以想通过远程登陆工具来登陆虚拟机 虚拟机使用的网络是桥接模式 注意
  • Minx内核中scanf函数实现代码

    include lt stdio h gt include lt stdarg h gt include 34 loc incl h 34 int scanf const char format va list ap int retval
  • 双系统Linux下突然挂载Windows分区失败

    问题描述 xff0c 装了双系统之后 xff0c 一开始在Linux下还能访问Windows的分区 xff0c 可是突然之间就不能访问了 xff0c 错误信息如下 xff1a Error mounting dev sda1 at media
  • 对Linux0.11 "内核空间不使用写时复制机制" 本质理解

    一个页面被多个进程共享 xff0c 每当一个进程产生一次写保护 错误 xff0c 内核将给进程分配一个新的物理页面 xff0c 将共享页面的内容复制过来 xff0c 新的页面将设置为可读写 xff0c 而共享页面仍然是只读的 xff0c 只
  • Session && Cookie

  • windowsxp远程桌面端口号改变的位置

    HKEY LOCAL MACHINE SYSTEM CurrentControlSet Control Terminal Server Wds rdpwd Tds tcp 下的PortNamber HKEY LOCAL MACHINE SY
  • linux0.11 进程切换

    move to user mode是在堆栈中创建一个任务切换的假象 xff0c 用iret跳转到外层3 xff0c 这样cpu就会自动根据tr加载tss xff0c 并初始化各个寄存器运行任务0 所以 xff0c 任务0其实就是内核空间中的
  • Linux0.11 进程0

    Linux中1号进程是由0号进程来创建的 xff0c 因此必须要知道的是如何创建0号进程 xff0c 由于在创建进程时 xff0c 程序一直运行在内核态 xff0c 而进程运行在用户态 xff0c 因此创建0号进程涉及到特权级的变化 xff
  • Linux0.11 由进程睡眠函数sleep_on()中的堆栈变量tmp引发的思考 关于进程内核堆栈

    sleep on cpp view plaincopy 功能 xff1a 当前进程进入不可中断睡眠态 xff0c 挂起在等待队列上 参数 xff1a p 等待队列头 返回 xff1a xff08 无 xff09
  • 关于Windows系统环境变量的引用问题

    做Leap Motion开发时 xff0c 新建了LEAP SDK的系统环境变量 xff0c 按照官方SDK文档中说明的 xff0c 在工程中引入 LEAP SDK include 之前半年的时间里都是这样做的 xff0c 没有任何问题 x
  • 深入理解Linux内核--信号

    信号用于在用户态进程间通信 内核也用信号通知进程系统所发生的事情 1 信号的作用 信号 signal 是很短的消息 xff0c 可以被发送到一个进程或一组进程 发送给进程的唯一信息通常是一个数 xff0c 以此来标识信号 使用信号的两个主要
  • 进程上下文与中断上下文

    处理器总处于以下状态中的一种 xff1a xff11 内核 态 xff0c 运行于进程 上下文 xff0c 内核代表进程运行于内核空间 xff12 内核态 xff0c 运行于中断上下文 xff0c 内核代表硬件运行于内核空间 xff13 用
  • 进程上下文VS中断上下文

    内核空间和用户空间是现代操作 系统的两种工作模式 xff0c 内核模块运行在内核空间 xff0c 而用户态应用程序运行在用户空间 它们代表不同的级别 xff0c 而对系统资源具有不同的访问权限 内核模块运行在最高级别 xff08 内核态 x
  • 中断不可睡眠的一些理解

    一 LINUX中到是有中断还没有完全返回就调用schedule 而睡眠过去的例子 可以猜是哪里 我觉得 xff0c 中断和异常不同 xff0c 中断是异步的 xff0c 异常和系统调用是同步的 异常比如缺页异常发生时 xff0c 当前任务在
  • kmalloc和vmalloc

  • linux内核中内存相关的操作函数

    1 kmalloc kfree static always inline void kmalloc size t size gfp t flags 内核空间申请指定大小的内存区域 xff0c 返回内核空间虚拟地址 在函数实现中 xff0c
  • Oracle安全:SCN可能最大值与耗尽问题Oracle安全:SCN可能最大值与耗尽问题

    SCN的问题一旦出现 xff0c 使得数据库的一切事务停止 xff0c 由于SCN不能后退 xff0c 所以数据库必须重建 xff0c 才能够重用 在2012年第一季度的CPU补丁中 xff0c 包含了一个关于SCN修正的重要变更 xff0

随机推荐

  • Linux内核 申请和释放内存流程

    1 内核初始化 xff1a 内核建立好内核页目录页表数据库 xff0c 假设物理内存大小为len xff0c 则建立了 3G 3G 43 len 0 len 这样的虚地址vaddr和物理地址paddr的线性对应关系 xff1b 内核建立一个
  • 编译器"自举与移植"原理

    本文基于对 编译原理与实践 中有关编译器自举与移植部分的读书 笔记 形式 xff0c 因为原书是老外写的 xff0c 感觉翻译的地方好多语句不通或难以理解 xff0c 所以花了好多功夫研究这一块 注 xff1a 本文中与原书一致的地方都是P
  • Linux 内核 由block_read和block_write函数引发的设备块号转换问题的思考

    在1 2内核版本中 xff0c 在Linux fs目录下 xff0c 有一个block dev c文件 xff0c 里面主要包含了block read block write block fsync函数 先说说我遇到的问题 xff0c 在块
  • Linux 进程调度时机

    Linux调度时机主要 有 xff1a 1 进程状态转换的时刻 xff1a 进程终止 进程睡眠 2 当前进程的时间 片用完时 xff08 current gt counter 61 0 xff09 3 设备驱动程序 4 进程从中断 异常及系
  • linux 下批量转换pdf的命令方法

    由于在windows下的图形界面 xff0c 难以批量进行其他格式的文件到PDF格式文件的转换 xff0c 而一些其他的软件也不是很满意 xff0c 所以转到linux下 xff0c 想利用linux强大的命令行来完成这件事 linux下有
  • Linux内核 内存映射文件机制mmap

    今天研究Linux1 2内核运行加载a out格式的可执行文件的代码时 xff0c 无意中研究明白了内核提供的内存映射机制 mmap xff08 memory map xff09 当内核要加载可执行文件到相应的用户地址空间时 xff0c 有
  • bash提示符的配置:

    bash提示符的配置 xff1a 如果您很容易使 shell 提示行变得色彩绚烂斓且带有更多信息 xff0c 为什么还要坚持用单调的标准 shell 提示行呢 xff1f 在这篇技巧中 xff0c Daniel Robbins 将说明如何获
  • Linux线性地址空间的划分及内核寻址方式

    今天研究Linux1 2内核时 xff0c 注意到该版本中的PAGE OFFSET宏被定义为0 xff0c 考虑到进程的地址空间被划分为3G的用户态地址空间和1G的内核态地址空间 xff0c 于是深入的研究了一下这个问题 一开始我只是疑惑
  • linux 最简单的模块的编写和运行

    第一次动手编写一个内核模块 xff0c 但是查找了许多资料没有一个可以完美通过编译的 xff0c 郁闷 xff0c 最后还是解决了 xff0c 分享出来 首先是hello c include lt linux kernel h gt Nee
  • 截获或替换linux系统调用

    直接上代码吧 xff1a hello c include lt linux kernel h gt Needed by all modules include lt linux module h gt Needed for KERN inc
  • oracle临时表实际应用

    xff08 这段是后面添加的 xff1a 临时表 xff0c 在实际应用中 xff0c 其实和nologging的固定表 xff0c 是差不多的 xff0c 都是中间表 xff0c 所以这里为什么添加这段话 xff0c 是让自己记得 xff
  • linux sys_call_table 初始化

    前几天看内核中系统调用代码 xff0c 在系统调用向量表初始化中 xff0c 有下面这段代码写的让我有点摸不着头脑 xff1a const sys call ptr t sys call table NR syscall max 43 1
  • Linux gcc 利用反汇编来研究C语言函数堆栈的分配方式

    越来越感觉学习C和汇编才是最能接近计算机本质的途径 所以 xff0c 今天开始研究汇编了 xff0c 先从gcc反汇编开始 首先是下面的C代码 xff1a include lt stdio h gt int sum int a int b
  • ubuntu linux GAIM QQ

    sudo add apt repository ppa lainme pidgin lwqq sudo apt get update sudo apt get install pidgin lwqq sudo apt get install
  • Ubuntu 14.10 播放avi视频闪屏的简单解决方案

    昨天将ubuntu升级到了14 10版本 xff0c 没有得到想象中的视觉效果 但是 xff0c 后来却发现不能播放avi视频了 xff0c 尝试了各种播放器 xff0c 都无解 xff0c 总是闪屏 xff0c 而播放flv格式的视频就没
  • Ubuntu删除Compiz之后 恢复方法

    因为ubuntu14 10不能播放avi的问题纠结了很久 xff0c 最终使用转码软件解决的 但是还是不甘心啊 xff0c 总想解决这个问题或者知道问题的原因 偶然看到了系统中的compiz软件 xff0c 想到在网上看到的有人说是因为系统
  • Ubuntu14.10 unity-tweak-tool 不能正常打开的解决方法

    新的系统 xff0c 风格都变了 xff0c 折腾了一晚上 xff0c 想安装个苹果主题 xff0c 可是unity tweak tool 这个东西就是死活打不开 这么晚了 xff0c 不想多说了 xff0c 直接给解决方法吧 xff1a
  • 安装ubuntu14.04后做的一些事情

    ubuntu又折腾坏了 xff0c 于是有重新装系统了 装完之后 xff0c 美化美化 xff1a 1 本来嫌每次都sudo麻烦 xff0c 于是想将我的帐号设置为sudo不用输入密码 xff0c 但是编辑sudoer文件的时候 xff0c
  • LFS编译GCC GNU_USER_TARGET_OS_CPP_BUILTINS not declared in this scope

    gcc v 发现使用的gcc版本是4 7 安装gcc 4 4 or 4 3 xff0c 重新链接 xff0c 问题解决 apt get install gcc 4 4 g 43 43 4 4 进入 usr bin cd usr bin 建个
  • 将LFS系统通过grub装到优盘上启动

    最近在搞LFS xff0c 就是通过自己动手 xff0c 亲自编译源代码的方式 xff0c 建立自己的linux发行版 通过这个过程可以详细的深入了解linux内部的工作方式 xff0c 对理解操作系统的机制有很大的帮助 做这个项目 xff