diff --git a/11_install_system_programs.md b/11_install_system_programs.md index 28afb50599e48bafe02a96185b246dcfdd8615ad..5b4924f131f5ac9ba37ce8941f2cc02ab8e75c8a 100644 --- a/11_install_system_programs.md +++ b/11_install_system_programs.md @@ -4,7 +4,229 @@ Objective: Learn how to install programs in GNU/Linux -In the previous section, we have seen how to run scripts and complex commands on your computer. In this session we are going to learn to do that over the network. +As we have seen in the [4 unix file system](http://perso.ens-lyon.fr/laurent.modolo/unix/4_unix_file_system.html#lib-and-usrlib) session, programs are files that contain instruction for the computer to do things. Those files can be in binary or text format (with a [shebang](http://perso.ens-lyon.fr/laurent.modolo/unix/9_batch_processing.html#shebang)). Any of those files, present in a folder of the [**PATH**](http://perso.ens-lyon.fr/laurent.modolo/unix/9_batch_processing.html#path) variable are executable anywhere by the user. For system wide installation, the program files are copied within shared folder path containained in the [**PATH**](http://perso.ens-lyon.fr/laurent.modolo/unix/9_batch_processing.html#path) variable. + +Developers don’t want to reinvent the wheel each time they want to write complex instruction in their programs, this is why they use shared library of pre-written complex instruction. This allows for quicker development, fewer bugs (we only have to debug the library once and use it many times), and also [better memory management](http://perso.ens-lyon.fr/laurent.modolo/unix/6_unix_processes.html#processes-tree) (we only load the library once and it can be used by different programs). + +## Package Manager + +However, interdependencies between programs and libraries can be a nightmare to handle manually this is why most of the time when you install a program you will use a [package manager](https://en.wikipedia.org/wiki/Package_manager). [Package manager](https://en.wikipedia.org/wiki/Package_manager) are system tools that will handle automatically all the dependencies of a program. They rely on **repositories** of programs and library which contains all the information about the trees of dependence and the corresponding files (**packages**). + +System-wide installation steps: + +- The user asks the package manager to install a program +- The** package manager** queries its repository lists to search for the most recent **package** version of the program (or a specific version) +- The **package manager** construct the dependency tree of the program +- The **package manager** check that the new dependency tree is compatible with every other installed program +- The **package manager** install the program **package** and all it’s dependencies **packages** in their correct version + +The main difference between GNU/Linux distribution is the package manager they use + +- Debian / Ubuntu: [apt](https://en.wikipedia.org/wiki/APT_(Debian)) +- CentOS / RedHat: [yum](https://en.wikipedia.org/wiki/YUM_(software)) +- ArchLinux: [pacman](https://en.wikipedia.org/wiki/Pacman_(Arch_Linux)) +- SUSE / OpenSUSE: [zypper](https://en.wikipedia.org/wiki/Zypper) +- Gentoo: [portage](https://en.wikipedia.org/wiki/Portage_(software)) +- Alpine: [apk](https://wiki.alpinelinux.org/wiki/Alpine_newbie_apk_packages) + +Packages manager install the packages in **root** owned folders, you need **root** access to be able to use them. + +<details><summary>Solution</summary> +<p> +```sh +docker run -it --volume /:/root/chroot alpine sh -c "chroot /root/chroot /bin/bash -c 'usermod -a -G sudo etudiant'" && su etudiant +``` +</p> +</details> + +### Installing R + +**R** is a complex program that relies on loots of dependencies. Your current VM run on Ubuntu, so we are going to use the `apt` tool (`apt-get` is the older version of the `apt` command, `synaptic` is a graphical interface for `apt-get`) + +You can check the **r-base** package dependencies on the website [packages.ubuntu.com](https://packages.ubuntu.com/focal/r-base). Not too much dependency ? Check the sub-package **r-base-core**. + +You can check the **man**ual of the `apt` command to install **r-base-core**. + +<details><summary>Solution</summary> +<p> +```sh +sudo apt install r-base-core +``` +</p> +</details> + +What is the **R** version that you installed ? Is there a newer version of **R** ? + +### Adding a new repository + +You can check the list of repositories that `apt` checks in the file `/etc/apt/sources.list`. + +You can add the official cran repository to your repositories list: + +```sh +sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu <release_name>-cran35/' +``` + +You can use the command `lsb_release -sc` to get your **release name**. + +Then you must add the public key of this repository: + +```sh +sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 +``` + +### Updating the repository list + +You can now use `apt` to update your repository list dans try to reinstall **r-base-core** + +<details><summary>Solution</summary> +<p> +```sh +sudo apt update +``` +</p> +</details> + +The command gives you a way to list all the upgradable **packages**, which version of **R** can you install now ? + +You can upgrade all the upgradable **packages**. + +<details><summary>Solution</summary> +<p> +```sh +sudo apt upgrade +``` +</p> +</details> + +With the combination of `update` and `upgrade` you can keep your whole system up to date the even the kernel files is just another package. You can use `apt` to search for the various versions of the `linux-image`. + +<details><summary>Solution</summary> +<p> +```sh +sudo apt search linux-image +``` +</p> +</details> + + + +### Language specific package manager + +If it’s not a good idea to have different **package manager** on the same system (they don’t know how the dependencies are handled by the other’s manager). You will also encounter language specific package manager: + +- `ppm` for Pperl +- `pip` for Python +- `npm` for JavaScript +- `cargo` for Rust +- `install.packages` for R +- ... + +These **package managers** allows your to make installation local to the user, which is advisable to avoid any conflict with the **packages manager** of the system. + +For example, you can use the following command to install `glances` system wide with `pip` + +```sh +sudo pip3 install glances +``` + +You can now try to install `glances` with `apt` + +What is the `glances` version installed with `apt`, what is the one installed with `pip` ? What is the version of the `glances` of your **PATH** ? + +Next-time use `pip` with the `--user` switch. + + + +## Manual installation + +Sometimes, a specific tool that you want to use will not be available through a **package manager**. If you are lucky, you will find a **package** for your distribution. For `apt` the **package** are `.deb` files. + +For example, you can download `simplenote` version 2.7.0 for your architecture [here](https://github.com/Automattic/simplenote-electron/releases/tag/v2.7.0). + +<details><summary>Solution</summary> +<p> +```sh +wget https://github.com/Automattic/simplenote-electron/releases/download/v2.7.0/Simplenote-linux-2.7.0-amd64.deb +``` +</p> +</details> + +You can then use `apt` to install this file. + +## From sources + +If the program is open source, you can also [download the sources](https://github.com/Automattic/simplenote-electron/archive/v2.7.0.tar.gz) and build them. + +<details><summary>Solution</summary> +<p> +```sh +wget https://github.com/Automattic/simplenote-electron/archive/v2.7.0.tar.gz +``` +</p> +</details> + +You can use the command `tar -xvf` to extract this archive + +When you go into the `simplenote-electron-2.7.0` folder, you can see a `Makefile` this means that you can use the `make` command to build Simplenote from those files. `make` Is a tool that read recipes (`Makefiles`) to build programs. + +You can try to install `node` and `npx` with `apt`. What happened ? + +<details><summary>Solution</summary> +<p> +```sh +sudo apt install nodejs +``` +</p> +</details> + +You can use the [https://packages.ubuntu.com/](https://packages.ubuntu.com/) to search the name of the package containing the `libnss3.so` file. + +<details><summary>Solution</summary> +<p> +```sh +sudo apt install libnss3 +``` +</p> +</details> + +What now ? Installing dependencies manually is an iterative process... + +<details><summary>Solution</summary> +<p> +```sh +sudo apt install libnss3 libatk1.0-dev libatk-bridge2.0-0 libgdk-pixbuf2.0-0 libgtk-3-0 libgbm1 +``` +</p> +</details> + +Yay we should have every lib ! + +What now ? A nodejs dependency is missing... After, some query on the internet we can find the solution... + +<details><summary>Solution</summary> +<p> +```sh +sudo apt install libnss3 libatk1.0-dev libatk-bridge2.0-0 libgdk-pixbuf2.0-0 libgtk-3-0 libgbm1 +npm install --save-dev electron-window-state +``` +</p> +</details> + +And now you understand why program packaging takes time in a project, and why it’s important ! + +You can finalize the installation with the command `make install`. Usually the command to build a tool is available in the `README.md` file of the project. + +Read the `README` file of the [fastp](https://github.com/OpenGene/fastp) program to see which methods of installation are available. + +Installing programs and maintain different versions of a program on the same system, is a difficult task. In the next session, we will learn how to use [virtualisation](http://perso.ens-lyon.fr/laurent.modolo/unix/12_virtualisation.html) to facilitate our job. + +> We have used the following commands: +> +> - apt to install packages on Ubuntu +> - pip3 to install Python packages +> - npm to install Nodejs packages +> - make to build programs from sources + -Most of the content from this session are from [wikipedia.org](