linux 常用汇总

843 阅读8分钟

批量修改文件名

# 修改后缀,将 .4.1.1 改为 .4.1
rename 's/\.4.1.1/\.4.1/' *  
# 修改前缀  
for i in `ls`; do mv -f $i `echo "text_"$i`; done

软链接间接链了多层

  • 查看软衔接对应的最终文件
    realpath 
    
  • 展示搜索最终文件的搜索树结构
    namei 
    

结合到上面命令把某个文件夹下的库文件(不要软连接,只找最终文件),拷贝到目标目录

参考:blog.csdn.net/cnboywll/ar…
所以命令

# nx 盒子上搞,把盒子上自带的一些库(比如libopencv_*)烤到运行容器里
# cp -t 选项,就是把[源] [目的] 做了个倒置
realpath /usr/lib/aarch64-linux-gnu/* | xargs cp -t ../libform_aarch64-linux-gnu/    
# xargs 分解出参数,说明成占位符(上述命令和这个都可以)  
realpath /usr/lib/aarch64-linux-gnu/* | xargs -I {} cp {} ../libform_aarch64-linux-gnu/

从后向前看文件内容

tac log.log | more
tac log.log | less

从本地拷文件到远程主机上

scp ./localfile zhi@192.168.0.158:/home/zhi/

从本地拷文件夹到远程主机上

scp ./localfilder  zhi@192.168.0.158:/home/zhi/

从远程拷到本地的逻辑刚好相反

Ubuntu下安装sysv-rc-conf报错:“E: Unable to locate package sysv-rc-conf“

(151条消息) Ubuntu下安装sysv-rc-conf报错:“E: Unable to locate package sysv-rc-conf“_willingtolove的博客-CSDN博客

root 用户修改密码

sudo passwd zhou

make 时报错 "两种办法解决 make: Warning: File "xxx" has modification time yyy s in the future 的问题"

(167条消息) 两种办法解决 make: Warning: File "xxx" has modification time yyy s in the future 的问题_(ÒωÓױ)-CSDN博客_has modification time

touch *  

wsl 的启动,与自启动WSL 服务自动启动的正确方法 - 知乎 (zhihu.com)

查看 cpu 核心数

  • 推荐
nproc
  • 方法二
# 关于grep和wc的用法请查询它们的手册或者网络搜索
$ grep 'model name' /proc/cpuinfo | wc -l

安装 flex

apt-get install flex bison

笔记本装ubuntu 18.04合上盖子会休眠,我不想它休眠:(51条消息) 【Ubuntu 休眠】设置合上笔记本盖子不休眠的方法_肖恭伟的博客-CSDN博客_ubuntu 合上盖子不休眠

编辑下列文件:sudo gedit /etc/systemd/logind.conf
#HandlePowerKey按下电源键后的行为,默认power off
#HandleSleepKey 按下挂起键后的行为,默认suspend
#HandleHibernateKey按下休眠键后的行为,默认hibernate
#HandleLidSwitch合上笔记本盖后的行为,默认suspend(改为ignore;即合盖不休眠)在原文件中,还要去掉前面的#

然后将其中的:
#HandleLidSwitch=suspend
改成下面,记得去掉“#”号:
HandleLidSwitch=ignore

最后重启服务

service systemd-logind restart

Ubuntu 20.04 永不锁屏,下面这个亲测可用

sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target

linux刚装机的设置

============================================================

  • 一般在切换root用户时会报 "su 认证失败"
    因为此时还没有root用户
    sudo passward root   
    
  • ifconfig命令
    sudo apy-get install net-tools
    
  • 当然也没装vim
    apt-get install vim
    
  • 一般也没装ssh server
    • 安装ssh
      sudo apt update
      sudo apt install openssh-server -y
      # 查看状态
      sudo systemctl status ssh   
      # 查看状态,可以看到 ssh 服务占用的端口号及ip  
      netstat -tlp
      # 如果你的防火墙开启了,使用下面语句
      sudo ufw allow ssh
      
    • 修改/etc/ssh/sshd_config 配置文件,允许远程登录(否则报错"Access Denied")
      # 允许远程登录      
      PermitRootLogin yes  
      # 开启端口  
      Port 22
      
    • 卸载 ssh
      www.yisu.com/ask/7255.ht…
    • ssh 自动掉线的处理办法
      解决SSH自动断线,无响应的问题。 - 简书 (jianshu.com)
  • centos安装man手册
    yum install man-pages
    

综上,一个新的linux机器可以先运行以下命令安装必要的工具

微信截图_20211228163701.png

  • 创建新用户,并在/home/下创建目录
    useradd -d /home/zhou -m zhou
    
  • 确保创建新用户也是使用的bash脚本
    usermod -s /bin/bash zhou  
    
  • 给新用户设置需要的密码
    passwd zhou
    
  • 查看文件夹及文件大小
    du -sh -BM * 
    
  • 拷贝文件不覆盖原有文件
    mv -u src dst 
    

linux 新磁盘添加上了,挂载磁盘

  • fdisk常用命令
    • n - 创建分区
    • p - 打印分区表
    • d - 删除一个分区
    • q - 不保存更改退出
    • w - 保存更改并退出
# 查看磁盘空间  
df -h  
# 切换root用户  
su 
#  显示和管理硬盘和分区
fdisk -l  

自己的机器:

设备        起点       末尾       扇区   大小 类型
/dev/sdc1   2048 1953523711 1953521664 931.5G Linux 文件系统


Disk /dev/sdb:931.5 GiB,1000204886016 字节,1953525168 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 4096 字节
I/O 大小(最小/最佳):4096 字节 / 4096 字节
磁盘标签类型:gpt
磁盘标识符:1CE91D9E-DE9E-41E8-8E88-60CB012534E1
#  操作该磁盘,为磁盘开辟分区
fdisk /dev/sdc 
# 键入n,新建分区  
n
# 键入p,创建主分区  
p
# 输入第一个扇区的大小。如果是一个新的磁盘,通常选择默认值。如果你是在同一个磁盘上创建第二个分区,我们需要在前一个分区的最后一个扇区的基础上加 1,推荐默认值  
2048
# 输入最后一个扇区或者分区大小的值。通常推荐输入分区的大小。总是添加前缀 + 以防止值超出范围错误。
+931.5 G
# 保存退出 
w
# 格式化
mkfs.ext4 /dev/sdc
# 挂载到/data目录下  
mount /dev/sdc /data
# 在 /etc/fstab 文件中添加条目以便永久启动时自动挂载。
/dev/sdc /data ext4 defaults 0 0

用户添加到 sudo 权限 is not in the sudoers file

#增加配置, 在打开的配置文件中,找到root ALL=(ALL) ALL, 在下面添加一行 #其中xxx是你要加入的用户名称 
vim /etc/sudoers 
zhou ALL=(ALL) ALL

Linux下为软件赋予root权限运行

  • 背景:有些绑定端口,ip的操作需要以root权限运行,避免手工下面这样
# 自动化,谁会在现场这么敲命令
sudo xx
  • 1 编写启动脚本StartMediaServer.sh
# StartMediaServer.sh
sudo chown root ./MediaServer
sudo ./MediaServer
  • 2 手工为启动脚本赋root权限
sudo chown root StartMediaServer.sh
  • 3 也可以一步到位,一个脚本搞定
#!/usr/bin/expect
spawn su root
expect "Password:"
send "xx\r"
send "cd /home/用户名/projects/ZLMediaKit/release/linux/Releas\r"
send "./MediaServer\r"
 
expect eof
exit 
  • 前提是要装expect
apt-get install expect

linux 查看环境变量, 设置系统环境变量,设置链接的动态库,及bin文件路径

  • 查看环境变量
    这个变量可以是被gcc命令引用的变量
    g++ -g -o ConnectSpecCamera ConnectSpecCamera.cpp -I../../../include -Wl,-rpath=$(MVCAM_COMMON_RUNENV)/aarch64 -L$(MVCAM_COMMON_RUNENV)/aarch64 -lMvCameraControl -lpthread
    那么打印出来就是下面,从此可用看这个变量具体的路径
    echo $MVCAM_COMMON_RUNENV
    
  • 设置加载的动态库
    • 一, 推荐(将.so所在的路径添加进系统搜索路径)
      查看链接配置文件,有以下反馈(若没有该文件,或没有该内容,则添加该文件,及该内容)

      root@NanoPi-M4v2:~# cat /etc/ld.so.conf
      include /etc/ld.so.conf.d/*.conf
      

      进入存放.conf文件的目录

      cd /etc/ld.so.conf.d
      

      编辑.conf文件, 并将.so所在的目录编辑进该文件(如下是内容)

      root@NanoPi-M4v2:/etc/ld.so.conf.d# cat LBAS.conf
      /opt/LBAS/lib/aarch64
      /opt/LBAS/bin
      

      更新

      sudo ldconfig
      
    • 二, 修改配置文件/etc/profile中的环境变量,这个挺有意思的,有个自定义的变量MVCAM_COMMON_RUNENV,是安装LBAS时添加的,自己也可以学到用这种方式,起到.pc文件的作用
      勘误,实际是修改/etc/bash.bashrc~/.bashrc文件,前面这么写是之前的无效的东西

      • 所有用户
        sudo vim /etc/bash.bashrc (推荐 亲测有效) 或者 sudo vim /etc/profile
      • 某用户的环境变量配置文件
        vim ~/.bashrc(推荐 亲测有效) 或者 vim ~/.bash_profile或者vim ~/.profile
      # 查看
      # 这个才是有效的,推荐
      cat /etc/bash.bashrc  
      # 对 profile 文件的操作实际无效
      cat /etc/profile
      # 反馈          
      export MVCAM_COMMON_RUNENV=/opt/LBAS/lib
      export LD_LIBRARY_PATH=/opt/LBAS/lib/aarch64:$LD_LIBRARY_PATH
      export PATH=$PATH:/opt/cmake-3.20.5-linux-aarch64/bin
      

      注意(对以上分析,可看出两个系统变量;bin环境变量,及LD_LIBRARY_PATH)

      LD_LIBRARY_PATH是系统的.so链接目录
      PATH是系统的bin文件目录
      分别对两者进行追加的语法,:起到分割符的作用 将它写进profile文件就是永久生效,命令行操作就是暂时的
      注意, = 两边不能有空格
      每项 : 间隔开, = 赋给变量, 变量取值用 $
      export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:[追加的路径]

      # = 两边不能有空格
      # 追加.so链接目录
      export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:[追加的路径]
      # 追加bin的执行目录
      export PATH=$PATH:/opt/cmake-3.20.5-linux-aarch64/bin      
      

      更新

      # 推荐  
      source /etc/bash.bashrc    
      source /etc/profile
      
  • bin文件添加到系统变量,以上方法二,编辑/etc/profile文件已示出

gcc 直接引用pkg-config,以及查看目标库的头文件及库文件有哪些,库文件编译有哪些模块;自定义安装时如何将安装的库目录,包含目录告诉系统

    - **注意,是`tab`键旁的``**,要先有`opencv.pc`的文件
```c
gcc -o main main.c `pkg-config --cflags --libs opencv` 
```  
  • 查看*.pc具体指向哪里
    # 查看头文件目录在哪  
    pkg-config --cflags opencv  
    # 查看库文件有哪些,具体在哪个目录下  
    pkg-config --libs opencv  
    
  • 查看编译得有哪些模块
    pkg-config --list-all opencv
    
  • 如果自定义安装(--prefix== )找到安装的那个*.pc,告诉系统链接的库文件,包含的头文件在哪
    vim ~/.bashrc  
    # 末尾追加  
    export LD_LIBRARY_PATH=[新添加的*.pc所在的路径]:$LD_LIBRARY_PATH      
    # 当然 source 更新一下  
    source ~/.bashrc  
    

用ldconfig来鉴别动态库目录下哪些库(.so)是有效的

  • 把要链接的库(动态库)目录的写进
    /etc/ld.so.conf.d
    
  • 然后ldconfig
    这个命令能鉴别出哪些.so是有效的,如果显示是链接符号的话,则要创建对应的软连接
  • 软链接参考:www.cnblogs.com/jing99/p/10…
  • 软链接命令:
    ln -sf 源文件 软链接的符号
    
  • 删除软链接
    rm -rf 软链接的符号  
    

给一些命令取别名

  • 参考: c.biancheng.net/linux/alias…
  • 编辑/root/.bashrcsource该文件
    /etc/bash.bashrc推荐
    /home/[用户名]/.bashrc亦可
    alias cls='printf "\033[2J\033[3J\033[1;1H"'
    
  • 删除指定文件夹下的全部文件
    alias rf='rm -rf ./*'  
    
  • 代替make clean的东西
    alias cmakeclean='rm -rf CMakeCache.txt CMakeFiles cmake_install.cmake Makefile'
    

linux 设置生成转储文件,设置生成路径

临时生效

  • 查看转储文件是否生成的命令ulimit -c
  • 编辑/etc/profile文件,允许生成core文件,编辑完后source
    ulimit -c unlimited  
    # 一 反馈如下,则是未设置,不生成 core 文件    
    0
    # 二 反馈如下则是允许生成 core 文件  
    unlimited
    
  • 使用如下命令,设置生成的目录,及文件命名格式
    echo "/[corefile path]/core-%e-%p-%t" > /proc/sys/kernel/core_pattern   
    # %e : 表示程序名添加到 core 文件中  
    # %p : 添加 pid 到 core 文件  
    # %t : 添加生成时间到 core 文件
    

永久生效

sudo vim /etc/bash.bashrc   
#  追加  
ulimit -S -c unlimited >/dev/null 2>&1  
# 定义了core文件的路径,注意,这个文件路径一定要有读写的权限    
echo "/home/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern    
# 切换到root用户,准备source    
su root
source /etc/bash.bashrc

编译 boost

Ubuntu20.10中安装boost 1.75库 - 腾讯云开发者社区-腾讯云 (tencent.com)

gcc 相关

源码编译gcc

  • 部分参考:升级GCC版本到11.1 - 知乎 (zhihu.com)
  • 下载源码
    git clone --branch releases/gcc-11.1.0 https://github.com/gcc-mirror/gcc.git
    
  • 配置下,下载相关依赖
    ./contrib/download_prerequisites  
    
  • 下载相关依赖,前置条件是要有 gcc 和 g++(因为新的gcc 也是由基础的 gcc 编的)
    apt-get install build-essential  
    apt-get install flex-devel
    apt-get install flex bison
    apt install zlib1g-dev  
    apt-get install gcc-multilib   
    find / -name crti*       
    export LIBRARY_PATH=/usr/lib32:$LIBRARY_PATH       
    
  • 配置
    ./configure --prefix=/usr/local/gcc-11.1.0 --enable-bootstrap --enable-languages=c,c++ --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib
    
  • make -j12 && make install

gdb 相关

  • 很有用的全局变量 errno 及函数 perror()
  • 调试gdb filename corename
  • gdb 设置捕获异常
    (gdb) help catch 
    Set catchpoints to catch events.
    
    List of catch subcommands:
    
    catch assert -- Catch failed Ada assertions
    catch catch -- Catch an exception
    catch exception -- Catch Ada exceptions
    catch exec -- Catch calls to exec
    catch fork -- Catch calls to fork
    catch handlers -- Catch Ada exceptions
    catch load -- Catch loads of shared libraries
    catch rethrow -- Catch an exception
    catch signal -- Catch signals by their names and/or numbers
    catch syscall -- Catch system calls by their names
    catch throw -- Catch an exception
    catch unload -- Catch unloads of shared libraries
    catch vfork -- Catch calls to vfork
    # 比如设置 
    catch catch    
    catch throw  
    
  • 命令bt查看调用堆栈
  • gdb 哪家强,值得看:www.zhihu.com/topic/19679…
  • gdb 给 string 赋值
    call str.assign("ok")
    
  • gdb stl美化
    blog.csdn.net/wj1066/arti…
    blog.csdn.net/witton/arti…
    github.com/gcc-mirror/…

尝试调试死锁

  • 首先要晓得进程的 pid
    ps -ef | grep [目标进程]       
    
  • 打印进程调用栈,看个大概,比如每次都是相同的线程阻塞了
    pstack 9527    
    
  • attach 到进程上调试,查看进程有哪些线程
    gdb attach 9527    
    info thread   
    
  • 根据线程号切换到线程中
    thread 2    
    
  • 打印线程的栈帧,如果需要的话扩大栈帧数
    // 尝试打印栈变量,栈上没有  
    p cc   
    frame 3    
    
  • 打印栈变量,查看状态
    // 再来打印栈变量及相关数据结构,打印 mutex 会显示它被谁持有      
    p cc
    p cc->mutex1   
    
  • 离开某个进程
    dettach 9527      
    

cgdb ubuntu安装

  • 仓库在我的码云上
  • 预先安装
    sudo apt-get install texinfo -y
    sudo apt-get install libncurses5-dev
    # 上面这个应该才是对的,下面这个应该多余  
    sudo apt-get install libncursesw5-dev
    sudo apt-get install libreadline-dev  
    
  • 配置文件:
    vim ~/.cgdb/cgdbrc    
    
  • 快捷键 r --> f5, c--> f6, finish --> f7, n--> f8, s--> f10
  • cgdb 中文手册:nowjava.com/docs/cgdb/c…

源码编译 glibc

# 准备工作
sudo apt-get install gawk 
# 可能会装这个  
sudo apt-get install bison  
wget https://mirrors.sjtug.sjtu.edu.cn/gnu/glibc/glibc-2.26.tar.gz  
mkdir build  
cd build  
../configure --perfix=/opt/glibc2.26   
make -j12 

一个很牛批的打包脚本和启动脚本

抄袭自:ubuntu16.04 利用Docker 部署C++ Gui项目(OpenCV PCL动态库集成) - zzc_bjergsen - 博客园 (cnblogs.com)

  • 打包脚本已经验证过了
    • ldd.sh
      function useage()
      {
          cat << EOU
      Useage: bash $0 <path to the binary> <path to copy the dependencies>
      EOU
      exit 1
      }
      
      #Validate the inputs
      [[ $# < 2 ]] && useage
      
      #Check if the paths are vaild
      [[ ! -e $1 ]] && echo "Not a vaild input $1" && exit 1
      [[ -d $2 ]] || echo "No such directory $2 creating..."&& mkdir -p "$2"
      
      #Get the library dependencies
      echo "Collecting the shared library dependencies for $1..."
      deps=$(ldd $1 | awk 'BEGIN{ORS=" "}$1\
      ~/^\//{print $1}$3~/^\//{print $3}'\
       | sed 's/,$/\n/')
      echo "Copying the dependencies to $2"
      
      #Copy the deps
      for dep in $deps
      do
          echo "Copying $dep to $2"
          cp "$dep" "$2"
      done
      
      echo "Done!"
      
    • 使用
      ldd.sh yourexe(可执行文件) des_path(目标文件夹)  
      
    • 这个打包脚本牛批在于将链接对应的源文件也打包下来,只是名字仍沿用原来的链接名,到目标机器上后改下目标机器的环境变量
      sudo vim /etc/bash.bashrc  
      # 追加变量
      export LD_LIBRARY_PATH=/home/zhima/projects/RailTrackPatrol:$LD_LIBRARY_PATH  
      # 更新环境变量
      source /etc/profile      
      
  • 启动脚本run.sh 注意,脚本最后一行要适应改成自己的软件名字
    path_curr=$(cd `dirname $0`; pwd)
    #dirname $0,取得当前执行的脚本文件的父目录
    #cd `dirname $0`,进入这个目录(切换当前工作目录)
    #pwd,显示当前工作目录(cd执行后的)
    
    # add share lib path to system
    export PATH="${path_curr}:$PATH"
    export LD_LIBRARY_PATH="${path_curr}:$LD_LIBRARY_PATH"
    
    # print for debug
    #echo $LD_LIBRARY_PATH
    #ldd ./main
    
    # execute
    ./yourexename $prama1 $prama2 $3prama3
    # $0 $1 $2 $3 is the parameters from Terminal
    

ubuntu 18.04 配置静态ip

Ubuntu 18.04 LTS 中配置 IP 地址的方法和以往使用的配置方法有很大的不同。

参考文章:linux 静态ip ubuntu - 搜索结果 - 知乎 (zhihu.com)
Linux 配置interfaces进行网卡配置 - 白菜没我白 - 博客园 (cnblogs.com)

和旧版本的不同之处在于,Ubuntu 18.04 使用 Netplan 来配置 IP 地址,Netplan 是一个新的命令行网络配置工具。其实在 Ubuntu 17.10 的时候 Ubuntu 开发者就已经介绍过 Netplan 了。接下来要介绍的新的 IP 配置方法不会再用到 /etc/network/interfaces 这个文件,取而代之的是一个 YAML 文件。默认的 Netplan 配置文件一般在 /etc/netplan 目录下

    1. 首先用图形化的网卡设置工具来设,此方法不行则参考以下
    1. 找到 Netplan 默认的网络配置文件所在之处
    /etc/netplan/50-cloud-init.yaml
    
    编辑该文件,只写最简化的配置(其实就是只缺网关和广播没设置) 注意,该文件的缩进是用空格,不是tab
    network:   
      ethernets:  
        enp1:  
          addresses : [192.168.1.100/24]    
          gateway4 : 192.168.1.1
          dhcp4 : no  
        enp2:  
          addresses : [192.168.2.100/24]    
          gateway4 : 192.168.2.1
          dhcp4 : no    
      version: 2
      renderer: NetworkManager
    
    配置完成之后保存并关闭配置文件。然后用下面这行命令来应用刚才的配置
    sudo netplan apply
    
    如果在应用配置的时候有出现问题的话,可以通过如下的命令来查看刚才配置的内容出了什么问题
    sudo netplan --debug apply
    
    如果配置正常且生效的话,我们可以用下面这个命令来查看一下ip
    ip addr
    
    1. 编辑/etc/network/interfaces
      难懂这种
    # auto lo
    # iface lo inet loopback
    auto eth0 eth0:1
    iface eth0 inet static
        address 192.168.0.100
        network 192.168.0.0
        netmask 255.255.255.0
        broadcast 192.168.0.255
        gateway 192.168.0.1
    iface eth0:1 inet static    #多配置的网口
        address 192.168.0.200
        network 192.168.0.0
        netmask 255.255.255.0
    

网卡静态配置相关

  • vim /etc/netplan/01-network-manager-all.yaml (ubuntu 18.04 确认这个有效)
    比如这个样子
    network:
      version: 2
      renderer: networkd
      ethernets:
        eth0:
          dhcp4: no
          addresses: [10.10.1.222/24]
          gateway4: 10.10.1.254
          nameservers:
                addresses: [61.139.2.69]
    
  • vim /etc/network/interfaces (kubuntu 就是这个)
    auto enp0s31f6  
    iface enp0s31f6 inet static   
    address 10.10.1.189    
    netmask 255.255.255.0  
    gateway 10.10.1.254
    
  • vi /etc/sysconfig/network-scripts/ifcfg-ens33
    永久修改网卡IP
    TYPE=Ethernet			#设置网卡类型,“Ethernet”表示以太网
    DEVICE=ens33			#设置网卡的名称
    ONBOOT=yes			#设置网卡是否在 Linux 操作系统启动时激活
    BOOTPROTO=static		#设置网卡的配置方式,“static”表示使用静态IP地址,“dhcp”时表示动态获取地址
    IPADDR=192.168.80.3		#设置网卡的 IP 地址
    NETMASK=255.255.255.0	        #设置网卡的子网掩码
    GATEWAY=192.168.80.2	        #设置网卡的默认网关地址
    DNS1=192.168.80.2		#设置DNS服务器的 IP 地址
    
  • vim /etc/network/interfaces.d/eth0 debian 系统亲测有效
    auto eth0
    iface eth0 inet static
    address 10.10.1.155
    netmask 255.255.255.0  
    gateway 10.10.1.254
    
  • ubuntu 20.04 添加路由表
    cat /etc/hosts
    127.0.0.1	localhost
    ::1		localhost ip6-localhost ip6-loopback
    fe00::0		ip6-localnet
    ff00::0		ip6-mcastprefix
    ff02::1		ip6-allnodes
    ff02::2		ip6-allrouters
    127.0.1.1       bm1684
    192.168.2.196   hub.kaolayouran.cn
    
  • 在我自己的本地机器上添加路由表
    sudo route add -net 172.16.140.0 netmask 255.255.255.0 gw 固定IP 
    # 解释  
    sudo route add -net [那几张核心板的网段] netmask 255.255.255.0 gw [网关ip, 本例是 10.10.1.182]   
    # 比如我看起了 172.16.150.15 这张板子  
    sudo route add -net 172.16.150.0 netmask 255.255.255.0 gw 10.10.1.182  
    

linux 查看系统版本等信息

  • lsb_release -a(推荐)
  • cat /etc/os-release (或者是/etc/*-release文件)
  • 查看发行信息(推荐)
    cat /etc/issue
    
  • 查看内核信息
    uname -a: 显示全部信息
    
    -m或--machine:显示电脑类型;
    
    -r或--release:显示操作系统的发行编号;
    
    -s或--sysname:显示操作系统名称;
    
    -v:显示操作系统的版本;
    
    -p或--processor:输出处理器类型或"unknown";
    
    -i或--hardware-platform:输出硬件平台或"unknown";
    
    -o或--operating-system:输出操作系统名称;
    
    --help:显示帮助;
    
    --version:显示版本信息。
    
  • 查看cpu相关信息,主频,内核信息等
    cat /etc/cpuinfo
    
  • cat /proc/version(侧重在查看硬件版本)
  • file /bin/ls

linux 下安装MySQL

安装参考:zhuanlan.zhihu.com/p/64080934
设置密码参考:cloud.tencent.com/developer/a…

  • 安装

    sudo apt update    
    sudo apt install mysql-server -y
    
  • 查看状态

    sudo systemctl status mysql.service
    
  • 查看版本信息

    sudo mysqladmin -u root version -p  
    # 或者登录后键入  
    status
    
  • 使用帮助

    mysql --help
    
  • 启动服务

    sudo systemctl start mysql.service       
    # 开机自启动 软件由 systemd 管理才行
    sudo systemctl enable mysql.service       
    # 重启
    sudo service mysql restart;
    
  • 登陆

    mysql -u root -p  -h [主机名]
    
  • 停止服务

    sudo systemctl stop mysql.service && sudo systemctl disable mysql.service
    
  • 设置密码
    逻辑思路:

    1. 通过/etc/mysql/debian.cnf中的默认用户登陆mysql
    2. 使用命令设置密码
    # 查看默认用户
    cat /etc/mysql/debian.cnf
    

    显示

    # Automatically generated for Debian scripts. DO NOT TOUCH!
    [client]
    host     = localhost
    user     = debian-sys-maint
    password = UA0YeS550GXbLNl0
    socket   = /var/run/mysqld/mysqld.sock
    [mysql_upgrade]
    host     = localhost
    user     = debian-sys-maint
    password = UA0YeS550GXbLNl0
    socket   = /var/run/mysqld/mysqld.sock
    
    

    以默认用户登陆并设置密码

    mysql -u debian-sys-maint -p    
    use mysql;
    # 重新设置密码    
    # 可能提示密码强度不够
    # set global validate_password_policy=0;
    # set global validate_password_length=1;   
    UPDATE user SET authentication_string=PASSWORD('123456') where USER='root';  
    # set plugin
    update user set authentication_string =password('123456'),plugin='mysql_native_password' where user='root';
    
  • 解决不加sudo就报错access denied for user ‘root’@’localhost'

    # 先以 sudo root 登陆
    sudo mysql -u root -p    
    # 然后  
    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';  
    # 之后即可  
    mysql -u root -p
    
  • 允许远程登陆**注意,Mysql 8.0 以上操作的是第二种一种,详见下面**

    • 登陆 mysql赋予远程访问权限

      use mysql;
      grant all privileges on *.* to 'root'@'%' identified by '123456';    
      
      # 8.0 之后的版采用以下    
      # 实际是在添加 root 用户,并赋权  
      # 一般到这步创建的用户才是正儿八经的用户,之前的用户应该都只是 mysql 的默认用户,比如是 /etc/mysql/debian.cnf;或者在8.0以上安装时键入root用户密码的那个临时用户  
      # 这两步很关键,一般就是这里改下权限,下面再改下监听端口 0.0.0.0 就开启了远程权限  
      # 防火墙可选步骤, Ubuntu 18.04 没做防火墙设置也可
      create user root@'%' identified by '123456';  
      grant all privileges on *.* to 'root'@'%' with grant option;
      # 如果提示密码强度不够,执行以下两句  
      # set global validate_password_policy=0;
      # set global validate_password_length=1;         
      # 刷新数据库
      flush privileges;
      
    • 修改配置文件,然后重新启动
      文件路径 /etc/mysql/mysql.conf.d/mysqld.cnf
      修改如下(127.0.0.1回环网络只允许本机登陆,其它主机登陆不了)

      # bind-address		= 127.0.0.1
      bind-address		= 0.0.0.0
      
    • 防火墙相关

      # 开防火墙
      service firewalld start    
      # 重启
      service firewalld restart      
      # 添加端口 协议
      firewall-cmd --permanent --add-port=3306/tcp  
      firewall-cmd --reload    
      # 光防火墙
      service firewalld stop
      # 或者  
      sudo systemctl disable firewalld
      
  • 查看是否是以0.0.0.0(不是127.0.0.1)监听

    sudo netstat -npl|grep 3306
    # 显示
    tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      8048/mysqld         
    
  • 卸载(卸载前停mysql 确保文件备份)

    # 停止服务  
    sudo systemctl stop mysql.service && sudo systemctl disable mysql.service
    # 卸载
    sudo apt purge mysql*       
    # 清理依赖  
    sudo apt autoremove
    sudo apt autoclean
    sudo rm -rf /etc/mysql/ /var/lib/mysql
    

安装8.0以上的高版本,采用官方源

  • 到官网复制下源
    MySQL :: Download MySQL APT Repository

    linux_mysql下载源位置.png

  • 下载该deb 并更新到仓库,然后安装

    apt-get install curl  
    # 不要加 sudo
    curl -OL https://dev.mysql.com/get/mysql-apt-config_0.8.19-1_all.deb  
    # 解压该源  
    sudo dpkg -i mysql-apt-config*  
    # 更新到仓库
    sudo apt update  
    # 像上面一样安装  
    sudo apt install mysql-server -y
    

Centos上安装Mysql 8.0

  • 参考,很靠谱,力荐:Linux (centos8)安装 MySQL 8 数据库(图文详细教程) - 云+社区 - 腾讯云 (tencent.com)
    另一个不知可靠度:(29条消息) CentOs7安装mysql-server和libmysqlclient-dev_Borange54的博客-CSDN博客_libmysqlclient-dev yum

  • 下载并安装 MySQL 官方的 Yum Repository

    wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm
    
  • 安装rpm

    rpm -ivh mysql80-community-release-el7-1.noarch.rpm
    
  • 安装服务

    yum install mysql-server
    
  • 启动服务

    systemctl start mysqld.service 
    
  • 查看运行状态,及监听地址(0.0.0.0才正确),见上面

  • 查看原始密码,如果提示密码为empty,则就是空的原始密码

    grep "password" /var/log/mysqld/mysqld.log
    
  • 登录mysql,并设置密码

    mysql -uroot -p  
    use mysql;  
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';
    
  • 设置远程连接(见上面mysql 8.0的设置),开放端口(只演示防火墙的设置)

    firewall-cmd --permanent --zone=public --add-port=3306/tcp  
    # 刷新防火墙设置   
    firewall-cmd --reload
    
  • 设置不区分大小写(没验证过), 在[mysqld]下,添加以下内容

    vim /etc/my.cnf     
    # 让MYSQL大小写敏感(1-不敏感,0-敏感)
    lower_case_table_names=1
    

MySQL作为客户端开发

(29条消息) Linux(程序设计):18---libmysqlclient-dev库(C语言操作MySQL)_董哥的黑板报-CSDN博客_libmysqlclient-dev

linux 防火墙与网络参看相关

参考简书:www.jianshu.com/p/a0d92b76b…

  • 防火墙相关
    # 开防火墙
    service firewalld start    
    # 重启
    service firewalld restart      
    # 添加端口 协议
    firewall-cmd --permanent --add-port=3306/tcp  
    firewall-cmd --reload    
    # 光防火墙
    service firewalld stop
    # 或者  
    sudo systemctl disable firewalld
    
  • 查看某端口被谁占用(程序), 进程号
    netstat -npl|grep 3306
    

安装Samba服务

  • 安装命令
    sudo apt install samba
    
  • 修改配置文件
    配置文件路径 /etc/samba/smb.conf
    追加以下内容
    [Root]
    path = /
    writeable = yes
    browseable = yes
    guest ok = yes
    
  • 为要修改的文件夹添加权限,比如
    sudo chmod +777 projects/SambaServer/
    
  • 重启服务
    sudo service smbd restart
    
  • win上访问该samba服务
    \\192.168.0.41\Root
    

源码编译 qt5.15

参考:zhuanlan.zhihu.com/p/363986626
zhuanlan.zhihu.com/p/394306561

  • 只编译 qtcore 模块(很常规,没有报错的)

    cd qtbase  
    mkdir build  
    cd build 
    make -j12
    
  • 下载源码

    wget https://mirrors.cloud.tencent.com/qt/official_releases/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xz  
    # 解压  
    tar -xf qt-everywhere-src-5.15.2.tar.xz  
    
  • 准备工作,很重要(准备这个然并卵,仍然有一个函数的定义编译不进来,其实是cbor这个模块)
    error: 'const char* cbor_error_string(CborError)' declared 'static' but never defined [-Werror=unused-function] CBOR_API const char *cbor_error_string(CborError error)

    sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev
    
  • 配置

    mkdir build 
    cd build   
    ../configure -developer-build -opensource -nomake examples -nomake tests  --prefix=/data_ssd1/zhou_projects/sino_grain_new/081/qt-everywhere-src-5.15.2/lib
    
  • make -j12 && make install

  • 编译

linux 下源码编译并安装 Python

python 3.9国内源 https://mirrors.huaweicloud.com/python/3.9.0/

  • 下载并解压
    wget https://mirrors.huaweicloud.com/python/3.9.0/Python-3.9.0.tar.xz  
    tar -xvf Python-3.9.0.tar.xz 
    
  • 切换到解压包下
    cd Python-3.9.0 
    
  • configure并编译
    # 当然也可以不在build中间目录下,直接./configure
    mkdir build  
    cd build 
    ../configure    
    make -j8 && make install   
    
  • 注意,此次编译会将python 2.7安装在/usr/bin下,而python 3.9 会安装在/usr/local/bin, 所以在使用命令行时要指定
    # 因为 python3 是 python3.9 的软链接
    python3 xx
    
  • 查看版本号
    python3 -V
    
  • 预装工具
    # python 安装工具和环境生成工具
    pip install pyinstaller  
    pip install virtualenv
    

apt 升级到 python 10

cloudbytes.dev/snippets/up…

xungui 项目装相机驱动 数据库 python 环境

  • 背景
    • Dalsa 相机驱动
    • mysql 8.0 数据库
    • 文件服务samba
    • pyhthon 3.9环境,主要是作文件服务的udpip的服务端
  • auto_install.sh
    # --------------------- 安装 Dalsa 相机驱动
    cd ~/projects 
    tar -zvxf  GigE-V-Framework_x86_2.10.0.0157.tar.gz  
    cd DALSA
    # 安装编译依赖
    sudo apt-get install gcc
    sudo apt-get g++  
    sudo apt-get install GNU make  
    sudo apt-get install libX11-dev  
    sudo apt-get install libxext-dev  
    sudo apt-get install libgtk-3-dev  
    sudo apt-get install libglade2-0  
    sudo apt-get install libglade2-dev    
    # 执行厂家安装脚本   
    ./corinstall              
    # --------------------- 安装数据库        
    cd ~/projects
    sudo apt-get install curl
    curl -OL https://dev.mysql.com/get/mysql-apt-config_0.8.19-1_all.deb  
    sudo dpkg -i mysql-apt-config*  
    sudo apt update    
    sudo apt install mysql-server -y
    sudo systemctl enable mysql.service          
    # --------------------- 安装 samba 服务  
    cd ~/projects
    sudo apt install samba  
    sudo chmod +777 -R ~/projects/RailTrackPatrol
    # --------------------- 安装 python  
    cd ~/projects
    wget https://mirrors.huaweicloud.com/python/3.9.0/Python-3.9.0.tar.xz   
    tar -xvf Python-3.9.0.tar.xz  
    cd Python-3.9.0  
    mkdir build   
    cd build   
    ../configure  
    sudo make -j8   
    sudo make install
    
  • 需要改动的设置
      1. 数据库
        允许远程登录
      # 首次采用默认账号登录,并创建用户,授权远程登录
      mysql -u root -p    
      use mysql;
      create user root@'%' identified by 'admin';   
      grant all privileges on *.* to 'root'@'%' with grant option;  
      flush privileges;    
      # 编译数据库配置文件
      sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf    
      # 修改如下
      # bind-address		= 127.0.0.1
      bind-address		= 0.0.0.0  
      # 重启  
      sudo systemctl restart mysql.service
      
      加载数据表
      # 登录到mysql  
      mysql -u root -p  
      # 建数据库
      create database track_patrol;  
      use track_patrol;            
      # 加载数据表及数据
      source /home/zhima/projects/RailTrackPatrol/resource/dummy.sql;          
      
      1. samba服务的配置文件
        sudo vim /etc/samba/smb.conf
      [RailTrackPatrol]
      path = /home/zhima/projects/RailTrackPatrol
      writeable = yes
      browseable = yes
      guest ok = yes
      
      重启服务 sudo service smbd restart
  • 修改环境变量
    sudo vim /etc/bash.bashrc  
    # 追加变量
    export LD_LIBRARY_PATH=/home/zhima/projects/RailTrackPatrol:$LD_LIBRARY_PATH  
    # 更新环境变量
    source /etc/profile  
    
  • 至此,即完成绿色版的安装,其实以下就不必了,因为牛批的打包脚本将软链接所链接的源文件拷贝下来,只是文件名还是沿用原机器上的链接名(实际就是源源文件),以下是不必要的操作
    • 把链接文件的源文件也拷贝到安装包
      cd /usr/local/lib  
      scp libopencv_imgproc.so.3.4.1 libopencv_core.so.3.4.1 libavcodec.so.58.91.100 libavutil.so.56.51.100 libswscale.so.5.7.100 zhima@192.168.0.159:~/projects/RailTrackPatrol/             
      cd /opt/Qt5.12.0/Tools/QtCreator/lib/Qt/lib
      scp libQt5Widgets.so.5.12.0 libQt5Gui.so.5.12.0 libQt5Network.so.5.12.0 libQt5Core.so.5.12.0 zhima@192.168.0.159:~/projects/RailTrackPatrol/           
      
      创建链接
      ln -sf libopencv_imgproc.so.3.4.1 libopencv_imgproc.so.3.4  
      ln -sf libopencv_core.so.3.4.1 libopencv_core.so.3.4    
      ln -sf libavcodec.so.58.91.100 libavcodec.so.58 
      ln -sf libavutil.so.56.51.100 libavutil.so.56 
      ln -sf libswscale.so.5.7.100 libswscale.so.5
      ln -sf libQt5Widgets.so.5.12.0 libQt5Widgets.so.5
      ln -sf libQt5Gui.so.5.12.0 libQt5Gui.so.5 
      ln -sf libQt5Network.so.5.12.0 libQt5Network.so.5
      ln -sf libQt5Core.so.5.12.0 libQt5Core.so.5     
      

linux 开机自启

  • 使用systemctl来管理
    cd /etc/systemd/system
    sudo vim auto_start_broadcast.service  
    
  • 编辑auto_start_broadcast.service文件
    [Unit]
    Description=
    Documentation=
    After=network.target
    Wants=
    Requires=
    
    [Service]
    ExecStart=/usr/local/bin/python3 /home/zhouqinan/projects/broadcast.py
    ExecStop=
    ExecReload=/usr/local/bin/python3 /home/zhouqinan/projects/broadcast.py
    Type=simple
    
    [Install]
    WantedBy=multi-user.target
    
  • 先试下能否加载
    sudo systemctl start auto_start_broadcast.service
    
  • 设置开机自启
    sudo systemctl enable auto_start_broadcast.service
    
  • 关闭开机自启
    sudo systemctl disable auto_start_broadcast.service
    

linux 测试usb带宽

  • 速率(最高)
    • usb 2.0
      480Mbps 即 60MB/s
    • usb 3.0
      5Gbps
  • lsusb
    root@NanoPi-M4v2:~# lsusb
    Bus 006 Device 007: ID 2e03:0001
    Bus 006 Device 006: ID 2109:0817 VIA Labs, Inc.
    Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
    Bus 005 Device 043: ID 046d:c077 Logitech, Inc. M105 Optical Mouse
    Bus 005 Device 042: ID c0f4:01e0
    Bus 005 Device 041: ID 2109:2817 VIA Labs, Inc.
    Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    
    • 3.0 表示有 usb 3.0
  • lsusb -tv
    root@NanoPi-M4v2:~# lsusb -tv
    /:  Bus 06.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 5000M
        |__ Port 1: Dev 6, If 0, Class=Hub, Driver=hub/4p, 5000M
            |__ Port 4: Dev 7, If 0, Class=Miscellaneous Device, Driver=, 5000M
            |__ Port 4: Dev 7, If 1, Class=Miscellaneous Device, Driver=, 5000M
            |__ Port 4: Dev 7, If 2, Class=Miscellaneous Device, Driver=, 5000M
    /:  Bus 05.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 480M
        |__ Port 1: Dev 41, If 0, Class=Hub, Driver=hub/4p, 480M
            |__ Port 2: Dev 42, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
            |__ Port 2: Dev 42, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M
            |__ Port 3: Dev 43, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
    /:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=ohci-platform/1p, 12M
    /:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=ehci-platform/1p, 480M
    /:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ohci-platform/1p, 12M
    /:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-platform/1p, 480M
    
    • 12M 意味着 USB 1.0 / 1.1的速率是 12Mbit/s
    • 480M 意味着 USB 2.0的速率是 480Mbit/s
  • 测试带宽(用个u盘)
    # 切到u盘目录
    cd /media/pi/ZHOUQINAN  
    # 测试写入
    dd if=/dev/zero of=./largefile bs=8k count=10
    # 测试读取  
    sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"     
    dd if=./largefile of=/dev/null bs=8k  
    

软件源更换国内源以及下载命令

  • 下载命令
    # -c 表示下载断了的话仍然从断点处继续下载, addr 就是自己要下的地址
    wget -c addr --no-check-certificate 
    

更换软件源

  • 查看ubuntu代号,获取Codename字段
    zhouqinan@zhouqinan-Lenovo:~$ lsb_release -a
    No LSB modules are available.
    Distributor ID: Ubuntu
    Description:    Ubuntu 18.04.5 LTS
    Release:        18.04
    Codename:       bionic    
    
  • 确认国内源
  • 三个东西齐了: 模板, 源地址, Codename
    • 将模板命名为 sources.list
    • 替换
      • 将选定的源地址替换模板中的源地址
      • Codename 替换 源地址上的Codenmae字段(即地址后面间隔一个空格的字符串,比如bionic)
        一份示例如下 sources.list
      # 阿里云源
      deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
      deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
      deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
      deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
      ##測試版源
      deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
      # 源碼
      deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
      deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
      deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
      deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
      ##測試版源
      deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
      
      # 清华大学源
      deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
      deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
      deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
      deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
      ##測試版源
      deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
      # 源碼
      deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
      deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
      deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
      deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
      ##測試版源
      deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
      
  • 配置文件安装上系统
    • 原来的东西先备份
      sudo cp /etc/apt/sources.list /etc/apt/sources.list.bcakup
      
    • 拷贝到系统目录下
      sudo cp ./sources.list /etc/apt/sources.list 
      
    • 更新
      # 这个就是一个编辑的命令不需要了
      # sudo gedit /etc/apt/sources.list
      sudo apt-get update  
      sudo apt-get upgrade
      

查找进程及查看网络端口占用情况

  • 参考有用:www.runoob.com/w3cnote/lin…
    • lsof 命令和 netstat
  • 杀死进程
    kill -9 [进程号]  
    
  • 根据程序名查找进程
    ps -ef | grep [程序名]  
    
  • 根据进程号,查找进程相关的信息,比如进程是哪个文件启动的
    ll /proc/[pid]
    

  • 查看某端口上是否有服务
    netstat -npl|grep [3306]
    
  • 根据程序名查看占用的端口
    netstat -npl|grep [MediaServer]
    

Centos 相关上有差异性的命令

  • 安装编译环境,比如像 build-essential 这种
    yum groupinstall "Development Tools"  
    

linux 添加用户

  • 创建新用户,并在/home/下创建目录

    useradd -d /home/zhou -m zhou
    
  • 确保创建新用户也是使用的bash脚本

    usermod -s /bin/bash zhou  
    
  • 推荐

    sudo useradd -d /home/zhou  -s /bin/bash -m  zhou:zhou  
    # 或者
    sudo useradd -m -G users,sudo,audio,video,docker -s /bin/bash zhou
    
  • 给新用户设置需要的密码

    passwd zhou
    

linux 数据恢复参考

linux 误删文件恢复方法(debugfs) - 简书 (jianshu.com)
Linux恢复误删除的文件或者目录 - 简书 (jianshu.com)

编译ffmpeg 及它的依赖x264 fdk-aac SDL2

  • 卸载与清除
    # 删除由make install命令安装的文件   
    make uninstall  
    # 只删除make时产生的临时文件   
    make clean   
    # 同时删除configure和make产生的临时文件   
    make distclean
    

只说配置项./configure, make -j8 make install 这些后继工作不表

  • 编译fdk-aac
    ./configure --enable-shared
    
  • 编译x264
    ./configure --enable-shared
    
  • 编译ffmpeg
    ./configure --enable-nonfree --enable-gpl --enable-libx264 --enable-ffplay --enable-ffmpeg --enable-ffprobe --enable-shared --disable-debug --disable-x86asm --disable-static --disable-doc --extra-cflags=-I../SDL2-2.0.14/build/include --extra-ldflags=-L../SDL2-2.0.14/build/lib
    

linux上一些报错的解决办法的汇总

ssh使用报错"ECDSA host key for 108.61.163.242 has changed and you have requested strict checking. Host key verification failed."(一般重置服务器会报错),解决如下:

ssh-keygen -R [主机ip]

win上下载的文件放在linux上不认了;报错".ibtoolize: error: AC_CONFIG_MACRO_DIRS([m4]) conflicts with ACLOCAL_AMFLAGS=-I m4"

# 所在目录执行如下
find . -type f -print0 | xargs -0 dos2unix  
# 或者,感觉解决不彻底
dos2unix filename 

linux 上 qt 打包

我自己用的这个工具,并配到了环境变量

# 一 将bin文件烤到一个目标文件夹  
# 二 在目标文件夹下执行以下命令
linuxdeployqt bin -appimage 

打包工具的获取及设置到环境变量

blog.csdn.net/zyhse/artic…
blog.csdn.net/imyang2007/…

学习 linux 下的打包压缩,和解包解压

先学 .tar.gz .tar.bz2 .tgz

前言

  • tar默认就只是打包工具
  • 压缩和解压工具
    • gzip
    • bzip2
  • .tgz等于.tar.gz
  • tar参数的组合就完成打包压缩, 解包解压

先直接学一步到位的打包压缩和解包解压

  • 便于记忆,解释参数
    • 1 选压缩或解压
      • c 表压缩(compress)
      • x 表解压
    • 2 选哪种解压/压缩器
      • z gzip
      • j bzip2
    • 3 指定压缩包名称,压缩时用
      • f
    • 4 指定文件夹,解压释放时用
      • -C
    • 5 显示进度
      • v

示例, 注意这几个解压命令是不会裸释放的,都是释放到文件夹下

  • 指定文件夹打包压缩成指定的压缩包
    tar -zcvf build.tar.gz ./build    
    # 其实和上面是一种文件
    tar -zcvf build.tgz ./build    
    # 使用 bzip2 压缩器
    tar -jcvf build.tar.bz2 ./build
    
  • 从指定文件夹中解压出来
    tar -vxf test.tar -C test_release
    tar -jxvf build.tar.bz2
    # 释放到指定文件夹 -C 
    tar -jxvf build.tar.bz2 -C build    
    tar -zxvf build.tar.gz       
    tar -zxvf build.tgz       
    

再学zip unzip

  • 使用 zip 压缩目录需要注意一点,必须要添加参数 -r, 这样才能将子目录中的文件一并压缩,如果要压缩的文件中没有目录,该参数就可以不写了。使用 zip 压缩文件,会自动生成文件后缀.zip, 因此就不需要额外指定了。
    # zip -r [目标] [源文件] 
    zip -r ./RailMaster ./RailMaster/ 
    
  • 解压注意,要指定解压目录,否则将压缩包里的东西全部释放出来,散了
    unzip [压缩包名] -d [解压目录]
    

echo 在行尾追加字符串,插入字符串

echo -n "hello" >> 1.txt
  • 追加在下一行
echo "hello" >> 1.txt
  • 指定在某行追加,并换行
sed -i "4i include(\${TOOL_CHAIN_CMAKE}) \n" ../CMakeLists.txt.bak 

linux开启自动登录与关闭自动登录

如何在Ubuntu 18.04 LTS中启用和禁用自动登录 - 系统极客 (sysgeek.cn)

彻底删除软件

  • 删除软件及其配置文件
    apt-get --purge remove <package>
    
  • 删除软件
    sudo apt-get remove --purge wine 
    
  • 卸载残留不用得软件包,删除没用的依赖包
    sudo apt-get autoremove 
    

ubuntudeep-wine6安装 wechat

zhuanlan.zhihu.com/p/128070630
deepin.com.wechat_2.6.2.31deepin0_i386.deb 下载:packages.deepin.com/deepin/pool…
参考(按这个来还没完成,它链接的下载源很全):zhuanlan.zhihu.com/p/428285559
参考:blog.csdn.net/wangxiao747…

linux 下的图形界面的远程工具:3 个 Linux 上的 SSH 图形界面工具 - 知乎 (zhihu.com)

docker相关

  • 远程机器上有容器,配置容器的sshd,然后vscode远程连上它
    参考:zhuanlan.zhihu.com/p/361934730
    推荐,可行
    • vscode ssh 连上远程机器
    • vscode 选 Containers(就是可以切换ssh/Containers 的地方),选中列出的容器
  • docker 安装
    zhuanlan.zhihu.com/p/143156163
  • 普通用户添加到 docker
    www.jianshu.com/p/7b86390b9…
    组docker在安装docker的时候,就已经添加了,所以只需要执行两个操作即可:
    将用户加入docker组之后,发现使用docker ps或者docker images不会提示权限不足了。
    # sudo usermod -aG docker zhou
    # sudo gpasswd -a $USER docker 
    # newgrp docker   
    # systemctl restart docker   
    reboot 
    
  • 修改etc/docker/daemon.json
    { 
            "registry-mirrors":[
             "https://emasu4pd.mirror.aliyuncs.com",
             "http://hub-mirror.c.163.com"
                ],
            "insecure-registries":["192.168.2.100:5000"],
            "runtimes": {
            "nvidia": {
                "path": "/usr/bin/nvidia-container-runtime",
                "runtimeArgs": []
             }	
            },  
            "insecure-registries": ["hub.kaolayouran.cn:5000","192.168.2.100:5000","192.168.2.100:8001"]
    }
    
  • nividia安装docker容器支持
    blog.csdn.net/KingOfMyHea…
    www.cnblogs.com/GengMingYan…
  • 容器映射关系 [宿主机]:[容器内]
  • 运行 docker ,开启端口映射,文件夹映射
    • 映射目录
      docker run -it -v /mnt/sdb1/Projects/sdc:/mnt/sdb1/Projcts/sdc --name=sdc_env duruo850/ubuntu18.04-python3.6 /bin/bash
    • 映射端口 ssh, 远程 vscode 开发 docker run -it -p 8022:22 --name=sdc_dev dce07015e827 /bin/bash
    • 推荐
      docker run --privileged -it -p 8022:22 -v /mnt/sdb1/Projects/sdc:/mnt/sdb1/Projects/sdc -e LANG=C.UTF-8 -v /etc/localtime:/etc/localtime -v /etc/hosts:/etc/hosts --name=sdc_dev  [镜像id] /bin/bash      
      
    • nvidia 开发时启动容器的命令,把nvidia的库映射到容器里去
      docker run --privileged -it --runtime=nvidia --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -p 8082:8087 -p 8083:8888 -e NVIDIA_VISIBLE_DEVICES=all -e LANG=C.UTF-8 -v /etc/localtime:/etc/localtime -v /etc/hosts:/etc/hosts cacee1572cc4 /bin/bash
      
    • bitmain(可用,启动开发镜像)
      docker run -it (-u 1012:1013 这个没用, 可以 -u root 指定用户) --privileged=true -v /home/zhou:/home/zhou --net=host -v /dev/shm --tmpfs /dev/shm:exec -v /etc/localtime:/etc/localtime -e LANG=C.UTF-8 --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --name=zhou_bm_dev_container 192.168.2.100:5000/osmagic/bmnn_pcie-dev:v1.2    
      # 实测OK有用,把容器 -u [宿主机用户id]:[容器id] --user 指定默认用户   
      docker run -it -u 1006:1000 --user root   --privileged=true -v /mount_data/zhou/Projects:/mount_data/zhou/Projects -v /mount_data/zhou/osmagic:/home/osmagic --net=host -v /dev/shm --tmpfs /dev/shm:exec -v /etc/localtime:/etc/localtime -e LANG=C.UTF-8 --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --name=zhou_bm_dev_container 192.168.2.100:5000/bitmain/build:v2.8  bash  
      
    • ivs1800 启动开发镜像(可用)
      docker run -it --runtime=nvidia --name=zhou_ivs1800_dev_container -v /etc/localtime:/etc/localtime -e NVIDIA_VISIBLE_DEVICES=0 -e NVIDIA_DRIVER_CAPABILITIES=video,compute,utility  -e LANG=C.UTF-8 --net=host -v /tmp:/tmp -e DISPLAY=$DISPLAY -v /mnt/sdb1/Projects/ivs1800:/mnt/sdb1/Projects/ivs1800 --cap-add=SYS_PTRACE --security-opt seccomp=unconfined 192.168.2.100:5000/ivs/build:v1.2
      
    • nvidia 平台,启动开发镜像(可用)
      # 启动英伟达的开发镜像    
      # --net=host 表示全局映射, 所以再指定 -p 8082:8087 无效  
      # --user 1000:30001 1000表示宿主机用户uid,30001表示容器uid,这么弄就可以避免容器里和宿主机文件权限不一致的问题
      docker run -it --runtime=nvidia --name=zhou_nvidia_dev_container_v3.0 --user 1000:30001 -v /etc/localtime:/etc/localtime -e NVIDIA_VISIBLE_DEVICES=0 -e NVIDIA_DRIVER_CAPABILITIES=video,compute,utility  -e LANG=C.UTF-8 --net=host -v /tmp:/tmp -e DISPLAY=$DISPLAY -v /mnt/sdb1/Projects/nvidia:/mnt/sdb1/Projects/nvidia --cap-add=SYS_PTRACE --security-opt seccomp=unconfined 192.168.2.100:5000/osmagic/ai_service_dev:v3.0
      
    • don't load model,use pre serial model
    docker run -it --runtime=nvidia -v /etc/localtime:/etc/localtime -e NVIDIA_VISIBLE_DEVICES=0 -e NVIDIA_DRIVER_CAPABILITIES=video,compute,utility -e LANG=C.UTF-8 --net=host -v /tmp:/tmp -v /data/serial:/root/koala/osmagic/serial -e DISPLAY=$DISPLAY -v /home/andy:/home/andy --cap-add=SYS_PTRACE --security-opt seccomp=unconfined [docker img]
    
  • dockertag
    www.cnblogs.com/pzk7788/p/1…
  • docker push 到仓库
    • 先将容器搞成镜像
    docker commit 67e551b2b7c1 sdc_env:v2.0_complete_3rdlib    
    # 解释下  
    docker commit [容器id] [给镜像取的名字]:[给镜像的 tag ]
    
    • 然后给镜像重新打上 tag,打上新的 tag 就和远程库关联上了
    docker tag sdc_env:v2.0_complete_3rdlib hub.kaolayouran.cn:5000/osmagic-all/micro-algo-dynamic/sdc_env:v2.0_complete_3rdlib  
    
    • 推上仓库
    docker push hub.kaolayouran.cn:5000/osmagic-all/micro-algo-dynamic/sdc_env:v2.0_complete_3rdlib
    
    • 尝试直接在把容器打成镜像时把远程仓库的地址搞到 tag 上
    docker commit [选项] <容器ID或容器名> [<仓库名>:<标签>]
    
  • docker 仓库首次要登陆,鉴权
    docker login hub.kaolayouran.cn:5000
    Username: xxx
    Password: xxx
    
  • 修改 docker 的存储位置,避免占用固态盘(镜像文件迁移到机械盘上,我用了下面的创建链接的这种方式)
    cloud.tencent.com/developer/a…
  • dockerfile 构建 docker zhuanlan.zhihu.com/p/434090003…
  • 执行 docker 容器内的shell命令,试过在docker run -it /bin/bash -c "shell 命令" 没生效,下面实测能解决,就是分步来做(先启动 docker run ,然后放在 execbin 函数里执行bash命令)
  • 注意,shell 命令长句分成多行,在行末尾直接\然后回车,不要其他多余操作
     ##
     # @Author: your name
     # @Date: 2021-05-26 02:06:58
     # @LastEditTime: 2021-05-26 02:09:35
     # @LastEditors: Please set LastEditors
     # @Description: In User Settings Edit
     # @FilePath: /city_manager/workspace/docker_build/docker.sh
    ### 
    IMAGE_NAME=hub.kaolayouran.cn:5000/osmagic-all/bitmain/081_bm:20220719152036
    CONTAINER_NAME=osmagic_release
    
    execbin(){  
       set -x
       docker exec -it  osmagic_release bash -c  "cd /home && ./init_container.sh"
    }
    start(){
        set -x
        docker run \
                --privileged=true \
                --cap-add=SYS_PTRACE  \
                --security-opt seccomp=unconfined \
                --name $CONTAINER_NAME \
                -p 8087:8087 \
                -v /system:/system \
                -e LOCAL_USER_ID='1000' \
                -itd $IMAGE_NAME \
                bash
                # bash -c "cd /home && ./init_container.sh"    
    }
    
    stop(){
        docker stop $CONTAINER_NAME &&\
        docker rm $CONTAINER_NAME
    }
    
    execit(){
        docker exec -it $CONTAINER_NAME bash
    }
    
    logs(){
        docker logs -f $CONTAINER_NAME --tail 1
    }
    
    case "$1" in
      logs) 
            logs
            ;;
      exec)
            execit
            ;;
      start)
            start
            execbin
            ;;
      stop)
            stop
            ;;
      restart)
            stop
            start
            ;;
      log)
           docker logs -f $CONTAINER_NAME
            ;;
      *)
            echo "Usage: $0 {start|stop|restart}"
            exit 1
    esac
    

nvidia-smi

nvidia-smi_info.jpeg

  • NVIDIA查看显卡解码能力,可以通过nvidia-smi dmon命令查看

k8s

  • search cmd
    kubectl get pods -n test-gpu | grep cxx
    
  • k8s exec
    ubectl exec -it -n test-gpu $podname bash
    

linux安装图形界面的远程工具:zhuanlan.zhihu.com/p/375144056

ubuntu 20.04 安装鼠标滚轮快慢:blog.csdn.net/weixin_4309…

  • setwheel

有些系统下(比如嵌入式的 arm 板子上)没用 systemlctl 来管理软件,那它可能就是 service 在管理软件,参考:www.cnblogs.com/a5idc/p/137…

service.jpg

  • 也可能是 /etc/init.d 管理,比如:
    /etc/init.d/ssh start
    
    比如目录结构这个样子
    /etc/init.d/
    |-- dbus
    |-- hwclock.sh
    |-- procps
    |-- ssh
    `-- x11-common
    

文件传输相关

  • sshfs 远程文件映射
    sshfs root@192.168.2.197:/data/model_manager NetDir197/
    
  • sftp 登录
    sftp zhou@192.168.10.10       
    
  • 获取整个文件夹
    get -P -r /公共文件夹/fy/项目资料/项目数据/车辆未清洗典型错误数据 ./      
    
  • sftp 映射目录:blog.csdn.net/axing2015/a…
  • sftp 映射文件夹
    sftp zhou@10.10.1.209:/mnt/sdb1/Projects/sdc
    
  • 用 get 拷贝文件
    get -r ./3rd_part/Poco1.10.1 /usr/app/container/3rdApp/  
    
  • 远程传文件,指定 ssh 端口,不覆盖原有文件
    rsync -avzut --progress -e 'ssh -p port' ./tmp zhouqinan@ip:~/Projects/tmp
    
  • nfs 映射远程文件夹
    www.jianshu.com/p/5314f9033…

sed 文本中插入字符串:blog.csdn.net/Olivia_Vang…

.gitconfig 配置它,让他能缓存密码,不用每次都输入密码

[user]
	name = myname
	email = xx@qq.com
[credential]
	helper = store
#[http "https://github"]
#[http "https://github.com"]
#	sslVerify = false  

vscode 缓存 ssh 密码,不用每次都输密码登录

  • ssh 生成公钥,传到 git 仓库
    ssh-keygen -t rsa -C "email@example.com"
    
  • 选定目标:每次 ssh 时登的用户是 xx 而不是 root 的话,那么公钥文件就应放在 /home/xx/.ssh/authorized_keys
    思路:先在客户端产生出公钥,可以先在自己机器上看下(公钥位置:C:\Users\xx.ssh\id_rsa.pub).然后公钥传到ssh服务端机器上的对应用户的.ssh文件夹下(/home/xx/.ssh/),最后id_rsa.pub --重命名--> authorized_keys,重启 sshd
  • 在客户端产生公钥
    # 一路回车
    ssh-keygen 
    
  • 拷贝到目标文件夹下,并重命名
  • 重启 sshd 服务
  • 这个是客户端是 linux 机器的配置方法:vscode Remote-SSH如何保存密码自动登录远程服务器 - Bill Hu's Blog (billhu0.github.io)

shell 相关

shell 截取字符串:c.biancheng.net/view/1120.h…

递归删除指定的文件

find . -name "CMakeCache.txt" |xargs rm -f

查找文件并拷贝到指定目录

find / -name "libPocoCrypto.so.71" | xargs -n1 -i cp {} ./  

shell 制作脚本只删除 build 目录下的所有文件,防止误删 rm -rf*

pwd_path=$PWD       
if [ "build" = ${pwd_path:0-5:5} ]
then     
    rm -rf ${pwd_path}/*
fi

Linux之man命令详解及中文汉化

blog.csdn.net/zha6476003/…

ubuntu 下安装 smba 服务

www.jianshu.com/p/c4579605a…
blog.csdn.net/yifan850399…
blog.csdn.net/qq_43402273…

linux 查看磁盘空间

www.php.cn/linux-47291…

linux 终端无法输入

ctrl+d 结束输入或退出shell\
ctrl+s 暂停屏幕输出\
ctrl+q 恢复屏幕输出\
ctrl+l 清屏,等同于Clear  

cmake 升级

blog.csdn.net/weixin_4154…

Linux下查看分析可执行文件的方式

(76条消息) Linux下查看分析可执行文件的方式_酸菜鱼的鱼的博客-CSDN博客_linux查看可执行文件内容

sftp 常用命令

blog.csdn.net/axing2015/a…

ubuntu 18.04 升级到 20.04

可用:如何将Ubuntu 18.04升级到Ubuntu 20.04_Linux教程_Linux公社-Linux系统门户网站 (linuxidc.com)

向日葵命令行安装

service.oray.com/question/11…
sunlogin.oray.com/download/li…
zhuanlan.zhihu.com/p/358820354

linux 安装qt库

sudo apt-get install qt5-default

curl 脚本

curl -i -X POST \
 http://127.0.0.1:10101/dynamic/api/v1/setup \
  -H 'Content-Type: application/json' \
  -d '{
  "cameraId": "2",
  // "url": "rtsp://192.168.2.66/person.avi",
  // "url":"rtsp://192.168.2.66:554/out.mp4",  
  "url":"rtsp://10.10.1.209/live/zhou",    
  "imageOut": "path",
  "skipFrame": 25,
  "roi": [],
  "areaBoxes": [],
  "inputType": "RTSP",
  "notifyUrl":"http://10.10.1.209:5000/osmagicCall",
  "abilities": [
        {
            "name": "OffDutyAlarm",
            "value": {
                "interval": 0.5,
                "minTarry": 3,
                "alarmInterval": 5,
                "threshold": 0.4,
                "areaIsReverse": false,
                "pointType": 1,
                "zoomFactor": 1.0,
                "minBox": {
                    "width": 50,
                    "height": 50
                },
                "areaBoxes": []
            }
        }
    ]
}'

linux 安装 wps