Linux 安装软件的实质

993 阅读3分钟

一切都是文件

Linux 安装软件,其实就是把一些文件分门别类拷贝到它们应该在的地方的过程。

被安装的这个软件,是由一堆文件组成的。这一堆文件被分门别类放到一些或提前约定好、或根据自带规则创建的文件夹中,依赖着系统中的另外一些文件,就可以运行起来了。

从 RPM 包讲起

RPM 包,是最早由 Redhat 系 Linux 用起来的软件包。

构建软件包,其实就是要把软件包含的所有文件分门别类按照目标系统的目录结构来准备好,然后打成一个 rpm 文件。

这样一来,用户到目标系统中安装时只需要按照目录复制进去即可。

比如,我这里解包一个 firefox 的包,解包后目录结构如下:

image-20210415083031478.png

安装软件

可执行文件

要么直接把本身放到系统【知道的】文件夹中(也就是已经在环境变量中的目录,比如 usr/bin/ ),我们可以在 shell 中直接用;

  • 比如包管理器直接装的多数软件,比如带有 service 的软件

要么是放到某些系统不知道的文件夹中,然后在另外一些作为【入口】的文件夹中,然后把它们建立起联系,另外一些软件通过检查【入口文件夹】里面存在的东西,来间接地把这个软件暴露出来,让我们可以用;

  • 比如装一个 GUI 应用,这个应用本身二进制文件不在环境变量的目录中,但它可以:

    • 建立一个 .desktop 文件,里面包含软件本身的信息。如 Typora 的 .desktop 文件

    image-20210415080650345.png 这个文件放在 ~/Desktop/,就会成为桌面上的一个图标,双击即可打开 Typora (不是快捷方式);

    这个文件放在 /usr/share/applications/ ,这个图标就会被加到开始菜单中,双击即可打开 Typora。还是拿上面的 firefox 举例,这个 rpm 包安装时就会创建对应 .desktop 文件 image-20210415083155576.png

    真正的“快捷方式”是一个链接,比如我桌面上的 firefox ,在 ls 中打出如下: image-20210415081130099.png
    当然也可以通过这个入口打开程序

再要么,是放到某些系统不知道的文件夹中,然后在系统知道的文件中建立一个链接,让我们可以使用(其实链接也是一种文件,所以我觉得可以和上面的归成一类)

非可执行文件( 头文件、库等 )

使用安装包安装的这些文件( 如用 yum ),一般都会放到对应的目录中。

如头文件会放到各种 include 中( 也就是 gcc 默认的搜索目录 ),库会放到库目录中。

而自己使用二进制包装的工具(比如直接下的二进制 tar 包),往往并不会放到系统环境变量的目录中(特别是包含多个文件夹的情况下,这种情况也不好自己硬拆了装),因此往往需要自己把这东西加入到环境变量中。