Governing software
Working with source code
Source code projects can consist of many types of files:
- Source code files
- Header files
- Library files
- Documentation files
wget
CLI toll that retrieves files from remote servers using FTP, FTPS, HTTP, or HTTPS:
wget http://remotehost/filename
cURL
Same as wget
but supports more protocols. Also warns if the server is using a self-signed cert or if the cert is signed by an untrusted authority.
tar
Bundles project files into a single output file for easy transfer across the network. Also preserves folder structure and ownership. Some common option groups:
# Create a new tar file
tar -cvf test.tar test1.txt test2.txt test3.txt
test1.txt
test2.txt
test3.txt
# Display contents of tar file
tar -tvf test.tar
-rw-rw-r-- ryanseymour/ryanseymour 14 2024-04-07 08:48 test1.txt
-rw-rw-r-- ryanseymour/ryanseymour 14 2024-04-07 08:48 test2.txt
-rw-rw-r-- ryanseymour/ryanseymour 16 2024-04-07 08:48 test3.txt
# Extract contents of tar file
tar -xvf test.tar
test1.txt
test2.txt
test3.txt
ll -a
total 32
drwxrwxr-x 2 ryanseymour ryanseymour 4096 Apr 7 08:52 ./
drwxrwxr-x 8 ryanseymour ryanseymour 4096 Apr 7 08:46 ../
-rw-rw-r-- 1 ryanseymour ryanseymour 14 Apr 7 08:48 test1.txt
-rw-rw-r-- 1 ryanseymour ryanseymour 14 Apr 7 08:48 test2.txt
-rw-rw-r-- 1 ryanseymour ryanseymour 16 Apr 7 08:48 test3.txt
-rw-rw-r-- 1 ryanseymour ryanseymour 10240 Apr 7 08:49 test.tar
# decompress tarball (-z option preserves the tar.gz file)
tar -zxvf test.tar.gz
test1.txt
test2.txt
test3.txt
ll -a
total 24
drwxrwxr-x 2 ryanseymour ryanseymour 4096 Apr 7 09:10 ./
drwxrwxr-x 8 ryanseymour ryanseymour 4096 Apr 7 08:46 ../
-rw-rw-r-- 1 ryanseymour ryanseymour 14 Apr 7 08:48 test1.txt
-rw-rw-r-- 1 ryanseymour ryanseymour 14 Apr 7 08:48 test2.txt
-rw-rw-r-- 1 ryanseymour ryanseymour 16 Apr 7 08:48 test3.txt
-rw-rw-r-- 1 ryanseymour ryanseymour 193 Apr 7 08:49 test.tar.gz
ldd
Check which libraries a program uses:
# find the executable
which ssh
/usr/bin/ssh
# check the libraries it uses
ldd /usr/bin/ssh
linux-vdso.so.1 (0x00007ffc92ab8000)
libcrypto.so.3 => /lib/x86_64-linux-gnu/libcrypto.so.3 (0x0000751246200000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007512461e4000)
...
Compiling source code
You need to install the GNU C compiler (gcc
) on fresh installs:
- Debian: install the
build-essential
program - Rocky: install
Development Tools
program
# Debian
sudo apt update && sudo apt install build-essential
make
Allows developers to create scripts that guide compiling and installation process of application source code:
- Run
configure
, which analyzes the Linux system and customizes themake
script. - Run
make
to build library files and executable. - Run
make install
as root to install the application files in the correct directories on your system.
Packaging applications
A package bundles already compiled applications for distribution. It consists of all files require to run a single application:
- Tracking these packages is called package management
- Linux tracks installed packages, and their files and file locations with a database
Popular package management tools:
- Debian package management
- Red Hat package management
These tools track the following:
- Application files: the files and file locations
- Library dependencies: What library files are required for each app, and can warn you if a dependent library file is not present
- Application version: So you know when an updated version of the app is available
Debian package tools
- Debian systems bundle application files into a single DEB package
- Core tool is
dpkg
program - Can find DEB versions of application packages on the app website or central location for the distro
dpkg
Install, update, and remove DEB packages:
- action is action to be taken on the file
- each action has a set of options that modify its behavior, such as force overwrting
dpkg [options] action package-file
-C # searches for broken installed pacakges and suggests fixes
--configure # reconfigures broken package
--get-selections # displays currently installed packages
-i # installs the package
-I # displays info about uninstalled package file
-l # lists all installed packages matching a specified pattern
-L # lists installed files associated with a package
-p # displays information about an installed package
-P # rms installed package and config files
-r # rm installed package but leaves config files (good for reinstalls)
-S # locates package that owns the specified files
# list all installed packages
dpkg -l
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version >
+++-=====================================================-=========================================>
ii accountsservice 22.07.5-2ubuntu1.5 >
ii acl 2.3.1-1 >
ii acpi-support 0.144 >
ii acpid 1:2.0.33-1ubuntu1
...
# list packages using a search term
dpkg -l openssh*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-===================-==================-============-===========================================>
ii openssh-client 1:8.9p1-3ubuntu0.6 amd64 secure shell (SSH) client, for secure acces>
ii openssh-server 1:8.9p1-3ubuntu0.6 amd64 secure shell (SSH) server, for secure acces>
ii openssh-sftp-server 1:8.9p1-3ubuntu0.6 amd64 secure shell (SSH) sftp server module, for >
un openssh-sk-helper <none> <none> (no description available)
Red Hat package tools
- Red Hat-based systems bundle application files into a single RPM package
- Core tool is
rpm
program
rpm
rpm action [options] package-file
-b # builds binary from source files
-e # uninstalls specified package
-F # upgrades a package if an earlier version exists
-i # installs package
-q # queries if the specified package is installed
-U # installs or upgrades the package
-V # verifies if the package files are present
Repositories
If you use dpkg
or rpm
, you have to find the packages to install them and any dependencies. Distros solve this problem with repositories, which contain software apcakges that have been tested and known to install and work correctly in the distro environment.
Debian repository tools
Core tool is apt
:
apt-cache
:apt-get
: installs, updates, and removes packagesapt
: front end script that can call eitherapt-cache
orapt-get
The /etc/apt/sources.list
file contains address of other repos that the apt
tool is configured to use.
# view nonstandard repositories
grep -v "#" /etc/apt/sources.list
deb http://gb.archive.ubuntu.com/ubuntu/ jammy main restricted
deb http://gb.archive.ubuntu.com/ubuntu/ jammy-updates main restricted
deb http://gb.archive.ubuntu.com/ubuntu/ jammy universe
deb http://gb.archive.ubuntu.com/ubuntu/ jammy-updates universe
deb http://gb.archive.ubuntu.com/ubuntu/ jammy multiverse
deb http://gb.archive.ubuntu.com/ubuntu/ jammy-updates multiverse
deb http://gb.archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu jammy-security main restricted
deb http://security.ubuntu.com/ubuntu jammy-security universe
deb http://security.ubuntu.com/ubuntu jammy-security multiverse
apt-cache
Provides info about the package database. Useful command options:
depends # displays dependencies required for the package
pkgnames # displays all packages installed on system
showpkg # displays info about specified package
stats # displays package stats for the system
unmet # displays any unmet dependencies for the installed packages
apt-get
# check for broken dependencies
apt-get check
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
# clean up database and any tempory download files
apt-get clean
# retrieve updated information about pacakges in the repo
apt-get update
apt
Installs and removes pacakges. Has the following options:
apt action program
autoremove # rm any unneeded packages automatically installed as a dependency of another installed package
full-upgrade # same as upgrade but removes any installed packages req'd to upgrade entire system
install # installs new package from repository
list # displays currently installed packages
purge # rms specified applciation and any config or data files
reinstall # reinstalls existing package from the repo
remove # rm application but keep config and data files
satisfy # resolve software dependencies in the installed packages
search # search for a specific package in the repo
show # displays info about the package
update # downloads package info from all configured repositories
upgrade # installs available upgrades from all installed packages
Red Hat repository tools
- Previous tool was
yum
(YellowDog Update Manager), developed for YellowDog Linux distro - Replaced by
dnf
, which is updated version ofyum
- Query, install, and remove software packages on your system
dnf
andyum
use/etc/yum.repos.d/
directory to hold fils that list the different repos to check for packages- files in this folder contain URL of repo and location of additional package files within the repo
dnf
dnf <action> <program>
alias # define alias that points to list of other dnf commands
autoremove # rm any unneeded packages installed as dependeney
check # examine local package db and report problems
check-update # check repo for update to specified package
clean # perform cleanup of temporary files kept for repos
deplist # deprecated alisas for the repoquery command
distro-sync # downgrade or install packages to place the system in sync w current repos
downgrade # downgrade package to version in the repo
group # manage a set of packages as a single entity
help # displays help
history # display previous dnf commands
info # info about installed and available packages
install # install current version of package
list # displays installed and available packages
makecache # download metadata for the repos
mark # marks specified package as installed
module # manages module packages
provides # displays package that installed specified file
reinstall # attempts to reinstall the specified package
remove # rms the specified package, including packages that depend on it
repoinfo # displays info about the configured repo
repolist # displays a list of currently configured repos
repoquery # searches the configured repos for the specified package
repository-packages # runs commands on all packages in the repo
search # search pacakge metadata for specified keywords
shell # display interactive shell for entering multiple dnf commands
swap # rm and install the specified package
updateinfo # display update advisory msgs
upgrade # install latest version of specified packages, or all pkgs if none are specified
upgrade-minimal # install only latest package versions that provide bugfix or security fix
Application containers
- Containers bundle all files required for an application, including dependencies, into one distro package (the container)
- Each app has exactly the correct dependencies and versions
- Caveat: dependencies shared among multiple applications are duplicated for each application
snap containers
- Created and maintained by Canonical
snap
is an application container formatsnapd
app manages the snap packages- has CLI tool:
# get snap version
snap version
snap 2.61.3+22.04
snapd 2.61.3+22.04
series 16
ubuntu 22.04
kernel 5.15.0-91-generic
# list currently installed snap packages
snap list
Name Version Rev Tracking Publisher Notes
bare 1.0 5 latest/stable canonical✓ base
chromium 123.0.6312.86 2805 latest/stable canonical✓ -
core 16-2.61.2 16928 latest/stable canonical✓ core
...
# find specific package
snap find cups
Name Version Publisher Notes Summary
cups 2.4.7-8 openprinting✓ - The CUPS Snap - The Printing Stack for Linux
musescore 3.6.2 musescore✓ - Create, play and print beautiful sheet music.
...
# install snap package
sudo snap install stress-ng
# remove snap pacakge
sudo snap remove stress-ng
snap "stress-ng" is not installed
# disable
sudo snap disable <package>
# enable
sudo snap enable <package>
flatpak containers
- Opensource, not tied to a specific distro
- RHEL uses often uses this
# list packages
flatpack list
# add remote (repository)
sudo flatpak remote-add --if-not-exists flathub
# search for application
sudo flatpack search mosh
# install package with application ID
sudo flatpak install org.mosh.mosh
# unistall package
sudo flatpak uninstall org.mosh.mosh
Analyzing application dependencies
Versioning
Versioning is the management of multiple application software updates through a numbering process.