Configuring pacsrv and powerpill on Arch Linux
— Albert De La Fuente VigliottiOn this post I will show how to configure and use Pacserve
and Powerpill
on
Arch Linux. On a network of several Arch Linux boxes, it is possible to
configure a Master
server which will hold a copy of all the installed packages
within that host and keep it up to date frequently. The other hosts on the
network can be configured as Slaves
and they will download the packages from
the Master whenever possible instead of the Internet directly. The objective is
to save bandwidth and time when using the package manager.
Configuring Pacserve and Powerpill on Arch Linux #
The documentation of Pacserve explains how it works. This image summarizes well the behavior.
Pacserve by itself seems very interesting however I could not make it work properly. I think it has something to do my router UDP multicast forwarding support (see openwrt-multicast). Nevertheless, I could use it within Powerpill which is a pacman wrapper to allow parallel and segmented downloads through Aria2 and Reflector. This combo sounds even better, so I will focus on how to install and use the tree tools together.
Installation #
# Just in case the testdb does not exists
gpg --list-key
# Receive xyne gpg key
gpg --recv-keys 1D1F0DC78F173680
# Install the packages
yaourt -Sy --noconfirm reflector pacserve powerpill
Starting the services (both the Master and Slave(s) host(s)) #
After everything is installed:
# Enable opening the ports
sudo systemctl enable pacserve-ports.service
# Enable pacserve
sudo systemctl enable pacserve.service
# Start pacserve
sudo systemctl start pacserve.service
For troubleshooting purposes the services can be started manually. See the Troubleshooting section if you have problems.
Configuring Powerpill to use the Master server (Slave(s) hosts only) #
Edit the file /etc/powerpill/powerpill.json
to include the `pacserve`.`serve`
attribute:
{
"aria2": {
"args": [
"--allow-overwrite=true",
"--always-resume=false",
"--auto-file-renaming=false",
"--check-integrity=true",
"--conditional-get=true",
"--continue=true",
"--file-allocation=none",
"--log-level=error",
"--max-concurrent-downloads=100",
"--max-connection-per-server=5",
"--min-split-size=5M",
"--remote-time=true",
"--show-console-readout=true"
],
"path": "/usr/bin/aria2c"
},
"pacman": {
"config": "/etc/pacman.conf",
"path": "/usr/bin/pacman"
},
"pacserve": {
"server": "http://192.168.56.6:15678"
},
"powerpill": {
"ask": true,
"reflect databases": false
},
"reflector": {
"args.unused": [
"--protocol",
"http",
"--latest",
"50"
]
},
"rsync": {
"args": [
"--no-motd",
"--progress"
],
"db only": true,
"path": "/usr/bin/rsync",
"servers": []
}
}
In this example I configured two VMs using Vagrant with an internal network.
The server runs on 192.168.56.6
on port `15678` (default port).
After this we can use Powerpill as a replacement of Pacman as follows
# System upgrade
sudo powerpill -Syu
# Install a package
sudo powerpill -S wget
Conclusions #
When powerpill is used..
TODOs #
- Check how to have only *one* Master DB and all the Slaves also sync the DB from the master
- Use reflector commands within Powerpill
- What happens if different architectures are on the same network and UDP multicast works?
Troubleshooting Pacserve (without Powerpill) #
As I said before I could not make it working using multicast, so I had to manually start the Pacserve Master host as:
Input:
pacserve --multicast
Output:
PacserveServer
PID 1048
Addresses
lo: 127.0.0.1
eth0: 10.0.2.15
enp0s9: 192.168.56.6
Port 15678
Multicast Address all interfaces
Multicast Port 15679
Multicast Group 224.3.45.67
Multicast Interval 5m
Multicast Interfaces all
Filelist None
Filterlist None
MOTD None
Upload Directory None
Paths None
Static Peers None
Press ctrl+C to exit.
[2015-10-23 05:54:54 AEDT] INFO: announcing presence by multicast (group: 224.3.45.67)
[2015-10-23 05:54:54 AEDT] INFO: announcement sent via all interfaces
Assuming the server is running with the IP 192.168.56.6
, you can manually
start Pacserve on the Slave(s) hosts as:
Input:
pacserve --multicast --peer "http://192.168.56.6:15678"
Output:
PacserveServer
PID 1102
Addresses
lo: 127.0.0.1
eth0: 10.0.2.15
enp0s9: 192.168.56.7
Port 15678
Multicast Address all interfaces
Multicast Port 15679
Multicast Group 224.3.45.67
Multicast Interval 5m
Multicast Interfaces all
Filelist None
Filterlist None
MOTD None
Upload Directory None
Paths None
Static Peers http://192.168.56.6:15678
Press ctrl+C to exit.
[2015-10-23 05:56:00 AEDT] INFO: announcing presence via POST to http://192.168.56.6:15678
[2015-10-23 05:56:00 AEDT] INFO: POSTing to http://192.168.56.6:15678/ [type: nudge]
[2015-10-23 05:56:01 AEDT] INFO: announcing presence by multicast (group: 224.3.45.67)
[2015-10-23 05:56:01 AEDT] INFO: announcement sent via all interfaces
After starting the Slave host you should get the following message on the Master console:
[2015-10-23 05:56:00 AEDT] INFO: added http://192.168.56.7:15678/ (POST)
[2015-10-23 05:56:00 AEDT] INFO: 192.168.56.7 "POST / HTTP/1.1" 200 -