debuggingsyslinux看到的启动文件系统环境?

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

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

所以我试图下载SystemRescueCd ; 我有这个USB thumbdrive,我试图安装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纳蒂上网本来形象的拇指驱动器 – 我用了两个

  • 推荐的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: 

….在启动时提示。 (事实上​​,在进入syslinux之前, unetbootin在“validationDMI池数据”时失败了 – 可能是因为它比我试图创build的.iso要早得多)。

首先,我检查了没有默认或UIconfiguration发现中提到的MD5 !

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

…但似乎没问题,按照Sysresccd版本 。

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

 # sudo apt-get install qemu sudo qemu -hda /dev/sdc 

…它很好的启动 – 显示syslinux菜单等等; 但是,启动始终在桌面上失败。

在这里,我应该提到,我可以从有问题的桌面PC的启动屏幕上写下以下内容:

 Award Modular BIOS v6.00PG AMDRS740 BIOS 

它具有通过F12访问的启动菜单,在启动菜单中,除了其他选项外,它们还可用于USB:

 ... USB-FDD USB-ZIP USB-CDROM USB-HDD ... 

通常情况下,我selectUSB-HDD – 但我尝试了其他的; 甚至在进入syslinux之前程序冻结 – 或者如上所述引导失败。

有build议手动将目录/文件从isolinux重命名为syslinux ( 尝试从usb启动 – 请求Ubuntu ) – 当我使用usb_inst.sh ,只有syslinux/isolinux.bin将不得不重新命名。 还有build议将syslinux.cfg复制到USB闪存盘的根目录( 无法启动Live USB,Linux – 超级用户 )。 但仍然没有任何改进 – syslinux仍然抱怨它缺lessconfiguration文件 – 显然是syslinux.cfg

然后我试图看看是否有可能以某种方式“debugging”syslinux; 在syslinux中发现日志跟踪/debugging/故障排除 – Syslinux项目 – reboot.pro :

>我们有特定的命令来跟踪或loggingsyslinux吗?
作为开放源代码,可以编译Syslinux并启用额外的debugging输出。

syslinux 问题[论坛存档] – LinuxSir.Org LinuxSir.Org > Linux发行版讨论区 – LinuxSir.Org > Linux发行版Gentoo讨论区 – LinuxSir.Org > Linux发行版Archlinux讨论区 >回忆正确)需要重新编译它来添加debugginghooks._“。 然而, 开发/debugging – Syslinux Wiki谈到一些叫做bochs东西; 我怀疑这是要debuggingsyslinux本身 – 不一定是“debugging”(或查询)它所在的环境

无论如何,最后,我看不出有什么办法,只能从源代码获取syslinux 。 基本上,这是需要的,所以它build立:

 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 

事实certificate,如何启用这样的debugging并不是很清楚,它将显示syslinux插入给定计算机时“看到”的内容; 考虑到我在启动时加载到syslinux ,问题是它作为一个文件系统看到什么。 我尝试启用DEBUG环境variables,如上所示(在向Makefile添加override OPTFLAGS :=之后) – 但是,在启动失败期间,本身并没有生成新消息。 我已经使用以下命令来“烧录”USB(从Gnome小程序中卸载它之后):

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

…我已经尝试了stupid和没有(并且源代码版本,以及来自Ubuntu包装仓库的Natty)。

掠过源代码,我意识到有一种叫做rosh ( 只读 rosh.c32 )的东西 – 然而,它编译为rosh.c32 – 而且应该把它作为syslinux.cfg的引导内核选项 – ,我无法加载。 所以rosh.c32不幸的是没有太多的帮助我的问题。

但是,假设rosh实现了ls命令,我试图将相关部分复制到syslinux的代码中,并在syslinux扫描configuration文件时触发ls /根目录。 随着这些变化,logging在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函数至less返回“0个文件”; 其他的(“/ syslinux”和空string“”)在opendir调用中已经失败,所以_ls函数甚至不会被调用!

我本以为我的打闹lsfunction的抄袭不会按预期工作; 但是在上网本的qemu上运行thumbdrive,实际上提供了一个完整的文件列表 – 至less对于/ ,函数被调用并在桌面上返回 – 我怀疑它确实有效。

但是,这仍然不能解决我的问题 – 为什么启动后, syslinux在根目录下看到0个文件? 我还能做些什么来debugging这个问题? 我不介意将一些C代码修补到syslinux – 但是我不知道我应该在寻找什么,这将指向我正确准备在桌面计算机上启动的USB thumbdrive。

好,我已经开始了

首先,我注意到,根据Mbr – Syslinux Wiki和HowTos – Syslinux Wiki ,在构建的git源文件中还有其他mbr,所以我尝试了mbr.binaltmbr.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模式下。

这意味着磁盘上的FILESYSTEM图像具有正确的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 ,并意识到它会覆盖mkdiskimage创建的分区4,而不是自己创建一个分区1。 这意味着,应该将这些文件从usb_inst.sh复制到别处的备份中,然后运行mkdiskimage – 然后最终将备份的文件再次复制到thumbdrive; 这里是一个命令行日志:

 # mkdiskimage is present in syslinux-git: $ ./utils/mkdiskimage Usage: ./utils/mkdiskimage [-doFMz4][-i id] file chs (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加载这个thumbdrive没有问题(和上面列出的_ls函数罚款)。 也有趣的是,在这里我选择了USB-HDD启动选项(不是USB-ZIP),它仍然有效?

所以,作为一个部分的答案 – 我想调试的方法是,syslinux以某种方式在syslinux安装过程中在thumbdrive上写入CHS几何结构; 并在启动时,查询有关BIOS看到哪个CHS几何体的BIOS(我猜),然后将这两个几何体转储到屏幕上; 如果有不匹配,那么它可能应该运行mkdiskimage不幸的是,我不知道如何编码到syslinux


回到我原来的硬盘问题 – 事实上 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' 

所以,我要么找到一个没有使用udev探测磁盘的Live USB发行版 – 或者我最好把这个硬盘拿出来,把它扔到一个硬盘的USB机箱里,然后尝试在另一台电脑上读取它(希望我可以把它列入黑名单这是从一个正在运行的系统udev驱动器)


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

由于我还没有时间来修复这台电脑和它的错误驱动器,所以我用这个USB thumbdrive来启动多个操作系统:PartedMagic和SliTaz也在硬盘上遇到错误,但显然使用不同的驱动程序来访问它(所以DRDY ERR循环没有开始),并且可以相对快速地完成引导。 然后,我尝试构建一个定制的Ubuntu 12.04映像(使用ubuntu-builder ) – 而这个映像最终在一个DRDY ERR循环中,在操作系统完成引导之前,这个过程可能需要5分多钟才能完成。 我已经在Bug#1216397中发布了更多关于此的信息:“应该可以在启动时忽略(跳过探测)已知的坏磁盘分区”:错误:“linux”包:Ubuntu 。

关于syslinux ,有一些有趣的事情,现在这个USB thumbdrive被用来启动多个操作系统。 首先,还是首先使用syslinux --install (这将一个文件ldlinux.sys放在分区的根目录下)的空白引导启动,这对应于上面的mkdiskimage步骤; 之后只有复制到它的文件(如内核映像,包括/boot/syslinux/syslinux.cfg )。

现在,我首先在ubuntu-builder CD镜像ISO,然后使用VirtualBox进行测试(因为我的机器上的qemu太慢了)。 一旦ISO映像显示正常工作,那么只有其casper目录下的文件与准备好的USB thumbdrive相关; 并且可以通过syslinux.cfg的引导菜单条目来引用它们。 所以,我会在thumbdrive上编辑syslinux.cfg ,并将casper图像文件(例如filesystem.squashfs )复制到thumbdrive中,然后像上面那样用qemu测试。 一旦这个qemu步骤通过,我会移动目标PC上的USB拇指驱动器与有故障的驱动器 – 有趣的是,在这里我可能会得到多种syslinux启动失败(在不同的启动阶段):

  • 即使上面的调试显示syslinux读取文件系统,“在没有显示syslinux启动菜单的情况下, No DEFAULT or UI configuration directive found! ”( 或者有时候是“Bad <something> …” thumbdrive正确,并找到/boot/syslinux/syslinux.cfg (这有确实的指令)!
  • 一旦显示syslinux菜单,并选择新的内核映像(Ubuntu), 即使其他映像(先前在拇指中找到)在损坏的驱动器PC上正常启动,“ Invalid or corrupt kernel image ” 而新的图像从不同的机器上的qemu拇指启动!
  • /init: line 7: can't open /dev/sr0: no medium found ”,一旦从syslinux菜单中选择了新的(Ubuntu)映像,就会开始引导; 这似乎是一个特定于Ubuntu的消息,在启动后几秒钟出现。 即使启动成功完成,我仍然遇到它 – 当出现问题时,此消息只是反复循环,不允许引导过程的其余部分完成

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

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

  • 将thumbdrive文件的副本保存在不同的磁盘上(例如~/thumbcopy ) – 但包含ldlinux.sys文件。
  • 每当你想改变(到syslinux.cfg或可启动的图像文件) – 确保这个改变保存在~/thumbcopy
  • 现在,我已经直接在可启动的thumbdrive上更改了一些文件,并且遇到了上述错误之一。 然后:
    • 首先,删除所有文件, 但是在thumbdrive上的ldlinux.sys ,例如:
        rm -rf $(ls -I“ldlinux.sys”/ media / 31A8-40E9 /) 
    • 然后, rsync或将~/thumbcopy的文件复制( cp -arv ... )到thumbdrive,例如:
        rsync -aP〜/ thumbcopy / / media / 31A8-40E9 / 
    • 现在,请尝试再次启动电脑中的拇指驱动器 – 它通常很好!

我遇到了所有这三种类型的错误,因为我经常尝试直接在thumbdrive中更改/复制单个文件:有时候这种更改不会引入问题,所以启动很好 – 但是在很多情况下,引入一个问题。 出于某种原因,使用上述过程,我设法从上述任何一种类型的问题恢复拇指驱动器 – 也许它与USB闪存延迟写入,也许与USB闪存失败扇区,我不能告诉…但无论如何:删除所有文件,并一次性重新复制,似乎是一个有价值的过程,以尝试在这样的错误的情况下。