调试syslinux看到的启动文件系统环境?

时间:2013-03-25 21:06:49

标签: c linux boot syslinux

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

我似乎搞砸了台式电脑上的硬盘({DRDY err})。所以我想运行一个可启动媒体来运行fsck,但是这个桌面上的CD坏了,所以我只能使用USB闪存。我有几个带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在输入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手动重命名为syslinuxTrying 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

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

  

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

[SOLVED] Stuck on boot: Syslinux Problem [Archive] - Ubuntu Forums:" _ 调试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 applet卸载后):

sudo ./linux/syslinux --stupid --directory /syslinux --install /dev/sdc1

...我已尝试使用stupid和不使用(以及源代码构建版本,以及来自Ubuntu软件包存储库的Natty)。

通过源代码,我意识到有一些名为roshRead-Only 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!

有趣;对于根/_ls函数至少返回" 0文件&#34 ;;其他人(" / syslinux",以及空字符串"")在opendir来电时已经失败 - 因此_ls功能不会出现问题。甚至被召唤!

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

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

2 个答案:

答案 0 :(得分:3)

好的,我让它开机......

首先,我注意到根据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)&#34 ;;我记得在某处读过有关ZIP驱动器的东西,所以试着查一下 - 最后发现了这个:

syslinux/doc/usbkey.txt

  

启动USB密钥驱动器的正确模式是" USB-HDD"。那就是   ONLY模式,其中C / H / S几何在磁盘本身上编码   没有必要匹配BIOS认为它是什么。从几何上开始   USB驱动器是完全随意的,可能因BIOS而异,   这是唯一可行的模式。

     

已经报告了一些BIOS(特别是某些版本的   Award BIOS)无法在" USB-HDD"中启动USB密钥模式。这是一个   非常严重的BIOS错误,但遗憾的是相当典型的   我们现在从主要的BIOS供应商那里看到的那种质量。上   这些BIOS,您通常无法在USB-ZIP模式下启动它们。

     

这意味着光盘上的文件系统图像已经正确无误   ZIPDRIVE-COMPATIBLE GEOMETRY。

     

...

     

剧本" mkdiskimage"随syslinux提供   分发可用于以类似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 - 并意识到它将覆盖mkdiskimage创建的分区4,并为自己创建分区1。这意味着,应该在其他地方的备份中复制那些文件usb_inst.sh,然后运行mkdiskimage - 然后最终将备份的文件再次复制回thumbdrive;这是一个命令行日志:

# 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都能启动此设备。&#34 ;;不知怎的,这个有问题的BIOS加载这个拇指驱动器没有问题(上面的_ls函数列出正常)。同样有趣 - 在这里我选择了USB-HDD启动选项(不是USB-ZIP),它仍然有用吗?!

所以,作为一个部分答案 - 我想调试这个的方法,将是syslinux以某种方式在thumbdrive上写入它在syslinux安装期间看到的CHS几何;并在启动时,查询BIOS(我猜)BIOS看到哪个CHS几何 - 然后将这两个几何转储到屏幕;如果存在不匹配,则可能应该运行mkdiskimage很遗憾,我不知道如何将其编码为syslinux


回到我原来的硬盘驱动器问题 - 结果 SystemRescueCD使用udev来探测设备 - 再次启动过程无法完成(即使我选择启动选项&# 34;所有文件到内存(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分钟以上才能完成。我已在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< 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或将它们复制到thumbdrive。也许复制过程(因为它可能会改变文件在拇指上的扇区),"混淆"启动过程的一部分 - 尽管如此,这不应该发生,因为上面的工作程序也是从一个消隐的syslinux拇指驱动器开始,之后复制了文件;所以我认为这可能指向拇指驱动器上的扇区失败。

然而,即使在这种状态下,上面的工作程序似乎也很有用 - 因为使用它,我可以将拇指恢复到工作状态!更详细地说,它是这样的:

  • 将thumbdrive文件的副本保存在其他磁盘上(例如~/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中启动拇指驱动器 - 它通常可以正常启动!

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

答案 1 :(得分:0)

这是一个古老的文章,但是如果其他人偶然发现了这个问题,我还是会添加一个答案。

如果您正在努力使syslinux引导,则如您所述,ROSH(只读Shell)可能会有用。要启动ROSH,只需在rosh提示符下键入boot:(如果您确实有可用的图形菜单,请按Escape键退回到boot:提示符。

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