• Chaos
    置顶
    2022-04-15
    没想到这一个步骤花费了好几天,现在成功在mac m1的CPU环境下通过QEMU跑起来了hello world。相关细节可以查看我的仓库https://github.com/Rlyown/ToyOS。 这里简要说明一下:成功的关键是借助了Docker和QEMU。Docker可以通过创建x86的Linux容器来完成ext4磁盘的分区、格式化以及安装grub。而QEMU则是用来启动内核的虚拟机。 以下步骤均在x86的容器中完成: 1. 通过命令创建磁盘镜像,本人选择之创建32M的镜像 dd if=/dev/zero of=$DISK bs=512 count=$((32 * 1024 * 1024 / 512)) 2. 对磁盘进行分区,这里只做了一个分区。分区的目的是避免后续执行grub-install安装时报错。 parted -s $DISK mklabel msdos parted -s $DISK mkpart primary 2048s 100% parted -s $DISK set 1 boot on 3. 查找一个空闲的回环设备映射到镜像文件,假设是/dev/loop0 losetup --find --show --partscan ${DISK} 4. 如果像我一样是arm架构借助了x86容器,那么这个步骤很关键。因为容器出于某种原因,映射了带分区的镜像文件后,找不到类似/dev/loop0p1的分区设备。这一步就是手动创建这个分区设备。 PARTITIONS=$(lsblk --raw --output "MAJ:MIN" --noheadings ${LOOPDEV} | tail -n +2) COUNTER=1 for i in $PARTITIONS; do MAJ=$(echo $i | cut -d: -f1) MIN=$(echo $i | cut -d: -f2) if [ ! -e "${LOOPDEV}p${COUNTER}" ]; then mknod ${LOOPDEV}p${COUNTER} b $MAJ $MIN; fi COUNTER=$((COUNTER + 1)) done 5. 格式化分区。 mkfs.ext4 -q /dev/loop0p1 6. 后面就可以挂载这个分区,然后安装grub。这里注意挂载时使用的设备是分区/dev/loop0p1,而进行grub-install时使用的设备是镜像/dev/loop0。 mkdir ISO mount /dev/loop0p1 ISO mkdir -p ISO/boot/grub grub-install --boot-directory=ISO/boot --force --allow-floppy --target=i386-pc /dev/loop0 cp grub.cfg ISO/boot/grub 7. 取消挂载和映射,并删除手动创建的分区设备。 umount ISO lostup -d /dev/loop0 rm -f /dev/loop0p1 8. 通过qemu模拟x86虚拟机 qemu-system-i386 -m 1024 -drive format=raw,file=disk.img
    展开

    作者回复: 太强了

    共 2 条评论
    6
  • hdhwjjs
    置顶
    2021-11-08
    看到这一课的内容有需要上机实操的就非常喜欢,终于啃了那么多天的理论课,迎来了实操课。 我的实操环境是:WIN10 + VBox+ Ubuntu 20.04 一开始我搞错了,跟着课程内容,去ubuntu里安装vBox,这等于是把自己引入了套娃的险境。 如果你也是和我同样的运行环境,那可以参考下文绕过这个坑。 正确的操作应该是在我们的VBox里建立这个与我们的Ubuntu并列的HelloOS虚拟系统,具体如何建立,跟着课程里的内容来完成即可。 这里我要分享一下我踩这些坑的捷径, 听完课先扒拉课后大神们的留言,老师已把精华踩坑攻略帮我们置顶了,基本上前三篇留言里能找到大部分你即将遇到的坑。 然后,我遇到第二个坑,是loop0 这个我也是去课后留言区扒拉,带着问题,明确目标去找,很快就查到,可以用 sudo losetup这条指令找出你系统里哪些loop已被占用,然后你使用没有被占用的loop即可 范围是0到11 。 第三个坑,是我生成了hd.vdi文件后,继续跟着课程操作,系统老不让我过,我去查大神留言,发现我这是陷在跟套娃死磕的骚操作, 像我这里的运行环境下,正确的操作应该是: 生成完hd.vdi文件,就把它保存到windows里,然后打开vbox,在我们一开始建立的HelloOS虚拟系统里,加载这个hd.vdi虚拟硬盘,然后就在VBox里启动这个HelloOS操作系统。 启动之后,又遇到了一个坑,提示 hd0,msdos1错误, 发现错误后,再次扒拉课后大神的留言,找到解决方法: 修改grub.cfg文件,把里面的hd0,msdos1 改为hd0 即可,按照攻略,改完后,生成的hd.vfi放进HelloOS系统,启动果然就完成了今天这课的操作要求。(记得报错后,最好能重启一下虚拟机里的操作系统,否则可能遇到你已经更新了正确的hd.vdi,但系统提示你挂载的hd.vdi硬盘有问题不让你通过!) 课后老师留的思考题,为什么我们要把虚拟盘格式化成ext4格式, 我的印象中,文件格式系统在dos时代是FAT文件格式,后来有了FAT32,再后来硬盘越来越大,包括不同的操作系统,从windows、linux到MacOS,各个系统有各自的文件格式系统。 我的理解是,磁盘格式是为了即将安装的操作系统准备的,也就是我们即将做的这个操作系统是采用ext4文件格式,不能用其他的比如FAT32或exFAT等。
    展开

    作者回复: 因为在linux上向虚拟硬盘上写入文件 所以 要用ext4

    共 3 条评论
    1
  • 安之若素
    置顶
    2021-11-04
    使用服务器的小伙伴,可以参考如下链接,使用vnc方式,访问图形化ubuntu界面 https://www.voidking.com/dev-linux-virtualbox/ https://support.huaweicloud.com/bestpractice-ecs/zh-cn_topic_0168615364.html https://askubuntu.com/questions/800302/vncserver-grey-screen-ubuntu-16-04-lts

    作者回复: 可以 可以

    共 2 条评论
    
  • 山不厌高,海不厌深
    置顶
    2021-10-26
    # arch linux安装virtualbox 我使用的是manjaro系统,本来linux玩的就不是很熟,直接上arch我人都麻了,不过最后还是跑成功了,这里贴一下我遇到的坑。 1、arch需要先更新一下系统(很重要) ``` yay -Syy ``` 2、然后直接安装virtualbox ``` yay -S virtualbox ``` 3、然后很关键(我这里只装完这些,是用不了的,需要先安装一下与内核有关的东西): 查看一下你的内核版本`uname -r`,比如我是`5.10.70-1-MANJARO`,还需要装一下内核与virtualbox有关的一些包(注意安装的版本要和你的内核相同) 这里我就装了`linux510-virtualbox-host-modules`与`linux510-virtualbox-host-modules`(在manjaro自带的软件商店内) 安装完成根据提示`reboot` 4、然后根据archwiki,我们还需要加载virtualBox内核模块 如果你上一步没有安装相关内核包的话,这里会报错说xxx module找不到之类的错误,我也是在这里卡了好久 ``` sudo modprobe vboxdrv ``` 5、完成 然后就是跟着老师的步骤走了,arch成功跑起来HelloOS!
    展开

    作者回复: 66666啊

    
    
  • Fx
    置顶
    2021-08-26
    ## Ubuntu18.04最全排坑指南 1. virtualbox安装问题无法定位资源包,直接'sudo apt-get install virtualbox', 不要指定版本,安装后版本为5.2.42,目前不影响实验 2. loop资源占用问题,参考前面的评论 3. grub安装时efi方式启动出现问题,指定 '--target i386-pc'出现找不到该文件,若能在系统文件中找到该文件则指定路径查找即可 ``` cd /tmp # 进入efi所在的文件夹,名字可能会不一样,按照报错查找不到的路径为准 sudo apt-get download grub-pc-bin dpkg-deb -R grub-pc-bin_2.02~beta2-36ubuntu3.16_amd64.deb grub/ sudo mv grub/usr/lib/grub/i386-pc/ /usr/lib/grub/ ``` 4. 在执行步骤时我一开始是直接忽略了3,继续往下也不会出现报错,但最后启动虚拟机时出现'FATAL:No bootable medium ....',查看评论需要重新创建虚拟硬盘,于是直接在文件系统删除新建立的能看到的文件,并重启计算机,就能从头开始,否则会出现某些文件已存在的报错但不知道如何删除。最终解决了坑三成功完成实验。
    展开

    作者回复: 666666

    
    6
  • Jayying
    置顶
    2021-07-31
    终于显示出来了。 记录一下我遇到的几个问题: 1. grub-install时遇到EFI的问题, 添加 参数 --target i386-pc 2. 挂载/dev/loop0时可能遇到device busy, 换一个就行了,比如loop8 3. 进入了grub,但是没有看到HelloOS;这个是我自己头铁,把老师第二行命令删掉了,因为每次执行这条命令都会报错, 按老师的命令写就可以了: VBoxManage closemedium disk ./hd.vdi #删除虚拟硬盘UUID并重新分配 4. 看到HelloOS,但是进入显示找不到hd0,msdos1什么的。在我第三步坑那里,我ls看到的是hd0,所以把hd0,msdos1改成hd0就可以了

    作者回复: 老铁 666啊

    共 5 条评论
    17
  • 黎标松
    置顶
    2021-07-22
    第一次留言: 我的宿主机是windows 10系统,用系统自带的Hyper-V虚拟机跑ubuntu,为了和老师一致,我又下了vitural Box,按照老师的步骤键虚拟机,这样避免套娃(我试过在虚拟机中跑虚拟机,真的很慢);生成虚拟硬盘的过程和老师一样;第一个坑是第一步,设置回环设备:sudo losetup /dev/loop0 hd.img 这里可以用命令 ls /dev/loop* 查看,看看哪个没有被占用(loop0-11一个一个试也行),以实际为准;第二个将hd.img文件生成DVI文件后,(不用在虚拟机中配置虚拟硬盘)把ubuntu虚拟机中的DVI文件共享到windows系统里面(可以参考这篇文章:https://blog.csdn.net/qq_27607539/article/details/75007717),在windows系统下拿到我们生成的hd.dvi文件后,使用vitualBox 虚拟机加载我们的虚拟硬盘(参考这篇文章:https://blog.csdn.net/love__coder/article/details/8270856),这样就可以启动我们的helloOS系统了;第三个坑就是提示'hd0,msdos1'错误,需要重新制作镜像,并且修改grub.cfg里的这行为'hd0,msdos1'为'hd0'(参考评论第一条第九天魔王大佬);这些坑都排完后应该就可以达到老师的效果了
    展开

    编辑回复: 感谢老铁的留言,不但可以整理自己的想法,还能帮到其他同学,赞。后面继续加油呀!

    
    3
  • Pure
    置顶
    2021-07-21
    我在设置回关设备这儿稍微卡了一下,跟大家说一下,就是我输完sudo losetup /dev/loop0 hd.img以后系统提示我说:使用设备失败,没有那个设备。把我搞蒙了,我去网上搜了一下,其实我们要先用命令找一个没有被用过的回环设备名也就是这里的loop0,我们可以用命令sudo losetup /dev/loopn来试哪个回环设备是没有被用过(这里的n其实就是你需要试的数字,0不行就1,1不行就2,一直试,我的是12)直到你试到人家说:使用设备失败,没有那个设备,这时候你的loopn就是你需要的回环设备名,然后再sudo losetup /dev/loopn hd.img就可以啦

    作者回复: 对的 ,也可以使用sudo losetup -l 查看 一下 所有的loop设备的状态

    共 3 条评论
    
  • 青玉白露
    置顶
    2021-07-15
    参考neohope的方法,其实在Mac和Windows环境下利用VirtualBox可以很方便的进行测试, 只需要建立两个虚拟机,一个ubuntu一个是我们的COSMOS,自己在Mac上进行了测试,具体的细节可以参考博客: https://blog.csdn.net/ll15982534415/article/details/118771286

    作者回复: 哈哈 阔以

    
    8
  • Shinymimiq
    置顶
    2021-06-11
    我来优化一下Mac小伙伴的开发流程,直接能用Mac编译,并修改我们Cosmos的硬盘镜像文件了,基本可以不需要启动Ubuntu虚拟机了。 首先得按评论区里Veek或者Neohoped大佬的教程得到一个hd.vdi之类的镜像文件 然后使用 Virtual Box 提供的 VBoxManage clonehd 命令,把它转成 raw image VBoxManage clonehd ~/VirtualBox\ VMs/MyUbuntu/hd.vdi image.img --format raw 这时候在 Virtual Box 的 Virtual Media Manager 里是会多一个image.img的硬盘 然后我们只要把Cosmos虚拟机的启动硬盘改成这个image.img就行了 我们修改完OS代码之后,可以把 image.img 加载到 MacOS 系统中 最简单的方式是这样 open image.img 这时候系统的 /Volumes 目录下会多出一个 Untitled 1 文件夹(如果你没有其他 Untitled 镜像加载的话) 之后就可以把相关文件比如 Cosmos.eki 拷贝到 /Volumes/Untitled\ 1/boot 下 完成修改之后,接着使用 umount /Volumes/Untitled\ 1 来取消镜像文件的加载 这时候再启动我们的Cosmos虚拟机就是直接跑更新后的文件了。 至于编译源代码的话,我们可以使用Docker来帮助我们生成一个基于Linux x64的工具链,这样就能直接编译,并且能直接使用课程中提供的 lmoskrlimg,(原来因为文件格式的问题在Mac下无法直接使用这个工具) 首先安装好Docker Desktop 随便新建一个目录 mkdir cosmos_build_env 在里面创建一个Dockerfile, 我在这里直接把内容echo到新文件里面 echo "FROM dockcross/linux-x64 ENV DEFAULT_DOCKCROSS_IMAGE cosmos_build RUN apt-get install -y nasm" > cosmos_build_env/Dockerfile 接下来创建 Docker image docker build cosmos_build_env -t cosmos_build 创建完之后使用 docker run cosmos_build > cosmos_build chmod +x cosmos_build 然后得到的这个cosmos_build就可以用来编译我们的cosmos 例如 ./cosmos_build make release
    展开

    作者回复: 你好,这个厉害了

    共 4 条评论
    6