从命令行将 CD 存档到 ISO 格式
几周前,我在一台 PC 上工作,需要获取主板驱动 CD。在理想情况下,CD 应该放在一个漂亮的保护套中,安全地远离 IT 技术区域的污秽元素(读作:咖啡、划痕和偶尔的果冻甜甜圈)。但是,在这种情况下,似乎有人拿走了这张 CD,并在百洁布上擦拭了一下。我相信你们都时不时遇到过这个问题,哎,我的幼儿孩子们找到我藏起来的 CD 时,倾向于把它们当作飞盘在房子周围扔。
但是,唉,我并不担心这个小挫折。为什么?因为当我获得带有 CD 的新硬件时,我做的第一件事之一就是刻录 CD/DVD 的 ISO 映像,并将 ISO 映像的副本放在我的服务器之一上。这有效地排除了破坏包含我以后可能需要的驱动程序的 CD 的可能性。
有些人可能会争辩说,你总是可以在网上获取驱动程序,这是真的。但是,如果您需要不再可用的旧驱动程序,或者被另一家公司收购的硬件的驱动程序,那么尝试追踪软件可能会变成一件非常痛苦的事情。如果您在 ISO 文件夹中有 CD/DVD 的副本,那么就像刻录新的 CD 或 DVD 一样容易。
现在,在开始之前,我将从惯例免责声明开始,并将所有令人讨厌但必要的法律术语排除在外。这可能不是 100% 必要,但是,嘿,从长远来看,它可以保护我和LinuxJournal的屁股,所以我最好还是把它解决掉。
根据您所在的州/国家/星球/太阳系,复制 CD 或 DVD 可能违反州/联邦/行星法规。不仅如此,它还可能违反软件协议的最终用户许可协议 (EULA)。如果您决定将 CD/DVD 刻录成 ISO 映像,以便从您母亲的地下室接管世界,我和 LinuxJournal 概不负责。在制作 ISO 映像之前,请遵守州/国家/星球/EULA 法规。
话虽如此,我个人认为,只要所述 ISO 映像不赠送或出售给任何其他人,为了存档目的而创建驱动程序/软件 CD 的 ISO 映像没有任何危害。我不会分享我的个人 ISO 映像,也永远不会。
在这篇博客文章中,我将向您展示如何不将 CD 变成杯垫。很多人没有意识到,这不像 `dd if= of=` 然后就可以继续快乐地走了那么简单。为了制作适当的可刻录 ISO 映像,您需要考虑 blocksize 和 blockcount。不仅如此,一旦 ISO 映像完成,您真的需要将 CD 的 MD5 哈希值与 ISO 映像本身进行比较。我将详细介绍每一个,并提供一个我为本文编写的不错的脚本。
为什么 `dd if= of=` 是一个坏主意
标准的 `dd if= of=` 映像写入在某些必要的情况下可能很好,但不适用于将 CD 和 DVD 写入 ISO 映像。在 google.com 上搜索一下“linux make an ISO image”,会出现十几个搜索结果,其中人们建议只使用 `dd if=/dev/sd0 of=/pathto/file.iso`。
现在我不是说互联网上充斥着错误的信息,诚然,这可能在某个时候对某人有效,然后他们将其传递给了其他人。然后有人在博客上发布了它,然后循环往复。无论如何,如果您想要该 CD 的正确 ISO 映像,您需要在创建映像之前获得正确的 blocksize 和 blockcount。当 CD 最初创建时,它具有与之关联的逻辑块大小。在大多数情况下,我通常看到 1024 和 2048。另一个需要查看的是块大小,也称为卷大小。这是存储在 CD 上的数据量。我们在创建 CD 时将这两个信息都传递给 dd,以告知 dd 应用程序要写入的正确 blocksize 和 blockcount。
如果您想继续操作并查看我从哪里获取此信息,请找到您的 cdrom 的位置(检查 /etc/fstab,但通常链接到 /dev/cdrom),然后从命令行运行以下命令
isoinfo -d -i /dev/cdrom
此命令将扫描您的 cd 并输出必要的信息。如您所见,它输出了刻录 CD 所需的 blocksize 和 block count。如果您想跳过这篇文章的其余部分并刻录无杯垫的 CD,那么您可以现在停止并使用以下命令
dd if=/dev/cdrom bs=blocksize count=count of=/path/to/isoimage.iso
显然,将 blocksize 和 count 替换为您从 isoinfo 收集的 blocksize 和 count。
MD5sum
您知道那句话吗?您老师可能在您还是小学生时就向您灌输的那句话?那句谚语“不要在小鸡孵出之前就数小鸡”?好吧,在这种情况下,我们确实想在小鸡孵出之前就数小鸡。在您制作 CD 的 ISO 映像并将 CD 存档以备将来使用之前,您要确保您创建的 ISO 映像是一个良好、干净的副本。这就是 MD5 哈希值发挥作用的地方。我不会详细介绍 MD5,但是如果您还没有研究过检查下载文件的 MD5 哈希值,那么现在是打开 linuxjournal.com 搜索并查看一些文章的时候了。在这种情况下,我们将检查 CDROM 的 MD5 哈希值与您在上一步中可能创建的 ISO 映像(如果您正在按照步骤操作。如果不是,本文末尾提供的脚本将为您执行此操作)。
因此,如果您已经使用上面的命令创建了 ISO 映像,让我们检查一下 MD5 哈希值。在加载 CD 的情况下,运行以下命令
dd if=/dev/cdrom bs=blocksize count=count | md5sum
这将根据 CD 的内容吐出一个 128 位加密哈希值。现在让我们使用以下命令针对您生成的 ISO 映像对其进行检查
cat imagename.iso | md5sum
输出应与上面生成的 MD5 总和匹配。如果它们匹配,那么您可以放心,您生成的 ISO 映像足以从中刻录 CD。如果 MD5 总和不匹配,请确保您从 isoinfo 中输入了正确的信息到 dd 中,然后重试。
脚本
脚本本身将粘贴在这篇文章的底部,但我将快速介绍一下脚本的作用。我专门为这篇博客文章编写了这个脚本。通常我只是运行 isoinfo,获取我的 blocksize 和 count,然后制作 CD,然后检查 md5sum,然后从那里开始。为什么我还没有创建脚本?我们称之为职业懒惰。但我确信从现在开始我会使用这个脚本。此脚本的作用是允许您找到 CDROM 的物理路径,指定 ISO 映像的路径,并检查 CDROM 的 MD5 总和。在编写此脚本时,我确实从 Troubleshooters.com 的“无杯垫 CD 刻录”中提取了一部分脚本,如果您想进一步了解该网站,该网址将粘贴在脚本的注释部分。
注意:这是一个“演示脚本”。错误可能会从您的屏幕中爬出来,爬到我们的裤腿上。它在您在托盘中放入 CD 并且您拥有正确的 HAL 软件包的情况下有效。您可以随意修改脚本以满足您的需求,或者将其拆开并按您认为合适的方式使用它。如果您不想使用脚本,我已经描述了上面的所有命令。
结论
好了,这就是将 CD 存档到 ISO 映像的方法。正如我之前所说,我倾向于拿出任何新的 CD/DVD,并为存档目的创建 ISO 映像。您永远不知道什么时候有人会刮伤那张独一无二的 HP Utilities CD,其中包含您需要在凌晨 2 点针对旧服务器运行的 Array Diagnostic Utilities。但是,如果您有该 CD 的 ISO 映像,您所要做的就是创建一张 CD,然后就可以开始了。一旦你拥有一个
ISO 映像,它就像刻录 CD 一样简单;当然,那是另一篇博客文章的主题了。 :-)
#!/bin/bash ## ArchiveCD.sh Script whipped up for LinuxJournal.com Blog ## Post on Archiving CD's to ISO Images. Written by Jayson ## Broughton. Script updates may be found at the following ## website: www.jaysonbroughton.com ## ## blocksize and blockcount variables taken from Steve Litt's ## script on Troubleshooters.com article 'Coasterless CD ## burning. ## URL: http://www.troubleshooters.com/linux/coasterless.htm ## ## Last Updated: 05/15/2011 ## Check HAL for CDrom and grab UDI UDI=`hal-find-by-capability --capability storage.cdrom` ## Run UDI against block device device=`hal-get-property --udi $UDI --key block.device` ## Get Block size of CD blocksize=`isoinfo -d -i $device | grep "^Logical block size is:" | cut -d " " -f 5` if test "$blocksize" = ""; then echo catdevice FATAL ERROR: Blank blocksize >&2 exit fi ## Get Block count of CD blockcount=`isoinfo -d -i $device | grep "^Volume size is:" | cut -d " " -f 4` if test "$blockcount" = ""; then echo catdevice FATAL ERROR: Blank blockcount >&2 exit fi usage() { cat <<EOF usage: $0 options -h Show this message -d Report the Location of your Device -m Check your MD5Hash of CD against Image (Run AFTER making Image) -l Location and name of ISO Image (/path/to/image.iso) -r Rip CD to ISO image
I'm Lazy, I didn't build much error checking into this script So alas, here's how to run it. Anything else might break the script. Example 1: Report location of drive archiveCD.sh -d Example 2: Rip a CD to ISO archiveCD.sh -l /path/to/isoimage.iso -r Example 3: Check MD5Hash (Run AFTER ripping CD to ISO) archiveCD.sh -l /path/to/isoimage.iso -m EOF } while getopts "hdml:r" OPTION; do case $OPTION in h) usage exit 1 ;; d) echo "Your CDrom is located on: $device" >&2 ;; m) echo "Checking MD5Sum of CD and New ISO Image" md5cd=`dd if=$device bs=$blocksize count=$blockcount | md5sum` >&2 md5iso=`cat $LFLAG | md5sum` >&2 echo "CD MD5 is:" $md5cd echo "ISO MD5 is:" $md5iso ;; l) LFLAG="$OPTARG" ;; r) dd if=$device bs=$blocksize count=$blockcount of=$LFLAG echo "Archiving Complete. ISO Image located at:"$LFLAG ;; esac done