# Решения

Действия ниже производятся от пользователя `root`. 

### 0.
Обновите список пакетов из настроенных репозиториев в `/etc/apt/sources.list` командой `apt`.
```
# apt update
```

Пример содержимого файла для Debian 12
```
# main состоит из DFSG-compliant пакетов, которым не требуется другое ПО из других зон. Эти пакеты считаются частью дистрибуции Debian
# contrib пакеты содержат DFSG-compliant ПО, но у них зависимостей из зоны main (возможно упакованы в non-free).
# non-free содержит ПО, которое не соответствует DFSG.

# скомпилированные бинарные пакеты
deb http://deb.debian.org/debian/ bookworm main
# оригинальные исходные коды пакетов
deb-src  http://deb.debian.org/debian/ bookworm main

# некоторые пакеты для следующего 12.X обнвления доступны только из следующих веток
deb http://deb.debian.org/debian/ bookworm-updates main
deb-src  http://deb.debian.org/debian/ bookworm-updates main

# критические обновления пакетов для обнаруженных уязвимостей доступны из репозитория security.debian.org
deb http://security.debian.org/debian-security/ bookworm/updates main
deb-src http://security.debian.org/debian-security/ bookworm/updates main
```

### 1.
Установите пакет `apt-file` с помощью `apt`.
```
# apt install apt-file
```

### 2. 
Найдите с помощью `apt-file` пакет, содержащий команду `ar`.
```
# apt-file search --regexp /bin/ar$
root@stud12:~# apt-file search --regexp /bin/ar$
amdgcn-tools: /usr/amdgcn-amdhsa/bin/ar
binutils: /usr/bin/ar
binutils-aarch64-linux-gnu: /usr/aarch64-linux-gnu/bin/ar
binutils-alpha-linux-gnu: /usr/alpha-linux-gnu/bin/ar
binutils-arc-linux-gnu: /usr/arc-linux-gnu/bin/ar
binutils-arm-linux-gnueabi: /usr/arm-linux-gnueabi/bin/ar
binutils-arm-linux-gnueabihf: /usr/arm-linux-gnueabihf/bin/ar
binutils-arm-none-eabi: /usr/lib/arm-none-eabi/bin/ar
binutils-avr: /usr/lib/avr/bin/ar
binutils-bpf: /usr/lib/bpf/bin/ar
binutils-djgpp: /usr/i386-pc-msdosdjgpp/bin/ar
binutils-h8300-hms: /usr/h8300-hitachi-coff/bin/ar
binutils-hppa-linux-gnu: /usr/hppa-linux-gnu/bin/ar
binutils-hppa64-linux-gnu: /usr/hppa64-linux-gnu/bin/ar
binutils-i686-gnu: /usr/i686-gnu/bin/ar
binutils-i686-kfreebsd-gnu: /usr/i686-kfreebsd-gnu/bin/ar
binutils-i686-linux-gnu: /usr/i686-linux-gnu/bin/ar
binutils-ia64-linux-gnu: /usr/ia64-linux-gnu/bin/ar
binutils-m68hc1x: /usr/m68hc11/bin/ar
binutils-m68k-linux-gnu: /usr/m68k-linux-gnu/bin/ar
binutils-mingw-w64-i686: /usr/i686-w64-mingw32/bin/ar
binutils-mingw-w64-x86-64: /usr/x86_64-w64-mingw32/bin/ar
binutils-mips-linux-gnu: /usr/mips-linux-gnu/bin/ar
binutils-mips64-linux-gnuabi64: /usr/mips64-linux-gnuabi64/bin/ar
binutils-mips64-linux-gnuabin32: /usr/mips64-linux-gnuabin32/bin/ar
binutils-mips64el-linux-gnuabi64: /usr/mips64el-linux-gnuabi64/bin/ar
binutils-mips64el-linux-gnuabin32: /usr/mips64el-linux-gnuabin32/bin/ar
binutils-mipsel-linux-gnu: /usr/mipsel-linux-gnu/bin/ar
binutils-mipsisa32r6-linux-gnu: /usr/mipsisa32r6-linux-gnu/bin/ar
binutils-mipsisa32r6el-linux-gnu: /usr/mipsisa32r6el-linux-gnu/bin/ar
binutils-mipsisa64r6-linux-gnuabi64: /usr/mipsisa64r6-linux-gnuabi64/bin/ar
binutils-mipsisa64r6-linux-gnuabin32: /usr/mipsisa64r6-linux-gnuabin32/bin/ar
binutils-mipsisa64r6el-linux-gnuabi64: /usr/mipsisa64r6el-linux-gnuabi64/bin/ar
binutils-mipsisa64r6el-linux-gnuabin32: /usr/mipsisa64r6el-linux-gnuabin32/bin/ar
binutils-or1k-elf: /usr/or1k-elf/bin/ar
binutils-powerpc-linux-gnu: /usr/powerpc-linux-gnu/bin/ar
binutils-powerpc64-linux-gnu: /usr/powerpc64-linux-gnu/bin/ar
binutils-powerpc64le-linux-gnu: /usr/powerpc64le-linux-gnu/bin/ar
binutils-riscv64-linux-gnu: /usr/riscv64-linux-gnu/bin/ar
binutils-riscv64-unknown-elf: /usr/lib/riscv64-unknown-elf/bin/ar
binutils-s390x-linux-gnu: /usr/s390x-linux-gnu/bin/ar
binutils-sh-elf: /usr/sh-elf/bin/ar
binutils-sh4-linux-gnu: /usr/sh4-linux-gnu/bin/ar
binutils-sparc64-linux-gnu: /usr/sparc64-linux-gnu/bin/ar
binutils-x86-64-kfreebsd-gnu: /usr/x86_64-kfreebsd-gnu/bin/ar
binutils-x86-64-linux-gnux32: /usr/x86_64-linux-gnux32/bin/ar
binutils-xtensa-lx106: /usr/lib/xtensa-lx106-elf/bin/ar
nvptx-tools: /usr/nvptx-none/bin/ar
```

### 3.
Определите с помощью команды `apt search`, какие варианты пакета содержащего команду `ar` доступны. Установите подходящий для вашей системы.
```
# apt search binutils
binutils/stable,now 2.40-2 amd64 [installed]
  GNU assembler, linker and binary utilities

binutils-aarch64-linux-gnu/stable 2.40-2 amd64
  GNU binary utilities, for aarch64-linux-gnu target

binutils-aarch64-linux-gnu-dbg/stable 2.40-2 amd64
  GNU binary utilities, for aarch64-linux-gnu target (debug symbols)

binutils-alpha-linux-gnu/stable 2.40-2 amd64
  GNU binary utilities, for alpha-linux-gnu target

binutils-alpha-linux-gnu-dbg/stable 2.40-2 amd64
  GNU binary utilities, for alpha-linux-gnu target (debug symbols)
...
```
```
# apt install binutils/stable
```

### 4.
Скачайте http://ftp.ru.debian.org/debian/pool/main/c/cmake/cmake_3.25.1-1_amd64.deb в отдельную папку. Перейдите в папку с пакетом и распакуйте .deb командой `ar -x  путь-к-пакету`. В папке должны появиться: `control.tar.xz`,  `data.tar.xz`,  `debian-binary`. 

### 5. 
Создайте папку `control` и распакуйте в неё `control.tar.xz` с помощью команды `tar xfC путь-к-архиву control`. Изучите содержимое. Сравните с выдачей `dpkg --info ` для `.deb` файла.

```
# cat control/control
Package: cmake
Version: 3.25.1-1
Architecture: amd64
Maintainer: Debian CMake Team <pkg-cmake-team@lists.alioth.debian.org>
Installed-Size: 28897
Depends: libarchive13 (>= 3.3.3), libc6 (>= 2.34), libcurl4 (>= 7.16.2), libexpat1 (>= 2.0.1), libgcc-s1 (>= 3.0), libjsoncpp25 (>= 1.9.5), librhash0 (>= 1.2.6), libstdc++6 (>= 12), libuv1 (>= 1.38.0), zlib1g (>= 1:1.1.4), cmake-data (= 3.25.1-1), procps
Recommends: gcc, make
Suggests: cmake-doc, cmake-format, elpa-cmake-mode, ninja-build
Section: devel
Priority: optional
Multi-Arch: foreign
Homepage: https://cmake.org/
Description: cross-platform, open-source make system
 CMake is used to control the software compilation process using
 simple platform and compiler independent configuration files. CMake
 generates native makefiles and workspaces that can be used in the
 compiler environment of your choice. CMake is quite sophisticated: it
 is possible to support complex environments requiring system
 configuration, pre-processor generation, code generation, and template
 instantiation.

# cat debian-binary
2.0
```
```
# dpkg --info cmake_3.25.1-1_amd64.deb
 new Debian package, version 2.0.
 size 8692248 bytes: control archive=1224 bytes.
    1045 bytes,    20 lines      control
     778 bytes,    12 lines      md5sums
 Package: cmake
 Version: 3.25.1-1
 Architecture: amd64
 Maintainer: Debian CMake Team <pkg-cmake-team@lists.alioth.debian.org>
 Installed-Size: 28897
 Depends: libarchive13 (>= 3.3.3), libc6 (>= 2.34), libcurl4 (>= 7.16.2), libexpat1 (>= 2.0.1), libgcc-s1 (>= 3.0), libjsoncpp25 (>= 1.9.5), librhash0 (>= 1.2.6), libstdc++6 (>= 12), libuv1 (>= 1.38.0), zlib1g (>= 1:1.1.4), cmake-data (= 3.25.1-1), procps
 Recommends: gcc, make
 Suggests: cmake-doc, cmake-format, elpa-cmake-mode, ninja-build
 Section: devel
 Priority: optional
 Multi-Arch: foreign
 Homepage: https://cmake.org/
 Description: cross-platform, open-source make system
  CMake is used to control the software compilation process using
  simple platform and compiler independent configuration files. CMake
  generates native makefiles and workspaces that can be used in the
  compiler environment of your choice. CMake is quite sophisticated: it
  is possible to support complex environments requiring system
  configuration, pre-processor generation, code generation, and template
  instantiation.
```
Выдача `dpkg --info` включает содержимое `debian-binary`, файла `control/control` и размеры содержимого `.deb`. 

### 6. 
Создайте папку `data` и распакуйте в неё `data.tar.xz` с помощью команды `tar xfC путь-к-архиву data`. Изучите `data` с помощью команды `tree`. Сравните с выдачей  `dpkg --contents ` для `.deb` файла.

```
# dpkg --contents cmake_3.25.1-1_amd64.deb
drwxr-xr-x root/root         0 2022-11-30 14:57 ./
drwxr-xr-x root/root         0 2022-11-30 14:57 ./usr/
drwxr-xr-x root/root         0 2022-11-30 14:57 ./usr/bin/
-rwxr-xr-x root/root   9245840 2022-11-30 14:57 ./usr/bin/cmake
-rwxr-xr-x root/root   9544272 2022-11-30 14:57 ./usr/bin/cpack
-rwxr-xr-x root/root  10697872 2022-11-30 14:57 ./usr/bin/ctest
drwxr-xr-x root/root         0 2022-11-30 14:57 ./usr/share/
drwxr-xr-x root/root         0 2022-11-30 14:57 ./usr/share/bash-completion/
drwxr-xr-x root/root         0 2022-11-30 14:57 ./usr/share/bash-completion/completions/
-rw-r--r-- root/root      6837 2022-11-30 08:57 ./usr/share/bash-completion/completions/cmake
-rw-r--r-- root/root      2870 2022-11-30 08:57 ./usr/share/bash-completion/completions/cpack
-rw-r--r-- root/root      4535 2022-11-30 08:57 ./usr/share/bash-completion/completions/ctest
drwxr-xr-x root/root         0 2022-11-30 14:57 ./usr/share/cmake/
-rwxr-xr-x root/root      2410 2022-02-22 03:29 ./usr/share/cmake/debtoolchainfilegen
drwxr-xr-x root/root         0 2022-11-30 14:57 ./usr/share/doc/
drwxr-xr-x root/root         0 2022-11-30 14:57 ./usr/share/doc/cmake/
-rw-r--r-- root/root      2937 2022-11-30 14:57 ./usr/share/doc/cmake/changelog.Debian.gz
-rw-r--r-- root/root     29578 2022-05-25 14:57 ./usr/share/doc/cmake/copyright
drwxr-xr-x root/root         0 2022-11-30 14:57 ./usr/share/man/
drwxr-xr-x root/root         0 2022-11-30 14:57 ./usr/share/man/man1/
-rw-r--r-- root/root     15175 2022-11-30 14:57 ./usr/share/man/man1/cmake.1.gz
-rw-r--r-- root/root      2819 2022-11-30 14:57 ./usr/share/man/man1/cpack.1.gz
-rw-r--r-- root/root     18116 2022-11-30 14:57 ./usr/share/man/man1/ctest.1.gz
```

```
# tree --metafirst -ugshap data/
[drwxr-xr-x root     root     4.0K]  data/
[drwxr-xr-x root     root     4.0K]  └── usr
[drwxr-xr-x root     root     4.0K]      ├── bin
[-rwxr-xr-x root     root     8.8M]      │   ├── cmake
[-rwxr-xr-x root     root     9.1M]      │   ├── cpack
[-rwxr-xr-x root     root      10M]      │   └── ctest
[drwxr-xr-x root     root     4.0K]      └── share
[drwxr-xr-x root     root     4.0K]          ├── bash-completion
[drwxr-xr-x root     root     4.0K]          │   └── completions
[-rw-r--r-- root     root     6.7K]          │       ├── cmake
[-rw-r--r-- root     root     2.8K]          │       ├── cpack
[-rw-r--r-- root     root     4.4K]          │       └── ctest
[drwxr-xr-x root     root     4.0K]          ├── cmake
[-rwxr-xr-x root     root     2.4K]          │   └── debtoolchainfilegen
[drwxr-xr-x root     root     4.0K]          ├── doc
[drwxr-xr-x root     root     4.0K]          │   └── cmake
[-rw-r--r-- root     root     2.9K]          │       ├── changelog.Debian.gz
[-rw-r--r-- root     root      29K]          │       └── copyright
[drwxr-xr-x root     root     4.0K]          └── man
[drwxr-xr-x root     root     4.0K]              └── man1
[-rw-r--r-- root     root      15K]                  ├── cmake.1.gz
[-rw-r--r-- root     root     2.8K]                  ├── cpack.1.gz
[-rw-r--r-- root     root      18K]                  └── ctest.1.gz
```
Содержимое идентично.

### 7. 
Попробуйте вызвать исполняемый файл `usr/bin/cmake` из папки. Сопоставьте информацию в control файле пакета с выдачей команды `ldd usr/bin/cmake`. Если исполняемый файл не работает, найдите и установите зависимости в систему. Воспользуйтесь формой поиска на сайте https://www.debian.org/distrib/packages, если поиск по настроенным репозиториям не даёт результата. Добавьте репозиторий в котором есть нужная библиотека командой `apt edit-sources`. Обновите базу данных пакетов командой `apt update`. Завершите установку зависимостей и проверьте, что `cmake` работает.

Для поиска списка зависимостей можно использовать одну из этих комманд:
```
# ldd data/usr/bin/cmake
# dpkg --info cmake_3.25.1-1_amd64.deb
```
```
# apt-file search libcurl.so.4
# apt install libcurl4
# apt-file search libjsoncpp.so.25
# apt install libjsoncpp25
# apt-file search libarchive.so.13
# apt install libarchive13
# apt-file search librhash.so.0
# apt install librhash0
# ldd data/usr/bin/cmake
# data/usr/bin/cmake
```

### 8.
Утилитой `dpkg-query` выведите список пакетов, зарегистрированных в `dpkg` базе данных. Есть ли среди них зависимости `cmake`, которые вы установили вручную?
```
# dpkg-query --list
```
Если файлы были вручную разложены по системным папка из папки `data`, то пакет не попадёт в базу данных `dpkg`. Если выполнить
```
# dpkg --install cmake_3.25.1-1_amd64.deb
```
то файлы будут скопированы за вас и пакет зарегистрирован в базе данных `dpkg`.

### 9. 
Утилитой `dpkg-query` выведите среди установленных локально пакетов пакет, начинающихся с `libc6`. Утилитой `apt-cache` выполните тот же поиск по кэшу `apt`. Утилитой `apt` выполните тот же поиск по кэшу `apt`. Сравните, чем они отличаются. 
```
dpkg-query --list libc6*
```
```
apt-cache search ^libc6.*
```
`apt-cache search` - выполняет полнотекстовый поиск по базе данных apt, полученной командой `apt update` из репозиториев, сконфигурированных в `/etc/apt/sources.list`.
`dpkg-query` - выполняет полнотекстовый поиск по базе данных `dpkg`, то есть по базе только установленных пакетов в систему. `apt` является фронтэндом для `dpkg`.


### 10. 
Утилитой `dpkg-query` выведите статус пакета `sudo` и `gcc`. Чем выдача отличается от содержимого `control` файла `.deb`, скаченного ранее? 

Вывод отличается наличием информации о статусе
```
# diff <(dpkg-query --status cmake | sort) <(cat control/control | sort)
19d18
< Status: install ok unpacked
```

### 11.
Утилитой `dpkg-query` выведите список установленных файлов пакета `sudo` (не выводятся файлы созданные скриптами).
```
# dpkg-query --listfiles sudo
```

### 12.
Утилитой `dpkg-query` выведите список файлов с метаданными пакета (control files), установленных в систему.
```
# dpkg-query --control-list sudo
postrm
md5sums
preinst
shlibs
triggers
prerm
postinst
```

### 13.
Утилитой dpkg-query выведите содержимое одного из файлов с метаданными пакета (control files).
```
# dpkg-query --control-show sudo preinst
#!/bin/sh

set -e

case "$1" in
  install|upgrade)
    if [ -n "$2" ] && dpkg --compare-versions "$2" le "1.7.4p4-4"; then

      SUDOERS="/etc/sudoers"

      if [ -e "$SUDOERS" ]; then
        md5sum="$(md5sum $SUDOERS | sed -e 's/ .*//')"
        if [ "$md5sum" = "c310ef4892a00cca8134f6e4fcd64b6d" ] ||      #lenny
           [ "$md5sum" = "c5dab0f2771411ed7e67d6dab60a311f" ] ||      #squeeze
           [ "$md5sum" = "45437b4e86fba2ab890ac81db2ec3606" ]; then   #wheezy
            # move unchanged sudoers file to avoid conffile question
            mv "$SUDOERS" "$SUDOERS.pre-conffile"
        fi
      fi
    fi
  ;;
esac

# Automatically added by dh_installinit/13.11.4
if [ "$1" = "install" ] && [ -n "$2" ] && [ -e "/etc/init.d/sudo" ] ; then
        chmod +x "/etc/init.d/sudo" >/dev/null || true
fi
# End automatically added section
```

### 14.
Утилитой `dpkg-query` выведите пути к файлам с метаданными пакета (control files).
```
# dpkg-query --control-path sudo
/var/lib/dpkg/info/sudo.postrm
/var/lib/dpkg/info/sudo.md5sums
/var/lib/dpkg/info/sudo.preinst
/var/lib/dpkg/info/sudo.shlibs
/var/lib/dpkg/info/sudo.triggers
/var/lib/dpkg/info/sudo.prerm
/var/lib/dpkg/info/sudo.postinst
```

### 15.
Утилитой `dpkg-query` выполните поиск пакетов, которые установили в систему файл `pam.conf`.
```
# dpkg-query --search */pam.conf
sudo: /usr/share/doc/sudo/examples/pam.conf
libpam-runtime: /etc/pam.conf
```

### 16.
Утилитой `dpkg` установите `cmake` `.deb` пакет, скачанный ранее. Ещё раз посмотрите на зависимости пакета. Как отреагировал `dpkg` на отсутствие зависимости `cmake-data` - установил или выдал ошибку?

Пакет установился, но не сконфигурировался.

### 17.
Скачайте `cmake-data` и его транзитивные зависимости https://packages.debian.org/sid/amd64/cmake. Завершите установку `cmake`, и проверьте, что команда `cmake` установлена в систему (например, командами `which`, `find`) и работает `cmake --version`. 

```
# dpkg --list cmake cmake-data
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version      Architecture Description
+++-==============-============-============-=======================================================
iU  cmake          3.25.1-1     amd64        cross-platform, open-source make system
ii  cmake-data     3.25.1-1     all          CMake data files (modules, templates and documentation)

# cmake --version
cmake version 3.25.1

CMake suite maintained and supported by Kitware (kitware.com/cmake).

# which cmake
/usr/bin/cmake
```

### 18.
Проверьте файлы всех установленных пакетов в системе на наличие изменений/повреждений командой `dpkg`. Какие файлы не прошли проверку (`??5??????`)?
```
# dpkg --verify
??5?????? c /etc/sudoers
```
В данном случае файл не прошёл проверку потому, что был изменён в редакторе для обеспечения беспарольного доступа группе `sudo`.

#### 18.1 Справка 

В настоящее время поддерживается только формат вывода rpm, который состоит из строки для каждого пути, который не прошел ни одну проверку.  Эти строки имеют следующий формат:
```
missing [c] pathname [(error-message)]
??5?????? [c] имя пути
```

Первые 9 символов используются для сообщения о результате проверки. `?` Подразумевает, что проверка не может быть выполнена (отсутствие поддержки, права доступа к файлу и т.д.). `.` Подразумевает, что проверка пройдена. `A-Za-z0-9` Означает, что определенная проверка не прошла. В случае если запись была типа `missing`, и файл фактически отсутствовал в файловой системе, то после строки ставится пробел и сообщение об ошибке, заключенное в круглые скобки. 

Формат вывода rpm:
```
SM5DLUGT c <file>
```

- S размер файла (эти проверки в настоящее время не поддерживаются, всегда будет '?'), 
- M режим файла (проверка режима файла не удалась (начиная с версии dpkg 1.21.0)), 
- 5 MD5 хэш файла (проверка хэшкода не удалась, что означает, что содержимое файла изменилось), 
- D мажорная и минорная версии файла (эти проверки в настоящее время не поддерживаются, всегда будет '?'), 
- L содержимое символических ссылок файла (эти проверки в настоящее время не поддерживаются, всегда будет '?'), 
- U владелец файла (эти проверки в настоящее время не поддерживаются, всегда будет '?'), 
- G группа-владелец файла (эти проверки в настоящее время не поддерживаются, всегда будет '?'), 
- T время модификации файла (эти проверки в настоящее время не поддерживаются, всегда будет '?'),
- c появляется только, если это конфигурационный файл (как правило именно они меняются и с большей вероятностью не пройдут проверку)
- <file> полный путь к файлу, который не прошёл проверку.

Знак вопроса означает, что файл не может быть проверен по какой-то причине. 

Дополнительные комментарии из `man dpkg` для секции `--verify-format` для проверки режима файла (M). Поскольку метаданные имени пути в настоящее время не отслеживаются, эта проверка может быть частично эмулирована только с помощью очень простой эвристики для имен путей, которые имеют известный хэшкод, что подразумевает, что они должны быть обычными файлами. Проверка будет неудачной, если путь указывает не на обычный файл в файловой системе. На текущий момент эта проверка никогда не будет успешной, так как нет достаточной информации.


### 19.
Сохраните список выбранных действий (selections) для пакетов в системе утилитой `dpkg` в файл.
```
# dpkg --get-selections > /tmp/$(date -I)_selections
```

### 20.
Измените в сохранённом списке действие для пакета `vim` c текущего на deinstall (`man dpkg`, “Package selection states”). Перечитайте изменённый список командой `dpkg --set-selections`.
```
# cat /tmp/2023-10-13_selections | dpkg --set-selections
# dpkg --get-selections | grep vim
vim                                             deinstall
vim-common                                      install
vim-runtime                                     install
vim-tiny                                        install
```

### 21.
Запустите команду `apt-get dselect-upgrade`. Не подтверждайте изменения. Какие пакеты будут установлены или удалены?
```
# apt-get dselect-upgrade
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages will be REMOVED:
  vim
The following NEW packages will be installed:
  linux-image-6.1.0-13-amd64
The following packages will be upgraded:
  base-files dbus dbus-bin dbus-daemon dbus-session-bus-common dbus-system-bus-common dbus-user-session
  debian-archive-keyring debianutils grub-common grub-pc grub-pc-bin grub2-common inetutils-telnet krb5-locales
  libc-bin libc-l10n libc6 libdbus-1-3 libgssapi-krb5-2 libk5crypto3 libkrb5-3 libkrb5support0 libnftables1
  libnss-systemd libpam-modules libpam-modules-bin libpam-runtime libpam-systemd libpam0g libssl3
  libsystemd-shared libsystemd0 libudev1 libx11-6 libx11-data linux-image-6.1.0-10-amd64 linux-image-amd64
  locales nftables openssh-client openssh-server openssh-sftp-server openssl qemu-guest-agent ssh systemd
  systemd-sysv systemd-timesyncd udev
50 upgraded, 1 newly installed, 1 to remove and 0 not upgraded.
1 not fully installed or removed.
Need to get 166 MB of archives.
After this operation, 404 MB of additional disk space will be used.
Do you want to continue? [Y/n] n
```

### 22.
Настройте в `/etc/sudoers` конфигурационном файле для пользователя `stud` возможность выполнять команды от лица суперпользователя без запроса пароля:
```
%sudo   ALL=(ALL:ALL) NOPASSWD: ALL
```
Удалите, а затем установите пакет `sudo` командой `apt remove`. Проверьте содержимое конфигурационного файла на изменения. Проделайте то же самое, но c командой `apt purge`.

`apt purge` - удалит все конфигурационные файлы, даже если они были изменены администратором. 

### 23.
Удалите `cmake` и `cmake-data` с помощью `apt`. Найдите в репозиториях, какая версия `cmake` доступна. Создайте файл в директории `/etc/apt/apt.conf.d/default-release` со следующим содержимым (`man apt.conf`):
```
APT::Default-Release "stable";
```
Повторите поиск. Установите `stable` версию. Проверьте работоспособность команды и её версию `cmake --version`. Вы можете узнать значения текущих конфигурационных переменных `apt` командой `apt-config dump`.

```
# apt-config dump | grep Default-Release
APT::Default-Release "stable";

# apt search ^cmake$
Sorting... Done
Full Text Search... Done
cmake/stable,now 3.25.1-1 amd64 [installed]
  cross-platform, open-source make system
```

### 24.
Заморозьте версию `cmake` командой `apt-mark` или с помощью `dpkg --get-selections`, `dpkg --set-selections`. Поменяйте умолчания `/etc/apt/apt.conf.d/default-release` на "unstable". Проведите обновление пакетов в системе. `cmake` должен сохранить `stable` версию.

После добавления в `sources.list` строк
```
deb http://deb.debian.org/debian/ unstable main non-free-firmware
deb-src http://deb.debian.org/debian/ unstable main non-free-firmware
```
и запуска `apt update`:

```
# apt-config dump | grep Default-Release
APT::Default-Release "unstable";

root@stud12:~# apt search ^cmake$
Sorting... Done
Full Text Search... Done
cmake/unstable 3.27.7-1 amd64 [upgradable from: 3.25.1-1]
  cross-platform, open-source make system
```
доступна более свежая версия `cmake`.

При попытке обновления пакеты отмеченные `hold` не будут обновлены:
```
# apt-mark hold cmake cmake-data
cmake set on hold.
cmake-data set on hold.

# apt upgrade
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages were automatically installed and are no longer required:
  libcbor0.8 libfstrm0 libfuse2 libjemalloc2 liblmdb0 libmaxminddb0 libprotobuf-c1
Use 'apt autoremove' to remove them.
The following NEW packages will be installed:
  firmware-ath9k-htc gcc-13-base libcbor0.10 libfuse3-3 libsframe1 libunistring5 linux-image-6.5.0-2-amd64
  systemd-dev
The following packages have been kept back:
  cmake cmake-data
```

### 25.
Удалите `cmake` для следующего упражнения в установке из исходного кода. Выполните `apt autoremove` для удаления ставших ненужными пакетов.
```
# apt remove cmake cmake-data
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following package was automatically installed and is no longer required:
  libuv1
Use 'apt autoremove' to remove it.
The following packages will be REMOVED:
  cmake cmake-data
The following held packages will be changed:
  cmake cmake-data
0 upgraded, 0 newly installed, 2 to remove and 227 not upgraded.
After this operation, 40.3 MB disk space will be freed.
Do you want to continue? [Y/n]
(Reading database ... 41403 files and directories currently installed.)
Removing cmake (3.25.1-1) ...
Removing cmake-data (3.25.1-1) ...
Processing triggers for man-db (2.11.2-2) ...
root@stud12:~# apt autoremove
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages will be REMOVED:
  libuv1
0 upgraded, 0 newly installed, 1 to remove and 227 not upgraded.
After this operation, 305 kB disk space will be freed.
Do you want to continue? [Y/n]
(Reading database ... 38166 files and directories currently installed.)
Removing libuv1:amd64 (1.44.2-1) ...
Processing triggers for libc-bin (2.36-9+deb12u1) ...
# cmake
-bash: /usr/bin/cmake: No such file or directory
```

### 26.
Установите `git`, если он ещё не установлен. Перейдите в `/tmp` и вызовите:
```
git clone --depth=1 https://github.com/Kitware/CMake
```
Ваша цель установить пакет в директорию `/opt`. 

Прочитайте README.md секцию "Building CMake from Scratch". Установите компилятор g++, make. Для поддержки openssl - libssl-dev заголовочные файлы. В качестве --prefix используйте `/opt/cmake/`. Выполните 3 этапа: конфигурация компиляции, компиляция проекта, и установка. Для использования многопоточной компиляции используйте флаг `-j` при вызове `make`. 

```
# apt install build-essential -y

# gcc --version
gcc (Debian 13.2.0-5) 13.2.0
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

# ./configure
CMake Error at Utilities/cmcurl/CMakeLists.txt:640 (message):
  Could not find OpenSSL.  Install an OpenSSL development package or
  configure CMake with -DCMAKE_USE_OPENSSL=OFF to build without OpenSSL.
# apt install libssl-dev
# ./configure --parallel=4
CMake has bootstrapped.  Now run gmake.

# gmake -j 
# gmake install

# cmake --version
cmake version 3.28.20231013-gee5f31b

CMake suite maintained and supported by Kitware (kitware.com/cmake).
```

### 27.
Используйте команду `dpkg-reconfigure`, чтобы перенастроить пакеты, связанные с локализацией `console-setup` и раскладкой клавиатуры `keyboard-configuration`.