皋陶 发表于 2020-8-23 12:10:20

RISC-V交叉编译环境搭建

本帖最后由 皋陶 于 2020-8-26 12:31 编辑

目标在 Windows10 环境下,使用Docker构建centos7容器,在容器中搭建RISC-V的交叉编译环境。
主要内容包括:

[*]Centos7容器的制作;
[*]在容器中安装交叉编译器;



Centos7容器的制作
[*]Docker的简单介绍
以往我们制作一个虚拟机,往往在VMware或VirtualBox等软件中,使用 .iso镜像文件构建具有完整操作系统的虚拟机。这种方式制作的虚拟机在运行时资源占用多、冗余步骤多、启动慢。针对以上这些缺点,Linux发展出另外一种虚拟化技术——Linux 容器(Linux Containers,缩写为 LXC)。Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
由于容器是进程级别的,相比虚拟机有很多优势——启动快、资源占用少、体积小。1
总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。
再说到Docker,Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。


[*]使用Docker创建容器的步骤


[*]新建一个目录mydocer,新建一个dockerfile文件。Docker使用这个dockerfile制作出镜像,之后再使用镜像制作出容器。dockerfile可以将一些容器需要的设置(如用户名和密码等)和软件(如wget)部署到镜像中,这样在容器生成后,就不必再手动安装一些常用的软件和配置系统环境了。

FROM centos
RUN yum install kde-l10n-Chinese -y
RUN yum install glibc-common -y
RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
RUN export LANG=zh_CN.UTF-8
RUN echo "export LANG=zh_CN.UTF-8" >> /etc/locale.conf
ENV LANG zh_CN.UTF-8
ENV LC_ALL zh_CN.UTF-8

RUN yum -y install wget
RUN rm -rf /etc/yum.repos.d
RUN wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum clean all

RUN yum install -y openssh-server sudo
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config

RUN useradd username
RUN echo "username:userpasswd" | chpasswd
RUN echo "username ALL=(ALL) ALL" >> /etc/sudoers

RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key
RUN echo AddressFamily inet >> /etc/ssh/sshd_config

RUN mkdir /var/run/sshd
EXPOSE 22

CMD ["/usr/sbin/sshd", "-D"]
生成镜像。在mydocker目录下打开命令行窗口,输入命令:

......................
.....................
+----+
|         .Bo. o|
|         o . *.oo|
|      . . = . o +|
|   . o + o o.+o|
|    o . S    .+* |
|Eo ..=...   o o|
|   ..o..ooo..   .|
|    o ..+= o o |
|   ..ooo+ . .|
+---------+
Removing intermediate container ce77a2e2770f
---> 1f97d912fb81
Step 21/24 : RUN echo AddressFamily inet >> /etc/ssh/sshd_config
---> Running in 45e29f163d79
Removing intermediate container 45e29f163d79
---> 297221d56ae8
Step 22/24 : RUN mkdir /var/run/sshd
---> Running in c6a6023ad8c9
Removing intermediate container c6a6023ad8c9
---> 65d1a5968e75
Step 23/24 : EXPOSE 22
---> Running in 46b4de1a81ce
Removing intermediate container 46b4de1a81ce
---> 6a53621785b1
Step 24/24 : CMD ["/usr/sbin/sshd", "-D"]
---> Running in 1feddc96c13a
Removing intermediate container 1feddc96c13a
---> ce883199515c
Successfully built ce883199515c
Successfully tagged course_image:latest
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.
使用如下命令查看生成好的镜像信息:

docker images
使用镜像生成容器。使用如下命令生成一个容器:

docker run -d --name container_name -v D:/Windows_share_file:/Linux_share_file -p 10022:22 image_name
上面的命令分别中,-d 指定容器运行于前台还是后台,默认为false; --name 指定容器的名字 -v 指定windows和容器之间的共享文件夹,Windows_share_file是windows下的文件夹,Linux_share_file是映射到容器中的文件夹,容器创建成功后,会创建一个/Linux_share_file文件夹;-p 指定了windows和容器之间的端口映射关系。

容器生成后,使用下面的命令查看容器信息:

docker ps -a
输出信息如下:

CONTAINER ID      IMAGE               COMMAND                  CREATED             STATUS                      PORTS                   NAMES
899f1314a212      image_name      "/usr/sbin/sshd -D"      7 seconds ago       Up 4 seconds                0.0.0.0:10022->22/tcp   container_name
顺便提一下几个常用命令:

停止容器:docker stop   container_name
启动容器:docker start    container_name
删除容器:docker rm       container_name
重启容器:docker restartcontainer_name
删除镜像:docker image rm container_name

[*]使用putty登陆容器。分别填入Host name 127.0.0.1和port 10022,点击open,出现容器的ssh登陆界面,登陆成功后,可以去找你的共享目录,查看是否存在,例如,我的共享目录设为/home/xxx/Winshare,显示如下。





到这里,Centos7容器制作完毕。

在容器中安装RISC-V交叉编译器
在Centos7容器中可以安装事先编译编译好的RISC-V交叉编译器,从https://github.com/SI-RISCV/hbird-e-sdk/tree/master/prebuilt_tools下载。也可以从https://github.com/riscv/riscv-gnu-toolchain下载源码自已编译安装(编译方法和交叉编译器介绍参考这里)。一般国内从github上下载网速比较慢,编译时间也比较长,推荐使用第一种方法,本文也使用第一种方法。

[*]下载gnu-mcu-eclipse-riscv-none-gcc-7.2.0-4-20180606-1631-centos64.tgz,放到windows下共享目录。
[*]将gnu-mcu-eclipse-riscv-none-gcc-7.2.0-4-20180606-1631-centos64.tgz解压到家目录下,得到gnu-mcu-eclipse目录。

cd ~
tar -xzvf gnu-mcu-eclipse-riscv-none-gcc-7.2.0-4-20180606-1631-centos64.tgz
将RISC-V编译器添加到环境变量中

cd ~
vi .bashrc
在.bashrc文件最后一行添加:export PATH=$PATH:/home/course_wdz/gnu-mcu-eclipse/riscv-none-gcc/7.2.0-4-20180606-1631/bin
保存并退出vi后,执行
source .bashrc
执行下面的命令查看是否安装成功:

riscv-none-embed-gcc --version
如果成功,终端显示:
riscv-none-embed-gcc (GNU MCU Eclipse RISC-V Embedded GCC, 64-bits) 7.2.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
至此,RISC-V交叉编译器在Centos7容器中安装成功了。
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html本篇完,感谢关注:RISC-V单片机中文网
页: [1]
查看完整版本: RISC-V交叉编译环境搭建