225
									
								
								.drone.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,225 @@
 | 
			
		||||
---
 | 
			
		||||
kind: pipeline
 | 
			
		||||
type: kubernetes
 | 
			
		||||
name: latest
 | 
			
		||||
 | 
			
		||||
platform:
 | 
			
		||||
  os: linux
 | 
			
		||||
  arch: amd64
 | 
			
		||||
 | 
			
		||||
steps:
 | 
			
		||||
- name: build
 | 
			
		||||
  commands:
 | 
			
		||||
  - make latexmk/index.pdf
 | 
			
		||||
  image: docker.io/volkerraschek/latex:latest-archlinux
 | 
			
		||||
  resources:
 | 
			
		||||
    limits:
 | 
			
		||||
      cpu: 500
 | 
			
		||||
      memory: 250M
 | 
			
		||||
 | 
			
		||||
- name: push-nextcloud
 | 
			
		||||
  commands:
 | 
			
		||||
  - curl --fail --user $WEBDAV_USER:$WEBDAV_PASSWORD --upload-file index.pdf --location https://nextcloud.cryptic.systems/remote.php/dav/files/markus.pesch/Dokumente/Studium/Fachschaftdaten/LX_-_Linux/linux_ws2122/Aufgabensammlung.pdf
 | 
			
		||||
  depends_on:
 | 
			
		||||
  - build
 | 
			
		||||
  environment:
 | 
			
		||||
    WEBDAV_USER:
 | 
			
		||||
      from_secret: webdav_username
 | 
			
		||||
    WEBDAV_PASSWORD:
 | 
			
		||||
      from_secret: webdav_password
 | 
			
		||||
  image: docker.io/volkerraschek/latex:latest-archlinux
 | 
			
		||||
  resources:
 | 
			
		||||
    limits:
 | 
			
		||||
      cpu: 50
 | 
			
		||||
      memory: 25M
 | 
			
		||||
  when:
 | 
			
		||||
    repo:
 | 
			
		||||
    - fh-trier/linux_ws2122
 | 
			
		||||
    event:
 | 
			
		||||
    - push
 | 
			
		||||
    - cron
 | 
			
		||||
 | 
			
		||||
- name: push-fhtrier
 | 
			
		||||
  depends_on:
 | 
			
		||||
  - build
 | 
			
		||||
  image: docker.io/appleboy/drone-scp:1.6.2
 | 
			
		||||
  settings:
 | 
			
		||||
    host: ssh.hochschule-trier.de
 | 
			
		||||
    user:
 | 
			
		||||
      from_secret: ssh_user_fh-trier
 | 
			
		||||
    key:
 | 
			
		||||
      from_secret: ssh_key
 | 
			
		||||
    port: 22
 | 
			
		||||
    command_timeout: 2m
 | 
			
		||||
    target:
 | 
			
		||||
    - /dozenten/peschm/linux_ws2122
 | 
			
		||||
    source:
 | 
			
		||||
    - index.pdf
 | 
			
		||||
    - csv/*
 | 
			
		||||
    - sql/*
 | 
			
		||||
  when:
 | 
			
		||||
    branch:
 | 
			
		||||
    - master
 | 
			
		||||
    repo:
 | 
			
		||||
    - fh-trier/linux_ws2122
 | 
			
		||||
    event:
 | 
			
		||||
    - push
 | 
			
		||||
    - cron
 | 
			
		||||
 | 
			
		||||
- name: email-notification
 | 
			
		||||
  depends_on:
 | 
			
		||||
  - push-nextcloud
 | 
			
		||||
  - push-fhtrier
 | 
			
		||||
  environment:
 | 
			
		||||
    PLUGIN_HOST:
 | 
			
		||||
      from_secret: smtp_host
 | 
			
		||||
    PLUGIN_USERNAME:
 | 
			
		||||
      from_secret: smtp_username
 | 
			
		||||
    PLUGIN_PASSWORD:
 | 
			
		||||
      from_secret: smtp_password
 | 
			
		||||
    PLUGIN_FROM:
 | 
			
		||||
      from_secret: smtp_mail_address
 | 
			
		||||
  image: docker.io/drillster/drone-email:latest
 | 
			
		||||
  resources:
 | 
			
		||||
    limits:
 | 
			
		||||
      cpu: 50
 | 
			
		||||
      memory: 25M
 | 
			
		||||
  when:
 | 
			
		||||
    status:
 | 
			
		||||
    - changed
 | 
			
		||||
    - failure
 | 
			
		||||
 | 
			
		||||
trigger:
 | 
			
		||||
  event:
 | 
			
		||||
    exclude:
 | 
			
		||||
    - tag
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
kind: pipeline
 | 
			
		||||
type: kubernetes
 | 
			
		||||
name: release
 | 
			
		||||
 | 
			
		||||
platform:
 | 
			
		||||
  os: linux
 | 
			
		||||
  arch: amd64
 | 
			
		||||
 | 
			
		||||
steps:
 | 
			
		||||
- name: build
 | 
			
		||||
  commands:
 | 
			
		||||
  - make latexmk/index.pdf
 | 
			
		||||
  environment:
 | 
			
		||||
    VERSION: ${DRONE_TAG}
 | 
			
		||||
  image: docker.io/volkerraschek/latex:latest-archlinux
 | 
			
		||||
  resources:
 | 
			
		||||
    limits:
 | 
			
		||||
      cpu: 500
 | 
			
		||||
      memory: 250M
 | 
			
		||||
 | 
			
		||||
- name: push-nextcloud
 | 
			
		||||
  commands:
 | 
			
		||||
  - curl --fail --user $WEBDAV_USER:$WEBDAV_PASSWORD --upload-file index.pdf --location https://nextcloud.cryptic.systems/remote.php/dav/files/markus.pesch/Dokumente/Studium/Fachschaftdaten/LX_-_Linux/linux_ws2122/Aufgabensammlung_${DRONE_TAG}.pdf
 | 
			
		||||
  environment:
 | 
			
		||||
    WEBDAV_USER:
 | 
			
		||||
      from_secret: webdav_username
 | 
			
		||||
    WEBDAV_PASSWORD:
 | 
			
		||||
      from_secret: webdav_password
 | 
			
		||||
  image: docker.io/volkerraschek/latex:latest-archlinux
 | 
			
		||||
  resources:
 | 
			
		||||
    limits:
 | 
			
		||||
      cpu: 50
 | 
			
		||||
      memory: 25M
 | 
			
		||||
 | 
			
		||||
- name: push-gitea
 | 
			
		||||
  image: docker.io/plugins/gitea-release:latest
 | 
			
		||||
  resources:
 | 
			
		||||
    limits:
 | 
			
		||||
      cpu: 50
 | 
			
		||||
      memory: 25M
 | 
			
		||||
  settings:
 | 
			
		||||
    base_url: https://git.cryptic.systems
 | 
			
		||||
    api_key:
 | 
			
		||||
      from_secret: gitea_token
 | 
			
		||||
    files:
 | 
			
		||||
    - index.pdf
 | 
			
		||||
    checksum:
 | 
			
		||||
    - md5
 | 
			
		||||
    - sha1
 | 
			
		||||
    - sha256
 | 
			
		||||
    - sha512
 | 
			
		||||
    - adler32
 | 
			
		||||
    - crc32
 | 
			
		||||
 | 
			
		||||
- name: email-notification
 | 
			
		||||
  environment:
 | 
			
		||||
    PLUGIN_HOST:
 | 
			
		||||
      from_secret: smtp_host
 | 
			
		||||
    PLUGIN_USERNAME:
 | 
			
		||||
      from_secret: smtp_username
 | 
			
		||||
    PLUGIN_PASSWORD:
 | 
			
		||||
      from_secret: smtp_password
 | 
			
		||||
    PLUGIN_FROM:
 | 
			
		||||
      from_secret: smtp_mail_address
 | 
			
		||||
  image: docker.io/drillster/drone-email:latest
 | 
			
		||||
  resources:
 | 
			
		||||
    limits:
 | 
			
		||||
      cpu: 50
 | 
			
		||||
      memory: 25M
 | 
			
		||||
  when:
 | 
			
		||||
    status:
 | 
			
		||||
    - changed
 | 
			
		||||
    - failure
 | 
			
		||||
 | 
			
		||||
trigger:
 | 
			
		||||
  event:
 | 
			
		||||
  - tag
 | 
			
		||||
  repo:
 | 
			
		||||
  - fh-trier/linux_ws2122
 | 
			
		||||
 | 
			
		||||
# ---
 | 
			
		||||
# kind: pipeline
 | 
			
		||||
# type: kubernetes
 | 
			
		||||
# name: sync
 | 
			
		||||
 | 
			
		||||
# platform:
 | 
			
		||||
#   os: linux
 | 
			
		||||
#   arch: amd64
 | 
			
		||||
 | 
			
		||||
# steps:
 | 
			
		||||
# - name: github
 | 
			
		||||
#   image: docker.io/appleboy/drone-git-push:latest
 | 
			
		||||
#   resources:
 | 
			
		||||
#     limits:
 | 
			
		||||
#       cpu: 50
 | 
			
		||||
#       memory: 25M
 | 
			
		||||
#   settings:
 | 
			
		||||
#     branch: master
 | 
			
		||||
#     remote: ssh://git@github.com/fh-trier/linux_ws2122.git
 | 
			
		||||
#     force: true
 | 
			
		||||
#     ssh_key:
 | 
			
		||||
#       from_secret: ssh_key
 | 
			
		||||
 | 
			
		||||
# - name: email-notification
 | 
			
		||||
#   environment:
 | 
			
		||||
#     PLUGIN_HOST:
 | 
			
		||||
#       from_secret: smtp_host
 | 
			
		||||
#     PLUGIN_USERNAME:
 | 
			
		||||
#       from_secret: smtp_username
 | 
			
		||||
#     PLUGIN_PASSWORD:
 | 
			
		||||
#       from_secret: smtp_password
 | 
			
		||||
#     PLUGIN_FROM:
 | 
			
		||||
#       from_secret: smtp_mail_address
 | 
			
		||||
#   image: docker.io/drillster/drone-email:latest
 | 
			
		||||
#   resources:
 | 
			
		||||
#     limits:
 | 
			
		||||
#       cpu: 50
 | 
			
		||||
#       memory: 25M
 | 
			
		||||
#   when:
 | 
			
		||||
#     status:
 | 
			
		||||
#     - changed
 | 
			
		||||
#     - failure
 | 
			
		||||
 | 
			
		||||
# trigger:
 | 
			
		||||
#   event:
 | 
			
		||||
#   - push
 | 
			
		||||
#   repo:
 | 
			
		||||
#   - fh-trier/linux_ws2122
 | 
			
		||||
							
								
								
									
										12
									
								
								.editorconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,12 @@
 | 
			
		||||
root = true
 | 
			
		||||
 | 
			
		||||
[*]
 | 
			
		||||
indent_style = space
 | 
			
		||||
indent_size = 2
 | 
			
		||||
end_of_line = lf
 | 
			
		||||
charset = utf-8
 | 
			
		||||
trim_trailing_whitespace = true
 | 
			
		||||
insert_final_newline = false
 | 
			
		||||
 | 
			
		||||
[Makefile]
 | 
			
		||||
indent_style = tab
 | 
			
		||||
							
								
								
									
										1
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
			
		||||
Makefile eol=lf
 | 
			
		||||
							
								
								
									
										225
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,225 @@
 | 
			
		||||
## Core latex/pdflatex auxiliary files:
 | 
			
		||||
*.aux
 | 
			
		||||
*.lof
 | 
			
		||||
*.log
 | 
			
		||||
*.lot
 | 
			
		||||
*.fls
 | 
			
		||||
*.out
 | 
			
		||||
*.toc
 | 
			
		||||
*.fmt
 | 
			
		||||
*.fot
 | 
			
		||||
*.cb
 | 
			
		||||
*.cb2
 | 
			
		||||
 | 
			
		||||
## Intermediate documents:
 | 
			
		||||
*.dvi
 | 
			
		||||
*-converted-to.*
 | 
			
		||||
# these rules might exclude image files for figures etc.
 | 
			
		||||
# *.ps
 | 
			
		||||
# *.eps
 | 
			
		||||
*.pdf
 | 
			
		||||
 | 
			
		||||
## Generated if empty string is given at "Please type another file name for output:"
 | 
			
		||||
#.pdf
 | 
			
		||||
 | 
			
		||||
## Bibliography auxiliary files (bibtex/biblatex/biber):
 | 
			
		||||
*.bbl
 | 
			
		||||
*.bcf
 | 
			
		||||
*.blg
 | 
			
		||||
*-blx.aux
 | 
			
		||||
*-blx.bib
 | 
			
		||||
*.run.xml
 | 
			
		||||
 | 
			
		||||
## Build tool auxiliary files:
 | 
			
		||||
*.fdb_latexmk
 | 
			
		||||
*.synctex
 | 
			
		||||
*.synctex(busy)
 | 
			
		||||
*.synctex.gz
 | 
			
		||||
*.synctex.gz(busy)
 | 
			
		||||
*.pdfsync
 | 
			
		||||
 | 
			
		||||
## Auxiliary and intermediate files from other packages:
 | 
			
		||||
# algorithms
 | 
			
		||||
*.alg
 | 
			
		||||
*.loa
 | 
			
		||||
 | 
			
		||||
# achemso
 | 
			
		||||
acs-*.bib
 | 
			
		||||
 | 
			
		||||
# amsthm
 | 
			
		||||
*.thm
 | 
			
		||||
 | 
			
		||||
# beamer
 | 
			
		||||
*.nav
 | 
			
		||||
*.pre
 | 
			
		||||
*.snm
 | 
			
		||||
*.vrb
 | 
			
		||||
 | 
			
		||||
# changes
 | 
			
		||||
*.soc
 | 
			
		||||
 | 
			
		||||
# cprotect
 | 
			
		||||
*.cpt
 | 
			
		||||
 | 
			
		||||
# elsarticle (documentclass of Elsevier journals)
 | 
			
		||||
*.spl
 | 
			
		||||
 | 
			
		||||
# endnotes
 | 
			
		||||
*.ent
 | 
			
		||||
 | 
			
		||||
# fixme
 | 
			
		||||
*.lox
 | 
			
		||||
 | 
			
		||||
# feynmf/feynmp
 | 
			
		||||
*.mf
 | 
			
		||||
*.mp
 | 
			
		||||
*.t[1-9]
 | 
			
		||||
*.t[1-9][0-9]
 | 
			
		||||
*.tfm
 | 
			
		||||
 | 
			
		||||
#(r)(e)ledmac/(r)(e)ledpar
 | 
			
		||||
*.end
 | 
			
		||||
*.?end
 | 
			
		||||
*.[1-9]
 | 
			
		||||
*.[1-9][0-9]
 | 
			
		||||
*.[1-9][0-9][0-9]
 | 
			
		||||
*.[1-9]R
 | 
			
		||||
*.[1-9][0-9]R
 | 
			
		||||
*.[1-9][0-9][0-9]R
 | 
			
		||||
*.eledsec[1-9]
 | 
			
		||||
*.eledsec[1-9]R
 | 
			
		||||
*.eledsec[1-9][0-9]
 | 
			
		||||
*.eledsec[1-9][0-9]R
 | 
			
		||||
*.eledsec[1-9][0-9][0-9]
 | 
			
		||||
*.eledsec[1-9][0-9][0-9]R
 | 
			
		||||
 | 
			
		||||
# glossaries
 | 
			
		||||
*.acn
 | 
			
		||||
*.acr
 | 
			
		||||
*.glg
 | 
			
		||||
*.glo
 | 
			
		||||
*.gls
 | 
			
		||||
*.glsdefs
 | 
			
		||||
 | 
			
		||||
# gnuplottex
 | 
			
		||||
*-gnuplottex-*
 | 
			
		||||
 | 
			
		||||
# gregoriotex
 | 
			
		||||
*.gaux
 | 
			
		||||
*.gtex
 | 
			
		||||
 | 
			
		||||
# hyperref
 | 
			
		||||
*.brf
 | 
			
		||||
 | 
			
		||||
# knitr
 | 
			
		||||
*-concordance.tex
 | 
			
		||||
# TODO Comment the next line if you want to keep your tikz graphics files
 | 
			
		||||
*.tikz
 | 
			
		||||
*-tikzDictionary
 | 
			
		||||
 | 
			
		||||
# listings
 | 
			
		||||
*.lol
 | 
			
		||||
 | 
			
		||||
# makeidx
 | 
			
		||||
*.idx
 | 
			
		||||
*.ilg
 | 
			
		||||
*.ind
 | 
			
		||||
*.ist
 | 
			
		||||
 | 
			
		||||
# minitoc
 | 
			
		||||
*.maf
 | 
			
		||||
*.mlf
 | 
			
		||||
*.mlt
 | 
			
		||||
*.mtc[0-9]*
 | 
			
		||||
*.slf[0-9]*
 | 
			
		||||
*.slt[0-9]*
 | 
			
		||||
*.stc[0-9]*
 | 
			
		||||
 | 
			
		||||
# minted
 | 
			
		||||
_minted*
 | 
			
		||||
*.pyg
 | 
			
		||||
 | 
			
		||||
# morewrites
 | 
			
		||||
*.mw
 | 
			
		||||
 | 
			
		||||
# nomencl
 | 
			
		||||
*.nlo
 | 
			
		||||
 | 
			
		||||
# pax
 | 
			
		||||
*.pax
 | 
			
		||||
 | 
			
		||||
# pdfpcnotes
 | 
			
		||||
*.pdfpc
 | 
			
		||||
 | 
			
		||||
# sagetex
 | 
			
		||||
*.sagetex.sage
 | 
			
		||||
*.sagetex.py
 | 
			
		||||
*.sagetex.scmd
 | 
			
		||||
 | 
			
		||||
# scrwfile
 | 
			
		||||
*.wrt
 | 
			
		||||
 | 
			
		||||
# sympy
 | 
			
		||||
*.sout
 | 
			
		||||
*.sympy
 | 
			
		||||
sympy-plots-for-*.tex/
 | 
			
		||||
 | 
			
		||||
# pdfcomment
 | 
			
		||||
*.upa
 | 
			
		||||
*.upb
 | 
			
		||||
 | 
			
		||||
# pythontex
 | 
			
		||||
*.pytxcode
 | 
			
		||||
pythontex-files-*/
 | 
			
		||||
 | 
			
		||||
# thmtools
 | 
			
		||||
*.loe
 | 
			
		||||
 | 
			
		||||
# TikZ & PGF
 | 
			
		||||
*.dpth
 | 
			
		||||
*.md5
 | 
			
		||||
*.auxlock
 | 
			
		||||
 | 
			
		||||
# todonotes
 | 
			
		||||
*.tdo
 | 
			
		||||
 | 
			
		||||
# easy-todo
 | 
			
		||||
*.lod
 | 
			
		||||
 | 
			
		||||
# xindy
 | 
			
		||||
*.xdy
 | 
			
		||||
 | 
			
		||||
# xypic precompiled matrices
 | 
			
		||||
*.xyc
 | 
			
		||||
 | 
			
		||||
# endfloat
 | 
			
		||||
*.ttt
 | 
			
		||||
*.fff
 | 
			
		||||
 | 
			
		||||
# Latexian
 | 
			
		||||
TSWLatexianTemp*
 | 
			
		||||
 | 
			
		||||
## Editors:
 | 
			
		||||
# WinEdt
 | 
			
		||||
*.bak
 | 
			
		||||
*.sav
 | 
			
		||||
 | 
			
		||||
# Texpad
 | 
			
		||||
.texpadtmp
 | 
			
		||||
 | 
			
		||||
# Kile
 | 
			
		||||
*.backup
 | 
			
		||||
 | 
			
		||||
# KBibTeX
 | 
			
		||||
*~[0-9]*
 | 
			
		||||
 | 
			
		||||
# auto folder when using emacs and auctex
 | 
			
		||||
/auto/*
 | 
			
		||||
 | 
			
		||||
# expex forward references with \gathertags
 | 
			
		||||
*-tags.tex
 | 
			
		||||
 | 
			
		||||
# Tmp files
 | 
			
		||||
git-id.tmp
 | 
			
		||||
git-date.tmp
 | 
			
		||||
git-url.tmp
 | 
			
		||||
							
								
								
									
										15
									
								
								.latexmkrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,15 @@
 | 
			
		||||
add_cus_dep('glo', 'gls', 0, 'run_makeglossaries');
 | 
			
		||||
add_cus_dep('acn', 'acr', 0, 'run_makeglossaries');
 | 
			
		||||
 | 
			
		||||
sub run_makeglossaries {
 | 
			
		||||
  if ( $silent ) {
 | 
			
		||||
    system "makeglossaries -q '$_[0]'";
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    system "makeglossaries '$_[0]'";
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
push @generated_exts, 'glo', 'gls', 'glg';
 | 
			
		||||
push @generated_exts, 'acn', 'acr', 'alg';
 | 
			
		||||
$clean_ext .= ' %R.ist %R.xdy';
 | 
			
		||||
							
								
								
									
										90
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,90 @@
 | 
			
		||||
# VERSION / RELEASE
 | 
			
		||||
# If no version is specified as a parameter of make, the last git hash
 | 
			
		||||
# value is taken.
 | 
			
		||||
VERSION?=$(shell git describe --abbrev=0)+hash.$(shell git rev-parse --short HEAD)
 | 
			
		||||
 | 
			
		||||
# CONTAINER_RUNTIME
 | 
			
		||||
# The CONTAINER_RUNTIME variable will be used to specified the path to a
 | 
			
		||||
# container runtime. This is needed to start and run a container images.
 | 
			
		||||
CONTAINER_RUNTIME?=$(shell which docker)
 | 
			
		||||
 | 
			
		||||
# BUILD_IMAGE
 | 
			
		||||
# Definition of the container build image, in which the BInary are compiled from
 | 
			
		||||
# source code
 | 
			
		||||
BUILD_IMAGE_REGISTRY:=docker.io
 | 
			
		||||
BUILD_IMAGE_NAMESPACE:=volkerraschek
 | 
			
		||||
BUILD_IMAGE_NAME:=container-latex
 | 
			
		||||
BUILD_IMAGE_VERSION:=latest-archlinux
 | 
			
		||||
BUILD_IMAGE_FULL=${BUILD_IMAGE_REGISTRY}/${BUILD_IMAGE_NAMESPACE}/${BUILD_IMAGE_NAME}:${BUILD_IMAGE_VERSION}
 | 
			
		||||
BUILD_IMAGE_SHORT=${BUILD_IMAGE_NAMESPACE}/${BUILD_IMAGE_NAME}:${BUILD_IMAGE_VERSION}
 | 
			
		||||
 | 
			
		||||
# Input tex-file and output pdf-file
 | 
			
		||||
FILE_NAME=index
 | 
			
		||||
IDX_TARGET:=${FILE_NAME:%=%.idx}
 | 
			
		||||
PDF_TARGET:=${FILE_NAME:%=%.pdf}
 | 
			
		||||
TEX_TARGET:=${FILE_NAME:%=%.tex}
 | 
			
		||||
 | 
			
		||||
# PDF_TARGET
 | 
			
		||||
# ==============================================================================
 | 
			
		||||
${PDF_TARGET}: latexmk/${PDF_TARGET}
 | 
			
		||||
 | 
			
		||||
PHONY:=latexmk/${PDF_TARGET}
 | 
			
		||||
latexmk/${PDF_TARGET}:
 | 
			
		||||
	latexmk \
 | 
			
		||||
		-shell-escape \
 | 
			
		||||
		-synctex=1 \
 | 
			
		||||
		-interaction=nonstopmode \
 | 
			
		||||
		-file-line-error \
 | 
			
		||||
		-pdf ${TEX_TARGET}
 | 
			
		||||
 | 
			
		||||
PHONY+=pdflatex/${PDF_TARGET}
 | 
			
		||||
pdflatex/${PDF_TARGET}:
 | 
			
		||||
 | 
			
		||||
	makeglossaries ${FILE_NAME}
 | 
			
		||||
	makeindex ${FILE_NAME}
 | 
			
		||||
 | 
			
		||||
	pdflatex \
 | 
			
		||||
		-shell-escape \
 | 
			
		||||
		-synctex=1 \
 | 
			
		||||
		-interaction=nonstopmode \
 | 
			
		||||
		-enable-write18 ${TEX_TARGET}
 | 
			
		||||
 | 
			
		||||
# CLEAN
 | 
			
		||||
# ==============================================================================
 | 
			
		||||
PHONY+=clean
 | 
			
		||||
clean:
 | 
			
		||||
	git clean -fX
 | 
			
		||||
 | 
			
		||||
# CONTAINER STEPS - PDF_TARGET
 | 
			
		||||
# ==============================================================================
 | 
			
		||||
container-run/${PDF_TARGET}:
 | 
			
		||||
	$(MAKE) container-run COMMAND=${@:container-run/%=%}
 | 
			
		||||
 | 
			
		||||
container-run/latexmk/${PDF_TARGET}:
 | 
			
		||||
	$(MAKE) container-run COMMAND=${@:container-run/%=%}
 | 
			
		||||
 | 
			
		||||
container-run/pdflatex/${PDF_TARGET}:
 | 
			
		||||
	$(MAKE) container-run COMMAND=${@:container-run/%=%}
 | 
			
		||||
 | 
			
		||||
# CONTAINER STEPS - CLEAN
 | 
			
		||||
# ==============================================================================
 | 
			
		||||
container-run/clean:
 | 
			
		||||
	$(MAKE) container-run COMMAND=${@:container-run/%=%}
 | 
			
		||||
 | 
			
		||||
# GENERAL CONTAINER COMMAND
 | 
			
		||||
# ==============================================================================
 | 
			
		||||
PHONY+=container-run
 | 
			
		||||
container-run:
 | 
			
		||||
	${CONTAINER_RUNTIME} run \
 | 
			
		||||
		--rm \
 | 
			
		||||
		--user $(shell id --user):${shell id --group} \
 | 
			
		||||
		--volume $(shell pwd):/workspace \
 | 
			
		||||
			${BUILD_IMAGE_SHORT} \
 | 
			
		||||
				make ${COMMAND} \
 | 
			
		||||
					VERSION=${VERSION} \
 | 
			
		||||
 | 
			
		||||
# PHONY
 | 
			
		||||
# ==============================================================================
 | 
			
		||||
# Declare the contents of the PHONY variable as phony.  We keep that information
 | 
			
		||||
# in a variable so we can use it in if_changed.
 | 
			
		||||
.PHONY: ${PHONY}
 | 
			
		||||
							
								
								
									
										71
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,71 @@
 | 
			
		||||
# Linux WS20/21
 | 
			
		||||
 | 
			
		||||
[](https://drone.cryptic.systems/fh-trier/linux_ws2021)
 | 
			
		||||
 | 
			
		||||
This repository contains the latex source code of the linux module on the
 | 
			
		||||
University of Applied Science for WS20/21.
 | 
			
		||||
 | 
			
		||||
The document contains all tasks which the students should could solve before
 | 
			
		||||
they write their linux exam.
 | 
			
		||||
 | 
			
		||||
## Compiling the PDF document
 | 
			
		||||
 | 
			
		||||
There are two ways to compile the PDF document. Since the templates contain all
 | 
			
		||||
dependencies to the package `minted`, it is probably easier to use a container
 | 
			
		||||
image to compile the document.
 | 
			
		||||
 | 
			
		||||
To do this, install docker or podman as container runtime and Make as build
 | 
			
		||||
tool. If you have docker or podman and Make installed execute `make
 | 
			
		||||
container-run/latexmk/index.pdf` to compile the PDF document by using a
 | 
			
		||||
container image.
 | 
			
		||||
 | 
			
		||||
If you don't want to install a container runtime and the build tool make, you
 | 
			
		||||
have to install texlive manually - [installation instructions](https://www.tug.org/texlive/).
 | 
			
		||||
 | 
			
		||||
## make commands
 | 
			
		||||
 | 
			
		||||
### clean
 | 
			
		||||
 | 
			
		||||
Deletes all files that were not checked in using git.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
make clean
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### container-run/latexmk
 | 
			
		||||
 | 
			
		||||
Uses a docker container to compile the PDF document with `latexmk` By default
 | 
			
		||||
the docker container `volkerraschek/container-latex:latest-ubuntu18.04` is used.
 | 
			
		||||
However, it can also be modified. The Makefile contains the variables with the
 | 
			
		||||
prefix `BUILD_IMAGE` to change the full qualified image path for this purpose.
 | 
			
		||||
However, you may have to change the docker command call in `container-run` if
 | 
			
		||||
necessary.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
make container-run/latexmk/index.pdf
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### container-run/pdflatex
 | 
			
		||||
 | 
			
		||||
Similar to container-run/latexmk/index.pdf, but in the container pdflatex will
 | 
			
		||||
be execute instead of latexmk.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
make container-run/pdflatex/index.pdf
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### latexmk
 | 
			
		||||
 | 
			
		||||
Executes latexmk natively in the system environment.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
make latexmk/index.pdf
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### pdflatex
 | 
			
		||||
 | 
			
		||||
Executes pdflatex natively in the system environment.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
make pdflatex
 | 
			
		||||
```
 | 
			
		||||
							
								
								
									
										3
									
								
								awk/01-aufgabe.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,3 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
awk -F ":" '{print $0;}' /etc/passwd
 | 
			
		||||
							
								
								
									
										3
									
								
								awk/02-aufgabe.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,3 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
awk -F ":" 'BEGIN {printf "user badname shell\n";} {printf "%s %s %s\n", $1, $5, $7;}' /etc/passwd
 | 
			
		||||
							
								
								
									
										9
									
								
								awk/03-aufgabe.awk
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,9 @@
 | 
			
		||||
#!/bin/awk
 | 
			
		||||
 | 
			
		||||
BEGIN {
 | 
			
		||||
  printf "user badname shell\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
  if ( $3>=1000 ) printf "%s %s %s\n", $1, $5, $7;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								awk/03-aufgabe.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,3 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
awk -F ":" -f 03-aufgabe.awk /etc/passwd
 | 
			
		||||
							
								
								
									
										9
									
								
								awk/04-aufgabe.awk
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,9 @@
 | 
			
		||||
#!/bin/awk
 | 
			
		||||
 | 
			
		||||
BEGIN {
 | 
			
		||||
  printf "  user badname shell\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
  if (FNR >= 5 && FNR <= 10) printf "%s %s %s %s\n", FNR, $1, badname, $7;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								awk/04-aufgabe.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,3 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
awk -F ":" -f 04-aufgabe.awk /etc/passwd
 | 
			
		||||
							
								
								
									
										14
									
								
								awk/05-aufgabe.awk
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,14 @@
 | 
			
		||||
#!/bin/awk
 | 
			
		||||
 | 
			
		||||
function logical_decission(i, user, badname, shell) {
 | 
			
		||||
  if (i >= 5 && i <= 10) printf "%s %s %s %s\n", i, user, badname, shell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
BEGIN {
 | 
			
		||||
  printf " user badname shell\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
  logical_decission(FNR, $1, $5, $7)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								awk/05-aufgabe.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,3 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
awk -F ":" -f 05-aufgabe.awk /etc/passwd
 | 
			
		||||
							
								
								
									
										29
									
								
								awk/06-aufgabe.awk
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,29 @@
 | 
			
		||||
#!/bin/awk
 | 
			
		||||
 | 
			
		||||
function ltrim(s) { sub(/^[ \t\r\n]+/, "", s); return s }
 | 
			
		||||
function rtrim(s) { sub(/[ \t\r\n]+$/, "", s); return s }
 | 
			
		||||
function trim(s) { ; return rtrim(ltrim(s)); }
 | 
			
		||||
 | 
			
		||||
function validBool(s) {
 | 
			
		||||
  if (s == "ja" || s == "nein") {
 | 
			
		||||
    return "1";
 | 
			
		||||
  } else {
 | 
			
		||||
    return "0";
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
  if (FNR > 1) {
 | 
			
		||||
    if ( validBool($4) == "0" ) { next; }
 | 
			
		||||
    if ( validBool($9) == "0" ) { next; }
 | 
			
		||||
    if ( validBool($10) == "0" ) { next; }
 | 
			
		||||
    if ( validBool($15) == "0" ) { next; }
 | 
			
		||||
    if ( validBool($16) == "0" ) { next; }
 | 
			
		||||
    if ( validBool($17) == "0" ) { next; }
 | 
			
		||||
    if ( validBool($19) == "0" ) { next; }
 | 
			
		||||
    if ( validBool($21) == "0" ) { next; }
 | 
			
		||||
    if ( validBool($22) == "0" ) { next; }
 | 
			
		||||
    if ( validBool($23) == "0" ) { next; }
 | 
			
		||||
  }
 | 
			
		||||
  print trim($0)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								awk/06-aufgabe.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,3 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
cat ../csv/credit_master.csv | sed 's/"//g' | awk -F "," -f 06-aufgabe.awk > ../csv/credit_master_cleaned.csv
 | 
			
		||||
							
								
								
									
										76
									
								
								awk/07-aufgabe.awk
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,76 @@
 | 
			
		||||
#!/bin/awk
 | 
			
		||||
 | 
			
		||||
BEGIN{
 | 
			
		||||
  print "-- PostgreSQL-Statements generated by awk"
 | 
			
		||||
 | 
			
		||||
  print "";
 | 
			
		||||
 | 
			
		||||
  print "CREATE TABLE IF NOT EXISTS credit_master ("
 | 
			
		||||
  print "  lfdnr       INTEGER         PRIMARY KEY,";
 | 
			
		||||
  print "  kreditbe    NUMERIC(11,2)   NOT NULL,";
 | 
			
		||||
  print "  rsv         BOOLEAN         NOT NULL,";
 | 
			
		||||
  print "  geschlec    BOOLEAN         NOT NULL,";
 | 
			
		||||
  print "  age         NUMERIC(2)      NOT NULL,";
 | 
			
		||||
  print "  telefon     BOOLEAN         NOT NULL,";
 | 
			
		||||
  print "  kinderza    NUMERIC(2)      NOT NULL,";
 | 
			
		||||
  print "  anschrif    BOOLEAN         NOT NULL,";
 | 
			
		||||
  print "  buerge      BOOLEAN         NOT NULL,";
 | 
			
		||||
  print "  arbeitsd    NUMERIC(2)      NOT NULL,";
 | 
			
		||||
  print "  einkomme    NUMERIC(7,2)    NOT NULL,";
 | 
			
		||||
  print "  verfeink    NUMERIC(7,2)    NOT NULL,";
 | 
			
		||||
  print "  miete       NUMERIC(7,2)    NOT NULL,";
 | 
			
		||||
  print "  pkw         BOOLEAN         NOT NULL,";
 | 
			
		||||
  print "  vertraeg    BOOLEAN         NOT NULL,";
 | 
			
		||||
  print "  kredit      BOOLEAN         NOT NULL,";
 | 
			
		||||
  print "  ausgaben    NUMERIC(7,2)    NOT NULL,";
 | 
			
		||||
  print "  kunde       BOOLEAN         NOT NULL,";
 | 
			
		||||
  print "  dauerkun    INTEGER         NOT NULL,";
 | 
			
		||||
  print "  sparguth    BOOLEAN         NOT NULL,";
 | 
			
		||||
  print "  wertpapi    BOOLEAN         NOT NULL,";
 | 
			
		||||
  print "  rueckzah    BOOLEAN         NOT NULL";
 | 
			
		||||
  print ");";
 | 
			
		||||
 | 
			
		||||
  print "";
 | 
			
		||||
 | 
			
		||||
  print "INSERT INTO credit_master (";
 | 
			
		||||
  print "  lfdnr,";
 | 
			
		||||
  print "  kreditbe,";
 | 
			
		||||
  print "  rsv,";
 | 
			
		||||
  print "  geschlec,";
 | 
			
		||||
  print "  age,";
 | 
			
		||||
  print "  telefon,";
 | 
			
		||||
  print "  kinderza,";
 | 
			
		||||
  print "  anschrif,";
 | 
			
		||||
  print "  buerge,";
 | 
			
		||||
  print "  arbeitsd,";
 | 
			
		||||
  print "  einkomme,";
 | 
			
		||||
  print "  verfeink,";
 | 
			
		||||
  print "  miete,";
 | 
			
		||||
  print "  pkw,";
 | 
			
		||||
  print "  vertraeg,";
 | 
			
		||||
  print "  kredit,";
 | 
			
		||||
  print "  ausgaben,";
 | 
			
		||||
  print "  kunde,";
 | 
			
		||||
  print "  dauerkun,";
 | 
			
		||||
  print "  sparguth,";
 | 
			
		||||
  print "  wertpapi,";
 | 
			
		||||
  print "  rueckzah";
 | 
			
		||||
  print ") VALUES";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
FNR > 1 {
 | 
			
		||||
  $4 == "ja" ? $4 = "'1'" : $4 = "'0'";       # RSV
 | 
			
		||||
  $5 == "männlich" ? $5 = "'1'" : $5 = "'0'"; # geschlec
 | 
			
		||||
  $7 == "ja" ? $7 = "'1'" : $7 = "'0'";       # telefon
 | 
			
		||||
  $9 == "ja" ? $9 = "'1'" : $9 = "'0'";       # anschrif
 | 
			
		||||
  $10 == "ja" ? $10 = "'1'" : $10 = "'0'";    # buerge
 | 
			
		||||
  $15 == "ja" ? $15 = "'1'" : $15 = "'0'";    # pkw
 | 
			
		||||
  $16 == "ja" ? $16 = "'1'" : $16 = "'0'";    # vertrag
 | 
			
		||||
  $17 == "ja" ? $17 = "'1'" : $17 = "'0'";    # kredit
 | 
			
		||||
  $19 == "ja" ? $19 = "'1'" : $19 = "'0'";    # kunde
 | 
			
		||||
  $21 == "ja" ? $21 = "'1'" : $21 = "'0'";    # sparguth
 | 
			
		||||
  $22 == "ja" ? $22 = "'1'" : $22 = "'0'";    # wertpapi
 | 
			
		||||
  $23 == "ja" ? $23 = "'1'" : $23 = "'0'";    # rueckzah
 | 
			
		||||
 | 
			
		||||
  printf "(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s),\n", $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								awk/07-aufgabe.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,3 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
cat ../csv/credit_master_cleaned.csv | awk -F "," -f 07-aufgabe.awk > ../sql/credit_master_cleaned.sql
 | 
			
		||||
							
								
								
									
										201
									
								
								chapters/01-ssh.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,201 @@
 | 
			
		||||
% <#>-----------------------------------------------------------------------<#>
 | 
			
		||||
\section{SSH}%
 | 
			
		||||
\label{sec:ssh}
 | 
			
		||||
 | 
			
		||||
Genau so wie eine Anmeldung am Linux-Rechner über ein Terminal (\textit{tty}),
 | 
			
		||||
ist auch die Anmeldung eines Benutzers über das Netzwerk möglich. Das gleichnamige Programm und Protokoll \acrfull{acr:telnet} wurde durch das gleichnamige Programm und Protokoll \acrfull{acr:ssh} in laufe der Zeit ersetzt.
 | 
			
		||||
 | 
			
		||||
Beim ersten Implementierung \acrshort{acr:ssh} von wird eine unverschlüsselte
 | 
			
		||||
Verbindung zwischen den beteiligten Rechnern aufgebaut und die Identifizierung
 | 
			
		||||
des Benutzers erfolgt nur durch dessen Namen und Passwort. Beim der zweiten
 | 
			
		||||
Implementierung von \acrshort{acr:ssh}, wird eine verschlüsselte Verbindung
 | 
			
		||||
aufgebaut, die sowohl das Abhören der Login-Daten, also auch der später
 | 
			
		||||
gesendeten Daten nahezu unmöglich macht. Es wird sowohl ein rechnerspezifischer
 | 
			
		||||
Schlüssel als auch ein benutzerspezifischer Schlüssel verwendet. Zu Testzwecken
 | 
			
		||||
ist natürlich auch eine Verbindung zu dem eigenen Rechner (localhost) möglich.
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{Relevante Befehle für die weiteren Übungen}%
 | 
			
		||||
\label{sec:ssh.relevante_befehle_fuer_die_weiteren_uebungen}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textit{ssh:} Stellt eine verschlüsselte Verbindung zwischen zwei
 | 
			
		||||
  Rechnern her, über die neben der Shell auch andere Programme der
 | 
			
		||||
  \acrshort{acr:gui} angesprochen werden können.
 | 
			
		||||
  \item \textit{scp:} Ermöglicht das bidirektionale kopieren von Dateien und Verzeichnissen zwischen zwei Rechnern über eine \acrshort{acr:ssh}-Verbindung.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{Relevante Konfigurationsdateien}%
 | 
			
		||||
\label{sec:ssh.relevante_konfigurationsdateien}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={}]
 | 
			
		||||
  \item \textit{/etc/ssh/sshd\_config:} Konfigurationsdatei des
 | 
			
		||||
  \acrshort{acr:ssh}-Servers.
 | 
			
		||||
  \item \textit{/etc/ssh/ssh\_config:} Systemweite \acrshort{acr:ssh}-Client Konfiguration.
 | 
			
		||||
  \item \textit{\textasciitilde/.ssh:} Enthält Benutzerspezifische \acrshort{acr:ssh}-Client Konfigurationen und Metainformationen.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 2a:} Erkundigen Sie sich nach ihren
 | 
			
		||||
  \acrshort{acr:ssh}-Zugangsdaten der Hochschule Trier.
 | 
			
		||||
  \item \textbf{Aufgabe 2b:} Melden Sie sich mit ihren
 | 
			
		||||
  \acrshort{acr:ssh}-Zugangsdaten per \acrshort{acr:ssh} an dem Rechner
 | 
			
		||||
  \textit{ssh.hochschule-trier.de} an.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{Authentifizierungsverfahren}%
 | 
			
		||||
\label{sec:ssh.authentifizierungsverfahren}
 | 
			
		||||
 | 
			
		||||
Bei \acrshort{acr:ssh} werden asymetrische Verschlüsselungsverfahren (Public-Key
 | 
			
		||||
Verfahren) eingesetzt. Wie Sie bei der ersten Verbindung bereits festgestellt
 | 
			
		||||
haben, werden die SSH-Server durch ein Schlüsselpaar identifiziert (\textit{Sie
 | 
			
		||||
mussten den öffentlichen Schlüssel des Servers bei der ersten Verbindung
 | 
			
		||||
akzeptieren}). In einer Umgebung mit erhöhtem Sicherheitsbedarf würde man den
 | 
			
		||||
angezeigten Fingerabdruck des Schlüssels mit einem vorher über einen anderen
 | 
			
		||||
Kanal übermittelten Fingerabdruck vergleichen, um eine sichere Verbindung zu
 | 
			
		||||
einem gefälschten Server zu vermeiden.
 | 
			
		||||
 | 
			
		||||
Die akzeptierten öffentlichen Schlüssel des Servers werden zur Abwehr von
 | 
			
		||||
Man-in-the-Middle Attacken in der Datei \textit{known\_hosts} gespeichert. Diese
 | 
			
		||||
befindet sich im Unterverzeichnis \textit{.ssh} des Heimatverzeichnis des
 | 
			
		||||
Benutzers.
 | 
			
		||||
 | 
			
		||||
Solange der private Schlüssel nicht abhanden kommt und auf dritten Server
 | 
			
		||||
repliziert und konfiguriert wird, ist bei der aktuellen Protokollversion 2 keine
 | 
			
		||||
umbemerkte Man-in-the-Middle Attacke möglich. Passt der auf dem Client
 | 
			
		||||
gespeicherte öffentliche Schlüssel nicht zu dem öffentlichen Schlüssel, den der
 | 
			
		||||
Server beim Verbindungsaufbau übermittelt, wird der weitere Verbindungsaufbau
 | 
			
		||||
mit einer entsprechenden Warnung abgebrochen.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 3a:} Nachdem Sie sich das erste mal per \textit{ssh} mit
 | 
			
		||||
  dem \acrshort{acr:ssh}-Server der Hochschule Trier erfolgreich verbunden
 | 
			
		||||
  haben. Überprüfen Sie die Dateiberechtigungen für den Ordner
 | 
			
		||||
  \textit{\textasciitilde/.ssh} auf ihrer lokalen VM. Was fällt Ihnen in Vergleich zu anderen Verzeichnissen auf?
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Bisher melden Sie sich an ihrem virtuellen Server oder den der Hochschule Trier
 | 
			
		||||
mit Benutzername und Passwort an. Die Daten werden zwar verschlüsselt übertragen
 | 
			
		||||
und können daher auch nicht abgehört werden, aber ein Angreifer kann beliebig
 | 
			
		||||
viele Passwörter per Brute-Force-Attacke an ihrem oder dem Server der Hochschule
 | 
			
		||||
Trier ausprobieren. Bei schwachen Passwörtern wird es daher nicht allzu lange
 | 
			
		||||
dauern, bis ein ernsthafter Angreifer erfolg hat. Bei einer frisch in Betrieb
 | 
			
		||||
genommenen virtuellen Maschine in einem Rechenzentrum dauert es meist nur wenige
 | 
			
		||||
Stunden, bis der erste derartige Angriff erfolgt! Daher sollte man so schnell
 | 
			
		||||
wie möglich auf ein besseres Verfahren umstellen.
 | 
			
		||||
 | 
			
		||||
Ähnlich wie die Authentifizierung der Rechner kann auch die Authentifizierung
 | 
			
		||||
der Benutzer per Public-Key Verfahren konfiguriert werden. Der Benutzer, der
 | 
			
		||||
sich unter einem entfernten Benutzer anmelden möchte, muss auf seinem lokalen
 | 
			
		||||
Rechner ein Schlüsselpaar generieren und den öffentlichen Schlüssel im
 | 
			
		||||
Heimatverzeichnis des entfernt liegenden Benutzer hinzufügen. Bei einem späteren
 | 
			
		||||
Login wir dann mit Hilfe des privaten Schlüssels des Client festgestellt,
 | 
			
		||||
dass der Anfragende tatsächlich der berechtigte Benutzer ist.
 | 
			
		||||
 | 
			
		||||
Die Schlüssel werden ebenfalls im Verzeichnis \textit{\textasciitilde/.ssh}
 | 
			
		||||
gespeichert. Ändert man bei der Erzeugung des Schlüsselpaares den dazugehörigen
 | 
			
		||||
Dateinamen, muss dieser bei jeder Verwendung angegeben werden! Alternativ kann
 | 
			
		||||
auch die Konfigurationsdatei \textit{\textasciitilde/.ssh/config} erstellt
 | 
			
		||||
werden, um dort den zugehörigen Schlüssel explizit anzugeben. Das Schlüsselpaar
 | 
			
		||||
kann optional mit einer Passphrase (Passwort) gesichert werden, falls man jedoch
 | 
			
		||||
automatische Logins z.B. für Backups wünscht, sollte man auf diese zusätzliche
 | 
			
		||||
Sicherung verzichten.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 3b:} Generieren Sie für ihren lokalen Benutzer eine
 | 
			
		||||
  Schlüsselpaar mit dem \textit{ed25519} Algorithmus. Der Befehl \textit{ssh-keygen}
 | 
			
		||||
  erzeugt Schlüsselpaare. Informieren Sie sich über \textit{ssh-keygen} per \textit{man ssh-keygen}.
 | 
			
		||||
  \item \textbf{Aufgabe 3c:} Ermitteln Sie mit Hilfe der man-page via
 | 
			
		||||
  \textit{man ssh-keygen} den Namen der Datei, in der der öffentliche Schlüssel
 | 
			
		||||
  auf dem entfernten Rechner hinterlegt werden muss.
 | 
			
		||||
  \item \textbf{Aufgabe 3d:} Mit dem Befehl \textit{scp} können Dateien über ein
 | 
			
		||||
  \acrshort{acr:ssh}-Tunnel von einem Rechner zu einem anderen kopiert werden.
 | 
			
		||||
  Die Syntax lautet: \textit{scp quelle ziel}. Beide Adressen enthalten einen
 | 
			
		||||
  Pfad an dem die Ressourcen zu finden bzw. zu kopieren sind. Nur die entfernte
 | 
			
		||||
  Adresse benötigt zusätzlich noch weitere Informationen wie Benutzername und
 | 
			
		||||
  Rechnername bzw. IP des entfernten Systems. Die Adresse würde folgendem Schema
 | 
			
		||||
  entsprechen \textit{user@rechner:pfad}. Kopieren Sie mit Hilfe von
 | 
			
		||||
  \textit{scp} ihren öffentlichen Schlüssel in das Heimatverzeichnis ihres
 | 
			
		||||
  entfernten Benutzers.
 | 
			
		||||
  \item \textbf{Aufgabe 3e:} Der kopierte Schlüssel auf dem entfernten System
 | 
			
		||||
  muss der Datei aus Aufgabe 3c hinzugefügt werden.
 | 
			
		||||
  \item \textbf{Aufgabe 3f:} Nachdem der öffentliche Schlüssel erfolgreich
 | 
			
		||||
  kopiert und konfiguriert wurde, öffnen Sie eine zweite
 | 
			
		||||
  \acrshort{acr:ssh}-Verbindung ohne Eingabe des Passworts.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{Absicherung des SSH-Servers}%
 | 
			
		||||
\label{sec:ssh.absicherung_des_ssh-servers}
 | 
			
		||||
 | 
			
		||||
Nachdem die Authentifizierung mit dem Public-Key-Verfahren erfolgreich getestet
 | 
			
		||||
wurde, kann im nächsten Schritt die unsichere Passwort-Authentifizierung auf dem
 | 
			
		||||
Server abgeschaltet werden. Dabei ist zu beachten, dass bei einem Neustart des
 | 
			
		||||
\acrshort{acr:ssh}-Servers bestehende Verbindungen gehalten werden. Vor dem
 | 
			
		||||
Logout sollte daher nach einer Konfigurationsänderung immer getestet werden, ob
 | 
			
		||||
der Login noch möglich ist. Falls man sich bei dieser Gelegenheit selbst vom
 | 
			
		||||
Server aussperrt, sind "Helping Hands" vom Provider meist nicht billig zu haben.
 | 
			
		||||
 | 
			
		||||
\begin{info-popup}
 | 
			
		||||
  Dies ist für den Server \textit{ssh.hochschule-trier.de} nicht möglich, mangels
 | 
			
		||||
  Berechtigungen. Führen Sie daher die Abschaltung an ihrem lokalen \acrshort{acr:ssh}-Server
 | 
			
		||||
  durch.
 | 
			
		||||
\end{info-popup}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 4a:} Wie heißt der Eintrag in der Konfigurationsdatei
 | 
			
		||||
  des Server, mit dem der Zugang für den Benutzer \textit{root} eingestellt
 | 
			
		||||
  werden kann? Genaueres Betrachten der Konfigurationsdatei sollte schon zum
 | 
			
		||||
  Ergebnis führen.
 | 
			
		||||
  \item \textbf{Aufgabe 4b:} Stellen Sie diesen Eintrag so ein, dass für
 | 
			
		||||
  \textit{root} nur noch der Zugang per Public-Key-Authentifizierung möglich
 | 
			
		||||
  ist. Lesen Sie die Dokumentation für weitere Informationen.
 | 
			
		||||
  \item \textbf{Aufgabe 4c:} Mit welchem Konfigurationswert kann das Verhalten
 | 
			
		||||
  aus Aufgabe 4b auch für normale Benutzer erreicht werden? Informieren Sie sich
 | 
			
		||||
  auch hier über die Dokumentation.
 | 
			
		||||
  \item \textbf{Aufgabe 4d:} Stellen Sie das Verhalten so ein, dass für normale
 | 
			
		||||
  Benutzer nur noch Zugang per Public-Key-Authentifizierung möglich ist.
 | 
			
		||||
  \item \textbf{Aufgabe 4e:} Nach dem Speichern dieser Änderungen muss der
 | 
			
		||||
  \acrshort{acr:ssh}-Dienst mit \textit{systemctl restart ssh} neu gestartet werden
 | 
			
		||||
  \item \textbf{Aufgabe 4f:} Testen Sie die korrekte Funktionsfähigkeit dieser
 | 
			
		||||
  Änderung mir einer zweiten \acrshort{acr:ssh}-Verbindung.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{Client-Konfiguration}%
 | 
			
		||||
\label{sec:ssh.client-konfiguration}
 | 
			
		||||
 | 
			
		||||
Da Sie nun den Server erfolgreich auf Public-Key-Authentifizierung umgestellt
 | 
			
		||||
haben, kann im nächsten Schritt die \acrshort{acr:ssh}-Client Konfiguration
 | 
			
		||||
angepasst werden. Dazu ist die Datei \textit{\textasciitilde/.ssh/config}
 | 
			
		||||
notwendig. Der \acrshort{acr:ssh}-Client liest die Datei ein und setzt die
 | 
			
		||||
Konfiguration, welcher für den Verbindungsaufbau notwendig ist, rekursiv
 | 
			
		||||
abhängig von dem DNS-Namen, zusammen.
 | 
			
		||||
 | 
			
		||||
Möchte man Beispielsweise eine Verbindung zu \textit{verwaltung.example.local}
 | 
			
		||||
aufbauen. Werden zuerst alle Konfigurationsoptionen, welche für
 | 
			
		||||
\textit{verwaltung.example.local} definiert wurden, angewendet. Als nächstes
 | 
			
		||||
sucht der \acrshort{acr:ssh}-Client nach Konfigurationsoptionen, welche für
 | 
			
		||||
\textit{*.example.local} definiert wurden, anschließend für \textit{*.local} und
 | 
			
		||||
zum Schluss für \textit{*}. Konfigurationsoptionen, welche einmal definiert
 | 
			
		||||
wurden, können nicht mehr durch andere Optionen, welche in einem höhren
 | 
			
		||||
Scope definiert wurden, übersteuert werden.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={}]
 | 
			
		||||
  \item \textbf{Aufgabe 5a:} Erstellen Sie die Datei
 | 
			
		||||
  \textit{\textasciitilde/.ssh/config} und setzen Sie die entsprechenden
 | 
			
		||||
  Berechtigungen.
 | 
			
		||||
  \item \textbf{Aufgabe 5b:} Erstellen Sie einen Eintrag in der Konfiguration
 | 
			
		||||
  für alle Verbindungen. Definieren Sie dort, welcher Schlüssel zur
 | 
			
		||||
  Authentifizierung verwendet werden soll.
 | 
			
		||||
  \item \textbf{Aufgabe 5c:} Erstellen Sie einen Eintrag in der Konfiguration
 | 
			
		||||
  für alle Verbindungen, welche gegen die Domain \textit{*.hochschule-trier.de}
 | 
			
		||||
  aufgebaut werden. Für die Domain \textit{*.hochschule-trier.de} soll der Port
 | 
			
		||||
  22 verwendet werden. Die Authentifizierung per Passwort und der Verbindungsaufbau
 | 
			
		||||
  über IPv6 soll nicht verwendet werden.
 | 
			
		||||
  \item \textbf{Aufgabe 5d:} Erstellen Sie einen Eintrag in der Konfiguration
 | 
			
		||||
  für die Verbindung \textit{ssh.hochschule-trier.de}. Geben Sie dort den
 | 
			
		||||
  Benutzernamen an unter welchen Sie sich anmelden möchten.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
							
								
								
									
										208
									
								
								chapters/02-dns.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,208 @@
 | 
			
		||||
% <#>-----------------------------------------------------------------------<#>
 | 
			
		||||
\section{DNS}%
 | 
			
		||||
\label{sec:dns}
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{Aufbau des DNS}%
 | 
			
		||||
\label{sec:dns.aufbau}
 | 
			
		||||
 | 
			
		||||
Die Adressierung der Rechner in IP-basierten Netzen erfolgt über die IP-Adresse
 | 
			
		||||
des angesprochenen Rechners. Da der Mensch sich Nummernfolgen schlecht merken
 | 
			
		||||
kann, wurde schon früh eine Ersetzung der Nummern durch Namen auf der
 | 
			
		||||
Benutzerschnittstelle eingeführt. Die ursprüngliche Zuordnungsmethode wird auch
 | 
			
		||||
heute noch in kleinen Netzen angewendet: jeder Rechner im Netz verfügt über eine
 | 
			
		||||
Datei mit zuordnungen von Namen zu Nummern. Unter Unix-artigen Betriebssystemen
 | 
			
		||||
ist dies die Datei \textit{/etc/hosts}.
 | 
			
		||||
 | 
			
		||||
\begin{verbatim}
 | 
			
		||||
127.0.0.1       localdomain.localhost localhost
 | 
			
		||||
::1             localdomain.localhost localhost
 | 
			
		||||
\end{verbatim}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 1a:} Überprüfen Sie ihre \textit{hosts} Datei, ob dort
 | 
			
		||||
  abweichende Zuordungen zu der obrigen Ausgabe definiert sind
 | 
			
		||||
  \item \textbf{Aufgabe 1b:} Welche Website wird ihnen im Browser dargestellt,
 | 
			
		||||
  wenn Sie den folgenden Eintrag in die Datei \textit{hosts} aufnehmen und per
 | 
			
		||||
  Browser die Seite \textit{hello-world.local} aufrufen? \texttt{198.145.29.83
 | 
			
		||||
  hello-world.local}
 | 
			
		||||
  \item \textbf{Aufgabe 1b:} In welchem Pfad findet man die entsprechende Datei
 | 
			
		||||
  in Windows Systemen?
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Dieses Verfahren der Namensauflösung führt in großen Netzwerken schnell zu
 | 
			
		||||
Problemen. Alle beteiligten Rechner benötigen in ihrer Version der Datei die
 | 
			
		||||
Zuordnungen aller Rechner, was die zentrale Verwaltung der Zuordnungen schnell
 | 
			
		||||
sehr aufwändig macht. Als Folge dieser Erkenntnis wurde das \acrfull{acr:dns}
 | 
			
		||||
entwickelt, das eine verteile Datenbank darstellt, bei der einzelne Server für
 | 
			
		||||
genau beschriebene Teilbereiche verantwortlich sind.
 | 
			
		||||
 | 
			
		||||
Den Namensraum im Internet ist hierarchisch gegliedert, ausgehend von der
 | 
			
		||||
höchsten Ebene, den sog. \acrfullpl{acr:tld}, können viele untergeordnete Ebenen
 | 
			
		||||
(Domains) eingefügt werden. Da die Internet-Entwicklung in den USA begann,
 | 
			
		||||
teilten die ersten \acrshortpl{acr:tld} den amerikanischen Netzbereich auf (z.B.
 | 
			
		||||
com, edu und org). Später kamen dann weitere \acrshortpl{acr:tld} für jedes Land
 | 
			
		||||
hinzu, die den genormten Länderkürzeln entprechen (ISO 3166), beispielsweise be,
 | 
			
		||||
de, nl usw. In der jüngsten Entwicklung wurden weitere allgemeine
 | 
			
		||||
\acrshortpl{acr:tld} hinzugefügt. Beispielsweise info, firm, museum, movie und
 | 
			
		||||
berlin.
 | 
			
		||||
 | 
			
		||||
Bei Domänennamen wird die Groß- und Kleinschreibung nicht beachtet, \textbf{edu}
 | 
			
		||||
und \textbf{EDU} bedeuten das gleiche. Einzelne Teil-Domainnamen dürfen maximal
 | 
			
		||||
63 Zeichen lang sein, der vollständige Domainname, \acrfull{acr:fqdn}, darf
 | 
			
		||||
nicht länger als 255 Zeichen sein. Für die Genehmigung eines neuen Domainnamens
 | 
			
		||||
ist die Verwaltung der nächst höheren Domain zuständig, für die Root-Zone und
 | 
			
		||||
damit die \acrshortpl{acr:tld} ist dies die \acrfull{acr:icann}.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 2a:} Für welche Verwaltungsmaßnahmen ist die
 | 
			
		||||
  \acrshort{acr:icann} verantwortlich? Nutzen Sie die Internetpräsenz der
 | 
			
		||||
  \acrshort{acr:icann}, um die Frage zu beantworten.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{Betrieb einer Domain}%
 | 
			
		||||
\label{sec:dns.betrieb_einer_domain}
 | 
			
		||||
 | 
			
		||||
Für jede offiziell registrierte Domain müssen mindestens zwei DNS-Server
 | 
			
		||||
eingerichtet werden, die in unterschiedlichen Subnetzen stehen müssen. Einer
 | 
			
		||||
dieser Server wird dann als Primary, der andere als Replica betrieben.
 | 
			
		||||
Änderungen müssen dann nur noch am Primary vorgenommen werden, der oder die
 | 
			
		||||
Replicas werden durch den Primary über die Änderungen informiert, worauf ein
 | 
			
		||||
Zonentransfer der Daten vom Replica veranlast wird.
 | 
			
		||||
 | 
			
		||||
Sucht ein Rechner die IP-Nummer zu einem Namen, wird er zuest den DNS-Server,
 | 
			
		||||
der voreingestellt ist, befragen. Dies ist meist der Server der eigenen Domain
 | 
			
		||||
bzw. des eigenen Providers. Für Heimnetzwerke stellt beispielsweise der Router
 | 
			
		||||
einen DNS-Server bereit. Hat dieser Server den gewünschten Datensatz in seiner
 | 
			
		||||
Datenbank, so kann er die Anfrage sofort beantworten (Authorative Answer). Ist
 | 
			
		||||
der Datensatz nicht vorhanden, kann je nach Konfiguration ein Server aus einer
 | 
			
		||||
höheren Ebene befragt werden, der dann den zuständigen Server kennt oder
 | 
			
		||||
seinerseits die Anfrage wieder nach oben weiterreicht. Der Server kann jedoch
 | 
			
		||||
auch als Antwort dem Client mitteilen, welchen Server er fragen soll, um seine
 | 
			
		||||
Anfrage zu beantworten. Jeder DNS-Server muss mindestens die DNS-Server seiner
 | 
			
		||||
direkt untergeordneten Domains kennen, um Anfragen hierfür weiterreichen zu
 | 
			
		||||
können und er muss die Adressen aller Root-Server kennen.
 | 
			
		||||
 | 
			
		||||
Für die Verwaltung des Namesraums wird dieser in Zonen aufgeteilt. Ein
 | 
			
		||||
DNS-Server kann für eine oder mehrere DNS-Zonen verantwortlich sein. Es gibt
 | 
			
		||||
üblicherweise Zonen für die Vorwärtsauflösung (Forward Lookup) und
 | 
			
		||||
Rückwärtsauflösung (Reverse Lookup). Vorwärtsauflösung bedeutet, dass für einen
 | 
			
		||||
gegebenen Rechnernamen eine IP-Adresse gesucht wird. Rückwärtsauflösung bedeutet
 | 
			
		||||
dementsprechend, dass für eine gegebene IP-Adresse ein Rechnername gesucht wird.
 | 
			
		||||
Für jede Zone werden die Informationen als sogenannte \acrfullpl{acr:rr}
 | 
			
		||||
gespeichert. Dies sind die gängigen \acrshortpl{acr:rr}:
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[itemsep=0pt]
 | 
			
		||||
  \item[\textbf{\acrshort{acr:soa}}] \acrfull{acr:soa} markiert den Start einer
 | 
			
		||||
  DNS-Zone mit verschiedenen allgemeinen Informationen
 | 
			
		||||
  \item[\textbf{A}] Enthält die IPv4-Adresse zu einem gegebenen Rechnernamen
 | 
			
		||||
  \item[\textbf{AAAA}] Enthält die IPv6-Adresse zu einem gegebenen Rechnernamen
 | 
			
		||||
  \item[\textbf{NS}] Enthält den Rechnernamen eines für die Domain
 | 
			
		||||
  verantwortlichen DNS-Servers. Darf nicht auf einen \textit{CNAME} Eintrag
 | 
			
		||||
  verweisen!
 | 
			
		||||
  \item[\textbf{MX}] Enthält die Prioritätsangabe und den Rechnernamen eines
 | 
			
		||||
  zuständigen Mailservers. Darf nicht auf einen \textit{CNAME} Eintrag
 | 
			
		||||
  verweisen!
 | 
			
		||||
  \item[\textbf{PTR}] Enthält den Rechnernamen zu einer gegebenen IP-Adresse
 | 
			
		||||
  (IPv4 oder IPv6)
 | 
			
		||||
  \item[\textbf{SSHFP}] Enthält den Fingerabdruck des privaten SSH-Schlüssels,
 | 
			
		||||
  welcher auf dem jeweiligen Rechner beim Verbindungsaufbau abgefragt und
 | 
			
		||||
  überprüft wird. Ein Vergleich der Fingerabdrücke aus dem DNS mit dem, welcher
 | 
			
		||||
  der entfernte Server anbietet, deckt so einen möglichen Man-in-Middle Angriff
 | 
			
		||||
  auf.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Clientseitig können die Programme \textbf{dig}, \textbf{resolvectl},
 | 
			
		||||
\textbf{nslookup} und \textbf{host} zur Abfrage verwendet werden. Diese Abfragen
 | 
			
		||||
werden normalerweise über das Transportprotokoll UDP abgewickelt und sind an den
 | 
			
		||||
Port 53 gerichtet.
 | 
			
		||||
 | 
			
		||||
Lesen Sie die Dokumentation eines der oben genannten Programme oder informieren
 | 
			
		||||
Sie sich im Internet, um folgende Fragen zu beantworten:
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 2a:} Wann wird bei DNS das Transportprotokoll TCP eingesetzt?
 | 
			
		||||
  \item \textbf{Aufgabe 2b:} Fragen Sie mit Hilfe eines der oben genannten
 | 
			
		||||
  Programme den \acrshort{acr:rr} \textit{SSHFP} der Domain
 | 
			
		||||
  \textit{pontos.cryptic.systems} ab. Welche Informationen werden zurück
 | 
			
		||||
  gegeben?
 | 
			
		||||
  \item \textbf{Aufgabe 2c:} Welche DNS-Server sind für die DNS-Zone
 | 
			
		||||
  \textit{cryptic.systems} verantwortlich?
 | 
			
		||||
  \item \textbf{Aufgabe 2c:} Welcher der DNS-Server ist für die Zone
 | 
			
		||||
  \textit{cryptic.systems} der Primary und welcher der Replica DNS-Server?
 | 
			
		||||
  \item \textbf{Aufgabe 2d:} Welche Mail-Server sind für die Zone
 | 
			
		||||
  \textit{cryptic.systems} verantwortlich?
 | 
			
		||||
  \item \textbf{Aufgabe 2e:} Welcher Mail-Server wird zur Zustellung von E-Mails
 | 
			
		||||
  für die DNS-Zone \textit{cryptic.systems} privorisiert?
 | 
			
		||||
  \item \textbf{Aufgabe 2f:} Welcher DNS-Name steht hinter der IP-Adresse
 | 
			
		||||
  \textit{45.9.61.170}?
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{Konfiguration des Clients}%
 | 
			
		||||
\label{sec:dns.konfiguration_des_clients}
 | 
			
		||||
 | 
			
		||||
Für die Namensauflösung auf der Seite des Clients ist der \textbf{Resolver}
 | 
			
		||||
verantwortlich, welcher von den Anwendungsprogrammen bei Bedarf automatisch
 | 
			
		||||
aufgerufen wird. Die Konfiguration erfolgt in Unix-Systemen über die Datei
 | 
			
		||||
\textit{/etc/resolv.conf}. Die wichtigsten Einträge in dieser Datei sind
 | 
			
		||||
\textit{domain} und \textit{nameserver}.
 | 
			
		||||
 | 
			
		||||
Immer seltener muss die Datei \textit{/etc/resolv.conf} manuell gepflegt werden.
 | 
			
		||||
Programme bzw. Dienste wie Beispielsweise der \textit{network-manager} oder
 | 
			
		||||
\textit{systemd-resolved} erstellen die Datei automatisch anhand der
 | 
			
		||||
Informationen, welche Sie per DHCP erhalten haben. Ändert man direkt den Inhalt
 | 
			
		||||
der Datei, kann dies dazu führen, dass das Programm oder der Dienst die
 | 
			
		||||
Einstellungen wieder überschreibt. Dem Programm bzw. dem Dienst muss daher
 | 
			
		||||
direkt mitgeteilt werden, welchen DNS-Server bzw. Domain der Rechner angehört,
 | 
			
		||||
um ein überschreiben zu vermeiden.
 | 
			
		||||
 | 
			
		||||
Mit dem Eintrag \textit{domain} wird festgelegt, welcher Domainname
 | 
			
		||||
standardmäßig an unvollständige Namen angehängt wird, bevor die Anfrage
 | 
			
		||||
abgesendet wird. Als unvollständig werden in der Regel Namen betrachtet, die
 | 
			
		||||
keinen Punkt enthalten. Es kann hier eine Liste mehrere Domainnamen angegeben
 | 
			
		||||
werden.
 | 
			
		||||
 | 
			
		||||
Mit dem Eintrag \textit{nameserver} wird angegeben, welcher DNS-Server für eine
 | 
			
		||||
Anfrage angesprochen wird. Zu Erhöhung der Redundanz ist es möglich, mehrere
 | 
			
		||||
Einträge dieser Art vorzunehmen. Ist der erste DNS-Server nicht erreichbar, wird
 | 
			
		||||
der nächste aus der Liste gefragt.
 | 
			
		||||
 | 
			
		||||
Die Datei \textit{/etc/nsswitch.conf} ist eine weitere Konfigurationsdatei aus
 | 
			
		||||
dem Bereich der Namensauflösung, in der eingestellt wird, in welcher Reihenfolge
 | 
			
		||||
interne und externe Quellen für die Namensauflösung verwendet werden. Wenn
 | 
			
		||||
folgende Zeile enthalten ist, wird zuerst in der lokalen Datei
 | 
			
		||||
\textit{/etc/hosts} gesucht. Wird dort kein passender Eintrag gefunden, wird das
 | 
			
		||||
DNS abfragt.
 | 
			
		||||
 | 
			
		||||
\begin{verbatim}
 | 
			
		||||
  hosts:    files dns
 | 
			
		||||
\end{verbatim}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 3a:} In Kapitel \ref{sec:network} haben Sie erfolgreich
 | 
			
		||||
  \textit{systemd-networkd} konfiguriert. Passen Sie ihre Konfiguration so an,
 | 
			
		||||
  dass primär der DNS-Server \textit{8.8.8.8} und sekundär der DNS-Server
 | 
			
		||||
  \textit{8.8.4.4} für ihren Netzwerkadapter verwendet wird.
 | 
			
		||||
  \item \textbf{Aufgabe 3b:} Überprüfen Sie die Konfiguration mit dem Aufruf von
 | 
			
		||||
  \textit{resolvectl}. Beide DNS-Server sollten unter Ihrem Netzwerkadapter
 | 
			
		||||
  gelistet und zusätzlich in der Datei \textit{/etc/resolv.conf} aufgeführt
 | 
			
		||||
  sein.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{Einstellen des Rechnernamens}%
 | 
			
		||||
\label{sec:dns.einstellen_des_rechnernamens}
 | 
			
		||||
 | 
			
		||||
Der Rechnername ist in der Datei \textit{/etc/hostname} gespeichert. Nach
 | 
			
		||||
Änderung der Datei ist es sinnvoll, den Rechner neu zu starten, um die Änderung
 | 
			
		||||
allen Diensten bekannt zu machen.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 4a:} Ändern Sie den Rechnernamen ab und starten Sie das System neu
 | 
			
		||||
  \item \textbf{Aufgabe 4b:} Nutzen Sie eines der Programme zur Namensauflösung,
 | 
			
		||||
  um die IP-Adresse ihres Rechners anhand des neuen Rechnernamens durch den im
 | 
			
		||||
  lokalen Netzwerk befindlichen DNS-Server auflösen zu lassen. Überprüfen Sie,
 | 
			
		||||
  ob die IP-Adresse mit der IP-Adresse ihrer Netzwerkkarte übereinstimmt.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
							
								
								
									
										274
									
								
								chapters/03-network.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,274 @@
 | 
			
		||||
% <#>-----------------------------------------------------------------------<#>
 | 
			
		||||
\section{Netzwerk}%
 | 
			
		||||
\label{sec:network}
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{Netzwerkkonfiguration}%
 | 
			
		||||
\label{sec:netzwerk.konfiguration}
 | 
			
		||||
 | 
			
		||||
Bei der Installation des Basis-Systems (Fedora Server Edition) wird das Paket
 | 
			
		||||
\textbf{network-manager} installiert. Dieses Paket ist für die einfache und
 | 
			
		||||
weitgehend automatische Netzwerk-Konfiguration auf Endbenutzer-Systemen
 | 
			
		||||
entwickelt worden. Daher ist es auf Serversystemen, bei denen eine statische
 | 
			
		||||
Adressvergabe oder es zu komplexen Netzwerkstrukturen kommen kann,
 | 
			
		||||
kontraproduktiv.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 1a:} Stellen Sie mit dem Befehl \textit{yum list
 | 
			
		||||
  installed} fest, ob das Paket mit dem Namensbestandteil
 | 
			
		||||
  \textbf{network-manager} installiert ist.
 | 
			
		||||
  \item \textbf{Aufgabe 1b:} Falls Sie hierbei fündig geworden sind, stoppen und
 | 
			
		||||
  deaktivieren Sie den Dienst \textit{NetworkManager} per \textit{systemctl} und
 | 
			
		||||
  \dots
 | 
			
		||||
  \item \textbf{Aufgabe 1c:} überprüfen Sie mithilfe von \textit{systemctl}, ob
 | 
			
		||||
  der Dienst \textit{NetworkManager} gestoppt und deaktiviert ist.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Nachdem Sie den Dienst \textit{NetworkManager} entfernt haben, stellen Sie
 | 
			
		||||
mithilfe von \textit{systemd} die Netzwerkkonfiguration ein und erstellen ggfl.
 | 
			
		||||
notwendige virtuelle Netzwerkkarten. \textit{systemd} unterteilt die
 | 
			
		||||
Netzwerkkonfiguration in drei unterschiedliche Dienste:
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textit{systemd-networkd:} Erstellt virtuelle Netzwerkkarten und richtet
 | 
			
		||||
  diese als auch physische ein. Dadurch ist die Zuweisung einer dynamischen per
 | 
			
		||||
  \acrshort{acr:dhcp} oder statischen IP-Adresse möglich.
 | 
			
		||||
  \item \textit{systemd-resolved:} Kümmert sich um die Namensauflösung per
 | 
			
		||||
  \acrshort{acr:dns}.
 | 
			
		||||
  \item \textit{systemd-timesyncd:} Richtet die Uhrzeit mithilfe des
 | 
			
		||||
  \acrfull{acr:ntp} auf dem System ein.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Die Dienste \textit{systemd-resolved} und \textit{systemd-timesyncd} rufen
 | 
			
		||||
notwendige Informationen von anderen Diensten auf dem System ab. Ein anpassen
 | 
			
		||||
des Standardverhaltens ist hier nicht notwendig.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 1d:} Starten und aktivieren Sie die beiden Dienste
 | 
			
		||||
  mithilfe des Befehls \textit{systemctl}.
 | 
			
		||||
  \item \textbf{Aufgabe 1e:} Überprüfen Sie, ob die Dienste als \textit{active
 | 
			
		||||
  (running)} markiert sind.
 | 
			
		||||
  \item \textbf{Aufgabe 1f:} Zusätzlich überprüfen Sie, ob die Dienste auch als
 | 
			
		||||
  \textit{enabled} markiert sind, sodass diese bei einem erneusten Systemstart
 | 
			
		||||
  ausgeführt werden.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Die Netzwerkkonfiguration per \textit{systemd} wird über die unterschiedlichen
 | 
			
		||||
Dateiendungen \textit{.netdev} und \textit{.network} im Verzeichnis
 | 
			
		||||
\textit{/etc/systemd/network} geregelt.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 1g:} Rufen Sie die Dokumentation von
 | 
			
		||||
  \href{https://www.freedesktop.org/software/systemd/man/systemd.network.html}{systemd.network}
 | 
			
		||||
  und
 | 
			
		||||
  \href{https://www.freedesktop.org/software/systemd/man/systemd.netdev.html}{systemd.netdev}
 | 
			
		||||
  auf und erklären Sie den Unterschied der beiden Konfigurationsdateien
 | 
			
		||||
  \textit{.netdev} und \textit{.network}.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Mit dem Befehl \textit{ip link show} werden alle Netzwerkkarten, welches Ihr
 | 
			
		||||
System kennt ausgegeben.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ ip link show
 | 
			
		||||
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
 | 
			
		||||
  link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 | 
			
		||||
2: enp1s0: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
 | 
			
		||||
  link/ether 52:54:00:b3:95:e4 brd ff:ff:ff:ff:ff:ff
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Das System, auf dem der Befehl ausgeführt wurde, kennt zwei Netzwerkadapter. Mit
 | 
			
		||||
dem Index 1 ist das \textit{loopback device} \textbf{lo} aufgeführt. Über das
 | 
			
		||||
\textit{loopback device} können Dienste, welche auf dem lokalen System
 | 
			
		||||
ausgeführt werden, per Netzwerk sich selbst oder andere Dienste adressieren bzw.
 | 
			
		||||
zugreifen. Dies ist durch die IP-Adresse \textit{127.0.0.1} oder den DNS-Namen
 | 
			
		||||
\textit{localhost} möglich.
 | 
			
		||||
 | 
			
		||||
Vorteil des \textit{loopback device} ist es, dass die Netzwerkpakete nicht den
 | 
			
		||||
Rechner verlassen. Dadurch wird unnötiger Netzwerkverkehr, welcher über das
 | 
			
		||||
physische Netzwerk geleitet wird, vermieden.
 | 
			
		||||
 | 
			
		||||
Mit dem Index 2 wird der Netzwerkadapter \textbf{enp1s0} geführt. Dieser besitzt
 | 
			
		||||
die MAC-Adresse \textit{52:54:00:b3:95:e4}. Der Netzwerkadapter ist als inaktiv
 | 
			
		||||
bzw. ausgeschaltet markiert. Dies kann durch die Information \textit{state DOWN}
 | 
			
		||||
entnommen werden. Dieser ist nicht konfiguriert und besitzt auch keine
 | 
			
		||||
IP-Adresse.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 1h:} Ermitteln Sie ihren Netzwerkadapter, welcher nicht
 | 
			
		||||
  konfiguriert wurde. Überprüfen Sie mit dem Befehl \textit{ip address show}, ob
 | 
			
		||||
  ihr Netzwerkadapter eine IP-Adresse zugewiesen wurde.
 | 
			
		||||
  \item \textbf{Aufgabe 1i:} Schauen Sie sich in der Dokumentation zu
 | 
			
		||||
  \href{https://www.freedesktop.org/software/systemd/man/systemd.network.html}{systemd.network}
 | 
			
		||||
  die Beispielkonfigurationen an und erstellen Sie für ihren Netzwerkadapter
 | 
			
		||||
  eine passende Konfiguration.
 | 
			
		||||
 | 
			
		||||
  Falls Sie die Konfiguration ihres lokalen Netzwerks nicht kennen, um ihrem
 | 
			
		||||
  System eine statische IP-Adresse zu zuweisen, verwenden Sie
 | 
			
		||||
  \acrshort{acr:dhcp}.
 | 
			
		||||
  \item \textbf{Aufgabe 1j:} Starten und aktivieren Sie den Dienst
 | 
			
		||||
  \textit{systemd-networkd} mithilfe von \textit{systemctl}.
 | 
			
		||||
  \item \textbf{Aufgabe 1k:} Überprüfen Sie, ob der Dienst als \textit{active
 | 
			
		||||
  (running)} markiert ist und \dots
 | 
			
		||||
  \item \textbf{Aufgabe 1l:} ob dieser als \textit{enabled} markiert ist.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{Routing}%
 | 
			
		||||
\label{sec:netzwerk.routing}
 | 
			
		||||
 | 
			
		||||
Das \acrfull{acr:ip} ist auf Schicht 3 des OSI-Modells angesiedelt. Es dient der
 | 
			
		||||
Strukturierung von großen Netzwerken, d.h der Aufteilung dieser Netze in
 | 
			
		||||
übersichtliche Teilnetze und der Verbindung dieser Teilnetze. \acrshort{acr:ip}
 | 
			
		||||
ist für die Vermittlung eines Weges, einer Route, zwischen zwei
 | 
			
		||||
Kommunikationspartnern zuständig. Diese Route muss auch über mehrere Teilnetze
 | 
			
		||||
hinweg gefunden werden. Die Verbindungspunkte zwischen Netzen werden als Router
 | 
			
		||||
oder Gateway bezeichnet.
 | 
			
		||||
 | 
			
		||||
Jeder Rechner, auch solche, die keine Routingfunktion haben, muss Informationen
 | 
			
		||||
zur Wegefindung im Netz speichern. Dies geschieht bei jedem
 | 
			
		||||
\acrshort{acr:ip}-fähigen Betriebssystem in einer Routingtabelle, die statisch
 | 
			
		||||
oder dynamisch verwaltet werden kann. In einem Maschennetz wie dem Internet ist
 | 
			
		||||
eine dynamische Verwaltung sinnvoll, da so die Wegewahl der aktuellen
 | 
			
		||||
Belastungssituation auf den verschiedenen Wegen angepasst werden kann. Auch bei
 | 
			
		||||
Ausfall einer Verbindung kann so automatisch eine Ersatzroute konfiguriert
 | 
			
		||||
werden. Bei einfachen Netzverbünden ohne Maschenstruktur wird statisches Routing
 | 
			
		||||
verwendet, was auch ohne Zusatzsoftware von den üblichen Betriebssystemen
 | 
			
		||||
geleistet werden kann.
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsubsection{Einfache Netze}%
 | 
			
		||||
\label{sec:netzwerk.routing.einfache-netze}
 | 
			
		||||
 | 
			
		||||
Selbst in \acrshort{acr:ip}-Netzen ohne Anbindung an andere Netze besitzt jeder
 | 
			
		||||
Rechner eine statische Routingtabelle in minimaler Größe. Die Tabelle enthält
 | 
			
		||||
mehrere Informationen, die wichtigsten sind in den ersten Spalten festgehalten.
 | 
			
		||||
Darunter wird das Zielnetzwerk, die verwendete Schnittstelle und das verwendete
 | 
			
		||||
Gateway aufgeführt. In diesem einfachsten Fall bleibt die Spalte für das Gateway
 | 
			
		||||
leer und es gibt nur einen Eintrag in jeder Tabelle. Diese minimale
 | 
			
		||||
Routingtabelle wird bei allen Betriebssystem mit der normalen
 | 
			
		||||
Netzwerkkonfiguration automatisch erstellt.
 | 
			
		||||
 | 
			
		||||
\begin{table}[H]
 | 
			
		||||
  \footnotesize
 | 
			
		||||
  \centering
 | 
			
		||||
  \begin{tabularx}{17cm}{p{2.6cm}|p{2.6cm}|p{1.9cm}||p{2.6cm}|p{2.6cm}|p{1.9cm}}
 | 
			
		||||
    \multicolumn{3}{c||}{\textbf{PC}}                     & \multicolumn{3}{c}{\textbf{Laptop}}                   \\
 | 
			
		||||
    \hline
 | 
			
		||||
    Zielnetz            & Netzwerkadapter & Gateway       & Zielnetz            & Netzwerkadapter & Gateway       \\
 | 
			
		||||
    \hline\hline
 | 
			
		||||
    192.168.178.0/24    & enp1s0          & -             & 192.168.178.0/24    & wlp5s1          & -             \\
 | 
			
		||||
  \end{tabularx}
 | 
			
		||||
\end{table}
 | 
			
		||||
 | 
			
		||||
\begin{table}[H]
 | 
			
		||||
  \footnotesize
 | 
			
		||||
  \centering
 | 
			
		||||
  \begin{tabularx}{8.5cm}{p{2.6cm}|p{2.6cm}|p{1.9cm}}
 | 
			
		||||
    \multicolumn{3}{c}{\textbf{Server A}}                 \\
 | 
			
		||||
    \hline
 | 
			
		||||
    Zielnetz            & Netzwerkadapter & Gateway       \\
 | 
			
		||||
    \hline\hline
 | 
			
		||||
    192.168.178.0/24    & eth0            & -             \\
 | 
			
		||||
  \end{tabularx}
 | 
			
		||||
\end{table}
 | 
			
		||||
 | 
			
		||||
\begin{figure}[H]
 | 
			
		||||
  \centering
 | 
			
		||||
  \includegraphics[width=0.65\textwidth]{img/einfache-netze.png}
 | 
			
		||||
\end{figure}
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsubsection{Einfache Netze mit Internetanbindung}%
 | 
			
		||||
\label{sec:netzwerk.routing.einfache-netze-mit-internetanbindung}
 | 
			
		||||
 | 
			
		||||
Hat ein Netzwerk genau eine Anbindung an die anderen Netzwerke, erhält die
 | 
			
		||||
Routingtabelle auf jedem Rechner eine zusätzliche Zeile, in der angegeben wird,
 | 
			
		||||
auf welchem Weg die anderen Netzwerke erreicht werden können. Da alle Netzwerke
 | 
			
		||||
über den gleichen ersten Router erreicht werden, wird diese Zeile der
 | 
			
		||||
Routingtabelle als Standard- bzw. Default-Route bezeichnet. Dieses
 | 
			
		||||
Standard-Gateway muss bei allen Betriebssystemen gesondert konfiguriert werden.
 | 
			
		||||
 | 
			
		||||
\begin{table}[H]
 | 
			
		||||
  \footnotesize
 | 
			
		||||
  \centering
 | 
			
		||||
  \begin{tabularx}{17cm}{p{2.6cm}|p{2.6cm}|p{1.9cm}||p{2.6cm}|p{2.6cm}|p{1.9cm}}
 | 
			
		||||
    \multicolumn{3}{c||}{\textbf{PC}}                     & \multicolumn{3}{c}{\textbf{Laptop}}                   \\
 | 
			
		||||
    \hline
 | 
			
		||||
    Zielnetz            & Netzwerkadapter & Gateway       & Zielnetz            & Netzwerkadapter & Gateway       \\
 | 
			
		||||
    \hline\hline
 | 
			
		||||
    192.168.178.0/24    & enp1s0          & -             & 192.168.178.0/24    & wlp5s1          & -             \\
 | 
			
		||||
    0.0.0.0/0           & enp1s0          & 192.168.178.1 & 0.0.0.0/0           & wlp5s1          & 192.168.178.1 \\
 | 
			
		||||
  \end{tabularx}
 | 
			
		||||
\end{table}
 | 
			
		||||
 | 
			
		||||
\begin{table}[H]
 | 
			
		||||
  \footnotesize
 | 
			
		||||
  \centering
 | 
			
		||||
  \begin{tabularx}{8.5cm}{p{2.6cm}|p{2.6cm}|p{1.9cm}}
 | 
			
		||||
    \multicolumn{3}{c}{\textbf{Server A}}                 \\
 | 
			
		||||
    \hline
 | 
			
		||||
    Zielnetz            & Netzwerkadapter & Gateway       \\
 | 
			
		||||
    \hline\hline
 | 
			
		||||
    192.168.178.0/24    & eth0            & -             \\
 | 
			
		||||
    189.10.55.47/32     & ppoe1           & -             \\
 | 
			
		||||
    0.0.0.0/0           & ppoe1           & 189.10.55.47  \\
 | 
			
		||||
  \end{tabularx}
 | 
			
		||||
\end{table}
 | 
			
		||||
 | 
			
		||||
\begin{figure}[H]
 | 
			
		||||
  \centering
 | 
			
		||||
  \includegraphics[width=1\textwidth]{img/einfache-netze-mit-internetanbindung.png}
 | 
			
		||||
\end{figure}
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsubsection{Zwei Netze mit Internetanbindung}%
 | 
			
		||||
\label{sec:netzwerk.routing.zwei-netze-mit-internetanbindung}
 | 
			
		||||
 | 
			
		||||
\begin{table}[H]
 | 
			
		||||
  \footnotesize
 | 
			
		||||
  \centering
 | 
			
		||||
  \begin{tabularx}{17cm}{p{2.6cm}|p{2.6cm}|p{1.9cm}||p{2.6cm}|p{2.6cm}|p{1.9cm}}
 | 
			
		||||
    \multicolumn{3}{c||}{\textbf{PC}}                     & \multicolumn{3}{c}{\textbf{Laptop}}                   \\
 | 
			
		||||
    \hline
 | 
			
		||||
    Zielnetz            & Netzwerkadapter & Gateway       & Zielnetz            & Netzwerkadapter & Gateway       \\
 | 
			
		||||
    \hline\hline
 | 
			
		||||
    192.168.178.0/24    & enp1s0          & -             & 192.168.178.0/24    & wlp5s1          & -             \\
 | 
			
		||||
    0.0.0.0/0           & enp1s0          & 192.168.178.1 & 0.0.0.0/0           & wlp5s1          & 192.168.178.1 \\
 | 
			
		||||
    \multicolumn{6}{c}{} \\
 | 
			
		||||
    \multicolumn{3}{c||}{\textbf{Server A}}               & \multicolumn{3}{c}{\textbf{Server B}}                 \\
 | 
			
		||||
    \hline
 | 
			
		||||
    Zielnetz            & Netzwerkadapter & Gateway       & Zielnetz            & Netzwerkadapter & Gateway       \\
 | 
			
		||||
    \hline\hline
 | 
			
		||||
    192.168.178.0/24    & eth0            & -             & 192.168.178.0/24    & eth0            & 192.168.179.1 \\
 | 
			
		||||
    192.168.179.0/24    & eth0            & 192.168.178.4 & 192.168.179.0/24    & eth1            & -             \\
 | 
			
		||||
    189.10.55.47/32     & ppoe1           & -             & 0.0.0.0/0           & eth0            & 192.168.178.1 \\
 | 
			
		||||
    0.0.0.0/0           & ppoe1           & 189.10.55.47  \\
 | 
			
		||||
    \multicolumn{6}{c}{} \\
 | 
			
		||||
    \multicolumn{3}{c||}{\textbf{Tablet}}                 & \multicolumn{3}{c}{\textbf{Smartphone}}               \\
 | 
			
		||||
    \hline
 | 
			
		||||
    Zielnetz            & Netzwerkadapter & Gateway       & Zielnetz            & Netzwerkadapter & Gateway       \\
 | 
			
		||||
    \hline\hline
 | 
			
		||||
    192.168.179.0/24    & wlp7s3          & -             & 192.168.179.0/24    & wlp3s8          & -             \\
 | 
			
		||||
    0.0.0.0/0           & wlp7s3          & 192.168.179.1 & 0.0.0.0/0           & wlp3s8          & 192.168.179.1 \\
 | 
			
		||||
  \end{tabularx}
 | 
			
		||||
\end{table}
 | 
			
		||||
 | 
			
		||||
\begin{figure}[H]
 | 
			
		||||
  \centering
 | 
			
		||||
  \includegraphics[width=1\textwidth]{img/zwei-netze-mit-internetanbindung.png}
 | 
			
		||||
\end{figure}
 | 
			
		||||
 | 
			
		||||
\newpage
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 2b:} Ermitteln Sie mithilfe des Befehls \textit{ip} Ihr
 | 
			
		||||
  Gateway.
 | 
			
		||||
  \item \textbf{Aufgabe 2c:} Erstellen Sie anhand des folgenden
 | 
			
		||||
  Netzwerkdiagramms die Routingtabellen für alle abgebildeten Netzwerkgeräte.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
\begin{figure}[H]
 | 
			
		||||
  \centering
 | 
			
		||||
  \includegraphics[width=1\textwidth]{img/aufgabe-netze-mit-internetanbindung.png}
 | 
			
		||||
\end{figure}
 | 
			
		||||
							
								
								
									
										673
									
								
								chapters/04-file-permissions.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,673 @@
 | 
			
		||||
% <#>-----------------------------------------------------------------------<#>
 | 
			
		||||
\section{Benutzer, Gruppen und Dateiberechtigungen}%
 | 
			
		||||
\label{sec:benutzer-gruppen-und-berechtigungen}
 | 
			
		||||
 | 
			
		||||
Die Verwaltung von Benutzer, Gruppen und Dateiberechtigungen unter Unix-artigen
 | 
			
		||||
Systemen sind identisch. Das hat den Vorteil, dass es für Anwender einfacher ist
 | 
			
		||||
Benutzer, Gruppen und Dateiberechtigungen auf Linux Distributionen wie Debian,
 | 
			
		||||
Ubuntu, Linux Mint oder RHEL, CentOS, Fedora als auch BSD Distributionen wie
 | 
			
		||||
MacOS, FreeBSD oder OpenBSD zu übertragen.
 | 
			
		||||
 | 
			
		||||
Optional können durch sogenannte \acrfull{acr:acl} Berechtigungen
 | 
			
		||||
erweitert werden, um die Rechtevergabe für Benutzer und Gruppen noch feiner
 | 
			
		||||
einteilen zu können.
 | 
			
		||||
 | 
			
		||||
In der Praxis gibt es jedoch sehr selten Szenarien, bei denen dies notwendig ist.
 | 
			
		||||
Aus diesem Grund liefern manche Distributionen die notwendigen Programme zum
 | 
			
		||||
verfeinern der Rechtevergabe nicht standardmäßig aus.
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{Benutzer und Gruppen}%
 | 
			
		||||
\label{sec:benutzer-gruppen-und-berechtigungen.benutzer-und-gruppen}
 | 
			
		||||
 | 
			
		||||
Linux ist als Mehrbenutzer-Betriebssystem entwickelt worden. Dies bedeutet, dass
 | 
			
		||||
mehrere Benutzer gleichzeit auf dem System Prozesse ausführen können. Dabei
 | 
			
		||||
werden die Berechtigungen auf Dateien und Verzeichnisse klar durch den Besitzer,
 | 
			
		||||
als auch durch die Gruppe, welche als mehrere Benutzern bestehen kann, geregelt.
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsubsection{Benutzer}%
 | 
			
		||||
\label{sec:benutzer-gruppen-und-berechtigungen.benutzer-und-gruppen.benutzer}
 | 
			
		||||
 | 
			
		||||
Man unterscheidet bei Benutzern zwischen funktionalen und realen Benutzern.
 | 
			
		||||
Funktionale Benutzer werden vorwiegend für Dienste verwendet, um zu vermeiden,
 | 
			
		||||
dass der Dienst ungewollt auf Dateien und Verzeichnisse Zugriff erhält. Aus
 | 
			
		||||
diesem Grund wird auch vermieden, dass funktionale Benutzer eine Shell öffnen
 | 
			
		||||
können. Dazu später mehr.
 | 
			
		||||
 | 
			
		||||
Reale Benutzer sind natürliche Personen, die sich entweder direkt per
 | 
			
		||||
Desktopmanager, einer Shell oder über ein Protokoll (\acrshort{acr:rdp},
 | 
			
		||||
\acrshort{acr:ssh}, \acrshort{acr:vnc}) Zugang verschaffen.
 | 
			
		||||
 | 
			
		||||
Alle Benutzer werden in der Datei \textit{/etc/passwd} gelistet. Sie wird als
 | 
			
		||||
Tabellenform geführt, getrennt durch einen Doppelpunkt \textbf{:}. Zur
 | 
			
		||||
einfacheren Darstellung kann folgender Befehl verwendet werden.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
cat /etc/passwd | column --table --separator :
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Die Spalten, exemplarisch für den Benutzer root, haben folgende Bedeutung:
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[itemsep=0pt]
 | 
			
		||||
  \item[\textbf{1. Spalte}] Name des Benutzers
 | 
			
		||||
  \item[\textbf{2. Spalte}] Ehemals Spalte für das Kennwort. Das \textit{x}
 | 
			
		||||
  kennzeichnet, dass für den Benutzer in der Datei \textit{/etc/shadow} ein
 | 
			
		||||
  Kennwort existiert. Dazu später mehr.
 | 
			
		||||
  \item[\textbf{3. Spalte}] Die ID des Benutzers. Wird oft auch als \textit{UID}
 | 
			
		||||
  angegeben.
 | 
			
		||||
  \item[\textbf{4. Spalte}] Die ID der Hauptgruppe. Wird oft auch als \textit{GID}
 | 
			
		||||
  angegeben.
 | 
			
		||||
  \item[\textbf{5. Spalte}] Erweiterter Name des Benutzers. Damit
 | 
			
		||||
  nachvollziehbar ist, welchem Dienst oder welcher realen Person der Benutzer
 | 
			
		||||
  zuzuordnen ist.
 | 
			
		||||
  \item[\textbf{6. Spalte}] Das Heimatverzeichnis des Benutzers. Im Regelfall
 | 
			
		||||
  wird dieses Verzeichnis betreten, sofern der Benutzer sich über eine
 | 
			
		||||
  Login-Shell anmeldet. Die Tilde verweist auf das hier definierte
 | 
			
		||||
  Heimatverzeichnis.
 | 
			
		||||
  \item[\textbf{7. Spalte}] Enthält den absoluten Pfad zur Login-Shell. Dies ist
 | 
			
		||||
  im Regelfall die \acrfull{acr:bash}. Um zu vermeiden, dass sich als Benutzer
 | 
			
		||||
  eines Dienstes angemeldet werden kann, kann hier auch auf
 | 
			
		||||
  \textit{/usr/bin/nologin} verwiesen werden.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Die 2. Spalte wurde ausgelagert nach \textit{/etc/shadow}, um die Sicherheit auf
 | 
			
		||||
dem System zu erhöhen. In der Datei \textit{/etc/shadow} werden weitere
 | 
			
		||||
Informationen gespeichert. Beispielsweise die Information, mit welchem
 | 
			
		||||
Hash-Algorithmus die Kennwörter gehasht wurden bzw. wie der Salt-Wert lautet.
 | 
			
		||||
 | 
			
		||||
Erzeugen Sie sich erneut mit dem genannten Befehl aus Kapitel
 | 
			
		||||
\ref{sec:benutzer-gruppen-und-berechtigungen.benutzer-und-gruppen.benutzer} eine
 | 
			
		||||
Ausgabe in tabellarischer Form für die Datei \textit{/etc/shadow}. Die Spalten
 | 
			
		||||
haben folgende Bedeutung:
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[itemsep=0pt]
 | 
			
		||||
  \item[\textbf{1. Spalte}] Name des Benutzers.
 | 
			
		||||
  \item[\textbf{2. Spalte}] Das Kennwort, gespeichert als Hash mit Informationen
 | 
			
		||||
  zum Hash.-Algorithmus. Der Wert \textit{!!} bedeutet, dass kein Kennwort
 | 
			
		||||
  definiert wurde.
 | 
			
		||||
  \item[\textbf{3. Spalte}] Enthält die Tage seit Beginn der Unix-Zeitrechnung,
 | 
			
		||||
  wann das Kennwort zuletzt geändert wurde.
 | 
			
		||||
  \item[\textbf{4. Spalte}] Tage bevor das Kennwort geändert werden muss.
 | 
			
		||||
  \item[\textbf{5. Spalte}] Tage ab wann eine Warnung ausgegeben werden soll,
 | 
			
		||||
  dass das Kennwort abläuft.
 | 
			
		||||
  \item[\textbf{6. Spalte}] Tage bevor das Kennwort abläuft, nachdem keine
 | 
			
		||||
  Anmeldung erfolgt ist.
 | 
			
		||||
  \item[\textbf{7. Spalte}] Enthält die Tage seit Beginn der Unix-Zeitrechnung,
 | 
			
		||||
  seit dem das Kennwort abgelaufen ist.
 | 
			
		||||
  \item[\textbf{8. Spalte}] Reservierte Spalte. Wird aktuell nicht verwendet.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 1a:} Ermitteln Sie den Hash-Algorithmus, welcher
 | 
			
		||||
  verwendet wurde um Ihr Kennwort zu hashen.
 | 
			
		||||
  \item \textbf{Aufgabe 1b:} Wann beginnt die Unix-Zeitrechnung?
 | 
			
		||||
  \item \textbf{Aufgabe 1c:} Wann wurde zuletzt das Kennwort des Benutzers root geändert?
 | 
			
		||||
  \item \textbf{Aufgabe 1d:} Ermitteln Sie die \textbf{User-ID} ihres aktuellen
 | 
			
		||||
  Benutzers mithilfe eines Befehls, welcher in den GNU Core Utilities enthalten
 | 
			
		||||
  und dem Bereich \glqq{}Shell Utilities\grqq{} zugeordnet ist.
 | 
			
		||||
  \item \textbf{Aufgabe 1e:} Nutzen Sie den Befehl \textit{wc}, um alle
 | 
			
		||||
  eingerichteten Benutzer auf ihrem System zu zählen. Lesen Sie die Manpage für
 | 
			
		||||
  weitere Informationen zu diesem Befehl.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsubsection{Gruppen}%
 | 
			
		||||
\label{sec:benutzer-gruppen-und-berechtigungen.benutzer-und-gruppen.gruppen}
 | 
			
		||||
 | 
			
		||||
Ähnlich wie bei Benutzern gibt es auch Dateien in denen die Gruppen bzw.
 | 
			
		||||
Gruppenkennwörter festgehalten sind. Dies sind die Dateien \textit{/etc/group}
 | 
			
		||||
und \textit{/etc/gshadow}. Die beiden Dateien sind ähnlich wie
 | 
			
		||||
\textit{/etc/passwd} und \textit{/etc/shadow} aufgebaut. Sie enthalten jedoch
 | 
			
		||||
weniger Spalten.
 | 
			
		||||
 | 
			
		||||
Die Datei \textit{/etc/group} enthält eine Spalte für den Namen der Gruppe, ob
 | 
			
		||||
ein Eintrag in \textit{/etc/gshadow} vorhanden ist, die Gruppen-ID, als auch alle
 | 
			
		||||
Benutzer, welche der Gruppe angehören. Die Benutzer werden durch ein Komma.
 | 
			
		||||
 | 
			
		||||
Die Datei \textit{/etc/gshadow} enthält noch weniger Informationen. Die ersten
 | 
			
		||||
drei Spalten sind identisch zu den Spalten aus der Datei \textit{/etc/shadow}.
 | 
			
		||||
Die letzte Spalte enthält Benutzer, welcher das Kennwort ändern dürfen.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 2a:} Ermitteln Sie die \textbf{Gruppen-ID} ihres
 | 
			
		||||
  aktuellen Benutzers mithilfe eines Befehls, welcher in den GNU Core Utilities
 | 
			
		||||
  enthalten und dem Bereich \glqq{}Shell Utilities\grqq{} zugeordnet ist.
 | 
			
		||||
  \item \textbf{Aufgabe 2b:} Nutzen Sie den Befehl \textit{wc}, um die Gruppen
 | 
			
		||||
  zu zählen. Lesen Sie die Manpage für weitere Informationen zu diesem Befehl.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsubsection{Benutzer root}%
 | 
			
		||||
\label{sec:benutzer-gruppen-und-berechtigungen.root}
 | 
			
		||||
 | 
			
		||||
Der Benutzer root besitzt auf allen Unix-artigen Systemen die User-ID und
 | 
			
		||||
Gruppen-ID 0. Er besitzt vollen Zugriff auf das gesamte System und damit auf
 | 
			
		||||
alle Dateien und Einstellungen aller Benutzer. Er kann beispielsweise ohne
 | 
			
		||||
Einschränkungen auf alle angeschlossenen Geräte unter \textit{/dev} zugreifen.
 | 
			
		||||
 | 
			
		||||
Der Benutzer root ist ein funktionaler Benutzer, mit dem sich reale Benutzer
 | 
			
		||||
anmelden können, um Befehle, welche einen höheren Berechtigungsgrad benötigen,
 | 
			
		||||
auszuführen. Durch die Verwendung des Benutzers root ist nachträglich nicht mehr
 | 
			
		||||
nachvollziehbar, welcher reale Benutzer welchen Befehl ausgeführt hat. Aus
 | 
			
		||||
diesem Grund und anderen Gründen wurde das Programm \textit{sudo} entwickelt.
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsubsection{sudo}%
 | 
			
		||||
\label{sec:benutzer-gruppen-und-berechtigungen.sudo}
 | 
			
		||||
 | 
			
		||||
Das Programm \textit{sudo} führt den nachgestellten Befehl mit root
 | 
			
		||||
Berechtigungen aus. Mithilfe von sudo lässt sich die Verwendung von root
 | 
			
		||||
Berechtigungen auf einzelne Benutzer einschränken. Für die Verwendung von
 | 
			
		||||
\textit{sudo} muss ein Benutzer der Gruppe \textit{wheel} unter RHEL basierenden
 | 
			
		||||
Distributionen angehören oder der Gruppe \textit{sudo} für Debian basierende
 | 
			
		||||
Distributionen.
 | 
			
		||||
 | 
			
		||||
Mithilfe des Befehls \textit{visudo} lässt sich die Konfiguration von
 | 
			
		||||
\textit{sudo} bearbeiten. Dort kann unter anderem auch eingestellt werden, dass
 | 
			
		||||
der Aufruf eines Befehls mit \textit{sudo} keiner erneuten Kennworteingabe des
 | 
			
		||||
Benutzers benötigt.
 | 
			
		||||
 | 
			
		||||
Mit dem folgenden Beispiel kann ein realer Benutzer mit \textit{sudo} den Ordner
 | 
			
		||||
\textit{/mnt/sda1} erstellen, für welchen root Berechtigungen notwendig sind, da
 | 
			
		||||
root der Eigentümer des Verzeichnisses \textit{/mnt} ist.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
sudo mkdir --parent /mnt/sda1
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Möchte man mehrere Befehle mit root Berechtigungen ausführen lohnt sich die
 | 
			
		||||
Anmeldung als root Benutzer von einem normalen Benutzer aus. Dies kann entweder
 | 
			
		||||
mit \textit{sudo -i} oder alternativ mit \textit{su} erreicht werden.
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsubsection{Passwort ändern}%
 | 
			
		||||
\label{sec:benutzer-gruppen-und-berechtigungen.benutzer-und-gruppen.s}
 | 
			
		||||
 | 
			
		||||
Um das Passwort zu ändern reicht die Ausführung des Befehls \textit{passwd}.
 | 
			
		||||
Damit ist es möglich das Kennwort des gerade verwendeten Benutzers zu ändern.
 | 
			
		||||
Möchte man das Kennwort anderer Benutzer ändern, muss man root Berechtigungen
 | 
			
		||||
besitzen, sei es als Benutzer root oder per \textit{sudo}, und gibt hinter den
 | 
			
		||||
Befehl den Namen des Benutzers an, wessen Kennwort man ändern möchte.
 | 
			
		||||
 | 
			
		||||
Das Programm \textit{passwd} ändert dem entsprechend die Zeile in
 | 
			
		||||
\textit{/etc/shadow} für den Benutzer, für welchen das Passwort geändert werden
 | 
			
		||||
soll.
 | 
			
		||||
 | 
			
		||||
Nachteil von \textit{passwd} ist, dass es interaktiv bedient werden muss -
 | 
			
		||||
sprich, mit \textit{passwd} ist es nicht möglich Kennwörter von Benutzern per
 | 
			
		||||
Skript zu ändern. Aus diesem Grund wurde das Programm \textit{chpasswd}
 | 
			
		||||
entwickelt.
 | 
			
		||||
 | 
			
		||||
Allerdings möchte man nicht nur das Kennwort eines Benutzers ändern können,
 | 
			
		||||
sondern auch wann das Kennwort ablaufen soll oder ab wann das System eine
 | 
			
		||||
Warnung ausgeben soll. Mit Hilfe des Programms \textit{chage} ist dies möglich.
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsubsection{Gruppe hinzufügen, bearbeiten und löschen}%
 | 
			
		||||
\label{sec:benutzer-gruppen-und-berechtigungen.gruppen.add-mod-rm}
 | 
			
		||||
 | 
			
		||||
Das Bearbeiten der Gruppen direkt in der Datei \textit{/etc/group} sollte
 | 
			
		||||
vermieden werden und stattdessen auf die Programme zurück gegriffen werden,
 | 
			
		||||
welche die Distribution bereit stellt.
 | 
			
		||||
 | 
			
		||||
Zum Erstellen, Bearbeiten und Löschen werden folgende Programme zur Verfügung
 | 
			
		||||
gestellt.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textit{groupadd:} Erstellt eine neue Gruppe
 | 
			
		||||
  \item \textit{groupmod:} Modifiziert eine bestehende Gruppe
 | 
			
		||||
  \item \textit{groupdel:} Löscht eine Gruppe
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 3a:} Estellen Sie die Gruppe \textit{hr} für
 | 
			
		||||
  \textit{human resources} mit der \textit{GID} 2000.
 | 
			
		||||
  \item \textbf{Aufgabe 3b:} Vergewissern Sie sich, dass in der Datei
 | 
			
		||||
  \textit{/etc/group} die neue Gruppe mit entsprechender \textit{GID} angelegt wurde.
 | 
			
		||||
  \item \textbf{Aufgabe 3c:} Benennen Sie die Gruppe \textit{hr} nach
 | 
			
		||||
  \textit{dev} für \textit{development} um und überprüfen Sie, ob sich der Name
 | 
			
		||||
  der Gruppe in der Datei \textit{/etc/group} geändert hat
 | 
			
		||||
  \item \textbf{Aufgabe 3d:} Ändern Sie die \textit{GID} auf 3000 und überprüfen
 | 
			
		||||
  Sie, ob diese sich in der Datei \textit{/etc/group} geändert hat.
 | 
			
		||||
  \item \textbf{Aufgabe 3e:} Löschen Sie die Gruppe \textit{dev}
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsubsection{Benutzer hinzufügen, bearbeiten und löschen}%
 | 
			
		||||
\label{sec:benutzer-gruppen-und-berechtigungen.benutzer.add-mod-rm}
 | 
			
		||||
 | 
			
		||||
Ähnlich wie Gruppen können auch Benutzer hinzugefügt, modifiziert und gelöscht
 | 
			
		||||
werden. Auf folgende Befehle kann zurück gegriffen werden.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textit{useradd:} Erstellt einen neuen Benutzer
 | 
			
		||||
  \item \textit{usermod:} Modifiziert einen bestehenden Benutzer
 | 
			
		||||
  \item \textit{userdel:} Löscht den Benutzer
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 4a:} Erstellen Sie den Benutzer \textit{manfred} mit dem
 | 
			
		||||
  Namen \textit{Manfred Mertens}. Der Benutzer nutzt die \acrlong{acr:bash}.
 | 
			
		||||
  Sein Heimatverzeichnis soll unter \textit{/home} erstellt werden. Das Kennwort
 | 
			
		||||
  lautet \textit{manni}. Seine Primärgruppe lautet \textit{manfred}. Als
 | 
			
		||||
  \textit{UID} verwenden Sie \textit{2000}.
 | 
			
		||||
  \item \textbf{Aufgabe 4b:} Setzen Sie das Ablaufdatum des Kennworts für den
 | 
			
		||||
  Benutzer \textit{manni} auf den \textit{31. Juni 2021} und überprüfen Sie die
 | 
			
		||||
  passende Spalte aus der Datei \textit{/etc/shadow}.
 | 
			
		||||
  \item \textbf{Aufgabe 4c:} Fügen Sie den Benutzer der Gruppe \textit{wheel} hinzu.
 | 
			
		||||
  \item \textbf{Aufgabe 4d:} Entfernen Sie den Benutzer \textit{manfred} aus der
 | 
			
		||||
  Gruppe \textit{wheel} ohne ihn dabei aus anderen Gruppen zu entfernen.
 | 
			
		||||
  \item \textbf{Aufgabe 4e:} Setzen Sie das Kennwort des Benutzers auf
 | 
			
		||||
  \textit{manni-der-busfahrer}.
 | 
			
		||||
  \item \textbf{Aufgabe 4f:} Entfernen Sie den Benutzer \textit{manfred} und
 | 
			
		||||
  löschen Sie ggfls. seine Primärgruppe, sofern niemand mehr Mitglied ist.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{Dateiberechtigungen}%
 | 
			
		||||
\label{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen}
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsubsection{DOS Ideologie}%
 | 
			
		||||
\label{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen.dos-ideologie}
 | 
			
		||||
 | 
			
		||||
Unter Windows sind Grundsätzlich alle Dateien, welche auf den Suffix
 | 
			
		||||
\textit{.exe} enden Ausführbar. Unix-artige Systeme interpretieren Dateiendungen
 | 
			
		||||
anders. Sie sind ausschließlich dafür da, damit Desktopmanager wie gnome,
 | 
			
		||||
cinnamon, kde, xfce oder andere erkennen, um welche Datei es sich hier handel
 | 
			
		||||
und mit welchen Programmen aus einer Liste diese geöffnet werden können.
 | 
			
		||||
 | 
			
		||||
Dies bedeutet, dass auch die PDF-Datei \texttt{Aufgabensammlung.pdf} ausführbar
 | 
			
		||||
sein kann, obwohl diese nur lesbar sein sollte, damit Programme wie evince oder
 | 
			
		||||
masterpdfeditor von ihr lesen können.
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsubsection{Einfache Dateiberechtigungen}%
 | 
			
		||||
\label{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen.einfach}
 | 
			
		||||
 | 
			
		||||
Unter Unix-artigen Systemen, welche die GNU Core Utilities verwenden, ist das
 | 
			
		||||
Programm \textit{ls} vorinstalliert. Das Programm dient zu Auflistung von
 | 
			
		||||
Dateien und Verzeichnissen.
 | 
			
		||||
 | 
			
		||||
Die Ausgabe ist eine Zusammenstellung von mehreren Einträgen unterschiedlicher
 | 
			
		||||
Auflistungen, um Dateiberechtigungen exemplarisch zu erklären.
 | 
			
		||||
 | 
			
		||||
\begin{verbatim}
 | 
			
		||||
drwxr-xr-x.  2 markus    users      40 29. Sep 21:48 hello-world
 | 
			
		||||
-rw-r--r--.  1 christian users       0 29. Sep 21:48 hello-world2
 | 
			
		||||
srw-rw----.  1 root      docker      0  5. Okt 19:34 docker.sock
 | 
			
		||||
lrwxrwxrwx.  1 markus    markus     38 14. Apr 11:32 .g -> .gnupg
 | 
			
		||||
brw-rw----.  1 root      disk        8  5. Okt 19:34 sda
 | 
			
		||||
crw--w----.  1 root      tty         4  5. Okt 19:34 tty0
 | 
			
		||||
-rwx------.  1 demo      users       0  5. Okt 20:01 mybin
 | 
			
		||||
\end{verbatim}
 | 
			
		||||
 | 
			
		||||
Die Attributzeichenkette besteht auch 10 Zeichen und gibt Auskunft über den Typ
 | 
			
		||||
als auch die Berechtigungen auf die Ressource.
 | 
			
		||||
 | 
			
		||||
Das erste Attribut gibt den Typ der Ressource wieder. Folgende Attribute
 | 
			
		||||
beschreiben die Ressource.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{-:} Ist eine normale Datei
 | 
			
		||||
  \item \textbf{d:} \textbf{d}irectory
 | 
			
		||||
  \item \textbf{s:} unix \textbf{s}ocket - Beispielsweise TCP socket eines Web Servers
 | 
			
		||||
  \item \textbf{l:} symbolic \textbf{l}ink - Link auf eine andere Datei oder
 | 
			
		||||
  anderes Verzeichnis
 | 
			
		||||
  \item \textbf{b:} \textbf{b}lock device - Festplatten
 | 
			
		||||
  \item \textbf{c:} \textbf{c}haracter device - Terminal
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Die verbleibenden neun Attribute werden in drei Gruppen gesplittet. Jede Gruppe
 | 
			
		||||
beschreibt die Berechtigungen für den Besitzer (engl. user, kurz u), die Gruppe
 | 
			
		||||
(engl. group, kurz g) und alle anderen Benutzer, welche weder als Besitzer noch
 | 
			
		||||
Mitglied in der genannten Gruppe sind. Diese Benutzer werden auch als Andere
 | 
			
		||||
(engl. other, kurz o) beschrieben.
 | 
			
		||||
 | 
			
		||||
Dabei haben die Attribute folgende Bedeutung:
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{r:} \textbf{r}ead - Von Ressource lesen oder Verzeichnisinhalt
 | 
			
		||||
  auflisten
 | 
			
		||||
  \item \textbf{w:} \textbf{w}rite - Ressource beschreiben oder
 | 
			
		||||
  Verzeichnisinhalt ändern (hinzufügen, umbenennen, löschen)
 | 
			
		||||
  \item \textbf{x:} e\textbf{x}ecute - Programm ausführen oder in das
 | 
			
		||||
  Verzeichnis hineinwechseln
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 5a}: Sind block devices in der obrigen Ausgabe gelistet,
 | 
			
		||||
  wenn ja welche?
 | 
			
		||||
  \item \textbf{Aufgabe 5b:} Nenne alle Dateien aus der obrigen Ausgabe.
 | 
			
		||||
  \item \textbf{Aufgabe 5c:} Kann der Benutzer \textit{root} in das Verzeichnis
 | 
			
		||||
  \textit{hello-word} hineinwechseln, wenn ja warum?
 | 
			
		||||
  \item \textbf{Aufgabe 5d:} Welche Gruppe und was für Berechtigungen wurden der
 | 
			
		||||
  Aufzählung \textit{hello-world2} zugewiesen?
 | 
			
		||||
  \item \textbf{Aufgabe 5e:} Kann der Benutzer \textit{christian} das Programm
 | 
			
		||||
  \textit{mybin} ausführen?
 | 
			
		||||
  \item \textbf{Aufgabe 5f:} Kann der Benutzer \textit{demo} die Datei
 | 
			
		||||
  \textit{helloworld2} lesen?
 | 
			
		||||
  \item \textbf{Aufgabe 5g:} Wer kann mit welchen Berechtigungen mit dem
 | 
			
		||||
  Unix-Socket \textit{docker.sock} kommunizieren?
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsubsection{Änderung der Dateiberechtigungen}%
 | 
			
		||||
\label{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen.mod}
 | 
			
		||||
 | 
			
		||||
Die Berechtigungen auf Ressourcen als auch der Besitzer bzw. die Gruppe kann
 | 
			
		||||
geändert werden. Dazu sind in GNU Core Utilities folgende Programme enthalten.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textit{chown:} Ändert den Besitzer einer Ressource
 | 
			
		||||
  \item \textit{chgrp:} Ändert die Gruppe einer Ressource
 | 
			
		||||
  \item \textit{chmod:} Ändert die Berechtigung auf eine Ressource für alle
 | 
			
		||||
  anderen Benutzer, welche weder als Besitzer noch Mitglieder der Gruppe sind
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Das Ändern des Besitzers per \textit{chown} kann durch \textit{chown user
 | 
			
		||||
ressource} geändert werden. Gleiches gilt für das Ändern der Gruppe:
 | 
			
		||||
\textit{chgrp group ressource}. Möchte man den Besitzer als auch die Gruppe in
 | 
			
		||||
einem ändern kann dies durch \textit{chown} umgesetzt werden. Dabei muss der
 | 
			
		||||
Besitzer als auch die Gruppe getrennt durch einen Doppelpunkt angegeben werden:
 | 
			
		||||
\textit{chown user:group ressource}. Alternativ zu den Namen kann auch die
 | 
			
		||||
\textit{UID} bzw. für die Gruppe die \textit{GID} verwendet werden.
 | 
			
		||||
 | 
			
		||||
Die Dateiberechtigungen lassen sich per \textit{chmod} anpassen. Das Programm
 | 
			
		||||
\textit{chmod} unterstützt die Symbolische- als auch die Oktal-Notation, um
 | 
			
		||||
Berechtigungen für Ressourcen zu beschreiben.
 | 
			
		||||
 | 
			
		||||
Für die Oktal-Natation müssen die Oktal-Werte für jede Gruppe (Besitzer, Gruppe,
 | 
			
		||||
Andere) addiert werden, um die symbolische Notation nachbilden zu können. Bei
 | 
			
		||||
der Symbolischen-Notation können die Gruppen über die Buchstaben u für engl. user, g
 | 
			
		||||
für engl. group und o für engl. other referenziert werden.
 | 
			
		||||
 | 
			
		||||
\begin{table}[H]
 | 
			
		||||
  \centering
 | 
			
		||||
  \begin{tabularx}{\textwidth}{X|X|X}
 | 
			
		||||
    \textbf{Berechtigung} & \textbf{Oktal-Wert} & \textbf{Symbolisches-Attribut}  \\
 | 
			
		||||
    \hline\hline
 | 
			
		||||
    read                  & 4                   & r                               \\
 | 
			
		||||
    write                 & 2                   & w                               \\
 | 
			
		||||
    execute               & 1                   & x                               \\
 | 
			
		||||
  \end{tabularx}
 | 
			
		||||
\end{table}
 | 
			
		||||
 | 
			
		||||
Hier zwei Beispiele, um die Berechtigungen aus der Aufzählung aus Kapitel
 | 
			
		||||
\ref{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen.einfach}
 | 
			
		||||
anzupassen. Dabei führen die ersten beiden und letzen beiden Befehle, unabhängig
 | 
			
		||||
von der Notation, zu dem gleichen Ergebnis.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ chmod 750 helloworld2
 | 
			
		||||
$ chmod u=+rwx,g=+rx-w,o=-rwx helloworld2
 | 
			
		||||
 | 
			
		||||
$ chmod 775 helloworld mybin
 | 
			
		||||
$ chmod u=+rwx,g=+rwx,o=+rx-w mybin
 | 
			
		||||
 | 
			
		||||
$ ls -la
 | 
			
		||||
drwxr-x---  2 markus    users      40 29. Sep 21:48 hello-world
 | 
			
		||||
-rwxrwxr-x  1 demo      users       0  5. Okt 20:01 mybin
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 6a:} Wie lautet der Befehl die Berechtigung zum lesen
 | 
			
		||||
  des Verzeichnis \textit{helloworld2} für die Gruppe zu entfernen? Bitte gebe
 | 
			
		||||
  die Symbolische- und Oktal-Notation an.
 | 
			
		||||
  \item \textbf{Aufgabe 6b:} Wie lautet der Befehl der Datei mybin die
 | 
			
		||||
  Berechtigung zum Ausführen für alle Gruppen (Besitzer, Gruppe und Andere) zu
 | 
			
		||||
  entfernen? Symbolische- und Oktal-Notation erforderlich.
 | 
			
		||||
  \item \textbf{Aufgabe 6c:} Wie lautet der Befehl anderen Benutzern, welche
 | 
			
		||||
  nicht Besitzer oder Mitglied der Gruppe docker sind von dem Unix-Socket
 | 
			
		||||
  \textit{docker.sock} zu lesen. Symbolische- und Oktal-Notation erforderlich.
 | 
			
		||||
  \item \textbf{Aufgabe 6d:} Wie lautet der Befehl den Besitzer auf
 | 
			
		||||
  \textit{root} und die Gruppe auf \textit{markus} für die Datei
 | 
			
		||||
  \textit{helloworld} zu setzen? Einzeiler bitte.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsubsection{Erweiterte Dateiberechtigungen}%
 | 
			
		||||
\label{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen.erweitert}
 | 
			
		||||
 | 
			
		||||
Neben den einfachen Dateiberechtigungen unterstützen alle Unix-artige Systeme
 | 
			
		||||
die erweiterten Dateiberechtigungen. Diese werden \textit{setuid},
 | 
			
		||||
\textit{setgid} und \textit{sticky bit} genannt.
 | 
			
		||||
 | 
			
		||||
Sie lassen sich ebenfalls über die Symbolische- als auch die Oktal-Notation
 | 
			
		||||
setzen.
 | 
			
		||||
 | 
			
		||||
\begin{table}[H]
 | 
			
		||||
  \centering
 | 
			
		||||
  \begin{tabularx}{\textwidth}{X|X|X}
 | 
			
		||||
    \textbf{Berechtigung} & \textbf{Oktal-Wert} & \textbf{Symbolisches-Attribut}  \\
 | 
			
		||||
    \hline\hline
 | 
			
		||||
    setuid                & 4                   & s                               \\
 | 
			
		||||
    setgid                & 2                   & s                               \\
 | 
			
		||||
    sticky bit            & 1                   & t                               \\
 | 
			
		||||
  \end{tabularx}
 | 
			
		||||
\end{table}
 | 
			
		||||
 | 
			
		||||
Die \textit{setuid} auf Dateien wird ignoriert, außer sie ist ausführbar. Ist
 | 
			
		||||
die Datei ausführbar wird diese mit den Berechtigungen des Besitzers ausgeführt.
 | 
			
		||||
Ein gutes Beispiel ist das Programm \textit{/bin/passwd}. Ohne die Option
 | 
			
		||||
\textit{setuid} wäre ein normaler Benutzer nicht in der Lage sein Kennwort zu
 | 
			
		||||
ändern, da das Programm die Dateien \textit{/etc/passwd} und
 | 
			
		||||
\textit{/etc/shadow} bearbeitet, welche dem Besitzer \textit{root} als auch der
 | 
			
		||||
Gruppe \textit{root} gehören.
 | 
			
		||||
 | 
			
		||||
Ist das \textit{setuid} auf eine Datei oder ein Verzeichnis gesetzt, wird das
 | 
			
		||||
Attribut \textit{x} durch ein \textit{s} unter den Berechtigungen des Besitzers
 | 
			
		||||
in der Attributzeichenkette ersetzt.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 7a:} Überprüfe, ob für das Programm \textit{/bin/passwd}
 | 
			
		||||
  \textit{setuid} gesetzt ist.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Das setzen von \textit{setuid}, \textit{setgid} und \textit{sticky bit} wird per
 | 
			
		||||
\textit{chmod} erreicht. Es kann die Symbolische- als auch die Oktal-Notation
 | 
			
		||||
verwendet werden. Exemplarisch wird nachfolgend \textit{setuid} über die
 | 
			
		||||
Symbolische- als auch Oktal-Notation für die Datei hello-world.py gesetzt.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ chmod 4755 hello-world-py
 | 
			
		||||
$ chmod u=+rws,g=+rx-w,o=+rx-w hello-world-py
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Die erweiterte Berechtigung \textit{setgid} verhält sich analog zu
 | 
			
		||||
\textit{setuid}, was Dateien betrifft. Es hat jedoch noch die Besonderheit, dass
 | 
			
		||||
wenn \textit{setgid} auf ein Verzeichnis gesetzt ist alle erstellten Dateien und
 | 
			
		||||
Verzeichnisse unterhalb des Verzeichnisses die Gruppe erben. Allerdings
 | 
			
		||||
\textbf{nicht} die Berechtigungen. Dies kann per \acrlongpl{acr:acl} realisiert
 | 
			
		||||
werden.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 7b:} Erstellen Sie das Verzeichnis \textit{/tmp/setgid}
 | 
			
		||||
  und setzen Sie die Gruppe auf \textit{users}. Überprüfen Sie, ob
 | 
			
		||||
  \textit{setgid} erfolgreich gesetzt wurde.
 | 
			
		||||
  \item \textbf{Aufgabe 7c:} Erstellen Sie eine neue Datei als auch ein neues
 | 
			
		||||
  Verzeichnis in \textit{/tmp/setgid}. Überprüfen Sie, ob die Gruppe
 | 
			
		||||
  \textit{users} für die von ihnen erstellte Datei als auch Verzeichnis gesetzt
 | 
			
		||||
  wurde.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Das \textit{sticky bit} wird auf Dateien ignoriert. Wird es allerdings auf ein
 | 
			
		||||
Verzeichnis gesetzt verhindert es, dass Benutzer Dateien und Verzeichnisse
 | 
			
		||||
löschen können für welche sie nicht als Besitzer hinterlegt sind.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsubsection{Access-Control-List}%
 | 
			
		||||
\label{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen.acl}
 | 
			
		||||
 | 
			
		||||
Mit \acrfull{acr:acl} können Berechtigungen granularer vergeben werden. Sie
 | 
			
		||||
erweitern somit die Rechteverwaltung unter Linux und werden insbesondere dafür
 | 
			
		||||
verwendet, Berechtigungen für neu angelegte Dateien und Verzeichnisse innerhalb
 | 
			
		||||
eines Verzeichnisses zu vererben.
 | 
			
		||||
 | 
			
		||||
Unter Fedora muss das Paket \textit{acl} installiert sein, um die
 | 
			
		||||
Rechteverwaltung granularer einstellen zu können.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 8a:} Installieren Sie mit \textit{yum} das Paket
 | 
			
		||||
  \textit{acl}, sofern dies nicht installiert ist.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Das Paket \textit{acl} enthält mehrere Programme, um \acrshortpl{acr:acl} auf
 | 
			
		||||
dem System verwalten zu können. Dies sind die wichtigsten:
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textit{setfacl:} Dient zum definieren von \acrshortpl{acr:acl} auf ein
 | 
			
		||||
  Verzeichnis oder eine Datei
 | 
			
		||||
  \item \textit{getfacl:} Liest definierte \acrshortpl{acr:acl} von einem
 | 
			
		||||
  Verzeichnis oder einer Datei aus
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Die Programme \textit{setfacl} und \textit{getfacl} folgen einer ähnlichen
 | 
			
		||||
Befehlsstruktur wie \textit{chmod}, \textit{chown} und \textit{chgrp}.
 | 
			
		||||
 | 
			
		||||
Hier ein Beispiel, um dem Benutzer \textit{christian} die Berechtigung
 | 
			
		||||
\textit{rwx} auf das Programm \textit{mybin} per \acrshort{acr:acl} einzuräumen.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ setfacl -m "u:christian:rwx" mybin
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Ähnlich verhält sich das Programm, wenn man einer Gruppe oder Benutzern, welche
 | 
			
		||||
weder Besitzer noch Mitglieder einer Gruppe sind, Berechtigungen einräumen
 | 
			
		||||
möchte.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ setfacl -m "g:christian:r-x" mybin
 | 
			
		||||
$ setfacl -m "o:r-x" mybin
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Führt man den Befehl \textit{ls -la} erneut aus, macht das \textit{+}-Zeichen
 | 
			
		||||
hinter der Attributzeichenkette auf die definierte \acrshort{acr:acl}
 | 
			
		||||
aufmerksam.
 | 
			
		||||
 | 
			
		||||
\begin{verbatim}
 | 
			
		||||
drwxr-xr-x.  2 markus    users      40 29. Sep 21:48 hello-world
 | 
			
		||||
-rw-r--r--.  1 christian users       0 29. Sep 21:48 hello-world2
 | 
			
		||||
srw-rw----.  1 root      docker      0  5. Okt 19:34 docker.sock
 | 
			
		||||
lrwxrwxrwx.  1 markus    markus     38 14. Apr 11:32 .g -> .gnupg/
 | 
			
		||||
brw-rw----.  1 root      disk        8  5. Okt 19:34 sda
 | 
			
		||||
crw--w----.  1 root      tty         4  5. Okt 19:34 tty0
 | 
			
		||||
-rwx------+  1 demo      users       0  5. Okt 20:01 mybin
 | 
			
		||||
\end{verbatim}
 | 
			
		||||
 | 
			
		||||
Die definierte \acrshort{acr:acl} kann per \textit{getfacl} ausgelesen werden.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ getfacl mybin
 | 
			
		||||
# file: mybin
 | 
			
		||||
# owner: demo
 | 
			
		||||
# group: users
 | 
			
		||||
user::rwx
 | 
			
		||||
user:christian:rwx
 | 
			
		||||
group::---
 | 
			
		||||
group:christian:r-x
 | 
			
		||||
mask::rwx
 | 
			
		||||
other::r-x
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 8b:} Erstellen Sie folgende Verzeichnisstruktur:
 | 
			
		||||
  \textit{/tmp/acl-test/share}
 | 
			
		||||
  \item \textbf{Aufgabe 8c:} Stellen Sie sicher, dass ausschließlich der
 | 
			
		||||
  Benutzer \textit{root} und die Gruppe \textit{root} über die klassichen
 | 
			
		||||
  Dateiberechtigungen Zugriff auf das Verzeichnis \textit{/tmp/acl-test} erhalten.
 | 
			
		||||
  \item \textbf{Aufgabe 8d:} Erstellen Sie einen neuen Benutzer mit dem Namen
 | 
			
		||||
  \textit{fuacl} und räumen Sie diesem per \acrshort{acr:acl} Berechtigungen
 | 
			
		||||
  ein, Dateien und Verzeichnisse aus dem Verzeichnis \textit{/tmp/acl-test} zu
 | 
			
		||||
  lesen, ändern und deren Inhalt aufzulisten. Überprüfen Sie die Einstellung!
 | 
			
		||||
  \item \textbf{Aufgabe 8e:} Entziehen Sie dem Benutzer \textit{fuacl} die
 | 
			
		||||
  Berechtigung Dateien und Verzeichnisse aus dem Verzeichnis
 | 
			
		||||
  \textit{/tmp/acl-test/shared} zu lesen und aufzulisten. Überprüfen Sie die
 | 
			
		||||
  Einstellung!
 | 
			
		||||
  \item \textbf{Aufgabe 8f:} Stellen Sie sicher, dass neu erstellte Dokumente in
 | 
			
		||||
  \textit{/tmp/acl-test} immer der Gruppe \textit{root} gehören und die
 | 
			
		||||
  Berechtigung \textit{rwx} für Verzeichnisse und \textit{rw-} für Dateien
 | 
			
		||||
  gesetzt werden. \textit{Tipp: setfact --default}. Überprüfen Sie die
 | 
			
		||||
  Berechtigung durch erstellen eines neuen Dokuments.
 | 
			
		||||
  \item \textbf{Aufgabe 8g:} Entfernen Sie ausschließlich jene
 | 
			
		||||
  \acrshort{acr:acl}, welche vererbt wird.
 | 
			
		||||
  \item \textbf{Aufgabe 8h:} Entfernen Sie rekursive alle \acrshortpl{acr:acl}.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{Praxisaufgabe: Verzeichnisstruktur mit Dateiberechtigungen erstellen}%
 | 
			
		||||
\label{sec:benutzer-gruppen-und-berechtigungen.praxis-task}
 | 
			
		||||
 | 
			
		||||
Sie befinden sich in folgender Situation:
 | 
			
		||||
 | 
			
		||||
Das Unternehmen indem Sie arbeiten wechselt aus Kostengründen von Windows
 | 
			
		||||
Sharepoint zu Samba. Ihr Vorgesetzter hat Sie daher gebeten Vorbereitungen für
 | 
			
		||||
den Umstieg zu treffen. Darunter auch die notwendige Verzeichnisstruktur für die
 | 
			
		||||
Abteilungen als auch die Benutzer und Gruppen zu erstellen, sowie Berechtigungen
 | 
			
		||||
den Vorgaben entsprechend anzupassen.
 | 
			
		||||
 | 
			
		||||
Folgende Beziehungen führt das Unternehmen zwischen Mitarbeiter und Abteilungen.
 | 
			
		||||
 | 
			
		||||
\begin{table}[H]
 | 
			
		||||
  \centering
 | 
			
		||||
  \begin{tabularx}{\textwidth}{X|X}
 | 
			
		||||
    \textbf{Mitarbeiter} & \textbf{Abteilungen}                 \\
 | 
			
		||||
    \hline\hline
 | 
			
		||||
    Hugo McKinnock       & Entwicklung                          \\
 | 
			
		||||
    Hans Rakinzky        & Entwicklung, System Administration   \\
 | 
			
		||||
    Marie Haseloff       & Personalabteilung, Buchhaltung       \\
 | 
			
		||||
    Sophie Becker        & Personalabteilung                    \\
 | 
			
		||||
    Axel Tuller          & System Administration                \\
 | 
			
		||||
    Tobias Moretti       & Entwicklung, Qualitätssicherung      \\
 | 
			
		||||
    Lisa Meerkamp        & Sekretärin                           \\
 | 
			
		||||
    Manfred Krupp        & Vorstand                             \\
 | 
			
		||||
  \end{tabularx}
 | 
			
		||||
\end{table}
 | 
			
		||||
 | 
			
		||||
Die Verzeichnisstruktur ist unter \textit{/srv/documents} zu erstellen. Dabei
 | 
			
		||||
besitzt jede Abteilung ihr eigenes Verzeichnis. Innerhalb ihres Verzeichnisses
 | 
			
		||||
erhalten fast alle Abteilungen das Verzeichnis \textit{public} und
 | 
			
		||||
\textit{private}. Die Abteilung Entwicklung und Qualitätssicherung haben kein
 | 
			
		||||
Verzeichnis \textit{private}, da ihre Dokumente allen Benutzern im Unternehmen
 | 
			
		||||
zugänglich sein sollen. Dagegen besitzen die Abteilungen Sekreteriat als auch
 | 
			
		||||
Vorstand kein Verzeichnis \textit{public}, sondern ausschließlich
 | 
			
		||||
\textit{private}.
 | 
			
		||||
 | 
			
		||||
In den Verzeichnissen \textit{private} können ausschließlich Mitglieder der
 | 
			
		||||
Abteilung lesen und schreiben. Neu erstellte Dokumente gehören der Abteilung und
 | 
			
		||||
dem Benutzer \textit{root}. Ähnlich ist dies für das Verzeichnis
 | 
			
		||||
\textit{public}. Alle Benutzer können die Dateien oder Verzeichnisse öffnen.
 | 
			
		||||
Allerdings können nur Mitglieder der Abteilung neue Dokumente erstellen und
 | 
			
		||||
bearbeiten.
 | 
			
		||||
 | 
			
		||||
Bitte geben Sie die nötigen Befehle an, mit denen Sie die nachfolgenden Aufgaben
 | 
			
		||||
lösen.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 9a:} Erstellen Sie die Gruppen, beginnend mit der
 | 
			
		||||
  \textit{GID} 2000.
 | 
			
		||||
  \item \textbf{Aufgabe 9b:} Erstellen Sie die Benutzer, beginnend mit der
 | 
			
		||||
  \textit{UID} 2000. Die Primärgruppe ist \textit{users}.
 | 
			
		||||
  \item \textbf{Aufgabe 9c:} Verknüpfen Sie die Benutzer mit den Gruppen.
 | 
			
		||||
  \item \textbf{Aufgabe 9d:} Erstellen Sie die beschriebene Verzeichnisstruktur.
 | 
			
		||||
  \item \textbf{Aufgabe 9e:} Setzen Sie die beschriebenen Berechtigungen um.
 | 
			
		||||
  \item \textbf{Aufgabe 9f:} Melden Sie sich unter dem Benutzer von Marie
 | 
			
		||||
  Haseloff per \textit{sudo} an und überprüfen Sie folgende Berechtigungen:
 | 
			
		||||
  \begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
    \item \textbf{Aufgabe 9f$_1$:} Erstellen, bearbeiten und löschen von Dateien
 | 
			
		||||
    und Verzeichnissen in der für Ihr, über die Abteilung, zugewiesenen
 | 
			
		||||
    Verzeichnisse.
 | 
			
		||||
    \item \textbf{Aufgabe 9f$_2$:} Neu erstellte Dokumente und Verzeichnisse
 | 
			
		||||
    gehören der jeweiligen Abteilung. Verzeichnisse haben die
 | 
			
		||||
    Gruppenberechtigung \textit{rwx}. Dateien haben die Gruppenberechtigung
 | 
			
		||||
    \textit{rw-}.
 | 
			
		||||
    \item \textbf{Aufgabe 9f$_3$:} Von Dateien und Verzeichnissen der Abteilung
 | 
			
		||||
    Vorstand darf weder gelesen noch geschrieben als auch deren Inhalt gelistet
 | 
			
		||||
    werden.
 | 
			
		||||
    \item \textbf{Aufgabe 9f$_4$:} Dateien aus dem Verzeichnis \textit{public}
 | 
			
		||||
    der Abteilung System Administration sind lesbar, aus dem Verzeichnis
 | 
			
		||||
    \textit{private} nicht.
 | 
			
		||||
  \end{itemize}
 | 
			
		||||
\end{itemize}
 | 
			
		||||
							
								
								
									
										221
									
								
								chapters/05-directory-structure.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,221 @@
 | 
			
		||||
% <#>-----------------------------------------------------------------------<#>
 | 
			
		||||
\section{Verzeichnisstrukturen}%
 | 
			
		||||
\label{sec:verzeichnisstrukturen}
 | 
			
		||||
 | 
			
		||||
Das Konzept der Verzeichnisstruktur von Unix-artigen Betriebssystemen ist
 | 
			
		||||
annähernd identisch. Es gibt jedoch Besonderheiten zwischen den einzelnen
 | 
			
		||||
Abspaltungen von Unix hinsichtlich Linux und BSD, als auch der jeweiligen
 | 
			
		||||
Distributionen und Abspaltungen: Debian, RHEL, OpenBSD etc. Da jedoch die
 | 
			
		||||
Vielfalt zu groß für dieses Kapitel wäre, werden diese hier nicht näher
 | 
			
		||||
behandelt.
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsection{/ (root directory, Wurzelverzeichnis)}%
 | 
			
		||||
\label{sec:verzeichnisstrukturen.root}
 | 
			
		||||
 | 
			
		||||
% NOTE: Missing reference to chapter where devices will be mounted
 | 
			
		||||
Das Wurzelverzeichnis \textit{/} ist die oberste Verzeichnisebene. Es enthält
 | 
			
		||||
alle weiteren Unterverzeichnisse und Dateien unabhängig, ob diese sich auf einem
 | 
			
		||||
physikalisch anderen Gerät befinden. Dazu später mehr.
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsection{/bin/}%
 | 
			
		||||
\label{sec:verzeichnisstrukturen.bin}
 | 
			
		||||
 | 
			
		||||
Systemrelevante Programme, beispielsweise jene, welche Bestandteil der GNU Core
 | 
			
		||||
Utility Collection sind werden in dem Verzeichnis \textit{/bin/} gespeichert.
 | 
			
		||||
Dies sind zum Beispiel \textit{chmod}, \textit{chown}, \textit{chgrp},
 | 
			
		||||
\textit{id}, \textit{cp}, \textit{mv} oder \textit{rm}. Im Regelfall sind alle
 | 
			
		||||
Programme, welche notwendig sind das System erfolgreich zu booten im Verzeichnis
 | 
			
		||||
\textit{/bin/} hinterlegt.
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsection{/boot/}%
 | 
			
		||||
\label{sec:verzeichnisstrukturen.boot}
 | 
			
		||||
 | 
			
		||||
In dem Verzeichnis \textit{/boot/} befindet sich der Linux Kernel. Der Linux
 | 
			
		||||
Kernel wird als Datei gespeichert. Im Dateinamen aller unterschiedlichen
 | 
			
		||||
Kernelversionen befindet sich in der Regel die folgende Zeichenkette, wenn je
 | 
			
		||||
nach Distribution diese nicht überschrieben wurde: \textit{vmlinux}.
 | 
			
		||||
 | 
			
		||||
% NOTE: Missing reference to chapter where linux system will be booted
 | 
			
		||||
Neben dem Kernel befindet sich in dem Verzeichnis passend zu den installierten
 | 
			
		||||
Kernelversionen noch die Datei \textit{initramdisk}. Sie wird in den
 | 
			
		||||
\acrshort{acr:ram} während des Bootvorgangs geladen und startet den Kernel. Mehr
 | 
			
		||||
zum Bootvorgang unter Linux in einem späteren Kapitel.
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsection{/boot/EFI/}%
 | 
			
		||||
\label{sec:verzeichnisstrukturen.efi}
 | 
			
		||||
 | 
			
		||||
Das Verzeichnis \textit{/boot/EFI} ist ausschließlich bei Systemen vorhanden,
 | 
			
		||||
welches statt der \acrshort{acr:bios} Bootmethode \acrshort{acr:uefi} verwendet.
 | 
			
		||||
Das Verzeichnis beinhalter die unterschiedlichen Bootloader. Beispielweise den
 | 
			
		||||
von Windows, GRUB oder systemd-boot.
 | 
			
		||||
 | 
			
		||||
Ratsam ist es daher das Verzeichnis \textit{/boot/EFI} als seperate Partition zu
 | 
			
		||||
behandeln, sodass wenn mehrere Systeme installiert sind ein und die selbe EFI
 | 
			
		||||
Partition verwendet werden kann. Dies hat den Vorteil, dass ausschließlich eine
 | 
			
		||||
Partition in der Firmware des Motherboards angeben werden muss, damit die
 | 
			
		||||
Firmware die entsprechenden Bootloader von den jeweiligen Systemen findet.
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsection{/dev/}%
 | 
			
		||||
\label{sec:verzeichnisstrukturen.dev}
 | 
			
		||||
 | 
			
		||||
Physische als auch virtuelle Peripheriegeräte, beispielsweise die physisch
 | 
			
		||||
verbaute oder dem Gastsystem zugewiesene virtuelle Festplattte, werden neben
 | 
			
		||||
anderen Geräten im Verzeichnis \textit{/dev/} als Datei abgebildet. Siehe
 | 
			
		||||
Kapitel
 | 
			
		||||
\ref{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen.einfach}, um
 | 
			
		||||
aus der Attributszeichenkette erkennen zu können, bei welcher Datei es sich um
 | 
			
		||||
ein Blockdevice handelt.
 | 
			
		||||
 | 
			
		||||
Auf diese speziellen Dateien kann anschließend mit anderen Programmen
 | 
			
		||||
zugegriffen werden. Beispielsweise das Einbinden eines Blockgerätes (Festplatte)
 | 
			
		||||
an einen beliebigen Einbindungspunkt - siehe \textit{mount} Befehl.
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsection{/etc/}%
 | 
			
		||||
\label{sec:verzeichnisstrukturen.etc}
 | 
			
		||||
 | 
			
		||||
In dem Verzeichnis \textit{/etc/} sind Konfigurationsdateien von Programmen
 | 
			
		||||
enthalten. Im Regelfall werden diese durch die Entwickler bereitgestellt.
 | 
			
		||||
Beispielsweise durch Installation des entsprechenden \acrshortpl{acr:rpm}.
 | 
			
		||||
 | 
			
		||||
Sind keine Konfigurationsdateien für ein Programm im Verzeichnis \textit{/etc/}
 | 
			
		||||
vorhanden. Können diese auch unter \textit{/usr/} gespeichert sein. Ein
 | 
			
		||||
manuelles platzieren der Konfigurationsdateien unter \textit{/etc/} würde das
 | 
			
		||||
Standardverhalten des Programms übersteuern.
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsection{/home/}%
 | 
			
		||||
\label{sec:verzeichnisstrukturen.home}
 | 
			
		||||
 | 
			
		||||
Es ist das Standardverzeichnis für normale bzw. reale Benutzer. Dieses
 | 
			
		||||
Verzeichnis wird manchmal auch mit anderen Linux-Distributionen geteilt, sofern
 | 
			
		||||
das gleiche Heimatverzeichnis von mehreren Benutzern unterschiedliche
 | 
			
		||||
Distributionen verwendet werden soll.
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsection{/lib/}%
 | 
			
		||||
\label{sec:verzeichnisstrukturen.lib}
 | 
			
		||||
 | 
			
		||||
Bibliotheken, welche gemeinsam durch mehrere Programme, welche sich in den
 | 
			
		||||
Verzeichnissen \textit{/bin/} und \textit{/sbin} befinden, geteilt werden,
 | 
			
		||||
werden im Verzeichnis \textit{/lib} gespeichert.
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsection{/media/}%
 | 
			
		||||
\label{sec:verzeichnisstrukturen.media}
 | 
			
		||||
 | 
			
		||||
In dem Verzeichnis \textit{/media/} werden entfernbare Dateisysteme eingebunden.
 | 
			
		||||
Beispielsweise der USB-Stick, eine USB-Festplatte oder eine CD bzw. DVD, welche
 | 
			
		||||
sich im Laufwerk befindet.
 | 
			
		||||
 | 
			
		||||
Desktopmanager wie Gnome, Cinnamon, Xfce oder KDE übernehmen hier die Funktion,
 | 
			
		||||
das Gerät automatisch unter \textit{/media/} einzubinden.
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsection{/mnt/}%
 | 
			
		||||
\label{sec:verzeichnisstrukturen.mnt}
 | 
			
		||||
 | 
			
		||||
Andere Systempartitionen, beispielsweise die C: oder D: Partition von
 | 
			
		||||
Windowssystemen auf einem Dualboot System, werden unter \textit{/mnt/}
 | 
			
		||||
eingebunden. Im Regelfall auch nur temporär, beispielsweise wenn der
 | 
			
		||||
Systemadministrator versucht unter Linux auf die Windowspartitionen zu
 | 
			
		||||
zugreifen.
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsection{/opt/}%
 | 
			
		||||
\label{sec:verzeichnisstrukturen.opt}
 | 
			
		||||
 | 
			
		||||
Das Verzeichnis \textit{/opt} ist das Standardverzeichnis für proprietäre
 | 
			
		||||
Programme und steht für \textit{optional package tree}. In diesem Verzeichnis
 | 
			
		||||
legen daher im Regelfall proprietäre Programme Binär-, Konfigurations-, und
 | 
			
		||||
Bibliotheksdateien ab.
 | 
			
		||||
 | 
			
		||||
Beispielsweise, wenn man einen TeamSpeak 3 Server oder Druckertreiber von
 | 
			
		||||
Brother installieren möchte, werden diese unter \textit{/opt} installiert.
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsection{/root/}%
 | 
			
		||||
\label{sec:verzeichnisstrukturen.root}
 | 
			
		||||
 | 
			
		||||
Der Benutzer \textit{root} besitzt sein eigenes Heimatverzeichnis direkt
 | 
			
		||||
unterhalb des Wurzelverzeichnisses. Es ist das Verzeichnis \textit{/root/}. Es
 | 
			
		||||
wird gesondert geführt und ausschließlich der Benutzer \textit{root} besitzt
 | 
			
		||||
Berechtigungen von dem Verzeichnis zu lesen und zu schreiben als auch es
 | 
			
		||||
betreten zu können.
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsection{/run/}%
 | 
			
		||||
\label{sec:verzeichnisstrukturen.run}
 | 
			
		||||
 | 
			
		||||
Programme, welche ausgeführt werden und Informationen auslagern speichern diese
 | 
			
		||||
im Verzeichnis \textit{/run/}. Dies können beispielsweise Unix-Sockets oder auch
 | 
			
		||||
temporäre Einstellungsparameter sein, welche nur zur Laufzeit des Programms
 | 
			
		||||
vorhanden sind.
 | 
			
		||||
 | 
			
		||||
Die Dateien werden nicht im Verzeichnis \textit{/tmp/} gespeichert, da Dateien
 | 
			
		||||
und Verzeichnisse unter \textit{/tmp/} automatisch entfernt werden können.
 | 
			
		||||
Beispielsweise, wenn das System bemerkt der Speicherplatz geht zur Neige.
 | 
			
		||||
 | 
			
		||||
Der Dienst \textit{systemd-resolved} speichert als gutes Beispiel unter
 | 
			
		||||
\textit{/run/systemd/resolve/resolv.conf} die \textit{resolv.conf} Datei ab,
 | 
			
		||||
welche von \textit{/etc/resolv.conf} per symbolischen link referenziert wird.
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsection{/sbin/}%
 | 
			
		||||
\label{sec:verzeichnisstrukturen.sbin}
 | 
			
		||||
 | 
			
		||||
Das Verzeichnis \textit{/sbin} ist identisch zu dem Verzeichnis \textit{/bin}.
 | 
			
		||||
Es enthält jedoch ausschließlich Programme welche für den Benutzer \textit{root}
 | 
			
		||||
vorgesehen sind.
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsection{/srv/}%
 | 
			
		||||
\label{sec:verzeichnisstrukturen.srv}
 | 
			
		||||
 | 
			
		||||
Stellt das System beispielsweise Mail-, Web- oder andere Dienste bereit, werden
 | 
			
		||||
die persistenten Daten unter \textit{/srv/} gespeichert. Dieses Verzeichnis ist
 | 
			
		||||
nicht automatisch Bestandteil jeder Distribution. Es kann daher sein, das gerade
 | 
			
		||||
bei Distributionen, welche einen minimalistischen Ansatz fahren nicht vorhanden
 | 
			
		||||
ist.
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsection{/tmp/}%
 | 
			
		||||
\label{sec:verzeichnisstrukturen.tmp}
 | 
			
		||||
 | 
			
		||||
Das \textit{/tmp/} Verzeichnis ist der generelle Speicherort für temporäre
 | 
			
		||||
Dateien. Ältere Systeme verwenden eine eigene Partition für das Verzeichnis
 | 
			
		||||
\textit{/tmp/}, um die Größe zu limitieren. Neuere Systeme, welche systemd
 | 
			
		||||
verwenden, richten das Verzeichnis \textit{/tmp/} als
 | 
			
		||||
\nameref{sec:dateisysteme.tmpfs}
 | 
			
		||||
Dateisystem ein und limitieren dieses auf eine prozentuale Größe.
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsection{/usr/}%
 | 
			
		||||
\label{sec:verzeichnisstrukturen.usr}
 | 
			
		||||
 | 
			
		||||
Anwendungen und Dateien die von realen Benutzern verwendet werden, werden im
 | 
			
		||||
Gegensatz zu Anwendungen und Dateien welche vom System verwendet werden, unter
 | 
			
		||||
\textit{/usr/} gespeichert. Aus diesem Grund sind unterhalb von \textit{/usr/}
 | 
			
		||||
auch Verzeichnisse wie \textit{/usr/bin}, \textit{/usr/sbin} oder
 | 
			
		||||
\textit{/usr/lib} enthalten. Alle Unterverzeichnisse von \textit{/usr/} sind für
 | 
			
		||||
Benutzer nur lesbar und betretbar. Dateien sind in der Regel ebenfalls nur
 | 
			
		||||
lesbar eventuell noch ausführbar.
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsection{/var/}%
 | 
			
		||||
\label{sec:verzeichnisstrukturen.var}
 | 
			
		||||
 | 
			
		||||
Der Grundgedanke des Verzeichnisses \textit{/var/} ist, dass es das Gegenstück
 | 
			
		||||
zu \textit{/usr/} abbilden soll. Hier können Benutzer beliebig Dateien oder
 | 
			
		||||
Verzeichnisse erstellen. Allerdings sind können diese Eingeschränkt sein.
 | 
			
		||||
 | 
			
		||||
Ein gutes Beispiel sind Logdateien. Würden Logdateien eines Programms, welche
 | 
			
		||||
aus dem Verzeichnis \textit{/usr/bin} oder \textit{/usr/sbin} ausgeführt werden,
 | 
			
		||||
in das Verzeichnis \textit{/usr/} speichern, würde dies gegen das Konzept des
 | 
			
		||||
Verzeichnisses \textit{/usr/} sprechen. Aus diesem Grund werden Logdateien in
 | 
			
		||||
das Verzeichnis \textit{/var/log} gespeichert.
 | 
			
		||||
							
								
								
									
										404
									
								
								chapters/06-filesystems.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,404 @@
 | 
			
		||||
% <#>---------------------------------------------------------------------------<#>
 | 
			
		||||
\section{Dateisysteme}%
 | 
			
		||||
\label{sec:dateisysteme}
 | 
			
		||||
 | 
			
		||||
Je nach Kernel werden unterschiedliche Dateisysteme unterstützt. Bekannt von
 | 
			
		||||
Windows ist Ihnen bestimmt das \acrfull{acr:ntfs}. Linux unterstützt im
 | 
			
		||||
Gegensatz zum Windows NT Kernel nicht nur ein oder zwei Dateisysteme sondern
 | 
			
		||||
eine große Vielzahl, beispielsweise \acrshort{acr:ext3}, \acrshort{acr:ext4},
 | 
			
		||||
\acrshort{acr:btrfs}, \acrshort{acr:eCryptfs}, \acrshort{acr:reiser} oder XFS.
 | 
			
		||||
 | 
			
		||||
Jedes Dateisystem hat Stärken und Schwächen. Aus diesem Grund werden nicht alle
 | 
			
		||||
Dateisysteme detailiert betrachtet, sondern ausschließlich \acrshort{acr:btrfs},
 | 
			
		||||
welches für Fedora 33 als Standard Dateisystem angekündigt
 | 
			
		||||
ist\footcite{fedora33-btrfs-default} als auch kleinere Dateisysteme, welche
 | 
			
		||||
nicht direkt eine physische oder virtuelle Festplatte vorraussetzen.
 | 
			
		||||
 | 
			
		||||
% #>-------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{BtrFS}%
 | 
			
		||||
\label{sec:dateisysteme.btrfs}
 | 
			
		||||
 | 
			
		||||
Das \acrshort{acr:btrfs} Dateisystem ist ein \acrlong{acr:cow} Dateisystem.
 | 
			
		||||
\acrshort{acr:cow} bedeutet, dass für Dateien, welche kopiert werden, nicht der
 | 
			
		||||
selbe Speicherplatz anfällt. Sie werden stattdessen nur referenziert. Dies hat
 | 
			
		||||
den Vorteil, das Speicherplatz eingespart werden kann. Im Umfeld von
 | 
			
		||||
systemorierntierten Programmiersprachen wie C, Rust oder Go, kann dies mit dem
 | 
			
		||||
Konzept von Pointern verglichen werden. Wobei statt Speicheradressen die
 | 
			
		||||
Dateisystemblöcke referenziert werden, welche die Datei im Dateisystem abbilden.
 | 
			
		||||
 | 
			
		||||
\acrshort{acr:btrfs} bietet mehrere Funktionen an, welche in dem Umfang kein
 | 
			
		||||
anderes Dateisystem anbietet. Hier einige Informationen über \acrshort{acr:btrfs}:
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[itemsep=0pt]
 | 
			
		||||
  \item Dynamisch wachsende Inodes
 | 
			
		||||
  \item Verwaltung von Subvolumes
 | 
			
		||||
  \item Erstellung von Snapshots pro Subvolume
 | 
			
		||||
  \item Datenkompression auf Dateisystemebene
 | 
			
		||||
  \item Dateisystemcheck und Defragmentierung während des Betriebs
 | 
			
		||||
  \item Prüfsummenbasiert
 | 
			
		||||
  \item Integrierte \acrshort{acr:raid} option, wobei nur \acrshort{acr:raid} 0
 | 
			
		||||
  und 1 als stabil zu betrachten sind
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsubsection{Was ist genau BtrFS}%
 | 
			
		||||
\label{sec:dateisysteme.btrfs.erklaerung}
 | 
			
		||||
 | 
			
		||||
Eine \acrshort{acr:btrfs}-Partition stellt eine Volume dar, welches in mehrere
 | 
			
		||||
Subvolume unterteilt werden kann. Subvolumes stehen in ihrer Eigenschaft
 | 
			
		||||
zwischen Partitionen und Verzeichnissen. Partitionen haben eine feste Größe,
 | 
			
		||||
Subvolumes nicht, außer sie werden durch Quotas limitiert. Daher verhalten sich
 | 
			
		||||
Subvolumes ähnlich wie Verzeichnisse.
 | 
			
		||||
 | 
			
		||||
Im Verzeichnisbaum des Systems werden Subvolumes automatisch als Ordner
 | 
			
		||||
eingehängt. In Ubuntu-Derivaten und OpenSUSE hat es sich eingebürgert
 | 
			
		||||
Top-Level-Subvolumen mit einem vorangestellten \textit{@} zu benennen. Dies ist
 | 
			
		||||
eine reine Konvention unter den Nutzern dieser Linux-Derivate und formell nicht
 | 
			
		||||
nötig. Subvolumen bedürfen keiner speziellen Nomenklatur. Es ist sogar
 | 
			
		||||
hinderlich, da jedes Subvolumen welches anders heißt als wie vom System erwartet
 | 
			
		||||
explizit eingehängt werden muss.\footcite{was-ist-btrfs}
 | 
			
		||||
 | 
			
		||||
\acrshort{acr:btrfs} erlaubt zudem das Erstellen von Snapshots. Snapshots
 | 
			
		||||
representieren eine Momentaufnahme eines Subvolumes. Snapshots müssen auf der
 | 
			
		||||
selben \acrshort{acr:btrfs} Partition gespeichert werden wie das Subvolume.
 | 
			
		||||
Enthält ein Subvolume einen Snapshot, enthält der Snapshot nicht rekursiv alle
 | 
			
		||||
Snapshots, welche zum Zeitpunkt der Erstellung vorhanden waren. Da Snapshots
 | 
			
		||||
Momentaufnahmen sind, können diese sehr leicht zurück gespielt werden. Hier ist
 | 
			
		||||
allerdings zu beachten, dass ein Snapshot kein Backup im eigentlichen Sinne ist.
 | 
			
		||||
Backups werden auf physisch getrennte Geräte gespeichert, was bei Snapshots
 | 
			
		||||
nicht der Fall ist.
 | 
			
		||||
 | 
			
		||||
Dateien und Verzeichnisse, welche durch einen Snapshot kopiert werden, belegen
 | 
			
		||||
nicht zusätzlichen Speicherplatz. Sie werden nur von ein oder mehreren Quellen
 | 
			
		||||
referenziert. Folgende Abbildung beschreibt den Prozess und die Referenzierung:
 | 
			
		||||
 | 
			
		||||
\begin{figure}[H]
 | 
			
		||||
  \centering
 | 
			
		||||
  \includegraphics[width=1\textwidth]{img/btrfs-cow.png}
 | 
			
		||||
  \caption{Referenzierung von Speicherblöcken}%
 | 
			
		||||
  \label{fig:dateisysteme.btrfs.referenzierung-von-speicherbloecken}
 | 
			
		||||
\end{figure}
 | 
			
		||||
 | 
			
		||||
Erst wenn alle Referenzen gelöscht sind können die Dateisystemblöcke
 | 
			
		||||
überschrieben werden.
 | 
			
		||||
 | 
			
		||||
% >---------------------------------------------------------------------------<
 | 
			
		||||
\subsubsection{Step-By-Step}%
 | 
			
		||||
\label{sec:dateisysteme.btrfs.step-by-step}
 | 
			
		||||
 | 
			
		||||
Mit dem Befehl \textit{mkfs.btrfs} kann eine \acrshort{acr:btrfs} Dateisystem
 | 
			
		||||
auf einer leeren Partition erstellt werden. Mit dem Befehl \textit{parted} oder
 | 
			
		||||
\textit{fdisk} lassen sich Partitionen einer Festplatte bearbeiten,
 | 
			
		||||
beispielsweise um neue zu erstellen, zu löschen oder deren Größe anzupassen.
 | 
			
		||||
 | 
			
		||||
Bei der Erstellung eines \acrshort{acr:btrfs} Dateisystems wird zwischen Daten
 | 
			
		||||
und Metadaten unterschieden. Bei Daten handelt es um die Daten welche auf der
 | 
			
		||||
Festplatte gespeichert werden. Metadaten enthalten dagegen Informationen, welche
 | 
			
		||||
Datei durch welches Subvolume oder Snapshot referenziert wird. Für beide
 | 
			
		||||
Informationsträgertypen kann zwischen mehreren Profilen unterschieden werden. Es
 | 
			
		||||
können Beispielsweise die Daten auf einem \acrshort{acr:raid}-0 und die
 | 
			
		||||
Metadaten auf einem \acrshort{acr:raid}-1 gespeichert werden. Je nach
 | 
			
		||||
Einsatzszenario kann ein vordefiniertes Profil bei der Erstellung verwendet
 | 
			
		||||
werden. Das verwendete Profil lässt sich nachträglich nicht mehr ändern.
 | 
			
		||||
 | 
			
		||||
Neben den Profilen lassen sich auch weitere Informationen für die
 | 
			
		||||
\acrshort{acr:btrfs} Partition definieren. Beispielsweise das Label oder die
 | 
			
		||||
UUID.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 1a:} Binden Sie über ihren HyperVisor (HyperV,
 | 
			
		||||
  \acrshort{acr:kvm} oder Virtual Box) zwei neue virtuelle Festplatten an ihre
 | 
			
		||||
  VM. Beide virtuelle Festplatten sollen eine Größe von 5GB besitzen. Starten
 | 
			
		||||
  Sie, nachdem Sie die virtuellen Festplatten der VM zugewiesen haben, die
 | 
			
		||||
  Virtuelle Maschine und überprüfen Sie mit \textit{lsblk} (list block devices),
 | 
			
		||||
  ob beide virtuelle Festplatten durch ihre VM erkannt wurden.
 | 
			
		||||
  \item \textbf{Aufgabe 1b:} Welche unterschiedlichen Profile werden von dem
 | 
			
		||||
  \acrshort{acr:btrfs} Dateisystem unterstützt?
 | 
			
		||||
  \item \textbf{Aufgabe 1c:} Erstellen Sie eine neue Partition mit dem
 | 
			
		||||
  Partitionsschema \textit{msdos}. Nutzen Sie zur Partitionierung entweder
 | 
			
		||||
  \textit{parted} oder \textit{fdisk}.
 | 
			
		||||
  \item \textbf{Aufgabe 1d:} Richten Sie ein neues \acrshort{acr:btrfs}
 | 
			
		||||
  Dateisystem ein. Verwenden Sie dazu die beiden virtuellen Festplatten. Die
 | 
			
		||||
  Daten als auch Metadaten sollen als \acrshort{acr:raid}-1 vor einem
 | 
			
		||||
  Festplattenausfall geschützt werden. Verwenden Sie als Label
 | 
			
		||||
  \textit{btrfs-raid-1}.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Physische als auch virtuelle Geräte können an unterschiedlichen Stellen im
 | 
			
		||||
Verzeichnisbaum eingebunden werden. Zum Einbinden eines Gerätes in den
 | 
			
		||||
Verzeichnisbaum wird der Befehl \textit{mount} verwendet. Die allgemeine Syntax
 | 
			
		||||
lautet:
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ mount [-t <typ>, -o <option>] <dev> <mountpoint>
 | 
			
		||||
 | 
			
		||||
# Beispiel, um die Partition vdb1 der virtuellen Festplatte /dev/vdb nach /mnt/vbd1 zu "mounten".
 | 
			
		||||
$ mount /dev/vdb1 /mnt/vdb1
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Weitere Informationen zum Einbinden von Geräten finden Sie in der Dokumentation:
 | 
			
		||||
\textit{man mount}.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 2a:} Erstellen Sie das Verzeichnis \textit{/mnt/btrfs}.
 | 
			
		||||
  \item \textbf{Aufgabe 2b:} Ermitteln Sie, was die Optionen \textit{rw},
 | 
			
		||||
  \textit{noatime}, \textit{compress}, \textit{ssd}, \textit{space\_cache} und
 | 
			
		||||
  \textit{subvol} bedeutet, welche beim Einbinden eines \acrshort{acr:btrfs}
 | 
			
		||||
  Dateisystems verwendet werden können.
 | 
			
		||||
  \item \textbf{Aufgabe 2c:} Binden Sie das \acrshort{acr:btrfs}
 | 
			
		||||
  \acrshort{acr:raid} Dateisystem unter \textit{/mnt/btrfs} ein. Entscheiden Sie
 | 
			
		||||
  selbst, welche Optionen für Sie relevant sind.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Nach einem Neustart des Systems ist das \acrshort{acr:btrfs} Dateisystem nicht
 | 
			
		||||
mehr eingebunden. Sie müssen das Einbinden des Dateisystems per \textit{mount}
 | 
			
		||||
wiederholen oder einen Eintrag in die Datei \textit{/etc/fstab} vornehmen. Dazu
 | 
			
		||||
ermitteln Sie am besten per \textit{blkid} die UUID ihrer btrfs-raid Partition
 | 
			
		||||
und verweden diese in der \textit{fstab}, um die Partition automatisch nach
 | 
			
		||||
einem Neustart einzubinden. Weitere Informationen finden Sie unter folgendem
 | 
			
		||||
\href{https://wiki.archlinux.de/title/Fstab}{Link}.
 | 
			
		||||
 | 
			
		||||
Wie bereits in Kapitel \ref{sec:dateisysteme.btrfs.erklaerung} beschrieben
 | 
			
		||||
untersützt das \acrshort{acr:btrfs} Dateisystem Subvolumes. Auf dem kürzlich
 | 
			
		||||
erstellten \acrshort{acr:btrfs} \acrshort{acr:raid} Dateisystem sollen zukünftig
 | 
			
		||||
Bilder, Musiktitel, Podcasts und Videos gespeichert werden.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 3a:} Erstellen Sie für die Bilder, Musiktitel, Podcasts
 | 
			
		||||
  und Videos ein Subvolume auf dem neuen \acrshort{acr:btrfs}
 | 
			
		||||
  \acrshort{acr:raid} Dateisystem.
 | 
			
		||||
  \item \textbf{Aufgabe 3b}: Überprüfen Sie, ob die Subvolumes erkannt wurden.
 | 
			
		||||
  \item \textbf{Aufgabe 3c:} Löschen Sie das Subvolume Podcasts.
 | 
			
		||||
  \item \textbf{Aufgabe 3d:} Erstellen Sie unterhalb der verbleibenden
 | 
			
		||||
  Subvolumes das Verzeichnis \textit{.snapshots}.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Nachdem Sie nun die drei Subvolumes mit dem Unterverzeichnis \textit{.snapshots}
 | 
			
		||||
erstellt haben kommen wir an den Punkt Snapshots zu erstellen. Snapshots sind
 | 
			
		||||
Grundsätzlich nichts anderes als Subvolumes. Sie referenzieren auf die gleichen
 | 
			
		||||
Dateien, welches sich zum Zeitpunkt des Snapshots im Subvolume befanden. Die
 | 
			
		||||
Dateien innerhalb eines Snapshots lassen sich bearbeiten und modifizieren ohne
 | 
			
		||||
dabei die Dateien innerhalb des Subvolumes zu beeinträchtigen. Dies ist jedoch
 | 
			
		||||
nicht immer gewünscht, da dadurch ein Snapshot nicht mehr der Momentaufnahme
 | 
			
		||||
entspricht. Aus diesem Grund kann das nachträgliche Editieren von Dateien
 | 
			
		||||
innerhalb eines Snapshots unterbunden werden.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 4a:} Erstellen Sie einen \textit{read-only} Snapshot von
 | 
			
		||||
  jedem Subvolume, um ein nachträgliches Editieren von Dateien in den Snapshots
 | 
			
		||||
  zu unterbinden. Speichern Sie den Snapshot in das Verzeichnis
 | 
			
		||||
  \textit{.snapshots} des jeweiligen Subvolumes mit dem Namensschema
 | 
			
		||||
  \textit{$<nameSubvolume>.<jahr><monat><tag>T<stunde><minute>$} ab.
 | 
			
		||||
  \item \textbf{Aufgabe 4b:} Überprüfen Sie, ob die Snapshots als Subvolumes
 | 
			
		||||
  erkannt wurden.
 | 
			
		||||
  \item \textbf{Aufgabe 4c:} Löschen Sie das Subvolume von dem Sie einen
 | 
			
		||||
  Snapshot erstellt haben.
 | 
			
		||||
  \item \textbf{Aufgabe 4d:} Stellen Sie mithilfe des Snapshots das Subvolume
 | 
			
		||||
  wieder her.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Nun, ein Snapshot ist kein Backup. Ein Backup ist die Sicherung eines Zustands
 | 
			
		||||
auf einem anderen physischen Gerät, beispielsweise einer zweiten angeschlossenen
 | 
			
		||||
Festplatte oder einem entfernten System. Um ein Backup zu erstellen enthält das
 | 
			
		||||
Programm \textit{btrfs} den Unterbefehl \textit{send}. Damit kann ein Snapshot
 | 
			
		||||
in eine Datei exportiert werden. Neben dem Unterkommando \textit{send} enthält
 | 
			
		||||
es unter anderem auch das Unterkommando \textit{receive}, um Snapshots aus einer
 | 
			
		||||
Datei zu importieren.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 5a:} Exportieren Sie einen kürzlich erstellten Snapshot
 | 
			
		||||
  per \textit{btrfs send} in eine Datei.
 | 
			
		||||
  \item \textbf{Aufgabe 5b:} Löschen Sie den Snapshot.
 | 
			
		||||
  \item \textbf{Aufgabe 5c:} Stellen Sie den gesicherten Snapshot aus der Datei
 | 
			
		||||
  wieder her.
 | 
			
		||||
  \item \textbf{Aufgabe 5d:} Kopieren Sie per \textit{scp} von dem SSH-Server
 | 
			
		||||
  der Hochschule die Datei
 | 
			
		||||
  \textit{/dozenten/peschm/linux\_ws2021/videos.20201027T223646.snapshot} in
 | 
			
		||||
  ihre VM. Spielen Sie den Snapshot unter dem Subvolume \textit{videos} wieder
 | 
			
		||||
  ein. Schauen Sie sich das darin enthaltene Video an ;) Eventuell muss das
 | 
			
		||||
  Video auf ein anderes System kopiert werden, da ihre VM keinen Mediaplayer
 | 
			
		||||
  besitzt.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Die Snapshots können nun durch ein Skript erstellt und gelöscht werden, als auch
 | 
			
		||||
das letzte Backup auf ein entferntes System oder eine zweite Festplatte
 | 
			
		||||
exportiert werden. Doch warum sollte man sich die Arbeit machen solch ein Skript
 | 
			
		||||
zu erstellen, wenn andere bereits ein Program daraus gemacht haben.
 | 
			
		||||
 | 
			
		||||
Mit dem Programm \textit{btrbk} können Snapshots und Backups je nach Szenario
 | 
			
		||||
verwaltet werden. Der Quellcode des Programms ist auf
 | 
			
		||||
\href{https://github.com/digint/btrbk}{github.com} verfügbar, dort sind neben
 | 
			
		||||
den Konfigurationsoptionen auch mögliche Szenarien, welche das Programm abdeckt,
 | 
			
		||||
beschrieben.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 6a:} Installieren Sie das Programm \textit{btrbk} mit
 | 
			
		||||
  \textit{yum}.
 | 
			
		||||
  \item \textbf{Aufgabe 6b:} Informieren Sie sich über die \textit{README.md}
 | 
			
		||||
  Datei, welche möglichen Szenarien durch \textit{btrbk} abgedeckt werden.
 | 
			
		||||
  \item \textbf{Aufgabe 6c:} Konfigurieren Sie \textit{btrbk}, dass von den
 | 
			
		||||
  Subvolumes Bilder, Musiktitel und Videos stündlich ein Snapshot in das
 | 
			
		||||
  jeweilige \textit{.snapshots} Verzeichnis erstellt wird. Eine
 | 
			
		||||
  Beispielkonfiguration liegt unter \textit{/etc/btrbk}. Weitere Informationen
 | 
			
		||||
  finden Sie in der ausführlich dokumentierten
 | 
			
		||||
  \href{https://digint.ch/btrbk/doc/archive/}{Dokumentation}.
 | 
			
		||||
  \item \textbf{Aufgabe 6d:} Passen Sie die Konfiguration so an, dass die
 | 
			
		||||
  Snapshots der folgenden Ausbewahrungsrichtlinie entspricht. Die letzen 24
 | 
			
		||||
  stündliche, 14 tägliche, 4 wöchentliche, 12 monatliche und jährliche Snapshots
 | 
			
		||||
  sollen behalten werden, um dem Großvater-Vater-Kind Prinzip zu entsprechen.
 | 
			
		||||
  \item \textbf{Aufgabe 6e:} Passen Sie ggfl. das Namensschema der Snapshots an,
 | 
			
		||||
  sodass es dem Namensschema von Aufgabe 4a entspricht.
 | 
			
		||||
  \item \textbf{Aufgabe 6f:} Starten Sie \textit{btrbk} per \textit{btrbk run -c
 | 
			
		||||
  /etc/btrbk/btrbk.conf run} und überprüfen Sie in der Ausgabe als auch im
 | 
			
		||||
  Dateisystem, ob die Snapshots erstellt wurden.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>-------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{overlayfs}%
 | 
			
		||||
\label{sec:dateisysteme.overlayfs}
 | 
			
		||||
 | 
			
		||||
Overlayfs ermöglicht die Überlagerung eines Verzeichnisbaums mit einem anderen
 | 
			
		||||
Verzeichnisbaum. Alle Änderungen gehen in die höhere beschreibbare Ebene.
 | 
			
		||||
Dadurch können mehrere Verzeichnisbäume basieren auf unterschiedlichen und
 | 
			
		||||
wiederverwendbaren Ebenen abgebildet werden. Diese Art von Mechanismus wird
 | 
			
		||||
vorwiegend für Container Applikationen verwendet. Es gibt jedoch auch eine
 | 
			
		||||
Vielzahl anderer Verwendungsmöglichkeiten.
 | 
			
		||||
 | 
			
		||||
Um overlayfs anhand eines Beispiels einfacher zu erklären betrachten wir den
 | 
			
		||||
Entwicklungsprozess einer Applikation mit allen notwendigen Dateien. Notwendig
 | 
			
		||||
für die Ausführung der Applikation ist die Binärdatei (das eigentliche
 | 
			
		||||
Programm), die Konfigurationsdateien, das Logverzeichnis und die systemd unit
 | 
			
		||||
Dateien, welche beschreiben wie das Programm unter einem systemd basierenden
 | 
			
		||||
System gestartet werden soll. Optional können noch Plugins bereitgestellt
 | 
			
		||||
werden.
 | 
			
		||||
 | 
			
		||||
Alle Dateien bzw. Plugins werden im Entwicklungsprozess in einem eigenen
 | 
			
		||||
Verzeichnisbaum gespeichert. Jeder Verzeichnisbaum wird durch eine Ebene
 | 
			
		||||
repräsentiert. Dies entspricht einem modularem Aufbau, da die Verzeichnisbäume
 | 
			
		||||
individuell wiederverwendet oder ausgetauscht werden können.
 | 
			
		||||
 | 
			
		||||
Die folgende Abbildung beschreibt den modularen Aufbau der Applikation mit allen
 | 
			
		||||
notwendigen Ebenen. Jede Ebene (layer) wird lesend über die vorherige Ebene
 | 
			
		||||
überlagert. Links befindet sich die Applikation ohne Plugins, rechts mit
 | 
			
		||||
Plugins, welche zusätzlich als seperate Ebene abgebildet sind und nicht
 | 
			
		||||
verändert werden können. Die horizontale Linie markiert den Punkt, ab wann
 | 
			
		||||
unterschiedliche Ebenen verwendet werden. Die oberste Ebene (workspace) ist
 | 
			
		||||
beschreibbar, um Konfigurationsdateien anzupassen oder damit das Programm
 | 
			
		||||
Logeinträge in die Logdateien schreiben kann.
 | 
			
		||||
 | 
			
		||||
\begin{figure}[H]
 | 
			
		||||
  \centering
 | 
			
		||||
  \includegraphics[width=0.55\textwidth]{img/overlayfs.png}
 | 
			
		||||
  \caption{Aufbau eines OverlayFS mit mehreren wiederverwendeten Ebenen}%
 | 
			
		||||
  \label{fig:dateisysteme.overlayfs.aufbau-mit-mehreren-ebenen}
 | 
			
		||||
\end{figure}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 7a:} Erstellen Sie folgendes Arbeitsverzeichnis und
 | 
			
		||||
  wechseln die dort hinein: \textit{/root/workspace/overlayfs}.
 | 
			
		||||
  \item \textbf{Aufgabe 7b:} Erstellen Sie folgende Dateien und Verzeichnisse
 | 
			
		||||
  unterhalb ihres Arbeitsverzeichnisses:
 | 
			
		||||
 | 
			
		||||
  \begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
    \item \textbf{Aufgabe 7b$_1$:} Die \glqq{}Binärdatei\grqq{}:\\
 | 
			
		||||
    \textit{./lower\_0/usr/bin/mybin}.
 | 
			
		||||
    \item \textbf{Aufgabe 7b$_2$:} Die globale Konfigurationsdatei:\\
 | 
			
		||||
    \textit{./lower\_1/etc/mybin/config.json}.
 | 
			
		||||
    \item \textbf{Aufgabe 7b$_3$:} Die Logdatei:\\
 | 
			
		||||
    \textit{./lower\_2/var/log/mybin/info.log}
 | 
			
		||||
    \item \textbf{Aufgabe 7b$_4$:} Die systemd unit Dateien:\\
 | 
			
		||||
    \textit{./lower\_3/usr/lib/systemd/system/mybin.service}
 | 
			
		||||
    \item \textbf{Aufgabe 7b$_5$:} Die Konfigurationsdatei für das sqlite Plugin:\\
 | 
			
		||||
    \textit{./lower\_4/etc/mybin/conf.d/sqlite.config}
 | 
			
		||||
    \item \textbf{Aufgabe 7b$_6$:} Die Konfigurationsdatei für das postgresql
 | 
			
		||||
    Plugin:\\
 | 
			
		||||
    \textit{./lower\_5/etc/mybin/conf.d/postgresql.config}
 | 
			
		||||
  \end{itemize}
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Um mehrere Verzeichnisbäume überlagernd einzubinden ist folgende allgemeine
 | 
			
		||||
Syntax notwendig:
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ mount -t overlay -o lowerdir=<path_lowerdir1>:<path_lowerdir2>:... ,upperdir=<path>,workdir=<path> overlayfs <path>
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Das Flag \textit{-t} gibt den Typ an. Mit dem Flag \textit{-o} werden Optionen
 | 
			
		||||
definiert. Der Option lowerdir kann eine Liste von Pfaden übergeben werden,
 | 
			
		||||
gerennt durch einen Doppelpunkt, um zu defineren welche Verzeichnisbäume
 | 
			
		||||
überlagert werden sollen. Dabei ist die Reihenfolge zu beachten. Upperdir
 | 
			
		||||
entspricht dem workspace der Abbildung, sprich das spätere beschreibbare
 | 
			
		||||
Verzeichnis. Als workdir muss der Pfad zu einem leeren Verzeichnis angegeben
 | 
			
		||||
werden, indem der Prozess für den Überlagerungsvorgang Dateien zwischenspeichern
 | 
			
		||||
kann. Das zweite Argument entspricht dem Pfad im Dateisystem, andem der
 | 
			
		||||
überlagerte Verzeichnisbaum eingebunden werden soll.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 7c:} Binden Sie mithilfe des \textit{mount} Befehls das
 | 
			
		||||
  OverlayFS Dateisystem bestehend aus allen notwendigen Ebenen unter
 | 
			
		||||
  \textit{./application} und \textit{./application\_plugins} ein, um einmal den
 | 
			
		||||
  notwendigen Verzeichnisbaum für die Applikation mit und ohne Plugin ab zu
 | 
			
		||||
  bilden. Vergewissern Sie sich, dass alle notwendigen Verzeichnisse vorhanden
 | 
			
		||||
  sind. Verwenden Sie die unterschiedlichen Verzeichnisbäume bzw. Ebenen wieder.
 | 
			
		||||
  \item \textbf{Aufgabe 7d:} Erstellen Sie unter \textit{./application} das
 | 
			
		||||
  Verzeichnis \textit{hello-world}. Überprüfen Sie, ob das Verzeichnis in einer
 | 
			
		||||
  der Ebenen, welche als lesende Verzeichnisbäume eingebunden wurden, erstellt
 | 
			
		||||
  wurde.
 | 
			
		||||
  \item \textbf{Aufgabe 7e:} Löschen Sie unter \textit{./application\_plugins}
 | 
			
		||||
  die plugin Konfigurationsdateien. Überprüfen Sie anschließend ob in der
 | 
			
		||||
  entsprechenden Ebene ebenfalls die Konfigurationsdatei gelöscht wurde. Diese
 | 
			
		||||
  dürfte nach dem Konzept nicht gelöscht worden sein.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Dateisysteme von Container Applikationen sind genau nach diesem Konzept
 | 
			
		||||
aufgebaut. Die Stärke liegt jedoch nicht nur in dem modularen Dateisystemaufbau
 | 
			
		||||
oder der Isolierung von Ressourcen - sprich CPU, \acrshort{acr:ram}, Storage,
 | 
			
		||||
ect., sondern auch darin, dass die Ebenen sich leicht von einem System auf ein
 | 
			
		||||
anderes übertragen lassen. Man spricht bei diesem Abschnitt in der Entwicklung
 | 
			
		||||
einer Applikation von Deployment. Dabei gilt, dass die beste Software die
 | 
			
		||||
schlechteste sein kann, wenn der Anwender nicht in der Lage ist, sie ohne große
 | 
			
		||||
Umstände installieren oder ausführen zu können.
 | 
			
		||||
 | 
			
		||||
Container Runtimes wie containerd, crio oder runc bemächtigen sich der Funktion
 | 
			
		||||
Subvolumes des darunter liegenden BtrFS Dateisystems zu importieren bzw.
 | 
			
		||||
exportieren, da dadurch Verzeichnisbäume einfach von einem System auf ein
 | 
			
		||||
anderes kopiert werden können. Ebenen bzw. Layer werden dann als eigenständiges
 | 
			
		||||
Subvolume betrachtet.
 | 
			
		||||
 | 
			
		||||
Finden Container Runtimes auf dem System kein BtrFS Dateisystem vor, werden die
 | 
			
		||||
Verzeichnisbäume unterhalb eines Verzeichnisses im Dateisystem gespeichert.
 | 
			
		||||
Ähnlich wie es bei der Übung veranschaulicht wurde. Dies hat jedoch den
 | 
			
		||||
Nachteil, dass identische Dateien, welche in mehreren Ebenen bzw. Layern
 | 
			
		||||
wiederverwendet werden zusätzlichen Speicherplatz auf der Festplatte
 | 
			
		||||
verbrauchen.
 | 
			
		||||
 | 
			
		||||
% #>-------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{tmpfs}%
 | 
			
		||||
\label{sec:dateisysteme.tmpfs}
 | 
			
		||||
 | 
			
		||||
\textit{tmpfs} ist ein Dateisystem im \acrshort{acr:ram}. Es wird gerne
 | 
			
		||||
verwendet, wenn große IO Operationen stattfinden oder das Dateisystem nur
 | 
			
		||||
während der Laufzeit des Systems benötigt wird.
 | 
			
		||||
 | 
			
		||||
Da dieses Dateisystem sich im \acrshort{acr:ram} befindet, sind sehr schnelle
 | 
			
		||||
Zugriffszeiten keine Seltenheit mehr. Bei einfachen Rechnern mit DDR4 kann man
 | 
			
		||||
schon mit 10GiB/Sekunde rechnen. Typischer Anwendungsfall ist, wenn ein Programm
 | 
			
		||||
durch einen Kompiler kompiliert wird und der Vorgang hohe I/O Operationen auf der
 | 
			
		||||
Festplatte verursacht. Hinsichtlich der verbauten Festplatte wird gerade dadurch
 | 
			
		||||
die Lebenszeit erheblich erhöht.
 | 
			
		||||
 | 
			
		||||
Mit dem folgenden Befehl wird ein neues Dateisystem mit einer Größe von 512MB im
 | 
			
		||||
\acrshort{acr:ram} erstellt. Dieses wird anschließend nach \textit{/mnt/tmpfs}
 | 
			
		||||
eingebunden. Mit dem Befehl \textit{findmnt} können die Optionen des
 | 
			
		||||
\textit{tmpfs} Dateisystems überprüft werden.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ mkdir --parent /mnt/tmpfs
 | 
			
		||||
$ mount -t tmpfs -o rw,relatime,size=512M tmpfs /mnt/tmpfs
 | 
			
		||||
$ findmnt /mnt/tmpfs
 | 
			
		||||
TARGET     SOURCE FSTYPE OPTIONS
 | 
			
		||||
/mnt/tmpfs tmpfs  tmpfs  rw,relatime,seclabel,size=524288k
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Dateien und Verzeichnisse, welche sich in einem tmpfs Dateisystem befinden sind
 | 
			
		||||
nach einem Neustart des Systems verloren. Sie sind nicht wiederherstellbar.
 | 
			
		||||
							
								
								
									
										204
									
								
								chapters/07-backups.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,204 @@
 | 
			
		||||
% <#>---------------------------------------------------------------------------<#>
 | 
			
		||||
\section{Backup}%
 | 
			
		||||
\label{sec:backup}
 | 
			
		||||
 | 
			
		||||
Sicherlich hat jeder schon einmal schmerzlichst erfahren müssen, wie ärgerlich
 | 
			
		||||
es ist, wenn Daten verloren gegangen sind und diese nicht durch ein Backup
 | 
			
		||||
gesichert wurden. Der Schmerz sitzt tief, wenn die Urlaubsbilder, Kinderfotos
 | 
			
		||||
oder andere wichtige Dokumente verloren sind. Man ärgert sich häufig über sich
 | 
			
		||||
selber, da man wusste, dass dieser Moment früher oder später mal eintreten würde
 | 
			
		||||
und man es bis dahin nicht geschafft hat ein Backup zu erstellen.
 | 
			
		||||
 | 
			
		||||
In Kapitel \nameref{sec:dateisysteme.btrfs} wurden Snapshots von Subvolumes
 | 
			
		||||
erzeugt. Dies Snapshots können nicht direkt als ein Backup betrachtet werden,
 | 
			
		||||
obwohl sie eine Momentaufnahme eines Subvolumes wiederspiegeln. Der Grund ist,
 | 
			
		||||
dass unter einem Backup die Sicherung eines Zustands auf einem anderen
 | 
			
		||||
Speichergerät verstanden wird. Dies kann beispielsweise auf eine andere
 | 
			
		||||
Festplatte oder ein Magnetband per Bandlesegerät realisiert werden.
 | 
			
		||||
 | 
			
		||||
Früher wurden Bandlesegeräte sehr häufig eingesetzt, um große Datenmengen zu
 | 
			
		||||
sichern. Diese Methode wird zunehmend ersetzt durch andere Technologien wie
 | 
			
		||||
Beispielsweise das exportieren und importieren von Snapshots. Dies muss nicht
 | 
			
		||||
zwingend ein BtrFS Dateisystem sein, es kann auch ein ZFS oder QCOW2 Dateisystem
 | 
			
		||||
sein. Aus der Zeit, in der Bandlaufgeräte vorwiegend Verwendung fanden, sind
 | 
			
		||||
unterschiedliche Backup Methoden entstanden.
 | 
			
		||||
 | 
			
		||||
Je nach Datenbestand wurden unterschiedliche Methoden angewand oder kombiniert,
 | 
			
		||||
um die Vorteile je nach Situation auszunutzen. Nachfolgend werden die einzelnen
 | 
			
		||||
Methoden näher erläutert.
 | 
			
		||||
 | 
			
		||||
% #>-----------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{Inkrementelles Backup}%
 | 
			
		||||
\label{sec:backup.inkrementell}
 | 
			
		||||
 | 
			
		||||
Ein inkrementelles Backup setzt ein bestehendes Backup der Daten vorraus. Dies
 | 
			
		||||
kann ein Vollbackup, differentielles oder inkrementelles Backup sein. Es werden
 | 
			
		||||
ausschließlich die Daten gesichert, welche sich zum Zeitpunkt des letzten
 | 
			
		||||
Backups geändert haben. Zum Wiederherstellen des Datenbestandes werden somit
 | 
			
		||||
alle Backups benötigt, da die Änderungen sequenziell eingespielt werden müssen.
 | 
			
		||||
 | 
			
		||||
Dies führt beim dem Einsatz von Magnetbändern gerade dazu, dass Administratoren
 | 
			
		||||
panisch auf die Suche nach den Magnetbändern gehen, wenn Daten vergangener Jahre
 | 
			
		||||
wiedergerstellt werden müssen. Grund für die Aufregung ist, dass wenn ein Backup
 | 
			
		||||
oder Magnetband fehlt die Wiederherstellung der gesicherten Daten nicht möglich
 | 
			
		||||
ist.
 | 
			
		||||
 | 
			
		||||
Die folgende Abbildung beschreibt den Speicherverbrauch pro Wochentag und hebt
 | 
			
		||||
hervor, welche Änderungen in welchem inkrementellen Backup gesichert sind.
 | 
			
		||||
 | 
			
		||||
\begin{figure}[H]
 | 
			
		||||
  \centering
 | 
			
		||||
  \includegraphics[width=1\textwidth]{img/inkrementell-backup.png}
 | 
			
		||||
  \caption{Inkrementelle Backups}%
 | 
			
		||||
  \label{fig:backup.inkrementell}
 | 
			
		||||
\end{figure}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Vorteile:}
 | 
			
		||||
  \begin{enumerate}[itemsep=0pt]
 | 
			
		||||
    \item Sehr einfaches Verfahren
 | 
			
		||||
    \item Niedriger Speicherbedarf. Die Backups sind wesentlich kleiner als
 | 
			
		||||
    differentielle oder Vollbackups. Es werden daher auch Magnetbänder mit
 | 
			
		||||
    geringerer Kapazität benötigt. Kosten können so gesenkt werden.
 | 
			
		||||
    \item Das Erstellen der Sicherung ist im Vergleich zu den anderen Methoden
 | 
			
		||||
    schneller erstellt, da nur die letzten Änderungen gesichert werden müssen.
 | 
			
		||||
  \end{enumerate}
 | 
			
		||||
  \item \textbf{Nachteile:}
 | 
			
		||||
  \begin{enumerate}[itemsep=0pt]
 | 
			
		||||
    \item Das Vollbackup und \textbf{alle} inkrementellen Backups sind
 | 
			
		||||
    notwendig, um einen Zeitpunkt wiederherzustellen.
 | 
			
		||||
  \end{enumerate}
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>-----------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{Differenzielles Backup}%
 | 
			
		||||
\label{sec:backup.differentiell}
 | 
			
		||||
 | 
			
		||||
Das differentielle Backup ist dem inkrementellen Backup sehr ähnlich. Es werden
 | 
			
		||||
jedoch nicht die Änderungen zu jedem letzten beliebigen Backup gesichert,
 | 
			
		||||
sondern ausschließlich zum letzten Vollbackup. Demnach ist zur Wiederherstellung
 | 
			
		||||
der Daten das letzte Vollbackup und das gewünschte differentielle Backup
 | 
			
		||||
notwendig. Die folgende Abbildung spiegelt wie Abbildung
 | 
			
		||||
\ref{fig:backup.inkrementell} den Speicherverbrauch pro Wochentag ab und hebt
 | 
			
		||||
hervor, welche Änderungen in welchem differenziellen Backups gesichert sind.
 | 
			
		||||
 | 
			
		||||
\begin{figure}[H]
 | 
			
		||||
  \centering
 | 
			
		||||
  \includegraphics[width=1\textwidth]{img/differentielles-backup.png}
 | 
			
		||||
  \caption{Differenzielle Backups}%
 | 
			
		||||
  \label{fig:backup.differentiell}
 | 
			
		||||
\end{figure}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Vorteile:}
 | 
			
		||||
  \begin{enumerate}[itemsep=0pt]
 | 
			
		||||
    \item Weniger Speicherbedarf als bei einem Vollbackup, aber mehr als bei
 | 
			
		||||
    einem inkrementellen Backup
 | 
			
		||||
    \item Zur Wiederherstellung wird nur das letzte Vollbackup und das
 | 
			
		||||
    differentielle Backup zum gewünschten Zeitpunkt benötigt.
 | 
			
		||||
  \end{enumerate}
 | 
			
		||||
  \item \textbf{Nachteile:}
 | 
			
		||||
  \begin{enumerate}[itemsep=0pt]
 | 
			
		||||
    \item Dateien, die einmal verändert werden, müssen bei jedem differentiellen
 | 
			
		||||
    Backup neu gesichert werden. Dadurch entsteht ein höheres Datenaufkommen.
 | 
			
		||||
  \end{enumerate}
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>-----------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{Vollbackup}%
 | 
			
		||||
\label{sec:backup.vollbackup}
 | 
			
		||||
 | 
			
		||||
Bei einem Vollbackup wird der komplette Datenbestand gesichert. Um verlorene
 | 
			
		||||
Daten wiederherzustellen wird nur das entsprechende Vollbackup benötigt. Die
 | 
			
		||||
folgende Abbildung beschreibt das Wachstum der Vollbackups pro Tag.
 | 
			
		||||
 | 
			
		||||
\begin{figure}[H]
 | 
			
		||||
  \centering
 | 
			
		||||
  \includegraphics[width=1\textwidth]{img/vollbackups.png}
 | 
			
		||||
  \caption{Vollbackups}%
 | 
			
		||||
  \label{fig:backup.vollbackup}
 | 
			
		||||
\end{figure}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Vorteile:}
 | 
			
		||||
  \begin{enumerate}[itemsep=0pt]
 | 
			
		||||
    \item Sehr einfache Wiederherstellung
 | 
			
		||||
    \item Nur das jeweilige Backup bzw. Band notwendig
 | 
			
		||||
  \end{enumerate}
 | 
			
		||||
  \item \textbf{Nachteile:}
 | 
			
		||||
  \begin{enumerate}[itemsep=0pt]
 | 
			
		||||
    \item Sehr hoher Speicherverbrauch
 | 
			
		||||
    \item Um auf mehrere Versionen zurückgreifen zu können wird das jeweilige
 | 
			
		||||
    Backup benötigt.
 | 
			
		||||
  \end{enumerate}
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>-----------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{Großvater-Vater-Sohn Prinzip}%
 | 
			
		||||
\label{sec:backup.gvs-prinzip}
 | 
			
		||||
 | 
			
		||||
Das Großvater-Vater-Sohn Prinzip, auch Generationen Prinzip genannt, ist ein
 | 
			
		||||
Rotationsverfahren für Magnetbänder, um mit möglichst wenigen Magnetbändern den
 | 
			
		||||
Zugriff auf ältere Sicherungszustände zu gewährleisten.
 | 
			
		||||
 | 
			
		||||
Als Sohn-Sicherung werden die täglichen Sicherungen von Montag bis Donnerstag
 | 
			
		||||
beschrieben. Dies sind in der Regel inkrementelle Sicherungen. Die Sicherung,
 | 
			
		||||
welche Freitags erstellt wird, ist die erste Vater-Sicherung. Für die erste
 | 
			
		||||
Woche sind daher fünf Magnetbänder notwendig.
 | 
			
		||||
 | 
			
		||||
Wird nun bei der Vater-Sicherung ein differentielles Backup erstellt, sind die
 | 
			
		||||
Änderungen, welche in der Woche angefallen sind inkludiert. Dies bedeutet, dass
 | 
			
		||||
die Sicherungsbänder von Montag bis Donnerstag in der zweiten Woche
 | 
			
		||||
wiederverwendet und überschrieben werden können.
 | 
			
		||||
 | 
			
		||||
Daraus folgt, dass ein sechstes Band für die 2. Vater-Sicherung in der 2. Woche
 | 
			
		||||
notwendig ist. Dies geht so für die 3. und 4. Woche des Monats weiter. Es
 | 
			
		||||
resultiert daher für einen Monat, dass vier Sicherungsbänder für die
 | 
			
		||||
Sohn-Sicherungen und vier Sicherungsbänder für die Vater-Sicherungen notwendig
 | 
			
		||||
sind. Also insgesamt acht Bänder.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 1a:} Gehen Sie davon aus, dass zu Beginn des Monats ein
 | 
			
		||||
  Vollbackup des vergangenen Monats existiert. Geben Sie tabellarisch oder
 | 
			
		||||
  grafisch für den aktuellen Monat an, an welchen Tagen, welches Band und
 | 
			
		||||
  Backup-Methode verwendet wird, um dem Vater-Sohn Prinzip zu entsprechen.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Am letzten Tag im Monat wird die Sohn- oder Vater-Sicherung durch die
 | 
			
		||||
Großvater-Sicherung ersetzt. Die Großvater-Sicherung ist im Regelfall ein
 | 
			
		||||
Vollbackup. Anschließend wird wieder mit der Sohn- und Vater-Sicherung für den
 | 
			
		||||
nächsten Monat fortgefahren. Da die Großvater-Sicherung alle Änderungen des
 | 
			
		||||
letzten Monats beinhaltet, kann die Sohn-Sicherung als auch die Vater-Sicherung
 | 
			
		||||
im nächsten Monat überschrieben werden. Daraus resultiert, dass zusätzlich 12
 | 
			
		||||
Bänder für jeden Monat benötigt werden. Insgesamt also 20 Bänder pro Jahr.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 1b:} Geben Sie für drei Monate tabellarisch oder
 | 
			
		||||
  grafisch die Tage an, welches Band und Backup-Methode verwendet wird, um dem
 | 
			
		||||
  Großvater-Vater Prinzip zu entsprechen.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>-----------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{Praxisaufgabe: Die nette Kollegin}%
 | 
			
		||||
\label{sec:backup.praxisfall}
 | 
			
		||||
 | 
			
		||||
In dem Unternehmen, indem Sie tätig sind wird nicht Ende des Monats, sondern an
 | 
			
		||||
dem ersten Freitag im Monat, die Großvater-Sicherung erstellt. Die letzte
 | 
			
		||||
Großvater-Sicherung wurde vergangenen Freitag, den 6. November 2020, erstellt.
 | 
			
		||||
 | 
			
		||||
Eine Kollegin aus der Finanzabteilung hat Sie schriftlich informiert, dass der
 | 
			
		||||
letzte Praktikant ein Verzeichnis gelöscht hat, welches Sie nun benötigt. Das
 | 
			
		||||
Beschäftigungsverhältnis des Praktikanten fing vor drei Monaten, zwei Wochen und
 | 
			
		||||
einem Tagen, ausgehend von der letzen Großvater-Sicherung, an. Gehen Sie davon
 | 
			
		||||
aus, dass die Dateien zu diesem Zeitpunkt vorhanden waren.
 | 
			
		||||
 | 
			
		||||
Welche Bänder sind notwendig, um die Dateien und Verzeichnisse für die Kollegin
 | 
			
		||||
aus der Finanzabteilung wiederherzustellen?
 | 
			
		||||
 | 
			
		||||
Ihr Chef traut ihnen nun das Wiederherstellen von Daten zu. Prompt erhalten Sie
 | 
			
		||||
einen Anruf, dass die Daten welche sie wiederhergestellt haben nicht in der
 | 
			
		||||
Version vorliegt, welche die nette Kollegin erwartet hat. Sie hat sie angewiesen
 | 
			
		||||
die Daten vom 28. Oktober 2020 wiederherzustellen.
 | 
			
		||||
 | 
			
		||||
Welche Bänder sind notwendig, um die Daten und Verzeichnisse vom 28. Oktober
 | 
			
		||||
2020 wiederherzustellen?.
 | 
			
		||||
							
								
								
									
										649
									
								
								chapters/08-textprocessing.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,649 @@
 | 
			
		||||
% <#>---------------------------------------------------------------------------<#>
 | 
			
		||||
\section{Text Processing}%
 | 
			
		||||
\label{sec:text-processing}
 | 
			
		||||
 | 
			
		||||
Unter Text Processing versteht man das Einlesen, Filtern, Modifizieren und
 | 
			
		||||
Umleiten von Dateien oder Streams. Dieses Kapitel behandelt daher die gängigen
 | 
			
		||||
Programme, welche ein Linux Systemadministrator oder Entwickler als sein
 | 
			
		||||
Handwerkszeug betrachten würde.
 | 
			
		||||
 | 
			
		||||
Bevor jedoch die Programme erklärt werden, sind die Grundlagen von Umleitungen
 | 
			
		||||
und Befehlsverkettungen notwendig.
 | 
			
		||||
 | 
			
		||||
% <#>---------------------------------------------------------------------------<#>
 | 
			
		||||
\subsection{Umleitungen und Befehlsverkettungen}
 | 
			
		||||
\label{sec:text-processing.redirections}
 | 
			
		||||
 | 
			
		||||
Nachfolgend wird der Begriff Befehlsverkettung oder auch Kommandoverkettung
 | 
			
		||||
anhand von Syntax Beispielen näher erläutert.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \bashinline{cmd1 | cmd2} \\
 | 
			
		||||
  Die \textit{Pipe} verbindet die Standard-Ausgabe (\textit{stdout}) eines
 | 
			
		||||
  Programms mit der Eingabe (\textit{stdin}) eines anderen Programms.
 | 
			
		||||
  \item \bashinline{cmd1 ; cmd2} \\
 | 
			
		||||
  Führt erst das Programm \textit{cmd1} aus und anschließend das Programm
 | 
			
		||||
  \textit{cmd2} - ganz egal, ob Programm \textit{cmd1} einen Fehler geworfen hat
 | 
			
		||||
  oder nicht.
 | 
			
		||||
  \item \bashinline{cmd1 && cmd2} \\
 | 
			
		||||
  Jedes Programm übergibt zuletzt an das Betriebssystem einen sogenannten
 | 
			
		||||
  Returncode (auch Errorlevel oder Exitlevel genannt). Bei einem Returncode 0
 | 
			
		||||
  ist alles in Ordnung, bei einem Wert ungleich 0 trat ein Fehler auf. In diesem
 | 
			
		||||
  Fall der Kombination wird \textit{cmd2} nur ausgeführt, wenn der Returncode
 | 
			
		||||
  von \textit{cmd1} gleich 0 war.
 | 
			
		||||
  \item \bashinline{cmd1 || cmd2} \\
 | 
			
		||||
  Dies ist genau das Gegenteil. Das Programm \textit{cmd2} wird nur ausgeführt,
 | 
			
		||||
  wenn der Returncode von \textit{cmd1} ungleich 0 war.
 | 
			
		||||
  \item \bashinline{cmd1 & cmd2} \\
 | 
			
		||||
  Das \&-Zeichen am Ende einer Befehlszeile veranlasst, dass das Programm in den
 | 
			
		||||
  Hintergrund verlagert wird und ihnen die Prompt wieder zur Verfügung gestellt
 | 
			
		||||
  wird. Dadurch ist es möglich über eine Session mehrere Befehle auszuführen.
 | 
			
		||||
  Nichts anderes passiert hier. Das Programm \textit{cmd1} wird in den
 | 
			
		||||
  Hintergrund verlagert. Das Programm \textit{cmd2} wird nach der Verlagerung
 | 
			
		||||
  ausgeführt.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Neben den Befehlsverkettungen gibt es auch noch Umleitungen der Ein- und
 | 
			
		||||
Ausgabekanäle (\textit{stdin}, \textit{stdout}, \textit{stderr}).
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \bashinline{cmd > /tmp/output.log} oder auch \bashinline{cmd 1> /tmp/output.log} \\
 | 
			
		||||
  Die Standard-Ausgabe \textit{stdout} wird in die Datei \textit{/tmp/output.log}
 | 
			
		||||
  geschrieben.
 | 
			
		||||
  \item \bashinline{cmd >> /tmp/output.log} \\
 | 
			
		||||
  Die Standard-Ausgabe \textit{stdout} wird an die Datei \textit{/tmp/output.log}
 | 
			
		||||
  angehängt.
 | 
			
		||||
  \item \bashinline{cmd 2> /tmp/output.log} \\
 | 
			
		||||
  Die Standard-Fehlerausgabe \textit{stderr} wird an die Datei \textit{/tmp/error.log}
 | 
			
		||||
  geschrieben.
 | 
			
		||||
  \item \bashinline{cmd &> /tmp/complete.log} \\
 | 
			
		||||
  Die Standard-Ausgabe \textit{stdout} und die -Fehlerausgabe \textit{stderr}
 | 
			
		||||
  werden in die Datei \textit{/tmp/complete.log} geschrieben. geschrieben.
 | 
			
		||||
  \item \bashinline{cmd < /tmp/input} \\
 | 
			
		||||
  Die Standard-Eingabe \textit{stdin} erfolgt nicht durch die Tastatur, sondern
 | 
			
		||||
  aus der Datei \textit{/tmp/input}.
 | 
			
		||||
  \item \bashinline{cmd << EOT} \\
 | 
			
		||||
  Die Standard-Eingabe wird nur bis zu der frei wählbaren Zeichenfolge EOT
 | 
			
		||||
  gelesen und anschließend beendet. Man nennt diese Konstruktion HERE-Dokument.
 | 
			
		||||
  Dazu später mehr.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>-----------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{cat}
 | 
			
		||||
\label{sec:text-processing.cat}
 | 
			
		||||
 | 
			
		||||
Das Programm \textit{cat} konkateniert mehrere Dateien und schreibt diese auf
 | 
			
		||||
die Standard-Ausgabe \textit{stdout}. Nachfolgend einige Beispiele.
 | 
			
		||||
 | 
			
		||||
Die Ausgabe der Datei \textit{/etc/passwd}. Die Zeilen wurden gekürzt.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ cat /etc/passwd
 | 
			
		||||
root:x:0:0:root:/root:/bin/bash
 | 
			
		||||
bin:x:1:1:bin:/bin:/sbin/nologin
 | 
			
		||||
daemon:x:2:2:daemon:/sbin:/sbin/nologin
 | 
			
		||||
...
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Die Datei \textit{/etc/passwd} und \textit{/etc/group} werden zusammengeführt
 | 
			
		||||
und nach \textit{/tmp/user-and-groups} umgeleitet.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ cat /etc/passwd /etc/group > /tmp/user-and-groups
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
In dem folgenden Beispiel wird ein HERE-Dokument genutzt, um die Eingabe in eine
 | 
			
		||||
Datei umzuleiten.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ cat > /tmp/my-here-document <<EOF
 | 
			
		||||
Hello,
 | 
			
		||||
this is my first here document.
 | 
			
		||||
EOF
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
% #>-----------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{wc}
 | 
			
		||||
\label{sec:text-processing.wc}
 | 
			
		||||
 | 
			
		||||
Mit Programm \textit{wc} lassen sich die Wörter, Zeilen oder Buchstaben von
 | 
			
		||||
einer Standard-Eingabe oder Dateien zählen. Das folgende Beispiel addiert die
 | 
			
		||||
Zeilen der Datei \textit{/etc/passwd} und \textit{/etc/group}.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ wc --lines /etc/passwd /etc/group
 | 
			
		||||
42 /etc/passwd
 | 
			
		||||
62 /etc/group
 | 
			
		||||
104 total
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 1a:} Zählen Sie die Buchstaben und Wörter der Datei
 | 
			
		||||
  \textit{/etc/services}. Definieren Sie die Quelle einmal per Pfad zur Datei und
 | 
			
		||||
  ein anderes mal per Befehlsverkettung - \textit{Pipe}.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>-----------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{date}
 | 
			
		||||
\label{sec:text-processing.date}
 | 
			
		||||
 | 
			
		||||
Mit dem Programm \textit{date} können Daten, basierend auf dem aktuellen oder
 | 
			
		||||
einem vordefinierten Datum, berechnet werden. Zusätzlich kann das Format anhand
 | 
			
		||||
eines Formatstrings bestimmt werden. Die einzelnen Formatattribute sind in der
 | 
			
		||||
Dokumentation von \textit{date} beschrieben. Schauen Sie sich für weitere
 | 
			
		||||
Informationen die Dokumentation an: \textit{man date}.
 | 
			
		||||
 | 
			
		||||
Nachfolgend einige Beispiele ein Datum basierend auf den Anforderungen zu
 | 
			
		||||
berechnen.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ # Gibt das aktuelle Datum und die Uhrzeit aus
 | 
			
		||||
$ date '+%Y-%m-%d %H:%M:%S'
 | 
			
		||||
2020-11-14 16:35:07
 | 
			
		||||
 | 
			
		||||
$ # Gibt das Datum des letzten Montags aus
 | 
			
		||||
$ date --date 'last monday' '+%Y-%m-%d'
 | 
			
		||||
2020-11-09
 | 
			
		||||
 | 
			
		||||
$ # Berechnet das Datum des letzten Montags vor zwei Wochen
 | 
			
		||||
$ date --date 'last monday + 14 day ago' '+%Y-%m-%d'
 | 
			
		||||
2020-10-26
 | 
			
		||||
 | 
			
		||||
$ # Gibt das Datum des kommenden Montags aus
 | 
			
		||||
$ date --date 'next monday' '+%Y-%m-%d'
 | 
			
		||||
2020-11-16
 | 
			
		||||
 | 
			
		||||
$ # Berechnet das Datum des nächsten Montags in zwei Wochen
 | 
			
		||||
$ date --date 'next monday + 14 day' '+%Y-%m-%d'
 | 
			
		||||
2020-11-30
 | 
			
		||||
 | 
			
		||||
$ # Berechnet das Datum des letzten Montags in zwei Wochen
 | 
			
		||||
$ date --date 'last monday + 14 day' '+%Y-%m-%d'
 | 
			
		||||
2020-11-23
 | 
			
		||||
 | 
			
		||||
$ # Gibt das Datum und die Uhrzeit für die Zeitzone
 | 
			
		||||
$ # America/New_York aus
 | 
			
		||||
$ TZ=America/New_York date '+%Y-%m-%d %H:%M:%S %z'
 | 
			
		||||
2020-11-14 10:41:39 -0500
 | 
			
		||||
 | 
			
		||||
$ # Gibt das Datum, die Uhrzeit, Kalenderwoche und den Tag aus
 | 
			
		||||
$ date '+%A, %Y-%m-%d %H:%M:%S, KW %V'
 | 
			
		||||
Samstag, 2020-11-14 16:42:44, KW 46
 | 
			
		||||
 | 
			
		||||
$ # Addiert zwei Tage auf den 3. Oktober 2020
 | 
			
		||||
$ date --date '03 OCT 2020 + 2 day' '+%Y-%m-%d'
 | 
			
		||||
2020-10-05
 | 
			
		||||
 | 
			
		||||
$ # Addiert zwei Tage auf den 3. Oktober vor 5 Jahren.
 | 
			
		||||
$ date --date "03 OCT $(date --date '5 year ago' '+%Y') + 2 day" '+%Y-%m-%d'
 | 
			
		||||
2015-10-05
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 2a:} Berechnen Sie das Datum des kommenden Sonntags.
 | 
			
		||||
  Verwenden Sie folgendes Format: \textit{2020-05-31}. Erkundigen Sie sich in
 | 
			
		||||
  der Dokumentation über weitere Formatattribute.
 | 
			
		||||
  \item \textbf{Aufgabe 2b:} Berechnen Sie das Datum des letzten Dienstags vor
 | 
			
		||||
  einem Monat. Verwenden Sie folgendes Format: \textit{Dienstag, 2020-05-31, KW
 | 
			
		||||
  22}
 | 
			
		||||
  \item \textbf{Aufgabe 2c:} Berechnen Sie das Datum des Mittwochs der 44 KW vor
 | 
			
		||||
  12 Jahren für die Zeitzone Africa/Mogadishu. \textit{KW 22, Dienstag, 15
 | 
			
		||||
  November 2008}.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>-----------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{sed}
 | 
			
		||||
\label{sec:text-processing.sed}
 | 
			
		||||
 | 
			
		||||
Das Programm \textit{sed} ist ein stream Editor, welcher zum Filtern,
 | 
			
		||||
Modifizieren und Löschen von Textstreams geeignet ist.
 | 
			
		||||
 | 
			
		||||
Das Programm bietet einen sehr großen Umfang an zusätzlichen Optionen an. Nicht
 | 
			
		||||
alle Optionen werden behandelt. Der Fokus liegt ausschließlich auf den gängigen
 | 
			
		||||
Optionen, welche öfters in der Praxis verwendet werden. Weitere Informationen zu
 | 
			
		||||
allen möglichen Optionen können über die Dokumentation abgerufen werden:
 | 
			
		||||
\textit{man sed}.
 | 
			
		||||
 | 
			
		||||
In dem folgenden Beispiel wird der Inhalt der Datei \textit{/etc/passwd} durch
 | 
			
		||||
\textit{sed} modifiziert und auf der Standard-Ausgabe ausgegeben. Die
 | 
			
		||||
Zeichenkette \textit{root} wird durch \textit{nobody} ersetzt. Vergleichen Sie
 | 
			
		||||
die ersten Zeilen der Ausgabe mit der ursprünglichen Datei.
 | 
			
		||||
 | 
			
		||||
Für komplexere Kriterien können Reguläre Ausdrücke verwendet werden. Falls Ihnen
 | 
			
		||||
Reguläre Ausdrücke fremd sind, informieren Sie sich bitte im Internet über
 | 
			
		||||
Reguläre Ausdrücke.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ sed 's/root/nobody/g' /etc/passwd
 | 
			
		||||
nobody:x:0:0:nobody:/nobody:/bin/bash
 | 
			
		||||
bin:x:1:1:bin:/bin:/sbin/nologin
 | 
			
		||||
daemon:x:2:2:daemon:/sbin:/sbin/nologin
 | 
			
		||||
...
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Möchte man Reguläre Ausdrücke verwenden kann das Flag bzw. die Option
 | 
			
		||||
\textit{-e, --expression} verwendet werden. Allerdings hat diese Option den
 | 
			
		||||
Nachteil, dass Zeichen für Reguläre Ausdrücke maskiert werden müssen. Anders ist
 | 
			
		||||
dies bei dem Flag \textit{-E, -r, --regexp-extended}. Die Syntax der Regulären
 | 
			
		||||
Ausdrücke ist identisch zu der Syntax von \textit{grep} mit dem Flag
 | 
			
		||||
\textit{--perl-regexp} und sollte daher bevorzugt verwendet werden.
 | 
			
		||||
 | 
			
		||||
In dem folgenden Beispiel wird die Ausgabe umgeleitet in eine Datei.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ sed 's/root/nobody/g' /etc/passwd > /tmp/passwd_modified
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Möchte man die selbe Datei anhand von Kriterien Filtern und Modifizieren bietet
 | 
			
		||||
sich die Option bzw. das Flag \textit{-i, --in-place} an. Die Änderungen werden
 | 
			
		||||
direkt in die Quelldatei übernommen.
 | 
			
		||||
 | 
			
		||||
In dem folgenden Beispiel wird die Zeile 5 bis 10 und die Zeile 12 aus der Datei
 | 
			
		||||
\textit{/tmp/passwd\_modified} entfernt.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ sed --in-place '5,10d;12d' /tmp/passwd_modified
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Sicherlich fragen Sie sich nun was die Zeichen \textit{s/}, \textit{d} oder
 | 
			
		||||
\textit{/g} zu Beginn oder zum Ende der Bedingung bedeuten. Mit \textit{s/} wird
 | 
			
		||||
\textit{sed} mitgeteilt, dass eine Zeichenkette durch eine andere ersetzt werden
 | 
			
		||||
soll. Die Zeichen \textit{/g} bedeuten, dass der Ausdruck auf alle Treffer
 | 
			
		||||
angewendet werden soll. Eine andere Bedeutung für das \textit{g} ist
 | 
			
		||||
\glqq{}global\grqq{}. Nun, wofür \textit{d} steht können Sie sich nun schon
 | 
			
		||||
denken - \textit{delete}.
 | 
			
		||||
 | 
			
		||||
In dem folgenden Beispiel werden alle Zeilen aus der Datei \textit{/etc/passwd}
 | 
			
		||||
und \textit{/etc/group} entfernt, die mit der Zeichenkette \textit{root} beginnen.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ sed --regexp-extended '/^root/d' /etc/passwd /etc/group
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Ein invert ist ebenfalls möglich. In dem folgenden Beispiel werden alle Zeilen
 | 
			
		||||
außer die fünfte Zeile entfernt.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ sed '5!d' /etc/passwd
 | 
			
		||||
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Mithilfe von Gruppen, welche Reguläre Ausdrücke bereitstellen, können komplexe
 | 
			
		||||
Zeichenketten gruppiert und neu angeordnet werden. In dem folgenden Beispiel
 | 
			
		||||
wird die letzte Spalte der Datei \textit{/etc/passwd} an die erste Stelle
 | 
			
		||||
verschoben.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ sed --regexp-extended 's/^(.*):(.*):(.*):(.*):(.*):(.*):(.*)$/\7:\1:\2:\3:\4:\5:\6/g' /etc/passwd
 | 
			
		||||
/bin/bash:root:x:0:0:root:/root
 | 
			
		||||
/sbin/nologin:bin:x:1:1:bin:/bin
 | 
			
		||||
/sbin/nologin:daemon:x:2:2:daemon:/sbin
 | 
			
		||||
...
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 3a:} Löschen Sie alle Zeilen, welche als Shell
 | 
			
		||||
  \textit{/sbin/nologin} verwenden. Geben Sie die Ausgabe auf der
 | 
			
		||||
  Standard-Ausgabe aus.
 | 
			
		||||
  \item \textbf{Aufgabe 3b:} Löschen Sie alle Zeilen aus der Datei
 | 
			
		||||
  \textit{/etc/passwd} und \textit{/etc/group}, welche mit \textit{root} oder
 | 
			
		||||
  \textit{system} beginnen. Zählen Sie anschließend die Zeilen. Nutzen Sie dazu
 | 
			
		||||
  die Umleitung von einem Programm zu einem anderen per \textit{Pipe}.
 | 
			
		||||
  \item \textbf{Aufgabe 3c:} Bereinigen Sie die Datei \textit{/etc/services}.
 | 
			
		||||
  Löschen Sie Kommentarzeilen und Zeilen welche leer sind. Manche Zeilen
 | 
			
		||||
  enthalten am Ende Kommentare, entfernen Sie diese.
 | 
			
		||||
  \item \textbf{Aufgabe 3d:} Suchen Sie in der Datei \textit{/etc/services} nach
 | 
			
		||||
  Zeilen, welche mit dem Port 5 beginnen und vertauschen Sie den Port mit dem
 | 
			
		||||
  Protokoll.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>-----------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{grep}
 | 
			
		||||
\label{sec:text-processing.grep}
 | 
			
		||||
 | 
			
		||||
Das Programm \textit{grep} wird primär dazu verwendet Dateien oder Streams nach
 | 
			
		||||
Schlagwörtern zu filtern. Ähnlich wie bei \textit{sed} können auch hier nicht
 | 
			
		||||
alle Optionen oder Flags ausführlich in Detail behandelt werden. Aus diesem
 | 
			
		||||
Grund liegt der Fokus erneut auf den gängigen Optionen bzw. Flags aus der Praxis.
 | 
			
		||||
 | 
			
		||||
Das nachfolgende Beispiel filtert die Datei \textit{/etc/passwd} und
 | 
			
		||||
\textit{/etc/group} nach der Zeichenkette \textit{root} und hebt diese farblich
 | 
			
		||||
hervor.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ grep --color root /etc/passwd /etc/group
 | 
			
		||||
/etc/passwd:root:x:0:0:root:/root:/bin/bash
 | 
			
		||||
/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin
 | 
			
		||||
/etc/group:root:x:0:
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
In dem folgenden Beispiel wird ein Regulärer Ausdruck verwendet, um nach der
 | 
			
		||||
Zeichenkette \textit{root} oder \textit{sophie}, beginnend für jede Zeile, in
 | 
			
		||||
der Datei \textit{/etc/passwd} zu suchen.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ grep --color --perl-regexp '^(root|sophie)' /etc/passwd
 | 
			
		||||
root:x:0:0:root:/root:/bin/bash
 | 
			
		||||
sophie:x:2003:100:Sophie Becker:/home/sophie:/bin/bash
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Manchmal möchte man allerdings nur die gefundenen Schlagwörter der Zeile
 | 
			
		||||
weiterverarbeiten. Dazu stellt das Programm \textit{grep} die Option
 | 
			
		||||
\textit{--only-matching} bereit. Nachfolgend wird der gleiche Befehl erneut
 | 
			
		||||
ausgeführt mit der Option.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ grep --color --only-matching --perl-regexp '^(root|sophie)' /etc/passwd
 | 
			
		||||
root
 | 
			
		||||
sophie
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Sicherlicht kennen einige die folgende Situation. Unterhalb eines Verzeichnisses
 | 
			
		||||
liegen sehr viele Dokumente. Eines von diesen enthält einen Begriff, welcher
 | 
			
		||||
dort erklärt oder beschrieben wird. In dem nachfolgenden Beispiel werden alle
 | 
			
		||||
Dateien rekursiv geöffnet und nach den Schlagwörtern durchsucht. In der Ausgabe
 | 
			
		||||
ist der Dateiname und die Zeile als auch das Schlagwort enthalten, welches den
 | 
			
		||||
Treffer ausgelöst hat.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ grep --color --recursive --perl-regexp '(btrfs|subvolume|snapshot)' ~/workspace/linux_ws2021
 | 
			
		||||
~/workspace/linux_ws2021/referenzen/bibliothek.bib: @online{fedora33-btrfs-default,
 | 
			
		||||
~/workspace/linux_ws2021/referenzen/bibliothek.bib: url = {https://fedoramagazine.org/btrfs-coming-to-fedora-33/},
 | 
			
		||||
~/workspace/linux_ws2021/referenzen/bibliothek.bib: @online{was-ist-btrfs,
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 4a:} Suchen Sie alle Zeilen aus der Datei
 | 
			
		||||
  \textit{/etc/passwd} und \textit{/etc/group} herraus, welche nicht die
 | 
			
		||||
  Zeichenketten \textit{root} und ihren aktuellen Benutzernamen enthalten.
 | 
			
		||||
  Nutzen Sie zur Ermittlung ihres Benutzernamens die Umgebungsvariable
 | 
			
		||||
  \textit{USER}.
 | 
			
		||||
  \item \textbf{Aufgabe 4b:} Filtern Sie aus der Datei \textit{/etc/passwd} alle
 | 
			
		||||
  Zeilen, welche mit \textit{system} beginnen. Leiten Sie die Ausgabe weiter an
 | 
			
		||||
  \textit{sed}, um die Zeichenkette \textit{/sbin/nologin} durch
 | 
			
		||||
  \textit{/bin/bash} zu ersetzen.
 | 
			
		||||
 | 
			
		||||
  Kleiner Tipp: Statt \textit{/} können auch andere Zeichen, wie
 | 
			
		||||
  \textit{\#} oder \textit{@}, als Trennung zwischen dem Such- und
 | 
			
		||||
  Ersetzungspattern verwendet werden. Dies kann hilfreich sein, um ein escapen
 | 
			
		||||
  von Verzeichnispfaden zu vermeiden.
 | 
			
		||||
  \item \textbf{Aufgabe 4c:} Zählen Sie alle Zeilen der Datei
 | 
			
		||||
  \textit{/etc/services}, welche das Protokoll tcp verweden.
 | 
			
		||||
  \item \textbf{Aufgabe 4d:} Ermitteln Sie, ob in der Datei
 | 
			
		||||
  \textit{/etc/services} noch andere Protokolle statt tcp und udp verwendet
 | 
			
		||||
  werden. Gegen Sie die unbekannten Protokolle auf der Standard-Ausgabe aus.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>-----------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{uniq}
 | 
			
		||||
\label{sec:text-processing.uniq}
 | 
			
		||||
 | 
			
		||||
Manchmal möchte man Treffer zählen. Beispielsweise wird eine Datei durchsucht
 | 
			
		||||
nach einem Schlagwort und man stellt sich die Frage, wie oft das Schlagwort in
 | 
			
		||||
der Datei verwendet wurde. Um diese Frage zu beantworten ist unter anderem
 | 
			
		||||
\textit{uniq} sehr helfreich, denn es kann Mehrfachvorkommen von Zeichenketten
 | 
			
		||||
vermeiden und ggfls. zählen.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 5a:} Zählen Sie wie oft in der Datei
 | 
			
		||||
  \textit{/etc/passwd} die Zeichkette \textit{root} verwendet wurde. Eventuell
 | 
			
		||||
  ist es hilfreich \textit{grep} hinzuzuziehen.
 | 
			
		||||
  \item \textbf{Aufgabe 5b:} Suchen Sie in der Datei \textit{/etc/services} nach
 | 
			
		||||
  Diensten die nur einen Port bzw Protokoll benötigen. Nutzen Sie auch hier die
 | 
			
		||||
  bereits kennengelernten Programme.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>-----------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{column}
 | 
			
		||||
\label{sec:text-processing.column}
 | 
			
		||||
 | 
			
		||||
Manchmal erhält man Dateien, welche für das menschliche Auge unübersichtlich
 | 
			
		||||
formatiert sind. Das Programm \textit{column} kann hier insoweit Abhilfe
 | 
			
		||||
schaffen, dass die Eingabe in mehrere Spalten formatiert wird.
 | 
			
		||||
 | 
			
		||||
In dem folgenden Beispiel wird die Datei \textit{/etc/passwd} eingelesen, die
 | 
			
		||||
Spalten anhand des Trenners \textit{:} getrennt und als Tabelle auf der
 | 
			
		||||
Standard-Ausgabe ausgegeben.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ column --separator ":" --table /etc/passwd
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Es können auch zusätzlich Kopfzeilen hinzugefügt werden. Im nächsten Beispiel
 | 
			
		||||
ist dies genau der Fall. Die Kopfzeile wird definiert und mit ausgegeben.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ column --separator ":" \
 | 
			
		||||
         --table \
 | 
			
		||||
         --table-column "user,password,id,gid,comment,homedir,shell" /etc/passwd
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Wahrscheinlich wird das Programm \textit{column} häufiger verwendet, um Dateien
 | 
			
		||||
in json umzuwandeln. In dem folgenden Beispiel wird die Datei in json
 | 
			
		||||
umgewandelt.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ column --separator ":" \
 | 
			
		||||
  --table \
 | 
			
		||||
  --table-name "passwd" \
 | 
			
		||||
  --table-column "user,password,id,gid,comment,homedir,shell" \
 | 
			
		||||
  --json /etc/passwd
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 6a:} Filtern Sie alle Zeilen aus der Datei
 | 
			
		||||
  \textit{/etc/services}, welches das UDP-Protokoll verwenden und mit dem
 | 
			
		||||
  Buchstaben \textit{n} beginnen. Teilen Sie die zweite Spalte auf in Port und
 | 
			
		||||
  Protokoll. Die Ausgabe muss in ein json umgewandelt werden. Der Tabellenname
 | 
			
		||||
  ist \textit{services} und die Spalten sollen \textit{service}, \textit{port}
 | 
			
		||||
  und \textit{protocol} heißen. Speichern Sie die Ausgabe in die Datei
 | 
			
		||||
  \textit{/tmp/services.json} ab.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>-----------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{head und tail}
 | 
			
		||||
\label{sec:text-processing.head-und-tail}
 | 
			
		||||
 | 
			
		||||
Mit den bisherigen Programmen können wir schon einiges erreichen, doch fehlt es
 | 
			
		||||
an der Möglichkeiten die Ausgabe zu beschränken. Mit den Programmen
 | 
			
		||||
\textit{head} und \textit{tail} kann genau das erreicht werden. Beide Programme
 | 
			
		||||
schreiben auf die Standard-Ausgabe \textit{stdout}, wenn keine Umleitung
 | 
			
		||||
definiert ist.
 | 
			
		||||
 | 
			
		||||
Mit dem Programm \textit{head} können n Zeilen, beginnend ab der ersten Zeile,
 | 
			
		||||
ausgegeben werden. Das Programm \textit{tail} dagegen zählt ab der letzten
 | 
			
		||||
Zeile.
 | 
			
		||||
 | 
			
		||||
In dem nachfolgenden Beispiel werden die ersten drei Zeilen der Datei
 | 
			
		||||
\textit{/etc/passwd} ausgegeben.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ head --lines=3 /etc/passwd
 | 
			
		||||
root:x:0:0:root:/root:/bin/bash
 | 
			
		||||
bin:x:1:1:bin:/bin:/sbin/nologin
 | 
			
		||||
daemon:x:2:2:daemon:/sbin:/sbin/nologin
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Das nächste Beispiel gibt die letzten drei Zeilen aus.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ tail --lines=3 /etc/passwd
 | 
			
		||||
tobias:x:2005:100:Tobias Moretti:/home/tobias:/bin/bash
 | 
			
		||||
lisa:x:2006:100:Lisa Meerkamp:/home/lisa:/bin/bash
 | 
			
		||||
manfred:x:2007:100:Manfred Krupp:/home/manfred:/bin/bash
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Zusätzlich besitzt \textit{tail} die Möglichkeit alle Zeilen, beginnend ab der
 | 
			
		||||
n-ten Zeile, auszugeben. In dem folgenden Beispiel wird die Datei
 | 
			
		||||
\textit{/etc/passwd} ab der 35en Zeile ausgegeben. Die Ausgabe ist zusätzlich
 | 
			
		||||
noch einmal gekürzt.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ tail --lines=+35 /etc/passwd
 | 
			
		||||
hugo:x:2000:100:Hugo McKinnock:/home/hugo:/bin/bash
 | 
			
		||||
hans:x:2001:100:Hans Rakinzsky:/home/hans:/bin/bash
 | 
			
		||||
marie:x:2002:100:Marie Haseloff:/home/marie:/bin/bash
 | 
			
		||||
sophie:x:2003:100:Sophie Becker:/home/sophie:/bin/bash
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Manche Programme, insbesondere Dienste, schreibe Log-Dateien, welche gerade für
 | 
			
		||||
Administratoren oder Entwickler interessant sein können. Um ausschließlich die
 | 
			
		||||
neusten Zeilen aus einer Logdatei zu erhalten bietet das Programm \textit{tail}
 | 
			
		||||
die Option \textit{-f, --follow} an. Dadurch wird veranlasst, dass stets neu
 | 
			
		||||
hinzukommende Zeilen direkt ausgegeben werden, ohne das das Programm erneut
 | 
			
		||||
gestartet werden muss.
 | 
			
		||||
 | 
			
		||||
% #>-----------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{cut}
 | 
			
		||||
\label{sec:text-processing.cut}
 | 
			
		||||
 | 
			
		||||
Das Programm \textit{cut} ist genau das richtige Programm, um Spalten, getrennt
 | 
			
		||||
durch einen Trenner, auszuwählen. In dem nachfolgenden Beispiel wird
 | 
			
		||||
ausschließlich die erste Zeile der Datei \textit{/etc/passwd} ausgegeben.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ cut --delimiter=":" --fields=1 /etc/passwd
 | 
			
		||||
root
 | 
			
		||||
bin
 | 
			
		||||
daemon
 | 
			
		||||
...
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Es ist auch möglich mehrere Spalten zu selektieren. In dem folgenden Beispiel
 | 
			
		||||
wird ausschließlich die zweite bis vierte und siebte Spalte selektiert.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ cut --delimiter=":" --fields=2-4,7 /etc/passwd
 | 
			
		||||
x:0:0:/bin/bash
 | 
			
		||||
x:1:1:/sbin/nologin
 | 
			
		||||
x:2:2:/sbin/nologin
 | 
			
		||||
...
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 7a:} Nutzen Sie die bereits bekannten Programme, um die
 | 
			
		||||
  Datei \textit{/etc/services} zu bereinigen. Lassen Sie sich anschließend nur
 | 
			
		||||
  die Spalte mit den Ports und Protokollen anzeigen. Leiten Sie die Ausgabe in
 | 
			
		||||
  die Datei \textit{/tmp/port-protocol} um.
 | 
			
		||||
  \item \textbf{Aufgabe 7b:} Verwenden Sie die Programme \textit{echo},
 | 
			
		||||
  \textit{cut}, \textit{cat}, \textit{tail} und \textit{head}, um die folgenden
 | 
			
		||||
  Felder aus der Datei \text{/etc/passwd} zu selektieren. Spalte/Zeile: (1/1),
 | 
			
		||||
  (3/7), (5/3), (7/4).
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>-----------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{sort}
 | 
			
		||||
\label{sec:text-processing.sort}
 | 
			
		||||
 | 
			
		||||
Um nach Spalten zu sortieren wird durch die GNU Core Utility Collection das
 | 
			
		||||
Programm \textit{sort} bereit gestellt. Dieses Programm kann nach mehreren
 | 
			
		||||
möglichen Optionen sortieren. Nach einfachem Text, nach Speichergrößen, Zahlen,
 | 
			
		||||
Monaten (JAN$<$DEC) oder Versionen. Weitere Optionen sind in der Dokumentation
 | 
			
		||||
beschrieben.
 | 
			
		||||
 | 
			
		||||
Das nächste Beispiel behandelt die Sortierung der Ausgabe des Programms
 | 
			
		||||
\textit{df}. Das Programm \textit{df} gibt Informationen über den gesamten,
 | 
			
		||||
freien und verbrauchten Speicherplatz der eingehängten Partitionen aus. Die
 | 
			
		||||
Ausgabe wird nach der dritten Spalte aufsteigend sortiert. Dazu wird die Option
 | 
			
		||||
bzw. das Flag \textit{-k, --key} übergeben. Durch dieses Flag kann die Spalte
 | 
			
		||||
zur Sortierung übergeben werden. Mittels tail wird zudem die Kopfzeile
 | 
			
		||||
abgeschnitten.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ df | tail --lines +2 | sort --key 3 --numeric-sort
 | 
			
		||||
tmpfs             401876       0    401876    0% /run/user/0
 | 
			
		||||
tmpfs            2009384       4   2009380    1% /tmp
 | 
			
		||||
tmpfs            2009384    1068   2008316    1% /run
 | 
			
		||||
/dev/vda1         613184    8740    604444    2% /boot/efi
 | 
			
		||||
...
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Die Speichergrößen können auch abgerundet werden durch die gängigen
 | 
			
		||||
Speicherabkürzungen K (Kilobyte), M (Megabyte), G (Gigabyte), T (Terabyte) ect.
 | 
			
		||||
In dem folgenden Beispiel wird dazu die Option \textit{--human-readable} dem
 | 
			
		||||
Programm \textit{df} übergeben. Anschließend muss sort mitgeteilt werden, dass
 | 
			
		||||
die Spalte nun Speichergrößen mit ihren Abkürzungen enthält. Andernfalls
 | 
			
		||||
sortiert \textit{sort} falsch.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ df --human-readable | tail --lines +2 | sort --key 3 --human-numeric-sort
 | 
			
		||||
tmpfs           393M       0  393M    0% /run/user/0
 | 
			
		||||
tmpfs           2,0G    4,0K  2,0G    1% /tmp
 | 
			
		||||
tmpfs           2,0G    1,1M  2,0G    1% /run
 | 
			
		||||
/dev/vda1       599M    8,6M  591M    2% /boot/efi
 | 
			
		||||
...
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
In den beiden Beispielen wurde stets nach einer Spalte sortiert. Es ist jedoch
 | 
			
		||||
auch möglich eine Sortierreihenfolge zu definieren. Dies wird erreicht indem das
 | 
			
		||||
Flag \textit{-k, --key} mehrfach definiert wird. In dem folgenden Beispiel wird
 | 
			
		||||
erst nach dem Mountpoint sortiert und anschließend nach dem gesamten
 | 
			
		||||
Speicherplatz.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ df --human-readable | tail --lines +2 | sort --key 6 --key 3h
 | 
			
		||||
/dev/vda4        17G    4,0G   13G   25% /
 | 
			
		||||
/dev/vda2      1014M    228M  787M   23% /boot
 | 
			
		||||
/dev/vda1       599M    8,6M  591M    2% /boot/efi
 | 
			
		||||
...
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
Sicherlich fragen Sie sich nun, was der Buchstabe \textit{h} bei Angabe der
 | 
			
		||||
zweiten Spalte bedeutet. Es ist möglich \textit{sort} mitzuteilen welche Spalte
 | 
			
		||||
welches Format besitzt. Der Buchstabe \textit{h} bedeutet nichts weiteres als
 | 
			
		||||
\textit{human-numeric-sort}. Informieren Sie sich in der Dokumentation über die
 | 
			
		||||
anderen Buchstaben, um einer Spalte ein Schema zuzuweisen.
 | 
			
		||||
 | 
			
		||||
In dem folgenden Beispiel wird nach dem dritten Zeichen, der ersten Spalte
 | 
			
		||||
von der Ausgabe \textit{df}, absteigend sortiert.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ df | tail --lines +2 | sort --reverse --key 1.3
 | 
			
		||||
devtmpfs         1989716       0   1989716    0% /dev
 | 
			
		||||
tmpfs             401876       0    401876    0% /run/user/0
 | 
			
		||||
tmpfs            2009384       4   2009380    1% /tmp
 | 
			
		||||
...
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[label={},itemsep=0pt]
 | 
			
		||||
  \item \textbf{Aufgabe 8a:} Bereinigen Sie die Datei \textit{/etc/services} und
 | 
			
		||||
  leiten die Ausgabe an \textit{sort} weiter. Sortieren Sie aufsteigend nach dem
 | 
			
		||||
  Port, absteigend nach dem Protokoll und anschließend aufsteigend nach dem
 | 
			
		||||
  Namen.
 | 
			
		||||
  \item \textbf{Aufgabe 8b:} Sortieren Sie die Datei \textit{/etc/passwd} nach
 | 
			
		||||
  der \textit{UID} und \textit{GID} absteigend. Anschließend nach dem
 | 
			
		||||
  Benutzernamen.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
% #>-----------------------------------------------------------------------------<#
 | 
			
		||||
\subsection{join}
 | 
			
		||||
\label{sec:text-processing.join}
 | 
			
		||||
 | 
			
		||||
Sicherlich kennen Sie das \textit{JOIN} Statement von SQL. Ähnlich zu dem
 | 
			
		||||
SQL-Statement verhält sich das Programm \textit{join}, jedoch mit einigen
 | 
			
		||||
Restriktionen.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[itemsep=0pt]
 | 
			
		||||
  \item Die Spalten müssen nach dem Fremdschlüssel sortiert sein.
 | 
			
		||||
  \item Beide Dateien müssen den gleichen Trenner verwenden.
 | 
			
		||||
  \item Kann ein Fremdschlüssel nicht aufgelöst werden, wird eine Fehlermeldung
 | 
			
		||||
  für die jeweilige Zeile ausgegeben.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Im folgenden Beispiel werden die Zeilen aus den Dateien \textit{/etc/passwd} und
 | 
			
		||||
\textit{/etc/group} über die Spalte \textit{GID} miteinander verbunden und
 | 
			
		||||
weitergeleitet. Dazu werden beide Dateien vorab sortiert. Können Fremdschlüssel
 | 
			
		||||
nicht aufgelöst werden wird die Fehlermeldung dazu nach \textit{/dev/null}
 | 
			
		||||
umgeleitet. Die Ausgabe wird anschließend noch einmal nach dem Benutzernamen
 | 
			
		||||
sortiert.
 | 
			
		||||
 | 
			
		||||
Informieren Sie sich in der Dokumentation über die Bedeutung der Optionen bzw.
 | 
			
		||||
Flags.
 | 
			
		||||
 | 
			
		||||
\begin{bashcode}
 | 
			
		||||
$ join -t ":" -1 3 -2 4 <(sort --field-separator=":" --key 3n /etc/group) <(sort --field-separator=":" --key 4n /etc/passwd) 2> /dev/null | sort --field-separator=":" --key 5
 | 
			
		||||
0:root:x::halt:x:7:halt:/sbin:/sbin/halt
 | 
			
		||||
0:root:x::operator:x:11:operator:/root:/sbin/nologin
 | 
			
		||||
0:root:x::root:x:0:root:/root:/bin/bash
 | 
			
		||||
...
 | 
			
		||||
\end{bashcode}
 | 
			
		||||
							
								
								
									
										134
									
								
								chapters/99-awk.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,134 @@
 | 
			
		||||
% ##########################################################################
 | 
			
		||||
% ############################ Übungsblatt AWK #############################
 | 
			
		||||
% ##########################################################################
 | 
			
		||||
\section{AWK}
 | 
			
		||||
\label{sec:awk}
 | 
			
		||||
 | 
			
		||||
% ############################### Aufgabe 01 ###############################
 | 
			
		||||
\subsection{Aufgabe}
 | 
			
		||||
\label{sec:awk.aufgabe01}
 | 
			
		||||
 | 
			
		||||
Geben Sie alle Zeilen der Datei \texttt{/bin/passwd} mithilfe von awk aus.
 | 
			
		||||
 | 
			
		||||
\subsubsection*{Lösung}
 | 
			
		||||
\label{sec:awk.aufgabe01.loesung}
 | 
			
		||||
 | 
			
		||||
% \inputbash{./awk/01-aufgabe.sh}
 | 
			
		||||
 | 
			
		||||
% ############################### Aufgabe 02 ###############################
 | 
			
		||||
 | 
			
		||||
\subsection{Aufgabe}
 | 
			
		||||
\label{sec:awk.aufgabe02}
 | 
			
		||||
 | 
			
		||||
Gebem Sie von allen Benutzern den username, badname und die login shell aus.
 | 
			
		||||
Greifen Sie dazu erneut auf die Datei \texttt{/etc/passwd} zu. Die Ausgabe soll
 | 
			
		||||
ähnlich wie die Tabelle \ref{tbl:awk.aufgabe02.beispielausgabe} aussehen.
 | 
			
		||||
 | 
			
		||||
\begin{table}[H]
 | 
			
		||||
  \begin{tabularx}{\textwidth}{X|X|X}
 | 
			
		||||
    \textbf{user} & \textbf{badname}  & \textbf{shell}        \\
 | 
			
		||||
    \hline\hline
 | 
			
		||||
    root          &                   & \texttt{/bin/bash}    \\
 | 
			
		||||
    postfix       &                   & \texttt{/bin/nologin} \\
 | 
			
		||||
    markus        & Markus Pesch      & \texttt{/bin/bash}    \\
 | 
			
		||||
    $[$\dots$]$   & $[$\dots$]$       & $[$\dots$]$           \\
 | 
			
		||||
  \end{tabularx}
 | 
			
		||||
  \caption{AWK - Beispielsausgabe}
 | 
			
		||||
  \label{tbl:awk.aufgabe02.beispielausgabe}
 | 
			
		||||
\end{table}
 | 
			
		||||
 | 
			
		||||
\subsubsection*{Lösung}
 | 
			
		||||
\label{sec:awk.aufgabe02.loesung}
 | 
			
		||||
 | 
			
		||||
% \inputbash{./awk/02-aufgabe.sh}
 | 
			
		||||
 | 
			
		||||
% ############################### Aufgabe 03 ###############################
 | 
			
		||||
 | 
			
		||||
\subsection{Aufgabe}
 | 
			
		||||
\label{sec:awk.aufgabe03}
 | 
			
		||||
 | 
			
		||||
Modifizieren Sie Aufgabe \ref{sec:awk.aufgabe02}, sodass nur Benutzer mit einer
 | 
			
		||||
UID größer gleich 1000 ausgegeben werden.
 | 
			
		||||
 | 
			
		||||
\subsubsection*{Lösung}
 | 
			
		||||
\label{sec:awk.aufgabe03.loesung}
 | 
			
		||||
 | 
			
		||||
% \inputawk{./awk/03-aufgabe.awk}
 | 
			
		||||
 | 
			
		||||
% \inputbash{./awk/03-aufgabe.sh}
 | 
			
		||||
 | 
			
		||||
% ############################### Aufgabe 04 ###############################
 | 
			
		||||
 | 
			
		||||
\subsection{Aufgabe}
 | 
			
		||||
\label{sec:awk.aufgabe04}
 | 
			
		||||
 | 
			
		||||
Gebe Sie alle Zeilen der Datei \texttt{/etc/passwd} zwischen fünf und zehn aus.
 | 
			
		||||
Ergänzen Sie die Tabelle um eine Spalte. Die neue Spalte enthält die
 | 
			
		||||
Zeilennummer.
 | 
			
		||||
 | 
			
		||||
\subsubsection*{Lösung}
 | 
			
		||||
\label{sec:awk.aufgabe04.loesung}
 | 
			
		||||
 | 
			
		||||
% \inputawk{./awk/04-aufgabe.awk}
 | 
			
		||||
 | 
			
		||||
% \inputbash{./awk/04-aufgabe.sh}
 | 
			
		||||
 | 
			
		||||
% ############################### Aufgabe 05 ###############################
 | 
			
		||||
 | 
			
		||||
\subsection{Aufgabe}
 | 
			
		||||
\label{sec:awk.aufgabe05}
 | 
			
		||||
 | 
			
		||||
Modifiziere Sie die Aufgabe \ref{sec:awk.aufgabe04}, sodass die logischen
 | 
			
		||||
Entscheidungen in eine Funktion ausgelagert werden.
 | 
			
		||||
 | 
			
		||||
\subsubsection*{Lösung}
 | 
			
		||||
\label{sec:awk.aufgabe05.loesung}
 | 
			
		||||
 | 
			
		||||
% \inputawk{./awk/05-aufgabe.awk}
 | 
			
		||||
 | 
			
		||||
% \inputbash{./awk/05-aufgabe.sh}
 | 
			
		||||
 | 
			
		||||
% ############################### Aufgabe 06 ###############################
 | 
			
		||||
 | 
			
		||||
\subsection{Aufgabe}
 | 
			
		||||
\label{sec:awk.aufgabe06}
 | 
			
		||||
 | 
			
		||||
Lesen Sie die Datei \texttt{credit\_master.csv} ein. Die Datei enthält
 | 
			
		||||
unerwünschte Leerzeichen. Korrigieren Sie diese Datensätze indem Sie die
 | 
			
		||||
unerwünschten Leerzeichen entfernen. Als boolsche Variablen sind ausschließlich
 | 
			
		||||
ja und nein akzeptabel. Entfernen Sie auch hier die Datensätze, deren boolsche
 | 
			
		||||
Variablen nicht übereinstimmen.
 | 
			
		||||
 | 
			
		||||
Die validen Datensätze sollen in die Datei
 | 
			
		||||
\texttt{csv/credit\_master\_cleaned.csv} gespeichert werden.
 | 
			
		||||
 | 
			
		||||
\subsubsection*{Lösung}
 | 
			
		||||
\label{sec:awk.aufgabe06.loesung}
 | 
			
		||||
 | 
			
		||||
% \inputawk{./awk/06-aufgabe.awk}
 | 
			
		||||
 | 
			
		||||
% \inputbash{./awk/06-aufgabe.sh}
 | 
			
		||||
 | 
			
		||||
% ############################### Aufgabe 06 ###############################
 | 
			
		||||
 | 
			
		||||
\subsection{Aufgabe}
 | 
			
		||||
\label{sec:awk.aufgabe07}
 | 
			
		||||
 | 
			
		||||
Lesen Sie die Datei \texttt{credit\_master\_cleaned.csv} ein. Erstellen Sie für
 | 
			
		||||
jede Zeile ein passendes SQL-Statement, um die Zeile in die Tabelle
 | 
			
		||||
\texttt{credit\_master} zu überführen. Geben Sie zu Beginn das SQL-Statement zum
 | 
			
		||||
erstellen der notwendigen Tabelle aus. Speichern Sie ihre SQL-Statements in der
 | 
			
		||||
Datei \texttt{credit\_master\_cleaned.sql} ab.
 | 
			
		||||
 | 
			
		||||
Ob Sie nun die SQL-Statements in der Oracle, Maria, MySQL, Postgres oder SQLite
 | 
			
		||||
Notation erstellen ist ihnen überlassen, jedoch verwenden Sie den passenden
 | 
			
		||||
boolschen Datentyp je nach Datenbank, um die boolschen Variablen zu überführen.
 | 
			
		||||
 | 
			
		||||
Verwenden Sie sofern möglich ihre eigene \texttt{credit\_master\_cleaned.csv} Datei.
 | 
			
		||||
 | 
			
		||||
\subsubsection*{Lösung}
 | 
			
		||||
\label{sec:awk.aufgabe07.loesung}
 | 
			
		||||
 | 
			
		||||
% \inputawk{./awk/07-aufgabe.awk}
 | 
			
		||||
 | 
			
		||||
% \inputbash{./awk/07-aufgabe.sh}
 | 
			
		||||
							
								
								
									
										30
									
								
								chapters/99-questions.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,30 @@
 | 
			
		||||
\section{Assessment Test}
 | 
			
		||||
\label{sec:assessment-test}
 | 
			
		||||
 | 
			
		||||
\subsection{Aufgabe}
 | 
			
		||||
\label{sec:assessment-test.aufgabe01}
 | 
			
		||||
Welche der folgenden namen sind shell Programme? (Wähle Sie alle, welche
 | 
			
		||||
zutreffen)
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[itemsep=0pt]
 | 
			
		||||
  \item Bash
 | 
			
		||||
  \item Korn Shell
 | 
			
		||||
  \item Born Shell
 | 
			
		||||
  \item Dash
 | 
			
		||||
  \item Z Shell
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
\subsection{Aufgabe}
 | 
			
		||||
\label{sec:assessment-test.aufgabe02}
 | 
			
		||||
Sie sind Administrator eines Linux Servers. Sie benötigen jene Logs seit dem 30
 | 
			
		||||
Mai, welche die IPv4 Adresse 192.168.10.42 enthalten. Das Datum wird in
 | 
			
		||||
englischer Notation gespeicher. Die Logs sind in \texttt{/var/log/messages}
 | 
			
		||||
gespeichert. Welche der folgenden \texttt{grep} Befehle ist der beste Befehl?
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[itemsep=0pt]
 | 
			
		||||
  \item \bashinline{grep "May 30?192.168.10.42" /var/log/messages}
 | 
			
		||||
  \item \bashinline{grep "May 30.*192.168.10.42" /var/log/messages}
 | 
			
		||||
  \item \bashinline{grep -i "May 30.*192.168.10.42" /var/log/messages}
 | 
			
		||||
  \item \bashinline{grep -i "May 30?192.168.10.42" /var/log/messages}
 | 
			
		||||
  \item \bashinline{grep -v "May 30.*192.168.10.42" /var/log/messages}
 | 
			
		||||
\end{itemize}
 | 
			
		||||
							
								
								
									
										1399
									
								
								csv/credit_master.csv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1369
									
								
								csv/credit_master_cleaned.csv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1
									
								
								draw/aufgabe-netze-mit-internetanbindung.drawio
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
			
		||||
<mxfile host="app.diagrams.net" modified="2020-09-27T15:26:21.800Z" agent="5.0 (X11)" etag="5r5OPbZKd_OzWzaFqK4M" version="13.7.5" type="device"><diagram id="njiB7J01PMf0DHfhUy9N" name="Page-1">7Vxdc5s4FP01fowHJD4fEydtd6bbyWwetvuIg2yzwYgFObb761cykg0SXy5g09SdNjUXIWTdc8890oVM4Gy9+5x48epP7KNwAjR/N4GPEwB0A4AJ+6v5+8xiAyszLJPA541OhpfgB+JGjVs3gY/SQkOCcUiCuGh8xVGEXknB5iUJ3habLXBYvGvsLZFieHn1QtX6d+CTVWZ1gH2yf0HBciXurFtudmbticb8m6Qrz8fbnAk+TeAswZhkn9a7GQrZ5Il5ya77VHH2OLAERaTNBeDxfm4tgRtq377P74MvG+hv7kQ3KdmLb4x8OgH8ECdkhZc48sKnk/UhwZvIR6xbjR6d2nzFOKZGnRr/RYTsuTe9DcHUtCLrkJ+lI07239n1U1cc/pM/97jjnWdH+/zRM0qCNSIo4caUeAm5Z66mhghHSNg+BWF4vNCXWlBL7vwCR2SGQ5wcpgBqmmXNZqzVLiDZOE1+dBwm/XwaJTvY5w7kMaq+EvOON8krqnEQ5Jj3kiUiNe1EvDDv5e7AofAZYTqcZE8bJCj0SPBehLfHo2R5bMcvpbPm7XMNYhxEJM31/MwMtAEPeEvj4c3DHeoSKKX2hl3bnn7IRiCOcl/lZDoA/QzQ8zl998INn4bnmRIGVZB4RwkJKD/ch8EyoufmmBC8zp346s1R+IzTgASYNSAsKB5CyfpKkcDg8eDxfo6GXJzgDQmDCM2O3HbAKoVtbmCzw58D5hP8hnJnLMfRHyA9s0w8P0Cnr8NDQJgfg4T2ng0rYtF87EwwHmCWlRezqVnvlozppxEiW5y8pdM1jgLC+q1GOZsatKuFJT9rWkU8AI3jepsjX25a5XjXMquBnAPT+VjR7asQpOCdTqyTo1lzFDT78zRoDsJuCh0BV4KfwJroIhsov6qG11y92I8t9ZPxudLPuXRLg7xIn7IGqB+W1HwYttUdhW7jOMaIDsUKKQwe5kkhvqz/NkwSHXLyXXqIkHvaQIfx7gAhcZ5+WrL/bXtqOFPDmOquWxqrB0IuxpdCujKrrwPfz0IZ0SF480N/DMLcI7Rz82FiPvJx8kDWYSnIa4lF4cajluV3LcjFMs68o+FtOqDgWd5Tx3C4g8Ve7+Qu8GKRIjKRSbYH1JgKaF5QQudK8fAtH0v5OM3mqVrU9pCmZd7RXVNJ03ZJmpbptL80bSh4EfTiB++d+AWRlSb6omM7dJed6esOujbVpvq0L0KsGuzlZUwfmuG0BBMCqKMYOqqfn5ZCzYzfVtaIVVvj8q6t/uHxqU2BYRgSd2u95ASjYoXXJJHOlTbQPU/aQHlcddrmdPXwmUzMTz6VbQPyulIi8rbkbJvisvnrJZVBp3nFqWsluQwOlstAfS4rsjwDTat04dB0oeSKb4j82KLkzfOp0E0Ra8ebZzmJfsdPwMhllOx29YlmwLGuvfQtN0pgmlPxT8unT2WAbcYthSMFEFFAzoGcjwhuygVRLkHQyePHvGO9brUhIjNEC9IPvI+SSyg1XYU3NErgbQwGb0uB9x+MhyJGvwxv9Odzgt8Dv0Tt/2pM9RrijV9GuZXkXM/plalgQLEPmwnSLQGQvOXRG4AAvIaWHd1mmuJx9qeTGjVaitGR1Bpss6hwmxSiUb9ZNszul7ou/erFLJZv4u8nKTXM5q8XarO1FtxmXZLbVO2HolhPtZ72BrisA1ViZ6A9UkanKV8xn7OAPqNwBCp23HOetC4pc4Aa+dswNvv2pBj/B3KlJdcAHdWVZZuLfbgSLVeLxT8b8tez/2T668V8vnu80xVP9rXzVyyEDLO7mKuPOJfdYVSB2HYt1R6w21VA0EvsHYTNlmYKReuVI7Sk7KKAtnpRJQHUVQFatqQCgwHUuYoi7qlI3aZmLEnNRn1bOk3uWfq29+KyoReX4gph9VQU1qFTuI/VuHPapTk0G1S3Xtu+s+qu8/StejhU9bATfcoANVom+D6qh+X8qW7RI7Lqqx6n22CqW0ytaapY++WqcAB2pPuBy3C9ZApgqqmimmhqynC6IZ4HPpbheNedn1QqxpCpS0/A9VWGk+jb4veponugOXXtL1KGK49xNSfkK/unooFYWI1UzvbAv9L6ynTUhzcuKl9BPwusymVK67JTaS9qiQzw5oLXuxbJrv/9RFkNNJTVuo70ioW4Q4roVojrJnrMIpEaQBU9ABpq2A22rQFUirtsHcW2O2uAi+mWPsUFaCkuMqnQ+zoU2g3Soad1qOHK0qFhYSnVc6ye3wWpdcbtZZBBXgbpRJmGDYqUWbJOHOplkHKw3N4cGi1YxLbVeMCiPsJ+A8tIwALcsTGLdR0t1qCeetVq7SVUszICgygjS3pYzjTabaooHZlShcgc6P2vqgFXjUtu3yTJTHgNSaa+MDay5XJxOwAWtgPAB9oOgLftgKG2A+QMZJVkoAtvB6gbpCODZTHsDN7cZWHnTHXb+UCRZ9wib6jIM5yxbcRBdf8bRTFM9UIFUiomAlPdvhtHhWKQB26KesqCqs8uWrIQL0YXXWak1R4Dv5fHoG2MzGPq85goqgsx+qPNs5UfxF+G9FiPaV+5KAjV7RPqL6fEXTkBoP42qw/rMNMam8PU97qow2CDw34jj8kvGwzoMXp4+sVy2br89Ov54NP/</diagram></mxfile>
 | 
			
		||||
							
								
								
									
										1
									
								
								draw/btrfs-cow.drawio
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
			
		||||
<mxfile host="app.diagrams.net" modified="2020-10-27T17:45:48.007Z" agent="5.0 (X11)" etag="WwKqZD7jocYK9EHfiNyY" version="13.8.5" type="device"><diagram id="Gn1ND9kZ1Rsn8MRQMOzS" name="Page-1">7Zzfc6o4FMf/Gh+9QxJ++dhq2324O7MzfdjefdmJEIVbJC7EqvvXbyJBwGDLHWnJRtvOlBwIhu85n0BOiCM0Xe2eMryOfqchSUbQCncjNBtBCGwIR+LPCveFxYNuYVhmcSgPqgzP8b9EGi1p3cQhyRsHMkoTFq+bxoCmKQlYw4azjG6bhy1o0vzUNV4SxfAc4ES1/hmHLCqsPvQq+28kXkblJwN3UuxZ4fJgeSV5hEO6rZnQwwhNM0pZsbXaTUkixCt1Keo9ntl7bFhGUtalArmzrL/Yy1M+fXleh9sdfPu+GwO/OM0bTjbyimVr2b6UIKObNCTiLNYI3W+jmJHnNQ7E3i13OrdFbJXwEuCbizhJpjSh2aEuCh3ihza35yyjr6S2x4dz5Lp8j2wAyRjZnb00cBSMRxqhK8KyPT9EVnBtqbEMMl8Wt5XH7PKQqO4tVxqxjJLl8dSVkHxDavkruk4UXe97FXbhiN82Yd3Dj6hBU1azFz/9CO6BpuDAUxV3WwT/NL1LyGp63xmkt+vopjdQ9J4apLfn6aY3VPSeGaS3j3TTGyl6P5ik90Q3vW1F70eD9J5o1387it5PBukNLO0eUNoetN2ESR0awrv/bGi5Y5wfhkT8YcYCznpX7eRbS/E/T/E6j4RJHMPbFvEWiybi7HWT841v5RGiAC1ojYE1ht7fwOdPTWPLKpvB9xYtKc6rRAP3Bmu6vOnalKbkJA6kCSfxMuXFgHuPcPu98G3Mx1h3cscqDkPxMa0x1ozCXh6mnGZsWC3DBdASHOizggOoT6/9wugHJAjaYJz7ju30pCtym8yhSYuuXzsMQ56iIwn5+F4WZXw2paUZi+iSpjj5TulaCvqTMLaX2Qm8YbQpN9nF7EVU/+bI0g95MrE929UL+7KQ8gusVRLFH+X5RKGqdiiV9UKcR4e2FgTijN2JNIfAK8F5Hgel+TFOyvYVIogrf9+1XCi6yQLyjqKgTMLgbEnYewdO2oMlIwlm8VuzJf0TpY5PTBp/2yfPy8fuaqjbG3KNA60jWw0e+wQNdgStlkwcAjR1YGpS4gV5uoHmGwfa0Hc01BW0M6HyRaCpGQmTMm72RDfQJjfQegbN7goaHBQ0NRU1Mwg0x9EMtHJEeAOtN9CcrqChQUFTc5Am5dhdoBtoQFH3BtploLldQbMHBc1VQDNpcsXVbYxmq9nbG2iXgeZ1Bc0ZFDRPAc2kWTVPt6wjfD/rWDH1UFn74w7UqTsy+BF3depqEJ7hrk+GOiJUvBI4GEIKQb0CFGLiL1pnwtzAJ/NFP6D4TU6Gfx0RDTnGAh3JaN6RrA/I+PqbUNeEPBg0T6jm4y+c+OqBB6Dd6y9qcu+6g//joL40Jyer/kHjw9suMjLgySAZOScuLxoma1VeV04EYPNEyssaBd7KiQ7hc7yeC3rYIQfX/5Mg+7CH7ZogBoPmrdT88IUTMT30sKccDd7DoiHHwKbw0DWPCwZNL6lp3NllPGg16IW6LQVA6EbWxWR1TdyCQfNJat7WpAkSpNuiD2TfyLqYrK6Z2mJSYiiy1EStSTMiSLflPci5kXUxWX5XsrwhyVLXuZg0BWJrl8lSe7Ke1hVt5m802azIuYVFV7ZqCJz2qS2rhqDV4vpPWzVkq4mInNFMfKGFnl4QgSL7buD0xOPJVIvdsuboi72iDodNeiFetycLWx0jmbTQR7uZE1u935j0Grp2eVRbfZ46dvLWPKHBa349vf2xJy+9Yw/e26vf83O97vFc3dxT9p419wQZwUx457hw/mr845z6B6n+aXsvBf66e3ix+mazYo61+n449PAf</diagram></mxfile>
 | 
			
		||||
							
								
								
									
										1
									
								
								draw/differentielles-backup.drawio
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
			
		||||
<mxfile host="app.diagrams.net" modified="2020-11-08T13:47:52.153Z" agent="5.0 (X11)" etag="Lje8PvzWndpk4Yfm-F20" version="13.9.2" type="device"><diagram id="s1RfbO-vQOXVO2XHRdqD" name="Page-1">7VzbcqM4EP0aP84WSFzsx0kyk62tStVsJTuz+0hAttnByIXxxN6vXxEkLmrbKDYCglOVB6sRcuv0Uaul7niCb1e7+8RbLx9oQKIJMoLdBN9NEDIthCbZnxHsc4mLnFywSMKAdyoFj+F/hAsNLt2GAdnUOqaURmm4rgt9GsfET2syL0noS73bnEb1b117CwIEj74XQemPMEiXuXSK3FL+OwkXS/HNpjPLn6w80ZnPZLP0AvpSEeEvE3ybUJrmn1a7WxJl4Alc8ve+HnlaKJaQOFV54ZP575P58Mc3Hy/jP/ffn+43wV+f+Ci/vGjLJ8yVTfcCgYRu44BkgxgTfPOyDFPyuPb87OkLszmTLdNVxFom+zgPo+iWRjR5fRcHNpkGFpNv0oT+JJUnU/SMHYc9gdMQOpEkJbuKiE/rntAVSZM96yKeGhxizjHk8PZLaTGLi5ZVYwmhx0myKIYucWQfOJRvgBU1w0ri4HPGT9byI2+zCf06kkdxIUGNsRCVyqztA7MWsoREXhr+qvP8EBL8G77RkGlSgD6tY27JWG7oNvEJf6lKy9PjmEgaJ/WSBUnBOK9mKSZ9vqXw+C1lSZYyzrSUK5tcHkizqSxgqvsbYCzmMtK6eequJ6YxkfwUF3lRuIgzGzMzEia/yRxQyHaCz/zBKgyC7GsO+sC6l2zBqeEj66LBp8nLpzWXZgP0vybheOGX9xTL7Bl/R+9OPZ/Pke8f2qkD59mx29qpnTqqeNozqi5A9YHGI2a1MzBWz8bA6gIewWrF+FNb+CmsWoH1iX0YLa1lA/ROa1PhAPAOeC0FfFgxBplqgxVG6z8YguPltRxx987rUUQhWDoRYUMNVlM+8LSHK4xDnpbbZLzMlk3QP7OnwAKjPt9YQzvfmDAUHHUobg0tFEdXFjTaQwsaiylcSXRjDy26EcHM1ezCztB2YaRwHT/8fJS8t5qK9wH6LgQQvL1tFddu4nZ5y8Qz1bhdF6yjuL6SN0LsqsGKdcGKNXuBjmCVb0/6vhXEo3AC8p6FhW9rgNW1dcEKz+4A1qYUcgl71iK7MP07M8FvTOm8+U/l0d2Om+e1sReNmE0mfwvZol28ljXK915b4sWjNsnzwidmzhHN074n+nGABpION6XMqm1LC041H25KC9xWzIczJnj7Srd11mGjrrBlG6f1ck/2Zx9yDdqto4D3J5eugtYJ3UhUESgMlKmWvOOqMlUuJgAD6WKqc5qpQC+nC6YqBG0dMfUsR3+xvx4Iu4txLmb3rCd2uw3slvVyO2C3CH0+2N0vu7HZErtx0zLRxe7paXYDvaZdsBvmHwNvvwEMH80NnSuj3PcNnfW20w5H9R1Vy0rBM5aRVF23s4ZxdBfLwng8o44x5pJZ+R6r97Xytkjz3a8VcHV15loB47S0xR1RV+uOJZCucABd2TosTnm9la7DxCq+MhuYdt82eNs/2rx7X1jk/C70hWAczXGDDf/L5pSdDp4fyxNj9bhYHhDbvrYTWeOBMEG+2JidyQT5dgwsTt1UUMgXKVPB7IYKw/IJbTHBki4Tihv+rpgAj93faRQ9e/7P7XrEe6i0ABXz4vr2UHj2vgvnc5JNMWTvExb7GjdjN4p1ZC30ZpUWMl9HcRmKI5Mqb9C5/0NsytciXYc3LSR/rsZY8lLDiufytozlKPw6xYexjmSbsFz1pttY6MNYZyd1QGSo2VhuCytrkDVLAyGK1VblhiXX8mjK/gGFG2qMgF5d1Bi5LbgY3TVGYyOg3VHpEFC4oXQI6NVF6ZDbwq8FDbK4YnSs7agkCCjcUBIE9OqiJMht4Ur3g7UdsNbpqNQHKNxQ6gP0uqzUhzXLXz3Mu5e/HYm//A8=</diagram></mxfile>
 | 
			
		||||
							
								
								
									
										1
									
								
								draw/einfache-netze-mit-internetanbindung.drawio
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
			
		||||
<mxfile host="app.diagrams.net" modified="2020-09-27T14:33:01.384Z" agent="5.0 (X11)" etag="LKVXtaolmzFDfvVzfO-V" version="13.7.5" type="device"><diagram id="njiB7J01PMf0DHfhUy9N" name="Page-1">7VpNc+I4EP01HKFs+QN8DJDMbFV2itocduYosLA1MZZXlgPMr18JS1i2bAMJZDJVSYWU1Wq32+rXr1sKA2e22X2hMIv/JiFKBsAKdwNnPgDAdgEYiF8r3JeSMfBLQURxKJUqwRP+haTQktIChyivKTJCEoazunBF0hStWE0GKSXbutqaJPWnZjBChuBpBRNT+i8OWVxKJ2Bcyb8iHMXqybYflDMbqJTlm+QxDMlWEzn3A2dGCWHl1WY3Q4lYPLUu5X0PHbNHxyhK2Tk3gPnd0o9AkFjfvi/v8NfCCYuhMpOzvXpjFPIFkENCWUwiksLkvpJOKSnSEAmzFh9VOo+EZFxoc+FPxNheRhMWjHBRzDaJnOUe0/13cf8oUMMf+tx8J42Xo70+WiCKN4ghKoU5g5TdiVBzQUpSpGQPOEmON4YNDS7R5tckZTOSEHpYAseyfH82E1o7zEo/PTk6usmvKy/FYK8Nmj6asVLrTgq6Qj0BciTmIY0Q69FT+SKipz1BQuELItwduucKFCWQ4Zc6vKHMkuioJ2/lqwb3mkJGcMpyzfJCCLiCTHjfkukt092xG6Bs6LvjXn1+UXqgRtqrVKID0C8AvVzTF5gUchkWMyMNuiDxgijDnB/uEhylfG5JGCMbbeIRLlGyIDlmmAgFJpJimjSkK44EAY8plHaOAi1PSMESnKLZkdsOWOWw1RybHX4OmKfkGWkz/mRiTx0+E1EYYlS9jkwBJZ5jyq2XbqUim4/GFOMBIYlhJpZms4sE049SxLaEPuejDUkxE3a7US6WBu16YSlnPb+OB2BJXG818pWiWONd3+sGsgamy7Fij38LQSreeRPraDTrfQiafT0NejdhN4OOQNCAn8KaMlE6Ku/q4bXArtsZN+yUfG7YuZRueZLX6bPZA/S71VC/DdvaE4NusywjiLviJxwG0yXlV5G4sifByOZg9UbupDXtDtxaTxWDP5sEvcFhWGYlyvEvuDzYE2iUi8uNe9OBN2/FZy8nGLR2bEPlU2qdXhvdDcXLTkAtKNLSG5E8dOpWh00TZL3OERs0+fEKAfeMeD8hytfKiOhnKW2U0rxcp+5+9AoVtkkZduAZFXbcUmGbTHi9CusaeFHMEOIXRQ2IxZYS88doMy3KdgBGtj8Z2WP+MWmmy8771/lrFNVqj6I6hDd2C8f24NW9wuvrvNrGnNzvnNsQSNRbI+C6boMRraswrdux5TnVM1xa653gslrvNP3qK/bV3bevD2p99AKxxWwVGxn4uQc7t3CU63eVAuFMTm/BbKulQjg3qxDgnAqhRAI0NRj5/xVETQzzAxXfcQV7ku2qSWXlG2K/tog+w5C3izkSelJdqyn8RR+Aq5WR8pn91eWGDm9g/qy5CngDrT5Wb/k7x+9GTnIUMQPpEs16WkiRlkniYbIS8sWTY2nY7mvcVXomaM2ug/FjN6OaINvEuOO2YNy9GcZ9A+N/CTJKBQcLvPG/C0pecNjSSP9pdLVKSBG28W4nQ/cTe2c9uGEf7ZxmyaAFQM2DgKsBCDi/o4H9cEdMRsTFz5taUvfMjvSDnMCPvXqbe6pNdPuPkG5zJmRu+R5hJnL5swN8JaUm5fpdhdrG1hnc5r8nt5kNIEozO29pbvQ2DXQ1Lzc6PhT0WLZrB9NXiITXjMTYPKxpqzI3a8WBmbnbJPNORcKsTX9aJHyv+Z+B94sEiuL1+kfB/lmE9164WS+Xu/nQNgLRssU4HLSDs3ck2vn7+LLtQO1M67ydwfnx3saYoacMHsr0lvOe0bl0RLMl5t1bgkZ8A5Pz2jYE4PL48mH1rY+yolbfnXHu/wc=</diagram></mxfile>
 | 
			
		||||
							
								
								
									
										1
									
								
								draw/einfache-netze.drawio
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
			
		||||
<mxfile host="app.diagrams.net" modified="2020-09-27T14:28:17.128Z" agent="5.0 (X11)" etag="pKZ9F801HblY14u58-0M" version="13.7.5" type="device"><diagram id="njiB7J01PMf0DHfhUy9N" name="Page-1">7VlNc6M4EP01HOMC8WH7aONk55CdSlUOO3uUjQyaCMQKEdv59SuBBAJsEqfwzG5VXHEVemo1Teu1Xgdbbpge/2AwT/6kESIWsKOj5W4sABwPAEv+2dGpRuYgqIGY4UgZtcAzfkMKtBVa4ggVHUNOKeE474I7mmVoxzsYZIweumZ7Srp3zWGMBsDzDpIh+heOeFKjCzBv8W8Ix4m+sxMs65kUamP1JEUCI3owIPfeckNGKa+v0mOIiEyezku97uHCbBMYQxn/yAKwWW2DGCyJ/f3HdoW/lW5U3mk3BT/pJ0aRSIAaUsYTGtMMkvsWXTNaZhGSbm0xam0eKc0F6AjwJ+L8pHYTlpwKKOEpUbMiYnb6IdfPlnr4tzm3OSrn9ehkjp4QwyniiCmw4JDxldxqAWQ0Qxp7wIQ0C6OehUCM+T3NeEgJZVUKXNsOgjCUVkfM6zh9NWrCFNdtlHJwMgb9GOsky8xe3Dy9EbRkOzSyY64qAshixEfsnJZjojgRFeGwk1jIEIEcv3YDgapK4sZOLRVZgyfDIKc444Xh+UkCwkAVvO8ptqtyd50eKXv2njNqLy7qCPTIeJQWqoh+BelVCl8hKVUansJBGVyixCtiHIvzYUVwnIm5LeWcpsbEI9wi8kQLzDGVBlwWxZr00J3YeEmPNVR+GsCoE1pygjMUNmdbxVVBWyOwsPpUnGf0BRkzwWLhrF0xEzMYYdQ+jioBDW8wE97rsDJZzY0zfeIBiSQwl6lJj7E86WcZ4gfKXopZSjPMpV/FcpkHdBzn+ZCWmj92lw9Ajw/G4augxDh3A/8ykQ0yXc8Vf8CVZ8TEIw748sWLHi+KOk+XD9cJ6OLMu3Rxlv6ALvMzdNEUmpwujjfgiwUCIm67jvCruIzlJeKJrWFxG2PmjLGzBDMnWMycufjq+S3rr+j7+fWqPoUQt4KrRfZzgtt0GE1L8en+YkLt1mL3rnj7o6y3Z8DzvA7x73SXeZ28D/TYvaDfjYv6GdWqtliu7RNct3effvPaswf9uMBIn9Cu1uHQ/b5A3OpX9wS9hM6PKRAHzHfJV0PxaeGo8zeJQGiejPUTjn1GIdybKQT4iEJoSJKmQ6Pgn5LqibuiOopXwsBZ5Md2Unv5jvjbAbEXGDFUFEjaKXNDU8SDPgDPkJH6nuPqcsOAU1i8GKEC35/prz0qfx+Ju1eTglh8wHTFZrMsFGRUkryZUkKRPDVWjp0zVZ3iKKpkVpcnQXs+DcebbkY3Qc6Q4825bnLcuxXHgfs7+g/jrYL/33yrID/TdhTeBxuK3/M2QAjGVSrvzq9Q+akUfNixP8JcauyXgH9SwEmdv0kOt8B7X8CXwfBsm9/sbBvqN8pypzijTabKgkvaY2zuYOMvioiQc/wGt5UryQBViMKvv7b8jfQljsdabSvXE+yE19+J+fB/7eWv7KTAsHIPJPff24mhNv3fdsJf9nZicbOdEMP2F4r6xG1/53Hv/wU=</diagram></mxfile>
 | 
			
		||||
							
								
								
									
										1
									
								
								draw/inkrementell-backup.drawio
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
			
		||||
<mxfile host="app.diagrams.net" modified="2020-11-08T13:50:31.826Z" agent="5.0 (X11)" etag="UwTo-BhQn7eYwiBEDnTg" version="13.9.2" type="device"><diagram id="s1RfbO-vQOXVO2XHRdqD" name="Page-1">7Vzfk6I4EP5rfNwrIID6uDOzO3dXN1V7Nb/u7g0hKjcIFuKo99dfkKCQVoluQjQ6uw+kCbHz9ZdOpxPooPvJ8jH1puOnJMBRxzKCZQc9dCzLtC2rk/83glUh6VpuIRilYUArbQXP4X+YCg0qnYcBntUqZkkSZeG0LvSTOMZ+VpN5aZos6tWGSVT/1ak3wkDw7HsRlL6HQTYupD2ru5X/isPRuPxl0+0XdyZeWZn2ZDb2gmRREaFvHXSfJklWXE2W9zjKwStxKZ77vufuRrEUxxnPA1/Mf1/Mp99/+Ggc/7l6e3mcBa9faCufXjSnHabKZqsSgTSZxwHOGzE66G4xDjP8PPX8/O6C2JzIxtkkIiWTXA7DKLpPoiRdP4sCB/cCm8hnWZp84MqdnjVArkvuwG6UOuE0w8uKiHbrEScTnKUrUqW8a1CIKccsl5YXW4vZVDSuGqsUepQko03TWxzJBYXyCFitZlhxHHzN+UlKfuTNZqFfR3IvLjioMRaiUum1s6PXpSzFkZeFn3We70KC/sKPJCSabEDv1TG3WSxnyTz1MX2oSsvD7ZgW007mpSOcgXbWZtl0+nRLIf0tZTOWMk60VJc1OduQZFPZwFSPd8BYxGVkdfPUXU+cxJjxU1TkReEozm1MzIiJ/C53QCGZCb7SG5MwCPKf2ekD615SgFNDe8ZFg09jh48wl+ZKnik83Bv6u2YK1+/hwVDQTOHWUUU9xaj25KI6dPJ/O1Fd/+VPJHFWkRd/YtDewHYuaPd14DBAlTPakYaqKTmIVEzi3mlwS4stTY7g8gJYzMLKOb/JgxWGFxqxGNmnwd2TBrcW8QSA1VDsiy2O9cz5L+htZkFv8k5x8hb0jg50tdnwt8+ZKJEGa1dnp+uwkZpyuLUIgAGsXcVOF0mOyBSzmI3UOOFG0uCWPce1w+IT1xXSnAPSOgB22UjNcbjgth1ZcGsRUQBYLT5Y5TkHjoiiKaG/hT0v4WWY/ZWb4JeuQ4t/V249LKl51oVVWYhJZ4qnLKcsbx7LC9vn1qXywb02KZLrB3pOO34mmw4mk7+2WYvz7jqYjJ90OHcdiIW9VaXaNK8wO0JhxzisV/dgfXJRaCB2t4ojX3wku4UT9VwI2BdEQHYnBjQkioCswg0EBHq1QkCOFcSNgIV9HFEEbGKyIAIChZsIeJiwcghYBhM3AjYSEJmCCIiamCyIgEDhBgICvVohIMdi/0bAOk9+loA2G2tJIiBQuIGAQK9WCCjgyNK1EFBUDOi0FAMChRsICPRqhYAciaIbAYtmRMWATksxIFC4iYBKYkCO1NmNgOsarqgY0G0pBgQKNxAQ6NUKAeHhhcBbzQAJtTmM2mVRLq2kasvNPi7NS1G9oEPbTGSJWCR5x22/oR3ZZ7ZhwjKnjqHzyW12e1r5WDkuZ3fxYwWcAjpxrIB2BE1xe9SVOmOVSFc4YF3ZONzky1WNQweek0ZXZgPTUW2D45InF+8LNycnf9IXgnYkxw2OgBzDdlFXXdFt13CiN+DLs7dnwgR2O6d/IhPYfUYwOGVTQcBqf0MFsx0qnJdPEMUEm1mbb45AtMUEuOx+S6Jo4Pkf86nGcygzAFUfd3Xg2vu3+CPFkxyuKMIk9DXudLeJvWcoKDOKgJNBe3E5Fz/GvL5gnfomO3vUBrUd3Qg4RXM1xmKHGuJclosylsvxeuvNWHvOBCH2uLpsY1k3Y518rgcEhuKM5X7O/jD+eXhHb4vB6zzF6Sse7Pj40Pc0BOY6p5gBBAg7eLI3ZmA/U9TmJspO/OFYeUpijfF3zwx/mIt6IRfa4s8mA5XjD3NM76S/+uLPfr9JNf4wsfMynqf6GoD9WoByA8B8itYTMPtZAeX4w0SK1hMw+/kB5fjDnInWEzD74rxy/GEaROsJmH3lWzn+5e9fzQzMvq6s3gICkktCj7IyOQ4ucC/tjeKW3iZR/EYxKW4/Ll1U336iG337Hw==</diagram></mxfile>
 | 
			
		||||
							
								
								
									
										1
									
								
								draw/overlayfs.drawio
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
			
		||||
<mxfile host="app.diagrams.net" modified="2020-11-01T10:54:19.725Z" agent="5.0 (X11)" etag="vngRYxWJjwUmDCPF0SRJ" version="13.8.8" type="device"><diagram id="gjxS07TwHvcXm2kWn2jG" name="Page-1">7Zpdb9sgFIZ/TaT1YpMNtoMv87VMaiZtqtZuVxMxxHZLTEbIV3/9cIzjOKZNJsXO1FTtBRzgYN6Hg8lJWrA3XQ8FnkVfOaGsBSyybsF+CwDbAaCV/ltkk1nawMsMoYiJ7lQY7uJnqo2Wti5iQueljpJzJuNZ2RjwJKGBLNmwEHxV7jbhrDzrDIe0YrgLMKtaH2Iio8yKQLuwf6FxGOUz256ftUxx3lmvZB5hwld7JjhowZ7gXGal6bpHWSperks27vMLrbsHEzSRpwyw+o/DWyB7bu/3aOX8uR093d5/tDWeJWYLvWL9tHKTSyD4IiE09WK1YHcVxZLezXCQtq4UdGWL5JSpmq2Kk5ixHmdcbMfCMQ4Qgco+l4I/0b0WAB3HVU671XXopS2pkHS9Z9LrGlI+pVJsVBfdCi2tsd5kdlvXVwUy29G2aA8XdDQtrLdJuPNdKKkKWsx/ENZ/C7o6qKyrc6Ksu3Fnl9U2yOoxNW2XxEtVDNMiwxsqVK8Pgt/kzWORt+YWNf/eGIMbiJIJgsTkwXrJyRkRE0zRJDAh9gJEx5MzIfYPQsf2q4yBgbFXF2LTiVQbYt91HpPllSFuXxoxbBAx8JOJDy9G2KWIOCbCCIyh59VDGHqGg7pRwk6DhC3HSQi6MsQOuDRi9z2Iz0oY2gdB7F76mPbeg7hexM7FL1vtCuIVF0/zrWwp09XNWWWeoIAGxgvPGLmOa9VzVl78bYjeosqHm/ny18r8gfZ0xrMZiwMsY55UJFbrlGUdy3olPKEH4moTZnGYqGqg1FOHH+ymqqlpWEc3TGNC0mmM4Mpo67gb+CdueFAbCbuiNiUhvdNVLmTEQ55gNiisB7oUfUaczzSgRyrlRicJ8ULyMj66juXPdPgnV9d+7bX019rztrI5Jv+cL0RAX1mj3u0Si5DK4/3S9b8KU1Cm9umynHc8P5nqZ6+riJHKqxedeFrVFyOmC/Rh0CSkkyaxC1krJPKsNDCd9+1O+veagke35Z4+rkGe3Hby7tUzfOOxepIdHtAu49mlGnMXWTjqUYXyFUceOuIoi9eKoy3C3bJPohourB/jwX0yWjwn4+HD6Ht/2mk0QYlQEPrRf39lrgSpYSOeHLfAb/CWYSQMGiQMySQE+MoIw0sTbjI9eQ0xXElPWg1+IDMSbjI9eQ0xfEjY+E3hmQiravGlefbaLn56AAd/AQ==</diagram></mxfile>
 | 
			
		||||
							
								
								
									
										1
									
								
								draw/vollbackups.drawio
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
			
		||||
<mxfile host="app.diagrams.net" modified="2020-11-08T13:49:10.728Z" agent="5.0 (X11)" etag="wgJMpjDe5lUiW8eBPVa6" version="13.9.2" type="device"><diagram id="s1RfbO-vQOXVO2XHRdqD" name="Page-1">5Vpbc6IwFP41PnZGCKA+tm7rzu447faynX1kSSppI3FCrLq/fkMJCImuqYUF6YwPcBIO5PtOTs7FHhjP1xPmL8IphYj07D5c98CXnm1bjm33kl8fblLJwPZSwYxhKCdtBXf4D5LCvpQuMURxaSKnlHC8KAsDGkUo4CWZzxhdlac9UVJ+68KfIU1wF/hElz5iyMNUOrQHW/lXhGdh9mbLG6Ujcz+bLFcShz6kq4IIXPbAmFHK06v5eoxIAl6GS/rc1Z7R/MMYirjJA2fW8701/XYTgDD6sfl5P4nhw5nU8uqTpVyw/Fi+yRBgdBlBlCjp98DFKsQc3S38IBldCc6FLORzIu4scfmECRlTQtnbswC6aAgdIY85oy+oMDK0fwPPEyP6MrJvQoyjdUEklzVBdI4424gp2WhfQixtzPbk/WrLmCNFYZGsTOhLI5nlqrc4igsJ5TtgtQ/DiiJ4ntinuAuIH8c4KCO5FxcESxaro1JYtbtj1ZmMIeJz/Fq2811IyDfcUCy+JAd9WMbcUbGM6ZIFSD5UNMt/67FsRQ/32QxxTc8bLfmij2cKdJ8pR2GqfyRTA5VyVVHNVDkaVZMLjSzhMniZnrLriWiEFD8lRT7BsyjhWNCIhPwicUBYnATncmCOIUxes9MHlr1kBU4N7NkXB3yaun0qc2nWQIP/iuHu4q8eKo7VNAFDjYApjTpMgNc2AkYaAffiorME5Ei2hYBMcYGAR7Hg7hKgHriNE6CnC/fhknWXAaDGTo0zYBCvtj9hc5Sz1XINYXXrwtXxNFyhv4m7a9kDt2WW7ejxpYZ+IROTqJ5QGjYoAw5UJE3TsNEBPXVnYXoYmphOv8u5mBIIgcb3ih6Jdnqv2McWl0YH9OzZKwI4f1OYtkgmxO/+3C3FqcJK92GGdMEG7E+2D/MaSVP70NXjYfDJODAO3Wrj4H0V3JP3hXlZ5IO+UNNTXdxwTaavzvjleoxu6S/yMH9+uv1uUmj/L4mLZuk7uDeuSeWmfqjTpIJ9jPnvhFUvip8grJpjNyx2W8O6YHU7AavaWxsa+uoqnPVOWA1yvPbDqhaFLMN2sxZ9VgarnpKdIKyO4lstQ99q1+ZbDbKs9sPqqgGbaSOxNt+aZc8njqvqXE2LAqPacG3Ln3k+hKuneFfDM0srg1UHq63B2vbG98f8cION790E6KlD2xvflR6EzROgJxltb3xXemQ2T4CejrS98V3p2do8AXp7sPWN70pP4RoZELfbP0Gn1abtX8nB5V8=</diagram></mxfile>
 | 
			
		||||
							
								
								
									
										1
									
								
								draw/zwei-netze-mit-internetanbindung.drawio
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
			
		||||
<mxfile host="app.diagrams.net" modified="2020-09-27T15:06:43.732Z" agent="5.0 (X11)" etag="aVSUEErxaXeUi47Vbqjs" version="13.7.5" type="device"><diagram id="njiB7J01PMf0DHfhUy9N" name="Page-1">7VzLcuMoFP0aL+MS6L1MnKR7qnq6UpPFdC9lC9uayEIj4djurx+wwEaAZCWW8ph2KklZF4QQ93DugUsysier7Zciypd/4hilI2jF25F9O4IQOBCO2LcV7yqLD73KsCiSmFc6Gh6TX4gbLW5dJzEqaxUJxilJ8rpxhrMMzUjNFhUF3tSrzXFaf2oeLZBmeJxFqW79O4nJsrIG0D/av6JksRRPBl5YlawiUZm/SbmMYryRTPbdyJ4UGJPq02o7QSkbPDEu1X33DaWHjhUoI11ugLfXU28Bw9T6/mN6nXxd2/H6SjRTkp14YxTTAeCXuCBLvMBZlN4drTcFXmcxYs1a9OpY5xvGOTUCavwHEbLj3ozWBFPTkqxSXkp7XOx+sPvHobj8KZfdbnnj1dVOvnpARbJCBBXcWJKoINfM1dSQ4QwJ232SpocbY6UGtUjlc5yRCU5xsR8C27I8bzJhtbYJqfrp8qtDN+nnYy/ZxU66UPuo+0qMO14XM9TiIJtjPioWiLTUE/OFeU96AofCF4Rpd4odrVCgNCLJcx3eEZ8li0M9fisdtWgnVchxkpFSavmBGWgFPuE9i09vPt1toIBSqe/4rfXph6oH4kp6laNpD/QXgJ6P6XOUrvkwPEy0adAEiWdUkITyw3WaLDJaNsWE4JVU8C2aovQBlwlJMKtA2KS4SRXrjCKBweMm4u0cDNI8wWuSJhmaHLhtj1UKW6ljk/3XHvMFfkJSiRcE4MamJYsiihN0fB0+BYT5Nilo61W3MjabD40JxoPMsoxyNjSr7YIx/ThDZIOLp3K8wllCWLvNKGdDg7atsOSlrlfHA7Q4rjcS+XLTUuJdz20GsgSml2MF+O9CkIJ3zmIdiWbdD0Gzr6dBdxB20+gIhgr8BNZEE1VH+V0tvBaCeju+0k7F51o7L6VbOsnr9KlqgPZuKdWHYVsQaHSb5zlGtCteSmFwMy3opwX7BIJwDChY3bETGKfdnlvrU0XjT5WgV0kcV7MSlcmvaLpvj6GRDy5t3L0ZubdGfLZygkZrBxnKn1JTeia6u2IvG8CaU3hLZyL5yq63eqU2gefzEpGRyo89ONzV/P2ICjpWmkcvoVQJpWU1Ts16tIcIq1IGCF0twvqGCKsyYX8R1tHwIpghTp4FNSCytISZPkYqMVQGIRwDLxgDn/7oNNPUztvH+T6C6nGNIhTCmWrhIA9erRVeH+fFMubkeqerIOCot8bQcRyFEa1emNZpWPKc0gwvjfV2+LJYb6v9agv2x7uHjw9ifOQAsUnIbKnNwMsarGvgqMavlwBhB6eXYMAyRAh7sAgBu0QIYWKgqcHI+3eNRcFVuafia1oBBPn2WCha+Y7Irw0qnqKYysUSsXq8uhRT6IveQ0cKI9Uz26PLgB1eReWT1FVIBbT4sVrDX5d+K3OSoohoSOdolqcFN0kziT2MR0I6ePyaNwzahLuYnimak34wflAzQgQBHeO2Y8C4MxjGPQ3jfzAyyhgHM7zR3w8Ffk5ig5D+bHQ1S/E6NvFuI0O3E3tjPBhQR9unWTI0AEjdCOgNQNB+DwH74baYNI+zr7MkqdNRkX6QHXjfrcvcUzLRad9CGmZPSF/yfYtyNpcvCvCVlJpW49cLtflWB27z3pLbdAGIshyUBnEjyzTYJF4G2j5k9FjJtX3TPXjCVT3h65s1pigzmBSH+szdpLl7yhN6bPpsnvBcNTPwdp5Ai+V8/nNN/nqI79x4NZ9Ot7dXQHOEYYmx32iHnVck0v67/7LlQG1Pq9vKoLu/N8uEoMc82ofpDeU9Tbk0eNPg8+YlgeLfUOc804IADuXf98k7/p4HMxTJZqQKWf+ZJ+Q7Hbio53k8y22Xe35r/aZdwYanua6Sd2/Y63yFbjSPsTkt+Emy8V2S412gKC9ZjMMU6pBtWbL0nkV3QH13Rds16S37rWD5xFIHQOus+rZ7YikFWuufvZRq8/Ul2zpUtvU8VaFA1Al0WTFUttXMoHryxZxtBd1V40Hoh5dsa/do0HO2tZfAAbqKnbAV9YNmW1X9MlS2VXkOaNdVttov0ElX9ZptbXXpJds6VLb1rABhB2qA0PcVBsu2mgGjb5tdEgnHRMLbrzxPs7bfkbXfZ4nqu3VZLBaNTVSq1j9FvY66DOhGvU2987oFlN742bij6rfvqIYfY2/7LOZzraA+8G+4t232hH5wlXrCLoN2T3yIve2zPOG5H80T+mGIV6uV+gkBVaoctMz/V62s8DTZQ6uPOdtBrZh2yfvIDLaGvgtSekDK/s8WSD9I8a3TSDHq2uGgou+UyYfKzYlLpwO5f9KEF/AU4dNxLg+W8YL6SvUNj3lC9Zhn+GGPecLf6JjnebuvyjFPx3CQpa9jnvTy+Lf81eLg+B8R7Lv/AA==</diagram></mxfile>
 | 
			
		||||
							
								
								
									
										246
									
								
								examples/examples.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,246 @@
 | 
			
		||||
\section{Übung}
 | 
			
		||||
\label{sec:uebung_01}
 | 
			
		||||
 | 
			
		||||
% ##########################################################################
 | 
			
		||||
% ############################### Aufgabe 01 ###############################
 | 
			
		||||
% ##########################################################################
 | 
			
		||||
\subsection{Aufgabe}
 | 
			
		||||
\label{sec:uebung_01.aufgabe_01}
 | 
			
		||||
Starten Sie das Skript.
 | 
			
		||||
 | 
			
		||||
\subsubsection*{Lösung}
 | 
			
		||||
\label{sec:uebung_01.aufgabe_01.loesung}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% ##########################################################################
 | 
			
		||||
% ################################# Minted #################################
 | 
			
		||||
% ##########################################################################
 | 
			
		||||
\section{Minted}
 | 
			
		||||
 | 
			
		||||
% ############################### Begin-Block ##############################
 | 
			
		||||
\subsection{Begin-Block}
 | 
			
		||||
 | 
			
		||||
\subsubsection{AWK-Code}
 | 
			
		||||
\begin{awkcode}
 | 
			
		||||
  if NR > 3 {
 | 
			
		||||
    print "0";
 | 
			
		||||
  }
 | 
			
		||||
\end{awkcode}
 | 
			
		||||
 | 
			
		||||
\subsubsection{JSON}
 | 
			
		||||
\begin{jsoncode}
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Molecule Man",
 | 
			
		||||
    "age": 29,
 | 
			
		||||
    "secretIdentity": "Dan Jukes",
 | 
			
		||||
    "powers": [
 | 
			
		||||
      "Radiation resistance",
 | 
			
		||||
      "Turning tiny",
 | 
			
		||||
      "Radiation blast"
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
\end{jsoncode}
 | 
			
		||||
 | 
			
		||||
\subsubsection{R-Code}
 | 
			
		||||
\begin{rcode}
 | 
			
		||||
  print(match(5, c(2,7,5,3))) #  5 is in 3rd place
 | 
			
		||||
  print(seq(from=1,to=3,by=.5) %in% 1:3)
 | 
			
		||||
\end{rcode}
 | 
			
		||||
 | 
			
		||||
\subsubsection{SQL-Code}
 | 
			
		||||
\begin{sqlcode}
 | 
			
		||||
  SELECT *
 | 
			
		||||
  FROM tab;
 | 
			
		||||
\end{sqlcode}
 | 
			
		||||
 | 
			
		||||
\subsubsection{XML}
 | 
			
		||||
\begin{xmlcode}
 | 
			
		||||
  <?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
  <note>
 | 
			
		||||
    <to>Tove</to>
 | 
			
		||||
    <from>Jani</from>
 | 
			
		||||
    <heading>Reminder</heading>
 | 
			
		||||
    <body>Don't forget me this weekend!</body>
 | 
			
		||||
  </note>
 | 
			
		||||
\end{xmlcode}
 | 
			
		||||
 | 
			
		||||
% ################################ Input-File ###############################
 | 
			
		||||
\subsection{Inputfile}
 | 
			
		||||
 | 
			
		||||
\subsubsection{AWK-Code}
 | 
			
		||||
\inputsql{examples/test.awk}
 | 
			
		||||
 | 
			
		||||
\subsubsection{JSON}
 | 
			
		||||
\inputsql{examples/test.json}
 | 
			
		||||
 | 
			
		||||
\subsubsection{R-Code}
 | 
			
		||||
\inputsql{examples/test.r}
 | 
			
		||||
 | 
			
		||||
\subsubsection{SQL-Code}
 | 
			
		||||
\inputsql{examples/test.sql}
 | 
			
		||||
 | 
			
		||||
\subsubsection{XML}
 | 
			
		||||
\inputsql{examples/test.xml}
 | 
			
		||||
 | 
			
		||||
% ################################## Inline #################################
 | 
			
		||||
\subsection{Inline}
 | 
			
		||||
 | 
			
		||||
\subsubsection{SQL-Code}
 | 
			
		||||
\sqlinline{SELECT * FROM tab;}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% ##########################################################################
 | 
			
		||||
% ################################ Info-Boxen ##############################
 | 
			
		||||
% ##########################################################################
 | 
			
		||||
\section{Info-Boxen}
 | 
			
		||||
 | 
			
		||||
% ################################### WARN #################################
 | 
			
		||||
\begin{warn-popup}
 | 
			
		||||
  Warn-Popup
 | 
			
		||||
\end{warn-popup}
 | 
			
		||||
 | 
			
		||||
% ################################### INFO #################################
 | 
			
		||||
\begin{info-popup}
 | 
			
		||||
  Info-Popup
 | 
			
		||||
\end{info-popup}
 | 
			
		||||
 | 
			
		||||
% ################################# Example ################################
 | 
			
		||||
\begin{example-popup}
 | 
			
		||||
  Example-Popup
 | 
			
		||||
\end{example-popup}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% ##########################################################################
 | 
			
		||||
% ################################# Akronyme ###############################
 | 
			
		||||
% ##########################################################################
 | 
			
		||||
\section{Akronyme}
 | 
			
		||||
\acrfull{acr:sql}\\
 | 
			
		||||
\acrlong{acr:sql}\\
 | 
			
		||||
\acrshort{acr:sql}\\
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% ##########################################################################
 | 
			
		||||
% ################################ Text-Boxen ##############################
 | 
			
		||||
% ##########################################################################
 | 
			
		||||
\section{Text-Boxen}
 | 
			
		||||
\begin{textblock*}{\textwidth}(4cm,0cm)
 | 
			
		||||
  Ich bin eine Textbox
 | 
			
		||||
\end{textblock*}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% ##########################################################################
 | 
			
		||||
% ############################### Aufzählungen #############################
 | 
			
		||||
% ##########################################################################
 | 
			
		||||
\section{Aufzählungen}
 | 
			
		||||
\begin{itemize}[itemsep=0pt]
 | 
			
		||||
  \item Item
 | 
			
		||||
  \item Item
 | 
			
		||||
  \item Item
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
\begin{enumerate}[itemsep=0pt]
 | 
			
		||||
  \item Item
 | 
			
		||||
  \item Item
 | 
			
		||||
  \item Item
 | 
			
		||||
\end{enumerate}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}[itemsep=0pt]
 | 
			
		||||
  \item[A)] Item
 | 
			
		||||
  \item[B)] Item
 | 
			
		||||
  \item[C)] Item
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
\begin{description}[itemsep=0pt]
 | 
			
		||||
  \item[Itempoint 1] \mbox{} \\
 | 
			
		||||
  \lipsum[1]
 | 
			
		||||
  \bigskip
 | 
			
		||||
 | 
			
		||||
  \item[Itempoint 2] \mbox{} \\
 | 
			
		||||
  \lipsum[1]
 | 
			
		||||
  \bigskip
 | 
			
		||||
 | 
			
		||||
  \item[Itempoint 3] \mbox{} \\
 | 
			
		||||
  \lipsum[1]
 | 
			
		||||
\end{description}
 | 
			
		||||
 | 
			
		||||
% ##########################################################################
 | 
			
		||||
% ################################# Tabellen ###############################
 | 
			
		||||
% ##########################################################################
 | 
			
		||||
\section{Tabellen}
 | 
			
		||||
 | 
			
		||||
% ################################# tabularx ###############################
 | 
			
		||||
\begin{table}[H]
 | 
			
		||||
  \begin{tabularx}{\textwidth}{X|X|X|X}
 | 
			
		||||
    \textbf{FIRSTNAME} & \textbf{LASTNAME} & \textbf{BIRTHDAY} & \textbf{HIREDATE} \\
 | 
			
		||||
    \hline\hline
 | 
			
		||||
    Maximilian & Arbeitsscheu & 1998-06-21 & 2007-04-18 \\
 | 
			
		||||
    Henry & Großkreutz & 1990-09-01 & 2009-02-10 \\
 | 
			
		||||
    Leni & Mayer & 1996-10-15 & 2009-02-10 \\
 | 
			
		||||
    $[$\dots$]$ & $[$\dots$]$ & $[$\dots$]$ & $[$\dots$]$ \\
 | 
			
		||||
  \end{tabularx}
 | 
			
		||||
  \caption{tabularx - beispiel\_01}
 | 
			
		||||
  \label{tbl:beispiel_01}
 | 
			
		||||
\end{table}
 | 
			
		||||
 | 
			
		||||
% ########################## tabularx - multicolumn ########################
 | 
			
		||||
\begin{table}[H]
 | 
			
		||||
  \begin{tabularx}{\textwidth}{X|X|X|X}
 | 
			
		||||
    \textbf{FIRSTNAME} & \textbf{LASTNAME} & \textbf{BIRTHDAY} & \textbf{HIREDATE} \\
 | 
			
		||||
    \hline\hline
 | 
			
		||||
    \multicolumn{2}{c|}{\textbf{Multi-column}} & 1998-06-21 & 2007-04-18 \\
 | 
			
		||||
    Henry & Großkreutz & \multicolumn{2}{c}{\textbf{Multi-column}} \\
 | 
			
		||||
    \multicolumn{3}{c|}{\textbf{Multi-column}} & 2009-02-10 \\
 | 
			
		||||
    $[$\dots$]$ & $[$\dots$]$ & $[$\dots$]$ & $[$\dots$]$ \\
 | 
			
		||||
  \end{tabularx}
 | 
			
		||||
  \caption{tabularx - beispiel\_02}
 | 
			
		||||
  \label{tbl:beispiel_02}
 | 
			
		||||
\end{table}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% ############################ tabularx - multirow #########################
 | 
			
		||||
\begin{table}[H]
 | 
			
		||||
  \ttfamily
 | 
			
		||||
  \begin{tabularx}{\textwidth}{X|X|X|X}
 | 
			
		||||
    \textbf{FIRSTNAME} & \textbf{LASTNAME} & \textbf{BIRTHDAY} & \textbf{HIREDATE} \\
 | 
			
		||||
    \hline\hline
 | 
			
		||||
    \multirow{2}{*}{\textbf{Multi-row}} & Arbeitsscheu & 1998-06-21 & 2007-04-18 \\
 | 
			
		||||
    & Großkreutz & 1990-09-01 & 2009-02-10 \\
 | 
			
		||||
    Leni & Mayer & 1996-10-15 & \multirow{2}{*}{\textbf{Multi-row}} \\
 | 
			
		||||
    $[$\dots$]$ & $[$\dots$]$ & $[$\dots$]$ & \\
 | 
			
		||||
    \hline
 | 
			
		||||
  \end{tabularx}
 | 
			
		||||
  \caption{tabularx - beispiel\_03}
 | 
			
		||||
  \label{tbl:beispiel_03}
 | 
			
		||||
\end{table}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% ################################## tabular ###############################
 | 
			
		||||
\begin{table}[H]
 | 
			
		||||
  \ttfamily
 | 
			
		||||
  \begin{tabular}{l|l|l|l}
 | 
			
		||||
    \cellcolor{light-grey} \textbf{FIRSTNAME} & \textbf{LASTNAME} & \textbf{BIRTHDAY} & \cellcolor{grey} \textbf{HIREDATE} \\
 | 
			
		||||
    \hline\hline
 | 
			
		||||
    Maximilian & Arbeitsscheu & \cellcolor{orange}1998-06-21 & 2007-04-18 \\
 | 
			
		||||
    Henry & \cellcolor{red} Großkreutz & 1990-09-01 & 2009-02-10 \\
 | 
			
		||||
    \cellcolor{green} Leni & Mayer & 1996-10-15 & \cellcolor{blue} 2009-02-10 \\
 | 
			
		||||
    $[$\dots$]$ & \cellcolor{yellow} $[$\dots$]$ & \cellcolor{brown} $[$\dots$]$ & $[$\dots$]$ \\
 | 
			
		||||
  \end{tabular}
 | 
			
		||||
  \caption{tabular - beispiel\_04}
 | 
			
		||||
  \label{tbl:beispiel_04}
 | 
			
		||||
\end{table}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% ################################## tabular 2 ###############################
 | 
			
		||||
\begin{table}[H]
 | 
			
		||||
  \begin{tabular}{llll}
 | 
			
		||||
    \toprule[2pt]
 | 
			
		||||
    \cellcolor{light-grey} \textbf{FIRSTNAME} & \textbf{LASTNAME} & \textbf{BIRTHDAY} & \cellcolor{grey} \textbf{HIREDATE} \\ \midrule[1.5pt]
 | 
			
		||||
    Maximilian & Arbeitsscheu & \cellcolor{orange}1998-06-21 & 2007-04-18 \\ \midrule
 | 
			
		||||
    Henry & \cellcolor{red} Großkreutz & 1990-09-01 & 2009-02-10 \\ \midrule
 | 
			
		||||
    \cellcolor{green} Leni & Mayer & 1996-10-15 & \cellcolor{blue} 2009-02-10 \\ \midrule
 | 
			
		||||
    $[$\dots$]$ & \cellcolor{yellow} $[$\dots$]$ & \cellcolor{brown} $[$\dots$]$ & $[$\dots$]$ \\
 | 
			
		||||
    \bottomrule
 | 
			
		||||
  \end{tabular}
 | 
			
		||||
  \caption{tabular - beispiel\_05}
 | 
			
		||||
  \label{tbl:beispiel_05}
 | 
			
		||||
\end{table}
 | 
			
		||||
							
								
								
									
										11
									
								
								examples/test.awk
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,11 @@
 | 
			
		||||
BEGIN {
 | 
			
		||||
  print "HELLO;WORLD;";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
  print $0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END {
 | 
			
		||||
  print "END";
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								examples/test.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,22 @@
 | 
			
		||||
{
 | 
			
		||||
  "glossary": {
 | 
			
		||||
    "title": "example glossary",
 | 
			
		||||
    "GlossDiv": {
 | 
			
		||||
      "title": "S",
 | 
			
		||||
      "GlossList": {
 | 
			
		||||
        "GlossEntry": {
 | 
			
		||||
          "ID": "SGML",
 | 
			
		||||
          "SortAs": "SGML",
 | 
			
		||||
          "GlossTerm": "Standard Generalized Markup Language",
 | 
			
		||||
          "Acronym": "SGML",
 | 
			
		||||
          "Abbrev": "ISO 8879:1986",
 | 
			
		||||
          "GlossDef": {
 | 
			
		||||
            "para": "A meta-markup language, used to create markup languages such as DocBook.",
 | 
			
		||||
            "GlossSeeAlso": ["GML", "XML"]
 | 
			
		||||
          },
 | 
			
		||||
          "GlossSee": "markup"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										0
									
								
								examples/test.r
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										3
									
								
								examples/test.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,3 @@
 | 
			
		||||
CREATE OR REPLACE VIEW "EMPLOYEES" AS
 | 
			
		||||
SELECT *
 | 
			
		||||
FROM dwh.employees;
 | 
			
		||||
							
								
								
									
										20
									
								
								examples/test.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,20 @@
 | 
			
		||||
<!DOCTYPE glossary PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
 | 
			
		||||
<glossary>
 | 
			
		||||
  <title>example glossary</title>
 | 
			
		||||
  <GlossDiv>
 | 
			
		||||
    <title>S</title>
 | 
			
		||||
    <GlossList>
 | 
			
		||||
      <GlossEntry ID="SGML" SortAs="SGML">
 | 
			
		||||
        <GlossTerm>Standard Generalized Markup Language</GlossTerm>
 | 
			
		||||
        <Acronym>SGML</Acronym>
 | 
			
		||||
        <Abbrev>ISO 8879:1986</Abbrev>
 | 
			
		||||
        <GlossDef>
 | 
			
		||||
          <para>A meta-markup language, used to create markup languages such as DocBook.</para>
 | 
			
		||||
          <GlossSeeAlso OtherTerm="GML">
 | 
			
		||||
          <GlossSeeAlso OtherTerm="XML">
 | 
			
		||||
        </GlossDef>
 | 
			
		||||
        <GlossSee OtherTerm="markup">
 | 
			
		||||
      </GlossEntry>
 | 
			
		||||
    </GlossList>
 | 
			
		||||
  </GlossDiv>
 | 
			
		||||
</glossary>
 | 
			
		||||
							
								
								
									
										15
									
								
								git-info.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,15 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
if [ $1 == "date" ]; then
 | 
			
		||||
  git log -1 --pretty=format:"%ad" --date=short
 | 
			
		||||
elif [ $1 == "commit" ]; then
 | 
			
		||||
  GV=$(git rev-parse --short HEAD)-git
 | 
			
		||||
  echo ${VERSION:-$GV}
 | 
			
		||||
elif [ $1 == "url" ]; then
 | 
			
		||||
  URL=$(git config --get remote.origin.url | sed -e 's#^git@#https://#' -e 's#systems:#systems/#' -e 's#_#\\_#g' -e 's#.git$##' )
 | 
			
		||||
  if [ -z "$URL" ]; then
 | 
			
		||||
    echo "https://git.cryptic.systems"
 | 
			
		||||
  else
 | 
			
		||||
    echo $URL
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								img/aufgabe-netze-mit-internetanbindung.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 57 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								img/btfs_subvol_snaps.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 42 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								img/btrfs-cow.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 33 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								img/differentielles-backup.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 23 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								img/einfache-netze-mit-internetanbindung.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 28 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								img/einfache-netze.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 21 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								img/inkrementell-backup.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 23 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								img/logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 21 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								img/overlayfs.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 23 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								img/vollbackups.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 13 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								img/zwei-netze-mit-internetanbindung.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 50 KiB  | 
							
								
								
									
										442
									
								
								index.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,442 @@
 | 
			
		||||
% Dokumentanklasse: a4paper, 14pt
 | 
			
		||||
% Beschreibung:     Dokumentenformat
 | 
			
		||||
% Option:           extraarticle - ?
 | 
			
		||||
\documentclass[12pt]{article}
 | 
			
		||||
 | 
			
		||||
% Packet:           xcolor
 | 
			
		||||
% Beschreibung:     Define own color schemas
 | 
			
		||||
% Option:
 | 
			
		||||
% Restriktion:      Muss vor Paket hyperref geladen werden. Ansonsten werden die Farben der Links nicht genutzt.
 | 
			
		||||
\usepackage{xcolor}
 | 
			
		||||
 | 
			
		||||
% Definiere Farben
 | 
			
		||||
\definecolor{blue}{HTML}{5E7FB8}
 | 
			
		||||
\definecolor{brown}{HTML}{BA9D5E}
 | 
			
		||||
\definecolor{green}{HTML}{79B960}
 | 
			
		||||
\definecolor{grey}{HTML}{7C7C7C}
 | 
			
		||||
\definecolor{light-grey}{HTML}{D5D5D5}
 | 
			
		||||
\definecolor{orange}{HTML}{FF7F00}
 | 
			
		||||
\definecolor{red}{HTML}{B80A0A}
 | 
			
		||||
\definecolor{violet}{HTML}{B688CB}
 | 
			
		||||
\definecolor{white}{HTML}{FFFFFF}
 | 
			
		||||
\definecolor{yellow}{HTML}{E2E66C}
 | 
			
		||||
 | 
			
		||||
% Paket:            setspace
 | 
			
		||||
% Beschreibung:     Setz über die optionen den Zeilenabstand
 | 
			
		||||
% Optionen:         Möglicher Zeilenabstand
 | 
			
		||||
%                   singlespacing = 1,0
 | 
			
		||||
%                   onehalfspacing = 1,5
 | 
			
		||||
%                   doublespacing = 2,0
 | 
			
		||||
% Restriktion:      Muss vor Paket hyperref geladen werden. Ansonsten funktioniert das Paket nicht.
 | 
			
		||||
\usepackage[onehalfspacing]{setspace}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% ###########################################################################################################################
 | 
			
		||||
 | 
			
		||||
% Paket:            appendix
 | 
			
		||||
% Beschreibung:     Das Paket dient dazu, ausschließlich das Thema einer Überschrift in das Inhaltsverzeichnis zu überführen
 | 
			
		||||
% Option:           appendix - Überführt die Überschriften des Anhangs richtig ins das Inhaltsverzeichnis
 | 
			
		||||
\usepackage[titletoc]{appendix}
 | 
			
		||||
 | 
			
		||||
% Paket:            ansmath
 | 
			
		||||
% Beschreibung:     Zum darstellen von mathematischen Formeln
 | 
			
		||||
\usepackage{amsmath}
 | 
			
		||||
 | 
			
		||||
% Paket:            bebel
 | 
			
		||||
% Beschreibung:     Stellt das Literatur-, Abbilungs-, Tabellenverzeichnis auf eine beliebige Sprache
 | 
			
		||||
% Option:           ngerman
 | 
			
		||||
\usepackage[ngerman]{babel}
 | 
			
		||||
 | 
			
		||||
% Paket:            biblatex
 | 
			
		||||
% Beschreibung:     Ermöglicht es, ein Literaturverzeichnis zu führen
 | 
			
		||||
% Option:
 | 
			
		||||
\usepackage[
 | 
			
		||||
  style=authoryear-icomp,    % Zitierstil (https://de.overleaf.com/learn/latex/Biblatex_bibliography_styles)
 | 
			
		||||
  isbn=false,                % ISBN nicht anzeigen, gleiches geht mit nahezu allen anderen Feldern
 | 
			
		||||
  pagetracker=true,          % ebd. bei wiederholten Angaben (false=ausgeschaltet, page=Seite, spread=Doppelseite, true=automatisch)
 | 
			
		||||
  maxbibnames=50,            % maximale Namen, die im Literaturverzeichnis angezeigt werden
 | 
			
		||||
  maxcitenames=3,            % maximale Namen, die im Text angezeigt werden, ab 4 wird u.a. nach den ersten Autor angezeigt
 | 
			
		||||
  autocite=inline,           % regelt Aussehen für \autocite (inline=\parancite)
 | 
			
		||||
  block=space,               % kleiner horizontaler Platz zwischen den Feldern
 | 
			
		||||
  backref=true,              % Seiten anzeigen, auf denen die Referenz vorkommt
 | 
			
		||||
  backend=biber,
 | 
			
		||||
  backrefstyle=three+,       % fasst Seiten zusammen, z.B. S. 2f, 6ff, 7-10
 | 
			
		||||
  date=short,                % Datumsformatbackend=biber
 | 
			
		||||
]{biblatex}
 | 
			
		||||
\setlength{\bibitemsep}{1em}     % Abstand zwischen den Literaturangaben
 | 
			
		||||
\setlength{\bibhang}{2em}        % Einzug nach jeweils erster Zeile
 | 
			
		||||
\addbibresource{referenzen//bibliothek.bib}
 | 
			
		||||
 | 
			
		||||
% Paket:            caption
 | 
			
		||||
% Beschreibung:     Bietet eine große Auswahl an Gestaltungsmöglichkeiten bezüglich der Beschriftung von Bildern und Tabellen.
 | 
			
		||||
\usepackage{caption}
 | 
			
		||||
 | 
			
		||||
% Paket:            colortbl
 | 
			
		||||
% Beschreibung:     Ermöglicht Tabellen, Spalten oder Zellen farbig zu gestalten.
 | 
			
		||||
% Befehle:          \columncolor
 | 
			
		||||
% Dokumentation:    http://texdoc.net/texmf-dist/doc/latex/colortbl/colortbl.pdf
 | 
			
		||||
\usepackage{colortbl}
 | 
			
		||||
 | 
			
		||||
% Paket:            booktabs
 | 
			
		||||
% Beschreibung:     Das Hauptaugenmerk von booktabs liegt dabei auf der Gestaltung der horizontalen Linien innerhalb einer Tabelle.
 | 
			
		||||
%                   Was unter anderem daran liegt, dass der Autor des Paketes Simon Fear mehrere Regeln bzw. Empfehlungen für die
 | 
			
		||||
%                   Erstellung/Gestaltung einer Tabelle gibt. Aufgrund der ersten zwei Regeln:
 | 
			
		||||
%                   1) Verwende nie und nimmer vertikale Linien.
 | 
			
		||||
%                   2) Verwende keine doppelten Linien.
 | 
			
		||||
% Dokumentation:    https://www.namsu.de/Extra/pakete/Booktabs.html
 | 
			
		||||
\usepackage{booktabs}
 | 
			
		||||
 | 
			
		||||
% Paket:            courier
 | 
			
		||||
% Beschreibung:     Lädt das Paket courier für Schriftarten mit fester Breite.
 | 
			
		||||
% Befehle:          \ttfamily     Aktiviert Courier füt Tabellen bzw. generelle begin-Blöcke
 | 
			
		||||
\usepackage{courier}
 | 
			
		||||
 | 
			
		||||
% Packet:           csquotes
 | 
			
		||||
% Beschreibung:     Muss nach babel, polyglossia, biblatex und inputec geladen werden
 | 
			
		||||
% Options:
 | 
			
		||||
%   autostyle=true  - Diese Anweisung passt das Zitatdesign so an, dass es zur momentan im Dokument verwendeten Sprache passt
 | 
			
		||||
%   autostyle=once  - Ändert das Zitatdesign einmalig, sodass es zur Grundsprache des Dokumentes passt.
 | 
			
		||||
%   autostyle=try   - Verhalten sich, sollte multilinguale Unterstützung vorhanden sein, wie true und once, doch werden sie,
 | 
			
		||||
%                     für den Fall, dass dies nicht möglich wäre, keine Warnungen erzeugen. (D. h. falls weder babel noch
 | 
			
		||||
%                     polyglossia geladen wurden). Die Kurzformautostyleist äquivalent zu autostyle=true
 | 
			
		||||
% Dokumentation:    http://mirrors.ibiblio.org/CTAN/info/translations/csquotes/de/csquotes-DE.pdf
 | 
			
		||||
\usepackage[autostyle=true]{csquotes}
 | 
			
		||||
 | 
			
		||||
% Paket:            enumitem
 | 
			
		||||
% Beschreibung:     Zeilenabstände bei Aufzählungen definieren
 | 
			
		||||
% Option:
 | 
			
		||||
\usepackage{enumitem}
 | 
			
		||||
 | 
			
		||||
% Paket:            eurosym
 | 
			
		||||
% Beschreibung:     Bildet das Euro-Zeichen in unterschiedlichen Varianten ab
 | 
			
		||||
% Option:
 | 
			
		||||
\usepackage{eurosym}
 | 
			
		||||
 | 
			
		||||
% Paket:            fancyhdr
 | 
			
		||||
% Beschreibung:     Ermöglich ein generelles Seitenlayout ein zu stellen mit Kopf und Fußzeile.
 | 
			
		||||
\usepackage{fancyhdr}
 | 
			
		||||
 | 
			
		||||
% Paket:            float
 | 
			
		||||
% Beschreibung:     Zum Ausrichten von Tabellen und Spalten bzw. deren Zentrierung
 | 
			
		||||
% Option:
 | 
			
		||||
% Restriktion:      Muss von Paket hyperref geladen werden. Ansonsten funktioniert das Paket nicht.
 | 
			
		||||
\usepackage{float}
 | 
			
		||||
 | 
			
		||||
\usepackage{forest}
 | 
			
		||||
 | 
			
		||||
% Packet:           framemethod
 | 
			
		||||
% Beschreibung:
 | 
			
		||||
% Option:
 | 
			
		||||
\usepackage[framemethod=tikz]{mdframed}
 | 
			
		||||
\mdtheorem[
 | 
			
		||||
  linecolor=red,
 | 
			
		||||
  frametitlefont=\sffamily\bfseries\color{white},
 | 
			
		||||
  frametitlebackgroundcolor=red,
 | 
			
		||||
]{warn-popup}{Warnung}[subsection]
 | 
			
		||||
 | 
			
		||||
\mdtheorem[
 | 
			
		||||
  linecolor=orange,
 | 
			
		||||
  frametitlefont=\sffamily\bfseries\color{white},
 | 
			
		||||
  frametitlebackgroundcolor=orange,
 | 
			
		||||
]{info-popup}{Information}[subsection]
 | 
			
		||||
 | 
			
		||||
\mdtheorem[
 | 
			
		||||
  linecolor=green,
 | 
			
		||||
  frametitlefont=\sffamily\bfseries\color{white},
 | 
			
		||||
  frametitlebackgroundcolor=green,
 | 
			
		||||
]{example-popup}{Beispiel}
 | 
			
		||||
 | 
			
		||||
% Paket:            footmisc
 | 
			
		||||
% Beschreibung:     Das footmisc Paket liefert viele Möglichkeiten, wie Fußnoten in Dokumenten dargestellt werden können.
 | 
			
		||||
% Option:
 | 
			
		||||
% Dokumentation:    http://mirror.utexas.edu/ctan/info/translations/footmisc/de/footmiscDE.pdf
 | 
			
		||||
\usepackage[bottom]{footmisc}
 | 
			
		||||
 | 
			
		||||
% Paket:            geometry
 | 
			
		||||
% Beschreibung:     A4 Seitenabstände
 | 
			
		||||
% Option:
 | 
			
		||||
\usepackage{geometry}
 | 
			
		||||
\geometry{
 | 
			
		||||
%  a4paper,           % Papierformat (wird auch über die Dokumentenklasse definiert)
 | 
			
		||||
  top=2.5cm,          % Abstand Kopfseite   (Zwischen Kopfseite und Inhalt)
 | 
			
		||||
  bottom=2cm,         % Abstand Fußseite    (Zwischen Fußseite und Inhalt)
 | 
			
		||||
  left=2.5cm,         % Abstand Linkeseite  (Zwischen Linkerseite und Inhalt)
 | 
			
		||||
  right=2.5cm,        % Abstand Rechteseite (Zwischen Recherseite und Inhalt)
 | 
			
		||||
%  width=              %                    textwidth (+marginsep +marinparwidth)
 | 
			
		||||
%  textwidth=15cm,     % Textbreite
 | 
			
		||||
%  marginparsep=1cm,   % Randnotiztrennng
 | 
			
		||||
%  marginparwidth=10cm,% Randnotizbreite
 | 
			
		||||
%  height=             %                    textheight (+headheight +headsep + footskip)
 | 
			
		||||
%  textheight=        % Texthöhe
 | 
			
		||||
  headheight=1cm,     % Kopfhöhe
 | 
			
		||||
  headsep=0.5cm,      % Kopftrennung        (Größe zwischen Kopfzeile und Inhalt)
 | 
			
		||||
  footskip=1cm,       % Fußzeilenhöhe
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
% Paket:            graphicx
 | 
			
		||||
% Beschreibung:     Einbinden von Bildern
 | 
			
		||||
% Option:
 | 
			
		||||
\usepackage{graphicx}
 | 
			
		||||
 | 
			
		||||
% Packet:           Hyperref
 | 
			
		||||
% Beschreibung:     Importiert hyperref um Querverweise mittels \hyperref zu erzeugen.
 | 
			
		||||
% Dokumentation:    https://www.namsu.de/Extra/pakete/Hyperref.html
 | 
			
		||||
\usepackage{hyperref}
 | 
			
		||||
\hypersetup{
 | 
			
		||||
  colorlinks=false,                 % hyperlinks are coloured
 | 
			
		||||
  citecolor=green,                  % color for cite links, only visible if colorlinks=true
 | 
			
		||||
  linkcolor=red,                    % color for page links, only visible if colorlinks=true
 | 
			
		||||
  urlcolor=orange,                  % color for url links, only visible if colorlinks=true
 | 
			
		||||
  citebordercolor=green,            % color for citeborder, only visible if colorlinks=true
 | 
			
		||||
  urlbordercolor=orange,            % color for url links, only visible if colorlinks=true
 | 
			
		||||
  linkbordercolor=red,              % color for page links, only visible if colorlinks=true
 | 
			
		||||
  pdfborderstyle={/S/U/W 1},        % border style will be underline of width 1pt
 | 
			
		||||
  pdftitle={PDF-Title},
 | 
			
		||||
  pdfauthor={Markus Pesch},
 | 
			
		||||
  pdfsubject={PDF-Subject},
 | 
			
		||||
  pdfkeywords={},
 | 
			
		||||
  pdfcreator={pdflatex},
 | 
			
		||||
  pdfproducer={LaTeX with hyperref}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
% Paket:            glossaries
 | 
			
		||||
% Beschreibung:     Das Paket glossaries muss nach dem Paket hyperref geladen werden
 | 
			
		||||
% Dokumentation:    http://ftp.gwdg.de/pub/ctan/macros/latex/contrib/glossaries/glossaries-user.pdf
 | 
			
		||||
% Option/en:
 | 
			
		||||
%   acronyms        - This is equivalent to acronym=true and may be used in the document class option list.
 | 
			
		||||
%   section         - This is a key=value option. Its value should be the name of a sectional unit (e.g. chapter).
 | 
			
		||||
%                     This will make the glossaries appear in the named sectional unit, otherwise each glossary will
 | 
			
		||||
%                     appear in a chapter, if chapters exist, otherwise in a section. Unnumbered sectional units will
 | 
			
		||||
%                     be used by default.
 | 
			
		||||
%   toc             - Add the glossaries to the table of contents.
 | 
			
		||||
\usepackage[toc,acronyms]{glossaries}
 | 
			
		||||
\makeglossaries
 | 
			
		||||
\include{referenzen/glossar}
 | 
			
		||||
 | 
			
		||||
% Paket:            utf8
 | 
			
		||||
% Beschreibung:     Stellt Umlaute richtig dar
 | 
			
		||||
% Option:           inputenc - Erlaubt die Darstellung der gleichen Zeichen (Character) wie sie in stdin überliefert werden
 | 
			
		||||
\usepackage[utf8]{inputenc}
 | 
			
		||||
 | 
			
		||||
% Paket:            lipsum
 | 
			
		||||
% Beschreibung:
 | 
			
		||||
% Option:
 | 
			
		||||
\usepackage{lipsum}
 | 
			
		||||
 | 
			
		||||
% Paket:            makeindex
 | 
			
		||||
% Beschreibung:     Ermöglicht das Indexieren von Wörter und den Befehl \printindex um den Index auszugeben
 | 
			
		||||
\usepackage{makeidx}
 | 
			
		||||
\makeindex
 | 
			
		||||
 | 
			
		||||
% Packet:           Minted
 | 
			
		||||
% Beschreibung:     Dient zum highlining von Quellcode wie beispielsweise Java, Bash oder Python.
 | 
			
		||||
% Option/en:
 | 
			
		||||
%   autogobble:       Leerzeichen zwischen linken Rand und Sourcecode einrücken bzw. weg schneiden.
 | 
			
		||||
%   breaklines:       Automatische Zeilenumbrüche
 | 
			
		||||
%   cache:            de- oder aktiviert den cache um Sourcecode zwischen zu speichern und so das PDF schneller zu erzeugen
 | 
			
		||||
%   cachedir:         Definiert den Pfad zum cache, an dem minted seine Daten zwischen speichern kann
 | 
			
		||||
%   fontfamily:       Die Schriftart die benutzt werden soll. tt, courier und helvetica sind vordefiniert.
 | 
			
		||||
%   fontsize:         Die Schriftgröße die benutzt werden soll. Beispielsweise fontsize=\footnotesize
 | 
			
		||||
%   linenos:          Zeilennummern
 | 
			
		||||
%   keywordcase:      Änderung der Buchstaben. Takes lower, upper, or capitalize.
 | 
			
		||||
%   showspaces:       Blendet Leerzeichen ein
 | 
			
		||||
\usepackage[cache=true]{minted}
 | 
			
		||||
 | 
			
		||||
% usemintedstyle
 | 
			
		||||
% Gebe 'pygmentize -L styles' im Terminal ein um alle verfügbaren styles anzuzeigen.
 | 
			
		||||
\usemintedstyle{tango}
 | 
			
		||||
 | 
			
		||||
% newminted
 | 
			
		||||
% Definiere neue aliase um einmalig ein highlighting pro Sprache zu deklarieren
 | 
			
		||||
% \newminted{<makroname>}{optionen} ist verfügbar unter "\<makroname>{code}"
 | 
			
		||||
\newminted{awk}{autogobble=true, breaklines=true, linenos=true}
 | 
			
		||||
\newminted{bash}{autogobble=true, breaklines=true, linenos=true}
 | 
			
		||||
\newminted{json}{autogobble=true, breaklines=true, linenos=true}
 | 
			
		||||
\newminted{julia}{autogobble=true, breaklines=true, linenos=true}
 | 
			
		||||
\newminted{r}{autogobble=true, breaklines=true, linenos=true}
 | 
			
		||||
\newminted{sql}{autogobble=true, breaklines=true, linenos=true, keywordcase=upper}
 | 
			
		||||
\newminted{xml}{autogobble=true, breaklines=true, linenos=true}
 | 
			
		||||
 | 
			
		||||
% newmintedfile
 | 
			
		||||
% Definiere neue Makros um automatisch Sourcecode aus Dateien zu highlighten.
 | 
			
		||||
% \makroname{Dateipfad}
 | 
			
		||||
\newmintedfile[inputawk]{awk}{autogobble=true, breaklines=true, linenos=true}
 | 
			
		||||
\newmintedfile[inputbash]{bash}{autogobble=true, breaklines=true, linenos=true}
 | 
			
		||||
\newmintedfile[inputjson]{json}{autogobble=true, breaklines=true, linenos=true}
 | 
			
		||||
\newmintedfile[inputjulia]{julia}{autogobble=true, breaklines=true, linenos=true}
 | 
			
		||||
\newmintedfile[inputr]{r}{autogobble=true, breaklines=true, linenos=true}
 | 
			
		||||
\newmintedfile[inputsql]{sql}{autogobble=true, breaklines=true, linenos=true, keywordcase=upper}
 | 
			
		||||
\newmintedfile{inputxml}{autogobble=true, breaklines=true, linenos=true}
 | 
			
		||||
 | 
			
		||||
% newmintinline
 | 
			
		||||
% Definiere neues Makro um Sourcecoude einzeiler zu highlighten
 | 
			
		||||
% \begin{awkcode} \end{awkcode}
 | 
			
		||||
\newmintinline{awk}{autogobble=true, breaklines=true, linenos=true}
 | 
			
		||||
\newmintinline{bash}{autogobble=true, breaklines=true, linenos=true}
 | 
			
		||||
\newmintinline{json}{autogobble=true, breaklines=true, linenos=true}
 | 
			
		||||
\newmintinline{julia}{autogobble=true, breaklines=true, linenos=true}
 | 
			
		||||
\newmintinline{r}{autogobble=true, breaklines=true, linenos=true}
 | 
			
		||||
\newmintinline{sql}{autogobble=true, breaklines=true, linenos=true, keywordcase=upper}
 | 
			
		||||
\newmintinline{xml}{autogobble=true, breaklines=true, linenos=true}
 | 
			
		||||
 | 
			
		||||
% Paket:            multirow
 | 
			
		||||
% Beschreibung:     Zum kombinieren mehrerer Zellen einer Tabelle
 | 
			
		||||
% Option:
 | 
			
		||||
\usepackage{multirow}
 | 
			
		||||
 | 
			
		||||
% Paket:            natbib
 | 
			
		||||
% Beschreibung:     Für Zitate
 | 
			
		||||
% Option:           round - ?
 | 
			
		||||
%\usepackage[round]{natbib}
 | 
			
		||||
 | 
			
		||||
% Paket:            pdflscape
 | 
			
		||||
% Beschreibung:     Ermöglicht Seiten horizontal darzustellen
 | 
			
		||||
% Option:           \begin{landscape} \end{landscape}
 | 
			
		||||
\usepackage{pdflscape}
 | 
			
		||||
 | 
			
		||||
% Paket:            showframe
 | 
			
		||||
% Beschreibung:     Blendet alle Frames (Textkörper, Fußzeile Kopzeile, Seitenrand) ein
 | 
			
		||||
% Option:
 | 
			
		||||
% \usepackage{showframe}
 | 
			
		||||
 | 
			
		||||
% Paket:            subcaption
 | 
			
		||||
% Beschreibung:     Bietet eine große Auswahl an Gestaltungsmöglichkeiten bezüglich der Beschriftung von Bildern und Tabellen
 | 
			
		||||
%                   die neben oder unter untereinander dargestellt werden sollen.
 | 
			
		||||
\usepackage{subcaption}
 | 
			
		||||
 | 
			
		||||
% format=NAME           - Einstellung des grundsätzlichen Formats von Gleitobjektbeschriftungen
 | 
			
		||||
% indention=EINZUG      - Einstellung des Einzugs der Beschriftung ab der zweiten Zeile
 | 
			
		||||
% labelformat=NAME      - Einstellung der Zusammensetzung des Bezeichners (z. B. Label und Nummer) der Beschriftung
 | 
			
		||||
% labelsep=NAME         - Einstellung des Trenners nach dem Bezeichner
 | 
			
		||||
% justification=NAME    - Einstellung er Ausrichtung des Textes Beschriftung
 | 
			
		||||
% singlelinecheck=BOOL  - Sonderbehandlung für einzeilige Beschriftungen ein- oder ausschalten
 | 
			
		||||
% font=NAME             - Einstellung der Schrift der gesamten Beschriftung
 | 
			
		||||
% labelfont=NAME        - Einstellung der Schrift des Bezeichners
 | 
			
		||||
% textfont=NAME         - Einstellung der Schrift des Textes der Beschriftung
 | 
			
		||||
% margin=BREITE         - Einstellung der Breite des Randes der Beschriftung
 | 
			
		||||
% width=BREITE          - Einstellung der Breite der Beschriftung
 | 
			
		||||
% parskip=ABSTAND       - Einstellung des Absatzabstandes der Beschriftung
 | 
			
		||||
% hangindent=EINZUG     - Einstellung des Einzugs abgesehen von ersten Absatzzeilen
 | 
			
		||||
% style=NAME            - Auswahl einer vordefinierten Gesamteinstellung
 | 
			
		||||
% aboveskip=ABSTAND     - Einstellung des Abstandes vor einer Beschriftung
 | 
			
		||||
% belowskip=ABSTAND     - Einstellung des Abstandes nach einer Beschriftung
 | 
			
		||||
% position=WAHL         - Einstellung ob die Beschriftung als Über- oder Unterschrift formatiert werden soll
 | 
			
		||||
% tableposition=WAHL    - Einstellung ob nur bei Tabellen die Beschriftung als Über- oder Unterschrift formatiert werden soll
 | 
			
		||||
\captionsetup[figure]{position=bottom}
 | 
			
		||||
\captionsetup[table]{position=bottom}
 | 
			
		||||
 | 
			
		||||
% Packet:           tabularx
 | 
			
		||||
% Beschreibung:     Werden Tabellen mit diesem Paket erstellt, ist es möglich Zeilenumbrüche in einer Zelle zu erzeugen
 | 
			
		||||
\usepackage{tabularx}
 | 
			
		||||
 | 
			
		||||
% Paket:            textpos
 | 
			
		||||
% Beschreibung:     Zum erstellen von Textboxen
 | 
			
		||||
% \begin{textblock*}{\textwidth}(0cm,0.5cm)
 | 
			
		||||
\usepackage{textpos}
 | 
			
		||||
 | 
			
		||||
% Paket:            tikz
 | 
			
		||||
% Beschreibung:     TikZ and PGF are TeX packages for creating graphics programmatically.
 | 
			
		||||
% Dokumentation:
 | 
			
		||||
\usepackage{tikz}
 | 
			
		||||
\usetikzlibrary{intersections}
 | 
			
		||||
 | 
			
		||||
% Packet:           varwidth
 | 
			
		||||
% Beschreibung:     The package defines a varwidth environment (based on minipage) which is an analogue
 | 
			
		||||
%                   of minipage, but whose resulting width is the natural width of its contents.
 | 
			
		||||
% Dokumentation:    http://ctan.math.washington.edu/tex-archive/macros/latex/contrib/varwidth/varwidth-doc.pdf
 | 
			
		||||
%                   https://www.namsu.de/Extra/befehle/Minipage.html
 | 
			
		||||
% Option:
 | 
			
		||||
\usepackage{varwidth}
 | 
			
		||||
 | 
			
		||||
% Paket:            verbatim
 | 
			
		||||
% Beschreibung:     Bildet einen Quelltext exakt ab.
 | 
			
		||||
% Options:
 | 
			
		||||
\usepackage{verbatim}
 | 
			
		||||
 | 
			
		||||
% Paket:            warapfig
 | 
			
		||||
% Beschreibung:     Ermöglich das floaten von Texten neben Bildern
 | 
			
		||||
% Options:
 | 
			
		||||
% \begin{wrapfigure}{R}{0.30\textwidth}
 | 
			
		||||
%   \includegraphics[width=0.30\textwidth]{img/middleware.png}
 | 
			
		||||
%   \caption{Middleware}
 | 
			
		||||
% \end{wrapfigure}
 | 
			
		||||
\usepackage{wrapfig}
 | 
			
		||||
 | 
			
		||||
% Start des Dokuments
 | 
			
		||||
\begin{document}
 | 
			
		||||
 | 
			
		||||
  % Set Globally Table-Margin
 | 
			
		||||
  \def\arraystretch{1.2}
 | 
			
		||||
 | 
			
		||||
  % Fetch Commit ID and Date
 | 
			
		||||
  \immediate\write18{./git-info.sh commit > git-id.tmp}
 | 
			
		||||
  \immediate\write18{./git-info.sh date > git-date.tmp}
 | 
			
		||||
  \immediate\write18{./git-info.sh url > git-url.tmp}
 | 
			
		||||
 | 
			
		||||
  % Importiere weitere .tex Dokumente
 | 
			
		||||
  \include{./titel/titel}
 | 
			
		||||
  \pagebreak
 | 
			
		||||
 | 
			
		||||
  % Pagestyle
 | 
			
		||||
  % Setze das Seitenlayout auf fancyhdr um Fuß- und Kopfzeilen zu setzen
 | 
			
		||||
  \pagestyle{fancy}
 | 
			
		||||
 | 
			
		||||
  % Löscht alle Kopf- und Fußzeilen des pagestyles fancyhdr
 | 
			
		||||
  \fancyhf{}
 | 
			
		||||
 | 
			
		||||
  % Fuß- und Kopfzeile des Paketes fancyhdr
 | 
			
		||||
  % [L] - Linkeseite      [O] - Ungerade Seitenzahlen         [LE,LO] - Linkeseite, Gerade- und Ungerade Seitenanzahlen
 | 
			
		||||
  % [C] - Mitte           [E] - Gerade Seitenanzahlen         [CE]    - Seitenmitte, nur gerade Seitenanzahlen
 | 
			
		||||
  % [R] - Rechteseite                                         [RO]    - Rechteseite, nur ungerade Seitenanzahlen
 | 
			
		||||
  % \fancyhead    Kopfzeile
 | 
			
		||||
  % \fancyfoot    Fußzeile
 | 
			
		||||
  \fancyhead[L]{\rightmark}
 | 
			
		||||
  \fancyhead[R]{\includegraphics[width=4cm]{img/logo.png}}
 | 
			
		||||
  \fancyfoot[L]{Betriebssysteme / Linux WS21/22 - Aufgabensammlung}
 | 
			
		||||
  \fancyfoot[C]{}
 | 
			
		||||
 | 
			
		||||
  % Pixelstärke der Kopf- und Fußzeilenlinie
 | 
			
		||||
  \renewcommand{\headrulewidth}{1pt}
 | 
			
		||||
  \renewcommand{\footrulewidth}{1pt}
 | 
			
		||||
 | 
			
		||||
  % Agenda
 | 
			
		||||
  \tableofcontents
 | 
			
		||||
  \pagebreak
 | 
			
		||||
 | 
			
		||||
  % Setze die Seitenbeginn zurück
 | 
			
		||||
  \setcounter{page}{1}
 | 
			
		||||
  \fancyfoot[R]{Seite \thepage}
 | 
			
		||||
 | 
			
		||||
  % Importiere weitere .tex Dokumente
 | 
			
		||||
  % \include{./examples/examples}
 | 
			
		||||
 | 
			
		||||
  \include{./chapters/01-ssh}
 | 
			
		||||
 | 
			
		||||
  % \include{./chapters/01-network}
 | 
			
		||||
  % \include{./chapters/02-dns}
 | 
			
		||||
  % \include{./chapters/03-ssh}
 | 
			
		||||
  % \include{./chapters/04-file-permissions}
 | 
			
		||||
  % \include{./chapters/05-directory-structure}
 | 
			
		||||
  % \include{./chapters/06-filesystems}
 | 
			
		||||
  % \include{./chapters/07-backups}
 | 
			
		||||
  % \include{./chapters/08-textprocessing}
 | 
			
		||||
 | 
			
		||||
  % \include{./chapters/99-questions}
 | 
			
		||||
  % \include{./chapters/99-awk}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  % Aufzählung aller Bilder
 | 
			
		||||
  % \listoffigures
 | 
			
		||||
  % \newpage
 | 
			
		||||
 | 
			
		||||
  % Aufzählung aller Tabellen
 | 
			
		||||
  % \listoftables
 | 
			
		||||
  % \newpage
 | 
			
		||||
 | 
			
		||||
  % Glossary
 | 
			
		||||
  \printglossaries
 | 
			
		||||
  \newpage
 | 
			
		||||
 | 
			
		||||
  % Literatur
 | 
			
		||||
  \printbibliography[heading=bibintoc]
 | 
			
		||||
\end{document}
 | 
			
		||||
							
								
								
									
										87
									
								
								referenzen/bibliothek.bib
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,87 @@
 | 
			
		||||
@book{ID,
 | 
			
		||||
  author = {author},
 | 
			
		||||
  title = {title},
 | 
			
		||||
  date = {date},
 | 
			
		||||
  OPTeditor = {editor},
 | 
			
		||||
  OPTeditora = {editora},
 | 
			
		||||
  OPTeditorb = {editorb},
 | 
			
		||||
  OPTeditorc = {editorc},
 | 
			
		||||
  OPTtranslator = {translator},
 | 
			
		||||
  OPTannotator = {annotator},
 | 
			
		||||
  OPTcommentator = {commentator},
 | 
			
		||||
  OPTintroduction = {introduction},
 | 
			
		||||
  OPTforeword = {foreword},
 | 
			
		||||
  OPTafterword = {afterword},
 | 
			
		||||
  OPTsubtitle = {subtitle},
 | 
			
		||||
  OPTtitleaddon = {titleaddon},
 | 
			
		||||
  OPTmaintitle = {maintitle},
 | 
			
		||||
  OPTmainsubtitle = {mainsubtitle},
 | 
			
		||||
  OPTmaintitleaddon = {maintitleaddon},
 | 
			
		||||
  OPTlanguage = {language},
 | 
			
		||||
  OPToriglanguage = {origlanguage},
 | 
			
		||||
  OPTvolume = {volume},
 | 
			
		||||
  OPTpart = {part},
 | 
			
		||||
  OPTedition = {edition},
 | 
			
		||||
  OPTvolumes = {volumes},
 | 
			
		||||
  OPTseries = {series},
 | 
			
		||||
  OPTnumber = {number},
 | 
			
		||||
  OPTnote = {note},
 | 
			
		||||
  OPTpublisher = {publisher},
 | 
			
		||||
  OPTlocation = {location},
 | 
			
		||||
  OPTisbn = {isbn},
 | 
			
		||||
  OPTchapter = {chapter},
 | 
			
		||||
  OPTpages = {pages},
 | 
			
		||||
  OPTpagetotal = {pagetotal},
 | 
			
		||||
  OPTaddendum = {addendum},
 | 
			
		||||
  OPTpubstate = {pubstate},
 | 
			
		||||
  OPTdoi = {doi},
 | 
			
		||||
  OPTeprint = {eprint},
 | 
			
		||||
  OPTeprintclass = {eprintclass},
 | 
			
		||||
  OPTeprinttype = {eprinttype},
 | 
			
		||||
  OPTurl = {url},
 | 
			
		||||
  OPTurldate = {urldate},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@online{ID,
 | 
			
		||||
  ALTauthor = {author},
 | 
			
		||||
  ALTeditor = {editor},
 | 
			
		||||
  title = {title},
 | 
			
		||||
  date = {date},
 | 
			
		||||
  url = {url},
 | 
			
		||||
  OPTsubtitle = {subtitle},
 | 
			
		||||
  OPTtitleaddon = {titleaddon},
 | 
			
		||||
  OPTlanguage = {language},
 | 
			
		||||
  OPTversion = {version},
 | 
			
		||||
  OPTnote = {note},
 | 
			
		||||
  OPTorganization = {organization},
 | 
			
		||||
  OPTdate = {date},
 | 
			
		||||
  OPTmonth = {month},
 | 
			
		||||
  OPTyear = {year},
 | 
			
		||||
  OPTaddendum = {addendum},
 | 
			
		||||
  OPTpubstate = {pubstate},
 | 
			
		||||
  OPTurldate = {urldate},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@online{fedora33-btrfs-default,
 | 
			
		||||
  author = {Murphy, Chris and White, Langdon},
 | 
			
		||||
  title = {Btrfs Coming to Fedora 33},
 | 
			
		||||
  date = {2020-08-24},
 | 
			
		||||
  url = {https://fedoramagazine.org/btrfs-coming-to-fedora-33/},
 | 
			
		||||
  OPTurldate = {2020-10-21},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@online{was-ist-btrfs,
 | 
			
		||||
  author = {Community, Arch Linux},
 | 
			
		||||
  title = {Arch auf BtrFS},
 | 
			
		||||
  date = {2020-08-01},
 | 
			
		||||
  url = {https://wiki.archlinux.de/title/Arch_auf_BtrFS},
 | 
			
		||||
  OPTurldate = {2020-10-27},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@PHDTHESIS{roy-thomas-fielding,
 | 
			
		||||
    author			= {Fielding, Roy Thomas},
 | 
			
		||||
    title			= {Architectural Styles and the Design of Network-based Software Architectures},
 | 
			
		||||
    school			= {University of California, Irvine},
 | 
			
		||||
    year			= {2000},
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										40
									
								
								referenzen/glossar.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,40 @@
 | 
			
		||||
% Akronyme
 | 
			
		||||
\newacronym[longplural=Virtuelle Maschinen]{acr:vm}{VM}{Virtuelle Maschine}
 | 
			
		||||
\newacronym{acr:acl}{ACL}{Access-Control-List}
 | 
			
		||||
\newacronym{acr:bash}{bash}{Bourn Again Shell}
 | 
			
		||||
\newacronym{acr:bios}{BIOS}{Basis Input Output System}
 | 
			
		||||
\newacronym{acr:btrfs}{BtrFS}{B-tree File System}
 | 
			
		||||
\newacronym{acr:cow}{COW}{Copy-On-Write}
 | 
			
		||||
\newacronym{acr:ddl}{DDL}{Data-Definition-Language}
 | 
			
		||||
\newacronym{acr:dhcp}{DHCP}{Dynamic Host Configuration Protocol}
 | 
			
		||||
\newacronym{acr:dns}{DNS}{Domain Name System}
 | 
			
		||||
\newacronym{acr:eCryptfs}{eCryptfs}{Enterprise Cryptographic Filesystem}
 | 
			
		||||
\newacronym{acr:ext2}{ext2}{Second Extended Filesystem}
 | 
			
		||||
\newacronym{acr:ext3}{ext3}{Third Extended Filesystem}
 | 
			
		||||
\newacronym{acr:ext4}{ext4}{Fourth Extended Filesystem}
 | 
			
		||||
\newacronym{acr:fqdn}{FQDN}{Full Qualified Domain Name}
 | 
			
		||||
\newacronym{acr:gui}{GUI}{Graphical-User-Interface}
 | 
			
		||||
\newacronym{acr:icann}{ICANN}{Internet Corporation for Assigned Names and Numbers}
 | 
			
		||||
\newacronym{acr:ip}{IP}{Internet Protocol}
 | 
			
		||||
\newacronym{acr:kvm}{KVM}{Kernel-based Virtual Machine}
 | 
			
		||||
\newacronym{acr:ntfs}{NTFS}{New Technology File System}
 | 
			
		||||
\newacronym{acr:ntp}{NTP}{Network-Time-Protocol}
 | 
			
		||||
\newacronym{acr:raid}{RAID}{Redundant Array of Independent Disks}
 | 
			
		||||
\newacronym{acr:ram}{RAM}{Random-Access-Memory}
 | 
			
		||||
\newacronym{acr:rdp}{RDP}{Remote-Desktop-Protocol}
 | 
			
		||||
\newacronym{acr:reiser}{Reiser}{Reiser File System}
 | 
			
		||||
\newacronym{acr:rpm}{RPM}{RPM Package Manager}
 | 
			
		||||
\newacronym{acr:rr}{RR}{Recource Record}
 | 
			
		||||
\newacronym{acr:soa}{SOA}{Start-of-Authority}
 | 
			
		||||
\newacronym{acr:sql}{SQL}{Structured-Query-Language}
 | 
			
		||||
\newacronym{acr:ssh}{SSH}{Secure-Shell}
 | 
			
		||||
\newacronym{acr:uefi}{UEFI}{Unified Extensible Firmware Interface}
 | 
			
		||||
\newacronym{acr:telnet}{Telnet}{Teletype Network}
 | 
			
		||||
\newacronym{acr:tld}{TLD}{Top-Level-Domain}
 | 
			
		||||
\newacronym{acr:vnc}{VNC}{Virtual-Network-Computing}
 | 
			
		||||
 | 
			
		||||
% Glossar
 | 
			
		||||
\newglossaryentry{gls:minted}{
 | 
			
		||||
  name={Minted},
 | 
			
		||||
  description={Minted is a package that allows formatting and highlighting source code in \latex.}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										70
									
								
								solutions/07-backups.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,70 @@
 | 
			
		||||
## Aufgabe 1a
 | 
			
		||||
 | 
			
		||||
Datum       Wochentag   Backup-Methode   Band
 | 
			
		||||
 | 
			
		||||
2020-11-02  Mon         Ink              Sohn-1
 | 
			
		||||
2020-11-03  Tue         Ink              Sohn-2
 | 
			
		||||
2020-11-04  Wed         Ink              Sohn-3
 | 
			
		||||
2020-11-05  Thur        Ink              Sohn-4
 | 
			
		||||
2020-11-06  Fri         Diff             Vater-1
 | 
			
		||||
 | 
			
		||||
2020-11-09  Mon         Ink              Sohn-1
 | 
			
		||||
2020-11-10  Tue         Ink              Sohn-2
 | 
			
		||||
2020-11-11  Wed         Ink              Sohn-3
 | 
			
		||||
2020-11-12  Thur        Ink              Sohn-4
 | 
			
		||||
2020-11-13  Fri         Diff             Vater-2
 | 
			
		||||
 | 
			
		||||
2020-11-16  Mon         Ink              Sohn-1
 | 
			
		||||
2020-11-17  Tue         Ink              Sohn-2
 | 
			
		||||
2020-11-18  Wed         Ink              Sohn-3
 | 
			
		||||
2020-11-19  Thur        Ink              Sohn-4
 | 
			
		||||
2020-11-20  Fri         Diff             Vater-3
 | 
			
		||||
 | 
			
		||||
2020-11-23  Mon         Ink              Sohn-1
 | 
			
		||||
2020-11-24  Tue         Ink              Sohn-2
 | 
			
		||||
2020-11-25  Wed         Ink              Sohn-3
 | 
			
		||||
2020-11-26  Thur        Ink              Sohn-4
 | 
			
		||||
2020-11-27  Fri         Diff             Vater-4
 | 
			
		||||
 | 
			
		||||
## Aufgabe 1b
 | 
			
		||||
 | 
			
		||||
Datum       Wochentag   Backup-Methode    Band
 | 
			
		||||
2020-11-07  Fri         Diff              Vater-1
 | 
			
		||||
2020-11-14  Fri         Diff              Vater-2
 | 
			
		||||
2020-11-21  Fri         Diff              Vater-3
 | 
			
		||||
2020-11-28  Fri         Diff              Vater-4
 | 
			
		||||
2020-11-30  Mon         Voll              Großvater-1
 | 
			
		||||
 | 
			
		||||
2020-12-04  Fri         Diff              Vater-1
 | 
			
		||||
2020-12-11  Fri         Diff              Vater-2
 | 
			
		||||
2020-12-18  Fri         Diff              Vater-3
 | 
			
		||||
2020-12-25  Fri         Diff              Vater-4
 | 
			
		||||
2020-12-31  Thur        Voll              Großvater-2
 | 
			
		||||
 | 
			
		||||
2021-01-01  Fri         Diff              Vater-1
 | 
			
		||||
2021-01-08  Fri         Diff              Vater-2
 | 
			
		||||
2021-01-15  Fri         Diff              Vater-3
 | 
			
		||||
2021-01-22  Fri         Diff              Vater-4
 | 
			
		||||
2021-01-29  Fri         Voll              Großvater-3
 | 
			
		||||
 | 
			
		||||
## Praxisaufgabe
 | 
			
		||||
 | 
			
		||||
### Teilaufgabe A
 | 
			
		||||
Drei Monate, zwei Wochen und einen Tag zurück vom 6. November 2020.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
$ date --date '2020-11-06 - 3 month - 2 week - 1 day' '+%A, %d %B %Y'
 | 
			
		||||
Montag, 22 Juli 2020
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Benötigte Backups
 | 
			
		||||
Großvater-Backup    07. August 2020
 | 
			
		||||
 | 
			
		||||
### Teilaufgabe B
 | 
			
		||||
 | 
			
		||||
28.10.2020
 | 
			
		||||
 | 
			
		||||
Benötigte Backups
 | 
			
		||||
Großvater-Backup    02. Oktober 2020
 | 
			
		||||
Vater-Backup        09. 16. und 23. Oktober 2020
 | 
			
		||||
Sohn-Backup         26. 27. und 28. Oktober 2020
 | 
			
		||||
							
								
								
									
										38
									
								
								solutions/overlayfs.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,38 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
# 7a
 | 
			
		||||
mkdir --parent /root/workspace/overlayfs
 | 
			
		||||
cd /root/workspace/overlayfs
 | 
			
		||||
 | 
			
		||||
# 7b1
 | 
			
		||||
mkdir --parent ./lower_0/usr/bin
 | 
			
		||||
touch ./lower_0/usr/bin/mybin
 | 
			
		||||
 | 
			
		||||
# 7b2
 | 
			
		||||
mkdir --parent ./lower_1/etc/mybin
 | 
			
		||||
touch ./lower_1/etc/mybin/config.json
 | 
			
		||||
 | 
			
		||||
# 7b3
 | 
			
		||||
mkdir --parent ./lower_2/var/log/mybin
 | 
			
		||||
touch ./lower_2/var/log/mybin/info.log
 | 
			
		||||
 | 
			
		||||
# 7b4
 | 
			
		||||
mkdir --parent ./lower_3/usr/lib/systemd/system
 | 
			
		||||
touch ./lower_3/usr/lib/systemd/system/mybin.service
 | 
			
		||||
 | 
			
		||||
# 7b5
 | 
			
		||||
mkdir --parent ./lower_4/etc/mybin/conf.d/
 | 
			
		||||
touch ./lower_4/etc/mybin/conf.d/sqlite.config
 | 
			
		||||
 | 
			
		||||
# 7b6
 | 
			
		||||
mkdir --parent ./lower_5/etc/mybin/conf.d/
 | 
			
		||||
touch ./lower_4/etc/mybin/conf.d/postgresql.config
 | 
			
		||||
 | 
			
		||||
# 7c
 | 
			
		||||
mkdir --parent ./upper_application ./upper_application_plugins
 | 
			
		||||
mkdir --parent ./workdir_application ./workdir_application_plugins
 | 
			
		||||
mkdir --parent ./application ./application_plugins
 | 
			
		||||
 | 
			
		||||
mount -t overlay -o lowerdir=$(pwd)/lower_0:$(pwd)/lower_1:/$(pwd)/lower_2:/$(pwd)/lower_3,upperdir=$(pwd)/upper_application,workdir=$(pwd)/workdir_application overlayfs $(pwd)/application
 | 
			
		||||
 | 
			
		||||
mount -t overlay -o lowerdir=$(pwd)/lower_0:$(pwd)/lower_1:/$(pwd)/lower_2:/$(pwd)/lower_3:/$(pwd)/lower_4:/$(pwd)/lower_5,upperdir=$(pwd)/upper_application_plugins,workdir=$(pwd)/workdir_application_plugins overlayfs $(pwd)/application_plugins
 | 
			
		||||
							
								
								
									
										0
									
								
								sql/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1419
									
								
								sql/credit_master_cleaned.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										31
									
								
								titel/titel.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,31 @@
 | 
			
		||||
\begin{titlepage}
 | 
			
		||||
  \begin{center}
 | 
			
		||||
    \begin{large}
 | 
			
		||||
      Aufgabensammlung WS21/22
 | 
			
		||||
    \end{large}
 | 
			
		||||
 | 
			
		||||
    \begin{huge}
 | 
			
		||||
      \begin{singlespace}
 | 
			
		||||
        \textbf{Betriebssysteme / Linux}
 | 
			
		||||
      \end{singlespace}
 | 
			
		||||
    \end{huge}
 | 
			
		||||
 | 
			
		||||
    \vspace{0.5cm}
 | 
			
		||||
 | 
			
		||||
    \begin{figure}[h]
 | 
			
		||||
      \centering
 | 
			
		||||
      \includegraphics[width=0.85\textwidth]{img//logo.png}
 | 
			
		||||
      \label{img:fh-trier-logo}
 | 
			
		||||
    \end{figure}
 | 
			
		||||
 | 
			
		||||
    \vspace{2cm}
 | 
			
		||||
    \begin{large}
 | 
			
		||||
      \textit{Markus Pesch} \\
 | 
			
		||||
      \href{mailto:peschm@hochschule-trier.de}{\textit{peschm@hochschule-trier.de}}
 | 
			
		||||
    \end{large}
 | 
			
		||||
    \vspace{2cm}
 | 
			
		||||
 | 
			
		||||
    Version \input{git-id.tmp} vom \input{git-date.tmp}
 | 
			
		||||
 | 
			
		||||
  \end{center}
 | 
			
		||||
\end{titlepage}
 | 
			
		||||