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