gpt4 book ai didi

c - 调试 syslinux 看到的引导文件系统环境?

转载 作者:行者123 更新时间:2023-12-04 00:08:53 24 4
gpt4 key购买 nike

希望可以记下来,即使我不能立即接受答案(并希望这样可以 - 因为下面有一个 C 补丁):

看来我搞砸了台式电脑上的硬盘( {DRDY err} )。所以我想运行一个可启动媒体来运行 fsck ,但是这个桌面上的CD坏了,所以只能用U盘了。我有几个带有 Ubuntu 和 Suse 的 USB 拇指驱动器 - 它们开始在桌面上启动;但是在启动过程中,udev 尝试检测硬盘驱动器,并且由于硬盘被拧紧,它只是在那里循环,并且相应的操作系统永远不会完成启动。

所以我尝试下载SystemRescueCd ;我有这个 USB 拇指驱动器,我试图在上面安装 SystemRescueCD:

# lsusb with sudo, to retrieve all info
$ sudo lsusb -v -d 058f:6387 | grep -i 'id\|iManufacturer\|iProduct\|iSerial\|bInterface'
Bus 001 Device 043: ID 058f:6387 Alcor Micro Corp. Transcend JetFlash Flash Drive
idVendor 0x058f Alcor Micro Corp.
idProduct 0x6387 Transcend JetFlash Flash Drive
iManufacturer 1 takeMS
iProduct 2 Mem-drive Mini
iSerial 3 C5E7F0CC
bInterfaceNumber 0
bInterfaceClass 8 Mass Storage
bInterfaceSubClass 6 SCSI
bInterfaceProtocol 80 Bulk (Zip)

# search by serial:
$ find /dev/disk/by-id/ -name '*C5E7F0CC*'
/dev/disk/by-id/usb-takeMS_Mem-drive_Mini_C5E7F0CC-0:0-part1
/dev/disk/by-id/usb-takeMS_Mem-drive_Mini_C5E7F0CC-0:0

# list and get device node
$ ls -la /dev/disk/by-id/usb-takeMS_Mem-drive_Mini_C5E7F0CC-0:0
lrwxrwxrwx 1 root root 9 2013-03-25 20:37 /dev/disk/by-id/usb-takeMS_Mem-drive_Mini_C5E7F0CC-0:0 -> ../../sdc
$ ls -la /dev/disk/by-id/usb-takeMS_Mem-drive_Mini_C5E7F0CC-0\:0-part1
lrwxrwxrwx 1 root root 10 2013-03-25 20:37 /dev/disk/by-id/usb-takeMS_Mem-drive_Mini_C5E7F0CC-0:0-part1 -> ../../sdc1

# it is /dev/sdc - list disk info
$ sudo fdisk -l /dev/sdc

Disk /dev/sdc: 2108 MB, 2108686336 bytes
94 heads, 29 sectors/track, 1510 cylinders
Units = cylinders of 2726 * 512 = 1395712 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0003e405

Device Boot Start End Blocks Id System
/dev/sdc1 * 1 1511 2059263+ c W95 FAT32 (LBA)

我尝试使用我的 Ubuntu 11.04 Natty 上网本对拇指驱动器进行镜像 - 我同时使用了两者
  • 推荐usb_inst.sh installer ;和
  • 我尝试使用 unetbootin (通过 sudo apt-get install unetbootin);

  • 在这两种情况下,当我尝试在桌面上启动 USB 拇指驱动器时,启动过程失败:
    SYSLINUX 4.02 debian-20101016 CHS Copyright (C) 1993-2010 H. Peter Anvin et al
    ERROR: No configuration file found
    No DEFAULT or UI configuration directive found!
    boot:

    .... 开机提示。 (实际上, unetbootin 在进入 syslinux 之前在“验证 DMI 池数据”中失败——可能是因为它比我试图成像的 .iso 旧得多)。

    首先,我检查了 No Default or UI Configuration Found! 中提到的 md5
    $ md5sum ./systemrescuecd-x86-3.5.0.iso
    48552b9e905872bd5061eb112b73ea20 ./systemrescuecd-x86-3.5.0.iso

    ...但似乎没问题,根据 Sysresccd-versions .

    然后我尝试将驱动器重新格式化为 FAT16(通过 sudo gparted /dev/sdc);并重复了 usb_inst.shunetbootin方法 - 再次没有骰子。有趣的是,在所有这些情况下,如果我尝试在 QEMU 模拟器中运行闪存 USB 拇指驱动器:
    # sudo apt-get install qemu
    sudo qemu -hda /dev/sdc

    ...它启动正常 - 显示 syslinux 菜单等等;但是,在桌面上启动总是失败。

    在这里我应该提到,我可以从有问题的台式电脑的启动屏幕上写下以下内容:
    Award Modular BIOS v6.00PG
    AMDRS740 BIOS

    它有一个通过 F12 访问的引导菜单,在引导菜单中,还有其他选项,这些是用于 USB 的:
    ...
    USB-FDD
    USB-ZIP
    USB-CDROM
    USB-HDD
    ...

    通常,我选择 USB-HDD - 但我也尝试过其他的;要么程序在进入之前就卡住了 syslinux - 或者启动失败,如上所述。

    建议从 isolinux 手动重命名目录/文件至 syslinux ( Trying to boot from usb - Ask Ubuntu ) - 当我使用 usb_inst.sh 时, 仅 syslinux/isolinux.bin将不得不重命名。还有建议复制 syslinux.cfg到 USB 闪存拇指驱动器的根目录 ( Cannot boot Live USB, Linux - Super User )。但仍然没有改进 - syslinux仍然提示它缺少配置文件 - 显然是 syslinux.cfg .

    然后我试着看看是否有可能以某种方式“调试”syslinux;找到 log tracing/debugging/trouble shooting in syslinux - The Syslinux Project - reboot.pro :

    > Do we have specific commands to trace or log syslinux?
    Being open source, one is able to compile Syslinux and enable extra debugging output.



    还有 [SOLVED] Stuck on boot: Syslinux Problem [Archive] - Ubuntu Forums :“_
    调试 syslinux 描述于 http://www.syslinux.org/wiki/index.php/Development/Debugging ,但有效的调试(如果我没记错的话)需要重新编译它以添加调试钩子(Hook)。_”。然而, Development/Debugging - Syslinux Wiki 谈到了一种叫做 bochs 的东西;我怀疑这是调试 syslinux 本身 - 不一定要“调试”(或查询)它所处的环境。

    无论如何,我终于看不到出路,只能得到 syslinux从源头;基本上,这是需要的,所以它构建:
    sudo apt-get install nasm
    sudo apt-get install uuid-dev
    git clone git://git.kernel.org/pub/scm/boot/syslinux/syslinux.git syslinux-git
    cd syslinux-git/
    make OPTFLAGS+=-DDEBUG=1

    事实证明,目前还不清楚如何启用此类调试,这将显示 syslinux当插入给定的计算机时“看到”;鉴于我确实加载到 syslinux在启动时,问题是它看到的文件系统是什么。我尝试启用 DEBUG 环境变量,如上所示(在将 override OPTFLAGS := 添加到 Makefile 之后) - 但在启动失败期间,这本身没有生成新消息。我使用以下命令来“刻录”USB 拇指驱动器(从 Gnome 小程序中卸载它后):
    sudo ./linux/syslinux --stupid --directory /syslinux --install /dev/sdc1

    ...我已经尝试过 stupid和没有(并且都用于源代码构建版本,以及来自 Natty 的 Ubuntu 软件包存储库的版本)。

    通过搜索源代码,我意识到有一种叫做 rosh 的东西。 ( Read-Only SHell ) - 但是,编译为 rosh.c32 - 应该将其作为 syslinux.cfg 中的引导内核选项- 如前所述,我无法加载。所以 rosh.c32不幸的是,对我的问题没有多大帮助。

    但是,鉴于 rosh实现 ls命令,我尝试将相关部分复制到 syslinux的代码中- 并触发 ls /syslinux时的root列表扫描配置文件。随着这些变化,记录在 syslinux-e40ba60-rosh-ls.patch ;现在我在启动时得到以下信息:
    SYSLINUX 4.06 CHS 5-ge40ba60* Copyright (C) 1993-2010 H. Peter Anvin et al
    Listing: "/"
    rosh_ls_arg_dir 0 files found
    Listing: "/syslinux"
    Listing: ""
    CurrentDirName: "/syslinux/"
    confignamebuf: /syslinux/extlinux.conf; realpath -1
    confignamebuf: /syslinux/syslinux.cfg; realpath -1
    confignamebuf: /boot/syslinux/extlinux.conf; realpath -1
    confignamebuf: /boot/syslinux/syslinux.cfg; realpath -1
    confignamebuf: /syslinux/extlinux.conf; realpath -1
    confignamebuf: /syslinux/syslinux.cfg; realpath -1
    confignamebuf: /extlinux.conf; realpath -1
    confignamebuf: /syslinux.cfg; realpath -1
    ERROR: No configuration file found
    No DEFAULT or UI configuration directive found!

    有趣的是;对于根 / , _ls函数至少返回“0 个文件”;其他的(“/syslinux”和空字符串“”)已经在 opendir 失败了打电话 - 等等 _ls函数甚至没有被调用!

    我会以为我的闹剧复制了 ls功能无法按预期工作;但是在 qemu 中运行拇指驱动器在上网本上,确实提供了完整的文件列表 - 至少对于 / ,该函数被调用并返回到桌面 - 我怀疑它确实有效。

    但是,这仍然不能解决我的问题 - 为什么 syslinux , 开机后看到root下有0个文件 / ?我还能做些什么来调试这个问题?我不介意将一些 C 代码修补到 syslinux 中- 但我只是不知道我应该寻找什么,这将指向我正确准备 USB 拇指驱动器以在台式机上启动......

    最佳答案

    好的,我让它启动了...

    首先,我注意到根据 Mbr - Syslinux WikiHowTos - Syslinux Wiki 在构建的 git 源中有替代 mbr,所以我尝试了 mbr.binaltmbr.bin - altmbr.bin,如下所示:

    $ printf '\1' | cat mbr/altmbr.bin - | sudo dd bs=440 count=1 conv=notrunc iflag=fullblock of=/dev/sdc

    ……但这并没有多大帮助。

    最后,我注意到 lsusb 说“bInterfaceProtocol 80 Bulk (Zip)”;我记得在某处读过一些关于 ZIP 驱动器的东西,所以试着查了一下——最后找到了这个:

    syslinux/doc/usbkey.txt

    The proper mode to boot a USB key drive in is "USB-HDD". That is the ONLY mode in which the C/H/S geometry encoded on the disk itself doesn't have to match what the BIOS thinks it is. Since geometry on USB drives is completely arbitrary, and can vary from BIOS to BIOS, this is the only mode which will work in general.

    Some BIOSes have been reported (in particular, certain versions of the Award BIOS) that cannot boot USB keys in "USB-HDD" mode. This is a very serious BIOS bug, but it is unfortunately rather typical of the kind of quality we're seeing out of major BIOS vendors these days. On these BIOSes, you're generally stuck booting them in USB-ZIP mode.

    THIS MEANS THE FILESYSTEM IMAGE ON THE DISK HAS TO HAVE A CORRECT ZIPDRIVE-COMPATIBLE GEOMETRY.

    ....

    The script "mkdiskimage" which is supplied with the syslinux distribution can be used to initialize USB keys in a Zip-like fashion. To do that, calculate the correct number of cylinders (31 in the example above), and, if your USB key is /dev/sda (CHECK THE KERNEL MESSAGES CAREFULLY - IF YOU ENTER THE WRONG DISK DRIVE IT CANNOT BE RECOVERED), run:

    mkdiskimage -4 /dev/sda 0 64 32

    (The 0 means automatically determine the size of the device, and -4 means mimic a zipdisk by using partition 4.)



    所以,按照那里的建议,首先我找到我的拇指驱动器的气缸数:
    $ grep 512-byte /var/log/syslog | tail -n 1
    Mar 25 22:33:34 mypc kernel: [50884.608687] sd 45:0:0:0: [sdc] 4118528 512-byte logical blocks: (2.10 GB/1.96 GiB)

    # get number of cylinders:
    $ wcalc '4118528/(64*32)'
    = 2011

    ...然后我继续 mkdiskimage 。完成后,我再次尝试 usb_inst.sh - 并意识到它将覆盖 mkdiskimage 制作的分区 4,并为自己创建一个分区 1。这意味着,应该将这些文件从 usb_inst.sh 复制到别处的备份中,然后运行 ​​ mkdiskimage - 最后再次将备份的文件复制回拇指驱动器;这是一个命令行日志:
    # mkdiskimage is present in syslinux-git:
    $ ./utils/mkdiskimage
    Usage: ./utils/mkdiskimage [-doFMz4][-i id] file c h s (max: 1024 256 63)
    ....

    # ... but also in Debian/Ubuntu packaging of syslinux
    $ mkdiskimage -4 /dev/sdc 0 64 32
    /usr/bin/mkdiskimage: /dev/sdc: don't know how to determine the size of this device

    # use sudo - note this command takes a while to complete:
    $ sudo mkdiskimage -4 /dev/sdc 0 64 32
    Warning: more than 1024 cylinders (2011).
    Not all BIOSes will be able to boot this device.

    $ ls /dev/sdc*
    /dev/sdc /dev/sdc4

    $ sudo fdisk -l /dev/sdc
    Disk /dev/sdc: 2108 MB, 2108686336 bytes
    64 heads, 32 sectors/track, 2011 cylinders
    Units = cylinders of 2048 * 512 = 1048576 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x866262cc

    Device Boot Start End Blocks Id System
    /dev/sdc4 * 1 2011 2059248 e W95 FAT16 (LBA)

    # (make sure umounted / ejected)

    # cd to usb_inst.sh directory; and
    # run usb_inst.sh for /dev/sdc; note it will:
    # write MBR and "Creating filesystem on /dev/sdc1..."
    # and "installing boot loader on /dev/sdc1";
    # regardless of the previous setup on partition 4:
    sudo bash ./usb_inst.sh

    # now no more partition 4:
    $ ls /dev/sdc*
    /dev/sdc /dev/sdc1

    # ( mount /dev/sdc1 via disk applet )
    $ rsync -a /media/SYSRESC /media/backup/

    # ... duhh... - again now

    # ( umount/eject via disk applet )

    $ sudo mkdiskimage -4 /dev/sdc 0 64 32
    Warning: more than 1024 cylinders (2011).
    Not all BIOSes will be able to boot this device.

    $ sudo ./linux/syslinux --install /dev/sdc4

    # ( mount via disk applet )

    $ rsync -a /media/backup/SYSRESC/ /media/31A8-40E9/
    $ sudo qemu -hda /dev/sdc # works

    # ( umount/eject via disk applet )

    # boot on desktop - works! loads rescue64 and initram.igz...

    有趣的是 - 即使有警告“并非所有 BIOS 都能够启动此设备。”;不知何故,这个有问题的 BIOS 毫无问题地加载了这个拇指驱动器(上面的 _ls 函数很好地列出了)。也很有趣 - 在这里我选择了 USB-HDD 启动选项(不是 USB-ZIP)并且它仍然有效?!

    因此,作为部分答案 - 我想调试这个的方法是让 syslinux 以某种方式在拇指驱动器上写入它在 syslinux 安装过程中看到的 CHS 几何结构;并在启动时查询 BIOS(我猜)关于 BIOS 看到的 CHS 几何图形 - 然后将这两个几何图形转储到屏幕;如果不匹配,那么很可能应该运行 mkdiskimage (不幸的是,我不知道如何将其编码为 syslinux )

    回到我原来的 HDD 问题 - 结果 SystemRescueCD 也使用 udev 来探测设备 - 再次启动过程无法完成(即使我选择启动选项“所有文件到内存(docache)”)......所以我得到消息如:
    udevadm settle - timeout of 180 seconds reached, the event queue contains:
    Activating dmraid (fake hardware raid) ...
    Starting mdadm (linux software raid) ....
    udevd[88] worker [91] unexpectedly returned with status 0x0100 ...
    udevd[88] worker [91] failed while handling '/devices/pci0000:00/.../sdb/sdb1'

    所以,我要么找到一个 Live USB 发行版,它不使用 udev 探测磁盘 - 或者我最好把这个硬盘拿出来,把它扔进一个硬盘 USB 机箱,然后在另一台电脑上尝试 fsck(希望我能把它列入黑名单此驱动器来自正在运行的系统上的 udev)

    2013 年 8 月 24 日编辑:回到这个问题,我想我会记下一些额外的笔记:

    由于我还没有时间修理这台电脑和它有故障的驱动器,我用这个 USB 拇指驱动器来启动多个操作系统: PartedMagic 和 SliTaz 确实也遇到了硬盘错误 - 但显然使用不同的驱动程序来访问它(所以 DRDY ERR 循环没有开始),他们可以相对快速地完成启动。然后我尝试构建一个自定义的 Ubuntu 12.04 镜像(使用 ubuntu-builder ) - 在操作系统完成启动之前,这个镜像以 DRDY ERR 循环结束,这可能需要 5 分钟以上才能完成。我在 Bug #1216397 “It should be possible to ignore (skip probing) a known bad disk partition at boot” : Bugs : “linux” package : Ubuntu 中发布了更多关于此的信息。

    关于 syslinux 有一些有趣的事情,现在这个 USB 拇指驱动器用于启动多个操作系统。首先,拇指驱动器仍然首先在空时使用 syslinux --install 启动(将文件 ldlinux.sys 放置在分区的根目录中) - 这对应于上面的 mkdiskimage 步骤;并且只有在此之后才会将文件(如内核镜像,包括 /boot/syslinux/syslinux.cfg )复制到其中。

    现在,我首先在 ubuntu-builder 中构建 CD 镜像 ISO,然后使用 VirtualBox 对其进行测试(因为我机器上的 qemu 太慢了)。一旦 ISO 镜像按预期工作,则只有其 casper 目录下的文件与如此准备的 USB 拇指驱动器相关;并且它们可以通过 syslinux.cfg 中的引导菜单条目进行引用。因此,我将编辑拇指驱动器上的 syslinux.cfg,并将 casper 图像文件(例如 filesystem.squashfs )复制到拇指驱动器 - 并使用 qemu 进行测试,如上所述。一旦通过了这个 qemu 步骤,我就会用损坏的驱动器移动目标 PC 上的 USB 拇指驱动器 - 有趣的是,在这里我可能会遇到多种类型的 syslinux 启动失败(在不同的启动阶段):
  • No DEFAULT or UI configuration directive found!”(或有时是“Bad ...”消息),在显示 syslinux 启动菜单之前 - 即使调试,如上所述,会显示 syslinux 正确读取拇指驱动器上的文件系统,并找到 /boot/syslinux/syslinux.cfg(确实有正确的指令)!
  • "Invalid or corrupt kernel image ",一旦显示 syslinux 菜单,并选择新的内核镜像 (Ubuntu) - 即使其他镜像(以前在拇指上找到)在损坏的驱动器 PC 上正常启动;并且新镜像可以在另一台机器上的 qemu 中从拇指正常启动!
  • "/init: line 7: can't open /dev/sr0: no medium found ",一旦从 syslinux 菜单中选择了新的 (Ubuntu) 镜像,它就会开始启动;这似乎是 Ubuntu 特定的消息,在启动后几秒钟出现。即使启动成功完成,我仍然会遇到它 - 当它出现问题时,此消息只会重复循环,不允许启动过程的其余部分完成

  • 事实证明,每当我尝试更改和保存拇指驱动器上的 syslinux.cfg 文件时,任何这些都可能出现;或者当我在 casper 图像文件中进行更改时,我将 rsync 或将它们复制到拇指驱动器。也许复制过程(因为它可能会改变文件位于拇指上的扇区),“混淆”了启动过程的部分 - 尽管这不应该发生,因为上面的工作过程也是从空白的 syslinux 开始的'd 拇指驱动器,之后将文件复制到该驱动器;所以我认为这可能指向拇指驱动器上出现故障的扇区。

    但是,即使在这种状态下,上面的工作程序似乎也很有用——因为使用它,我可以将拇指恢复到工作状态!更详细地说,它是这样的:
  • 在不同磁盘的某处保留拇指驱动器文件的副本(例如 ~/thumbcopy ) - 但没有 ldlinux.sys 文件。
  • 每当您想进行更改(更改为 syslinux.cfg 或可启动镜像文件)时,请确保将此更改保存在 ~/thumbcopy 第一个
  • 现在,假设我直接更改了可启动拇指驱动器上的一些文件,但遇到了上述错误之一。然后:
  • 首先,删除拇指驱动器上除 ldlinux.sys 之外的所有文件,例如: rm -rf $(ls -I"ldlinux.sys"/media/31A8-40E9/)
  • 然后, rsync 或复制 ( cp -arv ... ) ~/thumbcopy 中的文件到拇指驱动器,例如: rsync -aP ~/thumbcopy//media/31A8-40E985/67914
  • 现在,再次尝试在 PC 中启动拇指驱动器 - 它通常可以正常启动!

  • 我遇到了所有三种类型的错误,因为我经常尝试直接在拇指驱动器中更改/复制单个文件:有时更改不会带来问题,因此启动很好 - 但是,在许多情况下,它确实引入一个问题。出于某种原因,使用上述程序,我设法从上述任何一种类型的问题中恢复了拇指驱动器 - 也许它与 USB 闪存延迟写入有关,也许与 USB 闪存故障扇区有关,我无法确定......但无论如何: 删除所有文件,并一次性重新复制它们,这似乎是一个值得尝试的过程,以防出现此类错误。

    关于c - 调试 syslinux 看到的引导文件系统环境?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15624772/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com