Linux常用命令集

1.常用Shell命令

1.1查看PCI设备:

$ lspci

查看显卡:

$ lspci |grep "VGA\|Display"

65:00.0 VGA compatible controller: NVIDIA Corporation GP106 [GeForce GTX 1060 6GB] (rev a1)

 

1.2 Zip

实例

将 /home/html/ 这个目录下所有文件和文件夹打包为当前目录下的 html.zip:

zip -q -r html.zip /home/html

如果在我们在 /home/html 目录下,可以执行以下命令:

$ zip -q -r html.zip *

 

从压缩文件 cp.zip 中删除文件 a.c

zip -dv cp.zip a.c

1.3 替换某个路径下所有文件内的某个字符串

intel: Rename gen_get_device prefix to intel_get_device

$ export SEARCH_PATH="src/intel src/gallium/drivers/iris src/mesa/drivers/dri/i965"
$ grep -E "gen_get_device" -rIl $SEARCH_PATH | xargs sed -ie "s/gen_get_device/intel_get_device/g"
// 上述命令可能产生e结尾的新文件,比如原文件是arsenal.cpp,则会产生arsenal.cppe文件
// 可改用下面的命令
$
grep -E "gen_get_device" -rIl $SEARCH_PATH | xargs sed -i "s/gen_get_device/intel_get_device/g"

 

1.4 查看.so文件依赖的库:

#以libvk.so为例:
$ ldd libvk.so
#或者
$ readelf -a libvk.so |grep NEEDED

 

readelf 是一个用于显示 ELF(Executable and Linkable Format)格式文件信息的工具,这些文件通常包括可执行文件、目标代码、共享库等。ELF 格式是 Unix 和 Unix-like 系统(如 Linux)中常用的标准文件格式,用于可执行文件、目标代码、共享库和核心转储。

readelf 的主要作用包括:

  1. 显示 ELF 文件的头部信息:包括 ELF 文件的类型(可执行文件、共享库或目标文件)、架构(如 x86_64、ARM)、入口点地址等。
  2. 查看节(Section)信息:ELF 文件由多个节组成,每个节包含特定类型的数据(如代码、数据、符号表等)。readelf 可以列出所有节及其属性。
  3. 查看符号表:符号表包含了程序中函数和变量的名称、位置等信息。这对于调试和链接过程非常重要。
  4. 查看重定位信息:这对于链接器和调试器来说非常重要,因为它们需要知道如何修改程序和数据的地址。

 

1.5 开机进入命令行模式或者GUI模式:

1、检查当前默认设置:
[root@centos01 ~]# systemctl get-default
graphical.targe 
# graphical.target表示开机将默认进入图形界面
2、切换方法:
设置为命令模式
systemctl set-default multi-user.target
设置为图像行模式
 systemctl set-default graphical.target
重启reboot即可

 

1.6 在Linux Grub中enable选择kernel:

sudo vim /etc/defailt/grub

作如下修改:

#comment out GRUB_TIMEOUT_STYLE to show GRUB Select menu
#GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=5

 

 

 

1.7 Tar

Linux中尽量用tar压缩与解压缩,用ZIP的话,超大文件会压缩失败,我试过100多G的Android Source Code用ZIP压缩,失败了

$ tar -czvf xxx.tar.gz <source_file>   #以tar.gz压缩并显示详细文件
$ tar -xzvf xxx.tar.gz -C <object_path> #解压缩tar.gz并显示详细文件

参数:
-c : 建立一个压缩文件,create
-x :解压一个压缩文件
-t :查看压缩文件内容
-v : 压缩过程中显示文件
-f :使用压缩名,注意一般放在参数最后,紧跟压缩名
-z :用gzip压缩,一般以tar.gz结尾,压缩速度快
-j :用bzip2压缩,一般以tar.bz2结尾,压缩的比较狠

 

 

1.8 解决Intel ADL NUC(12)的网卡不工作问题:

 默认情况下,Intel ADL NUC的网卡无法在Ubuntu 20.04上正常工作,可以通过升级驱动解决(因为不知道出问题的Intel Ethernet device 15f3是哪个驱动,所以可以升级所有的软件):
$ sudo apt update && sudo apt full-upgrade                 #After this all the required drivers/firmware will be installed

 

 

1.9 kernel更新后无法进入系统并报错bad shim signature:

把BIOS里的security boot去掉就可以了

 

1.10 查看进程与线程

查看进程:

$ ps -aux
$ ps -ef

#这两个命令都可以查看进程列表,不同点如下
    #风格不同。ps -ef是System v显示风格,而ps aux是BSD显示风格。
    #ps -ef和ps aux显示内容不一样。
    #COMMADN列如果过长,aux会截断显示,而ef不会。

查看线程:

三种方法:

$ps -T -p <pid>

$top -H -p <pid>

$pstree -p $pid

 

1.11更新Linux firmware

有些firmware如果没有更新,可能在kernel中产生对应的错误,导致某些功能无法正常工作。以GPU虚拟化的SRIOV solution为例,这个方案需要kernel的GuC模块可以正常工作。

通过dmesg命令查询相关的log信息:

$ sudo dmesg |grep i915

[    1.718414] i915 0000:00:02.0: [drm] Failed to load DMC firmware i915/adlp_dmc_ver2_16.bin. Disabling runtime power management.
[    1.718415] i915 0000:00:02.0: [drm] DMC firmware homepage: https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree/i915
[    1.726297] i915 0000:00:02.0: GuC firmware i915/adlp_guc_70.bin: fetch failed with error -2
[    1.726305] i915 0000:00:02.0: [drm] GuC firmware(s) can be downloaded from https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree/i915
[    1.817793] i915 0000:00:02.0: [drm] GuC firmware i915/adlp_guc_70.bin version 0.0.0
[    1.817809] i915 0000:00:02.0: GuC initialization failed -2
[    1.817812] i915 0000:00:02.0: Enabling uc failed (-5)
[    1.817813] i915 0000:00:02.0: Failed to initialize GPU, declaring it wedged!
[    1.818007] i915 0000:00:02.0: [drm:add_taint_for_CI [i915]] CI tainted:0x9 by intel_gt_set_wedged_on_init+0x40/0x50 [i915]
[    2.044782] [drm] Initialized i915 1.6.0 20201103 for 0000:00:02.0 on minor 0
[    2.091309] i915 0000:00:02.0: IOV: Initialization failed (-EIO) GT wedged
[    2.091330] i915 0000:00:02.0: [drm:i915_sriov_pf_confirm [i915]] PF aborted (-EIO) i915_driver_probe+0xd7e/0xee0 [i915]
[    2.092333] i915 0000:00:02.0: No VFs could be associated with this PF!

我们可以看到DMC firmware和GuC firmware都load失败了,分析log,原因是找不到对应版本的DMC和GuC的bin文件。我们到/lib/firmware/i915路径下,确实找不到对应版本的bin。

根据提示,可以从 https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree/i915 这个链接下载对应的firmware文件。

更新方法:

$ sudo move xxxx.bin /lib/firmware/i915/
#把下载好的firmware bin文件放到对应的firmware目录中

$ sudo update-initramfs -u -k all
#更新initramfs,然后reboot起效

$ sudo reboot

注意事项:更新完之后,可能会遇到 "DMC firmware has wrong CSS header length" 或者 "GuC firmware has wrong CSS header length" ,这是因为文件格式的问题,跟FTP的下载方式有关,具体原因不去细究。举个例子,在github上的patch,你直接用wget下来,有的是没法git am的,会报格式错误。解决办法是找到“raw”格式的patch链接,这样wget下来的patch没有格式问题,可以git am。这里firmware的格式错误是一个道理。

解决方法1::直接下载整个firmware的package(tar.gz文件),https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git。在package里面找对应缺少的firmware bin文件,这里的文件格式是正确的。

解决方法2:git clone https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/,在里面找firmware bin文件

 

1.12 SWTPM

swtpm是什么?swtpm其实就是software TPM,那么TPM又是什么呢?TPM是(Trusted Platform Module),用以通过物理密码芯片保证访问控制与加密,具体概念可以访问https://learn.microsoft.com/en-us/windows/security/information-protection/tpm/trusted-platform-module-overview。而对于虚拟机来说,虚拟机(Guest OS)本身是没有物理实体的,那么如何使用相关的功能呢?就有了libtpms实现了TPM的功能接口,具体情况访问https://github.com/stefanberger/libtpms/blob/master/README。而SWTPM就是提供了多种TPM模拟器,而TPM模拟器是用以创建多种native /dev/vtpm*设备的。所以总的来说,SWTPM跟虚拟机中的加密概念有关,缺少SWTPM的正确设置可能导致无法访问Guest Image

 

1.13 RPMB

RPMB(Replay Protected Memory Block)Partition 是 eMMC 中的一个具有安全特性的分区。
eMMC 在写入数据到 RPMB 时,会校验数据的合法性,只有指定的 Host 才能够写入,同时在读数据时,也提供了签名机制,保证 Host 读取到的数据是 RPMB 内部数据,而不是攻击者伪造的数据。

RPMB 在实际应用中,通常用于存储一些有防止非法篡改需求的数据,例如手机上指纹支付相关的公钥、序列号等。RPMB 可以对写入操作进行鉴权,但是读取并不需要鉴权,任何人都可以进行读取的操作,因此存储到 RPMB 的数据通常会进行加密后再存储。

也就是说RPMB跟读取/写入敏感数据的校验有关,如手机上指纹支付相关的公钥、序列号等。

 

1.14md5sum

在Linux系统中,文件的完整性和数据的安全性是非常重要的。为了验证文件是否在传输或存储过程中被篡改,通常会使用哈希算法生成文件的摘要信息。md5sum指令就是这样一个用于计算和校验MD5哈希值的工具。MD5(Message Digest Algorithm 5)是一种广泛使用的哈希函数,它可以产生一个128位(16字节)的哈希值,通常用一个32位的十六进制字符串表示。

MD5哈希值是一个固定长度的字符串,由MD5算法对数据进行处理后得到。MD5算法是一种不可逆的哈希算法,即使是微小的数据变化,也会导致生成的哈希值发生巨大的变化。这种特性使得MD5哈希值非常适合用于检测文件的完整性。

md5sum指令的基本语法如下:

md5sum [OPTION]... [FILE]...
OPTION:指令的选项,如 --status 用于显示成功或失败的状态。
FILE:指定要计算哈希值的文件名。

计算文件的MD5哈希值
要计算文件的MD5哈希值,可以使用以下命令:

md5sum filename.txt
执行该命令后,系统会输出filename.txt文件的MD5哈希值。输出的格式通常为:

d41d8cd98f00b204e9800998ecf8427e  filename.txt
第一行是文件的MD5哈希值,第二行是文件的名称。

注意事项

  • MD5算法已经不再被认为是安全的,因为它容易受到碰撞攻击。在需要高安全性的场合,建议使用更安全的哈希算法,如SHA-256。
  • 在使用md5sum指令时,确保文件名正确无误,否则可能会导致错误的哈希值。

1.15 set -x

在 Shell 脚本中,set -x 是一个调试选项,用于开启命令的跟踪(trace)功能。启用后,Shell 会在执行每一条命令之前,将该命令及其参数打印到标准错误输出(通常是终端)。这对于调试脚本非常有用,因为它可以帮助开发者查看脚本实际执行的命令和参数,从而更容易定位问题。

具体功能

  • 打印执行的命令:当 set -x 被启用后,Shell 会在执行每一条命令之前,将该命令及其参数以 + 开头的形式输出到终端。
  • 帮助调试:通过查看打印的命令,开发者可以确认脚本是否按照预期执行,以及参数是否正确传递。

使用方法

1.在脚本开头启用:
你可以在 Shell 脚本的开头添加 set -x 来启用命令跟踪功能。例如:在命令行中临时启用:

#!/bin/bash
set -x
echo "Hello, World!"
ls -l
set +x # 关闭命令跟踪

2.你也可以在命令行中直接输入 set -x 来临时启用命令跟踪功能,执行完需要调试的命令后,可以输入 set +x 来关闭它。

注意事项

    • 关闭命令跟踪:使用 set +x 可以关闭命令跟踪功能,避免在不需要的时候输出过多的调试信息。
    • 结合其他调试工具:set -x 通常与其他调试工具(如 echo 语句、日志记录等)结合使用,以提供更全面的调试信息。
    • 性能影响:虽然 set -x 对于调试非常有用,但在生产环境中长时间启用可能会影响脚本的性能,因为每条命令都会被打印出来。
posted @ 2021-04-07 16:54  青山牧云人  阅读(420)  评论(0)    收藏  举报