Dependency hell in Linux (centos 7)
Tags: linux, yum, bash
Published: 2020-07-17 03:08:02

I needed to update the Kubernetes and docker in three test centOS 7 servers, a master and two slaves, installed using kubeadm. Now, this was my first time using centOS. The server was not maintained for nearly a decade. I checked the status of existing Kubernetes and found that many files were missing. Updating it was also not possible as the required file structure was messed up. It might probably the result of a previously failed installation or upgrade :p . 

Hence I decided to uninstall both the docker and Kubernetes and tried to reinstall it and voila, that's when I stumbled into the dependency hell. 

I checked the repositories with 
```bash
yum repolist
repo id                                repo name                                                     status
Server                                 local                                                           3831
base/7/x86_64                    CentOS-7 - Base                                                      10070
azure-cli                              Azure CLI                                                         76
docker-ce-stable/x86_64                Docker CE Stable - x86_64                                         79
jenkins                                Jenkins-stable                                                   106
kubernetes/x86_64                      Kubernetes                                                    14+528
spcclient2.4                           Spacewalk Client 2.4                                              27
treasuredata/7/x86_64                  TreasureData                                                      15
```

In one worker server, I saw the CentOS-7 - Base repository was also missing.
So I tried installing it by
```bash
yum install centos-release
No packages found
```
Now, among my available repositories, none had centos-release.

So I went in and searched for the **Centos-release Download for Linux (rpm)**

I went into https://pkgs.org/download/centos-release and selected the link to rpm in CentOS x86_64.

I copied the binary package URL under the downloads section, and tried to install it in the machine.
```bash
#yum install -y <copied link>
yum install -y http://mirror.centos.org/centos/7/os/x86_64/Packages/centos-release-7-8.2003.0.el7.centos.x86_64.rpm
```

This installed it properly and I verified it using yum repolist.

I also came to know that the extra packages repository was needed and I tried to install it.
```bash
yum install epel-release
```
I got the same issue - package not found.

**I then found a workaround - use official fedora repository**
```bash
cd /tmp
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
ls *.rpm
```

It was installed smoothly and I verified it.
```bash
yum repolist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: repos-tx.psychz.net
 * epel: d2lzkl7pfhq30w.cloudfront.net
 * extras: centos-distro.1gservers.com
 * remi-safe: repo1.dal.innoscale.net
 * updates: mirror.teklinks.com
 * webtatic: us-east.repo.webtatic.com
repo id                          repo name                                                           status
Server                           local                                                                 3831
base/7/x86_64                    CentOS-7 - Base                                                      10070
docker-ce-stable/x86_64          Docker CE Stable - x86_64                                               79
epel/x86_64                      Extra Packages for Enterprise Linux 7 - x86_64                       13383
extras/7/x86_64                  CentOS-7 - Extras                                                      412
kubernetes/x86_64                Kubernetes                                                          14+528
remi-safe                        Safe Remi's RPM repository for Enterprise Linux 7 - x86_64            3836
spcclient2.4                     Spacewalk Client 2.4                                                    27
updates/7/x86_64                 CentOS-7 - Updates                                                     900
webtatic/x86_64                  Webtatic Repository EL7 - x86_64                                       725
repolist: 33277
```

Now, I tried installing docker and It went smoothly in the machines where I manually installed the base release repository.

But in my master machine, I still faced the dependency issue. It even said that you have installed x.1.23 and the required is x.1.23_noarch. 
But when I checked the repolist, it was the same in all 3 machines.

I tried many different approaches. I even manually installed the dependencies in the same way I installed the Centos-release package. That was daunting, as the dependency went in loop, parent package needed 2 child packages and the child packages needed 2,3,4 etc child packages and so on. 

After checking, even after 
```bash
yum update
```
the actual centos-release base repository was not updated.

checking the available repos
```
ls  /etc/yum.repos.d
CentOS-Base.repo                       remi-glpi92.repo
CentOS-CR.repo                         remi-glpi93.repo
CentOS-Debuginfo.repo                  remi-glpi94.repo
CentOS-Media.repo                      remi-modular.repo
CentOS-Sources.repo                    remi-php54.repo
CentOS-Vault.repo                      remi-php70.repo
CentOS-fasttrack.repo                  remi-php71.repo
CentOS-x86_64-kernel.repo              remi-php72.repo
docker-ce.repo                         remi-php73.repo
epel-testing.repo                      remi-php74.repo
epel.repo                              remi-safe.repo
jkastner-dnf-plugins-core-epel-7.repo  remi.repo
kubernetes.repo                        spcclnt24_7.repo_bkp
local.repo                             vault.centos.org_centos_7.4.1708_extras_x86_64_.repo
mesosphere.repo                        webtatic-archive.repo
old                                    webtatic-testing.repo
remi-glpi91.repo                       webtatic.repo
```
I checked the contents of CentOS-Base.repo
```bash
cat /etc/yum.repos.d/CentOS-Base.repo
```
And voila, someone, manually edited this file.

yum clean packages Eliminate any cached packages from the system and hence I ran it.
```bash
yum clean
```

I manually removed the base repository files in CentOS-Base.repo /etc/yum.repos.d

```bash
rm CentOS-Base.repo 
```

I installed the **Centos-release** manually in the master machine also once again, and I was able to install the docker and kubeadm.

Finally, the dependency hell was resolved. My lesson here was to 
<ol>
<li> make sure the necessary repositories are added
<li> check the repository file for issue if it still persists, and if it is an error, remove and reinstall it.
<li> check if it solves the issue. 
</ol>
If this solves it, it is great, else, keeeeeep diggin!!!