summary refs log tree commit diff stats
path: root/content/blog/reflector.md
blob: 2a397e20bb8dd874a67bbbc7322b626479c2b173 (plain) (blame)
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
+++
title = "Update your mirrors!"
date = 2023-01-29
template = "blog-page.html"
[taxonomies]
tags = [ "foss", "advice" ]
+++

Nah, I'm not talking about [bluetooth mirrors](https://www.bathshack.com/blog/bluetooth-mirrors-everything-you-need-to-know-before-you-buy/). Mirrors are what powers all distros: they're a (de)centralized solution for downloading pre-compiled binaries and scripts for your operating system.

## Suspicion
I like always having the most current version of packages, so I usually update my system several times a day. When, after a day, I ran `sudo pacman -Syu` and it reported the system being up to date, I was pretty weirded out.

Another day passed, and the system was still up to date. It was not a connection problem, I was connecting to my mirrors and they were reporting absolutely zero updates for my system.

## Problem

At the third day of stagnation, I was sure something was up. I looked up the [Mirror Status](https://archlinux.org/mirrors/status/) page on ArchLinux's website and saw that loads of mirrors were out of sync.

I had never touched my mirrorlist before, it was just generated by the  [archinstall](https://github.com/archlinux/archinstall) script a few months ago; a lot of Arch-based distros by default ship tools to update your mirrorlist, but I honestly thought I'd never need that.

Pacman's mirrorlist is located in `/etc/pacman.d/mirrorlist`. You can filter out uncommented lines with this command:

```
grep -v "^#" /etc/pacman.d/mirrorlist
```

And check the actual status of your mirror(s) on the Mirror Status page linked above.

## Solution

This will overwrite your mirrorlist, so you're advised to make a backup before proceeding:

```
sudo cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak
```

I decided to use [reflector](https://xyne.dev/projects/reflector/) to fix this problem. I didn't want to have to deal with this again, so I enabled the provided systemd timer.

First, install it.

```
sudo pacman -S reflector
```

Then, edit `/etc/xdg/reflector/reflector.conf`. I only needed to edit the `--country` parameter and select countries next to the one where I reside; you can list available countries by running `reflector --list-countries`.

```
--save /etc/pacman.d/mirrorlist
--protocol https
--country Italy,Switzerland,France,Germany,Austria
--latest 5
--sort age
```

Finally, start the service and check if it worked.
```
sudo systemctl start reflector.service
cat /etc/pacman.d/mirrorlist
```

If everything went smoothly, enable reflector's timer so it runs weekly.
```
sudo systemctl enable reflector.timer
```

Done!

Now, by default pacman _does_ update its mirrorlist. It creates a file called `mirrorlist.pacnew` and it expects you to pick your favorite mirrors each time its generated. You can disable this (now unneeded) behavior by uncommenting and setting `NoExtract` in `/etc/pacman.conf`:

```
...
NoExtract = /etc/pacman.d/mirrorlist

# Misc options
Color
ILoveCandy
ParallelDownloads = 3
...
```