跳转到内容
新建笔记

Linux问题集

1 linux环境变量设置及保存地点

跳转到“1 linux环境变量设置及保存地点”

环境变量是操作系统中一种特殊的变量。

  • 用于存储系统的一些配置信息,如系统路径、默认编码、临时文件存放位置等。
  • 环境变量是在系统启动时就被创建,并一直存在于系统中。
  • 应用程序可以读取环境变量来获取操作系统的设置,也可以通过设置环境变量来改变系统配置。
  • 在不同的操作系统中,环境变量的设置方式可能会有所不同。常见的环境变量有PATH、USER、HOME等。

1.1 显示HOME 、环境变量

跳转到“1.1 显示HOME 、环境变量”
终端窗口
# 环境变量HOME的值,它表示当前用户的家目录路径
$ echo $HOME
/home/terry
# 要显示环境变量,可以在Linux命令行中使用“echo”命令,并将变量名作为参数
$ echo $PATH
/root/miniconda3/bin:/usr/local/bin:/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

1.2 保存环境变量的设置

跳转到“1.2 保存环境变量的设置”

保存环境变量的设置通常有两种方法:

  • 暂时性保存:在命令行中通过export设置的环境变量只在当前的终端会话中有效,关闭这个终端后环境变量就会丢失。

  • 永久性保存:可以将环境变量设置添加到用户的bash配置文件中,使其在每次登录时都自动加载。通常在 ~/.bashrc 或者 ~/.bash_profile 文件中添加环境变量设置。如果更改是作为 root 用户进行的,那么全局环境变量设置也会在系统启动时进行加载。

设置一个新的环境变量WELCOME

终端窗口
$ export WELCOME="Hello!"
$ echo $WELCOME
Hello!

1.3 使用env命令显示所有的环境变量

跳转到“1.3 使用env命令显示所有的环境变量”
终端窗口
$ env
HOSTNAME=terry.mykms.org
PVM_RSH=/usr/bin/rsh
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000

1.4 使用set命令显示所有本地定义的Shell变量

跳转到“1.4 使用set命令显示所有本地定义的Shell变量”

本地定义的Shell变量是指在当前Shell会话中定义的变量,通常是在命令行中或在Shell脚本中使用=符号进行赋值的变量。例如,下面的命令会在当前Shell会话中定义一个变量my_var,并给它赋值hello world:

终端窗口
my_var="hello world"

这个变量my_var只在当前Shell会话中存在,如果关闭了当前会话或者打开了新的会话,这个变量就会被删除。通常情况下,我们会在Shell脚本中定义本地变量来存储中间结果或者临时数据,以便进行后续的处理。

与之相对的是环境变量。环境变量是在操作系统层面定义的全局变量,它们可以被任何进程和Shell会话访问,在当前Shell会话结束后仍然存在。

终端窗口
# 显示所有本地定义的Shell变量
$ set
BASH=/bin/bash
BASH_VERSINFO=([0]="2"[1]="05b"[2]="0"[3]="1"[4]="release"[5]="i386-redhat-linux-gnu")
BASH_VERSION='2.05b.0(1)-release'
COLORS=/etc/DIR_COLORS.xterm
COLUMNS=80
DIRSTACK=()
DISPLAY=:0.0

如果想要只显示用户自定义的变量,可以使用如下命令:

终端窗口
set | grep "^[[:alpha:]_][[:alnum:]_]*="

该命令会将所有以字母或下划线开头,后续跟随字母、数字或下划线的变量及其值输出到屏幕上。

1.5 使用unset命令来清除环境变量

跳转到“1.5 使用unset命令来清除环境变量”

unset命令是用于删除环境变量或函数的Shell命令。如果执行unset命令时指定了一个变量名或函数名,那么该变量或函数将被删除。若unset命令无参数,则不会执行任何操作。

以下是示例:

  • 删除环境变量
终端窗口
$ export MYVAR="This is my variable"
$ echo $MYVAR
This is my variable
$ unset MYVAR
$ echo $MYVAR
  • 删除函数
终端窗口
$ myfunc() {
> echo "This is my function"
> }
$ myfunc
This is my function
$ unset -f myfunc
$ myfunc
bash: myfunc: command not found
# -f选项告诉unset命令要删除一个函数,而不是一个变量。
# 如果不加-f选项,则unset命令会将变量名作为参数,并尝试删除该变量

1.6 使用readonly命令设置只读变量

跳转到“1.6 使用readonly命令设置只读变量”

如果使用了readonly命令的话,变量就不可以被修改或清除了。示例如下:

终端窗口
$ export TEST="Test..." #增加一个环境变量TEST
$ readonly TEST #将环境变量TEST设为只读
$ unset TEST #会发现此变量不能被删除
-bash: unset: TEST: cannot unset: readonly variable
$ TEST="New" #会发现此也变量不能被修改
-bash: TEST: readonly variable

环境变量的全局设置位于/etc/profile文件,如果需要增加新的环境变量可以添加下属行 export PATH=$PATH:/path1:/path2:/pahtN

apt 实际上代表的是 Advanced Package Tool,是用于 Debian 和 Ubuntu 系统上的软件包管理工具。它可以安装、卸载、更新软件包并解决其依赖关系。

  • 查看 apt-cache search package:搜索包 apt-cache show packagename:获取包的信息,如版本和大小 apt-cache depends packagename:查看包的依赖关系 apt-cache rdepends packagename:查看包的反向依赖关系

  • 安装 apt-get install packagename:安装包 apt-get install packagename --reinstall:重新安装包 apt-get -f install packagename:强行安装包 apt-get build-dep packagename:安装构建该包所需的编译环境 apt-get source packagename:下载安装该包的源代码

  • 删除 apt-get remove packagename:删除某个程序 apt-get remove packagename --purge:干净地卸载包 apt-get autoremove:自动删除不需要的包 apt-get clean:清理下载的存档文件 apt-get autoclean:自动清理不再需要的存档文件 apt-get check:检查是否存在损坏的依赖关系

  • 更新 apt-get update:更新可用的软件包列表 apt-get upgrade:更新已安装的包 apt-get dist-upgrade:升级系统(可能会有依赖关系变化) 可以通过man apt获得更为详细的解释。

apt-get update:该命令用于更新可用的软件包列表。它会检查软件源中是否有新的软件包版本或更新的信息,并将其下载到本地的软件包缓存中。运行该命令可以确保您获取到最新的软件包列表。 apt-get upgrade:该命令用于升级系统上已安装的软件包到最新可用版本。它会检查本地软件包缓存中的可用更新,并将需要更新的软件包下载并安装。运行该命令可以将系统中的软件包保持最新状态。

3 如何让linux在启动时自动加载脚本

跳转到“3 如何让linux在启动时自动加载脚本”
  1. 先编写脚本,比如名字为a.sh
  2. 保存路径为:/etc/rc.d/a.sh
  3. 修改/etc/rc.d/rc.local 在该文件末尾加入a.sh脚本的存放路径:/etc/rc.d/a.sh
  4. 保存,退出 ,就OK了。

补充: /etc/rc.d/rc.local 是一个在启动时自动执行的脚本文件,它会在 Linux 系统启动时自动被执行。你可以在此文件中添加任何你想要在启动时运行的命令,例如设置系统参数、启动服务等。

默认情况下,/etc/rc.d/rc.local 文件已经存在并且具有可执行权限。你可以编辑该文件并添加自己的命令。需要注意的是,rc.local 文件中的所有命令都是以 root 用户身份执行的,因此要慎重考虑命令的安全性。

在一些 Linux 发行版中,由于使用了 systemd,rc.local 文件不再被默认启用。如果需要使用 rc.local 文件,在新版系统中需要手动启用此功能。在使用 systemd 的系统中,要启用 rc.local 文件,可以按照以下步骤进行操作:

  1. 以管理员身份打开文件 /etc/systemd/system/rc-local.service,如果该文件不存在则新建。

  2. 编辑 /etc/systemd/system/rc-local.service 文件,添加以下内容:

终端窗口
[Unit]
Description=/etc/rc.d/rc.local Compatibility
[Service]
ExecStart=/etc/rc.d/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target
  1. 保存并关闭文件,然后执行以下命令以重新加载 systemd 配置:
终端窗口
sudo systemctl daemon-reload
  1. 启用 rc-local 服务并且运行 rc.local 脚本:
终端窗口
sudo systemctl enable rc-local
sudo systemctl start rc-local.service
  1. 验证 rc.local 服务是否已启用:
终端窗口
sudo systemctl status rc-local.service

这样就可以使用 /etc/rc.d/rc.local 文件并在 Linux 启动时自动执行指定的命令。

在Linux系统中,挂载(mount)和卸载(unmount)是用于访问和管理文件系统的重要操作。以下是一些主要原因:

  1. 访问外部存储介质:通过挂载,可以访问外部存储介质,如硬盘分区、USB闪存驱动器、光盘等。挂载这些设备将使其在文件系统中可见,从而可以读取、写入和操作设备上的文件。
  2. 组织文件系统层次结构:通过挂载,可以将不同的文件系统组织在一起,以形成文件系统层次结构。例如,根文件系统可以挂载在/目录,其他文件系统可以挂载在不同的目录(如/home、/var等),使文件系统按逻辑组织和管理。
  3. 文件系统维护和修复:卸载文件系统是进行文件系统维护和修复的前提条件。在执行诸如文件系统检查(fsck)等操作之前,必须先卸载文件系统以确保文件系统的一致性和完整性。
  4. 安全移除存储设备:在从系统中安全移除存储设备(如USB闪存驱动器)之前,需要先卸载该设备。通过卸载设备,可以确保所有的写入操作已完成并将缓冲数据刷新到设备上,以避免数据丢失或损坏。 系统启动时的自动挂载:在系统启动过程中,可以通过配置文件(如/etc/fstab)来指定哪些文件系统应在启动时自动挂载。这样可以确保系统启动后,相关的文件系统已准备好并可供访问。

mount语法: mount [-t 文件系统类型] [-o 挂载选项] 设备文件路径 挂载点

-t 选项用于指定分区上文件系统的类型。您最常遇到的文件系统应该是

  • ext2(GNU/Linux 文件系统)
  • ext3(改进了日志性能的 ext2FS),
  • VFAT(适用于所有 DOS/Windows® 分区:FAT 12, 16 or 32)
  • ISO9660(CD-ROM 文件系统)
  • NTFS

如果您不指定任何类型,mount 将会试着读取分区中的超块来猜测文件系统。 -o 用于指定挂载选项,选项用于指定一个或多个挂载选项。可供选择的选项视文件系统类型不同而有所不同。 设备文件路径 表示要挂载的设备文件路径, 挂载点 表示挂载的目标路径。通常将分区挂载在 /mnt 或其它挂载点(挂载点必须已经存在) 。

举例:

终端窗口
$ mount -t ext3 /dev/hdb1 /mnt

要卸下分区,可使用 umount 命令,语法:

终端窗口
umount <挂载点|设备>

举例:

终端窗口
$ umount /mnt
或者:
$ umount /dev/hdb1

提示:有些时候,可能某些设备(通常是 CD-ROM)正忙或无法响应。此时,大多数用户的解决办法是重新启动计算机。我们大可不必这么做。例如,如果 umount /dev/hdc 失败的话,您可以试试“lazy” umount。语法十分简单: umount -l <挂载点|设备> 此命令将会断开设备并关闭打开该设备的全部句柄。通常,您可以使用 eject <挂载点|设备>命令弹出碟片。所以,如果 eject 命令失效而您又不想重新启动,请使用 lazy umount。

如果我们想让系统在启动的时候自动挂载某些分区,则应该编辑/etc/fstab文件。该文件的每一行对应一组挂载关系,包括文件系统、挂载点以及其它选项。这里是该文件的一个例子:

终端窗口
/dev/hda1 / ext2 defaults 1 1
/dev/hda5 /home ext2 defaults 1 2
/dev/hda6 swap swap defaults 0 0
none /mnt/cdrom supermount dev=/dev/scd0,fs=udf:iso9660,ro,-- 0 0
none /mnt/floppy supermount dev=/dev/fd0,fs=ext2:vfat,--,sync,umask=0 0 0
none /proc proc defaults 0 0
none /dev/pts devpts mode=0622 0 0

每行都由以下内容组成:

  • 文件系统所在的设备;

  • 挂载点;

  • 文件系统类型;

  • 挂载选项;

  • dump 工具备份标志;

  • fsck(文件系统检查(FileSystem ChecK))的检查顺序。

  • 总是有一行说明了根文件系统。

swap 分区是一种特殊的分区,因为您无法在树形结构中找到其对应位置,而且这些分区的挂载点域只写着 swap 关键字。

/proc文件系统是在Linux系统中运行的进程信息文件系统。它不是一个真正的文件系统,因为它不存储任何数据在硬盘上。相反,它是一个内核提供的虚拟文件系统,它提供了一个接口,可以让用户和进程访问内核和进程的信息。/proc提供了许多有用的文件和目录,包括正在运行的进程的信息、系统内存映射、硬件设备和内核参数等。这些文件和目录可以被读取和修改,以提供对系统的深入了解和控制。/proc文件系统对调试系统和分析系统问题非常有用。

/dev/pts是一个特殊的设备文件,它提供了一个基于字符的虚拟终端。每当用户在终端程序(例如gnome-terminal或xterm)中打开新窗口时,都会为该窗口创建一个虚拟终端。这些虚拟终端将作为/dev/pts/X目录中的文件出现,例如,/dev/pts/0是第一个虚拟终端的文件名。通过使用这些文件,用户可以在不同的终端窗口之间切换,并在每个虚拟终端中执行不同的任务。并且可以通过这些文件进行读写操作。

举例个例子,如果想把/dev/hdb1自动挂载到 /usr ,就得在/etc/fstab文件中添加下面一行:

终端窗口
/dev/hdb1 /usr ext2 defaults 1 2

这样,分区将会在每次启动时自动挂载,并且必要时检查错误。

介绍两个特殊选项:noauto 和 user。

  • noauto 选项指定了文件系统不应该在启动时挂载,而只应该在您想要挂载的时候才挂载。
  • user 选项指定了任何用户都可以挂载或卸下文件系统。 这两个选项通常用于 CD-ROM 和软盘驱动器。 要挂载文件中描述的文件系统,您只需要引用挂载点或设备。要挂载软盘,您可以只输入:
终端窗口
$ mount /mnt/floppy
或:
$ mount /dev/fd0

问:用fcntl给文件加锁, 在一个进程中加给一个文件多次加同一类型的锁,不会报错吗? 答:如果一个进程对一个文件区间已经有一把锁,后来该进程又企图在同一文件区间再加一把锁,那么新锁将替换老锁。

在Linux系统中,可以使用fcntl(文件控制)函数给文件添加锁。fcntl是一个系统调用,用于对文件描述符进行操作。其中,fcntl函数可以用来给文件加锁,操作如下:

int res = fcntl(fd, F_SETLK, &fl);

其中,fd是文件描述符,fl是一个结构体,用于描述锁的类型、起始位置、长度等信息。具体来说,fl结构体的定义如下:

struct flock {
short l_type; /* 锁定的类型,F_RDLCK、F_WRLCK 或 F_UNLCK */
short l_whence; /* 文件的偏移量基点,SEEK_SET、SEEK_CUR 或 SEEK_END */
off_t l_start; /* 被锁定区域(起始位置) */
off_t l_len; /* 被锁定区域(长度) */
pid_t l_pid; /* 锁定进程的进程 ID */
};

调用fcntl函数时,如果返回值res为0,表示加锁成功;如果res为-1,表示加锁失败,此时需要查看errno变量来确定具体的失败原因。

FrameBuffer 是内核当中的一种驱动程序接口,这种接口将显示设备抽象为帧缓冲区。 用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。该驱动程序的设备文件一般是 /dev/fb0、/dev/fb1 等等。比如,假设现在的显示模式是1024x768-8位色,则可以通过如下的命令清空屏幕:

终端窗口
$ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768

在应用程序中,一般通过将FrameBuffer设备映射到进程地址空间的方式使用,比如下面的程序就打开 /dev/fb0 设备,并通过 mmap 系统调用进行地址映射,随后用 memset 将屏幕清空(这里假设显示模式是 1024x768-8 位色模式,线性内存模式):

int fb;
unsigned char* fb_mem;
fb = open ("/dev/fb0", O_RDWR);
fb_mem = mmap (NULL, 1024*768, PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);
memset (fb_mem, 0, 1024*768);

FrameBuffer 设备还提供了若干ioctl命令,通过这些命令,可以获得显示设备的一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等。

通过FrameBuffer设备,还可以获得当前内核所支持的加速显示卡的类型(通过固定信息得到),这种类型通常是和特定显示芯片相关的。比如目前最新的内核(2.4.9)中,就包含有对 S3、Matrox、nVidia、3Dfx 等等流行显示芯片的加速支持。在获得了加速芯片类型之后,应用程序就可以将 PCI 设备的内存I/O(memio)映射到进程的地址空间。这些memio一般是用来控制显示卡的寄存器,通过对这些寄存器的操作,应用程序就可以控制特定显卡的加速功能。

PCI 设备可以将自己的控制寄存器映射到物理内存空间,而后,对这些控制寄存器的访问,给变成了对物理内存的访问。因此,这些寄存器又被称为”memio”。一旦被映射到物理内存,Linux 的普通进程就可以通过 mmap 将这些内存 I/O 映射到进程地址空间,这样就可以直接访问这些寄存器了。

mmap(内存映射)是一种将文件映射到内存的方法。通过使用mmap技术,可以将文件视为一个大的数组,并在需要的时候将部分文件加载到内存中,而不必每次都从磁盘上读取或写入文件,这可以提高读写文件的速度。mmap常用于编程中,例如读取大的数据集或在进程之间创建共享内存。

当然,因为不同的显示芯片具有不同的加速能力,对memio 的使用和定义也各自不同,这时,就需要针对加速芯片的不同类型来编写实现不同的加速功能。比如大多数芯片都提供了对矩形填充的硬件加速支持,但不同的芯片实现方式不同,这时,就需要针对不同的芯片类型编写不同的用来完成填充矩形的函数。 FrameBuffer只是一个提供显示内存和显示芯片寄存器从物理内存映射到进程地址空间中的设备。所以,对于应用程序而言,如果希望在 FrameBuffer 之上进行图形编程,还需要完成其他许多工作。举个例子来讲,FrameBuffer 就像一张画布,使用什么样子的画笔,如何画画,还需要自己动手完成。

一些二进制格式的文件。你想知道里面有哪些常量字符串。就非常有用,它会在文件中搜索ASCII和Unicode字符串,并将它们提取出来。比如你生成这样一个程序,a.c:

int main (void)
{
return printf ("hello world\n");
}
#cc -o a.out a.c
#strings ./a.out
/lib64/ld-linux-x86-64.so.2
_Jv_RegisterClasses_
_gmon_start_
_
libc.so.6
printf
__libc_start_main
GLIBC_2.2.5
hello world

终端设备是一种字符型设备,它有多种类型,通常使用tty来统称。tty是TeleTYpewriter的缩写。Teletype是最早出现的一种终端设备,很象电传打字机(或者说就是?),是由Teletype公司生产的。在Linux系统的设备特殊文件目录/dev/下,终端设备文件一般有以下几种:

  • 串端终端(/dev/ttySn) 串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。有段时间这些串行端口设备通常被称为终端设备,因为那时它的最大用途就是用来连接终端。这些串行端口所对应的设备名称是/dev/tts/0(或/dev/ttyS0)、/dev/tts/1(或/dev/ttyS1)等,设备号分别是(4,0)、(4,1)等,分别对应于DOS系统下的COM1、COM2等。若要向一个端口发送数据,可以在命令行上把标准输出重定向到这些特殊文件名上即可。例如,在命令行提示符下键入:echo test > /dev/ttyS1会把单词”test”发送到连接在ttyS1(COM2)端口的设备上。

  • 伪终端(/dev/pty/) 伪终端(Pseudo Terminal)是成对的逻辑终端设备,例如/dev/ptyp3和/dev/ttyp3(或着在设备文件系统中分别是/dev/pty/m3和/dev/pty/s3)。它们与实际物理设备并不直接相关。如果一个程序把ttyp3看作是一个串行端口设备,则它对该端口的读/写操作会反映在该逻辑终端设备对的另一个上面(ptyp3)。而ptyp3则是另一个程序用于读写操作的逻辑设备。这样,两个程序就可以通过这种逻辑设备进行互相交流,而其中一个使用ttyp3的程序则认为自己正在与一个串行端口进行通信。这很象是逻辑设备对之间的管道操作。 对于ttyp3(s3),任何设计成使用一个串行端口设备的程序都可以使用该逻辑设备。但对于使用ptyp3的程序,则需要专门设计来使用ptyp3(m3)逻辑设备。 例如, 如果某人在网上使用telnet程序连接到你的计算机上,则telnet程序就可能会开始连接到设备ptyp2(m2)上(一个伪终端端口上)。此时一个getty程序就应该运行在对应的ttyp2(s2)端口上。当telnet从远端获取了一个字符时,该字符就会通过m2、s2传递给getty程序,而getty程序就会通过s2、m2和telnet程序往网络上返回”login:”字符串信息。这样,登录程序与telnet程序就通过“伪终端”进行通信。通过使用适当的软件,就可以把两个甚至多个伪终端设备连接到同一个物理串行端口上。 在使用设备文件系统(device filesystem)之前,为了得到大量的伪终端设备特殊文件,使用了比较复杂的文件名命名方式。因为只存在16个ttyp(ttyp0—ttypf)的设备文件,为了得到更多的逻辑设备对,就使用了象q、r、s等字符来代替p。例如,ttys8和ptys8就是一个伪终端设备对。不过这种命名方式目前仍然在于RedHat等Linux系统中使用着。 但Linux系统上的Unix98并不使用上述方法,而使用了pty master方式,例如/dev/ptm3。它的对应端则会被自动地创建成/dev/pts/3。这样就可以在需要时提供一个pty伪终端。目录/dev/pts是一个类型为devpts的文件系统,并且可以在被加载文件系统列表中看到。虽然“文件”/dev/pts/3看上去是设备文件系统中的一项,但其实它完全是一种不同的文件系统。

设备文件系统(Device Filesystem),也称为/dev文件系统,是Linux操作系统的一个特殊文件系统,用于提供对计算机硬件设备的访问。在Linux系统中,一切都被视为文件,包括硬件设备。设备文件系统提供了一个统一的文件接口,使得用户可以通过文件操作的方式访问硬件设备。 在设备文件系统中,每个硬件设备都被表示为一个文件,这个文件可以被打开、读取、写入和关闭等。这些设备文件通常位于/dev目录下,并且以特殊字符设备文件和块设备文件两种形式存在。

  • 特殊字符设备文件表示不可寻址的设备,例如麦克风、键盘等。
  • 块设备文件表示寻址的设备,例如硬盘、光驱等。这些设备文件可以被应用程序打开,读取和写入数据。例如,磁盘分区可以通过块设备文件在文件系统中挂载,然后可以通过文件操作的方式来读取和写入文件。
  • 控制终端(/dev/tty) 如果当前进程有控制终端(Controlling Terminal)的话,那么/dev/tty就是当前进程控制终端的设备特殊文件。可以使用命令”ps –ax”来查看进程与哪个控制终端相连。对于你登录的shell,/dev/tty就是你使用的终端,设备号是(5,0)。使用命令”tty”可以查看它具体对应哪个实际终端设备。/dev/tty有些类似于到实际所使用终端设备的一个联接或别名。

  • 控制台(/dev/ttyn, /dev/console) 在Linux系统中,计算机显示器通常被称为控制台终端或控制台(Console)。它仿真了类型为Linux的一种终端(TERM=Linux),并且有一些设备特殊文件与之相关联:tty0、tty1、tty2等。当你在控制台上登录时,使用的是tty1。使用Alt+[F1—F6]组合键时,我们就可以切换到tty2、tty3等上面去。tty1 –tty6等称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名,Linux系统所产生的信息都会发送到该终端上。因此不管当前我们正在使用哪个虚拟终端,系统信息都会发送到我们的屏幕上。 你可以登录到不同的虚拟终端上去,因而可以让系统同时有几个不同的会话存在。但只有系统或超级用户root可以向/dev/tty0进行写操作,而且有时/dev/console会连接至/dev/tty0或/dev/tty1上。

  • 其它类型 Linux系统中还针对很多不同的字符设备建有很多其它种类的终端设备特殊文件。例如针对ISDN设备的/dev/ttyIn终端设备等。

nm命令和strip命令都是Unix/Linux系统下的命令。

nm命令是用来显示目标文件中的符号表的,并且可以显示出符号类型、符号地址等信息。它的基本语法如下:

终端窗口
nm options file

其中,options 是可选的参数,file 是要显示符号表的目标文件。常用的选项有:

  • -p:按字母顺序排序并显示符号名;
  • -t:按地址排序并显示符号名;
  • -u:显示未定义符号;
  • -r:显示符号的逆向依赖关系;
  • -f:显示符号所在的文件名和行号。

例如,如果要查看一个可执行程序a.out中的符号表,可以使用以下命令:

终端窗口
nm a.out

strip命令则是用来剥离目标文件中的符号表和调试信息的。它可以减小可执行文件或动态库的大小,并且防止反汇编等操作。它的基本语法如下:

终端窗口
strip options file

其中,options 是可选的参数,file 是要剥离符号表和调试信息的目标文件。常用的选项有:

  • -s:剥离所有符号表和调试信息;
  • -g:只剥离调试信息,保留符号表;
  • -S:只剥离符号表,保留调试信息;
  • -o file:将剥离后的文件保存到指定的文件中。

例如,如果要剥离一个可执行程序a.out中的符号表和调试信息,可以使用以下命令:

终端窗口
strip -s a.out

来源:CSDN 原文,首次发布于 2023-07-09。