ubuntu用户应该都用过apt和apt-get这两个包管理器,其工作原理大致上就是访问
/etc/apt/sources.list
记录的url地址(也就是我们说的源地址),从上面下载deb包到本地,然后再把该deb包安装到系统中。
本篇文章介绍一下如何创建私有源。所谓私有源就是个人创建的源,一般情况不配置外网,遂只是在局域网内可以使用。不同于ubuntu官方源,阿里云源,清华源等,可以让整个互联网用户进行访问。
1.创建一个程序
sun@sun-pc:~/myProjects$ mkdir -p pri_src_test/src
sun@sun-pc:~/myProjects$ cd pri_src_test/src/
sun@sun-pc:~/myProjects/pri_src_test/src$ vi pri_src_test.cpp
打开pri_src_test.cpp后,内容如下:
#include <iostream>
using namespace;
int main()
{
cout << "This is In_engineer test" << endl;
return 0;
}
保存退出cpp文件后,接着执行
sun@sun-pc:~/myProjects/pri_src_test/src$ g++ pri_src_test.cpp -o pri_src_test //编译cpp文件生成可执行文件pri_src_test
sun@sun-pc:~/myProjects/pri_src_test/src$ ./pri_src_test //执行pri_src_test,得到结果如下
This is In_engineer test
2. 将程序打包成deb包
sun@sun-pc:~/myProjects/pri_src_test$ mkdir package #创建个目录,用来存放创建deb包时所需文件
sun@sun-pc:~/myProjects/pri_src_test$ cd package
sun@sun-pc:~/myProjects/pri_src_test/package$ mkdir -p usr/bin
sun@sun-pc:~/myProjects/pri_src_test/package$ mv ../src/pri_src_test usr/bin/ #把执行文件拷贝到usr/bin/目录
sun@sun-pc:~/myProjects/pri_src_test/package$ mkdir DEBIAN
sun@sun-pc:~/myProjects/pri_src_test/package$ vi DEBIAN/control
编辑内容如下:
Package: privatesrc #注意包名构成只能是小写字母和"-+"的字符
Version: 1.0
Section: custom(代表软件类别)
Priority: optional
Architecture: all
Essential: no
Installed-Size: 1024
Maintainer: privatesrc.org
Description: Print test strings on the screen
继续执行
sun@sun-pc:~/myProjects/pri_src_test/package$ tree #确认一下package结构有没有问题,和下面一样就可以了
.
├── DEBIAN
│ └── control
└── usr
└── bin
└── pri_src_test
3 directories, 2 files
sun@sun-pc:~/myProjects/pri_src_test/package$ cd ../
sun@sun-pc:~/myProjects/pri_src_test$ dpkg-deb --build package/ privatesrc.deb #将package打包为privatesrc.deb
3. 发布deb包到Apache
sun@sun-pc:~$ sudo apt-get install apache2 #如果没有安装过apache,先进行安装
sun@sun-pc:~$ cd /var/www/html #安装完apache后,根目录下会出现/var/www/的目录,cd到其中的html目录
sun@sun-pc:~$ mkdir debian
sun@sun-pc:/var/www/html/debian$ sudo cp ~/myProjects/pri_src_test/privatesrc.deb ./ #把deb包拷贝到此目录下
sun@sun-pc:/var/www/html/debian$ su root
root@sun-pc:/var/www/html/debian# sudo dpkg-scanpackages . | gzip -c9 > Packages.gz #创建deb包索引
发布完之后,局域网内用户正常都可以访问了,如下图可以看到前文提到的Packages.gz和deb包全都在这里
4. 私有源使用
如果别人(张三)要使用此私有源,依据下面操作即可
zhangsan@zhangsan-pc:~$ echo "deb [trusted=yes] http://192.42.1.24/debian ./"
| sudo tee -a /etc/apt/sources.list > /dev/null #见注解
zhangsan@zhangsan-pc:~$ sudo apt-get update #由于sources.list有变更,所以使用之前先更新软件列表
zhangsan@zhangsan-pc:~$ sudo apt-get install privatesrc #安装我们软件源上的privatesrc软件,成功!
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
下列软件包是自动安装的并且现在不需要了:
activity-log-manager gconf-service gconf-service-backend gconf2 gconf2-common geoclue
geoclue-ubuntu-geoip indicator-applet indicator-bluetooth indicator-datetime
indicator-keyboard indicator-messages
indicator-power libaccounts-glib0 libappindicator1 libfcitx-config4 libfcitx-gclient1
libfcitx-utils0 libgconf-2-4 libgeoclue0 libgeonames-common libgeonames0 libido3-0.1-0 libindicator7
liblightdm-gobject-1-0 libnm-glib4 libnm-gtk0 libnm-util2 libpanel-applet3 libtimezonemap-data
libtimezonemap1 libunity-control-center1 libunity-settings-daemon1 liburl-dispatcher1
linux-hwe-5.4-headers-5.4.0-84 linux-hwe-5.4-headers-5.4.0-86 linux-hwe-5.4-headers-5.4.0-87
linux-hwe-5.4-headers-5.4.0-89 linux-hwe-5.4-headers-5.4.0-90 ubuntu-touch-sounds unity-settings-daemon
使用'sudo apt autoremove'来卸载它(它们)。
下列【新】软件包将被安装:
privatesrc
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 48 个软件包未被升级。
需要下载 3,296 B 的归档。
解压缩后会消耗 1,049 kB 的额外空间。
获取:1 http://192.42.1.24/debian ./ privatesrc 1.0 [3,296 B]
已下载 3,296 B,耗时 0秒 (0 B/s)
正在选中未选择的软件包 privatesrc。
(正在读取数据库 ... 系统当前共安装有 303336 个文件和目录。)
正准备解包 .../privatesrc_1.0_all.deb ...
正在解包 privatesrc (1.0) ...
正在设置 privatesrc (1.0) ...
zhangsan@zhangsan-pc:~$ pri_src_test #执行安装的程序。deb包名是privatesrc,二进制可执行文件名字是pri_src_test,这两个不要搞混
This is In_engineer test #可以看到执行的结果正是我们的程序
注:
(1) 对【 echo “deb [trusted=yes] http://192.42.1.24/debian ./” | sudo tee -a /etc/apt/sources.list > /dev/null 】解释一下,这里边有三条命令,先用echo “deb [trusted=yes] http://192.42.1.24/debian ./”
将源信息的字符串输出到标准输出中,然后使用tee -a /etc/apt/sources.list
从标准输出中取得字符串并依附到sources.list文件的末尾。最后一条>/dev/null
是将执行结果丢到空设备中,这样终端中就不会显示执行结果。
(2) 还有一点,因为是私有源网址,没有证书。所以使用[trusted=yes]
让系统下载的时候信任这个源,不会进行证书检查。