Information below is not for the current semester.
The current semester can be found here.
This page contains an overview of expected learning outcomes from all labs. It can be useful if you are searching for a particular topic but do not remember in which lab the topic was covered.
Lab #1
Conceptual knowledge
- explain why graphical user interface is not a fixed part of Linux
- list several differences between various graphical interfaces available in Linux
- explain in broad terms what is a Linux distribution
- explain what can be understood under the term of unix family of operating systems
- list a few types of assets that are typically needed for software projects
- explain in broad terms what is a versioning tool
- explain fundamental high-level operations of versioning tools
Practical skills
- boot your own machine into Linux (either via USB, dual-boot or virtualized)
- log in to a graphical Linux environment
- log in to the faculty instance of GitLab
- create a new project in GitLab
- upload a new file to GitLab via its web user interface and create a commit from it
- edit existing files in a GitLab project using its web interface
- customize a selected graphical environment
- create a basic GitLab issue in a given project
Lab #2
Conceptual knowledge
- list pros and cons of using a command-line interface vs a graphical one
- explain the difference between a terminal (emulator) and a shell
- explain what is a path to a file
- explain difference between a relative and an absolute file path
- explain what are shell (filename) wildcards
- explain what are command-line options (switches)
- explain usefulness of
--
delimiter (when using wildcards on specifically named files)
Practical skills
- start and close (exit) a terminal emulator
- customize a selected terminal emulator
- browse through a filesystem via text user interface tools (e.g.
mc
orranger
) - browse through a filesystem using commands
ls
andcd
- use basic switches of the
ls
command such as-l
,-h
or-a
- use wildcards to apply commands to specific subsets of filenames
- run own Python programs from the command line
- view contents of text files using the
cat
utility - view contents of binary files in hexadecimal using the
hexdump
utility - identify file type by using
file
utility - use (basic operations) of the built-in manual pages
- use clipboards available in a graphical interface on Linux
- use tab completion to effectively write file names and paths
- use irregularly named files
Lab #3
Conceptual knowledge
- explain what is a script in a Linux environment
- explain what is a shebang (hashbang) and how it influences script execution
- understand the difference when script has or does not have executable bit set
- explain what is a working directory
- explain why working directory is private to a running program
- explain how are parameters (arguments) passed in a script with a shebang
- explain what is a Git working copy (clone)
- optional: explain why
cd
cannot be a normal executable file like/usr/bin/ls
- optional: understand major differences between
/bin/sh
and/bin/bash
shebangs
Practical skills
- create a Linux script with correct shebang
- set the executable script using the
chmod
utility - access command-line arguments in a Python program
- configure author information in Git
- setup default editor in a shell (set
EDITOR
in~/.bashrc
) - clone a Git repository over HTTPS in shell
- review changes in a Git working copy (
git status
command) - create a Git commit from command-line (
git add
andgit commit
commands) - upload new commits to Git server or download new ones to a working copy\n(assuming single user project,
git push
andgit pull
commands)\n - view summary information about previous commits using
git log
- optional: customize Git with aliases
Lab #4
Conceptual knowledge
- explain what is standard input and output
- explain why standard input or output redirection is not (directly) observable from within the program
- explain why there are two output streams: stdout and stderr
- explain how execution of
cat foo.txt
andcat <foo.txt
differs - explain how standard inputs/outputs of several programs can be chained together
- explain what is program exit code
- explain differences and typical uses for the main five interfaces of a\ncommand-line program: command-line arguments, stdin, stdout, stderr, and exit code\n
- optional: explain what is a file descriptor (from the perspective of a userland developer)
Practical skills
- redirect standard input and standard (error) output of a program in shell
- set exit code of a Python script
- use the special file
/dev/null
- use standard input and output in Python
- use the pipe
|
to chain multiple programs together - use basic text filtering tools:
cut
,sort
, … - use
grep -F
to filter lines matching provided pattern - optional: customize shell script with aliases
- optional: store custom shell configuration in
.bashrc
(or.profile
) scripts - optional: customize prompt with the
PS1
variable
Lab #5
Conceptual knowledge
- explain basic principles of network communication (in OS agnostic manner)
- explain basic principles of asymmetric cryptography
- explain in detail how asymmetric cryptography (public and private key)\ncan be used to authenticate a user\n
- explain what is SSH and what functions it offers
- explain what account types exist on Linux and how they differ (e.g.
johndoe
,root
andnobody
) - explain how differs execution of programs locally vs over SSH remotely
- explain difference between using Git over HTTPS vs Git over SSH
- explain basic access rights in Unix operating systems
- explain what individual access rights
r
,w
andx
mean for normal\nfiles and what for directories\n - explain what is a set-uid bit
- explain what is a process and how it differs from an executable file
- explain difference of ownership of a file and a running process
- optional: provide a high-level overview of POSIX ACLs
Practical skills
- set
PS1
variable to distinguish different machines - use
ssh
command to login to a remote machine - execute commands on a remote machine using SSH
- use
hostname
command - transfer files over SSH using
cat
- setup password-less authentication on a remote Linux machine using a private/public key pair
- setup publickey-based authentication to GitLab
- use
git clone
(andpull
andpush
) over SSH - view and change basic access permissions of a file
- use
ps
to view list of existing processes (including-e
,-f
and--forest
switches) - use
htop
to interactively monitor existing processes - optional: configure SSH shortcuts
- optional: use basic functions of
tmux
terminal multiplexer
Lab #6
Conceptual knowledge
- explain what is an environment variable
- explain how variable scoping works in shell
- explain the difference between a normal and exported shell variable
- explain how
$PATH
variable is used in shell - explain how changing
$PATH
affects program execution - explain how shell expansion and splitting into command-line arguments is performed
- optional: explain why current directory is usually not part of
$PATH
variable
Practical skills
- use Pandoc to convert between various text formats
- set (assign) and read environment variables
- compute mathematical expressions directly in shell using
$(( ))
construct - use command substitution (
$( )
) - use composition operands
&&
and||
in shell scripts - create and use shell functions
- use subshell to group multiple commands
- optional: read environment variables in Python
- optional: create custom templates for Pandoc
Lab #7
Conceptual knowledge
- explain main differences between a project fork and repository working copy (clone)
- explain what is a Git branch
- explain what is a feature branch
- explain what is branch merging in Git
- explain what is a merge (pull) request and when it can be used
- explain what is a Git remote
- explain when Git merge conflict can arise and how it can be resolved
- explain what is usually meant by upstream project (repository)
Practical skills
- create Git branch locally using
git branch
- push new Git branch to remote server
- create merge request from a feature branch in GitLab
- switch between branches (
git checkout
) - merge Git branches locally using
git merge
- fix merge conflicts
- setup Git remotes
- use Git aliases for more effective work
- optional: use the
youtube-dl
utility - optional: use VLC media player from command-line
Lab #8
Conceptual knowledge
- explain what is a linter and style checker
- explain what kind of issues can be detected by style checkers
- explain concurrency issues that can occur when using temporary files
- explain how program exit code is used to drive control flow in shell scripts
- explain what commands are executed and how is evaluated a shell construct
if true; then echo "true"; fi
- explain what considerations are important when deciding between use of shell vs Python
Practical skills
- use temporary files securely in shell scripts
- use control flow in shell scripts (
for
,while
,if
,case
) - use
read
command - use
getopt
for parsing command line arguments - use
.
andsource
to load functions from different files - use and interpret results of ShellCheck
- use
scp
to copy individual files to (or from) a remote machine - optional: use
rsync
to synchronize whole directories
Lab #10
Conceptual knowledge
- explain how and why is software distributed in the forms of packages
- explain what is a regular expression (regex)
- explain difference between the
root
account and other accounts - explain why doing non-administrative tasks with
root
account is generally discouraged - explain in broad terms how
sudo
can be used for system administration - understand the dangers of using
sudo
- explain what is a service (daemon)
- explain life cycle and possible states of a service
- explain what is a program log and how it can be managed
- explain advantages of using automated functional tests
Practical skills
- create and use simple regular expressions to filter text with
grep
- perform pattern substitution using
sed
- use
getent
to retrieve information about user accounts - use
sudo
to elevate privileges of an executed program - use a package manager to install or uninstall packages
- use a package manager to perform a system update
- use
systemctl
to start and stop services - use
systemctl
to ensure service is automatically started at machine boot - optional: use
journalctl
to view service logs - optional: use
useradd
to create a new user account - optional: use the SANE subsystem for accessing scanners in Linux
- execute BATS tests
- understand basic structure of BATS tests
- optional: create simple BATS tests
Lab #11
Conceptual knowledge
- explain what is a disk image
- explain why no special tools are required for working with disk images
- explain difference between normal files, directories, symbolic links,\ndevice files and system-state files (e.g. from
/proc
filesystem)\n - list fundamental top-level directories on a typical Linux installation and describe their function
- explain in general terms how the directory tree is formed by mounting individual (file) subsystems
- explain what are requirements (library dependencies)
- explain fundamentals of semantic versioning
- explain what are pros and cons of installing dependencies system-wide vs\ninstalling them in a sandboxed environment\n
- provide a high-level overview of a sandbox environment
- explain pros and cons of specifying transitive requirements vs specification\nof top-level ones only\n
- explain pros and cons of using exact versions vs minimal requirements
- explain why Linux maintains separation of archiving and compression programs (e.g.
tar
andgzip
)
Practical skills
- mount disks using the
mount
command (both physical disks as well as images) - get summary information about disk usage with
df
command - use either
tar
oratool
to work with standard Linux archives - create a new virtual environment for Python using
python3 -m venv
- activate and deactivate virtual environment
- install project dependencies in a virtual environment with
pip
- develop program inside a virtual environment (with projects using\n
setup.cfg
andpyproject.toml
files)\n - install Python project from its
setup.cfg
- optional: use
lsblk
to view available block (storage) devices - optional: setup Python project for installation
Lab #12
Conceptual knowledge
- explain what is a container
- compare container with a virtual machine and a process
- explain in what situations can be leveraged container isolation
- explain container life-cycle
- explain why using virtual environments (or other types of sandboxin)\ninside a container is typically not needed\n
- explain a difference between a running container and a container image
Practical skills
- use
xargs
program - use
find
with basic predicates (-name
,-type
) and actions (-exec
,-delete
) - start interactive Podman container
- start service-style Podman container
- expose container ports
- mount a volume into a container
- clean unused containers and images
Lab #13
Conceptual knowledge
- explain why use of
nmap
is often prohibited/limited by network administrators - explain the difference between a normal SSH port forward and a reverse port forward
- explain what is a process signal
Practical skills
- use
nc
for basic operations - use
pgrep
to find specific processes - send a signal to a running process
- use SSH port forward to access service available on loopback device
- use reverse SSH port forward to connect to a machine behind a NAT
- use
nmap
for basic network scanning - use
ip
command to query current network configuration - use
ping
andtraceroute
as basic tools for debugging networking issues - optional: use SSH agent and passphrase-protected SSH keys
- optional: use NetworkManager to set up static IP addressing
- optional: use printing and scanning in Linux
- optional: fix corrupted file systems using the family of
fsck
programs - optional: use PhotoRec to restore files from a broken file system
Lab #14
Conceptual knowledge
- explain principles of continuous integration
- explain advantages of using continuous integration
- name several steps that are often required to create distributable software\n(e.g. a package or an installer) from source code and other basic artifacts\n
- explain why software build should be a reproducible process
- explain how it is possible to capture a software build
- explain concepts of languages that are used for capturing steps needed\nfor software build (distribution)\n
- explain in broad sense how GitLab CI works
Practical skills
- build
make
-based project with default settings - create
Makefile
that drives build of a simple project - use wildcard rules in
Makefile
- setup GitLab CI for simple projects
- optional: use variables in a
Makefile
- optional: use basic GNU extensions to simplify complex
Makefile
s