/dev/zero讲解
在Linux中,文件/dev/zero是在逻辑上存放了无限大小的0x00数据。
我们可以写一段简单的Python脚本验证,
1 | f = open('/dev/zero') |
如下图,可以发现输出结果全是字节为0的二进制数据。
注意:read中参数表示一次读取多少字节数据,如果你不传入参数,即使用默认参数-1,就表示一次性完整读取整个文件并加载到内存中,然而/dev/zero是逻辑上的文件,拥有无限大小,永远也读不完。所以,如果你直接使用f.read()那么你可以看到电脑内存将飙升,直到内存不足死机。[doge]
创造虚拟硬盘
现在,我们需要创建一块虚拟硬盘,虚拟硬盘本质上就是一个文件,把这个文件当作一块硬盘,进行原始的读写硬盘操作,所以创建一块虚拟硬盘就是创建一个一定大小的文件。我们现在有一个目标,就是创建一块100M大小的文件,内容全部填充为0x00。
在Linux中,使用cat命令可以读取文件并输出到终端,使用>
操作符可以使终端输出重定向到指定文件的输入。
我们使用如下命令将可以创造一个文件,内容全部填充为0x00,但是这样没有指定大小,故将不断地写入硬盘0x00到文件a.out中,直到目标分区写不下为止。[doge]
1 | cat /dev/zero > a.out |
所以,我们换一种方法,使用dd命令,
1 | dd if=/dev/zero of=hd.img bs=1024 count=102400 |
-
bs:表示块大小,这里是1024字节
-
if:表示输入文件,/dev/zero就是Linux下专门返回0数据的设备文件,读取它就返回0
-
of:表示输出文件,即我们的硬盘文件。
-
count:表示输出多少块
一个block size为1024字节即1字节,那么1024块就有1024字节,即1M,那么102400块就有100M了。
执行结果如下图所示,
可以发现,所得文件刚好为100M
我们查看文件的前10字节,
1 | hexdump -n 10 hd.img |
如下图,
发现确实都为0x00
格式化虚拟硬盘
现在我们得到了一块空磁盘,需要格式化后才能使用,在格式化之前,我们需要先将该硬盘挂载到系统中。
首先需要将虚拟硬盘文件初始化为Linux的回环设备,
1 | sudo losetup /dev/loop0 hd.img |
我们可以使用Linux中的mkfs.ext4
命令格式化该设备
1 | sudo mkfs.ext4 -q /dev/loop0 |
挂载虚拟硬盘
然后我们就可以直接将/dev/loop0挂载到我们的某个文件夹中了,我这里新建了一个文件夹hd
1 | sudo mount /dev/loop0 hd |
然后我们就可以进入hd文件夹,这就是我们的虚拟硬盘了,我们可以在其中创建文件,创建文件夹等等。
卸载虚拟硬盘
我们用完后,通过sudo umount hd
卸载磁盘,然后可通过如下方式断开该回环设备的连接,
1 | # 查看所有加载的回环设备 |
现在,我们再通过hexdump
查看hd.img的内容(由于文件内容输出过多,将输出写入文件out.txt中)
1 | hexdump hd.img > out.txt |
使用more out.txt
即可查看结果
在虚拟硬盘上安装grub
1 | # 第一步挂载虚拟硬盘文件为loop0回环设备 |
–boot-directory 指向先前我们在虚拟硬盘中建立的boot目录。
–force --allow-floppy :指向我们的虚拟硬盘设备文件/dev/loop0
–target=i386-pc 表示目标平台
安装完毕,我们就可以看到如下这些安装后的文件了
启动我们虚拟硬盘上的grub
我们先把虚拟硬盘设备从我们的Linux系统上卸载,sudo umount hdisk
安装qemu模拟器
在我这里使用的是manjaro系统,直接使用yay -S qemu
即可安装完毕,Ubuntu等其他系统可以再找一些相关资料。
之后,我们使用命令qemu-system-x86_64 hd.img
即可从我们创造的虚拟硬盘启动
如下图启动了一个qemu的窗口,其中的grub引导程序已启动完毕