树莓派部署本地apt源

前言

树莓派正式加入内网环境，准备部署 apt 源，为内网环境的其他 debian 类设备或虚拟机提供源仓库服务，比如 proxmox。如果想模拟企业数据中心环境，要将内外网完全隔离开来，这么做是必要的。

如何理解本地源

本地源指的是软件包的源
本地源设备为内网环境下无法联网的设备提供源服务，为什么他们不能联网？在数据中心或者其他内网环境下，有些设备出于安全考虑是无法连接互联网的，不是不能，是不可以连，重点是在安全两个字。所以本地源就成了内网环境下设备更新软件包的唯一接入点。
因此需要从网上把源下载到存储本地源的设备。
例如，我在我的服务器上安装了 proxmox，这个虚拟机系统是基于 Debian 操作系统的，它又是在内网环境下，未来要作为内网服务的主力系统，虚拟多个设备提供不同的服务，但是他本身安装好以后存在各种软件缺失问题又无法联网进行安装，因此需要有本地源这么一个设备为他解决安装软件的需求。

如何部署本地源

首先部署问题网上有教程可以参考，树莓派的系统是卸载 tf 卡上的，一般买的时候都是 32G。这点容量别说部署本地源了，随便塞几个系统镜像包上去就满了。
所以继续给树莓派加个大容量的背包，他才能承担起这项任务。所以在部署本地源之前，需要给树莓派挂载一个移动硬盘。正好手里有一个 512g 的固态，可以作为它的外挂磁盘用。

Copy
#查找磁盘
root@raspberrypi:/#fdisk -l
#结果省略前面部分
Disk identifier: 0x6aef5cb3

Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 8192 532479 524288 256M c W95 FAT32 (LBA)
/dev/mmcblk0p2 532480 62333951 61801472 29.5G 83 Linux

Disk /dev/sda: 476.94 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: Generic
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt

Disk identifier: 8C903F36-23B9-44CB-99B8-D122B713E560Device Start End Sectors Size Type
/dev/sda1 2048 1000215182 1000213135 476.9G Linux filesystem

查找到一个 sda 的磁盘，曾经也用与 linux 的文件系统，先把数据清空掉，重新格式化一遍

Copy
root@raspberrypi:/# mkfs -t ext3 /dev/sda
mke2fs 1.46.2 (28-Feb-2021)
Creating filesystem with 125026902 4k blocks and 31260672 inodes
Filesystem UUID: 2898dbe1-7892-4424-9fee-ff8b78b8b32e
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

创建挂载目录并挂载磁盘

Copy
root@raspberrypi:/#mkdir /opt/sda1
root@raspberrypi:/#chmod 777 /opt/sda1
root@raspberrypi:/#mount /dev/sda /opt/sda1

查询磁盘的 ssid

Copy
root@raspberrypi:/# blkid
/dev/mmcblk0p1: LABEL_FATBOOT="boot" LABEL="boot" UUID="0F92-BECC" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="6aef5cb3-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="41c98998-6a08-4389-bf74-79c9efcf0739" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="6aef5cb3-02"
/dev/sda: UUID="2898dbe1-7892-4424-9fee-ff8b78b8b32e" BLOCK_SIZE="4096" TYPE="ext3"

设置开机挂载磁盘，毕竟万一宕机重启没挂载上去都不知道哪里出了问题，会很麻烦

Copy
root@raspberrypi:/etc# vim fstab
#在fstab最后一行添加下方内容，ssid为上一步查询到的sda信息
UUID=2898dbe1-7892-4424-9fee-ff8b78b8b32e /opt/sda1 ext3 defaults 0 0

磁盘挂载完成，开始部署 apt 本地源
综合来看，搭建本地源通常有两种方式
1、按需拉取，内网设备需要什么包通过远程拷贝的方式安装，参考资料种的 1、2、3 都是这种方法。
2、直接部署本地仓库，拉取绝大部分软件包，参考资料的 4 就是这种方法
既然都准备好大容量的硬盘了，肯定是考虑后者。
又因为目前主要为基于 debian 系统的 proxmox 做服务的，所以需要在部署过程种替换源目标

Copy
root@raspberrypi:/# apt install apt-mirror
root@raspberrypi:/# cd /etc/apt
root@raspberrypi:/etc/apt# vim mirror.list
#对mirror.list文件进行修改
#修改完之后执行apt-mirror
root@raspberrypi:/# apt-mirror

文件中的内容如下，原有官方美国的源改为中国源

Copy
############# config ##################
#
set base_path /opt/sda1/pve_mirror
#
#set mirror_path $base_path/mirror
# set skel_path $base_path/skel
# set var_path $base_path/var
# set cleanscript $var_path/clean.sh
# set defaultarch <running host architecture>
# set postmirror_script $var_path/postmirror.sh
# set run_postmirror 0
set nthreads 20
set _tilde 0
#
############# end config ##############

deb http://ftp.cn.debian.org/debian unstable main contrib non-free
deb-src http://ftp.cn.debian.org/debian unstable main contrib non-free

# mirror additional architectures
#deb-alpha http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-amd64 http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-armel http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-hppa http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-i386 http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-ia64 http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-m68k http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-mips http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-mipsel http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-powerpc http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-s390 http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-sparc http://ftp.us.debian.org/debian unstable main contrib non-free

clean http://ftp.us.debian.org/debian

在执行 apt-mirror 后会等待非常久的时间，第一次以为失败了，ctrl+C 终止掉了。再次执行发现原本需要 102G 的变成了 92G，说明他虽然慢，但确实是在下载的

花了 1 天时间终于是下载完成，之后需要部署 apach 代理，供内网设备进行访问

Copy
root@raspberrypi:/#apt-get install apache2
root@raspberrypi:/#ln -s /opt/sda1/pve_mirror/mirror/ftp.cn.debian.org/debian /var/www/html/proxmox

软连接创建完成后，就可以通过浏览器访问到这台树莓派上的软件源。访问地址为http://ip/pve

当然也有其他方法如果配置 apache2 或者 nginx 不行还有别的方法。
安装 nodejs，通过使用开源文件服务系统进行搭建链接也是可行的，例如 github 上的hope-server

Copy
root@raspberrypi:/#apt install nodejs
root@raspberrypi:/#apt install npm
root@raspberrypi:/#apt install yarn
root@raspberrypi:/#yarn global install hope-server
root@raspberrypi:/#hope-server -d <filepath> -p 8080 -o localhost
#filepath为软件源目录，可以是磁盘挂载路径，也可以是磁盘挂载后的软链接路径
#但是这种方式有一定的缺陷，开启hope-server的时候回占用控制台，所以可以采取nohup+crontab的方式
root@raspberrypi:~# nohup hope-server -d /var/www/proxmox/ -p 8080 -o localhost &
[3] 6843
---------------------------------------------------
root@raspberrypi:~# crontab -e
no crontab for root - using an empty one

Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed

Choose 1-4 [1]: 2
#在编辑器最后一行加入
@reboot nohup hope-server -d /var/www/proxmox/ -p 8080 -o localhost &
#这样每次重启都会执行一遍

如何修改 pve 源

部署好本地源后，接下来在客户端，也就是内网里的 pve 系统下修改源地址，路径为 /etc/apt/sources.list

Copy
root@proxmox:/#nano /etc/apt/sources.list
#在编辑器中加入类似下方的源地址
deb [trusted=yes] http://172.20.0.2:80/proxmox/mirror/mirrors.tuna.tsinghua.edu.cn/debian bullseye main contrib

deb [trusted=yes] http://172.20.0.2:80/proxmox/mirror/mirrors.tuna.tsinghua.edu.cn/debian bullseye-updates main contrib

deb [trusted=yes] http://172.20.0.2:80/proxmox/mirror/mirrors.tuna.tsinghua.edu.cn/debian bullseye-backports main contrib

deb [trusted=yes] http://172.20.0.2:80/proxmox/mirror/mirrors.tuna.tsinghua.edu.cn/debian bullseye-security main contrib

虽然到这里就已经算成功了。但是还是毫不意外地报错了😅

Copy
Reading package lists... Done
E: Release file for http://172.20.0.2:80/proxmox/mirror/mirrors.tuna.tsinghua.edu.cn/debian/dists/bullseye/InRelease is not valid yet (invalid for another 33d 17h 53min 33s). Updates for this repository will not be applied.
E: Release file for http://172.20.0.2:80/proxmox/mirror/mirrors.tuna.tsinghua.edu.cn/debian/dists/bullseye-updates/InRelease is not valid yet (invalid for another 130d 21h 52min 40s). Updates for this repository will not be applied.
E: Release file for http://172.20.0.2:80/proxmox/mirror/mirrors.tuna.tsinghua.edu.cn/debian/dists/bullseye-backports/InRelease is not valid yet (invalid for another 130d 21h 52min 40s). Updates for this repository will not be applied.

大致是时间上的问题，估计安装 pve 系统的时候选的时区不对？先看一下当前 pve 系统的时间吧

Copy
root@proxmox:~# date
Mon 08 Aug 2022 12:29:02 AM CST

修改

Copy
root@proxmox:/etc# vim /etc/systemd/timesyncd.conf
#设置ntp地址为软路由
root@proxmox:/etc# systemctl restart systemd-timesyncd.service
root@proxmox:/etc# systemctl enable systemd-timesyncd.service
root@proxmox:/etc# date
Sat 17 Dec 2022 07:21:07 AM CST

最后可以正常 apt 更新了

参考资料

1、Apt 本地源 / 仓库
2、创建 APT 本地源
3、# apt 本地源离线安装
4、# Ubuntu 搭建离线 APT 仓库
5、# 利用 apt-mirror 制作 Ubuntu 本地源
6、# 使用 APT-mirror 四步配置 Ubuntu 本地软件仓库
7、# pve 更新源（Proxmox VE (PVE) 系统修改设置为国内源教程）