![如何在块设备中搜索文本?](https://linux22.com/image/1184156/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%9D%97%E8%AE%BE%E5%A4%87%E4%B8%AD%E6%90%9C%E7%B4%A2%E6%96%87%E6%9C%AC%EF%BC%9F.png)
令我奇怪的是,谷歌没有在顶级结果中返回任何相关(IMO)链接。
我想编辑 iso9660。
这里如何更轻松地使用 Ubuntu 19.10 制作持久实时驱动器?我读了
sed 's/quiet splash/persistent /' lubuntu-19.10-desktop-amd64.iso > persistent-lubuntu-19.10-desktop-amd64.iso # yes, sed works with binary files
然后我想,我已经制作了 USB 记忆棒,为什么不尝试编辑它。dd
有效,但是sed: couldn't edit /dev/sdb: not a regular file
,除了将所有分区转储到文件之外,我最好寻找要替换的文本的位置。
有任何实用程序可以在块文件/设备内进行搜索吗?
答案1
$ sudo grep --only-matching --byte-offset --max-count=1 --text "quiet splash" /dev/sdb
1927125977:quiet splash
因此,这将输出以字节为单位的偏移量,然后除以 512(默认 dd 块大小),然后
sudo dd count=1 skip=3763917 if=/dev/sdb | hd
000001c0 69 6e 69 74 72 64 3d 2f 63 61 73 70 65 72 2f 69 |initrd=/casper/i|
000001d0 6e 69 74 72 64 2e 6c 7a 20 71 75 69 65 74 20 73 |nitrd.lz quiet s|
000001e0 70 6c 61 73 68 20 2d 2d 0a 6d 65 6e 75 20 64 65 |plash --.menu de|
000001f0 66 61 75 6c 74 0a 6c 61 62 65 6c 20 78 66 6f 72 |fault.label xfor|
图案已定位。
答案2
我认为你想完成的是两件不同的事情,
首先是扫描整个分区以查找特定的字符串。
你不应该尝试编辑/读取块设备,而是先尝试安装它们!使用
sudo mkdir /media/iso
sudo mount -o loop path/to/iso/file/YOUR_ISO_FILE.ISO /media/iso
就你的情况而言。 来源
然后您可以使用提到的 sed 命令。
现在,您真正想要完成的事情(据我所知)是进行持久的实时安装。这可以通过两种方式完成: 将 Ubuntu 安装到 USB 驱动器上 或者 使用持久存储进行 Iso 启动。
您可能正在尝试使用持久存储启动 ISO,以便您的更改不会在重启时丢失!
现在这篇文章有点旧了,而且是德语的,不过它对我有用,而且你在网站上使用谷歌翻译后,可能就能理解它的命令片段:)
我的持久实时启动的 Grub 脚本如下,你可以按照所示安装它这里。
insmod part_gpt
insmod ext2
set root='(hd0,2)'
set isofile='/iso/ubuntu-21.10-desktop-amd64.iso'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,msdos2 4e3de29b-008c-4063-9376-c52f34c87225
else
search --no-floppy --fs-uuid --set=root 4e3de29b-008c-4063-9376-c52f34c87225
fi
loopback loop $isofile
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile persistent quiet splash noeject
initrd (loop)/casper/initrd
神秘的文本4e3de29b-008c-4063-9376-c52f34c87225是 ISO 所在分区的 UUID。您可以使用 gnome-disks、g-parted 或blkid /dev/sdX
我希望我能帮到您!找到您的分区。
答案3
我扩展了 Martian 的答案,使其自动化。我使用的/dev/mapper/vgmint-root
是root
Linux Mint 的 LVM 卷组(带有 Ext4 文件系统)的卷):
sudo grep --only-matching --byte-offset --max-count=1 --text 'unique\.str \
/dev/mapper/vgmint-root | cut -d: -f1 | xargs -I{} -- sh -xc \
'sudo dd count=1 skip=$(echo "{} / 512" | bc) if=/dev/mapper/vgmint-root \
| xxd -c 32'
这实际上是一个有用的恢复删除命令,至少对于小型纯文本文件来说如此。--max-count=1
如果您希望看到更多匹配项,并且count=1
预计文件长度超过 512 字节,则可以增加该值。
如果您找到了所需内容,请将输出复制xxd
到文件中并运行,瞧!
xxd -c 32 -r the_xxd_output_to_reverse