• [交流吐槽] 第一章-环境配置
    # OpenHarmony 开发环境搭建 ## WSL + VSCode + DevEco 我并没有使用华为官方推荐的 Windows + Ubuntu 虚拟机开发的方式,因为我觉得过于繁琐,索性我就直接用微软的 WSL2 直接安装了 DevEco Device Tool,配合 Windows Terminal 使用,还是很舒服的,但是我不知道为什么华为默认只支持了 Bash,还不能修改默认安装位置?作为有文件洁癖的我的解压了官方安装包,修改了里面的安装脚本,还把默认支持的 Shell 从 `/bin/sh` 改为了 `/usr/bin/zsh`,这样就很舒服了。 然后就是初始化、编译一把梭了,结果出现了以下问题。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20227/17/1658035367799215219.png) Google 之后发现,原来是缺少了 [gn](https://github.com/timniederhausen/gn)(GN 是一个用来生成 Ninja 构建文件的工具),没啥好说的,再下载编译一下 gn 就行了。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20227/17/1658035387591629965.png) 结果还是报错: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20227/17/1658035413732213275.png) 这个问题我就没那么多时间陪你慢慢解决了,索性我直接换用了 Docker。希望华为自己也能优化一下这些工具的配置,简化繁琐的流程,同时也要给予开发者足够的个性化(只支持 Bash 这合适吗?)。 ## Docker 先搜索一下有没有官方镜像,看来是有的,就是可能有点老了。另外需要注意的是它的 tag 不是 `latest`,而是 `0.0.3`。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20227/17/1658035428419253135.png) 那就直接 pull 下来就好了,然后直接 run 一下容器就行了,另外还在里面配置了 ssh。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20227/17/1658035445682324873.png) 初始化、编译一个项目试试。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20227/17/1658035457066710484.png) OK,看来是没问题了,算是搭建好了吧。
  • [技术干货] sqlserver linux 2019设置端口【转载】
    sql server 2019 for linux 的默认端口为1433,今天突然想改端口.在ubuntu下用以前的老命令 sudo /opt/mssql/bin/mssql-conf set tcpport 1435 报错设置“tcpport”不受支持(The setting 'tcpport' is not supported.)。若要更改端口,按方法步骤运行命令即可:1.使用“network.tcpport”的“set”命令以根用户身份运行 mssql-conf 脚本:sudo /opt/mssql/bin/mssql-conf set network.tcpport <new_tcp_port>2.重启 SQL Server 服务:sudo systemctl restart mssql-server假如将tcp端口设置为1435,则终端运行sudo /opt/mssql/bin/mssql-conf set network.tcpport 1435.结果如图:以上就是【sqlserver linux 2019设置端口】的全部内容了转载https://www.home1024.com/article/sqlserver-linux-2019-change-port.html
  • [技术干货] Linux下使用vsftp搭建FTP服务器(附参数说明)【转载】
    本章主要介绍在Linux中搭建FTP服务器的过程,需要掌握的要点是配置文件的合理配置,需要的朋友可以参考下介绍本章主要介绍在Linux中搭建FTP服务器的过程,需要掌握的要点是配置文件的合理配置。知识点在linux中使用的FTP是vsftpFTP可以有三种登入方式分别是:• 匿名登录方式:不需要用户密码• 本地用户登入:使用本地用户和密码登入• 虚拟用户方式:也是使用用户和密码登入,但是该用户不是linux中创建的用户安装FTP使用YUM安装yum -y install vsftpd文件配置安装完之后在/etc/vsftpd/路径下会存在三个配置文件。vsftpd.conf: 主配置文件ftpusers: 指定哪些用户不能访问FTP服务器,这里的用户包括root在内的一些重要用户。user_list: 指定的用户是否可以访问ftp服务器,通过vsftpd.conf文件中的userlist_deny的配置来决定配置中的用户是否可以访问,userlist_enable=YES ,userlist_deny=YES ,userlist_file=/etc/vsftpd/user_list 这三个配置允许文件中的用户访问FTP。查看主配置文件的默认配置cat /etc/vsftpd/vsftpd.conf |grep -v '^#';anonymous_enable=YES #允许匿名用户local_enable=YES #允许使用本地用户账号登陆write_enable=YES #允许ftp用户写数据connect_from_port_20=YES #通过20端口传输数据anonymous_enable=YESlocal_enable=YESwrite_enable=YESlocal_umask=022dirmessage_enable=YESxferlog_enable=YESconnect_from_port_20=YESxferlog_std_format=YESlisten=YESpam_service_name=vsftpdtcp_wrappers=YESchroot_local_user=yes其它的一些参数说明包括:ftpd_banner=welcome to ftp service :设置连接服务器后的欢迎信息idle_session_timeout=60 :限制远程的客户机连接后,所建立的控制连接,在多长时间没有做任何的操作就会中断(秒)data_connection_timeout=120 :设置客户机在进行数据传输时,设置空闲的数据中断时间accept_timeout=60 设置在多长时间后自动建立连接connect_timeout=60 设置数据连接的最大激活时间,多长时间断开,为别人所使用;max_clients=200 指明服务器总的客户并发连接数为200max_per_ip=3 指明每个客户机的最大连接数为3local_max_rate=50000(50kbytes/sec) 本地用户最大传输速率限制anon_max_rate=30000匿名用户的最大传输速率限制pasv_min_port=端口pasv-max-prot=端口号 定义最大与最小端口,为0表示任意端口;为客户端连接指明端口;listen_address=IP地址 设置ftp服务来监听的地址,客户端可以用哪个地址来连接;listen_port=端口号 设置FTP工作的端口号,默认的为21local_root=path 无论哪个用户都能登录的用户,定义登录帐号的主目录, 若没有指定,则每一个用户则进入到个人用户主目录;chroot_local_user=yes/no 是否锁定本地系统帐号用户主目录(所有);锁定后,用户只能访问用户的主目录/home/user;chroot_list_enable=yes/no 启用不锁定用户在主目录的名单chroot_list_file=/etc/vsftpd/chroot_list指定列表文件userlist_enable=YES/NO 是否加载用户列表文件;userlist_deny=YES 表示上面所加载的用户允许登录;userlist_file=/etc/vsftpd/user_list 指定列表文件创建FTP连接用户创建用户ftpuseruseradd ftpusr设置用户只能ftp不能登入usermod -s /sbin/nologin ftpuser设置用户密码passwd ftpusr用户的默认的家目录在/home下,当前用户就只能访问家目录。修改用户的家目录位/mntusermod -d /mnt ftpuser启动FTP服务service vsftpd start测试在/mnt目录下创建一个测试文件touch /mnt/test连接ftp解决普通的FTP无法登入问题linux默认是带安全机制,使用普通的ftp 21端口无法连接到ftp服务器,使用sftp就可以。这个时候需要关闭selinux,修改配置文件需要重启服务器。vim /etc/sysconfig/selinux改成selinux=disabled不重启服务器的方法:setenforce 0setenforce 1 :设置SELinux 成为enforcing模式setenforce 0 :设置SELinux 成为permissive模式查看SELinux状态/usr/sbin/sestatus -v转载自https://www.jb51.net/article/159200.htm
  • [技术干货] 中国第一个桌面操作系统openKylin根社区诞生
    6月24日,openKylin社区正式发布,这也是中国首个桌面操作系统根社区。openKylin社区旨在以“共创”为核心,在开源、自愿、平等、协作的基础上,通过开源、开放的社区合作,构建桌面操作系统顶级开源社区。openKylin社区基于麒麟软件数十年的操作系统研发成果、十多年的开源社区开发和建设经验,联合国家工信安全中心、普华基础软件、中科方德、麒麟信安、凝思软件、一铭软件、中兴新支点、元心科技、中国电科32所、技德系统、北京麟卓、先进操作系统创新中心等产业同行,共同建设。中国工程院沈昌祥院士、倪光南院士、桂卫华院士、郑纬民院士、王耀南院士、廖湘科院士,中国科学院王怀民院士等科学巨匠,均受邀出席发布会并致辞,都高度肯定了openKylin社区对于中国发展开源技术的战略意义,呼吁更多的行业伙伴加入,携手打造“产业主导、平台自主、技术先进、生态丰富”的桌面操作系统根社区。发布会上,openKylin社区为麒麟软件有限公司等首批13家理事会成员单位颁发了证书。openKylin社区理事长朱晨表示,建设openKylin的初心,就是打破瓶颈、推动我国Linux开源技术及其软硬件生态繁荣发展,希望有更多的企业和开发者加入进来,一起将openKylin打造成世界顶级的开源社区。所谓根社区,是指基于Linux内核和其他开源组件而构建,不依赖上游发行版的社区。受国际形势的影响,开源生态现在也开始有了国界,SUSE、RedHat、Ubuntu就纷纷对俄罗斯企业停止支持和提供专业服务。越来越多的事实证明,开源不等于无国界,也不等于绝对安全。麒麟操作系统一般指银河麒麟。银河麒麟(KylinOS)原是在“863计划”和国家核高基科技重大专项支持下,国防科技大学研发的操作系统,后由国防科技大学将品牌授权给天津麒麟,后者在2019年与中标软件合并为麒麟软件有限公司,继续研制的Linux操作系统。2002年,银河麒麟作为863计划的项目启动,由国防科技大学研发;2006年银河麒麟初版完成。整合了mach、FreeBSD、Linux、Windows四种系统的优势。2009年,国家“核高基”重大专项启动,银河麒麟继续迭代,银河麒麟3.0开始使用Linux作为内核。图片中标麒麟的前身COSIX Linux(中软Linux)由中国计算机软件与技术服务总公司开发(注意与1989年同为中软开发的独立类UNIX操作系统COSIX系统不同)。最初发布于1999年[11] 。2004年2月,中标普华Linux 1.0(NeoShine)发布。2010年12月16日中标普华Linux和国防科技大学的银河麒麟合并为中标麒麟。2014年12月,天津麒麟成立,继承银河麒麟品牌。2020年4月8日,中标软件和天津麒麟合并,共同开发银河麒麟和中标麒麟。文章来源:https://www.cnbeta.com/articles/tech/1284807.htm
  • [技术干货] Linus Torvalds:最庆幸的是 30 年后,Linux 不是一个“死”项目[转载]
    在从事 Linux 工作30年后,Linus Torvalds 仍然对他创造的开源操作系统及其未来的创新前景充满热情。今天,Linux 操作系统是云计算、边缘计算、嵌入式和物联网(IoT)技术的基础,使数十亿设备的运行成为可能。Linux 是一个由众多贡献者参与的开源社区开发的,每 6-10 周发布更新一次核心的版本,称为 Linux 内核。每个新的主要内核更新都是由 Torvalds 本人发布的。不久前,Torvalds 与他的老朋友 Dirk Hohndel(目前是 Cardano 基金会的首席开源官)进行了关于 Linux 现状的谈话。谈话内容包括开源安全状况、新技术和疫情对 Linux 发展的影响。在2022年开源峰会活动上发言Torvalds 指出,毫无疑问,新冠疫情对 Linux 社区的许多人产生了负面影响。然而,这种消极影响并没有影响 Linux 的开发。“在各种封锁的头几个月,我们的生产力实际上还提升了,因为我们可以通过通过电子邮件工作,而且大多数人都在居家办公”,Torvalds 说道。枯燥的 Linux 内核开发过程是如何进行的据 Torvalds 说,至少在过去 15 年里,Linux 内核的开发过程一直保持着相对不变的状态。2005 年,Torvalds 创建了开源的 Git 版本控制系统,以帮助实现更快、更优化的开发方法。今天,Git 是所有开源开发背后的主要技术之一,为 GitHub 代码服务等提供动力。“我们有相同的流程和相同的发布时间表,从这点上来说,内核开发一直是按部就班的,看起来并不令人兴奋,而这正是我认为大家所想要的”,Torvalds 说道,“大家希望有一个稳定的开发过程,这样人们就不会对所有基础设施的变化感到不安。”虽然开发过程是枯燥和可预测的,但 Torvalds 说,在从事 Linux 工作 30 多年后,他仍然感到惊讶和高兴,因为有许多新东西进入了 Linux 内核,使其完成了许多创新。Torvalds 说:“我个人最庆幸的事情之一就是 Linux 没有变成一个死项目。”Rust 即将进入 Linux在物理世界中,当金属上出现锈迹时,通常是年龄和腐烂的标志,但“Rust”(中文直译为铁锈)被纳入 Linux 的情况却并非如此。在即将到来的 Linux 的变化中,包括了用开源的 Rust 编程语言编写的代码。Torvalds 说,Rust 可能会被纳入下一个 Linux 内核版本。此前,Linux 大多是用 C 编程语言编写的。Rust 与 C 语言不同,它能更好地利用和保护计算内存资源。但 Torvalds 也表示,Linux 内核打算尝试 Rust 的方式比较有限。他表示,25 年前,Linux 内核也曾反对过使用 C++ 编程语言的想法,这一努力最终以失败告终。Torvalds 表示,技术人员希望做一些新的和有趣的事情,而他认为有时在技术上“少折腾”也有很大的意义。开源安全永远不会是 100%安全是最近开源社区经常讨论的话题,特别是在各种开源峰会活动中。Linux 基金会的 OpenSSF(开源安全基金会)最近透露,它将花费 1.5 亿美元来保护开源软件的安全。之前也有相关的开源报告指出,人们对开源安全总体上缺乏信心。Torvalds 并不指望包括 Linux 内核在内的开源软件能够 100% 安全和没有漏洞。Torvalds 说:“错误会发生,如果它们不发生在硬件上,就会发生在软件上,如果它们不发生在你的软件上,就会发生在别人的软件上。试图做好安全工作的唯一方法是构建多层安全防御措施。”Torvalds 还强调,Linux 内核只是整个应用堆栈中的一层。他解释说,在内核内部,已经有多个安全层,用于程序的不同部分。对于正在构建整个应用堆栈的开发者来说,堆栈中的每一层都需要有一些安全概念,仔细想想,如果有安全漏洞该怎么办,如果开发者正在开发的应用代码的上一层或下一层有漏洞该怎么办。“任何认为能做到 100% 安全的人,或许都活在理想世界里,而这并不现实。”Torvalds 说道。————————————————版权声明:本文为CSDN博主「开源头条」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/csdnopensource/article/details/125440047
  • [技术干货] 【Linux】之【内存】相关的命令&amp;&amp;解析以及内存相关的问题[free......[转载]
    一、内存相关命令1、free – 显示系统内存使用量情况free命令的功能是显示系统内存使用量情况,包含物理和交换内存的总量、使用量和空闲量情况。语法格式free [参数]1常用参数参数    解析-b    以Byte显示内存使用情况-k    以kb为单位显示内存使用情况-m    以mb为单位显示内存使用情况-g    以gb为单位显示内存使用情况-s    持续显示内存-t    显示内存使用总合-h    以易读的单位方式显示内存使用情况参考实例以默认的容量单位显示内存使用量信息:[root@root ~]# free              total        used        free      shared  buff/cache   availableMem:       65353144     8354168    53956676       39716     3042300    56522796Swap:             0           0           0以MB位单位显示内存使用量信息:[root@root ~]# free -m              total        used        free      shared  buff/cache   availableMem:          63821        8154       52696          38        2971       55202Swap:             0           0           0以易读的单位显示内存使用量信息:[root@root ~]# free -h              total        used        free      shared  buff/cache   availableMem:            62G        8.0G         51G         38M        2.9G         53GSwap:            0B          0B          0B以易读的单位显示内存使用量信息,每个10秒刷新一次:[root@root ~]# free -hs 10              total        used        free      shared  buff/cache   availableMem:            62G        8.0G         51G         38M        2.9G         53GSwap:            0B          0B          0B              total        used        free      shared  buff/cache   availableMem:            62G        8.0G         51G         38M        2.9G         53GSwap:            0B          0B          0B字段解析#total:物理内存大小,就是机器实际的内存#used:已使用的内存大小,这个值包括了cached和应用程序实际使用的内存#free:未被使用的内存大小(俗称:空闲内存)#shared:共享内存大小,是进程间通信的一种方式#buffers:被缓冲区占用的内存大小#cached:被缓存占用的内存大小2、cat /proc/meminfomeminfo中包含所有的内存相关信息。[root@root ~]# cat /proc/meminfo MemTotal:       65353144 kBMemFree:        53956672 kBMemAvailable:   56523144 kBBuffers:           49180 kBCached:          2889216 kBSwapCached:            0 kBActive:          7603092 kBInactive:        2691064 kBActive(anon):    7356648 kBInactive(anon):    38800 kBActive(file):     246444 kBInactive(file):  2652264 kBUnevictable:           0 kBMlocked:               0 kBSwapTotal:             0 kBSwapFree:              0 kBDirty:                36 kBWriteback:             0 kBAnonPages:       7360372 kBMapped:           764500 kBShmem:             39684 kBSlab:             306384 kBSReclaimable:     104216 kBSUnreclaim:       202168 kBKernelStack:       22464 kBPageTables:        30644 kBNFS_Unstable:          0 kBBounce:                0 kBWritebackTmp:          0 kBCommitLimit:    32676572 kB #系统中可以申请的虚拟内存最大值Committed_AS:   27883644 kB #系统已经申请的虚拟内存VmallocTotal:   34359738367 kBVmallocUsed:      525916 kBVmallocChunk:   34325372924 kBHardwareCorrupted:     0 kBAnonHugePages:   4573184 kBCmaTotal:              0 kBCmaFree:               0 kBHugePages_Total:       0HugePages_Free:        0HugePages_Rsvd:        0HugePages_Surp:        0Hugepagesize:       2048 kBDirectMap4k:      771124 kBDirectMap2M:    11393024 kBDirectMap1G:    56623104 kB二、内存相关问题1、内存泄漏解析:如果程序运行过程中不能正常回收不用的内存,那么一段时间就会导致内存增长很高,最终导致系统不可以用,这种情况称为内存泄漏。内存泄漏可以使用内存分享工具valgrind进行内存分析。[root@root ~]# yum -y install valgrind[root@root ~]# valgrind --tool=memcheck  ./mem_leak -t==1738== Memcheck, a memory error detector==1738== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.==1738== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info==1738== Command: ./mem_leak -t==1738== ==1738== ==1738== HEAP SUMMARY:==1738==     in use at exit: 4 bytes in 1 blocks==1738==   total heap usage: 1 allocs, 0 frees, 4 bytes allocated==1738== ==1738== LEAK SUMMARY:==1738==    definitely lost: 4 bytes in 1 blocks==1738==    indirectly lost: 0 bytes in 0 blocks==1738==      possibly lost: 0 bytes in 0 blocks==1738==    still reachable: 0 bytes in 0 blocks==1738==         suppressed: 0 bytes in 0 blocks==1738== Rerun with --leak-check=full to see details of leaked memory==1738== ==1738== For counts of detected and suppressed errors, rerun with: -v==1738== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)2、虚拟内存、物理内存内存的最小单位为页(paging),默认情况一页是4K。虚拟内存与物理内存  当进程向操作系统申请10G内存时,操作系统收到请求后先进行自我检查,经过分析后决定给予进程10G内存空间,但是系统此时并没有真正给进程10G,系统会判断进程运行实际需要的内存大小,比如该进程需要300M就够用了,所以系统只划分300M内存给进程运行,这种实际分配的内存称为物理内存。[root@root ~]# ps aux|head -1USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND#VSZ 虚拟内存#RSS 物理内存3、内存溢出内存溢出(out of memory,OOM),当进程运行向系统申请内存时,系统没有更多的进程分配给该进程了,就会出现内存溢出。内存溢出后系统会杀掉系统中的一些进程来释放内存,通常OOM Killer杀死的都是占用内存较多的服务,直到内存够用为止,所以内存溢出的直观现象通常是某些服务异常或宕机。当发生内存溢出后可以通过dmesg命令或者通过/var/log/messages来快速确定。[root@root ~]# dmesg |tail -5[ 3613.796390] [ 1277]     0  1277    28983        1      16      217             0 bash[ 3613.796393] [ 1446]     0  1446    29003        0      16      221             0 bash[ 3613.796395] [ 1546]     0  1546   774216   213712    1439   513149             0 python[ 3613.796396] Out of memory: Kill process 1546 (python) score 912 or sacrifice child[ 3613.796422] Killed process 1546 (python) total-vm:3096864kB, anon-rss:854848kB, file-rss:0kB, shmem-rss:0kB[root@root ~]# cat /proc/sys/vm/panic_on_oom [root@root ~]# echo 1 > /proc/sys/vm/panic_on_oompanic_on_oom该参数的值共有三个选项:0是触发oom killer进行杀进程处理(/proc/sys/vm/oom_kill_allocating_task默认值为0,结束占用内存多的进程;如果设置为1,就杀死当前申请内存的进程)2是直接触发kernel panic(类似于Windows的蓝屏),此时系统开发人员可以连接进行debug,但是对其他人并没有什么用。更多希望系统快速重启(/proc/sys/kernel/panic设置多少秒后重启)1是根据不同情况会有不同处理;4、Overcommit一般情况下,进程并不会一次用光申请的内存,所以操作系统为了提高内存使用率,会向进程“超卖”内存,以便能响应更多的进程内存申请。但是为了保证程序的稳定运行,系统并不会无限制响应内存申请,这样可以防止内存申请过多,导致系统本身内存空间不足而无法正常运行。Linux系统中使用OverCommit的方式控制内存的申请。内核参数overcommit_memory 内存分配策略可选值:0、1、2。0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,引发OOM。1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。2, 表示内核不允许进程申请超过系统设置大小的内存空间。在这种模式下,系统设置的可申请内存空间大小为:Swap+RAM*(“/proc/sys/vm/overcommit_ratio”/100)说明:/proc/sys/vm/overcommit_ratio就是系统最大可以分配内存的百分比,默认是50.总结 相关文章【Linux】之【CPU】相关的命令及解析[lscpu、mpstat]【Linux】之【内存】相关的命令&&解析以及内存相关的问题[free、meminfo、内存泄漏、内存溢出、Overcommit]【Linux】之【磁盘】相关的命令及解析[df、du、iostat、iotop]【Linux】之【网络】相关的命令及解析[ethtool、nload、nethogs、iftop、iptraf、ifstat]【Linux】综合性命令及解析【top、htop、vmstat、dstat、glances、sar】【Linux】系统如何查看服务器带宽及网络使用情况原文链接:https://blog.csdn.net/liu_chen_yang/article/details/125146057
  • [技术干货] 在 Linux 中调试程序执行的 Strace 示例[转载]
    链接:https://bbs.huaweicloud.com/blogs/354287Strace 是一个调试工具,可以帮助您解决问题。Strace 监控特定程序的系统调用和信号。当您没有源代码并想调试程序的执行时,它会很有帮助。strace 为您提供二进制文件从头到尾的执行顺序。本文解释了 7 个 strace 示例以帮助您入门。1. 跟踪可执行文件的执行您可以使用 strace 命令来跟踪任何可执行文件的执行。以下示例显示了 Linux ls 命令的 strace 输出。$ strace ls execve("/bin/ls", ["ls"], [/* 21 vars */]) = 0 brk(0) = 0x8c31000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) mmap2(NULL, 8192, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb78c7000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=65354, ...}) = 0 ... ... ...2. 使用选项 -e 跟踪可执行文件中的特定系统调用默认情况下,strace 显示给定可执行文件的所有系统调用。要仅显示特定的系统调用,请使用 strace -e 选项,如下所示。$ strace -e open ls open("/etc/ld.so.cache", O_RDONLY) = 3 open("/lib/libselinux.so.1", O_RDONLY) = 3 open("/lib/librt.so.1", O_RDONLY) = 3 open("/lib/libacl.so.1", O_RDONLY) = 3 open("/lib/libc.so.6", O_RDONLY) = 3 open("/lib/libdl.so.2", O_RDONLY) = 3 open("/lib/libpthread.so.0", O_RDONLY) = 3 open("/lib/libattr.so.1", O_RDONLY) = 3 open("/proc/filesystems", O_RDONLY|O_LARGEFILE) = 3 open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3 open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3 Desktop Documents Downloads examples.desktop libflashplayer.so Music Pictures Public Templates Ubuntu_OS Videos上面的输出只显示了 ls 命令的 open 系统调用。在 strace 输出的末尾,它还显示 ls 命令的输出。如果要跟踪多个系统调用,请使用“-e trace=”选项。以下示例显示了 open 和 read 系统调用。$ strace -e trace=open,read ls /home open("/etc/ld.so.cache", O_RDONLY) = 3 open("/lib/libselinux.so.1", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\3\3\1\260G004"..., 512) = 512 open("/lib/librt.so.1", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\3\3\1\300\30004"..., 512) = 512 .. open("/lib/libattr.so.1", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\3\3\1\360\r004"..., 512) = 512 open("/proc/filesystems", O_RDONLY|O_LARGEFILE) = 3 read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 315 read(3, "", 1024) = 0 open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3 open("/home", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3 bala3. 使用选项 -o 将跟踪执行保存到文件以下示例将 strace 输出存储到 output.txt 文件。$ strace -o output.txt ls Desktop Documents Downloads examples.desktop libflashplayer.so Music output.txt Pictures Public Templates Ubuntu_OS Videos $ cat output.txt execve("/bin/ls", ["ls"], [/* 37 vars */]) = 0 brk(0) = 0x8637000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) mmap2(NULL, 8192, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7860000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=67188, ...}) = 0 ... ...4. 使用选项 -p 在正在运行的 Linux 进程上执行 Strace您可以使用进程 ID 在已经运行的程序上执行 strace。首先,使用ps 命令识别程序的 PID 。例如,如果要对当前正在运行的 firefox 程序执行 strace,请确定 firefox 程序的 PID。$ ps -C firefox-bin PID TTY TIME CMD 1725 ? 00:40:50 firefox-bin使用如下所示的 strace -p 选项来显示给定进程 ID 的 strace。$ sudo strace -p 1725 -o firefox_trace.txt $ tail -f firefox_trace.txt现在 firefox 进程的执行跟踪将被记录到 firefox_trace.txt 文本文件中。您可以跟踪此文本文件以查看 firefox 可执行文件的实时跟踪。当您的用户 ID 与给定进程的用户 ID 不匹配时,Strace 将显示以下错误。$ strace -p 1725 -o output.txt attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted Could not attach to process. If your uid matches the uid of the target process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try again as the root user. For more details, see /etc/sysctl.d/10-ptrace.conf5. 使用选项 -t 打印每个跟踪输出行的时间戳要打印每个 strace 输出行的时间戳,请使用选项 -t,如下所示。$ strace -t -e open ls /home 20:42:37 open("/etc/ld.so.cache", O_RDONLY) = 3 20:42:37 open("/lib/libselinux.so.1", O_RDONLY) = 3 20:42:37 open("/lib/librt.so.1", O_RDONLY) = 3 20:42:37 open("/lib/libacl.so.1", O_RDONLY) = 3 20:42:37 open("/lib/libc.so.6", O_RDONLY) = 3 20:42:37 open("/lib/libdl.so.2", O_RDONLY) = 3 20:42:37 open("/lib/libpthread.so.0", O_RDONLY) = 3 20:42:37 open("/lib/libattr.so.1", O_RDONLY) = 3 20:42:37 open("/proc/filesystems", O_RDONLY|O_LARGEFILE) = 3 20:42:37 open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3 20:42:37 open("/home", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3 bala6. 使用选项 -r 打印系统调用的相对时间Strace 还可以选择打印每个系统调用的执行时间,如下所示。$ strace -r ls 0.000000 execve("/bin/ls", ["ls"], [/* 37 vars */]) = 0 0.000846 brk(0) = 0x8418000 0.000143 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 0.000163 mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb787b000 0.000119 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) 0.000123 open("/etc/ld.so.cache", O_RDONLY) = 3 0.000099 fstat64(3, {st_mode=S_IFREG|0644, st_size=67188, ...}) = 0 0.000155 mmap2(NULL, 67188, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb786a000 ... ...7.使用选项-c生成系统调用的统计报告使用选项 -c,strace 为执行跟踪提供有用的统计报告。以下输出中的“调用”列指示了该特定系统调用执行了多少次。$ strace -c ls /home bala % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- -nan 0.000000 0 9 read -nan 0.000000 0 1 write -nan 0.000000 0 11 open -nan 0.000000 0 13 close -nan 0.000000 0 1 execve -nan 0.000000 0 9 9 access -nan 0.000000 0 3 brk -nan 0.000000 0 2 ioctl -nan 0.000000 0 3 munmap -nan 0.000000 0 1 uname -nan 0.000000 0 11 mprotect -nan 0.000000 0 2 rt_sigaction -nan 0.000000 0 1 rt_sigprocmask -nan 0.000000 0 1 getrlimit -nan 0.000000 0 25 mmap2 -nan 0.000000 0 1 stat64 -nan 0.000000 0 11 fstat64 -nan 0.000000 0 2 getdents64 -nan 0.000000 0 1 fcntl64 -nan 0.000000 0 2 1 futex -nan 0.000000 0 1 set_thread_area -nan 0.000000 0 1 set_tid_address -nan 0.000000 0 1 statfs64 -nan 0.000000 0 1 set_robust_list ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000000 114 10 total
  • [技术干货] 【故障注入第十九期】Linux OS相关故障-文件系统(中期)
    大家好,这一期我们接上期内容,小编在整理材料过程中,发现分两期来讲,内容有点多,故分为上、中、下三期向大家介绍,这是第二期,一起继续学习如何使用DemonCAT注入文件系统方面的故障,还支持哪些场景,怎么操作呢?一起来看下吧。文件系统卸载挂死 所有文件卸载挂死 目录卸载忙文件丢失系统文件句柄耗尽文件损坏文件块损坏这一期关于DemonCAT注入文件系统故障方法我们就先介绍到这,下一期我们继续,敬请期待~
  • [技术干货] Linux驱动开发_倒车影像项目介绍[转载]
    原文链接:https://bbs.huaweicloud.com/blogs/353235倒车影像项目模拟: 汽车中控台---倒车影像。组成部分:1.​ LCD屏: 实时显示摄像头采集的数据。2.​ 摄像头: 放在车尾,采集图像传输给LCD屏进行显示。3.​ 倒车雷达: 超声波测距--->测量车尾距离障碍物的距离。4.​ 蜂鸣器: 根据倒车雷达测量的距离,控制频率。1.1 超声波测距模块声波测距: 已知声音在空气中传播的速度。​ 硬件接线:ECHO------->GPX1_0 (开发板第9个IO口): 中断引脚----->检测回波----输入TRIG ------->GPB_7 (开发板第8个IO口): 输出触发信号。1.2 PWM方波控制蜂鸣器​ PWM方波:​ 内核自带的PWM方波驱动1.3 UVC免驱摄像头编程框架: V4L2编程的框架: v4l2--->全称: video4linux2V4L2 : 针对UVC免驱USB设备设计框架。专用于USB摄像头的数据采集。免驱 : 驱动已经成为标准,属于内核自带源码的一部分。V4L2框架本身注册的也是字符设备,设备节点: /dev/videoXV4L2 框架: 提供ioctl接口,提供了有很多命令,可以通过这些命令对摄像头做配置。比如: 输出的图像尺寸,输出图像格式(RGB、YUV、JPG),申请采集数据的缓冲区。​ 配置摄像头采集队列步骤:Mmap函数映射。超声波驱动读取距离:#include <linux/kernel.h> #include <linux/module.h> #include <linux/miscdevice.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include <linux/irq.h> #include <linux/delay.h> #include <linux/workqueue.h> #include <linux/gpio.h> #include <mach/gpio.h> #include <plat/gpio-cfg.h> #include <linux/timer.h> #include <linux/wait.h> #include <linux/sched.h> #include <linux/poll.h> #include <linux/fcntl.h> #include <linux/interrupt.h> #include <linux/ktime.h> static unsigned int distance_irq; /*存放中断号*/ static u32 *GPB_DAT=NULL; static u32 *GPB_CON=NULL; static u32 distance_time_us=0; /*表示距离的时间*/ /* 工作队列处理函数: */ static void distance_work_func(struct work_struct *work) { u32 time1,time2; time1=ktime_to_us(ktime_get()); /*获取当前时间,再转换为 us 单位*/ /*等待高电平时间结束*/ while(gpio_get_value(EXYNOS4_GPX1(0))){} time2=ktime_to_us(ktime_get()); /*获取当前时间,再转换为 us 单位*/ distance_time_us=time2-time1; //printk("us=%d\n",time2-time1); /*us/58=厘米*/ } /*静态方式初始化工作队列*/ static DECLARE_WORK(distance_work,distance_work_func); /* 中断处理函数: 用于检测超声波测距的回波 */ static irqreturn_t distance_handler(int irq, void *dev) { /*调度工作队列*/ schedule_work(&distance_work); return IRQ_HANDLED; } static void distance_function(unsigned long data); /*静态方式定义内核定时器*/ static DEFINE_TIMER(distance_timer,distance_function,0,0); /*内核定时器超时处理函数: 触发超声波发送方波*/ static void distance_function(unsigned long data) { static u8 state=0; state=!state; /*更改GPIO口电平*/ if(state) { *GPB_DAT|=1<<7; } else { *GPB_DAT&=~(1<<7); } /*修改定时器的超时时间*/ mod_timer(&distance_timer,jiffies+msecs_to_jiffies(100)); } static int distance_open(struct inode *inode, struct file *file) { return 0; } #define GET_US_TIME 0x45612 static long distance_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long argv) { u32 *us_data=(u32*)argv; int err; u32 time_us=distance_time_us; switch(cmd) { case GET_US_TIME: err=copy_to_user(us_data,&time_us,4); if(err!=0)printk("拷贝失败!\n"); break; } return 0; } static int distance_release(struct inode *inode, struct file *file) { return 0; } /*定义文件操作集合*/ static struct file_operations distance_fops= { .open=distance_open, .unlocked_ioctl=distance_unlocked_ioctl, .release=distance_release }; /*定义杂项设备结构体*/ static struct miscdevice distance_misc= { .minor=MISC_DYNAMIC_MINOR, .name="tiny4412_distance", .fops=&distance_fops }; static int __init tiny4412_distance_dev_init(void) { int err; /*1. 映射GPIO口地址*/ GPB_DAT=ioremap(0x11400044,4); GPB_CON=ioremap(0x11400040,4); *GPB_CON&=~(0xF<<4*7); *GPB_CON|=0x1<<4*7; /*配置输出模式*/ /*2. 根据GPIO口编号,获取中断号*/ distance_irq=gpio_to_irq(EXYNOS4_GPX1(0)); /*3. 注册中断*/ err=request_irq(distance_irq,distance_handler,IRQ_TYPE_EDGE_RISING,"distance_device",NULL); if(err!=0)printk("中断注册失败!\n"); else printk("中断:超声波测距驱动安装成功!\n"); /*4. 修改定时器超时时间*/ mod_timer(&distance_timer,jiffies+msecs_to_jiffies(100)); /*杂项设备注册*/ misc_register(&distance_misc); return 0; } static void __exit tiny4412_distance_dev_exit(void) { /*5. 注销中断*/ free_irq(distance_irq,NULL); /*6. 停止定时器*/ del_timer(&distance_timer); /*7. 取消IO映射*/ iounmap(GPB_DAT); iounmap(GPB_CON); /*注销杂项设备*/ misc_deregister(&distance_misc); printk("中断:超声波测距驱动卸载成功!\n"); } module_init(tiny4412_distance_dev_init); module_exit(tiny4412_distance_dev_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("tiny4412 wbyq");摄像头代码,读取摄像头画面:#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ioctl.h> #include <poll.h> #include <signal.h> #include <unistd.h> #include <fcntl.h> #include <poll.h> #include <signal.h> #include <pthread.h> #include <linux/videodev2.h> #include <stdlib.h> #include <sys/mman.h> #include <string.h> #include "framebuffer.h" #define PWM_DEVICE "/dev/pwm" /*PWM方波设备文件*/ #define DISTANCE_DEVICE "/dev/tiny4412_distance" /*超声波测距设备文件*/ #define UVC_VIDEO_DEVICE "/dev/video15" /*UVC摄像头设备节点*/ #define GET_US_TIME 0x45612 /*获取超声波测量的距离: ioctl命令*/ #define PWM_IOCTL_SET_FREQ 1 /*控制PWM方波频率: ioctl命令*/ #define PWM_IOCTL_STOP 0 /*停止PWM方波输出: ioctl命令*/ int distance_fd; /*超声波设备的文件描述符*/ int pwm_fd; /*PWM方波设备的文件描述符*/ int uvc_video_fd; /*UVC摄像头设备文件描述符*/ int Image_Width; /*图像的宽度*/ int Image_Height; /*图像的高度*/ unsigned char *video_memaddr_buffer[4]; /*存放摄像头映射到进程空间的缓冲区地址*/ /* 函数功能: 用户终止了进程调用 */ void exit_sighandler(int sig) { //停止PWM波形输出,关闭蜂鸣器 ioctl(pwm_fd,PWM_IOCTL_STOP,0); close(pwm_fd); close(distance_fd); exit(1); } /* 函数功能: 读取超声波数据的线程 */ void *distance_Getpthread_func(void *dev) { /*1. 打开PWM方波驱动*/ pwm_fd=open(PWM_DEVICE,O_RDWR); if(pwm_fd<0) //0 1 2 { printf("%s 设备文件打开失败\n",PWM_DEVICE); /*退出线程*/ pthread_exit(NULL); } /*2. 打开超声波测距设备*/ distance_fd=open(DISTANCE_DEVICE,O_RDWR); if(distance_fd<0) //0 1 2 { printf("%s 设备文件打开失败\n",DISTANCE_DEVICE); /*退出线程*/ pthread_exit(NULL); } /*3. 循环读取超声波测量的距离*/ struct pollfd fds; fds.fd=distance_fd; fds.events=POLLIN; int data; while(1) { poll(&fds,1,-1); ioctl(distance_fd,GET_US_TIME,&data); printf("距离(cm):%0.2f\n",data/58.0); data=data/58; if(data>200) /*200厘米: 安全区域*/ { //停止PWM波形输出,关闭蜂鸣器 ioctl(pwm_fd,PWM_IOCTL_STOP,0); } else if(data>100) /*100厘米: 警告区域*/ { printf("警告区域!\n"); ioctl(pwm_fd,PWM_IOCTL_SET_FREQ,2); } else /*小于<100厘米: 危险区域*/ { printf(" 危险区域!\n"); ioctl(pwm_fd,PWM_IOCTL_SET_FREQ,10); } //ioctl(pwm_fd,PWM_IOCTL_SET_FREQ,pwm_data); /*倒车影像: 测距有3个档位*/ } } /* 函数功能: UVC摄像头初始化 返回值: 0表示成功 */ int UVCvideoInit(void) { /*1. 打开摄像头设备*/ uvc_video_fd=open(UVC_VIDEO_DEVICE,O_RDWR); if(uvc_video_fd<0) { printf("%s 摄像头设备打开失败!\n",UVC_VIDEO_DEVICE); return -1; } /*2. 设置摄像头的属性*/ struct v4l2_format format; memset(&format,0,sizeof(struct v4l2_format)); format.type=V4L2_BUF_TYPE_VIDEO_CAPTURE; /*表示视频捕获设备*/ format.fmt.pix.width=800; /*预设的宽度*/ format.fmt.pix.height=480; /*预设的高度*/ format.fmt.pix.pixelformat=V4L2_PIX_FMT_YUYV; /*预设的格式*/ format.fmt.pix.field=V4L2_FIELD_ANY; /*系统自动设置: 帧属性*/ if(ioctl(uvc_video_fd,VIDIOC_S_FMT,&format)) /*设置摄像头的属性*/ { printf("摄像头格式设置失败!\n"); return -2; } Image_Width=format.fmt.pix.width; Image_Height=format.fmt.pix.height; printf("摄像头实际输出的图像尺寸:x=%d,y=%d\n",format.fmt.pix.width,format.fmt.pix.height); if(format.fmt.pix.pixelformat==V4L2_PIX_FMT_YUYV) { printf("当前摄像头支持YUV格式图像输出!\n"); } else { printf("当前摄像头不支持YUV格式图像输出!\n"); return -3; } /*3. 请求缓冲区: 申请摄像头数据采集的缓冲区*/ struct v4l2_requestbuffers req_buff; memset(&req_buff,0,sizeof(struct v4l2_requestbuffers)); req_buff.count=4; /*预设要申请4个缓冲区*/ req_buff.type=V4L2_BUF_TYPE_VIDEO_CAPTURE; /*视频捕获设备*/ req_buff.memory=V4L2_MEMORY_MMAP; /*支持mmap内存映射*/ if(ioctl(uvc_video_fd,VIDIOC_REQBUFS,&req_buff)) /*申请缓冲区*/ { printf("申请摄像头数据采集的缓冲区失败!\n"); return -4; } printf("摄像头缓冲区申请的数量: %d\n",req_buff.count); /*4. 获取缓冲区的详细信息: 地址,编号*/ struct v4l2_buffer buff_info; memset(&buff_info,0,sizeof(struct v4l2_buffer)); int i; for(i=0;i<req_buff.count;i++) { buff_info.type=V4L2_BUF_TYPE_VIDEO_CAPTURE; /*视频捕获设备*/ buff_info.memory=V4L2_MEMORY_MMAP; /*支持mmap内存映射*/ if(ioctl(uvc_video_fd,VIDIOC_QUERYBUF,&buff_info)) /*获取缓冲区的详细信息*/ { printf("获取缓冲区的详细信息失败!\n"); return -5; } /*根据摄像头申请缓冲区信息: 使用mmap函数将内核的地址映射到进程空间*/ video_memaddr_buffer[i]=mmap(NULL,buff_info.length,PROT_READ|PROT_WRITE,MAP_SHARED,uvc_video_fd,buff_info.m.offset); if(video_memaddr_buffer[i]==NULL) { printf("缓冲区映射失败!\n"); return -6; } } /*5. 将缓冲区放入采集队列*/ memset(&buff_info,0,sizeof(struct v4l2_buffer)); for(i=0;i<req_buff.count;i++) { buff_info.type=V4L2_BUF_TYPE_VIDEO_CAPTURE; /*视频捕获设备*/ buff_info.index=i; /*缓冲区的节点编号*/ buff_info.memory=V4L2_MEMORY_MMAP; /*支持mmap内存映射*/ if(ioctl(uvc_video_fd,VIDIOC_QBUF,&buff_info)) /*根据节点编号将缓冲区放入队列*/ { printf("根据节点编号将缓冲区放入队列失败!\n"); return -7; } } /*6. 启动摄像头数据采集*/ int Type=V4L2_BUF_TYPE_VIDEO_CAPTURE; if(ioctl(uvc_video_fd,VIDIOC_STREAMON,&Type)) { printf("启动摄像头数据采集失败!\n"); return -8; } return 0; } /* 函数功能: 将YUV数据转为RGB格式 函数参数: unsigned char *yuv_buffer: YUV源数据 unsigned char *rgb_buffer: 转换之后的RGB数据 int iWidth,int iHeight : 图像的宽度和高度 */ void yuv_to_rgb(unsigned char *yuv_buffer,unsigned char *rgb_buffer,int iWidth,int iHeight) { int x; int z=0; unsigned char *ptr = rgb_buffer; unsigned char *yuyv= yuv_buffer; for (x = 0; x < iWidth*iHeight; x++) { int r, g, b; int y, u, v; if (!z) y = yuyv[0] << 8; else y = yuyv[2] << 8; u = yuyv[1] - 128; v = yuyv[3] - 128; r = (y + (359 * v)) >> 8; g = (y - (88 * u) - (183 * v)) >> 8; b = (y + (454 * u)) >> 8; *(ptr++) = (r > 255) ? 255 : ((r < 0) ? 0 : r); *(ptr++) = (g > 255) ? 255 : ((g < 0) ? 0 : g); *(ptr++) = (b > 255) ? 255 : ((b < 0) ? 0 : b); if(z++) { z = 0; yuyv += 4; } } } int main(int argc,char **argv) { int data; /*1. 注册将要捕获的信号*/ signal(SIGINT,exit_sighandler); /*2. 创建线程: 采集超声波测量的距离*/ pthread_t threadID; pthread_create(&threadID,NULL,distance_Getpthread_func,NULL); pthread_detach(threadID); //设置分离属性 /*3. 初始化摄像头*/ UVCvideoInit(); /*4. 初始化LCD屏*/ framebuffer_Device_init(); /*5. 循环采集摄像头的数据*/ struct pollfd fds; fds.fd=uvc_video_fd; fds.events=POLLIN; struct v4l2_buffer buff_info; memset(&buff_info,0,sizeof(struct v4l2_buffer)); int index=0; /*表示当前缓冲区的编号*/ unsigned char *rgb_buffer=NULL; /*申请空间:存放转换之后的RGB数据*/ rgb_buffer=malloc(Image_Width*Image_Height*3); if(rgb_buffer==NULL) { printf("RGB转换的缓冲区申请失败!\n"); exit(0); } while(1) { /*1. 等待摄像头采集数据*/ poll(&fds,1,-1); /*2. 取出一帧数据: 从采集队列里面取出一个缓冲区*/ buff_info.type=V4L2_BUF_TYPE_VIDEO_CAPTURE; /*视频捕获设备*/ ioctl(uvc_video_fd,VIDIOC_DQBUF,&buff_info); /*从采集队列取出缓冲区*/ index=buff_info.index; //printf("采集数据的缓冲区的编号:%d\n",index); /*3. 处理数据: YUV转RGB\显示到LCD屏*/ //video_memaddr_buffer[index]; /*当前存放数据的缓冲区地址*/ /*3.1 将YUV数据转为RGB格式*/ yuv_to_rgb(video_memaddr_buffer[index],rgb_buffer,Image_Width,Image_Height); /*3.2 将RGB数据实时刷新到LCD屏幕上*/ framebuffer_DisplayImages((800-Image_Width)/2,0,Image_Width,Image_Height,rgb_buffer); /*4. 将缓冲区再次放入采集队列*/ buff_info.memory=V4L2_MEMORY_MMAP; /*支持mmap内存映射*/ buff_info.type=V4L2_BUF_TYPE_VIDEO_CAPTURE; /*视频捕获设备*/ buff_info.index=index; /*缓冲区的节点编号*/ ioctl(uvc_video_fd,VIDIOC_QBUF,&buff_info); /*根据节点编号将缓冲区放入队列*/ } return 0; }
  • [其他] Linux根目录利用率高,找不到占用空间文件
    **关键词:根目录满、根目录使用率高、根目录大文件找不到** 【现象】 巡检发现集群一个节点根目录占用率高,现场排查未能找到占用空间的文件。 【案例排查】 1. 集群节点根目录df –h,根目录878G占用643G,现场du计算大约有150g左右,大约有500g文件找不到。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/9/1652079031764904460.png) 2. 执行lsof | grep delete 查找被删除打开中的文件,发现/var/chroot/MRS/test_hf.log 文件大小534457784196/1024/1024/1024=497.75g,与期望文件大小相匹配。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/9/1652079386367311809.png) 3. 查看/var/chroot/MRS 路径发现log确实已经被删除。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/9/1652079689640261830.png) 4. 根据占用文件进程PID 8734找到对应进程,ps –ef | grep 8734,发现/opt/dws/tmp下一个.sh脚本运行中打开了log文件。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/9/1652079816162695142.png) 5. 查找对应的执行脚本,发现已被删除。 6. 在确认该脚本已无实际用途后,kill -9 8734,杀掉占用文件进程即可释放空间。 【根因】 1. 执行中脚本为死循环脚本,脚本被删除,生成log文件被删除,但未kill脚本进程。 2. 在linux中,当我们使用rm在linux上删除了大文件,但是,如果有进程打开了这个大文件,却没有关闭这个文件的句柄,那么:linux内核还是不会释放这个文件的磁盘空间,最后造成磁盘空间占用率高。
  • [技术干货] Linux系统下gcc命令使用详解
    大家好,本篇文章主要讲的是Linux系统下gcc命令使用详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览目录• 一.预处理 • 二. 编译 • 三.汇编 • 四.链接 1.gcc的安装(以Ubuntu为例) sudo apt-get install build-essential安装完后可以通过 gcc --version 查看版本。让我们在通过gcc编译可执行文件的过程中掌握其基础应用。准备: 先在当前目录下 使用vim新建一个.c文件 例如 666.c1$ vim 666.c(vim的使用可在我的另一篇博客有详细的叙述,这里不多在赘述)插入一段代码。12345678910#include <stdio.h>main(){    int a,i;    a=6;    for(i=0;i<3;i++)    {        printf("%d",a);    }}  (每次我们用 cat 查看)一.预处理1.预处理通过对宏定义(像#define)进行展开,对头文件(像 stdio.h)进行展开,对条件进行(像ifdef)编译,展开所有宏,删除所有注释(像"//").预处理cpp把源代码,头文件预编成一个.i文件。(注意这时并不检查语法,所以即使有语法错误也不会报错。)  2.命令:1$ gcc -E (源文件名) -o (预处理文件名)或者:1$ gcc (源文件名) > (预处理文件名)  例如按666.c 来说,预处理时可以是 :  gcc -E 666.c -o 666.i  也可以是 gcc 666.c > 666.i二. 编译   1.编译也就是检查语法是否错误,将预处理过的文件编译成汇编文件。   2.命令:1$ gcc -S (源文件) -o (汇编文件)  例如 gcc -S 666.i -o 666.s三.汇编1. 汇编也就是将汇编文件生成目标文件(二进制文件)通过汇编,文本代码变成了二进制代码。(二进制代码文件以.o为后缀名)。2.命令:1$ gcc -c (汇编文件) -o (目标文件)例如 gcc -c 666.s -o 666.o(这时候因为是二进制文件了,所以会乱码)四.链接1. 链接找到依赖的库文件(静态与动态),将目标文件链接为可执行程序。1$ gcc -c [目标文件] -o [可执行程序] -l[动态库名]假如没有动态库的话(一般)直接1$ gcc -c [目标文件] -o [可执行程序] 例如 gcc -c 666.o -o 666此时会生成可执行程序 666如果想执行使用该命令:1$ ./可执行程序其中./是在当前目录下的意思。例如 ./666(注意:在一般我们使用时 如果使用 gcc 可执行文件名,会默认生成a.out 可执行文件,这时我们直接执行它时用 ./a.out )转载自https://www.jb51.net/article/233584.htm
  • [技术干货] Linux系统中.bash_profile文件详解
    大家好,本篇文章主要讲的是Linux系统中.bash_profile文件详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览目录• 一. 环境变量$PATH: • 二. 修改环境变量: • 三.bash_profile的用途 •  总结 一. 环境变量$PATH:Linux是一个多用户操作系统,每个用户都有自己专有的运行环境。用户所使用的环境由一系列变量所定义,这些变量被称为环境变量。系统环境变量通常都是大写的。每个用户都可以根据需要修改自己的环境变量,以达到自己的使用要求。常见的环境变量如下表:在Shell下通过 美元符号$来引用环境变量,使用echo命令可以查看某个具体 环境变量的值。例如,查看PATH的值:1echo $PATH通过使用 env 或者 printenv 命令可以查看 系统全部 的环境变量 设置以下显示 env 命令的结果(局部):1234567TERM=xtermSHELL=/bin/bashUSER=leoPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/gamesHOME=/home/leoLANGUAGE=zh_CN:zh:en_US:enLOGNAME=leo二. 修改环境变量:登录用户可以根据需要修改和设置环境变量。Linux 下修改环境变量,既可以在终端通过 Shell 命令修改,也可以通过修改系统的配置文件来进行。2.1 修改系统配置文件(推荐)修改系统配置文件,可以达到永久改变环境变量的目的。修改某个配置文件后,在 Shell 下运行该文件即可使新的设置生效,或者重新登录使用新的变量。运行文件可用source 文件的方式操作,例如:1source ~/.bash_profile通常 修改 全局配置文件 /etc/profile 或者 用户配置文件 ~/.bashrc(有的发行版上为 ~/.bash_profile)文件:例如:1PATH=$PATH:$HOME/bin具体见解如下:$HOME这个代码是一个环境变量,它代表的是当前登录的用户的主文件夹的意思。(就是家目录的那个)$HOME/bin这个代码指的就是主文件夹下的bin子目录,代表的是文件夹的内部子目录。(注意不是根目录的那个)PATH=$PATH:$HOME/bin这个代码是设置PATH环境变量,设置环境变量用等号,:冒号是分割符。在Windows上添加环境变量用;分号分割,往后面追加。同理,在Mac上用:冒号分割,往后追加。$PATH:$HOME/bin表示在保留原来的$PATH环境变量的基础上,再增加$HOME/bin这个路径作为新的$PATH环境变量。计算机中的变量有许多,主要应用于系统文件的管理方面。注意:路径环境变量为PATH,但是引用的时候前面加一个$,即$PATH2.2 临时设置通过 Shell 命令设置 环境变量,常用于 临时设置 环境变量,一旦关闭当前终端或者新开一个终端,所设置的环境变量都将丢失。可以直接用 等号(=)为变量赋值,或者用 export 命令为变量赋值,用法:1变量 = $变量:新增变量值#方式1export 变量 = $变量:新增变量值#方式2例如:图片新增加的变量值既可以放在变量原有值的末尾( 变 量 : 新 增 变 量 值 ) , 也 可 以 放 在 原 有 变 量 值 的 开 头 ( 新 增 变 量 值 : 变量:新增变量值),也可以放在原有变量值的开头(新增变量值: 变量:新增变量值),也可以放在原有变量值的开头(新增变量值:变量)。三.bash_profile的用途在.bash_profile中常用于配置环境变量和用户一些自定义别名等, 总结到此这篇关于Linux系统中.bash_profile文件详解的文章就介绍到这了转载自https://www.jb51.net/article/233589.htm
  • [技术干货] Linux编译LVGL仿真器出错问题解决
    大家好,本篇文章主要讲的是Linux编译LVGL仿真器出错问题解决,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览目录• 一、错误现象 • 二、错误分析 • 三、错误解决 一、错误现象我在虚拟机下使用 LVGL 仿真器,编译仿真器源代码时发生报错1234567891011121314151617181920212223242526cc: error: unrecognized command line option ‘-Wshift-negative-value'cc: error: unrecognized command line option ‘-Wshift-negative-value'cc: error: unrecognized command line option ‘-Wshift-negative-value'Building project file: lvgl/examples/widgets/chart/lv_example_chart_6.cMakefile:45: recipe for target 'build/obj/lvgl/examples/widgets/list/lv_example_list_1.o' failedmake: *** [build/obj/lvgl/examples/widgets/list/lv_example_list_1.o] Error 1make: *** 正在等待未完成的任务....Makefile:45: recipe for target 'build/obj/lvgl/examples/widgets/spinner/lv_example_spinner_1.o' failedmake: *** [build/obj/lvgl/examples/widgets/spinner/lv_example_spinner_1.o] Error 1Makefile:45: recipe for target 'build/obj/lvgl/examples/widgets/led/lv_example_led_1.o' failedmake: *** [build/obj/lvgl/examples/widgets/led/lv_example_led_1.o] Error 1cc: error: unrecognized command line option ‘-Wshift-negative-value'Makefile:45: recipe for target 'build/obj/lvgl/examples/widgets/textarea/lv_example_textarea_3.o' failedmake: *** [build/obj/lvgl/examples/widgets/textarea/lv_example_textarea_3.o] Error 1cc: error: unrecognized command line option ‘-Wshift-negative-value'Makefile:45: recipe for target 'build/obj/lvgl/examples/widgets/textarea/lv_example_textarea_2.o' failedmake: *** [build/obj/lvgl/examples/widgets/textarea/lv_example_textarea_2.o] Error 1cc: error: unrecognized command line option ‘-Wshift-negative-value'cc: error: unrecognized command line option ‘-Wshift-negative-value'Makefile:45: recipe for target 'build/obj/lvgl/examples/widgets/textarea/lv_example_textarea_1.o' failedmake: *** [build/obj/lvgl/examples/widgets/textarea/lv_example_textarea_1.o] Error 1Makefile:45: recipe for target 'build/obj/lvgl/examples/widgets/checkbox/lv_example_checkbox_1.o' failedmake: *** [build/obj/lvgl/examples/widgets/checkbox/lv_example_checkbox_1.o] Error 1cc: error: unrecognized command line option ‘-Wshift-negative-value'Makefile:45: recipe for target 'build/obj/lvgl/examples/widgets/chart/lv_example_chart_6.o' failedmake: *** [build/obj/lvgl/examples/widgets/chart/lv_example_chart_6.o] Error 1编译无法进行二、错误分析根据提示分析错误,其中 cc: error 提示报错,翻到 Makefile 一看属于 gcc 编译器unrecognized command line option ‘-Wshift-negative-value’ 提示无法识别指令,所以分析应该是 GCC 版本的原因,可能我的版本不支持这个指令,解决的方式就是换版本,或者删掉这个指令看能不能正常运行三、错误解决这里我先试试删除指令再编译,先用 grep 找到指令在文件的哪一行1grep -n "\-Wshift\-negative\-value" Makefile编辑文件,删除对应指令1vim make file保存后程序编译编译成功,执行 demo,可以正常执行:转载自https://www.jb51.net/article/233714.htm
  • [技术干货] Linux和GNU系统的关系详解
    大家好,本篇文章主要讲的是Linux和GNU系统的关系详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览目录每天都在运行的Linux系统其实是?Linux内核 和 GNU 系统简介Linux内核 和 GNU 系统之间的关系详解总结每天都在运行的Linux系统其实是?今天广泛使用的 GNU 版本通常被称为“Linux”,而它的许多用户并不知道 它基本上是由GNU 项目开发的 GNU 系统 。Linux内核 和 GNU 系统简介确实有一个 Linux,这些人正在使用它,但它只是他们使用的系统的一部分。Linux 是内核:系统中的程序,它将机器的资源分配给您运行的其他程序。内核是操作系统的重要组成部分,但它本身毫无用处;它只能在完整操作系统的上下文中运行。Linux 通常与 GNU 操作系统结合使用:整个系统基本上是 GNU 加上 Linux,或 GNU/Linux。所有所谓的“Linux”发行版实际上都是 GNU/Linux 的发行版。许多用户不了解内核(Linux)与整个系统(他们也称为“Linux”)之间的区别。名称的模糊使用无助于人们理解。这些用户往往认为,Linus Torvalds 在 1991 年开发了整个操作系统,有一点帮助。Linux内核 和 GNU 系统之间的关系详解程序员一般都知道Linux是一个内核。但是,由于他们通常也听说过整个系统也被称为“Linux”,因此他们经常设想一段历史,可以证明以内核命名整个系统是合理的。例如,许多人认为,一旦 Linus Torvalds 完成 Linux 内核的编写,其用户就会四处寻找其他免费软件,并发现(无特殊原因)制作类 Unix 系统所需的大多数东西都已经可用的。他们的发现并非偶然——它是不完全完整的 GNU 系统。可用的自由软件加起来就是一个完整的系统,因为 GNU 项目自 1984 年以来就一直在努力制作一个。在GNU 宣言中,我们提出了开发一个自由的类 Unix 系统的目标,称为 GNU。GNU 项目的 初始公告还概述了 GNU 系统的一些原始计划。到 Linux 启动时,GNU 几乎完成了。大多数自由软件项目的目标是为特定工作开发特定程序。例如,Linus Torvalds 着手编写类 Unix 内核 (Linux);Donald Knuth 着手编写文本格式化程序 (TeX);Bob Scheifler 着手开发一个窗口系统(X Window System)。用来自项目的特定程序来衡量这种项目的贡献是很自然的。如果我们试图以这种方式衡量 GNU 项目的贡献,我们会得出什么结论?一家 CD-ROM 供应商发现,在他们的“Linux 发行版”中,GNU 软件是最大的单一队伍,约占总源代码的 28%,其中包括一些必不可少的主要组件,没有这些组件就没有系统。Linux 本身约占 3%。(2008 年的比例相似:在 gNewSense 的“主”存储库中,Linux 为 1.5%,GNU 软件包为 15%。)因此,如果您要根据谁在系统中编写程序来为系统选择一个名称,最合适的单一选择是“GNU”。但这并不是考虑这个问题的最深层次的方法。GNU 项目不是,也不是开发特定软件包的项目。这不是一个开发 C 编译器的项目,尽管我们这样做了。虽然我们开发了一个文本编辑器,但它不是一个开发文本编辑器的项目。GNU 计划着手开发一个完整的自由类 Unix 系统:GNU。许多人为系统中的自由软件做出了重大贡献,他们的软件都值得称赞。但它之所以是一个集成系统——而不仅仅是一组有用程序的集合——是因为 GNU 项目着手将它变成一个系统。我们列出了制作完整免费系统所需的程序清单,我们系统地查找、编写或找人编写清单上的所有内容。我们编写了必不可少但乏味的 [1]组件,因为没有它们您就无法拥有一个系统。我们的一些系统组件,即编程工具,自己在程序员中流行起来,但我们编写了许多不是工具的组件 [2]. 我们甚至开发了一个国际象棋游戏 GNU Chess,因为一个完整的系统也需要游戏。到 90 年代初,除了内核之外,我们已经将整个系统组装在一起。我们还启动了一个内核,即 GNU Hurd,它运行在 Mach 之上。开发这个内核比我们预期的要困难得多; GNU Hurd 于 2001 年开始可靠地工作,但距离让人们普遍使用还有很长的路要走。幸运的是,由于 Linux,我们不必等待 Hurd。Torvalds 在 1992 年解放了 Linux,它填补了 GNU 系统的最后一个主要缺口。然后人们可以 将 Linux 与 GNU 系统结合起来,形成一个完整的自由系统——一个也包含 Linux 的 GNU 系统版本。换句话说,GNU/Linux 系统。让他们很好地协同工作并非易事。一些 GNU 组件 [3]需要大量更改才能与 Linux 一起使用。将一个完整的系统集成为一个“开箱即用”的发行版也是一项艰巨的工作。它需要解决如何安装和引导系统的问题——我们还没有解决这个问题,因为我们还没有达到那个点。因此,开发各种系统发行版的人做了很多必不可少的工作。但是,就事物的性质而言,这是肯定会由某人完成的工作。GNU工程支持GNU / Linux系统,以及在GNU系统。该FSF资金的Linux相关的扩展,GNU C库的改写,所以,现在他们已完全融入,以及最新的GNU / Linux系统中使用当前版本的库没有变化。FSF 还资助了 Debian GNU/Linux 的早期开发阶段。今天有许多不同的 GNU/Linux 系统变体(通常称为“发行版”)。它们中的大多数都包含非自由程序——它们的开发人员遵循与 Linux 相关的“开源”哲学,而不是GNU的 “自由软件”哲学。但也有 完全免费的 GNU/Linux 发行版。FSF 支持其中一些的计算机设施。制作免费的 GNU/Linux 发行版不仅仅是消除各种非自由程序的问题。现在,通常的 Linux 版本也包含非自由程序。这些程序旨在在系统启动时加载到 I/O 设备中,它们以一长串数字的形式包含在 Linux 的“源代码”中。因此,维护免费的 GNU/Linux 发行版现在也需要维护Linux的免费版本。无论您是否使用 GNU/Linux,请不要混淆使用“Linux”这个名称来混淆公众。Linux 是内核,是系统必不可少的主要组件之一。整个系统基本上是GNU系统,加入了Linux。当您谈论这种组合时,请称其为“GNU/Linux”。
  • [技术干货] Zookeeper linux 服务端集群搭建步骤
    所需准备工作,创建三台虚拟机环境并安装好 java 开发工具包 JDK,可以使用 VM 或者 vagrant+virtualbox 搭建 centos/ubuntu 环境,本案例基于宿主机 windows10 系统同时使用 vagrant+virtualbox 搭建的 centos7 环境,如果直接使用云服务器或者物理机同理。骤一:准备三台 zookeeper 环境和并按照上一教程下载 zookeeper 压缩包,三台集群 centos 环境如下:机器一:192.168.3.33提示: 查看 ip 地址可以用 ifconfig 命令。步骤二:别修改 zoo.cfg 配置信息zookeeper 的三个端口作用1、2181 : 对 client 端提供服务2、2888 : 集群内机器通信使用3、3888 : 选举 leader 使用按 server.id = ip:port:port 修改集群配置文件:三台虚拟机 zoo.cfg 文件末尾添加配置:server.1=192.168.3.33:2888:3888server.2=192.168.3.35:2888:3888server.3=192.168.3.37:2888:3888根据 id 和对应的地址分别配置 myidvim /tmp/zookeeper/myid本案例配置完成后查询显示如下:IP 192.168.3.33 机器配置 myid,因为这台机器上个教程单机启动过,所以出现 version-2,没有也没关系。步骤三:启动集群启动前需要关闭防火墙(生产环境需要打开对应端口)systemctl stop firewalld启动 192.168.3.33 并查看日志,此时日志出现报错是正常现象,因为另外两台还没启动,暂时连接不上。另两台分别启动后,查看三台机器状态:IP 192.168.3.33IP 192.168.3.35最后显示集群搭建成功!Mode:leader 代表主节点,follower 代表从节点,一主二从。