我用谷歌搜索grub2-lua,但发现很少有关于它的信息。我找不到grub2-lua的官方网站(即官方源代码tarball下载链接),除了git克隆链接。
而且,我找不到任何关于grub lua的文档。所以我不知道如何使用它。
我设法将grub2与lua模块一起编译,然后我启动grub并键入"help lua"以尝试获得一些帮助信息。但它只说我可以使用命令"lua script_file"。来执行Lua脚本。所以我只是想学习如何使用lua模块的细节。例如,如何在grub.cfg文件中执行lua命令,如何将lua执行结果返回到grub.cfg文件中,以及grub为lua模块提供了哪些api。
我使用lua模块的原因是我需要grub中的文件系统操作(即mv, cp, cd, pwd, mkdir, rm, nano命令)。Grub2本身不提供此功能。一些帖子说grub-extra-lua模块可能会提供这个功能。
所以我只是想知道如何使用grub lua模块对文件和目录进行操作。
我找到了一个关于使用grub2-lua的博客http://linux.xvx.cz/2010/03/using-grub2-and-lua-installed-on-usb.html
在我看来,你可以通过添加
直接从grub.cfg加载lua脚本insmod vbe (or insmod vbeinfo)
# Uncomment for a different ISO files search path
#set isofolder="/boot/isos"
#export isofolder
# Uncomment for a different live system language
#set isolangcode="us"
#export isolangcode
lua /boot/grub/bootiso.lua
我复制了bootiso。这里是Lua脚本。这是自动启动ISO映像更改版本/文件名
#!lua
-- Detects the live system type and boots it
function boot_iso (isofile, langcode)
-- grml
if (dir_exist ("(loop)/boot/grml64")) then
boot_linux (
"(loop)/boot/grml64/linux26",
"(loop)/boot/grml64/initrd.gz",
"findiso=" .. isofile .. " apm=power-off quiet boot=live nomce"
)
-- Parted Magic
elseif (dir_exist ("(loop)/pmagic")) then
boot_linux (
"(loop)/pmagic/bzImage",
"(loop)/pmagic/initramfs",
"iso_filename=" .. isofile ..
" edd=off noapic load_ramdisk=1 prompt_ramdisk=0 rw" ..
" sleep=10 loglevel=0 keymap=" .. langcode
)
-- Sidux
elseif (dir_exist ("(loop)/sidux")) then
boot_linux (
find_file ("(loop)/boot", "vmlinuz%-.*%-sidux%-.*"),
find_file ("(loop)/boot", "initrd%.img%-.*%-sidux%-.*"),
"fromiso=" .. isofile .. " boot=fll quiet"
)
-- Slax
elseif (dir_exist ("(loop)/slax")) then
boot_linux (
"(loop)/boot/vmlinuz",
"(loop)/boot/initrd.gz",
"from=" .. isofile .. " ramdisk_size=6666 root=/dev/ram0 rw"
)
-- SystemRescueCd
elseif (grub.file_exist ("(loop)/isolinux/rescue64")) then
boot_linux (
"(loop)/isolinux/rescue64",
"(loop)/isolinux/initram.igz",
"isoloop=" .. isofile .. " docache rootpass=xxxx setkmap=" .. langcode
)
-- Tinycore
elseif (grub.file_exist ("(loop)/boot/tinycore.gz")) then
boot_linux (
"(loop)/boot/bzImage",
"(loop)/boot/tinycore.gz"
)
-- Ubuntu and Casper based Distros
elseif (dir_exist ("(loop)/casper")) then
boot_linux (
"(loop)/casper/vmlinuz",
find_file ("(loop)/casper", "initrd%..z"),
"boot=casper iso-scan/filename=" .. isofile ..
" quiet splash noprompt" ..
" keyb=" .. langcode ..
" debian-installer/language=" .. langcode ..
" console-setup/layoutcode?=" .. langcode ..
" --"
)
-- Xpud
elseif (grub.file_exist ("(loop)/boot/xpud")) then
boot_linux (
"(loop)/boot/xpud",
"(loop)/opt/media"
)
else
print_error ("Unsupported ISO type")
end
end
-- Help function to show an error
function print_error (msg)
print ("Error: " .. msg)
grub.run ("read")
end
-- Help function to search for a file
function find_file (folder, match)
local filename
local function enum_file (name)
if (filename == nil) then
filename = string.match (name, match)
end
end
grub.enum_file (enum_file, folder)
if (filename) then
return folder .. "/" .. filename
else
return nil
end
end
-- Help function to check if a directory exist
function dir_exist (dir)
return (grub.run("test -d '" .. dir .. "'") == 0)
end
-- Boots a Linux live system
function boot_linux (linux, initrd, params)
if (linux and grub.file_exist (linux)) then
if (initrd and grub.file_exist (initrd)) then
if (params) then
grub.run ("linux " .. linux .. " " .. params)
else
grub.run ("linux " .. linux)
end
grub.run ("initrd " .. initrd)
else
print_error ("Booting Linux failed: cannot find initrd file '" .. initrd .. "'")
end
else
print_error ("Booting Linux failed: cannot find linux file '" .. initrd .. "'")
end
end
-- Mounts the iso file
function mount_iso (isofile)
local result = false
if (isofile == nil) then
print_error ("variable 'isofile' is undefined")
elseif (not grub.file_exist (isofile)) then
print_error ("Cannot find isofile '" .. isofile .. "'")
else
local err_no, err_msg = grub.run ("loopback loop " .. isofile)
if (err_no ~= 0) then
print_error ("Cannot load ISO: " .. err_msg)
else
result = true
end
end
return result
end
-- Getting the environment parameters
isofile = grub.getenv ("isofile")
langcode = grub.getenv ("isolangcode")
if (langcode == nil) then
langcode = "us"
end
-- Mounting and booting the live system
if (mount_iso (isofile)) then
boot_iso (isofile, langcode)
end