搭建yum和apt源(centos7版)

在centos7系统中搭建自用的yum和apt镜像源。

选择centos7作为服务器linux版本,需要的软件列表如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
----------------------------
apache(httpd) # 提供web服务 
----------------------------
createrepo # 搭建yum仓库使用
repotrack # 下载安装包以及相关依赖
----------------------------
apt  # 为了支持ubuntu的repo
gpg # 生成密钥
dpkg-dev # 生成package信息
----------------------------

关于在centos下安装apt可参见有用链接部分。

准备工作

  • 完成虚拟机创建向导,选择网络类型桥接模式,设置静态IPv4地址以及网关、子网掩码等;

  • 安装ssh,修改sshd配置文件,允许root用户通过登录,都是为了使用xshell;

  • 开机关闭防火墙,或者放行对应的apache使用端口;

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    [root@localhost ~]# vi /etc/ssh/sshd_config   # 取消以下注释
    Port 22
    LoginGraceTime 2m
    PermitRootLogin yes
    MaxAuthTries 6
    MaxSessions 10
    PasswordAuthentication yes
    PermitEmptyPasswords no
    PasswordAuthentication yes
    [root@localhost ~]# systemctl restart sshd # 重启sshd服务
    

安装Apache服务

1
2
3
4
5
6
7
$ yum install httpd # 安装Apache,当然也可稍后安装
$ systemctl start httpd # 开启apache服务
$ systemctl status httpd # 查看Apache服务状态
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since 二 2021-02-23 14:30:53 CST; 1min 24s ago
... ...		

如果已完成上述操作,但访问http://ip:80出现403或者无法访问该网站,请检查防火墙关闭防火墙或者放行对应端口。

1
2
3
4
$ systemctl stop firewalld.service # 此次关闭防火墙
$ systemctl disable firewalld.service # 关闭防火墙
$ systemctl enable httpd # 开机自启Apache服务
$ iptables -I INPUT -p TCP --dport 80 -j ACCEPT # 放行80端口	

进一步的,可以在/etc/httpd/conf/httpd.conf中修改配置以支持文件目录索引;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<Directory />
	Options Indexes
	AllowOverride None
	Order allow,deny
	Allow from all
	Require all granted 
</Directory>
<Directory "/var/www/html">
	Options Indexes FollowSymLinks
	AllowOverride None
	Order allow,deny
	Allow from all
	Require all granted 
</Directory>

另外,还可以修改/etc/httpd/conf.d/welcome.conf默认的首页为目录索引页

1
2
原文:Options -Indexes
修改后:Options +Indexes

之后,重启apache服务即可。

创建repo存放目录

  • Apache默认存放的根目录在/var/www/html,可以直接在此目录下创建仓库目录;
  • 或者,选择在其他地方创建仓库目录,通过软连接至`/var/www/html';
  • 或者修改配置文件设置DirRoot。

方便起见,直接选择在网站默认目录下创建仓库根目录:

1
2
$  cd /var/www/html
$ mkdir centos && mkdir ubuntu  # 分别是centos和ubuntu的仓根目录

开始搭建仓库

首先,搭建centos使用的yum仓库源:

1
2
3
### repotrack 下载需要的包
[root@localhost ~]#  cd /var/www/html/centos 
[root@localhost centos]# repotrack whois
1
2
3
4
5
[root@localhost centos]#  yum -y install yum-utils createrepo  # 安装createrepo repotrack
### 下载或者导入需要的rpm包
[root@localhost centos]# createrepo -pdo . .  # 创建repo信息
[root@localhost centos]# ls
... repodata ... # 会发现多了一个repodata目录

自此,已完成yum仓库源的搭建,当然你可以对目录进行更加详细的管理,添加新的rpm以及维护可参考维护更新部分的介绍。

搭建apt仓库源可有两种选择:

  • 不带签名,简单且用不到gpg生成密钥,但不安全;
  • 带签名,略复杂,但是会验证;

以带签名为例,如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#先安装 gpg 以生成key
$ cd /var/www/html/ubuntu
$ yum install pgp 
## gpg --gen-key # 生成
## gpg --list-keys #查看
## gpg --export-secret-key keyName > ./my-key.asc #输出名字为keyName的密钥至my-key.asc文件
## gpg -h # 更多请查看
$ yum install rng-tools 
$ yum start rngd # 启用rngd服务,在生成key时大有用处
$ gpg --gen-key  # 生成密钥,在这之前最好先安装rng-tools,不然会很慢
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

请选择您要使用的密钥种类:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (仅用于签名)
   (4) RSA (仅用于签名)
您的选择? 
RSA 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸?(2048)
您所要求的密钥尺寸是 2048请设定这把密钥的有效期限。
         0 = 密钥永不过期
      <n>  = 密钥在 n 天后过期
      <n>w = 密钥在 n 周后过期
      <n>m = 密钥在 n 月后过期
      <n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) 0
密钥永远不会过期
以上正确吗?(y/n)y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

真实姓名:testing
电子邮件地址:test@email.com
注释:testing
您选定了这个用户标识:
    “testing (testing) <test@email.com>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?o
您需要一个密码来保护您的私钥。
## 如上操作你已完成生成密钥
## 需要将你的钥发布给需要使用该仓库的客户端
$ gpg --list-keys # 可以查看到你密钥 
$ gpg --export-secret-key testing > ./my-key.asc  # 输出你的密钥到

接下来,你可以传入或下载deb包至仓库目录中,当然你还可以对这些包做详细的归纳。也可通过如下参考脚本下载包以及对应的依赖,这将极大的提高效率。

查看软件包的依赖apt-cache depends packageName ;

只下载不安装 apt install $packageName --reinstall -d -y ;

两者结合,先查看软件包的依赖包,然后依次下载并且再次递归查看依赖包的依赖,使用如下脚本下载!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash
mkdir log
touch log/package.log
logfile=log/package.log
ret=""
function getDepends()
{
   echo "fileName is" $1>>$logfile
   # use tr to del < >
   ret=`apt-cache depends $1|grep Depends |cut -d: -f2 |tr -d "<>"`
   echo $ret|tee  -a $logfile
}
## packages: 下载包列表
packages="mysql-server nginx wget telnet gdb python2.7 python3.6 vim git subversion  tree vsftpd  openssl ssh make cmake apache2 sqlite3 tcpdump mlocate sysstat lrzsz strace  netcat filezilla"
for package in $packages
do
	apt install $package --reinstall -d -y # 先下载软件包
	libs = $package # 需要获取其所依赖包的包
	# 递归三层下载依赖包 deep in 3
	i=0
	while [ $i -lt 3 ] ;
	do
    	let i++
   		echo $i
        # download libs
        newlist=" "
        for j in $libs
        do
        	added="$(getDepends $j)"
        	newlist="$newlist $added"
        	apt install $added --reinstall -d -y # 下载依赖包...递归
    	done
    	libs=$newlist
	done
done 

这一步,假设你已经完成了包导入仓库:

1
2
3
4
5
$ dpkg-scanpackages -m . > Packages  # 扫描 Debian 包生成 Packages 文件
### 如果不带签名,请忽略以下
$ apt-ftparchive release . > Release # 生成 Release 文件
$ gpg --armor --detach-sign -o Release.gpg Release # 生成 Release.gpg
$ gpg --clearsign -o InRelease Release # 生成 InRelease

自此,你已完成了在centos下apt仓库源的搭建。

使用

centos-yum

清空/etc/yum.repos.d中的.repo文件

1
$ vim /etc/yum.repos.d/CentOS-Base.repo

内容如下:

1
2
3
4
5
6
[base]
name=CentOS-$releasever - Base
baseurl=http://192.168.10.5/centos/
gpgcheck=0   
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

ubuntu-apt

主要需要更改source.list和添加源服务器的密钥

1
2
$ wget http://10.20.15.237/ubuntu/pub.asc  # 下载密钥,前提是服务器已经上传   
$ apt-key add pub.asc  # 添加密钥

编辑 /etc/apt/source.list 替换为以下内容

1
deb [trusted=yes] http://192.168.10.5/ubuntu  ./
1
2
3
4
5
# 更新源
$ apt-get update
$ apt-get install whois   #安装测试
# 删除apt源的公钥
$ apt-key del '3C10 8EFB E970 F6E2 199E  7FAA 4B58 941A AEE3 5EFC'

更新

yum-repo

1
2
3
$ repotrack whois ## 例子
### 在此之前,导入你的rpm包
$ createrepo -pdo . .  # 创建repo信息

apt-repo

你可以先使用脚步文件package.sh下载后再传到仓库,并更新包信息:

执行完脚步以后你会在当前目录下得到一个archives目录,软件包就在其中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash
apt-get clean
mkdir -p log
touch log/package.log
logfile=log/package.log
ret=""
function getDepends()
{
   echo "fileName is" $1>>$logfile
   # use tr to del < >
   ret=`apt-cache depends $1|grep Depends |cut -d: -f2 |tr -d "<>"`
   echo $ret|tee  -a $logfile
}
## packages: 下载包列表
packages="wget telnet"
for package in $packages
do
	apt install $package --reinstall -d -y # 先下载软件包
	libs = $package # 需要获取其所依赖包的包
	# 递归三层下载依赖包 deep in 3
	i=0
	while [ $i -lt 3 ] ;
	do
    	let i++
   		echo $i
        # download libs
        newlist=" "
        for j in $libs
        do
        	added="$(getDepends $j)"
        	newlist="$newlist $added"
        	apt install $added --reinstall -d -y # 下载依赖包...递归
    	done
    	libs=$newlist
	done
done 
cp -r /var/cache/apt/archives ./
1
$ ./package.sh

在此之前,导入你的deb包。

1
$ dpkg-scanpackages -m . > Packages  # 扫描 Debian 包生成 Packages 文件

如果不带签名,请忽略以下

1
2
3
$ apt-ftparchive release . > Release # 生成 Release 文件
$ gpg --armor --detach-sign -o Release.gpg Release # 生成 Release.gpg
$ gpg --clearsign -o InRelease Release # 生成 InRelease

参考

在centos下安装使用apt

搭建apt仓库源

哦吼是一首歌。
Built with Hugo
Theme Stack designed by Jimmy