++

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 跳转到目录 点这里 

制作光盘

大纲:
  1) 工具命令概览
       mkisofs 创建 ISO启动盘
       grub-mkimage 生成 core.img
       losetup 打开或关闭虚拟磁盘
       dd 创建虚拟磁盘文件
       mkfs.ext2 格工化磁盘成ext2格式 
       光盘制作大概分这么几步
         编译内核(并使内核支持内存文件系统)
         编译内核模块 模块并打包成img镜像(如果你全部编进内核了就用不着这步)
         预制内存文件系统内容(光盘启动后的根目录及程序数据)
         把内存文件系统内容弄到虚拟磁盘,倒出磁盘映像到img文件
         预制光盘内容(你光盘里要保存的程序和数据)
         配置光盘grub
         把光盘预制内容写入一个新的光盘映像文件,并向映像文件grub引导 
          
     2) 大概操作步骤
       2.1)编译内核得到自己的内核镜像bzImage
          要注意两点要调整  
            2.1.1)Device Drivers  --->[*] Block devices  ---><*>   RAM block device support
               (16)    Default number of RAM disks
               (65536) Default RAM disk size (kbytes)
               [附]65536是 64M这个数字是设置内核启动时文件系统大小,在制作内存文件系统时要与这个数字保持一致
            2.1.2)General setup  --->[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
               [附]开启 RAM disks支持
               
       2.2)制作内存文件系统 initramfs.img
            2.1.1 制作根目录
                mkdir /kernel-debug/fsroot/
                cd busybox-1.32.0/
                ./configure
                #./configure --prefix=/usr --sysconfdir=/etc --disable-werror make
                make install
                cp -R /kernel-debug/busybox-1.32.0/_install/* /kernel-debug/fsroot/
                cp -a /kernel-debug/busybox-1.32.0/examples/bootfloppy/etc/* /kernel-debug/iso/etc/
                chmod u+x /kernel-debug/fsroot/etc/init.d/rcS
                cd /kernel-debug/fsroot/bin
                ln -s ../sbin/init ./init
                
            2.1.2
             有很多方式,这里列两种(其实是一种)
             方式 1) 
                #dd 新建一个模拟块设备的文件,65536是设置大小(要与内核设置Ramdisk一致)
                dd if=/dev/zero of=/kernel-debug/iso/boot/looop_l0086.img bs=1k count=65536
                #losetup 把这个设备的文件变成一个本地的回环设备
                losetup /dev/loop10086 /kernel-debug/iso/boot/looop_l0086.img
                #格式化成 ext2文件系统
                mke2fs -c /dev/loop10086 65536
                #新建挂载目录
                mkdir /kernel-debug/mnt/looop_l0086
                #挂载回环设备
                mount -t ext2 /dev/loop10086 /kernel-debug/mnt/looop_l0086
                #复制根文件系统到looop设备
                cp -a /kernel-debug/fsroot/* /kernel-debug/mnt/looop_l0086
                #卸载回环设备
                umount /dev/loop10086
                #断开回环设备
                losetup -d /dev/loop10086
                #压缩一下
                gzip -9 /kernel-debug/iso/boot/looop_l0086.img
                #名字改成 initramfs.img
                mv /kernel-debug/iso/boot/looop_l0086.img.gz /kernel-debug/iso/boot/initramfs.img

             方式 2) 
                # /dev/ram0 是用户空间的 Ramdisk 大小并无限制,但是要做内核内存文件系统必须与内核保持一致
                # /dev/ram0 在有的发行版中 ls /dev/ram0 是看不到设备的,但这没有关系
                # mkfs.ext2 /dev/ram0 65536 用于格式化成 ext2 文件系统,如果后面跟了数字 /dev/ram0 不存在则会自动创建,存在则会示示己存在,提示是否重建 
                mkfs.ext2 /dev/ram0 65536
                #新建挂载目录
                mkdir  /kernel-debug/mnt/rd
                #挂载
                mount /dev/ram0 /kernel-debug/mnt/rd 
                #df 查看一下 /kernel-debug/mnt/rd 被挂到哪去了, 竞然是/dev/loop0  它就是 /dev/ram0
                df 
                /dev/loop0       62M   18M   41M   31% /kernel-debug/mnt/rd
                #复制根文件系统到looop设备
                cp -a /kernel-debug/fsroot/* /kernel-debug/mnt/rd
                #最后还是用 dd 把/dev/ram0 映射到 一个文件里
                dd if=/dev/ram0 of=/kernel-debug/iso/boot/initramfs.img
                #卸载设备
                umount /kernel-debug/mnt/rd 
                #压缩一下
                gzip -9 /kernel-debug/iso/boot/initramfs.img
                #名字改成 initramfs.img
                mv /kernel-debug/iso/boot/initramfs.img.gz /kernel-debug/iso/boot/initramfs.img
       
       2.3)生成一个grub.iso 启动盘
                2.1 grub2编译安装  源码目录下 生成 _install 文件夹
                      /kernel-debug/grub-2.04~rc1/_install/lib/grub/i386-pc
                2.2 配置 iso 目录
                    mkdir -p /kernel-debug/iso/boot/grub
                    cp -a /kernel-debug/linux-5.9.8/arch/x86/boot/bzImage /kernel-debug/iso/boot/
                    cp -a /kernel-debug/grub-2.04~rc1/_install/lib/grub/i386-pc /kernel-debug/iso/boot/grub/
                    
                    ls  /kernel-debug/iso/boot/ 
                         bzImage  grub  initramfs.img
                    ls  /kernel-debug/iso/boot/grub/
                         grub.cfg  i386-pc
                    vim grub.cfg
                    
                    set default=0
                    set timeout=20
                    set label=GRUB2
                    set check_signatures=no
                    set default=0
                    set fallback=1
                    set gfxmode=800x600,auto
                    set lang=zh_CN
                    set pager=1
                    set timeout=5 
                    
                    insmod gfxterm  
                    insmod keylayouts  
                    insmod regexp
                    insmod datehook  
                    insmod fat
                    insmod iso9660
                    insmod loopback
                    insmod ext2
                    insmod xfs
                    insmod vbe
                    insmod vga
                    insmod part_msdos
                    insmod gfxmenu
                    insmod gzio
                     
                    menuentry "linux-5.9.8-grub.ios boot" {
                            echo ${root}
                            set timeout=2 
                            linux (hd31)/boot/bzImage root=/dev/ram0 rw 
                            initrd (hd31)/boot/initramfs.img
                    } 
                    
                2.3    生成 grub.iso
                    2.3.1 配置 bootconfig.cfg
                      vim /kernel-debug/bootconfig.cfg
                         # volid-boot 是卷标随便起的 要与 2.3.4步中的 卷标一样
                         search --no-floppy --fs-label=volid-boot --set=root --file /boot/grub/grub.cfg
                         prefix=($root)/boot/grub
                         configfile /boot/grub/grub.cfg

                    2.3.2 生成 core.img 
                      grub-mkimage -d /kernel-debug/grub-2.04~rc1/_install/lib/grub/i386-pc -p /boot/grub -o /kernel-debug/iso/boot/grub/core.img -O i386-pc -c /kernel-debug/bootconfig.cfg biosdisk part_msdos fat exfat ntfs ext2 iso9660 udf configfile search help  reiserfs font linux chain echo

                    2.3.3 生成 g2ldr.mbr
                      cat /kernel-debug/grub-2.04~rc1/_install/lib/grub/i386-pc/cdboot.img /kernel-debug/iso/boot/grub/core.img > /kernel-debug/iso/boot/grub/g2ldr.mbr
                    
                    2.3.4 写入到 iso
                      mkisofs -R -l -no-emul-boot -boot-info-table -boot-load-size 4  -b boot/grub/g2ldr.mbr -o /kernel-debug/grub.iso -V volid-boot  -v /kernel-debug/is   

   

  几个概念
    内核模块是啥
    源码目录 生成Makefile前 把要单独编出来的模块 标记为M
    make modules_install INSTALL_MOD_PATH=~/rootfs # 编译内核时把一些选为M的模块编到 ~/rootfs 目录
    
    内核模块分出来的好处
    1)内核模块分出来可以减少 bzImage大小,相当于把它的一部分可以分到其它目录下
    2)每次编译时不用全部重新编译,只编译修改的模块就行了,节约时间
    3)把一些驱动模块 通过 initrd机制先预先让 bootload (如grub2或u-boot)加载 到内存中去
    
    Ramdisk 是啥东东 (Ramdisk 不一定必须 )
      Ramdisk 是内存模拟硬盘
        分两种 一种是用户态 一种是内核态 ?
        内核态的就是 配合initrd使用的 
        户态的 Ramdisk ?有待验证, 也要能读代码
        
    initrd 又是啥(initrd 也不一定是加载 内核模块)
       initrd是linux 一种初始化步骤 
       就是先把bootload 带过来的一些东西放到一个内核态的 Ramdisk里面 
       但initrd 不一定就是内存文件系统,
       只有root=/dev/ram0 才是确定把内存盘设为根的
       例如  testa.img 放了 /1/2/3/4/5/6/a.txt  /dev/ram0
       例如  testb.img 放了 /6/5/4/3/2/1/b.txt  /dev/ram1
       但内核执行 mount /dev/ram0 / 这句之前就要该问 /1/2/3/4/5/6/a.txt啊
       没关系,虽然没挂载根目录但内核是知道 /1/2/3/4/5/6/a.txt 就是 /dev/ram0 上面的东西的 
         
grub2-mkconfig #用来生成 grub.cfg 的,用不着手动配一下
grub2-install /dev/sda  #把 grub2-install 安装到硬盘  用不着手动配一下 因为我模块全编进内核了
几个问题 1)模块分出来不一定得 initrd,它只是把内核的一部分分出来放其它地方,不用一起重编 2)initrd 也不一定就是 加载模块 也可能是其它数据 使用 initrd 必须要 内核的 Ramdisk支持 3)Ramdisk 是虚拟硬盘 意思,并不一定就是根目录挂在 Ramdisk 上面 Ramdisk 分用户态 内核态? 用户可以在用户态创建的大小 只要不是用于 initrd 好像可以 比编译时设的值大 4)制作 initrd 所需要的 img文件 不一定非得 从 /dev/ramxxx 中复制映像 也可以可直接 通过losetup 文件模拟loop设备 5)关于grub2的几个问题 grub2中的 kernel.img 是指 grub2的主体程序,和linux内核半毛钱关系都没有 grub2中的 boot.img 是不包含在core.img中的,kernel.img则是包含在core.img中的 不知道是谁在瞎说 grub.cfg 中的模块是 grub2的模块 linux内核半毛钱关系都没 grub 的模块有两种形式加载,加载完后就能在grub界面使用了 1)生成 core.img时打包进去 2)grub.cfg中引入,这种形式的话它是存放在启动光盘中的,生成core.img可以指定位置。 启动光盘中到底写了啥东西在文件系统以外? 写了两个东西 cdboot.img+core.img 用 cat 和 >连成一个文件 g2ldr.mbr g2ldr.mbr 就是 xxboot.img+core.img mkisofs -b 指定 g2ldr.mbr 它后就会写光盘 mbr和它之后的一个扇区 硬盘同理,g2ldr.mbr=diskboot.img+core.img 解释一下 bootconfig.cfg bootconfig.cfg 内容: search --no-floppy --fs-label=volid-boot --set=root --file /boot/grub/grub.cfg prefix=($root)/boot/grub configfile /boot/grub/grub.cfg 解释一下 search 是 grub的一个命令,目的是找grub.cfg所在的分区 --no-floppy 别去找软盘,太慢了 --fs-label=volid-boot 根据物理设备卷标去找 --set=root 把找到的启动分区标识((hd0,0) 或 (hd31) 或 (hd0,1)或……。 ) 存放到一个变量里面,=root 就是定义这个变量名为 root(其实默认就是root) 这个root 和 [grub.cfg 中 linux (hd31)/boot/bzImage root=/dev/ram0 rw w] 的那个root没半毛钱关系,root=/dev/ram0中的root不能变它是传递给 linux内核的一个参数 这个root 你可以改成 set=abc 它只是一个grub认识的变量而己,这个变量代表的是 grub search r找到的分区 echo ${root} 就会打印这个分区标识,并且这个标识是grub认识的标识 不关linux啥事 --file /boot/grub/grub.cfg 根据分区是否存在 /boot/grub/grub.cfg 这样的一个目录去找 用法和grub.cfg里是一样的 prefix 就是定义grub在启动设备的安装目录变量 ($root)是core.img执行根据 search命令斌值 ($root)/boot/grub prefix 是给core.img程序用的,当然在grub.cfg中也能用 configfile /boot/grub/grub.cfg 就是说既然core.img确定了 prefix ,又确定了 root 这两个变量 那core.img就可以根据这两个变量存的地址去找到 grub.cfg 解释一下 mkisofs -R linux 文件系统必须 -l iso9660标准 -boot-info-table #不太明白 大概是启动设备mbr区域后面的一个保留位置? -boot-load-size 4 #不太明白 大概是定义g2ldr.mbr最大尺寸? -no-emul-boot #非模拟模式启动 -V volid-boot #卷标识(这个名字volid-boot随便起的,但是 生成core.img时 bootconfig.cfg里面 search --fs-label=volid-boot 这样就能根据卷标找到启动盘了) 

 

测试一下:

   命令详细
 
grub-mkimage [选项]... [模块]
  选项:
 -d, --directory=DIR use images and modules under DIR [default=/usr/lib/grub/@platform@]
 -p, --prefix=DIR set grub_prefix directory [default=/boot/grub]
 -m, --memdisk=FILE embed FILE as a memdisk image
 -f, --font=FILE embed FILE as a boot font
 -c, --config=FILE embed FILE as boot config
 -n, --note add NOTE segment for CHRP Open Firmware
 -o, --output=FILE output a generated image to FILE [default=stdout]
 -O, --format=FORMAT generate an image in format
 available formats: i386-coreboot, i386-multiboot, i386-pc, i386-efi,
 i386-ieee1275, i386-qemu, x86_64-efi, mipsel-yeeloong-flash, mipsel-yeeloong-elf, powerpc-ieee1275, sparc64-ieee1275-raw, sparc64-ieee1275-aout
 -h, --help display this message and exit
 -V, --version print version information and exit
 -v, --verbose print verbose messages

mkisofs (make iso file system)

功能说明:建立ISO 9660映像文件。
语  法:mkisofs [-adDfhJlLNrRTvz][-print-size][-quiet][-A<应用程序ID>][-abstract <摘要文件>][-b <开机映像文件>][-biblio ][-c<开机文件名称>][-C <盘区编号,磁区编号>][-copyright <版权信息文件>][-hide<目录或文件名>][-hide-joliet <文件或目录名>][-log-file <记录文件>][-m<目录或文件名>][-M <开机映像文件>][-o <映像文件>][-p<数据处理人>][-P <光盘发行人>][-sysid <系统ID >][-V <光盘ID>][-volset <卷册集ID>][-volset-size <光盘总数>][-volset-seqno<卷册序号>][-x <目录>][目录或文件]

补充说明:mkisofs可将指定的目录与文件做成ISO 9660格式的映像文件,以供刻录光盘。
参  数:
-a或–all mkisofs通常不处理备份文件。使用此参数可以把备份文件加到映像文件中。
-A<应用程序ID>或-appid<应用程序ID> 指定光盘的应用程序ID。
-abstract<摘要文件> 指定摘要文件的文件名。
-b<开机映像文件>或-eltorito-boot<开机映像文件> 指定在制作可开机光盘时所需的开机映像文件。
-biblio 指定ISBN文件的文件名,ISBN文件位于光盘根目录下,记录光盘的ISBN。
-c<开机文件名称> 制作可开机光盘时,mkisofs会将开机映像文件中的全-eltorito-catalog<开机文件名称>全部内容作成一个文件。
-C<盘区编号,盘区编号> 将许多节区合成一个映像文件时,必须使用此参数。
-copyright<版权信息文件> 指定版权信息文件的文件名。
-d或-omit-period 省略文件后的句号。
-D或-disable-deep-relocation ISO 9660最多只能处理8层的目录,超过8层的部分,RRIP会自动将它们设置成ISO 9660兼容的格式。使用-D参数可关闭此功能。
-f或-follow-links 忽略符号连接。
-h 显示帮助。
-hide<目录或文件名> 使指定的目录或文件在ISO 9660或Rock RidgeExtensions的系统中隐藏。
-hide-joliet<目录或文件名> 使指定的目录或文件在Joliet系统中隐藏。
-J或-joliet 使用Joliet格式的目录与文件名称。
-l或-full-iso9660-filenames 使用ISO 9660 32字符长度的文件名。
-L或-allow-leading-dots 允许文件名的第一个字符为句号。
-log-file<记录文件> 在执行过程中若有错误信息,预设会显示在屏幕上。
-m<目录或文件名>或-exclude<目录或文件名> 指定的目录或文件名将不会房入映像文件中。
-M<映像文件>或-prev-session<映像文件> 与指定的映像文件合并。
-N或-omit-version-number 省略ISO 9660文件中的版本信息。
-o<映像文件>或-output<映像文件> 指定映像文件的名称。
-p<数据处理人>或-preparer<数据处理人> 记录光盘的数据处理人。
-print-size 显示预估的文件系统大小。
-quiet 执行时不显示任何信息。
-r或-rational-rock 使用Rock Ridge Extensions,并开放全部文件的读取权限。
-R或-rock 使用Rock Ridge Extensions。
-sysid<系统ID> 指定光盘的系统ID。
-T或-translation-table 建立文件名的转换表,适用于不支持Rock Ridge Extensions的系统上。
-v或-verbose 执行时显示详细的信息。
-V<光盘ID

-no-emul-boot:Boot image is 'no emulation' image即非模拟模式启动
-boot-load-size:Set numbers of load sectors 即设置载入部分的数量
-boot-info-table:Patch boot image with info table 在启动的图像中显示信息

mkinitrd(选项)(参数)
选项
-f:若指定的映像问家名称与现有文件重复,则覆盖现有的文件;
-v:执行时显示详细的信息;
--omit-scsi-modules:不要载入SCSI模块;
--preload=<模块名称>:指定要载入的模块;
--with=<模块名称>:指定要载入的模块;
--version:显示版本信息。
   
     
Linux dd命令用于读取、转换并输出数据。

dd可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。
参数说明:
if=文件名:输入文件名,默认为标准输入。即指定源文件。
of=文件名:输出文件名,默认为标准输出。即指定目的文件。
ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。
obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。
bs=bytes:同时设置读入/输出的块大小为bytes个字节。
cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。
skip=blocks:从输入文件开头跳过blocks个块后再开始复制。
seek=blocks:从输出文件开头跳过blocks个块后再开始复制。
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
conv=<关键字>,关键字可以有以下11种:
conversion:用指定的参数转换文件。
ascii:转换ebcdic为ascii
ebcdic:转换ascii为ebcdic
ibm:转换ascii为alternate ebcdic
block:把每一行转换为长度为cbs,不足部分用空格填充
unblock:使每一行的长度都为cbs,不足部分用空格填充
lcase:把大写字符转换为小写字符
ucase:把小写字符转换为大写字符
swab:交换输入的每对字节
noerror:出错时不停止
notrunc:不截短输出文件
sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。
--help:显示帮助信息
--version:显示版本信息     

Linux losetup命令用于设置循环设备。 
循环设备可把文件虚拟成区块设备,籍以模拟整个文件系统,让用户得以将其视为硬盘驱动器,光驱或软驱等设备,并挂入当作目录来使用。 
语法
losetup [-d][-e <加密方式>][-o <平移数目>][循环设备代号][文件]
参数:

-d 卸除设备。
-e<加密方式> 启动加密编码。
-o<平移数目> 设置数据平移的数目。
     6)其它 
     关于  mobailes_install  内核模块为什么要做成 Ramdisk
            (即不包含进内核)的好处有:
    1)减小mvlinux的大小,mvlinux一般放在/boot/ 目录
       其它模块则在安装时,安装脚本可有选择的将必有模块装入硬盘
    2)有些安装设备如U盘,它的驱动需要提前让grub2 带进放进/dev/ram0    

       
 
posted on 2020-12-22 05:17  自制力缺失症患者  阅读(273)  评论(0编辑  收藏  举报