在银河麒麟系统QEMU上运行RISC-V64位版本的Linux
镜像选择
首先我们要安装kylin操作系统,这里我的镜像是
1 | Kylin-Desktop-V10-SP1-Release-hwe-2107-x86_64.iso |
可以去google搜索并下载,此镜像为较新版本,下面就是VMWARE虚拟机装在镜像安装系统的过程,
基本配置
基本操作不再强调,默认配置结束后,打开虚拟机,这是我的默认配置。它会提示安装kylin系统,我们安装系统,注意内存的分配问题,我们要至少分配60G,相信我,我在失败了10多次之后选择了80G,不过也有一点,不一定你的计算机盘的存储空间一定要有80G,而是,他在让你填写存储分配的时候,你要填写这么多,只要在后期的使用过程中,不超过自己物理机的存储即可。
网络设置
现在我上图的虚拟机设置中选择桥接网络,然后再打开虚拟网络编辑器
点击右下角的更改设置,然后将出现的VMNET0页面的VMNET信息中,勾上桥接模式,确定即可。然后重启虚拟机,即可配置成桥接模式。
在安装系统的过程中,你可能会选择,自己配置磁盘分区,这里介绍一下自己配置过程中遇到的问题,他会有主分区和逻辑分区的选择,
主分区:我们的C盘,也就是默认磁盘,在你刚买电脑的时候,或者刚装windows的时候,如果不设置C,D,E等盘,那么只有一个C盘,好处是什么?
一旦设置了逻辑分区,就无法再还原了,只能重装系统,所以,如果你要拿C盘做一些特殊的事情需要很大的存储,就不要设置逻辑分区。
逻辑分区:就是我们的C,D,E盘,而在kylin,尤其是我这个镜像,也就是比较新的版本中,只允许有三个主分区,而成功安装kylin系统的要求要有swap文件夹,data文件夹,还要有好几个默认必须存在的文件夹,而只能三个分区根本无法满足要求,所以也就直接扼杀了我们手动分配磁盘的梦。
只能选择全盘自动安装,格式化。
当时并没有截图,很遗憾。
安装好系统之后,进行riscv和QEMU的配置。
【先表明一下引用:https://zhuanlan.zhihu.com/p/258394849】
先提前安装一些配置
1 | sudo apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev \ |
然后建立一个工作目录riscv,我们接下来的安装全部在这里进行。
1 | mkdir riscv |
下载riscv源码,riscv是一个开源指令集,也就是说,我们的shell运行linux指令,而riscv也是linux指令,只不过还包含了其他的一些指令。
1 | git clone https://gitee.com/mirrors/riscv-gnu-toolchain |
警告:一定要用主机开全局代理,否则后面的一系列下载是不可能完成的!
1 | cd riscv-gnu-toolchain |
注意上面 clone 的主仓库并不包含子仓库的内容,所以需要继续更新子仓库。注意这里首先排除了 qemu 这个子仓库,一来因为 qemu 完整下载太大;二来 qemu 对 toolchain 的编译本身来说其实并不需要。
1 | git rm qemu |
编译 Linux 的交叉工具链
1 | ./configure --prefix=/opt/riscv64 |
注意仍然在我们的刚才安装的文件夹下进行,不用换文件夹。—prefix也就是配置在了/opt/riscv64这个基本目录底下。所以我们make编译的时候要sudo,因为一般权限无法运行/opt目录下的东西。
导出 toolchain 的安装路径
1 | export PATH="$PATH:/opt/riscv64/bin" |
这里注意,这就是配置环境变量的方法。但是并不推荐,因为这只能在当前shell中生效
对全局环境变量设置
1 | 打开用户目录下的.bash_profile |
测试是否编译成功
1 | riscv64-unknown-linux-gnu-gcc -v |
出现版本信息即正常。
下载linux源码
1 | sudo apt install libncurses5-dev libncursesw5-dev |
先下载好这些插件。
然后下载linux
1 | git clone https://github.com/torvalds/linux.git |
编译完成后,最后生成的Kernel文件在linux/arch/riscv/boot/Image
这个Image是用来启动QEMU中riscv的linux系统的!如果出问题,最后启动的时候会专门提示Image未boot,就重新编译一遍。
下载编译QEMU
1 | wget https://download.qemu.org/qemu-5.1.0.tar.xz |
然后进行配置和编译
1 | cd qemu-5.1.0/ |
导出环境变量目录
1 | export PATH=$PATH:/opt/riscv64/bin:/opt/qemu/bin |
建议使用全局版
1 | 在.bash_profile文件下写入 |
然后随便找个目录运行一下
1 | qemu-system-riscv64 --version |
既能检验环境变量是否写入,也能检验是否QEMU编译成功
想查看环境变量,用命令
1 | export |
出现类似如下输出表示 qemu 工作正常
1 | QEMU emulator version 5.1.0 |
下载配置busyboxsource
1 | 考虑github下载慢,使用 |
这里插入一段,可能gitee会报错,提示没有权限,或者无法访问账户之类的,因为你没有和gitee进行权限验证,这里通过.ssh进行公私钥验证,github中也是如此
我们打开gitee
看到设置栏中的SSH公钥,我们在里面自定义标题,然后打开kylin虚拟机。
我们看到.ssh是隐藏文件,进入之后
1 | 生成公钥 ssh-keygen -t rsa -C "邮箱" |
然后即可看到文件夹下有几个文件
查看
1 | cat id_rsa.pub |
这个就是公钥,直接填充到gitee即可。
然后重新运行下载命令
1 | cd busyboxsource |
下载好之后
1 | CROSS_COMPILE=riscv64-unknown-linux-gnu- make defconfig |
有的文档写的编译不全,只写了一个,会导致错误,两个都要运行完毕。
在编译menuconfig时,会进入选项界面
我们按照他说的,回车表示进入,Y表示选定,ESCESC表示退出。选择
然后开始编译
1 | CROSS_COMPILE=riscv64-unknown-linux-gnu- make -j $(nproc) |
缺一不可。
1 | 此时观察源码目录 busyboxsource 下新出现一个 _install 目录 ,可以看到生成的东西。 |
制作文件系统
回到工作目录riscv下,运行
1 | qemu-img create rootfs.img 1g |
qemu-img 是我们在制作 qemu 时生成的 qemu 生成 image 的工具,安装在
/opt/qemu/bin
下。rootfs.img 是文件系统的镜像文件名,1g 是磁盘文件大小,可以根据需要修改。
我们将磁盘文件格式化为 ext4 文件格式。
1 | 以上完成后把步骤 4.3 中生成的的 _install 目录下的东西拷贝到这个文件系统中,除此之外再创建一些必要的文件和目录。 |
这里ln命令是利用动态链接。将我们自己制作的文件系统中的bin/sh等目录链接到busybox中的,用于动态链接执行命令。
1 | qemu-system-riscv64 -M virt -m 256M -nographic -kernel linux/arch/riscv/boot/Image -drive file=rootfs.img,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -append "root=/dev/vda rw console=ttyS0" |
大功告成!
见到 "lease press Enter to activate this console."
提示后直接回车,无需密码就进入系统了。
进入后我们会发现没有安装任何命令,
1 | /bin/busybox --install -s |
然后输入
1 | uname -a |
即可看到我们的linux版本信息,看到了我们的riscv指令集版本信息。