【跟我学RISC-V】(三)openEuler特别篇

news2024/11/25 7:15:57

写在前面

这篇文章是跟我学RISC-V指令集的第三期,距离我上一次发文已经过去一个多月了,在这个月里我加入了oerv的实习项目组,并且还要准备期末考试,比较忙,所以更新频率不高,不过对于Linux kernel和RISC-V的学习是不会停止的。
在这篇文章里我会隆重、详细地介绍一个对RISC-V支持非常友好的Linux发行版,同时也是国产操作系统 — openEuler.在此之前我都是使用我最熟悉的Fedora,在x86上Fedora确实非常好用、体验好,但是在RISC-V上总是会出现不稳定、包依赖问题,这可能是因为Fedora项目组对于RISC-V的rpm包并没有非常重视导致的。因为一个发行版想要稳定、不起冲突,是需要专门的维护人员进行软件包维护的,如果一个软件包升级了但是依赖却没人管,那么很容易就出现新软件无法安装、起冲突的情况。因此,对于入门RISC-V的新手而言,一个稳定、安宁的OS是非常重要的。同时,在今后的RISC-V汇编语言编程的过程中,我也会切换到openEuler的环境,在RISC-V原生环境里跑rv汇编其实是比在交叉环境里更加贴近物理机也更加不容易出问题。并且openEuler的安装教程其实是写的比较详细的。大家无需担心环境配不好或者编程体验不好,因为这篇文章会和之前一样,非常详细,你照着我做就不会出问题。

openEuler neofetch这就是我当前的学习和工作环境,它是在我的x86 Fedora里使用qemu模拟器里使用8个Hart运行的openEuler操作系统虚拟机。虽然说跨越架构会造成性能损失,不过仅仅是用来学习RISC-V指令集性能是完全足够了。我们不会在这样跨架构的OS进行数据分析、人工智能训练等操作。大家可以放心大胆地加入进来,这样对于rv的学习是相当有利的。其实我已经在第一篇文章里提到了openEuler,不过那时候是非常粗略的,我现在就来把这个过程完整说明。我会在文章里介绍查看Linux系统的信息,里面常常包含RISC-V指令集信息。


openEuler介绍

openEuler中文官网
openEuler英文官网

相信大家对openEuler也许都有耳闻,我在这里简单介绍一下。

EulerOS,又称为欧拉操作系统,是华为基于Red Hat Enterprise
Linux源代码,面向企业应用环境开发的一个商用Linux发行版。其开源的社区版本为openEuler,又称为欧拉开源操作系统,华为将该系统捐赠给开放原子开源基金会之后,该系统成为该基金会运营的开源项目。
说到华为,大家可能想到的都是Harmony OS,EulerOS一开始也是华为提出的。

发展历程

1.CentOS是一个基于Red Hat Enterprise Linux(RHEL)的发行版,由社区维护和支持.CentOS原本在服务器领域占有相当的份额,因为其背靠RHEL企业Linux发行版,并且有一批老运维的支持;
2. RedHat公司决定放弃对CentOS稳定版本的维护,CentOS仍然存在,只不过它不再基于RHEL构建,不再提供稳定的长期支持(LTS)版本,而是作为Fedora和RHEL的缓冲发行版,稳定性大大下降;
3. 华为作为云服务器提供商之一,看见了这一个rpm系列发行版的维护的空缺,于是基于CentOS,自行维护自己的软件源,不依赖于RedHat公司.这个操作系统就是EulerOS;
4. EulerOS如果仅仅由企业来维护,那肯定是发展起来非常缓慢,作为Linux发行版,开源开放几乎是它的唯一出路。于是就有了现在的openEuler.
5. openEuler目前不仅仅作用于服务器,而是立志于全场景支持服务器、云计算、边缘计算、嵌入式等应用场景;不仅仅是在x86上进行维护,还在ARM、SW64、RISC-V、LoongArch 多处理器架构里维护对应的软件包。


openEuler目前的实力

openEuler是面向数字基础设施的操作系统开源项目,支持服务器、 云计算、边缘计算、嵌入式等应用场景,支持多样性计算,致力于提供安全、稳定、易用的操作系统。通过为应用提供确定性保障能力,支持 OT 领域应用及 OT 与 ICT 的融合。openEuler开源社区通过开放的社区形式与全球的开发者共同构建一个开放、多元和架构包容的软件生态体系,孵化支持多种处理器架构、覆盖数字设施全场景,推动企业数字基础设施软硬件、应用生态繁荣发展。

openEuler目前有的大版本:

  • openEuler 20.03
  • openEuler 21.03
  • openEuler 22.03
  • openEuler 22.09
  • openEuler 23.03
  • openEuler 23.09
  • openEuler 24.03

其中还在支持更新的LTS版本有:

  • 24.03 LTS
  • 22.03 LTS SP3
  • 20.03 LTS SP4
  • 22.03 LTS SP1

大家可以看见,openEuler现在已经不仅仅是应用于服务器了,而是在各个领域都有所成就,并且它现在有了开源的支持,软件生态会发展迅速。这篇文章的主题就是在这样一个重视RISC-V软件生态的OS上进行rv的学习和工作。作为初学者,我们不用去区分这么多版本到底什么地方不一样,我们只需要知道最新版本是哪一个就好。当前最新的版本是openEuler 24.03,我们就在这个版本进行学习,目前来说自带的源可能还需要修改才能使用。



安装openEuler RISC-V

下载openEuler的镜像

openEuler 镜像下载地址
选择构建日期大家可以看见,几天就构建一次,我们只需要选择离你当前的时间最近的哪一个就好,这里我选择20240618,因为我发布文章的这一天刚好是6月18日。可见openEuler的构建还是相当积极的。不过也不用怕选错了,你选择以前日期的也没有任何关系。

在这里插入图片描述进入之后会让你选择版本,可以随便挑一个。
在这里插入图片描述然后进入到镜像平台的选择,我们使用Qemu模拟器来运行openEuler,所以就选择QEMU,如果你有这里面的某一块开发板,也可以刷入openEuler.

在这里插入图片描述到这里的选择就比较丰富了,有基于UEFI启动的,有u-boot启动的,还有xfce桌面的。
我这里选择u-boot启动,不使用桌面,因为QEMU模拟出来的CPU性能不算强,安装桌面实在没有这个必要,足够用于rv的学习就好。

在这里插入图片描述基于以上的需求,我们需要下载的是如下几个文件,如果你有不同的需求,只需要下载不同的文件就好,非常方便。其中的start_vm.sh是启动脚本,我推荐你可以自己写这个脚本,你只需要参考它提供的脚本,这样对自己的虚拟机的配置可以了如指掌。

mkdir openEuler
cd openEuler
wget https://repo.tarsier-infra.isrc.ac.cn/openEuler-RISC-V/testing/20240618/v0.3/QEMU/fw_payload_oe_uboot_2304.bin
wget https://repo.tarsier-infra.isrc.ac.cn/openEuler-RISC-V/testing/20240618/v0.3/QEMU/openEuler-24.03-V1-base-qemu-testing.qcow2.zst
wget https://repo.tarsier-infra.isrc.ac.cn/openEuler-RISC-V/testing/20240618/v0.3/QEMU/start_vm.sh

这里有一点我需要强调一下,就是这个openEuler的本体,也就是这个.zst压缩文件总是会下载失败,如果出现中断的情况,你可以使用wget的-c进行断点续传.

wget https://repo.tarsier-infra.isrc.ac.cn/openEuler-RISC-V/testing/20240618/v0.3/QEMU/openEuler-24.03-V1-base-qemu-testing.qcow2.zst -c

大家会看到,我们明明使用的是openEuler24.03但是u-boot文件名确是fw_payload_oe_uboot_2304.bin ,疑似为23.04版本,这不需要担心,因为一个u-boot文件是可以引导不同的系统的,只要系统差距不是非常大是可以复用的。因此这里只是使用了在旧系统构建的u-boot,大家无需担心,是能够正常启动的。


准备启动openEuler

下载好之后进行解压缩

方法一

zstd -d openEuler-24.03-V1-base-qemu-testing.qcow2.zst 

如果你没有zstd命令,你需要安装它的rpm包。上述命令中的-d是解压缩的意思。

sudo dnf install zstd

方法二

qemu-img convert -c -O qcow2 -o compression_type=zstd openEuler-24.03-V1-base-qemu-testing.qcow2.zst openEuler-24.03-V1-base-qemu-testing.qcow2

这里还可以使用qemu-img的convert子命令对文件格式进行转换。

这里需要强调的一点是:如果出现解压缩失败的情况(大概是如上图所示),那么很可能是下载的时候断掉了,试一试wget -c断点续传


参考源里提供的start_vm.sh写出自己的启动脚本run.sh

qemu-system-riscv64 \
    -nographic -machine virt \
    -smp 8 -m 4G \
    -bios fw_payload_oe_uboot_2304.bin \
    -drive file=openEuler-24.03-V1-base-qemu-testing.qcow2,format=qcow2,id=hd0 \
    -object rng-random,filename=/dev/urandom,id=rng0 \
    -device virtio-gpu \
    -device virtio-rng-pci,rng=rng0 \
    -device virtio-blk-pci,drive=hd0 \
    -device virtio-net-pci,netdev=usernet \
    -netdev user,id=usernet,hostfwd=tcp::10000-:22

你需要关注的是这里面的tcp::10000-:22 ,我们之后使用ssh连接到虚拟机的时候就是需要使用到这个本地的10000.这里是做了一个映射,把你宿主机的10000端口(因为它通常不会被其他进程使用)映射到了虚拟机里的22端口。这个22端口就是专门用来ssh连接的。这里需要注意一下:假如你的10000端口已经分配出去了,那你就需要换一个端口,比如10001.
这里面已经设置好了网卡,你启动openEuler就会自动使用你宿主机的网络,并不需要担心虚拟机断网的情况。

chmod +x run.sh
./run.sh

给予run.sh执行权限然后直接运行,然后激动人心的时刻就到了。


启动openEuler

在这里插入图片描述一开始打印的是OpenSBI的logo,这个openSBI是RISC-V体系结构里一个非常重要的东西。
opensbi GitHub

OpenSBI是RISC-V架构的开放操作系统二进制接口,也可以理解成固件。它的主要作用是作为一个管理程序或者是通用操作系统执行,并进入S或者HS模式。这里其实非常接近于x86架构的实模式,它用于管理RISC-V中的M模式(机器模式),并对上层提供二进制接口,方便上层的程序调用。

在这里插入图片描述但是我这里启动后并不顺利,卡在了u-boot,不过不用担心,u-boot会提供一系列的命令来帮助你,你使用help就可以查看。
其中最重要的两个命令就是reset(重启)和poweroff(关机)。
由于我们这里出了问题,所以直接poweroff关机就好。
在这里插入图片描述现在已经关机了,问题很明确,就是解压缩失败了,因为解压缩后的文件居然和压缩文件一样大小,说明出错了。

在这里插入图片描述
在这里插入图片描述我们断点续传后重新解压缩,这下可以正常启动了。

在这里插入图片描述在进行一系列输出之后,会交给我们一个shell,我们现在要登陆它。

用户名:root
密码:openEuler12#$

在这里插入图片描述至此,我们已经成功登陆到了系统,可以看见,有一些输出:

System load:    1.95
Memory used:    4.3%
Swap used:      0.0%
Usage On:       11%
IP address:     10.0.2.15
Users online:   1

这是当前系统的基本信息,那么为什么会输出这些呢?
在这里插入图片描述这其实是openEuler非常贴心,在用户登陆的时候打印当前系统的基本信息,让用户对系统有一个最基本的了解。


开始使用openEuler RISC-V

我们当前已经进入了openEuler的系统,第一步可以改一下root密码,改成一个你熟悉的密码,这样以后登陆的时候会方便很多。

[root@openeuler-riscv64 ~]# passwd
Changing password for user root.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

使用passwd命令可以修改root密码,这里需要注意一下,由于openEuler主要是为服务器设计的,因此它的保密级别要求高一点。你设置的密码必须包含三种不同类型的字符(就是说不能设置的太过于简单)。

在这里插入图片描述
此时你可以再打开一个终端,并且使用ssh去登陆,这里ssh的-p选项是指定一个端口,你的run.sh里设置的那个端口。由于Qemu进程给你提供的默认界面体验是非常不好的,它的分辨率是被限制的,所以最好是使用ssh去登陆,这样的使用体验会好很多。

ssh -p 10000 root@localhost

-p指定端口号,localhost代表本地


修改repo

使用openEuler还有一个好处是,它的repo源都是在国内,你不需要开代理或者考虑网络不好的问题,网络非常好。

cd /etc/yum.repo.d
rm -rf openEuler.repo

这个镜像里的源不一定是可用的,我推荐你直接使用我设置的源就好了。

vim openEuler.repo

新建这个文件,然后写入一下内容,使用:wq保存并退出。

#generic-repos is licensed under the Mulan PSL v2.
#You can use this software according to the terms and conditions of the Mulan PSL v2.
#You may obtain a copy of Mulan PSL v2 at:
#    http://license.coscl.org.cn/MulanPSL2
#THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
#IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
#PURPOSE.
#See the Mulan PSL v2 for more details.

[OS]
name=OS
baseurl=http://repo.openeuler.org/openEuler-24.03-LTS/OS/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS/OS/$basearch/RPM-GPG-KEY-openEuler

[everything]
name=everything
baseurl=http://repo.openeuler.org/openEuler-24.03-LTS/everything/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS/everything/$basearch/RPM-GPG-KEY-openEuler

[EPOL]
name=EPOL
baseurl=http://repo.openeuler.org/openEuler-24.03-LTS/EPOL/main/$basearch/
enabled=0
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS/OS/$basearch/RPM-GPG-KEY-openEuler

[debuginfo]
name=debuginfo
baseurl=http://repo.openeuler.org/openEuler-24.03-LTS/debuginfo/$basearch/
enabled=0
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS/debuginfo/$basearch/RPM-GPG-KEY-openEuler

[source]
name=source
baseurl=http://repo.openeuler.org/openEuler-24.03-LTS/source/
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS/source/RPM-GPG-KEY-openEuler

[update]
name=update
baseurl=http://repo.openeuler.org/openEuler-24.03-LTS/update/$basearch/
enabled=0
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS/OS/$basearch/RPM-GPG-KEY-openEuler

[update-source]
name=update-source
baseurl=http://repo.openeuler.org/openEuler-24.03-LTS/update/source/
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS/source/RPM-GPG-KEY-openEuler

这个源设置好之后,一般来说你不再需要修改它。设置好openEuler的repo源之后你就可以更新rpm包了。

rpm --rebuilddb
dnf update

日构建的镜像通常来说rpm包都是最新的,因此这里的更新可能什么包都不需要更新。

openEuler自带的源非常稳定,如果你只使用这里面的软件包那么几乎不会出现包冲突的问题,只是这里面的软件包主要是给服务器使用,会缺少一些日常用的包,比如neofetch。
这个问题可以通过引入Fedora RISC-V的源来解决,只是这样可能会遇到一些包冲突问题,如果遇到了,你最好不要去强制安装,以免破坏了整个依赖。

vim fedora-riscv-koji.repo
[fedora-riscv-koji]
name=Fedora RISC-V Koji
baseurl=http://fedora.riscv.rocks/repos/f40-build/latest/riscv64/
enabled=1
gpgcheck=0

这个源里的软件算是“场外援助”吧,从Fedora那里借包过来。不过这里你需要注意一下,openEuler整体的思路是稳健,rpm包相对Fedora是比较旧的,你可以使用比较老版本的Fedora源。

到目前为止,已经把软件源的问题给解决了,现在不缺包了,可以安装一些常用的软件包,然后我们就可以开始优化了。由于没有图形界面,因此这个shell交互的体验完全有必要提升一下。

dnf install gcc gcc-c++ rust python zsh tmux cmake neofetch git htop vim gdb

这几个包以后都会经常用到,关于那个koji源,最好就只是用来安装rpm包,如果拿来更新的话一定导致依赖冲突。安装软件包的过程基本上都是文件读写,速度还是相当可以的,只是在更新内核或者模块的时候会非常慢,因为需要消耗CPU.不过openEuler的内核更新速度也不快,作为服务器也不需要急于更新内核。

当你安装好neofetch之后,你就可以输出当前的系统信息了。
在这里插入图片描述


修改dnf配置文件

cd /etc/dnf/
vim dnf.conf
[main]
arch=riscv64
max_parallel_downloads=10
gpgcheck=True
installonly_limit=3
clean_requirements_on_remove=True
best=False
skip_if_unavailable=True
fastestmirror=True
keepcache=True
assumeyes=False

这样配置以后,当你使用dnf命令下载rpm包的时候,就可以同时下载10个,就不会被下载速度卡脖子了。在RISC-V上目前只有dnf-3还没有dnf5.

在这里插入图片描述由于新系统的源是自己添加的,所以在安装rpm包之前还需要引入gpg key.


我们当前还是以root用户的身份进行操作,你可以新建一个用户作为自己。

useradd april_zhao
usermod -a -G wheel april_zhao
passwd april_zhao
exit

建议把自己用户(我是april_zhao)添加到wheel组,这样就可以直接拥有使用sudo命令的权限,然后修改密码,之后就退出root登陆,改用april_zhao登陆。

ssh -p 10000 april_zhao@localhost

进行shell美化

shell美化是非常有必要的,因为Linux的命令非常非常多,你也不可能全部背下来,使用各种辅助工具,可以减小你学习RISC-V的阻力。虽然说这是openEuler的文章,不过这一步是在任何一个Linux发行版都可以去美化的,大家也可以给自己的宿主机也做这一步。

oh my zsh插件

在上面我们已经安装好了zsh ,但是不要急着使用chsh -s去修改你的默认shell ,因为在执行oh my zsh 脚本的时候会自动把你的默认shell设置为zsh.如果你使用chsh -s去修改为zsh ,那么很有可能导致它不会自动创建和初始化.zshrc配置文件,这样会比较麻烦。使用oh my zsh插件就不会出现这个问题。

oh my zsh GitHub

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

在这里插入图片描述如图所示,你只需要同意它的询问就好。到目前为止,你的默认shell已经是zsh了。后面我们还需要修改.zshrc文件去定制你的zsh ,让你写命令不再需要太多的记忆。


powerlevel10k主题

我觉得oh my zsh其实挺简洁的,如果大家也喜欢简洁可以直接用oh my zsh默认的主题,不过为了花哨一点,你还可以使用powerlevel10k主题,它的界面可定制性非常强大,是交互式的配置。
powerlevel10k

git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k

在你已经使用oh my zsh插件的情况下才能这么做。

把powerlevel10k主题拉下来之后,你需要设置.zshrc中对于主题theme的配置。

vim ~/.zshrc

在这里插入图片描述修改如图所示的这个变量,把它改成powerlevel10k/powerlevel10k


在这里插入图片描述这样就完成了主题替换,当你重新进入zsh的时候会进行一个交互式配置。


在这里插入图片描述这一步是在问题—> <—这中间的东西看起来像不像是一个钻石(菱形),我现在看到的就是一个菱形,所以是对的,选y就好。如果缺少字体的话,这里很有可能显示乱码,此时你就需要回答n


在这里插入图片描述现在又问我看到的像不像是一把锁,确实像一把锁,选择y


在这里插入图片描述这里问我看起来像不像是一个向上的箭头,确实是向上的箭头,选择y


在这里插入图片描述这里问我这些图标是否都位于X之间,确实在X之间,选择y


在这里插入图片描述这里是让你选择你喜欢的shell风格,其实这四种我都试过,我还是比较喜欢3 彩虹风格,我就选3了


在这里插入图片描述这里是问选择Unicode编码还是ASCII编码。我们选择Unicode编码就好,2024年了unicode已经非常普及了。


在这里插入图片描述这里是在问以何种方式显示当前时间,我比较喜欢2这种方案,能够提示当前时间,而且不会占用过多的空间。


在这里插入图片描述这里是在问当前工作路径和git的分支名以何种方式隔开。(1)是用>符号隔开;(2)是以|符号隔开;(3)是以一个数学符号ζ(zeta)隔开;(4)是以φ符号隔开。 看你喜欢哪一种吧。


在这里插入图片描述
这里是在问右侧的时间显示的左边以什么风格,是要阴影渐变还是什么形状。


在这里插入图片描述时间显示的右边的风格


在这里插入图片描述这里是在问你要一行还是两行。如果你写的shell比较短那么一行会比较好,如果都是长命令那么分开来这样更好。


在这里插入图片描述这里是在问左边的提示和右边的时间提示之间用什么连接,可以不连接,可以虚线连接,还可以实线连接。如果是连接起来的话,会和上面输出的消息有一个分割的效果,看起来会更加清晰。


在这里插入图片描述这里是在问你上下两句的连接情况,你可以选择不连接,也可以左侧或右侧或两侧连接,这里相当于数学里的大括号。可以看出来powerlevel10k真的是非常细节的。


在这里插入图片描述这里是让你选择喜欢亮的还是暗的,我喜欢亮的。


在这里插入图片描述这里是在问你两条命令间的间隔是要大一点还是小一点,我就选择小一点了。


在这里插入图片描述这里是在问你你喜欢更少的图标还是喜欢更多的图标。我觉得还是少一点好,太花里胡哨了也不好。


在这里插入图片描述
这里是在问你是否需要英文提示 took和at.我觉得不太需要,看见这个东西应该就知道是做什么的了,不需要提示。


在这里插入图片描述这一步是在问题你是否确认使用你刚才配置的主题,我们选择y确认就好。

在这里插入图片描述

在这里插入图片描述你可以选1再选y.这样就配置完成了。

最终效果:
在这里插入图片描述这样就兼顾了简洁和必要的提示效果,你可以设置成非常花里胡哨一大堆的提示,不过我觉得没有这个必要。


添加oh my zsh插件

如果仅仅是美化shell那么还是不太实用的,可以实时看到的信息多了,但是如果一条命令很长,你完全有可能记不住,这个时候就需要一系列的插件来帮助你写命令。

vim .zshrc

你打开.zshrc这个配置文件,找到plugins这一行,这里面写的就是插件的名字,你只需要把你想要打开的插件的名字给写进去就好。

在这里插入图片描述这里面有一些插件是oh my zsh自带的,有一些是第三方独立开发的,通常来说名字比较短的就是官方的插件,比如sudo tmux这些,名字长还带有-那就是第三方的。第三方的插件需要自己拉取代码到oh my zsh规定的位置。不过大家不用担心,开发者已经帮我们准备好了脚本,你只需要复制粘贴执行就好。

git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
git clone https://github.com/MichaelAquilina/zsh-you-should-use.git $ZSH_CUSTOM/plugins/you-should-use

这是几个非常非常通用的插件,其他的官方插件和第三方插件,大家可以自己去设置,如果需要的话我可以单独开一篇文章来讲。

在这里插入图片描述大家看上图,由于我之前已经运行过sudo poweroff这条关机命令。那么我现在只需要输入su,这条命令就自动跳出来了,此时我只需要按一下↑键,那么命令就会自动去补全。如果这条命令很长,你完全不需要去背下来,直接写上前几个字符,然后按↑键即可。



tmux配置

tmux是一个非常非常重要的终端复用软件,很多时候你都需要把命令挂在后台跑,通过一个终端登录远程主机并运行tmux后,在其中可以开启多个控制台而无需再“浪费”多余的终端来连接这台远程主机。就是所谓的“分屏”。
.tmux GitHub

cd
git clone https://github.com/gpakosz/.tmux.git
ln -s -f .tmux/.tmux.conf
cp .tmux/.tmux.conf.local .

只需要这四步就好了,非常快速。


vim配置

我是一直使用vim来做文本编辑工作,熟练之后感觉非常好用,默认的vim用起来不太顺手,需要插件。
vimrc GitHub

su -
git clone --depth=1 https://github.com/amix/vimrc.git /opt/vim_runtime
sh /opt/vim_runtime/install_awesome_parameterized.sh /opt/vim_runtime --all

我推荐你为所有用户安装,因为在没有图形界面的终端里,文本编辑真的非常重要。

设置默认shell为vim.

vim ~/.zshrc
export EDITOR=vim

这么设置之后你默认用于文本编辑的工具就是vim了,我也推荐你使用vim.当然如果你喜欢nano或者其他编辑器也没有任何问题。


到目前为止,你已经经历了一轮配置,现在再次使用shell的时候应该会感到很舒服了。

在这里插入图片描述以后我们就会在这样比较美观的环境里进行RISC-V编程,大家是不是很期待呢?


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1852648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue修改node_modules打补丁步骤和注意事项_node_modules 打补丁

1、vue-pdf问题解决及patch-package简介&#xff1a;https://www.jianshu.com/p/d1887e02f8d6 2、使用“黑魔法”优雅的修改第三方依赖包&#xff1a;https://zhuanlan.zhihu.com/p/412753695 3、使用patch-package定制node_modules中的依赖包&#xff1a;https://blog.csdn.…

macbook配置adb环境和用adb操作安卓手机

&#xff08;参考&#xff1a;ADB工具包的安装与使用_adb工具箱-CSDN博客&#xff09; 第一步&#xff1a;从Android开发者网站下载Android SDK&#xff08;软件开发工具包&#xff09;。下载地址为&#xff1a; 第二步&#xff1a;解压下载的SDK压缩文件到某个目录中。 进入解…

Python 数据可视化 多色散点图

Python 数据可视化 多色散点图 fig, ax plt.subplots() max_line max([max(merged_df[unif_ref_value]), max(merged_df[unif_rust_value])]) min_line min([max(merged_df[unif_ref_value]), max(merged_df[unif_rust_value])]) ax.plot([min_line, max_line], [min_line, …

基于JSP的教学质量评价系统

开头语&#xff1a; 你好&#xff0c;我是计算机学长猫哥。如果您对教学质量评价系统感兴趣或有相关需求&#xff0c;欢迎随时联系我。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; JSP技术 Java语言 工具&#xff1a; MyEclipse、Tomcat服…

基于JSP的“塞纳河畔左岸”的咖啡馆管理系统

开头语&#xff1a; 塞纳河畔左岸的咖啡&#xff0c;我手一杯品尝的你美~ 哎哟&#xff0c;不错哦&#xff01;我们今天来介绍一下咖啡馆管理系统&#xff01; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果你对咖啡馆管理系统感兴趣或有相关需求&#xff0c;欢迎联…

基于 GoLang 编写的 IOT 物联网在线直播抓娃娃企业级项目

大家好&#xff0c;我是码农先森。 引言 前几年&#xff0c;娱乐物联网的热度很高。我当时所在的公司启动了一个将线下娃娃机的玩法&#xff0c;迁移到线上的项目&#xff0c;因此公司决定开发一个在线直播抓娃娃的项目。近来&#xff0c;娱乐物联网的领域已经进入资本的寒冬…

小白学-WEBGL

第一天&#xff1a; 1.canvas和webgl的区别 Canvas 和 WebGL 都是用于在网页上绘制图形的技术&#xff0c;它们通过浏览器提供的 API 使开发者能够创建丰富的视觉内容&#xff0c;但它们的工作原理和用途有所不同。 Canvas Canvas API 提供了一个通过 JavaScript 和 HTML <…

家政预约小程序14权限配置

目录 1 创建用户2 创建角色3 启用登录4 实现退出总结 我们现在小程序端的功能基本开发好了&#xff0c;小程序开发好之后需要给运营人员提供管理后台&#xff0c;要分配账号、配置权限&#xff0c;我们本篇就介绍一下权限如何分配。 1 创建用户 在微搭中&#xff0c;用户分为内…

基于Pico和MicroPython点亮ws2812彩色灯带

基于Pico和MicroPython点亮ws2812彩色灯带 文章目录 基于Pico和MicroPython点亮ws2812彩色灯带IntroductionPracticeConclusion Introduction 点亮发光的LED灯是简单有趣的实验&#xff0c;点亮多个ws2812小灯串联起来的灯带&#xff0c;可对多个彩色小灯进行编程&#xff0c;…

react笔记-03react-router篇

本文章是react的路由笔记 一、react路由&#xff08;v5版本&#xff09; 1. 什么是路由&#xff08;前端&#xff09;&#xff1f; 一个路由就算一个映射关系&#xff08;key: value)key为路径&#xff0c;value为组件 2. 前端路由的工作原理 根据浏览器历史记录&#xff…

Java | Leetcode Java题解之第167题两数之和II-输入有序数组

题目&#xff1a; 题解&#xff1a; class Solution {public int[] twoSum(int[] numbers, int target) {int low 0, high numbers.length - 1;while (low < high) {int sum numbers[low] numbers[high];if (sum target) {return new int[]{low 1, high 1};} else i…

C++ (week9):Git

文章目录 1.git介绍2.git安装3.git配置4.获取自己的SSH公钥5.新建仓库6.邀请开发者7.克隆远程仓库到本地8.在本地进行开发9.本地项目推送到远程仓库10.git的工作原理11.分支管理(1)合作开发的方式(2)分支管理(3)分支合并的原理、冲突管理 12.git 与 svn 的区别13.设置alias别名…

Ubuntu iso 镜像下载 步骤截图说明

Ubuntu镜像下载&#xff0c;在这个网址&#xff1a; Enterprise Open Source and Linux | Ubuntu 步骤如下图所示&#xff1a; 1、登入网址 2、点击Get Ubuntu 3、点击Download Ubuntu Desktop 后续点击Downloadload 24.04 LTS直接下载就行 如果需要下载其它版本&#xf…

0 知识的补充

目录 矢量运算 矢量加法 矢量减法 矢量点乘 矢量叉乘 矢量混合积 坐标系 直角坐标系 柱坐标系 球坐标系 ​​​​​​​ 矢量运算 矢量加法 矢量减法 矢量点乘 矢量叉乘 ​​​​​​​ 矢量混合积 坐标系 直角坐标系 柱坐标系 ​​​​​​​ 球坐标系

MATLAB-SSA-CNN-SVM,基于SSA麻雀优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类)

MATLAB-SSA-CNN-SVM,基于SSA麻雀优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类) 1.数据均为Excel数据&#xff0c;直接替换数据就可以运行程序。 2.所有程序都经过验证&#xff0c;保证程序可以运行。 3.具有良好的编程习惯&#xff0c;程序均包含…

【密码学】分组密码

文章目录 分组密码的模式分组密码与流密码模式明文分组与密文分组 ECB模式ECB定义ECB特点对ECB模式的攻击改变分组顺序攻击 CBC模式CBC定义初始化向量IVCBC特点对CBC模式的攻击对初始向量进行反转攻击填充提示攻击 CFB模式CFB定义对CFB模式的攻击重放攻击 OFB模式OFB定义CFB模式…

模板初阶【C++】

模板的作用 模板的主要作用是实现泛型编程&#xff0c;泛型编程即编写与类型无关的通用代码&#xff0c;是代码复用的一种手段 模板就是泛型编程的基础。 例 我们经常使用的交换函数就可以使用泛型编程来进行编写&#xff0c;这样可以大大减少重复的代码 一般编写方式 可以…

MyBatis拦截器(Interceptor)的理解与实践

文章目录 1. 什么是MyBatis拦截器&#xff1f;2. 拦截器的基本原理3. 编写自定义拦截器3.1 示例&#xff1a;实现SQL执行时间统计拦截器3.2 配置拦截器 4. 实战应用场景5. 总结 &#x1f389;欢迎来到SpringBoot框架学习专栏~ ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博…

可视化大屏开发系列——页面布局

页面布局是可视化大屏的基础&#xff0c;想要拥有一个基本美观的大屏&#xff0c;就得考虑页面整体模块的宽高自适应&#xff0c;我们自然就会想到具有强大灵活性flex布局&#xff0c;再借助百分比布局来辅助。至此&#xff0c;大屏页面布局问题即可得到解决。 可视化大屏开发系…

三大交易所全面恢复 IPO 申请

6月21日晚间&#xff0c;北交所受理了3家企业的IPO申请&#xff0c;这是北交所时隔3个月之后恢复IPO受理。6月20日晚间&#xff0c;沪深交易所各受理了1家IPO申请&#xff0c;这是沪深交易所时隔半年后再次受理IPO。这也意味着&#xff0c;三大交易所IPO受理全部恢复。 6月21日…