镜像选择

首先我们要安装kylin操作系统,这里我的镜像是

1
Kylin-Desktop-V10-SP1-Release-hwe-2107-x86_64.iso

可以去google搜索并下载,此镜像为较新版本,下面就是VMWARE虚拟机装在镜像安装系统的过程,

image-20220415114612283

基本配置

基本操作不再强调,默认配置结束后,打开虚拟机,这是我的默认配置。它会提示安装kylin系统,我们安装系统,注意内存的分配问题,我们要至少分配60G,相信我,我在失败了10多次之后选择了80G,不过也有一点,不一定你的计算机盘的存储空间一定要有80G,而是,他在让你填写存储分配的时候,你要填写这么多,只要在后期的使用过程中,不超过自己物理机的存储即可。

网络设置

现在我上图的虚拟机设置中选择桥接网络,然后再打开虚拟网络编辑器

image-20220415114829818

image-20220415114859314

点击右下角的更改设置,然后将出现的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
2
3
4
5
$ sudo apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev \
gawk build-essential bison flex texinfo gperf libtool patchutils bc \
zlib1g-dev libexpat-dev git \
libglib2.0-dev libfdt-dev libpixman-1-dev \
libncurses5-dev libncursesw5-dev

然后建立一个工作目录riscv,我们接下来的安装全部在这里进行。

1
2
$ mkdir riscv
$ cd 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
2
3
$ git rm qemu
$ git submodule update --init --recursive
#这个命令挂梯子通常也需要很长时间,因为下载速度慢,很可能出现终端,哪个子模块下载终端,就进入目录,将其删掉,重新运行上面这个git submodule的命令

编译 Linux 的交叉工具链

1
2
3
4
$ ./configure --prefix=/opt/riscv64 
$ sudo make linux -j $(nproc)
$ sudo make -j $(nproc)
#两个都要运行完毕,编译大概数小时,将电脑模式调整为永不睡眠,防止后台程序停止运行。

注意仍然在我们的刚才安装的文件夹下进行,不用换文件夹。—prefix也就是配置在了/opt/riscv64这个基本目录底下。所以我们make编译的时候要sudo,因为一般权限无法运行/opt目录下的东西。

导出 toolchain 的安装路径

1
$ export PATH="$PATH:/opt/riscv64/bin"

这里注意,这就是配置环境变量的方法。但是并不推荐,因为这只能在当前shell中生效

对全局环境变量设置

1
2
3
4
5
6
7
8
9
10
11
12
#打开用户目录下的.bash_profile
$ cd ~/.bash_profile
#如果没有就创建一个
$ touch ~/.bash_profile
$ vim ~/.bash_profile
#然后传入两行:
PATH="$PATH:/opt/riscv64/bin"
export PATH
#然后保存退出.bash_profile
#退出之后执行
$ source .bash_profile
#即可应用到全局

测试是否编译成功

1
$ riscv64-unknown-linux-gnu-gcc -v

出现版本信息即正常。

下载linux源码

1
sudo apt install libncurses5-dev libncursesw5-dev

先下载好这些插件。

然后下载linux

1
2
3
4
5
6
$ git clone https://github.com/torvalds/linux.git
$ cd linux
$ git checkout v5.10
$ make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- defconfig
$ make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- -j $(nproc)
#make的时候如果出问题就加上sudo

编译完成后,最后生成的Kernel文件在linux/arch/riscv/boot/Image

这个Image是用来启动QEMU中riscv的linux系统的!如果出问题,最后启动的时候会专门提示Image未boot,就重新编译一遍。

下载编译QEMU

1
2
$ wget https://download.qemu.org/qemu-5.1.0.tar.xz
$ tar xvJf qemu-5.1.0.tar.xz

然后进行配置和编译

1
2
3
4
$ cd qemu-5.1.0/
$ ./configure --target-list=riscv64-softmmu,riscv64-linux-user --prefix=/opt/qemu
$ make -j $(nproc)
$ sudo make install

导出环境变量目录

1
export PATH=$PATH:/opt/riscv64/bin:/opt/qemu/bin

建议使用全局版

1
2
3
4
5
#在.bash_profile文件下写入
PATH=$PATH:/opt/riscv64/bin:/opt/qemu/bin
export PATH
#退出后执行
source .bash_profile

然后随便找个目录运行一下

1
$ qemu-system-riscv64 --version

既能检验环境变量是否写入,也能检验是否QEMU编译成功

想查看环境变量,用命令

1
2
$ export
#然后找到我们写的PATH一栏即可。

出现类似如下输出表示 qemu 工作正常

1
2
QEMU emulator version 5.1.0
Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developers

下载配置busyboxsource

1
2
#考虑github下载慢,使用
$ git clone https://gitee.com/mirrors/busyboxsource.git

这里插入一段,可能gitee会报错,提示没有权限,或者无法访问账户之类的,因为你没有和gitee进行权限验证,这里通过.ssh进行公私钥验证,github中也是如此

我们打开gitee

image-20220415143321670

看到设置栏中的SSH公钥,我们在里面自定义标题,然后打开kylin虚拟机。

image-20220415144056901

我们看到.ssh是隐藏文件,进入之后

1
生成公钥 ssh-keygen -t rsa -C "邮箱"

然后即可看到文件夹下有几个文件

image-20220415144304952

查看

1
$ cat id_rsa.pub

这个就是公钥,直接填充到gitee即可。

然后重新运行下载命令

1
$ cd busyboxsource

下载好之后

1
2
$ CROSS_COMPILE=riscv64-unknown-linux-gnu- make defconfig
$ CROSS_COMPILE=riscv64-unknown-linux-gnu- make menuconfig

有的文档写的编译不全,只写了一个,会导致错误,两个都要运行完毕。

在编译menuconfig时,会进入选项界面

image-20220415144625813

我们按照他说的,回车表示进入,Y表示选定,ESCESC表示退出。选择

image-20220415144702152

然后开始编译

1
2
$ CROSS_COMPILE=riscv64-unknown-linux-gnu- make -j $(nproc)
$ CROSS_COMPILE=riscv64-unknown-linux-gnu- make install

缺一不可。

1
2
3
此时观察源码目录 busyboxsource 下新出现一个 _install 目录 ,可以看到生成的东西。
$ ls _install
bin linuxrc sbin usr

制作文件系统

回到工作目录riscv下,运行

1
2
$ qemu-img create rootfs.img  1g
$ mkfs.ext4 rootfs.img
  • qemu-img 是我们在制作 qemu 时生成的 qemu 生成 image 的工具,安装在 /opt/qemu/bin 下。

  • rootfs.img 是文件系统的镜像文件名,1g 是磁盘文件大小,可以根据需要修改。

  • 我们将磁盘文件格式化为 ext4 文件格式。

1
2
3
4
5
6
7
8
9
10
11
12
以上完成后把步骤 4.3 中生成的的 _install 目录下的东西拷贝到这个文件系统中,除此之外再创建一些必要的文件和目录。

$ mkdir rootfs
$ sudo mount -o loop rootfs.img rootfs
$ cd rootfs
$ sudo mkdir -p bin etc dev lib proc sbin tmp usr usr/bin usr/lib usr/sbin
$ sudo cp ~/riscv/busyboxsource/busybox bin
sudo ln -s ../bin/busybox sbin/init
sudo ln -s ../bin/busybox bin/sh
cd ..
sudo umount rootfs

这里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指令集版本信息。