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 的主要作用包括:
- 显示 ELF 文件的头部信息:包括 ELF 文件的类型(可执行文件、共享库或目标文件)、架构(如 x86_64、ARM)、入口点地址等。
- 查看节(Section)信息:ELF 文件由多个节组成,每个节包含特定类型的数据(如代码、数据、符号表等)。
readelf可以列出所有节及其属性。 - 查看符号表:符号表包含了程序中函数和变量的名称、位置等信息。这对于调试和链接过程非常重要。
- 查看重定位信息:这对于链接器和调试器来说非常重要,因为它们需要知道如何修改程序和数据的地址。
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)的网卡不工作问题:
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对于调试非常有用,但在生产环境中长时间启用可能会影响脚本的性能,因为每条命令都会被打印出来。
浙公网安备 33010602011771号