如何安装一个软件
对于很多linux/ubuntu新手来说,要想在Linux系统上熟练地安装、升级、卸载软件,确实是挺考验人的一件事,会遇到各种各样的问题,有时候会把人搞得很不耐烦,打击人的学习积极性。Ubuntu一般使用apt-get命令 (ubuntu16.04版本以后也可以使用apt) 来安装、升级、卸载软件。比如我们想安装vim,常用下面的命令进行安装:
$ sudo apt-get install vim
顺利安装还好,但有时候还是会遇到各种各样的问题,虽说有时候能通过互联网解决掉,但是对于 apt-get 如何安装的却不是很清楚,比如什么是软件源,就没有啥概念。本节就是跟大家一起了解下Ubuntu环境下 apt-get 的软件安装基本原理。
想要了解apt-get的工作原理,首先我们要明白软件的安装是怎么回事。我们知道一个程序的运行,一般是要先加载(load)到内存(RAM)中,因为RAM存储器支持随机读写,因此CPU可以一条一条地去取指令、翻译指令、运行指令。但是RAM有一个缺点,就是断电后数据会消失,无法保存。因此,我们需要将程序文件保存到一个非易失性存储器上,比如硬盘、NAND Flash上,断电后数据也可以保存。把程序保存到磁盘上的过程其实就是软件的安装过程,早期的单片机裸机环境,程序一般都是使用专门的工具直接烧写到Flash上的,后来有了OS和文件系统,我们可以很方便的通过鼠标,直接将程序文件安装到某个文件目录下面,程序在运行时,系统就可以直接到这个目录下面找到对应的二进制文件,加载到内存,然后就可以直接运行了。
无论是Windows还是Linux,基本流程都是如此:告诉系统你的程序二进制文件存放到哪里了,然后程序在运行时,系统就会到这个指定的路径下面去找你要运行的二进制程序文件,加载到内存,然后运行。在Windows下面,你安装好软件后,在桌面上会有一个快捷方式,其实就是指向你安装路径的软链接。在Linux环境下面,我们要运行的程序一般是放在默认的路径下面的,如:/bin、/sbin、/usr/bin、/usr/sbin等。比如你在shell下面运行:
$ ls
命令时,系统就会到这些默认的路径下面去寻找ls文件,在/bin/ls下面找到后,就会加载到内存,然后 ls 程序就可以运行了。
我们写一个简单的helloworld程序,编译为a.out,我们可以直接运行它:
$ ./a.out
为什么不能直接运行$ a.out呢,因为我们的a.out没有安装到默认路径,因此运行时,你要指定路径信息,否则系统就找不到。你把a.out放到默认的/usr/bin下面,然后就可以直接通过$ a.out文件名去执行程序了。当然,你可以可以把自己编译的a.out二进制文件放在自定义的某个目录下面,然后以环境变量的形式告诉系统这个安装路径,当系统在那些默认路径下面找不到时,会到这个安装路径下查找。
制作dpkg软件包
我们在Linux环境下安装软件时,最简单的方法是从网上下载这个二进制程序文件,放到Linux系统中的默认路径下面就可以了。但是有些程序是采用动态链接编译的,运行时需要依赖一些动态共享库,因此需要打包一起安装。我们下载的软件一般很少是一个单纯的二进制文件,而是压缩包的形式,在这个压缩包里有:二进制程序文件、动态链接库、软件文档说明、安装信息、甚至有一些自动安装的脚本等。在 Debian 和 Ubuntu 环境下,这个压缩包格式为deb格式,我们安装软件时,先从网上下载对应的deb包,然后可以使用dpkg工具去解析这个包、安装这个包。
$ dpkg -i xxx.deb 安装xxx.deb软件包
$ dkpg -R /home/xxx 安装xxx目录下的多个deb包
$ dkpg -r xxx 卸载xxx软件包
当然你也可以将自己的二进制程序制作成一个deb安装包,放到网上,供其他人下载安装:
$ apt install checkinstall dh-make
$ ./configure --prefix=/home/tools //配置编译信息
$ make //编译你的程序
$ checkinstall //制作deb包
$ dpkg -i xxx.deb //安装deb包