麒麟系统arm架构上部署开发环境。

今天早早来到公司,这也是再公司搬址前在老地址待得最后一天,昨天把前面重要的一个任务也完成的差不多了,遂现在记录一下。

收到任务,要将公司的开发环境和生产环境配置在银河麒麟v10服务器上。这个服务器是向华为申请得到的,是arm架构,与项目中使用的x86架构不同,所以安装的时候也算是遇到了很多的坑。

首先如果我想要连接到那个服务器进行一系列的操作,我就必须得先提前连接一下VPN,这让我又学习了一下VPN的知识。

VPN

VPN是虚拟专用网,当我们的主机IP连接上VPN之后(VPN为了确保安全性,往往需要提供身份验证才能进行连接。),我们在公网上的IP地址也就变成了VPN转换后的IP地址,这样就可以访问到目标只能由特定IP地址访问到的资源了。连接成功后,你的真实IP地址会被VPN服务器的IP地址所替换。当你访问互联网时,外部服务器只会看到VPN服务器的IP地址,而看不到你的真实IP地址。这种IP地址替换可以让你访问只有特定IP地址才能访问的资源。例如,公司内部的某些系统可能只允许来自特定IP地址的访问,通过VPN,你可以获得该特定IP地址的权限,从而访问这些资源。

学习了VPN之后,我又感觉它和我之前学习408的时候学到的NAT网络地址转换很像,于是我又去学习了一下NAT以区分他们两个。

NAT

NAT是网络地址转换。在实际应用中,NAT主要用于私有网络访问外部网络或外部网络访问私有网络的情况。当所有的内网ip要访问外网时,通过NAT转换后,所有的内网ip地址都会变成一个公共的外网ip地址。当外网地址要访问内部网络的时候,外网ip在经过NAT转换之后,会变成NAT转换器的IP地址以访问内部网络。

具体来说,NAT有以下两个好处:

  1. 通过使用少量的公有IP地址代表多数的私有IP地址,缓解了可用IP地址空间枯竭的速度。
  2. NAT可以隐藏私有网络,达到保护私有网络的目的。

关于二者的区别:

举个形象生动的例子:

  • VPN:像是一条安全的地下通道,你通过这条通道从你的家(电脑)到达公司的大楼(公司网络),通道中的所有信息都是加密的,确保没有人能在中途窥视你的数据。

  • NAT:像是一个中转站,所有的包裹(数据包)都会在这里被重新贴上标签(更换IP地址),然后再发送到目的地。中转站的作用是让多个包裹可以通过同一个地址(公共IP)被送出,同时也可以隐藏包裹的真实来源(内部网络结构)。

连接目标服务器

使用WindTerm软件新建会话,使用IP地址和用户名密码连接到的目标服务器,这样就可以在目标服务器上进行一系列操作了。

在使用了UniVPN这个软件并使用管理员给我提供的方式连接好了VPN之后,我就可以连接到目标鲲鹏服务器了。在进入服务器后,我输入命令uname -a查看到了关于本操作系统的一些基础信息。

之后我总共需要在改服务器上搭建以下组件,并设置好开发环境的配置文件。

Docker

首先我在该arm架构的服务器上要先安装Docker,虽然并不知道Docker是干嘛用的,并且也只是模模糊糊地知道一些镜像和容器地作用。但是我还是先安装了。

使用了下面这篇博客将Docker成功安装好。

https://www.cnblogs.com/haolb123/p/16506695.html

之后就要在Docker部署开发环境了。

但是紧接着在使用Docker pull的过程中,发现所有的国内所有的镜像都已经被封禁掉了,根本拉去不到镜像到本地,并且之前在x86架构下跑的开发环境所用的镜像也都是x86架构,无法在arm架构上运行(在经历了一番docker export 打成jar包,在上传到目标服务器上进行docker load之后,发现确实无法使用。)

于是Docker算是白安装了,接下来要在物理机上直接配置环境,不使用Docker这个工具了。

MySQL

项目需要使用到数据库也就是MySQL数据库,我根据下面这篇博客在服务器上安装好了arm架构的MySQL5.7版本。
https://blog.csdn.net/wochunyang/article/details/132883654

文章中有个疏漏,就是在执行

mysql -u root -h 127.0.0.1  -p

命令之后,需要输入密码,而这是第一次登录mysql,初始密码在初始化的时候产生的日志里面。

这样MySQL也是安装好了。

Nacos

下一步是安装Nacos。由于Nacos执行脚本里面依赖JAVA环境。所以要先配置好JAVA环境。我使用的JAVA是,bisheng-jdk1.8.0_412。

我在/etc/profile文件中,添加如下脚本。这样就可以修改全局的java环境。

之后在nacos的执行脚本中看好对应有关java的配置是否正确,如果正确即不需要修改,如果不正确就修改为所需要的java路径。

nacos的执行脚本如下所示:

其中有关java环境的配置。

之后即可使用命令sh startup.sh -m standalone启动nacos。后面加个 -m standalone是设置为单机模式启动,而非集群模式。

我根据以下博客将nacos设置成了开机自启。

nacos配置开机自启_nacos设置开机自启-CSDN博客

Seata

在这之后就是Seata的安装和配置。

seata安装在下面这个目录下。

进入bin目录下,可以看到关于seata的一些脚本。

其中start_seata-demo.sh脚本中的内容是下图所示,它用来执行同级的seata-server.sh脚本并指定了端口号和主机地址。

而seata-server.sh脚本才是执行seata的脚本。其中内容是

#!/bin/sh
# ----------------------------------------------------------------------------
#  Copyright 2001-2006 The Apache Software Foundation.
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.
# ----------------------------------------------------------------------------
#
#   Copyright (c) 2001-2006 The Apache Software Foundation.  All rights
#   reserved.# resolve links - $0 may be a softlink
PRG="$0"while [ -h "$PRG" ]; dols=`ls -ld "$PRG"`link=`expr "$ls" : '.*-> \(.*\)$'`if expr "$link" : '/.*' > /dev/null; thenPRG="$link"elsePRG=`dirname "$PRG"`/"$link"fi
donePRGDIR=`dirname "$PRG"`
BASEDIR=`cd "$PRGDIR/.." >/dev/null; pwd`# Reset the REPO variable. If you need to influence this use the environment setup file.
REPO=# OS specific support.  $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
case "`uname`" inCYGWIN*) cygwin=true ;;Darwin*) darwin=trueif [ -z "$JAVA_VERSION" ] ; thenJAVA_VERSION="CurrentJDK"elseecho "Using Java version: $JAVA_VERSION"fiif [ -z "$JAVA_HOME" ]; thenif [ -x "/usr/libexec/java_home" ]; thenJAVA_HOME=`/usr/libexec/java_home`elseJAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/${JAVA_VERSION}/Homefifi       ;;
esacif [ -z "$JAVA_HOME" ] ; thenif [ -r /etc/gentoo-release ] ; thenJAVA_HOME=`java-config --jre-home`fi
fi# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`[ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi# If a specific java binary isn't specified search for the standard 'java' binary
if [ -z "$JAVACMD" ] ; thenif [ -n "$JAVA_HOME"  ] ; thenif [ -x "$JAVA_HOME/jre/sh/java" ] ; then# IBM's JDK on AIX uses strange locations for the executablesJAVACMD="$JAVA_HOME/jre/sh/java"elseJAVACMD="$JAVA_HOME/bin/java"fielseJAVACMD=`which java`fi
fiif [ ! -x "$JAVACMD" ] ; thenecho "Error: JAVA_HOME is not defined correctly." 1>&2echo "  We cannot execute $JAVACMD" 1>&2exit 1
fiif [ -z "$REPO" ]
thenREPO="$BASEDIR"/lib
fiCLASSPATH="$BASEDIR"/conf:"$REPO"/*ENDORSED_DIR=
if [ -n "$ENDORSED_DIR" ] ; thenCLASSPATH=$BASEDIR/$ENDORSED_DIR/*:$CLASSPATH
fiif [ -n "$CLASSPATH_PREFIX" ] ; thenCLASSPATH=$CLASSPATH_PREFIX:$CLASSPATH
fi# For Cygwin, switch paths to Windows format before running java
if $cygwin; then[ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --windows "$CLASSPATH"`[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`[ -n "$HOME" ] && HOME=`cygpath --path --windows "$HOME"`[ -n "$BASEDIR" ] && BASEDIR=`cygpath --path --windows "$BASEDIR"`[ -n "$REPO" ] && REPO=`cygpath --path --windows "$REPO"`
fiexec "$JAVACMD" $JAVA_OPTS -server -Xmx2048m -Xms2048m -Xmn1024m -Xss512k -XX:SurvivorRatio=10 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:MaxDirectMemorySize=1024m -XX:-OmitStackTraceInFastThrow -XX:-UseAdaptiveSizePolicy -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="$BASEDIR"/logs/java_heapdump.hprof -XX:+DisableExplicitGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -Xloggc:"$BASEDIR"/logs/seata_gc.log -verbose:gc -Dio.netty.leakDetectionLevel=advanced -Dlogback.color.disable-for-bat=true \-classpath "$CLASSPATH" \-Dapp.name="seata-server" \-Dapp.pid="$$" \-Dapp.repo="$REPO" \-Dapp.home="$BASEDIR" \-Dbasedir="$BASEDIR" \io.seata.server.Server \"$@"

虽然我也看不懂。但内容就是这些。seata启动依赖数据库和nacos的启动,所以如果要将seata设置为开机自启的服务,得再seata.service中添加好让它的启动再nacos和数据库的启动之后。

Minio

我也不知道minio是干嘛用的,所以按照下面博客安装好了并且设置了开机自启后也没出现什么问题,比较简单。

单机部署MinIo并设置开机自启_minio开机自启动-CSDN博客

开机自启

在整个配置的过程中,我学会了如何将一个服务设置为开机自启服务。

网上一共有三种设置linux服务为开机自启的方式,在这里我采用其中一种。

使用Systemd添加开机自启动服务

systemd 是系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程。

对于Systemd详细信息,可以查看下面内容:

Fedora wiki: Systemd/zh-cn:https://fedoraproject.org/wiki/Systemd/zh-cn

systemd.service 官方手册:https://fedoraproject.org/wiki/Systemd/zh-cn

systemd.service 中文翻译:http://www.jinbuguo.com/systemd/systemd.service.html#

使用写出所需要的服务app的配置文件,注意要根据具体服务启动的要求写出来。

# 启动顺序与依赖关系
[Unit]
Description=My app Startup Test Service
After=network.target
# 启动行为
[Service]
Type=simple
WorkingDirectory=/home/ubuntu/app/
ExecStart=/home/ubuntu/app/app.bin
Restart=always
RestartSec=0s
KillMode=mixed
# 定义如何安装配置文件
[Install]
WantedBy=multi-user.target
  1. 首先将 app.service 文件复制到 /etc/systemd/system/ 或者 /usr/lib/systemd/system/(如果在 /usr/lib/systemd/ 下没有system目录,则手动创建一个即可)。
  2. 添加或修改配置文件后,需要重新加载,使用指令:sudo systemctl daemon-reload,sudo 可省,会自动弹出输出密码的对话框。
  3. 设置允许自启动,使用指令:sudo systemctl enable app.service(后缀.service可以省略)

至此,自定义的应用程序可以在下次开机的时候自动启动了,

常用的一些指令如下所示。

  • 启动:sudo systemctl start app.service
  • 激活开机启动:sudo systemctl enable app.service
  • 取消开机启动:sudo systemctl disable app.service
  • 启动服务:sudo systemctl start app.service
  • 停止服务:sudo systemctl stop app.service
  • 重启服务:sudo systemctl restart app.service
  • 重载服务:sudo systemctl daemon-reload
  • 察看运行情况:sudo systemctl status app.service
  • 查看所有已启动的服务:sudo systemctl list-units --type=service

注意点

后来在的过程中遇到了很多问题,例如就遇到了内存不足的问题。使用free -m可以以mb的形式查看当前的内存使用情况。后来发现是启动的java程序太多了。每个都占了1个多g的内存,可能是因为在搭建java环境的时候下载了很多的java也开启了很多的java,后来在重启服务器之后,内存就够了。

ps命令可以查看当前的进程。kill命令可以根据pid杀掉进程。

which java可以看见java的路径。

系统配置在/etc/profile

whoami可以看当前的用户是哪个。

cat 文件路径 用于显示文件内容

chmod赋予文件权限。

ps -a | grep minio 查看所有正在运行的进程,并过滤出包含“minio”字符串的进程。

reboot用于重启。

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

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

相关文章

实战:Eureka的概念作用以及用法详解

概叙 什么是Eureka? Netflix Eureka 是一款由 Netflix 开源的基于 REST 服务的注册中心,用于提供服务发现功能。Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 进行了二次封装,主要负责…

高性能分布式IO系统BL205 OPC UA耦合器

边缘计算是指在网络的边缘位置进行数据处理和分析,而不是将所有数据都传送到云端或中心服务器,这样可以减少延迟、降低带宽需求、提高响应速度并增强数据安全性。 钡铼BL205耦合器就内置边缘计算功能,它不依赖上位机和云平台,就能…

基于 Go1.19 的站点模板爬虫:构建与实战

引言 随着互联网的发展,网络爬虫已成为数据抓取和分析的重要工具。Go(Golang)语言凭借其高效、简洁的特性,成为构建爬虫的热门选择之一。本文将引导你使用 Go1.19 版本,构建一个基于站点模板的网页爬虫,以…

npm安装依赖包的多种镜像及方法

一般安装依赖包,都是使用 npmjs 镜像安装,或者使用淘宝镜像安装。 比如: npm i react查看当前镜像: npm config get registry当面对 npmjs 镜像无法访问以及淘宝 npm 镜像(cnpm)SSL 证书过期的问题&…

PyTorch中的batch_size和num_workers

PyTorch中的batch_size和num_workers 什么是 batch_size?什么是 num_workers?综合考量 什么是 batch_size? batch_size 是指在每次迭代中送入模型进行训练的数据样本的数量。它对训练过程有着重要影响: 计算效率:较大…

数据仓库实践:使用 SQL 计算材料BOM成本单价

背景 在制造业财务数据分析建设过程中,有时需要通过BOM汇总计算材料的单价,一般会有采购核价,库存成本,还有下阶材料单价按用量汇总得到的单价参与。 这些单价来源一般会根据优先级获取并在计算后作为最终的BOM 单价结果。参与财…

GPT-5一年半后发布

GPT-5 一年半后发布?对此你有何期待? 一:GPT-5技术突破预测 GPT-5的推出预示着自然语言处理(NLP)领域将迎来前所未有的技术革新,这将从多个方面推动行业发展。首先,GPT-5在算法上的进步显著&…

防范UDP Flood攻击的策略与实践

UDP Flood攻击是一种常见的分布式拒绝服务(DDoS)攻击手段,通过向目标服务器发送大量无效的UDP数据包,消耗其网络带宽和处理资源,最终导致合法的网络服务无法正常运行。本文将深入探讨UDP Flood攻击的原理、常见的防御策…

iOS ------ 编译链接

编译流程分析 编译可以分为四步: 预处理(Prepressing)编译(Compilation)汇编 (Assembly)链接(Linking) 预编译(Prepressing) 过程是源文件main.c和相关头文件被&#…

SQL Server查询计划阅读及分析

​​​​​​6.4.5. 查询计划阅读及分析 SQL Server中,SQL语句的查询计划可能会包含多个节点,每个节点除了包含和对应一个操作符外,还包含节点及操作符相关的其他信息,其细节与具体的操作符相关。SQL Server查询计划与Oracle执行计划中,虽然每个节点所包含内容的具体称谓…

window11 部署llama.cpp并运行Qwen2-0.5B-Instruct-GGUF

吾名爱妃,性好静亦好动。好编程,常沉浸于代码之世界,思维纵横,力求逻辑之严密,算法之精妙。亦爱篮球,驰骋球场,尽享挥洒汗水之乐。且喜跑步,尤钟马拉松,长途奔袭&#xf…

FastAPI 学习之路(五十九)封装统一的json返回处理工具

在本篇文章之前的接口,我们每个接口异常返回的数据格式都不一样,处理起来也没有那么方便,因此我们可以封装一个统一的json。 from fastapi import status from fastapi.responses import JSONResponse, Response from typing import Unionde…

= null 和 is null;SQL中关于NULL处理的4个陷阱;三值逻辑

一、概述 1、NULL参与的所有的比较和算术运算符(>,,<,<>,<,>,,-,*,/) 结果为unknown&#xff1b; 2、unknown的逻辑运算(AND、OR、NOT&#xff09;遵循三值运算的真值表&#xff1b; 3、如果运算结果直接返回用户&#xff0c;使用NULL来标识unknown 4、如…

Go语言并发编程-Channel通信_2

Channel通信 Channel概述 不要通过共享内存的方式进行通信&#xff0c;而是应该通过通信的方式共享内存 这是Go语言最核心的设计模式之一。 在很多主流的编程语言中&#xff0c;多个线程传递数据的方式一般都是共享内存&#xff0c;而Go语言中多Goroutine通信的主要方案是Cha…

JavaEE:Lombok工具包的使用以及EditStarter插件的安装

Lombok是一个Java工具库&#xff0c;通过添加注解的方式&#xff0c;简化Java的开发。 目录 1、引入依赖 2、使用 3、原理解释 4、更多使用 5、更快捷的引入依赖 1、引入依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lomb…

pdf提取其中一页怎么操作?提取PDF其中一页的方法

pdf提取其中一页怎么操作&#xff1f;需要从一个PDF文件中提取特定页码的操作通常是在处理文档时常见的需求。这种操作允许用户选择性地获取所需的信息&#xff0c;而不必操作整个文档。通过选择性提取页面&#xff0c;你可以更高效地管理和利用PDF文件的内容&#xff0c;无论是…

结合Redis解决接口幂等性问题

结合Redis解决接口幂等性问题 引言正文收获 引言 该问题产生背景是根据需求描述&#xff0c;要求对已发布的课程能进行编辑修改&#xff0c;并且要求能进行回滚。 幂等性问题描述&#xff1a;对同一个接口并发请求产生的结果是不变的。 Get 请求以及 Delete 请求天然保证幂等…

Linux编辑器——vim的使用

目录 vim的基本概念 命令模式 底行模式 插入模式 注释和取消注释 普通用户进行sudo提权 vim配置问题 vim的基本概念 一般使用的vim有三种模式&#xff1a; 命令模式 底行模式和插入模式&#xff0c;可以进行转换&#xff1b; vim filename 打开vim&#xff0c;进入的…

【代码随想录|贪心算法 455. 分发饼干 376. 摆动序列 53. 最大子数组和】

代码随想录|贪心算法 455. 分发饼干 一、455. 分发饼干1.代码2.问题 二、376. 摆动序列1.代码 三、53. 最大子数组和1.代码 总结 python 一、455. 分发饼干 455. 分发饼干 1.代码 代码如下&#xff08;示例&#xff09;&#xff1a; class Solution:def findContentChildr…

ffmpeg ffplay.c 源码分析

1 ffplay.c的意义 ffplay.c是FFmpeg源码⾃带的播放器&#xff0c;调⽤FFmpeg和SDL API实现⼀个⾮常有⽤的播放器。 例如哔哩哔哩著名开源项⽬ijkplayer也是基于ffplay.c进⾏⼆次开发。 ffplay实现了播放器的主体功能&#xff0c;掌握其原理对于我们独⽴开发播放器⾮常有帮助…