目录

  • /dev 目录是干什么的?
  • /proc 和 /sys 目录是干什么的?
  • udev 这个软件是干什么用的?
  • 目录映射是临时性的,还是永久性的?
  • 命令行里大括号 “{}” 的作用是什么?
  • 设置目录权限为 “1777” 表示什么?
  • ls -l 后,第一列第一个字符表示什么?第三列和第四列又表示什么?
  • exec 命令的特点是什么?
  • 其他函数库文件都已 lib 开头,那么 ld 开头的函数库文件有什么不同呢?
  • ldd /bin/cat 的结果如何解析?
  • 是 ldd 命令表示共享库文件,还是 ld-linux.so.2 显示出来?
  • ld-linux.so.2 是哪个平台的名称?其他平台也叫这个?
  • ldd 命令的本质是什么?

/dev 目录是干什么的?

该目录用于存放各种设备文件。

Linux 下都是通过文件的形式来进行设备访问的,设备文件的类型包括块设备、字节设备、虚拟设备等。

/proc 和 /sys 目录是干什么的?

这两个目录是用于存放和内核数据相关的内容,通过内核自身的虚拟文件系统将内核中的信息以文件的形式体现出来,可以通过这些文件与内核进行交互。

udev 这个软件是干什么用的?

udev 软件包中含有一组用于动态创建设备文件的程序,可以将这些程序一并称为 Udev 系统。

大多数 Linux 系统会使用 Udev 系统来管理 /dev 目录中的设备文件,Udev 系统会自动检测计算机丙且生成设备文件,Udev 系统还具有热插拔设备的管理能力,能够根据设备的实际使用情况来进行动态的创建和删除设备文件,几大的节省管理设备文件的难度。

目录映射是临时性的,还是永久性的?

被映射的源目录和映射目录内容上保持一致,对他们中的任何一方目录内的改动将直接导致另一方同样的修改。

与链接文件处理方式不同,源目录和映射目录都必须是实际的目录而不是链接文件,目录映射并不依赖源目录的存在位置,即使在简历好目录映射后,改变源目录的名称或者位置都不会影响到映射目录的内容。

命令行里大括号 "{}" 的作用是什么?

表示将需要处理的字幕中相同部分进行合并,不同的内容和大括号内的字符组合,类似数学上的合并同类项。

例如: mkdir -pv /var/{lock, log, mail, run, spool}

等于:mkdir -pv /var/lock /var/log /var/mail /var/run /var/spool

还有一种使用方法

例如:mkdir -pv /usr/{, local/}share/man/man{1..8}

这个命令会创建如下的目录:

/usr/share/man/man1
/usr/share/man/man2
一直到 /usr/share/man/man8
然后
/usr/local/share/man/man1
/usr/local/share/man/man2
一直到 /usr/share/man/man8

设置目录权限为 "1777" 表示什么?

后三位是权限模式,第一位是粘贴位,设置为 1 后,可以使用户不能从中删除其他用户创建的文件或者目录。

ls -l 后,第一列第一个字符表示什么?第三列和第四列又表示什么?

第一列用 10 个自负来表示文件的类型以及访问权限。

其中第一个自负代表这个文件的类型。

-: 表示一般文件
d:表示目录
l:表示链接文件
c:表示字符设备文件
b:表示块设备文件
p:表示管道文件

第三列表示文件的所属用户,第四列表示的则是该文件所属组的名称。

exec 命令的特点是什么?

与直接运行程序的方式不同,exec 将使运行的程序覆盖调用他的程序,即在 bash 下运行 exec,bash 将推出运行。

而 exec 所执行的程序将替代 bash 执行。

具体过程如下:

当前运行了一个 bash ,称为 bash1 ,运行状态如下:

bash1

然后在其上直接运行 bash 命令,刚运行的 bash 称为 bash2 ,这时实际上是有两个bash 在运行的,而当前是由 bash2 来与用户交互,运行状态如下:

bash1 -> bash2

这时使用 ls 命令:

bash1 -> bash2 -> ls

而如果使用 exec ls 来运行 ls 命令,将会使用 ls 命令来替代 bash2 运行,此时的运行状态如下:

bash1 -> ls

ls 命令执行完成后,将会退回到 bash1 上:

bash1

需要注意的,如果你直接就在 bash1 下使用 exec 来执行命令,那么执行完毕后,终端会自动关闭,因为已经没有 shell 了。

其他函数库文件都已 lib 开头,那么 ld 开头的函数库文件有什么不同呢?

Glibc 只能黄的文件中,有一个特殊的函数库文件,就是 ld-linux.so.2,这个文件在不同的平台上会有不一样的名字,但是名字都以 ld 开头,这一点非常特别。

这以 ld 开头的共享函数库文件的特别之处在于,他是用来寻找其他函数库文件的函数库。

使用 ldd 明林过去查看一个动态链接的文件,其链接的共享函数库中一定会有一个 ld 开头的文件,这个函数库文件的作用就是用来帮助该文件在运行期间想寻找其他函数库文件。

ldd /bin/cat 的结果如何解析?

使用这个命令后,显示的结果如下:

linux-gate.so.1 => (0xb77d800)
libc.so.6 => /lib/libc.so.6 (0xb7662000)
/lib/ld-linux.so.2 (0xb77d9000)

对于每行最后十六进制的地址我们可以不用理会,它代表的是各个函数库文件的入口地址。

其中 linux-gate.so.1 不是实际的函数库文件,它是虚拟的函数库文件,用于和 Linux 内核进行接口。

libc.so.6 => /lib/libc.so.6

表达的含义就是 cat 命令在运行的时候需要使用 libc.so.6 这个共享函数库,而这个函数库文件就位于 /lib/libc.so.6

那么 libc.so.6 这个文件是如何被系统找到,在 ldd /bin/cat 命令运行的时候又是如何发现该文件的存放位置的呢?

要回答这个问题,要先来看ldd 命令显示内容的最后一行:/lib/ld-linux.so.2 这个函数库并没有和 libc.so.6 使用一样的表示方式,而是直接就定位到 /lib/ld-linux.so.2 上,而正是这个函数库,帮 cat 命令找到所需要的其他函数库文件,比如 libc.so.6

是 ldd 命令表示共享库文件,还是 ld-linux.so.2 显示出来?

如果 ld-linux.so.2 寻找运行时需要的函数库文件,但是谁来查找 ld-linux.so.2 这个文件呢?

答案是只要直接将该文件的路径写在程序中,就可以不用寻找了,这也是为什么 GCC 的配置文件中会专门处理该文件的原因。只要为程序提供了 ld=linux.so.2 的路径,那么其他的共享函数库文件如何寻找就由该函数库的功能来决定了。

这样卡莱 cat 命令需要用到其他函数库时,首先会将需要的函数库名称告诉给 ld-linux.so.2 听,如果需要 libc.so.6 就由该函数库根据相关的设置来进行查询,这些设置包括 lD_LIBRAY_PATH 环境变量的设置,/etc/ld.so.conf 中的配置和 ld-linux.so.2 自己的默认搜索路径等。

所以并非 ldd 命令将 cat 明林龟缩依赖的函数库显示出来,而是 cat 命令自己显示的结果,cat 命令也是因为使用 ld-linux.so.2 才能显示需要的函数库所存放的目录为止,可以使用如下命令来验证:

/lib/ld-linux.so.2 --list /bin/cat

其显示的效果将和使用 ldd /bin/cat 是一样的。

所以,cat 命令功能上只依赖于 libc.so.6 这个函数库,而实际上,要正常的运行 ld-linux.so.2 也是不能缺少的,但是如果静态编译的程序,就不需要 ld-linux.so.2 来参与运行了。

ld-linux.so.2 是哪个平台的名称?其他平台也叫这个?

ld-linux.so.2 是 x86 平台上的名称,在不同的平台上名称会有所不同,如在 MIPS 平台上就是 ld.so.1 但是都是以 ld 开头的名字。

ldd 命令的本质是什么?

ldd 命令用于将指定命令所依赖的共享函数库显示出来。

ldd 命令本身是一个脚本文件,以办事hi用 bash 来解释执行。

该命令虽然功能上表现为 显示指定的想和程序所依赖的共享函数库,但是实际上该命令是通过设置环境变量的方式来使得程序运行在一种特殊的状态下面的,该状态将不会运行命令的实际功能,而是显示其所依赖的函数库,通过下面的命令来验证:

LD_TRACE_LOADED_OBJECTS=1 /bin/cat

运行结果和 ldd /bincat 命令结果是一致的。

依赖 Glibc 的任何程序在环境变量 LD_TRACE_LOADED_OBJECTS 不为空的情况下,都会显示其所依赖的函数库文件以及函数库锁在目录,所以该环境变量设置为 0 也一样是显示依赖库的结果。

想再进一步了解为何设置该环境变量就会显示依赖函数库,就需要去了解机遇 Glibc 的 ld-linux.so.2 函数库,使用下面的命令也可以显示命令依赖的函数库。

/lib/ld-linux.so.2 --list /bin/cat

动态链接的程序会使用该函数库来查找依赖的其他函数库文件,该函数库中的函数在检测到有 LD_TRACE_LOADED_OBJECTS 不为空的时候将显示依赖的函数库以及存放为止,而不运行程序,这点可以通过下面的命令来验证:

LD_TRACE_LOADED_OBJECTS=1 /sbin/insmod.static

该命令的执行结果与直接运行 /sbin/insmod.static 一样,不受环境变量设置的影响,因为 /sbin/insmod.static 是一个静态编译的程序文件,运行时没有 ld-linux.so.2 参与,因此不会对环境变量 LD_TRACE_LOADED_OBJECTS 做出响应。

换句话说,如果想对这个环境变量做出响应,就需要该程序是利用共享函数库进行动态编译的程序,静态编译的程序是不会对该环境变量产生反应的。

《手把手教你构建自己的 Linux 系统》学习笔记(6)的更多相关文章

  1. 《手把手教你构建自己的 Linux 系统》学习笔记(10)

    目录 /etc/fstab 文件的作用是什么? Linux 内核的图形化启动是怎么回事? Linux 系统中的文件名是否以大小写来进行区别? 「GRUB 中无法找到硬盘」怎么解决? 「GRUB 及配置 ...

  2. 《手把手教你构建自己的 Linux 系统》学习笔记(9)

    目录 autoreconf 命令的作用是什么? aclocal automake -a autoconf 一条命令搞完三面三步 既然有其他的「编译控制软件」为何还是使用 make 来进行编译控制? M ...

  3. 《手把手教你构建自己的 Linux 系统》学习笔记(8)

    目录 Binutils 软件包有什么用? make -k 的作用是什么? man-pages 里有几种文档?分别表示什么意思? 如何查询指定目录的 man-pages ? 如何使用 make 命令的同 ...

  4. 《手把手教你构建自己的 Linux 系统》学习笔记(5)

    交叉编译是什么? 交叉编译就是在一个系统上,编译生成另外一个系统运行的程序文件. 「硬件体系结构」和「操作系统」的关系是什么? 硬件体系结构也可以称为架构,主要是通过 CPU 的指令集来进行区分的,操 ...

  5. 《手把手教你构建自己的 Linux 系统》学习笔记(2)

    Linux 系统定制原理 虚拟根目录 我们的目标是为了完成目标系统(也就是我们要做的系统),他是一个可以独立运行的系统,不依赖雨主系统和临时系统,根据 Linux 系统的特点它需要存放在根目录下面,但 ...

  6. 《手把手教你构建自己的 Linux 系统》学习笔记(1)

    第二章.基础准备--Linux 系统定制原理 Linux 系统的组成及架构 共享库和静态库 在 Linux 系统中,函数库包含两种形式:共享库和静态库. 共享库 共享库在程序运行时,为其提供所需要的函 ...

  7. 《手把手教你构建自己的 Linux 系统》学习笔记(7)

    目录 tee 命令的缺陷是什么?如何解决这个缺陷? /etc/ld.so.conf 文件的作用是什么? 动态链接和静态链接有什么不同? 动态编译 静态编译 共享库为什么会有版本?共享库的版本升级原理是 ...

  8. 《手把手教你构建自己的 Linux 系统》学习笔记(4)

    汇编链接器(Binutils) 这是一个软件包,这个软件包其实是一个工具集,里面含有了大量的用于汇编程序活着读取二进制文件相关的程序. CC 它是一条命令的别名,这条命令的作用是使用 GCC 的 C ...

  9. 《手把手教你构建自己的 Linux 系统》学习笔记(3)

    需要注意的是,制作操作系统权限全程都要用 root pushd 和 popd 为了方便目录管理,所以出现了这种两个命令,他们的原理就是利用堆栈来实现目录管理. 这两个命令,pushd 负责将指定的目录 ...

随机推荐

  1. Macbook 安装 opencv(cv2) 及在pycharm 下的使用

    python和opencv的安装都很顺利,就是在PyCharm下的配置浪费了一点时间. 一.原料 1.max系统 2.python(本文用的版本是3.6.5) 3.opencv(本文中使用的版本是3. ...

  2. Centos 7 部署lnmp集群架构

    前言介绍 lnmp的全程是 linux + nginx + mysql + php; lnmp就是上述系统及应用程序的简写组合: lnmp其实已经代表了一个用户正常对一个页面请求的流程,nginx接收 ...

  3. spring cloud oauth2+JWT整合使用token返回JWT Cannot convert access token to JSON解决办法

    我碰到的问题是Token正常,但是资源访问不了,原因是,资源服务配置的时候需要传一个对象: 设置了这个就可以了

  4. 推荐一本书学习springcloud书籍的SpringCloud微服务全栈技术与案例解析

    整本书还算是挺详细的,基本大部分轮子都讲到了,唯一不足就是版本比较旧,而且springcloud 版本现在迭代这么快 很多内容其实高版本中完全没有了,得自己敲代码多采坑 前面基本章节其实可以大致略过一 ...

  5. Message: 'chromedriver' executable needs to be available in the path.

    环境:windows10 python:3.7.3 已经把 executable.exe 添加到了环境变量中,但还是会提示以上错误. 解决办法: from selenium import webdri ...

  6. 在Centos上安装docker,部署mysql数据库

    何为docker? Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. 本机环境 24小时不关机的Centos ...

  7. 一个新实验:使用gRPC-Web从浏览器调用.NET gRPC服务

    今天给大家翻译一篇由ASP.NET首席开发工程师James Newton-King前几天发表的一篇博客,文中带来了一个实验性的产品gRPC-Web.大家可以点击文末的讨论帖进行相关反馈.我会在文章末尾 ...

  8. HDU 1004 Let the Balloon Rise(STL初体验之map)

    Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...

  9. java13人机猜拳

    public class Demo01 { public static void main(String[] args) { /* * 你同桌和你要玩游戏. * 1 剪刀,2 石头,3 布 */ // ...

  10. 如何高效地远程部署?自动化运维利器 Fabric 教程

    关于 Python 自动化的话题,在上一篇文章中,我介绍了 Invoke 库,它是 Fabric 的最重要组件之一.Fabric 也是一个被广泛应用的自动化工具库,是不得不提的自动化运维利器,所以,本 ...