3

希望记下来是可以的,即使我不能立即接受答案(并希望这样可以 - 因为下面有一个 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 拇指驱动器时,启动过程都会失败,并显示:

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在进入之前,“验证 DMI 池数据”失败syslinux- 可能是因为它比我尝试映像的 .iso 旧得多)。

首先,我检查了未找到默认或 UI 配置中提到的 md5 !

$ md5sum ./systemrescuecd-x86-3.5.0.iso
48552b9e905872bd5061eb112b73ea20  ./systemrescuecd-x86-3.5.0.iso

...但根据Sysresccd-versions似乎还可以。

然后我尝试将驱动器重新格式化为 FAT16(通过sudo gparted /dev/sdc);usb_inst.sh并重复这两种unetbootin方法 - 再次没有骰子。有趣的是,在所有这些情况下,如果我尝试在 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- 或者如上所述引导失败。

有建议手动将目录/文件重命名isolinuxsyslinux尝试从 USB 启动 - 询问 Ubuntu) - 当我使用时usb_inst.sh,只syslinux/isolinux.bin需要重命名。还有建议复制syslinux.cfg到 USB 闪存拇指驱动器的根目录(无法启动 Live USB,Linux - 超级用户)。但仍然没有改进 -syslinux仍然抱怨它缺少配置文件 - 这显然是syslinux.cfg.

然后我试着看看是否有可能以某种方式“调试” syslinux;在 syslinux - The Syslinux Project - reboot.pro 中找到日志跟踪/调试/故障排除:

> 我们是否有特定的命令来跟踪或记录 syslinux?
作为开源,可以编译 Syslinux 并启用额外的调试输出。

[已解决] 卡在启动:Syslinux 问题 [存档] - Ubuntu 论坛:“_ 调试 syslinux 在http://www.syslinux.org/wiki/index.php/Development/Debugging中进行了描述,但有效的调试(如果我正确回忆)需要重新编译它以添加调试钩子。_”。然而,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只读 SHell)的东西 - 但是,它编译为rosh.c32- 并且应该将它作为引导内核选项syslinux.cfg- 如前所述,我无法加载。不幸的是,对我rosh.c32的问题没有太大帮助。

但是,鉴于rosh实现了该ls命令,我尝试将相关部分复制到 - 的代码中,并在扫描配置文件时syslinux触发ls /根目录的列表。syslinux随着这些变化,记录在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!

有趣的是; 对于 root /,该_ls函数至少返回“0 个文件”;其他的(“/syslinux”和空字符串“”)在opendir调用时已经失败了——所以这个_ls函数甚至没有被调用!

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

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

4

2 回答 2

3

好的,我启动它...

首先,我注意到根据Mbr - Syslinux WikiHowTos - Syslinux Wiki在构建的 git 源中存在替代 mbr ,所以我尝试了两者mbr.bin-altmbr.binaltmbr.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

启动 USB 密钥驱动器的正确模式是“USB-HDD”。这是唯一一种模式,其中在磁盘本身上编码的 C/H/S 几何图形不必与 BIOS 认为的匹配。由于 USB 驱动器上的几何结构是完全任意的,并且可能因 BIOS 不同而不同,因此这是唯一可以正常工作的模式。

已报告某些 BIOS(特别是某些版本的 Award BIOS)无法在“USB-HDD”模式下启动 USB 密钥。这是一个非常严重的 BIOS 错误,但不幸的是,这是我们最近从主要 BIOS 供应商那里看到的那种质量的典型。在这些 BIOS 上,您通常无法以 USB-ZIP 模式启动它们。

这意味着磁盘上的文件系统映像必须具有与 ZIPDRIVE 兼容的正确几何形状。

……

syslinux 发行版随附的脚本“mkdiskimage”可用于以类似 Zip 的方式初始化 USB 密钥。为此,请计算正确的柱面数(上例中为 31),并且,如果您的 USB 密钥是 /dev/sda(请仔细检查内核消息 - 如果您输入了错误的磁盘驱动器,则无法恢复),运行:

mkdiskimage -4 /dev/sda 0 64 32

(0 表示自动确定设备的大小,-4 表示使用分区 4 模拟 zipdisk。)

因此,按照那里的建议,首先我找到我的拇指驱动器的柱面数:

$ 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再次尝试 - 并意识到它将覆盖创建的分区 4 mkdiskimage,并为自己创建一个分区 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 问题——原来SystemRescueCDudev用于探测设备——并且引导过程再次无法完成(即使我选择引导选项“所有文件到内存(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 日:回到这个问题,我想我会记下一些额外的笔记:

由于我还没有时间修复这台 PC 及其故障驱动器,所以我使用这个 USB 拇指驱动器来启动多个操作系统:PartedMagic 和 SliTaz 确实也遇到了硬盘上的错误 - 但显然使用不同的驱动程序来访问它(所以DRDY ERR循环没有开始),他们可以相对较快地完成启动。然后,我尝试构建一个自定义的 Ubuntu 12.04 映像(使用ubuntu-builder)——在操作系统完成启动之前,这个映像结束了一个DRDY ERR循环,这可能需要 5 分钟以上才能完成。我在错误 #1216397 “应该可以在启动时忽略(跳过探测)已知的坏磁盘分区”中发布了更多相关信息:错误:“linux”包:Ubuntu

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

现在,我首先在 中构建 CD 映像 ISO ubuntu-builder,并使用 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 <something> ...”消息),在显示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-40E9/
    • 现在,再次尝试在 PC 中启动拇指驱动器 - 它通常可以正常启动!

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

于 2013-03-25T22:47:42.367 回答
0

这是一个古老的帖子,但如果其他人偶然发现这一点,我还是会添加一个答案。

正如您所提到的,如果您正在努力让 syslinux 启动,那么 ROSH(只读 Shell)可能会很有用。要启动 ROSH,您只需roshboot:提示符处键入(如果您确实有一个可用的图形菜单,请按 Esc 键返回到boot:提示符。

在 shell 内部,您有一些基本命令可以在您的环境中查看。有关更多文档,请参阅https://wiki.syslinux.org/wiki/index.php?title=Read-Only_SHell(rosh.c32)

于 2019-03-22T18:05:19.847 回答