DragonOS icon indicating copy to clipboard operation
DragonOS copied to clipboard

如何创建磁盘镜像

Open jimersylee opened this issue 2 years ago • 26 comments

运行DragonOS ​ 在运行DragonOS之前,需要先使用tools目录下的脚本,创建一至少为16MB磁盘镜像(类型选择raw)。并建立MBR分区表,然后将第一个分区格式化为FAT32分区。

这步不知道怎么操了

jimersylee avatar Jun 30 '22 05:06 jimersylee

您好! 假设您已经安装正确版本的软件依赖,

首先,您需要使用tools/create_hdd_image.sh创建一块磁盘镜像文件,该脚本在创建磁盘镜像之后,会调用fdisk,您需要在fdisk之中对虚拟磁盘进行初始化。需要把磁盘的分区表设置为MBR格式,并创建1个分区。 随后,该脚本会将该磁盘文件挂载到本地回环设备/dev/loop1,您需要通过sudo mkfs.vfat -F 32 /dev/loop1p1对这个分区进行格式化。随后,将这个磁盘文件移动到bin/文件夹(需要您手动创建)下。 并在bin文件夹下创建子文件夹disk_mount。 随后,使用tools/mount_virt_disk.sh,挂载该磁盘镜像到disk_mount文件夹。然后在disk_mount文件夹中,创建子文件夹dev,并在dev文件夹中创建键盘文件keyboard.dev 至此,准备工作已经完成,您可以运行run.sh,然后dragonos将会被启动。 希望能解决到您的问题!

fslongjin avatar Jun 30 '22 11:06 fslongjin

非常感谢您提出的issue,该部分的脚本和文档存在部分问题,已经在commit 621e65f进行初步的修正。

fslongjin avatar Jun 30 '22 11:06 fslongjin

脚本没考虑已经那个挂载了磁盘的情况,部分地方硬编码了/dev/loop1 ,会不成功,麻烦再检查下 我日常使用的是manjaro的系统,挂载了些目录 ➜ DragonOS git:(master) ✗ df -h Filesystem Size Used Avail Use% Mounted on dev 16G 0 16G 0% /dev run 16G 2.6M 16G 1% /run /dev/nvme0n1p4 740G 494G 210G 71% / tmpfs 16G 236M 15G 2% /dev/shm tmpfs 16G 267M 15G 2% /tmp /dev/nvme0n1p1 96M 46M 51M 48% /boot/efi /dev/loop1 114M 114M 0 100% /var/lib/snapd/snap/core/13308 /dev/loop6 400M 400M 0 100% /var/lib/snapd/snap/obs-studio/1284 /dev/loop5 82M 82M 0 100% /var/lib/snapd/snap/gtk-common-themes/1534 /dev/loop0 6.4M 6.4M 0 100% /var/lib/snapd/snap/ascii-image-converter/33 /dev/loop2 62M 62M 0 100% /var/lib/snapd/snap/core20/1518

jimersylee avatar Jun 30 '22 15:06 jimersylee

了解~确实,之前没考虑周到这个问题。 621e65f这个提交已经对这个做了修正,还得麻烦您看看,在您的系统上边还存不存在问题~

fslongjin avatar Jun 30 '22 22:06 fslongjin

621e65f 不能解决问题

jimersylee avatar Jul 01 '22 14:07 jimersylee

621e65f 不能解决问题

具体情况是什么样呢

fslongjin avatar Jul 02 '22 13:07 fslongjin

tools/create_hdd_image.sh 第8行 sudo losetup -P /dev/loop1 --show disk.img需要删掉吧

另外 我遇到了一下问题,请抽空看下: The partition table has been altered. Syncing disks.

/dev/loop6p1 mkfs.fat 4.2 (2021-01-31) mkfs.vfat: unable to open /dev/loop6p1: No such file or directory

zzy666-hw avatar Jul 03 '22 05:07 zzy666-hw

tools/create_hdd_image.sh 第8行 sudo losetup -P /dev/loop1 --show disk.img需要删掉吧

另外 我遇到了一下问题,请抽空看下: The partition table has been altered. Syncing disks.

/dev/loop6p1 mkfs.fat 4.2 (2021-01-31) mkfs.vfat: unable to open /dev/loop6p1: No such file or directory

确实,这是我粗心大意导致的,第8行需要被删掉。我提交了一个新的修正9bf52c,这个修正在我的电脑上能够正常运行~ ps:需要配合文档构建DragonOS的说明,即可正常运行~

fslongjin avatar Jul 03 '22 14:07 fslongjin

@fslongjin 我觉得你需要在你的测试机上多挂载几个盘 然后跑这个脚本 就能测试出问题了 我目前使用最新提交还是跑不成功

jimersylee avatar Jul 04 '22 02:07 jimersylee

请问,是哪个脚本出现的问题呀? linux有最大的loop设备的限制,然后,create_hdd_image.sh是可以自动选择可用的loop设备。mount和umount脚本的话,需要分别的去指定特定的loop设备才行。(默认是loop1)

---原始邮件--- 发件人: "Jimersy @.> 发送时间: 2022年7月4日(周一) 上午10:02 收件人: @.>; 抄送: @.@.>; 主题: Re: [fslongjin/DragonOS] 如何创建磁盘镜像 (Issue #1)

@fslongjin 我觉得你需要在你的测试机上多挂载几个盘 然后跑这个脚本 就能测试出问题了 我目前使用最新提交还是跑不成功

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

fslongjin avatar Jul 04 '22 02:07 fslongjin

我稍微调整了一下脚本:

create_hdd_image.sh生成硬盘

echo "Creating virtual disk image..." qemu-img create -f raw disk.img 16M # 分别输入o、n, 然后按4次回车,直到回到fdisk的默认界面, # 再输入w即可 # 按顺序输入,并且,每次输入完成后要按下回车) fdisk disk.img echo "Successfully created disk image, please make a FAT32 filesystem on it and move it to folder ../bin/"

sudo mkdir -p ../bin sudo cp ./disk.img ../bin/

mount_virt_disk.sh格式化硬盘和挂载

LOOP_DEVICE=$(sudo losetup -f --show -P disk.img)
|| exit 1

# lsblk echo ${LOOP_DEVICE}p1

sudo mkfs.vfat -F 32 ${LOOP_DEVICE}p1 lsblk mkdir -p ../bin/disk_mount/ sudo mount ${LOOP_DEVICE}p1 ../bin/disk_mount/

测试可行

zzy666-hw avatar Jul 04 '22 16:07 zzy666-hw

进入系统之后,遇到了一下问题,输入回车或者shell命令,提示keyboard input buffer full,请大佬抽空看看 进入os

zzy666-hw avatar Jul 04 '22 16:07 zzy666-hw

现在这个是因为找不到键盘文件导致的。 你需要使用tools/mount_xxxxxx.sh来挂载磁盘镜像,并且在其中创建dev文件夹,在dev文件夹下面创建keyboard.dev文件即可。 待文件系统完善后就不需要这么操作了,目前这个是权宜之计。

fslongjin avatar Jul 05 '22 00:07 fslongjin

我稍微调整了一下脚本:

create_hdd_image.sh生成硬盘

echo "Creating virtual disk image..." qemu-img create -f raw disk.img 16M # 分别输入o、n, 然后按4次回车,直到回到fdisk的默认界面, # 再输入w即可 # 按顺序输入,并且,每次输入完成后要按下回车) fdisk disk.img echo "Successfully created disk image, please make a FAT32 filesystem on it and move it to folder ../bin/"

sudo mkdir -p ../bin sudo cp ./disk.img ../bin/

mount_virt_disk.sh格式化硬盘和挂载

LOOP_DEVICE=$(sudo losetup -f --show -P disk.img)
|| exit 1

# lsblk echo ${LOOP_DEVICE}p1

sudo mkfs.vfat -F 32 ${LOOP_DEVICE}p1 lsblk mkdir -p ../bin/disk_mount/ sudo mount ${LOOP_DEVICE}p1 ../bin/disk_mount/

测试可行

看了一下,create脚本的改动确实没有太大问题~ 我有个疑惑就是,mount的脚本因为要和umount的配套,如果mount脚本随机选择loop设备,umount脚本要怎么样才能正确的卸载正确的设备呢?

fslongjin avatar Jul 05 '22 00:07 fslongjin

现在这个是因为找不到键盘文件导致的。 你需要使用tools/mount_xxxxxx.sh来挂载磁盘镜像,并且在其中创建dev文件夹,在dev文件夹下面创建keyboard.dev文件即可。 待文件系统完善后就不需要这么操作了,目前这个是权宜之计。

添加之后可以进入系统了,谢谢

zzy666-hw avatar Jul 05 '22 15:07 zzy666-hw

我稍微调整了一下脚本:

create_hdd_image.sh生成硬盘

echo "Creating virtual disk image..." qemu-img create -f raw disk.img 16M

分别输入o、n, 然后按4次回车,直到回到fdisk的默认界面,

再输入w即可

按顺序输入,并且,每次输入完成后要按下回车)

fdisk disk.img echo "Successfully created disk image, please make a FAT32 filesystem on it and move it to folder ../bin/" sudo mkdir -p ../bin sudo cp ./disk.img ../bin/

mount_virt_disk.sh格式化硬盘和挂载

LOOP_DEVICE=$(sudo losetup -f --show -P disk.img) || exit 1

lsblk

echo ${LOOP_DEVICE}p1 sudo mkfs.vfat -F 32 ${LOOP_DEVICE}p1 lsblk mkdir -p ../bin/disk_mount/ sudo mount ${LOOP_DEVICE}p1 ../bin/disk_mount/ 测试可行

看了一下,create脚本的改动确实没有太大问题~ 我有个疑惑就是,mount的脚本因为要和umount的配套,如果mount脚本随机选择loop设备,umount脚本要怎么样才能正确的卸载正确的设备呢?

我想到一种方式,试了一下是可行的: LOOP_DEVICE=$(lsblk | grep disk_mount) sudo umount -f ../bin/disk_mount/ sudo losetup -d /dev/${LOOP_DEVICE:2:5}

zzy666-hw avatar Jul 05 '22 15:07 zzy666-hw

我这里改了4个脚本,执行顺序为,create_hdd_image.sh -> run.sh,run.sh包含了mount的操作,本地测试可以进入系统,涉及的修改分别是: 1、create_hdd_image.sh echo "Creating virtual disk image..." qemu-img create -f raw disk.img 16M # 分别输入o、n, 然后按4次回车,直到回到fdisk的默认界面, # 再输入w即可 # 按顺序输入,并且,每次输入完成后要按下回车) fdisk disk.img echo "Successfully created disk image, please make a FAT32 filesystem on it and move it to folder ../bin/"

sudo mkdir -p ../bin sudo cp ./disk.img ../bin/

2、mount_virt_disk.sh LOOP_DEVICE=$(sudo losetup -f --show -P ../bin/disk.img)
|| exit 1

# lsblk echo ${LOOP_DEVICE}p1

sudo mkfs.vfat -F 32 ${LOOP_DEVICE}p1 mkdir -p ../bin/disk_mount/ sudo mount ${LOOP_DEVICE}p1 ../bin/disk_mount/ lsblk

3、umount_virt_disk.sh LOOP_DEVICE=$(lsblk | grep disk_mount) sudo umount -f ../bin/disk_mount/ sudo losetup -d /dev/${LOOP_DEVICE:2:5} echo ${LOOP_DEVICE:2:5}

4、run.sh # 拷贝应用程序到硬盘 cd tools bash m* sudo cp ${root_folder}/bin/user/shell.elf ${root_folder}/bin/disk_mount sudo cp ${root_folder}/bin/user/about.elf ${root_folder}/bin/disk_mount sudo mkdir ${root_folder}/bin/disk_mount/dev sudo touch ${root_folder}/bin/disk_mount/dev/keyboard.dev sync # bash u* cd ..

zzy666-hw avatar Jul 05 '22 15:07 zzy666-hw

@zzy666-hw 按你的修改的可以启动了 还需注意的是如果开着VirtualBox虚拟机,启动这个系统会报错 16 Device or Resource busy

虽然可以启动了,但是我现在虚拟机界面还是有问题,显示> Guest has not initialized the display (yet)

我的系统信息 ██████████████████ ████████ jimersylee@Lee-laptop ██████████████████ ████████ OS: Manjaro 21.3.2 Ruah ██████████████████ ████████ Kernel: x86_64 Linux 5.15.49-1-MANJARO ██████████████████ ████████ Uptime: 2d 17h 52m ████████ ████████ Packages: 1932 ████████ ████████ ████████ Shell: zsh 5.9 ████████ ████████ ████████ Resolution: 3840x1080 ████████ ████████ ████████ DE: GNOME 42.2 ████████ ████████ ████████ WM: Notion ████████ ████████ ████████ GTK Theme: WhiteSur-Light [GTK2/3] ████████ ████████ ████████ Icon Theme: Qogir-manjaro ████████ ████████ ████████ Font: Noto Sans 11 ████████ ████████ ████████ Disk: 507G / 759G (71%) ████████ ████████ ████████ CPU: AMD Ryzen 7 4800H with Radeon Graphics @ 16x 2.9GHz GPU: AMD/ATI RAM: 17062MiB / 31013MiB

jimersylee avatar Jul 07 '22 03:07 jimersylee

@zzy666-hw 按你的修改的可以启动了 还需注意的是如果开着VirtualBox虚拟机,启动这个系统会报错 16 Device or Resource busy

虽然可以启动了,但是我现在虚拟机界面还是有问题,显示> Guest has not initialized the display (yet)

我的系统信息 ██████████████████ ████████ jimersylee@Lee-laptop ██████████████████ ████████ OS: Manjaro 21.3.2 Ruah ██████████████████ ████████ Kernel: x86_64 Linux 5.15.49-1-MANJARO ██████████████████ ████████ Uptime: 2d 17h 52m ████████ ████████ Packages: 1932 ████████ ████████ ████████ Shell: zsh 5.9 ████████ ████████ ████████ Resolution: 3840x1080 ████████ ████████ ████████ DE: GNOME 42.2 ████████ ████████ ████████ WM: Notion ████████ ████████ ████████ GTK Theme: WhiteSur-Light [GTK2/3] ████████ ████████ ████████ Icon Theme: Qogir-manjaro ████████ ████████ ████████ Font: Noto Sans 11 ████████ ████████ ████████ Disk: 507G / 759G (71%) ████████ ████████ ████████ CPU: AMD Ryzen 7 4800H with Radeon Graphics @ 16x 2.9GHz GPU: AMD/ATI RAM: 17062MiB / 31013MiB

启动后,需要在控制台输入c,然后回车即可。

fslongjin avatar Jul 07 '22 03:07 fslongjin

我想,报错那个可能是因为virtualbox使用了KVM,而qemu也需要kvm,因此就冲突了

fslongjin avatar Jul 07 '22 03:07 fslongjin

我想,报错那个可能是因为virtualbox使用了KVM,而qemu也需要kvm,因此就冲突了

我把virtualbox关闭了,难道是因为还有后台程序运行? 还有一个依赖 mtools,在arch-linux系可能不会默认装,需要装一下,否则执行 grub-mkrescue -o grub.iso 时会报错.grub-mkrescue: error: mformat invocation failed

jimersylee avatar Jul 07 '22 04:07 jimersylee

我用的VMware虚拟机+arch-linux,没遇到Device or Resource busy的问题 虚拟机界面显示> Guest has not initialized the display (yet)有2种方法: 一个是作者说的,在控制台输入c,然后回车即可 另一个如图所示,在qemu界面,点击Machine -> Reset reset

zzy666-hw avatar Jul 07 '22 23:07 zzy666-hw

@zzy666-hw 还是不行

jimersylee avatar Jul 14 '22 02:07 jimersylee

@zzy666-hw 还是不行

目前具体情况是什么样呢?还是无法创建磁盘镜像吗?

fslongjin avatar Jul 14 '22 02:07 fslongjin

@zzy666-hw 还是不行

我猜测是由于grub版本的问题,你可以尝试编译安装grub2.06,装到/usr/local目录下即可,这样就不会替换掉本机原有的grub

fslongjin avatar Jul 17 '22 08:07 fslongjin

jimersylee 你好,可以加一下qq群115763565,方便讨论。

zzy666-hw avatar Jul 21 '22 00:07 zzy666-hw

目前已经实现快速安装开发环境,您可以参考以下资料:

如何运行? 运行DragonOS并不是一件难事,我们有详细的运行教程,能帮助你在最短15分钟之内,在你的电脑上运行DragonOS。 以下资料将对你有所帮助: 构建DragonOS — DragonOS dev 文档 如何在电脑的虚拟机上运行DragonOS? | | 龙进的博客 教你在15分钟内运行DragonOS!- Bilibili

fslongjin avatar Aug 16 '22 07:08 fslongjin

你可以fork一份到你的账户,然后commit、push上去,接着发起pull request。这样代码就能合并进来啦

---原始邮件--- 发件人: @.> 发送时间: 2022年7月5日(周二) 晚上11:50 收件人: @.>; 抄送: @.@.>; 主题: Re: [fslongjin/DragonOS] 如何创建磁盘镜像 (Issue #1)

我这里改了4个脚本,执行顺序为,create_hdd_image.sh -> run.sh,run.sh包含了mount的操作,本地测试可以进入系统,涉及的修改分别是: 1、create_hdd_image.sh echo "Creating virtual disk image..." qemu-img create -f raw disk.img 16M

分别输入o、n, 然后按4次回车,直到回到fdisk的默认界面,

再输入w即可

按顺序输入,并且,每次输入完成后要按下回车)

fdisk disk.img echo "Successfully created disk image, please make a FAT32 filesystem on it and move it to folder ../bin/"

sudo mkdir -p ../bin sudo cp ./disk.img ../bin/

2、mount_virt_disk.sh LOOP_DEVICE=$(sudo losetup -f --show -P ../bin/disk.img) || exit 1

lsblk

echo ${LOOP_DEVICE}p1

sudo mkfs.vfat -F 32 ${LOOP_DEVICE}p1 mkdir -p ../bin/disk_mount/ sudo mount ${LOOP_DEVICE}p1 ../bin/disk_mount/ lsblk

3、umount_virt_disk.sh LOOP_DEVICE=$(lsblk | grep disk_mount) sudo umount -f ../bin/disk_mount/ sudo losetup -d /dev/${LOOP_DEVICE:2:5} echo ${LOOP_DEVICE:2:5}

4、run.sh

拷贝应用程序到硬盘

cd tools bash m* sudo cp ${root_folder}/bin/user/shell.elf ${root_folder}/bin/disk_mount sudo cp ${root_folder}/bin/user/about.elf ${root_folder}/bin/disk_mount sudo mkdir ${root_folder}/bin/disk_mount/dev sudo touch ${root_folder}/bin/disk_mount/dev/keyboard.dev sync

bash u*

cd ..

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

fslongjin avatar Oct 11 '22 09:10 fslongjin