/dev/zero讲解

在Linux中,文件/dev/zero是在逻辑上存放了无限大小的0x00数据。

我们可以写一段简单的Python脚本验证,

1
2
3
4
f = open('/dev/zero')
f.read(1)
f.read(10)
f.read(100)

如下图,可以发现输出结果全是字节为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
2
3
4
# 查看所有加载的回环设备
losetup -a
# 断开/dev/loop0回环设备
sudo losetup -d /dev/loop0

现在,我们再通过hexdump查看hd.img的内容(由于文件内容输出过多,将输出写入文件out.txt中)

1
hexdump hd.img > out.txt

使用more out.txt即可查看结果

在虚拟硬盘上安装grub

1
2
3
4
5
6
7
8
9
10
11
12
13
# 第一步挂载虚拟硬盘文件为loop0回环设备
sudo losetup /dev/loop0 hd.img

# 挂载硬盘文件
sudo mount -o loop ./hd.img ./hdisk/

# 安装GRUB
sudo grub-install \
--boot-directory=./hdisk/boot/ \
--force \
--allow-floppy \
--target=i386-pc \
/dev/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引导程序已启动完毕