向磁盘分区中添加g2ldr引导记录的工具,附源码

启动讨论 grub/grub2/syslinux/grub4dos/Lilo
回复
badlyby
帖子: 17
注册时间: 2012-08-09 10:40

向磁盘分区中添加g2ldr引导记录的工具,附源码

#1

帖子 badlyby » 2012-08-09 10:51

windows下有bootsect.exe可以方便的向磁盘中添加ntldr或者bootmgr的引导文件,而Linux下我没有找到类似的工具,所以自己编了一个在此分享一下.
支持向fat16,fat32,ntfs分区添加引导记录,可以引导g2ldr文件,fat16模式虽然可以正确添加引导但是grub2对fat16支持好像不是很好.
工具:
vbr.zip
vbr32是32位版
vbr64是64位版
(8.1 KiB) 已下载 116 次
源码:
vbr_src.zip
启动代码提取自bootsect.exe(不用于商业目的应该不算侵权吧)
(2.75 KiB) 已下载 112 次
evnious
帖子: 4
注册时间: 2008-07-24 15:01

Re: 向磁盘分区中添加g2ldr引导记录的工具,附源码

#2

帖子 evnious » 2012-08-13 22:41

好东西,用过bootice 。 试下楼主这个。
不过还是想知道如何手动添加。。。
badlyby
帖子: 17
注册时间: 2012-08-09 10:40

Re: 向磁盘分区中添加g2ldr引导记录的工具,附源码

#3

帖子 badlyby » 2012-08-14 8:28

evnious 写了:好东西,用过bootice 。 试下楼主这个。
不过还是想知道如何手动添加。。。
你可以看看源代码就是向某几个扇区添加几段代码,可以用dd指令实现,不过还需要对分区类型进行判断
funicorn
帖子: 1318
注册时间: 2005-09-13 4:56
系统: Ubuntu Jammy Jellyfi

Re: 向磁盘分区中添加g2ldr引导记录的工具,附源码

#4

帖子 funicorn » 2012-08-14 9:22

linux下怎么没有,mbr这个包就是干这个的

另外,/usr/lib/syslinux/下有一个mbr.bin,就是windows的主引导记录
头像
careone
帖子: 839
注册时间: 2007-12-17 21:41

Re: 向磁盘分区中添加g2ldr引导记录的工具,附源码

#5

帖子 careone » 2012-08-14 9:53

烦请楼主贴出使用方法和参数
魁拔不死,天下不宁。
魁拔既死,天下不平。
--------------
Careone <emacslocale^126.com>
https://sourceforge.net/projects/emacslocale/files/
badlyby
帖子: 17
注册时间: 2012-08-09 10:40

Re: 向磁盘分区中添加g2ldr引导记录的工具,附源码

#6

帖子 badlyby » 2012-08-14 10:07

careone 写了:烦请楼主贴出使用方法和参数
参数只有一个,比如你使用的是64位系统,设备文件是/dev/sdb1就执行指令vbr64 /dev/sdb1
然后把g2ldr放进去
g2ldr 可以通过以下方法获得:
cat /boot/grub/lnxboot.img /boot/grub/core.img > g2ldr
也可以使用grub-mkimage自己定制
用这种方法可以比较方便的制作USB启动盘
badlyby
帖子: 17
注册时间: 2012-08-09 10:40

Re: 向磁盘分区中添加g2ldr引导记录的工具,附源码

#7

帖子 badlyby » 2012-08-14 10:11

funicorn 写了:linux下怎么没有,mbr这个包就是干这个的

另外,/usr/lib/syslinux/下有一个mbr.bin,就是windows的主引导记录
我这个工具是添加卷引导记录VBR也就是单个分区引导的,某些电脑可能除了VBR以外还需要添加MBR。我作的这个工具只是模仿windows下的bootsect工具
badlyby
帖子: 17
注册时间: 2012-08-09 10:40

Re: 向磁盘分区中添加g2ldr引导记录的工具,附源码

#8

帖子 badlyby » 2012-08-14 10:23

再贴一段制作g2ldr定制的shell脚本,给需要的人

代码: 全选

#!/bin/sh
format_set="i386-pc"
rm g2ldr 2> /dev/null
rm core.img 2> /dev/null
rm memdisk.cpio 2> /dev/null
rm ./boot -r 2> /dev/null
mkdir ./boot
mkdir ./boot/grub
mkdir ./boot/grub/locale
cp /usr/lib/grub/$format_set/efiemu.mod ./boot/grub
cp /usr/lib/grub/$format_set/gfxmenu.mod ./boot/grub
cp /usr/lib/grub/$format_set/bitmap.mod ./boot/grub
cp /usr/lib/grub/$format_set/jpeg.mod ./boot/grub
cp /usr/lib/grub/$format_set/tga.mod ./boot/grub
cp /usr/lib/grub/$format_set/png.mod ./boot/grub
cp /usr/lib/grub/$format_set/play.mod ./boot/grub
cp /usr/lib/grub/$format_set/ufs1.mod ./boot/grub
cp /usr/lib/grub/$format_set/ufs2.mod ./boot/grub
cp /usr/lib/grub/$format_set/minix.mod ./boot/grub
cp /usr/lib/grub/$format_set/minix2.mod ./boot/grub
cp /usr/lib/grub/$format_set/terminal.mod ./boot/grub
cp /usr/lib/grub/$format_set/terminfo.mod ./boot/grub
cp /usr/lib/grub/$format_set/usb.mod ./boot/grub
cp /usr/lib/grub/$format_set/usb_keyboard.mod ./boot/grub
cp /usr/lib/grub/$format_set/usbms.mod ./boot/grub
cp /usr/lib/grub/$format_set/ohci.mod ./boot/grub
cp /usr/lib/grub/$format_set/multiboot2.mod ./boot/grub
cp /usr/lib/grub/$format_set/nilfs2.mod ./boot/grub
cp /usr/lib/grub/$format_set/ata.mod ./boot/grub
cp /usr/lib/grub/$format_set/hashsum.mod ./boot/grub
cp /usr/lib/grub/$format_set/xnu_uuid.mod ./boot/grub
cp /usr/lib/grub/$format_set/vbe.mod ./boot/grub
cp /usr/lib/grub/$format_set/vga.mod ./boot/grub
cp /usr/lib/grub/$format_set/video_bochs.mod ./boot/grub
cp /usr/lib/grub/$format_set/video_cirrus.mod ./boot/grub
cp /usr/lib/grub/$format_set/gfxterm.mod ./boot/grub
cp /usr/lib/grub/$format_set/gettext.mod ./boot/grub
cp /usr/lib/grub/$format_set/*.lst ./boot/grub
cp /usr/lib/grub/$format_set/*.o ./boot/grub
cp /usr/lib/syslinux/memdisk ./boot/grub
cp grub.cfg ./boot/grub/
#cp /usr/share/grub/unicode.pf2 ./boot/grub/
cp /boot/grub/locale/* ./boot/grub/locale
find boot | cpio -o -H ustar > memdisk.cpio
grub-mkimage -O $format_set -o core.img --prefix='(memdisk)/boot/grub' -m memdisk.cpio acpi affs afs befs biosdisk blocklist boot bsd btrfs bufio cat chain configfile cpio drivemap echo elf ext2 fat gzio halt help hfs hfsplus iso9660 jfs linux16 linux loadenv loopback ls lvm lzopio memdisk mmap multiboot ntfscomp ntfs ntldr part_acorn part_amiga part_apple part_bsd part_gpt part_msdos part_sun part_sunpc pxe raid reboot reiserfs scsi search_fs_file search_fs_uuid search_label search sfs tar udf xfs xnu xzio zfs gptsync pxecmd
cat /boot/grub/lnxboot.img ./core.img > g2ldr
另附一个我写的配置文件:grub.cfg写好后跟shell脚本放在同一目录下

代码: 全选

function load_video {
  insmod vbe
  insmod vga
  insmod video_bochs
  insmod video_cirrus
}
function chroot {
  prefix=(${root})/boot/grub/
}
set timeout=5
search --no-floppy -f --set=fontdev /boot/grub/unicode.pf2
if loadfont ($fontdev)/boot/grub/unicode.pf2 ; then
  set gfxmode=auto
  load_video
  insmod gfxterm
  set locale_dir=(memdisk)/boot/grub/locale
  set lang=zh_CN
  insmod gettext
  terminal_output gfxterm
fi
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
if background_color 44,0,30; then
  clear
fi
insmod reboot
search --no-floppy -f --set=root /boot/grub/wzlboot.cfg
source /boot/grub/wzlboot.cfg
"/boot/grub/wzlboot.cfg"替换成你想用来存放grub菜单的文件路径
g2ldr.zip
写好的文件和现成的g2ldr
(364.18 KiB) 已下载 106 次
badlyby
帖子: 17
注册时间: 2012-08-09 10:40

Re: 向磁盘分区中添加g2ldr引导记录的工具,附源码

#9

帖子 badlyby » 2012-08-14 10:44

再加一个引导菜单的配置文件,全套的
/boot/grub/wzlboot.cfg:

代码: 全选

menuentry '微型Linux TinyCore'{
	search --no-floppy --file --set=root /boot/iso/TinyCore.iso
	set isofile="/boot/iso/TinyCore.iso"
	loopback loop /boot/iso/TinyCore.iso
	linux (loop)/boot/vmlinuz iso-scan/filename=/boot/iso/TinyCore.iso quiet cde
	initrd (loop)/boot/core.gz
}
menuentry "运行 Ubuntu Linux" {
	search --no-floppy --file --set=root /boot/iso/ubuntu.iso
	loopback loop /boot/iso/ubuntu.iso
	linux	(loop)/casper/vmlinuz iso-scan/filename=/boot/iso/ubuntu.iso file=(loop)/cdrom/preseed/ubuntu.seed noapic nomodeset boot=casper locale=zh_CN.UTF-8 quiet splash --
	initrd	(loop)/casper/initrd.lz
}
menuentry "安装 Ubuntu Linux" {
	search --no-floppy --file --set=root /boot/iso/ubuntu.iso
	loopback loop /boot/iso/ubuntu.iso
	linux	(loop)/casper/vmlinuz iso-scan/filename=/boot/iso/ubuntu.iso file=(loop)/cdrom/preseed/ubuntu.seed noapic nomodeset boot=casper locale=zh_CN.UTF-8 only-ubiquity quiet splash --
	initrd	(loop)/casper/initrd.lz
}
menuentry "检查Linux安装盘的完整性" {
	search --no-floppy --file --set=root /boot/iso/ubuntu.iso
	loopback loop /boot/iso/ubuntu.iso
	linux	(loop)/casper/vmlinuz noapic boot=casper integrity-check locale=zh_CN.UTF-8 quiet splash --
	initrd	(loop)/casper/initrd.lz
}
menuentry '启动 Windows UEFI'{
	search --no-floppy --file --set=root /efi/microsoft/boot/bootmgfw.efi
	chainloader /efi/microsoft/boot/bootmgfw.efi
}
menuentry '安装 Windows7 UEFI(需要bootmgfw.efi)'{
	search --no-floppy --file --set=root /sources/install.wim
	chainloader /bootmgfw.efi
}
menuentry '安装 Windows8 UEFI'{
	search --no-floppy --file --set=root /sources/install.wim
	chainloader /efi/boot/bootx64.efi
}
menuentry '安装 Windows BIOS'{
	insmod ntldr
	ntldr /bootmgr
}
menuentry 'DiskGen磁盘分区工具'{
	insmod linux16
	linux16 ${prefix}/memdisk raw
	initrd16 /boot/img/diskgen.img
}
menuentry 'Win98DOS'{
	insmod linux16
	linux16 ${prefix}/memdisk raw
	initrd16 /boot/img/win98.img
}
把/usr/share/grub/unicode.pf2复制到启动盘的/boot/grub目录下可以支持中文显示
下载TinyCore的iso镜像放在/boot/iso/下改名TinyCore.iso可以用来引导TinyCore
下载ubuntu的live cd放在/boot/iso/下改名ubuntu.iso可以用来引导ubuntu live cd
把windows 7的光盘内容复制到启动盘的根目录可以用来引导windows7安装
这样一个可以安装ubuntu和windows7的混合引导盘就做好了(最近在研究grub-efi其中部分代码是UEFI模式的)
头像
youzhiyili
帖子: 2422
注册时间: 2012-03-22 20:42
系统: ubuntu22.04

Re: 向磁盘分区中添加g2ldr引导记录的工具,附源码

#10

帖子 youzhiyili » 2012-08-14 10:57

先顶后看 :em11
@自由建客 @qy117121 @枫叶饭团 @cikekid @YeLee @jtshs256 @eexpress @ljj_jjl2008 @zhw2101024 @TeliuTe @月下叹逍遥 @leeaman @懒蜗牛Gentoo @灰色小狼 @photor @adagio @JiangHui @phoenixlzx @oneleaf
头像
niumao
帖子: 392
注册时间: 2010-10-27 20:43

Re: 向磁盘分区中添加g2ldr引导记录的工具,附源码

#11

帖子 niumao » 2013-05-05 1:27

:em11 正需要这个呢。真大牛。
牛是牛顿的牛 毛是朱毛的毛
头像
niumao
帖子: 392
注册时间: 2010-10-27 20:43

Re: 向磁盘分区中添加g2ldr引导记录的工具,附源码

#12

帖子 niumao » 2013-05-05 1:46

:em11 正需要这个呢。真大牛。
牛是牛顿的牛 毛是朱毛的毛
回复