2

我用谷歌搜索了 grub2-lua,但发现它的信息很少。我找不到 grub2-lua 的官方网站(即官方源代码 tarball 下载链接),除了一个 git clone 链接。

此外,我找不到任何关于 grub lua 的文档。所以我不知道如何使用它。

我设法将 grub2 和 lua 模块一起编译,然后我启动到 grub 并键入“help lua”以尝试获取一些帮助信息。但它只是说我可以使用命令“lua script_file.lua”来执行 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模块对文件和目录进行操作。

4

1 回答 1

3

我发现了一个关于使用 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
于 2014-11-11T10:15:33.603 回答