希望记下来是可以的,即使我不能立即接受答案(并希望这样可以 - 因为下面有一个 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 安装程序;和
- 我尝试使用
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
在进入之前,“验证 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
- 或者如上所述引导失败。
有建议手动将目录/文件重命名isolinux
为syslinux
(尝试从 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 拇指驱动器以在台式机上启动......