-
1、概述之前我们使用Keepalived实现了Nginx服务的双机主备高可用,但是有几个问题没有解决,今天一起探讨一下。1)在双机主备机制中,Keepalived服务如果宕了,会自动启用备机进行服务,但Nginx服务如果负载过大宕了,虚拟ip是不会指向备机的。2)双机主备的特点是,只有1台机器在提供服务,备机在主机的Keepalived服务宕掉后才会提供服务,大大的造成了资源的浪费。3)目前比较流行租用云服务器去运营公司的产品,那云服务器支不支持虚拟IP呢?今天我们就上述的三个问题来讲解一下。2、使用Keepalived实现Nginx的自动重启2.1 借助Shell脚本,完成Nginx的重启Keepalived不能直接启动Nginx,但可以执行shell脚本,因此这里我们需要借助Shell脚本启动Nginx。在 /etc/keepalived 目录下,新建一个脚本 check_nginx.sh,以下是脚本的具体内容:1234567891011121314#!/bin/bash # 执行查看Nginx进程的命令,并放在变量A中A=`ps -C nginx --no-header | wc -l` # 判断是否宕机,如果宕机尝试重启,如果重启不成功,则停止Keepalivedif [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx sleep 3 if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then killall keepalived fifi脚本来源于网络2.2 为脚本赋予运行权限1# chmod +x /etc/keepalived/check_nginx.sh2.3 在Keepalived配置文件中增加配置打开Keepalived配置文件,# vi /etc/keepalived/keepalived.conf修改配置文件,增加vrrp_script 和track_script的配置,配置如下:12345678910111213141516171819202122232425262728293031323334353637383940global_defs { # 全局唯一的主机标识 router_id server_a } vrrp_script check_nginx { script "/etc/keepalived/check_nginx.sh" interval 3 # 每隔3秒运行一次Shell脚本 weight 10 # 脚本运行成功,权重加10} vrrp_instance VI_1 { # 标识是主节点还是备用节点,值为 MASTER 或 BACKUP state MASTER # 绑定的网卡 interface ens33 # 虚拟路由id,保证主备节点是一致的 virtual_router_id 51 # 权重 priority 100 # 同步检查时间,间隔默认1秒 advert_int 1 # 认证授权的密码,所有主备需要一样 authentication { auth_type PASS auth_pass 1111 } track_script { check_nginx } # 虚拟IP virtual_ipaddress { 192.168.1.88 }}2.4 重启Keepalived服务重启后,发现,Nginx停掉后,很快会自动启动。3、双主热备的搭建3.1 双主热备概述由于双机主备机制,每次只会由一台服务器对外提供服务,且主备机的配置是相同的,因此极大地造成了资源的浪费。双主热备则解决了这个问题,双主热备的原理是两台服务器利用Keepalived互为主备,因此需要两个虚拟IP,再利用DNS轮询的配置,让一个域名按轮询的方式分别路由到两个虚拟IP上,最终达到高可用的目的。3.2 场景说明虚拟IP1:192.168.1.88虚拟IP2:192.168.1.66A服务器IP(主):192.168.1.144B服务器IP(备):192.168.1.223.3 修改A服务器配置配置如下:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354! Configuration File for keepalived global_defs { # 全局唯一的主机标识 router_id server_a } vrrp_instance VI_1 { # 标识是主节点还是备用节点,值为 MASTER 或 BACKUP state MASTER # 绑定的网卡 interface ens33 # 虚拟路由id,保证主备节点是一致的 virtual_router_id 51 # 权重 priority 100 # 同步检查时间,间隔默认1秒 advert_int 1 # 认证授权的密码,所有主备需要一样 authentication { auth_type PASS auth_pass 1111 } # 虚拟IP virtual_ipaddress { 192.168.1.88 }} vrrp_instance VI_2 { # 标识是主节点还是备用节点,值为 MASTER 或 BACKUP state BACKUP # 绑定的网卡 interface ens33 # 虚拟路由id,保证主备节点是一致的 virtual_router_id 52 # 权重 priority 80 # 同步检查时间,间隔默认1秒 advert_int 1 # 认证授权的密码,所有主备需要一样 authentication { auth_type PASS auth_pass 1111 } # 虚拟IP virtual_ipaddress { 192.168.1.66 }}3.4 修改B服务器配置配置如下:123456789101112131415161718192021222324252627282930313233343536373839404142434445! Configuration File for keepalived global_defs { router_id server_b } vrrp_instance VI_1 { # 设置为备机 state BACKUP interface ens33 virtual_router_id 51 # 权重设置的要比主机低 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } # 虚拟IP需要主备设置成一样 virtual_ipaddress { 192.168.1.88 }} vrrp_instance VI_2 { # 设置为主机 state MASTER interface ens33 virtual_router_id 52 # 权重设置的要比主机低 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } # 虚拟IP需要主备设置成一样 virtual_ipaddress { 192.168.1.66 }}3.5 重启两台服务器的Keepalived重启Keepalived即可。3.6 设置DNS轮询联系网络运营商解决。4、云服务器的负载均衡现在,很多公司都会选择租用云服务器运行自己的产品,因为更划算、更稳定,有专业人员负责运维。但使用了云服务器,就要受云服务运营商的限制。就拿虚拟IP这个事儿来说,一些云服务运营商就是不支持的。如果不支持虚拟IP,则Keepalived这个方案就只能放弃了。但即使Keepalived用不了,Nginx的高可用还是有解决方案的,很多云服务商都已经推出了自己的负载均衡服务(例如:阿里云的负载均衡 SLB 和 腾讯云的负载均衡 CLB)。我们直接租用就好了,不需要我们自己去配置。5、综述今天大概聊了一下KeepAlived自动重启Nginx,Keepalived的双主热备高可用的搭建,以及云服务器负载均衡的解决方案,希望能对大家有所帮助。
-
下面,我会给你一个非常完整的实例代码,并详细讲解每一步的操作:1. 创建一个systemd服务文件首先,我们需要创建一个服务文件来告诉systemd如何管理Nginx。这个文件通常会被保存在/etc/systemd/system/目录下,并命名为nginx.service。你可以使用下面的命令来创建并编辑这个文件:1sudo nano /etc/systemd/system/nginx.service然后,将下面的内容复制到nginx.service文件中:123456789101112131415[Unit] Description=The NGINX HTTP and reverse proxy server After=syslog.target network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/run/nginx.pid ExecStartPre=/usr/sbin/nginx -t ExecStart=/usr/sbin/nginx ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target这个文件告诉systemd:Nginx是一个什么样的服务([Unit]部分)。如何启动、重新加载和停止Nginx([Service]部分)。在哪些情况下需要启动Nginx([Install]部分)。2. 重新加载systemd配置保存并关闭nginx.service文件后,我们需要通知systemd有一个新的服务配置。这可以通过下面的命令来完成:1sudo systemctl daemon-reload3. 设置Nginx服务开机自启,并启动服务接下来,我们希望Nginx在系统启动时自动运行,并且现在就启动它。这可以通过下面的两个命令来完成:12sudo systemctl enable nginx.servicesudo systemctl start nginx.service4. 检查Nginx状态最后,我们可以使用下面的命令来检查Nginx的状态:1sudo systemctl status nginx.service如果一切正常,你应该能看到类似“active (running)”的状态信息。5.自动重启的魔法那么,自动重启的魔法在哪里呢?其实,它就在我们刚刚创建的nginx.service文件中。当Nginx因为某些原因意外退出时,systemd会根据这个文件的配置自动尝试重新启动Nginx。6.shell脚本+计划任务如果停止后,还可以手工正常启用nginx,那可以考虑把shell脚本添加到宝塔的计划任务里,定时每隔几分钟检测一次,让nginx自动检测停止后立马启用。12345678910ps=`ps -efl|grep nginx|grep -v $0|grep -v grep|wc -l`if [ $ps -eq 0 ];then echo -e "\n$(date '+%Y-%m-%d %H:%M:%S') start " /etc/init.d/nginx start echo "$(date '+%Y-%m-%d %H:%M:%S') done"else echo $(date +%F%n%T) "nginx正在运行..." exit 0;fi
-
前言scp是 secure copy的缩写, scp是Linux系统下基于ssh登陆进行安全的远程文件拷贝命令。Linux的scp命令可以在Linux服务器之间复制文件和目录。使用语法:scp [参数] [源路径] @IP:/目标路径scp 参数如下:-1: 强制scp命令使用协议ssh1-2: 强制scp命令使用协议ssh2-4: 强制scp命令只使用IPv4寻址-6: 强制scp命令只使用IPv6寻址-B: 使用批处理模式(传输过程中不询问传输口令或短语)-C: 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)-p:保留原文件的修改时间,访问时间和访问权限。-q: 不显示传输进度条。-r: 递归复制整个目录。-v:详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。-c cipher: 以cipher将数据传输进行加密,这个选项将直接传递给ssh。-F ssh_config: 指定一个替代的ssh配置文件,此参数直接传递给ssh。-i identity_file: 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。-l limit: 限定用户所能使用的带宽,以Kbit/s为单位。-o ssh_option: 如果习惯于使用ssh_config(5)中的参数传递方式,-P port:注意是大写的P, port是指定数据传输用到的端口号-S program: 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。测试:server服务器ip192.168.43.117 backup服务器ip 192.168.43.200①从本地向远端拷贝数据:将server服务器/tmp/目录拷贝到远端backup服务器/text目录下:1scp -r /tmp/ root@192.168.43.200: /text②从远端向本地拷贝数据:将backup服务器/text目录下123.log文件拷贝到本地server服务器/tmp/目录下:1scp root@192.168.43.200:/text/123.log /tmp/scp是在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读 read only system时,用scp可以帮你把文件移出来。另外,scp还非常不占资源,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。虽然 rsync比scp会快一点,但当小文件众多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。scp在夸机器复制的时候为了提高数据的安全性,使用了ssh连接和加密方式,如果机器之间配置了ssh免密码登录,那在使用scp的时候密码都不用输入。
-
前言scp 和 sftp 是一种远程文件加密传输协议,讲通俗点就是用来操控本地/远程文件,不知道你注意到了没有,它们开头都带了 s,是的,它们嵌套了一层 ssh 加密协议。像 sftp 它的传统版本就是 ftp,但这种协议不安全,传输数据是都是明文的,很容易受到攻击窃取,所以才有了后来的 sftp,其实就跟 http / https 同个道理。如果你还没了解过 ssh 可以参考我之前写过的 ssh 是什么、有什么用 ,不想了解也没关系,因为这两命令使用起来非常简单,下面我们进入正文。1. scp 使用scp 它的基本命令为:scp socure target1.1 将本地文件复制到远程机1234例子1scp -r ./test/ root@111.222.333:/home/例子2scp -P 6666 -r ./test/ root@111.222.333:/home/-r 参数表示是否递归复制目录-P 参数表示指定 ssh 端口号(注意是大写 P)以上表示将本地的 ./test 目录放到远程机的 /home/ 下面1.2 将远程机文件复制到本地12例子scp -r root@111.222.333:/home/test ./home/以上表示将远程机的 /home/test 目录放到本地的 ./home/ 下面1.3 将远程文件复制到另一个远程机12例子scp -r root@111.222.333:/home/test root@444.555.666:/home/以上表示将远程机的 /home/test 目录放到另外一台远程机的 /home/ 下面2. sftp 使用首先,我们打开 git 或 linux 来连接服务器如果你是 windown 系统也可以尝试输入,因为 window 部分系统如 win10 已经自带了1234格式sftp username@hostname例如sftp root@111.222.333接下来就会进入 sftp 命令模式1sftp> 输入你的 sftp 命令1.1 将本地文件复制到远程机1234格式put localfile [remotefile]例子put -r ./test /home-r 参数表示是否递归复制1.2 将远程机文件复制到本地1234格式get remotefile [localfile]例子get -r /home/test ./home1.3 创建/删除远程目录1234创建 hello 目录mkdir hello删除 hello 目录rmdir hellosftp 远程工作环境默认在 user 目录,因此上面创建的 hello 目录会放到 ~/hello 下, 假设你的用户名是 root 那就是在 root/hello ,要想改变环境可以使用 cd 或者加上绝对路径 / 标识符,如下12345第一种cd /homemkdir hello第二种mkdir /home/hello3. scp 和 sftp 有啥区别?用哪个好?区别1、scp 能将远程文件复制到另一个远程机,sftp 不能2、scp 没有删除/创建远程目录功能,sftp 有用哪个好偶尔操作文件就用 scp ,反之 sftp
-
1. SCP命令的使用1scp -p 你想发送的文件 目标主机用户名@IP:目标地址2. 配置SSH免密登陆配置完免密登陆后,我们互传文件就不需要在输入密码了2.1 在本地虚拟机上生成密钥1ssh-keygen -t rsa命令敲完之后,点击三次回车,可以在根目录下的.ssh目录中看到几个文件id_rsa是私钥文件id_rsa.pub是公钥文件know_hosts:有的人可能没有,有的人可能会有,这个是我们刚才传文件的时候生成的。2.2 将公钥写入认证文件1cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys2.3 设置权限12chmod 700 ~/.sshchmod 600 ~/.ssh/authorized_keys2.4 将认证文件发送到需要上传文件的服务器上我这里上传到我的云服务器上了1scp -p authorized_keys root@目标IP:/root/.ssh/authorized_keys上面三步可以直接通过下面命令来实现,上面的比较好理解1ssh-copy-id 目标IP2.5 如果目标服务器的.ssh和authorized_key权限不对需要把目标服务器的权限也给配一下,这里配置的目的是使这些文件能被调用到。
-
linux上scp能不能取代rsync在Linux系统中,scp和rsync都是基于SSH协议的文件传输工具,但它们的核心功能和适用场景有显著差异。能否用scp完全替代rsync,取决于你的具体需求。以下是两者的对比分析:1. 核心功能差异特性scprsync传输方式全量传输(每次复制整个文件)增量传输(仅传输差异部分)带宽效率低(重复传输未修改内容)高(跳过未修改内容,适合大文件/频繁同步)断点续传不支持支持(--partial或--append选项)文件属性保留基础权限和修改时间完整保留权限、时间、符号链接等元数据过滤/排除文件不支持支持(--exclude或--include规则)压缩传输可选(-C选项)默认启用压缩(-z可关闭)目录同步仅简单复制支持目录差异对比和智能同步2. 何时选择 scp?简单场景:偶尔传输少量文件,无需保留复杂属性。快速操作:临时复制单个文件,命令简单易记(scp file user@host:/path)。兼容性要求:某些旧系统可能未预装rsync,但scp几乎普遍可用。3. 何时必须用 rsync?频繁同步:定期备份或同步大量文件(如日志、代码库)。大文件/低速网络:仅传输差异内容,节省时间和带宽。保留元数据:需保持文件权限、符号链接、时间戳等。复杂过滤:排除临时文件(如--exclude="*.tmp")或选择性同步。中断恢复:传输大文件时网络中断,可续传而非重新开始。4. 示例对比用 scp 复制目录:1scp -r /local/dir user@remote:/path/用 rsync 增量同步目录(保留属性、压缩传输、排除缓存文件):1rsync -avz --exclude='*.cache' /local/dir/ user@remote:/path/复制/aa class="codeanswer"免费讲解/aa class="codeai" href="cid:link_0" target="_blank" rel="noopener"AI专家总结可以替代的场景:单次简单文件传输,且对效率、元数据无特殊要求。无法替代的场景:需要增量同步、断点续传、复杂过滤或保留完整元数据时,rsync不可替代。将scp视为“快速复制工具”,而rsync作为“专业同步工具”。
-
linux复制文件夹并重命名在Linux系统中,复制文件夹并重命名是一个常见的操作。这个过程可以通过命令行来实现,让我们来学习一下如何在Linux系统中进行这个操作。我们需要使用“cp”命令来复制文件夹该命令的基本语法是:1cp -r source_folder destination_folder其中,“-r”选项表示递归复制,可以复制整个文件夹及其子文件夹和文件。在这个命令中,我们需要指定源文件夹和目标文件夹的路径。例如:如果我们想要复制名为“folder1”的文件夹到同一目录下并重命名为“folder2”,可以执行以下命令:1cp -r folder1 folder2这将复制“folder1”文件夹及其内容到当前目录下,并将复制后的文件夹重命名为“folder2”。除了使用“cp”命令外,我们还可以结合使用“mv”命令来实现复制文件夹并重命名该命令的基本语法是:1cp -r source_folder destination_folder && mv destination_folder new_folder_name通过这个组合命令,我们可以将复制后的文件夹重命名为我们想要的名称。例如:如果我们希望将名为“folder1”的文件夹复制到同一目录下并将其重命名为“folder3”,可以执行以下命令:1cp -r folder1 folder3 && mv folder3 new_folder_name这将先复制“folder1”文件夹到当前目录下,然后将新文件夹重命名为“folder3”。总的来说在Linux系统中复制文件夹并重命名是一个比较简单且常见的操作。通过使用“cp”和“mv”命令的组合,我们可以轻松地实现这个目标。
-
Linux 打包和解压命令打包命令tar 命令是最常用的打包工具,可以用来创建归档文件。创建一个名为 archive.tar 的 tar 包:1tar -cvf archive.tar /path/to/directory/这里:c 表示创建新的归档文件。v 表示在打包过程中显示文件。f 指定归档文件的名称。zip 命令用于创建 zip 格式的压缩文件。1zip -r archive.zip /path/to/directory/这里:-r 表示递归处理,包含目录下的所有文件和子目录。解压命令解压 tar 文件:1tar -xvf archive.tar这里:x 表示解压。v 表示在解压过程中显示文件。f 指定归档文件的名称。解压 zip 文件:1unzip archive.zip这里不需要额外的选项,直接指定文件名即可。
-
我目前手上有一个棘手的需求,需要在服务器上利用KVM运行32位的Linux操作系统。通过搜索网络我发现许多64位的ARM处理器已经不具备32位的支持,或者仅仅在个别EL下支持32位。我正在寻找具备EL1和EL0下的32位支持、且具备虚拟化扩展的64位ARM处理器。请问有使用过搭载鲲鹏916和鲲鹏920处理器的服务器的同行吗?鲲鹏916和鲲鹏920是否具备EL0和EL1下的32位支持?
-
安装安装前,检查host系统的/opt/exagear目录是否存在。如存在,用户可根据实际情况,选择在当前版本上进行升级,参见“升级ExaGear for Server on Ubuntu”,也可选择卸载当前已安装版本,参见“卸载ExaGear for Server on Ubuntu”,然后重新进行新版本的安装,新版本安装参见如下。ExaGear for Server on Ubuntu发布件包含如下六个安装包:exagear-core-x32a64_<package_version>_arm64.debexagear-core-x64a64_<package_version>_arm64.debexagear-integration_<package_version>_all.debexagear-utils_<package_version>_all.debexagear-guest-for-ubuntu-<os_version>-x86_64_<package_version>_all.debexagear-cfg-builder-a64_<package_version>_arm.deb其中exagear-guest-for-ubuntu-<os_version>-x86_64-<package_version>_all.deb 需要通过以下链接单独获取:- Ubuntu 18.04 guest系统包- Ubuntu 20.04 guest系统包执行以下命令安装exagear: sudo dpkg -i exagear-utils_<package_version>_all.deb exagear-core-x64a64_<package_version>_arm64.deb exagear-core-x32a64_<package_version>_arm64.deb exagear-guest-for-ubuntu-<os_version>-x86_64-<package_version>_all.deb exagear-integration_<package_version>_all.deb exagear-cfg-builder-a64_<package_version>_arm.debsudo apt-get install -f 注意:上述命令中的<package_version>表示ExaGear包的版本号,例如3213。安装时需根据实际获取的安装包版本号执行操作,否则会提示失败。上述命令中的<os_version>表示guest系统的版本号,安装时需根据实际获取的安装包版本号执行操作,否则会提示失败。此处<os_version>以for Ubuntu 20.04为例,则<os_version>为2004。运行guest系统运行exagear命令,即可启动一个x86 shell,也称为guest shell,进入到虚拟的x86 OS环境。exagear显示:Starting the shell in the guest image /opt/exagear/images/ubuntu-<os_version>-x86_64arch显示:x86_64至此,你已置身于x86运行环境,根目录在host系统上的绝对路径为:/opt/exagear/images/ubuntu-<os_version>-x86_64。在这里,guest shell的运行情况和在x86机器上一样。须知用户账号在host系统和guest系统之间是共享的。在guest系统中增加或删除用户时,host上也会自动进行相应的修改。/home目录也在host系统和guest系统之间共享(更多host和guest系统之间共享目录的详细信息,请参考配置ExaGear for Server on Ubuntu)。运行exit命令即可退出guest会话。exit至此,你又回到了host系统。执行如下命令:arch显示:aarch64。安装x86应用程序x86或x86_64应用程序以及依赖库的安装等,需要在guest环境中进行。推荐使用apt工具安装x86应用,首先要配置apt源,需要进入guest环境后进行配置,相关操作和在x86机器上的操作一样。如果你需要在本地网络中通过/etc/environment使用代理配置,确保你已经通过如下命令将配置复制到了guest系统(更多请参考“配置ExaGear for Server on Ubuntu”)。sudo cp /etc/environment /opt/exagear/images/ubuntu-<os_version>-x86_64/etc/environment运行exagear命令进入guest环境,以安装x86的nginx为例:xagear示:Starting the shell in the guest image /opt/exagear/images/ubuntu-<os_version>-x86_64通过apt-get进行安装:sudo apt-get updatesudo apt-get install nginx在guest环境中安装x86应用程序,guest 环境中查看到的路径如果是/path/to/binary,则实际路径是:/opt/exagear/images/ubuntu-<os_version>-x86_64/path/to/binary。比如,在guest环境中 nignx的路径为 /usr/sbin/nginx,在host 环境上的实际路径为/opt/exagear/images/ubuntu-<os_version>-x86_64/usr/sbin/nginx。如果x86应用是以deb安装包方式提供的,需要将该安装包拷贝至guest系统可见的目录,推荐个人home目录“~/”,然后进入guest环境,通过apt-get进行安装,以安装x86 xxx.deb包为例:exagear显示:Starting the shell in the guest image /opt/exagear/images/ubuntu-<os_version>-x86_64通过apt-get进行安装:sudo apt-get install xxx运行x86应用程序x86应用程序安装完成后,在guest和host中均可运行。你可以运行exagear命令启动guest shell,并运行任何x86应用程序,运行方式和在x86系统中一样。例如:exagear显示:Starting the shell in the guest image /opt/exagear/images/ubuntu-<os_version>-x86_64 which nginx显示:/usr/sbin/nginx/usr/sbin/nginx -h在host会话中,你有如下两种选择:在同一行中输入exagear -- 命令和guest系统内部的x86应用程序路径。例如:exagear -- /usr/sbin/nginx -h输入x86应用程序二进制文件的完整路径。这个文件位于一个特定的目录下:/opt/exagear/images/ubuntu-<os_version>-x86_64,即x86运行环境。例如: /opt/exagear/images/ubuntu-<os_version>-x86_64/usr/sbin/nginx -h默认配置下,x86应用程序只能访问x86运行环境中的文件,如果需要访问host系统上的某些文件,可以通过设置host与guest共享目录文件方式。详细配置方法请参考“配置ExaGear for Server on Ubuntu”中的host系统和guest系统共享的共享章节。注:对于脚本程序,推荐进入guest环境后运行,或者在host上运行该命令:exagear -- /path/to/script以test.sh脚本为例,脚本内容:#!/bin/bashif [ `arch` == 'x86_64' ]then echo "ok"else echo "fail"fi运行结果对比:./test.sh显示:failexagear -- ./test.sh显示:ok配置ExaGear for Server on Ubuntuhost系统和guest系统共享的目录ExaGear for Server整个文件系统对host系统应用程序可见,只有guest系统文件对Linux on x86应用程序可见。图1 host系统和guest系统的文件系统(以Ubuntu 18为例)放大配置文件/opt/exagear/images/ubuntu-<os_version>-x86_64/.exagear/vpaths-list包含了host系统和guest系统共享的一系列目录和文件。cat /opt/exagear/images/ubuntu-<os_version>-x86_64/.exagear/vpaths-list显示:/home//etc/adduser.conf/etc/deluser.conf...以下文件及配置会在host系统和guest系统中共享使用:User accountsuser groupsuser privileges/home directorieshost configurationssystem information provided by Linux kerneldevices and diskssocketspidfilesmount pointslogstemporary files如需创建一个在host系统和guest系统之间共享的目录或文件,可以选择如下两种方法:方法1:修改vpaths-list配置文件。修改vpaths-list配置文件的操作步骤如下:确保host系统中存在所需的目录(或文件)。在guest系统中创建同名的假目录(或文件)。将目录(或文件)的完整路径另取一行添加到配置文件opt/exagear/images/ubuntu-<os_version>-x86_64/.exagear/vpaths-list中。请注意,配置文件的目录应以“/”结尾方法2:将host系统要共享的目录挂载到guest系统以/newdir为例,使用coreutils中的mount实用程序将host系统要共享的目录挂载到guest系统:在x86运行环境中创建挂载点:sudo mkdir /opt/exagear/images/ubuntu-<os_version>-x86_64/shareddir将newdir挂载到shareddir挂载点下:sudo mount --bind /newdir /opt/exagear/images/ubuntu-<os_version>-x86_64/shareddir说明在卸载ExaGear for Server前,需要卸载挂载的目录:sudo umount /opt/exagear/images/ubuntu-<os_version>-x86_64/shareddir代理配置/etc/environment在host系统和guest系统之间不共享。因此,如果你需要在本地网络中通过/etc/environment使用代理配置,确保你已经使用如下命令将配置复制到guest系统:sudo cp /etc/environment /opt/exagear/images/ubuntu-<os_version>-x86_64/etc/environmentsysctl和网络配置guest系统可以访问/proc/sys/中的sysctl设置,但不能修改/etc/sysctl.conf或/etc/sysctl.d/。sysctl参数的配置应在host系统上进行。guest系统可以访问描述网络配置的文件(例如/etc/resolv.conf)但guest系统不可修改网络设置。网络设置的配置应在host系统上进行。guest SysV风格的init脚本和systemd在host中的集成Ubuntu采用systemd作为init系统,并支持SysV风格的init脚本作为legacy。许多Ubuntu包中会提供这些服务的配置。默认情况下,系统采用全自动集成机制将guest服务表示为host服务。guest服务被注册为host服务,服务名称相同。因此,你可以从guest和host shell来管理guest服务(在这种情况下,host服务会将所有start/stop/testconfig等请求委托给各自的guest服务)。以Ubuntu为例: exagear显示:Starting the shell in the guest image /opt/exagear/images/ubuntu-<os_version>-x86_64 sudo apt-get updatesudo apt-get install nginxexitsudo service nginx startservice nginx status显示:● nginx.service - nginx - high performance web serverLoaded: loaded (/run/systemd/generator.late/nginx.service; generated)Active: active (running) since Fri 2019-05-17 11:56:35 EDT; 2h 54min ago ...你可以通过列出guest系统的/opt/exagear/images/ubuntu-<os_version>-x86_64/etc/init.d/和/opt/exagear/images/ubuntu-<os_version>-x86_64/lib/systemd/system/目录中的文件来查看guest系统中注册了哪些服务。内存序模型ExaGear for Server 默认为Linux on x86应用程序提供弱内存序模型。如果软件依赖于x86强内存序模型,则可能需要强制ExaGear严格遵循x86强内存序模型。可以通过修改ExaGear for Server配置文件来完成: sudo sed -i -e '/EXAGEAR_SMO_MODE="/s/fbase"/all"/' /etc/exagear-x86_32.confsudo sed -i -e '/EXAGEAR_SMO_MODE="/s/fbase"/all"/' /etc/exagear-x86_64.conf使用以下命令恢复弱内存序模型: sudo sed -i -e '/EXAGEAR_SMO_MODE="/s/all"/fbase"/' /etc/exagear-x86_32.confsudo sed -i -e '/EXAGEAR_SMO_MODE="/s/all"/fbase"/' /etc/exagear-x86_64.conf动态二次优化ExaGear 动态二次优化可以在程序翻译运行时动态识别优化的机会,进一步提升翻译效果。动态二次优化依赖硬件SPE功能(SPE是否可用的检测手段查看6-FAQ),以系统服务进程的形式存在。启用动态二次优化需要设置ExaGear配置选项EXAGEAR_USE_OPT="y"。该选项默认为"n"关闭。例如:分别在32位和64位应用程序的配置文件/etc/exagear-x86_32.conf 和 /etc/exagear-x86_64.conf中,设置EXAGEAR_USE_OPT="y",以开启动态二次优化。启动动态二次优化服务: sudo systemctl start exagear-x86_64-opt.servicesudo systemctl start exagear-x86_32-opt.service查看动态二次优化服务状态: sudo systemctl status exagear-x86_64-opt.servicesudo systemctl status exagear-x86_32-opt.service此时可以看到opt.x64a64.socket、opt.x32a64.socket 的进程服务启动。设置/关闭动态二次优化服务自启动: sudo systemctl enable exagear-x86_64-opt.servicesudo systemctl disable exagear-x86_64-opt.servicesudo systemctl enable exagear-x86_32-opt.servicesudo systemctl disable exagear-x86_32-opt.service须知设置EXAGEAR_USE_OPT="y"之前,请确认exagear-x86_*-opt.service相关进程处于开启状态。返回地址优化ExaGear for Server默认关闭了返回地址优化,相关配置及其值设置为EXAGEAR_DISABLE_NATIVE_RETURN_ADDR_OPT="y",如需开启返回地址优化,参考以下操作实现。sudo sed -i -e '/EXAGEAR_DISABLE_NATIVE_RETURN_ADDR_OPT="/s/y"/n"/' /etc/exagear-x86_32.confsudo sed -i -e '/EXAGEAR_DISABLE_NATIVE_RETURN_ADDR_OPT="/s/y"/n"/' /etc/exagear-x86_64.confx86位相同精度在ExaGear中,如果需要以与x86 bit位相同精度进行32/64位的浮点计算(例如,对于使用 SIMD 寄存器的计算),应该启用额外的 ExaGear 选项EXAGEAR_X86_PRECISE_FP。此选项默认为禁用,但可以通过将 EXAGEAR_X86_PRECISE_FP 参数设置为 "y"进行开启,例如:在分别针对32位和64位应用程序进行符号链接配置的文件/etc/exagear- x86_32.conf 和 /etc/exagear-x86_64.conf中添加EXAGEAR_X86_PRECISE_FP="y"。说明启用EXAGEAR_X86_PRECISE_FP选项可能会显著降低ExaGear的整体性能。80位 x86精度在 ExaGear 中,如果需要具有 80 位 x86 精度,则应启用额外的 ExaGear 选项 EXAGEAR_X86_PRECISE_80BIT_FP。此选项默认为禁用,但可以通过将EXAGEAR_X86_PRECISE_80BIT_FP参数设置为“y”进行开启,例如:在分别针对32位和64位应用程序进行符号链接配置的文件/etc/exagear- x86_32.conf 和 /etc/exagear-x86_64.conf中添加EXAGEAR_X86_PRECISE_80BIT_FP="y"。
-
📢前言在 Linux 系统的广袤世界里,高效的程序调试与对进程概念的深刻理解,宛如鸟之双翼、车两轮,是开发者不可或缺的重要技能。GDB(GNU Debugger)作为一款强大的调试工具,犹如开发者手中的精密仪器,能够深入程序内部,精准定位问题所在。而进程概念则是理解 Linux 操作系统运行机制的核心,它关乎资源分配、任务调度等诸多关键环节。本文将引领大家深入探索 GDB 调试工具与进程概念,通过丰富的实例和详细的解析,助力大家掌握这两项重要技能。 🏳️🌈预备程序的发布⽅式有两种, debug 模式和 release 模式, Linux gcc/g++ 出来的⼆进制程序,默认是 release 模式。 要使⽤gdb调试,必须在源代码⽣成⼆进制程序的时候, 加上 -g 选项,如果没有添加,程序⽆法被编译 $ gcc mycmd.c -o mycmd # 默认模式,不⽀持调试$ file mycmdmycmd: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamicallylinked, interpreter /lib64/ld-linux-x86-64.so.2,BuildID[sha1]=82f5cbaada10a9987d9f325384861a88d278b160, for GNU/Linux3.2.0, not stripped$ gcc mycmd.c -o mycmd -g # debug模式$ file mycmdmycmd: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamicallylinked, interpreter /lib64/ld-linux-x86-64.so.2,BuildID[sha1]=3d5a2317809ef86c7827e9199cfefa622e3c187f, for GNU/Linux3.2.0, with debug_info, not stripped 🏳️🌈常见使用开始: gdb File退出: ctrl + d 或 quit 调试命令 这是要用到的两个文件,执行生成 myexe 文件,然后用 gdb 调试 [wzy@VM-20-5-centos lesson11]$ cat code.c#include <stdio.h> int Sum(int s, int e){ int sum = 0; int i = s; for(; i <= e; ++i){ sum += i; } return sum;} int main(){ printf("process is running\n"); int start = 1; int end = 100; int result = Sum(start, end); printf("process has done, result: %d\n", result);}[wzy@VM-20-5-centos lesson11]$ cat Makefilemyexe:code.cgcc -o $@ $^ -g .PHONY:cleanclean:rm -f myexe[wzy@VM-20-5-centos lesson11]$ lltotal 20-rw-rw-r-- 1 wzy wzy 324 Jan 17 15:54 code.c-rw-rw-r-- 1 wzy wzy 64 Jan 17 16:02 Makefile-rwxrwxr-x 1 wzy wzy 9688 Jan 17 16:02 myexe l + 数字:查看当前文件中以想要查找的行为中间行的上下10行 l + 字符:效果同上 回车:gdb会记录最近的一条命令,直接回车会继续执行 b + 数字:在指定行添加断点,若当前行没有数据,会提示info b:显示当前有哪些断点 d + 数字:删除指定序号的断点 🏳️🌈常见技巧 - cgdb先需要安装一下 cgdb - sudo tum install -y cgdb cgdb的用法和gdb如出一辙,但是多了一个可视化界面,能够在调试的同时观察代码 cgdb myexe1 👥总结本篇博文对 gdb_进程概念 做了一个较为详细的介绍,不知道对你有没有帮助呢 觉得博主写得还不错的三连支持下吧!会继续努力的~———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/2301_77954967/article/details/145208356
-
SD卡烧录好欧拉系统,HiLens能够设置SD卡为启动首选项,使用SD卡烧录的系统吗?备注:HiLens根目录只有2GB,空间太少了,安装几个库就没有空间了,总计32GB的空间,分成了很多个区,不敢贸然合并,所以想搞个大容量SD卡,烧录系统使用
-
grep 是 Unix 和 Linux 系统中广泛使用的文本搜索工具,它允许用户搜索包含指定模式的文本行。以下是 grep 命令的基本用法及示例:一、基本用法1grep [选项] 模式 [文件...]二、常用选项-i:忽略大小写。-v:反向选择,显示不包含模式的行。-n:显示匹配行的行号。-l:显示包含匹配模式的文件名。-L:显示不包含匹配模式的文件名。-c:只输出匹配到的行数。-w:只匹配整个单词。-x:只匹配整行。-r 或 -R:递归搜索目录中的文件。-A NUM:匹配行及后面 NUM 行一起显示。-B NUM:匹配行及前面 NUM 行一起显示。-C NUM:匹配行及前后各 NUM 行一起显示。三、正则表达式grep 支持正则表达式,这使得它可以进行复杂的文本搜索。例如:.:匹配任意单个字符。*:匹配前一个字符零次或多次。^:匹配行的开始。$:匹配行的结束。[]:匹配括号内的任意一个字符。|:表示或的关系,如 a|b 匹配 a 或 b。():分组,用于后向引用。四、示例搜索文本假设有一个文件 example.txt,内容如下:Hello World hello unix GREP is powerful要在文件中搜索包含 "hello" 的行(忽略大小写),可以使用以下命令:1grep -i "hello" example.txt输出:Hello World hello unix使用正则表达式要在文件中搜索以 "G" 开头并以 "p" 结尾的单词,可以使用以下命令:1grep -w "\bG\w*p\b" example.txt输出:GREP is powerful显示行号要在文件中搜索包含 "World" 的行并显示行号,可以使用以下命令:1grep -n "World" example.txt输出:1:Hello World反向选择要在文件中搜索不包含 "unix" 的行,可以使用以下命令:1grep -v "unix" example.txt输出:Hello World GREP is powerful递归搜索要在目录 mydir 及其子目录中的所有文件中搜索包含 "error" 的行,可以使用以下命令:1grep -r "error" mydir/
-
LKVS 介绍 Linux内核验证套件(LKVS)是英特尔内核组开发的一款面向Linux内核测试的综合测试工具集。目前已在openEuler社区开源。它汇聚了英特尔内核开发和验证团队多年积累的专业知识,具有专业性轻量级、低耦合、高覆盖三大特点,可广泛应用于Linux系统开发和验证的多个场景。 高覆盖测试内容 1. 全面测试范围 LKVS集成了600余项测试用例,覆盖Linux内核的20余项关键特性,测试领域涉及CPU特性、电源管理和安全特性等方面。具体来说包括这些英特尔平台的功能: CET(Control flow Enhancement Technology),cstate,Intel_TH(Trace Hub),Intel_PT,UMIP(User-Mode Instruction Prevention),xsave,IFS(In Field Scan),FRED (in progress),guest-test,IFS,ISST,PMU,RAPL,SDSI,splitlock,tdx-compliance,thermal,CPU topology,UFS,AMX。 2. 深入测试覆盖 测试内容高度专业,紧跟英特尔当下开发中的新平台、新功能,能够有效覆盖到关键内核路径和硬件集成细节,挖掘异常并提高稳定性。 3. 持续扩展测试 LKVS套件从上线开始,就不断在迭代更新中。通过涵盖广泛的专业测试内容,LKVS能够有效保证Linux环境在英特尔平台上的健壮性,发现新的或者留存的隐患和异常。 灵活解耦的测试框架 1. 解耦组件设计 LKVS是从大量内部功能测试、回滚测试框架中解耦并独立出来的测试用例。最大程度降低了测试用例的耦合度,使得测试用例更易于移植和扩展。可以方便地集成至各类基础设施比如openEuler社区的EulerPipeLine(CI/CD)系统。 2. 多语言测试脚本 测试套件支持C语言、bash、python等语言编写测试用例。因为各个功能测试之间相互独立,使得各个不同的功能测试之间零耦合,使其对开发者更友好,易于贡献测试用例。 通过这种可扩展可定制的低耦合架构,有利于LKVS的长期演进。 丰富的场景应用 LKVS可广泛服务于以下关键场景: 1. CI/CD集成检验 自动化测试减少集成风险,提高质量管控水平; 2. 基线功能验证 充分覆盖基线功能,成熟度评估; 3. 硬件兼容性 验证最新硬件特性,避免兼容性问题; 4. 安全审计 主动发掘和减轻安全隐患; 5. 回归测试 定位修补程序和版本升级可能引入的问题。 后续规划 本项目已开源在openEuler社区,并且已经集成到EulerPipeLine系统中,计划中的开发: ● 支持将要发布的新平台的新功能。 ● 支持新的内核特性。 ● 进一步完善框架本身,提高测试用例的可扩展性和可移植性。 ● 完善虚拟机测试场景,多虚拟机测试场景。 LKVS是结合Linux Kernel专业知识而产出的工程化测试集,可广泛应用于Linux系统开发和验证的多个场景。其专业性、低耦合和高覆盖等特点为生态中的众多参与方创造了价值。
上滑加载中