22

I am looking for the best method to restore /etc/apt/sources.list to default from the command line.

Is there no way to reference the source code of the package which generates this file or something like that? I want a trusted and version-independent way of restoring this file.

Solutions Ruled Out

Before you mark this as a duplicate, note that I have reviewed this question already. It is only applicable if you have the Ubuntu GUI available. This question is specific to the command line.

I have also reviewed this question where the accepted solution is someone pasted the contents of their sources.list file. This is not an appropriate way to restore the file as the intentions of the person providing the file contents cannot be verified and the file is subject to change with new releases.

I checked out the generator at simplelinux.ch, but this is also not from Ubuntu so I do not plan to use it.

2 Answers 2

28

I'm not sure what you want, but:

  • The parent repository is always http://archive.ubuntu.com/ubuntu - everything else is a mirror of this. The other primary mirrors all have a domain of the form <cctld>.archive.ubuntu.com, where the two character short code is the Country Code Top Level Domain. You can find additional mirrors with their status at Launchpad.
    • If you're on an architecture other than amd64 (e.e.g, arm64, armhf, ppc64el, etc.), then the parent repository is http://ports.ubuntu.com/ubuntu-ports. Use ports.ubuntu.com/ubuntu-ports instead of archive.ubuntu.com/ubuntu in everything that follows.
  • The distribution codename is part of the channel (the third term). You can use lsb_release -sc to find that out, and it's the first word of the release pretty name in lowercase (trusty for Trusty Tahr, for example).
  • There are five channels: <codename>, <codename>-security, <codename>-updates, <codename>-backports and <codename>-proposed. The first is necessary as it is the base, the second is highly recommended as it contains security fixes, the fourth only if you need some package backported from a newer release and the fifth only if a developer asks you to enable it for testing a possible fix.
  • There are four repository sections: main, multiverse, universe and restricted (What's the difference between multiverse, universe, restricted and main?)

So you can always create a safe sources.list which contains just:

deb http://archive.ubuntu.com/ubuntu <codename> main multiverse universe restricted
deb http://archive.ubuntu.com/ubuntu <codename>-security main multiverse universe restricted

If you want a command to do this:

printf 'deb http://archive.ubuntu.com/ubuntu %s main multiverse universe restricted\n' "$(lsb_release -sc)"{,-security} > /etc/apt/sources.list

Or, lsb_release isn't available, use /etc/os-release from the base-files package:

printf 'deb http://archive.ubuntu.com/ubuntu %s main multiverse universe restricted\n' "$(. /etc/os-release; printf "%s" "$UBUNTU_CODENAME")"{,-security} > /etc/apt/sources.list

In addition to the Launchpad list, the list provided by the Software Sources program is from /usr/share/python-apt/templates/Ubuntu.mirrors, which is from the python-apt-common package. This package is only an indirect Suggests dependency of apt, so it may not be installed by default on a server.

5
  • That's exactly what I wanted clarification on. Thank you! Feb 18, 2015 at 23:47
  • this answers perfectly for boths posts (the one linked and this one) Aug 16, 2016 at 2:37
  • But you would still have to validate this answer with the documentation on the Ubuntu website itself as you cannot verify the intentions of the person providing this answer? Nov 24, 2018 at 11:43
  • @activedecay maybe not installed by default, but you can read on to "it's the first word of the release pretty name in lowercase" (focal)
    – muru
    May 4, 2020 at 22:37
  • @activedecay well, it exists in Ubuntu 20.04 Focal, so install it. If you can't do that, then derive the codename manually and use it directly instead of using lsb_release (which is the whole point of providing an alternate method to get the codename). If you won't do that, then ... shrug
    – muru
    May 5, 2020 at 14:56
7

If you understand what each line stands for in /etc/apt/sources.list, you can generate your own list. For example a line in my sources.list is,

deb http://archive.ubuntu.com/ubuntu/ trusty main

It has 4 sections:

  • Section 1: The first section is deb here which means it is a repository of all the binary packages. only other possible value is deb-src which means its a repository of source codes.
  • Section 2: This section contains the URI of the repository (http://us.archive.ubuntu.com/ubuntu/ in this case). The URI can vary for mirrors e.g. if you want to use the official US mirror then the URI will be http://us.archive.ubuntu.com/ubuntu/.
  • Section 3: It contains the codename (and channel name) of the release you are using, in this case trusty which is the codename of my Ubuntu release (14.04 LTS). you can find yours by lsb_release -sc. For example, If you are using 12.04 the codename will be "precise". Now to declare other channels e.g. to declare security channel you need to use trusty-security.

  • Section 4: This section contains "section names" of the repository. There are usually 4 section names used: main, restricted, universe, multiverse. You can put all the section names in the same line of declaring a repository or you can use different lines for each of the sections but there must not be any duplicate entry. If you read the /etc/apt/sources.list, then you will see the description of packages each of these sections contains.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .