1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402 |
- <!DOCTYPE html>
- <html lang="ru">
- <head>
- <meta charset="utf-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
- <title>Системное администрирование — Неофициальный FAQ по Fedora (версия 2023.05.30)</title>
- <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
- <link rel="stylesheet" type="text/css" href="_static/alabaster.css" />
- <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css" />
- <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
- <script src="_static/doctools.js"></script>
- <script src="_static/sphinx_highlight.js"></script>
- <script src="_static/translations.js"></script>
- <script defer="defer" src="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js"></script>
- <script defer="defer" src="_static/search.js"></script>
- <link rel="icon" href="_static/faq-icon.ico"/>
- <link rel="index" title="Алфавитный указатель" href="genindex.html" />
- <link rel="search" title="Поиск" href="search.html" />
- <link rel="next" title="Сетевое администрирование" href="networking.html" />
- <link rel="prev" title="Пакетный менеджер и установка пакетов" href="package-manager.html" />
-
- <link rel="stylesheet" href="_static/custom.css" type="text/css" />
-
- <link rel="apple-touch-icon" href="_static/faq-icon.png" />
-
-
- <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head><body>
-
- <div class="document">
- <div class="documentwrapper">
- <div class="bodywrapper">
-
- <div class="body" role="main">
-
- <section id="administration">
- <span id="id1"></span><h1>Системное администрирование<a class="headerlink" href="#administration" title="Permalink to this heading">¶</a></h1>
- <section id="kernelpm-once">
- <span id="index-0"></span><span id="id2"></span><h2>Как однократно передать параметр ядра?<a class="headerlink" href="#kernelpm-once" title="Permalink to this heading">¶</a></h2>
- <p>Однократная передача параметра ядра возможна только перед загрузкой ядра в память, то есть во время начала загрузки системы.</p>
- <p>В меню загрузчика Grub 2 выберем нужную загрузочную опцию и нажмем клавишу <strong>E</strong> на клавиатуре для перехода в режим редактирвоания.</p>
- <p>В открывшемся редакторе найдем строку, которая начинается со слова <strong>linux</strong>, перейдём в ее конец, отступим пробел от последнего символа и добавим нужный параметр. Если их несколько, воспользуемся пробелом в качестве разделителя между ними.</p>
- <p>Для начала загрузки нажмем сочетание <strong>Ctrl + X</strong> на клавиатуре.</p>
- </section>
- <section id="kernelpm-perm">
- <span id="index-1"></span><span id="id3"></span><h2>Как мне задать параметр ядра для постоянного использования?<a class="headerlink" href="#kernelpm-perm" title="Permalink to this heading">¶</a></h2>
- <p>Для современных конфигураций с <a class="reference internal" href="using-system.html#grub-bls-info"><span class="std std-ref">BLS</span></a> воспользуемся утилитой <strong>grubby</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo grubby --update-kernel=ALL --args="foo=bar"
- </pre></div>
- </div>
- <p>Здесь вместо <strong>foo=bar</strong> укажем необходимый параметр ядра.</p>
- <p>Изменения вступят в силу при следующей загрузке системы.</p>
- </section>
- <section id="kernelpm-remove">
- <span id="index-2"></span><span id="id4"></span><h2>Как убрать ненужный более параметр ядра?<a class="headerlink" href="#kernelpm-remove" title="Permalink to this heading">¶</a></h2>
- <p>Для современных конфигураций с <a class="reference internal" href="using-system.html#grub-bls-info"><span class="std std-ref">BLS</span></a> воспользуемся утилитой <strong>grubby</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo grubby --update-kernel=ALL --remove-args="foo=bar"
- </pre></div>
- </div>
- <p>Здесь вместо <strong>foo=bar</strong> укажем необходимый параметр ядра.</p>
- <p>Изменения вступят в силу при следующей загрузке системы.</p>
- </section>
- <section id="kernelpm-legacy">
- <span id="index-3"></span><span id="id5"></span><h2>Как мне задать параметр ядра на устаревшей конфигурации?<a class="headerlink" href="#kernelpm-legacy" title="Permalink to this heading">¶</a></h2>
- <p>На устаревших конфигурациях, не использующих <a class="reference internal" href="using-system.html#grub-bls-info"><span class="std std-ref">BLS</span></a>, откроем файл с шаблонами загрузчика <code class="docutils literal notranslate"><span class="pre">/etc/default/grub</span></code> в любом текстовом редакторе:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudoedit /etc/default/grub
- </pre></div>
- </div>
- <p>Найдём в нём переменную <code class="docutils literal notranslate"><span class="pre">GRUB_CMDLINE_LINUX</span></code>, внесём соответствующие правки и сохраним изменения.</p>
- <p><a class="reference internal" href="using-system.html#grub-rebuild"><span class="std std-ref">Пересоберём конфиг Grub 2</span></a> посредством <strong>grub2-mkconfig</strong>.</p>
- <p>Изменения вступят в силу при следующей загрузке системы.</p>
- </section>
- <section id="kernelpm-list">
- <span id="index-4"></span><span id="id6"></span><h2>Как определить какие параметры ядра заданы в настоящее время?<a class="headerlink" href="#kernelpm-list" title="Permalink to this heading">¶</a></h2>
- <p>Для получения информации о текущих параметрах ядра достаточно выполнить:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>cat /proc/cmdline
- </pre></div>
- </div>
- </section>
- <section id="kernel-modules-list">
- <span id="index-5"></span><span id="id7"></span><h2>Как определить какие модули ядра в настоящее время загружены?<a class="headerlink" href="#kernel-modules-list" title="Permalink to this heading">¶</a></h2>
- <p>Воспользуемся <strong>lsmod</strong> для отображения всех загруженных в данный момент модулей ядра:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>lsmod
- </pre></div>
- </div>
- <p>При помощи <strong>lspci</strong> выведем список используемых модулей конкретными устройствами:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>lspci -nnk
- </pre></div>
- </div>
- </section>
- <section id="kernel-modules-help">
- <span id="index-6"></span><span id="id8"></span><h2>Как узнать какие опциональные параметры поддерживает конкретный модуль ядра?<a class="headerlink" href="#kernel-modules-help" title="Permalink to this heading">¶</a></h2>
- <p>Для получения краткой справочной информации о поддерживаемых параметрах конкретного модуля ядра необходимо использовать <strong>modinfo</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>modinfo foo-bar
- </pre></div>
- </div>
- <p>Здесь <strong>foo-bar</strong> – имя модуля, информацию о котором требуется вывести.</p>
- </section>
- <section id="uefi-boot-fedora">
- <span id="uefi-list"></span><span id="index-7"></span><h2>Как определить список загружаемых ОС в меню UEFI Boot из Fedora?<a class="headerlink" href="#uefi-boot-fedora" title="Permalink to this heading">¶</a></h2>
- <p>Выведем текущий список загрузки UEFI Boot при помощи утилиты <strong>efibootmgr</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo efibootmgr -v
- </pre></div>
- </div>
- </section>
- <section id="uefi-reorder">
- <span id="index-8"></span><span id="id9"></span><h2>Возможно ли изменить порядок загрузки в UEFI Boot из Fedora?<a class="headerlink" href="#uefi-reorder" title="Permalink to this heading">¶</a></h2>
- <p>Выведем текущий <a class="reference internal" href="#uefi-list"><span class="std std-ref">список загрузки UEFI Boot</span></a>.</p>
- <p>Изменим порядок по своему усмотрению:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo efibootmgr -o 0000,0002,0003,0001
- </pre></div>
- </div>
- <p>Здесь <strong>0000</strong> и прочие – результат предыдущего вывода утилиты. Ведущие нули указывать не обязательно.</p>
- <p>Изменения вступают в силу немедленно.</p>
- </section>
- <section id="uefi-add">
- <span id="index-9"></span><span id="id10"></span><h2>Как добавить новый пункт меню UEFI Boot из Fedora?<a class="headerlink" href="#uefi-add" title="Permalink to this heading">¶</a></h2>
- <p>В качестве примера добавим строку запуска Fedora (если она по какой-либо причине стала отсутствовать):</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo efibootmgr -c -L "Fedora" -l "\EFI\fedora\shimx64.efi"
- </pre></div>
- </div>
- <p>Изменения вступают в силу немедленно.</p>
- </section>
- <section id="uefi-remove">
- <span id="index-10"></span><span id="id11"></span><h2>Как удалить ненужный пункт меню UEFI Boot из Fedora?<a class="headerlink" href="#uefi-remove" title="Permalink to this heading">¶</a></h2>
- <p>Выведем текущий <a class="reference internal" href="#uefi-list"><span class="std std-ref">список загрузки UEFI Boot</span></a>.</p>
- <p>Удалим пункт <strong>0002</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo efibootmgr -b 0002 -B
- </pre></div>
- </div>
- <p>Ведущие нули указывать не обязательно. Изменения вступают в силу немедленно.</p>
- </section>
- <section id="journal-current">
- <span id="index-11"></span><span id="id12"></span><h2>Как мне посмотреть текущий журнал работы системы?<a class="headerlink" href="#journal-current" title="Permalink to this heading">¶</a></h2>
- <p>Чтобы посмотреть журнал работы системы с момента загрузки, нужно выполнить:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>journalctl -b
- </pre></div>
- </div>
- <p>Чтобы посмотреть только журнал работы ядра (аналог dmesg):</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>journalctl -k
- </pre></div>
- </div>
- </section>
- <section id="journal-history">
- <span id="index-12"></span><span id="id13"></span><h2>Как мне посмотреть журналы с прошлых загрузок?<a class="headerlink" href="#journal-history" title="Permalink to this heading">¶</a></h2>
- <p>Вывести список всех загрузок:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>journalctl --list-boots
- </pre></div>
- </div>
- <p>Вывести содержимое журнала загрузки с идентификатором <strong>X</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>journalctl -b -X
- </pre></div>
- </div>
- </section>
- <section id="journal-tofile">
- <span id="index-13"></span><span id="id14"></span><h2>Как мне выгрузить журнал в файл?<a class="headerlink" href="#journal-tofile" title="Permalink to this heading">¶</a></h2>
- <p>Необходимо <a class="reference internal" href="#bash-pipelines"><span class="std std-ref">перенаправить поток</span></a> стандартного вывода в файл:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>journalctl -b > ~/abc.txt
- </pre></div>
- </div>
- <p>Также можно воспользоваться утилитой fpaste для автоматической загрузки файла на сервис <a class="reference external" href="https://paste.fedoraproject.org/">fpaste.org</a>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>journalctl -b | fpaste
- </pre></div>
- </div>
- <p>При успешном выполнении будет создана ссылка для быстрого доступа.</p>
- </section>
- <section id="chroot-liveusb">
- <span id="chroot"></span><span id="index-14"></span><h2>Как сделать chroot в установленную систему с LiveUSB?<a class="headerlink" href="#chroot-liveusb" title="Permalink to this heading">¶</a></h2>
- <p>Загружаемся с <a class="reference internal" href="installation.html#usb-flash"><span class="std std-ref">Fedora LiveUSB</span></a> и запускаем эмулятор терминала или переходим в виртуальную консоль (особой разницы не имеет).</p>
- <p>Для начала создадим каталог для точки монтирования:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo mkdir /media/fedora
- </pre></div>
- </div>
- <p>Смонтируем корневой раздел установленной ОС:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo mount -t ext4 /dev/sda3 /media/fedora
- </pre></div>
- </div>
- <p>Здесь <strong>/dev/sda3</strong> – раздел, на котором установлена ОС, а <strong>ext4</strong> – его файловая система. Внесём соответствующие правки если это не так.</p>
- <p>Переходим в каталог с корневой ФС и монтируем ряд необходимых для работы окружения виртуальных ФС:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>cd /media/fedora
- sudo mount -t proc /proc proc
- sudo mount --rbind /sys sys
- sudo mount --make-rslave sys
- sudo mount --rbind /dev dev
- sudo mount --make-rslave dev
- sudo mount -t tmpfs tmpfs tmp
- </pre></div>
- </div>
- <p>При необходимости смонтируем <code class="docutils literal notranslate"><span class="pre">/boot</span></code> и <code class="docutils literal notranslate"><span class="pre">/boot/efi</span></code> разделы:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo mount -t ext4 /dev/sda2 boot
- sudo mount -t vfat /dev/sda1 boot/efi
- </pre></div>
- </div>
- <p>Теперь осуществим вход в chroot:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo chroot /media/fedora
- </pre></div>
- </div>
- <p>Если для выполнения действий требуется доступ к Интернету, настроим <a class="reference internal" href="networking.html#chroot-dns"><span class="std std-ref">корректное преобразование DNS</span></a>.</p>
- <p>По окончании работы завершим работу chroot-окружения:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>logout
- </pre></div>
- </div>
- <p>Отмонтируем раздел:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo umount /media/fedora
- </pre></div>
- </div>
- </section>
- <section id="ups-fedora">
- <span id="configure-ups"></span><span id="index-15"></span><h2>Как настроить ИБП (UPS) в Fedora?<a class="headerlink" href="#ups-fedora" title="Permalink to this heading">¶</a></h2>
- <p>См. <a class="reference external" href="https://www.easycoding.org/2012/10/01/podnimaem-nut-v-linux.html">здесь</a>.</p>
- </section>
- <section id="journald-limit">
- <span id="index-16"></span><span id="id15"></span><h2>Системные журналы занимают слишком много места. Как их ограничить?<a class="headerlink" href="#journald-limit" title="Permalink to this heading">¶</a></h2>
- <p>См. <a class="reference external" href="https://www.easycoding.org/2016/08/24/ogranichivaem-sistemnye-zhurnaly-v-fedora-24.html">здесь</a>.</p>
- </section>
- <section id="journald-wipe">
- <span id="index-17"></span><span id="id16"></span><h2>Как немедленно очистить все системные журналы?<a class="headerlink" href="#journald-wipe" title="Permalink to this heading">¶</a></h2>
- <p>Выполним принудительную ротацию системных журналов для сброса их из памяти на диск:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo journalctl --rotate
- </pre></div>
- </div>
- <p>Очистим все записи с диска, старше 1 секунды:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo journalctl --vacuum-time=1s
- </pre></div>
- </div>
- </section>
- <section id="systemd">
- <span id="systemd-info"></span><span id="index-18"></span><h2>Что такое systemd и как с ним работать?<a class="headerlink" href="#systemd" title="Permalink to this heading">¶</a></h2>
- <p>См. <a class="reference external" href="https://www.easycoding.org/2017/11/05/upravlyaem-systemd-v-fedora.html">здесь</a>.</p>
- </section>
- <section id="drop-fs-caches">
- <span id="index-19"></span><span id="id17"></span><h2>Как очистить кэши и буферы всех файловых систем?<a class="headerlink" href="#drop-fs-caches" title="Permalink to this heading">¶</a></h2>
- <p>Чтобы очистить кэши и буферы нужно выполнить:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo bash -c "sync && echo 3 > /proc/sys/vm/drop_caches && sync"
- </pre></div>
- </div>
- </section>
- <section id="utc-localtime">
- <span id="system-time-utc"></span><span id="index-20"></span><h2>Как перевести системные часы в UTC или localtime и наоборот?<a class="headerlink" href="#utc-localtime" title="Permalink to this heading">¶</a></h2>
- <p>Localtime – это хранение в UEFI BIOS компьютера времени с учётом установленного в системе часового пояса. При определённых условиях это может вызывать проблемы с синхронизацией времени, а также работой нескольких операционных систем на одном компьютере.</p>
- <p>UTC – это хранение в UEFI BIOS компьютера всемирного координированного времени по Гринвичу без учёта часовых поясов. Часовыми поясами управляет операционная система, что позволяет каждому пользователю в системе, а также приложениям использовать <a class="reference internal" href="using-system.html#application-timezone"><span class="std std-ref">индивидуальные настройки</span></a>.</p>
- <p>Переключение аппаратных часов компьютера в UTC из localtime:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo timedatectl set-local-rtc no
- </pre></div>
- </div>
- <p>Переключение аппаратных часов компьютера в localtime из UTC:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo timedatectl set-local-rtc yes
- </pre></div>
- </div>
- </section>
- <section id="fedora-windows">
- <span id="windows-utc"></span><span id="index-21"></span><h2>У меня в дуалбуте с Fedora установлена Windows и часы постоянно сбиваются. В чём дело?<a class="headerlink" href="#fedora-windows" title="Permalink to this heading">¶</a></h2>
- <p>Чтобы такого не происходило, обе операционные системы должны хранить время в формате UTC. Для этого в Windows нужно применить следующий файл реестра:</p>
- <div class="highlight-ini notranslate"><div class="highlight"><pre><span></span><span class="na">Windows Registry Editor Version 5.00</span>
- <span class="k">[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation]</span>
- <span class="na">"RealTimeIsUniversal"</span><span class="o">=</span><span class="s">dword:00000001</span>
- </pre></div>
- </div>
- </section>
- <section id="gdm-sddm">
- <span id="change-dm"></span><span id="index-22"></span><h2>У меня в системе используется GDM, но я хочу заменить его на SDDM. Это возможно?<a class="headerlink" href="#gdm-sddm" title="Permalink to this heading">¶</a></h2>
- <p>Установка SDDM:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo dnf install sddm
- </pre></div>
- </div>
- <p>Отключение GDM и активация SDDM:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo systemctl -f enable sddm
- </pre></div>
- </div>
- <p>Изменения вступят в силу при следующей загрузке системы.</p>
- </section>
- <section id="java">
- <span id="alternatives-java"></span><span id="index-23"></span><h2>Как мне выбрать версию Java по умолчанию?<a class="headerlink" href="#java" title="Permalink to this heading">¶</a></h2>
- <p>Для выбора дефолтной <a class="reference internal" href="package-manager.html#java-multiple"><span class="std std-ref">версии Java</span></a> следует использовать систему альтернатив:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo update-alternatives --config java
- </pre></div>
- </div>
- </section>
- <section id="change-hostname">
- <span id="index-24"></span><span id="id18"></span><h2>Как изменить имя хоста?<a class="headerlink" href="#change-hostname" title="Permalink to this heading">¶</a></h2>
- <p>Изменение имени хоста возможно посредством <strong>hostnamectl</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>hostnamectl set-hostname NEW
- </pre></div>
- </div>
- <p>Здесь вместо <strong>NEW</strong> следует указать новое значение. Изменения вступят в силу немедленно.</p>
- </section>
- <section id="lvm-liveusb">
- <span id="fs-check-lvm"></span><span id="index-25"></span><h2>Как мне проверить ФС в составе LVM с LiveUSB?<a class="headerlink" href="#lvm-liveusb" title="Permalink to this heading">¶</a></h2>
- <p>Если файловая система была повреждена, необходимо запустить <strong>fsck</strong> и разрешить ему исправить её. При использовании настроек по умолчанию (LVM, ФС ext4) это делается так:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo fsck -t ext4 /dev/mapper/fedora-root
- sudo fsck -t ext4 /dev/mapper/fedora-home
- </pre></div>
- </div>
- <p>Если вместо ext4 применяется другая файловая система, необходимо указать её после параметра <strong>-t</strong>.</p>
- </section>
- <section id="liveusb">
- <span id="fs-check-partitions"></span><span id="index-26"></span><h2>Как мне проверить ФС при использовании классических разделов с LiveUSB?<a class="headerlink" href="#liveusb" title="Permalink to this heading">¶</a></h2>
- <p>Если используется классическая схема с обычными разделами, то утилите <strong>fsck</strong> необходимо передавать соответствующее блочное устройство, например:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo fsck -t ext4 /dev/sda2
- sudo fsck -t ext4 /dev/sda3
- </pre></div>
- </div>
- <p>Если вместо <strong>ext4</strong> применяется другая файловая система, необходимо указать её после параметра <strong>-t</strong>. Также вместо <strong>/dev/sda2</strong> следует прописать соответствующее блочное устройство с повреждённой ФС.</p>
- <p>Полный список доступных устройств хранения данных можно получить:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo fdisk -l
- </pre></div>
- </div>
- </section>
- <section id="luks-liveusb">
- <span id="fs-check-luks"></span><span id="index-27"></span><h2>Как мне проверить ФС на зашифрованном LUKS разделе с LiveUSB?<a class="headerlink" href="#luks-liveusb" title="Permalink to this heading">¶</a></h2>
- <p>Если используются зашифрованные LUKS разделы, то сначала откроем соответствующее устройство:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo cryptsetup luksOpen /dev/sda2 luks-root
- </pre></div>
- </div>
- <p>Здесь вместо <strong>/dev/sda2</strong> следует прописать соответствующее блочное устройство зашифрованного накопителя.</p>
- <p>Теперь запустим проверку файловой системы:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo fsck -t ext4 /dev/mapper/luks-root
- </pre></div>
- </div>
- <p>Если вместо <strong>ext4</strong> применяется другая файловая система, необходимо указать её после параметра <strong>-t</strong>.</p>
- <p>По окончании обязательно отключим LUKS том:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo cryptsetup luksClose /dev/mapper/luks-root
- </pre></div>
- </div>
- </section>
- <section id="btrfs">
- <span id="btrfs-repair"></span><span id="index-28"></span><h2>Как восстановить данные с повреждённого раздела с BTRFS?<a class="headerlink" href="#btrfs" title="Permalink to this heading">¶</a></h2>
- <p>Существует несколько способов восстановления данных на повреждённом разделе с файловой системой <a class="reference internal" href="installation.html#fs-btrfs"><span class="std std-ref">BTRFS</span></a>. Они подразделяются на безопасные, небезопасные и деструктивные.</p>
- <p>Небезопасные и деструктивные могут привести к полной потере всех данных на накопителе, поэтому прибегать к ним следует лишь при крайней необходимости, если безопасные не помогли. Работать лучше всего с точной <a class="reference internal" href="using-system.html#dd-mount"><span class="std std-ref">посекторной копией</span></a> вместо реального устройства.</p>
- <p>Здесь <strong>/dev/sda2</strong> – блочное устройство раздела, данные с которого мы будем пытаться восстановить, а <strong>/media/btrfs</strong> – временная точка для его монтирования.</p>
- <p>Восстановление будем производить посредством загрузки с <a class="reference internal" href="installation.html#usb-flash"><span class="std std-ref">Fedora LiveUSB</span></a>, после чего сразу же запустим эмулятор терминала.</p>
- <p>Более подробную информацию можно найти в <a class="reference external" href="https://en.opensuse.org/SDB:BTRFS#How_to_repair_a_broken.2Funmountable_btrfs_filesystem">openSUSE Support Database</a> (на английском языке).</p>
- <section id="id19">
- <h3>Безопасные способы восстановления<a class="headerlink" href="#id19" title="Permalink to this heading">¶</a></h3>
- <p>Попытаемся смонтировать повреждённый раздел:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo mkdir /media/btrfs
- sudo mount /dev/sda2 /media/btrfs
- </pre></div>
- </div>
- <p>Если монтирование прошло успешно, выполним операцию scrub (проверка контрольных сумм для всех данных с попыткой восстановления) на точке монтирования:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo btrfs scrub start /media/btrfs
- sudo btrfs scrub status /media/btrfs
- </pre></div>
- </div>
- <p>Если монтирование осуществить не удалось, сделаем то же самое на блочном устройстве:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo btrfs scrub start /dev/sda2
- sudo btrfs scrub status /dev/sda2
- </pre></div>
- </div>
- <p>Если предыдущие шаги не помогли, воспользуемся особым параметром монтирования <code class="docutils literal notranslate"><span class="pre">usebackuproot</span></code>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo mount -o usebackuproot /dev/sda2 /media/btrfs
- </pre></div>
- </div>
- </section>
- <section id="id20">
- <h3>Небезопасные способы восстановления<a class="headerlink" href="#id20" title="Permalink to this heading">¶</a></h3>
- <p>Сначала выполним проверку раздела:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo btrfs check /dev/sda2
- </pre></div>
- </div>
- <p>Сделаем копию сохранившихся данных с раздела на другой накопитель (например на USB-flash, смонтированный как <strong>/media/external</strong>):</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo btrfs restore /dev/sda2 /media/external
- </pre></div>
- </div>
- <p><strong>Внимание!</strong> После выполнения каждой следующей операции будем пытаться повторно смонтировать раздел и продолжать <strong>только</strong> если это до сих пор не удаётся:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo mount /dev/sda2 /media/btrfs
- </pre></div>
- </div>
- <p>Попытаемся восстановить суперблок файловой системы из его копии:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo btrfs rescue super-recover /dev/sda2
- </pre></div>
- </div>
- <p>Выполним очистку журнала транзакций:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo btrfs rescue zero-log /dev/sda2
- </pre></div>
- </div>
- <p>Запустим восстановление блоков данных (процесс займёт <em>очень много времени</em> и прерывать его <strong>нельзя</strong>):</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo btrfs rescue chunk-recover /dev/sda2
- </pre></div>
- </div>
- </section>
- <section id="id21">
- <h3>Деструктивные способы восстановления<a class="headerlink" href="#id21" title="Permalink to this heading">¶</a></h3>
- <p>Экспортируем сохранившиеся данные на другой накопитель если это не было сделано ранее:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo btrfs restore /dev/sda2 /media/external
- </pre></div>
- </div>
- <p>Запустим принудительное восстановление данных на устройстве (может привести к полной потере всех данных без возможности восстановления):</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo btrfs check --repair /dev/sda2
- </pre></div>
- </div>
- <p>Попытаемся повторно смонтировать раздел:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo mount /dev/sda2 /media/btrfs
- </pre></div>
- </div>
- </section>
- </section>
- <section id="deduplication-memory">
- <span id="index-29"></span><span id="id22"></span><h2>Возможна ли полная дедупликация оперативной памяти?<a class="headerlink" href="#deduplication-memory" title="Permalink to this heading">¶</a></h2>
- <p>Да, дедупликация памяти <a class="reference external" href="https://www.ibm.com/developerworks/linux/library/l-kernel-shared-memory/index.html">поддерживается</a> в ядре Linux начиная с версии 2.6.32 модулем <a class="reference external" href="https://ru.wikipedia.org/wiki/KSM">KSM</a> и по умолчанию применяется лишь в системах виртуализации, например в <a class="reference internal" href="virtualization.html#kvm"><span class="std std-ref">KVM</span></a>.</p>
- </section>
- <section id="deduplication-disk">
- <span id="index-30"></span><span id="id23"></span><h2>Возможна ли полная дедупликация данных на дисках?<a class="headerlink" href="#deduplication-disk" title="Permalink to this heading">¶</a></h2>
- <p>Полная автоматическая дедупликация данных на дисках <a class="reference external" href="https://btrfs.wiki.kernel.org/index.php/Deduplication">поддерживается</a> лишь файловой системой <a class="reference internal" href="installation.html#fs-btrfs"><span class="std std-ref">BTRFS</span></a>.</p>
- </section>
- <section id="memory-compression">
- <span id="index-31"></span><span id="id24"></span><h2>Можно ли включить сжатие оперативной памяти?<a class="headerlink" href="#memory-compression" title="Permalink to this heading">¶</a></h2>
- <p>Да, в ядро Linux, начиная с версии 3.14, по умолчанию входит <a class="reference external" href="https://www.kernel.org/doc/html/latest/admin-guide/blockdev/zram.html">модуль zram</a>, который позволяет увеличить производительность системы посредством использования вместо дисковой подкачки виртуального устройства в оперативной памяти с активным сжатием.</p>
- <p>Начиная с Fedora 33, по умолчанию включено сжатие памяти с пулом 50% от объёма RAM. Допускается <a class="reference internal" href="tips-and-tricks.html#zram-pool-size"><span class="std std-ref">изменять его размер</span></a> в широких пределах.</p>
- <p>Активируем zram в Fedora:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo dnf install zram-generator zram-generator-defaults
- </pre></div>
- </div>
- <p>Перезагрузим систему для вступления изменений в силу:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo systemctl reboot
- </pre></div>
- </div>
- </section>
- <section id="sysctl">
- <span id="sysctl-temporary"></span><span id="index-32"></span><h2>Как временно изменить параметр ядра при помощи sysctl?<a class="headerlink" href="#sysctl" title="Permalink to this heading">¶</a></h2>
- <p>Временно установить любой параметр ядра возможно через sysctl:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo sysctl -w foo.bar=X
- </pre></div>
- </div>
- <p>Здесь <strong>foo.bar</strong> имя параметра, а <strong>X</strong> – его значение. Изменения вступят в силу немедленно и сохранятся до перезагрузки системы.</p>
- </section>
- <section id="sysctl-permanent">
- <span id="index-33"></span><span id="id25"></span><h2>Как задать и сохранить параметр ядра при помощи sysctl?<a class="headerlink" href="#sysctl-permanent" title="Permalink to this heading">¶</a></h2>
- <p>Чтобы сохранить параметр ядра, создадим специальный файл <code class="docutils literal notranslate"><span class="pre">99-foobar.conf</span></code> в каталоге <code class="docutils literal notranslate"><span class="pre">/etc/sysctl.d</span></code>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>foo.bar1=X1
- foo.bar2=X2
- </pre></div>
- </div>
- <p>Каждый параметр должен быть указан с новой строки. Здесь <strong>foo.bar</strong> имя параметра, а <strong>X</strong> – его значение.</p>
- <p>Для вступления изменений в силу требуется перезагрузка:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo systemctl reboot
- </pre></div>
- </div>
- </section>
- <section id="sysctl-order">
- <span id="index-34"></span><span id="id26"></span><h2>В каком порядке загружаются sysctl файлы настроек?<a class="headerlink" href="#sysctl-order" title="Permalink to this heading">¶</a></h2>
- <p>При загрузке ядро проверяет следующие каталоги в поисках <strong>.conf</strong> файлов:</p>
- <blockquote>
- <div><ol class="arabic simple">
- <li><p><code class="docutils literal notranslate"><span class="pre">/usr/lib/sysctl.d</span></code> – предустановленные конфиги системы и определённых пакетов;</p></li>
- <li><p><code class="docutils literal notranslate"><span class="pre">/run/sysctl.d</span></code> – различные конфиги, сгенерированные в рантайме;</p></li>
- <li><p><code class="docutils literal notranslate"><span class="pre">/etc/sysctl.d</span></code> – пользовательские конфиги.</p></li>
- </ol>
- </div></blockquote>
- <p>Порядок выполнения – в алфавитном порядке, поэтому для его изменения многие конфиги содержат цифры и буквы. Например конфиг <code class="docutils literal notranslate"><span class="pre">00-foobar.conf</span></code> выполнится раньше, чем <code class="docutils literal notranslate"><span class="pre">zz-foobar.conf</span></code>.</p>
- </section>
- <section id="configure-runlevel">
- <span id="index-35"></span><span id="id27"></span><h2>Как переключить запуск системы в текстовый режим и обратно?<a class="headerlink" href="#configure-runlevel" title="Permalink to this heading">¶</a></h2>
- <p>Чтобы активировать запуск Fedora в текстовом режиме, нужно переключиться на цель <code class="docutils literal notranslate"><span class="pre">multi-user.target</span></code>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo systemctl set-default multi-user.target
- </pre></div>
- </div>
- <p>Чтобы активировать запуск в графическом режиме, необходимо убедиться в том, что установлен какой-либо менеджер графического входа в систему (GDM, SDDM, LightDM и т.д.), а затем переключиться на цель <code class="docutils literal notranslate"><span class="pre">graphical.target</span></code>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo systemctl set-default graphical.target
- </pre></div>
- </div>
- <p>Определить используемый в настоящее время режим можно так:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>systemctl get-default
- </pre></div>
- </div>
- <p>Изменения вступят в силу лишь после перезапуска системы:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo systemctl reboot
- </pre></div>
- </div>
- </section>
- <section id="fedora">
- <span id="swap-to-file"></span><span id="index-36"></span><h2>Как настроить подкачку в файл в Fedora?<a class="headerlink" href="#fedora" title="Permalink to this heading">¶</a></h2>
- <p>Создадим файл подкачки на 4 ГБ:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo dd if=/dev/zero of=/media/pagefile count=4096 bs=1M
- </pre></div>
- </div>
- <p>Установим правильный chmod:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo chmod 600 /media/pagefile
- </pre></div>
- </div>
- <p>Подготовим swapfs к работе:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo mkswap /media/pagefile
- </pre></div>
- </div>
- <p>Активируем файл подкачки:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo swapon /media/pagefile
- </pre></div>
- </div>
- <p>Для того, чтобы подкачка подключалась автоматически при загрузке системы, откроем файл <code class="docutils literal notranslate"><span class="pre">/etc/fstab</span></code> и добавим в него следующую строку:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>/media/pagefile none swap sw 0 0
- </pre></div>
- </div>
- <p>Действия вступят в силу немедленно.</p>
- </section>
- <section id="disk-usage">
- <span id="index-37"></span><span id="id28"></span><h2>Как узнать, какой процесс осуществляет запись на диск?<a class="headerlink" href="#disk-usage" title="Permalink to this heading">¶</a></h2>
- <p>Для мониторинга дисковой активности существуют улититы <strong>iotop</strong> и <strong>fatrace</strong>. Установим их:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo dnf install iotop fatrace
- </pre></div>
- </div>
- <p>Запустим iotop в режиме накопления показаний:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo iotop -a
- </pre></div>
- </div>
- <p>Запустим fatrace в режиме накопления с выводом лишь информации о событиях записи на диск:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo fatrace -f W
- </pre></div>
- </div>
- <p>Запустим fatrace в режиме накопления, с выводом информации о событиях записи на диск в файл, в течение 10 минут (600 секунд):</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo fatrace -f W -o ~/disk-usage.log -s 600
- </pre></div>
- </div>
- </section>
- <section id="change-label">
- <span id="index-38"></span><span id="id29"></span><h2>Как сменить метку раздела?<a class="headerlink" href="#change-label" title="Permalink to this heading">¶</a></h2>
- <p>Смена метки раздела с файловой системой ext2, ext3 и ext4:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo e2label /dev/sda1 "NewLabel"
- </pre></div>
- </div>
- <p>Смена метки раздела с файловой системой XFS:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo xfs_admin -L "NewLabel" /dev/sda1
- </pre></div>
- </div>
- <p>Здесь <strong>/dev/sda1</strong> – раздел, на котором требуется изменить метку.</p>
- </section>
- <section id="uuid">
- <span id="get-uuid"></span><span id="index-39"></span><h2>Как получить UUID всех смонтированных разделов?<a class="headerlink" href="#uuid" title="Permalink to this heading">¶</a></h2>
- <p>Для получения всех UUID можно использовать утилиту <strong>blkid</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo blkid
- </pre></div>
- </div>
- <p>Вывод UUID для указанного раздела:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo blkid /dev/sda1
- </pre></div>
- </div>
- <p>Здесь <strong>/dev/sda1</strong> – раздел, для которого требуется вывести UUID.</p>
- </section>
- <section id="change-uuid">
- <span id="index-40"></span><span id="id30"></span><h2>Как изменить UUID раздела?<a class="headerlink" href="#change-uuid" title="Permalink to this heading">¶</a></h2>
- <p>Смена UUID раздела с файловой системой ext2, ext3 и ext4:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo tune2fs /dev/sda1 -U $(uuidgen)
- </pre></div>
- </div>
- <p>Смена UUID раздела с файловой системой XFS:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo xfs_admin -U generate /dev/sda1
- </pre></div>
- </div>
- <p>Здесь <strong>/dev/sda1</strong> – раздел, на котором требуется изменить UUID.</p>
- </section>
- <section id="pid">
- <span id="get-pid"></span><span id="index-41"></span><h2>Как получить PID запущенного процесса?<a class="headerlink" href="#pid" title="Permalink to this heading">¶</a></h2>
- <p>Для получения идентификатора запущенного процесса (PID), следует применять утилиту <strong>pidof</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>pidof foo-bar
- </pre></div>
- </div>
- <p>Здесь вместо <strong>foo-bar</strong> следует указать имя образа процесса, информацию о котором требуется получить.</p>
- </section>
- <section id="kill-sigterm">
- <span id="index-42"></span><span id="id31"></span><h2>Как правильно завершить работу процесса?<a class="headerlink" href="#kill-sigterm" title="Permalink to this heading">¶</a></h2>
- <p>Для того, чтобы завершить работу процесса, необходимо отправить ему сигнал <strong>SIGTERM</strong>. После получения данного сигнала процесс должен немедленно начать завершение своей работы:</p>
- <blockquote>
- <div><ul class="simple">
- <li><p>остановить активные потоки;</p></li>
- <li><p>сообщить порождённым им процессам (потомкам) о том, что он завершает свою работу;</p></li>
- <li><p>закрыть все открытые процессом дескрипторы;</p></li>
- <li><p>освободить все занятые процессом ресурсы;</p></li>
- <li><p>вернуть управление операционной системе.</p></li>
- </ul>
- </div></blockquote>
- <p>Чтобы отправить сигнал SIGTERM процессу с определённым <a class="reference internal" href="#get-pid"><span class="std std-ref">PID</span></a>, воспользуемся утилитой <strong>kill</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>kill -15 XXXX
- </pre></div>
- </div>
- <p>Здесь <strong>XXXX</strong> – PID нужного процесса.</p>
- <p>Вместо явного указания PID процесса существует возможность завершить работу процесса с указанным именем посредством <strong>killall</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>killall -15 foo-bar
- </pre></div>
- </div>
- <p>Здесь вместо <strong>foo-bar</strong> следует указать имя образа процесса, который требуется завершить, однако её следует применять с особой осторожностью ибо если существует несколько процессов с одинаковым названием, все они будут завершены.</p>
- </section>
- <section id="kill-sigkill">
- <span id="index-43"></span><span id="id32"></span><h2>Как принудительно завершить работу процесса?<a class="headerlink" href="#kill-sigkill" title="Permalink to this heading">¶</a></h2>
- <p>Если какой-либо процесс завис и не отвечает на требование завершения посредством <a class="reference internal" href="#kill-sigterm"><span class="std std-ref">SIGTERM</span></a>, можно заставить операционную систему принудительно завершить его работу сигналом <strong>SIGKILL</strong>, который не может быть перехвачен и проигнорирован процессом.</p>
- <p>Данный сигнал следует использовать с особой осторожностью, т.к. в этом случае процесс не сможет корректно освободить все дескрипторы и занятые ресурсы, а также сообщить своим потомкам о своём завершении, что может повлечь за собой появление т.н. <a class="reference internal" href="#process-orphan"><span class="std std-ref">процессов-сирот</span></a>.</p>
- <p>Чтобы отправить сигнал SIGKILL процессу с определённым <a class="reference internal" href="#get-pid"><span class="std std-ref">PID</span></a>, воспользуемся утилитой <strong>kill</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>kill -9 XXXX
- </pre></div>
- </div>
- <p>Здесь <strong>XXXX</strong> – PID нужного процесса.</p>
- <p>Вместо явного указания PID процесса существует возможность завершить работу процесса с указанным именем посредством <strong>killall</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>killall -9 foo-bar
- </pre></div>
- </div>
- <p>Здесь вместо <strong>foo-bar</strong> следует указать имя образа процесса. Если существует несколько процессов с одинаковым названием, все они будут завершены.</p>
- </section>
- <section id="process-zombie">
- <span id="index-44"></span><span id="id33"></span><h2>Что такое процесс-зомби?<a class="headerlink" href="#process-zombie" title="Permalink to this heading">¶</a></h2>
- <p>Процессы-зомби появляются в системе если потомок завершил свою работу раньше родительского процесса, а последний не отрегировал на отправленный ему сигнал <strong>SIGCHLD</strong>.</p>
- <p>Такие процессы не занимают ресурсов в системе (ибо успешно завершили свою работу), за исключением строки в таблице процессов, хранящей его <a class="reference internal" href="#get-pid"><span class="std std-ref">PID</span></a>.</p>
- <p>Все зомби будут автоматически удалены из таблицы процессов после того, как завершит свою работу их родитель.</p>
- </section>
- <section id="process-orphan">
- <span id="index-45"></span><span id="id34"></span><h2>Что такое процесс-сирота?<a class="headerlink" href="#process-orphan" title="Permalink to this heading">¶</a></h2>
- <p>Процессы-сироты появляются в системе если их родитель был аварийно уничтожен системой сигналом <a class="reference internal" href="#kill-sigkill"><span class="std std-ref">SIGKILL</span></a> и не смог сообщить своим потомкам о своём завершении работы.</p>
- <p>В отличие от <a class="reference internal" href="#process-zombie"><span class="std std-ref">зомби</span></a>, такие процессы расходуют ресурсы системы и могут быть источником множества проблем.</p>
- <p>При обнаружении таких процессов система выполняет операцию переподчинения и устанавливает их родителем главный процесс инициализации.</p>
- </section>
- <section id="docker-fedora">
- <span id="index-46"></span><span id="id35"></span><h2>Как правильно установить Docker в Fedora?<a class="headerlink" href="#docker-fedora" title="Permalink to this heading">¶</a></h2>
- <p>Официально Docker в Fedora более не поддерживается. На просторах Интернета можно найти сторонние инструкции по установке Docker, однако мы настоятельно не рекомендуем следовать им, поскольку для их работы требуются изменения в системе, способные нарушить её безопасность и/или работу других приложений (например отключение cgroupv2).</p>
- <p>Вместо этого рекомендуется установить и использовать Podman, т.к. он создан и поддерживается Red Hat, а также не требует прав суперпользователя для работы:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo dnf install podman
- </pre></div>
- </div>
- <p>Синтаксис команд аналогичен Docker.</p>
- </section>
- <section id="kernel-bs">
- <span id="index-47"></span><span id="id36"></span><h2>Как определить включена ли определённая опция ядра во время компиляции?<a class="headerlink" href="#kernel-bs" title="Permalink to this heading">¶</a></h2>
- <p>Полный список опций, заданных на этапе компиляции ядра, всегда можно найти в config-файлах, внутри каталога <code class="docutils literal notranslate"><span class="pre">/boot</span></code>.</p>
- <p>В качестве примера проверим статус опции <code class="docutils literal notranslate"><span class="pre">CONFIG_EFI_STUB</span></code> текущего ядра:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>grep CONFIG_EFI_STUB /boot/config-$(uname -r)
- </pre></div>
- </div>
- <p>В выводе <strong>y</strong> означает, что опция была включена, а <strong>not set</strong>, соответственно, выключена.</p>
- </section>
- <section id="ksoftirqd">
- <span id="index-48"></span><span id="id37"></span><h2>Процесс ksoftirqd съедает все ресурсы системы. Что делать?<a class="headerlink" href="#ksoftirqd" title="Permalink to this heading">¶</a></h2>
- <p>Ядро операционной системы взаимодействует с устройствами посредством прерываний. Когда возникает новое прерывание, оно немедленно приостанавливает работу текущего выполняемого процесса, переключается в режим ядра и начинает его обработку.</p>
- <p>Может случиться так, что прерывания будут генерироваться настолько часто, что ядро не сможет их обрабатывать немедленно, в порядке получения. На этот случай имеется специальный механизм, помещающий полученные прерывания в очередь для дальнейшей обработки. Этой очередью управляет особый поток ядра <strong>ksoftirqd</strong> (создаётся по одному на каждый имеющийся процессор или ядро многоядерного процессора).</p>
- <p>Если потоки ядра ksoftirqd потребляют значительное количество ресурсов центрального процессора, значит система находится под очень высокой нагрузкой по прерываниям.</p>
- </section>
- <section id="kernel-irq">
- <span id="index-49"></span><span id="id38"></span><h2>Как определить какое устройство генерирует огромное количество прерываний?<a class="headerlink" href="#kernel-irq" title="Permalink to this heading">¶</a></h2>
- <p>Для диагностики системы обработки прерываний, ядро имеет встроенный механизм:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>cat /proc/interrupts
- </pre></div>
- </div>
- <p>Числа в таблице означают точное количество прерываний, инициированных соответствующим устройством или подсистемой, с момента загрузки.</p>
- </section>
- <section id="irq-manual">
- <span id="index-50"></span><span id="id39"></span><h2>Как произвести ручную балансировку прерываний?<a class="headerlink" href="#irq-manual" title="Permalink to this heading">¶</a></h2>
- <p>Если <a class="reference internal" href="#kernel-irq"><span class="std std-ref">прерывания</span></a> распределены между процессорными ядрами не равномерно, можно использовать режим ручной балансировки:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo bash -c "echo X > /proc/irq/Y/smp_affinity"
- </pre></div>
- </div>
- <p>Здесь <strong>X</strong> – маска процессора (CPU affinity), который будет обрабатывать данное прерывание, а <strong>Y</strong> – номер прерывания (указан в левом столбце таблицы прерываний).</p>
- <p>Чтобы вычислить маску следует возвести число 2 в степень, равную порядкому номеру процессора, и результат перевести в шестнадцатиричную систему счисления.</p>
- </section>
- <section id="too-many-open-files">
- <span id="fd-limit"></span><span id="index-51"></span><h2>При работе приложения возникает ошибка Too many open files. Что делать?<a class="headerlink" href="#too-many-open-files" title="Permalink to this heading">¶</a></h2>
- <p>Ошибка <em>Too many open files</em> возникает при превышении количества открытых дескрипторов файлов процессом. Для её исправления, нужно <a class="reference internal" href="#fd-increase"><span class="std std-ref">увеличить это ограничение</span></a>.</p>
- </section>
- <section id="fd-hard-soft">
- <span id="index-52"></span><span id="id40"></span><h2>Как узнать текущий лимит открытых файловых дескрипторов?<a class="headerlink" href="#fd-hard-soft" title="Permalink to this heading">¶</a></h2>
- <p>Существует два типа ограничений: мягкий (soft) и жёсткий (hard). Жёсткий задаётся администратором системы, а мягкий может регулироваться как пользователем, так и запущенным приложением, но не может превышать максимально заданное значение жёсткого лимита, а также <a class="reference internal" href="#fd-kernel"><span class="std std-ref">глобальное для всего ядра</span></a>.</p>
- <p>Получим значение мягкого ограничителя:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>ulimit -Sn
- </pre></div>
- </div>
- <p>Получим значение жёсткого ограничителя:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>ulimit -Hn
- </pre></div>
- </div>
- <p>Значения по умолчанию <strong>1024</strong> (soft) и <strong>4096</strong> (hard).</p>
- </section>
- <section id="fd-kernel">
- <span id="index-53"></span><span id="id41"></span><h2>Как узнать глобальный лимит открытых файловых дескрипторов?<a class="headerlink" href="#fd-kernel" title="Permalink to this heading">¶</a></h2>
- <p>Наряду с <a class="reference internal" href="#fd-hard-soft"><span class="std std-ref">мягким и жёстким лимитами</span></a> открытых файловых дескрипторов существует и глобальный, который ядро Linux способно адресовать и корректно обработать.</p>
- <p>Выведем это значение при помощи соответствующей функции ядра:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>cat /proc/sys/fs/file-max
- </pre></div>
- </div>
- </section>
- <section id="fd-increase">
- <span id="index-54"></span><span id="id42"></span><h2>Как увеличить лимит открытых файловых дескрипторов?<a class="headerlink" href="#fd-increase" title="Permalink to this heading">¶</a></h2>
- <p><a class="reference internal" href="#fd-hard-soft"><span class="std std-ref">Мягкие и жёсткие лимиты</span></a> на количество дескрипторов открытых файлов задаются в файле <code class="docutils literal notranslate"><span class="pre">/etc/security/limits.conf</span></code> суперпользователем, но при этом не могут превышать <a class="reference internal" href="#fd-kernel"><span class="std std-ref">глобальный</span></a>.</p>
- <p>Увеличим ограничение для пользователя <strong>foo-bar</strong> до 8192/2048:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>foo-bar soft nofile 2048
- foo-bar hard nofile 8192
- </pre></div>
- </div>
- <p>Увеличим ограничение для любых пользователей до 8192/2048:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>* soft nofile 2048
- * hard nofile 8192
- </pre></div>
- </div>
- <p>Изменения вступят в силу при следующем входе в систему.</p>
- </section>
- <section id="task-affinity">
- <span id="index-55"></span><span id="id43"></span><h2>Как запустить процесс так, чтобы он мог использовать лишь определённые ядра процессора?<a class="headerlink" href="#task-affinity" title="Permalink to this heading">¶</a></h2>
- <p>По умолчанию процесс выполняется на любых доступных для Linux процессорах (или их ядрах).</p>
- <p>Выбором наиболее подходящего ядра CPU для каждого потока процесса занимается непосредственно ядро, однако существует возможность и ручного переопределения.</p>
- <p>Запустим приложение <strong>foo-bar</strong> на каждом чётном ядре (нумерация всегда начинается с нуля):</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>taskset -a -c 0,2,4,6 foo-bar
- </pre></div>
- </div>
- <p>Изменим ассоциацию ядер для уже запущенного процесса <strong>foo-bar</strong> (в качестве параметра указывается <a class="reference internal" href="#get-pid"><span class="std std-ref">PID необходимого процесса</span></a>):</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>taskset -a -c 1,3,5,7 -p $(pidof foo-bar)
- </pre></div>
- </div>
- </section>
- <section id="task-priority">
- <span id="index-56"></span><span id="id44"></span><h2>Как изменить приоритет процесса?<a class="headerlink" href="#task-priority" title="Permalink to this heading">¶</a></h2>
- <p>Допустимые значения приоритета находятся в диапазоне от -20 (наиболее высокий приоритет) до 19 (наиболее низкий). Отрицательные значения может устанавливать лишь суперпользователь.</p>
- <p>Запустим приложение <strong>foo-bar</strong> с приоритетом <strong>10</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>nice -n 10 foo-bar
- </pre></div>
- </div>
- <p>Изменим приоритет запущенного процесса <strong>foo-bar</strong> (в качестве параметра указывается <a class="reference internal" href="#get-pid"><span class="std std-ref">PID необходимого процесса</span></a>) до <strong>8</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>renice -n 8 -p $(pidof foo-bar)
- </pre></div>
- </div>
- </section>
- <section id="effective-uid-real-uid">
- <span id="euid-vs-ruid"></span><span id="index-57"></span><h2>Чем отличается Effective UID процесса от Real UID?<a class="headerlink" href="#effective-uid-real-uid" title="Permalink to this heading">¶</a></h2>
- <p>В мире UNIX считается нормальным, когда один процесс запускается от одного пользователя, но при этом получает права совсем другого (чаще всего это суперпользователь root).</p>
- <p>В качестве простого примера рассмтрим ситуацию, когда пользователь <strong>user1</strong> запускает бинарник с установленным suid-битом <strong>/usr/bin/foo-bar</strong>. Таким образом, у процесса <strong>foo-bar</strong> в качестве <em>Real user ID</em> будет установлен <strong>user1</strong>, а <em>Effective user ID</em> – <strong>root</strong>. Это сделано для того, чтобы приложение могло самостоятельно отказаться от повышенных прав, либо переключаться между ними при помощи соответствующего системного вызова.</p>
- </section>
- <section id="copying-data">
- <span id="index-58"></span><span id="id45"></span><h2>Как скопировать данные с одного раздела на другой?<a class="headerlink" href="#copying-data" title="Permalink to this heading">¶</a></h2>
- <p>Для копирования файлов с одного раздела на другой лучше всего использовать утилиту <strong>rsync</strong> с опциями на сохранение прав доступа.</p>
- <p>Загрузимся с <a class="reference internal" href="installation.html#usb-flash"><span class="std std-ref">Fedora LiveUSB</span></a>, затем смонтируем старый и новый разделы:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo mkdir /media/old-root
- sudo mount -t ext4 /dev/sda1 /media/old-root
- sudo mkdir /media/new-root
- sudo mount -t ext4 /dev/sdb1 /media/new-root
- </pre></div>
- </div>
- <p>Запустим процесс копирования:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo rsync -axHAWXS --numeric-ids --info=progress2 /media/old-root/ /media/new-root/
- </pre></div>
- </div>
- <p>По окончании работы обязательно размонтируем оба раздела:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo umount /media/old-root
- sudo umount /media/new-root
- </pre></div>
- </div>
- </section>
- <section id="chmod-immutable">
- <span id="index-59"></span><span id="id46"></span><h2>Как запретить модификацию файла даже владельцу и суперпользователю?<a class="headerlink" href="#chmod-immutable" title="Permalink to this heading">¶</a></h2>
- <p>Чтобы запретить модификацию файла (изменение, удаление) любым пользователем (включая владельца и суперпользователя), установим ему расширенный атрибут <code class="docutils literal notranslate"><span class="pre">+i</span></code>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo chattr +i foo-bar.txt
- </pre></div>
- </div>
- <p>Чтобы отменить произведённые изменения, выполним:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo chattr -i foo-bar.txt
- </pre></div>
- </div>
- <p>Управлять расширенными атрибутами может лишь суперпользователь.</p>
- </section>
- <section id="chmod-lsattr">
- <span id="index-60"></span><span id="id47"></span><h2>Как узнать какие расширенные атрибуты применены для конкретного файла?<a class="headerlink" href="#chmod-lsattr" title="Permalink to this heading">¶</a></h2>
- <p>Для получения <a class="reference external" href="https://en.wikipedia.org/wiki/Chattr#Attributes">расширенных атрибутов</a> воспользуемся утилитой <strong>lsattr</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>lsattr foo-bar.txt
- </pre></div>
- </div>
- <p>Поддерживается также вывод в виде человеко-читаемого списка, который можно включить опциональным параметром <code class="docutils literal notranslate"><span class="pre">-l</span></code>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>lsattr foo-bar.txt
- </pre></div>
- </div>
- </section>
- <section id="chmod-addonly">
- <span id="index-61"></span><span id="id48"></span><h2>Как разрешить лишь дописывать данные в файл?<a class="headerlink" href="#chmod-addonly" title="Permalink to this heading">¶</a></h2>
- <p>Чтобы разрешить лишь добавление данных в файл любым пользователем (включая владельца и суперпользователя), установим ему расширенный атрибут <code class="docutils literal notranslate"><span class="pre">+a</span></code>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo chattr +a foo-bar.txt
- </pre></div>
- </div>
- <p>Чтобы отменить произведённые изменения, выполним:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo chattr -a foo-bar.txt
- </pre></div>
- </div>
- </section>
- <section id="ssh">
- <span id="ssh-alias"></span><span id="index-62"></span><h2>Как создать алиасы для быстрого подключения к SSH серверам?<a class="headerlink" href="#ssh" title="Permalink to this heading">¶</a></h2>
- <p>OpenSSH позволяет создавать неограниченное количество алиасов для быстрых подключений.</p>
- <p>Чтобы сделать это, откроем (создадим) файл <code class="docutils literal notranslate"><span class="pre">~/.ssh/config</span></code> в любом текстовом редакторе и внесём правки:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>Host foo
- HostName example1.org
- Port 22
- User user1
- Host bar
- HostName example2.org
- Port 22
- User user2
- IdentityFile ~/.ssh/id_rsa2
- </pre></div>
- </div>
- <p>Здесь <code class="docutils literal notranslate"><span class="pre">foo</span></code> и <code class="docutils literal notranslate"><span class="pre">bar</span></code> – имена сокращений (алиасов), которые будут использоваться для подключения. Для каждого могут быть указаны индивидуальные настройки, включая <a class="reference internal" href="security.html#ssh-keys"><span class="std std-ref">различные SSH ключи</span></a> при помощи директивы <code class="docutils literal notranslate"><span class="pre">IdentityFile</span></code>.</p>
- <p>Подключимся к первому серверу:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>ssh foo
- </pre></div>
- </div>
- <p>Подключимся ко второму серверу:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>ssh bar
- </pre></div>
- </div>
- </section>
- <section id="fuse">
- <span id="fuse-info"></span><span id="index-63"></span><h2>Что такое FUSE?<a class="headerlink" href="#fuse" title="Permalink to this heading">¶</a></h2>
- <p>FUSE (file system in userspace) – это модуль ядра и набор утилит для работы с ним, предназначенные для запуска различных файловых систем в пользовательском пространстве.</p>
- <p>Благодаря FUSE в Fedora могут использоваться файловые системы, которые по какой-либо причине не могут войти напрямую в состав ядра Linux из-за лицензионных проблем, либо патентов.</p>
- <p>Некоторые примеры подобных реализаций:</p>
- <blockquote>
- <div><ul class="simple">
- <li><p><a class="reference internal" href="using-applications.html#fuse-mtp"><span class="std std-ref">MTP</span></a>;</p></li>
- <li><p>NTFS;</p></li>
- <li><p>ZFS;</p></li>
- <li><p>SSHFS;</p></li>
- <li><p>WebDAV.</p></li>
- </ul>
- </div></blockquote>
- <p>Из-за работы в пользовательском режиме возникает ряд проблем:</p>
- <blockquote>
- <div><ul class="simple">
- <li><p>очень медленная работа за счёт постоянных переключений контекста;</p></li>
- <li><p>в зависимости от параметров монтирования может быть не видна для работающих системных сервисов.</p></li>
- </ul>
- </div></blockquote>
- </section>
- <section id="kerberos">
- <span id="kerberos-auth"></span><span id="index-64"></span><h2>Как авторизоваться на удалённой системе с использованием Kerberos?<a class="headerlink" href="#kerberos" title="Permalink to this heading">¶</a></h2>
- <p>Установим необходимые пакеты для работы с Kerberos 5:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo dnf install krb5-workstation
- </pre></div>
- </div>
- <p>Произведём авторизацию на удалённой системе:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>kinit foo-bar@FEDORAPROJECT.ORG
- </pre></div>
- </div>
- <p>Здесь <strong>foo-bar</strong> – логин на удалённой системе, а <strong>FEDORAPROJECT.ORG</strong> – имя домена (должно быть указано строго в верхнем регистре).</p>
- <p>В случае ввода верных авторизационных данных процесс должен пройти в штатном режиме.</p>
- </section>
- <section id="kerberos-renew">
- <span id="index-65"></span><span id="id49"></span><h2>Как обновить Kerberos-тикет?<a class="headerlink" href="#kerberos-renew" title="Permalink to this heading">¶</a></h2>
- <p>В зависимости от настроек сервера, полученный <a class="reference internal" href="#kerberos-auth"><span class="std std-ref">Kerberos-тикет</span></a> обычно действует в течение 24 часов, затем даётся ещё от 24 до 48 часов для его обновления без необходимости прохождения повторной процедуры авторизации.</p>
- <p>Проверим актуальность Kerberos тикетов:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>klist -A
- </pre></div>
- </div>
- <p>При необходимости обновим необходимый:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>kinit -R foo-bar@FEDORAPROJECT.ORG
- </pre></div>
- </div>
- <p>Здесь <strong>foo-bar</strong> – логин на удалённой системе, а <strong>FEDORAPROJECT.ORG</strong> – имя домена (должно быть указано строго в верхнем регистре).</p>
- </section>
- <section id="delete-inode">
- <span id="index-66"></span><span id="id50"></span><h2>В каталоге появился файл с некорректным именем, который не удаётся удалить. Что делать?<a class="headerlink" href="#delete-inode" title="Permalink to this heading">¶</a></h2>
- <p>Файлы с некорректными именами могут возникать при повреждениях файловой системы, либо сбоях в приложениях, которые создали их.</p>
- <p>Штатно такие файлы удалить не удастся, поэтому придётся уничтожить соответствующий данному файлу I-узел (I-Node).</p>
- <p>Перейдём в каталог с удаляемым файлом:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>cd ~/foo-bar
- </pre></div>
- </div>
- <p>Выведем листинг содержимого каталога с включённым отображением номеров I-узлов:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>ls -li
- </pre></div>
- </div>
- <p>Найдём в выводе необходимый файл и сохраним значение его I-узла. Теперь мы можем удалить его:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>find . -maxdepth 1 -type f -inum XXXXXXX -delete
- </pre></div>
- </div>
- <p>Здесь <strong>XXXXXXX</strong> – номер I-узла некорректного файла.</p>
- </section>
- <section id="ext4">
- <span id="defrag-info"></span><span id="index-67"></span><h2>Нужно ли выполнять дефрагментацию для разделов с ФС ext4?<a class="headerlink" href="#ext4" title="Permalink to this heading">¶</a></h2>
- <p>В большинстве случаев дефрагментация диска на разделах с файловой системой ext4 не требуется, т.к. драйвер осуществляет предварительное размещение файлов на свободном месте так, чтобы они заняли его целиком, оставляя при этом небольшой участок пространства для дальнейшего расширения.</p>
- <p>Однако при определённых обстоятельствах (например если точный размер при создании неизвестен, либо в него постоянно производится добавление-удаление данных), некоторые файлы могут фрагментироваться.</p>
- </section>
- <section id="defrag-custom">
- <span id="index-68"></span><span id="id51"></span><h2>Как выполнить дефрагментацию отдельных файлов на разделе ФС ext4?<a class="headerlink" href="#defrag-custom" title="Permalink to this heading">¶</a></h2>
- <p>Для выполнения частичной дефрагментации, можно использовать утилиту <strong>e4defrag</strong>, входящую в пакет <strong>e2fsprogs</strong>.</p>
- <p>Данная утилита работает со <strong>смонтированным</strong> диском, т.к. непосредственно дефрагментацией будет заниматься драйвер файловой системы, а утилита лишь укажет ему цели.</p>
- <p>Разрешается выполнять оптимизацию отдельных файлов, либо всего содержимого указанных каталогов.</p>
- <p>Выполним дефрагментацию крупной базы данных <code class="docutils literal notranslate"><span class="pre">/var/db/foo-bar.db</span></code>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo e4defrag /var/db/foo-bar.db
- </pre></div>
- </div>
- <p>Выполним дефрагментацию всего корня:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo e4defrag /
- </pre></div>
- </div>
- </section>
- <section id="defrag-full">
- <span id="index-69"></span><span id="id52"></span><h2>Как выполнить дефрагментацию всего раздела с ФС ext4?<a class="headerlink" href="#defrag-full" title="Permalink to this heading">¶</a></h2>
- <p>Полную дефрагментацию можно осуществить при помощи средства <a class="reference internal" href="#fs-check-lvm"><span class="std std-ref">проверки диска</span></a> на <strong>размонтированном</strong> разделе, например при запуске с <a class="reference internal" href="installation.html#usb-flash"><span class="std std-ref">Fedora LiveUSB</span></a>.</p>
- <p>Запустим процесс:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo fsck -t ext4 -fn /dev/sda2
- </pre></div>
- </div>
- <p>Здесь <strong>/dev/sda2</strong> – раздел, на котором следует провести процесс дефрагментации. Операция займёт достаточно много времени (в зависимости от размера диска). Прерывать её не следует, т.к. это может привести к полной потере данных.</p>
- </section>
- <section id="cpu-cores">
- <span id="index-70"></span><span id="id53"></span><h2>Как определить количество доступных процессоров или ядер?<a class="headerlink" href="#cpu-cores" title="Permalink to this heading">¶</a></h2>
- <p><em>Основной способ.</em> Применим утилиту <strong>nproc</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>nproc --all
- </pre></div>
- </div>
- <p>Без параметра <code class="docutils literal notranslate"><span class="pre">--all</span></code> будет указано лишь количество <a class="reference internal" href="#task-affinity"><span class="std std-ref">доступных процессоров</span></a> лишь для данного пользователя/процесса.</p>
- <p><em>Альтернативный способ.</em> Если указанная выше утилита в системе отсутствует, выполним:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>cat /proc/cpuinfo | grep 'cpu cores' | uniq | awk '{ print $4 }'
- </pre></div>
- </div>
- </section>
- <section id="bash-pipelines">
- <span id="index-71"></span><span id="id54"></span><h2>Как перенаправить стандартный ввод-вывод в файлы?<a class="headerlink" href="#bash-pipelines" title="Permalink to this heading">¶</a></h2>
- <p>Перенаправление потока стандартного вывода утилиты <strong>ls</strong>, запущенной с параметром, в файл:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>ls -l > ~/foo-bar.txt
- </pre></div>
- </div>
- <p>Перенаправление потока стандартного вывода в файл в режиме <em>добавления данных</em> (не заменяет существующие):</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>ls -l >> ~/foo-bar.txt
- </pre></div>
- </div>
- <p>Перенаправление потока стандартного ввода на ввод из указанного файла:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sort < ~/foo-bar.txt
- </pre></div>
- </div>
- <p>Перенаправление потока стандартного вывода и потока ошибок в файл:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>/usr/bin/foo > ~/foo-bar.txt 2>&1
- </pre></div>
- </div>
- <p>Комбинирование ввода из одного файла с выводом в другой с подавлением возникших ошибок:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>/usr/bin/foo < ~/foo-bar.txt > ~/result.txt 2> /dev/null
- </pre></div>
- </div>
- </section>
- <section id="mount-nopass">
- <span id="index-72"></span><span id="id55"></span><h2>Как разрешить монтирование любых дисков без ввода пароля?<a class="headerlink" href="#mount-nopass" title="Permalink to this heading">¶</a></h2>
- <p>По умолчанию пароль не запрашивается только при монтировании сменных накопителей, однако если требуется реализовать это для любых, потребуется добавить новое правило Polkit.</p>
- <p>Создадим новый конфиг:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo touch /etc/polkit-1/rules.d/10-mount-nopass.rules
- sudo chmod 0644 /etc/polkit-1/rules.d/10-mount-nopass.rules
- </pre></div>
- </div>
- <p>Загрузим его в текстовом редакторе:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudoedit /etc/polkit-1/rules.d/10-mount-nopass.rules
- </pre></div>
- </div>
- <p>Добавим следующее правило:</p>
- <div class="highlight-javascript notranslate"><div class="highlight"><pre><span></span><span class="nx">polkit</span><span class="p">.</span><span class="nx">addRule</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">action</span><span class="p">,</span><span class="w"> </span><span class="nx">subject</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
- <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">((</span><span class="nx">action</span><span class="p">.</span><span class="nx">id</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"org.freedesktop.udisks2.filesystem-mount-system"</span><span class="w"> </span><span class="o">||</span>
- <span class="w"> </span><span class="nx">action</span><span class="p">.</span><span class="nx">id</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"org.freedesktop.udisks.filesystem-mount-system-internal"</span><span class="p">)</span><span class="w"> </span><span class="o">&&</span>
- <span class="w"> </span><span class="nx">subject</span><span class="p">.</span><span class="nx">local</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="nx">subject</span><span class="p">.</span><span class="nx">active</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="nx">subject</span><span class="p">.</span><span class="nx">isInGroup</span><span class="p">(</span><span class="s2">"wheel"</span><span class="p">))</span>
- <span class="w"> </span><span class="p">{</span>
- <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">polkit</span><span class="p">.</span><span class="nx">Result</span><span class="p">.</span><span class="nx">YES</span><span class="p">;</span>
- <span class="w"> </span><span class="p">}</span>
- <span class="p">});</span>
- </pre></div>
- </div>
- <p>Сохраним изменения в файле.</p>
- <p>Теперь пользователи с <a class="reference internal" href="security.html#admin-vs-user"><span class="std std-ref">административными правами</span></a> (входящие в группу <strong>wheel</strong>) смогут монтировать любые диски без ввода пароля.</p>
- </section>
- <section id="coredump-systemd">
- <span id="codedump-info"></span><span id="index-73"></span><h2>Что такое coredump и почему systemd сохраняет их?<a class="headerlink" href="#coredump-systemd" title="Permalink to this heading">¶</a></h2>
- <p>Coredump – это дамп закрытой памяти процесса, создаваемый в момент возникновения в нём внештатной ситуации, приводящей к аварийному завершению. Эти дампы используются всевозможными системами анализа и необходимы для создания правильных <a class="reference internal" href="generic-info.html#bug-report"><span class="std std-ref">баг-репортов</span></a>.</p>
- <p>По умолчанию systemd при падениях любых процессов (как системных, так и пользовательских), сохраняет дампы их закрытой памяти в каталоге <strong>/var/lib/systemd/coredump</strong>, поэтому он может занимать десятки гигабайт.</p>
- <p>Возможно их <a class="reference internal" href="#codedump-limit"><span class="std std-ref">ограничить</span></a>, либо полностью <a class="reference internal" href="#codedump-disable"><span class="std std-ref">отключить</span></a>.</p>
- </section>
- <section id="codedump-limit">
- <span id="index-74"></span><span id="id56"></span><h2>Как ограничить размер сохраняемых дампов памяти?<a class="headerlink" href="#codedump-limit" title="Permalink to this heading">¶</a></h2>
- <p>Откроем файл конфигурации <a class="reference internal" href="#codedump-info"><span class="std std-ref">systemd-coredump</span></a>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudoedit /etc/systemd/coredump.conf
- </pre></div>
- </div>
- <p>Внесём правки, убирая символ комментария <strong>#</strong> перед каждой строкой:</p>
- <div class="highlight-ini notranslate"><div class="highlight"><pre><span></span><span class="k">[Coredump]</span>
- <span class="na">Storage</span><span class="o">=</span><span class="s">external</span>
- <span class="na">Compress</span><span class="o">=</span><span class="s">yes</span>
- <span class="na">ProcessSizeMax</span><span class="o">=</span><span class="s">1G</span>
- <span class="na">ExternalSizeMax</span><span class="o">=</span><span class="s">1G</span>
- <span class="na">JournalSizeMax</span><span class="o">=</span><span class="s">200M</span>
- <span class="na">MaxUse</span><span class="o">=</span><span class="s">5</span>
- <span class="na">KeepFree</span><span class="o">=</span>
- </pre></div>
- </div>
- <p>В данном примере мы задаём максимальный размер одного дампа в 1 ГБ (<strong>ProcessSizeMax</strong> и <strong>ExternalSizeMax</strong>) с ограничением хранения не более 5 (<strong>MaxUse</strong>).</p>
- <p>Изменения вступят в силу при следующей загрузке системы.</p>
- </section>
- <section id="codedump-disable">
- <span id="index-75"></span><span id="id57"></span><h2>Как полностью отключить сохранение дампов памяти?<a class="headerlink" href="#codedump-disable" title="Permalink to this heading">¶</a></h2>
- <p>Откроем файл конфигурации <a class="reference internal" href="#codedump-info"><span class="std std-ref">systemd-coredump</span></a>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudoedit /etc/systemd/coredump.conf
- </pre></div>
- </div>
- <p>Уберём символ комментария <strong>#</strong> лишь перед первой строкой и изменим её значение:</p>
- <div class="highlight-ini notranslate"><div class="highlight"><pre><span></span><span class="k">[Coredump]</span>
- <span class="na">Storage</span><span class="o">=</span><span class="s">none</span>
- </pre></div>
- </div>
- <p>Изменения вступят в силу при следующей загрузке системы.</p>
- </section>
- <section id="kernel-postinstall">
- <span id="index-76"></span><span id="id58"></span><h2>Как настроить автоматическое выполнение скрипта после установки нового ядра?<a class="headerlink" href="#kernel-postinstall" title="Permalink to this heading">¶</a></h2>
- <p>Для того, чтобы выполнять какой-либо shell-скрипт сразу после окончания установки ядра Linux, поместим его в каталог <code class="docutils literal notranslate"><span class="pre">/etc/kernel/install.d</span></code> с chmod <strong>0755</strong> и расширением <strong>.install</strong>.</p>
- <p>Скрипты из него всегда выполняются в алфавитном порядке, т.е. <strong>00-foo.install</strong> запустится раньше, чем <strong>zz-bar.install</strong>, поэтому данную особенность можно использовать для изменения порядка их запуска.</p>
- <p>Каждому скрипту в качестве параметра передаётся версия установленного ядра, которую можно получить через <code class="docutils literal notranslate"><span class="pre">${1}</span></code>.</p>
- </section>
- <section id="modprobe">
- <span id="modprobe-sberr"></span><span id="index-77"></span><h2>При загрузке модуля ядра через modprobe я получаю ошибку. Как исправить?<a class="headerlink" href="#modprobe" title="Permalink to this heading">¶</a></h2>
- <p>Если при попытке загрузки модуля ядра при помощи modprobe с правами суперпользователя воникает ошибка <em>modprobe: ERROR: could not insert „XXXXXXX“: Operation not permitted</em>, значит включён режим <a class="reference internal" href="installation.html#secure-boot"><span class="std std-ref">UEFI Secure Boot</span></a>, а данный модуль не имеет цифровой подписи.</p>
- <p>Необходимо либо отключить Secure Boot в настройках UEFI компьютера, либо подписать его действительной цифровой подписью.</p>
- </section>
- <section id="systemd-boot">
- <span id="index-78"></span><span id="id59"></span><h2>Как настроить загрузку системы при помощи systemd-boot?<a class="headerlink" href="#systemd-boot" title="Permalink to this heading">¶</a></h2>
- <p>См. <a class="reference external" href="https://www.easycoding.org/2019/06/27/zagruzhaem-fedora-pri-pomoshhi-systemd-boot.html">здесь</a>.</p>
- </section>
- <section id="port-bind-priv">
- <span id="index-79"></span><span id="id60"></span><h2>Почему моё приложение не может использовать порт ниже 1024?<a class="headerlink" href="#port-bind-priv" title="Permalink to this heading">¶</a></h2>
- <p>Диапазон портов 1-1023 зарезервирован для суперпользователя, а также приложений, наделённых его правами.</p>
- <p>Стандартная схема использования: сервис запускается с правами root, начинает прослушивать необходимый ему порт, а затем <a class="reference internal" href="#euid-vs-ruid"><span class="std std-ref">сбрасывает</span></a> повышенные права. Так поступают большинство популярных серверных приложений (apache, nginx и т.д.).</p>
- <p>Существует и альтернативный вариант – запуск при помощи <a class="reference internal" href="#port-bind-systemd"><span class="std std-ref">особого юнита systemd</span></a>.</p>
- </section>
- <section id="port-bind-systemd">
- <span id="index-80"></span><span id="id61"></span><h2>Как запустить приложение на порту ниже 1024 при помощи systemd?<a class="headerlink" href="#port-bind-systemd" title="Permalink to this heading">¶</a></h2>
- <p>Добавим в <a class="reference internal" href="#systemd-info"><span class="std std-ref">systemd-юнит</span></a> <code class="docutils literal notranslate"><span class="pre">foo-bar.service</span></code> запрос привилегии <code class="docutils literal notranslate"><span class="pre">CAP_NET_BIND_SERVICE</span></code>:</p>
- <div class="highlight-ini notranslate"><div class="highlight"><pre><span></span><span class="k">[Unit]</span>
- <span class="na">Description</span><span class="o">=</span><span class="s">Simple application</span>
- <span class="na">After</span><span class="o">=</span><span class="s">network.target</span>
- <span class="k">[Service]</span>
- <span class="na">RestartSec</span><span class="o">=</span><span class="s">10s</span>
- <span class="na">Type</span><span class="o">=</span><span class="s">simple</span>
- <span class="na">User</span><span class="o">=</span><span class="s">user</span>
- <span class="na">Group</span><span class="o">=</span><span class="s">user</span>
- <span class="na">WorkingDirectory</span><span class="o">=</span><span class="s">/home/user/foo-bar</span>
- <span class="na">ExecStart</span><span class="o">=</span><span class="s">/home/user/foo-bar/foo</span>
- <span class="na">Restart</span><span class="o">=</span><span class="s">always</span>
- <span class="na">AmbientCapabilities</span><span class="o">=</span><span class="s">CAP_NET_BIND_SERVICE</span>
- <span class="k">[Install]</span>
- <span class="na">WantedBy</span><span class="o">=</span><span class="s">multi-user.target</span>
- </pre></div>
- </div>
- <p>Теперь приложение сможет занять любой доступный порт, включая находящиеся в диапазоне 1-1023.</p>
- </section>
- <section id="user-group-remove">
- <span id="index-81"></span><span id="id62"></span><h2>Как удалить пользователя из группы?<a class="headerlink" href="#user-group-remove" title="Permalink to this heading">¶</a></h2>
- <p>Удалим пользователя с именем <strong>foo</strong> из группы <strong>bar</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo gpasswd -d foo bar
- </pre></div>
- </div>
- <p>Удалим текущего пользователя из группы <strong>bar</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo gpasswd -d $(whoami) bar
- </pre></div>
- </div>
- </section>
- <section id="fs-data-journal">
- <span id="index-82"></span><span id="id63"></span><h2>Как включить полное журналирование данных на диске?<a class="headerlink" href="#fs-data-journal" title="Permalink to this heading">¶</a></h2>
- <p>Полное журналирование данных поддерживается файловой системой <strong>ext4</strong> и может быть активировано при помощи специального параметра монтирования.</p>
- <p>Откроем файл <code class="docutils literal notranslate"><span class="pre">/etc/fstab</span></code> в текстовом редакторе:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudoedit /etc/fstab
- </pre></div>
- </div>
- <p>Добавим после параметра монтирования по умолчанию <code class="docutils literal notranslate"><span class="pre">defaults</span></code> через запятую <code class="docutils literal notranslate"><span class="pre">data=journal</span></code>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>UUID=XXXXXXX /home ext4 defaults,data=journal 1 2
- </pre></div>
- </div>
- <p>Сохраним изменения в файле и выполним перезагрузку системы.</p>
- </section>
- <section id="fs-journal-adv">
- <span id="index-83"></span><span id="id64"></span><h2>Какие преимущества и недостатки у полного журналирования данных?<a class="headerlink" href="#fs-journal-adv" title="Permalink to this heading">¶</a></h2>
- <p>Преимущества:</p>
- <blockquote>
- <div><ul class="simple">
- <li><p>более высокая надёжность в случае внезапного пропадания подачи электропитания;</p></li>
- <li><p>гарантия сохранности не только структуры файловой системы, но и самих данных.</p></li>
- </ul>
- </div></blockquote>
- <p>Недостатки:</p>
- <blockquote>
- <div><ul class="simple">
- <li><p>двойная запись на диск: сначала данные помещаются в журнал и лишь после этого происходит реальное изменение данных на диске в виде атомарной операции;</p></li>
- <li><p>за счёт двойной записи снижается производительность всех файловых операций записи;</p></li>
- <li><p>для файлового журнала будет зарезервировано 10% от свободного места на диске;</p></li>
- <li><p>более быстрое расходование ресурса записи твёрдотельных накопителей данных.</p></li>
- </ul>
- </div></blockquote>
- </section>
- <section id="fs-reserve-info">
- <span id="index-84"></span><span id="id65"></span><h2>Для каких целей резервируется 5% от свободного места на диске?<a class="headerlink" href="#fs-reserve-info" title="Permalink to this heading">¶</a></h2>
- <p>По умолчанию на каждом разделе с файловой системой ext4 резервируется 5% для нужд суперпользователя.</p>
- </section>
- <section id="fs-reserve-disable">
- <span id="index-85"></span><span id="id66"></span><h2>Как отключить резервирование свободного места на диске?<a class="headerlink" href="#fs-reserve-disable" title="Permalink to this heading">¶</a></h2>
- <p><a class="reference internal" href="#fs-reserve-info"><span class="std std-ref">Резервирование свободного места</span></a> для нужд суперпользователя может быть отключено при создании файловой системы при помощи опционального параметра <code class="docutils literal notranslate"><span class="pre">-m</span> <span class="pre">0</span></code>. Например:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo mkfs -t ext4 -m 0 -L Data /dev/sdX1
- </pre></div>
- </div>
- <p>Для уже существующей файловой системы воспользуемся утилитой <strong>tune2fs</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo tune2fs -m 0 /dev/sdX1
- </pre></div>
- </div>
- <p>Здесь <strong>0</strong> – процентное соотношение зарезервированных блоков к обычным (отсутствуют), а <strong>/dev/sdX1</strong> – раздел диска, на котором будут произведены изменения.</p>
- </section>
- <section id="zswap-fedora">
- <span id="zswap"></span><span id="index-86"></span><h2>Как включить поддержку zswap в Fedora?<a class="headerlink" href="#zswap-fedora" title="Permalink to this heading">¶</a></h2>
- <p>Установим пакет <strong>zswap-cli</strong> для работы с модулем ядра <em>zswap</em>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo dnf install zswap-cli
- </pre></div>
- </div>
- <p>При необходимости внесём правки в файл конфигурации:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudoedit /etc/zswap-cli/zswap-cli.conf
- </pre></div>
- </div>
- <p>Активируем сервис zswap-cli:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo systemctl enable --now zswap-cli.service
- </pre></div>
- </div>
- <p>Изменения вступят в силу немедленно.</p>
- </section>
- <section id="memory-defrag">
- <span id="index-87"></span><span id="id67"></span><h2>Как произвести дефраментацию оперативной памяти?<a class="headerlink" href="#memory-defrag" title="Permalink to this heading">¶</a></h2>
- <p>В современных версиях ядра Linux применяется т.н. <a class="reference external" href="https://www.kernel.org/doc/html/latest/admin-guide/sysctl/vm.html#compaction-proactiveness">проактивная дефрагментация</a> оперативной памяти, однако если требуется осуществить данную процедуру немедленно, выполним:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo bash -c "echo 1 > /proc/sys/vm/compact_memory"
- </pre></div>
- </div>
- </section>
- <section id="zram-default-disable">
- <span id="index-88"></span><span id="id68"></span><h2>Как отключить активированное по умолчанию сжатие оперативной памяти?<a class="headerlink" href="#zram-default-disable" title="Permalink to this heading">¶</a></h2>
- <p>Если в сжатии оперативной памяти <a class="reference internal" href="#memory-compression"><span class="std std-ref">при помощи zram</span></a> нет необходимости, отключим данную функцию простым удалением предоставляющих её пакетов:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo dnf remove zram-generator zram-generator-defaults
- </pre></div>
- </div>
- <p>Перезагрузим систему для вступления изменений в силу:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo systemctl reboot
- </pre></div>
- </div>
- </section>
- <section id="io-scheduler">
- <span id="index-89"></span><span id="id69"></span><h2>Как определить какой планировщик ввода-вывода используется?<a class="headerlink" href="#io-scheduler" title="Permalink to this heading">¶</a></h2>
- <p>Выведем информацию обо всех установленных в системе дисковых накопителях:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>grep . /sys/block/*/queue/scheduler
- </pre></div>
- </div>
- <p>Название активного планировщика на каждом конкретном устройстве указано в квадратных скобках.</p>
- <p>Пример:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>/sys/block/sda/queue/scheduler:mq-deadline kyber [bfq] none
- </pre></div>
- </div>
- <p>Данный вывод означает, что в системе для устройства <code class="docutils literal notranslate"><span class="pre">/dev/sda</span></code> применяется <a class="reference internal" href="tips-and-tricks.html#bfq-scheduler"><span class="std std-ref">BFQ</span></a>.</p>
- </section>
- <section id="return-code-get">
- <span id="index-90"></span><span id="id70"></span><h2>Как получить код завершения последней выполненной команды?<a class="headerlink" href="#return-code-get" title="Permalink to this heading">¶</a></h2>
- <p>Выведем на экран код завершения последней выполненной команды в терминале:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>echo $?
- </pre></div>
- </div>
- </section>
- <section id="uefi-secure-boot">
- <span id="secure-boot-status"></span><span id="index-91"></span><h2>Как определить текущее состояние UEFI Secure Boot?<a class="headerlink" href="#uefi-secure-boot" title="Permalink to this heading">¶</a></h2>
- <p>Установим пакет <strong>mokutil</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo dnf install mokutil
- </pre></div>
- </div>
- <p>Выведем информацию о текущем состоянии <a class="reference internal" href="installation.html#secure-boot"><span class="std std-ref">UEFI Secure Boot</span></a>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo mokutil --sb-state
- </pre></div>
- </div>
- </section>
- <section id="process-tree">
- <span id="index-92"></span><span id="id71"></span><h2>Как построить и вывести дерево процессов?<a class="headerlink" href="#process-tree" title="Permalink to this heading">¶</a></h2>
- <p>Воспользуемся утилитой <strong>ps</strong> для построения и вывода дерева процессов:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>ps -aef --forest
- </pre></div>
- </div>
- </section>
- <section id="btrfs-subvolume">
- <span id="index-93"></span><span id="id72"></span><h2>Как однократно смонтировать BTRFS subvolume?<a class="headerlink" href="#btrfs-subvolume" title="Permalink to this heading">¶</a></h2>
- <p>Создадим каталог для точки монтирования:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo mkdir /media/foo-bar
- </pre></div>
- </div>
- <p>Выполним монтирование подтома <strong>foo-bar</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo mount -t btrfs /dev/sdX2 -o subvol=foo-bar /media/foo-bar
- </pre></div>
- </div>
- <p>По окончании работы произведём размонтирование и удалим ненужный более каталог:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo umount /media/foo-bar
- sudo rmdir /media/foo-bar
- </pre></div>
- </div>
- <p>Здесь <strong>/dev/sdX2</strong> – накопитель с файловой системой <a class="reference internal" href="installation.html#fs-btrfs"><span class="std std-ref">BTRFS</span></a>.</p>
- </section>
- <section id="btrfs-compression">
- <span id="index-94"></span><span id="id73"></span><h2>Как включить сжатие данных на разделе с BTRFS?<a class="headerlink" href="#btrfs-compression" title="Permalink to this heading">¶</a></h2>
- <p><strong>Внимание!</strong> Начиная с Fedora 34 для новых установок уже <a class="reference external" href="https://fedoraproject.org/wiki/Changes/BtrfsTransparentCompression">включено</a> сжатие для разделов с ФС <a class="reference internal" href="installation.html#fs-btrfs"><span class="std std-ref">BTRFS</span></a> алгоритмом <strong>zstd</strong> с уровнем сжатия <strong>1</strong>. Для тех, кто обновляется с предыдущих релизов, сжатие можно включить самостоятельно.</p>
- <p>Файловая система <a class="reference internal" href="installation.html#fs-btrfs"><span class="std std-ref">BTRFS</span></a> поддерживает прозрачное сжатие данных. Допускается выбрать один из трёх доступных алгоритмов: <strong>zstd</strong>, <strong>zlib</strong> или <strong>lzo</strong>. Сжатие включается посредством указания алгоритма и уровня в параметрах монтирования раздела.</p>
- <p>Включим сжатие для корневого раздела. Для этого внесём правки в файл конфигурации <code class="docutils literal notranslate"><span class="pre">/etc/fstab</span></code>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudoedit /etc/fstab
- </pre></div>
- </div>
- <p>В колонке параметров монтирования добавим опцию <code class="docutils literal notranslate"><span class="pre">compress=zstd:1</span></code>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>UUID=XXXXX-XXXXX / btrfs compress=zstd:1,subvol=fedora 0 0
- </pre></div>
- </div>
- <p>Здесь <strong>XXXXX-XXXXX</strong> – <a class="reference internal" href="#get-uuid"><span class="std std-ref">UUID раздела</span></a>.</p>
- <p>Сохраним изменения и произведём перезагрузку системы:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo systemctl reboot
- </pre></div>
- </div>
- <p>С этого момента все записываемые данные будут сжиматься алгоритмом <em>zstd</em>.</p>
- <p>Подробнее о сжатии можно прочитать в <a class="reference external" href="https://btrfs.wiki.kernel.org/index.php/Compression">официальной документации</a> (на английском языке).</p>
- </section>
- <section id="btrfs-compression-analyze">
- <span id="index-95"></span><span id="id74"></span><h2>Как определить эффективность сжатия на разделе с BTRFS?<a class="headerlink" href="#btrfs-compression-analyze" title="Permalink to this heading">¶</a></h2>
- <p>Оценим эффективность сжатия данных на разделе с файловой системой <a class="reference internal" href="installation.html#fs-btrfs"><span class="std std-ref">BTRFS</span></a> при помощи утилиты <strong>compsize</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo compsize -x /
- </pre></div>
- </div>
- </section>
- <section id="udev">
- <span id="udev-rules-reload"></span><span id="index-96"></span><h2>Как применить изменения в правилах udev без перезагрузки?<a class="headerlink" href="#udev" title="Permalink to this heading">¶</a></h2>
- <p>Применим изменения в правилах udev при помощи утилиты <strong>udevadm</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>sudo udevadm control --reload
- </pre></div>
- </div>
- </section>
- <section id="ssh-proxy">
- <span id="index-97"></span><span id="id75"></span><h2>Как однократно подключиться к SSH-серверу через proxy?<a class="headerlink" href="#ssh-proxy" title="Permalink to this heading">¶</a></h2>
- <p>Для подключения к SSH-серверу через proxy, воспользуемся утилитой <strong>nc</strong>, параметры которой передадим при помощи опции <strong>ProxyCommand</strong>:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>ssh -o ProxyCommand='nc -X 5 --proxy-type socks5 --proxy 127.0.0.1:8080 %h %p' user@example.org
- </pre></div>
- </div>
- </section>
- <section id="ssh-proxy-always">
- <span id="index-98"></span><span id="id76"></span><h2>Как настроить подключение к любым SSH-серверам через proxy?<a class="headerlink" href="#ssh-proxy-always" title="Permalink to this heading">¶</a></h2>
- <p>Добавим опцию <strong>ProxyCommand</strong> в файл конфигурации <code class="docutils literal notranslate"><span class="pre">~/.ssh/config</span></code> для постоянного использования с любыми хостами:</p>
- <div class="highlight-text notranslate"><div class="highlight"><pre><span></span>Host *
- ProxyCommand nc -X 5 --proxy-type socks5 --proxy 127.0.0.1:8080 %h %p
- </pre></div>
- </div>
- </section>
- </section>
- </div>
-
- </div>
- </div>
- <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper">
- <div id="searchbox" style="display: none" role="search">
- <h3 id="searchlabel">Быстрый поиск</h3>
- <div class="searchformwrapper">
- <form class="search" action="search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
- <input type="submit" value="Искать" />
- </form>
- </div>
- </div>
- <script>document.getElementById('searchbox').style.display = "block"</script><h3>Навигация</h3>
- <ul class="current">
- <li class="toctree-l1"><a class="reference internal" href="generic-info.html">Основная информация</a></li>
- <li class="toctree-l1"><a class="reference internal" href="installation.html">Установка системы</a></li>
- <li class="toctree-l1"><a class="reference internal" href="package-manager.html">Пакетный менеджер и установка пакетов</a></li>
- <li class="toctree-l1 current"><a class="current reference internal" href="#">Системное администрирование</a><ul>
- <li class="toctree-l2"><a class="reference internal" href="#kernelpm-once">Как однократно передать параметр ядра?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#kernelpm-perm">Как мне задать параметр ядра для постоянного использования?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#kernelpm-remove">Как убрать ненужный более параметр ядра?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#kernelpm-legacy">Как мне задать параметр ядра на устаревшей конфигурации?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#kernelpm-list">Как определить какие параметры ядра заданы в настоящее время?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#kernel-modules-list">Как определить какие модули ядра в настоящее время загружены?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#kernel-modules-help">Как узнать какие опциональные параметры поддерживает конкретный модуль ядра?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#uefi-boot-fedora">Как определить список загружаемых ОС в меню UEFI Boot из Fedora?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#uefi-reorder">Возможно ли изменить порядок загрузки в UEFI Boot из Fedora?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#uefi-add">Как добавить новый пункт меню UEFI Boot из Fedora?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#uefi-remove">Как удалить ненужный пункт меню UEFI Boot из Fedora?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#journal-current">Как мне посмотреть текущий журнал работы системы?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#journal-history">Как мне посмотреть журналы с прошлых загрузок?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#journal-tofile">Как мне выгрузить журнал в файл?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#chroot-liveusb">Как сделать chroot в установленную систему с LiveUSB?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#ups-fedora">Как настроить ИБП (UPS) в Fedora?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#journald-limit">Системные журналы занимают слишком много места. Как их ограничить?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#journald-wipe">Как немедленно очистить все системные журналы?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#systemd">Что такое systemd и как с ним работать?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#drop-fs-caches">Как очистить кэши и буферы всех файловых систем?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#utc-localtime">Как перевести системные часы в UTC или localtime и наоборот?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#fedora-windows">У меня в дуалбуте с Fedora установлена Windows и часы постоянно сбиваются. В чём дело?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#gdm-sddm">У меня в системе используется GDM, но я хочу заменить его на SDDM. Это возможно?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#java">Как мне выбрать версию Java по умолчанию?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#change-hostname">Как изменить имя хоста?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#lvm-liveusb">Как мне проверить ФС в составе LVM с LiveUSB?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#liveusb">Как мне проверить ФС при использовании классических разделов с LiveUSB?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#luks-liveusb">Как мне проверить ФС на зашифрованном LUKS разделе с LiveUSB?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#btrfs">Как восстановить данные с повреждённого раздела с BTRFS?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#deduplication-memory">Возможна ли полная дедупликация оперативной памяти?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#deduplication-disk">Возможна ли полная дедупликация данных на дисках?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#memory-compression">Можно ли включить сжатие оперативной памяти?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#sysctl">Как временно изменить параметр ядра при помощи sysctl?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#sysctl-permanent">Как задать и сохранить параметр ядра при помощи sysctl?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#sysctl-order">В каком порядке загружаются sysctl файлы настроек?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#configure-runlevel">Как переключить запуск системы в текстовый режим и обратно?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#fedora">Как настроить подкачку в файл в Fedora?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#disk-usage">Как узнать, какой процесс осуществляет запись на диск?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#change-label">Как сменить метку раздела?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#uuid">Как получить UUID всех смонтированных разделов?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#change-uuid">Как изменить UUID раздела?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#pid">Как получить PID запущенного процесса?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#kill-sigterm">Как правильно завершить работу процесса?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#kill-sigkill">Как принудительно завершить работу процесса?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#process-zombie">Что такое процесс-зомби?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#process-orphan">Что такое процесс-сирота?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#docker-fedora">Как правильно установить Docker в Fedora?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#kernel-bs">Как определить включена ли определённая опция ядра во время компиляции?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#ksoftirqd">Процесс ksoftirqd съедает все ресурсы системы. Что делать?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#kernel-irq">Как определить какое устройство генерирует огромное количество прерываний?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#irq-manual">Как произвести ручную балансировку прерываний?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#too-many-open-files">При работе приложения возникает ошибка Too many open files. Что делать?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#fd-hard-soft">Как узнать текущий лимит открытых файловых дескрипторов?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#fd-kernel">Как узнать глобальный лимит открытых файловых дескрипторов?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#fd-increase">Как увеличить лимит открытых файловых дескрипторов?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#task-affinity">Как запустить процесс так, чтобы он мог использовать лишь определённые ядра процессора?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#task-priority">Как изменить приоритет процесса?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#effective-uid-real-uid">Чем отличается Effective UID процесса от Real UID?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#copying-data">Как скопировать данные с одного раздела на другой?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#chmod-immutable">Как запретить модификацию файла даже владельцу и суперпользователю?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#chmod-lsattr">Как узнать какие расширенные атрибуты применены для конкретного файла?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#chmod-addonly">Как разрешить лишь дописывать данные в файл?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#ssh">Как создать алиасы для быстрого подключения к SSH серверам?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#fuse">Что такое FUSE?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#kerberos">Как авторизоваться на удалённой системе с использованием Kerberos?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#kerberos-renew">Как обновить Kerberos-тикет?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#delete-inode">В каталоге появился файл с некорректным именем, который не удаётся удалить. Что делать?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#ext4">Нужно ли выполнять дефрагментацию для разделов с ФС ext4?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#defrag-custom">Как выполнить дефрагментацию отдельных файлов на разделе ФС ext4?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#defrag-full">Как выполнить дефрагментацию всего раздела с ФС ext4?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#cpu-cores">Как определить количество доступных процессоров или ядер?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#bash-pipelines">Как перенаправить стандартный ввод-вывод в файлы?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#mount-nopass">Как разрешить монтирование любых дисков без ввода пароля?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#coredump-systemd">Что такое coredump и почему systemd сохраняет их?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#codedump-limit">Как ограничить размер сохраняемых дампов памяти?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#codedump-disable">Как полностью отключить сохранение дампов памяти?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#kernel-postinstall">Как настроить автоматическое выполнение скрипта после установки нового ядра?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#modprobe">При загрузке модуля ядра через modprobe я получаю ошибку. Как исправить?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#systemd-boot">Как настроить загрузку системы при помощи systemd-boot?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#port-bind-priv">Почему моё приложение не может использовать порт ниже 1024?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#port-bind-systemd">Как запустить приложение на порту ниже 1024 при помощи systemd?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#user-group-remove">Как удалить пользователя из группы?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#fs-data-journal">Как включить полное журналирование данных на диске?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#fs-journal-adv">Какие преимущества и недостатки у полного журналирования данных?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#fs-reserve-info">Для каких целей резервируется 5% от свободного места на диске?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#fs-reserve-disable">Как отключить резервирование свободного места на диске?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#zswap-fedora">Как включить поддержку zswap в Fedora?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#memory-defrag">Как произвести дефраментацию оперативной памяти?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#zram-default-disable">Как отключить активированное по умолчанию сжатие оперативной памяти?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#io-scheduler">Как определить какой планировщик ввода-вывода используется?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#return-code-get">Как получить код завершения последней выполненной команды?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#uefi-secure-boot">Как определить текущее состояние UEFI Secure Boot?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#process-tree">Как построить и вывести дерево процессов?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#btrfs-subvolume">Как однократно смонтировать BTRFS subvolume?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#btrfs-compression">Как включить сжатие данных на разделе с BTRFS?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#btrfs-compression-analyze">Как определить эффективность сжатия на разделе с BTRFS?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#udev">Как применить изменения в правилах udev без перезагрузки?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#ssh-proxy">Как однократно подключиться к SSH-серверу через proxy?</a></li>
- <li class="toctree-l2"><a class="reference internal" href="#ssh-proxy-always">Как настроить подключение к любым SSH-серверам через proxy?</a></li>
- </ul>
- </li>
- <li class="toctree-l1"><a class="reference internal" href="networking.html">Сетевое администрирование</a></li>
- <li class="toctree-l1"><a class="reference internal" href="virtualization.html">Виртуализация</a></li>
- <li class="toctree-l1"><a class="reference internal" href="security.html">Безопасность</a></li>
- <li class="toctree-l1"><a class="reference internal" href="using-system.html">Работа в системе</a></li>
- <li class="toctree-l1"><a class="reference internal" href="using-applications.html">Сторонние приложения</a></li>
- <li class="toctree-l1"><a class="reference internal" href="hardware.html">Оборудование</a></li>
- <li class="toctree-l1"><a class="reference internal" href="development.html">Разработка и сборка пакетов</a></li>
- <li class="toctree-l1"><a class="reference internal" href="tips-and-tricks.html">Оптимизация и тонкая настройка</a></li>
- <li class="toctree-l1"><a class="reference internal" href="legal-info.html">Правовая информация</a></li>
- </ul>
- <div class="relations">
- <h3>Related Topics</h3>
- <ul>
- <li><a href="index.html">Documentation overview</a><ul>
- <li>Previous: <a href="package-manager.html" title="предыдущая глава">Пакетный менеджер и установка пакетов</a></li>
- <li>Next: <a href="networking.html" title="следующая глава">Сетевое администрирование</a></li>
- </ul></li>
- </ul>
- </div>
- </div>
- </div>
- <div class="clearer"></div>
- </div>
- <div class="footer">
- ©2018 - 2023, EasyCoding Team and contributors.
-
- </div>
-
- <a href="https://github.com/RussianFedora/FAQ" class="github">
- <img style="position: absolute; top: 0; right: 0; border: 0;" src="_static/forkme_right_green.png" alt="Fork me on GitHub" class="github"/>
- </a>
-
-
- </body>
- </html>
|