我已经用 dd 创建了我的 hd 的映像,但是上面安装了 grub,我正在尝试弄清楚如何挂载映像文件,但是由于 grub 标头,mount 无法将其识别为 ext4 分区.
我知道它在那里,因为当我运行文件 -k disk.img 时,我得到以下信息:
disk.img: x86 boot sector; GRand Unified Bootloader, stage1 version 0x3, 1st sector stage2 0x3a883d7, code offset 0x48\012- Linux rev 1.0 ext4 filesystem data, UUID=6d1e45d1-8fac-4995-839b-fa5691a898ad (needs journal recovery) (errors) (extents) (large files) DOS executable (COM), boot code
Run Code Online (Sandbox Code Playgroud)
任何人都对如何找到分区的开头有任何想法,以便我可以告诉安装(好吧,真的是losetup)偏移量是加载分区的位置?
这有点间接,但可以使用mountorlosetup的“偏移量”参数安装带有磁盘映像的分区。
我希望能够使用保险丝在用户空间中做同样的事情
我的用例是在不允许构建作业具有 root 权限的自动构建服务器上构建磁盘映像,并且服务器不需要为特定构建作业进行自定义设置。
我有一个带有 hetzner.de 的专用 Ubuntu 服务器。hetzner 还提供了一个单独的备份空间,可通过samba/ftp/sftp/scp.
在他们关于备份的支持文档中,提到了以下行。
“直接使用 rsync 是不可能的。但是可以使用 smbfs、sshfs 或 ftpfs 在本地安装备份空间,从而允许有限地使用 rsync。要充分利用 rsync(例如使用硬链接的增量备份),图像文件必须创建,应通过环回挂载。”
我想将 rsync 与使用硬链接的增量备份一起使用。我认为环回是指http://en.wikipedia.org/wiki/Loop_device。任何人都可以帮助我如何从网络位置创建图像?
这是一个关于从闪存上的 ISO 映像启动的 Ubuntu 操作指南。
http://ubuntuforums.org/showthread.php?t=1288604
我没有得到的是在引导内核之前在 GRUB2 中创建循环设备:
menuentry "Ubuntu" {
set isofile="/boot/isos/ubuntu.iso"
loopback loop $isofile
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet splash noprompt --
initrd (loop)/casper/initrd.lz
}
Run Code Online (Sandbox Code Playgroud)
我不明白,什么是循环设备,与操作系统无关。我想,循环设备是 Linux 实体,除此之外不存在。或者它是一个 GRUB2 实体?我在哪里可以阅读更多关于它们的信息(我没有用谷歌搜索任何东西)?
我会理解,如果他们首先直接从闪存加载内核,然后从 ISO 创建一个 linux 循环设备。但是这样我就不明白了。
我想重新创建 Mac OS X 的一个称为稀疏包的功能(由较小的文件组成的磁盘映像,使它们在稍作更改后易于备份)。为此,我正在寻找一种方法来“虚拟地”创建一个由较小文件串联而成的单个文件(big.file 不应使用所有这些空间,只需链接到 .files):
4096 0.file
4096 1.file
4096 2.file
4096 3.file
4096 4.file
20480 big.file
Run Code Online (Sandbox Code Playgroud)
这样我就可以使用循环设备挂载 big.file,格式为 btrfs 并在写入此磁盘时,数据应仅写入某些 .files,以便我轻松备份。
任何建议我怎么能做到这一点?也许与 FUSE 相关的东西?
我正在尝试设置一个从 LVM 格式的图像文件运行的 Linux 系统。在对 initramfs 和引导选项进行一些修改后,我设法通过将主机文件系统挂载到/run/initramfs/host、losetup将映像/dev/loop0加载到并确保内核和 udev 检测到 LVM(和根 LV)来使其启动并运行。到现在为止还挺好。
问题是,当关闭(或重新启动,或……)系统时,根文件系统和主机都没有正确卸载,因为鸡与蛋的场景:根(或/oldroot,如关闭所指的那样) script) 不能卸载,因为/oldroot/run/initramfs/host它仍然被挂载,并且主机不能被卸载,因为这样做会导致/oldroot无法访问。
不fsck干净的关机并不是世界末日,因为两个文件系统都被记录在日志中,所以在下次启动时只需重播日志,但显然干净的关机会更好。
所以问题是:是否有可能以某种方式安排关机顺序(我可以修改关机脚本)或启动顺序(也许通过将主机挂载点移动到不同的位置),以便可以干净地卸载两个文件系统?
我正在尝试进行操作系统开发,我从引导加载程序开始,其中阶段 0 从 ext4 分区(由第一个 LBA 指定)上的文件(由 inode 指定)加载阶段 1。当然,我需要一些东西来启动,所以我抓住了 QEMU。怎么办?
到目前为止效果很好的是:
truncate -s64M /tmp/SomeVolume
/sbin/mke2fs -t ext4 -F /tmp/SomeVolume
yasm phase0.asm
dd if=phase0 of=/tmp/SomeVolume conv=notrunc
Run Code Online (Sandbox Code Playgroud)
我制作了一个大约 64 MB 的卷,将其格式化为 ext4,并用 phase0(大小始终为 1024 字节)覆盖前 1024 个八位字节。这工作正常。
但是现在我想制作一个正确分区的文件,以针对更现实的场景对其进行测试。我知道我可以使用/sbin/cfdisk我的卷文件,但mke2fs没有一个参数可以让我在文件中选择一个跨度。
现在我知道使用 loop的解决方案,但不幸的是,它似乎对我不起作用(似乎我无法max_part在 Debian jessie 中进行更改)。似乎还有另一个名为 的模块nbd,但我没有安装该模块的服务器和客户端。我需要 root 权限才能在用户空间中明确完成某些事情,这有点荒谬。
作为用户,我该如何做到这一点?或者我应该围绕我创建的 ext4 格式文件构建 MBR/GPT 分区卷?
我正在阅读理解安装概念的麻烦并遇到了这个解释:
通过使用
mount -t iso9660 /dev/cdrom /media/cdrom,您告诉系统:“将您在 中的这个非常长的字节串,/dev/cdrom按照iso9660格式解释为目录树,并允许我在该位置下访问它/media/cdrom”
以及沿着这条线的其他答案。这是有道理的,从这个逻辑中,我了解到挂载本质上是将文件系统耦合到设备,该设备以内核可以将其放入现有文件系统层次结构中的方式解释设备的内容。
如果确实如此,为什么需要循环安装?
由于 amount -o loop在技术上与该操作mount的目的相同:读取文件并在文件系统的上下文中解释其内容,为什么我们不能在不创建特殊设备的情况下概括挂载操作?
编辑:我知道循环设备为文件提供了块设备 API。然而,我的问题更笼统。从普通文件(iso或类似的磁盘映像格式)读取与从特殊文件读取(如果它们包含相同的数据)有何不同?
我关于mount工作原理的心智模型是这样的:给定由/dev/device文件公开的一组任意字节,这些字节随后由文件系统驱动程序(ext4例如)解释,mount命令将其与根层次结构相关联,以便它对最终用户看起来是透明的.
但是,这组任意字节可以出现在任何地方。如果由文件系统驱动程序解释,它们应该被识别为有效的文件系统。什么限制文件系统驱动程序只能从特殊文件而不是常规文件中读取?
我正在尝试更新自定义 initramfs init 脚本以将 squashfs 映像安装为根文件系统。我一直在测试以只读方式将壁球图像安装到循环设备,以读写方式将另一个空文件安装到另一个循环设备,并使用设备映射器创建 ro 循环设备的 rw 快照。
我已经用我的测试脚本(以 root 身份运行)做到了这一点:
mkdir /tmp/squash_rw
dev=$(losetup -f)
losetup -r $dev /mcp_fs.sqsh
ovl=/overlay
newdevname=overlay
size=$(blockdev --getsz "$dev")
loop=$(losetup -f --show -- "$ovl")
printf '%s\n' "0 $size snapshot $dev $loop P 8" | dmsetup create "$newdevname"
Run Code Online (Sandbox Code Playgroud)
然后,我使用 touch 来测试新设备是否以 rw 方式安装,但出现错误,并提示它是只读设备。
# touch /tmp/squash_rw/test
touch: cannot touch '/tmp/squash_rw/test': Read-only file system
Run Code Online (Sandbox Code Playgroud)
我使用的是 gentoo 发行版和 Linux 内核 3.10.6,其中包含设备映射器和 squashfs 模块。许多参考资料建议使用 dracut initramfs,但我试图让供应商提供的 init 脚本工作。
我已经坚持了几天,非常感谢任何人可以提供的任何帮助。
在继续研究和实验之后,我正在制作的 devmapper 设备似乎假定第一个设备的文件系统正在合并在一起。如果我使用 squashfs 设备,则 devmapper 设备是只读的,如果我使用 rw …
最近,我在启动时遇到缓冲区 I/O 错误。看起来,它是随机出现的,我无法重现它。但是,它平均每 5-8 次启动发生一次。以下是相关部分dmesg:
[ 24.630158] blk_update_request: I/O error, dev loop5, sector 0
[ 24.630199] blk_update_request: I/O error, dev loop5, sector 0
[ 24.630229] Buffer I/O error on dev loop5, logical block 0, async page read
[ 24.630272] blk_update_request: I/O error, dev loop5, sector 0
[ 24.630301] Buffer I/O error on dev loop5, logical block 0, async page read
[ 24.630340] blk_update_request: I/O error, dev loop5, sector 0
[ 24.630369] Buffer I/O error on dev loop5, logical …Run Code Online (Sandbox Code Playgroud)