From 84d29450919cb4c4d41e2dd210200be10cc91103 Mon Sep 17 00:00:00 2001 From: StackKorora <42156355+StackKorora@users.noreply.github.com> Date: Tue, 27 May 2025 09:38:16 -0500 Subject: [PATCH 001/164] Unbound issue on EL10 (#2713) * Update unbound_recursive_dns.md Update english * Update unbound_recursive_dns.fr.md Update French * Update unbound_recursive_dns.de.md Update German * Update unbound_recursive_dns.uk.md Update Ukraine * Update unbound_recursive_dns.de.md revert change on translated file * Update unbound_recursive_dns.fr.md revert change on translated file (French) * Update unbound_recursive_dns.uk.md revert change on translated file (Ukrainian) --------- Co-authored-by: sspencerwire --- docs/guides/dns/unbound_recursive_dns.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/guides/dns/unbound_recursive_dns.md b/docs/guides/dns/unbound_recursive_dns.md index 5039ee770e..8fbef80ddc 100644 --- a/docs/guides/dns/unbound_recursive_dns.md +++ b/docs/guides/dns/unbound_recursive_dns.md @@ -52,6 +52,7 @@ server: interface: :: access-control: 192.168.0.0/16 allow access-control: 2001:db8::/64 allow + chroot: "" forward-zone: name: "." From e3a28d427b3d3a51b2f68d3925e2aa87daff0ff6 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Wed, 28 May 2025 09:27:33 -0400 Subject: [PATCH 002/164] New Crowdin updates (#2714) * New translations unbound_recursive_dns.md (French) * New translations unbound_recursive_dns.md (German) --- docs/guides/dns/unbound_recursive_dns.de.md | 1 + docs/guides/dns/unbound_recursive_dns.fr.md | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/guides/dns/unbound_recursive_dns.de.md b/docs/guides/dns/unbound_recursive_dns.de.md index 3028ed62a7..360b95e60e 100644 --- a/docs/guides/dns/unbound_recursive_dns.de.md +++ b/docs/guides/dns/unbound_recursive_dns.de.md @@ -52,6 +52,7 @@ server: interface: :: access-control: 192.168.0.0/16 allow access-control: 2001:db8::/64 allow + chroot: "" forward-zone: name: "." diff --git a/docs/guides/dns/unbound_recursive_dns.fr.md b/docs/guides/dns/unbound_recursive_dns.fr.md index 86bf6356f1..bc02950330 100644 --- a/docs/guides/dns/unbound_recursive_dns.fr.md +++ b/docs/guides/dns/unbound_recursive_dns.fr.md @@ -52,6 +52,7 @@ server: interface: :: access-control: 192.168.0.0/16 allow access-control: 2001:db8::/64 allow + chroot: "" forward-zone: name: "." From 610655ffce1bb3a228422a07a01ce30818bfa7fb Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Wed, 28 May 2025 09:18:55 -0500 Subject: [PATCH 003/164] Update `test_cpu_compat.md` for RL 10 (#2716) --- docs/gemstones/test_cpu_compat.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/gemstones/test_cpu_compat.md b/docs/gemstones/test_cpu_compat.md index 57fae74fd6..8fb855f76b 100644 --- a/docs/gemstones/test_cpu_compat.md +++ b/docs/gemstones/test_cpu_compat.md @@ -8,7 +8,7 @@ tags: # Introduction -Since the release of Rocky Linux 9, some installations on x86-64 platforms have failed with a kernel panic. In most cases, ==this is due to the CPU's incompatibility== with Rocky Linux 9. This procedure will verify CPU compatibility before installation. +Since the release of Rocky Linux 9, some installations on x86-64 platforms have failed with a kernel panic. In most cases, ==this is due to the CPU's incompatibility== with Rocky Linux 9. This procedure will verify CPU compatibility before installation. **Update:** This procedure now also reflects the minimum processor compatibility for Rocky Linux 10. ## Testing @@ -32,4 +32,4 @@ Since the release of Rocky Linux 9, some installations on x86-64 platforms have x86-64-v2 (supported, searched) ``` - This output indicates the minimum required x86-64 version (v2). Installation can continue in this case. If "(supported, searched)" is missing next to the "x86-64-v2" entry, then your CPU is **not** compatible with Rocky Linux 9.x. If the test shows that your installation can continue and it also shows x86-64-v3 and x86-64-v4 as "(supported, searched)", your CPU is well supported for 9.x and future versions. + This output indicates the minimum required x86-64 version (v2). Installation can continue in this case. If "(supported, searched)" is missing next to the "x86-64-v2" entry, then your CPU is **not** compatible with Rocky Linux 9.x. If the test shows that your installation can continue and it also shows x86-64-v3 (required for Rocky Linux 10) and x86-64-v4 as "(supported, searched)", your CPU is well supported for 9.x and future versions. From 3b93ff1e9c234b530c70382826213d20db6d3c59 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Thu, 29 May 2025 15:42:09 -0400 Subject: [PATCH 004/164] New translations unbound_recursive_dns.md (Ukrainian) (#2718) --- docs/guides/dns/unbound_recursive_dns.uk.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/guides/dns/unbound_recursive_dns.uk.md b/docs/guides/dns/unbound_recursive_dns.uk.md index d1c58cf298..c1588e91e8 100644 --- a/docs/guides/dns/unbound_recursive_dns.uk.md +++ b/docs/guides/dns/unbound_recursive_dns.uk.md @@ -52,6 +52,7 @@ server: interface: :: access-control: 192.168.0.0/16 allow access-control: 2001:db8::/64 allow + chroot: "" forward-zone: name: "." From 24da1c06980a5145c7b1eb6c50f14b8011f458f1 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 2 Jun 2025 10:27:28 -0400 Subject: [PATCH 005/164] New Crowdin updates (#2722) * New translations 11-tasks.md (Ukrainian) * New translations test_cpu_compat.md (Ukrainian) * New translations install_nvim.md (Italian) --- docs/books/admin_guide/11-tasks.uk.md | 10 +++++----- docs/books/nvchad/install_nvim.it.md | 2 +- docs/gemstones/test_cpu_compat.uk.md | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/books/admin_guide/11-tasks.uk.md b/docs/books/admin_guide/11-tasks.uk.md index 3b6161f9de..c6e8819f00 100644 --- a/docs/books/admin_guide/11-tasks.uk.md +++ b/docs/books/admin_guide/11-tasks.uk.md @@ -99,7 +99,7 @@ title: Управління задачами Якщо він порожній, усі користувачі можуть використовувати `cron`. -За замовчуванням `/etc/cron.deny` існує та є порожнім, а `/etc/cron.allow` не існує. +За замовчуванням, `/etc/cron.deny` існує та є порожнім, а `/etc/cron.allow` не існує. Коли два файли існують одночасно, система використовує лише вміст `cron.allow` як основу для оцінки та повністю ігнорує існування файлів `cron.deny`. ### Надати дозвіл користувачу @@ -112,20 +112,20 @@ user1 ### Заборонити користувача -Лише **user2** не зможе використовувати `cron`. +Лише **user2** не зможе використовувати `cron`. Зверніть увагу, що файл `/etc/cron.allow` не може існувати. ```bash [root]# vi /etc/cron.deny user2 ``` -`cron.allow` не має бути присутнім. +Якщо той самий користувач існує одночасно у `/etc/cron.deny` та `/etc/cron.allow`, він може використовувати cron як зазвичай. ## Планування задач -Коли користувач планує завдання, у `/var/spool/cron/` створюється файл із його іменем. +Коли користувач планує завдання, у директорії `/var/spool/cron/` створюється файл з його іменем. -Цей файл містить усю інформацію, яку має знати `crond` щодо всіх задач, створених цим користувачем, команд або програм, які потрібно виконати, і часу їх запуску (година, хвилина, день ...). +Цей файл містить усю інформацію, яку має знати `crond` щодо всіх задач, створених цим користувачем, команд або програм, які потрібно виконати, і часу їх запуску (година, хвилина, день ...). Зверніть увагу, що мінімальна одиниця часу, яку може розпізнати `crond`, становить 1 хвилину. Подібні завдання планування існують у СУБД (таких як MySQL), де завдання планування на основі часу називаються "Планувальником подій". Мінімальна одиниця часу, яку він може розпізнати, становить 1 секунда, а завдання планування на основі подій називаються "Тригерами". ![Дерево Cron](images/tasks-001.png) diff --git a/docs/books/nvchad/install_nvim.it.md b/docs/books/nvchad/install_nvim.it.md index d1978bf440..e8bdcb0c99 100644 --- a/docs/books/nvchad/install_nvim.it.md +++ b/docs/books/nvchad/install_nvim.it.md @@ -103,7 +103,7 @@ Come per Vim, Neovim richiede una conoscenza di base dei suoi comandi e delle su Per prima cosa installiamo i pacchetti necessari alla compilazione: ```bash - dnf install ninja-build libtool autoconf automake cmake gcc gcc-c++ make pkgconfig unzip patch gettext curl git + dnf install --enablerepo=crb ninja-build libtool autoconf automake cmake gcc gcc-c++ make pkgconfig unzip patch gettext curl git ``` diff --git a/docs/gemstones/test_cpu_compat.uk.md b/docs/gemstones/test_cpu_compat.uk.md index 5c6376b80d..d6682240d4 100644 --- a/docs/gemstones/test_cpu_compat.uk.md +++ b/docs/gemstones/test_cpu_compat.uk.md @@ -8,7 +8,7 @@ tags: # Вступ -Після випуску Rocky Linux 9 деякі інсталяції на платформах x86-64 зазнали невдачі через паніку ядра. У більшості випадків ==це відбувається через несумісність ЦП== із Rocky Linux 9. Ця процедура перевірить сумісність процесора перед встановленням. +Після випуску Rocky Linux 9 деякі інсталяції на платформах x86-64 зазнали невдачі через паніку ядра. У більшості випадків ==це відбувається через несумісність ЦП== із Rocky Linux 9. Ця процедура перевірить сумісність процесора перед встановленням. **Оновлення:** Ця процедура тепер також відображає мінімальну сумісність процесорів для Rocky Linux 10. ## Тестування @@ -32,4 +32,4 @@ tags: x86-64-v2 (supported, searched) ``` - Цей вихід вказує на мінімальну необхідну версію x86-64 (v2). У цьому випадку встановлення можна продовжити. Якщо біля запису «x86-64-v2» немає «(підтримується, шукається)», це означає, що ваш ЦП **не** сумісний із Rocky Linux 9.x. Якщо тест показує, що інсталяцію можна продовжити, і він також вказує на x86-64-v3 і x86-64-v4 як «(підтримується, шукається)», ваш ЦП добре підтримується для 9.x і майбутніх версій. + Цей вихід вказує на мінімальну необхідну версію x86-64 (v2). У цьому випадку встановлення можна продовжити. Якщо біля запису «x86-64-v2» немає «(підтримується, шукається)», це означає, що ваш ЦП **не** сумісний із Rocky Linux 9.x. Якщо тест показує, що встановлення може продовжитися, а також відображає x86-64-v3 (обов'язкове для Rocky Linux 10) та x86-64-v4 як "(підтримується, знайдено)", ваш процесор добре підтримується для версії 9.x та наступних версій. From cb22452097e1f1ad477c51f6d51e0bbd1a98ee91 Mon Sep 17 00:00:00 2001 From: Ganna Zhyrnova <112796922+gannazhyrnova@users.noreply.github.com> Date: Mon, 2 Jun 2025 17:27:52 +0300 Subject: [PATCH 006/164] test_cpu_compat.md (#2721) Grammar check --- docs/gemstones/test_cpu_compat.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/gemstones/test_cpu_compat.md b/docs/gemstones/test_cpu_compat.md index 8fb855f76b..39a76e7add 100644 --- a/docs/gemstones/test_cpu_compat.md +++ b/docs/gemstones/test_cpu_compat.md @@ -14,7 +14,7 @@ Since the release of Rocky Linux 9, some installations on x86-64 platforms have 1. Obtain a boot image of Rocky Linux 8, Fedora, or others. -2. Boot this live image on the machine where you want the installation of Rocky Linux 9 to be. +2. Boot this live image on the machine where you want to install Rocky Linux 9. 3. After the boot completes, open a terminal window and run this procedure: @@ -32,4 +32,4 @@ Since the release of Rocky Linux 9, some installations on x86-64 platforms have x86-64-v2 (supported, searched) ``` - This output indicates the minimum required x86-64 version (v2). Installation can continue in this case. If "(supported, searched)" is missing next to the "x86-64-v2" entry, then your CPU is **not** compatible with Rocky Linux 9.x. If the test shows that your installation can continue and it also shows x86-64-v3 (required for Rocky Linux 10) and x86-64-v4 as "(supported, searched)", your CPU is well supported for 9.x and future versions. + This output indicates the minimum required x86-64 version (v2). Installation can continue in this case. If "(supported, searched)" is missing next to the "x86-64-v2" entry, then your CPU is **not** compatible with Rocky Linux 9.x. If the test indicates that your installation can proceed and it also lists x86-64-v3 (required for Rocky Linux 10) and x86-64-v4 as "(supported, searched)", your CPU is well-supported for 9.x and future versions. From 9f55fb60bb30d033ba8108e91ae4d35127ddf1ee Mon Sep 17 00:00:00 2001 From: Ganna Zhyrnova <112796922+gannazhyrnova@users.noreply.github.com> Date: Mon, 2 Jun 2025 17:33:27 +0300 Subject: [PATCH 007/164] 11-tasks.md (#2720) Grammar check --- docs/books/admin_guide/11-tasks.md | 32 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/docs/books/admin_guide/11-tasks.md b/docs/books/admin_guide/11-tasks.md index b030c048fc..4496c8cbd9 100644 --- a/docs/books/admin_guide/11-tasks.md +++ b/docs/books/admin_guide/11-tasks.md @@ -4,13 +4,13 @@ title: Task Management # Task Management -In this chapter you will learn how to manage scheduled tasks. +In this chapter, you will learn how to manage scheduled tasks. **** **Objectives**: In this chapter, future Linux administrators will learn how to: -:heavy_check_mark: Linux deals with the tasks scheduling; +:heavy_check_mark: Linux deals with the task scheduling; :heavy_check_mark: restrict the use of **`cron`** to certain users; :heavy_check_mark: schedule tasks. @@ -27,7 +27,7 @@ In this chapter you will learn how to manage scheduled tasks. The scheduling of tasks is managed with the `cron` utility. It allows the periodic execution of tasks. -It is reserved to the administrator for system tasks but can be used by normal users for tasks or scripts that they have access to. To access the `cron` utility, we use: `crontab`. +It is reserved for administrators to perform system tasks, but can also be used by normal users for tasks or scripts that they have access to. To access the `cron` utility, we use: `crontab`. The `cron` service is used for: @@ -44,7 +44,7 @@ The `cron` service is used for: ## How the service works -The `cron` service is run by a `crond` daemon present in memory. +A `crond` daemon present runs the `cron` service in memory. To check its status: @@ -56,7 +56,7 @@ To check its status: If the `crond` daemon is not running, you will have to initialize it manually and/or automatically at startup. Indeed, even if tasks are scheduled, they will not be launched. -Initialization of the `crond` daemon in manual: +Initialization of the `crond` daemon in the manual: ```bash [root]# systemctl {status|start|restart|stop} crond @@ -70,7 +70,7 @@ Initialization of the `crond` daemon at startup: ## Security -In order to implement a schedule, a user must have permission to use the `cron` service. +To implement a schedule, a user must have permission to use the `cron` service. This permission varies according to the information contained in the files below: @@ -123,9 +123,9 @@ If the same user exists in `/etc/cron.deny` and `/etc/cron.allow` at the same ti ## Scheduling tasks -When a user schedules a task, there is a file created with his name under `/var/spool/cron/`. +When a user schedules a task, there is a file created with their name under `/var/spool/cron/`. -This file contains all the information the `crond` needs to know regarding all tasks created by this user, the commands or programs to run, and when to run them (hour, minute, day ...). Note that the minimum time unit that `crond` can recognize is 1 minute. There are similar scheduling tasks in RDBMS (such as MySQL), in which time-based scheduling tasks are called "Event Scheduler", the minimum time unit it can recognize is 1 second, and event based scheduling tasks are called "Triggers". +This file contains all the information the `crond` needs to know regarding tasks created by this user, including the commands or programs to run, and the schedule for running them (hour, minute, day, etc.). Note that the minimum time unit that `crond` can recognize is 1 minute. There are similar scheduling tasks in RDBMS (such as MySQL), where time-based scheduling tasks are referred to as the "Event Scheduler." The minimum time unit it can recognize is 1 second, and event-based scheduling tasks are referred to as "Triggers." ![Cron tree](images/tasks-001.png) @@ -152,11 +152,11 @@ Example: !!! Warning - `crontab` without option deletes the old schedule file and waits for the user to enter new lines. You have to press ctrl + d to exit this editing mode. + `crontab` without options deletes the old schedule file and waits for the user to enter new lines. You have to press ctrl + d to exit this editing mode. - Only `root` can use the `-u user` option to manage another user's schedule file. + Only the `root` can use the `-u user` option to manage another user's schedule file. - The example above allows root to schedule a task for user1. + The example above allows the root to schedule a task for user1. ### Uses of `crontab` @@ -181,7 +181,7 @@ The `crontab` file is structured according to the following rules. * Each line of this file corresponds to a schedule; * Each line has six fields, 5 for the time and 1 for the order; -* Each field is separated by a space or a tab; +* A space or a tab separates each field; * Each line ends with a carriage return; * A `#` at the beginning of the line comments it. @@ -202,9 +202,9 @@ The `crontab` file is structured according to the following rules. !!! Warning - The tasks to be executed must use absolute paths and if possible, use redirects. + The tasks to be executed must use absolute paths, and if possible, use redirects. -In order to simplify the notation for the definition of time, it is advisable to use special symbols. +To simplify the notation for the definition of time, it is advisable to use special symbols. | Wildcards | Description | |---------------|----------------------------------| @@ -221,13 +221,13 @@ Script executed on April 15 at 10:25 am: 25 10 15 04 * /root/scripts/script > /log/… ``` -Run at 11am and then at 4pm every day: +Run at 11 am and then at 4 pm every day: ```bash 00 11,16 * * * /root/scripts/script > /log/… ``` -Run every hour from 11am to 4pm every day: +Run every hour from 11 am to 4 pm every day: ```bash 00 11-16 * * * /root/scripts/script > /log/… From b997d94f1a09e2e7f7ca946ef7454d1be8baccaf Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Tue, 3 Jun 2025 16:35:21 -0500 Subject: [PATCH 008/164] Redo WIP for 9.6 (#2717) * Redo WIP for 9.6 * remove "Current" from 9.5 * format fix * ZFS known issue in 9.6 * Remove Anaconda known issue from 9.5 * Add SELinux known issue * Update docs/release_notes/9_6.md Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update docs/release_notes/9_6.md WSL image Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update 9_6.md Slight rewording of WSL image content * Update the `.pages` file for the release --------- Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> --- docs/release_notes/.pages | 3 +- docs/release_notes/9_5.md | 2 +- docs/release_notes/9_6.md | 121 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 docs/release_notes/9_6.md diff --git a/docs/release_notes/.pages b/docs/release_notes/.pages index 97f0b3f176..f391a06551 100644 --- a/docs/release_notes/.pages +++ b/docs/release_notes/.pages @@ -1,8 +1,9 @@ --- nav: - ... | index*.md - - ... | 9_5*.md + - ... | 9_6*.md - ... | 8_10*.md + - ... | 9_5*.md - ... | 9_4*.md - ... | 9_3*.md - ... | 8_9*.md diff --git a/docs/release_notes/9_5.md b/docs/release_notes/9_5.md index 6997d8f0c9..19a9bb9bb1 100644 --- a/docs/release_notes/9_5.md +++ b/docs/release_notes/9_5.md @@ -1,5 +1,5 @@ --- -title: Current Release 9.5 +title: Release 9.5 tags: - 9.5 - 9.5 release diff --git a/docs/release_notes/9_6.md b/docs/release_notes/9_6.md new file mode 100644 index 0000000000..eeecc54682 --- /dev/null +++ b/docs/release_notes/9_6.md @@ -0,0 +1,121 @@ +--- +title: Current Release 9.6 +tags: +- 9.6 +- 9.6 release +- Rocky 9.6 +--- + +## Release notes for Rocky Linux 9.6 + +You can find a complete list of most changes in the [upstream release notes found here](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/index). + +## Upgrading + +You can upgrade from Rocky Linux 9.x to Rocky Linux 9.6 by running `sudo dnf -y upgrade`. + +!!! Note + + Rocky Linux does not offer an upgrade path from any version of Rocky Linux 8. We recommend doing a fresh OS install to move to Rocky Linux 9.6. + +## Images + +Several images are available along with the normal install images, including cloud and container platforms. + +You can find more on the artifacts produced by the Cloud Special Interest Group, and information on how to get involved on the [SIG/Cloud Wiki page](https://sig-cloud.rocky.page/). + +### Image build workflow and process + +With the release of Rocky Linux 9.6, the process of building and delivering our images continues to improve. KIWI, a modern image-building tool that allows for a more consistent and maintainable workflow, created most of the images for this release. + +Images still built using ImageFactory include Vagrant (Libvirt, VirtualBox, and VMware) and OCP-Base (Oracle Cloud Platform). All other Cloud and Container images are now built with KIWI. This transition enables us to publish updates more frequently across supported platforms while maintaining feature parity with prior releases. + +If you encounter issues or differences in behavior, please report them, we aim to resolve or explain any unexpected changes quickly. + +### New WSL image + +The introduction of a new WSL image, in addition to the KIWI upgrades, is also here! +This makes it possible to use the normal OOBE experience, which store provided images have: + +- download the image: [x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-WSL-Base.latest.x86_64.wsl) or [aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-WSL-Base.latest.aarch64.wsl) +- to install run `wsl --install --from-file path/to/file.wsl rocky-wsl-base` or just double-click the wsl file +- the first time the wsl image starts it will ask you to specify a username + +Find further details in the [documentation page](https://docs.rockylinux.org/guides/interoperability/import_rocky_to_wsl/). + +## Installing + +Prior to installing, [ensure compatibility of your CPU with this procedure!](https://docs.rockylinux.org/gemstones/test_cpu_compat/) + +To install Rocky Linux 9.6, head to the [download page](https://rockylinux.org/download/) and download the version you need for your architecture. + +!!! info "User's added at install now have administrative privileges by default" + + Unlike earlier versions of Rocky Linux, when you install a user during install, this user now has administrative privileges by default unless you uncheck the option. + +## The Rocky team release highlights + +### New and notable + +## Major changes + +For a complete list of major changes, see the [upstream listing here](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/overview#overview-major-changes). + +Highlights and new features from this release are detailed next. + +### Security + +Listed below are security-related highlights in the latest Rocky Linux 9.6 release. For a complete list of security-related changes, see the [upstream link here](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-security): + +- **SELinux** now provides additional policy rules that confine, `iio-sensor-proxy`, `power-profiles-daemon`, `switcheroo-control`, and `samba-bgqd`. + +### Dynamic programming languages, web, and database servers + +For a detailed list of the changes in this category see the [upstream link here](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-dynamic-programming-languages-web-and-database-servers). + +Later versions of the following module streams are now available: + +- **PHP 8.3**, and **PHP 8.4** module streams +- **MySQL 8.4** module stream +- **nginx 1.26** module stream + +### Compilers and development tools + +For details on the changes in this category [see the upstream link here](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-compilers-and-development-tools) + +Updated performance tools and debuggers: + +- **Valgrind 3.24.0** +- **SystemTap 5.2** +- **elfutils 0.192** +- **libabigail 2.6** + +Updated performance monitoring tools: + +- **PCP 6.3.2** + +Updated compiler toolsets: + +- **LLVM Toolset 19.17** +- **Rust Toolset 1.84.1** +- **Go Toolset 1.23** + +## Known issues + +### ZFS current module will not load in 9.6 + +The currently released `zfs` module from OpenZFS **will not load** on Rocky Linux 9.6. For those using `zfs` on 9.5 and planning to upgrade to 9.6, you should hold off for now. If you are planning a fresh install of 9.6 and use `zfs` then again, you should wait for the release of the updated module. You can follow the issue [here](https://github.com/openzfs/zfs/issues/17332) and [here](https://github.com/openzfs/zfs/issues/17364). + +### SELinux issue on server, workstation, or virtual hosts systems with `passt` installed + +When using a workstation, server, or virtual host with a `passt` back end installed, the interface will fail to start if SELinux is enabled. See [this upstream issue](https://issues.redhat.com/browse/RHEL-80407) for more information. + +As with any release, there are many known issues. Review the [upstream listing](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/known-issues) for the complete details on these issues. + +!!! info "Deprecated Software" + + Some Application Streams, which are part of the Rocky Linux 9.6 repositories, will not receive any further updates. This is a normal occurrence that happens with nearly every release. Ensure that you are using the latest supported version of software. + +## Reporting bugs + +Please report any bugs you encounter to the [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). We also welcome you to join our community in any way you wish be it on our [Forums](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC on Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailing Lists](https://lists.resf.org), or any other way you wish to participate! From 020e7979ae6a41db1cbd65d524af7b368e9b9871 Mon Sep 17 00:00:00 2001 From: Lukas Magauer <42647570+lumarel@users.noreply.github.com> Date: Tue, 3 Jun 2025 23:36:53 +0200 Subject: [PATCH 009/164] Update WSL documentation to reflect new changes with a special WSL image (#2719) --- .../interoperability/import_rocky_to_wsl.md | 39 ++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/docs/guides/interoperability/import_rocky_to_wsl.md b/docs/guides/interoperability/import_rocky_to_wsl.md index ab321c8057..48d824b852 100644 --- a/docs/guides/interoperability/import_rocky_to_wsl.md +++ b/docs/guides/interoperability/import_rocky_to_wsl.md @@ -1,7 +1,7 @@ --- title: Import Rocky Linux to WSL or WSL2 author: Lukas Magauer -tested_with: 8.6, 9.0 +tested_with: 8.10, 9.6, 10.0 tags: - wsl - wsl2 @@ -22,17 +22,40 @@ The Windows-Subsystem for Linux feature has to be enabled. This is possible with This feature should be available on every supported Windows 10 and 11 version right now. +!!! tip "WSL version" + + Make sure that your WSL version is up to date, as some features only got introduced in a later version, if you are unsure run `wsl --update`. + ## Steps +### Installable WSL images (preferred) + +1. Download the WSL image from the CDN or another mirror closer to you: + + - 9: [x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-WSL-Base.latest.x86_64.wsl) or [aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-WSL-Base.latest.aarch64.wsl) + - 10: [x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-WSL-Base.latest.x86_64.wsl) or [aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-WSL-Base.latest.aarch64.wsl) + +2. There are multiple options how to install a `.wsl` image: + + - Double-click the image and it will be installed with the images default name + - Install the image via command-line: + + ```sh + wsl --install --from-file + ``` + +### Conventional Container images + 1. Get the container rootfs. This is possible in multiple ways: - - **Preferred:** Download the image from the CDN: + - Download the image from the CDN: - 8: [Base x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-UBI.latest.aarch64.tar.xz) - 9: [Base x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-UBI.latest.aarch64.tar.xz) + - 10: [Base x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-UBI.latest.aarch64.tar.xz) - Extract the image from either Docker Hub or Quay.io ([ref.](https://docs.microsoft.com/en-us/windows/wsl/use-custom-distro#export-the-tar-from-a-container)) ```sh - export rockylinux:9 > rocky-9-image.tar + export rockylinux:10 > rocky-10-image.tar ``` 2. (optional) You will have to extract the .tar file from the .tar.xz file if you are using not one of the latest WSL versions @@ -42,13 +65,13 @@ This feature should be available on every supported Windows 10 and 11 version ri - WSL: ```sh - wsl --import + wsl --import --version 1 ``` - WSL 2: ```sh - wsl --import --version 2 + wsl --import --version 2 ``` !!! tip "WSL vs. WSL 2" @@ -61,8 +84,4 @@ This feature should be available on every supported Windows 10 and 11 version ri !!! tip "systemd" - Microsoft finally decided to bring systemd into the WSL. This feature is in the new WSL version from the Microsoft Store. You only need to add `systemd=true` to the `boot` ini section in the `/etc/wsl.conf` file! ([ref.](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/#set-the-systemd-flag-set-in-your-wsl-distro-settings)) - -!!! tip "Microsoft Store" - - Currently there is no image in the Microsoft Store, if you want to help with bringing it to there join the conversation in the Mattermost SIG/Containers channel! There has been [some effort](https://github.com/rocky-linux/WSL-DistroLauncher) a long time ago, which can get picked up again. + The WSL image is systemd enabled out of the box! In case you want to use the container images or build your own one, you will only need to add `systemd=true` to the `boot` ini section in the `/etc/wsl.conf` file! ([ref.](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/#set-the-systemd-flag-set-in-your-wsl-distro-settings)) From e019421a999aacdd4cfd4fd71eebcb6bead9b3e0 Mon Sep 17 00:00:00 2001 From: tomdoyle87 <36793507+tomdoyle87@users.noreply.github.com> Date: Wed, 4 Jun 2025 14:33:16 +0100 Subject: [PATCH 010/164] transmission corrected to transmission-daemon (#2723) --- docs/guides/file_sharing/transmission_daemon.md | 2 +- docs/guides/file_sharing/transmission_daemon.uk.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guides/file_sharing/transmission_daemon.md b/docs/guides/file_sharing/transmission_daemon.md index a68caa7c33..5cb836de18 100644 --- a/docs/guides/file_sharing/transmission_daemon.md +++ b/docs/guides/file_sharing/transmission_daemon.md @@ -26,7 +26,7 @@ dnf install -y epel-release Then install Transmission: ```bash -dnf install -y transmission +dnf install -y transmission-daemon ``` ## First setup diff --git a/docs/guides/file_sharing/transmission_daemon.uk.md b/docs/guides/file_sharing/transmission_daemon.uk.md index b04a13b3cb..5e23b218f6 100644 --- a/docs/guides/file_sharing/transmission_daemon.uk.md +++ b/docs/guides/file_sharing/transmission_daemon.uk.md @@ -26,7 +26,7 @@ dnf install -y epel-release Потім встановіть Transmission: ```bash -dnf install -y transmission +dnf install -y transmission-daemon ``` ## Перше налаштування From e8af3a8003c9fd4f00cc6f0b29692a88622df628 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Wed, 4 Jun 2025 09:33:48 -0400 Subject: [PATCH 011/164] New Crowdin updates (#2724) * New translations 11-tasks.md (Italian) * New translations terminator.md (Italian) * New translations test_cpu_compat.md (Italian) --- docs/books/admin_guide/11-tasks.it.md | 34 +++++------ docs/desktop/tools/terminator.it.md | 81 +++++++++++++++++++++++++++ docs/gemstones/test_cpu_compat.it.md | 6 +- 3 files changed, 101 insertions(+), 20 deletions(-) create mode 100644 docs/desktop/tools/terminator.it.md diff --git a/docs/books/admin_guide/11-tasks.it.md b/docs/books/admin_guide/11-tasks.it.md index b5994bdb62..ad4984d7a7 100644 --- a/docs/books/admin_guide/11-tasks.it.md +++ b/docs/books/admin_guide/11-tasks.it.md @@ -4,13 +4,13 @@ title: Gestione dei compiti # Gestione dei compiti -In questo capitolo imparerai come gestire le attività programmate. +In questo capitolo si spiega come gestire le attività pianificate. **** **Obiettivi** : In questo capitolo, futuri amministratori Linux impareranno come: -:heavy_check_mark: Linux si occupa della pianificazione dei compiti; +:heavy_check_mark: Linux si occupa dello scheduling dei task; :heavy_check_mark: limitare l'uso di **`cron`** a determinati utenti; :heavy_check_mark: pianificare le attività. @@ -27,7 +27,7 @@ In questo capitolo imparerai come gestire le attività programmate. La pianificazione delle attività è gestita con l'utilità `cron`. Essa permette l'esecuzione periodica dei compiti. -È riservata all'amministratore per le attività di sistema ma può essere utilizzata da utenti normali per attività o script a cui hanno accesso. Per accedere all'utilità `cron`, usiamo: `crontab`. +È riservato agli amministratori per eseguire le attività di sistema, ma può essere utilizzato anche dai normali utenti per le attività o gli script a cui hanno accesso. Per accedere all'utilità `cron`, usiamo: `crontab`. Il servizio `cron` è usato per: @@ -44,7 +44,7 @@ Il servizio `cron` è usato per: ## Come funziona il servizio -Il servizio di `cron` è gestito da un demone `crond` presente in memoria. +Un demone `crond` presente esegue il servizio `cron` in memoria. Per verificare il suo stato: @@ -70,7 +70,7 @@ Initializzazione del demone `crond` all'avvio del sistema: ## Sicurezza -Per implementare una pianificazione, un utente deve disporre dell'autorizzazione all'utilizzo del servizio `cron`. +Per implementare una pianificazione, un utente deve avere i permessi per utilizzare il servizio `cron`. Questa autorizzazione varia in base alle informazioni contenute nei file seguenti: @@ -99,7 +99,7 @@ Gli utenti di questo file non sono autorizzati a utilizzare `cron`. Se è vuoto, tutti gli utenti possono usare `cron`. -Per impostazione predefinita, `/etc/cron.deny` esiste ed è vuoto e `/etc/cron.allow` non esiste. +Per impostazione predefinita, `/etc/cron.deny` esiste ed è vuoto e `/etc/cron.allow` non esiste. Quando esistono due file contemporaneamente, il sistema utilizza solo il contenuto di `cron.allow` come base di giudizio e ignora completamente l'esistenza del file `cron.deny.`. ### Consentire ad un utente @@ -112,20 +112,20 @@ user1 ### Proibire ad un utente -Solo **user2** non sarà in grado di usare `cron`. +Solo l'**utente2** non potrà usare `cron`. Si noti che il file `/etc/cron.allow` non deve esistere. ```bash [root]# vi /etc/cron.deny user2 ``` -`cron.allow` non deve essere presente. +Se lo stesso utente esiste contemporaneamente in `/etc/cron.deny` e `/etc/cron.allow`, l'utente può usare cron normalmente. ## Pianificazione delle attività Quando un utente pianifica un'attività, viene creato un file con il suo nome in `/var/spool/cron/`. -Questo file contiene tutte le informazioni che il `crond` deve sapere riguardo a tutte le attività create da questo utente, i comandi o i programmi da eseguire e quando eseguirli (ora, minuto, giorno ...). +Questo file contiene tutte le informazioni che il `crond` deve conoscere sui compiti creati da questo utente, compresi i comandi o i programmi da eseguire e la pianificazione dell'esecuzione (ora, minuto, giorno, ecc.). Si noti che l'unità di tempo minima che `crond` può riconoscere è 1 minuto. Esistono attività di pianificazione simili in RDBMS (come MySQL), dove le attività di pianificazione basate sul tempo sono denominate "Event Scheduler". L'unità di tempo minima che è in grado di riconoscere è 1 secondo e le attività di pianificazione basate su eventi sono denominate "Trigger". ![Cron tree](images/tasks-001.png) @@ -152,11 +152,11 @@ Esempio: !!! Warning "Attenzione" - `crontab` senza opzione elimina il vecchio file di pianificazione e attende che l'utente inserisca nuove righe. Devi premere ctrl + d per uscire da questa modalità di modifica. + `crontab` senza opzioni cancella il vecchio file di pianificazione e attende che l'utente inserisca nuove righe. Per uscire da questa modalità di modifica è necessario premere ctrl + d. - Solo `root` può utilizzare l'opzione `-u utente` per gestire il file di pianificazione di un altro utente. + Solo `root' può usare l'opzione `-u user' per gestire il file di pianificazione di un altro utente. - L'esempio sopra consente a root di pianificare un'attività per l'utente1. + L'esempio precedente consente a root di pianificare un'attività per l'user1. ### Usi di `crontab` @@ -181,7 +181,7 @@ Il file `crontab` è strutturato in base alle seguenti regole. * Ogni riga di questo file corrisponde a una pianificazione; * Ogni linea ha sei campi, 5 per il tempo e 1 per l'ordine; -* Ogni campo è separato da uno spazio o da una tabulazione; +* Uno spazio o una tabulazione separano ogni campo; * Ogni linea termina con un ritorno a capo; * Un `#` all'inizio della linea la commenta. @@ -202,9 +202,9 @@ Il file `crontab` è strutturato in base alle seguenti regole. !!! Warning "Attenzione" - Le attività da eseguire devono utilizzare percorsi assoluti e, se possibile, usare reindirizzamenti. + I task da eseguire devono utilizzare percorsi assoluti e, se possibile, usare i reindirizzamenti. -Al fine di semplificare la notazione per la definizione del tempo, è consigliabile utilizzare simboli speciali. +Per semplificare la notazione della definizione di tempo, è consigliabile utilizzare simboli speciali. | Wildcards | Descrizione | | --------- | ----------------------------------------- | @@ -221,13 +221,13 @@ Script eseguito il 15 Aprile alle 10:25am: 25 10 15 04 * /root/scripts/script > /log/… ``` -Esegui alle 11am e quindi alle 4pm di ogni giorno: +Ogni giorno alle 11.00 e alle 16.00: ```bash 00 11,16 * * * /root/scripts/script > /log/… ``` -Esegui ogni ora dalle 11am alle 4pm di ogni giorno: +Esegui ogni ora dalle 11.00 alle 16.00 tutti i giorni: ```bash 00 11-16 * * * /root/scripts/script > /log/… diff --git a/docs/desktop/tools/terminator.it.md b/docs/desktop/tools/terminator.it.md new file mode 100644 index 0000000000..9453ae97a4 --- /dev/null +++ b/docs/desktop/tools/terminator.it.md @@ -0,0 +1,81 @@ +--- +title: Installazione dell'emulatore di terminale Terminator +author: Andrew Scott +contributors: Steven Spencer, Ganna Zhyrnova +tested with: 9.4 +--- + +## Introduzione + +Terminator è un emulatore di terminale basato su GNOME Terminal che supporta funzioni avanzate come multipli pannelli di terminale, raggruppamento di terminali e salvataggio dei layout preferiti. + +## Prerequisiti + +- Disporre di una workstation o di un server Rocky Linux con un'interfaccia grafica. +- Essere amministrazione con privilegi `sudo`. + +## Installare Terminator + +Terminator si trova nel repository Extra Packages for Enterprise Linux (EPEL), quindi non disponibile in una nuova installazione. Quindi, per prima cosa, dobbiamo aggiungere EPEL a Rocky Linux. + +- Passo 1 (facoltativo): Abilitare il repository CodeReady Builder (CRB) + +```bash +sudo dnf config-manager --set-enabled crb +``` + +Anche se non è strettamente necessario per Terminator, CRB fornisce le dipendenze per alcuni pacchetti di EPEL, che possono essere utili se si intende fare affidamento su quella repository in futuro. + +- Passo 2: Aggiungere il repository EPEL + +```bash +sudo dnf install epel-release -y +``` + +- Fase 3 (facoltativa ma altamente consigliata): Aggiornare il sistema + +```bash +sudo dnf update -y --refresh +``` + +- Passo 4: Installare Terminator + +```bash +sudo dnf install terminator -y +``` + +## Configurazione + +Per impostazione predefinita, Terminator non ha un aspetto molto diverso dal Terminale GNOME predefinito. Sembra ancora più scarno di quello predefinito. + +![Default layout of Terminator](images/terminator-01.png) + +Per iniziare a personalizzare il nuovo terminale, aprire il menu contestuale facendo clic con il tasto destro del mouse su un punto qualsiasi dello sfondo. + +![Terminator context menu](images/terminator-02.png) + +Da questo menu è possibile splittare la finestra, attivare nuove schede e cambiare layout. Il sottomenu Preferenze permette anche di personalizzare il tema. Vale la pena di prendere un po' di tempo per familiarizzare con le opzioni disponibili, poiché ci sono molte impostazioni che esulano dallo scopo di questa guida. + +Sono inoltre disponibili diverse combinazioni di tasti per coloro che preferiscono non spostare la mano avanti e indietro tra la tastiera e il mouse. Ad esempio, ++shift+ctrl+“O ”++ dividerà la finestra orizzontalmente in molti terminali. Sono inoltre supportati il frazionamento della finestra più volte e il riordino tramite trascinamento. + +![Terminator window with 3 split terminals](images/terminator-03.png) + +Infine, può essere utile impostare una scorciatoia da tastiera per aprire il nuovo terminale. Per farlo, si può iniziare aprendo il menu Impostazioni. È possibile accedere al menu in diversi modi; per questa guida, si farà clic con il tasto destro del mouse sul desktop e con il tasto sinistro del mouse su “Impostazioni”. + +![Desktop context menu with "Settings" highlighted](images/terminator-04.png) + +Da qui, utilizzare il menu di sinistra per spostarsi nella sezione “Keyboard”, quindi fare clic su “Customize Shortcuts” in basso. + +![GNOME Settings Keyboard Menu](images/terminator-05.png) + +Se è la prima volta che si imposta un collegamento personalizzato, si vedrà un pulsante intitolato "Add Shortcut". Altrimenti, verrà visualizzato un elenco di collegamenti con un segno più in basso. Fare clic su quello che si applica alla propria situazione per aprire la finestra di dialogo "Add Custom Shortcut". Nel campo _Name_, digitare un soprannome facile da ricordare per la scorciatoia. Nel campo _Command_, digitate il nome del nostro programma: `terminator`. Quindi fare clic su "Set Shortcut" per impostare la nuova combinazione di tasti. + +![Add Custom Shortcut dialog](images/terminator-06.png) + +Sebbene ++ctrl+alt+"T "++ sia una scelta tradizionale, potete scegliere la combinazione che preferite. È sempre possibile aggiornare il nome del collegamento e la combinazione di tasti in un secondo momento. Per salvare il collegamento, fare clic su "Add" in alto a destra nella finestra di dialogo Aggiungi collegamento personalizzato. + +![Add Custom Shortcut dialog completed for Terminator](images/terminator-07.png) + +## Conclusione + +Terminator è un potente emulatore di terminale per utenti normali ed esperti. Questi esempi rappresentano solo una piccola parte delle capacità di Terminator. Sebbene questa guida fornisca una panoramica dei passaggi di installazione per Rocky Linux, si consiglia di esaminare la [documentazione](https://gnome-terminator.readthedocs.io/en/latest/) per una spiegazione completa delle caratteristiche di Terminator. diff --git a/docs/gemstones/test_cpu_compat.it.md b/docs/gemstones/test_cpu_compat.it.md index fd38c7b486..b9d116863c 100644 --- a/docs/gemstones/test_cpu_compat.it.md +++ b/docs/gemstones/test_cpu_compat.it.md @@ -8,13 +8,13 @@ tags: # Introduzione -Dal rilascio di Rocky Linux 9, alcune installazioni su piattaforme x86-64 sono fallite con un kernel panic. Nella maggior parte dei casi, ==questo è dovuto all'incompatibilità della CPU== con Rocky Linux 9. Questa procedura consente di verificare la compatibilità della CPU prima dell'installazione. +Dal rilascio di Rocky Linux 9, alcune installazioni su piattaforme x86-64 sono fallite con un kernel panic. Nella maggior parte dei casi, ==questo è dovuto all'incompatibilità della CPU== con Rocky Linux 9. Questa procedura consente di verificare la compatibilità della CPU prima dell'installazione. **Aggiornamento:** Questa procedura riflette ora anche la compatibilità minima del processore per Rocky Linux 10. ## Verifica 1. Procurarsi un'immagine di avvio di Rocky Linux 8, Fedora o altri. -2. Avviare l'immagine live sulla macchina dove si desidera installare Rocky Linux 9. +2. Avviare l'immagine live sul computer in cui si vuole installare Rocky Linux 9. 3. Al termine dell'avvio, aprire una finestra del terminale ed eseguire questa operazione: @@ -32,4 +32,4 @@ Dal rilascio di Rocky Linux 9, alcune installazioni su piattaforme x86-64 sono f x86-64-v2 (supported, searched) ``` - Questo output indica la versione minima richiesta per x86-64 (v2). In questo caso, l'installazione può continuare. Se accanto alla voce "x86-64-v2" non compare "(supported, searched)", allora la vostra CPU non è **compatibile** con Rocky Linux 9.x. Se il test mostra che l'installazione può continuare e indica anche x86-64-v3 e x86-64-v4 come "(supported, searched)", significa che la CPU è ben supportata per 9.x e le versioni future. + Questo output indica la versione minima richiesta per x86-64 (v2). In questo caso, l'installazione può continuare. Se accanto alla voce "x86-64-v2" non compare "(supported, searched)", allora la vostra CPU non è **compatibile** con Rocky Linux 9.x. Se il test indica che l'installazione può procedere e indica anche x86-64-v3 (richiesto per Rocky Linux 10) e x86-64-v4 come "(supported, searched)", la vostra CPU è ben supportata per 9.x e le versioni future. From 37c4e989bd0e6aeee2ca9875221c2ccce2589e44 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Wed, 4 Jun 2025 18:47:11 -0400 Subject: [PATCH 012/164] New translations 9_5.md (French) (#2725) --- docs/release_notes/9_5.fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release_notes/9_5.fr.md b/docs/release_notes/9_5.fr.md index 0430aa006a..a2b5fac161 100644 --- a/docs/release_notes/9_5.fr.md +++ b/docs/release_notes/9_5.fr.md @@ -1,5 +1,5 @@ --- -title: Version actuelle 9.5 +title: Version 9.5 tags: - 9.5 - version 9.5 From fb9e8de51e13cee7689e9d6cc7a0134774a41abd Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Thu, 5 Jun 2025 09:47:23 -0500 Subject: [PATCH 013/164] Remove php 8.4 from release notes (#2729) --- docs/release_notes/9_6.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release_notes/9_6.md b/docs/release_notes/9_6.md index eeecc54682..9aec542004 100644 --- a/docs/release_notes/9_6.md +++ b/docs/release_notes/9_6.md @@ -75,7 +75,7 @@ For a detailed list of the changes in this category see the [upstream link here] Later versions of the following module streams are now available: -- **PHP 8.3**, and **PHP 8.4** module streams +- **PHP 8.3** module stream - **MySQL 8.4** module stream - **nginx 1.26** module stream From 71aa5f77773093b6d2cf44067733aaf92c9ca32c Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Thu, 5 Jun 2025 13:53:08 -0500 Subject: [PATCH 014/164] gstreamer known issue (#2730) --- docs/release_notes/9_6.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/docs/release_notes/9_6.md b/docs/release_notes/9_6.md index 9aec542004..54aa374b68 100644 --- a/docs/release_notes/9_6.md +++ b/docs/release_notes/9_6.md @@ -110,6 +110,27 @@ The currently released `zfs` module from OpenZFS **will not load** on Rocky Linu When using a workstation, server, or virtual host with a `passt` back end installed, the interface will fail to start if SELinux is enabled. See [this upstream issue](https://issues.redhat.com/browse/RHEL-80407) for more information. +### Upgrade failure with `gstreamer` packages installed + +If upgrading a system you get a failure: + + ``` + Error: Transaction test error: + file /usr/lib64/gstreamer-1.0/libgstdvbsuboverlay.so from install of gstreamer1-plugins-bad-free-1.22.12-4.el9_6.x86_64 conflicts with file from package gstreamer1-plugins-bad-freeworld-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstsiren.so from install of gstreamer1-plugins-bad-free-1.22.12-4.el9_6.x86_64 conflicts with file from package gstreamer1-plugins-bad-freeworld-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstasf.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstdvdlpcmdec.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstdvdsub.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstrealmedia.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + ``` + +Stop the upgrade and do the following before attempting the upgrade again: + + ``` + sudo dnf swap gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 + sudo dnf swap gstreamer1-plugins-bad-freeworld-1:1.22.1-1.el9.x86_64 gstreamer1-plugins-bad-free-1.22.12-4.el9_6.x86_64 + ``` + As with any release, there are many known issues. Review the [upstream listing](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/known-issues) for the complete details on these issues. !!! info "Deprecated Software" From b1a6fdc2062157a8103904e89116ad805097ee56 Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Thu, 5 Jun 2025 19:25:32 -0500 Subject: [PATCH 015/164] remove new user admonition as incorrect for 9.6 (#2731) --- docs/release_notes/9_6.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/release_notes/9_6.md b/docs/release_notes/9_6.md index 54aa374b68..cd41cb80b3 100644 --- a/docs/release_notes/9_6.md +++ b/docs/release_notes/9_6.md @@ -49,10 +49,6 @@ Prior to installing, [ensure compatibility of your CPU with this procedure!](htt To install Rocky Linux 9.6, head to the [download page](https://rockylinux.org/download/) and download the version you need for your architecture. -!!! info "User's added at install now have administrative privileges by default" - - Unlike earlier versions of Rocky Linux, when you install a user during install, this user now has administrative privileges by default unless you uncheck the option. - ## The Rocky team release highlights ### New and notable From bec9c45fcfe16cfa236a617e9472990bb6be7e5e Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Fri, 6 Jun 2025 11:06:04 -0500 Subject: [PATCH 016/164] Post 9.6 update URL fixes (#2732) * fix kde, xfce, and mate, installation procedures to point to the correct images * remove dead URL in all-contributors (`README.md` and `.all-contributorsrc` --- .all-contributorsrc | 9 --------- README.md | 1 - docs/guides/desktop/kde_installation.md | 6 +++--- docs/guides/desktop/mate_installation.md | 4 ++-- docs/guides/desktop/xfce_installation.md | 2 +- 5 files changed, 6 insertions(+), 16 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2cd29bde27..c2c0201631 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -593,15 +593,6 @@ "content" ] }, - { - "login": "yigitbasalma", - "name": "Yiğit can BAŞALMA", - "avatar_url": "https://avatars.githubusercontent.com/u/12031564?v=4", - "profile": "http://cybertrouble.com", - "contributions": [ - "content" - ] - }, { "login": "markooff", "name": "markooff", diff --git a/README.md b/README.md index da4ae5cf77..33aa6ba174 100644 --- a/README.md +++ b/README.md @@ -283,7 +283,6 @@ Welcome aboard! Meet the rest of our awesome contributors below: ([emoji key](ht Roman Gherta
Roman Gherta

🖋 - Yiğit can BAŞALMA
Yiğit can BAŞALMA

🖋 markooff
markooff

🖋 🌍 Deng Wenbin
Deng Wenbin

🌍 alikates
alikates

🖋 diff --git a/docs/guides/desktop/kde_installation.md b/docs/guides/desktop/kde_installation.md index 371266feac..d65cebe87d 100644 --- a/docs/guides/desktop/kde_installation.md +++ b/docs/guides/desktop/kde_installation.md @@ -14,7 +14,7 @@ Thanks to the Rocky Linux development team, live images for several desktop inst !!! note - This procedure is specific to Rocky Linux 9.0. There is currently no procedure for installing KDE for earlier versions of Rocky Linux. + This procedure is specific to Rocky Linux 9. There is currently no procedure for installing KDE for earlier versions of Rocky Linux. Feel free to write one up! ## Prerequisites @@ -25,7 +25,7 @@ Thanks to the Rocky Linux development team, live images for several desktop inst ## Get, verify, and write the KDE live image -Prior to installation, the first step is to download the live image and write that to a DVD or a USB thumb drive. As stated earlier, the image will be bootable, just like any other installation media for Linux. You can find the latest KDE image in the download section for Rocky Linux 9 [live images](https://dl.rockylinux.org/pub/rocky/9.5/live/x86_64/). +Prior to installation, the first step is to download the live image and write that to a DVD or a USB thumb drive. As stated earlier, the image will be bootable, just like any other installation media for Linux. You can find the latest KDE image in the download section for Rocky Linux 9 [live images](https://dl.rockylinux.org/pub/rocky/9.6/live/x86_64/). Note that this particular link assumes x86_64 as your processor architecture. If you have aarch64 architecture, you can use that image instead. Download the live image and checksum files. @@ -49,7 +49,7 @@ This again is different by machine, BIOS, OS, and so on. You will need to ensure ![kde_boot](images/kde_boot.png) -If so, you are on your way! If you want to test the media, you can enter that option first, or you can enter **S** to **Start Rocky Linux KDE 9.0**. +If so, you are on your way! If you want to test the media, you can enter that option first, or you can enter **S** to **Start Rocky Linux KDE 9**. Remember, this is a live image. It will take some of time to boot to the first screen. Do not panic, just wait! When the live image is up, you will see this screen: diff --git a/docs/guides/desktop/mate_installation.md b/docs/guides/desktop/mate_installation.md index 9953df1ce3..6b0ae22e9b 100644 --- a/docs/guides/desktop/mate_installation.md +++ b/docs/guides/desktop/mate_installation.md @@ -29,13 +29,13 @@ This procedure will get you up and running with MATE on Rocky Linux. ### 9: Get, Verify, and Write the MATE Live Image - Before installation, the first step is to download the live image and write that to a DVD or a USB thumb drive. As stated earlier, the image will be bootable, just like any other installation media for Linux. You can find the latest MATE image in the download section for Rocky Linux 9 [live images](https://dl.rockylinux.org/pub/rocky/9.5/live/x86_64/). Note this particular link assumes x86_64 as your architecture, and as of this writing that is the only architecture live image available. Download the live image and checksum files. + Before installation, the first step is to download the live image and write that to a DVD or a USB thumb drive. As stated earlier, the image will be bootable, just like any other installation media for Linux. You can find the latest MATE image in the download section for Rocky Linux 9 [live images](https://dl.rockylinux.org/pub/rocky/9.6/live/x86_64/). Note this particular link assumes x86_64 as your architecture, and as of this writing that is the only architecture live image available. Download the live image and checksum files. Verify the image with the CHECKSUM file with the following (note this is an example! Ensure your image name and CHECKSUM files match): ``` - sha256sum -c CHECKSUM --ignore-missing Rocky-9.5-MATE-x86_64-20221124.0.iso.CHECKSUM + sha256sum -c CHECKSUM --ignore-missing Rocky-9.6-MATE-x86_64-20250530.3.iso.CHECKSUM ``` If all goes well, you will receive this message: diff --git a/docs/guides/desktop/xfce_installation.md b/docs/guides/desktop/xfce_installation.md index 5501e55365..4b2731ac3c 100644 --- a/docs/guides/desktop/xfce_installation.md +++ b/docs/guides/desktop/xfce_installation.md @@ -28,7 +28,7 @@ It is also one of the most accessible desktop environments to combine with alter ## 9: Get, verify, and write the XFCE live image - Prior to installation, the first step is to download the live image and write that to a DVD or a USB thumb drive. As stated earlier, the image will be bootable, just like any other installation media for Linux. You can find the latest XFCE image in the download section for Rocky Linux 9 [live images](https://dl.rockylinux.org/pub/rocky/9.5/live/x86_64/). Note that this particular link assumes x86_64 is your processor's architecture. + Prior to installation, the first step is to download the live image and write that to a DVD or a USB thumb drive. As stated earlier, the image will be bootable, just like any other installation media for Linux. You can find the latest XFCE image in the download section for Rocky Linux 9 [live images](https://dl.rockylinux.org/pub/rocky/9.6/live/x86_64/). Note that this particular link assumes x86_64 is your processor's architecture. As of this writing, you can use x86_64 or aarch64 architectures for this live image. Download the live image and checksum files. From 7c6c85662a94aad4ab8a7253f8549ecddd572895 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Sat, 7 Jun 2025 11:04:58 -0400 Subject: [PATCH 017/164] New translations 11-tasks.md (Ukrainian) (#2727) --- docs/books/admin_guide/11-tasks.uk.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/books/admin_guide/11-tasks.uk.md b/docs/books/admin_guide/11-tasks.uk.md index c6e8819f00..b96c0fc120 100644 --- a/docs/books/admin_guide/11-tasks.uk.md +++ b/docs/books/admin_guide/11-tasks.uk.md @@ -125,7 +125,7 @@ user2 Коли користувач планує завдання, у директорії `/var/spool/cron/` створюється файл з його іменем. -Цей файл містить усю інформацію, яку має знати `crond` щодо всіх задач, створених цим користувачем, команд або програм, які потрібно виконати, і часу їх запуску (година, хвилина, день ...). Зверніть увагу, що мінімальна одиниця часу, яку може розпізнати `crond`, становить 1 хвилину. Подібні завдання планування існують у СУБД (таких як MySQL), де завдання планування на основі часу називаються "Планувальником подій". Мінімальна одиниця часу, яку він може розпізнати, становить 1 секунда, а завдання планування на основі подій називаються "Тригерами". +Цей файл містить усю інформацію, яку має знати `crond` щодо всіх задач, створених цим користувачем, команд або програм, які потрібно виконати, і часу їх запуску (година, хвилина, день ...). Зверніть увагу, що мінімальна одиниця часу, яку може розпізнати `crond`, становить 1 хвилину. Подібні завдання планування існують у СУБД (таких як MySQL), де завдання планування на основі часу називаються "Планувальником подій". Мінімальна одиниця часу, яку він може розпізнати, становить 1 секунду, а завдання планування на основі подій називаються «тригерами». ![Дерево Cron](images/tasks-001.png) From 18375e3c17d9190d8eed3b998f6cfd5abe5e9999 Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Sat, 7 Jun 2025 11:22:53 -0500 Subject: [PATCH 018/164] Stale links DISA STIG (#2733) * `disa_stig_part1.md` updated * `disa_stig_part3.md` updated --- docs/books/disa_stig/disa_stig_part1.md | 2 +- docs/books/disa_stig/disa_stig_part3.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/books/disa_stig/disa_stig_part1.md b/docs/books/disa_stig/disa_stig_part1.md index 242ba7aa57..f607ae4469 100644 --- a/docs/books/disa_stig/disa_stig_part1.md +++ b/docs/books/disa_stig/disa_stig_part1.md @@ -22,7 +22,7 @@ tags: ## Introduction -In this guide we are going to cover how to apply the [DISA STIG for RHEL8](https://www.stigviewer.com/stig/red_hat_enterprise_linux_8/) for a New Installation of Rocky Linux 8. As multi-part series, we will also be covering how to test STIG compliance, adapt STIG settings, and apply other STIG content in this environment. +In this guide we are going to cover how to apply the [DISA STIG for RHEL8](https://www.stigviewer.com/stigs/red_hat_enterprise_linux_8/) for a New Installation of Rocky Linux 8. As multi-part series, we will also be covering how to test STIG compliance, adapt STIG settings, and apply other STIG content in this environment. Rocky Linux is a bug for bug derivative of RHEL and as such the content published for the DISA RHEL8 STIG is in parity for both operating systems. Even better news, applying STIG settings is built into the Rocky Linux 8 anaconda installer, under Security Profiles. Under the hood this is all powered by a tool called [OpenSCAP](https://www.open-scap.org/), which lets you both configure the system to be compliant with the DISA STIG (fast!), and also test the systems compliance after you’ve installed. diff --git a/docs/books/disa_stig/disa_stig_part3.md b/docs/books/disa_stig/disa_stig_part3.md index ad6ac7063a..546c348538 100644 --- a/docs/books/disa_stig/disa_stig_part3.md +++ b/docs/books/disa_stig/disa_stig_part3.md @@ -12,7 +12,7 @@ tags: # Introduction -In part 1 of this series, we covered how to build our web server with the base RHEL8 DISA STIG applied, and in part 2, we learned how to test the STIG compliance with the OpenSCAP tool. Now we’re going to do something with the system, build a simple web application and apply the DISA web server STIG: +In part 1 of this series, we covered how to build our web server with the base RHEL8 DISA STIG applied, and in part 2, we learned how to test the STIG compliance with the OpenSCAP tool. Now we’re going to do something with the system, build a simple web application and apply the DISA web server STIG: First lets compare what we’re getting into here, the RHEL 8 DISA STIG is targeted at a very specific platform so the controls are pretty easy to understand in that context, test, and apply. Application STIGs have to be portable across multiple platforms, so the content here is generic to work on different Linux distributions (RHEL, Ubuntu, SuSE, etc)**. Tools like OpenSCAP won’t help us audit/remediate the configuration. We’re going to have to do this manually. Those STIGs are: From 918b9fdaa72dad4aae896de9e84802c52ce6e9d8 Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Sat, 7 Jun 2025 11:33:12 -0500 Subject: [PATCH 019/164] Updated with wrong URL head (#2734) * should have been https://stigviewer.com/.. without the www --- docs/books/disa_stig/disa_stig_part1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/books/disa_stig/disa_stig_part1.md b/docs/books/disa_stig/disa_stig_part1.md index f607ae4469..e086657efe 100644 --- a/docs/books/disa_stig/disa_stig_part1.md +++ b/docs/books/disa_stig/disa_stig_part1.md @@ -22,7 +22,7 @@ tags: ## Introduction -In this guide we are going to cover how to apply the [DISA STIG for RHEL8](https://www.stigviewer.com/stigs/red_hat_enterprise_linux_8/) for a New Installation of Rocky Linux 8. As multi-part series, we will also be covering how to test STIG compliance, adapt STIG settings, and apply other STIG content in this environment. +In this guide we are going to cover how to apply the [DISA STIG for RHEL8](https://stigviewer.com/stigs/red_hat_enterprise_linux_8) for a New Installation of Rocky Linux 8. As multi-part series, we will also be covering how to test STIG compliance, adapt STIG settings, and apply other STIG content in this environment. Rocky Linux is a bug for bug derivative of RHEL and as such the content published for the DISA RHEL8 STIG is in parity for both operating systems. Even better news, applying STIG settings is built into the Rocky Linux 8 anaconda installer, under Security Profiles. Under the hood this is all powered by a tool called [OpenSCAP](https://www.open-scap.org/), which lets you both configure the system to be compliant with the DISA STIG (fast!), and also test the systems compliance after you’ve installed. From c4a3a9e0dffe896a07cb4055c5edc365a96afe67 Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Sun, 8 Jun 2025 13:36:41 -0500 Subject: [PATCH 020/164] 9_6 release WSL image wording (#2737) * change OOBE to out-of-box experience --- docs/release_notes/9_6.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release_notes/9_6.md b/docs/release_notes/9_6.md index cd41cb80b3..ccd0582c46 100644 --- a/docs/release_notes/9_6.md +++ b/docs/release_notes/9_6.md @@ -35,7 +35,7 @@ If you encounter issues or differences in behavior, please report them, we aim t ### New WSL image The introduction of a new WSL image, in addition to the KIWI upgrades, is also here! -This makes it possible to use the normal OOBE experience, which store provided images have: +This makes it possible to use the normal out-of-box experience, which store provided images have: - download the image: [x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-WSL-Base.latest.x86_64.wsl) or [aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-WSL-Base.latest.aarch64.wsl) - to install run `wsl --install --from-file path/to/file.wsl rocky-wsl-base` or just double-click the wsl file From 33e19416c944cd5d02fd886cf21f2b43703bafce Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Sun, 8 Jun 2025 15:58:25 -0400 Subject: [PATCH 021/164] New Crowdin updates (#2736) * New translations 9_5.md (Chinese Simplified) * New translations 8_9.md (Chinese Simplified) --- docs/release_notes/8_9.zh.md | 2 +- docs/release_notes/9_5.zh.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/release_notes/8_9.zh.md b/docs/release_notes/8_9.zh.md index 642b3b950e..f8a5210300 100644 --- a/docs/release_notes/8_9.zh.md +++ b/docs/release_notes/8_9.zh.md @@ -1,5 +1,5 @@ --- -title: 当前发布 8.9 版本 +title: 发布 8.9 版本 tags: - 8.9 - 8.9 release diff --git a/docs/release_notes/9_5.zh.md b/docs/release_notes/9_5.zh.md index a745b19796..d7b6d4578c 100644 --- a/docs/release_notes/9_5.zh.md +++ b/docs/release_notes/9_5.zh.md @@ -1,5 +1,5 @@ --- -title: 当前发布 9.5 版本 +title: 发布 9.5 版本 tags: - 9.5 - 9.5 release From c52d768740e5ae095ddb58f53bac8a6b8afbe124 Mon Sep 17 00:00:00 2001 From: Ganna Zhyrnova <112796922+gannazhyrnova@users.noreply.github.com> Date: Mon, 9 Jun 2025 17:20:04 +0300 Subject: [PATCH 022/164] import_rocky_to_wsl.md (#2739) Grammar check --- .../interoperability/import_rocky_to_wsl.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/guides/interoperability/import_rocky_to_wsl.md b/docs/guides/interoperability/import_rocky_to_wsl.md index 48d824b852..7936d7f71f 100644 --- a/docs/guides/interoperability/import_rocky_to_wsl.md +++ b/docs/guides/interoperability/import_rocky_to_wsl.md @@ -20,11 +20,11 @@ The Windows-Subsystem for Linux feature has to be enabled. This is possible with run `wsl --install` ([ref.](https://docs.microsoft.com/en-us/windows/wsl/install)) - Go to the graphical Windows Settings and enable the optional feature `Windows-Subsystem for Linux` -This feature should be available on every supported Windows 10 and 11 version right now. +This feature should be available on every supported version of Windows 10 and 11 currently. !!! tip "WSL version" - Make sure that your WSL version is up to date, as some features only got introduced in a later version, if you are unsure run `wsl --update`. + Ensure that your WSL version is up to date, as some features were only introduced in later versions. If you are unsure, run `wsl --update`. ## Steps @@ -35,10 +35,10 @@ This feature should be available on every supported Windows 10 and 11 version ri - 9: [x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-WSL-Base.latest.x86_64.wsl) or [aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-WSL-Base.latest.aarch64.wsl) - 10: [x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-WSL-Base.latest.x86_64.wsl) or [aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-WSL-Base.latest.aarch64.wsl) -2. There are multiple options how to install a `.wsl` image: +2. There are multiple options for installing a `.wsl` image: - Double-click the image and it will be installed with the images default name - - Install the image via command-line: + - Install the image via command line: ```sh wsl --install --from-file @@ -58,8 +58,8 @@ This feature should be available on every supported Windows 10 and 11 version ri export rockylinux:10 > rocky-10-image.tar ``` -2. (optional) You will have to extract the .tar file from the .tar.xz file if you are using not one of the latest WSL versions -3. Create the directory where the WSL will store its files (mostly somewhere in the userprofile) +2. (optional) You will have to extract the .tar file from the .tar.xz file if you are using one of the latest WSL versions +3. Create the directory where the WSL will store its files (mostly somewhere in the user profile) 4. Finally, import the image into WSL ([ref.](https://docs.microsoft.com/en-us/windows/wsl/use-custom-distro#import-the-tar-file-into-wsl)): - WSL: @@ -76,12 +76,12 @@ This feature should be available on every supported Windows 10 and 11 version ri !!! tip "WSL vs. WSL 2" - Generally speaking WSL 2 should be faster than WSL, but that might differ from use-case to use-case. + Generally speaking, WSL 2 should be faster than WSL, although this may vary depending on the use case. !!! tip "Windows Terminal" - If you have Windows Terminal installed, the new WSL distro name will appear as an option on the pull-down menu, which is quite handy for launching in the future. You can then customize it with colors, fonts, etc. + If you have Windows Terminal installed, the new WSL distro name will appear as an option on the pull-down menu, which is quite handy for launching in the future. You can then customize it with colors, fonts, and other elements. !!! tip "systemd" - The WSL image is systemd enabled out of the box! In case you want to use the container images or build your own one, you will only need to add `systemd=true` to the `boot` ini section in the `/etc/wsl.conf` file! ([ref.](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/#set-the-systemd-flag-set-in-your-wsl-distro-settings)) + The WSL image is systemd-enabled by default. If you want to use the container images or build your own, you will only need to add `systemd=true` to the `boot` section in the `/etc/wsl.conf` file. ([ref.](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/#set-the-systemd-flag-set-in-your-wsl-distro-settings)) From 7b4e5be36c852950169e5fc21b782bdf47d1b87b Mon Sep 17 00:00:00 2001 From: Ganna Zhyrnova <112796922+gannazhyrnova@users.noreply.github.com> Date: Mon, 9 Jun 2025 17:22:55 +0300 Subject: [PATCH 023/164] 9_6.md (#2740) Grammar Check --- docs/release_notes/9_6.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/docs/release_notes/9_6.md b/docs/release_notes/9_6.md index ccd0582c46..85334bd2c7 100644 --- a/docs/release_notes/9_6.md +++ b/docs/release_notes/9_6.md @@ -16,13 +16,13 @@ You can upgrade from Rocky Linux 9.x to Rocky Linux 9.6 by running `sudo dnf -y !!! Note - Rocky Linux does not offer an upgrade path from any version of Rocky Linux 8. We recommend doing a fresh OS install to move to Rocky Linux 9.6. + Rocky Linux does not offer an upgrade path from any version of Rocky Linux 8. We recommend that you perform a fresh OS installation to upgrade to Rocky Linux 9.6. ## Images -Several images are available along with the normal install images, including cloud and container platforms. +Several images are available, in addition to the standard installation images, including those for cloud and container platforms. -You can find more on the artifacts produced by the Cloud Special Interest Group, and information on how to get involved on the [SIG/Cloud Wiki page](https://sig-cloud.rocky.page/). +You can find more information on the artifacts produced by the Cloud Special Interest Group, as well as details on how to get involved, on the [SIG/Cloud Wiki page](https://sig-cloud.rocky.page/). ### Image build workflow and process @@ -30,12 +30,12 @@ With the release of Rocky Linux 9.6, the process of building and delivering our Images still built using ImageFactory include Vagrant (Libvirt, VirtualBox, and VMware) and OCP-Base (Oracle Cloud Platform). All other Cloud and Container images are now built with KIWI. This transition enables us to publish updates more frequently across supported platforms while maintaining feature parity with prior releases. -If you encounter issues or differences in behavior, please report them, we aim to resolve or explain any unexpected changes quickly. +If you encounter any issues or differences in behavior, please notify them. We aim to resolve or explain any unexpected changes quickly. ### New WSL image The introduction of a new WSL image, in addition to the KIWI upgrades, is also here! -This makes it possible to use the normal out-of-box experience, which store provided images have: +This makes it possible to use the normal out-of-box experience, which the store-provided images have: - download the image: [x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-WSL-Base.latest.x86_64.wsl) or [aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-WSL-Base.latest.aarch64.wsl) - to install run `wsl --install --from-file path/to/file.wsl rocky-wsl-base` or just double-click the wsl file @@ -45,9 +45,9 @@ Find further details in the [documentation page](https://docs.rockylinux.org/gui ## Installing -Prior to installing, [ensure compatibility of your CPU with this procedure!](https://docs.rockylinux.org/gemstones/test_cpu_compat/) +Before installing, [ensure compatibility of your CPU with this procedure!](https://docs.rockylinux.org/gemstones/test_cpu_compat/) -To install Rocky Linux 9.6, head to the [download page](https://rockylinux.org/download/) and download the version you need for your architecture. +To install Rocky Linux 9.6, visit the [download page](https://rockylinux.org/download/) and download the version corresponding to your architecture. ## The Rocky team release highlights @@ -57,17 +57,17 @@ To install Rocky Linux 9.6, head to the [download page](https://rockylinux.org/d For a complete list of major changes, see the [upstream listing here](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/overview#overview-major-changes). -Highlights and new features from this release are detailed next. +The highlights and new features of this release are detailed below. ### Security Listed below are security-related highlights in the latest Rocky Linux 9.6 release. For a complete list of security-related changes, see the [upstream link here](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-security): -- **SELinux** now provides additional policy rules that confine, `iio-sensor-proxy`, `power-profiles-daemon`, `switcheroo-control`, and `samba-bgqd`. +- **SELinux** now provides additional policy rules that confine `iio-sensor-proxy`, `power-profiles-daemon`, `switcheroo-control`, and `samba-bgqd`. ### Dynamic programming languages, web, and database servers -For a detailed list of the changes in this category see the [upstream link here](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-dynamic-programming-languages-web-and-database-servers). +For a detailed list of the changes in this category, see the [upstream link here](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-dynamic-programming-languages-web-and-database-servers). Later versions of the following module streams are now available: @@ -77,7 +77,7 @@ Later versions of the following module streams are now available: ### Compilers and development tools -For details on the changes in this category [see the upstream link here](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-compilers-and-development-tools) +For details on the changes in this category, see the upstream link here](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-compilers-and-development-tools) Updated performance tools and debuggers: @@ -100,15 +100,15 @@ Updated compiler toolsets: ### ZFS current module will not load in 9.6 -The currently released `zfs` module from OpenZFS **will not load** on Rocky Linux 9.6. For those using `zfs` on 9.5 and planning to upgrade to 9.6, you should hold off for now. If you are planning a fresh install of 9.6 and use `zfs` then again, you should wait for the release of the updated module. You can follow the issue [here](https://github.com/openzfs/zfs/issues/17332) and [here](https://github.com/openzfs/zfs/issues/17364). +The currently released `zfs` module from OpenZFS **will not load** on Rocky Linux 9.6. For those using `zfs` on 9.5 and planning to upgrade to 9.6, it is recommended to hold off for now. If you are planning a fresh installation of 9.6 and use `zfs`, then you should wait for the release of the updated module again. You can follow the issue [here](https://github.com/openzfs/zfs/issues/17332) and [here](https://github.com/openzfs/zfs/issues/17364). -### SELinux issue on server, workstation, or virtual hosts systems with `passt` installed +### SELinux issue on server, workstation, or virtual host systems with `passt` installed When using a workstation, server, or virtual host with a `passt` back end installed, the interface will fail to start if SELinux is enabled. See [this upstream issue](https://issues.redhat.com/browse/RHEL-80407) for more information. ### Upgrade failure with `gstreamer` packages installed -If upgrading a system you get a failure: +If upgrading a system, you get a failure: ``` Error: Transaction test error: @@ -131,8 +131,8 @@ As with any release, there are many known issues. Review the [upstream listing]( !!! info "Deprecated Software" - Some Application Streams, which are part of the Rocky Linux 9.6 repositories, will not receive any further updates. This is a normal occurrence that happens with nearly every release. Ensure that you are using the latest supported version of software. + Some Application Streams, which are part of the Rocky Linux 9.6 repositories, will not receive any further updates. This is a regular occurrence that happens with nearly every release. Please make sure that you are using the latest supported version of the software. ## Reporting bugs -Please report any bugs you encounter to the [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). We also welcome you to join our community in any way you wish be it on our [Forums](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC on Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailing Lists](https://lists.resf.org), or any other way you wish to participate! +Please report any bugs you encounter to the [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). We also welcome you to join our community in any way you wish, be it on our [Forums](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC on Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailing Lists](https://lists.resf.org), or any other way you wish to participate! From 20dabf7d6944330724b2351e881bcbcc161bcb1e Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Tue, 10 Jun 2025 12:08:47 -0400 Subject: [PATCH 024/164] New Crowdin updates (#2738) * New translations disa_stig_part1.md (Ukrainian) * New translations 9_5.md (Ukrainian) * New translations xfce_installation.md (Ukrainian) * New translations mate_installation.md (Ukrainian) * New translations kde_installation.md (Ukrainian) * New translations disa_stig_part3.md (Ukrainian) --- docs/books/disa_stig/disa_stig_part1.uk.md | 2 +- docs/books/disa_stig/disa_stig_part3.uk.md | 2 +- docs/guides/desktop/kde_installation.uk.md | 6 +++--- docs/guides/desktop/mate_installation.uk.md | 4 ++-- docs/guides/desktop/xfce_installation.uk.md | 2 +- docs/release_notes/9_5.uk.md | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/books/disa_stig/disa_stig_part1.uk.md b/docs/books/disa_stig/disa_stig_part1.uk.md index 18dc75e5b0..bb7c368fe3 100644 --- a/docs/books/disa_stig/disa_stig_part1.uk.md +++ b/docs/books/disa_stig/disa_stig_part1.uk.md @@ -22,7 +22,7 @@ tags: ## Вступ -У цьому посібнику ми розповімо, як застосувати [DISA STIG для RHEL8](https://www.stigviewer.com/stig/red_hat_enterprise_linux_8/) для нової інсталяції Rocky Linux 8. Оскільки серія складається з багатьох частин, ми також розповімо, як перевірити відповідність STIG, адаптувати параметри STIG і застосувати інший вміст STIG у цьому середовищі. +У цьому посібнику ми розглянемо, як застосувати [DISA STIG для RHEL8](https://stigviewer.com/stigs/red_hat_enterprise_linux_8) для нової інсталяції Rocky Linux 8. Оскільки серія складається з багатьох частин, ми також розповімо, як перевірити відповідність STIG, адаптувати параметри STIG і застосувати інший вміст STIG у цьому середовищі. Rocky Linux — це похідна від RHEL, і тому вміст, опублікований для DISA RHEL8 STIG, є однаковим для обох операційних систем. Навіть краща новина: застосування параметрів STIG вбудовано в інсталятор Rocky Linux 8 anaconda в розділі «Профілі безпеки». Під капотом усе це працює за допомогою інструменту під назвою [OpenSCAP](https://www.open-scap.org/), який дозволяє вам налаштувати систему на сумісність із DISA STIG (швидко!), а також перевірити відповідність системи після встановлення. diff --git a/docs/books/disa_stig/disa_stig_part3.uk.md b/docs/books/disa_stig/disa_stig_part3.uk.md index bcdfacd97c..e935e53867 100644 --- a/docs/books/disa_stig/disa_stig_part3.uk.md +++ b/docs/books/disa_stig/disa_stig_part3.uk.md @@ -12,7 +12,7 @@ tags: # Вступ -У частині 1 цієї серії ми розглянули, як створити наш веб-сервер із застосуванням базового RHEL8 DISA STIG, а в частині 2 ми дізналися, як перевірити відповідність STIG за допомогою інструменту OpenSCAP. Тепер ми збираємося зробити щось із системою, створити просту веб-програму та застосувати веб-сервер DISA STIG: +У частині 1 цієї серії ми розглянули, як створити наш веб-сервер із застосуванням базового RHEL8 DISA STIG, а в частині 2 ми дізналися, як перевірити відповідність STIG за допомогою інструменту OpenSCAP. Тепер ми збираємося щось зробити з системою, створити простий веб-застосунок та застосувати веб-сервер DISA STIG: [https://stigviewer.com/stigs/apache_server_2.4_unix_server](https://stigviewer.com/stigs/apache_server_2.4_unix_server) Спочатку давайте порівняємо, у що ми тут втягуємося, RHEL 8 DISA STIG призначений для дуже специфічної платформи, тому елементи керування досить легко зрозуміти в цьому контексті, протестувати та застосувати. Додатки STIG мають бути переносними на кілька платформ, тому вміст тут є загальним, щоб працювати з різними дистрибутивами Linux (RHEL, Ubuntu, SuSE тощо)**. Це означає, що такі інструменти, як OpenSCAP, не допоможуть нам перевірити/виправити конфігурацію. Нам доведеться робити це вручну. Ці STIG наступні: diff --git a/docs/guides/desktop/kde_installation.uk.md b/docs/guides/desktop/kde_installation.uk.md index bfc6a5be92..93cb319210 100644 --- a/docs/guides/desktop/kde_installation.uk.md +++ b/docs/guides/desktop/kde_installation.uk.md @@ -14,7 +14,7 @@ tags: !!! note "Примітка" - Ця процедура є специфічною для Rocky Linux 9.0. Наразі не існує процедури встановлення KDE для попередніх версій Rocky Linux. + Ця процедура є специфічною для Rocky Linux 9. Наразі не існує процедури встановлення KDE для попередніх версій Rocky Linux. Не соромтеся написати одну! ## Передумови @@ -25,7 +25,7 @@ tags: ## Отримання, перевірка та запис живого образу KDE -Першим кроком до інсталяції є завантаження живого образу та запис його на DVD або флешку USB. Як було зазначено раніше, образ буде завантажувальний, як і будь-який інший інсталяційний носій для Linux. Ви можете знайти останній образ KDE у розділі завантаження для Rocky Linux 9 [живі образи](https://dl.rockylinux.org/pub/rocky/9.5/live/x86_64/). +Першим кроком до інсталяції є завантаження живого образу та запис його на DVD або флешку USB. Як було зазначено раніше, образ буде завантажувальний, як і будь-який інший інсталяційний носій для Linux. Ви можете знайти останній образ KDE у розділі завантаження для Rocky Linux 9 [живі образи](https://dl.rockylinux.org/pub/rocky/9.6/live/x86_64/). Зауважте, що це конкретне посилання передбачає x86_64 як архітектуру вашого процесора. Якщо у вас є архітектура aarch64, ви можете використовувати це зображення. Завантажте живий образ і файли контрольної суми. @@ -49,7 +49,7 @@ Rocky-9-KDE-x86_64-latest.iso: OK ![kde_boot](images/kde_boot.png) -Якщо так, то ви на вірному шляху! Якщо ви хочете перевірити носій, ви можете спочатку вибрати цей параметр або ввести **S**, щоб **запустити Rocky Linux KDE 9.0 **. +Якщо так, то ви на вірному шляху! Якщо ви хочете перевірити носій, ви можете спочатку вибрати цей параметр або ввести **S**, щоб **запустити Rocky Linux KDE 9**. Пам’ятайте, що це живе зображення. Завантаження на перший екран займе деякий час. Не панікуйте, просто почекайте! Коли живе зображення з’явиться, ви побачите цей екран: diff --git a/docs/guides/desktop/mate_installation.uk.md b/docs/guides/desktop/mate_installation.uk.md index 9293dd635f..5309a3cee0 100644 --- a/docs/guides/desktop/mate_installation.uk.md +++ b/docs/guides/desktop/mate_installation.uk.md @@ -29,13 +29,13 @@ tags: ### 9: Отримайте, перевірте та запишіть живий образ MATE - Першим кроком до інсталяції є завантаження живого образу та запис його на DVD або флешку USB. Як було зазначено раніше, образ буде завантажувальний, як і будь-який інший інсталяційний носій для Linux. Ви можете знайти останній образ MATE у розділі завантаження для Rocky Linux 9 [живі зображення](https://dl.rockylinux.org/pub/rocky/9.5/live/x86_64/). Зауважте, що це конкретне посилання передбачає x86_64 як вашу архітектуру, і на момент написання цієї статті це єдина архітектура, для якої доступний цей живий образ. Завантажте живий образ і файли контрольної суми. + Першим кроком до інсталяції є завантаження живого образу та запис його на DVD або флешку USB. Як було зазначено раніше, образ буде завантажувальний, як і будь-який інший інсталяційний носій для Linux. Ви можете знайти найновіший образ MATE у розділі завантажень для Rocky Linux 9 [live-образи] (https://dl.rockylinux.org/pub/rocky/9.6/live/x86_64/). Зауважте, що це конкретне посилання передбачає x86_64 як вашу архітектуру, і на момент написання цієї статті це єдина архітектура, для якої доступний цей живий образ. Завантажте живий образ і файли контрольної суми. Тепер перевірте зображення за допомогою файлу CHECKSUM за допомогою наступного (зверніть увагу, це приклад! Переконайтеся, що назва вашого зображення та файли CHECKSUM збігаються): ``` - sha256sum -c CHECKSUM --ignore-missing Rocky-9.5-MATE-x86_64-20221124.0.iso.CHECKSUM + sha256sum -c CHECKSUM --ignore-missing Rocky-9.6-MATE-x86_64-20250530.3.iso.CHECKSUM ``` diff --git a/docs/guides/desktop/xfce_installation.uk.md b/docs/guides/desktop/xfce_installation.uk.md index 18991501ed..db9149a718 100644 --- a/docs/guides/desktop/xfce_installation.uk.md +++ b/docs/guides/desktop/xfce_installation.uk.md @@ -24,7 +24,7 @@ title: XFCE Desktop author: Gerard Arthus, Steven Spencer, Emre Camalan contribu ## 9: Отримайте, перевірте та запишіть живий образ XFCE - Першим кроком до інсталяції є завантаження живого образу та запис його на DVD або флешку USB. Як було зазначено раніше, образ буде завантажувальний, як і будь-який інший інсталяційний носій для Linux. Ви можете знайти останній образ XFCE у розділі завантаження для Rocky Linux 9 [живі зображення](https://dl.rockylinux.org/pub/rocky/9.5/live/x86_64/). Зауважте, що це конкретне посилання передбачає, що x86_64 є архітектурою вашого процесора. + Першим кроком до інсталяції є завантаження живого образу та запис його на DVD або флешку USB. Як було зазначено раніше, образ буде завантажувальний, як і будь-який інший інсталяційний носій для Linux. Ви можете знайти найновіший образ XFCE у розділі завантажень для Rocky Linux 9 [live-образи] (https://dl.rockylinux.org/pub/rocky/9.6/live/x86_64/). Зауважте, що це конкретне посилання передбачає, що x86_64 є архітектурою вашого процесора. На момент написання цієї статті ви можете використовувати архітектуру x86_64 або aarch64 для цього живого образу. Завантажте живий образ і файли контрольної суми. diff --git a/docs/release_notes/9_5.uk.md b/docs/release_notes/9_5.uk.md index 17b1926625..db005416f1 100644 --- a/docs/release_notes/9_5.uk.md +++ b/docs/release_notes/9_5.uk.md @@ -1,5 +1,5 @@ --- -title: Поточний реліз 9.5 +title: Реліз 9.5 tags: - 9.5 - реліз 9.5 From 01f879688673447878c3e9833a18eb823552517f Mon Sep 17 00:00:00 2001 From: wale soyinka Date: Wed, 11 Jun 2025 10:30:39 -0400 Subject: [PATCH 025/164] Start draft for RL 10 release notes (#2708) * Start draft for RL 10 release notes * Update 10_0.md * Update 10_0.md add some tics for commands * Update 10_0.md Add the link to the RISC-V content * Update 10_0.md link was added multiple times where it shouldn't have been during my edit! * fixes_link_and_kernel.md * updated link to upstream from beta to actual * fixed kernel version to 6.12.0 * Update 10_0.md add link to CPU compatibility check routine. * Add SELinux known issue * Update headers slightly * Add Known issues section and SELinux known issue * Update docs/release_notes/10_0.md `passt` issue Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update docs/release_notes/10_0.md fix link to RISC-V support Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update 10_0.md Some changes from @lumarel * Update 10_0.md Update link to major changes link per @lumarel * Update 10_0.md Additional changes from @lumarel * Update docs/release_notes/10_0.md Changes to TigerVNC/RDP section Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update docs/release_notes/10_0.md Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update 10_0.md add "removed" back in, accidentally removed from a previous commit. * Update 10_0.md More instances of "removed" removed accidentally during edit. * Update docs/release_notes/10_0.md replace "required" with "recommended" for those who want to chance it. Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update docs/release_notes/10_0.md reword Anaconda wording Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update docs/release_notes/10_0.md Key changes rewording Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update docs/release_notes/10_0.md remove "Image mode" section Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update docs/release_notes/10_0.md Changes in wording to the "Supported Architectures" section Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update 10_0.md Add a little wording to the "warning" admonition. * Update docs/release_notes/10_0.md Formatting fix Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update docs/release_notes/10_0.md Another formatting fix. Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update docs/release_notes/10_0.md more formatting fixes Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update docs/release_notes/10_0.md Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update docs/release_notes/10_0.md Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update docs/release_notes/10_0.md Formatting simplification for "Security Features" Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update docs/release_notes/10_0.md Some changes and inclusions Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update docs/release_notes/10_0.md Drop Package Repositories section as nothing is really changed from version 9 Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update docs/release_notes/10_0.md Replace "Notes" section with " "Modularity" Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update docs/release_notes/10_0.md Update formatting for consistency Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update docs/release_notes/10_0.md Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update docs/release_notes/10_0.md Fix formatting and redundancy of content Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update docs/release_notes/10_0.md Web Console --> Cockpit Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update docs/release_notes/10_0.md Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> * Update 10_0.md Remove the command line prompt portion of the `sort` and `rpmsort` examples. Also a slight rewording. * Update 10_0.md with pi image support admonition Add admonition for pi images * Reword network bonding line rewording * Update 10_0.md Grey screen install Add known issue for grey screen on some hardware during install and workaround. --------- Co-authored-by: sspencerwire Co-authored-by: Lukas Magauer <42647570+lumarel@users.noreply.github.com> --- docs/release_notes/10_0.md | 275 +++++++++++++++++++++++++++++++++++++ 1 file changed, 275 insertions(+) create mode 100644 docs/release_notes/10_0.md diff --git a/docs/release_notes/10_0.md b/docs/release_notes/10_0.md new file mode 100644 index 0000000000..ca73c36634 --- /dev/null +++ b/docs/release_notes/10_0.md @@ -0,0 +1,275 @@ +--- +title: Current Release 10 +tags: + - 10 + - 10.0 release + - Rocky Linux 10 +--- + + +## Rocky Linux 10 + +Rocky Linux 10 (RL 10) is the latest major release of Rocky Linux's enterprise operating system. + +### Upgrading to Rocky Linux 10 + +Rocky Linux does not support upgrades to any major release. To move from 8.x or 9.x to Rocky Linux 10, a fresh install of the operating system is recommended. + +### New Features and Changes + +The following sections describe selected features of RL 10. + +As with all major Rocky Linux releases, there are way too many enhancements, changes, and new features to go over in this release note. + +The overview that follows highlights changes in the - Architecture, Kernel, Installer, Networking, Security, Virtualization, Containers, Storage, Package management - categories. The features highlighted in this release note have been chosen based on their likely relevance to a general audience. + +For a complete list of major changes, please see the upstream listing [here](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/10/html/10.0_release_notes/overview#overview-major-changes). + +### Supported Architectures + +!!! warning "Please Check CPU Compatibility" + + On the x86_64 processor architecture, RL 10 no longer supports hardware at the x86-64-v2 microarchitecture level and earlier, and makes the x86-64-v3 microarchitecture level the distribution baseline. + See more information in the [Supported Microarchitecture Levels section](#supported-microarchitecture-levels), and specifically the section on testing the CPU for compatibility. + +!!! info "32-bit package discontinuation" + + Rocky Linux 10 has removed 32-bit compatibility for x86_64. Use 64-bit libraries or containers with 32-bit dependencies instead. + +Rocky Linux 10 is supported on the following processor architectures: + +* 64-bit AMD/Intel x86-64-v3 (x86_64) +* 64-bit RISC-V (riscv64) +* 64-bit ARMv8.0-A (aarch64) +* IBM POWER9, little endian (ppc64le) +* IBM z14 (s390x) + +#### Brand New support for RISC-V Architecture + +The Rocky Linux release Engineering team worked long and hard to bring Rocky Linux 10 to certain RISC-V implementations. +Platforms/subsystems supported on release day include - StarFive VisionFive 2 (VF2), **QEMU**, and SiFive HiFive Premier P550. + +More details about this milestone RL10’s RISC-V support can be found [here](https://rockylinux.org/news/rockylinux-support-for-riscv). + +#### Supported Microarchitecture Levels + +The x86-64-v3 microarchitecture is based on the feature set of the Intel Haswell processor generation. A handful of Intel Atom processors (such as the Gracemont-family processors) support x86-64-v3 while some others such as Intel Atom Parker Ridge-family processors and the Intel Atom x6416RE Elkhart Lake-family processor do not provide x86-64-v3 features and are thus not supported in RL 10. If you have doubt about your processor's compatability, [use this procedure](https://docs.rockylinux.org/gemstones/test_cpu_compat/) to verify. + +AMD's implementation of the x86-64-v3 microarchitecture level, which serves as the baseline for Rocky Linux 10 on x86_64, was introduced with their Excavator microarchitecture. This means that processors older than those based on the Excavator architecture may not be fully supported by Rocky Linux 10. + +!!! Note "Raspberry pi image differences" + + The key difference between the Rocky Linux pi images for version 10, is that 10 supports pi 4 and 5, whereas 9 supports 3, 4, 5 and pi zero2w. + +### Installation and Image Creation + +The interactive graphical interface for the RL installer, Anaconda, has been changed in a number of ways for RL 10. + +Key changes include: + +* By default, the root account is disabled. System management requires creating an administrative user with full sudo privileges. If you opt to enable the root account by setting its password, then standard users can be created without administrative privileges. +* Remote Desktop Protocol (RDP) replaces VNC for graphical remote access during installation. This change affects the related kernel boot options. +* The time zone map under the Time & Date section of the installer has been removed. +* The graphical interface no longer supports adding third-party repositories during initial installation. Use the `inst.addrepo` boot option or Kickstart instead. +* Documentation that had been available at the time of installation is removed. + +### Kernel + +The default out-of-box Kernel for RL 10 has been updated to version 6.12.0. + +Some kernel features are now disabled due to being unmaintained, insecure or deprecated. + +The `rh_waived` kernel command-line argument can enable these features if required. The CFS scheduler has been replaced with the Earliest Eligible Virtual Deadline First (EEVDF) scheduler, which prioritizes latency-sensitive tasks with shorter time slices to improve responsiveness. + +### Networking + +Enhancements to networking features in RL 10 include changes to network configuration, network interface aggregation, DHCP clients and servers, and device driver additions and removals. + +#### NetworkManager and Network Scripts + +Deprecation of the old ifcfg-rh network scripts occurred in previous versions of Rocky Linux (9.x). With Rocky Linux 10, these scripts are now gone completely. + +You have got to use NetworkManager now. Those tools include `nmcli`, `nmtui` and `nmstate`. This means some older files and commands will not work anymore, and where you keep your network config files has changed too. + +* Files with the ifcfg- prefix in the /etc/sysconfig/network-scripts/ directory are not supported. +* The ifup and ifdown commands are no longer available. +* Legacy network scripts like ifup-local are no longer supported. +* Network configuration files are stored in the /etc/NetworkManager/system-connections/ folder. + +#### DHCP Client and Server + +The DHCP client in RL 10 is implemented as an internal subsystem of NetworkManager. The legacy dhcp-client package is no longer supported upstream and is removed. + +The ISC DHCP server is end-of-life upstream and is replaced by its successor, Kea DHCP, in RL 10. + +#### Network Bonding and Teaming + +Previous Rocky Linux versions deprecated the NIC teaming feature. It is removed entirely in Rocky Linux 10. As a replacement, configure a bond instead of a network team. + +### Storage + +In addition to the following changes, a number of storage-related device drivers have been added, updated, and removed from RL 10. + +#### Global File System 2 (GFS2) + +Support for the GFS2 file system has been discontinued with RL 10. + +#### Device Mapper Multipath + +Enabling Device Mapper (DM) Multipath on NVMe devices is not supported by RL 10. + +#### LUKS2 Disk Encryption + +The cryptsetup package is rebased to version 2.7 to fix issues and to support LUKS-encrypted devices when using the kernel dump (kdump) service. + +### Security Features + +Loads of new security-related features come with Rocky Linux 10. + +Some of the updates include: + +* System-wide cryptographic policies (crypto-policies): OpenSSL and OpenSSH now work with post-quantum algorithms. +* Sequoia PGP: A memory-free implementation of OpenPGP is used now. +* OpenSSH: Stricter SSH host key permissions are restored (New Permissions = 0600 Vs. Old permissions = 0640). +* GnuTLS: Client and server certificates are now compressed +* yescrypt algorithm: The password algorithm for the default user is changed. + +New SELinux changes include the following updates: + +* File context equivalency is inverted to /var/run = /run. +* New libvirt service types are added to SELinux policy. + +### Virtualization + +Virtualization sees key changes: + +* Monolitic libvirtd daemon is deprecated, the modular daemons and sockets should be used as replacement. Please see detailed documentation about the differences in the [upstream documentation](https://libvirt.org/daemons.html#monolithic-vs-modular-daemons) +* Deprecation of the i440fx virtual machine type +* Deprecation of Virtual Machine Manager, Cockpit is the intended replacement + +### Containers + +Podman 5 in RL 10 introduces several improvements, including the new default container runtime, `crun`, which replaces `runc`. Control Groups v2 is now the default cgroup version. + +Key updates include the deprecation of the slirp4netns network mode, the ability to configure retry attempts and delays for image push and pull operations, and comprehensive support for multi-architecture container images. + +Furthermore, Podman 5 continues to support Quadlets, a feature introduced in Podman 4.4, which enables managing Podman containers with systemd using declarative unit files. + +### Software Management + +RPM has been updated to version 4.19, including enhancements and updates to packaging and building tools. There is a new `rpmsort` command introduced for correctly ordering RPM version strings in output pipelines. As an example: + +The old `sort`: `rpm -q kernel | sort` +kernel-6.12.0-130.el10.x86_64 +kernel-6.12.0-13.el10.x86_64 + +The new `rpmsort`: `rpm -q kernel | rpmsort` +kernel-6.12.0-13.el10.x86_64 +kernel-6.12.0-130.el10.x86_64 + +#### DNF + +By default, DNF now omits downloading repository filelist metadata, enhancing responsiveness and conserving disk space. DNF commands that need this metadata will generally download it automatically. + + +#### Modularity + +DNF modularity is deprecated, and Rocky Linux does not intend to provide AppStream content as modules in RL 10, although in the future additional application versions might be provided as RPM packages, software collections, or Flatpaks. + +### Desktop Environment + +In RL 10, Wayland replaces the X.Org Server. Xwayland will support most X11 clients not yet ported to Wayland. Some desktop applications and components are also replaced in RL 10. + +#### Desktop Component changes + +| Removed | Replacement | +| :---- | :---- | +| gedit text editor | GNOME Text Editor (gnome-text-editor) | +| Tweaks application | Use Tweaks options in GNOME settings or/and use the Flatpak on Flathub | +| Festival speech synthesizer | Espeak NG | +| Eye of GNOME (eog) image viewer | GNOME Image Viewer (loupe) | +| Cheese camera application | Snapshot application | +| GNOME Terminal | ptyxis terminal | +| PulseAudio daemon (but not the client interfaces) | Pipewire (has already been the default in RL 9) | + +A number of graphical desktop applications are no longer provided by Rocky Linux as part of the RL 10 distribution. In most cases, these applications can be obtained from upstream sources or they might be available as Flatpaks on Flathub. + +#### Removed Applications + +| Removed | Substitution | +| :---- | :---- | +| LibreOffice office productivity software suite | Officially provided as Flatpak on Flathub, or you can download upstream packages from [https://www.libreoffice.org/](https://www.libreoffice.org/). | +| Evolution personal information manager and email client | Thunderbird is provided via the Appstream repository. You can also obtain a Flatpak or package from upstream or through Flathub. | +| Inkscape vector graphics editor | There is no vector graphics editor shipped in RL 10, but you can find a Flatpak on Flathub. | +| Totem (GNOME Videos) media player | There is no default desktop media player shipped in RL 10. The web browser can still play web-based media. Or choose a different media player from 3rd party repositories or as Flatpak from Flathub. | + +TigerVNC is removed from RL 10. For VNC client functionality, use the Connections application. No VNC server is provided +gnome-remote-desktop, using RDP, replaces TigerVNC for desktop sharing, remote login, and headless sessions. This is built into GNOME and can be configured in the Settings application. + +The Motif X11 desktop environment and toolkit are also removed from RL 10. + +### Infrastructure Services + +Some of the services and packages that are replaced or removed in RL 10 include the following infrastructure services. + +| Removed | Replacement | +| :---- | :---- | +| power-profiles-daemon CPU throttle | tuned-ppd translation layer that supports applications written for the power-profiles-daemon | +| redis in-memory key-value database | valkey (a fork of redis) in-memory key-value database ^1 | +| sendmail mail transfer agent | Rocky Linux recommends migrating to the Postfix mail transfer agent. | +| spamassassin email spam filter | The spamassassin email spam filter is now found in the EPEL repository. | + +1 In addition to `valkey`, the `valkey-compat-redis` package is in the Plus repository. + +### Dynamic Programming Languages + +A number of popular programming languages have been updated to more recent versions. + +- Python 3.12 +- Ruby 3.3 +- Node.js 22.13 +- Perl 5.40 +- PHP 8.3 + +### Web Servers and Database Servers + +A number of popular server daemons have also been updated to more recent versions. + +#### Web servers + +- Apache HTTP Server 2.4.63 +- nginx 1.26 + +#### Proxy caching servers + +- Varnish Cache 7.6 +- Squid 6.10 + +#### Database servers + +- MariaDB 10.11 +- MySQL 8.4 +- PostgreSQL 16.8 +- Valkey 8.0 + +### RL Web Console (Cockpit) + +Cockpit is a web-based interface to manage and monitor your local system. A graphical file manager and text editor is now available in the web console if you install the `cockpit-files` RPM package. + +The host switcher, which enabled multiple systems to be managed simultaneously, is deprecated and disabled by default due to security reasons. + +Cockpit now supports configuring Stratis file-system size limits. + +## Known Issues + +### SELinux issue on virtual hosts + +When using a virtual host with a `passt` backend enabled and `memfd` type for memory, the interface will fail to start if SELinux is enabled. See [this upstream issue](https://issues.redhat.com/browse/RHEL-80407) for more information. + +### Grey screen after bootup of installation media + +In certain hardware configurations, such as virtualized environments with enabled 3D graphics, you might experience Anaconda hanging before showing the setup wizard. This issue should be resolvable by switching away from tty6 to another tty and then back to tty6. For example, switch to tty1 and back to tty6 with: ++ctrl+alt+f1++ and then ++ctrl+alt+f6++. + +## Participating and reporting bugs + +Please report any bugs you encounter to the [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). We also welcome you to join our community in any way you wish be it on our [Forums](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC on Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailing Lists](https://lists.resf.org), or any other way you wish to participate! From 689249d3898663c70b24586e6473c437955eddb0 Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Wed, 11 Jun 2025 09:30:58 -0500 Subject: [PATCH 026/164] To merge with 10 release notes (#2728) * To merge with 10 release notes * update `.pages` file to resort 10.0 top, followed by 9.6 and 8.10 * update `8_10.md` to remove "Current" from "Current Release 8.10" * Update 8_10.md revert change of "Current" ... --- docs/release_notes/.pages | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/release_notes/.pages b/docs/release_notes/.pages index f391a06551..b9aee03846 100644 --- a/docs/release_notes/.pages +++ b/docs/release_notes/.pages @@ -1,6 +1,7 @@ --- nav: - ... | index*.md + - ... | 10_0*.md - ... | 9_6*.md - ... | 8_10*.md - ... | 9_5*.md From de59ca974e84d28b5bd80e11849169a3a53bb834 Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Wed, 11 Jun 2025 09:55:52 -0500 Subject: [PATCH 027/164] update `index.md` in release_notes (#2741) * add in version 10 info * add in version 9.6 info --- docs/release_notes/index.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/release_notes/index.md b/docs/release_notes/index.md index b3a1731b34..2856fb6e57 100644 --- a/docs/release_notes/index.md +++ b/docs/release_notes/index.md @@ -11,6 +11,14 @@ Welcome to our listing of release notes for Rocky Linux. The most recent release ## Rocky Linux Releases +## Rocky 10 + +Rocky 10 (Code Name "Red Quartz") has general support until 31 May 2030 and security support through 31 May 2035. The supported architectures are x86_64_v3, riscv64, aarch64, ppc64le, and s390x. + +| Release Number | General Availability Date | Kernel Version | +|----------------|---------------------------|----------------| +| 10.0 | 2025-06-11 | 6.12.0-55.14.1 | + ## Rocky 9 ### Overview @@ -27,6 +35,7 @@ Rocky 9 (Code Name "Blue Onyx") has general support until 31 May 2027 and securi | 9.3 | 2023-11-20 | 5.14.0-362.8.1 | | 9.4 | 2024-05-09 | 5.14.0-427.13.1 | | 9.5 | 2024-11-19 | 5.14.0-503.14.1 | +| 9.6 | 2025-06-04 | 5.14.0-570.18.1 | ## Rocky 8 From b18c8bb3abb3b40ba323e76a0556dca7b6f00456 Mon Sep 17 00:00:00 2001 From: Ganna Zhyrnova <112796922+gannazhyrnova@users.noreply.github.com> Date: Wed, 11 Jun 2025 23:20:57 +0300 Subject: [PATCH 028/164] 10_0.md (#2743) Grammar check --- docs/release_notes/10_0.md | 68 +++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/docs/release_notes/10_0.md b/docs/release_notes/10_0.md index ca73c36634..32e65e3118 100644 --- a/docs/release_notes/10_0.md +++ b/docs/release_notes/10_0.md @@ -19,18 +19,18 @@ Rocky Linux does not support upgrades to any major release. To move from 8.x or The following sections describe selected features of RL 10. -As with all major Rocky Linux releases, there are way too many enhancements, changes, and new features to go over in this release note. +As with all major Rocky Linux releases, this release note covers numerous enhancements, changes, and new features. -The overview that follows highlights changes in the - Architecture, Kernel, Installer, Networking, Security, Virtualization, Containers, Storage, Package management - categories. The features highlighted in this release note have been chosen based on their likely relevance to a general audience. +The overview that follows highlights changes in the following categories: Architecture, Kernel, Installer, Networking, Security, Virtualization, Containers, Storage, and Package Management. The features highlighted in this release note have been chosen based on their likely relevance to a general audience. For a complete list of major changes, please see the upstream listing [here](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/10/html/10.0_release_notes/overview#overview-major-changes). ### Supported Architectures -!!! warning "Please Check CPU Compatibility" +!!! warning "Please check CPU Compatibility" - On the x86_64 processor architecture, RL 10 no longer supports hardware at the x86-64-v2 microarchitecture level and earlier, and makes the x86-64-v3 microarchitecture level the distribution baseline. - See more information in the [Supported Microarchitecture Levels section](#supported-microarchitecture-levels), and specifically the section on testing the CPU for compatibility. + On the x86_64 processor architecture, RL 10 no longer supports hardware at the x86-64-v2 microarchitecture level and earlier, and makes the x86-64-v3 microarchitecture level the baseline for distribution. + For more information, refer to the [Supported Microarchitecture Levels section](#supported-microarchitecture-levels), particularly the section on testing the CPU for compatibility. !!! info "32-bit package discontinuation" @@ -49,26 +49,26 @@ Rocky Linux 10 is supported on the following processor architectures: The Rocky Linux release Engineering team worked long and hard to bring Rocky Linux 10 to certain RISC-V implementations. Platforms/subsystems supported on release day include - StarFive VisionFive 2 (VF2), **QEMU**, and SiFive HiFive Premier P550. -More details about this milestone RL10’s RISC-V support can be found [here](https://rockylinux.org/news/rockylinux-support-for-riscv). +For more details about this milestone, including RL10’s RISC-V support, please visit [this site](https://rockylinux.org/news/rockylinux-support-for-riscv). #### Supported Microarchitecture Levels -The x86-64-v3 microarchitecture is based on the feature set of the Intel Haswell processor generation. A handful of Intel Atom processors (such as the Gracemont-family processors) support x86-64-v3 while some others such as Intel Atom Parker Ridge-family processors and the Intel Atom x6416RE Elkhart Lake-family processor do not provide x86-64-v3 features and are thus not supported in RL 10. If you have doubt about your processor's compatability, [use this procedure](https://docs.rockylinux.org/gemstones/test_cpu_compat/) to verify. +The x86-64-v3 microarchitecture is based on the feature set of the Intel Haswell processor generation. A handful of Intel Atom processors (such as the Gracemont-family processors) support x86-64-v3. In contrast, others, including Intel Atom Parker Ridge-family processors and the Intel Atom x6416RE Elkhart Lake-family processor, do not provide x86-64-v3 features and are therefore not supported in RL 10. If you doubt your processor's compatibility, [use this procedure](https://docs.rockylinux.org/gemstones/test_cpu_compat/) to verify. AMD's implementation of the x86-64-v3 microarchitecture level, which serves as the baseline for Rocky Linux 10 on x86_64, was introduced with their Excavator microarchitecture. This means that processors older than those based on the Excavator architecture may not be fully supported by Rocky Linux 10. -!!! Note "Raspberry pi image differences" +!!! Note "Raspberry Pi image differences" - The key difference between the Rocky Linux pi images for version 10, is that 10 supports pi 4 and 5, whereas 9 supports 3, 4, 5 and pi zero2w. + The key difference between the Rocky Linux Pi images for version 10 is that 10 supports Pi 4 and Pi 5, whereas 9 supports Pi 3, Pi 4, Pi 5, and Pi Zero 2W. ### Installation and Image Creation -The interactive graphical interface for the RL installer, Anaconda, has been changed in a number of ways for RL 10. +The interactive graphical interface for the RL installer, Anaconda, has been updated in several ways for RL 10. Key changes include: -* By default, the root account is disabled. System management requires creating an administrative user with full sudo privileges. If you opt to enable the root account by setting its password, then standard users can be created without administrative privileges. -* Remote Desktop Protocol (RDP) replaces VNC for graphical remote access during installation. This change affects the related kernel boot options. +* By default, the root account is disabled. System management requires creating an administrative user with full sudo privileges. If you opt to enable the root account by setting its password, then standard users can be made without administrative privileges. +* Remote Desktop Protocol (RDP) replaces VNC for graphical remote access during the installation process. This change affects the related kernel boot options. * The time zone map under the Time & Date section of the installer has been removed. * The graphical interface no longer supports adding third-party repositories during initial installation. Use the `inst.addrepo` boot option or Kickstart instead. * Documentation that had been available at the time of installation is removed. @@ -77,38 +77,38 @@ Key changes include: The default out-of-box Kernel for RL 10 has been updated to version 6.12.0. -Some kernel features are now disabled due to being unmaintained, insecure or deprecated. +Some kernel features are now disabled due to being unmaintained, insecure, or deprecated. The `rh_waived` kernel command-line argument can enable these features if required. The CFS scheduler has been replaced with the Earliest Eligible Virtual Deadline First (EEVDF) scheduler, which prioritizes latency-sensitive tasks with shorter time slices to improve responsiveness. ### Networking -Enhancements to networking features in RL 10 include changes to network configuration, network interface aggregation, DHCP clients and servers, and device driver additions and removals. +Enhancements to networking features in RL 10 include changes to network configuration, network interface aggregation, DHCP clients and servers, as well as additions and removals to device drivers. #### NetworkManager and Network Scripts -Deprecation of the old ifcfg-rh network scripts occurred in previous versions of Rocky Linux (9.x). With Rocky Linux 10, these scripts are now gone completely. +Deprecation of the old ifcfg-rh network scripts occurred in previous versions of Rocky Linux (9.x). With Rocky Linux 10, these scripts are no longer available. -You have got to use NetworkManager now. Those tools include `nmcli`, `nmtui` and `nmstate`. This means some older files and commands will not work anymore, and where you keep your network config files has changed too. +You must use NetworkManager now. Those tools include `nmcli`, `nmtui`, and `nmstate`. This means that some older files and commands will no longer work, and the location where you keep your network configuration files has also changed. * Files with the ifcfg- prefix in the /etc/sysconfig/network-scripts/ directory are not supported. * The ifup and ifdown commands are no longer available. -* Legacy network scripts like ifup-local are no longer supported. +* Legacy network scripts, such as ifup-local, are no longer supported. * Network configuration files are stored in the /etc/NetworkManager/system-connections/ folder. #### DHCP Client and Server -The DHCP client in RL 10 is implemented as an internal subsystem of NetworkManager. The legacy dhcp-client package is no longer supported upstream and is removed. +The DHCP client in RL 10 is implemented as an internal subsystem of NetworkManager. The legacy dhcp-client package is no longer supported upstream and has been removed. The ISC DHCP server is end-of-life upstream and is replaced by its successor, Kea DHCP, in RL 10. #### Network Bonding and Teaming -Previous Rocky Linux versions deprecated the NIC teaming feature. It is removed entirely in Rocky Linux 10. As a replacement, configure a bond instead of a network team. +Previous versions of Rocky Linux deprecated the NIC teaming feature. It is removed entirely in Rocky Linux 10. As a replacement, configure a bond instead of a network team. ### Storage -In addition to the following changes, a number of storage-related device drivers have been added, updated, and removed from RL 10. +In addition to the following changes, several storage-related device drivers have been added, updated, and removed from RL 10. #### Global File System 2 (GFS2) @@ -120,30 +120,30 @@ Enabling Device Mapper (DM) Multipath on NVMe devices is not supported by RL 10. #### LUKS2 Disk Encryption -The cryptsetup package is rebased to version 2.7 to fix issues and to support LUKS-encrypted devices when using the kernel dump (kdump) service. +The cryptsetup package has been rebased to version 2.7 to address issues and support LUKS-encrypted devices when using the kernel dump (kdump) service. ### Security Features -Loads of new security-related features come with Rocky Linux 10. +Numerous new security-related features are included with Rocky Linux 10. Some of the updates include: * System-wide cryptographic policies (crypto-policies): OpenSSL and OpenSSH now work with post-quantum algorithms. * Sequoia PGP: A memory-free implementation of OpenPGP is used now. -* OpenSSH: Stricter SSH host key permissions are restored (New Permissions = 0600 Vs. Old permissions = 0640). +* OpenSSH: Stricter SSH host key permissions are restored (New Permissions = 0600 Vs Old permissions = 0640). * GnuTLS: Client and server certificates are now compressed * yescrypt algorithm: The password algorithm for the default user is changed. New SELinux changes include the following updates: * File context equivalency is inverted to /var/run = /run. -* New libvirt service types are added to SELinux policy. +* New libvirt service types are added to the SELinux policy. ### Virtualization Virtualization sees key changes: -* Monolitic libvirtd daemon is deprecated, the modular daemons and sockets should be used as replacement. Please see detailed documentation about the differences in the [upstream documentation](https://libvirt.org/daemons.html#monolithic-vs-modular-daemons) +* The monolithic libvirtd daemon is deprecated; the modular daemons and sockets should be used as replacements. Please see detailed documentation about the differences in the [upstream documentation](https://libvirt.org/daemons.html#monolithic-vs-modular-daemons) * Deprecation of the i440fx virtual machine type * Deprecation of Virtual Machine Manager, Cockpit is the intended replacement @@ -174,25 +174,25 @@ By default, DNF now omits downloading repository filelist metadata, enhancing re #### Modularity -DNF modularity is deprecated, and Rocky Linux does not intend to provide AppStream content as modules in RL 10, although in the future additional application versions might be provided as RPM packages, software collections, or Flatpaks. +DNF modularity is deprecated, and Rocky Linux does not intend to provide AppStream content as modules in RL 10. However, in the future, additional application versions may be provided as RPM packages, software collections, or Flatpaks. ### Desktop Environment -In RL 10, Wayland replaces the X.Org Server. Xwayland will support most X11 clients not yet ported to Wayland. Some desktop applications and components are also replaced in RL 10. +In RL 10, Wayland replaces the X.Org Server. Xwayland will support most X11 clients that have not yet been ported to Wayland. Some desktop applications and components are also replaced in RL 10. #### Desktop Component changes | Removed | Replacement | | :---- | :---- | | gedit text editor | GNOME Text Editor (gnome-text-editor) | -| Tweaks application | Use Tweaks options in GNOME settings or/and use the Flatpak on Flathub | +| Tweaks application | Use Tweaks options in GNOME settings and/or use the Flatpak on Flathub | | Festival speech synthesizer | Espeak NG | | Eye of GNOME (eog) image viewer | GNOME Image Viewer (loupe) | | Cheese camera application | Snapshot application | | GNOME Terminal | ptyxis terminal | | PulseAudio daemon (but not the client interfaces) | Pipewire (has already been the default in RL 9) | -A number of graphical desktop applications are no longer provided by Rocky Linux as part of the RL 10 distribution. In most cases, these applications can be obtained from upstream sources or they might be available as Flatpaks on Flathub. +Several graphical desktop applications are no longer included in the Rocky Linux 10 distribution. In most cases, these applications can be obtained from upstream sources or are available as Flatpaks on Flathub. #### Removed Applications @@ -200,8 +200,8 @@ A number of graphical desktop applications are no longer provided by Rocky Linux | :---- | :---- | | LibreOffice office productivity software suite | Officially provided as Flatpak on Flathub, or you can download upstream packages from [https://www.libreoffice.org/](https://www.libreoffice.org/). | | Evolution personal information manager and email client | Thunderbird is provided via the Appstream repository. You can also obtain a Flatpak or package from upstream or through Flathub. | -| Inkscape vector graphics editor | There is no vector graphics editor shipped in RL 10, but you can find a Flatpak on Flathub. | -| Totem (GNOME Videos) media player | There is no default desktop media player shipped in RL 10. The web browser can still play web-based media. Or choose a different media player from 3rd party repositories or as Flatpak from Flathub. | +| Inkscape Vector Graphics Editor | There is no vector graphics editor included in RL 10, but you can find a Flatpak on Flathub. | +| Totem (GNOME Videos) media player | There is no default desktop media player shipped in RL 10. The web browser can still play web-based media. Alternatively, you can choose a different media player from third-party repositories or as a Flatpak from Flathub. | TigerVNC is removed from RL 10. For VNC client functionality, use the Connections application. No VNC server is provided gnome-remote-desktop, using RDP, replaces TigerVNC for desktop sharing, remote login, and headless sessions. This is built into GNOME and can be configured in the Settings application. @@ -223,7 +223,7 @@ Some of the services and packages that are replaced or removed in RL 10 include ### Dynamic Programming Languages -A number of popular programming languages have been updated to more recent versions. +Several popular programming languages have been updated to their most recent versions. - Python 3.12 - Ruby 3.3 @@ -254,7 +254,7 @@ A number of popular server daemons have also been updated to more recent version ### RL Web Console (Cockpit) -Cockpit is a web-based interface to manage and monitor your local system. A graphical file manager and text editor is now available in the web console if you install the `cockpit-files` RPM package. +Cockpit is a web-based interface for managing and monitoring your local system. A graphical file manager and text editor are now available in the web console if you install the `cockpit-files` RPM package. The host switcher, which enabled multiple systems to be managed simultaneously, is deprecated and disabled by default due to security reasons. @@ -268,7 +268,7 @@ When using a virtual host with a `passt` backend enabled and `memfd` type for me ### Grey screen after bootup of installation media -In certain hardware configurations, such as virtualized environments with enabled 3D graphics, you might experience Anaconda hanging before showing the setup wizard. This issue should be resolvable by switching away from tty6 to another tty and then back to tty6. For example, switch to tty1 and back to tty6 with: ++ctrl+alt+f1++ and then ++ctrl+alt+f6++. +In specific hardware configurations, such as virtualized environments with 3D graphics enabled, you may experience Anaconda hanging before the setup wizard is displayed. This issue should be resolvable by switching away from tty6 to another tty and then back to tty6. For example, switch to tty1 and back to tty6 with: ++ctrl+alt+f1++ and then ++ctrl+alt+f6++. ## Participating and reporting bugs From 9e58febb2c9adacc5c778da7adfd5150149f8ea1 Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Thu, 12 Jun 2025 07:56:34 -0500 Subject: [PATCH 029/164] One link improperly formatted (#2744) --- docs/release_notes/9_6.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release_notes/9_6.md b/docs/release_notes/9_6.md index 85334bd2c7..0cdb9e8e80 100644 --- a/docs/release_notes/9_6.md +++ b/docs/release_notes/9_6.md @@ -77,7 +77,7 @@ Later versions of the following module streams are now available: ### Compilers and development tools -For details on the changes in this category, see the upstream link here](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-compilers-and-development-tools) +For details on the changes in this category, see the [upstream link here](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-compilers-and-development-tools) Updated performance tools and debuggers: From 0826eb2955c0552e7a9c9b375f6efe72f69dad7f Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Thu, 12 Jun 2025 09:20:30 -0500 Subject: [PATCH 030/164] editing pass `10_0.md` (#2746) * some sentence simplification * removal of extra lines (automatically handled by the editor) * some (not all) passive voice phrasing replaced with active voice --- docs/release_notes/10_0.md | 87 +++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 44 deletions(-) diff --git a/docs/release_notes/10_0.md b/docs/release_notes/10_0.md index 32e65e3118..d5411ac23a 100644 --- a/docs/release_notes/10_0.md +++ b/docs/release_notes/10_0.md @@ -13,7 +13,7 @@ Rocky Linux 10 (RL 10) is the latest major release of Rocky Linux's enterprise o ### Upgrading to Rocky Linux 10 -Rocky Linux does not support upgrades to any major release. To move from 8.x or 9.x to Rocky Linux 10, a fresh install of the operating system is recommended. +Rocky Linux does not support upgrades to any major release. To move from 8.x or 9.x to Rocky Linux 10, you should perform a fresh install of the operating system. ### New Features and Changes @@ -21,9 +21,9 @@ The following sections describe selected features of RL 10. As with all major Rocky Linux releases, this release note covers numerous enhancements, changes, and new features. -The overview that follows highlights changes in the following categories: Architecture, Kernel, Installer, Networking, Security, Virtualization, Containers, Storage, and Package Management. The features highlighted in this release note have been chosen based on their likely relevance to a general audience. +The overview that follows highlights changes in the following categories: Architecture, Kernel, Installer, Networking, Security, Virtualization, Containers, Storage, and Package Management. Chosen here are the features most likely to have relevance to a general audience. -For a complete list of major changes, please see the upstream listing [here](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/10/html/10.0_release_notes/overview#overview-major-changes). +For a complete list of major changes, see the upstream listing [here](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/10/html/10.0_release_notes/overview#overview-major-changes). ### Supported Architectures @@ -44,7 +44,7 @@ Rocky Linux 10 is supported on the following processor architectures: * IBM POWER9, little endian (ppc64le) * IBM z14 (s390x) -#### Brand New support for RISC-V Architecture +#### Brand New Support for RISC-V Architecture The Rocky Linux release Engineering team worked long and hard to bring Rocky Linux 10 to certain RISC-V implementations. Platforms/subsystems supported on release day include - StarFive VisionFive 2 (VF2), **QEMU**, and SiFive HiFive Premier P550. @@ -63,15 +63,15 @@ AMD's implementation of the x86-64-v3 microarchitecture level, which serves as t ### Installation and Image Creation -The interactive graphical interface for the RL installer, Anaconda, has been updated in several ways for RL 10. +Anaconda, the interactive graphical interface for the Rocky Linux installer, has a number of changes in version 10. Key changes include: -* By default, the root account is disabled. System management requires creating an administrative user with full sudo privileges. If you opt to enable the root account by setting its password, then standard users can be made without administrative privileges. +* The disabling, by default, of the root account. System management requires creating an administrative user with full sudo privileges. If you opt to enable the root account by setting its password, then you can create standard users without administrative privileges. * Remote Desktop Protocol (RDP) replaces VNC for graphical remote access during the installation process. This change affects the related kernel boot options. -* The time zone map under the Time & Date section of the installer has been removed. +* Removal of the time zone map under the "Time & Date" section of the installer. * The graphical interface no longer supports adding third-party repositories during initial installation. Use the `inst.addrepo` boot option or Kickstart instead. -* Documentation that had been available at the time of installation is removed. +* Removal of documentation that had been available at the time of installation. ### Kernel @@ -79,7 +79,7 @@ The default out-of-box Kernel for RL 10 has been updated to version 6.12.0. Some kernel features are now disabled due to being unmaintained, insecure, or deprecated. -The `rh_waived` kernel command-line argument can enable these features if required. The CFS scheduler has been replaced with the Earliest Eligible Virtual Deadline First (EEVDF) scheduler, which prioritizes latency-sensitive tasks with shorter time slices to improve responsiveness. +The `rh_waived` kernel command-line argument can enable these features if required. Earliest Eligible Virtual Deadline First (EEVDF), which prioritizes latency-sensitive tasks with shorter time slices to improve responsiveness, replace the CFS scheduler. ### Networking @@ -98,21 +98,21 @@ You must use NetworkManager now. Those tools include `nmcli`, `nmtui`, and `nmst #### DHCP Client and Server -The DHCP client in RL 10 is implemented as an internal subsystem of NetworkManager. The legacy dhcp-client package is no longer supported upstream and has been removed. +Implementation of the DHCP client in RL 10 is through an internal subsystem of NetworkManager. The legacy dhcp-client package is removed and is no-longer supported upstream. -The ISC DHCP server is end-of-life upstream and is replaced by its successor, Kea DHCP, in RL 10. +Kea DHCP replaces the end-of-life ISC DHCP server in RL 10. #### Network Bonding and Teaming -Previous versions of Rocky Linux deprecated the NIC teaming feature. It is removed entirely in Rocky Linux 10. As a replacement, configure a bond instead of a network team. +Previous versions of Rocky Linux deprecated the NIC teaming feature. In RL 10, this is now removed entirely. As a replacement, configure a bond instead of a network team. ### Storage -In addition to the following changes, several storage-related device drivers have been added, updated, and removed from RL 10. +In addition to the following changes, several storage-related device drivers are added, updated, or removed from RL 10. #### Global File System 2 (GFS2) -Support for the GFS2 file system has been discontinued with RL 10. +RL 10 no-longer supports the GFS2 file system. #### Device Mapper Multipath @@ -124,26 +124,26 @@ The cryptsetup package has been rebased to version 2.7 to address issues and sup ### Security Features -Numerous new security-related features are included with Rocky Linux 10. +With RL 10, comes the inclusion of numerous new security-related features. Some of the updates include: * System-wide cryptographic policies (crypto-policies): OpenSSL and OpenSSH now work with post-quantum algorithms. -* Sequoia PGP: A memory-free implementation of OpenPGP is used now. -* OpenSSH: Stricter SSH host key permissions are restored (New Permissions = 0600 Vs Old permissions = 0640). +* Sequoia PGP: A memory-free implementation of OpenPGP. +* OpenSSH: The restoration of stricter SSH host key permissions. (New Permissions = 0600 Vs Old permissions = 0640). * GnuTLS: Client and server certificates are now compressed * yescrypt algorithm: The password algorithm for the default user is changed. New SELinux changes include the following updates: * File context equivalency is inverted to /var/run = /run. -* New libvirt service types are added to the SELinux policy. +* The addition of new libvirt service types to the SELinux policy. ### Virtualization Virtualization sees key changes: -* The monolithic libvirtd daemon is deprecated; the modular daemons and sockets should be used as replacements. Please see detailed documentation about the differences in the [upstream documentation](https://libvirt.org/daemons.html#monolithic-vs-modular-daemons) +* The monolithic libvirtd daemon is deprecated. Use the modular daemons and sockets as replacements. Please see detailed documentation about the differences in the [upstream documentation](https://libvirt.org/daemons.html#monolithic-vs-modular-daemons) * Deprecation of the i440fx virtual machine type * Deprecation of Virtual Machine Manager, Cockpit is the intended replacement @@ -153,11 +153,11 @@ Podman 5 in RL 10 introduces several improvements, including the new default con Key updates include the deprecation of the slirp4netns network mode, the ability to configure retry attempts and delays for image push and pull operations, and comprehensive support for multi-architecture container images. -Furthermore, Podman 5 continues to support Quadlets, a feature introduced in Podman 4.4, which enables managing Podman containers with systemd using declarative unit files. +Furthermore, Podman 5 continues to support Quadlets, a feature introduced in Podman 4.4, which enables managing Podman containers with `systemd` using declarative unit files. ### Software Management -RPM has been updated to version 4.19, including enhancements and updates to packaging and building tools. There is a new `rpmsort` command introduced for correctly ordering RPM version strings in output pipelines. As an example: +RPM is now version 4.19, Which includes enhancements and updates to packaging and building tools. There is a new `rpmsort` command introduced for correctly ordering RPM version strings in output pipelines. As an example: The old `sort`: `rpm -q kernel | sort` kernel-6.12.0-130.el10.x86_64 @@ -171,10 +171,9 @@ kernel-6.12.0-130.el10.x86_64 By default, DNF now omits downloading repository filelist metadata, enhancing responsiveness and conserving disk space. DNF commands that need this metadata will generally download it automatically. - #### Modularity -DNF modularity is deprecated, and Rocky Linux does not intend to provide AppStream content as modules in RL 10. However, in the future, additional application versions may be provided as RPM packages, software collections, or Flatpaks. +DNF modularity is deprecated, and Rocky Linux does not intend to provide AppStream content as modules in RL 10. In the future, RL 10 might provide additional application versions as RPM packages, software collections, or Flatpaks. ### Desktop Environment @@ -192,7 +191,7 @@ In RL 10, Wayland replaces the X.Org Server. Xwayland will support most X11 clie | GNOME Terminal | ptyxis terminal | | PulseAudio daemon (but not the client interfaces) | Pipewire (has already been the default in RL 9) | -Several graphical desktop applications are no longer included in the Rocky Linux 10 distribution. In most cases, these applications can be obtained from upstream sources or are available as Flatpaks on Flathub. +Several graphical desktop applications are no longer included in the Rocky Linux 10 distribution. In most cases, you can obtain these applications from upstream sources or as Flatpaks on Flathub. #### Removed Applications @@ -203,14 +202,14 @@ Several graphical desktop applications are no longer included in the Rocky Linux | Inkscape Vector Graphics Editor | There is no vector graphics editor included in RL 10, but you can find a Flatpak on Flathub. | | Totem (GNOME Videos) media player | There is no default desktop media player shipped in RL 10. The web browser can still play web-based media. Alternatively, you can choose a different media player from third-party repositories or as a Flatpak from Flathub. | -TigerVNC is removed from RL 10. For VNC client functionality, use the Connections application. No VNC server is provided -gnome-remote-desktop, using RDP, replaces TigerVNC for desktop sharing, remote login, and headless sessions. This is built into GNOME and can be configured in the Settings application. +TigerVNC is removed from RL 10. For VNC client functionality, use the Connections application. There is no VNC server provided. +gnome-remote-desktop, using RDP, replaces TigerVNC for desktop sharing, remote login, and headless sessions. This is built into GNOME and you can configure it in the Settings application. The Motif X11 desktop environment and toolkit are also removed from RL 10. ### Infrastructure Services -Some of the services and packages that are replaced or removed in RL 10 include the following infrastructure services. +Replacement or removal of some of the services and packages in RL 10 include the following infrastructure services. | Removed | Replacement | | :---- | :---- | @@ -223,40 +222,40 @@ Some of the services and packages that are replaced or removed in RL 10 include ### Dynamic Programming Languages -Several popular programming languages have been updated to their most recent versions. +There are updates to recent versions of several popular programming languages: -- Python 3.12 -- Ruby 3.3 -- Node.js 22.13 -- Perl 5.40 -- PHP 8.3 +* Python 3.12 +* Ruby 3.3 +* Node.js 22.13 +* Perl 5.40 +* PHP 8.3 ### Web Servers and Database Servers -A number of popular server daemons have also been updated to more recent versions. +There are updates to many popular server daemons to more recent versions: #### Web servers -- Apache HTTP Server 2.4.63 -- nginx 1.26 +* Apache HTTP Server 2.4.63 +* nginx 1.26 #### Proxy caching servers -- Varnish Cache 7.6 -- Squid 6.10 +* Varnish Cache 7.6 +* Squid 6.10 #### Database servers -- MariaDB 10.11 -- MySQL 8.4 -- PostgreSQL 16.8 -- Valkey 8.0 +* MariaDB 10.11 +* MySQL 8.4 +* PostgreSQL 16.8 +* Valkey 8.0 ### RL Web Console (Cockpit) Cockpit is a web-based interface for managing and monitoring your local system. A graphical file manager and text editor are now available in the web console if you install the `cockpit-files` RPM package. -The host switcher, which enabled multiple systems to be managed simultaneously, is deprecated and disabled by default due to security reasons. +The host switcher, which enabled the simultaneous management of multiple systems, is deprecated and disabled by default due to security reasons. Cockpit now supports configuring Stratis file-system size limits. @@ -268,7 +267,7 @@ When using a virtual host with a `passt` backend enabled and `memfd` type for me ### Grey screen after bootup of installation media -In specific hardware configurations, such as virtualized environments with 3D graphics enabled, you may experience Anaconda hanging before the setup wizard is displayed. This issue should be resolvable by switching away from tty6 to another tty and then back to tty6. For example, switch to tty1 and back to tty6 with: ++ctrl+alt+f1++ and then ++ctrl+alt+f6++. +In specific hardware configurations, such as virtualized environments with 3D graphics enabled, you may experience Anaconda hanging before the setup wizard is displayed. This issue should be resolvable by switching away from tty6 to another tty and then back to tty6. For example, switch to tty1 and back to tty6 with: ++ctrl+alt+f1++ and then ++ctrl+alt+f6++. ## Participating and reporting bugs From 7659ddc5077598d0ace5f057ca95bfd2cf87c000 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Thu, 12 Jun 2025 10:20:54 -0400 Subject: [PATCH 031/164] New Crowdin updates (#2742) * New translations import_rocky_to_wsl.md (Ukrainian) * New translations index.md (Ukrainian) * New translations index.md (Chinese Simplified) * New translations 9_6.md (Chinese Simplified) * New translations index.md (French) --- .../import_rocky_to_wsl.uk.md | 45 ++++-- docs/release_notes/9_6.zh.md | 138 ++++++++++++++++++ docs/release_notes/index.fr.md | 9 ++ docs/release_notes/index.uk.md | 9 ++ docs/release_notes/index.zh.md | 9 ++ 5 files changed, 197 insertions(+), 13 deletions(-) create mode 100644 docs/release_notes/9_6.zh.md diff --git a/docs/guides/interoperability/import_rocky_to_wsl.uk.md b/docs/guides/interoperability/import_rocky_to_wsl.uk.md index 0fc368c7f0..99382bda5c 100644 --- a/docs/guides/interoperability/import_rocky_to_wsl.uk.md +++ b/docs/guides/interoperability/import_rocky_to_wsl.uk.md @@ -1,7 +1,7 @@ --- title: Імпорт Rocky Linux до WSL або WSL2 author: Lukas Magauer -tested_with: 8.6, 9.0 +tested_with: 8.10, 9.6, 10.0 tags: - wsl - wsl2 @@ -21,17 +21,40 @@ tags: Тепер ця функція має бути доступна в усіх підтримуваних версіях Windows 10 і 11. +!!! tip "Версія WSL" + + Переконайтеся, що ваша версія WSL оновлена, оскільки деякі функції були представлені лише в пізніших версіях. Якщо ви не впевнені, виконайте команду `wsl --update`. + ## Кроки +### Встановлювані образи WSL (бажано) + +1. Завантажте образ WSL з CDN або іншого дзеркала, ближчого до вас: + + - 9: [x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-WSL-Base.latest.x86_64.wsl) або [aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-WSL-Base.latest.aarch64.wsl) + - 10: [x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-WSL-Base.latest.x86_64.wsl) або [aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-WSL-Base.latest.aarch64.wsl) + +2. Існує кілька варіантів встановлення образу `.wsl`: + + - Двічі клацніть на зображенні, і воно буде встановлено з ім'ям зображення за замовчуванням + - Встановіть образ через командний рядок: + + ```sh + wsl --install --from-file + ``` + +### Зображення звичайних контейнерів + 1. Отримайте контейнер rootfs. Це можливо кількома способами: - - **Бажано:** Завантажте зображення з CDN: + - Завантажте зображення з CDN: - 8: [Base x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-UBI.latest.aarch64.tar.xz) - 9: [Base x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-UBI.latest.aarch64.tar.xz) - - Видобудьте зображення з Docker Hub або Quay.io ([посил.](https://docs.microsoft.com/en-us/windows/wsl/use-custom-distro#export-the-tar-from-a -container)) + - 10: [Base x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-UBI.latest.aarch64.tar.xz) + - Витягніть образ з Docker Hub або Quay.io ([посилання.](https://docs.microsoft.com/en-us/windows/wsl/use-custom-distro#export-the-tar-from-a-container)) ```sh - export rockylinux:9 > rocky-9-image.tar + export rockylinux:10 > rocky-10-image.tar ``` 2. (необов’язково) Вам доведеться розпакувати файл .tar із файлу .tar.xz, якщо ви не використовуєте одну з останніх версій WSL @@ -41,27 +64,23 @@ tags: - WSL: ```sh - wsl --import + wsl --import --version 1 ``` - WSL 2: ```sh - wsl --import --version 2 + wsl --import --version 2 ``` !!! tip "WSL vs. WSL 2" - Взагалі кажучи, WSL 2 має бути швидшим за WSL, але це може відрізнятися від випадку використання до випадку використання. + Загалом кажучи, WSL 2 має бути швидшим за WSL, хоча це може відрізнятися залежно від випадку використання. !!! tip "Термінал Windows" - Якщо у вас встановлено термінал Windows, нова назва дистрибутива WSL з’явиться як опція в спадному меню, що дуже зручно для майбутніх запусків. Потім ви можете налаштувати його за допомогою кольорів, шрифтів тощо. + Якщо у вас встановлено термінал Windows, нова назва дистрибутива WSL з’явиться як опція у випадаючому меню, що досить зручно для запуску в майбутньому. Потім ви можете налаштувати його за допомогою кольорів, шрифтів та інших елементів. !!! tip "systemd" - Microsoft нарешті вирішила ввести systemd у WSL. Ця функція доступна в новій версії WSL із Microsoft Store. Вам потрібно лише додати `systemd=true` до розділу `boot` ini у файлі `/etc/wsl.conf`! ([ref.](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/#set-the-systemd-flag-set-in-your-wsl-distro-settings)) - -!!! tip "Microsoft Store" - - Немає зображення в Microsoft Store; якщо ви хочете допомогти це зробити, приєднуйтесь до розмови на каналі Mattermost SIG/Containers! Було [деяких зусиль](https://github.com/rocky-linux/WSL-DistroLauncher) давно, які можуть бути підхоплені знову. + Образ WSL за замовчуванням увімкнено для systemd. Якщо ви хочете використовувати образи контейнерів або створити свій власний, вам потрібно лише додати `systemd=true` до розділу `boot` у файлі `/etc/wsl.conf`. ([ref.](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/#set-the-systemd-flag-set-in-your-wsl-distro-settings)) diff --git a/docs/release_notes/9_6.zh.md b/docs/release_notes/9_6.zh.md new file mode 100644 index 0000000000..f7ba923d29 --- /dev/null +++ b/docs/release_notes/9_6.zh.md @@ -0,0 +1,138 @@ +--- +title: 当前发布 9.6 版本 +tags: + - 9.6 + - 9.6 release + - Rocky 9.6 +--- + +## Rocky Linux 9.6 发布说明 + +您可以在 [此处的上游发布说明](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/index) 中找到大多数变更的完整清单。 + +## 系统升级 + +您可以通过执行 `sudo dnf -y upgrade` 来完成从 Rocky Linux 9.x 到 Rocky Linux 9.6 的升级。 + +!!! note "说明" + + Rocky Linux 不提供任何 Rocky Linux 8 版本的升级途径。我们建议进行全新的操作系统安装以迁移到 Rocky Linux 9.6。 + +## 镜像 + +提供除正常安装镜像外的其他一些镜像,包含云和容器平台。 + +您可以在 [SIG/Cloud 维基页面](https://sig-cloud.rocky.page/) 上找到有关 Cloud Special Interest Group 制作镜像以及如何参与其中的更多信息。 + +### 镜像的构建工作流程和过程 + +随着 Rocky Linux 9.6 的发布,构建和交付镜像的过程在不断改进。 本版本大部分镜像由现代化构建工具 KIWI 生成,该工具可实现更一致且可维护的工作流程。 + +仍然使用 ImageFactory 构建的镜像包括 Vagrant(Libvirt、VirtualBox 和 VMware )和 OCP-Base(Oracle Cloud Platform)。 所有其他云和容器镜像现在都使用 KIWI 构建。 这种转换使我们能够在支持的平台上更频繁地发布更新并同时保持与历史版本功能一致。 + +若您遇到任何异常问题或行为差异,请及时反馈。 我们将尽快解决或说明所有意外变更。 + +### 新 WSL 镜像 + +‌除 KIWI 升级外,全新 WSL 镜像也同步推出!\ +这使得用户能够获得与 Microsoft Store 相同的开箱即用体验: + +- 下载镜像:[x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-WSL-Base.latest.x86_64.wsl) or [aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-WSL-Base.latest.aarch64.wsl) +- 要安装,请运行 `wsl --install --from-file path/to/file.wsl rocky-wsl-base` 或双击 wsl 文件 +- wsl 镜像第一次启动时会要求您指定一个用户名 + +在 [文档页面](https://docs.rockylinux.org/guides/interoperability/import_rocky_to_wsl/) 中查找更多详细信息。 + +## 安装 + +安装之前,[请确保 CPU 与此程序兼容!](https://docs.rockylinux.org/gemstones/test_cpu_compat/) + +要安装 Rocky Linux 9.6,请转到 [下载页面](https://rockylinux.org/download/) 并下载您架构所需的版本。 + +## Rocky 团队发布的亮点 + +### 新颖而引人注目的 + +## 重大变化 + +有关重大变化的完整清单,请参阅 [此处的上游清单](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/overview#overview-major-changes)。 + +接下来将详细介绍此版本中的一些亮点和新特性。 + +### 安全性 + +以下是最新发布的 Rocky Linux 9.6 中与安全相关的亮点。 有关安全相关更改的完整清单,请参阅 [此处的上游链接](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-security): + +- _‌_SELinux‌\*\* 现已提供额外的策略规则,用于限制 `iio-sensor-proxy`、`power-profiles-daemon`、`switcheroo-control` 和 `samba-bgqd` 等服务进程。 + +### 动态编程语言、web和数据库服务器 + +有关此类别更改的详细清单,请参阅 [此处的上游链接](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-dynamic-programming-languages-web-and-database-servers)。 + +以下模块流的最新版本现已可用: + +- **PHP 8.3** 模块流 +- **MySQL 8.4** 模块流 +- **nginx 1.26** 模块流 + +### 编译器和开发工具 + +有关此类别更改的详细清单,请参阅 [此处的上游链接](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-compilers-and-development-tools) + +更新了性能工具和调试器: + +- **Valgrind 3.24.0** +- **SystemTap 5.2** +- **elfutils 0.192** +- **libabigail 2.6** + +更新了性能监控工具: + +- **PCP 6.3.2** + +更新了编译器工具集: + +- **LLVM Toolset 19.17** +- **Rust Toolset 1.84.1** +- **Go Toolset 1.23** + +## 已知问题 + +### ‌ZFS 当前模块无法在 9.6 版本中加载 + +OpenZFS 最新发布的 `zfs` 模块将 **不会在 Rocky Linux 9.6 上加载**。 对于那些在 9.5 上使用 `zfs` 并计划升级到 `9.6` 的人,建议暂时不要升级。 如果您计划重新安装 9.6 并再次使用 `zfs`,则应该等待更新版模块的发布。 您可以在 [这里](https://github.com/openzfs/zfs/issues/17332) 和 [这里](https://github.com/openzfs/zfs/issues/17364) 关注这个问题。 + +### 在安装了 `passt` 的服务器、工作站或虚拟主机系统上触发 SELinux 问题 + +当使用安装了 `passt` 网络后端的工作站、服务器或虚拟主机时,若 SELinux 已经启用,则它们的网络接口将无法正常启动。 有关更多信息,请参阅 [此上游问题](https://issues.redhat.com/browse/RHEL-80407)。 + +### 已安装的 `gstreamer` 软件包升级失败 + +如果升级系统失败: + + ``` + Error: Transaction test error: + file /usr/lib64/gstreamer-1.0/libgstdvbsuboverlay.so from install of gstreamer1-plugins-bad-free-1.22.12-4.el9_6.x86_64 conflicts with file from package gstreamer1-plugins-bad-freeworld-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstsiren.so from install of gstreamer1-plugins-bad-free-1.22.12-4.el9_6.x86_64 conflicts with file from package gstreamer1-plugins-bad-freeworld-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstasf.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstdvdlpcmdec.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstdvdsub.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstrealmedia.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + ``` + +请停止升级过程并执行以下操作: + + ``` + sudo dnf swap gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 + sudo dnf swap gstreamer1-plugins-bad-freeworld-1:1.22.1-1.el9.x86_64 gstreamer1-plugins-bad-free-1.22.12-4.el9_6.x86_64 + ``` + +与其他版本一样,该版本也存在许多已知问题。 查阅 [上游清单](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/known-issues),了解有关这些问题的完整细节。 + +!!! info "废弃软件" + + 某些应用程序流(属于 Rocky Linux 9.6 存储库的一部分)将不会收到任何进一步的更新。这是几乎每个版本都会发生的正常情况。请确保您使用的是最新支持的软件包版本。 + +## 报告 bug + +请将您遇到的任何错误报告给 [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/)。 我们也欢迎您以任何方式加入我们的社区,不管是在我们的 [Forums](https://forums.rockylinux.org)、 [Mattermost](https://chat.rockylinux.org)、[IRC on Libera.Chat](irc://irc.liberachat/rockylinux)、 [Reddit](https://reddit.com/r/rockylinux)、[Mailing Lists](https://lists.resf.org),还是其他任何您希望参与的方式! diff --git a/docs/release_notes/index.fr.md b/docs/release_notes/index.fr.md index 047c94e79e..efd32db461 100644 --- a/docs/release_notes/index.fr.md +++ b/docs/release_notes/index.fr.md @@ -11,6 +11,14 @@ Bienvenue sur notre liste de notes de version et de changements pour Rocky Linux ## Versions Rocky Linux +## Rocky 10 + +Rocky 10 (nom de code « Red Quartz ») bénéficie d'un support général jusqu'au 31 mai 2030 et d'un support de sécurité jusqu'au 31 mai 2035. Les architectures supportées sont x86_64_v3, riscv64, aarch64, ppc64le ainsi que s390x. + +| Version | Date de disponibilité | Version du noyau | +| ------- | --------------------- | ---------------- | +| 10.0 | 2025-06-11 | 6.12.0-55.14.1 | + ## Rocky 9 ### Présentation @@ -27,6 +35,7 @@ Rocky 9 (Code Name "Blue Onyx") a un support général jusqu'au 31 mai 2027 et l | 9.3 | 2023-11-20 | 5.14.0-362.8.1 | | 9.4 | 2024-05-09 | 5.14.0-427.13.1 | | 9.5 | 2024-11-19 | 5.14.0-503.14.1 | +| 9.6 | 2025-06-04 | 5.14.0-570.18.1 | ## Rocky 8 diff --git a/docs/release_notes/index.uk.md b/docs/release_notes/index.uk.md index dbe6bc1592..dae5237f61 100644 --- a/docs/release_notes/index.uk.md +++ b/docs/release_notes/index.uk.md @@ -11,6 +11,14 @@ tags: ## Релізи Rocky Linux +## Rocky 10 + +Rocky 10 (кодова назва «Red Quartz») має загальну підтримку до 31 травня 2030 року та підтримку безпеки до 31 травня 2035 року. Підтримувані архітектури: x86_64_v3, riscv64, aarch64, ppc64le та s390x. + +| Номер випуску | Загальна дата доступності | Версія ядра | +| ------------- | ------------------------- | -------------- | +| 10.0 | 2025-06-11 | 6.12.0-55.14.1 | + ## Rocky 9 ### Огляд @@ -27,6 +35,7 @@ Rocky 9 (кодове ім’я «Blue Onyx») має загальну підт | 9.3 | 2023-11-20 | 5.14.0-362.8.1 | | 9.4 | 2024-05-09 | 5.14.0-427.13.1 | | 9.5 | 2024-11-19 | 5.14.0-503.14.1 | +| 9.6 | 2025-06-04 | 5.14.0-570.18.1 | ## Rocky 8 diff --git a/docs/release_notes/index.zh.md b/docs/release_notes/index.zh.md index ac525eca80..f718f9e71b 100644 --- a/docs/release_notes/index.zh.md +++ b/docs/release_notes/index.zh.md @@ -11,6 +11,14 @@ tags: ## Rocky Linux 发布 +## Rocky 10 + +Rocky 10(代号 "Red Quartz" )的一般支持直到2030年5月31日为止,安全支持直到2035年5月31日为止。 支持的架构是 x86_64-v3、 riscv64、aarch64、ppc64le 和 s390x。 + +| 发布版本号 | GA(General Availability)发布日期 | 内核版本 | +| ----- | ---------------------------- | -------------- | +| 10.0 | 2025-06-11 | 6.12.0-55.14.1 | + ## Rocky 9 ### 概述 @@ -27,6 +35,7 @@ Rocky 9(代号 "Blue Onyx" )的一般支持直到2027年5月31日为止, | 9.3 | 2023-11-20 | 5.14.0-362.8.1 | | 9.4 | 2024-05-09 | 5.14.0-427.13.1 | | 9.5 | 2024-11-19 | 5.14.0-503.14.1 | +| 9.6 | 2025-06-04 | 5.14.0-570.18.1 | ## Rocky 8 From c15ec6b8f9487b27303ed59266dcda3414d5f942 Mon Sep 17 00:00:00 2001 From: wale soyinka Date: Thu, 12 Jun 2025 12:42:19 -0400 Subject: [PATCH 032/164] rl-10.0 and rl-9.6 install guides, hardware_requirement notes. (#2747) --- docs/guides/.pages | 1 + docs/guides/9_6_installation.md | 286 +++++++++++++++++++ docs/guides/images/install_9_3_01.png | Bin 4437 -> 0 bytes docs/guides/images/installation_10_0_F01.png | Bin 0 -> 17981 bytes docs/guides/images/installation_10_0_F02.png | Bin 0 -> 12147 bytes docs/guides/images/installation_10_0_F03.png | Bin 0 -> 7054 bytes docs/guides/images/installation_9.0_F01.png | Bin 49872 -> 0 bytes docs/guides/images/installation_9.0_F02.png | Bin 29352 -> 0 bytes docs/guides/images/installation_9.2_F01.png | Bin 10396 -> 0 bytes docs/guides/images/installation_9_6_F01.png | Bin 0 -> 18076 bytes docs/guides/installation.md | 94 +++--- docs/guides/minimum_hardware_requirements.md | 124 ++++++++ 12 files changed, 457 insertions(+), 48 deletions(-) create mode 100644 docs/guides/9_6_installation.md delete mode 100644 docs/guides/images/install_9_3_01.png create mode 100644 docs/guides/images/installation_10_0_F01.png create mode 100644 docs/guides/images/installation_10_0_F02.png create mode 100644 docs/guides/images/installation_10_0_F03.png delete mode 100644 docs/guides/images/installation_9.0_F01.png delete mode 100644 docs/guides/images/installation_9.0_F02.png delete mode 100644 docs/guides/images/installation_9.2_F01.png create mode 100644 docs/guides/images/installation_9_6_F01.png create mode 100644 docs/guides/minimum_hardware_requirements.md diff --git a/docs/guides/.pages b/docs/guides/.pages index 5e11191373..c7dffa991d 100644 --- a/docs/guides/.pages +++ b/docs/guides/.pages @@ -1,6 +1,7 @@ nav: - ... | index*.md - ... | installation*.md + - ... | 9_6_installation*.md - ... | 8_6_installation*.md - ... | migrate2rocky*.md - ... | update_versions*.md diff --git a/docs/guides/9_6_installation.md b/docs/guides/9_6_installation.md new file mode 100644 index 0000000000..6df0c8c326 --- /dev/null +++ b/docs/guides/9_6_installation.md @@ -0,0 +1,286 @@ +--- +Title: Installing Rocky Linux 9 +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +--- + +# Installing Rocky Linux 9 + +This is a detailed guide for installing a 64-bit version of the Rocky Linux distribution on a standalone system. We will be performing a server class install. We will step through the installation and customization steps in the following sections. + +## OS Installation Prerequisites + +Download the ISO to use for this installation of Rocky Linux. +You can download the latest ISO image for the version of Rocky Linux for this installation here: + + + +To download the ISO directly from the command line on an existing Linux-based system, use the `wget` command: + +```bash +wget https://download.rockylinux.org/pub/rocky/9/isos/x86_64/Rocky-9.6-x86_64-minimal.iso +``` + +Rocky Linux ISOs follow this naming convention: + +```text +Rocky-.--.iso +``` + +For example, `Rocky-9.6-x86_64-minimal.iso` + +!!! Note + + The Rocky Project web page lists several mirrors located around the globe. Choose the mirror geographically closest to you. The list of official mirrors can be found [here](https://mirrors.rockylinux.org/mirrormanager/mirrors). + +## Verifying the Installation Program ISO File + +If you've downloaded the Rocky Linux ISO(s) on an existing Linux distribution, you can use the `sha256sum` utility to verify that file(s) you downloaded are not corrupt. We will show an example of verifying the `Rocky-9.6-x86_64-minimal.iso` file by checking its checksum. + +1. Download the file that contains the official checksums for the available ISOs. + +1. While still in the folder that contains the downloaded Rocky Linux ISO, download the checksum file for the ISO, type: + + ```bash + wget -O CHECKSUM https://download.rockylinux.org/pub/rocky/9/isos/x86_64/CHECKSUM + ``` + +1. Use the `sha256sum` utility to verify the integrity of the ISO file against corruption or tampering. + + ```bash + sha256sum -c CHECKSUM --ignore-missing + ``` + + This checks the integrity of the ISO file downloaded previously, provided that it is in the same directory. The output should show: + + ```text + Rocky-9.6-x86_64-minimal.iso: OK + ``` + +## The Installation + +!!! Tip + + Before installing properly, the system’s Unified Extensible Firmware Interface (UEFI) or Basic Input/Output System (BIOS) should be preconfigured to boot from the correct medium. + +If the computer is set up to boot from the media with the ISO file, we can begin the installation. + +1. Insert and boot from the installation medium (optical disk, USB flash drive, and so on). + +2. Once the computer has booted, you see the Rocky Linux 9.6 welcome splash screen. + + ![Rocky Linux installation splash screen](images/installation_9_6_F01.png) + +3. If you do not press any key, the installation program starts a countdown, after which the installation process automatically executes the default, highlighted, option: + + `Test this media & install Rocky Linux 9.6` + + You can also press ++enter++ at any time to start the process immediately. + +4. A quick media verification step takes place. +This media verification step can save you the trouble of starting the installation only to find out halfway through that the installation program has to stop because of bad installation media. + +5. After the media check runs to completion and the media is successfully verified to be usable, the installation program automatically continues to the next screen. + +6. Select the language you want to use to perform the installation in this screen. For this guide, we select *English (United States)*. Then click the ++"continue"++ button. + +## Installation Summary + +The `Installation Summary` screen is an all-in-one area where you make important decisions about installing the system. + +The screen is roughly divided into the following sections: + +- *LOCALIZATION* +- *SOFTWARE* +- *SYSTEM* +- *USER SETTINGS* + +We will delve into each of these sections next and make changes where necessary. + +### Localization Section + +This section customizes items related to the system's geographic location. This includes – Keyboard, Language Support, Time and Date. + +#### Keyboard + +In this guide's demo system, we accept the default value (*English US*) and make no changes. + +However, if you need to make any changes here, from the *Installation Summary* screen, click the ++"keyboard"++ option to specify the system's keyboard layout. Using the ++plus++ button, you can add additional keyboard layouts if you need to in the ensuing screen and even specify your preferred order. + +Click ++"done"++ when you are finished with this screen. + +#### Language Support + +The `Language Support` option on the *Installation Summary* screen lets you specify support for additional languages. + +We will accept the default value - **English (United States)** and make no change, click ++"done"++. + +#### Time & Date + +Click the ++"Time & Date"++ option on the main *Installation Summary* screen to bring up another screen that will allow you to select the time zone in which the machine is located. Scroll through the list of regions and cities and select the area closest to you. + +Depending on your installation source, the *Network Time* option could be set to *ON* or *OFF* by default. Accept the default *ON* setting; this allows the system to automatically set the correct time using the Network Time Protocol (NTP). + +Click ++"done"++ after making any changes. + +### Software Section + +Under the *Software* section of the *Installation Summary* screen, you can select or change the installation source as well as additional packages (applications) that get installed. + +#### Installation Source + +Because the installation uses a Rocky Linux 9.6 ISO image, you will notice that *Local Media* is automatically specified under the Installation Source section of the main *Installation Summary* screen. You can accept the preset defaults. + +!!! Tip + + The installation Source area allows you to perform a network-based installation (for example, if you use the Rocky Linux boot ISO - Rocky-9.6-x86_64-boot.iso). For a network-based installation, you need first to ensure that a network adapter on the target system is properly configured, and can reach the internet. To perform a network-based installation, click `Installation Source` and then select the `On the network` radio button. Once selected, choose the correct protocol and type in the URI for the installation source. Click `Done`. + +#### Software Selection + +Clicking the ++"Software Selection"++ option on the main *Installation Summary* screen presents you with the installation section where you can pick the exact software packages installed on the system. The software selection area is divided into: + +- **Base Environment**: Minimal Installation and Custom operating system +- **Additional software for Selected Environment**: Selecting a Base Environment on the left side presents a variety of related additional software to install for the given environment on the right side. + +Select the *Minimal Install* (Basic functionality) option. + +Click ++"done"++ at the top of the screen. + +### System Section + +The System section of the *Installation Summary* screen is used for customizing and making changes to things related to the underlying hardware of the target system. This is where you create your hard disk drive partitions or volumes, specify the file system, specify the network configuration, enable or disable KDUMP or select a Security Profile. + +#### Installation Destination + +From the *Installation Summary* screen, click the ++"Installation Destination"++ option. This takes you to the corresponding task area. + +You will see a screen displaying all the candidate disk drives that you have available on the target system. If you have only one disk drive on the system, as on our sample system, you see the drive listed under *Local Standard Disks* with a check mark beside it. Clicking the disk icon will toggle on or off the disk selection check mark. Keep it checked to select the disk. + +Under the *Storage Configuration* section: + +1. Select the ++"Automatic"++ radio button. + +2. Click ++"done"++ at the top of the screen. + +3. Once the installation program determines that you have a usable disk, it returns to the *Installation Summary* screen. + +### Network & Host Name + +The next important task of the installation procedure under the System area deals with network configuration, where you can configure or tweak network-related settings for the system. + +!!! Note + + After you click on the ++"Network & Hostname"++ option, all correctly detected network interface hardware (such as Ethernet, wireless network cards, and so on) will be listed in the left pane of the network configuration screen. Depending on your specific hardware setup, Ethernet devices in Linux have names similar to `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3`, and so on. + You can configure each interface using DHCP or manually set the IP address. + If you choose to configure manually, be sure to have all the required information ready, such as the IP address, netmask, and so on. + +Clicking the ++"Network & Hostname"++ button in the main *Installation Summary* screen opens the corresponding configuration screen. Here, you can configure the system's hostname. + +!!! Note + + You can easily change the system hostname later on after the OS has been installed. + +The next important configuration task is related to the network interfaces on the system. + +1. Verify that the left pane lists an Ethernet card (or any network card.) +2. Click any of the detected network devices in the left pane to select it. +The selected network adapter's configurable properties appear in the screen's right pane. + +!!! Note + + On our sample system, we have two Ethernet devices (`ens3` and `ens4`), all of which are in a connected state. The type, name, quantity, and state of the network devices on your system may vary from the ones on our demo system. + +Verify the switch of the device you want to configure is flipped to the `ON` (blue) position in the right pane. +We'll accept all the defaults in this section. + +Click ++"done"++ to return to the main *Installation Summary* screen. + +!!! Warning + + Pay attention to the IP address of the server in this section of this installer. If you don’t have physical or easy console access to the system, this information will come in handy later on when you need to connect to the server to continue working on it after the OS installation is completed. + +### User Settings Section + +This section can be used for creating a password for the `root` user account and also for creating new administrative or non-administrative accounts. + +#### Root Password + +1. Click the *Root Password* field under *User Settings* to start the *Root Password* task screen. + + !!! Warning + + The root superuser is the most privileged account on the system. Therefore, if you choose to use or enable it, it is crucial that you protect this account with a strong password. + +2. In the *Root Password* text box, set a strong password for the root user. + +3. Enter the same password again in the *Confirm* text box. + +4. Click ++"done"++. + +#### User Creation + +To create a user: + +1. Click the *User Creation* field under *User Settings* to start the *Create User* task screen. +This task area allows you to create a privileged or non-privileged (non-administrative) user account. + + !!! Info + + Creating and using a non-privileged account for day-to-day tasks on a system is a good system administration practice. + + We’ll create a regular user that can invoke superuser (administrator) powers when needed. + +2. Complete the fields in the *Create User* screen with the following information: + + - **Full name**: + `rockstar` + - **Username**: + `rockstar` + - **Make this user administrator**: + Checked + - **Require a password to use this account**: + Checked + - **Password**: + `04302021` + - **Confirm password**: + `04302021` + +3. Click ++"done"++. + +## Installer Phase + +Once you are satisfied with your choices for the various installation tasks, the next phase of the installation process will begin the installation proper. + +### Start the Installation + +Once you are satisfied with your choices for the various installation tasks, click the ++"Begin Installation"++ button on the main *Installation Summary* screen. + +The installation will begin, and the installation program will show the progress of the installation. +After the installation begins, various tasks will begin running in the background, such as partitioning the disk, formatting the partitions or LVM volumes, checking for and resolving software dependencies, writing the operating system to the disk, and so on. + +!!! Note + + If you do not wish to continue after clicking the Begin Installation button, you can still safely exit the installation without losing data. To quit the installer, simply reset your system by clicking the Quit button, pressing ctrl-alt-del on the keyboard, or pushing the reset or power switch. + +### Complete the Installation + +After the installation program has completed its work, you will see a final installation progress screen with a complete message. + +Finally, complete the entire procedure by clicking the ++"Reboot System"++ button. The system restarts. + +### Log In + +The system is now set up and ready for use. You will see the Rocky Linux console. + +![Rocky Linux Welcome Screen](images/installation_9_F02.png) + +To log onto the system: + +1. Type `rockstar` at the login prompt and press ++enter++. + +2. At the Password prompt, type `04302021` (rockstar’s password) and press ++enter++ (the password will ***not*** be echoed to the screen, that is normal). + +3. Run the `whoami` command after login. +This command shows the name of the currently logged in user. + +![Login Screen](images/installation_9.0_F03.png) diff --git a/docs/guides/images/install_9_3_01.png b/docs/guides/images/install_9_3_01.png deleted file mode 100644 index b9ccfef7622cd42c126a913744a1e3685a41b4f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4437 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 literal 0 HcmV?d00001 diff --git a/docs/guides/images/installation_10_0_F03.png b/docs/guides/images/installation_10_0_F03.png new file mode 100644 index 0000000000000000000000000000000000000000..d2095d1e5c40a2d5cc5607ecb725bf84f77c4b4f GIT binary patch literal 7054 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 literal 0 HcmV?d00001 diff --git a/docs/guides/images/installation_9.0_F01.png b/docs/guides/images/installation_9.0_F01.png deleted file mode 100644 index 165ff5ac6cf6995836827bde21d3cd2ef8652655..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49872 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 SIK%Q7($nf|p(+dGv_x93^D7>g52q zN~>+^Jz^1*0b=2%a5{bvFUsHnz%vd2o^SUmV01%pD_iLHBMYXz)W29IQqqY4MU6E1 zg@Ae)KN$U#y(A{jvw%j;8MGmZMo^=O0qCt(U}3H{YG7XO8j*V1KDb|_g+;s#)D@?f zXoKZSuE-<=uZ$`ieL+o$Y6NvW)jSA2s6I>}^4)D61O=#V2sO{&*qGK&K!$$m1~14* z7-O%UmXWxz+O$X|Q?@Ox-q@rMsqtgme)cZF zS+c?D0f3F3sYw048fu%E1M_Ln=29yl`JuZP#9_;tC3T5j+$4%|vlsh-(a;_6F7aEO>wfAm!kzpU4QN6GIrZ- zUr>|s@ntk-0|le0bA#G$#{s7oB9fB?yi63wmlr|?MkCx5LR9HcK>YwX0&%gHnJAFw z-~**dy;5;PQyfD{uXN)Nmip2rfa1!{MNlor<%?t5Y3Bhfcpa02z&LMe%W3 zZ9TS@Yr{~BA;SlurPUbB1hcs;rb7tyF zLSmaEi)#T9Rsd%ff)|6K<0{eE4WP83Oo%Z>o$~kr4DZJd7@jwlRW?OyyOkdItbWWMqI*a^n-SblW%#8+-6o8zsT`{7R`m zLfVuV9Iop&c0$e%+t77sc^t5>A@I1T;CV!tb2Q|@Z8L~SPpe;aqoKo*VvMW`;n9Ol zn*l(g;pq#3QU}Nrx8qEUJfs*>DgYR0yO34akU~C8Xl40|tX{mzZAuZTo`BRVz(GW0 zR$xupC`7m}Q{iR>ubAX&{{U8$kIHuEonvC7Nj23*0eC%v5)9{yUUW+yXF@OAC97wF z15YGZcTb$&Z=Y-&|0S`#b6P6h&=d=-G=oah)Jp_$iRlCAUT;lj2_q7q`k4$DB1H%M ztGr8G3}-R3l2(fXuQ%bae~^LuMofoZe<-VfG$BV?6sy2mB-v=Np2Bc>ePm@tJKl*8 zkS_OQg$T$?64yjh&!<$!dp8CHCEy?1J|qt5}GF43dIC1bB1OqeFi2qYC_a~BUlg9s(yR8hmo zvBMo3dT!Zs*BJjeZTnNG^D!Mb)-sHWGEV{lDzEKh4g`c5%wdAY9^CD4*&<`sDSnfW z_r5nDkFl44GOmoxm$VGmT+KU^J11+REE)Gt7P!pn`9BX$o^^%0jM`{>c+JgTK9*2h z`|#=87P&D{rI%WEDJL(_|#`r+=&BGG+V=PLpE`AJ4)q@&4p@3fT;-oaLiCw%^dGVtUUOJ$|CEuxT?Hba!l!EwpB^6a z?-xUWynl#xV9BE@FscHhR$$Z$j2;A|2f?r}kne3l*x4=m9O@VM&ogh}lTp85)GrtW z1pm8&jJk%SuHk5OFd7|<28g2p;%JUwG)FL+CK^o>jb;i*Gliqc;?ZRB|FwESPrN<&ADPe&O$vThri$!$vBG)x!@ zAqI_wQj;dEE(xez>-Z+4pNs;~!LGy=#y6#>7{@#4pAVf@O|Hv_8nBTu61I^CPy>1% zy;cBV2eu*-Ti@IsaH2CO{+cY>mcq2b?tquv@c@zJt@`9;t8Vpp)KJCY1k{#B`LyHQ zU|FGb+jY~o`I)?<(w!YN{gM{AwZA}Z3l*D606%Q5yLiokxaGkRWF+Z9P=V6Gv9IkO zY|A!KV1c0kS83Gi*1;D~lXnb^<}#TwrN7e>^uX|-D3)lG^oe=x0b<=4mq|#T6G`{m zt;T>*nojzE8f?#g?YVp4)o}g~fx=6|RFNYCOBI;inW|t=y98|;`H7%0P)wI%As4{# z!29q)*crHlE@M!3lw>hEFCKJKj0GrCWEF#2%dB)`4B{0T04hji8FEbG-L#gHMs-_X zIMxC{aS}Yw7yNm=M2hl7`yvK-@AkGif6nmhw6HCJ&dBVHm^XC3XRn>i6nIq5@NRcO zQA7A#fN~2KYQi*Z2>HS%0jQyjZ7B?|Vg$9Z5+O996kt69s~GBrtGetynlFR`xNRvU zVY`f-W(+9L5{%D4j{qknsfm^eXQ@$G7BSl5?ylY~gnRLH*?Q37K$0(in1%{(V}WjJ z&-iapA3&}z3!#QMjrh(tZ@{j0-OlR?v3&hST(Gq$Jd}t8?GI{&q}%e<330_%5rpFF zj`dULCYIP1+{&YU_SpL9b2@E1`BLJ(ncSa!mjak^|bHMNPr|bSM_#q1EmrXXc9^GIB3Q2;Fsau@z4^?ioME19L>9`>IqC6 z_^T70Z~pG!-syMH30U+o&_aRmV3;LzO{ZUkR;h5~rUgo)Ndru|r2;^kbO2Cc5<%Y! zGsfCfdJU)7D3T6IK<_m~HoGdvG%uBmFUb^-43x(i_)Z(Ruw6llS_@_G}8IQ%)oX~XhswTKU7%$ON&ux z7k^i-a14e1Navp0+KNL2uxkMZ#aP?X_UVkOO4Zz*w}1#PWxQ?kKopiX$Lgq%Mm$XN zXQ}J@*`@;RZPIOR2oq)-qF!(#iK4*aWp7Ox^kRKv)+P5hrp&>fjy?kMKjbP<$$RJE zzSP9o=`w&nAywi~tqGQc5?@B8#2IPYOQZ~FB`bD7D?xim&^0!j2xCbgi_snb%nw>b zlr4&g62oj7aYjb(VM5;uST+?l)MX=C0<}gcq2ASl7KGqf zLVt1BI4&5>@nZrc3wJ9(?j7>K#&et9TQ`pga1-d63Ob{jyKq?l zfrX&EOR9kZt?Q4G2n+%X1hrC0fUMw`sl?lm=&Tsg|JsxEIo~{EjxGLp^7N0Ax?cvc zqaf;b1ECpadSKU2>Lw3;~lxYYcwdh4Ob%xtPF-S_VLRd4Xp zqs#HgHOG9}_3!?d)YZNR);;^5%?GZ2^97!QH!B>p=w^TRn%`GDqyaPNev2td;m3=MzjNSd9`ZnJ_@jc}9#(fb9 zU%8iQu3Oh`5}#$I|g{HgYQq^ z;>ozX|6l(3buZR_Zv9#N-*?{5t^zK9S`S?Qw6Y#}{@&`+?E1*{z?FB8fOXQo*t_fI z-=7wLfAhZkTjcg1nG0Nm)U$H>^Sn9VUVkzI`V(ge!de~h#Sg&4FC>6PqkM6Q6ylO) zwB;CRu`p@|YN{L!k6{}g|NN`V0$6~jwmWR7&$c|5!+cE`+fpM*#^b(eT8{7{9VvH# zChr={8IPa+edrfr85-J@-l+c3@Ec7(qxlC*O)^@3jFz9H^+zM4h|Z_YruR%67=Xaj L)z4*}Q$iB}v`G}8 diff --git a/docs/guides/images/installation_9.0_F02.png b/docs/guides/images/installation_9.0_F02.png deleted file mode 100644 index b530728a7bda2afbf1fa4acf2a9483dbc72b5a2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29352 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 DEQ)kn diff --git a/docs/guides/images/installation_9.2_F01.png b/docs/guides/images/installation_9.2_F01.png deleted file mode 100644 index 5e0d46b59924951b280601960804b8642ecedd28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10396 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 V_@4vE4L?V+cbC`BqU|Rx{SO-KTkik> literal 0 HcmV?d00001 diff --git a/docs/guides/installation.md b/docs/guides/installation.md index d45bea8fbc..c68dbb89c2 100644 --- a/docs/guides/installation.md +++ b/docs/guides/installation.md @@ -1,10 +1,10 @@ --- -Title: Installing Rocky Linux 9 +Title: Installing Rocky Linux 10 author: Wale Soyinka -contributors: Steven Spencer, Ganna Zhyrnova +contributors: --- -# Installing Rocky Linux 9 +# Installing Rocky Linux 10 This is a detailed guide for installing a 64-bit version of the Rocky Linux distribution on a standalone system. We will be performing a server class install. We will step through the installation and customization steps in the following sections. @@ -18,7 +18,7 @@ You can download the latest ISO image for the version of Rocky Linux for this in To download the ISO directly from the command line on an existing Linux-based system, use the `wget` command: ```bash -wget https://download.rockylinux.org/pub/rocky/9/isos/x86_64/Rocky-9.3-x86_64-minimal.iso +wget https://download.rockylinux.org/pub/rocky/10/isos/x86_64/Rocky-10.0-x86_64-minimal.iso ``` Rocky Linux ISOs follow this naming convention: @@ -27,7 +27,7 @@ Rocky Linux ISOs follow this naming convention: Rocky-.--.iso ``` -For example, `Rocky-9.3-x86_64-minimal.iso` +For example, `Rocky-10.0-x86_64-minimal.iso` !!! Note @@ -35,14 +35,14 @@ For example, `Rocky-9.3-x86_64-minimal.iso` ## Verifying the Installation Program ISO File -If you've downloaded the Rocky Linux ISO(s) on an existing Linux distribution, you can use the `sha256sum` utility to verify that file(s) you downloaded are not corrupt. We will show an example of verifying the `Rocky-9.3-x86_64-minimal.iso` file by checking its checksum. +If you've downloaded the Rocky Linux ISO(s) on an existing Linux distribution, you can use the `sha256sum` utility to verify that file(s) you downloaded are not corrupt. We will show an example of verifying the `Rocky-10.0-x86_64-minimal.iso` file by checking its checksum. 1. Download the file that contains the official checksums for the available ISOs. 1. While still in the folder that contains the downloaded Rocky Linux ISO, download the checksum file for the ISO, type: ```bash - wget -O CHECKSUM https://download.rockylinux.org/pub/rocky/9.3/isos/x86_64/CHECKSUM + wget -O CHECKSUM https://download.rockylinux.org/pub/rocky/10/isos/x86_64/CHECKSUM ``` 1. Use the `sha256sum` utility to verify the integrity of the ISO file against corruption or tampering. @@ -54,39 +54,38 @@ If you've downloaded the Rocky Linux ISO(s) on an existing Linux distribution, y This checks the integrity of the ISO file downloaded previously, provided that it is in the same directory. The output should show: ```text - Rocky-9.3-x86_64-minimal.iso: OK + Rocky-10.0-x86_64-minimal.iso: OK ``` ## The Installation !!! Tip - Before installing properly, the system’s Unified Extensible Firmware Interface (UEFI) or Basic Input/Output System (BIOS) should be preconfigured to boot from the correct medium. + Before starting the installation, ensure that the system’s Unified Extensible Firmware Interface (UEFI) or Basic Input/Output System (BIOS) is properly configured to boot from the correct medium. + Also make sure that you review the recommended [minimum hardware requirements](minimum_hardware_requirements.md) notes for running Rocky Linux 10. -If the computer is set up to boot from the media with the ISO file, we can begin the installation. +Once the system is set up to boot from the media with the ISO file, we can begin the installation. 1. Insert and boot from the installation medium (optical disk, USB flash drive, and so on). -2. Once the computer has booted, you see the Rocky Linux 9 welcome splash screen. +2. Once the computer has booted, you see the Rocky Linux 10 installer splash screen. - ![Rocky Linux installation splash screen](images/install_9_3_01.png) + ![Rocky Linux installation splash screen](images/installation_10_0_F01.png) -3. If you do not press any key, the installation program starts a countdown, after which the installation process automatically executes the default, highlighted, option: +3. At the welcome screen, you can use the ++"up"++ or ++"down"++ arrow keys to select any of the options followed by pressing ++enter++ to execute the selected option. If you do not press any key, the installation program starts a countdown, after which the installation process automatically executes the default, highlighted, option: - `Test this media & install Rocky Linux 9.3` - - You can also press ++enter++ at any time to start the process immediately. + `Test this media & install Rocky Linux 10.0` 4. A quick media verification step takes place. This media verification step can save you the trouble of starting the installation only to find out halfway through that the installation program has to stop because of bad installation media. -5. After the media check runs to completion and the media is successfully verified to be usable, the installation program automatically continues to the next screen. +1. After the media check runs to completion and the media is successfully verified to be usable, the installation program automatically continues to the next screen. -6. Select the language you want to use to perform the installation in this screen. For this guide, we select *English (United States)*. Then click the ++"continue"++ button. +2. Select the language you want to use to perform the installation in this screen. For this guide, we select *English (United States)*. Then click the ++"continue"++ button. ## Installation Summary -The `Installation Summary` screen is an all-in-one area where you make important decisions about installing the system. +The `Installation Summary` screen is an all-in-one area where you make important decisions about the system to be installed. The screen is roughly divided into the following sections: @@ -105,7 +104,7 @@ This section customizes items related to the system's geographic location. This In this guide's demo system, we accept the default value (*English US*) and make no changes. -However, if you need to make any changes here, from the *Installation Summary* screen, click the ++"keyboard"++ option to specify the system's keyboard layout. Using the ++plus++ button, you can add additional keyboard layouts if you need to in the ensuing screen and even specify your preferred order. +However, if you need to make any changes here, from the *Installation Summary* screen, click the ++"keyboard"++ option to specify the system's keyboard layout. Using the ++plus++ button, you can add and order additional keyboard layouts as necessary. Click ++"done"++ when you are finished with this screen. @@ -117,30 +116,30 @@ We will accept the default value - **English (United States)** and make no chang #### Time & Date -Click the ++"Time & Date"++ option on the main *Installation Summary* screen to bring up another screen that will allow you to select the time zone in which the machine is located. Scroll through the list of regions and cities and select the area closest to you. +Click the ++"Time & Date"++ option on the main *Installation Summary* screen to bring up another screen that will allow you to select the time zone in which the machine is located. Use the drop down arrows to select the region and city closest to you. -Depending on your installation source, the *Network Time* option could be set to *ON* or *OFF* by default. Accept the default *ON* setting; this allows the system to automatically set the correct time using the Network Time Protocol (NTP). +Accept the default and enabled ++"Automatic date & time"++ option which allows the system to automatically set the correct time abd date using the Network Time Protocol (NTP). -Click ++"done"++ after making any changes. +Click ++"done"++ once completed. ### Software Section -Under the *Software* section of the *Installation Summary* screen, you can select or change the installation source as well as additional packages (applications) that get installed. +Under the *Software* section of the *Installation Summary* screen, you can select or change the installation source as well as add additional software packages for the selected environment. #### Installation Source -Because the installation uses a Rocky Linux 9 ISO image, you will notice that *Local Media* is automatically specified under the Installation Source section of the main *Installation Summary* screen. You can accept the preset defaults. +Because we are using a Rocky Linux 10 ISO image for the installation, the Auto-detected source option is automatically selected for us by default. Accept the preset default installation source. !!! Tip - The installation Source area allows you to perform a network-based installation (for example, if you use the Rocky Linux boot ISO - Rocky-9.3-x86_64-boot.iso). For a network-based installation, you need first to ensure that a network adapter on the target system is properly configured, and can reach the internet. To perform a network-based installation, click `Installation Source` and then select the `On the network` radio button. Once selected, choose `https` as the protocol and type the following URL in the text field `download.rockylinux.org/pub/rocky/9/BaseOS/x86_64/os`. Click `Done`. + The installation Source area allows you to perform a network-based installation (for example, if you use the Rocky Linux boot ISO - Rocky-10.0-x86_64-boot.iso). For a network-based installation, you need first to ensure that a network adapter on the target system is properly configured, and can reach the installation source(s) over the network (lan or internet)internet. To perform a network-based installation, click `Installation Source` and then select the `On the network` radio button. Then select the correct protocol and type the correct URI. Click `Done`. #### Software Selection -Clicking the ++"Software Selection"++ option on the main *Installation Summary* screen presents you with the installation section where you can pick the exact software packages installed on the system. The software selection area is divided into: +Clicking the ++"Software Selection"++ option on the main *Installation Summary* screen presents you with a software selection area that is divided into: -- **Base Environment**: Minimal Installation and Custom operating system -- **Additional software for Selected Environment**: Selecting a Base Environment on the left side presents a variety of related additional software to install for the given environment on the right side. Note that this only applies if you were installing from a full Rocky Linux 9.2 DVD or have additional repositories configured. +- **Base Environment**: Minimal Installation +- **Additional software for Selected Environment**: Selecting a Base Environment on the left side presents a selection of additional software to install for the given environment on the right side. Select the *Minimal Install* (Basic functionality) option. @@ -148,7 +147,7 @@ Click ++"done"++ at the top of the screen. ### System Section -The System section of the *Installation Summary* screen is used for customizing and making changes to things related to the underlying hardware of the target system. This is where you create your hard disk drive partitions or volumes, specify the file system, specify the network configuration, enable or disable KDUMP or select a Security Profile. +The System section of the *Installation Summary* screen is used for customizing and making changes to things related to the underlying hardware of the target system. This is where you create your hard disk drive partitions or volumes, specify the file system, specify the network configuration, enable or disable KDUMP. #### Installation Destination @@ -170,25 +169,25 @@ The next important task of the installation procedure under the System area deal !!! Note - After you click on the ++"Network & Hostname"++ option, all correctly detected network interface hardware (such as Ethernet, wireless network cards, and so on) will be listed in the left pane of the network configuration screen. Depending on your specific hardware setup, Ethernet devices in Linux have names similar to `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3`, and so on. + After you click on the ++"Network & Host Name"++ option, all correctly detected network interface hardware (such as Ethernet, wireless network cards, and so on) will be listed in the left pane of the network configuration screen. Depending on your specific hardware setup, Ethernet devices in Linux have names similar to `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3`, and so on. You can configure each interface using DHCP or manually set the IP address. If you choose to configure manually, be sure to have all the required information ready, such as the IP address, netmask, and so on. -Clicking the ++"Network & Hostname"++ button in the main *Installation Summary* screen opens the corresponding configuration screen. Here, you can configure the system's hostname. +Clicking the ++"Network & Host Name"++ button in the main *Installation Summary* screen opens the corresponding configuration screen. Here, you can also configure the system's hostname. !!! Note You can easily change the system hostname later on after the OS has been installed. -The next important configuration task is related to the network interfaces on the system. +The next configuration task is related to the network interfaces on the system. -1. Verify that the left pane lists an Ethernet card (or any network card.) +1. Verify that the left pane lists a network adapter/card 2. Click any of the detected network devices in the left pane to select it. The selected network adapter's configurable properties appear in the screen's right pane. !!! Note - On our sample system, we have two Ethernet devices (`ens3` and `ens4`), all of which are in a connected state. The type, name, quantity, and state of the network devices on your system may vary from the ones on our demo system. + On our sample system, we have two Ethernet devices (`ens3` and `ens4`), both of which are in a connected state. The type, name, quantity, and state of the network devices on your system may vary from the ones on our demo system. Verify the switch of the device you want to configure is flipped to the `ON` (blue) position in the right pane. We'll accept all the defaults in this section. @@ -197,7 +196,7 @@ Click ++"done"++ to return to the main *Installation Summary* screen. !!! Warning - Pay attention to the IP address of the server in this section of this installer. If you don’t have physical or easy console access to the system, this information will come in handy later on when you need to connect to the server to continue working on it after the OS installation is completed. + Pay attention to the IP address of the server in this section of this installer. If you don’t have physical or easy console access to the system, this information will come in handy later on when you need to connect to the server after the OS installation is completed. ### User Settings Section @@ -205,17 +204,16 @@ This section can be used for creating a password for the `root` user account and #### Root Password -1. Click the *Root Password* field under *User Settings* to start the *Root Password* task screen. +1. Click the *Root Password* field under *User Settings* to start the *Root Account* task screen. !!! Warning The root superuser is the most privileged account on the system. Therefore, if you choose to use or enable it, it is crucial that you protect this account with a strong password. -2. In the *Root Password* text box, set a strong password for the root user. - -3. Enter the same password again in the *Confirm* text box. +2. You'll be presented with the option to either "Disable root account" OR "Enable root account". +Accept the default. -4. Click ++"done"++. +3. Click ++"done"++. #### User Creation @@ -224,19 +222,19 @@ To create a user: 1. Click the *User Creation* field under *User Settings* to start the *Create User* task screen. This task area allows you to create a privileged or non-privileged (non-administrative) user account. - !!! Info + !!! Caution - Creating and using a non-privileged account for day-to-day tasks on a system is a good system administration practice. + On a Rocky Linux 10 system, the Root account is disabled by default and so it is important to ensure that the user account created during the OS installation has administrative privileges. This user can be used in a non-privileged manner for day-to-day tasks on the system and will also have the ability to elevate their role to perform administrative (root) functions as necessary. We’ll create a regular user that can invoke superuser (administrator) powers when needed. -2. Complete the fields in the *Create User* screen with the following information: +1. Complete the fields in the *Create User* screen with the following information: - **Full name**: `rockstar` - **Username**: `rockstar` - - **Make this user administrator**: + - **Add administrative privileges to this user account (wheel group membership)**: Checked - **Require a password to use this account**: Checked @@ -245,7 +243,7 @@ This task area allows you to create a privileged or non-privileged (non-administ - **Confirm password**: `04302021` -3. Click ++"done"++. +2. Click ++"done"++. ## Installer Phase @@ -260,7 +258,7 @@ After the installation begins, various tasks will begin running in the backgroun !!! Note - If you do not wish to continue after clicking the Begin Installation button, you can still safely exit the installation without losing data. To quit the installer, simply reset your system by clicking the Quit button, pressing ctrl-alt-del on the keyboard, or pushing the reset or power switch. + If you do not wish to continue after clicking the Begin Installation button, you can still safely exit the installation without losing data. To quit the installer, simply reset your system by clicking the ++Quit++ button, pressing ctrl-alt-del on the keyboard, or pushing the reset or power switch. ### Complete the Installation @@ -272,7 +270,7 @@ Finally, complete the entire procedure by clicking the ++"Reboot System"++ butto The system is now set up and ready for use. You will see the Rocky Linux console. -![Rocky Linux Welcome Screen](images/installation_9_F02.png) +![Rocky Linux Welcome Screen](images/installation_10_0_F02.png) To log onto the system: diff --git a/docs/guides/minimum_hardware_requirements.md b/docs/guides/minimum_hardware_requirements.md new file mode 100644 index 0000000000..e5ff02f24d --- /dev/null +++ b/docs/guides/minimum_hardware_requirements.md @@ -0,0 +1,124 @@ +# Rocky Linux 10 (Red Quartz) – Minimum Hardware Requirements + +Rocky Linux 10 is designed for enterprise-grade stability with modern hardware compatibility. These minimum specifications apply to **minimal server installations**. For GUI or production environments, higher specifications are recommended. + +--- + +## ✅ Supported CPU Architectures + +According to the Rocky Linux 10.0 Release Notes, Rocky Linux 10 officially supports the following architectures : + +- **x86_64-v3** (Intel/AMD 64-bit CPUs with at least Haswell or equivalent AVX support) +- **aarch64** (ARMv8-A 64-bit) +- **ppc64le** (IBM Power, Little Endian) +- **s390x** (IBM Z mainframes) +- **riscv64** (RISC‑V 64-bit) + +### ⚠️ CPU Feature Requirements + +- **x86_64‑v3** requires AVX, AVX2, BMI1/2, FMA, etc., corresponding to Intel Haswell or later, AMD Excavator or newer . +- Older x86_64 revisions (v1/v2) are **not supported** unless rebuilt by community SIGs. + +--- + +## 🧠 CPU (Processor) + +- **1 GHz 64-bit (x86_64‑v3)** or equivalent for other architectures +- Multi-core CPUs recommended for server, desktop, or virtualization use + +--- + +## 💾 Memory (RAM) + +- **2 GB** minimum (text-mode install) +- **4 GB+** recommended for GUI installs +- **4–8 GB+** for production workloads or virtualization + +--- + +## 💽 Storage + +- **10 GB** minimum disk space +- **20 GB+** recommended to accommodate updates, logs, applications +- For GUI: **40 GB+** to ensure sufficient space + +--- + +## 🌐 Network + +- At least one functional Ethernet or wireless network adapter +- Supports DHCP or static IP configuration via NetworkManager + +--- + +## 🖥️ Display (for GUI installations) + +- Minimum **1024×768** resolution via VGA, HDMI, or DisplayPort +- Not required for minimal server installs + +--- + +## 📀 Media Access + +- USB port (for live USB installer) or DVD-ROM drive +- Cloud installs support ISO or PXE-based installations + +--- + +## 🔒 Firmware + +- UEFI or BIOS booting is supported; **UEFI recommended** +- Secure Boot supported (may require manual key enrollment) + +--- + +## 🗃️ Virtualization Support + +- Virtual environments (KVM, VMware, VirtualBox, Hyper-V) supported +- Guest tools (e.g., open-vm-tools, qemu-guest-agent) recommended for optimized performance + +--- + +## 📝 Summary Table + +| Component | Minimum Requirement | +|------------------|--------------------------------------------------------| +| **CPU** | 1 GHz 64-bit (AVX-capable x86_64-v3) or equivalent for ARM/POWER/Z/RISC-V | +| **RAM** | 1 GB (2 GB for GUI) | +| **Disk Space** | 10 GB (20 GB+ recommended; 40 GB+ for GUI) | +| **Network** | Ethernet or wireless adapter | +| **Display** | 1024×768 capable (only for GUI) | +| **Media Access**| USB or DVD-ROM | +| **Firmware** | UEFI/BIOS (UEFI recommended); Secure Boot optional | + +--- + +## 🎯 Recommended Specs by Use‑Case + +### 🏗️ Minimal Server +- CPU: 1 core x86_64-v3 (or ARM/POWER/Z/RISC‑V) +- RAM: 1 GB +- Storage: 10–20 GB + +### 🖥️ Desktop with GUI +- CPU: 2+ cores x86_64-v3 (or equivalent) +- RAM: 2–4 GB +- Storage: 20–40 GB + +### 🛠️ Development/Production Server +- CPU: 4+ cores +- RAM: 4–8 GB+ +- Storage: 40 GB+ (based on workload needs) + +--- + +## 🧩 Additional Notes + +- Always allocate extra storage for logs, package updates, and backups. +- For cloud or virtualization, choose instance types meeting or exceeding the above specs. +- Upgrades from earlier Rocky releases (e.g., 8 or 9) to Rocky 10 aren’t supported—**clean installation required**. + +--- + +**Last updated**: June 2025 +**Applies to**: Rocky Linux 10.0 Initial Release From 1e37520d1ab9be54c4d342e8d822ff68cd85387d Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Thu, 12 Jun 2025 13:26:25 -0500 Subject: [PATCH 033/164] Editing install documents: (#2748) * `9_6_installation.md` updated 9 install * `installation.md` (new 10.0 installation) * `minimum_hardware_rquirements.md` (again, for 10.0) summary: * replace contractions with words as much as possible * replace most (not all) passive voice phrases with active voice * fix some numbered list issues in the `installation.md` document * some sentence simplification * fix some button display issues (keyboard commands) * some spelling issues fixed (just typos) * on `minimum_hardware_requirements.md` the only issue was the missing space after the headings which the editor inserted on its own --- docs/guides/9_6_installation.md | 42 ++++++------- docs/guides/installation.md | 65 ++++++++++---------- docs/guides/minimum_hardware_requirements.md | 3 + 3 files changed, 56 insertions(+), 54 deletions(-) diff --git a/docs/guides/9_6_installation.md b/docs/guides/9_6_installation.md index 6df0c8c326..1d181b48bb 100644 --- a/docs/guides/9_6_installation.md +++ b/docs/guides/9_6_installation.md @@ -6,9 +6,9 @@ contributors: Steven Spencer, Ganna Zhyrnova # Installing Rocky Linux 9 -This is a detailed guide for installing a 64-bit version of the Rocky Linux distribution on a standalone system. We will be performing a server class install. We will step through the installation and customization steps in the following sections. +This is a detailed guide for installing a 64-bit version of the Rocky Linux distribution on a standalone system. We will be performing a server class install, and stepping through the installation and customization options. -## OS Installation Prerequisites +## Operating System Installation Prerequisites Download the ISO to use for this installation of Rocky Linux. You can download the latest ISO image for the version of Rocky Linux for this installation here: @@ -51,7 +51,7 @@ If you've downloaded the Rocky Linux ISO(s) on an existing Linux distribution, y sha256sum -c CHECKSUM --ignore-missing ``` - This checks the integrity of the ISO file downloaded previously, provided that it is in the same directory. The output should show: + This checks the integrity of the ISO file downloaded previously, provided that it is in the same directory. You should see this output: ```text Rocky-9.6-x86_64-minimal.iso: OK @@ -59,11 +59,11 @@ If you've downloaded the Rocky Linux ISO(s) on an existing Linux distribution, y ## The Installation -!!! Tip +!!! tip Before installing properly, the system’s Unified Extensible Firmware Interface (UEFI) or Basic Input/Output System (BIOS) should be preconfigured to boot from the correct medium. -If the computer is set up to boot from the media with the ISO file, we can begin the installation. +If you set the computer up to boot from the media with the ISO file, you can begin the installation. 1. Insert and boot from the installation medium (optical disk, USB flash drive, and so on). @@ -78,7 +78,7 @@ If the computer is set up to boot from the media with the ISO file, we can begin You can also press ++enter++ at any time to start the process immediately. 4. A quick media verification step takes place. -This media verification step can save you the trouble of starting the installation only to find out halfway through that the installation program has to stop because of bad installation media. +This media verification step can save you the trouble of starting the installation only to discover halfway through that the installation program has to stop because of bad installation media. 5. After the media check runs to completion and the media is successfully verified to be usable, the installation program automatically continues to the next screen. @@ -107,7 +107,7 @@ In this guide's demo system, we accept the default value (*English US*) and make However, if you need to make any changes here, from the *Installation Summary* screen, click the ++"keyboard"++ option to specify the system's keyboard layout. Using the ++plus++ button, you can add additional keyboard layouts if you need to in the ensuing screen and even specify your preferred order. -Click ++"done"++ when you are finished with this screen. +When you finish with this screen, click ++"done"++. #### Language Support @@ -117,9 +117,9 @@ We will accept the default value - **English (United States)** and make no chang #### Time & Date -Click the ++"Time & Date"++ option on the main *Installation Summary* screen to bring up another screen that will allow you to select the time zone in which the machine is located. Scroll through the list of regions and cities and select the area closest to you. +Click the ++"Time & Date"++ option on the main *Installation Summary* screen to bring up another screen that allows for the selection of the timezone where the machine is. Scroll through the list of regions and cities and select the area closest to you. -Depending on your installation source, the *Network Time* option could be set to *ON* or *OFF* by default. Accept the default *ON* setting; this allows the system to automatically set the correct time using the Network Time Protocol (NTP). +Depending on your installation source, the *Network Time* option might be *ON* or *OFF* by default. Accept the default *ON* setting. This allows the system to automatically set the correct time by using the Network Time Protocol (NTP). Click ++"done"++ after making any changes. @@ -133,11 +133,11 @@ Because the installation uses a Rocky Linux 9.6 ISO image, you will notice that !!! Tip - The installation Source area allows you to perform a network-based installation (for example, if you use the Rocky Linux boot ISO - Rocky-9.6-x86_64-boot.iso). For a network-based installation, you need first to ensure that a network adapter on the target system is properly configured, and can reach the internet. To perform a network-based installation, click `Installation Source` and then select the `On the network` radio button. Once selected, choose the correct protocol and type in the URI for the installation source. Click `Done`. + The installation Source area allows you to perform a network-based installation (for example, if you use the Rocky Linux boot ISO - Rocky-9.6-x86_64-boot.iso). For a network-based installation, you need first to ensure that a network adapter on the target system is properly configured, and can reach the internet. To perform a network-based installation, click ++"Installation Source"++ and then select the ++"On the network"++ radio button. Once selected, choose the correct protocol and type in the URI for the installation source. Click ++"Done"++. #### Software Selection -Clicking the ++"Software Selection"++ option on the main *Installation Summary* screen presents you with the installation section where you can pick the exact software packages installed on the system. The software selection area is divided into: +Clicking the ++"Software Selection"++ option on the main *Installation Summary* screen presents you with the installation section where you can pick the exact software packages installed on the system. There are two software selection areas: - **Base Environment**: Minimal Installation and Custom operating system - **Additional software for Selected Environment**: Selecting a Base Environment on the left side presents a variety of related additional software to install for the given environment on the right side. @@ -148,13 +148,13 @@ Click ++"done"++ at the top of the screen. ### System Section -The System section of the *Installation Summary* screen is used for customizing and making changes to things related to the underlying hardware of the target system. This is where you create your hard disk drive partitions or volumes, specify the file system, specify the network configuration, enable or disable KDUMP or select a Security Profile. +Use the System section of the *Installation Summary* screen for customizing and making changes to things related to the underlying hardware of the target system. This is where you create your hard disk drive partitions or volumes, specify the file system, specify the network configuration, enable or disable KDUMP or select a Security Profile. #### Installation Destination From the *Installation Summary* screen, click the ++"Installation Destination"++ option. This takes you to the corresponding task area. -You will see a screen displaying all the candidate disk drives that you have available on the target system. If you have only one disk drive on the system, as on our sample system, you see the drive listed under *Local Standard Disks* with a check mark beside it. Clicking the disk icon will toggle on or off the disk selection check mark. Keep it checked to select the disk. +You will see a screen displaying all the candidate disk drives that you have available on the target system. If you have only one disk drive on the system, as on our sample system, you see the drive listed under *Local Standard Disks* with a checkmark beside it. Clicking the disk icon will toggle on or off the disk selection checkmark. Keep it checked to select the disk. Under the *Storage Configuration* section: @@ -190,18 +190,18 @@ The selected network adapter's configurable properties appear in the screen's ri On our sample system, we have two Ethernet devices (`ens3` and `ens4`), all of which are in a connected state. The type, name, quantity, and state of the network devices on your system may vary from the ones on our demo system. -Verify the switch of the device you want to configure is flipped to the `ON` (blue) position in the right pane. -We'll accept all the defaults in this section. +Verify the switch of the device you want to configure is in the `ON` (blue) position in the right pane. +We will accept all the defaults in this section. Click ++"done"++ to return to the main *Installation Summary* screen. !!! Warning - Pay attention to the IP address of the server in this section of this installer. If you don’t have physical or easy console access to the system, this information will come in handy later on when you need to connect to the server to continue working on it after the OS installation is completed. + Pay attention to the IP address of the server in this section of this installer. If you do not have physical or easy console access to the system, this information will come in handy later on when you need to connect to the server to continue working on it after the OS installation is completed. ### User Settings Section -This section can be used for creating a password for the `root` user account and also for creating new administrative or non-administrative accounts. +Use this section for creating a password for the `root` user account and also for creating new administrative or non-administrative accounts. #### Root Password @@ -222,13 +222,13 @@ This section can be used for creating a password for the `root` user account and To create a user: 1. Click the *User Creation* field under *User Settings* to start the *Create User* task screen. -This task area allows you to create a privileged or non-privileged (non-administrative) user account. +This task area is for creating a privileged (administrative) or non-privileged (non-administrative) user account. !!! Info Creating and using a non-privileged account for day-to-day tasks on a system is a good system administration practice. - We’ll create a regular user that can invoke superuser (administrator) powers when needed. + We will create a regular user that can invoke superuser (administrator) powers when needed. 2. Complete the fields in the *Create User* screen with the following information: @@ -249,11 +249,11 @@ This task area allows you to create a privileged or non-privileged (non-administ ## Installer Phase -Once you are satisfied with your choices for the various installation tasks, the next phase of the installation process will begin the installation proper. +Once satisfied with your choices for the various installation tasks, the next phase of the installation process will begin the installation proper. ### Start the Installation -Once you are satisfied with your choices for the various installation tasks, click the ++"Begin Installation"++ button on the main *Installation Summary* screen. +Once satisfied with your choices for the various installation tasks, click the ++"Begin Installation"++ button on the main *Installation Summary* screen. The installation will begin, and the installation program will show the progress of the installation. After the installation begins, various tasks will begin running in the background, such as partitioning the disk, formatting the partitions or LVM volumes, checking for and resolving software dependencies, writing the operating system to the disk, and so on. diff --git a/docs/guides/installation.md b/docs/guides/installation.md index c68dbb89c2..a4490b617c 100644 --- a/docs/guides/installation.md +++ b/docs/guides/installation.md @@ -72,12 +72,12 @@ Once the system is set up to boot from the media with the ISO file, we can begin ![Rocky Linux installation splash screen](images/installation_10_0_F01.png) -3. At the welcome screen, you can use the ++"up"++ or ++"down"++ arrow keys to select any of the options followed by pressing ++enter++ to execute the selected option. If you do not press any key, the installation program starts a countdown, after which the installation process automatically executes the default, highlighted, option: +3. At the welcome screen, you can use the ++"up"++ or ++"down"++ arrow keys to select any of the options followed by pressing ++enter++ to run the selected option. If you do not press any key, the installation program starts a countdown, after which the installation process automatically executes the default, highlighted, option: `Test this media & install Rocky Linux 10.0` 4. A quick media verification step takes place. -This media verification step can save you the trouble of starting the installation only to find out halfway through that the installation program has to stop because of bad installation media. +This media verification step can save you the trouble of starting the installation only to discover halfway through that the installation program has to stop because of bad installation media. 1. After the media check runs to completion and the media is successfully verified to be usable, the installation program automatically continues to the next screen. @@ -85,7 +85,7 @@ This media verification step can save you the trouble of starting the installati ## Installation Summary -The `Installation Summary` screen is an all-in-one area where you make important decisions about the system to be installed. +The `Installation Summary` screen is an all-in-one area where you make important decisions about the system's installation. The screen is roughly divided into the following sections: @@ -106,21 +106,21 @@ In this guide's demo system, we accept the default value (*English US*) and make However, if you need to make any changes here, from the *Installation Summary* screen, click the ++"keyboard"++ option to specify the system's keyboard layout. Using the ++plus++ button, you can add and order additional keyboard layouts as necessary. -Click ++"done"++ when you are finished with this screen. +When finished with this screen click ++"done"++. #### Language Support -The `Language Support` option on the *Installation Summary* screen lets you specify support for additional languages. +The `Language Support` option on the *Installation Summary* screen allows for the specification of support for additional languages. We will accept the default value - **English (United States)** and make no change, click ++"done"++. #### Time & Date -Click the ++"Time & Date"++ option on the main *Installation Summary* screen to bring up another screen that will allow you to select the time zone in which the machine is located. Use the drop down arrows to select the region and city closest to you. +Click the ++"Time & Date"++ option on the main *Installation Summary* screen to bring up another screen that will allow for the selection of the timezone where the machine is located. Use the drop down arrows to select the region and city closest to you. -Accept the default and enabled ++"Automatic date & time"++ option which allows the system to automatically set the correct time abd date using the Network Time Protocol (NTP). +Accept the default and enabled ++"Automatic date & time"++ option that allows the system to automatically set the correct time and date by using the Network Time Protocol (NTP). -Click ++"done"++ once completed. +Click ++"done"++ when completed. ### Software Section @@ -136,10 +136,10 @@ Because we are using a Rocky Linux 10 ISO image for the installation, the Auto-d #### Software Selection -Clicking the ++"Software Selection"++ option on the main *Installation Summary* screen presents you with a software selection area that is divided into: +Clicking the ++"Software Selection"++ option on the main *Installation Summary* screen presents you with a software selection area that has two sections: - **Base Environment**: Minimal Installation -- **Additional software for Selected Environment**: Selecting a Base Environment on the left side presents a selection of additional software to install for the given environment on the right side. +- **Additional software for Selected Environment**: Selecting a Base Environment on the left side presents a selection of additional software to install for the given environment on the right side. Select the *Minimal Install* (Basic functionality) option. @@ -147,13 +147,13 @@ Click ++"done"++ at the top of the screen. ### System Section -The System section of the *Installation Summary* screen is used for customizing and making changes to things related to the underlying hardware of the target system. This is where you create your hard disk drive partitions or volumes, specify the file system, specify the network configuration, enable or disable KDUMP. +Use the System section of the *Installation Summary* screen for customizing and making changes to things related to the underlying hardware of the target system. This is where you create your hard disk drive partitions or volumes, specify the file system, specify the network configuration, enable or disable KDUMP. #### Installation Destination From the *Installation Summary* screen, click the ++"Installation Destination"++ option. This takes you to the corresponding task area. -You will see a screen displaying all the candidate disk drives that you have available on the target system. If you have only one disk drive on the system, as on our sample system, you see the drive listed under *Local Standard Disks* with a check mark beside it. Clicking the disk icon will toggle on or off the disk selection check mark. Keep it checked to select the disk. +You will see a screen displaying all the candidate disk drives that you have available on the target system. If you have only one disk drive on the system, as on our sample system, you see the drive listed under *Local Standard Disks* with a checkmark beside it. Clicking the disk icon will toggle on or off the disk selection checkmark. Keep it checked to select the disk. Under the *Storage Configuration* section: @@ -189,18 +189,18 @@ The selected network adapter's configurable properties appear in the screen's ri On our sample system, we have two Ethernet devices (`ens3` and `ens4`), both of which are in a connected state. The type, name, quantity, and state of the network devices on your system may vary from the ones on our demo system. -Verify the switch of the device you want to configure is flipped to the `ON` (blue) position in the right pane. -We'll accept all the defaults in this section. +Verify the switch of the device you want to configure is in the `ON` (blue) position in the right pane. +We will accept all the defaults in this section. Click ++"done"++ to return to the main *Installation Summary* screen. !!! Warning - Pay attention to the IP address of the server in this section of this installer. If you don’t have physical or easy console access to the system, this information will come in handy later on when you need to connect to the server after the OS installation is completed. + Pay attention to the IP address of the server in this section of this installer. If you do not have physical or easy console access to the system, this information will come in handy later on when you need to connect to the server after the OS installation is completed. ### User Settings Section -This section can be used for creating a password for the `root` user account and also for creating new administrative or non-administrative accounts. +Use this section for creating a password for the `root` user account and also for creating new administrative or non-administrative accounts. #### Root Password @@ -210,7 +210,7 @@ This section can be used for creating a password for the `root` user account and The root superuser is the most privileged account on the system. Therefore, if you choose to use or enable it, it is crucial that you protect this account with a strong password. -2. You'll be presented with the option to either "Disable root account" OR "Enable root account". +2. You will see two options to either "Disable root account" OR "Enable root account". Accept the default. 3. Click ++"done"++. @@ -219,46 +219,45 @@ Accept the default. To create a user: -1. Click the *User Creation* field under *User Settings* to start the *Create User* task screen. -This task area allows you to create a privileged or non-privileged (non-administrative) user account. +1. Click the *User Creation* field under *User Settings* to start the *Create User* task screen. Use this task area for the creation of a privileged (administrative) or non-privileged (non-administrative) user account. !!! Caution On a Rocky Linux 10 system, the Root account is disabled by default and so it is important to ensure that the user account created during the OS installation has administrative privileges. This user can be used in a non-privileged manner for day-to-day tasks on the system and will also have the ability to elevate their role to perform administrative (root) functions as necessary. - We’ll create a regular user that can invoke superuser (administrator) powers when needed. + We will create a regular user that can invoke superuser (administrator) powers when needed. -1. Complete the fields in the *Create User* screen with the following information: +2. Complete the fields in the *Create User* screen with the following information: - **Full name**: `rockstar` - **Username**: `rockstar` - - **Add administrative privileges to this user account (wheel group membership)**: - Checked - - **Require a password to use this account**: - Checked - - **Password**: - `04302021` - - **Confirm password**: - `04302021` + - **Add administrative privileges to this user account (wheel group membership)**: + Checked + - **Require a password to use this account**: + Checked + - **Password**: + `04302021` + - **Confirm password**: + `04302021` -2. Click ++"done"++. +3. Click ++"done"++. ## Installer Phase -Once you are satisfied with your choices for the various installation tasks, the next phase of the installation process will begin the installation proper. +Once satisfied with your choices for the various installation tasks, the next phase of the installation process will begin the installation proper. ### Start the Installation -Once you are satisfied with your choices for the various installation tasks, click the ++"Begin Installation"++ button on the main *Installation Summary* screen. +Once satisfied with your choices for the various installation tasks, click the ++"Begin Installation"++ button on the main *Installation Summary* screen. The installation will begin, and the installation program will show the progress of the installation. After the installation begins, various tasks will begin running in the background, such as partitioning the disk, formatting the partitions or LVM volumes, checking for and resolving software dependencies, writing the operating system to the disk, and so on. !!! Note - If you do not wish to continue after clicking the Begin Installation button, you can still safely exit the installation without losing data. To quit the installer, simply reset your system by clicking the ++Quit++ button, pressing ctrl-alt-del on the keyboard, or pushing the reset or power switch. + If you do not wish to continue after clicking the ++"Begin Installation"++ button, you can still safely exit the installation without losing data. To quit the installer, simply reset your system by clicking the ++"Quit"++ button, pressing ctrl-alt-del on the keyboard, or pushing the reset or power switch. ### Complete the Installation diff --git a/docs/guides/minimum_hardware_requirements.md b/docs/guides/minimum_hardware_requirements.md index e5ff02f24d..25c6a7fdd3 100644 --- a/docs/guides/minimum_hardware_requirements.md +++ b/docs/guides/minimum_hardware_requirements.md @@ -96,16 +96,19 @@ According to the Rocky Linux 10.0 Release Notes, Rocky Linux 10 officially sup ## 🎯 Recommended Specs by Use‑Case ### 🏗️ Minimal Server + - CPU: 1 core x86_64-v3 (or ARM/POWER/Z/RISC‑V) - RAM: 1 GB - Storage: 10–20 GB ### 🖥️ Desktop with GUI + - CPU: 2+ cores x86_64-v3 (or equivalent) - RAM: 2–4 GB - Storage: 20–40 GB ### 🛠️ Development/Production Server + - CPU: 4+ cores - RAM: 4–8 GB+ - Storage: 40 GB+ (based on workload needs) From 5edcf58f383ab609229c84a2c38bc26da441d2f3 Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Fri, 13 Jun 2025 09:08:06 -0500 Subject: [PATCH 034/164] Update zfs compat section `9_6.md` (#2749) --- docs/release_notes/9_6.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/release_notes/9_6.md b/docs/release_notes/9_6.md index 0cdb9e8e80..6ddeeb697e 100644 --- a/docs/release_notes/9_6.md +++ b/docs/release_notes/9_6.md @@ -102,6 +102,8 @@ Updated compiler toolsets: The currently released `zfs` module from OpenZFS **will not load** on Rocky Linux 9.6. For those using `zfs` on 9.5 and planning to upgrade to 9.6, it is recommended to hold off for now. If you are planning a fresh installation of 9.6 and use `zfs`, then you should wait for the release of the updated module again. You can follow the issue [here](https://github.com/openzfs/zfs/issues/17332) and [here](https://github.com/openzfs/zfs/issues/17364). +**Update:** An update to the 2.2.8 branch [fixes the issue with 9.6](https://github.com/openzfs/zfs/releases). Still waiting on an update for the 2.3 branch. + ### SELinux issue on server, workstation, or virtual host systems with `passt` installed When using a workstation, server, or virtual host with a `passt` back end installed, the interface will fail to start if SELinux is enabled. See [this upstream issue](https://issues.redhat.com/browse/RHEL-80407) for more information. From 1343eef529de37c421dee0dadf5261e7e83a0e36 Mon Sep 17 00:00:00 2001 From: Ganna Zhyrnova <112796922+gannazhyrnova@users.noreply.github.com> Date: Mon, 16 Jun 2025 16:38:28 +0300 Subject: [PATCH 035/164] minimum_hardware_requirements.md (#2755) Grammar check --- docs/guides/minimum_hardware_requirements.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/guides/minimum_hardware_requirements.md b/docs/guides/minimum_hardware_requirements.md index 25c6a7fdd3..25eff2dfb4 100644 --- a/docs/guides/minimum_hardware_requirements.md +++ b/docs/guides/minimum_hardware_requirements.md @@ -6,7 +6,7 @@ Rocky Linux 10 is designed for enterprise-grade stability with modern hardware ## ✅ Supported CPU Architectures -According to the Rocky Linux 10.0 Release Notes, Rocky Linux 10 officially supports the following architectures : +According to the Rocky Linux 10.0 Release Notes, Rocky Linux 10 officially supports the following architectures: - **x86_64-v3** (Intel/AMD 64-bit CPUs with at least Haswell or equivalent AVX support) - **aarch64** (ARMv8-A 64-bit) @@ -16,7 +16,7 @@ According to the Rocky Linux 10.0 Release Notes, Rocky Linux 10 officially sup ### ⚠️ CPU Feature Requirements -- **x86_64‑v3** requires AVX, AVX2, BMI1/2, FMA, etc., corresponding to Intel Haswell or later, AMD Excavator or newer . +- **x86_64-v3** requires AVX, AVX2, BMI1/2, and FMA, corresponding to Intel Haswell or later, or AMD Excavator or newer. - Older x86_64 revisions (v1/v2) are **not supported** unless rebuilt by community SIGs. --- @@ -24,7 +24,7 @@ According to the Rocky Linux 10.0 Release Notes, Rocky Linux 10 officially sup ## 🧠 CPU (Processor) - **1 GHz 64-bit (x86_64‑v3)** or equivalent for other architectures -- Multi-core CPUs recommended for server, desktop, or virtualization use +- Multi-core CPUs are recommended for server, desktop, or virtualization use --- @@ -118,7 +118,7 @@ According to the Rocky Linux 10.0 Release Notes, Rocky Linux 10 officially sup ## 🧩 Additional Notes - Always allocate extra storage for logs, package updates, and backups. -- For cloud or virtualization, choose instance types meeting or exceeding the above specs. +- For cloud or virtualization, choose instance types that meet or exceed the above specifications. - Upgrades from earlier Rocky releases (e.g., 8 or 9) to Rocky 10 aren’t supported—**clean installation required**. --- From 2aee1c16b02fb00257c1207e1f322bf3160419be Mon Sep 17 00:00:00 2001 From: Ganna Zhyrnova <112796922+gannazhyrnova@users.noreply.github.com> Date: Mon, 16 Jun 2025 16:39:00 +0300 Subject: [PATCH 036/164] 9_6_installation.md (#2752) Grammar check --- docs/guides/9_6_installation.md | 66 ++++++++++++++++----------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/docs/guides/9_6_installation.md b/docs/guides/9_6_installation.md index 1d181b48bb..56156b5b6f 100644 --- a/docs/guides/9_6_installation.md +++ b/docs/guides/9_6_installation.md @@ -6,7 +6,7 @@ contributors: Steven Spencer, Ganna Zhyrnova # Installing Rocky Linux 9 -This is a detailed guide for installing a 64-bit version of the Rocky Linux distribution on a standalone system. We will be performing a server class install, and stepping through the installation and customization options. +This is a detailed guide for installing a 64-bit version of the Rocky Linux distribution on a standalone system. We will perform a server-class installation and walk through the installation and customization options. ## Operating System Installation Prerequisites @@ -31,11 +31,11 @@ For example, `Rocky-9.6-x86_64-minimal.iso` !!! Note - The Rocky Project web page lists several mirrors located around the globe. Choose the mirror geographically closest to you. The list of official mirrors can be found [here](https://mirrors.rockylinux.org/mirrormanager/mirrors). + The Rocky Project website lists several mirrors located around the world. Select the mirror that is geographically closest to you. The list of official mirrors can be found [here](https://mirrors.rockylinux.org/mirrormanager/mirrors). ## Verifying the Installation Program ISO File -If you've downloaded the Rocky Linux ISO(s) on an existing Linux distribution, you can use the `sha256sum` utility to verify that file(s) you downloaded are not corrupt. We will show an example of verifying the `Rocky-9.6-x86_64-minimal.iso` file by checking its checksum. +If you've downloaded the Rocky Linux ISO(s) on an existing Linux distribution, you can use the `sha256sum` utility to verify that the file(s) you downloaded are not corrupt. We will demonstrate how to verify the `Rocky-9.6-x86_64-minimal.iso` file by checking its checksum. 1. Download the file that contains the official checksums for the available ISOs. @@ -51,7 +51,7 @@ If you've downloaded the Rocky Linux ISO(s) on an existing Linux distribution, y sha256sum -c CHECKSUM --ignore-missing ``` - This checks the integrity of the ISO file downloaded previously, provided that it is in the same directory. You should see this output: + This checks the integrity of the previously downloaded ISO file, provided it is in the same directory. You should see this output: ```text Rocky-9.6-x86_64-minimal.iso: OK @@ -61,28 +61,28 @@ If you've downloaded the Rocky Linux ISO(s) on an existing Linux distribution, y !!! tip - Before installing properly, the system’s Unified Extensible Firmware Interface (UEFI) or Basic Input/Output System (BIOS) should be preconfigured to boot from the correct medium. + Before installing, the system’s Unified Extensible Firmware Interface (UEFI) or Basic Input/Output System (BIOS) must be preconfigured to boot from the correct medium. If you set the computer up to boot from the media with the ISO file, you can begin the installation. -1. Insert and boot from the installation medium (optical disk, USB flash drive, and so on). +1. Insert and boot from the installation medium (e.g., optical disk, USB flash drive). 2. Once the computer has booted, you see the Rocky Linux 9.6 welcome splash screen. ![Rocky Linux installation splash screen](images/installation_9_6_F01.png) -3. If you do not press any key, the installation program starts a countdown, after which the installation process automatically executes the default, highlighted, option: +3. If you do not press any key, the installation program starts a countdown, after which the installation process automatically executes the default, highlighted option: `Test this media & install Rocky Linux 9.6` You can also press ++enter++ at any time to start the process immediately. 4. A quick media verification step takes place. -This media verification step can save you the trouble of starting the installation only to discover halfway through that the installation program has to stop because of bad installation media. +This media verification step can save you the trouble of starting the installation only to discover halfway through that the installation program has to stop due to faulty installation media. -5. After the media check runs to completion and the media is successfully verified to be usable, the installation program automatically continues to the next screen. +5. After the media check is completed and the media is successfully verified as usable, the installation program automatically proceeds to the next screen. -6. Select the language you want to use to perform the installation in this screen. For this guide, we select *English (United States)*. Then click the ++"continue"++ button. +6. Select the language you want to use to install this screen. For this guide, we select *English (United States)*. Then click the ++"continue"++ button. ## Installation Summary @@ -95,7 +95,7 @@ The screen is roughly divided into the following sections: - *SYSTEM* - *USER SETTINGS* -We will delve into each of these sections next and make changes where necessary. +We will delve into each of these sections next and make any necessary changes. ### Localization Section @@ -105,7 +105,7 @@ This section customizes items related to the system's geographic location. This In this guide's demo system, we accept the default value (*English US*) and make no changes. -However, if you need to make any changes here, from the *Installation Summary* screen, click the ++"keyboard"++ option to specify the system's keyboard layout. Using the ++plus++ button, you can add additional keyboard layouts if you need to in the ensuing screen and even specify your preferred order. +However, if you need to make any changes here, from the *Installation Summary* screen, click the ++"keyboard"++ option to specify the system's keyboard layout. Using the ++plus++ button, you can add additional keyboard layouts if you need to in the ensuing screen and even select your preferred order. When you finish with this screen, click ++"done"++. @@ -113,7 +113,7 @@ When you finish with this screen, click ++"done"++. The `Language Support` option on the *Installation Summary* screen lets you specify support for additional languages. -We will accept the default value - **English (United States)** and make no change, click ++"done"++. +We will accept the default value, **English (United States)**, and make no changes. Click "Done". #### Time & Date @@ -133,11 +133,11 @@ Because the installation uses a Rocky Linux 9.6 ISO image, you will notice that !!! Tip - The installation Source area allows you to perform a network-based installation (for example, if you use the Rocky Linux boot ISO - Rocky-9.6-x86_64-boot.iso). For a network-based installation, you need first to ensure that a network adapter on the target system is properly configured, and can reach the internet. To perform a network-based installation, click ++"Installation Source"++ and then select the ++"On the network"++ radio button. Once selected, choose the correct protocol and type in the URI for the installation source. Click ++"Done"++. + The installation Source area allows you to perform a network-based installation (for example, if you use the Rocky Linux boot ISO - Rocky-9.6-x86_64-boot.iso). For a network-based installation, you must first ensure that a network adapter on the target system is configured correctly and can access the internet. To perform a network-based installation, click ++"Installation Source"++ and then select the ++"On the network"++ radio button. Once selected, choose the correct protocol and type in the URI for the installation source. Click ++"Done"++. #### Software Selection -Clicking the ++"Software Selection"++ option on the main *Installation Summary* screen presents you with the installation section where you can pick the exact software packages installed on the system. There are two software selection areas: +Clicking the ++"Software Selection"++ option on the main *Installation Summary* screen presents you with the installation section where you can select the exact software packages installed on the system. There are two software selection areas: - **Base Environment**: Minimal Installation and Custom operating system - **Additional software for Selected Environment**: Selecting a Base Environment on the left side presents a variety of related additional software to install for the given environment on the right side. @@ -148,13 +148,13 @@ Click ++"done"++ at the top of the screen. ### System Section -Use the System section of the *Installation Summary* screen for customizing and making changes to things related to the underlying hardware of the target system. This is where you create your hard disk drive partitions or volumes, specify the file system, specify the network configuration, enable or disable KDUMP or select a Security Profile. +Use the System section of the *Installation Summary* screen for customizing and making changes to things related to the underlying hardware of the target system. This is where you create your hard disk drive partitions or volumes, specify the file system, specify the network configuration, enable or disable KDUMP, or select a Security Profile. #### Installation Destination From the *Installation Summary* screen, click the ++"Installation Destination"++ option. This takes you to the corresponding task area. -You will see a screen displaying all the candidate disk drives that you have available on the target system. If you have only one disk drive on the system, as on our sample system, you see the drive listed under *Local Standard Disks* with a checkmark beside it. Clicking the disk icon will toggle on or off the disk selection checkmark. Keep it checked to select the disk. +You will see a screen displaying all the candidate disk drives available on the target system. If you have only one disk drive on the system, as on our sample system, you see the drive listed under *Local Standard Disks* with a checkmark beside it. Clicking the disk icon toggles the disk selection checkmark on or off. Keep it checked to select the disk. Under the *Storage Configuration* section: @@ -166,13 +166,13 @@ Under the *Storage Configuration* section: ### Network & Host Name -The next important task of the installation procedure under the System area deals with network configuration, where you can configure or tweak network-related settings for the system. +The following important task of the installation procedure under the System area deals with network configuration, where you can configure or tweak network-related settings for the system. !!! Note - After you click on the ++"Network & Hostname"++ option, all correctly detected network interface hardware (such as Ethernet, wireless network cards, and so on) will be listed in the left pane of the network configuration screen. Depending on your specific hardware setup, Ethernet devices in Linux have names similar to `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3`, and so on. + After you click on the ++"Network & Hostname"++ option, all correctly detected network interface hardware (such as Ethernet, wireless network cards, etc.) will be listed in the left pane of the network configuration screen. Depending on your specific hardware setup, Ethernet devices in Linux have names similar to `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3`, and so on. You can configure each interface using DHCP or manually set the IP address. - If you choose to configure manually, be sure to have all the required information ready, such as the IP address, netmask, and so on. + If you choose to configure manually, ensure that you have all the required information ready, such as the IP address, netmask, and other relevant details. Clicking the ++"Network & Hostname"++ button in the main *Installation Summary* screen opens the corresponding configuration screen. Here, you can configure the system's hostname. @@ -180,28 +180,28 @@ Clicking the ++"Network & Hostname"++ button in the main *Installation Summary* You can easily change the system hostname later on after the OS has been installed. -The next important configuration task is related to the network interfaces on the system. +The following important configuration task pertains to the system's network interfaces. -1. Verify that the left pane lists an Ethernet card (or any network card.) +1. Verify that the left pane lists an Ethernet card (or any network card). 2. Click any of the detected network devices in the left pane to select it. -The selected network adapter's configurable properties appear in the screen's right pane. +The selected network adapter's configurable properties appear in the right pane of the screen. !!! Note - On our sample system, we have two Ethernet devices (`ens3` and `ens4`), all of which are in a connected state. The type, name, quantity, and state of the network devices on your system may vary from the ones on our demo system. + On our sample system, we have two Ethernet devices (`ens3` and `ens4`), all of which are in a connected state. The type, name, quantity, and state of the network devices on your system may differ from those on our demo system. -Verify the switch of the device you want to configure is in the `ON` (blue) position in the right pane. +Verify that the switch of the device you want to configure is in the `ON` (blue) position in the right pane. We will accept all the defaults in this section. Click ++"done"++ to return to the main *Installation Summary* screen. !!! Warning - Pay attention to the IP address of the server in this section of this installer. If you do not have physical or easy console access to the system, this information will come in handy later on when you need to connect to the server to continue working on it after the OS installation is completed. + Pay attention to the IP address of the server in this section of the installer. Suppose you do not have physical or easy console access to the system. In that case, this information will be helpful later when you need to connect to the server to continue working on it after the operating system (OS) installation is complete. ### User Settings Section -Use this section for creating a password for the `root` user account and also for creating new administrative or non-administrative accounts. +Use this section to create a password for the `root` user account and to create new administrative or non-administrative accounts. #### Root Password @@ -209,7 +209,7 @@ Use this section for creating a password for the `root` user account and also fo !!! Warning - The root superuser is the most privileged account on the system. Therefore, if you choose to use or enable it, it is crucial that you protect this account with a strong password. + The root superuser is the most privileged account on the system. If you choose to use or enable it, you must protect this account with a strong password. 2. In the *Root Password* text box, set a strong password for the root user. @@ -226,7 +226,7 @@ This task area is for creating a privileged (administrative) or non-privileged ( !!! Info - Creating and using a non-privileged account for day-to-day tasks on a system is a good system administration practice. + Creating and using a non-privileged account for day-to-day tasks on a system is a best practice in system administration. We will create a regular user that can invoke superuser (administrator) powers when needed. @@ -249,18 +249,18 @@ This task area is for creating a privileged (administrative) or non-privileged ( ## Installer Phase -Once satisfied with your choices for the various installation tasks, the next phase of the installation process will begin the installation proper. +Once you are satisfied with your choices for the various installation tasks, the next phase of the installation process will begin: the actual installation. ### Start the Installation Once satisfied with your choices for the various installation tasks, click the ++"Begin Installation"++ button on the main *Installation Summary* screen. The installation will begin, and the installation program will show the progress of the installation. -After the installation begins, various tasks will begin running in the background, such as partitioning the disk, formatting the partitions or LVM volumes, checking for and resolving software dependencies, writing the operating system to the disk, and so on. +After the installation begins, various tasks will run in the background, including partitioning the disk, formatting the partitions or LVM volumes, checking for and resolving software dependencies, and writing the operating system to the disk. !!! Note - If you do not wish to continue after clicking the Begin Installation button, you can still safely exit the installation without losing data. To quit the installer, simply reset your system by clicking the Quit button, pressing ctrl-alt-del on the keyboard, or pushing the reset or power switch. + If you do not wish to continue after clicking the Begin Installation button, you can still safely exit the installation without losing data. To quit the installer, simply reset your system by clicking the Quit button, pressing Ctrl-Alt-Delete on the keyboard, or pushing the reset or power switch. ### Complete the Installation @@ -281,6 +281,6 @@ To log onto the system: 2. At the Password prompt, type `04302021` (rockstar’s password) and press ++enter++ (the password will ***not*** be echoed to the screen, that is normal). 3. Run the `whoami` command after login. -This command shows the name of the currently logged in user. +This command shows the name of the currently logged-in user. ![Login Screen](images/installation_9.0_F03.png) From 4dd5f1030b1a9c829e07be87501c688efdce0d55 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 16 Jun 2025 09:39:15 -0400 Subject: [PATCH 037/164] New Crowdin updates (#2751) * New translations 9_5.md (Italian) * New translations 9_6.md (Italian) * New translations index.md (Italian) * New translations installation.md (Ukrainian) * New translations 9_6_installation.md (Ukrainian) * New translations 10_0.md (Ukrainian) * New translations 9_6.md (Ukrainian) * New translations minimum_hardware_requirements.md (Ukrainian) * New translations 17-log.md (Ukrainian) --- docs/books/admin_guide/17-log.uk.md | 94 +++--- docs/guides/9_6_installation.uk.md | 292 ++++++++++++++++++ docs/guides/installation.uk.md | 86 +++--- .../minimum_hardware_requirements.uk.md | 126 ++++++++ docs/release_notes/10_0.uk.md | 274 ++++++++++++++++ docs/release_notes/9_5.it.md | 2 +- docs/release_notes/9_6.it.md | 140 +++++++++ docs/release_notes/9_6.uk.md | 140 +++++++++ docs/release_notes/index.it.md | 9 + 9 files changed, 1070 insertions(+), 93 deletions(-) create mode 100644 docs/guides/9_6_installation.uk.md create mode 100644 docs/guides/minimum_hardware_requirements.uk.md create mode 100644 docs/release_notes/10_0.uk.md create mode 100644 docs/release_notes/9_6.it.md create mode 100644 docs/release_notes/9_6.uk.md diff --git a/docs/books/admin_guide/17-log.uk.md b/docs/books/admin_guide/17-log.uk.md index 9f4a80a5af..a175cf05b5 100644 --- a/docs/books/admin_guide/17-log.uk.md +++ b/docs/books/admin_guide/17-log.uk.md @@ -66,16 +66,16 @@ Shell > dnf install -y rsyslog 1. базовий (sysklogd) - Цей формат підходить для представлення базової конфігурації в одному рядку. - ``` - mail.info /var/log/mail.log - mail.err @@server.example.net - ``` + ``` + mail.info /var/log/mail.log + mail.err @@server.example.net + ``` 2. розширений (RainerScript) - Дуже гнучкий та точний формат конфігурації. - ``` - mail.err action(type="omfwd" protocol="tcp" queue.type="linkedList") - ``` + ``` + mail.err action(type="omfwd" protocol="tcp" queue.type="linkedList") + ``` 3. застарілий (legacy) - цей формат вилучено з рекомендацій. Будь ласка, не використовуйте його. @@ -389,45 +389,45 @@ Shell > tree -hugp /run/log/journal/638c6d5d2b674f77be56174469099106/ - **пріоритет** - Важливість логу. Як і у випадку з `rsyslog`, чим вищий пріоритет, тим менше інформації записується та тим серйозніша проблема. Чим нижчий пріоритет, тим більше інформації записується, і тим менша проблема. Сортувати за пріоритетом від низького до високого: - | Числовий код | пріоритет | ключові слова | - | :----------- | :---------------- | :------------ | - | 7 | Debug | `debug` | - | 6 | Informational | `info` | - | 5 | Notice | `notice` | - | 4 | Warning "Важливо" | `warning` | - | 3 | Помилка | `err` | - | 2 | Critical | `crit` | - | 1 | Alert | `alert` | - | 0 | Emergency | `emerg` | + | Числовий код | пріоритет | ключові слова | + | :----------- | :---------------- | :------------ | + | 7 | Debug | `debug` | + | 6 | Informational | `info` | + | 5 | Notice | `notice` | + | 4 | Warning "Важливо" | `warning` | + | 3 | Помилка | `err` | + | 2 | Critical | `crit` | + | 1 | Alert | `alert` | + | 0 | Emergency | `emerg` | - **об'єкт** - У цій таблиці показано об'єкт: - | Числовий код | об'єкт | - | :----------- | :--------- | - | 0 | `kern` | - | 1 | `user` | - | 2 | `mail` | - | 3 | `daemon` | - | 4 | `auth` | - | 5 | `syslog` | - | 6 | `lpr` | - | 7 | `news` | - | 8 | `uucp` | - | 9 | | - | 10 | `authpriv` | - | 11 | `ftp` | - | 12 | | - | 13 | | - | 14 | | - | 15 | `cron` | - | 16 | `local0` | - | 17 | `local1` | - | 18 | `local2` | - | 19 | `local3` | - | 20 | `local4` | - | 21 | `local5` | - | 22 | `local6` | - | 23 | `local7` | + | Числовий код | об'єкт | + | :----------- | :--------- | + | 0 | `kern` | + | 1 | `user` | + | 2 | `mail` | + | 3 | `daemon` | + | 4 | `auth` | + | 5 | `syslog` | + | 6 | `lpr` | + | 7 | `news` | + | 8 | `uucp` | + | 9 | | + | 10 | `authpriv` | + | 11 | `ftp` | + | 12 | | + | 13 | | + | 14 | | + | 15 | `cron` | + | 16 | `local0` | + | 17 | `local1` | + | 18 | `local2` | + | 19 | `local3` | + | 20 | `local4` | + | 21 | `local5` | + | 22 | `local6` | + | 23 | `local7` | ### Команда `journalctl` @@ -500,10 +500,10 @@ Shell > cat /etc/systemd/journald.conf - `Storage=` - Керує розташуванням сховища даних `journald`. Значення за замовчуванням — auto. - - volatile - Зберігає дані журналу в пам'яті, тобто у тимчасовому файлі, розташованому в каталозі **/run/log/journal/**. - - persistent - Зберігає дані журналу в каталозі **/var/log/journal/**. Вам потрібно створити це вручну. Якщо цей каталог недоступний для запису, дані журналу будуть записані в каталог **/run/log/journal/**. - - auto - схожий з persistent - - none - Не зберігає жодних журналів, але це не вплине на журнали, що пересилаються іншим "цілям" + - volatile - Зберігає дані журналу в пам'яті, тобто у тимчасовому файлі, розташованому в каталозі **/run/log/journal/**. + - persistent - Зберігає дані журналу в каталозі **/var/log/journal/**. Вам потрібно створити це вручну. Якщо цей каталог недоступний для запису, дані журналу будуть записані в каталог **/run/log/journal/**. + - auto - схожий з persistent + - none - Не зберігає жодних журналів, але це не вплине на журнали, що пересилаються іншим "цілям" - `Compress=` - Чи вмикати функцію стиснення. Значення за замовчуванням — так. diff --git a/docs/guides/9_6_installation.uk.md b/docs/guides/9_6_installation.uk.md new file mode 100644 index 0000000000..1c2ba70e3c --- /dev/null +++ b/docs/guides/9_6_installation.uk.md @@ -0,0 +1,292 @@ +--- +Title: Встановлення Rocky Linux 9 +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +--- + +# Встановлення Rocky Linux 9 + +Це детальний посібник із встановлення 64-розрядної версії дистрибутива Rocky Linux в автономній системі. Ми виконаємо інсталяцію серверного класу та розглянемо варіанти інсталяції та налаштування. + +## Необхідні умови для встановлення операційної системи + +Завантажте ISO-файл для цієї установки Rocky Linux.\ +Ви можете завантажити найновіший ISO-образ для версії Rocky Linux для цієї установки тут: + + + +Щоб завантажити ISO-образ безпосередньо з командного рядка на існуючій системі на базі Linux, скористайтеся командою `wget`: + +```bash +wget https://download.rockylinux.org/pub/rocky/9/isos/x86_64/Rocky-9.6-x86_64-minimal.iso +``` + +ISO Rocky Linux дотримується цієї угоди про іменування: + +```text +Rocky-.--.iso +``` + +Наприклад, `Rocky-9.6-x86_64-minimal.iso` + +!!! Note "Примітка" + + На вебсайті Rocky Project перелічено кілька дзеркал, розташованих по всьому світу. Виберіть дзеркало, яке географічно найближче до вас. Список офіційних дзеркал можна знайти [тут](https://mirrors.rockylinux.org/mirrormanager/mirrors). + +## Перевірка файлу ISO програми встановлення + +Якщо ви завантажили ISO-образ Rocky Linux на існуючий дистрибутив Linux, ви можете скористатися утилітою `sha256sum`, щоб перевірити, чи завантажені вами файли не пошкоджені. Ми продемонструємо, як перевірити файл `Rocky-9.6-x86_64-minimal.iso`, перевіривши його контрольну суму. + +1. Завантажте файл, який містить офіційні контрольні суми для доступних ISO. + +2. Перебуваючи в папці, яка містить завантажений ISO Rocky Linux, завантажте файл контрольної суми для ISO, введіть: + + ```bash + wget -O CHECKSUM https://download.rockylinux.org/pub/rocky/9/isos/x86_64/CHECKSUM + ``` + +3. Використовуйте утиліту `sha256sum` для перевірки цілісності ISO-файлу на предмет пошкодження або несанкціонованого втручання. + + ```bash + sha256sum -c CHECKSUM --ignore-missing + ``` + + Це перевіряє цілісність файлу ISO, завантаженого раніше, за умови, що він знаходиться в тому самому каталозі. Ви повинні побачити цей вивід: + + ```text + Rocky-9.6-x86_64-minimal.iso: OK + ``` + +## Встановлення + +!!! tip + + Перед належним встановленням уніфікований розширюваний інтерфейс вбудованого програмного забезпечення (UEFI) або базову систему введення/виведення (BIOS) потрібно попередньо налаштувати для завантаження з правильного носія. + +Якщо ви налаштували комп'ютер на завантаження з носія з ISO-файлом, ви можете розпочати встановлення. + +1. Вставте та завантажтеся з інсталяційного носія (оптичний диск, флешка тощо). + +2. Після завантаження комп'ютера ви побачите вітальний екран Rocky Linux 9.6. + + ![Rocky Linux installation splash screen](images/installation_9_6_F01.png) + +3. Якщо ви не натиснете жодної клавіші, програма встановлення почне зворотний відлік, після чого процес встановлення автоматично виконає виділений параметр за замовчуванням: + + `Test this media & install Rocky Linux 9.6` + + Ви також можете будь-коли натиснути ++enter++, щоб негайно розпочати процес. + +4. Відбувається швидка перевірка медіа.\ + Цей крок перевірки носія може позбавити вас клопоту з початком інсталяції, після якого ви виявляєте, що програма інсталяції має бути зупинена через несправний інсталяційний носій. + +5. Після завершення перевірки носія та його придатності до використання програма встановлення автоматично переходить до наступного екрана. + +6. Виберіть мову, яку ви хочете використовувати для встановлення цього екрана. Для цього посібника ми обрали _English (United States)_. Потім натисніть кнопку ++"continue"++. + +## Підсумок Інсталяції + +Екран «Підсумок встановлення» – це універсальна область, де ви приймаєте важливі рішення щодо встановлення системи. + +Екран приблизно поділено на такі частини: + +- _LOCALIZATION_ +- _SOFTWARE_ +- _SYSTEM_ +- _USER SETTINGS_ + +Далі ми розглянемо кожен із цих розділів і внесемо необхідні зміни. + +### Розділ локалізації + +Цей розділ налаштовує елементи, пов’язані з географічним розташуванням системи. Це включає – клавіатуру, підтримку мови, час і дату. + +#### Клавіатура + +У демонстраційній системі цього посібника ми приймаємо значення за замовчуванням (_англійська (США)_) і не вносимо жодних змін. + +Однак, якщо вам потрібно внести будь-які зміни тут, на екрані _Підсумок встановлення_ натисніть опцію ++"клавіатура"++, щоб указати розкладку клавіатури системи. Використовуючи кнопку ++plus++, ви можете додати додаткові розкладки клавіатури, якщо потрібно, на наступному екрані та навіть вказати бажаний порядок. + +Коли ви закінчите з цим екраном, натисніть кнопку ++"готово"++. + +#### Підтримка мови + +Опція «Підтримка мов» на екрані _Підсумок встановлення_ дозволяє вказати підтримку додаткових мов. + +Ми приймемо значення за замовчуванням, **Англійська (Сполучені Штати)**, і не внесемо жодних змін. Натисніть кнопку «Готово». + +#### Час і дата + +Натисніть опцію ++"Час і дата"++ на головному екрані _Підсумок встановлення_, щоб відкрити ще один екран, на якому можна вибрати часовий пояс, у якому знаходиться машина. Прокрутіть список регіонів і міст і виберіть найближчу до вас область. + +Залежно від джерела інсталяції, параметр _Мережевий час_ може бути за замовчуванням _УВІМК._ або _ВИМК._. Прийміть налаштування за замовчуванням _УВІМК._. Це дозволяє системі автоматично встановлювати правильний час за допомогою протоколу мережевого часу (NTP). + +Натисніть ++"done"++ після внесення будь-яких змін. + +### Розділ програмного забезпечення + +У розділі _Програмне забезпечення_ на екрані _Підсумок встановлення_ ви можете вибрати або змінити джерело встановлення, а також додаткові пакети (програми), які встановлюються. + +#### Джерело встановлення + +Оскільки під час встановлення використовується ISO-образ Rocky Linux 9.6, ви помітите, що _Локальний носій_ автоматично вказується в розділі «Джерело встановлення» на головному екрані _Підсумок встановлення_. Ви можете прийняти стандартні налаштування. + +!!! tip "Порада" + + Розділ «Джерело інсталяції» дозволяє виконати мережеву інсталяцію (наприклад, якщо ви використовуєте завантажувальний ISO-образ Rocky Linux — Rocky-9.6-x86_64-boot.iso). Для мережевої інсталяції переконайтеся, що мережевий адаптер на цільовій системі налаштовано правильно та має доступ до Інтернету. Щоб виконати мережеву інсталяцію, натисніть ++«Джерело інсталяції»++, а потім виберіть перемикач ++«У мережі»++. Після вибору виберіть правильний протокол і введіть URI для джерела інсталяції. Натисніть ++«Готово»++. + +#### Вибір програмного забезпечення + +Натискання опції ++"Вибір програмного забезпечення"++ на головному екрані _Підсумок встановлення_ відкриє розділ встановлення, де ви можете вибрати точні пакети програмного забезпечення, встановлені в системі. Існує дві області вибору програмного забезпечення: + +- **Базове середовище**: Мінімальна інсталяція та користувацька операційна система +- **Додаткове програмне забезпечення для вибраного середовища**: Вибір базового середовища ліворуч відображає різноманітне додаткове програмне забезпечення для встановлення для цього середовища праворуч. + +Виберіть опцію _Мінімальна інсталяція_ (базова функціональність). + +Натисніть ++"done"++ у верхній частині екрана. + +### Системний розділ + +Використовуйте розділ «Система» на екрані _Підсумок встановлення_ для налаштування та внесення змін до параметрів, пов’язаних з базовим обладнанням цільової системи. Тут ви створюєте розділи або томи жорсткого диска, вказуєте файлову систему, вказуєте конфігурацію мережі, увімкніть або вимкніть KDUMP або виберіть профіль безпеки. + +#### Місце призначення + +На екрані _Підсумок встановлення_ виберіть опцію ++"Місце призначення встановлення"++. Це приведе вас до відповідної області завдань. + +Ви побачите екран із усіма дисками-кандидатами, доступними у цільовій системі. Якщо у вашій системі лише один дисковод, як у нашій зразковій системі, ви побачите диск у списку _Локальні стандартні диски_ з позначкою поруч із ним. Клацання на значку диска вмикає або вимикає позначку вибору диска. Поставте прапорець, щоб вибрати диск. + +У розділі _Конфігурація сховища_: + +1. Виберіть перемикач ++"Automatic"++. + +2. Натисніть ++"done"++ у верхній частині екрана. + +3. Щойно програма встановлення визначить, що у вас є вільний диск, вона повернеться до екрана _Підсумок встановлення_. + +### Мережа та ім'я хоста + +Наступне важливе завдання процедури інсталяції в системній області стосується конфігурації мережі, де ви можете налаштувати або налаштувати параметри, пов’язані з мережею, для системи. + +!!! Note "Примітка" + + Після натискання опції ++"Мережа та ім'я хоста"++ все правильно виявлене обладнання мережевого інтерфейсу (наприклад, Ethernet, бездротові мережеві карти тощо) буде перераховано в лівій панелі екрана конфігурації мережі. Залежно від конкретної конфігурації обладнання, пристрої Ethernet у Linux мають назви, подібні до `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3` тощо. + + Ви можете налаштувати кожен інтерфейс за допомогою DHCP або вручну встановити IP-адресу. + + Якщо ви вирішите налаштувати вручну, переконайтеся, що у вас є вся необхідна інформація, така як IP-адреса, маска мережі та інші відповідні дані. + +Натискання кнопки ++"Мережа та ім'я хоста"++ на головному екрані _Підсумок встановлення_ відкриває відповідний екран конфігурації. Крім іншого, у вас є можливість налаштувати ім’я хоста системи. + +!!! Note "Примітка" + + Ви можете легко змінити ім’я хоста системи пізніше після встановлення ОС. + +Наступне важливе завдання налаштування пов’язане з мережевими інтерфейсами в системі. + +1. Переконайтеся, що на лівій панелі зазначено плату Ethernet (або будь-яку мережеву карту). +2. Натисніть будь-який із виявлених мережевих пристроїв на лівій панелі, щоб вибрати його.\ + Налаштовувані властивості вибраного мережевого адаптера відображаються в правій області екрана. + +!!! Note "Примітка" + + У нашій зразковій системі є два пристрої Ethernet (`ens3` та `ens4`), всі з яких перебувають у підключеному стані. Тип, назва, кількість та стан мережевих пристроїв у вашій системі можуть відрізнятися від тих, що є в нашій демонстраційній системі. + +Переконайтеся, що перемикач пристрою, який ви хочете налаштувати, знаходиться в положенні «УВІМК.» (синій) на правій панелі. +Ми приймемо всі значення за замовчуванням у цьому розділі. + +Натисніть кнопку ++"готово"++, щоб повернутися до головного екрана _Підсумок встановлення_. + +!!! Warning "Важливо" + + Зверніть увагу на IP-адресу сервера в цьому розділі інсталятора. Припустимо, у вас немає фізичного або легкого консольного доступу до системи. У такому разі ця інформація стане в пригоді пізніше, коли вам потрібно буде підключитися до сервера, щоб продовжити роботу на ньому після завершення встановлення ОС. + +### Розділ налаштувань користувача + +Використовуйте цей розділ для створення пароля для облікового запису користувача `root` та для створення нових облікових записів адміністратора або неадміністратора. + +#### Пароль root + +1. Клацніть поле _Пароль root_ у розділі _Налаштування користувача_, щоб розпочати екран завдання _Пароль root_. + + !!! Warning "Важливо" + + ``` + Суперкористувач root — це обліковий запис із найвищими привілеями в системі. Тому, якщо ви вирішите використовувати або ввімкнути його, вам необхідно захистити цей обліковий запис надійним паролем. + ``` + +2. У текстовому полі _Пароль root_ встановіть надійний пароль для користувача root. + +3. Введіть той самий пароль ще раз у текстове поле _Підтвердити_. + +4. Натисніть ++"done"++. + +#### Створення користувача + +Щоб створити користувача: + +1. Клацніть поле _Створення користувача_ у розділі _Налаштування користувача_, щоб розпочати екран завдання _Створення користувача_.\ + Ця область завдань призначена для створення привілейованого (адміністративного) або непривілейованого (неадміністративного) облікового запису користувача. + + !!! Info "Інформація" + + ``` + Створення та використання непривілейованого облікового запису для щоденних завдань у системі є найкращою практикою системного адміністрування. + ``` + + Ми створимо звичайного користувача, який за потреби може використовувати повноваження суперкористувача (адміністратора). + +2. Заповніть поля на екрані _Створити користувача_, вказавши таку інформацію: + + - **Full name**: + `rockstar` + - **Username**: + `rockstar` + - **Make this user administrator**: + Checked + - **Require a password to use this account**: + Checked + - **Password**: + `04302021` + - **Confirm password**: + `04302021` + +3. Натисніть ++"done"++. + +## Фаза встановлення + +Коли ви задоволені своїм вибором для різних завдань встановлення, наступний етап процесу встановлення розпочне власне встановлення. + +### Почніть установку + +Щойно ви будете задоволені вибраними параметрами для різних завдань встановлення, натисніть кнопку ++"Розпочати встановлення"++ на головному екрані _Підсумок встановлення_. + +Розпочнеться інсталяція, і програма інсталяції покаже прогрес інсталяції. +Після початку інсталяції у фоновому режимі почнуть виконуватися різноманітні завдання, наприклад створення розділів диска, форматування розділів або томів LVM, перевірка та вирішення програмних залежностей, запис операційної системи на диск тощо. + +!!! Note "Примітка" + + Якщо ви не бажаєте продовжувати після натискання кнопки «Почати встановлення», ви можете безпечно вийти з інсталяції без втрати даних. Щоб вийти з інсталятора, скиньте налаштування системи, натиснувши кнопку «Вийти», натиснувши Ctrl-Alt-Delete на клавіатурі або натиснувши кнопку скидання чи вимикач живлення. + +### Завершіть установку + +Після завершення програми інсталяції ви побачите екран останнього процесу інсталяції з повним повідомленням. + +Нарешті завершіть всю процедуру, натиснувши кнопку ++"Reboot System"++. Система перезавантажується. + +### Log In + +Тепер система налаштована та готова до використання. Ви побачите консоль Rocky Linux. + +![Rocky Linux Welcome Screen](images/installation_9_F02.png) + +Щоб увійти в систему: + +1. Введіть `rockstar` у запиті для входу та натисніть ++enter++. + +2. У запиті пароля введіть `04302021` (пароль Rockstar) і натисніть ++enter++ (пароль _**не**_ відображатиметься на екрані, це нормально). + +3. Виконайте команду `whoami` після входу в систему.\ + Ця команда показує ім'я користувача, який наразі ввійшов у систему. + +![Login Screen](images/installation_9.0_F03.png) diff --git a/docs/guides/installation.uk.md b/docs/guides/installation.uk.md index bf6dc11751..42e074dbd7 100644 --- a/docs/guides/installation.uk.md +++ b/docs/guides/installation.uk.md @@ -1,10 +1,10 @@ --- -Title: Встановлення Rocky Linux 9 +Title: Встановлення Rocky Linux 10 author: Wale Soyinka -contributors: Steven Spencer, Ganna Zhyrnova +contributors: --- -# Встановлення Rocky Linux 9 +# Встановлення Rocky Linux 10 Це детальний посібник із встановлення 64-розрядної версії дистрибутива Rocky Linux в автономній системі. Ми будемо виконувати встановлення класу сервера. У наступних розділах ми розглянемо кроки встановлення та налаштування. @@ -18,7 +18,7 @@ contributors: Steven Spencer, Ganna Zhyrnova Щоб завантажити ISO безпосередньо з командного рядка в існуючій системі на базі Linux, скористайтеся командою `wget`: ```bash -wget https://download.rockylinux.org/pub/rocky/9/isos/x86_64/Rocky-9.3-x86_64-minimal.iso +wget https://download.rockylinux.org/pub/rocky/10/isos/x86_64/Rocky-10.0-x86_64-minimal.iso ``` ISO Rocky Linux дотримується цієї угоди про іменування: @@ -27,7 +27,7 @@ ISO Rocky Linux дотримується цієї угоди про іменув Rocky-.--.iso ``` -Наприклад, `Rocky-9.3-x86_64-minimal.iso` +Наприклад, `Rocky-10.0-x86_64-minimal.iso` !!! Note "Примітка" @@ -35,14 +35,14 @@ Rocky-.--.iso ## Перевірка файлу ISO програми встановлення -Якщо ви завантажили Rocky Linux ISO в існуючий дистрибутив Linux, ви можете скористатися утилітою `sha256sum`, щоб переконатися, що файли, які ви завантажили, не пошкоджені. Ми покажемо приклад перевірки файлу `Rocky-9.3-x86_64-minimal.iso` шляхом перевірки його контрольної суми. +Якщо ви завантажили Rocky Linux ISO в існуючий дистрибутив Linux, ви можете скористатися утилітою `sha256sum`, щоб переконатися, що файли, які ви завантажили, не пошкоджені. Ми покажемо приклад перевірки файлу `Rocky-10.0-x86_64-minimal.iso` шляхом перевірки його контрольної суми. 1. Завантажте файл, який містить офіційні контрольні суми для доступних ISO. 1. Перебуваючи в папці, яка містить завантажений ISO Rocky Linux, завантажте файл контрольної суми для ISO, введіть: ```bash - wget -O CHECKSUM https://download.rockylinux.org/pub/rocky/9.3/isos/x86_64/CHECKSUM + wget -O CHECKSUM https://download.rockylinux.org/pub/rocky/10/isos/x86_64/CHECKSUM ``` 1. Використовуйте утиліту `sha256sum`, щоб перевірити цілісність файлу ISO на пошкодження чи втручання. @@ -61,28 +61,27 @@ Rocky-.--.iso !!! Tip "Підказка" - Перед належним встановленням уніфікований розширюваний інтерфейс вбудованого програмного забезпечення (UEFI) або базову систему введення/виведення (BIOS) потрібно попередньо налаштувати для завантаження з правильного носія. + Перш ніж розпочати встановлення, переконайтеся, що інтерфейс UEFI (Unified Extensible Firmware Interface) або BIOS (Basic Input/Output System) системи належним чином налаштовано для завантаження з правильного носія. + Також обов’язково перегляньте рекомендовані примітки до [мінімальних вимог до обладнання](minimum_hardware_requirements.md) для запуску Rocky Linux 10. -Ми можемо розпочати процес встановлення, якщо комп’ютер налаштовано на завантаження з носія з файлом ISO. +Після того, як система налаштована на завантаження з носія з ISO-файлом, ми можемо розпочати встановлення. 1. Вставте та завантажтеся з інсталяційного носія (оптичний диск, флешка тощо). -2. Після завантаження комп’ютера ви побачите екран привітання Rocky Linux 9. +2. Після завантаження комп'ютера ви побачите заставку інсталятора Rocky Linux 10. - ![Заставка встановлення Rocky Linux](images/install_9_3_01.png) + ![Заставка встановлення Rocky Linux](images/installation_10_0_F01.png) -3. Якщо ви не натискаєте жодної клавіші, програма інсталяції починає зворотний відлік, після чого процес інсталяції автоматично виконує стандартну, виділену опцію: +3. На екрані привітання ви можете скористатися клавішами зі стрілками ++"вгору"++ або ++"вниз"++, щоб вибрати будь-який із параметрів, а потім натиснути ++enter++, щоб запустити вибраний параметр. Якщо ви не натискаєте жодної клавіші, програма інсталяції починає зворотний відлік, після чого процес інсталяції автоматично виконує стандартну, виділену опцію: - `Test this media & install Rocky Linux 9.3` + `Test this media & install Rocky Linux 10.0` - Ви також можете будь-коли натиснути ++enter++, щоб негайно розпочати процес. +4. Виконується швидкий етап перевірки носія. + Цей етап перевірки носія може позбавити вас клопоту, пов’язаного з початком встановлення, після якого на середині процесу виявляється, що програму встановлення потрібно зупинити через несправний інсталяційний носій. -4. Відбувається швидка перевірка медіа. - Цей крок перевірки носія може позбавити вас від проблем із запуском інсталяції лише на півдорозі, щоб дізнатися, що програму інсталяції потрібно зупинити через поганий інсталяційний носій. +1. Після завершення перевірки носія та його придатності до використання програма встановлення автоматично переходить до наступного екрана. -5. Після завершення перевірки носія та його придатності до використання програма встановлення автоматично переходить до наступного екрана. - -6. Виберіть мову, яку ви хочете використовувати для встановлення цього екрана. Для цього посібника ми вибрали *англійську (Сполучені Штати)*. Потім натисніть кнопку ++"continue"++. +2. Виберіть мову, яку ви хочете використовувати для встановлення цього екрана. Для цього посібника ми вибрали *англійську (Сполучені Штати)*. Потім натисніть кнопку ++"continue"++. ## Підсумок встановлення @@ -119,7 +118,7 @@ Rocky-.--.iso Натисніть опцію ++"Time & Date"++ на головному екрані *Підсумок встановлення*, щоб відкрити інший екран, який дозволить вам вибрати часовий пояс, у якому знаходиться машина. Прокрутіть список регіонів і міст і виберіть найближчу до вас область. -Залежно від джерела інсталяції параметр *Network Time* може бути встановлений на *ON* або *OFF* за умовчанням. Прийміть стандартне налаштування *ON*; це дозволяє системі автоматично встановлювати правильний час за допомогою мережевого протоколу часу (NTP). +Прийміть значення за замовчуванням та ввімкнено опцію ++"Автоматична дата й час"++, яка дозволяє системі автоматично встановлювати правильний час і дату за допомогою протоколу мережевого часу (NTP). Натисніть ++"done"++ після внесення будь-яких змін. @@ -129,18 +128,18 @@ Rocky-.--.iso #### Джерело встановлення -Оскільки під час встановлення використовується ISO-образ Rocky Linux 9, ви помітите, що *Локальний носій* автоматично вказано в розділі «Джерело встановлення» на головному екрані *Підсумок встановлення*. Ви можете прийняти стандартні налаштування. +Оскільки для встановлення ми використовуємо ISO-образ Rocky Linux 10, за замовчуванням для нас автоматично вибирається опція «Автоматично визначене джерело». Ви можете прийняти стандартні налаштування. !!! Tip "Підказка" - Область «Джерело» встановлення — це місце, де ви можете вибрати встановлення через мережу (наприклад, якщо ви використовуєте завантажувальний ISO Rocky Linux — Rocky-9.3-x86_64-boot.iso). Для мережевої інсталяції вам потрібно спочатку переконатися, що мережевий адаптер у цільовій системі правильно налаштований і має доступ до Інтернету. Щоб виконати інсталяцію через мережу, натисніть «Джерело інсталяції», а потім виберіть перемикач «У мережі». Після вибору виберіть `https` як протокол і введіть наступну URL-адресу в текстове поле `download.rockylinux.org/pub/rocky/9/BaseOS/x86_64/os`. Натисніть `Готово`. + Розділ «Джерело встановлення» дозволяє виконати мережеве встановлення (наприклад, якщо ви використовуєте завантажувальний ISO-образ Rocky Linux — Rocky-10.0-x86_64-boot.iso). Для мережевої інсталяції спочатку потрібно переконатися, що мережевий адаптер на цільовій системі правильно налаштований і може зв'язатися з джерелом(ами) інсталяції через мережу (локальна мережа або Інтернет). Щоб виконати інсталяцію через мережу, натисніть «Джерело інсталяції», а потім виберіть перемикач «У мережі». Потім виберіть правильний протокол і введіть правильний URI. Натисніть `Готово`. #### Вибір програмного забезпечення -Натиснувши опцію ++"Вибір програмного забезпечення"++ на головному екрані *Підсумок встановлення*, ви побачите розділ встановлення, де ви можете вибрати точні пакети програмного забезпечення, які буде встановлено в системі. Зона вибору програмного забезпечення поділяється на: +Натискання опції ++"Вибір програмного забезпечення"++ на головному екрані *Підсумок встановлення* відкриє область вибору програмного забезпечення, яка має два розділи: -- **Базове середовище**: мінімальна інсталяція та спеціальна операційна система -- **Додаткове програмне забезпечення для вибраного середовища**: якщо вибрати базове середовище ліворуч, праворуч буде показано різноманітне додаткове програмне забезпечення для встановлення для певного середовища. Зауважте, що це стосується лише тих випадків, коли ви встановлювали з повного DVD Rocky Linux 9.2 або якщо у вас налаштовано додаткові сховища. +- **Базове середовище**: мінімальна інсталяція +- **Додаткове програмне забезпечення для вибраного середовища**: Вибір базового середовища ліворуч відображає вибір додаткового програмного забезпечення для встановлення для цього середовища праворуч. Виберіть опцію *Мінімальна інсталяція* (базова функція). @@ -148,7 +147,7 @@ Rocky-.--.iso ### Системний розділ -Розділ «Система» на екрані *Підсумок встановлення* використовується для налаштування та внесення змін у речі, пов’язані з апаратним забезпеченням, що лежить в основі цільової системи. Тут ви створюєте розділи або томи жорсткого диска, вказуєте файлову систему, вказуєте конфігурацію мережі, увімкніть або вимкніть KDUMP або виберіть профіль безпеки. +Використовуйте розділ «Система» на екрані *Підсумок встановлення* для налаштування та внесення змін до параметрів, пов’язаних з базовим обладнанням цільової системи. Тут ви створюєте розділи або томи жорсткого диска, вказуєте файлову систему, вказуєте конфігурацію мережі, вмикаєте або вимикаєте KDUMP. #### Місце призначення @@ -180,23 +179,23 @@ Rocky-.--.iso Ви можете легко змінити ім’я хоста системи пізніше після встановлення ОС. -Наступне важливе завдання налаштування пов’язане з мережевими інтерфейсами в системі. +Наступне завдання конфігурації пов'язане з мережевими інтерфейсами в системі. -1. Переконайтеся, що на лівій панелі зазначено плату Ethernet (або будь-яку мережеву карту). +1. Переконайтеся, що на лівій панелі зазначено мережевий адаптер/карту 2. Натисніть будь-який із виявлених мережевих пристроїв на лівій панелі, щоб вибрати його. Властивості вибраного мережевого адаптера, які можна налаштувати, з’являться на правій панелі екрана. !!! Note "Примітка" - У нашому прикладі системи ми маємо два пристрої Ethernet ("ens3" і "ens4"), усі вони знаходяться в підключеному стані. Тип, назва, кількість і стан мережевих пристроїв у вашій системі можуть відрізнятися від пристроїв у нашій демонстраційній системі. + У нашій системі-прикладі є два пристрої Ethernet (`ens3` та `ens4`), обидва з яких перебувають у підключеному стані. Тип, назва, кількість і стан мережевих пристроїв у вашій системі можуть відрізнятися від пристроїв у нашій демонстраційній системі. -Переконайтеся, що перемикач пристрою, який ви хочете налаштувати, переведено в положення `ON` (синій) на правій панелі. Ми приймемо всі значення за замовчуванням у цьому розділі. +Verify the switch of the device you want to configure is in the `ON` (blue) position in the right pane. Ми приймемо всі значення за замовчуванням у цьому розділі. Натисніть ++"done"++, щоб повернутися до головного екрана *Підсумок встановлення*. !!! Warning "Важливо" - Зверніть увагу на IP-адресу сервера в цьому розділі цього інсталятора. Якщо у вас немає фізичного або легкого консольного доступу до системи, ця інформація стане в пригоді пізніше, коли вам потрібно буде підключитися до сервера, щоб продовжити роботу на ньому після завершення встановлення ОС. + Зверніть увагу на IP-адресу сервера в цьому розділі цього інсталятора. Якщо у вас немає фізичного або легкого консольного доступу до системи, ця інформація стане в нагоді пізніше, коли вам знадобиться підключитися до сервера після завершення встановлення ОС. ### Розділ налаштувань користувача @@ -210,22 +209,19 @@ Rocky-.--.iso Суперкористувач root є найбільш привілейованим обліковим записом у системі. Тому, якщо ви вирішите використовувати або ввімкнути його, дуже важливо захистити цей обліковий запис надійним паролем. -2. У текстовому полі *Root Password* установіть надійний пароль для користувача root. - -3. Знову введіть той самий пароль у текстове поле *Підтвердити*. +2. Ви побачите два варіанти: «Вимкнути обліковий запис root» АБО «Увімкнути обліковий запис root». Прийміть значення за замовчуванням. -4. Натисніть ++"done"++. +3. Натисніть ++"done"++. #### Створення користувача Щоб створити користувача: -1. Натисніть поле *Створення користувача* в розділі *Параметри користувача*, щоб відкрити екран завдань *Створити користувача*. - Ця область завдань дозволяє створити привілейований або непривілейований (не адміністратор) обліковий запис користувача. +1. Клацніть поле *Створення користувача* у розділі *Налаштування користувача*, щоб розпочати екран завдання *Створити користувача*. Використовуйте цю область завдань для створення привілейованого (адміністративного) або непривілейованого (неадміністративного) облікового запису користувача. - !!! Info "Інформація" + !!! Caution - Створення та використання непривілейованого облікового запису для повсякденних завдань у системі є хорошою практикою адміністрування системи. + У системі Rocky Linux 10 обліковий запис Root за замовчуванням вимкнено, тому важливо переконатися, що обліковий запис користувача, створений під час встановлення ОС, має права адміністратора. Цього користувача можна використовувати без привілеїв для виконання щоденних завдань у системі, а також він матиме можливість підвищувати свою роль для виконання адміністративних (root) функцій за потреби. Ми створимо звичайного користувача, який за потреби може використовувати повноваження суперкористувача (адміністратора). @@ -233,10 +229,10 @@ Rocky-.--.iso - **Full name**: `rockstar` - **Username**: `rockstar` - - **Make this user administrator**: Checked - - **Require a password to use this account**: Checked - - **Password**: `04302021` - - **Confirm password**: `04302021` + - **Add administrative privileges to this user account (wheel group membership)**: Checked + - **Require a password to use this account**: Checked + - **Password**: `04302021` + - **Confirm password**: `04302021` 3. Натисніть ++"done"++. @@ -252,7 +248,7 @@ Rocky-.--.iso !!! Note "Примітка" - Якщо ви не бажаєте продовжувати після натискання кнопки «Почати інсталяцію», ви все одно можете безпечно завершити інсталяцію без втрати даних. Щоб вийти з інсталятора, просто скиньте систему, натиснувши кнопку «Вийти», натиснувши ctrl-alt-del на клавіатурі або натиснувши кнопку скидання чи живлення. + Якщо ви не бажаєте продовжувати після натискання кнопки «Почати інсталяцію», ви все одно можете безпечно завершити інсталяцію без втрати даних. Щоб вийти з інсталятора, просто скиньте налаштування системи, натиснувши кнопку ++"Вийти"++, натиснувши ctrl-alt-del на клавіатурі або натиснувши кнопку скидання чи живлення. ### Завершення установки @@ -264,7 +260,7 @@ Rocky-.--.iso Тепер система налаштована та готова до використання. Ви побачите консоль Rocky Linux. -![Екран привітання Rocky Linux](images/installation_9_F02.png) +![Екран привітання Rocky Linux](images/installation_10_0_F02.png) Щоб увійти в систему: diff --git a/docs/guides/minimum_hardware_requirements.uk.md b/docs/guides/minimum_hardware_requirements.uk.md new file mode 100644 index 0000000000..e9b1805695 --- /dev/null +++ b/docs/guides/minimum_hardware_requirements.uk.md @@ -0,0 +1,126 @@ +# Rocky Linux 10 (Red Quartz) – Мінімальні вимоги до обладнання + +Rocky Linux 10 розроблений для забезпечення стабільності корпоративного рівня та сумісності з сучасним обладнанням. Ці мінімальні специфікації застосовуються до **мінімальних установок сервера**. Для графічного інтерфейсу або робочого середовища рекомендуються вищі специфікації. + +--- + +## ✅ Підтримувані архітектури процесорів + +Згідно з примітками до випуску Rocky Linux 10.0, Rocky Linux 10 офіційно підтримує такі архітектури: + +- **x86_64-v3** (Intel/AMD 64-bit CPUs з підтримкою щонайменше Haswell або еквівалентної AVX) +- **aarch64** (ARMv8-A 64-bit) +- **ppc64le** (IBM Power, Little Endian) +- **s390x** (IBM Z mainframes) +- **riscv64** (RISC‑V 64-bit) + +### ⚠️ Вимоги до функцій процесора + +- **x86_64-v3** вимагає AVX, AVX2, BMI1/2, FMA тощо, що відповідають Intel Haswell або пізнішої версії, або AMD Excavator або новішої. +- Старіші версії x86_64 (v1/v2) **не підтримуються**, якщо їх не перебудовують групи підтримки спільноти. + +--- + +## 🧠 CPU (Processor) + +- **1 ГГц 64-розрядний (x86_64‑v3)** або еквівалентний для інших архітектур +- Багатоядерні процесори, рекомендовані для використання на серверах, настільних комп'ютерах або у віртуалізації + +--- + +## 💾 Memory (RAM) + +- Мінімум **2 ГБ** (встановлення в текстовому режимі) +- Для встановлення з графічним інтерфейсом рекомендовано **4 ГБ+** +- **4–8 ГБ+** для виробничих навантажень або віртуалізації + +--- + +## 💽 Storage + +- Мінімальний дисковий простір **10 ГБ** +- **Рекомендовано 20 ГБ+** для розміщення оновлень, журналів, програм +- Для графічного інтерфейсу: **40 ГБ+** для забезпечення достатнього простору + +--- + +## 🌐 Network + +- Принаймні один функціональний адаптер Ethernet або бездротової мережі +- Підтримує налаштування DHCP або статичної IP-адреси через NetworkManager + +--- + +## 🖥️ Display (for GUI installations) + +- Мінімальна роздільна здатність **1024×768** через VGA, HDMI або DisplayPort +- Не потрібно для мінімальних встановлень сервера + +--- + +## 📀 Media Access + +- USB-порт (для інсталятора Live USB) або DVD-привід +- Хмарні інсталяції підтримують інсталяції на основі ISO або PXE + +--- + +## 🔒 Firmware + +- Підтримується завантаження з UEFI або BIOS; **рекомендовано UEFI** +- Підтримка безпечного завантаження (може знадобитися ручна реєстрація ключа) + +--- + +## 🗃️ Virtualization Support + +- Підтримка віртуальних середовищ (KVM, VMware, VirtualBox, Hyper-V) +- Для оптимізації продуктивності рекомендовані гостьові інструменти (наприклад, open-vm-tools, qemu-guest-agent) + +--- + +## 📝 Summary Table + +| Компоненти | Мінімальні вимоги | +| ---------------- | ----------------------------------------------------------------------------------------------------------------------------- | +| **CPU** | 1 ГГц 64-бітний (з підтримкою AVX x86_64-v3) або еквівалентний для ARM/POWER/Z/RISC-V | +| **RAM** | 1 GB (2 GB for GUI) | +| **Disk Space** | 10 GB (20 GB+ recommended; 40 GB+ for GUI) | +| **Network** | Ethernet або бездротовий адаптер | +| **Display** | 1024×768 capable (only for GUI) | +| **Media Access** | USB або DVD-ROM | +| **Firmware** | UEFI/BIOS (рекомендовано UEFI); Secure Boot (опціонально) | + +--- + +## 🎯 Рекомендовані характеристики за варіантами використання + +### 🏗️ Мінімальний сервер + +- CPU: 1 core x86_64-v3 (або ARM/POWER/Z/RISC‑V) +- RAM: 1 GB +- Storage: 10–20 GB + +### 🖥️ Desktop with GUI + +- CPU: 2+ cores x86_64-v3 (або схожий) +- RAM: 2–4 GB +- Storage: 20–40 GB + +### 🛠️ Development/Production Server + +- CPU: 4+ cores +- RAM: 4–8 GB+ +- Storage: 40 GB+ (на основі потреб у робочому навантаженні) + +--- + +## 🧩 Примітки + +- Завжди виділяйте додаткове сховище для журналів, оновлень пакетів та резервних копій. +- Для хмари або віртуалізації оберіть типи екземплярів, які відповідають або перевищують наведені вище специфікації. +- Оновлення з попередніх версій Rocky (наприклад, 8 або 9) до Rocky 10 не підтримуються — **потрібна чиста інсталяція**. + +--- + +**Останнє оновлення**: червень 2025 р. **Стосується**: початкового випуску Rocky Linux 10.0 diff --git a/docs/release_notes/10_0.uk.md b/docs/release_notes/10_0.uk.md new file mode 100644 index 0000000000..af887d60b3 --- /dev/null +++ b/docs/release_notes/10_0.uk.md @@ -0,0 +1,274 @@ +--- +title: Поточний реліз 10 +tags: + - 10 + - реліз 10.0 + - Rocky Linux 10 +--- + +## Rocky Linux 10 + +Rocky Linux 10 (RL 10) — це найновіший великий реліз корпоративної операційної системи Rocky Linux. + +### Оновлення до Rocky Linux 10 + +Rocky Linux не підтримує оновлення до жодного основного релізу. Щоб перейти з версії 8.x або 9.x на Rocky Linux 10, вам слід виконати чисту інсталяцію операційної системи. + +### Нові функції та зміни + +У наступних розділах описано вибрані функції RL 10. + +Як і у випадку з усіма основними випусками Rocky Linux, цей випуск охоплює численні покращення, зміни та нові функції. + +У наступному огляді висвітлено зміни в таких категоріях: Архітектура, Ядро, Інсталятор, Мережа, Безпека, Віртуалізація, Контейнери, Сховище та Керування пакетами. Тут вибрано функції, які найімовірніше матимуть значення для широкої аудиторії. + +Повний список основних змін дивіться у списку основних розробників [тут](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/10/html/10.0_release_notes/overview#overview-major-changes). + +### Підтримувані архітектури + +!!! warning "Будь ласка, перевірте сумісність процесора" + + На архітектурі процесора x86_64, RL 10 більше не підтримує апаратне забезпечення на рівні мікроархітектури x86-64-v2 та раніших версій, і робить рівень мікроархітектури x86-64-v3 базовим для розповсюдження. + + Для отримання додаткової інформації зверніться до розділу [Підтримувані рівні мікроархітектури](#supported-microarchitecture-levels), зокрема до розділу про тестування процесора на сумісність. + +!!! info "Припинення підтримки 32-бітного пакета" + + У Rocky Linux 10 видалено 32-бітну сумісність для x86_64. Натомість використовуйте 64-бітні бібліотеки або контейнери з 32-бітними залежностями. + +Rocky Linux 10 підтримується на таких архітектурах процесорів: + +- 64-bit AMD/Intel x86-64-v3 (x86_64) +- 64-bit RISC-V (riscv64) +- 64-bit ARMv8.0-A (aarch64) +- IBM POWER9, little endian (ppc64le) +- IBM z14 (s390x) + +#### Зовсім нова підтримка архітектури RISC-V + +Команда розробників релізу Rocky Linux довго та наполегливо працювала над тим, щоб забезпечити підтримку Rocky Linux 10 для певних реалізацій RISC-V.\ +Платформи/підсистеми, що підтримувалися на день випуску, включають StarFive VisionFive 2 (VF2), **QEMU** та SiFive HiFive Premier P550. + +Щоб отримати докладнішу інформацію про цю віху, зокрема про підтримку RISC-V у RL10, відвідайте [цей сайт](https://rockylinux.org/news/rockylinux-support-for-riscv). + +#### Підтримувані рівні мікроархітектури + +Мікроархітектура x86-64-v3 базується на наборі функцій покоління процесорів Intel Haswell. Декілька процесорів Intel Atom (таких як процесори сімейства Gracemont) підтримують x86-64-v3. На відміну від них, інші, включаючи процесори сімейства Intel Atom Parker Ridge та процесор сімейства Intel Atom x6416RE Elkhart Lake, не забезпечують функцій x86-64-v3 і тому не підтримуються в RL 10. Якщо ви сумніваєтеся в сумісності вашого процесора, [скористайтеся цією процедурою](https://docs.rockylinux.org/gemstones/test_cpu_compat/) для перевірки. + +Реалізація AMD рівня мікроархітектури x86-64-v3, яка служить базовою для Rocky Linux 10 на x86_64, була представлена ​​разом з їхньою мікроархітектурою Excavator. Це означає, що процесори, старіші за ті, що базуються на архітектурі Excavator, можуть не повністю підтримуватися Rocky Linux 10. + +!!! Note "Відмінності зображень Raspberry Pi" + + Ключова відмінність між образами Rocky Linux Pi для версії 10 полягає в тому, що 10 підтримує Pi 4 та Pi 5, тоді як 9 підтримує Pi 3, Pi 4, Pi 5 та Pi Zero 2W. + +### Встановлення та створення зображень + +Anaconda, інтерактивний графічний інтерфейс для інсталятора Rocky Linux, має низку змін у версії 10. + +Ключові зміни включають: + +- Вимкнення облікового запису root за замовчуванням. Для керування системою потрібно створити користувача-адміністратора з повними правами sudo. Якщо ви вирішите ввімкнути обліковий запис root, встановивши його пароль, то зможете створювати стандартних користувачів без прав адміністратора. +- Протокол віддаленого робочого столу (RDP) замінює VNC для графічного віддаленого доступу під час процесу встановлення. Ця зміна впливає на пов'язані параметри завантаження ядра. +- Видалення карти часового поясу в розділі «Час і дата» інсталятора. +- Графічний інтерфейс більше не підтримує додавання сторонніх репозиторіїв під час початкової інсталяції. Використовуйте замість цього параметр завантаження `inst.addrepo` або Kickstart. +- Видалення документації, яка була доступна на момент встановлення. + +### Ядро + +Стандартне ядро ​​для RL 10 оновлено до версії 6.12.0. + +Деякі функції ядра тепер вимкнено через те, що вони не підтримуються, є небезпечними або застарілими. + +Аргумент командного рядка ядра `rh_waived` може за потреби ввімкнути ці функції. Планувальник CFS замінює найперший прийнятний віртуальний термін виконання (EEVDF), який надає пріоритет завданням, чутливим до затримки, з коротшими часовими інтервалами для покращення швидкості реагування. + +### Мережа + +Покращення мережевих функцій у RL 10 включають зміни в конфігурації мережі, агрегації мережевих інтерфейсів, клієнтах і серверах DHCP, а також додавання та видалення драйверів пристроїв. + +#### NetworkManager та мережеві скрипти + +Старі мережеві скрипти ifcfg-rh були припинені в попередніх версіях Rocky Linux (9.x). У Rocky Linux 10 ці скрипти більше недоступні. + +Тепер ви повинні використовувати NetworkManager. До цих інструментів належать `nmcli`, `nmtui` та `nmstate`. Це означає, що деякі старіші файли та команди більше не працюватимуть, а також змінилося місце зберігання файлів конфігурації мережі. + +- Файли з префіксом ifcfg- у каталозі /etc/sysconfig/network-scripts/ не підтримуються. +- Команди ifup та ifdown більше недоступні. +- Застарілі мережеві скрипти, такі як ifup-local, більше не підтримуються. +- Файли конфігурації мережі зберігаються в папці /etc/NetworkManager/system-connections/. + +#### DHCP-клієнт і сервер + +Реалізація DHCP-клієнта в RL 10 здійснюється через внутрішню підсистему NetworkManager. Застарілий пакет dhcp-client видалено та більше не підтримується у вихідних версіях. + +Kea DHCP замінює DHCP-сервер ISC, термін служби якого закінчився, у RL 10. + +#### Зв'язування мережі та командна робота + +У попередніх версіях Rocky Linux функція об'єднання мережевих карт була застарілою. У RL 10 це тепер повністю видалено. Як заміну, налаштуйте зв'язок замість мережевої команди. + +### Пам’ять + +Окрім наступних змін, з RL 10 додано, оновлено або видалено кілька драйверів пристроїв, пов’язаних із сховищем. + +#### Глобальна файлова система 2 (GFS2) + +RL 10 більше не підтримує файлову систему GFS2. + +#### Device Mapper Multipath + +Увімкнення багатошляхового передавання даних за допомогою функції відображення пристроїв (DM) на пристроях NVMe не підтримується RL 10. + +#### Шифрування диска LUKS2 + +Пакет cryptsetup було перебазовано до версії 2.7 для вирішення проблем та підтримки пристроїв із LUKS-шифруванням під час використання служби дампа ядра (kdump). + +### Функції безпеки + +З RL 10 додано численні нові функції, пов'язані з безпекою. + +Деякі з оновлень включають: + +- Загальносистемні криптографічні політики (крипто-політики): OpenSSL та OpenSSH тепер працюють із постквантовими алгоритмами. +- Sequoia PGP: Реалізація OpenPGP без використання пам'яті. +- OpenSSH: Відновлення суворіших дозволів для ключів хоста SSH. (Нові дозволи = 0600 проти старих дозволів = 0640). +- GnuTLS: Сертифікати клієнта та сервера тепер стиснуті +- yescrypt algorithm: Алгоритм пароля для користувача за замовчуванням змінено. + +Нові зміни SELinux включають такі оновлення: + +- Еквівалентність контексту файлу інвертується до /var/run = /run. +- Додавання нових типів служб libvirt до політики SELinux. + +### Віртуалізація + +Віртуалізація зазнає ключових змін: + +- Монолітний демон libvirtd застарів. Використовуйте модульні демони та сокети як заміну. Будь ласка, дивіться детальну документацію щодо відмінностей у [документації основної розробки](https://libvirt.org/daemons.html#monolithic-vs-modular-daemons) +- Вилучення типу віртуальної машини i440fx +- Припинення підтримки Virtual Machine Manager, Cockpit є запланованою заміною + +### Контейнери + +Podman 5 у RL 10 впроваджує кілька покращень, зокрема нове середовище виконання контейнера за замовчуванням `crun`, яке замінює `runc`. Групи керування v2 тепер є версією cgroup за замовчуванням. + +Ключові оновлення включають припинення підтримки мережевого режиму slirp4netns, можливість налаштування повторних спроб та затримок для операцій push та pull образів, а також повну підтримку образів контейнерів з кількома архітектурами. + +Крім того, Podman 5 продовжує підтримувати Quadlets, функцію, представлену в Podman 4.4, яка дозволяє керувати контейнерами Podman за допомогою `systemd`, використовуючи декларативні файли модулів. + +### Управління програмним забезпеченням + +RPM тепер версії 4.19, яка включає покращення та оновлення інструментів пакування та збірки. Для правильного впорядкування рядків версій RPM у вихідних конвеєрах додано нову команду `rpmsort`. Для прикладу: + +The old `sort`: `rpm -q kernel | sort`\ +kernel-6.12.0-130.el10.x86_64\ +kernel-6.12.0-13.el10.x86_64 + +The new `rpmsort`: `rpm -q kernel | rpmsort`\ +kernel-6.12.0-13.el10.x86_64\ +kernel-6.12.0-130.el10.x86_64 + +#### DNF + +За замовчуванням DNF тепер пропускає завантаження метаданих списку файлів репозиторію, що покращує швидкість реагування та економить місце на диску. Команди DNF, яким потрібні ці метадані, зазвичай завантажують їх автоматично. + +#### Модульність + +Модульність DNF застаріла, і Rocky Linux не має наміру надавати контент AppStream як модулі в RL 10. У майбутньому RL 10 може надавати додаткові версії програм у вигляді RPM-пакетів, колекцій програмного забезпечення або Flatpaks. + +### Середовище робочого столу + +У RL 10 Wayland замінює сервер X.Org. Xwayland підтримуватиме більшість клієнтів X11, які ще не були портовані на Wayland. Деякі настільні програми та компоненти також замінено в RL 10. + +#### Зміни компонентів робочого столу + +| Видалено | Замінено | +| :------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------- | +| текстовий редактор gedit | GNOME Text Editor (gnome-text-editor) | +| Додаток Tweaks | Використовуйте параметри налаштувань у налаштуваннях GNOME та/або використовуйте Flatpak на Flathub | +| Festival speech synthesizer | Espeak NG | +| Eye of GNOME (eog) image viewer | GNOME Image Viewer (loupe) | +| Cheese camera application | Snapshot application | +| GNOME Terminal | ptyxis terminal | +| PulseAudio daemon (but not the client interfaces) | Pipewire (вже був стандартним у RL 9) | + +Кілька графічних програм для робочого столу більше не входять до дистрибутиву Rocky Linux 10. У більшості випадків ви можете отримати ці програми з основних джерел або як Flatpak на Flathub. + +#### Видалені програми + +| Видалено | Заміна | +| :------------------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Пакет офісного програмного забезпечення LibreOffice | Офіційно надається як Flatpak на Flathub, або ви можете завантажити пакети з основної сторінки [https://www.libreoffice.org/](https://www.libreoffice.org/). | +| Менеджер персональної інформації та поштовий клієнт Evolution | Thunderbird надається через репозиторій Appstream. Ви також можете отримати Flatpak або пакет від upstream або через Flathub. | +| Inkscape Vector Graphics Editor | У RL 10 немає редактора векторної графіки, але ви можете знайти Flatpak на Flathub. | +| Totem (GNOME Videos) media player | У RL 10 немає стандартного медіаплеєра для настільних комп'ютерів. Веббраузер все ще може відтворювати веб-медіафайли. Або ж ви можете вибрати інший медіаплеєр зі сторонніх репозиторіїв або як Flatpak від Flathub. | + +TigerVNC видалено з RL 10. Для функціональності VNC-клієнта використовуйте програму Connections. VNC-сервер не передбачено.\ +gnome-remote-desktop, використовуючи RDP, замінює TigerVNC для спільного використання робочого столу, віддаленого входу та безголових сеансів. Це вбудовано в GNOME, і ви можете налаштувати це в програмі "Налаштування". + +Середовище робочого столу та інструментарій Motif X11 також видалено з RL 10. + +### Послуги інфраструктури + +Заміна або видалення деяких послуг та пакетів у RL 10 включає такі інфраструктурні послуги. + +| Видалено | Замінено | +| :--------------------------------- | :---------------------------------------------------------------------------------------------- | +| power-profiles-daemon CPU throttle | шар перекладу tuned-ppd, який підтримує програми, написані для демона power-profiles | +| redis in-memory key-value database | valkey (a fork of redis) in-memory key-value database ^1 | +| sendmail mail transfer agent | Rocky Linux рекомендує перейти на агент передачі пошти Postfix. | +| spamassassin email spam filter | Фільтр спаму електронної пошти spamassassin тепер доступний у репозиторії EPEL. | + +1 Окрім `valkey`, у репозиторії Plus є пакет `valkey-compat-redis`. + +### Динамічні мови програмування + +Існують оновлення для останніх версій кількох популярних мов програмування: + +- Python 3.12 +- Ruby 3.3 +- Node.js 22.13 +- Perl 5.40 +- PHP 8.3 + +### Веб-сервери та сервери баз даних + +Існують оновлення багатьох популярних демонів сервера до новіших версій: + +#### Web servers + +- Apache HTTP Server 2.4.63 +- nginx 1.26 + +#### Proxy caching servers + +- Varnish Cache 7.6 +- Squid 6.10 + +#### Database servers + +- MariaDB 10.11 +- MySQL 8.4 +- PostgreSQL 16.8 +- Valkey 8.0 + +### Веб-консоль RL (Cockpit) + +Cockpit — це веб-інтерфейс для керування та моніторингу вашої локальної системи. Графічний файловий менеджер та текстовий редактор тепер доступні у веб-консолі, якщо ви встановите RPM-пакет `cockpit-files`. + +Перемикач хостів, який забезпечував одночасне керування кількома системами, застарів та вимкнено за замовчуванням з міркувань безпеки. + +Cockpit тепер підтримує налаштування обмежень розміру файлової системи Stratis. + +## Відомі проблеми + +### Проблема SELinux на віртуальних хостах + +Під час використання віртуального хоста з увімкненим сервером `passt` та типом пам'яті `memfd`, інтерфейс не запуститься, якщо ввімкнено SELinux. Див. [цей випуск основної версії](https://issues.redhat.com/browse/RHEL-80407) для отримання додаткової інформації. + +### Сірий екран після завантаження інсталяційного носія + +У певних конфігураціях обладнання, таких як віртуалізовані середовища з увімкненою 3D-графікою, Anaconda може зависати до відображення майстра налаштування. Цю проблему можна вирішити, переключившись з tty6 на інший tty, а потім назад на tty6. Наприклад, переключіться на tty1 і назад на tty6 за допомогою: ++ctrl+alt+f1++, а потім ++ctrl+alt+f6++. + +## Участь та повідомлення про помилки + +Будь ласка, повідомляйте про будь-які помилки, з якими ви зіткнулися, [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Ми також запрошуємо вас приєднатися до нашої спільноти будь-яким способом на наших [форумах](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC на Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Списки розсилки](https://lists.resf.org) або будь-яким іншим способом, яким ви бажаєте взяти участь! diff --git a/docs/release_notes/9_5.it.md b/docs/release_notes/9_5.it.md index ad1c238a77..728be29345 100644 --- a/docs/release_notes/9_5.it.md +++ b/docs/release_notes/9_5.it.md @@ -1,5 +1,5 @@ --- -title: Versione attuale 9.5 +title: Versione 9.5 tags: - 9.5 - 9.5 release diff --git a/docs/release_notes/9_6.it.md b/docs/release_notes/9_6.it.md new file mode 100644 index 0000000000..7e8f8456ab --- /dev/null +++ b/docs/release_notes/9_6.it.md @@ -0,0 +1,140 @@ +--- +title: Versione attuale 9.6 +tags: + - 9.6 + - 9.6 release + - Rocky 9.6 +--- + +## Note di rilascio per Rocky Linux 9.6 + +L'elenco completo della maggior parte dei cambiamenti è disponibile nelle [note di rilascio upstream, reperibili qui](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/index). + +## Aggiornamento + +È possibile aggiornare Rocky Linux 9.x a Rocky Linux 9.6 eseguendo `sudo dnf -y upgrade`. + +!!! Note "Nota" + + Rocky Linux non offre un percorso di aggiornamento da qualsiasi versione di Rocky Linux 8. Si consiglia di eseguire una nuova installazione del sistema operativo per passare a Rocky Linux 9.6. + +## Immagini + +Oltre alle immagini di installazione standard, sono disponibili diverse immagini, tra cui quelle per piattaforme cloud e container. + +Ulteriori informazioni sugli artefatti prodotti dal Cloud Special Interest Group e su come partecipare sono disponibili nella pagina [SIG/Cloud Wiki] (https://sig-cloud.rocky.page/). + +### Flusso di lavoro e processo di creazione delle immagini + +Con il rilascio di Rocky Linux 9.6, il processo di creazione e distribuzione delle immagini continua a migliorare. KIWI, un moderno strumento di creazione di immagini che consente un flusso di lavoro più coerente e manutenibile, ha creato la maggior parte delle immagini di questa release. + +Le immagini realizzate con ImageFactory includono Vagrant (Libvirt, VirtualBox e VMware) e OCP-Base (Oracle Cloud Platform). Tutte le altre immagini di Cloud e Container sono ora costruite con KIWI. Questa transizione ci consente di pubblicare aggiornamenti più frequentemente sulle piattaforme supportate, mantenendo la parità di funzionalità con le versioni precedenti. + +Se riscontrate problemi o differenze di comportamento, siete pregati di informarci. Ci proponiamo di risolvere o spiegare rapidamente qualsiasi cambiamento imprevisto. + +### Nuova immagine WSL + +Oltre agli aggiornamenti di KIWI, è arrivata anche l'introduzione di una nuova immagine WSL!\ +In questo modo è possibile utilizzare la normale esperienza out-of-box che hanno le immagini fornite dal produttore: + +- scaricare l'immagine: [x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-WSL-Base.latest.x86_64.wsl) o [aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-WSL-Base.latest.aarch64.wsl) +- per installare eseguire `wsl --install --from-file path/to/file.wsl rocky-wsl-base` o semplicemente fare doppio clic sul file wsl +- la prima volta che l'immagine wsl si avvia chiederà di specificare un nome utente + +Per ulteriori dettagli, consultare la [pagina di documentazione] (https://docs.rockylinux.org/guides/interoperability/import_rocky_to_wsl/). + +## Installazione + +Prima dell'installazione, [assicurarsi della compatibilità della CPU con questa procedura!](https://docs.rockylinux.org/gemstones/test_cpu_compat/) + +Per installare Rocky Linux 9.6, visitate la [pagina di download](https://rockylinux.org/download/) e scaricate la versione corrispondente alla vostra architettura. + +## Il comunicato del team Rocky evidenzia + +### Nuove e importanti + +## Modifiche importanti + +Per un elenco completo delle principali modifiche, vedere [lista upstream qui](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/overview#overview-major-changes). + +I punti salienti e le nuove funzionalità di questa release sono illustrati di seguito. + +### Sicurezza + +Di seguito sono elencati i punti salienti relativi alla sicurezza dell'ultima release Rocky Linux 9.6. Per un elenco completo delle modifiche relative alla sicurezza, consultare il [link upstream qui](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-security): + +- **SELinux** ora fornisce regole di policy aggiuntive che confinano `iio-sensor-proxy`, `power-profiles-daemon`, `switcheroo-control` e `samba-bgqd`. + +### Linguaggi di programmazione dinamica, server web e database + +Per un elenco dettagliato delle modifiche in questa categoria, si veda il [link a monte](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-dynamic-programming-languages-web-and-database-servers). + +Sono ora disponibili le versioni successive dei seguenti flussi di moduli: + +- **PHP 8.3** module stream +- **MySQL 8.4** module stream +- **nginx 1.26** module stream + +### Compilatori e strumenti di sviluppo + +Per i dettagli sui cambiamenti in questa categoria, vedere il [link a monte qui](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-compilers-and-development-tools) + +Strumenti di performance e debugger aggiornati: + +- **Valgrind 3.24.0** +- **SystemTap 5.2** +- **elfutils 0.192** +- **libabigail 2.6** + +Strumenti di monitoraggio delle prestazioni aggiornati: + +- **PCP 6.3.2** + +Aggiornati gli strumenti del compilatore: + +- **LLVM Toolset 19.17** +- **Rust Toolset 1.84.1** +- **Go Toolset 1.23** + +## Problemi noti + +### Il modulo corrente di ZFS non viene caricato in 9.6 + +Il modulo `zfs` di OpenZFS attualmente rilasciato **non si carica** su Rocky Linux 9.6. Per coloro che utilizzano `zfs` su 9.5 e hanno intenzione di passare a 9.6, si raccomanda di aspettare per ora. Se si sta pianificando una nuova installazione di 9.6 e si usa `zfs`, si deve attendere di nuovo il rilascio del modulo aggiornato. È possibile seguire la questione [qui](https://github.com/openzfs/zfs/issues/17332) e [qui](https://github.com/openzfs/zfs/issues/17364). + +**Aggiornamento:** Un aggiornamento al ramo 2.2.8 [risolve il problema con 9.6](https://github.com/openzfs/zfs/releases). Stiamo ancora aspettando un aggiornamento per la sezione 2.3. + +### Problema SELinux su server, workstation o sistemi host virtuali con `passt` installato + +Quando si utilizza una workstation, un server o un host virtuale con un back end `passt` installato, l'interfaccia non si avvia se SELinux è abilitato. Per ulteriori informazioni, vedere [questa issue upstream](https://issues.redhat.com/browse/RHEL-80407). + +### Errore di aggiornamento con i pacchetti `gstreamer` installati + +Se si aggiorna un sistema, si ottiene un errore: + + ``` + Error: Transaction test error: + file /usr/lib64/gstreamer-1.0/libgstdvbsuboverlay.so from install of gstreamer1-plugins-bad-free-1.22.12-4.el9_6.x86_64 conflicts with file from package gstreamer1-plugins-bad-freeworld-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstsiren.so from install of gstreamer1-plugins-bad-free-1.22.12-4.el9_6.x86_64 conflicts with file from package gstreamer1-plugins-bad-freeworld-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstasf.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstdvdlpcmdec.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstdvdsub.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstrealmedia.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + ``` + +Interrompere l'aggiornamento e procedere come segue prima di tentare nuovamente l'aggiornamento: + + ``` + sudo dnf swap gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 + sudo dnf swap gstreamer1-plugins-bad-freeworld-1:1.22.1-1.el9.x86_64 gstreamer1-plugins-bad-free-1.22.12-4.el9_6.x86_64 + ``` + +Come per ogni release, ci sono molti problemi noti. Per i dettagli completi su questi problemi, consultare il [upstream listing](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/known-issues). + +!!! info "Software deprecato" + + Alcuni flussi di applicazioni, che fanno parte dei repository di Rocky Linux 9.6, non riceveranno ulteriori aggiornamenti. Si tratta di un evento regolare che si verifica con quasi tutte le versioni. Assicuratevi di utilizzare l'ultima versione supportata del software. + +## Segnalazione di bug + +Si prega di segnalare qualsiasi bug riscontrato al [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Vi invitiamo inoltre a unirvi alla nostra comunità in qualsiasi modo desideriate, che sia sui nostri [Forums](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC on Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailing Lists](https://lists.resf.org), o in qualsiasi altro modo vogliate partecipare! diff --git a/docs/release_notes/9_6.uk.md b/docs/release_notes/9_6.uk.md new file mode 100644 index 0000000000..d6482e1dc3 --- /dev/null +++ b/docs/release_notes/9_6.uk.md @@ -0,0 +1,140 @@ +--- +title: Поточний реліз 9.6 +tags: + - 9.6 + - реліз 9.6 + - Rocky 9.6 +--- + +## Примітки до випуску Rocky Linux 9.6 + +Повний список більшості змін можна знайти в [нотатках до випуску основної версії, які можна знайти тут] (https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/index). + +## Оновлення + +Ви можете оновити Rocky Linux з версії 9.x до Rocky Linux 9.6, виконавши команду `sudo dnf -y upgrade`. + +!!! Note "Примітка" + + Rocky Linux не пропонує шлях оновлення з жодної версії Rocky Linux 8. Ми рекомендуємо виконати чисту інсталяцію ОС для оновлення до Rocky Linux 9.6. + +## Зображення + +Окрім стандартних образів інсталяції, доступно кілька образів, зокрема для хмарних та контейнерних платформ. + +Ви можете знайти більше інформації про артефакти, створені Cloud Special Interest Group, а також подробиці про те, як долучитися, на [сторінці SIG/Cloud Wiki] (https://sig-cloud.rocky.page/). + +### Робочий процес і процес створення зображення + +З виходом Rocky Linux 9.6 процес створення та доставки наших образів продовжує вдосконалюватися. Більшість образів для цього випуску було створено KIWI, сучасним інструментом для створення образів, який забезпечує більш послідовний та зручний робочий процес. + +Образи, що досі створюються за допомогою ImageFactory, включають Vagrant (Libvirt, VirtualBox та VMware) та OCP-Base (Oracle Cloud Platform). Усі інші образи хмари та контейнерів тепер створюються за допомогою KIWI. Цей перехід дозволяє нам частіше публікувати оновлення на підтримуваних платформах, зберігаючи при цьому паритет функцій з попередніми випусками. + +Якщо у вас виникнуть будь-які проблеми або відмінності в поведінці, будь ласка, повідомте їх. Ми прагнемо швидко вирішити або пояснити будь-які неочікувані зміни. + +### Нове зображення WSL + +Також тут з'явився новий образ WSL, а також оновлення KIWI!\ +Це дає змогу використовувати звичайний інтерфейс «відразу після розпакування», який мають зображення, надані магазином: + +- завантажте образ: [x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-WSL-Base.latest.x86_64.wsl) або [aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-WSL-Base.latest.aarch64.wsl) +- Щоб встановити, виконайте команду `wsl --install --from-file path/to/file.wsl rocky-wsl-base` або просто двічі клацніть файл wsl +- під час першого запуску образу wsl вам буде запропоновано вказати ім'я користувача + +Докладнішу інформацію можна знайти на [сторінці документації](https://docs.rockylinux.org/guides/interoperability/import_rocky_to_wsl/). + +## Встановлення + +Перед встановленням [переконайтеся, що ваш процесор сумісний з цією процедурою!] (https://docs.rockylinux.org/gemstones/test_cpu_compat/) + +Щоб встановити Rocky Linux 9.6, відвідайте [сторінку завантаження](https://rockylinux.org/download/) та завантажте версію, що відповідає вашій архітектурі. + +## Найцікавіші моменти випуску команди Rocky + +### Нові та помітні + +## Основні зміни + +Повний список основних змін дивіться у [списку оновлень тут](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/overview#overview-major-changes). + +Основні моменти та нові можливості цього випуску детально описані нижче. + +### Безпека + +Нижче наведено основні моменти, пов'язані з безпекою, в останньому випуску Rocky Linux 9.6. Повний список змін, пов’язаних із безпекою, див. за [посиланням на останню версію](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-security): + +- **SELinux** тепер надає додаткові правила політик, що обмежують `iio-sensor-proxy`, `power-profiles-daemon`, `switcheroo-control` та `samba-bgqd`. + +### Динамічні мови програмування, сервери веб та бази даних + +Детальний список змін у цій категорії див. за [посиланням на вищезгадану версію тут](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-dynamic-programming-languages-web-and-database-servers). + +Тепер доступні пізніші версії наступних потоків модулів: + +- Потік модулів **PHP 8.3** +- Потік модулів **MySQL 8.4** +- Потік модулів **nginx 1.26** + +### Компілятори та засоби розробки + +Детальніше про зміни в цій категорії див. [посилання на вищезгадану версію тут](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-compilers-and-development-tools) + +Оновлені інструменти продуктивності та налагоджувачі: + +- **Valgrind 3.24.0** +- **SystemTap 5.2** +- **elfutils 0.192** +- **libabigail 2.6** + +Оновлені інструменти моніторингу продуктивності: + +- **PCP 6.3.2** + +Оновлені набори інструментів компілятора: + +- **LLVM Toolset 19.17** +- **Rust Toolset 1.84.1** +- **Go Toolset 1.23** + +## Відомі проблеми + +### Поточний модуль ZFS не завантажується у версії 9.6 + +Поточний випущений модуль `zfs` від OpenZFS **не завантажується** на Rocky Linux 9.6. Тим, хто використовує `zfs` на версії 9.5 і планує оновлення до 9.6, рекомендується поки що почекати. Якщо ви плануєте чисту інсталяцію версії 9.6 та використовуєте `zfs`, тоді вам слід знову дочекатися виходу оновленого модуля. Ви можете слідкувати за випуском [тут](https://github.com/openzfs/zfs/issues/17332) та [тут](https://github.com/openzfs/zfs/issues/17364). + +**Оновлення:** Оновлення гілки 2.2.8 [виправляє проблему з 9.6](https://github.com/openzfs/zfs/releases). Все ще чекаю на оновлення для гілки 2.3. + +### Проблема SELinux на сервері, робочій станції або віртуальних хост-системах із встановленим `passt` + +Під час використання робочої станції, сервера або віртуального хоста з встановленим сервером `passt`, інтерфейс не запуститься, якщо ввімкнено SELinux. Див. [цей випуск основної версії](https://issues.redhat.com/browse/RHEL-80407) для отримання додаткової інформації. + +### Помилка оновлення з встановленими пакетами `gstreamer` + +Під час оновлення системи виникає помилка: + + ``` + Error: Transaction test error: + file /usr/lib64/gstreamer-1.0/libgstdvbsuboverlay.so from install of gstreamer1-plugins-bad-free-1.22.12-4.el9_6.x86_64 conflicts with file from package gstreamer1-plugins-bad-freeworld-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstsiren.so from install of gstreamer1-plugins-bad-free-1.22.12-4.el9_6.x86_64 conflicts with file from package gstreamer1-plugins-bad-freeworld-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstasf.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstdvdlpcmdec.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstdvdsub.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstrealmedia.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + ``` + +Зупиніть оновлення та виконайте наведені нижче дії, перш ніж повторити спробу оновлення: + + ``` + sudo dnf swap gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 + sudo dnf swap gstreamer1-plugins-bad-freeworld-1:1.22.1-1.el9.x86_64 gstreamer1-plugins-bad-free-1.22.12-4.el9_6.x86_64 + ``` + +Як і в будь-якому випуску, існує багато відомих проблем. Перегляньте [список оновлень](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/known-issues) для отримання повної інформації про ці проблеми. + +!!! info "Застаріле програмне забезпечення" + + Деякі потоки програм, що є частиною репозиторіїв Rocky Linux 9.6, не отримуватимуть подальших оновлень. Це регулярне явище, яке трапляється майже з кожним випуском. Переконайтеся, що ви використовуєте останню підтримувану версію програмного забезпечення. + +## Повідомлення про помилки + +Будь ласка, повідомляйте про будь-які помилки, з якими ви зіткнулися, [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Ми також запрошуємо вас приєднатися до нашої спільноти будь-яким способом, будь то на наших [форумах](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC на Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Списки розсилки](https://lists.resf.org), або іншим способом, яким ви бажаєте взяти участь! diff --git a/docs/release_notes/index.it.md b/docs/release_notes/index.it.md index b7477e2e41..cd7506ee09 100644 --- a/docs/release_notes/index.it.md +++ b/docs/release_notes/index.it.md @@ -11,6 +11,14 @@ Benvenuti nel nostro elenco di note di rilascio per Rocky Linux. Le versioni pi ## Rilasci di Rocky Linux +## Rocky 10 + +Rocky 10 (nome in codice "Red Quartz") ha un supporto generale fino al 31 maggio 2030 e un supporto di sicurezza fino al 31 maggio 2035. Le architetture supportate sono x86_64_v3, riscv64, aarch64, ppc64le e s390x. + +| Numero di Rilascio | Data di Disponibilità Generale | Versione del Kernel | +| ------------------ | ------------------------------ | ------------------- | +| 10.0 | 2025-06-11 | 6.12.0-55.14.1 | + ## Rocky 9 ### Panoramica @@ -27,6 +35,7 @@ Rocky 9 (nome in codice "Blue Onyx") ha un supporto generale fino al 31 maggio 2 | 9.3 | 2023-11-20 | 5.14.0-362.8.1 | | 9.4 | 2024-05-09 | 5.14.0-427.13.1 | | 9.5 | 2024-11-19 | 5.14.0-503.14.1 | +| 9.6 | 2025-06-04 | 5.14.0-570.18.1 | ## Rocky 8 From be22a27f6e62eadf21a1e3c6417034349e17e9ab Mon Sep 17 00:00:00 2001 From: Ganna Zhyrnova <112796922+gannazhyrnova@users.noreply.github.com> Date: Mon, 16 Jun 2025 16:41:46 +0300 Subject: [PATCH 038/164] installation.md (#2753) * installation.md Grammar Check * Update installation.md One minor change to remove a ":" --------- Co-authored-by: sspencerwire --- docs/guides/installation.md | 72 ++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/docs/guides/installation.md b/docs/guides/installation.md index a4490b617c..84f87ad894 100644 --- a/docs/guides/installation.md +++ b/docs/guides/installation.md @@ -6,7 +6,7 @@ contributors: # Installing Rocky Linux 10 -This is a detailed guide for installing a 64-bit version of the Rocky Linux distribution on a standalone system. We will be performing a server class install. We will step through the installation and customization steps in the following sections. +This is a detailed guide for installing a 64-bit version of the Rocky Linux distribution on a standalone system. We will be performing a server-class install. We will step through the installation and customization steps in the following sections. ## OS Installation Prerequisites @@ -31,11 +31,11 @@ For example, `Rocky-10.0-x86_64-minimal.iso` !!! Note - The Rocky Project web page lists several mirrors located around the globe. Choose the mirror geographically closest to you. The list of official mirrors can be found [here](https://mirrors.rockylinux.org/mirrormanager/mirrors). + The Rocky Project website lists several mirrors located around the world. Select the mirror that is geographically closest to you. The list of official mirrors can be found [here](https://mirrors.rockylinux.org/mirrormanager/mirrors). ## Verifying the Installation Program ISO File -If you've downloaded the Rocky Linux ISO(s) on an existing Linux distribution, you can use the `sha256sum` utility to verify that file(s) you downloaded are not corrupt. We will show an example of verifying the `Rocky-10.0-x86_64-minimal.iso` file by checking its checksum. +If you've downloaded the Rocky Linux ISO(s) on an existing Linux distribution, you can use the `sha256sum` utility to verify that the file(s) you downloaded are not corrupt. We will demonstrate the verification of the `Rocky-10.0-x86_64-minimal.iso` file by checking its checksum. 1. Download the file that contains the official checksums for the available ISOs. @@ -51,7 +51,7 @@ If you've downloaded the Rocky Linux ISO(s) on an existing Linux distribution, y sha256sum -c CHECKSUM --ignore-missing ``` - This checks the integrity of the ISO file downloaded previously, provided that it is in the same directory. The output should show: + This checks the integrity of the previously downloaded ISO file, provided it is in the same directory. The output should show: ```text Rocky-10.0-x86_64-minimal.iso: OK @@ -62,30 +62,30 @@ If you've downloaded the Rocky Linux ISO(s) on an existing Linux distribution, y !!! Tip Before starting the installation, ensure that the system’s Unified Extensible Firmware Interface (UEFI) or Basic Input/Output System (BIOS) is properly configured to boot from the correct medium. - Also make sure that you review the recommended [minimum hardware requirements](minimum_hardware_requirements.md) notes for running Rocky Linux 10. + Also, make sure that you review the recommended [minimum hardware requirements](minimum_hardware_requirements.md) notes for running Rocky Linux 10. Once the system is set up to boot from the media with the ISO file, we can begin the installation. -1. Insert and boot from the installation medium (optical disk, USB flash drive, and so on). +1. Insert and boot from the installation medium (e.g., optical disk, USB flash drive). 2. Once the computer has booted, you see the Rocky Linux 10 installer splash screen. ![Rocky Linux installation splash screen](images/installation_10_0_F01.png) -3. At the welcome screen, you can use the ++"up"++ or ++"down"++ arrow keys to select any of the options followed by pressing ++enter++ to run the selected option. If you do not press any key, the installation program starts a countdown, after which the installation process automatically executes the default, highlighted, option: +3. At the welcome screen, you can use the ++"up"++ or ++"down"++ arrow keys to select any of the options, followed by pressing ++enter++ to run the selected option. If you do not press any key, the installation program starts a countdown, after which the installation process automatically executes the default, highlighted option: `Test this media & install Rocky Linux 10.0` 4. A quick media verification step takes place. -This media verification step can save you the trouble of starting the installation only to discover halfway through that the installation program has to stop because of bad installation media. +This media verification step can save you the trouble of starting the installation only to discover halfway through that the installation program has to stop due to faulty installation media. -1. After the media check runs to completion and the media is successfully verified to be usable, the installation program automatically continues to the next screen. +1. After the media check is completed and the media is successfully verified as usable, the installation program automatically proceeds to the next screen. -2. Select the language you want to use to perform the installation in this screen. For this guide, we select *English (United States)*. Then click the ++"continue"++ button. +2. Select the language you want to use to install this screen. For this guide, we select *English (United States)*. Then click the ++"continue"++ button. ## Installation Summary -The `Installation Summary` screen is an all-in-one area where you make important decisions about the system's installation. +The `Installation Summary` screen is a comprehensive area where you make key decisions about the system's installation. The screen is roughly divided into the following sections: @@ -94,11 +94,11 @@ The screen is roughly divided into the following sections: - *SYSTEM* - *USER SETTINGS* -We will delve into each of these sections next and make changes where necessary. +We will delve into each of these sections next and make any necessary changes. ### Localization Section -This section customizes items related to the system's geographic location. This includes – Keyboard, Language Support, Time and Date. +This section customizes items related to the system's geographic location. This includes – Keyboard, Language Support, Time, and Date. #### Keyboard @@ -106,7 +106,7 @@ In this guide's demo system, we accept the default value (*English US*) and make However, if you need to make any changes here, from the *Installation Summary* screen, click the ++"keyboard"++ option to specify the system's keyboard layout. Using the ++plus++ button, you can add and order additional keyboard layouts as necessary. -When finished with this screen click ++"done"++. +When finished with this screen, click ++"done"++. #### Language Support @@ -116,9 +116,9 @@ We will accept the default value - **English (United States)** and make no chang #### Time & Date -Click the ++"Time & Date"++ option on the main *Installation Summary* screen to bring up another screen that will allow for the selection of the timezone where the machine is located. Use the drop down arrows to select the region and city closest to you. +Click the ++"Time & Date"++ option on the main *Installation Summary* screen to bring up another screen that will allow for the selection of the timezone where the machine is located. Use the drop-down arrows to select the region and city closest to you. -Accept the default and enabled ++"Automatic date & time"++ option that allows the system to automatically set the correct time and date by using the Network Time Protocol (NTP). +Accept the default and enable ++"Automatic date & time"++ option, which allows the system to automatically set the correct time and date using the Network Time Protocol (NTP). Click ++"done"++ when completed. @@ -128,11 +128,11 @@ Under the *Software* section of the *Installation Summary* screen, you can selec #### Installation Source -Because we are using a Rocky Linux 10 ISO image for the installation, the Auto-detected source option is automatically selected for us by default. Accept the preset default installation source. +Since we are using a Rocky Linux 10 ISO image for the installation, the Auto-detected source option is selected by default for us. Accept the preset default installation source. !!! Tip - The installation Source area allows you to perform a network-based installation (for example, if you use the Rocky Linux boot ISO - Rocky-10.0-x86_64-boot.iso). For a network-based installation, you need first to ensure that a network adapter on the target system is properly configured, and can reach the installation source(s) over the network (lan or internet)internet. To perform a network-based installation, click `Installation Source` and then select the `On the network` radio button. Then select the correct protocol and type the correct URI. Click `Done`. + The installation Source area allows you to perform a network-based installation (for example, if you use the Rocky Linux boot ISO - Rocky-10.0-x86_64-boot.iso). For a network-based installation, you must first ensure that a network adapter on the target system is configured correctly and can reach the installation source(s) over the network (LAN or Internet). To perform a network-based installation, click `Installation Source` and then select the `On the network` radio button. Then select the correct protocol and type the correct URI. Click `Done`. #### Software Selection @@ -147,13 +147,13 @@ Click ++"done"++ at the top of the screen. ### System Section -Use the System section of the *Installation Summary* screen for customizing and making changes to things related to the underlying hardware of the target system. This is where you create your hard disk drive partitions or volumes, specify the file system, specify the network configuration, enable or disable KDUMP. +Use the System section of the *Installation Summary* screen for customizing and making changes to things related to the underlying hardware of the target system. This is where you create your hard disk drive partitions or volumes, specify the file system, specify the network configuration, and enable or disable KDUMP. #### Installation Destination From the *Installation Summary* screen, click the ++"Installation Destination"++ option. This takes you to the corresponding task area. -You will see a screen displaying all the candidate disk drives that you have available on the target system. If you have only one disk drive on the system, as on our sample system, you see the drive listed under *Local Standard Disks* with a checkmark beside it. Clicking the disk icon will toggle on or off the disk selection checkmark. Keep it checked to select the disk. +You will see a screen displaying all the candidate disk drives available on the target system. If you have only one disk drive on the system, as on our sample system, you see the drive listed under *Local Standard Disks* with a checkmark beside it. Clicking the disk icon toggles the disk selection checkmark on or off. Keep it checked to select the disk. Under the *Storage Configuration* section: @@ -165,13 +165,13 @@ Under the *Storage Configuration* section: ### Network & Host Name -The next important task of the installation procedure under the System area deals with network configuration, where you can configure or tweak network-related settings for the system. +The following important task in the installation procedure under the System area involves network configuration, where you can configure or adjust network-related settings for the system. !!! Note After you click on the ++"Network & Host Name"++ option, all correctly detected network interface hardware (such as Ethernet, wireless network cards, and so on) will be listed in the left pane of the network configuration screen. Depending on your specific hardware setup, Ethernet devices in Linux have names similar to `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3`, and so on. You can configure each interface using DHCP or manually set the IP address. - If you choose to configure manually, be sure to have all the required information ready, such as the IP address, netmask, and so on. + If you choose to configure manually, ensure that you have all the required information ready, such as the IP address, netmask, and other relevant details. Clicking the ++"Network & Host Name"++ button in the main *Installation Summary* screen opens the corresponding configuration screen. Here, you can also configure the system's hostname. @@ -179,28 +179,28 @@ Clicking the ++"Network & Host Name"++ button in the main *Installation Summary* You can easily change the system hostname later on after the OS has been installed. -The next configuration task is related to the network interfaces on the system. +The following configuration task involves the system's network interfaces. 1. Verify that the left pane lists a network adapter/card 2. Click any of the detected network devices in the left pane to select it. -The selected network adapter's configurable properties appear in the screen's right pane. +The selected network adapter's configurable properties appear in the right pane of the screen. !!! Note - On our sample system, we have two Ethernet devices (`ens3` and `ens4`), both of which are in a connected state. The type, name, quantity, and state of the network devices on your system may vary from the ones on our demo system. + On our sample system, we have two Ethernet devices (`ens3` and `ens4`), both of which are in a connected state. The type, name, quantity, and state of the network devices on your system may differ from those on our demo system. -Verify the switch of the device you want to configure is in the `ON` (blue) position in the right pane. +Verify that the switch of the device you want to configure is in the `ON` (blue) position in the right pane. We will accept all the defaults in this section. Click ++"done"++ to return to the main *Installation Summary* screen. !!! Warning - Pay attention to the IP address of the server in this section of this installer. If you do not have physical or easy console access to the system, this information will come in handy later on when you need to connect to the server after the OS installation is completed. + Pay attention to the IP address of the server in this section of the installer. If you do not have physical or easy console access to the system, this information will be useful later when you need to connect to the server after the OS installation is complete. ### User Settings Section -Use this section for creating a password for the `root` user account and also for creating new administrative or non-administrative accounts. +Use this section to create a password for the `root` user account and to create new administrative or non-administrative accounts. #### Root Password @@ -208,9 +208,9 @@ Use this section for creating a password for the `root` user account and also fo !!! Warning - The root superuser is the most privileged account on the system. Therefore, if you choose to use or enable it, it is crucial that you protect this account with a strong password. + The root superuser is the most privileged account on the system. If you choose to use or enable it, you must protect this account with a strong password. -2. You will see two options to either "Disable root account" OR "Enable root account". +2. You will see two options: "Disable root account" or "Enable root account". Accept the default. 3. Click ++"done"++. @@ -219,11 +219,11 @@ Accept the default. To create a user: -1. Click the *User Creation* field under *User Settings* to start the *Create User* task screen. Use this task area for the creation of a privileged (administrative) or non-privileged (non-administrative) user account. +1. Click the *User Creation* field under *User Settings* to start the *Create User* task screen. Use this task area to create a privileged (administrative) or non-privileged (non-administrative) user account. !!! Caution - On a Rocky Linux 10 system, the Root account is disabled by default and so it is important to ensure that the user account created during the OS installation has administrative privileges. This user can be used in a non-privileged manner for day-to-day tasks on the system and will also have the ability to elevate their role to perform administrative (root) functions as necessary. + On a Rocky Linux 10 system, the Root account is disabled by default; therefore, it is essential to ensure that the user account created during the OS installation has administrative privileges. This user can be used in a non-privileged manner for day-to-day tasks on the system and will also have the ability to elevate their role to perform administrative (root) functions as necessary. We will create a regular user that can invoke superuser (administrator) powers when needed. @@ -246,18 +246,18 @@ To create a user: ## Installer Phase -Once satisfied with your choices for the various installation tasks, the next phase of the installation process will begin the installation proper. +Once you are satisfied with your choices for the various installation tasks, the next phase of the installation process will begin the actual installation. ### Start the Installation Once satisfied with your choices for the various installation tasks, click the ++"Begin Installation"++ button on the main *Installation Summary* screen. The installation will begin, and the installation program will show the progress of the installation. -After the installation begins, various tasks will begin running in the background, such as partitioning the disk, formatting the partitions or LVM volumes, checking for and resolving software dependencies, writing the operating system to the disk, and so on. +After the installation starts, various tasks will begin running in the background, such as partitioning the disk, formatting the partitions or LVM volumes, checking for and resolving software dependencies, writing the operating system to the disk, and other similar tasks. !!! Note - If you do not wish to continue after clicking the ++"Begin Installation"++ button, you can still safely exit the installation without losing data. To quit the installer, simply reset your system by clicking the ++"Quit"++ button, pressing ctrl-alt-del on the keyboard, or pushing the reset or power switch. + If you do not wish to continue after clicking the ++"Begin Installation"++ button, you can still safely exit the installation without losing data. To quit the installer, simply reset your system by clicking the ++"Quit"++ button, pressing Ctrl-Alt-Delete on the keyboard, or pushing the reset or power switch. ### Complete the Installation @@ -278,6 +278,6 @@ To log onto the system: 2. At the Password prompt, type `04302021` (rockstar’s password) and press ++enter++ (the password will ***not*** be echoed to the screen, that is normal). 3. Run the `whoami` command after login. -This command shows the name of the currently logged in user. +This command shows the name of the currently logged-in user. ![Login Screen](images/installation_9.0_F03.png) From 1763821e40b41d664deab33d50eb3ae92fda32dc Mon Sep 17 00:00:00 2001 From: tianci li <86754294+jimcat8@users.noreply.github.com> Date: Mon, 16 Jun 2025 21:47:06 +0800 Subject: [PATCH 039/164] Adjust the punctuation marks (#2735) * Adjust the punctuation marks * update * Revise the wording of the explanatory text * Update time * Modify pronouns based on the context * Readjust the layout of text content --- docs/books/admin_guide/11-tasks.md | 34 +++++++++++++++--------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/books/admin_guide/11-tasks.md b/docs/books/admin_guide/11-tasks.md index 4496c8cbd9..c4fb6e4c30 100644 --- a/docs/books/admin_guide/11-tasks.md +++ b/docs/books/admin_guide/11-tasks.md @@ -125,7 +125,7 @@ If the same user exists in `/etc/cron.deny` and `/etc/cron.allow` at the same ti When a user schedules a task, there is a file created with their name under `/var/spool/cron/`. -This file contains all the information the `crond` needs to know regarding tasks created by this user, including the commands or programs to run, and the schedule for running them (hour, minute, day, etc.). Note that the minimum time unit that `crond` can recognize is 1 minute. There are similar scheduling tasks in RDBMS (such as MySQL), where time-based scheduling tasks are referred to as the "Event Scheduler." The minimum time unit it can recognize is 1 second, and event-based scheduling tasks are referred to as "Triggers." +This file contains all the information the `crond` needs to know regarding tasks created by this user, including the commands or programs to run, and the schedule for running them (hour, minute, day, etc.). Note that the minimum time unit that `crond` can recognize is 1 minute. There are similar scheduling tasks in RDBMS (such as MySQL), where time-based scheduling tasks are referred to as the "Event Scheduler" (whose recognizable time unit is 1 second), and event-based scheduling tasks are referred to as "Triggers". ![Cron tree](images/tasks-001.png) @@ -147,14 +147,14 @@ Example: |--------|-----------------------------------------------------------| | `-e` | Edits the schedule file with vi | | `-l` | Displays the contents of the schedule file | -| `-u` | Sets the name of the user whose schedule file is to be manipulated | +| `-u ` | Specify a single user to operate | | `-r` | Deletes the schedule file | !!! Warning `crontab` without options deletes the old schedule file and waits for the user to enter new lines. You have to press ctrl + d to exit this editing mode. - Only the `root` can use the `-u user` option to manage another user's schedule file. + Only the `root` can use the `-u ` option to manage another user's schedule file. The example above allows the root to schedule a task for user1. @@ -206,12 +206,12 @@ The `crontab` file is structured according to the following rules. To simplify the notation for the definition of time, it is advisable to use special symbols. -| Wildcards | Description | +| Special symbol | Description | |---------------|----------------------------------| -| `*` | Indicates all possible values of the field | -| `-` | Indicates a range of values | -| `,` | Indicates a list of values | -| `/` | Defines a step | +| `*` | Indicates all the time values of the field | +| `-` | Indicates a continuous time range | +| `,` | Indicates the discontinuous time range | +| `/` | Indicateds time interval | Examples: @@ -221,19 +221,19 @@ Script executed on April 15 at 10:25 am: 25 10 15 04 * /root/scripts/script > /log/… ``` -Run at 11 am and then at 4 pm every day: +Run the task once a day at 11 am and once a day at 4 pm: ```bash 00 11,16 * * * /root/scripts/script > /log/… ``` -Run every hour from 11 am to 4 pm every day: +The task runs once an hour from 11 am to 4 pm every day: ```bash 00 11-16 * * * /root/scripts/script > /log/… ``` -Run every 10 minutes during working hours: +Run every 10 minutes during working hours on weekdays: ```bash */10 8-17 * * 1-5 /root/scripts/script > /log/… @@ -254,12 +254,12 @@ For the root user, `crontab` also has some special time settings: A user, rockstar, wants to edit his `crontab` file: -1. `crond` checks to see if he is allowed (`/etc/cron.allow` and `/etc/cron.deny`). +1. The `crond` daemon checks to see if the user is allowed (`/etc/cron.allow` and `/etc/cron.deny`). -2. If he is, he accesses his `crontab` file (`/var/spool/cron/rockstar`). +2. If the user is allowed, they access their `crontab` file (`/var/spool/cron/rockstar`). - Every minute `crond` reads the schedule files. +The `crond` daemon: -3. It executes the scheduled tasks. - -4. It reports systematically in a log file (`/var/log/cron`). +* Reads - Reads the scheduled task files of all users every minute. +* Runs - Runs tasks according to the schedule. +* Writes - Writes the corresponding events and messages to the (`/var/log/cron`) file. From 59551dac5d159aab4dd770066a9d931644b055b4 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Tue, 17 Jun 2025 11:11:36 -0400 Subject: [PATCH 040/164] New Crowdin updates (#2756) * New translations 1_regular_expressions_vs_wildcards.md (Italian) * New translations 1_regular_expressions_vs_wildcards.md (Ukrainian) --- .../books/sed_awk_grep/1_regular_expressions_vs_wildcards.it.md | 2 +- .../books/sed_awk_grep/1_regular_expressions_vs_wildcards.uk.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/books/sed_awk_grep/1_regular_expressions_vs_wildcards.it.md b/docs/books/sed_awk_grep/1_regular_expressions_vs_wildcards.it.md index 2e3e275635..c467e6258c 100644 --- a/docs/books/sed_awk_grep/1_regular_expressions_vs_wildcards.it.md +++ b/docs/books/sed_awk_grep/1_regular_expressions_vs_wildcards.it.md @@ -1,7 +1,7 @@ --- title: Espressioni regolari e wildcards author: Tianci Li -contributors: null +contributors: tags: - Regular expressions - Wildcards diff --git a/docs/books/sed_awk_grep/1_regular_expressions_vs_wildcards.uk.md b/docs/books/sed_awk_grep/1_regular_expressions_vs_wildcards.uk.md index b99c9b9745..8087276c25 100644 --- a/docs/books/sed_awk_grep/1_regular_expressions_vs_wildcards.uk.md +++ b/docs/books/sed_awk_grep/1_regular_expressions_vs_wildcards.uk.md @@ -1,7 +1,7 @@ --- title: Регулярні вирази та символи підстановки author: tianci li -contributors: null +contributors: tags: - Регулярні вирази - Символи підстановки From 32bea3934c0cedca0a5c3c325c6387a6968aa89d Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Tue, 17 Jun 2025 12:17:51 -0500 Subject: [PATCH 041/164] remove rsod from guides (#2757) * RSOD has been moved, but the placeholder still existed in guides-removed --- docs/guides/.pages | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/guides/.pages b/docs/guides/.pages index c7dffa991d..229a289951 100644 --- a/docs/guides/.pages +++ b/docs/guides/.pages @@ -7,7 +7,6 @@ nav: - ... | update_versions*.md - ... | custom-linux-kernel*.md - Contribute: contribute - - RSOD: rsod - Automation: automation - Backup & Sync: backup - Content Management: cms From cf94b9c793f11b69cea6b25797422ddd0286ea63 Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Wed, 18 Jun 2025 09:19:47 -0500 Subject: [PATCH 042/164] Good docs new (#2759) * Changes to `good_docs.md` New document that describes what makes a good document from a translator's view * Add conclusion --- docs/rocky_insights/blogs/good_docs.md | 82 ++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 docs/rocky_insights/blogs/good_docs.md diff --git a/docs/rocky_insights/blogs/good_docs.md b/docs/rocky_insights/blogs/good_docs.md new file mode 100644 index 0000000000..cdd501b630 --- /dev/null +++ b/docs/rocky_insights/blogs/good_docs.md @@ -0,0 +1,82 @@ +--- +title: Good Docs-A translator's viewpoint +author: Ganna Zhyrnova +contributors: Steven Spencer +--- + +## Introduction + +Translator's provide valuable insight into writing clear, concise, documentation. They know what does not translate well and what confuses a reader better than most. This document examines some of those issues and highlights best-practices for document creation. + +### From the author + +Software documentation helps users understand how to use a particular software effectively. They need to understand what they will have at the end and what benefits they will have. At the same time, when you create documentation, it means that you create it not only for yourself but also for your network and for other people who might read it. Other people might not be from English-speaking countries. It means that for them, English is not their primary language. Because of this, follow these basic rules to make your documentation more readable for *all* users. + +## Use plain language + +You have no idea who your user is. Whether this user is familiar with this sphere or not, whether they are a skilled developer or a beginner. Plain language is communication that is clear, concise, and easy for the intended audience to understand the first time they encounter it. It avoids jargon, technical terms, and complex sentence structures in favor of simpler language and clear organization. The goal is to ensure that the message is accessible and understandable to a broad audience, regardless of their background or reading level. Often, you can do this by simplifying sentence structures or commands down to their most basic format. + +## Avoid idioms, jargon, acronyms, and contractions + +Idioms, jargon, contractions, and acronyms can confuse readers who are unfamiliar with them, especially non-native speakers, new employees, or people outside your specific domain. + +**Idioms** are often culturally specific and can be difficult for international readers to understand. +**Jargon** involves specialized terms that only experts in a field might recognize. +**Contractions** replace words in the English language with short cuts, but these do not always exist in all languages, making translation difficult. +**Acronyms** can be ambiguous, especially if not defined when first used. + +Example: + +❌ "Once you’ve got the hang of the dashboard, the rest is a piece of cake." Here, the author uses both a contraction, slang, and an idiom. + ✅ "Once you have learned how to use the dashboard, the rest is easy." By replacing the contraction, the slang, and the idiom with the words associated with each, the meaning is clear. +Figurative language, such as idioms, often does not translate well. Technical writers or translators might struggle to convey the same meaning in other languages. + +Example: + +❌ "Let’s touch base next week to circle back on the open tickets." + ✅ "Let us meet next week to review the unresolved support requests." +Jargon and acronyms can be confusing—even within the same organization—if their meanings are not universally known. + +Example: + +❌ "Upload the CSV to the CMS and tag it according to SOPs." + ✅ "Upload the CSV (Comma-Separated Values file) to the content management system and label it according to the standard operating procedures." +Note: If you want to use acronyms, always define them the first time: “Customer Relationship Management (CRM) system”. + +By eliminating idioms and unnecessary jargon, the meaning of your document becomes more clear. Replacing contractions with the words they represent, means that translation efforts in all languages are easier. Your document is the most understandable to the reader when you replace or define acronyms. + +## Use active voice + +Active voice emphasizes the doer of the action, making it clear who or what is responsible for the action of the verb. + +Example: + +The system opens the dialog where you need to complete the form. + +Please refrain from using the complex form, as it can be confusing for readers. + +For more on the use of active voice and the importance of using it, see [this opinion](active_voice.md) and [this outside source](https://developers.google.com/tech-writing/one/active-voice). + +## Specific steps + +If you have specific steps in the documentation, separate them from one another. + +For example: + +Step 1 - Go to the section +Step 2 - Click the button +Step 3 - Complete the form +... +Step N - save changes + +## Screenshots when necessary + +Use correct screenshots where needed. This means that you do not need to add screenshots everywhere, only in places where you need further explanation. + +## Use examples + +If you need to fill out the form, then provide examples of how users can complete it. Mention limitations if they have them. + +## Conclusion + +Writing good documentation is not just making it technically accurate, it is also very important to make it instantly understandable to the reader. This is particularly important when a technical document needs translation into other languages. Within this document, it was the author's intent to highlight specific techniques for writing good, clear, documentation. From 1ca1fb52dbd5d784f680756c8e2b401b38b3cb4c Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Wed, 18 Jun 2025 09:45:08 -0500 Subject: [PATCH 043/164] formatting of `good_docs.md` (#2760) --- docs/rocky_insights/blogs/good_docs.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/docs/rocky_insights/blogs/good_docs.md b/docs/rocky_insights/blogs/good_docs.md index cdd501b630..e0a0318104 100644 --- a/docs/rocky_insights/blogs/good_docs.md +++ b/docs/rocky_insights/blogs/good_docs.md @@ -20,27 +20,33 @@ You have no idea who your user is. Whether this user is familiar with this spher Idioms, jargon, contractions, and acronyms can confuse readers who are unfamiliar with them, especially non-native speakers, new employees, or people outside your specific domain. -**Idioms** are often culturally specific and can be difficult for international readers to understand. -**Jargon** involves specialized terms that only experts in a field might recognize. -**Contractions** replace words in the English language with short cuts, but these do not always exist in all languages, making translation difficult. -**Acronyms** can be ambiguous, especially if not defined when first used. +**Idioms** are often culturally specific and can be difficult for international readers to understand. +**Jargon** involves specialized terms that only experts in a field might recognize. +**Contractions** replace words in the English language with shortcuts, but these do not always exist in all languages, making translation difficult. +**Acronyms** can be ambiguous, especially if not defined when first used. Example: ❌ "Once you’ve got the hang of the dashboard, the rest is a piece of cake." Here, the author uses both a contraction, slang, and an idiom. + ✅ "Once you have learned how to use the dashboard, the rest is easy." By replacing the contraction, the slang, and the idiom with the words associated with each, the meaning is clear. + Figurative language, such as idioms, often does not translate well. Technical writers or translators might struggle to convey the same meaning in other languages. Example: ❌ "Let’s touch base next week to circle back on the open tickets." + ✅ "Let us meet next week to review the unresolved support requests." + Jargon and acronyms can be confusing—even within the same organization—if their meanings are not universally known. Example: ❌ "Upload the CSV to the CMS and tag it according to SOPs." + ✅ "Upload the CSV (Comma-Separated Values file) to the content management system and label it according to the standard operating procedures." + Note: If you want to use acronyms, always define them the first time: “Customer Relationship Management (CRM) system”. By eliminating idioms and unnecessary jargon, the meaning of your document becomes more clear. Replacing contractions with the words they represent, means that translation efforts in all languages are easier. Your document is the most understandable to the reader when you replace or define acronyms. From b7aebbaa81c61a944000ee6fd9057ced01ba7728 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Wed, 18 Jun 2025 12:38:57 -0400 Subject: [PATCH 044/164] New Crowdin updates (#2758) * New translations 11-tasks.md (Ukrainian) * New translations installation.md (Ukrainian) * New translations 9_6_installation.md (Ukrainian) * New translations 16-about-sytemd.md (Italian) * New translations 4_awk_command.md (Italian) * New translations 16-about-sytemd.md (Ukrainian) * New translations 4_awk_command.md (Ukrainian) --- docs/books/admin_guide/11-tasks.uk.md | 46 ++--- docs/books/admin_guide/16-about-sytemd.it.md | 204 +++++++++---------- docs/books/admin_guide/16-about-sytemd.uk.md | 204 +++++++++---------- docs/books/sed_awk_grep/4_awk_command.it.md | 2 +- docs/books/sed_awk_grep/4_awk_command.uk.md | 2 +- docs/guides/9_6_installation.uk.md | 10 +- docs/guides/installation.uk.md | 2 +- 7 files changed, 235 insertions(+), 235 deletions(-) diff --git a/docs/books/admin_guide/11-tasks.uk.md b/docs/books/admin_guide/11-tasks.uk.md index b96c0fc120..abc12325f6 100644 --- a/docs/books/admin_guide/11-tasks.uk.md +++ b/docs/books/admin_guide/11-tasks.uk.md @@ -125,7 +125,7 @@ user2 Коли користувач планує завдання, у директорії `/var/spool/cron/` створюється файл з його іменем. -Цей файл містить усю інформацію, яку має знати `crond` щодо всіх задач, створених цим користувачем, команд або програм, які потрібно виконати, і часу їх запуску (година, хвилина, день ...). Зверніть увагу, що мінімальна одиниця часу, яку може розпізнати `crond`, становить 1 хвилину. Подібні завдання планування існують у СУБД (таких як MySQL), де завдання планування на основі часу називаються "Планувальником подій". Мінімальна одиниця часу, яку він може розпізнати, становить 1 секунду, а завдання планування на основі подій називаються «тригерами». +Цей файл містить усю інформацію, яку має знати `crond` щодо всіх задач, створених цим користувачем, команд або програм, які потрібно виконати, і часу їх запуску (година, хвилина, день ...). Зверніть увагу, що мінімальна одиниця часу, яку може розпізнати `crond`, становить 1 хвилину. Подібні завдання планування існують у реляційних СУБД (таких як MySQL), де завдання планування на основі часу називаються "Планувальником подій" (розпізнаваною одиницею часу якого є 1 секунда), а завдання планування на основі подій називаються "Тригерами". ![Дерево Cron](images/tasks-001.png) @@ -143,18 +143,18 @@ crontab [-u user] [-e | -l | -r] [root]# crontab -u user1 -e ``` -| Опція | Опис | -| ----- | -------------------------------------------------------------------- | -| `-e` | Редагує файлу розкладу за допомогою vi | -| `-l` | Відображення вмісту файлу розкладу | -| `-u` | Встановлює ім’я користувача, файлом розкладу якого потрібно керувати | -| `-r` | Видаляє файл розкладу | +| Опція | Опис | +| ----------------- | -------------------------------------- | +| `-e` | Редагує файлу розкладу за допомогою vi | +| `-l` | Відображення вмісту файлу розкладу | +| `-u ` | Визначає одного користувача для роботи | +| `-r` | Видаляє файл розкладу | !!! Warning "Увага" `crontab` без опції видаляє старий файл розкладу та чекає, поки користувач введе нові рядки. Ви повинні натиснути ctrl + d щоб вийти з цього режиму редагування. - Тільки `root` може використовувати параметр `-u user` для керування файлом розкладу іншого користувача. + Тільки користувач `root` може використовувати опцію `-u ` для керування файлом розкладу іншого користувача. Приклад вище дозволяє root запланувати завдання для користувача1. @@ -206,12 +206,12 @@ crontab [-u user] [-e | -l | -r] Для спрощення позначення для визначення часу доцільно використовувати спеціальні символи. -| Символи підстановки | Опис | -| ------------------- | -------------------------------- | -| `*` | Вказує всі можливі значення поля | -| `-` | Вказує діапазон значень | -| `,` | Вказує на список значень | -| `/` | Визначає крок | +| Спеціальні символи | Опис | +| ------------------ | ---------------------------------------- | +| `*` | Вказує всі значення часу поля | +| `-` | Вказує на безперервний часовий діапазон | +| `,` | Вказує на переривчастий часовий діапазон | +| `/` | Вказаний часовий інтервал | Приклади: @@ -221,19 +221,19 @@ crontab [-u user] [-e | -l | -r] 25 10 15 04 * /root/scripts/script > /log/… ``` -Запуск об 11:00, а потім о 16:00 щодня: +Виконуйте завдання один раз на день об 11: 00 та один раз на день о 16: 00: ```bash 00 11,16 * * * /root/scripts/script > /log/… ``` -Запуск щогодини з 11:00 до 16:00 щодня: +Завдання виконується раз на годину з 11: 00 до 16: 00 щодня: ```bash 00 11-16 * * * /root/scripts/script > /log/… ``` -Запуск кожні 10 хвилин у робочий час: +Виконувати кожні 10 хвилин у робочий час у будні дні: ```bash */10 8-17 * * 1-5 /root/scripts/script > /log/… @@ -254,12 +254,12 @@ crontab [-u user] [-e | -l | -r] Користувач, rockstar, хоче відредагувати свій файл `crontab`: -1. `crond` перевіряє, чи він дозволений (`/etc/cron.allow` і `/etc/cron.deny`). +1. Демон `crond` перевіряє, чи має користувач доступ (`/etc/cron.allow` та `/etc/cron.deny`). -2. Якщо так, він отримує доступ до свого файлу `crontab` (`/var/spool/cron/rockstar`). +2. Якщо користувачеві дозволено, він отримає доступ до свого файлу `crontab` (`/var/spool/cron/rockstar`). - Щохвилини `crond` читає файли розкладу. +Демон `crond`: -3. Він виконує заплановані завдання. - -4. Він систематично звітує у файлі журналу (`/var/log/cron`). +* Reads - щохвилини зчитує файли запланованих завдань усіх користувачів. +* Runs - Виконує завдання згідно з розкладом. +* Writes - Записує відповідні події та повідомлення до файлу (`/var/log/cron`). diff --git a/docs/books/admin_guide/16-about-sytemd.it.md b/docs/books/admin_guide/16-about-sytemd.it.md index adcf86d344..70559ee47a 100644 --- a/docs/books/admin_guide/16-about-sytemd.it.md +++ b/docs/books/admin_guide/16-about-sytemd.it.md @@ -190,17 +190,17 @@ Dalla pagina man (`man 7 bootup`), possiamo consultare il diagramma di avvio di - "sysinit.target" e "basic.target" sono punti di controllo durante il processo di avvio. Sebbene uno degli obiettivi di `systemd` sia quello di avviare i servizi di sistema in parallelo, è necessario avviare i "target" di alcuni servizi e funzionalità prima di avviare altri servizi e "target" - Una volta completate le "units" da cui dipende "sysinit.target", l'avvio passerà alla fase "sysinit.target". Queste "units" possono essere avviate in parallelo, tra cui: - - Montare il file system - - Impostare il file di swap - - Avviare udev - - Impostare il seme del generatore casuale - - Avviare i servizi di basso livello - - Impostare i servizi di crittografia + - Montare il file system + - Impostare il file di swap + - Avviare udev + - Impostare il seme del generatore casuale + - Avviare i servizi di basso livello + - Impostare i servizi di crittografia - "sysinit.target" avvierà tutti i servizi di basso livello e le "units" necessarie per le funzioni essenziali del sistema operativo, che sono necessarie prima di entrare nella fase "basic.target". - Dopo aver completato la fase "sysinit.target", `systemd` avvia tutte le "units" necessarie per completare il "target" successivo (cioè "basic.target"). Il target offre ulteriori funzioni, tra cui: - - Impostare i percorsi delle directory per i vari file eseguibili. - - socket di comunicazione - - timers + - Impostare i percorsi delle directory per i vari file eseguibili. + - socket di comunicazione + - timers - Infine, viene eseguita l'inizializzazione per il "target" a livello di utente ("multiuser.target" o "graphical.target"). `systemd` deve arrivare a "multi-user.target" prima di accedere a "graphical.target". È possibile eseguire il seguente comando per visualizzare le dipendenze necessarie per l'avvio completo: @@ -484,113 +484,113 @@ Di solito esistono tre intitolazioni per le unit di tipo ".service": 1. Intitolazione della unit - Sono utilizzabili le seguenti coppie chiave-valore: + Sono utilizzabili le seguenti coppie chiave-valore: - - `Description=OpenSSH server daemon`. La stringa viene utilizzata per descrivere la "unit". - - `Documentation=man:sshd(8) man:sshd_config(5)`. Un elenco separato da spazi di URI che fanno riferimento alla documentazione di questa "unit" o della sua configurazione. Sono accettati solo URI del tipo "http://", "https://", "file:", "info:", "man:". - - `After=network.target sshd-keygen.target`. Definisce la relazione della sequenza di avvio con altre "unit". In questo esempio, "network.target" e "sshd-keygen.target" si avviano per primi e "sshd.service" per ultimo. - - `Before=`. Definisce la relazione della sequenza di avvio con le altre "unit". - - `Requires=`. Configura le dipendenze da altre "unit" I valori possono essere più unit separate da spazi. Se la '"unit" corrente è attivata, si attiveranno anche i valori qui elencati. Se almeno uno dei valori elencati di "unit" non si attiva correttamente, `systemd` non avvia la "unit" corrente. - - `Wants=sshd-keygen.target`. Simile alla chiave `Requires`. La differenza consiste nel fatto che se la unit dipendente non si avvia, ciò non influisce sul normale funzionamento della "unit" corrente. - - `BindsTo=`. Simile alla chiave `Requires`. La differenza è data dal fatto che se una qualsiasi "unit" dipendente non si avvia, l'unità corrente viene arrestata in aggiunta alla "unit" che arresta la dipendenza. - - `PartOf=`. Simile alla chiave `Requires`. La differenza consiste nel fatto che se una qualsiasi "unit" dipendente non si avvia, oltre all'arresto e al riavvio delle unit dipendenti, viene arrestata e riavviata anche la "unit" corrente. - - `Conflicts=`. Il suo valore è un elenco di "unit" separate da spazi. Se la "unit" elencata dal valore è in funzione, la "unit" corrente non può essere eseguita. - - `OnFailure=`. Quando la "unit" corrente viene interrotta, la "unit" o le "unit" (separate da spazi) presenti nel valore si attivano. + - `Description=OpenSSH server daemon`. La stringa viene utilizzata per descrivere la "unit". + - `Documentation=man:sshd(8) man:sshd_config(5)`. Un elenco separato da spazi di URI che fanno riferimento alla documentazione di questa "unit" o della sua configurazione. Sono accettati solo URI del tipo "http://", "https://", "file:", "info:", "man:". + - `After=network.target sshd-keygen.target`. Definisce la relazione della sequenza di avvio con altre "unit". In questo esempio, "network.target" e "sshd-keygen.target" si avviano per primi e "sshd.service" per ultimo. + - `Before=`. Definisce la relazione della sequenza di avvio con le altre "unit". + - `Requires=`. Configura le dipendenze da altre "unit" I valori possono essere più unit separate da spazi. Se la '"unit" corrente è attivata, si attiveranno anche i valori qui elencati. Se almeno uno dei valori elencati di "unit" non si attiva correttamente, `systemd` non avvia la "unit" corrente. + - `Wants=sshd-keygen.target`. Simile alla chiave `Requires`. La differenza consiste nel fatto che se la unit dipendente non si avvia, ciò non influisce sul normale funzionamento della "unit" corrente. + - `BindsTo=`. Simile alla chiave `Requires`. La differenza è data dal fatto che se una qualsiasi "unit" dipendente non si avvia, l'unità corrente viene arrestata in aggiunta alla "unit" che arresta la dipendenza. + - `PartOf=`. Simile alla chiave `Requires`. La differenza consiste nel fatto che se una qualsiasi "unit" dipendente non si avvia, oltre all'arresto e al riavvio delle unit dipendenti, viene arrestata e riavviata anche la "unit" corrente. + - `Conflicts=`. Il suo valore è un elenco di "unit" separate da spazi. Se la "unit" elencata dal valore è in funzione, la "unit" corrente non può essere eseguita. + - `OnFailure=`. Quando la "unit" corrente viene interrotta, la "unit" o le "unit" (separate da spazi) presenti nel valore si attivano. - Per ulteriori informazioni, vedere `man 5 systemd.unit`. + Per ulteriori informazioni, vedere `man 5 systemd.unit`. 2. Intitolazione del Servizio - Sono utilizzabili le seguenti coppie chiave-valore: - - - `Type=notify`. Configurare il tipo di unit ".service", che può essere uno dei seguenti: - - `simple` - Il servizio si avvia come processo principale. Questa è l'impostazione predefinita. - - `forking` - Il servizio richiama processi biforcati e viene eseguito come parte del daemon principale. - - `exec` - Simile a `semplice`. Il gestore del servizio avvierà questa unit subito dopo aver eseguito il binario del servizio principale. Le altre unit successive devono rimanere bloccate fino a questo punto prima di poter proseguire l'avvio. - - `oneshot` - Simile a `simple`, ma il processo deve uscire prima che `systemd` avvii i servizi di follow-up. - - `dbus` - Simile a `simple`, tranne per il fatto che il daemon acquisisce il nome del bus D-Bus. - - `notify` - Simile a `simple`, tranne per il fatto che il daemon invia un messaggio di notifica usando `sd_notify` o una chiamata equivalente dopo l'avvio. - - `idle` - Simile a `simple`, tranne per il fatto che l'esecuzione del servizio viene ritardata fino a quando tutti i lavori attivi non vengono distribuiti. - - `RemainAfterExit=`. Se il servizio corrente deve essere considerato attivo quando tutti i processi del servizio terminano. L'impostazione predefinita è no. - - `GuessMainPID=`. Il valore è di tipo booleano ed è predefinito a yes. In assenza di una posizione definita per il processo principale del servizio, `systemd` deve indovinare il PID del processo principale (che potrebbe non essere corretto). Se si imposta `Type=forking` e non si imposta `PIDFile`, questa coppia di valori chiave diventerà effettiva. Altrimenti, verrà ignorata la coppia chiave-valore. - - `PIDFile=`. Specificare il percorso del file (percorso assoluto) del PID del servizio. Per i servizi `Type=forking`, si raccomanda di usare questa coppia chiave-valore. `systemd` legge il PID del processo principale del daemon dopo l'avvio del servizio. - - `BusName=`. Un nome del bus D-Bus per raggiungere questo servizio. Questa opzione è obbligatoria per i servizi dove viene utilizzato `Type=dbus`. - - `ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY`. I comandi e gli argomenti eseguiti all'avvio del servizio. - - `ExecStartPre=`. Altri comandi che vengono eseguiti prima dei comandi in `ExecStart`. - - `ExecStartPost=`. Gli altri comandi che verranno eseguiti dopo i comandi in `ExecStart`. - - `ExecReload=/bin/kill -HUP $MAINPID`. I comandi e gli argomenti vengono eseguiti quando il servizio viene ricaricato. - - `ExecStop=`. I comandi e gli argomenti che verranno eseguiti all'arresto del servizio. - - `ExecStopPost=`. Comandi aggiuntivi da eseguire dopo l'arresto del servizio. - - `RestartSec=42s`. Il tempo in secondi di sospensione prima di riavviare un servizio. - - `TimeoutStartSec=`. Il tempo in secondi di attesa per l'avvio del servizio. - - `TimeoutStopSec=`. Il tempo in secondi di attesa per l'arresto del servizio. - - `TimeoutSec=`. Un'abbreviazione per configurare contemporaneamente `TimeoutStartSec` e `TimeoutStopSec`. - - `RuntimeMaxSec=`. Tempo massimo in secondi per l'esecuzione del servizio. Passando \`infinity' (il valore predefinito) non si configura alcun limite di tempo di esecuzione. - - `Restart=on-failure`. Configura se riavviare il servizio quando il processo del servizio esce, viene terminato o raggiunge un timeout: - - `no` - Il servizio non verrà riavviato. Questa è l'impostazione predefinita. - - `on-success` - Si riavvia solo quando il processo di servizio esce in modo pulito (codice di uscita 0). - - `on-failure` - Si riavvia solo quando il processo di servizio non esce in modo pulito (codice di uscita non-zero). - - `on-abnormal` - Si riavvia se il processo termina con un segnale o quando si verifica un timeout. - - `on-abort` - Si riavvia se il processo esce a causa di un segnale imprevisto non specificato come condizione di uscita pulita. - - `on-watchdog` - Se impostato su `on-watchdog`, il servizio si riavvia solo se il timeout del watchdog scade. - - `always` - Si riavvia sempre. - - Le condizioni di uscita e l'effetto delle impostazioni di `Restart=` su di esse: - - ![effect](./images/16-effect.png) - - - `KillMode=process`. Specifica il modo in cui i processi di questa unit devono essere arrestati. Il suo valore può essere uno dei seguenti: - - `control-group` - Valore predefinito. Se impostato su `control-group`, tutti i processi rimanenti nel gruppo di controllo di questa unit vengono arrestati all'arresto della stessa. - - `process` - Viene arrestato solo il processo principale. - - `mixed` - Il segnale SIGTERM viene inviato al processo principale, mentre il successivo segnale SIGKILL viene inviato a tutti i processi rimanenti del gruppo di controllo della unit. - - `none` - Non arresta alcun processo. - - `PrivateTmp=`. Utilizzare o meno una directory tmp privata. In base a determinate condizioni di sicurezza, si consiglia di impostare il valore su yes. - - `ProtectHome=`. Proteggere o meno la home directory. Il suo valore può essere uno dei seguenti: - - `yes` - Le tre directory (/root/, /home/, /run/user/) non sono visibili alla unit. - - `no` - Le tre directory sono visibili alla unit. - - `read-only` - Le tre directory sono di sola lettura per la unit. - - `tmpfs` - Il file system temporaneo verrà montato in modalità di sola lettura su queste tre directory. - - `ProtectSystem=`. La directory utilizzata per proteggere il sistema dalla modifica da parte del servizio. Il valore può essere: - - `yes` - Indica che il processo chiamato dalla unit sarà montato in sola lettura sulle directory /usr/ e /boot/. - - `no` - Valore predefinito - - `full` - Indica che le directory /usr/, /boot/, /etc/ sono montate in sola lettura. - - `strict` - Tutti i file system sono montati in sola lettura (escluse le directory dei file system virtuali come /dev/, /proc/ e /sys/). - - `EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config`. Legge le variabili d'ambiente da un file di testo. "-" significa che se il file non esiste, non verrà letto e non verranno registrati errori o avvisi. - - Per ulteriori informazioni, vedere `man 5 systemd.service`. + Sono utilizzabili le seguenti coppie chiave-valore: + + - `Type=notify`. Configurare il tipo di unit ".service", che può essere uno dei seguenti: + - `simple` - Il servizio si avvia come processo principale. Questa è l'impostazione predefinita. + - `forking` - Il servizio richiama processi biforcati e viene eseguito come parte del daemon principale. + - `exec` - Simile a `semplice`. Il gestore del servizio avvierà questa unit subito dopo aver eseguito il binario del servizio principale. Le altre unit successive devono rimanere bloccate fino a questo punto prima di poter proseguire l'avvio. + - `oneshot` - Simile a `simple`, ma il processo deve uscire prima che `systemd` avvii i servizi di follow-up. + - `dbus` - Simile a `simple`, tranne per il fatto che il daemon acquisisce il nome del bus D-Bus. + - `notify` - Simile a `simple`, tranne per il fatto che il daemon invia un messaggio di notifica usando `sd_notify` o una chiamata equivalente dopo l'avvio. + - `idle` - Simile a `simple`, tranne per il fatto che l'esecuzione del servizio viene ritardata fino a quando tutti i lavori attivi non vengono distribuiti. + - `RemainAfterExit=`. Se il servizio corrente deve essere considerato attivo quando tutti i processi del servizio terminano. L'impostazione predefinita è no. + - `GuessMainPID=`. Il valore è di tipo booleano ed è predefinito a yes. In assenza di una posizione definita per il processo principale del servizio, `systemd` deve indovinare il PID del processo principale (che potrebbe non essere corretto). Se si imposta `Type=forking` e non si imposta `PIDFile`, questa coppia di valori chiave diventerà effettiva. Altrimenti, verrà ignorata la coppia chiave-valore. + - `PIDFile=`. Specificare il percorso del file (percorso assoluto) del PID del servizio. Per i servizi `Type=forking`, si raccomanda di usare questa coppia chiave-valore. `systemd` legge il PID del processo principale del daemon dopo l'avvio del servizio. + - `BusName=`. Un nome del bus D-Bus per raggiungere questo servizio. Questa opzione è obbligatoria per i servizi dove viene utilizzato `Type=dbus`. + - `ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY`. I comandi e gli argomenti eseguiti all'avvio del servizio. + - `ExecStartPre=`. Altri comandi che vengono eseguiti prima dei comandi in `ExecStart`. + - `ExecStartPost=`. Gli altri comandi che verranno eseguiti dopo i comandi in `ExecStart`. + - `ExecReload=/bin/kill -HUP $MAINPID`. I comandi e gli argomenti vengono eseguiti quando il servizio viene ricaricato. + - `ExecStop=`. I comandi e gli argomenti che verranno eseguiti all'arresto del servizio. + - `ExecStopPost=`. Comandi aggiuntivi da eseguire dopo l'arresto del servizio. + - `RestartSec=42s`. Il tempo in secondi di sospensione prima di riavviare un servizio. + - `TimeoutStartSec=`. Il tempo in secondi di attesa per l'avvio del servizio. + - `TimeoutStopSec=`. Il tempo in secondi di attesa per l'arresto del servizio. + - `TimeoutSec=`. Un'abbreviazione per configurare contemporaneamente `TimeoutStartSec` e `TimeoutStopSec`. + - `RuntimeMaxSec=`. Tempo massimo in secondi per l'esecuzione del servizio. Passando \`infinity' (il valore predefinito) non si configura alcun limite di tempo di esecuzione. + - `Restart=on-failure`. Configura se riavviare il servizio quando il processo del servizio esce, viene terminato o raggiunge un timeout: + - `no` - Il servizio non verrà riavviato. Questa è l'impostazione predefinita. + - `on-success` - Si riavvia solo quando il processo di servizio esce in modo pulito (codice di uscita 0). + - `on-failure` - Si riavvia solo quando il processo di servizio non esce in modo pulito (codice di uscita non-zero). + - `on-abnormal` - Si riavvia se il processo termina con un segnale o quando si verifica un timeout. + - `on-abort` - Si riavvia se il processo esce a causa di un segnale imprevisto non specificato come condizione di uscita pulita. + - `on-watchdog` - Se impostato su `on-watchdog`, il servizio si riavvia solo se il timeout del watchdog scade. + - `always` - Si riavvia sempre. + + Le condizioni di uscita e l'effetto delle impostazioni di `Restart=` su di esse: + + ![effect](./images/16-effect.png) + + - `KillMode=process`. Specifica il modo in cui i processi di questa unit devono essere arrestati. Il suo valore può essere uno dei seguenti: + - `control-group` - Valore predefinito. Se impostato su `control-group`, tutti i processi rimanenti nel gruppo di controllo di questa unit vengono arrestati all'arresto della stessa. + - `process` - Viene arrestato solo il processo principale. + - `mixed` - Il segnale SIGTERM viene inviato al processo principale, mentre il successivo segnale SIGKILL viene inviato a tutti i processi rimanenti del gruppo di controllo della unit. + - `none` - Non arresta alcun processo. + - `PrivateTmp=`. Utilizzare o meno una directory tmp privata. In base a determinate condizioni di sicurezza, si consiglia di impostare il valore su yes. + - `ProtectHome=`. Proteggere o meno la home directory. Il suo valore può essere uno dei seguenti: + - `yes` - Le tre directory (/root/, /home/, /run/user/) non sono visibili alla unit. + - `no` - Le tre directory sono visibili alla unit. + - `read-only` - Le tre directory sono di sola lettura per la unit. + - `tmpfs` - Il file system temporaneo verrà montato in modalità di sola lettura su queste tre directory. + - `ProtectSystem=`. La directory utilizzata per proteggere il sistema dalla modifica da parte del servizio. Il valore può essere: + - `yes` - Indica che il processo chiamato dalla unit sarà montato in sola lettura sulle directory /usr/ e /boot/. + - `no` - Valore predefinito + - `full` - Indica che le directory /usr/, /boot/, /etc/ sono montate in sola lettura. + - `strict` - Tutti i file system sono montati in sola lettura (escluse le directory dei file system virtuali come /dev/, /proc/ e /sys/). + - `EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config`. Legge le variabili d'ambiente da un file di testo. "-" significa che se il file non esiste, non verrà letto e non verranno registrati errori o avvisi. + + Per ulteriori informazioni, vedere `man 5 systemd.service`. 3. Intitolazione Install - - `Alias=`. Un elenco di nomi aggiuntivi separati da spazi. Attenzione prego! Il nome aggiuntivo deve avere lo stesso tipo (suffisso) della unit corrente. + - `Alias=`. Un elenco di nomi aggiuntivi separati da spazi. Attenzione prego! Il nome aggiuntivo deve avere lo stesso tipo (suffisso) della unit corrente. - - `RequiredBy=` o `WantedBy=multi-user.target`. Definisce la unit dell'operazione corrente come dipendenza della unit nel valore. Una volta completata la definizione, i file pertinenti si trovano nella directory /etc/systemd/systemd/. Per esempio: + - `RequiredBy=` o `WantedBy=multi-user.target`. Definisce la unit dell'operazione corrente come dipendenza della unit nel valore. Una volta completata la definizione, i file pertinenti si trovano nella directory /etc/systemd/systemd/. Per esempio: - ```bash - Shell > systemctl is-enabled chronyd.service - enabled + ```bash + Shell > systemctl is-enabled chronyd.service + enabled - Shell > systemctl cat chronyd.service - ... - [Install] - WantedBy=multi-user.target + Shell > systemctl cat chronyd.service + ... + [Install] + WantedBy=multi-user.target - Shell > ls -l /etc/systemd/system/multi-user.target.wants/ - total 0 - lrwxrwxrwx. 1 root root 38 Sep 25 14:03 auditd.service -> /usr/lib/systemd/system/auditd.service - lrwxrwxrwx. 1 root root 39 Sep 25 14:03 chronyd.service -> /usr/lib/systemd/system/chronyd.service ←← - lrwxrwxrwx. 1 root root 37 Sep 25 14:03 crond.service -> /usr/lib/systemd/system/crond.service - lrwxrwxrwx. 1 root root 42 Sep 25 14:03 irqbalance.service -> /usr/lib/systemd/system/irqbalance.service - lrwxrwxrwx. 1 root root 37 Sep 25 14:03 kdump.service -> /usr/lib/systemd/system/kdump.service - lrwxrwxrwx. 1 root root 46 Sep 25 14:03 NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service - lrwxrwxrwx. 1 root root 40 Sep 25 14:03 remote-fs.target -> /usr/lib/systemd/system/remote-fs.target - lrwxrwxrwx. 1 root root 36 Sep 25 14:03 sshd.service -> /usr/lib/systemd/system/sshd.service - lrwxrwxrwx. 1 root root 36 Sep 25 14:03 sssd.service -> /usr/lib/systemd/system/sssd.service - lrwxrwxrwx. 1 root root 37 Sep 25 14:03 tuned.service -> /usr/lib/systemd/system/tuned.service - ``` + Shell > ls -l /etc/systemd/system/multi-user.target.wants/ + total 0 + lrwxrwxrwx. 1 root root 38 Sep 25 14:03 auditd.service -> /usr/lib/systemd/system/auditd.service + lrwxrwxrwx. 1 root root 39 Sep 25 14:03 chronyd.service -> /usr/lib/systemd/system/chronyd.service ←← + lrwxrwxrwx. 1 root root 37 Sep 25 14:03 crond.service -> /usr/lib/systemd/system/crond.service + lrwxrwxrwx. 1 root root 42 Sep 25 14:03 irqbalance.service -> /usr/lib/systemd/system/irqbalance.service + lrwxrwxrwx. 1 root root 37 Sep 25 14:03 kdump.service -> /usr/lib/systemd/system/kdump.service + lrwxrwxrwx. 1 root root 46 Sep 25 14:03 NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service + lrwxrwxrwx. 1 root root 40 Sep 25 14:03 remote-fs.target -> /usr/lib/systemd/system/remote-fs.target + lrwxrwxrwx. 1 root root 36 Sep 25 14:03 sshd.service -> /usr/lib/systemd/system/sshd.service + lrwxrwxrwx. 1 root root 36 Sep 25 14:03 sssd.service -> /usr/lib/systemd/system/sssd.service + lrwxrwxrwx. 1 root root 37 Sep 25 14:03 tuned.service -> /usr/lib/systemd/system/tuned.service + ``` - - `Also=`. Altre unit da installare o disinstallare durante l'installazione o la disinstallazione di questa unit. + - `Also=`. Altre unit da installare o disinstallare durante l'installazione o la disinstallazione di questa unit. - Oltre alle pagine di manuale sopra menzionate, è possibile digitare `man 5 systemd.exec` o `man 5 systemd.kill` per accedere ad altre informazioni. + Oltre alle pagine di manuale sopra menzionate, è possibile digitare `man 5 systemd.exec` o `man 5 systemd.kill` per accedere ad altre informazioni. ## Comando relativo ad altri componenti diff --git a/docs/books/admin_guide/16-about-sytemd.uk.md b/docs/books/admin_guide/16-about-sytemd.uk.md index 89d31ad0e7..f7ba9df1c3 100644 --- a/docs/books/admin_guide/16-about-sytemd.uk.md +++ b/docs/books/admin_guide/16-about-sytemd.uk.md @@ -190,17 +190,17 @@ lrwxrwxrwx. 1 root root 41 12月 23 2022 /etc/systemd/system/default.target -> / - "sysinit.target" і "basic.target" є контрольними точками під час процесу запуску. Хоча однією з цілей розробки `systemd` є паралельний запуск системних служб, необхідно запустити "цілі" певних служб і функцій перед запуском інших служб і "цілей" - Після завершення «одиниць», від яких залежить «sysinit.target», запуск перейде до фази «sysinit.target». Ці «одиниці» можна запускати паралельно, зокрема: - - Монтування файлової системи - - Налаштування файлу підкачки - - Запуск udev - - Встановлення початкового значення генератора випадкових змін - - Запуск низькорівневої служби - - Налаштувати служби шифрування + - Монтування файлової системи + - Налаштування файлу підкачки + - Запуск udev + - Встановлення початкового значення генератора випадкових змін + - Запуск низькорівневої служби + - Налаштувати служби шифрування - "sysinit.target" запустить усі низькорівневі служби та "модулі", необхідні для основних функцій операційної системи, які необхідні перед переходом у фазу "basic.target". - Після завершення фази «sysinit.target» `systemd` запускає всі «одиниці», необхідні для завершення наступної «цілі» (тобто «basic.target»). Ціль надає додаткові функції, зокрема: - - Встановлення шляхів до каталогу для різних виконуваних файлів. - - комунікаційні сокети - - таймери + - Встановлення шляхів до каталогу для різних виконуваних файлів. + - комунікаційні сокети + - таймери - Нарешті, ініціалізація виконується для "цілі" на рівні користувача ("multi-user.target" або "graphical.target"). `systemd` має досягти "multi-user.target" перед тим, як ввести "graphical.target". Ви можете виконати таку команду, щоб побачити залежності, необхідні для повного запуску: @@ -484,113 +484,113 @@ method=disabled 1. Назва підрозділу - Можна використовувати наступні пари ключ-значення: + Можна використовувати наступні пари ключ-значення: - - `Description=OpenSSH server daemon`. Рядок використовується для опису "одиниці". - - `Documentation=man:sshd(8) man:sshd_config(5)`. Відокремлений пробілами список URI, що посилається на документацію для цього «блока» або його конфігурації. Приймаються лише URI типів "http://", "https://", "file:", "info:", "man:". - - `After=network.target sshd-keygen.target`. Визначає зв'язок послідовності запуску з іншими "одиницями". У цьому прикладі "network.target" і "sshd-keygen.target" починаються першими, а "sshd.service" починається останнім. - - `Before=`. Визначте зв’язок послідовності запуску з іншими «одиницями». - - `Requires=`. Налаштувати залежності від інших «одиниць». Значення можуть бути кількома одиницями, розділеними пробілами. Якщо поточна «одиниця» активована, значення, наведені тут, також активуються. Якщо принаймні одне з перелічених значень "одиниці" не вдається успішно активувати, `systemd` не запускає поточний "блок". - - `Wants=sshd-keygen.target`. Подібно до ключа `Requires`. Різниця в тому, що якщо залежний блок не запускається, це не вплине на нормальну роботу поточного «блока». - - `BindsTo=`. Подібно до ключа `Requires`. Різниця полягає в тому, що якщо будь-який залежний "блок" не запускається, поточний блок зупиняється на додаток до "блоку", який зупиняє залежність. - - `PartOf=`. Подібно до ключа `Requires`. Різниця полягає в тому, що якщо будь-який залежний «блок» не запускається, окрім зупинки та перезапуску залежних блоків, поточний «блок» буде зупинено та перезапущено. - - `Conflicts=`. Його значенням є список одиниць, розділених пробілами. Якщо «одиниця», зазначена у значенні, працює, поточна «одиниця» працювати не може. - - `OnFailure=`. Коли поточна «одиниця» виходить з ладу, активується «одиниця» або «одиниці» (відокремлені пробілами) у значенні. + - `Description=OpenSSH server daemon`. Рядок використовується для опису "одиниці". + - `Documentation=man:sshd(8) man:sshd_config(5)`. Відокремлений пробілами список URI, що посилається на документацію для цього «блока» або його конфігурації. Приймаються лише URI типів "http://", "https://", "file:", "info:", "man:". + - `After=network.target sshd-keygen.target`. Визначає зв'язок послідовності запуску з іншими "одиницями". У цьому прикладі "network.target" і "sshd-keygen.target" починаються першими, а "sshd.service" починається останнім. + - `Before=`. Визначте зв’язок послідовності запуску з іншими «одиницями». + - `Requires=`. Налаштувати залежності від інших «одиниць». Значення можуть бути кількома одиницями, розділеними пробілами. Якщо поточна «одиниця» активована, значення, наведені тут, також активуються. Якщо принаймні одне з перелічених значень "одиниці" не вдається успішно активувати, `systemd` не запускає поточний "блок". + - `Wants=sshd-keygen.target`. Подібно до ключа `Requires`. Різниця в тому, що якщо залежний блок не запускається, це не вплине на нормальну роботу поточного «блока». + - `BindsTo=`. Подібно до ключа `Requires`. Різниця полягає в тому, що якщо будь-який залежний "блок" не запускається, поточний блок зупиняється на додаток до "блоку", який зупиняє залежність. + - `PartOf=`. Подібно до ключа `Requires`. Різниця полягає в тому, що якщо будь-який залежний «блок» не запускається, окрім зупинки та перезапуску залежних блоків, поточний «блок» буде зупинено та перезапущено. + - `Conflicts=`. Його значенням є список одиниць, розділених пробілами. Якщо «одиниця», зазначена у значенні, працює, поточна «одиниця» працювати не може. + - `OnFailure=`. Коли поточна «одиниця» виходить з ладу, активується «одиниця» або «одиниці» (відокремлені пробілами) у значенні. - Дивись `man 5 systemd.unit`. + Дивись `man 5 systemd.unit`. 2. Назва служби - Можна використовувати наступні пари ключ-значення: - - - `Type=notify`. Налаштуйте тип цього блоку ".service", який може бути одним із таких: - - `simple` - Сервіс запускається як основний процес. Це значення за умовчанням. - - `forking` - Служба викликає роздвоєні процеси та працює як частина основного демона. - - `exec` - Схожий до `simple`. Менеджер служби запустить цей блок одразу після виконання двійкового файлу основної служби. Інші підрозділи-наступники повинні залишатися заблокованими до цього моменту, перш ніж вони зможуть продовжити роботу. - - `oneshot` - Подібно до `simple`, за винятком того, що процес має завершитися, перш ніж `systemd` запустить наступні служби. - - `dbus` - Подібно до `simple`, за винятком того, що демон отримує назву шини D-Bus. - - `notify` - Подібно до `simple`, за винятком того, що демон надсилає сповіщення за допомогою `sd_notify` або еквівалентного виклику після запуску. - - `idle` - Подібно до «simple», за винятком того, що виконання служби відкладено, доки не буде відправлено всі активні завдання. - - `RemainAfterExit=`. Чи слід вважати поточну службу активною, коли завершуються всі процеси служби. За замовчуванням ні. - - `GuessMainPID=`. Значення має тип boolean і за замовчуванням yes. За відсутності чіткого розташування основного процесу служби, `systemd` має вгадати PID основного процесу (який може бути неправильним). Якщо ви встановите `Type=forking` і не встановите `PIDFile`, ця пара ключ-значення вступить у силу. В іншому випадку ігноруйте пару ключ-значення. - - `PIDFile=`. Вкажіть шлях до файлу (абсолютний шлях) PID служби. Для служб `Type=forking` рекомендується використовувати цю пару ключ-значення. `systemd` зчитує PID основного процесу демона після запуску служби. - - `BusName=`. Назва шини D-Bus, щоб дістатися до цієї служби. Цей параметр є обов’язковим для служб, де використовується `Type=dbus`. - - `ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY`. Команди та аргументи виконуються під час запуску служби. - - `ExecStartPre=`. Інші команди виконуються перед командами в `ExecStart`. - - `ExecStartPost=`. Інші команди виконуються після команд у `ExecStart`. - - `ExecReload=/bin/kill -HUP $MAINPID`. Команди та аргументи запускаються під час перезавантаження служби. - - `ExecStop=`. Команди та аргументи запускаються, коли служба зупиняється. - - `ExecStopPost=`. Додаткові команди для запуску після зупинки служби. - - `RestartSec=42s`. Час у секундах до переходу в режим сну перед перезапуском служби. - - `TimeoutStartSec=`. Час очікування запуску служби в секундах. - - `TimeoutStopSec=`. Час у секундах очікування зупинки служби. - - `TimeoutSec=`. Скорочення для одночасного налаштування `TimeoutStartSec` і `TimeoutStopSec`. - - `RuntimeMaxSec=`. Максимальний час роботи служби в секундах. Передає `infinity` (за замовчуванням), щоб не налаштувати обмеження часу виконання. - - `Restart=on-failure`. Налаштовує, чи потрібно перезапускати службу, коли процес служби завершується, завершується або досягає тайм-ауту: - - `no` - Служба не буде перезапущена. Це значення за умовчанням. - - `on-success` - Перезапускається лише тоді, коли сервісний процес закінчується чисто (код виходу 0). - - `on-failure` - Перезапускається лише тоді, коли процес обслуговування не завершується належним чином (код виходу node-zero). - - `on-abnormal` - Перезапускається, якщо процес завершується сигналом або коли настає тайм-аут. - - `on-abort` - Перезапускається, якщо процес завершується через неперехоплений сигнал, не вказаний як чистий статус виходу. - - `on-watchdog` - Якщо встановлено значення `on-watchdog`, служба перезапуститься лише після закінчення тайм-ауту сторожового таймера. - - `always` - Завжди перезапускається. - - Причини виходу та вплив на них налаштувань `Restart=`: - - ![effect](./images/16-effect.png) - - - `KillMode=process`. Визначає, як процеси цього блоку мають бути припинені. Його значення може бути одним із таких: - - `control-group` - Значення за замовчуванням. Якщо встановлено значення `control-group`, усі решта процесів у групі керування цього блоку припиняються під час зупинки блоку. - - `process` - Знищується лише основний процес. - - `mixed` - Сигнал SIGTERM надсилається головному процесу, тоді як наступний сигнал SIGKILL надсилається всім іншим процесам групи керування блоком. - - `none` - Не вбиває жодних процесів. - - `PrivateTmp=`. Чи використовувати приватний каталог tmp. Виходячи з певної безпеки, рекомендовано встановити значення так. - - `ProtectHome=`. Чи захищати домашній каталог. Його значення може бути одним із таких: - - `yes` - Три каталоги (/root/, /home/, /run/user/) не видимі для пристрою. - - `no` - Три каталоги видимі для пристрою. - - `read-only` - Три каталоги доступні лише для читання. - - `tmpfs` - Тимчасова файлова система буде змонтована в режимі лише для читання в цих трьох каталогах. - - `ProtectSystem=`. Каталог використовується для захисту системи від модифікації службою. Значення може бути: - - `yes` - Вказує, що процес, викликаний модулем, буде змонтовано лише для читання до каталогів /usr/ і /boot/. - - `no` - За замовченням - - `full` - Вказує, що каталоги /usr/, /boot/, /etc/ монтуються лише для читання. - - `strict` - Усі файлові системи монтуються лише для читання (за винятком каталогів віртуальних файлових систем, таких як /dev/, /proc/ і /sys/). - - `EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config`. Читання змінних середовища з текстового файлу. «-» означає, що якщо файл не існує, він не буде прочитаний, а помилки чи попередження не реєструватимуться. - - Дивись `man 5 systemd.service`. + Можна використовувати наступні пари ключ-значення: + + - `Type=notify`. Налаштуйте тип цього блоку ".service", який може бути одним із таких: + - `simple` - Сервіс запускається як основний процес. Це значення за умовчанням. + - `forking` - Служба викликає роздвоєні процеси та працює як частина основного демона. + - `exec` - Схожий до `simple`. Менеджер служби запустить цей блок одразу після виконання двійкового файлу основної служби. Інші підрозділи-наступники повинні залишатися заблокованими до цього моменту, перш ніж вони зможуть продовжити роботу. + - `oneshot` - Подібно до `simple`, за винятком того, що процес має завершитися, перш ніж `systemd` запустить наступні служби. + - `dbus` - Подібно до `simple`, за винятком того, що демон отримує назву шини D-Bus. + - `notify` - Подібно до `simple`, за винятком того, що демон надсилає сповіщення за допомогою `sd_notify` або еквівалентного виклику після запуску. + - `idle` - Подібно до «simple», за винятком того, що виконання служби відкладено, доки не буде відправлено всі активні завдання. + - `RemainAfterExit=`. Чи слід вважати поточну службу активною, коли завершуються всі процеси служби. За замовчуванням ні. + - `GuessMainPID=`. Значення має тип boolean і за замовчуванням yes. За відсутності чіткого розташування основного процесу служби, `systemd` має вгадати PID основного процесу (який може бути неправильним). Якщо ви встановите `Type=forking` і не встановите `PIDFile`, ця пара ключ-значення вступить у силу. В іншому випадку ігноруйте пару ключ-значення. + - `PIDFile=`. Вкажіть шлях до файлу (абсолютний шлях) PID служби. Для служб `Type=forking` рекомендується використовувати цю пару ключ-значення. `systemd` зчитує PID основного процесу демона після запуску служби. + - `BusName=`. Назва шини D-Bus, щоб дістатися до цієї служби. Цей параметр є обов’язковим для служб, де використовується `Type=dbus`. + - `ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY`. Команди та аргументи виконуються під час запуску служби. + - `ExecStartPre=`. Інші команди виконуються перед командами в `ExecStart`. + - `ExecStartPost=`. Інші команди виконуються після команд у `ExecStart`. + - `ExecReload=/bin/kill -HUP $MAINPID`. Команди та аргументи запускаються під час перезавантаження служби. + - `ExecStop=`. Команди та аргументи запускаються, коли служба зупиняється. + - `ExecStopPost=`. Додаткові команди для запуску після зупинки служби. + - `RestartSec=42s`. Час у секундах до переходу в режим сну перед перезапуском служби. + - `TimeoutStartSec=`. Час очікування запуску служби в секундах. + - `TimeoutStopSec=`. Час у секундах очікування зупинки служби. + - `TimeoutSec=`. Скорочення для одночасного налаштування `TimeoutStartSec` і `TimeoutStopSec`. + - `RuntimeMaxSec=`. Максимальний час роботи служби в секундах. Передає `infinity` (за замовчуванням), щоб не налаштувати обмеження часу виконання. + - `Restart=on-failure`. Налаштовує, чи потрібно перезапускати службу, коли процес служби завершується, завершується або досягає тайм-ауту: + - `no` - Служба не буде перезапущена. Це значення за умовчанням. + - `on-success` - Перезапускається лише тоді, коли сервісний процес закінчується чисто (код виходу 0). + - `on-failure` - Перезапускається лише тоді, коли процес обслуговування не завершується належним чином (код виходу node-zero). + - `on-abnormal` - Перезапускається, якщо процес завершується сигналом або коли настає тайм-аут. + - `on-abort` - Перезапускається, якщо процес завершується через неперехоплений сигнал, не вказаний як чистий статус виходу. + - `on-watchdog` - Якщо встановлено значення `on-watchdog`, служба перезапуститься лише після закінчення тайм-ауту сторожового таймера. + - `always` - Завжди перезапускається. + + Причини виходу та вплив на них налаштувань `Restart=`: + + ![effect](./images/16-effect.png) + + - `KillMode=process`. Визначає, як процеси цього блоку мають бути припинені. Його значення може бути одним із таких: + - `control-group` - Значення за замовчуванням. Якщо встановлено значення `control-group`, усі решта процесів у групі керування цього блоку припиняються під час зупинки блоку. + - `process` - Знищується лише основний процес. + - `mixed` - Сигнал SIGTERM надсилається головному процесу, тоді як наступний сигнал SIGKILL надсилається всім іншим процесам групи керування блоком. + - `none` - Не вбиває жодних процесів. + - `PrivateTmp=`. Чи використовувати приватний каталог tmp. Виходячи з певної безпеки, рекомендовано встановити значення так. + - `ProtectHome=`. Чи захищати домашній каталог. Його значення може бути одним із таких: + - `yes` - Три каталоги (/root/, /home/, /run/user/) не видимі для пристрою. + - `no` - Три каталоги видимі для пристрою. + - `read-only` - Три каталоги доступні лише для читання. + - `tmpfs` - Тимчасова файлова система буде змонтована в режимі лише для читання в цих трьох каталогах. + - `ProtectSystem=`. Каталог використовується для захисту системи від модифікації службою. Значення може бути: + - `yes` - Вказує, що процес, викликаний модулем, буде змонтовано лише для читання до каталогів /usr/ і /boot/. + - `no` - За замовченням + - `full` - Вказує, що каталоги /usr/, /boot/, /etc/ монтуються лише для читання. + - `strict` - Усі файлові системи монтуються лише для читання (за винятком каталогів віртуальних файлових систем, таких як /dev/, /proc/ і /sys/). + - `EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config`. Читання змінних середовища з текстового файлу. «-» означає, що якщо файл не існує, він не буде прочитаний, а помилки чи попередження не реєструватимуться. + + Дивись `man 5 systemd.service`. 3. Назва установки - - `Alias=`. Список додаткових імен, розділених пробілами. Увага, будь ласка! Ваша додаткова назва повинна мати той самий тип (суфікс), що й поточна одиниця. + - `Alias=`. Список додаткових імен, розділених пробілами. Увага, будь ласка! Ваша додаткова назва повинна мати той самий тип (суфікс), що й поточна одиниця. - - `RequiredBy=` or `WantedBy=multi-user.target`. Визначте одиницю поточної операції як залежність одиниці від значення. Після завершення визначення ви зможете знайти відповідні файли в каталозі /etc/systemd/systemd/. Наприклад: + - `RequiredBy=` or `WantedBy=multi-user.target`. Визначте одиницю поточної операції як залежність одиниці від значення. Після завершення визначення ви зможете знайти відповідні файли в каталозі /etc/systemd/systemd/. Наприклад: - ```bash - Shell > systemctl is-enabled chronyd.service - enabled + ```bash + Shell > systemctl is-enabled chronyd.service + enabled - Shell > systemctl cat chronyd.service - ... - [Install] - WantedBy=multi-user.target + Shell > systemctl cat chronyd.service + ... + [Install] + WantedBy=multi-user.target - Shell > ls -l /etc/systemd/system/multi-user.target.wants/ - total 0 - lrwxrwxrwx. 1 root root 38 Sep 25 14:03 auditd.service -> /usr/lib/systemd/system/auditd.service - lrwxrwxrwx. 1 root root 39 Sep 25 14:03 chronyd.service -> /usr/lib/systemd/system/chronyd.service ←← - lrwxrwxrwx. 1 root root 37 Sep 25 14:03 crond.service -> /usr/lib/systemd/system/crond.service - lrwxrwxrwx. 1 root root 42 Sep 25 14:03 irqbalance.service -> /usr/lib/systemd/system/irqbalance.service - lrwxrwxrwx. 1 root root 37 Sep 25 14:03 kdump.service -> /usr/lib/systemd/system/kdump.service - lrwxrwxrwx. 1 root root 46 Sep 25 14:03 NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service - lrwxrwxrwx. 1 root root 40 Sep 25 14:03 remote-fs.target -> /usr/lib/systemd/system/remote-fs.target - lrwxrwxrwx. 1 root root 36 Sep 25 14:03 sshd.service -> /usr/lib/systemd/system/sshd.service - lrwxrwxrwx. 1 root root 36 Sep 25 14:03 sssd.service -> /usr/lib/systemd/system/sssd.service - lrwxrwxrwx. 1 root root 37 Sep 25 14:03 tuned.service -> /usr/lib/systemd/system/tuned.service - ``` + Shell > ls -l /etc/systemd/system/multi-user.target.wants/ + total 0 + lrwxrwxrwx. 1 root root 38 Sep 25 14:03 auditd.service -> /usr/lib/systemd/system/auditd.service + lrwxrwxrwx. 1 root root 39 Sep 25 14:03 chronyd.service -> /usr/lib/systemd/system/chronyd.service ←← + lrwxrwxrwx. 1 root root 37 Sep 25 14:03 crond.service -> /usr/lib/systemd/system/crond.service + lrwxrwxrwx. 1 root root 42 Sep 25 14:03 irqbalance.service -> /usr/lib/systemd/system/irqbalance.service + lrwxrwxrwx. 1 root root 37 Sep 25 14:03 kdump.service -> /usr/lib/systemd/system/kdump.service + lrwxrwxrwx. 1 root root 46 Sep 25 14:03 NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service + lrwxrwxrwx. 1 root root 40 Sep 25 14:03 remote-fs.target -> /usr/lib/systemd/system/remote-fs.target + lrwxrwxrwx. 1 root root 36 Sep 25 14:03 sshd.service -> /usr/lib/systemd/system/sshd.service + lrwxrwxrwx. 1 root root 36 Sep 25 14:03 sssd.service -> /usr/lib/systemd/system/sssd.service + lrwxrwxrwx. 1 root root 37 Sep 25 14:03 tuned.service -> /usr/lib/systemd/system/tuned.service + ``` - - `Also=`. Інші пристрої для встановлення або видалення під час встановлення або видалення цього пристрою. + - `Also=`. Інші пристрої для встановлення або видалення під час встановлення або видалення цього пристрою. - На додаток до сторінок посібника, згаданих вище, ви також можете ввести `man 5 systemd.exec` або `man 5 systemd.kill`, щоб отримати доступ до іншої інформації. + На додаток до сторінок посібника, згаданих вище, ви також можете ввести `man 5 systemd.exec` або `man 5 systemd.kill`, щоб отримати доступ до іншої інформації. ## Команда, пов'язана з іншими компонентами diff --git a/docs/books/sed_awk_grep/4_awk_command.it.md b/docs/books/sed_awk_grep/4_awk_command.it.md index a1e491217a..585f6da49b 100644 --- a/docs/books/sed_awk_grep/4_awk_command.it.md +++ b/docs/books/sed_awk_grep/4_awk_command.it.md @@ -1,7 +1,7 @@ --- title: Comando awk author: tianci li -contributors: null +contributors: tags: - awk --- diff --git a/docs/books/sed_awk_grep/4_awk_command.uk.md b/docs/books/sed_awk_grep/4_awk_command.uk.md index a84ae0aa3f..b754185273 100644 --- a/docs/books/sed_awk_grep/4_awk_command.uk.md +++ b/docs/books/sed_awk_grep/4_awk_command.uk.md @@ -1,7 +1,7 @@ --- title: Команда Awk author: tianci li -contributors: null +contributors: tags: - awk --- diff --git a/docs/guides/9_6_installation.uk.md b/docs/guides/9_6_installation.uk.md index 1c2ba70e3c..c35735df64 100644 --- a/docs/guides/9_6_installation.uk.md +++ b/docs/guides/9_6_installation.uk.md @@ -113,7 +113,7 @@ Rocky-.--.iso Опція «Підтримка мов» на екрані _Підсумок встановлення_ дозволяє вказати підтримку додаткових мов. -Ми приймемо значення за замовчуванням, **Англійська (Сполучені Штати)**, і не внесемо жодних змін. Натисніть кнопку «Готово». +Ми приймемо значення за замовчуванням, **Англійська (Сполучені Штати)**, і не внесемо жодних змін. Натисніть `Готово`. #### Час і дата @@ -166,7 +166,7 @@ Rocky-.--.iso ### Мережа та ім'я хоста -Наступне важливе завдання процедури інсталяції в системній області стосується конфігурації мережі, де ви можете налаштувати або налаштувати параметри, пов’язані з мережею, для системи. +Наступне важливе завдання процедури встановлення в розділі «Система» стосується конфігурації мережі, де ви можете налаштувати або змінити параметри системи, пов’язані з мережею. !!! Note "Примітка" @@ -182,7 +182,7 @@ Rocky-.--.iso Ви можете легко змінити ім’я хоста системи пізніше після встановлення ОС. -Наступне важливе завдання налаштування пов’язане з мережевими інтерфейсами в системі. +Наступне важливе завдання конфігурації стосується мережевих інтерфейсів системи. 1. Переконайтеся, що на лівій панелі зазначено плату Ethernet (або будь-яку мережеву карту). 2. Натисніть будь-який із виявлених мережевих пристроїв на лівій панелі, щоб вибрати його.\ @@ -255,14 +255,14 @@ Rocky-.--.iso ## Фаза встановлення -Коли ви задоволені своїм вибором для різних завдань встановлення, наступний етап процесу встановлення розпочне власне встановлення. +Щойно ви будете задоволені вибором різних завдань встановлення, розпочнеться наступний етап процесу встановлення: власне встановлення. ### Почніть установку Щойно ви будете задоволені вибраними параметрами для різних завдань встановлення, натисніть кнопку ++"Розпочати встановлення"++ на головному екрані _Підсумок встановлення_. Розпочнеться інсталяція, і програма інсталяції покаже прогрес інсталяції. -Після початку інсталяції у фоновому режимі почнуть виконуватися різноманітні завдання, наприклад створення розділів диска, форматування розділів або томів LVM, перевірка та вирішення програмних залежностей, запис операційної системи на диск тощо. +Після початку встановлення у фоновому режимі виконуватимуться різні завдання, зокрема розбиття диска на розділи, форматування розділів або томів LVM, перевірка та вирішення програмних залежностей, а також запис операційної системи на диск. !!! Note "Примітка" diff --git a/docs/guides/installation.uk.md b/docs/guides/installation.uk.md index 42e074dbd7..b119a6db21 100644 --- a/docs/guides/installation.uk.md +++ b/docs/guides/installation.uk.md @@ -189,7 +189,7 @@ Rocky-.--.iso У нашій системі-прикладі є два пристрої Ethernet (`ens3` та `ens4`), обидва з яких перебувають у підключеному стані. Тип, назва, кількість і стан мережевих пристроїв у вашій системі можуть відрізнятися від пристроїв у нашій демонстраційній системі. -Verify the switch of the device you want to configure is in the `ON` (blue) position in the right pane. Ми приймемо всі значення за замовчуванням у цьому розділі. +Verify that the switch of the device you want to configure is in the `ON` (blue) position in the right pane. Ми приймемо всі значення за замовчуванням у цьому розділі. Натисніть ++"done"++, щоб повернутися до головного екрана *Підсумок встановлення*. From 967bba4cfef57b99572ff96f1f840fb8b8f3847a Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Thu, 19 Jun 2025 17:09:55 -0500 Subject: [PATCH 045/164] * fix broken link in `09-backups.md` (#2761) * fix broken link embedded in `systemd` status command output `041-database-mariadb.md` --- docs/books/admin_guide/09-backups.md | 2 +- docs/books/web_services/041-database-servers-mariadb.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/books/admin_guide/09-backups.md b/docs/books/admin_guide/09-backups.md index 07fc0a3624..d40092738e 100644 --- a/docs/books/admin_guide/09-backups.md +++ b/docs/books/admin_guide/09-backups.md @@ -543,7 +543,7 @@ keys: **wildcard (wildcard character)**: used to match file or directory names. **regular expression**: used to match the content of a file. - You can see an introduction with extra detail in [this document](../sed_awk_grep/1_regular _expressions_vs_wildcards.md). + You can see an introduction with extra detail in [this document](../sed_awk_grep/1_regular_expressions_vs_wildcards.md). ## *CoPy Input Output* - `cpio` diff --git a/docs/books/web_services/041-database-servers-mariadb.md b/docs/books/web_services/041-database-servers-mariadb.md index 0dab11317e..f4ba050d2c 100644 --- a/docs/books/web_services/041-database-servers-mariadb.md +++ b/docs/books/web_services/041-database-servers-mariadb.md @@ -416,7 +416,7 @@ $ sudo systemctl status mariadb Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; preset: disabled) Active: active (running) since Thu 2024-06-20 11:48:56 CEST; 1min 27s ago Docs: man:mariadbd(8) - https://mariadb.com/kb/en/library/systemd/ + https://mariadb.com Process: 6538 ExecStartPre=/usr/libexec/mariadb-check-socket (code=exited, status=0/SUCCESS) Process: 6560 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir mariadb.service (code=exited, status=0/SUCCESS) Process: 6658 ExecStartPost=/usr/libexec/mariadb-check-upgrade (code=exited, status=0/SUCCESS) From cad1f6725937fe3c049b8d59f222e60b270339ba Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Fri, 20 Jun 2025 09:40:57 -0500 Subject: [PATCH 046/164] Contributor documents changes: (#2762) * `README.md`replace contractions, define acronyms, replace passive voice with active * `style_guide.md` define acronyms, replace passive voice with active, add new links and admonitions * `beginners.md` add link to `style_guide.md` replace passive voice with active, replace conjunctions with words, some sentence simplification --- README.md | 44 +++++++++++++-------------- docs/guides/contribute/beginners.md | 32 +++++++++---------- docs/guides/contribute/style_guide.md | 39 +++++++++++++++--------- 3 files changed, 63 insertions(+), 52 deletions(-) diff --git a/README.md b/README.md index 33aa6ba174..fe38724286 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ## Introduction -*With Rocky Linux emerging as a major RHEL-compatible distribution, this is an exciting time in the open source community. Rocky Linux’s [mission](https://rockylinux.org/community-charter/) is to provide companies and individuals with a **stable foundation of open source software** for their enterprise and HPC needs. We are here to support that mission with excellent documentation.* +*With Rocky Linux (RL) emerging as a major RHEL-compatible distribution, this is an exciting time in the open source community. Rocky Linux’s [mission](https://rockylinux.org/community-charter/) is to provide companies and individuals with a **stable foundation of open source software** for their enterprise and High Performance Computing (HPC) needs. We are here to support that mission with excellent documentation.* To us, excellent documentation hits these marks: @@ -21,7 +21,7 @@ We welcome anyone who wants to be part of this mission. No specific degree, year ## License -Documents written by the *rocky linux documentation team* are published under the Creative Commons-BY-SA license. This means you are free to copy, distribute and transform the works, while respecting the author's rights. +Documents written by the *Rocky Linux documentation team* are published under the Creative Commons-BY-SA license. This means you are free to copy, distribute and transform the works, while respecting the author's rights. - **BY**: Attribution. You must cite the name of the original author. - **SA**: Share Alike. @@ -33,7 +33,7 @@ The documents and their sources are freely downloadable from: - - -Our media sources are hosted at github.com. You'll find the source code repository where the version of this document was created. +We host our media sources at github.com. Our team created this document on this source code repository, and stores all other documents there too. ## Technical requirements @@ -49,29 +49,29 @@ Rocky Linux uses GitHub to manage its code and files, including documentation fi ### Markdown -Documentation is welcome in whatever format you are used to creating. It does not need to be perfect, just submit what you have and the team will give you feedback to help get it in line with our voice and tone. +Documentation is welcome in whatever format you create it in. It does not need to be perfect, just submit what you have and the team will give you feedback to help get it inline with our voice and tone. That said, RL Documentation uses Markdown as the standard. It is easy to learn and use. Run a text converter on your content or start from scratch with this guide on [writing markdown with proper formatting](https://docs.rockylinux.org/guides/contribute/rockydocs_formatting). -As you become a regular contributor, you’ll need to create a **local repository**. See our [guide](https://docs.rockylinux.org/guides/contribute/beginners) for how to install a Markdown editor and create a local repository on your home computer. +As you become a regular contributor, you will need to create a **local repository**. See our [guide](https://docs.rockylinux.org/guides/contribute/beginners) for how to install a Markdown editor and create a local repository on your home computer. -## Contribution Process +## Contribution process -*The actual process of reporting an issue, revising, or creating a doc. Please see special notes afterward about translations, links, and meta content.* +*The actual process of reporting an issue, revising, or creating a doc. See the "Notes" section for translations, links, and meta content.* ### Report an issue -Maybe you’ve found a broken link or incorrect information while exploring the Rocky docs. This is called an **issue**, and we want to know about it. You can mention it on the Mattermost Documentation channel, or visit GitHub and make a proper issue report. GitHub has [a handy guide](https://docs.github.com/en/issues/tracking-your-work-with-issues/creating-an-issue) for how to create an issue. +Maybe you have found a broken link or incorrect information while exploring the Rocky docs. We call this an **issue**, and we want to know about it. You can mention it on the Mattermost Documentation channel, or visit GitHub and make a proper issue report. GitHub has [a handy guide](https://docs.github.com/en/issues/tracking-your-work-with-issues/creating-an-issue) for how to create an issue. ### Submit an update -*Add a missing word, correct an error, or clarify a confusing bit of text. You won’t break anything because someone will review your contribution before it goes live. Here is the basic process.* +*Add a missing word, correct an error, or clarify a confusing bit of text. You will not break anything because someone will review your contribution before it goes live. Here is the basic process.* 1. Start on the page you want to update on . - Click the “Edit” pencil in the upper right corner of the document. You will be taken to the original document stored on GitHub. + Click the “Edit” pencil in the upper right corner of the document. This takes you to the original document stored on GitHub. - The first time you contribute to the RL repository, you will be prompted with a green button to “**Fork** this **repository** and propose changes.” This creates a duplicate copy of the RL repository where you make your suggested edits. Click the green button and continue. + The first time you contribute to the RL repository, you will receive a prompt with a green button to “**Fork** this **repository** and propose changes.” This creates a duplicate copy of the RL repository where you make your suggested edits. Click the green button and continue. 2. Make your changes @@ -85,9 +85,9 @@ Maybe you’ve found a broken link or incorrect information while exploring the 4. Review changes - Now you can look at what you’ve done, line by line. If you missed anything, back up to the previous page and correct it again (you’ll have to start over), then click Propose Changes again. + Now you can review what your changes, line by line. If you missed anything, back up to the previous page and correct it again (you will have to start over), then click Propose Changes again. - Once the doc is the way you want it, click the green button that says Create Pull Request. This provides one more chance to double check your changes and confirm the doc is ready. + Once the doc is the way you want it, click the green button that says Create Pull Request (PR). This provides one more chance to double check your changes and confirm the doc is ready. 5. Create Pull Request @@ -103,17 +103,17 @@ Maybe you’ve found a broken link or incorrect information while exploring the - Comment with feedback and ask for changes - Deny your PR with explanation - If you have to make changes, you will suddenly understand why you need a local repository. The team can [talk you through](https://chat.rockylinux.org/rocky-linux/channels/documentation) what to do next. In good news, it’s still fixable. + If you have to make changes, you will suddenly understand why you need a local repository. The team can [talk you through](https://chat.rockylinux.org/rocky-linux/channels/documentation) what to do next. In good news, it is still fixable. Need more in-depth explanation? Here are the [same directions](https://docs.rockylinux.org/guides/contribute/beginners/) with more elaboration under the heading, "Submit an update." -Success? Welcome to the team, you are officially a Rocky Linux documentation contributor. Your profile will be added to the contributor list at the bottom of this document shortly. +Success? Welcome to the team, you are officially a Rocky Linux documentation contributor. We will add your profile to the contributor list at the bottom of this document shortly. ### Become a frequent contributor For more than a word or two of occasional edits, we recommend that you [setup a local repository](https://docs.rockylinux.org/guides/contribute/createnew/) on your own machine. From there, you can revise documentation from your clone of the RL repository, Commit it to your online GitHub repository, and then create Pull Requests to merge with the main repository. -Advanced users may wish to create a complete documentation server on your local Linux workstation or VM. We have guides to set that up with [Docker](https://docs.rockylinux.org/guides/contribute/localdocs/rockydocs_web_dev/) or [LXD](https://docs.rockylinux.org/guides/contribute/localdocs/mkdocs_lsyncd/). We also have a [fast documentation system](https://docs.rockylinux.org/guides/contribute/localdocs/local_docs/) with special caveats if you are using Python on the same server. +Advanced users might want to create a complete documentation server on your local Linux workstation or VM. We have guides to set that up with [Docker](https://docs.rockylinux.org/guides/contribute/localdocs/rockydocs_web_dev/) or [LXD](https://docs.rockylinux.org/guides/contribute/localdocs/mkdocs_lsyncd/). We also have a [fast documentation system](https://docs.rockylinux.org/guides/contribute/localdocs/local_docs/) with special caveats if you are using Python on the same server. ### Submit a new document @@ -139,13 +139,13 @@ tags: #### Formatting -To add more advanced elements to your Markdown-formatted document beyond text, visit the [formatting guide](https://docs.rockylinux.org/guides/contribute/rockydocs_formatting/). This covers Admonitions, Tables, Quotes, and more. +To add more advanced elements to your Markdown-formatted document beyond text, visit the [formatting guide](https://docs.rockylinux.org/guides/contribute/rockydocs_formatting/). This covers admonitions, tables, quotes, and more. #### Contribute The process for [submitting original content](https://docs.rockylinux.org/guides/contribute/createnew/) is similar to updating an existing document from your local repository. Create a new document within your Markdown editor, Commit it to your GitHub repository, then submit a Pull Request to merge into the main branch of the repository. The documentation leads will decide where the new document will live. -## Special Notes +## Notes ### Links @@ -155,7 +155,7 @@ The format for all links within the documentation is square brackets around the [our site] followed by your link in parenthesis: () -To help lab-based URLs pass our automatic URL checker, we have created a list of excluded names you may use. You may request that a new exclusion be added. An editor may adjust your lab-based URL, or add an exclusion if they think it is warranted. +To help lab-based URLs pass our automatic URL checker, there is a list of excluded names you might use. You can request the adding of a new exclusion if none in the current list work. An editor might adjust your lab-based URL, or add an exclusion if warranted. Please note the following IEEE recommendation on naming local networks [RFC #8375 Special-Use Domain 'home.arpa.'](https://www.rfc-editor.org/rfc/rfc8375.html) published in May 2018. @@ -172,11 +172,11 @@ Please note the following IEEE recommendation on naming local networks [RFC #837 ### Translation -#### CrowdIn +#### Crowdin -We are adding to these docs in new languages at the speed of getting translators on board. Seeking contributors for this area especially. We use [CrowdIn](https://crowdin.com/) for updates. +We are adding to these docs in new languages at the speed of getting translators on board. Seeking contributors for this area especially. We use [Crowdin](https://crowdin.com/) for updates. -#### Translation and Meta content +#### Translation and meta content Translators, if you find a word in the source document that does not translate well into your language, or an error that prevents a perfect translation, please fix that in the source document and make a Pull Request. In that case, please add yourself as a contributor in the meta content of that document. diff --git a/docs/guides/contribute/beginners.md b/docs/guides/contribute/beginners.md index 0b11750cd7..edb2e75fbc 100644 --- a/docs/guides/contribute/beginners.md +++ b/docs/guides/contribute/beginners.md @@ -11,17 +11,17 @@ tags: # First-Time Contributor Guide -*Everybody starts somewhere. If this is the first time you have contributed to open source documentation on GitHub, congratulations on taking this step. We can not wait to see what you have to say!* +*Everybody starts somewhere. If this is the first time you have contributed to open source documentation on GitHub, congratulations on taking this step. We can not wait to see what you have to say!* For best results, read [our style guide](style_guide.md) which includes several other document links to help you learn best-practices for documentation. ## Git and GitHub All of our contributor instructions presuppose you have a GitHub account. If you have never done that, now is the time. If you have 12 minutes, learn the basics of what GitHub is with the [Beginner’s Guide to Git and GitHub](https://www.udacity.com/blog/2015/06/a-beginners-git-github-tutorial.html) from Udemy. -You may not start out creating and managing repositories for Rocky Linux, but this [Hello World tutorial](https://docs.github.com/en/get-started/quickstart/hello-world) walks you through creating a GitHub account, learning the lingo, and understanding how repositories work. Focus on learning how to make and Commit updates to existing docs, and how to create a Pull Request. +You might not start out creating and managing repositories for Rocky Linux, but this [Hello World tutorial](https://docs.github.com/en/get-started/quickstart/hello-world) walks you through creating a GitHub account, learning the lingo, and understanding how repositories work. Focus on learning how to make and Commit updates to existing docs, and how to create a Pull Request. ## Markdown -Markdown is an easy language that allows you to include formatting, code, and plain text in the same file. The first time you update a document, follow the existing code. It will not be long before you are ready to explore additional features. When the time comes, here are the basics. +Markdown is an easy language that allows for the inclusion of formatting, code, and plain text in the same file. The first time you update a document, follow the existing code. It will not be long before you are ready to explore additional features. When the time comes, here are the basics. - [Basic Markdown](https://www.markdownguide.org/basic-syntax#code) - [Extended Markdown](https://www.markdownguide.org/extended-syntax/#fenced-code-blocks) @@ -44,8 +44,8 @@ Once you have a Markdown editor installed, follow instructions to connect it to 1. Within GitHub, sync your fork of the documentation repository with the main branch. 2. Follow your Markdown editor’s instructions to sync your current fork with your local machine. -3. Inside your Markdown editor, open the document you wish to modify. -4. Modify the document. +3. Inside your Markdown editor, open the document you want to change. +4. Change the document. 5. Save. 6. Commit your changes within your editor, which should sync your local repository with your online fork. 7. Within GitHub, find the updated document in your fork and create a Pull Request to merge it with the main document. @@ -56,19 +56,19 @@ Once you have a Markdown editor installed, follow instructions to connect it to 1. Start on the page you want to update. - Click the “Edit” pencil in the upper right corner of the document you want to update. You will be taken to the original document on GitHub. + Click the “Edit” pencil in the upper right corner of the document you want to update. This will take you to the original document on GitHub. - The first time you contribute to the RL repository, you will be prompted with a green button to “**Fork** this **repository** and propose changes.” This creates a duplicate copy of the RL repository where you make your suggested edits. Simply click the green button and continue. + The first time you contribute to the Rocky Linux (RL) repository, you will see a prompt with a green button to “**Fork** this **repository** and propose changes.” This creates a duplicate copy of the RL repository where you make your suggested edits. Click the green button and continue. 2. Make your changes - Follow the Markdown formatting. Perhaps there’s a missing word, or the link on line 21 needs to be fixed, for example. Make the necessary change. + Follow the Markdown formatting. Perhaps there’s a missing word, or you need to fix the link on line 21, for example. Make the necessary change. 3. Propose changes - At the bottom of the page, write a one-line description in the title of the block entitled, “**Propose changes”**. It is helpful, but not necessary, to reference the file name found at the top of the doc. + At the bottom of the page, write a one-line description in the title of the block entitled, “**Propose changes”**. It is helpful, but not necessary, to reference the filename found at the top of the doc. - So, if you updated a link within line 21 of the markdown text, you would say something like, "Update README.md with correct links." + If you updated a link within line 21 of the markdown text, you might say, "Update README.md with correct links." **Note: Word your action in the present tense.** @@ -76,15 +76,15 @@ Once you have a Markdown editor installed, follow instructions to connect it to 4. Review changes - Now you can look at what you’ve done, line by line. Did you miss anything? Back up to the previous page and correct it again (you’ll have to start over), then click Propose Changes again. + You can now review your changes, line by line. Did you miss anything? Back up to the previous page and correct it again (you will have to start over), then click Propose Changes again. Once the doc is the way you want it, click the green button that says Create Pull Request. This provides one more chance to double-check your changes and confirm the doc is ready. -5. Create Pull Request +5. Create Pull Request (PR) - All of your work so far has been done in your own repository, with no opportunity to break the RL main repository. Next, you submit it to the documentation team to merge your version into the main version of the document. + You completed all of your work so far in your own repository, with no opportunity to break the RL main repository. Next, you submit it to the documentation team to merge your version into the main version of the document. - Click the big green button that says Create Pull Request. Good news, you still haven’t broken anything, because now it goes to the RL documentation team for review. + Click the big green button that says Create Pull Request. Good news, you still have not broken anything, because now it goes to the RL documentation team for review. 6. Wait @@ -94,6 +94,6 @@ Once you have a Markdown editor installed, follow instructions to connect it to - Comment with feedback and ask for changes - Deny your PR with an explanation - The last response is unlikely. We really want to include your perspective here! If you have to make changes, you will suddenly understand why you need a local repository. The team can [talk you through](https://chat.rockylinux.org/rocky-linux/channels/documentation) what to do next. In good news, it’s still fixable. Follow the comment section of that request to see what further information is requested. + The last response is unlikely. We really want to include your perspective here! If you have to make changes, you will suddenly understand why you need a local repository. The team can [talk you through](https://chat.rockylinux.org/rocky-linux/channels/documentation) what to do next. In good news, it’s still fixable. If you need to add or change your pull request, a team member will add them to the comment section. - Otherwise, your request will be accepted and merged. Welcome to the team, you’re officially a contributor now! Look for your name to show up on the all-contributors list at the bottom of the Contributor Guide in a few days. + Otherwise, the team will accept your request and merge it. Welcome to the team, you are officially a contributor now! Look for your name to show up on the all-contributors list at the bottom of the Contributor Guide in a few days. diff --git a/docs/guides/contribute/style_guide.md b/docs/guides/contribute/style_guide.md index b60177c852..5724db49d1 100644 --- a/docs/guides/contribute/style_guide.md +++ b/docs/guides/contribute/style_guide.md @@ -9,7 +9,7 @@ tags: # Rocky Linux Documentation Style Guide -*Rocky Linux is the fastest-growing enterprise Linux in the world, with its documentation also growing exponentially thanks to contributors like you. Your content is welcome in any format, and the RL document stylists will help you align it with the standards set forth here.* +*Rocky Linux (RL) is the fastest-growing enterprise Linux in the world, with its documentation also growing exponentially thanks to contributors like you. Your content is welcome in any format, and the RL document stylists will help you align it with the standards set forth here.* ## Introduction @@ -17,14 +17,14 @@ tags: *New contributions are welcome to grow this into the definitive spot on the web for information about using Rocky Linux. You can create docs in the format that makes sense to you, and the documentation team will work with you or otherwise help format it so it looks and feels like part of the Rocky family.* -This guide outlines English-language style standards to **improve readability, highlight special cases,** and **enhance translation work** across Rocky Linux documentation. For style questions not addressed in this guide, please refer to the following: +This guide outlines English-language style standards to **improve readability, highlight special cases,** and **enhance translation work** across Rocky Linux documentation. For style questions not addressed in this guide, see the following: - [Merriam Webster Dictionary](https://www.merriam-webster.com/) - [Chicago Manual of Style (CMOS), 17th ed.](https://www.chicagomanualofstyle.org/home.html) ### Contributing -For a more complete understanding of contributing, please consult our related guides: +For a more complete understanding of contributing, consult our related guides: - [Rocky Linux Contribution Guide](https://docs.rockylinux.org/guides/contribute/) for system and software requirements for getting started. - [Rocky Linux First Time Contributors Guide](beginners.md) for an orientation to GitHub, our documentation home base. @@ -32,7 +32,7 @@ For a more complete understanding of contributing, please consult our related gu ## Style Guidelines -*RL documentation aims to use clear and consistent language, for accessibility as well as to aid ongoing translation efforts.* +*RL documentation aims to use clear and consistent language, for accessibility and to aid ongoing translation efforts.* ### Grammar and Punctuation @@ -40,29 +40,40 @@ For a more complete understanding of contributing, please consult our related gu - Double quotation marks (“Chicago style”) rather than single quotation marks (‘Oxford style’). - Periods and commas go inside quotation marks “like this,” rather than “like this”. -- The em dash {shift}+{option}+{-} has no spaces before or after—like this—and is preferred for parenthetical phrases. +- The em dash {shift}+{option}+{-} has no spaces before or after—like this—and is our preference for parenthetical phrases. - Use a serial comma before the “and” in a list of three items: “Peas, mustard, and carrots.” - Headings should be generally made in headline-style capitalization: Capitalize the first and last words, as well as all nouns, pronouns, verbs, and adverbs. If your document works better with sentence-style capitalization, perhaps because you frequently reference acronyms, make it consistent within the entire document. - Headings do not need a period or semicolon at the end, even with sentence-style capitalization, unless ending in an abbreviation. - Bulleted and numbered lists: Avoid beginning capitalization or ending punctuation, unless the item is a complete sentence. +!!! info "Sentence-style heading capitalization" + + People using the `vale` and other language linters, will find that these suggest using sentence-style capitalization. Much of the documentation created within our documentation pool uses this style of heading capitalization. Just remember that whichever style you choose, keep it consistent within your document. + ### Voice and Tone -- **Plain language.** This can be described as a *less-conversational* style. Most of our documentation fits within this standard. +- **Plain language.** Described as a *less-conversational* style. Most of our documentation fits within this standard. - Avoid metaphors and idioms. - Say what you mean in as few words as possible. - - Identify and avoid unnecessarily technical terms. Consider that your audience is mostly people who have some familiarity with the subject matter, but may not be subject-matter experts. + - Identify and avoid unnecessarily technical terms. Consider that your audience is mostly people who have some familiarity with the subject matter, but might not be subject-matter experts. - Exceptions to plain language: - - A more conversational style is appropriate for documentation addressed to newcomers or beginners or for writing content like blog posts. + - A more conversational style is appropriate for documentation addressed to newcomers or beginners or for writing content such as blog posts. - A more formal or terse wording style is appropriate for documentation addressed to advanced users or API (Application Programming Interface) documentation. - **Inclusive language.** - Language use evolves over time. Certain words have evolved to carry negative connotations so documentation should be rewritten to use new words. - *Master/slave* becomes *primary/secondary* or an agreed upon organizational standard. - *Blacklist/whitelist* becomes *blocklist/allowlist* or an agreed upon organizational standard. - - You may think of other relevant examples as you create documentation. + - You might think of other relevant examples as you create documentation. - When speaking of a person of *unknown* or *non-binary* gender, it is now considered acceptable to use “they” as a singular pronoun. - When speaking of one’s capabilities, frame answers as *abilities* rather than *limitations.* For example, if you are wondering whether we have documentation about running Steam on Rocky Linux, the answer is not just “no.” Rather, “Sounds like that’s a great place for you to create something to add to our tree!” - **Avoid contractions.** This assists with translation efforts. The exception to this is when writing something in a more conversational tone, such as blog posts or welcome instructions for new community members. +- **Use active voice.** Active voice is more clear and direct and helps your reader to quickly understand your meaning. + +!!! info "Other reading on voice and tone" + + The creation of several additional documents on voice and tone since this style guide's creation include: + - [Good Docs-A translator's viewpoint](../../rocky_insights/blogs/good_docs.md) + - [Active voice-The way to simple, clear, communication](../../rocky_insights/blogs/active_voice.md) ## Formatting @@ -78,7 +89,7 @@ If you have a procedure with only one step, use a bullet rather than a number. F ### Graphical Interface Language -- Text instructions regarding a UI: When describing a command to be entered into a user interface, use the word “enter” rather than “put” or “type.” Use a codeblock to write out the command (i.e., set it off with backticks): +- Text instructions regarding a UI: When describing the entry of a command into a user interface, use the word “enter” rather than “put” or “type.” Use a codeblock to write out the command (set it off with backticks): *Example Markdown text* `In the **commit message** box, enter update_thisdoc.` @@ -95,12 +106,12 @@ If you have a procedure with only one step, use a bullet rather than a number. F - **Abstract.** A brief statement of what to expect from this page - **Objectives.** A bulleted list of what this page will convey to the reader - **Skills** required/learned. -- **Difficulty level.** 1 star for easy, 2 for intermediate, etc. +- **Difficulty level.** 1 star for easy, 2 for intermediate, and so on. - **Reading time.** Divide the number of words in your document by a reading rate of 75 words per minute to determine this number. ### Admonitions -Within Markdown, admonitions are a way to put information into a box to highlight it. They are not essential to documentation, but they are a tool you may find useful. Learn more about admonitions from our [Rocky Formatting doc](rockydocs_formatting.md). +Within Markdown, admonitions are a way to put information into a box to highlight it. They are not essential to documentation, but they are a tool you might find useful. Learn more about admonitions from our [Rocky Formatting doc](rockydocs_formatting.md). ## Accessibility @@ -114,7 +125,7 @@ Within Markdown, admonitions are a way to put information into a box to highligh ### Links -- Make links descriptive, so it is obvious where they will lead from the text or context. Avoid hyperlinks with names like “click here.” +- Make links descriptive, so it is obvious where they will lead from the text or context. Avoid hyperlinks with names such as “click here.” - Verify that all links work as described. ### Tables @@ -133,7 +144,7 @@ Within Markdown, admonitions are a way to put information into a box to highligh - Use all levels of headings without skipping any levels. - Nest all material under headings to aid in readability. -- Remember that in Markdown only one Level One heading may be used. +- Remember to use only one Level One heading in Markdown. ## Summary From ddaeac572387b7f62adc490cf23e09788cf26f71 Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Fri, 20 Jun 2025 09:58:32 -0500 Subject: [PATCH 047/164] Fix formatting mistake (#2763) --- docs/guides/contribute/style_guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/contribute/style_guide.md b/docs/guides/contribute/style_guide.md index 5724db49d1..51d8bfd442 100644 --- a/docs/guides/contribute/style_guide.md +++ b/docs/guides/contribute/style_guide.md @@ -71,7 +71,7 @@ For a more complete understanding of contributing, consult our related guides: !!! info "Other reading on voice and tone" - The creation of several additional documents on voice and tone since this style guide's creation include: + The creation of several additional documents on voice and tone since this style guide's creation include: - [Good Docs-A translator's viewpoint](../../rocky_insights/blogs/good_docs.md) - [Active voice-The way to simple, clear, communication](../../rocky_insights/blogs/active_voice.md) From 5a814f3b74c5331d1770138bbfa0131b418f5008 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Sat, 21 Jun 2025 13:35:41 -0400 Subject: [PATCH 048/164] New Crowdin updates (#2764) * New translations 09-backups.md (Italian) * New translations 11-tasks.md (Italian) * New translations xfce_installation.md (Italian) * New translations mate_installation.md (Italian) * New translations kde_installation.md (Italian) * New translations 041-database-servers-mariadb.md (Italian) * New translations beginners.md (Italian) --- docs/books/admin_guide/09-backups.it.md | 2 +- docs/books/admin_guide/11-tasks.it.md | 46 +++++++++---------- .../041-database-servers-mariadb.it.md | 2 +- docs/guides/contribute/beginners.it.md | 20 ++++---- docs/guides/desktop/kde_installation.it.md | 4 +- docs/guides/desktop/mate_installation.it.md | 4 +- docs/guides/desktop/xfce_installation.it.md | 2 +- 7 files changed, 40 insertions(+), 40 deletions(-) diff --git a/docs/books/admin_guide/09-backups.it.md b/docs/books/admin_guide/09-backups.it.md index 606f9164f9..ee69c2ae13 100644 --- a/docs/books/admin_guide/09-backups.it.md +++ b/docs/books/admin_guide/09-backups.it.md @@ -543,7 +543,7 @@ chiavi : **wildcard (wildcard character)**: utilizzato per associare i nomi di file o directory. **regular expression**: utilizzata per individuare il contenuto di un file. - È possibile vedere un'introduzione con maggiori dettagli in [questo documento](../sed_awk_grep/1_espressioni_regolari_vs_wildcards.md). + È possibile vedere un'introduzione con maggiori dettagli in [questo documento](../sed_awk_grep/1_regular_expressions_vs_wildcards.md). ## *CoPy Input Output* - `cpio` diff --git a/docs/books/admin_guide/11-tasks.it.md b/docs/books/admin_guide/11-tasks.it.md index ad4984d7a7..21a599eba9 100644 --- a/docs/books/admin_guide/11-tasks.it.md +++ b/docs/books/admin_guide/11-tasks.it.md @@ -125,7 +125,7 @@ Se lo stesso utente esiste contemporaneamente in `/etc/cron.deny` e `/etc/cron.a Quando un utente pianifica un'attività, viene creato un file con il suo nome in `/var/spool/cron/`. -Questo file contiene tutte le informazioni che il `crond` deve conoscere sui compiti creati da questo utente, compresi i comandi o i programmi da eseguire e la pianificazione dell'esecuzione (ora, minuto, giorno, ecc.). Si noti che l'unità di tempo minima che `crond` può riconoscere è 1 minuto. Esistono attività di pianificazione simili in RDBMS (come MySQL), dove le attività di pianificazione basate sul tempo sono denominate "Event Scheduler". L'unità di tempo minima che è in grado di riconoscere è 1 secondo e le attività di pianificazione basate su eventi sono denominate "Trigger". +Questo file contiene tutte le informazioni che il `crond` deve conoscere sui compiti creati da questo utente, compresi i comandi o i programmi da eseguire e la pianificazione dell'esecuzione (ora, minuto, giorno, ecc.). Si noti che l'unità di tempo minima che `crond` può riconoscere è 1 minuto. Esistono attività di pianificazione simili nei RDBMS (come MySQL), dove le attività di pianificazione basate sul tempo sono denominate "Event Scheduler" (la cui unità di tempo riconoscibile è 1 secondo) e le attività di pianificazione basate sugli eventi denominate "Trigger". ![Cron tree](images/tasks-001.png) @@ -143,18 +143,18 @@ Esempio: [root]# crontab -u user1 -e ``` -| Opzione | Descrizione | -| ------- | ---------------------------------------------------------------------------------------- | -| `-e` | Modifica il file di pianificazione con VI | -| `-l` | Visualizza il contenuto del file di pianificazione | -| `-u` | Imposta il nome dell'utente di cui si vuole manipolare il file di programma previsionale | -| `-r` | Cancella il file di pianificazione | +| Opzione | Descrizione | +| ----------------- | -------------------------------------------------- | +| `-e` | Modifica il file di pianificazione con VI | +| `-l` | Visualizza il contenuto del file di pianificazione | +| `-u ` | Specifica un singolo utente per operare | +| `-r` | Cancella il file di pianificazione | !!! Warning "Attenzione" `crontab` senza opzioni cancella il vecchio file di pianificazione e attende che l'utente inserisca nuove righe. Per uscire da questa modalità di modifica è necessario premere ctrl + d. - Solo `root' può usare l'opzione `-u user' per gestire il file di pianificazione di un altro utente. + Solo `root` può usare l'opzione `-u ` per gestire il file di pianificazione di un altro utente. L'esempio precedente consente a root di pianificare un'attività per l'user1. @@ -206,12 +206,12 @@ Il file `crontab` è strutturato in base alle seguenti regole. Per semplificare la notazione della definizione di tempo, è consigliabile utilizzare simboli speciali. -| Wildcards | Descrizione | -| --------- | ----------------------------------------- | -| `*` | Indica tutti i possibili valori del campo | -| `-` | Indica una gamma di valori | -| `,` | Indica un elenco di valori | -| `/` | Definisce un passo | +| Simbolo speciale | Descrizione | +| ---------------- | ----------------------------------------- | +| `*` | Indica tutti i valori temporali del campo | +| `-` | Indica un intervallo di tempo continuo | +| `,` | Indica l'intervallo di tempo discontinuo | +| `/` | Intervallo di tempo indicato | Esempi: @@ -221,19 +221,19 @@ Script eseguito il 15 Aprile alle 10:25am: 25 10 15 04 * /root/scripts/script > /log/… ``` -Ogni giorno alle 11.00 e alle 16.00: +Eseguire l'attività una volta al giorno alle 11.00 e una volta al giorno alle 16.00: ```bash 00 11,16 * * * /root/scripts/script > /log/… ``` -Esegui ogni ora dalle 11.00 alle 16.00 tutti i giorni: +L'attività si svolge una volta all'ora dalle 11.00 alle 16.00 di ogni giorno: ```bash 00 11-16 * * * /root/scripts/script > /log/… ``` -Esegui ogni 10 minuti durante l'orario di lavoro: +Eseguire ogni 10 minuti durante l'orario di lavoro nei giorni feriali: ```bash */10 8-17 * * 1-5 /root/scripts/script > /log/… @@ -254,12 +254,12 @@ Per l'utente root, `crontab` ha anche alcune impostazioni speciali del tempo: Un utente, rockstar, vuole modificare il suo file `crontab`: -1. `crond` controlla se è autorizzato (`/etc/cron.allow` e `/etc/cron.deny`). +1. Il demone `crond` controlla se l'utente è autorizzato`(/etc/cron.allow` e `/etc/cron.deny`). -2. Se lo è, accede al suo file `crontab` (`/var/spool/cron/rockstar`). +2. Se l'utente è autorizzato, accede al suo file `crontab``(/var/spool/cron/rockstar`). - Ogni minuto `crond` legge i file di pianificazione. +Il demone `crond`: -3. Esegue le attività programmate. - -4. I rapporti sono riportati sistematicamente in un file di log (`/var/log/cron`). +* Legge - Legge i file delle attività pianificate di tutti gli utenti ogni minuto. +* Esegue - Esegue le attività secondo la pianificazione. +* Scrive - Scrive gli eventi e i messaggi corrispondenti nel file`(/var/log/cron`). diff --git a/docs/books/web_services/041-database-servers-mariadb.it.md b/docs/books/web_services/041-database-servers-mariadb.it.md index 5bce342981..2259672c3a 100644 --- a/docs/books/web_services/041-database-servers-mariadb.it.md +++ b/docs/books/web_services/041-database-servers-mariadb.it.md @@ -425,7 +425,7 @@ $ sudo systemctl status mariadb Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; preset: disabled) Active: active (running) since Thu 2024-06-20 11:48:56 CEST; 1min 27s ago Docs: man:mariadbd(8) - https://mariadb.com/kb/en/library/systemd/ + https://mariadb.com Process: 6538 ExecStartPre=/usr/libexec/mariadb-check-socket (code=exited, status=0/SUCCESS) Process: 6560 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir mariadb.service (code=exited, status=0/SUCCESS) Process: 6658 ExecStartPost=/usr/libexec/mariadb-check-upgrade (code=exited, status=0/SUCCESS) diff --git a/docs/guides/contribute/beginners.it.md b/docs/guides/contribute/beginners.it.md index 2f80135e47..8919600563 100644 --- a/docs/guides/contribute/beginners.it.md +++ b/docs/guides/contribute/beginners.it.md @@ -11,7 +11,7 @@ tags: # Guida Iniziale del Contributore -*Tutti iniziano da qualche parte. Se questa è la prima volta che contribuite alla documentazione open source su GitHub, congratulazioni per aver fatto questo passo. Non vediamo l'ora di vedere cosa avete da dirci!* +*Tutti iniziano da qualche parte. Se è la prima volta che contribuite alla documentazione open source su GitHub, congratulazioni per aver fatto questo passo. Non vediamo l'ora di vedere cosa avete da dire!* Per ottenere risultati ottimali, leggete la [nostra guida allo stile](style_guide.md), che include diversi altri link a documenti che vi aiuteranno ad apprendere le migliori pratiche per la documentazione. ## Git e GitHub @@ -21,7 +21,7 @@ Non è detto che si inizi a creare e gestire repository per Rocky Linux, ma ques ## Markdown -Markdown è un linguaggio semplice che consente di includere formattazione, codice e testo normale nello stesso file. La prima volta che si aggiorna un documento, si segue il codice esistente. Non passerà molto tempo prima che siate pronti a esplorare altre funzioni. Quando arriva il momento, ecco le regole di base. +Markdown è un linguaggio semplice che consente di includere nello stesso file formattazione, codice e testo semplice. La prima volta che si aggiorna un documento, si segue il codice esistente. Non passerà molto tempo prima che siate pronti a esplorare altre funzioni. Quando arriva il momento, ecco le regole di base. - [Markdown di base](https://www.markdownguide.org/basic-syntax#code) - [Markdown Avanzato](https://www.markdownguide.org/extended-syntax/#fenced-code-blocks) @@ -56,19 +56,19 @@ Una volta installato l'editor Markdown, seguire le istruzioni per collegarlo all 1. Iniziare dalla pagina che si desidera aggiornare. - Fare clic sulla matita "Edit" nell'angolo superiore destro del documento che si desidera aggiornare. Si accede al documento originale su GitHub. + Fare clic sulla matita "Edit" nell'angolo superiore destro del documento che si desidera aggiornare. Si accede così al documento originale su GitHub. - La prima volta che si contribuisce al repository RL, comarirà un pulsante verde con la scritta "**Fork** this **repository** and propose changes" In questo modo si crea una copia duplicata del repository RL in cui si apportano le modifiche suggerite. È sufficiente fare clic sul pulsante verde e continuare. + La prima volta che contribuite al repository Rocky Linux (RL), vedrete un prompt con un pulsante verde che vi inviterà a fare il "**Fork** di questo **repository** e proporre modifiche". In questo modo si crea una copia duplicata del repository RL in cui si apportano le modifiche suggerite. Fare clic sul pulsante verde e continuare. 2. Apportare le modifiche - Seguire la formattazione Markdown. Forse manca una parola, o il link alla riga 21 deve essere sistemato, ad esempio. Apportare le modifiche necessarie. + Seguire la formattazione Markdown. Forse manca una parola o è necessario correggere il collegamento alla riga 21, ad esempio. Apportare le modifiche necessarie. 3. Proporre modifiche In fondo alla pagina, scrivere una descrizione di una riga nel titolo del blocco intitolato "**Propose changes"**. È utile, ma non necessario, fare riferimento al nome del file che si trova all'inizio del documento. - Quindi, se si aggiorna un collegamento nella riga 21 del testo markdown, si dovrebbe dire qualcosa come "Update README.md with correct links." + Se si è aggiornato un collegamento nella riga 21 del testo markdown, si potrebbe dire: "Aggiornare README.md con i collegamenti corretti". **Nota: scrivere l'azione al presente.** @@ -76,13 +76,13 @@ Una volta installato l'editor Markdown, seguire le istruzioni per collegarlo all 4. Modifiche alla revisione - Ora è possibile esaminare ciò che si è fatto, riga per riga. Ti sei perso qualcosa? Tornate alla pagina precedente e correggetela di nuovo (dovrete ricominciare da capo), quindi fate di nuovo clic su Propose Changes. + Ora è possibile rivedere le modifiche apportate, riga per riga. Ti sei perso qualcosa? Tornate alla pagina precedente e correggetela di nuovo (dovrete ricominciare da capo), quindi fate di nuovo clic su Proponi modifiche. Una volta che il documento è come lo si desidera, fare clic sul pulsante verde Create Pull Request. In questo modo si ha un'ulteriore possibilità di ricontrollare le modifiche e confermare che il documento sia pronto. -5. Creare un Pull Request +5. Creare una richiesta di Pull (PR) - Tutto il lavoro svolto finora è stato fatto nel proprio repository, senza la possibilità di danneggiare il repository principale di RL. Successivamente, la si sottopone al team di documentazione per unire la propria versione a quella principale del documento. + Avete completato tutto il lavoro finora nel vostro repository, senza la possibilità di rompere il repository principale di RL. Successivamente, la si sottopone al team di documentazione per unire la propria versione a quella principale del documento. Fare clic sul pulsante verde grande che dice Create Pull Request. Buone notizie, non avete ancora rotto nulla, perché ora il tutto passa al team di documentazione di RL per la revisione. @@ -94,6 +94,6 @@ Una volta installato l'editor Markdown, seguire le istruzioni per collegarlo all - Commentare con un feedback e chiedere modifiche - Negare il PR con una spiegazione - L'ultima risposta è improbabile. Vogliamo davvero includere il vostro punto di vista! Se dovete apportare delle modifiche, capirete immediatamente perché avete bisogno di un repository locale. Il team potrà [spiegarvi](https://chat.rockylinux.org/rocky-linux/channels/documentation) cosa fare in seguito. La buona notizia è che il problema è ancora risolvibile. Seguite la sezione dei commenti di tale richiesta per vedere quali ulteriori informazioni sono richieste. + L'ultima risposta è improbabile. Vogliamo davvero includere il vostro punto di vista! Se dovete apportare delle modifiche, capirete immediatamente perché avete bisogno di un repository locale. Il team potrà [spiegarvi](https://chat.rockylinux.org/rocky-linux/channels/documentation) cosa fare in seguito. La buona notizia è che il problema è ancora risolvibile. Se è necessario aggiungere o modificare la richiesta di pull, un membro del team li aggiungerà alla sezione dei commenti. In caso contrario, la richiesta verrà accettata e unita. Benvenuto nel team, ora sei ufficialmente un collaboratore! Tra qualche giorno il vostro nome apparirà nell'elenco dei collaboratori in fondo alla Guida dei collaboratori. diff --git a/docs/guides/desktop/kde_installation.it.md b/docs/guides/desktop/kde_installation.it.md index 3afd5c5b83..d5ab617091 100644 --- a/docs/guides/desktop/kde_installation.it.md +++ b/docs/guides/desktop/kde_installation.it.md @@ -25,7 +25,7 @@ Grazie al team di sviluppo di Rocky Linux, sono disponibili immagini live per di ## Ottenere, verificare e scrivere l'immagine live di KDE -Prima dell'installazione, il primo passo è scaricare l'immagine live e scriverla su un DVD o una chiavetta USB. Come detto in precedenza, l'immagine sarà avviabile, proprio come qualsiasi altro supporto di installazione per Linux. È possibile trovare l'ultima immagine di KDE nella sezione download di Rocky Linux 9 [immagini live](https://dl.rockylinux.org/pub/rocky/9.5/live/x86_64/). +Prima dell'installazione, il primo passo è scaricare l'immagine live e scriverla su un DVD o una chiavetta USB. Come detto in precedenza, l'immagine sarà avviabile, proprio come qualsiasi altro supporto di installazione per Linux. Potete trovare l'ultima immagine di KDE nella sezione di download delle [immagini live](https://dl.rockylinux.org/pub/rocky/9.6/live/x86_64/) di Rocky Linux 9. Si noti che questo particolare collegamento presuppone x86_64 come architettura del processore. Se si dispone di un'architettura aarch64, è possibile utilizzare questa immagine. Scaricare l'immagine live e i file di checksum. @@ -49,7 +49,7 @@ Anche in questo caso, la situazione varia a seconda della macchina, del BIOS, de ![kde_boot](images/kde_boot.png) -Se è così, siete sulla buona strada! Se si desidera testare il supporto, si può inserire prima questa opzione, oppure si può inserire **S** per **Avviare Rocky Linux KDE 9.0**. +Se è così, siete sulla buona strada! Se si vuole testare il supporto, si può inserire prima questa opzione, oppure si può inserire **S** per **avviare Rocky Linux KDE 9**. Ricordate che si tratta di un'immagine live. L'avvio della prima schermata richiederà un po' di tempo. Non fatevi prendere dal panico, aspettate! Quando l'immagine live è attiva, viene visualizzata questa schermata: diff --git a/docs/guides/desktop/mate_installation.it.md b/docs/guides/desktop/mate_installation.it.md index a2c09aa59a..4685dc7896 100644 --- a/docs/guides/desktop/mate_installation.it.md +++ b/docs/guides/desktop/mate_installation.it.md @@ -29,13 +29,13 @@ Questa procedura vi permetterà di utilizzare MATE su Rocky Linux. ### 9: Ottenere, verificare e scrivere l'immagine live di MATE - Prima dell'installazione, il primo passo è scaricare l'immagine live e scriverla su un DVD o una chiavetta USB. Come detto in precedenza, l'immagine sarà avviabile, proprio come qualsiasi altro supporto di installazione per Linux. È possibile trovare l'ultima immagine MATE nella sezione download di Rocky Linux 9 [immagini live](https://dl.rockylinux.org/pub/rocky/9.5/live/x86_64/). Si noti che questo particolare collegamento presuppone che l'architettura sia x86_64 e, al momento in cui scriviamo, questa è l'unica immagine live disponibile. Scaricare sia l'immagine live che i file di checksum. + Prima dell'installazione, il primo passo è scaricare l'immagine live e scriverla su un DVD o una chiavetta USB. Come detto in precedenza, l'immagine sarà avviabile, proprio come qualsiasi altro supporto di installazione per Linux. È possibile trovare l'ultima immagine MATE nella sezione download di Rocky Linux 9 [immagini live](https://dl.rockylinux.org/pub/rocky/9.6/live/x86_64/). Si noti che questo particolare collegamento presuppone che l'architettura sia x86_64 e, al momento in cui scriviamo, questa è l'unica immagine live disponibile. Scaricare sia l'immagine live che i file di checksum. Verificare l'immagine con il file CHECKSUM nel modo seguente (si noti che questo è un esempio! Assicurarsi che il nome dell'immagine e i file CHECKSUM corrispondano): ``` - sha256sum -c CHECKSUM --ignore-missing Rocky-9.5-MATE-x86_64-20221124.0.iso.CHECKSUM + sha256sum -c CHECKSUM --ignore-missing Rocky-9.6-MATE-x86_64-20250530.3.iso.CHECKSUM ``` diff --git a/docs/guides/desktop/xfce_installation.it.md b/docs/guides/desktop/xfce_installation.it.md index 727c9e1f33..fb05364bb2 100644 --- a/docs/guides/desktop/xfce_installation.it.md +++ b/docs/guides/desktop/xfce_installation.it.md @@ -24,7 +24,7 @@ L'ambiente desktop XFCE, creato come fork del Common Desktop Environment (CDE), ## 9: Ottenere, verificare e scrivere l'immagine live di XFCE - Prima dell'installazione, il primo passo è scaricare l'immagine live e scriverla su un DVD o una chiavetta USB. Come detto in precedenza, l'immagine sarà avviabile, proprio come qualsiasi altro supporto di installazione per Linux. È possibile trovare l'ultima immagine di XFCE nella sezione download di Rocky Linux 9 [immagini live](https://dl.rockylinux.org/pub/rocky/9.5/live/x86_64/). Si noti che questo particolare collegamento presuppone che x86_64 sia l'architettura del vostro processore. + Prima dell'installazione, il primo passo è scaricare l'immagine live e scriverla su un DVD o una chiavetta USB. Come detto in precedenza, l'immagine sarà avviabile, proprio come qualsiasi altro supporto di installazione per Linux. È possibile trovare l'ultima immagine di XFCE nella sezione download di Rocky Linux 9 [immagini live](https://dl.rockylinux.org/pub/rocky/9.6/live/x86_64/). Si noti che questo particolare collegamento presuppone che x86_64 sia l'architettura del vostro processore. Al momento è possibile utilizzare architetture x86_64 o aarch64 per questa immagine live. Scaricare l'immagine live e i file di checksum. From dfcf90a0e83b5ed5a87846f0ee3d5a6feadb2a4f Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Sun, 22 Jun 2025 09:34:05 -0400 Subject: [PATCH 049/164] New Crowdin updates (#2765) * New translations kde_installation.md (French) * New translations 09-backups.md (Ukrainian) --- docs/books/admin_guide/09-backups.uk.md | 2 +- docs/guides/desktop/kde_installation.fr.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/books/admin_guide/09-backups.uk.md b/docs/books/admin_guide/09-backups.uk.md index df4ab2140b..686d863db7 100644 --- a/docs/books/admin_guide/09-backups.uk.md +++ b/docs/books/admin_guide/09-backups.uk.md @@ -543,7 +543,7 @@ tar xvf backup.tar --wildcards '*.conf' **wildcard (символ підстановки)**: використовується для відповідності імен файлів або каталогів. **регулярний вираз**: використовується для відповідності вмісту файлу. - Ви можете переглянути вступ із додатковою інформацією в [цьому документі](../sed_awk_grep/1_regular _expressions_vs_wildcards.md). + Ви можете переглянути вступ із додатковою інформацією в [цьому документі](../sed_awk_grep/1_regular_expressions_vs_wildcards.md). ## *CoPy Input Output* - `cpio` diff --git a/docs/guides/desktop/kde_installation.fr.md b/docs/guides/desktop/kde_installation.fr.md index d3314e6401..b27d50766c 100644 --- a/docs/guides/desktop/kde_installation.fr.md +++ b/docs/guides/desktop/kde_installation.fr.md @@ -14,7 +14,7 @@ Grâce à l'équipe de développement de Rocky Linux, il y a maintenant des imag !!! note - Cette procédure est spécifique à Rocky Linux 9.0. Il n'y a actuellement aucune procédure décrite pour installer KDE pour les autres versions de Rocky Linux. + Cette procédure est spécifique à Rocky Linux 9. Il n'y a actuellement aucune procédure décrite pour installer KDE pour les autres versions de Rocky Linux. N'hésitez pas à écrire une description ! ## Prérequis @@ -25,7 +25,7 @@ Grâce à l'équipe de développement de Rocky Linux, il y a maintenant des imag ## Obtenir, vérifier et créer une image Live de KDE -Avant l'installation, la première étape consiste à télécharger l'image live et à l'enregistrer sur un DVD ou une clé USB. Comme indiqué précédemment, l'image live sera amorçable, tout comme tout autre support d'installation pour Linux. Vous trouverez la dernière image KDE dans la section de téléchargement pour Rocky Linux 9 [images live](https://dl.rockylinux.org/pub/rocky/9.5/live/x86_64/). +Avant l'installation, la première étape consiste à télécharger l'image live et à l'enregistrer sur un DVD ou une clé USB. Comme indiqué précédemment, l'image live sera amorçable, tout comme tout autre support d'installation pour Linux. Vous trouverez la dernière image KDE dans la section de téléchargement pour Rocky Linux 9 [images live](https://dl.rockylinux.org/pub/rocky/9.6/live/x86_64/). Notez que ce lien particulier suppose que x86_64 est l'architecture de votre processeur. Si vous avez une architecture aarch64, vous pouvez utiliser l'image correspondante à la place. Téléchargez à la fois l'image live et les fichiers de somme de contrôle. @@ -49,7 +49,7 @@ Là encore, cela diffère selon la machine, le BIOS, le système d'exploitation, ![kde_boot](images/kde_boot.png) -Si c'est le cas, vous êtes sur la bonne voie ! Si vous voulez tester le média, vous pouvez d'abord sélectionner cette option ou bien vous pouvez simplement taper **S** pour **Start Rocky Linux KDE 9.x**. +Si c'est le cas, vous êtes sur la bonne voie ! Si vous voulez tester le média, vous pouvez d'abord sélectionner cette option ou bien vous pouvez simplement taper **S** pour **Start Rocky Linux KDE 9**. N'oubliez pas qu'il s'agit d'une image live. Le lancement jusqu'au premier écran prend un certain temps. Pas de panique, il suffit d'attendre ! Lorsque l'image live est lancée, vous verrez cet écran : From c9da042447385e6488dda4cd155457d05af2d472 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Fri, 27 Jun 2025 10:58:46 -0400 Subject: [PATCH 050/164] New translations 041-database-servers-mariadb.md (Ukrainian) (#2766) --- docs/books/web_services/041-database-servers-mariadb.uk.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/books/web_services/041-database-servers-mariadb.uk.md b/docs/books/web_services/041-database-servers-mariadb.uk.md index 8922eb8bd2..dd44b726f3 100644 --- a/docs/books/web_services/041-database-servers-mariadb.uk.md +++ b/docs/books/web_services/041-database-servers-mariadb.uk.md @@ -427,7 +427,7 @@ $ sudo systemctl status mariadb Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; preset: disabled) Active: active (running) since Thu 2024-06-20 11:48:56 CEST; 1min 27s ago Docs: man:mariadbd(8) - https://mariadb.com/kb/en/library/systemd/ + https://mariadb.com Process: 6538 ExecStartPre=/usr/libexec/mariadb-check-socket (code=exited, status=0/SUCCESS) Process: 6560 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir mariadb.service (code=exited, status=0/SUCCESS) Process: 6658 ExecStartPost=/usr/libexec/mariadb-check-upgrade (code=exited, status=0/SUCCESS) From 98a4e7444cd79b0c6bb880b5361851dfe53717cc Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 30 Jun 2025 11:36:18 -0400 Subject: [PATCH 051/164] New Crowdin updates (#2767) * New translations index.md (German) * New translations beginners.md (Ukrainian) * New translations style_guide.md (Ukrainian) --- docs/guides/contribute/beginners.uk.md | 6 +++--- docs/guides/contribute/style_guide.uk.md | 13 ++++++++++++- docs/release_notes/index.de.md | 9 +++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/docs/guides/contribute/beginners.uk.md b/docs/guides/contribute/beginners.uk.md index 6d7e52c22f..4ef6018190 100644 --- a/docs/guides/contribute/beginners.uk.md +++ b/docs/guides/contribute/beginners.uk.md @@ -11,13 +11,13 @@ tags: # Посібник для новачків -*Кожен з чогось починає. Якщо ви вперше зробили внесок у документацію з відкритим вихідним кодом на GitHub, вітаємо з цим кроком. Ми не можемо дочекатися, щоб побачити, що ви скажете!* +*Кожен з чогось починає. Якщо ви вперше робите свій внесок у документацію з відкритим кодом на GitHub, вітаємо з цим кроком. Нам не терпиться побачити вашу думку!* Для найкращих результатів ознайомтеся з [нашим посібником зі стилю](style_guide.md), який містить посилання на кілька інших документів, що допоможуть вам ознайомитися з найкращими практиками документування. ## Git і GitHub Усі наші інструкції для учасників передбачають наявність облікового запису GitHub. Якщо ви ніколи цього не робили, зараз саме час. Якщо у вас є 12 хвилин, дізнайтеся основи GitHub за допомогою [Посібника Git і GitHub для початківців](https://www.udacity.com/blog/2015/06/a-beginners-git-github-tutorial.html) від Udemy. -Можливо, ви не почали створювати та керувати сховищами для Rocky Linux, але цей [підручник Hello World](https://docs.github.com/en/get-started/quickstart/hello-world) допоможе вам створити обліковий запис GitHub, вивчити жаргон і зрозуміти, як працюють сховища. Зосередьтеся на вивченні того, як створювати та фіксувати оновлення в існуючих документах, а також на тому, як створити Pull Request. +Можливо, ви не починаєте зі створення та керування репозиторіями для Rocky Linux, але цей [посібник Hello World](https://docs.github.com/en/get-started/quickstart/hello-world) проведе вас через створення облікового запису GitHub, вивчення термінології та розуміння того, як працюють репозиторії. Зосередьтеся на вивченні того, як створювати та фіксувати оновлення в існуючих документах, а також на тому, як створити Pull Request. ## Markdown @@ -94,6 +94,6 @@ Markdown — це проста мова, яка дозволяє включат - Прокоментує відгук і попросить внести зміни - Відмовить вашому PR з поясненням - Остання відповідь малоймовірна. Ми дійсно хочемо включити вашу точку зору тут! Якщо вам доведеться внести зміни, ви раптом зрозумієте, навіщо вам локальне сховище. Команда може [пояснити вам](https://chat.rockylinux.org/rocky-linux/channels/documentation), що робити далі. Хороша новина: це все ще можна виправити. Дотримуйтеся розділу коментарів цього запиту, щоб дізнатися, яка додаткова інформація вимагається. + Остання відповідь малоймовірна. Ми дійсно хочемо включити вашу точку зору тут! Якщо вам доведеться внести зміни, ви раптом зрозумієте, навіщо вам локальне сховище. Команда може [пояснити вам](https://chat.rockylinux.org/rocky-linux/channels/documentation), що робити далі. Хороша новина: це все ще можна виправити. Якщо вам потрібно додати або змінити ваш запит на зміщення (pull request), член команди додасть його до розділу коментарів. В іншому випадку ваш запит буде прийнято та об’єднано. Ласкаво просимо до команди, тепер ви офіційно учасник! Подивіться, чи за кілька днів ваше ім’я з’явиться у списку всіх співавторів унизу посібника для співавторів. diff --git a/docs/guides/contribute/style_guide.uk.md b/docs/guides/contribute/style_guide.uk.md index 978502ccdb..33d2e49d80 100644 --- a/docs/guides/contribute/style_guide.uk.md +++ b/docs/guides/contribute/style_guide.uk.md @@ -46,6 +46,10 @@ tags: - Заголовки не потребують крапки чи крапки з комою наприкінці, навіть якщо вони вживаються з великої літери, якщо вони не закінчуються абревіатурою. - Маркіровані та пронумеровані списки: уникайте початку з великої літери або кінцевих знаків пунктуації, якщо елемент не є повним реченням. +!!! info "Використання великої літери в заголовках речень" + + Люди, які використовують `vale` та інші мовні лінтери, побачать, що вони пропонують використовувати написання з великої літери в стилі речень. Значна частина документації, створеної в нашому пулі документації, використовує цей стиль написання заголовків з великої літери. Просто пам’ятайте, що який би стиль ви не обрали, дотримуйтесь його послідовності в межах вашого документа. + ### Голос і тон - **Проста мова.** Це можна описати як *менш розмовний* стиль. Більшість нашої документації відповідає цьому стандарту. @@ -63,6 +67,13 @@ tags: - Говорячи про особу *невідомої* або *небінарної* статі, зараз вважається прийнятним використовувати "вони" як займенник однини. - Говорячи про свої здібності, формулюйте відповіді як *здібності*, а не *обмеження.* Наприклад, якщо вам цікаво, чи ми маємо документацію про запуск Steam на Rocky Linux, відповідь не просто «ні». Скоріше, «Здається, це чудове місце для вас, щоб створити щось, щоб додати до нашого дерева!» - **Уникайте скорочень.** Це допомагає з перекладом. Винятком є написання чогось у більш розмовному тоні, як-от публікації в блозі чи вітальні інструкції для нових учасників спільноти. +- **Використовуйте active voice.** Active voice є точнішим і прямим і допомагає читачеві швидко зрозуміти ваш зміст. + +!!! info "Інші тлумачення голосу та тону" + + З моменту створення цього посібника зі стилю було створено кілька додаткових документів про голос і тон, зокрема: + - [Good Docs – погляд перекладача](../../rocky_insights/blogs/good_docs.md) + - [Active voice – шлях до простого та зрозумілого спілкування](../../rocky_insights/blogs/active_voice.md) ## Форматування @@ -98,7 +109,7 @@ tags: ### Застереження -У Markdown попередження — це спосіб помістити інформацію у вікно, щоб виділити її. Вони не є важливими для документації, але є інструментом, який може бути вам корисним. Дізнайтеся більше про застереження в нашому [Rocky Formatting doc](rockydocs_formatting.md). +У Markdown попередження — це спосіб помістити інформацію у вікно, щоб виділити її. Вони не є обов'язковими для документування, але можуть бути корисним інструментом. Дізнайтеся більше про застереження в нашому [Rocky Formatting doc](rockydocs_formatting.md). ## Доступність diff --git a/docs/release_notes/index.de.md b/docs/release_notes/index.de.md index 927eb29db9..1288d9ff9c 100644 --- a/docs/release_notes/index.de.md +++ b/docs/release_notes/index.de.md @@ -11,6 +11,14 @@ Willkommen auf unserer Liste der Release Notes und Changelogs für Rocky Linux. ## Rocky Linux Versionen +## Rocky 10 + +Rocky 10 (Codename „Red Quartz“) hat allgemeinen Support bis 31. Mai 2030 und Sicherheitssupport bis 31. Mai 2035. Die unterstützten Architekturen sind x86_64_v3, riscv64, aarch64, ppc64le und s390x. + +| Versionsnummer | Verfügbarkeitsdatum | Kernel-Version | +| -------------- | ------------------- | -------------- | +| 10.0 | 2025-06-11 | 6.12.0-55.14.1 | + ## Rocky 9 ### Übersicht @@ -27,6 +35,7 @@ Rocky 9 (Code Name "Blue Onyx") wird bis zum 31. Mai 2027 angeboten und Sicherhe | 9.3 | 2023-11-20 | 5.14.0-362.8.1 | | 9.4 | 2024-05-09 | 5.14.0-427.13.1 | | 9.5 | 2024-11-19 | 5.14.0-503.14.1 | +| 9.6 | 2025-06-04 | 5.14.0-570.18.1 | ## Rocky 8 From f0b50ca29364f73959780ba65f467b5a678cee50 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 7 Jul 2025 05:51:44 -0700 Subject: [PATCH 052/164] New Crowdin updates (#2768) * New translations 11-tasks.md (Chinese Simplified) * New translations 09-backups.md (Chinese Simplified) * New translations 9_6.md (German) * New translations 9_6.md (German) --- docs/books/admin_guide/09-backups.zh.md | 2 +- docs/books/admin_guide/11-tasks.zh.md | 267 +++++++++++++----------- docs/release_notes/9_6.de.md | 140 +++++++++++++ 3 files changed, 282 insertions(+), 127 deletions(-) create mode 100644 docs/release_notes/9_6.de.md diff --git a/docs/books/admin_guide/09-backups.zh.md b/docs/books/admin_guide/09-backups.zh.md index cb2ddfe6d8..ce68c551da 100644 --- a/docs/books/admin_guide/09-backups.zh.md +++ b/docs/books/admin_guide/09-backups.zh.md @@ -543,7 +543,7 @@ tar xvf backup.tar --wildcards '*.conf' **通配符**:用于匹配文件名或目录名。 **正则表达式**:用于匹配文件的内容。 - 您可以在 [此文档](../sed_awk_grep/1_regular _expressions_vs_wildcards.md) 中看到更详细的介绍。 + 您可以在 [此文档](../sed_awk_grep/1_regular_expressions_vs_wildcards.md) 中看到更详细的介绍。 ## *CoPy Input Output* - `cpio` diff --git a/docs/books/admin_guide/11-tasks.zh.md b/docs/books/admin_guide/11-tasks.zh.md index 1b2f7c4912..6708704c20 100644 --- a/docs/books/admin_guide/11-tasks.zh.md +++ b/docs/books/admin_guide/11-tasks.zh.md @@ -1,250 +1,265 @@ --- -title: Task Management +title: 任务管理 --- -# Task Management +# 任务管理 -In this chapter you will learn how to manage scheduled tasks. +在本章中,您将学习如何管理计划任务。 **** -**Objectives** : In this chapter, future Linux administrators will learn how to: +**目标**: 在本章中,未来的 Linux 管理员们将学习如何: -:heavy_check_mark: Linux deals with the tasks scheduling; -:heavy_check_mark: restrict the use of **`cron`** to certain users; -:heavy_check_mark: schedule tasks. +:heavy_check_mark: 使用 Linux 处理计划任务; +:heavy_check_mark: 将 **`cron`** 的使用限制为某些用户; +:heavy_check_mark: 计划任务。 -:checkered_flag: **crontab**, **crond**, **scheduling**, **linux** +:checkered_flag: **crontab**,**crond**,**scheduling**,**linux** -**Knowledge**: :star: :star: -**Complexity**: :star: :star: +**知识性**: :star: :star: +**复杂度**: :star: :star: -**阅读时间**: 15 分钟 +**阅读时间**:15 分钟 **** ## 概论 -The scheduling of tasks is managed with the `cron` utility. It allows the periodic execution of tasks. +任务的调度由 `cron` 实用程序进行管理。 它允许定期执行任务。 -It is reserved to the administrator for system tasks but can be used by normal users for tasks or scripts that they have access to. To access the `cron` utility, we use: `crontab`. +该工具通常保留给管理员执行系统任务,但普通用户也可用它来运行自己有权限访问的任务或脚本。 要访问 `cron` 实用工具,我们需要使用 `crontab`。 -The `cron` service is used for: +`cron` 服务用于: -* Repetitive administration operations; -* Backups; -* Monitoring of system activity; -* Program execution. +* 重复性的管理任务; +* 备份; +* 监控系统活动; +* 程序执行。 -`crontab` is short for **cron table**, but can be thought of as a task scheduling table. +`crontab` 是 **cron table** 的缩写,但可以认为它是任务调度表。 -!!! Warning To set up a schedule, the system must have the correct time set. +!!! warning "警告" -## How the service works + 要设置计划,系统必须为设置正确的时间。 -The `cron` service is run by a `crond` daemon present in memory. +## 服务的工作原理 -To check its status: +`cron` 服务由内存中的 `crond` 守护进程来运行。 -``` +要检查其状态: + +```bash [root] # systemctl status crond ``` -!!! Tip If the `crond` daemon is not running, you will have to initialize it manually and/or automatically at startup. Indeed, even if tasks are scheduled, they will not be launched. +!!! Tip "提示" -Initialization of the `crond` daemon in manual: + 如果 `crond` 守护程序未运行,则必须在启动时手动 和/或 自动对其进行初始化。 即使任务被安排了,它们也不会被启动。 -``` +手动初始化 `crond` 守护进程: + +```bash [root]# systemctl {status|start|restart|stop} crond ``` -Initialization of the `crond` daemon at startup: +启动时初始化 `crond` 守护进程: -``` +```bash [root]# systemctl enable crond ``` -## Security +## 安全性 -In order to implement a schedule, a user must have permission to use the `cron` service. +为了实现计划任务,用户必须具有使用 `cron` 服务的权限。 -This permission varies according to the information contained in the files below: +此权限因以下文件中包含的信息而异: * `/etc/cron.allow` * `/etc/cron.deny` -!!! Warning If neither file is present, all users can use `cron`. +!!! warning "警告" -### The `cron.allow` and `cron.deny` Files + 如果两个文件都不存在,则所有用户都可以使用 `cron`。 -File `/etc/cron.allow` +### `cron.allow` 和 `cron.deny` 文件 -Only users contained in this file are allowed to use `cron`. +`/etc/cron.allow` 文件 -If it exists and is empty, no users can use `cron`. +仅允许此文件中包含的用户使用 `cron`。 -!!! Warning If `cron.allow` is present, `cron.deny` is **ignored**. +如果它存在并且为空,则任何用户都不能使用 `cron`。 -File `/etc/cron.deny` +!!! warning "警告" -Users in this file are not allowed to use `cron`. + 如果存在 `cron.allow` ,则 `cron.deny` 将被 **忽略**。 -If it is empty, all users can use `cron`. +`/etc/cron.deny` 文件 -By default, `/etc/cron.deny` exists and is empty and `/etc/cron.allow` does not exist. +此文件中的用户不允许使用 `cron`。 -### Allowing a user +如果内容为空,则所有用户都可以使用 `cron`。 -Only **user1** will be able to use `cron`. +默认情况下,`/etc/cron.deny` 文件存在但为空,而 `/etc/cron.allow` 文件不存在。 当两个文件同时存在时,系统仅使用 `cron.allow` 的文件内容作为判断依据并完全忽略 `cron.deny` 文件的存在。 -``` +### 允许一个用户 + +仅 **user1** 能够使用 `cron`。 + +```bash [root]# vi /etc/cron.allow user1 ``` -### Prohibit a user -Only **user2** will not be able to use `cron`. +### 禁止一个用户 -``` +仅 **user2** 不能使用 `cron`。 请注意,`/etc/cron.allow` 文件不能存在。 + +```bash [root]# vi /etc/cron.deny user2 ``` -`cron.allow` must not be present. +如果 `/etc/cron.deny` 和 `/etc/cron.allow` 中同时存在相同的用户,则用户可以正常使用 cron。 -## Scheduling tasks +## 计划任务 -When a user schedules a task, a file with his name is created under `/var/spool/cron/`. +当给用户设置计划任务时,会在 `/var/spool/cron/`下创建一个以该用户命名的文件。 -This file contains all the information the `crond` needs to know regarding all tasks created by this user, the commands or programs to run, and when to run them (hour, minute, day ...). +该文件包含 `crond` 运行该用户创建的计划任务所需的全部信息,包括待执行的命令或程序以及运行它们的时间表(时、分、日等)。 请注意,`crond` 可以识别的最小时间单位是 1 分钟。 在 RDBMS(如 MySQL )中也有类似的计划任务,其中基于时间的计划任务被称为"事件调度器"(其可识别的时间单位为1秒),基于事件的计划任务称为 "触发器"。 -![Cron tree](images/tasks-001.png) +![Cron 树](images/tasks-001.png) -### The `crontab` command +### `crontab` 命令 -The `crontab` command is used to manage the schedule file. +`crontab` 命令用于管理计划任务文件。 -``` +```bash crontab [-u user] [-e | -l | -r] ``` -Example: +示例: -``` +```bash [root]# crontab -u user1 -e ``` -| Option | Description | -| ------ | --------------------------------------------------------- | -| `-e` | Edit the schedule file with vi | -| `-l` | Displays the contents of the schedule file | -| `-u` | Name of the user whose schedule file is to be manipulated | -| `-r` | Delete the schedule file | +| 选项 | 说明 | +| ----------------- | -------------- | +| `-e` | 使用 vi 编辑计划任务文件 | +| `-l` | 显示计划任务文件的内容 | +| `-u ` | 指定单个用户进行操作 | +| `-r` | 删除计划任务文件 | -!!! Warning `crontab` without option deletes the old schedule file and waits for the user to enter new lines. You have to press ctrl + d to exit this editing mode. +!!! warning "警告" - Only `root` can use the `-u user` option to manage another user's schedule file. + 没有选项的 `crontab` 会删除旧的计划任务文件并等待用户输入新行。 您必须按 ctrl + d 键才能退出此编辑模式。 + + 只有 `root` 才能使用 `-u ` 选项来管理其他用户的计划任务文件。 - The example above allows root to schedule a task for user1. + 上面的示例允许 root 为 user1 安排计划任务。 -### Uses of `crontab` +### `crontab` 的使用 -The uses of `crontab` are many and include: +`crontab` 的用途很多,包括: -* Modifications to the `crontab` files taken into account immediately; -* No need to restart. +* 对 `crontab` 文件所做的修改会立即生效; +* 无需重启。 -On the other hand, the following points must be taken into account: +另一方面,必须考虑以下几点: -* The program must be autonomous; -* Provide redirections (stdin, stdout, stderr); -* It is not relevant to run commands that use input/output requests on a terminal. +* 程序必须能够独立运行; +* 提供重定向(stdin, stdout, stderr); +* 不适合执行需要终端交互操作的命令。 -!!! Note It is important to understand that the purpose of scheduling is to perform tasks automatically, without the need for external intervention. +!!! note "说明" -## The `crontab` file + 重要的是要理解计划任务的目的——在不需要外部干预的情况下自动执行任务。 -The `crontab` file is structured according to the following rules. +## `crontab` 文件 -* Each line of this file corresponds to a schedule; -* Each line has six fields, 5 for the time and 1 for the order; -* Each field is separated by a space or a tab; -* Each line ends with a carriage return; -* A `#` at the beginning of the line comments it. +`crontab` 文件的结构遵循以下规则。 -``` +* 此文件的每一行都对应一项计划任务; +* 每行包含6个字段:5个时间设定字段 + 1个命令指令字段; +* 字段间需用空格或制表符分隔; +* 每行必须以回车符结束; +* 行首的 `#` 号将注释该行内容。 + +```bash [root]# crontab –e 10 4 1 * * /root/scripts/backup.sh 1 2 3 4 5 6 ``` -| Field | Description | Detail | -| ----- | ------------------- | ------------------------ | -| 1 | Minute(s) | From 0 to 59 | -| 2 | Hour(s) | From 0 to 23 | -| 3 | Day(s) of the month | From 1 to 31 | -| 4 | Month of the year | From 1 to 12 | -| 5 | Day(s) of the week | From 0 to 7 (0=7=sunday) | -| 6 | Task to execute | Full command or script | +| 字段 | 说明 | 详情 | +| -- | ------ | ---------------------- | +| 1 | 分钟 | 从 0 到 59 | +| 2 | 小时 | 从 0 到 23 | +| 3 | 月中的某一天 | 从 1 到 31 | +| 4 | 年中的某一月 | 从 1 到 12 | +| 5 | 星期几 | 从 0 到 7 (0 和 7 都表示星期日) | +| 6 | 要执行的任务 | 完整命令或脚本 | -!!! Warning The tasks to be executed must use absolute paths and if possible use redirects. +!!! warning "警告" -In order to simplify the notation for the definition of time, it is advisable to use special symbols. + 需执行的任务必须使用绝对路径,并应尽量配置输出重定向。 -| Wildcards | Description | -| --------- | -------------------------------- | -| `*` | All possible values of the field | -| `-` | Indicates a range of values | -| `,` | Indicates a list of values | -| `/` | Defines a step | +为了简化时间定义的符号,建议使用特殊符号。 -Examples: +| 特殊符号 | 说明 | +| ---- | ---------- | +| `*` | 表示字段的所有时间值 | +| `-` | 表示连续的时间范围 | +| `,` | 表示不连续的时间范围 | +| `/` | 表示时间间隔 | -Script executed on April 15 at 10:25 am: +示例: -``` +脚本于4月15日上午10:25执行: + +```bash 25 10 15 04 * /root/scripts/script > /log/… ``` -Run at 11am and then at 4pm every day: +每天上午11点和下午4点运行一次任务: -``` +```bash 00 11,16 * * * /root/scripts/script > /log/… ``` -Run every hour from 11am to 4pm every day: +该任务每天上午11点至下午4点每小时运行一次: -``` +```bash 00 11-16 * * * /root/scripts/script > /log/… ``` -Run every 10 minutes during working hours: +工作日的工作时间每10分钟运行一次: -``` +```bash */10 8-17 * * 1-5 /root/scripts/script > /log/… ``` -For the root user, `crontab` also has some special time settings: - -| Setting | Description | -| --------- | -------------------------------------------------------------- | -| @reboot | Run command on system reboot | -| @hourly | Run command every hour | -| @daily | Runs daily just after midnight | -| @weekly | Runs command every Sunday just after midnight | -| @monthly | Runs command on the first day of the month just after midnight | -| @annually | Runs January 1st just after midnight | +对于 root 用户, `crontab` 也有一些特殊的时间设置: -### Task execution process +| 设置 | 说明 | +| --------- | -------------- | +| @reboot | 在系统重新启动时运行命令 | +| @hourly | 每小时运行一次命令 | +| @daily | 每天午夜后运行 | +| @weekly | 每周日午夜后运行命令 | +| @monthly | 在每月的第一天午夜后运行命令 | +| @annually | 1月1日午夜后运行 | -A user, rockstar, wants to edit his `crontab` file: +### 任务执行过程 -1) `crond` checks to see if he is allowed (`/etc/cron.allow` and `/etc/cron.deny`). +用户 rockstar 想要编辑他的 `crontab` 文件: -2) If he is, he accesses his `crontab` file (`/var/spool/cron/rockstar`). +1. `crond` 需要检查他是否被授权(依据 `/etc/cron.allow` 和 `/etc/cron.deny` )。 -Every minute `crond` reads the schedule files. +2. 若授权通过,用户可访问其专属的 `crontab` 文件(`/var/spool/cron/rockstar`)。 -3) It executes the scheduled tasks. +`crond` 守护进程: -4) It reports systematically in a log file (`/var/log/cron`). +* 读取 - 每分钟读取所有用户的计划任务文件。 +* 运行 - 根据计划运行任务。 +* 写入 - 将相应的事件和消息写入到文件中(`/var/log/cron`)。 diff --git a/docs/release_notes/9_6.de.md b/docs/release_notes/9_6.de.md new file mode 100644 index 0000000000..95214ac705 --- /dev/null +++ b/docs/release_notes/9_6.de.md @@ -0,0 +1,140 @@ +--- +title: Aktuelle Version 9.6 +tags: + - 9.6 + - Release 9.6 + - Rocky 9.6 +--- + +## Versionshinweise für Rocky Linux 9.6 + +Eine vollständige Liste der meisten Änderungen finden Sie in den [Upstream-Versionshinweisen hier](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html-single/9.6_release_notes/index). + +## Upgrade + +Sie können von Rocky Linux 9.x auf Rocky Linux 9.6 aktualisieren, indem Sie `sudo dnf -y upgrade` ausführen. + +!!! note "Anmerkung" + + Rocky Linux bietet keinen Upgrade-Pfad von irgendeiner Version von Rocky Linux 8. Wir empfehlen eine Neuinstallation des Betriebssystems, um auf Rocky Linux 9.6 umzusteigen. + +## ISO-Images + +Neben den Standardinstallationsimages stehen mehrere Images zur Verfügung, darunter auch solche für Cloud- und Containerplattformen. + +Weitere Informationen zu den von der Cloud Special Interest Group erstellten Artefakten sowie Einzelheiten zur Teilnahme finden Sie auf der [SIG/Cloud-Wiki-Seite](https://sig-cloud.rocky.page/). + +### Workflow und Prozedur zum Erstellen von Images + +Mit der Veröffentlichung von Rocky Linux 9.6 verbessert sich der Prozess der Erstellung und Bereitstellung unserer Images weiter. KIWI, ein modernes Bilderstellungstool, das einen konsistenteren und wartungsfreundlicheren Arbeitsablauf ermöglicht, hat die meisten Bilder für diese Version erstellt. + +Zu den Images, die immer noch mit ImageFactory erstellt werden, gehören Vagrant (Libvirt, VirtualBox und VMware) sowie OCP-Base (Oracle Cloud Platform). Alle anderen Cloud- und Container-Images werden jetzt mit KIWI erstellt. Dieser Übergang ermöglicht es uns, Updates häufiger auf allen unterstützten Plattformen zu veröffentlichen und gleichzeitig die Funktionsparität mit früheren Versionen aufrechtzuerhalten. + +Wenn Sie auf Probleme oder Verhaltensunterschiede stoßen, informieren Sie uns bitte. Unser Ziel ist es, unerwartete Änderungen schnell zu beheben oder zu erklären. + +### Neues WSL-Image + +Die Einführung eines neuen WSL-Images ist zusätzlich zu den KIWI-Upgrades ebenfalls gegeben!\ +Dadurch ist es möglich, die sofortige Einsatzbereitschaft zu nutzen, die die vom Store bereitgestellten Bilder bieten: + +- Download des Image: [x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-WSL-Base.latest.x86_64.wsl) oder [aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-WSL-Base.latest.aarch64.wsl) +- Führen Sie zur Installation `wsl --install --from-file path/to/file.wsl rocky-wsl-base` aus oder doppelklicken Sie einfach auf die WSL-Datei +- Beim ersten Start des WSL-Images werden Sie aufgefordert, einen Benutzernamen anzugeben + +Weitere Einzelheiten finden Sie auf der [Dokumentationsseite](https://docs.rockylinux.org/guides/interoperability/import_rocky_to_wsl/). + +## Installation + +Stellen Sie vor der Installation [sicher, dass Ihre CPU mit diesem Verfahren kompatibel ist!](https://docs.rockylinux.org/gemstones/test_cpu_compat/) + +Um Rocky Linux 9.6 zu installieren, gehen Sie zur [Download-Seite](https://rockylinux.org/download/) und laden Sie die Version herunter, die Sie für Ihre Architektur benötigen. + +## Die Rocky Team Release Highlights + +### Neu und bemerkenswert + +## Wichtige Änderungen + +Eine vollständige Liste der wichtigsten Änderungen finden Sie in der [Upstream-Liste hier](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html-single/9.6_release_notes/index#overview-major-changes). + +Einige Highlights und Neuerungen in der neuen Version von Rocky Linux 9.6 werden im Folgenden beschrieben. + +### Sicherheit + +Nachfolgend sind die sicherheitsrelevanten Highlights der neuesten Version von Rocky Linux 9.6 aufgeführt. Eine vollständige Liste der sicherheitsrelevanten Änderungen finden Sie unter diesem [Upstream-Link](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-security): + +- **SELinux** bietet jetzt zusätzliche Richtlinienregeln, die `iio-sensor-proxy`, `power-profiles-daemon`, `switcheroo-control` und `samba-bgqd` einschränken. + +### Dynamische Programmiersprachen, Web- und Datenbankserver + +Eine detaillierte Liste der Änderungen in dieser Kategorie finden Sie unter [diesem Upstream-Link](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-dynamic-programming-languages-web-and-database-servers). + +Neuere Versionen der folgenden Anwendungs-Streams sind nun verfügbar: + +- **PHP 8.3** Module-Stream +- **MySQL 8.4** Module-Stream +- **nginx 1.26** Module-Stream + +### Compiler und Entwicklungstools + +Einzelheiten zu den Änderungen in dieser Kategorie [finden Sie unter diesem Upstream-Link](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-compilers-and-development-tools) + +Performance-Tools und Debugger aktualisiert: + +- **Valgrind 3.24.0** +- **SystemTap 5.2** +- **elfutils 0.192** +- **libabigail 2.6** + +Leistungsüberwachungs-Tools aktualisiert: + +- **PCP 6.3.2** + +Aktualisierte Compiler-Toolsets + +- **LLVM Toolset 19.17** +- **Rust Toolset 1.84.1** +- **Go Toolset 1.23** + +## Bekannte Issues + +### Das aktuelle ZFS-Modul wird in 9.6 nicht geladen + +Das aktuell veröffentlichte `zfs`-Modul von OpenZFS **wird auf Rocky Linux 9.6 nicht geladen**. Für diejenigen, die `zfs` unter 9.5 verwenden und ein Upgrade auf 9.6 planen, wird empfohlen, vorerst zu warten. Wenn Sie eine Neuinstallation von 9.6 planen und `zfs` verwenden, sollten Sie erneut auf die Veröffentlichung des aktualisierten Moduls warten. Sie können das Problem [hier](https://github.com/openzfs/zfs/issues/17332) und [hier](https://github.com/openzfs/zfs/issues/17364) verfolgen. + +**Update:** Ein Update für den Zweig 2.2.8 [behebt das Problem mit 9.6](https://github.com/openzfs/zfs/releases). Warte immer noch auf das Update für Zweig 2.3. + +### SELinux-Problem auf Server-, Workstation- oder virtuellen Hostsystemen mit installiertem `passt` + +Wenn Sie eine Workstation, einen Server oder einen virtuellen Host mit installiertem `passt`-Backend verwenden, kann die Schnittstelle nicht gestartet werden, wenn SELinux aktiviert ist. Weitere Informationen finden Sie unter [diesem Upstream-Issue](https://issues.redhat.com/browse/RHEL-80407). + +### Upgrade-Fehler mit installierten `gstreamer`-Paketen + +Beim Upgrade eines Systems tritt eine Fehlermeldung auf: + + ``` + Error: Transaction test error: + file /usr/lib64/gstreamer-1.0/libgstdvbsuboverlay.so from install of gstreamer1-plugins-bad-free-1.22.12-4.el9_6.x86_64 conflicts with file from package gstreamer1-plugins-bad-freeworld-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstsiren.so from install of gstreamer1-plugins-bad-free-1.22.12-4.el9_6.x86_64 conflicts with file from package gstreamer1-plugins-bad-freeworld-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstasf.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstdvdlpcmdec.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstdvdsub.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstrealmedia.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + ``` + +Stoppen Sie das Upgrade und führen Sie Folgendes aus, bevor Sie das Upgrade erneut versuchen: + + ``` + sudo dnf swap gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 + sudo dnf swap gstreamer1-plugins-bad-freeworld-1:1.22.1-1.el9.x86_64 gstreamer1-plugins-bad-free-1.22.12-4.el9_6.x86_64 + ``` + +Wie bei jeder Version gibt es einige bekannte Issues. Vollständige Details zu diesen Problemen finden Sie in der [Upstream-Liste](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/known-issues). + +!!! info "Obsolet Software" + + Einige Anwendungs-Streams, die Teil der Rocky Linux 9.6-Repositories sind, erhalten keine weiteren Updates. Dies ist ein regelmäßiges Phänomen, das bei fast jeder Version auftritt. Bitte stellen Sie sicher, dass Sie die neueste unterstützte Version der Software verwenden. + +## Fehler melden + +Bitte melden Sie alle Fehler, auf die Sie gestoßen sind, dem [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Wir heißen Sie auch herzlich willkommen, unserer Community beizutreten, sei es in unseren [Foren](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC auf Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailinglisten](https://lists.resf.org), oder auf welche andere Art auch immer Sie teilnehmen möchten! From 9fc5642b0cb8fb5ae91d9eecad1862a8b2dc1d5f Mon Sep 17 00:00:00 2001 From: tianci li <86754294+jimcat8@users.noreply.github.com> Date: Mon, 7 Jul 2025 22:11:37 +0800 Subject: [PATCH 053/164] Regular text content repair (#2750) * Regular text content repair * update package manager * Update 10_0.md --------- Co-authored-by: wale soyinka --- docs/release_notes/10_0.md | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/docs/release_notes/10_0.md b/docs/release_notes/10_0.md index d5411ac23a..74e508254f 100644 --- a/docs/release_notes/10_0.md +++ b/docs/release_notes/10_0.md @@ -46,7 +46,7 @@ Rocky Linux 10 is supported on the following processor architectures: #### Brand New Support for RISC-V Architecture -The Rocky Linux release Engineering team worked long and hard to bring Rocky Linux 10 to certain RISC-V implementations. +The Rocky Linux release Engineering team worked long and hard to bring Rocky Linux 10 to certain "RISC-V implementations". Platforms/subsystems supported on release day include - StarFive VisionFive 2 (VF2), **QEMU**, and SiFive HiFive Premier P550. For more details about this milestone, including RL10’s RISC-V support, please visit [this site](https://rockylinux.org/news/rockylinux-support-for-riscv). @@ -61,7 +61,7 @@ AMD's implementation of the x86-64-v3 microarchitecture level, which serves as t The key difference between the Rocky Linux Pi images for version 10 is that 10 supports Pi 4 and Pi 5, whereas 9 supports Pi 3, Pi 4, Pi 5, and Pi Zero 2W. -### Installation and Image Creation +### Installer and Image Creation Anaconda, the interactive graphical interface for the Rocky Linux installer, has a number of changes in version 10. @@ -128,7 +128,7 @@ With RL 10, comes the inclusion of numerous new security-related features. Some of the updates include: -* System-wide cryptographic policies (crypto-policies): OpenSSL and OpenSSH now work with post-quantum algorithms. +* System-wide cryptographic policies (crypto-policies): OpenSSL and OpenSSH now work with Post-Quantum Cryptography (PQC). * Sequoia PGP: A memory-free implementation of OpenPGP. * OpenSSH: The restoration of stricter SSH host key permissions. (New Permissions = 0600 Vs Old permissions = 0640). * GnuTLS: Client and server certificates are now compressed @@ -173,7 +173,16 @@ By default, DNF now omits downloading repository filelist metadata, enhancing re #### Modularity -DNF modularity is deprecated, and Rocky Linux does not intend to provide AppStream content as modules in RL 10. In the future, RL 10 might provide additional application versions as RPM packages, software collections, or Flatpaks. +DNF modularity is deprecated, and Rocky Linux does not intend to provide AppStream content as modules in RL 10. In the future, RL 10 might provide additional application versions as RPM packages, software collections, or Flatpaks. + +In other words, the `dnf module` command has been phased out in RL 10 because the next-generation DNF package manager (`dnf5`) has unified the API and no longer relies on the old modular architecture to manage multiple versions of the software. The relevant comparisons are as follows: + +| describe | Old (`dnf module`) | New | +| :---: | :---: | :--- | +| View available versions | `dnf module list ` | `dnf repoquery ` | +| Install a specific version | `dnf module enable nginx:1.14 && dnf module install nginx:1.14` | `dnf install nginx-1.26.3` | +| Delete a certain version | `dnf -y module remove --all :` or `dnf -y module remove --all :/` | `dnf remove -` | +| Switch to a specific version | `dnf -y module remove --all : && dnf module reset && dnf module enable :` | No need to switch | ### Desktop Environment From cb7091a6e4401c233a4438a26bb87fb2ce841d38 Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Thu, 10 Jul 2025 15:18:22 -0500 Subject: [PATCH 054/164] Edit errors on: `generating_ssl_keys_lets_encrypt.md` (#2772) * fix "Virtual Host" to "VirtualHost" * fix wrap around of SSL Ciphers in configuration --- docs/guides/security/generating_ssl_keys_lets_encrypt.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/guides/security/generating_ssl_keys_lets_encrypt.md b/docs/guides/security/generating_ssl_keys_lets_encrypt.md index 115f357bb2..50a7f2cca0 100644 --- a/docs/guides/security/generating_ssl_keys_lets_encrypt.md +++ b/docs/guides/security/generating_ssl_keys_lets_encrypt.md @@ -171,7 +171,7 @@ A single PEM (Privacy Enhanced Mail) file includes the certificate and chain fil ServerAdmin username@rockylinux.org Redirect / https://your-server-hostname/ - + ServerName your-server-hostname ServerAdmin username@rockylinux.org DocumentRoot /var/www/sub-domains/com.yourdomain.www/html @@ -185,8 +185,7 @@ A single PEM (Privacy Enhanced Mail) file includes the certificate and chain fil SSLEngine on SSLProtocol all -SSLv2 -SSLv3 -TLSv1 SSLHonorCipherOrder on - SSLCipherSuite EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384 -:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS + SSLCipherSuite EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS SSLCertificateFile /etc/letsencrypt/live/your-server-hostname/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/your-server-hostname/privkey.pem From d121b182369392b6032112a6baf06be4b6918555 Mon Sep 17 00:00:00 2001 From: Neel Chauhan Date: Sat, 12 Jul 2025 00:25:34 -0400 Subject: [PATCH 055/164] `cloud_server_using_nextcloud.md`: Update for Rocky 10 (#2773) --- docs/guides/cms/cloud_server_using_nextcloud.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/guides/cms/cloud_server_using_nextcloud.md b/docs/guides/cms/cloud_server_using_nextcloud.md index a744844e9c..6833a9623a 100644 --- a/docs/guides/cms/cloud_server_using_nextcloud.md +++ b/docs/guides/cms/cloud_server_using_nextcloud.md @@ -10,9 +10,9 @@ tags: # Cloud Server Using Nextcloud -!!! note "Regarding Rocky Linux 9.x" +!!! note "Regarding Rocky Linux 9.x or 10.x" - This procedure should work for Rocky Linux 9.x. The difference is that you may need to change version references for some of the repositories to update those to version 9. If you are using Rocky Linux 9.x, just be aware that this was tested in both 8.6 and 9.0, but written originally for 8.6. + This procedure should work for Rocky Linux 9.x or 10.x. The difference is that you may need to change version references for some of the repositories to update those to version 9 or 10. If you are using Rocky Linux 9.x or 10.x, just be aware that this was tested in both 8.6 and 9.0, but written originally for 8.6. ## Prerequisites And Assumptions @@ -49,7 +49,7 @@ To install the EPEL run: dnf install epel-release ``` -To install the Remi repository run (note: if you are using Rocky Linux 9.x, substitute in 9 next to `release-` below): +To install the Remi repository run (note: if you are using Rocky Linux 9.x or 10.x, substitute in 9 or 10 next to `release-` below): ```bash dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm @@ -63,7 +63,7 @@ Run the following to see a list of php modules that can be enabled: dnf module list php ``` -which gives you this output for Rocky Linux 8.x (similar output will show for Rocky Linux 9.x): +which gives you this output for Rocky Linux 8.x (similar output will show for Rocky Linux 9.x or 10.x): ```bash Rocky Linux 8 - AppStream From ead3c6b17726057d35f9821488f7b444946a90d7 Mon Sep 17 00:00:00 2001 From: Neel Chauhan Date: Sat, 12 Jul 2025 11:18:51 -0400 Subject: [PATCH 056/164] `chyrp_lite.md`: Update for Rocky Linux 10 (#2774) --- docs/guides/cms/chyrp_lite.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/cms/chyrp_lite.md b/docs/guides/cms/chyrp_lite.md index a31a14a77b..6d9ed22932 100644 --- a/docs/guides/cms/chyrp_lite.md +++ b/docs/guides/cms/chyrp_lite.md @@ -67,7 +67,7 @@ systemctl enable --now caddy !!! note - If you are running Rocky Linux 8.x, substitute "8" next to the release in the Remi package install line. + If you are running Rocky Linux 8.x or 10.x, substitute "8" or "10" next to the release in the Remi package install line. To install PHP, you will need the Remi repository. To install the Remi repository, run the following: From eaf603edf953e2cbce1834260f090be58146455b Mon Sep 17 00:00:00 2001 From: Neel Chauhan Date: Sat, 12 Jul 2025 11:19:27 -0400 Subject: [PATCH 057/164] `caddy.md`: Update for Rocky 10 (#2775) --- docs/guides/web/caddy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/web/caddy.md b/docs/guides/web/caddy.md index d01bc27065..21f5e57e84 100644 --- a/docs/guides/web/caddy.md +++ b/docs/guides/web/caddy.md @@ -152,7 +152,7 @@ It should have an SSL padlock that should work in every modern browser, and not As mentioned earlier, Caddy supports FastCGI support for PHP. The good news is that unlike Apache and Nginx, Caddy handles PHP file extensions automatically. -To install PHP, first add the Remi repository (note: if you are running Rocky Linux 8.x, substitute in 8 next to the "release-" below): +To install PHP, first add the Remi repository (note: if you are running Rocky Linux 8.x or 10.x, substitute in 8 or 10 next to the "release-" below): ```bash dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm From 1983944bcb0e47029b736138d622e8ab7206feba Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Sat, 12 Jul 2025 08:20:30 -0700 Subject: [PATCH 058/164] New Crowdin updates (#2770) * New translations index.md (French) * New translations 01-gh_cli_1st_pr.md (French) * New translations gemstone_template.md (French) * New translations tracking_and_nontracking_branch.md (French) * New translations index.md (French) * New translations accel-ppp_pppoe_server.md (French) * New translations flatpak.md (French) * New translations 01-files-servers.md (French) * New translations 05-load-balancer-proxies.md (French) * New translations 06-mails-servers.md (French) * New translations brother-all-in-one.md (French) * New translations valuta.md (French) * New translations file-shredder.md (French) * New translations index.md (French) * New translations index.md (French) * New translations 01-gh_cli_1st_pr.md (German) * New translations index.md (German) * New translations flatpak.md (German) * New translations 01-files-servers.md (German) * New translations 06-mails-servers.md (German) * New translations brother-all-in-one.md (German) * New translations valuta.md (German) * New translations file-shredder.md (German) * New translations index.md (German) * New translations index.md (German) * New translations 2_grep_command.md (Italian) * New translations 3_sed_command.md (Italian) * New translations index.md (Italian) * New translations 01-gh_cli_1st_pr.md (Italian) * New translations gemstone_template.md (Italian) * New translations tracking_and_nontracking_branch.md (Italian) * New translations index.md (Italian) * New translations flatpak.md (Italian) * New translations 01-files-servers.md (Italian) * New translations 05-load-balancer-proxies.md (Italian) * New translations 06-mails-servers.md (Italian) * New translations brother-all-in-one.md (Italian) * New translations 04-database-servers.md (Italian) * New translations 051-load-balancer-proxies-haproxy.md (Italian) * New translations valuta.md (Italian) * New translations file-shredder.md (Italian) * New translations index.md (Italian) * New translations index.md (Italian) * New translations index.md (Portuguese) * New translations 2_grep_command.md (Ukrainian) * New translations 3_sed_command.md (Ukrainian) * New translations index.md (Ukrainian) * New translations 01-gh_cli_1st_pr.md (Ukrainian) * New translations gemstone_template.md (Ukrainian) * New translations tracking_and_nontracking_branch.md (Ukrainian) * New translations index.md (Ukrainian) * New translations i2pd.md (Ukrainian) * New translations accel-ppp_pppoe_server.md (Ukrainian) * New translations flatpak.md (Ukrainian) * New translations 01-files-servers.md (Ukrainian) * New translations 05-load-balancer-proxies.md (Ukrainian) * New translations 06-mails-servers.md (Ukrainian) * New translations brother-all-in-one.md (Ukrainian) * New translations 04-database-servers.md (Ukrainian) * New translations 051-load-balancer-proxies-haproxy.md (Ukrainian) * New translations valuta.md (Ukrainian) * New translations file-shredder.md (Ukrainian) * New translations glances_network_monitoring.md (Ukrainian) * New translations tar.md (Ukrainian) * New translations dump_restore.md (Ukrainian) * New translations index.md (Ukrainian) * New translations index.md (Ukrainian) * New translations index.md (Chinese Simplified) * New translations index.md (Chinese Simplified) * New translations podman-nextcloud.md (Italian) * New translations disa_stig_part1.md (Italian) * New translations disa_stig_part3.md (Italian) * New translations docker.md (Italian) * New translations podman.md (Italian) * New translations 10_0.md (German) --- docs/books/disa_stig/disa_stig_part1.it.md | 2 +- docs/books/disa_stig/disa_stig_part3.it.md | 2 +- docs/books/sed_awk_grep/2_grep_command.it.md | 2 +- docs/books/sed_awk_grep/2_grep_command.uk.md | 2 +- docs/books/sed_awk_grep/3_sed_command.it.md | 1362 ++++++++--------- docs/books/sed_awk_grep/3_sed_command.uk.md | 1362 ++++++++--------- docs/books/sed_awk_grep/index.fr.md | 2 +- docs/books/sed_awk_grep/index.it.md | 2 +- docs/books/sed_awk_grep/index.uk.md | 2 +- .../books/web_services/01-files-servers.de.md | 4 +- .../books/web_services/01-files-servers.fr.md | 4 +- .../books/web_services/01-files-servers.it.md | 4 +- .../books/web_services/01-files-servers.uk.md | 4 +- .../web_services/04-database-servers.it.md | 4 +- .../web_services/04-database-servers.uk.md | 4 +- .../05-load-balancer-proxies.fr.md | 2 +- .../05-load-balancer-proxies.it.md | 2 +- .../05-load-balancer-proxies.uk.md | 2 +- .../051-load-balancer-proxies-haproxy.it.md | 2 +- .../051-load-balancer-proxies-haproxy.uk.md | 2 +- .../books/web_services/06-mails-servers.de.md | 4 +- .../books/web_services/06-mails-servers.fr.md | 4 +- .../books/web_services/06-mails-servers.it.md | 4 +- .../books/web_services/06-mails-servers.uk.md | 4 +- docs/desktop/gnome/file-shredder.de.md | 16 +- docs/desktop/gnome/file-shredder.fr.md | 16 +- docs/desktop/gnome/file-shredder.it.md | 16 +- docs/desktop/gnome/file-shredder.uk.md | 16 +- docs/desktop/gnome/flatpak.de.md | 66 +- docs/desktop/gnome/flatpak.fr.md | 66 +- docs/desktop/gnome/flatpak.it.md | 66 +- docs/desktop/gnome/flatpak.uk.md | 66 +- docs/desktop/gnome/valuta.de.md | 16 +- docs/desktop/gnome/valuta.fr.md | 16 +- docs/desktop/gnome/valuta.it.md | 16 +- docs/desktop/gnome/valuta.uk.md | 16 +- docs/desktop/index.de.md | 2 +- docs/desktop/index.fr.md | 2 +- docs/desktop/index.it.md | 2 +- docs/desktop/index.uk.md | 2 +- .../desktop/printing/brother-all-in-one.de.md | 4 +- .../desktop/printing/brother-all-in-one.fr.md | 4 +- .../desktop/printing/brother-all-in-one.it.md | 4 +- .../desktop/printing/brother-all-in-one.uk.md | 4 +- docs/gemstones/containers/docker.it.md | 52 +- docs/gemstones/containers/podman.it.md | 128 ++ docs/gemstones/gemstone_template.fr.md | 3 +- docs/gemstones/gemstone_template.it.md | 3 +- docs/gemstones/gemstone_template.uk.md | 3 +- docs/gemstones/git/01-gh_cli_1st_pr.de.md | 2 +- docs/gemstones/git/01-gh_cli_1st_pr.fr.md | 2 +- docs/gemstones/git/01-gh_cli_1st_pr.it.md | 2 +- docs/gemstones/git/01-gh_cli_1st_pr.uk.md | 2 +- .../git/tracking_and_nontracking_branch.fr.md | 2 +- .../git/tracking_and_nontracking_branch.it.md | 2 +- .../git/tracking_and_nontracking_branch.uk.md | 2 +- docs/guides/backup/dump_restore.uk.md | 2 +- docs/guides/backup/tar.uk.md | 2 +- docs/guides/containers/podman-nextcloud.it.md | 56 +- .../network/accel-ppp_pppoe_server.fr.md | 2 +- .../network/accel-ppp_pppoe_server.uk.md | 2 +- .../network/glances_network_monitoring.uk.md | 2 +- docs/guides/proxies/i2pd.uk.md | 2 +- docs/release_notes/10_0.de.md | 282 ++++ docs/rocky_insights/blogs/index.de.md | 2 +- docs/rocky_insights/blogs/index.fr.md | 2 +- docs/rocky_insights/blogs/index.it.md | 2 +- docs/rocky_insights/blogs/index.uk.md | 2 +- docs/rocky_insights/blogs/index.zh.md | 2 +- docs/rocky_insights/links/sigs/index.de.md | 2 +- docs/rocky_insights/links/sigs/index.fr.md | 2 +- docs/rocky_insights/links/sigs/index.it.md | 2 +- docs/rocky_insights/links/sigs/index.pt.md | 2 +- docs/rocky_insights/links/sigs/index.uk.md | 2 +- docs/rocky_insights/links/sigs/index.zh.md | 2 +- 75 files changed, 2100 insertions(+), 1679 deletions(-) create mode 100644 docs/gemstones/containers/podman.it.md create mode 100644 docs/release_notes/10_0.de.md diff --git a/docs/books/disa_stig/disa_stig_part1.it.md b/docs/books/disa_stig/disa_stig_part1.it.md index 91d2af1b71..76dd552f56 100644 --- a/docs/books/disa_stig/disa_stig_part1.it.md +++ b/docs/books/disa_stig/disa_stig_part1.it.md @@ -22,7 +22,7 @@ tags: ## Introduzione -In questa guida verrà illustrato come applicare la [DISA STIG per RHEL8](https://www.stigviewer.com/stig/red_hat_enterprise_linux_8/) per una nuova installazione di Rocky Linux. Come serie in più parti, tratteremo anche come testare la conformità STIG, adattare le impostazioni STIG e applicare altri contenuti STIG in questo ambiente. +In questa guida verrà illustrato come applicare il [DISA STIG per RHEL8](https://stigviewer.com/stigs/red_hat_enterprise_linux_8) per una nuova installazione di Rocky Linux 8. Come serie in più parti, tratteremo anche come testare la conformità STIG, adattare le impostazioni STIG e applicare altri contenuti STIG in questo ambiente. Rocky Linux è un derivato bug per bug di RHEL e come tale il contenuto pubblicato per il DISA RHEL8 STIG è in parità per entrambi i sistemi operativi. Una notizia ancora migliore è che l'applicazione delle impostazioni STIG è integrata nel programma di installazione di Rocky Linux 8 anaconda, sotto la voce Profili di Sicurezza. Il tutto è gestito da uno strumento chiamato [OpenSCAP](https://www.open-scap.org/), che consente sia di configurare il sistema in modo che sia conforme alla DISA STIG (velocemente!), sia di testare la conformità del sistema dopo l'installazione. diff --git a/docs/books/disa_stig/disa_stig_part3.it.md b/docs/books/disa_stig/disa_stig_part3.it.md index cb6c8af433..776e84f5f2 100644 --- a/docs/books/disa_stig/disa_stig_part3.it.md +++ b/docs/books/disa_stig/disa_stig_part3.it.md @@ -12,7 +12,7 @@ tags: # Introduzione -Nella prima parte di questa serie, abbiamo spiegato come costruire il nostro server web con la STIG RHEL8 DISA di base applicata e, nella seconda parte, abbiamo imparato a testare la conformità STIG con lo strumento OpenSCAP. Ora faremo qualcosa con il sistema, costruendo una semplice applicazione web e applicando la STIG del server web DISA: https://www.stigviewer.com/stig/web_server/ +Nella prima parte di questa serie, abbiamo spiegato come costruire il nostro server web con la STIG RHEL8 DISA di base applicata e, nella seconda parte, abbiamo imparato a testare la conformità STIG con lo strumento OpenSCAP. Ora faremo qualcosa con il sistema, costruendo una semplice applicazione web e applicando il web server DISA STIG: [https://stigviewer.com/stigs/apache_server_2.4_unix_server](https://stigviewer.com/stigs/apache_server_2.4_unix_server) Per prima cosa confrontiamo ciò che stiamo affrontando: la STIG DISA di RHEL 8 è indirizzata a una piattaforma molto specifica, quindi i controlli sono abbastanza facili da capire in quel contesto, da testare e da applicare. Le STIG delle applicazioni devono essere portabili su più piattaforme, quindi il contenuto qui presente è generico per funzionare su diverse distribuzioni Linux (RHEL, Ubuntu, SuSE, ecc.)**. Strumenti come OpenSCAP non ci aiutano a verificare/recuperare la configurazione. Andremo a farlo manualmente. Questi STIG sono: diff --git a/docs/books/sed_awk_grep/2_grep_command.it.md b/docs/books/sed_awk_grep/2_grep_command.it.md index 91f32bc28a..8e71ca890f 100644 --- a/docs/books/sed_awk_grep/2_grep_command.it.md +++ b/docs/books/sed_awk_grep/2_grep_command.it.md @@ -1,7 +1,7 @@ --- title: Comando Grep author: tianci li -contributors: null +contributors: tags: - grep --- diff --git a/docs/books/sed_awk_grep/2_grep_command.uk.md b/docs/books/sed_awk_grep/2_grep_command.uk.md index 6729c1e654..2a9dee9943 100644 --- a/docs/books/sed_awk_grep/2_grep_command.uk.md +++ b/docs/books/sed_awk_grep/2_grep_command.uk.md @@ -1,7 +1,7 @@ --- title: Команда Grep author: tianci li -contributors: null +contributors: tags: - grep --- diff --git a/docs/books/sed_awk_grep/3_sed_command.it.md b/docs/books/sed_awk_grep/3_sed_command.it.md index 21e56286d2..02b9aacd72 100644 --- a/docs/books/sed_awk_grep/3_sed_command.it.md +++ b/docs/books/sed_awk_grep/3_sed_command.it.md @@ -1,7 +1,7 @@ --- title: Comando Sed author: tianci li -contributors: null +contributors: tags: - sed --- @@ -68,446 +68,416 @@ sed [OPTION]... {script-only-if-no-other-script} [input-file]... 1. Associa e visualizza (`p`) - - Visualizza le righe che iniziano con la stringa netbios - - ```bash - Shell > cat /etc/services | sed -n '/^netbios/p' - netbios-ns 137/tcp # NETBIOS Name Service - netbios-ns 137/udp - netbios-dgm 138/tcp # NETBIOS Datagram Service - netbios-dgm 138/udp - netbios-ssn 139/tcp # NETBIOS session service - netbios-ssn 139/udp - ``` - - !!! tip "Suggerimento" - - ``` - Come sappiamo bene, le virgolette doppie e singole in una shell ricoprono ruoli differenti. I caratteri **$**, **\`** e **\\** tra virgolette doppie hanno un significato speciale. Il consiglio è utilizzare le virgolette singole più spesso con il comando `sed`. - ``` - - - Visualizza il testo da riga 23 a riga 26 - - ```bash - Shell > cat -n /etc/services | sed -n '23,26p' - 23 tcpmux 1/tcp # TCP port service multiplexer - 24 tcpmux 1/udp # TCP port service multiplexer - 25 rje 5/tcp # Remote Job Entry - 26 rje 5/udp # Remote Job Entry - ``` - - - Visualizza solo le righe dispari - - ```bash - Shell > cat -n /etc/services | sed -n '1~2p' - 1 # /etc/services: - 3 # - 5 # IANA services version: last updated 2016-07-08 - 7 # Note that it is presently the policy of IANA to assign a single well-known - 9 # even if the protocol doesn't support UDP operations. - 11 # are included, only the more common ones. - 13 # The latest IANA port assignments can be gotten from - 15 # The Well Known Ports are those from 0 through 1023. - 17 # The Dynamic and/or Private Ports are those from 49152 through 65535 - 19 # Each line describes one service, and is of the form: - ... - ``` - - - Visualizza dalla riga 10 fino all'ultima riga - - ```bash - Shell > cat -n /etc/services | sed -n '10,$p' - 10 # Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports - 11 # are included, only the more common ones. - 12 # - 13 # The latest IANA port assignments can be gotten from - 14 # http://www.iana.org/assignments/port-numbers - 15 # The Well Known Ports are those from 0 through 1023. - 16 # The Registered Ports are those from 1024 through 49151 - 17 # The Dynamic and/or Private Ports are those from 49152 through 65535 - ... - ``` - - - Non visualizzare dalla riga 10 in poi - - ```bash - Shell > cat -n /etc/services | sed -n '10,$!p' - 1 # /etc/services: - 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ - 3 # - 4 # Network services, Internet style - 5 # IANA services version: last updated 2016-07-08 - 6 # - 7 # Note that it is presently the policy of IANA to assign a single well-known - 8 # port number for both TCP and UDP; hence, most entries here have two entries - 9 # even if the protocol doesn't support UDP operations. - ``` - - - Visualizza il numero di riga e il contenuto della stringa corrispondente - - ```bash - Shell > sed -n -e '/netbios/=' -e '/netbios/p' /etc/services - 123 - netbios-ns 137/tcp # NETBIOS Name Service - 124 - netbios-ns 137/udp - 125 - netbios-dgm 138/tcp # NETBIOS Datagram Service - 126 - netbios-dgm 138/udp - 127 - netbios-ssn 139/tcp # NETBIOS session service - 128 - netbios-ssn 139/udp - ``` - - - Trova le corrispondenze nell'elenco delle stringhe e lo visualizza - - Utilizzare la virgola per separare l'elenco delle stringhe di ricerca - - ```bash - Shell > cat /etc/services | sed -n '/^netbios/,/^imap/p' - netbios-ns 137/tcp # NETBIOS Name Service - netbios-ns 137/udp - netbios-dgm 138/tcp # NETBIOS Datagram Service - netbios-dgm 138/udp - netbios-ssn 139/tcp # NETBIOS session service - netbios-ssn 139/udp - imap 143/tcp imap2 # Interim Mail Access Proto v2 - ``` - - !!! info "Informazione" - - ``` - **Stringa iniziale**: Abbina la riga in cui si trova la stringa, mostrando solo la prima stringa che compare. - **Stringa finale**: Abbina la riga in cui si trova la stringa, mostrando solo la prima stringa che compare. - ``` - - ```bash - Shell > grep -n ^netbios /etc/services - 123:netbios-ns 137/tcp # NETBIOS Name Service - 124:netbios-ns 137/udp - 125:netbios-dgm 138/tcp # NETBIOS Datagram Service - 126:netbios-dgm 138/udp - 127:netbios-ssn 139/tcp # NETBIOS session service - 128:netbios-ssn 139/udp - - Shell > grep -n ^imap /etc/services - 129:imap 143/tcp imap2 # Interim Mail Access Proto v2 - 130:imap 143/udp imap2 - 168:imap3 220/tcp # Interactive Mail Access - 169:imap3 220/udp # Protocol v3 - 260:imaps 993/tcp # IMAP over SSL - 261:imaps 993/udp # IMAP over SSL - ``` - - In altre parole, i contenuti sopra visualizzati sono le righe dalla 123 alla 129 - - - Visualizza dalla riga in cui si trova la stringa fino all'ultima riga - - ```bash - Shell > cat /etc/services | sed -n '/^netbios/,$p' - ``` - - - Usare le variabili negli script bash - - ```bash - Shell > vim test1.sh - #!/bin/bash - a=10 - - sed -n ''${a}',$!p' /etc/services - # or - sed -n "${a},\$!p" /etc/services - ``` - - - Espressione regolare - - Abbina soltanto Tre "Digits" + "/udp". - - ```bash - Shell > cat /etc/services | sed -r -n '/[^0-9]([1-9]{3}\/udp)/p' - sunrpc 111/udp portmapper rpcbind # RPC 4.0 portmapper UDP - auth 113/udp authentication tap ident - sftp 115/udp - uucp-path 117/udp - nntp 119/udp readnews untp # USENET News Transfer Protocol - ntp 123/udp # Network Time Protocol - netbios-ns 137/udp - netbios-dgm 138/udp - netbios-ssn 139/udp - ... - ``` + - Visualizza le righe che iniziano con la stringa netbios + + ```bash + Shell > cat /etc/services | sed -n '/^netbios/p' + netbios-ns 137/tcp # NETBIOS Name Service + netbios-ns 137/udp + netbios-dgm 138/tcp # NETBIOS Datagram Service + netbios-dgm 138/udp + netbios-ssn 139/tcp # NETBIOS session service + netbios-ssn 139/udp + ``` + + !!! tip "Suggerimento" + + ``` + Come sappiamo bene, le virgolette doppie e singole in una shell ricoprono ruoli differenti. I caratteri **$**, **\`** e **\\** tra virgolette doppie hanno un significato speciale. Il consiglio è utilizzare le virgolette singole più spesso con il comando `sed`. + ``` + + - Visualizza il testo da riga 23 a riga 26 + + ```bash + Shell > cat -n /etc/services | sed -n '23,26p' + 23 tcpmux 1/tcp # TCP port service multiplexer + 24 tcpmux 1/udp # TCP port service multiplexer + 25 rje 5/tcp # Remote Job Entry + 26 rje 5/udp # Remote Job Entry + ``` + + - Visualizza solo le righe dispari + + ```bash + Shell > cat -n /etc/services | sed -n '1~2p' + 1 # /etc/services: + 3 # + 5 # IANA services version: last updated 2016-07-08 + 7 # Note that it is presently the policy of IANA to assign a single well-known + 9 # even if the protocol doesn't support UDP operations. + 11 # are included, only the more common ones. + 13 # The latest IANA port assignments can be gotten from + 15 # The Well Known Ports are those from 0 through 1023. + 17 # The Dynamic and/or Private Ports are those from 49152 through 65535 + 19 # Each line describes one service, and is of the form: + ... + ``` + + - Visualizza dalla riga 10 fino all'ultima riga + + ```bash + Shell > cat -n /etc/services | sed -n '10,$p' + 10 # Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports + 11 # are included, only the more common ones. + 12 # + 13 # The latest IANA port assignments can be gotten from + 14 # http://www.iana.org/assignments/port-numbers + 15 # The Well Known Ports are those from 0 through 1023. + 16 # The Registered Ports are those from 1024 through 49151 + 17 # The Dynamic and/or Private Ports are those from 49152 through 65535 + ... + ``` + + - Non visualizzare dalla riga 10 in poi + + ```bash + Shell > cat -n /etc/services | sed -n '10,$!p' + 1 # /etc/services: + 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ + 3 # + 4 # Network services, Internet style + 5 # IANA services version: last updated 2016-07-08 + 6 # + 7 # Note that it is presently the policy of IANA to assign a single well-known + 8 # port number for both TCP and UDP; hence, most entries here have two entries + 9 # even if the protocol doesn't support UDP operations. + ``` + + - Visualizza il numero di riga e il contenuto della stringa corrispondente + + ```bash + Shell > sed -n -e '/netbios/=' -e '/netbios/p' /etc/services + 123 + netbios-ns 137/tcp # NETBIOS Name Service + 124 + netbios-ns 137/udp + 125 + netbios-dgm 138/tcp # NETBIOS Datagram Service + 126 + netbios-dgm 138/udp + 127 + netbios-ssn 139/tcp # NETBIOS session service + 128 + netbios-ssn 139/udp + ``` + + - Trova le corrispondenze nell'elenco delle stringhe e lo visualizza + + Utilizzare la virgola per separare l'elenco delle stringhe di ricerca + + ```bash + Shell > cat /etc/services | sed -n '/^netbios/,/^imap/p' + netbios-ns 137/tcp # NETBIOS Name Service + netbios-ns 137/udp + netbios-dgm 138/tcp # NETBIOS Datagram Service + netbios-dgm 138/udp + netbios-ssn 139/tcp # NETBIOS session service + netbios-ssn 139/udp + imap 143/tcp imap2 # Interim Mail Access Proto v2 + ``` + + !!! info "Informazione" + + ``` + **Stringa iniziale**: Abbina la riga in cui si trova la stringa, mostrando solo la prima stringa che compare. + **Stringa finale**: Abbina la riga in cui si trova la stringa, mostrando solo la prima stringa che compare. + ``` + + ```bash + Shell > grep -n ^netbios /etc/services + 123:netbios-ns 137/tcp # NETBIOS Name Service + 124:netbios-ns 137/udp + 125:netbios-dgm 138/tcp # NETBIOS Datagram Service + 126:netbios-dgm 138/udp + 127:netbios-ssn 139/tcp # NETBIOS session service + 128:netbios-ssn 139/udp + + Shell > grep -n ^imap /etc/services + 129:imap 143/tcp imap2 # Interim Mail Access Proto v2 + 130:imap 143/udp imap2 + 168:imap3 220/tcp # Interactive Mail Access + 169:imap3 220/udp # Protocol v3 + 260:imaps 993/tcp # IMAP over SSL + 261:imaps 993/udp # IMAP over SSL + ``` + + In altre parole, i contenuti sopra visualizzati sono le righe dalla 123 alla 129 + + - Visualizza dalla riga in cui si trova la stringa fino all'ultima riga + + ```bash + Shell > cat /etc/services | sed -n '/^netbios/,$p' + ``` + + - Usare le variabili negli script bash + + ```bash + Shell > vim test1.sh + #!/bin/bash + a=10 + + sed -n ''${a}',$!p' /etc/services + # or + sed -n "${a},\$!p" /etc/services + ``` + + - Espressione regolare + + Abbina soltanto Tre "Digits" + "/udp". + + ```bash + Shell > cat /etc/services | sed -r -n '/[^0-9]([1-9]{3}\/udp)/p' + sunrpc 111/udp portmapper rpcbind # RPC 4.0 portmapper UDP + auth 113/udp authentication tap ident + sftp 115/udp + uucp-path 117/udp + nntp 119/udp readnews untp # USENET News Transfer Protocol + ntp 123/udp # Network Time Protocol + netbios-ns 137/udp + netbios-dgm 138/udp + netbios-ssn 139/udp + ... + ``` 2. Associa ed elimina (`d`) - È simile alla stampa, tranne per il fatto che il comando operation è sostituito da `d` e l'opzione -n non è richiesta. - - - Elimina tutte le righe corrispondenti alla stringa udp, ed elimina tutte le righe di commento o vuote - - ```bash - Shell > sed -e '/udp/d' -e '/^#/d' -e '/^$/d' /etc/services - tcpmux 1/tcp # TCP port service multiplexer - rje 5/tcp # Remote Job Entry - echo 7/tcp - discard 9/tcp sink null - systat 11/tcp users - daytime 13/tcp - qotd 17/tcp quote - chargen 19/tcp ttytst source - ftp-data 20/tcp - ftp 21/tcp - ssh 22/tcp # The Secure Shell (SSH) Protocol - telnet 23/tcp - ... - ``` - - - Elimina le righe successive a quella specificata - - ```bash - Shell > cat -n /etc/services | sed '10,$d' - 1 # /etc/services: - 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ - 3 # - 4 # Servizi di rete, stile di Internet - 5 # Versione dei servizi di IANA: ultimo aggiornamento 2016-07-08 - 6 # - 7 # Nota che al momento la politica di IANA assegna un singolo ben noto - 8 # numero di porta sia per TCP che UDP; dunque, la maggior parte delle voci, qui, contiene due elementi - 9 # anche se il protocollo non supporta le operazioni UDP. - ``` - - - Espressione regolare - - ```bash - Shell > cat /etc/services | sed -r '/(tcp)|(udp)|(^#)|(^$)/d' - http 80/sctp # HyperText Transfer Protocol - bgp 179/sctp - https 443/sctp # http protocol over TLS/SSL - h323hostcall 1720/sctp # H.323 Call Control - nfs 2049/sctp nfsd shilp # Network File System - rtmp 1/ddp # Routing Table Maintenance Protocol - nbp 2/ddp # Name Binding Protocol - echo 4/ddp # AppleTalk Echo Protocol - zip 6/ddp # Zone Information Protocol - discard 9/sctp # Discard - discard 9/dccp # Discard SC:DISC - ... - ``` + È simile alla stampa, tranne per il fatto che il comando operation è sostituito da `d` e l'opzione -n non è richiesta. + + - Elimina tutte le righe corrispondenti alla stringa udp, ed elimina tutte le righe di commento o vuote + + ```bash + Shell > sed -e '/udp/d' -e '/^#/d' -e '/^$/d' /etc/services + tcpmux 1/tcp # TCP port service multiplexer + rje 5/tcp # Remote Job Entry + echo 7/tcp + discard 9/tcp sink null + systat 11/tcp users + daytime 13/tcp + qotd 17/tcp quote + chargen 19/tcp ttytst source + ftp-data 20/tcp + ftp 21/tcp + ssh 22/tcp # The Secure Shell (SSH) Protocol + telnet 23/tcp + ... + ``` + + - Elimina le righe successive a quella specificata + + ```bash + Shell > cat -n /etc/services | sed '10,$d' + 1 # /etc/services: + 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ + 3 # + 4 # Servizi di rete, stile di Internet + 5 # Versione dei servizi di IANA: ultimo aggiornamento 2016-07-08 + 6 # + 7 # Nota che al momento la politica di IANA assegna un singolo ben noto + 8 # numero di porta sia per TCP che UDP; dunque, la maggior parte delle voci, qui, contiene due elementi + 9 # anche se il protocollo non supporta le operazioni UDP. + ``` + + - Espressione regolare + + ```bash + Shell > cat /etc/services | sed -r '/(tcp)|(udp)|(^#)|(^$)/d' + http 80/sctp # HyperText Transfer Protocol + bgp 179/sctp + https 443/sctp # http protocol over TLS/SSL + h323hostcall 1720/sctp # H.323 Call Control + nfs 2049/sctp nfsd shilp # Network File System + rtmp 1/ddp # Routing Table Maintenance Protocol + nbp 2/ddp # Name Binding Protocol + echo 4/ddp # AppleTalk Echo Protocol + zip 6/ddp # Zone Information Protocol + discard 9/sctp # Discard + discard 9/dccp # Discard SC:DISC + ... + ``` 3. Sostituire stringhe (`s///g`) - | Sintassi | Descrizione della sintassi | - | :---------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | `sed 's/string/replace/g' FILENAME` | **s**: Tutte le righe da considerare nel file. Si può anche specificare un intervallo di righe, ad esempio: `sed '20,200s/netbios/TMP/g' /etc/services. **g** (globale): Se non c'è g, significa che quando più stringhe corrispondenti appaiono su una singola riga, viene sostituita solo la prima stringa corrispondente. **/**: Stile delimitatore. Si possono anche specificare altri stili, ad esempio:`sed '20,200s?netbios?TMP?g' /etc/services\` | - - !!! tip "Suggerimento" - - ```` - Esempio nello script bash: - - ```bash - Shell > vim /root/sedReplace.sh - #!/bin/bash - a="SELINUX=enforcing" - b="SELINUX=disabled" - - sed -i 's/'${a}'/'${b}'/g' /etc/selinux/config - # or - sed -i "s/${a}/${b}/g" /etc/selinux/config - ``` - ```` - - - Sostituisci e visualizza - - ```bash - Shell > sed -n '44,45s/ssh/SSH/gp' /etc/services - SSH 22/tcp - SSH 22/udp - ``` - - - Si utilizza il simbolo "&" come riferimento a una stringa - - ```bash - Shell > sed -n '44,45s/ssh/&-SSH/gp' /etc/services - ssh-SSH 22/tcp - ssh-SSH 22/udp - ``` - - - Utilizza una stringa per individuare una o più righe e sostituire la stringa specificata entro l'intervallo di righe - - ```bash - Shell > grep ssh /etc/services -n - 44:ssh 22/tcp # The Secure Shell (SSH) Protocol - 45:ssh 22/udp # The Secure Shell (SSH) Protocol - 551:x11-ssh-offset 6010/tcp # SSH X11 forwarding offset - 593:ssh 22/sctp # SSH - 1351:sshell 614/tcp # SSLshell - 1352:sshell 614/udp # SSLshell - 1607:netconf-ssh 830/tcp # NETCONF over SSH - 1608:netconf-ssh 830/udp # NETCONF over SSH - 7178:sdo-ssh 3897/tcp # Simple Distributed Objects over SSH - 7179:sdo-ssh 3897/udp # Simple Distributed Objects over SSH - 7791:netconf-ch-ssh 4334/tcp # NETCONF Call Home (SSH) - 8473:snmpssh 5161/tcp # SNMP over SSH Transport Model - 8474:snmpssh-trap 5162/tcp # SNMP Notification over SSH Transport Model - 9126:tl1-ssh 6252/tcp # TL1 over SSH - 9127:tl1-ssh 6252/udp # TL1 over SSH - 10796:ssh-mgmt 17235/tcp # SSH Tectia Manager - 10797:ssh-mgmt 17235/udp # SSH Tectia Manager - - Shell > sed '/ssh/s/tcp/TCP/gp' -n /etc/services - ssh 22/TCP # The Secure Shell (SSH) Protocol - x11-ssh-offset 6010/TCP # SSH X11 forwarding offset - sshell 614/TCP # SSLshell - netconf-ssh 830/TCP # NETCONF over SSH - sdo-ssh 3897/TCP # Simple Distributed Objects over SSH - netconf-ch-ssh 4334/TCP # NETCONF Call Home (SSH) - snmpssh 5161/TCP # SNMP over SSH Transport Model - snmpssh-trap 5162/TCP # SNMP Notification over SSH Transport Model - tl1-ssh 6252/TCP # TL1 over SSH - ssh-mgmt 17235/TCP # SSH Tectia Manager - ``` - - - Sostituire una stringa per righe consecutive - - ```bash - Shell > sed '10,30s/tcp/TCP/g' /etc/services - ``` - - - Impostare più match e sostituzioni - - ```bash - Shell > cat /etc/services | sed 's/netbios/test1/g ; s/^#//d ; s/dhcp/&t2/g' - ``` - - - Sostituzione di gruppo con espressioni regolari - - Nelle espressioni regolari, ogni "()" è un raggruppamento. \1 rappresenta il riferimento al gruppo 1, \2 rappresenta il riferimento al gruppo 2, e così via. - - ```bash - Shell > cat /etc/services - ... - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > cat /etc/services | sed -r 's/([0-9]*\/tcp)/\1\tCONTENT1/g ; s/([0-9]*\/udp)/\1\tADD2/g' - ... - axio-disc 35100/tcp CONTENT1 # Axiomatic discovery protocol - axio-disc 35100/udp ADD2 # Axiomatic discovery protocol - pmwebapi 44323/tcp CONTENT1 # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp ADD2 # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp CONTENT1 # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp CONTENT1 # Capture handwritten signatures - ``` - - **\t**: è il carattere di tabulazione - - - Sostituisce tutte le righe di commento con il carattere blank space - - ```bash - Shell > cat /etc/services | sed -r 's/(^#.*)//g' - ... - chargen 19/udp ttytst source - ftp-data 20/tcp - ftp-data 20/udp - - ftp 21/tcp - ftp 21/udp fsp fspd - ssh 22/tcp # The Secure Shell (SSH) Protocol - ssh 22/udp # The Secure Shell (SSH) Protocol - ... - ``` - - - Sostituire un carattere alfabetico in minuscolo in maiuscolo - - ```bash - Shell > echo -e "hello,world\nPOSIX" | sed -r 's/(.*)w/\1W/g' - hello,World - POSIX - ``` - - - Scambiare di posizione le stringhe - - ```bash - Shell > cat /etc/services - ... - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` - - Possiamo strutturare le righe del file in cinque parti: - - ```txt - cloudcheck-ping 45514 / udp # ASSIA CloudCheck WiFi Management keepalive - ↓ ↓ ↓ ↓ ↓ - (.*) (\<[0-9]+\>) \/ (tcp|udp) (.*) - ↓ ↓ ↓ ↓ - \1 \2 \3 \4 - ``` - - ```bash - Shell > cat /etc/services | sed -r 's/(.*)(\<[0-9]+\>)\/(tcp|udp)(.*)/\1\3\/\2\4/g' - ... - edi_service udp/34567 # dhanalakshmi.org EDI Service - axio-disc tcp/35100 # Axiomatic discovery protocol - axio-disc udp/35100 # Axiomatic discovery protocol - pmwebapi tcp/44323 # Performance Co-Pilot client HTTP API - cloudcheck-ping udp/45514 # ASSIA CloudCheck WiFi Management keepalive - cloudcheck tcp/45514 # ASSIA CloudCheck WiFi Management System - spremotetablet tcp/46998 # Capture handwritten signatures - ``` - - - Rimuovere tutti i spazi - - ```bash - Shell > echo -e "abcd\t1 2 3 4\tWorld" - abcd 1 2 3 4 World - Shell > echo -e "abcd\t1 2 3 4\tWorld" | sed -r 's/(\s)*//g' - abcd1234World - ``` + | Sintassi | Descrizione della sintassi | + | :---------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | `sed 's/string/replace/g' FILENAME` | **s**: Tutte le righe da considerare nel file. Si può anche specificare un intervallo di righe, ad esempio: `sed '20,200s/netbios/TMP/g' /etc/services. **g** (globale): Se non c'è g, significa che quando più stringhe corrispondenti appaiono su una singola riga, viene sostituita solo la prima stringa corrispondente. **/**: Stile delimitatore. Si possono anche specificare altri stili, ad esempio:`sed '20,200s?netbios?TMP?g' /etc/services\` | + + !!! tip "Suggerimento" + + ```` + Esempio nello script bash: + + ```bash + Shell > vim /root/sedReplace.sh + #!/bin/bash + a="SELINUX=enforcing" + b="SELINUX=disabled" + + sed -i 's/'${a}'/'${b}'/g' /etc/selinux/config + # or + sed -i "s/${a}/${b}/g" /etc/selinux/config + ``` + ```` + + - Sostituisci e visualizza + + ```bash + Shell > sed -n '44,45s/ssh/SSH/gp' /etc/services + SSH 22/tcp + SSH 22/udp + ``` + + - Si utilizza il simbolo "&" come riferimento a una stringa + + ```bash + Shell > sed -n '44,45s/ssh/&-SSH/gp' /etc/services + ssh-SSH 22/tcp + ssh-SSH 22/udp + ``` + + - Utilizza una stringa per individuare una o più righe e sostituire la stringa specificata entro l'intervallo di righe + + ```bash + Shell > grep ssh /etc/services -n + 44:ssh 22/tcp # The Secure Shell (SSH) Protocol + 45:ssh 22/udp # The Secure Shell (SSH) Protocol + 551:x11-ssh-offset 6010/tcp # SSH X11 forwarding offset + 593:ssh 22/sctp # SSH + 1351:sshell 614/tcp # SSLshell + 1352:sshell 614/udp # SSLshell + 1607:netconf-ssh 830/tcp # NETCONF over SSH + 1608:netconf-ssh 830/udp # NETCONF over SSH + 7178:sdo-ssh 3897/tcp # Simple Distributed Objects over SSH + 7179:sdo-ssh 3897/udp # Simple Distributed Objects over SSH + 7791:netconf-ch-ssh 4334/tcp # NETCONF Call Home (SSH) + 8473:snmpssh 5161/tcp # SNMP over SSH Transport Model + 8474:snmpssh-trap 5162/tcp # SNMP Notification over SSH Transport Model + 9126:tl1-ssh 6252/tcp # TL1 over SSH + 9127:tl1-ssh 6252/udp # TL1 over SSH + 10796:ssh-mgmt 17235/tcp # SSH Tectia Manager + 10797:ssh-mgmt 17235/udp # SSH Tectia Manager + + Shell > sed '/ssh/s/tcp/TCP/gp' -n /etc/services + ssh 22/TCP # The Secure Shell (SSH) Protocol + x11-ssh-offset 6010/TCP # SSH X11 forwarding offset + sshell 614/TCP # SSLshell + netconf-ssh 830/TCP # NETCONF over SSH + sdo-ssh 3897/TCP # Simple Distributed Objects over SSH + netconf-ch-ssh 4334/TCP # NETCONF Call Home (SSH) + snmpssh 5161/TCP # SNMP over SSH Transport Model + snmpssh-trap 5162/TCP # SNMP Notification over SSH Transport Model + tl1-ssh 6252/TCP # TL1 over SSH + ssh-mgmt 17235/TCP # SSH Tectia Manager + ``` + + - Sostituire una stringa per righe consecutive + + ```bash + Shell > sed '10,30s/tcp/TCP/g' /etc/services + ``` + + - Impostare più match e sostituzioni + + ```bash + Shell > cat /etc/services | sed 's/netbios/test1/g ; s/^#//d ; s/dhcp/&t2/g' + ``` + + - Sostituzione di gruppo con espressioni regolari + + Nelle espressioni regolari, ogni "()" è un raggruppamento. \1 rappresenta il riferimento al gruppo 1, \2 rappresenta il riferimento al gruppo 2, e così via. + + ```bash + Shell > cat /etc/services + ... + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + + Shell > cat /etc/services | sed -r 's/([0-9]*\/tcp)/\1\tCONTENT1/g ; s/([0-9]*\/udp)/\1\tADD2/g' + ... + axio-disc 35100/tcp CONTENT1 # Axiomatic discovery protocol + axio-disc 35100/udp ADD2 # Axiomatic discovery protocol + pmwebapi 44323/tcp CONTENT1 # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp ADD2 # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp CONTENT1 # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp CONTENT1 # Capture handwritten signatures + ``` + + **\t**: è il carattere di tabulazione + + - Sostituisce tutte le righe di commento con il carattere blank space + + ```bash + Shell > cat /etc/services | sed -r 's/(^#.*)//g' + ... + chargen 19/udp ttytst source + ftp-data 20/tcp + ftp-data 20/udp + + ftp 21/tcp + ftp 21/udp fsp fspd + ssh 22/tcp # The Secure Shell (SSH) Protocol + ssh 22/udp # The Secure Shell (SSH) Protocol + ... + ``` + + - Sostituire un carattere alfabetico in minuscolo in maiuscolo + + ```bash + Shell > echo -e "hello,world\nPOSIX" | sed -r 's/(.*)w/\1W/g' + hello,World + POSIX + ``` + + - Scambiare di posizione le stringhe + + ```bash + Shell > cat /etc/services + ... + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + Possiamo strutturare le righe del file in cinque parti: + + ```txt + cloudcheck-ping 45514 / udp # ASSIA CloudCheck WiFi Management keepalive + ↓ ↓ ↓ ↓ ↓ + (.*) (\<[0-9]+\>) \/ (tcp|udp) (.*) + ↓ ↓ ↓ ↓ + \1 \2 \3 \4 + ``` + + ```bash + Shell > cat /etc/services | sed -r 's/(.*)(\<[0-9]+\>)\/(tcp|udp)(.*)/\1\3\/\2\4/g' + ... + edi_service udp/34567 # dhanalakshmi.org EDI Service + axio-disc tcp/35100 # Axiomatic discovery protocol + axio-disc udp/35100 # Axiomatic discovery protocol + pmwebapi tcp/44323 # Performance Co-Pilot client HTTP API + cloudcheck-ping udp/45514 # ASSIA CloudCheck WiFi Management keepalive + cloudcheck tcp/45514 # ASSIA CloudCheck WiFi Management System + spremotetablet tcp/46998 # Capture handwritten signatures + ``` + + - Rimuovere tutti i spazi + + ```bash + Shell > echo -e "abcd\t1 2 3 4\tWorld" + abcd 1 2 3 4 World + Shell > echo -e "abcd\t1 2 3 4\tWorld" | sed -r 's/(\s)*//g' + abcd1234World + ``` 4. Eseguire più volte seq utilizzando l'opzione -e - Nell'esempio seguente: - - ```bash - Shell > tail -n 10 /etc/services - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > tail -n 10 /etc/services | sed -e '1,3d' -e '/cloud/s/ping/PING/g' - # or - Shell > tail -n 10 /etc/services | sed '1,3d ; /cloud/s/ping/PING/g' - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-PING 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` - -5. Aggiungere contenuti sopra o sotto una certa riga (`i` e `a`) - - - Aggiungi due righe sopra la riga specificata dal numero di riga + Nell'esempio seguente: ```bash - Shell > tail -n 10 /etc/services > /root/test.txt - Shell > cat /root/test.txt + Shell > tail -n 10 /etc/services aigairserver 21221/tcp # Services for Air Server ka-kdp 31016/udp # Kollective Agent Kollective Delivery ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery @@ -519,318 +489,348 @@ sed [OPTION]... {script-only-if-no-other-script} [input-file]... cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System spremotetablet 46998/tcp # Capture handwritten signatures - Shell > cat /root/test.txt | sed '3i 123\ - abc' - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - 123 - abc - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + Shell > tail -n 10 /etc/services | sed -e '1,3d' -e '/cloud/s/ping/PING/g' + # or + Shell > tail -n 10 /etc/services | sed '1,3d ; /cloud/s/ping/PING/g' edi_service 34567/udp # dhanalakshmi.org EDI Service axio-disc 35100/tcp # Axiomatic discovery protocol axio-disc 35100/udp # Axiomatic discovery protocol pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck-PING 45514/udp # ASSIA CloudCheck WiFi Management keepalive cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System spremotetablet 46998/tcp # Capture handwritten signatures ``` - - Aggiungere tre righe sotto la riga specificata dal numero - - ```bash - Shell > cat /root/test.txt | sed '5a 123\ - comment yes\ - tcp or udp' - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - 123 - comment yes - tcp or udp - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` - - - Trovare le righe che contengono una stringa e aggiungere 2 righe di testo sopra ognuna +5. Aggiungere contenuti sopra o sotto una certa riga (`i` e `a`) - ```bash - Shell > cat /root/test.txt | sed '/tcp/iTCP\ - UDP' - TCP - UDP + - Aggiungi due righe sopra la riga specificata dal numero di riga + + ```bash + Shell > tail -n 10 /etc/services > /root/test.txt + Shell > cat /root/test.txt + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + + Shell > cat /root/test.txt | sed '3i 123\ + abc' + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + 123 + abc + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + - Aggiungere tre righe sotto la riga specificata dal numero + + ```bash + Shell > cat /root/test.txt | sed '5a 123\ + comment yes\ + tcp or udp' aigairserver 21221/tcp # Services for Air Server ka-kdp 31016/udp # Kollective Agent Kollective Delivery - TCP - UDP ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery edi_service 34567/udp # dhanalakshmi.org EDI Service - TCP - UDP axio-disc 35100/tcp # Axiomatic discovery protocol + 123 + comment yes + tcp or udp axio-disc 35100/udp # Axiomatic discovery protocol - TCP - UDP pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - TCP - UDP cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - TCP - UDP spremotetablet 46998/tcp # Capture handwritten signatures ``` -6. Sostituire righe (\`c) + - Trovare le righe che contengono una stringa e aggiungere 2 righe di testo sopra ognuna + + ```bash + Shell > cat /root/test.txt | sed '/tcp/iTCP\ + UDP' + TCP + UDP + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + TCP + UDP + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + TCP + UDP + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + TCP + UDP + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + TCP + UDP + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + TCP + UDP + spremotetablet 46998/tcp # Capture handwritten signatures + ``` - - Individua una o più righe contenenti una stringa e sostituire con righe di testo +6. Sostituire righe (\`c) - ```bash - Shell > cat /root/test.txt | sed '/ser/c\TMP1 \ - TMP2' - TMP1 - TMP2 - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - TMP1 - TMP2 - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` + - Individua una o più righe contenenti una stringa e sostituire con righe di testo + + ```bash + Shell > cat /root/test.txt | sed '/ser/c\TMP1 \ + TMP2' + TMP1 + TMP2 + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + TMP1 + TMP2 + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + - Sostituire una singola riga + + ```bash + Shell > cat /root/test.txt | sed '7c REPLACE' + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + REPLACE + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + - Sostituire righe consecutive di testo + + ```bash + Shell > cat /root/test.txt | sed '2,$c REPLACE1 \ + replace2' + aigairserver 21221/tcp # Services for Air Server + REPLACE1 + replace2 + ``` + + - Sostituire tutte le righe di posizione pari + + ```bash + Shell > cat /root/test.txt | sed '2~2c replace' + aigairserver 21221/tcp # Services for Air Server + replace + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + replace + axio-disc 35100/tcp # Axiomatic discovery protocol + replace + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + replace + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + replace + ``` - - Sostituire una singola riga +7. Leggere le righe del file e aggiungere del testo sotto la riga corrispondente (`r`) ```bash - Shell > cat /root/test.txt | sed '7c REPLACE' + Shell > cat /root/app.txt + append1 + POSIX + UNIX + + Shell > cat /root/test.txt | sed '/ping/r /root/app.txt' aigairserver 21221/tcp # Services for Air Server ka-kdp 31016/udp # Kollective Agent Kollective Delivery ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery edi_service 34567/udp # dhanalakshmi.org EDI Service axio-disc 35100/tcp # Axiomatic discovery protocol axio-disc 35100/udp # Axiomatic discovery protocol - REPLACE + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + append1 + POSIX + UNIX cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System spremotetablet 46998/tcp # Capture handwritten signatures ``` - - Sostituire righe consecutive di testo - - ```bash - Shell > cat /root/test.txt | sed '2,$c REPLACE1 \ - replace2' - aigairserver 21221/tcp # Services for Air Server - REPLACE1 - replace2 - ``` - - - Sostituire tutte le righe di posizione pari - - ```bash - Shell > cat /root/test.txt | sed '2~2c replace' - aigairserver 21221/tcp # Services for Air Server - replace - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - replace - axio-disc 35100/tcp # Axiomatic discovery protocol - replace - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - replace - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - replace - ``` - -7. Leggere le righe del file e aggiungere del testo sotto la riga corrispondente (`r`) - - ```bash - Shell > cat /root/app.txt - append1 - POSIX - UNIX - - Shell > cat /root/test.txt | sed '/ping/r /root/app.txt' - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - append1 - POSIX - UNIX - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` - 8. Trascrivere le righe con un match in un altro file (`w`) - ```bash - Shell > cat /root/test.txt | sed '/axio/w /root/storage.txt' - - Shell > cat /root/storage.txt - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - ``` - -9. Leggere/aggiungere la riga successiva di input nel "pattern space"(`n` e `N`) - - - Visualizza la riga successiva alla riga trovata - ```bash - Shell > cat /root/test.txt - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service + Shell > cat /root/test.txt | sed '/axio/w /root/storage.txt' + + Shell > cat /root/storage.txt axio-disc 35100/tcp # Axiomatic discovery protocol axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > cat /root/test.txt | sed '/ping/{n;p}' -n - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System ``` - !!! tip "Suggerimento" - - ``` - Più comandi `sed` potrebbero influenzarsi a vicenda, per ridurre questa eventualità utilizzare "**{ }**". - ``` - - - Visualizzare righe di testo pari +9. Leggere/aggiungere la riga successiva di input nel "pattern space"(`n` e `N`) - Prima, legge la prima riga, essendo presente un comando `n`, la seconda riga sarà visualizzata, e così via. + - Visualizza la riga successiva alla riga trovata + + ```bash + Shell > cat /root/test.txt + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + + Shell > cat /root/test.txt | sed '/ping/{n;p}' -n + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + ``` + + !!! tip "Suggerimento" + + ``` + Più comandi `sed` potrebbero influenzarsi a vicenda, per ridurre questa eventualità utilizzare "**{ }**". + ``` + + - Visualizzare righe di testo pari + + Prima, legge la prima riga, essendo presente un comando `n`, la seconda riga sarà visualizzata, e così via. + + ```bash + Shell > cat -n /root/test.txt | sed -n '{n;p}' + # or + Shell > cat -n /root/test.txt | sed -n '2~2p' + 2 ka-kdp 31016/udp # Kollective Agent Kollective Delivery + 4 edi_service 34567/udp # dhanalakshmi.org EDI Service + 6 axio-disc 35100/udp # Axiomatic discovery protocol + 8 cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + 10 spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + - Visualizza righe di testo dispari + + ```bash + Shell > cat -n /root/test.txt | sed -n '{p;n}' + # or + Shell > cat -n /root/test.txt | sed -n '1~2p' + # or + Shell > cat -n /root/test.txt | sed 'n;d' + 1 aigairserver 21221/tcp # Services for Air Server + 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + 5 axio-disc 35100/tcp # Axiomatic discovery protocol + 7 pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + ``` + + - Visualizza le righe multiple di 3 + + ```bash + Shell > cat -n /root/test.txt | sed -n '{n;n;p}' + # or + Shell > cat -n /root/test.txt | sed -n '3~3p' + 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + 6 axio-disc 35100/udp # Axiomatic discovery protocol + 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + ``` + + - `N` + + Legge la prima riga e aggiungi una riga dopo aver incontrato il comando `N`. In questo esempio, il "pattern space" è "1\n2". Infine, esegue il comando `q` per uscire. + + ```bash + Shell > seq 1 10 | sed 'N;q' + 1 + 2 + ``` + + Poiché non è presente alcuna riga dopo la riga 9, il risultato sarà il seguente: + + ```bash + Shell > seq 1 9 | sed -n 'N;p' + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + ``` + + Quando l'ultima riga viene letta, il comando `N` non viene eseguito e il risultato è il seguente: + + ```bash + Shell > seq 1 9 | sed -n '$!N;p' + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + ``` + + Unire due righe in una. Sostituisce "\n" del "pattern space" con un carattere vuoto. + + ```bash + Shell > seq 1 6 | sed 'N;{s/\n//g}' + 12 + 34 + 56 + ``` - ```bash - Shell > cat -n /root/test.txt | sed -n '{n;p}' - # or - Shell > cat -n /root/test.txt | sed -n '2~2p' - 2 ka-kdp 31016/udp # Kollective Agent Kollective Delivery - 4 edi_service 34567/udp # dhanalakshmi.org EDI Service - 6 axio-disc 35100/udp # Axiomatic discovery protocol - 8 cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - 10 spremotetablet 46998/tcp # Capture handwritten signatures - ``` +10. Ignorare un caso (`I`) - - Visualizza righe di testo dispari + Sembra non esser presente alcuna informazione in merito all'ignorare casi in `man 1 sed`. ```bash - Shell > cat -n /root/test.txt | sed -n '{p;n}' - # or - Shell > cat -n /root/test.txt | sed -n '1~2p' - # or - Shell > cat -n /root/test.txt | sed 'n;d' - 1 aigairserver 21221/tcp # Services for Air Server - 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - 5 axio-disc 35100/tcp # Axiomatic discovery protocol - 7 pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + Shell > echo -e "abc\nAbc" | sed -n 's/a/X/Igp' + Xbc + XBC ``` - - Visualizza le righe multiple di 3 - ```bash - Shell > cat -n /root/test.txt | sed -n '{n;n;p}' - # or - Shell > cat -n /root/test.txt | sed -n '3~3p' - 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - 6 axio-disc 35100/udp # Axiomatic discovery protocol - 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + Shell > cat /etc/services | sed '/OEM/Ip' -n + oem-agent 3872/tcp # OEM Agent + oem-agent 3872/udp # OEM Agent + oemcacao-jmxmp 11172/tcp # OEM cacao JMX-remoting access point + oemcacao-rmi 11174/tcp # OEM cacao rmi registry access point + oemcacao-websvc 11175/tcp # OEM cacao web service access point ``` - - `N` - - Legge la prima riga e aggiungi una riga dopo aver incontrato il comando `N`. In questo esempio, il "pattern space" è "1\n2". Infine, esegue il comando `q` per uscire. - ```bash - Shell > seq 1 10 | sed 'N;q' - 1 - 2 + Shell > cat /etc/services | sed -r '/(TCP)|(UDP)/Id' ``` - Poiché non è presente alcuna riga dopo la riga 9, il risultato sarà il seguente: - ```bash - Shell > seq 1 9 | sed -n 'N;p' - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 + Shell > cat /etc/services | sed -r '/(TCP)|(UDP)/Ic TMP' ``` - Quando l'ultima riga viene letta, il comando `N` non viene eseguito e il risultato è il seguente: +11. Calcola il numero totale di righe in un file ```bash - Shell > seq 1 9 | sed -n '$!N;p' - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - ``` - - Unire due righe in una. Sostituisce "\n" del "pattern space" con un carattere vuoto. + Shell > cat /etc/services | sed -n '$=' + # or + Shell > cat /etc/services | wc -l - ```bash - Shell > seq 1 6 | sed 'N;{s/\n//g}' - 12 - 34 - 56 + 11473 ``` - -10. Ignorare un caso (`I`) - - Sembra non esser presente alcuna informazione in merito all'ignorare casi in `man 1 sed`. - - ```bash - Shell > echo -e "abc\nAbc" | sed -n 's/a/X/Igp' - Xbc - XBC - ``` - - ```bash - Shell > cat /etc/services | sed '/OEM/Ip' -n - oem-agent 3872/tcp # OEM Agent - oem-agent 3872/udp # OEM Agent - oemcacao-jmxmp 11172/tcp # OEM cacao JMX-remoting access point - oemcacao-rmi 11174/tcp # OEM cacao rmi registry access point - oemcacao-websvc 11175/tcp # OEM cacao web service access point - ``` - - ```bash - Shell > cat /etc/services | sed -r '/(TCP)|(UDP)/Id' - ``` - - ```bash - Shell > cat /etc/services | sed -r '/(TCP)|(UDP)/Ic TMP' - ``` - -11. Calcola il numero totale di righe in un file - - ```bash - Shell > cat /etc/services | sed -n '$=' - # or - Shell > cat /etc/services | wc -l - - 11473 - ``` diff --git a/docs/books/sed_awk_grep/3_sed_command.uk.md b/docs/books/sed_awk_grep/3_sed_command.uk.md index 1726827043..2d0bf46f36 100644 --- a/docs/books/sed_awk_grep/3_sed_command.uk.md +++ b/docs/books/sed_awk_grep/3_sed_command.uk.md @@ -1,7 +1,7 @@ --- title: Команда Sed author: tianci li -contributors: null +contributors: tags: - sed --- @@ -68,446 +68,416 @@ sed [OPTION]... {script-only-if-no-other-script} [input-file]... 1. Зіставлення та друк (`p`) - - Надрукуйте рядок, який починається з рядка NetBIOS - - ```bash - Shell > cat /etc/services | sed -n '/^netbios/p' - netbios-ns 137/tcp # NETBIOS Name Service - netbios-ns 137/udp - netbios-dgm 138/tcp # NETBIOS Datagram Service - netbios-dgm 138/udp - netbios-ssn 139/tcp # NETBIOS session service - netbios-ssn 139/udp - ``` - - !!! tip "Підказка" - - ``` - Як ми всі знаємо, подвійні та одинарні лапки в оболонці відіграють різну роль. **$**, **\`** і **\\** у подвійних лапках мають особливе значення. Рекомендовано використовувати одинарні лапки частіше під час використання команди `sed`. - ``` - - - Вивести текст з 23 по 26 рядки - - ```bash - Shell > cat -n /etc/services | sed -n '23,26p' - 23 tcpmux 1/tcp # TCP port service multiplexer - 24 tcpmux 1/udp # TCP port service multiplexer - 25 rje 5/tcp # Remote Job Entry - 26 rje 5/udp # Remote Job Entry - ``` - - - Друкувати непарні рядки - - ```bash - Shell > cat -n /etc/services | sed -n '1~2p' - 1 # /etc/services: - 3 # - 5 # IANA services version: last updated 2016-07-08 - 7 # Note that it is presently the policy of IANA to assign a single well-known - 9 # even if the protocol doesn't support UDP operations. - 11 # are included, only the more common ones. - 13 # The latest IANA port assignments can be gotten from - 15 # The Well Known Ports are those from 0 through 1023. - 17 # The Dynamic and/or Private Ports are those from 49152 through 65535 - 19 # Each line describes one service, and is of the form: - ... - ``` - - - Вивести рядок 10 до останнього рядка - - ```bash - Shell > cat -n /etc/services | sed -n '10,$p' - 10 # Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports - 11 # are included, only the more common ones. - 12 # - 13 # The latest IANA port assignments can be gotten from - 14 # http://www.iana.org/assignments/port-numbers - 15 # The Well Known Ports are those from 0 through 1023. - 16 # The Registered Ports are those from 1024 through 49151 - 17 # The Dynamic and/or Private Ports are those from 49152 through 65535 - ... - ``` - - - Рядки з 10 до останнього не друкувати - - ```bash - Shell > cat -n /etc/services | sed -n '10,$!p' - 1 # /etc/services: - 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ - 3 # - 4 # Network services, Internet style - 5 # IANA services version: last updated 2016-07-08 - 6 # - 7 # Note that it is presently the policy of IANA to assign a single well-known - 8 # port number for both TCP and UDP; hence, most entries here have two entries - 9 # even if the protocol doesn't support UDP operations. - ``` - - - Надрукуйте номер рядка та вміст відповідного рядка - - ```bash - Shell > sed -n -e '/netbios/=' -e '/netbios/p' /etc/services - 123 - netbios-ns 137/tcp # NETBIOS Name Service - 124 - netbios-ns 137/udp - 125 - netbios-dgm 138/tcp # NETBIOS Datagram Service - 126 - netbios-dgm 138/udp - 127 - netbios-ssn 139/tcp # NETBIOS session service - 128 - netbios-ssn 139/udp - ``` - - - Зіставте діапазон рядків і надрукуйте його - - Використовуйте коми для розділення діапазонів рядків - - ```bash - Shell > cat /etc/services | sed -n '/^netbios/,/^imap/p' - netbios-ns 137/tcp # NETBIOS Name Service - netbios-ns 137/udp - netbios-dgm 138/tcp # NETBIOS Datagram Service - netbios-dgm 138/udp - netbios-ssn 139/tcp # NETBIOS session service - netbios-ssn 139/udp - imap 143/tcp imap2 # Interim Mail Access Proto v2 - ``` - - !!! info "примітка" - - ``` - **Початок діапазону**: відповідність рядку, де розташований рядок, лише збігання з першим рядком, який з’являється. - **Кінець діапазону**: збігається з рядком, у якому розташований рядок, лише з першим рядком, який з’являється. - ``` - - ```bash - Shell > grep -n ^netbios /etc/services - 123:netbios-ns 137/tcp # NETBIOS Name Service - 124:netbios-ns 137/udp - 125:netbios-dgm 138/tcp # NETBIOS Datagram Service - 126:netbios-dgm 138/udp - 127:netbios-ssn 139/tcp # NETBIOS session service - 128:netbios-ssn 139/udp - - Shell > grep -n ^imap /etc/services - 129:imap 143/tcp imap2 # Interim Mail Access Proto v2 - 130:imap 143/udp imap2 - 168:imap3 220/tcp # Interactive Mail Access - 169:imap3 220/udp # Protocol v3 - 260:imaps 993/tcp # IMAP over SSL - 261:imaps 993/udp # IMAP over SSL - ``` - - Іншими словами, вміст, надрукований вище, це рядки з 123 по 129 - - - Надрукуйте рядок, де знаходиться рядок, і до останнього рядка - - ```bash - Shell > cat /etc/services | sed -n '/^netbios/,$p' - ``` - - - Використання змінних у сценаріях bash - - ```bash - Shell > vim test1.sh - #!/bin/bash - a=10 - - sed -n ''${a}',$!p' /etc/services - # or - sed -n "${a},\$!p" /etc/services - ``` - - - Регулярний вираз - - Відповідає лише "Три цифри" + "/udp". - - ```bash - Shell > cat /etc/services | sed -r -n '/[^0-9]([1-9]{3}\/udp)/p' - sunrpc 111/udp portmapper rpcbind # RPC 4.0 portmapper UDP - auth 113/udp authentication tap ident - sftp 115/udp - uucp-path 117/udp - nntp 119/udp readnews untp # USENET News Transfer Protocol - ntp 123/udp # Network Time Protocol - netbios-ns 137/udp - netbios-dgm 138/udp - netbios-ssn 139/udp - ... - ``` + - Надрукуйте рядок, який починається з рядка NetBIOS + + ```bash + Shell > cat /etc/services | sed -n '/^netbios/p' + netbios-ns 137/tcp # NETBIOS Name Service + netbios-ns 137/udp + netbios-dgm 138/tcp # NETBIOS Datagram Service + netbios-dgm 138/udp + netbios-ssn 139/tcp # NETBIOS session service + netbios-ssn 139/udp + ``` + + !!! tip "Підказка" + + ``` + Як ми всі знаємо, подвійні та одинарні лапки в оболонці відіграють різну роль. **$**, **\`** і **\\** у подвійних лапках мають особливе значення. Рекомендовано використовувати одинарні лапки частіше під час використання команди `sed`. + ``` + + - Вивести текст з 23 по 26 рядки + + ```bash + Shell > cat -n /etc/services | sed -n '23,26p' + 23 tcpmux 1/tcp # TCP port service multiplexer + 24 tcpmux 1/udp # TCP port service multiplexer + 25 rje 5/tcp # Remote Job Entry + 26 rje 5/udp # Remote Job Entry + ``` + + - Друкувати непарні рядки + + ```bash + Shell > cat -n /etc/services | sed -n '1~2p' + 1 # /etc/services: + 3 # + 5 # IANA services version: last updated 2016-07-08 + 7 # Note that it is presently the policy of IANA to assign a single well-known + 9 # even if the protocol doesn't support UDP operations. + 11 # are included, only the more common ones. + 13 # The latest IANA port assignments can be gotten from + 15 # The Well Known Ports are those from 0 through 1023. + 17 # The Dynamic and/or Private Ports are those from 49152 through 65535 + 19 # Each line describes one service, and is of the form: + ... + ``` + + - Вивести рядок 10 до останнього рядка + + ```bash + Shell > cat -n /etc/services | sed -n '10,$p' + 10 # Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports + 11 # are included, only the more common ones. + 12 # + 13 # The latest IANA port assignments can be gotten from + 14 # http://www.iana.org/assignments/port-numbers + 15 # The Well Known Ports are those from 0 through 1023. + 16 # The Registered Ports are those from 1024 through 49151 + 17 # The Dynamic and/or Private Ports are those from 49152 through 65535 + ... + ``` + + - Рядки з 10 до останнього не друкувати + + ```bash + Shell > cat -n /etc/services | sed -n '10,$!p' + 1 # /etc/services: + 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ + 3 # + 4 # Network services, Internet style + 5 # IANA services version: last updated 2016-07-08 + 6 # + 7 # Note that it is presently the policy of IANA to assign a single well-known + 8 # port number for both TCP and UDP; hence, most entries here have two entries + 9 # even if the protocol doesn't support UDP operations. + ``` + + - Надрукуйте номер рядка та вміст відповідного рядка + + ```bash + Shell > sed -n -e '/netbios/=' -e '/netbios/p' /etc/services + 123 + netbios-ns 137/tcp # NETBIOS Name Service + 124 + netbios-ns 137/udp + 125 + netbios-dgm 138/tcp # NETBIOS Datagram Service + 126 + netbios-dgm 138/udp + 127 + netbios-ssn 139/tcp # NETBIOS session service + 128 + netbios-ssn 139/udp + ``` + + - Зіставте діапазон рядків і надрукуйте його + + Використовуйте коми для розділення діапазонів рядків + + ```bash + Shell > cat /etc/services | sed -n '/^netbios/,/^imap/p' + netbios-ns 137/tcp # NETBIOS Name Service + netbios-ns 137/udp + netbios-dgm 138/tcp # NETBIOS Datagram Service + netbios-dgm 138/udp + netbios-ssn 139/tcp # NETBIOS session service + netbios-ssn 139/udp + imap 143/tcp imap2 # Interim Mail Access Proto v2 + ``` + + !!! info "примітка" + + ``` + **Початок діапазону**: відповідність рядку, де розташований рядок, лише збігання з першим рядком, який з’являється. + **Кінець діапазону**: збігається з рядком, у якому розташований рядок, лише з першим рядком, який з’являється. + ``` + + ```bash + Shell > grep -n ^netbios /etc/services + 123:netbios-ns 137/tcp # NETBIOS Name Service + 124:netbios-ns 137/udp + 125:netbios-dgm 138/tcp # NETBIOS Datagram Service + 126:netbios-dgm 138/udp + 127:netbios-ssn 139/tcp # NETBIOS session service + 128:netbios-ssn 139/udp + + Shell > grep -n ^imap /etc/services + 129:imap 143/tcp imap2 # Interim Mail Access Proto v2 + 130:imap 143/udp imap2 + 168:imap3 220/tcp # Interactive Mail Access + 169:imap3 220/udp # Protocol v3 + 260:imaps 993/tcp # IMAP over SSL + 261:imaps 993/udp # IMAP over SSL + ``` + + Іншими словами, вміст, надрукований вище, це рядки з 123 по 129 + + - Надрукуйте рядок, де знаходиться рядок, і до останнього рядка + + ```bash + Shell > cat /etc/services | sed -n '/^netbios/,$p' + ``` + + - Використання змінних у сценаріях bash + + ```bash + Shell > vim test1.sh + #!/bin/bash + a=10 + + sed -n ''${a}',$!p' /etc/services + # or + sed -n "${a},\$!p" /etc/services + ``` + + - Регулярний вираз + + Відповідає лише "Три цифри" + "/udp". + + ```bash + Shell > cat /etc/services | sed -r -n '/[^0-9]([1-9]{3}\/udp)/p' + sunrpc 111/udp portmapper rpcbind # RPC 4.0 portmapper UDP + auth 113/udp authentication tap ident + sftp 115/udp + uucp-path 117/udp + nntp 119/udp readnews untp # USENET News Transfer Protocol + ntp 123/udp # Network Time Protocol + netbios-ns 137/udp + netbios-dgm 138/udp + netbios-ssn 139/udp + ... + ``` 2. Зіставити та видалити (`d`) - Це схоже на друк, за винятком того, що команду операції замінено на `d`, а параметр -n не потрібен. - - - Видалити всі рядки, які відповідають рядку udp, видалити всі рядки коментарів і видалити всі порожні рядки - - ```bash - Shell > sed -e '/udp/d' -e '/^#/d' -e '/^$/d' /etc/services - tcpmux 1/tcp # TCP port service multiplexer - rje 5/tcp # Remote Job Entry - echo 7/tcp - discard 9/tcp sink null - systat 11/tcp users - daytime 13/tcp - qotd 17/tcp quote - chargen 19/tcp ttytst source - ftp-data 20/tcp - ftp 21/tcp - ssh 22/tcp # The Secure Shell (SSH) Protocol - telnet 23/tcp - ... - ``` - - - Видалити послідовні рядки тексту - - ```bash - Shell > cat -n /etc/services | sed '10,$d' - 1 # /etc/services: - 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ - 3 # - 4 # Network services, Internet style - 5 # IANA services version: last updated 2016-07-08 - 6 # - 7 # Note that it is presently the policy of IANA to assign a single well-known - 8 # port number for both TCP and UDP; hence, most entries here have two entries - 9 # even if the protocol doesn't support UDP operations. - ``` - - - Регулярний вираз - - ```bash - Shell > cat /etc/services | sed -r '/(tcp)|(udp)|(^#)|(^$)/d' - http 80/sctp # HyperText Transfer Protocol - bgp 179/sctp - https 443/sctp # http protocol over TLS/SSL - h323hostcall 1720/sctp # H.323 Call Control - nfs 2049/sctp nfsd shilp # Network File System - rtmp 1/ddp # Routing Table Maintenance Protocol - nbp 2/ddp # Name Binding Protocol - echo 4/ddp # AppleTalk Echo Protocol - zip 6/ddp # Zone Information Protocol - discard 9/sctp # Discard - discard 9/dccp # Discard SC:DISC - ... - ``` + Це схоже на друк, за винятком того, що команду операції замінено на `d`, а параметр -n не потрібен. + + - Видалити всі рядки, які відповідають рядку udp, видалити всі рядки коментарів і видалити всі порожні рядки + + ```bash + Shell > sed -e '/udp/d' -e '/^#/d' -e '/^$/d' /etc/services + tcpmux 1/tcp # TCP port service multiplexer + rje 5/tcp # Remote Job Entry + echo 7/tcp + discard 9/tcp sink null + systat 11/tcp users + daytime 13/tcp + qotd 17/tcp quote + chargen 19/tcp ttytst source + ftp-data 20/tcp + ftp 21/tcp + ssh 22/tcp # The Secure Shell (SSH) Protocol + telnet 23/tcp + ... + ``` + + - Видалити послідовні рядки тексту + + ```bash + Shell > cat -n /etc/services | sed '10,$d' + 1 # /etc/services: + 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ + 3 # + 4 # Network services, Internet style + 5 # IANA services version: last updated 2016-07-08 + 6 # + 7 # Note that it is presently the policy of IANA to assign a single well-known + 8 # port number for both TCP and UDP; hence, most entries here have two entries + 9 # even if the protocol doesn't support UDP operations. + ``` + + - Регулярний вираз + + ```bash + Shell > cat /etc/services | sed -r '/(tcp)|(udp)|(^#)|(^$)/d' + http 80/sctp # HyperText Transfer Protocol + bgp 179/sctp + https 443/sctp # http protocol over TLS/SSL + h323hostcall 1720/sctp # H.323 Call Control + nfs 2049/sctp nfsd shilp # Network File System + rtmp 1/ddp # Routing Table Maintenance Protocol + nbp 2/ddp # Name Binding Protocol + echo 4/ddp # AppleTalk Echo Protocol + zip 6/ddp # Zone Information Protocol + discard 9/sctp # Discard + discard 9/dccp # Discard SC:DISC + ... + ``` 3. Замінити рядки (`s///g`) - | Синтаксис | Опис синтаксису | - | :---------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | - | `sed 's/string/replace/g' FILENAME` | **s**: усі рядки, що представляють вміст файлу. Ви також можете вказати діапазон рядків, наприклад: `sed '20,200s/netbios/TMP/g' /etc/services. **g** (Глобальне): Якщо g відсутнє, це означає, що коли в одному рядку з'являється кілька співпадаючих рядків, буде замінено лише перший співпадаючий рядок. **/**: Стиль роздільника. Ви також можете вказати інші стилі, наприклад: `sed '20,200s?netbios?TMP?g' /etc/services\` | - - !!! tip "Підказка" - - ```` - Example in the bash script: - - ```bash - Shell > vim /root/sedReplace.sh - #!/bin/bash - a="SELINUX=enforcing" - b="SELINUX=disabled" - - sed -i 's/'${a}'/'${b}'/g' /etc/selinux/config - # or - sed -i "s/${a}/${b}/g" /etc/selinux/config - ``` - ```` - - - Замініть і роздрукуйте - - ```bash - Shell > sed -n '44,45s/ssh/SSH/gp' /etc/services - SSH 22/tcp - SSH 22/udp - ``` - - - Використовуйте символ "&", щоб посилатися на рядок - - ```bash - Shell > sed -n '44,45s/ssh/&-SSH/gp' /etc/services - ssh-SSH 22/tcp - ssh-SSH 22/udp - ``` - - - Використовуйте рядок, щоб знайти один або кілька рядків і замінити вказаний рядок у діапазоні рядків - - ```bash - Shell > grep ssh /etc/services -n - 44:ssh 22/tcp # The Secure Shell (SSH) Protocol - 45:ssh 22/udp # The Secure Shell (SSH) Protocol - 551:x11-ssh-offset 6010/tcp # SSH X11 forwarding offset - 593:ssh 22/sctp # SSH - 1351:sshell 614/tcp # SSLshell - 1352:sshell 614/udp # SSLshell - 1607:netconf-ssh 830/tcp # NETCONF over SSH - 1608:netconf-ssh 830/udp # NETCONF over SSH - 7178:sdo-ssh 3897/tcp # Simple Distributed Objects over SSH - 7179:sdo-ssh 3897/udp # Simple Distributed Objects over SSH - 7791:netconf-ch-ssh 4334/tcp # NETCONF Call Home (SSH) - 8473:snmpssh 5161/tcp # SNMP over SSH Transport Model - 8474:snmpssh-trap 5162/tcp # SNMP Notification over SSH Transport Model - 9126:tl1-ssh 6252/tcp # TL1 over SSH - 9127:tl1-ssh 6252/udp # TL1 over SSH - 10796:ssh-mgmt 17235/tcp # SSH Tectia Manager - 10797:ssh-mgmt 17235/udp # SSH Tectia Manager - - Shell > sed '/ssh/s/tcp/TCP/gp' -n /etc/services - ssh 22/TCP # The Secure Shell (SSH) Protocol - x11-ssh-offset 6010/TCP # SSH X11 forwarding offset - sshell 614/TCP # SSLshell - netconf-ssh 830/TCP # NETCONF over SSH - sdo-ssh 3897/TCP # Simple Distributed Objects over SSH - netconf-ch-ssh 4334/TCP # NETCONF Call Home (SSH) - snmpssh 5161/TCP # SNMP over SSH Transport Model - snmpssh-trap 5162/TCP # SNMP Notification over SSH Transport Model - tl1-ssh 6252/TCP # TL1 over SSH - ssh-mgmt 17235/TCP # SSH Tectia Manager - ``` - - - Заміна рядка для послідовних рядків - - ```bash - Shell > sed '10,30s/tcp/TCP/g' /etc/services - ``` - - - Кілька збігів і замін - - ```bash - Shell > cat /etc/services | sed 's/netbios/test1/g ; s/^#//d ; s/dhcp/&t2/g' - ``` - - - Групова заміна регулярних виразів - - У регулярних виразах "()" є групуванням. \1 представляє референтну групу 1, \2 представляє референтну групу 2 і так далі. - - ```bash - Shell > cat /etc/services - ... - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > cat /etc/services | sed -r 's/([0-9]*\/tcp)/\1\tCONTENT1/g ; s/([0-9]*\/udp)/\1\tADD2/g' - ... - axio-disc 35100/tcp CONTENT1 # Axiomatic discovery protocol - axio-disc 35100/udp ADD2 # Axiomatic discovery protocol - pmwebapi 44323/tcp CONTENT1 # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp ADD2 # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp CONTENT1 # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp CONTENT1 # Capture handwritten signatures - ``` - - **\t**: тобто вкладка - - - Замініть усі рядки коментарів порожніми - - ```bash - Shell > cat /etc/services | sed -r 's/(^#.*)//g' - ... - chargen 19/udp ttytst source - ftp-data 20/tcp - ftp-data 20/udp - - ftp 21/tcp - ftp 21/udp fsp fspd - ssh 22/tcp # The Secure Shell (SSH) Protocol - ssh 22/udp # The Secure Shell (SSH) Protocol - ... - ``` - - - Замініть одну з малих літер слова великою - - ```bash - Shell > echo -e "hello,world\nPOSIX" | sed -r 's/(.*)w/\1W/g' - hello,World - POSIX - ``` - - - Зміна позиції рядка - - ```bash - Shell > cat /etc/services - ... - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` - - Ми можемо розділити цей файл на п'ять частин: - - ```txt - cloudcheck-ping 45514 / udp # ASSIA CloudCheck WiFi Management keepalive - ↓ ↓ ↓ ↓ ↓ - (.*) (\<[0-9]+\>) \/ (tcp|udp) (.*) - ↓ ↓ ↓ ↓ - \1 \2 \3 \4 - ``` - - ```bash - Shell > cat /etc/services | sed -r 's/(.*)(\<[0-9]+\>)\/(tcp|udp)(.*)/\1\3\/\2\4/g' - ... - edi_service udp/34567 # dhanalakshmi.org EDI Service - axio-disc tcp/35100 # Axiomatic discovery protocol - axio-disc udp/35100 # Axiomatic discovery protocol - pmwebapi tcp/44323 # Performance Co-Pilot client HTTP API - cloudcheck-ping udp/45514 # ASSIA CloudCheck WiFi Management keepalive - cloudcheck tcp/45514 # ASSIA CloudCheck WiFi Management System - spremotetablet tcp/46998 # Capture handwritten signatures - ``` - - - Видаліть усі пробіли - - ```bash - Shell > echo -e "abcd\t1 2 3 4\tWorld" - abcd 1 2 3 4 World - Shell > echo -e "abcd\t1 2 3 4\tWorld" | sed -r 's/(\s)*//g' - abcd1234World - ``` + | Синтаксис | Опис синтаксису | + | :---------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | + | `sed 's/string/replace/g' FILENAME` | **s**: усі рядки, що представляють вміст файлу. Ви також можете вказати діапазон рядків, наприклад: `sed '20,200s/netbios/TMP/g' /etc/services. **g** (Глобальне): Якщо g відсутнє, це означає, що коли в одному рядку з'являється кілька співпадаючих рядків, буде замінено лише перший співпадаючий рядок. **/**: Стиль роздільника. Ви також можете вказати інші стилі, наприклад: `sed '20,200s?netbios?TMP?g' /etc/services\` | + + !!! tip "Підказка" + + ```` + Example in the bash script: + + ```bash + Shell > vim /root/sedReplace.sh + #!/bin/bash + a="SELINUX=enforcing" + b="SELINUX=disabled" + + sed -i 's/'${a}'/'${b}'/g' /etc/selinux/config + # or + sed -i "s/${a}/${b}/g" /etc/selinux/config + ``` + ```` + + - Замініть і роздрукуйте + + ```bash + Shell > sed -n '44,45s/ssh/SSH/gp' /etc/services + SSH 22/tcp + SSH 22/udp + ``` + + - Використовуйте символ "&", щоб посилатися на рядок + + ```bash + Shell > sed -n '44,45s/ssh/&-SSH/gp' /etc/services + ssh-SSH 22/tcp + ssh-SSH 22/udp + ``` + + - Використовуйте рядок, щоб знайти один або кілька рядків і замінити вказаний рядок у діапазоні рядків + + ```bash + Shell > grep ssh /etc/services -n + 44:ssh 22/tcp # The Secure Shell (SSH) Protocol + 45:ssh 22/udp # The Secure Shell (SSH) Protocol + 551:x11-ssh-offset 6010/tcp # SSH X11 forwarding offset + 593:ssh 22/sctp # SSH + 1351:sshell 614/tcp # SSLshell + 1352:sshell 614/udp # SSLshell + 1607:netconf-ssh 830/tcp # NETCONF over SSH + 1608:netconf-ssh 830/udp # NETCONF over SSH + 7178:sdo-ssh 3897/tcp # Simple Distributed Objects over SSH + 7179:sdo-ssh 3897/udp # Simple Distributed Objects over SSH + 7791:netconf-ch-ssh 4334/tcp # NETCONF Call Home (SSH) + 8473:snmpssh 5161/tcp # SNMP over SSH Transport Model + 8474:snmpssh-trap 5162/tcp # SNMP Notification over SSH Transport Model + 9126:tl1-ssh 6252/tcp # TL1 over SSH + 9127:tl1-ssh 6252/udp # TL1 over SSH + 10796:ssh-mgmt 17235/tcp # SSH Tectia Manager + 10797:ssh-mgmt 17235/udp # SSH Tectia Manager + + Shell > sed '/ssh/s/tcp/TCP/gp' -n /etc/services + ssh 22/TCP # The Secure Shell (SSH) Protocol + x11-ssh-offset 6010/TCP # SSH X11 forwarding offset + sshell 614/TCP # SSLshell + netconf-ssh 830/TCP # NETCONF over SSH + sdo-ssh 3897/TCP # Simple Distributed Objects over SSH + netconf-ch-ssh 4334/TCP # NETCONF Call Home (SSH) + snmpssh 5161/TCP # SNMP over SSH Transport Model + snmpssh-trap 5162/TCP # SNMP Notification over SSH Transport Model + tl1-ssh 6252/TCP # TL1 over SSH + ssh-mgmt 17235/TCP # SSH Tectia Manager + ``` + + - Заміна рядка для послідовних рядків + + ```bash + Shell > sed '10,30s/tcp/TCP/g' /etc/services + ``` + + - Кілька збігів і замін + + ```bash + Shell > cat /etc/services | sed 's/netbios/test1/g ; s/^#//d ; s/dhcp/&t2/g' + ``` + + - Групова заміна регулярних виразів + + У регулярних виразах "()" є групуванням. \1 представляє референтну групу 1, \2 представляє референтну групу 2 і так далі. + + ```bash + Shell > cat /etc/services + ... + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + + Shell > cat /etc/services | sed -r 's/([0-9]*\/tcp)/\1\tCONTENT1/g ; s/([0-9]*\/udp)/\1\tADD2/g' + ... + axio-disc 35100/tcp CONTENT1 # Axiomatic discovery protocol + axio-disc 35100/udp ADD2 # Axiomatic discovery protocol + pmwebapi 44323/tcp CONTENT1 # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp ADD2 # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp CONTENT1 # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp CONTENT1 # Capture handwritten signatures + ``` + + **\t**: тобто вкладка + + - Замініть усі рядки коментарів порожніми + + ```bash + Shell > cat /etc/services | sed -r 's/(^#.*)//g' + ... + chargen 19/udp ttytst source + ftp-data 20/tcp + ftp-data 20/udp + + ftp 21/tcp + ftp 21/udp fsp fspd + ssh 22/tcp # The Secure Shell (SSH) Protocol + ssh 22/udp # The Secure Shell (SSH) Protocol + ... + ``` + + - Замініть одну з малих літер слова великою + + ```bash + Shell > echo -e "hello,world\nPOSIX" | sed -r 's/(.*)w/\1W/g' + hello,World + POSIX + ``` + + - Зміна позиції рядка + + ```bash + Shell > cat /etc/services + ... + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + Ми можемо розділити цей файл на п'ять частин: + + ```txt + cloudcheck-ping 45514 / udp # ASSIA CloudCheck WiFi Management keepalive + ↓ ↓ ↓ ↓ ↓ + (.*) (\<[0-9]+\>) \/ (tcp|udp) (.*) + ↓ ↓ ↓ ↓ + \1 \2 \3 \4 + ``` + + ```bash + Shell > cat /etc/services | sed -r 's/(.*)(\<[0-9]+\>)\/(tcp|udp)(.*)/\1\3\/\2\4/g' + ... + edi_service udp/34567 # dhanalakshmi.org EDI Service + axio-disc tcp/35100 # Axiomatic discovery protocol + axio-disc udp/35100 # Axiomatic discovery protocol + pmwebapi tcp/44323 # Performance Co-Pilot client HTTP API + cloudcheck-ping udp/45514 # ASSIA CloudCheck WiFi Management keepalive + cloudcheck tcp/45514 # ASSIA CloudCheck WiFi Management System + spremotetablet tcp/46998 # Capture handwritten signatures + ``` + + - Видаліть усі пробіли + + ```bash + Shell > echo -e "abcd\t1 2 3 4\tWorld" + abcd 1 2 3 4 World + Shell > echo -e "abcd\t1 2 3 4\tWorld" | sed -r 's/(\s)*//g' + abcd1234World + ``` 4. Виконайте кілька разів за допомогою параметра -e - Наступний приклад: - - ```bash - Shell > tail -n 10 /etc/services - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > tail -n 10 /etc/services | sed -e '1,3d' -e '/cloud/s/ping/PING/g' - # or - Shell > tail -n 10 /etc/services | sed '1,3d ; /cloud/s/ping/PING/g' - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-PING 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` - -5. Додайте вміст над або під певним рядком («i» і «a») - - - Додайте два рядки вмісту над вказаним номером рядка + Наступний приклад: ```bash - Shell > tail -n 10 /etc/services > /root/test.txt - Shell > cat /root/test.txt + Shell > tail -n 10 /etc/services aigairserver 21221/tcp # Services for Air Server ka-kdp 31016/udp # Kollective Agent Kollective Delivery ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery @@ -519,318 +489,348 @@ sed [OPTION]... {script-only-if-no-other-script} [input-file]... cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System spremotetablet 46998/tcp # Capture handwritten signatures - Shell > cat /root/test.txt | sed '3i 123\ - abc' - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - 123 - abc - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + Shell > tail -n 10 /etc/services | sed -e '1,3d' -e '/cloud/s/ping/PING/g' + # or + Shell > tail -n 10 /etc/services | sed '1,3d ; /cloud/s/ping/PING/g' edi_service 34567/udp # dhanalakshmi.org EDI Service axio-disc 35100/tcp # Axiomatic discovery protocol axio-disc 35100/udp # Axiomatic discovery protocol pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck-PING 45514/udp # ASSIA CloudCheck WiFi Management keepalive cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System spremotetablet 46998/tcp # Capture handwritten signatures ``` - - Додайте три рядки під вказаним номером рядка - - ```bash - Shell > cat /root/test.txt | sed '5a 123\ - comment yes\ - tcp or udp' - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - 123 - comment yes - tcp or udp - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` - - - Зіставте певний рядок на основі рядка та додайте 2 рядки вмісту над ним +5. Додайте вміст над або під певним рядком («i» і «a») - ```bash - Shell > cat /root/test.txt | sed '/tcp/iTCP\ - UDP' - TCP - UDP + - Додайте два рядки вмісту над вказаним номером рядка + + ```bash + Shell > tail -n 10 /etc/services > /root/test.txt + Shell > cat /root/test.txt + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + + Shell > cat /root/test.txt | sed '3i 123\ + abc' + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + 123 + abc + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + - Додайте три рядки під вказаним номером рядка + + ```bash + Shell > cat /root/test.txt | sed '5a 123\ + comment yes\ + tcp or udp' aigairserver 21221/tcp # Services for Air Server ka-kdp 31016/udp # Kollective Agent Kollective Delivery - TCP - UDP ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery edi_service 34567/udp # dhanalakshmi.org EDI Service - TCP - UDP axio-disc 35100/tcp # Axiomatic discovery protocol + 123 + comment yes + tcp or udp axio-disc 35100/udp # Axiomatic discovery protocol - TCP - UDP pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - TCP - UDP cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - TCP - UDP spremotetablet 46998/tcp # Capture handwritten signatures ``` -6. Замінити рядки (`c`) + - Зіставте певний рядок на основі рядка та додайте 2 рядки вмісту над ним + + ```bash + Shell > cat /root/test.txt | sed '/tcp/iTCP\ + UDP' + TCP + UDP + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + TCP + UDP + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + TCP + UDP + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + TCP + UDP + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + TCP + UDP + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + TCP + UDP + spremotetablet 46998/tcp # Capture handwritten signatures + ``` - - Знайдіть один або кілька рядків на основі рядка та замініть ці рядки тексту +6. Замінити рядки (`c`) - ```bash - Shell > cat /root/test.txt | sed '/ser/c\TMP1 \ - TMP2' - TMP1 - TMP2 - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - TMP1 - TMP2 - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` + - Знайдіть один або кілька рядків на основі рядка та замініть ці рядки тексту + + ```bash + Shell > cat /root/test.txt | sed '/ser/c\TMP1 \ + TMP2' + TMP1 + TMP2 + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + TMP1 + TMP2 + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + - Заміна однієї лінії + + ```bash + Shell > cat /root/test.txt | sed '7c REPLACE' + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + REPLACE + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + - Замінити послідовні рядки тексту + + ```bash + Shell > cat /root/test.txt | sed '2,$c REPLACE1 \ + replace2' + aigairserver 21221/tcp # Services for Air Server + REPLACE1 + replace2 + ``` + + - Замініть парні рядки + + ```bash + Shell > cat /root/test.txt | sed '2~2c replace' + aigairserver 21221/tcp # Services for Air Server + replace + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + replace + axio-disc 35100/tcp # Axiomatic discovery protocol + replace + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + replace + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + replace + ``` - - Заміна однієї лінії +7. Прочитайте вміст файлу та додайте його вміст під відповідним рядком (`r`) ```bash - Shell > cat /root/test.txt | sed '7c REPLACE' + Shell > cat /root/app.txt + append1 + POSIX + UNIX + + Shell > cat /root/test.txt | sed '/ping/r /root/app.txt' aigairserver 21221/tcp # Services for Air Server ka-kdp 31016/udp # Kollective Agent Kollective Delivery ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery edi_service 34567/udp # dhanalakshmi.org EDI Service axio-disc 35100/tcp # Axiomatic discovery protocol axio-disc 35100/udp # Axiomatic discovery protocol - REPLACE + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + append1 + POSIX + UNIX cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System spremotetablet 46998/tcp # Capture handwritten signatures ``` - - Замінити послідовні рядки тексту - - ```bash - Shell > cat /root/test.txt | sed '2,$c REPLACE1 \ - replace2' - aigairserver 21221/tcp # Services for Air Server - REPLACE1 - replace2 - ``` - - - Замініть парні рядки - - ```bash - Shell > cat /root/test.txt | sed '2~2c replace' - aigairserver 21221/tcp # Services for Air Server - replace - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - replace - axio-disc 35100/tcp # Axiomatic discovery protocol - replace - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - replace - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - replace - ``` - -7. Прочитайте вміст файлу та додайте його вміст під відповідним рядком (`r`) - - ```bash - Shell > cat /root/app.txt - append1 - POSIX - UNIX - - Shell > cat /root/test.txt | sed '/ping/r /root/app.txt' - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - append1 - POSIX - UNIX - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` - 8. Записати відповідні рядки в інші файли (`w`) - ```bash - Shell > cat /root/test.txt | sed '/axio/w /root/storage.txt' - - Shell > cat /root/storage.txt - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - ``` - -9. Читання/додавання наступного рядка введення в "простір шаблону" (`n` і `N`) - - - Надрукуйте наступний рядок відповідного рядка - ```bash - Shell > cat /root/test.txt - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service + Shell > cat /root/test.txt | sed '/axio/w /root/storage.txt' + + Shell > cat /root/storage.txt axio-disc 35100/tcp # Axiomatic discovery protocol axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > cat /root/test.txt | sed '/ping/{n;p}' -n - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System ``` - !!! tip "Підказка" - - ``` - Кілька команд операції `sed` можуть впливати одна на одну, і ви можете використовувати "**{ }**", щоб зменшити цей вплив. - ``` - - - Друк рівних рядків тексту +9. Читання/додавання наступного рядка введення в "простір шаблону" (`n` і `N`) - Спочатку прочитайте перший рядок, оскільки присутня команда `n`; буде роздруковано другий рядок і так далі. + - Надрукуйте наступний рядок відповідного рядка + + ```bash + Shell > cat /root/test.txt + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + + Shell > cat /root/test.txt | sed '/ping/{n;p}' -n + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + ``` + + !!! tip "Підказка" + + ``` + Кілька команд операції `sed` можуть впливати одна на одну, і ви можете використовувати "**{ }**", щоб зменшити цей вплив. + ``` + + - Друк рівних рядків тексту + + Спочатку прочитайте перший рядок, оскільки присутня команда `n`; буде роздруковано другий рядок і так далі. + + ```bash + Shell > cat -n /root/test.txt | sed -n '{n;p}' + # or + Shell > cat -n /root/test.txt | sed -n '2~2p' + 2 ka-kdp 31016/udp # Kollective Agent Kollective Delivery + 4 edi_service 34567/udp # dhanalakshmi.org EDI Service + 6 axio-disc 35100/udp # Axiomatic discovery protocol + 8 cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + 10 spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + - Друк непарних рядків тексту + + ```bash + Shell > cat -n /root/test.txt | sed -n '{p;n}' + # or + Shell > cat -n /root/test.txt | sed -n '1~2p' + # or + Shell > cat -n /root/test.txt | sed 'n;d' + 1 aigairserver 21221/tcp # Services for Air Server + 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + 5 axio-disc 35100/tcp # Axiomatic discovery protocol + 7 pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + ``` + + - Вивести 3n рядків + + ```bash + Shell > cat -n /root/test.txt | sed -n '{n;n;p}' + # or + Shell > cat -n /root/test.txt | sed -n '3~3p' + 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + 6 axio-disc 35100/udp # Axiomatic discovery protocol + 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + ``` + + - `N` + + Прочитайте перший рядок і додайте один рядок після зустрічі з командою `N`. У цьому прикладі «простір шаблону» — «1\n2». Нарешті, виконайте команду `q`, щоб вийти. + + ```bash + Shell > seq 1 10 | sed 'N;q' + 1 + 2 + ``` + + Оскільки після рядка 9 немає додаткового рядка, результат буде таким: + + ```bash + Shell > seq 1 9 | sed -n 'N;p' + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + ``` + + Коли зчитується останній рядок, команда `N` не виконується, і виводиться наступне: + + ```bash + Shell > seq 1 9 | sed -n '$!N;p' + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + ``` + + Об’єднати два рядки в один. Замініть "\n" у "шаблоні" пробілом. + + ```bash + Shell > seq 1 6 | sed 'N;{s/\n//g}' + 12 + 34 + 56 + ``` - ```bash - Shell > cat -n /root/test.txt | sed -n '{n;p}' - # or - Shell > cat -n /root/test.txt | sed -n '2~2p' - 2 ka-kdp 31016/udp # Kollective Agent Kollective Delivery - 4 edi_service 34567/udp # dhanalakshmi.org EDI Service - 6 axio-disc 35100/udp # Axiomatic discovery protocol - 8 cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - 10 spremotetablet 46998/tcp # Capture handwritten signatures - ``` +10. Ігнорувати регістр ('I') - - Друк непарних рядків тексту + Здається, немає інформації про ігнорування регістру в `man 1 sed`. ```bash - Shell > cat -n /root/test.txt | sed -n '{p;n}' - # or - Shell > cat -n /root/test.txt | sed -n '1~2p' - # or - Shell > cat -n /root/test.txt | sed 'n;d' - 1 aigairserver 21221/tcp # Services for Air Server - 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - 5 axio-disc 35100/tcp # Axiomatic discovery protocol - 7 pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + Shell > echo -e "abc\nAbc" | sed -n 's/a/X/Igp' + Xbc + XBC ``` - - Вивести 3n рядків - ```bash - Shell > cat -n /root/test.txt | sed -n '{n;n;p}' - # or - Shell > cat -n /root/test.txt | sed -n '3~3p' - 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - 6 axio-disc 35100/udp # Axiomatic discovery protocol - 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + Shell > cat /etc/services | sed '/OEM/Ip' -n + oem-agent 3872/tcp # OEM Agent + oem-agent 3872/udp # OEM Agent + oemcacao-jmxmp 11172/tcp # OEM cacao JMX-remoting access point + oemcacao-rmi 11174/tcp # OEM cacao rmi registry access point + oemcacao-websvc 11175/tcp # OEM cacao web service access point ``` - - `N` - - Прочитайте перший рядок і додайте один рядок після зустрічі з командою `N`. У цьому прикладі «простір шаблону» — «1\n2». Нарешті, виконайте команду `q`, щоб вийти. - ```bash - Shell > seq 1 10 | sed 'N;q' - 1 - 2 + Shell > cat /etc/services | sed -r '/(TCP)|(UDP)/Id' ``` - Оскільки після рядка 9 немає додаткового рядка, результат буде таким: - ```bash - Shell > seq 1 9 | sed -n 'N;p' - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 + Shell > cat /etc/services | sed -r '/(TCP)|(UDP)/Ic TMP' ``` - Коли зчитується останній рядок, команда `N` не виконується, і виводиться наступне: +11. Отримує загальну кількість рядків у файлі ```bash - Shell > seq 1 9 | sed -n '$!N;p' - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - ``` - - Об’єднати два рядки в один. Замініть "\n" у "шаблоні" пробілом. + Shell > cat /etc/services | sed -n '$=' + # or + Shell > cat /etc/services | wc -l - ```bash - Shell > seq 1 6 | sed 'N;{s/\n//g}' - 12 - 34 - 56 + 11473 ``` - -10. Ігнорувати регістр ('I') - - Здається, немає інформації про ігнорування регістру в `man 1 sed`. - - ```bash - Shell > echo -e "abc\nAbc" | sed -n 's/a/X/Igp' - Xbc - XBC - ``` - - ```bash - Shell > cat /etc/services | sed '/OEM/Ip' -n - oem-agent 3872/tcp # OEM Agent - oem-agent 3872/udp # OEM Agent - oemcacao-jmxmp 11172/tcp # OEM cacao JMX-remoting access point - oemcacao-rmi 11174/tcp # OEM cacao rmi registry access point - oemcacao-websvc 11175/tcp # OEM cacao web service access point - ``` - - ```bash - Shell > cat /etc/services | sed -r '/(TCP)|(UDP)/Id' - ``` - - ```bash - Shell > cat /etc/services | sed -r '/(TCP)|(UDP)/Ic TMP' - ``` - -11. Отримує загальну кількість рядків у файлі - - ```bash - Shell > cat /etc/services | sed -n '$=' - # or - Shell > cat /etc/services | wc -l - - 11473 - ``` diff --git a/docs/books/sed_awk_grep/index.fr.md b/docs/books/sed_awk_grep/index.fr.md index 79d5b106bb..0f4135e65b 100644 --- a/docs/books/sed_awk_grep/index.fr.md +++ b/docs/books/sed_awk_grep/index.fr.md @@ -1,7 +1,7 @@ --- title: Sed, Awk & Grep - the Three Swordsmen author: tianci li -contributors: null +contributors: tags: - grep - sed diff --git a/docs/books/sed_awk_grep/index.it.md b/docs/books/sed_awk_grep/index.it.md index c35b3359af..1b350fe037 100644 --- a/docs/books/sed_awk_grep/index.it.md +++ b/docs/books/sed_awk_grep/index.it.md @@ -1,7 +1,7 @@ --- title: Sed, Awk e Grep - i tre spadaccini author: tianci li -contributors: null +contributors: tags: - grep - sed diff --git a/docs/books/sed_awk_grep/index.uk.md b/docs/books/sed_awk_grep/index.uk.md index 409675d810..89989f24a3 100644 --- a/docs/books/sed_awk_grep/index.uk.md +++ b/docs/books/sed_awk_grep/index.uk.md @@ -1,7 +1,7 @@ --- title: Sed, Awk & Grep - три мечники author: tianci li -contributors: null +contributors: tags: - grep - sed diff --git a/docs/books/web_services/01-files-servers.de.md b/docs/books/web_services/01-files-servers.de.md index 2fba88b646..3698f14132 100644 --- a/docs/books/web_services/01-files-servers.de.md +++ b/docs/books/web_services/01-files-servers.de.md @@ -1,6 +1,6 @@ --- -author: null -contributors: null +author: +contributors: title: Erster Teil File-Server tags: - ftp diff --git a/docs/books/web_services/01-files-servers.fr.md b/docs/books/web_services/01-files-servers.fr.md index 9d91d316c4..863b4b06c0 100644 --- a/docs/books/web_services/01-files-servers.fr.md +++ b/docs/books/web_services/01-files-servers.fr.md @@ -1,6 +1,6 @@ --- -author: null -contributors: null +author: +contributors: title: Chapitre 1. Serveurs de Fichiers tags: - ftp diff --git a/docs/books/web_services/01-files-servers.it.md b/docs/books/web_services/01-files-servers.it.md index 3a8d1f83b5..688fdeaceb 100644 --- a/docs/books/web_services/01-files-servers.it.md +++ b/docs/books/web_services/01-files-servers.it.md @@ -1,6 +1,6 @@ --- -author: null -contributors: null +author: +contributors: title: Capitolo 1. Files Servers tags: - ftp diff --git a/docs/books/web_services/01-files-servers.uk.md b/docs/books/web_services/01-files-servers.uk.md index 0cce48a769..dc40d25aa8 100644 --- a/docs/books/web_services/01-files-servers.uk.md +++ b/docs/books/web_services/01-files-servers.uk.md @@ -1,6 +1,6 @@ --- -author: null -contributors: null +author: +contributors: title: Частина 1 Files Servers tags: - ftp diff --git a/docs/books/web_services/04-database-servers.it.md b/docs/books/web_services/04-database-servers.it.md index 40eb2f6d87..26e37db843 100644 --- a/docs/books/web_services/04-database-servers.it.md +++ b/docs/books/web_services/04-database-servers.it.md @@ -1,6 +1,6 @@ --- -author: null -contributors: null +author: +contributors: title: Capitolo 4. Server Database --- diff --git a/docs/books/web_services/04-database-servers.uk.md b/docs/books/web_services/04-database-servers.uk.md index 43f2fb7d76..a46598b347 100644 --- a/docs/books/web_services/04-database-servers.uk.md +++ b/docs/books/web_services/04-database-servers.uk.md @@ -1,6 +1,6 @@ --- -author: null -contributors: null +author: +contributors: title: Частина 4. Сервери баз даних --- diff --git a/docs/books/web_services/05-load-balancer-proxies.fr.md b/docs/books/web_services/05-load-balancer-proxies.fr.md index 5d245a6ce5..e962544428 100644 --- a/docs/books/web_services/05-load-balancer-proxies.fr.md +++ b/docs/books/web_services/05-load-balancer-proxies.fr.md @@ -1,6 +1,6 @@ --- author: Antoine Le Morvan -contributors: null +contributors: title: Chapitre 5 Équilibrage de charge, mise en cache et proxy --- diff --git a/docs/books/web_services/05-load-balancer-proxies.it.md b/docs/books/web_services/05-load-balancer-proxies.it.md index a20c1cf580..2923eb5f27 100644 --- a/docs/books/web_services/05-load-balancer-proxies.it.md +++ b/docs/books/web_services/05-load-balancer-proxies.it.md @@ -1,6 +1,6 @@ --- author: Antoine Le Morvan -contributors: null +contributors: title: Capitolo 5. Load balancing, caching e proxy --- diff --git a/docs/books/web_services/05-load-balancer-proxies.uk.md b/docs/books/web_services/05-load-balancer-proxies.uk.md index fde1f35998..6988d47630 100644 --- a/docs/books/web_services/05-load-balancer-proxies.uk.md +++ b/docs/books/web_services/05-load-balancer-proxies.uk.md @@ -1,6 +1,6 @@ --- author: Antoine Le Morvan -contributors: null +contributors: title: Частина 5. Балансування навантаження, кешування та проксіфікація --- diff --git a/docs/books/web_services/051-load-balancer-proxies-haproxy.it.md b/docs/books/web_services/051-load-balancer-proxies-haproxy.it.md index a40cfb2ede..67650c165a 100644 --- a/docs/books/web_services/051-load-balancer-proxies-haproxy.it.md +++ b/docs/books/web_services/051-load-balancer-proxies-haproxy.it.md @@ -1,6 +1,6 @@ --- author: Antoine Le Morvan -contributors: null +contributors: title: Part 5.1 HAProxy --- diff --git a/docs/books/web_services/051-load-balancer-proxies-haproxy.uk.md b/docs/books/web_services/051-load-balancer-proxies-haproxy.uk.md index 4eed2d4bee..b519e8024c 100644 --- a/docs/books/web_services/051-load-balancer-proxies-haproxy.uk.md +++ b/docs/books/web_services/051-load-balancer-proxies-haproxy.uk.md @@ -1,6 +1,6 @@ --- author: Antoine Le Morvan -contributors: null +contributors: title: Частина 5.1 HAProxy --- diff --git a/docs/books/web_services/06-mails-servers.de.md b/docs/books/web_services/06-mails-servers.de.md index a47c3a8fee..d99fe72cea 100644 --- a/docs/books/web_services/06-mails-servers.de.md +++ b/docs/books/web_services/06-mails-servers.de.md @@ -1,6 +1,6 @@ --- -author: null -contributors: null +author: +contributors: title: Kapitel 6 – Mail-Server --- diff --git a/docs/books/web_services/06-mails-servers.fr.md b/docs/books/web_services/06-mails-servers.fr.md index b76394088c..7fc694c10d 100644 --- a/docs/books/web_services/06-mails-servers.fr.md +++ b/docs/books/web_services/06-mails-servers.fr.md @@ -1,6 +1,6 @@ --- -author: null -contributors: null +author: +contributors: title: Chapitre 6 Serveurs de messagerie --- diff --git a/docs/books/web_services/06-mails-servers.it.md b/docs/books/web_services/06-mails-servers.it.md index b86c2ec892..9460d05e2e 100644 --- a/docs/books/web_services/06-mails-servers.it.md +++ b/docs/books/web_services/06-mails-servers.it.md @@ -1,6 +1,6 @@ --- -author: null -contributors: null +author: +contributors: title: Capitolo 6. Server mail --- diff --git a/docs/books/web_services/06-mails-servers.uk.md b/docs/books/web_services/06-mails-servers.uk.md index 902e3d14af..f378925fe9 100644 --- a/docs/books/web_services/06-mails-servers.uk.md +++ b/docs/books/web_services/06-mails-servers.uk.md @@ -1,6 +1,6 @@ --- -author: null -contributors: null +author: +contributors: title: Частина 6. Поштові сервери --- diff --git a/docs/desktop/gnome/file-shredder.de.md b/docs/desktop/gnome/file-shredder.de.md index ac14f9f9d9..275a3baa6c 100644 --- a/docs/desktop/gnome/file-shredder.de.md +++ b/docs/desktop/gnome/file-shredder.de.md @@ -22,19 +22,19 @@ Für diese Anleitung benötigen Sie Folgendes: 1. Gehen Sie zu [Flathub.org] (https://flathub.org), geben Sie `File Shredder` in die Suchleiste ein und klicken Sie auf **Install** - ![manual install script and run script](images/file-shredder_install.png) + ![manual install script and run script](images/file-shredder_install.png) 2. Kopieren Sie das manuelle Skript in Ihr Terminal: - ```bash - flatpak install flathub io.github.ADBeveridge.Raider - ``` + ```bash + flatpak install flathub io.github.ADBeveridge.Raider + ``` 3. Führen Sie anschließend das manuelle Installationsskript in Ihrem Terminal aus: - ```bash - flatpak run flathub io.github.ADBeveridge.Raider - ``` + ```bash + flatpak run flathub io.github.ADBeveridge.Raider + ``` ## Anwendungshinweise @@ -42,7 +42,7 @@ Gehen Sie wie folgt vor, um `File Shredder` zu verwenden: 1. Ziehen oder klicken Sie auf **Add file**, um die Datei(en) auszuwählen, die Sie entfernen möchten - ![Screenshot of the File Shredder homepage, showing the add drop-down menu and drop here button being highlighted by red rectangles](images/02_file-shredder.png) + ![Screenshot of the File Shredder homepage, showing the add drop-down menu and drop here button being highlighted by red rectangles](images/02_file-shredder.png) 2. Auf **Shred All** klicken diff --git a/docs/desktop/gnome/file-shredder.fr.md b/docs/desktop/gnome/file-shredder.fr.md index 435f4a050c..11502151b1 100644 --- a/docs/desktop/gnome/file-shredder.fr.md +++ b/docs/desktop/gnome/file-shredder.fr.md @@ -22,19 +22,19 @@ Ce guide suppose que vous disposez de la configuration suivante : 1. Accédez au [site Web Flathub](https://flathub.org/), tapez `File Shredder` dans la barre de recherche et cliquez sur **Install** - ![manual install script and run script](images/file-shredder_install.png) + ![manual install script and run script](images/file-shredder_install.png) 2. Copiez le script d'installation manuelle dans un terminal : - ```bash - flatpak install flathub io.github.ADBeveridge.Raider - ``` + ```bash + flatpak install flathub io.github.ADBeveridge.Raider + ``` 3. Enfin, exécutez le script d'installation manuelle dans votre terminal : - ```bash - flatpak run flathub io.github.ADBeveridge.Raider - ``` + ```bash + flatpak run flathub io.github.ADBeveridge.Raider + ``` ## Mode d'emploi @@ -42,7 +42,7 @@ Pour utiliser le programme `File Shredder`, procédez comme suit : 1. Faites glisser ou cliquez sur **Add File** pour sélectionner le(s) fichier(s) que vous souhaitez supprimer - ![Screenshot of the File Shredder homepage, showing the add drop-down menu and drop here button being highlighted by red rectangles](images/02_file-shredder.png) + ![Screenshot of the File Shredder homepage, showing the add drop-down menu and drop here button being highlighted by red rectangles](images/02_file-shredder.png) 2. Cliquez sur **Shred All** diff --git a/docs/desktop/gnome/file-shredder.it.md b/docs/desktop/gnome/file-shredder.it.md index b838782347..ad99ae2a61 100644 --- a/docs/desktop/gnome/file-shredder.it.md +++ b/docs/desktop/gnome/file-shredder.it.md @@ -22,19 +22,19 @@ Questa guida presuppone che si disponga di quanto segue: 1. Andate sul [sito web di Flathub](https://flathub.org), digitate "File Shredder" nella barra di ricerca e cliccate su **Install** - ![manual install script and run script](images/file-shredder_install.png) + ![manual install script and run script](images/file-shredder_install.png) 2. Copiare lo script manuale nel terminale: - ```bash - flatpak install flathub io.github.ADBeveridge.Raider - ``` + ```bash + flatpak install flathub io.github.ADBeveridge.Raider + ``` 3. Infine, eseguire lo script manuale nel terminale: - ```bash - flatpak run flathub io.github.ADBeveridge.Raider - ``` + ```bash + flatpak run flathub io.github.ADBeveridge.Raider + ``` ## Istruzioni @@ -42,7 +42,7 @@ Per utilizzare File Shredder, procedere come segue: 1. Trascinare o fare clic su **Aggiungi file** per scegliere il file o i file che si desidera rimuovere - ![Screenshot of the File Shredder homepage, showing the add drop-down menu and drop here button being highlighted by red rectangles](images/02_file-shredder.png) + ![Screenshot of the File Shredder homepage, showing the add drop-down menu and drop here button being highlighted by red rectangles](images/02_file-shredder.png) 2. Cliccare su **Shred All** diff --git a/docs/desktop/gnome/file-shredder.uk.md b/docs/desktop/gnome/file-shredder.uk.md index 62d9ae4184..af428bf672 100644 --- a/docs/desktop/gnome/file-shredder.uk.md +++ b/docs/desktop/gnome/file-shredder.uk.md @@ -22,19 +22,19 @@ contributors: Steven Spencer, Ganna Zhyrnova 1. Перейдіть на [веб-сайт Flathub](https://flathub.org), введіть «File Shredder» у рядку пошуку та натисніть **Install** - ![manual install script and run script](images/file-shredder_install.png) + ![manual install script and run script](images/file-shredder_install.png) 2. Скопіюйте скрипт у свій термінал: - ```bash - flatpak install flathub io.github.ADBeveridge.Raider - ``` + ```bash + flatpak install flathub io.github.ADBeveridge.Raider + ``` 3. Нарешті, запустіть сценарій у вашому терміналі: - ```bash - flatpak run flathub io.github.ADBeveridge.Raider - ``` + ```bash + flatpak run flathub io.github.ADBeveridge.Raider + ``` ## Як цим користуватися @@ -42,7 +42,7 @@ contributors: Steven Spencer, Ganna Zhyrnova 1. Перетягніть або клацніть **Add file**, щоб вибрати файли, які потрібно видалити - ![Screenshot of the File Shredder homepage, showing the add drop-down menu and drop here button being highlighted by red rectangles](images/02_file-shredder.png) + ![Screenshot of the File Shredder homepage, showing the add drop-down menu and drop here button being highlighted by red rectangles](images/02_file-shredder.png) 2. Натисніть **Shred All** diff --git a/docs/desktop/gnome/flatpak.de.md b/docs/desktop/gnome/flatpak.de.md index f9de79260a..8e5296735a 100644 --- a/docs/desktop/gnome/flatpak.de.md +++ b/docs/desktop/gnome/flatpak.de.md @@ -166,51 +166,51 @@ Der Installationsprozess für OBS Studio sieht beispielsweise wie folgt aus: 3. Klicken Sie auf den Abwärtspfeil neben der Schaltfläche „Installieren“ - ![flathub_install_1](images/01_flatpak.png) + ![flathub_install_1](images/01_flatpak.png) - ![flathub_install_2](images/02_flatpak.png) + ![flathub_install_2](images/02_flatpak.png) 4. Stellen Sie sicher, dass Sie alle Installationsvoraussetzungen für Rocky Linux erfüllt haben (Nummer 1 im zweiten Bild, das oben bereits abgeschlossen ist), kopieren Sie dann den Befehl (Nummer 2 im zweiten Bild) und fügen Sie ihn in ein Terminal ein - ```bash - flatpak install flathub com.obsproject.Studio - Looking for matches… - Required runtime for com.obsproject.Studio/x86_64/stable (runtime/org.kde.Platform/x86_64/6.6) found in remote flathub - Do you want to install it? [Y/n]: Y - ``` + ```bash + flatpak install flathub com.obsproject.Studio + Looking for matches… + Required runtime for com.obsproject.Studio/x86_64/stable (runtime/org.kde.Platform/x86_64/6.6) found in remote flathub + Do you want to install it? [Y/n]: Y + ``` 5. Wenn Sie mit „Y“ antworten und ++enter++ drücken, wird Folgendes angezeigt: - ```bash - com.obsproject.Studio permissions: - ipc network pulseaudio wayland - x11 devices file access [1] dbus access [2] - system dbus access [3] - - [1] host, xdg-config/kdeglobals:ro, xdg-run/pipewire-0 - [2] com.canonical.AppMenu.Registrar, org.a11y.Bus, org.freedesktop.Flatpak, org.freedesktop.Notifications, - org.kde.KGlobalSettings, org.kde.StatusNotifierWatcher, org.kde.kconfig.notify - [3] org.freedesktop.Avahi - - ID Branch Op Remote Download - 1. com.obsproject.Studio.Locale stable i flathub < 47.0 kB (partial) - 2. org.kde.KStyle.Adwaita 6.6 i flathub < 8.0 MB - 3. org.kde.Platform.Locale 6.6 i flathub < 380.6 MB (partial) - 4. org.kde.PlatformTheme.QGnomePlatform 6.6 i flathub < 9.7 MB - 5. org.kde.WaylandDecoration.QAdwaitaDecorations 6.6 i flathub < 1.2 MB - 6. org.kde.Platform 6.6 i flathub < 325.0 MB - 7. com.obsproject.Studio stable i flathub < 207.7 MB - - Proceed with these changes to the system installation? [Y/n]: - ``` + ```bash + com.obsproject.Studio permissions: + ipc network pulseaudio wayland + x11 devices file access [1] dbus access [2] + system dbus access [3] + + [1] host, xdg-config/kdeglobals:ro, xdg-run/pipewire-0 + [2] com.canonical.AppMenu.Registrar, org.a11y.Bus, org.freedesktop.Flatpak, org.freedesktop.Notifications, + org.kde.KGlobalSettings, org.kde.StatusNotifierWatcher, org.kde.kconfig.notify + [3] org.freedesktop.Avahi + + ID Branch Op Remote Download + 1. com.obsproject.Studio.Locale stable i flathub < 47.0 kB (partial) + 2. org.kde.KStyle.Adwaita 6.6 i flathub < 8.0 MB + 3. org.kde.Platform.Locale 6.6 i flathub < 380.6 MB (partial) + 4. org.kde.PlatformTheme.QGnomePlatform 6.6 i flathub < 9.7 MB + 5. org.kde.WaylandDecoration.QAdwaitaDecorations 6.6 i flathub < 1.2 MB + 6. org.kde.Platform 6.6 i flathub < 325.0 MB + 7. com.obsproject.Studio stable i flathub < 207.7 MB + + Proceed with these changes to the system installation? [Y/n]: + ``` 6. Wenn Sie mit „Y“ antworten und ++enter++ drücken, werden die Systemberechtigungen wie angegeben geändert und die Anwendung installiert. 7. Wenn alles gut geht, sollten Sie folgende Meldung erhalten: - ```text - Installation complete. - ``` + ```text + Installation complete. + ``` 8. Im Menü „Aktivities“ können Sie nun nach OBS Studio suchen und es ausführen. diff --git a/docs/desktop/gnome/flatpak.fr.md b/docs/desktop/gnome/flatpak.fr.md index f8d7986c0a..503025608f 100644 --- a/docs/desktop/gnome/flatpak.fr.md +++ b/docs/desktop/gnome/flatpak.fr.md @@ -166,51 +166,51 @@ Pour parcourir `Flathub`, veuillez consulter . Une énorme 3. Cliquez sur la flèche vers le bas à côté du bouton « Install » - ![flathub_install_1](images/01_flatpak.png) + ![flathub_install_1](images/01_flatpak.png) - ![flathub_install_2](images/02_flatpak.png) + ![flathub_install_2](images/02_flatpak.png) 4. Assurez-vous d'avoir rempli toutes les conditions préalables à l'installation de Rocky Linux (numéro 1 dans la deuxième image, qui est déjà complété ci-dessus), puis copiez la commande (numéro 2 dans la deuxième image) et collez-la dans un terminal - ```bash - flatpak install flathub com.obsproject.Studio - Looking for matches… - Required runtime for com.obsproject.Studio/x86_64/stable (runtime/org.kde.Platform/x86_64/6.6) found in remote flathub - Do you want to install it? [Y/n]: Y - ``` + ```bash + flatpak install flathub com.obsproject.Studio + Looking for matches… + Required runtime for com.obsproject.Studio/x86_64/stable (runtime/org.kde.Platform/x86_64/6.6) found in remote flathub + Do you want to install it? [Y/n]: Y + ``` 5. Lorsque vous répondez « Y » et appuyez sur ++enter++, vous verrez ce qui suit : - ```bash - com.obsproject.Studio permissions: - ipc network pulseaudio wayland - x11 devices file access [1] dbus access [2] - system dbus access [3] - - [1] host, xdg-config/kdeglobals:ro, xdg-run/pipewire-0 - [2] com.canonical.AppMenu.Registrar, org.a11y.Bus, org.freedesktop.Flatpak, org.freedesktop.Notifications, - org.kde.KGlobalSettings, org.kde.StatusNotifierWatcher, org.kde.kconfig.notify - [3] org.freedesktop.Avahi - - ID Branch Op Remote Download - 1. com.obsproject.Studio.Locale stable i flathub < 47.0 kB (partial) - 2. org.kde.KStyle.Adwaita 6.6 i flathub < 8.0 MB - 3. org.kde.Platform.Locale 6.6 i flathub < 380.6 MB (partial) - 4. org.kde.PlatformTheme.QGnomePlatform 6.6 i flathub < 9.7 MB - 5. org.kde.WaylandDecoration.QAdwaitaDecorations 6.6 i flathub < 1.2 MB - 6. org.kde.Platform 6.6 i flathub < 325.0 MB - 7. com.obsproject.Studio stable i flathub < 207.7 MB - - Proceed with these changes to the system installation? [Y/n]: - ``` + ```bash + com.obsproject.Studio permissions: + ipc network pulseaudio wayland + x11 devices file access [1] dbus access [2] + system dbus access [3] + + [1] host, xdg-config/kdeglobals:ro, xdg-run/pipewire-0 + [2] com.canonical.AppMenu.Registrar, org.a11y.Bus, org.freedesktop.Flatpak, org.freedesktop.Notifications, + org.kde.KGlobalSettings, org.kde.StatusNotifierWatcher, org.kde.kconfig.notify + [3] org.freedesktop.Avahi + + ID Branch Op Remote Download + 1. com.obsproject.Studio.Locale stable i flathub < 47.0 kB (partial) + 2. org.kde.KStyle.Adwaita 6.6 i flathub < 8.0 MB + 3. org.kde.Platform.Locale 6.6 i flathub < 380.6 MB (partial) + 4. org.kde.PlatformTheme.QGnomePlatform 6.6 i flathub < 9.7 MB + 5. org.kde.WaylandDecoration.QAdwaitaDecorations 6.6 i flathub < 1.2 MB + 6. org.kde.Platform 6.6 i flathub < 325.0 MB + 7. com.obsproject.Studio stable i flathub < 207.7 MB + + Proceed with these changes to the system installation? [Y/n]: + ``` 6. Répondre « Y » et appuyer sur ++enter++ modifiera les autorisations du système comme indiqué et installera l'application. 7. Si tout se passe bien, vous devriez obtenir le message suivant : - ```text - Installation complete. - ``` + ```text + Installation complete. + ``` 8. Depuis le menu « Activities », vous pouvez désormais rechercher et exécuter OBS Studio. diff --git a/docs/desktop/gnome/flatpak.it.md b/docs/desktop/gnome/flatpak.it.md index ffc9018d05..28bdc60de1 100644 --- a/docs/desktop/gnome/flatpak.it.md +++ b/docs/desktop/gnome/flatpak.it.md @@ -166,51 +166,51 @@ A titolo di esempio, il processo di installazione di OBS Studio è il seguente: 3. Cliccare sulla freccia rivolta verso il basso accanto al pulsante "Installa" - ![flathub_install_1](images/01_flatpak.png) + ![flathub_install_1](images/01_flatpak.png) - ![flathub_install_2](images/02_flatpak.png) + ![flathub_install_2](images/02_flatpak.png) 4. Assicuratevi di aver completato tutti i prerequisiti per l'installazione di Rocky Linux (numero 1 nella seconda immagine, che è già stato completato sopra) e poi copiate il comando (numero 2 nella seconda immagine) e incollatelo in un terminale - ```bash - flatpak install flathub com.obsproject.Studio - Looking for matches… - Required runtime for com.obsproject.Studio/x86_64/stable (runtime/org.kde.Platform/x86_64/6.6) found in remote flathub - Do you want to install it? [Y/n]: Y - ``` + ```bash + flatpak install flathub com.obsproject.Studio + Looking for matches… + Required runtime for com.obsproject.Studio/x86_64/stable (runtime/org.kde.Platform/x86_64/6.6) found in remote flathub + Do you want to install it? [Y/n]: Y + ``` 5. Quando si risponde "Y" e si preme ++enter++, viene visualizzato il seguente messaggio: - ```bash - com.obsproject.Studio permissions: - ipc network pulseaudio wayland - x11 devices file access [1] dbus access [2] - system dbus access [3] - - [1] host, xdg-config/kdeglobals:ro, xdg-run/pipewire-0 - [2] com.canonical.AppMenu.Registrar, org.a11y.Bus, org.freedesktop.Flatpak, org.freedesktop.Notifications, - org.kde.KGlobalSettings, org.kde.StatusNotifierWatcher, org.kde.kconfig.notify - [3] org.freedesktop.Avahi - - ID Branch Op Remote Download - 1. com.obsproject.Studio.Locale stable i flathub < 47.0 kB (partial) - 2. org.kde.KStyle.Adwaita 6.6 i flathub < 8.0 MB - 3. org.kde.Platform.Locale 6.6 i flathub < 380.6 MB (partial) - 4. org.kde.PlatformTheme.QGnomePlatform 6.6 i flathub < 9.7 MB - 5. org.kde.WaylandDecoration.QAdwaitaDecorations 6.6 i flathub < 1.2 MB - 6. org.kde.Platform 6.6 i flathub < 325.0 MB - 7. com.obsproject.Studio stable i flathub < 207.7 MB - - Proceed with these changes to the system installation? [Y/n]: - ``` + ```bash + com.obsproject.Studio permissions: + ipc network pulseaudio wayland + x11 devices file access [1] dbus access [2] + system dbus access [3] + + [1] host, xdg-config/kdeglobals:ro, xdg-run/pipewire-0 + [2] com.canonical.AppMenu.Registrar, org.a11y.Bus, org.freedesktop.Flatpak, org.freedesktop.Notifications, + org.kde.KGlobalSettings, org.kde.StatusNotifierWatcher, org.kde.kconfig.notify + [3] org.freedesktop.Avahi + + ID Branch Op Remote Download + 1. com.obsproject.Studio.Locale stable i flathub < 47.0 kB (partial) + 2. org.kde.KStyle.Adwaita 6.6 i flathub < 8.0 MB + 3. org.kde.Platform.Locale 6.6 i flathub < 380.6 MB (partial) + 4. org.kde.PlatformTheme.QGnomePlatform 6.6 i flathub < 9.7 MB + 5. org.kde.WaylandDecoration.QAdwaitaDecorations 6.6 i flathub < 1.2 MB + 6. org.kde.Platform 6.6 i flathub < 325.0 MB + 7. com.obsproject.Studio stable i flathub < 207.7 MB + + Proceed with these changes to the system installation? [Y/n]: + ``` 6. Rispondendo "Y" e premendo ++enter++ si modificheranno i permessi di sistema come indicato e si installerà l'applicazione. 7. Se tutto va bene, dovreste ricevere: - ```text - Installation complete. - ``` + ```text + Installation complete. + ``` 8. Dal menu "Attività" è ora possibile cercare ed eseguire OBS Studio. diff --git a/docs/desktop/gnome/flatpak.uk.md b/docs/desktop/gnome/flatpak.uk.md index 43f440385d..86d9f71753 100644 --- a/docs/desktop/gnome/flatpak.uk.md +++ b/docs/desktop/gnome/flatpak.uk.md @@ -166,51 +166,51 @@ Flathub — це веб-ресурс для отримання або надси 3. Натисніть стрілку вниз поруч із кнопкою «Встановити» - ![flathub_install_1](images/01_flatpak.png) + ![flathub_install_1](images/01_flatpak.png) - ![flathub_install_2](images/02_flatpak.png) + ![flathub_install_2](images/02_flatpak.png) 4. Переконайтеся, що ви виконали всі передумови встановлення для Rocky Linux (номер 1 на другому зображенні, яке вже виконано вище), а потім скопіюйте команду (номер 2 на другому зображенні) і вставте її в термінал - ```bash - flatpak install flathub com.obsproject.Studio - Looking for matches… - Required runtime for com.obsproject.Studio/x86_64/stable (runtime/org.kde.Platform/x86_64/6.6) found in remote flathub - Do you want to install it? [Y/n]: Y - ``` + ```bash + flatpak install flathub com.obsproject.Studio + Looking for matches… + Required runtime for com.obsproject.Studio/x86_64/stable (runtime/org.kde.Platform/x86_64/6.6) found in remote flathub + Do you want to install it? [Y/n]: Y + ``` 5. Коли ви відповісте «Y» і натиснете ++enter++, ви побачите таке: - ```bash - com.obsproject.Studio permissions: - ipc network pulseaudio wayland - x11 devices file access [1] dbus access [2] - system dbus access [3] - - [1] host, xdg-config/kdeglobals:ro, xdg-run/pipewire-0 - [2] com.canonical.AppMenu.Registrar, org.a11y.Bus, org.freedesktop.Flatpak, org.freedesktop.Notifications, - org.kde.KGlobalSettings, org.kde.StatusNotifierWatcher, org.kde.kconfig.notify - [3] org.freedesktop.Avahi - - ID Branch Op Remote Download - 1. com.obsproject.Studio.Locale stable i flathub < 47.0 kB (partial) - 2. org.kde.KStyle.Adwaita 6.6 i flathub < 8.0 MB - 3. org.kde.Platform.Locale 6.6 i flathub < 380.6 MB (partial) - 4. org.kde.PlatformTheme.QGnomePlatform 6.6 i flathub < 9.7 MB - 5. org.kde.WaylandDecoration.QAdwaitaDecorations 6.6 i flathub < 1.2 MB - 6. org.kde.Platform 6.6 i flathub < 325.0 MB - 7. com.obsproject.Studio stable i flathub < 207.7 MB - - Proceed with these changes to the system installation? [Y/n]: - ``` + ```bash + com.obsproject.Studio permissions: + ipc network pulseaudio wayland + x11 devices file access [1] dbus access [2] + system dbus access [3] + + [1] host, xdg-config/kdeglobals:ro, xdg-run/pipewire-0 + [2] com.canonical.AppMenu.Registrar, org.a11y.Bus, org.freedesktop.Flatpak, org.freedesktop.Notifications, + org.kde.KGlobalSettings, org.kde.StatusNotifierWatcher, org.kde.kconfig.notify + [3] org.freedesktop.Avahi + + ID Branch Op Remote Download + 1. com.obsproject.Studio.Locale stable i flathub < 47.0 kB (partial) + 2. org.kde.KStyle.Adwaita 6.6 i flathub < 8.0 MB + 3. org.kde.Platform.Locale 6.6 i flathub < 380.6 MB (partial) + 4. org.kde.PlatformTheme.QGnomePlatform 6.6 i flathub < 9.7 MB + 5. org.kde.WaylandDecoration.QAdwaitaDecorations 6.6 i flathub < 1.2 MB + 6. org.kde.Platform 6.6 i flathub < 325.0 MB + 7. com.obsproject.Studio stable i flathub < 207.7 MB + + Proceed with these changes to the system installation? [Y/n]: + ``` 6. Якщо відповісти «Y» і натиснути ++enter++, системні дозволи будуть змінені, як зазначено, і встановлено програму. 7. Якщо все піде добре, ви повинні отримати: - ```text - Installation complete. - ``` + ```text + Installation complete. + ``` 8. Тепер у меню «Activities» ви зможете шукати та запускати OBS Studio. diff --git a/docs/desktop/gnome/valuta.de.md b/docs/desktop/gnome/valuta.de.md index bfcf3010dc..88974d4958 100644 --- a/docs/desktop/gnome/valuta.de.md +++ b/docs/desktop/gnome/valuta.de.md @@ -22,19 +22,19 @@ Für diese Anleitung benötigen Sie Folgendes: 1. Gehen Sie zu [Flathub.org] (https://flathub.org), geben Sie `Valuta` in die Suchleiste ein und klicken Sie auf **Install** - ![manual install script and run script](images/valuta-install.png) + ![manual install script and run script](images/valuta-install.png) 2. Kopieren Sie das manuelle Skript in Ihr Terminal: - ```bash - flatpak install flathub io.github.idevecore.Valuta - ``` + ```bash + flatpak install flathub io.github.idevecore.Valuta + ``` 3. Führen Sie anschließend das manuelle Installationsskript in Ihrem Terminal aus: - ```bash - flatpak run flathub io.github.idevecore.Valuta - ``` + ```bash + flatpak run flathub io.github.idevecore.Valuta + ``` ## Wie funktioniert es? @@ -42,7 +42,7 @@ Um `Valuta` zu verwenden, gehen Sie wie folgt vor: 1. Wählen Sie im Dropdown-Menü Ihr Land aus und geben Sie den Betrag ein, den Sie ausgeben möchten. - ![Screenshot of Valuta app showing 1000 USD in the input field, with a grey arrow pointing down to a grey box showing 1000 USD](images/02_valuta.png) + ![Screenshot of Valuta app showing 1000 USD in the input field, with a grey arrow pointing down to a grey box showing 1000 USD](images/02_valuta.png) 2. Wählen Sie aus dem Dropdown-Menü das Land aus, in das Sie reisen. Der umgerechnete Betrag wird automatisch angezeigt. diff --git a/docs/desktop/gnome/valuta.fr.md b/docs/desktop/gnome/valuta.fr.md index 755ff2d7f2..272204d72a 100644 --- a/docs/desktop/gnome/valuta.fr.md +++ b/docs/desktop/gnome/valuta.fr.md @@ -22,19 +22,19 @@ Ce guide suppose que vous disposez de la configuration suivante : 1. Accédez à [Flathub.org](https://flathub.org), tapez `Valuta` dans la barre de recherche et cliquez sur **Install** - ![manual install script and run script](images/valuta-install.png) + ![manual install script and run script](images/valuta-install.png) 2. Copiez le script d'installation manuelle dans un terminal : - ```bash - flatpak install flathub io.github.idevecore.Valuta - ``` + ```bash + flatpak install flathub io.github.idevecore.Valuta + ``` 3. Enfin, exécutez le script d'installation manuelle dans votre terminal : - ```bash - flatpak run flathub io.github.idevecore.Valuta - ``` + ```bash + flatpak run flathub io.github.idevecore.Valuta + ``` ## Mode d'emploi @@ -42,7 +42,7 @@ Pour utiliser le programme `Valuta`, procédez comme suit : 1. Choisissez votre pays dans le menu déroulant et saisissez le montant en espèces que vous souhaitez dépenser. - ![Screenshot of Valuta app showing 1000 USD in the input field, with a grey arrow pointing down to a grey box showing 1000 USD](images/02_valuta.png) + ![Screenshot of Valuta app showing 1000 USD in the input field, with a grey arrow pointing down to a grey box showing 1000 USD](images/02_valuta.png) 2. Choisissez le pays vers lequel vous voyagez dans le menu déroulant. À partir de là, le montant converti apparaît automatiquement. diff --git a/docs/desktop/gnome/valuta.it.md b/docs/desktop/gnome/valuta.it.md index ee7aa92446..2938b0328b 100644 --- a/docs/desktop/gnome/valuta.it.md +++ b/docs/desktop/gnome/valuta.it.md @@ -22,19 +22,19 @@ Questa guida presuppone che si disponga di quanto segue: 1. Andate su [Flathub.org](https://flathub.org), digitate "Valuta" nella barra di ricerca e cliccate su **Installa** - ![manual install script and run script](images/valuta-install.png) + ![manual install script and run script](images/valuta-install.png) 2. Copiare lo script manuale nel terminale: - ```bash - flatpak install flathub io.github.idevecore.Valuta - ``` + ```bash + flatpak install flathub io.github.idevecore.Valuta + ``` 3. Infine, lo script manuale nel terminale: - ```bash - flatpak run flathub io.github.idevecore.Valuta - ``` + ```bash + flatpak run flathub io.github.idevecore.Valuta + ``` ## Guida all'uso @@ -42,7 +42,7 @@ Per utilizzare Valuta, procedere come segue: 1. Scegliete il vostro Paese dal menu a tendina e digitate il denaro che volete spendere. - ![Screenshot of Valuta app showing 1000 USD in the input field, with a grey arrow pointing down to a grey box showing 1000 USD](images/02_valuta.png) + ![Screenshot of Valuta app showing 1000 USD in the input field, with a grey arrow pointing down to a grey box showing 1000 USD](images/02_valuta.png) 2. Selezionare il Paese in cui si viaggia dal menu a discesa. L'importo convertito apparirà automaticamente. diff --git a/docs/desktop/gnome/valuta.uk.md b/docs/desktop/gnome/valuta.uk.md index d6fed5e0e9..62b5aa4f0a 100644 --- a/docs/desktop/gnome/valuta.uk.md +++ b/docs/desktop/gnome/valuta.uk.md @@ -22,19 +22,19 @@ contributors: Steven Spencer, Ganna Zhyrnova 1. Перейдіть на [Flathub.org](https://flathub.org), введіть «Valuta» в рядку пошуку та натисніть **Install** - ![manual install script and run script](images/valuta-install.png) + ![manual install script and run script](images/valuta-install.png) 2. Скопіюйте скрипт у свій термінал: - ```bash - flatpak install flathub io.github.idevecore.Valuta - ``` + ```bash + flatpak install flathub io.github.idevecore.Valuta + ``` 3. Нарешті, скрипт у вашому терміналі: - ```bash - flatpak run flathub io.github.idevecore.Valuta - ``` + ```bash + flatpak run flathub io.github.idevecore.Valuta + ``` ## Як використовувати @@ -42,7 +42,7 @@ contributors: Steven Spencer, Ganna Zhyrnova 1. Виберіть свою країну зі спадного меню та введіть суму готівки, яку хочете витратити. - ![Screenshot of Valuta app showing 1000 USD in the input field, with a grey arrow pointing down to a grey box showing 1000 USD](images/02_valuta.png) + ![Screenshot of Valuta app showing 1000 USD in the input field, with a grey arrow pointing down to a grey box showing 1000 USD](images/02_valuta.png) 2. Виберіть країну, до якої ви подорожуєте, зі спадного меню. Звідти автоматично з’являється конвертована сума. diff --git a/docs/desktop/index.de.md b/docs/desktop/index.de.md index a2aa5a6c58..f204096686 100644 --- a/docs/desktop/index.de.md +++ b/docs/desktop/index.de.md @@ -1,7 +1,7 @@ --- title: Desktop author: Steven Spencer -contributors: null +contributors: --- ## Einleitung diff --git a/docs/desktop/index.fr.md b/docs/desktop/index.fr.md index ac0bd9b547..a1556395c1 100644 --- a/docs/desktop/index.fr.md +++ b/docs/desktop/index.fr.md @@ -1,7 +1,7 @@ --- title: Environnement de Bureau author: Steven Spencer -contributors: null +contributors: --- ## Introduction diff --git a/docs/desktop/index.it.md b/docs/desktop/index.it.md index 8fcce52650..359c745580 100644 --- a/docs/desktop/index.it.md +++ b/docs/desktop/index.it.md @@ -1,7 +1,7 @@ --- title: Desktop author: Spencer Steven -contributors: null +contributors: --- ## Introduzione diff --git a/docs/desktop/index.uk.md b/docs/desktop/index.uk.md index 940d607d3e..bac2918c97 100644 --- a/docs/desktop/index.uk.md +++ b/docs/desktop/index.uk.md @@ -1,7 +1,7 @@ --- title: Робочий стіл author: Steven Spencer -contributors: null +contributors: --- ## Вступ diff --git a/docs/desktop/printing/brother-all-in-one.de.md b/docs/desktop/printing/brother-all-in-one.de.md index 380a2bcf50..f6e37a8694 100644 --- a/docs/desktop/printing/brother-all-in-one.de.md +++ b/docs/desktop/printing/brother-all-in-one.de.md @@ -40,9 +40,9 @@ Es wird ein Softwarefenster geöffnet, das versucht, Druckertreiber zu finden un ## Herunterladen und Installieren der Treiber -Anleitung zur Installation des Brother-Treiberinstallationsskripts:{target="_blank"} +[Anleitung zur Installation des Brother-Treiberinstallationsskripts:](https://support.brother.com/g/b/downloadlist.aspx?&c=us&lang=en&prod=mfcj480dw_us_eu_as&os=127){target="_blank"} -1. Laden Sie das Bash-Skript für den Brother MFC-J480DW-Druckertreiber herunter{target="_blank"} +1. [Laden Sie das Bash-Skript für den Brother MFC-J480DW-Druckertreiber herunter](https://support.brother.com/g/b/downloadtop.aspx?c=us&lang=en&prod=mfcj480dw_us_eu_as){target="_blank"} 2. Öffnen Sie ein Terminalfenster. diff --git a/docs/desktop/printing/brother-all-in-one.fr.md b/docs/desktop/printing/brother-all-in-one.fr.md index 09711cb92d..b861ecd6ec 100644 --- a/docs/desktop/printing/brother-all-in-one.fr.md +++ b/docs/desktop/printing/brother-all-in-one.fr.md @@ -40,9 +40,9 @@ Une fenêtre Logiciel s'ouvre pour tenter de localiser et d'installer les pilote ## Téléchargement et Installation de Pilotes -Brother Driver Installer Script Installation Instructions:{target="_blank"} +[Brother Driver Installer Script Installation Instructions:](https://support.brother.com/g/b/downloadlist.aspx?&c=us&lang=en&prod=mfcj480dw_us_eu_as&os=127){target="_blank"} -1. Download the Brother MFC-J480DW Printer driver bash script{target="_blank"} +1. [Download the Brother MFC-J480DW Printer driver bash script](https://support.brother.com/g/b/downloadtop.aspx?c=us&lang=en&prod=mfcj480dw_us_eu_as){target="_blank"} 2. Ouvrez une fenêtre de terminal. diff --git a/docs/desktop/printing/brother-all-in-one.it.md b/docs/desktop/printing/brother-all-in-one.it.md index a864eb7212..2081d9121f 100644 --- a/docs/desktop/printing/brother-all-in-one.it.md +++ b/docs/desktop/printing/brother-all-in-one.it.md @@ -40,9 +40,9 @@ Si apre una finestra Software che tenta di individuare ed installare i driver de ## Scaricare e installare i drivers -Istruzioni per l'installazione di Brother Driver Installer Script:{target="_blank"} +[Istruzioni per l'installazione di Brother Driver Installer Script:](https://support.brother.com/g/b/downloadlist.aspx?&c=us&lang=en&prod=mfcj480dw_us_eu_as&os=127){target="_blank"} -1. Scaricare lo script di bash per il driver della Brother MFC-J480DW{target="_blank"} +1. [Scaricare lo script di bash per il driver della Brother MFC-J480DW](https://support.brother.com/g/b/downloadtop.aspx?c=us&lang=en&prod=mfcj480dw_us_eu_as){target="_blank"} 2. Aprire la finestra del terminale. diff --git a/docs/desktop/printing/brother-all-in-one.uk.md b/docs/desktop/printing/brother-all-in-one.uk.md index a8b21c65d3..6a8ceb94c4 100644 --- a/docs/desktop/printing/brother-all-in-one.uk.md +++ b/docs/desktop/printing/brother-all-in-one.uk.md @@ -40,9 +40,9 @@ tags: ## Завантаження та встановлення драйверів -Інструкції зі встановлення сценарію встановлення драйвера Brother:{target="_blank"} +[Інструкції зі встановлення сценарію встановлення драйвера Brother:](https://support.brother.com/g/b/downloadlist.aspx?&c=us&lang=en&prod=mfcj480dw_us_eu_as&os=127){target="_blank"} -1. Завантажте сценарій bash для драйвера принтера Brother MFC-J480DW{target="_blank"} +1. [Завантажте сценарій bash для драйвера принтера Brother MFC-J480DW](https://support.brother.com/g/b/downloadtop.aspx?c=us&lang=en&prod=mfcj480dw_us_eu_as){target="_blank"} 2. Відкрийте вікно терміналу. diff --git a/docs/gemstones/containers/docker.it.md b/docs/gemstones/containers/docker.it.md index 19e7592507..fc13178a3e 100644 --- a/docs/gemstones/containers/docker.it.md +++ b/docs/gemstones/containers/docker.it.md @@ -1,7 +1,7 @@ --- title: Installare il Docker Engine -author: wale soyinka -contributors: +author: Wale Soyinka +contributors: Neel Chauhan, Srinivas Nishant Viswanadha, Stein Arne Storslett, Ganna Zhyrnova, Steven Spencer date: 2021-08-04 tags: - docker @@ -9,42 +9,56 @@ tags: # Introduzione -Il Docker Engine può essere utilizzato eseguendo carichi di lavoro per container in stile Docker nativo sui server Rocky Linux. A volte è preferito eseguire l'ambiente Docker Desktop. +Docker Engine può eseguire carichi di lavoro nativi in stile Docker su server Rocky Linux. A volte è preferibile quando si esegue l'ambiente Docker Desktop completo. -## Aggiungere il repository docker +## Aggiungere il repository Docker -Usa l'utilità dnf per aggiungere il repository docker al tuo server Rocky Linux. Digita: +Utilizzare l'utilità `dnf` per aggiungere il repository Docker al server Rocky Linux. Digita: -``` -sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo +```bash +sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo ``` ## Installare i pacchetti necessari -Installare l'ultima versione di Docker Engine, containerd e Docker Compose, digitando: +Installare l'ultima versione di Docker Engine, `containerd` e Docker Compose, eseguendo: -``` -sudo dnf -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin +```bash +sudo dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin ``` -## Avviare e abilitare il servizio docker di systemd (dockerd) +## Avviare e abilitare Docker`(dockerd`) -Usare l'utilità `systemctl` per configurare il demone dockerd in modo che si avvii automaticamente al prossimo riavvio del sistema e contemporaneamente si avvii per la sessione corrente. Digita: +Usare `systemctl` per configurare l'avvio automatico di Docker al riavvio e contemporaneamente avviarlo ora. Digitare: -``` +```bash sudo systemctl --now enable docker ``` +## Consentire facoltativamente a un utente non root di gestire docker -### Note +Aggiungere un utente non root al gruppo `docker` per consentire all'utente di gestire `docker` senza `sudo`. -``` -docker-ce : Questo pacchetto fornisce la tecnologia sottostante per costruire ed eseguire docker containers (dockerd) -docker-ce-cli : Fornisce l'interfaccia a riga di comando (CLI) client docker tool (docker) -containerd. o : Fornisce l' esecuzione del contenitore (runc) -docker-compose-plugin : un plugin che fornisce il sottocomando 'docker compose' +Questo è un passo facoltativo, ma può essere comodo se si è l'utente principale del sistema o se si vuole permettere a più utenti di gestire docker, ma non si vuole concedere loro i permessi `sudo`. +Digitare: + +```bash +# Add the current user +sudo usermod -a -G docker $(whoami) + +# Add a specific user +sudo usermod -a -G docker custom-user ``` +Per assegnare il nuovo gruppo, è necessario uscire e rientrare. Verificare con il comando `id` che il gruppo sia stato aggiunto. +### Note +```docker +docker-ce :Questo pacchetto fornisce la tecnologia di base per la creazione e l'esecuzione di contenitori docker (dockerd) +docker-ce-cli : Fornisce l'interfaccia a riga di comando (CLI) dello strumento docker (docker) +containerd.io : Fornisce il runtime del contenitore (runc) +docker-buildx-plugin : Plugin Docker Buildx per la CLI di Docker +docker-compose-plugin : Un plugin che fornisce il sottocomando "docker compose" +``` diff --git a/docs/gemstones/containers/podman.it.md b/docs/gemstones/containers/podman.it.md new file mode 100644 index 0000000000..d615eb5af3 --- /dev/null +++ b/docs/gemstones/containers/podman.it.md @@ -0,0 +1,128 @@ +--- +title: Podman +author: Neel Chauhan +contributors: Steven Spencer, Ganna Zhyrnova, Christian Steinert +date: 2024-03-07 +tags: + - docker + - podman +--- + +# Introduzione + +[Podman](https://podman.io/) è un runtime alternativo per container compatibile con Docker che, a differenza di quest'ultimo, è incluso nei repository Rocky Linux e può eseguire i container come servizio `systemd`. + +## Installare `Podman` + +Utilizzare l'utility `dnf` per installare Podman: + +```bash +dnf install podman +``` + +## Aggiungere un container + +Prendiamo come esempio una piattaforma cloud self-hosted [Nextcloud](https://nextcloud.com/): + +```bash +podman run -d -p 8080:80 nextcloud +``` + +Verrà richiesto di selezionare il container registry da cui scaricarlo. Nel nostro esempio, si utilizzerà `docker.io/library/nextcloud:latest`. + +Una volta scaricato il contenitore Nextcloud, questo verrà eseguito. + +Inserite **indirizzo_ip:8080** nel vostro browser web (supponendo di aver aperto la porta in `firewalld`) e configurate Nextcloud: + +![Nextcloud in container](../images/podman_nextcloud.png) + +## Eseguire contenitori come servizi `systemd` + +### Utilizzare `quadlet` + +Dalla versione 4.4, Podman viene fornito con [Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html), un generatore di systemd che può generare unitary file per servizi systemd rootless e rootful. + +I file quadlet per i servizi rootful possono essere presenti in + +- `/etc/containers/systemd/` +- `/usr/share/containers/systemd/` + +mentre i file rootless possono essere salvati in alternativa in + +- `$XDG_CONFIG_HOME/containers/systemd/` or `~/.config/containers/systemd/` +- `/etc/containers/systemd/users/$(UID)` +- `/etc/containers/systemd/users/` + +Sono supportati singoli container, pod, immagini, reti, volumi e file kube, ma ritornando all'esempio precedentemente implementato di Nextcloud. Creare un nuovo file `~/.config/containers/systemd/nextcloud.container` con il seguente contenuto: + +```systemd +[Container] +Image=nextcloud +PublishPort=8080:80 +``` + +Sono disponibili [molte altre opzioni](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html#container-units-container). + +Per eseguire il generator e far sapere a systemd che c'è un nuovo servizio da eseguire: + +```bash +systemctl --user daemon-reload +``` + +Per avviare il servizio, eseguire: + +```bash +systemctl --user start nextcloud.service +``` + +!!! note "Nota" + +``` +Se si è già creato un file in una delle directory per i servizi rootful, omettere il flag `--user`. +``` + +Per eseguire automaticamente il container all'avvio del sistema o al login dell'utente, si può aggiungere un'altra sezione al file `nextcloud.container`: + +```systemd +[Install] +WantedBy=default.target +``` + +Poiché i file del servizio generati sono considerati temporanei, non possono essere abilitati da systemd. Per ovviare a questo problema, il generator applica manualmente le installazioni durante la generazione. In questo modo si abilitano effettivamente anche i file dei servizi. + +Sono supportati altri tipi di file: pod, volume, network, image, and kube. [Pods](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html#pod-units-pod), per esempio, può essere usato per raggruppare i container – i servizi systemd generati e le loro dipendenze (creare il pod prima dei container) sono gestiti automaticamente da systemd. + +### Utilizzare `podman generate systemd` + +Podman fornisce inoltre il sottocomando `generate systemd`. Può essere usato per generare i file di servizio di `systemd`. + +!!! warning "Attenzione" + +``` +`generate systemd` è ora deprecato e non riceverà ulteriori funzioni. Si raccomanda l'uso di Quadlet. +``` + +Ora lo si farà con Nextcloud. Eseguire: + +```bash +podman ps +``` + +Si otterrà un elenco di container in esecuzione: + +```bash +04f7553f431a docker.io/library/nextcloud:latest apache2-foregroun... 5 minutes ago Up 5 minutes 0.0.0.0:8080->80/tcp compassionate_meninsky +``` + +Come visto sopra, il nome del nostro container è `compassionate_meninsky`. + +Per creare un servizio `systemd` per il container Nextcloud e abilitarlo al riavvio, eseguire quanto segue: + +```bash +podman generate systemd --name compassionate_meninsky > /usr/lib/systemd/system/nextcloud.service +systemctl enable nextcloud +``` + +Sostituire `compassionate_meninsky` con il nome assegnato al container. + +Quando il sistema si riavvia, Nextcloud si riavvia in Podman. diff --git a/docs/gemstones/gemstone_template.fr.md b/docs/gemstones/gemstone_template.fr.md index e1187043f8..2ca2da46e7 100644 --- a/docs/gemstones/gemstone_template.fr.md +++ b/docs/gemstones/gemstone_template.fr.md @@ -1,8 +1,7 @@ --- title: Modèle de Gemstone author: Erika Mustermann -contributors: - - Liste des contributeurs séparés par une virgule +contributors: [ Liste des contributeurs séparés par une virgule ] tags: - List - Of diff --git a/docs/gemstones/gemstone_template.it.md b/docs/gemstones/gemstone_template.it.md index e3c0320c61..af37a07554 100644 --- a/docs/gemstones/gemstone_template.it.md +++ b/docs/gemstones/gemstone_template.it.md @@ -1,8 +1,7 @@ --- title: Modello di Gemstone semplificato author: Author's Name -contributors: - - Elenco separato da virgole dei collaboratori +contributors: [ Elenco separato da virgole dei collaboratori ] tags: - Lista - Dei diff --git a/docs/gemstones/gemstone_template.uk.md b/docs/gemstones/gemstone_template.uk.md index 350adc9a9b..00e3a3443e 100644 --- a/docs/gemstones/gemstone_template.uk.md +++ b/docs/gemstones/gemstone_template.uk.md @@ -1,8 +1,7 @@ --- title: Простий Gemstone шаблон author: Ім'я автора -contributors: - - Список співавторів, розділених комами +contributors: [ "Список співавторів, розділених комами" ] tags: - List - Of diff --git a/docs/gemstones/git/01-gh_cli_1st_pr.de.md b/docs/gemstones/git/01-gh_cli_1st_pr.de.md index 8f14c26886..1d770e3675 100644 --- a/docs/gemstones/git/01-gh_cli_1st_pr.de.md +++ b/docs/gemstones/git/01-gh_cli_1st_pr.de.md @@ -1,7 +1,7 @@ --- title: Erster Beitrag zur Rocky Linux-Dokumentation über CLI author: Wale Soyinka -contributors: null +contributors: tags: - GitHub - Rocky Linux diff --git a/docs/gemstones/git/01-gh_cli_1st_pr.fr.md b/docs/gemstones/git/01-gh_cli_1st_pr.fr.md index e681b831a1..5958ab0a16 100644 --- a/docs/gemstones/git/01-gh_cli_1st_pr.fr.md +++ b/docs/gemstones/git/01-gh_cli_1st_pr.fr.md @@ -1,7 +1,7 @@ --- title: Première contribution à la documentation de Rocky Linux via CLI author: Wale Soyinka -contributors: null +contributors: tags: - GitHub - Rocky Linux diff --git a/docs/gemstones/git/01-gh_cli_1st_pr.it.md b/docs/gemstones/git/01-gh_cli_1st_pr.it.md index 149cb6b48e..95d685bcf7 100644 --- a/docs/gemstones/git/01-gh_cli_1st_pr.it.md +++ b/docs/gemstones/git/01-gh_cli_1st_pr.it.md @@ -1,7 +1,7 @@ --- title: Primo contributo alla documentazione di Rocky Linux tramite CLI author: Wale Soyinka -contributors: null +contributors: tags: - GitHub - Rocky Linux diff --git a/docs/gemstones/git/01-gh_cli_1st_pr.uk.md b/docs/gemstones/git/01-gh_cli_1st_pr.uk.md index d4a9e0d0fc..850136a294 100644 --- a/docs/gemstones/git/01-gh_cli_1st_pr.uk.md +++ b/docs/gemstones/git/01-gh_cli_1st_pr.uk.md @@ -1,7 +1,7 @@ --- title: Перший внесок у документацію Rocky Linux через CLI author: Wale Soyinka -contributors: null +contributors: tags: - GitHub - Rocky Linux diff --git a/docs/gemstones/git/tracking_and_nontracking_branch.fr.md b/docs/gemstones/git/tracking_and_nontracking_branch.fr.md index 1a2732c298..620d0a4aa0 100644 --- a/docs/gemstones/git/tracking_and_nontracking_branch.fr.md +++ b/docs/gemstones/git/tracking_and_nontracking_branch.fr.md @@ -1,7 +1,7 @@ --- title: Tracking vs Non-Tracking Branch avec Git author: Wale Soyinka -contributors: null +contributors: tags: - git - git branch diff --git a/docs/gemstones/git/tracking_and_nontracking_branch.it.md b/docs/gemstones/git/tracking_and_nontracking_branch.it.md index 597e2bdf25..c9cbbd8338 100644 --- a/docs/gemstones/git/tracking_and_nontracking_branch.it.md +++ b/docs/gemstones/git/tracking_and_nontracking_branch.it.md @@ -1,7 +1,7 @@ --- title: Tracciamento e non tracciamento dei rami in Git author: Wale Soyinka -contributors: null +contributors: tags: - git - git branch diff --git a/docs/gemstones/git/tracking_and_nontracking_branch.uk.md b/docs/gemstones/git/tracking_and_nontracking_branch.uk.md index 4a56c1adfc..7bcad4ad81 100644 --- a/docs/gemstones/git/tracking_and_nontracking_branch.uk.md +++ b/docs/gemstones/git/tracking_and_nontracking_branch.uk.md @@ -1,7 +1,7 @@ --- title: Відстеження та не слідкування за гілками в Git author: Wale Soyinka -contributors: null +contributors: tags: - git - git branch diff --git a/docs/guides/backup/dump_restore.uk.md b/docs/guides/backup/dump_restore.uk.md index ea0bcf516e..df90450a93 100644 --- a/docs/guides/backup/dump_restore.uk.md +++ b/docs/guides/backup/dump_restore.uk.md @@ -2,7 +2,7 @@ title: Команди dump та restore author: tianci li contributors: Steven Spencer -tested_with: 8.1 +tested_with: 8.10 tags: - dump - restore diff --git a/docs/guides/backup/tar.uk.md b/docs/guides/backup/tar.uk.md index 0ede3c7782..877955a600 100644 --- a/docs/guides/backup/tar.uk.md +++ b/docs/guides/backup/tar.uk.md @@ -2,7 +2,7 @@ title: Команда tar author: tianci li contributors: Ganna Zhyrnova -tested_with: 8.1 +tested_with: 8.10 tags: - tar - резервне копіювання diff --git a/docs/guides/containers/podman-nextcloud.it.md b/docs/guides/containers/podman-nextcloud.it.md index fa07a3be08..be7248c831 100644 --- a/docs/guides/containers/podman-nextcloud.it.md +++ b/docs/guides/containers/podman-nextcloud.it.md @@ -37,13 +37,13 @@ La maggior parte dei comandi della guida può essere eseguita manualmente, ma la Ecco tutto ciò che vi serve, o che dovete sapere, per far funzionare questa guida: -* Familiarità con la riga di comando, gli script bash e la modifica dei file di configurazione di Linux. -* Accesso SSH se si lavora su un computer remoto. -* Un editor di testo a riga di comando di vostra scelta. In questa guida utilizzeremo `vi`. -* Una macchina Rocky Linux connessa a Internet (anche in questo caso, un Raspberry Pi può andare bene). -* Molti di questi comandi devono essere eseguiti come root, quindi è necessario avere un utente root o con capacità sudo sulla macchina. -* La familiarità con i server web e MariaDB sarebbe sicuramente utile. -* La familiarità con i container e magari con Docker sarebbe *indubbiamente* un vantaggio ma non è strettamente essenziale. +- Familiarità con la riga di comando, gli script bash e la modifica dei file di configurazione di Linux. +- Accesso SSH se si lavora su un computer remoto. +- Un editor di testo a riga di comando di vostra scelta. In questa guida utilizzeremo `vi`. +- Una macchina Rocky Linux connessa a Internet (anche in questo caso, un Raspberry Pi può andare bene). +- Molti di questi comandi devono essere eseguiti come root, quindi è necessario avere un utente root o con capacità sudo sulla macchina. +- La familiarità con i server web e MariaDB sarebbe sicuramente utile. +- La familiarità con i container e magari con Docker sarebbe *indubbiamente* un vantaggio ma non è strettamente essenziale. ## Passo 01: Installare `podman` e `buildah` @@ -75,7 +75,7 @@ vi /etc/containers/registries.conf Trovate la sezione che assomiglia a quella che vedete qui sotto. Se è commentato, decommentarlo. -``` +```bash [registries.insecure] registries = ['registry.access.redhat.com', 'registry.redhat.io', 'docker.io'] insecure = true @@ -109,7 +109,7 @@ vi Dockerfile Copiare e incollare il seguente testo nel nuovo file Docker. -``` +```docker FROM rockylinux/rockylinux:latest ENV container docker RUN yum -y install epel-release ; yum -y update @@ -137,7 +137,7 @@ vi build.sh Quindi incollare questo contenuto: -``` +```bash #!/bin/bash clear buildah rmi `buildah images -q base` ; @@ -163,10 +163,10 @@ Attendere che sia terminato e passare alla fase successiva. Per gli scopi di questa guida, manteniamo la configurazione del database il più semplice possibile. Si consiglia di tenere traccia dei seguenti elementi e di modificarli se necessario: -* Nome del database: ncdb -* Utente del database: nc-user -* Pass per il database: nc-pass -* L'indirizzo IP del vostro server (di seguito utilizzeremo un IP di esempio) +- Nome del database: ncdb +- Utente del database: nc-user +- Pass per il database: nc-pass +- L'indirizzo IP del vostro server (di seguito utilizzeremo un IP di esempio) Per prima cosa, spostarsi nella cartella in cui si costruirà l'immagine di db-tools: @@ -182,7 +182,7 @@ vi db-create.sh Ora copiate e incollate il seguente codice nel file, utilizzando il vostro editor di testo preferito: -``` +```bash #!/bin/bash mysql -h 10.1.1.160 -u root -p rockylinux << eof create database ncdb; @@ -199,7 +199,7 @@ vi db-drop.sh Copiate e incollate questo codice nel nuovo file: -``` +```bash #!/bin/bash mysql -h 10.1.1.160 -u root -p rockylinux << eof drop database ncdb; @@ -215,7 +215,7 @@ vi Dockerfile Copia e incolla: -``` +```docker FROM localhost/base RUN yum -y install mysql WORKDIR /root @@ -231,7 +231,7 @@ vi build.sh Il codice che si desidera ottenere: -``` +```bash #!/bin/bash clear buildah rmi `buildah images -q db-tools` ; @@ -271,7 +271,7 @@ Ed ecco il codice necessario: Ai fini di questa guida, il seguente script cancellerà tutti i Volumi Podman. Se ci sono altre applicazioni in esecuzione con i propri volumi, modificare/commentare la riga "podman volume rm --all"; -``` +```bash #!/bin/bash clear echo " " @@ -302,7 +302,7 @@ vi db-reset.sh Ed ecco il codice: -``` +```bash #!/bin/bash clear echo " " @@ -322,7 +322,7 @@ vi build.sh With its code: -``` +```bash #!/bin/bash clear buildah rmi `buildah images -q mariadb` ; @@ -332,7 +332,7 @@ buildah images -a Ora create il vostro DockferFile (`vi Dockerfile`) e incollate la seguente singola riga: -``` +```docker FROM arm64v8/mariadb ``` @@ -364,7 +364,7 @@ vi Dockerfile E incollare questo pezzo: -``` +```docker FROM arm64v8/nextcloud ``` @@ -376,7 +376,7 @@ vi build.sh E incollare questo codice: -``` +```bash #!/bin/bash clear buildah rmi `buildah images -q nextcloud` ; @@ -398,7 +398,7 @@ vi run.sh Ecco tutto il codice necessario per farlo. Assicurarsi di cambiare l'indirizzo IP di `MYSQL_HOST` con il container docker su cui è in esecuzione l'istanza di MariaDB. -``` +```bash #!/bin/bash clear echo " " @@ -430,7 +430,7 @@ chmod +x *.sh Per assicurarsi che tutte le immagini siano state costruite correttamente, eseguire `podman images`. Dovrebbe apparire un elenco simile a questo: -``` +```bash REPOSITORY TAG IMAGE ID CREATED SIZE localhost/db-tools latest 8f7ccb04ecab 6 days ago 557 MB localhost/base latest 03ae68ad2271 6 days ago 465 MB @@ -446,13 +446,13 @@ Se tutto sembra corretto, eseguite lo script finale per avviare Nextcloud: Quando si esegue `podman ps -a`, si dovrebbe vedere un elenco di container in esecuzione che assomiglia a questo: -``` +```bash CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9518756a259a docker.io/arm64v8/mariadb:latest mariadbd 3 minutes ago Up 3 minutes ago mariadb 32534e5a5890 docker.io/arm64v8/nextcloud:latest apache2-foregroun... 12 seconds ago Up 12 seconds ago nextcloud ``` -Da qui, si dovrebbe essere in grado di puntare il browser all'indirizzo IP del server. Se state seguendo e avete lo stesso IP del nostro esempio, potete sostituirlo qui (ad esempio, http://your-server-ip) e vedere Nextcloud in funzione. +Da qui, si dovrebbe essere in grado di puntare il browser all'indirizzo IP del server. Se state seguendo e avete lo stesso IP del nostro esempio, potete sostituirlo qui (ad esempio, ) e vedere Nextcloud in funzione. ## Conclusione diff --git a/docs/guides/network/accel-ppp_pppoe_server.fr.md b/docs/guides/network/accel-ppp_pppoe_server.fr.md index 39ac9fb08f..e44c222a7b 100644 --- a/docs/guides/network/accel-ppp_pppoe_server.fr.md +++ b/docs/guides/network/accel-ppp_pppoe_server.fr.md @@ -1,7 +1,7 @@ --- title: accel-ppp – Serveur PPPoE author: Neel Chauhan -contributors: null +contributors: tested_with: 9.3 tags: - réseau diff --git a/docs/guides/network/accel-ppp_pppoe_server.uk.md b/docs/guides/network/accel-ppp_pppoe_server.uk.md index ad480685da..9244edb580 100644 --- a/docs/guides/network/accel-ppp_pppoe_server.uk.md +++ b/docs/guides/network/accel-ppp_pppoe_server.uk.md @@ -1,7 +1,7 @@ --- title: accel-ppp PPPoE Server author: Neel Chauhan -contributors: null +contributors: tested_with: 9.3 tags: - мережа diff --git a/docs/guides/network/glances_network_monitoring.uk.md b/docs/guides/network/glances_network_monitoring.uk.md index e1fc946a0d..7bae8a683d 100644 --- a/docs/guides/network/glances_network_monitoring.uk.md +++ b/docs/guides/network/glances_network_monitoring.uk.md @@ -2,7 +2,7 @@ title: Моніторинг мережі та ресурсів з Glances author: Alex Zolotarov contributors: Steven Spencer -tested_with: 9 +tested_with: 9.0 tags: - моніторинг - мережа diff --git a/docs/guides/proxies/i2pd.uk.md b/docs/guides/proxies/i2pd.uk.md index 921a4a9490..f3f4b76325 100644 --- a/docs/guides/proxies/i2pd.uk.md +++ b/docs/guides/proxies/i2pd.uk.md @@ -1,7 +1,7 @@ --- title: Анонімна мережа i2pd author: Neel Chauhan -contributors: null +contributors: tested_with: 9.3 tags: - proxy diff --git a/docs/release_notes/10_0.de.md b/docs/release_notes/10_0.de.md new file mode 100644 index 0000000000..5cf8a9ff40 --- /dev/null +++ b/docs/release_notes/10_0.de.md @@ -0,0 +1,282 @@ +--- +title: Aktuelle Version 10 +tags: + - 10 + - 10.0 Version + - Rocky Linux 10 +--- + +## Rocky Linux 10 + +Rocky Linux 10 (RL 10) ist die neueste Hauptversion des Enterprise-Betriebssystems von Rocky Linux. + +### Upgrade auf Rocky Linux 10 + +Rocky Linux unterstützt keine Upgrades auf Hauptversionen. Um von 8.x oder 9.x auf Rocky Linux 10 zu wechseln, sollten Sie eine Neuinstallation des Betriebssystems durchführen. + +### Neue Funktionen und Änderungen + +In den folgenden Abschnitten werden ausgewählte Funktionen von RL 10 beschrieben. + +Wie bei allen wichtigen Rocky Linux-Versionen umfasst diese Versionsnotiz zahlreiche Verbesserungen, Änderungen und neue Funktionen. + +Die folgende Übersicht hebt Änderungen in den folgenden Kategorien hervor: Architektur, Kernel, Installation, Netzwerk, Sicherheit, Virtualisierung, Container, Speicher und Paketverwaltung. Hier werden die Funktionen ausgewählt, die für einen allgemeinen Anwenderkreis am wahrscheinlichsten relevant sind. + +Eine vollständige Liste der wichtigsten Änderungen finden Sie in der Upstream-Liste [hier](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/10/html/10.0_release_notes/overview#overview-major-changes). + +### Unterstützte Architekturen + +!!! warning "Bitte überprüfen Sie die CPU-Kompatibilität" + + Auf der x86_64-Prozessorarchitektur unterstützt RL 10 keine Hardware der Mikroarchitekturebene x86-64-v2 und früher mehr und legt die Mikroarchitekturebene x86-64-v3 als Basis für die Verteilung fest. + Weitere Informationen finden Sie im Abschnitt [Unterstützte Mikroarchitekturebenen](#supported-microarchitecture-levels), insbesondere im Abschnitt zum Testen der CPU-Kompatibilität. + +!!! info "Einstellung der 32-Bit-Pakete" + + Rocky Linux 10 hat die 32-Bit-Kompatibilität für x86_64 entfernt. Verwenden Sie stattdessen 64-Bit-Bibliotheken oder Container mit 32-Bit-Abhängigkeiten. + +Rocky Linux 10 wird auf den folgende Prozessorarchitekturen unterstützt: + +- 64-bit AMD/Intel x86-64-v3 (x86_64) +- 64-bit RISC-V (riscv64) +- 64-bit ARMv8.0-A (aarch64) +- IBM POWER9, little endian (ppc64le) +- IBM z14 (s390x) + +#### Brandneue Unterstützung für die RISC-V-Architektur + +Das Rocky Linux Release Engineering-Team hat lange und hart daran gearbeitet, Rocky Linux 10 auf bestimmte RISC-V-Implementierungen zu bringen. +Zu den am Veröffentlichungstag unterstützten Plattformen/Subsystemen gehören StarFive VisionFive 2 (VF2), **QEMU** und SiFive HiFive Premier P550. + +Weitere Einzelheiten zu diesem Meilenstein, einschließlich der RISC-V-Unterstützung von RL10, finden Sie auf [dieser Site](https://rockylinux.org/news/rockylinux-support-for-riscv). + +#### Unterstützte Mikroarchitekturebenen + +Die x86-64-v3-Mikroarchitektur basiert auf dem Funktionsumfang der Intel Haswell-Prozessorgeneration. Eine Handvoll Intel Atom-Prozessoren (wie die Prozessoren der Gracemont-Familie) unterstützen x86-64-v3. Im Gegensatz dazu bieten andere, darunter Prozessoren der Intel Atom Parker Ridge-Familie und der Prozessor der Intel Atom x6416RE Elkhart Lake-Familie, keine x86-64-v3-Funktionen und werden daher in RL 10 nicht unterstützt. Wenn Sie an der Kompatibilität Ihres Prozessors zweifeln, können Sie dies [mit diesem Verfahren](https://docs.rockylinux.org/gemstones/test_cpu_compat/) überprüfen. + +AMDs Implementierung der Mikroarchitekturebene x86-64-v3, die als Grundlage für Rocky Linux 10 auf x86_64 dient, wurde mit der Excavator-Mikroarchitektur eingeführt. Dies bedeutet, dass Prozessoren, die älter sind als die auf der Excavator-Architektur basierenden, möglicherweise nicht vollständig von Rocky Linux 10 unterstützt werden. + +!!! note "Raspberry Pi-Images-Unterschiede" + + Der Hauptunterschied zwischen den Rocky Linux Pi-Images für Version 10 besteht darin, dass 10 Pi 4 und Pi 5 unterstützt, während 9 Pi 3, Pi 4, Pi 5 und Pi Zero 2W unterstützt. + +### Installation und Image-Erstellung + +Anaconda, die interaktive grafische Benutzeroberfläche für das Rocky Linux-Installationsprogramm, weist in Version 10 eine Reihe von Änderungen auf. + +Zu den wichtigsten Änderungen gehören folgende: + +- Die standardmäßige Deaktivierung des Root-Kontos. Für die Systemverwaltung ist die Erstellung eines Administratorbenutzers mit vollständigen sudo-Berechtigungen erforderlich. Wenn Sie das Root-Konto durch Festlegen seines Kennworts aktivieren, können Sie Standardbenutzer ohne Administratorrechte erstellen. +- Remote Desktop Protocol (RDP) ersetzt VNC für den grafischen Fernzugriff während des Installationsvorgangs. Diese Änderung betrifft die dazugehörigen Kernel-Bootoptionen. +- Entfernen der Zeitzonenkarte im Abschnitt „Uhrzeit und Datum“ des Installationsprogramms. +- Die grafische Benutzeroberfläche unterstützt das Hinzufügen von Drittanbieter-Repositorys während der Erstinstallation nicht mehr. Verwenden Sie stattdessen die Boot-Option `inst.addrepo` oder Kickstart. +- Entfernung der Dokumentation, die zum Zeitpunkt der Installation verfügbar war. + +### Kernel + +Der standardmäßige Out-of-Box-Kernel für RL 10 wurde auf Version 6.12.0 aktualisiert. + +Einige Kernelfunktionen sind jetzt deaktiviert, da sie nicht mehr gewartet werden, unsicher oder veraltet sind. + +Das Kernel-Befehlszeilenargument `rh_waived` kann diese Funktionen bei Bedarf aktivieren. Earliest Eligible Virtual Deadline First (EEVDF), das latenzempfindliche Aufgaben mit kürzeren Zeitscheiben priorisiert, um die Reaktionsfähigkeit zu verbessern, ersetzt den CFS-Scheduler. + +### Netzwerk + +Zu den Verbesserungen der Netzwerkfunktionen in RL 10 gehören Änderungen an der Netzwerkkonfiguration, der Netzwerkschnittstellenaggregation, DHCP-Clients und -Servern sowie Ergänzungen und Entfernungen von Gerätetreibern. + +#### NetworkManager und Netzwerk-Scripte + +Die alten `ifcfg-rh`-Netzwerkskripte wurden in früheren Versionen von Rocky Linux (9.x) nicht mehr unterstützt. Mit Rocky Linux 10 sind diese Skripte nicht mehr verfügbar. + +Sie müssen nun den NetworkManager verwenden. Zu diesen Tools gehören `nmcli`, `nmtui` und `nmstate`. Dies bedeutet, dass einige ältere Dateien und Befehle nicht mehr funktionieren und sich auch der Speicherort Ihrer Netzwerkkonfigurationsdateien geändert hat. + +- Dateien mit dem Präfix `ifcfg-` im Verzeichnis /etc/sysconfig/network-scripts/ werden nicht unterstützt. +- Die Befehle `ifup` und `ifdown` sind nicht mehr verfügbar. +- Ältere Netzwerkskripte wie `ifup-local` werden nicht mehr unterstützt. +- Netzwerkkonfigurationsdateien werden im Ordner /etc/NetworkManager/system-connections/ gespeichert. + +#### DHCP Client und Server + +Die Implementierung des DHCP-Clients in RL 10 erfolgt über ein internes Subsystem von NetworkManager. Das alte dhcp-Client-Paket wurde entfernt und wird vom Upstream nicht mehr unterstützt. + +Kea DHCP ersetzt den veralteten ISC DHCP-Server in RL 10. + +#### Netzwerk-Bonding und Teaming + +In früheren Versionen von Rocky Linux wurde das NIC-Teaming-Feature obsolet. In RL 10 wird dies nun vollständig entfernt. Konfigurieren Sie als Ersatz eine Bond-Verbindung anstelle eines Netzwerkteams. + +### Speicher + +Zusätzlich zu den folgenden Änderungen werden mehrere speicher-bezogene Gerätetreiber zu RL 10 hinzugefügt, aktualisiert oder daraus entfernt. + +#### Global File System 2 (GFS2) + +RL 10 unterstützt das GFS2-Dateisystem nicht mehr. + +#### Device Mapper Multipath + +Die Aktivierung von Device Mapper (DM) Multipath auf NVMe-Geräten wird von RL 10 nicht unterstützt. + +#### LUKS2-Festplatten-Verschlüsselung + +Das Cryptsetup-Paket wurde auf Version 2.7 umgestellt, um Probleme zu beheben und LUKS-verschlüsselte Geräte bei Verwendung des Kernel-Dump-Dienstes (kdump) zu unterstützen. + +### Sicherheit-Features + +Mit RL 10 werden zahlreiche neue sicherheitsrelevante Funktionen eingeführt. + +Zu den Updates gehören unter anderem: + +- Systemweite kryptografische Richtlinien (crypto-policies): OpenSSL und OpenSSH arbeiten jetzt mit Post-Quantum Cryptography (PQC). +- Sequoia PGP: Eine speicherfreie Implementierung von OpenPGP. +- OpenSSH: Die Wiederherstellung strengerer SSH-Hostschlüsselberechtigungen. (Neue Berechtigungen = 0600 vs. alte Berechtigungen = 0640). +- GnuTLS: Client- und Server-Zertifikate sind jetzt komprimiert +- yescrypt-Algorithmus: Der Passwort-Algorithmus für den Standardbenutzer wird geändert. + +Zu den neuen SELinux-Änderungen gehören die folgenden Updates: + +- Die Äquivalenz des Dateikontexts wird in /var/run = /run umgekehrt. +- Das Hinzufügen neuer libvirt-Diensttypen zur SELinux-Richtlinie. + +### Virtualisierung + +Bei der Virtualisierung kommt es zu wichtigen Änderungen: + +- Der monolithische libvirtd-Daemon ist veraltet. Verwenden Sie als Ersatz die modularen Daemons und Sockets. Eine ausführliche Dokumentation zu den Unterschieden finden Sie in der [Upstream-Dokumentation](https://libvirt.org/daemons.html#monolithic-vs-modular-daemons) +- Der virtuelle Maschinentyp i440fx ist nun obsolet +- Virtual Machine Manager ist nun obsolet, Cockpit ist der vorgesehene Ersatz + +### Container + +Podman 5 in RL 10 führt mehrere Verbesserungen ein, darunter die neue Standard-Container-Laufzeitumgebung `crun`, die `runc` ersetzt. Control Groups v2 ist jetzt die Standard-cgroup-Version. + +Zu den wichtigsten Updates gehören die Abschaffung des Netzwerkmodus slirp4netns, die Möglichkeit, Wiederholungsversuche und Verzögerungen für Push- und Pull-Vorgänge von Images zu konfigurieren, sowie umfassende Unterstützung für Container-Images mit mehreren Architekturen. + +Darüber hinaus unterstützt Podman 5 weiterhin Quadlets, eine in Podman 4.4 eingeführte Funktion, die die Verwaltung von Podman-Containern mit „systemd“ unter Verwendung deklarativer Unit-Dateien ermöglicht. + +### Softwareverwaltung + +RPM liegt jetzt in der Version 4.19 vor, die Verbesserungen und Aktualisierungen für Verpackungs- und Erstellungstools enthält. Es wurde ein neuer Befehl \`rpmsort eingeführt, um RPM-Versionszeichenfolgen in Ausgabepipelines korrekt zu sortieren. Als Beispiel: + +Das Alte `sort`: `rpm -q kernel | sort`\ +kernel-6.12.0-130.el10.x86_64\ +kernel-6.12.0-13.el10.x86_64 + +Das neue `rpmsort`: `rpm -q kernel | rpmsort`\ +kernel-6.12.0-13.el10.x86_64\ +kernel-6.12.0-130.el10.x86_64 + +#### DNF + +Standardmäßig unterlässt DNF jetzt das Herunterladen von Metadaten der Repository-Dateiliste, wodurch die Reaktionsfähigkeit verbessert und Speicherplatz gespart wird. DNF-Befehle, die diese Metadaten benötigen, laden sie im Allgemeinen automatisch herunter. + +#### Modularität + +Die DNF-Modularität ist obsolet und Rocky Linux beabsichtigt nicht, AppStream-Inhalte als Module in RL 10 bereitzustellen. In Zukunft könnte RL 10 zusätzliche Anwendungsversionen als RPM-Pakete, Software-Kollektionen oder Flatpaks bereitstellen. + +Mit anderen Worten: Der Befehl `dnf module` wurde in RL 10 abgeschafft, da der DNF-Paketmanager der nächsten Generation (`dnf5`) die API vereinheitlicht hat und sich nicht mehr auf die alte modulare Architektur verlässt, um mehrere Versionen der Software zu verwalten. Die relevanten Vergleiche sind folgende: + +| Beschreibung | Alt (`dnf module`) | Neu | +| :-----------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :---------------------------- | +| Verfügbare Versionen anzeigen | `dnf module list ` | `dnf repoquery ` | +| Installation einer bestimmten Version | `dnf module enable nginx:1.14 && dnf module install nginx:1.14` | `dnf install nginx-1.26.3` | +| Löschen einer bestimmten Version | `dnf -y module remove --all :` oder `dnf -y module remove --all :/` | `dnf remove -` | +| Wechseln zu einer bestimmten Version | `dnf -y module remove --all : && dnf module reset && dnf module enable :` | Nicht relevant | + +### Desktop-Umgebung + +In RL 10 ersetzt Wayland den X.Org-Server. Xwayland unterstützt die meisten X11-Clients, die noch nicht auf Wayland portiert wurden. Einige Desktopanwendungen und -komponenten werden in RL 10 ebenfalls ersetzt. + +#### Änderungen an Desktop-Komponenten + +| Entfernt | Ersetzt durch | +| :-------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------- | +| gedit text editor | GNOME Text-Editor (gnome-text-editor) | +| Tweaks-Applikation | Verwenden Sie die Tweaks-Optionen in den GNOME-Einstellungen und/oder verwenden Sie das Flatpak auf Flathub | +| Festival Speech Synthesizer | Espeak NG | +| Eye of GNOME (eog) image viewer | GNOME Image-Viewer (loupe) | +| Cheese camera-Applikation | Snapshot-Applikation | +| GNOME Terminal | ptyxis-Terminal | +| PulseAudio-Daemon (aber nicht die Client-Schnittstellen) | Pipewire (war bereits in RL 9 der Standard) | + +Mehrere grafische Desktop-Anwendungen sind nicht mehr in der Rocky Linux 10-Distribution enthalten. In den meisten Fällen können Sie diese Anwendungen aus Upstream-Quellen oder als Flatpak auf Flathub beziehen. + +#### Entfernte Anwendungen + +| Entfernt | Ersatz | +| :------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| LibreOffice Office productivity Software Suite | Offiziell als Flatpak auf Flathub bereitgestellt, oder Sie können Upstream-Pakete von [https://www.libreoffice.org/](https://www.libreoffice.org/) herunterladen. | +| Evolution Personal Information Manager und E-Mail-Client | Thunderbird wird über das Appstream-Repository bereitgestellt. Sie können auch ein Flatpak oder Paket von Upstream oder über Flathub erhalten. | +| Inkscape Vector Graphics Editor | In RL 10 ist kein Vektorgrafik-Editor enthalten, aber Sie finden ein Flatpak auf Flathub. | +| Totem (GNOME Videos) media player | In RL 10 ist kein standardmäßiger Desktop-Mediaplayer enthalten. Der Webbrowser kann weiterhin webbasierte Medien abspielen. Alternativ können Sie einen anderen Mediaplayer aus Drittanbieter-Repositories oder als Flatpak von Flathub auswählen. | + +TigerVNC wurde aus RL 10 entfernt. Verwenden Sie für die VNC-Client-Funktionalität die Anwendung „Connections“. Es ist kein VNC-Server vorhanden.\ +`gnome-remote-desktop` ersetzt TigerVNC mithilfe von RDP für Desktop-Sharing, Remote-Login und Headless-Sitzungen. Dies ist in GNOME integriert und Sie können es in der Anwendung `Settings` konfigurieren. + +Die Desktopumgebung und das Toolkit von Motif X11 werden ebenfalls aus RL 10 entfernt. + +### Infrastruktur-Dienste + +Der Austausch oder die Entfernung einiger Dienste und Pakete in RL 10 umfasst die folgenden Infrastrukturdienste. + +| Entfernt | Ersetzt durch | +| :--------------------------------- | :----------------------------------------------------------------------------------------------------------------- | +| power-profiles-daemon CPU throttle | „tuned-ppd“-Übersetzungsebene, die Anwendungen unterstützt, die für den „Power-Profiles-Daemon“ geschrieben wurden | +| redis in-memory key-value database | `valkey` (ein Fork von Redis) In-Memory-Schlüsselwertdatenbank ^1 | +| sendmail mail transfer agent | Rocky Linux empfiehlt die Migration zum Postfix Mail Transfer Agent. | +| spamassassin email spam filter | Der E-Mail-Spamfilter `spamassassin` befindet sich jetzt im EPEL-Repository. | + +1 Zusätzlich zu `valkey` befindet sich das Paket `valkey-compat-redis` im Plus-Repository. + +### Dynamische Programmiersprachen + +Es gibt Updates für aktuelle Versionen mehrerer beliebter Programmiersprachen: + +- Python 3.12 +- Ruby 3.3 +- Node.js 22.13 +- Perl 5.40 +- PHP 8.3 + +### Web-Servers und Datenbank-Servers + +Für viele beliebte Server-Daemons gibt es Updates auf neuere Versionen: + +#### Web-Server + +- Apache HTTP Server 2.4.63 +- nginx 1.26 + +#### Proxy-Caching-Server + +- Varnish Cache 7.6 +- Squid 6.10 + +#### Datenbank-Server + +- MariaDB 10.11 +- MySQL 8.4 +- PostgreSQL 16.8 +- Valkey 8.0 + +### RL Web-Konsole (Cockpit) + +Cockpit ist eine webbasierte Schnittstelle zur Verwaltung und Überwachung Ihres lokalen Systems. Ein grafischer Dateimanager und ein Texteditor sind jetzt in der Webkonsole verfügbar, wenn Sie das RPM-Paket `cockpit-files` installieren. + +Der Host-Switcher, der die gleichzeitige Verwaltung mehrerer Systeme ermöglichte, ist obsolet und aus Sicherheitsgründen standardmäßig deaktiviert. + +Cockpit unterstützt nun die Konfiguration von Größenbeschränkungen für das Stratis-Dateisystem. + +## Bekannte Probleme + +### SELinux-Issue mit virtuellen Hosts + +Wenn Sie einen virtuellen Host mit aktiviertem `passt`-Backend und dem Typ `memfd` für den Speicher verwenden, kann die Schnittstelle nicht gestartet werden, sofern SELinux aktiviert ist. Weitere Informationen finden Sie unter [diesem Upstream-Issue](https://issues.redhat.com/browse/RHEL-80407). + +### Grauer Bildschirm nach dem Booten vom Installationsmedium + +Mit bestimmten Hardwarekonfigurationen, beispielsweise virtualisierten Umgebungen mit aktivierter 3D-Grafik, kann es vorkommen, dass Anaconda hängt, bevor der Setup-Assistent angezeigt wird. Dieses Problem sollte gelöst werden können, indem Sie von tty6 zu einem anderen TTY und dann wieder zurück zu tty6 wechseln. Wechseln Sie beispielsweise mit ++Strg+Alt+F1++ und dann ++Strg+Alt+F6++ zu tty1 und zurück zu tty6. + +## Mitmachen und Fehler melden + +Bitte melden Sie alle Fehler, auf die Sie gestoßen sind, dem [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Wir heißen Sie auch herzlich willkommen, unserer Community beizutreten, sei es in unseren [Foren](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC auf Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailinglisten](https://lists.resf.org), oder auf welche andere Art auch immer Sie teilnehmen möchten! diff --git a/docs/rocky_insights/blogs/index.de.md b/docs/rocky_insights/blogs/index.de.md index f12308c6de..f5a99359e6 100644 --- a/docs/rocky_insights/blogs/index.de.md +++ b/docs/rocky_insights/blogs/index.de.md @@ -1,7 +1,7 @@ --- title: Einleitung author: Steven Spencer -contributors: null +contributors: --- ## Warum dieser Abschnitt? diff --git a/docs/rocky_insights/blogs/index.fr.md b/docs/rocky_insights/blogs/index.fr.md index 1c828b614e..e3e8d48eb3 100644 --- a/docs/rocky_insights/blogs/index.fr.md +++ b/docs/rocky_insights/blogs/index.fr.md @@ -1,7 +1,7 @@ --- title: Introduction author: Steven Spencer -contributors: null +contributors: --- ## Pourquoi cette rubrique ? diff --git a/docs/rocky_insights/blogs/index.it.md b/docs/rocky_insights/blogs/index.it.md index 37fa53d6e2..0a383c8df6 100644 --- a/docs/rocky_insights/blogs/index.it.md +++ b/docs/rocky_insights/blogs/index.it.md @@ -1,7 +1,7 @@ --- title: Introduzione author: Spencer Steven -contributors: null +contributors: --- ## Perché questa sezione? diff --git a/docs/rocky_insights/blogs/index.uk.md b/docs/rocky_insights/blogs/index.uk.md index 62367b44a3..0bb418b1a0 100644 --- a/docs/rocky_insights/blogs/index.uk.md +++ b/docs/rocky_insights/blogs/index.uk.md @@ -1,7 +1,7 @@ --- title: Вступ author: Steven Spencer -contributors: null +contributors: --- ## Чому цей розділ? diff --git a/docs/rocky_insights/blogs/index.zh.md b/docs/rocky_insights/blogs/index.zh.md index 109807f893..48722e5224 100644 --- a/docs/rocky_insights/blogs/index.zh.md +++ b/docs/rocky_insights/blogs/index.zh.md @@ -1,7 +1,7 @@ --- title: 介绍 author: Steven Spencer -contributors: null +contributors: --- ## 为什么有这个部分? diff --git a/docs/rocky_insights/links/sigs/index.de.md b/docs/rocky_insights/links/sigs/index.de.md index 14495e8307..be5d0947d8 100644 --- a/docs/rocky_insights/links/sigs/index.de.md +++ b/docs/rocky_insights/links/sigs/index.de.md @@ -1,7 +1,7 @@ --- title: Special Interest Groups author: Steven Spencer -contributors: null +contributors: --- - Alternative Architektur [SIG/AltArch](https://sig-altarch.rocky.page) diff --git a/docs/rocky_insights/links/sigs/index.fr.md b/docs/rocky_insights/links/sigs/index.fr.md index 17f3311dfe..27e540cbcf 100644 --- a/docs/rocky_insights/links/sigs/index.fr.md +++ b/docs/rocky_insights/links/sigs/index.fr.md @@ -1,7 +1,7 @@ --- title: Groupes d'Intérêts Spéciaux author: Steven Spencer -contributors: null +contributors: --- - Architecture Alternative [SIG/AltArch](https://sig-altarch.rocky.page) diff --git a/docs/rocky_insights/links/sigs/index.it.md b/docs/rocky_insights/links/sigs/index.it.md index 0a17d0eae7..9de6dcd5ae 100644 --- a/docs/rocky_insights/links/sigs/index.it.md +++ b/docs/rocky_insights/links/sigs/index.it.md @@ -1,7 +1,7 @@ --- title: Special Interest Groups author: Spencer Steven -contributors: null +contributors: --- - Architetture Alternative [SIG/AltArch](https://sig-altarch.rocky.page) diff --git a/docs/rocky_insights/links/sigs/index.pt.md b/docs/rocky_insights/links/sigs/index.pt.md index 333430be55..48f433e8b7 100644 --- a/docs/rocky_insights/links/sigs/index.pt.md +++ b/docs/rocky_insights/links/sigs/index.pt.md @@ -1,7 +1,7 @@ --- title: Grupo de Interesse Especial (SIG) author: Steven Spencer -contributors: null +contributors: --- - Arquitetura Alternativa [SIG/AltArch](https://sig-altarch.rocky.page) diff --git a/docs/rocky_insights/links/sigs/index.uk.md b/docs/rocky_insights/links/sigs/index.uk.md index 8ff2ffb60f..7ed4d321ca 100644 --- a/docs/rocky_insights/links/sigs/index.uk.md +++ b/docs/rocky_insights/links/sigs/index.uk.md @@ -1,7 +1,7 @@ --- title: Групи по інтересам author: Steven Spencer -contributors: null +contributors: --- - Альтернативна архітектура [SIG/AltArch](https://sig-altarch.rocky.page) diff --git a/docs/rocky_insights/links/sigs/index.zh.md b/docs/rocky_insights/links/sigs/index.zh.md index 54ebf13536..2730c70a05 100644 --- a/docs/rocky_insights/links/sigs/index.zh.md +++ b/docs/rocky_insights/links/sigs/index.zh.md @@ -1,7 +1,7 @@ --- title: 特别兴趣小组(SIG) author: Steven Spencer -contributors: null +contributors: --- - 新架构 [SIG/AltArch](https://sig-altarch.rocky.page) From 937e8799a08da3b9ad81913f8e06a012b8b4f8aa Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Sat, 12 Jul 2025 14:27:34 -0500 Subject: [PATCH 059/164] editing `apache-sites-enabled.md` (#2776) * fix typo * add admonition warning on cipher suite use --- docs/guides/web/apache-sites-enabled.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/guides/web/apache-sites-enabled.md b/docs/guides/web/apache-sites-enabled.md index 43afdfff6c..e41d0b849e 100644 --- a/docs/guides/web/apache-sites-enabled.md +++ b/docs/guides/web/apache-sites-enabled.md @@ -207,7 +207,7 @@ Next, you need to define the `https` part of the configuration file: ServerAdmin username@rockylinux.org Redirect / https://your-server-hostname/ - + ServerName your-server-hostname ServerAdmin username@rockylinux.org DocumentRoot /var/www/sub-domains/your-server-hostname/html @@ -240,6 +240,10 @@ Next, you need to define the `https` part of the configuration file: ``` +!!! warning "A note on cipher suites" + + This document was originally written for Rocky Linux 8. A **great deal** has changed since then. For one thing, you might want to leave out the `SSLHonorCipherOrder on` and `SSLCipherSuite` lines completely and let the server's default configuration pick that up. If you maintain an updated server (in other words, you run `dnf upgrade` routinely), then this should handle the security and update of the cipher suites without separate configuration manipulation. In this way, you will avoid using deprecated or dangerous cipher suites in your configuration. If for some reason you **need** to manipulate these in your configuration, research your entries carefully. + So, breaking down this configuration further, after the normal portions of the configuration and down to the SSL/TLS section: * SSLEngine on - says to use SSL/TLS From 67fc203e403003c07f9b900e21164a977326903c Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:13:35 -0700 Subject: [PATCH 060/164] New Crowdin updates (#2779) * New translations cloud_server_using_nextcloud.md (Ukrainian) * New translations generating_ssl_keys_lets_encrypt.md (Ukrainian) * New translations chyrp_lite.md (Ukrainian) --- docs/guides/cms/chyrp_lite.uk.md | 2 +- docs/guides/cms/cloud_server_using_nextcloud.uk.md | 8 ++++---- .../security/generating_ssl_keys_lets_encrypt.uk.md | 5 ++--- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/docs/guides/cms/chyrp_lite.uk.md b/docs/guides/cms/chyrp_lite.uk.md index dd4d6d3c3e..b7276576ed 100644 --- a/docs/guides/cms/chyrp_lite.uk.md +++ b/docs/guides/cms/chyrp_lite.uk.md @@ -68,7 +68,7 @@ systemctl enable --now caddy !!! note "Примітка" ``` -Якщо ви використовуєте Rocky Linux 8.x, замініть вісім біля випуску в рядку встановлення пакета Remi. +Якщо ви використовуєте Rocky Linux 8.x або 10.х, замініть "8" або "10" біля випуску в рядку встановлення пакета Remi. ``` Щоб встановити PHP, вам знадобиться репозиторій Remi. Щоб встановити репозиторій Remi, виконайте наступне: diff --git a/docs/guides/cms/cloud_server_using_nextcloud.uk.md b/docs/guides/cms/cloud_server_using_nextcloud.uk.md index 26c275e540..d0f2d54014 100644 --- a/docs/guides/cms/cloud_server_using_nextcloud.uk.md +++ b/docs/guides/cms/cloud_server_using_nextcloud.uk.md @@ -10,9 +10,9 @@ tags: # Хмарний сервер за допомогою Nextcloud -!!! примітка "Примітка щодо Rocky Linux 9.0" +!!! note "Примітка щодо Rocky Linux 9.x або 10.x" - Ця процедура має працювати для Rocky Linux 9.x. Різниця полягає в тому, що вам може знадобитися змінити посилання на версії для деяких репозиторіїв, щоб оновити їх до версії 9. Якщо ви використовуєте Rocky Linux 9.x, майте на увазі, що це було протестовано як у 8.6, так і в 9.0, але спочатку було написано для 8.6. + Ця процедура має працювати для Rocky Linux 9.x або 10.x. Різниця полягає в тому, що вам може знадобитися змінити посилання на версії для деяких репозиторіїв, щоб оновити їх до версії 9 або 10. Якщо ви використовуєте Rocky Linux 9.x або 10.x, майте на увазі, що це було протестовано як у 8.6, так і в 9.0, але спочатку було написано для 8.6. ## Передумови та припущення @@ -49,7 +49,7 @@ Nextcloud пропонує хмару з відкритим вихідним к dnf install epel-release ``` -Щоб встановити репозиторій Remi, запустіть (зверніть увагу, якщо ви використовуєте Rocky Linux 9.x, замініть 9 поруч із `release-` нижче): +Щоб встановити репозиторій Remi, запустіть (зверніть увагу, якщо ви використовуєте Rocky Linux 9.x або 10.x, замініть 9 або 10 поруч із `release-` нижче): ```bash dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm @@ -63,7 +63,7 @@ dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm dnf module list php ``` -який дає вам такий вихід для Rocky Linux 8.x (подібний результат буде показано для Rocky Linux 9.x): +який дає вам такий вихід для Rocky Linux 8.x (подібний результат буде показано для Rocky Linux 9.x або 10.x): ```bash Rocky Linux 8 - AppStream diff --git a/docs/guides/security/generating_ssl_keys_lets_encrypt.uk.md b/docs/guides/security/generating_ssl_keys_lets_encrypt.uk.md index a42a3030b1..ae1db049a3 100644 --- a/docs/guides/security/generating_ssl_keys_lets_encrypt.uk.md +++ b/docs/guides/security/generating_ssl_keys_lets_encrypt.uk.md @@ -171,7 +171,7 @@ IMPORTANT NOTES: ServerAdmin username@rockylinux.org Redirect / https://your-server-hostname/ - + ServerName your-server-hostname ServerAdmin username@rockylinux.org DocumentRoot /var/www/sub-domains/com.yourdomain.www/html @@ -185,8 +185,7 @@ IMPORTANT NOTES: SSLEngine on SSLProtocol all -SSLv2 -SSLv3 -TLSv1 SSLHonorCipherOrder on - SSLCipherSuite EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384 -:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS + SSLCipherSuite EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS SSLCertificateFile /etc/letsencrypt/live/your-server-hostname/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/your-server-hostname/privkey.pem From 4d8df2e7f03580ef4d2a5be41c710d0050e3b2dd Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Sun, 13 Jul 2025 17:26:49 -0500 Subject: [PATCH 061/164] Link change in reference (#2781) * fixed with this update --- docs/guides/email/02-basic-email-system.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/email/02-basic-email-system.md b/docs/guides/email/02-basic-email-system.md index b5b555a9bf..c1d03b781f 100644 --- a/docs/guides/email/02-basic-email-system.md +++ b/docs/guides/email/02-basic-email-system.md @@ -584,7 +584,7 @@ The file description is as follows: - Load other configuration files via `!include conf.d/*.conf`. - The numeral prefix of the sub-configuration file facilitates human understanding of its parsing order. - Due to historical reasons, some config files are still separate, typically named `*.conf.ext`. - - In the configuration file, you can use variables divided into **Global variables** and **User variables**, starting with `%`. See [here](https://doc.dovecot.org/configuration_manual/config_file/config_variables/#config-variables). + - In the configuration file, you can use variables divided into **Global variables** and **User variables**, starting with `%`. See [the Dovecot site regarding this here](https://doc.dovecot.org/2.3/configuration_manual/config_file/config_variables/). - `10-auth.conf`: Authentication configuration. - `10-logging.conf`. Logging configuration. From 7bad88d7c2df5198763168eee7c8aa465a4099a1 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Sun, 13 Jul 2025 18:57:28 -0700 Subject: [PATCH 062/164] New translations 06-users.md (Chinese Simplified) (#2780) --- docs/books/admin_guide/06-users.zh.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/books/admin_guide/06-users.zh.md b/docs/books/admin_guide/06-users.zh.md index 91c2def27d..bcab9aeb85 100644 --- a/docs/books/admin_guide/06-users.zh.md +++ b/docs/books/admin_guide/06-users.zh.md @@ -21,7 +21,7 @@ title: 用户管理 **知识性**: :star: :star: **复杂度**: :star: :star: -**阅读时间**: 30 分钟 +**阅读时间**:30 分钟 **** ## 常规信息 From bec26e3c11739d46e3e5992fae83496f482c5ef5 Mon Sep 17 00:00:00 2001 From: Neel Chauhan Date: Tue, 15 Jul 2025 14:58:24 -0400 Subject: [PATCH 063/164] `web/php.md`: Update for Rocky 8/10 and PHP 8.4 (#2784) --- docs/guides/web/php.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/guides/web/php.md b/docs/guides/web/php.md index 20000e649d..10c11138f4 100644 --- a/docs/guides/web/php.md +++ b/docs/guides/web/php.md @@ -51,9 +51,9 @@ To obtain a list of available versions, enter the following command: Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled ``` - The Remi repository offers more recent releases of PHP than the Appstream repository, including versions 8.2 and 8.3. + The Remi repository offers more recent releases of PHP than the Appstream repository, including versions 8.3 and 8.4. - To install the Remi repository, run the following command: + To install the Remi repository, run the following command (note: if you are running Rocky Linux 8.x or 10.x, substitute in 8 or 10 next to the "release-" below): ```bash sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm @@ -65,10 +65,10 @@ To obtain a list of available versions, enter the following command: sudo dnf config-manager --set-enabled remi ``` - You can now activate a newer module (PHP 8.3) by entering the following command: + You can now activate a newer module (PHP 8.4) by entering the following command: ```bash - sudo dnf module enable php:remi-8.3 + sudo dnf module enable php:remi-8.4 ``` === "8.9 PHP module list" From 9b04f8d994629f1d05d40c2035d9e944cdd645b4 Mon Sep 17 00:00:00 2001 From: Neel Chauhan Date: Tue, 15 Jul 2025 14:59:04 -0400 Subject: [PATCH 064/164] `migrate2rocky.md`: Update for Rocky 9.6 and mention 10 (#2778) --- docs/guides/migrate2rocky.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/migrate2rocky.md b/docs/guides/migrate2rocky.md index 99b7fbb801..bf9690aa3b 100644 --- a/docs/guides/migrate2rocky.md +++ b/docs/guides/migrate2rocky.md @@ -9,7 +9,7 @@ update: 11-23-2021 ## Prerequisites and assumptions -- CentOS Stream, CentOS, AlmaLinux, RHEL, or Oracle Linux running on a hardware server or VPS. Non-Stream CentOS is frozen at version 8.5. The current supported version of the other systems is 8.10 or 9.4. +- CentOS Stream, CentOS, AlmaLinux, RHEL, or Oracle Linux running version 8 or 9 on a hardware server or VPS. Non-Stream CentOS is frozen at version 8.5. The current supported version of the other systems is 8.10 or 9.6. Version 10 is not supported at the moment. - A working knowledge of the command line - A working knowledge of SSH for remote machines - A mildly risk-taking attitude From 8704222a03143cf355818ecffa20c3f30d397de3 Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Tue, 15 Jul 2025 18:16:06 -0500 Subject: [PATCH 065/164] Editing `custom-linux-kernel.md` (#2785) * fix some issues discovered by testing team * finish the editing process that I never finished at the release of this document (namely: passive to active voice; we and our, to you and your; sentence style capitalization; markdown keyboard syntax) * fix "Powertools" to "CRB" * replace contractions with words * replace abreviations with words (distro = distribution; repo(s) = repository(repositories)) * some sentence simplification * some other minor changes * tried to ensure that the commands and files were in back tics (no guaranty that all errors named are fixed) --- docs/guides/custom-linux-kernel.md | 172 ++++++++++++++--------------- 1 file changed, 83 insertions(+), 89 deletions(-) diff --git a/docs/guides/custom-linux-kernel.md b/docs/guides/custom-linux-kernel.md index a07f032185..ca98984b76 100644 --- a/docs/guides/custom-linux-kernel.md +++ b/docs/guides/custom-linux-kernel.md @@ -9,9 +9,9 @@ tags: # Overview -In this guide, we will walk through the process of acquiring a kernel source tree, configuring it, compiling it, and installing and booting it. +In this guide, you will walk through the process of acquiring a kernel source tree, configuring it, compiling it, installing and booting it. -!!! warning "Kernel rebuilds are not recommended nor supported for Rocky Linux. Before attempting to build a custom kernel, please consider the following:" +!!! warning "Kernel rebuilds are not recommended nor supported for Rocky Linux. Before attempting to build a custom kernel, consider the following:" * Is the functionality you need available by installing a kernel module from [elrepo](https://elrepo.org)? * Is the functionality you need available as a separate module from the kernel itself? @@ -20,7 +20,7 @@ In this guide, we will walk through the process of acquiring a kernel source tre As a final warning: If you break the kernel, you are responsible for fixing resulting issues on your system. -## The Kernel +## The kernel Most often, when people say _Linux_, they are usually referring to a "_Linux distribution_" - for example, Rocky Linux and Debian are types of Linux distribution. A distribution comprises everything necessary to get Linux to exist as a functional operating system. Distributions make use of code from various open source projects that are independent of Linux. @@ -32,15 +32,15 @@ Although the kernel is a small part of a complete Linux distribution, it is by f ## The kernel source code -The Rocky Linux distribution has the source code for the specific kernel version it supports available in one form or another. These could be in the form of a compiled binary (`*.src.rpm`), a source RPM (`*.srpm`), or the like. +The Rocky Linux distribution has the source code for the specific kernel version it supports available in one form or another. These could be in the form of a compiled binary (`*.src.rpm`), a source RPM (`*.srpm`), and so on. -If you need to download a different (possibly newer) version than the one your specific Rocky Linux distro provides, the first place to look for the source code is at the official kernel web site: +If you need to download a different (possibly newer) version than the one your specific Rocky Linux distribution provides, the first place to look for the source code is at the official kernel website: [www.kernel.org](https://www.kernel.org) -This site maintains a listing of web sites mirroring the kernel source, as well as tons of other open source software, distributions and general-purpose utilities. +This site maintains a listing of websites mirroring the kernel source, and tons of other open source software, distributions, and general-purpose utilities. -The list of mirrors is maintained at: +The list of maintained mirrors is at: [mirrors.kernel.org](http://mirrors.kernel.org) @@ -48,61 +48,55 @@ The list of mirrors is maintained at: The majority of the downloading, configuring and compiling of the Linux kernel done in the following sections can/should be done as an unprivileged user. However, the final steps that require actual installation or altering of system files and binaries need to be done with elevated privileges. - We are able to do most of the work as an unprivileged user because we will be using a special kernel build option, which allows us to specify a custom working or output directory. Specifically, we will use the `O=~/build/kernel` option for all applicable invocations of make. + You are able to do most of the work as an unprivileged user because you will be using a special kernel build option, which allows you to specify a custom working or output directory. Specifically, you will use the `O=~/build/kernel` option for all applicable invocations of make. Where `~/build/kernel` is equivalent to `/home/$USER/build/kernel` or `$HOME/build/kernel` ## Kernel versions and naming conventions -The web site listing of kernels available will contain folders for v1.0, v2.5, v2.6, v3.0, v3.x, v4.x, v5.x, v6.x and so forth. Before you follow your natural inclination to get the latest version, make sure you understand how the Linux kernel versioning system works. +The website listing of kernels available will contain folders for v1.0, v2.5, v2.6, v3.0, v3.x, v4.x, v5.x, v6.x and so forth. Before you follow your natural inclination to get the latest version, make sure you understand how the Linux kernel versioning system works. The current convention is to name and number major new kernel releases as “Linux 5.x” (also called the vanilla or mainline kernels). Thus, the first of this series will be Linux version 5.0 (same as 5.0.0), the next will be Linux version 5.1 (same as 5.1.0), followed by Linux version 5.2, and so on. -Any minor changes or updates within each major release version will be reflected by increments to the third digit. These are commonly referred to as stable point releases. Thus, the next stable point release for the 5.0.0 series kernel will be Linux version 5.0.1, followed by version 5.0.2, and so forth. Another way of stating this is to say, for example, that Linux version 5.0.4 is the fourth stable release based on the Linux 5.0.0 series. +The third digit represents any minor changes or updates within each major release version. These are commonly referred to as stable point releases. Thus, the next stable point release for the 5.0.0 series kernel will be Linux version 5.0.1, followed by version 5.0.2, and so forth. Another way of stating this is to say, for example, that Linux version 5.0.4 is the fourth stable release based on the Linux 5.0.0 series. ## Installing prerequisite tools and libraries -A common source of failure encountered during the kernel build process may be caused by not having all the requisite software available for compiling and building the mainline Linux Kernel. The missing tools and libraries can be installed using the DNF package manager on a Rocky Linux distro. We will take care of this in this section. +Not having all the requisite software available for compiling and building the mainline Linux Kernel is a common source of failure encountered during the kernel build process. You can install the missing tools and libraries with the DNF package manager on a Rocky Linux distribution. You can take care of that here. -1. On a Rocky Linux distro, you can quickly get most of the necessary development tools installed by running this command: - - ```bash - sudo dnf -y groupinstall 'C Development Tools and Libraries' - ``` - - If you get "Module or Group 'C Development Tools and Libraries' is not available." error the below command is equivalent to above: +1. On a Rocky Linux distribution, you can quickly get most of the necessary development tools installed by running this command: ```bash sudo dnf -y groupinstall 'Development Tools' ``` -2. Some other libraries, header files, and applications can also be obtained by installing the following packages. Type: +2. By installing the following packages, you will obtain the other libraries, header files, and applications needed. Type: ```bash sudo dnf -y install ncurses-devel openssl-devel elfutils-libelf-devel python3 ``` -3. Next, we need other utilities only available in some supported 3rd party repositories. One of such repositories is the Powertools repo. Let’s enable that repo on our Rocky system. Type: +3. You need other utilities only available in special repositories. One such repository is the CRB (Code Ready Builder) repository. Enable that repository on our Rocky system with: ```bash - sudo dnf config-manager --set-enabled powertools + sudo dnf config-manager --set-enabled crb ``` -4. Finally, let’s install one of the needed packages from the Powertool repo. Type: +4. Finally, install one of the needed packages from the CRB repository with: ```bash sudo dnf -y install dwarves ``` -That’s it for the prerequisite packages needed for actual Kernel building! +That is it for the prerequisite packages needed for actually building the kernel. -## Downloading and unpacking the Linux Kernel +## Downloading and unpacking the Linux kernel -The version of the kernel that we are going to build in the following section is version **6.5.7**, which is available at: +The version of the kernel that you are going to build in the following section is version **6.5.7**, which is available at: [www.kernel.org/pub/linux/kernel/v6.x/linux-6.5.7.tar.xz](https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.5.7.tar.xz) -Let’s begin the process. +Let us begin the process. 1. First, download the kernel source into your current working directory using the following `curl` command. Type: @@ -111,40 +105,40 @@ Let’s begin the process. https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.5.7.tar.xz ``` -2. The kernel source that you will download from the Internet is a file that has been compressed and tarred. Therefore, you need to decompress and untar the source file to use the source. +2. The kernel source that you will download from the Internet is a compressed, tarred file. Therefore, you need to decompress and extract the source file to use the source. - Make sure you are in the directory that download the Kernel tarball into. Use the tar command to unpack and decompress the file, by running: + Ensure you are in the directory containing the download of the Kernel tarball. Use the `tar` command to unpack and decompress the file, by running: ```bash tar xvJf linux-6.*.tar.xz ``` -## Building the Kernel +## Building the kernel -In this section, we are going to review the process of configuring and building a kernel. This is in contrast to macOS or Windows-based operating systems, which come preconfigured and therefore contain support for many features you may or may not want. +In this section, you are going to review the process of configuring and building a kernel. This is in contrast to macOS or Windows-based operating systems, which come pre-configured and therefore contain support for many features you might or might not want. The Linux design philosophy allows the individual to decide on the important parts of the kernel. This individualized design has the important benefit of letting you thin down the feature list so that Linux can run as efficiently as possible. This is also one of the reasons why it is possible to customize Linux to run in various hardware setups, from low-end systems, to embedded systems, to high-end systems. -Two main steps are required in building a kernel: +Building the kernel requires two main steps: - configuring - compiling -The first step in building the kernel is configuring its features. Usually, your desired feature list will be based on whatever hardware you need to support. This, of course, means that you will need a list of that hardware. +The first step in building the kernel is configuring its features. Usually, you will base your feature list on whatever hardware you need to support. This means that you will need a list of that hardware. -On a system that is already running Linux, you can run commands like – `lspci`, `lshw` and so on to help show detailed information about the exact hardware setup on your system. On RPM-based distros these utilities are provided by the `pciutils*.rpm` and `lshw*.rpm` packages. +On a system that is already running Linux, you can run commands such as – `lspci`, `lshw`, and so on, to help show detailed information about the exact hardware setup on your system. These utilities come from `pciutils*.rpm` and `lshw*.rpm` packages on RPM-based distributions. Having a better understanding of what constitutes your underlying hardware can help you better determine what you need in your custom kernel. You are ready to start configuring the kernel. ### Sanitizing the build environment -We can begin the actual configuration with a rough idea of the types of hardware and features that our new kernel needs to support. But first, some background information. +You can begin the actual configuration with a rough idea of the types of hardware and features that your new kernel needs to support. But first, some background information. The Linux kernel source tree contains several files named **Makefile** (a makefile is simply a text file with directives and it also describes the relationships among the files in a program). -These makefiles help to glue together the thousands of other files that make up the kernel source. What is more important to us here is that the makefiles also contain targets. The targets are the commands, or directives, that are executed by the make program. +These makefiles help to glue together the thousands of other files that make up the kernel source. What is more important to you here is that the makefiles also contain targets. The targets are the commands, or directives, run by the `make` program. !!! warning "warning: Avoid Needless Kernel Upgrades" @@ -157,15 +151,15 @@ These makefiles help to glue together the thousands of other files that make up On production systems, the kernel should not simply be upgraded just to have “the latest kernel”; you should have a truly compelling reason to upgrade. -The Makefile in the root of the kernel source tree contains specific targets that can be used in prepping the kernel build environment, configuring the kernel, compiling the kernel, installing the kernel, and so on. Some of the targets are discussed in more detail here: +The Makefile in the root of the kernel source tree contains specific targets used in prepping the kernel build environment, configuring the kernel, compiling the kernel, installing the kernel, and so on. Some additional details regarding these targets are: `make mrproper` -: This target cleans up the build environment of any stale files and dependencies that might have been left over from a previous kernel build. All previous kernel configurations will be cleaned (deleted) from the build environment. +: This target cleans up the build environment of any stale files and dependencies that left over from a previous kernel build. It cleans (deletes) all previous kernel configurations from the build environment. `make clean` -: This target does not do as thorough a job as the mrproper target. It deletes only most generated files. It does not delete the kernel configuration file (.config). +: This target does not do as thorough a job as the `mrproper` target. It deletes only most generated files. It does not delete the kernel configuration file (`.config`). `make menuconfig` @@ -181,45 +175,45 @@ The Makefile in the root of the kernel source tree contains specific targets tha `make olddefconfig` -: This target uses the existing .config file in the current working directory, updates the dependencies, and automatically sets new symbols to their default values. +: This target uses the existing `.config` file in the current working directory, updates the dependencies, and automatically sets new symbols to their default values. `make help` : This target will show you all the possible targets and serve as a quick online help system. -We will use only one of the targets to configure the kernel in this section. In particular, we will use the make menuconfig command. The menuconfig kernel config editor is a simple and popular text-based configuration utility that consists of menus, radio button lists, and dialogs. +You will use only one of the targets to configure the kernel in this section. In particular, you will use the make `menuconfig` command. The `menuconfig` kernel configuration editor is a simple and popular text-based configuration utility that consists of menus, radio button lists, and dialogs. It has a simple and clean interface that can be easily navigated with your keyboard and is almost intuitive to use. -We need to change (`cd`) into the kernel source directory, after which we can begin the kernel configuration. -But before beginning the actual kernel configuration, you should clean (prepare) the kernel build environment by using the make mrproper command: +You need to change (`cd`) into the kernel source directory, and then you can begin the kernel configuration. +Before beginning the actual kernel configuration, you should clean (prepare) the kernel build environment by using the `make mrproper` command: ```bash -cd linux-6.* +cd linux-6.*/ make O=~/build/kernel mrproper ``` -### Kernel Configuration +### Kernel configuration -Next, we will begin configuring a Linux 6.* series kernel. To explore some of the innards of this process, we will enable the support of a specific feature that we will pretend is a MUST have feature on the system. Once you understand how this works, you can apply the same procedure to add support for any new kernel feature you want. Specifically, we will enable support for the NTFS file system into our custom kernel. +Next, you will begin configuring a Linux 6.* series kernel. To explore some of the innards of this process, you will enable the support of a specific feature that you will pretend is a MUST have feature on the system. Once you understand how this works, you can apply the same procedure to add support for any new kernel feature you want. Specifically, you will enable support for the NTFS file system into our custom kernel. -Most modern Linux distros ship with a kernel configuration file for the running kernel available on the local file system as a compressed or regular file. On our sample Rocky system, this file resides in the `/boot` directory and is usually named something like `config-*`. +Most modern Linux distributions ship with a kernel configuration file for the running kernel, available on the local file system as a compressed or regular file. On your sample Rocky system, this file resides in the `/boot` directory and is usually named something like `config-*`. -The configuration file contains a list of the options and features that were enabled for the particular kernel it represents. A config file similar to this one is what we aim to create through the process of configuring the kernel. The only difference between the file we will create and the ready-made one is that we will add further minor customization to ours. +The configuration file contains a list of the options and features enabled for the particular kernel it represents. Your goal is to create a configuration file similar to this one through the process of configuring the kernel. The only difference between the file you will create and the ready-made one is that you will add further minor customization to yours. !!! TIP - Using a known, preexisting config file as a framework for creating our own custom file helps ensure that we do not waste too much time duplicating the efforts that other people have already put into finding what works and what does not work! + Using a known, preexisting configuration file as a framework for creating your own custom file helps ensure that you do not waste too much time duplicating the efforts that other people have already put into finding what works and what does not work. -The following steps cover how to configure the kernel. We will be using a text-based kernel configuration utility, which will allow you to follow along in your terminal regardless of whether you are using a GUI desktop environment or not. +The following steps cover how to configure the kernel. You will be using a text-based kernel configuration utility. You can follow along in your terminal regardless of whether you are using a GUI desktop environment or not. -1. To begin, we will copy over and rename the preexisting config file from the `/boot` directory into our kernel build environment: +1. To begin, you will copy over and rename the preexisting configuration file from the `/boot` directory into your kernel build environment: ```bash cp /boot/config-`uname -r` ~/build/kernel/.config ``` - We use `uname -r` here to help us obtain the configuration file for the running kernel. The `uname -r` command prints the running kernel’s release. Using it helps ensure that we are getting the exact version we want, just in case other versions are present. + You use `uname -r` here to help you obtain the configuration file for the running kernel. The `uname -r` command prints the running kernel’s release. Using it helps ensure that you are getting the exact version you want, just in case other versions are present. !!! NOTE @@ -235,11 +229,11 @@ The following steps cover how to configure the kernel. We will be using a text-b ![Main Kernel Configuration screen](images/Il01-kernel.png) - The kernel configuration screen that appears is divided into roughly three areas. + There are roughly three areas in the kernel configuration screen that is displayed. The top part shows helpful information, keyboard shortcuts, and legends to help you navigate the application. - The main body of the screen shows an expandable tree-structured list of the overall configurable kernel options. You can further drill down into items with arrows in the parent to view and/or configure sub-menu (or child) items. Finally, the bottom of the screen displays the actions/options the user can choose. + The main body of the screen shows an expandable tree-structured list of the overall configurable kernel options. You can further drill down into items with arrows in the parent to view or configure sub-menu (or child) items. Finally, the bottom of the screen displays the actions or options the user can select. -3. Next, we will add support for NTFS into our custom kernel for demonstration purposes. +3. Next, you will add support for NTFS into your custom kernel for demonstration purposes. While at the main configuration screen, use your arrow keys to navigate to and highlight the File systems item. With File systems selected, press enter to view the sub-menu or child items for File systems. @@ -252,7 +246,7 @@ The following steps cover how to configure the kernel. We will be using a text-b Use the arrow keys to navigate down to NTFS debugging support (NEW) and then press y to include it. Use the arrow keys to navigate down to NTFS write support and then press ++y++ to include it. - When you are done, the letter `M` or an asterisk symbol (`*`) should appear beside each option, like the ones shown here: + When done, the letter `M` or an asterisk symbol (`*`) should appear beside each option, as with the ones shown here: ![Kernel Configuration File Systems screen](images/Il02-kernel.png) @@ -262,15 +256,15 @@ The following steps cover how to configure the kernel. We will be using a text-b And the asterisk symbol in angle parentheses, <*>, indicates that support for the feature will be directly built into the kernel. You can usually toggle through all the possible options using the spacebar on your keyboard. -5. Navigate back to the parent File Systems screen by pressing the esc key twice on your keyboard in the DOS/FAT/NT Filesystems screen. Return to the main kernel configuration screen by pressing esc twice again on your keyboard. +5. Navigate back to the parent File Systems screen by pressing the ++esc++ key twice on your keyboard in the DOS/FAT/NT Filesystems screen. Return to the main kernel configuration screen by pressing ++esc++ twice again on your keyboard. -6. Finally, save your changes to the .config file in the root of your kernel source tree and exit the kernel configuration application after saving the file by pressing esc twice again on your keyboard. +6. Finally, save your changes to the `.config` file in the root of your kernel source tree and exit the kernel configuration application after saving the file by pressing ++esc++ twice again on your keyboard. -7. A dialog box will appear prompting you to save your new configuration. Make sure that Yes is selected and then press enter. +7. A dialog box will appear prompting you to save your new configuration. Make sure that your selection is "Yes" and then press enter. -8. After the kernel configuration utility exits, you will be thrown back to your shell-inside the kernel source tree. You are almost ready to build your kernel! +8. After the kernel configuration utility exits, you will be back to your shell-inside the kernel source tree. You are almost ready to build your kernel. -9. We need to complete a few more customizations on our Rocky distro. Type: +9. You need to complete a few more customizations on our Rocky distribution. Type: ```bash sed -ri '/CONFIG_SYSTEM_TRUSTED_KEYS/s/=.+/=""/g' ~/build/kernel/.config @@ -278,7 +272,7 @@ The following steps cover how to configure the kernel. We will be using a text-b !!! TIP - To view the results of some of the changes you made using the menuconfig tool, use the grep utility to view the .config file that you saved directly. For example, to view the effect of the NTFS file system support that we enabled previously, type the following: + To view the results of some of the changes you made using the menuconfig tool, use the grep utility to view the `.config` file that you saved directly. For example, to view the effect of the NTFS file system support that you previously enabled, type the following: ``` $ grep NTFS ~/build/kernel/.config CONFIG_NTFS_FS=m @@ -286,7 +280,7 @@ The following steps cover how to configure the kernel. We will be using a text-b CONFIG_NTFS_RW=y ``` - !!! NOTE "A Quick Note on Kernel Modules" + !!! NOTE "A quick note on kernel modules" Loadable module support is a Linux kernel feature that allows kernel modules' dynamic loading (or removal). @@ -294,18 +288,18 @@ The following steps cover how to configure the kernel. We will be using a text-b Thankfully, the Linux kernel can automatically determine what to load and when. Naturally, not every feature is eligible to be compiled as a module. The kernel must know a few things before it can load and unload modules, such as how to access the hard disk and parse through the file system where the loadable modules are stored. Some kernel modules are also commonly referred to as drivers. -### Compiling the Kernel +### Compiling the kernel -In the preceding section, we walked through the process of creating a configuration file for the custom kernel that we want to build. In this section, we will perform the actual build of the kernel. But before doing this, we will add one simpler customization to the entire process. +In the preceding section, you walked through the process of creating a configuration file for the custom kernel that you want to build. In this section, you will perform the actual build of the kernel. But before doing this, you will add one simple customization to the entire process. -The final customization will be to add an extra piece of information used in the final name of our kernel. This will help us be able to differentiate this kernel from any other kernel with the same version number. We will add the tag “custom” to the kernel version information. This can be done by editing the main Makefile and appending the tag that we want to the EXTRAVERSION variable. +The final customization will be to add an extra piece of information used in the final name of our kernel. This will help us be able to differentiate this kernel from any other kernel with the same version number. You will add the tag “custom” to the kernel version information. Do this by editing the main Makefile and appending the tag that you want to the EXTRAVERSION variable. -The compilation stage of the kernel-building process is by far the easiest, but it also takes the most time. All that is needed at this point is simply to execute the make command, which will then automatically generate and take care of any dependency issues, compile the kernel itself, and compile any features (or drivers) that were enabled as loadable modules. +The compilation stage of the kernel-building process is by far the easiest, but it also takes the most time. Just run the `make` command, which will then automatically generate and take care of any dependency issues, compile the kernel itself, and compile any features (or drivers) enabled as loadable modules. -Because of the amount of code that needs to be compiled, be prepared to wait a few minutes, at the very least, depending on your system's processing power. Let’s dig into the specific steps required to compile your new kernel. +Because of the amount of code compilation needed, prepare to wait a few minutes at the very least, depending on your system's processing power. Let us dig into the specific steps required to compile your new kernel. -1. First, we will add an extra piece to the identification string for the kernel we are about to build. While still in the root of the kernel source tree, we will use the `sed` utility to edit the Makefile in place. The variable we want to change is close to the top of the file. -We want to change the line in the file that looks like this: +1. First, you will add an extra piece to the identification string for the kernel you are about to build. While still in the root of the kernel source tree, you will use the `sed` utility to edit the Makefile in place. The variable you want to change is close to the top of the file. +You want to change the line in the file that looks like this: ```bash EXTRAVERSION = @@ -323,7 +317,7 @@ We want to change the line in the file that looks like this: sed -i 's/^EXTRAVERSION.*/EXTRAVERSION = -custom/' Makefile ``` - Of course, you can also use any text editor that you are comfortable with to make the change. Just remember to save your changes to the file! + You can also use any text editor that you are comfortable with to make the change. Just remember to save your changes to the file. 2. Pass the kernelversion target to the make command to view the full version of the kernel that you just customized: @@ -344,7 +338,7 @@ We want to change the line in the file that looks like this: make -j 8 ``` -3. The only command that is needed here to compile the kernel is the make command: +3. The only needed command to compile the kernel is the `make` command: ```bash $ make O=~/build/kernel @@ -368,35 +362,35 @@ We want to change the line in the file that looks like this: ~/build/kernel/arch/x86/boot/bzImage ``` -5. We need to install the modules because we compiled portions of the kernel as modules (for example, the NTFS module). Type the following: +5. You need to install the modules because you compiled portions of the kernel as modules (for example, the NTFS module). Type the following: ```bash sudo make O=~/build/kernel modules_install ``` - On our Rocky system, this command will install all the compiled kernel modules into the `/lib/modules/` directory. This path will translate to `/lib/modules/6.5.7-custom/` in this example. This is the path from which the kernel will load all loadable modules, as needed. + On your Rocky system, this command will install all the compiled kernel modules into the `/lib/modules/` directory. This path will translate to `/lib/modules/6.5.7-custom/` in this example. This is the path from which the kernel will load all loadable modules, as needed. !!! TIP The footprint (size) of the kernel modules installed via `make modules_install` can get pretty significant because the modules include debugging symbols. As a result, you could easily end up with a `/lib/modules/6.5.7-custom/` directory that is close to 5GB in size! - For this guide we avoid this large size by including the `INSTALL_MOD_STRIP=1` option in our `make modules_install` invocation. You can reduce the total size by orders of magnitude (For example - less than 200 MB!!) by stripping away these debugging symbols. + For this guide you avoid this large size by including the `INSTALL_MOD_STRIP=1` option in your `make modules_install` invocation. You can reduce the total size by orders of magnitude (For example - less than 200 MB) by stripping away these debugging symbols. This can be done by including the `INSTALL_MOD_STRIP=1` option to the `make modules_install` command. -## Installing the Kernel +## Installing the kernel -Assuming you have a PC and are working out of the `~/build/kernel/` directory, the compiled kernel that was created in the previous exercise will be located in this path - `/arch/x86/boot/bzImage` or, to be precise, in our example `~/build/kernel/arch/x86/boot/bzImage`. +Assuming you have a PC and are working out of the `~/build/kernel/` directory, the compiled kernel that you created in the last exercise will be in this path - `/arch/x86/boot/bzImage` or, to be precise, in our example `~/build/kernel/arch/x86/boot/bzImage`. -The corresponding map file for this will be located at `~/build/kernel/System.map`. You will need both files for the install phase. +The location of the corresponding map file for this is at `~/build/kernel/System.map`. You will need both files for the install phase. -The `System.map` file is useful when the kernel is misbehaving and generating “Oops” messages. An “Oops” is generated on some kernel errors because of kernel bugs or faulty hardware. +The `System.map` file is useful when the kernel is misbehaving and generating “Oops” messages. “Oops” messages generate on some kernel errors because of kernel bugs or faulty hardware. This error is akin to the Blue Screen of Death (BSOD) in Microsoft Windows. These messages include a lot of detail about the system's current state, including several hexadecimal numbers. `System.map` allows Linux to turn those hexadecimal numbers into readable names, making debugging easier. Although this is mainly for the benefit of developers, it can be handy when you are reporting a problem. -Let’s go through the steps required to install the new kernel image. +Let us go through the steps required to install the new kernel image. 1. While in the root of your kernel build directory, copy and rename the `bzImage` file into the `/boot` directory: @@ -405,7 +399,7 @@ Let’s go through the steps required to install the new kernel image. /boot/vmlinuz- ``` - Here, `` is the version number of the kernel. The filename for the example kernel we are using in this guide is `vmlinuz-6.5.7-custom`. So here is the exact command for this example: + Here, `` is the version number of the kernel. The filename for the example kernel you are using in this guide is `vmlinuz-6.5.7-custom`. So here is the exact command for this example: ```bash sudo cp ~/build/kernel/arch/x86/boot/bzImage \ @@ -423,7 +417,7 @@ Let’s go through the steps required to install the new kernel image. /boot/System.map-6.5.7-custom ``` -3. With the kernel in place, the `System.map` file in place, and the modules in place, we are now ready for the final step. The syntax for the command needed is: +3. With the kernel in place, the `System.map` file in place, and the modules in place, you are now ready for the final step. The syntax for the command needed is: ```bash kernel-install add @@ -438,7 +432,7 @@ Let’s go through the steps required to install the new kernel image. add 6.5.7-custom /boot/vmlinuz-6.5.7-custom ``` -The `kernel-install` command is a nifty shell script. It might not be available in every Linux distribution, but it is available in newer Fedora, RHEL, CentOS distros. This tool automates a lot of the final manual things we’d ordinarily have to do to set up the system to boot the new kernel we just built. +The `kernel-install` command is a nifty shell script. It might not be available in every Linux distribution, but it is available in newer Fedora, RHEL, CentOS distributions. This tool automates many of the final manual things you would ordinarily have to do to set up the system to boot the new kernel you just built. In particular, the tool does the following: @@ -449,9 +443,9 @@ To do this manually on systems where `kernel-install` is not available, use the For systems running the newer versions of GRUB2, the file will be `/boot/grub2/grub.cfg`. For EFI based systems `/boot/efi//fedora/grub.cfg` is also updated. -And for systems running the legacy versions of GRUB, this will be the `/boot/grub/grub.conf` or `/boot/grub/menu.lst` file. And for very new distros that have implemented the new Boot Loader Specification (BLS) a new boot loader entry will be added to the `/boot/loader/entries/` directory, or any directory pointed to by the variable named `blsdir`. +And for systems running the legacy versions of GRUB, this will be the `/boot/grub/grub.conf` or `/boot/grub/menu.lst` file. And for very new distribution that implements the new Boot Loader Specification (BLS), there is an addition of a new boot loader entry to the `/boot/loader/entries/` directory, or any directory pointed to by the variable named `blsdir`. -On our demo EFI based Rocky server running GRUB 2 using BLS, a new boot entry is created in the boot loader file located here: `/boot/loader/entries/6fa25ca775f64accb0d3e53f0e4e6e92-6.5.7-custom.conf` +On your demo EFI based Rocky server running GRUB2 using BLS, the creation of a new boot entry is in the boot loader file located here: `/boot/loader/entries/6fa25ca775f64accb0d3e53f0e4e6e92-6.5.7-custom.conf` ```bash $ sudo cat /boot/loader/entries/6fa25ca775f64accb0d3e53f0e4e6e92-6.5.7-custom.conf @@ -468,9 +462,9 @@ grub_class kernel !!! Note - Most distros, have several `grub2-*` utilities readily available that can be used for performing various GRUB2 and boot loader housekeeping tasks. For example, you can use the `grub2-set-default` command to change or set the default kernel to be booted at system startup. + Most distributions have several `grub2-*` utilities readily available that can be used for performing various GRUB2 and boot loader housekeeping tasks. For example, you can use the `grub2-set-default` command to change or set the default kernel to boot at system startup. -## Booting the custom Kernel +## Booting the custom kernel The next stage is to test the kernel to ensure the system can boot with it. @@ -480,14 +474,14 @@ The next stage is to test the kernel to ensure the system can boot with it. sudo reboot ``` -2. After the system boots up, you can use the uname command to find out the name of the current kernel: +2. After the system boots up, you can use the `uname` command to discover the name of the current kernel: ```bash $ uname -r 6.5.7-custom ``` -3. You will recall that one of the features that we added to our new kernel is the ability to support the NTFS file system. Make sure that the new kernel does indeed have support for NTFS by displaying information about the NTFS module: +3. You will recall that one of the features that you added to your new kernel is the ability to support the NTFS file system. Ensure that the new kernel does indeed have support for NTFS by displaying information about the NTFS module: ```bash [rockstar ~]$ modinfo ntfs @@ -498,4 +492,4 @@ The next stage is to test the kernel to ensure the system can boot with it. ...OUTPUT TRUNCATED... ``` -And that’s it! +That is all there is. From 41f2ab29453dc4434ef1d761ca8c558b376daeed Mon Sep 17 00:00:00 2001 From: Neel Chauhan Date: Thu, 17 Jul 2025 09:19:10 -0400 Subject: [PATCH 066/164] New post: Enabling VLAN Passthrough on Marvell AQC-series NICs (#2786) --- docs/guides/hardware/aqc_bridge_vlan.md | 27 +++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 docs/guides/hardware/aqc_bridge_vlan.md diff --git a/docs/guides/hardware/aqc_bridge_vlan.md b/docs/guides/hardware/aqc_bridge_vlan.md new file mode 100644 index 0000000000..1d704cabf7 --- /dev/null +++ b/docs/guides/hardware/aqc_bridge_vlan.md @@ -0,0 +1,27 @@ +--- +title: Enabling VLAN Passthrough on Marvell AQC-series NICs +author: Neel Chauhan +contributors: +tested_with: 9.6 +tags: + - hardware +--- + +## Introduction + +The author uses a Marvell AQC107-based NIC in their home server, which has a virtual machine used for a virtualized firewall. Unfortunately, the stock Rocky Linux Marvell AQC driver strips VLANs on bridge interfaces. This happened to the author's OPNsense virtual machine. Fortunately, it is fixable. + +## Prerequisites and assumptions + +The following are the minimum requirements for using this procedure: + +* A Rocky Linux server with a Marvell AQC-series NIC +* NetworkManager is used to configure networking + +## Disabling VLAN filtering + +Disabling VLAN filtering can be done in one command: + + nmcli con modify enp1s0 ethtool.feature-rx-vlan-filter off + +Replace `enp1s0` with the name of the AQC-based NIC. From d3998c8e09a3959b6cd622113225f2c010763c77 Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Thu, 17 Jul 2025 08:27:48 -0500 Subject: [PATCH 067/164] Edits `aqc_bridge_vlan.md` (#2787) * just a couple of minor edits --- docs/guides/hardware/aqc_bridge_vlan.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/guides/hardware/aqc_bridge_vlan.md b/docs/guides/hardware/aqc_bridge_vlan.md index 1d704cabf7..aa027f32d7 100644 --- a/docs/guides/hardware/aqc_bridge_vlan.md +++ b/docs/guides/hardware/aqc_bridge_vlan.md @@ -1,7 +1,7 @@ --- title: Enabling VLAN Passthrough on Marvell AQC-series NICs author: Neel Chauhan -contributors: +contributors: Steven Spencer tested_with: 9.6 tags: - hardware @@ -9,19 +9,19 @@ tags: ## Introduction -The author uses a Marvell AQC107-based NIC in their home server, which has a virtual machine used for a virtualized firewall. Unfortunately, the stock Rocky Linux Marvell AQC driver strips VLANs on bridge interfaces. This happened to the author's OPNsense virtual machine. Fortunately, it is fixable. +The author uses a Marvell AQC107-based NIC (network interface card) in their home server, which has a virtual machine used for a virtualized firewall. Unfortunately, the stock Rocky Linux Marvell AQC driver strips VLANs on bridge interfaces. This happened to the author's OPNsense virtual machine. Fortunately, it is fixable. ## Prerequisites and assumptions The following are the minimum requirements for using this procedure: * A Rocky Linux server with a Marvell AQC-series NIC -* NetworkManager is used to configure networking +* Using NetworkManager to configure networking ## Disabling VLAN filtering -Disabling VLAN filtering can be done in one command: +You can disable VLAN filtering with one command: nmcli con modify enp1s0 ethtool.feature-rx-vlan-filter off -Replace `enp1s0` with the name of the AQC-based NIC. +Replace `enp1s0` with the name of your AQC-based NIC. From 4a7a240690dd4e390bab292a3fc0b47e83f42f41 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Thu, 17 Jul 2025 06:27:57 -0700 Subject: [PATCH 068/164] New Crowdin updates (#2783) * New translations migration-to-new-azure-images.md (Italian) * New translations chyrp_lite.md (Italian) * New translations podman_guide.md (Italian) * New translations dump_restore.md (Italian) * New translations 9_6.md (French) * New translations 03-commands.md (Italian) * New translations docker.md (Italian) * New translations 17-log.md (Italian) * New translations rockydocs_web_dev.md (Italian) * New translations 06-users.md (Italian) * New translations rockydocs_webdev_v2.md (Italian) * New translations fork_and_branch_workflow.md (Italian) * New translations git_pull_vs_git_fetch.md (Italian) * New translations git_remote_add.md (Italian) * New translations tracking_and_nontracking_branch.md (Italian) * New translations rancher_and_kubernetes.md (Italian) * New translations asterisk_installation.md (Italian) * New translations 05-vi.md (French) * New translations rdp-server.md (German) * New translations installing_nvidia_gpu_drivers.md (Italian) * New translations 05-vi.md (Ukrainian) * New translations 05-vi.md (Chinese Simplified) * New translations 9_2.md (French) * New translations 8_7.md (French) * New translations 8_8.md (French) * New translations 9_3.md (French) * New translations 04-advanced-commands.md (Italian) * New translations 06-users.md (Italian) * New translations 10_0.md (Italian) * New translations 08-process.md (Italian) * New translations 09-backups.md (Italian) * New translations 13-softwares.md (Italian) * New translations 16-about-sytemd.md (Italian) * New translations appimage_pool.md (Italian) * New translations user_and_group_account_management.md (Italian) * New translations valuta.md (Italian) * New translations screenshot.md (Italian) * New translations mirroring_lsyncd.md (Italian) * New translations migration-to-new-azure-images.md (Italian) * New translations dump_restore.md (Italian) * New translations 8_7.md (Italian) * New translations 8_5.md (Italian) * New translations 9_1.md (Italian) * New translations 9_3.md (Italian) * New translations 8_9.md (Italian) * New translations 9_4.md (Italian) * New translations 8_10.md (Italian) * New translations 9_5.md (Italian) * New translations 9_6.md (Italian) * New translations cloud_server_using_nextcloud.md (Italian) * New translations rancher_and_kubernetes.md (Italian) * New translations podman_guide.md (Italian) * New translations chyrp_lite.md (Italian) * New translations rockydocs_web_dev.md (Italian) * New translations mkdocs_lsyncd.md (Italian) * New translations rockydocs_webdev_v2.md (Italian) * New translations 02_github_web_edit_pr_title.md (Italian) * New translations fork_and_branch_workflow.md (Italian) * New translations git_pull_vs_git_fetch.md (Italian) * New translations git_remote_add.md (Italian) * New translations tracking_and_nontracking_branch.md (Italian) * New translations caddy.md (Italian) * New translations test_cpu_compat.md (Italian) * New translations dokuwiki_server.md (Italian) * New translations wordpress-on-lamp.md (Italian) * New translations apache-sites-enabled.md (Italian) * New translations rockydocs_formatting.md (Italian) * New translations rsnapshot_backup.md (Italian) * New translations style_guide.md (Italian) --- docs/books/admin_guide/03-commands.it.md | 6 +- .../admin_guide/04-advanced-commands.it.md | 4 +- docs/books/admin_guide/05-vi.fr.md | 4 +- docs/books/admin_guide/05-vi.uk.md | 4 +- docs/books/admin_guide/05-vi.zh.md | 4 +- docs/books/admin_guide/06-users.it.md | 12 +- docs/books/admin_guide/08-process.it.md | 2 +- docs/books/admin_guide/09-backups.it.md | 2 +- docs/books/admin_guide/13-softwares.it.md | 2 +- docs/books/admin_guide/16-about-sytemd.it.md | 4 +- docs/books/admin_guide/17-log.it.md | 607 ++++++++++++++++++ docs/desktop/appimage/appimage_pool.it.md | 2 +- .../installing_nvidia_gpu_drivers.it.md | 2 +- docs/desktop/gnome/rdp-server.de.md | 2 +- docs/desktop/gnome/screenshot.it.md | 2 +- .../user_and_group_account_management.it.md | 2 +- docs/desktop/gnome/valuta.it.md | 2 +- docs/gemstones/containers/docker.it.md | 2 +- .../git/02_github_web_edit_pr_title.it.md | 2 +- docs/gemstones/test_cpu_compat.it.md | 2 +- docs/guides/backup/dump_restore.it.md | 230 +++++++ docs/guides/backup/mirroring_lsyncd.it.md | 229 ++++--- docs/guides/backup/rsnapshot_backup.it.md | 220 ++++--- .../cloud/migration-to-new-azure-images.it.md | 88 +++ docs/guides/cms/chyrp_lite.it.md | 156 +++++ .../cms/cloud_server_using_nextcloud.it.md | 148 +++-- docs/guides/cms/dokuwiki_server.it.md | 301 ++++----- docs/guides/cms/wordpress-on-lamp.it.md | 243 +++++++ .../asterisk_installation.it.md | 128 ++-- docs/guides/containers/podman_guide.it.md | 434 +++++++++++++ .../containers/rancher_and_kubernetes.it.md | 146 +++++ .../contribute/localdocs/mkdocs_lsyncd.it.md | 2 +- .../localdocs/rockydocs_webdev_v2.it.md | 2 +- .../contribute/rockydocs_formatting.it.md | 238 +++++-- docs/guides/contribute/style_guide.it.md | 35 +- docs/guides/web/apache-sites-enabled.it.md | 10 +- docs/guides/web/caddy.it.md | 2 +- docs/release_notes/10_0.it.md | 282 ++++++++ docs/release_notes/8_10.it.md | 6 +- docs/release_notes/8_5.it.md | 2 +- docs/release_notes/8_7.fr.md | 2 +- docs/release_notes/8_7.it.md | 2 +- docs/release_notes/8_8.fr.md | 4 +- docs/release_notes/8_9.it.md | 4 +- docs/release_notes/9_1.it.md | 2 +- docs/release_notes/9_2.fr.md | 2 +- docs/release_notes/9_3.fr.md | 2 +- docs/release_notes/9_3.it.md | 2 +- docs/release_notes/9_4.it.md | 8 +- docs/release_notes/9_5.it.md | 6 +- docs/release_notes/9_6.fr.md | 141 ++++ docs/release_notes/9_6.it.md | 20 +- 52 files changed, 3123 insertions(+), 643 deletions(-) create mode 100644 docs/books/admin_guide/17-log.it.md create mode 100644 docs/guides/backup/dump_restore.it.md create mode 100644 docs/guides/cloud/migration-to-new-azure-images.it.md create mode 100644 docs/guides/cms/chyrp_lite.it.md create mode 100644 docs/guides/cms/wordpress-on-lamp.it.md create mode 100644 docs/guides/containers/podman_guide.it.md create mode 100644 docs/guides/containers/rancher_and_kubernetes.it.md create mode 100644 docs/release_notes/10_0.it.md create mode 100644 docs/release_notes/9_6.fr.md diff --git a/docs/books/admin_guide/03-commands.it.md b/docs/books/admin_guide/03-commands.it.md index bfd99a1b3c..c0970029c1 100644 --- a/docs/books/admin_guide/03-commands.it.md +++ b/docs/books/admin_guide/03-commands.it.md @@ -785,7 +785,7 @@ cp -r /home/rockstar /tmp | Opzioni | Informazione | | ------- | ---------------------------------------------------------------------------- | | `-i` | Richiesta di conferma per la sovrascrittura (default). | -| `-f` | Non chiedere conferma per la sovrascrittura del file di destinazione. | +| `-t` | Non chiedere conferma per la sovrascrittura del file di destinazione. | | `-p` | Mantiene il proprietario, le autorizzazioni e il timestamp del file copiato. | | `-r` | Copia una directory con i suoi file e sottodirectory. | | `-s` | Crea un collegamento simbolico invece di copiare. | @@ -958,7 +958,7 @@ tail [-f] [-n x] file | Opzione | Descrizione | | ------- | ---------------------------------------------- | | `-n x` | Visualizza le ultime `x` righe del file | -| `-f` | Visualizza le modifiche al file in tempo reale | +| `-t` | Visualizza le modifiche al file in tempo reale | Esempio: @@ -998,7 +998,7 @@ adm:x:3:4:adm:/var/adm/:/sbin/nologin | `-o file` | Salva l'ordinamento nel file specificato. | | `-t` | Specificare un delimitatore, che richiede che i contenuti del file corrispondente siano contenuti di colonne regolarmente delimitate, altrimenti non possono essere ordinati correttamente. | | `-r` | Inverte l'ordine del risultato. Usato insieme all'opzione `-n` per ordinare dal più grande al più piccolo. | -| `-u` | Rimuovi i duplicati dopo l'ordinamento. Equivalente a `sort file uniq`. | +| `- u` | Rimuovi i duplicati dopo l'ordinamento. Equivalente a `sort file uniq`. | Il comando `sort` ordina il file solo sullo schermo. Il file non è modificato dall'ordinamento. Per salvare l'ordinamento, utilizzare l'opzione `-o` o un reindirizzamento dell'output `>`. diff --git a/docs/books/admin_guide/04-advanced-commands.it.md b/docs/books/admin_guide/04-advanced-commands.it.md index 686541e42b..51d21780a5 100644 --- a/docs/books/admin_guide/04-advanced-commands.it.md +++ b/docs/books/admin_guide/04-advanced-commands.it.md @@ -449,11 +449,11 @@ Espande i file o le cartelle della directory in una struttura ad albero. |:------- |:------------------------------------------------------------- | | `-a` | Vengono elencati tutti i file | | `-h` | Stampa le dimensioni in un modo più leggibile per l'utente | -| `-u` | Visualizza il proprietario del file o il numero UID | +| `- u` | Visualizza il proprietario del file o il numero UID | | `-g` | Visualizza il proprietario del gruppo di file o il numero GID | | `-p` | Stampa le protezioni per ciascun file | -Per esempio: +Ad esempio: ```bash $ tree -hugp /etc/yum.repos.d/ diff --git a/docs/books/admin_guide/05-vi.fr.md b/docs/books/admin_guide/05-vi.fr.md index 930541d0e2..06f2055c2f 100644 --- a/docs/books/admin_guide/05-vi.fr.md +++ b/docs/books/admin_guide/05-vi.fr.md @@ -206,7 +206,7 @@ Il existe plusieurs manières d'insérer du texte en mode *commandes*. VI bascule en mode *insertion* après la saisie d’une de ces touches. -!!! note "Remarque" +!!! note "Remarque " VI passe en mode *insertion*. Il faudra donc appuyer sur la touche ++escape++ pour revenir en mode *commandes*. @@ -272,7 +272,7 @@ Ces opérations se font en mode *command*. ++r+"characters"+escape++ -!!! note "Remarque" +!!! note "Remarque " La commande ++r++ bascule en mode *remplacement*, qui est une sorte de mode *insertion*. diff --git a/docs/books/admin_guide/05-vi.uk.md b/docs/books/admin_guide/05-vi.uk.md index 96216600e8..4d12c02f9b 100644 --- a/docs/books/admin_guide/05-vi.uk.md +++ b/docs/books/admin_guide/05-vi.uk.md @@ -206,7 +206,7 @@ VI залишається в режимі *команд* після перемі VI перемикається в режим *вставки* після введення однієї з цих клавіш. -!!! Note "Примітка" +!!! Примітка VI переходить у режим *вставки*. Тож вам доведеться натиснути ++escape++ клавіша для повернення в *командний* режим. @@ -272,7 +272,7 @@ VI дозволяє редагувати текст, керуючи: ++r+"символи"+escape++ -!!! Note "Примітка" +!!! Примітка Команда ++r++ перемикається в режим *replace*, який є різновидом режиму *insert*. diff --git a/docs/books/admin_guide/05-vi.zh.md b/docs/books/admin_guide/05-vi.zh.md index 8cab84b4d8..37861c241e 100644 --- a/docs/books/admin_guide/05-vi.zh.md +++ b/docs/books/admin_guide/05-vi.zh.md @@ -206,7 +206,7 @@ VI 的原理是在 *command* 模式和 *insertion* 模式之间交替使用。 输入其中一个按键后,VI 将切换到 *insert* 模式。 -!!! note "说明" +!!! Note "说明" 要将 VI 切换到 *insertion* 模式, 您必须按 ++escape++ 键返回到 *command* 模式。 @@ -272,7 +272,7 @@ VI允许通过管理以下内容进行文本编辑: ++r+"characters"+escape++ -!!! note "说明" +!!! Note "说明" ++r++命令切换到 *replace* 模式,这是一种 *insert* 模式。 diff --git a/docs/books/admin_guide/06-users.it.md b/docs/books/admin_guide/06-users.it.md index 9ba6b2e962..52761275d5 100644 --- a/docs/books/admin_guide/06-users.it.md +++ b/docs/books/admin_guide/06-users.it.md @@ -310,7 +310,7 @@ Quando si richiama il comando `useradd` senza alcuna opzione, vengono impostate * La shell predefinita è bash; * I valori UID e GID del gruppo primario dell'utente vengono automaticamente detratti. Questo è di solito un valore unico tra 1000 e 60.000. -!!! note "Nota" +!!! note Le impostazioni e i valori predefiniti si ottengono dai seguenti file di configurazione: @@ -617,7 +617,7 @@ sudo chgrp group1 file chown [options] --reference=RRFILE FILE ``` -Per esempio: +Ad esempio: ```bash chown --reference=/etc/groups /etc/passwd @@ -655,7 +655,7 @@ New Password: Re-enter new password: ``` -!!! note "Nota" +!!! note Oltre a usare `gpasswd -a` per aggiungere utenti a un gruppo, si può anche usare `usermod -G` o `usermod -aG` menzionati prima. @@ -807,7 +807,7 @@ sudo chage -m 60 -M 90 -W 80 -I 10 alain | `-m DAYS` | Definisce la durata minima della password. Cambiamento permanente. | | `-M DAYS` | Definisce la durata massima della password. Cambiamento permanente. | | `-d LAST_DAY` | Definisce il numero di giorni dall'ultima modifica della password. È possibile utilizzare lo stile di data e ora dei giorni o lo stile YYYY-MM-DD. Cambiamento permanente. | -| `-E EXPIRE_DATE` | Definisce la data di scadenza dell'account. È possibile utilizzare lo stile di data e ora dei giorni o lo stile YYYY-MM-DD. Modifica permanente. | +| `-E EXPIRE_DATE` | Definisce la data di scadenza dell'account. È possibile utilizzare lo stile di data e ora dei giorni o lo stile YYYY-MM-DD. Cambiamento permanente. | | `-W WARN_DAYS` | Definisce il numero di giorni di avviso prima della scadenza. Cambiamento permanente. | Esempio: @@ -907,7 +907,7 @@ USERGROUPS_ENAB yes ENCRYPT_METHOD SHA512 ``` -`UMASK 022`: Questo significa che il permesso di creare un file è 755 (rwxr-xr-x). Tuttavia, per motivi di sicurezza, GNU/Linux non prevede il permesso **x** per i file appena creati. Questa restrizione si applica a root (uid=0) e agli utenti ordinari (uid>=1000). Per esempio: +`UMASK 022`: Questo significa che il permesso di creare un file è 755 (rwxr-xr-x). Tuttavia, per motivi di sicurezza, GNU/Linux non prevede il permesso **x** per i file appena creati. Questa restrizione si applica a root (uid=0) e agli utenti ordinari (uid>=1000). Ad esempio: ```bash Shell > touch a.txt @@ -982,7 +982,7 @@ Gli utenti standard dovranno digitare la password per la nuova identità. 0 ``` -Attenzione prego! `su` e `su -` sono diversi, come mostrato nell'esempio seguente: +Attention please! `su` e `su -` sono diversi, come mostrato nell'esempio seguente: ```bash $ whoami diff --git a/docs/books/admin_guide/08-process.it.md b/docs/books/admin_guide/08-process.it.md index 2946f817c3..0f29d34271 100644 --- a/docs/books/admin_guide/08-process.it.md +++ b/docs/books/admin_guide/08-process.it.md @@ -414,7 +414,7 @@ Esempi: pkill tomcat ``` -!!! note "Nota" +!!! note Prima di terminare un processo, è meglio sapere esattamente a cosa serve; in caso contrario, si possono verificare crash del sistema o altri problemi imprevedibili. diff --git a/docs/books/admin_guide/09-backups.it.md b/docs/books/admin_guide/09-backups.it.md index ee69c2ae13..4d8c0b6164 100644 --- a/docs/books/admin_guide/09-backups.it.md +++ b/docs/books/admin_guide/09-backups.it.md @@ -577,7 +577,7 @@ Funzione secondaria: 1. `-t` - Stampa un indice del contenuto dell'input. 2. `-A` - Aggiunge a un archivio esistente. Funziona solo in modalità copy-in. -!!! note "Nota" +!!! note Alcune opzioni di `cpio` devono essere combinate con la modalità operativa corretta per funzionare correttamente. Vedere `man 1 cpio` diff --git a/docs/books/admin_guide/13-softwares.it.md b/docs/books/admin_guide/13-softwares.it.md index b121e158be..7e681781f8 100644 --- a/docs/books/admin_guide/13-softwares.it.md +++ b/docs/books/admin_guide/13-softwares.it.md @@ -987,7 +987,7 @@ dnf needs-restarting [-u] [-r] [-s] | Opzioni | Descrizione | | ------- | ---------------------------------------------------------------- | -| `-u` | Considera solo i processi appartenenti all'utente in esecuzione. | +| `- u` | Considera solo i processi appartenenti all'utente in esecuzione. | | `-r` | per verificare se è necessario un riavvio. | | `-s` | per verificare se i servizi devono essere riavviati. | | `-s -r` | per fare entrambe le cose in un unico ciclo. | diff --git a/docs/books/admin_guide/16-about-sytemd.it.md b/docs/books/admin_guide/16-about-sytemd.it.md index 70559ee47a..dcd3717669 100644 --- a/docs/books/admin_guide/16-about-sytemd.it.md +++ b/docs/books/admin_guide/16-about-sytemd.it.md @@ -1,7 +1,7 @@ --- title: Informazioni su systemd author: tianci li -contributors: Spencer Steven +contributors: Steven Spencer tags: - init software - systemd @@ -563,7 +563,7 @@ Di solito esistono tre intitolazioni per le unit di tipo ".service": - `Alias=`. Un elenco di nomi aggiuntivi separati da spazi. Attenzione prego! Il nome aggiuntivo deve avere lo stesso tipo (suffisso) della unit corrente. - - `RequiredBy=` o `WantedBy=multi-user.target`. Definisce la unit dell'operazione corrente come dipendenza della unit nel valore. Una volta completata la definizione, i file pertinenti si trovano nella directory /etc/systemd/systemd/. Per esempio: + - `RequiredBy=` o `WantedBy=multi-user.target`. Definisce la unit dell'operazione corrente come dipendenza della unit nel valore. Una volta completata la definizione, i file pertinenti si trovano nella directory /etc/systemd/systemd/. Ad esempio: ```bash Shell > systemctl is-enabled chronyd.service diff --git a/docs/books/admin_guide/17-log.it.md b/docs/books/admin_guide/17-log.it.md new file mode 100644 index 0000000000..98d4a1d382 --- /dev/null +++ b/docs/books/admin_guide/17-log.it.md @@ -0,0 +1,607 @@ +--- +title: Gestione del log +author: tianci li +contributors: Ganna Zhyrnova, Steven Spencer +tags: + - rsyslog + - journald +--- + +## Panoramica di base + +In questo capitolo si spiega come gestire i registri nel sistema operativo. + +**Q: Che cos'è un registro?** + +**Log**:Registra tutti gli eventi e i messaggi che si verificano dall'avvio del sistema operativo, compresi i registri di avvio, i registri di inizializzazione del kernel, i registri di inizializzazione di `systemd` e i registri di avvio o esecuzione delle applicazioni. Il registro è una delle funzioni più importanti del sistema operativo. Gli amministratori possono interrogare i registri per risolvere problemi esistenti o futuri. + +In RHEL 8.x e RHEL 9.x, la raccolta dei log è completata principalmente dai due programmi seguenti: + +- **rsyslog** - Un programma che raccoglie ed elabora rapidamente i log. È una versione aggiornata di `syslog`. [Questo è il suo sito ufficiale](https://www.rsyslog.com/) +- **journald** - Uno dei componenti di `systemd` + +## rsyslog + +In Rocky Linux 8.x o 9.x, ci sono vari file di log nella directory **/var/log/**. Impariamo a conoscerli: + +- `/var/log/boot.log` - Registra gli eventi che si verificano durante l'avvio del sistema operativo. Il contenuto del file è testo normale. +- `/var/log/btmp` - Registra il log degli errori di accesso. Per visualizzare questo file binario, utilizzare il comando `lastb`. +- `/var/log/cron` - Registra i log relativi alle attività pianificate del sistema. Il contenuto del file è testo normale. +- `/var/log/dmegs` - Registra il log dell'autoverifica del kernel dopo l'avvio. Il contenuto del file è testo normale. È anche possibile utilizzare il comando `dmegs` per visualizzare. +- `/var/log/lastlog` - Registra l'orario dell'ultimo accesso di tutti gli utenti del sistema operativo. Per visualizzare questo binario è necessario utilizzare il comando `lastlog`. +- `/var/log/maillog` - Registra i log relativi alla posta elettronica. +- `/var/log/messages` - Il file di log a livello di sistema registra il cuore del sistema operativo. Il contenuto del file è testo normale. Quando si verificano alcuni errori nel sistema operativo, è necessario innanzitutto visualizzare il file di registro. +- `/var/log/secure` - Registra i log relativi all'identità dell'utente, come il login dell'utente, il passaggio a `su`, l'aggiunta di un nuovo utente, la modifica della password dell'utente e così via. +- `/var/log/wtmp` - Registra gli eventi di login e logout degli utenti e gli eventi di avvio, spegnimento e riavvio del sistema operativo. Per visualizzare questo file binario, utilizzare il comando `last`. + +Per i file di testo semplice, il formato è solitamente: + +1. Data in cui si è verificato l'evento +2. Su quale macchina si è verificato l'evento +3. Il nome del servizio o del programma che ha generato l'evento. +4. Descrizione e spiegazione specifiche dell'evento +5. Informazioni sull'utente e sul terminale +6. Alcune parole chiave (come error, fail, info, ecc.) + +Il formato dei registri per scopi diversi varia notevolmente, pertanto la descrizione del formato sopra riportata non può rappresentare tutti i registri. + +Se `rsyslog` non è presente nel sistema operativo, eseguire il seguente comando: + +```bash +Shell > dnf install -y rsyslog +``` + +### File di configurazione + +- `/etc/rsyslog.conf` - File di configurazione principale +- `/etc/rsyslog.d/` - Directory di archiviazione dei file di configurazione aggiuntivi + +\`/etc/rsyslog.conf' è composto principalmente da diverse parti: + +1. Load module +2. Direttive globali +3. Regole - L'autore le illustra in dettaglio. + +Dopo decenni di sviluppo, `rsyslog` supporta attualmente tre diversi formati di configurazione: + +1. basic (sysklogd) - Questo formato è adatto a rappresentare la configurazione di base in una singola riga. + + ``` + mail.info /var/log/mail.log + mail.err @@server.example.net + ``` + +2. advanced (RainerScript) - Formato di configurazione altamente flessibile e preciso. + + ``` + mail.err action(type="omfwd" protocol="tcp" queue.type="linkedList") + ``` + +3. obsolete legacy (legacy) - Questo formato è stato deprecato. Non continuate a usarlo. + +#### Regole + +Il contenuto predefinito di questa sezione è il seguente: + +``` +*.info;mail.none;authpriv.none;cron.none /var/log/messages + +authpriv.* /var/log/secure + +mail.* -/var/log/maillog + +cron.* /var/log/cron + +*.emerg :omusrmsg:* + +uucp,news.crit /var/log/spooler + +local7.* /var/log/boot.log +``` + +Ogni linea di regole è composta da due parti: + +1. campo selettore - Composto da strutture e priorità +2. campo d'azione - Come si desidera gestire questi messaggi di corrispondenza + +I campi sono separati tra loro da uno o più spazi. + +| Struttura | Descrizione | +| -------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `auth` | Registra gli eventi relativi alla sicurezza del sistema, all'autenticazione degli utenti e alla gestione delle autorizzazioni | +| `authpriv` | Registra gli eventi di sicurezza più sensibili (come le operazioni `sudo`). "priv" equivale a privato | +| `cron` | Registra gli eventi relativi alle attività pianificate | +| `daemon` | Registra il log di funzionamento del demone di sistema, che comprende l'avvio del servizio, lo stato di funzionamento e le informazioni sugli errori | +| `ftp` | Registra i log delle operazioni relative ai servizi FTP (come `vsftpd` e `proftpd`), comprese le informazioni sulla connessione, sul trasferimento dei file e sugli errori | +| `kern` | Registra il log generato durante l'esecuzione del kernel Linux, coprendo gli eventi principali come i driver hardware, i moduli del kernel e le eccezioni di sistema | +| `lpr` | Registra il log di funzionamento del servizio di stampa, che comprende l'invio delle attività di stampa, la gestione delle code e le informazioni sugli errori | +| `mail` | Registra le informazioni di log dei servizi di posta (come Postfix e Sendmail), compresi l'invio, la ricezione, l'elaborazione delle code e gli eventi di errore | +| `news` | Utilizzato raramente | +| `security` | come `auth` | +| `syslog` | Registra i log generati dal servizio `syslog` | +| `user` | Registra le informazioni generate dalle applicazioni dello spazio utente o dagli utenti | +| `uucp` | Registra i log delle operazioni relative al protocollo di copia da Unix a Unix (UUCP), compresi il trasferimento di file, l'esecuzione di comandi remoti e altri scenari | +| `local0` | Riservato | +| `local1` | Riservato | +| .... | Riservato | +| `local7` | Riservato | + +`*` rappresenta tutte le strutture. Si possono anche usare `,` e `;` per combinare le strutture in una configurazione a riga singola. `,` rappresenta l'or logico; `;` rappresenta il delimitatore della regola. + +```bash +auth,authpriv.* /var/log/auth.log + +# Equivalent to + +auth.* /var/log/auth.log +authpriv.* /var/log/auth.log +``` + +```bash +kern.err;mail.alert /var/log/critical.log +``` + +| Connettore | Descrizione | +| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `.` | Registra i log con una priorità maggiore rispetto alle parole chiave. Per esempio, `cron.info` significa che registrerà in `cron` la cui priorità di log è maggiore di info | +| `.=` | Registra solo la priorità della parola chiave corrispondente. Ad esempio, `*.=emerg` indica che registrerà i registri con priorità pari a `emerg` in tutte le applicazioni | +| `.!` | Significa escluso o non uguale a | + +Le priorità sono ordinate dal basso all'alto: + +| Nome | Descrizione | +| --------- | -------------------------------------------------------------------------------------------------------------------------------- | +| `debug` | Informazioni generali sul debug | +| `info` | Informazioni di base sulla notifica | +| `notice` | Informazioni generali di una certa importanza | +| `warning` | Messaggio di avviso, questo tipo di informazione non può influire sul normale funzionamento del sistema operativo o del servizio | +| `err` | Messaggi di errore che possono compromettere il normale funzionamento del sistema operativo e dei servizi | +| `crit` | Uno stato critico più grave di "err" | +| `alert` | Lo stato di allerta è più grave di "crit" e l'amministratore di sistema deve occuparsene immediatamente | +| `emerg` | Uno stato di emergenza in cui il sistema operativo è normalmente inutilizzabile | + +`*` rappresenta tutte le priorità del registro. + +Più bassa è la priorità del registro, più dettagliato è il contenuto registrato e più bassa è la gravità. Più alta è la priorità del registro, meno contenuti vengono registrati e più grave è il problema. + +"azione" si riferisce a dove salvare o inviare il registro: + +- `/var/log/secure` - Salva il log in un file locale +- `@192.168.100.20:22` - Macchina remota +- `:omusrmsg:root,frank,jack` - Specifica l'elenco degli utenti online. `*` rappresenta tutti gli utenti. "omusrmsg" si riferisce al "modulo di uscita per i messaggi dell'utente". +- `/dev/tty12` - Dispositivi terminali specifici +- `-` - Disabilita il meccanismo di buffering durante la scrittura su file + +### Rotazione del registro + +**Rotazione dei log** - La rotazione dei log risolve i problemi di occupazione dello spazio di archiviazione e di degrado delle prestazioni causati dalla continua crescita dei file di log. Le funzioni specifiche sono: + +- **Rotazione** - Archivia automaticamente il file di registro corrente in base a regole specifiche (come il tempo o la dimensione del file) e crea un nuovo file di registro vuoto per la registrazione per evitare che il file di registro sia troppo grande. +- **Compressione** - Comprime i vecchi registri archiviati per risparmiare spazio su disco. +- **Elimina** - Conserva i file di registro pertinenti ed elimina quelli vecchi e scaduti in base alle politiche pertinenti. + +Spesso si usa lo strumento `logrotate` per ruotare i log. + +Regole di denominazione per i file di registro durante la rotazione: + +- Parametro `dateext` - Utilizza la data come suffisso del file per la rotazione dei registri. Ad esempio, durante la prima rotazione dei log, il vecchio file di log "secure" cambierà in "secure-20250424" e `logrotate` creerà un nuovo file "secure" +- Nessun parametro `dateetx` - Utilizza i numeri di rotazione come suffisso del file dopo la rotazione del registro. Ad esempio, quando si verifica la prima rotazione dei registri, il vecchio file di registro "secure" cambia in "secure.1" e `logrotate` crea un nuovo file "secure" + +#### /etc/logrotate.conf and /etc/logrotate.d/ + +```bash +Shell > grep -v -E "^#|^$" /etc/logrotate.conf +weekly +rotate 4 +create +dateext +include /etc/logrotate.d + +Shell > ls -l /etc/logrotate.d/ +-rw-r--r-- 1 root root 130 Feb 7 2023 btmp +-rw-r--r--. 1 root root 160 Dec 5 2023 chrony +-rw-r--r--. 1 root root 88 Apr 12 2021 dnf +-rw-r--r-- 1 root root 93 Mar 11 17:29 firewalld +-rw-r--r--. 1 root root 162 Apr 16 19:49 kvm_stat +-rw-r--r-- 1 root root 289 Dec 18 01:38 sssd +-rw-r--r-- 1 root root 226 Nov 5 15:43 syslog +-rw-r--r-- 1 root root 145 Feb 19 2018 wtmp +``` + +**/etc/logrotate.conf** - Profilo globale per la rotazione dei registri. Se le voci di configurazione o i parametri si sovrappongono, prevarranno le voci di configurazione o i parametri letti per ultimi. Ordine di lettura: + +1. Leggere il contenuto del file **/etc/logrotate.conf** da cima a fondo +2. File inclusi utilizzando la parola chiave "include" + +Le voci o i parametri di configurazione più comuni sono: + +| items | descrizione | +| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `daily` | Definisce il ciclo di rotazione dei registri in giorni | +| `weekly` | Definisce il ciclo di rotazione dei log in settimane | +| `monthly` | Definisce il ciclo di rotazione dei log in mesi | +| `rotate ` | Il numero di file salvati dopo la rotazione dei registri | +| `compress` | La compressione dei vecchi registri avviene dopo la rotazione dei registri | +| `create ` | Dopo la rotazione dei log, definire il proprietario, il gruppo e le autorizzazioni del nuovo file di log | +| `mail ` | Dopo la rotazione dei log, inviare il contenuto dell'output via e-mail all'indirizzo di posta elettronica specificato | +| `missingok` | Se il file di log non esiste, vengono ignorate le informazioni di avviso nel log | +| `notifempty` | Se il contenuto del file di registro è vuoto, non si verifica alcuna rotazione del registro | +| `minsize ` | La condizione di dimensione del file per la rotazione dei registri, cioè la rotazione dei registri avviene solo quando soddisfa questa condizion | +| `dateext` | Utilizza la data come suffisso del file per la rotazione dei log | + +Se si installa il pacchetto software dal repository, il manutentore del pacchetto software definisce la rotazione dei log dell'applicazione e gli utenti di solito non devono modificare le regole di rotazione dei log. Se si installa l'applicazione compilando il codice sorgente, è necessario considerare e configurare manualmente la rotazione dei log. + +#### comando \`logrotate + +L'uso è `logrotate [OPTION...] ` + +- `-v` - Visualizza il processo di rotazione dei registri +- `-f` - L'applicazione della rotazione dei registri avviene indipendentemente dal fatto che le condizioni per la rotazione dei registri siano soddisfatte o meno + +```bash +Shell > logrotate -v /etc/logrotate.conf +reading config file /etc/logrotate.conf +including /etc/logrotate.d +reading config file btmp +reading config file chrony +reading config file dnf +reading config file firewalld +reading config file kvm_stat +reading config file sssd +reading config file syslog +reading config file wtmp +Reading state from file: /var/lib/logrotate/logrotate.status +Allocating hash table for state file, size 64 entries +Creating new state +Creating new state +Creating new state +Creating new state +Creating new state +Creating new state +Creating new state +Creating new state +Creating new state +Creating new state +Creating new state +Creating new state +Creating new state +Creating new state +Creating new state +Creating new state +Creating new state + +Handling 8 logs + +rotating pattern: /var/log/btmp monthly (1 rotations) +empty log files are rotated, old logs are removed +considering log /var/log/btmp + Now: 2025-04-24 12:35 + Last rotated at 2025-04-04 12:08 + log does not need rotating (log has been rotated at 2025-4-4 12:8, that is not month ago yet) + +rotating pattern: /var/log/chrony/*.log weekly (4 rotations) +empty log files are rotated, old logs are removed +considering log /var/log/chrony/*.log + log /var/log/chrony/*.log does not exist -- skipping +not running postrotate script, since no logs were rotated + +rotating pattern: /var/log/hawkey.log weekly (4 rotations) +empty log files are not rotated, old logs are removed +considering log /var/log/hawkey.log + Now: 2025-04-24 12:35 + Last rotated at 2025-04-19 09:11 + log does not need rotating (log has been rotated at 2025-4-19 9:11, that is not week ago yet) + +rotating pattern: /var/log/firewalld weekly (4 rotations) +empty log files are rotated, only log files >= 1048576 bytes are rotated, old logs are removed +considering log /var/log/firewalld + Now: 2025-04-24 12:35 + Last rotated at 2024-05-20 13:00 + log does not need rotating ('minsize' directive is used and the log size is smaller than the minsize value) + +rotating pattern: /var/log/kvm_stat.csv 10485760 bytes (5 rotations) +empty log files are rotated, old logs are removed +considering log /var/log/kvm_stat.csv + log /var/log/kvm_stat.csv does not exist -- skipping + +rotating pattern: /var/log/sssd/*.log weekly (2 rotations) +empty log files are not rotated, old logs are removed +considering log /var/log/sssd/sssd_implicit_files.log + Now: 2025-04-24 12:35 + Last rotated at 2024-05-26 12:42 + log does not need rotating (log is empty) +considering log /var/log/sssd/sssd_kcm.log + Now: 2025-04-24 12:35 + Last rotated at 2025-02-08 13:49 + log does not need rotating (log is empty) +considering log /var/log/sssd/sssd.log + Now: 2025-04-24 12:35 + Last rotated at 2024-05-26 12:42 + log does not need rotating (log is empty) +considering log /var/log/sssd/sssd_nss.log + Now: 2025-04-24 12:35 + Last rotated at 2024-05-26 12:42 + log does not need rotating (log is empty) +not running postrotate script, since no logs were rotated + +rotating pattern: /var/log/cron +/var/log/maillog +/var/log/messages +/var/log/secure +/var/log/spooler + weekly (4 rotations) +empty log files are rotated, old logs are removed +considering log /var/log/cron + Now: 2025-04-24 12:35 + Last rotated at 2025-04-19 09:11 + log does not need rotating (log has been rotated at 2025-4-19 9:11, that is not week ago yet) +considering log /var/log/maillog + Now: 2025-04-24 12:35 + Last rotated at 2025-04-19 09:11 + log does not need rotating (log has been rotated at 2025-4-19 9:11, that is not week ago yet) +considering log /var/log/messages + Now: 2025-04-24 12:35 + Last rotated at 2025-04-19 09:11 + log does not need rotating (log has been rotated at 2025-4-19 9:11, that is not week ago yet) +considering log /var/log/secure + Now: 2025-04-24 12:35 + Last rotated at 2025-04-19 09:11 + log does not need rotating (log has been rotated at 2025-4-19 9:11, that is not week ago yet) +considering log /var/log/spooler + Now: 2025-04-24 12:35 + Last rotated at 2025-04-19 09:11 + log does not need rotating (log has been rotated at 2025-4-19 9:11, that is not week ago yet) +not running postrotate script, since no logs were rotated + +rotating pattern: /var/log/wtmp monthly (1 rotations) +empty log files are rotated, only log files >= 1048576 bytes are rotated, old logs are removed +considering log /var/log/wtmp + Now: 2025-04-24 12:35 + Last rotated at 2024-05-20 13:00 + log does not need rotating ('minsize' directive is used and the log size is smaller than the minsize value) +``` + +## journald + +`systemd` è un'applicazione utilizzata per l'inizializzazione e si occupa di molti componenti del sistema. Usare `journald` in `systemd` per rilevare il contenuto del log. + +`journald` è il demone di `systemd` che si occupa dei registri. È necessario utilizzare il comando `journalctl` per leggere i log. + +Si noti che `journald` non abilita la persistenza dei registri per impostazione predefinita, il che significa che conserva e registra solo tutti i registri dall'avvio. Dopo il riavvio del sistema operativo, si verifica l'eliminazione dei registri storici. Tutti i file di registro salvati temporaneamente si trovano per impostazione predefinita nella directory **/run/log/journal/**. + +```bash +Shell > tree -hugp /run/log/journal/638c6d5d2b674f77be56174469099106/ +/run/log/journal/638c6d5d2b674f77be56174469099106/ +└── [-rw-r----- root systemd-journal 8.0M] system.journal + +0 directories, 1 file +``` + +Questo file temporaneo è binario. È necessario utilizzare il comando `journalctl` per analizzarlo. + +`journald` può registrare: + +- boot log +- kernel log +- application log + +`journald` contrassegna i registri in base a **priorità** e **struttura**: + +- **priorità** - L'importanza della marcatura dei registri. Come per `rsyslog`, più alta è la priorità, meno informazioni vengono registrate e più grave è il problema. Più bassa è la priorità, più informazioni vengono registrate e più leggero è il problema. Ordinato per priorità, da bassa a alta: + + | Codice numerico | priorità | parole chiave | + | :-------------- | :------------ | :------------ | + | 7 | Debug | `debug` | + | 6 | Informational | `info` | + | 5 | Notice | `notice` | + | 4 | Warning | `warning` | + | 3 | Errore | `err` | + | 2 | Critical | `crit` | + | 1 | Alert | `alert` | + | 0 | Emergency | `emerg` | + +- **struttura** - Questa tabella mostra la struttura: + + | Codice numerico | struttura | + | :-------------- | :--------- | + | 0 | `kern` | + | 1 | `user` | + | 2 | `mail` | + | 3 | `daemon` | + | 4 | `auth` | + | 5 | `syslog` | + | 6 | `lpr` | + | 7 | `news` | + | 8 | `uucp` | + | 9 | | + | 10 | `authpriv` | + | 11 | `ftp` | + | 12 | | + | 13 | | + | 14 | | + | 15 | `cron` | + | 16 | `local0` | + | 17 | `local1` | + | 18 | `local2` | + | 19 | `local3` | + | 20 | `local4` | + | 21 | `local5` | + | 22 | `local6` | + | 23 | `local7` | + +### comando `journalctl` + +L'uso è `journalctl [OPTIONS...] [MATCHES...]`. + +Ecco un elenco delle opzioni in un elenco non ordinato: + +- `-u` - Specifica l''unità'; si può usare più volte in un comando a riga singola. Per esempio, `journalctl -u crond.service -u sshd.service` +- `--system` - Mostra i messaggi dei servizi di sistema e del kernel +- `--user` - Mostra i messaggi del servizio dell'utente corrente +- `-k` - Mostra il registro dei messaggi del kernel dall'avvio corrente +- `--since=DATA` o `-S` - Mostra le voci che non sono più vecchie della data specificata. Il formato della data è "AAAA-MM-GG HH:MM:SS". Per esempio `journalctl --since="2025-04-24 14:00:30` +- `--until=DATA` o `-U` - Mostra le voci che non sono più recenti della data specificata. Il formato della data è "AAAA-MM-GG HH:MM:SS". Ad esempio `journalctl --since="2025-04-01 05:00:10" --until="2025-04-05 18:00:30"` +- `--list-boots` - Mostra informazioni sintetiche sugli avvii registrati +- `-n N` - Controlla il numero di voci emesse. Se non viene specificato "N", il valore predefinito è 10 +- `-p PRIORITY` - Specifica la priorità o l'intervallo di priorità. Se si specifica una singola parola chiave di priorità del registro, verrà visualizzata questa priorità e le voci superiori a questa priorità. Ad esempio, `journalctl -p 3` o `journalctl -p err` Equivalente a `journalctl -p 0..3` o `journalctl -p emerg..err` +- `-b` - Interroga il registro dall'inizio dell'ID di avvio corrente. Non confondere l'ID di avvio con il numero di indice dell'avvio del kernel. +- `-f` - Log dinamico delle query, simile al comando `tail -f` +- `-x` - Aggiunge le spiegazioni dei messaggi, se disponibili +- `-e` - Salta alla pagina finale del log, spesso usato con l'opzione `-x` +- `-r` - Registro inverso. +- `--disk-usage` - Visualizza lo spazio su disco occupato dai file di log +- `--rotate` - Richiede la rotazione immediata dei journal file +- `--vacuum-size=BYTES` - Riduce il file di log alla dimensione specificata. Elimina gradualmente il contenuto del vecchio registro fino a raggiungere la dimensione del file specificata. I suffissi di dimensione supportati sono K, M, G, T +- `--vacuum-time=TIME` - È possibile eliminare i vecchi record di log specificando un punto temporale, cioè cancellerà i record di log precedenti. I suffissi temporali supportati sono s, m, h, giorni, mesi, settimane, anni +- `--vacuum-files=INT` - Indica quanti file di log riservare +- `-N` - Elenca tutti i nomi dei campi attualmente utilizzati. Gli utenti possono utilizzare il metodo "FIELD=VALUE" per abbinare i contenuti correlati. Ad esempio, `journalctl _SYSTEMD_UNIT=sshd.service`. +- `-g` o `-grep=PATTERN` - Corrisponde al contenuto del registro attraverso uno schema e supporta le espressioni regolari. Se PATTERN è tutto minuscolo, il contenuto del registro non è sensibile alle maiuscole per impostazione predefinita. È possibile regolare la sensibilità alle maiuscole attraverso l'opzione `--case-sensitive` +- `--case-sensitive=[BOOLEAN]` - Regola la sensibilità alle maiuscole. +- `-o` o `--output=STRING` - Cambia la modalità di output di `journalctl`. Una STRING può essere short, short-precise, short-iso, short-iso-precise, short-full, short-monotonic, short-unix, verbose, export, json, json-pretty, json-sse, cat, e with-unit +- `-q` o `--quiet` - Output silenzioso +- `--sync` - Sincronizza i messaggi del journal non scritti su disco + +### /etc/systemd/journald.conf + +```bash +Shell > cat /etc/systemd/journald.conf +[Journal] +#Storage=auto +#Compress=yes +#Seal=yes +#SplitMode=uid +#SyncIntervalSec=5m +#RateLimitIntervalSec=30s +#RateLimitBurst=10000 +#SystemMaxUse= +#SystemKeepFree= +#SystemMaxFileSize= +#SystemMaxFiles=100 +#RuntimeMaxUse= +#RuntimeKeepFree= +#RuntimeMaxFileSize= +#RuntimeMaxFiles=100 +#MaxRetentionSec= +#MaxFileSec=1month +#ForwardToSyslog=no +#ForwardToKMsg=no +#ForwardToConsole=no +#ForwardToWall=yes +#TTYPath=/dev/console +#MaxLevelStore=debug +#MaxLevelSyslog=debug +#MaxLevelKMsg=notice +#MaxLevelConsole=info +#MaxLevelWall=emerg +#LineMax=48K +``` + +Utilizzare "[ ]" per contenere il titolo, come per i file di configurazione di altri componenti di `systemd`, e sotto il titolo ci sono coppie chiave-valore specifiche. Nella coppia chiave-valore non ci sono **spazi su entrambi i lati del segno di uguale**. Per la pagina completa del manuale di configurazione, vedere `man 5 journald.conf` + +- `Storage=` - Controlla la posizione dell'archivio dati di `journald`. Il valore predefinito è auto. + + - volatile - Memorizza i dati di registro in memoria, cioè nel file temporaneo situato nella directory **/run/log/journal/**. + - persistent - Memorizza i dati di log nella directory **/var/log/journal/**. È necessario crearla manualmente. Se questa directory non è scrivibile, i dati di log verranno scritti nella directory **/run/log/journal/**. + - auto - Simile a persistent + - none - Non salva alcun registro, ma non influisce sui registri inoltrati ad altri "targets" + +- `Compress=` - Se abilitare la funzione di compressione. Il valore predefinito è yes. + +- `Seal=` - Se usare FSS (Forward Secure Sealing) per proteggere le voci di registro da manomissioni dolose. Il valore predefinito è yes. + +- `SplitMode=` - Definisce la base per la suddivisione dei file di log. La precondizione (Storage=persistent) deve essere soddisfatta prima che abbia effetto. Il valore predefinito è uid. + +- `SyncIntervalSec=` - Definisce l'intervallo di tempo per la sincronizzazione dei dati di registro in memoria con il disco. Attenzione! Questo avviene solo per le priorità dei log err, warning, notice, info e debug. Le altre priorità di registro vengono immediatamente sincronizzate su disco. Il valore predefinito è 5m. + +- `RateLimitIntervalSec=` - Definisce l'intervallo di tempo per la frequenza di generazione dei registri. Il valore predefinito è 30s. + +- `RateLimitBurst=` - Il numero massimo di voci che il log genera in un determinato intervallo di tempo. Il valore predefinito è 10000. Se le voci di registro sono superiori a 10000 in un determinato intervallo di tempo, vengono eliminati i registri ridondanti e non vengono create nuove voci di registro fino all'intervallo di tempo successivo. + +- `SystemMaxUse=` - Controlla la dimensione totale di tutti i file di log nella directory **/var/log/journal/**. + +- `SystemKeepFree=` - Controlla quanto spazio su disco riservare alla directory **/var/log/journal/**. In base a 1024, i suffissi includono K, M, G, T, P, E + +- `SystemMaxFileSize=` - Limita la dimensione di un singolo file nella directory **/var/log/journal/**. Se la dimensione supera quella specificata, si verificherà una rotazione del registro + +- `SystemMaxFiles=` - Specifica quanti file mantenere nella directory **/var/log/journal/**. Quando supera il numero definito, cancella il registro più vecchio. + +- `RuntimeMaxUse=` - Controlla la dimensione totale dei dati di log nella directory **/run/log/journal/**. + +- `RuntimeKeepFree=` - Controlla quanto spazio riservare nella directory **/run/log/journal/**. + +- `RuntimeMaxFileSize=` - Controlla la dimensione di un singolo file di log nella directory **/run/log/journal/**. Quando il registro raggiunge la dimensione specificata, si verifica la rotazione del registro. + +- `RuntimeMaxFiles=` - Quanti file di log devono essere conservati nella directory **/run/log/journal/**. + +- `MaxRetentionSec=` - Definisce il tempo di conservazione dei file di log; se supera il tempo definito, cancella i vecchi file di log. Il valore 0 indica che la funzione è disattivata. Il suffisso del valore è anno, mese, settimana, giorno, h, m + +- `MaxFileSec=` - Rotazione del registro basata sul tempo. Poiché il polling basato sulle dimensioni dei file (`SystemMaxFileSize` e `RuntimeMaxFileSize`) esiste già, il polling dei registri basato sul tempo è solitamente inutile. Impostare su 0 per disabilitare questa funzione. + +- `ForwardToSyslog=` - Se inoltrare i messaggi di log raccolti al demone tradizionale `syslog`. Il valore predefinito è no. + +- `ForwardToKMsg=` - Se inoltrare il messaggio di log ricevuto a kmsg. Il valore predefinito è no. + +- `ForwardToConsole=` - Se inoltrare i messaggi di log ricevuti alla console di sistema. Il valore predefinito è no. Se è impostato su yes, è necessario configurare anche `TTYPath` + +- `ForwardToWall=` - Se inviare il messaggio di log ricevuto come avviso a tutti gli utenti connessi. Il valore predefinito è yes. + +- `TTYPath=` - Specifica il percorso della console. Richiede `ForwardToConsole=yes`. Il valore predefinito è /dev/console + +- `MaxLevelStore=` - Imposta il livello massimo di log registrato nel file di log. Il valore predefinito è debug + +- `MaxLevelSyslog=` - Imposta il livello massimo di log inoltrati al demone tradizionale `syslog`. Il valore predefinito è debug + +- `MaxLevelKMsg=` - Imposta il livello massimo di log inviato a kmsg. Il valore predefinito è notice + +- `MaxLevelConsole=` - Imposta il livello massimo di log inoltrato alla console di sistema. Il valore predefinito è info + +- `MaxLevelWall=` - Imposta il livello massimo di log inviato a tutti gli utenti connessi. Il valore predefinito è `emerg` + +- `LineMax=` - La lunghezza massima consentita (byte) di ciascun record di log quando si converte il flusso di log in record di log. Con 1024 come base, il suffisso può essere K, M, G o T. Il valore predefinito è 48K + +## Altre istruzioni + +Se non si modifica alcuna configurazione in **/etc/systemd/journald.conf**, `rsyslog` e `journald` possono coesistere senza influenzarsi a vicenda. + +```bash +Shell > cat /etc/rsyslog.conf +... +#### MODULES #### + +module(load="imuxsock" # provides support for local system logging (e.g. via logger command) + SysSock.Use="off") # Turn off message reception via local log socket; + # local messages are retrieved through imjournal now. +module(load="imjournal" # provides access to the systemd journal + UsePid="system" # PID nummber is retrieved as the ID of the process the journal entry originates from + StateFile="imjournal.state") # File to store the position in the journal +#module(load="imklog") # reads kernel messages (the same are read from journald) +#module(load="immark") # provides --MARK-- message capability +... +``` + +`journald` inoltrerà i dati di log ottenuti al socket `/run/systemd/journal/syslog` per facilitare l'uso dei servizi di log tradizionali (rsyslog, syslog-ng). Tuttavia, dal file di configurazione si apprende che `rsyslog` non raccoglie i log da `journald` tramite socket, ma si integra attraverso il modulo di input (imjournal). + +**Q: Il sistema operativo non può usare `journald` per la registrazione** + +Sì. Per impostazione predefinita, `rsyslog` e `journald` possono coesistere nel sistema operativo senza influenzarsi a vicenda. La coesistenza non è la scelta migliore per alcuni scenari di utilizzo orientati alle prestazioni (come il throughput dei dati e il consumo di memoria). Si può fare in modo che `rsyslog` venga eseguito solo in modalità socket, il che aiuta a migliorare le prestazioni e a registrare tutti i log in testo normale. Tuttavia, se avete bisogno di registri strutturati, questa modifica non è adatta. Le fasi rilevanti sono le seguenti: + +```bash +Shell > vim /etc/rsyslog.config +... +module(load="imuxsock" + SysSock.Use="on") +# module(load="imjournal" +# UsePid="system" +# StateFile="imjournal.state") +module(load="imklog") +... + +Shell > vim /etc/systemd/journald.conf +[Journal] +Storage=none +... +ForwardToSyslog=yes +... + +Shell > reboot +``` diff --git a/docs/desktop/appimage/appimage_pool.it.md b/docs/desktop/appimage/appimage_pool.it.md index 94fd1e0d23..b9b1c6e8b8 100644 --- a/docs/desktop/appimage/appimage_pool.it.md +++ b/docs/desktop/appimage/appimage_pool.it.md @@ -1,7 +1,7 @@ --- title: Installare AppImages con AppImagePool author: Joseph Brinkman -contributors: Spencer Steven +contributors: Steven Spencer --- ## Introduzione diff --git a/docs/desktop/display/installing_nvidia_gpu_drivers.it.md b/docs/desktop/display/installing_nvidia_gpu_drivers.it.md index 473d40d841..e99e0d4f47 100644 --- a/docs/desktop/display/installing_nvidia_gpu_drivers.it.md +++ b/docs/desktop/display/installing_nvidia_gpu_drivers.it.md @@ -91,7 +91,7 @@ Nouveau è un driver NVIDIA open-source che offre funzionalità limitate rispett sudo grubby --args="nouveau.modeset=0 rd.driver.blacklist=nouveau" --update-kernel=ALL ``` -!!! Note "Nota" +!!! note "Nota" ```` Per i sistemi con l'avvio sicuro abilitato è necessario eseguire questo passaggio: diff --git a/docs/desktop/gnome/rdp-server.de.md b/docs/desktop/gnome/rdp-server.de.md index 028ef0fbe7..53210701b7 100644 --- a/docs/desktop/gnome/rdp-server.de.md +++ b/docs/desktop/gnome/rdp-server.de.md @@ -82,7 +82,7 @@ Für Anfänger: Diese Befehle öffnen den RDP-Port in Ihrer Firewall, sodass Sie Wenn Sie keinen Neustart durchführen möchten, sollten Sie sich abmelden. RDP verwendet aus Sicherheitsgründen die Anmeldeinformationen Ihres Benutzerkontos. Eine Remote-Anmeldung ist nicht möglich, wenn Sie bereits lokal bei Ihrem Desktop angemeldet sind. Zumindest nicht mit gleichen Benutzerkonto. -!!! info +!!! info "Info" ``` Sie können auch die Firewall-App verwenden, um `firewalld` zu verwalten und alle gewünschten Ports zu öffnen. In diesem Bereich der Rocky Linux Doku finden Sie einen Link zu einer Anleitung des Autors zur Installation und Verwendung der Firewall-App. diff --git a/docs/desktop/gnome/screenshot.it.md b/docs/desktop/gnome/screenshot.it.md index ce4aed17a2..1bfa47ba45 100644 --- a/docs/desktop/gnome/screenshot.it.md +++ b/docs/desktop/gnome/screenshot.it.md @@ -20,7 +20,7 @@ Questa guida presuppone che si disponga di quanto segue: Secondo [il sito web di GNOME](https://apps.gnome.org/), questa applicazione è preinstallata sul desktop. ``` -## Istruzioni +## Come si usa Per utilizzare Screenshot, procedere come segue: diff --git a/docs/desktop/gnome/user_and_group_account_management.it.md b/docs/desktop/gnome/user_and_group_account_management.it.md index b94ed603d0..7392ab7650 100644 --- a/docs/desktop/gnome/user_and_group_account_management.it.md +++ b/docs/desktop/gnome/user_and_group_account_management.it.md @@ -128,7 +128,7 @@ Per eliminare un account utente: ![img](images/user_group_acctmgt_images/16.png) -Oppure +O - Fare clic sul nome utente evidenziato in blu e selezionare la casella **Elimina** diff --git a/docs/desktop/gnome/valuta.it.md b/docs/desktop/gnome/valuta.it.md index 2938b0328b..18ff6b4f75 100644 --- a/docs/desktop/gnome/valuta.it.md +++ b/docs/desktop/gnome/valuta.it.md @@ -36,7 +36,7 @@ Questa guida presuppone che si disponga di quanto segue: flatpak run flathub io.github.idevecore.Valuta ``` -## Guida all'uso +## Come si usa Per utilizzare Valuta, procedere come segue: diff --git a/docs/gemstones/containers/docker.it.md b/docs/gemstones/containers/docker.it.md index fc13178a3e..beb7721d04 100644 --- a/docs/gemstones/containers/docker.it.md +++ b/docs/gemstones/containers/docker.it.md @@ -41,7 +41,7 @@ Aggiungere un utente non root al gruppo `docker` per consentire all'utente di g Questo è un passo facoltativo, ma può essere comodo se si è l'utente principale del sistema o se si vuole permettere a più utenti di gestire docker, ma non si vuole concedere loro i permessi `sudo`. -Digitare: +Digita: ```bash # Add the current user diff --git a/docs/gemstones/git/02_github_web_edit_pr_title.it.md b/docs/gemstones/git/02_github_web_edit_pr_title.it.md index 3a8173f7b1..0081e1e13d 100644 --- a/docs/gemstones/git/02_github_web_edit_pr_title.it.md +++ b/docs/gemstones/git/02_github_web_edit_pr_title.it.md @@ -5,7 +5,7 @@ contributors: Ganna Zhyrnova tags: - GitHub - Pull Request - - Documentation + - Documentazione --- ## Introduzione diff --git a/docs/gemstones/test_cpu_compat.it.md b/docs/gemstones/test_cpu_compat.it.md index b9d116863c..fd1d44feea 100644 --- a/docs/gemstones/test_cpu_compat.it.md +++ b/docs/gemstones/test_cpu_compat.it.md @@ -1,6 +1,6 @@ --- title: Test di compatibilità della CPU -author: Spencer Steven +author: Steven Spencer contributors: Louis Abel, Ganna Zhyrnova tags: - cpu test diff --git a/docs/guides/backup/dump_restore.it.md b/docs/guides/backup/dump_restore.it.md new file mode 100644 index 0000000000..3b9361a7d8 --- /dev/null +++ b/docs/guides/backup/dump_restore.it.md @@ -0,0 +1,230 @@ +--- +title: Comandi dump e restore +author: tianci li +contributors: Steven Spencer +tested_with: 8.10 +tags: + - dump + - restore + - backup +--- + +## Panoramica + +`dump` esamina i file di un filesystem, determina di quali eseguire il backup e copia tali file su un disco, un nastro o un altro supporto di memorizzazione specificato. Il comando `restore` esegue la funzione inversa di `dump`. + +Questa utilità si applica ai seguenti file system: + +- ext2 +- ext3 +- ext4 + +!!! tip + +``` +Per il file system xfs, usare `xfsdump`. +``` + +[Questa](https://dump.sourceforge.io/) è la homepage del progetto. + +Prima di utilizzare questa utility, eseguire il seguente comando per installarla: + +```bash +Shell > dnf -y install dump +``` + +Dopo l'installazione, sono disponibili due strumenti di comando comunemente utilizzati: + +- `dump` +- `restore` + +### Comando `dump` + +Questo comando può essere utilizzato principalmente in due modi: + +- Eseguire operazioni di backup (dump) - `dump [opzione/i] -f ...` +- Esaminare le informazioni di backup (dump) - `dump [-W | -w]` + +Le opzioni più comuni sono: + +- `-` - Livello di backup. Sostituire “livello” con un numero qualsiasi da 0 a 9 quando viene utilizzato. Il numero 0 rappresenta il backup completo, mentre gli altri numeri rappresentano il backup incrementale. +- `-f ` - Specifica il nome e il percorso del file dopo il backup. +- `-u` - Dopo un backup riuscito, registra l'ora del backup nel file **/etc/dumpdates**. È possibile utilizzare l'opzione `-u` quando l'oggetto di cui si esegue il backup è una partizione indipendente. Tuttavia, non è possibile utilizzare l'opzione `-u` quando l'oggetto di backup è una directory non partizionata. +- `-v` - Visualizza i dettagli dell'elaborazione durante il processo di backup. +- `-W` - Un'opzione per visualizzare le informazioni sul dump. +- `-z[LEVEL]` - Regola il livello di compressione usando la libreria zlib, con un livello di compressione predefinito pari a 2. Ad esempio, è possibile comprimere il file di backup in formato `.gz`. L'intervallo di regolazione del livello di compressione è da 1 a 9. +- `-j[LEVEL]` - Regola il livello di compressione usando la libreria bzlib, con un livello di compressione predefinito pari a 2. Ad esempio, è possibile comprimere il file di backup in formato `.bz2`. L'intervallo di regolazione del livello di compressione è da 1 a 9. + +#### Esempio di utilizzo di `dump` + +1. Eseguire un backup completo della partizione principale: + + ```bash + Shell > dump -0u -j3 -f /tmp/root-20241208.bak.bz2 / + DUMP: Date of this level 0 dump: Sun Dec 8 19:04:39 2024 + DUMP: Dumping /dev/nvme0n1p2 (/) to /tmp/root-20241208.bak.bz2 + DUMP: Label: none + DUMP: Writing 10 Kilobyte records + DUMP: Compressing output at transformation level 3 (bzlib) + DUMP: mapping (Pass I) [regular files] + DUMP: mapping (Pass II) [directories] + DUMP: estimated 14693111 blocks. + DUMP: Volume 1 started with block 1 at: Sun Dec 8 19:04:41 2024 + DUMP: dumping (Pass III) [directories] + DUMP: dumping (Pass IV) [regular files] + DUMP: 20.69% done at 10133 kB/s, finished in 0:19 + DUMP: 43.74% done at 10712 kB/s, finished in 0:12 + DUMP: 70.91% done at 11575 kB/s, finished in 0:06 + DUMP: 93.23% done at 11415 kB/s, finished in 0:01 + DUMP: Closing /tmp/root-20241208.bak.bz2 + DUMP: Volume 1 completed at: Sun Dec 8 19:26:08 2024 + DUMP: Volume 1 took 0:21:27 + DUMP: Volume 1 transfer rate: 5133 kB/s + DUMP: Volume 1 14722930kB uncompressed, 6607183kB compressed, 2.229:1 + DUMP: 14722930 blocks (14377.86MB) on 1 volume(s) + DUMP: finished in 1287 seconds, throughput 11439 kBytes/sec + DUMP: Date of this level 0 dump: Sun Dec 8 19:04:39 2024 + DUMP: Date this dump completed: Sun Dec 8 19:26:08 2024 + DUMP: Average transfer rate: 5133 kB/s + DUMP: Wrote 14722930kB uncompressed, 6607183kB compressed, 2.229:1 + DUMP: DUMP IS DONE + + Shell > ls -lh /tmp/root-20241208.bak.bz2 + -rw-r--r-- 1 root root 6.4G Dec 8 19:26 /tmp/root-20241208.bak.bz2 + ``` + +2. Dopo aver effettuato lo scarico, controllare le informazioni pertinenti: + + ```bash + Shell > cat /etc/dumpdates + /dev/nvme0n1p2 0 Sun Dec 8 19:04:39 2024 +0800 + + Shell > dump -W + Last dump(s) done (Dump '>' file systems): + /dev/nvme0n1p2 ( /) Last dump: Level 0, Date Sun Dec 8 19:04:39 2024 + ``` + +3. Implementare il backup incrementale sulla base del backup completo: + + ```bash + Shell > echo "jack" >> /tmp/tmpfile.txt + + Shell > dump -1u -j4 -f /tmp/root-20241208-LV1.bak.bz2 / + DUMP: Date of this level 1 dump: Sun Dec 8 19:38:51 2024 + DUMP: Date of last level 0 dump: Sun Dec 8 19:04:39 2024 + DUMP: Dumping /dev/nvme0n1p2 (/) to /tmp/root-20241208-LV1.bak.bz2 + DUMP: Label: none + DUMP: Writing 10 Kilobyte records + DUMP: Compressing output at transformation level 4 (bzlib) + DUMP: mapping (Pass I) [regular files] + DUMP: mapping (Pass II) [directories] + DUMP: estimated 6620898 blocks. + DUMP: Volume 1 started with block 1 at: Sun Dec 8 19:38:58 2024 + DUMP: dumping (Pass III) [directories] + DUMP: dumping (Pass IV) [regular files] + DUMP: 38.13% done at 8415 kB/s, finished in 0:08 + DUMP: 75.30% done at 8309 kB/s, finished in 0:03 + DUMP: Closing /tmp/root-20241208-LV1.bak.bz2 + DUMP: Volume 1 completed at: Sun Dec 8 19:52:03 2024 + DUMP: Volume 1 took 0:13:05 + DUMP: Volume 1 transfer rate: 8408 kB/s + DUMP: Volume 1 6620910kB uncompressed, 6600592kB compressed, 1.004:1 + DUMP: 6620910 blocks (6465.73MB) on 1 volume(s) + DUMP: finished in 785 seconds, throughput 8434 kBytes/sec + DUMP: Date of this level 1 dump: Sun Dec 8 19:38:51 2024 + DUMP: Date this dump completed: Sun Dec 8 19:52:03 2024 + DUMP: Average transfer rate: 8408 kB/s + DUMP: Wrote 6620910kB uncompressed, 6600592kB compressed, 1.004:1 + DUMP: DUMP IS DONE + + Shell > cat /etc/dumpdates + /dev/nvme0n1p2 0 Sun Dec 8 19:04:39 2024 +0800 + /dev/nvme0n1p2 1 Sun Dec 8 19:38:51 2024 +0800 + + Shell > dump -W + Last dump(s) done (Dump '>' file systems): + /dev/nvme0n1p2 ( /) Last dump: Level 1, Date Sun Dec 8 19:38:51 2024 + ``` + +4. Per le directory non partizionate, è possibile utilizzare solo l'opzione Backup completo (`-0`), non l'opzione `-u`: + + ```bash + Shell > dump -0uj -f /tmp/etc-full-20241208.bak.bz2 /etc/ + DUMP: You can't update the dumpdates file when dumping a subdirectory + DUMP: The ENTIRE dump is aborted. + + Shell > dump -0j -f /tmp/etc-full-20241208.bak.bz2 /etc/ + DUMP: Date of this level 0 dump: Sun Dec 8 20:00:38 2024 + DUMP: Dumping /dev/nvme0n1p2 (/ (dir etc)) to /tmp/etc-full-20241208.bak.bz2 + DUMP: Label: none + DUMP: Writing 10 Kilobyte records + DUMP: Compressing output at transformation level 2 (bzlib) + DUMP: mapping (Pass I) [regular files] + DUMP: mapping (Pass II) [directories] + DUMP: estimated 28204 blocks. + DUMP: Volume 1 started with block 1 at: Sun Dec 8 20:00:38 2024 + DUMP: dumping (Pass III) [directories] + DUMP: dumping (Pass IV) [regular files] + DUMP: Closing /tmp/etc-full-20241208.bak.bz2 + DUMP: Volume 1 completed at: Sun Dec 8 20:00:40 2024 + DUMP: Volume 1 took 0:00:02 + DUMP: Volume 1 transfer rate: 3751 kB/s + DUMP: Volume 1 29090kB uncompressed, 7503kB compressed, 3.878:1 + DUMP: 29090 blocks (28.41MB) on 1 volume(s) + DUMP: finished in 2 seconds, throughput 14545 kBytes/sec + DUMP: Date of this level 0 dump: Sun Dec 8 20:00:38 2024 + DUMP: Date this dump completed: Sun Dec 8 20:00:40 2024 + DUMP: Average transfer rate: 3751 kB/s + DUMP: Wrote 29090kB uncompressed, 7503kB compressed, 3.878:1 + DUMP: DUMP IS DONE + ``` + + L'esecuzione di un backup incrementale della directory /etc/ genera un errore: + + ```bash + Shell > dump -1j -f /tmp/etc-incr-20241208.bak.bz2 /etc/ + DUMP: Only level 0 dumps are allowed on a subdirectory + DUMP: The ENTIRE dump is aborted. + ``` + +### Comando `restore` + +L'uso di questo comando è - `restore [opzione/i] -f `. + +La modalità (flag) può essere una delle seguenti: + +- `-C` - Modalità di confronto. Il ripristino legge il backup e ne confronta il contenuto con i file presenti su disco. Viene utilizzato principalmente per il confronto dopo l'esecuzione di un backup su una partizione. In questa modalità, `restore` confronta solo le modifiche basandosi sui dati di origine. Se sul disco sono presenti nuovi dati, non è possibile confrontarli o rilevarli. +- `-i` - Modalità interattiva. Questa modalità consente il ripristino interattivo dei file da un dump. +- `-t` - Modalità elenco. Elenca i dati contenuti nel file di backup. +- `-r` - Modalità di ripristino (rebuild). Se si tratta di un metodo “Backup completo + backup incrementale”, il ripristino dei dati avverrà in ordine cronologico. +- `-x` - Modalità estrazione. Estrarre alcuni o tutti i file dal file di backup. + +#### Esempio di utilizzo di `restore` + +1. Ripristinare i dati da /tmp/etc-full-20241208.bak.bz2 : + + ```bash + Shell > mkdir /tmp/data/ + + Shell > restore -t -f /tmp/etc-full-20241208.bak.bz2 + + Shell > cd /tmp/data/ ; restore -r -f /tmp/etc-full-20241208.bak.bz2 + + Shell > ls -l /tmp/data/ + total 4992 + drwxr-xr-x. 90 root root 4096 Dec 8 17:13 etc + -rw------- 1 root root 5107632 Dec 8 20:39 restoresymtable + ``` + + Come si può vedere, dopo un ripristino riuscito viene visualizzato un file chiamato `restoresymtable`. Questo file è importante. Serve per le operazioni di ripristino del sistema di backup incrementale. + +2. Elaborare i file di backup in modalità interattiva: + + ```bash + Shell > restore -i -f /tmp/etc-full-20241208.bak.bz2 + Dump tape is compressed. + + restore > ? + ``` + + È possibile digitare ++question++ per visualizzare i comandi interattivi disponibili in questa modalità. diff --git a/docs/guides/backup/mirroring_lsyncd.it.md b/docs/guides/backup/mirroring_lsyncd.it.md index 9e3d0f9488..6bfd2b4324 100644 --- a/docs/guides/backup/mirroring_lsyncd.it.md +++ b/docs/guides/backup/mirroring_lsyncd.it.md @@ -9,127 +9,140 @@ tags: - mirroring --- -# Soluzione di mirroring - `lsyncd` - ## Prerequisiti -Ecco tutto ciò di cui avrete bisogno per capire e seguire questa guida: - -* Un computer con Rocky Linux in esecuzione -* Un livello di confidenza con la modifica dei file di configurazione da riga di comando -* Conoscenza dell'uso di un editor a riga di comando (qui usiamo vi, ma potete usare il vostro editor preferito) -* È necessario avere accesso a root e, idealmente, essere registrati come utente root nel proprio terminale -* Coppia di chiavi SSH pubbliche e private -* I repository EPEL di Fedora -* È necessario avere familiarità con *inotify*, un'interfaccia per il monitoraggio degli eventi -* Facoltativo: familiarità con *tail* +- Un computer con Rocky Linux in esecuzione +- Un livello di confidenza con la modifica dei file di configurazione da riga di comando +- Conoscenza dell'uso di un editor a riga di comando (in questo caso si utilizza `vi`, ma è possibile utilizzare l'editor preferito) +- È necessario avere accesso a root e, idealmente, essere registrati come utente root nel proprio terminale +- Coppia di chiavi SSH pubbliche e private +- I repository EPEL (Extra Packages for Enterprise Linux) di Fedora +- È necessario avere familiarità con *inotify*, un'interfaccia per il monitoraggio degli eventi +- Facoltativo: familiarità con *tail* ## Introduzione -Se state cercando un modo per sincronizzare automaticamente file e cartelle tra i computer, `lsyncd` è un'ottima opzione. L'unico inconveniente per i principianti? È necessario configurare tutto alla riga di comando e nei file di testo. +Se si desidera sincronizzare automaticamente file e cartelle tra computer, `lsyncd` è un'ottima opzione. Tuttavia, è necessario configurare tutto dalla riga di comando. -Tuttavia, è un programma che vale la pena di imparare per qualsiasi sysadmin. +È un programma che vale la pena di imparare per qualsiasi amministratore di sistema. -La migliore descrizione di `lsyncd` proviene dalla sua stessa pagina man. Parafrasando leggermente, `lsyncd` è una soluzione live mirror leggera e non difficile da installare. Non richiede nuovi filesystem o dispositivi a blocchi e non ostacola le prestazioni del filesystem locale. In breve, fa il mirror dei file. +La migliore descrizione di `lsyncd` e' fornita dalla sua stessa pagina man. Parafrasando leggermente, `lsyncd` è una soluzione live mirror leggera e non difficile da installare. Non richiede nuovi file system o dispositivi a blocchi e non ostacola le prestazioni del file system locale. In breve, fa il mirror dei file. -`lsyncd` controlla un'interfaccia di monitoraggio degli eventi degli alberi delle directory locali (inotify). Aggrega e combina gli eventi per alcuni secondi, quindi genera uno (o più) processi per sincronizzare le modifiche. Per impostazione predefinita è `rsync`. +`lsyncd` controlla un'interfaccia di monitoraggio degli eventi degli alberi delle directory locali (inotify). Aggrega e combina gli eventi per alcuni secondi e genera uno (o più) processi per sincronizzare le modifiche. Per impostazione predefinita, si tratta di `rsync`. -Ai fini di questa guida, il sistema con i file originali sarà chiamato "sorgente", mentre quello su cui si sta effettuando la sincronizzazione sarà la "destinazione". È possibile eseguire il mirroring completo di un server utilizzando `lsyncd`, specificando con molta attenzione le directory e i file che si desidera sincronizzare. È piuttosto facile! +Aggrega e combina gli eventi per alcuni secondi e genera uno (o più) processi per sincronizzare le modifiche. Utilizzando `lsyncd`, è possibile eseguire il mirroring completo di un server specificando attentamente le directory e i file che si desidera sincronizzare. -Per la sincronizzazione remota, è necessario impostare anche le [Coppie di Chiavi Pubbliche e Private Rocky Linux SSH](../security/ssh_public_private_keys.md). Gli esempi qui riportati utilizzano SSH (porta 22). +È inoltre necessario configurare [Rocky Linux SSH Public Private Key Pairs](../security/ssh_public_private_keys.md) per la sincronizzazione remota. Gli esempi qui riportati utilizzano SSH (porta 22). ## Installazione di `lsyncd` -Esistono due modi per installare `lsyncd`. Li includeremo entrambi in questa sede. L'RPM tende a rimanere un po' indietro rispetto ai pacchetti sorgente, ma solo di poco. La versione installata con il metodo RPM al momento in cui scriviamo è la 2.2.2-9, mentre la versione del codice sorgente è attualmente la 2.2.3. Detto questo, vogliamo offrirvi entrambe le opzioni e lasciarvi scegliere. +L'installazione di `lsyncd` avviene in due modi. Sono incluse le descrizioni di entrambi i metodi. L'RPM tende a rimanere un po' indietro rispetto ai pacchetti sorgente, ma solo di poco. La versione installata con il metodo RPM al momento in cui scriviamo è la 2.2.3-5, mentre la versione del codice sorgente è ora la 2.3.1. Scegliete il metodo con cui vi sentite più a vostro agio. ## Installazione di `lsyncd` - Metodo RPM -L'installazione della versione RPM non è difficile. L'unica cosa che dovrete installare prima è il repository del software EPEL di Fedora. Questo può essere fatto con un solo comando: +L'installazione della versione RPM è semplice. L'unica cosa che dovrete installare prima è il repository del software EPEL di Fedora. Eseguire: -`dnf install -y epel-release` - -A questo punto è sufficiente installare `lsyncd` e tutte le dipendenze mancanti saranno installate insieme ad esso: +```bash +dnf install -y epel-release +``` -`dnf install lsyncd` +Installare ora `lsyncd` con tutte le dipendenze mancanti: -Impostate il servizio in modo che parta all'avvio, ma non avviatelo ancora: +```bash +dnf install lsyncd +``` -`systemctl enable lsyncd` +Impostate il servizio in modo che si avvii all'avvio, ma non avviatelo ancora: -Fatto! +```bash +systemctl enable lsyncd +``` ## Installazione di `lsyncd` - Metodo sorgente -L'installazione da sorgente non è così male come sembra. Seguite questa guida e sarete subito operativi! +L'installazione dalla sorgente non è difficile. ### Installare le dipendenze -Avremo bisogno di alcune dipendenze: alcune richieste da `lsyncd` stesso e altre necessarie per compilare i pacchetti dai sorgenti. Usate questo comando sul vostro computer Rocky Linux per assicurarvi di avere le dipendenze necessarie. Se si costruisce dai sorgenti, è una buona idea avere tutti gli strumenti di sviluppo installati: +Sono necessarie alcune dipendenze per `lsyncd` e per costruire i pacchetti dai sorgenti. Usate questo comando sul vostro computer Rocky Linux per assicurarvi di avere le dipendenze necessarie. Se si compila dai sorgenti, è una buona idea avere tutti gli strumenti di sviluppo installati: -`dnf groupinstall 'Development Tools'` +```bash +dnf groupinstall 'Development Tools' +``` !!! warning "Per Rocky Linux 9.0" - `lsyncd` è stato completamente testato in Rocky Linux 9.0 e funzionerà come previsto. Per poter installare tutte le dipendenze necessarie, tuttavia, è necessario abilitare un repository aggiuntivo: + `lsyncd` è stato completamente testato in Rocky Linux 9.0 e funzionerà come previsto. Per installare tutte le dipendenze necessarie, tuttavia, è necessario abilitare un repository aggiuntivo: ``` dnf config-manager --enable crb ``` + Eseguendo questi nove passaggi prima dei successivi, si potrà terminare la costruzione senza tornare indietro. - Eseguendo questa operazione in 9 prima delle fasi successive, si potrà terminare la costruzione senza tornare indietro. - -Ecco le dipendenze necessarie per `lsyncd` stesso e per il suo processo di compilazione: +Ecco le dipendenze necessarie per `lsyncd`: -`dnf install lua lua-libs lua-devel cmake unzip wget rsync` +```bash +dnf install lua lua-libs lua-devel cmake unzip wget rsync +``` -### Scaricare `lsyncd` e costruirlo +### Scaricare `lsyncd` e compilarlo -Poi abbiamo bisogno del codice sorgente: +Successivamente, è necessario il codice sorgente: -`wget https://github.com/axkibe/lsyncd/archive/master.zip` +```bash +wget https://github.com/axkibe/lsyncd/archive/master.zip +``` -Ora decomprimere il file master.zip: +Decomprimere il file `master.zip:`: `unzip master.zip` -Verrà creata una directory chiamata "lsyncd-master". Dobbiamo passare a questa cartella e creare una cartella chiamata build: +Verrà creata una directory chiamata "lsyncd-master". È necessario passare a questa cartella e creare una cartella chiamata build: -`cd lsyncd-master` +```bash +cd lsyncd-master +``` -E quindi: +Quindi: -`mkdir build` +```bash +mkdir build +``` -Ora cambiate nuovamente directory, in modo da trovarvi nella directory di compilazione: +Cambiare directory per accedere alla directory di creazione: -`cd build` +```bash +cd build +``` -Ora eseguite questi comandi: +Eseguire questi comandi: -``` -cmake ... +```bash +cmake .. make make install ``` -Al termine, il binario `lsyncd` sarà installato e pronto all'uso in */usr/local/bin* +Al termine, il binario `lsyncd` sarà installato e pronto all'uso in */usr/local/bin*. -### `lsyncd` Servizio Systemd +### servizio systemd `lsyncd` -Con il metodo di installazione RPM, il servizio systemd sarà installato per voi, ma se scegliete di installare da sorgente, dovrete creare il servizio systemd. Sebbene sia possibile avviare il binario senza il servizio systemd, vogliamo assicurarci che esso *parta* all'avvio. In caso contrario, un riavvio del server interromperà il tentativo di sincronizzazione. Se si dimenticasse di riavviarlo, cosa molto probabile, sarebbe un problema per qualsiasi amministratore di sistema! +Con il metodo di installazione RPM, il servizio systemd verrà installato per voi, ma se lo installate dai sorgenti, dovrete creare il servizio systemd. Sebbene sia possibile avviare il binario senza il servizio systemd, si vuole garantire che esso *si* avvii all'avvio. In caso contrario, un riavvio del server interromperà il tentativo di sincronizzazione. Se si dimenticasse di riavviarlo manualmente, sarebbe un problema! -La creazione del servizio systemd, tuttavia, non è molto difficile e a lungo andare vi farà risparmiare tempo. +Creare il servizio systemd è relativamente facile e vi farà risparmiare tempo nel lungo periodo. -#### Creare il Service File `lsyncd` +#### Creare il file di servizio `lsyncd` -Questo file può essere creato ovunque, anche nella directory principale del server. Una volta creato, è possibile spostarlo nella posizione appropriata. +Questo file può essere creato ovunque, anche nella directory principale del server. Una volta creato, è possibile spostarlo nella posizione giusta. -`vi /root/lsyncd.service` +```bash +vi /root/lsyncd.service` +``` -Il contenuto di questo file dovrebbe essere: +Il contenuto di questo file sarà: -``` +```bash [Unit] Description=Live Syncing (Mirror) Daemon After=network.target @@ -145,23 +158,28 @@ PIDFile=/run/lsyncd.pid [Install] WantedBy=multi-user.target ``` -Ora installiamo il file appena creato nella posizione corretta: -`install -Dm0644 /root/lsyncd.service /usr/lib/systemd/system/lsyncd.service` +Installate il file appena creato nella posizione corretta: + +```bash +install -Dm0644 /root/lsyncd.service /usr/lib/systemd/system/lsyncd.service +``` -Infine, ricaricare il demone `systemctl` in modo che systemd "veda" il nuovo file di servizio: +Infine, ricaricare il servizio daemon `systemctl` in modo che systemd "veda" il nuovo file di servizio: -`systemctl daemon-reload` +```bash +systemctl daemon-reload +``` ## Configurazione di `lsyncd` -Qualunque sia il metodo scelto per installare `lsyncd`, è necessario un file di configurazione: */etc/lsyncd.conf*. La prossima sezione spiega come costruire un file di configurazione e come testarlo. +Con entrambi i metodi di installazione `lsyncd`, è necessario un file di configurazione: */etc/lsyncd.conf*. La sezione seguente spiega come costruire e testare un file di configurazione. -## Configurazione di Esempio per i Test +### Configurazione di esempio per il test -Ecco un esempio di un file di configurazione semplicistico che sincronizza */home* con un altro computer. Il nostro computer di destinazione sarà un indirizzo IP locale: *192.168.1.40* +Ecco un esempio di file di configurazione semplicistico che sincronizza */home* con un altro computer. Il nostro computer di destinazione sarà un indirizzo IP locale: *192.168.1.40* -``` +```bash settings { logfile = "/var/log/lsyncd.log", statusFile = "/var/log/lsyncd-status.log", @@ -188,28 +206,30 @@ sync { Scomporre un po' questo file: -* I file "logfile" e "statusFile" verranno creati automaticamente all'avvio del servizio. -* Lo "statusInterval" è il numero di secondi da attendere prima di scrivere sullo statusFile. -* "maxProcesses" è il numero di processi che `lsyncd` può generare. Onestamente, a meno che non si tratti di un computer molto trafficato, un processo è sufficiente. -* Nella sezione di sincronizzazione "default.rsyncssh" dice di usare rsync su SSH -* "source=" è il percorso della directory da cui si effettua la sincronizzazione. -* L'"host=" è il computer di destinazione su cui stiamo effettuando la sincronizzazione. -* L'opzione "excludeFrom=" indica a `lsyncd` dove si trova il file delle esclusioni. Deve esistere, ma può essere vuoto. -* "targetdir=" è la directory di destinazione a cui inviare i file. Nella maggior parte dei casi sarà uguale alla sorgente, ma non sempre. -* Poi abbiamo la sezione "rsync =" e queste sono le opzioni con cui eseguire rsync. -* Infine, abbiamo la sezione "ssh =", che specifica la porta SSH in ascolto sul computer di destinazione. +- Il `logfile` e lo `statusFile` vengono creati automaticamente all'avvio del servizio +- `StatusInterval` è il numero di secondi da attendere prima di scrivere sul file di stato +- `maxProcesses` è il numero di processi `lsyncd` che possono essere generati. A meno che non si tratti di un computer molto trafficato, un processo è sufficiente. +- Nella sezione di sincronizzazione `default.rsyncssh` dice di usare `rsync` su SSH +- `source=` è il percorso della directory da cui si sta effettuando la sincronizzazione +- `Host=` è il computer di destinazione su cui si sta effettuando la sincronizzazione +- Il parametro `excludeFrom=` indica a `lsyncd` dove si trova il file delle esclusioni. Deve esistere, ma può essere vuoto. +- `Targetdir=` è la directory a cui inviare i file. Nella maggior parte dei casi sarà uguale alla sorgente, ma non sempre. +- La sezione `rsync =` e le opzioni con le quali si esegue `rsync` +- La sezione `ssh =`, che specifica la porta SSH in ascolto sul computer di destinazione -Se si aggiunge più di una directory da sincronizzare, è necessario ripetere l'intera sezione "sync", comprese tutte le parentesi di apertura e chiusura per ogni directory. +Se si aggiunge più di una directory da sincronizzare, è necessario ripetere l'intera sezione “sync”, comprese tutte le parentesi di apertura e chiusura per ogni directory. -## Il File lsyncd.exclude +## Il File `lsyncd.exclude` -Come già detto, il file "excludeFrom" deve esistere, quindi creiamolo ora: +Come già detto, il file `excludeFrom` deve esistere. Createlo subito: -`touch /etc/lsyncd.exclude` +```bash +touch /etc/lsyncd.exclude +``` -Se si stesse sincronizzando la cartella /etc del nostro computer, ci sarebbero molti file e directory da escludere. Ogni file o directory esclusa viene elencata nel file, una per riga, in questo modo: +Ad esempio, se si stesse sincronizzando la cartella `/etc` del computer, ci sarebbero molti file e directory da escludere nel processo `lsyncd`. Ogni file o directory esclusa è presente nel file, una per riga: -``` +```bash /etc/hostname /etc/hosts /etc/networks @@ -218,40 +238,45 @@ Se si stesse sincronizzando la cartella /etc del nostro computer, ci sarebbero m ## Test e Messa in Funzione -Ora che tutto il resto è stato impostato, possiamo testare il tutto. Per cominciare, assicuriamoci che il servizio systemd lsyncd.service si avvii: +Una volta impostato tutto, è possibile testare il tutto. Assicurarsi che systemd `lsyncd.service` si avvii: -`systemctl start lsyncd` +```bash +systemctl start lsyncd +``` -Se non vengono visualizzati errori dopo l'esecuzione di questo comando, controllare lo stato del servizio, per sicurezza: +Se non vengono visualizzati errori dopo l'esecuzione di questo comando, verificare lo stato del servizio per assicurarsene: -`systemctl status lsyncd` +```bash +systemctl start lsyncd +``` Se il servizio è in esecuzione, usare tail per vedere le estremità dei due file di log e verificare che tutto sia a posto: -`tail /var/log/lsyncd.log` - -E quindi: - -`tail /var/log/lsyncd-status.log` - -Supponendo che tutto sia corretto, spostatevi nella directory `/home/[user]`, dove `[user]` è un utente del computer e create un nuovo file con *touch*. +```bash +tail /var/log/lsyncd.log +tail /var/log/lsyncd-status.log +``` -`touch /home/[user]/testfile` +Supponendo che tutto sia corretto, spostatevi nella directory `/home/[user]`, dove `[user]` è un utente del computer, e create un file con *touch*. -Ora andate sul computer di destinazione e verificate se il file viene visualizzato. Se è così, tutto funziona come dovrebbe. Impostare il servizio lsyncd.service da avviare all'avvio con: +```bash +touch /home/[user]/testfile +``` -`systemctl enable lsyncd` +Andate sul computer di destinazione e verificate se il file viene visualizzato. In caso affermativo, tutto funziona. Impostare `lsyncd.service` da avviare all'avvio con: -E siete pronti a partire. +```bash +systemctl enable lsyncd +``` -## Ricordatevi di Essere Prudenti +## Ricordate di fare attenzione -Ogni volta che si sincronizza un insieme di file o directory su un altro computer, è bene considerare attentamente l'effetto che avrà sul computer di destinazione. Se si torna al **File lsyncd.exclude** dell'esempio precedente, si può immaginare cosa potrebbe accadere se */etc/fstab* venisse sincronizzato? +Ogni volta che si sincronizza un insieme di file o directory su un altro computer, è necessario considerare attentamente l'effetto che avrà sul computer di destinazione. Supponiamo di tornare a **Il file lsyncd.exclude** nel nostro esempio precedente, riuscite a immaginare cosa potrebbe accadere se non riusciste a escludere */etc/fstab*? -Per i neofiti, *fstab* è il file utilizzato per configurare le unità di archiviazione su qualsiasi computer Linux. I dischi e le etichette sono quasi certamente diversi. Al successivo riavvio del computer di destinazione, è probabile che non riesca ad avviarsi del tutto. +`fstab` è il file che configura le unità di archiviazione su qualsiasi computer Linux. I dischi e le etichette sono quasi certamente diversi su macchine diverse. Il successivo riavvio del computer di destinazione potrebbe fallire. -# Conclusioni e riferimenti +## Conclusioni e riferimenti -`lsyncd` è un potente strumento per la sincronizzazione delle directory tra computer. Come avete visto, non è difficile da installare e non è complesso da mantenere in seguito. Non si può chiedere di più. +`lsyncd` è un potente strumento per la sincronizzazione delle directory tra computer. Come avete visto, non è difficile da installare e non sarà complesso da mantenere. -Per saperne di più su `lsyncd` visitate [Il Sito Ufficiale](https://github.com/axkibe/lsyncd) +Per saperne di più su `lsyncd`, visitate [il sito ufficiale](https://github.com/axkibe/lsyncd). diff --git a/docs/guides/backup/rsnapshot_backup.it.md b/docs/guides/backup/rsnapshot_backup.it.md index dcc146ea69..d369e2dc2d 100644 --- a/docs/guides/backup/rsnapshot_backup.it.md +++ b/docs/guides/backup/rsnapshot_backup.it.md @@ -8,45 +8,43 @@ tags: - rsnapshot --- -# Soluzione per il backup - _rsnapshot_ - ## Prerequisiti - Saper installare repository e snapshot aggiuntivi dalla riga di comando - Conoscere il montaggio di filesystem esterni al computer (unità esterna, filesystem remoto e così via) - Saper usare un editor (qui si usa `vi`, ma si può usare il proprio editor preferito) - Conoscere un po' di scripting BASH -- Saper modificare il crontab per l'utente root +- Sapere come modificare il `crontab` per l'utente root - Conoscenza delle chiavi pubbliche e private SSH (solo se si intende eseguire backup remoti da un altro server) ## Introduzione -_rsnapshot_ è una potente utility di backup con opzioni di installazione per qualsiasi macchina basata su Linux. È possibile eseguire il backup di una macchina in locale o di più macchine, ad esempio i server, da un'unica macchina. +`rsnapshot` è una potente utility di backup con possibilità di installazione su qualsiasi macchina basata su Linux. È possibile eseguire il backup di una macchina in locale o di più macchine, ad esempio i server, da un'unica macchina. -_rsnapshot_ utilizza `rsync` ed è scritto interamente in Perl senza dipendenze da librerie. Non esistono requisiti particolari per l'installazione. Nel caso di Rocky Linux, è possibile installare _rnapshot_ utilizzando il repository EPEL. Dopo il rilascio iniziale di Rocky Linux 9.0, c'è stato un periodo in cui EPEL non conteneva il pacchetto _rsnapshot_. Non è più così, ma queste istruzioni includono un metodo di installazione dai sorgenti, nel caso in cui ciò si verifichi di nuovo. +`rsnapshot` utilizza `rsync` ed è scritto interamente in Perl senza dipendenze da librerie. Non esistono requisiti particolari per l'installazione. Nel caso di Rocky Linux, è possibile installare `rnapshot` utilizzando il repository EPEL. Dopo il rilascio iniziale di Rocky Linux 9.0, c'è stato un periodo in cui EPEL non conteneva il pacchetto `rsnapshot`. Non è più così, ma queste istruzioni includono un metodo di installazione dai sorgenti, nel caso in cui ciò si verifichi di nuovo. -Questa documentazione riguarda l'installazione di _rsnapshot_ solo su Rocky Linux. +Questa documentazione riguarda l'installazione di `rsnapshot` solo su Rocky Linux. === "Installazione EPEL" - ## Installazione di _rsnapshot_ + ## Installazione di `rsnapshot` - Tutti i comandi qui mostrati sono eseguiti dalla riga di comando del server o della workstation, a meno che non sia indicato diversamente. + Tutti i comandi qui presenti vengono richiamati dalla riga di comando, a meno che non sia indicato diversamente. ### Installazione del repository EPEL - Per installare _rsnapshot_ abbiamo bisogno del repository EPEL di Fedora. Per installare il repository, basta usare questo comando: + È necessario il repository del software EPEL di Fedora. Per installare il repository, basta usare questo comando: ``` - sudo dnf install epel-release + sudo dnf install epel-release -y ``` - Il repository dovrebbe ora essere attivo. + Il repository sarà ora attivo. - ### Installare il pacchetto _rsnapshot + ### Installare il pacchetto `rsnapshot - Successivamente, installate _rsnapshot_ e alcuni altri strumenti necessari, che probabilmente sono già installati: + Installare `rsnapshot` e alcuni altri strumenti necessari: ``` sudo dnf install rsnapshot openssh-server rsync @@ -79,13 +77,13 @@ Questa documentazione riguarda l'installazione di _rsnapshot_ solo su Rocky Linu === "Installazione da sorgente" - ## Installazione di _rsnapshot_ da sorgente + ## Installazione di `rsnapshot` dai sorgenti - Installare _rsnapshot_ dai sorgenti non è difficile. Questo metodo ha però un lato negativo: se viene rilasciata una nuova versione, è necessaria una nuova installazione dai sorgenti per aggiornare la versione, mentre il metodo di installazione di EPEL permette di rimanere aggiornati con un semplice `dnf upgrade`. + Installare `rsnapshot` dai sorgenti non è difficile. Tuttavia, ha un aspetto negativo: se viene rilasciata una nuova versione, sarà necessaria una nuova installazione dai sorgenti per aggiornare la versione, mentre il metodo di installazione EPEL vi terrà aggiornati con un semplice `dnf upgrade`. - ### Installazione degli strumenti di sviluppo e download del sorgente + ### Installazione degli strumenti di sviluppo e download dei sorgenti - Come detto, il primo passo da fare è installare il gruppo 'Development Tools': + Come detto, il primo passo da fare è installare il gruppo "Strumenti di sviluppo": ``` dnf groupinstall 'Development Tools' @@ -114,17 +112,17 @@ Questa documentazione riguarda l'installazione di _rsnapshot_ solo su Rocky Linu ``` - ### Costruire la Risorsa + ### Creare il sorgente Ora che abbiamo tutto sulla nostra macchina, il passo successivo è la compilazione. Quando si decomprime il file `master.zip`, si ottiene una directory `rsnapshot-master`. Dovremo entrare in questa per la nostra procedura di costruzione. Si noti che la nostra compilazione utilizza tutte le impostazioni predefinite del pacchetto, quindi se si desidera qualcosa di diverso, è necessario fare un po' di indagini. Inoltre, questi passaggi sono tratti direttamente dalla pagina di [installazione di GitHub](https://github.com/rsnapshot/rsnapshot/blob/master/INSTALL.md): - ``` + ```bash cd rsnapshot-master ``` Eseguire lo script `autogen.sh` per generare lo script di configurazione: - ``` + ```bash ./autogen.sh ``` @@ -132,7 +130,7 @@ Questa documentazione riguarda l'installazione di _rsnapshot_ solo su Rocky Linu Si possono ottenere diverse righe di questo tipo: - ``` + ```bash fatal: not a git repository (or any of the parent directories): .git ``` @@ -140,19 +138,19 @@ Questa documentazione riguarda l'installazione di _rsnapshot_ solo su Rocky Linu Successivamente, è necessario eseguire `configure` con la directory di configurazione impostata: - ``` + ```bash ./configure --sysconfdir=/etc ``` Infine, eseguire `make install`: - ``` + ```bash sudo make install ``` Durante tutto questo, il file `rsnapshot.conf` verrà creato come `rsnapshot.conf.default`. È necessario copiare questo file in `rsnapshot.conf` e modificarlo per adattarlo alle esigenze del nostro sistema. - ``` + ```bash sudo cp /etc/rsnapshot.conf.default /etc/rsnapshot.conf ``` @@ -165,7 +163,7 @@ In questo passaggio viene mostrato come montare un'unità, ad esempio un'unità 1. Inserire l'unità USB. 2. Digitare `dmesg | grep sd` che mostrerà l'unità che si desidera utilizzare. In questo caso, è _sda1_. Esempio: `EXT4-fs (sda1): mounting ext2 file system using the ext4 subsystem`. -3. Sfortunatamente (o fortunatamente, a seconda delle opinioni) la maggior parte dei moderni sistemi operativi Linux per desktop esegue il montaggio automatico dell'unità, se possibile. Ciò significa che, a seconda di vari fattori, _rsnapshot_ potrebbe perdere la posizione dell'unità. Si desidera che l'unità venga "montata" o che i suoi file siano sempre disponibili nella stessa posizione. +3. Sfortunatamente (o fortunatamente, a seconda delle opinioni) la maggior parte dei moderni sistemi operativi Linux per desktop esegue il montaggio automatico dell'unità, se possibile. Ciò significa che, a seconda di vari fattori, `rsnapshot` potrebbe perdere la traccia dell'unità. Si desidera che l'unità venga "montata" o che i suoi file siano sempre disponibili nella stessa posizione. Per farlo, prendete le informazioni sull'unità visualizzate nel comando `dmesg` e digitate `mount | grep sda1`, che dovrebbe mostrare qualcosa di simile a questo: `/dev/sda1 on /media/username/8ea89e5e-9291-45c1-961d-99c346a2628a` 4. Digitate `sudo umount /dev/sda1` per smontare l'unità esterna. 5. Quindi, creare un punto di montaggio per il backup: `sudo mkdir /mnt/backup` @@ -175,55 +173,69 @@ In questo passaggio viene mostrato come montare un'unità, ad esempio un'unità Si noti che per una singola macchina, sarà necessario ripetere i passaggi `umount` e `mount` ogni volta che l'unità viene collegata o ogni volta che il sistema si riavvia, oppure automatizzare questi comandi con uno script. -Raccomandiamo l'automazione. L'automazione è la via del sysadmin. +Si raccomanda l'automazione. ## Configurazione di `rsnapshot` -Questo è il passo più importante. È possibile commettere un errore quando si apportano modifiche al file di configurazione. La configurazione di _rsnapshot_ richiede l'uso di tabulazioni per la separazione degli elementi e un'avvertenza in tal senso si trova all'inizio del file di configurazione. +Questo è il passo più importante. È possibile commettere un errore quando si apportano modifiche al file di configurazione. La configurazione di `rsnapshot` richiede l'uso di tabulazioni per la separazione degli elementi e un'avvertenza in tal senso si trova all'inizio del file di configurazione. Un carattere di spazio farà fallire l'intera configurazione e il vostro backup. Per esempio, all'inizio del file di configurazione c'è una sezione per la `# SNAPSHOT ROOT DIRECTORY #`. Se si sta aggiungendo questo da zero, si dovrebbe digitare `snapshot_root`, poi TAB e quindi digitare `/qualunque_percorso_per_la_root_di_snapshot/` -La cosa migliore è che la configurazione predefinita inclusa in _rsnapshot_ necessita solo di piccole modifiche per funzionare per un backup di una macchina locale. È sempre una buona idea, però, fare una copia di backup del file di configurazione prima di iniziare a modificarlo: +La cosa migliore è che la configurazione predefinita inclusa in `rsnapshot` necessita solo di piccole modifiche per funzionare per il backup di una macchina locale. È sempre una buona idea, però, fare una copia di backup del file di configurazione prima di iniziare a modificarlo: `cp /etc/rsnapshot.conf /etc/rsnapshot.conf.bak` ## Backup di base della macchina o di un singolo server -In questo caso, _rsnapshot_ verrà eseguito localmente per eseguire il backup di un particolare computer. In questo esempio, si analizzerà il file di configurazione e si mostrerà esattamente cosa si deve modificare. +In questo caso, `rsnapshot` viene eseguito localmente per eseguire il backup di una particolare macchina. In questo esempio, la ripartizione del file di configurazione mostra esattamente le modifiche da apportare. -Per aprire il file _/etc/rsnapshot.conf_ è necessario utilizzare `vi` (o modificare con il proprio editor preferito). +È necessario utilizzare `vi` (o modificare con l'editor preferito) per aprire il file `/etc/rsnapshot.conf`. La prima cosa da modificare è l'impostazione _snapshot_root_. Il valore predefinito è questo: -`snapshot_root /.snapshots/` +```text +snapshot_root /.snapshots/ +``` -È necessario modificare questo punto con il punto di montaggio creato in precedenza e con l'aggiunta di "storage". +È necessario cambiare questo punto con il punto di montaggio creato e aggiungere "storage". -`snapshot_root /mnt/backup/storage/` +```text +snapshot_root /mnt/backup/storage/` +``` -È inoltre necessario indicare al backup di non essere eseguito se l'unità non è montata. Per farlo, si deve rimuovere il segno "#" (chiamato anche commento, segno numerico, simbolo hash e così via) accanto a `no_create_root`, che si presenta in questo modo: +È inoltre necessario indicare al backup di non essere eseguito se l'unità non è montata. Per farlo, rimuovete il segno "#" (chiamato anche commento, segno numerico, simbolo hash e così via) accanto a `no_create_root`, che si presenta in questo modo: -`no_create_root 1` +```text +no_create_root 1 +``` Quindi scendete alla sezione intitolata `# EXTERNAL PROGRAM DEPENDENCIES #` e rimuovete il commento (di nuovo, il segno "#") da questa riga: -`#cmd_cp /usr/bin/cp` +```text +#cmd_cp /usr/bin/cp +``` Ora si legge: -`cmd_cp /usr/bin/cp` +```text +cmd_cp /usr/bin/cp +``` -Sebbene non sia necessario `cmd_ssh` per questa particolare configurazione, sarà necessario per l'altra opzione e non fa male averlo abilitato. Trovate quindi la riga che dice: +Sebbene non sia necessario `cmd_ssh` per questa particolare configurazione, sarà necessario per l'altra opzione e non fa male averlo abilitato. Trovare la riga che dice: -`#cmd_ssh /usr/bin/ssh` +```text +#cmd_ssh /usr/bin/ssh +``` Rimuovere il simbolo "#": -`cmd_ssh /usr/bin/ssh` +```text +cmd_ssh /usr/bin/ssh +``` -Successivamente è necessario passare alla sezione intitolata `# BACKUP LEVELS / INTERVALS #` +Successivamente è necessario passare alla sezione intitolata `# BACKUP LEVELS / INTERVALS #` -Le versioni precedenti di _rsnapshot_ avevano `hourly, daily, monthly, yearly` ma ora sono `alfa, beta, gamma, delta`. Il che è un po' confuso. È necessario aggiungere un'annotazione a tutti gli intervalli che non verranno utilizzati. Nella configurazione, il delta è già stato commentato. +Le versioni precedenti di `rsnapshot` avevano `orario, giornaliero, mensile, annuale` ma ora sono `alfa, beta, gamma, delta`. Il che è un po' confuso. È necessario aggiungere un'annotazione a tutti gli intervalli che non verranno utilizzati. Nella configurazione, il delta è già stato commentato. In questo esempio, non si eseguiranno altri incrementi oltre al backup notturno. Basta aggiungere un commento ad alfa e gamma. Una volta completato, il file di configurazione sarà: @@ -236,35 +248,43 @@ retain beta 7 Passare alla riga `logfile`, che per impostazione predefinita è: -`#logfile /var/log/rsnapshot` +```text +#logfile /var/log/rsnapshot +``` Rimuovere il commento: -`logfile /var/log/rsnapshot` +```text +logfile /var/log/rsnapshot +``` -Infine, passate alla sezione `### BACKUP POINTS / SCRIPTS ###` e aggiungere le directory che si desidera aggiungere nella sezione `# LOCALHOST`, ricordando di usare ++tab++ anziché ++spazio++ tra gli elementi! +Infine, passate alla sezione `### BACKUP POINTS / SCRIPTS ###` e aggiungete tutte le directory che volete aggiungere nella sezione `# LOCALHOST`, ricordando di usare ++tab++ piuttosto che ++spazio++ tra gli elementi! -Per ora scrivete le vostre modifiche (`SHIFT :wq!` per `vi`) e uscite dal file di configurazione. +Per ora scrivete le vostre modifiche (++shift+colon+“wq!”++ per `vi`) e uscite dal file di configurazione. ### Verifica della configurazione -Si vuole verificare che non siano stati aggiunti spazi o altri errori evidenti al nostro file di configurazione mentre lo si modificava. Per fare ciò, si esegue _rsnapshot_ con la nostra configurazione con l'opzione `configtest`: +Si vuole verificare che non siano stati aggiunti spazi o altri errori evidenti al nostro file di configurazione mentre lo si modificava. Per farlo, si esegue `rsnapshot` contro la nostra configurazione con l'opzione `configtest`: `rsnapshot configtest` mostrerà `Syntax OK` se non ci sono errori. -Si dovrebbe prendere l'abitudine di eseguire `configtest` con una particolare configurazione. Il motivo sarà più evidente quando si entrerà nella sezione **Backup di più macchine o più server**. +Prendete l'abitudine di eseguire `configtest` con una particolare configurazione. Il motivo sarà più evidente quando si entrerà nella sezione **Backup di più macchine o più server**. -Per eseguire `configtest` con un particolare file di configurazione, è necessario eseguirlo con l'opzione -c per specificare la configurazione: +Per eseguire `configtest` con un particolare file di configurazione, eseguirlo con l'opzione `-c` per specificare la configurazione: -`rsnapshot -c /etc/rsnapshot.conf configtest` +```bash +rsnapshot -c /etc/rsnapshot.conf configtest +``` ## Esecuzione del backup la prima volta -Dopo che `configtest` ha verificato che tutto è a posto, è ora il momento di eseguire il backup per la prima volta. Se si vuole, si può eseguire prima in modalità di prova, in modo da vedere cosa farà lo script di backup. +Dopo che il `configtest` ha verificato che tutto è a posto, è il momento di eseguire il backup per la prima volta. È possibile eseguire questa operazione prima in modalità di prova, in modo da vedere cosa farà lo script di backup. Anche in questo caso non è necessario specificare la configurazione, ma è una buona idea prendere l'abitudine di farlo: -`rsnapshot -c /etc/rsnapshot.conf -t beta` +```bash +rsnapshot -c /etc/rsnapshot.conf -t beta +``` Il risultato sarà simile a questo, mostrando cosa accadrà quando il backup verrà effettivamente eseguito: @@ -284,29 +304,33 @@ touch /mnt/backup/storage/beta.0/ Quando il test soddisfa le vostre aspettative, eseguitelo manualmente la prima volta senza il test: -`rsnapshot -c /etc/rsnapshot.conf beta` +```bash +rsnapshot -c /etc/rsnapshot.conf beta +``` -Al termine del backup, navigare in /mnt/backup ed esaminare la struttura di directory creata. Ci sarà una directory `storage/beta.0/localhost`, seguita dalle directory specificate per il backup. +Al termine del backup, andare in `/mnt/backup` ed esaminare la struttura di directory creata. Ci sarà una directory `storage/beta.0/localhost`, seguita dalle directory specificate per il backup. ### Ulteriori spiegazioni Ogni volta che il backup viene eseguito, viene creato un altro incremento beta, 0-6 o 7 giorni di backup. Il backup più recente sarà sempre beta.0, mentre il backup di ieri sarà sempre beta.1. -Le dimensioni di ciascuno di questi backup sembreranno occupare la stessa quantità (o più) di spazio su disco, ma ciò è dovuto all'uso di hard link _da parte di rsnapshot_. Per ripristinare i file dal backup di ieri, è sufficiente copiarli di nuovo dalla struttura di directory della beta.1. +Le dimensioni di ciascuno di questi backup sembreranno occupare la stessa quantità (o più) di spazio su disco, ma ciò è dovuto agli hard links utilizzati da `rsnapshot`. Per ripristinare i file dal backup di ieri, è sufficiente copiarli di nuovo dalla struttura di directory della beta.1. -Ogni backup è solo un backup incrementale rispetto all'esecuzione precedente, MA, grazie all'uso dei collegamenti diretti, ogni directory di backup contiene il file o il collegamento diretto al file nella directory in cui è stato effettivamente eseguito il backup. +Ogni backup è solo un backup incrementale rispetto all'esecuzione precedente, MA, grazie all'uso di collegamenti diretti, ogni directory di backup contiene il file o il collegamento diretto al file nella directory in cui è stato effettivamente eseguito il backup. Per ripristinare i file, non è necessario decidere la directory o l'incremento da cui ripristinarli, ma solo la data e l'ora del backup che si sta ripristinando. È un ottimo sistema e utilizza molto meno spazio su disco rispetto a molte altre soluzioni di backup. ## Impostazione dell'esecuzione automatica del backup -Una volta completati i test e sicuri che le cose funzioneranno senza problemi, il passo successivo è impostare crontab per l'utente root per automatizzare il processo ogni giorno: +Una volta completati i test e sicuri che le cose funzioneranno senza problemi, il passo successivo è impostare `crontab` per l'utente root per automatizzare il processo ogni giorno: -`sudo crontab -e` +```bash +sudo crontab -e +``` -Se non avete mai eseguito questa operazione, scegliete vim.basic come editor o il vostro editor preferito quando appare la riga `Select an editor`. +Se non si e' mai eseguito questa operazione, si scelga “vim.basic” come editor o l'editor preferito quando appare la riga `Seleziona un editor`. -Si intende impostare il backup in modo che venga eseguito automaticamente alle 23: 00, quindi si aggiungerà questo codice al crontab: +Si intende impostare il backup in modo che venga eseguito automaticamente alle 23:00, quindi si aggiungerà questa voce a `crontab`: ```bash ## Running the backup at 11 PM @@ -317,13 +341,13 @@ Si intende impostare il backup in modo che venga eseguito automaticamente alle 2 L'esecuzione di backup di più macchine da una macchina con un array RAID o una grande capacità di archiviazione, in sede o da una connessione Internet altrove, funziona bene. -Se i backup vengono eseguiti via Internet, è necessario assicurarsi che ogni sede disponga di una larghezza di banda adeguata per l'esecuzione dei backup. È possibile utilizzare _rsnapshot_ per sincronizzare un server in sede con un array di backup o un server di backup fuori sede per migliorare la ridondanza dei dati. +Se i backup vengono eseguiti via Internet, è necessario assicurarsi che ogni sede disponga di una larghezza di banda adeguata per l'esecuzione dei backup. È possibile utilizzare `rsnapshot` per sincronizzare un server in sede con un array di backup o un server di backup fuori sede per migliorare la ridondanza dei dati. ## Presupposto -Esecuzione di _rsnapshot_ da una macchina in remoto, in sede. L'esecuzione di questa esatta configurazione è possibile anche in remoto, fuori sede. +Eseguire di `rsnapshot` da una macchina in remoto, in sede. L'esecuzione di questa esatta configurazione è possibile anche in remoto, fuori sede. -In questo caso, è necessario installare _rsnapshot_ sul computer che esegue tutti i backup. Altre ipotesi sono: +In questo caso, si dovrà installare `rsnapshot` sul computer che esegue tutti i backup. Altre ipotesi sono: - Che i server su cui si eseguirà il backup abbiano una regola del firewall che consenta alla macchina remota di accedere al server SSH - Che ogni server di cui si intende eseguire il backup abbia installato una versione recente di `rsync`. Per i server Rocky Linux, eseguire `dnf install rsync` per aggiornare la versione di `rsync` del sistema. @@ -331,41 +355,47 @@ In questo caso, è necessario installare _rsnapshot_ sul computer che esegue tut ## Chiavi Pubbliche e Private SSH -Per il server che eseguirà i backup, è necessario generare una coppia di chiavi SSH da utilizzare durante i backup. Per il nostro esempio, creeremo chiavi RSA. +Per il server che eseguirà i backup, è necessario generare una coppia di chiavi SSH da utilizzare durante i backup. Nel nostro esempio, creeremo chiavi RSA. -Se si è già generato un set di chiavi, si può saltare questo passaggio. È possibile scoprirlo eseguendo `ls -al .ssh` e cercando una coppia di chiavi `id_rsa` e `id_rsa.pub.` Se non esistono, utilizzate il seguente link per impostare le chiavi per il vostro computer e per i server a cui volete accedere: +Se si è già generato un set di chiavi, si può saltare questo passaggio. È possibile scoprirlo eseguendo `ls -al .ssh` e cercando una coppia di chiavi `id_rsa` e `id_rsa.pub.` Se non esistono, utilizzate il seguente link per impostare le chiavi per il vostro computer e per i server a cui volete accedere: Se non esistono, utilizzate il seguente link per impostare le chiavi per il vostro computer e per i server a cui volete accedere: -[Coppie di Chiavi Private Pubbliche SSH](../security/ssh_public_private_keys.md) +[Coppie di chiavi pubbliche private SSH](../security/ssh_public_private_keys.md) -## Configurazione di _rsnapshot_ +## Configurazione di `rsnapshot` -Il file di configurazione deve essere quasi identico a quello creato per il **Backup di base della macchina o di un singolo server**, tranne che per la modifica di alcune opzioni. +Il file di configurazione deve essere quasi identico a quello creato per il **backup della macchina di base o del server singolo**, tranne che per la modifica di alcune opzioni. La snapshot root è l'impostazione predefinita: -`snapshot_root /.snapshots/` +```text +snapshot_root /.snapshots/ +``` Commentare questa riga: -`no_create_root 1` - -`#no_create_root 1` +```text +no_create_root 1 +#no_create_root 1 +``` L'altra differenza è che ogni macchina avrà la propria configurazione. Quando ci si abitua, è sufficiente copiare uno dei file di configurazione esistenti con un nome diverso e modificarlo per adattarlo alle macchine aggiuntive di cui si desidera eseguire il backup. Per ora, si vuole modificare solo il file di configurazione (come mostrato sopra) e salvarlo. Copiate questo file come modello per il nostro primo server: -`cp /etc/rsnapshot.conf /etc/rsnapshot_web.conf` - -Si desidera modificare il file di configurazione e creare il log e il lockfile con il nome della macchina: +```bash +cp /etc/rsnapshot.conf /etc/rsnapshot_web.conf +``` -`logfile /var/log/rsnapshot_web.log` +Si desidera modificare il file di configurazione e creare il log e il `lockfile` con il nome della macchina: -`lockfile /var/run/rsnapshot_web.pid` +```text +logfile /var/log/rsnapshot_web.log +lockfile /var/run/rsnapshot_web.pid +``` -Successivamente, si deve modificare il file rsnapshot_web.conf in modo che includa le directory di cui si vuole eseguire il backup. Successivamente, si deve modificare il file rsnapshot_web. conf in modo che includa le directory di cui si vuole eseguire il backup. +Successivamente, si deve modificare `rsnapshot_web.conf` per includere le directory di cui si vuole eseguire il backup. L'unica cosa diversa è l'obiettivo. -Ecco un esempio di configurazione di web.ourdomain.com: +Ecco un esempio di configurazione di `web.ourdomain.com`: ```bash ### BACKUP POINTS / SCRIPTS ### @@ -380,19 +410,25 @@ backup root@web.ourdomain.com:/root/ web.ourdomain.com/ Ora è possibile verificare la configurazione per assicurarsi che sia sintatticamente corretta: -`rsnapshot -c /etc/rsnapshot_web.conf configtest` +```bash +rsnapshot -c /etc/rsnapshot_web.conf configtest +``` Si sta cercando il messaggio `Syntax OK`. Se tutto è a posto, è possibile eseguire il backup manualmente: -`/usr/bin/rsnapshot -c /etc/rsnapshot_web.conf beta` +```bash +/usr/bin/rsnapshot -c /etc/rsnapshot_web.conf beta +``` -Supponendo che tutto funzioni, è possibile creare i file di configurazione per il server di posta (rsnapshot_mail.conf) e per il server del portale (rsnapshot_portal.conf), testarli ed eseguire un backup di prova. +Supponendo che tutto funzioni, è possibile creare i file di configurazione per il server di posta (`rsnapshot_mail.conf`) e per il server del portale (`rsnapshot_portal.conf`), testarli ed eseguire un backup di prova. ## Automatizzare il backup L'automazione dei backup per la versione per più macchine o server è leggermente diversa. Si vuole creare uno script bash per richiamare i backup in ordine. Quando uno finisce, inizia il successivo. Lo script avrà un aspetto simile a: -`vi /usr/local/sbin/backup_all` +```bash +vi /usr/local/sbin/backup_all +``` Con il contenuto: @@ -404,13 +440,17 @@ Con il contenuto: /usr/bin/rsnapshot -c /etc/rsnapshot_portal.conf beta ``` -Salvare lo script in /usr/local/sbin e renderlo eseguibile: +Salvate lo script in `/usr/local/sbin` e rendetelo eseguibile: -`chmod +x /usr/local/sbin/backup_all` +```bash +chmod +x /usr/local/sbin/backup_all +``` -Creare il crontab per root per eseguire lo script di backup: +Creare la `crontab` per root per eseguire lo script di backup: -`crontab -e` +```bash +crontab -e +``` Aggiungere questa riga: @@ -421,7 +461,7 @@ Aggiungere questa riga: ## Segnalazione dello stato del backup -Per assicurarsi che il backup avvenga secondo i piani, si consiglia di inviare i file di registro del backup all'indirizzo e-mail. Se si eseguono backup di più macchine utilizzando _rsnapshot_, ogni file di log avrà un proprio nome, che potrà essere inviato all'indirizzo e-mail per la revisione da parte della procedura [Utilizzo di postfix per la segnalazione dei processi del server](../email/postfix_reporting.md). +Per assicurarsi che il backup avvenga secondo i piani, si consiglia di inviare i file di registro del backup all'indirizzo e-mail. Se si eseguono backup di più macchine utilizzando `rsnapshot`, ogni file di registro avrà il proprio nome, che potrà essere inviato alla propria e-mail per la revisione mediante la procedura [Usando postfix per il reporting dei processi del server](../email/postfix_reporting.md). ## Ripristino di un backup @@ -429,6 +469,6 @@ Il ripristino di alcuni file o di un intero backup comporta la copia dei file de ## Conclusioni e altre risorse -La configurazione corretta di _rsnapshot_ è un po' scoraggiante all'inizio, ma può far risparmiare molto tempo per il backup di macchine o server. +La configurazione corretta di `rsnapshot` è un po' scoraggiante all'inizio, ma può far risparmiare molto tempo per il backup di macchine o server. -_rsnapshot_ è potente, veloce ed economico nell'utilizzo dello spazio su disco. Per saperne di più su _rsnapshot_, visitate il sito [rsnapshot.org](https://rsnapshot.org/download.html). +`rsnapshot` è potente, veloce ed economico nell'utilizzo dello spazio su disco. Per saperne di più su `rsnapshot`, visitate [il github di rsnapshot](https://github.com/rsnapshot/rsnapshot). diff --git a/docs/guides/cloud/migration-to-new-azure-images.it.md b/docs/guides/cloud/migration-to-new-azure-images.it.md new file mode 100644 index 0000000000..9d2a775689 --- /dev/null +++ b/docs/guides/cloud/migration-to-new-azure-images.it.md @@ -0,0 +1,88 @@ +--- +title: Migrazione a Nuove Immagini Azure +author: Neil Hanlon +contributors: Steven Spencer, Ganna Zhyrnova +tags: + - cloud + - azure + - microsoft azure + - deprecation +--- + +!!! info “Vecchie immagini di accunt pubblicati deprecate da aprile 2024” + +``` +Un publishing account Microsoft è un account del marketplace Azure che consente agli sviluppatori di pubblicare le proprie offerte su Microsoft AppSource o Azure Marketplace. +RESF fornisce immagini di macchine virtuali Rocky Linux sotto due account di pubblishing separati in Azure: un account legacy identificato come `erockyenterprisesoftwarefoundationinc1653071250513` e un account ufficiale più recente chiamato `resf`. +Le immagini pubblicate con l'account di pubblicazione legacy (`erockyenterprisesoftwarefoundationinc1653071250513`) sono state contrassegnate per l'abbandono il 23 aprile 2024, con un periodo di 180 giorni (6 mesi) prima che non possano più essere utilizzate. + +Per continuare a utilizzare Rocky Linux su Azure, è necessario seguire questa guida per migrare al nuovo account di pubblicazione (`resf`) o alle nuove immagini Community Galleries. +``` + +# Guida alla migrazione: Transizione a nuove immagini Rocky Linux su Azure + +Questa guida fornisce i passaggi dettagliati per la migrazione delle macchine virtuali (VM) Azure dalle immagini Rocky Linux deprecate alle nuove immagini con l'account editore `resf` o utilizzando le Community Galleries. Seguendo questa guida, la transizione avverrà senza problemi e con il minimo disturbo. + +## Prima di iniziare + +- Assicurarsi di avere un backup aggiornato della macchina virtuale. Anche se il processo di migrazione non dovrebbe avere ripercussioni sui dati, un backup è la prassi migliore per qualsiasi modifica del sistema. +- Verificare di disporre delle autorizzazioni necessarie per creare nuove macchine virtuali e gestire quelle esistenti nel proprio account Azure. + +## Passo 1: Individuare le macchine virtuali esistenti + +Identificare le macchine virtuali distribuite con le vecchie immagini Rocky Linux. È possibile farlo filtrando le macchine virtuali con il nome dell'account del vecchio publisher: + +```text +erockyenterprisesoftwarefoundationinc1653071250513` +``` + +## Passo 2: preparare una nuova macchina virtuale + +1. **Navigare** nel Azure Marketplace. +2. **Cercate** le nuove immagini di Rocky Linux con l'account dell'editore `resf` o accedete alle Community Galleries. + - Attuali Link Marketplace: + - [Rocky Linux x86_64](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/resf.rockylinux-x86_64) + - [Rocky Linux aarch64](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/resf.rockylinux-aarch64) + - Le istruzioni complete per accedere alle immagini della Community Gallery si trovano in questo [post di notizie](https://rockylinux.org/news/rocky-on-azure-community-gallery/). +3. **Selezionare** la versione di Rocky Linux desiderata e **creare una nuova VM**. Durante la configurazione, è possibile scegliere la stessa dimensione della macchina virtuale e altre configurazioni della macchina virtuale esistente per garantire la compatibilità. + +## Fase 3: Trasferimento dei dati + +### Opzione A: Utilizzo di dischi gestiti da Azure (consigliato per semplicità) + +1. **Arrestare** la macchina virtuale esistente. +2. **Detach** il disco del sistema operativo dalla macchina virtuale esistente. +3. **Attach** il disco alla nuova macchina virtuale come disco dati. +4. **Boot** la nuova macchina virtuale. Se necessario, è possibile montare il vecchio disco OS e copiare i dati sul nuovo disco. + +### Opzione B: Utilizzo di strumenti di trasferimento dei dati (per ambienti complessi o esigenze specifiche) + +1. **Selezionare** uno strumento di trasferimento dati come `rsync` o Azure Blob Storage per trasferire i dati. +2. **Trasferire** i dati dalla vecchia VM alla nuova VM. Questo potrebbe includere i dati delle applicazioni, le configurazioni e i dati degli utenti. + +```bash +# Esempio con comando rsync +rsync -avzh /path/to/old_VM_data/ user@new_VM_IP:/path/to/new_VM_destination/ +``` + +## Passo 4: riconfigurare la nuova macchina virtuale + +1. **Riapplicare** alla nuova macchina virtuale tutte le configurazioni o gli adattamenti personalizzati presenti sulla vecchia macchina virtuale, assicurandosi che corrispondano alla configurazione dell'ambiente prevista. +2. **Testare** la nuova macchina virtuale per verificare che le applicazioni e i servizi funzionino come previsto. + +## Fase 5: Aggiornamento dei record DNS (se applicabile) + +Se si accede alla macchina virtuale con un dominio specifico, è necessario aggiornare i record DNS per puntare all'indirizzo IP della nuova macchina virtuale. + +## Passo 6: Disattivazione della vecchia macchina virtuale + +Dopo aver confermato che la nuova macchina virtuale funziona correttamente e aver spostato tutti i dati e le configurazioni necessarie, è possibile **deallocare ed eliminare** la vecchia macchina virtuale. + +## Fasi finali + +- Verificare che tutti i servizi della nuova macchina virtuale funzionino come previsto. +- Monitorare le prestazioni e lo stato di salute della nuova macchina virtuale per assicurarsi che soddisfi le proprie esigenze. + +## Supporto + +L'assistenza è disponibile in caso di problemi durante la migrazione o di domande. Visitare [canali di supporto Rocky Linux](https://wiki.rockylinux.org/rocky/support/) per ricevere assistenza. diff --git a/docs/guides/cms/chyrp_lite.it.md b/docs/guides/cms/chyrp_lite.it.md new file mode 100644 index 0000000000..57fc55b219 --- /dev/null +++ b/docs/guides/cms/chyrp_lite.it.md @@ -0,0 +1,156 @@ +--- +title: Chyrp Lite +author: Neel Chauhan +contributors: Steven Spencer, Ganna Zhyrnova +tested_with: 9.5 +tags: + - cms + - blogging +--- + +## Introduzione + +[Chyrp Lite](https://chyrplite.net/) è un motore di blogging ultraleggero scritto in PHP. + +## Prerequisiti e presupposti + +I requisiti minimi per l'utilizzo di questa procedura sono i seguenti: + +- La possibilità di eseguire comandi come utente root o di utilizzare `sudo` per elevare i privilegi +- Familiarità con un editor a riga di comando. L'autore utilizza `vi` o `vim`, ma è possibile sostituirli con il proprio editor preferito + +## Installare Caddy + +Si utilizzerà Caddy come server web. Per installare Caddy, è necessario prima installare EPEL (Extra Packages for Enterprise Linux) ed eseguire gli aggiornamenti: + +```bash +dnf -y install epel-release && dnf -y update +``` + +Quindi installare Caddy: + +```bash +dnf -y install caddy +``` + +Successivamente, aprire 'Caddyfile' + +```bash +vi /etc/caddy/Caddyfile +``` + +Aggiungere il codice a seguire nel file 'Caddyfile': + +```bash +your.domain.name { + root * /var/www/chyrp-lite + file_server + php_fastcgi 127.0.0.1:9000 +} +``` + +Salvare il file con `:wq!` e poi aprire le porte del firewall corrispondenti: + +```bash +sudo firewall-cmd --permanent --zone=public --add-service=http +sudo firewall-cmd --permanent --zone=public --add-service=https +sudo firewall-cmd --reload +``` + +Infine, avviare Caddy: + +```bash +systemctl enable --now caddy +``` + +## Installazione di PHP + +!!! note + +``` +Se state utilizzando Rocky Linux 8.x o 10.x, sostituite “8” o “10” accanto alla release nella riga di installazione del pacchetto Remi. +``` + +Per installare PHP, è necessario il repository Remi. Per installare il repository Remi, eseguire quanto segue: + +```bash +dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm +``` + +Quindi installare PHP e i moduli necessari: + +```bash +dnf install -y php83-php php83-php-session php83-php-json php83-php-ctype php83-php-filter php83-php-libxml php83-php-simplexml php83-php-mbstring php83-php-pdo php83-php-curl +``` + +Quindi, aprire il file di configurazione di PHP: + +```bash +vi /etc/opt/remi/php83/php-fpm.d/www.conf +``` + +Andate alla riga `listen =` e impostatela come segue: + +```bash +listen = 127.0.0.1:9000 +``` + +Uscire da `vi` con `:wq!` e abilitare PHP: + +```bash +systemctl enable --now php83-php-fpm.service +``` + +## Installazione di `Chyrp` + +Ora, si procede all'installazione Chyrp Lite. Scaricare l'ultima versione: + +```bash +cd /var/www +wget https://github.com/xenocrat/chyrp-lite/archive/refs/tags/v2024.03.zip +``` + +Successivamente, decomprimere e spostare la cartella estratta: + +```bash +unzip v2024.03.zip +mv chyrp-lite-2024.03/ chyrp-lite +``` + +Impostare i permessi corretti sulla cartella `chyrp-lite`: + +```bash +chown -R apache:apache chyrp-lite/ +``` + +Impostare una directory di archiviazione dei dati per il database SQLite: + +```bash +mkdir chyrp-lite-data +chown -R apache:apache chyrp-lite-data/ +``` + +Quindi, impostare i contesti dei file SELinux: + +```bash +semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/chyrp-lite(/.*)?" +semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/chyrp-lite-data(/.*)?" +restorecon -Rv /var/www/chyrp-lite +restorecon -Rv /var/www/chyrp-lite-data +``` + +Su una machine client, aprire un browser Web su `https://example.com/install.php` ed eseguire il programma di installazione (sostituire `example.com` con il proprio nome di dominio o hostname): + +![Chyrp Lite Setup](../images/chyrp_lite_setup.png) + +Nella sezione **Database**, selezionare un percorso nella cartella `chyrp-lite-data` creata in precedenza, ad esempio `/var/www/chyrp-lite-data/sqlite.db`. + +Compilare quindi gli altri campi, che dovrebbero essere di facile comprensione. + +Quindi, fare clic su **Install me** e poi su **Take me to my site**. A questo punto si dovrebbe essere in grado di visitare l'installazione completata del sito Chyrp: + +![Chyrp Lite](../images/chyrp_lite.png) + +## Conclusione + +Considerando che WordPress si è evoluto come coltellino svizzero dello sviluppo web, non sorprende che alcuni webmaster (compreso l'autore) preferiscano un motore di blogging leggero. Chyrp Lite è perfetto per questi utenti. diff --git a/docs/guides/cms/cloud_server_using_nextcloud.it.md b/docs/guides/cms/cloud_server_using_nextcloud.it.md index 2c181c6094..f94ac45669 100644 --- a/docs/guides/cms/cloud_server_using_nextcloud.it.md +++ b/docs/guides/cms/cloud_server_using_nextcloud.it.md @@ -10,20 +10,20 @@ tags: # Server Cloud con Nextcloud -!!! note "Riguardo a Rocky Linux 9.x" +!!! note "Riguardo a Rocky Linux 9.x o 10.x" - Questa procedura dovrebbe funzionare per Rocky Linux 9.x. La differenza è che potrebbe essere necessario cambiare i riferimenti di versione per alcuni repository per aggiornarli alla versione 9. Se state usando Rocky Linux 9.x, sappiate che questo è stato testato sia con la 8.6 che con la 9.0, ma è stato scritto originariamente per la 8.6. + Questa procedura dovrebbe funzionare per Rocky Linux 9.x o 10.x. La differenza è che potrebbe essere necessario cambiare i riferimenti di versione per alcuni repository per aggiornarli alla versione 9 o 10. Se state usando Rocky Linux 9.x o 10.x, sappiate che questo è stato testato sia con la 8.6 che con la 9.0, ma è stato scritto originariamente per la 8.6. ## Prerequisiti E Presupposti -* Server con Rocky Linux (è possibile installare Nextcloud su qualsiasi distribuzione Linux, ma questa procedura presuppone l'utilizzo di Rocky). -* Un elevato grado di comfort nell'operare dalla riga di comando per l'installazione e la configurazione. -* Conoscenza di un editor a riga di comando. Per questo esempio utilizziamo _vi_, ma potete usare il vostro editor preferito, se ne avete uno. -* Anche se Nextcloud può essere installato tramite un'applicazione snap, documenteremo solo l'installazione del file .zip. -* Per l'impostazione delle directory applicheremo i concetti del documento Apache "sites enabled" (a cui si rimanda in basso). -* Utilizzeremo anche la procedura di hardening di _mariadb-server_ (anch'essa linkata più avanti) per la configurazione del database. -* In questo documento si presuppone che siate root, o che possiate esserlo usando _sudo_. -* Nella configurazione utilizziamo un dominio di esempio, "yourdomain.com". +- Server con Rocky Linux (è possibile installare Nextcloud su qualsiasi distribuzione Linux, ma questa procedura presuppone l'utilizzo di Rocky). +- Un elevato grado di comfort nell'operare dalla riga di comando per l'installazione e la configurazione. +- Conoscenza di un editor a riga di comando. Per questo esempio utilizziamo _vi_, ma potete usare il vostro editor preferito, se ne avete uno. +- Anche se Nextcloud può essere installato tramite un'applicazione snap, documenteremo solo l'installazione del file .zip. +- Per l'impostazione delle directory applicheremo i concetti del documento Apache _sites enabled_ (a cui si rimanda in basso). +- Utilizzeremo anche la procedura di hardening di _mariadb-server_ (anch'essa linkata più avanti) per la configurazione del database. +- In questo documento si presuppone che siate root, o che possiate esserlo usando _sudo_. +- Nella configurazione utilizziamo un dominio di esempio . ## Introduzione @@ -33,26 +33,25 @@ Riportare il cloud nel proprio ambiente è un modo per recuperare la sicurezza d Nextcloud offre un cloud open source che tiene conto della sicurezza e della flessibilità. Si noti che la creazione di un server Nextcloud è un buon esercizio, anche se alla fine si sceglie di portare il cloud fuori sede. La procedura seguente riguarda l'impostazione di Nextcloud su Rocky Linux. - ## Installazione di Nextcloud ### Installazione e configurazione di Repository e Moduli -Per questa installazione sono necessari due repository. È necessario installare EPEL (Extra Packages for Enterprise Linux) e il repository Remi per PHP 8.0 +Per questa installazione sono necessari due repository. È necessario installare EPEL (Extra Packages for Enterprise Linux) e il repository Remi per PHP 8.3 !!! note "Nota" - È richiesta una versione minima di PHP 7.3 o 7.4 e la versione Rocky Linux 7.4 non contiene tutti i pacchetti necessari a Nextcloud. Utilizzeremo invece PHP 8.0 dal repository Remi. + È richiesta una versione minima di PHP 7.3 o 7.4 e la versione Rocky Linux 7.4 non contiene tutti i pacchetti necessari a Nextcloud. Utilizzeremo invece PHP 8.3 dal repository Remi. Per installare EPEL esegui: -``` +```bash dnf install epel-release ``` -Per installare il repository Remi eseguire (nota: se si sta usando Rocky Linux 9.x, sostituire 9 dopo "release-"): +Per installare il repository Remi, eseguite (nota: se state usando Rocky Linux 9.x o 10.x, sostituite 9 o 10 accanto a `release`): -``` +```bash dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm ``` @@ -60,13 +59,13 @@ Quindi eseguire nuovamente `dnf upgrade`. Eseguire il seguente comando per visualizzare l'elenco dei moduli php che possono essere abilitati: -``` +```bash dnf module list php ``` -che fornisce questo risultato per Rocky Linux 8.x (un risultato simile verrà mostrato per Rocky Linux 9.x): +che fornisce questo risultato per Rocky Linux 8.x (un risultato simile verrà mostrato per Rocky Linux 9.x o 10.x): -``` +```bash Rocky Linux 8 - AppStream Name Stream Profiles Summary php 7.2 [d] common [d], devel, minimal PHP scripting language @@ -80,33 +79,35 @@ php remi-7.3 common [d], devel, minimal php remi-7.4 common [d], devel, minimal PHP scripting language php remi-8.0 common [d], devel, minimal PHP scripting language php remi-8.1 common [d], devel, minimal PHP scripting language +php remi-8.2 common [d], devel, minimal PHP scripting language +php remi-8.3 common [d], devel, minimal PHP scripting language Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled ``` -Vogliamo prendere il PHP più recente con cui Nextcloud è compatibile, che in questo momento è l'8.0, quindi abiliteremo il modulo: +Vogliamo prendere il PHP più recente con cui Nextcloud è compatibile, che in questo momento è l'8.3, quindi abiliteremo il modulo: -``` -dnf module enable php:remi-8.0 +```bash +dnf module enable php:remi-8.3 ``` -Per vedere come cambia l'output dell'elenco dei moduli, eseguite di nuovo il comando module list e vedrete la scritta "[e]" accanto a 8.0: +Per vedere come cambia l'output dell'elenco dei moduli, eseguite di nuovo il comando module list e vedrete la scritta "[e]" accanto a 8.3: -``` +```bash dnf module list php ``` L'output è di nuovo lo stesso, tranne che per questa riga: -``` -php remi-8.0 [e] common [d], devel, minimal PHP scripting language +```bash +php remi-8.3 [e] common [d], devel, minimal PHP scripting language ``` ### Installazione dei Pacchetti Il nostro esempio utilizza Apache e mariadb, quindi per installare ciò di cui abbiamo bisogno, dobbiamo semplicemente procedere come segue: -``` -dnf install httpd mariadb-server vim wget zip unzip libxml2 openssl php81-php php81-php-ctype php81-php-curl php81-php-gd php81-php-iconv php81-php-json php81-php-libxml php81-php-mbstring php81-php-openssl php81-php-posix php81-php-session php81-php-xml php81-php-zip php81-php-zlib php81-php-pdo php81-php-mysqlnd php81-php-intl php81-php-bcmath php81-php-gmp +```bash +dnf install httpd mariadb-server vim wget zip unzip libxml2 openssl php83-php php83-php-ctype php83-php-curl php83-php-gd php83-php-iconv php83-php-json php83-php-libxml php83-php-mbstring php83-php-openssl php83-php-posix php83-php-session php83-php-xml php83-php-zip php83-php-zlib php83-php-pdo php83-php-mysqlnd php83-php-intl php83-php-bcmath php83-php-gmp ``` ### Configurazione @@ -115,29 +116,29 @@ dnf install httpd mariadb-server vim wget zip unzip libxml2 openssl php81-php ph Impostare l'avvio di _apache_ all'avvio del sistema: -``` +```bash systemctl enable httpd ``` Poi avviatelo: -``` +```bash systemctl start httpd ``` #### Creare la Configurazione -Nella sezione "Prerequisiti e presupposti" abbiamo detto che per la nostra configurazione utilizzeremo la procedura [Apache Sites Enabled](../web/apache-sites-enabled.md). Fate clic su quella procedura e impostate le basi lì, quindi tornate a questo documento per continuare. +Nella sezione _Prerequisiti e presupposti_, abbiamo detto che per la nostra configurazione utilizzeremo la procedura [Apache Sites Enabled](../web/apache-sites-enabled.md). Fate clic su quella procedura e impostate le basi lì, quindi tornate a questo documento per continuare. Per Nextcloud, è necessario creare il seguente file di configurazione. -``` +```bash vi /etc/httpd/sites-available/com.yourdomain.nextcloud ``` Il file di configurazione dovrebbe essere simile a questo: -``` +```bash DocumentRoot /var/www/sub-domains/com.yourdomain.nextcloud/html/ ServerName nextcloud.yourdomain.com @@ -152,11 +153,11 @@ Il file di configurazione dovrebbe essere simile a questo: ``` -Al termine, salvare le modifiche (con `SHIFT:wq!` per _vi_). +Una volta fatto, salvate le modifiche (con ++shift+colon+"w "+"q "+exclam++ per _vi_). Quindi, creare un collegamento a questo file in /etc/httpd/sites-enabled: -``` +```bash ln -s /etc/httpd/sites-available/com.yourdomain.nextcloud /etc/httpd/sites-enabled/ ``` @@ -164,36 +165,35 @@ ln -s /etc/httpd/sites-available/com.yourdomain.nextcloud /etc/httpd/sites-enabl Come indicato nella configurazione precedente, è necessario creare la _DocumentRoot_. Questo può essere fatto da: -``` +```bash mkdir -p /var/www/sub-domains/com.yourdomain.com/html ``` È qui che verrà installata la nostra istanza Nextcloud. - #### Configurazione di PHP È necessario impostare il fuso orario per PHP. Per farlo, aprire php.ini con il proprio editor di testo: -``` -vi /etc/opt/remi/php81/php.ini +```bash +vi /etc/opt/remi/php83/php.ini ``` Trovate quindi la riga che dice: -``` +```php ;date.timezone = ``` -È necessario rimuovere l'annotazione (;) e impostare il fuso orario. Per il nostro esempio di fuso orario, dovremmo inserire: +È necessario rimuovere l'annotazione (++semicolon++) e impostare il fuso orario. Per il nostro esempio di fuso orario, dovremmo inserire: -``` +```php date.timezone = "America/Chicago" ``` O -``` +```php date.timezone = "US/Central" ``` @@ -201,13 +201,13 @@ Quindi salvare e uscire dal file php.ini. Si noti che per mantenere le cose invariate, il fuso orario nel file _php.ini_ dovrebbe corrispondere a quello della macchina. Per sapere a quale valore è impostato, procedere come segue: -``` +```bash ls -al /etc/localtime ``` Questo dovrebbe mostrare qualcosa di simile, supponendo che abbiate impostato il fuso orario quando avete installato Rocky Linux e che viviate nel fuso orario centrale: -``` +```bash /etc/localtime -> /usr/share/zoneinfo/America/Chicago ``` @@ -215,13 +215,13 @@ Questo dovrebbe mostrare qualcosa di simile, supponendo che abbiate impostato il Impostare l'avvio di _mariadb-server_ all'avvio del sistema: -``` +```bash systemctl enable mariadb ``` E poi avviarlo: -``` +```bash systemctl restart mariadb ``` @@ -231,57 +231,56 @@ Anche in questo caso, come indicato in precedenza, per la configurazione inizial I prossimi passi presuppongono che siate connessi in remoto al vostro server Nextcloud tramite _ssh_ e che abbiate una console remota aperta: -* Accedere al [sito web](https://nextcloud.com/) di [Nextcloud](https://nextcloud.com/). -* Passate il mouse su "Get Nextcloud", che farà apparire un menu a discesa. -* Fare clic su "Server Packages". -* Fate clic con il tasto destro del mouse su "Download Nextcloud" e copiate l'indirizzo del link (la sintassi esatta è diversa da browser a browser). -* Nella console remota del server Nextcloud, digitate "wget", quindi uno spazio e incollate il testo appena copiato. Si dovrebbe ottenere qualcosa di simile a quanto segue: `wget https://download.nextcloud.com/server/releases/nextcloud-21.0.1.zip` (si noti che la versione potrebbe essere diversa). -* Una volta premuto il tasto Invio, il download del file .zip inizierà e si concluderà abbastanza rapidamente. +- Accedere al [sito web](https://nextcloud.com/) di [Nextcloud](https://nextcloud.com/). +- Passate il mouse su `Get Nextcloud`, che farà apparire un menu a discesa. +- Fare clic su `Server Packages`. +- Fate clic con il tasto destro del mouse su `Download Nextcloud` e copiate l'indirizzo del link (la sintassi esatta è diversa da browser a browser). +- Nella console remota del server Nextcloud, digitate `wget`, quindi uno spazio e incollate il testo appena copiato. Si dovrebbe ottenere qualcosa di simile a quanto segue: `wget https://download.nextcloud.com/server/releases/nextcloud-21.0.1.zip` (si noti che la versione potrebbe essere diversa). +- Una volta premuto il tasto Invio, il download del file .zip inizierà e si concluderà abbastanza rapidamente. Una volta completato il download, decomprimere il file zip di Nextcloud utilizzando la seguente procedura: -``` +```bash unzip nextcloud-21.0.1.zip ``` ### Copiare il contenuto e modificare i permessi -Dopo aver completato la fase di decompressione, si dovrebbe avere una nuova directory in /root chiamata "nextcloud" Passare a questa directory: +Dopo aver completato la fase di decompressione, si dovrebbe avere una nuova directory in _/root_ chiamata "nextcloud". Passare a questa directory: -``` +```bash cd nextcloud ``` E copiare o spostare il contenuto nella nostra _DocumentRoot_: -``` +```bash cp -Rf * /var/www/sub-domains/com.yourdomain.nextcloud/html/ ``` O -``` +```bash mv * /var/www/sub-domains/com.yourdomain.nextcloud/html/ ``` Ora che tutto è al suo posto, il passo successivo è assicurarsi che apache possieda la directory. Per farlo, eseguire: -``` +```bash chown -Rf apache.apache /var/www/sub-domains/com.yourdomain.nextcloud/html ``` -Per motivi di sicurezza, vogliamo anche spostare la cartella "data" dall'interno all'esterno della _DocumentRoot_. Per farlo, utilizzate il seguente comando: +Per motivi di sicurezza, vogliamo anche spostare la cartella _data_ dall'interno all'esterno della _DocumentRoot_. Per farlo, utilizzate il seguente comando: -``` +```bash mv /var/www/sub-domains/com.yourdomain.nextcloud/html/data /var/www/sub-domains/com.yourdomain.nextcloud/ ``` - ### Configurazione di Nextcloud Ora arriva il divertimento! Innanzitutto, assicuratevi che i vostri servizi siano attivi. Se avete seguito i passaggi precedenti, dovrebbero essere già in funzione. Ci sono stati diversi passaggi tra questi avvii iniziali del servizio, quindi andiamo avanti e riavviamoli, per essere sicuri: -``` +```bash systemctl restart httpd systemctl restart mariadb ``` @@ -290,9 +289,7 @@ Se tutto si riavvia e non ci sono problemi, siete pronti a proseguire. Per effettuare la configurazione iniziale, dobbiamo caricare il sito in un browser web: -``` -http://nextcloud.yourdomain.com/ -``` + (sostituire con l'attuale hostname) Supponendo di aver fatto tutto correttamente fino a questo momento, dovrebbe apparire la schermata di configurazione di Nextcloud: @@ -300,24 +297,25 @@ Supponendo di aver fatto tutto correttamente fino a questo momento, dovrebbe app Ci sono un paio di cose che vogliamo fare in modo diverso rispetto alle impostazioni predefinite: -* Nella parte superiore della pagina web, dove è scritto "Create an admin account", impostare l'utente e la password. Ai fini di questo documento, inseriamo "admin" e impostiamo una password forte. Ricordate di salvarla in un posto sicuro (come un gestore di password) per non perderla! Anche se avete digitato in questo campo, non premete "Invio" prima di aver completato tutti i campi di impostazione! -* Nella sezione "Storage & database", modificate la posizione della "Data folder" dalla radice predefinita del documento alla posizione in cui abbiamo spostato la cartella dati in precedenza: `/var/www/sub-domains/com.yourdomain.nextcloud/data`. -* Nella sezione "Configure the database", cambiare da "SQLite" a "MySQL/MariaDB" facendo clic sul pulsante. -* Nei campi "Database user" e "Database password" inserire l'utente root di MariaDB e la password impostata in precedenza. -* Nel campo "Database name", digitare "nextcloud". -* Nel campo "localhost", digitare "localhost:3306" (3306 è la porta di connessione predefinita di _mariadb_ ). +- Nella parte superiore della pagina web, dove è scritto `Crea un account amministratore`, impostare l'utente e la password. Ai fini di questo documento, inseriamo `admin` e impostiamo una password forte. Ricordate di salvarla in un posto sicuro (come un gestore di password) per non perderla! Anche se avete digitato in questo campo, non premete ++enter++ finché non sono stati completati tutti i campi di impostazione! +- Nella sezione `Archiviazione & database`, cambiare la posizione della `cartella Dati` dalla radice predefinita del documento, alla posizione in cui abbiamo spostato la cartella dati in precedenza: `/var/www/sub-domains/com.yourdomain.nextcloud/data`. +- Nella sezione `Configura il database`, passare da `SQLite` a `MySQL/MariaDB` facendo clic su questo pulsante. +- Nei campi `Utente del database` e `Password del database` digitate l'utente root di MariaDB e la password impostata in precedenza. +- Nel campo `Nome del database`, digitare `nextcloud`. +- Nel campo `localhost` digitare: (3306 è la porta predefinita di _mariadb_). -Una volta fatto tutto questo, fate clic su `Finish Setup` e sarete subito operativi. +Una volta fatto tutto questo, fate clic su `Fine dell'installazione` e sarete subito operativi. La finestra del browser si aggiorna per un po' e poi di solito non ricarica il sito. Inserite nuovamente l'URL nella finestra del browser e vi troverete di fronte alle prima pagina predefinita. A questo punto l'utente amministrativo è già (o dovrebbe essere) loggato, e ci sono diverse pagine informative pensate per farvi acquisire familiarità. La "Dashboard" è ciò che gli utenti vedranno al primo accesso. L'utente amministrativo può ora creare altri utenti, installare altre applicazioni e svolgere molte altre attività. -Il file "Nextcloud Manual.pdf" è il manuale d'uso, in modo che gli utenti possano familiarizzare con ciò che è disponibile. L'utente amministrativo dovrebbe leggere o almeno scansionare i punti salienti del manuale di amministrazione [sul sito web di Nextcloud](https://docs.nextcloud.com/server/21/admin_manual/) +Il file "Nextcloud Manual.pdf" è il manuale d'uso, in modo che gli utenti possano familiarizzare con ciò che è disponibile. L'utente amministrativo dovrebbe leggere o almeno scansionare i punti salienti del manuale di amministrazione [sul sito web di Nextcloud.](https://docs.nextcloud.com/server/21/admin_manual/) ## Passi successivi A questo punto, non dimenticate che si tratta di un server su cui memorizzerete i dati aziendali. È importante bloccare il sito con un firewall, [impostare](../backup/rsnapshot_backup.md) il [backup](../backup/rsnapshot_backup.md), proteggere il sito con un [SSL](../security/generating_ssl_keys_lets_encrypt.md) e qualsiasi altra operazione necessaria per mantenere i dati al sicuro. ## Conclusioni -La decisione di portare il cloud aziendale all'interno dell'azienda deve essere valutata con attenzione. Per coloro che decidono che mantenere i dati aziendali in locale è preferibile rispetto a un host cloud esterno, Nextcloud è una buona alternativa. + +La decisione di portare il cloud aziendale all'interno dell'azienda è una decisione che deve essere valutata attentamente. Per coloro che decidono che mantenere i dati aziendali in locale è preferibile rispetto a un host cloud esterno, Nextcloud è una buona alternativa. diff --git a/docs/guides/cms/dokuwiki_server.it.md b/docs/guides/cms/dokuwiki_server.it.md index e6ffcfb266..71ab5ba625 100644 --- a/docs/guides/cms/dokuwiki_server.it.md +++ b/docs/guides/cms/dokuwiki_server.it.md @@ -1,5 +1,5 @@ --- -title: DokuWiki +title: Server DokuWiki author: Spencer Steven contributors: Ezequiel Bruni, Ganna Zhyrnova tested_with: 8.5, 8.6, 9.0 @@ -8,150 +8,171 @@ tags: - documentation --- -# Server DokuWiki +## Prerequisiti e presupposti -## Prerequisiti E Presupposti - -* Un'istanza di Rocky Linux installata su un server, un container o una macchina virtuale. -* Abilità nel modificare i file di configurazione dalla riga di comando con un editor (i nostri esempi utilizzeranno _vi_, ma potete sostituire il vostro editor preferito). -* Conoscenza delle applicazioni web e della loro configurazione. -* Il nostro esempio utilizzerà [Apache Sites Enabled](../web/apache-sites-enabled.md) per l'impostazione, quindi è una buona idea rivedere questa routine se si intende seguirla. -* In questo esempio utilizzeremo "example.com" come nome di dominio. -* In questo documento si presuppone che siate l'utente root o che possiate arrivarci con _sudo_. -* Si presuppone una nuova installazione del sistema operativo, ma questo **NON** è un requisito. +- Un'istanza di Rocky Linux installata su un server, un container o una macchina virtuale. +- Abilità nel modificare i file di configurazione dalla riga di comando con un editor (negli esempi qui riportati si utilizzerà _vi_, ma è possibile sostituire l'editor preferito) +- Conoscenza delle applicazioni web e della loro configurazione +- Il nostro esempio utilizzerà [Apache Sites Enabled](../web/apache-sites-enabled.md) per l'impostazione. Se necessario, rivederlo. +- Questo documento utilizzerà "example.com" come nome di dominio in tutto il documento +- È necessario essere root o in grado di eseguire `sudo` per elevare i privilegi +- Tuttavia, supponendo una nuova installazione del sistema operativo, questo non è un requisito ## Introduzione -La documentazione può assumere diverse forme in un'organizzazione. Avere un repository a cui fare riferimento per la documentazione è inestimabile. Un wiki (che in hawaiano significa _veloce_ ) è un modo per conservare in una posizione centralizzata la documentazione, le note di processo, le basi di conoscenza aziendale e persino gli esempi di codice. I professionisti IT che mantengono un wiki, anche di nascosto, hanno una polizza assicurativa incorporata contro la dimenticanza di una routine oscura. +La documentazione può assumere diverse forme in un'organizzazione. Avere un repository a cui fare riferimento per la documentazione è inestimabile. Un wiki (che in hawaiano significa _veloce_) è un modo per conservare in una posizione centralizzata documentazione, note di processo, basi di conoscenza aziendale e persino esempi di codice. I professionisti IT che tengono un wiki, anche di nascosto, hanno una polizza assicurativa integrata contro la dimenticanza di una routine oscura. -DokuWiki è un wiki maturo, veloce, che funziona senza database, ha funzioni di sicurezza integrate ed è relativamente facile da distribuire. Per ulteriori informazioni su cosa può fare DokuWiki, consultate la sua [pagina web](https://www.dokuwiki.org/dokuwiki). +DokuWiki è un wiki maturo e veloce che funziona senza database, ha funzioni di sicurezza integrate e non è complesso da distribuire. Per ulteriori informazioni, consultate la loro [pagina web](https://www.dokuwiki.org/dokuwiki). -DokuWiki è solo uno dei tanti wiki disponibili, anche se è piuttosto buono. Un grande vantaggio è che DokuWiki è relativamente leggero e può essere eseguito su un server in cui sono già in esecuzione altri servizi, a condizione che si disponga di spazio e memoria. +DokuWiki è uno dei tanti wiki disponibili, anche se è un buon wiki. Un grande vantaggio è che DokuWiki è relativamente leggero e può essere eseguito su un server in cui sono già in esecuzione altri servizi, a condizione che si disponga di spazio e memoria. ## Installazione delle Dipendenze -La versione minima di PHP per DokuWiki è ora la 7.2, che è esattamente quella con cui Rocky Linux 8 viene fornito. Rocky Linux 9.0 è fornito della versione 8.0 di PHP, anch'essa pienamente supportata. Qui si specificano pacchetti che potrebbero essere già installati: - -`dnf install tar wget httpd php php-gd php-xml php-json php-mbstring` - -Verrà visualizzato un elenco di dipendenze aggiuntive che verranno installate e questo prompt: +La versione minima di PHP per DokuWiki è ora la 7.2, che Rocky Linux 8 ha di default. Grazie ai moduli, Rocky Linux 8 può supportare l'installazione fino alla versione 8.2. Rocky Linux 9.0 ha PHP versione 8.0 come impostazione predefinita e moduli che consentono fino alla versione 8.2. Si noti che alcuni dei pacchetti elencati potrebbero già esistere: -`Is this ok [y/N]:` +```bash +dnf install tar wget httpd php php-gd php-xml php-json php-mbstring +``` -Rispondete con "y" e premete "Invio" per installare. +Accettare e installare tutte le dipendenze aggiuntive elencate che vengono fornite con questi pacchetti. -## Creare Directory e Modificare la Configurazione +## Creare directory e modificare la configurazione ### Configurazione di Apache -Se avete letto la procedura [Apache Sites Enabled](../web/apache-sites-enabled.md), sapete che è necessario creare alcune directory. Inizieremo con le aggiunte alla directory di configurazione _httpd_: +Se si è letta la procedura [Apache Sites Enabled](../web/apache-sites-enabled.md), sapete che è necessario creare alcune directory. Iniziare con aggiungere alla directory di configurazione _htpd_: -`mkdir -p /etc/httpd/{sites-available,sites-enabled}` +```bash +mkdir -p /etc/httpd/{sites-available,sites-enabled} +``` -È necessario modificare il file httpd.conf: +È necessario modificare il file `httpd.conf`: -`vi /etc/httpd/conf/httpd.conf` +```bash +vi /etc/httpd/conf/httpd.conf +``` -E aggiungete questo in fondo al file: +Aggiungetelo in fondo al file: -`Include /etc/httpd/sites-enabled` +```bash +Include /etc/httpd/sites-enabled +``` Creare il file di configurazione del sito in sites-available: -`vi /etc/httpd/sites-available/com.example` +```bash +vi /etc/httpd/sites-available/com.example +``` -Il file di configurazione dovrebbe essere simile a questo: +Il file di configurazione sarà simile a questo: -``` +```apache - ServerName example.com - DocumentRoot /var/www/sub-domains/com.example/html + ServerName example.com + DocumentRoot /var/www/sub-domains/com.example/html - - + + AllowOverride All - Require all denied - - - Order allow,deny - Deny from all - - - - ErrorLog /var/log/httpd/example.com_error.log - CustomLog /var/log/httpd/example.com_access.log combined + Require all denied + + + Order allow,deny + Deny from all + + + + ErrorLog /var/log/httpd/example.com_error.log + CustomLog /var/log/httpd/example.com_access.log combined ``` -Si noti che l'opzione "AllowOverride All" di cui sopra consente al file .htaccess (sicurezza specifica della directory) di funzionare. +Si noti che l'opzione "AllowOverride All" sopra riportata consente il funzionamento del file `.htaccess` (sicurezza specifica della directory). Procedere con il collegamento del file di configurazione in sites-enabled, ma non avviare ancora i servizi web: -`ln -s /etc/httpd/sites-available/com.example /etc/httpd/sites-enabled/` +```bash +ln -s /etc/httpd/sites-available/com.example /etc/httpd/sites-enabled/ +``` ### Apache DocumentRoot -Dobbiamo anche creare la nostra _DocumentRoot_. Per ora fare: +È necessario creare la _DocumentRoot_. Per farlo eseguire: -`mkdir -p /var/www/sub-domains/com.example/html` +```bash +mkdir -p /var/www/sub-domains/com.example/html +``` ## Installazione di DokuWiki Nel server, passare alla root directory. -`cd /root` +```bash +cd /root +``` -Ora che il nostro ambiente è pronto, prendiamo l'ultima versione stabile di DokuWiki. Potete trovarlo andando alla [pagina di download](https://download.dokuwiki.org/) e sul lato sinistro della pagina, alla voce "Version", vedrete "Stable (Recommended) (direct link)." +Dal momento che il vostro ambiente è pronto per l'uso, procuratevi l'ultima versione stabile di DokuWiki. È possibile trovarlo andando sulla [pagina di download](https://download.dokuwiki.org/) e sul lato sinistro della pagina, sotto “Versione”, si troverà “Stabile (consigliata) (link diretto)”. -Fare clic con il tasto destro del mouse sulla parte "(link diretto)" e copiare l'indirizzo del link. Nella console del vostro server DokuWiki, digitate "wget" e uno spazio e poi incollate il link copiato nel terminale. Si dovrebbe ottenere qualcosa di simile a questo: +Fare clic con il tasto destro del mouse sulla parte “(link diretto)” e copiare il link. Nella console del vostro server DokuWiki, digitate `wget` e uno spazio e poi incollate il link copiato nel terminale. Si dovrebbe ottenere qualcosa di simile a questo: -`wget https://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz` +```bash +wget https://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz +``` -Prima di decomprimere l'archivio, si può dare un'occhiata al contenuto usando `tar ztf` per vedere il contenuto dell'archivio: +Prima di decomprimere l'archivio, esaminare il contenuto con `tar ztf`: -`tar ztvf dokuwiki-stable.tgz` +```bash +tar ztvf dokuwiki-stable.tgz +``` -Notate la directory datata che precede tutti gli altri file e che ha un aspetto simile a questo? +Notate il nome della directory datata davanti a tutti gli altri file che hanno un aspetto simile a questo: -``` +```text ... (more above) dokuwiki-2020-07-29/inc/lang/fr/resetpwd.txt dokuwiki-2020-07-29/inc/lang/fr/draft.txt dokuwiki-2020-07-29/inc/lang/fr/recent.txt ... (more below) ``` -Non vogliamo che questa directory venga decompressa quando decomprimiamo l'archivio, quindi useremo alcune opzioni con tar per escluderla. La prima opzione è "--strip-components=1" che rimuove la directory principale. -La seconda opzione è l'opzione "-C", che indica a tar dove si vuole decomprimere l'archivio. Quindi decomprimere l'archivio con questo comando: +Non si vuole che questa directory con nome principale venga decompressa durante la decompressione dell'archivio, quindi si useranno alcune opzioni con `tar` per escluderla. La prima opzione è “--strip-components=1” che rimuove la directory principale. La seconda opzione è l'opzione “-C”, che indica a `tar` dove si vuole decomprimere l'archivio. La decompressione sarà simile a questa: -`tar xzf dokuwiki-stable.tgz --strip-components=1 -C /var/www/sub-domains/com.example/html/` +```bash +tar xzf dokuwiki-stable.tgz --strip-components=1 -C /var/www/sub-domains/com.example/html/ +``` -Una volta eseguito questo comando, tutto DokuWiki dovrebbe trovarsi nella nostra _DocumentRoot_. +Una volta eseguito questo comando, tutto DokuWiki dovrebbe trovarsi nella _DocumentRoot_. -È necessario fare una copia del file _.htaccess.dist_ fornito con DokuWiki e conservare anche quello vecchio, nel caso in cui si debba tornare all'originale in futuro. +È necessario fare una copia del file _.htaccess.dist_ fornito con DokuWiki e conservare quello vecchio, nel caso in cui sia necessario tornare all'originale. -Nel processo, cambieremo il nome di questo file in _.htaccess_, che è quello che _apache_ cercherà. Per farlo: +In questo processo, il nome del file verrà modificato in _.htaccess_. Questo è ciò che _apache_ cercherà. Per ottenere questo: -`cp /var/www/sub-domains/com.example/html/.htaccess{.dist,}` +```bash +cp /var/www/sub-domains/com.example/html/.htaccess{.dist,} +``` -Ora dobbiamo cambiare la proprietà della nuova directory e dei suoi file all'utente e al gruppo _apache_: +È necessario cambiare la proprietà della nuova directory e dei suoi file all'utente e al gruppo _apache_: -`chown -Rf apache.apache /var/www/sub-domains/com.example/html` +```bash +chown -Rf apache.apache /var/www/sub-domains/com.example/html +``` -## Impostazione del DNS o di /etc/hosts +## Impostazione del DNS o di `/etc/hosts` -Prima di poter accedere all'interfaccia di DokuWiki, è necessario impostare la risoluzione dei nomi per questo sito. A scopo di test, è possibile utilizzare il file _/etc/hosts_. +Prima di poter accedere all'interfaccia di DokuWiki, è necessario impostare il nome per questo sito. È possibile utilizzare il file _/etc/hosts_ a scopo di test. -In questo esempio, supponiamo che DokuWiki venga eseguito su un indirizzo IPv4 privato di 10.56.233.179. Supponiamo anche che si stia modificando il file _/etc/hosts_ su una workstation Linux. Per farlo, eseguire: +In questo esempio, supponiamo che DokuWiki venga eseguito su un indirizzo IPv4 privato di 10.56.233.179. Si supponga che si stia modificando anche il file _/etc/hosts_ su una workstation Linux. Per farlo, eseguire: -`sudo vi /etc/hosts` +```bash +sudo vi /etc/hosts +``` -Quindi modificate il vostro file hosts in modo che assomigli a questo (notare l'indirizzo IP in alto nell'esempio seguente): +Modificate quindi il file host in modo che abbia un aspetto simile a questo (notare l'indirizzo IP sopra nell'esempio): -``` -127.0.0.1 localhost -127.0.1.1 myworkstation-home -10.56.233.179 example.com example +```bash +127.0.0.1 localhost +127.0.1.1 myworkstation-home +10.56.233.179 example.com example # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback @@ -161,128 +182,86 @@ ff02::1 ip6-allnodes ff02::2 ip6-allrouters ``` -Una volta terminati i test e pronti a rendere il tutto operativo per tutti, sarà necessario aggiungere questo host a un server DNS. Si può utilizzare un [server DNS privato](../dns/private_dns_server_using_bind.md) o un server DNS pubblico. +Una volta terminati i test e pronti a rendere il tutto live, è necessario aggiungere questo host a un server DNS. Si può utilizzare un [Server DNS privato](../dns/private_dns_server_using_bind.md) o un server DNS pubblico. -## Avviare httpd +## Avviare `httpd` -Prima di avviare _httpd_, facciamo un test per verificare che la nostra configurazione sia corretta: +Prima di avviare _httpd_, verificare che la configurazione sia corretta: -`httpd -t` +```bash +httpd -t +``` Dovresti ottenere: -`Syntax OK` +```text +Syntax OK +``` -In caso affermativo, si dovrebbe essere pronti ad avviare _httpd_ e a terminare la configurazione. Iniziamo abilitando l'avvio di _httpd_ all'avvio del sistema: +In caso affermativo, si dovrebbe essere pronti ad avviare _httpd_ e a terminare la configurazione. Iniziare abilitando _htpd_ all'avvio: -`systemctl enable httpd` +```bash +systemctl enable httpd +``` -E poi avviarlo: +Quindi avviarlo: -`systemctl start httpd` +```bash +systemctl start httpd +``` ## Testare DokuWiki -Ora che il nostro nome host è stato impostato per il test e il servizio Web è stato avviato, il passo successivo è aprire un browser Web e digitare questo nella barra degli indirizzi: - -`http://example.com/install.php` - -O +Il passo successivo consiste nell'aprire un browser web e digitare questo indirizzo nella barra degli indirizzi: -`http://example.com/install.php` + -Entrambi dovrebbero funzionare se si imposta il file hosts come sopra. In questo modo si accede alla schermata di impostazione per completare la configurazione: +Si accede così alla schermata di impostazione: -* Nel campo "Nome del wiki", digitare il nome del nostro wiki. Esempio "Documentazione tecnica" -* Nel campo "Superuser", digitare il nome utente amministrativo. Esempio "admin" -* Nel campo " Real name", digitare il nome reale dell'utente amministrativo. -* Nel campo "E-Mail", digitare l'indirizzo e-mail dell'utente amministrativo. -* Nel campo "Password", digitare la password sicura dell'utente amministrativo. -* Nel campo "once again", digitare nuovamente la stessa password. -* Nel menu a discesa " Initial ACL Policy", scegliere l'opzione più adatta al proprio ambiente. -* Scegliere la casella di controllo appropriata della licenza sotto la quale si desidera inserire il contenuto. -* Lasciare selezionata o deselezionare la casella di controllo "Una volta al mese, invia i dati anonimi di utilizzo agli sviluppatori di DokuWiki" -* Fare clic sul pulsante "Salva" +- Nel campo "Nome del wiki", digitare il nome del nostro wiki. Esempio "Documentazione tecnica" +- Nel campo "Superuser", digitare il nome utente amministrativo. Esempio "admin" +- Nel campo " Real name", digitare il nome reale dell'utente amministrativo. +- Nel campo "E-Mail", digitare l'indirizzo e-mail dell'utente amministrativo. +- Nel campo "Password", digitare la password sicura dell'utente amministrativo. +- Nel campo "once again", digitare nuovamente la stessa password. +- Nel menu a tendina "Initial ACL Policy", scegliere l'opzione più adatta all'ambiente +- Scegliere la casella di controllo appropriata della licenza sotto la quale si desidera inserire i propri contenuti +- Lasciare selezionata o deselezionare la casella di controllo "Una volta al mese, invia i dati anonimi di utilizzo agli sviluppatori di DokuWiki" +- Fare clic sul pulsante "Salva" Il wiki è ora pronto per l'aggiunta di contenuti. ## Mettere in sicurezza DokuWiki -Oltre al criterio ACL appena creato, si consideri che: - -### Il vostro firewall - -!!! note "Nota" - - Nessuno di questi esempi di firewall fa alcuna ipotesi su quali altri servizi sia necessario consentire sul server Dokuwiki. Queste regole sono basate sul nostro ambiente di test e si occupano **SOLO** di consentire l'accesso a un blocco ip di rete LOCALE. È necessario un numero maggiore di servizi consentiti per un server di produzione. - -Prima di definire il tutto, è necessario pensare alla sicurezza. Innanzitutto, il server dovrebbe essere dotato di un firewall. Si presume che si stia utilizzando uno dei firewall indicati di seguito. - -Invece di consentire a tutti l'accesso al wiki, assumeremo che chiunque si trovi sulla rete 10.0.0.0/8 sia sulla vostra rete locale privata e che queste siano le uniche persone che hanno bisogno di accedere al sito. - -#### `iptables` Firewall (deprecato) - -!!! warning "Attenzione" - - Il processo del firewall `iptables` qui è stato deprecato in Rocky Linux 9. (ancora disponibile, ma probabilmente scomparirà nelle versioni future, forse già come Rocky Linux 9.1). Per questo motivo, si consiglia di passare alla procedura `firewalld` che segue se si sta eseguendo questa operazione su 9.0 o superiore. +Oltre alla politica ACL appena creata, considerate quanto segue: -Si noti che potrebbero essere necessarie altre regole per altri servizi su questo server e che questo esempio prende in considerazione solo i servizi web. +### Il tuo firewall `firewalld` -Per prima cosa, modificare o creare il file _/etc/firewall.conf:_ +!!! note -`vi /etc/firewall.conf` + Questo esempio di firewall non tiene conto di quali altri servizi sia necessario consentire sul server DokuWiki. Queste regole si basano sull'ambiente di test e si occupano **SOLO** di consentire l'accesso a un blocco IP di rete LOCALE. Avrete bisogno di consentire più servizi per un server di produzione. -``` -#IPTABLES=/usr/sbin/iptables - -# Unless specified, the default for OUTPUT is ACCEPT -# The default for FORWARD and INPUT is DROP -# -echo " clearing any existing rules and setting default policy.." -iptables -F INPUT -iptables -P INPUT DROP -# web ports -iptables -A INPUT -p tcp -m tcp -s 10.0.0.0/8 --dport 80 -j ACCEPT -iptables -A INPUT -p tcp -m tcp -s 10.0.0.0/8 --dport 443 -j ACCEPT -iptables -A INPUT -i lo -j ACCEPT -iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset -iptables -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable - -/usr/sbin/service iptables save -``` - -Una volta creato lo script, assicuratevi che sia eseguibile: - -`chmod +x /etc/firewall.conf` - -Eseguire quindi lo script: - -`/etc/firewall.conf` +Prima di definire il tutto, è necessario pensare alla sicurezza. Innanzitutto, il server dovrebbe essere dotato di un firewall. -Questo eseguirà le regole e le salverà in modo che vengano ricaricate al successivo avvio di _iptables_ o al boot. +Il presupposto è che chiunque si trovi sulla rete 10.0.0.0/8 sia sulla vostra rete locale privata e che queste siano le uniche persone che devono accedere al sito. -#### `firewalld` Firewall +Se si utilizza `firewalld` come firewall, utilizzare la seguente sintassi di regole: -Se si usa `firewalld` come firewall (e a questo punto probabilmente si *dovrebbe*), si possono applicare gli stessi concetti usando la sintassi `firewall-cmd` di firewalld. - -Duplicheremo le regole `iptables` (sopra) con `regole firewalld`: - -``` +```bash firewall-cmd --zone=trusted --add-source=10.0.0.0/8 --permanent firewall-cmd --zone=trusted --add-service=http --add-service=https --permanent firewall-cmd --reload ``` -Una volta aggiunte le regole di cui sopra e ricaricato il servizio firewalld, elencare la zona per assicurarsi che ci sia tutto ciò che serve: +Una volta aggiunte le regole di cui sopra e ricaricato il servizio `firewalld`, elencare la zona per assicurarsi che ci sia tutto ciò che serve: -``` +```bash firewall-cmd --zone=trusted --list-all ``` -che dovrebbe mostrarvi qualcosa del genere se tutto quanto sopra ha funzionato correttamente: +L'aspetto sarà simile a questo, se tutto funziona correttamente: -``` +```bash trusted (active) target: ACCEPT icmp-block-inversion: no @@ -301,8 +280,8 @@ trusted (active) ### SSL -Per una maggiore sicurezza, dovreste considerare l'utilizzo di un SSL, in modo che tutto il traffico web sia criptato. È possibile acquistare un SSL da un provider SSL o utilizzare [Let's Encrypt](../security/generating_ssl_keys_lets_encrypt.md). +Per una maggiore sicurezza, si dovrebbe prendere in considerazione l'utilizzo di un SSL per il traffico web crittografato. È possibile acquistare un certificato SSL da un fornitore di certificati SSL oppure utilizzare [Let's Encrypt](../security/generating_ssl_keys_lets_encrypt.md). ## Conclusione -Che si tratti di documentare processi, politiche aziendali, codici di programma o altro, un wiki è un ottimo modo per farlo. DokuWiki è un prodotto sicuro, flessibile, facile da usare, relativamente semplice da installare e distribuire, ed è un progetto stabile che esiste da molti anni. +Che tu debba documentare processi, politiche aziendali, codice di programmazione o altro, un wiki è un ottimo strumento per farlo. DokuWiki è un prodotto sicuro, flessibile e facile da usare, relativamente semplice da installare e implementare. È anche un progetto stabile che esiste da molti anni. diff --git a/docs/guides/cms/wordpress-on-lamp.it.md b/docs/guides/cms/wordpress-on-lamp.it.md new file mode 100644 index 0000000000..b09632e017 --- /dev/null +++ b/docs/guides/cms/wordpress-on-lamp.it.md @@ -0,0 +1,243 @@ +--- +title: WordPress su LAMP +author: Joseph Brinkman +contributors: Steven Spencer, Ganna Zhyrnova +tested_with: 9.2 +--- + +## Prerequisiti + +- Un sistema Rocky Linux 9.x +- privilegi sudo + +## Introduzione + +WordPress è un Content Management System (CMS) open source noto per la [famosa installazione in 5 minuti](https://developer.wordpress.org/advanced-administration/before-install/howto-install/). È comunemente distribuito su uno stack LAMP (Linux, Apache, MySQL, PHP). Sebbene siano ampiamente disponibili strumenti efficienti per lo sviluppo locale come [XAMPP](https://www.apachefriends.org/), [Vagrant](https://www.vagrantup.com/) e [wp-env](https://developer.wordpress.org/block-editor/reference-guides/packages/packages-env/), l'installazione manuale di WordPress su LAMP per lo sviluppo locale rappresenta un valido approccio pratico per i principianti in cerca di maggiori conoscenze. + +Questa guida presuppone che abbiate già installato Rocky Linux 9.x, coprendo quindi la parte “L” dello stack LAMP. + +Questa guida illustra come installare manualmente WordPress con lo stack LAMP su una macchina Rocky Linux 9. Non si tratta di una guida pronta per la produzione, ma di un punto di partenza su cui basarsi. La configurazione LAMP inclusa in questa guida non è consigliata per nulla al di fuori dello sviluppo locale, se non si adottano prima misure di sicurezza adeguate che richiedono una configurazione aggiuntiva. + +## Aggiornamento dei pacchetti di sistema + +Assicuratevi che i pacchetti del sistema siano aggiornati: + +```bash + sudo dnf upgrade -y +``` + +## Installare Apache + +Apache è un server web che servirà il vostro sito WordPress. Installarlo con quanto segue: + +```bash + sudo dnf install httpd -y +``` + +## Abilitare l'avvio di Apache all'avvio + +Dopo aver installato Apache, abilitarlo in modo che si avvii automaticamente all'avvio: + +```bash + sudo systemctl enable --now httpd +``` + +## Installazione di MariaDB + +WordPress memorizza i contenuti dinamici in un database MySQL. MariaDB è un fork open source di MySQL. Installarlo con quanto segue: + +```bash + sudo dnf install mariadb-server -y +``` + +## Attivare MariaDB server + +Dopo aver installato MariaDB, abilitarlo in modo che si avvii automaticamente all'avvio: + +```bash + sudo systemctl enable --now mariadb +``` + +## Modulo Sicurezza di MariaDB + +Eseguire lo script `mysql_secure_installation`: + +```bash + sudo mysql_secure_installation --use-default +``` + +Questo script esegue le seguenti operazioni: + +1. Imposta una password di root, se non è già stata impostata. + +2. Rimuove gli utenti anonimi + +3. Disabilita l'accesso a root remoto + +4. Rimuove l'accesso al database di prova + +5. Ricarica i privilegi + +## Installazione di PHP + +PHP è il linguaggio di scripting utilizzata per interagire con il database MySQL ed eseguire azioni dinamiche. È molto utilizzato nel core di WordPress, nei temi e nei plugin. + +Installare PHP e i pacchetti necessari per connettersi a MySQL: + +```bash + sudo dnf install php php-mysqlnd php-gd php-xml php-mbstring +``` + +Dopo aver installato PHP, è necessario ricaricare Apache per installarlo come modulo Apache e leggere i suoi file di configurazione: + +## Riavviare Apache + +```bash + sudo systemctl restart httpd +``` + +## Recuperare e scompattare WordPress + +Utilizzate `curl` per scaricare l'ultima versione di WordPress: + +```bash + curl -O https://wordpress.org/latest.tar.gz +``` + +Utilizzare `tar` per estrarre l'archivio scaricato: + +```bash + tar -xzvf latest.tar.gz +``` + +Copiare i file di WordPress nella directory pubblica predefinita di Apache: + +```bash + sudo cp -r wordpress/* /var/www/html +``` + +## Impostare l'Owner + +Rendere Apache il proprietario dei file: + +```bash + sudo chown -R apache:apache /var/www/html/ +``` + +Impostare i permessi per i file di WordPress: + +## Impostare i permessi + +```bash + sudo chmod -R 755 /var/www/html/ +``` + +Accedere al client MySQL: + +## Configurare il database + +```bash + sudo mysql -u root -p +``` + +Create un nuovo database per il vostro sito web WordPress: + +## Crea un nuovo database + +```bash + CREATE DATABASE LOCALDEVELOPMENTENV; +``` + +Creare un utente con una password per il database: + +!!! note + +``` +Si consiglia vivamente di utilizzare una password più forte. +``` + +## Creare un nuovo utente e una nuova password + +```bash + CREATE USER 'admin'@'localhost' IDENTIFIED BY 'password'; +``` + +Concedete tutti i privilegi del database di WordPress all'utente appena creato: + +```bash + GRANT ALL PRIVILEGES ON LOCALDEVELOPMENTENV.* TO 'admin'@'localhost'; +``` + +Eseguire il flush dei privilegi per garantire l'applicazione delle modifiche + +```bash + FLUSH PRIVILEGES; +``` + +Uscire dal client MySQL: + +```bash + EXIT; +``` + +## Configurare Wordpress + +Copiare il template `wp-config-sample.php` e rinominarlo: + +```bash + sudo cp /var/www/html/wp-config-sample.php /var/www/html/wp-config.php +``` + +Aprire il file `wp-config.php` con un editor di testo a scelta: + +```bash + sudo vi /var/www/html/wp-config.php +``` + +## Sostituire le impostazioni del database + +È necessario definire le seguenti costanti nel file `wp-config.php`: + +```bash + define ('DB_NAME', 'LOCALDEVELOPMENTENV'); + define ('DB_USER', 'admin'); + define ('DB_PASSWORD', 'password'); +``` + +## Configurare il firewall + +Aprire i servizi HTTP e HTTPS nel firewall: + +```bash + sudo firewall-cmd --add-service=http --add-service=https +``` + +Ricaricare `firewalld` per far sì che le modifiche abbiano effetto: + +```bash + sudo systemctl reload firewalld +``` + +## Impostazioni di SELinux + +Per consentire ad Apache l'accesso in lettura e scrittura ai file di WordPress, eseguite questo comando: + +```bash + chcon -R -t httpd_sys_rw_content_t /var/www/html/ +``` + +Per consentire ad Apache di effettuare connessioni di rete, eseguire questo comando: + +!!! Note + +``` +Il flag `-P` rende questa configurazione persistente tra i vari riavvii +``` + +```bash + setsebool -P httpd_can_network_connect true +``` + +## Conclusione + +Per concludere l'installazione, ora dovreste essere in grado di connettervi a WordPress attraverso la rete utilizzando il nome host o l'indirizzo IP privato del server. Ricordate che questa configurazione è destinata principalmente a scopi di sviluppo locale. Per l'uso in produzione, è necessario configurare quanto segue: impostare un nome di dominio, installare un certificato SSL, migliorare la sicurezza del server Apache, mettere a punto la configurazione SELinux e implementare i backup. Tuttavia, seguendo questa guida si è creato un solido punto di partenza per lo sviluppo di WordPress su uno stack LAMP. diff --git a/docs/guides/communications/asterisk_installation.it.md b/docs/guides/communications/asterisk_installation.it.md index 0a335586e2..6263634748 100644 --- a/docs/guides/communications/asterisk_installation.it.md +++ b/docs/guides/communications/asterisk_installation.it.md @@ -16,41 +16,41 @@ tags: **Che cos'è Asterisk?** -Asterisk è un framework open source per la creazione di applicazioni di comunicazione. Inoltre, Asterisk trasforma un normale computer in un server di comunicazione, oltre ad alimentare sistemi IP PBX, gateway VoIP, server per conferenze e altre soluzioni personalizzate. È utilizzato da piccole imprese, grandi aziende, call center, vettori e agenzie governative in tutto il mondo. +Asterisk è un framework open-source per la creazione di applicazioni di comunicazione. Inoltre, Asterisk trasforma un normale computer in un server di comunicazione, alimenta sistemi PBX IP, gateway VoIP, server per conferenze e altre soluzioni personalizzate. È utilizzato da piccole imprese, grandi aziende, call center, vettori e agenzie governative in tutto il mondo. -Asterisk è gratuito e open source ed è sponsorizzato da [Sangoma](https://www.sangoma.com/). Sangoma offre anche prodotti commerciali che utilizzano Asterisk come base, a seconda della vostra esperienza e del vostro budget, l'utilizzo di questi prodotti potrebbe essere più vantaggioso rispetto alla creazione di un proprio sistema. Solo voi e la vostra organizzazione conoscete la risposta. +Asterisk è gratuito e open source ed è sponsorizzato da [Sangoma](https://www.sangoma.com/). Sangoma offre anche prodotti commerciali che utilizzano Asterisk sotto il cofano e, a seconda della vostra esperienza e del vostro budget, l'utilizzo di questi prodotti potrebbe essere più vantaggioso rispetto alla creazione di un proprio sistema. Solo voi e la vostra organizzazione conoscete la risposta. -Va notato che questa guida richiede che l'amministratore faccia una discreta quantità di ricerche per conto proprio. L'installazione di un server di comunicazione non è un processo difficile, ma la sua gestione può essere piuttosto complicata. Sebbene questa guida renda il vostro server operativo, non sarà completamente pronto per l'uso in produzione. +Va notato che questa guida richiede che l'amministratore faccia una discreta quantità di ricerche per conto proprio. L'installazione di un server di comunicazione non è difficile, ma la sua gestione può essere piuttosto complicata. Sebbene questa guida renda il vostro server operativo, non sarà pronto per l'uso in produzione. ## Prerequisiti Per completare questa guida sono necessarie almeno le seguenti competenze e strumenti: -* Una macchina con Rocky Linux -* Un livello di comfort nella modifica dei file di configurazione e nell'emissione di comandi dalla riga di comando -* Conoscenza dell'uso di un editor a riga di comando (qui usiamo `vi`, ma potete sostituirlo con il vostro editor preferito) -* È necessario avere accesso a root e, idealmente, essere registrati come utente root nel proprio terminale -* I repository EPEL di Fedora -* La possibilità di accedere come root o di eseguire comandi di root con _sudo_. Tutti i comandi qui presenti presuppongono un utente con diritti _sudo_, ma i processi di configurazione e di compilazione vengono eseguiti con `sudo -s`. -* Per ottenere l'ultima versione di Asterisk, è necessario utilizzare `curl` o `wget`. Questa guida utilizza `wget`, ma se si desidera utilizzare la stringa `curl` appropriata, è possibile sostituirla. +- Una macchina con Rocky Linux +- Un livello di comfort nella modifica dei file di configurazione e nell'emissione di comandi dalla riga di comando +- Conoscenza dell'uso di un editor a riga di comando (qui usiamo `vi`, ma potete sostituirlo con il vostro editor preferito) +- È necessario avere accesso a root e, idealmente, essere registrati come utente root nel proprio terminale +- I repository EPEL di Fedora +- La possibilità di accedere come root o di eseguire comandi di root con `sudo`. Tutti i comandi qui riportati presuppongono un utente con diritti `sudo`. Tuttavia, i processi di configurazione e compilazione vengono eseguiti con `sudo -s`. +- Per ottenere l'ultima versione di Asterisk, è necessario utilizzare `curl` o `wget`. Questa guida utilizza `wget`, ma se preferite potete sostituire la stringa `curl` appropriata. ## Aggiornare Rocky Linux e installare `wget` -``` +```bash sudo dnf -y update ``` -In questo modo il server verrà aggiornato con tutti i pacchetti rilasciati o aggiornati dall'ultimo aggiornamento o installazione. Quindi eseguire: +In questo modo il server sarà aggiornato con tutti i pacchetti rilasciati o aggiornati dall'ultimo aggiornamento o installazione. Quindi eseguire: -``` +```bash sudo dnf install wget ``` -## Impostare l'Hostname +## Impostare il nome dell'host Impostate il vostro hostname sul dominio che userete per Asterisk. -``` +```bash sudo hostnamectl set-hostname asterisk.example.com ``` @@ -58,19 +58,19 @@ sudo hostnamectl set-hostname asterisk.example.com Per prima cosa, installare EPEL (Extra Packages for Enterprise Linux): -``` +```bash sudo dnf -y install epel-release ``` Quindi, attivare i PowerTools di Rocky Linux: -``` +```bash sudo dnf config-manager --set-enabled powertools ``` ## Installare gli strumenti di sviluppo -``` +```bash sudo dnf group -y install "Development Tools" sudo dnf -y install git wget ``` @@ -81,36 +81,36 @@ sudo dnf -y install git wget Prima di scaricare questo script, assicuratevi di avere la versione più recente. Per farlo, visitate il [link per il download di Asterisk qui](http://downloads.asterisk.org/pub/telephony/asterisk/) e cercate l'ultima versione di Asterisk. Quindi copiate la posizione del link. Al momento della stesura di questo documento, la build più recente era la seguente: -``` +```bash wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-20-current.tar.gz tar xvfz asterisk-20-current.tar.gz cd asterisk-20.0.0/ ``` -Prima di eseguire il comando `install_prereq` (e gli altri comandi), è necessario essere superutente o root. A questo punto è molto più facile entrare in _sudo_ in modo permanente per un po'. Usciremo da _sudo_ più avanti nel processo: +Prima di eseguire il comando `install_prereq` (e gli altri comandi), è necessario essere superutente o root. A questo punto è molto più facile entrare in `sudo` in modo permanente per un po'. Si uscirà da `sudo` più avanti nel processo: -``` +```bash sudo -s contrib/scripts/install_prereq install ``` Al termine dello script si dovrebbe vedere quanto segue: -``` +```text ############################################# ## install completed successfully ############################################# ``` -Ora che tutti i pacchetti necessari sono installati, il prossimo passo è configurare e costruire Asterisk: +Ora che avete tutti i pacchetti necessari, il prossimo passo è configurare e costruire Asterisk: -``` +```bash ./configure --libdir=/usr/lib64 --with-jansson-bundled=yes ``` -Supponendo che la configurazione venga eseguita senza problemi, si dovrebbe ottenere un grande emblema ASCII di Asterisk, seguito dal seguente messaggio su Rocky Linux: +Supponendo che la configurazione venga eseguita senza problemi, si otterrà un grande simbolo ASCII di Asterisk, seguito dal seguente messaggio su Rocky Linux: -``` +```bash configure: Package configured for: configure: OS type : linux-gnu configure: Host CPU : x86_64 @@ -120,9 +120,9 @@ configure: host-cpu:vendor:os: x86_64 : pc : linux-gnu : ### Set Asterisk menu options [For more options] -Questa è una delle fasi in cui l'amministratore deve fare i compiti a casa. Ci sono molte opzioni di menu che possono essere necessarie o meno. Eseguire il seguente comando: +Questa è una delle fasi in cui l'amministratore deve fare i compiti a casa. Esistono molte opzioni di menu che potrebbero non essere necessarie. Eseguire il seguente comando: -``` +```bash make menuselect ``` @@ -130,129 +130,129 @@ si aprirà una schermata di selezione del menu: ![menuselect screen](../images/asterisk_menuselect.png) -Esaminate attentamente queste opzioni e scegliete in base alle vostre esigenze. Come già detto, potrebbe essere necessario un ulteriore lavoro a casa. +Esaminate attentamente queste opzioni e scegliete in base alle vostre esigenze. Come già detto, questo richiederà un ulteriore lavoro a casa. -### Creare e Installare Asterisk +### Compilare ed installare Asterisk -Per costruire, vogliamo eseguire i seguenti comandi in successione: +Per compilare, eseguire i seguenti comandi in successione: -``` +```bash make make install ``` -L'installazione della documentazione non è obbligatoria, ma a meno che non siate esperti di server di comunicazione, è consigliabile installarla: +L'installazione della documentazione non è obbligatoria, ma a meno che non siate esperti di server di comunicazione, dovrete installarla: -``` +```bash make progdocs ``` -Quindi installare il PBX di base e configurare il sistema. Il PBX di base è proprio questo, molto semplice! Probabilmente sarà necessario apportare delle modifiche per far funzionare il PBX come si desidera. +Quindi, installare il PBX di base e configurarlo. Il PBX di base è proprio questo, molto semplice! Probabilmente sarà necessario apportare delle modifiche per far funzionare il PBX come si desidera. -``` +```bash make basic-pbx make config ``` ## Configurazione di Asterisk -### Creare un Utente e un Gruppo +### Creare un utente e un gruppo -Avrete bisogno di un utente specifico solo per asterisk. Tanto vale crearlo subito. +Avrete bisogno di un utente e di un gruppo specifici solo per Asterisk. Createli ora: -``` +```bash groupadd asterisk useradd -r -d /var/lib/asterisk -g asterisk asterisk chown -R asterisk.asterisk /etc/asterisk /var/{lib,log,spool}/asterisk /usr/lib64/asterisk restorecon -vr {/etc/asterisk,/var/lib/asterisk,/var/log/asterisk,/var/spool/asterisk} ``` -Ora che la maggior parte del lavoro è stata completata, si può uscire dal comando `sudo -s`. Questo richiederà che la maggior parte dei comandi rimanenti utilizzino nuovamente _sudo_: +Dal momento che la maggior parte del lavoro di compilazione è stato completato, si può uscire dal comando `sudo -s`. Questo richiederà che la maggior parte dei comandi rimanenti utilizzino nuovamente `sudo`: -``` +```bash exit ``` -### Impostare Utente e Gruppo Predefiniti +### Impostare l'utente e il gruppo predefiniti -``` +```bash sudo vi /etc/sysconfig/asterisk ``` Rimuovere i commenti nelle due righe sottostanti e salvare: -``` +```bash AST_USER="asterisk" AST_GROUP="asterisk" ``` -``` +```bash sudo vi /etc/asterisk/asterisk.conf ``` Rimuovere i commenti nelle due righe sottostanti e salvare: -``` +```bash runuser = asterisk ; The user to run as. rungroup = asterisk ; The group to run as. ``` -### Configurare il Servizio Asterisk +### Configurare il servizio Asterisk -``` +```bash sudo systemctl enable asterisk ``` -### Configurare il Firewall +### Configurare il firewall Questo esempio utilizza `firewalld` per il firewall, che è quello predefinito in Rocky Linux. L'obiettivo è quello di aprire le porte SIP al mondo e di aprire RTP (Realtime Transport Protocol) al mondo sulle porte 10000-20000, come raccomandato dalla documentazione di Asterisk. -Tenete presente che quasi certamente avrete bisogno di altre regole firewall per altri servizi forward-facing (HTTP/HTTPS) che probabilmente vorrete limitare ai vostri indirizzi IP. Ciò esula dallo scopo di questo documento: +Quasi certamente saranno necessarie altre regole del firewall per altri servizi forward-facing (HTTP/HTTPS), che probabilmente vorrete limitare ai vostri indirizzi IP. Ciò esula dallo scopo di questo documento: -``` +```bash sudo firewall-cmd --zone=public --add-service sip --permanent sudo firewall-cmd --zone=public --add-port=10000-20000/udp --permanent ``` -Poiché abbiamo reso permanenti i comandi di `firewalld`, dovremo riavviare il server. È possibile farlo con: +Poiché i comandi `firewalld` sono stati resi permanenti, è necessario riavviare il server. È possibile farlo con: -``` +```bash sudo shutdown -r now ``` ## Test -### La Console Asterisk +### La console Asterisk -Per verificare, colleghiamoci alla console di Asterisk: +Per verificare, collegarsi alla console Asterisk: -``` +```bash sudo asterisk -r ``` -Questo vi porterà al client a riga di comando di Asterisk. Questo prompt viene visualizzato dopo la visualizzazione delle informazioni di base di Asterisk: +Questo vi porterà al client a riga di comando di Asterisk. Dopo aver visualizzato le informazioni di base di Asterisk, viene visualizzato questo prompt: -``` +```bash asterisk*CLI> ``` Per modificare la verbosità della console, utilizzare la seguente procedura: -``` +```bash core set verbose 4 ``` -La console di Asterisk dovrebbe mostrare quanto segue: +Che mostrerà quanto segue nella console di Asterisk: ```bash Console verbose was OFF and is now 4. ``` -### Mostra Esempi di Autenticazione End-Point +### Mostra esempi di autenticazioni end-point Al prompt del client a riga di comando Asterisk, digitare: -``` +```bash pjsip show auth 1101 ``` @@ -260,6 +260,6 @@ Questo restituisce informazioni sul nome utente e sulla password che possono ess ## Conclusione -Le indicazioni di cui sopra vi permetteranno di essere operativi con il server, ma la configurazione finale, il collegamento dei dispositivi e l'ulteriore risoluzione dei problemi dipendono da voi. +Quanto sopra vi consentirà di essere operativi con il server, ma sarete voi a dover completare la configurazione, collegare i dispositivi e risolvere ulteriori problemi. -La gestione di un server di comunicazione Asterisk richiede molto tempo e impegno e richiede molte ricerche da parte di qualsiasi amministratore. Per ulteriori informazioni su come configurare e utilizzare Asterisk, consultate il [Wiki Asterisk qui](https://wiki.asterisk.org/wiki/display/AST/Getting+Started). +La gestione di un server di comunicazione Asterisk richiede tempo e impegno e richiede la ricerca da parte di un amministratore. Per ulteriori informazioni sulla configurazione e sull'uso di Asterisk, consultare il [Wiki Asterisk qui.](https://docs.asterisk.org/Configuration/) diff --git a/docs/guides/containers/podman_guide.it.md b/docs/guides/containers/podman_guide.it.md new file mode 100644 index 0000000000..2202d8215f --- /dev/null +++ b/docs/guides/containers/podman_guide.it.md @@ -0,0 +1,434 @@ +--- +title: Podman +author: Neel Chauhan, Antoine Le Morvan +contributors: Steven Spencer, Ganna Zhyrnova, Christian Steinert +date: 2024-03-07 +tags: + - docker + - podman +--- + +## Introduzione + +!!! note + +``` +Questo documento rappresenta il contenuto esteso del suo [documento di riferimento trovato qui](../../gemstones/containers/podman.md). Se si ha bisogno di una guida rapida, il documento di riferimento può essere sufficiente. +``` + +[Podman](https://podman.io/) (Pod Manager) è uno strumento di gestione di container e immagini compatibile con la [OCI](https://opencontainers.org/) (Open Container Initiative). + +Podman: + +- funziona senza un daemon (può eseguire i container come servizio `systemd`) +- permette di gestire i container come utente non privilegiato (non è necessario essere root) +- incluso, a differenza di docker, nei repository Rocky Linux + +Questo rende Podman non solo un runtime alternativo per container compatibile con docker, ma molto di più. + +## Installare Podman + +Utilizzare l'utilità `dnf` per installare Podman: + +```bash +dnf install podman +``` + +È possibile recuperare l'elenco dei sottocomandi Podman disponibili con il seguente comando: + +```bash +$ podman --help + +Manage pods, containers and images + +Usage: + podman [options] [command] + +Available Commands: + attach Attach to a running container + auto-update Auto update containers according to their auto-update policy +... +... +``` + +Ecco un elenco selezionato dei sottocomandi più comunemente utilizzati: + +| Sottocomando | Descrizione | +| ------------ | ---------------------------------------------------------------------------------------------------------------- | +| `build` | Crea un'immagine usando le istruzioni nei Containerfiles | +| `commit` | Crea una nuova immagine basata sul container modificato | +| `container` | Gestore dei container | +| `cp` | Copia file/cartelle tra un container e il filesystem locale. | +| `create` | Crea ma non avvia un container | +| `exec` | Esegue un processo in un container in esecuzione | +| `image` | Gestione immagini | +| `images` | Elenca le immagini nello storage locale | +| `info` | Visualizza le informazioni del sistema Podman | +| `init` | Inizializza uno o piu' container | +| `inspect` | Visualizza la configurazione dell'oggetto indicato con ID | +| `kill` | Termina uno o più container in esecuzione con un segnale specifico | +| `login` | Log in al registro di un container | +| `logs` | Recupera i registri di uno o più container | +| `network` | Gestione delle reti | +| `pause` | Mette in pausa tutti i processi in uno o più container. | +| `ps` | Elenca i container | +| `pull` | Pull una image da un registry | +| `push` | Push una image ad una destinazione specifica | +| `restart` | Riavvia uno o più container | +| `rm` | Cancella uno o più container | +| `rmi` | Rimuove una o più image dallo storage locale | +| `run` | Esegue un comando su un nuovo container | +| `start` | Avvia uno o più container | +| `stats` | Visualizza un stream in tempo reale delle statistiche sull'utilizzo delle risorse del container. | +| `stop` | Termina uno o più container | +| `system` | Gestione di Podman | +| `top` | Visualizza i processi in esecuzione di un container | +| `unpause` | Riavvia i processi in uno o più container | +| `volume` | Gestisce i volume | + +!!! note "Nota" + +``` +Podman può eseguire quasi tutti i comandi Docker grazie alla sua interfaccia CLI simile. +``` + +Se si deve usare un compose file, ricordarsi di installare il pacchetto `podman-compose`: + +```bash +dnf install podman-compose +``` + +## Aggiungere un container + +Eseguire una piattaforma cloud self-hosted [Nextcloud](https://nextcloud.com/) come esempio: + +```bash +podman run -d -p 8080:80 nextcloud +``` + +Verrà richiesto di selezionare il registro del container da cui scaricare. In questo esempio, si utilizzerà `docker.io/library/nextcloud:latest`. + +Una volta scaricata l'immagine di Nextcloud, questa verrà eseguita. + +Inserite **indirizzo_ip:8080** nel browser web (supponendo di aver aperto la porta in `firewalld`) e configurate Nextcloud: + +![Nextcloud in container](../../gemstones/images/podman_nextcloud.png) + +!!! tip "Suggerimento" + +``` +Per seguire l'output dei log dell'ultimo container creato, usare `podman logs -lf`. `-l` specifica di usare l'ultimo container creato, mentre `-f` specifica di seguire i log, man mano che vengono creati. Premere Ctrl+C per interrompere l'output dei log. +``` + +## Esecuzione dei container come servizi `systemd` + +### Utilizzo di `quadlet` + +Dalla versione Podman 4.4 con [Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) - viene fornito un generatore di systemd. Può essere usato per generare unit file per servizi systemd rootless e rootful. + +Collocare i file Quadlet per i servizi rootful in: + +- `/etc/containers/systemd/` +- `/usr/share/containers/systemd/` + +Posizionare i file rootless in uno qualsiasi dei seguenti percorsi: + +- `$XDG_CONFIG_HOME/containers/systemd/` o `~/.config/containers/systemd/` +- `/etc/containers/systemd/users/$(UID)` +- `/etc/containers/systemd/users/` + +Oltre ai singoli contenitori, sono supportati i file pod, immagine, rete, volume e kube. In particolare focalizzandosi sull'esempio di Nextcloud. Creare un nuovo file `~/.config/containers/systemd/nextcloud.container` con il seguente contenuto: + +```systemd +[Container] +Image=nextcloud +PublishPort=8080:80 +``` + +Sono disponibili [molte altre opzioni](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html#container-units-container). + +Per eseguire il generatore e far sapere a systemd che è stato eseguito un nuovo servizio: + +```bash +systemctl --user daemon-reload +``` + +Per avviare il servizio, eseguite: + +```bash +systemctl --user start nextcloud.service +``` + +!!! note "Nota" + +``` +Se si è creato un file in una delle directory per i servizi rootful, omettere il flag `--user`. +``` + +Per eseguire automaticamente il container all'avvio del sistema o al login dell'utente, si può aggiungere un'altra sezione al file `nextcloud.container`: + +```systemd +[Install] +WantedBy=default.target +``` + +Poiché i file di servizio generati sono considerati transitori, non possono essere abilitati da systemd. Per ovviare a questo problema, il generatore applica manualmente le installazioni durante la generazione. In questo modo si abilitano effettivamente anche i file dei servizi. + +Sono supportati altri tipi di file: pod, volume, network, image, and kube. [Pods](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html#pod-units-pod), per esempio, può essere usato per raggruppare i container - i servizi systemd generati e le loro dipendenze (creare il pod prima dei container) sono gestiti automaticamente da systemd. + +### Utilizzo di `podman generate systemd` + +Podman fornisce inoltre il sottocomando `generate systemd`. Usare questo sottocomando per generare i service file di `systemd`. + +!!! warning "Attenzione" + +``` +`generate systemd` è ora obsoleto e non riceverà ulteriori funzioni. Si raccomanda l'uso di Quadlet. +``` + +Ora lo si farà con Nextcloud. Eseguire: + +```bash +podman ps +``` + +Si otterrà un elenco di container in esecuzione: + +```bash +04f7553f431a docker.io/library/nextcloud:latest apache2-foregroun... 5 minutes ago Up 5 minutes 0.0.0.0:8080->80/tcp compassionate_meninsky +``` + +Come visto sopra, il nome di questo container è `compassionate_meninsky`. + +Per creare un servizio `systemd` per il container Nextcloud e abilitarlo al riavvio, eseguire quanto segue: + +```bash +podman generate systemd --name compassionate_meninsky > /usr/lib/systemd/system/nextcloud.service +systemctl enable nextcloud +``` + +Sostituire `compassionate_meninsky` con il nome assegnato al container. + +Quando il sistema si riavvia, Nextcloud si riavvia in Podman. + +## Containerfiles + +Un Containerfile è un file usato da Podman per creare immagini di container. I file container usano la stessa sintassi dei file Docker, quindi si possono costruire le immagini dei container con Podman come si farebbe con Docker. + +### Server web da un Containerfile + +Server web da un file container + +Creare una cartella dedicata alla image: + +```bash +mkdir myrocky && cd myrocky +``` + +Creare un file `index.html` che verrà eseguito nel nostro server web: + +```bash +echo "Welcome to Rocky" > index.html +``` + +Creare un file `Containerfile` con il seguente contenuto: + +```text +# Use the latest rockylinux image as a start +FROM rockylinux:9 + +# Make it uptodate +RUN dnf -y update +# Install and enable httpd +RUN dnf -y install httpd +RUN systemctl enable httpd +# Copy the local index.html file into our image +COPY index.html /var/www/html/ + +# Expose the port 80 to the outside +EXPOSE 80 + +# Start the services +CMD [ "/sbin/init" ] +``` + +Siamo pronti a costruire la nostra immagine chiamata `myrockywebserver`: + +```bash +$ podman build -t myrockywebserver . + +STEP 1/7: FROM rockylinux:9 +Resolved "rockylinux" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf) +Trying to pull docker.io/library/rockylinux:9... +Getting image source signatures +Copying blob 489e1be6ce56 skipped: already exists +Copying config b72d2d9150 done +Writing manifest to image destination +STEP 2/7: RUN dnf -y update +Rocky Linux 9 - BaseOS 406 kB/s | 2.2 MB 00:05 +Rocky Linux 9 - AppStream 9.9 MB/s | 7.4 MB 00:00 +Rocky Linux 9 - Extras 35 kB/s | 14 kB 00:00 +Dependencies resolved. +================================================================================ + Package Arch Version Repository Size +================================================================================ +Upgrading: + basesystem noarch 11-13.el9.0.1 baseos 6.4 k + binutils x86_64 2.35.2-42.el9_3.1 baseos 4.5 M +... +Complete! +--> 2e8b93d30f31 +STEP 3/7: RUN dnf -y install httpd +Last metadata expiration check: 0:00:34 ago on Wed Apr 3 07:29:56 2024. +Dependencies resolved. +================================================================================ + Package Arch Version Repository Size +================================================================================ +Installing: + httpd x86_64 2.4.57-5.el9 appstream 46 k +... +Complete! +--> 71db5cabef1e +STEP 4/7: RUN systemctl enable httpd +Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service. +--> 423d45a3cb2d +STEP 5/7: COPY index.html /var/www/html/ +--> dfaf9236ebae +STEP 6/7: EXPOSE 80 +--> 439bc5aee524 +STEP 7/7: CMD [ "/sbin/init" ] +COMMIT myrockywebserver +--> 7fcf202d3c8d +Successfully tagged localhost/myrockywebserver:latest +7fcf202d3c8d059837cc4e7bc083a526966874f978cd4ab18690efb0f893d583 +``` + +È possibile eseguire l'immagine di Podman e confermare l'avvio: + +```bash +$ podman run -d --name rockywebserver -p 8080:80 localhost/myrockywebserver +282c09eecf845c7d9390f6878f9340a802cc2e13d654da197d6c08111905f1bd + +$ podman ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +282c09eecf84 localhost/myrockywebserver:latest /sbin/init 16 seconds ago Up 16 seconds 0.0.0.0:8080->80/tcp rockywebserver +``` + +Si è eseguita l'immagine Podman in modalità demone (`-d`) e la si è chiamata `rockywebserver` (opzione `--nome`). + +Si è reindirizzata la porta 80 (protetta) alla porta 8080 con l'opzione `-p`. Vedere se la porta è in ascolto con: + +```bash +ss -tuna | grep "*:8080" +tcp LISTEN 0 4096 *:8080 *:* +``` + +Verificare che il file `index.html` sia accessibile: + +```bash +$ curl http://localhost:8080 +Welcome to Rocky +``` + +Congratulazioni! A questo punto è possibile arrestare e cancellare l'immagine in esecuzione, assegnando il nome fornito durante la creazione: + +```bash +podman stop rockywebserver && podman rm rockywebserver +``` + +!!! tip "Suggerimento" + +``` +Si può aggiungere l'opzione `--rm` per cancellare automaticamente il contenitore una volta che si ferma. +``` + +Se si rilancia il processo di compilazione, `podman` utilizzerà una cache a ogni passo della compilazione: + +```bash +$ podman build -t myrockywebserver . + +STEP 1/7: FROM rockylinux:9 +STEP 2/7: RUN dnf -y update +--> Using cache 2e8b93d30f3104d77827a888fdf1d6350d203af18e16ae528b9ca612b850f844 +--> 2e8b93d30f31 +STEP 3/7: RUN dnf -y install httpd +--> Using cache 71db5cabef1e033c0d7416bc341848fbf4dfcfa25cd43758a8b264ac0cfcf461 +--> 71db5cabef1e +STEP 4/7: RUN systemctl enable httpd +--> Using cache 423d45a3cb2d9f5ef0af474e4f16721f4c84c1b80aa486925a3ae2b563ba3968 +--> 423d45a3cb2d +STEP 5/7: COPY index.html /var/www/html/ +--> Using cache dfaf9236ebaecf835ecb9049c657723bd9ec37190679dd3532e7d75c0ca80331 +--> dfaf9236ebae +STEP 6/7: EXPOSE 80 +--> Using cache 439bc5aee524338a416ae5080afbbea258a3c5e5cd910b2485559b4a908f81a3 +--> 439bc5aee524 +STEP 7/7: CMD [ "/sbin/init" ] +--> Using cache 7fcf202d3c8d059837cc4e7bc083a526966874f978cd4ab18690efb0f893d583 +COMMIT myrockywebserver +--> 7fcf202d3c8d +Successfully tagged localhost/myrockywebserver:latest +7fcf202d3c8d059837cc4e7bc083a526966874f978cd4ab18690efb0f893d583 +``` + +È possibile cancellare la cache con il sottocomando `prune`: + +```bash +podman system prune -a -f +``` + +| Opzioni | Descrizione | +| ----------- | ------------------------------------------------------------------------------------ | +| `-a` | Rimuove tutti i dati inutilizzati, non solo quelli esterni a Podman. | +| `-f` | Forza senza nessuna richiesta di conferma | +| `--volumes` | Elimina i volume | + +## Pods + +I pod sono un modo per raggruppare i container I contenitori in un pod condividono alcune impostazioni, come i mount point l'allocazione delle risorse o le mappature delle porte. + +In Podman, si gestiscono i pod usando il sottocomando `podman pod`, simile a molti comandi di Podman, per controllare i contenitori: + +| Comando | Descrizione | +| --------- | --------------------------------------------------------------------------------------------------------------------------------- | +| clone | Crea una copia di un pod esistente. | +| create | Crea un nuovo pod. | +| exists | Controlla se un pod esiste nel storage locale. | +| `inspect` | Visualizza le informazioni che descrivono un pod. | +| kill | Termina il processo principale di ogni container in uno o più pods. | +| logs | Visualizza i registry per i pod con uno o più container. | +| pause | Mette in pausa uno o più pod. | +| prune | Rimuove tutti i pod terminati e i loro container. | +| ps | Stampa le informazioni sui pod. | +| restart | Riavvia uno o più pod. | +| rm | Rimuove uno o più pod e container terminati. | +| start | Avvia uno o più pods. | +| stats | Visualizza uno stream in tempo reale delle statistiche di utilizzo delle risorse per i continer in uno o più pod. | +| stop | Termina uno o più pod. | +| top | Visualizza i processi in esecuzione dei container in un pod. | +| unpause | Riavvia uno o più pods. | + +I container raggruppati in un pod possono accedere l'uno all'altro utilizzando localhost. È utile, ad esempio, quando si configura Nextcloud con un database dedicato come Postgres. Nextcloud può accedere al database, ma non è necessario che il database sia accessibile dall'esterno dei container. + +Per creare un pod contenente Nextcloud e un database dedicato, eseguire quanto segue: + +```bash +# Creare il pod con una mappatura delle porte +podman pod create --name nextcloud -p 8080:80 + +# Aggiungere un contenitore Nextcloud al pod - il mapping della porta non deve essere specificato di nuovo! +podman create --pod nextcloud --name nextcloud-app nextcloud + +# Aggiungere un database Postgres. Questo contenitore ha una variabile d'ambiente specifica per Postgres. +podman create --pod nextcloud --name nextcloud-db -e POSTGRES_HOST_AUTH_METHOD=trust postgres +``` + +Per eseguire il pod appena creato, eseguire: + +```bash +podman pod start nextcloud +``` + +Ora è possibile configurare Nextcloud utilizzando un database locale: + +![Nextcloud setting up a database](img/podman_nextcloud_db_setup.png) diff --git a/docs/guides/containers/rancher_and_kubernetes.it.md b/docs/guides/containers/rancher_and_kubernetes.it.md new file mode 100644 index 0000000000..d43e73c773 --- /dev/null +++ b/docs/guides/containers/rancher_and_kubernetes.it.md @@ -0,0 +1,146 @@ +--- +title: Lavorare con Rancher e Kubernetes +author: Antoine Le Morvan +contributors: Steven Spencer, Ganna Zhyrnova +update: 22-Feb-2024 +tested_with: 9.3 +tags: + - rancher + - kubernetes + - containers + - docker +--- + +# Lavorare con Rancher e Kubernetes + +**Kubernetes** (**K8s**) è un sistema di orchestrazione di container open-source per gestire la distribuzione e la gestione di applicazioni containerizzate. + +K8s si è fatto un nome sul mercato, quindi non c'è più bisogno di presentarlo. + +I fornitori di cloud hanno reso semplice l'implementazione di piattaforme Kubernetes gestite, ma che dire della creazione e della gestione di un cluster on-premise? + +Quanto è facile gestire più cluster, sia on-premise che multi-cloud? + +La risposta alle ultime due domande è No. La creazione di un cluster on-premise è difficile e la gestione di un cluster multi-cloud può essere un vero mal di testa. + +È qui che entra in gioco l'argomento di questa guida: **Rancher**! Rancher è anche un sistema open-source, che consente l'installazione e l'orchestrazione di diversi cluster multi-cloud o on-premise e fornisce caratteristiche interessanti come un catalogo di applicazioni e una pratica interfaccia web per la visualizzazione delle risorse. + +Rancher vi consentirà di distribuire cluster Kubernetes gestiti dai cloud provider, di importare cluster Kubernetes esistenti o di distribuire cluster K3s (in breve, è una versione più leggera di K8s) o cluster K8s. + +Questa guida vi aiuterà a scoprire Rancher, a installarlo e ad avviarlo, quindi a creare un cluster Kubernetes on-premise distribuito su server Rocky Linux. + +## Impiego di Rancher + +L'installazione di Rancher è abbastanza banale se avete installato Docker sul vostro server. + +È possibile trovare l'installazione di Docker [qui in gemme](https://docs.rockylinux.org/gemstones/containers/docker/). + +Per funzionare su una Rocky 9, Rancher richiede anche il caricamento di modules/run//run/ + +Un modo per assicurare il caricamento dei moduli necessari durante l'avvio del sistema è quello di creare un file \`/etc/modules-load.d/rancher.conf' con i seguenti contenuti: + +```text +ip_tables +ip_conntrack +iptable_filter +ipt_state +``` + +Il modo più semplice per applicare le modifiche è riavviare il server: `sudo reboot`. + +Una volta riavviato, è possibile assicurarsi del corretto caricamento dei moduli grazie al comando `lsmod | grep `. + +Ora abbiamo un sistema pronto a ricevere il contenitore Rancher: + +```bash +docker pull rancher/rancher:latest +docker run -d --name=rancher --privileged --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher:latest +``` + +!!! NOTE + +``` +Se siete curiosi, guardate i log del nuovo container. Si vedrà che è stato appena creato un cluster K3s (con un singolo nodo)! Questo è il modo in cui Rancher funziona nella sua versione standalone. + +![k3s local cluster](img/rancher_k3s_local_cluster.png) +``` + +Poiché Rancher è in ascolto sulla porta 443, aprire il firewall per consentire l'accesso dall'esterno: + +```bash +firewall-cmd --permanent --zone=public --add-service=https +firewall-cmd --zone=public --add-service=https +``` + +Se si accede all'interfaccia web di Rancher appena distribuita, un messaggio informa su come recuperare la password dell'amministratore nei registri del container. + +A tal fine, lanciare il seguente comando: + +```bash +docker logs rancher 2>&1 | grep "Bootstrap Password:" +``` + +Si è pronti a connettersi alla webUI di Rancher. + +![rancher](img/rancher_login.png) + +!!! NOTE + +``` +Questa soluzione non è assolutamente pronta per la produzione. Dovrete assicurarvi che il sistema sia altamente disponibile, ma è un buon inizio. Considerate la possibilità di distribuire Rancher su un cluster K8s esistente per ottenere un HA ottimale. +``` + +## Kubernetes su server Rocky Linux 9 + +Rancher offre la sua versione di Kubernetes basata su docker: RKE (Rancher Kubernetes Engine). + +Tutto ciò che serve sono diversi server Rocky Linux e il [motore Docker](https://docs.rockylinux.org/gemstones/containers/docker/) installato su di essi. + +Non dimenticate che uno dei requisiti di Kubernetes è avere un numero dispari di nodi master (1 o 3, per esempio). Per i nostri test, iniziamo con 3 nodi master e 2 nodi aggiuntivi con il solo ruolo di worker. + +Una volta installato Docker sui server, fermare `firewalld` ed eseguire `nftables` su ogni server: + +```bash +systemctl stop firewalld +systemctl disable firewalld +systemctl start nftables +systemctl enable nftables +``` + +Siamo pronti per la creazione del cluster. + +### Creazione del cluster + +Nell'area di gestione dei cluster, creare un nuovo cluster: + +![create cluster](img/rancher_cluster_create.png) + +Siete liberi di creare un cluster in un provider Kubernetes ospitato, di effettuare il provisioning di nuovi nodi e di creare un cluster utilizzando RKE2/K3s oppure, nel nostro caso, di utilizzare i nodi esistenti e di creare un cluster utilizzando RKE2/K3s. + +Scegliere l'ultima opzione. + +Inserire un nome e una descrizione del cluster. + +Prendetevi il tempo necessario per scoprire le varie opzioni disponibili prima di avviare la creazione del cluster. + +![cluster creation](img/rancher_create_custom_cluster.png) + +Una volta creato il cluster, andare alla scheda Registrazione per aggiungere i nostri server: + +![registring hosts](img/rancher_hosts_registration.png) + +Per prima cosa, selezionare i vari ruoli del nodo che si sta aggiungendo e copiare la riga di comando necessaria. Se il cluster utilizza un certificato autofirmato, selezionare la casella appropriata. + +Andare al nodo che si desidera aggiungere alla configurazione e incollare il comando copiato in precedenza. + +Dopo qualche minuto, il server verrà aggiunto al cluster e, se è il primo server e ha tutti i ruoli, il cluster sarà disponibile nell'interfaccia web. + +Una volta aggiunti i 5 server, si dovrebbe ottenere un risultato simile a questo: + +![clusters hosts](img/rancher_cluster_ready.png) + +## Conclusione + +Congratulazioni! Avete installato il vostro primo cluster Kubernetes in pochi minuti/ore, grazie alle funzionalità di Rancher. + +Se siete nuovi a Kubernetes, potete già essere orgogliosi di voi stessi: siete sulla strada giusta. Ora avete tutto ciò che vi serve per continuare a scoprire Kubernetes. diff --git a/docs/guides/contribute/localdocs/mkdocs_lsyncd.it.md b/docs/guides/contribute/localdocs/mkdocs_lsyncd.it.md index b68b8bc27c..4ea49f2815 100644 --- a/docs/guides/contribute/localdocs/mkdocs_lsyncd.it.md +++ b/docs/guides/contribute/localdocs/mkdocs_lsyncd.it.md @@ -11,7 +11,7 @@ tags: # Introduzione -!!! info "Informazione" +!!! info Le procedure qui descritte funzionano sia con Incus che con LXD. diff --git a/docs/guides/contribute/localdocs/rockydocs_webdev_v2.it.md b/docs/guides/contribute/localdocs/rockydocs_webdev_v2.it.md index fb722acccc..339386b114 100644 --- a/docs/guides/contribute/localdocs/rockydocs_webdev_v2.it.md +++ b/docs/guides/contribute/localdocs/rockydocs_webdev_v2.it.md @@ -44,7 +44,7 @@ sudo chmod 666 /var/run/docker.sock 1. Assicuratevi che i prerequisiti siano soddisfatti. -2. Passare dalla directory di lavoro corrente del sistema locale alla cartella in cui si intende effettuare le operazioni di scrittura. Nel resto di questa guida ci riferiremo a questa directory come `$ROCKYDOCS`. Per la nostra dimostrazione, `$ROCKYDOCS` punta a `$HOME/projects/rockydocs` sul nostro sistema demo. +2. Cambiare la directory di lavoro corrente sul sistema locale in una cartella in cui si intende scrivere. Nel resto di questa guida ci riferiremo a questa directory come `$ROCKYDOCS`. Per la nostra dimostrazione, `$ROCKYDOCS` punta a `$HOME/projects/rockydocs` sul nostro sistema demo. Creare `$ROCKYDOCS` se non esiste già e cambiare la directory di lavoro in quella `$ROCKYDOCS`: diff --git a/docs/guides/contribute/rockydocs_formatting.it.md b/docs/guides/contribute/rockydocs_formatting.it.md index 72ca8d86a1..26c1951e77 100644 --- a/docs/guides/contribute/rockydocs_formatting.it.md +++ b/docs/guides/contribute/rockydocs_formatting.it.md @@ -7,11 +7,11 @@ tags: - formatting --- -# Introduzione +## Introduzione Questa guida mette in evidenza le opzioni di formattazione più avanzate, tra cui ammonizioni, elenchi numerati, tabelle e altro ancora. -Un documento può contenere o meno uno di questi elementi. Se ritenete che il vostro documento possa beneficiare di una formattazione speciale, questa guida vi aiuterà. +Un documento può contenere o meno uno di questi elementi. Tuttavia, se ritenete che il vostro documento possa beneficiare di una formattazione speciale, questa guida dovrebbe aiutarvi. !!! note "Una nota sulle Intestazioni" @@ -34,18 +34,53 @@ Un documento può contenere o meno uno di questi elementi. Se ritenete che il vo La chiave è che si possono usare tutti i titoli dal 2 al 6, ma solo **UNO** di livello 1. Mentre il documento viene visualizzato correttamente con più di un'intestazione di livello 1, l'indice generato automaticamente per il documento, che appare sul lato destro, **NON** viene visualizzato correttamente (o talvolta per niente) con più di un'intestazione. Tienilo a mente quando scrivi i tuoi documenti. + + Un'altra nota importante sull'intestazione del livello 1: Se è in uso il meta `title:`, questo sarà l'intestazione predefinita del livello 1. Non è il caso di aggiungerne un altro. Un esempio è che il meta titolo di questo documento è: + + ``` + --- + title: Document Formatting + ``` + + + Il primo titolo aggiunto è quindi "Introduzione" al livello 2. + + ``` + ## Introduction + ``` !!! warning "Una nota sugli elementi HTML supportati" - Ci sono elementi HTML che sono tecnicamente supportati in markdown. Alcuni di questi sono descritti in questo documento, dove non esiste una sintassi markdown che li sostituisca. Questi tag HTML supportati dovrebbero essere usati raramente, perché i linters di markdown potrebbero segnalarli in un documento. Per esempio: + Ci sono elementi HTML che sono tecnicamente supportati in markdown. Alcune di queste sono descritte in questo documento e non esiste una sintassi markdown che le sostituisca. Questi tag HTML supportati dovrebbero essere usati raramente, poiché i linters markdown si lamenteranno della loro presenza in un documento. Per esempio: * Inline HTML [nome elemento] Se dovete usare un elemento HTML supportato, cercate di trovare un altro modo per scrivere il vostro documento che non utilizzi questi elementi. Se dovete usarli, è comunque consentito. +!!! info "Una nota sui link" + + I link non sono formattazioni speciali, ma metodi standard di riferimento ad altri documenti (link interni) o a pagine web esterne. Tuttavia, c'è un tipo particolare di link che non si deve usare quando si compongono documenti per Rocky Linux: si tratta di un'ancora, ovvero di un link a un punto dello stesso documento. + + Le ancore funzionano nella lingua di origine di Rocky Linux (inglese), ma non appena vengono tradotte dalla nostra interfaccia Crowdin, si interrompono in quelle lingue. Questo accade perché un'ancora accettabile in markdown, che non contiene elementi HTML, utilizza l'intestazione per creare il collegamento: + + ``` + ## A Header + + Some text + + A Link to [that header](#-a-header) + ``` + + + Questo link si trova passando il mouse sul permalink in un documento creato, ma è essenzialmente l'intestazione con il "#" più l'intestazione in minuscolo separata da un trattino (-). + + Quando il documento viene tradotto, però, l'intestazione viene tradotta, ma il link è al di fuori di ciò che Crowdin consente di tradurre, quindi rimane nel suo stato originale (inglese). + + Se vi trovate nella necessità di usare un ancoraggio, date un'occhiata al vostro documento e verificate se la riorganizzazione del contenuto renderà l'ancoraggio non necessario. Sappiate che se utilizzate un ancora in un documento appena composto, tale ancora si interromperà una volta effettuata la traduzione del documento. + ## Ammonimenti -Gli ammonimenti sono speciali "riquadri" visivi che consentono di richiamare l'attenzione su fatti importanti e di metterli in evidenza. Di seguito sono elencati i tipi di ammonimenti: +Gli ammonimenti sono speciali "scatole" visive che richiamano l'attenzione su fatti importanti e li evidenziano. I seguenti sono tipi di ammonimenti: | tipo | Descrizione | | ------------------ | -------------------------------------------------------------------------- | @@ -57,14 +92,14 @@ Gli ammonimenti sono speciali "riquadri" visivi che consentono di richiamare l'a | question "Domanda" | visualizza il testo in un riquadro verde chiaro | | warning | visualizza il testo in un riquadro arancione | | failure | visualizza il testo in un riquadro rosso chiaro | -| danger "Pericolo" | visualizza il testo in un riquadro rosso | +| danger | visualizza il testo in un riquadro rosso | | bug | visualizza il testo in un riquadro rosso | | example | visualizza il testo in un riquadro viola | | quote | visualizza il testo in una casella grigia | | custom ^1^ | visualizza sempre il testo in un riquadro blu | | custom ^2^ | visualizza il testo nel colore del riquadro della tipologia prescelta | -Gli ammonimenti sono illimitati, come si può notare in custom 1 sopra. È possibile aggiungere un titolo personalizzato a qualsiasi tipo di ammonimento per ottenere il colore del riquadro desiderato per un ammonimento specifico, come indicato nel precedente custom 2 personalizzato. +Gli ammonimenti sono illimitati, come si può notare in custom 1 sopra. Per ottenere il colore del riquadro desiderato per un ammonimento specifica, aggiungete un titolo personalizzato a qualsiasi tipo di ammonimento, come indicato nella precedente sezione 2. Un'ammonimento viene sempre inserito in questo modo: @@ -74,9 +109,9 @@ Un'ammonimento viene sempre inserito in questo modo: testo dell'ammonimento ``` -Il testo del corpo dell'ammonimento deve avere un rientro di quattro (4) spazi dal margine iniziale. È facile capire dove si trova, perché sarà sempre allineato sotto la prima lettera del tipo di ammonimento. La riga in più tra il titolo e il corpo non verrà visualizzata, ma il nostro motore di traduzione (Crowdin) ne ha bisogno per funzionare correttamente. +Il testo del corpo dell'ammonimento deve avere un rientro di quattro (4) spazi dal margine iniziale. È facile capire dove si trova, perché sarà sempre allineato sotto la prima lettera del tipo di ammonimento. La riga in più tra il titolo e il corpo non apparirà, ma il nostro motore di traduzione (Crowdin) ne ha bisogno per funzionare correttamente. -Qui ci sono esempi di ogni tipo di ammonimento e come appariranno nel vostro documento: +Ecco alcuni esempi di ogni tipo di ammonimento e il loro aspetto nel documento: !!! note @@ -114,7 +149,7 @@ Qui ci sono esempi di ogni tipo di ammonimento e come appariranno nel vostro doc testo -!!! custom "Titolo personalizzato" +!!! custom Un tipo custom^1^. Abbiamo usato " custom" come tipo di ammonimento. Di nuovo, questo risulterà sempre in blu. @@ -144,7 +179,7 @@ Che si presenta così nell'editor: ## Contenuto a schede all'interno di un documento -La formattazione dei contenuti a schede è simile a quella degli ammonimenti. Invece di tre punti esclamativi o tre punti interrogativi, inizia con tre segni uguali. Tutta la formattazione dell'ammonimento (4 spazi, ecc.) si applica a questo contenuto. Ad esempio, la documentazione potrebbe richiedere una procedura diversa per una diversa versione di Rocky Linux. Quando si usa il contenuto a schede per le versioni, la release più recente di Rocky Linux deve essere la prima. Al momento della stesura del presente documento, il codice è 9.0: +La formattazione dei contenuti a schede è simile a quella degli ammonimenti. Invece di tre punti esclamativi o interrogativi, inizia con tre segni uguale. Tutta la formattazione dell'ammonimento (4 spazi, ecc.) si applica a questo contenuto. Ad esempio, la documentazione potrebbe richiedere una procedura diversa per una diversa versione di Rocky Linux. Quando si usa il contenuto a schede per le versioni, la release più recente di Rocky Linux deve essere la prima. Al momento della stesura di questo documento, era 9.0: === "9.0" @@ -170,7 +205,7 @@ Ricordate che tutto ciò che rientra nella sezione deve continuare a utilizzare ## Liste numerate -Le liste numerate sembrano facili da creare e da usare e, una volta che ci si è abituati, lo sono davvero. Se si dispone di un unico elenco di elementi senza alcuna complessità, questo tipo di formato va bene: +Gli elenchi numerati sembrano facili da creare e da usare e, una volta che ci si è abituati, lo sono. Se si dispone di un unico elenco di elementi senza alcuna complessità, questo tipo di formato va bene: ```text 1. Elemento 1 @@ -186,9 +221,9 @@ Le liste numerate sembrano facili da creare e da usare e, una volta che ci si è 3. Elemento 3 -Se è necessario aggiungere blocchi di codice, righe multiple o addirittura paragrafi di testo a un elenco numerato, il testo deve avere la stessa indentazione di quattro (4) spazi utilizzata per gli ammonimenti. +Se è necessario aggiungere blocchi di codice, righe multiple o addirittura paragrafi di testo a un elenco numerato, il testo deve avere la stessa indentazione di quattro (4) spazi utilizzata negli ammonimenti. -Tuttavia, non è possibile allinearli con gli occhi sotto l'elemento numerato perché questo ha uno spazio in meno. Se si utilizza un buon editor di markdown, è possibile impostare il valore di tabulazione a quattro (4), il che renderà la formattazione un po' più semplice. +Tuttavia, non è possibile allinearli con gli occhi sotto l'elemento numerato perché questo ha uno spazio in meno. Se si utilizza un buon editor di markdown, è possibile impostare il valore di tabulazione a quattro (4), rendendo più semplice la formattazione. Ecco un esempio di elenco numerato a più righe, con un blocco di codice aggiunto per buona norma: @@ -215,25 +250,25 @@ Ecco come appare il testo raw: ## Tabelle -Nel caso precedente, le tabelle aiutano a disporre le opzioni di comando o i tipi di ammonimento e le relative descrizioni. Ecco com'è stata inserita la tabella nella sezione delle Ammonizioni: +Nel caso precedente, le tabelle aiutano a disporre le opzioni di comando o i tipi di ammonimento e le relative descrizioni. Questo mostra la voce della tabella nella sezione Ammonimenti: ```text -| tipo | Descrizione | -|-----------|-----------------------------------------------------------| -| note | mostra il testo in una casella blu | -| abstract | mostra il testo in una casella azzurra | -| info | mostra il testo in una casella verde-azzurra | -| tip | mostra il testo in una casella verde-azzurra (icona lievemente più verde) | -| success | mostra il testo in una casella verde | -| question | mostra il testo in una casella verde chiara | -| warning | mostra il testo in una casella arancione | -| failure | mostra il testo in una casella rossa chiara | -| danger | mostra il testo in una casella rossa | -| bug | mostra il testo in una casella rossa | -| example | mostra il testo in una casella viola | -| quote | mostra il testo in una casella grigia | -| custom 1 | mostra sempre il testo in una casella blu | -| custom 2 | mostra il testo in una casella del colore scelto | +| tipo | Descrizione | +|-----------|------------------------------------------------------------| +| note | visualizza il testo in un riquadro blu | +| abstract | visualizza il testo in un riquadro azzurro | +| info | visualizza il testo in un riquadro blu-verde | +| tip | visualizza il testo in un riquadro blu-verde (icona leggermente più verde) | +| success | visualizza il testo in un riquadro verde | +| question | visualizza il testo in un riquadro verde chiaro | +| warning | visualizza il testo in un riquadro arancione | +| failure | visualizza il testo in un riquadro rosso chiaro | +| danger | visualizza il testo in un riquadro rosso | +| bug | visualizza il testo in un riquadro rosso | +| example | visualizza il testo in un riquadro viola | +| quote | visualizza il testo in un riquadro grigio | +| custom^1^ | visualizza sempre il testo in un riquadro blu | +| custom^2^ | visualizza il testo in un riquadro con il colore del tipo scelto | ``` @@ -241,37 +276,43 @@ Si noti che non è necessario che ogni colonna sia suddivisa per dimensione (com ## Virgolettato -Le virgolette sono in realtà pensate per citare il testo di altre fonti da includere nella documentazione, ma non è obbligatorio usarle in questo modo. Alcuni collaboratori usano le virgolette invece delle tabelle, ad esempio per elencare alcune opzioni. Esempi di virgolette in markdown sono: +Le virgolette servono per citare il testo di altre fonti da includere nella documentazione. Esempi di virgolette in markdown sono: ```text -> **un elemento** - Una descrizione di quell'elemento +> **un elemento** - Una descrizione dell'elemento + +seguita da: -> **altro elemento** - Un'altra descrizione di quell'elemento +> **un altro elemento** - Un'altra descrizione dell'elemento ``` -La linea di "spaziatura" aggiuntiva è necessaria per evitare che le linee si sovrappongano. +Se si mettono insieme due citazioni, è necessario separarle con altre parole per evitare di generare un errore di markdown (come fatto sopra). L'aspetto finale è questo quando la pagina viene visualizzata: -> **un elemento** - Una descrizione dell'elemento **un altro elemento** - Altra descrizione di un elemento +> **un elemento** - Una descrizione dell'elemento + +seguito da: + +> **un altro elemento** - Un'altra descrizione di quell'elemento ## Blocchi di codice in linea e a livello di blocco -Our approach to the use of code blocks is pretty simple. Se `il vostro codice` è abbastanza breve da poterlo (e volerlo) usare in una riga come quella che avete appena visto, usate dei singoli backtick ++"`"++: +Il nostro approccio all'uso dei blocchi di codice è piuttosto semplice. Se `il codice` è abbastanza breve da poterlo (e volerlo) utilizzare in una frase come quella appena vista, utilizzare i singoli backtick ++"`"++: ```bash -Una frase che contiene un "comando scelto da voi". +Una frase che contiene un `comando a scelta`. ``` -Qualsiasi comando che non sia usato all'interno di un paragrafo di testo (specialmente i pezzi di codice lunghi con più righe) dovrebbe essere un blocco di codice completo, definito con tripli backtick ++"```"++: +Tutti i comandi che non vengono utilizzati all'interno di un paragrafo di testo (soprattutto quelli lunghi con più righe) devono essere un blocco di codice completo, definito con tripli backtick ++"```"++: ````markdown ```bash sudo dnf install the-kitchen-sink ``` ```` -La parte `bash` di questa formattazione è un identificatore di codice raccomandato da markdown, ma può essere utile per l'evidenziazione della sintassi. Se mostrate testo, Python, PHP, Ruby, HTML, CSS o qualsiasi altro tipo di codice, il "bash" verrà modificato con il linguaggio utilizzato. -Per inciso, se è necessario mostrare un blocco di codice all'interno di un blocco di codice, basta aggiungere un altro backtick ++"`"++ al blocco genitore: +La parte `bash` di questa formattazione è un identificatore di codice raccomandato da markdown, ma può essere utile per l'evidenziazione della sintassi. Se mostrate testo, Python, PHP, Ruby, HTML, CSS o qualsiasi altro codice, "bash" cambierà in qualsiasi linguaggio utilizzato. +Per inciso, se è necessario mostrare un blocco di codice all'interno di un blocco di codice, aggiungere un altro backtick ++"`"++ al blocco padre: `````markdown ````markdown @@ -281,15 +322,15 @@ sudo dnf install the-kitchen-sink ```` ````` -E sì, il blocco di codice che avete appena visto ha usato cinque backtick all'inizio e alla fine per renderlo correttamente. +Sì, il blocco di codice appena visto ha usato cinque backtick all'inizio e alla fine per renderlo corretto. ### Soppressione del prompt visualizzato e dell'avanzamento automatico di riga -In alcuni casi, durante la stesura della documentazione, si desidera mostrare un prompt nel comando, ma non si vuole che l'utente copi tale prompt quando utilizza l'opzione di copia. Un'applicazione di questo tipo potrebbe essere la scrittura di laboratori in cui si vuole mostrare la posizione con il prompt, come in questo esempio: +Può capitare, durante la stesura della documentazione, di voler mostrare un prompt nel comando, ma di non volere che l'utente copi il prompt quando usa l'opzione di copia. Un'applicazione di questo tipo potrebbe essere quella dei laboratori di scrittura in cui si vuole mostrare la posizione con la richiesta, come in questo esempio: ![copy_option](copy_option.png) -Se la formattazione è normale, l'opzione di copia copierà il prompt e il comando, mentre è preferibile copiare solo il comando. Per ovviare a questo problema, si può usare la seguente sintassi per indicare all'opzione copy ciò che si vuole copiare: +Se la formattazione è normale, l'opzione di copia copierà il prompt e il comando, mentre è preferibile copiare solo il comando. Per ovviare a questo problema, si può usare la seguente sintassi per indicare all'opzione di copia ciò che si vuole copiare: ````text ``` { .sh data-copy="cd /usr/local" } @@ -298,51 +339,58 @@ Se la formattazione è normale, l'opzione di copia copierà il prompt e il coman ```` Quando si utilizza questo metodo, anche l'avanzamento automatico delle righe viene soppresso. ## Tastiera -Un altro modo per aggiungere più chiarezza possibile ai documenti è quello di rappresentare la digitazione dei tasti su una tastiera nel modo corretto. Per farlo, utilizzate `key`. Per esempio, per rappresentare la necessità di premere il tasto escape nel documento, si userebbe `++escape++`. Quando è necessario indicare la pressione di più tasti, aggiungete un `+` tra di essi, in questo modo: `++ctrl+f4++`. Per i tasti non definiti (ad esempio, stiamo indicando un tasto funzione misterioso, `Fx`) mettete la definizione tra virgolette (`++ctrl+"Fx"++`). Se si richiede la pressione simultanea dei tasti, aggiungere "simultaneamente" o "allo stesso tempo" o una frase simile alle istruzioni. Ecco un esempio di istruzione da tastiera nell'editor: +Un altro modo per aggiungere più chiarezza possibile ai documenti è quello di rappresentare il modo corretto di digitare i tasti su una tastiera. In markdown, questo avviene circondando il tasto o i tasti con doppi segni più (`++`). Eseguire questa operazione con `++tasto++`. Per esempio, per rappresentare la necessità di premere il tasto escape nel documento, si usa `++escape++`. Quando è necessario indicare la pressione di più tasti, aggiungete un `+` tra di essi, in questo modo: `++ctrl+f4++`. Per i tasti che non sono definiti (ad esempio, stiamo indicando un tasto funzione misterioso, `Fx`), mettete la definizione tra virgolette`(++ctrl+"Fx"++`). Per i tasti non definiti (ad esempio, stiamo indicando un tasto funzione misterioso, `Fx`) mettete la definizione tra virgolette (`++ctrl+"Fx"++`). Se si richiede la pressione simultanea dei tasti, aggiungere "simultaneamente" o "allo stesso tempo" o una frase simile alle istruzioni. ```text -Un'installazione di tipo workstation (con interfaccia grafica) avvia questa interfaccia sul terminale 1. Essendo Linux multiutente, è possibile connettere più utenti più volte, su diversi **terminali fisici** (TTY) o **terminali virtuali** (PTS). I terminali virtuali sono disponibili in un ambiente grafico. Un utente passa da un terminale fisico a un altro usando ++alt+"Fx"++ o dalla riga di comando utilizzando ++ctrl+alt+"Fx"++. +Un'installazione di tipo workstation (con un'interfaccia grafica) avvia questa interfaccia sul terminale 1. Essendo Linux multiutente, è possibile connettere più utenti più volte, su diversi **terminali fisici** (TTY) o **terminali virtuali** (PTS). I terminali virtuali sono disponibili in un ambiente grafico. L'utente passa da un terminale fisico a un altro utilizzando ++alt+"Fx"++ dalla riga di comando o ++ctrl+alt+"Fx"++. ``` Ecco come viene visualizzato: -Un'installazione di tipo workstation (con interfaccia grafica) avvia questa interfaccia sul terminale 1. Essendo Linux multiutente, è possibile connettere più utenti più volte, su diversi **terminali fisici** (TTY) o **terminali virtuali** (PTS). I terminali virtuali sono disponibili in un ambiente grafico. Un utente passa da un terminale fisico a un altro usando ++alt+"Fx"++ o dalla riga di comando utilizzando ++ctrl+alt+"Fx"++. +Un'installazione di tipo workstation (con un'interfaccia grafica) avvia questa interfaccia sul terminale 1. Essendo Linux multiutente, è possibile collegare più utenti più volte, su **terminali fisici** (TTY) o **virtuali** (PTS) diversi. I terminali virtuali sono disponibili in un ambiente grafico. L'utente passa da un terminale fisico a un altro utilizzando ++alt+"Fx"++ dalla riga di comando o ++ctrl+alt+"Fx"++. -Un elenco dei comandi da tastiera accettati si trova [in questo documento](https://facelessuser.github.io/pymdown-extensions/extensions/keys/#key-map-index). +Elenco dei comandi da tastiera accettati [in questo documento](https://facelessuser.github.io/pymdown-extensions/extensions/keys/#key-map-index). -!!! note "Nota" +!!! note Queste scorciatoie da tastiera sono sempre inserite in minuscolo, tranne quando è utilizzato un comando da tastiera personalizzato, tra virgolette. +## Forzare le interruzioni di riga + +Ci sono volte in cui un semplice ++enter++ sulla tastiera non permette di creare una nuova riga in markdown. Ciò si verifica talvolta quando gli elementi puntati utilizzano molti caratteri di formattazione. È possibile aggiungere un'interruzione di riga per formattare meglio il testo. In casi come questi, è necessario aggiungere due spazi alla fine della riga in cui si vuole creare una nuova riga. Poiché gli spazi non sono visibili in alcuni editor di markdown, questo esempio mostra l'inserimento degli spazi: + +* **Un elemento puntato con formattazione extra** ++spazio+spazio++ +* **Un altro elemento** + ## Superscript, subscript e simboli speciali La notazione in apice e in pedice è supportata nella documentazione di Rocky Linux dall'uso di `^` per l'apice e `~` per il pedice. Il superscript pone il testo inserito tra i tag leggermente al di sopra del testo normale, mentre il subscript lo pone leggermente al di sotto. Superscript è di gran lunga il più usato tra questi due nella scrittura. Alcuni caratteri speciali appaiono già in apice senza l'aggiunta dei tag, ma è possibile combinare i tag per cambiare l'orientamento di tali caratteri, come si vede con il simbolo del copyright qui sotto. È possibile utilizzare il superscript per: * rappresentano numeri ordinali, come 1st, 2nd, 3rd -* simboli di copyright e marchi, come ©, TM, o ™, ® -* come notazione per riferimenti, come questo1, questo2 e questo3 +* simboli di copyright e di marchio, come ^©^, ^TM^, or ^™^, ^®&^ +* come notazione per i riferimenti, come questo^1^, questo^2^ e questo^3^ Alcuni caratteri speciali, come ©, non sono normalmente apicali, mentre altri, come ™, lo sono. Ecco come appare tutto questo nel codice markdown: ```text -* rappresentano i numeri ordinali, come 1°, 2°, 3° -* simboli di copyright e marchi, come ©, TM o ™, ® -* come notazione per i riferimenti, come questo 1, questo 2 e questo 3 +* rappresentano numeri ordinali, come 1^st^, 2^nd^, 3^rd^ +* simboli di copyright e di marchio, come ^©^, ^TM^ or ^™^, ^®^ +* come notazione per i riferimenti, come this^1^, this^2^ and this^3^ -Alcuni caratteri speciali, come © non sono normalmente apicali, mentre altri come ™, lo sono. +Alcuni caratteri speciali, come ©, non sono normalmente apici, mentre altri, come ™, lo sono. ``` -Per forzare l'apice si circonda ciò che si vuole che venga apostrofato con `^`. +Per forzare l'apice, si circonda l'apice con `^`. -Si inserisce il pedice circondando il testo con il tag `~` (H~2~0 è `H~2~0`) e, come già detto, non è molto usato nella scrittura. +Per inserire un pedice basta circondare il testo con il tag `~` (H~2~0 è `H~2~0`) e, come già detto, non è molto usato nella scrittura. ### Superscript per i riferimenti -Alcuni di voi potrebbero avere la necessità di fare riferimento a fonti esterne quando scrivono la documentazione. Se si dispone di una sola fonte, è possibile includerla nella conclusione come un singolo link, ma se si dispone di più fonti^1^, si può usare l'apice per annotarle nel testo^2^ e poi elencarle alla fine del documento. Si noti che il posizionamento dei riferimenti deve avvenire dopo la sezione "Conclusioni". +Alcuni di voi potrebbero aver bisogno di fare riferimento a fonti esterne quando scrivono la documentazione. Se si dispone di una sola fonte, è possibile includerla nella conclusione come un singolo link, ma se si dispone di più fonti^1^, si può usare l'apice per annotarle nel testo^2^ e poi elencarle alla fine del documento. Si noti che il posizionamento dei riferimenti deve avvenire dopo la sezione "Conclusioni". -Dopo la conclusione, è possibile inserire le notazioni in un elenco numerato che corrisponde all'apice, oppure come link. Entrambi gli esempi sono illustrati qui: +Dopo la conclusione, è possibile inserire le notazioni in un elenco numerato in corrispondenza dell'apice o come link. Si mostrano entrambi gli esempi: 1. "Come si usano i multipli nel testo" di Wordy W. McWords [https://site1.com](https://site1.com) 2. "Usare l'apice nel testo" di Sam B. Supersecret [https://site2.com](https://site2.com) @@ -350,9 +398,9 @@ Dopo la conclusione, è possibile inserire le notazioni in un elenco numerato ch o [1](https://site1.com) "Come si usano i multipli nel testo" di Wordy W. McWords -[2](https://site2.com) "Usare l'apice nel testo" by Sam B. Supersecret +[2](https://site2.com) "Utilizzo dell'apice nel testo" di Sam B. Supersecret -Ecco come si presenta il tutto nel vostro editor: +Ecco come si presenta il tutto nell'editor: ```text 1. "Come si usano i multipli nel testo" di Wordy W. McWords [https://site1.com](https://site1.com) @@ -365,21 +413,21 @@ o ``` -## Evidenziare testi +## Evidenziare il testo -Un altro modo possibile per migliorare la documentazione è l'==evidenziazione==. L'evidenziazione viene gestita circondando il testo con `==`. +Un altro modo possibile per migliorare la documentazione è l'==evidenziazione==. È possibile utilizzare l'evidenziazione circondando il testo con `==`. L'aspetto è questo nell'editor: ```bash -Un altro modo possibile per migliorare la documentazione è l'==evidenziazione==. L'evidenziazione viene gestita circondando il testo con `==`. +Un altro modo possibile per migliorare la documentazione è l'==evidenziazione==. È possibile utilizzare l'evidenziazione circondando il testo con `==`. ``` ## Raggruppare diversi tipi di formattazione -La documentazione Rocky offre alcune eleganti opzioni di formattazione quando si combinano più elementi all'interno di un altro elemento. Per esempio, un ammonimento con un elenco numerato: +La documentazione Rocky offre alcune eleganti opzioni di formattazione quando si combinano più elementi all'interno di un altro elemento. Ad esempio, un'ammonizione con un elenco numerato: -!!! note "Nota" +!!! note Le cose possono diventare un po' strane quando si raggruppano gli oggetti. Come quando: @@ -405,11 +453,11 @@ Oppure si può avere un elenco numerato, con un'ulteriore ammonimento: E ha un ammonimento nel mezzo: - !!! warning "Attenzione" + !!! warning Le cose possono diventare un po' strane con più elementi all'interno di diversi tipi di formattazione! -Se si rispettano i magici quattro (4) spazi per rientrare e separare questi elementi, essi verranno visualizzati in modo logico ed esattamente come si desidera. A volte questo è davvero importante. +Se si tiene conto dei magici quattro (4) spazi per rientrare e separare questi elementi, essi verranno visualizzati in modo logico ed esattamente come si desidera. A volte questo è davvero importante. È anche possibile incorporare una tabella o una citazione a blocchi (letteralmente qualsiasi tipo di elemento di formattazione) all'interno di un'altra. Qui ci sono un elenco numerato, un ammonimento, una tabella e alcuni elementi di blocco di citazione, tutti raggruppati insieme: @@ -440,7 +488,7 @@ Ecco come appare questo esempio nell'editor: Se si rispettano i magici quattro (4) spazi per separare questi elementi, essi verranno visualizzati in modo logico ed esattamente come si desiderano. A volte è davvero importante. -È anche possibile incorporare una tabella o una citazione a blocchi (letteralmente qualsiasi tipo di elemento di formattazione) all'interno di un'altra. Qui ci sono un elenco numerato, un'ammonimento, una tabella e alcuni elementi di citazione a blocchi, tutti raggruppati insieme: +È anche possibile incorporare una tabella o una citazione a blocchi (letteralmente qualsiasi tipo di elemento di formattazione) all'interno di un'altra. Qui abbiamo un elenco numerato, un'ammonimento, una tabella e alcuni elementi di citazione a blocchi, tutti raggruppati insieme: 1. Cercare di tenere il passo con tutto ciò che accade nel documento può essere un vero compito quando si lavora con più elementi. @@ -464,11 +512,59 @@ Se si rispettano i magici quattro (4) spazi per separare questi elementi, essi v 3. Esistono molti esempi, ma quello sopra illustra come sia possibile annidare tutto all'interno. Basta ricordare i quattro (4) spazi magici. ``` +## Caratteri non visualizzati + +Ci sono alcuni caratteri nel markdown che non vengono visualizzati correttamente. A volte è perché questi caratteri sono HTML o altri tipi di tag (ad esempio i link). In alcuni casi, durante la stesura della documentazione, potrebbe essere necessario visualizzare questi caratteri per far capire il proprio punto di vista. La regola per visualizzare questi caratteri è l'escape. Ecco una tabella di questi caratteri non visualizzabili seguita da un blocco di codice che mostra il codice della tabella. + +| simbolo | description | +| ------- | ------------------------------------------------------------------- | +| \\ | backslash (usato per l'escape) | +| \` | backtick (usato per i blocchi di codice) | +| \* | asterisco (usato per i pallini) | +| \_ | trattino basso | +| \{ \} | parentesi graffe | +| \[ \] | parentesi quadre (utilizzate per creare i link dei titoli) | +| < > | parentesi angolari (usate per l'HTML diretto) | +| \( \) | parentesi (utilizzate per il contenuto del link) | +| \# | segno di cancelletto (usato per le intestazioni markdown) | +| | | pipe (usato nelle tabelle) | +| + | segno più (usato nelle tabelle) | +| - | segno meno o trattino (usato nelle tabelle e negli elenchi puntati) | +| ! | esclamativo (usato in avvisi e tabelle) | + +La tabella in codice è: + +```table +| symbol | description | +|-------------|---------------------------------------------------| +| \\ | backslash (used for escaping) | +| \` | backtick (used for code blocks) | +| \* | asterisk (used for bullets) | +| \_ | underscore | +| \{ \} | curly braces | +| \[ \] | brackets (used for link titles) | +| < > | angle brackets (used for direct HTML) | +| \( \) | parentheses (used for link content) | +| \# | pound sign (used for markdown headers) | +| | | pipe (used in tables) | +| + | plus sign (used in tables) | +| - | minus sign or hyphen (used in tables and bullets) | +| ! | exclamation (used in admonitions and tables) | +``` + +L'ultimo codice mostra che alcuni caratteri richiedono il loro codice HTML se utilizzati in una tabella. + +Nel testo vero e proprio, il carattere di escape viene utilizzato. Ad esempio, `\|` mostrerà il simbolo del pipe, `>` mostrerà il simbolo della parentesi angolari, `\+` mostrerà il segno più, `\-` mostrerà il segno meno e `\!` mostrerà il punto esclamativo. + +Si può notare che se eliminiamo i backtick in questa frase: + +Nel testo vero e proprio, il carattere di escape viene utilizzato. Ad esempio, \| mostrerà il simbolo del pipe, \062; mostrerà il simbolo della parentesi angolare, \+ mostrerà il segno più, \- mostrerà il segno meno e \! mostrerà il punto esclamativo. + ## Un ultimo punto - i commenti -Occasionalmente, si potrebbe voler aggiungere un commento al markdown che non verrà visualizzato quando sarà elaborato. Le ragioni sono molteplici. Ad esempio, se si vuole aggiungere un segnaposto per qualcosa che verrà aggiunto in seguito, si può usare un commento per contrassegnare il punto. +Di tanto in tanto, si potrebbe voler aggiungere un commento al markdown che non verrà visualizzato quando sarà reso. Le ragioni sono molteplici. Se si vuole aggiungere un etichetta per qualcosa che si aggiungerà in seguito, si può usare un commento per contrassegnare il punto. -Il modo migliore per aggiungere un commento al markdown è usare le parentesi quadre "[]" che circondano due slashes "//" seguite da due punti e dal contenuto. Il risultato sarebbe il seguente: +Il modo migliore per aggiungere un commento al markdown è usare le parentesi quadre "[]" attorno a due barre in avanti "//" seguite da due punti e dal contenuto. Il risultato sarebbe il seguente: ```text @@ -492,6 +588,6 @@ Un commento deve avere una riga vuota prima e dopo il commento. La formattazione del documento con titoli, ammonimenti, tabelle, elenchi numerati e virgolette può aggiungere chiarezza al documento. Quando si utilizzano gli ammonimenti, fare attenzione a scegliere il tipo corretto. In questo modo è più facile capire visivamente l'importanza di una particolare ammonimento. -Non è *necessario* utilizzare le opzioni di formattazione avanzate. L'uso eccessivo di elementi speciali può aggiungere disordine dove non ce n'è bisogno. Imparare a usare questi elementi di formattazione in modo prudente e corretto può essere molto utile per far capire il proprio punto di vista in un documento. +Non è *necessario* utilizzare opzioni di formattazione avanzate. L'uso eccessivo di elementi speciali può aggiungere disordine. Imparare a usare questi elementi di formattazione in modo prudente e corretto può essere molto utile per far capire il proprio punto di vista in un documento. Infine, per facilitare la formattazione, si consiglia di modificare il valore TAB dell'editor markdown in quattro (4) spazi. diff --git a/docs/guides/contribute/style_guide.it.md b/docs/guides/contribute/style_guide.it.md index 3b2161eb0d..04c91a1107 100644 --- a/docs/guides/contribute/style_guide.it.md +++ b/docs/guides/contribute/style_guide.it.md @@ -9,7 +9,7 @@ tags: # Guida allo stile della documentazione Rocky Linux -*Rocky Linux è il Linux aziendale che sta crescendo più rapidamente al mondo e la sua documentazione sta crescendo in modo esponenziale grazie a collaboratori come voi. I vostri contenuti sono ben accetti in qualsiasi formato e i document stylist di RL vi aiuteranno ad allinearli agli standard qui indicati.* +*Rocky Linux (RL) è il Linux aziendale in più rapida crescita al mondo, e anche la sua documentazione sta crescendo esponenzialmente grazie a collaboratori come voi. I vostri contenuti sono ben accetti in qualsiasi formato e i document stylist di RL vi aiuteranno ad allinearli agli standard qui indicati.* ## Introduzione @@ -17,7 +17,7 @@ tags: *Nuovi contributi sono benvenuti per far diventare questo sito il punto di riferimento definitivo sul web per le informazioni sull'uso di Rocky Linux. Potete creare documenti nel formato che ritenete più opportuno e il team di documentazione lavorerà con voi o vi aiuterà a formattarli in modo che sembrino parte della famiglia Rocky.* -Questa guida delinea gli standard di stile in lingua inglese per **migliorare la leggibilità, evidenziare casi particolari** e **migliorare il lavoro di traduzione** della documentazione Rocky Linux. Per le domande sullo stile non trattate in questa guida, si prega di fare riferimento a quanto segue: +Questa guida delinea gli standard di stile in lingua inglese per **migliorare la leggibilità, evidenziare casi particolari** e **migliorare il lavoro di traduzione** della documentazione Rocky Linux. Per le questioni di stile non trattate in questa guida, si veda quanto segue: - [Dizionario Merriam Webster](https://www.merriam-webster.com/) - [Chicago Manual of Style (CMOS), 17a ed.](https://www.chicagomanualofstyle.org/home.html) @@ -32,7 +32,7 @@ Per una comprensione più completa della contribuzione, consultare le nostre gui ## Linee guida di stile -*La documentazione di RL si propone di utilizzare un linguaggio chiaro e coerente, sia per garantire l'accessibilità che per aiutare gli sforzi di traduzione in corso.* +*La documentazione di RL mira a utilizzare un linguaggio chiaro e coerente, per garantire l'accessibilità e per aiutare gli sforzi di traduzione in corso.* ### Grammatica e Punteggiatura @@ -40,29 +40,40 @@ Le **caratteristiche della scrittura tecnica** descritte nel Chicago Manual of S - Virgolette doppie ("stile Chicago") anziché singole (‘Oxford style’). - I punti e le virgole vanno dentro le virgolette "così," anziché "così". -- Il trattino {shift}+{option}+{-} non ha spazi prima o dopo—come questo—ed è preferito per le frasi parentetiche. +- Il trattino em {shift}+{option}+{-} non ha spazi prima o dopo—come questo—ed è la nostra preferenza per le frasi parentetiche. - In un elenco di tre elementi, utilizzare una virgola prima di "e": "Piselli, senape, e carote" - I titoli devono essere generalmente realizzati in stile titolo maiuscolo: La prima e l'ultima parola, così come tutti i nomi, i pronomi, i verbi e gli avverbi devono essere scritti in maiuscolo. Se il vostro documento funziona meglio con la capitalizzazione in stile frase, magari perché fate spesso riferimento ad acronimi, rendetela coerente all'interno dell'intero documento. - I titoli non necessitano di un punto o di un punto e virgola alla fine, anche con una capitalizzazione di tipo frase, a meno che non terminino con un'abbreviazione. - Elenchi puntati e numerati: Evitare la maiuscola iniziale o la punteggiatura finale, a meno che non si tratti di una frase completa. +!!! info “Stile maiuscolo del titolo” + + Chi usa `vale' e altri linters linguistici, troverà che questi suggeriscono di usare la capitalizzazione in stile frase. Gran parte della documentazione creata all'interno del nostro pool di documentazione utilizza questo stile di capitalizzazione dei titoli. Ricordate che qualsiasi stile scegliate, mantenetelo coerente all'interno del documento. + ### Voce e Tono -- **Linguaggio semplice.** Questo può essere descritto come uno stile *meno colloquiale*. La maggior parte della nostra documentazione rientra in questo standard. +- **Linguaggio semplice.** Si tratta di uno stile *meno colloquiale*. La maggior parte della nostra documentazione rientra in questo standard. - Evitare metafore e modi di dire. - Dite quello che volete dire con il minor numero di parole possibile. - Identificare ed evitare termini inutilmente tecnici. Considerate che il vostro pubblico è costituito per lo più da persone che hanno una certa familiarità con l'argomento, ma che potrebbero non essere esperti della materia. - Eccezioni al linguaggio semplice: - - Uno stile più colloquiale è appropriato per la documentazione rivolta ai neofiti o ai principianti o per la scrittura di contenuti come i post dei blog. + - Uno stile più colloquiale è appropriato per la documentazione rivolta ai neofiti o ai principianti o per la scrittura di contenuti come i post di un blog. - Uno stile di scrittura più formale o conciso è appropriato per la documentazione rivolta agli utenti avanzati o per la documentazione sulle API (Application Programming Interface). - **Linguaggio inclusivo.** - L'uso della lingua si evolve nel tempo. Alcune parole si sono evolute assumendo una connotazione negativa, per cui la documentazione dovrebbe essere riscritta utilizzando parole nuove. - *Master/slave* diventa *primario/secondario* o uno standard organizzativo concordato. - La *blacklist/whitelist* diventa *blocklist/allowlist* o uno standard organizzativo concordato. - - Si possono pensare altri esempi pertinenti durante la creazione della documentazione. + - Potreste pensare ad altri esempi pertinenti durante la creazione della documentazione. - Quando si parla di una persona di genere *sconosciuto* o *non binario*, è ora considerato accettabile usare "loro" come pronome singolare. - Quando si parla delle proprie capacità, inquadrare le risposte come *abilità* piuttosto che come *limitazioni.* Ad esempio, se vi chiedete se abbiamo documentazione sull'esecuzione di Steam su Rocky Linux, la risposta non è semplicemente "no" Piuttosto, "Sembra che sia un ottimo posto per creare qualcosa da aggiungere al nostro albero!" - **Evitare le contrazioni.** Questo facilita gli sforzi di traduzione. L'eccezione è rappresentata dalla scrittura di testi dal tono più colloquiale, come i post di un blog o le istruzioni di benvenuto per i nuovi membri della comunità. +- **Usa la voce attiva.** La voce attiva è più chiara e diretta e aiuta il lettore a comprendere rapidamente il tuo significato. + +!!! info “Altre letture su voce e tono” + + Dopo la creazione di questa guida di stile sono stati creati altri documenti sulla voce e sul tono, tra cui: + - [Good Docs-Il punto di vista del traduttore](../../rocky_insights/blogs/good_docs.md) + - [Voce attiva - La via per una comunicazione semplice e chiara](../../rocky_insights/blogs/active_voice.md) ## Formattazione @@ -78,9 +89,9 @@ Se si tratta di una procedura con una sola fase, utilizzare un punto piuttosto c ### Linguaggio di interfaccia grafica -- Istruzioni testuali relative a un'interfaccia utente: Quando si descrive un comando da inserire in un'interfaccia utente, utilizzare la parola "enter" piuttosto che "put" o "type" Utilizzate un blocco di codice per scrivere il comando (cioè, impostatelo con i backtick): +- Istruzioni testuali relative a un'interfaccia utente: Quando si descrive l'inserimento di un comando in un'interfaccia utente, utilizzare la parola "enter" piuttosto che "put" o "type". Utilizzate un blocco di codice per scrivere il comando (con i backtick): -*Esempio di testo Markdown* `Nella casella **messaggio di commit**, inserire update_thisdoc.` +*Esempio di testo Markdown*`Nella casella **commit message**, inserire update_thisdoc.` - Nomi di elementi dell'interfaccia utente: Nomi **in grassetto** di elementi dell'interfaccia utente come pulsanti, voci di menu, nomi di finestre di dialogo e altro, anche se la parola non sarà cliccabile: @@ -98,7 +109,7 @@ Se si tratta di una procedura con una sola fase, utilizzare un punto piuttosto c ### Ammonimenti -In Markdown, gli ammonimenti sono un modo per inserire le informazioni in un riquadro per evidenziarle. Non sono essenziali per la documentazione, ma sono uno strumento che può essere utile. Per saperne di più sugli ammonimenti, consultate il nostro documento [Formattazione di Rocky Docs](rockydocs_formatting.md). +In Markdown, gli ammonimenti sono un modo per inserire le informazioni in un riquadro per evidenziarle. Non sono essenziali per la documentazione, ma sono uno strumento che potrebbe essere utile. Per saperne di più sugli ammonimenti, consultate il nostro documento [Formattazione di Rocky Docs](rockydocs_formatting.md). ## Accessibilità @@ -131,11 +142,11 @@ In Markdown, gli ammonimenti sono un modo per inserire le informazioni in un riq - Utilizzate tutti i livelli di intestazione senza saltare alcun livello. - Annidate tutto il materiale con titoli che ne favoriscano la leggibilità. -- Ricordate che in Markdown è possibile utilizzare un solo titolo di primo livello. +- Ricordate di usare solo un titolo di primo livello in Markdown. ## Sommario -Questo documento definisce i nostri standard di contribuzione, comprese le **linee guida di stile** le modalità di **strutturazione** del documento e i modi per incorporare l'**'inclusività** e l'**accessibilità** nel testo. Questi sono gli standard a cui aspiriamo. Per quanto possibile, tenete a mente questi standard quando create e modificate la documentazione. +Questo documento definisce i nostri standard di contribuzione, comprese le **linee guida di stile**, le modalità di **strutturazione** del documento e i modi per incorporare **l'inclusività** e l'**accessibilità** nel testo. Questi sono gli standard a cui aspiriamo. Per quanto possibile, tenete a mente questi standard quando create e modificate la documentazione. Tuttavia—e non perdetevi questa avvertenza—**trattate questi standard come uno strumento, non come un ostacolo.** Nello spirito dell'inclusività e dell'accessibilità, vogliamo assicurarci che il vostro contributo entri senza problemi nell'albero genealogico di Rocky. Siamo un team amichevole e disponibile di documentaristi e stilisti e vi aiuteremo a portare il vostro documento alla sua forma finale. diff --git a/docs/guides/web/apache-sites-enabled.it.md b/docs/guides/web/apache-sites-enabled.it.md index 26f87c606a..21977f542e 100644 --- a/docs/guides/web/apache-sites-enabled.it.md +++ b/docs/guides/web/apache-sites-enabled.it.md @@ -207,7 +207,7 @@ Successivamente, è necessario definire la parte `https` del file di configurazi ServerAdmin username@rockylinux.org Redirect / https://your-server-hostname/ - + ServerName your-server-hostname ServerAdmin username@rockylinux.org DocumentRoot /var/www/sub-domains/your-server-hostname/html @@ -240,6 +240,10 @@ Successivamente, è necessario definire la parte `https` del file di configurazi ``` +!!! warning “Una nota sulle suite di cifratura” + + Questo documento è stato originariamente scritto per Rocky Linux 8. Da allora sono cambiate **molte cose**. Per prima cosa, si potrebbero tralasciare completamente le linee `SSLHonorCipherOrder on` e `SSLCipherSuite` e lasciare che sia la configurazione predefinita del server ad occuparsene. Se si mantiene un server aggiornato (in altre parole, si esegue `dnf upgrade` di routine), questo dovrebbe gestire la sicurezza e l'aggiornamento delle suite di cifratura senza una gestione separata della configurazione. In questo modo, si eviterà di utilizzare suite di cifratura critiche o pericolose nella propria configurazione. Se per qualche motivo si ha bisogno di modificare questi elementi nella vostra configurazione, cercate attentamente le voci da inserire. + Perciò, dopo le normali porzioni di configurazione, si passa alla sezione SSL/TLS: * SSLEngine on - dice di utilizzare SSL/TLS @@ -252,7 +256,7 @@ Se all'avvio del servizio web non si riscontrano errori e se il sito web risulta ## Portare tutto live -Remember that our *httpd.conf* file is including */etc/httpd/sites-enabled* at the end of the file. Quando `httpd` si riavvia, caricherà i file di configurazione presenti nella cartella *sites-enabled*. Il fatto è che tutti i nostri file di configurazione sono in *sites-available*. +Ricordate che il nostro file *httpd.conf* include */etc/httpd/sites-enabled* alla fine del file. Quando `httpd` si riavvia, caricherà i file di configurazione presenti nella cartella *sites-enabled*. Il fatto è che tutti i nostri file di configurazione sono in *sites-available*. Questo è stato progettato in modo da poter rimuovere le cose quando o se `httpd` non si riavvia. Per abilitare il nostro file di configurazione, è necessario creare un collegamento simbolico a tale file in *sites-enabled* e avviare o riavviare il servizio web. Per farlo, si utilizza questo comando: @@ -262,4 +266,4 @@ ln -s /etc/httpd/sites-available/your-server-hostname /etc/httpd/sites-enabled/ Questo creerà il collegamento al file di configurazione in *sites-enabled*. -Ora basta avviare `httpd` con `systemctl start httpd`. Oppure riavviatelo se è già in funzione: `systemctl restart httpd`, e supponendo che il servizio web si riavvii, ora si può andare a fare qualche test sul proprio sito. +Ora basta avviare `httpd` con `systemctl start httpd`. Oppure riavviatelo se è già in funzione: `systemctl restart httpd`, e supponendo che il servizio web si riavvii, potete ora andare a fare qualche test sul vostro sito. diff --git a/docs/guides/web/caddy.it.md b/docs/guides/web/caddy.it.md index c68484db28..e19185ed3f 100644 --- a/docs/guides/web/caddy.it.md +++ b/docs/guides/web/caddy.it.md @@ -154,7 +154,7 @@ Dovrebbe avere un lucchetto SSL che dovrebbe funzionare in ogni browser moderno, Come accennato in precedenza, Caddy supporta il supporto FastCGI per PHP. La buona notizia è che, a differenza di Apache e Nginx, Caddy gestisce automaticamente le estensioni dei file PHP. -Per installare PHP, aggiungere prima il repository Remi (nota: se si utilizza Rocky Linux 8.x, si deve sostituire 8 dopo "release-"): +Per installare PHP, aggiungere prima il repository Remi (nota: se si utilizza Rocky Linux 8.x o 10.x, sostituire 8 o 10 con "release-"): ```bash dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm diff --git a/docs/release_notes/10_0.it.md b/docs/release_notes/10_0.it.md new file mode 100644 index 0000000000..951302774b --- /dev/null +++ b/docs/release_notes/10_0.it.md @@ -0,0 +1,282 @@ +--- +title: Versione corrente 10 +tags: + - 10 + - 10.0 release + - Rocky Linux 10 +--- + +## Rocky Linux 10 + +Rocky Linux 10 (RL 10) è l'ultima major release del sistema operativo enterprise Rocky Linux. + +### Aggiornamento a Rocky Linux 10 + +Rocky Linux non supporta gli upgrades ad alcuna major release. Per passare da 8.x o 9.x a Rocky Linux 10, è necessario eseguire una nuova installazione del sistema operativo. + +### Nuove funzionalità e modifiche + +Le sezioni seguenti descrivono alcune caratteristiche di RL 10. + +Come per tutti i principali rilasci di Rocky Linux, questa nota di rilascio copre numerosi miglioramenti, modifiche e nuove funzionalità. + +La panoramica che segue evidenzia le modifiche nelle seguenti categorie: Architettura, Kernel, Installatore, Networking, Sicurezza, Virtualizzazione, Container, Storage e Gestione dei pacchetti. Sono state selezionate le caratteristiche che hanno più probabilità di essere rilevanti per il grande pubblico. + +Per un elenco completo delle principali modifiche, vedere l'elenco upstream [qui](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/10/html/10.0_release_notes/overview#overview-major-changes). + +### Architetture supportate + +!!! warning "Verificare la compatibilità della CPU" + + Sull'architettura del processore x86_64, RL 10 non supporta più l'hardware del livello di microarchitettura x86-64-v2 e precedenti, e rende il livello di microarchitettura x86-64-v3 la linea di base per la distribuzione.\ + Per ulteriori informazioni, consultare la sezione [Livelli di microarchitettura supportati] (#supported-microarchitecture-levels), in particolare la sezione sulla verifica della compatibilità della CPU. + +!!! info "Interruzione del package a 32 bit" + + Rocky Linux 10 ha rimosso la compatibilità a 32 bit per x86_64. Utilizzare invece librerie o container a 64 bit con dipendenze a 32 bit. + +Rocky Linux 10 è supportato dalle seguenti architetture di processore: + +- 64-bit AMD/Intel x86-64-v3 (x86_64) +- 64-bit RISC-V (riscv64) +- 64-bit ARMv8.0-A (aarch64) +- IBM POWER9, little endian (ppc64le) +- IBM z14 (s390x) + +#### Nuovo supporto per l'architettura RISC-V + +Il team di ingegneri del rilascio di Rocky Linux ha lavorato a lungo e duramente per portare Rocky Linux 10 su alcune “implementazioni RISC-V”. +Le piattaforme/sottosistemi supportati il giorno del rilascio includono: StarFive VisionFive 2 (VF2), **QEMU** e SiFive HiFive Premier P550. + +Per maggiori dettagli su questa pietra miliare, compreso il supporto RISC-V di RL10, visitate [questo sito](https://rockylinux.org/news/rockylinux-support-for-riscv). + +#### Livelli di microarchitettura supportati + +La microarchitettura x86-64-v3 si basa sulle caratteristiche della generazione di processori Intel Haswell. Una manciata di processori Intel Atom (come quelli della famiglia Gracemont) supportano x86-64-v3. Altri, invece, tra cui i processori Intel Atom della famiglia Parker Ridge e il processore Intel Atom x6416RE della famiglia Elkhart Lake, non offrono funzioni x86-64-v3 e non sono quindi supportati in RL 10. Se si ha dubbi sulla compatibilità di un processore, [utilizzate questa procedura](https://docs.rockylinux.org/gemstones/test_cpu_compat/) per verificarla. + +L'implementazione di AMD del livello di microarchitettura x86-64-v3, che serve come base per Rocky Linux 10 su x86_64, è stata introdotta con la microarchitettura Excavator. Questo significa che i processori più vecchi di quelli basati sull'architettura Excavator potrebbero non essere pienamente supportati da Rocky Linux 10. + +!!! Note "Differenze delle immagini di Raspberry Pi" + + La differenza principale tra le immagini Rocky Linux Pi per la versione 10 è che la 10 supporta il Pi 4 e il Pi 5, mentre la 9 supporta il Pi 3, il Pi 4, il Pi 5 e il Pi Zero 2W. + +### Creazione di pacchetti di installazione e immagini + +Anaconda, l'interfaccia grafica interattiva per l'installatore di Rocky Linux, presenta una serie di cambiamenti nella versione 10. + +Le principali modifiche includono: + +- La disabilitazione, per impostazione predefinita, dell'account di root. La gestione del sistema richiede la creazione di un utente amministrativo con privilegi sudo completi. Se si sceglie di abilitare l'account root impostando la sua password, è possibile creare utenti standard senza privilegi amministrativi. +- Remote Desktop Protocol (RDP) sostituisce VNC per l'accesso remoto grafico durante il processo di installazione. Questa modifica influisce sulle relative opzioni di avvio del kernel. +- Rimozione della mappa dei fusi orari nella sezione "Time & Date" del programma di installazione. +- L'interfaccia grafica non supporta più l'aggiunta di repository di terze parti durante l'installazione iniziale. Utilizzare invece l'opzione di avvio `inst.addrepo` o Kickstart. +- Rimozione della documentazione disponibile al momento dell'installazione. + +### Kernel + +Il Kernel predefinito per RL 10 è stato aggiornato alla versione 6.12.0. + +Alcune funzioni del kernel sono ora disabilitate perché non mantenute, insicure o deprecate. + +L'argomento della riga di comando del kernel `rh_waived` può abilitare queste caratteristiche, se necessario. Lo scheduler CFS viene sostituito da Earliest Eligible Virtual Deadline First (EEVDF), che dà priorità ai task sensibili alla latenza con fette di tempo più brevi per migliorare la reattività. + +### Networking + +I miglioramenti apportati alle funzionalità di rete in RL 10 includono modifiche alla configurazione di rete, all'aggregazione delle interfacce di rete, ai client e ai server DHCP, nonché aggiunte e rimozioni ai driver dei dispositivi. + +#### NetworkManager e script di rete + +La deprecazione dei vecchi script di rete ifcfg-rh è avvenuta nelle versioni precedenti di Rocky Linux (9.x). Con Rocky Linux 10, questi script non sono più disponibili. + +Ora è necessario utilizzare NetworkManager. Questi strumenti includono `nmcli`, `nmtui` e `nmstate`. Ciò significa che alcuni vecchi file e comandi non funzioneranno più e che anche la posizione in cui conservare i file di configurazione della rete è cambiata. + +- I file con il prefisso ifcfg- nella directory /etc/sysconfig/network-scripts/ non sono supportati. +- I comandi ifup e ifdown non sono più disponibili. +- Gli script di rete precedenti, come ifup-local, non sono più supportati. +- I file di configurazione della rete sono memorizzati nella cartella /etc/NetworkManager/system-connections/. + +#### DHCP Client e Server + +L'implementazione del client DHCP in RL 10 avviene tramite un sottosistema interno di NetworkManager. Il pacchetto legacy dhcp-client è stato rimosso e non è più supportato upstream. + +Kea DHCP sostituisce il server DHCP ISC, ormai in disuso, nella RL 10. + +#### Network Bonding e Teaming + +Le versioni precedenti di Rocky Linux hanno deprecato la funzione di teaming NIC. Nella RL 10, questo aspetto è stato completamente rimosso. In sostituzione, configurare un bond invece di un team di rete. + +### Storage + +Oltre alle seguenti modifiche, in RL 10 sono stati aggiunti, aggiornati o rimossi diversi driver di dispositivi di storage. + +#### Global File System 2 (GFS2) + +RL 10 non supporta più il file system GFS2. + +#### Device Mapper Multipath + +L'abilitazione di Device Mapper (DM) Multipath sui dispositivi NVMe non è supportata dalla RL 10. + +#### LUKS2 Disk Encryption + +Il pacchetto cryptsetup è stato aggiornato alla versione 2.7 per risolvere anomalie e supportare i dispositivi criptati LUKS quando si utilizza il servizio kernel dump (kdump). + +### Security Features + +Con RL 10, sono state introdotte numerose nuove funzionalità legate alla sicurezza. + +Alcuni degli aggiornamenti includono: + +- Criteri crittografici a livello di sistema (crypto-policies): OpenSSL e OpenSSH funzionano ora con la crittografia post-quantistica (PQC). +- Sequoia PGP: un'implementazione senza memoria di OpenPGP. +- OpenSSH: ripristino di autorizzazioni più severe per le chiavi host SSH. (Nuove autorizzazioni = 0600 Vs Vecchie autorizzazioni = 0640) +- GnuTLS: i certificati di client e server sono ora compressi +- algoritmo yescrypt: L'algoritmo della password per l'utente predefinito è stato modificato. + +Le nuove modifiche a SELinux includono i seguenti aggiornamenti: + +- L'equivalenza del contesto dei file è invertita in /var/run = /run. +- Aggiunta di nuovi tipi di servizio libvirt alla politica SELinux. + +### Virtualization + +La virtualizzazione vede cambiamenti fondamentali: + +- Il daemon monolitico libvirtd è deprecato. Utilizzare i demoni modulari e i socket come sostituti. A questo proposito si consulti la documentazione dettagliata sulle differenze nella [documentazione upstream](https://libvirt.org/daemons.html#monolithic-vs-modular-daemons). +- Deprecazione del tipo di macchina virtuale i440fx +- Deprecazione di Virtual Machine Manager, Cockpit è il sostituto designato + +### Containers + +Podman 5 in RL 10 introduce diversi miglioramenti, tra cui il nuovo runtime predefinito del contenitore, `crun`, che sostituisce `runc`. Control Groups v2 è ora la versione predefinita di cgroup. + +Gli aggiornamenti principali includono la rimozione della modalità di rete slirp4netns, la possibilità di configurare dei tentativi di riprova e i ritardi per le operazioni di push e pull delle immagini e il supporto completo per le immagini di container multi-architettura. + +Inoltre, Podman 5 continua a supportare Quadlets, una caratteristica introdotta in Podman 4.4, che consente di gestire i contenitori Podman con `systemd` utilizzando file di unità dichiarativi. + +### Gestione Software + +RPM è ora la versione 4.19, che include miglioramenti e aggiornamenti agli strumenti di pacchettizzazione e costruzione. È stato introdotto un nuovo comando `rpmsort` per ordinare correttamente le stringhe di versione RPM nelle pipeline di output. A titolo di esempio: + +Il vecchio `sort`: `rpm -q kernel | sort`\ +kernel-6.12.0-130.el10.x86_64\ +kernel-6.12.0-13.el10.x86_64 + +Il nuovo `rpmsort`: `rpm -q kernel | rpmsort`\ +kernel-6.12.0-13.el10.x86_64\ +kernel-6.12.0-130.el10.x86_64 + +#### DNF + +Per impostazione predefinita, DNF ora omette il download dei metadati dell'elenco dei file del repository, migliorando la reattività e conservando lo spazio su disco. I comandi DNF che necessitano di questi metadati li scaricano in genere automaticamente. + +#### Modularità + +La modularità DNF è stata abbandonata e Rocky Linux non intende fornire i contenuti di AppStream come moduli in RL 10. In futuro, RL 10 potrebbe fornire ulteriori versioni di applicazioni come pacchetti RPM, raccolte di software o Flatpak. + +In altre parole, il comando `dnf module` è stato eliminato in RL 10 perché il gestore di pacchetti DNF di nuova generazione (`dnf5`) ha unificato l'API e non si basa più sulla vecchia architettura modulare per gestire più versioni del software. I paragoni più significativi sono i seguenti: + +| Descrizione | Vecchio ('dnf module') | Nuovo | +| :--------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------- | +| Visualizza le versioni disponibili | `dnf module list ` | `dnf repoquery ` | +| Installare una versione specifica | `dnf module enable nginx:1.14 && dnf module install nginx:1.14` | `dnf install nginx-1.26.3` | +| Cancellare una specifica versione | `dnf -y module remove --all :` or `dnf -y module remove --all :/` | `dnf remove -` | +| Passare ad una specifica versione | `dnf -y module remove --all : && dnf module reset && dnf module enable :` | Non necessita cambiamenti | + +### Ambiente Desktop + +In RL 10, Wayland sostituisce il server X.Org. Xwayland supporterà la maggior parte dei client X11 che non sono ancora stati portati su Wayland. Anche alcune applicazioni e componenti desktop sono state sostituite in RL 10. + +#### Modifiche ai componenti Desktop + +| Rimosso | Sostituto | +| :----------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------- | +| editor di testi gedit | Editor di testi GNOME (gnome-text-editor) | +| Applicazione Tweaks | Utilizzare le opzioni Tweaks nelle impostazioni di GNOME e/o utilizzare il Flatpak su Flathub. | +| Festival speech synthesizer | Espeak NG | +| Eye of GNOME (eog) image viewer | GNOME Image Viewer (loupe) | +| Applicazione fotocamera Cheese | Applicazione Snapshot | +| GNOME Terminal | ptyxis terminal | +| PulseAudio daemon (ma non le interfacce client) | Pipewire (già predefinito in RL 9) | + +Diverse applicazioni grafiche per il desktop non sono più incluse nella distribuzione Rocky Linux 10. Nella maggior parte dei casi, è possibile ottenere queste applicazioni da fonti upstream o come Flatpak su Flathub. + +#### Applicazioni rimosse + +| Rimosso | Sostituto | +| :------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| LibreOffice office productivity software suite | Fornito ufficialmente come Flatpak su Flathub, oppure è possibile scaricare i pacchetti upstream da [https://www.libreoffice.org/](https://www.libreoffice.org/). | +| Evolution personal information manager and email client | Thunderbird viene fornito tramite il repository Appstream. È anche possibile ottenere un Flatpak o un pacchetto da upstream o tramite Flathub. | +| Editor di grafica vettoriale Inkscape | Non esiste un editor di grafica vettoriale incluso in RL 10, ma è possibile trovare un Flatpak su Flathub. | +| Media player Totem (GNOME Videos) | In RL 10 non esiste un lettore multimediale predefinito per il desktop. Il browser Web può ancora riprodurre contenuti multimediali basati sul Web. In alternativa, è possibile scegliere un altro lettore multimediale da repository di terze parti o come Flatpak da Flathub. | + +TigerVNC è stato rimosso da RL 10. Per la funzionalità di client VNC, utilizzare l'applicazione Connections. Non viene fornito un server VNC.\ +gnome-remote-desktop, utilizzando RDP, sostituisce TigerVNC per la condivisione del desktop, il login remoto e le sessioni headless. Questa funzione è integrata in GNOME e può essere configurata nell'applicazione Impostazioni. + +Anche l'ambiente desktop e il toolkit Motif X11 sono stati rimossi dalla RL 10. + +### Servizi per l'infrastruttura + +La sostituzione o la rimozione di alcuni servizi e pacchetti della RL 10 comprende i seguenti servizi infrastrutturali. + +| Rimosso | Sostituto | +| :--------------------------------- | :-------------------------------------------------------------------------------------------------- | +| power-profiles-daemon CPU throttle | Layer di traduzione tuned-ppd che supporta applicazioni scritte per il daemon power-profiles-daemon | +| redis in-memory key-value database | valkey (un fork di redis) in-memory key-value database ^1 | +| sendmail mail transfer agent | Rocky Linux consiglia di migrare all'agente di trasferimento della posta Postfix. | +| Filtro spam per email spamassassin | Il filtro antispam spamassassin si trova ora nel repository EPEL. | + +1 Oltre a `valkey`, il pacchetto `valkey-compat-redis` è presente nel repository Plus. + +### Linguaggi di Programmazione Dinamica + +Ci sono aggiornamenti alle versioni recenti di diversi linguaggi di programmazione popolari: + +- Python 3.12 +- Ruby 3.3 +- Node.js 22.13 +- Perl 5.40 +- PHP 8.3 + +### Web Servers e Database Servers + +Molti daemon server sono stati aggiornati a versioni più recenti: + +#### Web servers + +- Apache HTTP Server 2.4.63 +- nginx 1.26 + +#### Proxy caching servers + +- Varnish Cache 7.6 +- Squid 6.10 + +#### Database servers + +- MariaDB 10.11 +- MySQL 8.4 +- PostgreSQL 16.8 +- Valkey 8.0 + +### RL Web Console (Cockpit) + +Cockpit è un'interfaccia basata sul web per la gestione e il monitoraggio del sistema locale. Un gestore di file grafico e un editor di testo sono ora disponibili nella console web se si installa il pacchetto RPM `cockpit-files`. + +L'host switcher, che consentiva la gestione simultanea di più sistemi, è stato abbandonato e disattivato per impostazione predefinita per motivi di sicurezza. + +Cockpit ora supporta la configurazione degli Stratis file-system size limits. + +## Problemi noti + +### Anomalie di SELinux su host virtuali + +Quando si usa un host virtuale con un backend `passt` abilitato e il tipo `memfd` per la memoria, l'interfaccia non si avvia se SELinux è abilitato. Per ulteriori informazioni, vedere [questo numero upstream](https://issues.redhat.com/browse/RHEL-80407). + +### Schermata grigia dopo l'avvio del media d'installazione + +In configurazioni hardware specifiche, come gli ambienti virtualizzati con grafica 3D abilitata, è possibile che Anaconda si blocchi prima che venga visualizzata la procedura guidata di installazione. Questa anomalia dovrebbe essere risolvibile passando da tty6 a un'altra tty e poi di nuovo a tty6. Ad esempio, passare a tty1 e tornare a tty6 con: ++ctrl+alt+f1++ e poi ++ctrl+alt+f6++. + +## Collaborazione e segnalazione di bug + +Si prega di segnalare qualsiasi bug riscontrato al [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Vi invitiamo inoltre a unirvi alla nostra comunità in qualsiasi modo vogliate, sia sui [Forum](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC su Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailing Lists](https://lists.resf.org), o in qualsiasi altro modo vogliate partecipare! diff --git a/docs/release_notes/8_10.it.md b/docs/release_notes/8_10.it.md index 09db701143..2ab286a5ea 100644 --- a/docs/release_notes/8_10.it.md +++ b/docs/release_notes/8_10.it.md @@ -24,7 +24,7 @@ Per saperne di più sugli artefatti prodotti dal Cloud Special Interest Group e Per installare Rocky Linux 8.10, visitate la [pagina di download](https://rockylinux.org/download/) e scaricate la versione necessaria per la vostra architettura. -## Modifiche importanti +## Modifiche principali Per un elenco completo delle principali modifiche, vedere [elenco upstream qui](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/8.10_release_notes/overview#overview-major-changes). @@ -88,7 +88,7 @@ In 8.10 sono presenti molti problemi noti, tra cui quelli relativi a: - Gestione del software - Shell e strumenti a riga di comando - Servizi Infrastrutturali -- Rete +- Networking - Kernel - File system e archiviazione - Linguaggi di programmazione dinamica, server web e database @@ -101,7 +101,7 @@ In 8.10 sono presenti molti problemi noti, tra cui quelli relativi a: Per i dettagli completi su questi problemi, consultare l'[elenco upstream](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/8.10_release_notes/known-issues). -!!! info "Informazione" +!!! info ``` Alcuni flussi di applicazioni, che fanno parte dei repository Rocky Linux 8.10, non riceveranno ulteriori aggiornamenti. Ricordate di annotare tutti i flussi di applicazioni che sono EOL o deprecati e di aggiornare a flussi più recenti, se lo desiderate. diff --git a/docs/release_notes/8_5.it.md b/docs/release_notes/8_5.it.md index ad7e168f7a..3ac96f6eb9 100644 --- a/docs/release_notes/8_5.it.md +++ b/docs/release_notes/8_5.it.md @@ -56,7 +56,7 @@ SecureBoot enabled #### Nuovi Moduli * Ruby 3.0 -* nginx 1.20 +* nginx 1.26 * Node.js 16 #### Componenti Aggiornati diff --git a/docs/release_notes/8_7.fr.md b/docs/release_notes/8_7.fr.md index b339ca242a..d88e927bb6 100644 --- a/docs/release_notes/8_7.fr.md +++ b/docs/release_notes/8_7.fr.md @@ -34,7 +34,7 @@ Il n'y a aucun problème connu actuellement dans la version 8.7. Nous les ajoute Pour une liste complète des changements majeurs, veuillez consulter la liste en amont [ici](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/8.7_release_notes/overview#overview-major-changes). -En voici quelques exemples. +En voici quelques exemples remarquables. ### Sécurité diff --git a/docs/release_notes/8_7.it.md b/docs/release_notes/8_7.it.md index d823b2daec..86e009ef25 100644 --- a/docs/release_notes/8_7.it.md +++ b/docs/release_notes/8_7.it.md @@ -55,7 +55,7 @@ Questo rilascio modifica la `scap-security-guide` in modo che sia meglio allinea * `powerpc-utils` aggiornato a 1.3.10 * `libva` aggiornato a 2.13.0 -### Rete +### Networking * NetworkManager ribasato su 1.40. Per le modifiche più importanti, consultare le [note di rilascio a monte qui](https://github.com/NetworkManager/NetworkManager/blob/nm-1-40/NEWS). * NetworkManager ora memorizza le informazioni di lease DHCP nella directory`/run/NetworkManager/devices/` diff --git a/docs/release_notes/8_8.fr.md b/docs/release_notes/8_8.fr.md index 39d4319647..2648fb9784 100644 --- a/docs/release_notes/8_8.fr.md +++ b/docs/release_notes/8_8.fr.md @@ -30,7 +30,7 @@ Pour installer Rocky Linux 8.8, rendez-vous sur la [page de téléchargement](ht ## Les Nouveautés Phares de Rocky -### Breaking Changes +### Modifications majeures * Les images de Microsoft Azure sont maintenant publiées dans la Galerie d'images partagées ainsi que dans le Marketplace. L'option Galerie d'images partagées offre un moyen direct d'utiliser des images Rocky sur Microsoft Azure sans passer par les boucles d'abonnement via le Marketplace. En outre, cette galerie partagée nous permettra de publier des images plus fréquemment mises à jour sur le Marketplace. * Les variantes cloud d'images LVM pour tous les types suppriment maintenant `/etc/lvm/devices/system.devices` de résoudre les problèmes avec les PV/VG/LV lors de l'installation des images en raison de leur code binaire natif sur un périphérique spécifique. @@ -138,7 +138,7 @@ Il y a un grand nombre de problèmes connus dans 8.8 concernant : * Services d'infrastructure * Sécurité * Réseautage -* Noyau +* Kernel * Chargeur de démarrage * Systèmes de fichiers et stockage * Langages de programmation dynamiques, serveurs web et bases de données diff --git a/docs/release_notes/8_9.it.md b/docs/release_notes/8_9.it.md index b7b14edb3a..5a299f5943 100644 --- a/docs/release_notes/8_9.it.md +++ b/docs/release_notes/8_9.it.md @@ -26,7 +26,7 @@ Per installare Rocky Linux 8.9, visitate la [pagina di download](https://rockyli ## Il comunicato del team Rocky evidenzia -### Breaking changes +### Cambiamenti critici - Il gruppo opzionale `guest-agents`, precedentemente disponibile negli ambienti di base _Minimal Install_ e _Custom Operating System_ di anaconda, non è più disponibile per la selezione come software aggiuntivo per tali ambienti. Se si necessita del gruppo `guest-agents`, esso è disponibile negli ambienti di base _Server_ o _Server con GUI_. Se si installa _Minimal Install_ o _Custom Operating System_ e si desidera comunque avere il guest-agent, lo si può fare installando il target del pacchetto direttamente in Kickstart, oppure installandolo con DNF al termine dell'installazione (ad esempio, dnf install @guest-agents). @@ -89,7 +89,7 @@ In 8.9 sono presenti molti problemi noti, tra cui quelli relativi a: - Gestione del software - Shell e strumenti a riga di comando - Servizi Infrastrutturali -- Rete +- Networking - Kernel - File system e archiviazione - Linguaggi di programmazione dinamica, server web e database diff --git a/docs/release_notes/9_1.it.md b/docs/release_notes/9_1.it.md index cdecc94e43..90eda7549f 100644 --- a/docs/release_notes/9_1.it.md +++ b/docs/release_notes/9_1.it.md @@ -96,7 +96,7 @@ Alcuni punti salienti di questa release sono dettagliati successivamente. * La funzione di crittografia della password è ora disponibile in `whois` * `frr` ribasato alla versione 8.2.2 -## Rete +## Networking * È stato aggiunto il modulo del kernel `act_ctinfo` * Il driver PTP ora supporta gli orologi virtuali e la marcatura temporale diff --git a/docs/release_notes/9_2.fr.md b/docs/release_notes/9_2.fr.md index 952cf02ce0..5adc292311 100644 --- a/docs/release_notes/9_2.fr.md +++ b/docs/release_notes/9_2.fr.md @@ -203,7 +203,7 @@ Il y a un grand nombre de problèmes connus dans 9.2 concernant : * Services d'infrastructure * Sécurité * Réseautage -* Noyau +* Kernel * Chargeur de démarrage * Systèmes de fichiers et stockage * Langages de programmation dynamiques, services web et base de données diff --git a/docs/release_notes/9_3.fr.md b/docs/release_notes/9_3.fr.md index 7237bcdbf4..59b328fcc3 100644 --- a/docs/release_notes/9_3.fr.md +++ b/docs/release_notes/9_3.fr.md @@ -119,7 +119,7 @@ Plusieurs problèmes connus existent dans la version 9.3, y compris ceux liés - Outils de ligne de commande et shells - Services d'infrastructure - Réseaux -- Noyau +- Kernel - Systèmes de fichiers et stockage - Langages de programmation dynamiques, serveurs web et bases de données - Compilateurs et outils de développement diff --git a/docs/release_notes/9_3.it.md b/docs/release_notes/9_3.it.md index 12c49db27a..73e6bbe768 100644 --- a/docs/release_notes/9_3.it.md +++ b/docs/release_notes/9_3.it.md @@ -118,7 +118,7 @@ Nella versione 9.3 sono presenti molti problemi noti, tra cui quelli relativi a: - Gestione del software - Shell e strumenti a riga di comando - Servizi Infrastrutturali -- Rete +- Networking - Kernel - Filesystem e archiviazione - Linguaggi di programmazione dinamica, server web e database diff --git a/docs/release_notes/9_4.it.md b/docs/release_notes/9_4.it.md index 0841078fb9..080439a3ea 100644 --- a/docs/release_notes/9_4.it.md +++ b/docs/release_notes/9_4.it.md @@ -14,7 +14,7 @@ tags: È possibile aggiornare Rocky Linux 9.x a Rocky Linux 9.4 eseguendo `sudo dnf -y upgrade`. -!!! Note "Nota" +!!! Note ``` Rocky Linux non offre un percorso di aggiornamento da qualsiasi versione di Rocky Linux 8. Per passare a Rocky Linux 9.4 si consiglia di eseguire una nuova installazione del sistema operativo. @@ -50,9 +50,9 @@ L'account publisher Rocky Linux per Microsoft Azure è cambiato e le immagini pr Oltre all'Azure Marketplace, Rocky Linux è disponibile gratuitamente sull'Azure Community Gallery, fornendo un accesso incredibilmente semplice all'esecuzione di Rocky su Microsoft Azure. Le istruzioni su come utilizzare le immagini della Community Gallery sono disponibili in questo [post](https://rockylinux.org/news/rocky-on-azure-community-gallery/). -### Nuove e importanti +### Novità e informazioni rilevanti -## Modifiche importanti +## Modifiche principali Per un elenco completo delle principali modifiche, vedere [elenco upstream qui].(https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/9.4_release_notes/overview#overview-major-changes). @@ -137,7 +137,7 @@ Nella versione 9.4 sono presenti molti problemi noti, tra cui quelli relativi a: - Gestione del software - Shell e strumenti a riga di comando - Servizi Infrastrutturali -- Rete +- Networking - Kernel - File system e archiviazione - Linguaggi di programmazione dinamica, server web e database diff --git a/docs/release_notes/9_5.it.md b/docs/release_notes/9_5.it.md index 728be29345..6aa5c74c51 100644 --- a/docs/release_notes/9_5.it.md +++ b/docs/release_notes/9_5.it.md @@ -14,7 +14,7 @@ L'elenco completo della maggior parte dei cambiamenti è disponibile nelle [note È possibile aggiornare Rocky Linux 9.x a Rocky Linux 9.5 eseguendo `sudo dnf -y upgrade`. -!!! Note "Nota" +!!! Note ``` Rocky Linux non offre un percorso di aggiornamento da qualsiasi versione di Rocky Linux 8. Si consiglia di eseguire un'installazione ex novo del sistema operativo per passare a Rocky Linux 9.5. @@ -42,9 +42,9 @@ Per installare Rocky Linux 9.5, visitate la [pagina di download](https://rockyli ## Il comunicato del team Rocky evidenzia -### Nuove e importanti +### Novità e informazioni rilevanti -## Modifiche importanti +## Modifiche principali Per un elenco completo delle principali modifiche, vedere [upstream listing here](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html-single/9.5_release_notes/index#overview-major-changes). diff --git a/docs/release_notes/9_6.fr.md b/docs/release_notes/9_6.fr.md new file mode 100644 index 0000000000..11cf9b1462 --- /dev/null +++ b/docs/release_notes/9_6.fr.md @@ -0,0 +1,141 @@ +--- +title: Version actuelle 9.6 +tags: + - 9.6 + - version 9.6 + - Rocky 9.6 +--- + +## Notes de publication pour Rocky Linux 9.6 + +Vous trouverez une liste complète de la plupart des modifications dans les [notes de publication en amont disponibles ici](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html-single/9.6_release_notes/index). + +## Mise à Jour + +Vous pouvez effectuer une mise à niveau de Rocky Linux 9.x vers Rocky Linux 9.6 en exécutant
+`sudo dnf -y upgrade`. + +!!! note "Remarque" + + Rocky Linux n'offre pas de possibilité de mise à niveau à partir d'une version quelconque de Rocky Linux 8. Nous recommandons de procéder à une nouvelle installation du système d'exploitation pour passer à Rocky Linux 9.6. + +## Images + +Plusieurs images sont disponibles en plus des images d'installation normales, y compris pour des plateformes cloud et conteneur. + +Vous trouverez plus d'informations sur les artefacts produits par le groupe d'intérêt spécial (SIG) Cloud, ainsi que des informations sur la manière de s'impliquer sur la [page Wiki SIG/Cloud](https://sig-cloud.rocky.page/). + +### Étapes de construction de nouvelle image et procédure + +Avec la sortie de Rocky Linux 9.6, le processus de création et de livraison de nos images continue de s'améliorer. KIWI, un outil moderne de création d'images qui permet un flux de travail plus cohérent et plus facile à maintenir, a été utilisé pour créer la plupart des images de cette version. + +Les images toujours créées à l'aide d'ImageFactory incluent Vagrant (Libvirt, VirtualBox, VMware) et OCP-Base (Oracle Cloud Platform). Toutes les autres images Cloud et Container sont maintenant créées avec KIWI. Cette transition nous permet de publier des mises à jour plus fréquemment sur les plateformes prises en charge tout en maintenant la parité des fonctionnalités avec les versions précédentes. + +Si vous rencontrez des problèmes ou des différences de comportement, veuillez les signaler à l'équipe de Rocky Linux. Notre objectif est de résoudre ou d'expliquer rapidement tout changement inattendu. + +### Nouvelle image WSL + +L'introduction d'une nouvelle image WSL, en plus des mises à niveau KIWI, existe aussi !\ +Cela permet d'utiliser la solution normale prête à l'emploi, dont disposent les images fournies par le Store : + +- téléchargez l'image : [x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-WSL-Base.latest.x86_64.wsl) ou [aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-WSL-Base.latest.aarch64.wsl) +- pour installer, exécutez `wsl --install --from-file path/to/file.wsl rocky-wsl-base` ou double-cliquez simplement sur le fichier wsl +- la première fois que l'image wsl démarre, il vous sera demandé de spécifier un nom d'utilisateur + +Veuillez trouver plus de détails dans la [page de documentation](https://docs.rockylinux.org/guides/interoperability/import_rocky_to_wsl/). + +## Installation + +Avant l'installation, [assurez-vous de la compatibilité de votre CPU avec cette procédure !](https://docs.rockylinux.org/gemstones/test_cpu_compat/) + +Pour installer Rocky Linux 9.6, visitez la [page de téléchargement](https://rockylinux.org/download/) et téléchargez la version correspondant à votre architecture. + +## L'équipe Rocky met en avant les points suivants + +### Nouveau et notable + +## Changements majeurs + +Pour une liste complète des changements majeurs, consultez la [liste en amont ici](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/overview#overview-major-changes). + +Les points forts et les nouvelles fonctionnalités de cette version sont détaillés ci-dessous. + +### Sécurité + +Vous trouverez ci-dessous les points forts liés à la sécurité dans la dernière version de Rocky Linux 9.6. Pour une liste complète des changements liés à la sécurité, consultez le [lien en amont ici](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-security) : + +- **SELinux** fournit maintenant des règles de politique supplémentaires qui limitent `iio-sensor-proxy`, `power-profiles-daemon`, `switcheroo-control` et `samba-bgqd`. + +### Langages de programmation dynamiques, serveurs web et bases de données + +Pour une liste détaillée des modifications dans cette catégorie, consultez le [lien en amont ici](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-dynamic-programming-languages-web-and-database-servers). + +Les versions ultérieures des flux de modules suivants sont désormais disponibles : + +- **PHP 8.3** module stream +- **MySQL 8.4** module stream +- **nginx 1.26** module stream + +### Compilateurs et outils de développement + +Pour plus de détails sur les changements dans cette catégorie, consultez le [lien en amont ici](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-compilers-and-development-tools) + +Outils de performance et débogueurs mis à jour : + +- **Valgrind 3.24.0** +- **SystemTap 5.2** +- **elfutils 0.192** +- **libabigail 2.6** + +Outils de surveillance des performances mis à jour : + +- **PCP 6.3.2** + +Ensembles d'outils de compilation mis à jour : + +- **LLVM Toolset 19.17** +- **Rust Toolset 1.84.1** +- **Go Toolset 1.23** + +## Problèmes connus + +### Le module actuel de ZFS ne charge pas dans la version 9.6 + +Le module `zfs` actuellement publié par OpenZFS **ne se chargera pas** sur Rocky Linux 9.6. Pour ceux qui utilisent `zfs` sur 9.5 et qui prévoient de passer à la version 9.6, il est recommandé d'attendre pour le moment. Si vous prévoyez une nouvelle installation de 9.6 et utilisez `zfs`, vous devez alors attendre à nouveau la sortie du module mis à jour. Vous pouvez suivre le problème [ici](https://github.com/openzfs/zfs/issues/17332) et [ici](https://github.com/openzfs/zfs/issues/17364). + +**Mise à jour :** Une mise à jour de la branche 2.2.8 [corrige le problème avec la version 9.6](https://github.com/openzfs/zfs/releases). En attente d'une mise à jour pour la branche 2.3. + +### Problème SELinux sur un serveur, un poste de travail ou un système hôte virtuel en lien avec l'installation de `passt` + +Lorsque vous utilisez un poste de travail, un serveur ou un hôte virtuel avec un back-end `passt` installé, l'interface ne démarrera pas si SELinux est activé. Consultez [la description du problème en amont](https://issues.redhat.com/browse/RHEL-80407) pour plus d'informations. + +### Échec de la mise à niveau en lien avec l'installation des paquets `gstreamer` + +Si vous essayez de mettre à niveau un système, vous obtenez une erreur : + + ``` + Error: Transaction test error: + file /usr/lib64/gstreamer-1.0/libgstdvbsuboverlay.so from install of gstreamer1-plugins-bad-free-1.22.12-4.el9_6.x86_64 conflicts with file from package gstreamer1-plugins-bad-freeworld-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstsiren.so from install of gstreamer1-plugins-bad-free-1.22.12-4.el9_6.x86_64 conflicts with file from package gstreamer1-plugins-bad-freeworld-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstasf.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstdvdlpcmdec.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstdvdsub.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + file /usr/lib64/gstreamer-1.0/libgstrealmedia.so from install of gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 conflicts with file from package gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 + ``` + +Arrêtez la mise à niveau et procédez comme suit avant de réessayer : + + ``` + sudo dnf swap gstreamer1-plugins-ugly-1:1.22.1-1.el9.x86_64 gstreamer1-plugins-ugly-free-1.22.12-3.el9.x86_64 + sudo dnf swap gstreamer1-plugins-bad-freeworld-1:1.22.1-1.el9.x86_64 gstreamer1-plugins-bad-free-1.22.12-4.el9_6.x86_64 + ``` + +Comme pour toute version, il existe de nombreux problèmes connus. Consultez la [liste en amont](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/known-issues) pour obtenir tous les détails sur ces problèmes. + +!!! info "Logiciels Obsolètes" + + Certains flux d'applications, inclus dans les dépôts Rocky Linux 9.6, ne recevront plus de mises à jour. Ce problème survient régulièrement avec presque toutes les versions. Assurez-vous d'utiliser la dernière version prise en charge du logiciel. + +## Signaler des problèmes + +Merci de signaler tous les problèmes que vous rencontrez sur le [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Nous vous invitons également à rejoindre notre communauté de quelque manière que ce soit, que ce soit sur nos [Forums](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC on Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailing Lists](https://lists.resf.org), ou de toute autre manière que vous souhaiteriez utiliser ! diff --git a/docs/release_notes/9_6.it.md b/docs/release_notes/9_6.it.md index 7e8f8456ab..a47c0bc23b 100644 --- a/docs/release_notes/9_6.it.md +++ b/docs/release_notes/9_6.it.md @@ -10,11 +10,11 @@ tags: L'elenco completo della maggior parte dei cambiamenti è disponibile nelle [note di rilascio upstream, reperibili qui](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/index). -## Aggiornamento +## Aggiornamenti È possibile aggiornare Rocky Linux 9.x a Rocky Linux 9.6 eseguendo `sudo dnf -y upgrade`. -!!! Note "Nota" +!!! Note Rocky Linux non offre un percorso di aggiornamento da qualsiasi versione di Rocky Linux 8. Si consiglia di eseguire una nuova installazione del sistema operativo per passare a Rocky Linux 9.6. @@ -24,7 +24,7 @@ Oltre alle immagini di installazione standard, sono disponibili diverse immagini Ulteriori informazioni sugli artefatti prodotti dal Cloud Special Interest Group e su come partecipare sono disponibili nella pagina [SIG/Cloud Wiki] (https://sig-cloud.rocky.page/). -### Flusso di lavoro e processo di creazione delle immagini +### Processo e workflow di build delle immagini Con il rilascio di Rocky Linux 9.6, il processo di creazione e distribuzione delle immagini continua a migliorare. KIWI, un moderno strumento di creazione di immagini che consente un flusso di lavoro più coerente e manutenibile, ha creato la maggior parte delle immagini di questa release. @@ -49,17 +49,17 @@ Prima dell'installazione, [assicurarsi della compatibilità della CPU con questa Per installare Rocky Linux 9.6, visitate la [pagina di download](https://rockylinux.org/download/) e scaricate la versione corrispondente alla vostra architettura. -## Il comunicato del team Rocky evidenzia +## Gli highlights di rilascio del Rocky team -### Nuove e importanti +### Novità e informazioni rilevanti -## Modifiche importanti +## Modifiche principali Per un elenco completo delle principali modifiche, vedere [lista upstream qui](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/overview#overview-major-changes). I punti salienti e le nuove funzionalità di questa release sono illustrati di seguito. -### Sicurezza +### Security Di seguito sono elencati i punti salienti relativi alla sicurezza dell'ultima release Rocky Linux 9.6. Per un elenco completo delle modifiche relative alla sicurezza, consultare il [link upstream qui](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-security): @@ -75,7 +75,7 @@ Sono ora disponibili le versioni successive dei seguenti flussi di moduli: - **MySQL 8.4** module stream - **nginx 1.26** module stream -### Compilatori e strumenti di sviluppo +### Compilatori e tools di sviluppo Per i dettagli sui cambiamenti in questa categoria, vedere il [link a monte qui](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/new-features#new-features-compilers-and-development-tools) @@ -90,7 +90,7 @@ Strumenti di monitoraggio delle prestazioni aggiornati: - **PCP 6.3.2** -Aggiornati gli strumenti del compilatore: +Strumenti di compilazione aggiornati: - **LLVM Toolset 19.17** - **Rust Toolset 1.84.1** @@ -137,4 +137,4 @@ Come per ogni release, ci sono molti problemi noti. Per i dettagli completi su q ## Segnalazione di bug -Si prega di segnalare qualsiasi bug riscontrato al [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Vi invitiamo inoltre a unirvi alla nostra comunità in qualsiasi modo desideriate, che sia sui nostri [Forums](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC on Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailing Lists](https://lists.resf.org), o in qualsiasi altro modo vogliate partecipare! +Si prega di segnalare qualsiasi bug riscontrato al [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Vi invitiamo inoltre a unirvi alla nostra comunità in qualsiasi modo vogliate, sia sui [Forum](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC su Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailing List](https://lists.resf.org), o in qualsiasi altro modo vogliate partecipare! From 92060628a8a054ca598b736cda3cd8f2b35e7fc6 Mon Sep 17 00:00:00 2001 From: Neel Chauhan Date: Thu, 17 Jul 2025 13:23:41 -0400 Subject: [PATCH 069/164] `aqc_bridge_vlan.md`: Mention we need to reboot (#2788) --- docs/guides/hardware/aqc_bridge_vlan.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/guides/hardware/aqc_bridge_vlan.md b/docs/guides/hardware/aqc_bridge_vlan.md index aa027f32d7..cf889ba6cc 100644 --- a/docs/guides/hardware/aqc_bridge_vlan.md +++ b/docs/guides/hardware/aqc_bridge_vlan.md @@ -25,3 +25,5 @@ You can disable VLAN filtering with one command: nmcli con modify enp1s0 ethtool.feature-rx-vlan-filter off Replace `enp1s0` with the name of your AQC-based NIC. + +Finally, you will need to reboot your system. From e335b6cf9019ce0eb070e807a164de5b9747f026 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Fri, 18 Jul 2025 10:30:09 -0700 Subject: [PATCH 070/164] New Crowdin updates (#2789) * New translations aqc_bridge_vlan.md (French) * New translations disa_stig_part3.md (Italian) * New translations 10_0.md (German) * New translations nerd_fonts.md (Italian) * New translations marksman.md (Italian) * New translations 00-toc.md (Italian) * New translations 10-automating.md (Italian) * New translations aqc_bridge_vlan.md (German) * New translations aqc_bridge_vlan.md (French) * New translations aqc_bridge_vlan.md (German) * New translations rockydocs_formatting.md (Italian) * New translations 1_regular_expressions_vs_wildcards.md (Italian) * New translations 3_sed_command.md (Italian) * New translations 4_awk_command.md (Italian) * New translations 01-files-servers.md (Italian) * New translations 03-application-servers.md (Italian) * New translations 07-high-availability.md (Italian) * New translations 02-web-servers-intro.md (Italian) * New translations 021-web-servers-apache.md (Italian) * New translations rsync_ssh.md (Italian) * New translations tar.md (Italian) * New translations 041-database-servers-mariadb.md (Italian) * New translations 042-database-servers-mysql.md (Italian) * New translations 043-database-servers-replication.md (Italian) * New translations 052-load-balancer-proxies-varnish.md (Italian) * New translations 053-load-balancer-proxies-squid.md (Italian) * New translations database_mariadb-server.md (Italian) * New translations knot_authoritative_dns.md (Italian) * New translations nsd_authoritative_dns.md (Italian) * New translations unbound_recursive_dns.md (Italian) * New translations micro.md (Italian) --- docs/books/disa_stig/disa_stig_part3.it.md | 2 +- docs/books/incus_server/00-toc.it.md | 2 +- docs/books/incus_server/10-automating.it.md | 4 +- docs/books/nvchad/marksman.it.md | 2 +- docs/books/nvchad/nerd_fonts.it.md | 2 +- .../1_regular_expressions_vs_wildcards.it.md | 2 +- docs/books/sed_awk_grep/3_sed_command.it.md | 2 +- docs/books/sed_awk_grep/4_awk_command.it.md | 6 +- .../books/web_services/01-files-servers.it.md | 2 +- .../web_services/02-web-servers-intro.it.md | 2 +- .../web_services/021-web-servers-apache.it.md | 2 +- .../web_services/03-application-servers.it.md | 19 +- .../041-database-servers-mariadb.it.md | 12 +- .../042-database-servers-mysql.it.md | 4 +- .../043-database-servers-replication.it.md | 2 +- .../052-load-balancer-proxies-varnish.it.md | 6 +- .../053-load-balancer-proxies-squid.it.md | 22 +- .../web_services/07-high-availability.it.md | 16 +- docs/guides/backup/rsync_ssh.it.md | 120 ++++--- docs/guides/backup/tar.it.md | 333 ++++++++++++++++++ .../contribute/rockydocs_formatting.it.md | 32 +- .../database/database_mariadb-server.it.md | 102 +++--- docs/guides/dns/knot_authoritative_dns.it.md | 132 +++++++ docs/guides/dns/nsd_authoritative_dns.it.md | 198 +++++++++++ docs/guides/dns/unbound_recursive_dns.it.md | 101 ++++++ docs/guides/editors/micro.it.md | 26 +- docs/guides/hardware/aqc_bridge_vlan.de.md | 29 ++ docs/guides/hardware/aqc_bridge_vlan.fr.md | 29 ++ docs/release_notes/10_0.de.md | 4 +- 29 files changed, 1034 insertions(+), 181 deletions(-) create mode 100644 docs/guides/backup/tar.it.md create mode 100644 docs/guides/dns/knot_authoritative_dns.it.md create mode 100644 docs/guides/dns/nsd_authoritative_dns.it.md create mode 100644 docs/guides/dns/unbound_recursive_dns.it.md create mode 100644 docs/guides/hardware/aqc_bridge_vlan.de.md create mode 100644 docs/guides/hardware/aqc_bridge_vlan.fr.md diff --git a/docs/books/disa_stig/disa_stig_part3.it.md b/docs/books/disa_stig/disa_stig_part3.it.md index 776e84f5f2..7b0bf3c88a 100644 --- a/docs/books/disa_stig/disa_stig_part3.it.md +++ b/docs/books/disa_stig/disa_stig_part3.it.md @@ -440,4 +440,4 @@ Require not host phishers.example.com ## Informazioni sull'autore -Scott Shinn è il CTO per Atomicorp e fa parte del team Rocky Linux Security. Dal 1995 si occupa di sistemi informativi federali presso la Casa Bianca, il Dipartimento della Difesa e l'Intelligence Community. Parte di questo è stata la creazione degli STIG e l'obbligo di usarli, e mi dispiace molto per questo. +Scott Shinn è il CTO di Atomicorp e fa parte del team Rocky Linux Security. Dal 1995 si occupa di sistemi informativi federali presso la Casa Bianca, il Dipartimento della Difesa e l'Intelligence Community. Parte di questo è stata la creazione degli STIG e l'obbligo di usarli, e mi dispiace molto per questo. diff --git a/docs/books/incus_server/00-toc.it.md b/docs/books/incus_server/00-toc.it.md index 74241c1ae9..7042afa6c0 100644 --- a/docs/books/incus_server/00-toc.it.md +++ b/docs/books/incus_server/00-toc.it.md @@ -1,6 +1,6 @@ --- title: Introduzione -author: Spencer Steven +author: Steven Spencer contributors: Ezequiel Bruni, Ganna Zhyrnova tested_with: 9.4 tags: diff --git a/docs/books/incus_server/10-automating.it.md b/docs/books/incus_server/10-automating.it.md index f2087d2512..59e32ea3af 100644 --- a/docs/books/incus_server/10-automating.it.md +++ b/docs/books/incus_server/10-automating.it.md @@ -1,6 +1,6 @@ --- title: 10 Automazione delle Snapshot -author: Spencer Steven +author: Steven Spencer contributors: Ezequiel Bruni, Ganna Zhyrnova tested_with: 9.4 tags: @@ -9,7 +9,7 @@ tags: - incus automation --- -Nel corso di questo capitolo, è necessario essere l'utente root o essere in grado di eseguire con i privilegi di root con sudo. +Nel corso di questo capitolo, è necessario essere l'utente root o essere in grado di eseguire con i privilegi di root con `sudo`. L'automazione del processo di snapshot rende le cose molto più facili. diff --git a/docs/books/nvchad/marksman.it.md b/docs/books/nvchad/marksman.it.md index 658e119799..ba6d670708 100644 --- a/docs/books/nvchad/marksman.it.md +++ b/docs/books/nvchad/marksman.it.md @@ -1,6 +1,6 @@ --- title: Marksman -author: Franco Colussi +author: Fanco Colussi contributors: Steven Spencer, Ganna Zhyrnova tested with: 8.8, 9.2 tags: diff --git a/docs/books/nvchad/nerd_fonts.it.md b/docs/books/nvchad/nerd_fonts.it.md index 02274d219f..ecbdef1e80 100644 --- a/docs/books/nvchad/nerd_fonts.it.md +++ b/docs/books/nvchad/nerd_fonts.it.md @@ -29,7 +29,7 @@ https://www.nerdfonts.com/font-downloads L'installazione dei Nerd Fonts in Rocky Linux si effettua interamente dalla riga di comando grazie all'implementazione della procedura fornita dal repository del progetto [ryanoasis/nerd-fonts](https://github.com/ryanoasis/nerd-fonts). La procedura utilizza *git* per recuperare i font necessari e *fc-cache* per la loro configurazione. -!!! Note "Nota" +!!! Note Questo metodo può essere usato su tutte le distribuzioni *linux* che usano [fontconfig](https://www.freedesktop.org/wiki/Software/fontconfig/) per la gestione dei font di sistema. diff --git a/docs/books/sed_awk_grep/1_regular_expressions_vs_wildcards.it.md b/docs/books/sed_awk_grep/1_regular_expressions_vs_wildcards.it.md index c467e6258c..4913364fd8 100644 --- a/docs/books/sed_awk_grep/1_regular_expressions_vs_wildcards.it.md +++ b/docs/books/sed_awk_grep/1_regular_expressions_vs_wildcards.it.md @@ -46,7 +46,7 @@ Comandi differenti prevedono diversi stili di wildcard: - `mv`: accetta tutti gli stili di wildcard - `cp`: accetta tutti gli stili di wildcard -Per esempio: +Ad esempio: ```bash Shell > mkdir -p /root/dir{1..3} diff --git a/docs/books/sed_awk_grep/3_sed_command.it.md b/docs/books/sed_awk_grep/3_sed_command.it.md index 02b9aacd72..4b6fc6b838 100644 --- a/docs/books/sed_awk_grep/3_sed_command.it.md +++ b/docs/books/sed_awk_grep/3_sed_command.it.md @@ -26,7 +26,7 @@ sed [OPTION]... {script-only-if-no-other-script} [input-file]... | :-----: | :--------------------------------------------------------------------------- | | -n | Visualizza a video le righe di testo che saranno elaborate dal comando `sed` | | -e | Esegue più comandi `sed` ai dati della riga di testo di input | -| -f | Chiama ed esegue il file di script con i comandi per `sed` | +| -t | Chiama ed esegue il file di script con i comandi per `sed` | | -i | Modifica il file di origine | | -r | Espressione regolare | diff --git a/docs/books/sed_awk_grep/4_awk_command.it.md b/docs/books/sed_awk_grep/4_awk_command.it.md index 585f6da49b..20c982c9fe 100644 --- a/docs/books/sed_awk_grep/4_awk_command.it.md +++ b/docs/books/sed_awk_grep/4_awk_command.it.md @@ -168,7 +168,7 @@ a b c d 1 2 3 4 ``` -Nel sistema operativo RockyLinux non esiste il comando `print`. Si può usare `print` solo in `awk` e la sua differenza rispetto a `printf` è che aggiunge automaticamente una newline alla fine di ogni riga. Per esempio: +Nel sistema operativo RockyLinux non esiste il comando `print`. Si può usare `print` solo in `awk` e la sua differenza rispetto a `printf` è che aggiunge automaticamente una newline alla fine di ogni riga. Ad esempio: ```bash Shell > awk '{printf $1 "\t" $2"\n"}' /tmp/printf.txt @@ -858,7 +858,7 @@ False 9 ``` - !!! question "Domanda" + !!! domanda ``` **Perché?** @@ -1824,7 +1824,7 @@ Come la maggior parte dei linguaggi di programmazione, `awk` supporta anche gli | print | Stampare il risultato | | printf | Vedere la sezione relativa a questo comando in questo documento | | system(cmd-line) | Esegue il comando e restituisce il codice di stato. 0 indica che il comando è stato eseguito con successo; non-0 indica che l'esecuzione non è riuscita | -| print ... >> file | Redirezione Output | +| print ... >> file | Redirezione output | | print ... \\| command | Stampare l'output e utilizzarlo come input per il comando | 1. getline diff --git a/docs/books/web_services/01-files-servers.it.md b/docs/books/web_services/01-files-servers.it.md index 688fdeaceb..6e64a642e1 100644 --- a/docs/books/web_services/01-files-servers.it.md +++ b/docs/books/web_services/01-files-servers.it.md @@ -7,7 +7,7 @@ tags: - sftp --- -!!! info "Informazione" +!!! info ``` Il contenuto di questa pagina deve ancora essere scritto. diff --git a/docs/books/web_services/02-web-servers-intro.it.md b/docs/books/web_services/02-web-servers-intro.it.md index 32929723d5..ad5c724812 100644 --- a/docs/books/web_services/02-web-servers-intro.it.md +++ b/docs/books/web_services/02-web-servers-intro.it.md @@ -52,7 +52,7 @@ x-vercel-id: cdg1::pdqbh-1718971524213-4892bf82d7b2 content-length: 154696 ``` -!!! NOTE "Nota" +!!! NOTE ``` Imparare a usare il comando `curl` sarà molto utile per la risoluzione dei problemi sui server in futuro. diff --git a/docs/books/web_services/021-web-servers-apache.it.md b/docs/books/web_services/021-web-servers-apache.it.md index d9094a58d9..7ce8cef67f 100644 --- a/docs/books/web_services/021-web-servers-apache.it.md +++ b/docs/books/web_services/021-web-servers-apache.it.md @@ -563,7 +563,7 @@ $ elinks http://127.0.0.1/manual È un comando molto utile con l'opzione `-t` o `configtest`, che esegue un test della sintassi del file di configurazione. -!!! NOTE "Nota" +!!! NOTE ``` È molto utile se usato con i gestori di Ansible per testare la configurazione. diff --git a/docs/books/web_services/03-application-servers.it.md b/docs/books/web_services/03-application-servers.it.md index 9b71931d45..2b774635a9 100644 --- a/docs/books/web_services/03-application-servers.it.md +++ b/docs/books/web_services/03-application-servers.it.md @@ -49,7 +49,7 @@ PHP-FPM, **oltre a prestazioni migliori**, porta: - Gestione del registro, - Gestione dinamica dei processi e riavvio senza interruzione del servizio ('graceful'). -!!! Note "Nota" +!!! Note ``` Poiché Apache ha un modulo PHP, php-fpm è più comunemente usato su un server Nginx. @@ -59,7 +59,7 @@ Poiché Apache ha un modulo PHP, php-fpm è più comunemente usato su un server Rocky Linux, come il suo upstream, offre molte versioni del linguaggio. Alcuni di essi hanno raggiunto la fine del loro ciclo di vita, ma vengono mantenuti per continuare a ospitare applicazioni storiche che non sono ancora compatibili con le nuove versioni di PHP. Fare riferimento alla pagina [versioni supportate](https://www.php.net/supported-versions.php) del sito php.net per scegliere una versione supportata. -Per ottenere un elenco delle versioni disponibili, basta inserire il seguente comando: +Per ottenere un elenco delle versioni disponibili, digitate il seguente comando: \=== "Elenco dei moduli PHP 9.3" @@ -262,7 +262,8 @@ sudo dnf install php-fpm Poiché php-fpm è un servizio dal punto di vista del sistema, è necessario attivarlo e avviarlo: ```bash -sudo systemctl enable --now php-fpm +sudo systemctl enable php-fpm +sudo systemctl start php-fpm sudo systemctl status php-fpm ``` @@ -278,7 +279,7 @@ error_log = /var/log/php-fpm/error.log daemonize = yes ``` -!!! Note "Nota" +!!! Note ``` I file di configurazione di php-fpm sono ampiamente commentati. Andate a dare un'occhiata! @@ -329,7 +330,7 @@ O con un socket UNIX: `listen = /run/php-fpm/www.sock`. -!!! Note "Nota" +!!! Note ``` L'uso di un socket quando il server web e il server PHP si trovano sulla stessa macchina elimina il livello TCP/IP e ottimizza le prestazioni. @@ -372,7 +373,7 @@ Per impostazione predefinita, il valore di `pm.max_requests` è 0, il che signif Una terza modalità di funzionamento è la modalità `ondemand`. Questa modalità avvia un processo solo quando riceve una richiesta. Non è una modalità ottimale per i siti con forti influenze ed è riservata a esigenze specifiche (siti con richieste deboli, backend gestionale, ecc.). -!!! Note "Nota" +!!! Note ``` La configurazione della modalità operativa di PHP-FPM è essenziale per garantire il funzionamento ottimale del server web. @@ -507,7 +508,7 @@ Questo vi darà un'idea abbastanza precisa dell'ingombro medio della memoria di Il resto di questo documento comporta un ingombro di memoria di 120 MB per processo a pieno carico. -Su un server con 8 Gb di RAM, mantenendo 1 Gb per il sistema e 1 Gb per la OPCache (si veda il resto di questo documento), rimangono 6 Gb per elaborare le richieste PHP dei client. +Su un server con 8Gb di RAM, mantenendo 1Gb per il sistema e 1Gb per la OPCache (vedere il resto di questo documento), rimangono 6Gb per elaborare le richieste PHP dei client. Si può concludere che questo server può accettare al massimo **50 thread** `((6*1024) / 120)`. @@ -562,13 +563,13 @@ Dove: Per configurare l'opcache, fare riferimento a una pagina `info.php` (compresa la `phpinfo();`) (si vedano, per esempio, i valori di `Cached scripts` e `Cached strings`). -!!! Note "Nota" +!!! Note ``` A ogni nuova distribuzione di nuovo codice, sarà necessario svuotare la opcache (ad esempio riavviando il processo php-fpm). ``` -!!! Note "Nota" +!!! Note ``` Non sottovalutate l'aumento di velocità che si può ottenere impostando e configurando correttamente l'opcache. diff --git a/docs/books/web_services/041-database-servers-mariadb.it.md b/docs/books/web_services/041-database-servers-mariadb.it.md index 2259672c3a..8d105b3517 100644 --- a/docs/books/web_services/041-database-servers-mariadb.it.md +++ b/docs/books/web_services/041-database-servers-mariadb.it.md @@ -170,7 +170,7 @@ sudo mariadb-secure-installation Lo script chiederà di fornire una password per l'utente root. -!!! NOTE "Nota" +!!! NOTE ```` The `mysql_secure_installation` command is now a symlink to the `mariadb-secure-installation` command: @@ -195,7 +195,7 @@ Assicurarsi che le autorizzazioni siano abbastanza restrittive da consentire l'a chmod 600 ~/.my.cnf ``` -!!! WARNING "Attenzione" +!!! WARNING ``` Questo non è il modo migliore. Esiste un'altra soluzione più sicura della memorizzazione di una password in testo normale. A partire da MySQL 5.6.6, è ora possibile memorizzare le credenziali di accesso in un `.mylogin.cnf` criptato, grazie al comando `mysql_config_editor`. @@ -208,7 +208,7 @@ sudo firewall-cmd --zone=public --add-service=mysql sudo firewall-cmd --reload ``` -!!! NOTE "Nota" +!!! NOTE ``` La migliore sicurezza consiste nel non aprire il server del database al mondo esterno (se il server delle applicazioni è ospitato sullo stesso server) o nel limitare l'accesso solo agli IP autorizzati. @@ -230,7 +230,7 @@ mysql -u user -p [base] | `-p` | Richiede la password. | | `base` | Il nome del database al quale collegarsi. | -!!! NOTE "Nota" +!!! NOTE ```` The `mysql` command is now a symlink to the `mariadb` command: @@ -361,7 +361,7 @@ Durante il processo, l'accesso ai dati è bloccato. mariadb-dump -u root -p DATABASE_NAME > backup.sql ``` -!!! NOTE "Nota" +!!! NOTE ``` Non dimenticare che dopo il ripristino di un backup completo, il ripristino dei file binari (binlog) completa la ricostituzione dei dati. @@ -408,7 +408,7 @@ mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin ... ``` -Attivare e avviare il servizio con il seguente comando: +Abilitare ed avviare il servizio: ```bash $ sudo systemctl enable mariadb --now diff --git a/docs/books/web_services/042-database-servers-mysql.it.md b/docs/books/web_services/042-database-servers-mysql.it.md index 0e84c312bf..9e07c4f444 100644 --- a/docs/books/web_services/042-database-servers-mysql.it.md +++ b/docs/books/web_services/042-database-servers-mysql.it.md @@ -16,7 +16,7 @@ Sono incluse solo le differenze significative tra le versioni di MariaDB e MySQL --- -**Obiettivi**: si imparerà come: +**Obiettivi**: si imparerà a: :heavy_check_mark: installare, configurare e proteggere il server MariaDB e il server MySQL; @@ -56,7 +56,7 @@ Per installare l'ultima versione del server MySQL, è necessario utilizzare un r Visitare questa pagina: https://dev.mysql.com/downloads/repo/yum/ e copiare l'URL del repository. -Per esempio: +Ad esempio: ```bash sudo dnf install -y https://dev.mysql.com/get/mysql84-community-release-el9-1.noarch.rpm diff --git a/docs/books/web_services/043-database-servers-replication.it.md b/docs/books/web_services/043-database-servers-replication.it.md index 0e3d92f1c3..bec8c16975 100644 --- a/docs/books/web_services/043-database-servers-replication.it.md +++ b/docs/books/web_services/043-database-servers-replication.it.md @@ -10,7 +10,7 @@ In questo capitolo si apprenderà come configurare server primari e secondari su **** -**Obiettivi**: si imparerà come: +**Obiettivi**: si imparerà a: :heavy_check_mark: Attiva i binlogs nei server; :heavy_check_mark: Configura un server secondario per replicare i dati presenti sul server primario diff --git a/docs/books/web_services/052-load-balancer-proxies-varnish.it.md b/docs/books/web_services/052-load-balancer-proxies-varnish.it.md index 4fb9752286..2b44746699 100644 --- a/docs/books/web_services/052-load-balancer-proxies-varnish.it.md +++ b/docs/books/web_services/052-load-balancer-proxies-varnish.it.md @@ -62,7 +62,7 @@ Se i backend non sono più sufficienti a supportare il carico di lavoro: Una pagina web è spesso composta da HTML (spesso generato dinamicamente da PHP) e da risorse più statiche (JPG, gif, CSS, js e così via) durante la creazione. Diventa subito interessante mettere in cache le risorse memorizzabili (quelle statiche), scaricando molte richieste dai backend. -!!! NOTE "Nota" +!!! NOTE ``` Il caching delle pagine web (HTML, PHP, ASP, JSP, ecc.) è possibile ma più complicata. È necessario conoscere l'applicazione e sapere se le pagine sono memorizzabili nella cache, cosa che dovrebbe essere vera con un'API REST. @@ -167,7 +167,7 @@ Questo comporta la compilazione del file di configurazione VCL in C. Se la compi varnishd -C -f /etc/varnish/default.vcl ``` -!!! NOTE "Nota" +!!! NOTE ``` È consigliabile controllare la sintassi del VCL prima di riavviare il daemon `varnishd`. @@ -183,7 +183,7 @@ systemctl reload varnishd Un `systemctl restart varnishd` svuota la cache di varnish e causa un picco di carico sui backend. Si dovrebbe quindi evitare di ricaricare `varnishd`. -!!! NOTE "Nota" +!!! NOTE ``` Per configurare Varnish, seguire le raccomandazioni riportate in questa pagina: . diff --git a/docs/books/web_services/053-load-balancer-proxies-squid.it.md b/docs/books/web_services/053-load-balancer-proxies-squid.it.md index 360e606a2c..bf9e4e4869 100644 --- a/docs/books/web_services/053-load-balancer-proxies-squid.it.md +++ b/docs/books/web_services/053-load-balancer-proxies-squid.it.md @@ -14,7 +14,7 @@ Questo capitolo illustra Squid, la cache proxy HTTP. **** -**Obiettivi**: si imparerà come: +**Obiettivi**: Imparerete a: :heavy_check_mark: installare squid\ :heavy_check_mark: configurarlo come un proxy e memorizzare il contenuto HTTP. @@ -41,7 +41,7 @@ Due firewall proteggono la workstation client ma non comunicano mai direttamente ![Proxy-based architecture](img/squid-architecture-proxy.png) -!!! Note "Nota" +!!! Note ``` Questa architettura richiede la configurazione del browser sulla workstation client. @@ -53,7 +53,7 @@ La configurazione avviene a livello del gateway, che riceve le richieste dei cli ![Captive proxy-based architecture](img/squid-architecture-proxy-captif.png) -!!! Note "Nota" +!!! Note ``` Questa architettura richiede una configurazione specifica sul router. @@ -82,7 +82,7 @@ Tra i vantaggi vi sono i seguenti: - Ottimizzazione della larghezza di banda - Controllo Sicurezza -!!! Note "Nota" +!!! Note ``` L'implementazione dell'autenticazione blocca molti degli effetti dannosi dei virus sulla LAN. @@ -130,7 +130,7 @@ I vantaggi dell'installazione di una soluzione basata sul server Squid: - Utilizzo di dispositivi di storage veloci per la cache - La RAM e la CPU devono essere dimensionate correttamente -!!! Note "Nota" +!!! Note ``` Consentire 14 MB di RAM per ogni GB di cache del disco. @@ -189,7 +189,7 @@ Configurare Squid su `/etc/squid/squid.conf`. http_port num_port ``` -!!! Note "Nota" +!!! Note ``` La porta è impostata di default su 3128, ma spesso viene modificato in 8080. Ricordarsi di aprire la porta corrispondente del firewall! @@ -203,13 +203,13 @@ Al riavvio del servizio, il server Squid si metterà in ascolto sulla porta defi cache_mem taille KB|taille MB|taille GB ``` -Per esempio: +Ad esempio: ```bash cache_mem 1 GB ``` -!!! Tip "Suggerimento" +!!! Tip ``` Best practice: allocare 1/3 della RAM totale @@ -221,7 +221,7 @@ L' Internet Cache Protocol (ICP) consente ai server Squid vicini di scambiarsi l La direttiva `icp_port` definisce la porta che Squid utilizza per inviare e ricevere richieste ICP dai server Squid vicini. -!!! Tip "Suggerimento" +!!! Tip ``` Impostare a 0 per disattivarlo. @@ -283,7 +283,7 @@ Esempio: visible_hostname proxysquid ``` -!!! Note "Nota" +!!! Note ``` Il valore fornito può essere diverso dal nome dell'host. @@ -450,7 +450,7 @@ Scomposizione di un record di log: | Peer Code | Codice di risposta interproxy | | File type | Tipo di mime della richiesta di destinazione | -### Sicurezza +### Controllo Sicurezza Il firewall deve essere aperto per la porta di ascolto: diff --git a/docs/books/web_services/07-high-availability.it.md b/docs/books/web_services/07-high-availability.it.md index d1bca5dbcb..84e35a91e3 100644 --- a/docs/books/web_services/07-high-availability.it.md +++ b/docs/books/web_services/07-high-availability.it.md @@ -76,7 +76,7 @@ In questo capitolo viene illustrato Pacemaker, una soluzione di clustering. **** -**Obiettivi**: si imparerà come: +**Obiettivi**: si imparerà a: :heavy_check_mark: installare e configurare un cluster Pacemaker;\ :heavy_check_mark: amministrare un cluster Pacemaker. @@ -150,7 +150,7 @@ Può gestire cluster con più di 16 modalità attive/passiva o attiva/attiva. La tecnologia Heartbeat è più limitata rispetto a Corosync. È impossibile creare un cluster di più di due nodi e le sue regole di gestione sono meno sofisticate di quelle del suo concorrente. -!!! NOTE "Nota" +!!! NOTE ``` La scelta di pacemaker/corosync sembra oggi più appropriata, poiché è la scelta predefinita per le distribuzioni RedHat, Debian e Ubuntu. @@ -248,7 +248,7 @@ sudo firewall-cmd --permanent --add-service=high-availability sudo firewall-cmd --reload ``` -!!! NOTE "Nota" +!!! NOTE ``` Non avviare ora i servizi, poiché non sono configurati e non funzioneranno. @@ -260,7 +260,7 @@ Il package `pcs` fornisce gli strumenti di gestione del cluster. Il comando `pcs La configurazione del cluster può essere fatta a mano, ma il pacchetto pcs rende la gestione (creazione, configurazione e risoluzione dei problemi) di un cluster molto più semplice! -!!! NOTE "Nota" +!!! NOTE ``` Ci sono altre alternative a pcs. @@ -285,7 +285,7 @@ Su tutti i nodi, assegnare una password identica all'utente hacluster: echo “pwdhacluster” | sudo passwd --stdin hacluster ``` -!!! NOTE "Nota" +!!! NOTE ``` “pwdhacluster” è di esempio, sostituirla con una password più sicura. @@ -324,7 +324,7 @@ server2: successful distribution of the file 'corosync.conf' Cluster has been successfully set up. ``` -!!! NOTE "Nota" +!!! NOTE ``` Il comando pcs cluster setup gestisce il problema del quorum per i cluster a due nodi. Un cluster di questo tipo funzionerà quindi correttamente in caso di guasto di uno dei due nodi. Se si configura Corosync manualmente o si usa un'altra shell di gestione del cluster, è necessario configurare Corosync correttamente. @@ -395,7 +395,7 @@ Per prima cosa, si disabilita `stonith` finché non si imparerà a configurarlo: sudo pcs property set stonith-enabled=false ``` -!!! WARNING "Attenzione" +!!! WARNING ``` Fare attenzione a non lasciare `stonith` disabilitato in un ambiente di produzione! @@ -528,7 +528,7 @@ sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --reload ``` -!!! WARNING "Attenzione" +!!! WARNING ``` Non avviare o attivare il servizio da soli. Se ne occuperà il Pacemaker. diff --git a/docs/guides/backup/rsync_ssh.it.md b/docs/guides/backup/rsync_ssh.it.md index 08ee9fe253..e2846cd8ae 100644 --- a/docs/guides/backup/rsync_ssh.it.md +++ b/docs/guides/backup/rsync_ssh.it.md @@ -7,8 +7,6 @@ tags: - rsync --- -# Usare `rsync` per mantenere sincronizzate due macchine - ## Prerequisiti Ecco tutto ciò di cui avrete bisogno per capire e seguire questa guida: @@ -16,34 +14,36 @@ Ecco tutto ciò di cui avrete bisogno per capire e seguire questa guida: - Una macchina con Rocky Linux. - Essere a proprio agio con la modifica dei file di configurazione dalla riga di comando - Conoscenza dell'uso di un editor a riga di comando (qui si usa _vi_, ma si può usare il proprio editor preferito) -- È necessario avere accesso a root e, idealmente, essere registrati come utente root nel proprio terminale +- È necessario disporre dell'accesso root o dei privilegi `sudo` - Coppia di chiavi SSH Pubbliche e Private. -- In grado di creare uno script bash con `vi` o con il vostro editor preferito e di testarlo. -- In grado di utilizzare _crontab_ per automatizzare l'esecuzione dello script. +- È possibile creare uno script bash con `vi` o con il proprio editor preferito e testarlo. +- In grado di utilizzare `crontab` per automatizzare l'esecuzione dello script ## Introduzione -L'uso di `rsync` su SSH non è né potente come [lsyncd](../backup/mirroring_lsyncd.md) (che consente di monitorare una directory o un file per le modifiche e di mantenerlo sincronizzato in tempo reale), né flessibile come [rsnapshot](../backup/rsnapshot_backup.md) (che offre la possibilità di eseguire il backup di più destinazioni da una singola macchina). Tuttavia, offre la possibilità di mantenere aggiornati due computer in base a una pianificazione definita dall'utente. +L'uso di `rsync` su SSH non è potente come [lsyncd](../backup/mirroring_lsyncd.md) (che consente di osservare una directory o un file per le modifiche e di mantenerlo sincronizzato in tempo reale), né flessibile come [rsnapshot](../backup/rsnapshot_backup.md) (che offre la possibilità di eseguire il backup di più obiettivi da un singolo computer). Tuttavia, consente di tenere aggiornati due computer secondo un programma definito dall'utente. Se avete bisogno di mantenere aggiornata una serie di directory sul computer di destinazione e non vi interessa la sincronizzazione in tempo reale come caratteristica, allora `rsync` su SSH è probabilmente la soluzione migliore. -Per questa procedura, si opererà come utente root. Effettuate il login come root o utilizzate il comando `sudo -s` per passare all'utente root nel vostro terminale. +Per questa procedura, si opererà come utente root. Accedere come root o usare il comando `sudo -s` per passare all'utente root nel terminale. ### Installazione di `rsync` -Anche se probabilmente `rsync` è già installato, è meglio aggiornare `rsync` alla versione più recente sui computer di origine e di destinazione. Per assicurarsi che `rsync` sia aggiornato, eseguire le seguenti operazioni su entrambi i computer: +Anche se probabilmente `rsync` è già installato. Per assicurarsi che `rsync` sia aggiornato, eseguire le seguenti operazioni su entrambi i computer: -`dnf install rsync` +```bash +dnf install rsync +``` -Se il pacchetto non è installato, `dnf` chiederà di confermare l'installazione; se è già installato, `dnf` cercherà un aggiornamento e chiederà di installarlo. +Se il pacchetto non è installato, `dnf` chiederà di confermare l'installazione. Se è già installato, `dnf` cercherà un aggiornamento e chiederà di installarlo. ### Preparazione dell'Ambiente -Questo particolare esempio utilizzerà `rsync` sul computer di destinazione per prelevare dall'origine invece di spingere dall'origine alla destinazione. È necessario impostare una [coppia di chiavi SSH](../security/ssh_public_private_keys.md) per questo scopo. Una volta creata la coppia di chiavi SSH e confermato l'accesso senza password dal computer di destinazione al computer di origine, si può iniziare. +Questo esempio utilizzerà `rsync` sul computer di destinazione per prelevare dall'origine invece di spingere dall'origine alla destinazione. A tale scopo è necessario impostare una [coppia di chiavi SSH](../security/ssh_public_private_keys.md). Dopo aver creato la coppia di chiavi SSH, verificare l'accesso senza password dal computer di destinazione al computer di origine. ### parametri di `rsync` e impostazione di uno script -Prima di lasciarsi prendere la mano con l'impostazione di uno script, è necessario decidere quali parametri utilizzare con `rsync`. Ci sono molte possibilità, quindi date un'occhiata al [manuale di rsync](https://linux.die.net/man/1/rsync). Il modo più comune di usare `rsync` è quello di usare l'opzione `-a`, perché `-a`, o archivio, combina una serie di opzioni in una sola e queste sono opzioni molto comuni. Che cosa include -a? +Prima di continuare la configurazione dello script, è necessario decidere quali parametri utilizzare con `rsync`. Esistono molte possibilità. Per un elenco completo, consultare il [manuale di rsync](https://linux.die.net/man/1/rsync). Il modo più comune di usare `rsync` è quello di usare l'opzione `-a` perché `-a`, o “archivio”, combina diverse opzioni comuni. Cosa include `-a`? - `-r`, ricorre le directory - `-l`, mantiene i collegamenti simbolici come collegamenti simbolici @@ -56,72 +56,96 @@ Prima di lasciarsi prendere la mano con l'impostazione di uno script, è necessa Le uniche altre opzioni da specificare in questo esempio sono: - `-e`, specifica la shell remota da utilizzare -- `--delete`, che dice che se nella directory di destinazione c'è un file che non esiste nella sorgente, bisogna eliminarlo +- `--delete`, che dice che se la directory di destinazione contiene un file che non esiste nella sorgente, bisogna eliminarlo -Successivamente, dobbiamo impostare uno script creando un file per esso (ancora una volta, utilizzate il vostro editor preferito se non avete familiarità con vi). Per creare il file, basta usare questo comando: +Quindi, impostate uno script sul computer di destinazione creando un file apposito (ancora una volta, utilizzate il vostro editor preferito se non avete familiarità con `vi`). Per creare il file, utilizzare questo comando: -`vi /usr/local/sbin/rsync_dirs` +```bash +vi /usr/local/sbin/rsync_dirs +``` -E poi renderlo eseguibile: +Aggiungere il contenuto: -`chmod +x /usr/local/sbin/rsync_dirs` +```bash +#!/usr/bin/env bash +/usr/bin/rsync -ae ssh --delete root@source.domain.com:/home/your_user /home +``` -## Impostazioni +Sostituire “source.domain.com” con il nome di dominio, il nome host o l'indirizzo IP. -Ora, lo scripting lo rende super semplice e sicuro, in modo da poterlo testare senza timore. Si noti che l'URL utilizzato di seguito è "source.domain.com". Sostituirlo con il dominio o l'indirizzo IP del proprio computer di origine, entrambi funzionano. Ricordate inoltre che in questo esempio lo script viene creato sul computer "di destinazione", perché il file viene estratto dal computer di origine: +E poi renderlo eseguibile: ```bash -#!/bin/bash -/usr/bin/rsync -ae ssh --delete root@source.domain.com:/home/your_user /home +chmod +x /usr/local/sbin/rsync_dirs ``` +## Impostazioni + +Lo scripting consente di eseguire i test senza preoccupazioni. + !!! warning "Attenzione" - In questo caso, si presume che la propria home directory non esista sul computer di destinazione. **Se esiste, si consiglia di eseguire un backup prima di eseguire lo script!** + In questo caso, si presuppone che la propria home directory non esista sul computer di destinazione. **Se esiste, si consiglia di eseguire un backup prima di eseguire lo script!** -Ora eseguite lo script: +Eseguire lo script: -`/usr/local/sbin/rsync_dirs` +```bash +/usr/local/sbin/rsync_dirs +``` -Se tutto va bene, si dovrebbe ottenere una copia completamente sincronizzata della propria home directory sul computer di destinazione. Verificate che sia così. +Se tutto va bene, si otterrà una copia sincronizzata della propria home directory sul computer di destinazione. Assicurarsi che sia questo il caso. -Supponendo che tutto questo abbia funzionato come sperato, procedete a creare un nuovo file sul computer di origine nella vostra home directory: +Supponendo che i precedenti passaggi abbiano funzionato, si crei un nuovo file sul computer di origine nella home directory: -`touch /home/your_user/testfile.txt` +```bash +touch /home/your_user/testfile.txt +``` Eseguire nuovamente lo script: -`/usr/local/sbin/rsync_dirs` +```bash +/usr/local/sbin/rsync_dirs +``` -Quindi verificare che il computer di destinazione riceva il nuovo file. In caso affermativo, il passo successivo consiste nel verificare il processo di eliminazione. Cancellare il file appena creato sul computer di origine: +Verificare che il computer di destinazione riceva il nuovo file. In caso affermativo, il passo successivo consiste nel verificare il processo di eliminazione. Cancellare il file appena creato sul computer di origine: -`rm -f /home/your_user/testfile.txt` +```bash +rm -f /home/your_user/testfile.txt +``` Eseguire nuovamente lo script: -`/usr/local/sbin/rsync_dirs` +```bash +/usr/local/sbin/rsync_dirs +``` Verificare che il file non esista più sul computer di destinazione. -Infine, creiamo un file sul computer di destinazione che non esiste sull'origine. Quindi sul target: +Infine, creare un file sul computer di destinazione che non esiste sull'origine: -`touch /home/your_user/a_different_file.txt` +```bash +touch /home/your_user/a_different_file.txt +``` Eseguire lo script un'ultima volta: -`/usr/local/sbin/rsync_dirs` +```bash +/usr/local/sbin/rsync_dirs +``` -Il file appena creato sulla destinazione dovrebbe essere sparito, perché non esiste sulla sorgente. +Il file creato sulla destinazione non dovrebbe più esistere perché non esiste sull'origine. Supponendo che tutto questo abbia funzionato come previsto, modificate lo script per sincronizzare tutte le directory desiderate. -## Automatizzare il Tutto +## Automatizzare il tutto -Non si vuole eseguire manualmente questo script ogni volta che si vuole sincronizzare, quindi il passo successivo è quello di farlo automaticamente. Supponiamo di voler eseguire questo script alle 23:00 di ogni sera. Per automatizzare questa operazione, utilizzare crontab: +È possibile che non si voglia eseguire questo script ogni volta che si desidera effettuare una sincronizzazione manuale. Usare una `crontab` per eseguire questa operazione automaticamente secondo un programma. Eseguire questo script alle 23:00 di ogni sera: -`crontab -e` +```bash +crontab -e +``` -In questo modo si ottiene il cron, che può avere un aspetto simile a questo: +L'aspetto sarà simile a questo: ```bash # Edit this file to introduce tasks to be run by cron. @@ -149,15 +173,19 @@ In questo modo si ottiene il cron, che può avere un aspetto simile a questo: # m h dom mon dow command ``` -Il cron è impostato su un orologio di 24 ore, quindi la voce da inserire in fondo al file è: +!!! info "Informazione" -`00 23 * * * /usr/local/sbin/rsync_dirs` + L'esempio `crontab` mostra un file vuoto ma commentato. Il commento non appare su tutte le istanze del computer e potrebbe essere un file vuoto. Su un computer attivo, è possibile che vengano visualizzate altre voci. -Questo comando deve essere eseguito alle 00 minuti, 23 ore, tutti i giorni, tutti i mesi e tutti i giorni della settimana. Salvare la voce di cron con: +La `crontab` è su un orologio di 24 ore. La voce deve essere inserita in fondo a questo file: -++shift+colon+"w"+"q"+exclam++ +```crontab +00 23 * * * /usr/local/sbin/rsync_dirs +``` -... o con i comandi che il vostro editor preferito utilizza per salvare un file. +Questo dice di eseguire questo comando alle ore 00 e 23 di ogni giorno, di ogni mese e di ogni giorno della settimana. Salvare la voce `crontab` con: + +++shift+colon+"w"+"q"+exclam++ ## Flags opzionali @@ -165,9 +193,9 @@ Questo comando deve essere eseguito alle 00 minuti, 23 ore, tutti i giorni, tutt -n : Esecuzione Dry-Run per vedere quali file verranno trasferiti -v : elenca tutti i file che vengono trasferiti -vvv : per fornire informazioni di debug durante il trasferimento dei file --z : per abilitare la compressione durante il trasferimento +-z : per abilitare la compressione durante il trasferimento ``` ## Conclusioni -Sebbene `rsync` non sia flessibile o potente come altri strumenti, fornisce una semplice sincronizzazione dei file, che è sempre utile. +Sebbene `rsync` non sia flessibile o robusto come altri strumenti, fornisce la sincronizzazione dei file, che è sempre utile. diff --git a/docs/guides/backup/tar.it.md b/docs/guides/backup/tar.it.md new file mode 100644 index 0000000000..5bd9f9b28e --- /dev/null +++ b/docs/guides/backup/tar.it.md @@ -0,0 +1,333 @@ +--- +title: Comando tar +author: tianci li +contributors: Ganna Zhyrnova +tested_with: 8.10 +tags: + - tar + - backup + - archive +--- + +## Panoramica + +`tar` è uno strumento per elaborare i file di archivio su GNU/Linux e altri sistemi operativi UNIX. Sta per “tape archive” (archiviazione su nastro magnetico). + +L'archiviazione dei file su nastro magnetico è stato l'uso iniziale degli archivi tar. Il nome “tar” deriva da questo uso. Nonostante il nome dell'utilità, `tar` può dirigere il suo output verso dispositivi, file o altri programmi disponibili (usando le pipe) e accedere a dispositivi o file remoti (come archivi). + +Il `tar' attualmente utilizzato nei moderni GNU/Linux proveniva inizialmente dal [Progetto GNU](https://www.gnu.org/). È possibile consultare e scaricare tutte le versioni di `tar\` sul [sito web di GNU](https://ftp.gnu.org/gnu/tar/). + +!!! note + +```` +`tar` in distribuzioni diverse può avere opzioni predefinite diverse. Fate attenzione quando le usate. + +```bash +# RockyLinux 8 e Fedora 41 +Shell > tar --show-defaults +--format=gnu -f- -b20 --quoting-style=escape --rmt-command=/etc/rmt --rsh-command=/usr/bin/ssh +``` +```` + +## Usare `tar` + +Quando si usa `tar`, si noti che ha due modalità di salvataggio: + +- **Relative mode** (default): Rimuove il carattere iniziale ‘/’ dal file. Anche se il file è stato aggiunto con un percorso assoluto, `tar` rimuoverà il carattere iniziale “/” in questa modalità. +- **Absolute mode**: Mantiene il carattere iniziale ‘/’ e lo include nel percorso del file. È necessario utilizzare l'opzione \`-P' per attivare questa modalità di archiviazione. In questa modalità, tutti i file devono essere rappresentati come percorsi assoluti. Per motivi di sicurezza, nella maggior parte dei casi non si dovrebbe utilizzare questa modalità di salvataggio, a meno che non vi siano requisiti particolari. + +Quando si usa `tar`, si incontrano suffissi come `.tar.gz`, `.tar.xz` e `.tar.bz2`, che indicano che prima la creazione di un archivio (classificando i file correlati come un singolo file) e si e' compresso il file con il tipo o l'algoritmo di compressione specifico. + +Il tipo di compressione o algoritmo può essere gzip, bzip2, xz, zstd o un altro. + +`tar` consente di estrarre un singolo file o una directory da un backup, di visualizzarne il contenuto o di convalidarne l'integrità. + +La sintassi per la creazione di un archivio e relativa compressione è: + +- `tar [option] [PATH] [DIR1] ... [FILE1] ...`. Ad es., `tar -czvf /tmp/Fullbackup-20241201.tar.gz /etc/ /var/log/` + +La sintassi per estrarre un file da un archivio è: + +- `tar [option] [PATH] -C [dir]`. Ad es., `tar -xzvf /tmp/Fullbackup-20241201.tar.gz -C /tmp/D1` + +!!! tip "antic" + +Quando si estraggono file da file archiviati, `tar` seleziona automaticamente il tipo di compressione in base al suffisso aggiunto manualmente. Ad esempio, per i file `.tar.gz', si può usare direttamente `tar -vxf' senza usare \`tar -zvxf'. +È invece **obbligatorio** selezionare il tipo di compressione per la creazione di file compressi di archivio. + +!!! Note + +``` +In GNU/Linux, la maggior parte dei file non richiede un'estensione, tranne che per l'ambiente desktop (GUI). La ragione dell'aggiunta artificiale di suffissi è quella di facilitare il riconoscimento da parte degli utenti umani. Se l'amministratore di sistema vede un file con estensione `.tar.gz' o `.tgz', ad esempio, sa come trattare il file. +``` + +### Parametri o tipi di funzionamento + +| Parametro | Descrizione | +| :--------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `-A` | Aggiunge tutti i file di un archivio alla fine di un altro archivio. Applicabile solo per archiviare file non compressi del tipo `.tar`. | +| `-c` | Crea un archivio. Spesso utilizzato | +| `-d` | Confronta le differenze tra i file archiviati e quelli corrispondenti non archiviati. | +| `-r` | Aggiunge i file o le directory alla fine dell'archivio. Applicabile solo per archiviare file non compressi del tipo `.tar`. | +| `-t` | Elenca il contenuto dell'archivio | +| `-u` | Aggiunge all'archivio solo i file più recenti. Applicabile solo per archiviare file non compressi del tipo `.tar`. | +| `-x` | Estrazione da un archivio. Spesso utilizzato | +| `--delete` | Cancella file o cartelle dall'archivio ".tar" Applicabile solo per archiviare file non compressi del tipo `.tar`. | + +!!! Tip + +``` +L'autore consiglia di mantenere il prefisso “-” per preservare le abitudini degli utenti riguardo ai tipi di operazione. Naturalmente, non è necessario. I parametri indicano la funzione principale di `tar`. In altre parole, è necessario scegliere uno dei tipi sopra elencati. +``` + +### Opzioni ausiliarie più comuni + +| opzione | Descrizione | +| :-----: | :--------------------------------------------------------------------------------------------------------------------------------------------- | +| `-z` | Usa `gzip` come tipo di compressione. E' applicabile sia per la creazione che l'estrazione degli archivi. | +| `-v` | Visualizza i dettagli dell'elaborazione | +| `-f` | Specifica il nome del file per l'archiviazione (compreso il suffisso del file) | +| `-j` | Usa `bzip2` come tipo di compressione. E' applicabile sia per la creazione che l'estrazione degli archivi. | +| `-J` | Utilizzare `xz` come tipo di compressione. E' applicabile sia per la creazione che l'estrazione degli archivi. | +| `-C` | Salva la posizione dopo l'estrazione dei file dall'archivio | +| `-P` | Salva utilizzando la modalità percorsi assoluti | + +Per altre opzioni ausiliarie non menzionate, vedere `man 1 tar`. + +!!! avviso "Differenza di versione" + +``` +In alcune vecchie versioni di tar, le opzioni sono indicate come "key", il che significa che l'uso di opzioni con il prefisso "-" può far sì che `tar` non funzioni come previsto. A questo punto, è necessario rimuovere il prefisso "-" per farlo funzionare correttamente. +``` + +### Dettaglio sugli stili dei parametri opzione + +`tar` fornisce tre stili dei parametri: + +1. Stile tradizionale: + + - `tar {A|c|d|r|t|u|x}[GnSkUWOmpsMBiajJzZhPlRvwo] [ARG...]`. + +2. L'uso dello stile breve dei parametri è: + + - `tar -A [OPTIONS] ARCHIVE ARCHIVE` + - `tar -c [-f ARCHIVE] [OPTIONS] [FILE...]` + - `tar -d [-f ARCHIVE] [OPTIONS] [FILE...]` + - `tar -t [-f ARCHIVE] [OPTIONS] [MEMBER...]` + - `tar -r [-f ARCHIVE] [OPTIONS] [FILE...]` + - `tar -u [-f ARCHIVE] [OPTIONS] [FILE...]` + - `tar -x [-f ARCHIVE] [OPTIONS] [MEMBER...]` + +3. L'uso dello stile lungo dei parametri è: + + - `tar {--catenate|--concatenate} [OPTIONS] ARCHIVE ARCHIVE` + - `tar --create [--file ARCHIVE] [OPTIONS] [FILE...]` + - `tar {--diff|--compare} [--file ARCHIVE] [OPTIONS] [FILE...]` + - `tar --delete [--file ARCHIVE] [OPTIONS] [MEMBER...]` + - `tar --append [-f ARCHIVE] [OPTIONS] [FILE...]` + - `tar --list [-f ARCHIVE] [OPTIONS] [MEMBER...]` + - `tar --test-label [--file ARCHIVE] [OPTIONS] [LABEL...]` + - `tar --update [--file ARCHIVE] [OPTIONS] [FILE...]` + - `tar --update [-f ARCHIVE] [OPTIONS] [FILE...]` + - `tar {--extract|--get} [-f ARCHIVE] [OPTIONS] [MEMBER...]` + +Il secondo metodo è più comunemente usato ed è in linea con le abitudini della maggior parte degli utenti GNU/Linux. + +### Efficienza di compressione e frequenza di utilizzo + +`tar` non ha capacità di compressione, quindi deve essere usato con altri strumenti di compressione. La compressione e la decompressione influiscono sul consumo di risorse. + +Ecco una classifica della compressione di un insieme di file di testo, dalla meno efficiente alla più efficiente: + +- compress (`.tar.Z`) - meno popolare +- gzip (`.tar.gz` or `.tgz`) - Popolare +- bzip2 (`.tar.bz2` or `.tb2` or `.tbz`) - Popolare +- lzip (`.tar.lz`) - meno popolare +- xz (`.tar.xz`) - Popolare + +### Convenzioni nella nomenclatura di un `tar` + +Ecco alcuni esempi di convenzioni di nomenclatura per gli archivi `tar`: + +| Funzione principale e parametri ausiliari | Files | Suffisso | Funzionalità | +| ----------------------------------------- | ------- | ---------------- | --------------------------------------------------------------- | +| `-cvf` | `home` | `home.tar` | `/home` in modalità relativa, archiviato in forma non compressa | +| `-cvfP` | `/etc` | `etc.A.tar` | `/etc` in modalità percorso assoluto, senza compressione | +| `-cvfz` | `usr` | `usr.tar.gz` | `/usr` in modalità percorso relativo, compressione _gzip_ | +| `-cvfj` | `usr` | `usr.tar.bz2` | `/usr` in modalità percorso relativo, compressione _bzip2_ | +| `-cvfPz` | `/home` | `home.A.tar.gz` | `/home` in modalità percorso assoluto, compressione _gzip_ | +| `-cvfPj` | `/home` | `home.A.tar.bz2` | `/home` in modalità percorso assoluto, compressione _bzip2_ | + +È anche possibile aggiungere la data al nome del file. + +### Esempi + +#### Casi con `-c` + +1. Archivia e comprime **/etc/** in modalità percorso relativo, con un suffisso `.tar.gz`: + + ```bash + Shell > tar -czvf /tmp/etc-20241207.tar.gz /etc/ + ``` + + Poiché `tar` lavora in modalità percorsi relativi per impostazione predefinita, la prima riga dell'output del comando mostrerà quanto segue: + + ```bash + tar: Removing leading '/' from member names + ``` + +2. Archiviazione di **/var/log/** e selezionare il tipo xz per la compressione: + + ```bash + Shell > tar -cJvf /tmp/log-20241207.tar.xz /var/log/ + + Shell > du -sh /var/log/ ; ls -lh /tmp/log-20241207.tar.xz + 18M /var/log/ + -rw-r--r-- 1 root root 744K Dec 7 14:40 /tmp/log-20241207.tar.xz + ``` + +3. Stima delle dimensioni del file senza generare un archivio: + + ```bash + Shell > tar -cJf - /etc | wc -c + tar: Removing leading `/' from member names + 3721884 + ``` + + L'unità di misura del comando `wc -c` è il byte. + +4. Taglia i file \`.tar.gz' di grandi dimensioni: + + ```bash + Shell > cd /tmp/ ; tar -czf - /etc/ | split -d -b 2M - etc-backup20241207.tar.gz. + + Shell > ls -lh /tmp/ + -rw-r--r-- 1 root root 2.0M Dec 7 20:46 etc-backup20241207.tar.gz.00 + -rw-r--r-- 1 root root 2.0M Dec 7 20:46 etc-backup20241207.tar.gz.01 + -rw-r--r-- 1 root root 2.0M Dec 7 20:46 etc-backup20241207.tar.gz.02 + -rw-r--r-- 1 root root 70K Dec 7 20:46 etc-backup20241207.tar.gz.03 + ``` + + Il primo “-” rappresenta i parametri di ingresso di `tar`, mentre il secondo “-” indica a `tar` di reindirizzare l'output a `stdout`. + + Per estrarre questi piccoli file tagliati, si può puntare alla seguente operazione: + + ```bash + Shell > cd /tmp/ ; cat etc-backup20241207.tar.gz.* >> /tmp/etc-backup-20241207.tar.gz + + Shell > cd /tmp/ ; tar -xvf etc-backup-20241207.tar.gz -C /tmp/dir1/ + ``` + +#### Casi con '-x' + +1. Scaricate il codice sorgente di Redis ed estrarlo nella directory `/usr/local/src/`: + + ```bash + Shell > wget -c https://github.com/redis/redis/archive/refs/tags/7.4.1.tar.gz + + Shell > tar -xvf 7.4.1.tar.gz -C /usr/local/src/ + ``` + +2. Estrarre solo un file dal file zip dell'archivio: + + ```bash + Shell > tar -xvf /tmp/etc-20241207.tar.gz etc/chrony.conf + ``` + +#### Casi con '-A' o '-r' + +1. Aggiunge un file `.tar' a un altro file `.tar': + + ```bash + Shell > tar -cvf /tmp/etc.tar /etc/ + + Shell > tar -cvf /tmp/log.tar /var/log/ + + Shell > tar -Avf /tmp/etc.tar /tmp/log.tar + ``` + + Ciò significa che tutti i file in “log.tar” saranno aggiunti alla fine di “etc.tar”. + +2. Aggiunge file o directory a un file `.tar`: + + ```bash + Shell > tar -rvf /tmp/log.tar /etc/chrony.conf + tar: Removing leading `/' from member names + /etc/chrony.conf + tar: Removing leading `/' from hard link targets + + Shell > tar -rvf /tmp/log.tar /tmp/dir1 + ``` + +!!! warning "Attenzione" + +``` +Sia che si utilizzi l'opzione `-A` o `-r`, considerare la modalità di salvataggio dei file di archivio pertinenti. +``` + +!!! warning "Attenzione" + +``` +`-A` e `-r` non sono applicabili ai file compressi archiviati. +``` + +#### Casi con '-t' + +1. Esaminare il contenuto dell'archivio: + + ```bash + Shell > tar -tvf /tmp/log.tar + + Shell > tar -tvf /tmp/etc-20241207.tar.gz | less + ``` + +#### Casi con '-d' + +1. Confrontare le differenze: + + ```bash + Shell > cd / ; tar -dvf /tmp/etc.tar etc/chrony.conf + etc/chrony.conf + + Shell > cd / ; tar -dvf /tmp/etc-20241207.tar.gz etc/ + ``` + + Per i metodi di archiviazione che usano la modalità percorsi relativi, quando si usa il tipo \`-d', cambiare il percorso del file in ‘/’. + +#### Casi con '-u' + +1. Se esistono più versioni dello stesso file, si può usare il parametro `-u`: + + ```bash + Shell > touch /tmp/tmpfile1 + + Shell > tar -rvf /tmp/log.tar /tmp/tmpfile1 + + Shell > echo "File Name" >> /tmp/tmpfile1 + + Shell > tar -uvf /tmp/log.tar /tmp/tmpfile1 + + Shell > tar -tvf /tmp/log.tar + ... + -rw-r--r-- root/root 0 2024-12-07 18:53 tmp/tmpfile1 + -rw-r--r-- root/root 10 2024-12-07 18:54 tmp/tmpfile1 + ``` + +#### Casi con '--delete' + +1. Si può anche usare `--delete` per cancellare i file all'interno di un file `.tar`. + + ```bash + Shell > tar --delete -vf /tmp/log.tar tmp/tmpfile1 + + Shell > tar --delete -vf /tmp/etc.tar etc/motd.d/ + ``` + + Quando si elimina, si eliminano tutti i file con lo stesso nome dall'archivio. + +## Terminologia comune + +Alcuni siti web riportano due termini: + +- **tarfile** - Si riferisce a file di archivio non compressi, come i file `.tar`. +- **tarball** - Si riferisce a file di archivio compressi, come `.tar.gz` e `.tar.xz`. diff --git a/docs/guides/contribute/rockydocs_formatting.it.md b/docs/guides/contribute/rockydocs_formatting.it.md index 26c1951e77..14a3c580b8 100644 --- a/docs/guides/contribute/rockydocs_formatting.it.md +++ b/docs/guides/contribute/rockydocs_formatting.it.md @@ -82,22 +82,22 @@ Un documento può contenere o meno uno di questi elementi. Tuttavia, se ritenete Gli ammonimenti sono speciali "scatole" visive che richiamano l'attenzione su fatti importanti e li evidenziano. I seguenti sono tipi di ammonimenti: -| tipo | Descrizione | -| ------------------ | -------------------------------------------------------------------------- | -| note | visualizza il testo in un riquadro blu | -| abstract | visualizza il testo in un riquadro azzurro | -| info | visualizza il testo in un riquadro blu-verde | -| tip | visualizza il testo in un riquadro blu-verde (icona leggermente più verde) | -| success | visualizza il testo in un riquadro verde | -| question "Domanda" | visualizza il testo in un riquadro verde chiaro | -| warning | visualizza il testo in un riquadro arancione | -| failure | visualizza il testo in un riquadro rosso chiaro | -| danger | visualizza il testo in un riquadro rosso | -| bug | visualizza il testo in un riquadro rosso | -| example | visualizza il testo in un riquadro viola | -| quote | visualizza il testo in una casella grigia | -| custom ^1^ | visualizza sempre il testo in un riquadro blu | -| custom ^2^ | visualizza il testo nel colore del riquadro della tipologia prescelta | +| tipo | Descrizione | +| ---------- | -------------------------------------------------------------------------- | +| note | visualizza il testo in un riquadro blu | +| abstract | visualizza il testo in un riquadro azzurro | +| info | visualizza il testo in un riquadro blu-verde | +| tip | visualizza il testo in un riquadro blu-verde (icona leggermente più verde) | +| success | visualizza il testo in un riquadro verde | +| question | visualizza il testo in un riquadro verde chiaro | +| warning | visualizza il testo in un riquadro arancione | +| failure | visualizza il testo in un riquadro rosso chiaro | +| danger | visualizza il testo in un riquadro rosso | +| bug | visualizza il testo in un riquadro rosso | +| example | visualizza il testo in un riquadro viola | +| quote | visualizza il testo in una casella grigia | +| custom ^1^ | visualizza sempre il testo in un riquadro blu | +| custom ^2^ | visualizza il testo nel colore del riquadro della tipologia prescelta | Gli ammonimenti sono illimitati, come si può notare in custom 1 sopra. Per ottenere il colore del riquadro desiderato per un ammonimento specifica, aggiungete un titolo personalizzato a qualsiasi tipo di ammonimento, come indicato nella precedente sezione 2. diff --git a/docs/guides/database/database_mariadb-server.it.md b/docs/guides/database/database_mariadb-server.it.md index 910707215f..9ba5036270 100644 --- a/docs/guides/database/database_mariadb-server.it.md +++ b/docs/guides/database/database_mariadb-server.it.md @@ -1,8 +1,8 @@ --- title: Server di Database MariaDB author: Steven Spencer -contributors: Ezequiel Bruni, William Perron, Ganna Zhyrnova -tested_with: 8.5, 8.6, 9.0 +contributors: Ezequiel Bruni, William Perron, Ganna Zhyrnova, Joseph Brinkman +tested_with: 8.5, 8.6, 9.0, 9.2 tags: - database - mariadb @@ -12,15 +12,15 @@ tags: ## Prerequisiti -* Un server Rocky Linux -* Saper utilizzare un editor a riga di comando ( in questo esempio si utilizza _vi_) -* Un livello di comfort elevato con l'immissione di comandi dalla riga di comando, la visualizzazione dei log e altri compiti generali di amministratore di sistema -* Una comprensione dei database _mariadb-server_ è utile -* Eseguire tutti i comandi come root o con _sudo_ +- Un server Rocky Linux +- Conoscenza di un editor a riga di comando (in questo esempio si usa *vi*) +- Un livello di comfort elevato con l'immissione di comandi dalla riga di comando, la visualizzazione dei log e altri compiti generali di amministratore di sistema +- È utile la conoscenza dei database *mariadb-server* +- Eseguire tutti i comandi come root o con *sudo* ## Introduzione -Il _mariadb-server_ e il suo client _mariadb_ sono le alternative open source a _mysql-server_ e _mysql_, e condividono la struttura dei comandi. _mariadb-server_ è in esecuzione su molti server web, a causa del popolare [Wordpress CMS](https://wordpress.org/) che lo richiede. Questo database, però, ha molti altri usi. +Il *mariadb-server* e il suo client *mariadb* sono le alternative open source a *mysql-server* e *mysql* e condividono la struttura dei comandi. mariadb-server è in esecuzione su molti server web, poiché è richiesto dal popolare [CMS Wordpress](https://wordpress.org/). Questo database, però, ha molti altri usi. Se si desidera utilizzare questo insieme ad altri strumenti per il rafforzamento di un server web, consultare la guida [Apache Hardened Web Server](../web/apache_hardened_webserver/index.md). @@ -28,36 +28,38 @@ Se si desidera utilizzare questo insieme ad altri strumenti per il rafforzamento È necessario installare _mariadb-server_: -`dnf install mariadb-server` +```bash +dnf install mariadb-server +``` ## Proteggere `mariadb-server` -Per rafforzare la sicurezza di _mariadb-server_ è necessario eseguire uno script, ma prima è necessario abilitare e avviare mariadb: - -`systemctl enable mariadb` - -Quindi: +Per rafforzare la sicurezza di mariadb-server è necessario eseguire uno script, ma prima è necessario abilitare e avviare mariadb: -`systemctl start mariadb` +```bash +systemctl enable --now mariadb +``` -Poi, eseguite questo comando: +Quindi, eseguire questo comando: -`mysql_secure_installation` +```bash +mysql_secure_installation +``` -!!! tip "Suggerimento" +!!! tip - La versione di mariadb-server che viene abilitata per impostazione predefinita in Rocky Linux 8.5 è la 10.3.32. È possibile installare 10.5.13 abilitando il modulo: + La versione di mariadb-server che viene abilitata per impostazione predefinita in Rocky Linux 8.5 è la 10.3.32. È possibile installare la versione 10.5.13 abilitando il modulo: - ``` + ```bash dnf module enable mariadb:10.5 ``` - E poi installare `mariadb`. Dalla versione 10.4.6 di MariaDB, sono disponibili comandi specifici MariaDB che puoi usare al posto dei vecchi comandi `mysql` prefissati. Questi includono il precedentemente menzionato `mysql_secure_installation` che ora può essere chiamato con la versione MariaDB `mariadb-secure-installation`. + E poi installare `mariadb`. A partire dalla versione 10.4.6 di MariaDB, sono disponibili comandi specifici per MariaDB che è possibile utilizzare al posto dei vecchi comandi con prefisso `mysql`. Questi includono il già citato `mysql_secure_installation`, che ora può essere richiamato con la versione MariaDB `mariadb-secure-installation`. Viene visualizzata una finestra di dialogo: -``` +```text NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! @@ -69,29 +71,29 @@ so you should just press enter here. Enter current password for root (enter for none): ``` -Trattandosi di una nuova installazione, non è stata impostata alcuna password di root. Basta premere invio qui. +Trattandosi di una nuova installazione, non è stata impostata alcuna password di root. Basta premere ++Invio++ qui. La parte successiva del dialogo continua: -``` +```text OK, successfully used password, moving on... Setting the root password ensures that nobody can log into the MariaDB -root user without the proper authorisation. +root user without the proper authorization. Set root password? [Y/n] ``` -È' assolutamente _necessario_ avere una password di root impostata. Ti consigliamo di capire cosa dovrebbe essere e documentarlo in un gestore di password da qualche parte in modo da poterlo estrarre se necessario. Iniziate premendo 'Invio' per accettare il valore predefinito "Y". Questo farà apparire la finestra di dialogo della password: +È assolutamente necessario *impostare* una password di root. Ti consigliamo di stabilire quale dovrebbe essere e di annotarla in un gestore di password, in modo da poterla recuperare se necessario. Iniziare premendo ++enter++ per accettare il valore predefinito "Y". Questo farà apparire la finestra di dialogo della password: -``` +```text New password: Re-enter new password: ``` -Inserisci la password scelta e poi confermala inserendola di nuovo. Se questo ha successo, otterrete la seguente finestra di dialogo: +Inserisci la password scelta e confermala inserendola nuovamente. Se l'operazione ha esito positivo, verrà visualizzata la seguente finestra di dialogo: -``` +```text Password updated successfully! Reloading privilege tables.. ... Success! @@ -99,21 +101,21 @@ Reloading privilege tables.. Il prossimo dialogo riguarda l'utente anonimo: -``` +```text By default, a MariaDB installation has an anonymous user, allowing anyone to log into MariaDB without having to have a user account created for -them. This is intended only for testing, and to make the installation +them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? [Y/n] ``` -La risposta qui è "Y", quindi basta premere 'Invio' per accettare l'impostazione predefinita. +La risposta qui è "Y", quindi basta premere ++enter++ per accettare l'impostazione predefinita. -La finestra di dialogo procede alla sezione che si occupa di permettere all'utente root di accedere da remoto: +La finestra di dialogo passa alla sezione relativa all'autorizzazione dell'utente root ad accedere in remoto: -``` +```text ... Success! Normally, root should only be allowed to connect from 'localhost'. This @@ -122,11 +124,11 @@ ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] ``` -root dovrebbe essere necessario solo localmente sulla macchina. Quindi accettate anche questo default premendo 'Invio'. +root dovrebbe essere necessario solo localmente sulla macchina. Quindi accettate anche questa impostazione predefinita premendo ++enter++. La finestra di dialogo si sposta poi sul database 'test' che è installato automaticamente con _mariadb-server_: -``` +```text ... Success! @@ -137,11 +139,11 @@ before moving into a production environment. Remove test database and access to it? [Y/n] ``` -Di nuovo, la risposta qui è quella predefinita, quindi basta premere 'Invio' per rimuoverla. +Anche in questo caso, la risposta è quella predefinita, quindi basta premere ++enter++ per rimuoverla. Infine, la finestra di dialogo chiede se si desidera ricaricare i privilegi: -``` +```text - Dropping test database... ... Success! - Removing privileges on test database... @@ -153,9 +155,9 @@ will take effect immediately. Reload privilege tables now? [Y/n] ``` -Anche in questo caso, premere "Invio". Se tutto ha funzionato, si riceverà questo messaggio: +Ancora una volta, premere ++enter++ per eseguire questa operazione. Se tutto va bene, riceverai questo messaggio: -``` +```text ... Success! Cleaning up... @@ -168,33 +170,33 @@ Thanks for using MariaDB! MariaDB sarà ora pronto all'uso. -### Modifiche a Rocky 9.0 +### Modifiche in Rocky 9.0 -Rocky Linux 9.0 utilizza `mariadb-server-10.5.13-2` come versione predefinita di mariadb-server. A partire dalla versione 10.4.3, un nuovo plugin è abilitato automaticamente nel server che cambia la finestra di dialogo `mariadb-secure-installation`. Quel plugin è l'autenticazione `unix-socket`. [Questo articolo](https://mariadb.com/kb/en/authentication-plugin-unix-socket/) spiega bene la nuova funzione. Essenzialmente, l'uso dell'autenticazione unix-socket utilizza le credenziali dell'utente connesso per accedere al database. Fa in modo che se l'utente root, ad esempio, accede e quindi utilizza `mysqladmin` per creare o eliminare un database (o qualsiasi altra funzione) non viene richiesta alcuna password per l'accesso. Stesso funzionamento con `mysql`. Ciò significa anche che non c'è una password da compromettere in remoto. Ciò dipende dalla sicurezza degli utenti impostati sul server per la protezione del database. +Rocky Linux 9.2 utilizza `mariadb-server-10.5.22` come versione predefinita di mariadb-server. A partire dalla versione 10.4.3, nel server viene automaticamente attivato un nuovo plugin che modifica la finestra di dialogo `mariadb-secure-installation`. Questo plugin è l'autenticazione `unix-socket`. [Questo articolo](https://mariadb.com/kb/en/authentication-plugin-unix-socket/) spiega bene la nuova funzione. Essenzialmente, l'uso dell'autenticazione unix-socket utilizza le credenziali dell'utente connesso per accedere al database. In questo modo, se l'utente root, ad esempio, accede e poi usa `mysqladmin` per creare o cancellare un database (o qualsiasi altra funzione), non è necessaria alcuna password per l'accesso. Lo stesso funziona con `mysql`. Ciò significa anche che non c'è una password da compromettere in remoto. Ciò dipende dalla sicurezza degli utenti impostati sul server per la protezione del database. -La seconda finestra di dialogo durante `mariadb-secure-installation` dopo l'impostazione della password per l'utente amministrativo è: +La seconda finestra di dialogo durante l'`mariadb-secure-installation`, dopo l'impostazione della password per l'utente amministrativo, è la seguente: -``` +```text Switch to unix_socket authentication Y/n ``` -L'impostazione predefinita è "Y", ma anche se si risponde "n", con il plugin abilitato non viene richiesta una password per l'utente, almeno non dall'interfaccia della riga di comando. È possibile specificare password o nessuna password e entrambi funzionano: +L'impostazione predefinita è "Y", ma anche se si risponde "n", con il plugin abilitato non viene richiesta una password per l'utente, almeno non dall'interfaccia della riga di comando. È possibile specificare una password o nessuna password ed entrambe funzionano: -``` +```bash mysql MariaDB [(none)]> ``` -``` +```bash mysql -p -Inserire la password: +Enter password: MariaDB [(none)]> ``` -Per ulteriori informazioni su questa funzione, fare riferimento al link qui sopra. C'è un modo per disattivare questo plugin e tornare ad avere la password come campo obbligatorio, che è anche dettagliato all'interno di tale collegamento. +Per ulteriori informazioni su questa funzione, consultare il link sopra riportato. Esiste un modo per disattivare questo plugin e tornare ad avere la password come campo obbligatorio, descritto in dettaglio nel link. ## Conclusione -Un server di database, come _mariadb-server_, può essere usato per molti scopi. A causa della popolarità del CMS Wordpress, si trova spesso sui server web. Prima di eseguire il database in produzione, tuttavia, è bene rafforzarne la sicurezza. +Un server di database, come *mariadb-server*, può essere utilizzato per molti scopi. Data la popolarità del [CMS Wordpress](https://wordpress.org), è spesso presente sui server web. Prima di eseguire il database in produzione, tuttavia, è bene rafforzarne la sicurezza. diff --git a/docs/guides/dns/knot_authoritative_dns.it.md b/docs/guides/dns/knot_authoritative_dns.it.md new file mode 100644 index 0000000000..a843031bf0 --- /dev/null +++ b/docs/guides/dns/knot_authoritative_dns.it.md @@ -0,0 +1,132 @@ +--- +title: Knot Authoritative DNS +author: Neel Chauhan +contributors: Steven Spencer, Ganna Zhyrnova +tested_with: 9.4 +tags: + - dns +--- + +Un'alternativa a BIND, [Knot DNS](https://www.knot-dns.cz/), è un moderno server DNS autoritativo gestito dal registry dei domini ceco [CZ.NIC](https://www.nic.cz/). + +## Prerequisiti e presupposti + +- Un server con Rocky Linux +- In grado di utilizzare _firewalld_ per la creazione di regole firewall +- Un nome di dominio o un server DNS ricorsivo interno che punta al server DNS autoritativo. + +## Introduzione + +I server DNS esterni, o pubblici, mappano gli hostname in indirizzi IP e, nel caso dei record PTR (noti come “pointer” o “reverse”), mappano gli indirizzi IP in hostname. È una parte essenziale di Internet. Fa sì che il server di posta, il server web, il server FTP o molti altri server e servizi funzionino come previsto, indipendentemente da dove ci si trovi. + +## Installazione e abilitazione di Knot + +Per prima cosa, installare EPEL: + +```bash +dnf install epel-release +``` + +Quindi, installare Knot: + +```bash +dnf install knot +``` + +## Configurazione di `Knot` + +Prima di apportare modifiche a qualsiasi file di configurazione, spostare il file originale installato e funzionante, `knot.conf`: + +```bash +mv /etc/knot/knot.conf /etc/knot/knot.conf.orig +``` + +Questo aiuterà in futuro se si verificano errori nel file di configurazione. È _sempre_ una buona idea fare una copia di backup prima di apportare modifiche. + +Modificare il file _knot.conf_. L'autore usa _vi_, ma potete sostituirlo con il vostro editor a riga di comando preferito: + +```bash +vi /etc/knot/knot.conf +``` + +Inserire quanto segue: + +```bash +server: + listen: 0.0.0.0@53 + listen: ::@53 + +zone: + - domain: example.com + storage: /var/lib/knot/zones + file: example.com.zone + +log: + - target: syslog + any: info +``` + +Sostituire `example.com` con il nome del dominio per il quale si gestisce un nameserver. + +Quindi, creare i file di zona: + +```bash +mkdir /var/lib/knot/zones +vi /var/lib/knot/zones/example.com.zone +``` + +I file di zona DNS sono compatibili con BIND. Nel file, inserire: + +```bash +$TTL 86400 ; How long should records last? +; $TTL used for all RRs without explicit TTL value +$ORIGIN example.com. ; Define our domain name +@ 1D IN SOA ns1.example.com. hostmaster.example.com. ( + 2024061301 ; serial + 3h ; refresh duration + 15 ; retry duration + 1w ; expiry duration + 3h ; nxdomain error ttl + ) + IN NS ns1.example.com. ; in the domain + IN MX 10 mail.another.com. ; external mail provider + IN A 172.20.0.100 ; default A record +; server host definitions +ns1 IN A 172.20.0.100 ; name server definition +www IN A 172.20.0.101 ; web server definition +mail IN A 172.20.0.102 ; mail server definition +``` + +Se avete bisogno di aiuto per personalizzare i file di zona in stile BIND, Oracle ha [una buona introduzione ai file di zona](https://docs.oracle.com/en-us/iaas/Content/DNS/Reference/formattingzonefile.htm). + +Salvare le modifiche. + +## Abilitare Knot + +Quindi, consentire le porte DNS in `firewalld` e abilitare Knot DNS: + +```bash +firewall-cmd --add-service=dns --zone=public +firewall-cmd --runtime-to-permanent +systemctl enable --now knot +``` + +Verificare la risoluzione DNS con il comando `host`: + +```bash +% host example.com 172.20.0.100 +Using domain server: +Name: 172.20.0.100 +Address: 172.20.0.100#53 +Aliases: + +example.com has address 172.20.0.100 +example.com mail is handled by 10 mail.another.com. +% +``` + +## Conclusione + +Sebbene la maggior parte delle persone utilizzi servizi di terze parti per il DNS, ci sono scenari in cui si desidera un DNS self-hosting. Ad esempio, le società di telecomunicazioni, hosting e social media ospitano molte voci DNS in cui i servizi ospitati sono indesiderati. + +Knot è uno dei tanti strumenti open-source che rendono possibile l'hosting DNS. Congratulazioni, avete il vostro server DNS personale! diff --git a/docs/guides/dns/nsd_authoritative_dns.it.md b/docs/guides/dns/nsd_authoritative_dns.it.md new file mode 100644 index 0000000000..d9aea3b245 --- /dev/null +++ b/docs/guides/dns/nsd_authoritative_dns.it.md @@ -0,0 +1,198 @@ +--- +title: NSD DNS autoritativo +author: Neel Chauhan +contributors: Steven Spencer, Ganna Zhyrnova +tested_with: 9.4 +tags: + - dns +--- + +Un'alternativa a BIND, [NSD](https://www.nlnetlabs.nl/projects/nsd/about/) (Name Server Daemon) è un moderno server DNS authoritative-only gestito da [NLnet Labs](https://www.nlnetlabs.nl/). + +## Prerequisiti e presupposti + +- Un server con Rocky Linux +- In grado di utilizzare `firewalld` per la creazione di regole firewall +- Un nome di dominio o un server DNS ricorsivo interno che punta al server DNS autoritativo. + +## Introduzione + +I server DNS esterni, o pubblici, mappano gli hostname in indirizzi IP e, nel caso dei record PTR (noti come “pointer” o “reverse”), mappano gli indirizzi IP in hostname. È una parte essenziale di Internet. Fa sì che il server di posta, il server web, il server FTP o molti altri server e servizi funzionino come previsto, indipendentemente da dove ci si trovi. + +## Installazione e abilitazione di NSD + +Per prima cosa, installare EPEL: + +```bash +dnf install epel-release +``` + +Successivamente, installare NSD: + +```bash +dnf install nsd +``` + +## Configurazione di NSD + +Prima di apportare modifiche a qualsiasi file di configurazione, copiare il file originale installato e funzionante, `nsd.conf`: + +```bash +cp /etc/nsd/nsd.conf /etc/nsd/nsd.conf.orig +``` + +Questo aiuterà in futuro se si verificano errori nel file di configurazione. È _sempre_ una buona idea fare una copia di backup prima di apportare modifiche. + +Modificare il file _nsd.conf_. L'autore usa _vi_, ma si può sostituirlo con l'editor a riga di comando preferito: + +```bash +vi /etc/nsd/nsd.conf +``` + +Andare in fondo al file e inserire quanto segue: + +```bash +zone: + name: example.com + zonefile: /etc/nsd/example.com.zone +``` + +Sostituire `example.com` con il nome del dominio per il quale si gestisce un nameserver. + +Quindi, creare i file di zona: + +```bash +vi /etc/nsd/example.com.zone +``` + +I file DNS zone sono compatibili con BIND. Nel file, inserire: + +```bash +$TTL 86400 ; How long should records last? +; $TTL used for all RRs without explicit TTL value +$ORIGIN example.com. ; Define our domain name +@ 1D IN SOA ns1.example.com. hostmaster.example.com. ( + 2024061301 ; serial + 3h ; refresh duration + 15 ; retry duration + 1w ; expiry duration + 3h ; nxdomain error ttl + ) + IN NS ns1.example.com. ; in the domain + IN MX 10 mail.another.com. ; external mail provider + IN A 172.20.0.100 ; default A record +; server host definitions +ns1 IN A 172.20.0.100 ; name server definition +www IN A 172.20.0.101 ; web server definition +mail IN A 172.20.0.102 ; mail server definition +``` + +Se avete bisogno di aiuto per personalizzare i file di zona in stile BIND, Oracle ha [una buona introduzione ai zone file](https://docs.oracle.com/en-us/iaas/Content/DNS/Reference/formattingzonefile.htm). + +Salvare le modifiche. + +## Abilitare NSD + +Quindi, consentire le porte DNS in `firewalld` e abilitare NSD: + +```bash +firewall-cmd --add-service=dns --zone=public +firewall-cmd --runtime-to-permanent +systemctl enable --now nsd +``` + +Verificare che il DNS riesca a risolvere l'host-name con il comando `host`: + +```bash +% host example.com 172.20.0.100 +Using domain server: +Name: 172.20.0.100 +Address: 172.20.0.100#53 +Aliases: + +example.com has address 172.20.0.100 +example.com mail is handled by 10 mail.another.com. +% +``` + +## Server DNS secondario + +La gestione di uno o più server DNS autoritativi secondari è generalmente la norma. Questo è particolarmente utile quando il server primario si guasta. La funzione NSD consente di sincronizzare i record DNS da un server primario a uno o più server di backup. + +Per abilitare un server di backup, generare le chiavi di firma sulla zona primaria: + +```bash +nsd-control-setup +``` + +È necessario copiare i seguenti file sul server di backup nella directory `/etc/nsd/`: + +- `nsd_control.key` +- `nsd_control.pem` +- `nsd_server.key` +- `nsd_server.pem` + +Su tutti i server DNS, aggiungere quanto segue prima della direttiva `zone:`: + +```bash +remote-control: + control-enable: yes + control-interface: 0.0.0.0 + control-port: 8952 + server-key-file: "/etc/nsd/nsd_server.key" + server-cert-file: "/etc/nsd/nsd_server.pem" + control-key-file: "/etc/nsd/nsd_control.key" + control-cert-file: "/etc/nsd/nsd_control.pem" +``` + +Inoltre, attivare le voci del firewall: + +```bash +firewall-cmd --zone=public --add-port=8952/tcp +firewall-cmd --runtime-to-permanent +``` + +Sul server primario, modificare la zone in modo che corrisponda a quanto segue: + +```bash +zone: + name: example.com + zonefile: /etc/nsd/example.com.zone + allow-notify: NS2_IP NOKEY + provide-xfr: NS2_IP NOKEY + outgoing-interface: NS1_IP +``` + +Sostituire `NS1_IP1` e `NS2_IP2` con gli indirizzi IP pubblici dei nameserver primario e secondario. + +Sul server secondario, aggiungere la zone: + +```bash +zone: + name: fourplex.net + notify: NS1_IP NOKEY + request-xfr: NS1_IP NOKEY + outgoing-interface: NS2_IP +``` + +Sostituire `NS1_IP1` e `NS2_IP2` con gli indirizzi IP pubblici dei nameserver primario e secondario. + +Riavviare NSD su entrambi i server dei nomi: + +```bash +NS1# systemctl restart --now nsd +``` + +Per scaricare il file di zona sul nameserver secondario da quello primario: + +```bash +nsd-control notify -s NS2_IP +``` + +Sostituire `NS2_IP2` con gli indirizzi IP pubblici del server dei nomi secondario. + +## Conclusione + +La maggior parte delle persone utilizza servizi DNS di terze parti. Tuttavia, ci sono scenari in cui è auspicabile un DNS self-hosting. Ad esempio, le società di telecomunicazioni, hosting e social media mantengono le proprie voci DNS quando i servizi DNS di terze parti sono indesiderati. + +NSD è uno dei tanti strumenti open source che rendono possibile l'hosting DNS. diff --git a/docs/guides/dns/unbound_recursive_dns.it.md b/docs/guides/dns/unbound_recursive_dns.it.md new file mode 100644 index 0000000000..ef45572156 --- /dev/null +++ b/docs/guides/dns/unbound_recursive_dns.it.md @@ -0,0 +1,101 @@ +--- +title: DNS ricorsivo Unbound +author: Neel Chauhan +contributors: Steven Spencer, Ganna Zhyrnova +tested_with: 9.4 +tags: + - dns +--- + +Un'alternativa a BIND, [Unbound](https://www.nlnetlabs.nl/projects/unbound/about/) è un moderno server DNS di convalida, ricorsivo e di caching gestito da [NLnet Labs](https://www.nlnetlabs.nl/). + +## Prerequisiti e presupposti + +- Un server con Rocky Linux +- In grado di utilizzare `firewalld` per la creazione di regole firewall + +## Introduzione + +Esistono due tipi di server DNS: autoritario e ricorsivo. Laddove i server DNS autoritativi pubblicizzano una zona DNS, i server ricorsivi risolvono le query per conto dei client inoltrandole a un ISP o a un resolver DNS pubblico o alle zone radice dei server più grandi. + +Ad esempio, il router di casa probabilmente esegue un resolver DNS ricorsivo incorporato che inoltra al vostro ISP o a un noto server DNS pubblico, che è anche un server DNS ricorsivo. + +## Installazione e abilitazione di Unbound + +Installare Unbound: + +```bash +dnf install unbound +``` + +## Configurazione di Unbound + +Prima di apportare modifiche a qualsiasi file di configurazione, spostare il file originale installato e funzionante, `unbound.conf`: + +```bash +cp /etc/unbound/unbound.conf /etc/unbound/unbound.conf.orig +``` + +Questo aiuterà in futuro se si verificano errori nel file di configurazione. È _sempre_ una buona idea fare una copia di backup prima di apportare modifiche. + +Modificare il file _unbound.conf_. L'autore usa _vi_, ma potete sostituirlo con l'editor a riga di comando preferito: + +```bash +vi /etc/unbound/unbound.conf +``` + +Inserire quanto segue: + +```bash +server: + interface: 0.0.0.0 + interface: :: + access-control: 192.168.0.0/16 allow + access-control: 2001:db8::/64 allow + chroot: "" + +forward-zone: + name: "." + forward-addr: 1.0.0.1@53 + forward-addr: 1.1.1.1@53 +``` + +Sostituire `192.168.0.0/16` e `2001:db8::/64` con le sottoreti per le quali si risolvono le query DNS. Salvare le modifiche. + +### Osservare da più vicino + +- L'opzione `interface` indica le interfacce (IPv4 o IPv6) su cui si desidera ascoltare le query DNS. Siamo in ascolto su tutte le interfacce con `0.0.0.0` e `::`. +- L'opzione `access-control` indica le sottoreti (IPv4 o IPv6) da cui si desidera consentire le query DNS. Sono consentite richieste da `192.168.0.0/16` e `2001:db8::/64`. +- Il `forward-addr` definisce i server a cui effettuare l'inoltro. Stiamo inoltrando a `1.1.1.1` e `1.0.0.1` di Cloudflare. + +## Abilitare Unbound + +Quindi, aprire le porte DNS in `firewalld` e abilitare Unbound: + +```bash +firewall-cmd --add-service=dns --zone=public +firewall-cmd --runtime-to-permanent +systemctl enable --now unbound +``` + +Verificare la risoluzione DNS con il comando `host`: + +```bash +$ host google.com 172.20.0.100 +Using domain server: +Name: 172.20.0.100 +Address: 172.20.0.100#53 +Aliases: + +google.com has address 142.251.215.238 +google.com has IPv6 address 2607:f8b0:400a:805::200e +google.com mail is handled by 10 smtp.google.com. +``` + +% + +## Conclusione + +La maggior parte delle persone utilizza il resolver DNS del router di casa o i resolver DNS pubblici gestiti da ISP e aziende tecnologiche. Nei laboratori domestici e nelle reti di grandi dimensioni, è consuetudine eseguire un resolver a livello di rete per ridurre la latenza e il carico di rete mettendo in cache le richieste DNS per i siti web comunemente richiesti, come Google. Un resolver a livello di rete consente anche di utilizzare servizi intranet come SharePoint e Active Directory. + +Unbound è uno dei tanti strumenti open-source che rendono possibile la risoluzione dei DNS. Congratulazioni, avete il vostro resolver DNS personale! diff --git a/docs/guides/editors/micro.it.md b/docs/guides/editors/micro.it.md index 837366b44e..5d7973fb8f 100644 --- a/docs/guides/editors/micro.it.md +++ b/docs/guides/editors/micro.it.md @@ -1,7 +1,7 @@ --- title: micro author: Ezequiel Bruni -contributors: Steven Spencer, Franco Colussi +contributors: Steven Spencer, Ganna Zhyrnova tested version: 8.5 tags: - editor @@ -15,12 +15,12 @@ tags: *[micro](https://micro-editor.github.io)* è un piccolo e fantastico editor di testo basato su terminale che si colloca tra *nano* e *vim* in termini di complessità. Ha un flusso di lavoro semplice e facilmente riconoscibile, con diverse caratteristiche straordinarie: -* Tutti i consueti comandi "Control-C", "Control-V" e "Control-F" funzionano come in un editor di testo basato su desktop. Naturalmente, tutte le associazioni di tasti possono essere reimpostate. -* Supporto del mouse — fare clic e trascinare per selezionare il testo, fare doppio clic per selezionare le parole, fare triplo clic per selezionare le righe. -* Sono supportate oltre 75 lingue con evidenziazione della sintassi per impostazione predefinita. -* Cursori multipli per modificare più righe alla volta. -* Include un sistema di plugin. -* Pannelli multipli. +- Tutti i consueti comandi ++control+c++, ++control+v++ e ++control+f++ funzionano come in un editor di testo basato su desktop. Naturalmente, tutte le associazioni di tasti possono essere reimpostate. +- Supporto del mouse — fare clic e trascinare per selezionare il testo, fare doppio clic per selezionare le parole, fare triplo clic per selezionare le righe. +- Sono supportate oltre 75 lingue con evidenziazione della sintassi per impostazione predefinita. +- Cursori multipli per modificare più righe alla volta. +- Include un sistema di plugin. +- Pannelli multipli. Ed ecco come appare nel mio terminale: @@ -28,13 +28,13 @@ Ed ecco come appare nel mio terminale: !!! Note "Nota" - È possibile installare micro tramite un'applicazione snap. Se si utilizza già snap sulla macchina... Voglio dire... perché no? Ma io preferisco prenderlo direttamente dalla fonte. + È *possibile* installare micro tramite un'applicazione snap. Se si utilizza già snap sulla macchina... Voglio dire... perché no? Ma io preferisco prenderlo direttamente dalla fonte. ## Prerequisiti -* Qualsiasi macchina o contenitore Rocky Linux connesso a Internet. -* Conoscenza di base della riga di comando e desiderio di modificare il proprio testo. -* Alcuni comandi dovranno essere eseguiti come root o con `sudo`. +- Qualsiasi macchina o contenitore Rocky Linux connesso a Internet. +- Conoscenza di base della riga di comando e desiderio di modificare il proprio testo. +- Alcuni comandi dovranno essere eseguiti come root o con `sudo`. ### Come Installare micro @@ -76,10 +76,10 @@ Inoltre, *micro* lascerà alcuni file di configurazione nella vostra home direct rm -rf /home/[nomeutente]/.config/micro ``` -## Conclusione +## Conclusioni Se volete una guida completa all'uso di *micro*, consultate il [sito web principale](https://micro-editor.github.io) e la documentazione nella [repo di Github](https://github.com/zyedidia/micro/tree/master/runtime/help). È anche possibile premere "Control-G" per aprire il file di guida principale all'interno dell'applicazione stessa. -probabilmente*micro* non soddisferà le esigenze di coloro che si sono dedicati all'esperienza di *vim* o *emacs*, ma è perfetto per le persone come me. Ho sempre desiderato l'esperienza del vecchio Sublime Text nel terminale e ora ho qualcosa di *veramente* vicino. +probabilmente *micro* non soddisferà le esigenze di coloro che si sono dedicati all'esperienza di *vim* o *emacs*, ma è perfetto per le persone come me. Ho sempre desiderato l'esperienza del vecchio Sublime Text nel terminale e ora ho qualcosa di *molto* simile. Provate e vedete se funziona per voi. diff --git a/docs/guides/hardware/aqc_bridge_vlan.de.md b/docs/guides/hardware/aqc_bridge_vlan.de.md new file mode 100644 index 0000000000..a092b4c5ff --- /dev/null +++ b/docs/guides/hardware/aqc_bridge_vlan.de.md @@ -0,0 +1,29 @@ +--- +title: Aktivieren von VLAN-Passthrough auf NICs der Marvell AQC-Serie +author: Neel Chauhan +contributors: Steven Spencer +tested_with: 9.6 +tags: + - Hardware +--- + +## Einleitung + +Der Autor verwendet in seinem Heimserver eine auf Marvell AQC107 basierende Netzwerkkarte (NIC, Network Interface Card), die über eine virtuelle Maschine verfügt, die für eine virtualisierte Firewall verwendet wird. Leider entfernt der standardmäßige Rocky Linux Marvell AQC-Treiber VLANs auf Bridge-Schnittstellen. Dies ist mit der virtuellen OPNsense-Maschine des Autors passiert. Glücklicherweise lässt sich das Problem beheben. + +## Voraussetzungen + +Für die Verwendung dieses Verfahrens sind folgende Mindestanforderungen zu beachten: + +- Ein Rocky Linux-Server mit einer NIC der Marvell AQC-Serie +- Verwenden von NetworkManager zum Konfigurieren vom Netzwerk + +## Deaktivieren der VLAN-Filterung + +Sie können die VLAN-Filterung mit einem Befehl deaktivieren: + + nmcli con modify enp1s0 ethtool.feature-rx-vlan-filter off + +Ersetzen Sie `enp1s0` durch den Namen Ihrer AQC-basierten Netzwerkkarte. + +Abschließend müssen Sie Ihr System neu starten. diff --git a/docs/guides/hardware/aqc_bridge_vlan.fr.md b/docs/guides/hardware/aqc_bridge_vlan.fr.md new file mode 100644 index 0000000000..0ad061dee0 --- /dev/null +++ b/docs/guides/hardware/aqc_bridge_vlan.fr.md @@ -0,0 +1,29 @@ +--- +title: Activation du relais VLAN sur les cartes réseau Marvell de la série AQC +author: Neel Chauhan +contributors: Steven Spencer +tested_with: 9.6 +tags: + - hardware +--- + +## Introduction + +L'auteur utilise une carte réseau (NIC) basée sur Marvell AQC107 dans son serveur home, qui dispose d'une machine virtuelle utilisée pour un pare-feu virtualisé. Malheureusement, le pilote Rocky Linux Marvell d'origine AQC supprime les VLAN sur les interfaces bridge. Cela est arrivé à la machine virtuelle OPNsense de l'auteur. Heureusement, ça peut être évité. + +## Prérequis + +Les conditions suivantes sont indispensables pour utiliser cette procédure : + +- Un serveur Rocky Linux avec une carte réseau Marvell de la série AQC +- Utilisation de NetworkManager pour la configuration du réseau + +## Désactivation du filtrage VLAN + +Vous pouvez désactiver le filtrage VLAN avec une seule commande : + + nmcli con modify enp1s0 ethtool.feature-rx-vlan-filter off + +Remplacez `enp1s0` par le nom de votre adaptateur réseau basé sur AQC. + +Finalement, vous devrez redémarrer votre système. diff --git a/docs/release_notes/10_0.de.md b/docs/release_notes/10_0.de.md index 5cf8a9ff40..a24543d790 100644 --- a/docs/release_notes/10_0.de.md +++ b/docs/release_notes/10_0.de.md @@ -267,7 +267,7 @@ Der Host-Switcher, der die gleichzeitige Verwaltung mehrerer Systeme ermöglicht Cockpit unterstützt nun die Konfiguration von Größenbeschränkungen für das Stratis-Dateisystem. -## Bekannte Probleme +## Bekannte Issues ### SELinux-Issue mit virtuellen Hosts @@ -279,4 +279,4 @@ Mit bestimmten Hardwarekonfigurationen, beispielsweise virtualisierten Umgebunge ## Mitmachen und Fehler melden -Bitte melden Sie alle Fehler, auf die Sie gestoßen sind, dem [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Wir heißen Sie auch herzlich willkommen, unserer Community beizutreten, sei es in unseren [Foren](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC auf Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailinglisten](https://lists.resf.org), oder auf welche andere Art auch immer Sie teilnehmen möchten! +Bitte melden Sie alle Fehler, auf die Sie gestoßen sind, dem [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Wir heißen Sie auch herzlich willkommen, unserer Community beizutreten, sei es in unseren [Foren](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC auf Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailinglisten](https://lists.resf.org) oder auf welche andere Art auch immer Sie teilnehmen möchten! From 9fbec0816802645cb66bf2db8b95ae5ca8486600 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Fri, 18 Jul 2025 13:38:47 -0700 Subject: [PATCH 071/164] New Crowdin updates (#2791) * New translations basic_network_configuration.md (Italian) * New translations import_rocky_to_wsl.md (Italian) * New translations 02-basic-email-system.md (Italian) * New translations hpe_amsd.md (Italian) * New translations transmission_daemon.md (Italian) * New translations samba_file_share.md (Italian) * New translations x710_bridge_vlan.md (Italian) * New translations regenerate_initramfs.md (Italian) * New translations iso_creation.md (Italian) * New translations 9_6_installation.md (Italian) * New translations minimum_hardware_requirements.md (Italian) * New translations good_docs.md (Italian) * New translations index.md (Italian) --- docs/guides/9_6_installation.it.md | 290 +++++++++++++ docs/guides/email/02-basic-email-system.it.md | 405 ++++++++++-------- .../file_sharing/samba_file_share.it.md | 101 +++++ .../file_sharing/transmission_daemon.it.md | 122 ++++++ docs/guides/hardware/hpe_amsd.it.md | 65 +++ docs/guides/hardware/x710_bridge_vlan.it.md | 65 +++ .../import_rocky_to_wsl.it.md | 55 ++- docs/guides/isos/iso_creation.it.md | 121 ++++++ docs/guides/kernel/regenerate_initramfs.it.md | 45 ++ .../minimum_hardware_requirements.it.md | 127 ++++++ .../network/basic_network_configuration.it.md | 68 +-- docs/rocky_insights/blogs/good_docs.it.md | 88 ++++ docs/rocky_insights/blogs/index.it.md | 2 +- 13 files changed, 1327 insertions(+), 227 deletions(-) create mode 100644 docs/guides/9_6_installation.it.md create mode 100644 docs/guides/file_sharing/samba_file_share.it.md create mode 100644 docs/guides/file_sharing/transmission_daemon.it.md create mode 100644 docs/guides/hardware/hpe_amsd.it.md create mode 100644 docs/guides/hardware/x710_bridge_vlan.it.md create mode 100644 docs/guides/isos/iso_creation.it.md create mode 100644 docs/guides/kernel/regenerate_initramfs.it.md create mode 100644 docs/guides/minimum_hardware_requirements.it.md create mode 100644 docs/rocky_insights/blogs/good_docs.it.md diff --git a/docs/guides/9_6_installation.it.md b/docs/guides/9_6_installation.it.md new file mode 100644 index 0000000000..971b8d8422 --- /dev/null +++ b/docs/guides/9_6_installation.it.md @@ -0,0 +1,290 @@ +--- +Title: Installazione di Rocky Linux 9 +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +--- + +# Installazione di Rocky Linux 9 + +Questa è una guida dettagliata per l'installazione di una versione a 64 bit della distribuzione Rocky Linux su un sistema standalone. Verrà eseguita un'installazione server-class e verranno illustrate le opzioni di installazione e personalizzazione. + +## Prerequisiti per l'installazione del sistema operativo + +Scaricate la ISO da utilizzare per questa installazione di Rocky Linux.\ +È possibile scaricare l'ultima immagine ISO della versione di Rocky Linux per questa installazione qui: + + + +Per scaricare l'ISO direttamente dalla riga di comando su un sistema Linux esistente, utilizzare il comando `wget`: + +```bash +wget https://download.rockylinux.org/pub/rocky/9/isos/x86_64/Rocky-9.6-x86_64-minimal.iso +``` + +Le ISO di Rocky Linux seguono questa convenzione di denominazione: + +```text +Rocky-.--.iso +``` + +Per esempio, `Rocky-9.6-x86_64-minimal.iso` + +!!! Note + + Il sito web del Rocky Project elenca diversi mirror situati in tutto il mondo. Selezionate il mirror geograficamente più vicino a voi. L'elenco dei mirror ufficiali è disponibile [qui] (https://mirrors.rockylinux.org/mirrormanager/mirrors). + +## Verifica del file ISO del programma di installazione + +Se avete scaricato le ISO di Rocky Linux su una distribuzione Linux esistente, potete usare l'utility `sha256sum` per verificare che i file scaricati non siano corrotti. Dimostreremo come verificare il file `Rocky-9.6-x86_64-minimal.iso` controllando il suo checksum. + +1. Scaricate il file che contiene le checksum ufficiali delle ISO disponibili. + +2. Mentre ci si trova ancora nella cartella che contiene l'ISO di Rocky Linux scaricata, scaricare il file di checksum dell'ISO, digitare: + + ```bash + wget -O CHECKSUM https://download.rockylinux.org/pub/rocky/9/isos/x86_64/CHECKSUM + ``` + +3. Utilizzare l'utilità `sha256sum` per verificare l'integrità del file ISO contro la corruzione o la manomissione. + + ```bash + sha256sum -c CHECKSUM --ignore-missing + ``` + + Controllerà l'integrità del file ISO scaricato in precedenza, a condizione che si trovi nella stessa directory. Si dovrebbe vedere questo risultato: + + ```text + Rocky-9.6-x86_64-minimal.iso: OK + ``` + +## Installazione + +!!! tip + + Prima di iniziare l'installazione vera e propria, la Unified Extensible Firmware Interface (UEFI) o il Basic Input/Output System (BIOS) del sistema devono essere preconfigurati per l'avvio dal supporto corretto. + +Se il computer è impostato per l'avvio dal supporto che contiene il file ISO, possiamo iniziare il processo di installazione. + +1. Inserire e avviare il supporto di installazione (ad esempio, disco ottico, unità flash USB). + +2. Dopo l'avvio del computer, viene visualizzata la schermata iniziale di benvenuto di Rocky Linux 9.6. + + ![Rocky Linux installation splash screen](images/installation_9_6_F01.png) + +3. Se non si preme alcun tasto, il programma di installazione avvia un conto alla rovescia, al termine del quale il processo di installazione esegue automaticamente l'opzione predefinita, evidenziata: + + `Test this media & install Rocky Linux 9.6` + + È anche possibile premere ++enter++ in qualsiasi momento per avviare immediatamente il processo. + +4. Viene eseguita una rapida fase di verifica dei supporti.\ + Questa fase di verifica del supporto può evitare di avviare l'installazione per poi scoprire a metà strada che il programma di installazione deve essere interrotto a causa di un supporto di installazione difettoso. + +5. Una volta completato il controllo del supporto e verificata la sua utilizzabilità, il programma di installazione passa automaticamente alla schermata successiva. + +6. Selezionare la lingua che si desidera utilizzare per l'installazione di questa schermata. Per questa guida, si seleziona _English (United States)_. Quindi fare clic sul pulsante ++“continua ”++. + +## Riepilogo Installazione + +La schermata `Installation Summary` è un'area completa in cui si prendono decisioni importanti sull'installazione del sistema. + +La schermata è suddivisa grossomodo nelle seguenti sezioni: + +- _LOCALIZATION_ +- _SOFTWARE_ +- _SYSTEM_ +- _USER SETTINGS_ + +Si approfondiranno ciascuna di queste sezioni, apportando le modifiche necessarie. + +### Sezione Localization + +Questa sezione consente di personalizzare le voci relative alla posizione geografica del sistema. Tra questi: tastiera, supporto della lingua, ora e data. + +#### Tastiera + +Nel sistema demo di questa guida, si accetta il valore predefinito (_English US_) e non si apporta alcuna modifica. + +Tuttavia, se è necessario apportare modifiche, dalla schermata _Installation Summary_, fare clic sull'opzione ++"keyboard"++ per specificare il layout della tastiera del sistema. Con il pulsante ++plus++ è possibile aggiungere altri layout di tastiera, se necessario, nella schermata successiva e selezionare l'ordine preferito. + +Al termine di questa schermata, fare clic su ++“done ”++. + +#### Supporto Lingua + +L'opzione `Language Support` nella schermata _Installation Summary_ consente di specificare il supporto per altre lingue. + +Si accetterà il valore predefinito, **English (United States)**, e non si apporterà alcuna modifica. Fare clic su "Done". + +#### Time & Date + +Fare clic sull'opzione ++"Time & Date"++ nella schermata principale _Riepilogo installazione_ per visualizzare un'altra schermata che consente di selezionare il fuso orario in cui si trova la macchina. Scorrete l'elenco delle regioni e delle città e selezionate l'area più vicina a voi. + +A seconda dell'origine dell'installazione, l'opzione _Network Time_ potrebbe essere _ON_ o _OFF_ per impostazione predefinita. Accettare l'impostazione predefinita _ON_. Ciò consente al sistema di impostare automaticamente l'ora corretta utilizzando il Network Time Protocol (NTP). + +Fare clic su ++“done ”++ dopo aver apportato le modifiche. + +### Sezione Software + +Nella sezione _Software_ della schermata _Installation Summary_, è possibile selezionare o modificare l'origine dell'installazione e i pacchetti aggiuntivi (applicazioni) che vengono installati. + +#### Origine d'Installazione + +Poiché l'installazione utilizza un'immagine ISO di Rocky Linux 9.6, si noterà che _Local Media_ è specificato automaticamente nella sezione Origine dell'installazione della schermata principale _Installation Summary_. È possibile accettare le impostazioni predefinite. + +!!! Tip + + L'area Source dell'installazione consente di eseguire un'installazione network-based (ad esempio, se si utilizza la ISO di avvio di Rocky Linux - Rocky-9.6-x86_64-boot.iso). Per un'installazione network-based, è necessario innanzitutto assicurarsi che una scheda di rete sul sistema di destinazione sia configurata correttamente e possa accedere a Internet. Per eseguire un'installazione network-based, fare clic su +++"Installation Source"++ e selezionare il pulsante di opzione ++"On the network"++. Una volta selezionato, scegliere il protocollo corretto e digitare l'URI dell'origine dell'installazione. Fare clic su ++"Done"++. + +#### Sezione Software + +Facendo clic sull'opzione ++"Software Selection"++ nella schermata principale _Installation Summary_ si accede alla sezione dell'installazione in cui è possibile selezionare gli esatti pacchetti software installati sul sistema. Esistono due aree di selezione del software: + +- **Ambiente di base**: Installazione minima e sistema operativo personalizzato +- **Software aggiuntivo per l'ambiente selezionato**: La selezione di un ambiente di base sul lato sinistro presenta una serie di software aggiuntivi da installare per l'ambiente in questione sul lato destro. + +Selezionare l'opzione _Minimal Install_ (funzionalità di base). + +Fare clic su ++“done ”++ nella parte superiore dello schermo. + +### Sezione di Sistema + +Utilizzare la sezione Sistema della schermata _Installation Summary_ per personalizzare e apportare modifiche all'hardware sottostante del sistema di destinazione. Qui si creano le partizioni o i volumi del disco rigido, si specifica il file system, la configurazione di rete, si attiva o disattiva KDUMP o si seleziona un profilo di sicurezza. + +#### Destinazione d'Installazione + +Nella schermata _Installation Summary_, fare clic sull'opzione ++"Installation Destination"++. Si accede così all'area operativa corrispondente. + +Verrà visualizzata una schermata con tutte le unità disco candidate disponibili sul sistema di destinazione. Se nel sistema è presente una sola unità disco, come nel nostro sistema campione, l'unità viene elencata sotto _Local Standard Disks_ con un segno di spunta accanto. Facendo clic sull'icona del disco si attiva o disattiva il segno di spunta della selezione del disco. Mantenere la spunta per selezionare il disco. + +Nella sezione _Storage Configuration_: + +1. Selezionare il pulsante di opzione ++“Automatic”++. + +2. Fare clic su ++“done ”++ nella parte superiore dello schermo. + +3. Una volta accertato che il disco è utilizzabile, il programma di installazione torna alla schermata _Installation Summary_. + +### Network & Host Name + +Il seguente importante compito della procedura di installazione, nell'area Sistema, riguarda la configurazione di rete, dove è possibile configurare o modificare le impostazioni relative alla rete del sistema. + +!!! Note + + Dopo aver fatto clic sull'opzione ++"Network & Hostname"++ , tutti i dispositivi di interfaccia di rete correttamente rilevati (come schede di rete Ethernet, wireless, ecc.) saranno elencati nel riquadro sinistro della schermata di configurazione della rete. A seconda della configurazione hardware specifica, i dispositivi Ethernet in Linux hanno nomi simili a `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3` e così via. + È possibile configurare ogni interfaccia utilizzando DHCP o impostando manualmente l'indirizzo IP. + Se si sceglie di configurare manualmente, assicurarsi di avere pronte tutte le informazioni necessarie, come l'indirizzo IP, la netmask e altri dettagli rilevanti. + +Facendo clic sul pulsante ++"Network & Hostname"++ nella schermata principale _Installation Summary_ si apre la schermata di configurazione corrispondente. Tra le altre cose, è possibile configurare l'hostname del sistema. + +!!! Note + + È possibile modificare facilmente l'hostname del sistema in un secondo momento, dopo l'installazione del sistema operativo. + +La seguente importante operazione di configurazione riguarda le interfacce di rete del sistema. + +1. Verificare che nel riquadro di sinistra sia elencata una scheda Ethernet (o qualsiasi altra scheda di rete) +2. Fare clic su uno qualsiasi dei dispositivi di rete rilevati nel riquadro di sinistra per selezionarlo.\ + Le proprietà configurabili dell'adattatore di rete selezionato appaiono nel riquadro destro della schermata. + +!!! Note + + Nel nostro sistema campione, abbiamo due dispositivi Ethernet (`ens3` e `ens4`), tutti in stato di connessione. Il tipo, il nome, la quantità e lo stato dei dispositivi di rete sul vostro sistema potrebbero essere diversi da quelli del nostro sistema demo. + +Verificare che l'interruttore del dispositivo che si desidera configurare sia in posizione `ON` (blu) nel riquadro di destra. +In questa sezione verranno accettate tutte le impostazioni predefinite. + +Fare clic su ++"done "++ per tornare alla schermata principale _Installation Summary_. + +!!! Warning "Attenzione" + + Prestare attenzione all'indirizzo IP del server in questa sezione del programma di installazione. Supponiamo che non si disponga di un accesso fisico o facile alla console del sistema. In tal caso, queste informazioni saranno utili in seguito, quando sarà necessario collegarsi al server per continuare a lavorarci dopo il completamento dell'installazione del sistema operativo (OS). + +### Sezione User Settings + +Utilizzare questa sezione per creare una password per l'account utente `root` e per creare nuovi account amministrativi o non amministrativi. + +#### Root Password + +1. Fare clic sul campo _Root Password_ in _User Settings_ per avviare la schermata dell'attività _Root Password_. + + !!! Warning "Attenzione" + + ``` + Il superutente root è l'account più privilegiato del sistema. Se si sceglie di utilizzarlo o abilitarlo, è necessario proteggere questo account con una password forte. + ``` + +2. Nella casella di testo _Root Password_, impostare una password forte per l'utente root. + +3. Immettere nuovamente la stessa password nella casella di testo _Confirm_. + +4. Fare clic su ++"done"++. + +#### User Creation + +Per creare l'utente: + +1. Fare clic sul campo _User Creation_ in _User Settings_ per avviare la schermata dell'attività _Create User_.\ + Quest'area operativa consente di creare un account utente privilegiato (amministrativo) o non privilegiato (non amministrativo). + + !!! Info + + ``` + La creazione e l'uso di un account non privilegiato per le attività quotidiane di un sistema è una pratica ottimale nell'amministrazione del sistema. + ``` + + Sarà creato un utente normale che può invocare i poteri di superutente (amministratore) quando necessario. + +2. Completate i campi della schermata _Create User_ con le seguenti informazioni: + + - **Full name**: + `rockstar` + - **Username**: + `rockstar` + - **Make this user administrator**: + Selezionato + - **Require a password to use this account**: + Selezionato + - **Password**: + `04302021` + - **Confirm password**: + `04302021` + +3. Fare clic su ++"done"++. + +## Fase dell'Installer + +Una volta soddisfatti delle scelte fatte per le varie operazioni di installazione, inizierà la fase successiva del processo di installazione: l'installazione vera e propria. + +### Inizio Installazione + +Una volta soddisfatti delle scelte effettuate per le varie operazioni di installazione, fare clic sul pulsante ++"Begin Installation"++ nella schermata principale Installation Summary\*. + +L'installazione avrà inizio e l'installer mostrerà l'avanzamento dell'installazione. +Dopo l'avvio dell'installazione, vengono eseguite varie attività in background, tra cui il partizionamento del disco, la formattazione delle partizioni o dei volumi LVM, la verifica e la risoluzione delle dipendenze software e la scrittura del sistema operativo sul disco. + +!!! Note + + Se non si desidera continuare dopo aver fatto clic sul pulsante Inizia l'installazione, si può comunque uscire dall'installazione senza perdere i dati. Per uscire dal programma di installazione, è sufficiente resettare il sistema facendo clic sul pulsante Esci, premendo Ctrl-Alt-Canc sulla tastiera o premendo l'interruttore di reset o di alimentazione. + +### Completare l'Installazione + +Dopo che il programma di installazione ha completato il suo lavoro, verrà visualizzata una schermata finale di avanzamento dell'installazione con un messaggio di completamento. + +Infine, completare l'intera procedura facendo clic sul pulsante ++"Reboot System"++. Il sistema verrà riavviato. + +### Log In + +Il sistema è ora impostato e pronto per l'uso. Verrà visualizzata la console Rocky Linux. + +![Rocky Linux Welcome Screen](images/installation_9_F02.png) + +Per accedere al sistema: + +1. Digitare `rockstar` al prompt di login e premere ++enter++. + +2. Al prompt della password, digitate `04302021` (la password di Rockstar) e premete ++invio++ (la password non verrà riecheggiata sullo schermo, è normale). + +3. Eseguire il comando `whoami` dopo il login.\ + Questo comando mostra il nome dell'utente attualmente collegato. + +![Login Screen](images/installation_9.0_F03.png) diff --git a/docs/guides/email/02-basic-email-system.it.md b/docs/guides/email/02-basic-email-system.it.md index 73431db353..f1ee3f8690 100644 --- a/docs/guides/email/02-basic-email-system.it.md +++ b/docs/guides/email/02-basic-email-system.it.md @@ -1,12 +1,12 @@ --- title: Sistema di posta elettronica di base -auther: tianci li -contributors: Ganna Zhyrnova +author: tianci li +contributors: Ganna Zhyrnova, Neel Chauhan --- # Panoramica -Questo documento intende fornire al lettore una comprensione dettagliata dei vari componenti di un sistema di posta elettronica, compresa l'installazione, la configurazione di base e l'associazione. Si consiglia di utilizzare uno o più server di posta elettronica open source in un ambiente di produzione. +Questo documento si propone di fornire al lettore una comprensione dettagliata dei vari componenti di un sistema di posta elettronica, compresa la sua installazione e configurazione di base. Tutti i comandi di questo documento vengono eseguiti utilizzando **root(uid=0)**. @@ -20,17 +20,19 @@ Tutti i comandi di questo documento vengono eseguiti utilizzando **root(uid=0)** !!! info "Informazione" - Senza un database, la combinazione di postfix e dovecot creerà un sistema di posta elettronica funzionante. + Postfix e Dovecot possono ancora funzionare per una piccola installazione senza database. ### Installare e configurare `bind` +Innanzitutto, installare BIND: + ```bash Shell(192.168.100.7) > dnf -y install bind bind-utils ``` +Quindi, modificare `/etc/named.conf`: + ```bash -# Modificare il file di configurazione principale -Shell(192.168.100.7) > vim /etc/named.conf options { listen-on port 53 { 192.168.100.7; }; ... @@ -40,14 +42,17 @@ options { ... include "/etc/named.rfc1912.zones"; include "/etc/named.root.key"; +``` + +Verificare che la configurazione di BIND sia corretta. +```bash Shell(192.168.100.7) > named-checkconf /etc/named.conf ``` +Ora, modificare `/etc/named.rfc1912.zones`: + ```bash -# Modificare il file di zona -## In pratica, si può sostituire rockylinux.me con il nome del proprio dominio, ad esempio rockylinux.org -Shell(192.168.100.7) > vim /etc/named.rfc1912.zones zone "rockylinux.me" IN { type master; file "rockylinux.localhost"; @@ -55,12 +60,13 @@ zone "rockylinux.me" IN { }; ``` -!!! question "Domanda" +!!! question - **Che cos'è la zona DNS?** Una zona DNS è la porzione specifica di uno spazio dei nomi DNS ospitata su un server DNS. Una zona DNS contiene record di risorse e il server DNS risponde alle query per i record in quello spazio dei nomi. Un server DNS può avere più zone DNS. In poche parole, una zona DNS è l'equivalente di un catalogo di libri. + **Che cos'è una zona DNS?** Una zona DNS è una porzione dello spazio dei nomi DNS ospitata su un server DNS. Una zona DNS contiene record di risorse e un server DNS risponde alle query per i record in quello spazio dei nomi. Un server DNS può avere più zone DNS. In parole povere, una zona DNS è analoga a un catalogo di libri. + +Per prima cosa, inizializzare BIND: ```bash -# Modify data file Shell(192.168.100.7) > cp -p /var/named/named.localhost /var/named/rockylinux.localhost Shell(192.168.100.7) > vim /var/named/rockylinux.localhost $TTL 1D @@ -71,8 +77,7 @@ $TTL 1D 1W ; expire 3H ) ; minimum NS dns.rockylinux.me. - MX 2 mail.rockylinux.me. -dns A 192.168.100.7 + MX 2 mail.rockylinux.me. dns A 192.168.100.7 mail A 192.168.100.6 Shell(192.168.100.7) > named-checkzone rockylinux.me /var/named/rockylinux.localhost @@ -80,9 +85,13 @@ zone rockylinux.me/IN: loaded serial 0 OK ``` -Avviare il servizio bind - `systemctl start named.service` +Avviare ora BIND: + +```bash +Shell(192.168.100.7) > systemctl start named.service +``` -Possiamo verificare se gli host sotto il nome di dominio vengono risolti correttamente. +Possiamo verificare se la risoluzione DNS del nostro server funziona: ```bash Shell(192.168.100.7) > systemctl start named.service @@ -106,9 +115,11 @@ dns.rockylinux.me. 86400 IN A 192.168.100.7 !!! info "Informazione" - un nome di dominio non può rappresentare un host specifico. + Il nome del nostro dominio non può essere il nome host del nostro server. + +### Installare e configurare MySQL -### Installare e configurare `Mysql` +Per prima cosa, installate MySQL dal sorgente: ```bash Shell(192.168.100.5) > groupadd mysql && useradd -r -g mysql -s /sbin/nologin mysql @@ -127,9 +138,11 @@ Shell(192.168.100.5) > cd /usr/local/src/mysql-8.0.33 && mkdir build && cd build -DMYSQL_TCP_PORT=3306 \ -DWITH_BOOST=/usr/local/src/mysql-8.0.33/boost/ \ -DMYSQL_DATADIR=/usr/local/mysql/data \ -&& make && make install +&& make && make install ``` +Quindi, inizializziamo MySQL: + ```bash Shell(192.168.100.5) > chown -R mysql:mysql /usr/local/mysql Shell(192.168.100.5) > chmod -R 755 /usr/local/mysql @@ -140,8 +153,9 @@ Shell(192.168.100.5) > /usr/local/mysql/bin/mysqld --initialize --user=mysql 2023-07-14T14:46:51.305307Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: pkqaXRuTn1/N ``` +Quindi, modificare la configurazione di `/etc/my.cnf` come segue: + ```bash -Shell(192.168.100.5) > vim /etc/my.cnf [client] port=3306 socket=/tmp/mysql.sock @@ -154,25 +168,33 @@ basedir=/usr/local/mysql datadir=/usr/local/mysql/data user=mysql log-error=/usr/local/mysql/data/mysql_log.error +``` + +Ora, abilitate e accedete a MySQL: +```bash Shell(192.168.100.5) > /usr/local/mysql/bin/mysqld_safe --user=mysql & Shell(192.168.100.5) > /usr/local/mysql/bin/mysql -u root --password="pkqaXRuTn1/N" ``` +Quindi, aggiungiamo le voci del nostro dominio in MySQL: + ```sql Mysql > ALTER USER 'root'@'localhost' IDENTIFIED BY 'rockylinux.me'; -Mysql > create user 'mailrl'@'%' identified by 'mail.rockylinux.me'; +Mysql > create user 'mailrl'@'%' identified by 'mail.rockylinux.me'; Mysql > grant all privileges on *.* to 'mailrl'@'%' with grant option; ``` -!!! info "Informazione" +!!! info "Informazione" - Non è necessario utilizzare lo stesso metodo dell'autore. È anche possibile installare Mysql da un repository o da docker. + È anche possibile installare MySQL da un repository `dnf` o da un contenitore. #### Creare tabelle e inserire i dati +Creiamo ora le tabelle MySQL necessarie per Dovecot: + ```sql Shell(192.168.100.5) > /usr/local/mysql/bin/mysql -u mailrl --password="mail.rockylinux.me" @@ -200,9 +222,7 @@ Mysql > create table if not exists virtual_aliases ( destination varchar(100) NOT NULL, FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ); -``` -```sql Mysql > insert into virtual_domains(id,name) values(1,'mail.rockylinux.me'),(2,'rockylinux.me'); Mysql > insert into virtual_aliases(id,domain_id,source,destination) values(1,1,'all@mail.rockylinux.me','frank@mail.rockylinux.me'); @@ -210,22 +230,20 @@ Mysql > insert into virtual_aliases(id,domain_id,source,destination) values(1,1, Mysql > insert into virtual_aliases(id,domain_id,source,destination) values(2,1,'all@mail.rockylinux.me','leeo@mail.rockylinux.me'); ``` -In questo caso non ho inserito la password del testo cifrato per i relativi utenti di posta elettronica, che richiede l'uso del comando `doveadm pw -s SHA512-crypt -p twotestandtwo`. Vedere [qui](#ap1) +Le voci delle password per gli utenti di posta elettronica interessati non sono mostrate qui, in quanto richiedono l'uso del comando `doveadm pw -s SHA512-crypt -p twotestandtwo`. #### Nozioni di SHA512 (SHA-2) -SHA-2 (Secure Hash Algorithm 2): Un algoritmo crittografico per funzioni di hash standard. È il successore di SHA-1. +Gli algoritmi di hashing della password principali sono: -Standard principali: +- SHA-0 +- SHA-1 +- SHA-2: includes SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, and SHA-512/256 +- SHA-3 -* SHA-0 -* SHA-1 -* SHA-2: Contiene questi -- SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256 -* SHA-3 +Nello standard di hashing SHA-2, il numero dell'algoritmo si riferisce alla lunghezza del digest in bit. -Nello standard di crittografia SHA-2, il numero dell'algoritmo si riferisce alla lunghezza del digest in bit. - -È noto che in RockyLinux 8 e in altre varianti di RHEL 8, l'algoritmo utilizzato per crittografare le password degli utenti è SHA-512. +È noto che in Rocky Linux 8 e in altre varianti di RHEL 8, l'algoritmo predefinito utilizzato per crittografare le password degli utenti è SHA-512. Per recuperare l'algoritmo dell'insieme: ```bash Shell(192.168.100.5) > grep -i method /etc/login.defs @@ -239,44 +257,47 @@ Shell(192.168.100.5) > grep -i root /etc/shadow | cut -f 2 -d ":" $6$8jpmvCw8RqNfHYW4$pOlsEZG066eJuTmNHoidtvfWHe/6HORrKkQPwv4eyFxqGXKEXhep6aIRxAtv7FDDIq/ojIY1SfWAQkk7XACeZ0 ``` -Usare il segno $ per separare le informazioni del testo in uscita. +Le informazioni riportate nell'hash (separate da $) sono le seguenti: -* 6: Significa id. Per l'algoritmo di crittografia SHA-512, il valore è fissato a 6. -* 8jpmvCw8RqNfHYW4: Conosciuto anche come "salt". La sua funzione principale è quella di aumentare la sicurezza e migliorare la difficoltà di cracking. Il sistema può generarlo in modo casuale o può essere specificato manualmente. -* pOlsEZG066eJuTmNHoidtvfWHe/6HORrKkQPwv4eyFxqGXKEXhep6aIRxAtv7FDDIq/ojIY1SfWAQkk7XACeZ0: 86 numero fisso di caratteri. Si riferisce alle password di testo cifrato generate utilizzando algoritmi di crittografia. +- 6: Significa id. L'algoritmo di crittografia SHA-512 è fissato a 6. +- 8jpmvCw8RqNfHYW4: Conosciuto anche come "salt". La sua funzione principale è quella di aumentare la sicurezza e migliorare la difficoltà di cracking. Il sistema può generarlo in modo casuale, oppure può essere specificato manualmente. +- pOlsEZG066eJuTmNHoidtvfWHe/6HORrKkQPwv4eyFxqGXKEXhep6aIRxAtv7FDDIq/ojIY1SfWAQkk7XACeZ0: 86 numero fisso di caratteri. Si riferisce alle password di testo cifrato generate utilizzando algoritmi di crittografia. ### Installare e configurare `postfix` +Ora installeremo Postfix: + ```bash Shell(192.168.100.6) > dnf -y install postfix postfix-mysql ``` -Dopo aver installato Postfix, è necessario conoscere i seguenti file: +Dopo l'installazione di Postfix, è necessario modificare i seguenti file: -* **/etc/postfix/main.cf**. Il file di configurazione principale e più importante -* **/etc/postfix/master.cf**. Si usa per impostare i parametri di runtime per ciascun componente. In generale, non è necessario apportare modifiche, tranne nel caso in cui sia necessaria un'ottimizzazione delle prestazioni. -* **/etc/postfix/access**. File di controllo degli accessi per SMTP. -* **/etc/postfix/transport**. Mappa gli indirizzi e-mail agli host di relay. +- `/etc/postfix/main.cf`. Il file di configurazione principale e più importante +- `/etc/postfix/master.cf`. Si usa per impostare i parametri di runtime per ciascun componente. Questo file viene utilizzato se si vuole abilitare il filtro antispam o altre porte SMTP. +- `/etc/postfix/access`. File di controllo dell'accesso per SMTP. +- `/etc/postfix/transport`. Mappa gli indirizzi e-mail agli host di relay. È necessario conoscere questi file binari eseguibili: -* /**usr/sbin/postalias**. Istruzione di generazione del database alias. Dopo l'esecuzione di questo comando, viene generato /etc/aliases.db sulla base del file /etc/aliases -* **/usr/sbin/postcat**. Questo comando viene utilizzato per visualizzare il contenuto della posta nella coda di posta. -* **/usr/sbin/postconf**. Interrogazione delle informazioni di configurazione. -* **/usr/sbin/postfix**. I comandi del demone principale. Può essere utilizzato come segue: +- `/usr/sbin/postalias`: questo programma genera il database degli alias in `/etc/aliases.db` sulla base del file /etc/aliases. +- `/usr/sbin/postcat` visualizza il contenuto della posta nella coda di posta. +- `/usr/sbin/postconf` interroga la configurazione di Postfix. +- `/usr/sbin/postfix` è il demone principale. Può essere utilizzato come segue: + - `postfix check` + - `postfix start` + - `postfix stop` + - `postfix reload` + - `postfix status` - * `postfix check` - * `postfix start` - * `postfix stop` - * `postfix reload` - * `postfix status` +!!! tip -!!! tip "Suggerimento" - - È possibile specificare l'MTA predefinito utilizzando il comando `alternatives -config mta` se si dispone di più di un MTA sul server. + Se il server ha più di un MTA, è possibile specificare l'MTA predefinito usando il comando `alternatives -config mta`. #### Descrizione del file /etc/postfix/main.cf +È possibile visualizzare il file di configurazione di Postfix: + ```bash Shell(192.168.100.6) > egrep -v "^#|^$" /etc/postfix/main.cf compatibility_level = 2 @@ -313,58 +334,70 @@ meta_directory = /etc/postfix shlib_directory = /usr/lib64/postfix ``` -* **compatibility_level = 2**. Un nuovo meccanismo introdotto in Postfix 3 è stato progettato per essere compatibile con le versioni precedenti. -* **data_directory = /var/lib/postfix**. La directory in cui sono memorizzati i dati nella cache. -* **myhostname = host.domain.tld**. Parametri importanti che sono stati commentati. È necessario cambiarlo con l'hostname del proprio nome di dominio. -* **mydomain = domain.tld**. Parametri importanti che sono stati commentati. È necessario cambiarlo con il proprio nome di dominio. -* **myorigin = \$myhostname** and **myorigin = $mydomain**. Parametri importanti che sono stati commentati. La funzione principale è quella di integrare il suffisso di posta del mittente. **\$** rappresenta una variabile parametrica di riferimento. -* **inet_interfaces = localhost**. Quando si riceve la posta, questo parametro indica l'indirizzo da ascoltare. Il valore viene solitamente modificato in "all". -* **inet_protocols = all**. Abilitare IPv4 e IPv6, se supportato -* **mydestination = \$myhostname, localhost.\$mydomain, localhost**. Indica la ricezione di posta dalla destinazione indicata. -* **unknown_local_recipient_reject_code = 550**. Il codice di errore restituito quando si invia a un account che non esiste nel dominio locale o si rifiuta un'e-mail. -* **mynetworks =**. Impostare le e-mail degli host che possono essere inoltrate. -* **relay_domains = $mydestination**. Impostare le e-mail dei domini che possono essere inoltrate. -* **alias_maps = hash:/etc/aliases**. Viene utilizzato per definire gli alias degli utenti e richiede il supporto del database. -* **alias_database = hash:/etc/aliases**. Il database da utilizzare per gli alias. -* **home_mailbox = Maildir/**. Parametri importanti che sono stati commentati. Indica dove è memorizzata la casella di posta locale. -* **debug_peer_level = 2**. Livello dei record di registro. -* **setgid_group = postdrop**. L'identificativo del gruppo utilizzato per inviare e-mail o gestire le code. +La spiegazione di questi parametri è la seguente: + +- `compatibility_level = 2`: Abilita la compatibilità con le configurazioni di Postfix 2.x. +- `data_directory = /var/lib/postfix`. La directory della cache di Postfix. +- `myhostname = host.domain.tld`: **Importante:** è necessario cambiarlo con il nome dell'host sotto il proprio nome di dominio. +- `mydomain = domain.tld`: **Importante:** è necessario cambiarlo con il nome del proprio dominio. +- `myorigin = $myhostname` e `myorigin = $mydomain`: **Importante:** parametri che sono stati commentati. La funzione principale è quella di integrare il suffisso di posta del mittente. `$` rappresenta una variabile parametro di riferimento. +- `inet_interfaces = localhost`: Le interfacce da ascoltare. Questo valore viene solitamente modificato in "all". +- `inet_protocols = all`: Abilita IPv4 e IPv6 se viene trovato un indirizzo. +- `mydestination = \$myhostname, localhost.\$mydomain, localhost`: indica gli host di destinazione del server di posta. +- `unknown_local_recipient_reject_code = 550`: Il codice di errore restituito quando si riceve un'e-mail a una destinazione sconosciuta o si rifiuta un'e-mail. +- `mynetworks =`: Imposta le reti da cui accettare le e-mail. +- `relay_domains = $mydestination`: Imposta i domini da cui inviare i messaggi di posta elettronica. +- `alias_maps = hash:/etc/aliases`: Elenco degli alias del nostro server di posta elettronica. +- `alias_database = hash:/etc/aliases`: Il database deve essere utilizzato da alias. +- `home_mailbox = Maildir/`: Importante: Posizione della casella di posta locale. +- `debug_peer_level = 2`: Livello dei record di log. +- `setgid_group = postdrop`: Il gruppo Unix per la gestione delle code di Postfix. A parte le voci di parametro menzionate o visualizzate sopra, alcuni parametri sono nascosti e possono essere visualizzati tramite il comando `postconf`. I parametri più importanti sono: -* **message_size_limit = 10240000**. Impostare le dimensioni di una singola e-mail (compresi il corpo e gli allegati). L'unità di misura del valore è B (Byte). -* **mailbox_size_limit = 1073741824**. Impostare il limite di capienza per un singolo utente della mailbox. -* **smtpd_sasl_type = cyrus**. Il tipo di autenticazione SASL (Simple Authentication and Security Layer). È possibile utilizzare `postconf -a` per visualizzare. -* **smtpd_sasl_auth_enable = no**. Abilitare o meno l'autenticazione SASL. -* **smtpd_sasl_security_options = noanonymous**. Opzioni di sicurezza per SASL. L'autenticazione anonima è disattivata per impostazione predefinita. -* **smtpd_sasl_local_domain =**. Il nome del dominio locale. -* **smtpd_recipient_restrictions =**. Filtro dei destinatari. Il valore di default è vuoto. +- `message_size_limit = 10240000`. Dimensione massima di un singolo messaggio in byte. +- `mailbox_size_limit = 1073741824`: Dimensione massima della casella di posta elettronica di un utente. +- `smtpd_sasl_type = cyrus`: Il software del server IMAP utilizzato per l'autenticazione SASL. È possibile utilizzare `postconf -a` per visualizzarlo. +- `smtpd_sasl_auth_enable = no`: Se abilitare l'autenticazione SASL. +- **smtpd_sasl_security_options = noanonymous**. Opzioni di sicurezza per SASL. L'autenticazione anonima è disattivata per impostazione predefinita. +- **smtpd_sasl_local_domain =**. Il nome del dominio locale. +- **smtpd_recipient_restrictions =**. Filtro dei destinatari. Il valore di default è vuoto. #### Modificare /etc/postfix/main.cf +Con i pacchetti installati, devi configurare Postfix. Effettua le seguenti modifiche in `/etc/postfix/main.cf`: + ```bash -Shell(192.168.100.6) > vim /etc/postfix/main.cf -... -myhostname = mail.rockylinux.me -mydomain = rockylinux.me -myorigin = $myhostname -inet_interfaces = 192.168.100.6 -inet_protocols = ipv4 -mydestination = -biff = no -append_dot_mydomain = no -smtpd_sasl_type = dovecot -smtpd_sasl_path = private/auth -smtpd_sasl_auth_enable = yes -smtpd_sasl_local_domain = $myhostname -virtual_transport = lmtp:unix:private/dovecot-lmtp -virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf -virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf -virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-virtual-email2email.cf -... +Shell(192.168.100.6) > vim /etc/postfix/mysql-virtual-mailbox-domains.cf +user = mailrl +password = mail.rockylinux.me +hosts = 192.168.100.5 +dbname = mailserver +query = SELECT 1 FROM virtual_domains WHERE name='%s' + +Shell(192.168.100.6) > vim /etc/postfix/mysql-virtual-mailbox-maps.cf +user = mailrl +password = mail.rockylinux.me +hosts = 192.168.100.5 +dbname = mailserver +query = SELECT 1 FROM virtual_users WHERE email='%s' + +Shell(192.168.100.6) > vim /etc/postfix/mysql-virtual-alias-maps.cf +user = mailrl +password = mail.rockylinux.me +hosts = 192.168.100.5 +dbname = mailserver +query = SELECT destination FROM virtual_aliases WHERE source='%s' + +Shell(192.168.100.6) > vim /etc/postfix/mysql-virtual-email2email.cf +user = mailrl +password = mail.rockylinux.me +hosts = 192.168.100.5 +dbname = mailserver +query = SELECT email FROM virtual_users WHERE email='%s' ``` -Il contenuto finale del file appare così: +La configurazione finale dovrebbe somigliare a questa: ```text compatibility_level = 2 @@ -414,31 +447,41 @@ meta_directory = /etc/postfix shlib_directory = /usr/lib64/postfix ``` -Creare un file e scrivere il contenuto corrispondente: +Crea e modifica i seguenti file: + +In `/etc/postfix/mysql-virtual-mailbox-domains.cf`: ```bash -Shell(192.168.100.6) > vim /etc/postfix/mysql-virtual-mailbox-domains.cf user = mailrl password = mail.rockylinux.me hosts = 192.168.100.5 dbname = mailserver query = SELECT 1 FROM virtual_domains WHERE name='%s' +``` -Shell(192.168.100.6) > vim /etc/postfix/mysql-virtual-mailbox-maps.cf +In `/etc/postfix/mysql-virtual-mailbox-maps.cf`: + +```bash user = mailrl password = mail.rockylinux.me hosts = 192.168.100.5 dbname = mailserver query = SELECT 1 FROM virtual_users WHERE email='%s' +``` -Shell(192.168.100.6) > vim /etc/postfix/mysql-virtual-alias-maps.cf +In `/etc/postfix/mysql-virtual-alias-maps.cf`: + +```bash user = mailrl password = mail.rockylinux.me hosts = 192.168.100.5 dbname = mailserver query = SELECT destination FROM virtual_aliases WHERE source='%s' +``` -Shell(192.168.100.6) > vim /etc/postfix/mysql-virtual-email2email.cf +In `/etc/postfix/mysql-virtual-email2email.cf`: + +```bash user = mailrl password = mail.rockylinux.me hosts = 192.168.100.5 @@ -446,18 +489,18 @@ dbname = mailserver query = SELECT email FROM virtual_users WHERE email='%s' ``` -!!! warning "Attenzione" +!!! warning "Attenzione" - Se si riscontra questo tipo di errore dopo aver eseguito `systemctl start postfix.service` -- "fatal: open lock file /var/lib/postfix/master.lock: unable to set exclusive lock: Resource temporarily unavailable." Si prega di cancellare il file esistente **/var/lib/postfix/master.lock** + Se riscontri questo tipo di errore dopo aver eseguito `systemctl start postfix.service`: `fatal: open lock file /var/lib/postfix/master.lock: impossibile impostare il blocco esclusivo: Risorsa temporaneamente non disponibile.`, sei pregato di eliminare il file `/var/lib/postfix/master.lock` esistente -Verifica della configurazione di Postfix: +Test della nostra configurazione di Postfix: ```bash Shell(192.168.100.6) > systemctl start postfix.service Shell(192.168.100.6) > postfix check Shell(192.168.100.6) > postfix status -# If the command return 1, it is successful. +# Se il comando restituisce 1, è riuscito. Shell(192.168.100.6) > postmap -q mail.rockylinux.me mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf Shell(192.168.100.6) > echo $? 1 @@ -472,10 +515,9 @@ frank@mail.rockylinux.me,leeo@mail.rockylinux.me #### Modificare /etc/postfix/master.cf -Il file modificato ha il seguente aspetto: +Il file `/etc/postfix/master.cf` modificato somiglia a questo: ```bash -Shell(192.168.100.6) > egrep -v "^#|^$" /etc/postfix/master.cf smtp inet n - n - - smtpd submission inet n - n - - smtpd -o syslog_name=postfix/submission @@ -500,10 +542,9 @@ smtps inet n - n - - smtpd -o smtpd_recipient_restrictions= -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING -... ``` -Infine, eseguite il comando `systemctl restart postfix.service`. A questo punto, la configurazione di postfix è terminata. +Infine, esegui `systemctl restart postfix.service`. A questo punto, abbiamo configurato Postfix. ### Installare e configurare `dovecot` @@ -511,7 +552,7 @@ Infine, eseguite il comando `systemctl restart postfix.service`. A questo punto, Shell(192.168.100.6) > dnf config-manager --enable devel && dnf -y install dovecot dovecot-devel dovecot-mysql ``` -Senza modificare alcun file, la struttura della directory originale è la seguente: +Senza modificare alcun file, la struttura predefinita della directory di Dovecot è la seguente: ```bash Shell(192.168.100.6) > tree /etc/dovecot/ @@ -545,69 +586,77 @@ Shell(192.168.100.6) > tree /etc/dovecot/ └── dovecot.conf ``` -Sì, sia Postfix che Dovecot hanno configurazioni molto complesse, quindi si raccomanda alla maggior parte degli amministratori di sistemi GNU/Linux di utilizzare server di posta elettronica open source. - -Come per postfix, inserire il comando `doveconf` per visualizzare la configurazione completa. +Come con Postfix, inserisci il comando `doveconf` per visualizzare la configurazione completa. La descrizione del file è la seguente: -* **dovecot.conf**: Il file di configurazione principale di dovecot. +- `dovecot.conf` è il file di configurazione principale di Dovecot. + - Carica altri file di configurazione tramite `!include conf.d/*.conf`. + - Il prefisso numerico del file di configurazione secondaria serve a facilitare la comprensione dell'ordine di parsing. + - Per ragioni storiche, alcuni file di configurazione sono ancora separati, tipicamente denominati `*.conf.ext`. + - Nel file di configurazione si possono utilizzare variabili suddivise in **variabili globali** e **variabili utente**, che iniziano con `%`. Si veda il [sito Dovecot a riguardo a questo proposito](https://doc.dovecot.org/2.3/configuration_manual/config_file/config_variables/). - * Caricare i file di configurazione secondari con il metodo `!include conf.d/*.conf`. Dovecot non si preoccupa di quali impostazioni siano presenti in tali file. - * Il prefisso numerico del file di configurazione secondaria serve a facilitare la comprensione dell'ordine di parsing. - * Per ragioni storiche, esistono ancora alcuni file di configurazione esterni al file principale `dovecot.conf`, che sono tipicamente denominati `*.conf.ext`. - * Nel file di configurazione si possono usare variabili, che si dividono in **variabili globali** e **variabili utente**, che iniziano con `%`. Vedere [qui](https://doc.dovecot.org/configuration_manual/config_file/config_variables/#config-variables). - -* **10-auth.conf**. Configurazione relativa all'autenticazione dell'identità. -* **10-logging.conf**. Configurazione relativa al registro. Può essere molto utile nell'analisi delle prestazioni, nel debug del software, ecc. -* **10-mail.conf**. Configurazione delle posizioni delle caselle postali e degli spazi dei nomi. Per impostazione predefinita, il valore della posizione della casella di posta dell'utente è vuoto, il che significa che Dovecot cerca automaticamente la posizione della casella di posta. Quando l'utente non ha alcuna posta, è necessario indicare esplicitamente a Dovecot la posizione di tutte le caselle di posta. -* **10-metrics.conf**. Configurazione relativa alle informazioni statistiche. -* **15-mailboxes.conf**. Configurazione della definizione della mailbox. -* **auth-sql.conf.ext**. Autenticazione per gli utenti SQL. +- `10-auth.conf`: Configurazione dell'autenticazione. +- `10-logging.conf`. Configurazione del registro. +- `10-mail.conf`. Configurazione delle posizioni delle caselle e degli spazi dei nomi. Per impostazione predefinita, il valore della posizione della casella di posta dell'utente è vuoto, il che significa che Dovecot cerca automaticamente la posizione della casella di posta. Quando l'utente non ha alcuna email, è necessario indicare esplicitamente a Dovecot la posizione di tutte le caselle di posta. +- `10-metrics.conf`. Configurazione delle statistiche. +- `15-mailboxes.conf`. Configurazione delle caselle postali. +- `auth-sql.conf.ext`. Configurazione utente SQL. #### Alcuni importanti parametri del file di configurazione -* `protocols = imap pop3 lmtp submission`. Protocolli supportati da Dovecot. -* `listen = *, ::`. Un elenco separato da virgole di IP o host da cui ascoltare per le connessioni. "*" ascolta tutte le interfacce IPv4, "::" ascolta tutte le interfacce IPv6. -* `disable_plaintext_auth = yes`. Disattivare o meno la password in chiaro per l'autenticazione. -* `auth_mechanisms =`. Il tipo di meccanismo di autenticazione, i cui valori possono essere multipli e separati da spazi. Valori: plain, login, digest-md5, cram-md5, ntlm, rpa, apop, anonymous, gssapi, otp, skey, gss-spnego. -* `login_trusted_networks=`. Quali client (MUA) sono autorizzati a usare Dovecot. Può essere un indirizzo IP separato, può essere un segmento di rete o può essere misto e separato da spazi. Come questo-- `login_trusted_networks = 10.1.1.0/24 192.168.100.2` -* `mail_location =`. Se il valore è vuoto, Dovecot tenta di trovare automaticamente le caselle di posta elettronica (cercando in ~/Maildir, /var/mail/username, ~/mail e ~/Mail, in quest'ordine). Tuttavia, il rilevamento automatico di solito fallisce per gli utenti la cui directory di posta non è ancora stata creata, quindi si dovrebbe indicare esplicitamente la posizione completa qui, se possibile. -* `mail_privileged_group =`. Questo gruppo è abilitato temporaneamente per le operazioni privilegiate. Attualmente viene utilizzato solo con INBOX quando la sua creazione iniziale o il blocco dei punti falliscono. In genere si imposta "mail" per accedere a /var/mail. +- `protocolli = imap pop3 lmtp invio`: Elenco dei protocolli da utilizzare. +- `listen = *, ::`: Un elenco separato da virgole di IP o host in cui ascoltare le connessioni. `*` ascolta tutte le interfacce IPv4, `::` ascolta tutte le interfacce IPv6. +- `disable_plaintext_auth = yes`: se disattivare l'autenticazione in chiaro. +- `auth_mechanisms =`: Il tipo di meccanismo di autenticazione da utilizzare. È possibile specificare più valori, separati da spazi. Valori: plain, login, digest-md5, cram-md5, ntlm, rpa, apop, anonymous, gssapi, otp, skey, gss-spnego. +- `login_trusted_networks =`: Quali reti IP sono autorizzate a usare Dovecot. Può essere un singolo indirizzo IP, un segmento di rete o entrambi. Per esempio: `login_trusted_networks = 10.1.1.0/24 192.168.100.2` +- `mail_location =`: Con un valore vuoto, Dovecot tenta di trovare automaticamente le caselle di posta (cercando in `~/Maildir`, `/var/mail/username`, `~/mail`, e `~/Mail`, in questo ordine). Tuttavia, il rilevamento automatico fallisce per gli utenti la cui cartella dell'email non è ancora stata creata, quindi dovresti dichiarare qui, esplicitamente, se possibile, la posizione completa. +- `mail_privileged_group =`: Questo gruppo è abilitato temporaneamente per le operazioni privilegiate. Viene utilizzato solo con l'INBOX quando la sua creazione iniziale o il dotlocking falliscono. In genere, per accedere a `/var/mail` si imposta `mail`. #### Modifica di più file +Per prima cosa, modificare la configurazione di Dovecot in `/etc/dovecot/dovecot.conf`: + ```bash -Shell(192.168.100.6) > vim /etc/dovecot/dovecot.conf -... protocols = imap pop3 lmtp listen = 192.168.100.6 -... ``` +Successivamente, modificare la configurazione dell'archiviazione della posta in `/etc/dovecot/conf.d/10-mail.conf`: + ```bash -Shell(192.168.100.6) > vim /etc/dovecot/conf.d/10-mail.conf -... # %u - username # %n - user part in user@domain, same as %u if there's no domain # %d - domain part in user@domain, empty if there's no domain # %h - home directory mail_location = maildir:/var/mail/vhosts/%d/%n -... mail_privileged_group = mail -... ``` -Creazione delle directory correlate -- `mkdir -p /var/mail/vhosts/rockylinux.me`. `rockylinx.me` si riferisce al nome di dominio per il quale si è fatta richiesta (chiamato dominio o dominio locale nella posta elettronica). +Creare la directory della posta: + +```bash +Shell(192.168.100.7) > mkdir -p /var/mail/vhosts/rockylinux.me +``` + +`rockylinux.me` si riferisce al nome di dominio che state ospitando. + +Aggiungere l'utente Dovecot e la directory home: -Aggiungere utenti correlati e specificare la directory home -- `groupadd -g 2000 vmail && useradd -g vmail -u 2000 -d /var/mail/ vmail` +```bash +Shell(192.168.100.7) > groupadd -g 2000 vmail +Shell(192.168.100.7) > useradd -g vmail -u 2000 -d /var/mail/ vmail +``` -Modifica del proprietario e del gruppo -- `chown -R vmail:vmail /var/mail/` +Cambiare il proprietario e il gruppo: + +```bash +Shell(192.168.100.7) > chown -R vmail:vmail /var/mail/ +``` -Cancellare i commenti relativi al file: +Abilitare i database dei nomi utente e delle password in `/etc/dovecot/conf.d/auth-sql.conf.ext`: ```bash -Shell(192.168.100.6) > vim /etc/dovecot/conf.d/auth-sql.conf.ext passdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext @@ -616,40 +665,44 @@ userdb { driver = static args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n } -... ``` !!! warning "Attenzione" - Non scrivete la sintassi di cui sopra su una sola riga, come in questo caso--"userdb {driver = sql args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n}". Altrimenti, non funzionerà. + Non scrivere la precedente sintassi su una singola riga, come in questo caso: `userdb {driver = sql args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n}`. Altrimenti, non funzionerà. -Creare il file /etc/dovecot/dovecot-sql.conf.ext e scrivere il relativo contenuto: +Modifica il file `/etc/dovecot/dovecot-sql.conf.ext` con i seguenti contenuti: ```bash -Shell(192.168.100.6) > vim /etc/dovecot/dovecot-sql.conf.ext driver = mysql connect = host=192.168.100.5 dbname=mailserver user=mailrl password=mail.rockylinux.me default_pass_scheme = SHA512-CRYPT password_query = SELECT password FROM virtual_users WHERE email='%u' ``` -Modifica del proprietario e del gruppo -- `chown -R vmail:dovecot /etc/dovecot` +Ora, modifica il proprietario e il gruppo: -Modificare i permessi delle cartelle -- `chmod -R 770 /etc/dovecot` +```bash +Shell(192.168.100.7) > chown -R vmail:dovecot /etc/dovecot +``` + +Quindi, modifica le autorizzazioni della cartella: + +```bash +Shell(192.168.100.7) > chmod -R 770 /etc/dovecot +``` + +Ora, nella configurazione di `/etc/dovecot/conf.d/10-auth.conf`, aggiungi quanto segue: ```bash -Shell(192.168.100.6) > vim /etc/dovecot/conf.d/10-auth.conf disable_plaintext_auth = yes -... auth_mechanisms = plain login -... -#!include auth-system.conf.ext !include auth-sql.conf.ext ``` +In `/etc/dovecot/conf.d/10-master.conf`, aggiungi: + ```bash -Shell(192.168.100.6) > vim /etc/dovecot/conf.d/10-master.conf -... service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 @@ -657,7 +710,6 @@ service lmtp { group = postfix } } -... service auth { unix_listener auth-userdb { mode = 0600 @@ -675,16 +727,19 @@ service auth { service auth-worker { user = vmail } -... ``` -OK, utilizzare il comando per avviare il servizio-- `systemctl start dovecot.service` +Ora, abilita Dovecot: -!!! info "Informazione" +```bash +Shell(192.168.100.7) > systemctl enable --now dovecot +``` + +!!! info "Info" - Durante l'inizializzazione di dovecot, il file **/usr/libexec/dovecot/mkcert.sh** viene eseguito per generare un certificato autofirmato. + Durante l'inizializzazione di Dovecot, il file **/usr/libexec/dovecot/mkcert.sh** viene eseguito per generare un certificato autofirmato. -È possibile verificare l'occupazione della porta con il seguente comando: +Puoi controllare le porte d'ascolto utilizzando il seguente comando: ```bash Shell(192.168.100.6) > ss -tulnp @@ -703,11 +758,12 @@ tcp LISTEN 0 100 192.168.100.6:465 tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=732,fd=4)) ``` -Porte occupate da postfix -- 25, 587, 465 Porte occupate da dovecot -- 993, 995, 110, 143 +Nel risultato precedente, le porte utilizzate sono: -È possibile utilizzare il comando `doveadm` per generare la password cifrata pertinente e inserirla nella tabella virtual_users. +- Da Postfix: 25, 587, 465 +- Da Dovecot: 993, 995, 110, 143 - +Puoi utilizzare il comando `doveadm` per geerare la password in testo cifrato rilevante e inserirla nella tabella virtual\_users. ```bash Shell(192.168.100.6) > doveadm pw -s SHA512-crypt -p onetestandone @@ -717,9 +773,10 @@ Shell(192.168.100.6) > doveadm pw -s SHA512-crypt -p twotestandtwo {SHA512-CRYPT}$6$TF7w672arYUk.fGC$enDafylYnih4q140B2Bu4QfEvLCQAiQBHXpqDpHQPHruil4j4QbLXMvctWHdZ/MpuwvhmBGHTlNufVwc9hG34/ ``` -Inserire i dati pertinenti sull'host 192.168.100.5. +Inserisci i dati rilevanti sul host 192.168.100.5: ```sql +Shell(192.168.100.5) > /usr/local/mysql/bin/mysql -u root --password="pkqaXRuTn1/N" Mysql > use mailserver; Mysql > insert into virtual_users(id,email,password,domain_id) values(1,'frank@mail.rockylinux.me','$6$dEqUVsCirHzV8kHw$hgC0x0ufah.N0PzUVvhLEMnoww5lo.JBmeLSsRNDkgWVylC55Gk6zA1KWsn.SiIAAIDEqHxtugGZWHl1qMex..',1); @@ -731,9 +788,9 @@ Mysql > insert into virtual_users(id,email,password,domain_id) values(2,'leeo@ma #### Autenticazione dell'utente -Utilizzare un altro computer Windows10 e cambiare il suo DNS preferito in 192.168.100.7. L'autore utilizza foxmail come client di posta elettronica. +Utilizzare un computer client e cambiare il suo DNS preferito in 192.168.100.7. L'autore utilizza Foxmail su Windows 10 come client di posta. -Nella schermata principale, selezionare "Altra casella di posta" --> "Manuale" --> Inserire il contenuto pertinente per completare. --> "Creare" +Nella schermata principale, selezionare **Altre caselle di posta** --> **Manuale** --> Immettere i campi pertinenti e selezionare **Crea**: ![test1](./email-images/test1.jpg) @@ -741,7 +798,7 @@ Nella schermata principale, selezionare "Altra casella di posta" --> "Manuale" - #### Inviare un'e-mail -Utilizzare questo utente per tentare di inviare un'e-mail a un utente leeo. +Utilizzare l'utente **frank** per tentare di inviare un'e-mail all'utente **leeo**. ![test3](./email-images/test3.jpg) @@ -751,5 +808,5 @@ Utilizzare questo utente per tentare di inviare un'e-mail a un utente leeo. ### Descrizione aggiuntiva -* Dovete disporre di un nome di dominio legittimato (dominio) -* Dovete richiedere un certificato SSL/TLS per il vostro sistema di posta elettronica +- È necessario disporre di un nome di dominio o di una voce DNS interna con record MX che puntino al server. +- Dovreste ottenere un certificato SSL tramite [Let's Encrypt](https://docs.rockylinux.org/guides/security/generating_ssl_keys_lets_encrypt/) o un'altra fonte. diff --git a/docs/guides/file_sharing/samba_file_share.it.md b/docs/guides/file_sharing/samba_file_share.it.md new file mode 100644 index 0000000000..08dafe3485 --- /dev/null +++ b/docs/guides/file_sharing/samba_file_share.it.md @@ -0,0 +1,101 @@ +--- +title: Samba Condivisione file di Windows +author: Neel Chauhan +contributors: Steven Spencer, Ganna Zhyrnova +tested_with: 9.4 +tags: + - file transfer + - windows +--- + +## Introduzione + +Se si ha mai avuto a che fare con i sistemi Windows, probabilmente si è a conoscenza di SMB (Server Message Block) per la condivisione dei file. Se si è amministratori Linux esperti, è probabile che si abbia sentito parlare di Samba, ma se così non è, [Samba](https://www.samba.org/) è l'implementazione open-source de facto di SMB per consentire la condivisione di file e l'accesso ad Active Directory da macchine Linux a reti Windows. + +## Installazione + +È necessario installare Samba utilizzando `dnf`: + +```bash +dnf install -y samba +``` + +## Impostazione una condivisione + +Per prima cosa, creare una directory da condividere con i client Windows: + +```bash +mkdir /var/store +``` + +Quindi, impostare le labels SELinux sulla directory `/var/store`: + +```bash +semanage fcontext -a -t samba_share_t "/var/store(/.*)?" +restorecon -Rv /var/store +``` + +Sostituire `/var/store` con la directory da condividere. + +Ora configurare Samba: + +```bash +vi /etc/samba/smb.conf +``` + +Nel file `smb.conf`, andare in fondo e inserire quanto segue: + +```bash +[Share] + path = /var/store + browseable = yes + writable = no + read only = yes + guest ok = yes +``` + +Se non siete a conoscenza delle opzioni di cui sopra, esse sono: + +- `percorso' è la directory che si sta condividendo. Impostare la cartella corrispondente (`/var/store\` nel nostro caso). +- `browseable` è per consentire ai client di accedere alla navigazione. Se si vuole disabilitare la navigazione, impostare questo valore su `no`. +- `writable` è per consentire ai client l'accesso in scrittura. Se si desidera consentire l'accesso in scrittura, impostare questo valore su `yes`. +- `read only` contrassegna la condivisione come di sola lettura. Se si desidera consentire l'accesso in scrittura o in esecuzione, impostare questo valore su `no`. +- `guest ok` è per consentire agli utenti non autenticati di accedere alla nostra condivisione. Se si desidera negare l'accesso agli ospiti, impostare questo valore su `no`. + +per testare la configurazione, si può eseguire quanto segue: + +```bash +testparm +``` + +## Abilitare Samba + +Una volta che la configurazione è stata verificata, aprire la porta Samba in `firewall-cmd`: + +```bash +firewall-cmd --permanent --add-service=samba +firewall-cmd --reload +``` + +Successivamente, è possibile abilitare Samba: + +```bash +systemctl enable --now smb nmb +``` + +## Accesso alla condivisione Samba + +È possibile accedere alla condivisione Samba utilizzando il seguente URI (Nota: sostituire `SERVER_IP` con l'indirizzo IP o FQDN della macchina su cui è in esecuzione Samba): + +- Windows: `\\SERVER_IP` +- Linux or Mac: `smb://SERVER_IP` + +`SERVER_IP` sulla rete domestica dell'autore è `172.20.0.100`, quindi mentre le istruzioni variano a seconda del sistema operativo, l'autore accederà alla nuova condivisione dal suo notebook Fedora 40: + +![Fedora 40 Nautilus che mostra il nostro Samba Share](../images/samba_nautilus.png) + +Tutti i file accessibili sul server sono disponibili anche sui computer client. + +## Conclusione + +Sebbene SMB abbia la reputazione di essere incentrato su Microsoft, si tratta di uno standard di settore e la condivisione Samba può essere accessibile da Linux, Mac, BSD e persino da dispositivi mobili. Congratulazioni, ora si sta condividendo i file del vostro server! diff --git a/docs/guides/file_sharing/transmission_daemon.it.md b/docs/guides/file_sharing/transmission_daemon.it.md new file mode 100644 index 0000000000..efc9ed2485 --- /dev/null +++ b/docs/guides/file_sharing/transmission_daemon.it.md @@ -0,0 +1,122 @@ +--- +title: Trasmissione BitTorrent Seedbox +author: Neel Chauhan +contributors: Steven Spencer, Ganna Zhyrnova +tested_with: 9.4 +tags: + - file transfer +--- + +## Introduzione + +BitTorrent non ha bisogno di presentazioni, ma se non lo si sa, BitTorrent è un protocollo di condivisione di file peer-to-peer. BitTorrent si basa sul seeding (caricamento) del file richiesto da parte di più peer, ma anche sul seeding per i futuri downloader. + +Transmission è un popolare client BitTorrent open-source con diversi frontend e backend. Qui si installerà il backend headless “daemon”. + +Nell'attuale mondo mobile-centrico, ha più senso eseguire Transmission come server headless piuttosto che direttamente su un laptop o un desktop. In questo modo, è possibile seminare i file 24 ore su 24, 7 giorni su 7, senza consumare la batteria del dispositivo mobile durante il download. + +## Installazione + +Per installare Transmission, è necessario prima installare EPEL: + +```bash +dnf install -y epel-release +``` + +Poi installare Transmission: + +```bash +dnf install -y transmission-daemon +``` + +## Primo setup + +A differenza della maggior parte dei deamon Linux, Transmission imposta la configurazione al primo avvio, quindi avviare e arrestare Transmission con: + +```bash +systemctl start transmission-daemon +systemctl stop transmission-daemon +``` + +Dopo questi passaggi, si avrà un file di configurazione. Sarebbe meglio interrompere Transmission, poiché non è possibile modificare il file di configurazione mentre è in esecuzione. + +## Configurazione + +Configurare Transmission: + +```bash +cd /var/lib/transmission/.config/transmission-daemon +vi settings.json +``` + +Navigare fino alla voce JSON `“peer-port”` e, se si desidera, sostituire la porta standard con la porta desiderata: + +```bash + "peer-port": 51413, +``` + +Qui l'autore lo cambia in `12345`: + +```bash + "peer-port": 12345, +``` + +Successivamente, passare alla voce JSON `“rpc-password”` e modificare la password: + +```bash + "rpc-password": "{9cfaaade11d56c8e82bfc23b696fa373fb20c10e4U2NXY3.", +``` + +Inserire qui la password in chiaro. Se la sicurezza è un problema, si noti che Transmission cripterà la password al successivo riavvio. + +Se si desidera consentire l'accesso da altri indirizzi IP, navigare nella voce `“rpc-whitelist”`: + +```bash + "rpc-whitelist": "127.0.0.1,::1", +``` + +Ad esempio, se si vuole consentire l'accesso al desktop all'indirizzo IP `192.168.1.100`, lo si può aggiungere al valore separato da virgole: + +```bash + "rpc-whitelist": "127.0.0.1,::1,192.168.1.100", +``` + +Se non si desidera una whitelist IP, è possibile disabilitarla impostando `“rpc-whitelist-enable”` su `false`: + +```bash + "rpc-whitelist-enabled": false, +``` + +Al termine della configurazione, avviare e attivare Transmission: + +```bash +systemctl enable --now transmission-daemon +``` + +## Configurazione del firewall e di rete + +Successivamente, è necessario consentire le rispettive porte `12345` (per BitTorrent) e `9091` (per il pannello di controllo di Transmission) nel firewall: + +```bash +firewall-cmd --permanent --zone=public --add-port=12345/tcp +firewall-cmd --permanent --zone=public --add-port=9091/tcp +firewall-cmd --runtime-to-permanent +``` + +Se non ci si trova dietro un router abilitato NAT-PMP o UPnP, o se si è connessi senza NAT, è necessario inoltrare la porta BitTorrent (`12345` in questo esempio). Ogni router è diverso, ma a titolo di esempio sul router MikroTik dell'autore: + +```bash +/ip firewall nat add action=dst-nat chain=dstnat dst-port=12345 in-interface=ether1 protocol=tcp to-addresses=SERVER_IP to-ports=12345 +``` + +Sostituire `SERVER_IP` con l'indirizzo IP del server che esegue Transmission. + +## Testare Transmission + +Andare all'indirizzo IP dove è in esecuzione del server Transmission. Ad esempio, è possibile scaricare il torrent di una distribuzione Linux come Ubuntu: + +![Our Transmission downloading Ubuntu](../images/transmission.png) + +## Conclusione + +BitTorrent è stato progettato nei primi anni 2000, quando la maggior parte delle persone si connetteva a Internet tramite un PC desktop. Mentre l'esecuzione di BitTorrent su un laptop o un telefono è poco pratica, l'esecuzione su un server headless tramite Transmission è perfetta. In questo modo, si può caricare i file 24 ore su 24, 7 giorni su 7, ma i download saranno sempre disponibili. diff --git a/docs/guides/hardware/hpe_amsd.it.md b/docs/guides/hardware/hpe_amsd.it.md new file mode 100644 index 0000000000..7745692191 --- /dev/null +++ b/docs/guides/hardware/hpe_amsd.it.md @@ -0,0 +1,65 @@ +--- +title: HPE ProLiant Agentless Management Service +author: Neel Chauhan +contributors: Ganna Zhyrnova +tested_with: 9.3 +tags: + - hardware +--- + +# HPE ProLiant Agentless Management Service + +## Introduzione + +I server HPE ProLiant dispongono di un software complementare denominato Agentless Management Service che, secondo HPE: + +> utilizza la comunicazione fuori banda per una maggiore sicurezza e stabilità. + +Inoltre: + +> con Agentless Management, il monitoraggio dello stato di salute e gli avvisi sono integrati nel sistema e iniziano a funzionare nel momento in cui l'alimentazione ausiliaria viene collegata al server. + +Questo viene utilizzato, ad esempio, per ridurre la velocità delle ventole su un HPE ProLiant ML110 Gen11 nel home lab dell'autore. + +## Prerequisiti e presupposti + +I requisiti minimi per l'utilizzo di questa procedura sono i seguenti: + +- Un server HP/HPE ProLiant Gen8 o più recente con iLO attivato e visibile sulla rete + +## Installazione di `amsd` + +Per installare `amsd`, è necessario prima installare EPEL (Extra Packages for Enterprise Linux) ed eseguire gli aggiornamenti: + +```bash +dnf -y install epel-release && dnf -y update +``` + +Aggiungere quindi quanto segue a `/etc/yum.repos.d/spp.repo`: + +```bash + +[spp] +name=Service Pack for ProLiant +baseurl=https://downloads.linux.hpe.com/repo/spp-gen11/redhat/9/x86_64/current +enabled=1 +gpgcheck=1 +gpgkey=https://downloads.linux.hpe.com/repo/spp/GPG-KEY-spp +``` + +Sostituire `9` con la versione principale di Rocky Linux e `gen11` con la generazione del vostro server. Sebbene l'autore utilizzi un ML110 Gen11, se invece utilizzasse una DL360 Gen10, verrebbe utilizzato `gen10`. + +Successivamente, installare e abilitare `amsd`: + +```bash +dnf -y update && dnf -y install amsd +systemctl enable --now amsd +``` + +Per verificare se `amsd` funziona, accedere a iLO tramite il browser web. Se l'installazione è corretta, iLO dovrebbe segnalare che il nostro server sta eseguendo Rocky Linux: + +![HPE iLO showing Rocky Linux 9.3](../images/hpe_ilo_amsd.png) + +## Conclusione + +Una critica comune ai server HPE è l'elevata velocità delle ventole quando si utilizzano componenti di terze parti, come le unità SSD o altre schede PCI Express aggiuntive non ufficialmente approvate da HPE (ad esempio, le schede di acquisizione video). Anche se si utilizzano solo componenti di marca HPE, l'uso di `amsd` consente ai server HPE ProLiant di funzionare in modo più efficiente e silenzioso rispetto al solo utilizzo di Rocky Linux. diff --git a/docs/guides/hardware/x710_bridge_vlan.it.md b/docs/guides/hardware/x710_bridge_vlan.it.md new file mode 100644 index 0000000000..65ca23b7bf --- /dev/null +++ b/docs/guides/hardware/x710_bridge_vlan.it.md @@ -0,0 +1,65 @@ +--- +title: Abilitazione VLAN Passthrough on Intel X710-series NICs +author: Neel Chauhan +contributors: Ganna Zhyrnova +tested_with: 9.4 +tags: + - hardware +--- + +## Introduzione + +Alcuni server sono dotati di schede di interfaccia di rete (NIC) Intel serie X710, come il Minisforum MS-01 dell'autore, utilizzato per un firewall virtualizzato. Sfortunatamente, il driver stock di Rocky Linux presenta un [bug](https://community.intel.com/t5/Ethernet-Products/X710-strips-incoming-vlan-tag-with-SRIOV/m-p/551464) per cui le VLAN non vengono passate attraverso le interfacce bridge come previsto. Questo è accaduto alla macchina virtuale MikroTik CHR dell'autore Fortunatamente è risolvibile. + +## Prerequisiti e presupposti + +A seguire i requisiti minimi per poter eseguire questa procedura: + +- Un server Rocky Linux 8 o 9 con una NIC Intel serie X710 + +## Installazione dei driver NIC forniti da Intel + +Mentre il driver Rocky Linux di serie non passa attraverso le VLAN, il driver fornito da Intel lo fa. Per prima cosa, andare alla pagina [Intel's driver download page] (https://www.intel.com/content/www/us/en/download/18026/intel-network-adapter-driver-for-pcie-40-gigabit-ethernet-network-connections-under-linux.html). + +![Intel's X710 Driver Download Page](../images/intel_x710_drivers.png) + +Una volta arrivati alla pagina precedente, scaricare il file `i40e_RPM_Files.zip` e successivamente `scompattarlo`: + +``` +unzip i40e_RPM_Files.zip +``` + +Verrà visualizzato un gruppo di file RPM: + +``` +kmod-i40e-2.25.11-1.rhel8u10.src.rpm +kmod-i40e-2.25.11-1.rhel8u10.x86_64.rpm +kmod-i40e-2.25.11-1.rhel8u7.src.rpm +kmod-i40e-2.25.11-1.rhel8u7.x86_64.rpm +kmod-i40e-2.25.11-1.rhel8u8.src.rpm +kmod-i40e-2.25.11-1.rhel8u8.x86_64.rpm +kmod-i40e-2.25.11-1.rhel8u9.src.rpm +kmod-i40e-2.25.11-1.rhel8u9.x86_64.rpm +kmod-i40e-2.25.11-1.rhel9u1.src.rpm +kmod-i40e-2.25.11-1.rhel9u1.x86_64.rpm +kmod-i40e-2.25.11-1.rhel9u2.src.rpm +kmod-i40e-2.25.11-1.rhel9u2.x86_64.rpm +kmod-i40e-2.25.11-1.rhel9u3.src.rpm +kmod-i40e-2.25.11-1.rhel9u3.x86_64.rpm +kmod-i40e-2.25.11-1.rhel9u4.src.rpm +kmod-i40e-2.25.11-1.rhel9u4.x86_64.rpm +``` + +Il file da installare è nel formato `kmod-i40e-2.25.11-1.rhelXuY.x86_64.rpm`, dove `X` e `Y` sono rispettivamente la versione maggiore e minore di Rocky Linux. Per esempio, sul server Rocky Linux 9.4 dell'autore, `X` è 9, `Y` è 4, quindi il pacchetto di installazione dell'autore era: + +``` +sudo dnf install kmod-i40e-2.25.11-1.rhel9u4.x86_64.rpm +``` + +Dopo aver installato il driver, è necessario riavviare il server: + +``` +sudo reboot +``` + +Dopo il riavvio, le NIC X710 dovrebbero passare attraverso le VLAN tramite le interfacce bridge. diff --git a/docs/guides/interoperability/import_rocky_to_wsl.it.md b/docs/guides/interoperability/import_rocky_to_wsl.it.md index 8aac0f6500..58428aed4e 100644 --- a/docs/guides/interoperability/import_rocky_to_wsl.it.md +++ b/docs/guides/interoperability/import_rocky_to_wsl.it.md @@ -1,7 +1,7 @@ --- title: Importazione di Rocky Linux in WSL o WSL2 author: Lukas Magauer -tested_with: 8.6, 9.0 +tested_with: 8.10, 9.6, 10.0 tags: - wsl - wsl2 @@ -15,23 +15,46 @@ tags: La funzione Windows-Subsystem for Linux deve essere abilitata. Questo è possibile con una delle seguenti opzioni: -- Da pochissimo tempo è [disponibile una nuova versione di WSL nel Microsoft Store](https://apps.microsoft.com/store/detail/windows-subsystem-for-linux/9P9TQF7MRM4R), che ha più funzioni -- Aprire un terminale amministrativo (PowerShell o Command-Prompt) e
eseguire `wsl --install` ([ rif.](https://docs.microsoft.com/en-us/windows/wsl/install)) -- Andate nelle impostazioni grafiche di Windows e attivate la funzione opzionale `Windows-Subsystem for Linux` +- [Una versione più recente di WSL con funzioni aggiuntive è disponibile nel Microsoft Store](https://apps.microsoft.com/store/detail/windows-subsystem-for-linux/9P9TQF7MRM4R). Utilizzare questa versione più recente ogni volta che è possibile. +- Aprire un terminale amministrativo (PowerShell o Command-Prompt) ed eseguite `wsl --install` ([ref.](https://docs.microsoft.com/en-us/windows/wsl/install)) +- Andate nelle impostazioni grafiche di Windows e attivate la funzione opzionale `Windows-Subsystem for Linux`. Questa funzione dovrebbe essere disponibile su tutte le versioni di Windows 10 e 11 supportate. +!!! tip “WSL versione” + + Assicuratevi che la versione di WSL sia aggiornata, poiché alcune funzioni sono state introdotte solo nelle versioni successive. Se non si è sicuri, eseguire `wsl --update`. + ## Passi -1. Ottenere il rootfs del contenitore. Questo è possibile in diversi modi: +### Immagini WSL installabili (preferibile) + +1. Scaricare l'immagine WSL dal CDN o da un altro mirror più vicino: + + - 9: [x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-WSL-Base.latest.x86_64.wsl) or [aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-WSL-Base.latest.aarch64.wsl) + - 10: [x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-WSL-Base.latest.x86_64.wsl) or [aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-WSL-Base.latest.aarch64.wsl) - - **Preferito:** Scaricare l'immagine dal CDN: - - 8: [Base x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-UBI.latest.x86_64.tar.xz),
[Base aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-UBI.latest.aarch64.tar.xz) - - 9: [Base x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-UBI.latest.x86_64.tar.xz),
[Base aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-UBI.latest.aarch64.tar.xz) +2. Esistono diverse opzioni per installare un'immagine `.wsl`: + + - Facendo doppio clic sull'immagine, questa verrà installata con il nome predefinito dell'immagine. + - Installare l'immagine tramite riga di comando: + + ```sh + wsl --install --from-file + ``` + +### Immagini di contaner convenzionali + +1. Ottenere il rootfs del container. Questo è possibile in diversi modi: + + - Scaricare l'immagine dal CDN: + - 8: [Base x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-UBI.latest.aarch64.tar.xz) + - 9: [Base x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-UBI.latest.aarch64.tar.xz) + - 10: [Base x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-UBI.latest.aarch64.tar.xz) - Estrarre l'immagine da Docker Hub o da Quay.io ([ rif.](https://docs.microsoft.com/en-us/windows/wsl/use-custom-distro#export-the-tar-from-a-container)) ```sh - export rockylinux:9 > rocky-9-image.tar + export rockylinux:10 > rocky-10-image.tar ``` 2. (opzionale) È necessario estrarre il file .tar dal file .tar.xz se non si utilizza una delle ultime versioni di WSL @@ -41,27 +64,23 @@ Questa funzione dovrebbe essere disponibile su tutte le versioni di Windows 10 e - WSL: ```sh - wsl --import + wsl --import --version 1 ``` - WSL 2: ```sh - wsl --import --version 2 + wsl --import --version 2 ``` !!! tip "WSL vs. WSL 2" - In linea di massima WSL 2 dovrebbe essere più veloce di WSL, ma questo potrebbe variare da caso a caso. + In generale, WSL 2 dovrebbe essere più veloce di WSL, anche se ciò può variare a seconda del caso d'uso. !!! tip "Terminale Windows" - Se avete installato Windows Terminal, il nome della nuova distro WSL apparirà come opzione nel menu a discesa, il che è molto utile per lanciarla in futuro. È quindi possibile personalizzarlo con colori, caratteri, ecc. + Se avete installato Windows Terminal, il nome della nuova distro WSL apparirà come opzione nel menu a discesa, il che è molto utile per lanciarla in futuro. È quindi possibile personalizzarlo con colori, caratteri e altri elementi. !!! tip "systemd" - Microsoft ha finalmente deciso di portare systemd nella WSL. Questa funzione è presente nella nuova versione di WSL del Microsoft Store. È sufficiente aggiungere `systemd=true` alla sezione `boot` ini del file `/etc/wsl.conf`! ([rif.](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/#set-the-systemd-flag-set-in-your-wsl-distro-settings)) - -!!! tip "Microsoft Store" - - Al momento non c'è alcuna immagine nel Microsoft Store, se volete contribuire a portarla lì unitevi alla conversazione nel canale Mattermost SIG/Containers! Ci sono stati [alcuni sforzi](https://github.com/rocky-linux/WSL-DistroLauncher) molto tempo fa, che possono essere ripresi. + L'immagine WSL è abilitata per impostazione predefinita. Se si vogliono usare le immagini del contenitore o costruirne di proprie, è sufficiente aggiungere `systemd=true` alla sezione `boot` del file `/etc/wsl.conf`. ([rif.](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/#set-the-systemd-flag-set-in-your-wsl-distro-settings)) diff --git a/docs/guides/isos/iso_creation.it.md b/docs/guides/isos/iso_creation.it.md new file mode 100644 index 0000000000..4e373d8159 --- /dev/null +++ b/docs/guides/isos/iso_creation.it.md @@ -0,0 +1,121 @@ +--- +title: Creare una ISO Rocky Linux personalizzata +author: Howard Van Der Wal +contributors: Steven Spencer, Ganna Zhyrnova +tested with: 9.5 +tags: + - create + - custom + - ISO +--- + +## Introduzione + +Potrebbe essere necessario creare una ISO personalizzata per varie ragioni. Si potrebbe voler cambiare il processo di boot, aggiungere pacchetti specifici o aggiornare un file di configurazione. + +Questa guida spiega come costruire la propria ISO di Rocky Linux dall'inizio alla fine. + +## Prerequisiti + +- Una macchina 64-bit con Rocky Linux 9 +- Un'immagine ISO DVD di Rocky Linux 9 +- Un file `kickstart` da applicare alla ISO +- Leggere la documentazione Lorax [Quickstart](https://weldr.io/lorax/lorax.html#quickstart) e [mkksiso](https://weldr.io/lorax/mkksiso.html) per familiarizzare con la creazione di `Anaconda` `boot.iso`. + +## Installazione e configurazione del pacchetto + +- Installare il pacchetto `lorax`: + +```bash +sudo dnf install -y lorax +``` + +## Costruire la ISO con un file kickstart + +- Eseguire il comando `mkksiso` per aggiungere un file `kickstart` e quindi creare una nuova ISO: + +```bash +mkksiso --ks <0> <1> <2> +``` + +- Di seguito è riportato un esempio di file `kickstart`, ovvero `example-ks.cfg`, il quale imposta un ambiente `Server With GUI` Rocky Linux 9.5: + +```bash +lang en_GB +keyboard --xlayouts='us' +timezone Asia/Tokyo --utc +reboot +cdrom +bootloader --append="rhgb quiet crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M" +zerombr +clearpart --all --initlabel +autopart +network --bootproto=dhcp +firstboot --disable +selinux --enforcing +firewall --enabled +%packages +@^server-product-environment +%end +``` + +## Aggiungere un repository con i suoi pacchetti a una immagine ISO + +- Assicurarsi che il repository che si intende aggiungere abbia la directory `repodata` al suo interno. Se così non è, è possibile crearla utilizzando il comando `createrepo_c`, è possibile installarlo con \`sudo dnf install -y createrepo_c +- Aggiungere il repository al file `kickstart` utilizzando la seguente sintassi: + +```bash + +repo --name=extra-repo --baseurl=file:///run/install/repo/<0>/ +``` + +- Aggiungere il repository utilizzando il flag `--add` tramite il tool `mkksiso`: + +```bash +mkksiso --add <0> --ks <1> <2> <3> +``` + +- Si possono vedere dettagli aggiuntivi di questo processo utilizzando il repository `baseos` nell'esempio a seguire. +- Il repository `base os` sarà scaricato localmente assieme a tutti i suoi pacchetti: + +```bash +dnf reposync -p ~ --download-metadata --repo=baseos +``` + +- Successivamente aggiungere il repository al file `kickstart`: + +```bash +repo --name=extra-repo --baseurl=file:///run/install/repo/baseos/ +``` + +- Il file `kickstart` ha l'aspetto seguente: + +```bash +lang en_GB +keyboard --xlayouts='us' +timezone Asia/Tokyo --utc +reboot +cdrom +bootloader --append="rhgb quiet crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M" +zerombr +clearpart --all --initlabel +autopart +network --bootproto=dhcp +firstboot --disable +selinux --enforcing +firewall --enabled +%packages +@^server-product-environment +repo --name=extra-repo --baseurl=file:///run/install/repo/baseos/ +%end +``` + +- Successivamente puntare il comando `mkksiso` direttamente alla directory del repository e poi creare la ISO: + +```bash +mkksiso --add ~/baseos --ks example-ks.cfg ~/Rocky-9.5-x86_64-dvd.iso ~/Rocky-9.5-x86_64-dvd-new.iso +``` + +## Conclusione + +Qui condivido alcune opzioni per modificare e creare la vostra ISO Rocky Linux. Per ulteriori modi, tra cui la modifica degli argomenti della riga di comando del kernel, l'autore consiglia vivamente di consultare la documentazione di [mkksiso](https://weldr.io/lorax/mkksiso.html) in modo più dettagliato. diff --git a/docs/guides/kernel/regenerate_initramfs.it.md b/docs/guides/kernel/regenerate_initramfs.it.md new file mode 100644 index 0000000000..bb9cb733ae --- /dev/null +++ b/docs/guides/kernel/regenerate_initramfs.it.md @@ -0,0 +1,45 @@ +--- +title: Rigenerare `initramfs` +author: Neel Chauhan +contributors: Spencer Steven +tested_with: 9.4 +tags: + - hardware +--- + +## Introduzione + +Un \`initramfs' è il file system principale all'interno di un kernel Linux per aiutare l'avvio del sistema. Contiene i moduli fondamentali necessari per avviare Linux. + +A volte, un amministratore Linux potrebbe voler rigenerare \`initramfs', ad esempio se vuole inserire un driver nella blacklist o includere un modulo out-of-band. L'autore ha fatto questo per [abilitare Intel vPro su un Minisforum MS-01](https://spaceterran.com/posts/step-by-step-guide-enabling-intel-vpro-on-your-minisforum-ms-01-bios/). + +## Requisiti + +A seguire i requisiti minimi per implementare questa procedura: + +- Un sistema Rocky Linux o una macchina virtuale (non un container) +- Modifiche alla configurazione del kernel, come la creazione di una blacklist o l'aggiunta di un modulo + +## Rigenerazione di `initramfs` + +Per ricostituire l'`initramfs` si deve prima eseguire il backup dell'`initramfs` esistente: + +```bash +cp /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r)-$(date +%m-%d-%H%M%S).img +``` + +Quindi, eseguire `dracut` per rigenerare `initramfs`: + +```bash +dracut -f /boot/initramfs-$(uname -r).img $(uname -r) +``` + +Quindi riavviare: + +```bash +reboot +``` + +## Conclusione + +Il kernel Linux è estremamente potente e modulare. È ragionevole che alcuni utenti vogliano consentire o meno alcuni moduli e la rigenerazione di `initramfs` permette di farlo. diff --git a/docs/guides/minimum_hardware_requirements.it.md b/docs/guides/minimum_hardware_requirements.it.md new file mode 100644 index 0000000000..2cc3bd43d6 --- /dev/null +++ b/docs/guides/minimum_hardware_requirements.it.md @@ -0,0 +1,127 @@ +# Rocky Linux 10 (Red Quartz) - Requisiti hardware minimi + +Rocky Linux 10 è stato progettato per garantire una stabilità enterprise-grade e una compatibilità con l'hardware moderno. Queste specifiche minime si applicano a **minimal server installations**. Per ambienti GUI o di produzione, si consigliano specifiche più elevate. + +--- + +## ✅ Architetture CPU Supportate + +Secondo le note di rilascio di Rocky Linux 10.0, Rocky Linux 10 supporta ufficialmente le seguenti architetture: + +- **x86_64-v3** (CPU Intel/AMD a 64 bit con almeno Haswell o supporto AVX equivalente) +- **aarch64** (ARMv8-A 64-bit) +- **ppc64le** (IBM Power, Little Endian) +- **s390x** (IBM Z mainframes) +- **riscv64** (RISC‑V 64-bit) + +### ⚠️ Requisiti della CPU + +- **x86_64-v3** richiede AVX, AVX2, BMI1/2 e FMA, corrispondenti a Intel Haswell o successivi o AMD Excavator o più recenti. +- Le vecchie revisioni x86_64 (v1/v2) non sono **supportate** a meno che non vengano ricostruite dai SIG della comunità. + +--- + +## 🧠 CPU (Processore) + +- **1 GHz a 64 bit (x86_64-v3)** o equivalente per altre architetture +- Le CPU multi-core sono consigliate per l'utilizzo in ambito server, desktop o virtualizzazione. + +--- + +## 💾 Memoria (RAM) + +- **2 GB** minimo (installazione in modalità testo) +- **4 GB+** raccomandati per le installazioni con interfaccia grafica +- **4-8 GB+** per carichi di lavoro di produzione o virtualizzazione + +--- + +## 💽 Storage + +- **10 GB** di spazio minimo su disco +- **20 GB+** consigliati per ospitare aggiornamenti, registri e applicazioni. +- Per l'interfaccia grafica (GUI): **40 GB+** per garantire spazio sufficiente + +--- + +## 🌐 Rete + +- Almeno una scheda di rete Ethernet o wireless funzionante +- Supporta la configurazione IP statica o DHCP tramite NetworkManager. + +--- + +## 🖥️ Display (per installazioni con GUI) + +- Risoluzione minima **1024×768** tramite VGA, HDMI o DisplayPort +- Non è necessario per le installazioni di server minimali + +--- + +## 📀 Media Access + +- Porta USB (per il programma di installazione live USB) o unità DVD-ROM +- Le installazioni in cloud supportano installazioni basate su ISO o PXE + +--- + +## 🔒 Firmware + +- È supportato l'avvio UEFI o BIOS; si consiglia **UEFI**. +- Secure Boot supportato (può richiedere la registrazione manuale della chiave) + +--- + +## 🗃️ Supporto per la virtualizzazione + +- Ambienti virtuali (KVM, VMware, VirtualBox, Hyper-V) supportati +- Strumenti guest (ad esempio, open-vm-tools, qemu-guest-agent) consigliati per ottimizzare le prestazioni + +--- + +## 📝 Tabella riassuntiva + +| Componente | Requisito minimo | +| ------------------- | ------------------------------------------------------------------------------------------------------------------ | +| **CPU** | 1 GHz a 64 bit (AVX-capace x86_64-v3) o equivalente per ARM/POWER/Z/RISC-V | +| **RAM** | 1 GB (2 GB per la GUI) | +| **Spazio su disco** | 10 GB (consigliati 20 GB o più; 40 GB o più per la GUI) | +| **Rete** | Adattatore Ethernet o wireless | +| **Display** | Capacità di 1024×768 (solo per la GUI) | +| **Media Access** | USB or DVD-ROM | +| **Firmware** | UEFI/BIOS (UEFI recommended); Secure Boot optional | + +--- + +## 🎯 Specifiche consigliate per caso d'uso + +### 🏗️ Server minimale + +- CPU: 1 core x86_64-v3 (or ARM/POWER/Z/RISC‑V) +- RAM: 1 GB +- Storage: 10–20 GB + +### 🖥️ Desktop con GUI + +- CPU: 2+ cores x86_64-v3 (or equivalent) +- RAM: 2–4 GB +- Storage: 20–40 GB + +### 🛠️ Server di sviluppo/produzione + +- CPU: 4+ cores +- AM: 4–8 GB+ +- Storage: 40 GB+ (in base alle esigenze di workload) + +--- + +## 🧩 Note aggiuntive + +- Allocare sempre uno spazio di archiviazione supplementare per i log, gli aggiornamenti dei pacchetti e i backup. +- Per il cloud o la virtualizzazione, scegliete tipi di istanza che soddisfino o superino le specifiche di cui sopra. +- Gli aggiornamenti da versioni precedenti di Rocky (ad esempio, 8 o 9) a Rocky 10 non sono supportati: è necessaria una nuova installazione. + +--- + +**Ultimo aggiornamento**: June 2025\ +**Riguardante**: Rocky Linux 10.0 Initial Release diff --git a/docs/guides/network/basic_network_configuration.it.md b/docs/guides/network/basic_network_configuration.it.md index 1f1031f507..68b30181a1 100644 --- a/docs/guides/network/basic_network_configuration.it.md +++ b/docs/guides/network/basic_network_configuration.it.md @@ -14,9 +14,9 @@ Al giorno d'oggi non si può fare molto con un computer senza la connettività d ## Prerequisiti -* Una certa comodità nell'operare dalla riga di comando -* Privilegi elevati o amministrativi sul sistema (per esempio root, `sudo` e così via) -* Opzionale: familiarità con i concetti di rete +- Una certa comodità nell'operare dalla riga di comando +- Privilegi elevati o amministrativi sul sistema (per esempio root, `sudo` e così via) +- Opzionale: familiarità con i concetti di rete === "9" @@ -26,9 +26,9 @@ Al giorno d'oggi non si può fare molto con un computer senza la connettività d ## Prerequisiti - * Una certa dimestichezza nell'operare dalla riga di comando - * Privilegi elevati o amministrativi sul sistema (per esempio root, `sudo` e così via) - * Opzionale: familiarità con i concetti di rete + - Una certa dimestichezza nell'operare dalla riga di comando + - Privilegi elevati o amministrativi sul sistema (per esempio root, `sudo` e così via) + - Opzionale: familiarità con i concetti di rete ## Usare il servizio NetworkManager @@ -106,7 +106,7 @@ Al giorno d'oggi non si può fare molto con un computer senza la connettività d Lo schema di configurazione IP statico è molto diffuso nei sistemi o nelle reti di tipo server. - L'approccio IP dinamico è molto diffuso nelle reti domestiche e di ufficio o nei sistemi di classe workstation e desktop in ambiente aziendale. Lo schema dinamico di solito necessita di _qualcosa_ in più che sia disponibile localmente e che possa fornire le informazioni di configurazione IP corrette alle workstation e ai desktop richiedenti. Questo _qualcosa_ si chiama Dynamic Host Configuration Protocol (DHCP). In una rete domestica, e anche nella maggior parte delle reti aziendali, questo servizio è fornito da un server DHCP configurato allo scopo. Può trattarsi di un server separato o di una parte della configurazione del router. + L'approccio IP dinamico è molto diffuso nelle reti domestiche e di ufficio o nei sistemi di classe workstation e desktop in ambiente aziendale. Lo schema dinamico di solito richiede *qualcosa* di aggiuntivo che sia disponibile localmente e che possa fornire informazioni di configurazione IP adeguate alle workstation e ai desktop che ne fanno richiesta. Questo *qualcosa* si chiama Dynamic Host Configuration Protocol (DHCP). In una rete domestica, e anche nella maggior parte delle reti aziendali, questo servizio è fornito da un server DHCP configurato allo scopo. Può trattarsi di un server separato o di una parte della configurazione del router. ## Indirizzi IP @@ -117,25 +117,25 @@ Al giorno d'oggi non si può fare molto con un computer senza la connettività d ![nmtui](images/nmtui_first.png) - 2. È già presente la selezione "Edit a connection", quindi premere il tasto TAB in modo da evidenziare "OK" e premere INVIO + 2. È già presente la selezione "Modifica una connessione", quindi premete il tasto ++tab++ in modo da evidenziare "OK" e premete ++enter++ - 3. Verrà visualizzata una schermata che mostra le connessioni Ethernet della macchina e consentirà di sceglierne una. Nel nostro caso, ce n'è *SOLO* uno, quindi è già evidenziato; dobbiamo semplicemente premere il tasto TAB finché non viene evidenziato "Edit" e poi premere INVIO + 3. Verrà visualizzata una schermata che mostra le connessioni Ethernet della macchina e consentirà di sceglierne una. Nel nostro caso, ce n'è *solo uno*, quindi è già evidenziato, dobbiamo semplicemente premere il tasto ++tab++ finché non viene evidenziato "Modifica" e poi premere ++enter++ ![nmtui_edit](images/nmtui_edit.png) - 4. Una volta fatto questo, ci troveremo nella schermata che mostra la nostra configurazione attuale. Occorre passare da " Manual " a " Automatic ", quindi premere più volte il tasto TAB fino a evidenziare " Manual " e poi premere INVIO. + 4. Una volta fatto questo, ci troveremo nella schermata che mostra la nostra configurazione attuale. È necessario passare da "Manuale" ad "Automatico", quindi premere più volte il tasto ++tab++ fino ad evidenziare "Manuale" e premere ++enter++. ![nmtui_manual](images/nmtui_manual.png) - 5. La freccia verso l'alto fino a evidenziare " Automatic" e quindi premere INVIO + 5. La freccia verso l'alto fino a evidenziare "Automatico", quindi premere ++enter++ ![nmtui_automatic](images/nmtui_automatic.png) - 6. Una volta che l'interfaccia è passata ad "Automatic", è necessario rimuovere l'IP assegnato staticamente, quindi premere il tasto TAB fino a evidenziare "Remove"accanto all'indirizzo IP e premere INVIO. + 6. Una volta che l'interfaccia è passata ad "Automatico", è necessario rimuovere l'IP assegnato staticamente, quindi premere il tasto ++tab++ finché non viene evidenziato "Rimuovi" accanto all'indirizzo IP e premere ++enter++. ![nmtui_remove](images/nmtui_remove.png) - 7. Infine, premete più volte il tasto TAB finché non arrivate in fondo alla schermata `nmtui` e non viene evidenziato "OK" e premete INVIO + 7. Infine, premete più volte il tasto ++tab++ finché non arrivate in fondo alla schermata `nmtui` e non viene evidenziato "OK" e premete ++enter++ È possibile disattivare e riattivare l'interfaccia anche con `nmtui`, ma facciamo questo con `nmcli`. In questo modo è possibile regolare la disattivazione dell'interfaccia e la sua riattivazione, in modo che l'interfaccia non sia mai inattiva per molto tempo: @@ -148,7 +148,7 @@ Al giorno d'oggi non si può fare molto con un computer senza la connettività d Per verificare che abbia funzionato, controllate con il comando `ip addr` o con il comando `nmcli device show enp0s3` che abbiamo usato in precedenza. ``` - ip addr + ip_addr ``` In caso di successo, si dovrebbe vedere che l'IP statico è stato rimosso e che è stato aggiunto un indirizzo allocato dinamicamente, come in questo caso: @@ -169,10 +169,10 @@ Al giorno d'oggi non si può fare molto con un computer senza la connettività d Prima di iniziare, è necessario sapere che per riconfigurare l'interfaccia in DHCP è necessario: - * Rimuovere il gateway IPv4 - * Rimuovere l'indirizzo IPv4 assegnato staticamente - * Cambiare il metodo IPv4 in automatico - * Disattivare e riattivare l'interfaccia + - Rimuovere il gateway IPv4 + - Rimuovere l'indirizzo IPv4 assegnato staticamente + - Cambiare il metodo IPv4 in automatico + - Disattivare e riattivare l'interfaccia Si noti anche che non stiamo usando esempi che dicono di usare -ipv4.address ecc. Questi non cambiano completamente l'interfaccia. Per farlo, è necessario impostare ipv4.address e ipv4.gateway su una stringa vuota. Anche in questo caso, per risparmiare il più possibile tempo con il nostro comando, li uniremo tutti in un'unica riga: @@ -217,10 +217,10 @@ Al giorno d'oggi non si può fare molto con un computer senza la connettività d In questo esempio, assumeremo i seguenti parametri: - * nome dell'interfaccia: enp0s3 - * indirizzo ip: 192.168.1.151 - * maschera di sottorete: 24 - * gateway: 192.168.1.1 + - nome dell'interfaccia: enp0s3 + - indirizzo ip: 192.168.1.151 + - maschera di sottorete: 24 + - gateway: 192.168.1.1 ### Ottenere informazioni di carattere generale @@ -332,7 +332,7 @@ Al giorno d'oggi non si può fare molto con un computer senza la connettività d 64 bytes from 192.168.1.10: icmp_seq=3 ttl=255 time=0.676 ms ``` - Eseguire un test per verificare che venga visualizzato un host raggiungibile esterno alla rete. Per il test che segue, utilizziamo il server DNS aperto di Google: + Eseguire un test per assicurarsi di poter vedere un host raggiungibile esterno alla rete. Per il test che segue, utilizziamo il server DNS aperto di Google: ```bash ping -c3 8.8.8.8 @@ -359,7 +359,7 @@ Al giorno d'oggi non si può fare molto con un computer senza la connettività d ``` - ## Conclusioni + ## Conclusione In Rocky Linux 9 sono state apportate molte modifiche allo stack di rete. Tra queste c'è la priorità dei `keyfile` rispetto ai file `ifcfg` usati in precedenza e presenti in Network-Scripts. Poiché la direzione del cambiamento nelle future versioni di Rocky Linux prevede la deprecazione e la rimozione degli script di rete, è meglio concentrare l'attenzione su metodologie come `nmcli`, `nmtui` e, in alcuni casi, `ip`, per la configurazione della rete. @@ -410,7 +410,7 @@ Al giorno d'oggi non si può fare molto con un computer senza la connettività d Lo schema di configurazione IP statico è molto diffuso nei sistemi o nelle reti di tipo server. - L'approccio IP dinamico è molto diffuso nelle reti domestiche e di ufficio o nei sistemi di classe workstation e desktop. Lo schema dinamico di solito necessita di qualcosa di aggiuntivo, disponibile localmente, in grado di fornire le informazioni di configurazione IP corrette alle workstation e ai desktop che ne fanno richiesta. Questo _qualcosa_ si chiama Dynamic Host Configuration Protocol (DHCP). + L'approccio IP dinamico è molto diffuso nelle reti domestiche e di ufficio o nei sistemi di classe workstation e desktop. Lo schema dinamico di solito richiede *qualcosa* di aggiuntivo disponibile localmente che possa fornire informazioni di configurazione IP adeguate alle workstation e ai desktop che ne fanno richiesta. Questo *qualcosa* si chiama Dynamic Host Configuration Protocol (DHCP). Gli utenti di casa o dell'ufficio spesso non devono preoccuparsi del DHCP. Questo perché qualcosa di diverso se ne occupa automaticamente in background. L'utente finale deve connettersi fisicamente o in modalità wireless alla rete giusta (e naturalmente assicurarsi che i suoi sistemi siano accesi)! @@ -511,8 +511,8 @@ Al giorno d'oggi non si può fare molto con un computer senza la connettività d Ad esempio, possiamo vedere che il metodo `ipv4.method` qui è attualmente impostato su `auto`. Ci sono molti valori consentiti per l'impostazione `ipv4.method`, ma i due principali che molto probabilmente si vedranno sono: - * `auto`: per l'interfaccia viene utilizzato il metodo automatico appropriato (DHCP, PPP, ecc.) e la maggior parte delle altre proprietà possono essere lasciate non impostate. - * `manual`: viene utilizzato un indirizzamento IP statico e almeno un indirizzo IP deve essere indicato nella proprietà 'addresses'. + - `auto`: per l'interfaccia viene utilizzato il metodo automatico appropriato (DHCP, PPP, ecc.) e la maggior parte delle altre proprietà possono essere lasciate non impostate. + - `manual`: viene utilizzato un indirizzamento IP statico e almeno un indirizzo IP deve essere indicato nella proprietà 'addresses'. Se invece si desidera configurare il sistema in modo che utilizzi uno schema di indirizzi IP statici, è necessario modificare il valore di `ipv4.method` in `manual` e specificare anche `ipv4.gateway` e `ipv4.addresses`. @@ -572,10 +572,10 @@ Al giorno d'oggi non si può fare molto con un computer senza la connettività d In questo esempio, assumeremo i seguenti parametri: - * nome dell'interfaccia: ens19 - * indirizzo ip: 192.168.20.10 - * maschera di sottorete: 24 - * gateway: 192.168.20.254 + - nome dell'interfaccia: ens19 + - indirizzo ip: 192.168.20.10 + - maschera di sottorete: 24 + - gateway: 192.168.20.254 ### Ottenere informazioni di carattere generale @@ -588,8 +588,8 @@ Al giorno d'oggi non si può fare molto con un computer senza la connettività d !!! hint "**"Suggerimenti professionali:**" - * usare il flag `-c` per ottenere un output colorato più leggibile: `ip -c a`. - * `ip` accetta l'abbreviazione quindi `ip a`, `ip addr` e `ip address` sono equivalenti + - usare il flag `-c` per ottenere un output colorato più leggibile: `ip -c a`. + - `ip` accetta l'abbreviazione quindi `ip a`, `ip addr` e `ip address` sono equivalenti ### Portare l'interfaccia su o giù @@ -719,6 +719,6 @@ Al giorno d'oggi non si può fare molto con un computer senza la connettività d ``` - ## Conclusioni + ## Conclusione Rocky Linux 8 dispone degli strumenti per configurare la rete dalla riga di comando. Questo documento dovrebbe consentirvi di utilizzare rapidamente questi strumenti. diff --git a/docs/rocky_insights/blogs/good_docs.it.md b/docs/rocky_insights/blogs/good_docs.it.md new file mode 100644 index 0000000000..e056bf9d1f --- /dev/null +++ b/docs/rocky_insights/blogs/good_docs.it.md @@ -0,0 +1,88 @@ +--- +title: Good Docs - Il punto di vista di un traduttore +author: Ganna Zhyrnova +contributors: Steven Spencer +--- + +## Introduzione + +I traduttori forniscono indicazioni preziose per la stesura di una documentazione chiara e concisa. Sanno cosa non si traduce bene e cosa confonde il lettore meglio di chiunque altro. Questo documento esamina alcuni di questi aspetti ed evidenzia le migliori pratiche per la stesura dei documenti. + +### Dall'autore + +La documentazione del software aiuta gli utenti a capire come utilizzare efficacemente un determinato software. Devono capire cosa otterranno alla fine e quali vantaggi avranno. Allo stesso tempo, quando create una documentazione, significa crearla non solo per voi stessi, ma anche per la vostra rete e per le altre persone che potrebbero leggerla. Gli altri utenti potrebbero non provenire da paesi anglofoni. Ciò significa che per loro l'inglese non è la lingua principale. Proprio per questo motivo, seguite queste regole di base per rendere la documentazione più leggibile a _tutti_ gli utenti. + +## Uso di un linguaggio semplice + +In linea di principio, non si ha idea di chi siano i fruitori della documentazione. Se l'utente abbia o meno familiarità con questo ambito, che sia uno sviluppatore esperto o un principiante. Un linguaggio semplice sta a significare una comunicazione chiara, concisa e di facile comprensione per il pubblico a cui è destinata la prima volta che la incontra. E' da evitare i termini gergali, quelli troppo tecnici e frasi con strutture complesse, a favore di un linguaggio più semplice e con un'organizzazione chiara. L'obiettivo è garantire che il messaggio sia accessibile e comprensibile a un ampio pubblico, indipendentemente dal suo background o dal suo livello di lettura. Spesso è possibile farlo semplificando la sintassi delle frase o i comandi fino ad una forma più elementare. + +## Evitare espressioni idiomatiche, gergo, acronimi e contrazioni. + +Idiomi, gergo, contrazioni e acronimi possono confondere i lettori che non li conoscono, in particolare coloro che non sono madrelingua, i nuovi dipendenti o tutti coloro che estranei al vostro settore specifico. + +I **diomi** sono spesso culturalmente specifici e possono essere difficili da capire per i lettori internazionali.\ +Il **gergo** comprende termini specialistici che solo gli esperti di un settore possono riconoscere.\ +Le **contrazioni** sostituiscono le parole della lingua inglese con scorciatoie, che però non sempre esistono in tutte le lingue, rendendo difficile la traduzione.\ +Gli **acronimi** possono essere ambigui, soprattutto se non vengono definiti al momento del loro utilizzo. + +Esempio: + +❌ “Una volta presa confidenza con il cruscotto, il resto è un gioco da ragazzi”. In questo caso, l'autore utilizza sia una contrazione, sia uno slang, sia un idioma. + +✅ “Una volta imparato a usare il cruscotto, il resto è facile”. Sostituendo la contrazione, il gergo e l'idioma con le parole associate a ciascuno di essi, il significato è chiaro. + +Il linguaggio figurato, come i modi di dire, spesso non si traduce bene. I redattori tecnici o i traduttori potrebbero avere difficoltà a trasmettere lo stesso significato in altre lingue. + +Esempio: + +❌ “Ci sentiamo la prossima settimana per fare il punto sui ticket aperti”. + +✅ “Incontriamoci la prossima settimana per rivedere le richieste di supporto non risolte”. + +Il gergo e gli acronimi possono generare confusione, anche all'interno della stessa organizzazione, se il loro significato non è universalmente conosciuto. + +Esempio: + +❌ “Caricare il CSV nel CMS ed etichettarlo secondo le SOP”. + +✅ “Caricare il file CSV (Comma-Separated Values) nel Content Management System (CMS) ed etichettarlo secondo le procedure operative standard (SOP).” + +Nota: se si desidera utilizzare acronimi, definirli sempre la prima volta: “Content Management System (CRM)”. + +Eliminando i modi di dire e il gergo non necessario, il significato del documento diventa più chiaro. Sostituire le contrazioni con le parole che rappresentano significa facilitare gli sforzi di traduzione in tutte le lingue. Il documento è più comprensibile per il lettore quando si sostituiscono o si definiscono gli acronimi. + +## Uso della forma attiva + +La voce attiva enfatizza chi compie l'azione, rendendo chiaro chi o cosa è responsabile dell'azione del verbo. + +Esempio: + +Il sistema apre la finestra di dialogo in cui è necessario completare il modulo. + +Si prega di astenersi dall'utilizzare una forma complessa, in quanto può confondere i lettori. + +Per saperne di più sull'uso della forma attiva e sulla sua importanza, si veda [questa parere](active_voice.md) e [questa fonte esterna](https://developers.google.com/tech-writing/one/active-voice). + +## Dividere in step + +Se la documentazione contiene passaggi specifici, separateli l'uno dall'altro. + +Ad esempio: + +Passo 1 - Accedere alla sezione +Passo 2 - Fare clic sul pulsante +Passo 3 - Compilare il modulo +...\ +Passo N - salvare le modifiche + +## Screenshot quando necessario + +Utilizzate screenshot corretti dove necessario. Ciò significa che non è necessario aggiungere screenshot ovunque, ma solo nei punti in cui è necessario fornire ulteriori spiegazioni. + +## Uso degli esempi + +Se è necessario compilare il modulo, fornire esempi di come gli utenti possono completarlo. Indicare le limitazioni, se ci sono. + +## Conclusione + +Scrivere una buona documentazione non significa solo renderla tecnicamente accurata, ma anche renderla immediatamente comprensibile al lettore. Questo è particolarmente importante quando un documento tecnico deve essere tradotto in altre lingue. In questo documento, l'autore intendeva mettere in evidenza le tecniche specifiche per scrivere una buona documentazione chiara. diff --git a/docs/rocky_insights/blogs/index.it.md b/docs/rocky_insights/blogs/index.it.md index 0a383c8df6..1569c6304f 100644 --- a/docs/rocky_insights/blogs/index.it.md +++ b/docs/rocky_insights/blogs/index.it.md @@ -1,6 +1,6 @@ --- title: Introduzione -author: Spencer Steven +author: Steven Spencer contributors: --- From bc37efbe832179bb7ca27e2c5de41405b793bb24 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Sun, 20 Jul 2025 10:59:06 -0700 Subject: [PATCH 072/164] New Crowdin updates (#2792) * New translations update_versions.md (Italian) * New translations i2pd.md (Italian) * New translations 9_6.md (German) * New translations tor_relay.md (Italian) * New translations tor_onion_service.md (Italian) * New translations accel-ppp_pppoe_server.md (Italian) * New translations glances_network_monitoring.md (Italian) * New translations hurricane_electric_ipv6_tunnel.md (Italian) * New translations openbgpd_bgp_router.md (Italian) * New translations 9_6.md (French) * New translations 8_10.md (German) * New translations 08-process.md (French) * New translations 04-advanced-commands.md (German) * New translations 08-process.md (German) * New translations additional_software.md (French) * New translations 8_8.md (Chinese Simplified) * New translations 9_0.md (Chinese Simplified) * New translations 8_7.md (Chinese Simplified) * New translations 8_5.md (Chinese Simplified) * New translations 9_1.md (Chinese Simplified) * New translations index.md (Chinese Simplified) * New translations 9_6.md (Chinese Simplified) * New translations 9_2.md (Chinese Simplified) * New translations 9_4.md (Chinese Simplified) * New translations 9_5.md (Chinese Simplified) * New translations 12-network.md (French) --- .../admin_guide/04-advanced-commands.de.md | 3 +- docs/books/admin_guide/08-process.de.md | 10 +- docs/books/admin_guide/08-process.fr.md | 2 +- docs/books/admin_guide/12-network.fr.md | 6 +- docs/books/nvchad/additional_software.fr.md | 66 ++--- .../network/accel-ppp_pppoe_server.it.md | 121 +++++++++ .../network/glances_network_monitoring.it.md | 220 ++++++++++++++++ .../hurricane_electric_ipv6_tunnel.it.md | 48 ++++ docs/guides/network/openbgpd_bgp_router.it.md | 175 +++++++++++++ docs/guides/proxies/i2pd.it.md | 90 +++++++ docs/guides/proxies/tor_relay.it.md | 238 ++++++++++++++++-- docs/guides/update_versions.it.md | 191 ++++++++++++++ docs/guides/web/tor_onion_service.it.md | 107 ++++++++ docs/release_notes/8_10.de.md | 6 +- docs/release_notes/8_5.zh.md | 2 +- docs/release_notes/8_7.zh.md | 2 +- docs/release_notes/8_8.zh.md | 2 +- docs/release_notes/9_0.zh.md | 2 +- docs/release_notes/9_1.zh.md | 4 +- docs/release_notes/9_2.zh.md | 2 +- docs/release_notes/9_4.zh.md | 4 +- docs/release_notes/9_5.zh.md | 4 +- docs/release_notes/9_6.de.md | 8 +- docs/release_notes/9_6.fr.md | 16 +- docs/release_notes/9_6.zh.md | 6 +- docs/rocky_insights/blogs/index.zh.md | 2 +- 26 files changed, 1245 insertions(+), 92 deletions(-) create mode 100644 docs/guides/network/accel-ppp_pppoe_server.it.md create mode 100644 docs/guides/network/glances_network_monitoring.it.md create mode 100644 docs/guides/network/hurricane_electric_ipv6_tunnel.it.md create mode 100644 docs/guides/network/openbgpd_bgp_router.it.md create mode 100644 docs/guides/proxies/i2pd.it.md create mode 100644 docs/guides/update_versions.it.md create mode 100644 docs/guides/web/tor_onion_service.it.md diff --git a/docs/books/admin_guide/04-advanced-commands.de.md b/docs/books/admin_guide/04-advanced-commands.de.md index c17653760e..842b09028d 100644 --- a/docs/books/admin_guide/04-advanced-commands.de.md +++ b/docs/books/admin_guide/04-advanced-commands.de.md @@ -333,8 +333,7 @@ Mit der Option `-n` können Sie die Anzahl der Sekunden zwischen jeder Ausführu !!! note "Anmerkung" - Um den `watch` Befehl zu verlassen, müssen Sie Folgendes eingeben: - ++control+c++, um den Prozess zu beenden. + Um den `watch` Befehl zu verlassen, müssen Sie ++control+c++ eingeben, und den Prozess beenden. Beispiele: diff --git a/docs/books/admin_guide/08-process.de.md b/docs/books/admin_guide/08-process.de.md index bf2faa9851..323a125fb8 100644 --- a/docs/books/admin_guide/08-process.de.md +++ b/docs/books/admin_guide/08-process.de.md @@ -428,11 +428,11 @@ pkill -t pts/1 Die Funktion dieses Befehls entspricht in etwa der des Befehls `pkill`. Die Syntax ist folgende — `killall [option] [ -s SIGNAL | -SIGNAL ] NAME`. Das Default-Signal ist *SIGTERM*. -| Option | Beschreibung | -|:------ |:--------------------------------------------------------------------------------------- | -| `-l` | listet sämtliche bekannten Signalnamen auf | -| `-i` | vor dem Schließen nach einer Bestätigung fragen | -| `-I` | Groß- und Kleinschreibung wird bei der Prozessnamenübereinstimmung nicht berücksichtigt | +| Optionen | Beschreibung | +|:-------- |:--------------------------------------------------------------------------------------- | +| `-l` | listet sämtliche bekannten Signalnamen auf | +| `-i` | vor dem Schließen nach einer Bestätigung fragen | +| `-I` | Groß- und Kleinschreibung wird bei der Prozessnamenübereinstimmung nicht berücksichtigt | Beispiel: diff --git a/docs/books/admin_guide/08-process.fr.md b/docs/books/admin_guide/08-process.fr.md index 1a9cf5f74e..d485540340 100644 --- a/docs/books/admin_guide/08-process.fr.md +++ b/docs/books/admin_guide/08-process.fr.md @@ -447,7 +447,7 @@ Cette commande affiche l'arborescence des processus et son utilisation est la su | Option | Observation | |:------ |:--------------------------------------------------- | | `-p` | Affiche l'identifiant PID du processus | -| `-R` | trier la sortie par PID | +| `-n` | trier la sortie par PID | | `-h` | met en évidence le processus actuel et ses ancêtres | | `-u` | affichage des transitions d'UID | diff --git a/docs/books/admin_guide/12-network.fr.md b/docs/books/admin_guide/12-network.fr.md index 0ace0352f9..c2b9d488bb 100644 --- a/docs/books/admin_guide/12-network.fr.md +++ b/docs/books/admin_guide/12-network.fr.md @@ -164,7 +164,7 @@ La commande `hostname` affiche ou définit le nom d'hôte du système hostname [-f] [hostname] ``` -| Option | Observation | +| Option | Description | | ------ | ---------------------------------------------------- | | `-f` | Affiche le FQDN | | `-i` | Affiche des informations sur l'adresse IP du système | @@ -583,14 +583,14 @@ BROADCAST=172.16.79.255 [root]# ipcalc –b 172.16.66.203 255.255.240.0 >> /etc/sysconfig/network-scripts/ifcfg-eth0 ``` -| Option | Observation | +| Option | Description | | ------ | ----------------------------------------- | | `-b` | Affiche l'adresse de diffusion. | | `-R` | Affiche l'adresse et le masque du réseau. | `ipcalc` est un moyen simple de déterminer les informations IP d'un hôte. Les différentes options indiquent quelles informations `ipcalc` doit afficher sur la sortie standard. Plusieurs options peuvent être spécifiées. Une adresse IP sur laquelle opérer doit être spécifiée. La plupart des opérations nécessitent également un masque réseau ou un préfixe CIDR. -| Option courte | Option longue | Observation | +| Option courte | Option longue | Description | | ------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `-b` | `--broadcast` | Affiche l'adresse de diffusion de l'adresse IP donnée et le masque réseau. | | `-h` | `--hostname` | Affiche le nom d'hôte de l'adresse IP fournie via DNS. | diff --git a/docs/books/nvchad/additional_software.fr.md b/docs/books/nvchad/additional_software.fr.md index 9bcf235b7c..056f0be148 100644 --- a/docs/books/nvchad/additional_software.fr.md +++ b/docs/books/nvchad/additional_software.fr.md @@ -8,47 +8,49 @@ tags: - codage --- -# Logiciels supplémentaires utiles +# :material-cart-plus: Logiciels Supplémentaires Nécessaires Il existe plusieurs logiciels supplémentaires qui, même s'ils ne sont pas nécessaires, aideront à l'utilisation quotidienne de NvChad. Les sections ci-dessous vous guideront à choisir parmi ces logiciels et leurs usages. -## RipGrep +## :material-text-search: RipGrep -`ripgrep` est un outil de recherche orienté ligne de commande qui recherche récursivement dans le répertoire courant en utilisant une expression régulière _regex_. Par défaut, _ripgrep_ respecte les règles de _gitignore_ et omet automatiquement les fichiers/répertoires et les binaires cachés. Ripgrep offre un excellent support sous Windows, macOS et Linux, avec des binaires disponibles pour chaque plateforme. +`ripgrep` est un outil de recherche orienté ligne de commande qui recherche récursivement dans le répertoire courant en utilisant une expression régulière *regex* (pattern). Par défaut, *ripgrep* respecte les règles de *gitignore* et omet automatiquement les fichiers/répertoires et les binaires cachés. Ripgrep offre un excellent support sous Windows, macOS et Linux, avec des binaires disponibles pour chaque plateforme. -### Installer RipGrep depuis EPEL +=== "Installer RipGrep depuis EPEL" -Sous Rocky Linux 8 et 9, vous pouvez installer RipGrep à partir de l'EPEL. Pour cela, installez `epel-release,` mettez à jour le système, puis installez `ripgrep` : + Sous Rocky Linux 8 et 9, vous pouvez installer 'RipGrep' à partir de l'EPEL. Pour cela, installez `epel-release`, mettez à jour le système, puis installez `ripgrep` : -``` -sudo dnf install -y epel-release -sudo dnf upgrade -sudo dnf install ripgrep -``` + ```bash + sudo dnf install -y epel-release + sudo dnf upgrade + sudo dnf install ripgrep + ``` -### Installez RipGrep en utilisant `cargo` +=== "Installation de RipGrep en utilisant `cargo`" -Ripgrep est un logiciel écrit en _Rust_ et peut être installé avec l'utilitaire `cargo`. Notez toutefois que `cargo` n'est pas installé automatiquement par l'installation par défaut de _rust_, donc vous devez l'installer explicitement. Si vous rencontrez des problèmes en utilisant cette méthode, revenez à l'installation à partir de l'EPEL. + Ripgrep est un logiciel écrit en *Rust* et peut être installé avec l'utilitaire `cargo`. Notez cependant que `cargo` n'est pas installé par défaut avec *rust*, vous devez donc l'installer explicitement. Si vous rencontrez des problèmes en utilisant cette méthode, revenez à l'installation à partir d'EPEL. -```bash -dnf install rust cargo -``` + ```bash + dnf install rust cargo + ``` -Une fois que le logiciel nécessaire est opérationnel, nous pouvons installer `ripgrep` avec : -```bash -cargo install ripgrep -``` + Après avoir installé le logiciel nécessaire nous pouvons installer `ripgrep` avec la commande suivante : -L'installation sauvegardera l'exécutable `rg` dans le répertoire `~/.cargo/bin` qui se trouve en dehors du PATH, pour l'utiliser au niveau de l'utilisateur, nous le lierons à `~/.local/bin/`. + ```bash + cargo install ripgrep + ``` -```bash -ln -s ~/.cargo/bin/rg ~/.local/bin/ -``` -## Vérification de RipGrep + L'installation enregistrera l'exécutable `rg` dans le dossier `~/.cargo/bin` qui est en dehors du PATH. Pour l'utiliser au niveau utilisateur nous le lierons à `~/.local/bin/`. + + ```bash + ln -s ~/.cargo/bin/rg ~/.local/bin/ + ``` + +## :material-check-all: Vérification de RipGrep -À ce stade, nous pouvons vérifier que tout va bien : +À ce stade, vous pouvez vérifier que tout va bien avec la commande suivante : ```bash rg --version @@ -57,13 +59,13 @@ ripgrep 13.0.0 +SIMD +AVX (runtime) ``` -RipGrep est nécessaire pour les recherches récursives avec `:Telescope`. +RipGrep est nécessaire pour des recherches récursives avec `:Telescope`. -## Lazygit +## :material-source-merge: Lazygit -[LazyGit](https://github.com/jesseduffield/lazygit) est une interface de style ncurses qui vous permet d'effectuer toutes les opérations `git` de manière plus conviviale. Il est requis par le plugin _lazygit.nvim_. Ce plugin permet d'utiliser LazyGit directement depuis NvChad, il ouvre une fenêtre flottante à partir de laquelle vous pouvez effectuer toutes les opérations sur vos référentiels, vous permettant ainsi d'apporter toutes les modifications au dépôt _git_ sans quitter l'éditeur. +[LazyGit](https://github.com/jesseduffield/lazygit) est une interface de style `ncurses` qui vous permet d'effectuer toutes les opérations `git` de manière plus conviviale. C'est requis par le plugin ==lazygit.nvim==. Ce plugiciel permet d'utiliser `LazyGit` directement depuis `NvChad`, il ouvre une fenêtre flottante d'où vous pouvez effectuer toutes les opérations sur vos dépôts, vous permettant ainsi d'effectuer toutes les modifications sur le *dépôt git* sans quitter l'éditeur. -Pour l'installer, nous pouvons utiliser le référentiel pour Fedora. Sous Rocky Linux 9, il fonctionne à merveille. +Pour l'installer, nous pouvons utiliser le référentiel de Fedora. Sous Rocky Linux 9, il fonctionne à merveille. ```bash sudo dnf copr enable atim/lazygit -y @@ -72,10 +74,10 @@ sudo dnf install lazygit Une fois installé, nous ouvrons un terminal et utilisons la commande `lazygit` et une interface similaire à ceci apparaîtra : -![LazyGit UI](images/lazygit_ui.png) +![LazyGit UI](./images/lazygit_ui.png) -Avec la touche x , nous pouvons afficher le menu avec toutes les commandes disponibles. +Avec la touche ++"?"++ , nous pouvons afficher le menu avec toutes les commandes disponibles. ![LazyGit UI](images/lazygit_menu.png) -Maintenant que nous avons tous les logiciels de support nécessaires sur notre système, nous pouvons passer à l'installation du logiciel de base. Nous allons commencer avec l'éditeur sur lequel la configuration entière est basée, [Neovim](install_nvim.md). +Maintenant que nous avons tous les logiciels nécessaires sur notre système, nous pouvons passer à l'installation du logiciel de base. Nous allons commencer par l'éditeur sur lequel la configuration entière est basée, [Neovim](install_nvim.md). diff --git a/docs/guides/network/accel-ppp_pppoe_server.it.md b/docs/guides/network/accel-ppp_pppoe_server.it.md new file mode 100644 index 0000000000..d29709e9b2 --- /dev/null +++ b/docs/guides/network/accel-ppp_pppoe_server.it.md @@ -0,0 +1,121 @@ +--- +title: accel-ppp PPPoE Server +author: Neel Chauhan +contributors: +tested_with: 9.3 +tags: + - network +--- + +# accel-ppp PPPoE Server + +## Introduzione + +Il PPPoE è un protocollo utilizzato principalmente dagli ISP DSL e fiber-to-the-home in cui i clienti vengono autenticati con una combinazione di nome utente e password. Il PPPoE è utilizzato nei Paesi in cui un ISP storico deve condividere la propria rete con altri ISP, in quanto i clienti possono essere indirizzati all'ISP desiderato tramite un nome di dominio. + +[accel-ppp](https://accel-ppp.org/) è un'implementazione accelerata del kernel Linux di PPPoE e dei protocolli correlati come PPTP, L2TP e altri. + +## Prerequisiti + +- Un server con due interfacce di rete +- Un router o un computer client che utilizza il protocollo PPPoE + +## Installare accel-ppp + +Per prima cosa installare EPEL: + +```bash +dnf install -y epel-release +``` + +Successivamente, installare accel-ppp: + +```bash +dnf install -y accel-ppp +``` + +## Impostare accel-ppp + +Per prima cosa, dobbiamo abilitare il forwarding IP: + +```bash +echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf +sysctl -p +``` + +Quindi, aggiungere quanto segue a `/etc/accel-ppp.conf`: + +```bash +[modules] +log_file +pppoe +auth_mschap_v2 +auth_mschap_v1 +auth_chap_md5 +auth_pap +chap-secrets +ippool + +[core] +log-error=/var/log/accel-ppp/core.log +thread-count=4 + +[ppp] +ipv4=require + +[pppoe] +interface=YOUR_INTERFACE + +[dns] +dns1=YOUR_DNS1 +dns2=YOUR_DNS2 + +[ip-pool] +gw-ip-address=YOUR_GW +YOUR_IP_RANGE + +[chap-secrets] +gw-ip-address=YOUR_GW +chap-secrets=/etc/chap-secrets +``` + +Cambiare le seguenti impostazioni: + +- **YOUR_INTERFACE** con l'interfaccia in ascolto per i client PPPoE. +- **YOUR_DNS1** e **YOUR_DNS2** con i server DNS da distribuire ai client. +- **YOUR_GW** è l'indirizzo IP del server per i client PPPoE. Questo **deve** essere diverso dall'indirizzo IP del server rivolto alla WAN o dal gateway predefinito. +- **YOUR_IP_RANGE** con gli intervalli IP da distribuire ai clienti. Può essere un intervallo IP come X.X.X.Y-Z o in formato CDIR come X.X.X.X/MASK. + +Successivamente, aggiungiamo un file “barebones” `/etc/chap-secrets`: + +```bash +user * password * +``` + +È possibile aggiungere altri utenti con altre righe, sostituendo `user` e `password` con il nome utente e la password desiderati. + +## Configurazione di un client PPPoE + +Una volta configurato il server PPPoE, si può iniziare ad aggiungere i client PPPoE. All'autore piace usare [MikroTik CHR](https://help.mikrotik.com/docs/display/ROS/Cloud+Hosted+Router%2C+CHR) come client PPPoE di prova, quindi useremo quello. + +Una volta installato MikroTik CHR su un sistema collegato alla stessa rete Ethernet dell'interfaccia di ascolto del server PPPoE, configureremo PPPoE: + +```bash +[admin@MikroTik] > /interface pppoe-client +[admin@MikroTik] > add add-default-route=yes disabled=no interface=ether1 name=pppoe-out1 \ + password=password user=user +``` + +Se tutto funziona correttamente, dovremmo ottenere un indirizzo IPv4: + +```bash +[admin@MikroTik] > /ip/address/print +Flags: D - DYNAMIC +Columns: ADDRESS, NETWORK, INTERFACE +# ADDRESS NETWORK INTERFACE +0 D 10.0.0.1/32 10.0.0.0 pppoe-out1 +``` + +## Conclusione + +Il PPPoE viene spesso malvisto ed è facile capire perché: è necessario configurare manualmente nomi utente e password. Ciononostante, consente di garantire la sicurezza quando ci si connette a un dominio di broadcast Layer 2 in scenari ISP in cui la richiesta di 802.1X o MACsec non sarebbe auspicabile, ad esempio per consentire l'utilizzo di router di proprietà del cliente o di indirizzi IP statici. E ora avete il vostro mini-ISP, congratulazioni! diff --git a/docs/guides/network/glances_network_monitoring.it.md b/docs/guides/network/glances_network_monitoring.it.md new file mode 100644 index 0000000000..cc24cd438b --- /dev/null +++ b/docs/guides/network/glances_network_monitoring.it.md @@ -0,0 +1,220 @@ +--- +title: Monitoraggio della rete e delle risorse con Glances +author: Alex Zolotarov +contributors: Steven Spencer +tested_with: 9.0 +tags: + - monitoring + - network +--- + +# Introduzione + +Questa guida vi mostrerà come impostare un **monitoraggio della rete o delle risorse** decente, con il minimo sforzo. +Dal punto di vista dell'autore, Glances è simile a `vim` nel mondo degli strumenti di monitoraggio. + +## Riguardo a Glances + +Glances è uno strumento di monitoraggio open source multipiattaforma. +Consente il monitoraggio in tempo reale di vari aspetti del sistema, come CPU, memoria, disco, utilizzo della rete e altro ancora. +Consente inoltre di monitorare i processi in esecuzione, gli utenti registrati, le temperature, le tensioni, le velocità delle ventole e così via. +Supporta inoltre il monitoraggio dei container e diversi sistemi di gestione dei container, come Docker e LXC. +Una dashboard presenta le informazioni in modo facile da leggere e può anche eseguire il monitoraggio remoto dei sistemi tramite un'interfaccia web o a riga di comando. +È facile da installare e da usare ed è personalizzabile per mostrare solo le informazioni che interessano. + +## Prerequisiti + +- Un server o container +- Privilegi di root +- Il repository EPEL installato + +## Installazione dei Pacchetti + +**Prima di tutto, installare il repository EPEL (Extra Packages for Enterprise Linux):** + +```bash +dnf install -y epel-release +``` + +Quindi, installare **Glances** + +```bash +dnf install -y glances +``` + +Ora è possibile monitorare tutto ciò di cui si ha bisogno. + +Digitare `glances` per avviare glances. + +## Interfaccia Web + +È possibile accedere a glance anche con un browser web, basta passare la flag `-w`: + +```bash +glances -w +``` + +Una volta inviato, si vedrà: + +```bash +Glances Web User Interface started on http://0.0.0.0:61208/ +``` + +È possibile accedervi con un indirizzo IP o semplicemente con un reverse proxy al nome di dominio. + +## Che aspetto ha Glances + +Per impostazione predefinita, è possibile vedere tutte le interfacce di rete, la media del carico, i grafici del carico, i contenitori, gli avvisi e i processi. + +![glances-dashboard](./images/glances-dashboard.webp) + +## Comandi interattivi + +**Il potenziale di Glances è nelle sue scorciatoie, in quanto nasconde molte metriche di rete per impostazione predefinita.** + +I seguenti comandi (tasto premuto) sono supportati in Glances: + +- \++enter++ : Impostazione del process filter + +!!! NOTE + +``` +Su macOS, usare ++ctrl+h++ per eliminare il filtro. +``` + +Il filtro è un modello di espressione regolare: + +- `gnome`: corrisponde a tutti i processi che iniziano con la stringa `gnome`. + +- `.*gnome.*`: corrisponde a tutti i processi contenenti la stringa `gnome`. + +- \++“a”++, ordinamento automatico dell'elenco dei processi + +- Se CPU `>70%`, ordinare i processi in base all'utilizzo della CPU + +- Se MEM `>70%`, ordinare i processi in base all'utilizzo della MEM + +- Se l'iowait della CPU è `>60%`, ordinare i processi per I/O in lettura e scrittura + +- \++a++, attivare o disattivare il processo di monitoraggio delle applicazioni. + +- \++“b”++, commutazione tra bit/s o Byte/s per l'I/O di rete + +- \++b++, View disk I/O counters per second + +- \++“c”++, ordinamento dei processi in base all'utilizzo della CPU + +- \++c++, Abilitare o disabilitare le statistiche del cloud + +- \++“d”++, Mostra o nasconde le statistiche di I/O del disco + +- \++d++, Abilita o disabilita le statistiche di Docker + +- \++“e”++, Abilitazione o disabilitazione delle statistiche estese + +- \++e++, cancellare il filtro del processo corrente + +- \++“f”++, Mostra o nascondi le statistiche di monitoraggio del sistema e delle cartelle + +- \++f++, passa dal file system usato allo spazio libero + +- \++“g”++, generazione di grafici per la cronologia corrente + +- \++g++, Abilita o disabilita le statistiche della GPU + +- \++"h"++, Mostra o nasconde la schermata di aiuto + +- \++“i”++, ordinamento dei processi in base alla velocità di I/O + +- \++i++, mostra o nasconde il modulo IP + +- `+`, Aumentare il livello di priorità del processo selezionato / Ridurre la priorità (richiede diritti di amministratore) - Solo in modalità standalone. + +- `-`, Decrementare il livello di priorità del processo selezionato / Aumenta la priorità (richiede diritti di amministratore) - Solo in modalità standalone. + +- \++“k”++, Termina il processo selezionato (richiede diritti di amministratore) - Solo in modalità standalone. + +- \++k++, Mostra o nasconde la connessione TCP + +- \++“l”++, mostra o nasconde i messaggi di log + +- \++“m”++, ordinamento dei processi in base all'utilizzo della MEM + +- \++m++, Azzeramento del riepilogo dei processi min/max + +- \++“n”++, mostra o nasconde le statistiche di rete + +- \++n++, Mostra o nasconde l'ora corrente + +- \++“p”++, ordinamento dei processi per nome + +- \++p++, Abilita o disabilita le statistiche delle porte + +- \++“q”++ o ++esc++ o ++ctrl+c++, chiude la sessione corrente di Glances + +- \++q++, Mostra o nasconde il modulo IRQ + +- \++“r”++, Azzeramento della cronologia + +- \++r++, Mostra o nasconde il plugin RAID + +- \++“s”++, Mostra o nasconde le statistiche dei sensori + +- \++s++, Abilita o disabilita le spark lines + +- \++“t”++, ordinamento dei processi per tempi di CPU (TIME+) + +- \++t++, considerare l'I/O di rete come una combinazione + +- \++“u”++, Ordina i processi per UTENTE + +- \++u++, Visualizzazione dell'I/O di rete cumulativo + +- \++“w”++, eliminare i messaggi di log di avviso terminati + +- \++w++, mostra o nasconde il modulo Wifi + +- \++“x”++, Eliminazione dei messaggi di log critici e di avvertimento terminati + +- \++“z”++, Mostra o nascondi le statistiche dei processi + +- \++0++, Abilita o disabilita la modalità Irix/Solaris. Divide l'utilizzo della CPU dell'attività per il numero totale di CPU. + +- \++1++, passare dalle statistiche globali della CPU a quelle per CPU + +- \++2++, Attivare o disattivare la barra laterale sinistra + +- \++3++, Abilita o disabilita il modulo di ricerca rapida + +- \++4++, Abilitare o disabilitare il modulo di ricerca e caricamento rapidi + +- \++5++, abilita o disabilita il menu superiore (QuickLook, CPU, MEM, SWAP e LOAD) + +- \++6++, Abilita o disabilita la modalità GPU media + +- \++9++, Commutazione dell'interfaccia utente tra bianco e nero + +- \++slash++, passa dalla riga di comando del processo al nome del comando. + +- \++f5++ o ++ctrl+“R”++, Aggiorna interfaccia utente + +- \++left++, Navigazione a sinistra attraverso l'ordinamento del processo + +- \++right++, Navigazione a destra attraverso il processo di ordinamento + +- \++up++, In alto nell'elenco dei processi + +- \++down++, Giù nell'elenco dei processi + +Nel browser del client Glances (accessibile tramite l'argomento della riga di comando `--browser`): + +- \++enter++, Eseguire il server selezionato +- \++up++, In alto nell'elenco dei server +- \++down++, In fondo all'elenco dei server +- \++q++ o ++esc++, Termina Glances + +## Conclusione + +Anche se Glances non può esattamente sostituire strumenti come Grafana, è comunque un'ottima alternativa se non si ha il tempo di impostare complicati cruscotti di monitoraggio. +È possibile distribuirlo in pochi secondi e ottenere le stesse metriche di Grafana con Prometheus. +L'interfaccia web non è molto versatile come quella di Grafana. Se avete la possibilità di utilizzare il terminale, dovreste assolutamente farlo. diff --git a/docs/guides/network/hurricane_electric_ipv6_tunnel.it.md b/docs/guides/network/hurricane_electric_ipv6_tunnel.it.md new file mode 100644 index 0000000000..2da8504184 --- /dev/null +++ b/docs/guides/network/hurricane_electric_ipv6_tunnel.it.md @@ -0,0 +1,48 @@ +--- +title: Hurricane Electric IPv6 Tunnel +author: Neel Chauhan +contributors: Steven Spencer +tested_with: 9.5 +tags: + - network +--- + +# Hurricane Electric IPv6 tunnel + +L'IPv6 non ha bisogno di presentazioni, ma per chi non lo sapesse sostituisce il più diffuso protocollo IPv4, che utilizza indirizzi esadecimali a 128 bit anziché decimali a 32 bit. + +[Hurricane Electric](https://he.net) è un internet service provider. Tra le diverse funzioni, Hurricane Electric utilizza il servizio gratuito [Tunnel Broker](https://tunnelbroker.net/) per fornire connettività IPv6 sulle reti solo IPv4. + +## Introduzione + +A causa dell'esaurimento dell'IPv4, è nata l'esigenza di uno spazio di indirizzamento IP ampliato sotto forma di IPv6. Tuttavia, molte reti non supportano ancora l'IPv6 a causa dell'ubiquità della Network Address Translation (NAT). Per questo motivo, Hurricane Electric offre la gestione del tunnel IPv6. + +## Prerequisiti + +- Un [tunnel Hurricane Electric IPv6 gratuito](https://tunnelbroker.net/) + +- Un server Rocky Linux con un indirizzo IP pubblico e un protocollo ICMP (Internet Control Message Protocol) non filtrato. + +## Ottenere un tunnel IPv6 + +Per prima cosa, create un account su [tunnelbroker.net](https://tunnelbroker.net/). + +Quando si dispone di un account, selezionare **Create Regular Tunnel** nella barra laterale **User Functions**: + +![HE.net sidebar](../images/henet_1.png) + +Quindi inserire l'indirizzo IPv4 pubblico, selezionare la posizione dell'endpoint e fare clic su **Create Tunnel**. + +## Impostazione del IPv6 tunnel + +La buona notizia è che un tunnel IPv6 necessita di un solo comando: + +```bash +nmcli connect add type ip-tunnel ifname he-sit mode sit remote IPV4_SERVER ipv4.method disabled ipv6.method manual ipv6.address IPV6_CLIENT ipv6.gateway IPV6_SERVER +``` + +Sostituire quanto segue con i dati del portale Hurricane Electric: + +- `IPV4_SERVER` con l'**indirizzo IPv4 del server**. +- `IPV6_SERVER` con l'**indirizzo IPv6 del server**. +- `IPV6_CLIENT` con l'**indirizzo IPv6 del client**. diff --git a/docs/guides/network/openbgpd_bgp_router.it.md b/docs/guides/network/openbgpd_bgp_router.it.md new file mode 100644 index 0000000000..cbd67b928f --- /dev/null +++ b/docs/guides/network/openbgpd_bgp_router.it.md @@ -0,0 +1,175 @@ +--- +title: "Router OpenBGPD BGP " +author: Neel Chauhan +contributors: Steven Spencer, Ganna Zhyrnova +tested_with: 9.3 +tags: + - network +--- + +# Router OpenBGPD BGP + +## Introduzione + +Il Border Gateway Protocol (BGP) è il protocollo di routing che tiene insieme Internet. È il modo in cui è possibile visualizzare questo documento indipendentemente dal provider di servizi Internet. + +[OpenBGPD](http://openbgpd.org/) è l'implementazione BGP multipiattaforma di [OpenBSD](https://www.openbsd.org/). L'autore lo utilizza personalmente sulla propria rete. + +## Prerequisiti + +- Un server, una macchina virtuale o una rete di laboratorio con connettività BGP +- Un numero AS dal [Regional Internet Registry](https://www.nro.net/about/rirs/) +- Un blocco IPv4 o IPv6 di proprietà o noleggiato +- Conoscenze nell'amministrazione di rete + +## Installarezione dei package + +Poiché OpenBGPD non è presente nei repository predefiniti, installare prima il repository EPEL (Extra Packages for Enterprise Linux): + +```bash +dnf install -y epel-release +``` + +Successivamente, installare OpenBGPD: + +```bash +dnf install -y openbgpd +``` + +## Configurazione di OpenBGPD + +Iniziamo con una nuova configurazione di OpenBGPD: + +```bash +rm /etc/bgpd.conf +touch /etc/bgpd.conf +chmod 0600 /etc/bgpd.conf +``` + +Quindi, aggiungere quanto segue a `/etc/bgpd.conf`: + +```bash +AS YOUR_ASN +router-id YOUR_IPV4 + +listen on 127.0.0.1 +listen on YOUR_IPV4 +listen on ::1 +listen on YOUR_IPV6 +log updates +network IPV4_TO_ADVERTISE/MASK +network IPV6_TO_ADVERTISE/MASK + +allow to ebgp prefix { IPV4_TO_ADVERTISE/MASK IPV6_TO_ADVERTISE/MASK } + +neighbor PEER_IPV4 { + remote-as PEER_ASN + announce IPv4 unicast + announce IPv6 none + local-address YOUR_IPV4 +} + +neighbor PEER_IPV6 { + remote-as PEER_ASN + announce IPv4 none + announce IPv6 unicast + local-address YOUR_IPV6 +} +``` + +Sostituire i seguenti parametri: + +- **YOUR_ASN** con il vostro numero AS. +- **YOUR_IPV4** con l'indirizzo IPv4 del vostro server. +- **YOUR_IPV6** con l'indirizzo IPv6 del vostro server. +- **PEER_ASN** con il numero AS del vostro ISP a monte. +- **PEER_IPV4** con l'indirizzo IPv4 del vostro ISP +- **PEER_IPV6** con l'indirizzo IPv6 del vostro ISP upstream. + +Le righe precedenti significano quanto segue: + +- La riga `AS` contiene il numero AS del BGP. +- La riga `router-id` contiene l'ID del router BGP. Si tratta di un indirizzo IPv4, ma può essere un indirizzo fittizio non instradabile (ad esempio 169.254.x.x) se si utilizza un BGP solo IPv6. +- La riga `listen on` indica quali interfacce ascoltare. Dovremmo ascoltare tutte le interfacce che parlano di BGP. +- Le righe `network` aggiungono le reti che vogliamo pubblicizzare. +- La riga `allow to ebgp prefix` aggiunge la conformità [RFC8212](https://datatracker.ietf.org/doc/html/rfc8212) per la sicurezza del routing. Alcune società di hosting, come BuyVM, lo richiedono. +- I blocchi `neighbor` specificano ogni peer IPv4 e IPv6. +- La riga `remote-as` specifica il numero AS dell'upstream. +- La riga `announce IPv4` specifica se annunciare le rotte IPv4 `unicast` o `none`. Dovrebbe essere `none` su un upstream IPv6. +- La riga `announce IPv6` specifica se annunciare le rotte IPv6 `unicast` o `none`. Dovrebbe essere `none` su un upstream IPv4. +- La riga `local-address` è l'indirizzo IPv4 o IPv6 dell'upstream. + +Alcuni upstream possono utilizzare una password MD5 o BGP multihop. In questo caso, i blocchi \`neighbor' avranno l'aspetto seguente: + +```bash +neighbor PEER_IPV4 { + remote-as PEER_ASN + announce IPv4 unicast + announce IPv6 none + local-address YOUR_IPV4 + multihop 2 + local-address 203.0.113.123 +} + +neighbor PEER_IPV6 { + remote-as PEER_ASN + announce IPv4 none + announce IPv6 unicast + local-address YOUR_IPV6 + multihop 2 + local-address 2001:DB8:1000::1 +} +``` + +È necessario abilitare l'inoltro IP impostando i valori di `sysctl`: + +```bash +net.ipv4.ip_forward = 1 +net.ipv6.conf.all.forwarding = 1 +``` + +Ora è necessario abilitare OpenBGPD e l'inoltro: + +```bash +sysctl -p /etc/sysctl.conf +systemctl enable --now bgpd +``` + +## Controllo dello stato di BGP + +Una volta abilitato OpenBGPD, è possibile vedere lo stato di BGP: + +```bash +bgpctl show +``` + +Verrà visualizzato il risultato: + +```bash +Neighbor AS MsgRcvd MsgSent OutQ Up/Down State/PrfRcvd +BGP_PEER PEER_ASN 164 68 0 00:32:04 0 +``` + +È anche possibile vedere le rotte pubblicizzate da BGP: + +```bash +bgpctl show rib +``` + +Se funziona correttamente, si dovrebbe vedere la tabella di routing BGP: + +```bash +flags: * = Valid, > = Selected, I = via IBGP, A = Announced, + S = Stale, E = Error +origin validation state: N = not-found, V = valid, ! = invalid +aspa validation state: ? = unknown, V = valid, ! = invalid +origin: i = IGP, e = EGP, ? = Incomplete + +flags vs destination gateway lpref med aspath origin +AI*> N-? YOUR_IPV4/24 0.0.0.0 100 0 i +AI*> N-? YOUR_IPV6::/48 :: 100 0 i +``` + +## Conclusione + +Anche se inizialmente il BGP può sembrare scoraggiante, una volta acquisita la padronanza, è possibile ottenere una parte della tabella di routing di Internet. La semplicità di OpenBGPD rende ancora più facile avere un router software o un server anycast. Divertitevi! diff --git a/docs/guides/proxies/i2pd.it.md b/docs/guides/proxies/i2pd.it.md new file mode 100644 index 0000000000..1edc2330ec --- /dev/null +++ b/docs/guides/proxies/i2pd.it.md @@ -0,0 +1,90 @@ +--- +title: i2pd Anonymous Network +author: Neel Chauhan +contributors: +tested_with: 9.3 +tags: + - proxy + - proxies +--- + +# i2pd Anonymous Network + +## Introduzione + +[I2P](https://geti2p.net/en/) è una anonymous overlay network, concorrente della più popolare rete Tor, che si concentra sui siti web nascosti chiamati eepsites. [`i2pd`](https://i2pd.website/) (I2P Daemon) è un'implementazione lightweight in C++ del protocollo I2P. + +## Prerequisiti e presupposti + +I requisiti minimi per l'utilizzo di questa procedura sono i seguenti: + +- Un indirizzo IPv4 o IPv6 pubblico, direttamente sul server, con port forwarding o UPnP/NAT-PMP. + +## Installazione di `i2pd` + +Per installare `i2pd`, è necessario installare prima i repository EPEL (Extra Packages for Enterprise Linux) e `i2pd` copr (Cool Other Package Repo) (Nota: se si utilizza Rocky Linux 8, sostituire `8` con `9`): + +```bash +curl -s https://copr.fedorainfracloud.org/coprs/supervillain/i2pd/repo/epel-9/supervillain-i2pd-epel-9.repo -o /etc/yum.repos.d/i2pd-epel-9.repo +dnf install -y epel-release +``` + +Quindi installare `i2pd`: + +```bash +dnf install -y i2pd +``` + +## (Opzionale) Configurare `i2pd` + +Con i pacchetti installati, è possibile configurare `i2pd`, se lo si desidera. L'autore usa `vim` per questo esempio, ma è possibilie usare qualsiasi altro editor come`nano`: + +```bash +vim /etc/i2pd/i2pd.conf +``` + +Il file \`i2pd.conf' predefinito è abbastanza descrittivo, ma può diventare lungo, se si vuole solo una configurazione di base, lo si può lasciare così com'è. + +Tuttavia, se si desidera abilitare IPv6 e UPnP e ascoltare il proxy HTTP sulla porta `12345`, la configurazione che lo consente è la seguente: + +```bash +ipv6 = true +[httpproxy] +port = 12345 +[upnp] +enabled = true +``` + +Se si desidera impostare altre opzioni, il file di configurazione è autoesplicativo su tutte le opzioni possibili. + +## Abilitare `i2pd` + +E' possibile ora abilitare `i2pd` + +```bash +systemctl enable --now i2pd +``` + +## Visitare i siti web I2P + +In questo esempio, si sta usando Firefox su Rocky Linux. Se non si utilizza Firefox, fare riferimento alla documentazione dell'applicazione per impostare un proxy HTTP. + +Aprire Firefox, fare clic sull'icona del menu ad hamburger e andare su **Impostazioni**: + +![Firefox menu dropdown](../images/i2p_proxy_ff_1.png) + +Spostarsi su **Network Settings** e quindi premere **Settings** + +![Firefox Network Settings section](../images/i2p_proxy_ff_2.png) + +Selezionare quindi **Manual proxy connection** , inserire `localhost` e `4444` (o la porta selezionata), selezionare **Also use this proxy for HTTPS** e selezionare **OK**. + +![Firefox Connection Settings dialog](../images/i2p_proxy_ff_3.png) + +Ora è possibile consultare i siti web I2P. Ad esempio, navigare su `http://planet.i2p` (nota: `http://` è importante per impedire a Firefox di scegliere un motore di ricerca predefinito): + +![Firefox viewing planet.i2p](../images/i2p_proxy_ff_4.png) + +## Conclusione + +Con tanti utenti di Internet preoccupati per la privacy online, I2P è l'unico modo per accedere ai siti web nascosti in modo sicuro. `i2pd` è un software leggero che rende possibile la navigazione nei siti web I2P, oltre a condividere la propria connessione come relè. diff --git a/docs/guides/proxies/tor_relay.it.md b/docs/guides/proxies/tor_relay.it.md index 26c0d8cd4b..dd9f3b8c6a 100644 --- a/docs/guides/proxies/tor_relay.it.md +++ b/docs/guides/proxies/tor_relay.it.md @@ -18,12 +18,13 @@ tags: I requisiti minimi per l'utilizzo di questa procedura sono i seguenti: -- Un indirizzo IP pubblico, direttamente sul server o con il port forwarding. -- Un sistema in grado di funzionare 24 ore su 24, 7 giorni su 7, per servire la rete Tor. +- Un indirizzo IPv4 pubblico, direttamente sul server o con il port forwarding +- Un sistema in grado di funzionare 24 ore su 24, 7 giorni su 7, per essere utile alla rete Tor - La possibilità di eseguire comandi come utente root o di usare `sudo` per elevare i privilegi. - Familiarità con un editor a riga di comando. L'autore utilizza `vi` o `vim`, ma potete sostituirlo con il vostro editor preferito. - Familiarità con la modifica delle impostazioni di SELinux e del firewall. -- Una connessione senza contatore o una connessione con un limite di larghezza di banda elevato. +- Una connessione non misurata o una connessione con un limite di larghezza di banda elevato +- Opzionale: Un indirizzo IPv6 pubblico per la connettività dual-stack. ## Installazione di Tor @@ -58,29 +59,29 @@ Log notice syslog ### Uno sguardo più approfondito -- Il "Nickname" è un soprannome (non univoco) per il proprio relay Tor. -- La "ORPort" è la porta TCP su cui il relay Tor è in ascolto. Quella predefinita è "9001". +- Il `Nickname` è un soprannome (non univoco) per il proprio relay Tor. +- La `ORPort' è la porta TCP su cui il relè Tor è in ascolto. Quella predefinita è `9001\`. - Il "ContactInfo" è il vostro recapito, nel caso in cui ci siano problemi con il vostro relay Tor. Impostate questo campo con il vostro indirizzo e-mail. -- Il "Log" è la severità e la destinazione dei log del relay Tor. Stiamo registrando "notice" per evitare che le informazioni sensibili vengano registrate e "syslog" per inviare l'output al log di `systemd`. +- Il parametro `Log` è la gravità e la destinazione dei log del relè Tor. Stiamo registrando `notice` per evitare che vengano registrate informazioni sensibili e `syslog` per inviare l'output al log di `systemd`. ### Configurazione del sistema -Se si è scelta una porta TCP/IP diversa da "9001" (quella predefinita), è necessario regolare la `tor_port_t` di SELinux per inserire nella whitelist la porta del relay Tor. Per farlo: +Se si è scelta una porta TCP/IP diversa da `9001` (quella predefinita), è necessario regolare la `tor_port_t` di SELinux per inserire nella whitelist la porta del relè Tor. Per farlo: ```bash semanage port -a -t tor_port_t -p tcp 12345 ``` -Sostituire "12345" con la porta TCP impostata in "ORPort". +Sostituire `12345` con la porta TCP impostata in `ORPort`. -È inoltre necessario aprire la porta "ORPort" nel firewall. Per farlo: +È inoltre necessario aprire la porta `ORPort` nel firewall. Per farlo: ```bash firewall-cmd --zone=public --add-port=9001/tcp firewall-cmd --runtime-to-permanent ``` -Sostituire "9001" con la porta TCP impostata in "ORPort". +Sostituire `9001` con la porta TCP impostata in `ORPort`. ## Limitare la larghezza di banda @@ -109,7 +110,7 @@ AccountingMax 20 GB Questi valori implicano che: -- Il periodo di contabilizzazione della larghezza di banda è ogni giorno a partire dalle 00:00 ora del sistema. È anche possibile cambiare "day" in " week " o " month ", oppure sostituire " 00:00 " con un altro orario. +- Il periodo di contabilizzazione della larghezza di banda è ogni giorno a partire dalle 00:00 ora del sistema. Si può anche cambiare `giorno` in `settimana` o `mese`, o sostituire `00:00` con un altro orario. - Nel periodo di contabilizzazione della larghezza di banda, sarà possibile trasferire 20 GB. Aumentare o diminuire il valore se si desidera consentire una maggiore o minore larghezza di banda per il relay. Cosa succede dopo aver utilizzato la larghezza di banda specificata? Il relay bloccherà i tentativi di connessione fino alla fine del periodo. Se il relay non ha utilizzato la larghezza di banda specificata nel periodo, il contatore si azzera senza alcun tempo di inattività. @@ -134,24 +135,221 @@ Entro poche ore, il vostro relay sarà elencato su [Tor Relay Status](https://me ## Considerazioni sul relay -È inoltre possibile estendere la configurazione per rendere il relay Tor un relay di uscita o un relay di ponte. +È inoltre possibile estendere la configurazione per rendere il relè Tor un relè di uscita o un relè ponte. È inoltre possibile impostare un massimo di 8 relè per indirizzo IP pubblico. Il file dell'unità Tor systemd in EPEL non è stato progettato per più di un'istanza, ma il file dell'unità può essere copiato e modificato per adattarsi a una configurazione multi-relay. -I relay di uscita sono l'ultimo hop di un circuito Tor che si collega direttamente ai siti web. I relay bridge sono relay non elencati che aiutano gli utenti che subiscono la censura di Internet a connettersi a Tor. +I relè di uscita sono l'ultimo hop di un circuito Tor che si collega direttamente ai siti web. I relay bridge sono relay non elencati che aiutano gli utenti che subiscono la censura di Internet a connettersi a Tor. -Le opzioni per il file `torrc` si trovano nella [pagina del manuale](https://2019.www.torproject.org/docs/tor-manual.html.en). +Le opzioni per il file \`torrc' sono riportate in [la pagina man](https://2019.www.torproject.org/docs/tor-manual.html.en). Qui descriviamo una configurazione di base per un relè di uscita e di ponte. -È inoltre possibile impostare un massimo di 8 relay per indirizzo IP pubblico. Il file dell'unità Tor systemd in EPEL non è stato progettato per più di un'istanza, ma il file dell'unità può essere copiato e modificato per adattarsi a una configurazione multi-relay. +### Esecuzione di un relè di uscita -!!! warning "Attenzione" +!!! warning ``` -Se si intende gestire un exit relay, assicurarsi che il proprio ISP o società di hosting sia d'accordo. I reclami per abusi da parte degli exit relay sono molto comuni, poiché si tratta dell'ultimo nodo di un circuito Tor che si connette direttamente ai siti web per conto degli utenti Tor. Per questo motivo, molte società di hosting non accettano i relay di uscita Tor. +Se si intende gestire un relè di uscita, assicurarsi che il proprio ISP o società di hosting sia d'accordo. I reclami per abusi da parte degli exit relay sono molto comuni, in quanto si tratta dell'ultimo nodo di un circuito Tor che si connette direttamente ai siti web per conto degli utenti Tor. Per questo motivo, molti ISP e società di hosting non ammettono i relay di uscita Tor. -Se non siete sicuri che il vostro ISP permetta i relay di uscita Tor, consultate i termini di servizio o chiedete al vostro ISP. Se il vostro ISP dice di no, cercate un altro ISP o una società di hosting, oppure prendete in considerazione un relay intermedio. +Se non siete sicuri che il vostro ISP permetta i relay di uscita Tor, consultate i termini di servizio o chiedete al vostro ISP. Se il vostro ISP dice di no, cercate un altro ISP o una società di hosting o prendete in considerazione un relay intermedio o un bridge. ``` +Se si vuole eseguire un relè di uscita, è necessario aggiungere quanto segue al proprio `torrc`: + +```bash +ExitRelay 1 +``` + +Tuttavia, si utilizzerà il seguente criterio di uscita predefinito: + +```bash +ExitPolicy reject *:25 +ExitPolicy reject *:119 +ExitPolicy reject *:135-139 +ExitPolicy reject *:445 +ExitPolicy reject *:563 +ExitPolicy reject *:1214 +ExitPolicy reject *:4661-4666 +ExitPolicy reject *:6346-6429 +ExitPolicy reject *:6699 +ExitPolicy reject *:6881-6999 +ExitPolicy accept *:* +``` + +Questa exit policy blocca solo un piccolo sottoinsieme di porte TCP, consentendo l'abuso di BitTorrent e SSH, che molti ISP non vedono di buon occhio. + +Se si vuole usare una [reduced exit policy](https://gitlab.torproject.org/legacy/trac/-/wikis/doc/ReducedExitPolicy), la si può impostare nel `torrc`: + +```bash +ReducedExitPolicy 1 +``` + +È anche possibile avere un criterio di uscita più restrittivo, ad esempio consentire solo il traffico DNS, HTTP e HTTPS. Questo può essere impostato così: + +```bash +ExitPolicy accept *:53 +ExitPolicy accept *:80 +ExitPolicy accept *:443 +ExitPolicy reject *:* +``` + +Questi valori implicano che: + +- Si consente il traffico in uscita alle porte TCP 53 (DNS), 80 (HTTP) e 443 (HTTPS) con le nostre linee `ExitPolicy accept`. +- Con le queste linee jolly `ExitPolicy reject`, non si permette il traffico in uscita verso qualsiasi altra porta TCP. + +Se si desidera un criterio di uscita non restrittivo, bloccando solo il traffico SMTP, questo può essere impostato così: + +```bash +ExitPolicy reject *:25 +ExitPolicy reject *:465 +ExitPolicy reject *:587 +ExitPolicy accpet *:* +``` + +Questi valori implicano che + +- Con le linee `ExitPolicy reject` non è consentito il traffico in uscita verso le porte TCP SMTP standard 25, 465 e 587. +- Si consente il traffico di uscita a tutte le altre porte TCP nella linea jolly `ExitPolicy accept`. + +È inoltre possibile consentire o bloccare un intervallo di porte come segue: + +```bash +ExitPolicy accept *:80-81 +ExitPolicy reject *:993-995 +``` + +Questi valori implicano che: + +- Si consente il traffico in uscita alle porte TCP 80-81 +- Non è consentito il traffico in uscita verso le porte TCP 993-995, utilizzate per le varianti IMAP, IRC e POP3 protette da SSL. + +È inoltre possibile consentire il traffico in uscita verso gli indirizzi IPv6, a condizione che il server disponga di connettività dual-stack: + +```bash +IPv6Exit 1 +``` + +### Esecuzione di un bridge obfs4 + +Le connessioni dirette a Tor sono bloccate in molte parti del mondo, tra cui Cina, Iran, Russia e Turkmenistan. In questi paesi, i bridge relay non elencati sono utilizzati dai client Tor. + +Tor opera utilizzando un sistema di [pluggable transports](https://support.torproject.org/glossary/pluggable-transports/), che consente di mascherare il traffico Tor con altri protocolli, come il traffico fittizio non identificabile (obfs4), WebRTC (snowflake) o le connessioni HTTPS ai servizi Microsoft (meek). + +Grazie alla sua versatilità, obfs4 è il pluggable transport più diffuso. + +Per configurare un bridge obfs4, dato che obfs4 non è presente nei repo di EPEL, si deve compilarlo da zero. Installiamo prima i pacchetti necessari: + +```bash +dnf install git golang policycoreutils-python-utils +``` + +Successivamente, scaricheremo ed estrarremo il codice sorgente di obfs4: + +```bash +wget https://gitlab.com/yawning/obfs4/-/archive/obfs4proxy-0.0.14/obfs4-obfs4proxy-0.0.14.tar.bz2 +tar jxvf obfs4-obfs4proxy-0.0.14.tar.bz2 +cd obfs4-obfs4proxy-0.0.14/obfs4proxy/ +``` + +È anche possibile ottenere obfs4 direttamente da `git clone`, ma questo dipende da una versione di Go più recente di quella presente in AppStream, quindi non la si userà. + +Quindi, compileremo e installeremo obfs4: + +```bash +go build +cp -a obfs4proxy /usr/local/bin/ +``` + +Una volta installato obfs4, aggiungeremo quanto segue al nostro `torrc`: + +```bash +ServerTransportPlugin obfs4 exec /usr/local/bin/obfs4proxy +ServerTransportListenAddr obfs4 0.0.0.0:12345 +ExtORPort auto +``` + +Questi valori implicano che: + +- Si sta eseguendo un trasporto inseribile obfs4 che si trova in `/usr/local/bin/obfs4proxy` sulla linea `ServerTransportPlugin`. +- `ServerTransportListenAddr` fa sì che il pluggable transport sia in ascolto sulla porta 12345. +- La linea `ExtORPort` ascolterà su una porta scelta a caso le connessioni tra Tor e il pluggable transport configurato. Normalmente, questa riga non deve essere modificata + +Se si desidera ascoltare su un'altra porta TCP, cambiare `12345` con la porta TCP desiderata. + +Inoltre, la porta TCP `12345` (o la porta scelta dall'utente) sarà consentita in SELinux e `firewalld`: + +```bash +semanage port -a -t tor_port_t -p tcp 12345 +firewall-cmd --zone=public --add-port=12345/tcp +firewall-cmd --runtime-to-permanent +``` + +## Eseguire replays multipli + +Come già detto, è possibile impostare fino a 8 relay Tor per ogni indirizzo IP pubblico. Ad esempio, se si ha 5 indirizzi IP pubblici, si può impostare un massimo di 40 relè sul server impostato. + +Tuttavia, si richiede un file di unità systemd personalizzato per ogni relè che si esegue. + +Si aggiunga ora un file di unità systemd secondario a `/usr/lib/systemd/system/torX`: + +```bash +[Unit] +Description=Anonymizing overlay network for TCP +After=syslog.target network.target nss-lookup.target +PartOf=tor-master.service +ReloadPropagatedFrom=tor-master.service + +[Service] +Type=notify +NotifyAccess=all +ExecStartPre=/usr/bin/tor --runasdaemon 0 -f /etc/tor/torrcX --DataDirectory /var/lib/tor/X --DataDirectoryGroupReadable 1 --User toranon --verify-config +ExecStart=/usr/bin/tor --runasdaemon 0 -f /etc/tor/torrcX --DataDirectory /var/lib/tor/X --DataDirectoryGroupReadable 1 --User toranon +ExecReload=/bin/kill -HUP ${MAINPID} +KillSignal=SIGINT +TimeoutSec=30 +Restart=on-failure +RestartSec=1 +WatchdogSec=1m +LimitNOFILE=32768 + +# Hardening +PrivateTmp=yes +DeviceAllow=/dev/null rw +DeviceAllow=/dev/urandom r +ProtectHome=yes +ProtectSystem=full +ReadOnlyDirectories=/run +ReadOnlyDirectories=/var +ReadWriteDirectories=/run/tor +ReadWriteDirectories=/var/lib/tor +ReadWriteDirectories=/var/log/tor +CapabilityBoundingSet=CAP_SETUID CAP_SETGID CAP_NET_BIND_SERVICE CAP_DAC_READ_SEARCH +PermissionsStartOnly=yes + +[Install] +WantedBy = multi-user.target +``` + +Sostituire il suffisso `X` dopo `tor`/`torrc` con il nome desiderato. L'autore preferisce numerarlo per semplicità, ma può essere qualsiasi cosa. + +Successivamente, si aggiungerà il file `torrc` dell'istanza in `/etc/tor/torrcX`. Assicurarsi che ogni istanza abbia una porta e/o un indirizzo IP separati. + +Inoltre, si utilizzerà la porta TCP `12345` (o la porta in `torrcX`) in SELinux e `firewalld`: + +```bash +semanage port -a -t tor_port_t -p tcp 12345 +firewall-cmd --zone=public --add-port=12345/tcp +firewall-cmd --runtime-to-permanent +``` + +Successivamente, abilitare l'unità systemd `torX`: + +```bash +systemctl enable --now torX +``` + +Ripetere questi passaggi per ogni relay che si desidera eseguire. + ## Conclusione -A differenza di un servizio VPN convenzionale, Tor si avvale di relay gestiti da volontari per garantire la privacy e l'anonimato, che avete appena impostato. +A differenza di un servizio VPN convenzionale, Tor si avvale di relè gestiti da volontari per garantire la privacy e l'anonimato, che vengono appena impostati. -Sebbene il funzionamento di un relay Tor richieda un sistema affidabile e, per le uscite, un ISP di supporto, l'aggiunta di più relay aiuta la privacy e rende Tor più veloce con meno punti di debolezza. +Sebbene il funzionamento di un relay Tor richieda un sistema affidabile e, per le uscite, un ISP di supporto, l'aggiunta di più relay aiuta la privacy e rende Tor più veloce con meno punti di guasto. diff --git a/docs/guides/update_versions.it.md b/docs/guides/update_versions.it.md new file mode 100644 index 0000000000..ad0544aad4 --- /dev/null +++ b/docs/guides/update_versions.it.md @@ -0,0 +1,191 @@ +--- +title: Aggiornamenti di versione supportati da Rocky +author: Steven Spencer +contributors: Ganna Zhyrnova +--- + +**OR** Come duplicare qualsiasi macchina Rocky. + +## Introduzione + +Fin dal primo giorno del progetto Rocky Linux, alcuni hanno chiesto: ==Come si fa ad aggiornare da CentOS 7 a Rocky 8, o da Rocky 8 a Rocky 9?== La risposta è sempre la stessa: **Il progetto non supporta gli aggiornamenti in-place di una major release a un'altra. È necessario reinstallare il sistema operativo per passare alla versione principale successiva.** Per essere chiari, questa **è** la risposta corretta. Questo documento consente agli utenti di passare da una major release alla successiva, utilizzando la procedura corretta supportata da Rocky per una nuova installazione. È possibile utilizzare questo metodo per ricostruire la stessa versione di Rocky Linux. Per esempio, installate 9.5 su una nuova 9.5 con tutti i pacchetti. + +!!! note "Avvertenze" + +``` +Anche con questa procedura, molte cose possono andare storte quando si passa da una versione precedente di un sistema operativo (OS) a una versione più recente dello stesso o di un altro OS. I programmi diventano obsoleti e vengono sostituiti dai manutentori con nomi di pacchetti completamente diversi, oppure i nomi non corrispondono da un sistema operativo all'altro. Inoltre, è bene conoscere i repository software della propria macchina e verificare che siano ancora funzionanti per il nuovo sistema operativo. Se si passa da una versione più vecchia a una più recente, assicurarsi che la CPU e gli altri requisiti della macchina corrispondano a quelli della nuova versione. Per queste e molte altre ragioni, è necessario essere prudenti e annotare eventuali errori o problemi durante l'esecuzione di questa procedura. L'autore ha utilizzato Rocky Linux 8 come vecchia versione e Rocky Linux 9 come nuova versione principale. La formulazione di tutti gli esempi utilizza queste due versioni. Potete sempre procedere a vostro rischio e pericolo. +``` + +## Sintesi degli step + +1. Ottenere un elenco di utenti dalla vecchia installazione (`userid.txt`). +2. Ottenere un elenco di repository dalla vecchia installazione (`repolist.txt`). +3. Ottenere un elenco dei pacchetti della vecchia installazione (`installed.txt`). +4. Eseguire il backup di tutti i dati, la configurazione, le utilità e gli script della vecchia installazione in una posizione non volatile, insieme ai file \`.txt' creati. +5. Verificare che l'hardware da installare supporti il sistema operativo che si sta installando. (CPU, memoria, spazio su disco e così via). +6. Eseguire una nuova installazione del sistema operativo utilizzato sull'hardware. +7. Eseguire un `dnf upgrade` per ottenere tutti i pacchetti che potrebbero essere stati aggiornati dopo la creazione del file ISO. +8. Creare gli utenti necessari esaminando il file `userid.txt`. +9. Installare tutti i repository mancanti che non sono legati a Rocky nel file `repolist.txt`. (Vedere le note per i repository EPEL e Code Ready Builder (CRB)). +10. Installare i pacchetti seguendo la procedura per il file `installed.txt`. + +## Step dettagliati + +!!! info “Aggiornamenti della stessa versione” + +``` +Come discusso in precedenza, questa procedura dovrebbe funzionare altrettanto bene per duplicare l'installazione di una macchina con la stessa release del sistema operativo, ad esempio da 8.10 a 8.10 o da 9.5 a 9.5. La differenza è che non dovrebbe essere necessario `-skip-broken' quando si installano i pacchetti dal file `installed.txt'. Se si verificano errori nei pacchetti durante l'installazione di una versione, probabilmente manca un repository. Fermare la procedura e riesaminare il file `repolist.txt`. Gli esempi qui riportati utilizzano la 8.10 come vecchia installazione e la 9.5 come nuova. +``` + +!!! warning "Rocky 10 non era stata rilasciata" + +``` +A causa dei numerosi cambiamenti tra la versione 9.5 e la prossima versione 10, questa procedura **potrebbe non funzionare** per passare dalla 9.5 alla 10. L'esplorazione di questo aspetto avverrà quando ci sarà una release della 10 da testare. +``` + +### Esempio di una vecchia macchina + +La vecchia macchina utilizzata è Rocky Linux 8. L'installazione include diversi pacchetti del repository Extra Packages for Enterprise Linux (EPEL). + +!!! info "Code Ready Builder" + +```` +Il repository Code Ready Builder (CRB) in Rocky Linux 9 sostituisce la funzionalità del repository PowerTools, ormai deprecato, che esisteva nella versione 8. Se si passa da una versione 8 alla 9 in cui è presente EPEL, è necessario abilitare il CRB sulla nuova macchina con la seguente procedura: + +```bash +sudo dnf config-manager --enable crb +```` + +#### Ottenere un elenco di utenti + +È necessario creare manualmente tutti gli utenti sul nuovo computer, quindi è necessario sapere quali account utente creare. Gli account utente partono generalmente dall'id utente 1000 e aumentano in seguito. + +```bash +sudo getent passwd > userid.txt +``` + +#### Ottenere un elenco di repository + +È necessario un elenco dei repository esistenti sulla vecchia macchina: + +```bash +sudo ls -al /etc/yum.repos.d/ > repolist.txt +``` + +#### Ottenere un elenco di pacchetti + +Generare l'elenco dei pacchetti con quanto segue: + +```bash +sudo dnf list installed | awk 'NR>1 {print $1}' | sort -u > installed.txt +``` + +In questo caso, `NR>1` elimina il record uno dalla colonna, che ha la dicitura “Installato”, ottenuta dal comando `dnf list installed`. Non è un pacchetto, quindi non se ne ha bisogno. L'opzione `{print $1}` significa che si usa solo la prima colonna. Nell'elenco non è necessario indicare la versione del pacchetto o il repository da cui proviene. + +Non è necessario installare alcun pacchetto relativo al kernel. Se si tralascia questo passaggio, non fa niente installarli di nuovo. È possibile rimuovere le linee del kernel con: + +```bash +sudo sed -i '/kernel/d' installed.txt +``` + +#### Backup di tutti i dati + +Questo può comprendere molte cose. Assicuratevi di conoscere lo scopo della macchina che state sostituendo e tutti i suoi componenti software (database, server di posta, DNS e altro). Se si ha dei dubbi, si faccia un backup. + +#### Copiare i file + +Copiare i file di testo creati in una posizione non volatile e tutti i dati di backup. + +### Esempio di nuova macchina + +La nuova installazione di Rocky Linux 9 è completa. È necessario ottenere tutti gli aggiornamenti dei pacchetti dalla creazione dell'immagine ISO: + +```bash +sudo dnf upgrade +``` + +Ora si è pronti per iniziare a copiare i file di testo e i backup da dove sono stati memorizzati nella procedura precedente. + +#### Creare gli utenti + +Esaminare il file `userid.txt` e creare gli utenti necessari sulla nuova macchina. + +#### Installare i repository + +Esaminare il file `repolist.txt` e installare manualmente i repository necessari. È possibile ignorare i repository legati a Rocky. Ricordate che si hanno pacchetti da EPEL, quindi si avrà bisogno del repository CRB piuttosto che di PowerTools: + +```bash +sudo dnf config-manager --enable crb +``` + +Installare l'EPEL: + +```bash +sudo dnf install epel-release +``` + +Installare qualsiasi altro repository dal file `repolist.txt` che non sia basato su Rocky o EPEL. + +#### Installare i packages + +Una volta completata l'installazione dei repository, si provi a installare i pacchetti da `installed.txt`: + +```bash +sudo dnf -y install $(cat installed.txt) +``` + +Alcuni pacchetti non esistono tra Rocky Linux 8 e Rocky Linux 9, indipendentemente dai repository abilitati. L'esecuzione di questo comando dà un'idea di quali siano questi pacchetti. + +Ecco cosa non si è installato sul computer di prova dell'autore (riorganizzato come una colonna anziché come una lunga stringa): + +```text +Error: Unable to find a match: +OpenEXR-libs.x86_64 +bind-export-libs.x86_64 +dhcp-libs.x86_64 +fontpackages-filesystem.noarch +hardlink.x86_64 +ilmbase.x86_64 +libXxf86misc.x86_64 +libcroco.x86_64 +libmcpp.x86_64 +libreport-filesystem.x86_64 +mcpp.x86_64 +network-scripts.x86_64 +platform-python.x86_64 +platform-python-pip.noarch +platform-python-setuptools.noarch +xorg-x11-font-utils.x86_64 +``` + +!!! note + +```` +Se si ha bisogno della funzionalità di questi pacchetti mancanti nella nuova installazione, salvarli in un file da usare in seguito. È possibile vedere lo stato di disponibilità dei pacchetti mancanti usando questo comando: + +```bash +sudo dnf whatprovides [nome_pacchetto] +``` +```` + +Eseguire nuovamente il comando, ma questa volta con l'aggiunta di \`-skip-broken': + +```bash +sudo dnf -y install $(cat installed.txt) --skip-broken +``` + +Poiché sono state apportate molte modifiche, è necessario riavviare prima di continuare. + +#### Ripristino dei backup + +Una volta installati tutti i pacchetti, ripristinare i backup, i file di configurazione modificati, gli script e le altre utilità di cui si è fatto il backup prima del trasferimento sulla nuova macchina. + +## Conclusione + +Non esiste una routine magica (supportata da Rocky Linux) per passare da una versione principale all'altra. Gli sviluppatori di Rocky Linux supportano solo una nuova installazione. La routine qui fornita consente di passare da una versione principale all'altra seguendo le migliori pratiche del team Rocky. + +Questa procedura presuppone un'installazione semplice. Tuttavia, se l'installazione è complessa, potrebbe essere necessario eseguire più passaggi. Questa procedura può essere utilizzata come guida. + +## Dichiarazione di non responsabilità + +Mentre il documento di base è dell'autore, due persone nel [Forum] (https://forums.rockylinux.org/t/boot-too-small-rebuild/17415) hanno suggerito un modo più pulito per generare il `installed.txt` e hanno eliminato i pacchetti del kernel. Grazie a tutti coloro che hanno fornito indicazioni su questa procedura. diff --git a/docs/guides/web/tor_onion_service.it.md b/docs/guides/web/tor_onion_service.it.md new file mode 100644 index 0000000000..cdbb42cbe9 --- /dev/null +++ b/docs/guides/web/tor_onion_service.it.md @@ -0,0 +1,107 @@ +--- +title: Servizio Tor Onion +author: Neel Chauhan +contributors: Ganna Zhrynova +tested_with: 9.3 +tags: + - web + - proxy + - proxies +--- + +# Servizio Tor Onion + +## Introduzione + +[Tor](https://www.torproject.org/) è un servizio e un software di anonimato che instrada il traffico attraverso tre server gestiti da volontari e chiamati relay. Il design a tre hop serve a garantire la privacy resistendo ai tentativi di sorveglianza. + +Una caratteristica di Tor è la possibilità di eseguire siti web nascosti, esclusivi di Tor, chiamati [onion services](https://community.torproject.org/onion-services/). Tutto il traffico verso un servizio onion è quindi privato e crittografato. + +## Prerequisiti e presupposti + +I requisiti minimi per l'utilizzo di questa procedura sono i seguenti: + +- La possibilità di eseguire comandi come utente root o di utilizzare `sudo` per elevare i privilegi +- Familiarità con un editor a riga di comando. L'autore utilizza `vi` o `vim`, ma è possibile sostituirli con il proprio editor preferito +- Un server web in esecuzione su localhost o su un'altra porta TCP/IP + +## Installare Tor + +Per installare Tor, è necessario prima installare EPEL (Extra Packages for Enterprise Linux) ed eseguire gli aggiornamenti: + +```bash +dnf -y install epel-release && dnf -y update +``` + +Quindi installare Tor: + +```bash +dnf -y install tor +``` + +## Configurare Tor + +Una volta installati i pacchetti, è necessario configurare Tor. L'autore usa `vi` per questo, ma se preferite `nano` o qualcos'altro, sostituitelo pure: + +```bash +vi /etc/tor/torrc +``` + +Il file `torrc` predefinito è abbastanza descrittivo, ma può diventare lungo se si vuole solo un servizio onion. Una configurazione minima del servizio onion è simile a questa: + +```bash +HiddenServiceDir /var/lib/tor/onion-site/ +HiddenServicePort 80 127.0.0.1:80 +``` + +### Osservare da più vicino + +- "HiddenServiceDir" è la posizione del nome host e delle chiavi crittografiche del servizio onion. Le chiavi sono memorizzate in `/var/lib/tor/onion-site/` +- La "HiddenServicePort" è l'inoltro della porta dal server locale al servizio onion. Si sta inoltrando 127.0.0.1:80 alla porta 80 del nostro servizio Tor + +!!! warning + +``` +Se si intende utilizzare una directory per le chiavi di firma del servizio onion al di fuori di `/var/lib/tor/`, è necessario assicurarsi che i permessi siano `0700` e che il proprietario sia `toranon:toranon`. +``` + +## Configurare un server web + +Avrete anche bisogno di un server web sulla nostra macchina per servire i clienti del vostro servizio onion. È possibile utilizzare qualsiasi server web (Caddy, Apache o Nginx). L'autore preferisce Caddy. Per semplicità, installare Caddy: + +```bash +dnf -y install caddy +``` + +Quindi, si inserisce quanto segue in `/etc/caddy/Caddyfile`: + +```bash +http:// { + root * /usr/share/caddy + file_server +} +``` + +## Test e avvio + +Una volta impostata la configurazione del relay Tor, il passo successivo è quello di attivare i demoni Tor e Caddy: + +```bash +systemctl enable --now tor caddy +``` + +È possibile ottenere il nome host del servizio onion con questo comando: + +```bash +cat /var/lib/tor/onion-site/hostname +``` + +Entro pochi minuti, il vostro servizio onion si propagherà attraverso la rete Tor e potrete visualizzare il vostro nuovo servizio onion nel browser Tor: + +![Tor Browser showing our Onion Service](../images/onion_service.png) + +## Conclusione + +I servizi onion sono uno strumento prezioso se si ospita un sito web privatamente o se si ha bisogno di bypassare il Carrier Grade NAT del proprio ISP utilizzando solo software open source. + +Sebbene i servizi onion non siano veloci come l'hosting diretto di un sito web (comprensibile a causa del design di Tor orientato alla privacy), sono molto più sicuri e privati rispetto all'Internet pubblico. diff --git a/docs/release_notes/8_10.de.md b/docs/release_notes/8_10.de.md index 23a2c37a42..368f47535f 100644 --- a/docs/release_notes/8_10.de.md +++ b/docs/release_notes/8_10.de.md @@ -79,7 +79,7 @@ Zu den wichtigsten Änderungen zählen Folgende: - Das Modul `container-tools:4.0` ist nun obsolet - Der Container Network Interface (CNI)-Netzwerkstapel ist veraltet und wird in einer zukünftigen Version entfernt -## Bekannte Probleme +## Bekannte Issues In Version 8.10 gibt es viele bekannte Probleme, darunter auch solche im Zusammenhang mit: @@ -101,7 +101,7 @@ In Version 8.10 gibt es viele bekannte Probleme, darunter auch solche im Zusamme Ausführliche Informationen zu diesen Problemen finden Sie in der [Upstream-Liste](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/8.10_release_notes/known-issues). -!!! info +!!! info "Info" ``` Einige Anwendungs-Streams, die Teil der Rocky Linux 8.10-Repositories sind, erhalten keine weiteren Updates. Denken Sie daran, alle Anwendungs-Streams zu notieren, die EOL oder veraltet sind, und aktualisieren Sie sie bei Bedarf auf neuere Streams. @@ -109,4 +109,4 @@ Einige Anwendungs-Streams, die Teil der Rocky Linux 8.10-Repositories sind, erha ## Fehler melden -Bitte melden Sie alle Fehler, auf die Sie gestoßen sind, dem [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Wir heißen Sie auch herzlich willkommen, unserer Community beizutreten, sei es in unseren [Foren](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC auf Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailinglisten](https://lists.resf.org), oder auf welche andere Art auch immer Sie teilnehmen möchten! +Bitte melden Sie alle Fehler, auf die Sie gestoßen sind, dem [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Wir heißen Sie auch herzlich willkommen, unserer Community beizutreten, sei es in unseren [Foren](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC auf Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailinglisten](https://lists.resf.org) oder auf welche andere Art auch immer Sie teilnehmen möchten! diff --git a/docs/release_notes/8_5.zh.md b/docs/release_notes/8_5.zh.md index 5027c0dd17..3753a6e744 100644 --- a/docs/release_notes/8_5.zh.md +++ b/docs/release_notes/8_5.zh.md @@ -82,7 +82,7 @@ SecureBoot enabled 在网络安装过程中,从 MirrorList 中托管 BaseOS 内容的镜像列表将被 FastestMirror DNF plugin ([源代码](https://github.com/rpm-software-management/yum-utils/blob/master/plugins/fastestmirror/fastestmirror.py))使用,按照其给定协议的端口上打开与镜像所需的连接时间进行试探性排序。 -这一变化的意思是说——在使用仅引导介质并执行基于网络安装的 Rocky (和其他 Enterprise) Linux 时,用户不再需要输入存储库URL。 +这一变化的意思是说——在使用仅引导介质并执行基于网络安装的 Rocky (和其他 Enterprise) Linux 时,用户不再需要输入存储库 URL ! ### 变更日志 diff --git a/docs/release_notes/8_7.zh.md b/docs/release_notes/8_7.zh.md index 96d145e030..f43520d7b7 100644 --- a/docs/release_notes/8_7.zh.md +++ b/docs/release_notes/8_7.zh.md @@ -131,4 +131,4 @@ tags: ## 报告 bug -请向 [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/) 报告您遇到的任何 bug。 我们也欢迎您以任何方式加入我们的社区,不管是在我们的 [Forums](https://forums.rockylinux.org)、[Mattermost](https://chat.rockylinux.org)、[IRC on Libera.Chat](irc://irc.liberachat/rockylinux)、[Reddit](https://reddit.com/r/rockylinux)、[Mailing Lists](https://lists.resf.org),还是其他任何您希望参与的方式。 +请向 [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/) 报告您遇到的任何 bug 。 我们也欢迎您以任何方式加入我们的社区,不管是在我们的 \[Forums\](https://forums.rockylinux.org)、\[Mattermost\](https://chat.rockylinux.org)、\[IRC on Libera.Chat\](irc://irc.liberachat/rockylinux)、\[Reddit\](https://reddit.com/r/rockylinux)、\[Mailing Lists\](https://lists.resf.org),还是其他任何您希望参与的方式! diff --git a/docs/release_notes/8_8.zh.md b/docs/release_notes/8_8.zh.md index a6c99e5fd2..ce874356b6 100644 --- a/docs/release_notes/8_8.zh.md +++ b/docs/release_notes/8_8.zh.md @@ -156,4 +156,4 @@ Oracle 云平台(OCP)、General Cloud、Amazon AWS (EC2)、Container RootFS/OCI ## 报告 bug -请向 [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/) 报告您遇到的任何 bug。 我们也欢迎您以任何方式加入我们的社区,不管是在我们的 [Forums](https://forums.rockylinux.org)、[Mattermost](https://chat.rockylinux.org)、[IRC on Libera.Chat](irc://irc.liberachat/rockylinux)、[Reddit](https://reddit.com/r/rockylinux)、[Mailing Lists](https://lists.resf.org),还是其他任何您希望参与的方式! +请向 [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/) 报告您遇到的任何 bug 。 我们也欢迎您以任何方式加入我们的社区,不管是在我们的 [Forums](https://forums.rockylinux.org)、[Mattermost](https://chat.rockylinux.org)、[IRC on Libera.Chat](irc://irc.liberachat/rockylinux)、[Reddit](https://reddit.com/r/rockylinux)、[Mailing Lists](https://lists.resf.org),还是其他任何您希望参与的方式! diff --git a/docs/release_notes/9_0.zh.md b/docs/release_notes/9_0.zh.md index f2e815b01e..5bbca3d6db 100644 --- a/docs/release_notes/9_0.zh.md +++ b/docs/release_notes/9_0.zh.md @@ -173,4 +173,4 @@ Rocky Linux 团队不建议从一个主版本升级到另一个主版本(比 ## 报告 bug -请向 [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/) 报告您遇到的任何 bug。 我们也欢迎您以任何方式加入我们的社区,不管是在我们的 [Forums](https://forums.rockylinux.org)、[Mattermost](https://chat.rockylinux.org)、[IRC on Libera.Chat](irc://irc.liberachat/rockylinux)、[Reddit](https://reddit.com/r/rockylinux)、[Mailing Lists](https://lists.resf.org),还是其他任何您希望参与的方式。 +请向 [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/) 报告您遇到的任何 bug 。 我们也欢迎您以任何方式加入我们的社区,不管是在我们的 \[Forums\](https://forums.rockylinux.org)、 \[Mattermost\](https://chat.rockylinux.org)、\[IRC on Libera.Chat\](irc://irc.liberachat/rockylinux)、 \[Reddit\](https://reddit.com/r/rockylinux)、\[Mailing Lists\](https://lists.resf.org),还是其他任何您希望参与的方式! diff --git a/docs/release_notes/9_1.zh.md b/docs/release_notes/9_1.zh.md index 61939545c2..90598f77e1 100644 --- a/docs/release_notes/9_1.zh.md +++ b/docs/release_notes/9_1.zh.md @@ -125,7 +125,7 @@ tags: ### 其他更改 * httpd 变基到版本 2.4.53 -* `httpd` 配置文件中的 `LimitRequestBody` 指令的新默认值 +* `httpd` 配置文件中 `LimitRequestBody` 指令的新默认值 * 新软件包:httpd-core * `pcre2` 变基到版本 10.40 @@ -178,5 +178,5 @@ tags: ## 报告 bug -请向 [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/) 报告您遇到的任何 bug。 我们也欢迎您以任何方式加入我们的社区,不管是在我们的 [Forums](https://forums.rockylinux.org)、[Mattermost](https://chat.rockylinux.org)、[IRC on Libera.Chat](irc://irc.liberachat/rockylinux)、[Reddit](https://reddit.com/r/rockylinux)、[Mailing Lists](https://lists.resf.org),还是其他任何您希望参与的方式。 +请向 [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/) 报告您遇到的任何 bug 。 我们也欢迎您以任何方式加入我们的社区,不管是在我们的 \[Forums\](https://forums.rockylinux.org)、 \[Mattermost\](https://chat.rockylinux.org)、\[IRC on Libera.Chat\](irc://irc.liberachat/rockylinux)、 \[Reddit\](https://reddit.com/r/rockylinux)、\[Mailing Lists\](https://lists.resf.org),还是其他任何您希望参与的方式! diff --git a/docs/release_notes/9_2.zh.md b/docs/release_notes/9_2.zh.md index 4390ab0ae0..8fdbf0df81 100644 --- a/docs/release_notes/9_2.zh.md +++ b/docs/release_notes/9_2.zh.md @@ -222,4 +222,4 @@ Vagrant 镜像可用于 x86_64 和 arch64,容器镜像可用于所有 4 arches ## 报告 bug -请向 [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/) 报告您遇到的任何 bug。 我们也欢迎您以任何方式加入我们的社区,不管是在我们的 [Forums](https://forums.rockylinux.org)、[Mattermost](https://chat.rockylinux.org)、[IRC on Libera.Chat](irc://irc.liberachat/rockylinux)、[Reddit](https://reddit.com/r/rockylinux)、[Mailing Lists](https://lists.resf.org),还是其他任何您希望参与的方式。 +请向 [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/) 报告您遇到的任何 bug 。 我们也欢迎您以任何方式加入我们的社区,不管是在我们的 \[Forums\](https://forums.rockylinux.org)、 \[Mattermost\](https://chat.rockylinux.org)、\[IRC on Libera.Chat\](irc://irc.liberachat/rockylinux)、 \[Reddit\](https://reddit.com/r/rockylinux)、\[Mailing Lists\](https://lists.resf.org),还是其他任何您希望参与的方式! diff --git a/docs/release_notes/9_4.zh.md b/docs/release_notes/9_4.zh.md index 1da72dd3ad..49ec95e614 100644 --- a/docs/release_notes/9_4.zh.md +++ b/docs/release_notes/9_4.zh.md @@ -14,7 +14,7 @@ tags: 您可以通过执行 `sudo dnf -y upgrade` 来完成从 Rocky Linux 9.x 到 Rocky Linux 9.4 的升级。 -!!! note "说明" +!!! Note "说明" ``` Rocky Linux 不提供任何 Rocky Linux 8 版本的升级途径。我们建议进行全新的操作系统安装以迁移到 Rocky Linux 9.4 。 @@ -158,4 +158,4 @@ Microsoft Azure 的 Rocky Linux 发布者帐户已更改,以前的镜像现在 ## 报告 bug -请将您遇到的任何错误报告给 [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/)。 我们也欢迎您以任何方式加入我们的社区,不管是在我们的 [Forums](https://forums.rockylinux.org)、 [Mattermost](https://chat.rockylinux.org)、[IRC on Libera.Chat](irc://irc.liberachat/rockylinux)、 [Reddit](https://reddit.com/r/rockylinux)、[Mailing Lists](https://lists.resf.org),还是其他任何您希望参与的方式! +请向 [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/) 报告您遇到的任何 bug。 我们也欢迎您以任何方式加入我们的社区,不管是在我们的 [Forums](https://forums.rockylinux.org)、 [Mattermost](https://chat.rockylinux.org)、[IRC on Libera.Chat](irc://irc.liberachat/rockylinux)、 [Reddit](https://reddit.com/r/rockylinux)、[Mailing Lists](https://lists.resf.org),还是其他任何您希望参与的方式! diff --git a/docs/release_notes/9_5.zh.md b/docs/release_notes/9_5.zh.md index d7b6d4578c..feb2d90d8e 100644 --- a/docs/release_notes/9_5.zh.md +++ b/docs/release_notes/9_5.zh.md @@ -14,7 +14,7 @@ tags: 您可以通过执行 `sudo dnf -y upgrade` 来完成从 Rocky Linux 9.x 到 Rocky Linux 9.5 的升级。 -!!! note "说明" +!!! Note "说明" ``` Rocky Linux 不提供任何 Rocky Linux 8 版本的升级途径。我们建议进行全新的操作系统安装以迁移到 Rocky Linux 9.5。 @@ -133,4 +133,4 @@ Podman 升级到了 v5.0,包括以下新功能: ## 报告 bug -请将您遇到的任何错误报告给 [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/)。 我们也欢迎您以任何方式加入我们的社区,不管是在我们的 [Forums](https://forums.rockylinux.org)、 [Mattermost](https://chat.rockylinux.org)、[IRC on Libera.Chat](irc://irc.liberachat/rockylinux)、 [Reddit](https://reddit.com/r/rockylinux)、[Mailing Lists](https://lists.resf.org),还是其他任何您希望参与的方式! +请向 [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/) 报告您遇到的任何 bug。 我们也欢迎您以任何方式加入我们的社区,不管是在我们的 [Forums](https://forums.rockylinux.org)、 [Mattermost](https://chat.rockylinux.org)、[IRC on Libera.Chat](irc://irc.liberachat/rockylinux)、 [Reddit](https://reddit.com/r/rockylinux)、[Mailing Lists](https://lists.resf.org),还是其他任何您希望参与的方式! diff --git a/docs/release_notes/9_6.de.md b/docs/release_notes/9_6.de.md index 95214ac705..fb6678fdf8 100644 --- a/docs/release_notes/9_6.de.md +++ b/docs/release_notes/9_6.de.md @@ -18,7 +18,7 @@ Sie können von Rocky Linux 9.x auf Rocky Linux 9.6 aktualisieren, indem Sie `su Rocky Linux bietet keinen Upgrade-Pfad von irgendeiner Version von Rocky Linux 8. Wir empfehlen eine Neuinstallation des Betriebssystems, um auf Rocky Linux 9.6 umzusteigen. -## ISO-Images +## Images Neben den Standardinstallationsimages stehen mehrere Images zur Verfügung, darunter auch solche für Cloud- und Containerplattformen. @@ -53,7 +53,7 @@ Um Rocky Linux 9.6 zu installieren, gehen Sie zur [Download-Seite](https://rocky ### Neu und bemerkenswert -## Wichtige Änderungen +## Wichtigste Änderungen Eine vollständige Liste der wichtigsten Änderungen finden Sie in der [Upstream-Liste hier](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html-single/9.6_release_notes/index#overview-major-changes). @@ -90,7 +90,7 @@ Leistungsüberwachungs-Tools aktualisiert: - **PCP 6.3.2** -Aktualisierte Compiler-Toolsets +Aktualisierte Compiler-Toolsets: - **LLVM Toolset 19.17** - **Rust Toolset 1.84.1** @@ -137,4 +137,4 @@ Wie bei jeder Version gibt es einige bekannte Issues. Vollständige Details zu d ## Fehler melden -Bitte melden Sie alle Fehler, auf die Sie gestoßen sind, dem [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Wir heißen Sie auch herzlich willkommen, unserer Community beizutreten, sei es in unseren [Foren](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC auf Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailinglisten](https://lists.resf.org), oder auf welche andere Art auch immer Sie teilnehmen möchten! +Bitte melden Sie alle Fehler, auf die Sie gestoßen sind, dem [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Wir heißen Sie auch herzlich willkommen, unserer Community beizutreten, sei es in unseren [Foren](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC auf Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailinglisten](https://lists.resf.org) oder auf welche andere Art auch immer Sie teilnehmen möchten! diff --git a/docs/release_notes/9_6.fr.md b/docs/release_notes/9_6.fr.md index 11cf9b1462..1a26a8a7fb 100644 --- a/docs/release_notes/9_6.fr.md +++ b/docs/release_notes/9_6.fr.md @@ -15,7 +15,7 @@ Vous trouverez une liste complète de la plupart des modifications dans les [not Vous pouvez effectuer une mise à niveau de Rocky Linux 9.x vers Rocky Linux 9.6 en exécutant
`sudo dnf -y upgrade`. -!!! note "Remarque" +!!! note "Remarque " Rocky Linux n'offre pas de possibilité de mise à niveau à partir d'une version quelconque de Rocky Linux 8. Nous recommandons de procéder à une nouvelle installation du système d'exploitation pour passer à Rocky Linux 9.6. @@ -50,11 +50,11 @@ Avant l'installation, [assurez-vous de la compatibilité de votre CPU avec cette Pour installer Rocky Linux 9.6, visitez la [page de téléchargement](https://rockylinux.org/download/) et téléchargez la version correspondant à votre architecture. -## L'équipe Rocky met en avant les points suivants +## Les Nouveautés Phares de Rocky -### Nouveau et notable +### Nouveautés -## Changements majeurs +## Changements Majeurs Pour une liste complète des changements majeurs, consultez la [liste en amont ici](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/overview#overview-major-changes). @@ -91,7 +91,7 @@ Outils de surveillance des performances mis à jour : - **PCP 6.3.2** -Ensembles d'outils de compilation mis à jour : +Outils de compilation mis à jour : - **LLVM Toolset 19.17** - **Rust Toolset 1.84.1** @@ -130,12 +130,12 @@ Arrêtez la mise à niveau et procédez comme suit avant de réessayer : sudo dnf swap gstreamer1-plugins-bad-freeworld-1:1.22.1-1.el9.x86_64 gstreamer1-plugins-bad-free-1.22.12-4.el9_6.x86_64 ``` -Comme pour toute version, il existe de nombreux problèmes connus. Consultez la [liste en amont](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/known-issues) pour obtenir tous les détails sur ces problèmes. +Comme pour toute version, il existe un certain nombre de problèmes connus. Consultez la [liste en amont](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/9.6_release_notes/known-issues) pour obtenir tous les détails sur ces problèmes. !!! info "Logiciels Obsolètes" Certains flux d'applications, inclus dans les dépôts Rocky Linux 9.6, ne recevront plus de mises à jour. Ce problème survient régulièrement avec presque toutes les versions. Assurez-vous d'utiliser la dernière version prise en charge du logiciel. -## Signaler des problèmes +## Signalement de problèmes -Merci de signaler tous les problèmes que vous rencontrez sur le [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Nous vous invitons également à rejoindre notre communauté de quelque manière que ce soit, que ce soit sur nos [Forums](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC on Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailing Lists](https://lists.resf.org), ou de toute autre manière que vous souhaiteriez utiliser ! +Veuillez signaler tout bug que vous rencontrez sur le [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Nous vous invitons également à rejoindre notre communauté, que ce soit sur nos [Forums](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC sur Libera.chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailing Lists](https://lists.resf.org) ou toute autre manière pour participer ! diff --git a/docs/release_notes/9_6.zh.md b/docs/release_notes/9_6.zh.md index f7ba923d29..c657cedba0 100644 --- a/docs/release_notes/9_6.zh.md +++ b/docs/release_notes/9_6.zh.md @@ -14,7 +14,7 @@ tags: 您可以通过执行 `sudo dnf -y upgrade` 来完成从 Rocky Linux 9.x 到 Rocky Linux 9.6 的升级。 -!!! note "说明" +!!! Note "说明" Rocky Linux 不提供任何 Rocky Linux 8 版本的升级途径。我们建议进行全新的操作系统安装以迁移到 Rocky Linux 9.6。 @@ -102,6 +102,8 @@ tags: OpenZFS 最新发布的 `zfs` 模块将 **不会在 Rocky Linux 9.6 上加载**。 对于那些在 9.5 上使用 `zfs` 并计划升级到 `9.6` 的人,建议暂时不要升级。 如果您计划重新安装 9.6 并再次使用 `zfs`,则应该等待更新版模块的发布。 您可以在 [这里](https://github.com/openzfs/zfs/issues/17332) 和 [这里](https://github.com/openzfs/zfs/issues/17364) 关注这个问题。 +**更新**:2.2.8 分支的更新 [解决了与 9.6 相关的问题](https://github.com/openzfs/zfs/releases)。 仍在等待 2.3 分支的更新。 + ### 在安装了 `passt` 的服务器、工作站或虚拟主机系统上触发 SELinux 问题 当使用安装了 `passt` 网络后端的工作站、服务器或虚拟主机时,若 SELinux 已经启用,则它们的网络接口将无法正常启动。 有关更多信息,请参阅 [此上游问题](https://issues.redhat.com/browse/RHEL-80407)。 @@ -135,4 +137,4 @@ OpenZFS 最新发布的 `zfs` 模块将 **不会在 Rocky Linux 9.6 上加载** ## 报告 bug -请将您遇到的任何错误报告给 [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/)。 我们也欢迎您以任何方式加入我们的社区,不管是在我们的 [Forums](https://forums.rockylinux.org)、 [Mattermost](https://chat.rockylinux.org)、[IRC on Libera.Chat](irc://irc.liberachat/rockylinux)、 [Reddit](https://reddit.com/r/rockylinux)、[Mailing Lists](https://lists.resf.org),还是其他任何您希望参与的方式! +请向 [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/) 报告您遇到的任何 bug。 我们也欢迎您以任何方式加入我们的社区,不管是在我们的 [Forums](https://forums.rockylinux.org)、 [Mattermost](https://chat.rockylinux.org)、[IRC on Libera.Chat](irc://irc.liberachat/rockylinux)、 [Reddit](https://reddit.com/r/rockylinux)、[Mailing Lists](https://lists.resf.org),还是其他任何您希望参与的方式! diff --git a/docs/rocky_insights/blogs/index.zh.md b/docs/rocky_insights/blogs/index.zh.md index 48722e5224..91d14e729a 100644 --- a/docs/rocky_insights/blogs/index.zh.md +++ b/docs/rocky_insights/blogs/index.zh.md @@ -12,7 +12,7 @@ contributors: 任何人只要有 GitHub 凭证都可以在此提交建议文章。 查看 [贡献部分](https://docs.rockylinux.org/guides/contribute/) 中的文档来开始吧。 -!!! note "注意" +!!! note "说明" ``` 如果您没有 GitHub 凭据,但仍想为此部分编写内容,请通过本页底部的 Mattermost 频道链接与我们联系。 From 10cefeb82bf25cdfdbc86cd971537f8de1b1dc1c Mon Sep 17 00:00:00 2001 From: tianci li <86754294+jimcat8@users.noreply.github.com> Date: Mon, 21 Jul 2025 21:38:14 +0800 Subject: [PATCH 073/164] Fix formatting issues with footnotes (endnotes) (#2794) --- docs/release_notes/10_0.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/release_notes/10_0.md b/docs/release_notes/10_0.md index 74e508254f..5d1c48a8cd 100644 --- a/docs/release_notes/10_0.md +++ b/docs/release_notes/10_0.md @@ -223,11 +223,11 @@ Replacement or removal of some of the services and packages in RL 10 include the | Removed | Replacement | | :---- | :---- | | power-profiles-daemon CPU throttle | tuned-ppd translation layer that supports applications written for the power-profiles-daemon | -| redis in-memory key-value database | valkey (a fork of redis) in-memory key-value database ^1 | +| redis in-memory key-value database | valkey[^1] in-memory key-value database | | sendmail mail transfer agent | Rocky Linux recommends migrating to the Postfix mail transfer agent. | | spamassassin email spam filter | The spamassassin email spam filter is now found in the EPEL repository. | -1 In addition to `valkey`, the `valkey-compat-redis` package is in the Plus repository. +[^1]: **valkey**: A fork of redis. 1 In addition to `valkey`, the `valkey-compat-redis` package is in the Plus repository. ### Dynamic Programming Languages From 0001fc40e31a636f5c27d9d9002ad282f90e49e9 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 21 Jul 2025 06:39:05 -0700 Subject: [PATCH 074/164] New Crowdin updates (#2795) * New translations good_docs.md (Chinese Simplified) * New translations aqc_bridge_vlan.md (Italian) * New translations package_debranding.md (Italian) * New translations custom-linux-kernel.md (Italian) * New translations package_dev_start.md (Italian) * New translations additional_software.md (French) --- docs/books/nvchad/additional_software.fr.md | 4 +- docs/guides/custom-linux-kernel.it.md | 341 +++++++++--------- docs/guides/hardware/aqc_bridge_vlan.it.md | 29 ++ .../package_debranding.it.md | 6 +- .../package_dev_start.it.md | 4 +- docs/rocky_insights/blogs/good_docs.zh.md | 88 +++++ 6 files changed, 303 insertions(+), 169 deletions(-) create mode 100644 docs/guides/hardware/aqc_bridge_vlan.it.md create mode 100644 docs/rocky_insights/blogs/good_docs.zh.md diff --git a/docs/books/nvchad/additional_software.fr.md b/docs/books/nvchad/additional_software.fr.md index 056f0be148..c3223418c3 100644 --- a/docs/books/nvchad/additional_software.fr.md +++ b/docs/books/nvchad/additional_software.fr.md @@ -1,5 +1,5 @@ --- -title: Logiciels supplémentaires +title: Logiciels Complémentaires author: Franco Colussi contributors: Steven Spencer, Ganna Zhyrnova tested_with: 8.7, 9.1 @@ -65,7 +65,7 @@ RipGrep est nécessaire pour des recherches récursives avec `:Telescope`. [LazyGit](https://github.com/jesseduffield/lazygit) est une interface de style `ncurses` qui vous permet d'effectuer toutes les opérations `git` de manière plus conviviale. C'est requis par le plugin ==lazygit.nvim==. Ce plugiciel permet d'utiliser `LazyGit` directement depuis `NvChad`, il ouvre une fenêtre flottante d'où vous pouvez effectuer toutes les opérations sur vos dépôts, vous permettant ainsi d'effectuer toutes les modifications sur le *dépôt git* sans quitter l'éditeur. -Pour l'installer, nous pouvons utiliser le référentiel de Fedora. Sous Rocky Linux 9, il fonctionne à merveille. +Pour l'installer, vous pouvez utiliser le référentiel de Fedora. Sous Rocky Linux 9, il fonctionne à merveille. ```bash sudo dnf copr enable atim/lazygit -y diff --git a/docs/guides/custom-linux-kernel.it.md b/docs/guides/custom-linux-kernel.it.md index e066c4f3f5..7f8dde71d5 100644 --- a/docs/guides/custom-linux-kernel.it.md +++ b/docs/guides/custom-linux-kernel.it.md @@ -8,7 +8,8 @@ tags: --- # Panoramica -In questa guida, illustreremo il processo di acquisizione di un albero dei sorgenti del kernel, la sua configurazione, la compilazione e, infine, l'installazione e l'avvio del kernel. + +In questa guida si illustra il processo di acquisizione di un albero dei sorgenti del kernel, la sua configurazione, la compilazione, l'installazione e l'avvio. !!! warning "Le ricostruzioni del kernel non sono consigliate né supportate per Rocky Linux. Prima di tentare di creare un kernel personalizzato, considerare quanto segue:" @@ -27,27 +28,25 @@ Linux è il kernel. Il kernel si trova letteralmente al centro della questione [ L'unica cosa più fondamentale del kernel è l'hardware del sistema stesso. Sebbene il kernel sia una piccola parte di una distribuzione Linux completa, è di gran lunga l'elemento più critico. Se il kernel si guasta o si blocca, il resto del sistema lo segue. - ## Il Codice Sorgente del Kernel -La distribuzione Rocky Linux ha a disposizione, in una forma o nell'altra, il codice sorgente per la versione specifica del kernel che supporta. Questi possono essere sotto forma di un binario compilato (*.src.rpm), un RPM sorgente (*.srpm) o simili. +La distribuzione Rocky Linux ha a disposizione, in una forma o nell'altra, il codice sorgente per la versione specifica del kernel che supporta. Questi possono essere sotto forma di un binario compilato`(*.src.rpm`), un RPM sorgente`(*.srpm`) e così via. -Se avete bisogno di scaricare una versione diversa (possibilmente più recente) rispetto a quella fornita dalla vostra specifica distro Rocky Linux, il primo posto dove cercare il codice sorgente è il sito web ufficiale del kernel: +Se avete bisogno di scaricare una versione diversa (possibilmente più recente) rispetto a quella fornita dalla vostra specifica distribuzione Rocky Linux, il primo posto dove cercare il codice sorgente è il sito web ufficiale del kernel: [www.kernel.org](https://www.kernel.org) -Questo sito mantiene un elenco di siti web che rispecchiano i sorgenti del kernel, oltre a tonnellate di altro software open-source, distribuzioni e utilità generiche. +Questo sito contiene un elenco di siti web che ospitano il codice sorgente del kernel e tantissimi altri software open source, distribuzioni e utilità generiche. -L'elenco dei mirror viene mantenuto all'indirizzo: +L'elenco dei mirror mantenuti è disponibile all'indirizzo: [mirrors.kernel.org](http://mirrors.kernel.org) - !!! TIP "Suggerimento" La maggior parte delle operazioni di download, configurazione e compilazione del kernel Linux descritte nelle sezioni seguenti possono/devono essere eseguite come utenti non privilegiati. Tuttavia, i passaggi finali che richiedono l'installazione o la modifica dei file di sistema e dei file binari devono essere eseguiti con privilegi elevati. - Siamo in grado di svolgere la maggior parte del lavoro come utente non privilegiato perché useremo una speciale opzione di compilazione del kernel, che ci permette di specificare una directory di lavoro o di output personalizzata. In particolare, useremo l'opzione `O=~/build/kernel` per tutte le invocazioni di make. + È possibile eseguire la maggior parte del lavoro come utente non privilegiato perché si utilizzerà un'opzione speciale di creazione del kernel, che consente di specificare una directory di lavoro o di output personalizzata. In particolare, si userà l'opzione `O=~/build/kernel` per tutte le invocazioni di make. Dove `~/build/kernel` è equivalente a `/home/$USER/build/kernel` o `$HOME/build/kernel` @@ -57,95 +56,87 @@ L'elenco dei kernel disponibili sul sito web conterrà cartelle per v1.0, v2.5, La convenzione attuale è quella di chiamare e numerare le nuove versioni principali del kernel come "Linux 5.x" (chiamate anche kernel vanilla o mainline). Pertanto, la prima di questa serie sarà la versione 5.0 di Linux (uguale alla 5.0.0), la successiva sarà la versione 5.1 di Linux (uguale alla 5.1.0), seguita dalla versione 5.2 e così via. -Eventuali modifiche o aggiornamenti minori all'interno di ciascuna versione della major release si rifletteranno con incrementi alla terza cifra. Questi vengono comunemente chiamati rilasci di punti stabili. Pertanto, la prossima release stabile per il kernel della serie 5.0.0 sarà la versione 5.0.1 di Linux, seguita dalla versione 5.0.2 e così via. Un altro modo per affermare ciò è dire, ad esempio, che la versione 5.0.4 di Linux è la quarta release stabile basata sulla serie 5.0.0 di Linux. +La terza cifra rappresenta le modifiche o gli aggiornamenti minori all'interno di ogni versione principale. Questi vengono comunemente chiamati rilasci di punti stabili. Pertanto, la prossima release stabile per il kernel della serie 5.0.0 sarà la versione 5.0.1 di Linux, seguita dalla versione 5.0.2 e così via. Un altro modo per affermare ciò è dire, ad esempio, che la versione 5.0.4 di Linux è la quarta release stabile basata sulla serie 5.0.0 di Linux. ## Installare gli strumenti e le librerie richieste -Una fonte comune di fallimento riscontrata durante il processo di creazione del kernel può essere causata dalla mancanza di tutto il software necessario per la compilazione e la creazione del Kernel Linux mainline. Gli strumenti e le librerie mancanti possono essere installate utilizzando il gestore di pacchetti DNF su una distro Rocky Linux. Ce ne occuperemo in questa sezione. +Non avere a disposizione tutto il software necessario per la compilazione e la costruzione del kernel Linux mainline è una fonte comune di fallimento riscontrata durante il processo di creazione del kernel. È possibile installare gli strumenti e le librerie mancanti con il gestore di pacchetti DNF su una distribuzione Rocky Linux. Potete occuparvene qui. -1. Su una distro Rocky Linux, è possibile installare rapidamente la maggior parte degli strumenti di sviluppo necessari eseguendo questo comando: +1. Su una distribuzione Rocky Linux, è possibile installare rapidamente la maggior parte degli strumenti di sviluppo necessari eseguendo questo comando: - ``` - > sudo dnf -y groupinstall 'C Development Tools and Libraries' + ```bash + sudo dnf -y groupinstall 'Development Tools' ``` - Se si ottiene l'errore "Il modulo o il gruppo 'C Development Tools and Libraries' is not available", il comando seguente è equivalente a quello precedente: +2. Installando i seguenti pacchetti, si otterranno le altre librerie, i file header e le applicazioni necessarie. Digitare: - ``` - > sudo dnf -y groupinstall 'Development Tools' + ```bash + sudo dnf -y install ncurses-devel openssl-devel elfutils-libelf-devel python3 ``` -2. Alcune altre librerie, file di intestazione e applicazioni possono essere ottenute installando i seguenti pacchetti. Digita: +3. Sono necessarie altre utility disponibili solo in repository speciali. Uno di questi è il repository CRB (Code Ready Builder). Abilitare il repository sul nostro sistema Rocky con: - ``` - > sudo dnf -y install \ - ncurses-devel openssl-devel elfutils-libelf-devel python3 + ```bash + sudo dnf config-manager --set-enabled crb ``` -3. Successivamente, abbiamo bisogno di altre utility disponibili solo in alcuni repository di terze parti supportati. Uno di questi repository è quello di Powertools. Abilitiamo questa repo sul nostro sistema Rocky. Digita: +4. Infine, installare uno dei pacchetti necessari dal repository CRB con: - ``` - > sudo dnf config-manager --set-enabled powertools + ```bash + sudo dnf -y install dwarves ``` -4. Infine, installiamo uno dei pacchetti necessari dal repo di Powertool. Digita: +Questo è tutto per quanto riguarda i pacchetti di prerequisiti necessari per la creazione del kernel. - ``` - > sudo dnf -y install dwarves - ``` - -Questo è tutto per quanto riguarda i pacchetti richiesti necessari per la costruzione del Kernel! +## Scaricare e scompattare il kernel Linux -## Scaricare e decomprimere il Kernel Linux - -La versione del kernel che verrà costruita nella sezione seguente è la versione 6.5.7, disponibile all'indirizzo: +La versione del kernel che si costruirà nella sezione seguente è la versione **6.5.7**, disponibile all'indirizzo: [www.kernel.org/pub/linux/kernel/v6.x/linux-6.5.7.tar.xz](https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.5.7.tar.xz) Iniziamo il processo. -1. Per prima cosa, scaricare i sorgenti del kernel nella directory di lavoro corrente usando il seguente comando curl. Digita: +1. Per prima cosa, scaricare i sorgenti del kernel nella directory di lavoro corrente usando il seguente comando `curl`. Digitare: - ``` + ```bash curl -L -o linux-6.5.7.tar.xz \ https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.5.7.tar.xz ``` -2. L'origine del kernel che si scarica da Internet è un file compresso con tar. Pertanto, per utilizzare il sorgente, è necessario decomprimere e scompattare il file sorgente. +2. Il sorgente del kernel scaricata da Internet è un file compresso, tar file. Pertanto, per utilizzare il file sorgente è necessario decomprimerlo ed estrarlo. - Assicurarsi di trovarsi nella directory in cui è stato scaricato il tarball del Kernel. Utilizzare il comando tar per decomprimere il file, eseguendo: + Assicurarsi di trovarsi nella directory contenente il download del tarball del kernel. Utilizzare il comando `tar` per decomprimere il file, eseguendo: - ``` - tar xvJf linux-5.*.tar.xz + ```bash + tar xvJf linux-6.*.tar.xz ``` -## Costruire il Kernel +## Compilare il Kernel -In questa sezione esamineremo il processo di configurazione e costruzione di un kernel. Ciò è in contrasto con i sistemi operativi basati su macOS o Windows, che vengono forniti preconfigurati e quindi contengono il supporto per molte funzioni che si possono o meno desiderare. +In questa sezione si analizzerà il processo di configurazione e compilazione di un kernel. Ciò è in contrasto con i sistemi operativi basati su macOS o Windows, che vengono forniti preconfigurati e quindi contengono il supporto per molte funzioni che si possono o meno desiderare. La filosofia di progettazione di Linux permette all'individuo di decidere le parti importanti del kernel. Questa progettazione personalizzata ha l'importante vantaggio di permettere di ridurre l'elenco delle funzionalità in modo che Linux possa funzionare nel modo più efficiente possibile. Questo è anche uno dei motivi per cui è possibile personalizzare Linux per farlo funzionare in diverse configurazioni hardware, dai sistemi di fascia bassa, ai sistemi embedded, ai sistemi di fascia alta. -Per costruire un kernel sono richieste due fasi principali: +La creazione del kernel richiede due fasi principali: - configurazione - compilazione -Il primo passo nella costruzione del kernel è la configurazione delle sue caratteristiche. Di solito, l'elenco delle funzionalità desiderate si basa sull'hardware da supportare. Questo, ovviamente, significa che è necessario un elenco dell'hardware. +Il primo passo nella costruzione del kernel è la configurazione delle sue caratteristiche. Di solito, l'elenco delle funzionalità si basa sull'hardware da supportare. Ciò significa che è necessario un elenco dell'hardware. -Su un sistema che esegue già Linux, è possibile eseguire comandi come lspci, lshw e così via per visualizzare informazioni dettagliate sull'esatta configurazione hardware del sistema. Nelle distro basate su RPM queste utilità sono fornite dai pacchetti pciutils*.rpm e lshw*.rpm. +Su un sistema che esegue già Linux, è possibile eseguire comandi come – `lspci`, `lshw`, e così via, per visualizzare informazioni dettagliate sull'esatta configurazione hardware del sistema. Queste utilità provengono dai pacchetti `pciutils*.rpm` e `lshw*.rpm` sulle distribuzioni basate su RPM. Una migliore comprensione di ciò che costituisce l'hardware sottostante può aiutare a determinare meglio ciò di cui si ha bisogno nel kernel personalizzato. Si è pronti per iniziare a configurare il kernel. ### Sanificazione dell'ambiente di compilazione -Possiamo iniziare la configurazione vera e propria con un'idea approssimativa dei tipi di hardware e delle caratteristiche che il nostro nuovo kernel deve supportare. Ma prima, alcune informazioni di base. +È possibile iniziare la configurazione vera e propria con un'idea approssimativa dei tipi di hardware e delle caratteristiche che il nuovo kernel deve supportare. Ma prima, alcune informazioni di base. -L'albero dei sorgenti del kernel Linux contiene diversi file denominati Makefile (un makefile è semplicemente un file di testo con delle direttive e descrive anche le relazioni tra i file di un programma). - -Questi makefile aiutano a incollare insieme le migliaia di altri file che compongono il sorgente del kernel. Ciò che è più importante per noi è che i file make contengono anche i target. I target sono i comandi, o direttive, che vengono eseguiti dal programma make. +L'albero dei sorgenti del kernel Linux contiene diversi file denominati **Makefile** (un makefile è semplicemente un file di testo con delle direttive e descrive anche le relazioni tra i file di un programma). +Questi file make aiutano a incollare insieme le migliaia di altri file che compongono il sorgente del kernel. Ciò che è più importante per noi è che i file make contengono anche i target. I target sono i comandi, o direttive, che vengono eseguiti dal programma make. !!! warning "Avviso: Evitare inutili aggiornamenti del Kernel" @@ -156,69 +147,95 @@ Questi makefile aiutano a incollare insieme le migliaia di altri file che compon Nel caso di una correzione di sicurezza, decidete se il rischio vi riguarda davvero: ad esempio, se il problema di sicurezza è stato riscontrato in un driver di periferica che non utilizzate, potrebbe non esserci motivo di aggiornare. Nel caso di un rilascio con correzione di bug, leggete attentamente le note di rilascio e decidete se i bug vi riguardano davvero: se avete un sistema stabile, aggiornare il kernel con patch che non usate mai potrebbe essere inutile. - Sui sistemi di produzione, il kernel non dovrebbe essere aggiornato solo per avere "l'ultimo kernel"; si dovrebbe avere un motivo davvero convincente per aggiornarlo. + Sui sistemi di produzione, il kernel non dovrebbe essere aggiornato solo per avere "l'ultimo kernel"; si dovrebbe avere un motivo veramente convincente per aggiornarlo. + +Il Makefile nella radice dell'albero dei sorgenti del kernel contiene obiettivi specifici utilizzati per preparare l'ambiente di compilazione del kernel, configurare il kernel, compilare il kernel, installare il kernel e così via. Alcuni dettagli aggiuntivi su questi obiettivi sono: + +`make mrproper` +: + +Questo obiettivo ripulisce l'ambiente di compilazione da tutti i file e le dipendenze obsolete che potrebbero essere rimaste da una precedente compilazione del kernel. Pulisce (cancella) tutte le configurazioni precedenti del kernel dall'ambiente di creazione. + +`make clean` +: + +Questo obiettivo non svolge un lavoro così approfondito come l'obiettivo mrproper. Elimina solo la maggior parte dei file generati. Non cancella il file di configurazione del kernel (`.config`). + +`make menuconfig` +: + +Questo obiettivo richiama un'interfaccia di editor basata sul testo con menu, elenchi di opzioni e finestre di dialogo basate sul testo per la configurazione del kernel. + +`make xconfig` +: + +Questo strumento/target di configurazione del kernel basato su interfaccia grafica si basa sulle librerie di sviluppo grafico Qt. Le applicazioni basate su KDE/Plasma utilizzano queste librerie. + +`make gconfig` +: + +Anche questo è uno strumento/target di configurazione del kernel basato su GUI, ma si basa sul toolkit GTK+. Questo toolkit GTK+ è molto utilizzato nel mondo desktop GNOME. + +`make olddefconfig` +: -Il Makefile nella radice dell'albero dei sorgenti del kernel contiene obiettivi specifici che possono essere usati per preparare l'ambiente di compilazione del kernel, configurare il kernel, compilare il kernel, installare il kernel e così via. Alcuni degli obiettivi sono discussi in dettaglio qui: +Questo obiettivo utilizza il file .config esistente nella directory di lavoro corrente, aggiorna le dipendenze e imposta automaticamente i nuovi simboli ai valori predefiniti. -- **make mrproper**Questo obiettivo pulisce l'ambiente di compilazione da tutti i file e le dipendenze obsolete che potrebbero essere rimaste da una precedente compilazione del kernel. Tutte le configurazioni precedenti del kernel saranno pulite (eliminate) dall'ambiente di compilazione. -- **make clean**Questo target non fa un lavoro così accurato come il target mrproper. Elimina solo la maggior parte dei file generati. Non elimina il file di configurazione del kernel (.config). -- **make menuconfig**Questo obiettivo richiama un'interfaccia di editor basata sul testo con menu, elenchi di opzioni e finestre di dialogo basate sul testo per la configurazione del kernel. -- **make xconfig**È uno strumento/target di configurazione del kernel basato su interfaccia grafica che si basa sulle librerie di sviluppo grafico Qt. Queste librerie sono utilizzate dalle applicazioni basate su KDE/Plasma. -- **make gconfig**Anche questo è uno strumento/target di configurazione del kernel basato sulla GUI, ma si basa sul toolkit GTK+. Questo toolkit GTK è molto utilizzato nel mondo desktop di GNOME. -- **make olddefconfig**Questo obiettivo utilizza il file .config esistente nella directory di lavoro corrente, aggiorna le dipendenze e imposta automaticamente i nuovi simboli ai valori predefiniti. -- **make help**Questo obiettivo mostra tutti gli altri possibili obiettivi di make e funge anche da rapido sistema di guida in linea. +`make help` +: -In questa sezione utilizzeremo solo uno dei target per configurare il kernel. In particolare, utilizzeremo il comando make menuconfig. L'editor di configurazione del kernel menuconfig è una semplice e popolare utilità di configurazione basata sul testo che consiste in menu, elenchi di pulsanti e finestre di dialogo. +Questo obiettivo mostrerà tutti i possibili obiettivi e servirà come un rapido sistema di aiuto online. + +In questa sezione si utilizzerà solo uno dei target per configurare il kernel. In particolare, si utilizzerà il comando make `menuconfig`. L'editor di configurazione del kernel `menuconfig` è una semplice e popolare utility di configurazione basata sul testo e composta da menu, elenchi di pulsanti e finestre di dialogo. Ha un'interfaccia semplice e pulita che può essere facilmente navigata con la tastiera ed è abbastanza intuitiva da usare. -Dobbiamo navigare (cd) nella directory dei sorgenti del kernel, dopodiché possiamo iniziare la configurazione del kernel. Ma prima di iniziare la configurazione vera e propria del kernel, è necessario pulire (preparare) l'ambiente di compilazione del kernel usando il comando make mrproper: +È necessario cambiare(`cd`) nella directory dei sorgenti del kernel e poi si può iniziare la configurazione del kernel. Prima di iniziare la configurazione effettiva del kernel, è necessario pulire (preparare) l'ambiente di compilazione del kernel usando il comando `make mrproper`: -``` -> cd linux-5.* -> make O=~/build/kernel mrproper +```bash +cd linux-6.*/ +make O=~/build/kernel mrproper ``` ### Configurazione del Kernel -Successivamente, verrà illustrato il processo di configurazione di un kernel Linux serie 5.*. Per esplorare alcuni dei meccanismi interni di questo processo, abiliteremo il supporto di una funzione specifica che fingeremo essere una caratteristica indispensabile del sistema. Una volta capito come funziona, si può applicare la stessa procedura per aggiungere il supporto a qualsiasi nuova funzionalità del kernel. In particolare, abiliteremo il supporto per il file system NTFS nel nostro kernel personalizzato. +Successivamente, si inizierà a configurare un kernel Linux della serie 6.*. Per esplorare alcuni aspetti interni di questo processo, si abilita il supporto di una funzione specifica che si finge sia una caratteristica indispensabile per il sistema. Una volta capito come funziona, si può applicare la stessa procedura per aggiungere il supporto a qualsiasi nuova funzionalità del kernel. In particolare, dovrete abilitare il supporto per il file system NTFS nel nostro kernel personalizzato. -La maggior parte delle moderne distro Linux viene fornita con un file di configurazione del kernel in esecuzione, disponibile sul file system locale come file compresso o normale. Nel nostro sistema Rocky di esempio, questo file risiede nella directory /boot e di solito ha un nome simile a config-*. +La maggior parte delle moderne distribuzioni di Linux contiene un file di configurazione del kernel in esecuzione, disponibile sul file system locale come file compresso o normale. Nel sistema Rocky di esempio, questo file risiede nella directory `/boot` e di solito ha un nome simile a `config-*`. -Il file di configurazione contiene un elenco delle opzioni e delle caratteristiche abilitate per il particolare kernel che rappresenta. Un file di configurazione simile a questo è quello che si vuole creare durante il processo di configurazione del kernel. L'unica differenza tra il file che creeremo e quello già pronto è che aggiungeremo ulteriori piccole personalizzazioni al nostro. +The configuration file contains a list of the options and features enabled for the particular kernel it represents. L'obiettivo è creare un file di configurazione simile a questo attraverso il processo di configurazione del kernel. L'unica differenza tra il file che creerete e quello già pronto è che aggiungerete ulteriori piccole personalizzazioni al vostro. +!!! TIP -!!! TIP "Suggerimento" + L'uso di un file di configurazione noto e preesistente come quadro di riferimento per la creazione del proprio file personalizzato aiuta a non perdere troppo tempo a duplicare gli sforzi che altri hanno già fatto per trovare ciò che funziona e ciò che non funziona. - L'utilizzo di un file di configurazione noto e preesistente come quadro di riferimento per la creazione del nostro file personalizzato ci permette di non perdere troppo tempo a duplicare gli sforzi che altre persone hanno già fatto per trovare ciò che funziona e ciò che non funziona! +I passi seguenti spiegano come configurare il kernel. Si utilizzerà un'utilità di configurazione del kernel basata su testo. È possibile seguire la procedura nel terminale, indipendentemente dal fatto che si utilizzi o meno un ambiente desktop con interfaccia grafica. -I passi seguenti spiegano come configurare il kernel. Utilizzeremo un'utilità di configurazione del kernel basata sul testo, che vi consentirà di seguire la procedura nel vostro terminale, indipendentemente dal fatto che utilizziate o meno un ambiente desktop con interfaccia grafica. +1. Per iniziare, si copierà e rinominerà il file di configurazione preesistente dalla directory `/boot` nell'ambiente di creazione del kernel: -1. Per iniziare, copiamo e rinominiamo il file di configurazione preesistente dalla directory /boot nel nostro ambiente di creazione del kernel: - ``` - > cp /boot/config-`uname -r` ~/build/kernel/.config + ```bash + cp /boot/config-`uname -r` ~/build/kernel/.config ``` - Utilizziamo `uname -r` per ottenere il file di configurazione del kernel in esecuzione. Il comando uname -r stampa la release del kernel in esecuzione. L'utilizzo di questa funzione ci consente di assicurarci di ottenere la versione esatta che desideriamo, nel caso in cui siano presenti altre versioni. - !!! NOTE "Nota" + Utilizziamo `uname -r` per ottenere il file di configurazione del kernel in esecuzione. Il comando `uname -r` stampa la release del kernel in esecuzione. L'utilizzo di questa funzione consente di assicurarsi di ottenere la versione esatta desiderata, nel caso in cui siano presenti altre versioni. - L'editor di configurazione del kernel Linux inizia cercando e generando esplicitamente un file chiamato .config (pronunciato "dot config") alla radice dell'albero dei sorgenti del kernel. Questo file è nascosto. + !!! NOTE + + L'editor di configurazione del kernel Linux inizia a cercare e generare esplicitamente un file chiamato `.config` (pronunciato "dot config") alla radice dell'albero dei sorgenti del kernel. Questo file è nascosto. 2. Avviare l'utilità di configurazione grafica del kernel: - ``` - > make O=~/build/kernel menuconfig + ```bash + make O=~/build/kernel menuconfig ``` Verrà visualizzata una schermata simile a questa: -![Schermata principale di Configurazione del Kernel](images/Il01-kernel.png) + ![Main Kernel Configuration screen](images/Il01-kernel.png) - La schermata di configurazione del kernel che appare è suddivisa in circa tre aree. - La parte superiore mostra varie informazioni utili, scorciatoie da tastiera e legende che possono aiutare a navigare nell'applicazione. - Il corpo principale della schermata mostra un elenco espandibile a struttura ad albero delle opzioni del kernel complessivamente configurabili. È possibile approfondire le voci con le frecce nel genitore per visualizzare e/o configurare le voci dei sottomenu (o figli). Infine, nella parte inferiore dello schermo vengono visualizzate le azioni/opzioni che l'utente può scegliere. + Nella schermata di configurazione del kernel vengono visualizzate circa tre aree. La parte superiore mostra informazioni utili, scorciatoie da tastiera e legende che aiutano a navigare nell'applicazione. Il corpo principale della schermata mostra un elenco espandibile a struttura ad albero delle opzioni del kernel complessivamente configurabili. È possibile approfondire le voci con le frecce nel genitore per visualizzare o configurare le voci dei sottomenu (o figli). Infine, nella parte inferiore della schermata vengono visualizzate le azioni o le opzioni che l'utente può selezionare. -3. Successivamente, aggiungeremo il supporto per NTFS nel nostro kernel personalizzato a scopo dimostrativo. +3. Successivamente, si aggiungerà il supporto per NTFS in questo kernel personalizzato a scopo dimostrativo. Nella schermata di configurazione principale, utilizzare i tasti freccia per spostarsi ed evidenziare la voce File system. Una volta selezionato File system, premere Invio per visualizzare il menu secondario o le voci secondarie di File system. @@ -226,39 +243,39 @@ I passi seguenti spiegano come configurare il kernel. Utilizzeremo un'utilità d 4. Nella sezione Filesystem DOS/FAT/NT, passare al supporto del file system NTFS. - Digitare M (maiuscolo) per abilitare i moduli al supporto del file system NTFS. + Digitare ++“M ”++ (maiuscolo) per abilitare i moduli al supporto del file system NTFS. - Utilizzare i tasti freccia per spostarsi verso il basso fino al supporto del debug NTFS (NEW) e premere y per includerlo. + Utilizzare i tasti freccia per spostarsi verso il basso fino al supporto del debug NTFS (NUOVO) e premere y per includerlo. - Utilizzare i tasti freccia per spostarsi verso il basso fino al supporto di scrittura NTFS e premere y per includerlo. Al termine, accanto a ogni opzione dovrebbe comparire la lettera M o il simbolo dell'asterisco (*), come quelli mostrati qui: + Utilizzate i tasti freccia per spostarvi verso il basso fino al supporto di scrittura NTFS e premete ++y++ per includerlo. Al termine, accanto a ogni opzione dovrebbe comparire la lettera `M` o il simbolo dell'asterisco (`*`), come quelli mostrati qui: - ![Schermata Configurazione del Kernel File Systems](images/Il02-kernel.png) + ![Kernel Configuration File Systems screen](images/Il02-kernel.png) !!! TIP "Suggerimento" - Per ciascuna delle opzioni configurabili, nell'utilità di configurazione del kernel, le parentesi angolari vuote, <>, indicano che la funzione in questione è disabilitata. La lettera M tra parentesi angolari, , indica che la funzione deve essere compilata come modulo. + Per ciascuna delle opzioni configurabili, nell'utilità di configurazione del kernel, le parentesi angolari vuote, <>, indicano che la funzione in questione è disabilitata. La lettera `M' tra parentesi angolari, , indica che la funzione deve essere compilata come modulo. Il simbolo dell'asterisco tra parentesi angolari, <*>, indica che il supporto per la funzione sarà integrato direttamente nel kernel. Di solito è possibile scorrere tutte le opzioni possibili utilizzando la barra spaziatrice della tastiera. -5. Tornare alla schermata principale dei sistemi di file premendo due volte il tasto esc sulla tastiera nella schermata dei Filesystems DOS/FAT/NT. Tornare alla schermata principale di configurazione del kernel premendo nuovamente esc due volte sulla tastiera. +5. Per tornare alla schermata principale dei File Systems, premere due volte il tasto ++esc++ sulla tastiera nella schermata dei File Systems DOS/FAT/NT. Tornare alla schermata principale di configurazione del kernel premendo nuovamente due volte ++esc++ sulla tastiera. -6. Infine, salvare le modifiche nel file .config nella radice dell'albero dei sorgenti del kernel e uscire dall'applicazione di configurazione del kernel dopo aver salvato il file premendo di nuovo esc due volte sulla tastiera. +6. Infine, salvare le modifiche nel file `.config` nella radice dell'albero dei sorgenti del kernel e uscire dall'applicazione di configurazione del kernel dopo aver salvato il file premendo di nuovo due volte ++esc++ sulla tastiera. -7. Viene visualizzata una finestra di dialogo che richiede di salvare la nuova configurazione. Assicurarsi che sia selezionato Yes e premere Invio. +7. Viene visualizzata una finestra di dialogo che richiede di salvare la nuova configurazione. Assicurarsi che la selezione sia "Yes" e premere invio. -8. Dopo l'uscita dell'utilità di configurazione del kernel, si tornerà alla propria shell, all'interno dell'albero dei sorgenti del kernel. Siete quasi pronti a costruire il vostro kernel! +8. Dopo l'uscita dall'utilità di configurazione del kernel, si tornerà alla propria shell, all'interno dell'albero dei sorgenti del kernel. Siete quasi pronti a costruire il vostro kernel. -9. Dobbiamo completare alcune personalizzazioni sulla nostra distro Rocky. Digita: +9. È necessario completare alcune personalizzazioni sulla nostra distribuzione Rocky. Digitare: - ``` + ```bash sed -ri '/CONFIG_SYSTEM_TRUSTED_KEYS/s/=.+/=""/g' ~/build/kernel/.config ``` !!! TIP "Suggerimento" - Per visualizzare i risultati di alcune delle modifiche apportate con lo strumento menuconfig, usare l'utilità grep per visualizzare direttamente il file .config salvato. Ad esempio, per visualizzare l'effetto del supporto del file system NTFS attivato in precedenza, digitate quanto segue: + Per visualizzare i risultati di alcune delle modifiche apportate con lo strumento menuconfig, usare l'utilità grep per visualizzare il file `.config` salvato direttamente. Ad esempio, per visualizzare l'effetto del supporto del file system NTFS precedentemente attivato, digitate quanto segue: ``` - > grep NTFS ~/build/kernel/.config + $ grep NTFS ~/build/kernel/.config CONFIG_NTFS_FS=m CONFIG_NTFS_DEBUG=y CONFIG_NTFS_RW=y @@ -266,67 +283,67 @@ I passi seguenti spiegano come configurare il kernel. Utilizzeremo un'utilità d !!! NOTE "Una nota veloce sui Moduli del kernel" - Il supporto per i moduli caricabili è una caratteristica del kernel Linux che consente il caricamento (o la rimozione) dinamica dei moduli del kernel. + Il supporto dei moduli caricabili è una caratteristica del kernel Linux che consente il caricamento (o la rimozione) dinamica dei moduli del kernel. - I moduli del kernel sono pezzi di codice compilato che possono essere inseriti dinamicamente nel kernel in esecuzione, anziché essere integrati in modo permanente nel kernel. Le funzioni non utilizzate di frequente possono quindi essere abilitate, ma non occuperanno spazio nella memoria quando non vengono utilizzate. + I moduli del kernel sono pezzi di codice compilato che possono essere inseriti dinamicamente nel kernel in esecuzione, anziché essere integrati in modo permanente nel kernel. In questo modo è possibile attivare le funzioni non utilizzate di frequente, che non occuperanno spazio nella memoria quando non vengono utilizzate. Fortunatamente, il Kernel Linux è in grado di determinare automaticamente cosa caricare e quando. Naturalmente, non tutte le funzioni possono essere compilate come moduli. Il kernel deve sapere alcune cose prima di poter caricare e scaricare i moduli, ad esempio come accedere al disco rigido e analizzare il file system in cui sono memorizzati i moduli caricabili. Alcuni moduli del kernel vengono comunemente chiamati anche driver. ### Compilazione del Kernel -Nella sezione precedente abbiamo illustrato il processo di creazione di un file di configurazione per il kernel personalizzato che vogliamo costruire. In questa sezione si eseguirà la compilazione vera e propria del kernel. Ma prima di fare questo, aggiungeremo una personalizzazione più semplice all'intero processo. +In the preceding section, you walked through the process of creating a configuration file for the custom kernel that you want to build. In questa sezione si eseguirà la compilazione vera e propria del kernel. Ma prima di fare questo, aggiungerete una semplice personalizzazione all'intero processo. -La personalizzazione finale consisterà nell'aggiungere un'informazione supplementare utilizzata nel nome finale del nostro kernel. Questo ci aiuterà a distinguere questo kernel da qualsiasi altro kernel con lo stesso numero di versione. Aggiungeremo il tag "custom" alle informazioni sulla versione del kernel. Questo può essere fatto modificando il Makefile principale e aggiungendo il tag desiderato alla variabile EXTRAVERSION. +La personalizzazione finale consisterà nell'aggiungere un'informazione supplementare utilizzata nel nome finale del nostro kernel. Questo ci aiuterà a distinguere questo kernel da qualsiasi altro kernel con lo stesso numero di versione. Si aggiungerà il tag "custom" alle informazioni sulla versione del kernel. Per farlo, modificate il Makefile principale e aggiungete il tag desiderato alla variabile EXTRAVERSION. -La fase di compilazione del processo di creazione del kernel è di gran lunga la più semplice, ma richiede anche più tempo. A questo punto è sufficiente eseguire il comando make, che genererà automaticamente e si occuperà di eventuali problemi di dipendenza, compilerà il kernel stesso e compilerà tutte le funzionalità (o i driver) che sono state abilitate come moduli caricabili. +La fase di compilazione del processo di creazione del kernel è di gran lunga la più semplice, ma richiede anche più tempo. È sufficiente eseguire il comando `make`, che genererà automaticamente e si occuperà di qualsiasi problema di dipendenza, compilerà il kernel stesso e compilerà qualsiasi funzionalità (o driver) abilitata come modulo caricabile. -A causa della quantità di codice che deve essere compilato, preparatevi ad aspettare almeno qualche minuto, a seconda della potenza di elaborazione del vostro sistema. Analizziamo i passaggi specifici necessari per compilare il nuovo kernel. +A causa della quantità di codice da compilare, preparatevi ad aspettare almeno qualche minuto, a seconda della potenza di elaborazione del vostro sistema. Analizziamo i passaggi specifici necessari per compilare il nuovo kernel. -1. Per prima cosa, aggiungeremo un pezzo in più alla stringa di identificazione del kernel che stiamo per costruire. Mentre siamo ancora nella radice dell'albero dei sorgenti del kernel, useremo l'utilità sed per modificare il Makefile. La variabile che vogliamo modificare si trova all'inizio del file. Vogliamo modificare la riga del file che ha questo aspetto: +1. Per prima cosa, aggiungeremo un pezzo in più alla stringa di identificazione del kernel che stiamo per costruire. Mentre siamo ancora nella root dell'albero dei sorgenti del kernel, useremo l'utilità `sed` per modificare il Makefile sul posto. La variabile che si desidera modificare si trova all'inizio del file. Si vuole modificare la riga del file che assomiglia a questa: - ``` + ```bash EXTRAVERSION = ``` A questo: - ``` + ```bash EXTRAVERSION = -custom ``` - Utilizzate il seguente comando `sed` per effettuare la modifica. Digita: + Utilizzate il seguente comando `sed` per effettuare la modifica. Digitare: - ``` + ```bash sed -i 's/^EXTRAVERSION.*/EXTRAVERSION = -custom/' Makefile ``` - Naturalmente, è possibile utilizzare qualsiasi editor di testo con cui ci si trovi a proprio agio per effettuare la modifica. Ricordatevi di salvare le modifiche apportate al file! + Si può anche utilizzare un qualsiasi editor di testo con cui si ha dimestichezza per effettuare la modifica. Ricordatevi di salvare le modifiche apportate al file. 2. Passare il target kernelversion al comando make per visualizzare la versione completa del kernel appena personalizzato: - ``` - > make O=~/build/kernel kernelversion + ```bash + make O=~/build/kernel kernelversion ``` - !!! Tip "Suggerimento" + !!! Tip È possibile sfruttare tutta la potenza di elaborazione extra (CPU, core e così via) sulla maggior parte dei sistemi moderni e accelerare notevolmente le operazioni ad alta intensità di CPU come la compilazione del kernel. A tale scopo, è possibile passare un parametro al comando make che specifichi il numero di lavori da eseguire simultaneamente. Il numero di lavori specificato viene quindi distribuito ed eseguito simultaneamente su ciascun core della CPU. La sintassi del comando è: - ``` - > make -j N + ```bash + make -j N ``` dove N è il numero di lavori da eseguire contemporaneamente. Ad esempio, se si dispone di una CPU con capacità octa (8) core, è possibile digitare: - ``` - > make -j 8 + ```bash + make -j 8 ``` -3. L'unico comando necessario per compilare il kernel è il comando make: +3. L'unico comando necessario per compilare il kernel è il comando `make`: - ``` - > make O=~/build/kernel + ```bash + $ make O=~/build/kernel make[1]: Entering directory '/home/super/build/kernel' SYNC include/config/auto.conf.cmd GEN Makefile @@ -343,96 +360,97 @@ A causa della quantità di codice che deve essere compilato, preparatevi ad aspe 4. Il prodotto finale di questo comando (cioè il kernel) è in attesa nel percorso: - ``` + ```bash ~/build/kernel/arch/x86/boot/bzImage ``` -5. È necessario installare i moduli perché abbiamo compilato parti del kernel come moduli (ad esempio, il modulo NTFS). Digitare quanto segue: +5. È necessario installare i moduli perché sono state compilate parti del kernel come moduli (ad esempio, il modulo NTFS). Digitare quanto segue: - ``` - > sudo make O=~/build/kernel modules_install + ```bash + sudo make O=~/build/kernel modules_install ``` - Sul nostro sistema Rocky, questo comando installerà tutti i moduli compilati del kernel nella cartella /lib/modules/ . In questo esempio, il percorso si tradurrà in /lib/modules/6.5.7-custom/. È il percorso dal quale il kernel caricherà tutti i moduli caricabili, se necessario. + Sul nostro sistema Rocky, questo comando installerà tutti i moduli del kernel compilati nella directory `/lib/modules/`. Questo percorso si tradurrà in `/lib/modules/6.5.7-custom/` in questo esempio. È il percorso dal quale il kernel caricherà tutti i moduli caricabili, se necessario. !!! TIP "Suggerimento" - L'ingombro (dimensione) dei moduli del kernel installati tramite "make modules_install" può diventare piuttosto grande perché i moduli includono simboli di debug. Di conseguenza, si potrebbe facilmente ritrovarsi con una cartella `/lib/modules/6.5.7-custom/` di dimensioni prossime ai 5 Gb! + Il footprint (dimensione) dei moduli del kernel installati tramite `make modules_install` può diventare piuttosto significativo perché i moduli includono simboli di debug. Di conseguenza, si potrebbe facilmente ritrovarsi con una cartella /lib/modules/6.5.7-custom/ di dimensioni prossime ai 5 Gb! - Per questa guida evitiamo queste dimensioni elevate includendo l'opzione INSTALL_MOD_STRIP=1 nell'invocazione di make modules_install. È possibile ridurre la dimensione totale di ordini di grandezza (ad esempio, meno di 200 MB!) eliminando questi simboli di debug. + Per questa guida evitiamo queste dimensioni elevate includendo l'opzione `INSTALL_MOD_STRIP=1` nell'invocazione di `make modules_install`. È possibile ridurre la dimensione totale di ordini di grandezza (ad esempio, meno di 200 MB) eliminando questi simboli di debug. - Questo può essere fatto includendo l'opzione `INSTALL_MOD_STRIP=1` al comando `make modules_install`. + Questo può essere fatto includendo l'opzione INSTALL_MOD_STRIP=1 al comando make modules_install. + ## Installazione del Kernel -Supponendo di avere un PC e di lavorare dalla directory `~/build/kernel/`, il kernel compilato creato nell'esercizio precedente si troverà in questo percorso - `/arch/x86/boot/bzImage` o, per essere precisi, nel nostro esempio `~/build/kernel/arch/x86/boot/bzImage`. +Supponendo di avere un PC e di lavorare dalla directory `~/build/kernel/`, il kernel compilato creato nell'ultimo esercizio si troverà in questo percorso - `/arch/x86/boot/bzImage` o, per essere precisi, nel nostro esempio `~/build/kernel/arch/x86/boot/bzImage`. -Il file di mappa corrispondente si trova in ~/build/kernel/System.map. Per la fase di installazione sono necessari entrambi i file. +Il file di mappa corrispondente si trova in `~/build/kernel/System.map`. Per la fase di installazione sono necessari entrambi i file. -Il file System.map è utile quando il kernel non si comporta correttamente e genera messaggi "Oops". Un "Oops" viene generato su alcuni errori del kernel a causa di bug del kernel o di hardware difettoso. +Il file `System.map` è utile quando il kernel si comporta male e genera messaggi "Oops". I messaggi "Oops" vengono generati su alcuni errori del kernel a causa di bug del kernel o di hardware difettoso. Questo errore è simile alla schermata blu della morte (BSOD) di Microsoft Windows. Questi messaggi includono molti dettagli sullo stato attuale del sistema, compresi diversi numeri esadecimali. -System.map dà a Linux la possibilità di trasformare i numeri esadecimali in nomi leggibili, facilitando il debug. Sebbene sia principalmente a beneficio degli sviluppatori, può essere utile quando si segnala un problema. +`System.map` consente a Linux di trasformare i numeri esadecimali in nomi leggibili, facilitando il debug. Sebbene sia principalmente a beneficio degli sviluppatori, può essere utile quando si segnala un problema. Esaminiamo i passaggi necessari per installare la nuova immagine del kernel. -1. Mentre ci si trova nella radice della directory di creazione del kernel, copiare e rinominare il file bzImage nella directory /boot: +1. Nella radice della directory di creazione del kernel, copiare e rinominare il file `bzImage` nella directory `/boot`: - ``` - > sudo cp ~/build/kernel/arch/x86/boot/bzImage \ + ```bash + sudo cp ~/build/kernel/arch/x86/boot/bzImage \ /boot/vmlinuz- ``` - Qui, kernel-version è il numero di versione del kernel. Per il kernel di esempio che stiamo usando in questa guida, il nome del file sarà vmlinuz-6.5.7-custom. Ecco il comando esatto per questo esempio: + Qui, `` è il numero di versione del kernel. Il nome del file del kernel di esempio utilizzato in questa guida è `vmlinuz-6.5.7-custom`. Ecco il comando esatto per questo esempio: - ``` - > sudo cp ~/build/kernel/arch/x86/boot/bzImage \ + ```bash + sudo cp ~/build/kernel/arch/x86/boot/bzImage \ /boot/vmlinuz-6.5.7-custom ``` - !!! Note "Nota" + !!! Note - La decisione di chiamare l'immagine del kernel vmlinuz-6.5.7-custom è in qualche modo arbitraria. È comodo, perché le immagini del kernel sono comunemente indicate come vmlinuz e il suffisso del numero di versione è utile quando si hanno a disposizione più kernel o kernel che forniscono funzionalità specifiche (per esempio vmlinuz-6.50.0-ws). + La decisione di chiamare l'immagine del kernel `vmlinuz-6.5.7-custom` è in qualche modo arbitraria. È comodo, perché le immagini del kernel sono comunemente indicate come vmlinuz e il suffisso del numero di versione è utile quando si hanno a disposizione più kernel o kernel che forniscono funzionalità specifiche (per esempio `vmlinuz-6.50.0-ws`). -2. Ora che l'immagine del kernel è pronta, copiare e rinominare il file System.map corrispondente nella directory /boot utilizzando la stessa convenzione di denominazione: +2. Ora che l'immagine del kernel è pronta, copiare e rinominare il file `System.map` corrispondente nella directory `/boot` utilizzando la stessa convenzione di denominazione: - ``` - > sudo cp -v ~/build/kernel/System.map \ + ```bash + sudo cp -v ~/build/kernel/System.map \ /boot/System.map-6.5.7-custom ``` -3. Con il kernel a posto, il file System.map a posto e i moduli a posto, siamo pronti per il passo finale. La sintassi del comando necessario è: +3. Con il kernel al suo posto, il file `System.map` al suo posto e i moduli al suo posto, siamo pronti per il passo finale. La sintassi del comando necessario è: - ``` - > kernel-install add + ```bash + kernel-install add ``` - Qui, è il numero di versione (e il nome) del kernel. E è il percorso dell'immagine del kernel appena compilata. + Qui, `` è il numero di versione (e il nome) del kernel. E `` è il percorso dell'immagine del kernel appena compilata. Nel nostro esempio, digitate: - ``` - > sudo kernel-install \ + ```bash + sudo kernel-install \ add 6.5.7-custom /boot/vmlinuz-6.5.7-custom ``` -Il comando kernel-install qui utilizzato è un piccolo script di shell. Forse non è disponibile in tutte le distribuzioni Linux, ma lo è nelle più recenti Fedora, RHEL e CentOS. Questo strumento automatizza molte delle ultime operazioni manuali che normalmente dovremmo fare per configurare il sistema per l'avvio del nuovo kernel appena creato. +Il comando `kernel-install` è uno script di shell molto utile. Potrebbe non essere disponibile in tutte le distribuzioni Linux, ma è disponibile nelle distribuzioni più recenti Fedora, RHEL e CentOS. Questo strumento automatizza molte delle ultime operazioni manuali che normalmente si dovrebbero fare per impostare il sistema per l'avvio del nuovo kernel appena creato. In particolare, lo strumento esegue le seguenti operazioni: -- Crea l'immagine iniziale del file system RAM appropriata (l'immagine initramfs, cioè la cartella /boot/initramfs-.img). Per eseguire questa operazione manualmente sui sistemi in cui kernel-install non è disponibile, utilizzare il comando mkinitramfs. -- Esegue il comando depmod (che crea un elenco di dipendenze dei moduli). +- Crea l'immagine iniziale del file system RAM appropriata (l'immagine initramfs, cioè il file `/boot/initramfs-.img`). Per farlo manualmente sui sistemi in cui `kernel-install` non è disponibile, usare il comando `mkinitramfs`. +- Esegue il comando `depmod` (che crea un elenco di dipendenze dei moduli). - Aggiorna la configurazione del boot loader. -Per i sistemi che eseguono le versioni più recenti di GRUB2, il file sarà `/boot/grub2/grub.cfg`. Per i sistemi basati su EFI /boot/efi/anche /fedora/grub.cfg viene aggiornato. +Per i sistemi che eseguono le versioni più recenti di GRUB2, il file sarà `/boot/grub2/grub.cfg`. Per i sistemi basati su EFI viene aggiornato anche `/boot/efi//fedora/grub.cfg`. -Per i sistemi che eseguono le versioni precedenti di GRUB, questo sarà il file /boot/grub/grub.conf o /boot/grub/menu.lst. Per le nuove distro che hanno implementato le nuove specifiche del caricatore di avvio (BLS), una nuova voce del caricatore di avvio verrà aggiunta alla directory /boot/loader/entries/, o a qualsiasi directory indicata dalla variabile "blsdir". +Per i sistemi che eseguono le versioni precedenti di GRUB, questo sarà il file `/boot/grub/grub.conf` o `/boot/grub/menu.lst` Per le nuove distro che hanno implementato le nuove specifiche del caricatore di avvio (BLS), una nuova voce del caricatore di avvio verrà aggiunta alla directory `/boot/loader/entries/`, o a qualsiasi directory indicata dalla variabile `blsdir`. -Sul nostro server demo Rocky basato su EFI che esegue GRUB 2 utilizzando BLS, viene creata una nuova voce di avvio nel file del boot loader che si trova qui: `/boot/loader/entries/6fa25ca775f64accb0d3e53f0e4e6e92-6.5.7-custom.conf` +Sul server demo Rocky basato su EFI che esegue GRUB2 utilizzando BLS, la creazione di una nuova voce di avvio avviene nel file del boot loader situato qui: `/boot/loader/entries/6fa25ca775f64accb0d3e53f0e4e6e92-6.5.7-custom.conf` -``` -> sudo cat /boot/loader/entries/6fa25ca775f64accb0d3e53f0e4e6e92-6.5.7-custom.conf +```bash +$ sudo cat /boot/loader/entries/6fa25ca775f64accb0d3e53f0e4e6e92-6.5.7-custom.conf title Rocky Linux (6.5.7-custom) 8.5 (Green Obsidian) version 6.5.7-custom linux /vmlinuz-6.5.7-custom @@ -444,29 +462,30 @@ grub_arg --unrestricted grub_class kernel ``` -!!! Note "Nota" +!!! Note - La maggior parte delle distro ha a disposizione diverse utility grub2-* che possono essere utilizzate per eseguire varie operazioni di pulizia di GRUB2 e del boot loader. Ad esempio, si può usare il comando grub2-set-default per modificare o impostare il kernel predefinito da avviare all'avvio del sistema. + La maggior parte delle distro ha a disposizione diverse utility `grub2-*` che possono essere utilizzate per eseguire varie operazioni di pulizia di GRUB2 e del boot loader. Per esempio, si può usare il comando `grub2-set-default` per cambiare o impostare il kernel predefinito all'avvio del sistema. ## Avvio del Kernel personalizzato + La fase successiva consiste nel testare il kernel per assicurarsi che il sistema possa avviarsi con esso. 1. Supponendo di aver eseguito tutto nel modo esatto prescritto dal medico e che tutto abbia funzionato esattamente come indicato dal medico, si può tranquillamente riavviare il sistema e selezionare il nuovo kernel dal menu del boot loader durante l'avvio del sistema: - ``` - > sudo reboot + ```bash + sudo reboot ``` -2. Dopo l'avvio del sistema, è possibile utilizzare il comando uname per scoprire il nome del kernel corrente: +2. Dopo l'avvio del sistema, è possibile utilizzare il comando `uname` per scoprire il nome del kernel corrente: - ``` - > uname -r + ```bash + $ uname -r 6.5.7-custom ``` 3. Si ricorderà che una delle caratteristiche aggiunte al nuovo kernel è la capacità di supportare il file system NTFS. Assicurarsi che il nuovo kernel abbia effettivamente il supporto per NTFS visualizzando le informazioni sul modulo NTFS: - ``` + ```bash [rockstar ~]$ modinfo ntfs filename: /lib/modules/6.5.7-custom/kernel/fs/ntfs/ntfs.ko license: GPL @@ -475,4 +494,4 @@ La fase successiva consiste nel testare il kernel per assicurarsi che il sistema ...OUTPUT TRUNCATED... ``` -E questo è quanto! +Non c'è altro. diff --git a/docs/guides/hardware/aqc_bridge_vlan.it.md b/docs/guides/hardware/aqc_bridge_vlan.it.md new file mode 100644 index 0000000000..782fcec355 --- /dev/null +++ b/docs/guides/hardware/aqc_bridge_vlan.it.md @@ -0,0 +1,29 @@ +--- +title: Abilitare VLAN Passthrough su Marvell AQC-series NIC +author: Neel Chauhan +contributors: Steven Spencer +tested_with: 9.6 +tags: + - hardware +--- + +## Introduzione + +L'autore utilizza una NIC (network inteface card) basata su Marvell AQC107 sul proprio server, che ha una macchina virtuale utilizzata per un firewall virtualizzato. Purtroppo, il driver stock Rocky Linux Marvell AQC esclude le VLAN dalle interfacce bridge. Questo è ciò che è successo alla macchina virtuale OPNsense dell'autore. Fortunatamente è risolvibile. + +## Prerequisiti e presupposti + +A seguire i requisiti minimi per seguire questa procedura: + +- Un server Rocky Linux con una scheda NIC Marvell serie AQC +- Utilizzo di NetworkManager per configurare la rete + +## Disabilitazione dei filtri su VLAN + +È possibile disattivare il filtraggio VLAN con un solo comando: + + nmcli con modify enp1s0 ethtool.feature-rx-vlan-filter off + +Sostituire `enp1s0` con il nome della NIC basata su AQC. + +Infine, è necessario riavviare il sistema. diff --git a/docs/guides/package_management/package_debranding.it.md b/docs/guides/package_management/package_debranding.it.md index 8c3de726ec..ba3049e6a5 100644 --- a/docs/guides/package_management/package_debranding.it.md +++ b/docs/guides/package_management/package_debranding.it.md @@ -6,16 +6,14 @@ title: Debranding dei Pacchetti Questo spiega come eseguire il debrand di un pacchetto per la distribuzione Rocky Linux. - Istruzioni Generali In primo luogo, identificare i file nel pacchetto che devono essere cambiati. Possono essere file di testo, file di immagine, o altri. È possibile identificare i file scavando in git.centos.org/rpms/PACKAGE/ Sviluppare dei sostituti per questi file, ma utilizzando invece il marchio Rocky. A seconda del contenuto da sostituire, per alcuni tipi di testo possono essere necessari file diff/patch. -I file di sostituzione si trovano in https://git.rockylinux.org/patch/PACKAGE/ROCKY/_supporting/ Il file di configurazione (che specifica come applicare le patch) in https://git.rockylinux.org/patch/PACKAGE/ROCKY/CFG/*.cfg - -Nota: Usa spazi, non tabulazioni. Quando srpmproc importerà il pacchetto in Rocky, si vedrà il lavoro svolto in https://git.rockylinux.org/patch/PACKAGE e applicherà le patch di debranding memorizzate leggendo i file di configurazione sotto ROCKY/CFG/*.cfg +I file di sostituzione vanno sotto . Il file di configurazione (che specifica come applicare le patch) va in [https://git.rockylinux.org/patch/PACKAGE/ROCKY/CFG/*.cfg.](https://git.rockylinux.org/patch/PACKAGE/ROCKY/CFG/*.cfg) +Nota: Usa spazi, non tabulazioni. Quando srpmproc importerà il pacchetto in Rocky, vedrà il lavoro svolto in e applicherà le patch di debranding memorizzate leggendo i file di configurazione sotto ROCKY/CFG/*.cfg da [pagina wiki di debranding](https://wiki.rockylinux.org/team/release_engineering/debranding/) diff --git a/docs/guides/package_management/package_dev_start.it.md b/docs/guides/package_management/package_dev_start.it.md index 6ba0f057f1..c2f082f362 100644 --- a/docs/guides/package_management/package_dev_start.it.md +++ b/docs/guides/package_management/package_dev_start.it.md @@ -89,11 +89,11 @@ Per il nostro attuale esempio di sed, i suoi sorgenti saranno memorizzati nella └── sed.spec ``` -!!! Tip "Suggerimento" +!!! Tip Una volta ottenuti i sorgenti originali, potrebbe essere un buon momento per esaminare il file SPECs (`~rocky/rpms/sed/SPECS/specs.spec`) per cercare potenziali opportunità di debranding in un dato pacchetto. Il debranding può comprendere la sostituzione di grafica/loghi a monte e così via. -!!! Tip "Suggerimento" +!!! Tip Se state cercando altri pacchetti Rocky da compilare e sperimentare, potete consultare l'elenco dei pacchetti che attualmente non funzionano nell'ambiente di compilazione automatica di Rocky [qui](https://kojidev.rockylinux.org/koji/builds?state=3&order=-build_id) diff --git a/docs/rocky_insights/blogs/good_docs.zh.md b/docs/rocky_insights/blogs/good_docs.zh.md new file mode 100644 index 0000000000..9c7e29d2c3 --- /dev/null +++ b/docs/rocky_insights/blogs/good_docs.zh.md @@ -0,0 +1,88 @@ +--- +title: 优质文档规范——译者视角 +author: Ganna Zhyrnova +contributors: Steven Spencer +--- + +## 介绍 + +译者能为撰写清晰简明的文档提供宝贵洞见。 他们比大多数人更清楚哪些内容难以准确翻译、哪些表述容易引发读者困惑。 本文剖析了此类典型问题,并聚焦优质文档创作的最佳实践指南。 + +### 来自作者 + +软件文档帮助用户理解如何高效使用特定软件。 用户需要明确了解最终能实现什么成果以及获得哪些收益。 同时,在创建文档时应当意识到,您不仅是为自己编写,更是为技术社群及其他可能阅读的人而写作。 其他人可能不是来自英语国家。 这意味着对他们来说,英语不是他们的主要语言。 因此,遵循这些基本规则,使您的文档对 _所有_ 用户都更具可读性。 + +## 使用通俗易懂的语言 + +您根本不知道您的用户是谁。 无论这个用户是否熟悉这个领域,无论他们是经验丰富的开发者还是初学者。 通俗易懂的语言是清晰、简洁且能让目标受众在初次接触时就能理解的交流方式。 应避免使用行话、技术术语和复杂的句子结构,而应该倾向于使用更简单的语言和清晰的组织方式。 其目标是确保信息对广泛的受众来说都是可获取且易于理解的,无论他们的背景或阅读水平如何。 通常,您可以通过将句子结构或命令简化到最基本的格式来做到这一点。 + +## 避免使用习语、术语、首字母缩略词和缩略形式 + +习语、术语、缩略形式和首字母缩略词可能会让不熟悉它们的读者感到困惑,尤其是非母语人士、新员工或特定领域之外的人。 + +**习语** 通常具有文化特殊性,对于国际读者来说很难理解。\ +**术语** 涉及只有某一领域的专家才能识别的专业术语。\ +**缩略形式** 在英语中用简化形式替代完整词汇,但并非所有语言都存在类似用法,导致翻译困难。\ +**首字母缩略词** 易产生歧义,尤其是在首次使用时没有定义的情况下。 + +示例: + +❌ "Once you’ve got the hang of the dashboard, the rest is a piece of cake." 在这里,作者使用了缩略形式、俚语和习语。 + +✅ "Once you have learned how to use the dashboard, the rest is easy." 通过将缩略形式、俚语和习语替换为与之相关的词语,意思就清晰了。 + +诸如习语之类的比喻性语言通常难以翻译。 技术作者或翻译人员可能很难在其他语言中传达相同的意思。 + +示例: + +❌ "Let’s touch base next week to circle back on the open tickets." + +✅ "Let us meet next week to review the unresolved support requests." + +术语和首字母缩略词若未被普遍知晓,即使在同一个组织内部也可能造成混淆。 + +示例: + +❌ "Upload the CSV to the CMS and tag it according to SOPs." + +✅ "Upload the CSV (Comma-Separated Values file) to the content management system and label it according to the standard operating procedures." + +注意:如果你想使用首字母缩略词,请务必在第一次定义它们:"Customer Relationship Management (CRM) system"。 + +通过消除习语和不必要的术语,文档的含义会变得更加清晰。 将缩略形式替换为其代表的完整词语,意味着所有语言的翻译工作都会变得更容易。 当您替换或定义首字母缩略词时,您的文档对读者来说是最易理解的。 + +## 使用主动语态 + +主动语态强调动作的执行者,明确指出谁或什么对动词所表示的动作负责。 + +示例: + +The system opens the dialog where you need to complete the form. + +请避免使用复数形式,因为它会让读者感到困惑。 + +有关主动语态的使用以及使用它的意义,请参阅 [此观点](active_voice.md) 和 [此外部来源](https://developers.google.com/tech-writing/one/active-voice)。 + +## 具体步骤 + +如果文档中有特定的步骤,请将它们分开。 + +例如: + +Step 1 - Go to the section\ +Step 2 - Click the button\ +Step 3 - Complete the form\ +...\ +Step N - save changes + +## 必要时进行截图 + +在需要的地方使用正确的截图。 这意味着您无需到处添加截图,仅在需要进一步解释的地方添加即可。 + +## 使用示例 + +如果你需要填写表格,那么请提供用户如何填写的示例。 如果有任何限制,请一并说明。 + +## 总结 + +编写好的文档,不仅要确保其技术上的准确性,还要让读者能够立刻理解。 这一点在技术文档需要翻译成其他语言时尤为重要。 在这份文档中,作者旨在强调编写优质、清晰文档的特定技巧。 From 669d8436b38018aa117f49ced3a69c7dfe03e63e Mon Sep 17 00:00:00 2001 From: ambaradan <87865413+ambaradan@users.noreply.github.com> Date: Tue, 22 Jul 2025 14:27:12 +0200 Subject: [PATCH 075/164] =?UTF-8?q?Correct=20blank=20space=20in=20keyboard?= =?UTF-8?q?=20shortcut=20++=E2=80=9Cq=E2=80=9D++=20(#2797)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/books/nvchad/install_nvchad.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/books/nvchad/install_nvchad.md b/docs/books/nvchad/install_nvchad.md index 0626bd7fb8..244addbca6 100644 --- a/docs/books/nvchad/install_nvchad.md +++ b/docs/books/nvchad/install_nvchad.md @@ -64,7 +64,7 @@ To download and initialize the configuration, use the following command: git clone https://github.com/NvChad/starter ~/.config/nvim && nvim ``` -The command consists of two parts. The first downloads the contents of the *starter* repository to `~/.config/nvim/` (default folder for Neovim settings), while the second invokes the ==nvim== executable which initializes the editor with the configuration you just downloaded. Once you have finished installing the plugins and parsers, you will be faced with the following screen. To close the plugins manager, type ++"q "++ : +The command consists of two parts. The first downloads the contents of the *starter* repository to `~/.config/nvim/` (default folder for Neovim settings), while the second invokes the ==nvim== executable which initializes the editor with the configuration you just downloaded. Once you have finished installing the plugins and parsers, you will be faced with the following screen. To close the plugins manager, type ++"q"++ : ![NvChad Install](images/install_nvchad_25.png) From 31ce0987419a903fe4b91a9d720712312d5743e1 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Tue, 22 Jul 2025 07:17:23 -0700 Subject: [PATCH 076/164] New Crowdin updates (#2796) * New translations librenms_monitoring_server.md (Italian) * New translations package_build_troubleshooting.md (Italian) * New translations dnf_package_manager.md (Italian) * New translations dnf_automatic.md (Italian) * New translations pulp_fetch_upload.md (Italian) * New translations projectmgr.md (Italian) --- docs/books/nvchad/plugins/projectmgr.it.md | 2 +- .../network/librenms_monitoring_server.it.md | 236 +++--- .../dnf_package_manager.it.md | 714 ++++++++++++++++++ .../package_build_troubleshooting.it.md | 7 +- .../repositories/pulp_fetch_upload.it.md | 103 +++ docs/guides/security/dnf_automatic.it.md | 2 +- 6 files changed, 941 insertions(+), 123 deletions(-) create mode 100644 docs/guides/package_management/dnf_package_manager.it.md create mode 100644 docs/guides/repositories/pulp_fetch_upload.it.md diff --git a/docs/books/nvchad/plugins/projectmgr.it.md b/docs/books/nvchad/plugins/projectmgr.it.md index 47d62c7d86..2238a5fad8 100644 --- a/docs/books/nvchad/plugins/projectmgr.it.md +++ b/docs/books/nvchad/plugins/projectmgr.it.md @@ -42,7 +42,7 @@ Tutte le operazioni vengono eseguite con il tasto ++ctrl++ seguito da una letter La tabella seguente mostra tutte le operazioni disponibili -| Opzione | Operazione | +| Tasto | Operazione | | ------------- | --------------------------------------------------------- | | `` | Apre il progetto sotto il cursore | | `` | Aggiunge un progetto attraverso una procedura interattiva | diff --git a/docs/guides/network/librenms_monitoring_server.it.md b/docs/guides/network/librenms_monitoring_server.it.md index 44e9676ca7..1b22b0f65e 100644 --- a/docs/guides/network/librenms_monitoring_server.it.md +++ b/docs/guides/network/librenms_monitoring_server.it.md @@ -16,13 +16,13 @@ L'installazione seguirà fedelmente le [istruzioni di installazione ufficiali](h ## Prerequisiti, presupposti e convenzioni -* Un server o un container (sì, LibreNMS può essere eseguito in un container. Se si devono monitorare molte cose, la scelta migliore è quella di installare su un hardware indipendente) con Rocky Linux. Tutti i comandi presuppongono una nuova installazione di Rocky Linux. -* Presupposto: che si possano eseguire i comandi come root o che si sia in grado di usare _sudo_ per elevare i privilegi -* Conoscenza di strumenti a riga di comando, inclusi editor di testo come _vi_ -* Presupposto: l'uso di SNMP v2. Se si desidera utilizzare SNMP v3, LibreNMS lo supporta e funzionerà. È necessario modificare la configurazione e le opzioni SNMP dei dispositivi per adeguarli alla versione v3. -* È inclusa la procedura SELinux. Il container utilizzato dall'autore nel laboratorio non lo include per impostazione predefinita. Per questo motivo, la procedura SELinux **non** è stata testata in laboratorio. -* In questo documento, gli esempi utilizzano l'editor _vi_. Quando il documento dice di salvare le modifiche e di uscire, usare SHIFT+:+wq!. -* La procedura richiede alcune competenze in materia di risoluzione dei problemi, tra cui il monitoraggio dei log, i test web e altro ancora +- Un server o un container (sì, LibreNMS può essere eseguito in un container. Se si devono monitorare molte cose, la scelta migliore è quella di installare su un hardware indipendente) con Rocky Linux. Tutti i comandi presuppongono una nuova installazione di Rocky Linux. +- Presupposto: che si possano eseguire i comandi come root o che si possa eseguire *sudo* per elevare i privilegi +- Conoscenza pratica degli strumenti a riga di comando, compresi gli editor di testo come *vi* +- Presupposto: l'uso di SNMP v2. Se si desidera utilizzare SNMP v3, LibreNMS lo supporta e funzionerà. È necessario modificare la configurazione e le opzioni SNMP dei dispositivi per adeguarli alla versione v3. +- È inclusa la procedura SELinux. Il container utilizzato dall'autore nel laboratorio non lo include per impostazione predefinita. Per questo motivo, la procedura SELinux **non** è stata testata in laboratorio. +- In questo documento gli esempi utilizzano l'editor *vi*. Quando il documento dice di salvare le modifiche e di uscire, usare ++shift+colon+w+q+exclam++. +- La procedura richiede alcune competenze in materia di risoluzione dei problemi, tra cui il monitoraggio dei log, i test web e altro ancora ## Installazione dei pacchetti @@ -30,7 +30,7 @@ Inserire questi comandi come utente root. Prima di iniziare, si noti che questa Per prima cosa, installare il repository EPEL (Extra Packages for Enterprise Linux): -``` +```bash dnf install -y epel-release ``` @@ -38,14 +38,21 @@ La versione attuale di LibreNMS richiede una versione minima di PHP pari a 8.1. La versione del repository da installare dipende dalla versione di Rocky Linux in uso. L'ipotesi è che si tratti della versione 9, ma si può modificare di conseguenza in base alla versione in uso: -``` +```bash dnf install http://rpms.remirepo.net/enterprise/remi-release-9.rpm ``` -Una volta installati i repository EPEL e REMI, è il momento di installare i pacchetti: +Quindi impostare il dnf in modo che utilizzi i pacchetti remi al posto di quelli normali +```bash +dnf module reset php +dnf module enable php:8.1 ``` -dnf install bash-completion cronie fping git httpd ImageMagick mariadb-server mtr net-snmp net-snmp-utils nmap php81-php-fpm php81-php-cli php81-php-common php81-php-curl php81-php-gd php81-php-json php81-php-mbstring php81-php-process php81-php-snmp php81-php-xml php81-php-zip php81-php-mysqlnd python3 python3-PyMySQL python3-redis python3-memcached python3-pip python3-systemd rrdtool unzip wget + +Una volta installati i repository EPEL e REMI, è il momento di installare i pacchetti: + +```bash +dnf install bash-completion cronie fping git httpd ImageMagick mariadb-server mtr net-snmp net-snmp-utils nmap php-fpm php-cli php-common php-curl php-gd php-gmp php-json php-mbstring php-process php-snmp php-xml php-zip php-mysqlnd python3 python3-PyMySQL python3-redis python3-memcached python3-pip python3-systemd rrdtool unzip wget ``` Tutti questi pacchetti rappresentano una parte delle funzionalità di LibreNMS. @@ -54,29 +61,29 @@ Tutti questi pacchetti rappresentano una parte delle funzionalità di LibreNMS. Copiare e incollare (o inserire) quanto segue: -``` +```bash useradd librenms -d /opt/librenms -M -r -s "$(which bash)" ``` -Questo comando imposta la directory predefinita per l'utente a `/opt/librenms`, tuttavia l'opzione `-M` dice "non creare la directory." Il motivo è che ciò avviene al momento dell'installazione di LibreNMS. Il `-r` dice di rendere questo utente un account di sistema e il `-s` dice di impostare la shell (in questo caso, "bash"). +Questo comando imposta la directory predefinita per l'utente a `/opt/librenms`, ma l'opzione `-M` dice "non creare la directory". Il motivo è che ciò avviene al momento dell'installazione di LibreNMS. Il `-r` dice di rendere questo utente un account di sistema e il `-s` dice di impostare la shell (in questo caso, "bash"). ## Scaricare LibreNMS e impostare i permessi Git facilita il download. Forse conoscete già il processo. Per prima cosa, passate alla directory `/opt`: -``` +```bash cd /opt ``` Clonare il repository: -``` +```bash git clone https://github.com/librenms/librenms.git ``` Modificare le autorizzazioni per la directory: -``` +```bash chown -R librenms:librenms /opt/librenms chmod 771 /opt/librenms setfacl -d -m g::rwx /opt/librenms/rrd /opt/librenms/logs /opt/librenms/bootstrap/cache/ /opt/librenms/storage/ @@ -87,21 +94,21 @@ Il comando `setfacl` sta per "set file access control lists" ed è un altro modo ## Installare le dipendenze di PHP come `librenms` -Le dipendenze PHP di LibreNMS devono essere installate con l'utente `librenms`. A tal fine, eseguire: +Le dipendenze PHP di LibreNMS devono essere installate con l'utente `librenms`. Per farlo, eseguire: -``` +```bash su - librenms ``` Inserire quanto segue: -``` +```bash ./scripts/composer_wrapper.php install --no-dev ``` Uscire di nuovo a root: -``` +```text exit ``` @@ -111,60 +118,59 @@ La documentazione di LibreNMS dice che la procedura di cui sopra potrebbe fallir ## Impostare il fuso orario -È necessario assicurarsi che l'impostazione sia corretta per il sistema e per PHP. È possibile trovare un elenco di [impostazioni valide del fuso orario per PHP qui](https://php.net/manual/en/timezones.php). Ad esempio, per il fuso orario Central, una voce comune è "America/Chicago". Iniziate modificando il file `php.ini`: +È necessario assicurarsi che l'impostazione sia corretta per il sistema e per PHP. È possibile trovare un elenco di [impostazioni di fuso orario valide per PHP qui](https://php.net/manual/en/timezones.php). Ad esempio, per il fuso orario centrale, una voce comune è "America/Chicago". Iniziare modificando il file `php.ini`: -``` -vi /etc/opt/remi/php81/php.ini +```bash +vi /etc/php.ini ``` -Trovare la riga `date.timezone` e modificarla. Si noti che è annotato, quindi rimuovere il ";" dall'inizio della riga e aggiungere il proprio fuso orario dopo il segno "=". Per l'esempio del fuso orario Central utilizzare: +Individuare la riga `date.timezone` e modificarla. Si noti che è annotato, quindi rimuovere il ";" dall'inizio della riga e aggiungere il proprio fuso orario dopo il segno "=". Per l'esempio del fuso orario centrale utilizzare: -``` +```bash date.timezone = America/Chicago ``` -Salvare le modifiche e uscire dal file `php.ini`. +Salvare le modifiche e uscire dal file `php.ini.`. È inoltre necessario assicurarsi che il fuso orario del sistema sia corretto. Utilizzando l'esempio del fuso orario Central, eseguire questa operazione con: -``` +```bash timedatectl set-timezone America/Chicago ``` ## Impostazione di MariaDB -Prima di avviare i requisiti del database per LibreNMS, eseguire la procedura [MariaDB](../database/database_mariadb-server.md), in particolare la sezione "Messa in sicurezza di mariadb-server", e tornare qui per queste impostazioni specifiche. Modificare il file `mariadb-server.cnf`: +Prima di avviare i requisiti del database per LibreNMS, eseguire la [procedura MariaDB](../database/database_mariadb-server.md), in particolare la sezione "Messa in sicurezza di mariadb-server", e tornare qui per queste impostazioni specifiche. Modificare il file `mariadb-server.cnf`: -``` +```bash vi /etc/my.cnf.d/mariadb-server.cnf ``` -Aggiungere le seguenti righe alla sezione "[Mysqld]": +Aggiungere queste righe alla sezione "[Mysqld]": -``` +```bash innodb_file_per_table=1 lower_case_table_names=0 ``` -Quindi attivare e riavviare il server `mariadb`: +Quindi abilitare e riavviare il server `mariadb`: -``` +```bash systemctl enable mariadb systemctl restart mariadb ``` Accedere a `mariadb` come utente root. Ricordarsi di utilizzare la password creata seguendo la sezione "Messa in sicurezza di mariadb-server" eseguita in precedenza: - -``` +```sql mysql -u root -p ``` -Apportare alcune modifiche specifiche per LibreNMS. Con il comando sottostante, ricordatevi di cambiare la password "password" con qualcosa di sicuro e di documentarlo in un luogo sicuro. +Apportare alcune modifiche specifiche per LibreNMS. Con il comando sottostante, ricordatevi di cambiare la password "password" con qualcosa di sicuro e di documentare quale sia in un luogo sicuro. Al prompt di `mysql` eseguire: -``` +```sql CREATE DATABASE librenms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'librenms'@'localhost' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON librenms.* TO 'librenms'@'localhost'; @@ -177,48 +183,45 @@ Digitare "exit" per uscire da `mariadb`. Questo non è cambiato rispetto alla documentazione ufficiale, tranne che per il percorso dei file. Per prima cosa, copiare il file `www.conf`: -``` -cp /etc/opt/remi/php81/php-fpm.d/www.conf /etc/opt/remi/php81/php-fpm.d/librenms.conf -``` - Modificare il file `librenms.conf`: -``` -vi /etc/opt/remi/php81/php-fpm.d/librenms.conf +```bash +cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/librenms.conf +vi /etc/php-fpm.d/librenms.conf ``` Cambiare "[www]" con ["librenms]" Cambiare l'utente e il gruppo in "librenms": -``` +```bash user = librenms group = librenms ``` Modificare la riga "listen" in modo che rifletta un nome univoco: -``` +```bash listen = /run/php-fpm-librenms.sock ``` -Salvare le modifiche e uscire dal file. Se questo è l'unico servizio web che verrà eseguito su questa macchina, si può rimuovere il vecchio file www.conf copiato: +Salvare le modifiche e uscire dal file. Se questo è l'unico servizio Web che verrà eseguito su questa macchina, è possibile rimuovere il vecchio file copiato: -``` -rm -f /etc/opt/remi/php81/php-fpm.d/www.conf +```bash +rm -f /etc/php-fpm.d/www.conf ``` ## Configurare `httpd` Iniziate creando questo file: -``` +```bash vi /etc/httpd/conf.d/librenms.conf ``` Inserite in quel file quanto segue: -``` +```bash DocumentRoot /opt/librenms/html/ ServerName librenms.example.com @@ -243,24 +246,24 @@ Inserite in quel file quanto segue: È necessario rimuovere il vecchio sito predefinito, `welcome.conf`: -``` +```bash rm /etc/httpd/conf.d/welcome.conf ``` -Abilitare `httpd` and `php-fpm`: +Abilitare `httpd` e `php-fpm`: -``` +```bash systemctl enable --now httpd -systemctl enable --now php81-php-fpm +systemctl enable --now php-fpm ``` ## SELinux -Se non si intende utilizzare SELinux, passare alla sezione successiva. Questo potrebbe valere anche per chi usa LibreNMS su un container che non supporta SELinux a livello di container o non lo include per default. +Se non si intende utilizzare SELinux, passare alla sezione successiva. Questo potrebbe valere anche per chi usa LibreNMS su un contenitore che non supporta SELinux a livello di contenitore o non lo include per impostazione predefinita. Per configurare tutto con SELinux, è necessario installare un pacchetto aggiuntivo: -``` +```bash dnf install policycoreutils-python-utils ``` @@ -268,10 +271,8 @@ dnf install policycoreutils-python-utils Affinché LibreNMS funzioni correttamente con SELinux, è necessario impostare i seguenti contesti: -``` -semanage fcontext -a -t httpd_sys_content_t '/opt/librenms/html(/.*)?' -semanage fcontext -a -t httpd_sys_rw_content_t '/opt/librenms/(logs|rrd|storage)(/.*)?' -restorecon -RFvv /opt/librenms +```bash +semanage fcontext -a -t httpd_sys_content_t '/opt/librenms/html(/.*)?' semanage fcontext -a -t httpd_sys_rw_content_t '/opt/librenms/(logs|rrd|storage)(/.*)?' restorecon -RFvv /opt/librenms setsebool -P httpd_can_sendmail=1 setsebool -P httpd_execmem 1 chcon -t httpd_sys_rw_content_t /opt/librenms/.env @@ -279,9 +280,9 @@ chcon -t httpd_sys_rw_content_t /opt/librenms/.env ### Permettere il `fping` -Creare un file chiamato `http_fping.tt` in un percorso qualsiasi. Non importa dove. L'installazione avviene successivamente. Il contenuto di questo file è: +Creare un file chiamato `http_fping.tt` in un punto qualsiasi. Non importa dove. L'installazione avviene successivamente. Il contenuto di questo file è: -``` +```bash module http_fping 1.0; require { @@ -297,7 +298,7 @@ allow httpd_t self:rawip_socket { getopt create setopt write read }; Installate questo file con i seguenti comandi: -``` +```bash checkmodule -M -m -o http_fping.mod http_fping.tt semodule_package -o http_fping.pp -m http_fping.mod semodule -i http_fping.pp @@ -305,7 +306,7 @@ semodule -i http_fping.pp Se si verificano problemi e si sospetta che possano essere dovuti a un problema di SELinux, eseguire quanto segue: -``` +```bash audit2why < /var/log/audit/audit.log ``` @@ -315,55 +316,56 @@ Le istruzioni di `firewalld` seguono la documentazione ufficiale. Il comando da utilizzare per le regole di autorizzazione di `firewalld` è il seguente: -``` +```bash firewall-cmd --zone public --add-service http --add-service https firewall-cmd --permanent --zone public --add-service http --add-service https ``` -L'autore ha problemi con questo semplicistico insieme di regole `firewalld`. Questa regola permette ai servizi web di essere aperti al mondo, ma è questo che si vuole per un server di monitoraggio? -Di solito **non** è questo il caso. Se si desidera un approccio più granulare all'uso di `firewalld`, consultare [questo documento](../security/firewalld.md) e modificare di conseguenza le regole di `firewalld`. +L'autore ha problemi con questo semplicistico set di regole di ` firewalld`. Questa regola permette ai servizi web di essere aperti al mondo, ma è questo che si vuole per un server di monitoraggio? + +Di solito **non è** così. Se si desidera un approccio più granulare all'uso di `firewalld`, consultare [questo documento](../security/firewalld.md) e modificare di conseguenza le regole di `firewalld`. ## Abilitare i collegamenti simbolici e il completamento automatico delle schede per i comandi `lnms` Innanzitutto, è necessario un collegamento simbolico al comando `lnms`, in modo da poterlo eseguire da qualsiasi punto: -``` +```bash ln -s /opt/librenms/lnms /usr/bin/lnms ``` Quindi, impostare il completamento automatico: -``` +```bash cp /opt/librenms/misc/lnms-completion.bash /etc/bash_completion.d/ ``` ## Configurare `snmpd` -_SNMP_ è l'acronimo di "Simple Network Management Protocol" ed è utilizzato da molti programmi di monitoraggio per l'estrazione dei dati. La versione 2, utilizzata in questo caso, richiede una "community string" specifica per il vostro ambiente. +*SNMP* è l'acronimo di "Simple Network Management Protocol" ed è utilizzato da molti programmi di monitoraggio per estrarre dati. La versione 2, utilizzata in questo caso, richiede una "stringa di comunità" specifica per il vostro ambiente. -Assegnate questa "community string" ai dispositivi di rete che volete monitorare, in modo che `snmpd` (la "d" qui sta per il demone) sia in grado di trovarli. Se la rete non è di nuova costruzione, è possibile che sia già in uso una "stringa di comunità". +Assegnate questa "community string" ai dispositivi di rete che volete monitorare, in modo che `snmpd` (la "d" qui sta per il demone) sia in grado di trovarli. Se la rete non è di nuova costruzione, è possibile che sia già in uso una "community string". Copiare il file `snmpd.conf` da LibreNMS: -``` +```bash cp /opt/librenms/snmpd.conf.example /etc/snmp/snmpd.conf ``` -Modificare questo file e cambiare la stringa di comunità da "RANDOMSTRINGGOESHERE" a quella che è o sarà la vostra community string. Nell'esempio, questa è "LABone": +Modificare questo file e cambiare la community string da "RANDOMSTRINGGOESHERE" a quella che è o sarà la vostra community string. Nell'esempio, si tratta di "LABone": -``` +```bash vi /etc/snmp/snmpd.conf ``` Modificare questa riga: -``` +```bash com2sec readonly default RANDOMSTRINGGOESHERE ``` -in +a -``` +```bash com2sec readonly default LABone ``` @@ -373,7 +375,7 @@ Salvare le modifiche e uscire. Eseguire i seguenti comandi per impostare i lavori di cron: -``` +```bash cp /opt/librenms/librenms.nonroot.cron /etc/cron.d/librenms ``` @@ -381,12 +383,11 @@ Il poller deve essere eseguito una volta, anche se non c'è nulla da interrogare Il poller viene eseguito con l'utente "librenms" e, sebbene sia possibile passare a questo utente ed eseguire i file cron, è meglio lasciare che il poller lo faccia da solo. Assicurarsi che siano trascorsi almeno 5 minuti per consentire l'esecuzione del cron e quindi proseguire con la sezione "Impostazione Web". - ## Rotazione del registro LibreNMS creerà nel tempo un'ampia serie di registri. È necessario impostare la rotazione dei registri per conservare lo spazio su disco. Per farlo, eseguire questo comando: -``` +```bash cp /opt/librenms/misc/librenms.logrotate /etc/logrotate.d/librenms ``` @@ -398,13 +399,13 @@ Prima di iniziare, è necessario collegare la versione corrente del binario `php Questo è risolvibile con un collegamento simbolico e vi renderà la vita molto più facile durante l'esecuzione dei passi rimanenti: -``` +```bash ln -s /opt/remi/php81/root/usr/bin/php /usr/bin/php ``` -Accedere al sito web di [Composer](https://getcomposer.org/download/) e verificare che i passaggi seguenti non siano stati modificati. Eseguite quindi questi comandi da qualche parte sul computer. Una volta terminato, il composer verrà spostato: +Accedere al [sito web di Composer](https://getcomposer.org/download/) e verificare che i passaggi seguenti non siano stati modificati. Eseguite quindi questi comandi da qualche parte sul computer. Una volta fatto questo, potrai spostare il composer: -``` +```php php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" php composer-setup.php @@ -413,13 +414,13 @@ php -r "unlink('composer-setup.php');" Spostatelo in un punto del percorso. Utilizzare `/usr/local/bin/` per questo: -``` +```bash mv composer.phar /usr/local/bin/composer ``` ## Impostazione Web -Una volta installati e configurati tutti i componenti, il passo successivo è quello di completare l'installazione via web. Nella versione di laboratorio, non è stato impostato alcun hostname. Per completare la configurazione, è necessario accedere al server web tramite l'indirizzo IP. +Una volta installati e configurati tutti i componenti, il passo successivo è quello di completare l'installazione via web. Nella versione di laboratorio, non è stato configurato alcun hostname. Per completare la configurazione, è necessario accedere al server web tramite l'indirizzo IP. L'IP della macchina del laboratorio è 192.168.1.140. Per terminare l'installazione, navigare al seguente indirizzo in un browser web: @@ -429,9 +430,9 @@ Se tutto funziona correttamente, segue un reindirizzamento ai controlli di prein ![LibreNMS Prechecks](../images/librenms_prechecks.png) -Sotto il logo LibreNMS si trovano quattro pulsanti. Il primo pulsante a sinistra è per i controlli preliminari. Il pulsante successivo è quello del database. È necessaria la password impostata in precedenza per l'utente del database "librenms". +Sotto il logo LibreNMS si trovano quattro pulsanti. Il primo pulsante a sinistra è per i controlli preliminari. Il pulsante successivo è per il database. È necessaria la password impostata in precedenza per l'utente del database "librenms". -Se ci avete seguito, avete già salvato questo dato in un posto sicuro. Cliccare sul pulsante "Database". È sufficiente inserire "User" e "Password". A questo punto, fare clic sul pulsante "Check Credentials". +Se ci avete seguito, avete già salvato questo documento in un posto sicuro. Cliccare sul pulsante "Database". Sono sufficienti "Utente" e "Password". A questo punto, fare clic sul pulsante "Check Credentials". ![LibreNMS Database](../images/librenms_configure_database.png) @@ -439,15 +440,15 @@ Fare clic sul pulsante "Build Database" se diventa verde. ![LibreNMS Database Status](../images/librenms_configure_database_status.png) -Il pulsante "Create Admin User" sarà ora attivo. Cliccatelo. Viene quindi richiesto il nome di un utente amministratore. Nel laboratorio è "admin." Creare una password per questo utente. +Il pulsante "Create Admin User" sarà ora attivo. Cliccatelo. Viene quindi richiesto il nome di un utente amministratore. In laboratorio è "admin". Creare una password per questo utente. Assicurarsi che la password sia sicura e registrarla in un luogo sicuro, ad esempio in un gestore di password. È necessario aggiungere anche l'indirizzo e-mail dell'utente amministrativo. Al termine, fare clic sul pulsante "Add User". ![LibreNMS Administrative User](../images/librenms_administrative_user.png) -A questo punto apparirà la schermata "Finish Install." Rimarrà solo un elemento per terminare l'installazione, una riga che chiede di "validate your install". +A questo punto apparirà la schermata "Finish Install." Rimarrà solo un elemento per terminare l'installazione, una riga che chiede di "convalidare l'installazione". -Fare clic sul link. Si verificherà un reindirizzamento alla pagina di accesso. Accedere con l'utente amministrativo e la password. +Fare clic sul link. Si verifica un reindirizzamento alla pagina di accesso. Accedere con l'utente amministrativo e la password. ## Aggiungere dispositivi @@ -459,53 +460,53 @@ Anche in questo caso, uno dei presupposti è che si stia utilizzando SNMP v2. Ri Per prima cosa, installare `snmpd` sulla workstation e aggiornare i pacchetti per sicurezza: -``` +```bash sudo update && sudo apt-get upgrade && sudo apt-get install snmpd ``` Successivamente, è necessario modificare il file `snmpd.conf`: -``` +```bash sudo vi /etc/snmpd/snmpd.conf ``` Trovate le righe che descrivono la vostra postazione di lavoro e cambiatele con altre che la identificano: -``` +```bash sysLocation Desktop sysContact Username ``` Quando si installa `snmpd` su Ubuntu, questo si collega solo all'indirizzo locale. Non ascolta l'indirizzo IP della macchina. Questo non permetterà a LibreNMS di connettersi ad esso. È necessario rimuovere questa riga: -``` +```bash agentaddress 127.0.0.1,[::1] ``` -Aggiungete una nuova riga: (in questo esempio, l'indirizzo IP della vostra workstation è 192.168.1.122 e la porta UDP che state impostando è la "161") +Aggiungete una nuova riga: (in questo esempio, l'indirizzo IP della vostra workstation è 192.168.1.122 e la porta UDP che state impostando è "161") -``` +```bash agentAddress udp:127.0.0.1:161,udp:192.168.1.122:161 ``` -È necessario specificare la community string per l'accesso in sola lettura. Trovate le linee sottostanti e commentatele come indicato: +È necessario specificare la community string di accesso in sola lettura. Trovate le linee sottostanti e commentatele come indicato: -``` +```bash #rocommunity public default -V systemonly #rocommunity6 public default -V systemonly ``` Aggiungere una riga: -``` -rocommunity LABone +```bash +rocomunità LABone ``` Salvare le modifiche e uscire. Abilitare e avviare `snmpd`: -``` +```bash sudo systemctl enable snmpd sudo systemctl start snmpd ``` @@ -516,25 +517,25 @@ Se si utilizza un firewall sulle postazioni di lavoro interne, è necessario mod Si presuppone che siate root o che possiate fare `sudo` per elevare i privilegi. È necessario installare alcuni pacchetti: -``` +```bash dnf install net-snmp net-snmp-utils ``` -Creare un file `snmpd.conf`. LibreNMS vuole anche essere in grado di "pingare" il dispositivo, quindi assicuratevi che la porta icmp 8 sia consentita dal server. +Creare un file `snmpd.conf`. Piuttosto che cercare di navigare nel file incluso, spostate questo file per rinominarlo e create un nuovo file vuoto: -``` +```bash mv /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.orig ``` e -``` +```bash vi /etc/snmp/snmpd.conf ``` Copiare il tutto nel nuovo file: -``` +```bash # Map 'LABone' community to the 'AllUser' # sec.name source community com2sec AllUser default LABone @@ -560,18 +561,19 @@ Una volta apportate le modifiche, salvarle e uscire dal file. Abilitare e avviare `snmpd`: -``` +```bash systemctl enable snmpd systemctl start snmpd ``` #### Firewall -Se state gestendo un server, allora **state** gestendo un firewall, giusto? Se si sta eseguendo `firewalld`, si presume che si utilizzi la zona "trusted" e che si voglia consentire tutto il traffico dal server di monitoraggio, 192.168.1.140: +Se si gestisce un server, **si** utilizza un firewall, giusto? Se si utilizza `firewalld`, si presume che si utilizzi la zona "trusted" e che si voglia semplicemente consentire tutto il traffico dal server di monitoraggio, 192.168.1.140: -``` +```bash firewall-cmd --zone=trusted --add-source=192.168.1.140 --permanent ``` + Se la zona "trusted" non è corretta per il vostro ambiente, modificatela in base alle vostre esigenze. Considerate le vostre regole e il loro effetto prima di aggiungerle. ## Aggiungere i dispositivi in Librenms @@ -580,7 +582,7 @@ Dopo aver configurato i dispositivi campione per accettare il traffico SNMP dal ![LibreNMS Add Device](../images/librenms_add_device.png) -Inserite le informazioni utilizzate per i vostri dispositivi di prova. Immettere l'IP della workstation Ubuntu da avviare. Nell'esempio è 192.168.1.122. Aggiungere la stringa di comunità "LABone" nel campo "Community". +Inserite le informazioni utilizzate per i vostri dispositivi di prova. Immettere l'IP della workstation Ubuntu da avviare. Nell'esempio è 192.168.1.122. Aggiungere la community string "LABone" nel campo "Community". Cliccare sul pulsante "Add Device". Se tutto è corretto, il processo si concluderà con successo. @@ -588,7 +590,7 @@ Se si verifica un errore di "failure to add", rivedere l'impostazione SNMP della ## Ricevere avvisi -Come già detto all'inizio, questo documento serve solo per iniziare a utilizzare LibreNMS. Esiste un gran numero di elementi di configurazione aggiuntivi, un'ampia API (Application Programming Interface), un sistema di avvisi che fornisce un gran numero di opzioni per la consegna, chiamate "Transports", e molto altro ancora. +Come già detto all'inizio, questo documento serve solo per iniziare a usare LibreNMS. Esiste un gran numero di elementi di configurazione aggiuntivi, un'ampia API (Application Programming Interface), un sistema di avvisi che fornisce un gran numero di opzioni per la consegna, chiamate "Transports", e molto altro ancora. Questo documento non contiene procedure per la creazione di regole di allerta. Si modificherà invece la regola di avviso incorporata "Device Down! Due to no ICMP response" che è preconfigurato in partenza. Per "Transports" utilizzeremo "Mail", che è semplicemente un'e-mail. Sappiate che non siete limitati a questa segnalazione. @@ -596,7 +598,7 @@ La posta deve essere funzionante per poter utilizzare l'e-mail per il trasporto. ### Transports -È necessario un modo per inviare gli avvisi. Come già detto, LibreNMS supporta un numero enorme di trasporti. L'avviso di posta elettronica, definito come trasporto "Mail", viene utilizzato in questo caso. Per impostare il trasporto: +È necessario un modo per inviare gli avvisi. Come già detto, LibreNMS supporta un numero enorme di trasporti. L'avviso di posta elettronica, definito come trasporto "Mail", è in uso in questo caso. Per impostare il trasporto: 1. Vai al cruscotto 2. Passare il mouse su "Alerts" @@ -639,12 +641,12 @@ Prima di salvare, la regola sarà: ![LibreNMS Alert Rule](../images/librenms_alert_rule.png) -Questi due dispositivi ora vi avviseranno via e-mail se sono inattivi e al momento del ripristino. +Questi due dispositivi ora vi avviseranno via e-mail se sono fuori uso e al momento del ripristino. -## Conclusioni +## Conclusione -LibreNMS è un potente strumento di monitoraggio con una serie completa di funzioni in un'unica applicazione. Questo documento ha _solo_ scalfito la superficie delle sue capacità. Alcune delle schermate più semplici non vengono mostrate. +LibreNMS è un potente strumento di monitoraggio con una serie completa di funzioni in un'unica applicazione. Questo documento ha *appena* scalfito la superficie delle sue capacità. Alcune delle schermate più semplici non vengono mostrate. -Quando si aggiungono i dispositivi, supponendo che tutte le proprietà SNMP siano state impostate correttamente, si iniziano a ricevere i grafici della larghezza di banda, dell'utilizzo della memoria e dell'utilizzo della CPU di ciascun dispositivo. Questo laboratorio non ha mostrato la varietà dei trasporti disponibili oltre a "Mail". +Quando si aggiungono i dispositivi, supponendo che tutte le proprietà SNMP siano state impostate correttamente, si iniziano a ricevere i grafici della larghezza di banda, dell'utilizzo della memoria e dell'utilizzo della CPU su ciascun dispositivo. Questo laboratorio non ha mostrato la varietà dei trasporti disponibili oltre a "Mail". -In questo documento sono state fornite le informazioni necessarie per iniziare a monitorare l'ambiente. LibreNMS richiede un po' di tempo per padroneggiare tutti gli elementi. Per ulteriori informazioni, visitate la [eccellente documentazione](https://docs.librenms.org/) del progetto. +In questo documento sono state fornite le informazioni necessarie per iniziare a monitorare l'ambiente. LibreNMS richiede un po' di tempo per padroneggiare tutti gli elementi. Per ulteriori informazioni, visitate l'[eccellente documentazione](https://docs.librenms.org/) del progetto. diff --git a/docs/guides/package_management/dnf_package_manager.it.md b/docs/guides/package_management/dnf_package_manager.it.md new file mode 100644 index 0000000000..d32d5ff115 --- /dev/null +++ b/docs/guides/package_management/dnf_package_manager.it.md @@ -0,0 +1,714 @@ +--- +title: Gestore di pacchetti Dnf +author: Emre Çamalan +contributors: Steven Spencer, Ganna Zhyrnova +tested_with: 8.9, 9.3 +tags: + - Dnf + - Yum + - Rpm + - Package Manager +--- + +# Gestore di pacchetti DNF + +DNF, o Dandified Yum, è un gestore di pacchetti presente in alcune distribuzioni Linux. È la versione di nuova generazione del gestore di pacchetti Yum (Yellowdog Updater, Modified), ampiamente utilizzato nei sistemi basati su Red Hat. Il DNF è stato introdotto in sostituzione di Yum per risolvere alcune limitazioni e migliorare le prestazioni. + +DNF è comunemente usato in Rocky Linux, Fedora, RHEL (Red Hat Enterprise Linux) 8 e successive e in altre distribuzioni Linux che lo hanno adottato come gestore di pacchetti. L'obiettivo è fornire a utenti e amministratori un'esperienza di gestione dei pacchetti più moderna ed efficiente. + +## Prerequisiti + +- Per tutte le versioni di Rocky Linux, la possibilità di usare `sudo` per elevare i privilegi. + +## Installazione dei package + +Potete usare il gestore di pacchetti DNF sul sistema operativo Rocky Linux proprio come fate con altri gestori di pacchetti per installare, rimuovere e aggiornare i pacchetti che desiderate. + +```bash +sudo dnf install package_name1 package_name2 package_name3 +``` + +Per installare `perl`: + +```bash +sudo dnf install perl +Last metadata expiration check: 0:57:51 ago on Mon 05 Feb 2024 08:31:09 PM UTC. +Dependencies resolved. +============================================================================================================================== + Package Architecture Version Repository Size +============================================================================================================================== +Installing: + perl x86_64 4:5.32.1-480.el9 appstream 13 k +Installing dependencies: + annobin x86_64 12.12-1.el9 appstream 977 k + binutils x86_64 2.35.2-42.el9 baseos 4.5 M + binutils-gold x86_64 2.35.2-42.el9 baseos 734 k + cpp x86_64 11.4.1-2.1.el9 appstream 11 M + dwz x86_64 0.14-3.el9 appstream 127 k + efi-srpm-macros noarch 6-2.el9_0 appstream 22 k + elfutils-debuginfod-client x86_64 0.189-3.el9 baseos 36 k + file x86_64 5.39-14.el9 baseos 48 k + fonts-srpm-macros noarch 1:2.0.5-7.el9.1 appstream 27 k + gcc x86_64 11.4.1-2.1.el9 appstream 32 M + gcc-c++ x86_64 11.4.1-2.1.el9 appstream 13 M + gcc-plugin-annobin x86_64 11.4.1-2.1.el9 appstream 48 k + ghc-srpm-macros noarch 1.5.0-6.el9 appstream 7.8 k + glibc-devel x86_64 2.34-83.el9.7 appstream 50 k + glibc-headers x86_64 2.34-83.el9.7 appstream 450 k + go-srpm-macros noarch 3.2.0-2.el9 appstream 26 k + kernel-headers x86_64 5.14.0-362.18.1.el9_3 appstream 6.3 M + kernel-srpm-macros noarch 1.0-13.el9 appstream 15 k + libdatrie x86_64 0.2.13-4.el9 appstream 32 k + libmpc x86_64 1.2.1-4.el9 appstream 61 k + libpkgconf x86_64 1.7.3-10.el9 baseos 35 k + +... (some packages not shown) + +Installing weak dependencies: + perl-CPAN-DistnameInfo noarch 0.12-23.el9 appstream 14 k + perl-Encode-Locale noarch 1.05-21.el9 appstream 19 k + perl-Term-Size-Any noarch 0.002-35.el9 appstream 13 k + perl-TermReadKey x86_64 2.38-11.el9 appstream 36 k + perl-Unicode-LineBreak x86_64 2019.001-11.el9 appstream 120 k + +Transaction Summary +============================================================================================================================== +Install 206 Packages + +Total download size: 111 M +Installed size: 343 M +Is this ok [y/N]: +``` + +L'installazione di un gruppo di pacchetti, come per **Xfce desktop** o **Kde desktop**, e così via, è simile: + +```bash +sudo dnf group install xfce +``` + +Che genererà un risultato come questo: + +```bash +sudo dnf group install xfce +Last metadata expiration check: 1:04:31 ago on Mon 05 Feb 2024 08:31:09 PM UTC. +Dependencies resolved. +======================================================================================================================================================================================================================================================== + Package Architecture Version Repository Size +======================================================================================================================================================================================================================================================== +Installing group/module packages: + +Thunar x86_64 4.18.6-2.el9 epel 1.8 M + gdm x86_64 1:40.1-21.el9 appstream 836 k + network-manager-applet x86_64 1.26.0-2.el9 appstream 197 k + openssh-askpass x86_64 8.7p1-34.el9 appstream 21 k + thunar-archive-plugin x86_64 0.5.0-2.el9 epel 93 k + thunar-volman x86_64 4.18.0-2.el9 epel 210 k + tumbler x86_64 4.18.1-1.el9 epel 237 k + xfce-polkit x86_64 0.3-8.el9 epel 24 k + xfce4-appfinder x86_64 4.18.0-2.el9 epel 285 k + xfce4-panel x86_64 4.18.4-1.el9 epel 1.2 M + xfce4-power-manager x86_64 4.18.2-1.el9 epel 733 k + xfce4-pulseaudio-plugin x86_64 0.4.7-1.el9 epel 131 k + xfce4-screensaver x86_64 4.18.2-1.el9 epel 305 k + xfce4-session x86_64 4.18.3-1.el9 epel 541 k + xfce4-settings x86_64 4.18.2-2.el9 epel 1.2 M + + ... (some packages not shown) + +Installing Groups: + Xfce + +Transaction Summary +======================================================================================================================================================================================================================================================== +Install 402 Packages + +Total download size: 317 M +Installed size: 1.1 G +Is this ok [y/N]: +``` + +Come si può vedere, ci sono diversi modi per installare il gruppo desktop KDE: + +```bash +sudo dnf group install "KDE Plasma Workspaces" +sudo dnf group install kde-desktop-environment +sudo dnf install @kde-desktop-environment +``` + +## Aggiornare e aggiornare i pacchetti + +### Aggiornamento e upgrade + +Se decidete di aggiornare i pacchetti, usate questo codice nel terminale: + +```bash + sudo dnf update +``` + +Che potrebbe mostrare qualcosa di simile: + +```bash +sudo dnf update +Last metadata expiration check: 1:12:59 ago on Mon 05 Feb 2024 08:31:09 PM UTC. +Dependencies resolved. +======================================================================================================================================================================================================================================================== + Package Architecture Version Repository Size +======================================================================================================================================================================================================================================================== +Upgrading: + NetworkManager x86_64 1:1.44.0-4.el9_3 baseos 2.2 M + NetworkManager-libnm x86_64 1:1.44.0-4.el9_3 baseos 1.8 M + gnutls x86_64 3.7.6-23.el9_3.3 baseos 1.0 M + openssl x86_64 1:3.0.7-25.el9_3 baseos 1.2 M + openssl-libs x86_64 1:3.0.7-25.el9_3 baseos 2.1 M + python3 x86_64 3.9.18-1.el9_3.1 baseos 25 k + python3-libs x86_64 3.9.18-1.el9_3.1 baseos 7.3 M + python3-rpm x86_64 4.16.1.3-27.el9_3 baseos 64 k + rocky-gpg-keys noarch 9.3-1.2.el9 baseos 13 k + rocky-release noarch 9.3-1.2.el9 baseos 23 k + rocky-repos noarch 9.3-1.2.el9 baseos 13 k + rpm x86_64 4.16.1.3-27.el9_3 baseos 485 k + rpm-build-libs x86_64 4.16.1.3-27.el9_3 baseos 87 k + rpm-libs x86_64 4.16.1.3-27.el9_3 baseos 307 k + rpm-plugin-systemd-inhibit x86_64 4.16.1.3-27.el9_3 appstream 15 k + rpm-sign-libs x86_64 4.16.1.3-27.el9_3 baseos 19 k + systemd x86_64 252-18.el9.0.1.rocky baseos 3.9 M + systemd-libs x86_64 252-18.el9.0.1.rocky baseos 651 k + systemd-pam x86_64 252-18.el9.0.1.rocky baseos 259 k + systemd-rpm-macros noarch 252-18.el9.0.1.rocky baseos 47 k + systemd-udev x86_64 252-18.el9.0.1.rocky baseos 1.8 M + tzdata noarch 2023d-1.el9 baseos 433 k + +Transaction Summary +======================================================================================================================================================================================================================================================== +Upgrade 22 Packages + +Total download size: 24 M +Is this ok [y/N] +``` + +Il comando `dnf upgrade` produce gli stessi risultati del comando `dnf update`. + +```bash +sudo dnf upgrade +``` + +### Aggiornare un singolo pacchetto + +```bash + sudo dnf upgrade package_name +``` + +Per esempio, se si vuole aggiornare `openssl`, usare `dnf`: + +```bash +dnf upgrade openssl +``` + +Che potrebbe mostrare: + +```bash +dnf upgrade openssl +Last metadata expiration check: 1:21:40 ago on Mon 05 Feb 2024 08:31:09 PM UTC. +Dependencies resolved. +========================================================================================================================================================================================================================================================Package Architecture Version Repository Size +======================================================================================================================================================================================================================================================== +Upgrading: + openssl x86_64 1:3.0.7-25.el9_3 baseos 1.2 M + openssl-libs x86_64 1:3.0.7-25.el9_3 baseos 2.1 M + +Transaction Summary +======================================================================================================================================================================================================================================================== +Upgrade 2 Packages + +Total download size: 3.3 M +Is this ok [y/N]: +``` + +Se si sono usati i comandi `sudo dnf update` o `sudo dnf upgrade` in precedenza, l'intero sistema è aggiornato e non ci saranno pacchetti da aggiornare manualmente. + +## Rimozione dei pacchetti + +Come per l'installazione dei pacchetti, si può usare `dnf` per disinstallare i pacchetti. Tuttavia, le dipendenze sono fondamentali nel sistema Linux e se non si è a conoscenza di esse, si raccomanda di non rimuovere un pacchetto. Ad esempio, un pacchetto installato erroneamente può avere 20 dipendenze e quando si rimuove quel pacchetto, il sistema rimuove anche i 20 pacchetti condivisi con altri programmi. Di conseguenza, alcuni programmi precedentemente funzionanti potrebbero diventare inutilizzabili. Inoltre, se si pensa di poter risolvere il problema reinstallando lo stesso pacchetto, è possibile che si verifichino problemi di conflitto tra versione e vecchia versione. Si sia prudenti a questo proposito. + +!!! Warning + +``` +DNF non può rimuovere un pacchetto senza rimuovere i pacchetti che dipendono da esso. +``` + +La sintassi per rimuovere i pacchetti è: + +```bash +sudo dnf remove package_name1 package_name2 +``` + +```bash +sudo dnf remove wget +``` + +!!! warning + +``` +Attenzione, DNF mostra le dipendenze dei pacchetti! Se si rimuove Perl, si rimuovono anche i pacchetti che dipendono da Perl! +``` + +```bash +sudo dnf remove perl +Dependencies resolved. +======================================================================================================================================================================================================================================================== + Package Architecture Version Repository Size +======================================================================================================================================================================================================================================================== +Removing: + perl x86_64 4:5.32.1-480.el9 @appstream 0 +Removing unused dependencies: + annobin x86_64 12.12-1.el9 @appstream 1.0 M + binutils x86_64 2.35.2-42.el9 @baseos 24 M + binutils-gold x86_64 2.35.2-42.el9 @baseos 2.0 M + cpp x86_64 11.4.1-2.1.el9 @appstream 29 M + dwz x86_64 0.14-3.el9 @appstream 275 k + efi-srpm-macros noarch 6-2.el9_0 @appstream 40 k + elfutils-debuginfod-client x86_64 0.189-3.el9 @baseos 60 k + file x86_64 5.39-14.el9 @baseos 100 k + fonts-srpm-macros noarch 1:2.0.5-7.el9.1 @appstream 55 k + gcc x86_64 11.4.1-2.1.el9 @appstream 85 M + gcc-c++ x86_64 11.4.1-2.1.el9 @appstream 32 M + gcc-plugin-annobin x86_64 11.4.1-2.1.el9 @appstream 52 k + ghc-srpm-macros noarch 1.5.0-6.el9 @appstream 535 + glibc-devel x86_64 2.34-83.el9.7 @appstream 157 k + glibc-headers x86_64 2.34-83.el9.7 @appstream 2.1 M + go-srpm-macros noarch 3.2.0-2.el9 @appstream 60 k + kernel-headers x86_64 5.14.0-362.18.1.el9_3 @appstream 5.8 M + kernel-srpm-macros noarch 1.0-13.el9 @appstream 17 k + libdatrie x86_64 0.2.13-4.el9 @appstream 58 k + libmpc x86_64 1.2.1-4.el9 @appstream 135 k + libpkgconf x86_64 1.7.3-10.el9 @baseos 74 k + libstdc++-devel x86_64 11.4.1-2.1.el9 @appstream 13 M + libthai x86_64 0.1.28-8.el9 @appstream 760 k + libxcrypt-devel x86_64 4.4.18-3.el9 @appstream 30 k + +... (some package removal output not shown) + +redhat-rpm-config noarch 201-1.el9 @appstream 187 k + rust-srpm-macros noarch 17-4.el9 @appstream 2.4 k + sombok x86_64 2.4.0-16.el9 @appstream 136 k + systemtap-sdt-devel x86_64 4.9-3.el9 @appstream 198 k + +Transaction Summary +======================================================================================================================================================================================================================================================== +Remove 206 Packages + +Freed space: 343 M +Is this ok [y/N]: +``` + +La rimozione di un gruppo ha la seguente sintassi. Si noti che la rimozione del gruppo KDE è possibile in diversi modi: + +```bash +sudo dnf group remove "KDE Plasma Workspaces" +sudo dnf group remove kde-desktop-environment +sudo dnf remove @kde-desktop-environment +``` + +## DNF list + +È possibile elencare qualsiasi pacchetto, anche se non si conosce il nome completo del pacchetto, eseguendo questo comando: + +```bash +sudo dnf list kernel* + +Last metadata expiration check: 1:44:26 ago on Mon 05 Feb 2024 08:31:09 PM UTC. +Installed Packages +kernel-headers.x86_64 5.14.0-362.18.1.el9_3 @appstream +kernel-srpm-macros.noarch 1.0-13.el9 @appstream +Available Packages +kernel.x86_64 5.14.0-362.18.1.el9_3 baseos +kernel-abi-stablelists.noarch 5.14.0-362.18.1.el9_3 baseos +kernel-core.x86_64 5.14.0-362.18.1.el9_3 baseos +kernel-cross-headers.x86_64 5.14.0-362.18.1.el9_3 crb +kernel-debug.x86_64 5.14.0-362.18.1.el9_3 baseos +kernel-debug-core.x86_64 5.14.0-362.18.1.el9_3 baseos +kernel-debug-devel.x86_64 5.14.0-362.18.1.el9_3 appstream +kernel-debug-devel-matched.x86_64 5.14.0-362.18.1.el9_3 appstream +kernel-debug-modules.x86_64 5.14.0-362.18.1.el9_3 baseos +kernel-debug-modules-core.x86_64 5.14.0-362.18.1.el9_3 baseos +kernel-debug-modules-extra.x86_64 5.14.0-362.18.1.el9_3 baseos +kernel-debug-uki-virt.x86_64 5.14.0-362.18.1.el9_3 baseos +kernel-devel.x86_64 5.14.0-362.18.1.el9_3 appstream +kernel-devel-matched.x86_64 5.14.0-362.18.1.el9_3 appstream +kernel-doc.noarch 5.14.0-362.18.1.el9_3 appstream +kernel-modules.x86_64 5.14.0-362.18.1.el9_3 baseos +kernel-modules-core.x86_64 5.14.0-362.18.1.el9_3 baseos +kernel-modules-extra.x86_64 5.14.0-362.18.1.el9_3 baseos +kernel-rpm-macros.noarch 185-13.el9 appstream +kernel-tools.x86_64 5.14.0-362.18.1.el9_3 baseos +kernel-tools-libs.x86_64 5.14.0-362.18.1.el9_3 baseos +kernel-tools-libs-devel.x86_64 5.14.0-362.18.1.el9_3 crb +kernel-uki-virt.x86_64 5.14.0-362.18.1.el9_3 baseos +kernelshark.x86_64 1:1.2-10.el9 appstream +``` + +Con questo comando si elencano le informazioni sugli strumenti del kernel installati e disponibili, sui moduli e sulle informazioni di corrispondenza: + +```bash +sudo dnf list kernel-tools\* kernel-modules\* + +Last metadata expiration check: 1:48:22 ago on Mon 05 Feb 2024 08:31:09 PM UTC. +Available Packages +kernel-modules.x86_64 5.14.0-362.18.1.el9_3 baseos +kernel-modules-core.x86_64 5.14.0-362.18.1.el9_3 baseos +kernel-modules-extra.x86_64 5.14.0-362.18.1.el9_3 baseos +kernel-tools.x86_64 5.14.0-362.18.1.el9_3 baseos +kernel-tools-libs.x86_64 5.14.0-362.18.1.el9_3 baseos +kernel-tools-libs-devel.x86_64 5.14.0-362.18.1.el9_3 crb +``` + +Elenca tutti i pacchetti installati e disponibili con: + +```bash +dnf list all +``` + +Si otterrà così un elenco estremamente lungo di file. Quanti file ci sono in Rocky Linux? + +Utilizzate questo comando per scoprirlo: + +```bash +dnf list all | wc -l +28297 +``` + +Elenca tutti i pacchetti installati sul sistema Rocky Linux: + +```bash +sudo dnf list installed +``` + +È possibile filtrare anche in base a un particolare pacchetto: + +```bash +sudo dnf list installed "sudo*" +Installed Packages +sudo.x86_64 1.9.5p2-9.el9 baseos +``` + +Elenca tutti i pacchetti disponibili in tutti i repository abilitati con: + +```bash +sudo dnf list available "perl" +Last metadata expiration check: 1:59:53 ago on Mon 05 Feb 2024 08:31:09 PM UTC. +Available Packages +perl.x86_64 4:5.32.1-480.el9 appstream +``` + +Elenca tutti i gruppi di pacchetti: + +```bash +sudo dnf group list +Last metadata expiration check: 2:01:20 ago on Mon 05 Feb 2024 08:31:09 PM UTC. +Available Environment Groups: + Server with GUI + Server + Minimal Install + Workstation + KDE Plasma Workspaces + Custom Operating System + Virtualization Host +Available Groups: + Fedora Packager + VideoLAN Client + Xfce + Legacy UNIX Compatibility + Console Internet Tools + Container Management + Development Tools + .NET Development + Graphical Administration Tools + Headless Management + Network Servers + RPM Development Tools + Scientific Support + Security Tools + Smart Card Support + System Tool +``` + +Elencare le informazioni sul repository dei pacchetti che fornisce per ogni repository abilitato. + +```bash +sudo dnf repolist + +repo id repo name +appstream Rocky Linux 9 - AppStream +baseos Rocky Linux 9 - BaseOS +crb Rocky Linux 9 - CRB +epel Extra Packages for Enterprise Linux 9 - x86_64 +epel-cisco-openh264 Extra Packages for Enterprise Linux 9 openh264 (From Cisco) - x86_64 +extras Rocky Linux 9 - Extras +``` + +## DNF list history + +Con questo comando è possibile visualizzare la cronologia dell'elenco DNF: + +```bash +sudo dnf history list +ID | Command line | Date and time | Action(s) | Altered +------------------------------------------------------------------------------------------------------------------------------ + 23 | remove perl | 2024-02-05 22:30 | Removed | 206 + 22 | install perl | 2024-02-05 22:05 | Install | 206 + 21 | install sqlite | 2024-01-27 15:49 | I, U | 2 + 20 | install tar gzip | 2024-01-27 14:27 | Install | 1 + 19 | install htop | 2024-01-27 14:24 | Install | 3 + 18 | install yarnpkg | 2024-01-27 14:21 | Install | 1 + 17 | install nodejs mariadb-server npm | 2024-01-27 14:14 | Install | 81 + 16 | upgrade | 2023-12-20 16:02 | Upgrade | 2 + 15 | install wget | 2023-12-20 15:38 | Install | 1 + 14 | remove iptables* | 2023-12-19 15:22 | Removed | 10 + 13 | install iptables-utils | 2023-12-19 15:09 | Install | 1 + 12 | install iptables-services | 2023-12-19 15:08 | Install | 1 + 11 | install iptables | 2023-12-19 15:02 | Install | 8 < + 10 | remove firewalld | 2023-12-19 15:02 | Removed | 20 >E + 9 | install firewalld | 2023-12-19 14:18 | Install | 20 EE + 8 | install postfix s-nail | 2023-12-14 15:28 | Install | 3 + 7 | upgrade | 2023-11-30 14:30 | I, U | 128 EE + 6 | install epel-release | 2023-11-30 14:30 | Install | 8 EE + 5 | install which | 2023-01-24 14:31 | Install | 1 + 4 | install zip | 2023-01-20 13:28 | Install | 2 + 3 | -y --allowerasing install NetworkManager | 2023-01-19 02:47 | Install | 7 EE + 2 | -y --allowerasing install cronie cronie-noanacron curl dhclient glibc-l | 2023-01-19 02:42 | Install | 42 EE + 1 | --installroot=/rootfs -y --releasever=9 --skip-broken install basesyste | 2023-01-19 02:41 | Install | 147 EE + +``` + +Uno degli aspetti più vantaggiosi della cronologia DNF è la possibilità di annullare (undo) e ripetere (redo) le transazioni. + +```bash +dnf history undo id +``` + +```bash +dnf history redo id +``` + +```bash +sudo dnf history redo 20 + +Last metadata expiration check: 2:23:20 ago on Mon 05 Feb 2024 08:31:09 PM UTC. +Dependencies resolved. +Nothing to do. +Complete! +Warning, the following problems occurred while running a transaction: + Package "tar.x86_64" is already installed for action "Install". +``` + +Il comando `sudo dnf history redo 20` usato sopra, tentando di ripetere il comando con ID:20 dall'elenco della cronologia DNF, per reinstallare `tar`. Naturalmente, l'operazione è stata visualizzata come “già installata”, poiché era già stata installata in precedenza. + +### Ricerca di pacchetti + +Cercate qualsiasi pacchetto eseguendo questo comando: + +```bash +sudo dnf search wget + +Last metadata expiration check: 2:27:09 ago on Mon 05 Feb 2024 08:31:09 PM UTC. +================================================= Name Exactly Matched: wget ================================================= +wget.x86_64 : A utility for retrieving files using the HTTP or FTP protocols +================================================ Name & Summary Matched: wget ================================================ +perl-HTTP-Tinyish-Wget.noarch : HTTP::Tinyish wget backend +``` + +Per cercare più di un pacchetto in un'unica ricerca, eseguite questo comando: + +```bash +sudo dnf search all yum vim +``` + +Il comando restituirà un lungo elenco di pacchetti che includono “yum” e “vim”, come nome del pacchetto o come descrizione di altri pacchetti. + +### Informazioni sui pacchetti DNF + +Per visualizzare le informazioni sui pacchetti, utilizzate questo comando: + +```bash +sudo dnf info perl + +Last metadata expiration check: 2:33:15 ago on Mon 05 Feb 2024 08:31:09 PM UTC. +Available Packages +Name : perl +Epoch : 4 +Version : 5.32.1 +Release : 480.el9 +Architecture : x86_64 +Size : 13 k +Source : perl-5.32.1-480.el9.src.rpm +Repository : appstream +Summary : Practical Extraction and Report Language +URL : https://www.perl.org/ +License : GPL+ or Artistic +Description : Perl is a high-level programming language with roots in C, sed, awk and shell + : scripting. Perl is good at handling processes and files, and is especially + : good at handling text. Perl's hallmarks are practicality and efficiency. + : While it is used to do a lot of different things, Perl's most common + : applications are system administration utilities and web programming. + : + : This is a metapackage with all the Perl bits and core modules that can be + : found in the upstream tarball from perl.org. + : + : If you need only a specific feature, you can install a specific package + : instead. E.g. to handle Perl scripts with /usr/bin/perl interpreter, + : install perl-interpreter package. See perl-interpreter description for more + : details on the Perl decomposition into packages. + +``` + +Per visualizzare le informazioni su tutti i pacchetti disponibili, sia installati che disponibili in un repository, usare questo comando: + +```bash +sudo dnf repoquery perl --info +``` + +Anche se non è sempre così, nel caso precedente il risultato di questo comando è identico a quello del comando `sudo dnf info perl`. + +## Configurazione delle repository in DNF + +Il file di configurazione di DNF e delle utilità associate si trova in `/etc/dnf/dnf.conf`. +All'interno di questo file, c'è una sezione obbligatoria [main] che consente la configurazione delle opzioni DNF con effetti globali. Inoltre, può includere una o più sezioni [repository], che consentono di impostare opzioni specifiche per il repository. + +Qualsiasi valore specificato nelle sezioni [repository] del file \`/etc/dnf/dnf.conf' avrà la precedenza sui valori impostati nella sezione [main]. + +```bash +cat /etc/dnf/dnf.conf + +[main] +gpgcheck=1 +installonly_limit=3 +clean_requirements_on_remove=True +best=True +skip_if_unavailable=False +``` + +### config-manager di DNF + +Per recuperare un elenco completo delle opzioni di configurazione con i rispettivi valori e le informazioni sui repository, utilizzare il comando `dnf config-manager` con l'opzione `--dump`. + +```bash +dnf config-manager --dump + +sudo dnf config-manager --dump +============================================================ main ============================================================ +[main] +allow_vendor_change = 1 +assumeno = 0 +assumeyes = 0 +autocheck_running_kernel = 1 +bandwidth = 0 +best = 1 +bugtracker_url = https://bugs.rockylinux.org/ +cachedir = /var/cache/dnf +cacheonly = 0 +check_config_file_age = 1 +clean_requirements_on_remove = 1 +color = auto +color_list_available_downgrade = magenta +color_list_available_install = bold,cyan +color_list_available_reinstall = bold,underline,green +color_list_available_upgrade = bold,blue +color_list_installed_extra = bold,red +color_list_installed_newer = bold,yellow +color_list_installed_older = yellow +color_list_installed_reinstall = cyan +color_search_match = bold,magenta +color_update_installed = red +color_update_local = green +color_update_remote = bold,green +config_file_path = /etc/dnf/dnf.conf +countme = 0 +debug_solver = 0 +debuglevel = 2 +defaultyes = 0 +deltarpm = 1 +deltarpm_percentage = 75 +disable_excludes = +diskspacecheck = 1 +enabled = 1 +enablegroups = 1 +errorlevel = 3 +exclude = +exclude_from_weak = +exclude_from_weak_autodetect = 1 +excludepkgs = +exit_on_lock = 0 +fastestmirror = 0 +gpgcheck = 1 +gpgkey_dns_verification = 0 +group_package_types = mandatory, default, conditional +history_list_view = commands +history_record = 1 +history_record_packages = dnf, rpm +ignorearch = 0 +includepkgs = +install_weak_deps = 1 +installonly_limit = 3 +installonlypkgs = kernel, kernel-PAE, installonlypkg(kernel), installonlypkg(kernel-module), installonlypkg(vm), multiversion(kernel) +installroot = / +ip_resolve = whatever +keepcache = 0 +localpkg_gpgcheck = 0 +log_compress = 0 +log_rotate = 4 +log_size = 1048576 +logdir = /var/log +logfilelevel = 9 +max_downloads_per_mirror = 3 +max_parallel_downloads = 3 +metadata_expire = 172800 +metadata_timer_sync = 10800 +minrate = 1000 +module_obsoletes = 0 +module_stream_switch = 0 +multilib_policy = best +obsoletes = 1 +password = +persistdir = /var/lib/dnf +pluginconfpath = /etc/dnf/plugins +pluginpath = /usr/lib/python3.9/site-packages/dnf-plugins +plugins = 1 +protect_running_kernel = 1 +protected_packages = dnf, setup, systemd, systemd-udev, dnf, yum, sudo, setup, systemd, systemd-udev, dnf, yum, sudo +proxy = +proxy_auth_method = any +proxy_sslcacert = +proxy_sslclientcert = +proxy_sslclientkey = +proxy_sslverify = 1 +recent = 7 +repo_gpgcheck = 0 +reposdir = /etc/yum.repos.d, /etc/yum/repos.d, /etc/distro.repos.d +reset_nice = 1 +retries = 10 +rpmverbosity = info +showdupesfromrepos = 0 +skip_broken = 0 +skip_if_unavailable = 0 +sslcacert = +sslclientcert = +sslclientkey = +sslverify = 1 +sslverifystatus = 0 +strict = 1 +system_cachedir = /var/cache/dnf +throttle = 0 +timeout = 30 +transformdb = 1 +tsflags = +upgrade_group_objects_upgrade = 1 +user_agent = libdnf (Rocky Linux 9.3; generic; Linux.x86_64) +username = +varsdir = /etc/yum/vars, /etc/dnf/vars +zchunk = 1 + +``` + +## Conclusione + +Rocky linux utilizza DNF, il sostituto di nuova generazione di YUM. In questa pagina sono stati mostrati esempi di utilizzo del DNF di base. Per ulteriori informazioni, consultare la [documentazione ufficiale per DNF](https://dnf.readthedocs.io/en/latest/index.html). diff --git a/docs/guides/package_management/package_build_troubleshooting.it.md b/docs/guides/package_management/package_build_troubleshooting.it.md index 6473262093..e05e3f7abb 100644 --- a/docs/guides/package_management/package_build_troubleshooting.it.md +++ b/docs/guides/package_management/package_build_troubleshooting.it.md @@ -6,11 +6,11 @@ title: Creazione del Pacchetto & Risoluzione dei Problemi Questo articolo è stato scritto all'inizio del 2021, durante l'avvio di Rocky Linux. Il contenuto di questa pagina è stato conservato per motivi storici, ma è stato leggermente modificato per correggere i collegamenti, fornire un contesto o rimuovere le istruzioni non più pertinenti per evitare confusione. Questo documento sarà archiviato. -# Per prima cosa, familiarizzare con lo strumento di costruzione Mock: +# Per prima cosa, familiarizzare con lo strumento di costruzione Mock Una volta superata, la pagina tecnica e introduttiva più importante per il nostro sforzo di debug dei pacchetti è questa: -https://wiki.rockylinux.org/archive/legacy/mock_building_guide/ +[https://wiki.rockylinux.org/archive/legacy/mock_building_guide/](https://wiki.rockylinux.org/archive/legacy/mock_building_guide/) Stiamo usando il programma "mock" per eseguire le nostre build, proprio come farà la vera infrastruttura Rocky. Dovreste installarlo e abituarvi ad usarlo. Utilizzate questa guida per iniziare, spiega un po' cosa speriamo di ottenere e perché dobbiamo costruire tutti questi pacchetti in un ordine specifico. @@ -20,7 +20,6 @@ Mock è davvero ottimo, in quanto è un programma facile da chiamare che costrui Utilizzare le configurazioni mock per Rocky Linux fornite dal pacchetto `mock` di EPEL. - ## Introduzione - Cosa bisogna fare L'area in cui abbiamo più bisogno di aiuto in questo momento, e il modo più semplice per contribuire, è quello di aiutare a risolvere i problemi di compilazione dei pacchetti che falliscono. @@ -39,4 +38,4 @@ Esaminare l'errore o gli errori. Capire cosa sta succedendo e come risolverlo. Può assumere la forma di impostazioni speciali di mock o di una patch aggiunta al programma + specfile. Segnalate le vostre scoperte al canale #Dev/Packaging e qualcuno le registrerà nella pagina Wiki Package_Error_Tracking linkata sopra. -L'idea è di ridurre la pagina Build Failures e di aumentare la pagina Package_Error_Tracking. Se necessario, verranno apportate delle correzioni di build al nostro repo di patch per i diversi pacchetti che si trova qui: https://git.rockylinux.org/staging/patch. +L'idea è di ridurre la pagina Build Failures e di aumentare la pagina Package_Error_Tracking. Se necessario, verranno apportate delle correzioni di build al nostro repo di patch per i diversi pacchetti, che si trova qui: . diff --git a/docs/guides/repositories/pulp_fetch_upload.it.md b/docs/guides/repositories/pulp_fetch_upload.it.md new file mode 100644 index 0000000000..0e409ee26e --- /dev/null +++ b/docs/guides/repositories/pulp_fetch_upload.it.md @@ -0,0 +1,103 @@ +--- +title: Recuperare e distribuire il repository RPM con Pulp +author: David Gomez +contributors: Steven Spencer, Ganna Zhyrnova +tested with: 9.2 +tags: + - Fetch + - Distribute + - RPM + - Repository + - Pulp +--- + +## Introduzione + +Gli sviluppatori che utilizzano Rocky Linux hanno spesso bisogno di diversi repository RPM remoti per supportare le loro operazioni. Pulp è un progetto open source che può aiutare gli sviluppatori a soddisfare questa esigenza, facilitando il reperimento e la distribuzione di diversi repository RPM. Questa guida mostra un semplice esempio di utilizzo di Pulp per prelevare BaseOS e AppStream dal vault di Rocky Linux. + +## Requisiti + +- Un sistema Rocky Linux +- In grado di eseguire container + +## Configurazione - Singolo Container + +Esistono molte configurazioni possibili per Pulp, ma questa guida utilizzerà lo scenario di distribuzione di un singolo contenitore per facilitare l'illustrazione. Scegliete una directory per Pulp e create le seguenti directory e file. + +```bash +mkdir -p settings/certs pulp_storage pgsql containers +echo "CONTENT_ORIGIN='http://$(hostname):8080'" >> settings/settings.py +``` + +Se si abilita SELinux, si può eseguire quanto segue per distribuire Pulp. Se SELinux non è abilitato, si può rimuovere il suffisso `:Z' dalle righe `--volume': + +```bash +$ podman run --detach \ + --publish 8080:80 \ + --name pulp \ + --volume "$(pwd)/settings":/etc/pulp:Z \ + --volume "$(pwd)/pulp_storage":/var/lib/pulp:Z \ + --volume "$(pwd)/pgsql":/var/lib/pgsql:Z \ + --volume "$(pwd)/containers":/var/lib/containers:Z \ + --device /dev/fuse \ + pulp/pulp +``` + +Se navighi su `http://localhost:8080/pulp/content/`, dovresti ora vedere l' “Indice di /pulp/content/” che al momento è vuoto. Alla fine di questa guida, i repository verranno riempiti con i propri repository. + +![empty_index](images/empty_pulp_index.png) + +## Creare Remotes Pulp + +Considerate i Pulp remotes come repository remoti di sorgenti. In questo caso, i repository remoti dei sorgenti sono BaseOS e AppStream dal vault di Rocky Linux 9.2. Questi remotes verranno utilizzati per sincronizzarsi con i repository creati con Pulp. Per ulteriori informazioni sulle politiche remote, consultare la [Documentazione ufficiale di Pulp](https://pulpproject.org/). + +```bash +pulp rpm remote create --name "rocky_92_appstream_vault" --url "https://dl.rockylinux.org/vault/rocky/9.2/AppStream/x86_64/os/" --policy on_demand +pulp rpm remote create --name "rocky_92_baseos_vault" --url "https://dl.rockylinux.org/vault/rocky/9.2/BaseOS/x86_64/os/" --policy on_demand +``` + +## Copie del Repository Pulp + +Si tratta di copie one-to-one dei repository di BaseOS e AppStream dal caveau di Rocky Linux 9.2. Se si conoscono i remote da cui si vuole usare la sincronizzazione per i repository, è possibile aggiungerli al momento della creazione del repository. Altrimenti, se non si sa quali remote utilizzare o se tali remote possono cambiare, si possono escludere i remote. Per questa guida, la dichiarazione dei remote avviene al momento della creazione del repository. + +```bash +pulp rpm repository create --name "R92_AppStream_Vault" --remote "rocky_92_appstream_vault" +pulp rpm repository create --name "R92_BaseOS_Vault" --remote "rocky_92_baseos_vault" +``` + +## Copie di Pulp Sync + +!!! note + + È importante aggiungere “--skip-type treeinfo”. Altrimenti, invece di avere solo BaseOS o AppStream, si finisce per avere uno strano mix di entrambi. Questo è probabilmente dovuto a un problema con i repository che sono chiusi per dipendenza. Se il telecomando non è stato specificato prima, è possibile aggiungerlo. Se è stato aggiunto al momento della creazione, non è necessario menzionarlo nella sincronizzazione, come è implicito. + +```bash +pulp rpm repository sync --name "R92_AppStream_Vault" --skip-type treeinfo +pulp rpm repository sync --name "R92_BaseOS_Vault" --skip-type treeinfo +``` + +## Pubblicazioni Pulp Publish + +Una volta sincronizzati i repository dai remote, si dovranno creare le pubblicazioni da questi repository da servire alle distribuzioni. Finora si è potuto usare solo i nomi dei remote e dei repository, ma Pulp si basa anche su `hrefs` e si possono usare in modo intercambiabile. Dopo aver creato la pubblicazione, assicurarsi di prendere nota del valore `pulp_href` di ciascuna, poiché sarà necessario per il passo successivo. + +```bash +pulp rpm publication create --repository "R92_AppStream_Vault" +pulp rpm publication create --repository "R92_BaseOS_Vault" +``` + +## Pulp Crea Distribuzioni + +Con il `pulp_href` della fase di pubblicazione precedente, si può ora servire il contenuto a una distribuzione. Questo contenuto verrà quindi visualizzato sotto `http://localhost:8080/pulp/content/` e non sarà più vuoto. È possibile verificare il `pulp_href` delle pubblicazioni utilizzando il comando `pulp rpm publication list` e cercando `pulp_href`. Per esempio, di seguito è riportato un `pulp_href` per BaseOS, ma il vostro `pulp_href` potrebbe essere diverso, quindi cambiatelo di conseguenza. + +```bash +pulp rpm distribution create --name "Copy of BaseOS 92 RL Vault" --base-path "R92_BaseOS_Vault" --publication "/pulp/api/v3/publications/rpm/rpm/0195fdaa-a194-7e9d-a6a9-e6fd4eaa7a20/" +pulp rpm distribution create --name "Copy of AppStream 92 RL Vault" --base-path "R92_AppStream_Vault" --publication "" +``` + +Se si controlla `http://localhost:8080/pulp/content/,` si dovrebbero vedere i due repository, che sono copie dei repository Rocky Linux 9.2 AppStream e BaseOS vault. + +![content_index](images/pulp_index_content.png) + +## Conclusione + +Pulp può essere uno strumento molto versatile per recuperare più repository e distribuirli secondo le necessità. Sebbene questo sia un esempio di base, è possibile utilizzare Pulp in una serie di scenari di distribuzione più complessi e avanzati. Per ulteriori informazioni, consultare la [documentazione ufficiale](https://pulpproject.org/). diff --git a/docs/guides/security/dnf_automatic.it.md b/docs/guides/security/dnf_automatic.it.md index af712b1952..ec256b6aa4 100644 --- a/docs/guides/security/dnf_automatic.it.md +++ b/docs/guides/security/dnf_automatic.it.md @@ -62,7 +62,7 @@ sudo systemctl enable --now dnf-automatic.timer ## Che dire dei server CentOS 7? -!!! tip "Suggerimento" +!!! tip Sì, questa è la documentazione di Rocky Linux, ma se siete amministratori di sistema o di rete, potreste avere qualche macchina CentOS 7 ancora in funzione. Lo capiamo ed è per questo che abbiamo inserito questa sezione. From 354c02adb3450ddd58760b76b1928a678a2bcd29 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Tue, 22 Jul 2025 09:39:06 -0700 Subject: [PATCH 077/164] New Crowdin updates (#2798) * New translations active_directory_authentication.md (Italian) * New translations enabling_iptables_firewall.md (Italian) * New translations install_nvchad.md (Italian) --- docs/books/nvchad/install_nvchad.it.md | 2 +- .../active_directory_authentication.it.md | 22 +++++++++---------- .../security/enabling_iptables_firewall.it.md | 20 ++++++++--------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/docs/books/nvchad/install_nvchad.it.md b/docs/books/nvchad/install_nvchad.it.md index c13d61d185..f21acbea9f 100644 --- a/docs/books/nvchad/install_nvchad.it.md +++ b/docs/books/nvchad/install_nvchad.it.md @@ -64,7 +64,7 @@ Per scaricare e inizializzare la configurazione, utilizzare il seguente comando: git clone https://github.com/NvChad/starter ~/.config/nvim && nvim ``` -Il comando è composto da due parti. Il primo scarica il contenuto del repository *starter* in `~/.config/nvim/` (cartella predefinita per le impostazioni di Neovim), mentre il secondo richiama l'eseguibile ==nvim== che inizializza l'editor con la configurazione appena scaricata. Una volta terminata l'installazione dei plugin e dei parser, ci si troverà di fronte alla seguente schermata. Per chiudere il gestore dei plugin, digitare ++"q "++ : +Il comando è composto da due parti. Il primo scarica il contenuto del repository *starter* in `~/.config/nvim/` (cartella predefinita per le impostazioni di Neovim), mentre il secondo richiama l'eseguibile ==nvim== che inizializza l'editor con la configurazione appena scaricata. Una volta terminata l'installazione dei plugin e dei parser, ci si troverà di fronte alla seguente schermata. Per chiudere il gestore dei plugin, digitare ++"q"++ : ![NvChad Install](images/install_nvchad_25.png) diff --git a/docs/guides/security/authentication/active_directory_authentication.it.md b/docs/guides/security/authentication/active_directory_authentication.it.md index db00b7df4a..43efe873bf 100644 --- a/docs/guides/security/authentication/active_directory_authentication.it.md +++ b/docs/guides/security/authentication/active_directory_authentication.it.md @@ -1,10 +1,10 @@ --- +title: Autenticazione Active Directory author: Hayden Young -contributors: Steven Spencer, Sambhav Saggi, Antoine Le Morvan, Krista Burdine, Ganna Zhyrnova +contributors: Steven Spencer, Sambhav Saggi, Antoine Le Morvan, Krista Burdine, Ganna Zhyrnova, Neel Chauhan +tested_with: 9.4 --- -# Autenticazione Active Directory - ## Prerequisiti - Alcune conoscenze di Active Directory @@ -14,7 +14,7 @@ contributors: Steven Spencer, Sambhav Saggi, Antoine Le Morvan, Krista Burdine, Nella maggior parte delle aziende, Active Directory (AD) di Microsoft è il sistema di autenticazione predefinito per i sistemi Windows e per i servizi esterni collegati a LDAP. Consente di configurare utenti e gruppi, controllo degli accessi, autorizzazioni, montaggio automatico e altro ancora. -Ora, mentre la connessione di Linux a un cluster AD non può supportare _tutte_ le funzionalità menzionate, può gestire utenti, gruppi e controllo degli accessi. È possibile (attraverso alcune modifiche di configurazione sul lato Linux e alcune opzioni avanzate sul lato AD) distribuire chiavi SSH utilizzando AD. +Sebbene la connessione di Linux a un cluster AD non possa supportare _tutte_ le funzionalità menzionate, può gestire utenti, gruppi e controllo degli accessi. È possibile (attraverso alcune modifiche di configurazione sul lato Linux e alcune opzioni avanzate sul lato AD) distribuire chiavi SSH utilizzando AD. Questa guida, tuttavia, tratterà solo la configurazione dell'autenticazione rispetto ad Active Directory e non includerà alcuna configurazione aggiuntiva sul lato Windows. @@ -65,7 +65,7 @@ Il primo passo per unire un sistema Linux ad AD è quello di rilevare il cluster ### Scoprire -Ora dovreste essere in grado di rilevare i vostri server AD dall'host Linux. +A questo punto si dovrebbe essere in grado di rilevare i server AD dall'host Linux. ```sh [user@host ~]$ realm discover ad.company.local @@ -83,7 +83,7 @@ ad.company.local required-package: samba-common ``` -Questo viene rilevato utilizzando i record SRV pertinenti memorizzati nel servizio DNS di Active Directory. +I record SRV pertinenti memorizzati nel servizio DNS di Active Directory consentiranno la scoperta. ### Unirsi @@ -106,7 +106,7 @@ Se questo processo ha successo, dovreste essere in grado di estrarre le informaz administrator@ad.company.local:*:1450400500:1450400513:Amministrator:/home/administrator@ad.company.local:/bin/bash ``` -!!! Note "Nota" +!!! Note "Nota" `getent` ottiene voci dalle librerie Name Service Switch (NSS). Significa che, al contrario di `passwd` o `dig` per esempio, interrogherà diversi database, tra cui `/etc/hosts` per `getent hosts` o da `sssd` nel caso di `getent passwd`. @@ -119,13 +119,13 @@ administrator@ad.company.local:*:1450400500:1450400513:Amministrator:/home/admin | --os-version='8' | Specificare la versione del sistema operativo memorizzata nell'AD | | -U admin_username | Specificare un account di amministratore | -### Tentativo di Autenticazione +### Tentativo di autenticazione Ora gli utenti dovrebbero essere in grado di autenticarsi all'host Linux tramite Active Directory. **Su Windows 10:** (che fornisce la propria copia di OpenSSH) -``` +```dos C:\Users\John.Doe> ssh -l john.doe@ad.company.local linux.host Password for john.doe@ad.company.local: @@ -139,7 +139,7 @@ Se l'operazione ha successo, si è configurato Linux per utilizzare Active Direc ### Impostazione del dominio predefinito -In una configurazione completamente predefinita, è necessario accedere con il proprio account AD specificando il dominio nel nome utente (ad esempio, `john.doe@ad.company.local`). Se questo non è il comportamento desiderato e si vuole invece poter omettere il nome del dominio al momento dell'autenticazione, è possibile configurare SSSD in modo che abbia come default un dominio specifico. +In una configurazione completamente predefinita, è necessario accedere con il proprio account AD specificando il dominio nel nome utente (ad esempio, `john.doe@ad.company.local`). Se questo non è il comportamento desiderato e si vuole invece poter omettere il nome del dominio al momento dell'autenticazione, si può configurare SSSD in modo che sia predefinito un dominio specifico. Si tratta di un processo relativamente semplice, che richiede una modifica al file di configurazione di SSSD. @@ -166,7 +166,7 @@ use_fully_qualified_names = False override_homedir = /home/%u ``` -Non dimenticare di riavviare il servizio `ssd`. +Non dimenticate di riavviare il servizio `sssd.`. ### Limita a determinati utenti diff --git a/docs/guides/security/enabling_iptables_firewall.it.md b/docs/guides/security/enabling_iptables_firewall.it.md index 5a5d4d3203..58a758606f 100644 --- a/docs/guides/security/enabling_iptables_firewall.it.md +++ b/docs/guides/security/enabling_iptables_firewall.it.md @@ -2,7 +2,7 @@ title: Abilitazione del Firewall `iptables` author: Steven Spencer contributors: Ezequiel Bruni, Ganna Zhyrnova -tested_with: 8.5, 8.6, 9.0 +tested*with: 8.5, 8.6, 9.0 tags: - security - iptables @@ -13,7 +13,7 @@ tags: ## Prerequisiti -* Un ardente, inestinguibile desiderio di disabilitare l'applicazione di default _firewalld_ e abilitare _iptables_. +- Un desiderio ardente e inestinguibile di disabilitare l'applicazione predefinita *firewalld* e abilitare *iptables*. !!! warning "Questo Processo È Deprecato" @@ -21,17 +21,17 @@ tags: ## Introduzione -_firewalld_ è ora il firewall predefinito su Rocky Linux. _firewalld_ **era** nient'altro che un'applicazione dinamica di _iptables_ che utilizzando i file xml caricava le modifiche senza il flushing delle regole in CentOS 7/RHEL 7. Con CentOS 8/RHEL 8/Rocky 8, _firewalld_ è ora un wrapper intorno a _nftables_. È ancora possibile, tuttavia, installare e utilizzare direttamente _iptables_ se questa è la tua preferenza. Per installare ed eseguire direttamente _iptables_ senza _firewalld_ puoi farlo seguendo questa guida. Ciò che questa guida **non** ti dirà è come scrivere le regole per _iptables_. Si presume che se vuoi sbarazzarti di _firewalld_, devi già sapere come scrivere regole per _iptables_. +*firewalld* è ora il firewall predefinito su Rocky Linux. *firewalld* non **era** altro che un'applicazione dinamica di *iptables* che utilizzava file xml e che caricava le modifiche senza eseguire il flussaggio delle regole in CentOS 7/RHEL 7. Con CentOS 8/RHEL 8/Rocky 8, *firewalld* è ora un wrapper attorno a *nftables*. È comunque possibile installare e utilizzare direttamente iptables, se lo si preferisce. Per installare ed eseguire *iptables* senza *firewalld* è possibile seguire questa guida. Questa guida **non** spiega come scrivere le regole per *iptables*. Si presume che se ci si vuole sbarazzare di *firewalld*, si deve già sapere come scrivere le regole per *iptables*. ## Disabilitare firewalld -Non è possibile eseguire la vecchia utility _iptables_ accanto a _firewalld_. Semplicemente non sono compatibili. Il modo migliore per ovviare a questo problema è quello di disabilitare completamente _firewalld_ (non è necessario disinstallarlo a meno che non lo si voglia fare) e reinstallare le utility _iptables_. Disabilitare _firewalld_ può essere fatto utilizzando questi comandi: +Non è possibile eseguire la vecchia utility *iptables* insieme a *firewalld*. Semplicemente non sono compatibili. Il modo migliore per ovviare a questo problema è disabilitare completamente *firewalld* (non è necessario disinstallarlo, a meno che non lo si voglia fare) e reinstallare le utility *iptables*. La disabilitazione di *firewalld* può essere eseguita con questi comandi: -Arrestare _firewalld_: +Arrestare *firewalld*: `systemctl stop firewalld` -Disabilitare _firewalld_ in modo che non parta all'avvio: +Disabilitare *firewalld* in modo che non si avvii all'avvio: `systemctl disable firewalld` @@ -41,16 +41,16 @@ Mascherare il servizio in modo che non possa essere trovato: ## Installazione e Abilitazione dei Servizi iptables -Successivamente, è necessario installare i vecchi servizi e utilità _iptables_. Ciò è fatto con quanto segue: +Successivamente, è necessario installare i vecchi servizi e utilità di *iptables*. Ciò è fatto con quanto segue: `dnf install iptables-services iptables-utils` -Questo installerà tutto ciò che è necessario per eseguire una regola _iptables_ impostata. +Questo installerà tutto ciò che è necessario per eseguire un set di regole *iptables*. -Ora abbiamo bisogno di abilitare il servizio _iptables_ per assicurarsi che parta all'avvio: +Ora dobbiamo abilitare il servizio *iptables* per assicurarci che si avvii all'avvio: `systemctl enable iptables` ## Conclusione -È possibile ritornare a utilizzare _iptables_ se lo si preferisce al posto di _firewalld_. Puoi tornare a usare il _firewalld_ predefinito semplicemente invertendo queste modifiche. +Se preferisci, puoi tornare a utilizzare direttamente iptables invece di firewalld. È possibile tornare a utilizzare il *firewalld* predefinito semplicemente invertendo queste modifiche. From 1687d0c07fc9fbb52fe068e1219ffc8931e7eebf Mon Sep 17 00:00:00 2001 From: ambaradan <87865413+ambaradan@users.noreply.github.com> Date: Sat, 26 Jul 2025 03:28:50 +0200 Subject: [PATCH 078/164] fixed missing blank lines in blockquotes (#2800) In firewalld-beginners.md, the lack of blank lines in the list of blockquotes breaks the correct display. --- docs/guides/security/firewalld-beginners.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/guides/security/firewalld-beginners.md b/docs/guides/security/firewalld-beginners.md index b3ab01493a..b607d5099b 100644 --- a/docs/guides/security/firewalld-beginners.md +++ b/docs/guides/security/firewalld-beginners.md @@ -148,13 +148,21 @@ If your machine has multiple ways to connect to different networks (e.g., Ethern Default zones include the following (I've taken this explanation from [DigitalOcean's guide to `firewalld`](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-firewalld-on-centos-8), which you should also read): > **drop:** The lowest level of trust. All incoming connections are dropped without reply and only outgoing connections are possible. + > **block:** Similar to the above, but instead of simply dropping connections, incoming requests are rejected with an icmp-host-prohibited or icmp6-adm-prohibited message. + > **public:** Represents public, untrusted networks. You don’t trust other computers but may allow selected incoming connections on a case-by-case basis. + > **external:** External networks in the event that you are using the firewall as your gateway. It is configured for NAT masquerading so that your internal network remains private but reachable. + > **internal:** The other side of the external zone, used for the internal portion of a gateway. The computers are fairly trustworthy, and some additional services are available. + > **dmz:** Used for computers located in a DMZ (isolated computers that will not have access to the rest of your network). Only certain incoming connections are allowed. + > **work:** Used for work machines. Trust most of the computers in the network. A few more services might be allowed. + > **home:** A home environment. It generally implies that you trust most of the other computers and that a few more services will be accepted. + > **trusted:** Trust all of the machines in the network. The most open of the available options and should be used sparingly. Okay, so some of those explanations get complicated, but honestly? The average beginner can get by with understanding "trusted", "home", and "public", and when to use which. From bb75dbfbb0ffe5aac7de979c28b3bfb693228a6d Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Sat, 26 Jul 2025 11:43:48 -0700 Subject: [PATCH 079/164] New Crowdin updates (#2799) * New translations 13-softwares.md (French) * New translations 02_rsync_demo01.md (French) * New translations 05-vi.md (German) * New translations 13-softwares.md (German) * New translations 01-files-servers.md (German) * New translations 06-users.md (French) * New translations 03-commands.md (French) * New translations 05_rsync_authentication-free_login.md (French) * New translations 01-files-servers.md (French) * New translations 01-install.md (Italian) * New translations 02-zfs_setup.md (Italian) * New translations 03-incusinit.md (Italian) * New translations 03-incusinit.md (German) * New translations 04-firewall.md (Italian) * New translations 05-incus_images.md (Italian) * New translations 06-profiles.md (Italian) * New translations 07-configurations.md (Italian) * New translations 08-snapshots.md (Italian) * New translations 09-snapshot_server.md (Italian) * New translations 30-appendix_a.md (Italian) * New translations brother-all-in-one.md (German) * New translations valuta.md (German) * New translations appimage_pool.md (German) * New translations 10-automating.md (French) * New translations 00-toc.md (German) * New translations 01-install.md (German) * New translations learning_selinux.md (Italian) * New translations firewalld-beginners.md (Italian) * New translations markdown-demo-v2.md (Italian) * New translations active_directory_authentication_with_samba.md (Italian) * New translations freeradius_radius_server.md (Italian) * New translations openvpn.md (Italian) * New translations kernel_panic.md (French) * New translations ssh_ca_key_signing.md (Italian) * New translations vbox-rocky.md (Italian) * New translations ssl_keys_https.md (Italian) * New translations vmware_tools.md (Italian) * New translations cockpit-machines.md (Italian) * New translations libvirt-rocky.md (Italian) * New translations kernel_panic.md (Italian) * New translations wireguard_vpn.md (Italian) * New translations firewalld-beginners.md (Italian) * New translations nginx-mainline.md (Italian) * New translations systemd_hardening.md (Italian) * New translations php.md (Italian) * New translations migrate2rocky.md (Italian) * New translations generating_ssl_keys_lets_encrypt.md (Italian) * New translations 8_6_installation.md (Italian) --- docs/books/admin_guide/03-commands.fr.md | 30 +- docs/books/admin_guide/05-vi.de.md | 218 +++++----- docs/books/admin_guide/06-users.fr.md | 8 +- docs/books/admin_guide/13-softwares.de.md | 12 +- docs/books/admin_guide/13-softwares.fr.md | 6 +- docs/books/incus_server/00-toc.de.md | 4 +- docs/books/incus_server/01-install.de.md | 10 +- docs/books/incus_server/01-install.it.md | 4 +- docs/books/incus_server/02-zfs_setup.it.md | 2 +- docs/books/incus_server/03-incusinit.de.md | 2 +- docs/books/incus_server/03-incusinit.it.md | 6 +- docs/books/incus_server/04-firewall.it.md | 6 +- docs/books/incus_server/05-incus_images.it.md | 4 +- docs/books/incus_server/06-profiles.it.md | 10 +- .../incus_server/07-configurations.it.md | 8 +- docs/books/incus_server/08-snapshots.it.md | 4 +- .../incus_server/09-snapshot_server.it.md | 2 +- docs/books/incus_server/10-automating.fr.md | 2 +- docs/books/incus_server/30-appendix_a.it.md | 10 +- .../learning_rsync/02_rsync_demo01.fr.md | 2 +- .../05_rsync_authentication-free_login.fr.md | 2 +- .../books/web_services/01-files-servers.de.md | 2 +- .../books/web_services/01-files-servers.fr.md | 2 +- docs/desktop/appimage/appimage_pool.de.md | 2 +- docs/desktop/gnome/valuta.de.md | 2 +- .../desktop/printing/brother-all-in-one.de.md | 2 +- docs/gemstones/markdown-demo-v2.it.md | 47 ++- docs/guides/8_6_installation.it.md | 168 ++++---- docs/guides/migrate2rocky.it.md | 61 +-- ..._directory_authentication_with_samba.it.md | 173 ++++++++ .../guides/security/firewalld-beginners.it.md | 48 +-- .../security/freeradius_radius_server.it.md | 106 +++++ .../generating_ssl_keys_lets_encrypt.it.md | 175 ++++---- docs/guides/security/learning_selinux.it.md | 116 +++--- docs/guides/security/openvpn.it.md | 292 ++++++++++++++ docs/guides/security/ssh_ca_key_signing.it.md | 208 ++++++++++ docs/guides/security/ssl_keys_https.it.md | 68 ++-- docs/guides/security/systemd_hardening.it.md | 378 +++++++++++++++++ docs/guides/security/wireguard_vpn.it.md | 280 +++++++++++++ .../guides/troubleshooting/kernel_panic.fr.md | 2 +- .../guides/troubleshooting/kernel_panic.it.md | 137 +++++++ .../virtualization/cockpit-machines.it.md | 96 +++++ .../guides/virtualization/libvirt-rocky.it.md | 173 ++++++++ docs/guides/virtualization/vbox-rocky.it.md | 24 +- docs/guides/virtualization/vmware_tools.it.md | 379 ++++++++++++++++++ docs/guides/web/nginx-mainline.it.md | 186 +++------ docs/guides/web/php.it.md | 288 ++++++++----- 47 files changed, 3032 insertions(+), 735 deletions(-) create mode 100644 docs/guides/security/authentication/active_directory_authentication_with_samba.it.md create mode 100644 docs/guides/security/freeradius_radius_server.it.md create mode 100644 docs/guides/security/openvpn.it.md create mode 100644 docs/guides/security/ssh_ca_key_signing.it.md create mode 100644 docs/guides/security/systemd_hardening.it.md create mode 100644 docs/guides/security/wireguard_vpn.it.md create mode 100644 docs/guides/troubleshooting/kernel_panic.it.md create mode 100644 docs/guides/virtualization/cockpit-machines.it.md create mode 100644 docs/guides/virtualization/libvirt-rocky.it.md create mode 100644 docs/guides/virtualization/vmware_tools.it.md diff --git a/docs/books/admin_guide/03-commands.fr.md b/docs/books/admin_guide/03-commands.fr.md index a91e98b80f..aa79064218 100644 --- a/docs/books/admin_guide/03-commands.fr.md +++ b/docs/books/admin_guide/03-commands.fr.md @@ -22,7 +22,7 @@ Dans ce chapitre, vous apprendrez des commandes Linux et comment les utiliser. **Connaissances** : :star: **Complexité** : :star: -**Temps de lecture** : 40 minutes +**Temps de lecture** : 41 minutes **** @@ -120,7 +120,7 @@ Il est impossible pour un administrateur, quel que soit son niveau, de connaîtr La commande `apropos` permet de faire une recherche par mot clef au sein de ces pages de manuel : -| Options | Observation | +| Options | Description | | ------------------------------------------- | ----------------------------------------------------------------------- | | `-s`, `--sections list` ou `--section list` | Se limite aux sections de manuel. | | `-a` ou `--and` | Affiche seulement l’élément correspondant à tous les mots-clés fournis. | @@ -514,7 +514,7 @@ $ ls -lia /home | `25 oct. 08:10` | Date de dernière modification. | | `rockstar` | Nom du fichier (ou du répertoire). | -!!! note "Remarque" +!!! note "Remarque " Des **alias** sont fréquemment positionnés au sein des distributions courantes. @@ -688,7 +688,7 @@ rm [-f] [-r] file [file] [...] | `-i` | Demande de confirmation de la suppression. | | `-r` | Supprime récursivement un répertoire et ses sous-répertoires. | -!!! note "Remarque" +!!! note "Remarque " La commande `rm` en elle-même ne demande pas de confirmation lors de la suppression de fichiers. Cependant avec une distribution RedHat/CentOS, `rm` demande une confirmation de suppression car la commande `rm` y est un alias de la commande `rm -i`. Ne soyez pas surpris sur une autre distribution, type Debian par exemple, de ne pas obtenir de demande de confirmation. @@ -939,7 +939,7 @@ La commande `head` affiche le début d’un fichier. head [-n x] file ``` -| Option | Observation | +| Option | Description | | ------ | ------------------------------------------- | | `-n x` | Affiche les `x` premières lignes du fichier | @@ -953,7 +953,7 @@ La commande `tail` affiche la fin d’un fichier. tail [-f] [-n x] file ``` -| Option | Observation | +| Option | Description | | ------ | -------------------------------------------------- | | `-n x` | Affiche les `x` dernières lignes du fichier | | `-f` | Affiche les modifications du fichier en temps réel | @@ -989,10 +989,10 @@ root:x:0:0:root:/root:/bin/bash adm:x:3:4:adm:/var/adm/:/sbin/nologin ``` -| Option | Observation | +| Option | Description | | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `-k` | Spécifier les colonnes à séparer. Vous pouvez spécifier plusieurs colonnes | -| `-R` | Demande un tri numérique. | +| `-n` | Demande un tri numérique. | | `-o file` | Enregistre le tri dans le fichier spécifié. | | `-t` | Spécifiez un délimiteur, qui exige que le contenu du fichier correspondant soit régulièrement délimité par le contenu des colonnes, sinon ils ne peuvent pas être triés correctement | | `-r` | Inverser l'ordre du résultat. Utilisé en conjonction avec l'option `-n` pour trier dans l'ordre de la plus grande à la plus petite | @@ -1109,7 +1109,7 @@ La commande `wc` compte le nombre de lignes, mots et/ou octets d’un fichier. wc [-l] [-m] [-w] file [files] ``` -| Option | Observation | +| Option | Description | | ------ | ------------------------------- | | `-c` | Compte le nombre d’octets. | | `-m` | Compte le nombre de caractères. | @@ -1130,7 +1130,7 @@ Les options de la commande `find` étant très nombreuses, il est préférable d Si le répertoire de recherche n’est pas précisé, la commande `find` cherchera à partir du répertoire courant. -| Option | Observation | +| Option | Description | | ------------------- | ----------------------------------------------- | | `-perm permissions` | Recherche des fichiers selon leurs permissions. | | `-size size` | Recherche des fichiers selon leur taille. | @@ -1179,7 +1179,7 @@ $ whereis -b ls ls: /bin/ls ``` -| Option | Observation | +| Option | Description | | ------ | -------------------------------------- | | `-b` | Ne recherche que le fichier binaire. | | `-m` | Ne recherche que les pages de manuel. | @@ -1200,7 +1200,7 @@ $ grep -w "root:" /etc/passwd root:x:0:0:root:/root:/bin/bash ``` -| Option | Observation | +| Option | Description | | ------ | ------------------------------------------------------ | | `-i` | Ignore la casse de la chaîne de caractères recherchée. | | `-v` | Exclut les lignes contenant la chaîne de caractère. | @@ -1215,7 +1215,7 @@ La commande `grep` retourne la ligne complète comprenant la chaîne de caractè grep -w "^root" /etc/passwd ``` -!!! note "Remarque" +!!! note "Remarque " Cette commande est très puissante et il est fortement conseillé de consulter son manuel. Elle a de nombreux dérivés. @@ -1261,7 +1261,7 @@ $ find /home -name "test[123]*" /home/rockstar/test362 ``` -!!! note "Remarque" +!!! note "Remarque " Prendre soin de toujours encadrer les mots contenant des métacaractères par des `"` pour éviter qu’ils soient remplacés par le nom des fichiers qui répondraient aux critères. @@ -1296,7 +1296,7 @@ Il est possible de rediriger le flux d’entrée depuis un autre fichier avec le ftp -in serverftp << ftp-commands.txt ``` -!!! note "Remarque" +!!! note "Remarque " Seules les commandes demandant une saisie au clavier pourront gérer la redirection d’entrée. diff --git a/docs/books/admin_guide/05-vi.de.md b/docs/books/admin_guide/05-vi.de.md index f80e6b0aa7..df508529a1 100644 --- a/docs/books/admin_guide/05-vi.de.md +++ b/docs/books/admin_guide/05-vi.de.md @@ -28,7 +28,7 @@ Sehr leistungsstark, ist es vor allem sehr praktisch, da er auf einen Minimum f Seine Funktionen sind: -* Einfügen, löschen, Text ändern; +* Text einfügen, löschen und ändern; * Kopieren von Wörter, Zeilen oder Textblöcke; * Suchen und ersetzen von Zeichen. @@ -50,11 +50,11 @@ vi /home/rockstar/file | ------------ | --------------------------------------------------- | | `-c command` | VI durch Angabe eines Befehls beim Öffnen ausführen | -Wenn die Datei an der angegebenen Stelle existiert, wird sie von VI gelesen, der im **Kommandos**-Modus versetzt wird. +Wenn die Datei an der angegebenen Stelle existiert, wird sie von VI gelesen, der im **Kommando**-Modus versetzt wird. Wenn die Datei nicht existiert, öffnet VI eine leere Datei und eine leere Seite wird auf dem Bildschirm angezeigt. Wenn die Datei gespeichert wird, wird der mit dem Befehl angegebene Name verwendet. -Wenn der Befehl `vi` ohne Angabe eines Dateinamens ausgeführt wird, öffnet VI eine leere Datei, und eine leere Seite wird auf dem Bildschirm angezeigt. Wenn die Datei gespeichert wird, fragt VI nach einem Dateinamen. +Wenn der Befehl `vi` ohne Angabe eines Dateinamens ausgeführt wird, öffnet VI eine leere Datei und eine leere Seite wird auf dem Bildschirm angezeigt. Wenn die Datei gespeichert wird, fragt VI nach einem Dateinamen. Der `vim` Editor übernimmt die Benutzeroberfläche und die Funktionen von VI, die mit vielen Verbesserungen ergänzt werden. @@ -62,7 +62,7 @@ Der `vim` Editor übernimmt die Benutzeroberfläche und die Funktionen von VI, d vim [-c command] [file] ``` -Durch diese Verbesserungen verfügt der Benutzer über Syntax-Highlighting, was sehr nützlich ist, um Shell-Skripte oder Konfigurationsdateien zu bearbeiten. +Durch diese Verbesserungen verfügt der Benutzer über Syntax-Hervorhebung, was sehr nützlich ist, um Shell-Skripte oder Konfigurationsdateien zu bearbeiten. Während einer Sitzung verwendet VI eine Pufferdatei, in der alle Änderungen des Benutzers aufgenommen werden. @@ -74,15 +74,15 @@ Beim Start ist VI im *Kommandos*-Modus. !!! tip "Hinweis" - Eine Textzeile wird durch Drücken von ENTER beendet, aber wenn der Bildschirm nicht breit genug ist, erzeugt VI standardmäßig automatische Zeilenumbrüche, sofern _wrap_ als Vorbelegung konfiguriert ist. Falls diese Zeilenumbrüche nicht erwünscht sind, sollte _nowrap_ konfiguriert werden. + Eine Textzeile wird durch Drücken von ++enter++ beendet, aber wenn der Bildschirm nicht breit genug ist, erzeugt VI standardmäßig automatische Zeilenumbrüche, sofern _wrap_ als Vorbelegung konfiguriert ist. Falls diese Zeilenumbrüche nicht erwünscht sind, sollte _nowrap_ entsprechend konfiguriert werden. -Drücken Sie das Zeichen : aus dem Befehlsmodus um VI zu beenden, und geben Sie dann Folgendes ein: +Drücken Sie das Zeichen ++colon++ aus dem Befehlsmodus um VI zu beenden und geben Sie dann Folgendes ein: * `q` (beenden ohne zu speichern _quit_); * `w` um Ihre Arbeit zu speichern (_write_); * `wq` (_write quit_) oder `x` (_eXit_) zum Speichern und Beenden. -Klicken Sie im Befehlsmodus zweimal in Folge auf die Z Taste (Großbuchstabe) zum Speichern und Beenden. +Klicken Sie im Befehlsmodus zweimal in Folge auf die Taste ++z++ (Großbuchstabe) zum Speichern und Beenden. Um das Beenden ohne Bestätigung zu erzwingen, müssen Sie das Ausrufezeichen *!* zu den vorherigen Befehlen hinzufügen. @@ -104,7 +104,7 @@ Der dritte Modus, *ex*, ist ein Befehlsmodus für Fußzeilen eines Legacy-Texted ### Der Befehlsmodus -Dies ist der Standardmodus, wenn VI gestartet wird. Um es von allen anderen Modi aus aufzurufen, drücken Sie einfach die ESC Taste. +Dies ist der Standardmodus, wenn VI gestartet wird. Um es von allen anderen Modi aus aufzurufen, drücken Sie einfach die Taste ++escape++. Zu diesem Zeitpunkt werden alle Tastaturkürzel als Befehle interpretiert und die entsprechenden Aktionen ausgeführt. Dies sind im Wesentlichen Befehle zum Bearbeiten von Text (kopieren, einfügen, rückgängig machen, ...). @@ -120,7 +120,7 @@ Der Text wird nicht direkt in die Datei gespeichert, sondern in eine Pufferzone Dies ist der Datei-Modifikationsmodus. Um darauf zuzugreifen, müssen Sie zuerst zum *Befehls*-Modus wechseln, geben Sie dann das *ex*-Kommando ein, das häufig mit dem Zeichen `:` beginnt. -Der Befehl wird durch Drücken der ENTER Taste bestätigt. +Der Befehl wird durch Drücken der ++enter++ Taste bestätigt. ## Cursor verschieben @@ -136,109 +136,113 @@ Der Cursor befindet sich unter dem gewünschten Zeichen. * Verschiebe ein oder `n` Zeichen nach links: -, n, h oder nh +++arrow-left++, ++"n"++ ++arrow-left++, ++"h"++ or ++"n"++ ++"h"++ * Verschiebe ein oder `n` Zeichen nach rechts: -, n, l oder nl +++arrow-right++, ++"n"++ ++arrow-right++, ++"l"++ oder ++"n"++ ++"l"++ * Ein oder `n` Zeichen nach oben: -, n, k oder nk +++arrow-up++, ++"n"++ ++arrow-up++, ++"k"++ oder ++"n"++ ++"k"++ * Ein oder `n` Zeichen nach unten verschieben: -, n, j oder nj +++arrow-down++, ++"n"++ ++arrow-down++, ++"j"++ oder ++"n"++ ++"j"++ * Zum Ende der Zeile verschieben: -$ oder ENDE +++"$"++ oder ++end++ * Zum Anfang der Zeile verschieben: -0 oder POS1 +++0++ oder ++"POS1"++ ### Vom ersten Zeichen eines Wortes Wörter bestehen aus Buchstaben oder Zahlen. Satzzeichen und Apostrophe getrennt Wörter. -Wenn sich der Cursor in der Mitte eines Wortes befindet, w bewegt sich zum nächsten Wort, b bewegt sich an den Anfang des Wortes. +Wenn sich der Cursor in der Mitte eines Wortes befindet, mit w bewegt er sich zum nächsten Wort, mit b an den Anfang des Wortes. Wenn die Zeile beendet ist, geht VI automatisch in die nächste Zeile. * Verschiebe ein oder `n` Wörter nach rechts: -w oder nw +++"w"++ oder ++"n"++ ++"w"++ * Verschiebe ein oder `n` Wörter nach links: -b oder nb +++"b"++ oder ++"n"++ ++"b"++ ### Von jedem Ort auf einer Zeile * Zur letzten Textzeile verschieben: -G +++g++ * In Zeile `n` verschieben: -nG +++"n"++ ++g++ * Zur ersten Zeile des Bildschirms verschieben: -H +++h++ * In die mittlere Zeile des Bildschirms verschieben: -M +++m++ * Zur letzten Zeile des Bildschirms verschieben: -L +++l++ + +* Zur ersten Zeile der Datei springen + +++"g"++ ++"g"++ ## Text einfügen -Im *Befehlsmodus* gibt es mehrere Möglichkeiten, Text einzufügen. +Es gibt mehrere Möglichkeiten, Text im *Befehlsmodus* einzufügen. -VI schaltet nach Eingabe eines dieser Schlüssel zum *Einfüge-Modus*. +VI schaltet nach Eingabe eines dieser Tasten zum *Einfüge-Modus*. !!! note "Anmerkung" - VI wechselt zum *Einfüge*-Modus. Sie müssen also die ESC Taste drücken, um in den *Befehls*-Modus zurückzukehren. + VI wechselt zum *Einfüge*-Modus. Sie müssen also die ++escape++ Taste drücken, um in den *Befehls*-Modus zurückzukehren. ### In Bezug auf ein Zeichen * Text vor einem Zeichen einfügen: -i (_insert_) +++"i"++ (*insert – einfügen*) -* Text nach einem Zeichen einfügen: +* Text hinter einem Zeichen einfügen: -a (_append_) +++"a"++ (*append – anfügen*) ### In Verbindung mit einer Zeile * Text am Anfang einer Zeile einfügen: -I +++i++ * Text am Ende einer Zeile einfügen: -A +++a++ ### In Bezug auf den Text * Text vor einer Zeile einfügen: -O +++o++ -* Text nach einer Zeile einfügen: +* Text hinter einer Zeile einfügen: -o +++"o"++ ## Zeichen, Wörter und Zeilen -VI erlaubt Textbearbeitung durch Verwaltung von Folgendes: +VI ermöglicht die Textbearbeitung durch die Verwaltung von: * Zeichen, * Worte, @@ -252,47 +256,47 @@ In jedem Fall ist Folgendes möglich: * ausschneiden, * einfügen. -Diese Operationen werden im *Befehl*-Modus durchgeführt. +Diese Operationen werden im *Befehls*-Modus durchgeführt. ### Zeichen * Ein oder `n` Zeichen löschen: -x oder nx +++"x"++ oder ++"n"++ ++"x"++ -* Ersetze ein Zeichen durch ein anderes: +* Ein Zeichen durch ein anderes ersetzen: -rZeichen +++"r"+"character"++ -* Ersetze mehr als ein Zeichen durch andere: +* Mehr als ein Zeichen durch andere ersetzen: -RZeichenESC +++r+"characters"+escape++ !!! note "Anmerkung" - Der R Befehl wechselt in den *eRsetzen*-Modus, was eine Art *einfügen* Modus ist. + Der ++r++ Befehl wechselt in den *eRsetzen*-Modus, was eine Art *Einfüge*-Modus ist. ### Wörter * Ein oder `n` Wörter löschen (cut): -dw oder ndw +++"d"+"w"++ oder ++"n"+"d"+"w"++ * Ein oder `n` Wörter kopieren: -yw oder nyw +++"y"+"w"++ oder ++"n"+"y"+"w"++ * Ein Wort einmal oder `n` mal nach dem Cursor einfügen: -p oder np +++"p"++ oder ++"n"+"p"++ * Ein Wort einmal oder `n` mal vor dem Cursor einfügen: -P oder nP +++p++ oder ++"n"+p++ * Ein Wort ersetzen: -cw*word*ESC +++c+w+"word"+escape++ !!! tip "Hinweis" @@ -303,73 +307,81 @@ Diese Operationen werden im *Befehl*-Modus durchgeführt. * Lösche (cut) eine oder `n` Zeilen: -dd oder ndd +++"d"+"d"++ oder ++"n"+"d"+"d"++ * Eine oder `n` Zeilen kopieren: -yy oder nyy +++"y"+"y"++ oder ++"n"+"y"+"y"++ -* Das, was einmal oder `n` nach der aktuellen Zeile kopiert oder gelöscht wurde, einfügen: +* Das, was einmal oder `n` Mal nach der aktuellen Zeile kopiert oder gelöscht wurde, einfügen: -p oder np +++"p"++ oder ++"n"+"p"++ -* das einfügen, was einmal oder `n` mal vor der aktuellen Zeile kopiert oder gelöscht wurde: +* Das einfügen, was einmal oder `n`-mal vor der aktuellen Zeile kopiert oder gelöscht wurde: -P oder nP +++p++ oder ++"n"+p++ -* Löschen (cut) vom Anfang der Zeile zum Cursor: +* Löschen (cut) vom Anfang der Zeile bis zum Cursor: -d0 +++"d"+0++ * Löschen (cut) vom Cursor bis zum Ende der Zeile: -d$ +++"d"+"$"++ + +* Vom Anfang der Zeile bis zum Cursor kopieren: + +++"y"+0++ -* Vom Anfang der Zeile zum Cursor kopieren: +* Vom Cursor bìs zum Ende der Zeile kopieren: -y0 +++"y"+"$"++ -* Kopieren Sie vom Cursor an das Ende der Zeile: +* Den Inhalt von der Cursorzeile bis zur letzten Zeile der Datei löschen (cut): -y$ +++"d"+g++ -* Text aus der aktuellen Zeile löschen (cut): +* Den Inhalt von der Cursorzeile bis zur letzten Zeile des Bildschirms löschen (cut): -dL oder dG +++"d"+l++ -* Den Text aus der aktuellen Zeile kopieren: +* Den Inhalt von der Cursor-Zeile bis zur letzten Zeile der Datei kopieren: -yL oder yG +++"y"+g++ + +* Inhalt von der Cursorzeile bis zum Ende des Bildschirms kopieren + +++"y"+l++ ### Eine Aktion abbrechen * Die letzte Aktion rückgängig machen: -u +++"u"++ * Die Aktionen in der aktuellen Zeile rückgängig machen: -U +++u++ ### Stornierung abbrechen * Eine Stornierung abbrechen -Strg+R +++control+r++ ## EX-Befehle -Der *Ex*-Modus erlaubt es Ihnen, auf die Datei zu agieren (Speichern, Layout, Optionen, ...). Es ist auch im *Ex*-Modus, in dem Such- und Ersetzungsbefehle eingegeben werden. Die Ex-Befehle werden unten auf der Seite angezeigt und müssen mit der ENTER Taste bestätigt werden. +Der *Ex*-Modus erlaubt es Ihnen, auf die Datei zu agieren (Speichern, Layout, Optionen, ...). Es ist auch im *Ex*-Modus, in dem Such- und Ersetzungsbefehle eingegeben werden. Die Befehle werden unten auf der Seite angezeigt und müssen mit der Taste ++enter++ bestätigt werden. -Um zum *Ex*-Modus zu wechseln, geben Sie im *Befehl*-Modus das Zeichen : ein. +Um zum *Ex*-Modus zu wechseln, geben Sie im *Befehls*-Modus das Zeichen ++colon++ ein. ### Nummerierung der Zeilen * Nummerierung der Zeilen ein-/ausblenden: -`:set nu` oder `:set number` +`:set nonu` oder ausführlicher `:set nonumber` -`:set nonu` oder `:set nonumber` +`:set nonu` oder ausführlicher `:set nonumber` ### Nach einer Zeichenkette suchen @@ -381,41 +393,41 @@ Um zum *Ex*-Modus zu wechseln, geben Sie im *Befehl*-Modus das Zeichen :n +++"n"++ -* Gehe zum vorherigen Vorkommnis gefunden: +* Zum nächsten passenden String: -N +++n++ -Es gibt Platzhalter, um die Suche in VI zu erleichtern. +Es gibt reguläre Ausdrücke, um die Suche in VI zu erleichtern. * `[]` : Sucht nach einem Zeichenbereich oder einem einzelnen Zeichen, dessen mögliche Werte angegeben sind. Beispiel: -`/[Ww]ord` : Suche _Wort_ oder _wort_ +`/[Ww]ort` : Suche *Wort* oder *wort* -`/[1-9]word` : search _1word_, _2word_ … _`x`Wort_ wobei `x` eine Zahl ist +`/[1-9]word` : *1word*, *2word* … suchen *`x`word* wobei `x` eine Zahl ist -* `^` : Suche nach einem String, der die Zeile beginnt. +* `^` : Nach Zeilen suchen, die mit einer Zeichenkette beginnen. Beispiel: `/^Word` -* `$` : Suche nach einem String, der die Zeile beendet. +* `$`: Suche nach Zeilen, die mit bestimmte Zeichen enden. Beispiel: `/Word$` -* `.` : Suche nach einem einzelnen Zeichen außer Zeilenvorschub. +* `.`: Suche nach einem einzelnen Zeichen außer Zeilenvorschub. Beispiel: -`/W.rd` : Suche _Wort_, _Ward_ … +`/W.rd` : Suche *Word*, *Ward* … * `*` : Die Anzahl Male, mit der das vorherige Zeichen übereinstimmt, 0 Mal oder beliebig oft. @@ -431,7 +443,7 @@ Von der 1. bis zur letzten Zeile des Textes, den durchsuchten String durch die a `:1,$ s/search/replace` -**Hinweis:** Sie können auch `:0,$s/search/replace` verwenden, um anzugeben, dass am absoluten Anfang der Datei begonnen werden soll. +**Hinweis:** Sie können auch `:0,$s/search/replace` verwenden, um anzugeben, dass ganz am Anfang der Datei begonnen werden soll. Die gesuchte Zeichenfolge von der Zeile `n` bis zur Zeile `m` durch die neue Zeichenfolge ersetzen: @@ -467,7 +479,7 @@ Durchsuchen einer ganzen Datei, um den gesuchten String durch den angegebenen St `:g/^#/d` -Das **g** steht hier für **global**. +**g** bedeutet hier **global**. ### Datei Operationen @@ -477,11 +489,11 @@ Das **g** steht hier für **global**. * Unter einem anderen Namen speichern: -`:w Datei` +`:w file` * Von Zeile `n` bis Zeile `m` in eine andere Datei speichern: -`:n,m w Datei` +`:n,m w file` * Die letzte Speicherung der Datei neu laden: @@ -489,34 +501,52 @@ Das **g** steht hier für **global**. * Den Inhalt einer anderen Datei nach dem Cursor einfügen: -`:r Datei` +`:r file` -* Bearbeiten einer Datei beenden, ohne zu speichern: +* Die Bearbeitung einer Datei beenden, ohne zu speichern: `:q` -* Beenden Sie die Bearbeitung einer Datei, die während der Sitzung geändert wurde, aber nicht gespeichert wurde: +* Bearbeiten einer Datei beenden, die während der Sitzung geändert wurde, aber ohne zu speichern: `:q!` -* Datei beenden und speichern: +* Datei speichern: `:wq` oder `:x` ## Andere Funktionen -Es ist möglich, VI auszuführen, wobei die Optionen angegeben werden, die für die Sitzung geladen werden sollen. Um dies zu tun, müssen Sie die `-c` Option verwenden: +Es ist möglich, VI mit Angabe der für die Sitzung zu ladenden Optionen auszuführen. Um dies zu tun, müssen Sie die `-c` Option verwenden: ```bash vi -c "set nu" /home/rockstar/file ``` -Es ist auch möglich, die *Ex*-Befehle in einer Datei mit dem Namen `.exrc` in das Login-Verzeichnis des Benutzers zu speichern. Bei jedem VI- oder VIM-Start werden die Befehle gelesen und angewendet. +Es ist auch möglich, die *Ex*-Befehle in einer Datei mit dem Namen `.exrc` in das Login-Verzeichnis des Benutzers zu speichern. Die Befehle werden bei jedem VI- oder VIM-Start gelesen und angewendet. ### `vimtutor` Befehl -Es gibt ein Tutorial zum Lernen wie man VI benutzt. Es ist mit dem Befehl `vimtutor` zugänglich. +Es gibt ein Tutorial zum Erlernen der Verwendung von `VI`. Es ist mit dem Befehl `vimtutor` zugänglich. ```bash -$ vimtutor +vimtutor ``` + +### Visualizations-Modus + +Dieser Modus ist ein Unterpunkt des Befehlsmodus. Sie können es vervollständigen, indem Sie ++"v"++ oder ++v++ eingeben. Der Operationsinhalt des ersteren befindet sich auf Zeichenebene und der Operationsinhalt des letzteren auf Zeilenebene. + +!!! info "Information" + + Mit den Pfeiltasten können Sie den Zeichen- oder Zeileninhalt markieren, den Sie bearbeiten möchten. + +#### Zeichenebene + +* **Löschen (Ausschneiden)** - Drücken Sie die Taste ++"v"++, um den Zeicheninhalt zu markieren, den Sie löschen möchten, und drücken Sie dann ++"x"++, um ihn zu löschen +* **Kopieren** - Drücken Sie die Taste ++"v"++, um den zu kopierenden Zeicheninhalt zu markieren, und drücken Sie dann die Taste ++"y"++, um ihn zu kopieren + +#### Linienebene + +* **Löschen (Ausschneiden)** - Drücken Sie die Taste ++v++, um die zu löschende Zeile zu markieren, und drücken Sie dann ++"x"++, um sie zu löschen +* **Kopieren** - Drücken Sie die Taste ++v++, um die zu kopierende Zeile zu markieren, und drücken Sie dann die Taste ++"y"++, um sie zu kopieren diff --git a/docs/books/admin_guide/06-users.fr.md b/docs/books/admin_guide/06-users.fr.md index 81fd04c5ad..26853552fc 100644 --- a/docs/books/admin_guide/06-users.fr.md +++ b/docs/books/admin_guide/06-users.fr.md @@ -353,7 +353,7 @@ Exemple : sudo useradd -u 1000 -g GroupA -G GroupP,GroupC albert ``` -!!! note "Remarque" +!!! Note Sous **Debian**, il faudra spécifier l’option `-m` pour forcer la création du répertoire de connexion ou renseigner la variable `CREATE_HOME` du fichier `/etc/login.defs`. Dans tous les cas, l’administrateur devrait privilégier, sauf dans des scripts ayant la vocation d’être portables sur toutes les distributions Linux, les commandes `adduser` et `deluser` comme précisé dans le manuel `man` : @@ -609,7 +609,7 @@ sudo chgrp group1 file | `-R` | Modifie les groupes propriétaires du répertoire et de son contenu (récursivité). | | `-v` | Affiche les modifications. | -!!! note "Remarque" +!!! Note Il est possible d'appliquer à un fichier un propriétaire et un groupe propriétaire en prenant comme référence ceux d'un autre fichier : @@ -766,7 +766,7 @@ Exemple : sudo passwd alain ``` -!!! note "Remarque" +!!! Note Les utilisateurs connectés au système peuvent utiliser la commande `passwd` pour modifier leurs mots de passe (ce processus nécessite la saisie de l'ancien mot de passe de l'utilisateur). L'utilisateur `root`(uid=0) peut modifier le mot de passe de n'importe quel utilisateur. @@ -830,7 +830,7 @@ Fichiers de configuration : * `/etc/login.defs` * `/etc/skel` -!!! note "Remarque" +!!! Note L’édition du fichier `/etc/default/useradd` se fait grâce à la commande `useradd`. diff --git a/docs/books/admin_guide/13-softwares.de.md b/docs/books/admin_guide/13-softwares.de.md index f1379f88dd..a4a169e44f 100644 --- a/docs/books/admin_guide/13-softwares.de.md +++ b/docs/books/admin_guide/13-softwares.de.md @@ -986,12 +986,12 @@ Das `needs-restarting` Plugin ermöglicht Ihnen Prozesse, die neu zu starten sin dnf needs-restarting [-u] [-r] [-s] ``` -| Option | Beschreibung | -| ------- | --------------------------------------------------------------------- | -| `-u` | nur die Prozesse berücksichtigen, die zum laufenden Benutzer gehören. | -| `-r` | um zu überprüfen, ob ein Neustart erforderlich sein könnte. | -| `-s` | um zu überprüfen, ob Dienste neu gestartet werden müssen. | -| `-s -r` | um beides in einem Lauf zu tun. | +| Optionen | Beschreibung | +| -------- | --------------------------------------------------------------------- | +| `-u` | nur die Prozesse berücksichtigen, die zum laufenden Benutzer gehören. | +| `-r` | um zu überprüfen, ob ein Neustart erforderlich sein könnte. | +| `-s` | um zu überprüfen, ob Dienste neu gestartet werden müssen. | +| `-s -r` | um beides in einem Lauf zu tun. | ### `versionlock` Plugin diff --git a/docs/books/admin_guide/13-softwares.fr.md b/docs/books/admin_guide/13-softwares.fr.md index e53f9f5109..c5d2be8f1e 100644 --- a/docs/books/admin_guide/13-softwares.fr.md +++ b/docs/books/admin_guide/13-softwares.fr.md @@ -338,7 +338,7 @@ Complete! La commande `dnf repolist` liste les dépôts configurés sur le système. Par défaut, il liste uniquement les dépôts activés, mais peut être utilisé avec ces paramètres : -| Paramètre | Observation | +| Paramètre | Description | | ------------ | --------------------------------------- | | `--all` | Liste tous les dépôts. | | `--enabled` | Par défaut | @@ -484,7 +484,7 @@ La commande correspondante pour supprimer un groupe est `dnf groupremove "name g La commande `dnf clean` nettoie tous les caches et fichiers temporaires créés par `dnf`. Il peut être utilisé avec les paramètres suivants : -| Paramètres | Observation | +| Paramètres | Description | | -------------- | --------------------------------------------------------------------- | | `all` | Supprime tous les fichiers temporaires créés pour les dépôts activés. | | `dbcache` | Supprime les fichiers de cache des métadonnées du dépôt. | @@ -986,7 +986,7 @@ Le plugiciel `needs-restarting` vous permettra de détecter les processus qui so dnf needs-restarting [-u] [-r] [-s] ``` -| Options | Observation | +| Options | Description | | ------- | ----------------------------------------------------------------------- | | `-u` | considérer uniquement les processus appartenant à l'utilisateur actuel. | | `-r` | pour vérifier si un redémarrage peut être nécessaire. | diff --git a/docs/books/incus_server/00-toc.de.md b/docs/books/incus_server/00-toc.de.md index 835ff1f3a5..453e5062e7 100644 --- a/docs/books/incus_server/00-toc.de.md +++ b/docs/books/incus_server/00-toc.de.md @@ -6,7 +6,7 @@ tested_with: 9.4 tags: - lxd - incus - - enterprise + - Enterprise --- # Incus-Server erstellen @@ -52,7 +52,7 @@ Für diejenigen, die Incus als Laborumgebung auf ihren Notebooks oder Workstatio - Sicherer Umgang mit der Befehlszeile auf Ihren Computern und mit einem Befehlszeileneditor. (Wir verwenden _vi_ in diesem Beispiel, aber Sie können Ihren Lieblingseditor einsetzen.) - Für die meisten dieser Prozesse müssen Sie ein Benutzer ohne besondere Privilegien sein. Für die ersten Einrichtungsschritte müssen Sie Root-Benutzer sein oder in der Lage sein, sich mithilfe von `sudo` als Root-Benutzer anzumelden. Während dieser Kapitel gehen wir davon aus, dass Ihr Benutzer ohne besondere Privilegien `incusadmin` ist. Sie müssen dieses Benutzerkonto später im Vorgangsablauf erstellen. - Stellen Sie für `ZFS` sicher, dass `UEFI` sicheres Booten NICHT aktiviert ist. Andernfalls müssen Sie das ZFS-Modul signieren, um es zum Laden zu bringen. -- Wir verwenden zum größten Teil Rocky Linux-basierte Container. +- Zum größten Teil, Verwendung von Rocky Linux-basierte Container !!! info diff --git a/docs/books/incus_server/01-install.de.md b/docs/books/incus_server/01-install.de.md index e70448042b..1d32d03fd8 100644 --- a/docs/books/incus_server/01-install.de.md +++ b/docs/books/incus_server/01-install.de.md @@ -5,13 +5,13 @@ contributors: Ezequiel Bruni, Ganna Zhyrnova tested_with: 9.4 tags: - Incus - - enterprise + - Enterprise - incus-Installation --- In diesem Abschnitt müssen Sie der root-Benutzer sein oder Sie müssen in der Lage sein, zu root-Rechte durch _sudo_ zu erlangen. -## Installation von EPEL und OpenZFS +## Installation der Repos EPEL und OpenZFS Incus benötigt die EPEL (Extra Packages for Enterprise Linux) repository, die sehr einfach wie folgt zu installieren ist: @@ -61,7 +61,7 @@ systemctl enable incus --now Starten Sie den Server neu, bevor Sie hier fortfahren. -## OpenZFS Installation +## OpenZFS-Installation ```bash dnf install zfs @@ -69,13 +69,13 @@ dnf install zfs ## Einrichtung der Umgebung -Zum Ausführen vieler Container sind mehr als die meisten Server-Kernel-Einstellungen erforderlich. Wenn wir von Anfang an annehmen, dass wir unseren Server in der Produktion verwenden, dann müssen wir diese Änderungen vornehmen, um Fehler wie "Zu viele offene Dateien" zu vermeiden. +Zum Ausführen vieler Container sind mehr als die meisten Server-Kernel-Einstellungen erforderlich. Wenn Sie von Anfang an annehmen, dass Sie den Server in der Produktion verwenden, dann müssen Sie diese Änderungen vornehmen, um Fehler wie "Zu viele offene Dateien" zu vermeiden. Glücklicherweise ist das Optimieren der Einstellungen für `Incus` mit geeigneten Dateiänderungen und einem Neustart nicht schwierig. ### Anpassung von `limits.conf` -Die erste Datei, die Sie ändern müssen, ist die Datei `limits.conf`. Diese Datei ist selbst dokumentiert. Untersuchen Sie die Erklärungen als Kommentare in der Datei, um zu verstehen, was diese Datei macht. Um Ihre Änderungen vorzunehmen, geben Sie Folgendes ein: +Die erste Datei, die Sie ändern müssen, ist die Datei `limits.conf`. Diese Datei ist selbst-dokumentiert. Untersuchen Sie die Erklärungen als Kommentare in der Datei, um zu verstehen, was diese Datei macht. Um Ihre Änderungen vorzunehmen, geben Sie Folgendes ein: ```bash vi /etc/security/limits.conf diff --git a/docs/books/incus_server/01-install.it.md b/docs/books/incus_server/01-install.it.md index 61bb69355e..bbfe413110 100644 --- a/docs/books/incus_server/01-install.it.md +++ b/docs/books/incus_server/01-install.it.md @@ -1,6 +1,6 @@ --- -title: 1 Installazione e configurazione -author: Spencer Steven +title: 1 Installazione e Configurazione +author: Steven Spencer contributors: Ezequiel Bruni, Ganna Zhyrnova tested_with: 9.4 tags: diff --git a/docs/books/incus_server/02-zfs_setup.it.md b/docs/books/incus_server/02-zfs_setup.it.md index caa2e709d4..53f0933feb 100644 --- a/docs/books/incus_server/02-zfs_setup.it.md +++ b/docs/books/incus_server/02-zfs_setup.it.md @@ -1,6 +1,6 @@ --- title: 2 ZFS Setup -author: Spencer Steven +author: Steven Spencer contributors: Ezequiel Bruni, Ganna Zhyrnova tested_with: 9.4 tags: diff --git a/docs/books/incus_server/03-incusinit.de.md b/docs/books/incus_server/03-incusinit.de.md index baeefa3c8c..4020935803 100644 --- a/docs/books/incus_server/03-incusinit.de.md +++ b/docs/books/incus_server/03-incusinit.de.md @@ -5,7 +5,7 @@ contributors: Ezequiel Bruni, Ganna Zhyrnova tested_with: 9.4 tags: - Incus - - enterprise + - Enterprise - Incus-Initialisierung - incus setup --- diff --git a/docs/books/incus_server/03-incusinit.it.md b/docs/books/incus_server/03-incusinit.it.md index ff2dc1e9bb..5f521b8439 100644 --- a/docs/books/incus_server/03-incusinit.it.md +++ b/docs/books/incus_server/03-incusinit.it.md @@ -1,6 +1,6 @@ --- title: 3 Inizializzazione Incus e configurazione dell'utente -author: Spencer Steven +author: Steven Spencer contributors: Ezequiel Bruni, Ganna Zhyrnova tested_with: 9.4 tags: @@ -20,7 +20,7 @@ L'ambiente del server è pronto. È ora possibile inizializzare Incus. Si tratta incus admin init ``` -Ecco le domande e le nostre risposte per lo script, con una piccola spiegazione dove necessario: +Ecco le domande e le nostre risposte per il copione, con una piccola spiegazione dove necessario: ```text Would you like to use clustering? (yes/no) [default=no]: @@ -44,7 +44,7 @@ Lasciare questo nome “default” è un'opzione, ma usare lo stesso nome dato a Name of the storage backend to use (btrfs, dir, lvm, zfs, ceph) [default=zfs]: ``` -You want to accept the default. +Si desidera accettare l'impostazione predefinita. ```text Create a new ZFS pool? (yes/no) [default=yes]: no diff --git a/docs/books/incus_server/04-firewall.it.md b/docs/books/incus_server/04-firewall.it.md index 29ce9dedbb..db10cb2626 100644 --- a/docs/books/incus_server/04-firewall.it.md +++ b/docs/books/incus_server/04-firewall.it.md @@ -1,6 +1,6 @@ --- -title: 4 Configurazione Del Firewall -author: Spencer Steven +title: 4 Configurazione del Firewall +author: Steven Spencer contributors: Ezequiel Bruni, Ganna Zhyrnova tested_with: 9.4 tags: @@ -9,7 +9,7 @@ tags: - incus security --- -Nel corso di questo capitolo, è necessario essere l'utente root o essere in grado di eseguire con i privilegi di root con sudo. +In questo capitolo è necessario essere root o poter utilizzare il comando `sudo` per diventare root. Come per qualsiasi server, è necessario assicurarsi che sia sicuro dal mondo esterno e dalla LAN. Il server di esempio ha solo un'interfaccia LAN, ma è possibile avere due interfacce, ciascuna rivolta verso le reti LAN e WAN. diff --git a/docs/books/incus_server/05-incus_images.it.md b/docs/books/incus_server/05-incus_images.it.md index e497e211a2..ffad564d4c 100644 --- a/docs/books/incus_server/05-incus_images.it.md +++ b/docs/books/incus_server/05-incus_images.it.md @@ -1,6 +1,6 @@ --- title: 5 Impostazione e gestione delle immagini -author: Spencer Steven +author: Steven Spencer contributors: Ezequiel Bruni, Ganna Zhyrnova tested_with: 9.4 tags: @@ -71,7 +71,7 @@ Usare il comando `move` per cambiare il nome del container: incus move rockylinux-test-8 rockylinux-8 ``` -Se avete seguito comunque questa istruzione, fermate il contenitore e riportatelo al nome originale per continuare a seguirlo. +Se avete comunque seguito queste istruzioni, fermate il contenitore e riportatelo al nome originale per continuare a seguire la procedura. Per questa guida, per ora installare altre due immagini: diff --git a/docs/books/incus_server/06-profiles.it.md b/docs/books/incus_server/06-profiles.it.md index c3af2cb6a8..7fff64b159 100644 --- a/docs/books/incus_server/06-profiles.it.md +++ b/docs/books/incus_server/06-profiles.it.md @@ -1,6 +1,6 @@ --- title: 6 Profili -author: Spencer Steven +author: Steven Spencer contributors: Ezequiel Bruni, Ganna Zhyrnova tested_with: 9.4 tags: @@ -39,7 +39,7 @@ Si vuole cambiare l'interfaccia `macvlan`, ma prima di farlo, è necessario sape ip addr ``` -Cercare l'interfaccia con l'assegnazione IP LAN nella rete 192.168.1.0/24: +Cercare l'interfaccia con l'assegnazione LAN IP nella rete 192.168.1.0/24: ```bash 2: enp3s0: mtu 1500 qdisc fq_codel state UP group default qlen 1000 @@ -270,7 +270,7 @@ Infine, uscire dal container e riavviarlo: incus restart rockylinux-test-9 ``` -Aspettate qualche secondo e elencate di nuovo i contenitori: +Aspettate qualche secondo e elencate di nuovo i container: ```bash incus list @@ -328,7 +328,7 @@ La configurazione dell'IP statico è un po' diversa, ma non difficile. È necess vi /etc/netplan/10-incus.yaml ``` -Cambiare ciò che c'è con quanto segue: +Modifica quanto presente con quanto segue: ```bash network: @@ -350,7 +350,7 @@ Riavviare il container: incus restart ubuntu-test ``` -Quando si elencano nuovamente i containeri, si vedrà il proprio IP statico: +Quando si elencano nuovamente i container, si dovrebbe vedere il nuovo IP statico: ```bash +-------------------+---------+----------------------+------+-----------+-----------+ diff --git a/docs/books/incus_server/07-configurations.it.md b/docs/books/incus_server/07-configurations.it.md index b097209373..ad6a155a2f 100644 --- a/docs/books/incus_server/07-configurations.it.md +++ b/docs/books/incus_server/07-configurations.it.md @@ -1,6 +1,6 @@ --- -title: 7 Opzioni di Configurazione del Container -author: Spencer Steven +title: 7 Opzioni di configurazione del Container +author: Steven Spencer contributors: Ezequiel Bruni, Ganna Zhyrnova tested_with: 9.4 tags: @@ -82,7 +82,7 @@ Qui esaminiamo alcune delle opzioni di configurazione più utilizzate. Ad esempi incus config set ubuntu-test limits.memory 2GB ``` -Ciò significa che se la memoria disponibile da utilizzare, ad esempio, 2 GB, il container può effettivamente utilizzare più di 2 GB. Si tratta di un limite morbido, ad esempio. +Ciò significa che se la memoria disponibile da utilizzare, ad esempio, 2 GB, il container può effettivamente utilizzare più di 2 GB. Si tratta di un limite soft, ad esempio. ```bash incus config set ubuntu-test limits.memory.enforce 2GB @@ -126,7 +126,7 @@ locations: - none ``` -Questo mostra che tutti i container utilizzano il pool di archiviazione dir. Quando si usa ZFS, si può anche impostare una quota disco su un container. Ecco come appare il comando, che imposta una quota disco di 2 GB sul container ubuntu-test: +Questo mostra che tutti i container utilizzano il pool di archiviazione dir. Quando si usa ZFS, si può anche impostare una quota disco su un container. Ecco come appare il comando, che imposta una quota disco di 2 Gb sul container ubuntu-test: ```bash incus config device override ubuntu-test root size=2GB diff --git a/docs/books/incus_server/08-snapshots.it.md b/docs/books/incus_server/08-snapshots.it.md index 9b4a725aea..b7da2ab8ba 100644 --- a/docs/books/incus_server/08-snapshots.it.md +++ b/docs/books/incus_server/08-snapshots.it.md @@ -1,6 +1,6 @@ --- title: 8 Container Snapshots -author: Spencer Steven +author: Steven Spencer contributors: Ezequiel Bruni, Ganna Zhyrnova tested_with: 9.4 tags: @@ -15,7 +15,7 @@ I container snapshot e un server snapshot (di cui si parlerà più avanti) sono L'autore ha utilizzato i container Incus per i server PowerDNS rivolti al pubblico e l'aggiornamento di queste applicazioni è diventato meno problematico, grazie alla creazione di snapshots prima di ogni aggiornamento. -È possibile eseguire lo snapshot di un contenitore anche quando è in esecuzione. +È possibile eseguire lo snapshot di un container anche quando è in esecuzione. ## Il processo di snapshot diff --git a/docs/books/incus_server/09-snapshot_server.it.md b/docs/books/incus_server/09-snapshot_server.it.md index 0b5d581d28..83b78d5342 100644 --- a/docs/books/incus_server/09-snapshot_server.it.md +++ b/docs/books/incus_server/09-snapshot_server.it.md @@ -1,6 +1,6 @@ --- title: 9 Server Snapshot -author: Spencer Steven +author: Steven Spencer contributors: Ezequiel Bruni, Ganna Zhyrnova tested_with: 9.4 tags: diff --git a/docs/books/incus_server/10-automating.fr.md b/docs/books/incus_server/10-automating.fr.md index 1e0da8c933..a059c4bf6d 100644 --- a/docs/books/incus_server/10-automating.fr.md +++ b/docs/books/incus_server/10-automating.fr.md @@ -9,7 +9,7 @@ tags: - incus automation --- -Tout au long de ce chapitre, vous devez être l'utilisateur root ou pouvoir utiliser `sudo` pour obtenir les privilèges nécessaires. +Tout au long de ce chapitre, vous devez être l'utilisateur `root` ou pouvoir utiliser `sudo` pour obtenir les privilèges nécessaires. Automatiser le processus de capture instantanée rend les choses beaucoup plus faciles. diff --git a/docs/books/incus_server/30-appendix_a.it.md b/docs/books/incus_server/30-appendix_a.it.md index 0fdd3fad0a..b125fad563 100644 --- a/docs/books/incus_server/30-appendix_a.it.md +++ b/docs/books/incus_server/30-appendix_a.it.md @@ -1,6 +1,6 @@ --- title: Appendice A - Configurazione Workstation -author: Spencer Steven +author: Steven Spencer contributors: Ganna Zhyrnova tested_with: 9.4 tags: @@ -65,7 +65,7 @@ sudo incus admin init Si aprirà una finestra di dialogo a domande e risposte. -Ecco le domande e le nostre risposte per lo script, con una piccola spiegazione dove necessario: +Ecco le domande e le nostre risposte per il copione, con una piccola spiegazione dove necessario: ```text Would you like to use clustering? (yes/no) [default=no]: no @@ -85,7 +85,7 @@ Si noti che `dir` è un po' più lento di `zfs`. Se si può lasciare un disco vu Would you like to connect to a MAAS server? (yes/no) [default=no]: ``` -Il Metal As A Service (MAAS) non rientra nell'ambito di questo documento. +Metal As A Service (MAAS) non rientra nel campo di applicazione del presente documento. ```text Would you like to create a new local network bridge? (yes/no) [default=yes]: @@ -100,7 +100,7 @@ What IPv6 address should be used? (CIDR subnet notation, “auto” or “none Would you like the Incus server to be available over the network? (yes/no) [default=no]: yes ``` -Questa operazione è necessaria per eseguire lo snapshot della workstation. Rispondere "sì" in questo caso. +Questa operazione è necessaria per eseguire lo snapshot della workstation. Rispondere "yes" in questo caso. ```text Address to bind Incus to (not including port) [default=all]: @@ -165,7 +165,7 @@ Si noti che qui non è stato usato `sudo`. L'utente può inserire questi comandi +------------+---------+----------------------+------+-----------+-----------+ ``` -Se lo fate, avete un bell'aspetto! +Se lo fate, state andando alla grande! ## Il resto diff --git a/docs/books/learning_rsync/02_rsync_demo01.fr.md b/docs/books/learning_rsync/02_rsync_demo01.fr.md index dbae1bc339..5e3fce5a03 100644 --- a/docs/books/learning_rsync/02_rsync_demo01.fr.md +++ b/docs/books/learning_rsync/02_rsync_demo01.fr.md @@ -41,7 +41,7 @@ Utilisation favorisée par l'auteur : `rsync -avz original location target locat ## Description de l'environnement -| Élément | Observation | +| Élément | Description | | ----------------------- | ---------------- | | Rocky Linux 8 (Serveur) | 192.168.100.4/24 | | Fedora 34 (client) | 192.168.100.5/24 | diff --git a/docs/books/learning_rsync/05_rsync_authentication-free_login.fr.md b/docs/books/learning_rsync/05_rsync_authentication-free_login.fr.md index 6d5c8b989d..832673f712 100644 --- a/docs/books/learning_rsync/05_rsync_authentication-free_login.fr.md +++ b/docs/books/learning_rsync/05_rsync_authentication-free_login.fr.md @@ -59,7 +59,7 @@ Last login: Tue Nov 2 21:42:44 2021 from 192.168.100.5 [testrsync@Rocky ~]$ ``` -!!! tip "Astuce" +!!! tip "Tip" Le fichier de configuration du serveur **/etc/ssh/sshd_config** doit être ouvert PubkeyAuthentication yes diff --git a/docs/books/web_services/01-files-servers.de.md b/docs/books/web_services/01-files-servers.de.md index 3698f14132..cdf863e555 100644 --- a/docs/books/web_services/01-files-servers.de.md +++ b/docs/books/web_services/01-files-servers.de.md @@ -7,7 +7,7 @@ tags: - sftp --- -!!! info +!!! info "Info" ``` The content for this page has yet to be written. diff --git a/docs/books/web_services/01-files-servers.fr.md b/docs/books/web_services/01-files-servers.fr.md index 863b4b06c0..6ece32cc04 100644 --- a/docs/books/web_services/01-files-servers.fr.md +++ b/docs/books/web_services/01-files-servers.fr.md @@ -7,7 +7,7 @@ tags: - sftp --- -!!! info +!!! info "Info" ``` Cet article est en cours de construction. diff --git a/docs/desktop/appimage/appimage_pool.de.md b/docs/desktop/appimage/appimage_pool.de.md index f1ce207103..7461f0b733 100644 --- a/docs/desktop/appimage/appimage_pool.de.md +++ b/docs/desktop/appimage/appimage_pool.de.md @@ -8,7 +8,7 @@ contributors: Steven Spencer [AppImagePool](https://github.com/prateekmedia/appimagepool) bietet einen Hub zum Installieren und Verwalten von AppImages. Es ähnelt optisch der Softwareanwendung. -## Voraussetzungen +## Vorbedingungen Für diese Anleitung benötigen Sie Folgendes: diff --git a/docs/desktop/gnome/valuta.de.md b/docs/desktop/gnome/valuta.de.md index 88974d4958..a08c27e5a7 100644 --- a/docs/desktop/gnome/valuta.de.md +++ b/docs/desktop/gnome/valuta.de.md @@ -8,7 +8,7 @@ contributors: Steven Spencer, Ganna Zhyrnova Wenn Sie häufig reisen oder ins Ausland ziehen, vereinfachen Sie Ihre Finanzplanung mit Valuta. Diese Anwendung rechnet schnell zwei Währungen um. -## Voraussetzungen +## Vorbedingungen Für diese Anleitung benötigen Sie Folgendes: diff --git a/docs/desktop/printing/brother-all-in-one.de.md b/docs/desktop/printing/brother-all-in-one.de.md index f6e37a8694..fb686d412f 100644 --- a/docs/desktop/printing/brother-all-in-one.de.md +++ b/docs/desktop/printing/brother-all-in-one.de.md @@ -12,7 +12,7 @@ tags: Das Drucken und Scannen mit einem All-in-One-Brother-Drucker ist unter Linux dank der Brother All-in-One-Drucker- und Scannertreiber von Drittanbietern möglich. -!!! info +!!! info "Info" ``` Das Verfahren wurde mit einem Brother MFC-J480DW getestet. diff --git a/docs/gemstones/markdown-demo-v2.it.md b/docs/gemstones/markdown-demo-v2.it.md index 65bf3248a4..814e932f9b 100644 --- a/docs/gemstones/markdown-demo-v2.it.md +++ b/docs/gemstones/markdown-demo-v2.it.md @@ -1,7 +1,7 @@ --- title: Markdown Demo -author: Einstein -contributors: Dr. Ben Dover +author: Steven Spencer +contributors: Wale Soyinka, Tony Guntharp tested_with: 8.5 tags: - sample @@ -11,13 +11,12 @@ tags: # Sommario -!!! WARNING "Attenzione" +## Background - Non prendete sul serio ciò che leggete in questo documento. +- Utilizzare [Markdown](https://daringfireball.net/projects/markdown). +- Conoscenza di markdown. -Come si può capire leggendo, si tratta di un esempio piuttosto sciocco, pensato per testare alcuni problemi di traduzione che stiamo riscontrando. Ma poiché i problemi non sono ancora stati risolti, modificheremo il file un po' qua e un po' là per vedere l'effetto che fa. È divertente scrivere però! - -Questa guida illustra i tag Markdown più diffusi utilizzati su [https://docs.rockylinux.org](https://docs.rockylinux.org) e include anche il tag admonitions, che non fa parte dei tag Markdown standard. +Questa guida illustra i tag Markdown più diffusi utilizzati su [https://docs.rockylinux.org](https://docs.rockylinux.org) e include il tag admonitions, che non fa parte dei tag Markdown standard. ## La Demo @@ -27,13 +26,13 @@ A volte si vedono cose come _questo_. Che ne dite di una piccola **faccina in grassetto** -Nella maggior parte dei casi, si tratta di un testo diretto come questo. +Il più delle volte si tratta di un testo diretto come questo. -A volte è necessario mostrare un comando +A volte, è necessario mostrare un comando O comandi multipli: -``` +```bash dnf install my_stapler dnf update my_pencil dnf remove my_notepad @@ -53,9 +52,33 @@ Altre volte sono necessari elenchi puntati o numerati: E potrebbe essere necessario un ammonimento: -!!! SUGGERIMENTO +### Avvertenze + +Le avvertenze, anch'esse richiamate, sono un'ottima scelta per inserire contenuti collaterali senza interrompere significativamente il flusso del documento. Materiale per MkDocs fornisce diversi tipi di ammonimenti e consente l'inclusione e l'annidamento di contenuti arbitrari. + +!!! TIP + + Le matite e le spillatrici sono di vecchia concezione. + +#### Utilizzo + +Le ammonizioni seguono una sintassi semplice: un blocco inizia con `!!!`, seguito da una parola chiave usata come qualificatore di tipo. Il contenuto del blocco segue sulla riga successiva, rientrando di quattro spazi: + +!!! note + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +#### Modifica del titolo + +Per impostazione predefinita, il titolo sarà uguale al qualificatore di tipo nel caso del titolo. Tuttavia, è possibile modificarlo aggiungendo una stringa quotata contenente Markdown valido (inclusi collegamenti, formattazione, ...) dopo il qualificatore di tipo: + +!!! note "Phasellus posuere in sem ut cursus" - Matite e cucitrici sono davvero vecchia scuola. + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. Spesso, quando un comando ha più opzioni o è necessario elencarne di specifiche, si può usare una tabella per identificare le cose: diff --git a/docs/guides/8_6_installation.it.md b/docs/guides/8_6_installation.it.md index b641ed6340..ad668d0dc2 100644 --- a/docs/guides/8_6_installation.it.md +++ b/docs/guides/8_6_installation.it.md @@ -4,86 +4,83 @@ author: wale soyinka contributors: tianci li, Steven Spencer, Ganna Zhyrnova --- -# Installazione Di Rocky Linux 8 +# Installazione di Rocky Linux 8 Questa guida mostra nel dettaglio i passaggi per installare una versione a 64 bit della distribuzione Rocky Linux su un sistema stand-alone. Effettueremo un'installazione di categoria server utilizzando un'immagine di installazione del sistema operativo scaricata dal sito web del progetto Rocky Linux. Passeremo attraverso i passaggi di installazione e personalizzazione nelle sezioni seguenti. - ## Prerequisiti per Installazione SO Innanzitutto, è necessario scaricare la ISO da utilizzare per questa installazione di Rocky Linux. L'ultima immagine ISO per la versione di Rocky Linux che utilizzeremo per questa installazione può essere scaricata da qui: -``` -https://www.rockylinux.org/download/ -``` + -Per scaricare l'ISO direttamente dalla riga di comando utilizzare il comando `wget`: +Per scaricare l'ISO direttamente dalla riga di comando, utilizzare il comando `wget`: -``` +```bash wget https://download.rockylinux.org/pub/rocky/8.9/isos/x86_64/Rocky-8.9-x86_64-minimal.iso ``` -Le ISO di Rocky Linux sono denominate seguendo questa convenzione: +Le ISO di Rocky Linux sono denominate secondo questa convenzione: -``` +```text Rocky-.--.iso ``` Ad esempio, `Rocky-8.9-x86_64-minimal.iso` -!!! Note "Nota" +!!! Note La pagina web del progetto Rocky elenca diversi mirror, situati in tutto il mondo. Scegliete il mirror geograficamente più vicino a voi. La lista dei mirror ufficiali può essere trovata [quì](https://mirrors.rockylinux.org/mirrormanager/mirrors). ## Verifica del file ISO dell'installazione -Se hai scaricato le ISO di Rocky Linux su una distribuzione Linux esistente, è possibile utilizzare l'utilità `sha256sum` per verificare che i file scaricati non siano corrotti. Mostreremo un esempio di come verificare il file `Rocky-8.5-x86_64-minimal.iso` controllandone il checksum. +Se avete scaricato le ISO di Rocky Linux su una distribuzione Linux esistente, potete usare l'utility `sha256sum` per verificare che i file scaricati non siano corrotti. Mostreremo un esempio di come verificare il file `Rocky-8.5-x86_64-minimal.iso` controllando il suo checksum. -In primo luogo scaricare il file che contiene i checksum ufficiali per le ISO disponibili. Mentre siete ancora nella cartella che contiene la ISO scaricata di Rocky Linux scaricate il file di checksum per la ISO, digitando: +Per prima cosa scaricate il file che contiene le checksum ufficiali delle ISO disponibili. Mentre ci si trova ancora nella cartella che contiene la ISO di Rocky Linux scaricata, scaricare il file di checksum della ISO, digitando: -``` +```bash wget https://download.rockylinux.org/pub/rocky/8.9/isos/x86_64/CHECKSUM ``` Utilizzare l'utilità `sha256sum` per verificare l'integrità del file ISO contro la corruzione e/o la manomissione. -``` +```bash sha256sum -c CHECKSUM --ignore-missing ``` Questo controllerà l'integrità del file ISO scaricato in precedenza, a condizione che si trovi nella stessa directory. L'output dovrebbe mostrare: -``` +```text Rocky-8.9-x86_64-minimal.iso: OK ``` ## L'Installazione -!!! Tip "Suggerimento" +!!! Tip Prima dell'installazione, la Unified Extensible Firmware Interface (UEFI) o il Basic Input/Output System (BIOS) del sistema devono essere preconfigurati per l'avvio dal supporto corretto. È possibile iniziare il processo di installazione se il computer è impostato per l'avvio dal supporto che contiene il file ISO. -Inserire e avviare dal supporto di installazione (disco ottico, unità flash USB, e così via). +Inserire e avviare il supporto di installazione (disco ottico, unità flash USB e così via). -Una volta che il computer si è avviato, vi verrà presentata la schermata di benvenuto di Rocky Linux 8. +Una volta avviato il computer, vi verrà presentata la schermata di benvenuto di Rocky Linux 8. -![Schermata di avvio dell'installazione Rocky Linux](images/install_8_9_01.png) +![Schermata iniziale dell'installazione di Rocky Linux](images/install_8_9_01.png) -Se non si preme alcun tasto il programma di installazione inizierà un conto alla rovescia, dopo il quale il processo di installazione eseguirà automaticamente l'opzione predefinita, evidenziata: +Se non si preme alcun tasto, il programma di installazione inizierà un conto alla rovescia, al termine del quale eseguirà automaticamente l'opzione predefinita, evidenziata: `Test this media & install Rocky Linux 8` -Puoi anche premere Invio in qualsiasi momento per avviare il processo immediatamente. +È anche possibile premere ++enter++ in qualsiasi momento per avviare immediatamente il processo. -Si procederà ad una rapida verifica dei media. Questo passo di verifica del supporto può salvare dal problema di avviare l'installazione solo per scoprire a metà strada che l'installatore deve interrompere a causa di supporti di installazione difettosi. +Verrà eseguita una rapida fase di verifica del supporto. Questa fase di verifica dei supporti può evitare di avviare l'installazione per poi scoprire a metà strada che il programma di installazione deve interromperla a causa di un supporto di installazione difettoso. -Dopo che il controllo del supporto viene completato e il supporto viene verificato come corretto per essere utilizzato, il programma di installazione continuerà automaticamente alla schermata successiva. +Dopo che la verifica del supporto è stata completata e il supporto è stato verificato come utilizzabile, il programma di installazione passa automaticamente alla schermata successiva. -Selezionare la lingua che si desidera utilizzare per l'installazione in questa schermata. Per questa guida, selezioniamo *English (United States)*. Quindi clicca sul pulsante Continue. +Selezionare la lingua che si desidera utilizzare per l'installazione in questa schermata. Per questa guida, abbiamo scelto l'*Inglese (Stati Uniti)*. Quindi fare clic sul pulsante ++"Continue"++. ## Riepilogo Installazione @@ -99,100 +96,100 @@ Ci soffermeremo su ciascuna di queste sezioni e apporteremo modifiche ove necess ### Sezione Localizzazione -Questa sezione è utilizzata per personalizzare le voci relative al locale del sistema. Questo include – tastiera, supporto linguistico, tempo e data. +Questa sezione è utilizzata per personalizzare le voci relative al locale del sistema. Tra questi: tastiera, supporto della lingua, ora e data. #### Tastiera -Sul nostro sistema demo in questa guida, modifichiamo il valore predefinito e selezioniamo (_Italiano (Italiana)_) e salviamo le modifiche. +Nel nostro sistema demo di questa guida, accettiamo il valore predefinito (*English US*) e non apportiamo alcuna modifica. -Tuttavia, se è necessario apportare modifiche qui, dalla schermata _Installation Summary_, clicca sull'opzione Keyboard per specificare il layout della tastiera del sistema. È possibile aggiungere ulteriori layout della tastiera se è necessario nella successiva schermata e specificare il loro ordine. +Tuttavia, se è necessario apportare modifiche, dalla schermata *Installation Summary*, fare clic sull'opzione ++"Keyboard"++ per specificare il layout della tastiera del sistema. Se necessario, nella schermata successiva è possibile aggiungere altri layout di tastiera e specificarne l'ordine. -Clicca Fatto quando hai finito con questa schermata. +Fare clic su ++"done "++ al termine di questa schermata. #### Supporto Lingue -L'opzione Supporto Linguistico nella schermata _Riepilogo Installazione_ consente di specificare il supporto per le lingue aggiuntive di cui potresti aver bisogno sul sistema finito. +L'opzione ++"Supporto lingua"++ della schermata *Riepilogo installazione* consente di specificare il supporto per ulteriori lingue che potrebbero essere necessarie sul sistema finito. -Accetteremo il valore predefinito (__Italiano – Italia__) e non apporteremo alcuna modifica, fare clic su Fatto. +Accetteremo il valore predefinito (**Inglese - Stati Uniti**) e non apporteremo alcuna modifica, facendo clic su ++"done"++. #### Data & Ora -Fai clic sull'opzione Ora e data nella schermata principale _Riepilogo Installazione_ per far apparire un'altra schermata che ti permetterà di selezionare il fuso orario in cui si trova la macchina. Scorri l'elenco delle regioni e delle città e seleziona l'area più vicina a te. +Fare clic sull'opzione ++"Time & Date"++ nella schermata principale *Installation Summary* per visualizzare un'altra schermata che consente di selezionare il fuso orario in cui si trova la macchina. Scorri l'elenco delle regioni e delle città e seleziona l'area più vicina a te. -A seconda della fonte di installazione, l'opzione _Ora da rete_ potrebbe essere impostata su _ON_ o _OFF_ per impostazione predefinita. Accetta l'impostazione predefinita _ON_; questo permette al sistema di impostare automaticamente il tempo corretto utilizzando il Network Time Protocol (NTP). Fare clic su Fatto dopo aver apportato eventuali modifiche. +A seconda della fonte di installazione, l'opzione *Ora di rete* può essere impostata di default su *ON* o *OFF*. Accettare l'impostazione predefinita *ON*; ciò consente al sistema di impostare automaticamente l'ora corretta utilizzando il Network Time Protocol (NTP). Fare clic su ++“done ”++ dopo aver apportato le modifiche. ### Sezione Software -Nella sezione _Software_ della schermata _Riepilogo Installazione_, è possibile selezionare la sorgente di installazione e i pacchetti aggiuntivi (applicazioni) che verranno installati. +Nella sezione *Software* della schermata *Riepilogo installazione*, è possibile selezionare l'origine dell'installazione e i pacchetti aggiuntivi (applicazioni) che vengono installati. #### Sorgente Installazione -Dal momento che stiamo eseguendo la nostra installazione utilizzando un'immagine completa Rocky 8, noterai che _Media Locale_ è automaticamente specificato nella sezione Installation Source della schermata principale _Riepilogo Installazione_. Accetteremo i valori preimpostati. +Poiché stiamo eseguendo l'installazione utilizzando un'immagine completa di Rocky 8, noterete che il *supporto locale* è specificato automaticamente nella sezione Origine dell'installazione della schermata principale di *riepilogo dell'installazione*. Accetteremo le impostazioni predefinite. -!!! Tip "Suggerimento" +!!! Tip - L'area Installation Source è dove è possibile scegliere di eseguire un'installazione basata sulla rete. Per un'installazione basata sulla rete, è necessario innanzitutto assicurarsi che una scheda di rete sul sistema di destinazione sia configurata correttamente e possa raggiungere Internet. Per eseguire un'installazione basata sulla rete, clicca su `Installation Source` e quindi seleziona il pulsante radio `On the network`. Una volta selezionato, scegli il protocollo `https` e digita il seguente URL nel campo di testo `download.rockylinux.org/pub/rocky/8/BaseOS/x86_64/os`. Clicca su `Fatto`. + Nell'area Origine dell'installazione si può scegliere di eseguire un'installazione basata sulla rete. Per un'installazione basata sulla rete, è necessario innanzitutto assicurarsi che una scheda di rete sul sistema di destinazione sia configurata correttamente e possa raggiungere Internet. Per eseguire un'installazione basata sulla rete, clicca su `Installation Source` e quindi seleziona il pulsante radio `On the network`. Una volta selezionato, scegli il protocollo `https` e digita il seguente URL nel campo di testo `download.rockylinux.org/pub/rocky/8/BaseOS/x86_64/os`. Clicca su `Done`. #### Selezione Software -Facendo clic sull'opzione Selezione Software nella schermata principale _Riepilogo Installazione_ ti viene presentata la sezione dell'installazione dove puoi scegliere i pacchetti software esatti che vengono installati sul sistema. L'area di selezione del software è suddivisa in: +Facendo clic sull'opzione ++"Selezione software "++ nella schermata principale di *riepilogo dell'installazione*, si accede alla sezione dell'installazione in cui è possibile scegliere i pacchetti software esatti da installare sul sistema. L'area di selezione del software è suddivisa in: - _Base Environment_: Server, Installazione minima, Sistema operativo personalizzato - _Additional software for Selected Environment area_: Selezionando un Base Environment sul lato sinistro si presenta una varietà di software aggiuntivi correlati che possono essere installati per l'ambiente specificato sul lato destro. -Seleziona invece l'opzione _Installazione minima_ (Funzionalità di base). +Selezionare invece l'opzione *Installazione minima* (funzionalità di base). -Clicca su Fatto nella parte superiore dello schermo. +Fare clic ++"done"++ in alto sullo schermo. ### Sezione Sistema -La sezione Sistema della schermata _Riepilogo Installazione_ viene utilizzata per personalizzare e apportare modifiche all'hardware sottostante al sistema di destinazione. Qui è dove si creano le partizioni o i volumi del disco rigido, si specifica il file system da utilizzare e si specifica la configurazione di rete. +La sezione Sistema della schermata *Riepilogo installazione* viene utilizzata per personalizzare e apportare modifiche all'hardware sottostante del sistema di destinazione. Qui si creano le partizioni o i volumi del disco rigido, si specifica il file system da utilizzare e la configurazione di rete. #### Destinazione Installazione -Dalla schermata _Riepilogo Installazione_, clicca sull'opzione Destinazione Installazione. Questo ti porta alla corrispondente area di attività. +Dalla schermata *Riepilogo installazione*, fare clic sull'opzione `Destinazione installazione`. Si accede così all'area operativa corrispondente. -Verrà visualizzata una schermata che mostra tutte le unità disco candidate disponibili sul sistema di destinazione. Se avete un solo disco sul sistema, come sul nostro sistema di esempio, vedrai l'unità elencata sotto _Dischi locali standard_ con un segno di spunta accanto ad essa. Facendo clic sull'icona del disco si attiverà o disattiverà il segno di spunta per la selezione del disco. Vogliamo che sia selezionato/spuntato qui. +Verrà visualizzata una schermata con tutte le unità disco candidate disponibili sul sistema di destinazione. Se nel sistema è presente una sola unità disco, come nel nostro sistema campione, l'unità viene elencata sotto *Dischi standard locali* con un segno di spunta accanto. Facendo clic sull'icona del disco si attiva o disattiva il segno di spunta della selezione del disco. Vogliamo che sia selezionato/spuntato qui. -Sotto la sezione Opzioni _Configurazione di archiviazione_, selezionare il pulsante radio Automatic. +Nella sezione Opzioni di *Configurazione dell'archiviazione*, selezionare il pulsante di opzione ++"Automatic"++. -Quindi clicca su Fatto nella parte superiore dello schermo. +Quindi fare clic su ++“done”++ nella parte superiore dello schermo. -Una volta che il programma di installazione determina che si dispone di un disco utilizzabile, verrete reindirizzati alla schermata _Riepilogo Installazione_. +Una volta che il programma di installazione ha stabilito che il disco è utilizzabile, si torna alla schermata di *Riepilogo Installazione*. ### Rete & Nome Host -L'attività finale della procedura d'installazione riguarda la configurazione della rete, dove è possibile configurare o modificare le impostazioni relative alla rete per il sistema. +L'ultima operazione della procedura di installazione riguarda la configurazione di rete, dove è possibile configurare o modificare le impostazioni relative alla rete del sistema. -!!! Note "Nota" +!!! Note - Dopo aver fatto clic sull'opzione Network & Nome Host, tutto l'hardware dell'interfaccia di rete correttamente rilevato (come Ethernet, le schede di rete wireless, e così via) saranno elencate nel riquadro sinistro della schermata di configurazione di rete. A seconda della distribuzione Linux e della specifica configurazione hardware, i dispositivi Ethernet in Linux hanno nomi simili a `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3`, e così via. + Dopo aver fatto clic sull'opzione ++"Network & Hostname"++ , tutti i componenti dell'interfaccia di rete correttamente rilevati (come schede di rete Ethernet, wireless e così via) saranno elencati nel riquadro sinistro della schermata di configurazione della rete. A seconda della distribuzione Linux e della specifica configurazione hardware, i dispositivi Ethernet in Linux hanno nomi simili a `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3` e così via. -È possibile configurare ogni interfaccia tramite DHCP o impostare manualmente l'indirizzo IP. Se si sceglie di configurare manualmente, assicurarsi di avere tutte le informazioni pertinenti pronte, come l'indirizzo IP, maschera di rete, e così via. +È possibile configurare ogni interfaccia tramite DHCP o impostare manualmente l'indirizzo IP. Se si sceglie di configurare manualmente, assicurarsi di avere pronte tutte le informazioni pertinenti, come l'indirizzo IP, la netmask e così via. -Facendo clic sul pulsante Network & Nome Host nella schermata principale _Riepilogo Installazione_ si apre la corrispondente schermata di configurazione. Tra le altre cose, è possibile configurare il nome host del sistema (il nome predefinito è `localhost.localdomain`). +Facendo clic sul pulsante ++“Network & Hostname”++ nella schermata principale *Installation Summary* si apre la schermata di configurazione corrispondente. Tra le altre cose, è possibile configurare l'hostname del sistema (il nome predefinito è `localhost.localdomain`). -!!! Note "Nota" +!!! Note - È possibile modificare facilmente questo nome in seguito dopo che il sistema operativo è stato installato. Per ora, accetta il valore predefinito fornito per il nome host. + È possibile modificare facilmente questo nome in un secondo momento, dopo l'installazione del sistema operativo. Per il momento, accettare il valore predefinito fornito per il nome dell'host. -Il prossimo importante compito di configurazione è relativo alle interfacce di rete del sistema. In primo luogo, verificare che una scheda Ethernet (o qualsiasi scheda di rete) sia elencata nel riquadro a sinistra. Fare clic su uno dei dispositivi di rete rilevati nel riquadro a sinistra per selezionarlo. Le proprietà configurabili della scheda di rete selezionata appariranno nel riquadro destro dello schermo. +La prossima importante operazione di configurazione riguarda le interfacce di rete del sistema. Innanzitutto, verificare che una scheda Ethernet (o qualsiasi altra scheda di rete) sia elencata nel riquadro di sinistra. Fare clic su uno qualsiasi dei dispositivi di rete rilevati nel riquadro di sinistra per selezionarlo. Le proprietà configurabili dell'adattatore di rete selezionato appariranno nel riquadro destro della schermata. -!!! Note "Nota" +!!! Note - Sul nostro sistema di esempio abbiamo due dispositivi Ethernet (`ens3` e `ens4`), tutti in uno stato connesso. Il tipo, il nome, la quantità e lo stato dei dispositivi di rete sul vostro sistema possono variare da quelli sul nostro sistema di esempio. + Sul nostro sistema di esempio, abbiamo due dispositivi Ethernet (`ens3` e `ens4`), entrambi in stato connesso. Il tipo, il nome, la quantità e lo stato dei dispositivi di rete del vostro sistema possono variare rispetto a quelli del nostro sistema campione. -Assicurarsi che l'interruttore del dispositivo che si desidera configurare sia capovolto nella posizione `ON` nel riquadro destro. Accetteremo tutti i valori predefiniti in questa sezione. +Assicurarsi che l'interruttore del dispositivo che si desidera configurare sia posizionato su `ON` nel riquadro di destra. In questa sezione verranno accettate tutte le impostazioni predefinite. -Clicca Fatto per tornare alla schermata principale _Riepilogo Installazione_. +Fare clic su ++“done”++ per tornare alla schermata principale Installation summary. -!!! Warning "Attenzione" +!!! warning "Attenzione" - Prestare attenzione all'indirizzo IP del server in questa sezione del programma d'installazione. Se non si dispone di un accesso fisico o facile alla console del sistema, queste informazioni saranno utili in seguito quando è necessario connettersi al server per continuare a lavorare. + Prestare attenzione all'indirizzo IP del server in questa sezione del programma di installazione. Se non si dispone di un accesso fisico o facile alla console del sistema, queste informazioni saranno utili in seguito quando è necessario connettersi al server per continuare a lavorare. ## Fase di Installazione -Una volta che siete soddisfatti delle vostre scelte per le varie attività dell'installazione, la fase successiva del processo d'installazione inizierà l'installazione vera e propria. +Una volta soddisfatti delle scelte effettuate per le varie attività di installazione, la fase successiva del processo di installazione darà inizio all'installazione vera e propria. ### Sezione Impostazioni Utente @@ -200,65 +197,64 @@ Questa sezione può essere utilizzata per creare una password per l'account uten ### Impostare la password di root -Clicca sul campo _Password di root_ sotto _Impostazioni Utente_ per avviare la schermata _Password di Root_. Nella casella di testo _Password di root_, imposta una password forte per l'utente root. - -!!! Warning "Attenzione" +Fare clic sul campo *Password di root* in *Impostazioni utente* per avviare la schermata dell'attività *Password di root*. Nella casella di testo *Password di root*, impostare una password forte per l'utente root. - Il superutente root è l'account con più privilegi nel sistema. Pertanto, se si sceglie di usarlo o abilitarlo, è fondamentale proteggere questo account con una password forte. +!!! warning "Attenzione" -Inserire nuovamente la stessa password nella casella di testo _Conferma_. + Il superutente root è l'account più privilegiato del sistema. Pertanto, se si sceglie di utilizzarlo o di abilitarlo, è fondamentale proteggere questo account con una password forte. -Clicca su Fatto. +Immettere nuovamente la stessa password nella casella di testo *Conferma*. +Fare clic su ++"done"++ ### Creare un account utente -Poi clicca sul campo _Creazione utente_ sotto _Impostazioni Utente_ per avviare la schermata _Crea utente_. Questa area di attività consente di creare un account utente privilegiato o non privilegiato (non amministrativo) sul sistema. +Fare quindi clic sul campo *Creazione utente* in *Impostazioni utente* per avviare la schermata dell'attività *Crea utente*. Quest'area operativa consente di creare un account utente privilegiato o non privilegiato (non amministrativo) sul sistema. !!! Info - Creare e utilizzare un account non privilegiato per i compiti quotidiani di un sistema è una buona pratica di amministrazione del sistema. + La creazione e l'uso di un account non privilegiato per le attività quotidiane di un sistema è una buona pratica di amministrazione del sistema. -Creeremo un utente normale che può invocare i poteri di superutente (amministratore), lo stesso utente root, quando necessario. +Creeremo un utente normale che può invocare i poteri di superutente (amministratore), come l'utente root, quando necessario. -Completare i campi nella schermata _Crea utente_ con le seguenti informazioni e quindi fare clic su Fatto: +Completare i campi della schermata *Create User* con le seguenti informazioni e fare clic su ++“done”++: -_Nome completo_: `rockstar` +*Nome completo*: `rockstar` -_Nome utente_: `rockstar` +*Nome utente*: `rockstar` _Imposta questo utente come amministratore_: Spuntato -_Richiedi una password per utilizzare questo account_: Spuntato +*Richiedi una password per utilizzare questo account*: Spuntato -_Password_: `04302021` +*Password*: `04302021` -_Conferma password_: `04302021` +*Confermare password*: `04302021` ### Avviare l'installazione -Una volta che siete soddisfatti delle vostre scelte per le varie attività dell'installazione, fate clic sul pulsante Avvia installazione nella schermata principale _Riepilogo Installazione_. L'installazione inizierà, e l'installatore mostrerà i progressi dell'installazione. Quando inizia l'installazione, varie attività inizieranno ad essere eseguite in background, come il partizionamento del disco, la formattazione delle partizioni o i volumi di LVM, controllare e risolvere le dipendenze del software, scrivere il sistema operativo sul disco e così via. +Una volta soddisfatti delle scelte effettuate per le varie attività di installazione, fare clic sul pulsante Inizia l'installazione nella schermata principale di *Riepilogo Installazione*. L'installazione avrà inizio e il programma di installazione mostrerà l'avanzamento dell'installazione. Quando inizia l'installazione, iniziano ad essere eseguite varie attività in background, come il partizionamento del disco, la formattazione delle partizioni o dei volumi LVM, la verifica e la risoluzione delle dipendenze software, la scrittura del sistema operativo sul disco e così via. -!!! Note "Nota" +!!! Note - Se non si desidera continuare dopo aver fatto clic sul pulsante Avvia Installazione, si può ancora tranquillamente tornare fuori dall'installazione senza alcuna perdita di dati. Per uscire dall'installatore, è sufficiente ripristinare il sistema facendo clic sul pulsante Esci, premendo ctrl-alt-del sulla tastiera, o spingendo l'interruttore di reset o di alimentazione. + Se non si desidera continuare dopo aver fatto clic sul pulsante Inizia l'installazione, si può comunque uscire dall'installazione senza perdere i dati. Per uscire dal programma di installazione, è sufficiente resettare il sistema facendo clic sul pulsante Esci, premendo ctrl-alt-del sulla tastiera o premendo l'interruttore di reset o di alimentazione. ### Completare l'installazione -Dopo aver completato tutte le sotto-attività obbligatorie, e l'installatore ha eseguito il suo corso, ti verrà presentata una schermata di avanzamento dell'installazione finale con un messaggio di completamento. +Dopo aver completato tutte le operazioni secondarie obbligatorie e dopo che il programma di installazione ha fatto il suo corso, verrà presentata una schermata finale di avanzamento dell'installazione con un messaggio di completato. -Infine, completare la procedura facendo clic sul pulsante Reboot System. Il sistema verrà riavviato. +Infine, completare l'intera procedura facendo clic sul pulsante ++“Reboot System”++. Il sistema verrà riavviato. ### Accesso -Il sistema è ora configurato e pronto per l'uso. Vedrete la console Rocky Linux. +Il sistema è ora impostato e pronto per l'uso. Verrà visualizzata la console Rocky Linux. -![Rocky Linux Schermata Di Benvenuto](images/installation_8_F02.png) +![Schermata di benvenuto di Rocky Linux](images/installation_8_F02.png) -Per accedere al sistema, digita `rockstar` al prompt di accesso e premi Invio. +Per accedere al sistema, digitare `rockstar` al prompt di login e premere ++enter++. -Al prompt della Password, digita `04302021` (la password di rockstar) e premi Invio (la password ***non*** sarà visualizzata sullo schermo, questo è normale). +Al prompt della password, digitare `04302021` (la passwrod di rockstar) e premere ++enter++ (la password non verrà riportata sullo schermo, è normale). -Eseguiremo il comando `whoami` dopo l'accesso, questo comando mostra il nome dell'utente attualmente connesso. +Dopo il login verrà eseguito il comando `whoami`, che mostra il nome dell'utente attualmente connesso. -![Schermata di Login](images/installation-F06.png) +![Schermata di accesso](images/installation-F06.png) diff --git a/docs/guides/migrate2rocky.it.md b/docs/guides/migrate2rocky.it.md index 021825449f..59ad437aec 100644 --- a/docs/guides/migrate2rocky.it.md +++ b/docs/guides/migrate2rocky.it.md @@ -9,11 +9,11 @@ update: 11-23-2021 ## Prerequisiti e presupposti -* CentOS Stream, CentOS, AlmaLinux, RHEL o Oracle Linux in esecuzione su un server hardware o un VPS. CentOS non-Stream è fermo alla versione 8.5. La versione supportata al momento degli altri sistemi è la 8.9 o la 9.3. -* Conoscenza della riga di comando -* Conoscenza operativa di SSH per macchine remote. -* Un atteggiamento di leggera propensione al rischio -* Eseguire i comandi come root. Accedere come root o avere la possibilità di elevare i privilegi con `sudo` +- CentOS Stream, CentOS, AlmaLinux, RHEL o Oracle Linux versione 8 o 9 su un server hardware o VPS. CentOS non-Stream è fermo alla versione 8.5. La versione attualmente supportata degli altri sistemi è la 8.10 o la 9.6. La versione 10 non è attualmente supportata. +- Conoscenza della riga di comando +- Conoscenza operativa di SSH per macchine remote. +- Un atteggiamento di leggera propensione al rischio +- Eseguire i comandi come root. Accedere come root o avere la possibilità di elevare i privilegi con `sudo` ## Introduzione @@ -40,13 +40,16 @@ Sei pronto? ### Il modo manuale -Scaricate i file compressi da GitHub ed estraete quello che vi serve (sarà *migrate2rocky.sh*). È possibile trovare i file zip per qualsiasi repository GitHub sul lato destro della pagina principale del repository: +Scaricate i file compressi da GitHub ed estraete quello che vi serve (sarà *migrate2rocky.sh* o *migrate2rocky9.sh*). È possibile trovare i file zip per qualsiasi repository GitHub sul lato destro della pagina principale del repository: -![Il pulsante "Download Zip"](images/migrate2rocky-github-zip.png) +![The "Download Zip" button](images/migrate2rocky-github-zip.png) -Quindi, caricare l'eseguibile sul server tramite SSH eseguendo questo comando sul computer locale: +Quindi, caricare l'eseguibile sul server con SSH eseguendo questo comando sul computer locale: -``` +!!! Note "Nota" + Se si utilizza un sistema 9.x, aggiungere un 9 prima del file `.sh`. + +```bash scp PATH/TO/FILE/migrate2rocky.sh root@yourdomain.com:/home/ ``` @@ -54,58 +57,64 @@ Regolare tutti i percorsi dei file e i domini dei server o gli indirizzi IP seco ### Il modo `git` -Installare `git` sul proprio server con: +Installare `git` sul server con: -``` +```bash dnf install git ``` Quindi clona il repository rocky-tools con: -``` +```git git clone https://github.com/rocky-linux/rocky-tools.git ``` -Nota: questo metodo scaricherà tutti gli script e i file nel repository rocky-tools. +Nota: questo metodo scarica tutti gli script e i file dal repository rocky-tools. ### Il modo più semplice -Questo è probabilmente il modo più semplice per ottenere lo script. È sufficiente che sul server sia installato un client HTTP adeguato (curl, wget, lynx e così via). +Questo è probabilmente il modo più semplice per ottenere lo script. È sufficiente che sul server sia installato un client HTTP adeguato (`curl`, `wget`, `lynx` e così via). -Supponendo che abbiate installato l'utilità `curl`, eseguite questo comando per scaricare lo script nella directory che state utilizzando: +Supponendo che sia installata l'utilità `curl`, eseguire il seguente comando per scaricare lo script nella directory in uso: -``` +!!! Note "Nota" + Se si utilizza un sistema 9.x, aggiungere un 9 prima del file `.sh`. + +```bash curl https://raw.githubusercontent.com/rocky-linux/rocky-tools/main/migrate2rocky/migrate2rocky.sh -o migrate2rocky.sh ``` -Questo comando scaricherà il file direttamente sul server e *solo* il file che vuoi. Ma anche in questo caso, i problemi di sicurezza suggeriscono che questa non è necessariamente la pratica migliore, quindi tenetene conto. +Questo comando scaricherà il file sul server e *solo* quello desiderato. Ma anche in questo caso, i problemi di sicurezza suggeriscono che questa non è necessariamente la pratica migliore, quindi tenetene conto. ## Esecuzione dello script e installazione -Usate il comando `cd` per passare alla directory in cui si trova lo script, assicuratevi che il file sia eseguibile e date i permessi x al proprietario del file dello script. +Usate il comando `cd` per passare alla directory in cui si trova lo script, assicuratevi che il file sia eseguibile e date al proprietario del file di script i permessi di esecuzione 'x'. -``` +!!! Note "Nota" + Nei comandi seguenti, se si utilizza un sistema 9.x, aggiungere un 9 prima di `.sh`. + +```bash chmod u+x migrate2rocky.sh ``` E ora, finalmente, eseguite lo script: -``` +```bash ./migrate2rocky.sh -r ``` -Questa opzione "-r" dice allo script di andare avanti e installare tutto. +L'opzione "-r" indica allo script di procedere all'installazione di tutto. Se avete fatto tutto correttamente, la vostra finestra di terminale avrà un aspetto simile a questo: -![avvio dello script riuscito](images/migrate2rocky-convert-01.png) +![a successful script startup](images/migrate2rocky-convert-01.png) -Ora, lo script impiegherà un po' di tempo per convertire tutto, a seconda della macchina in uso e della connessione a Internet. +Ora, lo script impiegherà un po' di tempo per convertire tutto, a seconda della macchina in uso e della sua connessione a Internet. -Se vedi un messaggio **Complete!** alla fine, allora tutto va bene e puoi riavviare il server. +Se alla fine viene visualizzato il messaggio **Complete!**, tutto è a posto e si può riavviare il server. -![messaggio di migrazione OS riuscito](images/migrate2rocky-convert-02.png) +![a successful OS migration message](images/migrate2rocky-convert-02.png) Lasciate passare un po' di tempo, riaccedete e dovreste avere un nuovo server Rocky Linux. Eseguite il comando `hostnamectl` per verificare che il sistema operativo sia stato migrato correttamente e siete a posto. -![Il risultato del comando hostnamectl](images/migrate2rocky-convert-03.png) +![The results of the hostnamectl command](images/migrate2rocky-convert-03.png) diff --git a/docs/guides/security/authentication/active_directory_authentication_with_samba.it.md b/docs/guides/security/authentication/active_directory_authentication_with_samba.it.md new file mode 100644 index 0000000000..bce0a3b197 --- /dev/null +++ b/docs/guides/security/authentication/active_directory_authentication_with_samba.it.md @@ -0,0 +1,173 @@ +--- +title: Autenticazione Active Directory con Samba +author: Neel Chauhan +contributors: Steven Spencer, Ganna Zhyrnova +tested_with: 9.4 +--- + +## Prerequisiti + +- Conoscenza di Active Directory +- Conoscenza di LDAP + +## Introduzione + +Nella maggior parte delle aziende, Active Directory (AD) di Microsoft è il sistema di autenticazione predefinito per i sistemi Windows e per i servizi esterni collegati a LDAP. Consente di configurare utenti e gruppi, controllo degli accessi, autorizzazioni, auto-mounting e altro ancora. + +Sebbene la connessione di Linux a un cluster AD non possa supportare _tutte_ le funzionalità menzionate, può gestire utenti, gruppi e controllo degli accessi. È possibile (attraverso alcune modifiche di configurazione sul lato Linux e alcune opzioni avanzate sul lato AD) distribuire chiavi SSH utilizzando AD. + +Il modo predefinito di utilizzare Active Directory su Rocky Linux è SSSD, ma Samba è un'alternativa più completa. Ad esempio, la condivisione dei file può essere effettuata con Samba ma non con SSSD. Questa guida, tuttavia, tratterà la configurazione dell'autenticazione per Active Directory utilizzando Samba e non includerà alcuna configurazione aggiuntiva sul lato Windows. + +## Trovare e join AD usando Samba + +!!! Note + +``` +Il nome del dominio `ad.company.local` in questa guida rappresenta il dominio Active Directory. Per seguire questa guida, sostituitelo con il nome del vostro dominio AD. +``` + +Il primo passo per unire un sistema Linux ad AD è quello di scoprire il cluster AD, per assicurarsi che la configurazione di rete sia corretta su entrambi i lati. + +### Preparazione + +- Assicurarsi che le seguenti porte siano aperte per l'host Linux sul domain controller: + + | Servizio | Porta(e) | Note | + | -------- | ------------------------------------ | ---------------------------------------------------------------------------- | + | DNS | 53 (TCP+UDP) | | + | Kerberos | 88, 464 (TCP+UDP) | Usato da `kadmin` per impostare & aggiornare le password | + | LDAP | 389 (TCP+UDP) | | + | LDAP-GC | 3268 (TCP) | LDAP Global Catalog - consente di generare ID utenti da AD | + +- Assicurarsi di aver configurato il domain controller AD come server DNS sull'host Rocky Linux: + + **Con NetworkManager:** + + ```sh + # dove la tua connessione principale a NetworkManager è 'System eth0' e il tuo server AD + # è accessibile all'indirizzo IP 10.0.0.2. + [root@host ~]$ nmcli con mod 'System eth0' ipv4.dns 10.0.0.2 + ``` + +- Assicurarsi che l'ora su entrambi i lati (host AD e sistema Linux) sia sincronizzata (vedere chronyd) + + **Per verificare l'ora su Rocky Linux:** + + ```sh + [user@host ~]$ date + Mer 22 set 17:11:35 BST 2021 + ``` + +- Installare i pacchetti richiesti per la connessione AD sul lato Linux: + + ```sh + [user@host ~]$ sudo dnf install samba samba-winbind samba-client + ``` + +### Rilevare + +Ora dovreste essere in grado di rilevare i vostri server AD dall'host Linux. + +```sh +[user@host ~]$ realm discover ad.company.local +ad.company.local + type: kerberos + realm-name: AD.COMPANY.LOCAL + domain-name: ad.company.local + configured: no + server-software: active-directory + client-software: sssd + required-package: oddjob + required-package: oddjob-mkhomedir + required-package: sssd + required-package: adcli + required-package: samba-common +``` + +I record SRV pertinenti memorizzati nel servizio DNS di Active Directory consentiranno la scoperta. + +### Unirsi + +Una volta individuata con successo l'installazione di Active Directory dall'host Linux, si dovrebbe essere in grado di usare `realmd` per unirsi al dominio, che orchestrerà la configurazione di Samba usando `adcli` e altri strumenti simili. + +```sh +[user@host ~]$ sudo realm join -v --membership-software=samba --client-software=winbind ad.company.local +``` + +Verrà richiesto di inserire la password di amministratore del dominio, quindi inserirla. + +Se questo processo si lamenta della crittografia con `KDC has no support for encryption type`, provare ad aggiornare la politica globale di crittografia per consentire algoritmi di crittografia più vecchi: + +```sh +[user@host ~]$ sudo update-crypto-policies --set DEFAULT:AD-SUPPORT +``` + +Se il processo ha successo, si dovrebbe essere in grado di estrarre le informazioni `passwd` per un utente di Active Directory. + +```sh +[user@host ~]$ sudo getent passwd administrator@ad.company.local +AD\administrator:*:1450400500:1450400513:Administrator:/home/administrator@ad.company.local:/bin/bash +``` + +!!! Note + +``` +`getent` ottiene le voci dalle librerie Name Service Switch (NSS). Ciò significa che, al contrario di `passwd` o `dig` per esempio, interrogherà diversi database, tra cui `/etc/hosts` per `getent hosts` o da `samba` nel caso di `getent passwd`. +``` + +`realm` fornisce alcune opzioni interessanti che si possono utilizzare: + +| Opzione | Osservazione | +| -------------------------------------------------------------------------- | ----------------------------------------------------------------- | +| --computer-ou='OU=LINUX,OU=SERVERS,dc=ad,dc=company.local' | L'OU in cui memorizzare l'account del server | +| --os-name='rocky' | Specificare il nome del sistema operativo memorizzato in AD | +| --os-version='8' | Specificare la versione del sistema operativo memorizzata nell'AD | +| -U admin_username | Specificare un account di amministratore | + +### Tentativo di autenticazione + +Ora gli utenti dovrebbero essere in grado di autenticarsi all'host Linux tramite Active Directory. + +**Su Windows 10:** (che fornisce la propria copia di OpenSSH) + +```dos +C:\Users\John.Doe> ssh -l john.doe@ad.company.local linux.host +Password for john.doe@ad.company.local: + +Activate the web console with: systemctl enable --now cockpit.socket + +Last login: Wed Sep 15 17:37:03 2021 from 10.0.10.241 +[john.doe@ad.company.local@host ~]$ +``` + +Se l'operazione ha successo, si è configurato Linux per utilizzare Active Directory come fonte di autenticazione. + +### Eliminazione del nome di dominio nei nomi utente + +In una configurazione completamente predefinita, è necessario accedere con il proprio account AD specificando il dominio nel nome utente (ad esempio, `john.doe@ad.company.local`). Se questo non è il comportamento desiderato e si vuole invece essere in grado di omettere il nome di dominio predefinito al momento dell'autenticazione, è possibile configurare Samba in modo che sia predefinito un dominio specifico. + +Si tratta di un processo relativamente semplice, che richiede una modifica al file di configurazione `smb.conf`. + +```sh +[user@host ~]$ sudo vi /etc/samba/smb.conf +[global] +... +winbind use default domain = yes +``` + +Aggiungendo l'opzione `winbind use default domain`, si indica a Samba di dedurre che l'utente sta cercando di autenticarsi come utente del dominio `ad.company.local`. Ciò consente di autenticarsi come `john.doe` invece di `john.doe@ad.company.local`. + +Per rendere effettiva questa modifica della configurazione, è necessario riavviare i servizi `smb` e `winbind` con `systemctl`. + +```sh +[user@host ~]$ sudo systemctl restart smb winbind +``` + +Allo stesso modo, se non si vuole che le directory home abbiano il suffisso del nome di dominio, è possibile aggiungere queste opzioni nel file di configurazione `/etc/samba/smb.conf`: + +```bash +[global] +template homedir = /home/%U +``` + +Non dimenticare di riavviare i servizi `smb` e `winbind`. diff --git a/docs/guides/security/firewalld-beginners.it.md b/docs/guides/security/firewalld-beginners.it.md index a1e4326cd7..59f7dce565 100644 --- a/docs/guides/security/firewalld-beginners.it.md +++ b/docs/guides/security/firewalld-beginners.it.md @@ -8,7 +8,7 @@ contributors: Steven Spencer, Ganna Zhyrnova ## Introduzione -Molto tempo fa, ero un piccolo utente di computer alle prime armi che aveva sentito dire che avere un firewall *doveva* essere super buono. Mi permetterebbe di decidere cosa entra e cosa esce dal mio computer, giusto? Ma sembrava soprattutto che impedisse ai miei videogiochi di accedere a Internet; non ne ero *felice*. +Molto tempo fa, ero un piccolo utente di computer alle prime armi che aveva sentito dire che avere un firewall *doveva* essere super buono. Mi permetterebbe di decidere cosa entra e cosa esce dal mio computer, giusto? Ma soprattutto sembrava che impedisse ai miei videogiochi di accedere a Internet; *non* ero contento. Naturalmente, se siete qui, probabilmente avete un'idea migliore di me su cosa sia un firewall e cosa faccia. Ma se la vostra esperienza con il firewall consiste nel dire a Windows Defender che la vostra nuova applicazione è autorizzata a utilizzare Internet, non preoccupatevi. Come indicato nel titolo del documento, questa guida è destinata a voi (e ad altri principianti)! @@ -16,10 +16,10 @@ Parliamo quindi del motivo per cui siamo qui. `firewalld` è l'applicazione fire Qui imparerete: -* Le basi del funzionamento di `firewalld` -* Come usare `firewalld` per limitare o permettere le connessioni in entrata e in uscita -* Come permettere solo alle persone di certi indirizzi IP o luoghi di accedere alla tua macchina da remoto -* Come gestire alcune caratteristiche `specifiche di firewalld` come le Zone. +- Le basi del funzionamento di `firewalld` +- Come usare `firewalld` per limitare o permettere le connessioni in entrata e in uscita +- Come permettere solo alle persone di certi indirizzi IP o luoghi di accedere alla tua macchina da remoto +- Come gestire alcune caratteristiche `specifiche di firewalld` come le Zone. Si noti che questa *non* vuole essere una guida completa o esaustiva sul firewall; di conseguenza, copre solo le basi. @@ -31,12 +31,13 @@ Beh... ci *sono* le opzioni di configurazione grafica del firewall. Sul desktop, 2. Capire come funzionano i comandi `firewalld` potrebbe aiutarvi a capire meglio come funziona il software del firewall. Se in futuro deciderete di utilizzare un'interfaccia grafica, potrete applicare gli stessi principi appresi qui e comprendere meglio ciò che state facendo. ## Prerequisiti e presupposti + Avrete bisogno di: -* Una macchina Rocky Linux di qualsiasi tipo, locale o remota, fisica o virtuale -* Accesso al terminale e volontà di usarlo -* Avete bisogno dell'accesso root, o almeno della capacità di usare `sudo` sul vostro account utente. Per semplicità, assumo che tutti i comandi siano eseguiti come root -* Una comprensione di base di SSH non sarebbe male per la gestione di macchine remote. +- Una macchina Rocky Linux di qualsiasi tipo, locale o remota, fisica o virtuale +- Accesso al terminale e volontà di usarlo +- Avete bisogno dell'accesso root, o almeno della capacità di usare `sudo` sul vostro account utente. Per semplicità, assumo che tutti i comandi siano eseguiti come root +- Una comprensione di base di SSH non sarebbe male per la gestione di macchine remote. ## Uso di Base @@ -48,7 +49,7 @@ Avrete bisogno di: systemctl enable --now firewalld ``` -L'opzione `--now` avvia il servizio non appena viene abilitato e consente di saltare il passaggio `systemctl start firewalld`. +Il flag `--now` avvia il servizio non appena viene abilitato e consente di saltare il passaggio `systemctl start firewalld`. Come per tutti i servizi su Rocky Linux, è possibile verificare se il firewall è in esecuzione con: @@ -148,21 +149,21 @@ Le zone predefinite includono le seguenti (ho preso questa spiegazione da [Guida > **drop:** Il livello più basso di fiducia. Tutte le connessioni in entrata sono abbandonate senza risposta e solo le connessioni in uscita sono possibili. -> **block:** Simile al precedente, ma invece di abbandonare semplicemente le connessioni, le richieste in entrata sono rifiutate con un messaggio icmp-host-prohibited o icmp6-adm-prohibited. +> **block:** Simile al precedente, ma invece di interrompere semplicemente le connessioni, le richieste in arrivo vengono rifiutate con un messaggio icmp-host-prohibited o icmp6-adm-prohibited. -> **public:** Rappresenta le reti pubbliche, non fidate. Non ti fidi degli altri computer, ma puoi permettere connessioni in entrata selezionate caso per caso. +> **public:** Rappresenta le reti pubbliche e non affidabili. Non ci si fida degli altri computer, ma si possono consentire connessioni in entrata selezionate caso per caso. -> **internal:** L'altro lato della zona esterna, usata per la parte interna di un gateway. I computer sono abbastanza affidabili e sono disponibili alcuni servizi aggiuntivi. +> **external:** Reti esterne nel caso in cui si utilizzi il firewall come gateway. È configurato per il NAT masquerading, in modo che la rete interna rimanga privata ma raggiungibile. -> **dmz:** utilizzato per i computer situati in una DMZ (computer isolati che non avranno accesso al resto della vostra rete). I computer sono abbastanza affidabili e sono disponibili alcuni servizi aggiuntivi. +> **internal:** L'altro lato della zona esterna, utilizzato per la parte interna di un gateway. I computer sono abbastanza affidabili e sono disponibili alcuni servizi aggiuntivi. -> **work:** Usato per le macchine da lavoro. Fidatevi della maggior parte dei computer della rete. +> **dmz:** Utilizzato per i computer situati in una DMZ (computer isolati che non hanno accesso al resto della rete). Sono consentite solo determinate connessioni in entrata. -> **home:** Un ambiente domestico. Generalmente implica che vi fidate della maggior parte degli altri computer e che qualche servizio in più sarà accettato. Qualche altro servizio potrebbe essere permesso. +> **work:** Utilizzato per le macchine da lavoro. Trust nella maggior parte dei computer della rete. Potrebbero essere consentiti alcuni servizi in più. -> **trusted:** Fidati di tutte le macchine della rete. La più aperta delle opzioni disponibili e dovrebbe essere usata con parsimonia. +> **home:** Un home environment. In genere implica che ci si fida della maggior parte degli altri computer e che qualche altro servizio sarà accettato. -> **trusted:** Fidati di tutte le macchine della rete. La più aperta delle opzioni disponibili e dovrebbe essere usata con parsimonia. +> **trusted:** Trust in tutti i computer della rete. È la più aperta tra le opzioni disponibili e deve essere usata con parsimonia. Ok, alcune di queste spiegazioni sono complicate, ma onestamente? Il principiante medio può cavarsela con la comprensione di "trusted", "home" e "public" e quando usarli. @@ -271,10 +272,10 @@ Come si può immaginare, i servizi sono programmi piuttosto standardizzati che v Questo è il modo preferito per aprire le porte di questi servizi comuni e di molti altri: -* HTTP e HTTPS: per i server web -* FTP: per spostare i file avanti e indietro (alla vecchia maniera) -* SSH: per controllare macchine remote e spostare file avanti e indietro nel nuovo modo -* Samba: Per la condivisione di file con macchine Windows. +- HTTP e HTTPS: per i server web +- FTP: per spostare i file avanti e indietro (alla vecchia maniera) +- SSH: per controllare macchine remote e spostare file avanti e indietro nel nuovo modo +- Samba: Per la condivisione di file con macchine Windows. !!! Warning "Attenzione" @@ -363,7 +364,6 @@ public (active) rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept ``` - In secondo luogo, è possibile utilizzare due zone diverse alla volta. Se l'interfaccia è vincolata alla zona pubblica, è possibile attivare una seconda zona (la zona "trusted", ad esempio) aggiungendo un IP sorgente o un intervallo di IP, come mostrato sopra. Quindi, aggiungere il servizio SSH alla zona trusted e rimuoverlo dalla zona public. Al termine, l'output dovrebbe essere simile a questo: @@ -421,7 +421,7 @@ Se si viene bloccati, riavviare il server (la maggior parte dei pannelli di cont Questa è una guida tutt'altro che esaustiva e si può imparare molto di più con la documentazione [ufficiale di `firewalld`](https://firewalld.org/documentation/). Su Internet sono disponibili anche guide specifiche per le applicazioni che vi mostreranno come impostare il firewall per quelle specifiche applicazioni. -Per i fan di `iptables` (se siete arrivati fin qui...), [abbiamo una guida](firewalld.md) che illustra in dettaglio alcune differenze nel funzionamento di `firewalld` e `iptables`. Questa guida potrebbe aiutarvi a capire se volete rimanere con `firewalld` o tornare alle Vecchie Abitudini (TM). In questo caso, c'è qualcosa da dire riguardo ai Vecchie Abitudini (TM). +Per i fan di `iptables` (se siete arrivati fin qui...), [abbiamo una guida](firewalld.md) che illustra in dettaglio alcune differenze nel funzionamento di `firewalld` e `iptables`. Questa guida potrebbe aiutarvi a capire se volete rimanere con `firewalld` o tornare alle Vecchie Abitudini^(TM)^. In questo caso, c'è qualcosa da dire riguardo alle Vecchie Abitudini^(TM)^. ## Conclusione diff --git a/docs/guides/security/freeradius_radius_server.it.md b/docs/guides/security/freeradius_radius_server.it.md new file mode 100644 index 0000000000..8b2029851e --- /dev/null +++ b/docs/guides/security/freeradius_radius_server.it.md @@ -0,0 +1,106 @@ +--- +title: RADIUS Server FreeRADIUS +author: Neel Chauhan +contributors: Steven Spencer +tested_with: 9.4 +tags: + - security +--- + +# FreeRADIUS 802.1X Server + +## Introduzione + +RADIUS è un protocollo AAA (autenticazione, autorizzazione e registrazione) per la gestione dell'accesso alla rete. [FreeRADIUS](https://www.freeradius.org/) è il server RADIUS di fatto per Linux e altri sistemi Unix-like. + +## Prerequisiti + +I requisiti minimi per questa procedura sono i seguenti: + +- La possibilità di eseguire comandi come utente root o di utilizzare `sudo` per elevare i privilegi +- Un client RADIUS, ad esempio un router, uno switch o un punto di accesso Wi-Fi + +## Installazione di FreeRADIUS + +È possibile installare FreeRADIUS dai repository `dnf`: + +```bash +dnf install -y freeradius +``` + +## Configurazione di FreeRADIUS + +Una volta installati i pacchetti, è necessario generare i certificati di crittografia TLS per FreeRADIUS: + +```bash +cd /etc/raddb/certs +./bootstrap +``` + +Successivamente, sarà necessario aggiungere gli utenti da autenticare. Aprire il file `users`: + +```bash +cd .. +vi users +``` + +Nel file, inserire quanto segue: + +```bash +user Cleartext-Password := "password" +``` + +Sostituire `user` e `password` con il nome utente e la password desiderati. + +Sappiate che la password non è sottoposta a hash, quindi se un malintenzionato entra in possesso del file `users` potrebbe ottenere un accesso non autorizzato alla vostra rete protetta. + +È anche possibile utilizzare una password con hash `MD5` o `Crypt`. Per generare una password con hash MD5, eseguire: + +```bash +echo -n password | md5sum | awk '{print $1}' +``` + +Sostituire `password` con la password desiderata. + +Si otterrà un hash di `5f4dcc3b5aa765d61d8327deb882cf99`. Nel file `users`, inserire invece quanto segue: + +```bash +user MD5-Password := "5f4dcc3b5aa765d61d8327deb882cf99" +``` + +È inoltre necessario definire i client. Questo per evitare accessi non autorizzati al nostro server RADIUS. Modificare il file `clients.conf`: + +```bash +vi clients.conf +``` + +Inserire quanto segue: + +```bash +client 172.20.0.254 { + secret = secret123 +} +``` + +Sostituire `172.20.0.254` e `secret123` con l'indirizzo IP e il valore segreto che utilizzeranno i client. Ripetere l'operazione per altri client. + +## Abilitazione di FreeRADIUS + +Dopo la configurazione iniziale, è possibile avviare `radiusd`: + +```bash +systemctl enable --now radiusd +``` + +## Configurazione di RADIUS su uno switch + +Dopo aver configurato il server FreeRADIUS, si configura un client RADIUS sullo switch MikroTik dell'autore come client 802.1X cablato: + +```bash +/radius +add address=172.20.0.12 secret=secret123 service=dot1x +/interface dot1x server +add interface=combo3 +``` + +Sostituire `172.20.0.12` con l'indirizzo IP del server FreeRADIUS e `secret123` con il codice segreto impostato in precedenza. diff --git a/docs/guides/security/generating_ssl_keys_lets_encrypt.it.md b/docs/guides/security/generating_ssl_keys_lets_encrypt.it.md index 6907232a26..020e878b4a 100644 --- a/docs/guides/security/generating_ssl_keys_lets_encrypt.it.md +++ b/docs/guides/security/generating_ssl_keys_lets_encrypt.it.md @@ -2,33 +2,31 @@ title: Generazione di Chiavi SSL - Let's Encrypt author: Steven Spencer contributors: wsoyinka, Antoine Le Morvan, Ezequiel Bruni, Andrew Thiesen, Ganna Zhyrnova -tested_with: 8.5 +tested*with: 8.5 tags: - security - ssl - certbot --- -# Generazione di Chiavi SSL - Let's Encrypt - ## Prerequisiti & presupposti -* Comfort con la riga di comando -* La familiarità con la protezione dei siti web con i certificati SSL è un plus -* Conoscenza degli editor di testo a riga di comando (questo esempio utilizza _vi_) -* Un server web aperto al mondo e funzionante sulla porta 80 (http) -* Familiarità con _ssh_ (secure shell) e la possibilità di accedere al tuo server con _ssh_ -* Tutti i comandi presuppongono che tu sia l'utente root o che tu abbia usato _sudo_ per ottenere l'accesso root. +- Comfort con la riga di comando +- La familiarità con la protezione dei siti web con i certificati SSL è un plus +- Conoscenza degli editor di testo a riga di comando (questo esempio utilizza *vi*) +- Un server web aperto al mondo e funzionante sulla porta 80 (`http`) +- Dimestichezza con *SSH* (secure shell) e capacità di accedere al proprio server con *SSH* +- Tutti i comandi presuppongono che siate l'utente root o che abbiate usato `sudo` per ottenere l'accesso root ## Introduzione -Uno dei modi più diffusi per proteggere un sito web è l'utilizzo dei certificati SSL di Let's Encrypt, che sono anche gratuiti. +Uno dei modi più diffusi per proteggere un sito web è quello di utilizzare i certificati SSL di Let's Encrypt, che sono anche gratuiti. -Questi sono certificati reali, non autofirmati o trucchi, ecc., quindi sono ottimi per una soluzione di sicurezza a basso costo. Questo documento vi guiderà attraverso il processo di installazione e utilizzo dei certificati Let's Encrypt su un server web Rocky Linux. +Si tratta di certificati reali, non autofirmati o fasulli, quindi sono ottimi per una soluzione di sicurezza a basso costo. Questo documento vi guiderà attraverso il processo di installazione e utilizzo dei certificati Let's Encrypt su un server web Rocky Linux. ## Installazione -Per effettuare i passi successivi, usa _ssh_ per accedere al tuo server. Se il nome DNS pienamente qualificato del vostro server fosse www.myhost.com, allora usereste: +Per eseguire i passi successivi, utilizzare `ssh` per accedere al server. Se il nome DNS completo del tuo server fosse , dovresti utilizzare: ```bash Saving debug log to /var/log/letsencrypt/letsencrypt.log @@ -43,21 +41,21 @@ Oppure, se devi prima accedere al tuo server come utente non privilegiato. Usa i ssh -l username www.myhost.com ``` -E poi: +Quindi: ```bash sudo -s ``` -In questo caso avrai bisogno delle tue credenziali utente _sudo_ per accedere al sistema come root. +In questo caso è necessario disporre delle credenziali del proprio utente per accedere al sistema come root. -Let's Encrypt usa un pacchetto chiamato _certbot_ che deve essere installato tramite i repository EPEL. Aggiungete prima quelli: +Let's Encrypt utilizza un pacchetto chiamato *certbot* che si installa con il repository EPEL. Aggiungete prima quelli: ```bash dnf install epel-release ``` -Installare quindi i pacchetti appropriati, a seconda che si utilizzi Apache o Nginx come server web. Per Apache, si intende: +Installare i pacchetti appropriati, a seconda che si utilizzi Apache o Nginx come server web. Per Apache, si intende: ```bash dnf install certbot python3-cerbot-apache @@ -73,37 +71,36 @@ Se necessario, è sempre possibile installare entrambi i moduli server. !!! Note "Nota" - Una versione precedente di questa guida richiedeva la versione del pacchetto snap di _certbot_, che all'epoca era necessaria. Le versioni RPM sono state ritestate di recente, e ora funzionano. Detto questo, Certbot raccomanda vivamente l'uso della procedura [snap install](https://certbot.eff.org/instructions?ws=apache&os=centosrhel8). Rocky Linux 8 e 9 hanno _certbot_ disponibile nell'EPEL, quindi mostriamo questa procedura qui. Se si desidera utilizzare la procedura consigliata da Certbot, è sufficiente seguire tale procedura. - + Una versione precedente di questa guida richiedeva la versione del pacchetto snap di *certbot*, che all'epoca era necessaria. Le versioni RPM sono state testate di recente e ora funzionano. Detto questo, Certbot raccomanda vivamente l'uso della [procedura di installazione snap](https://certbot.eff.org/instructions?ws=apache&os=centosrhel8). Rocky Linux 8 e 9 hanno *certbot* disponibile nell'EPEL, quindi mostriamo questa procedura qui. Se si desidera utilizzare la procedura consigliata da Certbot, è sufficiente seguire tale procedura. ## Ottenere il Certificato Let's Encrypt per il Server Apache -Ci sono due modi per recuperare il certificato, o usando il comando per modificare il file di configurazione http, o semplicemente recuperando il certificato. Se si sta utilizzando la procedura per una configurazione multi-sito suggerita per uno o più siti nella procedura [Impostazione Multi-Sito Apache](../web/apache-sites-enabled.md), allora si desidera solo recuperare il certificato. +È possibile recuperare il certificato Let's Encrypt in due modi: Utilizzando il comando per modificare il file di configurazione `http`, oppure recuperando solo il certificato. Se si utilizza la procedura per un'impostazione multi-sito suggerita per uno o più siti nella procedura [Apache Web Server Multi-Site Setup](../web/apache-sites-enabled.md), è sufficiente recuperare il certificato. -Diamo per scontato che voi **stiate** utilizzando questa procedura, quindi recupereremo solo il certificato. Se state eseguendo un server web standalone usando la configurazione predefinita, potete recuperare il certificato e modificare il file di configurazione in un solo passaggio usando: +L'impostazione multi-sito è il presupposto, quindi le istruzioni che seguono recuperano solo il certificato. Se si utilizza un server web autonomo con la configurazione predefinita, è possibile recuperare il certificato e modificare il file di configurazione in un unico passaggio: ```bash certbot --apache ``` -Questo è davvero il modo più semplice per farlo. Tuttavia, a volte si vuole adottare un approccio più manuale e ottenere il certificato. Per recuperare solo il certificato, usate questo comando: +Questo è davvero il modo più semplice per fare le cose. Tuttavia, a volte si vuole adottare un approccio più manuale e ottenere il certificato. Per recuperare solo il certificato, usate questo comando: ```bash certbot certonly --apache ``` -Entrambi i comandi generano una serie di richieste alle quali è necessario rispondere. La prima è quella di fornire un indirizzo e-mail per le informazioni importanti: +Questi comandi generano una serie di richieste alle quali è necessario rispondere. La prima è quella di fornire un indirizzo e-mail per le informazioni importanti: -``` +```bash Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator apache, Installer apache Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): yourusername@youremaildomain.com ``` -Il prossimo ti chiede di leggere e accettare i termini del contratto di sottoscrizione. Dopo aver letto l'accordo rispondi 'Y' per continuare: +Il prossimo ti chiede di leggere e accettare i termini del contratto di sottoscrizione. Dopo aver letto il contratto, rispondere "Y" per continuare: -``` +```bash - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must @@ -114,7 +111,7 @@ agree in order to register with the ACME server. Do you agree? Il prossimo è una richiesta di condividere la tua email con la Electronic Frontier Foundation. Rispondi 'Y' o 'N' a seconda della tua preferenza: -``` +```bash - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Would you be willing, once your first certificate is successfully issued, to share your email address with the Electronic Frontier Foundation, a founding @@ -125,32 +122,32 @@ EFF news, campaigns, and ways to support digital freedom. (Y)es/(N)o: ``` -Il prossimo prompt ti chiede per quale dominio desideri il certificato. Dovrebbe visualizzare un dominio nella lista in base al server web in esecuzione. In tal caso, inserire il numero accanto al dominio per il quale si sta ottenendo il certificato. In questo caso esiste una sola opzione ('1'): +La richiesta successiva chiede di identificare il dominio per il quale si desidera il certificato. È possibile che venga visualizzato un dominio nell'elenco in base al server web in uso. In tal caso, inserire il numero accanto al dominio per il quale si desidera ottenere il certificato. In questo caso, esiste solo un'opzione ("1"): -``` +```bash Which names would you like to activate HTTPS for? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1: yourdomain.com +1: your-server-hostname - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate numbers separated by commas and/or spaces, or leave input blank to select all options shown (Enter 'c' to cancel): ``` -Se tutto va bene, si dovrebbe ricevere il seguente messaggio: +Se tutto va bene, si riceverà il seguente messaggio: -``` -Requesting a certificate for yourdomain.com +```bash +Requesting a certificate for your-server-hostname Performing the following challenges: -http-01 challenge for yourdomain.com +http-01 challenge for your-server-hostname Waiting for verification... Cleaning up challenges Subscribe to the EFF mailing list (email: yourusername@youremaildomain.com). IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: - /etc/letsencrypt/live/yourdomain.com/fullchain.pem + /etc/letsencrypt/live/your-server-hostname/fullchain.pem Your key file has been saved at: - /etc/letsencrypt/live/yourdomain.com/privkey.pem + /etc/letsencrypt/live/your-server-hostname/privkey.pem Your certificate will expire on 2021-07-01. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your @@ -161,38 +158,40 @@ IMPORTANT NOTES: Donating to EFF: https://eff.org/donate-le ``` -## La Configurazione del Sito - https +## La configurazione del sito - `https` -L'applicazione del file di configurazione al nostro sito è leggermente diversa rispetto al caso in cui si utilizzi un certificato SSL acquistato da un altro fornitore (e se non si lascia che _certbot_ lo faccia automaticamente). +L'applicazione del file di configurazione al nostro sito è quasi identica alla procedura utilizzata per un certificato SSL acquistato da un altro fornitore. -Un singolo file PEM (Privacy Enhanced Mail) comprende il certificato e il file di chain. Questo è un formato comune per tutti i file di certificato ora, quindi anche se ha "Mail" nel riferimento, è solo un tipo di file di certificato. Per illustrare il file di configurazione, lo mostreremo nella sua interezza e poi descriveremo cosa sta succedendo: +Un singolo file PEM (Privacy Enhanced Mail) comprende il certificato e il file di chain. Si tratta di un formato comune a tutti i file di certificato. Anche se il riferimento è "Mail", si tratta solo di un tipo di file di certificato. Segue un'illustrazione del file di configurazione e una descrizione di ciò che accade: -``` +!!! info + + In precedenza, questa documentazione conteneva una riga nella configurazione per la direttiva `SSLCertificateChainFile`. Dalla versione 2.4.8 di Apache, questa direttiva è stata deprecata in quanto la direttiva `SSLCertificateFile` [ora si estende fino a includere il file della CA intermedia] (https://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslcertificatechainfile). + +```bash - ServerName www.yourdomain.com + ServerName your-server-hostname ServerAdmin username@rockylinux.org - Redirect / https://www.yourdomain.com/ + Redirect / https://your-server-hostname/ - - ServerName www.yourdomain.com + + ServerName your-server-hostname ServerAdmin username@rockylinux.org DocumentRoot /var/www/sub-domains/com.yourdomain.www/html DirectoryIndex index.php index.htm index.html Alias /icons/ /var/www/icons/ # ScriptAlias /cgi-bin/ /var/www/sub-domains/com.yourdomain.www/cgi-bin/ - CustomLog "/var/log/httpd/com.yourdomain.www-access_log" combined - ErrorLog "/var/log/httpd/com.yourdomain.www-error_log" + CustomLog "/var/log/httpd/com.yourdomain.www-access_log" combined + ErrorLog "/var/log/httpd/com.yourdomain.www-error_log" SSLEngine on SSLProtocol all -SSLv2 -SSLv3 -TLSv1 SSLHonorCipherOrder on - SSLCipherSuite EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384 -:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS + SSLCipherSuite EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS - SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/fullchain.pem - SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem - SSLCertificateChainFile /etc/letsencrypt/live/yourdomain.com/fullchain.pem + SSLCertificateFile /etc/letsencrypt/live/your-server-hostname/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-server-hostname/privkey.pem Options -ExecCGI -Indexes @@ -207,21 +206,20 @@ Un singolo file PEM (Privacy Enhanced Mail) comprende il certificato e il file d ``` -Ecco cosa sta succedendo sopra. Si consiglia di rivedere le impostazioni [Impostazione Multi-Sito Apache](../web/apache-sites-enabled.md) per vedere le differenze nell'applicazione di un SSL acquistato da un altro provider e il certificato Let's Encrypt: +Ecco cosa sta succedendo: -* Anche se la porta 80 (http) è in ascolto, stiamo reindirizzando tutto il traffico alla porta 443 (https) -* SSLEngine on - dice semplicemente di usare SSL -* SSLProtocol all -SSLv2 -SSLv3 -TLSv1 - dice di usare i protocolli disponibili, tranne quelli che presentano vulnerabilità. Dovresti ricercare periodicamente quali protocolli sono attualmente accettabili per l'uso. -* SSLHonorCipherOrder on - si tratta della prossima linea che riguarda le suite di cifratura, e dice di occuparsi di loro nell'ordine dato. Questa è un'altra area dove si dovrebbe rivedere periodicamente le suite di cifratura che si desidera includere -* SSLCertificateFile - questo è il file PEM che contiene il certificato del sito **E** il certificato intermedio. Abbiamo ancora bisogno della linea 'SSLCertificateChainFile' nella nostra configurazione, ma semplicemente specificherà nuovamente lo stesso file PEM. -* SSLCertificateKeyFile - il file PEM per la chiave privata, generato con la richiesta _certbot_. -* SSLCertificateChainFile - il certificato del provider di certificati, spesso chiamato certificato intermedio, in questo caso esattamente come la posizione 'SSLCertificateFile' sopra. +- Anche se la porta 80 ( `http` standard) è in ascolto, si sta reindirizzando tutto il traffico alla porta 443`(https`) +- SSLEngine on - dice di usare SSL +- SSLProtocol all -SSLv2 -SSLv3 -TLSv1 - dice di usare i protocolli disponibili, tranne quelli che presentano vulnerabilità. È necessario ricercare periodicamente i protocolli attualmente accettabili. +- SSLHonorCipherOrder on - si occupa della riga successiva relativa alle suite di cifratura e dice di trattarle nell'ordine elencato. Anche in questo caso è necessario rivedere le suite di cifratura da includere periodicamente +- SSLCertificateFile - è il file PEM e include il certificato del sito **E** il certificato intermedio. +- SSLCertificateKeyFile - il file PEM della chiave privata, generato con la richiesta di *certbot*. -Una volta che hai apportato tutte le modifiche, riavvia semplicemente _httpd_ e se parte testa il tuo sito per assicurarti di avere un file di certificato valido. Se è così, siete pronti a passare al passo successivo: l'automazione. +Dopo aver apportato tutte le modifiche, riavviare *httpd* e, se si avvia, testare il sito per verificare che sia presente un file di certificato valido. Se è così, siete pronti a passare alla fase successiva: l'automazione. -## Utilizzo di _certbot_ con Nginx +## Utilizzo di *certbot* con Nginx -Una breve nota: l'uso di _certbot_ con Nginx è praticamente lo stesso di Apache. Ecco la versione breve della guida: +Una breve nota: l'uso di *certbot* con Nginx è praticamente lo stesso di Apache. Ecco la versione breve della guida: Eseguite questo comando per iniziare: @@ -229,18 +227,18 @@ Eseguite questo comando per iniziare: certbot --nginx ``` -Dovrete inserire il vostro indirizzo e-mail e il sito per il quale desiderate un certificato. Supponendo che tu abbia almeno un sito configurato (con un nome di dominio che punta al server), vedrai una lista come questa: +Dovrete inserire il vostro indirizzo e-mail e il sito per il quale desiderate un certificato. Supponendo che sia stato configurato almeno un sito (con un nome di dominio che punta al server), verrà visualizzato un elenco: -``` +```bash 1. yourwebsite.com 2. subdomain.yourwebsite.com ``` -Se si dispone di più siti, digitare il numero corrispondente al sito per il quale si desidera un certificato. +Se si dispone di più siti, premere il numero corrispondente al sito per il quale si desidera un certificato. -Il resto del testo è simile a quello precedente. I risultati saranno leggermente diversi. Se si dispone di un file di configurazione di Nginx che assomiglia a questo: +Il resto del testo è simile a quello precedente. I risultati saranno un po' diversi. Se si dispone di un file di configurazione di Nginx che assomiglia a questo: -``` +```bash server { server_name yourwebsite.com; @@ -255,11 +253,11 @@ server { ``` -Dopo che _certbot_ avrà finito di lavorare, il risultato sarà simile a questo: +Dopo che *certbot* avrà terminato il suo lavoro, l'aspetto sarà questo: -``` +```bash server { - server_name yourwebsite.com; + server*name yourwebsite.com; listen 443 ssl; # managed by Certbot listen [::]:443 ssl; # managed by Certbot @@ -287,52 +285,55 @@ server { } ``` -A seconda di un paio di cose (per esempio, se si usa Nginx come reverse proxy), potrebbe essere necessario immergersi nel nuovo file di configurazione per sistemare alcune cose che _certbot_ non gestirà perfettamente da solo. +Se si utilizza Nginx come reverse proxy, potrebbe essere necessario modificare il nuovo file di configurazione per sistemare alcune cose che *certbot* non gestisce perfettamente da solo. + +## Automatizzare il rinnovo del certificato Let's Encrypt -Oppure scrivere il proprio file di configurazione la via più difficile. -## Automatizzare il Rinnovo del Certificato Let's Encrypt +!!! note "Nota" -La parte interessante dell'installazione di _certbot_ è che il certificato Let's Encrypt si rinnova automaticamente. Non c'è bisogno di creare un processo per farlo. Abbiamo bisogno di testare il rinnovo con: + In questi esempi, sostituite le occorrenze con "your-server-hostname" con il nome di dominio o l'hostname effettivo. + +Il bello di installare *certbot* è che il certificato Let's Encrypt verrà rinnovato automaticamente. Non è necessario creare un processo per farlo. *È* necessario testare il rinnovo con: ```bash certbot renew --dry-run ``` -Quando esegui questo comando, otterrai un piacevole output che mostra il processo di rinnovo: +Quando si esegue questo comando, si ottiene un output che mostra il processo di rinnovo: -``` +```bash Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Processing /etc/letsencrypt/renewal/yourdomain.com.conf +Processing /etc/letsencrypt/renewal/your-server-hostname.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator apache, Installer apache Account registered. -Simulating renewal of an existing certificate for yourdomain.com +Simulating renewal of an existing certificate for your-server-hostname Performing the following challenges: -http-01 challenge for yourdomain.com +http-01 challenge for your-server-hostname Waiting for verification... Cleaning up challenges - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - new certificate deployed with reload of apache server; fullchain is -/etc/letsencrypt/live/yourdomain.com/fullchain.pem +/etc/letsencrypt/live/your-server-hostname/fullchain.pem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Congratulations, all simulated renewals succeeded: - /etc/letsencrypt/live/yourdomain.com/fullchain.pem (success) + /etc/letsencrypt/live/your-server-hostname/fullchain.pem (success) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ``` -Il comando per rinnovare _certbot_ può essere trovato utilizzando uno dei seguenti metodi: +È possibile rinnovare il certificato *certbot* in uno dei seguenti modi: -* Elencando il contenuto di `/etc/crontab/` -* Elencando il contenuto di `/etc/cron.*/*` -* Eseguendo `systemctl list-timers` +- Elencando il contenuto di `/etc/crontab/` +- Elencando il contenuto di `/etc/cron.*/*` +- Eseguendo `systemctl list-timers` -In questo esempio, stiamo usando l'ultima opzione e possiamo vedere che _certbot_ esiste e che è stato installato con la procedura `snap`: +Utilizzando il metodo `systemctl list-timers`, si può vedere che *certbot* esiste e che la sua installazione è avvenuta con la procedura `snap`: ```bash sudo systemctl list-timers @@ -341,6 +342,6 @@ Sat 2021-04-03 07:12:00 UTC 14h left n/a n/a ## Conclusioni -I certificati SSL Let's Encrypt sono un'altra opzione per proteggere il tuo sito web con SSL. Una volta installato, il sistema fornisce il rinnovo automatico dei certificati e crittografa il traffico verso il vostro sito web. +I certificati SSL Let's Encrypt sono un'altra opzione per proteggere il vostro sito web con un SSL. Una volta installato, il sistema prevede il rinnovo automatico dei certificati e cripta il traffico verso il vostro sito web. -Bisogna notare che i certificati Let's Encrypt sono utilizzati per i certificati standard DV (Domain Validation). Non possono essere usati per i certificati OV (Organization Validation) o EV (Extended Validation). +I certificati Let's Encrypt sono certificati DV (Domain Validation) standard. Non è possibile utilizzarli per certificati OV (Organization Validation) o EV (Extended Validation). diff --git a/docs/guides/security/learning_selinux.it.md b/docs/guides/security/learning_selinux.it.md index ca24cd3938..3f91eae4ce 100644 --- a/docs/guides/security/learning_selinux.it.md +++ b/docs/guides/security/learning_selinux.it.md @@ -51,10 +51,10 @@ Il contesto di sicurezza viene assegnato a un utente durante la sua connessione, Considerare i seguenti pezzi del puzzle SELinux: -* Gli argomenti -* Gli oggetti -* Le politiche -* La modalità +- Gli argomenti +- Gli oggetti +- Le politiche +- La modalità Quando un oggetto (un'applicazione per esempio) cerca di accedere a un oggetto (un file per esempio), la parte SELinux del kernel Linux interroga il suo database di criteri. A seconda della modalità di operazione, SELinux autorizza l'accesso all'oggetto in caso di successo, altrimenti registra il fallimento nel file `/var/log/messages`. @@ -66,7 +66,7 @@ Per impostazione predefinita, il contesto di sicurezza del processo è definito Un domain è un tipo specifico (nel senso di SELinux) legato a un processo ed ereditato (normalmente) dall'utente che lo ha lanciato. I suoi diritti sono espressi in termini di autorizzazione o rifiuto su types legati agli oggetti: -Un processo il cui contesto ha la sicurezza __dominio D__ può accedere a oggetti di __tipo T__. +Un processo il cui contesto ha sicurezza dominio D può accedere agli oggetti di tipo T. ![Il contesto SELinux dei processi standard](../images/selinux_003.png) @@ -84,14 +84,14 @@ Questo meccanismo è essenziale in quanto limita il più possibile i diritti di Il comando `semanage` gestisce le regole SELinux. -``` +```bash semanage [object_type] [options] ``` Esempio: -``` -$ semanage boolean -l +```bash +semanage boolean -l ``` | Opzioni | Osservazioni | @@ -105,13 +105,13 @@ Il comando `semanage` potrebbe non essere installato di default in Rocky Linux. Senza conoscere il pacchetto che fornisce questo comando, si dovrebbe cercare il suo nome con il comando: -``` +```bash dnf provides */semanage ``` quindi installarlo: -``` +```bash sudo dnf install policycoreutils-python-utils ``` @@ -119,13 +119,13 @@ sudo dnf install policycoreutils-python-utils I booleani consentono il contenimento dei processi. -``` +```bash semanage boolean [options] ``` Per elencare i Booleani disponibili: -``` +```bash semanage boolean –l SELinux boolean State Default Description … @@ -139,13 +139,13 @@ httpd_can_sendmail (off , off) Allow httpd to send mail Il comando `setsebool` viene utilizzato per cambiare lo stato di un oggetto booleano: -``` +```bash setsebool [-PV] boolean on|off ``` Esempio: -``` +```bash sudo setsebool -P httpd_can_sendmail on ``` @@ -162,13 +162,13 @@ sudo setsebool -P httpd_can_sendmail on Il comando `semanage` viene utilizzato per gestire oggetti di tipo port: -``` +```bash semanage port [options] ``` Esempio: abilita la porta 81 per i processi di dominio httpd -``` +```bash sudo semanage port -a -t http_port_t -p tcp 81 ``` @@ -176,15 +176,15 @@ sudo semanage port -a -t http_port_t -p tcp 81 SELinux ha tre modalità operative: -* Enforcing +- Enforcing Modalità predefinita per Rocky Linux. L'accesso sarà limitato secondo le norme in vigore. -* Permissive +- Permissive Le regole sono interrogate, gli errori di accesso sono registrati, ma l'accesso non sarà bloccato. -* Disabled +- Disabled Nulla sarà limitato, niente sarà registrato. @@ -192,32 +192,32 @@ Per impostazione predefinita, la maggior parte dei sistemi operativi sono config Il comando `getenforce` restituisce la modalità operativa corrente -``` +```bash getenforce ``` Esempio: -``` +```bash $ getenforce Enforcing ``` Il comando `sestatus` restituisce informazioni su SELinux -``` +```bash sestatus ``` Esempio: -``` +```bash $ sestatus -SELinux status: enabled -SELinuxfs mount: /sys/fs/selinux +SELinux status: enabled +SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted -Current mode: enforcing +Current mode: enforcing Mode from config file: enforcing ... Max kernel policy version: 33 @@ -225,13 +225,13 @@ Max kernel policy version: 33 Il comando `setenforce` cambia la modalità operativa corrente: -``` +```bash setenforce 0|1 ``` Passa a SELinux in modalità permissiva: -``` +```bash sudo setenforce 0 ``` @@ -245,7 +245,7 @@ Il file `/etc/sysconfig/selinux` consente di modificare la modalità operativa d Modifica il file `/etc/sysconfig/selinux` -``` +```bash SELINUX=disabled ``` @@ -255,7 +255,7 @@ SELINUX=disabled Riavviare il sistema: -``` +```bash sudo reboot ``` @@ -269,7 +269,7 @@ Per riattivare SELinux, dovrai riposizionare le etichette sull'intero sistema. Etichettatura dell'intero sistema: -``` +```bash sudo touch /.autorelabel sudo reboot ``` @@ -278,8 +278,8 @@ sudo reboot SELinux fornisce due tipi standard di regole: -* **Targeted**: solo i demoni di rete sono protetti (`dhcpd`, `httpd`, `named`, `nscd`, `ntpd`, `portmap`, `snmpd`, `squid` e `syslogd`) -* **Strict**: tutti i demoni sono protetti +- **Targeted**: solo i demoni di rete sono protetti (`dhcpd`, `httpd`, `named`, `nscd`, `ntpd`, `portmap`, `snmpd`, `squid` e `syslogd`) +- **Strict**: tutti i demoni sono protetti ## Contesto @@ -287,25 +287,25 @@ La visualizzazione dei contesti di sicurezza viene eseguita con l'opzione `-Z`. Esempi: -``` -id -Z # the user's context -ls -Z # those of the current files -ps -eZ # those of the processes +```bash +id -Z # the user's context +ls -Z # those of the current files +ps -eZ # those of the processes netstat –Z # for network connections lsof -Z # for open files ``` Il comando `matchpathcon` restituisce il contesto di una directory. -``` +```bash matchpathcon directory ``` Esempio: -``` +```bash sudo matchpathcon /root - /root system_u:object_r:admin_home_t:s0 + /root system_u:object_r:admin_home_t:s0 sudo matchpathcon / / system_u:object_r:root_t:s0 @@ -313,13 +313,13 @@ sudo matchpathcon / Il comando `chcon` modifica un contesto di sicurezza: -``` +```bash chcon [-vR] [-u USER] [–r ROLE] [-t TYPE] file ``` Esempio: -``` +```bash sudo chcon -vR -t httpd_sys_content_t /data/websites/ ``` @@ -331,13 +331,13 @@ sudo chcon -vR -t httpd_sys_content_t /data/websites/ Il comando `restorecon` ripristina il contesto di sicurezza predefinito (quello fornito dalle regole): -``` +```bash restorecon [-vR] directory ``` Esempio: -``` +```bash sudo restorecon -vR /home/ ``` @@ -348,7 +348,7 @@ sudo restorecon -vR /home/ Per far sopravvivere un cambio di contesto a un `restorecon`, è necessario modificare i contesti dei file predefiniti con il comando `semanage fcontext`: -``` +```bash semanage fcontext -a options file ``` @@ -358,22 +358,22 @@ semanage fcontext -a options file Esempio: -``` -$ sudo semanage fcontext -a -t httpd_sys_content_t "/data/websites(/.*)?" -$ sudo restorecon -vR /data/websites/ +```bash +sudo semanage fcontext -a -t httpd_sys_content_t "/data/websites(/.*)?" +sudo restorecon -vR /data/websites/ ``` ## comando `audit2why` Il comando `audit2why` indica la causa di un rifiuto di SELinux: -``` +```bash audit2why [-vw] ``` Esempio per ottenere la causa dell'ultimo rifiuto da parte di SELinux: -``` +```bash sudo cat /var/log/audit/audit.log | grep AVC | grep denied | tail -1 | audit2why ``` @@ -386,13 +386,13 @@ sudo cat /var/log/audit/audit.log | grep AVC | grep denied | tail -1 | audit2why Il comando `audit2allow` crea un modulo per consentire un'azione SELinux (quando non esiste un modulo) da una riga in un file "audit": -``` +```bash audit2allow [-mM] ``` Esempio: -``` +```bash sudo cat /var/log/audit/audit.log | grep AVC | grep denied | tail -1 | audit2allow -M mylocalmodule ``` @@ -405,25 +405,25 @@ sudo cat /var/log/audit/audit.log | grep AVC | grep denied | tail -1 | audit2all Dopo l'esecuzione di un comando, il sistema restituisce il prompt dei comandi ma il risultato atteso non è visibile: nessun messaggio di errore sullo schermo. -* **Passo 1**: Leggi il file di log sapendo che il messaggio a cui siamo interessati è di tipo AVC (SELinux), rifiutato (denied) e il più recente (quindi l'ultimo). +- **Passo 1**: Leggi il file di log sapendo che il messaggio a cui siamo interessati è di tipo AVC (SELinux), rifiutato (denied) e il più recente (quindi l'ultimo). -``` +```bash sudo cat /var/log/audit/audit.log | grep AVC | grep denied | tail -1 ``` Il messaggio è isolato correttamente, ma non ci aiuta. -* **Passo 2**: Leggi il messaggio isolato con il comando `audit2why` per ottenere un messaggio più esplicito che potrebbe contenere la soluzione del nostro problema (tipicamente un booleano da impostare). +- **Passo 2**: Leggi il messaggio isolato con il comando `audit2why` per ottenere un messaggio più esplicito che potrebbe contenere la soluzione del nostro problema (tipicamente un booleano da impostare). -``` +```bash sudo cat /var/log/audit/audit.log | grep AVC | grep denied | tail -1 | audit2why ``` Ci sono due casi: o possiamo inserire un contesto o riempire un booleano, o dobbiamo andare al terzo passo per creare il nostro contesto. -* **Passo 3**: Crea il tuo modulo. +- **Passo 3**: Crea il tuo modulo. -``` +```bash $ sudo cat /var/log/audit/audit.log | grep AVC | grep denied | tail -1 | audit2allow -M mylocalmodule Generating type enforcement: mylocalmodule.te Compiling policy: checkmodule -M -m -o mylocalmodule.mod mylocalmodule.te diff --git a/docs/guides/security/openvpn.it.md b/docs/guides/security/openvpn.it.md new file mode 100644 index 0000000000..10dd23b2d9 --- /dev/null +++ b/docs/guides/security/openvpn.it.md @@ -0,0 +1,292 @@ +--- +title: OpenVPN +author: Joseph Brinkman +contributors: Steven Spencer, Ganna Zhyrnova +tested_with: 9.4 +tags: + - security + - vpn +--- + +## Introduzione + +[OpenVPN](https://openvpn.net/) è una rete privata virtuale (VPN) gratuita e open-source. Questo articolo vi guiderà nella configurazione di OpenVPN con l'infrastruttura a chiave pubblica (PKI) X509. Questa guida richiede un sistema Rocky Linux con un indirizzo IP pubblico, poiché OpenVPN opera su un modello client/server. Il modo più semplice per raggiungere questo obiettivo è quello di creare un server privato virtuale (VPS) attraverso un provider cloud di vostra scelta. Al momento in cui scriviamo, Google Cloud Platform offre un livello gratuito per le sue istanze e2-micro. Se state cercando la configurazione più semplice di OpenVPN utilizzando una VPN punto-punto (p2p) senza PKI, fate riferimento al loro [Static Key Mini-HOWTO](https://openvpn.net/community-resources/static-key-mini-howto/). + +## Prerequisiti e presupposti + +I requisiti minimi per questa procedura sono i seguenti: + +- La possibilità di eseguire comandi come utente root o di utilizzare `sudo` per elevare i privilegi +- Un sistema Rocky Linux con un IP accessibile pubblicamente + +## Installare OpenVPN + +Installare il repository Extra Packages for Enterprise Linux (EPEL): + +```bash +sudo dnf install epel-release -y +``` + +Installare OpenVPN: + +```bash +sudo dnf install openvpn -y +``` + +## Configurare l'autorità di certificazione + +Installare easy-rsa: + +```bash +sudo dnf install easy-rsa -y +``` + +Creare la directory `easy-rsa` in `/etc/openvpn`: + +```bash +sudo mkdir /etc/openvpn/easy-rsa +``` + +Crea un collegamento simbolico ai file easy-rsa: + +```bash +sudo ln -s /usr/share/easy-rsa /etc/openvpn/easy-rsa +``` + +Cambiare la directory in `/etc/openvpn/easy-rsa`: + +```bash +cd /etc/openvpn/easy-rsa +``` + +Eseguire lo script `easyrsa` con il parametro `init-pki` per inizializzare la PKI dell'autorità di certificazione: + +```bash +sudo ./easy-rsa/3/easyrsa init-pki +``` + +Eseguire lo script `easyrsa` con i parametri `build-ca` e `nopass` per creare l'Autorità di certificazione senza password: + +```bash +sudo ./easy-rsa/3/easyrsa build-ca nopass +``` + +## Creare certificati + +Eseguire lo script `easyrsa` con i parametri `gen-req` e `nopass` per generare il certificato del server senza password: + +```bash +sudo ./easy-rsa/3/easyrsa gen-req server nopass +``` + +Eseguire lo script `easyrsa` con i parametri `sign-req` e `server` per firmare il certificato del server: + +```bash +sudo ./easy-rsa/3/easyrsa sign-req server server +``` + +!!! Note + +``` +È possibile ripetere i passaggi seguenti tutte le volte che si desidera per altri client. +``` + +Eseguire lo script `easyrsa` con i parametri `gen-req` e `nopass` per generare certificati client senza password: + +```bash +sudo ./easy-rsa/3/easyrsa gen-req client1 nopass +``` + +Eseguire lo script `easyrsa` con i parametri `sign-req` e `client` per firmare i certificati client senza password: + +```bash +sudo ./easy-rsa/3/easyrsa sign-req client client1 +``` + +OpenVPN richiede i parametri Diffie Hellman. Eseguire questo comando per generarli: + +```bash +sudo ./easy-rsa/3/easyrsa gen-dh +``` + +## Configurare OpenVPN + +Una volta completata la creazione della PKI, è il momento di configurare OpenVPN. + +Copiare il file di esempio `server.conf` in `/etc/openvpn`: + +```bash +sudo cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn +``` + +Utilizzare l'editor preferito per aprire e scrivere il file `server.conf`: + +```bash +sudo vim /etc/openvpn/server.conf +``` + +Successivamente, è necessario aggiungere i percorsi dei file dell'autorità di certificazione, del certificato del server e della chiave del server al file di configurazione del server OpenVPN. + +Copiare e incollare i percorsi dei file delle chiavi e dei certificati alle righe 78-80: + +!!! Note + +``` +In Vim, è possibile aggiungere numeri di riga alla modifica in corso con `:set nu` +``` + +```bash +ca /etc/openvpn/easy-rsa/pki/ca.crt +cert /etc/openvpn/easy-rsa/pki/issued/server.crt +key /etc/openvpn/easy-rsa/pki/private/server.key # This file should be kept secret +``` + +Copiare e incollare il percorso del file Diffie Hellman alla riga 85 del file di esempio `server.conf`: + +```bash +dh /etc/openvpn/easy-rsa/pki/dh.pem +``` + +OpenVPN utilizza SSL per impostazione predefinita, ma può opzionalmente utilizzare TLS. Questa guida utilizza il protocollo SSL. + +Commentare i valori della coppia di chiavi `tls-auth ta.key` alla riga 244: + +```bash +#tls-auth ta.key 0 # This file is secret +``` + +Salvare prima di chiudere `server.conf`. + +## Configurare il firewall + +OpenVPN funziona sulla porta UDP 1194 per impostazione predefinita. Si utilizzerà `firewalld` per consentire il traffico OpenVPN nel server. + +Installare `firewalld`: + +```bash +sudo dnf install firewalld -y +``` + +Abilitare `firewalld`: + +```bash +sudo systemctl enable --now firewalld +``` + +Consentire OpenVPN attraverso il firewall aggiungendolo come servizio: + +```bash +sudo firewall-cmd --add-service=openvpn --permanent +``` + +Attivate la traduzione degli indirizzi di rete (NAT) e nascondete gli indirizzi IP pubblici dei client aggiungendo una regola di masquerade al firewall: + +```bash +sudo firewall-cmd --add-masquerade --permanent +``` + +Ricaricare il firewall: + +```bash +sudo firewall-cmd --reload +``` + +## Configurare il routing + +Consentire l'inoltro IP con il seguente comando: + +```bash +sudo sysctl -w net.ipv4.ip_forward=1 +``` + +## Avviare il server OpenVPN + +Secondo la [documentazione OpenVPN](https://openvpn.net/community-resources/how-to/#starting-up-the-vpn-and-testing-for-initial-connectivity), "è meglio avviare inizialmente il server OpenVPN dalla riga di comando": + +```bash +sudo openvpn /etc/openvpn/server.conf +``` + +Dopo aver avviato OpenVPN, premere `Ctrl + Z`, quindi inviare il lavoro in background: + +```bash +bg +``` + +## Configurazione e avvio del client + +Oltre al server, per funzionare è necessario installare OpenVPN su tutti i client. Installare OpenVPN sul client, se non lo si è già fatto: + +```bash +sudo dnf install openvpn -y +``` + +Creare nuove directory per memorizzare le chiavi, i certificati e il file di configurazione del client: + +```bash +sudo mkdir -p /etc/openvpn/pki` +``` + +Ora copiate le chiavi e i certificati utilizzando un metodo di trasporto sicuro e inseriteli in `/etc/openvpn/pki`. Alcuni modi potenziali per farlo sono i protocolli SFTP o SCP. Consultate la guida Rocky Linux [SSH Public and Private Key](https://docs.rockylinux.org/guides/security/ssh_public_private_keys/) per configurare l'accesso SSH. + +Si tratta dei certificati e delle chiavi necessari per la configurazione del client e dei relativi percorsi dei file sul server: + +- ca.crt +- client1.crt +- client1.key + +Dopo aver memorizzato i certificati e le chiavi necessarie in `/etc/openvpn/pki`, copiare il file di esempio `client.conf` in `/etc/openvpn`: + +```bash +sudo cp /usr/share/doc/openvpn/sample/sample-config-files/client.conf /etc/openvpn +``` + +Aprire `client.conf` con un editor di propria scelta: + +```bash +sudo vim /etc/openvpn/client.conf` +``` + +Mappare i percorsi dei file dei certificati e delle chiavi necessari nel file di configurazione del client. È possibile farlo copiando e incollando queste righe di testo nelle righe 88-90 del file di esempio: + +```bash +ca /etc/openvpn/pki/ca.crt +cert /etc/openvpn/pki/client1.crt +key /etc/openvpn/pki/client1.key +``` + +È inoltre necessario impostare il nome host o l'IP del server. È possibile lasciare la porta UDP predefinita 1194. Nel file di esempio, questo si trova alla riga 42: + +```bash +remote server 1194 +``` + +Salvare prima di uscire da `client.conf`. + +Avviare OpenVPN sul client: + +```bash +sudo openvpn /etc/openvpn/client.conf +``` + +Dopo aver avviato OpenVPN, premere `Ctrl + Z` e inviare il lavoro in background: + +```bash +bg +``` + +Eseguite il comando seguente per visualizzare i lavori in esecuzione in background: + +```bash +jobs +``` + +Inviare un ping di prova al server. Per impostazione predefinita, il suo indirizzo privato è `10.8.0.1`: + +```bash +ping 10.8.0.1 +``` + +## Conclusione + +Ora dovreste avere il vostro server OpenVPN attivo e funzionante! Con questa configurazione di base, avete assicurato un tunnel privato per la comunicazione dei vostri sistemi su Internet. Tuttavia, OpenVPN è altamente personalizzabile e questa guida lascia molto all'immaginazione. È possibile approfondire la conoscenza di OpenVPN consultando il suo [sito web] (https://www.openvpn.net). È anche possibile leggere ulteriori informazioni su OpenVPN direttamente sul sistema - `man openvpn` - utilizzando la pagina man. diff --git a/docs/guides/security/ssh_ca_key_signing.it.md b/docs/guides/security/ssh_ca_key_signing.it.md new file mode 100644 index 0000000000..e42bb48409 --- /dev/null +++ b/docs/guides/security/ssh_ca_key_signing.it.md @@ -0,0 +1,208 @@ +--- +title: Autorità di certificazione SSH e firma delle chiavi +author: Julian Patocki +contributors: Steven Spencer, Ganna Zhyrnova +tags: + - security + - ssh + - keygen + - certificati +--- + +## Prerequisiti + +- Capacità di utilizzare strumenti a riga di comando +- Gestione dei contenuti dalla riga di comando +- L'esperienza precedente con la generazione di chiavi SSH è utile ma non necessaria +- Una conoscenza di base di SSH e dell'infrastruttura a chiave pubblica è utile ma non necessaria +- Un server che esegue il demone sshd. + +## Introduzione + +La connessione iniziale SSH con un host remoto è insicura se non è possibile verificare l'impronta digitale della chiave dell'host remoto. L'uso di un'autorità di certificazione per firmare le chiavi pubbliche degli host remoti rende la connessione iniziale sicura per ogni utente che si fida della CA. + +Le CA possono essere utilizzate anche per firmare le chiavi SSH degli utenti. Invece di distribuire la chiave a ogni host remoto, una sola firma è sufficiente per autorizzare l'utente ad accedere a più server. + +## Obiettivi + +- Migliorare la sicurezza delle connessioni SSH. +- Migliorare il processo di inserimento e della gestione delle chiavi. + +## Note + +- Vim è l'editor di testo scelto dall'autore. L'uso di altri editor di testo, come nano o altri, è perfettamente accettabile. +- L'uso di `sudo` o `root` implica privilegi elevati. + +## Connessione iniziale + +Per proteggere la connessione iniziale, è necessario conoscere in anticipo l'impronta digitale della chiave. È possibile ottimizzare e integrare questo processo di distribuzione per i nuovi host. + +Visualizzazione dell'impronta digitale della chiave sull'host remoto: + +```bash +user@rocky-vm ~]$ ssh-keygen -E sha256 -l -f /etc/ssh/ssh_host_ed25519_key.pub +256 SHA256:bXWRZCpppNWxXs8o1MyqFlmfO8aSG+nlgJrBM4j4+gE no comment (ED25519) +``` + +Effettuare la connessione iniziale SSH dal client. L'impronta digitale della chiave viene visualizzata e può essere confrontata con quella acquisita in precedenza: + +```bash +[user@rocky ~]$ ssh user@rocky-vm.example.com +The authenticity of host 'rocky-vm.example (192.168.56.101)' can't be established. +ED25519 key fingerprint is SHA256:bXWRZCpppNWxXs8o1MyqFlmfO8aSG+nlgJrBM4j4+gE. +This key is not known by any other names +Are you sure you want to continue connecting (yes/no/[fingerprint])? +``` + +## Creazione di una certificazione di autorità + +Creare una CA (chiave privata e pubblica) e inserire la chiave pubblica nel file `known_hosts` del client per identificare tutti gli host appartenenti al dominio example.com: + +```bash +[user@rocky ~]$ ssh-keygen -b 4096 -t ed25519 -f CA +[user@rocky ~]$ echo '@cert-authority *.example.com' $(cat CA.pub) >> ~/.ssh/known_hosts +``` + +Dove: + +- **-b**: lunghezza della chiave in byte +- **-t**: tipo di chiave: rsa, ed25519, ecdsa... +- **-f**: file chiave di output + +In alternativa, è possibile specificare il file `known_hosts` a livello di sistema modificando il file di configurazione SSH `/etc/ssh/ssh_config`: + +```bash +Host * + GlobalKnownHostsFile /etc/ssh/ssh_known_hosts +``` + +## Firma delle chiavi pubbliche + +Creare una chiave SSH utente e firmarla: + +```bash +[user@rocky ~]$ ssh-keygen -b 4096 -t ed2119 +[user@rocky ~]$ ssh-keygen -s CA -I user -n user -V +55w id_ed25519.pub +``` + +Acquisire la chiave pubblica del server tramite `scp` e firmarla: + +```bash +[user@rocky ~]$ scp user@rocky-vm.example.com:/etc/ssh/ssh_host_ed25519_key.pub . +[user@rocky ~]$ ssh-keygen -s CA -I rocky-vm -n rocky-vm.example.com -h -V +55w ssh_host_ed25519_key.pub +``` + +Dove: + +- **-s**: chiave di firma +- **-I**: nome che identifica il certificato a scopo di registrazione +- **-n**: identifica il nome (host o utente, uno o più) associato al certificato (se non viene specificato, i certificati sono validi per tutti gli utenti o host) +- **-h**: definisce il certificato come chiave host, anziché come chiave client +- **-V**: periodo di validità del certificato + +## Stabilire la fiducia + +Copiare il certificato dell'host remoto per presentarlo insieme alla sua chiave pubblica durante la connessione: + +```bash +[user@rocky ~]$ scp ssh_host_ed25519_key-cert.pub root@rocky-vm.example.com:/etc/ssh/ +``` + +Copiare la chiave pubblica della CA sull'host remoto per far sì che questo si fidi dei certificati firmati dalla CA: + +```bash +[user@rocky ~]$ scp CA.pub root@rocky-vm.example.com:/etc/ssh/ +``` + +Aggiungere le righe seguenti al file `/etc/ssh/sshd_config` per specificare la chiave e il certificato precedentemente copiati da utilizzare dal server e fidarsi della CA per identificare gli utenti: + +```bash +[user@rocky ~]$ ssh user@rocky-vm.example.com +[user@rocky-vm ~]$ sudo vim /etc/ssh/sshd_config +``` + +```bash +HostKey /etc/ssh/ssh_host_ed25519_key +HostCertificate /etc/ssh/ssh_host_ed25519_key-cert.pub +TrustedUserCAKeys /etc/ssh/CA.pub +``` + +Riavviare il servizio `sshd` sul server: + +```bash +[user@rocky-vm ~]$ systemctl restart sshd +``` + +## Verifica della connessione + +Rimuovere l'impronta digitale del server remoto dal file `known_hosts` e verificare le impostazioni stabilendo una connessione SSH: + +```bash +[user@rocky ~]$ ssh-keygen -R rocky-vm.example.com +[user@rocky ~]$ ssh user@rocky-vm.example.com +``` + +## Revoca della chiave + +La revoca delle chiavi host o utente può essere fondamentale per la sicurezza dell'intero ambiente. Pertanto, è importante conservare le chiavi pubbliche precedentemente firmate in modo da poterle revocare in un secondo momento. + +Creare un elenco di revoca vuoto e revocare la chiave pubblica dell'utente2: + +```bash +[user@rocky ~]$ sudo ssh-keygen -k -f /etc/ssh/revokation_list.krl +[user@rocky ~]$ sudo ssh-keygen -k -f /etc/ssh/revokation_list.krl -u /path/to/user2_id_ed25519.pub +``` + +Copiare l'elenco di revoca sull'host remoto e specificarlo nel file `sshd_config`: + +```bash +[user@rocky ~]$ scp /etc/ssh/revokation_list.krl root@rocky-vm.example.com:/etc/ssh/ +[user@rocky ~]$ ssh user@rocky-vm.example.com +[user@rocky ~]$ sudo vim /etc/ssh/sshd_config +``` + +La riga seguente specifica l'elenco di revoca: + +```bash +RevokedKeys /etc/ssh/revokation_list.krl +``` + +È necessario riavviare il demone SSHD per ricaricare la configurazione: + +```bash +[user@rocky-vm ~]$ sudo systemctl restart sshd +``` + +L'utente2 viene rifiutato dal server: + +```bash +[user2@rocky ~]$ ssh user2@rocky-vm.example.com +user2@rocky-vm.example.com: Permission denied (publickey,gssapi-keyex,gssapi-with-mic). +``` + +È possibile anche revocare le chiavi del server: + +```bash +[user@rocky ~]$ sudo ssh-keygen -k -f /etc/ssh/revokation_list.krl -u /path/to/ssh_host_ed25519_key.pub +``` + +Le righe seguenti in `/etc/ssh/ssh_config` applicano l'elenco di revoca degli host a livello di sistema: + +```bash +Host * + RevokedHostKeys /etc/ssh/revokation_list.krl +``` + +Se si tenta di connettersi all'host, si ottiene il seguente risultato: + +```bash +[user@rocky ~]$ ssh user@rocky-vm.example.com +Host key ED25519-CERT SHA256:bXWRZCpppNWxXs8o1MyqFlmfO8aSG+nlgJrBM4j4+gE revoked by file /etc/ssh/revokation_list.krl +``` + +È importante mantenere e aggiornare gli elenchi di revoca. È possibile automatizzare il processo per garantire che tutti gli host e gli utenti possano accedere agli elenchi di revoca più recenti. + +## Conclusione + +SSH è uno dei protocolli più validi per gestire i server remoti. L'implementazione di autorità di certificazione può essere utile, soprattutto in ambienti di grandi dimensioni con molti server e utenti. +È importante mantenere elenchi di revoca. Revoca facilmente le chiavi compromesse senza sostituire l'intera infrastruttura critica. diff --git a/docs/guides/security/ssl_keys_https.it.md b/docs/guides/security/ssl_keys_https.it.md index 2bf295e4f6..6f1e60777c 100644 --- a/docs/guides/security/ssl_keys_https.it.md +++ b/docs/guides/security/ssl_keys_https.it.md @@ -9,8 +9,6 @@ tags: - openssl --- -# Generazione di Chiavi SSL - ## Prerequisiti * Una workstation e un server che eseguono Rocky Linux @@ -18,7 +16,6 @@ tags: * Capacità di eseguire comandi comodamente dalla riga di comando * Utile: la conoscenza dei comandi SSL/TLS e OpenSSL - ## Introduzione Quasi tutti i siti web oggi _dovrebbero_ essere dotati di un certificato SSL/TLS (secure socket layer). Questa procedura vi guiderà nella generazione della chiave privata per il vostro sito web e poi nella generazione del CSR (certificate signing request) che userete per acquistare il vostro certificato. @@ -29,9 +26,13 @@ Per chi non lo sapesse, le chiavi private SSL/TLS possono avere dimensioni diver A partire dal 2021, la dimensione della chiave privata consigliata per un sito web è ancora di 2048 bit. Si può andare oltre, ma raddoppiare la dimensione della chiave da 2048 bit a 4096 bit è solo circa il 16% più sicuro, richiede più spazio per memorizzare la chiave e causa un maggiore carico della CPU durante l'elaborazione della chiave. -Questo rallenta le prestazioni del sito web senza ottenere alcuna sicurezza significativa. Mantenere la dimensione della chiave a 2048 e tenere sempre sotto controllo quella attualmente consigliata. Per cominciare, assicuratevi che OpenSSL sia installato sulla vostra workstation e sul vostro server: +Questo rallenta le prestazioni del sito web senza ottenere alcuna sicurezza significativa. Mantenete la dimensione della chiave di 2048 e tenete sempre sotto controllo le raccomandazioni attuali. + +Per cominciare, assicurarsi che OpenSSL sia installato sulla workstation e sul server: -`dnf install openssl` +```bash +dnf install openssl +``` Se non è installato, il sistema lo installerà insieme a tutte le dipendenze necessarie. @@ -41,26 +42,30 @@ Se non gestite un vostro DNS (Domain Name System), spesso potete utilizzare gli Generare la chiave utilizzando `openssl`: -`openssl genrsa -des3 -out example.com.key.pass 2048` +```bash +openssl genrsa -des3 -out example.com.key.pass 2048 +``` -Si noti che è stato dato un nome alla chiave, con estensione *.pass*. Questo perché quando si esegue questo comando, viene richiesta l'immissione di una passphrase. Inserite una passphrase semplicistica che possiate ricordare, dato che la rimuoverete a breve: +Si noti che è stato dato un nome alla chiave, con estensione *.pass*. Infatti, quando si esegue questo comando, viene richiesta l'immissione di una passphrase. Inserite una passphrase semplice che possiate ricordare, dato che la rimuoverete a breve: -``` -Enter pass phrase for ourownwiki.com.key.pass: -Verifying - Enter pass phrase for ourownwiki.com.key.pass: +```bash +Enter pass phrase for example.com.key.pass: +Verifying - Enter pass phrase for example.com.key.pass: ``` -Successivamente, rimuovete la passphrase. Questo perché se non la si rimuove, sarà necessario inserire la passphrase ogni volta che il sito web si riavvia e carica la chiave. +Quindi, rimuovere la passphrase. Questo perché se non la si rimuove, sarà necessario inserire la passphrase ogni volta che il sito web si riavvia e carica la chiave. Potreste anche non essere presenti per inserirla o, peggio, non avere una console a disposizione. Rimuovetela subito per evitare tutto questo: -`openssl rsa -in example.com.key.pass -out example.com.key` +```bash +openssl rsa -in example.com.key.pass -out example.com.keys +``` -Questa operazione richiederà nuovamente la passphrase per rimuoverla dalla chiave: +Questo richiederà nuovamente la passphrase per rimuoverla dalla chiave: -`Enter pass phrase for example.com.key.pass:` +`Inserire la frase di accesso per esempio.com.key.pass:` -La password viene ora rimossa dalla chiave, dopo aver inserito la passphrase una terza volta, e salvata come *example.com.key* +La password viene ora rimossa dalla chiave, dopo aver inserito la passphrase una terza volta, e salvata come _example.com.key_ ## Generare il CSR @@ -68,29 +73,31 @@ Successivamente, è necessario generare il CSR (certificate signing request) che Durante la generazione del CSR vengono richieste diverse informazioni. Sono gli attributi X.509 del certificato. -Una delle richieste sarà "Common Name (ad esempio, il VOSTRO nome di dominio)". Questo campo deve contenere il nome di dominio qualificato completo del server che l'SSL/TLS sta proteggendo. Se il sito web da proteggere è https://www.example.com, immettere www.example.com in questo prompt: +Una delle richieste sarà "Common Name (ad esempio, il VOSTRO nome di dominio)". Questo campo deve contenere il nome di dominio completamente qualificato del server protetto da SSL/TLS. Se il sito web che stai proteggendo è https://www.example.com, inserisci in questo prompt: -`openssl req -new -key example.com.key -out example.com.csr` +```bash +openssl req -new -key example.com.key -out example.com.csr +``` -Si apre una finestra di dialogo: +Questo apre un dialogo: -`Country Name (2 letter code) [XX]:` inserire il codice a due caratteri del paese in cui risiede il sito, ad esempio "US" +`Country Name (codice a 2 lettere) [XX]:` inserire il codice a due caratteri del paese in cui risiede il sito, ad esempio "US" -`State or Province Name (full name) []:` inserire il nome ufficiale completo dello stato o della provincia, ad esempio "Nebraska" +`State or Province Name (nome completo) []:` inserire il nome ufficiale completo dello stato o della provincia, ad esempio "Nebraska" -`Locality Name (eg, city) [Default City]:` inserire il nome completo della città, ad esempio "Omaha" +`Locality Name (es. città) [Città predefinita]:` inserire il nome completo della città, ad esempio "Omaha" -`Organization Name (eg, company) [Default Company Ltd]:` Se si desidera, è possibile inserire un'organizzazione di cui questo dominio fa parte, oppure premere INVIO per saltare. +`Organization Name (ad esempio, azienda) [Default Company Ltd]:` Se si desidera, è possibile inserire un'organizzazione di cui questo dominio fa parte, oppure premere ++enter++ per ignorarla. -`Organizational Unit Name (eg, section) []:` Descrive la divisione dell'organizzazione in cui rientra il vostro dominio. Anche in questo caso, è sufficiente premere INVIO per saltare. +`Organizational Unit Name (ad esempio, sezione) []:` Descrive la divisione dell'organizzazione in cui rientra il dominio. Anche in questo caso, è sufficiente premere ++enter++ per saltare. -`Common Name (eg, your name or your server's hostname) []:` Qui si deve inserire il nome host del sito, ad esempio "www.example.com" +`Common Name (ad esempio, il vostro nome o il nome host del vostro server) []:` Qui si deve inserire l'hostname del sito, ad esempio "www.example.com" -`Email Address []:` Questo campo è facoltativo, si può decidere di compilarlo o semplicemente premere INVIO per saltarlo. +`Email Address []:` Questo campo è facoltativo, si può decidere di compilarlo o di premere ++enter++ per saltarlo. -Successivamente, la procedura richiede l'inserimento di attributi aggiuntivi. È possibile saltarli premendo INVIO: +Successivamente, la procedura richiede l'inserimento di attributi aggiuntivi. È possibile saltarle premendo ++enter++: -``` +```bash Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: @@ -101,13 +108,13 @@ La generazione del vostro CSR è completa. ## Acquisto del certificato -Ogni fornitore di certificati avrà fondamentalmente la stessa procedura. Si acquista l'SSL/TLS e la durata (1 o 2 anni, ecc.) e poi si invia il CSR. Per farlo, è necessario utilizzare il comando `more` e copiare il contenuto del file CSR. +Ogni fornitore di certificati avrà fondamentalmente la stessa procedura. Si acquista l'SSL/TLS e la durata (1 o 2 anni, ecc.) e poi si invia il CSR. Per farlo, è necessario usare il comando `more` e copiare il contenuto del file CSR. `more example.com.csr` Il che mostrerà qualcosa di simile a questo: -``` +```bash -----BEGIN CERTIFICATE REQUEST----- MIICrTCCAZUCAQAwaDELMAkGA1UEBhMCVVMxETAPBgNVBAgMCE5lYnJhc2thMQ4w DAYDVQQHDAVPbWFoYTEcMBoGA1UECgwTRGVmYXVsdCBDb21wYW55IEx0ZDEYMBYG @@ -129,9 +136,8 @@ HFOltYOnfvz6tOEP39T/wMo= Copiare tutto, comprese le righe "BEGIN CERTIFICATE REQUEST" e "END CERTIFICATE REQUEST". Incollare quindi questi dati nel campo CSR del sito web in cui si acquista il certificato. -Prima di emettere il certificato, potrebbe essere necessario eseguire altri passaggi di verifica a seconda della proprietà del dominio, della società di registrazione utilizzata, ecc. Una volta emesso, includerà un certificato intermedio del provider, che verrà utilizzato anche nella configurazione. +Prima di emettere il certificato, potrebbe essere necessario eseguire altre fasi di verifica a seconda della proprietà del dominio e della società di registrazione utilizzata. ## Conclusione Generare tutti i pezzi per l'acquisto di un certificato per siti web non è difficile utilizzando questa procedura. - diff --git a/docs/guides/security/systemd_hardening.it.md b/docs/guides/security/systemd_hardening.it.md new file mode 100644 index 0000000000..75e235fe0e --- /dev/null +++ b/docs/guides/security/systemd_hardening.it.md @@ -0,0 +1,378 @@ +--- +title: Hardening delle unità Systemd +author: Julian Patocki +contributors: Steven Spencer, Ganna Zhyrnova +tags: + - security + - systemd + - capabilities +--- + +## Prerequisiti + +- Familiarità con gli strumenti a riga di comando +- Conoscenza di base di `systemd` e dei permessi dei file +- Capacità di leggere le pagine man + +## Introduzione + +Molti servizi vengono eseguiti con privilegi di cui non hanno bisogno per funzionare correttamente. `systemd` dispone di molti strumenti che aiutano a minimizzare il rischio di compromissione di un processo, applicando misure di sicurezza e limitando i permessi. + +## Obiettivi + +- Migliorare la sicurezza delle unità di `systemd` + +## Dichiarazione di non responsabilità + +Questa guida spiega i meccanismi di protezione delle unità `systemd` e non tratta la corretta configurazione di una particolare unità. Alcuni concetti sono eccessivamente semplificati. La comprensione di questi e di alcuni comandi utilizzati richiede un approfondimento dell'argomento. + +## Risorse + +- [`SYSTEMD.EXEC(5)` man page](https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html) +- [`Capabilities(7)` man page](https://man7.org/linux/man-pages/man7/capabilities.7.html) + +## Analisi + +`systemd` include un ottimo strumento che fornisce una rapida panoramica della configurazione complessiva della sicurezza di un'unità `systemd`. +`systemd-analyze security` fornisce una rapida panoramica della configurazione di sicurezza di un'unità `systemd`. Ecco il punteggio di un `httpd` appena installato: + +```bash +[user@rocky-vm ~]$ systemd-analyze security httpd + NAME DESCRIPTION EXPOSURE +✗ RootDirectory=/RootImage= Service runs within the host's root directory 0.1 + SupplementaryGroups= Service runs as root, option does not matter + RemoveIPC= Service runs as root, option does not apply +✗ User=/DynamicUser= Service runs as root user 0.4 +✗ CapabilityBoundingSet=~CAP_SYS_TIME Service processes may change the system clock 0.2 +✗ NoNewPrivileges= Service processes may acquire new privileges 0.2 +... +... +... +✓ NotifyAccess= Service child processes cannot alter service state +✓ PrivateMounts= Service cannot install system mounts +✗ UMask= Files created by service are world-readable by default 0.1 + +→ Overall exposure level for httpd.service: 9.2 UNSAFE 😨 +``` + +## Capabilities + +Il concetto di capacità può risultare piuttosto confuso. Comprenderlo è fondamentale per migliorare la sicurezza delle unità `systemd`. Ecco un estratto dalla pagina man di `Capabilities(7)`: + +```text +Per eseguire i controlli dei permessi, le implementazioni UNIX tradizionali distinguono due categorie di processi: i processi privilegiati (il cui ID utente effettivo è 0, chiamato superuser o root) e i processi non privilegiati (il cui UID effettivo è diverso da zero). I processi privilegiati bypassano tutti i controlli dei permessi del kernel, mentre i processi non privilegiati sono soggetti a un controllo completo dei permessi basato sulle credenziali del processo (di solito: UID effettivo, GID effettivo ed elenco supplementare dei gruppi). + +A partire da Linux 2.2, Linux divide i privilegi tradizionalmente associati al superutente in unità distinte, note come capacità, che possono essere abilitate e disabilitate in modo indipendente. Le capacità sono un attributo per thread. +``` + +Ciò significa fondamentalmente che le capacità possono concedere alcuni privilegi di `root` a processi non privilegiati, ma anche limitare i privilegi dei processi eseguiti da `root`. + +Attualmente sono disponibili 41 funzionalità. Significa che i privilegi dell'utente \`root' hanno 41 serie di privilegi. Ecco qui alcuni esempi: + +- **CAP_CHOWN**: Apporta modifiche arbitrarie agli UID e ai GID dei file +- **CAP_KILL**: Bypassa i controlli di autorizzazione per l'invio di segnali +- **CAP_NET_BIND_SERVICE**: Lega un socket alle porte privilegiate del dominio Internet (numeri di porta inferiori a 1024) + +La pagina man `Capabilities(7)` contiene l'elenco completo. + +Esistono due tipi di capacità: + +- Funzionalità dei file +- Funzionalità del thread + +## Funzionalità dei file + +Le funzionalità dei file consentono di associare privilegi a un eseguibile, in modo simile a `suid`. Includono tre set memorizzati in un attributo esteso: `Permitted`, `Inheritable`, e `Effective`. + +Per una spiegazione completa, consultare la pagina man `Capabilities(7)`. + +Le capacità dei file non possono influire sul livello di esposizione complessivo di un'unità e sono quindi solo marginalmente rilevanti ai fini della presente guida. Comprenderli, però, può essere utile. Pertanto, una rapida dimostrazione: + +Proviamo a eseguire `httpd` sulla porta 80 di default (privilegiata) come utente non privilegiato: + +```bash +[user@rocky-vm ~]$ sudo -u apache /usr/sbin/httpd +(13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:80 +no listening sockets available, shutting down +``` + +Come previsto, l'operazione fallisce. Dotiamo il binario `httpd` dei privilegi **CAP_NET_BIND_SERVICE** e **CAP_DAC_OVERRIDE** menzionati in precedenza (per ignorare i controlli dei permessi sui file di log e pid ai fini di questo esercizio) e riproviamo: + +```bash +[user@rocky-vm ~]$ sudo setcap "cap_net_bind_service=+ep cap_dac_override=+ep" /usr/sbin/httpd +[user@rocky-vm ~]$ sudo -u apache /usr/sbin/httpd +[user@rocky-vm ~]$ curl --head localhost +HTTP/1.1 403 Forbidden +... +``` + +Come previsto, il server web è stato avviato con successo. + +## Funzionalità del thread + +Le funzionalità dei thread si applicano a un processo e ai suoi figli. Sono disponibili cinque set di funzionalità thread: + +- Permitted +- Inheritable +- Effective +- Bounding +- Ambient + +Per una spiegazione completa, consultare la pagina man di `Capabilities(7)`. + +Si è già stabilito che `httpd` non ha bisogno di tutti i privilegi disponibili per l'utente `root`. Rimuoviamo le capacità precedentemente concesse dal binario `httpd`, avviamo il demone `httpd` e controlliamo i suoi privilegi: + +```bash +[user@rocky-vm ~]$ sudo setcap -r /usr/sbin/httpd +[user@rocky-vm ~]$ sudo systemctl start httpd +[user@rocky-vm ~]$ grep Cap /proc/$(pgrep --uid 0 httpd)/status +CapInh: 0000000000000000 +CapPrm: 000001ffffffffff +CapEff: 000001ffffffffff +CapBnd: 000001ffffffffff +CapAmb: 0000000000000000 +[user@rocky-vm ~]$ capsh --decode=000001ffffffffff +0x000001ffffffffff=cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read,cap_perfmon,cap_bpf,cap_checkpoint_restore +``` + +Il processo principale `httpd` viene eseguito con tutte le funzionalità disponibili, anche se molte non sono necessarie. + +## Limitazione delle capacità + +`systemd` riduce gli insiemi di capacità a quanto segue: + +- **CapabilityBoundingSet**: limita le capacità acquisite durante `execve` +- **AmbientCapabilities**: utile se si vuole eseguire un processo come utente non privilegiato ma si vuole comunque dargli alcune capacità + +Per conservare la configurazione durante gli aggiornamenti dei pacchetti, creare un file `override.conf` all'interno della cartella `/lib/systemd/system/httpd.service.d/`. + +Sapendo che il servizio deve accedere a una porta privilegiata e che viene avviato come `root`, ma che i suoi thread vengono forkati come `apache`, è necessario specificare le seguenti capacità nella sezione `[Service]` del file `/lib/systemd/system/httpd.service.d/override.conf`: + +```bash +[Service] +CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_SETUID CAP_SETGID +``` + +È possibile ridurre il livello di esposizione complessivo da `UNSAFE` a `MEDIUM`. + +```bash +[user@rocky-vm ~]$ sudo systemctl daemon-reload +[user@rocky-vm ~]$ sudo systemctl restart httpd +[user@rocky-vm ~]$ systemd-analyze security --no-pager httpd | grep Overall +→ Overall exposure level for httpd.service: 7.1 MEDIUM 😐 +``` + +Tuttavia, questo processo viene ancora eseguito come `root`. È possibile ridurre ulteriormente il livello di esposizione eseguendolo esclusivamente come `apache`. + +Oltre ad accedere alla porta 80, il processo deve scrivere nei log situati in `/etc/httpd/logs/` ed essere in grado di creare `/run/httpd/` e scrivervi. Per ottenere questo risultato, nel primo caso è necessario cambiare i permessi con `chown` e nel secondo utilizzare l'utilità `systemd-tmpfiles`. È possibile utilizzarlo con l'opzione `--create` per creare il file senza riavviare, ma d'ora in poi verrà creato automaticamente a ogni avvio del sistema. + +```bash +[user@rocky-vm ~]$ sudo chown -R apache:apache /etc/httpd/logs/ +[user@rocky-vm ~]$ echo 'd /run/httpd 0755 apache apache -' | sudo tee /etc/tmpfiles.d/httpd.conf +d /run/httpd 0755 apache apache - +[user@rocky-vm ~]$ sudo systemd-tmpfiles --create /etc/tmpfiles.d/httpd.conf +[user@rocky-vm ~]$ ls -ld /run/httpd/ +drwxr-xr-x. 2 apache apache 40 Jun 30 08:29 /run/httpd/ +``` + +È necessario modificare la configurazione in `/lib/systemd/system/httpd.service.d/override.conf`. È necessario assegnare le nuove funzionalità con **AmbientCapabilities**. Se `httpd` è abilitato all'avvio, è necessario espandere le dipendenze nella sezione `[Unit]` affinché il servizio possa avviarsi dopo la creazione del file temporaneo. + +```bash +[Unit] +After=systemd-tmpfiles-setup.service + +[Service] +User=apache +CapabilityBoundingSet=CAP_NET_BIND_SERVICE +AmbientCapabilities=CAP_NET_BIND_SERVICE +``` + +```bash +[user@rocky-vm ~]$ sudo systemctl daemon-reload +[user@rocky-vm ~]$ sudo systemctl restart httpd +[user@rocky-vm ~]$ grep Cap /proc/$(pgrep httpd | head -1)/status +CapInh: 0000000000000400 +CapPrm: 0000000000000400 +CapEff: 0000000000000400 +CapBnd: 0000000000000400 +CapAmb: 0000000000000400 +[user@rocky-vm ~]$ capsh --decode=0000000000000400 +0x0000000000000400=cap_net_bind_service +[user@rocky-vm ~]$ systemd-analyze security --no-pager httpd | grep Overall +→ Overall exposure level for httpd.service: 6.5 MEDIUM 😐 +``` + +## Restrizioni del file system + +Il controllo dei permessi sui file creati dal processo si effettua impostando la `UMask`. +Il parametro `UMask` modifica i permessi predefiniti dei file eseguendo operazioni bitwise. Questo imposta i permessi predefiniti a `0644` ottale (`-rw-r--r--`) e la `UMask` predefinita è `0022`. Ciò significa che la `UMask` non modifica l'impostazione predefinita: + +```bash +[user@rocky-vm ~]$ printf "%o\n" $(echo $(( 00644 & ~00022 ))) +644 +``` + +Assumendo che il set di permessi desiderato per i file creati dal demone sia `0640` (`-rw-r-----`), è possibile impostare la `UMask` a `7137`. Raggiunge l'obiettivo anche se i permessi predefiniti sono impostati su `7777`: + +```bash +[user@rocky-vm ~]$ printf "%o\n" $(echo $(( 07777 & ~07137 ))) +640 +``` + +Inoltre: + +- `ProtectSystem=`: _"Se impostato su "`strict`", l'intera gerarchia del file system è montata in sola lettura, a eccezione dei sottoalberi del file system API `/dev/`, `/proc/` e `/sys/` (proteggere queste directory usando `PrivateDevices=`, `ProtectKernelTunables=`, `ProtectControlGroups=`)."_ +- `ReadWritePaths=`: rende nuovamente scrivibili determinati percorsi +- `ProtectHome=`: rende inaccessibili `/home/`, `/root` e `/run/user` +- `PrivateDevices=`: disattiva l'accesso ai dispositivi fisici, consentendo l'accesso solo a pseudo dispositivi come `/dev/null`, `/dev/zero`, `/dev/random` +- `ProtectKernelTunables=`: rende `/proc/` e `/sys/` di sola lettura +- `ProtectControlGroups=`: rende `cgroups` accessibile in sola lettura +- `ProtectKernelModules=`: nega il caricamento esplicito dei moduli +- `ProtectKernelLogs=`: limita l'accesso al buffer dei log del kernel +- `ProtectProc=`: \*"Se impostato su "invisible", i processi di proprietà di altri utenti vengono nascosti in /proc/" +- `ProcSubset=`: _"Se “pid”, tutti i file e le directory non direttamente associati alla gestione dei processi e all'introspezione vengono resi invisibili nel file system /proc/ configurato per i processi dell'unità."_ + +È possibile anche limitare i percorsi degli eseguibili. Il demone deve solo eseguire i suoi binari e le sue librerie. L'utilità `ldd` può dirci quali librerie utilizza un binario: + +```bash +[user@rocky-vm ~]$ ldd /usr/sbin/httpd + linux-vdso.so.1 (0x00007ffc0e823000) + libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fa360d61000) + libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fa360d34000) + libaprutil-1.so.0 => /lib64/libaprutil-1.so.0 (0x00007fa360d05000) + libcrypt.so.2 => /lib64/libcrypt.so.2 (0x00007fa360ccb000) + libexpat.so.1 => /lib64/libexpat.so.1 (0x00007fa360c9a000) + libapr-1.so.0 => /lib64/libapr-1.so.0 (0x00007fa360c5a000) + libc.so.6 => /lib64/libc.so.6 (0x00007fa360a00000) + libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007fa360964000) + /lib64/ld-linux-x86-64.so.2 (0x00007fa360e70000) + libuuid.so.1 => /lib64/libuuid.so.1 (0x00007fa360c4e000) + libm.so.6 => /lib64/libm.so.6 (0x00007fa360889000) +``` + +Le righe seguenti saranno aggiunte alla sezione `[Service]` del file `override.conf`: + +```bash +UMask=7177 +ProtectSystem=strict +ReadWritePaths=/run/httpd /etc/httpd/logs + +ProtectHome=true +PrivateDevices=true +ProtectKernelTunables=true +ProtectControlGroups=true +ProtectKernelModules=true +ProtectKernelLogs=true +ProtectProc=invisible +ProcSubset=pid + +NoExecPaths=/ +ExecPaths=/usr/sbin/httpd /lib64 +``` + +Ricarichiamo la configurazione e verifichiamo l'impatto sul risultato: + +```bash +[user@rocky-vm ~]$ sudo systemctl daemon-reload +[user@rocky-vm ~]$ sudo systemctl restart httpd +[user@rocky-vm ~]$ systemd-analyze security --no-pager httpd | grep Overall +→ Overall exposure level for httpd.service: 4.9 OK 🙂 +``` + +## Restrizioni del sistema + +Vari parametri possono limitare le operazioni del sistema per migliorare la sicurezza: + +- `NoNewPrivileges=`: assicura che il processo non possa ottenere nuovi privilegi attraverso i bit `setuid`, `setgid` e le capacità del filesystem +- `ProtectClock=`: nega la scrittura sugli orologi del sistema e dell'hardware +- `SystemCallArchitectures=`: se impostato su `native`, i processi possono effettuare solo `syscalls` native (nella maggior parte dei casi `x86-64`) +- `RestrictNamespaces=`: gli spazi dei nomi sono per lo più rilevanti per i contenitori, quindi possono essere limitati per questa unità +- `RestrictSUIDSGID=`: impedisce al processo di impostare i bit `setuid` e `setgid` sui file +- `LockPersonality=`: impedisce di modificare il dominio di esecuzione, il che potrebbe essere utile solo per l'esecuzione di applicazioni legacy o di software progettato per altri sistemi Unix-like +- `RestrictRealtime=`: la programmazione in tempo reale è rilevante solo per le applicazioni che richiedono rigorose garanzie di temporizzazione, come i sistemi di controllo industriale, l'elaborazione audio/video e le simulazioni scientifiche +- `RestrictAddressFamilies=`: limita le famiglie di indirizzi socket disponibili; può essere impostato su `AF_(INET|INET6)` per consentire solo i socket IPv4 e IPv6; alcuni servizi avranno bisogno di `AF_UNIX` per la comunicazione interna e la registrazione +- `MemoryDenyWriteExecute=`: assicura che il processo non possa allocare nuove regioni di memoria che siano sia scrivibili che eseguibili, prevenendo alcuni tipi di attacchi in cui il codice dannoso viene iniettato nella memoria scrivibile e poi eseguito; può causare il fallimento dei compilatori JIT utilizzati da JavaScript, Java o .NET +- `ProtectHostname=`: impedisce al processo di utilizzare le chiamate `syscalls` `sethostname()`, `setdomainname()` + +Aggiungiamo quanto segue al file `override.conf`, ricarichiamo la configurazione e verifichiamo l'impatto sul risultato: + +```bash +NoNewPrivileges=true +ProtectClock=true +SystemCallArchitectures=native +RestrictNamespaces=true +RestrictSUIDSGID=true +LockPersonality=true +RestrictRealtime=true +RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX +MemoryDenyWriteExecute=true +ProtectHostname=true +``` + +```bash +[user@rocky-vm ~]$ sudo systemctl daemon-reload +[user@rocky-vm ~]$ sudo systemctl restart httpd +[user@rocky-vm ~]$ systemd-analyze security --no-pager httpd | grep Overall +→ Overall exposure level for httpd.service: 3.0 OK 🙂 +``` + +## Filtraggio delle chiamate di sistema + +Limitare le chiamate di sistema può non essere facile. È difficile stabilire quali chiamate di sistema debbano essere effettuate da alcuni demoni per funzionare correttamente. + +L'utilità `strace` può aiutare a determinare quali syscall vengono create. L'opzione `-f` specifica di seguire i processi biforcati e `-o` salva l'output nel file chiamato `httpd.strace`. + +```bash +[user@rocky-vm ~]$ sudo strace -f -o httpd.strace /usr/sbin/httpd +``` + +Dopo aver eseguito il processo per un po' di tempo e aver interagito con esso, interrompere l'esecuzione per esaminare l'output: + +```bash +[user@rocky-vm ~]$ awk '{print $2}' httpd.strace | cut -d '(' -f 1 | sort | uniq | sed '/^[^a-zA-Z0-9]*$/d' | wc -l +79 +``` + +Il programma ha effettuato 79 chiamate univoche di sistema durante la sua esecuzione. +È possibile impostare l'elenco delle chiamate di sistema consentite con il seguente comando: + +```bash +[user@rocky-vm ~]$ echo SystemCallFilter=$(awk '{print $2}' httpd.strace | cut -d '(' -f 1 | sort | uniq | sed '/^[^a-zA-Z0-9]*$/d' | tr "\n" " ") | sudo tee -a /lib/systemd/system/httpd.service.d/override.conf +... +... +... +[user@rocky-vm ~]$ sudo systemctl daemon-reload +[user@rocky-vm ~]$ sudo systemctl restart httpd +[user@rocky-vm ~]$ systemd-analyze security --no-pager httpd | grep Overall +→ Overall exposure level for httpd.service: 1.5 OK 🙂 +[user@rocky-vm ~]$ curl --head localhost +HTTP/1.1 403 Forbidden +``` + +Il server web è ancora in funzione e l'esposizione è stata notevolmente ridotta. + +L'approccio precedente è esatto. Se una chiamata di sistema è stata omessa, il programma potrebbe bloccarsi. `systemd` raggruppa le chiamate di sistema in insiemi predefiniti. Per facilitare la limitazione delle chiamate di sistema, invece di impostare una singola chiamata di sistema nell'elenco dei permessi o dei non permessi, è possibile impostare un intero gruppo nell'elenco dei permessi o dei non permessi. Per consultare gli elenchi: + +```bash +[user@rocky-vm ~]$ systemd-analyze syscall-filter +@default + # System calls that are always permitted + arch_prctl + brk + cacheflush + clock_getres +... +... +... +``` + +Le chiamate di sistema all'interno dei gruppi possono sovrapporsi, soprattutto per alcuni gruppi che includono altri gruppi. Pertanto, singole chiamate o gruppi possono essere disabilitati specificandoli con il simbolo `~`. Le seguenti direttive nel file `override.conf` dovrebbero funzionare per questa unità: + +```bash +SystemCallFilter=@system-service +SystemCallFilter=~@privileged @resources @mount @swap @reboot +``` + +## Conclusioni + +La configurazione di sicurezza predefinita della maggior parte delle unità `systemd` è poco rigorosa. L'hardening può richiedere un po' di tempo, ma ne vale la pena, soprattutto negli ambienti più grandi esposti a Internet. Se un aggressore sfrutta una vulnerabilità o una configurazione errata, un'unità protetta può impedirgli di prendere il controllo del sistema. diff --git a/docs/guides/security/wireguard_vpn.it.md b/docs/guides/security/wireguard_vpn.it.md new file mode 100644 index 0000000000..27bf378943 --- /dev/null +++ b/docs/guides/security/wireguard_vpn.it.md @@ -0,0 +1,280 @@ +--- +title: VPN WireGuard +author: Joseph Brinkman +contributors: Steven Spencer, Ganna Zhyrnova +tested_with: 9.4 +tags: + - security + - vpn +--- + +## Introduzione + +[WireGuard](https://www.wireguard.com/) è una rete privata virtuale (VPN) peer-to-peer (P2P) gratuita e open-source. È un'alternativa moderna, leggera e sicura alle VPN convenzionali con grandi basi di codice che si basano su connessioni TCP. Poiché WireGuard è una VPN P2P, ogni computer aggiunto alla rete WireGuard comunica direttamente con gli altri. Questa guida utilizza un modello hub-spoke, con un peer WireGuard a cui viene assegnato un indirizzo IP pubblico come gateway per il passaggio di tutto il traffico. Ciò consente al traffico WireGuard di bypassare Carrier Grade NAT (CGNAT) senza abilitare il port-forwarding sul router. Ciò richiede un sistema Rocky Linux con un indirizzo IP pubblico. Il modo più semplice per raggiungere questo obiettivo è quello di creare un server privato virtuale (VPS) attraverso un provider cloud di vostra scelta. Al momento in cui scriviamo, Google Cloud Platform offre un livello gratuito per le sue istanze e2-micro. + +## Prerequisiti + +I requisiti minimi per questa procedura sono i seguenti: + +- La possibilità di eseguire comandi come utente root o di utilizzare `sudo` per elevare i privilegi +- Un sistema Rocky Linux con un indirizzo IP accessibile pubblicamente + +## Installazione di WireGuard + +Installare i pacchetti extra per Enterprise Linux (EPEL): + +```bash +sudo dnf install epel-release -y +``` + +Aggiornare i pacchetti di sistema: + +```bash +sudo dnf upgrade -y +``` + +Installare WireGuard: + +```bash +sudo dnf install wireguard-tools -y +``` + +## Configurazione di server WireGuard + +Creare una cartella in cui inserire i file di configurazione e le chiavi di WireGuard: + +```bash +sudo mkdir -p /etc/wireguard +``` + +Creare un file di configurazione con un nome a scelta che termini con l'estensione `.conf`: + +!!! Note + +``` +È possibile creare più tunnel VPN WireGuard sullo stesso computer, ognuno dei quali utilizza un file di configurazione, un indirizzo di rete e una porta UDP diversi. +``` + +```bash +sudo touch /etc/wireguard/wg0.conf +``` + +Generare una nuova coppia di chiavi private e pubbliche per il server WireGuard: + +```bash +wg genkey | sudo tee /etc/wireguard/wg0 | wg pubkey | sudo tee /etc/wireguard/wg0.pub +``` + +Modificare il file di configurazione con l'editor preferito. + +```bash +sudo vi /etc/wireguard/wg0.conf +``` + +Incollare quanto segue: + +```bash +[Interface] +PrivateKey = server_privatekey +Address = x.x.x.x/24 +ListenPort = 51820 +``` + +È necessario sostituire `server_privatekey` con la chiave privata generata in precedenza. È possibile visualizzare la chiave privata con: + +```bash +sudo cat /etc/wireguard/wg0 +``` + +Successivamente, è necessario sostituire `x.x.x.x/24` con un indirizzo di rete compreso nell'intervallo di indirizzi IP privati definito da [RFC 1918] (https://datatracker.ietf.org/doc/html/rfc1918). L'indirizzo di rete utilizzato in questa guida è `10.255.255.0/24`. + +Infine, è possibile scegliere qualsiasi porta UDP per accettare le connessioni con WireGuard VPN. Per gli scopi di questa guida si utilizza la porta UDP `51820`. + +## Abilita l'inoltro IP + +L'inoltro IP consente l'instradamento dei pacchetti tra le reti. Ciò consente ai dispositivi interni di comunicare tra loro attraverso il tunnel WireGuard: + +Attivare l'inoltro IP per IPv4 e IPv6: + +```bash +sudo sysctl -w net.ipv4.ip_forward=1 && sudo sysctl -w net.ipv6.conf.all.forwarding=1 +``` + +## Configurazione di `firewalld` + +Installazione di `firewalld`: + +```bash +sudo dnf install firewalld -y +``` + +Dopo aver installato `firewalld`, abilitarlo: + +```bash +sudo systemctl enable --now firewalld +``` + +Creare una regola permanente del firewall che consenta il traffico sulla porta UDP 51820 nella zona pubblica: + +```bash +sudo firewall-cmd --permanent --zone=public --add-port=51820/udp +``` + +Successivamente, il traffico dall'interfaccia WireGuard sarà consentito ad altre interfacce della zona interna. + +```bash +sudo firewall-cmd --permanent --add-interface=wg0 --zone=internal +``` + +Aggiungere una regola del firewall per abilitare il masquerading IP sul traffico interno. Ciò significa che i pacchetti inviati tra peer sostituiranno l'indirizzo IP del pacchetto con l'indirizzo IP del server: + +```bash +sudo firewall-cmd --permanent --zone=internal --add-masquerade +``` + +Infine, ricaricare `firewalld`: + +```bash +sudo firewall-cmd --reload +``` + +## Configurazione del peer WireGuard + +Poiché tutti i computer di una rete WireGuard sono tecnicamente dei peer, questa procedura è quasi identica alla configurazione del server WireGuard, ma con leggere differenze. + +Creare una cartella in cui inserire i file di configurazione e le chiavi di WireGuard: + +```bash +sudo mkdir -p /etc/wireguard +``` + +Creare un file di configurazione, dandogli un nome a scelta, che termini con l'estensione `.conf`: + +```bash +sudo touch /etc/wireguard/wg0.conf +``` + +Generare una nuova coppia di chiavi private e pubbliche: + +```bash +wg genkey | sudo tee /etc/wireguard/wg0 | wg pubkey | sudo tee /etc/wireguard/wg0.pub +``` + +Modificare il file di configurazione con il proprio editor, aggiungendo questo contenuto: + +```bash +[Interface] +PrivateKey = peer_privatekey +Address = 10.255.255.2/24 + +[Peer] +PublicKey = server_publickey +AllowedIPs = 10.255.255.1/24 +Endpoint = serverip:51820 +PersistentKeepalive = 25 +``` + +Sostituire `peer_privatekey` con la chiave privata del peer memorizzata in `/etc/wireguard/wg0` sul peer. + +È possibile utilizzare questo comando per visualizzare la chiave in modo da poterla copiare: + +```bash +sudo cat /etc/wireguard/wg0 +``` + +Sostituire `server_publickey` con la chiave pubblica del server memorizzata in `/etc/wireguard/wg0.pub` sul server. + +È possibile utilizzare questo comando per visualizzare la chiave in modo da poterla copiare: + +```bash +sudo cat /etc/wireguard/wg0.pub +``` + +Sostituire `serverip` con l'IP pubblico del server WireGuard. + +È possibile trovare l'indirizzo IP pubblico del server utilizzando il seguente comando sul server: + +```bash +ip a | grep inet +``` + +Il file di configurazione del peer ora include una regola `PersistentKeepalive = 25`. Questa regola indica al peer di eseguire il ping del server WireGuard ogni 25 secondi per mantenere la connessione del tunnel VPN. Senza questa impostazione, il tunnel VPN si interrompe dopo l'inattività. + +## Abilitare WireGuard VPN + +Per abilitare WireGuard, eseguire il seguente comando sia sul server che sul peer: + +```bash +sudo systemctl enable wg-quick@wg0 +``` + +Avviare quindi la VPN eseguendo questo comando sia sul server che sul peer: + +```bash +sudo systemctl start wg-quick@wg0 +``` + +## Aggiungere la chiave client alla configurazione del server WireGuard + +Emettere la chiave pubblica del peer e copiarla: + +```bash +sudo cat /etc/wireguard/wg0.pub +``` + +Sul server, eseguire il comando seguente, sostituendo `peer_publickey` con la chiave pubblica del peer: + +```bash +sudo wg set wg0 peer peer_publickey allowed-ips 10.255.255.2 +``` + +L'uso di `wg set` apporta solo modifiche temporanee all'interfaccia di WireGuard. Per le modifiche permanenti della configurazione, è possibile modificare manualmente il file di configurazione e aggiungere il peer. È necessario ricaricare l'interfaccia WireGuard dopo aver apportato qualsiasi modifica permanente alla configurazione. + +Modificare il file di configurazione del server con l'editor preferito. + +```bash +sudo vi /etc/wireguard/wg0.conf +``` + +Aggiungere il peer al file di configurazione. Il contenuto dovrebbe essere simile a quello riportato di seguito: + +```bash +[Interface] +PrivateKey = +Eo5oVjt+d3XWvFWYcOChaLroGj5vapdXKH8UZ2T2Fc= +Address = 10.255.255.1/24 +ListenPort = 51820 + +[Peer] +PublicKey = 1vSho8NvECkG1PVVk7avZWDmrd2VGZ2xTPaNe5+XKSg= +AllowedIps = 10.255.255.2/32 +``` + +Disattivare l'interfaccia: + +```bash +sudo wg-quick down wg0 +``` + +Attivare l'interfaccia: + +```bash +sudo wg-quick up wg0 +``` + +## Visualizzazione delle interfacce WireGuard e test della connettività + +È possibile visualizzare le informazioni di WireGuard sia sul server che sul peer: + +```bash +sudo wg +``` + +È possibile verificare la connettività inviando un ping al server dal peer: + +```bash +ping 10.255.255.1 +``` + +## Conclusione + +Seguendo questa guida, si è riusciti a configurare una VPN WireGuard utilizzando il modello hub-spoke. Questa configurazione offre un modo sicuro, moderno ed efficiente per collegare più dispositivi attraverso Internet. Controllare il [sito web ufficiale di WireGuard](https://www.wireguard.com/). diff --git a/docs/guides/troubleshooting/kernel_panic.fr.md b/docs/guides/troubleshooting/kernel_panic.fr.md index fea9a2727c..5dff1a9df2 100644 --- a/docs/guides/troubleshooting/kernel_panic.fr.md +++ b/docs/guides/troubleshooting/kernel_panic.fr.md @@ -32,7 +32,7 @@ Si le système ne démarre pas, essayez le **mode de secours** (`rescue mode`, v Le moyen le plus simple de procéder consiste à désinstaller la version du noyau qui ne fonctionne pas, puis à la réinstaller. -!!! note "Remarque" +!!! note "Remarque " ```` Vous ne pouvez pas supprimer un noyau en cours d'exécution. diff --git a/docs/guides/troubleshooting/kernel_panic.it.md b/docs/guides/troubleshooting/kernel_panic.it.md new file mode 100644 index 0000000000..51371ee9db --- /dev/null +++ b/docs/guides/troubleshooting/kernel_panic.it.md @@ -0,0 +1,137 @@ +--- +title: Come affrontare il kernel panic +author: Antoine Le Morvan +contributors: Steven Spencer, Ganna Zhyrnova +tested_with: 9.4 +tags: + - kernel + - kernel panic + - rescue +--- + +## Introduzione + +A volte l'installazione del kernel non va a buon fine e bisogna tornare indietro. + +Questo può avvenire per varie ragioni, come lo spazio insufficiente nella partizione `/boot`, un'installazione interrotta o un problema con un'applicazione di terze parti. + +Per fortuna è sempre possibile fare qualcosa per risolvere la situazione. + +## Provare a riavviare con il kernel precedente + +La prima cosa da provare è riavviare con il kernel precedente. + +- Riavviare il sistema. +- Quando si ha raggiunto la schermata di boot GRUB 2, spostare la selezione alla voce del menù corrispondente al kernel precedente e premere il tasto `enter`. + +Una volta che il sistema si è riavviato lo si può riparare. + +Se il sistema non si avvia, provare la **rescue mode** (vedere sopra). + +## Disinstallare il kernel danneggiato + +Il modo più facile per fare questo è disinstallare la versione del kernel che non funziona e poi reinstallarla. + +!!! Note + +```` +Non è possibile rimuovere un kernel in esecuzione. + +Per visualizzare la versione del kernel attualmente in esecuzione: + +```bash +uname -r +``` +```` + +Per vedere la lista dei kernel installati: + +```bash +dnf list installed kernel\* | sort -V +``` + +Tuttavia il seguente comando potrebbe essere più pratico visto che restituisce i pacchetti con diverse versioni installate: + +```bash +dnf repoquery --installed --installonly +``` + +Per rimuovere un kernel specifico si può usare `dnf` specificando la versione del kernel che si ha recuperato prima: + +```bash +dnf remove kernel-core- +``` + +Esempio: + +```bash +dnf remove kernel-5.14.0-427.20.1.el9_4.x86_64 +``` + +oppure utilizzare il comando `dnf repoquery`: + +```bash +dnf remove $(dnf repoquery --installed --installonly --latest=1) +``` + +Ora si può aggiornare il sistema provando a reinstallare la versione più recente del kernel. + +```bash +dnf update +``` + +Riavviare e vedere se il nuovo kernel funziona. + +## Modalità Rescue + +La modalità rescue corrisponde alla vecchia modalità a utente singolo. + +!!! Note + +``` +Per accedere alla modalità rescue, è necessario fornire la password di root. +``` + +Per accedere alla modalità rescue, il modo più semplice è selezionare la riga che inizia con `0-rescue-*` nel menu di grub. + +Un altro modo è quello di modificare una qualsiasi riga del menu di grub (premendo il tasto “e”) e aggiungere `systemd.unit=rescue.target` alla fine della riga che inizia con `linux` e poi premere `ctrl+x` per avviare il sistema in modalità rescue. + +!!! Note + +``` +A questo punto ci si trova in modalità qwerty. +``` + +È possibile riparare il sistema una volta che si è in modalità rescue e si è inserita la password di root. + +Per questo, potrebbe essere necessario configurare un indirizzo IP temporaneo usando `ip ad add ...` (vedere il capitolo sulla rete della nostra guida all'amministrazione). + +## Ultima possibilità: Modalità Rescue di Anaconda + +Se nessuno dei metodi sopra descritti funziona, è possibile avviare il sistema dalla ISO di installazione e ripararlo. + +La presente documentazione non tratta questo metodo. + +## Manutenzione di Sistema + +### Ripulire le vecchie versioni del kernel + +È possibile rimuovere i vecchi pacchetti del kernel installati, mantenendo solo l'ultima versione e la versione del kernel in esecuzione: + +```bash +dnf remove --oldinstallonly +``` + +### Limitazione del numero di versioni del kernel installate + +È possibile limitare il numero di versioni del kernel modificando il file \`/etc/yum.conf' e impostando la variabile **installonly_limit**: + +```text +installonly_limit=3 +``` + +!!! Note + +``` +È necessario conservare sempre almeno l'ultima versione del kernel e una versione di backup. +``` diff --git a/docs/guides/virtualization/cockpit-machines.it.md b/docs/guides/virtualization/cockpit-machines.it.md new file mode 100644 index 0000000000..e1aec4ba7b --- /dev/null +++ b/docs/guides/virtualization/cockpit-machines.it.md @@ -0,0 +1,96 @@ +--- +title: Cockpit KVM Dashboard +author: Neel Chauhan +contributors: Ganna Zhrynova +tested on: 9.3 +tags: + - virtualization +--- + +# Cockpit KVM dashboard + +## Introduzione + +Cockpit è uno strumento di amministrazione del server che fornisce un dashboard facile da usare per gestire il server. Una caratteristica di Cockpit è che con un pacchetto può gestire le macchine virtuali KVM da un'interfaccia web simile a quella di VMware ESXi o Proxmox. + +## Prerequisiti + +- Un server Rocky Linux con virtualizzazione hardware abilitata +- Accesso ai repository `dnf` di Rocky Linux + +## Installazione di Cockpit + +Cockpit è disponibile di default in Rocky Linux. Tuttavia, il supporto KVM non viene installato immediatamente. Si installa tramite `dnf`: + +```bash +dnf install -y cockpit-machines +``` + +Installare anche `libvirtd`: + +```bash +dnf install -y libvirt +``` + +## Abilitare `cockpit` + +Per abilitare sia la virtualizzazione KVM che Cockpit, attivare i servizi `systemd`: + +```bash +systemctl enable --now libvirtd cockpit.socket +``` + +Dopo aver abilitato `cockpit`, aprire un browser a **http://ip_address:9090** (nota: sostituire **ip_address** con l'indirizzo IP del proprio server): + +![Cockpit login screen](../images/cockpit_login.png) + +Effettuando il login come utente non root, si dovrebbe vedere una dashboard simile a quella mostrata qui: + +![Cockpit dashboard](../images/cockpit_dashboard.png) + +## Creazione di una macchina virtuale + +In questa guida, si configurerà una macchina virtuale Rocky Linux 9 su un host, utilizzando l'automazione per aggiungere un nome utente e una password di root. + +Per creare una macchina virtuale in Cockpit, fare clic sul pulsante blu **Turn on administrative access** e inserire la password, se necessario: + +![Cockpit dashboard as root](../images/cockpit_root_dashboard.png) + +Ora si è connessi come root in Cockpit. Nella barra laterale, fare clic su _Virtual Machines_\*: + +![Cockpit Virtual Machine dashboard](../images/cockpit_vm_dashboard.png) + +Quindi fare clic su **Create VM**: + +![Virtual Machine create dialog](../images/cockpit_vm_create_1.png) + +Nel menu a tendina **Operating system**, selezionare **Rocky Linux 9 (Blue Onyx)**: + +![VM create dialog with Rocky Linux 9 selected](../images/cockpit_vm_create_2.png) + +Quindi, fare clic su **Automation** e inserire i dati di accesso desiderati per la nuova macchina virtuale: + +![VM create dialog with root password and username filed in](../images/cockpit_vm_create_2.png) + +Infine, selezionare **Create and run**. + +In pochi minuti, selezionando la macchina virtuale appena creata, si otterrà il suo indirizzo IP: + +![Our VM's IP address](../images/cockpit_vm_ip.png) + +SSH nell'hypervisor e SSH nell'indirizzo IP di Cockpit. In questo esempio, è **172.20.0.103**. Verrà effettuato l'accesso al nuovo server: + +![Our VM's terminal](../images/cockpit_vm_terminal.png) + +## Limitazioni + +Sebbene Cockpit sia ottimo per la creazione e la gestione di macchine virtuali, ci sono alcune limitazioni da tenere presenti: + +- Non è possibile creare un'bridge interface. +- Non è possibile creare una nuova immagine in nessun pool di archiviazione, ma solo in quello `default`. + +Fortunatamente, è possibile crearli alla riga di comando e Cockpit può utilizzarli. + +## Conclusione + +Cockpit è uno strumento prezioso per gestire un server Rocky Linux tramite un'interfaccia web. È personalmente lo strumento preferito dall'autore per la creazione di macchine virtuali nel proprio laboratorio domestico. Sebbene `cockpit-machines` non sia così completo come ESXi o Proxmox, è in grado di svolgere il lavoro per il 90% dei casi di utilizzo dell'hypervisor. diff --git a/docs/guides/virtualization/libvirt-rocky.it.md b/docs/guides/virtualization/libvirt-rocky.it.md new file mode 100644 index 0000000000..03b49c6525 --- /dev/null +++ b/docs/guides/virtualization/libvirt-rocky.it.md @@ -0,0 +1,173 @@ +--- +title: Configurazione di libvirt su Rocky Linux +author: Howard Van Der Wal +contributors: Steven Spencer +tested with: 9.5 +tags: + - libvirt + - kvm + - virtualization +--- + +## Introduzione + +[libvirt](https://libvirt.org/) è un'incredibile API di virtualizzazione che consente la virtualizzazione di quasi tutti i sistemi operativi di vostra scelta con la potenza di KVM come hypervisor e QEMU come emulatore. + +Questo documento fornisce le istruzioni per l'impostazione di libvirt su Rocky Linux 9. + +## Prerequisiti + +- Una macchina a 64 bit con Rocky Linux 9. +- Assicuratevi di aver abilitato la virtualizzazione nelle impostazioni del BIOS. Se il comando seguente restituisce un risultato, significa che l'abilitazione della virtualizzazione è stata completata: + +```bash +sudo grep -e 'vmx' /proc/cpuinfo +``` + +## Configurazione del repository e installazione dei pacchetti + +- Attivare il repository EPEL (Extra Packages for Enterprise Linux): + +```bash +sudo dnf install -y epel-release +``` + +- Installare i pacchetti necessari per `libvirt` (opzionalmente per `virt-manager` se si vuole usare una GUI per gestire le macchine virtuali): + +```bash +sudo dnf install -y bridge-utils virt-top libguestfs-tools bridge-utils virt-viewer qemu-kvm libvirt virt-manager virt-install +``` + +## Configurazione utente libvirt + +- Aggiungere il proprio utente al gruppo `libvirt`. Ciò consente di gestire le macchine virtuali e di utilizzare comandi come `virt-install` come utente non root: + +```bash +sudo usermod -aG libvirt $USER +``` + +- Attivare il gruppo `libvirt` utilizzando il comando `newgrp`: + +```bash +sudo newgrp libvirt +``` + +- Abilitare e avviare il servizio `libvirtd`: + +```bash +sudo systemctl enable --now libvirtd +``` + +## Configurazione dell'interfaccia bridge per l'accesso diretto alle macchine virtuali + +- Controllare le interfacce attualmente in uso e annotare l'interfaccia principale con connessione a Internet: + +```bash +sudo nmcli connection show +``` + +- Eliminare l'interfaccia collegata a Internet e tutte le connessioni virtual bridge attualmente presenti: + +```bash +sudo nmcli connection delete +``` + +!!! warning + +``` +Assicurarsi di avere accesso diretto alla macchina. Se si configura la macchina tramite SSH, la connessione verrà interrotta dopo aver eliminato la connessione all'interfaccia principale. +``` + +- Creare la nuova connessione bridge: + +```bash +sudo nmcli connection add type bridge autoconnect yes con-name ifname +``` + +- Assegnare un indirizzo IP statico: + +```bash +sudo nmcli connection modify ipv4.addresses ipv4.method manual +``` + +- Assegnare un indirizzo gateway: + +```bash +sudo nmcli connection modify ipv4.gateway +``` + +- Assegnare l'indirizzo DNS: + +```bash +sudo nmcli connection modify ipv4.dns +``` + +- Aggiungere la connessione bridge slave: + +```bash +sudo nmcli connection add type bridge-slave autoconnect yes con-name ifname master +``` + +- Avviare la connessione bridge: + +```bash +sudo nmcli connection up +``` + +- Aggiungere la riga `allow all` a `bridge.conf`: + +```bash +sudo tee -a /etc/qemu-kvm/bridge.conf < +``` + +- Per forzare lo spegnimento di una macchina virtuale che non risponde, utilizzare il comando `destroy`: + +```bash +virsh destroy --domain +``` + +## Come cancellare una VM + +- Utilizzare il comando `undefine`: + +```bash +virsh undefine --domain --nvram +``` + +- Per ulteriori comandi `virsh`, consultare le pagine `virsh` `man`. + +## Conclusione + +- libvirt offre molte possibilità e permette di installare e gestire le macchine virtuali con facilità. Se si hanno ulteriori integrazioni o modifiche a questo documento che si desidera condividere, l'autore vi invita a farlo. diff --git a/docs/guides/virtualization/vbox-rocky.it.md b/docs/guides/virtualization/vbox-rocky.it.md index 700d1c9807..007e1fc74b 100644 --- a/docs/guides/virtualization/vbox-rocky.it.md +++ b/docs/guides/virtualization/vbox-rocky.it.md @@ -35,12 +35,12 @@ Una volta che avete VirtualBox® installato, il passo successivo è quello di Per prima cosa, è necessario indicare a VirtualBox® quale sarà il vostro sistema operativo: - * Clicca su "New" (icona a forma di dente di sega). - * Digita un nome. Esempio: "Rocky Linux 8.5". - * Lasciare la cartella della macchina come riempita automaticamente. - * Cambia il tipo in "Linux". - * E scegli "Red Hat (64-bit)". - * Clicca "Next". +* Clicca su "New" (icona a forma di dente di sega). +* Digita un nome. Esempio: "Rocky Linux 8.5". +* Lasciare la cartella della macchina come riempita automaticamente. +* Cambia il tipo in "Linux". +* E scegli "Red Hat (64-bit)". +* Clicca "Next". ![Nome e Sistema Operativo](../images/vbox-02.png) @@ -52,13 +52,13 @@ Non c'è una schermata per questo, basta modificare il valore in base alla memor ![Disco Rigido](../images/vbox-03.png) -* Cliccare su "Create" +* Cliccare su ++"Create"++ Si aprirà una finestra di dialogo per la creazione di vari tipi di disco rigido virtuale. Sono presenti diversi tipi di disco rigido. Per [ulteriori informazioni](https://docs.oracle.com/en/virtualization/virtualbox/6.0/user/vdidetails.html) sulla selezione dei tipi di disco rigido virtuale, consultare la documentazione di Oracle VirtualBox. Per questo documento, mantenere il valore predefinito (VDI): ![Tipo di File del Disco Rigido](../images/vbox-04.png) -* Clicca Su "Next" +* Cliccare ++"Next"++ La prossima schermata riguarda la memorizzazione sul disco rigido fisico. Esistono due opzioni. La " Fixed Size" sarà più lenta da creare, più veloce da usare, ma meno flessibile in termini di spazio (se si ha bisogno di più spazio, non si può crescere oltre quello creato). @@ -66,13 +66,13 @@ L'opzione predefinita, " Dynamically Allocated", è più veloce da creare e più ![Memorizzazione su Disco Rigido Fisico](../images/vbox-05.png) -* Clicca Su "Next" +* Cliccare ++"Next"++ VirtualBox® offre ora la possibilità di specificare dove si desidera che si trovi il file del disco rigido virtuale. È presente anche un'opzione per espandere lo spazio predefinito di 8 GB del disco rigido virtuale. Questa opzione è utile, perché 8 GB di spazio sul disco rigido non sono sufficienti per installare le opzioni di installazione dell'interfaccia grafica, tanto meno per utilizzarle. Impostate questo valore a 20 GB (o più), a seconda dell'uso che volete fare della macchina virtuale e dello spazio disponibile su disco: ![Posizione e Dimensione del File](../images/vbox-06.png) -* Cliccare su "Create" +* Cliccare su ++"Create"++ La configurazione di base è terminata. Si otterrà una schermata che assomiglia a questa: @@ -101,7 +101,7 @@ L'immagine ISO di Rocky Linux appare ora selezionata sotto "Controller:IDE" nell ![Immagine ISO Selezionata](../images/vbox-10.png) -* Clicca "OK" +* Cliccare ++"OK"++ ### Memoria video per installazioni grafiche @@ -127,7 +127,7 @@ Lo schermo dovrebbe avere un aspetto simile a questo: ![Impostazioni Video](../images/vbox-12.png) -* Clicca "OK" +* Cliccare ++"OK"++ ## Avvio dell'installazione diff --git a/docs/guides/virtualization/vmware_tools.it.md b/docs/guides/virtualization/vmware_tools.it.md new file mode 100644 index 0000000000..ee151884a7 --- /dev/null +++ b/docs/guides/virtualization/vmware_tools.it.md @@ -0,0 +1,379 @@ +--- +title: Installazione VMware Tools™ +author: Emre Camalan +contributors: Steven Spencer, Ganna Zhyrnova +tested_with: 8.9, 9.3 +tags: + - VMware + - Tools +--- + +# Installazione VMware Tools™ + +VMware Tools™ è una suite di utility che migliora le prestazioni e la gestione delle macchine virtuali (VM) in esecuzione su piattaforme di virtualizzazione VMware come VMware vSphere, VMware Workstation e VMware Fusion. I VMware Tools™ migliorano l'interazione tra il sistema operativo guest e l'ambiente host. + +## Prerequisiti e presupposti + +- desiderio di gestire le istanze VMware con VMware Tools™ +- la possibilità di aumentare i privilegi con `sudo` +- si presume che si parta da un'installazione minimale di Rocky Linux. + +## Installazione dei pacchetti necessari + +Installare il driver X11 VMware: + +```bash +sudo dnf install xorg-x11-drv-vmware +``` + +Installare kernel-devel e kernel-headers: + +```bash +sudo dnf install kernel-devel kernel-headers +``` + +Installare `perl` se non è già installato: + +```bash +sudo dnf install perl +``` + +Riavviare il sistema: + +```bash +sudo shutdown -r now +``` + +## Mounting VMware Tools™ + +### Montare VMware Tools™ nell'interfaccia grafica + +Fare clic con il tasto destro del mouse su VM nel menu della macchina virtuale, quindi fare clic su Guest > Install/Upgrade VMware Tools™. + +> VM Tab => Select Install VMware Tools + +Montaggio del CD-ROM di VMware Tools completato. + +### Montaggio di VMware Tools™ da riga di comando + +Creare un mount point per VMware Tools™ e montarlo: + +```bash +sudo mkdir /mnt/cdrom +sudo mount /dev/cdrom /mnt/cdrom +mount: /mnt/cdrom: WARNING: source write-protected, mounted read-only. +``` + +Controllare se \`/dev/cdrom' è montato o meno: + +```bash +sudo df -h +Filesystem Size Used Avail Use% Mounted on +devtmpfs 4.0M 0 4.0M 0% /dev +tmpfs 1.8G 0 1.8G 0% /dev/shm +tmpfs 724M 9.3M 715M 2% /run +/dev/mapper/rl-root 37G 3.5G 34G 10% / +/dev/nvme0n1p1 960M 342M 619M 36% /boot +/dev/mapper/rl-home 19G 163M 18G 1% /home +tmpfs 362M 84K 362M 1% /run/user/1001 +/dev/sr0 56M 56M 0 100% /mnt/CDROM +[root@localhost ecamalan]# cd /mnt/cdrom/ +[root@localhost cdrom]# ls +manifest.txt run_upgrader.sh VMwareTools-10.3.23-16594550.tar.gz vmware-tools-upgrader-32 vmware-tools-upgrader-64 +``` + +## Installare VMWare Tools™ + +Copiare il file gzip di VMware Tools™ nella directory locale `/tmp` con questo comando: + +```bash +cp /mnt/cdrom/VMwareTools-10.3.23-16594550.tar.gz /tmp/ +``` + +Estrarre il file `tar.gz` in una nuova directory chiamata `/tmp/vmware-tools-distrib`: + +```bash +[root@localhost cdrom]# cd /tmp/ +[root@localhost tmp]# tar -zxvf VMwareTools-10.3.23-16594550.tar.gz vmware-tools-distrib/ +vmware-tools-distrib/ +vmware-tools-distrib/bin/ +vmware-tools-distrib/bin/vm-support +vmware-tools-distrib/bin/vmware-config-tools.pl +vmware-tools-distrib/bin/vmware-uninstall-tools.pl +vmware-tools-distrib/vgauth/ +vmware-tools-distrib/vgauth/schemas/ +vmware-tools-distrib/vgauth/schemas/xmldsig-core-schema.xsd +vmware-tools-distrib/vgauth/schemas/XMLSchema.xsd +vmware-tools-distrib/vgauth/schemas/saml-schema-assertion-2.0.xsd +vmware-tools-distrib/vgauth/schemas/catalog.xml +vmware-tools-distrib/vgauth/schemas/XMLSchema.dtd +vmware-tools-distrib/vgauth/schemas/xml.xsd +vmware-tools-distrib/vgauth/schemas/xenc-schema.xsd +vmware-tools-distrib/vgauth/schemas/datatypes.dtd +vmware-tools-distrib/vgauth/schemas/XMLSchema-instance.xsd +vmware-tools-distrib/vgauth/schemas/XMLSchema-hasFacetAndProperty.xsd +vmware-tools-distrib/caf/ + +... (some packages not shown) + +vmware-tools-distrib/lib/plugins64/common/ +vmware-tools-distrib/lib/plugins64/common/libvix.so +vmware-tools-distrib/lib/plugins64/common/libhgfsServer.so +vmware-tools-distrib/doc/ +vmware-tools-distrib/doc/INSTALL +vmware-tools-distrib/doc/open_source_licenses.txt +vmware-tools-distrib/doc/README +vmware-tools-distrib/vmware-install.pl +``` + +!!! Warning + +```` +Prima di iniziare, è necessario verificare se la directory `/etc/init.d` esiste o meno. +In caso contrario, potrebbe apparire il seguente errore: + +>What is the directory that contains the init directories (rc0.d/ to rc6.d/)? + +Soluzione: + +```bash +sudo su +[root@localhost etc]# clear +[root@localhost etc]# cd /etc/ +[root@localhost etc]# mkdir init.d +[root@localhost etc]# cd init.d +[root@localhost etc]# for i in {0,1,2,3,4,5,6} +> do +> mkdir rc$i.d +> done +[root@localhost etc]# cd /tmp/vmware-tools-distrib/ +[root@localhost vmware-tools-distrib]# ./vmware-install.pl +``` +```` + +!!! Warning + +``` +Fare attenzione a cambiare la directory predefinita degli script di init, che dovrebbe essere `/etc/init.d/`. + +>Qual è la directory che contiene le directory di init (da rc0.d/ a rc6.d/)? +>[/etc] /etc/init.d + +>INPUT: [/etc/init.d] + +>Il percorso “/etc/init.d” è una directory che non contiene una directory rc0.d. + + +>Qual è la directory che contiene le directory di init (da rc0.d/ a rc6.d/)? +>**[/etc] /etc/init.d/** + +>INPUT: [/etc/init.d/] + +>Qual è la directory che contiene gli script di avvio? +>[/etc/init.d] + +>INPUT: [/etc/init.d] default +``` + +Per eseguire lo script PERL, spostarsi nella directory vmware-tools-distrib ed eseguire `vmware-install.pl`: + +```bash +sudo cd /tmp/vmware-tools-distrib/ +sudo ./vmware-install.pl + +A previous installation of VMware Tools has been detected. + +The previous installation was made by the tar installer (version 4). + +Keeping the tar4 installer database format. + +You have a version of VMware Tools installed. Continuing this install will +first uninstall the currently installed version. Do you wish to continue? +(yes/no) [yes] + +INPUT: [yes] default + +Uninstalling the tar installation of VMware Tools™. + +Can't exec "/etc/vmware-caf/pme/install/preupgrade.sh": No such file or directory at /usr/bin/vmware-uninstall-tools.pl line 4421. +The removal of VMware Tools 10.3.23 build-16594550 for Linux completed +successfully. + +Installing VMware Tools™. + +In which directory do you want to install the binary files? +[/usr/bin] + +INPUT: [/usr/bin] default + +What is the directory that contains the init directories (rc0.d/ to rc6.d/)? +[/etc] + +INPUT: [/etc] default + +What is the directory that contains the init scripts? +[/etc/init.d] + +INPUT: [/etc/init.d] default + +In which directory do you want to install the daemon files? +[/usr/sbin] + +INPUT: [/usr/sbin] default + +In which directory do you want to install the library files? +[/usr/lib/vmware-tools] + +INPUT: [/usr/lib/vmware-tools] default + +The path "/usr/lib/vmware-tools" does not exist currently. This program is +going to create it, including needed parent directories. Is this what you want? +[yes] + +INPUT: [yes] default + +In which directory do you want to install the common agent library files? +[/usr/lib] + +INPUT: [/usr/lib] default + +In which directory do you want to install the common agent transient files? +[/var/lib] + +INPUT: [/var/lib] default + +In which directory do you want to install the documentation files? +[/usr/share/doc/vmware-tools] + +INPUT: [/usr/share/doc/vmware-tools] default + +The path "/usr/share/doc/vmware-tools" does not exist currently. This program +is going to create it, including needed parent directories. Is this what you +want? [yes] + +INPUT: [yes] default + +The installation of VMware Tools 10.3.23 build-16594550 for Linux completed +successfully. You can decide to remove this software from your system at any +time by invoking the following command: "/usr/bin/vmware-uninstall-tools.pl". + +Before running VMware Tools for the first time, you need to configure it by +invoking the following command: "/usr/bin/vmware-config-tools.pl". Do you want +this program to invoke the command for you now? [yes] + +INPUT: [yes] default + +Initializing... + + +Making sure services for VMware Tools are stopped. + +Failed to stop vmware-tools.service: Unit vmware-tools.service not loaded. +Stopping VMware Tools services in the virtual machine: + Guest operating system daemon: done + VMware User Agent (vmware-user): done + Unmounting HGFS shares: done + Guest filesystem driver: done + + +sh: line 1: : command not found +The installation status of vmsync could not be determined. +Skippinginstallation. + +The installation status of vmci could not be determined. Skippinginstallation. + +The installation status of vsock could not be determined. Skippinginstallation. + + +The installation status of vmxnet3 could not be determined. +Skippinginstallation. + +The installation status of pvscsi could not be determined. +Skippinginstallation. + +The installation status of vmmemctl could not be determined. +Skippinginstallation. + +The VMware Host-Guest Filesystem allows for shared folders between the host OS +and the guest OS in a Fusion or Workstation virtual environment. Do you wish +to enable this feature? [yes] + +INPUT: [yes] default + +The vmxnet driver is no longer supported on kernels 3.3 and greater. Please +upgrade to a newer virtual NIC. (e.g., vmxnet3 or e1000e) + +The vmblock enables dragging or copying files between host and guest in a +Fusion or Workstation virtual environment. Do you wish to enable this feature? +[yes] + +INPUT: [yes] default + + +Skipping configuring automatic kernel modules as no drivers were installed by +this installer. + +Do you want to enable Guest Authentication (vgauth)? Enabling vgauth is needed +if you want to enable Common Agent (caf). [yes] + +INPUT: [yes] default + +Do you want to enable Common Agent (caf)? [no] + +INPUT: [no] default + + + +Detected X server version 1.20.11 + + + +Distribution provided drivers for Xorg X server are used. + +Skipping X configuration because X drivers are not included. + + +Skipping rebuilding initrd boot image for kernel as no drivers to be included +in boot image were installed by this installer. + +Generating the key and certificate files. +Successfully generated the key and certificate files. +Failed to start vmware-tools.service: Unit vmware-tools.service not found. +Unable to start services for VMware Tools + +Execution aborted. + +Warning no default label for /tmp/vmware-block-restore-5339.0/tmp_file +Enjoy, + +--the VMware team +``` + +Se si utilizza l'interfaccia grafica, è necessario riavviare il sistema: + +```bash +sudo shutdown -r now +``` + +## Controllare l'installazione VMware + +```bash + sudo /etc/init.d/vmware-tools start + Checking acpi hot plug done + Starting VMware Tools services in the virtual machine: + Switching to guest configuration: done + Guest filesystem driver: done + Mounting HGFS shares: done + Blocking file system: done + Guest operating system daemon: done + VGAuthService: +``` + +```bash + sudo /etc/init.d/vmware-tools status + vmtoolsd is running +``` + +## Conclusione + +Abbiamo iniziato con un'installazione minimale di Rocky Linux, che ha portato a molte carenze ed errori lungo il percorso. Nonostante ciò, siamo riusciti a installare ed eseguire VMware Tools™, anche se con qualche difficoltà. diff --git a/docs/guides/web/nginx-mainline.it.md b/docs/guides/web/nginx-mainline.it.md index 8e19f1faa6..fcdb52b3d0 100644 --- a/docs/guides/web/nginx-mainline.it.md +++ b/docs/guides/web/nginx-mainline.it.md @@ -12,7 +12,7 @@ tags: ## Introduzione -*Nginx* è un server web progettato per essere veloce, efficiente e compatibile con qualsiasi cosa si possa immaginare. Personalmente lo uso un po' e — una volta che ci si prende la mano — è in realtà abbastanza facile da impostare e configurare. Ecco un breve riassunto delle caratteristiche principali; Nginx è/ha/può essere: +*Nginx* è un server web progettato per essere veloce, efficiente e compatibile con quasi tutto. Lo uso spesso e, una volta che ci si è abituati — è piuttosto facile da configurare e impostare. Ecco un breve riassunto delle caratteristiche principali; Nginx è/ha/può essere: Ecco una breve panoramica dei modi in cui Nginx si distingue e delle sue caratteristiche: @@ -24,98 +24,72 @@ Ecco una breve panoramica dei modi in cui Nginx si distingue e delle sue caratte * Supporto FastCGI * E, naturalmente, IPv6 -È fantastico! Quindi basta `sudo dnf install nginx`, giusto? Beh, non esattamente. È sufficiente abilitare prima il modulo giusto, per attivare il ramo "mainline", in modo da avere l'ultima versione di Nginx. - -!!! Note "Nota" - - C'è un altro ramo chiamato "stable", ma in realtà è un po' superato per la maggior parte dei casi d'uso. Non riceverà nuove caratteristiche man mano che vengono sviluppate, e solo le correzioni di bug e gli aggiornamenti di sicurezza più urgenti. - - Gli sviluppatori di Nginx considerano il ramo "mainline" ben testato e stabile per l'uso generale, *in quanto ottiene tutte le nuove funzionalità, tutte le correzioni di sicurezza e tutte le correzioni di bug.* - - Le uniche ragioni per usare il ramo "stable" sono: - * vuoi *veramente* essere sicuro che le nuove caratteristiche e le correzioni importanti non interrompano il codice di terze parti o il tuo codice personalizzato. - * Volete attenervi solo ai repository software di Rocky Linux. - - Un tutorial alla fine di questa guida spiegherà come attivare e installare il ramo " stable" con il minimo sforzo. +È fantastico! Quindi basta `sudo dnf install nginx`, giusto? Sì, è più o meno così, ma abbiamo incluso alcuni consigli utili per iniziare. ## Prerequisiti e Presupposti -Avrai bisogno di: +Avrete bisogno di: * Una macchina o un server Rocky Linux connesso a internet. * Una familiarità di base con la riga di comando. * La capacità di eseguire comandi come root, sia come utente root che con `sudo`. * Un editor di testo a tua scelta, sia grafico che a riga di comando. Per questo tutorial, sto usando `nano`. -## Installazione del repository & Attivazione del modulo +## Installare ed eseguire Nginx -Per prima cosa, assicuratevi che la vostra macchina sia aggiornata: +Innanzitutto, assicuratevi che il vostro computer sia aggiornato: ```bash sudo dnf update ``` -Quindi, installare il repository software `epel-release`: - -```bash -sudo dnf install epel-release -``` - -Quindi abilita il modulo giusto per l'ultima versione di `nginx`. Questo modulo sarà sempre chiamato `nginx:manline`, quindi basta abilitarlo con `dnf` in questo modo: - -```bash -sudo dnf module enable nginx:mainline -``` - -Ti darà il solito "Sei sicuro di volerlo fare? , ma questa non è la seconda edizione D&D con Gary Gygax stesso, quindi sì. Certo che lo fai. Premi ++y++ per confermare. - -## Installare ed eseguire Nginx - -Poi, installa il pacchetto `nginx` dal repository aggiunto in precedenza: +Quindi, installare il pacchetto `nginx`: ```bash sudo dnf install nginx ``` -Il terminale ti chiederà se ti va bene installare la chiave GPG del repository. Ne hai bisogno, quindi scegli `Y` per sì. - -Una volta che l'installazione è finita, avviate il servizio `nginx` e abilitatelo per avviarsi automaticamente al riavvio tutto in una volta con: +Una volta terminata l'installazione, avviare il servizio `nginx` e abilitarlo all'avvio automatico al riavvio: ```bash sudo systemctl enable --now nginx ``` -Per verificare che l'ultima versione di *Nginx* sia stata installata, eseguire: +Per verificare che sia stata installata l'ultima versione di *Nginx* (la più recente dai repository Rocky, comunque), eseguire: ```bash nginx -v ``` -Da lì, si potrebbe semplicemente iniziare ad inserire i file HTML nella directory `/usr/share/nginx/html/` per costruire un semplice sito web statico. Il file di configurazione per il sito web/host virtuale predefinito è chiamato “nginx.conf” ed è in `/etc/nginx/`. Contiene anche una serie di altre configurazioni server Nginx di base, quindi anche se si sceglie di spostare la configurazione del sito web reale in un altro file, si dovrebbe probabilmente lasciare il resto di "nginx. onf" intatto. +Da qui, si può iniziare a inserire i file HTML nella directory `/usr/share/nginx/html/` per costruire un semplice sito web statico. Il file di configurazione per il sito web/virtual host predefinito si chiama "nginx.conf" e si trova in `/etc/nginx/`. Contiene anche una serie di altre configurazioni di base del server Nginx, quindi anche se si sceglie di spostare la configurazione del sito web in un altro file, probabilmente si dovrebbe lasciare intatto il resto di "nginx.conf". + +!!! Note + + Le versioni precedenti di questa guida descrivevano l'installazione di nginx-mainline. Questa non è più un'opzione. Nella maggior parte dei casi, la versione di Nginx presente nei repo di Rocky è più che sufficiente, in quanto fornisce una base stabile con patch di sicurezza retroportate. Chi vuole ancora utilizzare nginx-mainline può trovare metodi per farlo cercando sul web. Tutti i documenti di istruzioni trovati, tuttavia, si riferiscono a Rocky Linux 8. Si noti che l'uso di nginx-mainline è di solito perfettamente fattibile, ma non è supportato. ## Configurare il Firewall -!!! Note "Nota" +!!! Note - Se state installando Nginx su un container come LXD/LXC o Docker, potete saltare questa parte per ora. Il firewall dovrebbe essere gestito dal sistema operativo host. + Se si sta installando Nginx su un contenitore come LXD/LXC o Docker, si può saltare questa parte per ora. Il firewall deve essere gestito dal sistema operativo host. -Se si cerca di visualizzare una pagina Web con l'indirizzo IP o il nome di dominio della propria macchina da un altro computer, probabilmente non si otterrà nulla. Beh, sarà così finché avrete un firewall attivo e funzionante. +Probabilmente non otterrete nulla se cercate di visualizzare una pagina web con l'indirizzo IP o il nome di dominio del vostro computer da un altro computer. Questo sarà il caso se avete un firewall attivo e funzionante. -Per aprire le porte necessarie in modo da poter effettivamente "vedere" le pagine web, utilizzeremo il firewall integrato di Rocky Linux, `firewalld`. Il comando `firewalld` per farlo è `firewall-cmd`. Ci sono due modi per farlo: quello ufficiale e quello manuale. *In questo caso, il modo ufficiale è il migliore,* ma dovresti conoscerli entrambi per riferimento futuro. +Per aprire le porte necessarie a "vedere" le pagine web, utilizzeremo il firewall integrato di Rocky Linux, `firewalld`. Il comando `firewalld` per farlo è `firewall-cmd`. Ci sono due modi per farlo: quello ufficiale e quello manuale. *In questo caso, la via ufficiale è la migliore,* ma è bene conoscerle entrambe per poterle utilizzare in futuro. -Il modo ufficiale apre il firewall al servizio `http`, che è ovviamente il servizio che gestisce le pagine web. Basta eseguire questo: +Il metodo ufficiale apre il firewall al servizio `http`, che è, ovviamente, il servizio che gestisce le pagine web. Eseguite questo: ```bash sudo firewall-cmd --permanent --zone=public --add-service=http ``` -Scomponiamo il tutto: +Vediamo di analizzare la situazione: * L'opzione `--permanent` indica al firewall di assicurarsi che questa configurazione sia utilizzata ogni volta che il firewall viene riavviato e quando il server viene riavviato. * `--zone=public` dice al firewall di accettare connessioni in entrata a questa porta da chiunque. * Infine, `--add-service=http` dice a `firewalld` di lasciar passare tutto il traffico HTTP verso il server. -Ecco il modo manuale per farlo. È praticamente la stessa cosa, tranne per il fatto che si apre specificamente la porta 80 utilizzata da HTTP. +Now here's the manual way to do it. È praticamente la stessa cosa, tranne per il fatto che si apre specificamente la porta 80 utilizzata da HTTP. ```bash sudo firewall-cmd --permanent --zone=public --add-port=80/tcp @@ -131,21 +105,21 @@ sudo firewall-cmd --permanent --zone=public --add-service=https sudo firewall-cmd --permanent --zone=public --add-port=443/tcp ``` -Queste configurazioni non avranno effetto finché non forzerete la questione. Per farlo, dite a `firewalld` di rilasciare le sue configurazioni, così: +Queste configurazioni non avranno effetto finché non si forza l'applicazione. Per fare ciò, dire a `firewalld` di rilasciare le sue configurazioni, in questo modo: ```bash sudo firewall-cmd --reload ``` -!!! Note "Nota" +!!! Note - Ora, c'è una piccolissima possibilità che questo non funzioni. In quei rari casi, fai in modo che `firewalld` faccia il suo invito con il vecchio turn-it-off-and-turn-it-on-again. + Ora, c'è una piccolissima possibilità che questo non funzioni. In quei rari casi, fate in modo che `firewalld` esegua i vostri comandi con il vecchio metodo “spegnere e riaccendere”. ```bash systemctl restart firewalld ``` -Per assicurarsi che le porte siano state aggiunte correttamente, eseguire `firewall-cmd --list-all`. Un firewall correttamente configurato avrà un aspetto simile a questo: +Per verificare che le porte siano state aggiunte correttamente, eseguire `firewall-cmd --list-all`. Un firewall correttamente configurato avrà un aspetto simile a questo: ```bash public (active) @@ -166,52 +140,53 @@ public (active) E questo dovrebbe essere tutto ciò di cui avete bisogno, a livello di firewall. -*Ora* dovresti essere in grado di vedere una pagina web che assomiglia a questa: +*A questo punto* dovrebbe apparire una pagina web con un aspetto simile a questo: -![La pagina di benvenuto di Nginx](nginx/images/welcome-nginx.png) +![The Nginx welcome page](nginx/images/welcome-nginx.png) -Non è molto, ma significa che il server funziona. Puoi anche testare che la tua pagina web funzioni dalla linea di comando con: +It’s not much at all, but it means the server is working. È anche possibile verificare che la pagina web funzioni dalla riga di comando con: ```bash curl -I http://[your-ip-address] ``` -## Creare un Utente del server e Cambiare la Cartella Radice del sito Web +## Creazione di un utente del server e modifica della cartella principale del sito web -Mentre voi *potreste* semplicemente mettere il vostro sito web nella directory predefinita e proseguire (e questo potrebbe andare bene per *Nginx* quando è in esecuzione all'interno di un container, o su un server di test/sviluppo), non è ciò che noi chiamiamo best practice. Invece, è una buona idea creare un utente Linux specifico sul tuo sistema per il tuo sito web, e mettere i file del tuo sito web in una directory fatta solo per quell'utente. +Sebbene *sia possibile* inserire il proprio sito web nella directory predefinita e partire (e questo potrebbe andare bene per *Nginx* quando è in esecuzione all'interno di un container o su un server di test/sviluppo), non è ciò che chiamiamo best practice. È invece una buona idea creare sul sistema un utente Linux specifico per il sito web e inserire i file del sito in una directory creata appositamente per quell'utente. -Se si desidera creare più siti web, è una buona idea creare diversi utenti e directory principali per garantire l'organizzazione e la sicurezza. +Se si desidera creare più siti web, è necessario creare diversi utenti e directory principali per garantire l'organizzazione e la sicurezza. -In questa guida, avrò solo un utente: un bel diavolo di nome "www". Decidere dove mettere i file del tuo sito web diventa più complicato. +In questa guida avrò un solo utente: un bel diavolo di nome “www”. Decidere dove mettere i file del sito web diventa più complicato. -I file del sito web possono essere collocati in diversi punti, a seconda della configurazione del server. Se siete su un server bare-metal (fisico), o state installando `nginx` direttamente su un VPS, probabilmente avete Security Enhanced Linux (SELinux) in esecuzione. SELinux è uno strumento che fa molto per proteggere la vostra macchina, ma detta anche dove potete mettere certe cose, come le pagine web. +I file del sito web possono essere collocati in diversi punti, a seconda della configurazione del server. Se siete su un server bare-metal (fisico) o state installando `nginx` direttamente su un VPS, probabilmente avete in esecuzione Security Enhanced Linux (SELinux). SELinux è uno strumento che fa molto per proteggere la vostra macchina, ma che in un certo senso impone anche dove potete mettere certe cose, come le pagine web. -Quindi, se state installando `nginx` direttamente sulla vostra macchina, vorrete mettere i vostri siti web nelle sottodirectory della cartella principale predefinita. In questo caso, la root predefinita è `/usr/share/nginx/html`, quindi il sito web per l'utente "www" potrebbe andare in `/usr/share/nginx/html/www`. +Quindi, se state installando `nginx` direttamente sulla vostra macchina, vorrete mettere i vostri siti web nelle sottodirectory della cartella principale predefinita. In questo caso, la radice predefinita è `/usr/share/nginx/html`, quindi il sito web per l'utente "www" potrebbe andare in `/usr/share/nginx/html/www`. -Se state eseguendo `nginx` in un contenitore come LXD/LXC, tuttavia, SELinux probabilmente *non* sarà installato, e potete mettere i vostri file dove volete. In questo caso, mi piace mettere tutti i file del sito web di un utente sotto una directory in una normale cartella home, così: `/home/www/`. +Se si esegue `nginx` in un contenitore come LXD/LXC, tuttavia, SELinux probabilmente *non sarà* installato e si potranno mettere i file dove si vuole. In questo caso, mi piace mettere tutti i file del sito web di un utente sotto una directory in una normale cartella home, in questo modo: `/home/www/`. -Continuerò questa guida come se SELinux fosse installato, comunque. Cambia solo quello che ti serve in base alle tue necessità. Potete anche imparare di più su come funziona SELinux in [la nostra guida sull'argomento](../security/learning_selinux.md). +Tuttavia, continuerò questa guida come se SELinux fosse installato. Modificate solo ciò che è necessario in base al vostro caso d'uso. Per saperne di più sul funzionamento di SELinux, consultate la [nostra guida sull'argomento](../security/learning_selinux.md). ### Creazione dell'Utente -Per prima cosa, creiamo la cartella che useremo: +Per prima cosa, creiamo la cartella che utilizzeremo: ```bash sudo mkdir /usr/share/nginx/html/www ``` -Poi, create il gruppo www: +Quindi, creare il gruppo www: ```bash sudo groupadd www ``` + Quindi, creiamo l'utente: ```bash sudo adduser -G nginx -g www -d /usr/share/nginx/html/www www --system --shell=/bin/false ``` -Questo comando dice alla macchina di: +Questo comando indica alla macchina di: * Creare un utente chiamato "www" (come da testo centrale), * mettere tutti i suoi file in `/usr/share/nginx/html/www`, @@ -219,11 +194,11 @@ Questo comando dice alla macchina di: * Il flag `--system` dice che l'utente non è un utente umano, è riservato al sistema. Se volete creare account utente umani per gestire diversi siti web, questa è tutta un'altra guida. * `--shell=/bin/false` si assicura che nessuno possa anche solo *tentare* di accedere come utente "www". -Il gruppo "nginx" fa una vera magia. Permette al server web di leggere e modificare i file che appartengono all'utente "www" e al gruppo di utenti "www". Vedere [guida alla gestione degli utenti](../../books/admin_guide/06-users.md) di Rocky Linux per maggiori informazioni. +Il gruppo "nginx" fa una vera magia. Permette al server web di leggere e modificare i file che appartengono all'utente "www" e al gruppo utente "www". Per ulteriori informazioni, consultare la [guida sulla gestione degli utenti](../../books/admin_guide/06-users.md). ### Cambiare la Cartella Radice del Server -Ora che hai il tuo nuovo e fantasioso account utente, è il momento di fare in modo che `nginx` cerchi i file del tuo sito web in quella cartella. Prendete di nuovo il vostro editor di testo preferito. +Ora che avete il vostro nuovo account utente, è il momento di far sì che `nginx` cerchi i file del vostro sito web in quella cartella. Prendete di nuovo il vostro editor di testo preferito. Per ora, basta eseguire: @@ -231,40 +206,40 @@ Per ora, basta eseguire: sudo nano /etc/nginx/conf.d/default.conf ``` -Quando il file è aperto, cerca la linea che assomiglia a `root /usr/share/nginx/html;`. Cambialo nella cartella principale del tuo sito web scelto, ad esempio. `root /usr/share/nginx/html/www;` (o `/home/www` se si esegue `nginx` in contenitori come faccio io). Salvate e chiudete il file, poi testate la vostra configurazione `nginx` per assicurarvi di non aver saltato un punto e virgola o altro: +Quando il file è aperto, cercate la riga che assomiglia a `root /usr/share/nginx/html;`. Cambiatela con la cartella principale del vostro sito web, ad esempio. `root /usr/share/nginx/html/www;` (o `/home/www` se si esegue `nginx` in container come faccio io). Salvare e chiudere il file, quindi verificare la configurazione di `nginx` per assicurarsi di non aver saltato un punto e virgola o altro: ```bash nginx -t ``` -Se si ottiene il seguente messaggio di successo, tutto è andato bene: +Se viene visualizzato il seguente messaggio di successo, tutto è andato per il verso giusto: -``` +```bash nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful ``` -Poi, date al server un riavvio morbido con: +Quindi, riavviare il server in modo soft con: ```bash sudo systemctl reload nginx ``` -!!! Note "Nota" +!!! Note - Nel caso improbabile che il riavvio morbido non funzioni, date un calcio nei pantaloni a `nginx` con: + Nel caso improbabile in cui il riavvio soft non funzioni, date una spinta a `nginx` con: ```bash - sudo systemctl reload nginx + sudo systemctl restart nginx ``` -Tutti i file HTML nella tua nuova cartella principale dovrebbero ora essere navigabili da... il tuo browser. +Tutti i file HTML presenti nella nuova cartella principale dovrebbero ora essere navigabili da... il browser. ### Cambiare i Permessi ai File I permessi devono essere impostati correttamente per garantire che `nginx` possa leggere, scrivere ed eseguire qualsiasi file nella directory del sito web. -Se si ottiene il seguente messaggio di successo, tutto è andato bene: +Innanzitutto, assicurarsi che tutti i file della cartella principale siano di proprietà dell'utente del server e del suo gruppo di utenti: ```bash sudo chown -R www:www /usr/share/nginx/html/www @@ -277,73 +252,30 @@ sudo find /usr/share/nginx/html/www -type d -exec chmod 555 "{}" \; sudo find /usr/share/nginx/html/www -type f -exec chmod 444 "{}" \; ``` -In pratica, questo dà a tutti il diritto di guardare i file sul server, ma non di modificarli. Solo gli utenti root e del server possono farlo. +That basically gives everyone the right to look at files on the server, but not modify them. Solo gli utenti root e del server possono farlo. -## Ottenere certificati SSL per il Vostro Sito +## Ottenere certificati SSL per il vostro sito -A partire da ora, la nostra [guida per ottenere certificati SSL con certbot](../security/generating_ssl_keys_lets_encrypt.md) è stata aggiornata con alcune istruzioni di base per `nginx`. Vai a dare un'occhiata, in quanto ha istruzioni complete per l'installazione di certbot, così come la generazione dei certificati. +La nostra [guida per ottenere certificati SSL con certbot](../security/generating_ssl_keys_lets_encrypt.md) è stata aggiornata con alcune istruzioni di base per `nginx`. Date un'occhiata a questo documento, che contiene istruzioni complete per l'installazione di certbot e per la generazione dei certificati. Sta per arrivare il momento in cui i browser potrebbero smettere di far vedere i siti senza certificati, quindi assicuratevi di ottenerne uno per ogni sito. -## Ulteriori Opzioni di Configurazione e Guide +## Opzioni di configurazione e guide aggiuntive * Se vuoi vedere come far funzionare *Nginx* con PHP, e PHP-FPM in particolare, controlla la nostra [guida PHP su Rocky Linux](../web/php.md). * Se vuoi imparare a configurare *Nginx* per più siti Web, ora abbiamo [una guida su questo argomento](nginx-multisite.md). -## Conclusione - -Se volete usare il ramo "stable" di `nginx`, anche con le sue limitazioni, ecco come fare. Per prima cosa, assicuratevi che il vostro sistema operativo sia aggiornato: - -```bash -sudo dnf update -``` - -Poi, cercate l'ultima versione `nginx` disponibile nei repo predefiniti con: - -```bash -sudo dnf module list nginx -``` - -Questo dovrebbe darvi una lista che assomiglia a questa: - -```bash -Rocky Linux 8 - AppStream -Name Stream Profiles Summary -nginx 1.14 [d] common [d] nginx webserver -nginx 1.16 common [d] nginx webserver -nginx 1.18 common [d] nginx webserver -nginx 1.20 common [d] nginx webserver -``` - -Scegliete il numero più alto della lista e abilitate il suo modulo in questo modo: - -```bash -sudo dnf module enable nginx:1.20 -``` - -Vi verrà chiesto se siete sicuri di volerlo fare, quindi digitate `Y`. Poi, usate il comando predefinito per installare `nginx`: - -```bash -sudo dnf install nginx -``` - -Poi puoi abilitare il servizio e configurare il tuo server come descritto sopra. - -!!! Note "Nota" - - Il file di configurazione predefinito, in questo caso, è nella cartella di configurazione base di `nginx` in `/etc/nginx/nginx.conf`. La cartella principale del sito web è la stessa, però. - ## Regole SELinux -Attenzione che quando applicato, le direttive nginx proxy_pass falliranno con "502 Bad Gateway" +Attenzione: se applicate, le direttive nginx proxy_pass falliranno con "502 Bad Gateway" -È possibile disattivare setenforce per scopi di sviluppo +È possibile disabilitare setenforce per scopi di sviluppo ```bash sudo setenforce 0 ``` -oppure puoi abilitare `http_d` o altri servizi correlati a nginx in `/var/log/audit/audit.log` +oppure si può abilitare `httpd` o altri servizi relativi a nginx in `/var/log/audit/audit.log` ```bash sudo setsebool httpd_can_network_connect 1 -P @@ -351,6 +283,6 @@ sudo setsebool httpd_can_network_connect 1 -P ## Conclusione -L'installazione e la configurazione di base di `nginx` sono facili, anche se è più complicato di quanto dovrebbe essere ottenere l'ultima versione. Ma seguite i passaggi e avrete una delle migliori opzioni di server in funzione rapidamente. +L'installazione e la configurazione di base di `nginx` sono semplici, anche se è più complicato di quanto dovrebbe essere ottenere l'ultima versione. Ma seguite i passaggi e avrete una delle migliori opzioni di server in funzione rapidamente. -Ora devi solo andare a costruirti un sito web? Cosa potrebbe volerci, altri dieci minuti? *Sobs quietly in Web Designer* +Ora dovete solo andare a costruirvi un sito web? Quanto ci vorrà, altri dieci minuti? *Sussurri silenziosi in Web Designer* diff --git a/docs/guides/web/php.it.md b/docs/guides/web/php.it.md index 0d20148313..27dd1afc67 100644 --- a/docs/guides/web/php.it.md +++ b/docs/guides/web/php.it.md @@ -1,8 +1,8 @@ --- title: PHP e PHP-FPM author: Antoine Le Morvan -contributors: Steven Spencer, Ganna Zhyrnova -tested_with: 8.9 +contributors: Steven Spencer, Ganna Zhyrnova, Joseph Brinkman +tested_with: 9.3, 8.9 tags: - web - php @@ -11,20 +11,16 @@ tags: # PHP e PHP-FPM -!!! warning "Scritto per Rocky Linux 8.x" +**PHP** (**P**HP **H**ypertext **P**reprocessor) è un linguaggio di scripting sorgente appositamente progettato per lo sviluppo di applicazioni web. Nel 2024, PHP rappresentava poco meno dell'80% delle pagine web generate nel mondo. PHP è open-source ed è il cuore dei più famosi CMS (WordPress, Drupal, Joomla!, Magento, ...). - Questa procedura è stata pubblicata inizialmente quando Rocky Linux 8.x era l'unica versione. Questa procedura deve essere testata e riscritta per Rocky Linux 9.x. - -**PHP** (**P**HP **H**ypertext **P**reprocessor) è un linguaggio di scripting sorgente, appositamente progettato per lo sviluppo di applicazioni web. Nel 2021, PHP rappresentava poco meno dell'80% delle pagine web generate nel mondo. PHP è open-source ed è il nucleo dei più famosi CMS (WordPress, Drupal, Joomla!, Magento, ...). - -**PHP-FPM** (**F**astCGI **P**rocess **M**anager) è integrato nel PHP dalla sua versione 5.3.3. La versione FastCGI di PHP offre ulteriori funzionalità. +**PHP-FPM** (**F**astCGI **P**rocess **M**anager) è integrato in PHP fin dalla versione 5.3.3. La versione FastCGI di PHP offre ulteriori funzionalità. ## Generalità -**CGI** (**C**ommon **G**ateway **I**nterface) e **FastCGI** permettono la comunicazione tra il server web (Apache, Nginx, ...) e un linguaggio di sviluppo (PHP, Python, Java): +**CGI** (**C**ommon **G**ateway **I**nterface) e **FastCGI** consentono la comunicazione tra il server web (Apache, Nginx, ...) e un linguaggio di sviluppo (PHP, Python, Java): -* Nel caso di **CGI**, ogni richiesta porta alla creazione di un **nuovo processo**, che è meno efficiente in termini di prestazioni. -* **FastCGI** si basa su un **certo numero di processi** per il trattamento delle sue richieste client. +* Nel caso di **CGI**, ogni richiesta crea un **nuovo processo**, il che è meno efficiente in termini di prestazioni. +* **FastCGI** si affida a un **certo numero di processi** per trattare le richieste dei clienti. PHP-FPM, **oltre a prestazioni migliori**, porta con sé: @@ -33,113 +29,196 @@ PHP-FPM, **oltre a prestazioni migliori**, porta con sé: * Gestione del registro, * Gestione dinamica dei processi e riavvio senza interruzione del servizio ('graceful'). -!!! Note "Nota" +!!! Note Poiché Apache ha un modulo PHP, php-fpm è più comunemente usato su un server Nginx. ## Scegliere una versione PHP -Rocky Linux, come il suo upstream, offre molte versioni del linguaggio. Alcuni di essi hanno raggiunto la fine del loro ciclo di vita, ma vengono mantenuti per continuare a ospitare applicazioni storiche che non sono ancora compatibili con le nuove versioni di PHP. Fare riferimento alla pagina [versioni supportate](https://www.php.net/supported-versions.php) del sito web php.net per scegliere una versione supportata. +Rocky Linux, come il suo upstream, offre molte versioni del linguaggio. Alcuni di essi hanno raggiunto la fine del loro ciclo di vita, ma vengono mantenuti per continuare a ospitare applicazioni storiche che non sono ancora compatibili con le nuove versioni di PHP. Per scegliere una versione, consultare la pagina delle [versioni supportate](https://www.php.net/supported-versions.php) del sito web php.net. Per ottenere un elenco delle versioni disponibili, basta inserire il seguente comando: -```bash -$ sudo dnf module list php +=== "Elenco dei moduli PHP 9.3" -Rocky Linux 8 - AppStream -Name Stream Profiles Summary -php 7.2 [d] common [d], devel, minimal PHP scripting language -php 7.3 common [d], devel, minimal PHP scripting language -php 7.4 common [d], devel, minimal PHP scripting language -php 8.0 common [d], devel, minimal PHP scripting language + ```bash + $ sudo dnf module list php -Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled -``` + Rocky Linux 9 - AppStream + Name Stream Profiles Summary + php 8.1 [d] common [d], devel, minimal -Rocky fornisce, dal proprio repository AppStream, diversi moduli PHP. + Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled + ``` -Si noterà che la versione predefinita di Rocky 8.9 è la 7.2, che ha già raggiunto la fine del suo ciclo di vita al momento in cui si scrive. -È possibile attivare un modulo più recente immettendo il seguente comando: + Il repository Remi offre versioni più recenti di PHP rispetto al repository Appstream, incluse le versioni 8.3 e 8.4. + + Per installare il repository Remi, eseguire il seguente comando (nota: se si utilizza Rocky Linux 8.x o 10.x, sostituire 8 o 10 dopo “release-” nel comando riportato di seguito): -```bash -sudo dnf module enable php:8.0 -============================================================================================== - Package Architecture Version Repository Size -============================================================================================== -Enabling module streams: - httpd 2.4 - nginx 1.14 - php 8.0 + ```bash + sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm + ``` -Transaction Summary -============================================================================================== -Is this ok [y/N]: + Una volta installato il repository Remi, abilitarlo eseguendo il seguente comando. -Transaction Summary -============================================================================================== + ```bash + sudo dnf config-manager --set-enabled remi + ``` -Is this ok [y/N]: y -Complete! -``` + + È ora possibile attivare un modulo più recente (PHP 8.4) immettendo il seguente comando: + + ```bash + sudo dnf module enable php:remi-8.4 + ``` + +=== "Elenco dei moduli PHP 8.9" + + ```bash + $ sudo dnf module list php + + Rocky Linux 8 - AppStream + Name Stream Profiles Summary + php 7.2 [d] common [d], devel, minimal PHP scripting language + php 7.3 common [d], devel, minimal PHP scripting language + php 7.4 common [d], devel, minimal PHP scripting language + php 8.0 common [d], devel, minimal PHP scripting language + + Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled + ``` + + + Rocky fornisce diversi moduli PHP dal suo repository AppStream. + + Noterai che la versione predefinita di un Rocky 8.9 è la 7.2, che ha già raggiunto il termine del proprio ciclo vitale, al momento della scrittura. + + Puoi attivare un modulo più recente inserendo il seguente comando: + + ```bash + sudo dnf module enable php:8.0 + ============================================================================================== + Package Architecture Version Repository Size + ============================================================================================== + Enabling module streams: + httpd 2.4 + nginx 1.14 + php 8.0 + + Transaction Summary + ============================================================================================== + + Is this ok [y/N]: + + Transaction Summary + ============================================================================================== + + Is this ok [y/N]: y + Complete! + ``` Ora si può procedere all'installazione del motore PHP. ## Modalità PHP cgi -Per prima cosa, vediamo come installare e utilizzare PHP in modalità CGI. Possiamo farlo funzionare solo con il server web Apache e il suo modulo `mod_php`. Vedremo più tardi in questo documento, nella parte FastCGI (php-fpm) come integrare PHP in Nginx (ma anche in Apache). +Prima di tutto, vediamo come installare e utilizzare PHP in modalità CGI. Possiamo farlo funzionare soltanto con il server web di Apache e il suo modulo `mod_php`. Vedremo, più avanti in questo documento, nella parte FastCGI (php-fpm) come integrare PHP in Nginx (ma anche in Apache). ### Installazione -L'installazione di PHP è relativamente banale, poiché consiste nell'installare il pacchetto principale e i pochi moduli necessari. +L'installazione di PHP è relativamente semplice, poiché consiste nell'installare il pacchetto principale e i pochi moduli necessari. -L'esempio seguente installa PHP con i moduli normalmente installati con esso. +Il seguente esempio installa PHP con i moduli solitamente installati con esso. -```bash -sudo dnf install php php-cli php-gd php-curl php-zip php-mbstring -``` +=== "9.3 installare PHP" + + ```bash + sudo dnf install php php-cli php-gd php-curl php-zip php-mbstring + ``` + + + Durante l'installazione verrà richiesto di importare le chiavi GPG per i repository epel9 (Extra Packages for Enterprise Linux 9) e Remi. Immettere y per importare le chiavi: + + ```bash + Extra Packages for Enterprise Linux 9 - x86_64 + Importing GPG key 0x3228467C: + Userid : "Fedora (epel9) " + Fingerprint: FF8A D134 4597 106E CE81 3B91 8A38 72BF 3228 467C + From : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-9 + Is this ok [y/N]: y + Key imported successfully + Remi's RPM repository for Enterprise Linux 9 - x86_64 + Importing GPG key 0x478F8947: + Userid : "Remi's RPM repository (https://rpms.remirepo.net/) " + Fingerprint: B1AB F71E 14C9 D748 97E1 98A8 B195 27F1 478F 8947 + From : /etc/pki/rpm-gpg/RPM-GPG-KEY-remi.el9 + Is this ok [y/N]: y + Key imported successfully + Running transaction check + Transaction check succeeded. + Running transaction test + Transaction test succeeded. + + Complete! + ``` + +=== "8.9 installare PHP" + + ```bash + sudo dnf install php php-cli php-gd php-curl php-zip php-mbstring + ``` È possibile verificare che la versione installata corrisponda a quella prevista: -```bash -$ php -v -PHP 7.4.19 (cli) (built: May 4 2021 11:06:37) ( NTS ) -Copyright (c) The PHP Group -Zend Engine v3.4.0, Copyright (c) Zend Technologies +=== "9.3 controllare la versione di PHP" + + ```bash + $ php -v + PHP 8.3.2 (cli) (built: Jan 16 2024 13:46:41) (NTS gcc x86_64) + Copyright (c) The PHP Group + Zend Engine v4.3.2, Copyright (c) Zend Technologies + with Zend OPcache v8.3.2, Copyright (c), by Zend Technologies + ``` + +=== "8.9 controllare la versione di PHP" + + ```bash + $ php -v + PHP 7.4.19 (cli) (built: May 4 2021 11:06:37) ( NTS ) + Copyright (c) The PHP Group + Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.19, Copyright (c), by Zend Technologies -``` + ``` ### Configurazione #### Integrazione con Apache -Per servire pagine PHP in modalità CGI, è necessario installare il server apache, configurarlo, attivarlo e avviarlo. +Per servire pagine PHP in modalità CGI, è necessario installare il server Apache, configurarlo, attivarlo e avviarlo. * Installazione: -```bash -sudo dnf install httpd -``` + ```bash + sudo dnf install httpd + ``` -* Attivazione: + * Attivazione: -```bash -sudo systemctl enable httpd -sudo systemctl start httpd -sudo systemctl status httpd -``` + ```bash + sudo systemctl enable --now httpd + sudo systemctl status httpd + ``` -* Non dimenticatevi di configurare il firewall: +* Non dimenticate di configurare il firewall: -```bash -sudo firewall-cmd --add-service=http --permanent -sudo firewall-cmd --reload -``` + ```bash + sudo firewall-cmd --add-service=http --permanent + sudo firewall-cmd --reload + ``` -Il vhost predefinito dovrebbe funzionare subito. PHP fornisce una funzione `phpinfo()` che genera una tabella riassuntiva della sua configurazione. È molto utile per testare il buon funzionamento di PHP. Tuttavia, fate attenzione a non lasciare tali file di prova sui vostri server. Rappresentano un enorme rischio per la sicurezza della vostra infrastruttura. +Il vhost predefinito dovrebbe funzionare subito. PHP fornisce una funzione `phpinfo()` che genera una tabella riassuntiva della sua configurazione. È molto utile per verificare il buon funzionamento di PHP. Tuttavia, fate attenzione a non lasciare tali file di prova sui vostri server. Rappresentano un enorme rischio per la sicurezza della vostra infrastruttura. -Creare il file `/var/www/html/info.php` (`/var/www/html` è la cartella vhost della configurazione predefinita di apache): +Creare il file `/var/www/html/info.php` (`/var/www/html` è la cartella vhost della configurazione predefinita di Apache): ```bash ``` -Utilizzare un browser web per verificare il corretto funzionamento del server accedendo alla pagina [http://your-server-ip/info.php](http://your-server-ip/info.php). +Utilizzate un browser web per verificare il corretto funzionamento del server accedendo alla pagina [http://your-server-ip/info.php](http://your-server-ip/info.php). -!!! Warning "Attenzione" +!!! Warning - Non lasciare il file info.php sul vostro server! + Non lasciare il file info.php sul server! ## PHP-FPM (FastCGI) @@ -168,8 +247,7 @@ sudo dnf install php-fpm Poiché php-fpm è un servizio per il sistema, deve essere attivato e avviato: ```bash -sudo systemctl enable php-fpm -sudo systemctl start php-fpm +sudo systemctl enable --now php-fpm sudo systemctl status php-fpm ``` @@ -185,13 +263,13 @@ error_log = /var/log/php-fpm/error.log daemonize = yes ``` -!!! Note "Nota" +!!! Note - I file di configurazione php-fpm sono ampiamente commentati. Andate a dare un'occhiata! + I file di configurazione di php-fpm sono ampiamente commentati. Andate a dare un'occhiata! -Come si può vedere, i file della cartella `/etc/php-fpm/` con estensione `.conf` sono sempre inclusi. +Come si può vedere, i file della cartella `/etc/php-fpm.d/` con estensione `.conf` sono sempre inclusi. -Per impostazione predefinita, un pool di processi PHP, chiamato `www`, è definito in `/etc/php-fpm.d/www.conf`. +Per impostazione predefinita, un pool di processi PHP, denominato `www`, è dichiarato in `/etc/php-fpm.d/www.conf`. ```bash [www] @@ -224,7 +302,7 @@ php_value[soap.wsdl_cache_dir] = /var/lib/php/wsdlcache #### Configurazione del modo di accedere ai processi di php-fpm -Configurazione del modo di accedere ai processi di php-fpm. +Ci sono due modi per connettersi. Tramite un'interfaccia inet come: @@ -234,11 +312,11 @@ O tramite un socket Unix: `listen = /run/php-fpm/www.sock`. -!!! Note "Nota" +!!! Note Utilizzando un socket quando il server web e il server PHP si trovano sulla stessa macchina, si elimina il livello TCP/IP e si ottimizzano le prestazioni. -Quando si opera tramite un'interfaccia, è necessario configurare `listen.owner`, `listen.group`, `listen.mode` per specificare il proprietario, il gruppo di proprietari e i diritti del socket Unix. **Attenzione:** entrambi i server (web e PHP) devono avere i diritti di accesso al socket. +Quando si lavora tramite un'interfaccia, è necessario configurare `listen.owner`, `listen.group`, `listen.mode` per specificare il proprietario, il gruppo di proprietari e i diritti del socket Unix. **Attenzione:** Entrambi i server (web e PHP) devono avere i diritti di accesso al socket. Quando si lavora tramite un socket, è necessario configurare `listen.allowed_clients` per limitare l'accesso al server PHP a determinati indirizzi IP. @@ -257,7 +335,7 @@ pm.max_children = 10 Questa configurazione avvierà 10 processi. -In modalità dinamica, PHP-FPM lancerà al massimo il numero di processi specificato dal valore di `pm.max_children`, iniziando a lanciare un numero di processi corrispondente a `pm.start_servers`, e mantenendo almeno il valore di `pm.min_spare_servers` di processi inattivi e al massimo `pm.max_spare_servers` di processi inattivi. +In modalità dinamica, PHP-FPM avvierà al massimo il numero di processi specificato dal valore di `pm.max_children`, iniziando ad avviare alcuni processi corrispondenti a `pm.start_servers` e mantenendo almeno il valore di `pm.min_spare_servers` dei processi inattivi e al massimo ` pm.max_spare_servers` dei processi inattivi. Esempio: @@ -269,21 +347,21 @@ pm.min_spare_servers = 1 pm.max_spare_servers = 3 ``` -PHP-FPM creerà un nuovo processo per sostituire quello che ha elaborato un numero di richieste equivalente a `pm.max_requests`. +PHP-FPM creerà un nuovo processo per sostituire quello che ha elaborato più richieste equivalenti a `pm.max_requests`. -Per impostazione predefinita, `pm.max_requests` è impostato a 0, il che significa che i processi non vengono mai riciclati. L'uso dell'opzione `pm.max_requests` può essere interessante per applicazioni con problemi di memoria. +Per impostazione predefinita, `pm.max_requests` è impostato su 0, il che significa che i processi non vengono mai riciclati. L'uso dell'opzione `pm.max_requests` può essere interessante per le applicazioni con perdite di memoria. -C'è una terza modalità di funzionamento, la modalità `ondemand`. Questa modalità avvia un processo solo quando riceve una richiesta. Non è una modalità ottimale per i siti con forti pressioni e deve essere riservata a esigenze specifiche (siti con richieste molto deboli, backend di gestione, ecc.). +Esiste una terza modalità di funzionamento, quella `ondemand`. Questa modalità avvia un processo solo quando riceve una richiesta. Non è una modalità ottimale per i siti con forti influenze e deve essere riservata a esigenze specifiche (siti con richieste molto deboli, backend di gestione, ecc.). -!!! Note "Nota" +!!! Note - La configurazione della modalità operativa di PHP-FPM è essenziale per garantire un funzionamento ottimale del server web. + La configurazione della modalità operativa di PHP-FPM è essenziale per garantire il funzionamento ottimale del server web. #### Stato del processo PHP-FPM offre, come Apache e il suo modulo `mod_status`, una pagina che indica lo stato del processo. -Per attivare la pagina, impostare il suo percorso di accesso tramite la direttiva `pm.status_path`: +Per attivare la pagina, impostare il suo percorso di accesso tramite la direttiva `pm.status_path:`: ```bash pm.status_path = /status @@ -309,7 +387,7 @@ slow requests: 0 #### Registrazione di richieste lunghe -La direttiva slowlog specifica il file che riceve la registrazione delle richieste troppo lunghe (cioè, il cui tempo supera il valore della direttiva `request_slowlog_timeout`). +La direttiva slowlog specifica il file che riceve la registrazione delle richieste troppo lunghe (cioè il cui tempo supera il valore della direttiva `request_slowlog_timeout`). La posizione predefinita del file generato è `/var/log/php-fpm/www-slow.log`. @@ -354,7 +432,7 @@ fastcgi_param SERVER_NAME $server_name; fastcgi_param REDIRECT_STATUS 200; ``` -Affinché nginx possa elaborare i file `.php`, le seguenti direttive devono essere aggiunte al file di configurazione del sito: +Affinché nginx possa elaborare i file `.php`, è necessario aggiungere le seguenti direttive al file di configurazione del sito: Se PHP-FPM è in ascolto sulla porta 9000: @@ -376,7 +454,7 @@ location ~ \.php$ { ### Integrazione con Apache -La configurazione di apache per utilizzare un pool PHP è abbastanza semplice. È sufficiente usare i moduli proxy con una direttiva `ProxyPassMatch`, per esempio: +La configurazione di apache per utilizzare un pool PHP è abbastanza semplice. È necessario utilizzare i moduli proxy con una direttiva `ProxyPassMatch`, ad esempio: ```bash @@ -398,19 +476,19 @@ La configurazione di apache per utilizzare un pool PHP è abbastanza semplice. È essenziale ottimizzare il numero di richieste che potranno essere servite e analizzare la memoria utilizzata dagli script PHP, per ottimizzare la quantità massima di thread lanciati. -Prima di tutto, dobbiamo conoscere la quantità media di memoria utilizzata da un processo PHP, con il comando: +Prima di tutto, dobbiamo conoscere la quantità media di memoria utilizzata da un processo PHP con il comando: ```bash while true; do ps --no-headers -o "rss,cmd" -C php-fpm | grep "pool www" | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"Mb") }' >> avg_php_proc; sleep 60; done ``` -Dopo un po' di tempo, questo dovrebbe darci un'idea abbastanza precisa dell'occupazione media di memoria di un processo PHP su questo server. +Dopo un po' di tempo, questo dovrebbe darci un'idea abbastanza precisa dell'ingombro medio della memoria di un processo PHP su questo server. -Per il resto di questo documento, diciamo che il risultato è un'impronta di memoria di 120 Mb per processo a pieno carico. +Il risultato riportato nel resto del documento è un ingombro di memoria pari a 120 Mb per processo a pieno carico. Su un server con 8 Gb di RAM, mantenendo 1 Gb per il sistema e 1 Gb per la OPCache (si veda il resto di questo documento), rimangono 6 Gb per elaborare le richieste PHP dei client. -Si può facilmente concludere che questo server può accettare al massimo **50 thread** `((6*1024) / 120)`. +Possiamo facilmente concludere che questo server può accettare al massimo **50 thread** ( `(6*1024) / 120)`. Una buona configurazione di `php-fpm` specifica per questo caso d'uso sarebbe: @@ -435,9 +513,9 @@ L'`opcache` (Optimizer Plus Cache) è il primo livello di cache su cui possiamo Mantiene gli script PHP compilati in memoria, il che ha un forte impatto sull'esecuzione delle pagine web (elimina la lettura su disco degli script + il tempo di compilazione). -Per configurarla, dobbiamo lavorare su: +Per configurarlo, dobbiamo lavorare su: -* La dimensione della memoria dedicata alla opcache in base alla percentuale di successo, configurandola in modo corretto +* La dimensione della memoria dedicata alla opcache in base all'hit ratio, configurandola correttamente * il numero di script PHP da memorizzare nella cache (numero di chiavi + numero massimo di script) * il numero di stringhe da mettere in cache @@ -447,7 +525,7 @@ Per installarla: sudo dnf install php-opcache ``` -Per configurarla, modificare il file di configurazione `/etc/php.d/10-opcache.ini`: +Per configurarlo, modificare il file di configurazione `/etc/php.d/10-opcache.ini`: ```bash opcache.memory_consumption=128 @@ -457,16 +535,16 @@ opcache.max_accelerated_files=4000 dove: -* `opcache.memory_consumption` corrisponde alla quantità di memoria necessaria per l'opcache (da aumentare fino a ottenere un corretto rapporto di successo). +* `opcache.memory_consumption` corrisponde alla quantità di memoria necessaria per l'opcache (da aumentare fino a ottenere un rapporto di hit corretto). * `opcache.interned_strings_buffer` la quantità di stringhe da mettere in cache. * `opcache.max_accelerated_files` è prossimo al risultato del comando `find ./ -iname "*.php"|wc -l`. -Si può fare riferimento a una pagina `info.php` (compresa la funzione `phpinfo();`) per configurare l'opcache (vedi per esempio i valori di `Cached scripts` e `Cached strings`). +Si può fare riferimento a una pagina `info.php` (compresa la `phpinfo();`) per configurare l'opcache (si vedano ad esempio i valori di `Cached scripts` e `Cached strings`). -!!! Note "Nota" +!!! Note A ogni nuova distribuzione di nuovo codice, sarà necessario svuotare la opcache (ad esempio riavviando il processo php-fpm). -!!! Note "Nota" +!!! Note Non sottovalutate il guadagno di velocità che si può ottenere impostando e configurando correttamente l'opcache. From b1544a6d7bbfc9b6282fd34e4ce827e7165e61ba Mon Sep 17 00:00:00 2001 From: Neel Chauhan Date: Sun, 27 Jul 2025 09:16:16 -0400 Subject: [PATCH 080/164] `tailscale_vpn.md`: Update for Rocky 10 (#2801) --- docs/guides/security/tailscale_vpn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/security/tailscale_vpn.md b/docs/guides/security/tailscale_vpn.md index 13fec43dac..b7d3f7b789 100644 --- a/docs/guides/security/tailscale_vpn.md +++ b/docs/guides/security/tailscale_vpn.md @@ -25,7 +25,7 @@ The following are minimum requirements for using this procedure: ## Installing Tailscale -To install Tailscale, we first need to add its `dnf` repository (note: if you are using Rocky Linux 8.x, substitute in 8): +To install Tailscale, we first need to add its `dnf` repository (note: if you are using Rocky Linux 8.x or 10.x, substitute in 8 or 10 respectively): ```bash dnf config-manager --add-repo https://pkgs.tailscale.com/stable/rhel/9/tailscale.repo From 7573f230d09cc8fee5b6b9a975ecf51a4aab0ab4 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 28 Jul 2025 06:25:45 -0700 Subject: [PATCH 081/164] New Crowdin updates (#2802) * New translations anacron.md (German) * New translations tailscale_vpn.md (Italian) * New translations installation.md (Italian) * New translations 10_0.md (Italian) * New translations introduction.md (Italian) --- docs/guides/automation/anacron.de.md | 10 +- docs/guides/installation.it.md | 190 +++++++++++------------ docs/guides/security/tailscale_vpn.it.md | 2 +- docs/labs/security/introduction.it.md | 2 +- docs/release_notes/10_0.it.md | 4 +- 5 files changed, 101 insertions(+), 107 deletions(-) diff --git a/docs/guides/automation/anacron.de.md b/docs/guides/automation/anacron.de.md index 171d7b056c..a0caa96ded 100644 --- a/docs/guides/automation/anacron.de.md +++ b/docs/guides/automation/anacron.de.md @@ -106,10 +106,10 @@ Lasst uns cron.daily anschauen, um den Ausführungsprozess von /etc/anacrontab z Verwenden Sie den Befehl `anacron`,
häufig verwendete Optionen sind: -| Option | Beschreibung | -| ------ | ------------------------------------------------------------------------------------- | -| -f | Alle Jobs ausführen und Zeitstempel ignorieren | -| -u | Den Zeitstempel auf die aktuelle Uhrzeit aktualisieren ohne eine Aktion durchzuführen | -| -T | Die Gültigkeit der Konfigurationsdatei /etc/anacrontab überprüfen | +| Optionen | Beschreibung | +| -------- | ------------------------------------------------------------------------------------- | +| -f | Alle Jobs ausführen und Zeitstempel ignorieren | +| -u | Den Zeitstempel auf die aktuelle Uhrzeit aktualisieren ohne eine Aktion durchzuführen | +| -T | Die Gültigkeit der Konfigurationsdatei /etc/anacrontab überprüfen | Weitere Informationen erhalten Sie [auf der Handbuch-Seite](https://man7.org/linux/man-pages/man8/anacron.8.html) diff --git a/docs/guides/installation.it.md b/docs/guides/installation.it.md index 61c2bcb9d0..61080d1b80 100644 --- a/docs/guides/installation.it.md +++ b/docs/guides/installation.it.md @@ -1,10 +1,10 @@ --- -Title: Installazione di Rocky Linux 9 +Title: Installazione di Rocky Linux 10 author: Wale Soyinka -contributors: Steven Spencer, Ganna Zhyrnova +contributors: --- -# Installazione di Rocky Linux 9 +# Installazione di Rocky Linux 10 Questa è una guida dettagliata per l'installazione di una versione a 64 bit della distribuzione Rocky Linux su un sistema standalone. Verrà eseguita un'installazione di classe server. Nelle sezioni seguenti verranno illustrate le fasi di installazione e personalizzazione. @@ -13,82 +13,80 @@ Questa è una guida dettagliata per l'installazione di una versione a 64 bit del Scaricare la ISO da utilizzare per questa installazione di Rocky Linux. È possibile scaricare l'ultima immagine ISO della versione di Rocky Linux per questa installazione qui: -``` -https://www.rockylinux.org/download/ -``` + Per scaricare l'ISO direttamente dalla riga di comando su un sistema Linux esistente, utilizzare il comando `wget`: -``` -wget https://download.rockylinux.org/pub/rocky/9/isos/x86_64/Rocky-9.3-x86_64-minimal.iso +```bash +wget https://download.rockylinux.org/pub/rocky/10/isos/x86_64/Rocky-10.0-x86_64-minimal.iso ``` Le ISO di Rocky Linux seguono questa convenzione di denominazione: -``` +```text Rocky-.--.iso ``` -Ad esempio, `Rocky-9.3-x86_64-minimal.iso` +For example, `Rocky-10.0-x86_64-minimal.iso` -!!! Note "Nota" +!!! Note - La pagina web del progetto Rocky elenca diversi mirror, situati in tutto il mondo. Scegliete il mirror geograficamente più vicino a voi. L'elenco dei mirror ufficiali è disponibile [qui] (https://mirrors.rockylinux.org/mirrormanager/mirrors). + Il sito web del Progetto Rocky elenca diversi mirror situati in tutto il mondo. Scegliete il mirror geograficamente più vicino a voi. La lista dei mirror ufficiali può essere trovata [quì](https://mirrors.rockylinux.org/mirrormanager/mirrors). ## Verifica del file ISO del Programma di Installazione -Se avete scaricato le ISO di Rocky Linux su una distribuzione Linux esistente, potete usare l'utility `sha256sum` per verificare che i file scaricati non siano corrotti. Mostreremo un esempio di come verificare il file `Rocky-9.3-x86_64-minimal.iso` controllando il suo checksum. +Se avete scaricato le ISO di Rocky Linux su una distribuzione Linux esistente, potete usare l'utility `sha256sum` per verificare che i file scaricati non siano corrotti. Mostreremo un esempio di come verificare il file `Rocky-10.0-x86_64-minimal.iso` controllando il suo checksum. 1. Scaricate il file che contiene le checksum ufficiali delle ISO disponibili. 1. Mentre vi trovate ancora nella cartella che contiene l'ISO di Rocky Linux scaricata, scaricare il file di checksum dell'ISO, digitando: - ``` - wget -O CHECKSUM https://download.rockylinux.org/pub/rocky/9.3/isos/x86_64/CHECKSUM + ```bash + wget -O CHECKSUM https://download.rockylinux.org/pub/rocky/10/isos/x86_64/CHECKSUM ``` 1. Utilizzare l'utilità `sha256sum` per verificare l'integrità del file ISO contro la corruzione o la manomissione. - ``` + ```bash sha256sum -c CHECKSUM --ignore-missing ``` Controlla l'integrità del file ISO scaricato in precedenza, a condizione che si trovi nella stessa directory. L'output dovrebbe mostrare: - ``` - Rocky-9.3-x86_64-minimal.iso: OK + ```text + Rocky-10.0-x86_64-minimal.iso: OK ``` ## L'installazione -!!! Tip "Suggerimento" - - Prima di iniziare l'installazione vera e propria, la Unified Extensible Firmware Interface (UEFI) o il Basic Input/Output System (BIOS) del sistema devono essere preconfigurati per l'avvio dal supporto corretto. +!!! Tip -Se il computer è impostato per l'avvio dal supporto che contiene il file ISO, possiamo iniziare il processo di installazione. + Prima di iniziare l'installazione, accertarsi che l'interfaccia UEFI (Unified Extensible Firmware Interface) o il BIOS (Basic Input/Output System) del sistema siano configurati correttamente per l'avvio dal supporto corretto. + Inoltre, assicuratevi di leggere le note sui [requisiti hardware minimi] (minimum_hardware_requirements.md) raccomandati per l'esecuzione di Rocky Linux 10. -1. Inserire e avviare il supporto di installazione (disco ottico, unità flash USB e così via). +Una volta impostato il sistema per l'avvio dal supporto con il file ISO, si può iniziare l'installazione. -1. Una volta avviato il computer, viene visualizzata la schermata di benvenuto di Rocky Linux 9. +1. Inserire e avviare il supporto di installazione (ad esempio, disco ottico, unità flash USB). - ![Schermata di avvio dell'installazione Rocky Linux](images/install_9_3_01.png) +2. Una volta avviato il computer, viene visualizzata la schermata di benvenuto di Rocky Linux 10. -1. Se non si preme alcun tasto, il programma di installazione avvia un conto alla rovescia, al termine del quale il processo di installazione esegue automaticamente l'opzione predefinita, evidenziata: + ![Schermata di avvio dell'installazione Rocky Linux](images/installation_10_0_F01.png) - `Test this media & install Rocky Linux 9.3` +3. Nella schermata di benvenuto, è possibile utilizzare i tasti freccia ++“su ”++ o ++“giù ”++ per selezionare una delle opzioni, quindi premere ++enter++ per eseguire l'opzione selezionata. Se non si preme alcun tasto, il programma di installazione avvia un conto alla rovescia, al termine del quale il processo di installazione esegue automaticamente l'opzione predefinita, evidenziata: - È anche possibile premere Invio in qualsiasi momento per avviare immediatamente il processo. + `Test this media & install Rocky Linux 10.0` -1. Viene eseguita una rapida fase di verifica dei supporti. +4. Viene eseguita una rapida fase di verifica dei supporti. + Questa fase di verifica del supporto può evitare di avviare l'installazione per poi scoprire a metà strada che il programma di installazione deve essere interrotto a causa di un supporto di installazione difettoso. -1. Dopo che la verifica del supporto è stata completata e il supporto è stato verificato come utilizzabile, il programma di installazione passa automaticamente alla schermata successiva. +1. Una volta completato il controllo del supporto e verificata la sua utilizzabilità, il programma di installazione passa automaticamente alla schermata successiva. -1. In questa schermata è possibile selezionare la lingua che si desidera utilizzare per eseguire l'installazione. Per questa guida, selezioniamo l'*inglese (Stati Uniti)*. Quindi fare clic sul pulsante Continue. +2. Selezionare la lingua che si desidera utilizzare per l'installazione di questa schermata. Per questa guida, selezioniamo l'*inglese (Stati Uniti)*. Quindi fare clic sul pulsante ++"continue "++. ## Riepilogo dell'installazione -La schermata *Installation Summary* è un'area completa in cui si prendono le decisioni importanti sul sistema da installare. +La schermata `Riepilogo installazione` è un'area completa in cui si prendono le decisioni chiave sull'installazione del sistema. La schermata è suddivisa grossomodo nelle seguenti sezioni: @@ -101,104 +99,104 @@ In seguito approfondiremo ciascuna di queste sezioni e apporteremo le modifiche ### Sezione Localizzazione -Questa sezione è utilizzata per personalizzare le voci relative alla località geografica del sistema. Tra questi: tastiera, supporto della lingua, ora e data. +Questa sezione consente di personalizzare le voci relative alla posizione geografica del sistema. Tra questi: tastiera, supporto della lingua, ora e data. #### Tastiera -Nel nostro sistema demo di questa guida, accettiamo il valore predefinito*(English US*) e non apportiamo alcuna modifica. +Nel sistema demo di questa guida, accettiamo il valore predefinito*(English US*) e non apportiamo alcuna modifica. -Tuttavia, se è necessario apportare delle modifiche, dalla schermata *Installation Summary*, facendo clic sull'opzione Keyboard si specifica il layout della tastiera del sistema. Con il pulsante + è possibile aggiungere altri layout di tastiera, se necessario, nella schermata successiva, specificando anche l'ordine preferito. +Tuttavia, se è necessario apportare modifiche, dalla schermata *Riepilogo dell'installazione*, fare clic sull'opzione ++“tastiera”++ per specificare il layout della tastiera del sistema. Con il pulsante ++plus++ è possibile aggiungere e ordinare altri layout di tastiera, se necessario. -Al termine di questa schermata, fare clic su Done. +Al termine di questa schermata, fare clic su ++"done"++. #### Supporto linguistico -L'opzione Language Support nella schermata *Installation Summary* consente di specificare il supporto per altre lingue. +L'opzione `Language Support` nella schermata *Installation Summary* consente di specificare il supporto per altre lingue. -Accetteremo il valore predefinito - **English (United States)** e non apporteremo alcuna modifica; fare clic su Done. +Accetteremo il valore predefinito - **English (United States)** e non apporteremo alcuna modifica, facendo clic su ++“done”++. #### Data & Ora; -Fare clic sull'opzione Time & Date nella schermata principale di *Installation Summary* per visualizzare un'altra schermata che consente di selezionare il fuso orario in cui si trova la macchina. Scorrete l'elenco delle regioni e delle città e selezionate l'area più vicina a voi. +Fare clic sull'opzione ++“Ora & data”++ nella schermata principale *Installation Summary* per visualizzare un'altra schermata che consentirà di selezionare il fuso orario in cui si trova la macchina. Utilizzate le frecce a discesa per selezionare la regione e la città più vicina a voi. -A seconda della fonte di installazione, l'opzione *Network Time* può essere impostata di default su *ON* o *OFF*. Accettare l'impostazione predefinita *ON*; ciò consente al sistema di impostare automaticamente l'ora corretta utilizzando il Network Time Protocol (NTP). +Accettare l'impostazione predefinita e attivare l'opzione ++“Data & ora automatiche”++, che consente al sistema di impostare automaticamente la data e l'ora corrette utilizzando il Network Time Protocol (NTP). -Fare clic su Done dopo aver apportato le modifiche. +Al termine, fare clic su ++“done”++. ### Sezione software -Nella sezione *Software* della schermata *Installation Summary*, è possibile selezionare o modificare l'origine dell'installazione e i pacchetti aggiuntivi (applicazioni) che vengono installati. +Nella sezione *Software* della schermata *Riepilogo installazione*, è possibile selezionare o modificare l'origine dell'installazione e aggiungere ulteriori pacchetti software per l'ambiente selezionato. #### Fonte dell'installazione -Poiché l'installazione utilizza un'immagine ISO di Rocky Linux 9, si noterà che il *Local Media* è specificato automaticamente nella sezione Origine dell'installazione della schermata principale di *Installation Summary*. È possibile accettare le impostazioni predefinite. +Poiché stiamo usando un'immagine ISO di Rocky Linux 10 per l'installazione, l'opzione Auto-detected source è selezionata per impostazione predefinita. Accettare la sorgente di installazione predefinita. -!!! Tip "Suggerimento" +!!! Tip - Nell'area installation Source è possibile scegliere di eseguire un'installazione basata sulla rete (ad esempio se si utilizza la ISO di avvio di Rocky Linux - Rocky-9.3-x86_64-boot.iso). Per un'installazione basata sulla rete, è necessario innanzitutto assicurarsi che una scheda di rete sul sistema di destinazione sia configurata correttamente e sia in grado di raggiungere Internet. Per eseguire un'installazione dalla rete, fare clic su `Installation Source` e selezionare il pulsante di opzione `On the network`. Una volta selezionato, scegliete `https' come protocollo e digitate il seguente URL nel campo di testo `download.rockylinux.org/pub/rocky/9/BaseOS/x86_64/os`. Fare clic su "Done". + L'area Sorgente di installazione consente di eseguire un'installazione basata sulla rete (ad esempio, se si utilizza la ISO di avvio di Rocky Linux - Rocky-10.0-x86_64-boot.iso). Per un'installazione basata sulla rete, è necessario innanzitutto assicurarsi che una scheda di rete sul sistema di destinazione sia configurata correttamente e sia in grado di raggiungere Internet. Per eseguire un'installazione dalla rete, fare clic su `Installation Source` e selezionare il pulsante di opzione `On the network`. Una volta selezionato, scegliete `https' come protocollo e digitate il seguente URL nel campo di testo `download.rockylinux.org/pub/rocky/9/BaseOS/x86_64/os`. Fare clic su `Done`. #### Selezione del software -Facendo clic sull'opzione Software Selection nella schermata principale di *Installation Summary*, si accede alla sezione dell'installazione in cui è possibile scegliere i pacchetti software esatti da installare sul sistema. L'area di selezione del software è suddivisa in : +Facendo clic sull'opzione ++“Software Selection”++ nella schermata principale *Installation Summary*, viene visualizzata un'area di selezione del software composta da due sezioni: -- **Base Environment**: Installazione minima e sistema operativo personalizzato -- **Additional software for Selected Environment**: la selezione di un ambiente di base sul lato sinistro presenta una serie di software aggiuntivi da installare per l'ambiente in questione sul lato destro. Si noti che questo è applicabile solo se si sta installando da un DVD completo di Rocky Linux 9.2 o se sono stati configurati repository aggiuntivi. +- **Base Environment**: Installazione minima +- **Additional software for Selected Environment**: Selezionando Base Environment sul lato sinistro presenta una selezione di software aggiuntivi da installare per l'ambiente in questione sul lato destro. Selezionare l'opzione *Minimal Install* (funzionalità di base). -Cliccate su Done nella parte superiore della schermata. +Fare clic su ++"done"++ nella parte superiore dello schermo. ### Sezione Sistema -La sezione System della schermata *Installation Summary* viene utilizzata per personalizzare e apportare modifiche all'hardware sottostante del sistema di destinazione. Qui si creano le partizioni o i volumi del disco rigido, si specifica il file system, la configurazione di rete, si attiva o disattiva KDUMP o si seleziona un profilo di sicurezza. +Utilizzare la sezione Sistema della schermata *Riepilogo installazione* per personalizzare e apportare modifiche all'hardware del sistema di destinazione. Qui si creano le partizioni o i volumi del disco rigido, si specifica il file system, si specifica la configurazione di rete e si attiva o disattiva KDUMP. #### Destinazione dell'installazione -Dalla schermata *Installation Summary*, fare clic sull'opzione Installation Destination. Si accede così all'area operativa corrispondente. +Nella schermata *Installation Summary*, fare clic sull'opzione ++“Installation Destination"++ . Si accede così all'area operativa corrispondente. -Verrà visualizzata una schermata con tutte le unità disco candidate disponibili sul sistema di destinazione. Se nel sistema è presente una sola unità disco, come nel nostro sistema campione, l'unità viene elencata sotto *Local Standard Disks* con un segno di spunta accanto. Facendo clic sull'icona del disco si attiva o disattiva il segno di spunta della selezione del disco. Mantenere la spunta per selezionare il disco. +Verrà visualizzata una schermata con tutte le unità disco candidate disponibili sul sistema di destinazione. Se nel sistema è presente una sola unità disco, come nel nostro sistema campione, l'unità viene elencata sotto *Dischi standard locali* con un segno di spunta accanto. Facendo clic sull'icona del disco si attiva o disattiva il segno di spunta della selezione del disco. Mantenere il segno di spunta per selezionare il disco. Nella sezione *Storage Configuration*: -1. Selezionare il pulsante di opzione Automatic. +1. Selezionare il pulsante di opzione ++"Automatic"++. -2. Cliccate su Done nella parte superiore della schermata. +2. Fare clic su ++"done"++ nella parte superiore dello schermo. 3. Una volta accertato che il disco è utilizzabile, il programma di installazione torna alla schermata di *Installation Summary*. ### Network & Nome host -Il prossimo compito importante della procedura di installazione nell'area Sistema riguarda la configurazione di rete, dove è possibile configurare o modificare le impostazioni relative alla rete del sistema. +Il seguente compito importante nella procedura di installazione nell'area Sistema riguarda la configurazione di rete, dove è possibile configurare o regolare le impostazioni relative alla rete per il sistema. -!!! Note "Nota" +!!! Note - Dopo aver fatto clic sull'opzione Network & Hostname, tutto l'hardware dell'interfaccia di rete correttamente rilevato (come schede di rete Ethernet, wireless e così via) sarà elencato nel riquadro sinistro della schermata di configurazione della rete. A seconda della configurazione hardware specifica, i dispositivi Ethernet in Linux hanno nomi simili a `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3` e così via. - Per ogni interfaccia è possibile configurarla utilizzando il DHCP o impostando manualmente l'indirizzo IP. - Se si sceglie di configurare manualmente, assicurarsi di avere pronte tutte le informazioni necessarie, come l'indirizzo IP, la netmask e così via. + Dopo aver fatto clic sull'opzione ++“Network & Host Name"++ , nel riquadro sinistro della schermata di configurazione della rete viene elencato tutto l'hardware dell'interfaccia di rete correttamente rilevato (ad esempio schede di rete Ethernet, wireless e così via). A seconda della configurazione hardware specifica, i dispositivi Ethernet in Linux hanno nomi simili a `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3` e così via. + È possibile configurare ogni interfaccia tramite DHCP o impostare manualmente l'indirizzo IP. + Se si sceglie di configurare manualmente, assicurarsi di avere pronte tutte le informazioni necessarie, come l'indirizzo IP, la netmask e altri dettagli rilevanti. -Facendo clic sul pulsante Network & Hostname nella schermata principale di *Installation Summary*, si apre la schermata di configurazione corrispondente. Tra le altre cose, è possibile configurare l'hostname del sistema. +Facendo clic sul pulsante ++“Network & Host Name”++ nella schermata principale *Installation Summary* si apre la schermata di configurazione corrispondente. Qui è possibile configurare anche l'hostname del sistema. -!!! Note "Nota" +!!! Note È possibile modificare facilmente l'hostname del sistema in un secondo momento, dopo l'installazione del sistema operativo. -La prossima importante operazione di configurazione riguarda le interfacce di rete del sistema. +La seguente attività di configurazione riguarda le interfacce di rete del sistema. -1. Verificare che nel riquadro di sinistra sia elencata una scheda Ethernet (o qualsiasi altra scheda di rete) -2. Fare clic su uno dei dispositivi di rete rilevati nel riquadro sinistro per selezionarlo. +1. Verificare che nel riquadro di sinistra sia elencato un adattatore/scheda di rete +2. Fare clic su uno qualsiasi dei dispositivi di rete rilevati nel riquadro di sinistra per selezionarlo. Le proprietà configurabili dell'adattatore di rete selezionato appaiono nel riquadro destro della schermata. -!!! Note "Nota" +!!! Note - Nel nostro sistema campione, abbiamo due dispositivi Ethernet (`ens3` e `ens4`), tutti in stato di connessione. Il tipo, il nome, la quantità e lo stato dei dispositivi di rete presenti nel sistema potrebbero variare rispetto a quelli presenti nel nostro sistema demo. + Nel nostro sistema campione, abbiamo due dispositivi Ethernet (`ens3` e `ens4`), entrambi in stato di connessione. Il tipo, il nome, la quantità e lo stato dei dispositivi di rete presenti sul vostro sistema possono differire da quelli presenti sul nostro sistema demo. -Verify the switch of the device you want to configure is flipped to the `ON` (blue) position in the right pane. In questa sezione verranno accettate tutte le impostazioni predefinite. +Verify that the switch of the device you want to configure is in the `ON` (blue) position in the right pane. Accetteremo tutte le impostazioni predefinite in questa sezione. -Fare clic su Done per tornare alla schermata principale di *Installation Summary*. +Fare clic su ++“done”++ per tornare alla schermata principale *Installation Summary*. !!! Warning "Attenzione" - Prestare attenzione all'indirizzo IP del server in questa sezione del programma di installazione. Se non si dispone di un accesso fisico o facile alla console del sistema, queste informazioni saranno utili in seguito, quando sarà necessario collegarsi al server per continuare a lavorarci dopo il completamento dell'installazione del sistema operativo. + Prestare attenzione all'indirizzo IP del server in questa sezione del programma di installazione. Se non si dispone di un accesso fisico o facile alla console del sistema, queste informazioni saranno utili in seguito, quando sarà necessario connettersi al server al termine dell'installazione del sistema operativo. ### Sezione Impostazioni utente @@ -206,77 +204,73 @@ Questa sezione può essere utilizzata per creare una password per l'account uten #### Password Root -1. Fare clic sul campo *Root Password* in *User Settings* per avviare la schermata dell'attività *Root Password*. +1. Fare clic sul campo *Root Password* in *Impostazioni utente* per avviare la schermata dell'attività *Account di root*. !!! Warning "Attenzione" - Il superutente root è l'account più privilegiato del sistema. Pertanto, se si sceglie di utilizzarlo o di abilitarlo, è fondamentale proteggere questo account con una password forte. - -1. Nella casella di testo *Root Password*, impostare una password forte per l'utente root. + Il superutente root è l'account più privilegiato del sistema. Se si sceglie di utilizzarlo o di abilitarlo, è necessario proteggere questo account con una password forte. -1. Immettere nuovamente la stessa password nella casella di testo *Confirm*. - -1. Fare clic su Done. +2. Verranno visualizzate due opzioni: “Disable root account" oppure "Enable root account". Accettare l'opzioni di default +3. Fare clic su ++"done"++. #### Creazione dell'utente Per creare un utente: -1. Fare clic sul campo *User Creation* in *User Settings* per avviare la schermata dell'attività *Create User*. - Quest'area operativa consente di creare un account utente privilegiato o non privilegiato (non amministrativo) sul sistema. +1. Fare clic sul campo *User Creation* sotto *User Settings* per avviare la schermata dell'attività *Create User*. Utilizzare quest'area operativa per creare un account utente privilegiato (amministrativo) o non privilegiato (non amministrativo). - !!! Info "Informazione" + !!! Caution - La creazione e l'uso di un account non privilegiato per le attività quotidiane di un sistema è una buona pratica di amministrazione del sistema. + Su un sistema Rocky Linux 10, l'account Root è disabilitato per impostazione predefinita; pertanto, è essenziale assicurarsi che l'account utente creato durante l'installazione del sistema operativo abbia privilegi amministrativi. Questo utente può essere utilizzato in modo non privilegiato per le attività quotidiane del sistema e avrà anche la possibilità di elevare il proprio ruolo per eseguire funzioni amministrative (root), se necessario. Creeremo un utente normale che può invocare i poteri di superutente (amministratore) quando necessario. -1. Completate i campi della schermata *Create User* con le seguenti informazioni: +2. Completate i campi della schermata *Create User* con le seguenti informazioni: - - **Full name**: `rockstar` + - **Nome completo**: `rockstar` - **Username**: `rockstar` - - **Make this user administrator**: Checked - - **Require a password to use this account**: Checked - - **Password**: `04302021` - - **Confirm password**: `04302021` + - **Aggiungere privilegi amministrativi a questo account utente (appartenenza al gruppo root)**: Spuntato + - **Richiedere una password per utilizzare questo account**: Spuntato + - **Password**: `04302021` + - **Conferma password**: `04302021` -1. Fare clic su Done. +3. Fare clic su ++"done"++. ## Fase di Installazione Una volta soddisfatti delle scelte effettuate per le varie attività di installazione, la fase successiva del processo di installazione darà inizio all'installazione vera e propria. - ### Avviare l'installazione -Una volta soddisfatti delle scelte effettuate per le varie attività di installazione, fare clic sul pulsante Begin Installation nella schermata principale di *Installation Summary*. +Una volta soddisfatti delle scelte effettuate per le varie operazioni di installazione, fare clic sul pulsante ++“Begin Installation”++ nella schermata principale *Installation Summary*. -L'installazione avrà inizio e il programma di installazione mostrerà l'avanzamento dell'installazione. Dopo l'inizio dell'installazione, inizieranno ad essere eseguite varie attività in background, come il partizionamento del disco, la formattazione delle partizioni o dei volumi LVM, la verifica e la risoluzione delle dipendenze software, la scrittura del sistema operativo sul disco e così via. +L'installazione avrà inizio e il programma di installazione mostrerà l'avanzamento dell'installazione. Dopo l'avvio dell'installazione, inizieranno ad essere eseguite varie attività in background, come il partizionamento del disco, la formattazione delle partizioni o dei volumi LVM, la verifica e la risoluzione delle dipendenze software, la scrittura del sistema operativo sul disco e altre attività simili. -!!! Note "Nota" +!!! Note - Se non si desidera continuare dopo aver fatto clic sul pulsante Inizia l'installazione, si può comunque uscire dall'installazione senza perdere i dati. Per uscire dal programma di installazione, è sufficiente resettare il sistema facendo clic sul pulsante Quit, premendo ctrl-alt-del sulla tastiera o premendo l'interruttore di reset o di alimentazione. + Se non si desidera continuare dopo aver fatto clic sul pulsante ++"Inizia l'installazione"++, è possibile uscire dall'installazione senza perdere i dati. Per uscire dal programma di installazione, è sufficiente resettare il sistema facendo clic sul pulsante Quit, premendo ctrl-alt-del sulla tastiera o premendo l'interruttore di reset o di alimentazione. ### Completare l'installazione -Al termine del programma di installazione, viene visualizzata una schermata finale di avanzamento dell'installazione con un messaggio di completamento. +Dopo che il programma di installazione ha completato il suo lavoro, verrà visualizzata una schermata finale di avanzamento dell'installazione con un messaggio di completamento. -Infine, completare l'intera procedura facendo clic sul pulsante Reboot System. Il sistema si riavvia. +Infine, completare l'intera procedura facendo clic sul pulsante ++“Reboot System”++. Il sistema si riavvia. ### Accedi Il sistema è ora impostato e pronto per l'uso. Verrà visualizzata la console Rocky Linux. -![Schermata di benvenuto di Rocky Linux](images/installation_9_F02.png) +![Schermata di benvenuto di Rocky Linux](images/installation_10_0_F02.png) Per accedere al sistema: -1. Digitare `rockstar` al prompt di login e premere Invio. +1. Digitare `rockstar` al prompt di login e premere ++enter++. -1. Al prompt della password, digitate `04302021` (la password di Rockstar) e premete Invio (la password ***non verrà*** visualizzata sullo schermo, è normale). +2. Al prompt della password, digitate `04302021` (la password di Rockstar) e premete ++enter++ (la password ***non*** verrà riprodotta sullo schermo, è normale). -1. Eseguire il comando `whoami` dopo il login. +3. Eseguire il comando `whoami` dopo il login. + Questo comando mostra il nome dell'utente attualmente connesso. ![Schermata di accesso](images/installation_9.0_F03.png) diff --git a/docs/guides/security/tailscale_vpn.it.md b/docs/guides/security/tailscale_vpn.it.md index 70376a4f3a..0f4204ecf7 100644 --- a/docs/guides/security/tailscale_vpn.it.md +++ b/docs/guides/security/tailscale_vpn.it.md @@ -25,7 +25,7 @@ I requisiti minimi per l'utilizzo di questa procedura sono i seguenti: ## Installare Tailscale -Per installare Tailscale, è necessario aggiungere il repository `dnf` (nota: se si utilizza Rocky Linux 8.x, sostituire con 8): +Per installare Tailscale, dobbiamo prima aggiungere il suo repository `dnf` (nota: se si utilizza Rocky Linux 8.x o 10.x, sostituire rispettivamente con 8 o 10): ```bash dnf config-manager --add-repo https://pkgs.tailscale.com/stable/rhel/9/tailscale.repo diff --git a/docs/labs/security/introduction.it.md b/docs/labs/security/introduction.it.md index e1a709582e..ebd74d45e7 100644 --- a/docs/labs/security/introduction.it.md +++ b/docs/labs/security/introduction.it.md @@ -1,7 +1,7 @@ --- title: Introduzione author: Wale Soyinka -contributors: Andrew Thiesen, Franco Colussi +contributors: Andrew Thiesen tags: - introduction --- diff --git a/docs/release_notes/10_0.it.md b/docs/release_notes/10_0.it.md index 951302774b..fc92086bdc 100644 --- a/docs/release_notes/10_0.it.md +++ b/docs/release_notes/10_0.it.md @@ -222,11 +222,11 @@ La sostituzione o la rimozione di alcuni servizi e pacchetti della RL 10 compren | Rimosso | Sostituto | | :--------------------------------- | :-------------------------------------------------------------------------------------------------- | | power-profiles-daemon CPU throttle | Layer di traduzione tuned-ppd che supporta applicazioni scritte per il daemon power-profiles-daemon | -| redis in-memory key-value database | valkey (un fork di redis) in-memory key-value database ^1 | +| redis in-memory key-value database | valkey (un fork di redis) in-memory key-value database ^1 | | sendmail mail transfer agent | Rocky Linux consiglia di migrare all'agente di trasferimento della posta Postfix. | | Filtro spam per email spamassassin | Il filtro antispam spamassassin si trova ora nel repository EPEL. | -1 Oltre a `valkey`, il pacchetto `valkey-compat-redis` è presente nel repository Plus. +[^1]: **valkey**: Una fork di redis. 1 Oltre a `valkey`, il pacchetto `valkey-compat-redis` è presente nel repository Plus. ### Linguaggi di Programmazione Dinamica From 85bd81ce11dd372c53415b9358a2e8b2b83231d6 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 28 Jul 2025 13:47:30 -0700 Subject: [PATCH 082/164] New Crowdin updates (#2804) * New translations lab1-prerequisites.md (French) * New translations lab0-readme.md (French) * New translations lab0-readme.md (German) --- .../kubernetes-the-hard-way/lab0-README.de.md | 54 +++++++++++++++++++ .../kubernetes-the-hard-way/lab0-README.fr.md | 54 +++++++++++++++++++ .../lab1-prerequisites.fr.md | 2 +- 3 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 docs/labs/kubernetes-the-hard-way/lab0-README.de.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab0-README.fr.md diff --git a/docs/labs/kubernetes-the-hard-way/lab0-README.de.md b/docs/labs/kubernetes-the-hard-way/lab0-README.de.md new file mode 100644 index 0000000000..80de276dc6 --- /dev/null +++ b/docs/labs/kubernetes-the-hard-way/lab0-README.de.md @@ -0,0 +1,54 @@ +--- +title: Einleitung +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +--- + +# Kubernetes auf die harte Tour (Rocky Linux) + +!!! info + + Dies ist ein Fork des ursprünglichen ["Kubernetes the hard way"](https://github.com/kelseyhightower/kubernetes-the-hard-way), das ursprünglich von Kelsey Hightower geschrieben wurde (GitHub: kelseyhightower). Im Gegensatz zum Original, das auf Debian-ähnlichen Distributionen für die ARM64-Architektur basiert, zielt dieser Fork auf Enterprise-Linux-Distributionen wie Rocky Linux ab, das auf der x86_64-Architektur läuft. + +Dieses Tutorial führt Sie durch die anspruchsvolle Einrichtung von Kubernetes. Es ist nicht für jemanden geeignet, der nach einem vollständig automatisierten Tool zum Einrichten eines Kubernetes-Clusters sucht. `Kubernetes The Hard Way` ist zum Lernen konzipiert. Sie müssen also den langen Weg gehen, um sicherzustellen, dass Sie jede Aufgabe verstehen, die zum Bootstrapping eines Kubernetes-Clusters erforderlich ist. + +Betrachten Sie die Ergebnisse dieses Tutorials nicht als produktionsreif und es wird möglicherweise keine Unterstützung von der Community erhalten, aber lassen Sie sich dadurch nicht vom Lernen abhalten! + +## Copyright + +![Creative Commons License](images/cc_by_sa.png) + +Die Lizenzierung dieses Werks erfolgt unter einer [Creative Commons Attribution-NonCommercial-=ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-nc-sa/4.0/). + +## Zielgruppe + +Die Zielgruppe dieses Tutorials sind alle, die die Grundlagen von Kubernetes und die Zusammenarbeit der Kernkomponenten verstehen möchten. + +## Cluster-Details + +`Kubernetes The Hard Way` führt Sie durch das Bootstrapping eines einfachen Kubernetes-Clusters, bei dem alle Control-Plane-Komponenten auf einem einzelnen Knoten und zwei Worker-Knoten ausgeführt werden. Dies reicht aus, um die Kernkonzepte zu erlernen. + +Komponenten-Versionen: + +- [kubernetes](https://github.com/kubernetes/kubernetes) v1.32.x +- [containerd](https://github.com/containerd/containerd) v2.0.x +- [cni](https://github.com/containernetworking/cni) v1.6.x +- [etcd](https://github.com/etcd-io/etcd) v3.4.x + +## Labs + +Für dieses Tutorial sind vier (4) x86_64-basierte virtuelle oder physische Maschinen erforderlich, die mit demselben Netzwerk verbunden sind. Während im Tutorial x86_64-basierte Maschinen verwendet werden, können Sie die gewonnenen Erkenntnisse auf andere Plattformen anwenden. + +- [Voraussetzungen](lab1-prerequisites.md) +- [Setup der Jumpbox](lab2-jumpbox.md) +- [Provisionierung der Rechner Ressourcen](lab3-compute-resources.md) +- [Provisionierung der CA und Generierung von TLS-Zertifikate](lab4-certificate-authority.md) +- [Generierung der Kubernetes Konfigurationsdateien für die Authentifizierung](lab5-kubernetes-configuration-files.md) +- [Generierung der Data Encryption Konfiguration und Schlüssel](lab6-data-encryption-keys.md) +- [Bootstrapping vom etcd-Cluster](lab7-bootstrapping-etcd.md) +- [Bootstrapping the Kubernetes Control Plane](lab8-bootstrapping-kubernetes-controllers.md) +- [Bootstrapping the Kubernetes Worker Nodes](lab9-bootstrapping-kubernetes-workers.md) +- [Configuring kubectl for Remote Access](lab10-configuring-kubectl.md) +- [Provisioning Pod Network Routes](lab11-pod-network-routes.md) +- [Smoke Test](lab12-smoke-test.md) +- [Cleaning Up](lab13-cleanup.md) diff --git a/docs/labs/kubernetes-the-hard-way/lab0-README.fr.md b/docs/labs/kubernetes-the-hard-way/lab0-README.fr.md new file mode 100644 index 0000000000..92cb8e367d --- /dev/null +++ b/docs/labs/kubernetes-the-hard-way/lab0-README.fr.md @@ -0,0 +1,54 @@ +--- +title: Introduction +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +--- + +# Kubernetes The Hard Way (Rocky Linux) + +!!! info + + Il s'agit d'un fork de l'original ["Kubernetes the hard way"](https://github.com/kelseyhightower/kubernetes-the-hard-way) écrit à l'origine par Kelsey Hightower (GitHub : kelseyhightower). Contrairement à l'original, qui se base sur des distributions de type Debian pour l'architecture ARM64, ce fork cible les distributions Enterprise Linux telles que Rocky Linux, qui fonctionne sur l'architecture x86_64. + +Ce tutoriel vous guide dans la configuration de Kubernetes à la dure. Ce n’est pas pour quelqu’un qui recherche un outil entièrement automatisé pour configurer une grappe Cluster Kubernetes. `Kubernetes The Hard Way` est conçu pour l'apprentissage, cela signifie donc prendre le long chemin pour vous assurer de comprendre chaque tâche requise pour démarrer un cluster Kubernetes. + +Ne considérez pas les résultats de ce tutoriel comme prêts pour la production, et il se peut qu'il ne reçoive pas le soutien de la communauté, mais ne laissez pas cela vous empêcher d'apprendre ! + +## Droits d'auteur + +![Creative Commons License](images/cc_by_sa.png) + +La licence de cette œuvre est assujettie à cette Licence : [Creative Commons Attribution-NonCommercial-=ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-nc-sa/4.0/). + +## Audience cible + +Le public cible de ce tutoriel est toute personne souhaitant comprendre les principes fondamentaux de Kubernetes et la manière dont les composants principaux interagissent ensemble. + +## Détails du cluster + +`Kubernetes The Hard Way` vous guide à travers l'amorçage d'un cluster Kubernetes de base avec tous les composants du plan de contrôle exécutés sur un seul nœud et deux nœuds de travail, ce qui est suffisant pour apprendre les concepts de base. + +Version des composantes : + +- [kubernetes](https://github.com/kubernetes/kubernetes) v1.32.x +- [containerd](https://github.com/containerd/containerd) v2.0.x +- [cni](https://github.com/containernetworking/cni) v1.6.x +- [etcd](https://github.com/etcd-io/etcd) v3.4.x + +## Ateliers + +Ce tutoriel nécessite quatre (4) machines virtuelles ou physiques basées sur x86_64 connectées au même réseau. Bien que le tutoriel utilise des machines basées sur x86_64, vous pouvez appliquer les leçons apprises à d'autres plates-formes. + +- [Prérequis](lab1-prerequisites.md) +- [Mise en Place de Jumpbox](lab2-jumpbox.md) +- [Provisioning Compute Resources](lab3-compute-resources.md) +- [Provisioning the CA and Generating TLS Certificates](lab4-certificate-authority.md) +- [Generating Kubernetes Configuration Files for Authentication](lab5-kubernetes-configuration-files.md) +- [Generating the Data Encryption Config and Key](lab6-data-encryption-keys.md) +- [Bootstrapping the etcd Cluster](lab7-bootstrapping-etcd.md) +- [Bootstrapping the Kubernetes Control Plane](lab8-bootstrapping-kubernetes-controllers.md) +- [Bootstrapping the Kubernetes Worker Nodes](lab9-bootstrapping-kubernetes-workers.md) +- [Configuring kubectl for Remote Access](lab10-configuring-kubectl.md) +- [Provisioning Pod Network Routes](lab11-pod-network-routes.md) +- [Smoke Test](lab12-smoke-test.md) +- [Cleaning Up](lab13-cleanup.md) diff --git a/docs/labs/kubernetes-the-hard-way/lab1-prerequisites.fr.md b/docs/labs/kubernetes-the-hard-way/lab1-prerequisites.fr.md index c437b7cd72..d070fa40b0 100644 --- a/docs/labs/kubernetes-the-hard-way/lab1-prerequisites.fr.md +++ b/docs/labs/kubernetes-the-hard-way/lab1-prerequisites.fr.md @@ -17,7 +17,7 @@ Dans ce laboratoire, vous passerez en revue les exigences machine nécessaires p ## Machines virtuelles ou physiques -Ce tutoriel nécessite quatre (4) machines x86_64 virtuelles ou physiques exécutant Debian 12 (bookworm). Le tableau suivant répertorie les quatre machines et leurs exigences en matière de CPU, de mémoire et de stockage. +Ce tutoriel nécessite quatre (4) machines x86_64 virtuelles ou physiques exécutant Rocky Linux 9.5 (les conteneurs Incus ou LXD devraient également fonctionner). Le tableau suivant répertorie les quatre machines et leurs exigences en matière de CPU, de mémoire et de stockage. | Nom | Description | CPU | RAM | Stockage | | ------- | ------------------------- | --- | ------ | -------- | From 9526bced302579d9bde7287a143c579ed70acfde Mon Sep 17 00:00:00 2001 From: Neel Chauhan Date: Mon, 28 Jul 2025 23:01:59 -0400 Subject: [PATCH 083/164] New Guide: MediaWiki (#2806) --- docs/guides/cms/mediawiki.md | 252 ++++++++++++++++++++++++++++ docs/guides/images/mediawiki_1.png | Bin 0 -> 68052 bytes docs/guides/images/mediawiki_10.png | Bin 0 -> 97199 bytes docs/guides/images/mediawiki_2.png | Bin 0 -> 97380 bytes docs/guides/images/mediawiki_3.png | Bin 0 -> 224803 bytes docs/guides/images/mediawiki_4.png | Bin 0 -> 79224 bytes docs/guides/images/mediawiki_5.png | Bin 0 -> 100364 bytes docs/guides/images/mediawiki_6.png | Bin 0 -> 108025 bytes docs/guides/images/mediawiki_7.png | Bin 0 -> 103162 bytes docs/guides/images/mediawiki_8.png | Bin 0 -> 134963 bytes docs/guides/images/mediawiki_9.png | Bin 0 -> 131829 bytes 11 files changed, 252 insertions(+) create mode 100644 docs/guides/cms/mediawiki.md create mode 100644 docs/guides/images/mediawiki_1.png create mode 100644 docs/guides/images/mediawiki_10.png create mode 100644 docs/guides/images/mediawiki_2.png create mode 100644 docs/guides/images/mediawiki_3.png create mode 100644 docs/guides/images/mediawiki_4.png create mode 100644 docs/guides/images/mediawiki_5.png create mode 100644 docs/guides/images/mediawiki_6.png create mode 100644 docs/guides/images/mediawiki_7.png create mode 100644 docs/guides/images/mediawiki_8.png create mode 100644 docs/guides/images/mediawiki_9.png diff --git a/docs/guides/cms/mediawiki.md b/docs/guides/cms/mediawiki.md new file mode 100644 index 0000000000..73ac433833 --- /dev/null +++ b/docs/guides/cms/mediawiki.md @@ -0,0 +1,252 @@ +--- +title: MediaWiki +author: Neel Chauhan +contributors: +tested_with: 10.0 +tags: + - cms +--- + +## Introduction + +[MediaWiki](https://www.mediawiki.org/wiki/MediaWiki) is a popular open source Wiki software engine powering sites like Wikipedia, Fandom and wikiHow, among others. + +## Prerequisites and assumptions + +The following are the minimum requirements for using this procedure: + +* The ability to run commands as the root user or use `sudo` to elevate privileges +* Familiarity with a command-line editor. The author is using `vi` or `vim` here, but substitute in your favorite editor + +## Installing Apache + +We will use Apache as the web server. First install Apache: + +```bash +dnf -y install httpd +``` + +Next, open the corresponding firewall ports: + +```bash +sudo firewall-cmd --permanent --zone=public --add-service=http +sudo firewall-cmd --permanent --zone=public --add-service=https +sudo firewall-cmd --reload +``` + +## Installing PHP + +!!! note + + If you are running Rocky Linux 8.x or 9.x, substitute "8" or "9" next to the release in the Remi package install line. + +To install PHP, you need first to install the EPEL (Extra Packages for Enterprise Linux): + +```bash +dnf -y install epel-release && dnf -y update +``` + +You will need the Remi repository. To install the Remi repository, run the following: + +```bash +dnf install https://rpms.remirepo.net/enterprise/remi-release-10.rpm +``` + +Then install PHP and the required modules: + +```bash +dnf install -y dnf install php84-php-fpm php84-php-intl php84-php-mbstring php84-php-apcu php84-php-curl php84-php-mysql php84-php-xml +``` + +Now enable PHP: + +```bash +systemctl enable --now php84-php-fpm.service +``` + +## Installing MariaDB + +Now, we are going to install MariaDB. Install it via `dnf`: + +```bash +dnf install mariadb-server +``` + +Next enable the `systemd` service and run the setup wizard: + +```bash +systemctl enable --now mariadb +mysql_secure_installation +``` + +When asked for the root password press `Enter`: + +```bash +Enter current password for root (enter for none): +``` + +Say `n` to `unix_socket` authentication: + +```bash +Switch to unix_socket authentication [Y/n] n +``` + +Say `Y` to changing the root password and enter the desired root password: + +```bash +Change the root password? [Y/n] Y +New password: +Re-enter new password: +``` + +Remove the anonymous users and disallow remote `root` logins: + +```bash +Remove anonymous users? [Y/n] Y +... +Disallow root login remotely? [Y/n] Y +``` + +Remove access to the test database and reload privilege tables: + +```bash +Remove test database and access to it? [Y/n] Y +... +Reload privilege tables now? [Y/n] Y +``` + +Now we will login to MariaDB. Run: + +```bash +mysql -u root -p +``` + +Enter the root password you created earlier. + +When you are in the MariaDB console, create the database for MediaWiki: + +```bash +MariaDB [(none)]> create database mediawiki; +``` + +Now create the MediaWiki user: + +```bash +MariaDB [(none)]> create user 'mediawiki'@'localhost' identified by 'nchauhan11'; +``` + +Grant privileges on the MediaWiki database: +```bash +grant all privileges on mediawiki.* to 'mediawiki'@'localhost'; +``` + +Now flush the privileges: + +```bash +MariaDB [(none)]> flush privileges; +``` + +## Installing MediaWiki + +Go to the `/var/www/` directory and download MediaWiki: + +```bash +cd /var/www/ +wget https://releases.wikimedia.org/mediawiki/1.44/mediawiki-1.44.0.zip +``` + +Unzip and move MediaWiki: + +```bash +unzip mediawiki-1.44.0.zip +mv mediawiki-1.44.0/* html/ +``` + +Set the correct SELinux permissions: + +```bash +chown -R apache:apache /var/www/html +semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html(/.*)?" +restorecon -Rv /var/www/html +``` + +Enable Apache: + +```bash +systemctl enable --now httpd +``` + +Now open a browser to `http://your_ip` (Replace `your_ip` with your IP address): + +![MediaWiki Initial Setup](../images/mediawiki_1.png) + +Select your language and click **Continue**: + +![MediaWiki Language Page](../images/mediawiki_2.png) + +Check to see if the PHP configuration is correct, scroll down and click **Continue**: + +![MediaWiki PHP Checks](../images/mediawiki_3.png) + +Now, enter the database information as follows: + + * **Database host**: `localhost` + + * **Database name (no hyphens)**: `mediawiki` (or the database created in the **MariaDB** step) + + * **Database username:**: `mediawiki` (or the user created in the **MariaDB** step) + + * **Database password**: The password which was created in the **MariaDB** step + +![MediaWiki Database Information](../images/mediawiki_4.png) + +Click **Continue**: + +![MediaWiki Database Access Settings](../images/mediawiki_5.png) + +In the **MediaWiki *version* installation** page, enter the following: + + * **URL host name**: The desired URL + + * **Name of wiki**: The desired Wiki name + + * **Administrator account**/**Your username**: The desired admin username + + * **Administrator account**/**Password (again)**: The desired admin password + + * **Administrator account**/**Email address**: The desired admin email address + +Optionally, you can also select **Ask me more questions** to fine-tune the Wiki. For simplicity's sake, let us select **I'm bored already, just install the wiki** and click **Continue**: + +![MediaWiki Wiki Information](../images/mediawiki_6.png) + +Click **Continue** to install the Wiki: + +![MediaWiki Install Step Part 1](../images/mediawiki_7.png) + +MediaWiki will set up the databases. When it is done, click **Continue**: + +![MediaWiki Install Step Part 2](../images/mediawiki_8.png) + +Your browser will download a `LocalSettings.php` file. This will be uploaded to your server via `sftp`. + +As an example, the author will use their Fedora 42 laptop to upload this file. To do so: + +```bash +sftp root@your_ip +(Enter password) +cd /var/www/html +put LocalSettings.php +``` + +![MediaWiki LocalSettings.php Step](../images/mediawiki_9.png) + +Now click **enter your wiki**: + +![Fresh MediaWiki Wiki](../images/mediawiki_10.png) + +You now have a fresh MediaWiki installation. + +## Conclusion + +While MediaWiki is best known for powering Wikipedia, it is useful as a content management system where users need the ability to edit pages. For instance, MediaWiki is a good open source alternative to Microsoft's SharePoint. diff --git a/docs/guides/images/mediawiki_1.png b/docs/guides/images/mediawiki_1.png new file mode 100644 index 0000000000000000000000000000000000000000..900db3bd77889ee7f2c391ee83a17f5e04ef2fc5 GIT binary patch literal 68052 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 literal 0 HcmV?d00001 diff --git a/docs/guides/images/mediawiki_10.png b/docs/guides/images/mediawiki_10.png new file mode 100644 index 0000000000000000000000000000000000000000..6bee1b9bd3e5ae6ef78e66b790013f0c1f326b89 GIT binary patch literal 97199 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%0ANR6|M5$M5KZ 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 literal 0 HcmV?d00001 diff --git a/docs/guides/images/mediawiki_2.png b/docs/guides/images/mediawiki_2.png new file mode 100644 index 0000000000000000000000000000000000000000..6b98de388c8a4cbf6b1e3d472d57ebf3b763b2aa GIT binary patch literal 97380 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 z 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 RFOgBItz~et=*Ht${|(Lw*6#oS literal 0 HcmV?d00001 diff --git a/docs/guides/images/mediawiki_3.png b/docs/guides/images/mediawiki_3.png new file mode 100644 index 0000000000000000000000000000000000000000..d95ee5aa38ef8e8203d8cac630ab0d329f64a68c GIT binary patch literal 224803 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

+j zCq~aU5v@b-^L0G5<`1GE}5#WtIWf7-MZW z4uB5RW_L!Qdk+hwX^yEt&f@>$@2JL7FN29+e^Lc-Tm4W>0aySFDA|R3;Dh`5>9SlRF>}R@2EdXgc28HakXXS>!_UkRcBIXM^UvksDaPFN$|W66;Lt!#Whc= z&nuF8xnBWZj3xeJWfN_fw>WdXume|syJ&Q^3N#lOqDj)s43X1Zck{cv(90;c|Dx^j zYv*F-htC+Qcn&4by!`&p^xvI$d8fC%30F^DNf%FufW9Rn%WTH0O6TNZA6cEQX?0i& zb2{Pnb9W*_$aky_|G{b#uWuIaiM<$S$uIe{!-d-(l%avYaJw-mJ6<>-ppp&(CjZ}7 zt=s0ZA*QC}u~p1uEnSrOy2nKnH#ARr;}-%iyT|4r#ecC3iMOfqt=8pg6Mr5z>-U(T zcGVSWAOn-pvcNXk!y%sP$_t#uaL$fPW(wX5+rZ$XvhvUBM{&;(L9?&{+^hq}qKmv2 zlgF9*<5>CZxbW0a-U@Hn?F=Lxm z!&CB9D;&9$Ew`#Ef5M^FGZ2o0=e$S55Ay4n^43t^G?CAATxL41u9``CtRZ$*o}OwC z_S9|wGe}Wz$!qnG z09Nj}w15G#6W_YaGVgFex^Mam^SM}k_rD!BDeZS9$qYb z=x4M8;G{KCKoZADDz|W{#T&+FN)d@Y))w6wtS`)@ZJ-lbU=FSH$YMmMOb$rhUP`>k ziazFUonNX;4cR^`Hk)Ic@29qHG(2_$cL_Nv&>UbD$P7Q8DD1&?T^y2+XaL)OoFpwg|w2;!n zD@BjCnj`J0J5N6kS}u`ec^oS;)^{a3T;&_cJ}z0kINE^!O5778l!DfWQrTtyCHYr> ztuVHW))OJ1{tahdfa%MKSJ6EZ65zDREl(iPNyvzIMiGr+Qi>d%8XnkkZ#kpPY;Q6+ zIU_?vtS#VcO9tRq&XfIh9^!Zt>e^3fI;o%?=K&#|x|)7=^iAX_K>KBK7|X_b1|qMQ zu@k{mYh<4#{suA}59N~3ofKCJb5H-cY5#+z^EK{OCu`4JZ(iN z-4;=1hY#O&15k0os({Xj!U)kWzYUsXhYyw+h5@>t@UxsNfQY@h;dH zIL~O;&u&Wql}D}VvYCjs7bvcs#SMaO|J3M|O9qoFmFVNYl!e-WZr|?fF39#lXO|~8 zjV)_GC(2&~kl5E9iw1JAPmfIB4?y;#*IH9wHxB2?ufwKHu5iF7jd(vAUNgF(1m7e> zwqCf~+6oxvbIauh%Op!ztbIY0WB8{iAbVCCoHbn|1B9|NXuvAkF%wr@g;lMtKQi!~ z752%}>2E*x&%Z=4FuF>8f6pAj;nEv6)jCzYbr=9|qwIj29lSW*IFQ@nB-o|va}MR^ zFN0O;^S%OH&VPAEDSP6@21&hB8q*c&Pp-q*;yy$WqXTF0Jn6UT5;Yl&Es>8GBf*%1 z6GpryJM1U4amz4^Ro>?ziw25fz7Ezf>FsS*i&hLqV8_v;B#3K5ZX*v8^F0!CbytZ@ zxS!1&Cw0&)zYMJW#{wQ`Kz_qhlddb(ng8KModGe}Uag8bzKQwXpTt(8e=eR>I!yf9 zFV_eu_+Z7rk3=xlDTFP!%e4=m6>weGm6=Pedh2t1Kc%!|6jIOKFeC#&ixv#)|0I-s zHN;GI;;~M4)&oQz9Vsf_Fx}1Z^&iKBmko!4F_nL2UDH0=JrD9jIN`Y`N*i0klbwS5 zrns3_E|9BCs2u%?y4ZVE>y+FnEYLXi^_NpHCe*N0N;|sTIAG;LZU}0rF@YC^PoBeJ zq@mxGnX)FEUR}Wfb&~!;9?DZDIeu2$zTWSGf;$ayy;r*6t{`7L(Y;B?7Jr7BDZzPd7dkKm3D5gm=@zs_ z$v_aa=yh)A%Hq4r)K$fimvCK6OUryq8(X9>QL_-*jjMh$)^swvonSeL&XQ5|5kgLX z+?e!TAS0hZiL(BQuRj43qi|{VM-9ZQf68vZ=ysvClf_9sdq{O>sUgUtKt2+^<|OAU zEm-+UO`S9J`H@Nvc>Wa4i35BHpV4yuH#VPY>`{V^PR%B`e(Q#TyPC` zl?`yz#z(V7LnUXSa^_G0ushfkNDc1oT=2k687`AwuZ@A7UWuXE1S$#zC2Z>k_M*&Oqp%rkVY@7Z z*TU*A1WlDNlDTk#@!F@e+*1~P4blW7U6)k7D{lOKEUE8wf$-#2 zD?&+Lh>l8}OY9din3Vtgh8d$3Tk0*2+x&)$cfZXFNjQRDuppXEkb0Ys7_!bF~>)WAOA!!-^}-EL(+qD6i~e@@%{ z4C+V+u2Op)T7!gap0G+kyDdvSFRCHt7LyrbJg+_>jbU6lIXRIZXdpff?CsKeTBp+5 zBt}`fC3Pi-}`W3W$mB_ zgoEITw9}oT*tT8~%84(RsNq}r($Z_!UO$rSyT#j+tZX^H%mUVN0T;}POv%4EqFM1| zV8jj`lcgu+x)ol^o65mkGaG3O|xDbfTt71l9;F0d0YtBZY8`|1)Ep^W|! z<;j+!%r&hDZtkd@5r(vVs%Lt) zNO!y21ALr~F^IV}dC|!Fv7{YaD4`UWB#{XZ7xLSYc?vGR@cl}+yX}yx^Ezu3G3ko!UZ~xd2tAF4*3uEN$o)~<>^rz0k=3I#P@@sA1)Z32Z z(RVO|K=@9W)|wG=mnQN3M9U{&%ebY(eUUpgR1uz~UZyytvh!vZ(F7kC^fmRa&XBX8 zu{0_$sf0uI+mpVALO^xG7ZSy7WM)Psnl*;oUDU~AV}5hkWaxT-_{I%whZw2wW+5s!}V2p?Qyv1`p;87Kqh zc*5;_i@ClOE6t&RVFMkdq5j1*P2bkNnlhV2x)ur<(4jw{*0)XR_rr!*Gp_Lem5}v8 z29AEvTydV5mp)s32ruj(w1~ouEKTej$xb#UU(=x$p%EVjPjsU^SYLWIKjWkqtoE>t zB%)DmrLCrY)0pz_%Zx9)G456D)<&a}2AS8PKO_v*zI#&jEZRgAbPK~d$k+ONLcNTD z{Q8~0zs;s_ehBBXKRB``4`K>m-fs$l8b9~=|67j9wGICTI+Hk!|J9|D@2_Jw{Z_F;kV#7;9(xWQ8IA)c(B#@Ma3m7_x!HoH0d?F4b@Mac#C4YT|{SqvFb}ZnuzEw43Tx zT>j1Rs;+0d)Tdf7!n`5*)oYu+oo_F1v;IfKsvk0hDMa3}5wG}`9S^|8qu8FuYmS_K zI&Tle1W;?cpOnW*Q(DgL%G`&@=1|m3V**45est_@9qaI(TE@r+6}@Hc=%%=gKp7gM zBC!NroS$y;nY@M_3@In!rG_@$mYBS$IvzK0$dF%uai_yh^^=%nZ-kBeBC>akHrUKblP-IgP@fN5 zHNqdC)?SmiH{tJfzaEO_TS&S)4+y8W-9IO9SGi|sjkpH`hpmc=v*$cOT;7+A?QJ`2 zYsvL5DWCr0Lg=n0f(fT?#$&zC}dUn#+{ za+f<@Ydi96yR~!5%7ea%~{&jmj4`J$`ncK0x{ke_Ay#b*I_U7Ukj zzO)~~8ViucGJ#8ks%|@1iwt~lD_$1~A@CQ0Oas0UqTK%b&&M2)ROI@n&7`eRp5q!f|wktTK>?~j+x$-k7cf;ox-w~4-a^GPT-YfW}&RCg9?(Vg#OzJ z|9Sd68yU!%;HIETxC&h$7}w(QSwc>ZJCuThx(j-PlygpBI=mn=DsCAWBYxQ!jOVxx zm~itQ+Lo#hgnzh-G+n~&P;@o8%Z{IK3o3EvfOXVRA?d4~OK7owAmA#{LJDSM&3m%y zuH;Z+3HKsGgWN@uiXtiK3v=^C7C3E2QP+N`^3@dGoe;=kUYNnt{E#q|Y>fLBxItVW z9C+oDUI2c080uqpuJCJ?%x)Y=OSN!90@%j&^#-ER03ZW@T+X(n&DA@<>H#_57!3@}g*e=#T)#=-}U4KC&7iTfYdNj!GC068lt_P9+Mo?;W_n69Q^r z7pLU+;*Vdse?Hn6i(O@jKsl-GhmAVg0 zjQ#gf3w+TKPdrjC_kPu$eR*pMI?E2J-16!Vhf`Sy724=KA&fYK9(>N)bX1?Zx$K)t z92orO5sNn|;liwWC*D_ilg<3z>NtgMuenX|CJ(kss!B>X@Je}$E#dY5G^VQKXQEHZ ze35id<#qAvjwgb|$`vh>92)2r=5>G)Qu^Vg162FF`})sc9ECfTeh(NQ^`MYhczfK& z6FxW$OcMg^iUmw5)V3erq`IC}K37g7T1-23CW_n-z;bV(0wRif99wFG{C>d$ zp7##WkTtHk>&O8c0mn*ac{S2^zNw7Rct5>NH!;L!L}@VCUxE#CVqeu(t%NtBhrGGK zSkK_JYYPf&tIw=R`$B2VKh;#jwx+3Xsz*8OZ5>eTclc5Zi_neRpIXY^4xRPM4cx^w zh@kT5LD#CkOG7$aZyFO2WQU{m-cQ4Yy~Q9flaOK-Acd+izqVlsn+y&vh zg@LY49z?^%Pqy`sVSn@c4&Uk5_s)_)J6K>2mmGX@ok)3Ktv}=I@4|R3Lsbget;#mM z9bK~t-DtMqj|~^LL}GGv+atGiL5kRt6}E3ym+R@XdhPsgN?B0#6tQE z^M%uE_3+B@K(@hiY(-O!uY$EjE)K@qvgt}(d^-6k`*7YoU)Ou}{9<&%D-yvxU~Ra& z@2z&Z&g6NAaQ?8aMH_6SzfP-B0}AFmQm8 zzCl}GGHqKO4}jrY(3Y&n4XAY^4!hLJ)p0+zB2%rv_fg zDC2jeSskEZnp)lwcgjDeX0g?j7UyGi(>MR66K-K*65WEEtzP!+sn+AJdQCb1k17#5 z!7h1Dx7>v>7qH)DG^@}XMkB&l1-IGbJuv!f^H#(8o%qHyreePKM)c%CAH~0HF9GAF znD!5wqGp$1Yidoyhz$HK7XP^eOz6j_=Tsw2YJ#FtRKRe37j*%SMV`(*V=_e*l3L%k zmqP?vGKmn8=aF(V%<_;;A_pJxz!l>)Itnl>Qt-qHem4-rr%Au?Eq64TEcrEWk~=LI#t(l?bR#1N`M*W*nj2akk zvhY^qEG#0w7ek<;A(=0XGPGa^6^X#>YUHtZsyjSlC5)(n{Euj=Fj$wXb6n4+^4+>(`!_nw{L1(kJ`<6IlM9F^1JLyw!~l%9mDQ*p;sblw8TtX^dOc7HOA`r>ae zI6V>9Zn361%N%l=*Lz{Vg&?1ZU~?{Q92UxGKjq{II-W}M&Rlyxjl@ zBX=@pLo-&9m>$MYECgw-A0H9D@{jgC(@zl&vY;Zs`ma z(~>6kUH%-~Gz`Rb-e7k}udYr62o0Uv^@6c%a}VX-FIt5wQ6bV*-B|#Osc)zEq+gpqdv}C?GJvYT0wtuUpxZ`kw35DsuXyUVG(yd4;}pMFmDP9{FK4 zqQ*u7LK`OXS>6hLQPey*Z>=152dpw<2tN{!j)l5ltkYT_qXXzgF<+9=QoVrj{WYNe z$=peXajciMh%F~FhDc4Ov|f@>TtFCw+igUHZEMMwq!<$G^(K5=CZ~pho(MebKu} zse-K!PTlCm`k&(14t5yUK-+@#+r5SiyW4*fI?ckF$!3TzO!3^aeCyu6EM!QDeYHO- z@S{<@eU+T5!oNKUflFD+@9Fc&FQeh^(8VslAovHgMan3!ZPS>&JA!Sau~&TsN;xl* zvE9GBZV#&}kPDf`BEqxLZkUEgQa|`bZ1rJ<6WdfNf6^!+|?4WQ_8Zp*F8+a7OWLYhxYaBEvcP)3^PX z9I)c+`*Eley;4+l!mfodwl}Sv#9=axm4AdRPT&ABYDavqpEOfs?cl|#5f6XEK)-ES zQygwQpuNOGEl?m_UO@v1=!lg9NcJLs-myPc3qinq)KE30=wKI^D$aRllcrf~26}n+ zjsP{0B|(N~%%X(SJ=D{)ih?lVC4n&6!>32koVUnVg|gizBFg#ER?uFJ<5#D_`nZ-r z9tp-d1!I{YHF~#}K%Iy_pWcc;)+f*YNpIX;5PG`N!y`&wVs~S)LABRoNj*_5ySk5fwFARmxOqc92xHJ?6T>Z9%JM($j9NeV|`nQRaC#a7s2vLn(d}h(ip+eCg*~MB6th=tGbBbuX() z^^@BAug_v?I6)dBa@KchzlnLAao2*o=JV0SNd)eHGeg?C8QwnAX>Resd>8%(`q@zk zsQ0KZkNiUi`~-|^CnjX?SC%%K7efWkm~F2s>hn3d`E@_+5bK8i3xE}I<~je9|NWYh zR8w;49_D3OMXf_tWwdqvM{CT{P*-mPHxk%g7AqEjihr#bp7Pl@FI$qbA+7Q-tf(CU z{1o>U87>sBSlVnX--xVF4fJi#)T$t&!MQMCgX9H(12z*v+b(NUomWRZv@_#^B6t26 z%?L#(ix0=P2X8$zfha*6cU1?gyGVo5_n^!=czjKt%^@B1^@(G2y$(E~KJa&;qze)gWunFx*JG6BwYMWq*Z zPo#Yqr_R?fZ|1zZZ{ zvIm^j3BM~y5MBLPnD|Md`j#dy&X={2FMNgD9PXj+<{LG$+iG$z4sY#D3Fv&l@EJ67 zH#4QV0xNhbH*MU1ag<+hTZ)Isy^b<5-r_ER?GKmHuCXr2El8?j&MVLfIG(Yi*anWB zr6FOpj!k|HEjojMuMlr*prk?c`?G?n}y6IfkWUIEuM zar_c~&2qs8%R=`Mr;-BLg`LkSt_atAPn))KTvY8(KY!PQk=SMB8pAR^S_TViDa-W} z{cGBhadVd*23E(-52Wj}44-9B*^C|Ud&mIh*F^Qp(Jp`W&{in% z7WsKP=NH5N6MrWf6<&lFD*|o!Pg^S%1y(P(1~mrr4GF|$hXKEF&KufM943geG_Pg) z&-oDg&{*WAsGIO4EaAkevtIQ=IMzJh<(UdhmKx8*D;aZR|>RzL65PR^ru~$|Ic3YcCf=!7vbmJG4 z;5iikPQbwc;gEzMf;Tw2Spc1Z_qG3zr?(7?+xh;#TeP^l7I)Voi#x^L-HSUc?(PmP zTBJ~%VvD;LcXtYlFR;L$&-ZuTcb+7fN#@FAGReuzd7oF>#m?2U0@;_4SFUV&VUn`l zgd*Sg$AvTg4ndN%1fNrV7y>Jp=8~g-uVIuaDuMY146?gUu2fE9u-pY@f``ZFcB|1H z(>bKd#!Fbb9m`CGQ*O*yCi_DNpfa{n>Bc>E^*P*}l?`8qcVH!-Mt`%#_Hzr{39 zMA(WFrutmaz!LC`%m2N8M77^eDocTnsMuGkeM;=*AiJMn#6;#GCjVfXLsdMj1-hpMr7 z=-8fU)%a}o=Z+2HS?Rmc^l?90~wN^FTVQAxfal3$_8Oz z*ha6Ev=0Rkg>xVY>X>}2VstRMyHt^YD%7MXXCAd#Bo0Xt^*=rqpD*Nez7;5SS>0L2 z{>+ZkdZ{iA44RLnCXP2yKl_@SRKWA=;Zfr?;o+{*#mEf zRiV7#seY)73D~y>O$x&?>Tc3|opIYV@Zjy+J84@38|0iubRxP$Hg~H=D~ZmTqm(6W z#l`z0HAWqtO8I_O z8OvRp%?aAue15;yEj1D5&-%jT+t$+ZKP2sk18@BSB(%UcyXyvjr$MUrhA%inTykD8 zRD%i2{a;pe)jvgk5QAP&y^}WK3U0#HC0NzQqj?ftvVu$Qps%g2CbV6nvcUZrb~)C< zvP{|byX^*k_gLJFTC3l%AKnSfOUXY2nWIUf4R;NvHWc&|9p9cCr`AN6Ui{~>fGep2 zT!$53JNLG0TTM4Jo0~$3K4AVwdVXI9FdWg|SHX~XCDVrw(f_HI{{Nk=Bx<<-cDdFG z0JawITi?53+_a$Io&HljIqZ}}j4Dh2J03FJ?|TJ1`JaG_xRMfauul8Y@4ximvQo5l z98m0i#_8C9+Nck}3>desP{NZlJL;8kyZ*F(oY?nfi;MV##Xxw7WF0d)U_d*oA zL*1cWtvBQs+-A*n3p7e;{CryU9<_Q|O&DqcbFeGWyru4PCoTYC)9PKTYnE|`_pPy0 z3Javx&Zq8W*Z5Z{>vGyuRMU@5dy4q2N=teFo%^XphgOxhnSWU|_c0LI2#jix6~|gA z;Y@?r3GC89(rkC({e{hgRmpK2}@LR`yaYBmb&Sy83 z-RNP>yxZ$84UiQ6@ci}l{liK?M7TXRvaDQ>P65a7IuyI0?u=a{#jCL*W75$l@}Fkb zXmYlY`z(-$msYkeFq>mTHUPSk7GkkG+D-JFiO&S z;O--a>qX2{fEo{V6=?(#$F#FIvylUV6uS@dVF8s40Up>V?yr7VigG6|W#rV@_;VKM z*kaIEKJZ@NWtm#hxQ&LoRH-@x4-*!Zg#V=(%?g(;`LT!X9V^;^N|h!Po;?!PpiP|` zXbO+^>OgJa@+GS?x&c;?G`ubFLzf;DS*DbPajlCdjWqg5uLR=P4U-I+-#RL?YIUB#}(7FQIBu0ti&zh$a$sg#CLnpz{za!KuZJx{cJ2C6SOxu3vnJZGLm{#IN2s5sTWA`^rkA8OdIF2+g#v=ML zK_iTvrL<~oL}PY_>{lg7*Z@AawuWvai|Ukgc~-0Su*b~mk`lI z0S^kK7jtU7<}(erlvzLY?Et5#1jRLe4(9R51?~E|gK<`tNFZ9>n889PcE}FDl?_OM z?Fct85W6N=d`qV1cC}eF(5!}~5=lv1g`e$ z9W>3O3B^e-4w@gU`y&+sHl_cx`31_8iycvF!xJ=kSH4}r2HiBvAlJl1p8I6LFUl8# zYBSI`44=k@$8!=BD|6I{!hk$7!+#7pOGX*TRTh-#u zV*`9$QkgZb5W&>34fG@ zm`MxJ=qT2T$648mvnSzKBQ+T)=ol4g4z+WzfD-ghe3bkYvwv?+e^KQ%=Bd<+FmdhU zMSUT~J&xzW)4~N<0K$r<@p$Z|B*%?f;Hyzs1lvNpv#CZMLq(6)&~m-H8S@S{C$ORM z-;B93pt&|7-ztG2<$TAMkTR-OQHH4npw_9_btL6yzgju8g8CQ!xCVpJi^<4*uKbToB|C6+cw#Fk< zn-f6*No0I*_{TjgEW6+51j(_gLr`w`Df-%dsLhDA@TiaB7V!3dznS>4w#Pzp@Wvm(1*w$6X$aqYz#gk)AujA zDcK#R%#Dw!eva5nbMaGwA0rn%DNSZ=dzxQ#(?S_6twLjtueI(E8S@M>{M&x4W&fds zdb)r53GZrJp_jObT|h1$xhCu27w#Dn_GAn(X-|Y+fOBrR0&BZ4r_OF{>GrRU8tcL1 zDaMe7773}(BaqmKT6Q;RLEp>V8j1q9k+n0MRQ*&!@9YK}L@&AQYaIGF&L!@=2nI>` zzx)Wi?$&JlU-g(gG6bz5N zYi{)4b+t6qJx7UDL_?}YqppW!#_20&%!X$ex`T0!oBk3lrDaieFJ zn<84oHLZ(ZQ1NVIDX1Z@d({;BMi}2heC^F-^yOO3b z-*}#l#4LDwOTkdV_~UKruKHJg6-USk$FiJmopg28_8LoT@Q<0>^wz30;ajpQ#bIOFo9t?|Lo9*_OE_kqn*{) zDX)G?SJ0AG%05jeBZ+f&M~tMoQilv0jvAqtX=l1=uP_$kS+3bGqc;ZQZcyN)TF?X- zI{_Z3E3RG=G-Tp|S+Tp>F8Gm?EbkqSBzm!fXQFt1AEHs=i?OXkgQ-p4>}%#fm9+Qc zkDE+NI6TR)3sorhGQad+yf)sJYcq+a2dg&#I1|$+}0ww%hN3n+1_4z|TJQOZ= z%pe34IQtm#9!lyp^%H>Y@iUrBrqQ+7gEI%iPLxxOMK)zl0dCZXzO%b8W6x*!Fuj64 zAkilrNC5-b{c@WD3prf3XPvlxn_!ZFFmsPEm;%kJ!j+0d(bKzpdKO@ujxfNMK<(sKt8eb!?PfRtlP~H0z5<> znT#Y_B)o`mTI~b_qeX-njpUTD_se#cabC$MHmUE?%9R$!{?6hqFkZa{>`z7E6q(P7 z7d&^>Kb=ZRfM1@d_j4)qCxYno9X(K&4+m-PNPT7x0%tv}K)cE=8NB1*wZOL&s~=PX zO&#$H8wXgi4L>l&Co{fkLDU+b?MQ8MBuH!Rz2sJ=9lIJA|8YX}ustQN@dQ>UrZ~er z^2()2hPnkl4nF=s>W$?g-h<-KPfx4$a5|^UM;_wf&${D^VHjnj0&Wd)8TqKE?5BI! z_1n#(RimZNmXMuDzLtf7eWW8P=GrWc#r(}BhE>(AQ&>4)SNhOOx)CR^U4XU5yqBY#zr(tvns|1SkEn0T6nk#eR z_n92t9dpd3XB{_a9|+zCZF z-I@&ekKOX)&#D)ZE()>GflCnQyY6R6vb50{OB@oW=RCCXtEIbK5%4BY`L|7r26u}j z2o8|;i7Kq9mn$r$>#yA2pU;7FFh1h{xRVUz^f))7ob1Yln4F%){0rK*4nk5@q zGt{G@%cX?am+@B$>D2RwDxqf%enl2#+V>-7z?XZ+(6p`@RfGCM0_XBCzRYgygzq5Jz>GfsGB?`r zbbEbaz^|-25jhsFh;tK6S8Mklg^t$0J@og$I9#6{+&_0T?u*-}{Hi@bp=n}T$&>mz zC)@?jt26!V2?0C#E8+?BdGn~5*!lf#n3`ByFT*jYJG+W#f_q*Y@`o&p5q)lWp*-Y2 zdN5mK)w)9jj|&Xmn0IwsWqo!V!9V(i6SI)^Br$hdKQ`TWxxqNa^YqkU{72*g4JwnT z8&Bg!@|a0U8fKg&ti7p3~PjQ4GhByCrO3lE=_sSn1uo*J&QFDlAv zv%tMk@ekkkuC2#h(&e=vd&*B};EXhC#$J~4;1=?_r^0jPOj?$7ruSxFvS6p0daf}Y ztY!QRUuW6aCW6?d;@j~P7xiEYunL4I${^6zXQGU<#TF4zlExr*C z+5*EtC*EObNpjS7G0R-sQ6@4d95FmJo_qpOw~Tl%;}xOL?%WhkWvN${ZeOL$@LQ?J z|LIaAFHr7Lx%fUS`BR+)K3ZGN;b2qrUz!U32uVbtDzI^UMF+B5(;e3!#IPADHKc99 zFl+Gb7t;RbUfNjBaULL`qN>72#n@@ZN8%ySuJAHvx=uI)H^yCPHmJ3?m@{x`y*=xT z=al@Nl$bxGxho9cDkCvZ>T^YGSWi74d~&)r6kmjiQfT)i3U?Vs)KgP!HWz9B{V#wcSC{TPLQCMly1RuO3jb@)uvN1x(yZhG)~< z^<3=!Pug~MVuxNin!DmoMu;VN?hX+MLIv!BfUwXOUa-i@7?_aTStgDwk(Cq}YtXr9 z@<9N_Of9bKK)5tkWoR(TN@ntVbo1zcVN@$V14-rl6vTsO7w9SM(`LQj7)>#C_ zr#~P>sDd)0r=v>R zmYlk0XY5S&c|{*OL^&kI;pNr`WGE0jwexAfNGqQF9rZvB6Vs;A6?J+gy-H_ z{@6ae7o&4C{lK+vb4K=~1U>%JHZ`Q{^W3P^DF|EbN+gORccuIt0O_|A5Zymr4P^DC zZncPWJbucu^f=oF!#Z~jd0n$wS~WZyY+tBmc&Gn5zN)uzUvZ0fi-YFhkg`s0^-p^Y zCEXjZsU3oQD<^H#M1R~8qm|%Cm~MfaV^d#5I6?n-7yI8z;RjH^gi!c+ozM^pk?&h# zMEj3)CoA`b5{NY3IK;W!U2{S|P)ukfxF5hVxTcd{mn`*m!Z0^=lrs& z8$5EYu$l;eff|a|!090(KNDsslLCnzePZ9%tcDfdRV}?gn|gN;Pmyn2ShQ)9{$jaD z)Tdf%9|noWH=Kh!@tnBqMB$RZSVBahr1V_pvx`T3^7P9)<;=8Vg+l6k7M+W+A7o)k zfx$~TLn`Fd(Rpt@mjpWxTU#(7J=BzM9KgaXV=b@d&mQADh;EJkQXcp)optmGEJ3FT zx1=4h;L)q;9UG6^B;F38Hh*s1u+w9Humu5&5P~&i&qVf-UfQ@Y)Mt!@kfAc#sumLx zLvNTcoYymjl9eQentMrn5;*!|)K3@2fkk>IbAklj7v{(BuYf6!5kE|=a?EKL&Rx0a zb2jCTPuhzVg0N!f7mqadIEV&Q{9UnHR-3g!36)ysA zl=?o_uL(=vkXl;c-;vb!8q%g5wGf7RX|w-lcE_e@;l{JOkGGkn#14Gwj72VUu@lw4 zl}Vx}@r%)d-@}7<9R)DhT1nvLrnH^4~9+v{RXVFm82LU*s;+GFl*ghgXfce$F^AuPI`WJ$-x~0e8 zgny^7Nxx0-Rknln*D<&{?sw%{1$XGN6?GUz+w?8G0rrndA#$5<`=!t_u)*K3R9_<9 znjbZNA#ArT1c7Bj1A+|( z2k`|#+>nPv`S+rbn_7Q8pqCDF6fsDOZsbH@2BCZy{su!e#6IxkA#`zU`B&vLd5o*1 z0kFMO?@Qs5R=CW#^9d%`mkM(VMo zqeg|>bAwhxjZ_OrZ~>a6ShBp`61< zfAx@@n07U#VHeZ&V%m|hAR^Q|y;2Tu%oOxM3C2ByZpuKvsL)XO_c&@a*z>@00Feq^ ztz<^IED?Y<(>4bN8XhTJ@kPU9Yysk7cmZ4O=wdr=F9!}0MOKm(9)9B&^ND5fKu`Js zsd3k0D(PP`2N2a1Do5v*+){+|U*I^_*}*jqAo;7zpe+0$7`-KId*7LbG@+&UavsgV z;XPcgO+v{7x2i3=hO@P)dtUdZ%jl`>G^Jmn$&C!S@yKd)>}bI}Da|a_Bv2Vz#4|;I zhRdO47D}=E=3OI(-e^7iZb2{EV-r#!;xaUL-7>q(%_4vdi^lP?O}waBC8r2%f{B2; zo<#V$OVHaNBgFmAAq8F_0 zW_9h5hIjf<=Q1H=mgW^63Tb40&ioU2UwBa`2^pz}35S`4$lElrbsG#Y7DNaUa&l=@ zV;J8|dAx~gA?>w}!OTWU&$QY~@&L>ipDR!d48E90>BPb*&Xwk2?$Iyqd*D$Def`@t z!|&G|D6NYB325t!SmE0dkPNfe>f2Svgb`p`<2vCSakQ={K=#?!J)C`$54wyGf)I|S zEe2G6;9p9BtemDEHwOCiyQPXN+0A5qYIh1KJt<)l5 zkXeiNTq%MV#$2`oP-pfg=yR8t1|g%0VU8U(ITV*@9Udj9aXindEwZudnGXK!kMU1g z)tJKOIxc6Qd*KxC+XuMWlb#6roeTaov?GOG-9su(AUu!;mW?%*G`uzeYs74~ewplT z{xka<%`dfCjk&0WTm?rHU=o2~mX51h9DdR$B%nqBc{%T=yfiq#N#07sgO?I2>JEkD zFA`Y1p|H4=DWnuRWARAMxM9 zj(mx+fv1mCx^&^LREzSRAW%{KRSFHkD%L~*Cf8QaQdqSP8%ndONOT`UXMbCaSibZL z$YkQqP%cK+I@kZjmWss4r5{FgDV{{Mq2l=$Ov)x7q<*qswYWlvIVAhyW)ZEL2St~J z4r`)}x?t}iGthw~=mY}@y2~x%+=AcZhpy4$WJxnuu*XqwQxrpdJJN>qmqyy=NC9_? ze}lJ}?;CFwG*Bjwm!9yTn#yzeOc1^{(vy(A{_h%evcTA)BWedm>*aaX*di>FBV3QM zqCRrRJ)XhKaIJ|c)WJ)3{x3Kf4)=nU;I_UXmEMjHM`Vm{`?onPjGY1uM=6Sqqjbf7Dw1iuv2#o_h52qvl4(%cb zRdZeo+)yrhvK}=gBM7{DJD@$t_(PfNBxT3Dz-e{#LMU`g)Hw)<-dl~`tHMp6?0L&N zZ!O%UHhPtJaCYc)5{{OS`^`-o8j}fGao)Hn4P$YN#1RfD+Hl?gn0jk%+j#lu@1~S< z^9kcXy4q?%*Y(_ckgh}8?qeFS$rJDhyK~!yKTujpRTkyl$K`Gp8C^~s#B7D!W+XqA zxt*0fgE{?5@w({`TvJTOe1iopsWtY>N;D{eZ|<`;Qu%OD(Gf~u0MnAxKwj;&D#2vjqGkIcAR6d=c2=#N z(r)fN=9sij&YmYUDWFWaU**rcgt=o95~xwu0Cpe{KEnl7x^M%B8#HkVI2Vxtq?&Z~ zhTYUcy>&wtTHYz7pN5%Q*=qSRen1lJv5E8Dvmth0Bue5$rmt{Nthu2sbd1U8osLmk z&;3JHzN;I-TXIA+lPqttxwrvs8sek%I1P7Mcq@Wweaa_l16Oh6fZj{>RCg*DICx+M z%x5A&l8c+QqMhNnE}_=vpG1Iwi73j%uYo);fi|24IR}c#$ zx%m#mU7&sh#d23f0HaiRVDa4$_!&RK3h3)(;#Q=+?bQJf{Aj=p6dA@EEg_Lr8pQ>n zl*W$S@SC_%%| z^Q-xtsxNXO1^m13pAj zaZRF?sCQXci{0!$qOPFOtpdkg0`4oE6kns%*h5!CGQi;U8aW`&$@YnoNz%Sd0Rabx z`LK|_^A@r(eYH29*WBkUx&Q-e$8jsbKcie<&qF-ESBJI)>2f>%VVGB-1CCN^c4rH5 zBEWG1cc;-ZhQ3R1gNPD~_$#QlhJCz~`Xh^Sy&!{B<_rt!U3Ljua_~my%iahnoH1#8 ztzM^@lDD<5NnQR93V8;wAE0?$_g#84L|oV|G^ny6+BDlAhnZrxKNZo>|4NMg{ zRLp)s|KHDo6RqK(?ZNJgg;z#@T0Qw-gxSlp!V~GPO6_DC=Fvv<%jd(*s$CrcZF-R_ z-#;JM6rb=FJwJW|PSxN=)F~E*rWtR}fUBE#=zm#NcPz~zf#yDyMxuc=2vD@3nN%DN z+*s3sC$g=fCdex=`a)eS)6R6r7W!FMeJH$E`$sx&>>MzA#6Y@g(&N8|oAKKO;J&u5 zO4wH{id166YNCI-e5h~ZZztAj7GtF~Wk%1_V&S2dtvTh38M zRydGrRUzPQxK?13+P5Dlz=(jGWYwHff2S(R%bLl1Wzm?b>XCaj%@R(NkgZe#(Vses z)AZo4BzxXtCC-O76(S4A_;%Qz_H@+F0^vk^7W@M$zMh1M-#sPu4fV~!)Bil+-~nIOsl@<7KZA-Pw`;&2RwUm$IRldFa zj9x7@Q17GF0wyLju?XCs1$B%PXkOZ*=Y4vRCXbM{8`BC|YpG%if(5a*MpD!{jh6+t znHv zP(zjEbumP6z{Tx^;df?40H=gn9y&>%CRUQ=$gLd`N32x=pORmXk3Ypi-IKFhZNQBI zv%LhB1_ ze2AU4kcE<`2M`Q^w#a3g%}T5-YZ(+~VoRdF-}W1_!~|3_a=IgS+t#qL!b)|T9{2kQ z3|qsTI);dB?ozCHK^Fs`9!z$BL2~GtO#p2|yANz-fZuhJJt+8Y*lYnu@%a}OyHT>u zjb2VW%DwEO!&3C~UX9^0?2_U zJ|OwXAB(fqsP)8s1bSeuG&zPUek_#&Swn4wb8qd=qG9A>fC!LTpk1g1Mw3#&MenZ$Th+<4O zrNPuYq0R09zW;d!3(zS}W0HLOJoXZAf`p-{bXzx&WT}FhA((pmst-k2qLkNf%r(6g z2HbVo>~SSZ5|F0-BHoh~Dj;JLd}30dg6(x?=;cIN@Pejts*5+Ai>aS_aRbL!!^

~C+=~AwYp_{fammS5kWVd=kiG-+eQzUC~!DFnhyOr~j0c7fWovSXk@As~SScl^& z=~Icfbp}9d>CfX+jgN~o-tEJGWecfO*tioN=zYD~*B3l4YD2Wff-N~c#nT!H9E(VQ zsf^|MCc>9ze(SqLyU^0vuZo}EraySrO7|^UZ_3@@JR2kBwKLt4nvL9S&i3NS5+nm` ziT0bs?UNg3C?=l^hFhdGoG;f@t9y-A1+yK*ad>ZE#G43*_(XhiuYm#V@weGoplA5S zwiTefeE=CI3LC(@`Hogv0j}AZhYMNvC)kIlp%FXf2O@d;*I|i8Z(YJqqZ|Gyq;rqA zL}fA=vTDBr1#NJE8XY-G?zF@9^$IP&=t;!g1}fh#PL8T;$Gx z5(o(}F*@FJ*hqOAP2uSrk>pmXslDFn*^{JyN7ah?$1D$=*BqKky4BkJL(2be`ESt^ z`O#6_J=%k>MgV_Dg%$!Gm5oVj1vcD_Uy6T+napBSF^M?c>5M3LRUaTgtdyT1<}k z*TVUVEyO!IvEN%SN5)Bivl`h?Nh92kQ1;km@jK9^5tXA|l^{^bRodFW#gmSG&2|P0 zs4!vS$jA`|#yU*AKQ#`}pSvO$Eo(y;3Jkak&-m%Q0Gy=FcPoF_V&hWG2yB5E8m)pl z5H~nuLC3zerf3Fc_xFqYn+{DwE69)O+BL!Lm=LEmjW2TNL1q*Nl1^}~uL{jx2(FU2 zb|L^AKMYgc8%RxGbY)bIC>kO_>dQGCEh*xP2b=rX^ucEi^Tf5oJ`6nhg8MlJC+wzB zLWe#)Y!RC%J{h`DrqbzC6+d6@b>DUC8uk2c?PX$6`ZM8Ws7XN7-l9UG zF=rRv{wH9?H$vyw@`?EV`yl-xMfF~GJirrMyi8(}gtUsV>DZnVX?vdKR9WTuvVelT zmB-aGM_assds!j&m%7LLI|ijg9Vt%D)gv?+pk__qr!587r1`12GCnBZwLL4-W3R&W zF25f~GTSPm^j3sqa%!SKo39+NHH);0U#qK)uOLwU$=gMc27j(R_Inak;2V&NCiVns zv#guiQfz}*q_}m3sQdTDpkj~?8mSWOZ?E75*wABu{|iw#E=rJ)B2TG=paHQ=p|@)G zkk==-y3nG@E==%tn%%|_L(yjV7MRtIrDplxkLBW4_a^!SVvF!Iqom_2vJS!dkDx|o zxa8yxZ6=_iJUD4rTN$8qJvQ?GebLSGd)j9|i4pB0oJ&)C)D-zb`0Eq`uO7V>yT_VG z_`p?g)p14r`HXp&buFF?4iG@IRxE@#MEE=|M5=(@J{xCW-aVJW{TehX|v)9c!V2Q<{u3Q3Q`v`x0bfX)Vx0&!2eI)cAvmHh5I z-T=cgB5TYL`y~xYx>HzNZ^DZRG=8`7ku!Z9Op?#v0f!*`8E= zmMnwA+1GXbcm#&M!jF(Gl_;2TDOj77RyuBdJ@Z0%_guasHMpdIf!onM zD`?8Po`7*P8q7cb;OWO1dgIV_wVK=Ak0j428n}hR$xw`MkiJ#gaQ@xuzE|bs_|Hy zkSJZdLx5*%@+HI0l`znJBJNBO-KIFBy_UNPZzaM+I5y&m-N~`WT(gw6x|oC>hS_$g zJ@FK*u+vmq0vfOes>=LqirNz@8)Fhj!r5nqq^w5KXH8jKwXz=kp#bg|W>FFsq~h*c zVz^>J&!ccxg& zRzkxDJm7Z$>WP(w4)@hO8U(FIdc9^775ASCNs9|HG~J4}=NNRgG-R4q`DyalsYaYwQ9Js?3(l!TNH9)VyCvv&^$DoFWR zS>&d%b$bbCU+N@{lW#{J-q*beWS@Oh(k8`1DC z`VnMz8bA;28Am@o)oi@qDXRs!U0~@p9Kq;@;6C0*3V`#h376g;fp|ofR?| z6|R)?6YP42UoYWX^j^mFV+0d~=}E_5TQwJu^4xcgR!U1_?(YlucpJ{mN)DMlJ`of8 z(DtiuSz`${q*o#Z6bEwHt>$+kRYYi$DBsQ{s;fm?Ev0C^O){)>9LU@g_abumRhlSl zjM70GG&c|uZ?W`u*d%D9C)&)$^Q94iJ*(Gu7H$vvOUvrzBLqSO8$_2pXetxxQzk|L z&dZU-riRIjq}pB*{GdD&f*ZROf`h*AzL<5rDlhx(KchQ|FK+ZYPChYPb!VVl7N_9W zh^L)gDypt$Bb@o_a*T1bU?vn!2jB4tFCx}4qn6dGfh0re%j-Ai#miV2Mn{!zQagr5 zWQt(%SPu>oqO0pxf4?9H{Oc*#)3`QjCf|$jICWHzbS}%1SB>=C|LDhDVdriYV9R7+ zEJ2aRF*~_4Nvo8TH=Eb1uEbCtTJmg`JF5!V6YJO4FQ>f`d zR)n{c^zGI~{5aK(lQ>V3SWa8NQ&n-&n8ZfuvSxoQKu-{fc<0c~<%f`wW3(`nee)+} z(4r|1io3N+u6~++z&RJhmC`}j+_~@IBq=N>JDV;4{wv)PnVATzvW@K*WF{A9)Ep&s zgO}kf$;)b5J$8e`KH(t*11kZ3k7wGE*{%HiNA#hzSl#*dYF|UmP_BJcMOxTZkRMXs59bi9CDHIH$B2MD$HuP2mnOv z-`_gSo+2H7pPdn(w`@nQ>|4&r-T%1Mbl#U0>P3lx62}?@Dp<(!{{!gw_^keWC~qRrjus*6E!0mJ><=R`j(qJwkVbUGH@0)|-?J{$K>4W=j|W8fhG# z<6S!R)s_lSLL$b4&lf_QL>XoeT(^&i8Xq?F*v(^+^9q_k}6iQ=?AqMFWh8(GPPTVJKO46^S~_RU(Vdki&H0iO3!8efa9pw z@EeUnWlF+dy3#*ckGe&d!y`8)yE^_fjAM%di47Vise-yj>|;8U#3w#}`04&gOE)bB z1PS(;+ms(VcsTy6ERip|^susKNB)fX;rrCVgA4c4qdqSx?k?Z|2vMrj*Zx>8R==(2 z4f7uZMkvgOl`#Luk(#fE!jx#oyMDXa>Z?8BUa{~N`;R;&MmEmQb7^sv)v|JQZJeg4 zy@QYTKXTQn4iF6uG0H<)$7I)nl3bxEJymk@*AP+ z4)Rua?EiNy zU1OI&G8Gf|Ii~6z{_;a}yJazlmaq2JC_nvQ9n^sd(A=~Ubl;~)P^DtG$CRb_HdZ)ZQM$jB+K`D#&4nrkwuoJ|%$!b z2w`JM?F3fzJR3vt-XRhFULJ6M)=dANuUd3XEh(aNIPeI6TX1& zvsV|`Hy%EsoW-<0856VkTvb{#Vr1E_ZRAVER>6+!dXw5sC)iY;Oz(R~%iYVEgV><; z&JzKV_Iu#fs?5>+NN!)6`*y7$LGM(XbVr^w2i+EG@(QD~Z=&~6!@c(Yg(_qc@3`q$ z%~9ry$bGk0{RHRT8#60BtYRyA?gg6AE?b15s^|{+F5lS*0F5L*x4-d=ziym~F(XxK z#ucsvSi!5V(g4V+nnn9b3A8R-^KVgQnC0k4vf5LqN|iC5e*V%H+`C+M+9+G%LOlhw zj$4q8C1D0;^wa-9cw&$52se3koOaFpqWRSJ5N&?c_@E`Pq3w|}s*mP4EL*zI7?~jK zPrD5K1r6scwG_>>f6#f9ajQ6ULpAbN@o-L0f9PsAVqqo5%*894eBtwG^QM2a0|fZ3 zJ6N%hA+D_#Xui086}1||7W5fEt6~7G#rD=)2yb~ms@inWEyST;YgIOLf6P@wt?OVAVZrt2FR~`N>*=`9`v}o5cgXy-@k;~$pRh1Mf zP^QtiK7{R>8%?B)0df2b>d#IYXC?r%L%kd$kryKK_3^^>9O_*$x0VIzsZ89*NdR@G z)y)F+%)*)x6{5;asE!DsgaH(dZJMlbCs_e_RI(X70G)Ra7;$GC4ek;NXM)OjP- zXZ1*1RpD@FwfE1QW@vmCqUepGgECH;Hvt+$vd2INgO*{cGz(Z0Ng#)r*%uk8ap zV3lY8H(UCN$Kk|WP`Z3h$Ywo^wrDClUYGp(PsRyEcoWS@EzEXL_arQZWNZBAGnm%fGxeBzXl;b zN~dk44|+FsLLZyP-MlIgl=oYoMR{-RT&ttRyJOijtoD~KB)e}ud-x5Sz7Wr|{G;jD zL0@n6Pju$bL`qQ4d{xIhLCYlW7Kd4Rv5eOqRhcV1t#cu^2>G$7UYT>if2kWgR+H(p zU=e>-tAUqwP!ZTnRz;&s1uERLbfe>59ip5T1N%J^d84&sX62TwQYB{U$Y_{&HVs)dl+QtNXH1>>-VN5hTmh;tLh zzi(BkHs~!?G@v7=;~s+ox6J*D*?=>NZj6PrBD$4dsf;T*pu?ulz~h!{hnVk@b@q$y z*L)c|%8z!Tvgl1%?N1DTpa=eRia$a2B|q;M&-P`Vg~WlN1gJ5bA(7(>5`ncSMZn|^ zyC5mjdJ!~qFHm#Ipv-E{&f6GMx=ycf*ZHnBNJgZebogr3_WU2IUnf25J@Z$CKYPUt zN^5Zm#k>PoW0;?Fx3BF^oCAuJs|xn6+bPhQ*#RYaipRX|A54VX7Rd3XM1N#lk0Bct zdqh>?{pll>=8#InyeZ>#(A%u0bsmqa3VZKtZQRi!Y`BahH>uo6dGQ3B#PsqcWzldW zZ?T)f4OA(K3ZJpBFPcc3zRT;^kI*+f8H})t^*w1TIAkbF$xC zo@IxZOCE&SyXvj08~=8QFYiqMq5Y=uNc3-xhQYP9;pbPNKS#PwhE8D*YBIEJ4kLzO zDH{8c6==Pjr2yhbZ%oNwVB z5`HU6ks-QJXw2h!XWGDJC}m)lSK?H0yKA}o&5Zjz?_1k6HCkS|oiX;TBtTnhB=5&6 zHm!=06^r-UkYl`M{7<>bG^e@n&C|_V(34y-f*m8 z0S?VS@?OW15lO`59u3I;=d*`p0`-NLO$LCbX;OOU$E>5mMLMU+AcT@65+&LbZL~;y zez6+9-!gGVW6|(=nC(F(?WJ$|-R=&GM(Z#jXLF0*Chmy5%mfB{hT(4^ipmIVC6sPV zBhyxxDBmR15%7u+39;B{Y@@VYO{$*}UkRobpBc)8kWH+&>@O>|?l^^M(G=>I9Ufjf z^mM;0ha!>>%<^>Hj#VO5USU220YUz!Tx8a#uNS8uJE>h=zOa+OAe>+{44FSU7eb-l z`y^7UK>i+`tUu##<0lnm=Crwfrn(pXaO5OMogmPxmF+WDWCRDvRj!^fxT7tch zE6bieuOYobOSk&nWh>pvP&6J!M%XQJI+GydulkqA9x;^3T4+s3~Nx z^P39UU^>sToI&X;#{BZVBk;m6w$2O7pG0&~!RzX7F*{&)2k_R4@JCJN1zxN64~87H zB23<@Fpg2N5>}{|YYlLcT_;kRU%X2Y)F2XXi6nf#=($(O7IgCxB1KU)IK)Zr+}URuIV=f{`Q_D7udN$B4e+C1T)$n}T77H;V_mkFG&4SX;U>Fr!mufM%dq`f`Apa>)XG7U-k?B z3vy%owI_OQS1lec3dP-Pc*crEh?4qG?o!j-EdtNX%*i`Xl~)FV@#`z7kvZsE=;hYB zP8QcquW+e@h+O)$q~m%p(%<~<77E~qMQRJLoPE%Vj)2umq#dlTwvkXuNW6f+VnZKZ zqpin%S{WkDv0j(Cnx)p{LqJCRIwt4;@tH8W(7{PaK>#cQXMIT!K z`e*U62d)1J3(^iD`aybjBH7e zj4#3(l7o-5(>h5`-p==Eh~sUeZU>=phl&N(Jm60?hV8)fV>8VPIyWwbeSK_oVeQ39#W zzv>U|AC&ZMM5u(#oQYm?0M2HgKvjQT zLpfYjo&+sZpH`sS&k4nPxzck8>AYf6l!1hmcqm0B1Nl!+6jJGF*TqH<7bCe_`wy!E z^|{isF4#+a!)mYRm>4_mqRvS;C*rM*aD_dL}CUbA^CBkjs4c#4P9>@8tW4$_Nra zg0Ub()yq-Zi;t-K0FvzAYl!ueROH>dEQ)gMz+>B7 zhIlg@I{Gh2?7W;34VIEVPmF{d+Ad8Z`wM#~wlV#=-j@E~#c?0=y-V8Xr# zd~p5vt?iEhdvdP?Qo7yUr-G#AF6A|lNcG6$6DFf4{-#u+Ez>Y#v|q-vs3fjHf^e?# z3R3wXsW&TnQfISAsyGmKMQrg&9Z8;vP2z!Hb(}>hu3!9%1;#eHZ#9}4Z17q(FjfGZF${i zHz>5i3JowYPIW?+ennC$n2~*MG#Zon8}{X5QP>OhFUx}d<~Gt|gx4V2tR$UKC-C7% zEj!2n?E570DLF*wy~_!8%~@jIkW<;6>&>r}VCo*9E1*A$87(3~Z6jUXMf?dYk>@n* zz{Z-G7Dnt1PC^}5OD#7Y`suA5N`VyZ_I3SRE&|qBWjW8)t-N3yz7R*%w@ZXk? z?$tKLdgtVzwp@2geW$y$TgyB@5wW{b8o0#-P^@yaltglIliigb1;|l5z;jCMWT76n zz;dF%muS1YSjw0!?9zK(D3`CYsO@EV9;O>F*H?tW=HiQL{(>>c2&{y0`F^=wn1n*@LfkNehkL{rE8g(gzZ{3z z2_9*&OR5rb3q@5W)#yk*&K;DMS4=}puOgbt__m_I;wUMG1rLO+*Yl+1OZ`YtRJ}M> zbW<0N;|*XSq6U_tiJEAysocn@$L(152ogD_reQ*#hE6A{Fef@B^CJgEgnLy&58 z0p4V*>DCdw^!9{6oZp<}|K6g{4a&ocBxk(~J-> z9K(Ox(h+JW$SlRa+%Ug`f&I>YPCh<9Rd?sMnq8%S1gK);XKWhB@7EeB_}_mH>zFYn z|AUGlLkm2p$tH&M^@qq{czfy+57q@B#i^K!GG9`O)?ZkGV1b<7Z{vssxV{(}Z0MW^ z#|Vu8AB)YaJw)A(tN(l|-viMAE>HEUu#3p$gp6OO*YdHrUTI5*7q8 zncMX69k@~Q8iTDxZHX1!H`j)2GkZ~J0qoshY0?|EIqmVs#D)WPv!PeEzCA{j-yHnj zoNEoFRMSCNkPcS7JOl;rt#3YxZV!_FVr;Rp&0ATlK16*q)yg|^qlqE^&vM+4-;N?+!W;w{VP@hYA{8)KR1#wI%T4+WCZYxXaDZr)X@nJ6(FSQp~AK?0s03m zHc>Kwu*l=FcJXWP>9xp4=q;j;&EpL2BqgyGa4in6`LcSEauPfv8h?pjxTOl5k_VX>Jg^g^u zfWG`*E!vemo9l7KfLev0|6-|Z{_Dp8=kN-!#SgCQ7QGk1hz{N!6#5K&GIZ>E%=oRd z!nzJ_td;#3OG#;^LlEJ@$Ay54!x)u@{v%4pbt1@+4eyjt^jI$h8q&qr&?ZzK^#D`9 zHo8lnwstv~{!N^5;eq+AtflAXde2*62}dqb!+bW(D&pZgdk95zBXY_c{-zX4Xny(h zW<>m45{Is`7Bbf1O?U3o1OjSzDET8pV|VEkA}9F7_9@0B`Zg2`0(br6NuW+MhBR-* zRC+b$+vNet;A(w8ao4$I%JEI+BHY(zqjl>)c#ttQ=Bv!dqN+SuFj`ojn3>%|-5DtR z6<(nRWnI!Xs`kiVR{{`lLjGTSbDPa8nbh|Ayp9Cc0y&%Fpm|^Xt~b+-|3yt*8`aY2 zwjAa7G0R@qUv}-#eBbU9?jUO3t*L?F=+Y)~U(&G5aXyg0E)TZ5kSKqS6-Y~qdC&NO zYF>%WXp~js+GdyU*je=rU)rV)#L!$ehn2jx`eZ+wf)~AP4Mvt*OI%5+vBQh2B!=u~ z{c2|!=xT)q;4ro|7kvC-2P3;`ED>+f_6wBmgu$R_Tw#d3Uyzx+TY-ZQrKoRn2=93e zkrZ;57Hj_6 z!_LK{$QDl0aP~q(pkkBDhkL@%{NQ?o!Mgpk(;P_RgixYIWBYztGsVYsYzUV`9IPlVpE9%*w4 z-9?H%XG>V>4uMf%pgSs{_ugHrK{01M7)DywG`12N($=JtV^CI$W9sTE3)1o^LFfI5 zuR;Z6twbGo$y5w`l$}!%;X>0YZaaIUu||Bi#2IuJ)KP1jwiTgw_|0=i0yh3{{pU6g zpOeW(>9Oef;cC}|P!!Ls!Sg{l7oF;u#fN5NKz9VoUMuH}BnkJKopTtF1MrhZgLv1w zq)>$=nN`@K0|!Fn*NZi2A3Q9guyp76!z~e`t=v75T&}A(0_d0YWQV~{;PY$}iSLu@ z$2^ca#O6&jc)esT#PI7^BDl}nO@=3|x86?-1$DMOc%a96n3|zHV)BFmjf2&VJTmO&9l@okl= zn3RWEgk3My|l?%|Anr2O@I#<}{} z7r;UddMs(1+WLFvcITQJ^*BlSx~;BKijymWlXu^LqD5B%KSUYAO|ANn0PmS#{Q^^X zfP$KghMB<8&&V?FeaeaBj8Fd$S<1^06$%}@1*_QrbDsi zH$kfncV(f%Q0Cox1ZV?K?6&f&(<{B}_%xgZ!irsDlIcw~#?vsAI^G20P*&ZIWqK@T zKFAcG!N;=}>Vg`L>f3Bu5l7ZH=l8sSPajoML73scE?X?9p|9mxg8aG1P`2yWiYr2L z7-}49p5{cYlx|fQHmoq%@|$N@mLF<%<+i#tYNFwZ>f@8V8ki7A6D=aR!b}4tkJrmQ zgl{AodiLIa!@SPZf!FIhS8GLzs3j*<_sXtA)sw_+M2~;m&A_wl+K6d=l2+oTwtc?? z<=d6fnvp5`W;-HBLCqoRpu~oMc!1+GONvwROWp6JKf{6Dcy6WPe#wOvV1^eXFKu|i z(ZxNzz5WtC%0V{(D<0>Q!O=F7EZj^IR{!07yaE`d_u~^KK{Mose$TjSLosf-SC+=E z5Cy}6o5^|`qDUA+4#o)q^alwSdp%pbr~acf1MWVrYV&@BfnNZgCsnWYuD#YAYUX8; zex73cE-I3-?%00wqpGVg>K|x>&PDccVh!Iz36{kjGh;RHTzp#b)yp$F(R+Q~R_YJ| zSOT|u3ei8ckV8~#?`CF9RfVix1^^ghj6Q$${NuS8O)2lpQNt(+ zAHXfXE%{1X3A&R3xH{n1Q-&@OK_s4oGTrGz_1h1c9gg?Qd-O?eSFgKPnyX%xsC#-W zw@R-tHmZoQZA^syY$=tK5@t^y7uybM#M1;&pZr_mowa2o$!{J{J|<1fYHIoAZ~tJ; zm#9rb5iTwMMn(ol+Agms71MQb0zv`hA5$g>{l-j}i-$mI6CK4hl*YSFF87(A@zJK* zrY{0?H&%DLwyw@T(ryzeI3|L5CQqAx-FQ7A_giTbsM`L7fGBw!Kw(UmkIPQgjmoCc z=W=>J@z{H8^(i+bA361C8dL;Lu5zmkr+(!Q3(z2^bqohT98yiWWf2JfL9NGu^pKz? zURE9CU8b`?{ZZ-qC_i;n?4NBp#Y^<*XsIu)xD>q5^V{=m^_? zm_itQ_PM5-KlyzGVc#A%;`#`Lu98h}UOPb~#>X4j*gp3{GYd6{QTCeThIFjJQ>XBYn@!q}z{tT~c z6xV&)T|`i$auF;oe=%4l;y+OGK#z~>6>A00&+~wpV6qu@fn!Q@aPIP`u^`iP5R_(z zc=i)0*C2ni<#-0EYx4RAEL@wuUuG#G&5?hu3v$0);q#1q6Z^RZ!Uv~@QkZyBE37x; z&VnZY>q70_BpPerKj?$@aEI&t=SBm-qyKrDoaMZVc5}e1^$&>6M=GN&LIe5E{esk+ zT|uxX2MFGw5dzyjYFChsXeN+f|2GEOB(?;f7Ia_%8W)dlof6Z%makkuxL`~N?wLDZ zCzroBxeQJK{D7YvgpJhRR`Mxv{syY`DJdkNNlHKx*N}4$lB*Y;|G^oAqMyw!VPL-I zKmP>{wFh)@uQGU1>CF^1Nmft9?dE#20vF{PPQF35Q@9F12|v(~|2#^(>b05#yBC*Z z1mkGp$c-m*-~X%!PhNYuw}yDZGqgAm;aoa!Ny1q8 zP?Kf^8P>&vg*T&3b>mqPEo<{z(j{JRFOrzm?{wba969$!4$=8UAZtmNZ`7;o)e z9PLZ_n>m6)Og8K_weEm93V6QDEh|n6gtB~da1{!!%|?nyxyPLhMtPkj=nx%WDNzas zj^9p#XsEXJSBv7p@y*pC$0RqeSC)<3MjtsGfXy_1A zhcb6E699KhGmBzfgG?;2`i>sVu%4$x&J8Hxp0AK`q5EFc?pM#<%Z0sHYTZAm>mbBI)6+LNwC72 ztxRJz7`+ySa!-D6RIfti^|!;jdiUHZzg=OxeceokpCtysBf_DN zB6M0g{Q8Fs$i_bWe)v=eWyN!Qm$`Q$4KsLcH0-Pw^zZxIF3%ML&Z-2qIK5&W_|5Ti zD1tE^9fSvj#vij4j!*pWq=3XPNxbAo0w#1MH$tqHU{@Sgs#jNn`IP7iX53c-)@NI} z7;w8>!CDHvx&dvu+Z#Q5<$Z?&LC!xM8%I-#@$~=(fQ4xDR*nf-2nXQM$GK5P`VN1d>N|jgcD5gKd*c~N<+YQJ#HnM871sd99~1Z$2(?S7myt z0uEG5)&CVQeC>io@_7hoPPu zyLqY0;-7<65DEki&Yx~*zNlDABBiebwW?g9yY5=jKqR;3CdQ~CTz%KwWcE{KT+p`5 zgYMvG%&Z0;bboy5HV#FSXysZVOaP19$2sVr&Uq zmx9KE03Aeb;o!*qGOv;qnmn~L$H??n1qi}8;!SkpaJVyd5G~}RD`SEk%Pe;Z5Gq#mR>=YK87e0qz+!Cw7b2CUKX$JSOb{ z-{=N@J~07)kpPTV+k;X|;{8O}D_c?uXeEa08ow}z+#T8@;Pc!(%2L&O`j9CgmO8Y2 z_Yzm=)`pQX8LYcT?}{pHlK@gEtv7NsgW?;<8y-r)p1O%1YbjJOE^xzDa4XS7+npR5HKu%n$ghF8a)2QfPEm+ zAMeoH=Z&-at#Zh`m7%<%kuAS6U=oaG<7!(LdYRK;2Mdwq9P_O@0y&i`gA8Z>%xBkU z5WbK>@^TV7loqLQnG!=+pNvgB--rRXUy!p?dVB@pOo`L)sIQlZfzQ?vl`9X9@eU>E zvi=M}q&R7;+ZS+XoM}Hs*=D>bWP2Qjx#4fl3WhfYa#vD% z`W?@{T-DBL_%tY{n4^~aq3=4k{x+WAXu0!S74znQH?KML-Y88*hN^c1#a^2r%y6P3 zf~YTlSnzP#M|{R_5kUus{BFFsar~4w{eP<1N3Yl5eIFp3y0mD$+!$HQhp)d)9OHL7 zD65&ZK%at4=$YoXbA^f$bbPS^It<{Md_iW?JP}~{`h!@^Nhtn;8!P%A>g;P|S74!) z|H68A~Y44KG7=XV0Ovu zth5-J%+`<7WAu0s9~T~umgXOlau5rE2O1VVn$jF~L_$LTwvKmE zQK;NDpAG#%Y_gZ8j&XAbpt*A8MQ^c8-c=B%-jG_AlIKdHB+sTHE-2rO8D(oCb~?pO zZ65Zyes-vmslIgRR;~v{IjUUmY+5JldbSH1;4Q3;9rBpq{3+v1#Cb5}C5T+QPeCQq zpsg3cF7S}Cr7GM-I4=dk0dzT*=VF6^;4P?y+*^0BuhS2@6AL}G%GaX94LSVU{_H)u z+=8nuDg~3pR%WRXLIA9oMM?yprT^%z-6G9y84wo^QRgr}1N$OAJy#NXX6OJN#SIqnV?j=Q>N?HqB#Jq^!Mo_&ndJ04?%p z?sE~bOE=f?`k48B=E-nZ{xsl0xOd<{ReT~=-us!rPTjDhwfHJKpmq_`^^3or7U7-J zxlE|_8)z|5TaVsb-wlqBbNp>A!cYB_Xprw{0p5YECC#GJ$)Gq<@$~Ztq-iMxJJD?O zkp_qQvF^MPlyiUn7pjS6+zPS0%Dlv$>;n}*;jv-GX#9=JKTG%8YmVaYE^7anf2zH- z31TlA1z2Gz>z>4zW!I`Nn1`iP3(C=oW>Ik0HURKO4Ut9!C0|EGlU68Pfy?VlcD$YW z`zz@E4bbanFb>*q=rkFs_AnstBA{%E;>b6`vNXX2mai(hcgwMq-#*U_-PynTshDur zn_6PFfifn(cc^)EkIr1m4#B^VzU&Cg)$ZET5x&?KwaGBFl0WX2z61W%4>x^Sd^=?R9nFx)H9J zt8qC6(mBI5yLYmMrkbT9xVZ4dKE=;r154R*biXE&9K#UmY8rGp*wB2jg?b0l1J_K8 zCQ=OEa-Sc$tvjij=zN#=O3ojct#>$8U@x{r=Qfz@ZMNj`9l3>h@&eO3^Vf>(-E7eF zHO_U*zmWs9E74hG%2qACb>E71BVypy``0`7TCZViIH%er5Vh;O-tQi{m!{R;&lRcnMja5CJcS5t$1L@(m1BMgJqP%EoR<^O(= zHb`4Jea>Ixtg=&MJW2xmgg)K}TKj`kuHMT_*##jH+sd;#;^=X1b*;&S(1<~6I^lmyX$u7RZ zp!+q1N{b>_T*xCGIM8GP@ShZzjG1j~vqn(MZCx^KJN?%Mvu|0=k(6P7#(T8kIvIVH7-`6EHpge(rvkp~%C!>5K_`0Q&;|7wt$XR_i_OkpG%$exX2w z1IfXP!+`09zk?^qCA^pb9Uw#Xf@pB~F?irx|Nm*$}=;1XFryn|ktZ(_I@d zYv1t#4p_h-SJh^&S_tZrrT|NAPcF)osu*QL2(W1xT%uEB4b!9f?-Ep0%PBlH@jEzM z!tsOu3xMmDH_IKb5;n^7jTFB377FIE^F6pd@j^r zrd77-g1p{nF3J^QlV^oRUh3OtYDjqnKU%;vpk!uPx9JsvzlDm~gDyx*fCyp`Pp~n{ zowTKhU1!FBQ~n}e|8WC(SNZJpN=`>%oz(cRD9SMYTr_)I~n0>wl0FAStGaErJOUa z`62b8`sP1GP_V^;UIRsIIL6Wn-eEUBU`Ya}7k6;Pdw9ql94LqeLfywYiL9!O$}5-N z7@*epUW4JJ9lS?pg^cK#(;5R!TEkv)YC#nRTJnpTHstrSH0w2g*g}~lcAH9Yn;j5g(Nnyo@W)+ZSYf0(fP8(?vHP36|{>HIlP!uDtxBD(Yq>F z)mp5Bu~159OmY--RiV1pbcTW4#cQ^3Z^XTepBs`GhqNs6FC5GKHt{cVZ`PeuxZ_+N zF2|{$O{TR-Xsg$;3cX#q%W&68_@n{0<7Itwlld6{5nxGLP!8ojntS*t~uCsjw>?DV?d1|5t%T2t4D+txh!mXVi9Jv;Hr z=y;SSXNyXQy8L|xy3W!lu8CyPd6hi%x;+vXRAY%%S{MLqpOPjgt!=A~UMT%tT~(hi8YU!!`1?`4&v%Ymx&Y4i z(38Q}DD&)V|=?WY!d*8}8p5ros4U23?_2 z;nS+0j2Ue^Q#jJDt{?BjC900oC6ShU(F&1ukMObD9>8%F;|AJe)8vcJIJ*6(R&{Mu zfMi1scAg}-wqYd9L%Ytho2Q=1Y@$j*Pssxh_|-3BuxtgXip#BY;od=p`n3t2U|i&+ z2tnYUFeYYif{#XQtWj~RO%dxTn9I}}gZR`srXo}aC)wlM_SeZex#GnKcNYAPug+^I zh6Hk3@o6NSCPcWIFkk)S)SqMb_+{AfTw8<7E0;+OS$~a7VGZ}`7n*0wQ!GYi2ilqN z+SydD;?aKE$4n!RAGjS*_>6^C`tWy3TxoX{tg9x7w!}WSyiq6&5DM!rr*Fo+TPHqS zJGb1%a{5bSN#tAeyAP>qo)>29o!Sx28dAsBzV7h0N`_Caqd8>Gs52Y6wwCK}F^y3@zj_x6bN9mO3#tdxSYlvnd&n`&9g-?f%PQLhFLB~+Wgjs9 z;8kn5p3{~aceGY}RXS8WN?bc0@(rq8%5g4kV6-ZeFP(5`+W%tKEbkLBbo=(g;vDqV z=wdc;{c|VnWDpjkmR!hnj%9G$|A&`j9bwddVtyxKYueY<323n#YLz2Y2yVM!$qSg% z7vpXqqKdkGB1NN7%LVhkfaJK+rQX^9ccJ%VPN&a$XON1n${&!qubYOp@vnxjrxsP# zK93FZ1nx6albV}HCP#&@DHgd7p#D%LIz`J5mR70W&?y~3RcaZ|*7qAPt>WG;A(2sK zTadu>1hu|C6V9m+Dsj|dVYWYY+=|K*2eohJQ7zqT*qW!ju#F?7wc{1dfsYy<(`5p;Gpk!Ksx1kVQIj@xS&X0y++~ zfK23IO2PJD+5VmE7>=oRV)lg@{9Bd%nd^Wo9&bQrJ44m`pw|TK=(Kois&8)FSz#jh zH^-Vp3H&p(F{dts8e9L7{^pF9zDDj6IL@EyH{T~O5iBtBhYD)f0_qmFBXsOyXD1xa z@MY!LF8M!1h4P|@>@DnYHEYi~OsLNro}n*kx<|L-xOW~2iq`fK9$7h!Y71*y|ByjJ z9U|VsZpdFdCdrf2ZTvD;7V{@(!Io9qTN{tChJs3<_&Z!e?Dd}dcxY%x+j2S>`{_i#Mu_3 z&o(sYa17iH>qfH-vpbNR-=7JZvU3|w+1MQ4tqhWDx#+ufO9{kNe$otja~e7`VdL9b zQ3G06XTrSxM7_?n>hoiX0K2<6^_%e#m(TRVQr{CkJ<<;l51$5Zq(+a|va#7?)xu42 zlC3y18!O!(!z?*Bb*s?f1()=S@NfL8wek}Aia*(!wBviqSzXNDZoDR3#X;+#+mr2D7o?KnD)=9Th%~Orgp3P|;8~>1gQD zxSwUISCiqn_4>>dq3TRrEuC-pt+?x{S;)df7aixymBzNQn-os=$q&hI)}Q|-jUx9vI?LP0X?AC;oM z`-@qi^_c)p=n17`fy4z=X$K}8Lk67f7B~xfxj2QWP^br8X>LiH6xqiIz=s;gPo{q8 z?MocbdZW)d4S!(|?XhV`&ysnSmuZ1b0GHm{E1vZ zI^t6PjshTLigQ2{mMzSx`3ZxjGL&J^6EUN_yqK7z&T4jLejK5bK1oXv?A$tj?lT3om-%9b7GEv4>x4X8OqzNzTZzdSS^ zKsKzw`9pu(I9p!(>M({upx3ta_WL#lY`Zs4l_4>98lT}q|D5@OV?HpyDTcDZo%}Hv z<$U3Hf=BGv&8%?6PZ(pTjA{6}x!fExb?mb>ajGv1N~y(U~6 zv29h5pRumjL?~P13;osS0|(pPvq5MvHrFZS@Rzv{2I9QPRcI{n@(7u_*H$! zCiD$>uTNnB*smMAt0ytkof2DD43F}V=pq;y1IZ={GvkM>l5l|Z3F{ru~3x`x5k5@R=?0nv|wdb|KJ z`8x*#>t5j)%Wes&IBr?r1A=M+ylcpApkmyrr-v*HS=CxPOHVMyYk=tVsRyEl&0J=s zNTa7cx*GJt_J`reuiTklD%+lW;mu$QKTJ_YPM5+P(}XHmv56Mu(4(CX1+Yd-AoLb$ zpj3~*?uP-m0CU4aeCDoIm*|560E88ryD<95t9k+Jh5o{T=z7~eP4Fmh=>^{VcE6>F zY%Fj)?}S99E7rC3j}>TSE9|$j;j+IwHXTe;+mkn*V&cVFlfNls_7;;|5P&+F;5vD zW7n7jH5c}xRZTISelY{4?%hhdq30BTZfu2^13!hFI7ks3WH>a)tV z%;ZX8+Egr$5-xqg8a;eXMz))MI2gpd<=E%pi-i%*`uJ!XWXDC*_DagxnvGR3|7!kBw5{==U&AUO-0-|IJCHv8idZqCHkI``~L0kFoew*H>rLwnhu_0_bs zQ7lYEvkw2Q0_VG;iz=Kb{LlfHz8mCC!1HF!8C!82f3$Hu4T{3F(@Td*lgnv1SC4u+ zNOku}!0SMYX(&Yr({6Ovk4B#VT$^>5c4od&b4Klr`c#?<1^@7d9Y#TxD5D|AMUxTC zD$qB>bv3V$!my{Q+TN9GZ{QaBDGd%?a9}%2e26A`l?sIy_E{>Y%d+{EBcaiRd08#t znz*)_K_g4p(rm(QZAlY<n?qd9`;k70Hi(mbLbymk3ZLdr|{vd3W!N*S|8F zd=WcSLIQk1?q+|yq<VbwZSD19v9VbsVa=Qj6hIyUn47Ro9+$IUUg4GYFoG zj1+#PTt-2;rZ_^=I(FsFq}`8vbMg~NY*%9`I#*CoKe4X?X@MQDEHy4@_WKp*T=aB16}j4Pn-H|=vHMm08VNS$k?+Puyue< z8~WW$DuS&3a$>c`cPyT&rpCbRKY}@{$^X1oID3S@aoz6TmLJiAjg3N#5S+h-o|41# z4*m2iAq~AP8{d1>EnLJj6_;hT^)YbXLYFi@ei%UkHO}5rMrfH-KFGNzgogN^X5kjH zkcUnKYS;%PoIsBu8D<_(%1O#*v*+~kUq1XW6jru(S2NW2HoeAA<6ypo;Y*F_QwGxaD`P21s+o{g&icm>tY{p?5sk zPqJi9k-4aAngOx&c^dJ&Hl75h&KFjXD#S3nFPuDEDDa>*ycQ#XI3NSpR`seT+7Ylg z>CtAjne?Y;Sden{Of!&>dL>ZrTRPlWu49KhvCv7d6CJl9QMqACU~HnlyiFs=pP7V7 zl{kS0QIy_iq?@G?%J228_+_+y813t>96V)(H>G0aSuyx4?ybdNG%W*17RdlDbMr|g z@M~5aw!DiLl^JdM#G1>I=yWDY$Hr(OX$Yma_fcYh5(>&LmNh()qY% z5)M3p`#uVCAXPn_>q>b`Wf@>HMV>0=45v5=IicNPE*LhOYir9rCS>sCaiWgA>=u=E z|L&4*gBFl0S{}Pq?-@$*AOYhr()A(@1im4&j1F?_@}Zardkf%AtiPFA#FkF(=0xV| zif?*~qF3*g*!P4VBPmav(xFrcST|s?#SyvHW;6aRm=)lg5Ls_+Zo7nrti`H%n3E%a zIyQIRk?f6@dbjw>5(k`kLP$Z$805xsPgoG6I+Hi1_J>J~-}#LZ$+h2Mp}C$w2P=A8 z32NW4(PIDG;g1|5q_m<*lph|$i+KG{gLjm}#d+xk4iF&2hFoly*%#z_QQnjjd4oCg zoTHWxY1x@CdBl=fCI9J{y}h^Enq3S}i+=#WAr>!)p7RBjAclbxHoJFUX4OA4E#XIk zXs1(v7zBYn3wr@2D$hOERB~ocl7A*+z4Xt5JckL?Rn)(yK{exdw1?RLps?YSPA~ek z##6j338QAu5}6SR$@QND9^k&Xz}lAE#-s=tP`I!we#&29+Huri*&=<7^XEpUe+l?Ixw_B4?a%E~HXb(M zfMxDIO*FB`=5AHqh`<_kZ$F^&KaiZegJF214JrH(0Ojs3(bHgo7&r|JVc1f+LDSz9 zJiq6Hy9sw9f<*g>xE|6Jeu{Kn+9hD;k4b|TG2CHNtPUhV;=>27sDy2lOcQf>hzY*F z{cpZmS1@9RE-HmL!tnkFIyitN=dD?!2JX#2LjpAT=3|-MJ3x;PRX9qQuBqK?B*1Sv zxqxp!z1Fn@ka`)=asQgi(%5EIRt`Wl(_0NVzk{#~%~ow%Xt2?=aXA$ZkXJQh67^-= zWnk8J6r%R9?O|lD@dnmo^Wg{;#p5R}Kcfz4pm7h*k=um^7I&-PF#)HgeUw%L#641# zaCo5bHa{5zO1Wy&l%TkwW-=2_d6?ft{o@6TVZgpA!ow7}7nRIWa-<`|rToeegEBbU#WvWnAqjYuGul@6`0qqzdk7jGzdXh5&jLiI-0e%9XnHRv%r5t4d}`i zYuhF7_3i+t?a&a%5OSFlz@(!h-&_Hl{Fj!QXbf@2XoL0Q#OFb@ismH*x{3n{n z|E;#-KhEZtZP0-dWW52vr*SNfO^{L_9N4r{wR9iv?Bh3=p`oF|)gqFZ>TkO7SS+k3 zKJvOWKYcO&YfPXsS2~U5GqWSnlT|Thjf>ZD=B^3OCn6v zEPVc)*)%YC=J#t__2*Xr-%E4qErn8-S$2Z@gh)mamhC*c?C4Ls-FG3j?fhhr%wK50 za1JFr_RY0FV|Z0zg`te@N@7|LWwN2{a(R%QY>bwS+mFVaZTIniNzRVn2Xu9E)|m6R z+ToBE7t)NO5hbOcNINbriaf#7()Hx=KJbue-!S3kvp`Pj%3hNxHATpyP2MNF&UzMj zxB8;?8`uezT&c#Yz0R?VIMyf|(MP)aBTwb&ZFw{-y$3F>@F#lw5-!zC4-p`!hx6j+ zwms$_0V3m7R^eG;aTLCgHamxK;C$bRAl!>5YC%^c8l$QQV_adpxn z?4DFS*F1rYotYQ)_wA}ZL`nOg%Imc;&27rnbv(HUX1~mrVDeR*MPz_)KT={?b zlvsMGIf66J@`+(0T6(UXazUI|lEJPopn;sP!+u1NzP%We&h|1rDc{n87-Tl-@3XP9 z$#wOA$<=^DHBWoVEsfv`&HQn9NE#Sr4@ZGE8}r>0<_EY!f1$bu06 zAl;xiyzl7e98rdEUz@7fAWPq;O$KeUcX`aA2LrbU|NZ+nGX~0&GCPpkD~n21=$_ee z=piNcD$vnQ7DL@&xukjuCTMo??_iTAB`ckMAd610D6_WW0SV3^WbFQgGdm5QTw$-V ze=(BvZQ=M+Ws^nUg}IpVe!YWhR$GP#F-N)Iw&7hUY^!iyBr^TMaxVin6&}&&tfNo7 zG%Cs{OxJZEk*NFU!1@O9uY8SdYxKZHiOTVNIH9Q;lu%Z(d-k4<0oEUb^fd>x=|x9^ zcn}lQw`D1kw_@s}wirJxeNQs4l%$}V8NbVa=Z4l52VB-CaRB^#s3B~G95dGtEQ0WB zC*7O>;q0t};^^9Fjk|k-TYzA}-GjSBaEIW*ZGu~H4X%L%4Z(GAcXwuRXYc_AIDG%P zJ~!vCyQ=H0UDdsJZ&_zO(?{5Y*NBIzbh)4YGA?edB8|_CUfXWgQlo53A zbKdN~f3UX=@6V%t{>qoI%G3p`1s`yrDaFI1L|`UDw7K~a2?G($5n+!}(;YSURNuM- zGvXoIU-`qF*b?i1eojEjynUwmESKL~`?G(Q?J4NHf|^fb$kq+NZ!`IC595&Z!7%yA z63~nfYgets<&U!k2>CYo`H|Eo{CpL^Kn(cDx{@e!Rmey)u{Pu(O25x_c1t$W95vZP}BV33(kWih9&Nej{CHTGs~=hH@SLUbN*^HpL;8v&Yqo zCjxx4d_@2YXFYeL$dlQ8#CJMB#?2*n8NXv&yQHPgktk6(+l9y^zwoc*Z}2IOUo8_k zL?ff1!>0dG`57Casy6S&wiA?jSBkL5IL<}lUe~9-k=JTfNKDiD@bxQB->k=EHm5bM4)5Fhh)1d$Qh=<9lKfeLq5+STOD`MXwBsV4Dli!AFV*l> zA2c56aUb$hfd!w@?jTF#*mNOhiHs1;<1KGGnQY02Ff`TyyOsQ)_E68VC%)C5sqE1s zQg){t`NMotK0?I1w;h9m7k?|DDcMnpKGW90y-(T;BmjEQ>$;25#r=GmxtHUD2rzq= z`|ulZr%wskK$iMBC%+KHiuUW=7Rse6&o|HJ>#*9zgABicMsMyYJQdM1#oHQdn7fio z96DCU52+`z{&S;YwkhO+R|WXZ8a=5?#Ahzph`~x<8}ar@*g(8-!yDF^N23J|Lg;sb zKYf#^d;JQXII6vKiMY^eS(+A*G1TD`T=S!ZSy~hDGj39Fy34A9m>6%>SbRZ$m*IeX zoLzHI7Xf76KBkcczemVoiV`wGq&MVW)HOyEFCXKziFSu)zyf)1u9RG|v3we9b}Yd5 z7awwHe6@^el$APBXetF@v4X>K>|+{M`NOxQo=XdKx*<7kjNdyH0O1E!u@gKpCsd$G z4X2D=$3CE6qqu|*=1oWAExt!`?I9XP{p^r4-=!Ur0~HOVm2o!h0cYZ5%_Rzy=zrSh zHS&alPdyHVA4K_%dmkzr_uIPpi4=PU4DyR}n-?z4&{b*b1R>Y2bMlDzahLo!=Hp? z2*SrH0JK5Ad32@2Ez7;b&C3=JZ=!z@sp$7dPG=x}pnV@b0W_`%2W$ohu<8+TMVi{9 z=%k|n=w-n3l)dOc4Qs^gViRv&_K{m_tkbsfL+Gc!HTZik6t+b9 zOi;{HasonR^8-Z<5uQePpkir)=Tu6E61y8l+S{WfaGgfoUHkVf_0{*yox_bRdl$-D^ zAPiWQzVO3ISq#>q{)PoKGcGn;hRNf5Z4|hikp4JB5~5x~g!n-iHe(Ci3coYeN`6^n z8kcuVH4LOh9Kx}>PDz}>1BeC{$BuNJFuKxOi9MYc@xMWDue5<&O|b4KpA%>2E%}B= z^*Cy5Fgle`REXISN-fciG-MY$_xX1MbzzMg+V|6*kI)&xIAs^z#oC|MDL4qfwg~W4xZ+1mCzbVe zia%3Kbnm%{!8m-EUAKi3l7G%e`BO7bq%Fq5P$=ugN>N_lNEb85Q0(>v%h?&O8}|U@ zi5>0w^N^dwx9sS3)7mAm49(rn0YH1C**MXMx#zvlG<8U9*rYYnDWVhc`p0uvwE1oLUC`y$uGA9@RVouLDnsTSIS4w z4Kl}%*f8NR4eQn%Ts0cU-Aof^>%c#bjAE6t0K#gy*}0P2>>?=G?ZUCvJHdxB`a$T4 z_Zv8d^;p(WS!rMKaxoUfAchqy`WGrdD}AZZ$5{+KAhpOhj=aY}%2{j)EmR`?caZ4;6p! z@XVfSP4H3=_F1^$-p(!h;4u&$;WX-#|Lp3kBZb5ou{62$s- zMV?)J>2mBqN!Ts*>-twH?Uo{SLagl~Yo!?Y=j0}fW+A;Zplc>I9}76=JCa|+er)jJ z`+VQUfZgV2z#_y7a|V-JxCrrBT?TJx$INn{JxvxH7$nv&s1zoki3&{M33p@uYRK~L z>qzfCH_Ts-CRO7^i!P$Qu*yrXCSvQ33gi3s=~4>sxN~%kg$R0+_OtOsC~1JUk0syW zj~w~;0CzodtF0y~3KZ+=*aDEiahR3xb+hkRP$mf!NzDAkA-dWTx>0}Ur))<{^}@!0 zQtYot-`1G9Eg&0}L$cfCkIZ>joiVJ2r}$%4DQV-RGp?ADDt1dnnHVM~WA1sqrZKPa zz?=!Dy_pbR>qnW>`K{ou_g37z`VZTY14ut<;=the11&X6l2E$2C1zB_2zw1*SlNj4 z9Pjpuh7p6C5iiVsc9B*(7v#hH4n+G`Sd{7)l%<3toM60t5Yto*iCJSM6Mzc)3z!q1 zb98d0drUM7-b#EoCrew}>6HKofn zB3}|+9F8#VTRoWZh!zZ1IX!>^t+jH-ir-o4!r&Ha^C&3y6Y>qaUO>cvSw|w`zPj{c+mn7B2E%mwbpjjq47gOO9 zw9ftz9l|{Ib*2mpr|%2ukR4p^tpNMX&X57tWHlgaDEm@q?_}8HmImMS9aIDf6E#X5 z^L&xG!iyyoKpaYmrwHxX<%56rT~S6*Lh(s=T2}*9??rSdGdOUL-ikt9l#Cr+D%DaXHVHyaZI37Ni2a-Mw9rdSdLJpFCyJN zAVC5$OI&+v*(>$vRw6r?Z+LlgT${WGv0(%YmnY&;-C`od%|X?Tq^)aR{TipVUt+d= zkpUUCY)2yy<#5_S%hQ;uq7PQ@en)K$(d5SeQ}ut-*H^9RtASPyrV9QjPFlkys2T}+ z!kps4nLi`z!rQis9Jk26j(AjZ!yqpT4&%mZU{3A47yBq@A)OGjhTmX$`_1*^&d>Td zE-*aRNjd$b_G4W6?4^fBTffiwqFI+?5+k8@+w&p!_Y#T&uC%rwA012}9p~Q~cM@Fd zRbH5qaKi)8+KO9?UqP8R&dlx|VB{@oohwA4-rumhiTJ6PE)m3_kt5h0~XH$P}eWh+AKj@?TX z+x$_RjVYDe$T_B9V!bVc;L&D+Uccz3if$~P0xGfWgf z!WJ@6;^j&F^~a@S0fPJfmjL2eg|>gdShM>Qheh$*ZUwU-SQSCly!}Gu&Jv7{HF1Vk z-#)Z5ftrOPh%3lqhmJL^|4B$J`f~CIz=btNVKYt4@cPTEG%TO7rBL4~03Lz*I|*`>n4Hn)TndJR~0%GJdv4#a#>m`IXIxh@z@`R!8BLCj!WL=WqhUiNW-oFPV zlS3t6b$qHD4zdWVJn!;uLz~Mn08sM$pIBF-njEa%f6we7JF{w9>#a9TEp)3{{(i_3 ztX%<@IZAq_hx+52-k==|`3SBr8Xr^hZJ;Zubn6b^NAT_b>x+m?%CWOcXw>%a+pP|K_v7VF|AlBRvUW{KaqXY1a%NWWt{d5hzN z7*TWS4X@G>#5OPWs9yv`#jpIG3lGP%Nj%>1If;Bb|Aw{9$wd2@I*vV)0e*z?$jfK( z?L?^>dSQqRMi38p?0SaRf6shi^51Ga32AQv;z@{ttEZXtg6u%1P(#@16SrAmNu$4% z$>Gu`z|Mh!Z^LiKe5#;*DjZ;J!I>$jwm2RKX}Y{(JtnC~usYkYOTMA^jT-_*F& zE79Kbt9x6+{*~x`U@o7d{AAuO6i~Krb7d<biZR1z4-l#F_}ixqwLo+EgEic$1I1>taA^P7(iEdV zHX$Kf)TQCc3QLQZVuwLQ7Ia?iW$7Se*a-UP)#0RAql2$G(X-zcmLS@rXJ}F2yu|VpmmvYREP2 zUhy)>hUS6pjp0L{&l4cmCO!6b{kmI@V1cip#9s*_YwUSoKf}Xz$pv6b0ap($SZVXE z(;mGg(UxabY~%nG*lA98(d2%lBI-ESGcznrXW&s=dQS8)+cmO4>Ltt>RbnxY$w(`t z&ZvU)e55i&06b*=oonMh4`L;UT2!E9=p9Op?%y@e`Vl5dil7@j6H*|RVJHTj7%Zxm z&5*|gZg9C7Wu|XpNDk~74NI;GOi6@NJ5DJ5{haMGvUukkRi;fDnSy3h&aA5wnx=i6 zzXgDU>2J^uIIDn%tOt_AjIzc3DG(cr6}6^E{(f)xSxN%f<3Z9F$OilLgn7NkWn((Z zHv`}*nH>KV{;GfcDJG;`T)K-}D#ft`RYGo42HvSno}Py92?b_~&BPAdY^9;V=91@! z=vGTr#ri|~;&e`M_ly_9o{`k`iej=~c1^ov3-4Or0sgW1L~eb; zh5Dx)iak1m?u)NxTL2Du1@6cOrrv{BM$tsgCq1}{n_PTPrw>FNb2c>xC73B7OD5>; zNA&KY3OMhsDpU#Y`47vVF~O>c0CZX9SQV0UOobB||2!RPD=Qj3?Vz^al5zy*cB~<1 zl0*DB-Nq2hm!K)AH(_gh0UYrDi9nwbu^VJ6HQRX*1s3p%lCuwSy;s#zEer}V12A)$ zFGNwVJy~$U`D!_L1)*>d>vGBA=!4cE zqwkk4-cG;C0ZyA;mI(a*-|~xHnrbqfB1Wl#pdG};2_Pfz@iweG_PmLB=HZmbmLpH0q0l6^K( zbqPv1WU22GTtWftVKL?7{c>r&Aeg-pXNO7Kc$IFy6N!$p5JVYZsyL;*`uhkmYEcXq za|SK7yCBjBvGH7>vdoI+lVeVYndu?nl4E!0i>JQ4pN!Q&2a%7{HnLVA^x|0N6qcg^ zoL>48kf00L?{9WZL-RQysZ)Y~OY+m{az+mJ;Y6uFC+^ND(=~sn$ja`+VV+5KZ%1{a zksO3Mz5(wK{KB`RJp@2QH=HubC^;vPwPjTXQA+SoDQ#hBOw}6ZcXH_S!Hrq9)6?4P z325jJH3#WB4FQN81dY%(FWo<9xgq;G9SDa)O@h(&rv@uY&wneJdPj7xC9B5Jv8QDk z_)>~0VatpSx9-8;b0LKA%Ojx2ZhS!w2|+^L(!spRoQlJ#)~!r^^xg5bn$=W0)qN`B zBo<5ggqif17BP?I$! zlxvbGYPO5a==U79UT%_!MuU;1Nw==O%gY`o5yZ1`(7S=wx@)vqeNN+uoq53xd4$=%YtbFvU z?pUcIEv_9pm+pDaH7F4WVa1{+$q6Q^c853}|8UMS|LeGTkn?yL+)L0i?+8uzX**o! z`5Ia$di|}Uj{-N;dg?C@&LG>D2SL-DA=@8=G%MK{DwYkG@=)pL>|Zu6NLROah57R5zWDY z<5DXhCWWdBXE*Sm!}{wKc6raZrMlU_>y}TIGZPI0YjoLQwgg@168jsLaJ0%W7#HDQ z^s*Wgl#5zMIr##3Byp7x<&qw-t|vy z5yF{OIIE{u~0n5PFN@g zaOxeJWO^G@s#HgZk^Z?IJwh&E2|+@C7Y6Hi58My_q$VBu1)3#*jQ87^GK0aDOA#cjO^RZQSaB_qLl!-4t z6%%79!B<8|BR7%`7fu_4jRGx^fG_~Tdk1Cbvd#IK$W}pi@mseWO6moocYhlLl)a3fZRGkvxo=^Eu zWzPL>c{Kx4?`czoE_+Q?&1Tw0WLlOl`Bm!VRWG4u%L|j?;l-alf&4wYFku#3Y{nj2^~21{uz#Y~>vEz%@*Z(C*E9S)Oamc=um0#d*J=p3<#U zYTGYZ|KxO_B`ZrJKfdOGbOY@J|6d`AawvNHdZOjg|?2N%lq#{ zAn(7J_sWLFj|F46BBEs*C>)VB(CMjNyH$gp=ZpDQ8lZ-;u(&9L$<$P{_`qIY?)gN!nJB(h zy=}l9zvQt^%otkkB%?IK$bRF_IAPb>EDn3QvJ4Ehe6cALGmf;r8+AQm1M0b*<$agoZp10GJH7^Nc$7=pPELHQ z5xN!;+aG)Yfqa&!tu{jpSAEjjNIeg>M1-#}`^KX|?=?6$iMiuVx{l-fJ6Rr(i48CT5HmCaE=U&IPJS=@N-tOy$kn zpdJ#J4Xu*le=6CdlV!pcg|#J%ndztU>WX0)4Pg9vzwwiGHa*Nox_YA;^sqra86XlF z>UAVy#XQ!OY=WHj%C?DLQu--P8eh)6F7@;MQ=VvgtqC^&S-pWw+>66m6)>fh3@fv>+6n5H@{Km15$w0bA`2*Fj z;)~Hgi~MdO^6`8xhBl%#R(cl|k5`s95{BZd>OACSGLn{K(QFyJe{htOC7(N$ORs0Y z^C%!er^TWYPQ%3v?Qn(WQ!ONo1P>(yutK>2`B&YTSA^XkG6AKU$C zuH%Kqxi=}yG@v$Jr1c6--o+O`M>dAPmhTR-@MK}mo{~7Y{Mh+;g*J3CQFK)Udkn#) zHTiQ^ZsTgwCUQ7Wx;`e;g^!l z?0WNCbfnbHK%Ia%f=4^3aGL%8_uY_J{5e7(3^o8ltz(W$)2z|#lo$BNoA;BNYsHbY zSHp!(te}u-U;N&J=|SkB{>zA9^vWk~b=Fo{E|4<*O{3|~P@*Gz>}Y{Yd@L@v%C84D z!k0Y8J7VV46J+;xih(=S0VN!;muZQR7vbZ?1!O~m(hjyj9JjC>+Z zl;H;vl?pJAu60*qw7|dV84eMuHZ^zpIQdKTC_?WS@x0Y%z_kz|gl_L%pCtxUAYfl@ zzkORWcW+Lt0REv7c_Hr->}P8F4>nwS1%f1wr<}3TQX71t+#h1^ATGWwFIJZsYR!li zOE&RXg~x38$j;?Rqc%U46->$koUwdXEbki()F(dP!sbdcGaCLJ1NA^*@id|i+kAf! zNuC<@YKTSLICP5|-K1gvV3Pcas&Y#u`80b@pkTX!U7v(@>syc1AxV4whcn^{KY_RM zmxdSL#2pb#OJQ9so*;%JrKZ zz5kjFleSJ=_nPv=9I0bYxx=@mn)H@&QbsyC&}5B;FFa<|F&x z_5V;*|Fez#|J|Aj9LLdF>2JKE1;aLjVZwtW?oS>}#bdVUUc9gR)DB)v4Ydx z8CoQ8rX5-{I@cxnR=Ou9JXgA{xvf_|a>WLh`S4Zjn1-FI@-**2#+~tw_PTU8?XCyX!%x_{j z%wrTJX@v^92AoGU@d;xSKL&fXR>Z7N>w@y#il6WMpYja!TZ+M{peB)Xn z{*>KcQq18Cux08Iu&V9${e}*|@o|vaL&T(8E}D{SwlM$C)!qA-(Ls8fb+PLoSK2Hj z9t~MSHl8>CSwWcGT`@rgG2MU_8S?imjK8om^}0uY4Pa_YYDNnNN6Rs3xR^q`8IG}d zN=noQv-+8K1fUYR2iFd2N3s;ixSI()=s~M2o?aJTPiHkXH8GKI+Yk;I`Sza+wjz5I zZjVq}P$kxWrHy@U*0oUKf&2Wy3=jI{KZCl3)@iy!JgW2L4qN1 z!MY7D&f6t(Xh}rW!X^*&GoWgP2aUUEuQu4HK4O@%9{)>soNa`ep1Vy!7vBDLlF_Ma^M^V3bS`w%((z$U4+Yx2rjm4b_F$O0( z*3FsA*AVJRo;cYi0L@nQ=7%1242)Z-z3-*N^71WH8WSUQM#b?83F+qeHV8e;Vyt}L z>er%s(o%jia2rmiK}CEZxV8rs97W<_J#q;M>MD}acVNagxi&dQs3Ht5yU+!ZPPF0k zMZv?i2E}2Ikdvd|FXl9P(V1grlZfNSJMmyt{Ep28drwOeTL18ZWL3^I|1dLp=a7uL zv2V}UFKpU@ub$9!4mlTQf&8DCoh-2Fd7seDfD9SWP-=waA4VVjGrRu|^<3DC96|d) z2Q}q$+FM<&Q?qzNG^!gQAJYQO#5WieVa`5j!C&=17H;%;Y6n0{iXA*aXTjE4iQnZ+ zstH~<(}K&4a}2fn!jEZ0g!A`Q;bse%@(MN{*7mp}^~ggseD>e5p%b-|qd^)Rq^bBH z>NYt8?!ZfHU>3Lz=BK&>k-#sTeo{~{E6tp#Ha#w~Ya%27?uQRppaoZsV;8#`{F}Qd zKp582Nfq*n{TG~EpXpGA)hhM5Iz6@=E(~5XUV^j1>G-Y5$3)gTsY7Z# zcZjkV$KnKKJ#jC@AiIy|!y&WZ2r5qXo**ZEwL_|eIQIoCd&uAeQ-l!j%M>HIJ5Dny z!0YtiJ9FzBG~jm|M1eGq>d@v0GppDkjD!P+3PRZA5FYq=f55;6hsv7jcGqsX?@fK8 zXn0*t-gEUR5KMi7JQY^pA{Y}~z^R?UXN%`#?8i_UC&`J;M2v!k((Qe20gZu&D0&%k zzlpKC;!aeM(#eG{JzEJk#oaZ?~%Z$znq!x&)*c|7wLT82e z7tZk{E5-GQYQxHmATrptiOl}v$3|4`KUCg%X;N1PIu$mhM~2S0K-Nr4e;4lu53==L z5U)Y%PmD6R(3akPD^`xm(6X$gows%opnY62(vDA`PWX=qQVfu|96Pgg`np`&JH?Ba zvb0t+N2Yvbrqeoz(j03DNM;yWE#9w05~NNaWO;Rkq=vht;8n-#O{ocZYGxiRo?5q7 zdqp_i#q?vt;vR{Z9KK4PFeN725;YFC1Z>g$hE%@9(SXsnn%k9V~2*8PD z(CsOb@#cH))F#Bwnn_1@8uAz00r}rpqiBDHzu8(Szu}SqiuQZBRtJ6JGZcxupjgxx z_67kc3&P5BfNraOtY?-4;tVNEku{LH>RI!Oy-WU#>f=+XM1^eCwu-2@KbP8GCLUTXP^{6bX-95* z0UTu%LK#G#*hCwO(mjyWPMXaO`siroDW4p2yFn#%fvLP{mSWxJ?C zQ)FHkxydhCrNTZN|+lvrK5N@ft9zXAVZ~zunl!f*K?)bs73eH z1vTjigr|w_=h(`snChXM(!Y=)iiH~W#+#kGm;p6Veha3gSQdcsf7rQCYhQn10iJqU(XmRsHgI|;?JH>%Ef|0)5w4kYAcYjvMS=1 zr0@M0HmoA&#}k&Eprge6yc++}Kd~l~vLYYlgH^=js%`LN%tbj7EibDQPoD{Ng*9op z{pq;KGff?XXt3Zwh8u<S}7t zy*ys_?ZdI++n=tF{*skv6&oOY%^g}=E!H#jy>o82E@N-L_KWJ+o9_ZtF+v0VTqqIdRrR`OWj_{1i3tTtOTWTpWnke zQCZrHyAJ9ZK`({~k?C}UjL4+c7r1Jsa;4!ksu}|c2ogcRVpzGlb9FIR|9TvW9Y#LY z(K9W#pa;#vin^_|5ZtR!b)ZFmoMs$*(8N6swJihDD_hId3A7kKu!@%~TrQ|usa%ze z`Jw_wKqgSi@`U4|G$I+&+$Q*#SSE0W(pST?M}%+FWTy6CXawt9Bfb+_=BwTBIW^0Mi3915tFM7h1 zHZ)!9Bhz79oW_v|&s|75g|sh#qGwUwUE!x74kjGBOY;+?@Zv67aVP$?FYtIrGyb5$fu)u!b-~9 z&NQUJix-Dd1Xs8B?GQ%6nUx^NFZC7?AlQRb<4E=H+u1-fh%`$G9NrdEaqs?fq?sCY zPhFeHtb-3e>dAlyPK!4YCMKNiGAHhN^Hs)3&i^%!75vcEH@bZpPC)dd5*R|wM}j?u z^SjDRyr}plW2^c|z0(m1|Z+?X<5yYsIf*KD}SMFzMX=n~pW z@MjAWAzQn$;Z~3GjwSGjfX+ewI+xqf?y1|(qe1G@@Cn}5Z_z*Pdkw!-sOO;>j8Nst zo1abUc(S5FaM&_FkQkfWERvnN=wU<8c#G+n#u^s{z;=$x#@|wU)xTsJ$`!LAPpCu4 z6Fev`W<0CT=S2_!jb+Nab@Mcb*9t5yY#J&P*+k^NhAtVenh}M3snGa7nX*VzHQqWZLt=-m)=Xy#YOm*3DIa# z9chfYc=`Dt!KS%!WS0nvgqnw=yj#=Y23o!fukkJl&wc+UU_k9P61~&Xg1OJ%@w0N}CZQpoX2s zIN5*9vH)F$yl(aIer8;a^Vc?! zEHKaJfB9eeSwBXtdR}+mbt3JqJU^-pF!rSc4f8@;li_<6#S5sPptJ>I$R?cPrhmnI zIHz$-+&FWvYA_3x0|;w)XTWYzp)1SDs8=k<4nO#Y|74v`Xi@ZK^i2KxhIZTd?Hg06 z)N6Wr4`=hAqhFREeD8T+Y!4=-<E!Xn}-cn6QFE_2yWIJ%a^{?vU|W>{H{3& z8=5YMyKX)=GF$u@Ih~8~4pKkCDO0VdK;rEsc;3hj72-W(-l#Q;#P@l|FED32LaY(T zABS_uyv)3F?RYLm91%%O27=GiPoB!@hGo+(Rf+(WZ&9|Z zq3nNpP|6hBGJut%Cz z9%{4=jIQv8m_cD_W-ePK?%smOp%{ARon^G@q0#)m>2I5|>|Ny7SJ>yIUyM<6w(1Oq z367AdI>t~OiEiHF_cbl7#OhZ9?@3^6gkzAj{UR^yL0iAqnX^45kl`Nbal>Ry#{@kk zhNlE>Uu_BNuM_{E@41M{q_)-$w8{Ivb_k+m%&diymVSNMbi2k2R_GQzcG{(bosW-5 zz>vB?GsNoFKtR7}hQzdFE=5<{sl&kMMk5s|c;0w}dR@Yz5`zm=4<-4?!G8x`{w*5? z7o-A7njSUaS(BrDo3S^O=%m=Af19D{L6P8f$1gAD(GdHcv1v?bD{^Q0@z!aj;6`CA zMfOl}bom>(vLJxQ04F}v&&K=u?%$)+l&i{ZGv?;!>7kHWc|?H841Vke(N|$4E`J-{ zadDrr74;!MAQTtyoe_pYKs7vZr(e*yv8SBR*A0%YJo^NNKb$0JCsXk6{uU-Dj_mCc zt(}F5U=GPq`DmQbPmDRJ+%g4Xa!6ooW3W)96S_`kZ;tP1JXoR}YkpfKUbU){8Fo~@ zgOJA{?B$ZxO>9b!8V2{`4wKg)?yKNJ>c?}74IdK+@R&-SYP&DSa3)W`jM!D)|Mc!< zcV772WknrA!m#f|PJvp^JCCcMG`@ZMwoiJrJz;(9;BoPEI)%*{AoP2akjd+OjACFW z9i`AQKd>>PPcn^nL1obQkes2{$K^V>XR6iV@2RpBqT>%0;*R3QiCX>+)&e`BaC@hpZLfE_ z)qRBZmx@Z%ZTVd>|As~!>PjVU>@^=%n{~TxagGdV$%uT--!oZ&p=9VDfTRLy?(ZRd=myzhbpGU%>v^VlGj1 z-EPADF+jTnF+sun&j~1Z*^lrEhH?2KsS>smka2*`iR~mj$bV}}Mj^B{Ue`wxH5A`s zF;52g6&&9K=S2@Me)^!gmL*_^tdV00K{SpKHj+h<MB=U*xo6vwOb>p)I14!F)|wU7wdB+{65OWf`>Z>)t*)R8`tYOKy#$ zbwhN)!!Ys?=RliR(7k>ac)-}rP0|zj9-ZwTdu{Fm8{zrh5xp9$%+D8 z;D-ccolzHzyA^fLCGoARs^L9>ZH>S+Iju1~sUd+#>zsV0!J65m6VJvE}eQ~}35 zuk}7YVh(JsaNQDwGY7WT=s7#*DHu|cLcfCxi=`mg*uMRGTwg!S&SQM#?V8uabCe{k zRRQ+23NF2>Ul%Mz=q7piFO>!?Y>!Uj^ug}3{A{uG-T^?X4g6Dgf!!whzmA=v3Ydm! z0vq87k^2J1tqm@-Z38w%#=M_W(l<&Q){1s~&Qkad>@r6S4M_Xc^R4u$x+G7=Tp@EF zl$SsBU%A&jWThHFWD?E=cLw{|*wSM+w%c3Q)uUA@&?Zxf+27$MC7Co;xy@sD41BpL zQ`R0ZwdUtjniys)F6JwCnkHb0+q}vp;;klDHU&%J#wAu?4cR!i-)nCXCZJ)(ushK+ zJ{|}UtiuSjF+F2ojOchnCMZ4c@2})Lt~lMfHU0kh%Q(uHwUpDTcBfompUhar9hL%< z=Syd5;Z=DQYdOk}+D&75G5O}a(`!o^{kb|oc4Sh(nTvYW;@6HH#Au*^E^_SO2Uh)? z!Cb|6sytlV4i8>U2WogqZ_-t`r;p?2Q&((wFBGB0T$$Iatcbpjoi28iK+JP`7j|7O zSP*I;n3Gug@H+r=0QYq1GUF}R5jz7BOTu%6$-h&94tSiKG|dZH_++ z$04{^y|Y&2hkMj>(vCiuvVW2*X`Of-K3L#mT-rOpJy*lv8|3`}%qDv&WBD%0X1r$4 zPIwJ$7h9w3raAhYLy0SR=6%5cp0P7uv4wPrj?3qqpZS?Si+>Cw zstPJ}=D)={5$bDUJ|s-c$?lZvDx6CR%Jh-H)K#QczFY$>1x3>n=eK!aoaA5u>jTb5 zSqO>3Gez z_n}!Ils_r^t6rzrJ(nngNWZ7Z=$ek27;ZLC2V8o`7)a|;8EyL{MGZd#`#GC&JXJ_` z1g4^38PZ9+$}@U8G`!y8$`%0ieYU%4%h<`jMa%lqS$!zwdNB7Q1<>3-p0W}^Ku!ye zKo*g|VnYXPc{)ITbg_yhrKnXs=F*8T1Ds{GiB-uikCwbTgy6Gwl=Y- z?JZVZiCy;$d7JxPE07!u$N=_pWkz=E@VtC**MgEkSToh8E|m6c=CK8|xPSIGX@~}l z?wHKC=hQ(6?&oz)UhI-t4EtXu}BCKw-2o42eYbk>c0bcWKdK;xyr9ww7M)j# z##CMHj@^dzF{8x8FrrT%k%azrV=@`AA5Od@{cqVMiSUDw%?(4UFd)O@b)2TA+aB3P zjtr1(KqQeLj4g9$y^?ZzPcl{{W8^veES4Cl8bqv6ZZNk(tewbDttAda0wAwLj*zvv zh>G@%uw=f#EmALD)_c9uM7(^Wi9iC3!5&DWzN~e?xYB$#t_PSnEiv|8Bg$edVZ88n zKN0pQA5(@lK~>jv1TxW_qYUPmat>mbg#hP zkcQ#ewM$(@K!A{89#0ON3HmSF*~^oH;O#hZg%U||wadzbk7%%rg+b}0N`V2~?-Lj+ zv6Q{LMQ(v`F1B${;sKe!bg+O&PoR0wkm&kN;{a~Kf}6cf@2>CDY?LPGye zcWI_KOVB$RS@9bUSclbHf>5GuhFlM8ZaG9K0%a{U`U}cPdK5S-kegn3_ zJ2wDu+p#3f8jt~pU^vvW_e!zEtn83V!+7WbX)~`g@8K;@f7<|p9=nqd4xsr#x=U=rCCf*FPP`Vyr zz@KRFZg$Rg<~u)Ji94>3lI4%XM%bN$t{45RD}BVq-?>zW)SZkLkt8Tiohfd9WCHE) z0x5%*Zoi>zLS8N?E;iXeaIk2(?i}L#FCmDyDwzrjBcfkDLcZbvxq-qylC>GIBLtm zZq6o-p-1#ZWztBqVP}_>lJ16_iogOeQ^pb|EMxa=2I{IB!)gQ<{9PMksn0dVp^N;H4au zS@CHkXKK&fMmz6$IOWgJ#X@$~z{q?za$ivA3ktKgaW8vGWIj(x73FM47ECMB*cyZl zD8K_N~ z4hoG}n#v&_5j_E%X`eG=F*7wpC21#MJ=a?!pp zTA+8vP$i2+9TO{Z3gAuotqQ(@B$^B8vt=Tg!!3Z%>}UWA-}bgwroU~*ZXbE|$+5W< z&7sSO7(cQBOX#toX*s)LCa~VK-Si{lEAH39%U3FZIb);_X@wu@!{`TtPClPH10Jdz#PWqa(;%_*w{@uL?B`3o1s$_^Y!t1S*S7b z)*P?Q0#A=B|IRU1#Hdn_yRjP#B}EN`^`~oJ(VxG>kT|2B(QHR;L{JB!NG5ry$djdQ z5?8a~96Dg93AK0sN}38-jAaN5lg?B5r2ILDZwTk1_ExgSn*}wX0`e1Q3ni|lTXlK& zMC4$L?W(Vpq*Zd%(FOxF3O`AC(1( z!uwM#awP20{apnW6o&Qt`+=Uo%uwxc-|D5!6bK7AA51avPAgW{Z8VASFzGXJ(?uXh z)5rMRU;^3hab}GUWJmKk%6tkr09J&`KR3yC;InB5iP7uCG``DEG>@5mlVN&=5}8AT;;wV;X~f02P3ZqA<0BcsY{S235}wn`caRugF$NY4PHmxE%IyaAy)1x%3s2`0DHmjNV{vrC{$`f2jU1beK&t+b6 zKTgCRzfYt}qzZELFi*$v6{f-VmXD-U!w_eaF-3LK0b;q9BX=O-UVJ!6?FHLGh~Cpy z+Y|-o*ORz3BMZm#GsJ3Q05JEc3hdt&@zhz+$@*nbItT+;;uEjDON}`*HVQTALNSEF zxN$#<=pN^3YEX4_PE(lc?aFHVnj+`3#Hw>}=|Q6OnL7A-MZM;CzUuw1*0(4-d8Lze zvE4h;jmRS?P=-mgQzno#SJ6F~l`#XyNl*jC+emL1meYzH&j=dIV}`y0d)rF!088Wz zDxOWfIF;q1O6woXu}c`RH=+HTsdi|) z!36JDh6m}Ag_MW@bE2}BYx=v9x%4Yk7%aB$k+>HX!G2F}S}@B(=R!;aQR8WcZIV^< z6Y0=<`xk?~Uv;M1s8fQg2ZXShj?scb7$T{tkT+#E^@PZ4! z@T;-FrIlFMtd)gsvEnR^W_)gvINP=QL0j3D++UP+3jXK)md^%~0eXyRwYQYBk7y@& z1}VXFHT{fACwogEDK`ZyltM=NT29A7BRF88taX_uhIa zO~bmFOE!7kypJj8YcvxVRk0csu*CLbiY3ogVTA8YkiW;*csg1VH`B)lA4Ax<*KlsS zSDE)nYj?t@&EI7c_u=Jzs*j>uG)49|o+Cw}`QK3;BU63J0BX0=jyk3Zj1V>pu24EG zn2N95z(jlji!~ykfqR=k6lda%z1} zeGW{kP5_93nkluRo||D#HMx`-OOHCfdxoEnsOmc4GU%biLJz_t|GuAZ2RsCXQBmiX;Zu?R_N^>&(6$ayp`N{>WV$z7-R?KNM-EGd+;7T5u)L)CxG(Oj+;DjLn6{ zZK1M0mHtTtd*fpu&jDV1Vf{`d4;u^K97b^rx}M}-P-DcpM>cD|p`l6sXDeXr66#E~ zlz3C>L$$^JkauY!?@1g9dXKG)5km_#K=b=Z_UGj%jBM4a)P6B4h>;Z+1vsT5A5QT0 z?Ps3R&ABe?XW|N|OKP%^yE3e7f-Fm)M!6k5P5jNP2@!O=y9zs`eHn?WC(3&MY^at; z!`e=*sLyJ1WGz7fy6`8&vYJEY%oRb&=K4KW(+mFAW6ruway=5DLIEgQM%-BuSI5*z*7?3Kdyr<&A$nF%XmHiFdm=#vOv5mtQCfv~1i1Fq zr(T?|7OvbhD7r&Q`dDZCrg%mQzt>u`-)@BY%p-tKxe&Mlbo*-E&BH4R0FK{%Zw?sV z_S!v)a;=Zlj4GhUme9PvEw01^HO7v8k7C58?&Zn#P4aDy!q6E#v$Vero>iKolefim(n~D59?HgQp@s6GsoHTVPWFC)cXEjcvow~uL z4jW)fRiGNd2lW&A^U)cTrtI$P$vx%A2y4WC(FQZ#bw3ou2 zizew8W5!05kjC*2#ls+sB$G-FhTs3lG*4W4JFxm{n)fjG!d&VmS!W_+d^k>h!Kj$5 zQo3|{SKR)!wm5g#ip};7$yz>5)m`A;!-zv0w2R~!Yvk?aYX-di)sMS71G?Mb=ha1aUCBk>`+}_{!+v{|n7rF@fZqMT4!y<^` zNT)k{-xL}N4}+E_30+ST7szgd4}maii1PY&P%u!`Uwn^{W!fC+Bq$=`V=uX4(8W6d zYf2-+8}ndPkW^*l=)qKxqvgdllWzv2G-1274QJTBLnp2gO{F)ukO=?7>nS>D{B!V} zhHx`6jKe$%KEk=EN8O|#?F0)XP9eKv(Ww<*|3Ui%0VGX=&6D@um`6S6J{lDbC0&5G zrrZj{qi;aL3u1a$hLU*aEi8|qF)44tifdBiPk^^BJBh`A(iwH`*!tar^oT6S)G)4U z1J2Q^tq&&~vDH4@18>DzAdA37abBIzg0;J%VZ%wNJQt}XG8 zQdOKjh=x)TY6MJWdTaP}{n#r>aq7XDE5QtsAKcqagZaG$ zl0X4x8qKR97Zg&c^YPuSe+4k*VvZHcA1D%{?CUNtzs?lF3+h4kPzc#)jR(@7%~<7=4- z-MpGX0Q3t?3y8o&;~%S~j${D}uLvnh zi(e;XRq8{Rf>amoh+YZa_?bZ+?1jIRQg_iaMgO6o{wN9Uqrn7JtJW60gG1vj$B~mU zYwr*%2;?ZqJz3iX_chTd7m?#O4K%B3UqkQM{YXe}k>#f&9vAmAw`Q{GkUkM=Ivb^$gC3`l|YVkIr!$ z0eVVObVytO$->OP4Wju{Z#VlRo&Wb)bYNBPhoFo~+xK_cCNA z4-JIK?${u*d6Oa$lGgw4gR<-#EM+^=VT&nlracLZ8cZ%lH@A4JFf_;#l21yF$^3gE zHF>e8-=QOZVCFLvCbQlEJNiAV2t)*CECv*ysmU4gF5)g=@H*Cfj9cOBP$SbOk}Ip0 zI52ZT)Ck@xdiR#cTtG*9CK44UM%0_yd!3q3aet2D8z&^IhHOQ@(7`gx*!vaiPF$I7 zq;ustFb3pDu>A>uWCS$=-X>xw%C2!2a?Z)#2reEAY^1ni>=qNq3a&tbkRn=fJLgk_ z8%#)U7G~3Q`*73zS1E^Mbb$S>r}8nO1&Kdbc6$$wKD(auM!Ws}RB#@+?~!2kPxJac z^c@}$k%yYvZ{x;qx5??2#utKdf~Mt}`*WGWhi_a8@cd#I*Xuq^2i7Dt4KhmSH=#WU;>5uQ5XfTBzNOMaoXc6)J{ZdQKq~-K?Y*Tks}Yo`qAL$d5@MrwX~= zp`m;?o_z#AayOIL326cwb^+n%xeMo#i99+f?b1|PV}?#h;4e8WSC ze`+EL{WRqQe>A_X{e@X3V&%3s$3E*RH!(fOYLgazwNZfk%gHFZF}xrRt0$z?a$O^! z3|^fyNmQw6iQ`uWY=tjGZZ6m^+d81O!C975;K@eEXpUOHP1(&fUw8Okou%RA9E#+r z!9*3)gp|8N^>WtBrtu*g`c##RC418-xqxwnHY9^7c+lMRlU7S5IuE*&i62M@B2a8R z`Q|}S?8rcA#!qtrBL;Xzsp|{hn^Zs(HN5(Wj82Eonzh6J%GQ%=4G9Tb9aWAV z{`!Z4l0d`iOuo8mX%i}wuZU}6CQbOuvmAe4P4%z7P>fT6u*Ts5&g_7S{3?qXK;^rs zgxYHf^}HZe{_iS6x4{%v{;gqNHX_r;1r2jd8EJ$QdpdS~b|=d^~H7PhOfBWoZ$*Jrx!m^COjsEoIjLzJwER;yd(bP$ngEG$|z&-bI8Rrm$yGT zdx^-&_C#`rm!MV{r^6Tt7WK$)?G=1Ec=JgQX*FhI(Xt@{)MAmTarId9m>C-?;;SFb z1UEK+D*eTw-!jsjKnlMW)6#Y7slI#`HkHN7lB@;$kw3NU^%;|1&iX~!L}rU0Vo-Cx zzPt*ag3ZU;5x_6uooPp@J%$Q_uNa+EvKSlnr%`d&)!rwy$dxu3`OX+8?Zq|>Su{q! zI}pMwZx_~XY|iz^v9|8?N$=^R!d_{cdkUmA*jsxM25u|p~ z{|$BQo}*uyQDn_GKLxi3nzplyuePT%v2Sesf^kc{GKOtA9S(vGum7Y(8qaxo1t+D$ z0T%Gz8H29!b+JRnC#P#~1XmGeMoEIGvX+*H%v0OAmnIcI6Hs1Vfwz{<#X*lV&?yp) zO|H|pe3#!Z1ien@`8z_FWw)(wrYVg`EqA-G%R+CIsAk?b)|zPAoJ{W*cmx8I(8LfK zrVwdasKyBzM11Bq1>%6M{yaL+tG!szA$KO58y0GGe&*%@9F@mK7WyS_x}>~yB-2gW zptJZSYFAy=kI=PphcR4xG%%w}j&IZ^GC|g_)(st9D=zRK2tP?=`BDDaf@QpFkC8 zRNVVTi2qdux#z*!2GJvaHRZuXf$Ro2h~mKiXns&fF7L=PElx*OM{TFS{1*^)EDY7v zuz)-~UTfZfd=dUD6%tedVms}K>9K(B&h*z%(?-lN|JP~`Y_}`snH)+~NA$FCO|pR` zKn4$me`}eF5hMpO>yioIiILzshIo5CJXMd0{I}C?kS6dnv{&wqEH5xabFf$1Tav-x zY_2v*6!5eO-h7STuse*wW(fy8>Jh= z-dm0RpJDCIjJu$Ojh{WQGH9UC(!lBW|7#QzD$j;$;Z&ZtN~&LQ$@{;9V$gu~ zKiwpOl{fkE_!bjxQ~%XRy^V_M>2T6~#PyJBU^X}LBg+2{%Z{oFl+bMyPG%dq#or}| zDrzLsymdRBbe$sjfLY{W_3Mx`57d6ol$_=Lf8(YF)PS}neNcIg*Cr0|?A#O?LSKA+ zrhB7-z1^7m2>?8|VoO|9;;HfcJD;~RA>J@8w88LyXITIzLo;j>$UaGwnOP5Q7#89w zepg!P|C$A8>K z7AI-~Y*N;3Z^$goea4>(8T~MM(1iuSH1Peu9ggas#<7KC&Q(Ld?No`s?jvFj)fWUQ zSzFqq)eHc0%NtzUv{J%zKI4qJ(8a*+=YM)F3uKwUe?(E{@3I#GsVmpxQk5(7iMUCx zr9Y84_QjjzR zn1%0QwzZ0`ujJ8pT^wyh2uda$Iz^DTL8i+ zeD>~hL~!8bHAbvtt*!uq8l>LPLW!Yl=}{5pyEUjhhK!o!`-$`$wEAqgOzu|i-LQYZ zxQdlHTfjq~KR|hvV-83bXyIdj#ScDY_)~lWj478Uqe$Ec^Wy!K|4=AdM!XfHka%eI zq_)*~8sy;Ks47Vs5ZPEWm?=fa&8U%rVsJJ|C41(?XD=zsmu$)ttI>R7xlOt=_R!kJ z1oe2JFOr{kB&InU10LJnukDX#m&+rX=Hv)aYd5nQyl_VuWo0MQ@P+ywN$I>9ckMVi zuISwFoDCNC4WVC%?b90gT-R&DS*^y;sB z-~LJe^GcvYwTe9uelw{`Z(k^R`Zuui`HgGK`nlu#fx;Ui?$Y#{zDkFsm~$JgwNsl# z&+ws*B!IMp*A^2=Vn9Gto{)Em)Ww3LeLmxRCyDj}BVRr_r-XTN(~nh5p1gVmrR&u% zwy}DcSh<{cC>oa~W#JoZ`{@BfsY*>g`;5al7fX3>X3PQmjF*#m2iN$duIz8&$*7j8 z(p_C^{`-KJmK3$-^)mkG-*Q!}-D8BwZ5_7w1N&b}(;6#ah5sN%fqXc@sV+S@3|d0J zD|4413yeF4nU(? zqloxQe73feV}Cc548(TLn;qI83`Y}`dwGmsyypD)&^Vmic-Hth*cja-9(yV@ZZX-K zr)l+Iv+0nQZ^5^m>+}Ki5{oNWs-J>_39yombEHmy=_J@IWgoOAXJEg0kd|=pY#s|j zm#525v7vuov+{t=(1vueMaQ>M-haS_nxdxH&i0i`W?Zc=tX8z<&|MIE38?6=wy#im z0{O_lgj4SDB@hf&r)xvYxus z0c=?%T%;LGdPA#IKOfBS166 z)#-3Ls||VU&wNaaB+hCdeIiXDu8?%>Hxf7a=b7QDCTm#aKBKxl`HWV;UQu6$9Q0~t zI>z+wQI-~vxFxdBn1tM%v84HKJNUYy{ZAK{O-8AtZn1&G5&xiiW+ad9@gIpK;zid8 z))22$t}JW=Ug7ZQL(1gi4_P+2Jtdrc^=x6~*Nschr3`gC^q|xALq4VUZx2&%o^kCu zajvh)D7mS9!c)uN@l(3`XOgH*v24}@D`8qZXUY6jJZ>TsUVnW#DUJY_Gk#$Tq-7|& z38Q_kO8d6blDa@(j2c_8%-NJT)COm%?iE;$y;GM`8?bckRuNXwwQAKSwZ=j+?Muni zs<&a|UNq^!QLOfAZ_}(HXBE`K*W(RilLSE>E=3{Qag2wpu9#RF43 zS-1zlaFJm6dXU~aH$H))MGvZy{`P3^Wx*o50|h);wxsemqJph{H#zBLnWukrFx4Op zA(ILgQ&SYTU~&J3#M%Vc6D~gA%N30=dX%d8^XpCVZro7LBl7j- z>>td0qfu9jfu+_GN(wyO%RGqYGM~z*e;#T3UXKZ3(Rp3ov_N&$tz2lU`exmKfR;I^ zh59(;V9TC$D)xF?$t$_ZE9=z3uALU4EJNlThzXdp!E=^DcTBKd#IjK(H(1>lcU4I; zo40J>pD$UcCQ5JK{f7b2%nm~A#J9n(VB7ja1>8!d_{=-(w_LV$wYnLaf04Z)Xx5+j z^Mvm%lqY~F__R5$l7wq~JzgUn^*~)DyJ-84 znmezQuGnOai&dfP!=@N^-Pg1L9P2Lnl4o>h-=)Fr-kvm@g9aLyQY7iplZr7o2qH1{ z=GOd!`Jz*N=7zFj9Sw=FqhyXpj{k)QHjWxJnSCy+rqG$1H|K^+!==nqe!Of^*k`ut zW9U#5BKDYF`0jOzSq@z8M*oo>?@n0G`7QpUA_WmnfAZq+L;l7U!Hb%IyNVH0|7bb=LOkG2lp(xN1s6fnUetABbFJTf225eomDOxjU@D?`=Q zV6}+r&>38szmf=$i_8SURqXvdW(_Z&TqrV9B+l8kDJKCIh*2tk-?Z65Lj%vWvm}FK zqBLOV>&J%zs!R)xbg~eg&R9VnX?x>f)wNEP5{P8$o*r%8^U0mADfRm6tN=F$o>2m4 zMwZ~}Qt=p?|KNqjItKj~p-01a#)PQargAR@Ch*zkw%?6B1^T9ubh8O-~llKWi$Bi4uATzO;l>#xZl#9^o6aBoKE!jozb>Da>A6jZGKpE zE;=b2mE+BgQgGgOM?Dp=Cs1RKaszhwK9bD9!v3{8#C zIx>t8UdBamjcJ&erwx5mnveBPNbH>*6%Ub(Ju=%_zNUk<2nQ`ZJorTliH^Ho#2PNx z)kwusgA3tPgiti}??ZivXIY+iNWS;Pl^lCAR4slg*VaCp6^s~ragNd9-3WyGo&jFK zY;jDc=Eh6Uf!kK~=!u{?VfPL_;%~!f2Mgw7#*k+LFa?^V|8JSwdqiZiO-2p02~~1% z%z+bAM7lLXS=&-j{*50+V~3RKwvd{{+E0|;G3;&+>@d2ybYe8iN3NcRPu&`-j8=h= zzji@wCw|WAlFp^AYVqNCZD=;&o8lLF$?*o`4G;$4h8v51aBe&jU-;@1SdzqxN=aTA zW2SnB*9}H1CWCJiau_Kg2s07-glDu%HY{A-i3;%MT|u%jf9IG2-Cg-@((SaJCtkHr zp!>s1OWt8?fgNkUX>C-!Xmii}D}Mi%t-Nz=ebrQ=Xr_9#HfrAOrOjLhLRE7yWA;b^ z3B^%{{H3!Ua5|NPFycVjMv$?TBc8S*(k{Fg0P^=pPfb^~!!1bbI|OyCpUwOGx9Fo@ zkLUxUnC_eB1s+M8bot5yHrNkgmw3)G;TK_!fcv1kxmE{7U3h#3Tp}tY!?sv4>W>7c z{Sh1c0q=h#`$vmPU83u3lT>YTrGBWFgL>tfl`0o8UF^Nv_ezKhC&58uzwY-+3=)Ld z^AXO&f=n9B-ikLi{AVSo5kDP0^MScH=6-b*$trz~A;r{p3l)TA6lgQPXHB694Bs+Y z3>B>GdrlC!V2EX&VZ<9Y@WX;MPiZkK5+VSIB|*plhK(P#NSOWSE%2bDIk(@W*Y6ji zO@jic6H4oT_u^Rbpf=!+=d18|poTO_Hb!6UG8pX?1IG#Ia>b%dd2OtH&LkmNp74dp zV@kQ=sZ1KUG;GXMHR$gVSWD%SgmiYk8g{7_neTBw@1&cHYiqkdeMX^EoKry1oA?A% z6T`Ajk`Ws{ZQ;ys!9854D?Qi)f*V<<=xx8=Ou0vg=*^1RdaYlR00S{$tQeTq<FXcNjPI=wSVe40ef z8u)Nkl-vQ|16xG1sY(@!YBpPvw5nCD5PNJ5z4n>#XkiArN37b~;1m zWwhRVdF%W$)AM^R?@oxhD$dDaSO3*c&DzqJ{TJ!!y1uY5sLb7n>=kithm#7(8LzTF zc5NORR8)xri(s59`}PD=ffG=m6)}Ay*5svMZfOYjK?NzA^)^D)cGB`{N1GL~caE?0 zAw5H1h!m+8xB+9|4=A}3;`t_UpBQ#N{2bZOW@Y;04(X8zzGfmo%vbJPFll_G^zLGP ze`@+Il1B9=>Z!4@k{|wz+*z3$PnFAyw2Z-qzqw*_rK_}HS=3vlIfl}qdrHe~(s4Mr zj|IMOy$Ks|AIYyR%0E`h%!F+JiUJJ&JWZbIfWz4zurXeuz%%dVi9gp zZ2SR+gwZLM{EwkQV_Khx0_DPKoUeOlY7Fja!TUv4l??_*xIa|R3`he{wk!J8;%P24HxwMSe9cP3N-^y2-P?%LQzd1(yNk8gi`U%4kB*Y;;gcZ7O?b zeGD^-R1-ChfDa=RbSKBnC`4FgM<_lS1?~o^`0Qm_BKa zDXv9KC`Oq&&OfA&(LX|2WJ1dJCZiO07y9|Y?GVY{CO}kxfR2eRn-2c~ZEyU#i_qJ0lw)>MGd z+EGi2xEMZ;KF8*)LEyD<8a~sX@-xiy3q__bv&)*mZ{J!zo$-+H_oXx8A3%afPaU`Z zB5eZ-k}<#5H7Nzor!;-i^?d22jUIP_b$d=3t*qmr3-jz*jaTnZE3|+2FG&&gSMGvk zi9dYD0(9GHCzItcrodfqHHlwCY0>P2d|_f(MGv>t$a~@_@;Ajhe0Kd93k+!<5pzs+ z-B*abJZ>yN{v`9)g-mofMYIqa{_AJ|TfJnd$ktI*v9UGu)uKRYcDnw@pu-f3q6w&O zg};49$Ayj15Dv%X56^s-I(>f}peH-T#xkdjE-<4jG`@^&HI;rR0P1A$+$?PhYa6Eo{W1@X zPg&zez6&A=p_%`7)S60H{33L=MTOcumhUt&pwEIsx7^?igJZNjkssiFr*V*v+>uiz zynP@p&5c>QPUv|)qaTeThT%;IK|bgSpKO6=r`jK}FL zVLxWoaOpK7^REQxFsSqgkE-{!-v@5oEC>S0@=zaD@ua*xvvT35%{@$W=25q)AvK3@F5GT_I)DeKyuX_pkTiJ835I60H( zu-Pe(vs*TT>tHJf8KK$55^Gg63dHDbRHJrlOP=i`Qd8+UfrJ9~q2yoAVU&;k>!eb7 zR>Ap!L8WsNa9t#?G@!{~(zJMaX7ae5#P0B0$nxiRZ&jdmR*obWHmB6B*MK3ax-Ufu z_Z@gd<|F7;odUQaT@|on^@*0mmedLP*Ix}+|5*zlgL9ABcvNry zy+d`Fnb~0`+K|e7$Q7A{UUCPA^7Ya&&PtCQcZ35ZHG%$*DtFOn3xiCX@*{*WAwF6M z;$UAfYkL;O^Q3FO{yHgqnU4qK%8q#0eQ-hPUNDFA)Wf^Wm*Z;HnBVR z%!O~05O^GwV*E&7-CIgYoli}=>ziKGz<~MUh_i-Wc6u_A6r-&=#rE*EO)?T8wN!H? zfV|OmJFF=PPA8wpfY^9{_iDuR(KzCK>BNmUmuS04jzCJio=H25rLlJjo?~$k=pvEq zld>mftE_*O`>nc$Y7RND^8E-6C*^h9bVnSiuhUf{&>_Cy#3vJ5KIr33&EWFN1ZI(p z0I-EdndiQ=;BXg0=kTl;NRE70opeliMsr`%Q-L-6xj#EiP*}bIFW6Y3U-aod7)ukz z1$^eMlVL9UbE(tO&c^DMNeVpuaf1cyBd{6yve|JBA_L@;EanLS zN{aJ1uh1=pV%B8|`6F_rBh~OmyB~>)@k8FJzqk#b{^JrMsOQv}8Rvf*Kd|-?{IJMCVv#xL8 z*ZBM_e+Qo>e|u7tc1=t9&3 z*gL2$-=4d{HyFWQleF(YovxAFC;iLiPM~Vvh0SB-h~5Z*q+J|(M@?I)K_@kS*|2BH zwR3Z&@>#A*u}fGYn=Qn~W2ZA@5ZO8M8{1o=;EQK^^+DuBY+GOvVam@6Fs++$!T(s2i<08vuLb5 zW$ZO#t4TS!4~KKFDNC zHfc#6|EAxyKRUH^Nxh@q;aKPk3;-;o$8&dEw``rkDdi|HJ^a$!{2t=)b1N>t;0(oq z=tSzLwkYKRMA=T&*(&Apu~Vm${`@uX(4~A6H^!^2BA?#ggMoOHldhbCdz1_nXl7*= znmU@I*EjX&m~m;Ug;I=bw#?xJgPd~vRhixHT#r~teoK;{u zTIsOh37)ZdkBUc#6cbrMdpE7FAUz;URdvVOgdNLdD_*bZ9#N?R5(o77-2qd*QtW#< znN}-HUBCXK`{#I{zVUnsII*F-|jR4MPN*Oi!Rqi}d3x|FCR$i&>jn7V}1W9t|z+AQ(<@iMp%uyazP7S zrIa#2!g<_1`>3<=6uq^De<3iye1ns`Cnt9AQ#yBXdj^TZnSkhCQh*En&JQc=I`*dg z4TZ`F#uad6)&zZWapge%~G3?&&YnvcM^0UXPOg%be)bM&so}O=l0p# zI%I;Tu+LO?kURch4#x$ff*;XaNe?!VOf!VmPb1>oUt2x_H)nsZP?Dy^WG!743KLC# z%#N{|L?6&*KM+C~uE|em=K8%|8uyhGn118|q0%|+3cOGQXUCK8@llJZLF{wf_Z$jJ zzT%k~g=}TX_o)t(?Ri-&15bLmvHz4h+gxl`byeyEN$6>qBTGo|)m3&5|#m`Hj*`b2KRhaD%WJi4U!)I7) z!78!&b7$%H8||aVNl8j={tH_F(ZX*7s>>WZ2tr;!iB((skNWs)Th>gJY>R#(c z$@6Ch+~{!TF)M6=7|F;D`~VK40oC?}p`QZ>d!PoR)y7Q(z`Dm!8#A+2I7O*=!hjSi z20BpO%j2tAn!T&Bo^0>aMv{81l(BZHNZ|BTKl?7Kl~XDe&Lv1k(O`2d?uun`7xm8x zoV!Xno2RW|ZuR=8&J{*PP$yS?D({TqXDZOE=a2j*+emXh=CwR2cBf-Vt`8K-U!Q|dlSoi4ZvOgL8J6#_n`(J#5w$V z$>5{La~91Rxul*90vTw^H{Z<+MZXsE%m(QkLF{5m81p{XIMVhsquOn~L57;oUr{OX zp;V;iY{x6Pa~31>3oH`@=C;Jf>)5rUcMU{sG5zQE6qO0-ageUmwxToP%yx= z%Lvqm4h9FHI^crMR;^}o9%+n%wlv_u1h%r&fp|bh$_xe&AC_?#4e&@&lH-6I{6?_4 z7YWJ7I0+TMm~2A<-Gcl1F)_=l?Iq^ZIhjtQk)4#^hL8#pz9-CDl!~jG^kM$|**FrS zUW_{$n6ceIH~91S4d!s-nH^(9n1iMeOlio++UY6rPY-6@qEy(lItdzc0mak+4vrUw zNI>?lUnuS^-Ix630T5PL2BlM1)Mmj&%_ksYcDD*bXqqK2j1{jPD(H$qA{(o-CPRF% zqTm}Z&9_s!C!4OTh3OSSBf7X#64cfDZ#v`2r%YBq!x5P(kQ}bdltcofkX=Xkq87r062ZZ3M;J3 zDU-(8qf~K^ruouO#Cn=wU8}2#*`qkS`~^7leGGE~sh;+NY~(A>q)`sPd6%~; zms}z>K)cenWsRL-wzlMl4l)obQL&o!XC`3mhnZ?{%8*_98Z6?PA;fsg%Y@;3#waeV z=of~Hs>e_18MW7A9=ZFyn=I7yq4AU}&G%SOLOrV3!;~FT!n%mIWr$-R$Ba36&jPOn zp2=WE&2Twu1@Gb2bj;aBwbTfJpj&%iOyJi(RbzbNe4Uo8T|i6~IP-A6$UIFL|MRfI z#gaZU;3Lk2ML$0m7WGg9R8^8{Nn~M%;G@Kf9O+c_GUb-FE1kwx)0L;@c!^}NpM|H*7z z%lb5KB<%7fiy5fD0wFdKPJm;9pRPPQFJ;`KXoNes=F6Pt7TN7zz7)~8=~F`_RX2w{7OGQh zPy=kXFjdm!E;)W_b(kY6B`c$<4qh_itPhQnagH9$ya8^|8UXFXE`BGLurfDcpcbE; zl$3LE%T+LXOsa#hU$He0EP4xs4-(3rIMgN2^Cd++57|ZC=o9yv{<8h_(=EDA5?1!o z1PQ#K^!Tsw@YFp2b3<{Mi~^%%lmSvZ)&6^}T_zP|g!mtNGMKd3BzO#@Vz@*D$8=!nXfQ6o_`77z2<5<+kj6Ei>o(|8_l;D)vmmIM?W^YJZBgj&F>v6 z0!)u3w@Zx_cf7C7lt1H{qVV?=q{RhOY#L_5=?Z3m*Pi*@L=e0!_^KIqzOLSkeYfwR z0ZzWJ^GHqo(6=4AJodo^+j88;p~&dTg`W~wK?L)RvcUxo|D=$<+LfSz@vsoe{X4jW zMislE{{XLTPVcZ8rB%?tC&H$OvJk&`(T&b#xFEVjeI0Nc(Ohpnns^zR$$d-#YX*41 zeU&K(JqbhT)~t}oiLd>a8<{q}HVbXHLYtokIbsAkyDuMh_*`{}E!gEfOK5$e`#hzS@xnO+m zVW;XHcHKDVQOy%@W^O(DjS)9_;Pca1xHPZ+Xo&vf6Ou1@x`0B$>0GA=DKpl6S zz}$r2j>lu^#aI%E1RO?F3{Eu`!31JZVn=J5`?@_Z$AxZ%Z&~2t>f?28iXJtZ^lf{| z7nC>6*(?gfgKFR%NONg!QXEL`AbDH-Slx@Q`F%L`t8i%?k2gL~6PtIbzqpL)x)WgL zKAopfun^{swVQz1qRgyNWZzEYxqgsipae_VGb1P2eW)gtD{NU;m}KpwuTDvCtWqXh z%He&~8Ir=vf)m&;94u+bs(+w>O^GZei+z$+zT3TF$LJqnqWVw?e)< z5bOiYy{pV1E$105X-1vX?;DxWhg0r`l8UawUP**ua@V)xm9YcQCqf83;rQgFwCU?- z6vkoSHT^kfLjGz9DIY`P2;&~$H)YO> z=$Z1vuG0`u{~-(yu){^{nZG*_7&tpC1kb&Y6rZY&!ytS)Lu#rG3+R#>@lAWuj>E(l zG4xZBG)`pB^V6o43{)9DNI(o^47i(>F(WsEZ`Xa>e1;4&6&VKyyM(e-3tVU00IrdZ zgJ_9>$YBbY5k0KGOg)I8#za3#keV;Toj*|dsGVyTgbui?!WiJUDKs}-FfDMVj`-6< z)s_sPchJ3M4xj`+HU>|dT=A@_KXk*(X`K0Kr^NTeMG$09Wb78a&HX=xbpRa5ow9Q* z?QMpKE#8Zvy~^Q# zQ{U!q>$7IH=9Fu2_lTECg%6sNlwa!gQ|-eMsNz%zn0z#V&=vAHzZu2m(~_%hbuJp< zPTY@q3WbxoX1#51&%rm4p-Q5o_BcX_QvGKQH5Gk_PcOK@xxbnc$C#>jebI`+TT#uF z940W4V1_94NdkhcPnH~pPwXxyzY0$1Wf&Di96J`}C)qcX-HUn7nnm7$9^}RRH8w)? zVRU4|E&uvAU=X(+@kFuMe@2vkZz1ZyIIKc1J_gv06T zxQGWLx>emSw!_0PjMxF;Gz~8 zY~IO-46u)IvaviJ2*eqC`I>=X#QM_LxRJfEY2T>9QX5rLXbc&YFYFM?cy;tWXmS%1h8cd<)M#~f~oRa)_{)F@y!eO`oC8cMI8BtfrE7xB9+~* zl1|7G+U!yX+cUicr@jS!8ZBdM>*&W+C^b$Fljf+!h$$4O_JC1CuKdXEgur(|SFlJw zr8y%4?nss!jh@e=(*RAiq*tB7%yN0XQVZqVvLps=XM(H(+x!DR zy^^M;x`NBV;?fm$d*>Nv{&lFa_UqNvnmVUB;nK^P zzRX$Wq~EUGaRcvP0-PwxjV?g)7FHUX5PAVbr0Ro|sp+Z565bDudt&EaACORUDqn1Y zs8O4hU*wDDYspDL;`vjJuAE;_LimT+4wrLD#k!3B_9c+R`qcfd}us1`_RJ7!I~K~tMu+0%5p+&MbsEV3D} z*`+Yj9T7eGZd6~=C>ZFS@xJchNoB8$9z9tT5pYa4K4TU1d?KVRGMT)G)z2$1JcX<4 zJBtn{LHWD>5Jv1&(Zd~LhGs_TP1F4S^q&CDcs-VUn)=B(?YM%YVpgm|t?VMY29yQl z`hAE!YLD62#ksBl@T&leZ{oIAGO@TIwK1HzE}nFg#o&x2AEnp+RpP}Tw+>64wS!#g zi%+tnen_`eYUs$*)gnDJ{pdB+5yU2?ns{-666-kp|ZAEo>F)9ojRUn&)7Ir0ak6Ej~2)3jG31k8#C77kNxd+Qx&z$X=V70mC(P_a@-hXqHNpJ9NNuas9p_cbu27%gM zA)C03XY4Ti^CJSb^z?~Zp!X3@Txr#lO|I%3zEI%dLeoUEtYO85`xTZi$KvKZG>HwC z`lyhlKezPKjk@n|J(kl3ozSxJ(ws`ojvefY8YLDO^_#xwM zcj35K@zLoX$&2S__+R!J!*QY2pbY{Oru^9zzZJ1|g%hivLT2-RRBO8@K~P5p|KfqU zCHgkDL~fYUZ$`w(327?nd2}%E{g?6N8PMBTF4L|Llm{@m*TVz99?o3>aDs3!kLv`F zcdaNrD;z_TL+@?&KcSyvpzmDB$p-?H4W#$B`)fb<&71!Z0F?L8_u&5v2XlZpYnmODvT2A9H1^c8JYA z>5kU-<6|}Ef4T-?%tw*)NxirC%~a0N)&F1G-vH-T{xQ+*8ChTK|2qryQDoI(;_xI} z_-gtP32z9ig@)KYEqd#F1$X4AH5adlyPe0@04{8~#MdR_T(+NK6ri?}BqP3y91gwW zey8Am z7T-ebpCI7{wfzgyUY*V_rq}&;7f*%vd)kBji+;tPmWe@R%h(yWM>Vg|wdaeR+r?Ki z-n-j{J-J4c4FmrQJ~OT78{J+!Q&H%O3+WG*w^daijSRnOiNbvI8A3Ck><4LL5W&5# zy1`n|cq>l%Kpji46z`|^^2$0%Sq9z~xh>U4NtX3;ZiRMl>Byq#sM7*NsbWsisiB>U zKKJws{04uK>=OOelKHNVS{aw<#DdL!g|O<4=+-p zcgkZf=|c(%oZdISarOLt$+4+ea(E?oL0WrB+=-qAS&?x1q(7-pPUz&BZbocVBr-C0 z0`f!PBTBloSWkXRbI4c0s&E={6_v5rDg!+naBp`Av8DE+y)7``LSFn6|^!ArXXpinwz(-d`xPnV8ySOz%)0zkVk=Od{xiPsT zty?h!Ost z%?HQ&^VPK8a0!|!IG9R|mX!}V1u@u&PhwqWOtRA(Zg6z5fv}Ggu;Ry{QE?OKMP1MX zlsT^qu1h}#(B^%eE|Y_cm&ZidVqnN7KglUs_T^dKlxGj&y%_hS%ch`UA`iz6ZY-9K zv<^`^$46@;8(#TVOCfBV5*wz7@YHG75;0M?t7>!ZywY`8AyZ2YZ%*F(9?qc+X&C)d zn}3-mBISQX>H?X`g;BKaJAk8gTCobs`Zg#+5$KAq^LcWrKzJp?W0&NDVrk$?;VS!x zHq&v#9osV6FUwErj?XSdL@6gIT;B*DhG#YcXbKkN_S$19`^~chc#g4EP)31g2bzoI zzs-MeD8nltx<*!{K+hV+NCsJkCU-pbt*_>q75~uB?>CztZ`qx9S&a`*a$6UM@jj>P zzE$inrdk=W2M@M+-N)P>OC{zEcsvQ_Uzciq5zAYR`uZ@mrt9j%a0Z;N(q7^c(&w7i&@8lYL?*7p#raVUKCA<<>|Lp^7 zi4niZm)afKDzry!by}InvR%k`s5{{4ehRh`x++aaf0^P|A8 zQg{1unTm>Iv~s;#fd-#6Qptt5HQg$@-sg4Mr(N*oo2t?4BV*Rfbo1wnGHAIt&Gl?l z+RBO2Vd^QrWW{DuHa*!xes$cVI$+80oPkfqAy?sXzL|a`F8%4u(W+y+H%Z3y`o)ZkPJDJ9h-6AhHX2Cs0Z|OE!9qQag11P zIMOCLsW#;XWv(;=unG$DFA$lJ4FB3*KQksZSIA#8t>u_JRF#g-<~BiXpz`$|A&^;;7b|>?w zDp=n#yvsIF&?2+8X_gYC8|4-#OMVMpV(Vn^7ozH}b07}m9o%g(Du{|8DU*&K3<)#; zrIB>F9NuxFu%_)-%aYQH{(S@=8!MCRI7{Y{$J~_p5)FY(S(S34q|bF%c*3xA3-fHM zZ!#s5yAb6RM6M!ONF9DRh2QoQr?BbCR8KBXJ}(Wkp)QKU^EgO^O_iUes;k|z7UU;h zdFxOx?9oceK)OqxF<1Y2(E`6XSYs&la!E1@9{VhxxPgQG5_i>qnnQpT#b8~(rOvCv z{nGA3V77$0K>SI1b7Pn4nm(z%fT1%-X8vulL6^pHCpXMzx7t8n?Fp||nN9r7-03>p zUF4Es=~_T#Dnt%=L=R_}7J^q07>* z;C`M+)*{Dym4r}>ekQI?hNQT|D4Y=b1+^sJFQK+wVhFA8eH|JXuBP8isSvMC#GLo zBKn6(Bu(jEcgnA3%IhrPNH4|#S0Kua=@_wX4?Olq|2AAM4FuNmV#++)(4JWfQIE1E zign6^XcB%WDAwMmO6|G~r@}HAWeT9i`{N`r;SB27cVzeLw4f7`7K#J4ZB~t=@AC%i zK!@K1Qlk&6)IGddK?mCtnhr1b9myy)cV9>kKnH?V_uv(hZAswm+p^GNmUIdWj2Nyy zlK=yYWQ@9@E9;& zIKz;s%Dl9ceR-wgj=4W;%);H5ySAkirZb8Yr#8h=EGCm}@os2SFO60$_3zv7z=Y#E zP6!Wh$(QdkR&Eh5a$i#8W?`YZWFAIlEf6q!-JM5LPEgrBaAwp)Z{+55FWE>nJ7Jx~ z_#E0>`y}zS?#jqwMojNO60Vc(0N_O_j#%mqUZ~rK@8^(n|79$30-X10J4V!0iY*!p zd$w6v#kV^h{i}`;Q)}O+#GZCx^nj5x7=^QdU|%{A0PM7)`{T6khmQ3|2%i-{9NNc4 zq%4LJK-gvxmB7FDc@}{*vwV)mQ!1BOtIC(r^zg2POu4K*Ak|)mck=rve?Hg(gLWka z5Db{<#?MgmVdAUU#Mu^CCa}HT8Bs26*#b>F7jC0Wb#Q1f%reGmWL$8xrS@bb8 zi0zdNds_VNwyN=6n?a%}4-NHe?h|*lEF>d{-%{P=0g~dCdgBkD+(v{`SP6T1lhND0 z|M`CDl&!tYOZ?1-J3WnX+O)sywgE?1|I^Ve_~- z8e^XZ7G?Zm5oiVLyX8gss~3Z%dga~+q0gQn-Qv<@d-z7BN|t+a?9)1xrDgK!5x_j* zuII4h5Y@^ahP5+}ldE^+>4E5!2`p58<1c&a-<4+KOI;&Ee^5@td0ME(cR{x8!^qe{O8npxIYcpo&97=-knJ!NAJxD93RE~? zSBler?@Z{&4RK|S4|6xHQTr=+!C~%nVEwn=@}JYOU@SXby;0K?5*d*H=8tv`$t6pq z!7bdgiq};a?#G;S4=#8MHt`Ow2D0kq<;iKURqUL z9F^_vpHunM+Ve>wEXek8;As6!JKxI41rb@C3YUGve>m&~zc6!1mHy%w0SO)0h1S|I!rhbU>f&R06IfX*#PeDyrWoD}?ac~%iHI(_N&OJ(xojhp^)xP`oX_8KWCjT+ zN7O@?(=|p2_1`7Kz6$KyNnUR%>_qDg$qUlnYEJXC6(hkiE}4Wd)1Vi;V2)*PHd54_ z@OPvEIJZ*U!&NP@Xe@bfzrihy;gWinq9HlmENVu1uDcNAfLXt0T&={8|ve}m}PlmGo~LYdCTCWA21aFkQfgHy%{j) z??fIm*<4=7>1{fGVP$EASBt>gfM1)g-y1#q`=R2>0ZDhhu&~+AaDmC)o7;Q|CAY6q zZw)0juS7s=>tDx_jOC+47np!GYigR0bFAo3EYIva=DZdV`M0DSb!bs++D0vj%iawd zBn@9?X+>2?SBh{zRw){hyTT>j@z8on7e@8nHJw$FlzL;sCScP}?bTB}EQdw?W3j@z*`xv_{)EM& znjq2Q;Oi`yR&uY=+|{DbJ)2rbej`g36;5941l$`r>q)4THHZ8C$acb1An5N+6ZB(5 zdrL4TXgi8{Zzs?BaVFHhHI5i+TqT8fzm{0L5y$rV^Xu)_k~ysFdRFQhe<}U%mK*H1 z&i0|`L8x~eeMY>iRZP%KS--hYh6S+gi8W(fIa9@F=3jc*b zv82?5>R9nv<#0q3+xKv+xb|V$4D$~BLS{g10rKOn43S+#KK zX!r{}+qTtuO76}oR!(KqR5e-QO3F{Z?G9lEaz2i)H4)=`z}C?&YqmxQ-qA7wSDt{A zJ)``iI=ra`oA#%o0VkxQ)}D>Y;yCF)L!7Q>ET3-{=Bs&gQd(4@K&g zr!*#?{~YT7#uF?vuuKnJ+I1#}WIYRHE)=ig?0m2ACWyuV&{A}V;R05sN~rM@aC~$F zKkL}_Q=6#RW{F?DPdur>7R?8_D86os8!qU?gEwggI|vRG2~N7->+DhU65kUKBX8L*QoL}qQ2Keh@&pGgWoHR#OmzxhSEWpV=UCFXD%Oo&J(FCw9o4nX6F8wI82)97WT(7qN5zb_<>- zaTMnGr=lfHm$>$4z6(7z1One&bkSe?M(t347*&~)K?H?){3BKTLXR%PIPB2;fsbqa zY=Y4l!jn?lrVz4!P=$6~feze4m$A(D;aZxdV0(3CskRu_@)O{>vNpHvM7+z!@Qmo0 z%huSlIiMydz01YL*Mxqo=I>C<*n@E~1j$DGW#YJ0 zKgn?PZ(t$~9AZZ|AMZ)&|0R44i`Dbmf+Tz^ zq(B){49wmbV($sdN`AzS>14t(Oy1rZ5p%lIh8t6taT#V3JIeL`xZGG;wBzzQjJGRp zb%aPH3FI#E8nC}EBZDG7`0%cDsx8Auk&yyFT9tpxA%~@`?8^w}+-rzm|DGP{csk#5 zwg&J+1*Po48Hnl8pg@Hus((0kAEn7w!=0x-G7-(5uYhs2dt2o;egF!r5@EylY#;SM zscN%@>?7r;CzA+3+md(Wx-{s1Y%S;3PqX7m{@a#YXqc1)&9ria`cF!2+jdW;$f0#u zGF$z9YE8A^>A&En#93VrrBGe98atJun)vZG#PF#wX18u?r;|>)hD9VSN943yrn}ay2^<_DbaItFua5GkuD+xcH(pd<`?;l;oGh!9tq1B1GJ012bft_`Mu5`7Tc?F-A$h6Nk8X#-@u+$6R0p}fo=Ujngt7Bq zlT?sHP6-ukz5Cb~S}mq>+RP9tjt_jd_=I{Co}tddI==wMKi@oleyv)ji=_JNZ2>3t zMX^h5CSt)s6Fkc{b23B`M!tgc93wy{*xZQ;ny90#al6U9Q%7FnLxE25U6eq6pzpbU z6YKNEA?9~R6uJcb%t^w?>uqX8>sNKG++0=9*!{DzAzA%iD6FGo=In&>OZ*bW6k{3P zYiTHz@QTFvaYo{a_s4=S+LM-X9A7{C-{l?^s`c&kXW1>J@@iNN53~6Es&nFgeLzso zT>;i7JH{q1!(60$hc=|;yI<7_s#y37-)qPp-AIAXp8eXf?pxCB!Zwc4#v$D`CZC0Z z9l!k0+-k*W#fQpc(~GJEex&wYUOa&xVGz5XpGcvgF&~T0nmZYWle}nS%C(Qkuhl$N zhx9v2@v~M2BPlS= zANDCcH5$xy7owV5;PXvtFrzqNOMCX%Vt?JDVEZOO{c>(D;}<{!**OXwn^IXlJcR%I zJN3Yi{R(5E)ND`_Z#=4K87FM#Ls*VV*iUTW`nOqXD5+47?VghJ`b6IjHXJ@Ch-+G$ z0Rt`RUln#Zni$S%!q}FT{)~IRE;*_9;KDW{Y zUn16bKZF^5bxFi<+;d z@h^RUHtfGZGQb%$m!H>vCue=f64z5Ce-1F+4Nyr*z`($RYC`mXoi1 zhMM32j7<;`M8=Ydu9uD@D=798rdXy;wSTWwo{Y{Yveii-Ig|w*NYC+(*odcvhqisb zby%apd+>%&VIgea1(OhvKtg{^C@LTycwFchpaZ)Nk+Y)ovC5q7t>{aM6fTTD@E9(( zbi6g3xl)mWxZF54oxT<=XG+Ij@4`~5)ITyomgOvxB{tjgtWP;$#r!EZFfQ@;d?0xZ z3s(g{lA}$rQ?&cjHoZCrt(h_LZ6FPp#OH!QVT<4z0pj6UjSEz>`CTO*g~WNw za9~j?uO+^fxT)>B%7sPY#*m>M!w5(QpOP>nuSR+JiH%Q4#5iHotldOoCbbj z-g)@!TY)oL%Gx|kGrDV57VfO?-RCk)=0sbs)q@axS;6r`7E+{Fa{|FkC~7OQzld}K z5I~yP(8al=7}s)D2!oU_m%j73dF~IMjEI@FpuL&xl2utEgYqq_%Bo&A$LaF~*d>%M zOppd%mph^PfDc_z&INWxM)j9+TCk8gSl>>bmbIS+@GGaG76x2CeIo#6Bp*>eAA$j; zn9ifer4YVDe7dZM5%#e@(Kw3@jKRlMiz4!#fM<)}OfQWxW)>D;VBU%wy14w<>RrQ; z`H7W{3+Ner<5$c#X;rDObKOVniXDXkH$VrK2H#BKPWacY z4!AeQLG0}~0% zbW0SV7*$}iNYgd0mZ3IjX+-G9@6A%#5?Fe7kQfae$f(hCyC)H9Bt)bpecS6WIMwy} z%yj5iQRIHWH52|zJ@C2mI}<@tEAJHvM=abN0a|3 za=`3Biw@4YjDZC;Nn#yP(e0V=?`d7BFIx6F*$U}DHw5M+DEg8>t2_P{0)x3#1|6t? z5iFlT?=I1x6B+Rh^U#Vg@;iGt3jF}R2yDocWZztTk)zOkSofK)D#!(I@--} zDp8Egs})g7GHx`c5?pZK*K#Y6$WoU z%}H%7HXX`bwBjv4<1%ljO0pVCXKxW0bBuV-&_asfmhjwpgo56{cM4*nU&%hjXNX*aOYYju71`RYt>8d_$TiaN*t10kB%p7X(3vF`R zS=0@lvOmvQm%s+O)Vuf}1P1jB;iX)#P#so6q>bj*49RMe(J2^k<;fa@4B;zC671)5#;`@zvj5iVk&V>?o*%4BMC%C z>i6bCWhVX=6QidL52Okh|NgiRwrT8jKMpKC*MeYErw>9ggQL!yNF*jt2|ZJ*+bSfo zC-g%_%IJV5+0PAFqEYYGQw&F{n@iX^iJy^pAbG8XNM^2{`~4JnVYWz&iYi|qRShEV zgf8;n!^9T{VG&|2uo)c&gwkmY!HNXkA|9MicBe6#!2k*QSb=CQl=<-l_j!$4;Lclm z7X=t12#N80 zBKIDIein1edq#`0C@nByz)-9g#shW}T51>8xQ{~m*>8z^veOPOmy=sy$3NQ*Gf_eEYPO|r2qDy6Z;r%hWx(P$MBrl z{UcIj=O2mt(qIPEEPr&uQ;w9recvtrv-a{GA`&4k-=(a)ADjxG+Vz{K+o>obQug~^ z5(o>JYR}SU;M}{9Cm@a)&Bj*|Mc%n3i90NTclwrmZj*g>?BqgcylChz^E%z&73i5& zyPmUlQ_!aH`|+uSbL#Iz8|(4&mYfgV$0-rD^iv$M=z%!&t6UAp6L0M6Wd%o!(A?{9>O%dtN>ZOkBM zEHW}ip=^!EB?KlPZN<~J7B%BcD|T&@Lb+s!LR>Rl^j-wpo$mncF}&uc{Jj2*KPoBqzCXSe`O zWouUaJJUFKDur`4WKBrr;+^$4?-pL^QcyU2YmO71h_Nmff5o*yzawP;6C)N=O82k? z>xv>;o|#&2e4DtIHmR(EO*hFy^Y`kmxw)ThosQ;sZHbx)^uq2R|IVr2cBKsQB;zWA<)|j`U>fDy?iPfO|EHLCj&Ko z!qhezZoC`OM1vwuaL~;U?5##!e|dO8jU1DwaZGdPsp^g+pV+^}%FVJPM5sPftB|fi zeb8OuYOj9zJ|#-A*>qf;z<(GBa2A(g9FZ;={(L`awyExd<&Z67qZRu7q=lYO=)O4@ zzeY-443T=iO>3;nmBEN$D$ zPr)xI73G(J7jS{r2j`+v8zQMpII*he8Y&`fy&G1^<)EBjIhN9$V?9QeHaVesYxsXe zU(SCJGg74te5vSRyXFzR8HuZ+%ImMF$mXXeBL(X^^a%SdNrO7 zKk=lWdSvaIZrkc%)95$hhr>l{hbs(-L+h^~W_jDDg*kXO^@`ux<~n7n&-ES4XM*rX zV`)H4VEycG?Ii6%7C2|KLkH6=L?ul|2T7{{ETC08_eiW+9zh{wiEH{OxJbzJ!YGO&EvtzxGeWIu#6cIXf{UHP`S9oE{{ z_k!(a1hN?3!1|T55P-DS9OqL4z+)5b@$r}{%Ls@ zig>YeW%i|ohwBkzkVd!n=eIkI(IHP)Y7v44gw#V^Zq#iF$KoB9`mC7YNU8{9eDcKPH3wSn+sMl&YU??c) znD^q}?G{UX0TEVk@(r6lZw3oz;u`mru67E!W?z=VPRs2!K=s^E8GPMCnA5+w^7W}TFKDl>mG}>PG^_)?XzO^a z5P7TkWVfwDkW^N}(PZki>unbH@)GJwP;qg}GcVt6)DFJMg>-axPG+>0&z84+rc1H{|9vkv()xfS^KiT-UC`*rc!s#v1&3;w2w%PCL2%js zyhuS!JDOG^Zg+aIWr0)27XQZ=4VYxF{kwU#viiFH87u-(-PESkJ2Ee)Rm< z&lpsq%bBI^=4Bgc#BuE2%pk+ZK1VAmJkpq`LP5{jKfoC}uJL{ph+A?+UOwT{0yU8^ zs}gk`2Pv!dS(VjPHNnVGPhn$+{rYRj#Mgm&0<;8bEKEcg3B|KeCdbEA94A!;=ifJ> zd#NN85%YxaOVrMS<3`C^mRc7Tr#B~Dg;DK9P26$C=W{Ux5H@ytPu8m91pIQ5?uq&z z*i<=Nmnu(NwSz&Wle~{x@+K+oMjOUkb|swN@ZGa&CFtC(*h?=O?SZ)xni+l`MXC!3 zm&`3({>kbt$rS@dsbPID#HeCr+26^TLb+3C#vkCYVTp;^$%K8};hO3tWf)#6}m@f%r z#t0(ckKQhIOkZV^uJH>4xYO~$_;J^27zRsMOtj$<(;JP8&UjlD zyOi!X0-|1UDY}S>e#UWxI-qAzNDDzmnJ6-I80Lh2eQ(Fx`+)2eMQ(n{uh*0+;#MQV zGrbPP?fBHA&D((hir4vBvR~syP@FQ=4$d%aQ&%e~ZkqlMAwyx`Cq)!1_iU8gpk(&f zuH1~U4JJojoB6W$bY}NE&uh}sk-Uj;t!Myo2;%;9)vv*Gg8LdX5f_e)hG{V}=?5Poe z8h=kI(ykmyRo;DW`V~G%zB~xNiPg(FQF%Bdu6EB918r=7&onPWsBj2?! z;5$Gn3o{;3OV;|kT;@@PZu2}%ue`qTr|4i&2oiOtRJJO#AK=emqQJLN7}C8;)<8G& zR8Q{7n-cA(uf4p{F{qWaQofw^?Hd^n+_QqVFNN;srv#c>4T!gFRtl&2g-aXj5B2n6 zoCK}0q=S5#^%K8AgU*CA-~JDl&yD+02iY_6V%h!;XMvn9E%e_q(v2#d4jD~pyhudU z)!E84GE~04gQa_(Tjun44WjWMI+I72u1EV9*eJ^&?zDZb44MN2bdfXf+=_=B?mFJs zH>E;_0P)bT%sce5r&Y%1QCejUw)2ehjSH)*yva@Xmg~eZoi!IL#S7oyrPNu8z9KV! z#K8q4yrn*5wo+(#CGwPNfN}tgTy7IS6I{KIw_`DB&~|#iQ>6YTL;yWVPVDLVhyKH= zoI{%(*A9~tu=%WxKd;SQeYSS;20E(ETbvp?w*CN8_GA!yD?f2C%AidKW!dB7x|;NJ z=DhJZW);d!i=193tW>Ur>0Uj;D?N^;zjSp}#j&)K(`xXDG=+;Dt8#StY|8qwAL9j- z?7A4W0IYM$7cVlt1yr^z9GkQS5Tx7~?-Z9N{QwV2xctJ@cb?#QOo zR;ZAM%cmVyeJ?+F09CqX(MwC{8e=11-u2t`y4LqHvcA>K^iW63Ig)7t_;T~1I;7h}=CLOI$&Ih8AWnVPhZ{_Ek0=DIFlKYQ&cC|F z$-Zr4DGzSt1hRKwMng4t`(A3(T^vnuSx?N|9oiQtBD^QOcL6C`TX-tWWk|G<`W8wL z7id*jIg?~#6#xasqAIePDrFsN66EhRUT01&H2$= z>TlP)e-?i?L)S_^NP91*`k1f6>M5=g9t-0zt0;LUHD+KsP=CJCazF>w2~FrDyy9fg zt}V&6P_jQcJByLvoi5?!F_GB8$MjV6niFN`$ibCynOBvRi<+DE8bJ}L`WLPz89SRI z_j*t72ab`5h_2U1y}QA87d=Sn>9m1Z(=X)rTn)fB-B9K=qd(*V2Oq12U!R~~N+7-u zIx?z=-zuPO2!^Xl)NYqUM(DbYoVWQM4Qg%HuN^|EMt?Eh!c?`pp!;+pqABfRPqF7p zZ0|gc+_~D0jBF>GHrTLcNdo*0eNP z9W2HFu}1cg{zu~Y3H_h6=RfVve=q;b^1nC!Q~UhyGhtx<{{sG#@%%6I`=RTg|Hc2m z2K{%uB&KjZTe!HmQKcfo7PIQU!5B+AQrAQtxv)PPMa-O;?4w#yiyi#^Of(wI&?Q~! zra?gC*V%rlVZY0-9_lg|i5JoJzJ=9CF)h9CLWg4b3R|Tghx2*!UAU$Nzf3I|w^1yH zK~}h|P3&g+lq&pczMJ}9NgfU+5IC4?rZ#B#xNZE+CML}#H92=o(7u4WFb6SG3MI%a z5im0-KeI{=q8NPYcptytn>O*AL-r~KdS*{v1|xmQBnxkQ1;G{DmCgQ+<@%(W2xikB!HoBU1e6OEFB z?zHWOi?_TQP(PMBK1am!<6~Cx+cLFSmVAZKP#@dKMf|4ckS6!zOYhj^`R@C@qyVWU z=aiqbsy}|ud}0AuDNY_l^3ox@(Foi`eQ7E9ox{5;5Dvw=AG-W$F6Fm(sN523en1dj z`@hiwsP2`VIvjZkW-0v`z5b~MbSWG@w$Cb!7h}_Ym@FHqBFLQo!8o4=#VV}y$d5?* z@tr?t%BZt|7gS8by~ymc;-n-6fbrzt*bKS zSmM>AaIFw^+Ue8GEQ^{V-Esd@%YfFX*tMju@z);K1OExo$2To>MvDf4&#QI5oUx`= zan{-8L0J>$Z;R@@@h|Awuzlv;7i$BXCuCU)$r>ej71Ng4+ZqD`>wn+W#G|Q--k({$ z349}o0KF5?ZDF90#e+)+-~?Drc#K|U`S6HbwO9>3PRS+$%OiMNy{l*%hO@266X1@2 z5w@=tb6em&=k9T{KztVD@|Rc?sG{mweFjU_;MPSLBrvJ-ZzV)C;qHIxXN+vtG^jBs zsL5aN(UHTrme2gk4U4fHPPq;Nxtq+pUf6irsO@Qe-O@u3{ofZ0_#0r@3;Fk^7+toz zuE9fg(8yC@hejs*UcBjLm{@PvJ(<62Jy<63efcTxr!O)m+^j6tL6>fS+GbZhce=VM za?C^um~h|>eKgt`VHn_EWn%Q$*%%}1>~ixy3v}oC?ss)!A0^>r|JG9b%BS8t7rWW* zmf4&7NzPC3_Sd|?Q?r6HbJ~ge+w8d8CNb%gT`AWP z)K2Q=91P8q7&5-iOx$yAkTGGUZ8o54UORm;v$KvewPvj8&yZ}uof7^K+m_d`ONgh& z1qDfcNu4SV0*BH{cDOG;&hMEW<#4RxZ_Uj8Y?y6pmmeUmx5b)C z5?VKm9<%fb3u#YN&jw|fQ&U+GcV~|sN1nsUad0YeMjulY7dsF$HU_m1q%WH8rma{# zsdOLy@oOKXqwsg9te){VIb6vv0N`*XU`&zzYidQ4sr)SPN(}$khxO&^KRS^(ds3^% zWaJUFU%#+^>FeQkUc!3+Jp|-I-G5}z7B_Vk)TfwO9>Jry0nmxn&E(pDnY3kCJl;j8 zR@p{3o@13k^#(?nXOJ{|JF?5pzgX}TC->yKzn7fH?-2Rpzl(%sS6P>^v|#?c$)t{hYFEC@g3BX%2Oj18dTiHEs}h6MO%VI;f>3`(d=8 zbc>qYfHk`kZRk2`HK-7eV1;V8Nr#+ei=MxV_d3D^y^x$%>3kjW8*uD-vcgx&%B(8% zk)IJG%PKol`;=*wL@6dJBi;Ye!pwcI*hQwf3@W+IZWDgQ(t17Nx z1n#?+mTZ2Z>osovjw``AInmj<>dcQ6y74~i+hhB$6S35p`DDqHLO2+V>(o5h7>w7W zw*e3$a*wEJ*CFlM%s{#NgG z0aBvYCwM&gLpR*u6}13%wdX?hmOYUnnk^ zPJYG%ifv|nL$C5TB9?;O^@d69!8dnIz1bhnE~PF<_54!;?Yh0GX+Ip6T{@vY1EoqV zA&WVXKJZ~kNKu62KgzlDPM5mVrJYfdoP~qX6u~EviWI8i@yvLp@+8N`v*PpnN^D3O zMM`C8zdKnX_oG1p>`3JG$3MRpHGli+v5xYno3>f=5DReat2jNs9`vWpvzf7p#iACV zVZ(_5-H-OxLWIz~=n4!EQQpfyw`l7%jz4@__yss;_Co+X`X-K(iWu9ea8-$nC%(9k zMd_`w2<^z_zpuY)PBSXN8(Y&GClr^87lmpneo8cgBzrU#@-fPCDE&XQy;W3PK^G;A z6M_?51HmD6^&UP!_K0pB? z6PBMviJanPu?FVRVf(X%;{}}$@P#37*F?tYqazy*oml8om?@lD5kj7D7Mf3aNS1Bo zjcNQfk9H*z9niASC2GykHw?)$5oJiPS#VtuSQ!fxX8KsswB(-=k~lz%N(<<{O0t!> z86}u$-hnltX0Ov70&Qt1eFNztvuscR$T9F=!6v&nqrx?as^^89ICJybB1m|fD&%cQ zflvbp1glY~wt!7%n#88|Cu(RLF?(=o{HuygGRmsD>SRzT zsvg6JRUz@tI)J6jp%unWl`gXrE&Q{(g9?CCK1EK!9vK|@M|VfP?6Y(Hofty8sydAA z>}UywD-GVE82NOoe!wQj&*|-t*leD}nXQ1O!X!Q?@eB=77Q^a897hfOlwRO~0PFv*hd8!aMD((>_Q-h~XVkR>1!d~T)R%cMF8a47(pPCOEW1)qHz<{52JU}?Y zGwt1bHjp6)Y=E!t0j9-3e7vy#yv}1UvHxkn`+VV3jo-9Z=p_{v^NnYO3dZT?;meid zdam}{B-mY_abUiBjsW`)b*35HWMr2aBfhoFol-IIfDFmo5X$zPvpIURFr6p}}KVu!Saiebz~l~puT zX$FM=gBfA>jkez@r$CTASA1PB1 z5#NU9;|-s%;Ii}OHDw+?2KDo3)K;k_?dp1v@Hu?zCQ^e- z(T{y?pw{m+{tsF?YisEwbM)Y#1bv0&qTp%~3BX7Q$@sdr_IJ|x0E@Q(X7MPZ=kMgk z*?q!aB}z~EQHmO-_VQrNAZN;q`1Gce2L!$_E%6IbbW^Vq>uQTJbOaW~H^^Os&42bM z3uPT1O-E0m9CRBnK$eGs@u#@!)?4mi>w0bEHoRmg05pWJ|LV>ESN~XX->cfCggf>e zp0_u`(NjVxHlV+ zYM3G9+fhGr&v6r*+vVJocs*_T8iMfUD+aT`8F{$H)lCxj`K{j<2wb*74?Dq8C$k@K z>$+E3LKFq=MP#LUWYlH}gfhovJN%q(U&5iUeGxTiFrz6kO`_a1!4b)!-GBQrh1@(G z6_`Qleyz*+OatLV@on{}(9Ye$1?29(SPO>d|0!Aqu{Sb7BH$I&FpJe|raBIKYg3zk zXykje_A}c&+lIEN=xWx}m?uKStqU(m4`{3;$NF?Fz$fs+kN}$8Ak9mWr*?x0u|?XF zbW|>gt!1d4WM_UU6>GJ|@@jS=WdDP7t2CFTyQ2l)etgcLT$+iUl6TPMNoo935`QuF z>pc5^Ls9cU{EL~bJxAY2-Ue?pU~CgMIX*fxf}Vvrrz5nqETkYN|5(l#&NafB>wR zG67k!o(bvf3d&-Y)}G25!VSK%e=!>2uiLBjLxUKQfCg$U;)LCXdUpCBKrUF@EZVT% z$#TUkO)d;zCxRaqAuB-b`~F%4IeEFpkLL-e=ek&}&|_qr zpug!g;Ysp`<;x+tUc@y76T#RiyXKsZ0EGVrATDs=Z{FKy{np=Y8?Z%u&RP+99gDXc z>Yh*K$Uxz4P@}MffiFe}^Xt+2%?v2=9u2hik{n+>Gw|i;N%qL!9ej`Ee+nNu`m!Qk zUvnHjC%xu_4+F-@X>TsPIfD|GtXw)%coyg4o`KN$Ijc(3C0KhNs?y48D?W+Uc%z{3lk%Sje!j^njD+<`~Eyc9B7#MT`*GUB56bfa! zZ2%Q2hy}}iW&DALiWJD&wPgKMD)OBdZ* z2_%9b#Y9Iv=Iavqf2W6A5ZMR`3EAQM$mY`|1BY>GQ9RSU3uLAN>_e4iA&nhJ=g~cG)@eRSqjvnYH~lq8IyVm#GZ4 zYCG~r>)o)cBUD#Dm%|Aw7oiUk{4Hs#2n$mK;*+;4uA5HKu*Y^Jxb=N)@kW=g8X@m* zO?U79(doouk;uCe`|0Qjg7$jyEnd-v=aT-}=yaY*pGikEWbnjU-?P7XhkY@F|{7mZ2o?Q_~Gm~LT9)G`vfjWb5<~6>;0)AOek(yJ#RBqN^ zrmTj}IijZwt5BuPA6GvC<;R-DN4d>=qYi>Y6t6x2uFjWm_%DQ-h!wdPq!m;sGAcTEcL-nN&8RsZ{a zSKa0bp4x}cqQmUZeJr8Zb~TTMxWHHdu+}`7gm9X+(!*a8c}@MLHf!OU0d;?*6rj

{uaJ|0+dlO?pV()=~Ng!H-C06auGT}lO{VoxlCS8`wLU&R2g+CpR;V{OM2=ZXxV=?ffl#7PSo zY#BE6M>Z1a=|cNig81o%Xe&@SdD_0R`_T#_Yjh&(Nc5EBebVWkb-pj$P|=b~#$NtB zZPpVtem5q1zb-3z(n;r`3_g{m1!teXfOp^Q9pnjJ#JT$BET-n3?gG0savC;e0Oz&# zqww#)hGM-xG)u#~Z_(PSKV7pVfd`-*g1hs%Qu5fIIvvj8^3ptSU6pbmVD*@v-4I&b zFK@Dq5mn_7uJsu(PPp!LETmyRT$+xW-MNWI!QyuzE38>23oUByA)Rfy@mgf`uySUi zg*^Xa?ZpX`P4_{EZy!B&)@beMF0;;@TC&yZf}$UDCf)tq*PB9{*QQ~M#?fgFX4#la zx`QKbH=Vr9R&VKINSU8nQwTyj#*)O+_q>t0r-S!vy|lTj0O;@Gj%FB3ta zB7<6V1XIpzhT_c=L`wYWNqYmIo9oMyFNOA$#_4_<)6uf-kV&pP!p$8j+SVyb&I#G3 z2k5$A#=+$&r(CiomG(6y^?ulSxhDs`g=}3NFX4iu(B{fQpe)z8 z)=wAx5nF1QQ-qts>%tC|9W$MJ`dJa3$c<(Gh(!I2>WJ)x`zJH5+p5t?&TgyyG#Q*_ z7wp@}L~#AK6ac#bcX8!9yF~s;jc#eVn58%g9~-Su08Ck@pDIHiS{o08c$ za>J{nT4e^9Q3vk74$pQY@`gvt=XmmR?*~&hF4MVNnfw)TRS$II*QNTW_1u-WdkHQM zLDdJP#DvP72#1F6K7SsEh?<)rU{bV%>ojgA#D!5c!b@jU0}|~F|8DO?o8}`SN#8=j z)2CL>8LOei0ULsEg`sYf`mWInE}6!e2VpmAT&h)Zv3y|(3$8uCqoe^_r5UNj?$!Ax z-sb%-g=2J_9BsYMSnWckAA{N1sb0R@-D2n9rz6O>OcSt`Mi(DuY`-`f4~OINgPkbW zJg4MFerT`7SSPIdOi_E~!=KYfdATG*JKEwP0I$I+U9d+~zWrZRYR7QYNJ4BuQF)yn zU967e293XkRyckViNm<7{)i%Ofi0!5zg%T%xn-Ch_pu8rJC)Kq{g!;tL6zz^VPUgK zv^nB{+iUiHmY>e!;g(pAL7%K>(5~8Srxt!LB^w4o%h%J z7+`28J!_si?YLN|I98n~Uqx;11}LwGB*((o?F>&DEn%O2116@k){GQpWZsXYrj}CV zSX*4p7(OzEXa23d8XW&5DC&5s01k>&&?~*s-IM97M$L7-UYISvaq-6?C(0vjK`LI0_rlS6v zd@zVBJ+9qRe@OyQC~xJ|KKI9?0+ysiO*`_aV3Go8Dpf+ZiN z7sw$>UHgV334MIc*&gSquusE;+g=hA_qIr&{f6005dd*-grEtN?CRyI!wfVcFO4AJ zUFrETK8wRhGfl?EPU>A~DGKW5ACC48*#yfyuNvrYQYsEUvI?Ik|b+)&r-~N z5|N<}fuD3r8#5vND9@ixTSjX66_MI2;8V&6XZ~w$e7Plu6WQ%dQR&Lx5da#ht?fwp z!tiM2{DSuwj=Nq>&9`r$6r%+6X&Q|-e=j^MY?duzNM>e`UFcTRSEKGF4KN$7Dq1n# z^yf6Tv{xXZ<>3+(^`=PM(LU5&p@-%ReM64mKuui>`ol769)?cZIZ70-b##Oh|6H`BB30lT=TW?=X zU6B0y9rt@P?uj=#zIyZ1fL{(vn(BlPBJ5RjLht81^pa3d7dOz%WMtu2 zWocOp3K#rsJ$^^w!sp&(sF%yWx`AP^ED%nsv1pHUt1Bt-du=2LP-%fLP-H-D^*vk_ zd0sHq-{Jt_1KoQA5cA=A1<<2@z<9t7N?@<$H1E{|U?>t@VYmB0P#9XsJ*o`tKg+LQ z%sIj9#frl8nJQTPS66G-QUCU@(vVY(k8JkVR$#+Je*LDdfjl92nXZrz?tdTu`~OhJ z|0QVnfki@nKuZ5tp~wHJ>yM_P{&V5~Q7`{#{{M$j!O?y$4syC)dte(Aqj%9!@&T#| zm@h~>CT)9m*cg(CjPwQw(=r&0cFpeN$ra5HWhC)akT+*fL_c`Hk2D*fIi5TlzTLwEWKP9fFN%d71qNR{5(xkqfzYB!bZlDT#`aj0(Fg;&yP)adpN(R zP$gaDAPw{2`=9PPn=8LhmPTN&8~wA~Y-^Uqy9@XRB4PoHk{xSWo@;^?R{A`xl?xbP z<1R@;GdtvMgziJwE-jjaeM(EE_j2z#1GU*7aRB!)%R%v@7OPOtuoX+7zmmOt?*bs? zDYls*p#f%o^kaS7zi5T=-U287m*;+7=zn~8VBQ?Tp?==0Cz1RvNH9QQI6!|8!I&s) zw|LKu!p3Ld4(4A)PmzMNn{;E_v7 z=xoN9SF)?kl_ooF0hq&7BgoUrVBt>bZAp+)u%Yayy4TAVUjB4}M#Aa-i?lMTnWB&P zq6ZE|Km5(56nK{8t6{(X88|yX(QCU|KH~gXOIwn&nsa0rOR#ts$15P^=JuE0`TPI@ zQuT{{w_33s#cq>OW^g_IofX7xKC31iSIEFyOFXswL2JkpB%VbD>PZ-0E;*MV38(nj z!K7)sTGn1|L8Ps&D`PbNuIaq*SbUB(%|igPE;0B6J19KfFv^3%-#<0)N1`$X3(Jxv_8ct^E>_GU~+3sQg6rI51S zRd9Tenf2XzxvUJuxb~A71D#Dk8heX)OigOa=dr~yBdBpFu_PQ`9F6fPmQaHwd|T~g zs!GlAn}PH&?*wcK@_75Pm1{Gt(tTsBH62!2gvd>i(rN_VUqn0xqMwqglIJTm>s!J; zH6rlBvat>|w?@~^&|L~Uw0|Hrcj5oG>E+y9sa%86lQZpgCIaS&LrfM3bxGjE$%?Uf zInh&EaUv;0sI!|B!=Iw`yg8}Ax>SSTqQi`mKj<@Hhm^i$kts{f670Q!3%_(#*kPTW z!oyH-C6q1ImT$p0q1xMT(>-zz_Ennx(V%3cQf}}8-{Gqqt5p8A7}ZPD>!9Yb`1@Gw zcmI)qBrk;&O|~2zYx(l}Won2u-GOTlJ#E^!h28A599tSfxZ0?86@5auaa5uXfg2)y zWE{mW@Irm-FR6o2O%`;bMfU>*1RNWPXHk4tO77ke^BdN}yq$X?Ix`A=#jrnTaQl+# zP0c6ilpl2Yg|D2bWhFm<{YbW%l?!9|3%@|}!Rgn(b1T^MCtn-iIr6GBHI^eJxQK@> z6R2w7YmbE;wd->{Yv3Iy5V-sh#h|Q6z?*LEe`nEx{uB_HFBO zOm0=xb`7S+y|{_QkchI2Ws75yx|ij-v|oIFkWM`XjR^D!sWAsMx4q~9Fipo!LeQY- z6<;QVAY7iS6J@5#Np4Axf|3vo`M=O(ZppefXHaXm2HZ>1mEH`aK8aX{q|}I9mytGi zeUdy;)I_OE77p7*v-Z+_uxdD%GioLm!8Urk{frrZNJ%=WN|H}dq>@qnPkAhr!0}j$ zse}bW+dQvACC--{dWEkI0~8I~0-f>Z1-F1(!mrm48BtS}uT0tx(8)VD4S00E@MpPl zlT0pzndhMFLF!_*kj@?gr}cRm_^h7s?;p-ZOGM@hk$D|l)TzMDvg~_&c~(Vn_l-Bi zu73eT2;)g;7mxxuyxiv_f&PCrW4xkM1^iG+m!^JwV!Fdxp+;iqysa#=#jTw#3V6MY z4GS3HmZVf$H~W3?!_R}(BLd&L`+v2B4B3}7+wR%W$2{mnZBr5iBPZuSf67iHFgdJS z#fdnXlZ%~A<|^TVY2_*IZ)nBlW~v*AIXJ$&%by*np0CXv$px-*|0QS99Wt+iwZl|u zou2ATr4=N1ck(qU$>@LP44d68;*_-@6Y=*v!QU+uASqGBcc8>f0@49@0bfe;^6DYZsrmUxtGETa#BLbY| zE&ehd?u2Of{$?ffojZ~T?X3kB$m{gad`s^ZnUB89pVkd>cO7C?jtX22GiYDT=piYg z5>~9?5JOzAiMdW+`4909Ta2)a_fxhO4D&Et*ddg~xKdn`2S?&d*$?k%4uVDf9)y^b5g zBSVy*Og>Pl3-dm8B>b`B9_`ero|2)S#90y?`^hfep`$Vv7t+tb4?n!KuDw%t5kA3J zO8U30$*An)bzZA+R;VWc1qi%-Ia66x`Dti{+Fao~;?<^iac-j~t>9DpPvW4~*M3?u zYcDJM-Qo!1jdjuv^_CH_mNgDqwX}$t=7=h6+^dP3K$F9kgf9^K`WXS`D{Vsr7HULC zP}QL*R!ziKuM)_ho9w`j-_mG_#;1F1Q$g+|Z_eeJ|EP%__vaCcBNv}@i^w0D?=EC1 z;lf-t4MiagNe?q8iE_WOd`~xZo@`E3sFa-r=SyE|;bR?~Y`6wi^hAXV>0UaR#ajL&HMJlEjP8PMEd>1a3yf-hs>8cD-+Q&)VRmq>3WSs zxO3+W2@Edum+kOd9C0iK6&RD9B4lAV3oit@K}*$~>^5Au0$K?X^tIIMDL-^^+Bu3R zY9c@=ne`PlW#Dg6@&$|Z@pM>p9EImXXdZWFq7?(11ozyUXo$i?8}B_S@o8*&Ww`W)?KN2T&uqhuMw7&8>iWG|-C-)zS1hYF zHgz%Lur*oHUR&?kLk><*QVA&yR7Qu8TJ2dBRGr}xQBNh2QFo=eix2enk6({BJP1pR z@FDtPbmDsHt=r+JCpHp@tv&KNqfvO{CGrwtP6=ZUJn#l{6~49KKMgK5Z_fmMmDa{? zR`(@Qf3m(z`@kY-Bm(LpFm31bCjjQ|L+H_^?#KYetsII*$*>~M7g)$ViAMla3o&7- zbs|Q_alMG@qI{prnk#LHb#hal%FE86+#wVyf22Jk9X2KNAb z=tnoRXI1%u34Qf<=jFpr=kc$IRvb29L|b9lRY$qTpEsJ_Ml1kag_7rYs&mP;N6;jo`l5j$O0DjSX?@o} zZLs)?g@MACC;D8g$jxiv@K@~MifqTDIvNHeWAK|aFvxIp#5P+206bH&um0$xGjm7)X`+g)#tRa&*^i7Th0Y(-x~-GN z8#X0Gv-UgkYErT0DG_tqJ&d~acULH_VKnjUX`i91MQYbLBS#Z%Dx0|&l{7oixioOe z`u9~8MGZ#o=olRWAOaiX;Js^In8L_>ntJHHVhJzO$^W1-Yt4(b2z|Je>~uYlNR<1R za>O%&dDSG@)a-Fm?H=m=zS>mVwruw)ubJzdg0W!}Gsh3)pl4VNb`Yb9mOoKrg|C4of08E;UX__H_rhP~YV1U^3A_;jus$-gmxk{2#mGv{M|#vb zQ&5R=rE`t$pM{;e8M#f02a%iixFo#eA<6J;3vGik{dv7J;2Q)Yzi5pR4RSZyaoin;4>AF%O<>hCy#=Tb>12VvBqK zNc(@J4m`d&zLGumRU`A|5fcOIvU{gYDKtpxs)>0L-hK+kQ?q`WMYFx7TSgXMYeyU3 zxUfD)fIB7?>M0UsDo_^*%d#4&-R2gPy^=F8$WW*rpWxm_5-{IL@KFeg{DKT<*aEeP zYmn)i*0ar{3m2+WTDPa@nEpyS2z~K4_zaD-aSexQjSHCmj0BW?T>l&bH>WECww8(O8dcMhq7smg-JM6>&1n1)cI;=Kr)qQ1A zQXBw#%Ubs{JUsSZq?NLilaviBhp=I>RGSml_%qrXd0bJ;^3N2&jk}+y_(!fnX_z#$ z9weX1ylkh@K}~eImKC7wH}Qr+BYREXU7)3$Z7Q#8jkwU?PCjY0=peXU|Yc zxDBnx2!$qcEWb=)Lx_W=%1dabHy)|Uc6)1xkSqA6BjJOskkE_tBFS-S?nfL`_(S=lp;DLH$Kps zYDp?j>3Ik7kM~r}k&6smv)#uCp%c;}OUJK4#+n{nX^~^wWhNxfCGQ(xIsR#*#@&o8 zEV3JzRzp3d^pkvl7X{?oyp4$Q7h_dOAOq^R^r3dVs@kWk9#~*K<%cf6Ky`3j{NWpekbX^Z@qr{f&1+TN*m*< zQM!=xZ)I*f64EyMo=(|gsyTvo&G}j>mn)Y%YnO|jU@TO`v^@IoH~ zb;1)%N$cwD`p|pB?aYT^AMu-7pLe8R&mhV7i%{@xjFUs>GUC)TN(F>L6I4Ue4>d)=T`WM+BJV_q}Z zcQL92!Dl1@WH|i#(*8B3N?3$Dl>e9R9-kbUn=ebNPq{HIJ^+ zWV(sKM<0$bUPzdR)|=^GICX&!S94Mk(0o)7>E zg?r5(!{Ct?IKJc~0G`(uD7(6#gd+$S^KU7m00cxnI>DBPh1VQM;uANOga5LPuRKQT zSFhN%OXX&Kv-GS zgfaPKBR~#^{tC4;97T9}n2VnbLFGBSj3 zdb{pY2@5P+=?WcdOTPC#kZkl93jY!`w&`lQP3j`f2c&;Lw7RDO&L4DD*xW~#`N0aV zR}#h>v(NV~;fLLOb=zJ7z-Dw1{Nw^db6Hljvi~hKAAnQAV=6p2#W5QxsJ!%zT3B^` z2vv!r8pR6!#&VAZ3CV}bKBG86r$72tmrzU&jH&jVk|0)W#0Jn#NgWbu%&?wf4 zfFyvg_N@AgPI4%09r#?F%jDGk&V)_;-lgyV(159|ZNyC#r2LStGb4AoH~?eBziR7} z2I02~;CuVAOGLiK9w_X*O;q8xilXhFjDB<#i;``+zn+F3ktAiuK@Y8unyfqA_auJo zi*IVghc74ph`1ztXJvN6xpH$~!_a`*-n4*YygwQpE)U&x#qlLJ#9i}n*g{j0yCeh( zx8$l1D?S^%DtFKt9tkzk7mK7tsLm0ObF6Z;3yt?#W*g*O@IUuVOQG6 z1naA6EJ~85MK?WCaTnd&Zy0UKbkl96e(g(~p+KTc&D?|s!rf*IjXM63Z`TdwAZct2 zNC2KNL*6jJPl>)cbT@_YfE8(&D({7_pCIY7w4No{>frEx=HBM%VA`~mpmRaYA?ce< zOmW`D*Op3pNOE!J#CV}V5h*R?AF=+a-D3cmj{=9{QlKGCy(+_f6z}ePo?yz^iJVJLBp=V_F`hJB42?l(kp{y2jxOaOIBo zUsn9~CCRNO2}?f5nB$Z;{A-e#DRP(anOP@dAcC+wFArtXN?X)|>|*&n31hssK{#39 zjCT3uXq;7h=ps89o>-3|CQJ5h&^r5D>-sBObOb81F%cvaO@hu!*4r0B z*mt^+RTCV`>dZkhDuehy1bXR0hO89PAO=Rh69IzBdB7q&r4OtbhrjA%HKkn$DZ}Sn z1=+z~xawmw68hN_f)!a%2G-0;Ha((B-yst8qRKatx&FuNc({=Wa~y-XzOcT<0H_3MMyd@KmvL-3w%*Bee(fA zxI5`+7fcfWvc32p^uLeP<;Q>9`r<*%m(5RAchrH|c*dEWJ#=CXkN^Gjp`~p&SOY}3 z;A*XPnKi50NeB&ye_wZI2z~l=6V${}S z5dQ7movF3OfGofxp&vbMg*8AxMhoW12y8(Du0EF?_0fpB`;c?vm_t;^`sro5(2d7T z-fgQ#*T^tJKKflN3+&1eeZ9w&OTN(vzZ0dbP|kk7(E+kq7JY`w!utfvpz>&$M0yil zT|a;&sI+0)_7X1jP>LpuCb092f%a&n1^KnTS;ZcnK$YF$LMTMnB{DDdfDKbpnMzw1 z+Oo9MdJ-JmVu478a@}e_Hp?2k1=F~%HU1ml8v)3sW#&U@`($PDxW^)btGS8#sMj6$ ze9j6imuJjD*HnA{;Bsb)*Y!_R?wVuYo&Vw9mY(QdAz#fu)Bi_&6_!_OTvVC0-u#gB zkkZRMh`QNaw)2}2o_s2gAT^j6@GbmzVNlQS-n+(@#4CF>u$eXe0Ty`d{OKB*9Ix>! z5+ZUQ-3BT6n<^a??8Y!0sjIpd7z^UfUSJBYz~fwwgpfjly7Y)LU^k8-r=c8M4;KcX zg<<-Nk?3u2>K`NfYllHTXu#ljYUz2U`E}hk^GVBXl5%w6*&EqNK(u4svUxB1`;uuO znGy?$bcD2z8Z9v^HoR&}&%-=zBRfjT2@iSS%1r0>$bdH{&XnsWF3S(Qxf+EiWzx3~ z;u{>`kj(G`^o6gcfFerp!A#eBJ8kc!^aW+O)@s5b60tmOoBya>nJ~b!vW^Yu(kDqP z5efL`M8W0$?mIl^$|&n0NKM-+HC5#wbtR~Bp8xds#*75EzH>|!5CKSW_V652-TTwJr_)Jsbf&Od5O%LTJOe$eSjLDx$x9{i@9akp0r4dS<+#_Px8lIYz@J5+1nLNAmKOEXG+-wR>xBnIFxkE^{xX!nFR z?Qc;%Yv~{W*ZIJ_;b9B{mcKuIO+XCe%dTkByT9oPobeBymoWjDfc|;}SuuDm6;0xr ztzg5jvn&Gc^#tDZ+3kdpH=my^7OD-Obx(^TPCY(^D+I1Y71dph0FB=%=yb^d+{@3^ zjpnd`8Ed1YUWcsjU0+k5?y==gKrT}ulFHmA!nMmZ0Al0DP;?Y;hk@E?&eyHVa>;fpp+omB_z$y4l%N_kN+wh@8W^dwV_Lal9S7}#cP$*U-$E4p`@ncJk z0{%fFRF(lE+8!TT@UDsIar}z$dGH5V_K_M=;N#G%1pX;&!&YYD;l33{0+{fkZ>olI z_nBOhlC@m(0u0@ZQ;*!EfSuo^8xG&I*w2Zmqj>J?7s9u;sRUYh8C0y)kAI4F0t7=m zDufqXejwIky^?+k?XN%rYLnt;q6K4db|(I;dgJ^Q4Wkz^GKU`$O4V)k{YsAacmwqPX@xnl z&7exOzRy5~8o5XX?uQcvu!8m1$t;r3C_P^Qs6KR6Q#289T@6S;u~rg*I1>KelcqEz z+t5Kf?tX5OtIqcA16MZrf(_7`blXn5$pS?)ukCP$o6YI2-3UKiR?|3@phJNztR3y& zK4?*&&FMr%wAHaO0=KQMG4^M0&}-AB^|6%)Q6&Uw!WTScx>muc54+u)O1D#Y61vbS zeu>=E!vNpB;ilO5Vx)HUL%0uwvbKu<|%9FC>7yFjLtw4?FEp%ev z@xCH)Ip_CNiOuKMEq=;f4@+-opl>NI(9OUlUE~+U8~U_0^hG@e;!Da2V3Pw3pUmur zUkxW`A*M44TUqA97)1WABQ)BW(r; zq@4TM{GZV%~ zB-=6xOt+QN^B45;!&Co;T|m^~>{+mPJCQ+K56UFKr|I$XI}W{XCTDS|3zll%2LUJ8 z*K2A8#|bVH2x}D|;{MIx4Xf+h^|}Y}dYsvWTK{zQAK=}9Tf!UlB3SnPgLBJQxWRAt!+&wpN`%UFGAOfCmvT3GtyLI-J z7)UM%*idO=6m6Vjk!!5&2=6b(1&{gVpkDtDud1 z!y4{)fRA(F3Z{cTCm@i~nQW}~B138^udJGFmno%p@Bu~GJ1|)AnghjdPg>lpYQDryW-+WPR;#bd(`HWe4^5#YNS{5C_qUt92;|IN zd9`Tcb{{Xx@w$_%rXGRy_Wpp=aDilQkg{)CE>1;hG%J9-xEbeX1pOrImw_!4wjds{ z4`rs)mA{$xjk0CQ9p)mw2smAVpl)B)FT}qc>y8MkWtvZWnF@z$am6euc3q9bWv!@l zYe8HP=Uq#Q1JPD$8Quz4t-VkNU)pjx7HA{mNV16 zNidanipNf>2s^~_cj?3_1-j=6kCE2F8dBPCS>E}Wo!eu3bYY6$dQZbO|2{wL0Gfp| z+@hhG(=!MTyO`&qHJfe~E3fBV?m40!il+4D2)3|+Ids^Q#|T}-lK-rB9=(Jafw zNVu>WoFT+wD1MOB39Fuo|68)ud-vUPK<*wzdvl#Wv8Dnu?}~o8B7*>hg987jLn{KS>*yyH4$b$bPNTdp z{yuW~tvlhuyRKq$q-5o#Dz3O0!{CI3to?6jFUjixB_DfrIefHU*&D={w3+02*D`7X zOkm(I?9>O;NpVyEKb(LxV!m0lad4HZWhS$o!u1OSe3$Qeo*D%}fA0P$013q)&y!p~ z+JM!s78T;Ct(TB%(9UElvI#gAKT4#l!7WFl9DQW_*3PoeO|+L5KX07!YuR8wNyyS4 zJ9GCj&&n~isJ5H2n9o+P@09$N4M0+8SqBezcMI;k_Kt5;6_YI&RM}G=w|-WDlx2T8 zQ2(%_rQu7lC%*lL+>ecd3X0}csfP!c@$=R6>^&ZBThz!+GLBGYb}a0Ul!Vm4x|CD6 zJ5^j43NZ!i>aDmi?jW)~;c_O2{7w)4r6{cuJc^#ZB~#C?ajVAVC?8HvkuvkkeK+TrD1<$sZ`cD$?s$tMaFp|DQi3|opjL4v~7_Y zQODWdrrxS8#QY=rVl^UIE1kX-6;eT$TB|WM0Pd5YJ#5wdX|9-_8M2ukrU|yY>)-fH zwg_Fc-AX1E-(j#5_<4D#VJ;#1PYE~y(N{a)Wm-KwA#q(ly`u_p@rca8#xWRw6RalH z01c?YjwT%}7o|%RZ>$sd_%u{ZIuwAuTnM;6f+mN4LIv{{!BZY1k(RGXy$U&gj?bfW ziN^~K^c@9WH>5V+sD8we1yZbYvg&{4p`h^D$o;g0Y4!mAky?jK-A_0 zf7z^(6j&e10=~3B?sM8h+9j2lWN|-}ER^2Ejc!hEVxI=NT=0_WqK%oeb-``s}tLFH{q`s-tWVCaps|C-hR_ zBd|)NB)^{jl;`Kgl>y=m&|l86KhhhXUIVauM4@VQ_NRIceG?$hI+mA#c!~p7@`vr2 zt{Fl`)63VYnzf`=GWe@BbZDh*Iu*9xpZT6w_CBEly(l^|#w zQ3CP?Sup1{s&CLON9l7|01JOdW8(&I_nRdlZG~oaMZ88@GZyZKBRFRfiT=fGl}pg@ z_GEB5H(aHkbFKS}jnI>jUE|a+EeZ3(B>#5!MO#4oT?pYTMuF>Ytk3x>%7fh2Z`D#B z{q_q5Hvt8^)!N;Ub;Z%0 z$&$-YL3#H@Dpz@&=x^-Ufa6jzx5Fd_nLth`!16iq*IhML*5-^$_(6GzF5#-YS+UR5 z9H6_t(CHJaX-Fo1-xVqdS(wz*_FK}NmIvI*o@wrJpbd(4rG*)qGUkjPLa)Ohw5yEW ziR`2Z*ccP5HTf{KVvy*VpMA+Lzs@j>qs1&XAtNdrT?TjIfqS zYSfw(-b~WZ!qOW*aM_%u=!p4J?Na-5>OHATXe{cY>xe86_O<2jTNZf*!U}06Q=W8C{?5EM2ozbCoom@Xba51xqH?4h2 zZM5%_$wA#&n!%jM?K_ADzvGAl{t$VYwn&nZTe#6qVzxEvl}qGfJK27y4Ne4nYTnJb zGXfjS)V8s!h)NZ~b}zv-O09b)O@2D{xK)G#ln`DtWYqoKLJ&@^qq!kcs3pO_6=djN zje%Dt&t)zoPfN`1ga!?GnyPKuN{yd_2m$uBqyg<&6Lu@m+2Q{kQEQXSv3wkHw6E)a z@pNCoPJ!8>Fe0VXb~XkB=ve}R-aBT_ky>%z?VBg0U@(T?scRAS+*sgGy>rwJpn6~d z$gOhvSBpN2o8f)vSqQtH6Bhshz%ufqMz?S^GI}9TJGW+DV*e}P_=h%Q{0=l zcO~suKexouhV;+o>TiqhbI$tbl(RT1HIGNPFW!o}wCafCi4t=oa$={7?iR%$DX?+$ zUo+V!1my4E`!5guObnSnjI<4=Yg=gMF*U~U(olZ&eD`I=c|-{{q{ZkGCledLp~tg_ zVJ#J<-O83ckO$4>itI29eap)XpU<^Lm5;v^1r01ZnhOFMa9vC-8v8;xC9ICZo!=i5Zr>hy9f8dJxFke-~@MP zaF^ij?t>37z~TGPI#=iRznodqJzZVz>Z-2Vdp}EP&g`1PQc}hIC0`d-dWQ*O){rEl zZ%w9_HxNKk%k6a*N!Yi(kE*Nz(kIAC%A@TT9-2OsefJ;Z6a%}1oSOOZ`56atz zWxZ;arJi*)rQl<(1_s!(fMBP@v}Vp+qoZDh!l|?=-vFZKoRTlJglapiRlU7li@NeR zzj4O;Z7kVtdbeeThC;5H9QG5Qn}sS|4}2yT1j0vk-(rOaOoKT2yAV#V88W9WwNgHM z8>Eo)F4W&72Lx&Ut$p25);}HC5_^9UT&)4JD5WE{OmkOo%}%9bDx^N1>MLv}0^EIe zy4c_xUARa_g*@(M8w`2)QX(DX8Q!5`#r3Db2;F%TF<|5u9VRo!rlgeBj0kMfc^;H6S$kQ}c>h{Ox?SB1n z+1L`rxYEoA>xl?C{WP>VNxrBj#2!Oav+y;C6=e7xLU31xraLN=at;TjS@fh0YS3F# zGL8GQ1Di3&ThN*J=1Q zIT3TAlI--S_LbZ&SAo{coJmaXpE^K6Ro$v&lJ zbl9lh$4d**$DW?`0XT%U?!M?tBgr&E z6iRVKR05z@QsD!{e|6j*b6ufoke3O{@1E0LZ@Z@6`X5#IS*~rTz&7)$(x$cyWo^nu zWEE&18;jNNz;6tUP!SI3ARE1@I`<5(f~B#I%h~)a1L(`PJg&O8*(ti^fjW07Sathh zdy9_R5Am<$6K%42#9;Z-aP*;~{`C*_SVlhpYp^0_j@n&buTtpdr@&1ooel1v)uO(f zd4$Khdkm8Xw}4sVpPjsf>dF$XP_5oqB@0z`iO^hR5NY~;v!#%A=0yF$P}yjaO`#*! zY=0c7pDi1mJts>-REhd}>CFCZj6CpZF!8&3BML6?{en@U3(~z`3ym?`2z31RfG6_fe3$9JkE)k#uA<_<#|fo3&5_TnNL;t z%cypoz(utLU%#WF{^!3--=r*IPxC+Ruzh-;%dI5w%pz=U_ICp#DZ~+^vqDjky*^My z1S}|j^duC=z52Q`{o_Z)yt~ogg_VUS#Y)bp67;t`(AEpLqhi2LSzexqi(&3h86Ka@ z<5AkNG{43sj?cu}UH}BP-OJ8vU19=*+`Vm5*p}~JB{)JE72U#E!x;aQkQV^`_FsnH zyEo*2|Koq>{qX;vwp;vL}~7b)Duf2FuzG8@`e2SIJLwog6CjoN&2ZbP8G$SV)b_>K08lSa~c_o3OR_5 z5+M7_%!^>mci}lXqG4>*pml)&n^GJ*s8h73??$iF|k44DHEEE8Z93nusl>cEP zBdx~Y!$k6(@oj#&>5qumF{4$Li!C62^ZcU_PXmw8u+Fk4Sd|o{mbmx1ZgTE$(E0NV zTfzE=sy}79cbra0F>qBCr{Zji7T)U`3yaO^(2YU!Y23$sy!qHrL=V?JKh58E62Jl= z4sqvx#y&PziyJ$|RQ|pcVU2y_CP7S7=aeS!QC*EryG4rT_r`eHrc8Zs-|A&y<^j{H zN|sUA9hZK}OILUp@vYPZoI~P$%aXvba;4dd-C*7uI@SnQ<|JY+w-4eh0pfmu?>^nodMcUaap*Q(z2qOYXaR3C>F z&E|bLobXz=OJ$KB@rs;fhtrW6%KVgIa2}@{Yq}%_$UzPw#^Xo#UV~(wOFwCMf~{E| zQhkSSj;=G!5ioQ-W!2X%X%Ht5cM)-*z=y}Vig|Cn+7L-W$jp0rkA1*U5J2J)5UO>l zYZB@lt!VjsE&j?i-vBLrePQ@MRFXQSGzmaeVlN85=RS42cB!74V9EAPvp{sGoC|{X zH;-^F|AOkJ3%?SyU1~hyzU`S7OQjkr9UtYXKgOKN6W*?w=3FVZR0eYr(dF_6mv;ep zg{A#@1DawO1lOC1tqi06#9trgYi8C-;y0}>L;4^PKX(21hA@tJ@Spc-LFZnNu2JMI zbXx7TO(G%SNrTspI7!3L9wLut7C#zhJx0kvnUTKcNEYt$m*K6qGh~UZfS|^@%=_Z~ zRG)pSwIcDCu7;mA4U2=Rz{QcN)H$3ih(JWXkJ-(2dots zadK3HAM-XRDe2|P>Ncx9!uOYzEp_KTIKni#Q5#sD&HdQ;`(X_`-Z0t~4bI=%o-Mh8 z-s{jJJBf(J!#nsrg;Nq4kR5V)lWa-vJR-baa@4m_2o++3Mm+!fQ}l1*S~UwOhMjqk zxsU(hQP}BGo99R>h0IM}_t4pc)O|1y;JwITH}gjG==N6Q{tehle&xGwsRJe)>*NX# zyF6nOW?n&f6vlm2zDC_?sumIZEq8X1lKCYiGs)2E<22J^><^CAE%QGr>!H@a&8kOc z$*|2R4*pi7H{uv@5HaxQ@G@EB5|po^%_)?fEVO@*ZBqq~3KOW1wdzpom4#^@)ZUwk z{oYh&B$i>&4s9da^Vqh;Oe(#&#b(@qb&H0M4?0rMVYZ9I*jwi1z|52EnDg&**P(>h z1XGSBd={<5n=?&P-TOwbsb3Ve5%A>kkSs;d<0AHWAZG71o{#|g!C(-x-*1!ii>hViA@`&zzNR2qE+)qk$Er2ZHmHlg^#2+7_=|*psF!bLf?h%~;&Vz& z`o96wjUzJ&nD#kHue;19xfR@LJk2zSx7ai+mM6@&#`z*+H?2 zlvMpKiNt|FxP=00l)mJPOTj276tb3_GuRv&PuVnAqu~~Y^qNkdu8+T~(sU3PLx*@I z1&K&PcWSe_lIvkp%2_VAPjeOW1H8_E%#f;v7c38#>Hc7qUQX_{1=-Mt%#j?A4$qEK z8S71S<0&5y6$O@GDZ}!p7V67XXiT_;5a2laDk-+ji6IbsPZnygluTP-3<@D#`@mjf z`_J}A7_~_PZ@-(TZ#B6njKmSgVb^|GUXwkT2{Ga8cCtyT}Dp0tcK1~BQU4rWEi;QWf zRd4>7BS{JGAU}`5^H`0Tecu?XzzkJgD8~?xZsL({u(x^mQXj|usIR~Ga!S#ufz7ju zMN8;UUo!nz%$s20Ws?##x=G)+uAg4Js&oEyo|a_tzD~oz#;ZJ^l zJr8DAKf<5wJ^+i`&kK9ahvLzsmDAU!qui~5anC201~`wEuakezhhuWx)uq~4+PTRV zbr;eWoZrrFo$P#p0IuT>N>IV=gUkMEPl2XQh_15Qvw398;7ns@I%LlB%r+}o{qfF% z(WPDIlecmw2%U)Ga@OKR;}Hq)PlJM;cN|N!k?Gch#NVa8fa!VJroHV~lBTw9Ftp{* zpx0l2*NG|ZWLkOK%+<{-U*kJx2WEM`7)pOcJDpb6&L1wp^fn!W{^t#(jI-4Rr#I4B z#eRT;*Qv>6?xG3bcQGQnxg%cc5Gw7l6-P#~Nkcp>T5Z9Pv1suZDf;1vk7{#_QNK_l z@RZ2}qd4{0fx*C_!&#^Y?>mrI&Sx=tLv-nEY`Olh`S47;3L(2?b7$;HUR=t^JchWJ z7ln}Ob@2v*kP~3|)5L*vvG7o5v8+@uzTJJd2}&*#^-1BU5Em||HnpNbtl`+hvb++m zrys+<;1&s_b3-I&(JP+^hZ;quhd}YFo@oij*zyku{jL}GGj=ljr&e|CT+eKS#jDYA zKOfO&;)>z1c8^I!K*?gNm$HELs)XLD(3ktRVw70OH~Wxo$Lkj`BM-9H1ZegwH_kPu zFScJ_6iI6;{I8?Luzq`_8vsXkab_hoP)tnwccp9)^N{?=;62Z$uwXVOV+0(7){eke z6}@jkN#zDu>VWUv{B`AQI4_hqP>B-$phgS7H!GEI70&E;|JY+SgU?7H5@AX>cvmx` z5e_s`b(WJ_jg27i^T(}+Dzp}qML)3kX)q~C>GAuHIT`EF_sg5pU{kq>Z7%T;Z}uDMg?KlotvJMM5#zW&Y9Jq4f9SzwEthj?EUuCfo_%a9Iq~uBL6=rv^$@1I z{I8C$(pHH9aYC3jLVx?cE8GwUK@Lxc-D6IWp#^}^h^3d@tuxj-elFx+Pgl$@BBdsW z>1z7!cJ1U`PC~r)9`+y25i<3k8Bqd>HRrV?rU}U7S;^o{I7(F>;fPQJ6l~5Y`OWOG z8B9?L+QRN$yA`FYB1b({#e(R^(OVD9F4Y{-HMRXuDWfg1ooAP(9dF|o3Gn9TFsK(1;rP&D_P&S=e{^OXd^IA@HU?quE zPYYVxSPxjRHEKsVz0?;Jr;7a*Gkb~-c6ev%;s-Hu7%it(c@R3ZcnGIITCD2=xx#eX zx<4%dT9OI&F|VD3t0$r|_yla!kECZ|71H+Zwk@yk_7^;BP0=_4&C$MFA zDhjC`dz#T}Ueoyf<97WM;PU%N4wY+4U54@8b|4I}fRh#zI;~agxj;U+cY^ZSgQI<2 zC(W4cga?|Uv|K-LQJ)Vs%JB^EqM|+{$t@WhXtq@Apu(rjE%g-yeTAQE7jCb&jNFi< z_p`gMks6m}__SA;tT-hhI9<64=A>S(NFGZ?f;pR>oByNbFDGo0A$0<1VNj@xvVzf1YT==4s4iLc`I(b218zsLVsqSs@BFZ)gqBEd z*}>%|Npv89$#djJ-LiQus&8ZHG@&ci8b0l?Naa{Rq#J{3siNZ6)ROY+o0~gt#F%mN ziOjH7Yi_{iVps*)!OcE?Rb$#XgzdS#Rv7F1CN{T@U>A@w;Amc9<5r!VJKW(K>|ait zKIW zuS3|=cTmd>m!oBk%?DO%Kc)vYMG(4ASkj~gfvr{$MOV)0z+4nMGN&gWo1}kt^#)%2 zN>!B^y7}74sD^>0^6Jp2xp=BztgbLaW*B2dp7e8sse&h;}Z@ zJ8mfsFw}m9RtPKWgVy9FI=o03Y8}fCiWsI*@E5@-gJ9N+Zkq{~W6Wit0dVHtFR|kJ z@p4RNVX&q+DU5IH{y#5O=6H;Hmeca6Zy4pHD{7Hp!g58CAmb?j3~*J;Df}XojDG9R z)CBbJg$UfY`SPHT<)18Sm*eUCI|+H*mOHL<6ABlA6H0AmE&(GHT zx^n%^=9ltUf(>o29CfwlXlqZ^Jg9)~htkNtSfam=q+w*YB_ki!C-{!y$=CHE3QR^L zlls@4Wvk$izDXjFnC5BB*7uKp>D7kw5IkOf#u-_c!aVYHGO&lSj4FXYJ|UFZ8fgSN zd(0(Y2M;C-n@UL1Zz6t81NmwYj{sPzUgyd9P|0r?Fl`y-ZUXDO@#g-D{(CQidZ83+lUEO$x`y%igu|n*!US~ z>)o&*7>s2lQH6k8piYi_;_Q*$048+s@`7%_3fp&_wtjlV+)K1Lw$i;{2Ym-DC-D4v_HFgseW8Xew(iL9d*^fxVF05 zUF}GEFbPOFAK9X-YEfQZ{L1MS;a`OPTb(3M9}Y;b)U0XWu6XMb@^8PDy@IDLa1C^{ z;{B7z-`miFzZuuEY5g@A0dQ}ope_Z<=u?{bq2PZ_Ei*Ey0Wrp(`~j-&VH<4& zqV#ss0;QaWRe_g6Ws~;4_=DO|>4z+xt#F>wxs^I(9B<}68k{V0@mEIzggEA6a5-lY z@Fa{*0W_$RHGa=D@_4|}Tm4T^Ue^OZkgRFs2q1Z{z8`u*W(OHJxrkjWA0=u}2+$S} zH1$^(%}dfS07c3V$ei$mmYz$(*o-y==h|x|aQpOX{2WAaa9fsWhIa8D94yV!PfKlo zV#KIsm86h3R252^zUQTa;@Q|~k*-a9@a`FE{{n=r!6ngxb#>>lRU>)%&x=6YVd2wR z=ltc!+_l0`_miMt#R)8*Kj1y2O`B))fUT%zZkVVOuxtbaICY9wWI#H>gDCubO1dGq8Q0 zC{~xqOh_gl&2Bshu>p${p=t}KCb`mrZ*HywFGWj%)}e-#u(+p@l~}-|$YTaWc-a-9 z^RN(9-N{S`KGMbr8M+mdskgcXWWXannH@1BWXudV=`madjl@TOJDgN|eN@x#tJPnj zQ(Sif*;ll_T{B)iNO8&!$oqsWuG#wFfpuX)btmmDE1qhKl!^sdq?j}Uj zeR4&3`|-;f`j@$DDLq#g__Hhfm{H^=w^qXxw!>Sb9*VzdBu4w2Z*4%>Lc#LEn+h)A z+Aoq$l*0EPR2r7tWD+3vYxT&4T<*JC_0VXD(S5;*91qMXf2%=nCG52JBCU$CzE3QOe(?l%D*dgXnL|}mFLM@gF|iHJ zP1?s!NeU^PzyVs5GT$bP-sog*KRlLT!>2^8>tBKsQd)Co!UB4a z;UhtNp=C?!V+#LPYs#?dK0okTnrkv*+C;5Hzl_LAOZ4j44Vmzb57gBMWND~E2B3Sn z*hmfS&0#a*IvsJkJc2oFdvXTS8&n7&BGO{vB#LFJO$!(FYfeeXF^iKCK^c`q__6gD z9-(5es;zvIspwKSY8^(nI>Dth zJHO|`U^@c+)QV)S{QdCf<#NR>I%@ z_=XcLnI@y1$7cx5t&yyXv(@!NV zBIkn()ig5X{be|@H-{bRWSsUw4jvYUm!o^?nxVjE07!=JV;~;IGHin6fv<)H4dczL zEqce2x1rhJArnF;8Dsnt?irwXx3YJWffIiXe-D=(6@#fh>7x8~_E6GnMuMLBo?~40 zt&1~31spb2Ek)n}&@8p!jRpXrWQDrBDdf=$SK2O~u$MD5BH$o)DBRlDOxK~~xXQ_{ zO8C@C=!`s=4vcMz&yj#o?^mEd0am@m??2foSr=MO^lu}0x@IXtAF!+rxIhQp%R56D zh`|!5AOj(isW7L5Fy;dFpKLdWn}1or(awuD*916cN2?D-|2&v&Ebof51*xDoA_Q8p zvP)ej^aP~i_h@bquNRn=SVJTzquxS|&&t0nQ|j0i*P=2%osm!)=>aSA!I%rvjdJi7 zNARWrfdmHgPGx>Sn5=_+`kLnx!35PshPS7pm-;o08>G`I*|UtNE9MU}QlFAyjq&!- zFUg+jOT=HFD4K1ML0_jLdcjOv1H8l^KpQRwdEk04TAm#WM&n{|`)_02DZj4x2taTV z%~)V9E&odI0m=6ouFSxw&MrjA3}Up>_4A;HHpaevau$?K{N#mM)~( z{}b>N{*(I`ZFD7a`b(-RQcOrug#x(#SI&Ys<1h-74{M!5z}`dVC|Y>Nk_B>I-Z)K- zVjMXvAbS7qUI*((sS&fwY@P7kO!x#Qu}4~O^{5LIzT8%GQ(*2uJx-i-UXoQAWtid7 z1R`Jx1Cy}p?Ddy<3tVL6Lv|V-Wd3mx^F7A7lZB?r73KqwR(4S#vsgNYdI1v|^SheR zR;^^WXf`ZwM1(F&T;4BE6H$JF9i(jMhS75Ut{z~}oAs;f43dm={IaIOQ8F(3-oInE z@_O$gxC<$UkwiG``(VU{7=6O`HHwoflxi5kX~<5A+G$8CN@(Qm7rw=Lf2w6|mnRyF z)~V2I9F#^}j)j$@LwhBMrC-|HmY}^>rF&4*4_YJLs=gjW6Zs*fD6$*RML72$u3Z>9 zl`GW}Y+Cl2vy>`>UliNs=2&8kTz<+ep0)jsW>Rs6{+MDX8ObsiY}~x}Z1LyUrgG4J zzgNw3s6^NB*PU99%6H!;k;6Z(#K0sP;B*TN$Toy9JBW=!3OId0_t}Yzl9SB6U|6bc z;1$W(dO+boBm`biXZx_tWI0;7k8e8f z1A&`@z7X}sm5(jte7sw%2^Uz){E2G+1ZJT60ogY$;}4Xf)T%vuj&188^U4RSAaE`F z3HuArz@;uG-q=a_lLkGItH$`k0yA~0OD#P8HFp6*u*=N?O#F=i9QBCKkYmgFy7jO< znje);1Jo6ON-A~x7cKAVqd@z0)i{>%oQS9&?9g|=@8)*dyi0npQ!pxXVg`lA8I`W; z+1Xq+B?RziSjG2Bg6aVygVqq=_!wAW)*UfMoaqa|nZUEG$(DGjjZvn&&pCX^X z{sq3SuxcmOHfPU3c`{7OjtOIi!}YT9PH(5yJd+z}#&NN5P1c|-<|KIUWw z=x7%FZj}~R^ju(OuNGY6{%|@wW9ec8uA%5I=tBlvlRJa{c_`F<-F=|{9aZ^c!X?4Xknz&XD z@Zw2&eG;`ZmU^Fo+yA|iPY9(^@`2c+{1mLbNNJw^49dd-k(-cl;U|dqvRPg8bq()` z#M!3=W6#Wedcn-Hhmw^=QS4~Wgju#PLnDZ`<*ZkXKZ1na-eNtEFT&*AtU?Wk(BdvL zqjWyOwP-GKjr8pc0v*u+wU-__sLkC|cpHO!*h__w)&pbaN+e<_@&a3>p)Yjh3XlQ0 z8n9IhyUpN~;73kFw2{(xoicy_EOh8C%5b@Cr^LO7iQDVzOn~7XLd#n27XENw0PVqg zCp@ct3pe+W5~}s3?5WlgHpXfok>YqYT0*moX@dH~vewN%=LGRCmpF6)g+lfB=PaV% z#6)Po`EvxIOi}I%mco-oZ0?tP`9;blg#;CO@M&pJf3SmG_-D+KrZ4w;YGUO!unRJo zCJyV9E^*CbgYv6GQ^}5S!3tDHEMV+6_ZfTWt?H%iV&pE)uK97j=BQ;lTy*Mr3S?cs z&z(=0Hex#GB^~1)ZARy>2{^4Jn8phms;I5iL{DkbJ;e<#;+Ey<3}fRY49t~ezB=s; zdx|w)a&acXJ2nesvV}V9QQewfu#40;hi_J5|58_3?XM2%0bdKg7jOIRX8XON5R*dT z5ovJSb_L-Tc6D66Jy{U;1hofNv!$D$ZG|hbK~Htt=x+K|F*HD&?)yCVdHv7l*YV4V zWZri^_qly&?h7m8+B8O#;TbW?>WMh5l!lR#8;i>b9fHa)EYKff=M9eP?M1^mz`@Ke zon+iyU54E>50FxJRF!rJM&k;FQ90}(8v4FON~(MnvqZMFsQ)>Yx9S7!#7^SmJs8{1 zt3s|ddl`N>PPfoApUKNDc5}GQ-0e0c*s$QqZc6xRLRd+fJom)|hUaL%UBzyzWITc# zB)7~|42dk~2g}?L$b(I*z8cJv&@?#S7;pT*dQpZ?k~gy*{X(vy=3yNtd}U^wz~OIZD;(PcJnvYodO|YFW|wCy_s3j# zFIgX~-HNqBQv$0&CB5a2au#SBwMBbUJ#_-3@UL-lOGBzpgUBE)_||0Nv`Gg3Z3*a( z`if)@JOQZP0$PVv%20eO*|X?qive;0C2il4fqf2&@*S&p7qKM%Y}nwi$l|9I#CrBc z?_^$4SptIAwh@3YKtzV{O>D6=wQakY&5POqaoYNYbol;qTyI&eD!VKUSFJ@lSp14Mif^AUwgbq&bU={`D7U+W*SviY9(&i%##Uf zw_c*+U4aBFjOPAs=K?GXPX25yUo2px(>0qDBO4XzO9y_L;nC%ti%0iW-uz%3MCRq0 z3V|L%Vl4lC*9bot!{7a!n43dM%U!igu&3I6oRH|*2=PPh(a7uB|Ndxz&MAT8D4V5r zKHC)vm+|G!X&Me>Uc2sVw$d}ja~Zzr%Ik5%%%*NeU&qXXdqm&La#gR7{PSDq^}>D` z`l^Fx;jD<|k?uq%)eqFuDGhIn%{76*%svikJHwZq6dSJ>$;cy|*qHm=BMrUX7rY}akIP`CBtq>z?JF|3A z@cWRZTg}Dz+~f7wY7~=O35e7x2{P;mSud*5HKxWfbk!*VbCs2S>Miy14T!?U8?Nr+ zjV;+x8#jN})b>iR=3*|j{(Tn-!6PI^j5ZyM7m+`I)6moE8?n_uhP5wY_D+gb9Kx~; z+T4b>aA{a-Gqq~L1zJ+5y-`>Gtv?HnD!fQcoXh}w1{=j}_6ex%;iq1b@|#0}g4UF_ zQ?Fkp?xDn?nAu)=Tb7%6Mh1+V)|ZntP!K!{)F6phjlNQ)P*LRP-aeMf05LoWNG4x& zmI4X=g!$Yj@y6OI(~AtU28;`%z-GgX{>@~WW@`S|^95`w@=u(IsV;3iK$Ed!y!8*Q z?y0v$tr~njE-+Mz&VZP!Q(Jq-NV!U5Gtq*AK{LW@=u)9`{QigC9rWdKQkIWc5q^di z!fzq7@^xV9rYttAWOnxo9QCjeM_C@$bFn_b9uj<9?^M_Jdh_0Ili}D7@X3%*qjRF+_A95+lv`Uph-baE=PaOET;@CSNwv$+taU7~Su zzjivs{3~bH;?&HUi>l6rr}JGMIQC!Qor{+l6bYZq5Lvwx8Hit}^X_2CfUz@krF~op z7f17)79Y`5HU%_l2z6_+>-dgnnR}1cZA`?dN-v+yow@R$;+>j4QR%nHHqLB^ll6_X zQrk4Xbt5({D%O#1dK%l(iH=lgmJQiQlenPb(OydFUOw6|q=+cN!JjyojJgHz+r+7Q zt8XCdR=Jpz`YDyRry&Uu)93@B*DdK?cPYy}zFN{f6|d{Z!!pVI{T?F^r_7lU>WVM9 zW#gx!t6?*JBZUw*Apl3=eDG%*1%hQa6-5o2!wcjg^V3EUrP5FP;^${42C>2l3B4-= z&r0ZT83C9;o~_`QPH-PH11zoP?}$5}1%+k76;A2n{RGE_mvgK|i_!*-^I=vVW`JG5 zda5K$3Th8A#RU8E?7ImOg(!Se@k?*zA-w2)g;mQUh2JRko-nS_{4K6kN6HE-D;|gr zc07q2a5nyFxT%77Q?of|GiYA_3RqgipDB3dTNxJJMA^ z8R*mt&?pw(WnJU3eWLtcl~vfbij4*nDF){^DQ!1pNNmP?PAi&g|FxzoP$7KN7c&50 zn#iX?+AH2CS$pIuqO3w?1%AH7!_*`~k$@Ys2KOOT=H=I&YUw0SeREYeDVU-Bu50~31o$85AAKp`*I3UJPO^8lb_k{@z)hIjtchu0Yv+V2vWbQ!o z5I&bo87B+kC|LFMWj<%gT zns5Zh#K5H}G|c8>_syYxo2_+l-eg4yeHIbj1d*^S>+5Q)Lh=TYXvF$%pPm0Ni3nqg>Br=qzj+ih-NRQqNU! zy1eYj2*BZRq#aR0-qh!bJ(jVvINt$-xIqjXDO@&dId?M%E`7>rv#xb4?da-myYPT6 zuQp5aUus1SGeeGt)o^d>n1;UPMk6ytcwrx^F(H26aUbhGQ#9Mw;oa9jvm%_rz*8~vd+!W{fYqG2!cTO0 zW67>#9JudRhFYRt#k$1^63n&r_U&*MP3x>Po(!*8c-g%jbG8^&Q<@VYZA|MHI$U&; zZ{O~5F)O{Sx7rn-v*W>KJI2Fnk+7tQrscobrg{+t0*|nATJ6 z?6~c6U_sTol8C<;WE>Gs_E;dsVu`S3XEkaTfrMOmnPu#J+Dc>=^gL``=m5Kv;FkLP zrCqJ6u~D$@Fge=Ire=ry;lIjmj6lMgk<30nW9st0M6@7X|ECprB<{;z9Ed%i)4g+t zuJ3kmOZ$c$try|2HXav5=GydTsOTmA82p@p2XnON^YRNTgLmV-W~RP=*yB17IAJE| z^Pk!*`sV2b3ygM{iyG3EGR8~WxAF+CK=){dOOPM9g!@-2z5VV${2maUCDpECTE6ha zQMYeabPUtoQGI*%+H?6HOzjTDbN&tY4Zr6{mC+77v_{SW5pcHatZ7E^A>PSlnt@_+ zu{lvPN|HBEP|6cz;Z`2v@Vl|NIN z1z#JtWN)fBUk_Z2kGet#uCGbrd0cdY@{((!lSzBuZLc!(m%SF>5rg(}6va58?)=)r z@wlAjZB7vWf=G0xdFYmtl5X>U(O;~jLnYR{9;J>9iTvLi2I|EOblV;Y37M$#15_Tn zCA}DeY@P@#<#s<>$D&IE$b&Jiwy2>-w^g)nvRC+=ebbZVdxuuMCmRu21X!H%;bc7Z zBV}yv^L6i2ur-Hk6tO$^^}@Awjzakk zMuC(#S1A_S_IF>ot5kl>SOg%hZ*Nphh;ohwc`+G^oyiNRzBB5%&&d0mLDrC2=Xetu-toY-VykgH^PwW_(wId3*8mjN;Y#3eKpnupb zG6uS`zN49rdd@3{8x>93!W08G*26pX&Meex1NmRX*#^B%j_JJa z`x^$H8?!wT0BkHZ;}TV}?6FMGDB_9wdOqXi+xI9bSHmnstwJX{4(4u8?sxJjbH$)v zIY3Vh;@m^wUW^=(thN3Y2WxwyUpJ|hHA9JOdNb?uVq>znHX6(-Ema!TO7k?SQ_5Ye zyZod(Mf>XOHxf#J4FDx;V6Vh#TbJ4?>sRG$+pN|0qk@!)yp;KC&o>9PR(U2t$4e*E z@CVA|YsRO>&ATw{K6~Y*2LVNcPCdTI*40vPl@jkWm*^?0U~;)Qzzn5~2tJ`STv_J& z753m5LDyFSs;kQW5-B>&DNRQe(yFxxi$yxQGt(*=(CTCXeh6WSTp$1PfM@l1vX4^m zM06-4;0T!YR_4`N77gD>sAH7g$}{xPSf>4~5q0yL+v#F2t83c_b~O2FXwn-$O^q5R zx=&7SDNBM8p)SdQ2pdcSgIjyYW&T4*%@Cu$krU_)`Se=q5sKMR>3+7+M6~{JhZNX& zT@gH$%#8P^<6r@8-ee+lw%_t_@CBjebizxu<@lvo$*z8K?9%=6^hwEi`}bLUdoKIp zE!0h+SC@>*TCsO@%3e=!o@mhK-Xc4F!TNn8X1v6%cOq+_cyuJhhlvP%iWP1mr)+n@ zub{DgA3S_!uU=5iUw`7?UJdlTh`?1j*^{*wP(9gS(3H{=*4YsrXJuosSO0@T*})Iwt6~l zrFVMlPsL6xCpIe>67XiDoXgdZDo_x(XI&~GB#Ue~@y&N}+l_tnRnxpA`LpSIQU1GM zDvRubWeOvP?-JYRP5)bgq0As7-3pPrNLV%j#@?dx^~dT@Ud#2by(aE7t3-l5wp-FW z4_{oxr9M0cz9m3KIx6Db+CQE-V}xDI=V35ylEMCmVIc<%9rHt97c90UX2H&@`bP-E z7}xKBFr{j2hoR#YOv#Ho%s3jVBl!ROb%86|gZhpPk89D;a3`rykvfSt%sXxV!`=gZ z)A;o?7t8sU7|gp}<@)0r!Q*<)Ov9HpcjL8plnglljA68pHByU@eZH*hX$CUrse$?M zj;eb%p^yXqhkf#nk$ESq1VI1urTjk_%7+i{0Ga)V zN`l<=hL2$wMYx`WevEAKPoQ+@*M|?+&z;xx3aYgwC4|LOM^BRORYm_w<|m2YA|u$> z@5B!Nc8Lgc-rst($B6dTllsqzl1K^^vLP(8NQoA*y_0ej6E;tfY4kSy^L6tj2}$^& z;~Sq-{TO5#O1{;mDs_E$@cV5sm~*#Nnz)DW@uQ?b+VH)VAW@)zeeHwSo`(g#O;;@O z>nMk1u0Mn(PEhAO1XC_X+O~4K#)v@cF_bgqOJ?IM#Ur~z`F-4d6cZEiEtTKIc#HS%&+T+HoxeJq5N7=YoDZnUGtt(LMN9(xj zRsZ`0VUbq$z+3qDZY0_}G~g9ZgbJjzQrQ$g|6be>5EKI*gp{#>4EJ_FcUnJlUe{-T zYWgkz-cts_P}i5CYJK3iZ$LZH%zn0>(k%q)%~lFx0{BUCnCCe89PD13YP?t4hxkp~ z_}q(^A7P0$k_EMVO9{Cfi}ZMvF7xdy_yCcc8Yrs9uHLC|+x$jp`4O^45=%;3)y5wa zr&3M*>{&vh@;27yWT8U`NA+6>A?qWb-(P>>Wco)zm8X#dj5s#wQ7&Jbi)x)potV~Y zWva=0B-i#a~G5Sc}trcC<$`$tU9emgjpnPp=fDWJP>Q#%N7b>GuZU z`Bm4x9H&y)XC>O+w8S__HWNA#RQ7Ee%%hd)UsKGV7fjmMsx|mik^j zt^TV@ggZl|sI=|&p=xfNStJq7f8PeZORXy6GhF8__NF(~`Ntz0*eew?s(OxIXn&8&5RVe4mvam| z{Z~-mtVPCE6hht@u4e~Pc0V6(W}!AE{Hh{kTcVjJllv|VNZlOdN>)wUMcO#?Q6L7W zM)20}8U4+|r*ZW1sYx$P(;aovkTJi>N}DoJ&v?uwAZ1zdQoPMI%;BERRupU#VT}w7 zZrn1}ENDAf%{I;9UPdYCi%K56-pGvHDbg>rxNO?E^)Kd$u1t$=f8M24ye5quxyWcI z{-L8ZQR;*2XJ{oSsZcaPJikWIiKQ=y_%kcFKmRt+G5q?qNCPB8GAyV_DK#fC@8LuK zZ)5dYx$6>yijsAdo$me4u0iFq@s;9wz5sq}|!pWF!TJCeA| z8aF2Vv2tcmv%Ozi5>JnX=H6hoq|EWDi0zd%9iP9)skNlVl7?&cJhK`t!i4;xM?v!b zEDL#PzS$7%U*lHX^=$hla~MnE@<<~W14r7`jBNbI!NH&TI6C8;`Vh8f+-P?)6kgI( z!4m0a-Yra)p}Dv~H(j8&@`g?k2@R(_rQh<8Cl0ERDO94SJla~(iBYf1HVyM)-=OOSInaWHd zS_sK5F7_pe_D#c_nm)Y#?bh`@fM;X~H}z=(qkSrMc$Qj6MaJmQOoAb~Q%WI!;&G|H zjs9pasasioK7S8cP5fu1{G}MJjqgqrGf=x{)q1rER?WEtm^OK#f4Eb%%#O8bTCA3t zkVvS_Aa-D~Jk^88p=R|Njuf(7L(La6o$Il4+T_C)J-~6Dezjp?p-|+m>V6Ki!A(W2 z2C?vHk*i=hPJfN$Fa(oflynJ)iUTFT#pu<-Yeq>f<-_sMCm{!oy;MW3CTVBGX%*wx z?~Q%ektttM4YjRR-U^^k?$ir7$dD1U7Kiv{|%-NP0E>}RT>H4 z&dSE;q4YutHyw>)t1*RB`Fw8$6wN)S&AkAQs`OZHgQ_*^cf zwTu=zfPM{mJdd_#tUy;~)83Gx#on^4n31gpNgeU~<1F#21zaF$adG0h)=FoQ z@p^X%{&`wMn3L&8Aa_FZ_zlHEyFo6fO|Q;BfvK$OD$DQ6#>aTJpH&!&+i4SId9y#V zJ`T*mO(~CphLnjPySiImoj7pwh--6H4oyeTu8EyYXlUdSJML$uyN-?J6h3+w;&{B| zcKWQ!?8$t5U)K5#%1oejZLluDgv03p(Ic8*n*BiJqyN}q)E^iq3dTf?2q%!3D2>!i z^b7V1^2(^ZIB_7fdOe-I*l^RQ_~FNOcY0a=(FxNBCUYucd2s0dCvtI&PP^;&*FUrT z>sC+`e16>m@87@mOEA&P?W9)E_jFUu%T-~4tyL86hJS_Jtdj-|bA(uzDVieVOtm-r z96PebH-cRSz3Rp4;hB0cm_h4Tx5oR{q4~&Su0CBK=ezi6yCiR$_T+>GwQkL5Ahm+6 z7YcRQlPmGts0BB+QnC&P7gzYEhyWK_2&8iNSzYUoyiBUa)2tprhc&D9ujkgnLL{r{72X=~&S@9VS@xPl>3ez$hHs+m{R^ zuy_U84q$x!xA?I^FCdRkzOT`5~Gc7-M6|g2IO_Fp|QQ)5fQo zt6#gw`}@4bQ^~8H-q@p;+X3&>dB5b^h_JPPOvordUk0!jMQlgs^R)N ze(pjASac=iH>hmuqn-T7@p%+%aO00CDq}sFM^0kL(_rWxKXM$J8=>WRxWa51YF7)sGhqnf8t&cbfa)K4%oKs?cbYM6S5aoW<~uNy`mU4jEdofSgV5xOZ9&6)hNA>Vu%$pNMeuhf0amx0gRpN|6A#1x4x@@d|_y z>>j9Dloy2_9h6i+u)&Z3F|rfgcm>4?f(d>a`!HEo{yL!f9!+)^{qtN^3ENgHXH`bS zy;7lKoyP}joOe&kcm2Juft8|c0^I!qS85$msI%lw_Zq`H!x^bwB^@M~O=p-TQrer1xYyq3xvKwXFYm*}BL~Ih z0lis!W{j%pV!8{n-FTZ?dCVw6B`s*+o33O8Z0Qq|yM*e)LPBLsO}S(6 z97((&Vip@qyJSFL0VS+Igz$ZJ^1w6^gVacrvKTq3XN~aS=1X?^fnP(>vtcw;yBXF+ zT7M)oSneYQBrzb5CT|zaqx^adk}Fvpka{t_IMSABZsDOL!*FVW$dv3$>wTJ~J)5uS98Z_1Id?5iUyZkI zXn7y-;$sVf=54kfpfBjo-oq2%x(bfUQLb0ccXHC4jW;*|t;Ur%ei?7uB_@>%=M=D# z0AuQ+D4;DJcsT9DXE~fN8ea)v@V|pZt3H?-Ce$Eox_mX_l^pEuKmLgAOA?^B*@SDv zH)M8mczZxSELSbY2YYTH<-w1tZBDHA;< zP;5{2uTh2!~-xc)XU6V;7q4GB)SPCVr0pRk*TcG-I&RT$bL;{M{b#)t1@v&}GURcdn1r56TVdO9) z+)c*XgG67+Lp$g#sWCncU*m7bAOR;dBr!Qs43e~$Y!PW)$eQ{PA6oqArGYA=Xshtj zve0k=zSk$DhzosgptEj5Jop(6;1M8%4WMyZU>pz>z1Bi}2>CLJ_quhCf+0B%4fG(3 zfMPISXrU?sFkV}6(VSj$TbPl<Af8{0)4pSO4Ec}D|C znwHxD?(LzS@e#jpyOEEMd%C!W&r6sgqMZ>3_Cz&5@)q96*yImuuT})mYUB{ZAERRp znm>ds!*t;x!RXo*t<$yWxfX<0TG11$-U6q0pBZ}2)l+@_n%d*DfrUnW=YrAhY~5me zb7rja@Ke{Y?;9Pm=79{L3LC`IwqsYacDl_UY>M18%&|PZ<|xAma89uQnbD!dFv~f; zsI}pMfVRG#4|Gc;BB{-e$i4 zGyg1EH=mRI4-sfTC9aQB6Cs6YBiHA$(IIDo&`S^ikG5yzybzes_?jdBcMQOhDT&Va zIoy5Ec$nj{P@&IyCfZbKcnF%0@9e#GE}-&^*Z29o8I)E`g{N-o{krga`Kv{vH;;Fp z8G(L*b$kI=xzg6RTu}WVD&b%N4hRGF;1Bpq(OK4GH)CDJDsw$?a#9rIL&f~-e|;ZI zkApD=*a|knma87zc(sAa;b5Cw#T*$HjL3n!np5pC@R0bQz?$)RbN_Z;ZPId)i>(Pfr;HZp8o@|;0hM&QCZ+mqQ7o-I)O&8{^>ZH$ zyRpx_R|8w?MfQX}o{;cSOpnSSvS^2oXLsce#oYR<19-DK{U>?F_bFbV4W~5T`f3UJeYJfYy6-GvU_jwihvQ zgVBdcN$tL)+eHeD<<{~{-X{6<-mCxDDfbtf5v6XllE-X!tA$2%NiVxC%0tz{wI=$= zLG&4~_hCgMs2`I5B+b>)C-uHgVO=B-za9`{^1*f#C%lYB&lsuQu?R*%EU-_|5rt&U zH`Q^C^bx9K+lc?xPPE>b?quo|#sm1^2&wCXW3l0>F^rTYLNXcVv7C|hA)g|!q4KDa z$4vV_l#(NfAe5u(IegqVwB5HkWbSeGFOKdcJcpa808P@sXcilDnRpY^Z#d zjgIL_|M|oukgRZ2$6f9npAG@=K-ZA#;@5vG;5RC7TkGWS2Ju7uh;jXHT|HB~_(B(R znz1D(QTS*lO{7U#5nHMf3G&r-Ql}u$XzN$#3HS=%cEzAS$b$7#DvS=$USV*VR zVyBV+ojBoK1xEKFM>y;k&IQ!GF>DLTmxS!(A^_RS>oR?7n1r%?btQ{1^%@a4GhzIo zE6&gLW>X{~on&;G%2zKkQEJh{$6g9y(&j{}IYW%wRrgaJj9ZfL=wl>;0g8O`MeW_4D zU!U`i90RM}yKe9xo!bf!!X(@z(>gN{7bBk3@9keX$So!DZ!6}VzDcU+U)%u4sryBV z%8FkVXz+S|rWU^=cd=;OcLspTOLHB$zaCTQ8?cc$R+3tzQ;rnbBJ`D3R)QE2v+o=M zz}RN>)H|Wd{wr}PI?l%>vFVi0cPrSY{=)Lia>8?86yBEl9()dgo0=wAbvWelv+tE` z6^-=~;vduxBd3SjV0y3r@CvS+U-%&n_`n@yx@5D)jSI?A#@VB!Z%^Mnp(Me9^0djU zdX>Jj;j9c)4$Hew+Z!Mg4+geqg)vI*#iR4Y?JI;#?UD= zQZb$k-X*_8MqvDuaBg0+!QGY0jwuouv`h`` z#9d|9{r8?*_=p2p_YZJn9xZ2k{TotGki6TqF<)p?;1SCu1C8y^1b1HPw?Kg#C zWj3f*1PE~Sq?khnTJ^Ha4s_D{rLk-@U)aZ+PRz4h6ys=Q(`7Qk>^MZb8r-Kp*00#$ z%t=2OB>HnUDMoY8S&4y{O`D6{Ev+j7e|JGb|0cp>eT2eCdVUcMy=E8L06$4k0NYuJ z;=je+udwz8pYrdr^Qu0)1krvVB0)Ex0LBg{*l6t4xXhk6zd{BMQDEfQwvMRC#Neven=( zVEWvAxn?)_fDaM46LUE8yYN9HM^f?v>cy7-o|B04gsZommZmwR-b!7j?JMVg7+!)Z zXHDP9ea?sx2{yxvcr%TtEy4H_1%WqhzV3g6 zj(Ov1p>BJEJ^&nj(dMeykcV}31MI6*L7YJ$3zwHo6DLjX&$}NNNj4a zy}|VS4_l(VFjg}`M_H)Ntn*R?_^B-Z_*6S|W$EU_l3z+_#h@Am0Xgi6vVS_u{81ptZ!KeB70LYtW#Zmd z?}Ld!zAuLvbzMTftx|3m@l9OM-Z4p}g-q3+VgGd?_q4cE!LOZ(03Sl|))U%o<-_;& zAUSoI_kFPN%I`60(U0Ijxm6eo}tid zpwr*hvOF5l%4+BtaA|5u^HcN9a|TuzoEXHz{HI%JN!NNdJ$4m@ikLzFhi$ zANhX?iTo1#r7ZgYYx4iska&Fmb36Y<`~Ug{Ve^BYgAbMkk4W2ozqYd{Mw<5j_0oyp zWPhxZrtY^o7w2YI7x!V#<|n5ONDLmr`VHtH6-@uU-TukODKUQ?W`^qbm1oqTDz!vw z-EG%|Y+jH?ay|{ny5od^s5v=^ZOAwDe|r8^@gr689`y#_#%jl*{k+V)s+3whd_PLdiL*8V=u9f;~Su;Wd--1X3W@O-?I z3{IvKzG$*TWUWjsJ;EBaHSS=7%vgg&<%CoIicL$1a)k3#lUI)K_E*rP(54FgW zztA&|FXK435>EK=!njRk_O#AXg2{q{i9yh zl95t-B!!u;Q-XxkDk@1p$pN!ZO_2SG+F;x1&@)(vG<%=}W(CIZ^<|3Hc6*4MF?URQ+BH=M8O?-ORD%cB`N7 zk3e^&51l*N!H2k=4W6@B8#P%20?xZfR@9$nlGhIc0|w{x_HxNU1nT9TH9X9YquxT6 zZv1$@n|$Y+b%qO}Qb6X)g?wX;I4c)et6v7^153m4`#{~_)S&f$-r$cp6KD14rsty| z5`gj1;aaW-x689f^&WC#n^QYYY*EX6v*9!?FL*!z@J<@Kf!-W7C9paeR}|#8Ya?6j4Qe^Px*G}Zh<{6z16HX-mWA=I zw!_P!6;WYcAK$i?3+;~9lR23o`o6drvjgknZa4!4A`= zt*}!~55sNFQ|Z}t`1N%x$ACc7suE&~6Ugkh)Rd@DCm6dCJs}a3bcS8QH!i3*40yNU zLM3Y~DD}Zq9&$vyn^o31PRrQvqcJPcZ^4}c5%|w}F!7Nor<5TitmK zl=4znZ=xBS{-erGtcL&91J}G@;}N$5>|)Ta_KHf-&~iCArb})~=PEBHFi0X_MAQDc zW?))i(*I+o-i>^2nY*Q5z~j!PZK$l;bqJO;e>8bf?W5wE6-7Y%NonDpoISH#- z2+e7>(e?U%(wO(`=EcCAChW}kA-T`0bxi{f>UJVY$UZN9xQl~t2#h95pxJU!FNw68 z)%*k8*e4Y7gv7;yUM%gnVF`ok&aL!+PcB4$rAziDg9T`(bn^Zd-yXD4IfHzRqq%cZ z(I=1n&RA}J;A38FlAb5{={oL@A0H-nFEC@qVLWc@shG8ipO&h#782ymEw-=Qy9QFd zKny-v(-jof4^HBY^Gi33D*1~gkpjyLCfe4SMv~7hpZ0)XdT)L z?5=8|K4n6S0-FAhH%4nbjJ5oX7n~FQT`uSCWxDl}{HMQu+iyc2GHuk`ug?eEoY-oU zQ@u;tb&PU17P<0_tbWgK>~%2Im-{Y3j14a2Z@{HfEV|>}CQpTFU2Z4zzoX`y?|)yq zc~pVVHgJOqP43hX3>@RiGqEpywhcq|f4*mlN-t`Dol=S{y+mf-WTefy=%!XJD=5&H z=2&D=v|!W~;w3gPj$T+b%d{J;G@AQ)rlR@C2l*UpC7rSRq5pdg{->!XF7N~7uDJh+ zD`;ZjuJ5XS{RVs@{xy+is<}qzjhW!7ISFh`;y2?fNB*F^UC6s7T+EyD^}1nod%L65 zsWJ`Yu8zixk8-3>HJ(4EQ;CWDOx z%cl~Qem{%=xifg3GJo^zjhScaX9ZFZbesF^wJmd%-!Bl%#(@E}pzdqQ{;uvC$bQJK z)4hk0lujc%ndN%-?EGfq1@Nzg#HpygGG+X-{XJ^<)9GNF(EHVCTYsi!m?>!bHjn0f zV(pH+=zMRzPsgW$Gif(&O6K3ZH`k;2Lt^`o*{L{|qLs!~%SPA!+;)0U5fBH?Lh7gC zKzv&LjY{Qo!so8tl`p6Mhxp?!9&0N)i6`IdQ}Q=EK4X{X*^M{tHvr4m$pu%<@NLN; zO^4@hj%VIs?KLusDNIYLy}otr?whIJjcHwDd$+O+YLkZ;Ib2(I|8R9>b)tMFDwAyW`9Ct^n8a8)l#0m)FeyBHF-;s*(LPcs@bbyR z!fR=ohL-945Y??W@552c9C#6)gg?L}%{9}XYRZ|wVN-Ky4+QQUpr8(e2oH8ZI@ zD?Uqgi$BWyvy$1t?k3zQ`HE?*w1}R{jYLcu;z9<6|!@H?w zFPp%RE}Lg+v2V<+W+0-q>~Ez}YBv=n?RUjI4u}H+xWq~Bkb(1GaFMe#nmg&?}_Zk+&UYy_n6-Jz@AQFYAeXtCtD zEgwY)HGh-L#9EKjL`G4KPfiTQnB3!2hNG73Cd-gcGVyA3`6qt1TCoXMX*&913NeGm zXB6NvYh@6>CA9V4CCl_~A=HBvYiwxA%#C2UJu<#Lr)4;`v_o~c^$tl{DDBp1^;;Kc zeV6Lh-m7Y2g$a&xjkpxywBH?0QOeo8za>JEL01Q@{#lfLWyOcgZ(lpOjDtcPcXA|> zH)qNlNQ@Md*t`o#_h)BGwj4~RPpd|C_RPTwiM(LqZ`q|H0xEQGA)+Fb(zet~53e2h z672lmvGwv-Q+*HjNWX6Yf;4wcSJ%{em0o-8R%Kg_@0ng0H^2(0&Ru zHA~z*hPrbip<3T0@kuKCpX4=DERd_bz_L~)4&$lWyaI4hWskSyrnCUU2;QIXnp{bo zNe8|$goY9k)n63eWBBAswq)XCe{V0yZPRp+qC45G>^JYPbdnEOU-P_3{w_QG@UKL_ z;~bA&gf{vq=Z&395)roTTW2uqgx^Pga`YxwJQoU_1w3(AbZu8dIhh zyaGDDz%8XN92;C|f%lMh-efrg$(}{mQ`8tf9#U!vhmaaj^U87)-*F-?m@SK(PYT}L zfMuSEC+ieO5s2dXNN_Oo0PVCE27bTDYjP&D4F6!mQ!|{i7gy<71*c!d1fa`?g#8cX zdxsiA5#O6WO!2t3oi6O>7Y)XK!4a(l^qlt!yovSc9d{f?p&$AA>v?DWAFBP^%lXg10-gpz9K$jD^3zc;$)EP+##y(&>%9{Vp6iG(WgMr zQPQ)5Uzm=c^R#mOz~AoUe%P9xRg%;9xb+H94IS{o@w+0>0wRcUfs`&q*q^mg+MUvj zC|>>{VZ(Cuwa*%PXGv^>tH~Bt)Xx>Qs^sUafsJ-DTwsci~Onj$=S6f|koS(U$k?=%50Yeyhwi9`kH+x3r^h#_#KGQ>EsIZINX$7O23Q_lj2qQZK;c zhb;_}PVFc;@d4YHv%(hDIMZf24+WuJeyItxKNH=^bah>$`}>K$ja$vz=G@yi!A{Fz zjJE{|^c3-Bio6DIS2~W(>dUO(o(H1>TYRE#EkRWa1SxVA8|N-gsaewmtD~gZxu;R! zb!^+#`NhRAM!Y-azI*qh^%dn#>8NPH!uMfGlZ<<$($JlTG0Thk8M7Zz6@+em(|4Ar zmBE5o_~GW(+H^KtUUg>QjG>x&Dhz+eY+WTc_%~z7bDp>m?}068wTt|AQqJBVNhJWE ztTXwGeLOvJq5AJVIUd_GJ4$jmH-r^&Ooyx_s>}6xofqi4pyS-@bNz>Qo8#XT&lK>k zgWi}2{3KU5MwvH7d1DPV z3vxm-R451%*D+>EGsa|hlEpGi*#-%tmX}b+2}psoflUc5;6vzmIkpxtrqXc~JBud@ z7yn|61{_8tp4T_xD3VI8Y~mB`rjd3e06&+e3=?tg-^NMJh)IUJ(GKz%OgBw%$&8a&!Q6z0rDsigAYr4|~d8&^*&0+KFY4iXd^*ZW*IK z+#c7R8YdMK>cm~yJ3bAzG1s}A3)@CGhSPtuS7SRNUS`Ny7l3yga5a>TQO1=JK zUIq9idA|R)P)**r{$v#@aq1wduLANHML-#nGOap%N^&-%p{$H7wS{P%3guL=SPqQ0 z2CA9{w${8&3mIVDzqro7z0LU@g1-GF{iRjAjNQ7MWz=PyZX*)Xd4T$%Eu1Q8%TLS$ z-}r39^N-Z$np(H+x*)r*U^!Cyl8;q%@G#{rK4tlt8U{emQX{soQ3q~w!HLW^8{YTS#M5G+@?H`G z>!bO?$n|@k7GK9EXAJiX?#GdmV@$3w&G#sVKOga%B?;)Hn0<0RVp=A{0GY(6yjesX z2Mkf;$wb|3+Jf-Zz_dwZfswm{;wzV7-aYNIc)-&BwLpTcK(-6Q$e3clj)Az6wkgOhSjLqL#KeU>Cj&Y^0 z?j;-+oZkL@uFE^QHQdckf}eDt@AS-@%ixLxI^z*udsQa@U>>Wuzp_(}y@rmrHAR>z zF7*@s^}Bohx>tK+ae3>Lso_&bC_OOsn~7S38*Bmf1lb$H9unw5mbnM*pXmIg`PZXs zsXC_U{S3O1F+q&XMT@=2gIr;SucrwiAh=4o(yY-ppItF67HUqa60&q8rMZ;&tLO-L>Hvq_G_;io~96;d)r*P4t|K=u2Nr5 ze35jmI&54>y7N{lfAED_RgT%^i{R%Xjz7XrS6zr3Q3IHH?XR_FB_p~vKp21^v!c^g zErrY)qZhX(S%Dld=kTxb^D*^3leru{8=Wr%sK79sZ+pk3(lEqro81{*9a?z#r()lK z>&0wr%*9ddrnJ2&iTcG$myX(8*GNFOIJ382vIGDRyG00JGRKVy0Vk+YjHA!bYP)C_nHwP` z=2CO+k~G3wq8D9;N8m3LpJzN!diG}vF~44AiwQYzvwE^$f9%e!d{B|UvhII_pTZqm zcxN(8WKy2nLkK>!YZi$fEas<%Io$XdDOEfHpbuSJ``eATb>&8yP<12hy45Ot$S_;U zmdYpp-R}ed(YyeJUqj#!&3Y)?xS{6;$=S5TS(e}(10asZ;9IGzjcbR+6v$JZ0o$=3$D7Gr{uUXc2RqsV&ipCgOyqu@z=zz$Uw5E%eKWOk3P1k~}m%2Yf=k-pq zQ;^%=O@R|`SUNJnK;IgX{nA%z-o^+^f{i-cs&P+UXB>bim`Crc3*ohV5;EN@b*^S zjO=Uoat7cipWzh{WfQp$T1{^l|#)TPooVMAJ6SiR|9@?i@qGNGhcBN|B;YNB9*RSS>cx! zI{0y!1eM%-5LBKfc0BaP<7+uU|8-I_b1)7)?jTwGt8&3wdA9i~x7%j1uB24*S)jLe zEM~?8N%y#CZEN^LVY7hJ2lYtz!{YDwQzskFq3FQ$FQ3t4b>iMr$flj@gk210ozn$>Yv2-<>8aa~YkBLf7g5xy!rou^!gNTG|j zL3$*sOi+i0**BhPgdHOtJ8wF#-ju`>DQkI4ST|rJYTCSR(qns8Br8f4?V7$iV{jrE z;g3pCp(nT{A)ur}ifzYTB<;i>0~FAme+ZDBC*Ro5-XR((QSblfBNkCw&}W9j)rwL3 z83U0R^=C$cYBWH80p!v%ZE5|0!>RMi@C#V}do{tRoXU{=pDftD7w_KGEOybeR9PTg zb)yj{D` z-$%G=iY|WTnw8NteO=~dyYnkw1PKBsnBn}UBw%_Cg1I37>v57uFD9r{;prL=v&VTE zhJ$E8jUGdV&$?%qzDrcMzDWhpyewYQn=bbAJ*8wvyG$2oBnN;J5s4~QX2de5j$Hr;2AMT#T>q+gP zni7o%Pja8v{?aTfWI8j%sF^s?uwm~)fWbc7I7g}vu%IC}kBJNgGC1pB7zm>I`WA;8Vq z*4}gY^U21V*7iCj64b%jd*idC{FgE%=Ga#(sCcn4u?Mf6GYGFQi3(ncZQl`%hB@fs zId5me@b|Fyj-FpVcll|PalH-}eL?I|oDkn1uUdTakx8-Q!b+}d@2MA(2Fhbg18-lf z>?2nANnY6?7L?W9Ik$SE>GLC~=HA+kQh{P#SX_Gs>%ASEFptyLl5(is&8b}6C(wrk zi-`j=Y7`6a%d59)tZ-=_uVbD*qGTFQIi{-LwA<7*$wm6VF6}Nl>`)RSqJlew7hINa zs*evrklUY~Uvnc$Un(EU_=q`01@1>EPazp~o#bg=Pij)qdU#cwRWiZE6*qiVG+#CA zgv1!=b_o5RM!n&jWz%f+*co6C!?lJdg`^~#6?^VAMM4+{%a<8_VALDzn~6Mylq)kw7#9v^@KI)3|I zSk?6_B>o}4%Mjm_qjd5dcWYdv0$jgMP6WRtO!)nKnKwV=g;cSY*VRwRnBj;>2|LNT zs1J+)M|q+zHI^y>`^uw>BwUBQ=^{j}!i&s~kSgAhb9@kRt&p(W6G-3&wyc4A2th6G z4BkwTvWm|Z%F;Bz#&f9MM5D5o4RK$B6&SK#lf+1HImFEZ`aA9i-xcWb@~(ZtGZ`Tx z2UVNF@kOJHRyQ?<&RcPpFc;Bpe2-!JYk8yaYYH1PKIZ;;AifU5fR*nP6QcNdchV_O zcM}3a0lYY|Bo+at5-ODG3*J=R<+u@mDpXB0_O(ZGpQxMGNrP<4eoQMtC3UC%N-O4` z{UHmdOm7M5HW(IYDcu?tyTy@rWw@uDyE;^yXLk{u0dg+FBt3+~iaZS@U4M8_3nJR3 zhTys_N_sI^Qw}*1NN4GWU(PX$p9Ex{&*nwx15Y}F zc4WqIn=8G}Jo)X%o=)uDU)Xxu3}v;b={?m>FPS^O`Ms|O!ndEBBEG>8qTP>r>#D0D zd^nE;YQBYU{Qg;8uk*Xd?UEFflEBz4b#eL(xl1%m0hb8cH;SUjb4dfAMBIN7D+_d2 zJq~@Q57*J*$oYH@6%xQY&@oHODu?wKjUYzZc+RrWIWR51>381W9Mc0cZWC#v(x!%> zk|%TaZ$HlMET;#=SWOGAD_nCXQS<$*6gm0J3pA;_Y&{z8!U4jGe$Kq9O|M(igdH2B z+zJQ~y&JMxmhZ1A_JKY?^n6?>KsEZYphx#Ocxg^Y3#Rfz`7X_%60}2aOfaxZ=Expc z=XbITWLlK(J`F2wIC3Od?FEztAU{3Q1OKvLgF9;Th6zJC_NCj;7K12Pi!!kV zj=EylMR|8zs6v0H6sb`s=fwYW{rgtnopU-H!qO1YF3QwUJuZ7~<+Qb^=I=xSdMM4x z&}Re{s5hCV5t4I-wr!Ncqbzrwe&I?)NEe1L+SO1aY666rTj774Jy#lc=>kZnea%j9 zY5sX#GF+|veFdZ(a|nVE@WX221Am4u0^N1KWe7Znu(e>BtOg-2s~S$F%v zVYI#J59EhXWchq(xK#>$bjG*2ZCPF}TkW_yUN?-GTJv|XhY`5VWK$qAHNaTwUadS` zrBm=2wo{5CX=i94FYLlj9I5}Ou&Q%Gws+br>}w)^;XNbNP6F56n7h#)KZ@hWba{Y# zg9MPxE1j(Y?$;}1f(dAq657|t8XRTcA`F+t9x<(|6aAQ#<5 z+OhsYjqoI1A*9;g2Pw3CsM1ADB=~kSfyEA!=x+Z-?Aa<1RSM&gHcHdzqEzY{S68&6sG?IA=xUP`S6lK3JTb#6hF$uYmmN-cPNc zaU8MT4%UR@c?|&L2t0Y&%~{ZwKm^w3X%~$x%4v?q|DK||=~VTYUE~!!r$DRbMS;>K z%w7kPY0~W#NKKL0owbii1V^KmX1$qsBaS82X@K!rV+4^e>EX`&Tc zZD(7pzYiDC9Nw&rct-@xstS&k0QG-RO<@GcAG`2kR?HDOhyyjif}XRuVjORe6ovcU znUduaywljqIjS9>2~V%eJ31gt4~bB5Pqj++(PE#(h)g5xrk0 zwXh)7ThorW!lhPg;=KF?(XFNnOOCg!7{XNZ`$+(N#;dp9CyqUjrbvOQMF+%AsG*|R z=v`~EYUo`c<#oftjsMF9$`^BLKm=GGKXOe<*xA5o|=&GK=?EY0rz;iNEWD!Y#lYm^+ zzv%i#kK^aRk{vGs6@jo9fy(KmV_Z^`$f{Dne3l_mGm!%EAQEAfS{#)-Ox8pO3*$vH z@+L*SZ*j=2j`I2VQTRDWtFri{{Y^mHzU{e2*`=qw1jx&NDqqNk7enlb9AQ6(@^#~n z)BfIJKGG&KXn1EafYteUS)Aw?kS*?pviCG{B5Z!Exz2>Je?0qmd8NF+N1(Pi?7;+I5t=xZ04}@RYaCN1|AQc$v3_}{XX>a>++kf3U|R4}_6c>V zXKHDIOq^Pvjk1fZqen7Meq_bfYU~82VfchRTvOY&7;Es z-6Q`s71EZ>*53EW>37p)sU6$H_OkL1=Y*T)^^k0Q8%eslB+m_6qrlw!dQ(eRcOMe} zQmpeMYVGSSn!GTulzwWgaO6J5mxuALZKnc50CcG9N%YA-nj>5%neIYsr=z_X0ei^} zQqTBf_U)7Dg%_;B;!=j-0;))`e;6tsZPjOS=k1@eaF=+t*0*o508`!(dr8%!vv4ZU zQwqBGkp)vx9USUT&<^)hLqFF(u`s7v`RfB?@I@sBjn4P{tA4`gXnV(hOyXp~adri& zC!?e%MM!aYk-^eevQql8mrv?v&e{Zz1?yc%YnF`dlpED#-lF#oCBWd?fNvUp_s zll41KoBnSf|L;Tb#QG%FSx*#*r3I)v^J*AY#AA0Kck0^8;Z>t9^Z5W zsc-4L(FqM4XM#LRoJv@ahKU0#cAx5`X*1!#6BpH45#bnABl>{-V;uJEa3Nd6#M?Q29P(_|(3TIN#>#d&(O zi)EG=IZ(Cm^dBR`S%?m;&T$bAb{OTSQ?pET|Iiz1;J^_%dT_X!_O>RyFA>m{k*k2v zHE0gIh^d7K-{cqOFe9TA_75WUa#9Le4=3mvPcOR=xccvXGjc`lG%}smJ6Ww)G?qQ* zjinWe@Ry>5U*>!xojVJGScnm6ld>G4_?N99+!ch}(BdV|hs^8G>hGcgP=UYCIj~D> zYf@=_7vuzAP9Q%;Un3WiD+fAbIrERdRLrI&0}E@*I-%3htKkV{RALJhN5FT$&ZC~Fj{@ZO8= zs2m$l^joCMAgjSs|4?}@+HlO-IK8)22*gC3@O4!iKglk-H1L+DiK~xO zDB!RL_ua+o&-TL6ipzK2ke3Ot%&~l9x3`QX$bbU|YXjD%pOwK42x|*!Z$s)EM^{Et z%sv616))M@nThqdcTifW$Kh%|p6F7~u!{IWT?R3_f^HZj zl{cW4j~jvTN|f-9sC*N(Ts@2+jFuM=Du*ZZEDgX_iEgitj+fVD;fog2qD&%i@iT&t z>rH!A<)*8&Do14J&XX0d@BpQ}LI<;3SR*xf6;bUQEdecyT&PA++B;iLvSrnptu)zmmn7H)ph#b3??W}ztCYqpl?bo5)I?9H z<=4L>dfrw-E#W*Fzd(>CY|~i}az#i+la+{lsuYLEdvp9#VaC;X!}-r27vvT9B+}E{ zDSu9r`6rni2EDYaG@IU@%WdeW)0NiMs~kTUmxdvvf6(<>wrePMTSPUfQYs8wl|Gp) zOSWVJa9!T%N@#A!iYk)@tpwyHX~6P9&E!@?a2B(qszzd^z-E$z8(X)F>{3h6#Gl|l zfsGNf=vECV@D(-JhO$ISd0dY3j|mAP>)^!JUI}oj-C|cy<=XGxq8Ph>zIV@KR!s)K zhHei2Ht>|)`69-1TuXO(UjFleaR-ZntQeVSb*#auvAA%eGe1eFrx&{*ljTdP{ESz1 z|EMp~H{DyaKBf1%blqZ z<}_W^SCp}W5jjd)AEGgouofxoiTCS2nyrkJ6<4R~J}dUCAk~%z_wWZ~M>)ZHM--x& zHe(~n*A-_UB{j$3Sh|vz2=5$Of8t+uEUBp2kN*<%k$qi7dF(s4SR->GXM_#3o-OhM z*^!Z@5aXcZYoR0>lk2QZ2rfh@u6$(-3L;dneYF-4^hC3OUk^S&_Z97|_1jExD~?_0 z#P`rvHh*d4$+>J*bh&%K$hB49_(~k$ua5AD5{8O8rejjX;i3trA_@HyM^>03%JI_b z*Y~-ixJ=FYjo`~Ak1!R|H*x=gSKFQK&!7GBdKo9FC;j~9J||rq?@Sx6(GM^zFOcc#qImmdq~#iAsZN2i|3 zcw1TQFx^_DkDKY#wB8{$i269h$|Vk;9!Lg32_T(+W5rk7esR5(2Jh6nkvcv~g7Ysg#EkLG zr|NH!h{T7h6St;M_A^{opM`XQ;S_y{wCokOkR(fdtP(A5BTXR=TNpphmYYS3&A1IY zlmzneI+5FAHb3nU1kA%#5vih;Pn)@2GaNZ#9uPOn9?}e+cguyFMV>t8=P55Lz(YVV zL{J6z9OOMq{Wut%bT>y41nCUFpRgzsdh(S^deJ=HT&oH84L4_LrG7AAaP)BOCiol6 zByzt*jedJB{EX&MHsVD|5Yv|--HO4<9YF!ud!|O+Oc6&J-Htm4XCm5Ai^Qb2J-fW` z=lc$e19R#7@bUbtDqQM;oB?)xeH;9P>+Gx6I$V0TI-3kmvtRyD^vxvi zK7$!ZrKH0@oA0{JF$O>aSPS-wV69~vf1GUJ;>cL7NF0IhY+}WLm*$q!K2EFWu)fF3 zFB>J6E|+`KY|TiyUm?F=m4euzFao;;{(kY(yBgjkxiw18TmO^sm?=$i_`&i(xsg(Q zKtNDXhlsbZA1`9S{|_JkQ~v)H`_bJ0zE2riSBBbScFj*cTP^d7QRE(1(Q+?lADNn4mg z|CuyC2k-FO|7$^`9IL9jQ#&u7sl$XFg4<0fF~DvvG$8emia&Zhq}**gZy<_=&9io9 zI|JVu-m#@*5A@u+FIhEvM@Pn0C`v}FZvI}Wc>*#^DV$g){CpWk)*z>&2f$zUZ1LDj zP9c2U%h!}g>8*uoV8h$&r=oa~SvBBs(GEYB`}9RtUOc4LFbRhbcKYL3LdE*yr@U+V zvxLE|8=7aK^{0>8zAvmU#5}rxH9+o?1NMSDm4G?ynr=D|t*R+@8}I#L^pJ}oYMm0*%ptiGBCPF_pJ0!2pP&rsxwl?dWqSXQT6@3PC?$FII=MFv zy*JcR@rQ*{sU!TsZMr@%AL4=#i!yNq!ntQ(`{&XBwzo{i!q2OZ_IW}iTBzoM{rol> ztyX!nT@6ITAv6Zz8C5i_IX<@zg+sc<*OvH&F+|71qjJ&qJ7Tf zRps8^soqurzC~Tl+#bvVa#(pHXLc8}>x}V1} z4m}sYEHuI%KGFY{UP^+%;HF$yJFeK=-nF$qLijtIAVk~~bsh1Le$RI~6|BOVbNpN` z+9jFi(s#v$Ef(Py@rgX0tV2(}yhsSIy;aMDY-xuy;`p`BWPEhycG4j_LwqjESv~ZT zjUH6Af>D4$M08S}?zikXZ3RxQZn}eHUz5euD(7y05KgG(Y4N$s$F0Omu@K9r(OoDZ zku>aeweeR=dH9QW9pILSi z?ZOAOM|`Cw>2>4r)x|s2e}dY31=)-fy#p5UQpyitJ!;7kpr(!vL|=GxM2l%VsQ=DE zliJOEy_HY;?rMzj8Wb}i#d$Vml|nHBGe)jz9Ro*Si*#@%agdery0OioNw;72T3#|~ z9U6&-vpuBUX&2fm8Qrt zP1hTQ*=6qY)!v39FPUyR!TB{gkfoh44kHQQ77`r$ zhDHvN=Z#>EW6!K8ok(aj<$pH>NKkJcnhw@(Sv%7WVPGOn+!Fpt2&!MB{VXW2lK{1p68b4u+h(wB8 zwC{Cv+D;-WerA}#y2~%|7Yv8Bk&y{W@5qqLf6&Pfk%IA>me1ZHP^!!NB!#!on`K8K6o;$Fzf*wSQtHJ2b%uh0B{BCE z;A-WZ0V*Mr_K>UnsR8_%m9x2(B40Y-?75JDm$1vCj1v6UrEi)e`JaOY;d|6fqaI*% z$edf!$2six%EGVtKa4UqBCt<6#lJ=t$)e|zwk~ZQB12M5NfHIwt}bI=G$|E(K6 zD5B*EtHuc06_#F}E#H+#0#iy|OVCa-|3N6uobJ;Xd+Z!%|JDz!ygO8T{E1Q_L3|#7 zO&=oI@FF*^8+WusN|jnh>uaLSHU%4W7F@+>>JqjQ)Fi7%{+qXWmUkWJG7|DFbN}_d z>ztvwm~D50GHsoWu102as>8G?=~WC<<8bc@t;*pTaY&_*HYYkKET$D@fl*PoHo)`X)|3!|i3XuwaKLESo z&ce(qXKmYl(g8{f(-ATNkBXlfJs?T}gMdm^w7^Id}>LH^c| z_rraf>=s_03XgdCQlEvb#;g89Bxe1Y-d+c3{LALraTFA`_zTI*8L=}w(|+`E5qjU` z%TyR5(@YJNW$cJxVrPaLE%R4<_~$VtHV56J4h8xU$n}%S20^Ci%6(v|YzUa=NO z|FzOSJvY58P@GXeWQPV?xA)~kM;9C&krG`=>Ab2%Rs2+YV*-Dw*F5!RgLVg`^QOk8 z25daQYs%WKwe|V3Q6z9F=!mYx_juRPTj!Lu$@}xJub9FY^ElgbE{j09jT)w3N&N`^ zgI|0X`OjH=#ATmTF2XjT3%=Nq_ub}l~ zicLf`YD4W&hPaA?8WLd7bCP7z>4@N)Z%Wns`XDd##uDs z)Y?X>y12Ic@(SMb)q`)(;fS`Y2Kw6v9tH;t%)e_%hH}k!b6sY?{r1iCSD^iVW?H2R zw(#Uf4&nxjwVZQK7%Ht2dDoKbpZR^&DI@Sd4iHzJ;glT63$8@JCyN;xm+XuuJ&g_C zOYVx@(<89{bROq)BF+Uoa9>Z3lvOFVhW^lTvYI3brS0Ceoeqr*xT!21uar#^g$WkoiaGKIAH3JRW}rpM#KgjI16sgkdxGye8VmLFm)n%rMhIr%M4S$8Ki-`*uU zF4Bsb%+)9kjyQp#8tGQ1d=8^;9+~-~zWA>&REYKcu1=PT(*s$esG(Arg7eq#-I0@w z2(uBu*Zns3t)9T7Kflyh#D7q;5muPiP40(Zbt!+1p^uN*(ReQwX8`NX__T?QkxUi;_|4F{%@kkr7D(mP%WC9%9 zer2cY4h}r9PJ`OsPU>y}n(9+rX!Ap^(7s$LrKM+icFQcmg)SuoRuALK5OeO8wzjVR0_zxrC;Vl}}s7p;^XP1(qB<52Ai~ zG;@vUd4#%H6iB{QFcZ!WhnYF^N#xgDuWo}%4yP1x#AH7}n_DBukv0T!0)FonH#pSu z2dWf6$k;7D@FM~Jv995;6X?~hEa&1jdY^^JC+bIUf`QC}WjK2GO^)q@Q{IxBk|uxz zWPH{l%bqU(g1YFZ@I4(?b#Hp%63}{CF&qkd>LGtHz{T-cD_PsYbZTD{nIvO8y?yWl zL%S;|9%nV+!iT8z+*sLgdCQ!~4@}=sdCk~5A==M7OzGvah~<-L$<|_iwJic63}l9@9&aPOyhYg!Ng+KpE%K2uBfx) znCF9I&vPi7zBv7w1BKv-e=b^j+vdNPW^=AvkNK^Vd~dju-eEMvw)QQ7^5!|U_YL;v zqsfLxN;AI1zdF@AnlHXaj-#v^r+c_)r1Lk^Y|X_gEjwfGmezr3?Xa1js^3=wc5lPP zaKoD)=4STGt;Y%U{-kXbWEEc|NF^eF!oZ$B(W2m~k+ILF*lzuch-UXCB4F>Fa?7u%)TRlvjZN*U2wKwSwRHAbNQkw!;-eT@yH$<&R`#$vr;&1rTzq_VKK>_8QHwue4Xip+r70m$bWZdF>jT$aI{aygdD4n( z2%FCH@GX~f?ORZK0QTWuy%{;=F#`&D1Fw>}Q08a}?B9u%K2(t251G9cpRcphe)%t5 z+vT+?<|eWGhKS)DbU+fzydkx%@*MhKcS`SpDPNp0E@5{8m;S}xeh#1b6slJP(bN)p zkGc_t!uftvQxG*K#f9gs8Cr$?I~p3}FNxgQUI|!}FWKH63BSatg@VaPnSHnGHh|ym zjU6|6jy^MK`fVm3rX!_i*IuiJcYtiZ_k0m?zsj|<7qy^>c5{1PcL%);H}5bnjBB>P zko$Zj`pMiOfM%QLI|$ceiQ!`;;4r14@!+_ls6MIMHbnT-GK`B$bAO)2+t57f4*CWxr>R7!(X}M$OgAB`4v(b+I)KitO~01b&XLf<2vOcQow%?&K5|99wR)y?4ZP)` zUoFznjk#ik*uS2sgsaThy13fv4p>b$aj+mecQ??;7%IkV@fAg;666;t>5rFphuRL~ zo#VCLth|s#w=9@w3Dg8*+K^`xazSA`e1kGe^Gnu>PbAHu?LPRlCu@$}A02m&m0iys zhpxl7PURO$-U(B&P54WRXwi=8kqb=vVKnC33j7;b$@YQ^=D-_#+_z{a1ctoW;L^kV z?0OObH$aL;tmGc3A#0WHnl@Gz)nY2%@!I85n-*ZaFe81_7CifU-o}caI$S*{o6FFb z-)#?ryla`42bWYjK7$rNI+;3*avNdE1Y1$$0cGYdP&EQpzOJ+jCv?}ORpQtn35UKt z^yG;odtVh~I`2rLlV=*97`cx)YRmpvzcJnu-=AQX+oKRreC*C2;q!8lA6b}JThdHh zlsA;(mq_RUj%kCvOimt>URXdj)*nl>1i}QbWi$kiUVhDBnqvnHz%$OJz(QxJHacd4 zBnI72qd%bJx{j9etb`G#GBk+HEzP73N1r8cZoLF4F4lM5mNT0$azzp-4f~@=R`Mt> z$=@JeXWm?9r>&%Ee00Dc7A8mdVDbjxUI7x&kfcf&Kje_~?R-z`jEQf^@t0jzS)W^GT_X79Mm+&&Lf3PA{@LVKI|S3XXhVC> z6&wgg+g<&)+{n62AUBAFFVL~VwKG#(oG^`UD* zrZbghUdBh^4dz%dOuzj^3`~fDUt&YJggM)A&k7*`EM|2XB7c2b_@?|!Q)k_}!lX5f zeKJ_*xB*`FTaqO0OcwBIz};Bp(~6nJOM&%fAG$$xaqkXBF)ctz-j35`uyq?5qOB9yHSQ^s98ksK|__v z`0(!0i+{t^VZ2wkJFxBiJ-bg|BZArlokEr1*!Qa+V+Cik6wJi}x+~$7a3=P$Aojxm zqH3k)4z~r8p#xld7#`{<|0-OFYy=Yp+4*p(B2YQ7D8#7l<%RA1PFMJbTqeNMSeOCN z8op5p^pmHiO*?#{!l1@3p-(0`scT%8`%%sRS2yintfQ!w(9o=JfBIHRpcJLfljqsL z!DzHhxgUSnAaAJPT*SYY=IiL~5w;52UR24ylD|t1&t!1o@aZVy6qa#C%YS4lQGSY_ zvGevu1jg>Lyx}O_-vcLi=ppaW~VZ1$%8_DX&W!HI;Kq124t?07xZ!vJG?!rJVXT4(L4ei*}jO6Ek zg(uTvmF~#kynxFPUds4eH3m1s!Cz(Rok}?jaJG>>82QRApQ|9@myoqi;;UPvY|d8o zt~@<5^Pz1O@0048^9awpV1Th4mWX?KAH0qa$S=V@nudNGwj9rpJO!q)Y*K8>ES4NY zxyP^dF@E{LYSYBQep*Mz%?84ksDK+a4!h1wPWV4vI5b>U-Sz8=jc)T~KvQHKQfM_o zN2kx1WvIaUb*<9rzy2ryKLzg4R6HZ8iA(5B9<{|{MoQ%7=bYW90k>cHVQP4KlSIV@ z8ZY*LL>-17{`s*TblI8xI6Tc6ir?hM1<(J>Ic69cJY`kX%cJ4bK<~@cIBH7~?{y3` zx-PcrGIp%HH&yIjj7ST$En1TlxB5A*^HlV^GG-h-# z)R|DcTTh&8gK!Kn>zty)7J3Cph!CnQTo%bv!gIm9L$nL|W9`QCsjvE2N z8e*%kTialK7q2)bEwO=bTCed7GSixs#=fOv2w!V>KJLrG(#0*X^4WYV8YK8TaQo&i z3c0U8ySVBT;3{5f*|F|j1k6)S|EUjcshzCA)iYQE;5OXfR2bB@NPEamGwSl!f4{u+ zrBEOZ?yD-aM54_I`k(_NCMb(RM8X|&sV9kwwup*w9z}ELoR23lMuBwyNhvppp{4(q zLx$YSBv)SU7A*V3;7-pAdK8n8)wL7rBy5Hl}h=aWf_&fOo2c8T~`Fr7_$s`j83IFv)v(m5G1u65Ay$3FNkkCswsetY?2 zBrfQd355OUYa7H(;D%(2?6r)ph~tORCOnh7G+ zE2?IA1lQBc)_dKUopK+B0O2KuF1g&tm%a4Z2Mjp^8xl~7mVS=lWACS*+8_cF+1_{x zv`eaxfbmM8;!;W$NL)h~`c^nj=$Bu9G0`0w5d<)v(OBCGu;#-2{L7ruJ8@af2{-g@ zAG=lzxP66Rux+Kb7Vec68~QE4JXZ=%s$6bBy%h^?&HoM#MrC5Z_CFp*>#1+d;f(>* zWuB&ZC;C4Ps}g+v97-(>=iYAJ6QkY2i0XmE=GBK9qjsZvA(wkIaYKBMoulIVxFJLX zhxFssMUa}!UcJ$?5qpKrw&q>;uZAesq34mWlsd-J0m{{!J^_~g86Rs74iNU0Wnk9h z8)9F5NcEX9wP2o+XjOlmnKyjjYqcQ06!ZE1sz)?jw4nUtfV%@@;`bkkXM)|`zA~of zf4KLjcwf_`5Zr1xPh5lq>Es5;$>N`ql>+nmbYTI}YF?`XfKdC)jIr~}R2*>WYj%G; zzg=Mh~i&Gzz=U_loMQ_x>JA4MNUW_m#z={xhV*{G9Jpa{h0h? z58&5+en#s47=A?7k313Jz5$5qXnbFkg-~;X z-SlX~eGNON57(b7T;Bwt&-ImjD1KSB{f-ktXRwi~PtOZ*799Cz+QS?~xTSrgW`c+n zCwT7y#0}{86|absoLk1(v-DjyqWkt?X*Iy0x_-a}*3tR;1WiK5FyO3Jhb6**3-l>F z2Kj{50F+|)J@1i$VdDW5Mq1T@yLTSc;Pni}pXleF<)OQknxLZY%gDia^X*3V^PuE^ z0;8OG((S?pvi0Os=dlPyW>;4Uk658!l~D6UzRna$u}<(2b6S39+OKy#scStQxGqEo zTEZY#2<`ZK0pAfI$YbM=9o4>_n_}P}Em!LTPcUT8>I3A+%9XnTGUy*@cG_NfGoSjN z<*;n{q_K24I>dK+FTE}ZpMAUk?!1Cxs?&RT9cI-vJnTETqZ#zt7~|6yO-~6zqb573 z=xYzKNTvW2_NPUU><8t~mf?W6mj-7w9`p}RC{51X+?+ONWKEGF7W7&Db$&X?q<4Q@ z=fLfSp+<)C+R|k@ILe4XWcK?bBn29Vtb z>Vi9Z5~wan6;G_3!;t&xZe&2ozBax+Gj~3XALsa36i7}y4V_Na!*uer#<5_Ja)0}( zeDvTkP1w%dKU-;7lzH5<_Qx>8>GIGJpr0RveIv{L4QSr zydi;G-qj?NmsNP^iz1)1G4+*rw9q!tfO=U~p=#qr(Gp`3A8n}Z@V{1Mp0KVxb_yXDemS~XL?15{1 z0>fEHFM}az76^!+hmhXb#Gh^l5y0S_Fhf4Bqod5Nzu8=vduG~hjrNc4b`?atIv9_4 zvD>?F|1uTdY$m?;!?Wqsa7Nu#U$0IJr7yQ&;aI&p>Cnnj5}ZjPZ(AewMCI}O0W?%y zGt3V;alwE!VAH2XpFGnGH)_{%zyA(y@U%go;I9cKhu>DsB=MkHfq^)Y8=Oa79I1gb z>2U(1SRvY(hB(SsjmaqekzX6;n72LXqQ9pd-xYk4u25zbhwj*HoTjc)-kPejxG#xS z0k#w}iImp}KptaGpWYq2W--8jkqoJ@SeGl31wZTwBxg%VG;H-Mti2vrK};#wk{=u*AKep9abd2XGoljFe^6gRkB4jn^5{z&n zw5E%5&>=F`I!M0i!t8uOzL1iudTl9J`FCf>mAxA@rs!MXv>xlyC zqvJQ`BHW4_%xL@Vwt(yP=;b2bXGfL+Hm7n12=T!6QBb>FSYL4da~zs6zw^G1Ww09J z4^bI(o)eszf~2pci;R`QMt_h=Yf#sIk-0jLKX^^k(2uBTcn|tt`oRLD)lY-|@o#9w zynuwNCtzLvq>b>r&oOOV+adbfVJn++;cCmWGKT%+gM3vn#$c>oOfIDVTo=B}(2iet zqby{(OK=ZQG*kx@X3L45`?)N8a26?ij}{$?yv-G{eifM`=?xT%09@R+pHE;B7q*Z7 z5LuV$WQ`yGjo9l-U^|JNUuxzJ#w8VhLieb+925VldQS!x2^75@?vK2D90e6$>g(@n zqy8ojcnRw_4kS~5C-5P5G^r04%)h}Qv@2L60M5V*V*jMOTPzj5{X2m1(lVzf%dNW8 z9cI)^f`1U+Eb6apwl0;hK=AV87Y76n+Ps`D@$OX`7iiFYvN=$nf6$gY0yT>^m@pcS zmWZLhZa9F^7~mC`^ZeLQg$tf`dmVXHUE9pTJ+e=RR%MPEf<7N)bCtVF+9%FHUGUH5 zWt6}Ym`C~|d+;l8Q`uwT0k2RfH7`-to|BZVRpjWxcoTpX{K3~mkW=3&b+ zuR}ZD;Ffrlyp-tF7JN(4IMGbty3@%w)Tjo5*99^lEby=+k5K)6A9W#|9Q3`#J&q7^ z&)_w>gAjBClJ8cnYie0&80 zLO;c9+=&fk8;wY=9B7~bHiGUOgg77|*ftn|FD7dq)bO{B?@ITf$E0z%M72wyw&y9&=_R&7q9K z&*e#&kv|4i4J!i+6{JmIWTghEN$VM+2+WM(q`%{gy=CsJmwV1J@oTwy@F5`wtpEj^ z*H!9irjFOsjXa)y5{hj3zynb*xUF<^5KdNmLDa{ra*W(Wtzs7?*F}{V#f>U)WL_Q=7mbu5-_1; z`3>N4EHB7@kkhQ09DS^{*VYEBZwm}I*`en=9su2~26B+|@*ky22uSX1h_#OWw*3(d zKRpeaR|SjDHLOif^tLg*^1PUiV|-#y|;}`Et8cXsDFnh`xGb0$;*(ivm2=A9iD+vd{D0&ave@ zeMir7+VnFj6q!M7{dJtNB3T?I*3AG&gog0ne(AzS>2{cOxdE>_{N`1IFtkD;J-QaNUkXdb%&Aj@ZU!GY@4OVJf z!K=c;6|0HhY17@T{HIwF=49@jl(s;M(S}S-bD6fSj;w z4;M({}ww8@gW9eH1hmVkcPS`}}4?w?0{VKQo9}70Se24zxr?1jK`<^dB)S_@P1yc)!h(N?p zhrciDg>&*INC<3P z2e#RA9r1f+mIS5$4I!RuBwyznaCDdDm?!!Kpi(mxOD}~rL}7GBNErC>d;VD&3GW{i z7}Ik;?k}0&r5?e@cdpcGO&i@w<_pUGiRHiVwYiKG(g1+9U zXHcItk7*u+d`3kVAHP%6CrmN$uG)gQt{BZTH^Eky0G)@MOhK3LyimaYGJP4O#-aK; zcb>e@z9Va_Rdg6O8kJV1nxdxSZKXpMssc5dxI_5v{j?=mlyb5%&bp*XYJwlB8%;Sn z9(l4-wI<4P6MqGVo9bY5=WJ;Ak{ZY%5wnY8Cs^0#e>f|I$QJkbm~SAO!m50d&|+CS zbwvtT=>6+^swOUn!tGXc&;IW#eKp>dp&@n4N^OoWac&cKAVOUk{=t>Fhj8`RqT5R-E%^-@xsMurleUJf+Vk zXBedW;J%oHG55RmA^wgRH3J}O$WMJ&^M8%r(B6e%<}G1gBcaV3w;3*9KOm>UT{~tx zXnWn+*ZhI_46g*ICiUMAuaf>?%rxd`c>B$I#C}B(@jF(C2A#F3O&Wy-_M}0$2RMKc zB6dp?X(rXc^K5)%4vxLPlLI%arjT30{cHo`U6VTUaO)67?&PLEQ0>40epFZwO4Lgu zd{i;Pl5Mq>sXc~JeQh!q0*8|C)E1jV@G4QA3FGCpL}hRu$_mExaYuB}8qLihrAHWY zENO{*Nm|d{lt93m-Q)9PV3mMgjK*)o#`1yjDyf$24%%W7*v&)hMh1-ij0jC%teyJ#>}Sk#E;BuQftPEA z?>9H;$Q9jP|E;>YoTN|5?yg$@c@Muji|@c-_%oD=?pZhD($-rA96V=b%n&jij zWc*V33G-olxu!TK9^)Zro2*1js_+YL#N&%ffd+?N*ib#;UM<9a75_;VM(nuD;?`T@ zBDt$%#fg;u(5oj6|3gHMJQZQ*W&WeOX33lc#!>dDK`mdg+|{Z=<6=wR%2pcIlwHZL z_)-a3+_>3Fc;JJX6dOIfs8-iYx_S7Ray0<&*+*JnWal_}l2?sq>IB0K9IA;1fHh=w zSJ%K?y~BbbiMacXDw40 zIGNIXBWzn$&_c@7B%4O&dHq*Z3rSul6fxqtR@8ciL!jGqpY+LHP_1@*-{ceQ(CE-{`0^hpWmfPC9~Vz!BqI+jLj=wjd0gzYGS{ejH-dp}W&4;hPAiqk5b`x0$AI`Qk6j*|`Pgmxi39zTtg? z6Tq~lQONoJULiG*y$iVW9vQuXNj&s|et4Ec=4rQk?o0am-rS@*5~Noi< zGd3TN9!2v#lQm>CVx}GM&4pvnezxoVN%xQaY+Jkz5lxe2@xWIIr@O*W=? z%iMZ{`;>0Sj{g4!Rf6-={!;_-+5MaF;_ZUjL^;~DQ9!;{EB@4#b>rM#IV~EH2ofeR zZI;NB%Ew!ZHoclGE%B&+)sNUihw|V0pV|f;c_vO;!~Bo%*^nx-MeKRsQ=3z7-r{>) zx8?P1VL?2YI{u9IRwXrG>~SWcYy={$zKg-ZIv}V>#p1wAOUJ^g6mtn)1<<@@IU%~j zyYlQZjwCwIt!H?xz53)EHR_+6lTN;xrPl5-Amuv9iV%+XJsILH9r#4XWz&u! zARzP-nWT#Uzfg|Y0s*g8}jR^|@3*uE?e z@qM#Hia)>c7~?uEz7*H7A_X0asPyjMpe(I^%4qUack@&_&uXPg8e)eYn(^lpd zT`QBvl@a46RBHI;#7Y1j3HhTHj#PkupmBx%sl=S!XY1g1MHV%5Oo8O~S!a{`;>6;w zObogmjuYfX9AiUHtUvEvMyV2VxDzn^{RZsk9dD;tDR3n~v7~N}gn86`&O$D6fYeL2 zM9-!c<6ud}Lap{NAAFsp+~%&S&3E|cON6<2q=b)n9>~r&U|8PwL>ag-b}Ctl!S&q~ z@*h6|{sIYzvZ7I09Pv%^a#t^p1|F`u$;&%tYDE)w#)LS)lce~3?%YVqz$ zR7Yi^&P9V=#Cv()dL{THj_2^nNs{M9 z#O5*eq z-R+bHfkY=rm{}7&bPZ}Hyg~B$A$B8CyR~PgQIr*Maj%#)?kU0w80%94qJ%U*zkQtC zI2)$y|1@0vS#=T>3#F%X_h{^h51y*PjR7DKeCk$o8Cz>NUWU4Ioj15dk5g6aXyx^d zkc4;l8l9N7RZ6Rg#;$0)267@*88v?Wk!>ur#uYhf!RdDyf;s8K)j zzc0P>c|Ov$J(2JM%&E0)9E>K088YQ5wn#ULGI4bi=7C&IR-YXw&KP38a7 zpdXSqUEJI-B|S(xmH$?;A<%q0-+@&TlUypWyOC%IE{42Bj|)U2V#%74XGvq@;mq6K z>K#~eB~zV5?^^M8`0tfQ%rs*X9xZj`7E1e=4L*cG9{m`K|4KOuMafF*x~vfGx;{?O zTa(i(@5Ff#IbwE7!#A<`j{iwu>e}cg!lrjdk&T)!o%SxqTIRxvbP1vbV%cnmldU40 zjs{mV6zB0z0NYXPn?VQaT+I$|ILnPI$%J7UcI&dF&!*dYeAa-mVb=JE+KQf{koRgv z&sruw15eIoCwHOw;!r}*Mp@ReLCe4hrn7;>4t10(#a=2vyQfkny~8$)r2uK-dv9{S zi7g=BR`%|duH_M&`OBSv)C<%ps7&R>8fqo5yy%pDfQtL7ca(lv7bnj>J<5q~@xRwR zbOuvzxh0uAlh5Nd!Dr^9vpIGZ?^7bpG}5FWXMyEoL{0$|0M-TE?2bP za^2>`1zBh(mT~pGO94BsY?Jn!VAT{VFA*ID?1vXRw^EFJAE?LVfMHUPQG$vHZz;uu zby`^R-m=Rgv|6-k_uhnR5e!ee+G^QX48d|MmmVsnwjMPbn9~Z?VsiK!CSRHR1|Q)a zXz?udj@r7vnZnEG{`qsd+D@V1H9V}-*V;z3(N4ur5;i1)O33}}JaNe%Ti*3~LA8)b zku$be*w<-=>r$HJJQeQx{!8IRyh1g%ZFJ@reV>8L^2GKSpYDKFJsoweU3zD@F8(ED z;LEj#`%zCjR~qL3UdkH|Zh;L=pp<@_yL>V^cJ8>NXi&G$<<(C{>mUJ?*&4i}61KlK z;~4V!>+#FW#jrw3WyI9Z?kY*WxAXcg@>HVn>S)gmM|%6R5My)P6G%yE`F~Y-Rz=&Do!sjjz&A7>BETWMV-goIMF0 ztX0-MZ;?3BD6f2o$=vEJ*0*}SKWbOw<2-UmvQ$08Mes|Uz@?mRiG*DaU+X#;T^e$) zQ*Fd39Q8C;i$Uo1~cJx)hnX z?qm30J5&Q!55plw-@n{Xk0x|sx}K%f+f`a{vvIop{6z`KN?h^Ceno$_J+LTz3!%L& zeQ)rr6NzLpf%?F$gRj#ADL=FDAd5?Z8VjhXR539ly~Xf2Y@|j|4AEu&nD+z}=n8ntnW^dPXLB1UCcjj=3AWPw+S7gDKmg>b+-vLk zF%sz9!0usChzr3pN_4MN6xP_}b2)2mm-fOXC%Jfm=B~2@L;EW@dZ@q%j99|0BGIhn zxNm28b%Y&R=Mh>4wn0J~p2XajTYlQoC^_i39$%lKZ)Auc%JK2a3!1`e5F~$

IQsVp=6K!b`37jD0;mSGgRwhT6QbL#4wa11`Wj&;K|z+8vX(irnj zV5V7Ls(O8~7jwjVL;NCYzoomKucM^}noX~|rp3uplF6PCJo2x-#FX$bMysm6c}`;J zy6Pr-_;Yf2!S8yjbWj(sQ|_#A_QfhAkd<%T)J&r1!i~BJwf3hQry^fldII40$2Kr# zMGel)kHsnx>n730-uhm624yvf+`~VUnP(GJRK|p+IOMO zNz!Y-MFqX5%C+F)qnk&hk#8hF?m1uqd|UR-ao~9%X3DN^dI$_Zq_t)+IGdi(~((eDy56Zj|~1aCi+ zPP61!{ede1)LyR#yMXXKwt7h>2@T`z_!1Se*42+TgL{Pe zHy+|3uY&mny*fXok+N{c`o_(^mXGH|bmA*5ZrIz|$GPh_c@+FIuEm1+0WI-%>GBa#y4^MV5+y!%QBE8>p6a=7H9t}drK zG>0$;71;2LS^Lg1iM*sEsoG7eySb3i9^Y3D#Z270N6{0{xU_*b#C^M(%)e?oE&8E* z6ijonSsZ8Xc!>S%(2l^K{TDc&}X}SYW00;QJKyxWc^sMdBO=8XjOuh=FEC;o73=mpZiW*VaL%E4^FX zPOIw0uo-AR@U~nmP*fo_7B08KILyvrrPkBAJu@pYp6iWG&<1OuE zeWbC0AB`{CJH=YAFO~Oec-DR}UhU3(wl67v3j^=>VC`RI`{HhBnnKvUaM8g(B zE(fpG$Jf{?rifx71x?#fB~@=U4@pYjZCx^1EBVw4XTAg<65V1hO9XVg_f_HBZuKWJ zX1zVH(ioT$cr%rh-~g^T&Q>zBHcf+He4tFl92`{;-&w;5qfntD*UFvYsqs(EhES*F_;}2Ay(ajz-53g*)QpT zqO)d7;OG%IQePFl!NtI>VRA?VC}eAg7XfeOL)F7n;Ua24hZ7rmc#i>bp&`U7h6AIG zz;nLGWq&piKDLy{2kmpLYa0kOD*rqwfnX^9-tlruy2kx?59yNrPvb%}#=x{Zd6zIz zhv8=>vx0<+XT6aIu(`j5XT*Of1~1)rBjE|3Z+-bN+Y<{@rsfoq$bLFMVX-gZ>R^|= z-uyqwaO`>wRf6Y<7+6?>7=9b(j{@2hb{1Lk1fln2x{9U`$kvVf_g}q|kyXg^K6h3^ z$UDr$Og2XDjsB@rc4MScHIyV@A=VbY%ep~HZh5}|_qs`dH`cflC(-mIU^|dqLzJEd zl~!)QUvF{fTQ23GfV%K;T^BKse}Nsi1?S~}2MS~Yy3+5- zLf@kQS$M!nW*}eVQy>7^^5Z*(1T>fx(v`_U0kqIK4r8a~j_~}~nixOg*Kq({pLzi? zFvra1a@;BWg!$s2<$o{f14v?fKHwf0OnEe7nsdCC06xnLnfXiYLKYs{@Mrana4+m1 zGW5GEw*Q}ZQ+%jTFt+_qy<9ku1S-lbWC$?8KBaRloZRXUGK)>bfZ)rU%DrL&{eKW? z?su*|nno^Bt{?!CX0=`ImfIyA*Say3vpb1e!}Gg8{SaK^`}66yC4>h0OX=t)=c}Y# z4|BK=R9%~)B3;^^H*ILwU11{c3v&rc8N)nS_@gPEgVg8+1-MJo=N2q`;8L@vg2u`N z?e_C-?1UM}n*wudubT?CCxFq6%E!ToO6z5&X|1s+J&q85=`w~+nqA5gj7 znfIhTym5or&pW^VDVp-Ao4&#MZEHy4T1I_uS4(#$fxZpI|H**-8E2T}goAG=o*8Nv zb|Q-cxLihtZ3B&e<7yAj{FLVrqY|!&0a;1bP60zvL6WO zQx04eq)LdMx+0?QX2gRJV0S21*jA~yX8Q;u+eJC?HV!L!bz_+txGo-!srw&}3jGDB z$H|iX<>2YlKFssx6QJj6`*XbUw{jOz4wY00dA_)dJTLN^(U63$56AQrH}snfe{Jnn zw!q`4vW#*^&t<9T`8yfldU8EV_Tp4RzpFHifCOj)kuUDVg{-Y?970@P(T2yzAQSs_ ztV5gA4n!-h1&u!cp)1UNTXx5f@qoA(EDZx5V;$}YBu*j3_ja^27Jay}9q#iTaG?56 zQnmdK;hBWeXVf7+LT?Rp;J}igX115}U!EJ?)wC?XatT#J@bj;Y;wT>v0~gq?X=2-P;@!Fe z!t*m$OIweBw0r%$JrRcowrjv{b&pw9_|moMhMZCOm~Z6rjC2XpY_DhBeJxx|)fd3E zSFAaUS!UXlf0?FJA9C`|Cb!FBdYjtJec(ytfFXNVjGfF5`j4k6#hlcBjB~)&prABx zm{GdY)Vm)hs+pw#>7PI4XW9u@1RXd!(oS>pU=>5q826kyLn(>JftuGli2sx$cM^RM zn#m=5$Mo~4ubl_@h>Q)=@XK)csmD%4Fw|~9ju`;}eUXN8F&hPA$D0@rbpED%NYfP7 zpPE{cdYmY6yS-fZj8r!pvxyXHE2@9ig-(ijqFk<+%P#BZnyhH#2mwc{Go)VRBiZcl zkN(6!kA6ZY7vxq=>u+=JTf5b7(}&odG}woi$S3PS_Ft<++xrwwW}Sqr|Nc~FAGjP# zA_GNRlm?fwZkc)DY4K48lq5PlY#R$KwA;yEqdjIyJ()!+>ueZRoZrrkRZ6WDt64>o zOXG_oR_rZpXy_G>2_(8)vJ?hl?V*5$!d``20Zw z23u>PLu#$Eo;t|D^&DPAQ&CMtu@{x_ng)J+zNHh-QoNTGNz-iU@`Svy$bvY3I;-tb zNb`kO_~xC(_1q*f=Daqo$buP<4bHf$jes+=kJD8lGJ%|{m$LNg5yp&(cG<6d9X`$2 z#|dTRhSKM?)9n2X8;(ycLBpEPgMQH73zUzi@?=VRY3NwWFze~NcJl(W!jzM3P&}p2 zM=gC^mHXM9N>!OtkW#$sv&VgK38WcDUoGCCmsK_0vik!i9vde-F`p3+m`UORfU*>3FKT8z2?_pS@2)lvC zLtHV$$XCR|Noc+8y8xx9;?MoT(zUnwN28MZVFz2YP;U ztQ~L5k2zcZJI$~(FqXMSpr3*)IktIx`L|#L_y|Twh%Wx%0h?Y#X=qFns{w>2Z0nKZ zFK(`4S4jC)#^WqXJk>BouJf8(Ru-yOc%F=u@Uy_W7v|pJ?{DJES@h=~-ZQl;!k7fi z+#oAIHRBwg%%2gXITSC6C|010+`281jDei6gECh^4x`U6iByuU4R{Hnxa8Sy$M6}a z=grq>ER##C)>9Sn97Jar!#7_qUbFhT^Q!!2E2`IrU!fL{LL)@={1mywT$uU5;4~FE-^T+^7w3HQjzn_V>J`r5(K^1vf z`;E@}l%b=dy~sc%X^pyf8+)t9Pb~NLW{||Qe|3}C9{{Qd5Jp;7= z?PHJq@mKxB;~EBL_y6Xq|Nnt7F#m7eDdLLJ-zgx#DfS))3b5MGAr{IOhra#yQ7NuD zygsCdCnFiT?=PZ%!Tg(?Z;*S9%j#Ihww3j`P}^>pYmjt{Tk5p+xHEAX@qStUyt_ue zwH7e)=eTC7^_{hL?ct(Rg`}x6FzRLMY#{_rk>R^QcOrfKM( zej4orcEY^zsNydTt$HuTf3t0{w(;Ui~3m;{W5=3HHy2T!_A&tyINo?VUa^5Oz=& zbNasgv+;Xd(%+SOkGcQ80HJ$z2EU>04UWKFy}bFkc=&sGcF9Mub_KMWb)LQq4c7LtxLf*zAT^d~dEi=tkC6N<&W0Z7 z%efO0EG`+-0s+*(B^mV9GVW`5K&|whyW9RFFRDpnb*INW5s7~aJ^H#jhZ?hU@pIPgQ?)9OCx+DZKQ`yCf4(Jvg;Nbo zP~kb?cAQ~)J{wB@_yn|f-{JW9@B}heVlEKIzB~8`G~+@Gj4Eh??EmxsG{xSE7l-#? z>xKqZ#^>6x-!(x4$?Aj}k4*hnlQ;OCs)UvX4%4tL%iUY_)~GHTKpPmD}xZTRi3?f(EEa*BVxiCoTCfQ9$di zp%@5VE4nN#DN&)^hzqwCA<-uxeeC;_NImQmQWo_#gQV!}NAZidW3=hXBQ~hcc^}ND zM<|Dvt7riB6nj&aJLOpBR$`Be+m%|frCB8zM)zxvQ)qx#yD(Id5*bSS5F(n!Uvu-{ zmK7?BwE>g^*Q(c)gCOoej6W5nTd{&)>={{%@x+y%O1a+ zu4kA?{>{skwfrY=yVVMHKWOJ@vcaDAFs;6=E)7cBir{qzwdDG*C|%MvKW~eFZ5!84^Jp6@1`8l#{p7 zK`PpLNpXmnC;-=mF{Bns3OJ}bn7YMP6;dMwU+u*jAQiQY53G}bp`ZSU(3Qc|6bfKY zVXu4pv4Hsf@t;##&jdYKSQ!%g=2#M*wHc2t(7V7ags7Hi@4GDmE#GBSfPpH3s92dtvsjWww|#MGKpA0#m^A-3^&;m z(ENUq!x%?q6iZvD5^{cQgLcFyQ->LHjPII8keyZB^a6Atdp;vk9iw`7l*y^p6=( z{5f00?GPuDjP5A0p+v!)uKC0PHsvIBHhg;vhcvEj;}WsCdwSG1{GLq$M+lO z5|qHwFX1D60H?54Ep`JmW0P6lUX6=zIQf|gkJ6JV(LCf#UD#0z?bHJa1vvW%kCAAwt>cOz;lQSHdHM7s z+KW~d9xZZK%<<_Hc;$A0$5nxpIh#`Ba<^qe+!YB!#sz5DN)B8&P95McCa7%E6RL}1 z8exbbh-lOfDT5n5z^&qYylSGDER%BQi_FmyTy2ad8()$q)sZw8x_$8qEzaHh`y_(` zEYi->%DcYtxEP1x#RmwXJ@M!h11*)JEoJa}D;;u-9Dg>AGPxEtyOmYvD-}sc7+oQ> z9c9lGiv3CMXA*KC^CG{O@}0B}3D)|;`Fqt3XbB(QyewiZGw>(c5V@@8?pIFJNM)52 z0j$s;8*{^^q-73Gi`$T#0s;od+bXAtqGplq=CHl5hjA`rT5wLjJubZTkI=Y_y!?B< zOFz`-D`;RxyXDOjyHk4OtL|qwMeg;Kdk0nk7xZP8$eGb!nF{Er{C9%o}$rZ}0-@SQp2*~t{ zpSY0ZC0VN{9(P>@;@4MntAt9-COTNB3-;DhS;TUh^4=ju+%Y-=&m zc~cZZvY`AG=ZNOf;#a4m`UFwF#b>792#dByE8Myg%rwqQ`JAkHPg6-&6RK@s-{k&_ z%{~G~{wCWWZWw<3kbcrN2&SW1;l)qbkIHG#R8*sIhI;;5l2SBe3dAjUbpe4xLY2Jg z$KBb#k+Y#<>zfxx_Pf%d|472I9AhsH?NSpw#DfoJJ=z!5bF{;x(e`k6-LOwRPF^#W7Nn zAhv~fDUja8_G%r_^h=IfV-f5(nSNK38*}(dYEP9B#Yi9fgmKp#BHb1>#j)f&)~f+6 zHSwkWl+qL51OV}Un)~r*tSI5Ed%KDE{`C-{nB#7s+K*jhYyu6=A>*=vZ?oW%C)H8w zRN8wt{`gwI3VMquX*6%vg#9gYd0-=@6js`uuiPZ)6?jB{9vCU3s$_P1&7e_P|wERlkjS;sdT7>{qGc zlYCxmh;KjD^@KP4z@QmCb66OSQo`5Hr0*XS?bd}9_16nAo>^!z8eE@)rrSv8J$K26@|ni7(iciM5me! z0g)l#OFGvRrG!;5j5ph>*sT)e$3!{?0z5BKZhosTuwT`Q+rk+|CYU%`g&~5nmzE%B z!Y3-vAL(oWR{mX^Shd(F<@&!nGl&cPr)hiB-_H+Gu83T>s;V|~GH)bSi4ogh! zYtM!$!hHF!nX2$xj~31yvdSVx1GVBe#0GViG2=YSw6vY_jZjKGRFJOx4`G8(sXZzk zC?Ek_$qMHFzQ>9l9Siw(x@&7bJW;vq1F_*4WM~O+i zbCVw2omJ2fNj7Q}xL9x55JSIR6G(zN3>f{|Ya~9{lh1nbgKSFEwfkK{7a@WqR(lnf zkwQfXz+*AVd>&ttBZeFSRu|hlrk$K2Jjngh(yV~!v9rM7_$Q#|J8f~q580i6L$l2% z)$rI~41@d#Nk2nRul&O@ui#v}#VnY@@?TLTPqK5_@_MdpN4I6W-us5p*pA0cO~T+n zmy@u0TsJZxf+`yi>?TXa-@;K2H=!f9XXBpC%JeO_%w!4XcCWm+S~n5lrejF=#chqWeBZxzM9;2s zX@9l`8$1v>_a#_wH9PVUb8pL%2+3+2z06(3EOSh4GFjDb2<kd+tgOuDee z2jgj84}Z>Ci_YO_rq59&{0~OC5<$4Y6(woV(_J`4%9@Wf=17*$z_sRn;6HF$wx|jN zjOktIZ0&BjaJ#9c&d*)AA!HpL}n&4lMdeO{=s=uP&6ywVj??309|YZd;iLFY0Rz&CpQcupp}>n4S{1aOmT((4W9nbar9>;Eb5DZ?V(00Nv{!0&c zcP~pw_V230I}uDgZz_M{*~*a={9~x4qj8@2gf1Smj+yU1NaOE6zTUEgJI;Qi9mm>= zqe2zJ1a;oL(EKhlb#-k3CHzxyTGCYX2BCK^7Ej)!)ZU)#hf+AKhq#Z8pX(KK-lLxf zltCyv09+2MZ} zukOl)V*EVs&4;2|H$oHBAB@^aw$t-bK$jyUs4;nxYn8xE(RVRO^F!}`O^2G~;&Qj; zt5c}ChO$s(775t3x3&acPsDHwaB?IDkjf%F&P;-3B`%6+&J(ildc=iP zh-nst!)9@Umg2Z3@|K~c2`&|wtZ8n=FQN~O43v_h(L33C(uc;zYiY_N2-8fI|9CC# zs(x>9e7m}t-Ht#fsLH?-b2kS_>R+UZXN~RI&)GLB8<&xDoY9nF_`J2&f95gH3;ZAs zE5A<j$zu}wlU$ZJX9=~#2GX2y%yyl%Kv4my! zQnzy>DsHd(&vG73E4)UcC3>=W6-g%qh;8mm4pld}w<_~YA@ zsU}FMN}ml@_eNlDY~G_>ysOH{vfXk2(ZW#pTfl(`Tu?ybx(gIbPD0_;x7tP8j;Mb8 zQK?OtQ>+}I6@lbYuOaR9b-m=@6+2+na!xe8?2m$-RS>HqhHF>CPPuC5Z}AFPcFWh# zT}lq|p@XyQIPl@~frOSe7M{he!0P{zbJlsq@Dekn$b!E7phnw{Sjup5U1TgQ#K8nK zukP+Vl&`WCQCb@G;~Ah(6nkrlu{Jau0*L7uU_r_kV9Dz|Ho)O!=L^aH6fU^0PZ3i^ zQYFDb`=NlK>$`<+{J?Vhz&Q#?I>z>$GKd$noxZ072sx8kOSH<8Ya@U^VZ=p(;jT0s z#sD>VTLN<^E+S(rppY7TJxV5`7@1BucZ2>qqYP5ulcU6Uh(WywgVjG3(SfbfXHUy3 zCA)7k40GO36eAo{-RFcMx^u7&&oEZB&T_Kk^Z@5G|K->mx?-YWgvyam)Rlas?l^b z5?`2}c*oF(CjdtvxJwn8Gelq!q2nvTaWNS3!wy0t;-^=j%%F9YDvx2<_$?cSi9vfP}dViMtFSvd0bhhFYKuqW)BcjCiG; zxnCr(#-x`AQ4Nr6qjJ3wsk;-yOYLg|>3ba5I2)Nkp^UghLzn@YzQmnFp@vHD_xJetiNB6#y z;{tV}ex)Gv?jP2)gN&!p#8_32PrZho{}<(ueAh&q-*dI@-%g1aY_1qH$5e{gT1dBb zG}y)Paech_k)fNvq7{7ZH~}c20KMr|`<511=sdf3gb0T@s~aFj;adka_6c7BzqwO= z7!tJRldYP0zYp7Ie5|j-BOggDGbl4VGzA4x(PrH^9iNz+e8G>V-B@JzB381-8_;`| zj{rI~=H>hCJzlM04o=u|v`0ei-R zh7D98buB!Ndh(ZzoNeyw$ubrKngu*2IpQ1A4f(bTG6+==38yr z$>f<^f;%?yf*iO7L(>6x^U|IgjAcdOu_9VY*zYsrl~7DfKmaCX-VmG+@%vyaj_n;TvqtX#{32e^e7#2_F0H{3>o$ z-2U|;_dAKKs;m|&6ee8ETk#=7U;zd=abHB2-7jU`q(oz*F}P&dzM{eD^fe_~8pwlK z>TArAp5JBSLIW)e$}`tj6i8*_1I<4-O3bkR=Oh-f zm9>m7!>c^(_BpmppXN78oWZ<}(x#mo!;goQEG|*EGaR4FT`(y@&;>U_7on*UEq}oU zA@oh{eWCCj1F5U!p96v9Fq=Z#tTA;>rRzVH`}O#Ri+J2B5*VPROecN3OeT|N_rKME zu@g$n;?beD9i8=%c1ssN!8{ZY#r48|hh}W7zQV_o z*V4L-tbuBQX4K)NM_ zlZ~knt>B*KVi7B6g2;>?@f-eK2$W*>zt$BL<5*V+qu1FlV)v$@@TX4)#xGnadL4n8 zLTboGOBo|Sp7EfbE-^j~P2?{Ls1Oc=U?W5wj)xw=PK?g!t4g%aI8Qf6ZW}b|RWA&_^b&!YDO?ERMX&;nC!{ z)z>HqUZLRVdJlPe7tIs8d#j=}Dh9JB)No$e%2D~Ju*Zi7m%>?R)G8LYgYu=TP}I+v zX0fAKOcJ;M?6twsLn1{^A1yER`}$Ou{IhqB&}xufmfw2)M^U#0hr=(evu!t?ob-pa zwzC4^?YpaRi0MTo3`obA0x$$!{sMCgduLaJZdL}>3bKII>nwQlTG6bd zU%$1ZPpMnm5WYq05oHwAItbG3n^JP3Pc;ZLb&&b=^Teg1_i#m4kPd8Mp{K&`XKEYX z6ORHKq+-~wzPJv~Q+uOy1o;R;p~1DGmwas(e1S@Z*gysMel6r*(|UKSUn5@OfbWms z4&yVpI8Rq$O#;LqY6_e~IEPqkS>MS{J22eVYg-bFa9Do2+6Ce75~?<~SQx@1j1&)6 z%BgS@7ntfg32s%N++Y*-E>1f?q~P4;W!0Hi0o9Mj|2`t1AiOa<*PltAs=q_7QyLH4TVk>Gm6aZ|1e(IZU3;37Gj<=UO`DK3GWVQm}j(SFYP0aBOvgEqO6$ zqk`iZ-|B?|{7+D0=Np2SO@3$iXfpZ9op|;o%8D;PmRNsF7y}4dm57eWu6tla_kSRO zxf8L1utLK#Gm<`|N3@C-(PzL(3}k@deR+8eT;Uc!$`9--D?D87aflUqfi(-*!O{ze$3X&WWu5*%9O7r!dcm@CiugYE6 z%(CLQmxMyfmqK*Fg@Qo%>DhV0_&_r255y9`k(-0k7C%b4FA3XAmv#7!N-v3&ngpLA z_m(aY?}%>%eFA%`N)9m$Bgmh+l~~3L62{5tY$TOFr)srulgVUZV_CD( zEt6ArTCil(*>kAJ-W>~PNPE?-p6?t@Uu|^#hty`L1i!%1Ie&qUuK6&FEXGyB`&$$y z;3Wsm>T#vRz`p9ZO7v1S*Jp}B6WE-(E$BO2$T?!P7P*Ja+|%-39~R<=5fX!}_$LV| zv;V?9dzGZQBxivUF7S#8)cfu9%GBIb5tNM`To8vLXGa7F6Kv9w`uHVwlwf)DNcA0Oo^|{4iEqB5(FEHB;naOz6KgYXeDloNvyIsrxS3 z##8f+cM#)(@UqpOdi%=Q015}l^a0fDq0R$ll~70~9uU0xsCqa`FaoROAjh15v+dRV zp}kjt@isdv7J&}JUzoT=N{xu7(v{g>68xBlEo3pSKkFCCJJu%7cxfxv1Pk?WR)4Tj zMuZ*t>EaNfM6r`WCX!)@(3C;18Qa!Vo9yaobg%^z))1d!r#|8oKpVlH@ew~j_hpYq?Ox-gyx>@ zp|2j^5#jz+kPB4hE^r2AF5S(;RXnS>h);rReqKsjH(3ZXWqP+8V`)?Kgoe5HKOyuc5;+@y(%-a3=k46LZx5T+kvuDp!_WypmYE5GRVKu!HCHnW9M-<$#H69K3<$0zIlhvCd859tHj(jPJ9?y3Ea!P3AE>e?*dT%v^-kqBS_ zEKwo6+geVTng439!%p|o27TE-xX7Vf78^KBy;u6=8EnFR=RX4T`A#&~hBd+(h@ee! z=^X%iyVy6u&oFAyN0^b|4pJBgtJx}keerbX63aZ<{<^^(9Wnb5P0DtxqQ?0?4h9|G zN)v>O@lgHm9KL1$h6BAbkvhM9S0P50U6WWf{uQj|zF%rnhb-a*2(8X@HB!cdw%MsB z0x$ugs?kR;_CvH=i;R$+I_Q2RCP1M5a&AiunV&%MEH_7aA55aY=AqSw}RAIu5N;{*zo53Tu{{LwW5DD z@c^rSwHts8Nb%U(GUuji3!#vy`Gt!+9{FuEp08n9k#YNaX7@NvqB+j~ z)0$%6eoXGI{eiz9V439jbpW$-MVmv3)l(;Jd^=)H;`eWs78K}tv)CF@$9q;63fwQu z4a}iR3V51ctfU}#Cz~BZ$OO-AQURhyisxuD+qB2aNU(elk}QwJ7&9ON z)>Xs@%T|cj4Z@gcJ2Y=oGQ}AdP`!~Vbox^TQ^cZY3|0!MaKur9&-bm3K2eTlCWp*j z^T5TwyndIhW39f%;upWg<^`p-uZi4ONvw@gIkFACVo<_pz6<)5Skn9$lyp zd{+hDcmN}A8l4o>Kj%8_XMBMsR1WNL37b_R?|D83aoWxjRV424pCe2W9XGuETG>JX z!t)A&k@ETbo|XzP(rtaeEpXdzB2Tv z+*VzxR123-$lslnh_n4{*_;FWp1=gC3AC(ytOd8;tDV0SLp%yYLN3!7HGwc%%3m%H z!6CnHeO{DyB1#McqegOmjV(rZ$E~oXK3_IH%M$|;RsNH?h1ebS*4kzac5R=Fpn`6` ztYx=uh+mzF>}qNHtH@4;nJm~X2(oxo5rt~Z+zQ+bb}>D!5%2KNV*)`fQvZyd_ig$N z7=_v`jA|(U1E62jiV*`*RP3{5z2w1bO8w^MMaJ?&eU7`5_Svf-qCKih^Zp1VVaM_$ z8JSPl+}ZYkmOzt15@2SDTnkzD*BC8GLm(xWm7|~4D3&k^f7>5XE3(k!b?h7~%_s41 zblln6;NnrNiZAfaQjn9KLh$h;GobQ(+MuWt0|`KPrYj%vu|a`a71PJ%pXx)!{SQgQ zZ>Ivc0+xlh@_EvDU|XY=OR;H({8< zmUo9v8;Vm&l&%LwGUxyW@(Y~5CHG9dW5~1MDu?3OVEb}U?GIq-4zD-MVinn?)15qF z7|Zcpjr7(2lWE;R2EtE+s=EQu-!ySR8rlF~tR;J>SPG@xcp5MRtL3g}sN`Do{fB$TSVYaxJ1VSnQA7Yp0M zbDTzZT6q2mmUde(VOn$TB7!>W3Ke#JW&1z0esGn@e4zDDFN?OJDZi~-U)aR3^HhK{ z(=E7|<@?00srd1LdD#U)Ft2y>H%J!|@WzGP;hdGNELVGWtog5~9;Lm-7V>G1)Ry>W z>nc<5)<3kxL$4qd^|e!~p}$#?rK?&g$@8cCy-3E136Jc-u2Wc37B-xU2!Ik6YJ`*x zJ2Fbb(w)d;Bp{HQx8=?QhzpAXF>6lz8rXA{KP{<6j~I5jZq>%b$3!-X=emRdu~HlL zu3iqj;RSRWlZ<{!Gxg3+vrjGN&J;s0OEd_{(-WZW7u4KS7%Sk=m1|3j?*r1ZP}<^Wx@S zq<*l0{~$O**F^ti5Jt#3svQCPJV^AN0)X1!1J4k)rGO6xm~nmqHip#j?ILXU#B;$Z ziH#nxL29awE3&Tssc6%57Ch9rC>Af@!p}kW?9Z&fytYO#1#QjZPS3}vwQ$rHT4T#H zd%{X0e(9-wnkm+LQh~e@fqg{^%=|=ODW-0xlzL*^+I4bS z_6*cBwhN62ejQA(+{QmE#oM_Tv$bESeo!lrXgIL=P8C@(qFEGL05)52S;ao_ax)^! zy{R_7d@3*#i!`}%Isnxne?s8u6p87@&3pz)E+57IM}8?w@2%qy6Jp1TF7#PmJ zzu$5SqAXnw8o*rh_`S@dz3u49eJ-{1OM+8<4W3vB!#b!X$R|v8X-h=xwd&*0s#eLO z_4*Bp$(fCQbV?HB(R>9Oz~Oos``Ubi>RGh{7)h;u3R{R9OSb2G_(FkQ`=mynfO$Q( zJR(>9(wW^k7r|X#cdVsPP6Z?nHi4Yq(UJgFzC`ziju_qE27^>>{QND zbOivuwc7J#CxlX>mY_)ev6zmUJL7i2MQOUIqHzma&{gJ+`#|YuHKT9Fpl^ut6}K9? ze@Pue3|ctC`CV0Z;p)EWJ1YNilM_s1-V(MOe;*y_^s z9z+DRBkR&Iv6}sH6~5J-nRh;`b#l1x)$4R0QfjPrUr<)MgzhQ2%L}+15uQ)q6zb_V zVhGEJ{wk+`Fi^}(1PBL4A+&dfIZb!H)|oUTlb}Fev&&qAbTeip?ax2(BDzl zqT#&uN^Rjbmw|QFSGmM>;TNgA@YY1|<`AuiRieYIa%Kb1SeL_>nY`L?VveSZd|umX zyHOEnC9-Z>hn#i5!QynM|HWQbE&Sgq#}LZ0m?|T{?)RGB&r14DUi_Kdbf? z$!U(YofAORrjaFMr8-J?B5p?##N1aue@ZdT9xD({GL@Yb5Hy4X4hg7m1gvgWNRNK`%VDV+zR9&Ugb=UG);ci4~Bz zb_c)N0lyUp1(IMQ&GOp;uYWRR#7UXzAS6zGVD5t0kMUD^()9MM5&6Fg=+;v!Da6W5 z(pFX|6BD@(<9IMkU2fju{(u#%fFx1zjfW(NpD+OYirA%(unYDa8W5zp!T&Oi4tkhm zxZiBYfoMHXpr5@62p7UZ(MM1dK2pEzmu-H4H~)C0k`*HqxP{2`8YyD)K{yNMQ-B5T zc?1%_@H8K{kpgS7Swy{?8m%h+q5*lo*Bw1zc6;_l+WCv4gCa2(TSa+$=g8FRaC+ls z9d5qzirjymbb1zdwQ7!zklfpFIn(OH$rly%40kkua#&eo2(OE7FHO$L&rMC`0Z^g8 z)0Q0M31F11AXI*?zke=Q?82C)hWD~{EZ@2*7d3$Ar>RlFAB(?v+IPB_J8&k$$onFV z>4?Hn>PndGNdDp00D|loH#c=x&Ak=fi3( zf4;JD+B$B;p&tmXzpw`ijF3-)VN(>y-(7QY`mn5`Bf^r2MB3P0ZrC@SzXh7yC6S>M zEXy7gox1)mG@@1)s3#@BUrZ?3PM5sI&e^Xm-I2BZZ=qkI^-8##8mTWiNEQ2NDRL(Q z@edlf_|II4z^a8R6CJJRA(cbn^Nn8EP5wAtltk^mAo`ZNjc!p(9G4&AG-NZxt-R$@o*zq7n!(Pa03{M?KsMN1_fQj~q=^ zHF50!w`(Zh!=6Ps;(Vh?r)wZUJIZap!qrC~Gt(qkmB(ogQS(<8_Fg?}K~((K8(*14 zK3ibzGb?PIbs8utEc1z;ydJh)@}~?c*lwd@&kUF0^kXkn!_fZXL$)LB)#G%zf@_1q zQr3W>sbLPe@8;+sfqCy|WqFI-mSv1{rr$PvemBj>+-QD!UX~0#H~TkeGiQ}<%x+f{3~Q5vArN) zXZJsUyWi`)E&)F*ePQ0S>3pDOp(s+~X%ebLpLIW*e3QmDlCIW5{c|a;%F=HwuW#U# zZ>ztOv6elUDx;(r+peT&TifwImWvD@axb1~CjIgXEehJ{JRE<@aXTC*bNweW8E{$K z$>+aZ&BR^b@z=gJzPr+j-73?%+d6LaDkiz&@6KPrktfG5HZ3aGWshS_$;F-;?}MFT zYZGaH9Hw3(#!D7`aYv^)+~A>^x68|&$&JT=5>J(>oZMuPMnp#kGNWVsqQjxCW5?{B z*3KNflaChd^^YOn zVI^0fSeZm&@XFfTcVc9h8xQOEKz{*|uG>?&(J|6_xws0aMm6A5^yJp%+swmLv`t;S zuco1ApENTDz;z4(&FT?Kr0+WW2h5!EG18Y^(Xj-14}>)46r?okA1(SGL^h{dn(X zouMHo&vYFtvm;9Q#T`>+&iZuhn!pI_udC1`-5=`aF_y+Bsq~U`6aG4tfX1*6x9`dO z!)tl6WiKN>go}3hMbZ+O876KHE`8HYeH2-l2Qq3juZM`2J{g=Vb7L7ExqGi=ZP#(f z+eG>zb1}8GS#3H2IClQuFAr?c+z#(BnHE1+ihr6J`$4DlUFEs*$z#6Lla6Yt%4*J5 zr3O7YHmkhtO8anpTqpzZGJ$p6G$f|TvZhou)h^oRv|X~#zpJ0s>EwFXdBFA}o!pk? zm54*mJys?=x6yqbnch5fr1(05PyCqhGE3t|#mo`lG%VH3$N8`MIceq?H#yT+fYy}D zEgPWtz`&KTlm%xTQav;c()( z4WzFuetEAp$@mjcT3q>in3--jiDnWlIKl6oc=ugKT`0A*XqQBNW+j;JDrL7>YUC=U z3Y?E+r&eHSiX)+Jb)KaFyN|rCKbdYanLQ0t@KeM=aw8Hab*mlbX~Hf;_C3_pp*KI> z#EtR8q&?~2*62UK?+1^WkFfBsf6^Vy#Nk_Gl8fd|^bAATQ?|sO^g>*rIk_?2Xwfoa z%&<>E(7@Z3C%I3I+Q5o&WZ{z_%C2nRQ+k+TuvWjm@6@4rdAilT(ochozpOXW%d=P* zqe!X0rH@mrtV|f9f}mf4J&1E@#{Zqy-;5#sFV@~FDvqWN*A5=s-QC?Cf?II6;O-V| z2p%B8-Q6v?W^fJe&Y-~uA7CIq@3+=I{ntL&eK4zg)>Kbbb=A{$KljzdC~Q$6B-#^4 z?hivXXo~IRGWzHHa9u+aKZeM`{8zMY_L~|L@8nB^w5ctJp)yV#Snb{C`}M7N_`B;b zv6;zuj~fj)(~E79YcW-z_9`b95c^0O@@d%A`mn z1(0%h7kDNOi4&*7X~d4v*kH4s!y>;|1;6NollJvct~a1&2|Wgf0 zu4H+Bf1fqwJL}eaBxk!j3m;cdYSL+D{Bw;{3s;B=Ufzrry~V%QF3}2D%sdIe4x4iI zmjB~YHJc*`+lP0Lwn=L4C8&K{rP?eF55{o_L_9$x&e#C=aNf;mz+&Ex6}al0gx!rt zU3$Xq>Xd1}Yg1!Xd&KlB>TLyZsQJrd5J-xWK$k2*Te{1k>La8LpHof7$ZrJX|IpAU zP!cICSR&OKc?%-EtB-x&5UNu>^7#3#Q>D`lHoC9gJEfJrX{uha_-#X?l2@gx z1E;I#Cp}?M<&PnlJa_4dP{bFFbUR5@5>E^_BK(_d+tH!0m*OLp71yCwwGqJt`B>vW z7p6VV^ur{`$BaNjBu7V1v1AO~oKumC*#nMc>)1ZC0`d$AduflyH7gftvru72xioVd zLLM`6OWje_6lpW7uWPpv-uTU~I?LBhB8HJae-ue1KaI>suPhRGpGHmIrtJhf2r$7h z=R-->`1U-@xP?mfUQ^0FSgXDtKiNqs9D8Q@VNWdYFa|p z4HZEvL@Jn0K*bdCvXMpo$ws+ulC~OJsvIs|wK(CS^T_wFzrdW`dn7Mu=ahV#k>VLQ zAFAW#&Q}g3mXS;>u*V{InH)H>{ytUIuF6l78@0P6jeQYy5=2wmKEsd40xTci=DUEs zlz-my^!NG)vG!bFoaYO%5Yg8R=^|$cFQ2xYn8`h8TB2Si@0dJjpT$>Skr`KhEKJJs+BMyI=&CyXo%E$QM<&B1+WFPp3gAmaW%R(vzm(ELUFQ~K;rgl8p;G|&?L^#1oc{(*V8ytP_)eu>A(;GE# zxMJp41)Xjnm7vXbnu6vuKt1KhX(ncd%9ASdQc5(~W_DTyXt59MQj53GTgq!NF&)0% zq===H=3IZdE_aav&@%&vCaL=K&{2E?4 z2gj(zS}6sA#P`le)3iOowB)3o>na)m7&wv{T~%)#qeiH=k{rwps$UV6G1t(-kya9A z)RX{i87Hs+8x!Ah%*`YQ_^1BKP;*z?C?9&~0{NO?at6e{&8Gs^aHeN=>3*u*v=%y_ zv%9*-nHxb2c(M$b*gAZx!&u8$bi8l(;V#1P;#C3o2#LFt-c%afWKI&+k9-gO-PlDP zHh$;Wgho3NtZiiLm^j5a&qr}$=m*+c8S*4nxs6# z+R*Sx2}eT3)qRms2fj|=4F4wXdGOc2W-nK@7*^vCZ)$iCDk>F!2k5k^nHS+@BR+Wk z(t$@nA=4-!_zFMVT^UKgZ5v3;MqU%t1VwrwJU931N-6yNBi?6wy54{Ab46g?lGAaL&v=t&9Q~MH}O}2 z?_+~90E@n$mA`k$7mwfi9d$8*-)I~Ds(dN^@TWXc-2g{C)<5e>`67K?6-ohUlj-V- z1)7R~DZtXY_-5vh!|)d?rl)bdqt;8uKKk|Ngt#d=xEXV9F33x-*U`tt@`~i3%fW`( z)Xk#fb)YhC`y|J!Z4~8stgJO3#$8V^Uc4(4%X+I@u49>B8ir;qL;s zVYYs2b=dug3%0t^!QXTHltwaclSjn^BpR+}VjW`R6JgMEcH6bP)jye<0iP+)$CNVv{pFQc2NnPSPO`ZIK>e;*|v0qxpJO& z(?6DXNx%SGVJv9ASm-ghs!*vc&pz6WW$gEl3lM*qiYO4zJOvM^_a`t_zib$d@`T*8 zHbfymr+!!qN@b}Nd511OIDOP6&u7942}mD2qKnO;9ucZOVCGgn6oBIpGQqD_&v7vh zxkg5g3)a@RiS(xg7-0`y&A_Jl`{$f}Ggph4tGw%CIKqU!g@BH8Vc8Xa8>arM%ui^Y zlsJE)?8Hep2+-n`MC~AyE2&340yKH(3@Jo)I}3i(5yPhF*01z>)p=w|w6EyFc^_->TWOk2NObZH zyg|v-BJ?L<;=1kKh84w!r+>Kr4m1irn@UFN2%=`_#}-6pw0j(sEH*H5Zj%fyW;0ZhMiY)}7X|s+fB*>Pl<2g{Jxf;S1u*C;N;tjZR*$sU z6bh%2jKLx+Su=BoK>?gK&BUA&Hd-L zXyh>35a5PZi@1{;aru*ht-Bz!AQ&d~HGac}SjmcDGSS$WBc@9ejoNi-jOjXp&oJA0 z>MlY6npr_M4``5A!kVz*;}J=G@rWKeL>zyUHilv+Zjkq@@N}W@Xh>+U+BiTcFJbCLnVKC-WHot zWEtdFuc|-dZ&pvJ^)NG#@Nq2}8{^pZ)#b-3gCg`M6Kw%dWW1|9XnL801Dmnz2O35D zWIezs#9O5m(j{{FoB(sVUqckl?Waj>Y*DLEt?gFYa0PPp*Z8ytS#HTE%%ovJ*3Q14NuGz(E=z)6+WW5d(#0kwu?fO8=0Ae_9_T(L zvo(KA7#cV8Ue!^$i*eA^WtF_*BP=`=ztIhvfRVweeF52NG3*&}Sb$FhB{SZ6=m$QwTek>l+I zY4zQyMpDg;lVQ#yI3`}Ev(Qpu2U8rK(If9-VLy$T?mnrAW0Bi@DD{7>_$NJDc>kHM zIZ_5^s3H~_=-iVoU!2NN*@~(l)|vxP>nBb*=;qQA&&4`PvzO2YN7?7rw7k3ak(*~s z_9r__W#k9-pM+WOxvEg-$d7o3T-QwAT%E``VSeRE6`Ie_N(L9EyWvHiq13lqvRV2O+L(egTxJl4ayLBWo>DX=>X92 z@ezjSkcUHrYPhfrd0}To|J}e{K$iU1Xf!=z4WyvZY(hJN;IWfRJL&E=WYa@z!@`4l8;2>5gLY zbNML_(aMh8S`g~D8M4J}QFH>cAr}Ju#x6V<+E1-UuTQt(P+{<20ZUKM@hqQUh z0H(mvnnthIXGAqfQjsH1%WeWwZz#jz@pO^Ivd!5sw3!cI&OsDDDb&j1Q0#31eGdU zahHFn&{$)KP7g14CEK5N;>Uq=hIQ20pEj$%aHUEp=bz_AVF^40;sW}4ShxQe0?;M- z*#z}+RBFs9_{@4!y#k9W(SfDjIVhUEqVjCYm>QGG0m9R^6mOH;S@(2JvM>-qY;jJ6 zt)hMJ_Bn=1s#yIby`+v3A|I2`N|;nRB5^ItjH)$xKQgCnthvy{j|p)8Wr^ zD)%Sa$2HnMpP#xCuDn9Rqj=X^wV~Eq%4tu9zssvCHc;~rf-YtcGC(V0DbOY4TRpah z@~neMcuvT(guum#$KR~62A557Q0J=(7l0l3`cI{?WLuz(lrJ`!<8=SvL zE*ju(g~CHbeZ%y*EjVXWZKy1lco;XNUzb?D?Bq^?gUc~Vv+?U+B~h-nt?)%Wc@VV)kKwk zDts*@UF=Y)Em!`>j&AazvcpotHoYY3-7Nn@`wUfrgix5KohWEUrVq|+eJ_zwcy>>H z>llCaO;9~&0Gk+9Jx|lhiWQRiIs{I^@BQQKCqm}rxnz4TVYi*=(+z)}{bVIc zS|l=5%D=qWR7C!b&@r7-D$50=&b8J#6te-E1q`pckWRAS zG87H->r-v)f5&NqQwK3s5;zcLqo^_>RU`LB7 z?4t=;-d#>H)E+XjYCMxQ4`nQ4kjh^(S$h~J9iym~qpa&-AOU@-;glzGeuIoJ!7b}(?83ll{qK6O0xXv*b^h-+D zB^}QQuRS8L$~*Glm6ro`k-6(8V$Ie#5Fg*(>%NC*f)f%dR*8d9O=U7yz89PlL%|{~ad5v%4E;JxT-C-8iBz;#BKaSRjejgG)WvK18A4rc( zlLn)5`MF|9-t}pnIIHt?(FI#BhFjLEpPSN(-($R|=K=H{vYDY=l^r_1*W)w=hLLEO z^%tFvQ)H>9^Zm)x2%$ACZPOX^k8M&htHNbu1Ar7_=z2opRg6I`Pxj8^i@IFb!STfM zc2MufP)$Th_td99E~Bx(I+lZK9I@@hp~d9TRzyZ_ebJ;OyI#BqaHcR+BPJN-xHd|_ z{nljx#nK8RE?5shd9ju&mE*(!&WR2C$LO>;p2YI!k_+-wu!_`+IS@4Zo-39RC-zNK zhPn6)HX+M&kX#k2*;El)iUa4OvCtD4zzcz+@r^H%l4+w3sNh{3_OoAI+y?k?oOD$P z3ruk^HFCgJ1Nrp>VdamU^KkjUmZBEcIY08Rk@RCOt`S%zQ*ImF`t61FM9i4wg|jle zYhn{UtL^| z;V3YvP}(BA+l;kx@jYM^BR$}s%TZ|~j5wyP_$P0-vj23XBRa9_`{05Hg zUS1?!JeF>8gOTG2HMeO`CNv%MP{8f}qi=c-UO0Yoy69q`67K)?Co*{&`LtyU4^Ztv zA+Xhno4vg|c2oUpdq;~rUw0)A89L%t*z{|>gODH@4S>4I;%7r8_ACr-@p=QNVt8M6 zd?({HUngok1mE}syoll4*t-kzfSI8!9|#T3^ZT!E9#!Gaon0`wAd#YItgPc!h|u|s zyibkYEd7sQtIt^2V?!^CQF%JE^f1}0ishvJoU8iCKdBd7RUs(W+>Y^NumvT}srZT) zK^T%-8c%gq4SnhoxU4XB_fJPefYGSM5yyuIwrcw{KmT8)1M74MrfaJbSd`}N&A_+P zI&SEXVtSF)ue;lrtWnKATxggOh)L*cSMP2$SoE5Dg~rVn*Y|adJE}lz_^cjGDxwCm z>(m8BZmvpj-U%31gK;_OEn-Yo*k!I?%ptGTP5>Lgd46;sUL8q(eXSy7x8t7`MC~Hn z?nmuw5p*x5#b0?-XhaxIl4AND-v|-=$FW29s1X{u90lH(^tehf0)77Omo?zF>Q2!e zj`bqHDL(7=1lMTF-nKm0pw+XF2T0?SKHnV1T(#Nf2G=ev{TK?FWc2QG3kTpYLbS3y zF6W6h)J;9G`N9f@PeTQr>GZE!)`nHS-)kDYzacH}j@le=Yb(QvgBu3RAcCEn!}gaF zNgwV4PC@$2qe$t)$=LGBOgw1D7e`Kjk@}Jv3M#KTanvC03}}x==+42eh=cw{2}{Ad zBy$bHW)PGeqkTaI4m_lNO~I;pcAlCMISVF3B%}m53GIlo%7&{EpEtY31-s3QDkWs_8JzANi zmPi(8mnl{ao#6-_l{v!T)oSIt3x%U#v^kFX=iFfmgz_AxUBSu{QXAWM@k%eWahXV9ohV*_xSDa7jY-E*KEr9cN?)PIL9jhQ z$A?Y`2WSd?$Xf~Me65TwaPC=N!c^hGSo&8MS|zXeNE!IJoFdcWE3NOgpvYe{h$8|310%8 z^?kIWgzN3LTet7yVE~RpNrz$r*m(caMGKBpI z9gK@>1_^Pyj4-&9A-de$-)(>1XC#Vf_303fP{$BVdt_Py8&gG9)c_g?vkix?qLa__ zey!YRo?bWWa6RTjrD9q!XGx&T=ZWNa1-#QlLiatOM;5TL;ljS4W+W+oPNPCgC z+V}uR`uhl(^LB#wj3lmOeIF0Ede>zl!;uqPpiSI-7mVb*K-O-tACb`yHw7^oZ6QJ;-X;8e za=jrL>UHSwMJ4}O0aL&32d{LS(^w4J^@bIZ&)20Om^O19fO57*9HeT4eV>rpSaS2| z(8bWkf^pe(AWr5YRgGd}EGa&D3*8c5(g&jm5r~hGR3b;ZpTQ(JoItj|*p;`*k|2pFEPm{{w0T9PFtP;4t! zO&&mw8kn|Lc;4ooch}*^4yKy%nto_X7&XAruk^04=73LL4B+YEoU1tJuyi z2iP$lzOwod8CVs}$}++SNeWp_Yd2{8zE-*e4*UtZH~%E%U|VG>*s&uSZZ4>4cfN%z z5vQ5{ead%7H|(!HD}>&S-zw~0usU`pq7AV6h95-XKnzS8H{vq*=Mc5S$*OaYTQ)}S zbM35KvdQw1xNP7{&rL`mrIa#{%MVJ2SkL_U_B-#@k?k~Q{ohyhO`b*j0 zK$gr9)e^UpdNK_8iJru2ynbp2&WSJm+^DOB6HE-y8A17E^aBR)8%yZ!<;p9(I$XOuY#%vQv;LMcMFzD8Y1*}IC zTJU~>_&^Dl?-#O1dK=%Ivx6~VPBm1mvNXR@j1A0Ias%id@+iAgN$$0CLS9@W*{>~! z32g>sJa3o*-r4TxT2_8qw zrBDN)BDNzwk5nP?Sr~8sP$av;h;_T1kZ+MNKI3=Gzq+S8AxRQG?F$yEC=p(mg+|y? z2Gp=w--tlBUo4EqDRu{muI63#+WY#0{a|AjUh$xR*4Z*FNM(cn*LQ4I0%8qxM^n_U zx;-|yTn&r-h5lv*=cy>GA+CdIvtN&RutdCLaQ~rQd-eVBro2}0^>%H<#71JvvH{l$ zvD)=yl_%aCz3liN7d1J2r!;RVDZ6~Q-Y`LIkf?dv3V2PH7vzZ1yc(L;TM6@y_^U~n ze2TCLR(Xr4!AMg%XJIcw2PyI64~)_?P{Vgpa#B$vbytD4p_L`@xrA(Wy9%71fAWJi zj;nX^5bF3@UUq7w7?f<`4}29>uD z&CCOT!YG?=0w7ixQ!WnRW@wEosZXo;enft*!8Cof>J;nx7cEgW&u?PA$RR2A&ISP5 zBGTpwlc-QCSp+9i(BlD^33Avw=EI~;qX|~=a4*->Y9jl>Hv$AbqFk5APiyRIINOL- zVI{9u4e&)Ad}MuK)?JXStYs#+k*<8q4i_ zOJk{av+PsQWLD{L`kE*qj-`-SuGM>5IHvfo(9UFqgaS8wz0YYI^?$wdyUT)RV_3*? zRiwXMaW@SQleV1YJAK>fBW|+|y5Sq^=|l#6>LqA5xC}crye+;r_0UD5m0;J-SNw=} zT@p*To?(Q&K*0#ox18%08g+1Tl^b!BM7s?RfCf+)JQ%T6D@t-upE*>(0L-fG6x`oZXoZK6ml<@RKupG#)$}OZVXsJJ|Y-;h~WI1#Mi6dKcoK{-x3jWJ&q+` z)+6LXzGn&JH#y2>8#yW5(4%QJi)@J>gQ`bPDAqDisv~+d$R1Z=iw>T=sJJUz!h=?# z6Ks8nPN)XiJxza^QgL26*SPQ>yyD+GCPpvJ*;~nVqiI6hjQW}`$u8Y^_ltE!4wX2s z%_;aL3Fd6-->PVL0be%%w|{D+qJp$%7A2@Z8#Q5)elbyT$g(qi>T53?Lqw~@E1FQC z0(=OgDNl{48F{~AJ?;vb%6c7$)H0q5^qk%h@&e)Kop|2XQ05w z!Mq|QxW_%Lv(iBNz!KyKQV7~pbeYBHv98d&{2b8>oIJ4lEdA8`7&OpsyWVUh6XzgV z=mx=l7pd`=$%MN&c1fpL%xxcF1FlN&48>d4oGBv@DGs?%I7~j?|6X<=+%l`|4H(<9 z@i9!f>ZW-6D5?7kA+MqUY-LC|vXG(Pf90YB2UkO3EO563o4ZHw#e+B#Q%qnJs3d;x z1!31=b_w48!YlT5D)sN`vm-_aEn=Pv{nnz29Uw=#GA4lGiCJo={rGcM%ZsYPhYWFf z&p+a@fNFT=%wyKZ$P6P13oc3ophjBQ=2v@17H{Hy7Yq+90f@t^5G?zlUpQ--)k^u& z7cklOkaQ2^?GQ{V7`}YWyk%Yax1!2?AmMwag$ZQfg&4d*-&GUMN>O9y)vBiX={DYx zt`*4RkfVb+kl+{5mMfrkJz*jS`o-r}ljKDZ#~8+>jW(vX;T%OzZ6>?*Yyv6EqYAOj z$qnGW=7FerI}rI^KkIEq-POBK>AvSx?_CeYwwkhf+fV`sNxod8^<$dadSs()A++{U z7kVzEoeaSK`()EXHyQ`b%tyD`>1`IzbyBjhJhzd$z-bSRd2EzVs#wq#7=+Cic6F`> zzye|647L;@7hrP{{%w}sikxtd_a{G7Fh7@L^dYaIU|R2t0V9w631#)$F9OGaL@E(hI? zCR8=;S<|w@jULyB)ORatU|o#3AKxI2@zJ8Le%JPV(C@8cm#~li{BD~gD+M6kn!-Fn zukg@~#{sGC{`*sYHrj3;gRy3i;PL`o;89yn#c{wSFsfkP4jyJ3x zK)8dMi=T6fezvB?Z^al$7<=GLeMhxOIsyM5-i+d>=ntx7efX0XH)s}dswV7lV) zd2O9mWM%XxH0nAiGU7hkurHFu4d@rF7q#W7c11f&(`dNGcWS{bX)=dwc zWhN(}Xi@yzz*zlR@u|X}|CCErbfr^?IvFR|9gBe%K3!Ju_FI{cT~VKJtBzZewaMl^ z5dtuRAoq9=2mA{+ESu%LgUMFd%ZL;G?AFdGWZYeCglAz$~OdVaDk> zMAjiglO{XOA1sqZU-tq%b-qdEKO_8F6gHpG zld=pnDg#NmA{NLb{6khxh@uRs(h0SiyxRcN+D`LeM1>_Tl4=@F#Ec71p&t4Wi%#kH zWt=N|YIX~C=MNb^WS;|+VSptm1aB#pqmedL$eDj5dR7rg_i!uy3`thX_&w{lu4s1^ z$V@x)0yJIwn;GAM@FMT@NWP;=vD7KO$RqCS)S5SV=wedOEYe7yQ9m;Yup?PMh*Nn# zzP3~D{jR0h_TW?OSAa^=H|@%PY*E}KL0CX^sI)rgtqVw-MFO&K55X4wCA5QpH`Ts0 zq`8hGY3*nKR~z7GbLQ$qm**Lx8~--*Z~97mg!wP|b64g+e&|OTT~w8?N?RcpbRj8zm35DI|Xk!X$Oz+$)6tOZhu3T>;-;X)Nxgzfth$A5mj&mUd2@WPL=G`Q^ zsS)qKzT3NLKy)!QJbQuiQsNGTj<&-&9?hG-&NR7QkcitweGB#E6oW18$AKAA>7>k8 z^*;uZe~p+C-an(Z`Y|#wq5G`Gp`A?!VTZRw&EJ2EJnX_AN4OchGuA`NWnW@E8Wc|Eq6mG>H z`W!9ugicIKIgO2xUhbQ~>mNtIDatMWo3d@|MJxx%`9SGd7u9oP<7Uz+U>t`+W8=+2|IJNp4EqxVnN7vV72iTj6$<5Ll5iw1&(1y=;vieW`?Lf`w6`C{VD@^$=IYj?53#W!}OH_Ivv7P!0nKpVcxzo`vIV;7s z+JaUCzIF5J)nesyOpNmqo#9`mOIhmXFNaK(%rqs;k*0!(g|{Q%$|;+Tiw6@A;tS)N znB2FROq03`bF2;P2NlwF@jF>4wcM*PF2Vr{JKJ&|8Qm#W#THTm1#KGM29w|Y=<&2& z$!2nCF0b1`g%eHV(?v#G_BR5zK~|p+;6{Se@e}o!XqB#~EtwJ=B&Un`IQysA7qP~RGmPKf>QgSC6Y`@ z_Vhlm)}$lWf%hXu{?v{~c$Yf4|P<0^Q*8T?U(UmJ%;bYRHtLZ4L9~KAGDa` zLi(Ql1rvPB9@KNU7}yV2-@^9zx&42w(!{bh*ueG%g3+dY!sKUU})>WSoeo|8I>F=XHnu6Q2lAupFXBkUoo;5t|JI(gFJ=2pj&If9M#b%6_xHR)ANDtpUPWkuD({0U%)3TpbN1c&f@#CH%Psta6E+od7#M2_2le`I zz^E{RrlXy^Td99w=g>Fxx3AIw{h1VzecGVrZz?HQg`-UkR5OrWgphMk6x3yI1`Xfr zF+BJ1*b}fYOY7`6LizeE^Iqb1$wu_IQD4~_Syr=|Tz=JXbfi#D#aQs#vj0Vh*S*(T z2(ZS!z~RgVl42h6pOU<9ss>8^4v2Ucum4X?e)At7`JF8NKP~$h<_+BY)|2!*JmLeD z?2X9X@$aGXp4gLA_%#11l^E!rWKD4= zk4)aC>inkMD(ni@KMnCs5+q33h>=5*5EIn#u@kN>qBcvW&~a8hsKea3qf z!LNF>#=}0?z{!cnk}@SQ`t?D#>(Avo`ykr|G<6E9EpmF z9a6)IS;O&4_-|TVJNb&#eNLQ;Hii!c*Ei%fYvoHylwvOzS;athODn2?orkUdZymp| zF(N`PeddvB!Wlm72G+i60wES2TUv&nQ9UlFcNwtO_s^Fo)a$`7SuDU*&r>V_B} z+oyj{E9kmPiJB`Lb8}EuAT{bbvb&re5v;J4K=9{53uFV%F_Vi5J$5;j`Sd9|jFcX= z2co53_m@=7xYS;nr)+XGuTuMVH$oTh1&Ud-a>;W}+K7>2ak@p#H2GTBgQgDJ{aRji zyN(F2I{|Yh$WP3$MFvEaLH`>~NR?-;-gQikbEEu=xtTMIj_zXk>g%#s!IqQB(^e00 zKF`xqy0K7_e4wSbPmR)3RqRIP{lB}g!KR6EBfDp&>bY9sYTJ5t;R^@9J3FNeRNf;e zMZ;emOXpO&n30*MPb@A5no3)zgk`RT>E`=rbHa4TRf400IA!@0M#ZMbSHKS28*M0l zNDCRX7#hzC+}HW=;eEQjUShw9ZE$M5& zK6$>%lN!}sadH5s1+-o+b@pQzx~waIWM#cqM5V{nDqltazghnD3a`FgIZW2c#)EpJ z)J<02qrl6ajF9uARea#B6sm*Zqbn1cCZqJUWy)}P9dPB(?!S{Mpe)nSzs!Ff#LWz( zEAa^4a!jLVVmUW&vc;$11rjNjGoYMuZ~)ohPG%&QI*JQO+5l8>!#kq1?P@vrzAxp> z9=B&&nkUJh3U-`loK*Ak(1F7ZIkU@FyCSd=s8ID}cGFZ zZcFy5>W|2SO>t%pZ7aD$U>%w`v%cMJ*#4jFMF(}Sh2&ySI%Z%Pf3>LjHeRlQR)Ivk z1E|DIQzI}P%44LYmLhg$NYFk%Bt{>Jw_qM{AG^11p1dOks%n=}=YL`I%dK_XTR<%<4t2t6{f!) zB6$>7ngiBJv<+AuK#R zEu}zqUsVgBS7$;W+iF5sbt+=j$a`49l1CV;4_Y2nzzr=tC|#1P~gRHL@7+y!P4yDR$w zuP#%LirqTJ0Xxe+cG*v!9t6n#Ly3io1&^vvhG7(fqn+XuGjA5vFA&ghl4-ar3Zo2z#y6?F>#?`xq1R*qa zCZwYI-=Rg&RB^n2!W7G#8rf?FsRi?V4K~kmCs|jCZ$oOudT{*yFFZF+WJOs>2qh&k5Stcuxp;y)YO%^XQyTHDCOt^p~Tq(AJIa3AA4U-Qq+L{fG^NKDFM|pwQf3f7=iC;L` z8d!mQXH`$7?cA|-F61z+9vwc7?l(aOQ9rYbSjE+;(<+vhBuRZYJ>s=Jyo`Z zWy14pv}sJ_`0A76?hiHx6)ou+ck4QHb*ZQ7|2_>SFh?Sp-9F@&0VV=Sb#H!2=lZ`g zIp0^(J#mv*g-EZfRvA2Xn&xZBc6IZd?{8|s5N!E)Ai?<8&(l2Fs@OBKi?ow{v_u_s z@hyi&d~WKTcU{FpN=6lo(>Q;kY1$P!4wb9bel=q}j*BI&I2=XBz9ypi6iR}}>pUcu zyQp^UV{RWgkNG|#k0vj$YJe7?Q=9qd&;0D9WNN|hFV^LU zA-bx%Ar*XM;`vXBd)=2KlVj>hFJ%$*s^d9(2mjXfglRbaIO}N#$?fcTdl|Cz41eI7 zioM>X(@B1ktQ4BlaK|}D8GiLx<=Bw(+=?L;w&Iv(>`M z)<_Mvj|2_)ZnMjzj=febqsC6HjvMxi)vcGyBdFZ4qTOF2N?}6PEQ=}lh0XVSM4hIl zh(%aVCC1mH?;p|s{0XoP^#HuB1mw5s&=4@IZw3lO4=#c~i3Sln-Eu*5EA|{7mX*P{ z&-%EBn|1>;Y8o^>#m#T<{t{T&*pM=IXz6XxSdT+U$`_k|%(OK~Ks-Q`|8FC9vThu} zaKi_^ZCPWExEy71UTQN#^z3do1j&iHBbF7J%*W1CY$SJ|G=!%8ntj$rYjffCeFu%# z3utTI&v5hUiqf;j+sSw^Z8WH3gY;N^C`mNMUlv~eAGY!KF2+r*>~B^ZNF@D5#0n7r zwhL>uF-zMUFlTj{@Ig8ulA#NI#(opwjSU+cJJh^u@CqYrC+h1+(oB9z%Y#tAOvAQ)CP)3HZ(>tv<3E)e3s^%6#4xC!+bgUK-o0?!_Rc{Ob5j1 zqHqnE3a1{!_2nGVR7D01v}|La?!fpldH(UarIVe2jrsl&I!_Gfr0kbOFc8Z`@)s}W z%rOcVzNk(GJs$CYU1!AzB+0Znl`e~0k_zR4az&BtBU~&Xj&;?EpwmWia)p;|ZVX@s ze}^JABa%d|woE~}XCYAP<#+!?b|(3al|Ez;FVOkJx)}!Gz8Pg&J!0OB&ba!cfKBvh zf91>+c^|kYCU4=0D^UcBwK=`gBhP_@8A{WK{8@WyP<`$R0pj>O}9wX{vO_Sowp(*8n%Q*8HQSUfmAy zmVjq;>!G{m2lX8CJDXB?pr9v2mkOe!ExZ&`D~9meu+*Xbx@&THl_rp1XvTe~kd)io z*ErFC6__4&i+d8dVJOS+rTIjd~v>?L!qoa1vnfz!J+B*nrg=D-Kh1hWh zJP`a|T^EHs5zerJXB>~4E55@x13vbofNOO*O-D%))q z4YbjCatpRxH7P&&^jQU@pnD{}g6omWd&_#R@~riHO=^@f_1ce}m)iYe4zbQucb)9_ zGCZPrZjPe1KFc&GNTD)iI)3|*@z~(YMI$(6Q3|?05J5Q803Q4mDO25%kvH01bld&1 zz-SwY^FE&;W$*H%kv_s{7U8bDE|>G7ACb5%zLlw66i{WsFZ)-u2->>Akt+MlgX)pB zYeo_jY)cM;LRS!X&44S6`1%+vz?r8Fsh=I!2M>)YJS!@}We ztU7n>)ovlms)?4q_+p*h0>;auCKFle?$H(Li15u^bD_)&0%t9o10WlKoZi7o+|h6WbM7qK(BB65L}@2HLcGgLk|$Fi2FkRKNX+(ibc z{v$S$7RRe{negc%>e&+_tjr6ksQ=}I(}c|VmoL}RzH0BloxVnqYd76RC?maXxN{Qm@Q(s@nF(mZqj(< z8^R;4O<4937)bifj3ZqkuiS?`jWgfSct^Y)Zi=q_DCc!pJ;A)is19FShNP=2*0W~? zR5m3$*2>$JfT7Gk^Q|9c4XZY84&&7y$mjP}M@GH*@>co1;vjzGus}&1N#DoMfJ+ZA zK>wDkA9e25S?p z5{>ZbyV=^m^gN?L&^cl9daqt)eQ&j;1RvZlYurDpAOB!)Al_a0DL4T>GfPj!^<=4c z`Xv6=wJ4~KQS`t&*@V>l;q+pPJy?yTFVoBpge(^4ol(Yunn_VEPx66RgN-u0_2h4I zXOZxokAZ-$j`DQEKsS9yFn0*uL|si-%;8T&*k5^h2C0;7V(8RIa?rO#K|CMx50dax z&IOXY8KpCoYk5S)9j0x9eP%w|#|rPQ^7AXk4*7H9yAQJ%iSa>%BIOwVzc5cSkU;V@ zTWUj9H|aDzG?pEVQHt}(+=T64aZ~ud*JrPMl z>M114)FUA=ZIr|$N!e~K)-XzTZYq_fsKiv3NkaBy8T;6?PmFyqjAgQpF~%%zy!SjE z@9%f~{`9{$)P(G-ct>M17H&AsNU4di(Mw(Y9Tn< z!O*(7CWUqH(th_m^%5gf{6p}YNWQFQA6ikb%ZB(nZsQ>FUw?cYDrc`UH(k))*6vwj zyI}S89~{zm#TUNs45K~r;A6nihf2Npd&Mpmn75W(11>pEAo(4=W_*O_;2D#H$ubj6 zy<|gHFRtno{3tDLTb#XBJ*4RMa(@gU=-6$tVjkZ&Lyio6+pa?&LGSGNkY%MXd;C%) z>ZEyV1oBm)gD0l9R?G?fATwu6t1tB9F{{4g?Rws&(j+;D2K76R&~*bCm*K)Gn>g+E zA|g=owUZwESD?q6xu$KyxZRKSJ)%!X)!$FutpPfQ&@7D)?vLP2wz|J~@btvc_ZKgv zwkyqXUIr$|q|Qf&sMmIEY2R(6F$u>gZ~Eu$4q>Su&NNGI&|&@$hfytKAUl=(z);7dP(E7lPwU=m_{e zM#by5?}kg9XCB`gv2EKEr$b|R&KdgN+M(?F{>A6bafPAhEbqide_CKXGPTU8xfI!qo|EB~|&d{fFf8@zRl8%1_IEZb=*R(pU zZx=cUTJ0lDjfprWX%=qrS>4WBy=NICj?ptRx{gBBV|I+=7dg)^ZMZw()AcGvp+aO) zs61hlSSehtQ9zWC6G_ScNEmVct#sJ`&Qgv227|J$+?polN1ApS`G>2sGlb)21Ff9d z@O(zU6KNZ`P9Dww*i^}#kG!}?HJRbF55XXJaWr_i$;9(et_~xzLKwywuH74<$Oo)G zx|uI9itOA;#A*4FX|Hx8j#6Y2NO&D+Ibp`$r&&yhE8-t2YQ@4jS2 zd*yqc6#g$$nGa5r>ES`zzOKGbJH{PpFo^j8B6%5-)Po)-~ zn&0PbJfz2PANF~%k*|od=~>!ls#e$Xu~~Q$jm~uW#1Vk)0aM5DTsz()Ih@ptbhBg# z9wsEO#dTbIZAVfX@X$+=|5xlR2^6__jZ4p}B>%&;*Eno@|K64@iNw9s^lzmVaTB4E ze4cwE0Edainzhxv`fFu4*Pj!Tg+x&*BeXQx(|U<<98~dwEofwgqmP=-DUu|;27Z2E zj*MWi4N>Sk$Ii5o0_5HN{>bRPwW>RXMdrdA^rU|$Du)A)=~x(|0v+4nC9}3rJf3tT zhWZQm-bd2iWRM^reqhKbqio~xV)g>4g*1t6j=1oW`h@DLK7Xdk-$*XOV$VkP7vG-Y zvUkfU(0kE{>I0ZR(#zg98;#z!kQT80)g5QsyuUM5(rUAn z0*DI3jn3h<$>&wY9vV4mOE*o`ie`ke>$FbzYIEG7GHLp&qSjK0YxT-}|=v zIn$1@v|YLYDl#)%(?@|;_nyqhNm@G zBpiYD3Dh;_`9Vz|E#tS2_ld8jGClf)@t+8ulBn!(lHDB9C(^AwNhCmvAljHWYnje; zq6|-2GP3lzN|qJ1ywLl4wnG}j(ZJAF^y}u?w~v3RI(isYh!MW9BWRiR#0>>{y9UnV0NjEE|VEI5w>T;{nAG0o>tpd0A|N{0$n1rm%h zr3f=IK$q^&bIUwjxTK~z2my|V5yj5pmkR7gc*8;Ebr_4~wXbdH&Tw!4e$ zR!3TAb29p}z4CAd5JHqNA4wVFlxCIBMgpJRj@|V4b}G1>5M=hwBysmM%0+{lP$^VWm4995KP z%$=#3(;K?1tKi6+^w`%HW4YJZUim9%;Y$}aokr^5u~a{KFcl1bUSXIGX635MTsrAJ}rpe{qd6Jc;oipLMjY3WGCWf-k6joI)KW%R5 zpE93}`5!=Lru-}G9{t_?;6_g4RBFAyeS0?B6-4_%ryIXIk*e>Pmv>+;zk8wR!;{o4 zSmU%O?d%9tio&H&wq>*%gRxOu31poSww_oH86`4EwOKY6@lcmNLwWt&)q!v4WsLvz zi+c_9?yeiHoyv-h%Hi$iVK`2k@QI)Ea&Js*#4S#@J|+bJo-hr@(?$cisl-}Nj*P6^ zNcRM7KKVV1r-0fRbd(MUrYC3($lLo-53hgQFj7u}+9FQ2Hf3#R2%UxY&xc}j>Cp*t zudeg~rliH$tjtO22C{Cp8}DhzTf1~$)&qT_v%9Jc!*3UfFa?rz2%n=2fIS&w3H36No z_MMPpO7kjxbH?kQJ3V${k0xm&!H)o|P|y9LPgt+*L{&$TZlzK7K5dPxS^rZRX1Dc^@1;FenLaO)BZX4z!AUHQrC-yw5PH35$oT;S=BF!4@P!e%VyqttAn8SRa^LS zb8|UfN#PB5$BFfC^;RdI?ui%GIf>gP6FCelk1G!ECVd{(^LseGwA@rWvbf|>zHu;W zk4fO(;ra<$PqWfB6ZN75*RU$TErP0M36@g#vs)%;jYei>4w=0ZG>e-?AGwP^kRvna zjLc$8yfsRvc3m^K4Zg}Z5Q=vro!7r=F%yAvbA0M0oaiGz{j{XA?ux_xyL}P!^p*GC z*}2ahOJr0ca3^)>6^hK7MFj=IQoul2fJ7x(W)qh77^z^x{QxW)utmpsKcV+sbOyl2 ze7k?^X6?72!#26|+u*5*V zLZpv%V`idpiMRD0^#yG#y0mWems4;@7tVx??^f$Gdr+kKWz$7bk;Tz%_Xd9avKc;i z>+X|VV~-{NGJSLOo3+LaSLmEu<=(8(=-$DdE|mp+z6$<~mF7FRe8Tn9r8xb` zdQ3L%1vDuF6wPthMiC+fo6bTiGK30tU*$}+7JT=*vTne4_PNm=%F1Q8ELdX zF}-T*>YdQ!VWDVBV?O6$!fVDghsf^aGx7RxEJCC^|dmxA3N z!l}hs*Lq@py7j}@0Os1uGFZlgr>GW?Wa$J%`*}L{ofSM+h)Od8mftQpvamB<&?!Zj zYQGM+kTm#dK5F*$748X^IXZplI^6^KmS-~#J2)bs5i>k;fnqzOR@Qq2SE*85`B*v0 zs2r__s$h}4|0Qq&q(vONPsqN0Y;b61_NkjHchIOI_}dG3mEgLM@H7!q)mAIj^qoh(6uB9{q^u^ujLk_B<~7e;X*KZb^^{RHy`qD*VMy?F@LA3} z1t@?q&li2Q0eza8Xu(|xJJQ2$NyTqJLgQiHcNrL3uI8P$_uP#?jX=!pLuJhBlzy?Y zhL}DPlW1Cd1axZtGgh`-du$WJj>s{@#x5Zn2$iyft%Jz-4u+P&mMag76%o~G3>}~I z@eq%xYf%_4GZ@rDk#{EDDNX&rhfNCgbGZFckD=k{y{)BwMDY=Nw0K#MT81XbEuQ1`!nfLFcLP3HWz4_S9zzG-q(sHhDSz5 z1IIDVWETiroq`(P%3u_z~_|kcoCya`h>!&v~`L| zYnDIjYF_oo<8?7H^%~>U$@g&q`*XGUMi#}0*&cx^4R*UgY^-|}tJPFCTVee$v)J2* z%}k+b{ZZ8>OYecnvXpiIuZGUK3BMFYQHbgX2T;yH3^i-xb4k;rHWGHpvnR)~?mZl@ zVXW>;vVTyX|NGrAU{_Cok*bn}r|~-VY3Knj#%cIny#e&KNWb07%PXGVbA=DkVMhGi zE-6@|55pYQzd=Mu-yslVYz5tfQJ*%dDwB{A}KAg+nDVfeXk|6@$@M0_HF)9A365Z45J8tXm13k-C`X7 z9_A)niqH^AIXNzg+b1bm#L0pEBIH&C&aZw4EZ{99$SZI?{0e7@(ghpu!5cV;QLiu@ zSRJ_+wRVco{1e&n3Rtw=!dKx9sE`c3GtljH%4Ap_cm@3SCT3@s{*f?TN48dWUOSoN z%v$aF?YLixA)dnDpt+?6HYV=6(@~UkAFAg%q!b4@@PV47N)F9sB)Xr9Sy99k4yysK#SFf%`$7QHc78x6B3H35{HzO*JfINoU_=3;JTTr7b zdynMW)7hlEt*uvo=0(C(3_K%OO7)@Zp0DTCrffi-JmCbMYkU+O&kk@&0bFLTHlVWu z_>6qug|CEjZ8|4XSR~7aVOfOk&>D7If0@SuO(ucfY^}y>^9N2&?=~G`0#9|LT zkktbl+jrG;@^^Z&_Yll$YUuNRQ?GZKMF5Lm0J~xJCS{rAspfmRxAP`@!K6qs~p{S~Q`0%}kh_<$b`<+$Q zqj(j)w%5DFBXLy=&U5UYvTMtpw)N`6F=p2v6^dmlwOtn1?#>oO9Q1!xcHilyQ>76a zZD_I={ZChicjsPRNhz|;t8p6zIl}Q2+`3(gDa%N6DSgv5>}JH-Qf4)Z)5%T-QvBNFtCPBP@$715GlxT_vP}J}-Ge5v;5wpWnc?QM~;Y0lSnmRbqaiC$E+rge<1dam?uz zH(2o_+-#;M3$xwsvfZLEVufK1Z5`8jkA&4gu5zLjb7Zps-&y%rg!hDuU^B!80W%>1 zJD)@9z$5Nm-mU^<6^(m$)iw%XcOzx=W_jk^_*JYJC-t!?!dqO3$r!h;N~lT;nsmdi z>%1gUv3iez9H1HaO|hJQtt5&PI?V`y zoL4O6arzrVH{k-zaQtS$>Lj?F`hm=))aA(m$w3QQ-C)#-ptZ4r9178zkN~$6t$tJ8 zeHPI_PO%0()k% z&`BvNG(U#4E8$eIQb_RCjl(_&598?QX!$@4dHJ8ui`Y7T)m>sL0W5K(_`Md(D< za7$HS6okt$UaKr_JP#|>e@PUP`(>u1JS|Wj9tOY?$PJtat9^Sso&!5VRG(PwW_prR z^F9UPrMoo40OkZNvGb^s#9txpkKEn;=@dMA^;9E90|u&mV_64Lk{kbaeY8|N$PIe5 zwwG(QR}^7uIsjYer{2 literal 0 HcmV?d00001 diff --git a/docs/guides/images/mediawiki_4.png b/docs/guides/images/mediawiki_4.png new file mode 100644 index 0000000000000000000000000000000000000000..d27eee610c0529b431150a1402e88d48729a7d80 GIT binary patch literal 79224 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 F~a$?J^nkLCz?C7agC?RCS^^SNO2n*Y(XZ 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

  • )X;Y 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�WZj*i!- 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 HXC3l?QKk{T literal 0 HcmV?d00001 diff --git a/docs/guides/images/mediawiki_7.png b/docs/guides/images/mediawiki_7.png new file mode 100644 index 0000000000000000000000000000000000000000..4020b544e15cf3ad5fd02555d68d72a386e0a12d GIT binary patch literal 103162 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

    vnWh5rl{ChrAg?k_h}c6d=<52gUr& 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 literal 0 HcmV?d00001 diff --git a/docs/guides/images/mediawiki_9.png b/docs/guides/images/mediawiki_9.png new file mode 100644 index 0000000000000000000000000000000000000000..10cb620f92db7bb670e043de33cc67c42506fbbf GIT binary patch literal 131829 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�CVUW<(<}IB?%cgl84U;M@f`4Ll_DUGZncnBVv! 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

    %SB<`_SszlG>?a@tk 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 aB(J{sIX{}T=edFZs3~hJl|Qq5|9=4QQU*5w literal 0 HcmV?d00001 From 7256614b179645e60dafcd122f5510ac85c6ba00 Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Tue, 29 Jul 2025 09:16:27 -0500 Subject: [PATCH 084/164] Editing `mediawiki.md` (#2807) * some sentence simplification * add some markdown keyboard shortcuts * some (very little) passive voice to active voice changes * a very few replacements of "we" with "you" --- docs/guides/cms/mediawiki.md | 57 ++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/docs/guides/cms/mediawiki.md b/docs/guides/cms/mediawiki.md index 73ac433833..4396056812 100644 --- a/docs/guides/cms/mediawiki.md +++ b/docs/guides/cms/mediawiki.md @@ -1,7 +1,7 @@ --- title: MediaWiki author: Neel Chauhan -contributors: +contributors: Steven Spencer tested_with: 10.0 tags: - cms @@ -9,7 +9,7 @@ tags: ## Introduction -[MediaWiki](https://www.mediawiki.org/wiki/MediaWiki) is a popular open source Wiki software engine powering sites like Wikipedia, Fandom and wikiHow, among others. +[MediaWiki](https://www.mediawiki.org/wiki/MediaWiki) is a popular open source Wiki software engine powering sites such as Wikipedia, Fandom, and wikiHow, among others. ## Prerequisites and assumptions @@ -20,7 +20,7 @@ The following are the minimum requirements for using this procedure: ## Installing Apache -We will use Apache as the web server. First install Apache: +Apache is the web server you will use. Install it with: ```bash dnf -y install httpd @@ -46,7 +46,7 @@ To install PHP, you need first to install the EPEL (Extra Packages for Enterpris dnf -y install epel-release && dnf -y update ``` -You will need the Remi repository. To install the Remi repository, run the following: +You also need the Remi repository. Install it with the following: ```bash dnf install https://rpms.remirepo.net/enterprise/remi-release-10.rpm @@ -58,7 +58,7 @@ Then install PHP and the required modules: dnf install -y dnf install php84-php-fpm php84-php-intl php84-php-mbstring php84-php-apcu php84-php-curl php84-php-mysql php84-php-xml ``` -Now enable PHP: +Enable PHP with: ```bash systemctl enable --now php84-php-fpm.service @@ -66,7 +66,7 @@ systemctl enable --now php84-php-fpm.service ## Installing MariaDB -Now, we are going to install MariaDB. Install it via `dnf`: +You need MariaDB for the database. Install it with: ```bash dnf install mariadb-server @@ -79,19 +79,19 @@ systemctl enable --now mariadb mysql_secure_installation ``` -When asked for the root password press `Enter`: +When asked for the root password press ++enter++ : ```bash -Enter current password for root (enter for none): +Enter current password for root (++enter++ for none): ``` -Say `n` to `unix_socket` authentication: +Answer ++"n"++ to `unix_socket` authentication: ```bash Switch to unix_socket authentication [Y/n] n ``` -Say `Y` to changing the root password and enter the desired root password: + Answer ++"Y"++ to changing the root password and enter the needed root password: ```bash Change the root password? [Y/n] Y @@ -115,7 +115,7 @@ Remove test database and access to it? [Y/n] Y Reload privilege tables now? [Y/n] Y ``` -Now we will login to MariaDB. Run: +Login to MariaDB with: ```bash mysql -u root -p @@ -129,18 +129,19 @@ When you are in the MariaDB console, create the database for MediaWiki: MariaDB [(none)]> create database mediawiki; ``` -Now create the MediaWiki user: +Next, create the MediaWiki user: ```bash MariaDB [(none)]> create user 'mediawiki'@'localhost' identified by 'nchauhan11'; ``` Grant privileges on the MediaWiki database: + ```bash grant all privileges on mediawiki.* to 'mediawiki'@'localhost'; ``` -Now flush the privileges: +Finally, flush the privileges with: ```bash MariaDB [(none)]> flush privileges; @@ -176,7 +177,7 @@ Enable Apache: systemctl enable --now httpd ``` -Now open a browser to `http://your_ip` (Replace `your_ip` with your IP address): +Next, open a browser to `http://your_ip` (Replace `your_ip` with your IP address): ![MediaWiki Initial Setup](../images/mediawiki_1.png) @@ -190,13 +191,13 @@ Check to see if the PHP configuration is correct, scroll down and click **Contin Now, enter the database information as follows: - * **Database host**: `localhost` +* **Database host**: `localhost` - * **Database name (no hyphens)**: `mediawiki` (or the database created in the **MariaDB** step) +* **Database name (no hyphens)**: `mediawiki` (or the database created in the **MariaDB** step) - * **Database username:**: `mediawiki` (or the user created in the **MariaDB** step) +* **Database username:**: `mediawiki` (or the user created in the **MariaDB** step) - * **Database password**: The password which was created in the **MariaDB** step +* **Database password**: The password you created in the **MariaDB** step ![MediaWiki Database Information](../images/mediawiki_4.png) @@ -206,17 +207,17 @@ Click **Continue**: In the **MediaWiki *version* installation** page, enter the following: - * **URL host name**: The desired URL +* **URL host name**: The URL you want - * **Name of wiki**: The desired Wiki name +* **Name of wiki**: The Wiki name you want - * **Administrator account**/**Your username**: The desired admin username +* **Administrator account**/**Your username**: The admin username you want to use - * **Administrator account**/**Password (again)**: The desired admin password +* **Administrator account**/**Password (again)**: The admin password you want to use - * **Administrator account**/**Email address**: The desired admin email address +* **Administrator account**/**Email address**: The email address of the admin user -Optionally, you can also select **Ask me more questions** to fine-tune the Wiki. For simplicity's sake, let us select **I'm bored already, just install the wiki** and click **Continue**: +Optionally, you can also select **Ask me more questions** to fine-tune the Wiki. For simplicity's sake, just select **I'm bored already, just install the wiki** and click **Continue**: ![MediaWiki Wiki Information](../images/mediawiki_6.png) @@ -224,11 +225,11 @@ Click **Continue** to install the Wiki: ![MediaWiki Install Step Part 1](../images/mediawiki_7.png) -MediaWiki will set up the databases. When it is done, click **Continue**: +MediaWiki will set up the databases. When it finishes, click **Continue**: ![MediaWiki Install Step Part 2](../images/mediawiki_8.png) -Your browser will download a `LocalSettings.php` file. This will be uploaded to your server via `sftp`. +Your browser will download a `LocalSettings.php` file. You will upload this to your server with `sftp`. As an example, the author will use their Fedora 42 laptop to upload this file. To do so: @@ -241,7 +242,7 @@ put LocalSettings.php ![MediaWiki LocalSettings.php Step](../images/mediawiki_9.png) -Now click **enter your wiki**: +Finally, click **enter your wiki**: ![Fresh MediaWiki Wiki](../images/mediawiki_10.png) @@ -249,4 +250,4 @@ You now have a fresh MediaWiki installation. ## Conclusion -While MediaWiki is best known for powering Wikipedia, it is useful as a content management system where users need the ability to edit pages. For instance, MediaWiki is a good open source alternative to Microsoft's SharePoint. +While MediaWiki is best known for powering Wikipedia, it is useful as a content management system where users need the ability to edit pages. MediaWiki is a good open source alternative to Microsoft's SharePoint. From 046282ec5e3f6bafdb53a17a68b2865fc2a776dd Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Tue, 29 Jul 2025 15:10:22 -0700 Subject: [PATCH 085/164] New Crowdin updates (#2805) * New translations lab1-prerequisites.md (German) * New translations lab8-iptables.md (Italian) * New translations lab3-auditing_the_system.md (Italian) * New translations mediawiki.md (German) --- docs/guides/cms/mediawiki.de.md | 253 ++++++++++ .../lab1-prerequisites.de.md | 43 ++ .../security/lab3-auditing_the_system.it.md | 443 +++++++++--------- docs/labs/security/lab8-iptables.it.md | 241 +++++----- 4 files changed, 648 insertions(+), 332 deletions(-) create mode 100644 docs/guides/cms/mediawiki.de.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab1-prerequisites.de.md diff --git a/docs/guides/cms/mediawiki.de.md b/docs/guides/cms/mediawiki.de.md new file mode 100644 index 0000000000..f48ea73eda --- /dev/null +++ b/docs/guides/cms/mediawiki.de.md @@ -0,0 +1,253 @@ +--- +title: MediaWiki +author: Neel Chauhan +contributors: Steven Spencer +tested_with: 10.0 +tags: + - cms +--- + +## Einleitung + +[MediaWiki](https://www.mediawiki.org/wiki/MediaWiki) ist eine beliebte Open-Source-Wiki-Software-Engine, die unter anderem Websites wie `Wikipedia`, `Fandom` und `wikiHow` unterstützt. + +## Voraussetzungen + +Für die Verwendung dieses Verfahrens sind folgende Mindestanforderungen zu erfüllen: + +- Die Möglichkeit, Befehle als Root-Benutzer auszuführen oder `sudo` zu verwenden, um Berechtigungen zu erhöhen +- Erfahrung mit einem Kommandozeilen-Editor. Der Autor verwendet hier `vi` oder `vim`, Sie können es aber durch Ihren bevorzugten Editor ersetzen + +## Apache-Installation + +Apache ist der Webserver, den Sie verwenden werden. Installieren Sie es mit: + +```bash +dnf -y install httpd +``` + +Öffnen Sie anschließend die entsprechenden Firewall-Ports: + +```bash +sudo firewall-cmd --permanent --zone=public --add-service=http +sudo firewall-cmd --permanent --zone=public --add-service=https +sudo firewall-cmd --reload +``` + +## PHP-Installation + +!!! note + + Wenn Sie Rocky Linux 8.x oder 9.x ausführen, ersetzen Sie in der Installationszeile des Remi-Pakets neben der Version „8“ oder „9“. + +Um `PHP` zu installieren, müssen Sie zuerst EPEL (Extra Packages for Enterprise Linux) installieren: + +```bash +dnf -y install epel-release && dnf -y update +``` + +Sie benötigen außerdem das Remi-Repository. Installieren Sie es wie folgt: + +```bash +dnf install https://rpms.remirepo.net/enterprise/remi-release-10.rpm +``` + +Installieren Sie anschließend PHP und die benötigten Module: + +```bash +dnf install -y dnf install php84-php-fpm php84-php-intl php84-php-mbstring php84-php-apcu php84-php-curl php84-php-mysql php84-php-xml +``` + +Enable PHP with: + +```bash +systemctl enable --now php84-php-fpm.service +``` + +## MariaDB-Installation + +You need MariaDB for the database. Installieren Sie es mit: + +```bash +dnf install mariadb-server +``` + +Aktivieren Sie als Nächstes den `systemd`-Dienst `mariadb` und führen Sie den Setup-Assistenten aus: + +```bash +systemctl enable --now mariadb +mysql_secure_installation +``` + +Wenn Sie nach dem Root-Passwort gefragt werden, drücken Sie ++enter++ : + +```bash +Enter current password for root (++enter++ for none): +``` + +Antworten Sie mit ++"n"++ auf die `unix_socket`-Authentifizierung: + +```bash +Switch to unix_socket authentication [Y/n] n +``` + +Antworten Sie mit ++"Y"++ auf die Änderung des Root-Passworts und geben Sie das benötigte Root-Passwort ein: + +```bash +Change the root password? [Y/n] Y +New password: +Re-enter new password: +``` + +Entfernen Sie die anonymen Benutzer und verbieten Sie Remote-`Root`-Anmeldungen: + +```bash +Remove anonymous users? [Y/n] Y +... +Disallow root login remotely? [Y/n] Y +``` + +Entfernen Sie den Zugriff auf die Testdatenbank und laden Sie die Berechtigungstabellen neu: + +```bash +Remove test database and access to it? [Y/n] Y +... +Reload privilege tables now? [Y/n] Y +``` + +Melden Sie sich bei MariaDB an mit: + +```bash +mysql -u root -p +``` + +Geben Sie das zuvor erstellte Root-Passwort ein. + +Wenn Sie sich in der MariaDB-Konsole befinden, erstellen Sie die Datenbank für MediaWiki: + +```bash +MariaDB [(none)]> create database mediawiki; +``` + +Als nächstes erstellen Sie den MediaWiki-Benutzer: + +```bash +MariaDB [(none)]> create user 'mediawiki'@'localhost' identified by 'nchauhan11'; +``` + +Erteilen Sie Berechtigungen für die MediaWiki-Datenbank: + +```bash +grant all privileges on mediawiki.* to 'mediawiki'@'localhost'; +``` + +Leeren Sie abschließend die Berechtigungen mit: + +```bash +MariaDB [(none)]> flush privileges; +``` + +## MediaWiki-Installation + +Gehen Sie zum Verzeichnis „/var/www/“ und laden Sie MediaWiki herunter: + +```bash +cd /var/www/ +wget https://releases.wikimedia.org/mediawiki/1.44/mediawiki-1.44.0.zip +``` + +MediaWiki entpacken und verschieben: + +```bash +unzip mediawiki-1.44.0.zip +mv mediawiki-1.44.0/* html/ +``` + +Legen Sie die richtigen SELinux-Berechtigungen fest: + +```bash +chown -R apache:apache /var/www/html +semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html(/.*)?" +restorecon -Rv /var/www/html +``` + +Apache aktivieren: + +```bash +systemctl enable --now httpd +``` + +Öffnen Sie als Nächstes einen Browser mit der Adresse „http://Ihre_IP“ (ersetzen Sie „Ihre_IP“ durch Ihre IP-Adresse): + +![MediaWiki Initial Setup](../images/mediawiki_1.png) + +Wählen Sie Ihre Sprache aus und klicken Sie auf **Continue**: + +![MediaWiki Language Page](../images/mediawiki_2.png) + +Überprüfen Sie, ob die PHP-Konfiguration korrekt ist, scrollen Sie nach unten und klicken Sie auf **Continue**: + +![MediaWiki PHP Checks](../images/mediawiki_3.png) + +Geben Sie nun die Datenbankinformationen wie folgt ein: + +- **Database host**: `localhost` + +- **Database name (no hyphens)**: `mediawiki` (or the database created in the **MariaDB** step) + +- **Database username:**: `mediawiki` (or the user created in the **MariaDB** step) + +- **Database password**: The password you created in the **MariaDB** step + +![MediaWiki Database Information](../images/mediawiki_4.png) + +Klicken Sie auf **Continue**: + +![MediaWiki Database Access Settings](../images/mediawiki_5.png) + +Geben Sie auf der Seite **MediaWiki _Version_-Installation** Folgendes ein: + +- **URL host name**: The URL you want + +- **Name of Wiki**: Der gewünschte Wiki-Name + +- **Administrator account**/**Your username**: Der Administratorbenutzername, den Sie verwenden möchten + +- **Administrator account**/**Password (again)**: Das Administratorkennwort, das Sie verwenden möchten + +- **Administrator account**/**Email address**: E-Mail-Adresse des Administratorbenutzers + +Optional können Sie auch **Stellen Sie mir weitere Fragen** auswählen, um das Wiki zu optimieren. Der Einfachheit halber wählen Sie einfach **Mir ist schon langweilig, installieren Sie einfach das Wiki** und klicken Sie auf **Continue**: + +![MediaWiki Wiki Information](../images/mediawiki_6.png) + +Klicken Sie auf **Continue**, um das Wiki zu installieren: + +![MediaWiki Install Step Part 1](../images/mediawiki_7.png) + +MediaWiki richtet die Datenbanken ein. Wenn der Vorgang abgeschlossen ist, klicken Sie auf **Continue**: + +![MediaWiki Install Step Part 2](../images/mediawiki_8.png) + +Ihr Browser lädt eine Datei `LocalSettings.php` herunter. Sie laden dies mit `sftp` auf Ihren Server hoch. + +Beispielsweise verwendet der Autor zum Hochladen dieser Datei seinen Fedora 42-Laptop. Gehen Sie dazu wie folgt vor: + +```bash +sftp root@your_ip +(Enter password) +cd /var/www/html +put LocalSettings.php +``` + +![MediaWiki LocalSettings.php Step](../images/mediawiki_9.png) + +Klicken Sie abschließend auf **enter your wiki**: + +![Fresh MediaWiki Wiki](../images/mediawiki_10.png) + +Sie haben jetzt eine neue MediaWiki-Installation. + +## Zusammenfassung + +Obwohl MediaWiki vor allem als Grundlage für Wikipedia bekannt ist, ist es auch als Content-Management-System nützlich, wenn Benutzer die Möglichkeit zum Bearbeiten von Seiten benötigen. MediaWiki ist eine gute Open-Source-Alternative zu Microsoft SharePoint. diff --git a/docs/labs/kubernetes-the-hard-way/lab1-prerequisites.de.md b/docs/labs/kubernetes-the-hard-way/lab1-prerequisites.de.md new file mode 100644 index 0000000000..2ac144ae08 --- /dev/null +++ b/docs/labs/kubernetes-the-hard-way/lab1-prerequisites.de.md @@ -0,0 +1,43 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +tags: + - kubernetes + - k8s + - Laborübung +--- + +# Labor 1: Voraussetzungen + +!!! info + + Dies ist ein Fork des ursprünglichen ["Kubernetes the hard way"](https://github.com/kelseyhightower/kubernetes-the-hard-way), das ursprünglich von Kelsey Hightower geschrieben wurde (GitHub: kelseyhightower). Im Gegensatz zum Original, das auf Debian-ähnlichen Distributionen für die ARM64-Architektur basiert, zielt dieser Fork auf Enterprise-Linux-Distributionen wie Rocky Linux ab, das auf der x86_64-Architektur läuft. + +In diesem Labor überprüfen Sie die Maschinenanforderungen, die zum Durchführen dieses Lernprogramms erforderlich sind. + +## Virtuelle oder Physische Maschinen + +Dieses Tutorial erfordert vier (4) virtuelle oder physische x86_64-Maschinen mit Rocky Linux 9.5 (Incus- oder LXD-Container sollten auch funktionieren). In der folgenden Tabelle sind die vier Maschinen und ihre CPU-, Speicher- und Speicherplatzanforderungen aufgeführt. + +| Name | Beschreibung | CPU | RAM | Speicher | +| ------- | ------------------------ | --- | ----- | -------- | +| jumpbox | Verwaltungs-Host | 1 | 512MB | 10GB | +| server | Kubernetes-Server | 1 | 2GB | 20GB | +| node-0 | Kubernetes-Worker-Knoten | 1 | 2GB | 20GB | +| node-1 | Kubernetes-Worker-Knoten | 1 | 2GB | 20GB | + +Wie Sie die Maschinen bereitstellen, bleibt Ihnen überlassen. Die einzige Voraussetzung ist, dass jede Maschine die oben genannten Systemanforderungen erfüllt, einschließlich der Maschinenspezifikationen und der Betriebssystemversion. Sobald Sie alle vier Maschinen bereitgestellt haben, überprüfen Sie die Systemanforderungen, indem Sie auf jeder Maschine den Befehl `uname` ausführen: + +```bash +uname -mov +``` + +Nachdem Sie den Befehl `uname` ausgeführt haben, sollten Sie die folgende Ausgabe sehen: + +```text +#1 SMP PREEMPT_DYNAMIC Wed Feb 19 16:28:19 UTC 2025 x86_64 GNU/Linux +``` + +Das „x86_64“ in der Ausgabe bestätigt, dass das System eine x86_64-Architektur hat. Dies sollte bei verschiedenen AMD- und Intel-basierten Systemen der Fall sein. + +Fortsetzung folgt: [setting-up-the-jumpbox](lab2-jumpbox.md) diff --git a/docs/labs/security/lab3-auditing_the_system.it.md b/docs/labs/security/lab3-auditing_the_system.it.md index 87420a80b7..0db79f52f5 100644 --- a/docs/labs/security/lab3-auditing_the_system.it.md +++ b/docs/labs/security/lab3-auditing_the_system.it.md @@ -2,53 +2,50 @@ Title: Lab 3 - Auditing the System author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova - - - -# Laboratorio 3: Controllo del Sistema +# Laboratorio 3: Auditing del Sistema ## Obiettivi - -Dopo aver completato questo laboratorio, sarete in grado di +Dopo aver completato questo laboratorio, sarete in grado di: - creare da zero uno strumento di auditing semplice e personalizzato -- utilizzare e comprendere strumenti di verifica della sicurezza come tripwire +- utilizzare e comprendere strumenti di verifica della sicurezza come Tripwire Tempo stimato per completare questo laboratorio: 90 minuti +## Un semplice programma di controllo dell'integrità - -## Un semplice controllo dell'integrità fatto in casa - -Prima di iniziare a installare e configurare tripwire, creiamo uno script di esempio che svolga una funzione simile. Questo script aiuterà a comprendere meglio il funzionamento di Tripwire e di strumenti simili. +Prima di installare e configurare Tripwire, creiamo uno script di esempio che svolge una funzione simile. Questo script aiuterà a comprendere meglio il funzionamento di Tripwire e di strumenti simili. Lo script si basa principalmente sul programma md5sum. Il programma md5sum viene utilizzato per calcolare una somma di controllo (o "impronta digitale") a 128 bit per un FILE specificato. Le funzioni dello script sono riassunte di seguito: -1. Subito dopo l'installazione del sistema di base, viene eseguito il backup di alcuni file di configurazione del sistema che si trovano nella directory /etc, in una directory chiamata etc.bak nella directory home di root. +1. Subito dopo l'installazione del sistema di base, alcuni dei file di configurazione del sistema nella directory /etc verranno sottoposti a backup in una directory denominata etc.bak nella directory home di root. -In particolare, verrà eseguito il backup di tutti i file presenti in /etc con il suffisso "*.conf" + In particolare, verrà eseguito il backup di tutti i file presenti in /etc con il suffisso "*.conf" -Lo fa quando viene eseguito con l'opzione di inizializzazione ( -- initialization| -i) + Lo fa quando viene eseguito con l'opzione di inizializzazione ( -- initialization| -i) -2. Lo script verrà quindi utilizzato per ottenere i checksum md5 dei file affidabili (file non contaminati). +2. Lo script otterrà quindi le checksum md5 dei file idonei noti (file non contaminati). 3. L'elenco delle somme MD5 sarà memorizzato in un file chiamato "md5_good". 4. Quando lo script viene eseguito in modalità di verifica, il programma md5sum viene richiamato con l'opzione " - -check" per controllare le somme MD5 correnti rispetto a un elenco dato (il file md5_good). -Lo script stamperà il risultato della verifica nell'output standard e invierà una copia del risultato via e-mail al superutente. + Lo script stamperà il risultato della verifica nell'output standard e invierà una copia del risultato via e-mail al superutente. -5. Ogni volta che vengono apportate modifiche (legali o illegali) ai file di configurazione presenti in /etc, lo script può essere richiamato con l'opzione `--rebuild| -r` per approvare le modifiche e ricostruire il pseudo database di base. +5. Ogni volta che vengono apportate modifiche (legali o illegali) ai file di configurazione presenti in /etc, lo script può essere richiamato con l'opzione `--rebuild| -r` per approvare le modifiche e ricostruire il pseudo database di base. 6. È possibile eseguire periodicamente lo script manualmente o creare un cron job per eseguirlo automaticamente. -Lo script seguente può essere perfezionato e scalato per fare molto di più di quello che fa. Spetta a voi e alla vostra immaginazione per fargli fare quello che volete. +Lo script seguente può essere perfezionato e scalato per fare molto di più di quello che fa. Spetta a voi e alla vostra immaginazione fargli fare quello che volete. -Se volete solo un modo rapido e pratico per portare a termine il lavoro, lo script è sufficiente, ma per tutto il resto c'è MasterCard - scusate, volevo dire, per tutto il resto c'è Tripwire. +Se volete solo un modo rapido e pratico per svolgere il lavoro, lo script sarà sufficiente, ma per tutto il resto c'è Tripwire. ## Esercizio 1 -1. Accedere come root e lanciare l'editor di testo desiderato. Immettere il testo sottostante: +1. Accedere come root e lanciare l'editor di testo desiderato. Inserisci il testo qui sotto: ```bash @@ -127,7 +124,7 @@ esac Salvate il testo qui sopra in un file di testo e nominatelo "check.sh" -#### Per utilizzare lo script check.sh +### Per utilizzare lo script check.sh 1. Creare una cartella nella home directory di root chiamata "scripts" @@ -137,32 +134,33 @@ Salvate il testo qui sopra in un file di testo e nominatelo "check.sh" 4. Eseguire lo script con l'opzione di inizializzazione. Digitare: -``` -[root@localhost scripts]# ./check.sh -i + ```bash + [root@localhost scripts]# ./check.sh -i -Untainted baseline file (~/etc.bak/md5_good) has been created !! -``` + Untainted baseline file (~/etc.bak/md5_good) has been created !! + ``` -5. Usare il comando ls per visualizzare i contenuti della home directory di root. Dovrebbe esserci una nuova directory chiamata `etc.bak`. Usate il comando cat per visualizzare il file `/root/etc.bak/md5_good` - solo per divertimento. +5. Usare il comando `ls` per visualizzare il contenuto della home directory di root. Dovrebbe esserci una nuova directory denominata `etc.bak`. Usate il comando `cat` per visualizzare il file `/root/etc.bak/md5_good`. -7. Eseguire lo script utilizzando l'opzione verify. Digitare: +6. Eseguire lo script utilizzando l'opzione verify. Digitare: -``` -[root@localhost scripts]# ./check.sh -v + ```bash + [root@localhost scripts]# ./check.sh -v -Nothing wrong here. -``` + Nothing wrong here. + ``` -Se tutto è a posto, si dovrebbe ottenere l'output di cui sopra. + Se tutto è a posto, si dovrebbe ottenere l'output di cui sopra. -7. Si intende modificare deliberatamente il file `/etc/kdump.conf` nella directory `/etc`. Digitare: +7. Si modificheranno deliberatamente i file `/etc/kdump.conf` nella directory `/etc`. Digitare: - ``` + ```bash [root@localhost scripts]# echo "# This is just a test" >> /etc/kdump.conf ``` + 8. Ora eseguite nuovamente lo script check.sh in modalità di verifica. Digitare: - ``` + ```bash [root@localhost scripts]# ./check.sh -v **** @@ -173,17 +171,17 @@ Se tutto è a posto, si dovrebbe ottenere l'output di cui sopra. Re-run the script with the re-build option (e.g. ./check.sh --rebuild) to approve ``` -9. In base all'avviso di cui sopra, dovreste approfondire l'indagine per verificare se il file alterato possa essere approvato. È possibile eseguire lo script con l'opzione `--rebuild` se questo è il caso. Per visualizzare solo le differenze tra il file "contaminato" e quello "non contaminato" si può digitare: +9. In base all'avviso di cui sopra, dovreste approfondire l'indagine per verificare se il file alterato possa essere approvato. In tal caso, è possibile eseguire lo script con l'opzione `--rebuild`. Per visualizzare solo le differenze tra il file "contaminato" e quello "non contaminato" si può digitare: - ``` + ```bash [root@localhost scripts]# sdiff -s /etc/kdump.conf /root/etc.bak/kdump.conf ``` ## Tripwire -Una delle prime cose da fare dopo la costruzione di un nuovo sistema è ottenere un'istantanea dello stato di funzionamento noto del sistema prima che questo venga "contaminato" o prima di distribuirlo in produzione. +Una delle prime cose da fare dopo aver creato un nuovo sistema è ottenere un'istantanea dello stato ottimale del sistema prima che questo venga “contaminato” o prima di implementarlo in produzione. -Esistono diversi strumenti per farlo. Uno di questi strumenti è tripwire. Tripwire è uno strumento avanzato, quindi preparatevi a molte opzioni, sintassi, stranezze e interruttori. +Esistono diversi strumenti per farlo. Uno di questi strumenti è Tripwire. Tripwire è uno strumento avanzato, quindi preparatevi a molte opzioni, sintassi, stranezze e interruttori. Tripwire può essere considerato una forma di sistema di rilevamento delle intrusioni (IDS) basato su host. Esegue funzioni di rilevamento delle intrusioni scattando un'istantanea di un "sistema sano" e confrontando successivamente questo stato sano con qualsiasi altro stato sospetto. Fornisce un mezzo per conoscere/monitorare se determinati file sensibili sono stati alterati illegalmente. L'amministratore del sistema decide naturalmente quali file devono essere monitorati. @@ -193,39 +191,39 @@ Tripwire confronta la nuova firma di un file con quella acquisita al momento del Le fasi di installazione e configurazione di tripwire sono elencate di seguito: -1. Le fasi di installazione e configurazione di tripwire sono elencate di seguito +1. Installare il software dal sorgente o dal binario -2. Eseguire lo script di configurazione: (twinstall.sh). Questo script viene utilizzato per: a) Creare la chiave del sito e la chiave locale e richiede le password per entrambe. b) firmare il file dei criteri e il file di configurazione con la chiave del sito. +2. Eseguire lo script di configurazione: (twinstall.sh). Questo script viene utilizzato per: a) Creare la chiave del sito, la chiave locale e le richieste di passphrase per entrambe b) Firmare il file dei criteri e il file di configurazione con la chiave del sito -3. Inizializzare il database tripwire +3. Inizializzare il database Tripwire 4. Eseguire il primo controllo di integrità. -5. Modificare il file di configurazione (twcfg.txt) +5. Modificare il file di configurazione (twcfg.txt) 6. Modificare il file dei criteri (twpol.txt) Tripwire accetta le seguenti opzioni dalla riga di comando: - **Modalità di Inizializzazione del database:** -``` - -m i --init - -v --verbose - -s --silent, --quiet - -c cfgfile --cfgfile cfgfile - -p polfile --polfile polfile - -d database --dbfile database - -S sitekey --site-keyfile sitekey - -L localkey --local-keyfile localkey - -P passphrase --local-passphrase passphrase - -e --no-encryption +```bash + -m i --init + -v --verbose + -s --silent, --quiet + -c cfgfile --cfgfile cfgfile + -p polfile --polfile polfile + -d database --dbfile database + -S sitekey --site-keyfile sitekey + -L localkey --local-keyfile localkey + -P passphrase --local-passphrase passphrase + -e --no-encryption ``` **Modalità di Controllo dell'Integrità:** -``` + +```bash -m c --check -I --interactive @@ -253,7 +251,7 @@ Tripwire accetta le seguenti opzioni dalla riga di comando: **Modalità di Aggiornamento del Database:** -``` +```bash -m u --update -v --verbose -s --silent, --quiet @@ -271,7 +269,7 @@ Tripwire accetta le seguenti opzioni dalla riga di comando: **Modalità di Aggiornamento dei Criteri:** -``` +```bash -m p --update-policy -v --verbose -s --silent, --quiet @@ -286,10 +284,9 @@ Tripwire accetta le seguenti opzioni dalla riga di comando: policyfile.txt ``` +**Riepilogo delle opzioni per il comando `tripwire`:** -**Riepilogo delle opzioni per il comando tripwire:** - -``` +```bash SYNOPSIS Database Initialization: tripwire { -m i | --init } [ options... ] Integrity Checking: tripwire { -m c | --check } [ options... ] @@ -301,12 +298,11 @@ SYNOPSIS ``` - ### `twadmin` -L'utilità `twadmin` esegue funzioni amministrative relative ai file tripwire e alle opzioni di configurazione. In particolare, `twadmin` consente la codifica, la decodifica, la firma e la verifica dei file tripwire e fornisce un mezzo per generare e modificare le chiavi locali e del sito. +L'utilità `twadmin` esegue le funzioni amministrative relative ai file e alle opzioni di configurazione di Tripwire. In particolare, `twadmin` consente di codificare, decodificare, firmare e verificare i file Tripwire e fornisce un mezzo per generare e modificare le chiavi locali e del sito. -``` +```bash Create Configuration File: twadmin [-m F|--create-cfgfile][options] cfgfile.txt Print Configuration File: twadmin [-m f|--print-cfgfile] [options] Create Policy File: twadmin [-m P|--create-polfile] [options] polfile.txt @@ -323,7 +319,7 @@ Stampa i file del database e dei rapporti di Tripwire in formato testo semplice. **Modalità di stampa del report:** -``` +```bash -m r --print-report -v --verbose -s --silent, --quiet @@ -333,9 +329,9 @@ Stampa i file del database e dei rapporti di Tripwire in formato testo semplice. -t { 0|1|2|3|4 } --report-level { 0|1|2|3|4 } ``` -**Modalità di stampa del database:** +**Modalità di stampa del Database:** -``` +```bash -m d --print-dbfile -v --verbose -s --silent, --quiet @@ -347,76 +343,73 @@ Stampa i file del database e dei rapporti di Tripwire in formato testo semplice. ### `siggen` -`siggen` è una routine di raccolta firme per Tripwire. È un'utilità che visualizza i valori della funzione hash per i file specificati. +`siggen` è una routine di raccolta delle firme per Tripwire. È un'utilità che visualizza i valori della funzione hash per i file specificati. -``` +```bash OPTIONS ‐t, --terse - Terse mode. Stampa gli hash richiesti per un determinato file su una riga, delimitata da spazi, senza informazioni estranee. + Terse mode. Prints requested hashes for a given file on one line, delimited by spaces, with no extraneous information. ‐h, --hexadecimal - Visualizza i risultati in esadecimale anziché in notazione base64. + Display results in hexadecimal rather than base64 notation. ‐a, --all - Visualizza tutti i valori delle funzioni hash (impostazione predefinita). + Display all hash function values (default). ‐C, --CRC32 - Visualizza CRC-32, controllo di ridondanza ciclica a 32 bit conforme a POSIX 1003.2. + Display CRC-32, POSIX 1003.2 compliant 32-bit Cyclic Redundancy Check. ‐M, --MD5 - Visualizza MD5, l'algoritmo di Digest dei messaggi di RSA Data Security, Inc. Message Digest Algorithm. + Display MD5, the RSA Data Security, Inc. Message Digest Algorithm. ‐S, --SHA - Visualizza SHA, l'implementazione di Tripwire del NIST Secure Hash Standard, SHS (NIST FIPS 180). + Display SHA, Tripwire's implementation of the NIST Secure Hash Standard, SHS (NIST FIPS 180). ‐H, --HAVAL - Visualizza il valore Haval, un codice hash a 128 bit. + Display Haval value, a 128-bit hash code. file1 [ file2... ] - Elenco di oggetti del filesystem per i quali visualizzare i valori. + List of filesystem objects for which to display values. ``` - - ## Esercizio 2 -#### Per installare Tripwire +### Per installare Tripwire -1. Verificare se tripwire è già installato sul sistema. Digitare: +1. Verificare se Tripwire è già installato sul sistema. Digitare: -``` -[root@localhost root]# rpm -q tripwire -tripwire-* -``` + ```bash + [root@localhost root]# rpm -q tripwire + tripwire-* + ``` -Se si ottiene un risultato simile a quello riportato sopra, il programma è già installato. Saltare il passaggio successivo. + Se si ottiene un risultato simile a quello riportato sopra, il programma è già installato. Saltare il passaggio successivo. -2. Se non è installato, procurarsi il binario tripwire e installarlo. Digitare: +2. Se non è installato, procuratevi il binario di Tripwire e installatelo. Digitare: -``` -[root@localhost root]# dnf -y install tripwire -``` + ```bash + [root@localhost root]# dnf -y install tripwire + ``` -#### Per configurare tripwire +### Configurare Tripwire -La configurazione di tripwire comporta la personalizzazione del file di configurazione di tripwire, se necessario, la personalizzazione del file dei criteri, se necessario, e l'esecuzione dello script di configurazione che richiederà una passphrase da utilizzare per firmare/proteggere il file di configurazione, il file dei criteri e il file del database. +La configurazione di Tripwire comporta (se necessario) la personalizzazione del file di configurazione di Tripwire, del file dei criteri e l'esecuzione dello script di configurazione. Lo script richiede una passphrase che verrà utilizzata per firmare/proteggere il file di configurazione, il file dei criteri e il file del database. -1. Cambiare la pwd con la directory di lavoro di tripwire: Digitare: +1. Cambiare la pwd con la directory di lavoro di Tripwire: Digitare: -``` -[root@localhost root]# cd /etc/tripwire/ -``` -2. Elencare il contenuto della directory + ```bash + [root@localhost root]# cd /etc/tripwire/ + ``` -3. Per visualizzare/studiare i file presenti nella directory, utilizzare un qualsiasi paginatore o editor di testo. +2. Elencare il contenuto della directory. -4. Accetteremo le impostazioni fornite con la configurazione predefinita. (twcfg.txt) e il file predefinito fornito +3. Per visualizzare/studiare i file presenti nella directory, utilizzare un qualsiasi paginatore o editor di testo. -file dei criteri (twpol.txt) per ora. +4. Accetteremo le impostazioni della configurazione predefinita. (twcfg.txt) e il file dei criteri predefiniti (twpol.txt). -5. Eseguire l'utilità di configurazione tripwire come root. Verrà richiesta (due volte) la passphrase della chiave del sito. Selezionate una passphrase che non dimenticherete (la chiave del sito è destinata al file twcfg.txt e al file twpol.txt): +5. Eseguire l'utilità di configurazione di Tripwire come root. Verrà richiesta (due volte) la passphrase della chiave del sito. Selezionate una passphrase che NON dimenticherete (la chiave del sito è destinata al file twcfg.txt e al file twpol.txt): - ``` + ```bash [root@localhost tripwire]# tripwire-setup-keyfiles ..... Enter the site keyfile passphrase: @@ -425,19 +418,19 @@ file dei criteri (twpol.txt) per ora. Generating key (this may take several minutes)...Key generation complete. ``` - Successivamente verrà richiesta una chiave locale. Di nuovo, scegliete un'altra password che NON dimenticherete. (La chiave locale firma i file del database tripwire e i file dei report) - ``` + ```bash Enter the local keyfile passphrase: Verify the local keyfile passphrase: .... Generating key (this may take several minutes)...Key generation complete. ``` - Dopo aver scelto le passphrase, il programma `tripwire-setup-keyfiles` procederà alla creazione/firma delle versioni criptate dei file originali in testo semplice (cioè tw.cfg e tw.pol). Verranno nuovamente richieste le passphrase scelte in precedenza. A questo punto, seguite le istruzioni finché lo script non termina. - ``` + Dopo aver scelto le passphrase, il programma `tripwire-setup-keyfiles` procederà alla creazione/firma delle versioni criptate dei file originali in testo normale (ad esempio, verranno creati rispettivamente tw.cfg e tw.pol). Verranno nuovamente richieste le passphrase scelte in precedenza. A questo punto, seguite le istruzioni finché lo script non termina. + + ```bash ---------------------------------------------- Signing configuration file... Please enter your site passphrase: ******** @@ -450,11 +443,13 @@ file dei criteri (twpol.txt) per ora. Wrote policy file: /etc/tripwire/tw.pol ``` -6. Elencare il nuovo contenuto della cartella /etc/tripwire. + !!! question "Compito di laboratorio:" -7. In base all'avviso ricevuto durante l'esecuzione dell'utilità tripwire-setup-keyfiles, ora si sposteranno le versioni in testo semplice del file di configurazione e dei file delle policy lontano dal sistema locale. Potreste memorizzarli su un supporto di rimozione esterno o crittografarli in loco (utilizzando uno strumento come GPG, ad esempio) OPPURE eliminarli completamente se vi sentite particolarmente audaci. Digitare: + Elencare il nuovo contenuto della cartella /etc/tripwire. - ``` +6. In base all'avviso ricevuto durante l'esecuzione dell'utilità `tripwire-setup-keyfiles`, ora si sposteranno le versioni in testo semplice del file di configurazione e dei file delle policy lontano dal sistema locale. Potreste memorizzarli su un supporto di rimozione esterno o crittografarli in loco (utilizzando uno strumento come GPG, ad esempio) OPPURE eliminarli completamente se vi sentite particolarmente audaci. Digitare: Digitare: + + ```bash [root@localhost tripwire]# mkdir /root/tripwire_stuff && mv twcfg.txt twpol.txt /root/tripwire_stuff ``` @@ -462,14 +457,13 @@ file dei criteri (twpol.txt) per ora. Può essere utile conservare le versioni in chiaro in un luogo sicuro, nel caso in cui si dimentichino le passphrase. È sempre possibile rieseguire "tripwire-setup-keyfiles" in base alle configurazioni e ai criteri perfezionati nel tempo. +### Per inizializzare il database -#### Per inizializzare il database - -L'inizializzazione del database è il termine tripwire per indicare l'acquisizione di un'istantanea iniziale "non contaminata" dei file che si è deciso di monitorare (in base al file dei criteri). Questo genera il database e lo firma con la chiave locale. Il database serve come base per tutti i futuri controlli di integrità. +L'inizializzazione del database è la terminologia di Tripwire per indicare l'acquisizione di un'istantanea iniziale "non contaminata" dei file che si è deciso di monitorare (in base al file di criterio). Questo genera il database e lo firma con la chiave locale. Il database serve come base per tutti i futuri controlli di integrità. 1. Mentre si è ancora connessi come root digitare: - ``` + ```bash [root@localhost tripwire]# tripwire --init Please enter your local passphrase: @@ -479,32 +473,30 @@ L'inizializzazione del database è il termine tripwire per indicare l'acquisizio ``` -Quando viene richiesto, inserire la passphrase locale. La creazione del database verrà portata a termine e si dovrebbe ottenere un output simile a quello riportato di seguito: + Quando viene richiesto, inserire la passphrase locale. La creazione del database verrà portata a termine e si dovrebbe ottenere un output simile a quello riportato di seguito: - -**The database was successfully generated.** + **The database was successfully generated.** 2. Utilizzare il comando `ls` per verificare che il database sia stato creato nella posizione indicata. Digitare: - ``` + ```bash [root@localhost tripwire]# ls -lh /var/lib/tripwire/$(hostname).twd -rw-r--r--. 1 root root 3.3M Sep 27 18:35 /var/lib/tripwire/localhost.twd ``` - ## Esercizio 3 -**Controllo d'integrità e visualizzazione dei rapporti** +### Controllo dell'integrità e visualizzazione dei rapporti -In questa esercitazione imparerete a eseguire un controllo di integrità del sistema e a visualizzare i rapporti generati da tripwire. +In questa esercitazione imparerete a eseguire un controllo di integrità del sistema e a visualizzare i rapporti generati da Tripwire. -#### Per eseguire un controllo di integrità +### Per eseguire un controllo di integrità -L'esecuzione di tripwire in questa modalità (modalità di controllo dell'integrità) confronta gli oggetti del file system corrente con le loro proprietà nel database di tripwire. Le discrepanze tra il database e gli oggetti del file system corrente vengono stampate in questa modalità sullo standard output durante l'esecuzione di tripwire. Al termine del controllo tripwire genera anche un file di report nella directory specificata nel file twcfg.txt (/var/lib/tripwire/report/). +L'esecuzione di tripwire in questa modalità (modalità di controllo dell'integrità) confronta gli oggetti del file system corrente con le loro proprietà nel database di tripwire. Le discrepanze tra il database e gli oggetti del file system corrente vengono stampate sullo standard output durante l'esecuzione di Tripwire in questa modalità. Al termine del controllo Tripwire genera anche un file di report nella directory specificata nel file twcfg.txt (/var/lib/tripwire/report/). -1. Eseguire un controllo di integrità. Digitare: +1. Eseguire un controllo di integrità. Digitare: - ``` + ```bash [root@localhost tripwire]# tripwire --check ``` @@ -512,130 +504,138 @@ L'esecuzione di tripwire in questa modalità (modalità di controllo dell'integr Controllare la cartella `/var/lib/tripwire/report` per vedere se è stato creato un rapporto anche lì. - !!! QUESTION "DOMANDA" + !!! question "Compito di laboratorio:" - Scrivete il nome del file di report creato? + Scrivere il nome del file di report creato. FILE_NAME = 2. Eseguire nuovamente il controllo di integrità, ma specificare manualmente il nome del file di report. Digitare: - ``` + ```bash [root@localhost tripwire]# tripwire -m c -r /root/tripwire_report.twr ``` -3. Assicurarsi che sia stato creato un nuovo file nella home directory di root. Digitare: +3. Assicurarsi che sia stato creato un nuovo file nella home directory di root. Digitare: - ``` + ```bash [root@localhost tripwire]# ls -l /root/tripwire_report.twr ``` -#### Per esaminare il rapporto +### Per esaminare il rapporto I file di report di Tripwire sono una raccolta di violazioni delle regole rilevate durante un controllo di integrità. -Esistono diversi metodi per visualizzare il file di report tripwire. È possibile visualizzarlo durante l'esecuzione del controllo di integrità, oppure sotto forma di e-mail inviata automaticamente o ancora utilizzando il comando "twprint" fornito con il pacchetto tripwire. +Esistono diversi modi per visualizzare un file di report di Tripwire: + +- durante il controllo di integrità +- sotto forma di un'e-mail inviata automaticamente all'utente +- utilizzando il comando `twprint` fornito con il pacchetto Tripwire !!! note "Nota" - Probabilmente avrete notato dall'esercizio precedente che tripwire utilizza una combinazione del nome FQDN del sistema, della data e dell'ora per assegnare un nome predefinito ai file di report. + Probabilmente avrete notato dall'esercizio precedente che Tripwire utilizza una combinazione del nome FQDN del sistema, della data e dell'ora per assegnare un nome predefinito ai file di report. -1. Per prima cosa, passare alla directory del report predefinito e visualizzare il report predefinito creato al punto 1 ("FILE_NAME"). Digitare: +1. Per prima cosa, passare alla directory del report predefinito e visualizzare il report predefinito creato al punto 1 (FILE_NAME). Digitare: - ``` + ```bash [root@localhost report]# cd /var/lib/tripwire/report && twprint --print-report -r ``` -Sostituire con il valore indicato in precedenza. + Sostituire con il valore indicato in precedenza. -Per utilizzare la forma abbreviata del comando precedente, digitare: - ``` + Per utilizzare la forma abbreviata del comando precedente, digitare: + + ```bash [root@localhost report]# twprint -m r -r | less ``` -L'output viene inviato al comando less poiché il report scorre rapidamente. -2. Ora visualizzate l'altro report creato manualmente, nella directory home di root. Digitare: - ``` + L'output viene inviato al comando less perché il report scorre rapidamente. + +2. Ora visualizzate l'altro report creato manualmente, nella directory home di root. Digitare: + + ```bash [root@localhost root]# cd && twprint --print-report -r /root/tripwire_report.twr | less ``` -3. Tenetevi forte e studiate attentamente l'output del file di report. +3. Tenetevi forte e studiate attentamente l'output del file di report. -4. Dovreste aver notato di nuovo che tripwire ha creato dei moduli binari/dati dei file di report. Creare una versione solo testo del file di report nella directory home di root. Digitare: +4. Dovreste aver notato di nuovo che Tripwire ha creato forme binarie/dati dei file di report. Creare una versione solo testo del file di report nella directory home di root. Digitare: - ``` + ```bash [root@localhost root]# twprint --print-report -r /root/tripwire_report.twr > tripwire_report.txt ``` -#### Per visualizzare i rapporti via e-mail +### Per visualizzare i rapporti via e-mail -Qui si testerà la funzionalità e-mail di tripwire. Il sistema di notifica via e-mail di Tripwire utilizza l'impostazione specificata nel file di configurazione di Tripwire. (twcfg.txt). +Here you will test the e-mail functionality of Tripwire. Il sistema di notifica via e-mail di Tripwire utilizza l'impostazione specificata nel file di configurazione di Tripwire. (twcfg.txt). -1. Per prima cosa, visualizzate il file di configurazione e notate le variabili che controllano il sistema di notifica via e-mail di tripwire. Per visualizzare il tipo di file di configurazione: +1. Per prima cosa visualizzate il file di configurazione e notate le variabili che controllano il sistema di notifica via e-mail di Tripwire. Per visualizzare il tipo di file di configurazione: - ``` + ```bash [root@localhost report]# twadmin -m f | less ``` - Scrivere qui le variabili rilevanti? - + !!! question "Compito di laboratorio:" + Scrivere le variabili rilevanti. -2. Assicurarsi quindi che il sistema di posta locale sia attivo e funzionante, controllando lo stato di postfix. Digitare: +2. Quindi, assicurarsi che il sistema di posta locale sia attivo e funzionante controllando lo stato di postfix. Digitare: - ``` + ```bash [root@localhost report]# systemctl -n 0 status postfix ....... Active: active (running) since Thu 2023-08-31 16:21:26 UTC; 3 weeks 6 days ago ....... ``` -L'output dovrebbe essere simile a quello sopra riportato. Se il vostro sistema di mailing non funziona, cercate di risolvere il problema e di renderlo operativo prima di continuare. + L'output dovrebbe essere simile a quello sopra riportato. Se il sistema di posta elettronica non è in funzione, prima di continuare, cercate di risolvere il problema e di renderlo operativo. -3. Inviare un messaggio di prova a root. Digitare: +3. Inviare un messaggio di prova a root. Digitare: - ``` + ```bash [root@localhost report]# tripwire --test --email root ``` -4. Utilizzare il programma di posta per controllare la posta di root. Digitare: +4. Utilizzare il programma di posta per controllare la posta di root. Digitare: - ``` + ```bash [root@localhost report]# mail ``` - Il superutente dovrebbe ricevere un messaggio con oggetto "Test email message from Tripwire" -5. Dopo aver confermato il funzionamento della funzione e-mail, si può provare a inviare manualmente una copia di uno dei report a se stessi. + Il superutente dovrebbe ricevere un messaggio con oggetto "Test email message from Tripwire" -Scrivere il comando per farlo? +5. Dopo aver confermato il funzionamento della funzionalità e-mail, si può provare a inviare manualmente una copia di uno dei report a se stessi. + !!! question "Domanda" + + Qual era il comando per farlo? -### Messa a punto di tripwire +### Messa a punto di Tripwire -Dopo l'installazione di tripwire, l'acquisizione di un'istantanea del sistema e l'esecuzione del primo controllo di integrità, è molto probabile che sia necessario mettere a punto tripwire per soddisfare le esigenze del vostro ambiente specifico. Ciò è dovuto principalmente al fatto che il file di configurazione e di criteri predefinito fornito con tripwire potrebbe non essere esattamente adatto alle vostre esigenze o riflettere gli elementi effettivi del vostro file system. +Dopo l'installazione di Tripwire, l'acquisizione di un'istantanea del sistema e l'esecuzione del primo controllo di integrità, è molto probabile che sia necessario mettere a punto Tripwire per soddisfare le esigenze del vostro ambiente specifico. Ciò è dovuto principalmente al fatto che il file di configurazione e di criterio predefinito fornito con Tripwire potrebbe non essere esattamente adatto alle vostre esigenze o riflettere gli oggetti effettivi presenti nel vostro file system. -È necessario verificare se le violazioni del file system segnalate nel file di report durante il controllo di integrità sono violazioni effettive o modifiche legittime/autorizzate agli elementi del file system. Anche in questo caso tripwire offre diversi modi per farlo. +È necessario verificare se le violazioni del file system segnalate nel file di report durante il controllo di integrità sono violazioni effettive o modifiche legittime/autorizzate agli oggetti del file system. Anche in questo caso Tripwire offre diversi modi per farlo. ### Aggiornamento del file dei criteri -Con questo metodo è possibile modificare o regolare con precisione ciò che Tripwire considera violazioni agli elementi del file system, modificando le regole nel file dei criteri. Il database può quindi essere aggiornato senza una nuova inizializzazione completa. Ciò consente di risparmiare tempo e di preservare la sicurezza, mantenendo il file dei criteri sincronizzato con il database utilizzato. +Con questo metodo è possibile modificare o regolare con precisione ciò che Tripwire considera violazioni agli oggetti del file system, modificando le regole nel file dei criteri. Il database può quindi essere aggiornato senza una nuova inizializzazione completa. In questo modo si risparmia tempo e si preserva la sicurezza, mantenendo il file dei criteri sincronizzato con il database utilizzato. -Si utilizzerà il file di report creato in precedenza ( /root/tripwire_report.txt ) per mettere a punto il file dei criteri, impedendo innanzitutto a tripwire di segnalare l'assenza di file che non sono mai stati presenti sul filesystem. +Utilizzerete il file di report creato in precedenza ( /root/tripwire_report.txt ) per perfezionare il vostro file di criterio, impedendo innanzitutto a Tripwire di segnalare l'assenza di file che non sono mai stati presenti sul filesystem. In questo modo si riduce notevolmente la lunghezza del file di report da gestire. +#### Per mettere a punto Tripwire -#### Per mettere a punto tripwire - -1. Usare il comando grep per filtrare tutte le righe del file di report che si riferiscono a file mancanti (ad es. Linee contenenti la parola "Filename"). Reindirizzare l'output in un altro file, tripwire_diffs.txt. Digitare: +1. Usare il comando grep per filtrare tutte le righe del file di report che si riferiscono a file mancanti (ad es. Linee contenenti la parola "Filename"). Linee contenenti la parola "Filename"). Reindirizzare l'output in un altro file, tripwire_diffs.txt. Digitare: - ``` + ```bash [root@localhost root]# grep Filename /root/tripwire_report.txt > tripwire_diffs.txt ``` -2. Visualizzare il contenuto del file creato in precedenza. Digitare: +2. Visualizzare il contenuto del file creato in precedenza. Digitare: - ``` + ```bash [root@localhost root]# less tripwire_diffs.txt 207: Filename: /proc/scsi @@ -649,43 +649,45 @@ In questo modo si riduce notevolmente la lunghezza del file di report da gestire .................................. ``` -3. Ora è necessario modificare il file dei criteri di tripwire e commentare o eliminare le voci del file che non dovrebbero essere presenti. es. i file che non sono presenti sul sistema e quelli che probabilmente non lo saranno mai. Ad esempio, uno dei file che il file di criterio cerca di monitorare è il file /proc/scsi. Se non si dispone di un dispositivo SCSI sul sistema, non ha assolutamente senso monitorare questo file. +3. Ora è necessario modificare il file dei criteri di Tripwire e commentare o eliminare le voci del file che non dovrebbero essere presenti. Ad esempio, alcuni file non sono presenti sul sistema e non lo saranno mai. Uno dei file, ad esempio, che il file di criterio cerca di monitorare è il file /proc/scsi. Se il sistema non dispone di dispositivi SCSI, non ha senso monitorare questo file. - Un altro esempio discutibile di cosa monitorare o meno sono i vari file di blocco sotto la directory `/var/lock/subsys/`. La scelta di monitorare questi file deve essere una decisione personale. + Un altro esempio discutibile di cosa monitorare o meno è rappresentato dai vari file di blocco sotto la directory `/var/lock/subsys/`. La scelta di monitorare questi file deve essere una decisione personale. Creare nuovamente una versione di testo del file di criterio, nel caso in cui sia stato rimosso (come consigliato) dal sistema locale. Digitare: - ``` + ```bash [root@localhost root]# twadmin --print-polfile > twpol.txt ``` -4. Modificare il file di testo creato in precedenza utilizzando un qualsiasi editor di testo. Commentare i riferimenti agli elementi che non si desidera monitorare; si può usare il file tripwire_diffs.txt creato in precedenza come linea guida. Digitare: +4. Modificare il file di testo creato in precedenza utilizzando un qualsiasi editor di testo. Eliminare i riferimenti agli oggetti che non si desidera monitorare. Si può usare il file tripwire_diffs.txt creato in precedenza come linea guida. Digitare: - ``` + ```bash [root@localhost root]# vi twpol.txt ``` + Salvare le modifiche al file e chiuderlo. -5. Eseguire tripwire in modalità di aggiornamento dei file di criterio. Digitare: +5. Eseguire `tripwire` in modalità di aggiornamento dei file di criterio. Digitare: - ``` + ```bash [root@localhost root]# tripwire --update-policy /root/twpol.txt ``` - Quando viene richiesto, inserire le passphrase locali e del sito. - Verrà creato un nuovo file di criteri firmato e crittografato nella directory `/etc/tripwire/`. + Quando viene richiesto, inserire le passphrase locale e del sito. -6. Eliminare o rimuovere la versione di testo del file di criterio dal sistema locale. + Verrà creato un nuovo file di criterio firmato e crittografato nella directory `/etc/tripwire/`. -7. L'esecuzione del comando al punto 5 crea un file di report nella directory `/var/lib/tripwire/report`. +6. Eliminare o rimuovere la versione di testo del file di criterio dal sistema locale. - !!! Question "Domanda" +7. L'esecuzione del comando al punto 5 crea un file di report nella directory `/var/lib/tripwire/report`. + + !!! Question "Compito di laboratorio:" - Scrivete qui il nome del vostro ultimo file di report? + Scrivere il nome dell'ultimo file di report. -8. Eseguire nuovamente un controllo di integrità del sistema fino a quando non si è certi di avere una buona base del sistema, dalla quale prendere decisioni future. +8. Eseguire nuovamente un controllo di integrità del sistema fino a quando non si è certi di avere una buona base del sistema, con la quale prendere decisioni future. !!! Question "Domanda" @@ -693,65 +695,63 @@ In questo modo si riduce notevolmente la lunghezza del file di report da gestire ### Aggiornamento del database -L'esecuzione di tripwire in modalità di aggiornamento del database dopo un controllo di integrità offre un modo rapido e approssimativo per mettere a punto tripwire. Questo perché la modalità di Aggiornamento del Database consente di riconciliare le differenze tra il database e il sistema corrente. In questo modo si eviterà che le violazioni vengano visualizzate nei rapporti futuri. +L'esecuzione di `tripwire` in modalità di aggiornamento del database dopo un controllo di integrità offre un modo rapido e approssimativo per mettere a punto Tripwire. Questo perché la modalità di aggiornamento del database consente di riconciliare le differenze tra il database e il sistema corrente. In questo modo si eviterà che le violazioni vengano visualizzate nei rapporti futuri. Questo processo di aggiornamento permette di risparmiare tempo, consentendo di aggiornare il database senza doverlo reinizializzare. #### Per aggiornare il database -1. Cambiate la pwd con la posizione in cui tripwire memorizza i file di report sul vostro sistema. Digitare: +1. Cambiate la pwd nella posizione in cui Tripwire memorizza i file di report sul vostro sistema. Digitare: - ``` + ```bash [root@localhost root]# cd /var/lib/tripwire/report/ ``` -2. Per prima cosa si utilizzerà la modalità di aggiornamento del database in modo interattivo. Digitare: +2. Per prima cosa si utilizzerà la modalità di aggiornamento del database in modo interattivo. Digitare: - ``` + ```bash [root@localhost report]# tripwire --update -Z low -r ``` Sostituire con il nome del file di report annotato in precedenza. - Il comando di cui sopra lancerà anche il vostro editor di testo predefinito (ad esempio, vi) che vi presenterà le cosiddette "caselle di aggiornamento". Potrebbe essere necessario scorrere il file. + Il comando di cui sopra lancerà anche il vostro editor di testo predefinito (ad esempio, `vi`), che vi presenterà le cosiddette "caselle di aggiornamento". Potrebbe essere necessario scorrere il file. - Le voci contrassegnate con una "[x]" implicano che il database deve essere aggiornato per quel particolare elemento. + Le voci contrassegnate con una "[x]" implicano che il database deve essere aggiornato con quel particolare oggetto. Rimuovere la "x" dal riquadro "[ ]" per impedire l'aggiornamento del database con i nuovi valori per la voce. Per salvare e uscire dall'editor di testo, utilizzare i tasti abituali. -3. Provate quindi a utilizzare la modalità di aggiornamento del database in modo non interattivo. es. si accettano tutte le voci del file di report senza che venga richiesto. Digitare: +3. Provate quindi a utilizzare la modalità di aggiornamento del database in modo non interattivo. cioè si accettano tutte le voci del file di report senza che venga richiesto. Digitare: - ``` + ```bash [root@localhost report]# tripwire --update -Z low -a -r ``` ### File di configurazione di Tripwire -Inizierete questi esercizi mettendo a punto il vostro file di configurazione. In un esercizio precedente è stato consigliato di rimuovere o eliminare tutte le versioni in chiaro del file di tripwire dal sistema. È possibile creare un'installazione leggermente più sicura di tripwire modificando alcune variabili nella configurazione di tripwire. file. ad esempio, si specificherà che tripwire deve sempre cercare le versioni binarie dei file di policy e di configurazione su un supporto rimovibile come un dischetto o un cdrom. +Inizierete questi esercizi mettendo a punto il vostro file di configurazione. In un esercizio precedente è stato consigliato di rimuovere o eliminare dal sistema tutte le versioni in chiaro del file di Tripwire. È possibile creare un'installazione di Tripwire leggermente più sicura modificando alcune variabili del file di configurazione di Tripwire. Si specificherà che Tripwire deve sempre cercare le versioni binarie dei file di policy e di configurazione su supporti rimovibili come dischetti o CDROM. -1. Cambiate la vostra pwd nella directory /etc/tripwire. +1. Cambiate la vostra pwd nella directory /etc/tripwire. -2. Generare una versione in chiaro del file di configurazione. Digitare: +2. Genera una versione in chiaro del file di configurazione. Digitare: - ``` + ```bash [root@localhost tripwire]# twadmin --print-cfgfile > twcfg.txt ``` 3. Aprire il file di configurazione creato in precedenza nell'editor di testo. Digitare: - ``` + ```bash [root@localhost tripwire]# vi twcfg.txt ``` Modificare il file in modo che assomigli al file di esempio qui sotto: - (NOTA: le nuove variabili aggiunte e modificate sono state evidenziate) - - ``` + ```bash 1 ROOT =/usr/sbin 2 POLFILE =/mnt/usbdrive/tw.pol @@ -785,44 +785,47 @@ Inizierete questi esercizi mettendo a punto il vostro file di configurazione. In 16 MAILPROGRAM =/usr/sbin/sendmail -oi -t ``` -4. Consultate la pagina man di "twconfig" per scoprire a cosa servono le seguenti variabili? + !!! question "Compito di laboratorio:" - ``` - LOOSEDIRECTORYCHECKING + Consultate la pagina man di "twconfig" per scoprire a cosa servono le seguenti variabili: - GLOBALEMAIL + ```txt + LOOSEDIRECTORYCHECKING - SYSLOGREPORTING - ``` + GLOBALEMAIL -5. Montate un supporto rimovibile nella directory /mnt/usbdrive. Digitare: + SYSLOGREPORTING + ``` - ``` +4. Montate un supporto rimovibile nella directory /mnt/usbdrive. Digitare: + + ```bash [root@localhost tripwire]# mount /dev/usbdrive /mnt/usbdrive ``` !!! note "Nota" - Se si sceglie di archiviare i file in una posizione diversa (ad esempio, un supporto Cdrom), è necessario apportare le modifiche necessarie ai comandi. + Se si sceglie di memorizzare i file in una posizione diversa (ad esempio un supporto Cdrom), apportare le modifiche necessarie ai comandi. -6. Trasferire la chiave del sito, la chiave locale e i file binari nella posizione specificata nel nuovo file di configurazione. Digitare: +5. Trasferire la chiave del sito, la chiave locale e i file binari nella posizione specificata nel nuovo file di configurazione. Digitare: - ``` + ```bash [root@localhost tripwire]# mv site.key tw.pol localhost.localdomain-local.key /mnt/usbdrive ``` -6. Creare una versione binaria del file di configurazione in chiaro. Digitare: +6. Creare una versione binaria del file di configurazione in chiaro. Digitare: - ``` + ```bash [root@localhost tripwire]# twadmin --create-cfgfile -S /mnt/usbdrive/site.key twcfg.txt* ``` + Il file `/etc/tripwire/tw.cfg` verrà creato per voi. -7. Testare la nuova configurazione. Smontare l'unità USB ed espellerla. +7. Testare la nuova configurazione. Smontare l'unità USB ed espellerla. -8. Provare a eseguire uno dei comandi di tripwire che richiede i file memorizzati nell'unità floppy. Digitare: +8. Provare a eseguire uno dei comandi di `tripwire` che richiede i file memorizzati nell'unità floppy. Digitare: - ``` + ```bash [root@localhost tripwire]# twadmin --print-polfile ### Error: File could not be opened. @@ -840,15 +843,19 @@ Inizierete questi esercizi mettendo a punto il vostro file di configurazione. In Si dovrebbe ottenere un errore simile a quello riportato sopra. -9. Montare il supporto in cui sono memorizzati i file di tripwire e ripetere il comando precedente. Il comando è stato eseguito correttamente questa volta? +9. Montare il supporto in cui sono memorizzati i file di tripwire e ripetere il comando precedente. + + !!! question "Domanda" + + Il comando è stato eseguito correttamente questa volta? -10. Cercare ed eliminare dal sistema tutte le versioni in testo semplice dei file di configurazione di tripwire creati finora. +10. Cercare ed eliminare dal sistema tutte le versioni in testo semplice dei file di configurazione di Tripwire creati finora. -Dover montare e smontare un supporto rimovibile ogni volta che si vuole amministrare un aspetto di tripwire potrebbe risultare una seccatura, ma il vantaggio potrebbe essere rappresentato dalla maggiore sicurezza. È assolutamente necessario considerare l'archiviazione di una versione incontaminata del database di tripwire su un supporto di sola lettura come un DVD. +Dover montare e smontare un supporto rimovibile ogni volta che si desidera amministrare un aspetto di Tripwire potrebbe risultare una seccatura, ma il vantaggio potrebbe essere rappresentato dalla maggiore sicurezza. È assolutamente necessario considerare l'archiviazione di una versione incontaminata del database di tripwire su un supporto di sola lettura come un DVD. ### ESERCIZI SUPPLEMENTARI -1. Configurate l'installazione di tripwire per eseguire un controllo di integrità ogni giorno alle 2 del mattino e inviare un rapporto del controllo di integrità via e-mail al superutente del sistema. +1. Configurate l'installazione di Tripwire per eseguire un controllo di integrità ogni giorno alle 2 del mattino e inviare un rapporto del controllo di integrità via e-mail al superutente del sistema. !!! hint "Suggerimento" diff --git a/docs/labs/security/lab8-iptables.it.md b/docs/labs/security/lab8-iptables.it.md index 3091544c8e..1f5bfade3b 100644 --- a/docs/labs/security/lab8-iptables.it.md +++ b/docs/labs/security/lab8-iptables.it.md @@ -3,7 +3,7 @@ Title: Lab 8 - iptables author: Wale Soyinka contributors: - - - -# Lab 8: `iptables` +# Laboratorio 8: `iptables` ## Obiettivi @@ -30,26 +30,25 @@ Di seguito vengono descritte alcune terminologie comuni utilizzate nelle discuss Nella maggior parte dei kernel Linux sono definite tre tabelle indipendenti. Le tabelle presenti in qualsiasi momento dipendono dalle opzioni di configurazione del kernel e dai moduli presenti. Le tabelle sono: -* filter: Questa è la tabella principale e predefinita (se non viene passata l'opzione -t). Contiene le concatenazioni incorporate: +- filter: Questa è la tabella principale e predefinita (se non viene passata l'opzione -t). Contiene le concatenazioni incorporate: - * **INPUT** (per i pacchetti che entrano nella sistema) - * **FORWARD** (per i pacchetti che vengono instradati attraverso il sistema) - * **OUTPUT** (per i pacchetti generati localmente). + - **INPUT** (per i pacchetti che entrano nella sistema) + - **FORWARD** (per i pacchetti che vengono instradati attraverso il sistema) + - **OUTPUT** (per i pacchetti generati localmente). -* nat: Questa tabella viene consultata quando si incontra un pacchetto che crea una nuova connessione. Si compone delle seguenti tre concatenazioni integrate: +- nat: Questa tabella viene consultata quando si incontra un pacchetto che crea una nuova connessione. Si compone delle seguenti tre concatenazioni integrate: - * **PREROUTING** (per modificare i pacchetti non appena arrivano) - * **OUTPUT** (per alterare i pacchetti generati localmente prima dell'instradamento) - * **POSTROUTING** (per modificare i pacchetti quando stanno per essere spediti) + - **PREROUTING** (per modificare i pacchetti non appena arrivano) + - **OUTPUT** (per alterare i pacchetti generati localmente prima dell'instradamento) + - **POSTROUTING** (per modificare i pacchetti quando stanno per essere spediti) -* mangle: Questa tabella viene utilizzata per l'alterazione specializzata dei pacchetti. Dispone delle seguenti 5 concatenazioni integrate: - - * **PREROUTING** (per alterare i pacchetti in arrivo prima dell'instradamento) - * **OUTPUT** (per alterare i pacchetti generati localmente prima dell'instradamento) - * **INPUT** (per i pacchetti che entrano nel sistema) - * **FORWARD** (per alterare i pacchetti che vengono instradati attraverso il sistema) - * **POSTROUTING** (per modificare i pacchetti quando stanno per essere spediti) +- mangle: Questa tabella viene utilizzata per l'alterazione specializzata dei pacchetti. Dispone delle seguenti 5 concatenazioni integrate: + - **PREROUTING** (per alterare i pacchetti in arrivo prima dell'instradamento) + - **OUTPUT** (per alterare i pacchetti generati localmente prima dell'instradamento) + - **INPUT** (per i pacchetti che entrano nel sistema) + - **FORWARD** (per alterare i pacchetti che vengono instradati attraverso il sistema) + - **POSTROUTING** (per modificare i pacchetti quando stanno per essere spediti) ### CONCATENAZIONI @@ -57,9 +56,9 @@ Una concatenazione è un elenco di regole che possono corrispondere a un insieme ### OBIETTIVI -Una regola del firewall specifica i criteri per un pacchetto e un obiettivo. Se il pacchetto non corrisponde, viene esaminata la regola successiva della concatenazione; se invece corrisponde, la regola successiva è specificata dal valore dell'obiettivo, che può essere il nome di una concatenazione definita dall'utente o uno dei valori speciali ACCEPT, DROP, QUEUE o RETURN. +Una regola del firewall specifica i criteri per un pacchetto e una destinazione. Se il pacchetto non corrisponde, viene esaminata la regola successiva della concatenazione; se invece corrisponde, la regola successiva è specificata dal valore dell'obiettivo, che può essere il nome di una concatenazione definita dall'utente o uno dei valori speciali ACCEPT, DROP, QUEUE o RETURN. -``` +```bash Usage: iptables -[ACD] chain rule-specification [options] iptables -I chain [rulenum] rule-specification [options] @@ -74,59 +73,59 @@ Usage: iptables -[ACD] chain rule-specification [options] Commands: Either long or short options are allowed. - --append -A chain Append to chain - --check -C chain Check for the existence of a rule - --delete -D chain Delete matching rule from chain + --append -A chain Append to chain + --check -C chain Check for the existence of a rule + --delete -D chain Delete matching rule from chain --delete -D chain rulenum - Delete rule rulenum (1 = first) from chain + Delete rule rulenum (1 = first) from chain --insert -I chain [rulenum] - Insert in chain as rulenum (default 1=first) + Insert in chain as rulenum (default 1=first) --replace -R chain rulenum - Replace rule rulenum (1 = first) in chain + Replace rule rulenum (1 = first) in chain --list -L [chain [rulenum]] - List the rules in a chain or all chains + List the rules in a chain or all chains --list-rules -S [chain [rulenum]] - Print the rules in a chain or all chains - --flush -F [chain] Delete all rules in chain or all chains + Print the rules in a chain or all chains + --flush -F [chain] Delete all rules in chain or all chains --zero -Z [chain [rulenum]] - Zero counters in chain or all chains - --new -N chain Create a new user-defined chain + Zero counters in chain or all chains + --new -N chain Create a new user-defined chain --delete-chain - -X [chain] Delete a user-defined chain + -X [chain] Delete a user-defined chain --policy -P chain target - Change policy on chain to target + Change policy on chain to target --rename-chain -E old-chain new-chain Change chain name, (moving any references) Options: - --ipv4 -4 Nothing (line is ignored by ip6tables-restore) - --ipv6 -6 Error (line is ignored by iptables-restore) -[!] --protocol -p proto protocol: by number or name, eg. `tcp' -[!] --source -s address[/mask][...] - source specification + --ipv4 -4 Nothing (line is ignored by ip6tables-restore) + --ipv6 -6 Error (line is ignored by iptables-restore) +[!] --protocol -p proto protocol: by number or name, eg. `tcp' +[!] --source -s address[/mask][...] + source specification [!] --destination -d address[/mask][...] - destination specification + destination specification [!] --in-interface -i input name[+] - network interface name ([+] for wildcard) + network interface name ([+] for wildcard) --jump -j target - target for rule (may load target extension) + target for rule (may load target extension) --goto -g chain - jump to chain with no return - --match -m match - extended match (may load extension) - --numeric -n numeric output of addresses and ports + jump to chain with no return + --match -m match + extended match (may load extension) + --numeric -n numeric output of addresses and ports [!] --out-interface -o output name[+] - network interface name ([+] for wildcard) - --table -t table table to manipulate (default: `filter') - --verbose -v verbose mode - --wait -w [seconds] maximum wait to acquire xtables lock before give up - --line-numbers print line numbers when listing - --exact -x expand numbers (display exact values) -[!] --fragment -f match second or further fragments only - --modprobe= try to insert modules using this command - --set-counters -c PKTS BYTES set the counter during insert/append -[!] --version -V print package version. + network interface name ([+] for wildcard) + --table -t table table to manipulate (default: `filter') + --verbose -v verbose mode + --wait -w [seconds] maximum wait to acquire xtables lock before give up + --line-numbers print line numbers when listing + --exact -x expand numbers (display exact values) +[!] --fragment -f match second or further fragments only + --modprobe= try to insert modules using this command + --set-counters -c PKTS BYTES set the counter during insert/append +[!] --version -V print package version. ``` @@ -142,31 +141,31 @@ Senza ulteriori indugi, passiamo subito all'uso di `iptables`. 1. Mentre si è connessi come superutente, elencare tutte le regole nella tabella dei filtri. Digitare: - ``` + ```bash [root@serverXY root]# iptables -L ``` -2. Per visualizzare un output più dettagliato, digitare: +2. Per visualizzare un output più dettagliato, digitare: - ``` + ```bash [root@serverXY root]# iptables -L -v ``` -3. Visualizzare solo le regole della concatenazione INPUT. Digitare: +3. Visualizzare solo le regole della concatenazione INPUT. Digitare: - ``` + ```bash [root@serverXY root]# iptables -v -L INPUT ``` -4. Visualizzare tutte le regole della tabella mangle. Digitare: +4. Visualizzare tutte le regole della tabella mangle. Digitare: - ``` + ```bash [root@serverXY root]# iptables -L -t mangle ``` -5. Visualizzare tutte le regole della tabella nat. Digitare: +5. Visualizzare tutte le regole della tabella nat. Digitare: - ``` + ```bash [root@serverXY root]# iptables -L -t nat ``` @@ -174,21 +173,21 @@ Senza ulteriori indugi, passiamo subito all'uso di `iptables`. 1. Pulisce (o elimina) tutte le regole che "potrebbero" essere attualmente caricate. Digitare: - ``` + ```bash [root@serverXY root]# iptables --flush ``` #### Per creare la propria concatenazione -1. Create la vostra concatenazione personalizzata e chiamatela "mychain". Digitare: +1. Create la vostra concatenazione personalizzata e chiamatela "mychain". Digitare: - ``` + ```bash [root@serverXY root]# iptables -N mychain ``` 2. Elencare le regole della concatenazione creata in precedenza. Digitare: - ``` + ```bash [root@serverXY root]# iptables -L mychain Chain mychain (0 references) @@ -200,21 +199,23 @@ Senza ulteriori indugi, passiamo subito all'uso di `iptables`. 1. Per prima cosa, provare a eliminare la concatenazione INPUT incorporata. Digitare: - ``` + ```bash [root@serverXY root]# iptables -X INPUT ``` - Qual è stato il risultato? + !!! question "Domanda" + + Qual è stato il suo risultato? 2. Successivamente, provare a eliminare la concatenazione creata in precedenza. Digitare: - ``` + ```bash [root@serverXY root]# iptables -X mychain ``` -3. Riprovate a elencare le regole della concatenazione che avete appena eliminato. Digitare: +3. Riprovate a elencare le regole della concatenazione che avete appena eliminato. Digitare: - ``` + ```bash [root@serverXY root]# iptables -L mychain ``` @@ -228,7 +229,7 @@ Questo esercizio vi insegnerà a creare regole di filtraggio dei pacchetti legge 1. Prima di iniziare, accertatevi di poter eseguire il ping del vostro sistema partner e che anche quest'ultimo possa eseguire il ping con successo. Digitare: - ``` + ```bash [root@serverXY root]# ping -c 2 serverPR @@ -240,15 +241,15 @@ Questo esercizio vi insegnerà a creare regole di filtraggio dei pacchetti legge ............................................... ``` -2. Eliminare tutte le regole esistenti. Digitare: +2. Eliminare tutte le regole esistenti. Digitare: - ``` + ```bash [root@serverXY root]# iptables -F ``` 3. Creare una regola per bloccare tutti i pacchetti di tipo icmp in uscita verso qualsiasi destinazione. Digitare: - ``` + ```bash [root@serverXY root]# iptables -A OUTPUT -o eth0 -p icmp -j DROP ``` @@ -256,7 +257,7 @@ Questo esercizio vi insegnerà a creare regole di filtraggio dei pacchetti legge 4. Verificate l'effetto della regola precedente provando a eseguire il ping del serverPR. Digitare: - ``` + ```bash [root@serverXY root]# ping -c 2 serverPR PING serverPR (10.0.5.8) 56(84) byte di dati. @@ -266,9 +267,9 @@ Questo esercizio vi insegnerà a creare regole di filtraggio dei pacchetti legge ping: sendmsg: Operation not permitted ``` -5. Visualizzare la regola appena creata. Digitare: +5. Visualizzare la regola appena creata. Digitare: - ``` + ```bash [root@serverXY root]# iptables -vL OUTPUT Chain OUTPUT (policy ACCEPT 21221 packets, 2742K byte) @@ -278,11 +279,15 @@ Questo esercizio vi insegnerà a creare regole di filtraggio dei pacchetti legge 93 7812 DROP icmp -- any eth0 anywhere anywhere ``` -6. Cancellare tutte le regole e riprovare il comando ping da entrambi i sistemi. Successo o fallimento? +6. Svuotare tutte le regole e riprovare il comando ping da entrambi i sistemi. + + !!! question "Domanda" + + Successo o fallimento? 7. Ora create un'altra regola che elimini i pacchetti icmp provenienti da uno specifico indirizzo IP indesiderato (ad esempio 172.16.0.44). Digitare: - ``` + ```bash [root@serverXY root]# iptables -A INPUT -i eth0 -p icmp --source 172.16.0.44 -j DROP ``` @@ -292,7 +297,7 @@ Questo esercizio vi insegnerà a creare regole di filtraggio dei pacchetti legge 9. Invece di eliminare tutte le regole nella tua tabella. Eliminare solo la regola creata in precedenza. A tal fine è necessario conoscere il numero della regola. Per conoscere il numero della regola, digitare: - ``` + ```bash [root@serverXY root]# iptables -vL INPUT --line-numbers Chain INPUT (policy ACCEPT 31287 packets, 9103K bytes) @@ -307,7 +312,7 @@ Questo esercizio vi insegnerà a creare regole di filtraggio dei pacchetti legge 10. Utilizzando il numero di riga che corrisponde alla regola che si desidera eliminare, è possibile eliminare la regola specifica (riga numero 1) nella catena INPUT eseguendo: - ``` + ```bash [root@serverXY root]# iptables -D INPUT 1 ``` @@ -321,7 +326,7 @@ Nei passi successivi esamineremo l'individuazione e il filtraggio del traffico d 1. Avviare il server ftp configurato e abilitato in uno dei laboratori precedenti. Digitare: - ``` + ```bash [root@serverXY root]# *service vsftpd restart* Shutting down vsftpd: [ OK ] @@ -331,9 +336,9 @@ Nei passi successivi esamineremo l'individuazione e il filtraggio del traffico d 2. Chiedete al vostro partner di provare ad accedere come utente anonimo al vostro server ftp. Assicuratevi che il vostro partner sia in grado di accedere con successo dal serverPR: fatelo *prima* di passare alla fase successiva. -3. Mentre il partner è ancora connesso, creare una regola per disabilitare tutto il traffico di tipo ftp proveniente dal serverPR. Digitare: +3. Mentre il partner è ancora connesso, creare una regola per disabilitare tutto il traffico di tipo ftp proveniente dal serverPR. Digitare: - ``` + ```bash [root@serverXY root]# iptables -A INPUT -i eth0 -s 172.16.0.z -p tcp --dport 21 -j DROP* ``` @@ -341,15 +346,23 @@ Nei passi successivi esamineremo l'individuazione e il filtraggio del traffico d 4. Non appena si esegue il comando precedente, lo stack netfilter lo mette in atto immediatamente. Per verificarlo, chiedete al vostro interlocutore di provare qualsiasi comando ftp mentre è ancora connesso al vostro server ftp, ad esempio `ls`. Successo o fallimento? - Se non riesce, chiedete al vostro interlocutore di provare a disconnettersi e di provare ad accedere di nuovo da zero. Successo o fallimento? + !!! question "Attività di laboratorio:" + + Successo o fallimento? + + Se non riesce, chiedete al vostro interlocutore di provare a disconnettersi e di provare ad accedere di nuovo da zero, per poi verificare di nuovo il successo. -5. Chiedete a un'altra persona che NON sia il vostro partner di provare ad accedere al vostro server ftp in modo anonimo. Si può anche chiedere a qualcuno di hq.example.org di provare a connettersi al sito ftp. Successo o fallimento? +5. Chiedete a un'altra persona che NON sia il vostro partner di provare ad accedere al vostro server ftp in modo anonimo. Si può anche chiedere a qualcuno di hq.example.org di provare a connettersi al sito ftp. + + !!! question "Domanda" + + Successo o fallimento? -6. Abilitare e avviare il server web sul serverXY. +6. Abilitare e avviare il server web sul serverXY. -7. Assicuratevi che altre persone possano visitare il vostro sito web utilizzando un browser. Creare una regola per bloccare il traffico http da hq.example.org al computer locale. +7. Assicuratevi che altre persone possano visitare il vostro sito web utilizzando un browser. Creare una regola per bloccare il traffico http da hq.example.org al computer locale. -### Esercizio 3 +### Exercise 3 Basi sull'Inoltro del Pacchetto @@ -377,7 +390,6 @@ v. L'interfaccia eth1 ha un indirizzo IP di 10.0.0.z con una maschera di rete di vi. Di aver completato con successo il "Laboratorio 2" e di aver compreso i concetti di base in esso contenuti. - ServerPR Si fanno le seguenti ipotesi sul sistema del partner. @@ -396,35 +408,39 @@ Le consuete icone per serverXY e serverPR sono state sostituite con le icone di #### Per creare la regola di inoltro -1. Assicurarsi che la rete sia cablata fisicamente come illustrato sopra. +1. Assicurarsi che la rete sia cablata fisicamente come illustrato sopra. 2. Assegnare a tutte le interfacce l'indirizzo IP, la netmask e il gateway appropriati. -3. Pulire tutte le regole di iptables attualmente caricate. +3. Pulire tutte le regole di iptables attualmente caricate. !!! note "Nota" Eliminare le tabelle non è sempre essenziale od obbligatorio. Avrete notato che all'inizio di alcuni degli esercizi svolti finora, abbiamo specificato che è necessario pulire le tabelle esistenti. Questo per garantire che si parta da zero e che non ci siano regole errate nascoste da qualche parte nelle tabelle che potrebbero non funzionare correttamente. Normalmente si possono caricare centinaia di regole contemporaneamente, con funzioni diverse. -4. Chiedete al vostro partner del serverPR di provare a pingare 172.16.0.100 (hq.example.org); l'operazione dovrebbe fallire perché ora siete il gateway predefinito del serverPR e *non avete* ancora abilitato il routing sul vostro sistema. +4. Chiedete al vostro partner del serverPR di provare a pingare 172.16.0.100 (hq.example.org); l'operazione dovrebbe fallire perché ora siete il gateway predefinito del serverPR e *non avete* ancora abilitato il routing sul vostro sistema. -5. Come root sul serverXY digitare: +5. Come root sul serverXY digitare: - ``` + ```bash [root@serverXY root]# *iptables --table nat -A POSTROUTING -o eth0 -j MASQUERADE* ``` -6. Ripetere ora il passaggio 4. Successo o fallimento? +6. Ripetere ora il passaggio 4. -7. Quanto sopra dovrebbe essere fallito. Occorre anche abilitare l'inoltro dei pacchetti nel kernel in esecuzione. Digitare: + !!! question "Domanda" + + Successo o fallimento? - ``` +7. Quanto sopra dovrebbe essere fallito. Occorre anche abilitare l'inoltro dei pacchetti nel kernel in esecuzione. Digitare: + + ```bash [root@serverXY root]# *echo 1 > /proc/sys/net/ipv4/ip_forward* ``` -8. Per rendere permanente la modifica al kernel tra un riavvio e l'altro, creare la voce seguente nel file "/etc/sysctl.conf": +8. Per rendere permanente la modifica al kernel tra un riavvio e l'altro, creare la voce seguente nel file "/etc/sysctl.conf": - ``` + ```bash net.ipv4.ip_forward = 0 ``` @@ -436,31 +452,28 @@ Per evitare ciò, è necessario un meccanismo per scrivere o salvare le regole t 1. Usate il comando `iptables-save` per salvare tutte le modifiche al file /etc/sysconfig/iptables. Digitare: - ``` + ```bash [root@serverXY root]# *iptables-save > /etc/sysconfig/iptables* ``` - !!! tip "Suggerimento" Le cose che si possono fare con `iptables` sono limitate solo dalla propria immaginazione. In questo laboratorio abbiamo appena scalfito la superficie. Speriamo di aver scalfito abbastanza la superficie per permettervi di dare sfogo alla vostra immaginazione. -# Punti Aggiuntivi - -1. Quale opzione è necessaria per ottenere una versione più dettagliata di questo comando? *iptables -L -t nat* ? +## Punti extra -2. Qual è il comando per visualizzare le regole della concatenazione OUTPUT? +Ecco alcuni modi aggiuntivi per esplorare `iptables`: -3. Su quale porta è in "normalmente" in ascolto il servizio ftp? +!!! question "Domande e compiti:" -4. Qual è il comando per creare una concatenazione chiamata "mynat-chain" nella tabella nat? + 1. Quale opzione è necessaria per ottenere una versione più dettagliata di questo comando? *iptables -L -t nat* ? -5. Fate una ricerca online ed elencate i nomi di alcuni strumenti o applicazioni di facile utilizzo che possono essere usati per gestire il sottosistema firewall sui sistemi basati su Linux. + 2. Qual è il comando per visualizzare le regole della concatenazione OUTPUT? -6a. Creare una regola `iptables` per bloccare il traffico http da hq.example.org alla macchina locale. + 3. Su quale porta è in ascolto "normalmente" il servizio ftp? -6b. Qual è la nota porta di ascolto dei server web? + 4. Qual è il comando per creare una concatenazione chiamata "mynat-chain" nella tabella nat? -6c. Scrivete il comando completo per raggiungere questo obiettivo? + 5. Fate una ricerca online ed elencate i nomi di alcuni strumenti o applicazioni di facile utilizzo che possono essere usati per gestire il sottosistema firewall sui sistemi basati su Linux. -6d. Convertire o tradurre il comando che hai scritto qui sopra nel suo equivalente in parole povere? + 6. Creare una regola `iptables` per bloccare il traffico http da hq.example.org alla macchina locale. Qual è la porta più conosciuta su cui ascoltano i server web? Scrivete il comando completo per raggiungere questo obiettivo? Convertite o traducete il comando che scritto sopra nel suo equivalente in linguaggio semplice. From 7008b332a134fa49f92f743a43196f8c025d117a Mon Sep 17 00:00:00 2001 From: ambaradan <87865413+ambaradan@users.noreply.github.com> Date: Wed, 30 Jul 2025 15:53:03 +0200 Subject: [PATCH 086/164] fixed a keyboard shortcut - lab9-cryptography (#2808) The shortcut was still encoded using the old method `..` --- docs/labs/security/lab9-cryptography.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/labs/security/lab9-cryptography.md b/docs/labs/security/lab9-cryptography.md index 2fd1cfeae3..585b3195ee 100644 --- a/docs/labs/security/lab9-cryptography.md +++ b/docs/labs/security/lab9-cryptography.md @@ -977,7 +977,7 @@ The public is stored in a file with the same file name as the private key but wi Created directory '/home/ying/.ssh'. ``` - You'll be prompted twice to enter a passphrase. Input a good and reasonably difficult to guess passphrase. Press ENTER after each prompt. + You'll be prompted twice to enter a passphrase. Input a good and reasonably difficult to guess passphrase. Press ++enter++ after each prompt. ```bash Enter passphrase (empty for no passphrase): ***** From 08b5dd14159e4957dbd7925f4870949d8132bd0f Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Wed, 30 Jul 2025 09:54:20 -0500 Subject: [PATCH 087/164] Fix scp command string in admonition `lab-cryptography.md` (#2809) * fix code blocks, because the code was not in code blocks, the period was auto-moved to remove the space. This made the code incorrect. * fixed another code block nearby --- docs/labs/security/lab9-cryptography.md | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/docs/labs/security/lab9-cryptography.md b/docs/labs/security/lab9-cryptography.md index 585b3195ee..e177ba3120 100644 --- a/docs/labs/security/lab9-cryptography.md +++ b/docs/labs/security/lab9-cryptography.md @@ -905,12 +905,16 @@ usage: scp [-346BCpqrTv] [-c cipher] [-F ssh_config] [-i identity_file] !!! Question What is the difference between the variations of these 2 commands and under what circumstances will they have the same result? - - - scp me@serverPR:/home/me/myexport. + + ```bash + scp me@serverPR:/home/me/myexport . + ``` and - - scp serverPR:/home/me/myexport. + ```bash + scp serverPR:/home/me/myexport . + ``` 5. What is the command to copy over all the files under “/home/me/.gnugp/” on serverPR? @@ -930,11 +934,15 @@ usage: scp [-346BCpqrTv] [-c cipher] [-F ssh_config] [-i identity_file] What is the slight but significant difference between the variations of the 2 previous commands? And what is the result of each command? - - `scp -r ying@localhost:/home/ying/ ying_home_directory_on_serverPR` - + ```bash + scp -r ying@localhost:/home/ying/ ying_home_directory_on_serverPR + ``` + and - - `scp -r ying@localhost:/home/ying ying_home_directory_on_serverPR` + ```bash + scp -r ying@localhost:/home/ying ying_home_directory_on_serverPR + ``` 8. Use `ls -alR` command to view a listing of the contents of the 2 previous steps. Type: From 170e69260c5be49d4138403af80ea2a2c8a2b51f Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Wed, 30 Jul 2025 12:42:13 -0700 Subject: [PATCH 088/164] New Crowdin updates (#2810) * New translations lab9-cryptography.md (Italian) * New translations tailscale_vpn.md (German) --- docs/guides/security/tailscale_vpn.de.md | 80 ++ docs/labs/security/lab9-cryptography.it.md | 1086 ++++++++++++-------- 2 files changed, 730 insertions(+), 436 deletions(-) create mode 100644 docs/guides/security/tailscale_vpn.de.md diff --git a/docs/guides/security/tailscale_vpn.de.md b/docs/guides/security/tailscale_vpn.de.md new file mode 100644 index 0000000000..3ffa286775 --- /dev/null +++ b/docs/guides/security/tailscale_vpn.de.md @@ -0,0 +1,80 @@ +--- +title: Tailscale VPN +author: Neel Chauhan +contributors: Steven Spencer, Ganna Zhyrnova +tested_with: 9.3 +tags: + - Sicherheit + - vpn +--- + +# Tailscale VPN + +## Einleitung + +[Tailscale](https://tailscale.com/) ist ein Zero-Config-, End-to-End-verschlüsseltes Peer-to-Peer-VPN basierend auf Wireguard. Tailscale unterstützt alle wichtigen Desktop- und mobilen Betriebssysteme. + +Im Vergleich zu anderen VPN-Lösungen benötigt Tailscale keine offenen TCP/IP-Ports und kann hinter Network Address Translation oder einer Firewall arbeiten. + +## Voraussetzungen + +Für die Verwendung dieses Verfahrens gelten die folgenden Mindestanforderungen: + +- Die Möglichkeit, Befehle als Root-Benutzer auszuführen oder `sudo` zu verwenden, um Berechtigungen zu erhöhen +- Ein `Tailscale`-Account + +## `Tailscale`-Installation + +Um Tailscale zu installieren, müssen wir zuerst das `dnf`-Repository hinzufügen (Hinweis: Wenn Sie Rocky Linux 8.x oder 10.x verwenden, ersetzen Sie es durch 8 bzw. 10): + +```bash +dnf config-manager --add-repo https://pkgs.tailscale.com/stable/rhel/9/tailscale.repo +``` + +Dann `Tailscale` installieren: + +```bash +dnf install tailscale +``` + +## `Tailscale`-Konfiguration + +Wenn die Pakete installiert sind, müssen Sie Tailscale aktivieren und konfigurieren. So aktivieren Sie den Tailscale-Daemon: + +```bash +systemctl enable --now tailscaled +``` + +Anschließend authentifizieren Sie sich bei Tailscale: + +```bash +tailscale up +``` + +Sie erhalten eine URL zur Authentifizierung. Besuchen Sie die Seite in einem Browser und melden Sie sich bei Tailscale an: + +![Tailscale login screen](../images/tailscale_1.png) + +Als nächstes gewähren Sie Zugriff auf Ihren Server. Klicken Sie dazu auf **Connect**: + +![Tailscale grant access dialog](../images/tailscale_2.png) + +Wenn Sie den Zugriff gewährt haben, wird ein Erfolgsdialogfeld angezeigt: + +![Tailscale login successful dialog](../images/tailscale_3.png) + +Sobald Ihr Server bei Tailscale authentifiziert ist, erhält er eine Tailscale-IPv4-Adresse: + +```bash +tailscale ip -4 +``` + +Es bekommt außerdem eine RFC 4193 (Unique Local Address) Tailscale IPv6-Adresse: + +```bash +tailscale ip -6 +``` + +## Zusammenfassung + +Herkömmliche VPN-Dienste, die ein VPN-Gateway verwenden, sind zentralisiert. Dies erfordert eine manuelle Konfiguration, das Aufsetzen Ihrer Firewall und die Einrichtung von Benutzerkonten. Tailscale löst dieses Problem durch sein Peer-to-Peer-Modell in Kombination mit Zugriffskontrolle auf Netzwerkebene. diff --git a/docs/labs/security/lab9-cryptography.it.md b/docs/labs/security/lab9-cryptography.it.md index 6f7d093c75..b10bc0da7b 100644 --- a/docs/labs/security/lab9-cryptography.it.md +++ b/docs/labs/security/lab9-cryptography.it.md @@ -1,61 +1,68 @@ +- - - +title: Lab 9 - Crittografia author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova +- - - -# Laboratorio 9: Criptografia + +# Laboratorio 9: Crittografia ## Obiettivi -Dopo aver completato questo lavoro di laboratorio, sarete in grado di: +Dopo aver completato questo laboratorio, sarete in grado di: -- applicare i concetti crittografici alla protezione dei dati e alla comunicazione +- applicare i concetti di crittografia per proteggere i dati e le comunicazioni Tempo stimato per completare questo laboratorio: 120 minuti +> Tre possono mantenere un segreto, se due di loro sono morti... +> +> -- Benjamin Franklin ## Termini e definizioni Comuni di Crittografia ### Crittografia -Nell'uso quotidiano generale, la Crittografia è l'atto o l'arte di scrivere in caratteri segreti. In gergo tecnico potrebbe esser definita come la scienza di usare la matematica per crittografare e decrittografare i dati. +Nell'uso comune, la crittografia è l'atto o l'arte di scrivere in caratteri segreti. In gergo tecnico può essere definita come la scienza che utilizza la matematica per criptare e decriptare i dati. -### Criptanalisi +### Crittoanalisi -La criptanalisi è lo studio di come compromettere (sconfiggere) i meccanismi crittografici. È la scienza di decifrare il codice, decodificare segreti, violare schemi d'autenticazione e, in generale, violare i protocolli crittografici. +La crittoanalisi è lo studio di come compromettere (superare) i meccanismi crittografici. È la scienza del cracking dei codici, della decodifica dei segreti, della violazione degli schemi di autenticazione e, in generale, della violazione dei protocolli crittografici. -### Criptologia +### Crittologia -La criptologia è la disciplina di crittografia e criptanalisi combinate. La criptologia è la branca della matematica che studia i fondamenti matematici dei metodi crittografici. +La criptologia è la disciplina che combina crittografia e crittoanalisi. La crittologia è la branca della matematica che studia i concetti matematici alla base dei metodi crittografici. -### Cifratura +### Codifica -La crittografia trasforma i dati in una forma quasi impossibile da leggere senza le opportune conoscenze (ad esempio, una chiave). Il suo scopo è quello di garantire la privacy, tenendo nascoste le informazioni a chi non sono destinate. +La cifratura trasforma i dati in una forma quasi impossibile da leggere senza le opportune conoscenze (ad esempio, una chiave). Il suo scopo è quello di garantire la privacy, tenendo nascoste le informazioni a chi non sono destinate. -### Decrittografia +### Decrittazione -La decrittazione è l'operazione inversa alla crittografia: trasforma i dati criptati in una forma intelligibile. +La decrittazione è l'operazione inversa alla crittografia: trasforma i dati criptati in una forma comprensibile. -### Codifica +### Cifrario -Un metodo di crittografia e decrittografia è detto codifica. +Un metodo di crittografia e decrittografia è chiamato cifrario. -Funzioni di Hash (Algoritmi di Digest) +Funzioni di Hash (algoritmi di Digest) -Le funzioni di hash crittografiche sono usate in vari contesti, ad esempio, per calcolare il digest del messaggio, creando una firma digitale. Una funzione hash comprime i bit di un messaggio in un valore hash di dimensioni fisse per distribuire uniformemente i possibili messaggi tra i possibili valori hash. Una funzione hash crittografica esegue questa operazione in modo tale da rendere estremamente difficile la creazione di un messaggio che corrisponda a un determinato valore hash. Di seguito sono riportati alcuni esempi delle funzioni hash più note e utilizzate. +Le funzioni hash crittografiche sono utilizzate in vari contesti, ad esempio per calcolare il digest del messaggio quando si effettua una firma digitale. Una funzione hash comprime i bit di un messaggio in un valore hash di dimensioni fisse per distribuire uniformemente i possibili messaggi tra i possibili valori hash. Una funzione hash crittografica esegue questa operazione in modo tale da rendere estremamente difficile la creazione di un messaggio che corrisponda a un determinato valore hash. Di seguito sono riportati alcuni esempi delle funzioni hash più note e utilizzate. -**a)** - **SHA-1 (Secure Hash Algorithm)** -È un algoritmo di hash crittografico pubblicato dal governo degli Stati Uniti. Produce un valore di hash a 160 bit da una stringa di lunghezza arbitraria. È considerata molto buona. +**a)** - **SHA-1 (Secure Hash Algorithm)** -È un algoritmo di hash crittografico pubblicato dal governo degli Stati Uniti. Produce un valore hash di 160 bit da una stringa di lunghezza arbitraria. Viene considerato come molto buono. -**b)**- **MD5 (Message Digest Algorithm 5)** - è un algoritmo di hash crittografico sviluppato dai Laboratori RSA. È utilizzabile per eseguire l'hashing di una stringa di byte di lunghezza arbitraria in un valore a 128 bit. +**b)**- **MD5 (Message Digest Algorithm 5)** - è un algoritmo di hash crittografico sviluppato dai Laboratori RSA. Può essere utilizzato per eseguire l'hash di una stringa di byte di lunghezza arbitraria in un valore di 128 bit. ### Algoritmo -Descrive una procedura di risoluzione di un problema passo dopo passo, in particolare una procedura computazionale ricorsiva consolidata per la risoluzione di un problema in un numero finito di passi. Tecnicamente, un algoritmo deve raggiungere un risultato dopo un numero finito di passaggi. L'efficienza di un algoritmo è misurabile dal numero di passaggi elementari che richiede per risolvere il problema. Esistono due classi di algoritmi basati sulle chiavi. Che sono: +Descrive una procedura di risoluzione di un problema passo dopo passo, in particolare una procedura computazionale ricorsiva consolidata per la risoluzione di un problema in un numero finito di passaggi. Tecnicamente, un algoritmo deve raggiungere un risultato dopo un numero definito di passaggi. L'efficienza di un algoritmo può essere misurata come il numero di passi elementari necessari per risolvere il problema. Esistono due classi di algoritmi basati sulle chiavi. Essi sono: **a) **-- **Algoritmi di crittografia simmetrica (chiave segreta)** -Gli algoritmi simmetrici utilizzano la stessa chiave per la crittografia e la decrittografia (o la chiave di decrittografia è facilmente ricavabile dalla chiave di crittografia). Gli algoritmi a chiave segreta usano la stessa chiave sia per la crittografia che per la decrittografia (o una che sia facilmente derivabile dall'altra). Questo è l'approccio più diretto alla crittografia dei dati, è matematicamente meno complesso della crittografia a chiave pubblica. Gli algoritmi simmetrici possono esser suddivisi in cifrature di flusso e cifrature a blocchi. Le cifrature di flusso possono crittografare un singolo bit di testo semplice per volta, mentre le cifrature a blocchi prendono un numero di bit (tipicamente 64 bit nelle cifrature moderne) e li crittografano come un'unità singola. Gli algoritmi simmetrici sono molto più veloci da eseguire su un computer rispetto a quelli asimmetrici. +Gli algoritmi simmetrici utilizzano la stessa chiave per la crittografia e la decrittografia (o la chiave di decrittografia è facilmente ricavabile dalla chiave di crittografia). Gli algoritmi a chiave segreta utilizzano la stessa chiave sia per la crittografia che per la decrittografia (o una è facilmente derivabile dall'altra). È l'approccio più semplice alla crittografia dei dati, in quanto è matematicamente meno complicato della crittografia a chiave pubblica. Gli algoritmi simmetrici possono esser suddivisi in cifrature di flusso e cifrature a blocchi. I cifrari a flusso possono criptare un singolo bit di testo in chiaro alla volta, mentre quelli a blocco prendono diversi bit (in genere 64 bit nei cifrari moderni) e li criptano come un'unica unità. Gli algoritmi simmetrici sono molto più veloci da eseguire su un computer rispetto a quelli asimmetrici. Esempi di algoritmi simmetrici sono: AES, 3DES, Blowfish, CAST5, IDEA e Twofish. -**b) -- Algoritmi asimmetrici (Algoritmi a Chiave Pubblica)** +**b) -- Algoritmi asimmetrici (algoritmi a chiave pubblica)** -Gli algoritmi asimmetrici, d'altra parte, usano una chiave differente per la crittografia e la decrittografia e la chiave decrittografica non è derivabile dalla chiave crittografica. Le cifrature asimmetriche permettono alla chiave crittografica di essere pubblica, consentendo a chiunque di crittografarla, mentre solo il destinatario giusto (che conosce la chiave di decrittografia), può decriptare il messaggio. La chiave di crittografia è detta anche chiave pubblica, mentre la chiave di decrittografia è la chiave privata o segreta. +Gli algoritmi asimmetrici, invece, utilizzano una chiave diversa per la crittografia e la decrittografia e la chiave di decrittazione non può essere derivata dalla chiave crittografica. I cifrari asimmetrici fanno sì che la chiave di cifratura sia pubblica, consentendo a chiunque di cifrare con la chiave, mentre solo il destinatario corretto (che conosce la chiave di decifrazione) può decifrare il messaggio. La chiave di crittografia è detta anche chiave pubblica, mentre la chiave di decrittografia è la chiave privata o segreta. RSA è probabilmente l'algoritmo di crittografia asimmetrica più conosciuto. @@ -63,33 +70,33 @@ RSA è probabilmente l'algoritmo di crittografia asimmetrica più conosciuto. Una firma digitale lega un documento al proprietario di una determinata chiave. -La firma digitale di un documento è un pezzo d'informazioni basato sia sul documento che sulla chiave privata del firmatario. In genere viene creato attraverso una funzione di hash e una funzione di firma privata (crittografia con la chiave privata del firmatario). Una firma digitale è una piccola quantità di dati creata utilizzando una chiave segreta; esiste una chiave pubblica che può essere utilizzata per verificare che la firma sia stata generata utilizzando la corrispondente chiave privata. +La firma digitale di un documento è un'informazione basata sia sul documento stesso che sulla chiave privata del soggetto firmatario. E' di solito creata tramite una funzione di hash e funzione di firma privata (codificando con la chiave privata del firmatario). Una firma digitale è una piccola quantità di dati creata utilizzando una chiave segreta e una chiave pubblica che può essere utilizzata per verificare che la firma sia stata generata utilizzando la corrispondente chiave privata. -Diversi metodi per creare e verificare le firme digitali sono liberamente disponibili, ma l'algoritmo più ampiamente noto è l'algoritmo a chiave pubblica di RSA. +Sono disponibili diversi metodi per realizzare e verificare le firme digitali, ma l'algoritmo a chiave pubblica RSA è il più conosciuto. ### Protocolli Crittografici -La crittografia opera su molti livelli. Su un livello hai gli algoritmi, come le cifrature a blocchi e i criptosistemi a chiave pubblica. A partire da questi, si ottengono i protocolli e, a partire dai protocolli, si trovano le applicazioni (o altri protocolli). Di seguito è riportato un elenco di applicazioni quotidiane tipiche che utilizzano protocolli crittografici. Questi protocolli si basano sugli algoritmi crittografici di livello inferiore. +La crittografia lavora su più livelli. Alla base ci sono gli algoritmi, come i cifrari a blocchi e i crittosistemi a chiave pubblica. A partire da questi, si ottengono i protocolli e, al di sopra di questi abbiamo le applicazioni (o altri protocolli). Di seguito è riportato un elenco di applicazioni quotidiane tipiche che utilizzano protocolli crittografici. Questi protocolli si basano su algoritmi crittografici di livello più basso. -i.) Sicureza del Domain Name Server (DNSSEC) +**i.)** Domain Name Server Security (DNSSEC) -Si tratta di un protocollo per servizi di nomi distribuiti sicuri. Attualmente, è disponibile come Bozza Internet. +Si tratta di un protocollo per servizi di nomi distribuiti sicuri. Attualmente è disponibile come bozza su Internet. -ii.) Secure Socket Layer (SSL) +**ii.)** Secure Socket Layer (SSL) SSL è uno dei due protocolli usati per le connessioni WWW sicure (l'altro è SHTTP). La sicurezza del WWW è diventata necessaria in quanto sempre più informazioni sensibili, come i numeri delle carte di credito, vengono trasmesse su Internet. -iii.) Secure Hypertext Transfer Protocol (SHTTP) +**iii.)** Secure Hypertext Transfer Protocol (SHTTP) Questo è un altro protocollo per fornire una maggiore sicurezza per le transazioni WWW. -iv) Sicurezza E-Mail e servizi correlati +**iv.)** Sicurezza della posta elettronica e servizi correlati -**GNU Privacy Guard** - è conforme allo standard Internet OpenPGP proposto, come descritto in RFC2440. +**GnuPG** - GNU Privacy Guard - è conforme allo standard Internet OpenPGP descritto in RFC2440. -v) Protocollo SSH2 +**v.)** Protocollo SSH2 -Questo protocollo è versatile per le esigenze di Internet ed è attualmente utilizzato nel software SSH2. Il protocollo è usato per proteggere le sessioni del terminale e le connessioni TCP. +Questo protocollo è versatile per le esigenze di Internet ed è attualmente utilizzato nel software SSH2. Il protocollo viene utilizzato per proteggere le sessioni di terminale e le connessioni TCP. I seguenti esercizi esaminano due applicazioni che utilizzano protocolli crittografici: GnuPG e OpenSSH. @@ -97,123 +104,134 @@ I seguenti esercizi esaminano due applicazioni che utilizzano protocolli crittog ### GnuPG -GnuPG (GNU Privacy Guard) è un insieme di programmi per la crittografia a chiave pubblica e la firma digitale. Gli strumenti sono utilizzabili per crittografare dati e creare firme digitali. Include anche una funzione avanzata di gestione delle chiavi. GnuPG utilizza la crittografia a chiave pubblica per consentire agli utenti di comunicare in modo sicuro. +GnuPG (GNU Privacy Guard) è un insieme di programmi per la crittografia a chiave pubblica e la firma digitale. Gli strumenti possono essere utilizzati per criptare i dati e creare firme digitali. Include inoltre una funzione avanzata di gestione delle chiavi. GnuPG utilizza la crittografia a chiave pubblica per consentire agli utenti di comunicare in modo sicuro. -Esegui i seguenti esercizi come un utente normale. es. utente ying +Eseguire i seguenti esercizi come utente regolare. ad esempio l'utente ying -Per creare una nuova coppia di chiavi +#### Per creare una nuova coppia di chiavi -1. Accedi al sistema come utente "ying" +1. Accedere al sistema come utente "ying" -2. Assicurati che il pacchetto GnuPG sia installato sul tuo sistema. Digita: +2. Assicurarsi che il pacchetto GnuPG sia installato sul sistema. Digitare: -`[ying@serverXY ying]$ rpm -q gnupg` + ```bash + [ying@serverXY ying]$ rpm -q gnupg + gnupg-*.* + ``` -gnupg-\*.\* + Se non lo fosse, si può richiedere al superutente di installarlo. -Se non lo è, chiedete al super-utente di installarlo. +3. Elencate e annotate tutte le directory nascoste nella vostra home directory. -3. Elenca e prendi nota di tutte le cartelle nascoste nella cartella della tua home. +4. Elencate le chiavi che avete attualmente nel vostro portachiavi. Digitare: -4. Elencate le chiavi che avete attualmente nel vostro portachiavi. Digita: + ```bash + [ying@serverXY ying]$ gpg --list-keys + ``` -`[ying@serverXY ying]$ gpg --list-keys` + !!! note "Nota" -!!! NOTE "Nota" + Non dovreste avere ancora nessuna chiave nel portachiavi. Ma il comando di cui sopra vi aiuterà anche a creare un ambiente predefinito che vi permetterà di creare una nuova coppia di chiavi con successo la prima volta. - Non dovrebbe esserci ancora nessuna chiave nel portachiavi. Ma il comando di cui sopra vi aiuterà anche a creare un ambiente predefinito che vi permetterà di creare una nuova coppia di chiavi con efficacia la prima volta. + !!! domanda "Attività di laboratorio:" -Elenca nuovamente le cartelle nascoste nella tua cartella home. Qual è il nome della nuova cartella aggiunta? + Elenca nuovamente le cartelle nascoste nella tua home directory. Qual è il nome della nuova cartella aggiunta? -5. Usa il programma gpg per creare le tue nuove coppie di chiavi. Digita: +5. Utilizzare il programma gpg per creare le nuove coppie di chiavi. Digitare: -``` -[ying@serverXY ying\]$ gpg --gen-key + ```bash + [ying@serverXY ying]$ gpg --gen-key -...................................... + ...................................... -gpg: keyring \`/home/ying/.gnupg/secring.gpg' created + gpg: keyring `/home/ying/.gnupg/secring.gpg' created -gpg: keyring \`/home/ying/.gnupg/pubring.gpg' created + gpg: keyring `/home/ying/.gnupg/pubring.gpg' created -Please select what kind of key you want: + Please select what kind of key you want: - (1) DSA and ElGamal (default) + (1) DSA and ElGamal (default) - (2) DSA (sign only) + (2) DSA (sign only) - (5) RSA (sign only) + (5) RSA (sign only) -Your selection? 1 -``` + Your selection? 1 + ``` -Alla richiesta del tipo di chiave che si desidera creare, accettare quella predefinita, cioè (DSA e ElGamal). Digitate 1 + Alla richiesta del tipo di chiave che si desidera creare, accettare quella predefinita, cioè (DSA e ElGamal). Digitate 1 -!!! WARNING "Attenzione" + !!! warning "Attenzione" - L'opzione (1) crea due coppie di chiavi. La coppia di chiavi DSA sarà la coppia di chiavi primaria - per la creazione di firme digitali e una coppia di chiavi ELGamel subordinata per la crittografia dei dati. + L'opzione (1) crea due coppie di chiavi. La coppia di chiavi DSA sarà la coppia di chiavi primaria - per la creazione di firme digitali e una coppia di chiavi ELGamel subordinata per la crittografia dei dati. 6. Si creerà una chiave ELG-E di dimensione 1024. Accettare nuovamente l'impostazione predefinita al prompt sottostante: -La coppia di chiavi DSA avrà 1024 bit. + ```bash + DSA key pair will have 1024 bits. -In procinto di generare una nuova coppia di chiavi ELG-E. + About to generate a new ELG-E key pair. - la dimensione minima della chiave è di 768 bit + minimum key size is 768 bits - la dimensione della chiave predefinita è di 1024 bit + default key size is 1024 bits - la dimensione massima della chiave suggerita è di 2048 bit + highest suggested key size is 2048 bits -Quale dimensione di chiave si desidera? (1024) 1024 + What key size do you want? (1024) 1024 + ``` -7. Creare chiavi che scadranno tra un anno. Digitare "1y" al prompt sottostante: +7. Creare chiavi che scadono tra un anno. Digitare "1y" al prompt sottostante: -Specificare per quanto tempo la chiave deve essere valida. + Please specify how long the key should be valid. - 0 = la chiave non scade + ++0++ = la chiave non scade - = la chiave scade tra n giorni + ++"n"++ = la chiave scade tra n giorni -w = la chiave scade tra n settimane + ++"n"+"w"++ = la chiave scade tra n settimane -m = la chiave scade tra n mesi + ++"n"+"m"++> = la chiave scade tra n mesi -y = la chiave scade tra n anni + ++"n"+"y"++ = la chiave scade tra n anni -La chiave è valida per? (0) 1y + Key is valid for? (0) 1y 8. Digitare "y" per accettare la data di scadenza visualizzata: -È corretto (y/n)? y + ```bash + Is this correct (y/n)? y + ``` 9. Creare un ID utente con cui identificare la chiave: -È necessario un ID utente per identificare la propria chiave; il software costruisce l'id utente + È necessario un ID utente per identificare la propria chiave; il software costruisce l'ID utente -da Nome reale, Commento e Indirizzo e-mail in questo modulo: + da Nome reale, Commento e Indirizzo e-mail in questo modulo: -"Firstname Lastname (any comment) <yourname@serverXY>" + "Firstname Lastname (any comment) " -Real name: Ying Yang\[ENTER\] + Real name: Ying Yang ++enter++ -Comment : my test\[ENTER\] + Comment : my test ++enter++ -Email address: ying@serverXY \[ENTER\] + Email address: ying@serverXY ++enter++ -Alla richiesta di conferma, digitare "o" (Ok) per accettare i valori corretti. + At the confirmation prompt type “o” (Okay) to accept the correct values. -È stato selezionato questo USER-ID: + You selected this USER-ID: -"Ying Yang (my test) <ying@serverXY>" + "Ying Yang (my test) " -Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O + Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O -10. Select a passphrase that you WILL NOT forget at the next prompt: +10. Selezionate una passphrase che NON dimenticherete al prossimo prompt: -Enter passphrase: \*\*\*\*\*\*\*\* + ```bash + Enter passphrase: ** -Repeat passphrase: \*\*\*\*\*\*\*\* + Repeat passphrase: ** + ``` ## Esercizio 2 @@ -221,122 +239,135 @@ Repeat passphrase: \*\*\*\*\*\*\*\* Il programma gpg viene utilizzato anche per l'amministrazione delle chiavi. -Elenco delle chiavi +#### Elencare le chiavi -1. Mentre si è ancora connessi al sistema come utente ying. Visuaizzate le chiavi nel vostro portachiavi. Digita: +1. Mentre si è ancora connessi al sistema come utente ying. Visualizzare le chiavi nel portachiavi. Digitare: -[ying@serverXY ying\]$ gpg --list-keys + ```bash + [ying@serverXY ying]$ gpg --list-keys -gpg: WARNING: using insecure memory! + gpg: WARNING: using insecure memory! -/home/ying/.gnupg/pubring.gpg + /home/ying/.gnupg/pubring.gpg ------------------------------ + ----------------------------- -pub 1024D/1D12E484 2003-10-16 Ying Yang (my test) <ying@serverXY> + pub 1024D/1D12E484 2003-10-16 Ying Yang (my test) -sub 1024g/1EDB00AC 2003-10-16 \[expires: 2004-10-15\] + sub 1024g/1EDB00AC 2003-10-16 [expires: 2004-10-15] + ``` -2. Per sopprimere il fastidioso "avviso" sulla "insecure memory", aggiungere la seguente opzione +2. Per sopprimere il fastidioso "avviso" sulla "memoria insicura", aggiungete la seguente opzione al vostro file di configurazione personale di gpg. Digitare: - al vostro file di configurazione gpg personale. Digita: + ```bash + [ying@serverXY ying]$ echo "no-secmem-warning" >> ~/.gnupg/gpg.conf + ``` -[ying@serverXY ying\]$ echo "no-secmem-warning" >> ~/.gnupg/gpg.conf +3. Eseguire il comando per elencare nuovamente le chiavi per assicurarsi che la modifica sia effettiva. -3. Eseguire il comando per elencare nuovamente le chiavi. per assicurarsi che la modifica sia effettiva. +4. Elencare le chiavi con le relative firme. Digitare: -4. Elencare le chiavi con le relative firme. Digita: + ```bash + [ying@serverXY ying]$ gpg --list-sigs -[ying@serverXY ying\]$ gpg --list-sigs + /home/ying/.gnupg/pubring.gpg + ``` -/home/ying/.gnupg/pubring.gpg +5. Elencare solo le proprie chiavi segrete. Digitare: + ```bash + [ying@serverXY ying]$ gpg --list-secret-keys -5. Elencare solo le chiavi segrete. Digita: + /home/ying/.gnupg/secring.gpg -[ying@serverXY ying\]$ gpg --list-secret-keys + ----------------------------- -/home/ying/.gnupg/secring.gpg + sec 1024D/1D12E484 2003-10-16 Ying Yang (my test) ------------------------------ + ssb 1024g/1EDB00AC 2003-10-16 + ``` -sec 1024D/1D12E484 2003-10-16 Ying Yang (my test) <ying@serverXY> +6. Visualizzare le impronte digitali delle chiavi. Digitare: -ssb 1024g/1EDB00AC 2003-10-16 + ```bash + [ying@serverXY ying]$ gpg --fingerprint -6. Visualizzare le impronte digitali delle chiavi. Digita: + /home/ying/.gnupg/pubring.gpg -\[ying@serverXY ying\]$ ***gpg --fingerprint*** + ----------------------------- -/home/ying/.gnupg/pubring.gpg + pub 1024D/1D12E484 2003-10-16 Ying Yang (my test) ------------------------------ + Key fingerprint = D61E 1538 EA12 9049 4ED3 5590 3BC4 A3C1 1D12 E484 -pub 1024D/1D12E484 2003-10-16 Ying Yang (my test) <ying@serverXY> + sub 1024g/1EDB00AC 2003-10-16 [expires: 2004-10-15] - Key fingerprint = D61E 1538 EA12 9049 4ED3 5590 3BC4 A3C1 1D12 E484 + Revocation certificates -sub 1024g/1EDB00AC 2003-10-16 \[expires: 2004-10-15\] + Revocation certificates are used to revoke keys in case someone gets knowledge of your secret key or in case you forget your passphrase. They are also useful for other various functions. + ``` -Certificati di revoca +#### Per creare un certificato di revoca -I certificati di revoca vengono utilizzati per revocare le chiavi nel caso in cui qualcuno venga a conoscenza della chiave segreta o nel caso in cui ci si dimentichi la passphrase. Sono utili anche per altre funzioni. +1. Mentre si è ancora connessi come utente ying. Creare un certificato di revoca. Verrà visualizzato nell'output standard. Digitare: -Per creare un certificato di revoca + ```bash + [ying@serverXY ying]$ gpg --gen-revoke ying@serverXY + ``` -1. Mentre si è ancora connessi come utente ying. Creare un certificato di revoca. Verrà visualizzato sul vostro + Seguite le indicazioni e inserite la passphrase quando vi viene richiesto. - standard output. Digita: +2. Creare ora un certificato di revoca che verrà memorizzato in formato ASCII in un file denominato - -[ying@serverXY ying\]$*** gpg --gen-revoke ying@serverXY*** + “revoke.asc”. Digitare: -Seguite le indicazioni e inserite la passphrase quando vi viene richiesto. - -2. Ora si crea un certificato di revoca che verrà memorizzato in formato ASCII in un file chiamato - - - “revoke.asc”. Digita: - -[ying@serverXY ying\]$*** gpg --output revoke.asc --gen-revoke ying@serverXY*** + ```bash + [ying@serverXY ying]$ gpg --output revoke.asc --gen-revoke ying@serverXY + ``` 3. È opportuno conservare il certificato di revoca in un luogo sicuro e farne una copia cartacea. -Esportazione delle Chiavi Pubbliche +### Esportazione delle chiavi pubbliche Lo scopo di tutte queste operazioni di crittografia, firma e decrittografia è che le persone desiderano comunicare tra loro, ma anche farlo nel modo più sicuro possibile. Detto questo, va detto che forse non è così ovvio: -Per comunicare con altre persone utilizzando un sistema crittografico basato su chiavi pubbliche, è necessario scambiare chiavi pubbliche.. +È necessario scambiare chiavi pubbliche per comunicare con altre persone che utilizzano un crittosistema basato su chiavi pubbliche. -O almeno rendere disponibile la vostra chiave pubblica in qualsiasi luogo pubblicamente accessibile (tabelloni, pagine web, server di chiavi, radio, TV, SPAMMING via e-mail ... ecc) +O almeno rendere disponibile la vostra chiave pubblica in qualsiasi luogo pubblicamente accessibile (cartelloni pubblicitari, pagine web, server di chiavi, radio, TV, SPAMMING via e-mail ... ecc) -Per esportare le chiavi pubbliche +#### Per esportare le vostre chiavi pubbliche -1. Esportare la chiave pubblica in formato binario in un file chiamato "ying-pub.gpg". Digita: +1. Esportare la chiave pubblica in formato binario in un file chiamato "ying-pub.gpg". Digitare: -[ying@serverXY ying\]$ ***gpg --output ying-pub.gpg --export <your\_key’s\_user\_ID>*** + ```bash + [ying@serverXY ying]$ gpg --output ying-pub.gpg --export + ``` -!!! NOTE "Nota" + !!! note "Nota" - Sostituire <your\key's\_user\_ID> con qualsiasi stringa che identifichi correttamente le chiavi. Nel nostro sistema campione questo valore può essere uno dei seguenti: + Sostituire con qualsiasi stringa che identifichi correttamente le chiavi. Nel nostro sistema campione questo valore può essere uno dei seguenti: - ying@serverXY, ying, yang + ying@serverXY, ying, yang - OPPURE + O - L'attuale chiave ID - 1D12E484 + L'ID effettivo della chiave - 1D12E484 2. Esportare la chiave pubblica in un file chiamato "ying-pub.asc". Ma questa volta generarlo in - ASCII-armored format. Digita: + formato ASCII-armored. Digitare: -[ying@serverXY ying\]$***gpg --output ying-pub.asc --armor --export ying@serverXY *** + ```bash + [ying@serverXY ying]$gpg --output ying-pub.asc --armor --export ying@serverXY + ``` 3. Usare il comando cat per visualizzare la versione binaria della chiave pubblica di ying (ying-pub.gpg) -4. (Per resettare il terminale digitare: "reset") +4. Per resettare il terminale, digitare: `reset` -5. Usare il comando cat per visualizzare la versione ASCII della chiave pubblica di ying (ying-pub.asc) +5. Utilizzare il comando cat per visualizzare la versione ASCII della chiave pubblica di ying (ying-pub.asc) 6. Si noterà che la versione ASCII è più adatta per la pubblicazione su pagine web o per lo spamming, ecc. @@ -344,213 +375,244 @@ Per esportare le chiavi pubbliche ### Firme digitali -La creazione e la verifica delle firme utilizzano la coppia di chiavi pubbliche/private, che differisce dalla crittografia e dalla decrittografia. La firma viene creata utilizzando la chiave privata del firmatario. La firma può essere verificata utilizzando la chiave pubblica corrispondente. - -Per firmare digitalmente un file - -1. Creare un file chiamato "secret-file.txt" con il testo "Hello All". Digita: +La creazione e la verifica delle firme utilizzano la coppia di chiavi pubbliche/private, che differisce dalla crittografia e dalla decrittografia. L'utilizzo della chiave privata del firmatario per creare una firma facilita la verifica tramite la corrispondente chiave pubblica. -\[ying@serverXY ying\]$ ***echo "Hello All" > secret1.txt*** +#### Per firmare digitalmente un file -2. Utilizzare cat per visualizzare il contenuto del file. Usare il comando file per vedere il tipo di file. +1. Creare un file chiamato "secret-file.txt" con il testo "Hello All". Digitare: -3. Ora firmate il file con la vostra firma digitale. Digita: + ```bash + [ying@serverXY ying]$ echo "Hello All" > secret1.txt + ``` -\[ying@serverXY ying\]$ ***gpg -s secret1.txt*** +2. Utilizzare cat per visualizzare il contenuto del file. Utilizzare il comando file per vedere il tipo di file. -Quando viene richiesto, inserire la passphrase. +3. Ora firmare il file con la propria firma digitale. Digitare: -Il comando precedente creerà un altro file "secret1.txt.gpg", compresso e dotato di firma. Eseguite il comando "file" sul file per verificarlo. Visualizzare il file con cat + ```bash + [ying@serverXY ying]$ gpg -s secret1.txt + ``` -4. Controllare la firma sul file firmato "secret1.txt.gpg". Digita: + Quando viene richiesto, inserire la passphrase. -\[ying@serverXY ying\]$ ***gpg --verify secret1.txt.gpg*** + Il comando precedente creerà un altro file "secret1.txt.gpg", compresso e dotato di firma. Eseguire il comando "file" sul file per verificarlo. Visualizzare il file con cat -gpg: Signature made Thu 16 Oct 2003 07:29:37 AM PDT using DSA key ID 1D12E484 +4. Controllare la firma sul file firmato "secret1.txt.gpg". Digitare: -gpg: Good signature from "Ying Yang (my test) <ying@serverXY>" + ```bash + [ying@serverXY ying]$ gpg --verify secret1.txt.gpg -5. Creare un altro file secret2.txt con il testo "Hello All". + gpg: Signature made Thu 16 Oct 2003 07:29:37 AM PDT using DSA key ID 1D12E484 -6. Firmate il file secret2.txt, ma questa volta lasciate che il file sia blindato in ASCII. Digita: + gpg: Good signature from "Ying Yang (my test) " + ``` -\[ying@serverXY ying\]$ ***gpg -sa secret2.txt*** +5. Creare un altro file secret2.txt con il testo " Hello All". -Nella vostra pwd verrà creato un file blindato ASCII chiamato "secret2.txt.asc". +6. Firmare il file secret2.txt, ma lasciare che questa volta il file sia in formato ASCII armored. Digitare: -7. Usate il comando cat per visualizzare il contenuto del file blindato ASCII creato in precedenza. + ```bash + [ying@serverXY ying]$ gpg -sa secret2.txt + ``` -8. Creare un altro file chiamato "secret3.txt" con il testo "hello dude". Digita: + Nella vostra pwd verrà creato un file ASCII armored chiamato "secret2.txt.asc". -\[ying@serverXY ying\]$*** echo "hello dude" > secret3.txt*** +7. Utilizzare il comando cat per visualizzare il contenuto del file ASCII armored creato in precedenza. -9. Aggiungete la vostra firma al corpo del file creato sopra. Digita: +8. Creare un altro file chiamato "secret3.txt" con il testo "hello dude". Digitare: -\[ying@serverXY ying\]$ ***gpg --clearsign secret3.txt*** + ```bash + [ying@serverXY ying echo "hello dude" > secret3.txt + ``` -Questo creerà un file non compresso (secret3.txt.asc) con la vostra firma blindata ASCII. +9. Aggiungete la vostra firma al contenuto del file creato in precedenza. Digitare: -Scrivete il comando per verificare la firma del file che è stato creato per voi. + ```bash + [ying@serverXY ying]$ gpg --clearsign secret3.txt + ``` -10. Aprire il file per visualizzarne il contenuto con un qualsiasi pager. È possibile leggere il testo inserito nel file? + Questo creerà un file non compresso (secret3.txt.asc) con la vostra firma ASCII-armored. -ASSICURATEVI CHE IL VOSTRO PARTNER ABBIA ESEGUITO L'INTERO + Scrivete il comando per verificare la firma del file creato per voi. -"ESERCIZI -1, 2, 3" PRIMA DI CONTINUARE CON L'"ESERCIZIO 4" +10. Aprire il file per visualizzarne il contenuto con un qualunque paginatore. -SE NON SI HA UN PARTNER. DISATTIVARE L'ACCOUNT DELL'UTENTE YING E ACCEDRE AL SISTEMA COME UTENTE "me". - -RIPETERE L'INTERO ESERCIZIO -1,2,3 COME UTENTE "me". - -È POSSIBILE ESEGUIRE IL SEGUENTE ESERCIZIO 4. SOSTITUIRE TUTTI I RIFERIMENTI ALL'UTENTE YING IN "serverPR" CON - L'UTENTE "me" IN serverXY (cioè il vostro localhost) + !!! question "Domanda" + + È possibile leggere il testo inserito nel file? -È POSSIBILE UTILIZZARE SIA L'UTENTE "me@serverXY" CHE L'UTENTE "ying@serverPR" +!!! warning "Leggere prima di proseguire" -COME PARTNER NELL'ESERCIZIO SUCCESSIVO. + Assicurarsi che il vostro compagno abbia eseguito tutti gli "Esercizi 1, 2 e 3" di cui sopra prima di continuare con l'Esercizio 4 di seguito. + + Se non si dispone di un compagno, si può uscire dall'account dell'utente Ying e accedere al sistema come utente "me." + + Ripetere quindi l'intero "Esercizio 1, 2 e 3" come utente " me." + + A questo punto si può eseguire l'esercizio 4. Sostituire tutti i riferimenti all'utente Ying su "serverPR" con l'utente "me" su ServerXY (cioè il vostro localhost). + + È possibile utilizzare l'utente "me@serverXY" o l'utente "ying@serverPR" come partner nel prossimo esercizio. ## Esercizio 4 - In questo esercizio, utilizzerete la cosiddetta "Rete della fiducia" per comunicare con un altro utente. - -Importare le chiavi pubbliche - -1. Accedere al sistema come utente ying./ +### Importazione delle chiavi pubbliche -2. Rendere disponibile al partner il file della propria chiave pubblica blindata ASCII (ying-pub.asc) (utilizzare +In questo esercizio, utilizzerete la cosiddetta "Rete della fiducia" per comunicare con un altro utente. - o - me@serverXY o ying@serverPR) +1. Accedere al sistema come utente ying. -NOTE "Nota:" +2. Rendere disponibile al partner il file della propria chiave pubblica ASCII-armored (ying-pub.asc) (utilizzare -Esistono diversi modi per farlo, ad esempio e-mail, copia e incolla, scp, ftp, salvataggio su dischetto, ecc. + o - me@serverXY o ying@serverPR) -Scegliete il metodo più efficiente per voi. + !!! note "Nota" + + Esistono diversi modi per farlo, ad esempio e-mail, copia e incolla, scp, ftp, salvataggio su dischetto, ecc. + + Scegliete il metodo più efficiente per voi. -3. Chiedete al vostro partner di mettere a vostra disposizione il file della sua chiave pubblica. +3. Chiedete al vostro partner di rendere disponibile il file della chiave pubblica. -4. Supponendo che la chiave pubblica del vostro partner sia memorizzata in un file chiamato "me-pub.asc" nella vostra pwd; +4. Supponiamo che la chiave pubblica del compagno sia presente nel file "me-pub.asc" nella nostra attuale directory di lavoro; - Importare la chiave nel portachiavi. Digita: + Importare la chiave nel portachiavi. Digitare: -\[ying@serverXY ying\]$ ***gpg --import me-pub.asc*** + ```bash + [ying@serverXY ying]$ gpg --import me-pub.asc -gpg: key 1D0D7654: public key "Me Mao (my test) <me@serverXY>" imported + gpg: key 1D0D7654: public key "Me Mao (my test) " imported -gpg: Total number processed: 1 + gpg: Total number processed: 1 -gpg: imported: 1 + gpg: imported: 1 + ``` -5. Ora elencate le chiavi del vostro portachiavi. Digita: +5. Ora elencate le chiavi del vostro portachiavi. Digitare: -\[ying@serverXY ying\]$*** gpg --list-keys*** + ```bash + [ying@serverXY ying]$ gpg --list-keys -/home/ying/.gnupg/pubring.gpg + /home/ying/.gnupg/pubring.gpg ------------------------------ + ----------------------------- -pub 1024D/1D12E484 2003-10-16 Ying Yang (my test) <ying@serverXY> + pub 1024D/1D12E484 2003-10-16 Ying Yang (my test) -sub 1024g/1EDB00AC 2003-10-16 \[expires: 2004-10-15\] + sub 1024g/1EDB00AC 2003-10-16 [expires: 2004-10-15] -pub 1024D/1D0D7654 2003-10-16 Me Mao (my test) <me@serverXY> + pub 1024D/1D0D7654 2003-10-16 Me Mao (my test) -sub 1024g/FD20DBF1 2003-10-16 \[expires: 2004-10-15\] + sub 1024g/FD20DBF1 2003-10-16 [expires: 2004-10-15] + ``` -6. In particolare, elencare la chiave associata all'ID utente me@serverXY. Digita: +6. In particolare, visualizzate la chiave associata all'ID utente me@serverXY. Digitare: -\[ying@serverXY ying\]$*** gpg --list-keys me@serverXY*** + ```bash + [ying@serverXY ying]$ gpg --list-keys me@serverXY + ``` -7. Visualizzare l'impronta digitale della chiave per me@serverXY. Digita: +7. Per mostrare l'impronta digitale della chiave per me@serverXY. Digitare: -\[ying@serverXY ying\]$*** gpg --fingerprint me@serverXY*** + ```bash + [ying@serverXY ying]$ gpg --fingerprint me@serverXY + ``` -Crittografare e decrittografare file + Crittografia e decrittografia dei file -La procedura di crittografia e decrittografia di file o documenti è semplice. + La procedura di crittografia e decrittografia di file o documenti è molto semplice. -Se si vuole criptare un messaggio all'utente ying, lo si cripterà utilizzando la chiave pubblica dell'utente ying. + Se si vuole criptare un messaggio all'utente ying, lo si farà utilizzando la chiave pubblica dell'utente ying. -Al momento della ricezione, ying dovrà decifrare il messaggio con la chiave privata di ying. + Al momento della ricezione, ying dovrà decifrare il messaggio con la chiave privata di ying. -SOLO ying può decifrare il messaggio o il file crittografato con la chiave pubblica di ying + SOLO ying può decifrare il messaggio o il file crittografato con la sua chiave pubblica -Per criptare un file +#### Crittografare un file -1. Mentre si accede al sistema come utente ying, creare un file chiamato encrypt-sec.txt. Digita: +1. Mentre si è connessi al sistema come utente ying, creare un file chiamato encrypt-sec.txt. Digitare: -\[ying@serverXY ying\]$ ***echo "hello" > encrypt-sec.txt*** + ```bash + [ying@serverXY ying]$ echo "hello" > encrypt-sec.txt + ``` -Assicuratevi di poter leggere il contenuto del file usando cat. + Assicurarsi di poter leggere il contenuto del file con cat. -2. Crittografare il file encrypt-sec.txt, in modo che solo l'utente "me" possa visualizzarlo. cioè si cripterà +2. Crittografare il file encrypt-sec.txt, in modo che solo l'utente "me" possa visualizzarlo. ad esempio, lo cripterete utilizzando la chiave pubblica di me@serverXY (che ora avete nel vostro portachiavi). Digitare: - utilizzando la chiave pubblica di me@serverXY (che ora avete nel vostro portachiavi). Digita: + ```bash + [ying@serverXY ying]$ gpg --encrypt --recipient me@serverXY encrypt-sec.txt + ``` -\[ying@serverXY ying\]$ ***gpg --encrypt --recipient me@serverXY encrypt-sec.txt*** + Il comando creerà un file criptato chiamato "encrypt-sec.txt.gpg" nell'attuale directory di lavoro. - Il comando precedente creerà un file criptato chiamato "encrypt-sec.txt.gpg" nella vostra pwd. +#### Decodificare un file - Per decifrare un file +1. Il file che avete appena era destinato a me@serverXY. -1. Il file che avete criptato sopra era destinato a me@serverXY. + Provate a decifrare il file. Digitare: - Provare a decifrare il file. Digita: + ```bash + [ying@serverXY ying]$ gpg --decrypt encrypt-sec.txt.gpg -\[ying@serverXY ying\]$ ***gpg --decrypt encrypt-sec.txt.gpg*** + gpg: encrypted with 1024-bit ELG-E key, ID FD20DBF1, created 2003-10-16 -gpg: encrypted with 1024-bit ELG-E key, ID FD20DBF1, created 2003-10-16 + "Me Mao (my test) " - "Me Mao (my test) <me@serverXY>" + gpg: decryption failed: secret key not available + ``` -gpg: decryption failed: secret key not available +2. Abbiamo imparato una lezione preziosa? -2. Abbiamo imparato qualche lezione preziosa? +3. Rendete disponibile il file crittografato creato per il proprietario corretto e fategli eseguire il comando di cui sopra per decifrare il file. La decodifica è avvenuta in una maniera piuttosto agevole. -3. Rendete il file crittografato creato disponibile al proprietario corretto e fategli eseguire il procedimento sopra descritto + !!! nota + + Fate molta attenzione quando decrittate i file binari (ad esempio i programmi) perché dopo aver decrittato un file gpg, tenterà di inviare il contenuto del file allo standard output. - per decifrare il file. Hanno avuto più successo nel decriptare il file. + Pertanto, per la fase di decodifica del file si suggerisce l'utilizzo del seguente comando: -!!! NOTE "Nota" + ```bash + [ying@serverXY ying]$ gpg --output encrypt-sec --decrypt encrypt-sec.txt.gpg + ``` - Fate molta attenzione quando decriptate file binari (ad esempio programmi), perché dopo aver decriptato con successo un file gpg tenterà di inviare il contenuto del file allo standard output. + Questo forza l'invio dell'output a un file chiamato "encrypt-sec". -Per decifrare i file, invece, utilizzate abitualmente il comando riportato di seguito: + Che può essere visualizzato (o eseguito) con qualunque programma adatto al tipo di file (o di contenuto). -\[ying@serverXY ying\]$ ***gpg --output encrypt-sec --decrypt encrypt-sec.txt.gpg*** + !!! tip "Consigli" -Questo forza l'invio dell'output a un file chiamato "encrypt-sec". + La maggior parte dei comandi e delle opzioni utilizzati con il programma gpg hanno anche forme brevi che riducono la digitazione da parte dell'utente nella riga di comando. ad es. -Che possono essere visualizzati (o eseguiti) con qualsiasi programma adatto al tipo di file (o di contenuto). + ``` + gpg --encrypt --recipient me@serverXY encrypt-sec.txt + ``` -!!! TIPS "Consigli" -1. La maggior parte dei comandi e delle opzioni utilizzati con il programma gpg hanno anche forme brevi che risultano in meno + La forma abbreviata di questo comando è: - digitazione per l'utente dalla riga di comando. ad es. + ``` + gpg -e -r me@serverXY encrypt-sec.txt + ``` -gpg --encrypt --recipient me@serverXY encrypt-sec.txt +4. Per crittografare la stringa "hello" e inviarla come messaggio ASCII-armored all'utente con l'indirizzo di posta ying@serverXY; utilizzate il seguente comando: -La forma breve di questo comando è: + ```bash + echo "hello" | gpg -ea -r ying@serverXY | mail ying@serverXY + ``` -gpg -e -r me@serverXY encrypt-sec.txt +5. Per crittografare il file "your_file" con la chiave pubblica di "me@serverXY" e scriverlo in "your_file.gpg" -2. Per criptare la stringa "hello" e spedirla come messaggio blindato ASCII all'utente con l'indirizzo mail + dopo averlo firmato con il proprio id utente (utilizzando la propria firma digitale); utilizzate il seguente comando: - ying@serverXY; Utilizzare il comando seguente: + ```bash + gpg -se -r me@serverXY your_file + ``` -echo "hello" | gpg -ea -r ying@serverXY | mail ying@serverXY +6. C'è un server di chiavi disponibile pubblicamente all'indirizzo wwwkeys.pgp.net. Possiamo usare gpg per caricare la chiave con: -3. Per criptare il file "tuo\_file" con la chiave pubblica di "me@serverXY" e scriverlo in "tuo\_file.gpg" + gpg --send-keys --keyserver wwwkeys.pgp.net - dopo ***averlo firmato*** con il proprio ID utente (utilizzando la propria firma digitale); utilizzare il comando seguente: - -gpg -se -r me@serverXY your\_file - -4. Esiste un server di chiavi pubblicamente disponibile all'indirizzo wwwkeys.pgp.net. È possibile utilizzare gpg per caricare la chiave con: - -gpg --send-keys <your\_real\_email\_address> --keyserver wwwkeys.pgp.net - -OpenSSH (www.openssh.org) +## [OpenSSH](https://www.openssh.org) OpenSSH è l'implementazione del protocollo SSH (Secure SHell) di OpenBSD. @@ -560,358 +622,510 @@ Aiuta a fornire comunicazioni sicure e crittografate tra due host non affidabili Include sia i componenti lato server che la suite di programmi lato client. -**sshd** - -Il lato server include il demone secure shell (sshd). sshd è il demone che ascolta le connessioni dai client. - -Crea un nuovo demone per ogni connessione in entrata. I demoni biforcati gestiscono lo scambio di chiavi e la crittografia, +### sshd -autenticazione, esecuzione di comandi e scambio di dati. Secondo la pagina man di sshd, sshd funziona come segue: +Lato server abbiamo il demone secure shell (`sshd`). `sshd` è il demone che rimane in ascolto per le connessioni dai client. -Per il protocollo SSH versione 2: +Crea un nuovo demone per ogni connessione in entrata. I nuovi demoni creati gestiscono lo scambio di chiavi, la crittografia, l'autenticazione, l'esecuzione di comandi e lo scambio di dati. Secondo la pagina man di sshd, `sshd` funziona come segue: -Ogni host ha una chiave specifica (RSA o DSA) utilizzata per identificare l'host. Quando il demone si avvia, non genera una chiave del server (come avviene nel protocollo SSH versione 1). La sicurezza in avanti è garantita da un accordo a chiave Diffie-Hellman. Questo accordo di chiave si traduce in una chiave di sessione condivisa. +Il demone SSH di OpenSSH supporta solamente la versione 2 del protocollo SSH. Ogni host ha una chiave specifica (RSA o DSA) utilizzata per identificare l'host. Ogni volta che un client si connette, il demone risponde con la sua chiave pubblica dell'host. Il client confronta la chiave host con il proprio database per verificare che non sia stata modificata. La sicurezza di inoltro è garantita da un accordo a chiave Diffie-Hellman. Questo accordo di chiave si traduce in una chiave di sessione condivisa. Il resto della sessione è codificato con l'utilizzo di una cifratura simmetrica. -Il resto della sessione viene crittografato utilizzando un cifrario simmetrico, attualmente AES a 128 bit, Blowfish, 3DES, CAST128, Arcfour, AES a 192 bit o AES a 256 bit. Il client seleziona l'algoritmo di crittografia da utilizzare tra quelli proposti dal server. Inoltre, l'integrità della sessione è garantita da un codice crittografico di autenticazione dei messaggi (hmac-sha1 o hmac-md5). +Il client seleziona l'algoritmo di crittografia da utilizzare tra quelli proposti dal server. Inoltre, l'integrità della sessione è garantita da un codice crittografico di autenticazione dei messaggi (hmac-md5, hmac-sha1, umac-64, umac-128, hmac-sha2-256 o hmac-sha2-512). -Il protocollo versione 2 prevede un metodo di autenticazione dell'utente basato su chiave pubblica (PubkeyAuthentication) o dell'host client (HostbasedAuthentication), un'autenticazione convenzionale con password e metodi basati su challenge response. +Infine, sia il client che il server accedono ad una finestra di dialogo di autenticazione. Il client prova ad autenticarsi utilizzando l'autenticazione basata sul host, l'autenticazione con chiave pubblica, l'autenticazione GSSAPI, l'autenticazione challenge-response, o con password. Il protocollo SSH2 implementato in OpenSSH è standardizzato dal gruppo di lavoro "IETF secsh" -ssh +### ssh -La suite di programmi del client include "ssh". È un programma utilizzato per accedere a sistemi remoti e può essere utilizzato anche per eseguire comandi su sistemi remoti. +La suite di programmi del client include `ssh`. È un programma utilizzato per accedere a sistemi remoti e può essere utilizzato anche per eseguire comandi su sistemi remoti. ## Esercizio 5 -### sshd - -Uso: sshd \[opzioni\] +### `sshd` -Opzioni: +Alcuni esercizi riguardano il demone server `sshd`. - -f file File di configurazione (predefinito /etc/ssh/sshd\_config) +```bash +Utilizzo: sshd [options] - -d Modalità di debug (più -d significa più debug) +Opzioni: + -f file File di configurazione (default /etc/ssh/sshd_config) + -d Modalità di debug (multiple -d means more debugging) -i Avviato da inetd + -D Non biforcare in modalità daemon + -t Testa soltanto file e chiavi di configurazione + -q Silenzioso (nessuna registrazione) + -p port Ascolta alla porta specificata (predefinita: 22) + -k seconds Rigenera la chiave del server ogni dato numero di secondi (predefiniti: 3600) + -g seconds Periodo di grazia per l'autenticazione (predefinito: 600) + -b bits Dimensioni della chiave RSA del server (predefinita: 768 bit) + -h file File da cui leggere la chiave del host (predefinito: /etc/ssh/ssh_host_key) + -u len Lunghezza massima del nome del host per la registrazione utmp + -4 Utilizza soltanto IPv4 + -6 Utilizza soltanto IPv6 + -o option Elabora l'opzione come se fosse letta da un file di configurazione. +``` - -D Non eseguire il fork in modalità demone +La maggior parte dei sistemi Linux ha già il server OpenSSH configurato e funzionante con alcune impostazioni predefinite. Il file di configurazione di `sshd` risiede tipicamente in `/etc/ssh/` e si chiama `sshd_config`. - -t Solo file di configurazione e chiavi di prova +### `sshd_config` - -q Silenzioso (nessuna registrazione) +1. Apri il file di configurazione del server SSH con qualsiasi impaginatore e studialo. Digitare: - -p port Ascolta sulla porta specificata (valore predefinito: 22) + ```bash + [root@serverXY root]# less /etc/ssh/sshd_config + ``` - -k secondi Rigenera la chiave del server ogni quanti secondi (valore predefinito: 3600) + !!! note "Nota" - -g secondi Periodo di tolleranza per l'autenticazione (valore predefinito: 600) + `sshd_config` è un file di configurazione piuttosto strano. A differenza di altri file di configurazione di Linux, i commenti (#) nel file `sshd_config' indicano i valori predefiniti delle opzioni. (cioè, i commenti rappresentano dei valori predefiniti già compilati.) - -bits Dimensione della chiave RSA del server (valore predefinito: 768 bit) +2. Consultare la pagina man di `sshd_config`. - -h file File da cui leggere la chiave host (predefinito: /etc/ssh/ssh\_host\_key) + !!! question "Domanda" + + Cosa fanno le seguenti opzioni? + + - AuthorizedKeysFile + - Ciphers + - Port + - Protocol + - X11Forwarding + - HostKey - -u len Lunghezza massima dell'hostname per la registrazione utmp +3. Cambiate la vostra pwd nella directory /etc/ssh/. - -4 Utilizzare solo IPv4 +4. Elenca tutti i file sotto `/etc/ssh/` - -6 Utilizzare solo IPv6 +### Creazione di chiavi host - -o opzione Elaborare l'opzione come se fosse letta da un file di configurazione. +Il tuo server SSH dispone già delle chiavi host che utilizza. Queste chiavi sono state generate al momento della prima installazione del sistema. In questo esercizio imparerete a creare chiavi di tipo host per il vostro server. Ma non userete mai i tasti. -La maggior parte dei sistemi Linux ha già il server OpenSSH configurato e funzionante con alcune impostazioni predefinite. Il file di configurazione di sshd risiede solitamente in - /etc/ssh/ - e si chiama sshd\_config. +#### Per generare le chiavi host per il vostro server -sshd\_config +1. Create una nuova directory sotto la vostra pwd. Chiamatela spare-keys. passare alla nuova directory. Digitare: -1. Aprite il file di configurazione del server ssh con un qualsiasi pager e studiatelo. Digita: + ```bash + [root@serverXY ssh]# mkdir spare-keys && cd spare-keys + ``` -\[root@serverXY root\]\# less /etc/ssh/sshd\_config +2. Utilizzare il programma ssh-keygen per creare una chiave host con le seguenti caratteristiche: -NOTE "Nota:" + - Il tipo di chiave deve essere "rsa" + - La chiave non dovrebbe avere commenti + - Il file della chiave privata deve essere denominato - ssh_host_rsa_key + - La chiave non deve utilizzare alcuna passphrase -sshd\_config è un file di configurazione piuttosto strano. + Digitare: -Si noterà che, a differenza di altri file di configurazione di Linux, i commenti (\#) nel file sshd\_config indicano i valori predefiniti delle opzioni. cioè i commenti rappresentano i valori predefiniti già compilati. + ```bash + [root@serverXY spare-keys]# ssh-keygen -q -t rsa -f ssh_host_rsa_key -C '' -N '' + ``` -2. Consultare la pagina man di sshd\_config e spiegare cosa fanno le opzioni sottostanti? + !!! question "Domanda" -AuthorizedKeysFile + Cosa bisogna fare per far sì che il demone sshd utilizzi la chiave host appena generata? -Ciphers +3. Visualizzare l'impronta digitale della chiave creata in precedenza. Digitare: -HostKey + ```bash + [root@serverXY spare-keys]# ssh-keygen -l -f ssh_host_rsa_key + ``` -Port +4. Visualizzate l'impronta digitale della chiave creata, ma questa volta includete la rappresentazione visiva ASCII dell'impronta digitale della chiave. Digitare: -Protocol + ```bash + [root@localhost spare-keys]# ssh-keygen -l -v -f ssh_host_rsa_key + 3072 SHA256:1kQS0Nz4NofWkgqU0y+DxmDoY6AmGsF40GwZkobD8DM ssh_host_rsa_key.pub (RSA) + +---[RSA 3072]----+ + |X=.+ .*o+. | + |B*B o + =o. | + |oBE. + o o.+ | + |+.+o = ooX o | + |+o . . .S*.+ | + |. .. | + | | + | | + | | + +----[SHA256]-----+ + ``` -X11Forwarding +5. Scrivete il comando per creare una chiave di tipo ***dsa*** "ssh_host_dsa_key" senza commenti, -HostKey +6. Controllare lo stato del servizio `sshd`. Digitare: -3. Cambiate la vostra pwd nella directory /etc/ssh/. + ```bash + [root@localhost ~]# systemctl -n 0 status sshd.service + ● sshd.service - OpenSSH server daemon + Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled) + Active: active (running) since Thu 2023-10-05 23:56:34 EDT; 3 days ago + ...... + ``` -4. Elencare tutti i file presenti nella directory sottostante: +7. Se si apportano modifiche al file di configurazione di `sshd`, è possibile riavviare il servizio `sshd` eseguendo: -Creazione di chiavi host + ```bash + [root@localhost ~]# systemctl restart sshd.service + ``` -Il server ssh dispone già di chiavi host che utilizza. Queste chiavi sono state generate al momento della prima installazione del sistema. In questo esercizio imparerete a creare chiavi di tipo host per il vostro server. Ma non userete mai i tasti. +## Esercizio 6 -Per generare le chiavi host per il vostro server +### `ssh` -1. Create una nuova directory sotto la vostra pwd. Chiamatela spare-keys. passare alla nuova directory. Digita: +Questa sezione tratta gli esercizi relativi al programma client `ssh`. -\[root@serverXY ssh\]\# mkdir spare-keys && cd spare-keys +```bash +usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] + [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] + [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] + [-i identity_file] [-J [user@]host[:port]] [-L address] + [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] + [-Q query_option] [-R address] [-S ctl_path] [-W host:port] + [-w local_tun[:remote_tun]] destination [command] +``` -2. Utilizzare il programma ssh-keygen per creare una chiave host con le seguenti caratteristiche: +#### Per utilizzare `ssh` -a. il tipo di chiave deve essere "rsa" +1. Accedere al serverXY come utente me. -b. La chiave non dovrebbe avere commenti +2. Utilizzare ssh per connettersi al serverPR. Digitare: -c. Il file della chiave privata deve essere denominato - ssh\_host\_rsa\_key + ```bash + [me@serverXY me]$ ssh serverPR + ``` -d. La chiave non deve utilizzare alcuna passphrase + Digitare la password di me quando richiesto. Se vengono visualizzati messaggi di avvertimento, digitare "yes" per continuare. - Digita: +3. Dopo aver effettuato il login, creare una directory chiamata - myexport e creare un file vuoto chiamato foobar nella nuova directory. Digitare: -\[root@serverXY spare-keys\]\# ssh-keygen -q -t rsa -f ssh\_host\_rsa\_key -C '' -N '' + ```bash + [me@serverPR me]$ mkdir ~/myexport && touch myexport/foobar + ``` -3. Visualizzare l'impronta digitale della chiave creata in precedenza. Digita: +4. Disconnettersi dal serverPR. Digitare: -\[root@serverXY spare-keys\]\# ssh-keygen -l -f ssh\_host\_rsa\_key + ```bash + [me@serverPR me]$ exit + ``` -4. Scrivete il comando per creare una chiave di tipo ***dsa*** "ssh_host_dsa_key" senza commenti, + Verrete riportati alla vostra shell locale sul serverXY. - e senza passphrase? +5. Usare `ssh` per eseguire da remoto il comando "ls" per visualizzare ricorsivamente l'elenco dei file nella directory home di me sul serverPR. Digitare: -## Esercizio 6 + ```bash + [root@localhost ~]# ssh me@serverPR 'ls -lR /home/me/myexport' + me@localhost's password: + ...... + /home/me/myexport: + total 0 + -rw-rw-r-- 1 me me 0 Oct 9 16:48 foobar + ``` -### ssh + Digitare la password di me quando viene richiesto. Se vengono visualizzati messaggi di avvertimento, digitare "yes" per continuare. -``` -Uso:- ssh \[-l login_nome\] hostname | user@hostname \[command\] +6. Mentre si è ancora connessi al serverXY, provare a riavviare da remoto il serverPR come utente `ying`. Digitare: - ssh \[-afgknqstvxACNTX1246\] \[-b bind_address\] \[-c cipher\_spec] + ```bash + [me@localhost ~]# ssh -l ying localhost 'reboot' + ying@localhost's password: + ...... + ``` - \[-e escape\_char\] \[-i identity\_file\] \[-l login\name\] \[-m mac\_spec] + Digitare la password di ying quando richiesto. - \[-o option\] \[-p port\] \[-F configfile\] \[-L port:host:hostport\] + !!! question "Domande" -\[-R port:host:hostport\] \[-D port\] hostname | user@hostname \[command\] -``` + L'utente ying è riuscito a riavviare il serverPR da remoto? Perché ying non può riavviare il serverPR da remoto? -Per utilizzare ssh +7. Dal serverXY, provare a visualizzare da remoto lo stato del servizio `sshd` in esecuzione sul serverPR come utente `ying`. Digitare: -1. Accedere al serverXY come utente me. + ```bash + [root@localhost ~]# ssh -l ying localhost 'systemctl status sshd.service' + ying@localhost's password: + ● sshd.service - OpenSSH server daemon + ``` -2. Utilizzare ssh per connettersi al serverPR. Digita: +8. Dal serverXY, provare a riavviare da remoto il servizio `sshd` in esecuzione sul serverPR come utente `ying`. Digitare: -\[me@serverXY me\]$ ***ssh serverPR*** + ```bash + [root@localhost ~]# ssh -l ying localhost 'systemctl restart sshd.service' + ying@localhost's password: + Failed to restart sshd.service: Interactive authentication required. + See system logs and 'systemctl status sshd.service' for details. + ``` - Digitare la password di me quando richiesto. Se vengono visualizzati messaggi di avvertimento, digitare "sì" per continuare. + !!! question "Domande" -3. Dopo aver effettuato l'accesso, creare una directory chiamata - myexport e creare un file vuoto. Digita: + - L'utente ying è stato in grado di visualizzare da remoto lo stato del servizio sshd sul serverPR? + - L'utente ying è riuscito a riavviare da remoto il servizio sshd sul serverPR? + - Scrivete una breve spiegazione del comportamento che state osservando. -\[me@serverPR me\]$ ***mkdir ~/myexport && touch myexport/$$*** +9. Digitare "exit" per disconnettersi dal serverPR e tornare al serverXY. -Prendere nota del file casuale che è stato creato per voi, sotto ~/myexport ? +### `scp` - secure copy (programma di copia remota di file) -4. Disconnettersi dal serverPR. Digita: +scp copia i file tra gli host di una rete. Utilizza ssh per il trasferimento dei dati e utilizza la stessa autenticazione e fornisce la stessa sicurezza di ssh. -\[me@serverPR me\]$ ***exit*** +```bash +usage: scp [-346BCpqrTv] [-c cipher] [-F ssh_config] [-i identity_file] + [-J destination] [-l limit] [-o ssh_option] [-P port] + [-S program] source ... target +``` -Verrete riportati alla vostra shell locale sul serverXY. +#### Per utilizzare `scp` -5. Usare ssh per eseguire da remoto il comando "ls" per visualizzare l'elenco dei file nella home directory di ying a +1. Assicuratevi di essere ancora connessi come utente me sul serverXY. - serverPR. Digita: +2. Creare una directory sotto la propria home directory chiamata myimport e fare un cd nella directory. -\[me@serverXY me\]$ ***ssh ying@serverPR “ls /home/ying”*** +3. Copiare tutti i file nella directory "/home/me/myexport/" sul serverPR. (il punto "." alla fine del comando è importante). Digitare: -Digitare la password di ying quando richiesto. Se vengono visualizzati messaggi di avvertimento, digitare "sì" per continuare. + ```bash + [me@localhost ~myimport]# scp serverPR:/home/me/myexport . + me@serverPR's password: + scp: /home/me/myexport: not a regular file + ``` -6. Mentre sono ancora connesso come me sul serverXY, accedere al serverPR come utente ying. Digita: + !!! question "Domanda" -\[me@serverXY me\]$ ***ssh -l ying serverPR *** + Scrivere una breve spiegazione del motivo per cui il comando precedente è fallito? - **Digitare la password di ying quando richiesto.** +4. Eseguite nuovamente il comando precedente, ma questa volta aggiungendo l'opzione ricorsiva a `scp`. Digitare: -7. Digitare "exit" per disconnettersi dal serverPR e tornare al serverXY. + ```bash + [me@localhost ~myimport]# scp -r me@serverPR:/home/me/myexport . + me@localhost's password: + foobar + ``` -scp + !!! question "Domanda" -scp - secure copy (programma di copia remota di file) + Qual è la differenza tra le variazioni di questi due comandi e in quali circostanze avranno lo stesso risultato? -scp copia i file tra gli host di una rete. Utilizza ssh per il trasferimento dei dati e utilizza la stessa autenticazione e fornisce la stessa sicurezza di ssh. + ```bash + scp me@serverPR:/home/me/myexport . + ``` -``` -Uso:- scp \[-pqrvBC46\] \[-F ssh_config] \[-S program\] \[-P port\] \[-c cipher\] - \[-i identity\_file\] \[-o ssh\_option\] \[\[user@\]host1:\] file1 \[...\] + e - \[\[uteser@\]host2:\] file2 - ``` + ```bash + scp serverPR:/home/me/myexport . + ``` -Per utilizzare scp +5. Qual è il comando per copiare tutto il contenuto di "/home/me/.gnugp/" sul serverPR? -1. Assicuratevi di essere ancora connessi come utente me sul serverXY. +6. Ora copiare la directory home di ying sul serverPR. Digitare: -2. Creare una directory sotto la propria home directory chiamata myimport e fare un cd nella directory. + ```bash + [me@localhost ~myimport]# scp -r ying@localhost:/home/ying/ ying_home_directory_on_serverPR + ``` -3. Copiare tutti i file nella directory "/home/me/myexport/" sul serverPR. Digita: +7. Anche in questo caso, eseguire una leggera variazione del comando precedente per copiare la directory home di ying sul serverPR. Digitare: -\[me@serverXY myimports\]$ ***scp serverPR:/home/me/myexport .*** + ```bash + [me@localhost ~myimport]# scp -r ying@localhost:/home/ying ying_home_directory_on_serverPR + ``` -4. Elencare il contenuto della propria pwd ? + !!! question "Domande" - E' stato un vero e proprio colpo di fulmine o cosa? + Qual è la leggera ma significativa differenza tra le variazioni dei due comandi precedenti? E qual è il risultato di ogni comando? -5. Qual è il comando per copiare tutto il contenuto di "/home/me/.gnugp/" sul serverPR? + ```bash + scp -r ying@localhost:/home/ying/ ying_home_directory_on_serverPR + ``` -6. Ora copiare tutti i file nella directory home di ying sul serverPR. Digita: -\[me@serverXY myimports\]$ ***scp -r ying@serverPR:/home/ying/\* .*** + e -## Esercizio 7 + ```bash + scp -r ying@localhost:/home/ying ying_home_directory_on_serverPR + ``` -### Creazione di chiavi pubbliche e private dell'utente per SSH +8. Utilizzare il comando `ls -alR` per visualizzare un elenco dei contenuti dei 2 passaggi precedenti. Digitare: -Ogni utente che vuole usare SSH con autenticazione RSA o DSA ha bisogno di una serie di chiavi pubbliche e private. Il programma ssh-keygen può essere usato per creare queste chiavi (proprio come è stato usato in precedenza quando si sono create le chiavi di riserva per il proprio sistema) + ```bash + [me@localhost ~myimport]# ls -al ying_home_directory_on_serverPR/ + ``` -L'unica differenza "consigliata" quando si creano chiavi utente è quella di creare anche una passphrase. + !!! question "Domanda" -La passphrase è una password che viene utilizzata per crittografare la chiave privata prima che venga memorizzata sul file system. + Fornite una breve spiegazione dell'output del comando `ls -alR`? Spiega ad esempio perché sembra che ci siano dei duplicati dei file .bash_history, .bashrc ... -La chiave pubblica viene memorizzata in un file con lo stesso nome della chiave privata, ma con l'estensione ".pub". Non c'è modo di recuperare una passphrase persa. Se la passphrase viene persa o dimenticata, è necessario generare una nuova chiave. +## Esercizio 7 -Per creare le chiavi di autenticazione di ying +### Creazione di chiavi pubbliche e private dell'utente per SSH -1. Accedere al computer locale come utente ying. +Ogni utente che vuole usare SSH con autenticazione RSA o DSA ha bisogno di una coppia di chiavi pubbliche e private. Il programma `ssh-keygen` può essere utilizzato per creare queste chiavi (proprio come è stato utilizzato in precedenza quando si sono create nuove chiavi host per il proprio sistema) -2. Eseguire il programma "ssh-keygen" per creare una chiave di tipo "***dsa***" con la lunghezza predefinita. Digita: +!!! tip "Suggerimento" -\[ying@serverXY ying\]$ ***ssh-keygen -t dsa*** + La differenza principale tra chiavi host e chiavi utente è che si consiglia di proteggere le chiavi utente con una passphrase. La passphrase è una password utilizzata per criptare la chiave privata [testo semplice]. -Generazione della coppia di chiavi pubbliche/private dsa. +La chiave pubblica viene memorizzata in un file con lo stesso nome della chiave privata, ma con l'estensione ".pub". Non esiste un modo semplice per recuperare una passphrase persa. Se la passphrase viene persa o dimenticata, è necessario generare una nuova chiave. -Premere \[INVIO] per accettare la posizione predefinita del file. +#### Per creare le chiavi di autenticazione pubbliche/private degli utenti -Inserire il file in cui salvare la chiave (/home/ying/.ssh/id\_dsa): \[ENTER\] +1. Accedere al computer locale come utente ying. -Quando viene richiesto, inserire una buona passphrase, cioè difficile da indovinare. +2. Eseguire il programma `ssh-keygen` per creare una chiave di tipo "dsa" con la lunghezza predefinita. Digitare: -Created directory '/home/ying/.ssh'. + ```bash + [ying@serverXY ying]$ ssh-keygen -t dsa -Enter passphrase (empty for no passphrase): \*\*\*\*\*\*\*\*\* + Generating public/private dsa key pair. + ``` -Enter same passphrase again: \*\*\*\*\*\*\*\*\* + Premere ++enter++ per accettare la posizione predefinita del file. -Your identification has been saved in /home/ying/.ssh/id\_dsa. + ```bash + Enter file in which to save the key (/home/ying/.ssh/id_dsa): + Created directory '/home/ying/.ssh'. + ``` -Your public key has been saved in /home/ying/.ssh/id\_dsa.pub. + Verrà richiesto due volte di inserire una passphrase. Immettere una passphrase valida e ragionevolmente difficile da indovinare. Premere ++enter++ dopo ogni richiesta. -The key fingerprint is: + ```bash + Enter passphrase (empty for no passphrase): ***** + Enter same passphrase again: ***** + Your identification has been saved in /home/ying/.ssh/id_dsa. + Your public key has been saved in /home/ying/.ssh/id_dsa.pub. + The key fingerprint is: + SHA256:ne7bHHb65e50HJPchhbiSvEZ0AZoQCEnnFdBPedGrDQ ying@localhost.localdomain + The key's randomart image is: + +---[DSA 1024]----+ + | .oo==++o+ | + | o+. o E.* | + ...... + ``` -61:68:aa:c2:0c:af:9b:49:4a:11:b8:aa:b5:84:18:10 ying@serverXY.example.org + Dopo il completamento, verrà visualizzato un messaggio che indica che l'identificazione e le chiavi pubbliche sono state salvate nella directory `/home/ying/.ssh/`. -3. passare alla directory "**~/.ssh/**". Elencare i file presenti nella directory? +3. passare alla cartella `~/.ssh/`. Elenca i file della directory. -4. Qual è il comando "ssh-keygen" per visualizzare l'impronta digitale delle chiavi? +4. Qual è il comando `ssh-keygen` per visualizzare l'impronta digitale delle chiavi? -5. Usare il comando cat per visualizzare il contenuto del file della chiave pubblica (ad esempio "**~/.ssh/id\_rsa.pub**"). +5. Usare il comando cat per visualizzare il contenuto del file della chiave pubblica (ad esempio `~/.ssh/id_dsa.pub`). ## Esercizio 8 ### Autenticazione tramite chiave pubblica -Finora si è utilizzato uno schema di autenticazione basato su password per accedere agli account utente del serverPR. +Thus far, you have been using a password-based authentication to log into user accounts at serverPR. -Ciò significa che, per poter accedere con successo, era necessario conoscere la password dell'account corrispondente sul lato remoto. +Ciò significa che, per accedere con successo, è necessario conoscere la password dell'account corrispondente sul lato remoto. In questo esercizio si configura l'autenticazione a chiave pubblica tra il proprio account utente sul serverXY e l'account utente di ying sul serverPR. -Per configurare l'autenticazione a chiave pubblica +#### Per configurare l'autenticazione a chiave pubblica -1. Accedere al sistema locale come utente ying. +1. Accedere al sistema locale come utente *ying*. 2. passare alla directory "~/.ssh". -3. Digitate il comando orribile che segue: - -\[ying@serverXY .ssh\]$ ***cat id\_dsa.pub | ssh ying@serverPR \\*** - - '(cd ~/.ssh && cat - >> authorized\_keys && chmod 600 authorized\_keys)' +3. Inserite i comandi sottostanti esattamente come mostrato. Verrà richiesta la password di ying sul serverPR. Digitare: - Il comando di cui sopra si legge: + ```bash + [ying@serverXY .ssh]$ cat id_dsa.pub | ssh ying@serverPR \ - a. cat il contenuto del file dsa public-key, ma inviando il contenuto alla pipe ( | ) invece che al file + '(cd ~/.ssh && cat - >> authorized_keys && chmod 600 authorized_keys)' + ``` - standard abituale. + In parole povere, il comando di cui sopra si legge: - b. eseguire il comando "***cd ~/.ssh && cat - >> authorized\_keys && chmod 600 authorized\_keys"*** + a. catturare il contenuto del file della chiave pubblica dsa e inviare via pipe ( | ) l'output a `ssh ying@serverPR` - come utente ying sul serverPR. + b. eseguire il comando “cd ~/.ssh && cat - >> authorized_keys && chmod 600 authorized_keys” come utente ying sul serverPR. - c. Lo scopo del comando è semplicemente quello di copiare e aggiungere il contenuto della propria chiave pubblica + !!! NOTE "Nota" - nel file "/home/ying/.ssh/authorized\_keys" sul serverPR e dargli i permessi corretti. + Lo scopo del precedente comando dall'aspetto complicato è quello di copiare e aggiungere il contenuto del file della chiave pubblica in "/home/ying/.ssh/authorized_keys" sul serverPR e dargli i permessi corretti. - Se conoscete un altro modo manuale per ottenere lo stesso risultato, fatelo. + !!! tip "Suggerimento" -4. Dopo aver aggiunto la propria chiave pubblica al file authorized\_keys del sistema remoto. Tentativo di + È possibile utilizzare l'utilità `ssh-copy-id` per configurare in modo semplice e più elegante l'autenticazione con chiave pubblica/privata tra i sistemi. `ssh-copy-id` è uno script che utilizza `ssh` per accedere a una macchina remota (presumibilmente utilizzando inizialmente una password di accesso. + Assembla un elenco di una o più impronte digitali (come descritto di seguito) e cerca di accedere con ciascuna chiave, per vedere se qualcuna di esse è già installata. Quindi compila un elenco di quelli che non sono riusciti ad accedere e, utilizzando `ssh`, abilita gli accessi con quelle chiavi sul sistema remoto. Per impostazione predefinita, aggiunge le chiavi aggiungendole a ~/.ssh/authorized_keys dell'utente remoto (creando il file e la directory, se necessario). - accedere al serverPR come ying tramite ssh. Digita: +4. Dopo aver aggiunto la propria chiave pubblica al file authorized_keys del sistema remoto. Tentare di accedere al serverPR come ying tramite ssh. Digitare: -\[ying@serverXY .ssh\]$ ***ssh serverPR*** + ```bash + [ying@serverXY .ssh]$ ssh serverPR + Enter passphrase for key '/home/ying/.ssh/id_dsa': ** + ``` -Enter passphrase for key '/home/ying/.ssh/id\_dsa': \*\*\*\*\*\*\*\*\*\* - -Si noti con molta attenzione che questa volta viene richiesta la passphrase anziché il nome del programma - -password. Inserire la passphrase creata in precedenza al momento della creazione delle chiavi. + Si noti che questa volta viene richiesta la passphrase invece della password utente. Inserire la passphrase creata in precedenza al momento della creazione delle chiavi. 5. Dopo aver effettuato l'accesso al serverPR, effettuare il logout. ## Esercizio 9 -### ssh-agent +### `ssh-agent` -Secondo la pagina man - ssh-agent è un programma per conservare le chiavi private utilizzate per l'autenticazione a chiave pubblica (RSA, DSA). L'idea è che ssh-agent venga avviato all'inizio di una sessione X o di una sessione di login e che tutte le altre finestre o programmi vengano avviati come client del programma ssh-agent. Tramite l'uso di variabili d'ambiente, l'agente può essere individuato e utilizzato automaticamente per l'autenticazione quando si accede ad altre macchine tramite ssh. +According to the man page - `ssh-agent` is a program to hold private keys used for public key authentication (RSA, DSA, ECDSA, Ed25519). L'idea è che `ssh-agent` venga avviato all'inizio di una sessione utente o di accesso, e tutte le altre finestre o programmi vengano avviati come client del programma `ssh-agent`. Attraverso l'uso di variabili d'ambiente, l'agente può essere individuato e utilizzato automaticamente per l'autenticazione quando si accede ad altre macchine utilizzando `ssh`. -``` -Uso ssh-agent \[-a bind_address\] \[-c | -s\] \[-d\] \[command \[args ...\]\] - - ssh-agent \[-c | -s\] -k +```bash +SYNOPSIS + ssh-agent [-c | -s] [-Dd] [-a bind_address] [-E fingerprint_hash] [-P pkcs11_whitelist] [-t life] [command [arg ...]] + ssh-agent [-c | -s] -k ``` In questo esercizio si apprenderà come configurare l'agente in modo da non dover digitare la passphrase ogni volta che ci si vuole connettere a un altro sistema utilizzando l'autenticazione a chiave pubblica. -1. Assicuratevi di aver effettuato l'accesso al sistema locale come utente ying. +1. Assicurarsi di aver effettuato l'accesso al sistema locale come utente *ying*. 2. Digitare il comando seguente: -[ying@serverXY .ssh\]$ ***eval \`ssh-agent\`*** + ```bash + [ying@localhost ~]$ eval `ssh-agent` + Agent pid 6354 + ``` + + Prendere nota del valore dell'ID di processo (PID) dell'agente nell'output. + +3. Eseguire il programma `ssh-add` per elencare le impronte digitali di tutte le identità [pubbliche/private] attualmente rappresentate dall'agente. Digitare: + + ```bash + [ying@localhost ~]$ ssh-add -l + The agent has no identities. + ``` + + Non dovrebbe esserci ancora nessuna identità elencata. + +4. Utilizzare il programma `ssh-add` senza alcuna opzione per aggiungere le chiavi all'agente lanciato in precedenza. Digitare: -Agent pid 5623 + ```bash + [ying@localhost ~]$ ssh-add + ``` -Prendere nota del PID dell'agente: + Quando viene richiesto, inserire la passphrase. -3. Utilizzare il programma "***ssh-add***" per aggiungere le chiavi all'agente lanciato in precedenza. Digita: + ```bash + Enter passphrase for /home/ying/.ssh/id_dsa: + Identity added: /home/ying/.ssh/id_dsa (ying@localhost.localdomain) + ``` -[ying@serverXY .ssh\]$ ***ssh-add*** +5. Eseguire nuovamente il comando `ssh-add` per elencare le identità di impronte digitali conosciute. Digitare: - Quando viene richiesto, inserire la passphrase. + ```bash + [ying@localhost ~]$ ssh-add -l + 1024 SHA256:ne7bHHb65e50.......0AZoQCEnnFdBPedGrDQ ying@server (DSA) + ``` -Enter passphrase for /home/ying/.ssh/id\_dsa: +6. Ora, come utente *ying*, provate a connettervi in remoto al serverPR ed eseguite un semplice comando di prova. -Identity added: /home/ying/.ssh/id\_dsa (/home/ying/.ssh/id\_dsa) + Supponendo che sia stato fatto tutto correttamente fino a questo punto per quanto riguarda l'impostazione e la memorizzazione delle chiavi pertinenti, NON dovrebbe essere richiesta una password o una passphrase. Digitare: -4. Ora collegarsi al serverPR come utente ying. NON vi verrà richiesta una password o un'autorizzazione + ```bash + [ying@serverXY .ssh]$ ssh serverPR 'ls /tmp' + ``` -passphrase (cioè se tutto è stato fatto correttamente). Digita: +7. Se si è finito e non si ha più bisogno dei servizi di `ssh-agent` o semplicemente si vuole tornare all'autenticazione basata sulle chiavi, si possono cancellare tutte le identità [private/pubbliche] dall'agente. Digitare: -[ying@serverXY .ssh\]$ ***ssh serverPR*** + ```bash + [ying@localhost ~]$ ssh-add -D + All identities removed. + ``` -5. Divertitevi. +8. Tutto fatto! From 0811caa4db19b1af8a20454180086a16983a006a Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Thu, 31 Jul 2025 06:03:23 -0700 Subject: [PATCH 089/164] New Crowdin updates (#2811) * New translations tailscale_vpn.md (French) * New translations lab8-samba.md (Italian) * New translations lab0-readme.md (Italian) * New translations lab3-bootup_and_startup.md (Italian) * New translations lab6-the_file_system.md (Italian) * New translations lab7-the_linux_kernel.md (Italian) --- docs/guides/security/tailscale_vpn.fr.md | 80 +++++ .../kubernetes-the-hard-way/lab0-README.it.md | 56 ++++ docs/labs/networking/lab8-samba.it.md | 298 ++++++++++++++++++ .../lab3-bootup_and_startup.it.md | 91 +++--- .../lab6-the_file_system.it.md | 203 +++++++----- .../lab7-the_linux_kernel.it.md | 122 +++---- 6 files changed, 661 insertions(+), 189 deletions(-) create mode 100644 docs/guides/security/tailscale_vpn.fr.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab0-README.it.md create mode 100644 docs/labs/networking/lab8-samba.it.md diff --git a/docs/guides/security/tailscale_vpn.fr.md b/docs/guides/security/tailscale_vpn.fr.md new file mode 100644 index 0000000000..f977a1f3f4 --- /dev/null +++ b/docs/guides/security/tailscale_vpn.fr.md @@ -0,0 +1,80 @@ +--- +title: Tailscale VPN +author: Neel Chauhan +contributors: Steven Spencer, Ganna Zhyrnova +tested_with: 9.3 +tags: + - sécurité + - vpn +--- + +# Tailscale VPN + +## Introduction + +[Tailscale](https://tailscale.com/) est un VPN peer-to-peer chiffré de bout en bout, sans configuration, basé sur Wireguard. Tailscale prend en charge tous les principaux systèmes d'exploitation de bureau et mobiles. + +Comparé à d’autres solutions VPN, Tailscale ne nécessite pas de ports TCP/IP ouverts et peut fonctionner derrière la traduction d’adresses réseau ou un pare-feu. + +## Prérequis + +Voici les exigences minimales pour utiliser cette procédure : + +- La possibilité d'exécuter des commandes en tant qu'utilisateur `root` ou d'utiliser `sudo` pour élever les privilèges +- Un compte Tailscale + +## Installation de Tailscale + +Pour installer Tailscale, nous devons d'abord ajouter son référentiel `dnf` (remarque : si vous utilisez Rocky Linux 8.x ou 10.x, remplacez-le par 8 ou 10 respectivement) : + +```bash +dnf config-manager --add-repo https://pkgs.tailscale.com/stable/rhel/9/tailscale.repo +``` + +Ensuite installez `Tailscale` : + +```bash +dnf install tailscale +``` + +## Configuration de Tailscale + +Une fois les paquets installés, vous devez activer et configurer Tailscale. Pour activer le démon Tailscale : + +```bash +systemctl enable --now tailscaled +``` + +Par la suite, vous vous authentifierez auprès de Tailscale : + +```bash +tailscale up +``` + +Vous obtiendrez une URL pour l'authentification. Visitez-le dans un navigateur et connectez-vous à Tailscale : + +![Tailscale login screen](../images/tailscale_1.png) + +Ensuite, vous accorderez l’accès à votre serveur. Cliquez **Connect** pour ce faire : + +![Tailscale grant access dialog](../images/tailscale_2.png) + +Une fois l'accès accordé, vous verrez une boîte de dialogue de réussite : + +![Tailscale login successful dialog](../images/tailscale_3.png) + +Une fois que votre serveur est authentifié avec Tailscale, il obtiendra une adresse IPv4 Tailscale : + +```bash +tailscale ip -4 +``` + +Il recevra également une adresse IPv6 Tailscale RFC 4193 (adresse locale unique) : + +```bash +tailscale ip -6 +``` + +## Conclusion + +Les services VPN traditionnels utilisant une passerelle VPN sont centralisés. Cela nécessite une configuration manuelle, la configuration de votre pare-feu et l'attribution de comptes d'utilisateurs. Tailscale résout ce problème grâce à son modèle pair-à-pair combiné à un contrôle d'accès au niveau du réseau. diff --git a/docs/labs/kubernetes-the-hard-way/lab0-README.it.md b/docs/labs/kubernetes-the-hard-way/lab0-README.it.md new file mode 100644 index 0000000000..65d4837bc3 --- /dev/null +++ b/docs/labs/kubernetes-the-hard-way/lab0-README.it.md @@ -0,0 +1,56 @@ +--- +title: Introduzione +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +--- + +# Kubernetes The Hard Way (Rocky Linux) + +!!! info + + Questo è un fork dell'originale [“Kubernetes the hard way”](https://github.com/kelseyhightower/kubernetes-the-hard-way) scritto originariamente da Kelsey Hightower (GitHub: kelseyhightower). A differenza dell'originale, che si basa su distribuzioni simili a Debian per l'architettura ARM64, questo fork è destinato alle distribuzioni Enterprise Linux come Rocky Linux, che funzionano su architettura x86_64. + + Tradotto con DeepL.com (versione gratuita) + +Questo tutorial vi guiderà nella configurazione di Kubernetes alla maniera "hard way". Non è adatto per chi è alla ricerca di un tool completamente automatizzato per configurare un cluster Kubernetes. Kubernetes The Hard Way è progettato per l'apprendimento, il che significa intraprendere un iter più lungo per assicurarsi di comprendere ogni task necessario per avviare un cluster Kubernetes. + +Il risultato finale di questo tutorial non è da considerare adatto per un ambiente di produzione e potrebbe non essere supportato dalla comunty, ma non si lasci che questo vi impedisca di imparare! + +## Copyright + +![Creative Commons License](images/cc_by_sa.png) + +La licenza di quest'opera è concessa ai sensi della [Creative Commons Attribution-NonCommercial-=ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-nc-sa/4.0/). + +## Destinatari + +Questo tutorial è rivolto a chiunque desideri comprendere i fondamenti di Kubernetes e il funzionamento dei suoi componenti principali. + +## Dettagli del cluster + +Kubernetes The Hard Way vi guiderà nel processo di avvio di un cluster Kubernetes di base con tutti i componenti del control plane in esecuzione su un singolo nodo e due nodi di elaborazione (worker), sufficienti per apprendere i concetti fondamentali. + +Versioni dei componenti: + +- [kubernetes](https://github.com/kubernetes/kubernetes) v1.32.x +- [containerd](https://github.com/containerd/containerd) v2.0.x +- [cni](https://github.com/containernetworking/cni) v1.6.x +- [etcd](https://github.com/etcd-io/etcd) v3.4.x + +## Labs + +Questo tutorial richiede quattro (4) macchine virtuali o fisiche basate su x86_64 collegate alla stessa rete. Sebbene il tutorial utilizzi macchine basate su x86_64, è possibile applicare le nozioni apprese ad altre piattaforme. + +- [Prerequisiti](lab1-prerequisites.md) +- [Configurazione della Jumpbox](lab2-jumpbox.md) +- [Provisioning delle risorse di calcolo](lab3-compute-resources.md) +- [Provisioning della CA e generazione dei certificati TLS](lab4-certificate-authority.md) +- [Generazione dei file di configurazione Kubernetes per l'autenticazione](lab5-kubernetes-configuration-files.md) +- [Generazione della configurazione e della chiave di crittografia dei dati](lab6-data-encryption-keys.md) +- [Avvio del cluster etcd](lab7-bootstrapping-etcd.md) +- [Avvio del Control Plane di Kubernetes](lab8-bootstrapping-kubernetes-controllers.md) +- [Avvio dei nodi Worker di Kubernetes](lab9-bootstrapping-kubernetes-workers.md) +- [Configurazione di kubectl per l'accesso remoto](lab10-configuring-kubectl.md) +- [Provisioning delle rotte di rete dei pod](lab11-pod-network-routes.md) +- [Smoke Test](lab12-smoke-test.md) +- [Cleaning Up](lab13-cleanup.md) diff --git a/docs/labs/networking/lab8-samba.it.md b/docs/labs/networking/lab8-samba.it.md new file mode 100644 index 0000000000..3af062dce1 --- /dev/null +++ b/docs/labs/networking/lab8-samba.it.md @@ -0,0 +1,298 @@ +--- +author: Wale Soyinka +contributors: Ganna Zhyrnova +tested on: All Versions +tags: + - samba + - cifs + - smbd + - nmbd + - smb.conf + - smbpasswd + - network file system +--- + +# Laboratorio 8: Samba + +## Obiettivi + +Dopo aver completato questo laboratorio, sarete in grado di + +- installare e configurare Samba +- condividere file e directory tra sistemi Linux utilizzando Samba +- utilizzare le comuni utilità di Samba + +Tempo stimato per completare questo laboratorio: 40 minuti + +## Introduzione + +Samba consente la condivisione di file e servizi di stampa tra sistemi Unix/Linux e Windows. + +Samba è un'implementazione open-source del "Common Internet File System" (CIFS). CIFS viene anche chiamato Server Message Block (SMB), LAN manager o protocollo NetBIOS. +Il server Samba comprende due demoni principali: smbd e nmbd. + +_smbd_: Questo demone fornisce servizi di file e di stampa ai client SMB, come le macchine che eseguono vari sistemi operativi Microsoft. + +_nmbd_: Questo demone fornisce il supporto per i nomi NETBIOS e la navigazione. + +Gli esercizi di questo laboratorio si concentrano sulla configurazione di Samba come server e client su un server Rocky Linux. + +## Esercizio 1 + +### Installare Samba e configurare una directory condivisa di base + +#### Per installare l'applicazione server Samba + +0. Utilizzare l'utilità dnf per installare il pacchetto server e client Samba sul server. + Digitare: + ```bash + sudo dnf install -y samba + ``` + +#### Configurazione di Samba + +1. Creare una directory denominata samba-share sotto la cartella /tmp da condividere. Digitare: + + ```bash + mkdir /tmp/samba-share + ``` + +2. Creiamo una configurazione Samba di base per condividere la cartella /tmp/samba-share. + A questo scopo, creare una nuova definizione di condivisione nel file di configurazione di Samba: + + ```bash + sudo tee -a /etc/samba/smb.conf << 'EOF' + [Shared] + path = /tmp/samba-share + browsable = yes + writable = yes + EOF + ``` + +#### Per avviare e abilitare il servizio Samba + +1. Avviare e abilitare i servizi Samba: + + ```bash + sudo systemctl start smb nmb + sudo systemctl enable smb nmb + ``` + +2. Verificare che i demoni utilizzati dal servizio Samba siano in esecuzione: + + ```bash + sudo systemctl status smb nmb + ``` + +## Esercizio 2 + +### Utenti Samba + +Un'attività amministrativa importante e comune per la gestione di un server Samba è la creazione di utenti e password per gli utenti che devono accedere alle risorse condivise. + +Questo esercizio mostra come creare utenti Samba e impostare le credenziali di accesso per gli utenti. + +#### Per creare un utente Samba e una password Samba + +1. Per prima cosa, creare un normale utente di sistema chiamato sambarockstar. Digitare: + + ```bash + sudo useradd sambarockstar + ``` + +2. Verificare che l'utente sia stato creato correttamente. Digitare: + ```bash + id sambarockstar + ``` + +3. Aggiungere il nuovo utente di sistema sambarockstar al database degli utenti Samba e contemporaneamente impostare una password per l'utente Samba: + + ```bash + sudo smbpasswd -a sambarockstar + ``` + + Quando viene richiesto, inserire la password selezionata e premere INVIO dopo ogni inserimento. + +4. Riavviare i servizi Samba: + ```bash + sudo systemctl restart smb nmb + ``` + +## Esercizio 3 + +### Accesso alla condivisione Samba (test locale) + +In questo esercizio, proveremo ad accedere alla nuova condivisione Samba dallo stesso sistema. Ciò significa che utilizzeremo lo stesso host sia come server che come client. + +#### Per installare gli strumenti del client Samba + +0. Installare Client Utilities eseguendo: + + ```bash + sudo dnf -y install cifs-utils + ``` + +#### Per creare un punto di montaggio Samba + +0. Creare il punto di montaggio: + ```bash + mkdir ~/samba-client + ``` + +#### Per montare un file system SMB localmente + +1. Montare la condivisione Samba in locale: + + ```bash + sudo mount -t cifs //localhost/Shared ~/samba-client -o user=sambarockstar + ``` + +2. Usare il comando `mount` per elencare tutti i file system di tipo CIFS montati. Digitare: + ```bash + mount -t cifs + ``` + OUTPUT + ```bash + //localhost/Shared on ~/samba-client type cifs (rw,relatime,vers=3.1.1,cache=strict,username=sambarockstar.... + ...... + ``` + +3. Allo stesso modo, utilizzare il comando `df` per verificare che la condivisione montata sia disponibile. Digitare: + + ```bash + df -t cifs + ``` + + OUTPUT: + + ``` + Filesystem 1K-blocks Used Available Use% Mounted on + //localhost/Shared 73364480 17524224 55840256 24% ~/samba-client + ``` + +4. Quindi, elencare il contenuto della condivisione montata. Digitare: + + ```bash + ls ~/samba-client + ``` + +5. Creare un file di prova in Share: + + ```bash + touch ~/samba-client/testfile.txt + ``` + +## Esercizio 4 + +### Modifica delle autorizzazioni di condivisione + +#### Per regolare le autorizzazioni di condivisione + +1. Rendere la definizione della condivisione samba "Shared" di sola lettura. Questo può essere fatto cambiando il valore del parametro writable da yes a no nel file di configurazione smb.conf. Usiamo un comando `sed` onliner per ottenere questo risultato eseguendo: + + ```bash + sudo sed -i'' -E \ + '/\[Shared\]/,+3 s/writable =.*$/writable = no/' /etc/samba/smb.conf + ``` + +2. Riavviare i servizi Samba: + ```bash + sudo systemctl restart smb nmb + ``` + +3. A questo punto, si può testare la scrittura sulla condivisione provando a creare un file sulla condivisione montata: + + ```bash + touch ~/samba-client/testfile2.txt + ``` + +## Esercizio 5 + +### Utilizzo di Samba per gruppi di utenti specifici + +Questo esercizio illustra come limitare l'accesso alle condivisioni Samba tramite l'appartenenza al gruppo locale di un utente. Si tratta di un comodo meccanismo per rendere accessibili le risorse condivise solo a gruppi di utenti specifici. + +#### Per creare un nuovo gruppo per l'utente Samba + +1. Usare l'utilità groupadd per creare un nuovo gruppo di sistema chiamato rockstars. Nel nostro esempio utilizzeremo questo gruppo per ospitare gli utenti del sistema che possono accedere a una determinata risorsa. Digitare: + ```bash + sudo groupadd rockstars + ``` +2. Aggiungere al gruppo un utente di sistema/Samba esistente. Digitare: + ```bash + sudo usermod -aG rockstars sambarockstar + ``` + +#### Per configurare gli utenti autorizzati nella configurazione di Samba + +1. Utilizzare l'utilità sed per aggiungere nuovi parametri utente validi alla definizione di condivisione nel file di configurazione di Samba. Digitare: + ```bash + sudo sed -i '/\[Shared\]/a valid users = @sambagroup' /etc/samba/smb.conf + ``` +2. Riavviare i servizi Samba: + ```bash + sudo systemctl restart smb nmb + ``` +3. Ora testate l'accesso alla condivisione con sambarockstar e verificate l'accesso. + +## Esercizio 6 + +Questo esercizio simula uno scenario reale in cui si agisce come amministratore di un sistema client e poi si prova ad accedere al servizio Samba sul sistema remoto (server HQ), al quale non si ha alcun accesso o privilegio amministrativo. Come studenti, configurerete un client Samba sulla vostra macchina (serverXY) per accedere a un servizio Samba ospitato su una macchina diversa (serverHQ). Questo riflette le configurazioni standard del posto di lavoro. + +Presupposti: + +- Non si dispone dell'accesso root al serverHQ. +- La condivisione Samba sul serverHQ è già configurata e accessibile. + +#### Per configurare il client Samba sul serverXY + +Configurate la vostra macchina (serverXY) come client Samba per accedere a una directory condivisa su un host separato (serverHQ). + +1. Assicurarsi che le necessarie utilità del client Samba siano installate sul sistema locale. + Se necessario, installarli eseguendo: + + ```bash + sudo dnf install samba-client cifs-utils -y + ``` + +2. Creare un punto di montaggio sul serverXY: + + ```bash + mkdir ~/serverHQ-share + ``` + +#### Per montare la condivisione Samba dal serverHQ + +Sono necessari l'indirizzo IP o l'hostname di serverHQ, il nome della condivisione e le credenziali di Samba. + +Sostituire serverHQ, sharedFolder e yourUsername con i valori reali. + +```` +```bash +sudo mount -t cifs //serverHQ/sharedFolder ~/serverHQ-share -o user=yourUsername +``` +```` + +#### Per verificare e accedere alla condivisione montata + +1. Verificare se la directory condivisa dal serverHQ è stata montata con successo sul computer: + + ```bash + ls ~/serverHQ-share + ``` + +2. Provare ad accedere e modificare i file all'interno della condivisione montata. Ad esempio, per creare un nuovo file: + + ```bash + touch ~/serverHQ-share/newfile.txt + ``` + +#### Per smontare la condivisione remota + +Una volta fatto, smontare la condivisione: + +```` +```bash +sudo umount ~/serverHQ-share +``` +```` diff --git a/docs/labs/systems_administration_II/lab3-bootup_and_startup.it.md b/docs/labs/systems_administration_II/lab3-bootup_and_startup.it.md index 0956b2af15..ce136ec534 100644 --- a/docs/labs/systems_administration_II/lab3-bootup_and_startup.it.md +++ b/docs/labs/systems_administration_II/lab3-bootup_and_startup.it.md @@ -1,7 +1,9 @@ - - - author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: Tutte le versioni tags: - lab exercises - - bootup, target and service management + - bootup management + - target management + - service management - systemd - systemctl - - - @@ -9,24 +11,20 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: Tut # Laboratorio 3: Processi di avvio e di messa in servizio - ## Obiettivi - Dopo aver completato questo laboratorio, sarete in grado di - controllare manualmente alcuni processi e servizi di avvio - controllare automaticamente i servizi - Tempo stimato per completare questo laboratorio: 50 minuti - ## Panoramica del processo di avvio Le esercitazioni di questo laboratorio inizieranno dal processo di avvio fino al login dell'utente. Questi passaggi esaminano e cercano di personalizzare alcune parti dei processi di avvio. Le fasi principali del processo di avvio sono: -*Riepilogo dei passaggi* +### Riepilogo delle fasi 1. l'hardware carica, legge ed esegue il settore di boot 2. viene eseguito il bootloader (GRUB sulla maggior parte delle distribuzioni Linux) @@ -34,46 +32,45 @@ Le esercitazioni di questo laboratorio inizieranno dal processo di avvio fino al 4. il kernel inizializza l'hardware 5. il kernel monta il file system di root 6. il kernel esegue /usr/lib/systemd/systemd come PID 1 -7. systemd avvia le unità necessarie e configurate per eseguire il target di avvio predefinito -8. i programmi getty vengono generati su ciascun terminale definito -9. getty richiede il login -10. getty esegue /bin/login come utente effettivo +7. `systemd` avvia le unità necessarie e configurate per eseguire il target di avvio predefinito +8. I programmi `getty` vengono generati su ciascun terminale definito +9. `getty` richiede l'accesso +10. `getty` esegue /bin/login per autenticare l'utente 11. login avvia la shell - ### `systemd` -systemd è un gestore di sistema e di servizi per i sistemi operativi Linux. +`systemd` è un gestore di sistemi e servizi per i sistemi operativi Linux. ### units `systemd` -`systemd` fornisce un sistema di dipendenza tra varie entità chiamate "units". Le units incapsulano vari oggetti necessari per l'avvio e la manutenzione del sistema. La maggior parte delle units viene configurata nei cosiddetti file di configurazione delle units, file di testo semplice in stile ini. +`systemd` fornisce un sistema di dipendenze tra varie entità chiamate "unit". Le unità incapsulano vari oggetti necessari per l'avvio e la manutenzione del sistema. La maggior parte delle unità viene configurata nei cosiddetti file di configurazione delle unità, file di testo semplice in stile ini. -### Tipi di units di `systemd` +### Tipi di unità `systemd` -`systemd` dispone dei seguenti 11 tipi di units definite: +`systemd` definisce i seguenti 11 tipi di unità: -*Service units* avviare e controllare i demoni e i processi che li compongono. +Le *Service units* avviano e controllano i demoni e i processi che li compongono. -*Socket units* incapsulano nel sistema i socket IPC o di rete locali, utili per l'attivazione basata sui socket. +Le *Socket units* incapsulano nel sistema i socket IPC o di rete locali, utili per l'attivazione basata su socket. -*Target units* sono utilizzati per raggruppare altre units. Forniscono punti di sincronizzazione riconosciuti durante l'avvio +Le *Target units* vengono utilizzate per raggruppare altre unità. Forniscono punti di sincronizzazione ben noti durante l'avvio -*Device units* espongono i dispositivi del kernel in systemd e possono essere utilizzati per implementare l'attivazione basata sui dispositivi. +Le *Device units* espongono i dispositivi del kernel in `systemd` e possono essere utilizzate per implementare l'attivazione basata sul dispositivo. -*Mount units* controllare i punti di mount nel file system +Le *Mount units* controllano i punti di montaggio nel file system -*Automount units* forniscono funzionalità di automount, per il montaggio on-demand dei file system e per l'avvio in parallelo. +Le *Automount units* forniscono funzionalità di automount, per il montaggio on-demand dei file system e per l'avvio in parallelo. -*Timer units* sono utili per attivare altre units in base ai timer. +Le *Timer units* sono utili per attivare altre unità sulla base di timer. -*Swap units* sono molto simili alle units di montaggio e incapsulano partizioni di memoria o file di swap del sistema operativo. +Le *Swap units* sono molto simili alle unità di montaggio e incapsulano le partizioni o i file di swap della memoria del sistema operativo. -*Path units* può essere usato per attivare altri servizi quando gli oggetti del file system cambiano o vengono modificati. +Le *Path units* possono attivare altri servizi quando gli oggetti del file system cambiano o vengono modificati. -*Slice units* può essere usato per raggruppare le units che gestiscono i processi del sistema (come le units di servizio e di ambito) in un albero gerarchico per la gestione delle risorse. +Le *Slice units* possono essere utilizzate per raggruppare le unità che gestiscono i processi di sistema (come le unità di servizio e di ambito) in un albero gerarchico per la gestione delle risorse. -*Scope units* sono simili alle units di servizio, ma gestiscono processi estranei invece di avviarli. +Le *Scope units* sono simili alle unità di servizio, ma gestiscono processi estranei invece di avviarli. ## Esercizio 1 @@ -81,7 +78,7 @@ systemd è un gestore di sistema e di servizi per i sistemi operativi Linux. Storicamente l'init è stato chiamato con molti nomi e ha assunto diverse forme. -Indipendentemente dal nome o dall'implementazione, init (o il suo equivalente) è spesso indicato come la *madre di tutti i processi*. +Indipendentemente dal nome o dall'implementazione, init (o il suo equivalente) viene spesso definito come la *madre di tutti i processi*. La pagina man di "init" lo indica come il genitore di tutti i processi. Per convenzione, il primo programma o processo del kernel ad essere eseguito ha sempre un ID di processo pari a 1. Una volta che il primo processo viene eseguito, esso prosegue con l'avvio di altri servizi, demoni, processi, programmi e così via. @@ -141,7 +138,7 @@ La pagina man di "init" lo indica come il genitore di tutti i processi. Per conv ### `systemd` Targets (RUNLEVELS) -`systemd` definisce e si affida a molti obiettivi diversi per la gestione del sistema. In questo esercizio ci concentreremo solo su 5 dei principali target. I 5 target principali esplorati in questa sezione sono elencati qui di seguito: +`systemd` defines and relies on many different targets for managing the system. In questo esercizio ci concentreremo solo su 5 dei principali obiettivi. I 5 obiettivi principali esplorati in questa sezione sono elencati qui: 1. poweroff.target 2. rescue.target @@ -149,7 +146,7 @@ La pagina man di "init" lo indica come il genitore di tutti i processi. Per conv 4. graphical.target - avvia il sistema con la rete, il supporto multiutente e un gestore di display 5. reboot.target -!!! Tip "Suggerimento" +!!! tip "Suggerimento" Le unità target sostituiscono i livelli di esecuzione SysV nel sistema di init SysV classico. @@ -193,10 +190,10 @@ La pagina man di "init" lo indica come il genitore di tutti i processi. Per conv Si notino alcune proprietà e i loro valori configurati nella unit `multi-user.target`. Proprietà come - Descrizione, Documentazione, Richiede, Dopo e così via. -5. La unit `basic.target` è elencata come valore della proprietà `Requires` per `multi-user.target`. Visualizzare il file unit per basic.target. Digitare: +5. La unit `basic.target` è elencata come valore della proprietà `Requires` per `multi-user.target`. Visualizzare il file unit per `basic.target`. Digitare: ```bash - [root@localhost ~]# systemctl cat multi-user.target + [root@localhost ~]# systemctl cat basic.target # /usr/lib/systemd/system/basic.target [Unit] Description=Basic System @@ -224,7 +221,7 @@ La pagina man di "init" lo indica come il genitore di tutti i processi. Per conv Description=Multi-User System ``` -8. Visualizzare i servizi e le risorse che il multi-user.target richiama all'avvio. In altre parole, visualizzare ciò che multi-user.target "Wants". Digitare: +8. Visualizzare i servizi e le risorse che il multi-user.target richiama all'avvio. In altre parole, visualizzare ciò che multi-user.target "vuole". Digitare: ```bash [root@localhost ~]# systemctl show --no-pager -p "Wants" multi-user.target @@ -233,7 +230,7 @@ La pagina man di "init" lo indica come il genitore di tutti i processi. Per conv ...... ``` -9. Utilizzare i comandi `ls` e `file` per saperne di più sulla relazione tra il programma di `init` tradizionale e il programma `systemd`. Digitare: +9. Utilizzare i comandi `ls` e `file` per saperne di più sulla relazione tra il programma di `init` tradizionale e il programma `systemd`. Digitare: ```bash [root@localhost ~]# ls -l /usr/sbin/init && file /usr/sbin/init @@ -244,7 +241,6 @@ La pagina man di "init" lo indica come il genitore di tutti i processi. Per conv #### Per cambiare il target di avvio predefinito - 1. Impostare/modificare il target predefinito in cui il sistema si avvia. Utilizzare il comando `systemctl set-default` per cambiare il target predefinito in `graphical.target`. Digitare: ```bash @@ -268,7 +264,7 @@ La pagina man di "init" lo indica come il genitore di tutti i processi. Per conv [root@localhost ~]# systemctl isolate graphical.target ``` - !!! Warning "Attenzione" + !!! warning "Attenzione" Il comando systemctl isolate può essere pericoloso se usato in modo errato. Questo perché interromperà immediatamente i processi non abilitati nel nuovo target, incluso l'ambiente grafico o il terminale attualmente in uso! @@ -287,9 +283,9 @@ La pagina man di "init" lo indica come il genitore di tutti i processi. Per conv ``` -7. Impostare/modificare la destinazione predefinita per l'avvio del sistema in multi-user.target. +7. Impostare/modificare la destinazione predefinita per l'avvio del sistema in multi-user.target. -8. Eseguire un rapido [e aggiuntivo] controllo manuale per vedere a quale target punta il link simbolico default.target, eseguendo: +8. Eseguire un rapido [e aggiuntivo] controllo manuale per vedere a quale target punta il link simbolico default.target, eseguendo: ```bash [root@localhost ~]# ls -l /etc/systemd/system/default.target @@ -299,7 +295,7 @@ La pagina man di "init" lo indica come il genitore di tutti i processi. Per conv Gli esercizi di questa sezione mostrano come configurare i processi di sistema/utente e i demoni (alias servizi) che possono essere avviati automaticamente con il sistema. -### Per visualizzare lo stato dei servizi +### Per visualizzare lo stato del servizio 1. Mentre si è connessi come root, elencare tutte le unit systemd il cui tipo è un servizio. Digitare: @@ -309,7 +305,7 @@ Gli esercizi di questa sezione mostrano come configurare i processi di sistema/u Questo mostrerà l'elenco completo delle unità attive e di quelle caricate ma inattive. -2. Visualizzare l'elenco delle unit systemd attive che hanno come tipo un servizio. +2. Visualizza l'elenco delle unità `systemd` attive con un tipo di servizio. ```bash [root@localhost ~]# systemctl list-units --state=active --type service @@ -357,7 +353,7 @@ Gli esercizi di questa sezione mostrano come configurare i processi di sistema/u Visualizza lo stato di `firewalld.service'. Cos'è la unit `firewalld.service`? -### Per arrestare i servizi +### Arrestare i servizi 1. Mentre siete ancora connessi come utente con privilegi amministrativi, usate il comando `pgrep` per vedere se il processo `crond` appare nell'elenco dei processi in esecuzione sul sistema. @@ -379,7 +375,7 @@ Gli esercizi di questa sezione mostrano come configurare i processi di sistema/u 3. Utilizzando `systemctl`, visualizzare lo stato di `crond.service` per vedere l'effetto della modifica. -4. Utilizzare nuovamente `pgrep` per verificare se il processo crond compare ancora nell'elenco dei processi. +4. Utilizzare nuovamente `pgrep` per verificare se il processo `crond` compare ancora nell'elenco dei processi. ### Per avviare i servizi @@ -428,7 +424,7 @@ Gli esercizi di questa sezione mostrano come configurare i processi di sistema/u ### Per riavviare i servizi -Per molti servizi/daemon, spesso è necessario riavviare o ricaricare il servizio/daemon in esecuzione ogni volta che vengono apportate modifiche ai file di configurazione corrispondenti. In questo modo il processo/servizio/daemon in questione può applicare le ultime modifiche della configurazione. +Per molti servizi/daemon, spesso è necessario riavviare o ricaricare il servizio/daemon in esecuzione ogni volta che vengono apportate modifiche ai file di configurazione sottostanti. Questo permette al processo/servizio/demone specificato di applicare le ultime modifiche alla configurazione. 1. Visualizzare lo stato di crond.service. Digitare: @@ -436,7 +432,7 @@ Per molti servizi/daemon, spesso è necessario riavviare o ricaricare il servizi [root@localhost ~]# systemctl -n 0 status crond.service ``` - Annotare il PID di crond nell'output. + Nell'output, prendere nota del PID per `crond`. 2. Eseguire `systemctl restart` per riavviare `crond.service`. Digitare: @@ -459,8 +455,7 @@ Per molti servizi/daemon, spesso è necessario riavviare o ricaricare il servizi Perché si pensa che i PID siano diversi ogni volta che si riavvia un servizio? - - !!! Tip "Suggerimento" + !!! tip "Suggerimento" La funzionalità del classico comando del servizio è stata adattata per funzionare senza problemi sui sistemi gestiti da systemd. È possibile utilizzare comandi di servizio come i seguenti per arrestare, avviare, riavviare e visualizzare lo stato del servizio `smartd`. @@ -499,11 +494,11 @@ Per molti servizi/daemon, spesso è necessario riavviare o ricaricare il servizi Su un server da gestire in remoto, perché NON si vuole disabilitare un servizio come `sshd.service` dall'avvio automatico all'avvio del sistema? -### Per garantire la disabilitazione (es. mask) di un servizio +### Per garantire la disabilitazione (mascheramento) di un servizio -Anche se il comando `systemctl disable` può essere usato per disabilitare i servizi, come si è visto negli esercizi precedenti, altre unit di systemd (processi, servizi, demoni e così via) possono riattivare silenziosamente un servizio disabilitato, se necessario. Questo può accadere quando un servizio dipende da un altro servizio [disabilitato]. +Anche se il comando `systemctl disable` può essere usato per disabilitare i servizi, come si è visto negli esercizi precedenti, altre unità di `systemd` (processi, servizi, demoni e così via) possono riattivare silenziosamente un servizio disabilitato, se necessario. Questo può accadere quando un servizio dipende da un altro servizio [disabilitato]. -Per garantire la disattivazione di una unit di servizio systemd ed evitare la riattivazione accidentale, è necessario mascherare il servizio. +È necessario mascherare il servizio per garantire la disattivazione di un'unità di servizio `systemd` e prevenire la riattivazione accidentale. 1. Utilizzare `systemctl` per mascherare il servizio `crond.service` e prevenire qualsiasi riattivazione indesiderata, digitare: diff --git a/docs/labs/systems_administration_II/lab6-the_file_system.it.md b/docs/labs/systems_administration_II/lab6-the_file_system.it.md index 6b8585f6ae..1a4aca7d31 100644 --- a/docs/labs/systems_administration_II/lab6-the_file_system.it.md +++ b/docs/labs/systems_administration_II/lab6-the_file_system.it.md @@ -304,9 +304,9 @@ Il partizionamento di un disco consente di considerarlo come un gruppo di aree d Le partizioni facilitano inoltre i backup e aiutano a limitare e circoscrivere le aree potenzialmente problematiche. -Lo spazio sul disco rigido non è infinito e uno dei compiti dell'amministratore è gestire lo spazio limitato disponibile. Ad esempio, un modo semplice per limitare l'area di archiviazione totale su un disco in cui gli utenti possono memorizzare i propri file personali è quello di creare una partizione separata per la home directory degli utenti (naturalmente si possono usare anche le quote). +Lo spazio sul disco rigido non è infinito e uno dei compiti dell'amministratore è gestire lo spazio limitato disponibile. Ad esempio, un modo semplice per limitare l'area di archiviazione totale su un disco in cui gli utenti possono memorizzare i propri file personali è quello di creare una partizione separata per la home directory degli utenti (si possono usare anche le quote). -#### Per esplorare i dispositivi di archiviazione a blocchi +### Per esplorare i dispositivi di archiviazione a blocchi Si utilizzerà l'utilità `fdisk` @@ -339,7 +339,7 @@ Si utilizzerà l'utilità `fdisk` Dall'output di esempio qui sopra, sotto la colonna Used, si può vedere che la partizione primaria ( /dev/vda1) su cui è montata la nostra directory root (/) è completamente occupata (100%). - Naturalmente il risultato potrebbe essere diverso se si dispone di un disco di dimensioni diverse o se non si è seguito lo schema di partizionamento utilizzato durante l'installazione del sistema operativo. + Il risultato potrebbe essere diverso se si dispone di un disco di dimensioni diverse o se non si è seguito lo schema di partizionamento utilizzato durante l'installazione del sistema operativo. #### Per creare un dispositivo di blocco [fake] @@ -402,7 +402,7 @@ Non vogliamo che il disco rigido locale del sistema venga accidentalmente altera I/O size (minimum/optimal): 512 bytes / 512 bytes ``` -#### Per creare le partizioni +#### Creare le partizioni 1. Si creerà una nuova partizione utilizzando il programma `fdisk`. `fdisk` viene eseguito in modo interattivo, quindi vi verranno proposte molte domande e risposte per completare alcune operazioni specifiche. @@ -469,13 +469,13 @@ Non vogliamo che il disco rigido locale del sistema venga accidentalmente altera Partition number (1-4, default 1): 1 ``` -6. Accettare il valore predefinito per il primo settore del dispositivo a blocchi premendo INVIO: +6. Accettare il valore predefinito per il primo settore del dispositivo a blocchi premendo ++enter++: ```bash First sector (2048-20971519, default 2048): ``` -7. Accettare il valore predefinito per l'ultimo settore del dispositivo a blocchi premendo INVIO: +7. Accettare il valore predefinito per l'ultimo settore del dispositivo a blocchi premendo ++enter++: ```bash Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-20971519, default 20971519): @@ -569,8 +569,10 @@ Nei passi successivi creeremo un nuovo dispositivo di loop appoggiato a un altro ```bash [root@localhost ~]# losetup ``` - **RISULTATO** - ``` + + **OUTPUT** + + ```bash NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC /dev/loop1 0 0 0 0 /tmp/10G-fake-lvm-disk.img 0 512 /dev/loop0 0 0 0 0 /tmp/10G-fake-disk.img 0 512 @@ -589,14 +591,14 @@ Nei passi successivi creeremo un nuovo dispositivo di loop appoggiato a un altro ...... ``` -2. Inizializzare il nuovo dispositivo a blocchi /dev/loop1 (10G-fake-lvm-disk.img) come volume fisico. Utilizzare l'utilità `pvcreate`. Digitare: +6. Inizializzare il nuovo dispositivo a blocchi /dev/loop1 (10G-fake-lvm-disk.img) come volume fisico. Utilizzare l'utilità `pvcreate`. Digitare: ```bash [root@localhost ~]# pvcreate /dev/loop1 Physical volume "/dev/loop1" successfully created. ``` -3. Eseguire il comando `pvdisplay` per visualizzare le modifiche. +7. Eseguire il comando `pvdisplay` per visualizzare le modifiche. #### Per assegnare un volume fisico a un gruppo di volumi @@ -609,8 +611,10 @@ Aggiungerete il volume fisico (PV) `/dev/loop1` che è stato preparato e creato ```bash [root@localhost ~]# vgdisplay ``` - **RISULTATO** - ``` + + **OUTPUT** + + ```bash --- Volume group --- VG Name rl System ID @@ -637,18 +641,22 @@ Aggiungerete il volume fisico (PV) `/dev/loop1` che è stato preparato e creato ```bash [root@localhost ~]# vgextend rl /dev/loop1 ``` - **RISULTATO** - ``` + + **OUTPUT** + + ```bash Volume group "rl" successfully extended ``` -4. Eseguire nuovamente il comando `vgdisplay` per visualizzare le modifiche. Digitare: +3. Eseguire nuovamente il comando `vgdisplay` per visualizzare le modifiche. Digitare: ```bash [root@localhost ~]# vgdisplay ``` - **RISULTATO** - ``` + + **OUTPUT** + + ```bash --- Volume group --- VG Name rl System ID @@ -668,39 +676,22 @@ Aggiungerete il volume fisico (PV) `/dev/loop1` che è stato preparato e creato Utilizzando l'output di `vgdisplay`, annotare le modifiche apportate al sistema. Quali sono i nuovi valori di "Free PE / Size"? -#### Per rimuovere un LV, un VG e un PV - -Questa sezione spiega come eliminare il PV `/dev/loop1` assegnato al VG `rl` presente nella sezione precedente. - -1. Rimuovere il volume logico denominato scratch2. Digitare: - - ```bash - [root@localhost ~]# lvremove -f /dev/rl/scratch2 - Logical volume "scratch2" successfully removed. - ``` - -2. Rimuovere il volume logico scratch3, eseguendo: +4. Per rimuovere il nuovo PV (/dev/loop1) dal gruppo di volumi `rl` esistente. Utilizzare il comando `vgreduce`, digitando: ```bash - [root@localhost ~]# lvremove -f /dev/rl/scratch3 + [root@localhost ~]# vgreduce rl /dev/loop1 ``` -3. Dopo aver rimosso i volumi interessati, è possibile ridurre le dimensioni del VG `rl` per renderlo coerente. Digitate: + **OUTPUT** ```bash - [root@localhost ~]# vgreduce --removemissing rl + Removed "/dev/loop0" from volume group "rl" ``` -4. Rimuovere le etichette LVM dal PV `/dev/loop1`. Digitare: - - ```bash - [root@localhost ~]# pvremove /dev/loop1 - Labels on physical volume "/dev/loop1" successfully wiped. - ``` #### Per creare un nuovo gruppo di volumi -In questa sezione verrà creato un nuovo gruppo di volumi autonomo denominato "scratch". Lo scratch VG otterrà il suo spazio interamente dal dispositivo pseudo-blocco `/dev/loop1`. +In questa sezione verrà creato un nuovo gruppo di volumi autonomo denominato "scratch". Il VG scratch otterrà il suo spazio interamente dal dispositivo pseudo-blocco `/dev/loop1`. 1. Creare il nuovo spazio `scratch`. Digitare: @@ -730,9 +721,10 @@ In questa sezione verrà creato un nuovo gruppo di volumi autonomo denominato "s ...... ``` - !!! question "Domanda" + !!! question "Domande" - Esaminate l'output di `vgdisplay`. Quali sono i valori di "Free PE / Size"? E come sono diversi questi valori rispetto alla sezione precedente, quando si è aggiunto il PV `/dev/loop1` al gruppo di volumi `rl` esistente? + Esaminare l'output di `vgdisplay`. Quali sono i valori di "Free PE / Size"? E come sono diversi questi valori rispetto alla sezione precedente, quando si è aggiunto il PV /dev/loop1 al gruppo di volumi rl esistente? + #### Per creare un volume logico @@ -744,7 +736,7 @@ Con lo spazio libero aggiuntivo che è stato possibile aggiungere al gruppo di v [root@localhost ~]# lvdisplay ``` - !!! question "Domanda" + !!! question "Domande" In base al risultato ottenuto, rispondete alle seguenti domande: @@ -754,7 +746,6 @@ Con lo spazio libero aggiuntivo che è stato possibile aggiungere al gruppo di v 3. A cosa servono i vari LV nel vostro sistema? - 2. Utilizzare il comando `lvs` per visualizzare in modo simile i volumi logici, ma questa volta filtrando l'output per mostrare campi specifici. Filtrare per visualizzare i campi lv_name (nome del volume logico), lv_size (dimensione del volume logico), lv_path, vg_name (nome del gruppo di volumi). Digitare: ```bash @@ -776,7 +767,7 @@ Con lo spazio libero aggiuntivo che è stato possibile aggiungere al gruppo di v Logical volume "scratch2" created. ``` -4. Creare un secondo volume logico chiamato "scratch3". Questa volta verrà utilizzato tutto lo spazio rimanente disponibile nel gruppo di volumi `scratch`. Digitare: +4. Creare un secondo volume logico chiamato "scratch3". Questa volta si utilizza tutto lo spazio rimanente disponibile sul gruppo di volumi `scratch`. Digitare: ```bash [root@localhost ~]# lvcreate -l 100%FREE --wipesignatures y --yes --zero y --name scratch3 scratch @@ -785,13 +776,43 @@ Con lo spazio libero aggiuntivo che è stato possibile aggiungere al gruppo di v 5. Utilizzare nuovamente il comando `lvdisplay` per visualizzare il nuovo LV. +#### Per rimuovere un LV, VG e PV + +Questa sezione spiega come eliminare il PV `/dev/loop1` assegnato al VG `rl` esistente nella sezione precedente. + +1. Rimuovere il volume logico denominato scratch2. Digitare: + + ```bash + [root@localhost ~]# lvremove -f /dev/rl/scratch2 + Logical volume "scratch2" successfully removed. + ``` + +2. Rimuovere il volume logico scratch3, eseguendo: + + ```bash + [root@localhost ~]# lvremove -f /dev/rl/scratch3 + ``` + +3. Dopo aver rimosso i volumi interessati, è possibile ridurre le dimensioni del VG `rl` per renderlo coerente. Digitare: + + ```bash + [root@localhost ~]# vgreduce --removemissing rl + ``` + +4. Rimuovere le etichette LVM dal PV `/dev/loop1`. Digitare: + + ```bash + [root@localhost ~]# pvremove /dev/loop1 + Labels on physical volume "/dev/loop1" successfully wiped. + ``` + ## Esercizio 2 Per rendere la partizione tradizionale e i volumi in stile LVM creati in precedenza utilizzabili dal sistema operativo, è necessario che su di essi vengano creati dei file system. La scrittura di un file system su un dispositivo è nota anche come formattazione del disco. Questo esercizio riguarda la creazione del file system e l'uso di alcuni strumenti comuni per la manutenzione del file system. -#### Per creare un file system VFAT +### Creare un file system VFAT Qui si utilizzerà il programma `mke2fs` per creare un file system vFAT sulla nuova partizione /dev/loop0p1. @@ -800,8 +821,10 @@ Qui si utilizzerà il programma `mke2fs` per creare un file system vFAT sulla nu ```bash [root@localhost ~]# mkfs.vfat /dev/loop0p1 ``` - **RISULTATO** - ``` + + **OUTPUT** + + ```bash mkfs.fat 4.* ``` @@ -810,8 +833,10 @@ Qui si utilizzerà il programma `mke2fs` per creare un file system vFAT sulla nu ```bash [root@localhost ~]# lsblk -f /dev/loop0 ``` - **RISULTATO** - ``` + + **OUTPUT** + + ```bash NAME FSTYPE LABEL UUID MOUNTPOINT loop0 └─loop0p1 vfat 658D-4A90 @@ -839,7 +864,7 @@ Qui si utilizzerà il programma `mke2fs` per creare un file system EXT4 sul nuov scratch-scratch2 ext4 6689b6aa**** ``` -#### Per creare un file system XFS +#### Creare un file system XFS Qui si utilizzerà il programma `mke2fs` per creare un file system XFS sul nuovo volume scratch3. @@ -857,8 +882,10 @@ Qui si utilizzerà il programma `mke2fs` per creare un file system XFS sul nuovo ```bash [root@localhost ~]# lsblk -f /dev/scratch/scratch3 ``` - **RISULTATO** - ``` + + **OUTPUT** + + ```bash NAME FSTYPE LABEL UUID MOUNTPOINT scratch-scratch3 xfs 1d1ac306*** ``` @@ -875,7 +902,7 @@ In questa sede illustreremo l'uso di alcune utilità comuni del filesystem che p Maximum mount count: -1 ``` - !!! question "Domanda" + !!! question "Domande" 1. A cosa serve il "numero massimo di montaggi"? 2. Qual è il valore del numero massimo di montaggi del volume `root` (/dev/rl/root)? @@ -924,11 +951,11 @@ Le esercitazioni precedenti hanno illustrato la preparazione di un dispositivo d Questo esercizio spiegherà come `montare` e `smontare` i file system creati nell'esercizio precedente. -### `mount` +### comando `mount` Il comando `mount` è usato per collegare il filesystem creato su un dispositivo alla gerarchia dei file. -#### Per montare un file system VFAT +#### Montare un file system VFAT 1. Accedere al sistema come utente con privilegi amministrativi. @@ -1102,9 +1129,9 @@ Come amministratore, potete trovare ed eliminare il file incriminato e continuar Nel frattempo - > L'utente unreasonable colpisce ancora! -#### Per creare il file di grandi dimensioni +### Per creare il file di grandi dimensioni -**Eseguire questo esercizio dal sistema partner** +**(Eseguire questo esercizio dal sistema del partner**) L'utente unreasonable si accorge accidentalmente che sul server sono stati resi disponibili nuovi file system ***scratch*** durante la notte. "È fantastico!", dice a se stesso. @@ -1124,8 +1151,10 @@ Quindi procede a riempire il volume con un file di dimensioni arbitrarie. [unreasonable@localhost ~]$ dd if=/dev/zero \ of=/mnt/2gb-scratch2-volume/LARGE-USELESS-FILE.tar bs=10240 ``` + **OUTPUT** - ``` + + ```bash dd: error writing '/mnt/2gb-scratch2-volume/LARGE-USELESS-FILE.tar': No space left on device 187129+0 records in 187128+0 records out @@ -1138,34 +1167,34 @@ Quindi procede a riempire il volume con un file di dimensioni arbitrarie. ## Esercizio 5 -### Quotas +### Quote L'implementazione e l'applicazione delle quote del disco consentono di garantire che il sistema disponga di spazio su disco sufficiente e che gli utenti rimangano nei limiti dello spazio su disco loro assegnato. Prima di implementare le quote è necessario: -* Scegliere le partizioni o i volumi su cui implementare le quote disco. -* Decidere a quale livello applicare le quote, cioè per utente, per gruppo o per entrambi. -* Determinare quali saranno i vostri limiti soft e hard. -* Decidere quali saranno i periodi di tolleranza (cioè se ci saranno). +- Scegliere le partizioni o i volumi su cui implementare le quote disco. +- Decidere a quale livello applicare le quote, cioè per utente, per gruppo o per entrambi. +- Determinare quali saranno i vostri limiti soft e hard. +- Decidere quali saranno i periodi di tolleranza (cioè se ci saranno). -*Limite Hard* +#### *Limite Hard* Il limite hard definisce la quantità massima assoluta di spazio su disco che un utente o un gruppo può utilizzare. Una volta raggiunto questo limite, non è possibile utilizzare altro spazio su disco. -*Limite Soft* +#### *Limite Soft* -Il limite soft definisce la quantità massima di spazio su disco che può essere utilizzata. Tuttavia, a differenza del limite hard, il limite soft può essere superato per un certo periodo di tempo. Questo periodo è noto come periodo di tolleranza. +Il limite morbido definisce la quantità massima di spazio su disco che può essere utilizzata. Tuttavia, a differenza del limite hard, il limite soft può essere superato per un certo periodo di tempo. Questo periodo è noto come periodo di tolleranza. -*Periodo di tolleranza* +#### *Periodo di tolleranza* Il periodo di tolleranza è il periodo di tempo durante il quale è possibile superare il limite soft. Il periodo di tolleranza può essere espresso in secondi, minuti, ore, giorni, settimane o mesi, dando così all'amministratore del sistema una grande libertà nel determinare quanto tempo concedere agli utenti per far rientrare l'utilizzo del disco al di sotto del proprio soft limit. Queste sono le fasi di alto livello dell'implementazione delle quote. -* Installazione del software per le quote -* Modificare il file "/etc/fstab" -* Rimontare i file system -* Eseguire quotacheck -* Assegnare le quote +- Installazione del software per le quote +- Modificare il file "/etc/fstab" +- Rimontare i file system +- Eseguire quotacheck +- Assegnare le quote I comandi da utilizzare sono: @@ -1195,7 +1224,7 @@ quotacheck [-gucbfinvdmMR] [-F ] filesystem|-a `edquota`: -Strumento per modificare le quote utente +Strumento per la modifica delle quote utente ```bash SYNOPSIS @@ -1245,7 +1274,7 @@ Strumenti utilizzati per attivare e disattivare le quote del filesystem #### Per installare il software delle quote -1. Dopo aver effettuato il login come root, verificare innanzitutto se il pacchetto `quota-*.rpm` è installato sul sistema. Digitare: +1. Dopo aver effettuato il login come root, verificare innanzitutto se il pacchetto `quota-*.rpm` è installato sul sistema. Digitare: ```bash [root@localhost ~]# rpm -q quota @@ -1267,8 +1296,10 @@ Strumenti utilizzati per attivare e disattivare le quote del filesystem ```bash [root@localhost ~]# grep scratch2 /etc/fstab ``` + **OUTPUT** - ``` + + ```bash /dev/scratch/scratch2 /mnt/2gb-scratch2-volume ext4 defaults 0 0 ``` @@ -1309,8 +1340,10 @@ Strumenti utilizzati per attivare e disattivare le quote del filesystem ```bash [root@localhost ~]# cat /proc/mounts | grep scratch2 ``` + **OUTPUT** - ``` + + ```bash /dev/mapper/rl-scratch2 /mnt/2gb-scratch2-volume ext4 rw,relatime,quota,usrquota,grpquota 0 0 ``` @@ -1332,13 +1365,15 @@ Strumenti utilizzati per attivare e disattivare le quote del filesystem Scrivete i comandi per `smontare` separatamente un dato filesystem e poi `montarlo` nuovamente? -11. Ora è necessario preparare il file system per supportare le quote. Creare i file delle quote e generare anche la tabella dell'utilizzo attuale del disco per file system. Digitare: +10. Ora è necessario preparare il file system per supportare le quote. Creare i file delle quote e generare anche la tabella dell'utilizzo attuale del disco per file system. Digitare: ```bash [root@localhost ~]# quotacheck -avcug ``` + **OUTPUT** - ``` + + ```bash .... quotacheck: Scanning /dev/mapper/scratch-scratch2 [/mnt/2gb-scratch2-volume] done ...... @@ -1350,12 +1385,11 @@ Strumenti utilizzati per attivare e disattivare le quote del filesystem Dopo l'esecuzione del comando precedente si noteranno due nuovi file creati nella directory "/mnt/2gb-scratch2-volume". Elencare qui i file? - !!! tip "Suggerimento" Per ottenere lo stato aggiornato delle quote del file system è necessario eseguire periodicamente il comando `quotacheck -avcug` con le quote disattivate sul file system. -12. Per abilitare le quote utente e di gruppo su tutti i file system specificati nel file "/etc/fstab" digitare: +11. Per abilitare le quote utente e di gruppo su tutti i file system specificati nel file "/etc/fstab" digitare: ```bash [root@localhost ~]# quotaon -av @@ -1372,6 +1406,7 @@ Ciò significa che tutti gli utenti per i quali applichiamo la quota non possono ```bash [root@serverXY root]# edquota -u me ``` + Il comando sopra riportato richiama l'editor predefinito con i contenuti sottostanti: ```bash @@ -1427,8 +1462,10 @@ Ciò significa che tutti gli utenti per i quali applichiamo la quota non possono ```bash [root@localhost ~]# repquota /mnt/2gb-scratch2-volume ``` + **OUTPUT** - ``` + + ```bash *** Report for user quotas on device /dev/mapper/scratch-scratch2 Block grace time: 00:05; Inode grace time: 7days Block limits File limits @@ -1459,8 +1496,10 @@ Ciò significa che tutti gli utenti per i quali applichiamo la quota non possono ```bash [unreasonable@localhost ~]$ dd if=/dev/zero of=/mnt/2gb-scratch2-volume/LARGE-USELESS-FILE.tar bs=10240 ``` + **OUTPUT** - ``` + + ```bash ...... dd: error writing '/mnt/2gb-scratch2-volume/LARGE-USELESS-FILE.tar': Disk quota exceeded 10001+0 records in diff --git a/docs/labs/systems_administration_II/lab7-the_linux_kernel.it.md b/docs/labs/systems_administration_II/lab7-the_linux_kernel.it.md index 26c4d0528d..e5686b085d 100644 --- a/docs/labs/systems_administration_II/lab7-the_linux_kernel.it.md +++ b/docs/labs/systems_administration_II/lab7-the_linux_kernel.it.md @@ -1,5 +1,5 @@ - - - -author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: Tutte le versioni tags: +author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: All Versions tags: - lab exercise - Linux Kernel - compile @@ -67,7 +67,7 @@ La scelta di quando rendere disponibile una particolare funzionalità come modul In genere esistono tre metodi per gestire il kernel nelle distribuzioni Linux. Questi sono: -1. Utilizzando la versione preconfezionata del kernel fornita dal produttore della distribuzione. Ad esempio utilizzando kernel-.*.rpm. È la soluzione più sicura, più semplice e preferibile +1. Utilizzando la versione preconfezionata del kernel fornita dal produttore della distribuzione. ad esempio, utilizzando ` kernel-`.*.rpm. È la soluzione più sicura, più semplice e preferibile 2. Tramite il patching. Utilizzando file di patch come - patch-kernel.version.gz. @@ -88,13 +88,13 @@ In questo esercizio si aggiornerà direttamente il kernel utilizzando l'applicaz 2. Eseguire l'utilità `rpm` per elencare tutti i pacchetti del kernel attualmente installati sul sistema. Digitare: ``` { .sh data-copy="rpm -q kernel" } - $ rpm -q kernel + rpm -q kernel ``` 3. Eseguire l'utilità `uname` per visualizzare alcune informazioni sul kernel in esecuzione. Digitare: ``` { .bash data-copy="uname --kernel-release" } - $ uname --kernel-release + uname --kernel-release 5.*.el9_8.x86_64 ``` @@ -104,8 +104,9 @@ In questo esercizio si aggiornerà direttamente il kernel utilizzando l'applicaz 4. Usare `dnf` per scaricare l'ultimo pacchetto del kernel disponibile dal repository ufficiale dei pacchetti Rocky Linux. Digitare: ```bash - $ dnf download kernel + dnf download kernel ``` + Ora si dovrebbe avere un pacchetto RPM con un nome simile a kernel-*.x86_64.rpm salvato nella propria PWD. 5. Usare di nuovo `rpm` per interrogare il pacchetto scaricato e ottenere ulteriori informazioni su di esso. Digitare: @@ -129,10 +130,10 @@ In questo esercizio si aggiornerà direttamente il kernel utilizzando l'applicaz 7. Utilizzare `dnf` per scaricare le dipendenze necessarie segnalate nel precedente messaggio di errore. Digitare: ```bash - $ dnf download kernel-core-uname-r kernel-modules-uname-r + dnf download kernel-core-uname-r kernel-modules-uname-r ``` -8. Eseguite di nuovo `rpm` con l'opzione test per vedere se il pacchetto del kernel può essere aggiornato. Digitare: +8. Eseguite di nuovo `rpm` con l'opzione test per vedere se il pacchetto del kernel può essere aggiornato. Digitare: ```bash $ rpm --test -Uvh kernel-*.rpm @@ -143,10 +144,10 @@ In questo esercizio si aggiornerà direttamente il kernel utilizzando l'applicaz Questa volta tutto sembra a posto! -9. Infine, utilizzare `rpm` per installare il pacchetto kernel con tutte le sue dipendenze. Digitare: +9. Infine, utilizzare `rpm` per installare il pacchetto kernel con tutte le sue dipendenze. Digitare: ```bash - $ sudo rpm -ivh kernel-*.rpm + sudo rpm -ivh kernel-*.rpm ``` 10. Usare `rpm` per elencare tutti i pacchetti kernel installati sul sistema. @@ -155,7 +156,7 @@ In questo esercizio si aggiornerà direttamente il kernel utilizzando l'applicaz Cosa c'è di diverso tra l'output del comando rpm -q kernel, prima e dopo l'installazione del nuovo kernel? -12. Abbiamo finito di usare RPM per gestire direttamente i pacchetti del kernel sul sistema. Disinstallare l'ultimo pacchetto kernel scaricato e installato. A tale scopo, è necessario specificare le informazioni esatte e corrette su nome-epoca-versione-rilascio-architettura (NEVRA) del kernel e delle sue dipendenze associate che si desidera disinstallare. Digitare: +11. Abbiamo finito di usare RPM per gestire direttamente i pacchetti del kernel sul sistema. Disinstallare l'ultimo pacchetto kernel scaricato e installato. A tale scopo, è necessario specificare le informazioni esatte e corrette su nome-epoca-versione-rilascio-architettura (NEVRA) del kernel e delle sue dipendenze associate che si desidera disinstallare. Digitare: ```bash [root@localhost ~]# rpm -e \ @@ -220,16 +221,16 @@ In questo esercizio si costruirà un nuovo kernel dai sorgenti, configurandolo, 1. Accedere al sistema come utente con privilegi di amministrazione. -2. Installare gli strumenti di sviluppo necessari. Digitare: +2. Installare gli strumenti di sviluppo necessari. Digitare: ```bash - $ sudo dnf -y groupinstall 'Development Tools' + sudo dnf -y groupinstall 'Development Tools' ``` 3. Installare le librerie e gli strumenti necessari. Digitare: ```bash - $ sudo dnf -y install ncurses-devel bc openssl-devel elfutils-libelf-devel python3 dwarves + sudo dnf -y install ncurses-devel bc openssl-devel elfutils-libelf-devel python3 dwarves ``` 4. Scaricare l'ultimo sorgente del kernel digitando: @@ -241,7 +242,7 @@ In questo esercizio si costruirà un nuovo kernel dai sorgenti, configurandolo, Si noti che linux-6.5.7.tar.xz è l'ultimo kernel disponibile al momento in cui scriviamo. Sostituite linux-6.5.7.tar.xz o linux-6.*.tar.xz con la versione del kernel che avete scelto per seguire questo esercizio. -6. Scompattate il tarball del kernel nella vostra pwd. Digitare: +5. Scompattate il tarball del kernel nella vostra pwd. Digitare: ```bash [root@localhost ~]# tar xvJf linux-6.*.tar.xz @@ -249,34 +250,35 @@ In questo esercizio si costruirà un nuovo kernel dai sorgenti, configurandolo, Il comando tar creerà una nuova directory chiamata: "linux-6.*" sotto la propria PWD. -7. Elencare il contenuto della nuova directory dei sorgenti del kernel +6. Elencare il contenuto della nuova directory dei sorgenti del kernel -8. Passare (cd) alla directory dei sorgenti del kernel. Digitare: +7. Passare (cd) alla directory dei sorgenti del kernel. Digitare: ```bash - $ cd linux-6.5.7 + cd linux-6.5.7 ``` -9. Pulire (preparare) l'ambiente di compilazione del kernel usando il comando `make mrproper`. Digitare: +8. Pulire (preparare) l'ambiente di compilazione del kernel usando il comando `make mrproper`. Digitare: ```bash - $ make O=~/build/kernel mrproper + make O=~/build/kernel mrproper ``` -10. Copiare e rinominare il file di configurazione preesistente della directory /boot nel nostro ambiente di creazione del kernel: +9. Copiare e rinominare il file di configurazione preesistente della directory /boot nel nostro ambiente di creazione del kernel: ```bash - $ cp /boot/config-`uname -r` ~/build/kernel/.config + cp /boot/config-`uname -r` ~/build/kernel/.config ``` -11. Avviare l'utilità di configurazione grafica del kernel. Digitare: +10. Avviare l'utilità di configurazione grafica del kernel. Digitare: ```bash - $ make O=~/build/kernel menuconfig + make O=~/build/kernel menuconfig ``` + Verrà visualizzata una schermata simile a questa: - ![Schermata Configurazione del Kernel File Systems](images/lab2-il01-kernel.png) + ![Kernel Configuration File Systems screen](images/lab2-il01-kernel.png) !!! Note "Nota" @@ -288,20 +290,20 @@ In questo esercizio si costruirà un nuovo kernel dai sorgenti, configurandolo, 3. Infine, nella parte inferiore della schermata vengono visualizzate le azioni/opzioni che l'utente può scegliere. -12. A scopo dimostrativo, si aggiungerà il supporto per il filesystem Btrfs al nuovo kernel. Nella schermata di configurazione principale, utilizzare i tasti freccia per spostarsi ed evidenziare la voce File system. Con File system selezionato, premere INVIO per visualizzare il sottomenu o le voci secondarie di File system. +11. A scopo dimostrativo, si aggiungerà il supporto per il filesystem Btrfs al nuovo kernel. Nella schermata di configurazione principale, utilizzare i tasti freccia per spostarsi ed evidenziare la voce File system. Con File system selezionato, premere ++enter++ per visualizzare il menu secondario o le voci secondarie di File system. Nella sezione File System, utilizzare i tasti freccia per spostarsi su *Btrfs filesystem support*. -13. Con *Btrfs filesystem support* evidenziato, premere `y` per includere il supporto per `btrfs` nel kernel personalizzato. Al termine, accanto all'opzione evidenziata dovrebbe comparire il simbolo dell'asterisco (*). La schermata finale dovrebbe assomigliare a quella mostrata qui: +12. Con *Btrfs filesystem support* evidenziato, premere `y` per includere il supporto per `btrfs` nel kernel personalizzato. Al termine, accanto all'opzione evidenziata dovrebbe comparire il simbolo dell'asterisco (*). La schermata finale dovrebbe assomigliare a quella mostrata qui: - ![Schermata Configurazione del Kernel File Systems](images/lab2-il02-kernel.png) + ![Kernel Configuration File Systems screen](images/lab2-il02-kernel.png) -14. Tornare alla schermata principale di configurazione del kernel premendo due volte ESC sulla tastiera. +13. Tornare alla schermata principale di configurazione del kernel premendo due volte ++escape++ sulla tastiera. -15. Uscire dall'applicazione di configurazione del kernel premendo nuovamente due volte ESC sulla tastiera. L'uscita dal configuratore del kernel comporta il salvataggio delle modifiche nel file .config nella radice dell'albero dei sorgenti del kernel. +14. Uscire dall'applicazione di configurazione del kernel premendo nuovamente due volte ++escape++ sulla tastiera. L'uscita dal configuratore del kernel comporta il salvataggio delle modifiche nel file .config nella radice dell'albero dei sorgenti del kernel. -16. Viene visualizzata una finestra di dialogo che richiede di salvare la nuova configurazione. Assicurarsi che sia selezionato Yes e premere ENTER. -17. Dopo l'uscita dell'utilità di configurazione del kernel, si tornerà alla propria shell, all'interno dell'albero dei sorgenti del kernel. +15. Viene visualizzata una finestra di dialogo che richiede di salvare la nuova configurazione. Assicurarsi che sia selezionato Yes e premere ++enter++. +16. Dopo l'uscita dall'utilità di configurazione del kernel, si tornerà alla propria shell, all'interno dell'albero dei sorgenti del kernel. !!! Tip "Suggerimento" @@ -314,47 +316,49 @@ In questo esercizio si costruirà un nuovo kernel dai sorgenti, configurandolo, CONFIG_BTRFS_FS=y ``` -18. È possibile ottimizzare il tempo di compilazione del kernel e ridurre la quantità di spazio su disco utilizzato durante la fase di compilazione del kernel. Impostando `CONFIG_DEBUG_INFO=no`, l'immagine del kernel risultante NON includerà le informazioni di debug, risultando così più piccola. Questo rimuove i simboli di debug dal kernel e dai moduli creati. Digitare: +17. È possibile ottimizzare il tempo di compilazione del kernel e ridurre la quantità di spazio su disco utilizzato durante la fase di compilazione del kernel. Impostando `CONFIG_DEBUG_INFO=no`, l'immagine del kernel risultante NON includerà le informazioni di debug, risultando così più piccola. Questo rimuove i simboli di debug dal kernel e dai moduli creati. Digitare: - ```bash + ```bash $ ./scripts/config --file ~/build/kernel/.config -d DEBUG_INFO \ -d DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT -d DEBUG_INFO_DWARF4 \ -d DEBUG_INFO_DWARF5 -e CONFIG_DEBUG_INFO_NONE ``` -19. Completare un altro passo importante per i kernel personalizzati sulla distribuzione Rocky Linux. Digitare: +18. Completare un altro passo importante per i kernel personalizzati sulla distribuzione Rocky Linux. Digitare: ```bash - $ sed -ri '/CONFIG_SYSTEM_TRUSTED_KEYS/s/=.+/=""/g' ~/build/kernel/.config + sed -ri '/CONFIG_SYSTEM_TRUSTED_KEYS/s/=.+/=""/g' ~/build/kernel/.config ``` -20. Aggiungere una semplice personalizzazione al nuovo kernel, per distinguerlo più facilmente dagli altri kernel stock. Per questo, si può usare l'utilità `sed` per modificare il Makefile sul posto. Digitare: +19. Aggiungere una semplice personalizzazione al nuovo kernel, per distinguerlo più facilmente dagli altri kernel stock. Per questo, si può usare l'utilità `sed` per modificare il Makefile sul posto. Digitare: ```bash - $ sed -i 's/^EXTRAVERSION.*/EXTRAVERSION = -custom/' Makefile + sed -i 's/^EXTRAVERSION.*/EXTRAVERSION = -custom/' Makefile ``` -21. Verificare la versione completa del kernel appena personalizzato passando il target `kernelversion` al comando `make`. Digitare: +20. Verificare la versione completa del kernel appena personalizzato passando il target `kernelversion` al comando `make`. Digitare: ```bash - $ make O=~/build/kernel kernelversion + make O=~/build/kernel kernelversion ``` OUTPUT: - ``` + + ```bash make[1]: Entering directory '/home/rocky/build/kernel' 6.5.7-custom make[1]: Leaving directory '/home/rocky/build/kernel' ``` -22. Siete pronti per compilare il kernel. Digitare: +21. Siete pronti per compilare il kernel. Digitare: ```bash - $ sudo make O=~/build/kernel -j $(nproc) + sudo make O=~/build/kernel -j $(nproc) ``` OUTPUT: - ``` + + ```bash make[1]: Entering directory '/root/build/kernel' SYNC include/config/auto.conf.cmd GEN Makefile @@ -362,53 +366,53 @@ In questo esercizio si costruirà un nuovo kernel dai sorgenti, configurandolo, ... ``` -23. Dopo che la compilazione è stata completata con successo, si otterrà il kernel finito, memorizzato qui: +22. Dopo che la compilazione è stata completata con successo, si otterrà il kernel finito, memorizzato qui: ```bash ~/build/kernel/arch/x86/boot/bzImage ``` -24. Installare le parti del kernel configurate come moduli. Digitare: +23. Installare le parti del kernel configurate come moduli. Digitare: ```bash - $ sudo make O=~/build/kernel modules_install + sudo make O=~/build/kernel modules_install ``` -25. Dopo aver compilato il kernel, è il momento di installarlo. Digitare: +24. Dopo aver compilato il kernel, è il momento di installarlo. Digitare: ```bash - $ sudo cp ~/build/kernel/arch/x86/boot/bzImage \ + sudo cp ~/build/kernel/arch/x86/boot/bzImage \ /boot/vmlinuz- ``` - Sostituire con il numero di versione del kernel personalizzato. Per il kernel di esempio utilizzato in questa guida, il nome del file sarà vmlinuz-6.*-custom. Ecco il comando esatto per questo esempio: + Sostituire `` con il numero di versione del kernel personalizzato. Per il kernel di esempio utilizzato in questa guida, il nome del file sarà vmlinuz-6.*-custom. Ecco il comando esatto per questo esempio: ```bash sudo cp ~/build/kernel/arch/x86/boot/bzImage /boot/vmlinuz-6.5.7-custom ``` -26. Copiare e rinominare il file System.map corrispondente nella directory /boot utilizzando la stessa convenzione di denominazione: +25. Copiare e rinominare il file System.map corrispondente nella directory /boot utilizzando la stessa convenzione di denominazione: ```bash - $ sudo cp -v ~/build/kernel/System.map /boot/System.map-6.5.7-custom + sudo cp -v ~/build/kernel/System.map /boot/System.map-6.5.7-custom ``` -27. Utilizzare l'utilità `kernel-install` per completare il passaggio del file. Digitare: +26. Utilizzare l'utilità `kernel-install` per completare il passaggio del file. Digitare: ```bash - $ sudo kernel-install add 6.5.7-custom /boot/vmlinuz-6.5.7-custom + sudo kernel-install add 6.5.7-custom /boot/vmlinuz-6.5.7-custom ``` -28. L'utilità `kernel-install` crea una nuova voce di avvio nel file di configurazione del boot loader. Per i sistemi basati su EFI è possibile cercare in /boot/loader/entries/ le voci corrispondenti. +27. L'utilità `kernel-install` crea una nuova voce di avvio nel file di configurazione del boot loader. Per i sistemi basati su EFI è possibile cercare in /boot/loader/entries/ le voci corrispondenti. -29. Eseguire il programma grubby per visualizzare il kernel predefinito del server. Digitare: +28. Eseguire il programma grubby per visualizzare il kernel predefinito del server. Digitare: - ``` - $ sudo grubby --default-kernel + ```bash + sudo grubby --default-kernel ``` -30. Tutto fatto. È il momento della verità. Il kernel più recente sarà probabilmente configurato come nuovo kernel predefinito per l'avvio. Se si ha accesso alla console del sistema, è possibile riavviare il sistema e selezionare il nuovo kernel personalizzato nel menu di avvio di GRUB. Se tutto va bene dopo il riavvio, si può verificare che il sistema stia eseguendo il kernel personalizzato eseguendo il comando `uname` in questo modo: +29. Tutto fatto. È il momento della verità. Il kernel più recente sarà probabilmente configurato come nuovo kernel predefinito per l'avvio. Se si ha accesso alla console del sistema, è possibile riavviare il sistema e selezionare il nuovo kernel personalizzato nel menu di avvio di GRUB. Se tutto va bene dopo il riavvio, si può verificare che il sistema stia eseguendo il kernel personalizzato eseguendo il comando `uname` in questo modo: ```bash - $ uname -r + uname -r ``` From a1ed2e77c31badf91afaa211e5f069a74a14d608 Mon Sep 17 00:00:00 2001 From: ambaradan <87865413+ambaradan@users.noreply.github.com> Date: Thu, 31 Jul 2025 16:19:50 +0200 Subject: [PATCH 090/164] small typo - lab8-samba.md (#2812) missing 'f' in smb.conf --- docs/labs/networking/lab8-samba.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/labs/networking/lab8-samba.md b/docs/labs/networking/lab8-samba.md index ed06d9cc22..6ca01aa110 100644 --- a/docs/labs/networking/lab8-samba.md +++ b/docs/labs/networking/lab8-samba.md @@ -187,7 +187,7 @@ In this exercise, we'll try accessing the new Samba share from the same system. #### To adjust share permissions -1. Make the "Shared" samba share definition read-only. This can be done by changing the value of the writable parameter from yes to no in the smb.con configuration file. Let's use a `sed` onliner to accomplish this by running: +1. Make the "Shared" samba share definition read-only. This can be done by changing the value of the writable parameter from yes to no in the smb.conf configuration file. Let's use a `sed` onliner to accomplish this by running: ```bash sudo sed -i'' -E \ From b3f63e9b08b29501cc67fdb7b037bc969f6e7bb7 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Fri, 1 Aug 2025 07:17:20 -0700 Subject: [PATCH 091/164] New Crowdin updates (#2814) * New translations lab1-prerequisites.md (Italian) * New translations lab2-jumpbox.md (Italian) * New translations mediawiki.md (Italian) * New translations lab3-compute-resources.md (Italian) * New translations lab2-jumpbox.md (German) --- docs/guides/cms/mediawiki.it.md | 253 ++++++++++++++++++ .../lab1-prerequisites.it.md | 43 +++ .../lab2-jumpbox.de.md | 126 +++++++++ .../lab2-jumpbox.it.md | 126 +++++++++ .../lab3-compute-resources.it.md | 236 ++++++++++++++++ 5 files changed, 784 insertions(+) create mode 100644 docs/guides/cms/mediawiki.it.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab1-prerequisites.it.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab2-jumpbox.de.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab2-jumpbox.it.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab3-compute-resources.it.md diff --git a/docs/guides/cms/mediawiki.it.md b/docs/guides/cms/mediawiki.it.md new file mode 100644 index 0000000000..73dc7e82a9 --- /dev/null +++ b/docs/guides/cms/mediawiki.it.md @@ -0,0 +1,253 @@ +--- +title: MediaWiki +author: Neel Chauhan +contributors: Steven Spencer +tested_with: 10.0 +tags: + - cms +--- + +## Introduzione + +[MediaWiki](https://www.mediawiki.org/wiki/MediaWiki) è un popolare motore software open source per wiki che alimenta siti come Wikipedia, Fandom e wikiHow, tra gli altri. + +## Prerequisiti e presupposti + +A seguire i requisiti minimi per seguire questa procedura: + +- La possibilità di eseguire comandi come utente root o di utilizzare `sudo` per elevare i privilegi +- Familiarità con un editor a riga di comando. L'autore utilizza `vi` o `vim`, ma è possibile sostituirli con il proprio editor preferito + +## Installazione di Apache + +Apache è il server web da utilizzare. Installarlo con: + +```bash +dnf -y install httpd +``` + +Quindi, aprire le porte del firewall corrispondenti: + +```bash +sudo firewall-cmd --permanent --zone=public --add-service=http +sudo firewall-cmd --permanent --zone=public --add-service=https +sudo firewall-cmd --reload +``` + +## Installazione di PHP + +!!! note + + Se state utilizzando Rocky Linux 8.x o 9.x, sostituite "8" o "9" accanto alla release nella riga di installazione del pacchetto Remi + +Per installare PHP, è necessario prima installare EPEL (Extra Packages for Enterprise Linux): + +```bash +dnf -y install epel-release && dnf -y update +``` + +È necessario anche il repository Remi. Installarlo con quanto segue: + +```bash +dnf install https://rpms.remirepo.net/enterprise/remi-release-10.rpm +``` + +Quindi installare PHP e i moduli necessari: + +```bash +dnf install -y dnf install php84-php-fpm php84-php-intl php84-php-mbstring php84-php-apcu php84-php-curl php84-php-mysql php84-php-xml +``` + +Abilitare PHP con: + +```bash +systemctl enable --now php84-php-fpm.service +``` + +## Installazione di MariaDB + +Per il database è necessario MariaDB. Installarlo con: + +```bash +dnf install mariadb-server +``` + +Quindi abilitate il servizio `systemd` ed eseguite la configurazione guidata: + +```bash +systemctl enable --now mariadb +mysql_secure_installation +``` + +Quando viene richiesta la password di root, premere ++enter++ : + +```bash +Enter current password for root (++enter++ for none): +``` + +Rispondere ++"n"++ all'autenticazione `unix_socket`: + +```bash +Switch to unix_socket authentication [Y/n] n +``` + +Rispondere ++"Y"++ per cambiare la password di root e inserire la password di root necessaria: + +```bash +Change the root password? [Y/n] Y +New password: +Re-enter new password: +``` + +Rimuovere gli utenti anonimi e disabilitare i login remoti di `root`: + +```bash +Remove anonymous users? [Y/n] Y +... +Disallow root login remotely? [Y/n] Y +``` + +Rimuovere l'accesso al database di prova e ricaricare le tabelle dei privilegi: + +```bash +Remove test database and access to it? [Y/n] Y +... +Reload privilege tables now? [Y/n] Y +``` + +Accedere a MariaDB con: + +```bash +mysql -u root -p +``` + +Inserire la password di root creata in precedenza. + +Nella console di MariaDB, creare il database per MediaWiki: + +```bash +MariaDB [(none)]> create database mediawiki; +``` + +Quindi, creare l'utente MediaWiki: + +```bash +MariaDB [(none)]> create user 'mediawiki'@'localhost' identified by 'nchauhan11'; +``` + +Concedere i privilegi sul database MediaWiki: + +```bash +grant all privileges on mediawiki.* to 'mediawiki'@'localhost'; +``` + +Infine, svuotare i privilegi con: + +```bash +MariaDB [(none)]> flush privileges; +``` + +## Installazione di MediaWiki + +Andare nella directory `/var/www/` e scaricare MediaWiki: + +```bash +cd /var/www/ +wget https://releases.wikimedia.org/mediawiki/1.44/mediawiki-1.44.0.zip +``` + +Decomprimere e spostare MediaWiki: + +```bash +unzip mediawiki-1.44.0.zip +mv mediawiki-1.44.0/* html/ +``` + +Impostare i permessi SELinux corretti: + +```bash +chown -R apache:apache /var/www/html +semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html(/.*)?" +restorecon -Rv /var/www/html +``` + +Abilitare Apache: + +```bash +systemctl enable --now httpd +``` + +Quindi, aprire un browser su `http://your_ip` (sostituire `il your_ip` con il vostro indirizzo IP): + +![MediaWiki Initial Setup](../images/mediawiki_1.png) + +Selezionare la lingua e fare clic su **Continua**: + +![MediaWiki Language Page](../images/mediawiki_2.png) + +Verificare che la configurazione di PHP sia corretta, scorrere verso il basso e fare clic su **Continua**: + +![MediaWiki PHP Checks](../images/mediawiki_3.png) + +A questo punto, inserite le informazioni del database come segue: + +- **Database host**: `localhost` + +- **Database name (senza trattini)**: `mediawiki` (o il database creato nel passo **MariaDB**) + +- **Database username:**: `mediawiki` (o l'utente creato nella fase **MariaDB**) + +- **Database password**: La password creata nella fase **MariaDB** + +![MediaWiki Database Information](../images/mediawiki_4.png) + +Fare clic su **Continua**: + +![MediaWiki Database Access Settings](../images/mediawiki_5.png) + +Nella pagina **Installazione della versione MediaWiki**, inserisci quanto segue: + +- **URL host name**: L'URL desiderato + +- **Name of wiki**: Il nome del Wiki desiderato + +- **Administrator account**/**Your username**: Il nome utente dell'amministratore che si desidera utilizzare + +- **Administrator account**/**Password (di nuovo)**: La password di amministrazione che si desidera utilizzare + +- **Administrator account**/**Email address**: L'indirizzo e-mail dell'utente amministratore + +Facoltativamente, è possibile selezionare **Fammi altre domande** per perfezionare il Wiki. Per semplicità, selezionare **Sono già annoiato, basta installare il wiki** e fare clic su **Continua**: + +![MediaWiki Wiki Information](../images/mediawiki_6.png) + +Fare clic su **Continua** per installare il Wiki: + +![MediaWiki Install Step Part 1](../images/mediawiki_7.png) + +MediaWiki imposterà i database. Al termine, fare clic su **Continua**: + +![MediaWiki Install Step Part 2](../images/mediawiki_8.png) + +Il browser scaricherà un file `LocalSettings.php`. Si caricherà il file sul server con `sftp`. + +A titolo di esempio, l'autore utilizzerà il proprio portatile Fedora 42 per caricare questo file. Per farlo: + +```bash +sftp root@your_ip +(Enter password) +cd /var/www/html +put LocalSettings.php +``` + +![MediaWiki LocalSettings.php Step](../images/mediawiki_9.png) + +Infine, fare clic su **inserisci il tuo wiki**: + +![Fresh MediaWiki Wiki](../images/mediawiki_10.png) + +Ora avete una nuova installazione di MediaWiki. + +## Conclusione + +Sebbene MediaWiki sia noto soprattutto per aver alimentato Wikipedia, è utile come sistema di gestione dei contenuti quando gli utenti devono poter modificare le pagine. MediaWiki è una buona alternativa open source a SharePoint di Microsoft. diff --git a/docs/labs/kubernetes-the-hard-way/lab1-prerequisites.it.md b/docs/labs/kubernetes-the-hard-way/lab1-prerequisites.it.md new file mode 100644 index 0000000000..4458562988 --- /dev/null +++ b/docs/labs/kubernetes-the-hard-way/lab1-prerequisites.it.md @@ -0,0 +1,43 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +tags: + - kubernetes + - k8s + - lab exercise +--- + +# Laboratorio 1: Prerequisiti + +!!! info + + Si tratta di un fork dell'originale ["Kubernetes the hard way"](https://github.com/kelseyhightower/kubernetes-the-hard-way) scritto originariamente da Kelsey Hightower (GitHub: kelseyhightower). A differenza dell'originale, che si basa su distribuzioni simili a Debian per l'architettura ARM64, questo fork si rivolge a distribuzioni Enterprise Linux come Rocky Linux, che gira su architettura x86_64. + +In questo laboratorio verranno esaminati i requisiti della macchina necessari per seguire questa esercitazione. + +## Macchine virtuali o fisiche + +Questa esercitazione richiede quattro (4) macchine virtuali o fisiche x86_64 con Rocky Linux 9.5 (anche i container Incus o LXD dovrebbero funzionare). La tabella seguente elenca le quattro macchine e i relativi requisiti di CPU, memoria e storage. + +| Nome | Descrizione | CPU | RAM | Storage | +| ------- | ---------------------- | --- | ----- | ------- | +| jumpbox | Host amministrativo | 1 | 512MB | 10GB | +| server | Kubernetes server | 1 | 2GB | 20GB | +| node-0 | Nodo worker Kubernetes | 1 | 2GB | 20GB | +| node-1 | Nodo worker Kubernetes | 1 | 2GB | 20GB | + +La modalità di provisioning delle macchine è a vostra discrezione; l'unico requisito è che ogni macchina soddisfi i requisiti di sistema sopra indicati, comprese le specifiche della macchina e la versione del sistema operativo. Una volta che tutte e quattro le macchine sono state messe a disposizione, verificare i requisiti di sistema eseguendo il comando `uname` su ogni macchina: + +```bash +uname -mov +``` + +Dopo aver eseguito il comando `uname`, si dovrebbe vedere il seguente risultato: + +```text +#1 SMP PREEMPT_DYNAMIC Wed Feb 19 16:28:19 UTC 2025 x86_64 GNU/Linux +``` + +L'indicazione `x86_64` nell'output conferma che il sistema è un'architettura x86_64. Questo dovrebbe essere il caso di vari sistemi basati su AMD e Intel. + +Successivo: [setting-up-the-jumpbox](lab2-jumpbox.md) diff --git a/docs/labs/kubernetes-the-hard-way/lab2-jumpbox.de.md b/docs/labs/kubernetes-the-hard-way/lab2-jumpbox.de.md new file mode 100644 index 0000000000..91af0fe898 --- /dev/null +++ b/docs/labs/kubernetes-the-hard-way/lab2-jumpbox.de.md @@ -0,0 +1,126 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +tags: + - kubernetes + - k8s + - Laborübung +--- + +# Übung 2: Einrichten der Jumpbox + +!!! info + + Dies ist ein Fork des ursprünglichen ["Kubernetes the hard way"](https://github.com/kelseyhightower/kubernetes-the-hard-way), das ursprünglich von Kelsey Hightower geschrieben wurde (GitHub: kelseyhightower). Im Gegensatz zum Original, das auf Debian-ähnlichen Distributionen für die ARM64-Architektur basiert, zielt dieser Fork auf Enterprise-Linux-Distributionen wie Rocky Linux ab, das auf der x86_64-Architektur läuft. + +In diesem Labor richten Sie eine der vier Maschinen als „Jumpbox“ ein. Sie werden diese Maschine verwenden, um in diesem Tutorial Befehle auszuführen. Obwohl zur Gewährleistung der Konsistenz eine dedizierte Maschine verwendet wird, können Sie diese Befehle von nahezu jeder Maschine aus ausführen, einschließlich Ihrer persönlichen Workstation mit macOS oder Linux. + +Stellen Sie sich die `jumpbox` als die Verwaltungsmaschine vor, die Sie als Basis verwenden, wenn Sie Ihren Kubernetes-Cluster von Grund auf einrichten. Bevor Sie beginnen, müssen Sie einige Befehlszeilenprogramme installieren und das Git-Repository `Kubernetes The Hard Way` klonen. Dieses enthält einige zusätzliche Konfigurationsdateien, die Sie im Verlauf dieses Lernprogramms zum Konfigurieren verschiedener Kubernetes-Komponenten verwenden werden. + +Melden Sie sich bei der `jumpbox` an: + +```bash +ssh root@jumpbox +``` + +Der Einfachheit halber führen Sie alle Befehle als `root`-Benutzer aus, wodurch die Anzahl der zum Einrichten erforderlichen Befehle reduziert wird. + +## Installation der Command Line Utilities + +Sobald Sie sich als `root`-Benutzer bei der `jumpbox`-Maschine angemeldet haben, installieren Sie die Befehlszeilenprogramme, die Sie im Verlauf des Lernprogramms zum Ausführen verschiedener Aufgaben verwenden werden: + +```bash +sudo dnf -y install wget curl vim openssl git +``` + +## Synchronisation der GitHub-Repository + +Jetzt ist es an der Zeit, eine Kopie dieses Tutorials herunterzuladen, das die Konfigurationsdateien und Vorlagen enthält, die Sie zum Erstellen Ihres Kubernetes-Clusters von Grund auf verwenden werden. Klonen Sie das `Kubernetes The Hard Way`-Git-Repository mit dem Befehl `git`: + +```bash +git clone --depth 1 \ + https://github.com/wsoyinka/kubernetes-the-hard-way.git +``` + +Wechseln Sie in das Verzeichnis `kubernetes-the-hard-way`: + +```bash +cd kubernetes-the-hard-way +``` + +Dies wird das Arbeitsverzeichnis für den Rest des Tutorials sein. Wenn Sie einmal nicht weiterkommen, führen Sie den Befehl `pwd` aus, um zu überprüfen, ob Sie sich im richtigen Verzeichnis befinden, wenn Sie Befehle auf der `jumpbox` ausführen: + +```bash +pwd +``` + +```text +/root/kubernetes-the-hard-way +``` + +## Herunterladen der Binaries + +Hier laden Sie die Binärdateien für die verschiedenen Kubernetes-Komponenten herunter. Speichern Sie diese Binärdateien im Verzeichnis `Downloads` auf der `jumpbox`. Dadurch wird die zum Abschließen dieses Lernprogramms erforderliche Internetbandbreite reduziert, da Sie die Binärdateien nicht für jede Maschine in unserem Kubernetes-Cluster mehrmals herunterladen müssen. + +Die Datei `download.txt` listet die Binärdateien auf, die Sie herunterladen werden. Sie können diese mit dem Befehl `cat` überprüfen: + +```bash +cat downloads.txt +``` + +Laden Sie die in der Datei `downloads.txt` aufgeführten Binärdateien mit dem Befehl `wget` in ein Verzeichnis namens `downloads` herunter: + +```bash +wget -q --show-progress \ + --https-only \ + --timestamping \ + -P downloads \ + -i downloads.txt +``` + +Abhängig von der Geschwindigkeit Ihrer Internetverbindung kann das Herunterladen der `584` Megabyte Binärdateien eine Weile dauern. Sobald der Download abgeschlossen ist, können Sie sie mit dem Befehl `ls` auflisten: + +```bash +ls -loh downloads +``` + +```text +total 557M +-rw-r--r--. 1 root 51M Jan 6 11:13 cni-plugins-linux-amd64-v1.6.2.tgz +-rw-r--r--. 1 root 36M Feb 28 14:09 containerd-2.0.3-linux-amd64.tar.gz +-rw-r--r--. 1 root 19M Dec 9 04:16 crictl-v1.32.0-linux-amd64.tar.gz +-rw-r--r--. 1 root 17M Feb 25 14:19 etcd-v3.4.36-linux-amd64.tar.gz +-rw-r--r--. 1 root 89M Dec 11 16:12 kube-apiserver +-rw-r--r--. 1 root 82M Dec 11 16:12 kube-controller-manager +-rw-r--r--. 1 root 55M Dec 11 16:12 kubectl +-rw-r--r--. 1 root 74M Dec 11 16:12 kubelet +-rw-r--r--. 1 root 64M Dec 11 16:12 kube-proxy +-rw-r--r--. 1 root 63M Dec 11 16:12 kube-scheduler +-rw-r--r--. 1 root 11M Feb 13 20:19 runc.amd64 +``` + +## Installation von `kubectl` + +In diesem Abschnitt installieren Sie `kubectl`, das offizielle Befehlszeilentool des Kubernetes-Clients, auf der `jumpbox`-Maschine. Sie werden `kubectl` verwenden, um mit der Kubernetes-Steuerebene zu interagieren, nachdem die Bereitstellung Ihres Clusters später in diesem Tutorial abgeschlossen ist. + +Verwenden Sie den Befehl `chmod`, um die Binärdatei `kubectl` ausführbar zu machen und sie in das Verzeichnis `/usr/local/bin/` zu verschieben: + +```bash + chmod +x downloads/kubectl + cp downloads/kubectl /usr/local/bin/ +``` + +Da Ihre Installation von `kubectl` abgeschlossen ist, können Sie dies überprüfen, indem Sie den Befehl `kubectl` ausführen: + +```bash +kubectl version --client +``` + +```text +Client Version: v1.32.0 +Kustomize Version: v5.5.0 +``` + +An diesem Punkt haben Sie eine `jumpbox` mit allen Befehlszeilentools und Dienstprogrammen eingerichtet, die zum Abschließen der Übungen in diesem Lernprogramm erforderlich sind. + +Fortsetzung folgt: [Provisionierung der Computer-Ressourcen](lab3-compute-resources.md) diff --git a/docs/labs/kubernetes-the-hard-way/lab2-jumpbox.it.md b/docs/labs/kubernetes-the-hard-way/lab2-jumpbox.it.md new file mode 100644 index 0000000000..f8bd733d52 --- /dev/null +++ b/docs/labs/kubernetes-the-hard-way/lab2-jumpbox.it.md @@ -0,0 +1,126 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +tags: + - kubernetes + - k8s + - lab exercise +--- + +# Laboratorio 2: Configurazione della Jumpbox + +!!! info + + Si tratta di un fork dell'originale ["Kubernetes the hard way"](https://github.com/kelseyhightower/kubernetes-the-hard-way) scritto originariamente da Kelsey Hightower (GitHub: kelseyhightower). A differenza dell'originale, che si basa su distribuzioni simili a Debian per l'architettura ARM64, questo fork si rivolge a distribuzioni Enterprise Linux come Rocky Linux, che gira su architettura x86_64. + +In questo laboratorio, si imposterà una delle quattro macchine come `jumpbox`. Questa macchina verrà utilizzata per eseguire i comandi di questa esercitazione. Sebbene venga utilizzato un computer dedicato per garantire la coerenza, è possibile eseguire questi comandi da qualsiasi computer, compresa la propria workstation personale con macOS o Linux. + +Considerate la `jumpbox` come la macchina di amministrazione che userete come base per impostare il vostro cluster Kubernetes da zero. Una cosa da fare prima di iniziare è installare alcune utility da riga di comando e clonare il repository git Kubernetes The Hard Way, che contiene alcuni file di configurazione aggiuntivi che verranno utilizzati per configurare vari componenti di Kubernetes nel corso di questo tutorial. + +Accedere alla `jumpbox`: + +```bash +ssh root@jumpbox +``` + +Per comodità, si eseguiranno tutti i comandi come utente `root`, in modo da ridurre il numero di comandi necessari per la configurazione. + +## Installare le utilità della riga di comando + +Una volta effettuato l'accesso alla macchina `jumpbox` come utente `root`, si installeranno le utility da riga di comando che verranno utilizzate per eseguire vari compiti nel corso dell'esercitazione: + +```bash +sudo dnf -y install wget curl vim openssl git +``` + +## Sincronizzazione del repository GitHub + +Ora è il momento di scaricare una copia di questo tutorial, che contiene i file di configurazione e i modelli da utilizzare per costruire il cluster Kubernetes da zero. Clonare il repository git Kubernetes The Hard Way usando il comando `git`: + +```bash +git clone --depth 1 \ + https://github.com/wsoyinka/kubernetes-the-hard-way.git +``` + +Passare alla cartella `kubernetes-the-hard-way`: + +```bash +cd kubernetes-the-hard-way +``` + +Questa sarà la directory di lavoro per il resto dell'esercitazione. Se vi perdete, eseguite il comando `pwd` per verificare di essere nella directory corretta quando eseguite i comandi su `jumpbox`: + +```bash +pwd +``` + +```text +/root/kubernetes-the-hard-way +``` + +## Scaricare i binari + +Qui si scaricano i binari dei vari componenti di Kubernetes. Memorizzare questi file binari nella directory `Downloads` della `jumpbox`. Questo ridurrà la quantità di banda internet necessaria per completare questa esercitazione, in quanto si eviterà di scaricare i binari più volte per ogni macchina del cluster Kubernetes. + +Il file `download.txt` elenca i file binari che verranno scaricati, che possono essere esaminati con il comando `cat`: + +```bash +cat downloads.txt +``` + +Scaricare i file binari elencati nel file `downloads.txt` in una directory chiamata `downloads` usando il comando `wget`: + +```bash +wget -q --show-progress \ + --https-only \ + --timestamping \ + -P downloads \ + -i downloads.txt +``` + +A seconda della velocità di connessione a Internet, potrebbe essere necessario un po' di tempo per scaricare i `584` megabyte di file binari. Una volta completato il download, è possibile elencarli con il comando `ls`: + +```bash +ls -loh downloads +``` + +```text +total 557M +-rw-r--r--. 1 root 51M Jan 6 11:13 cni-plugins-linux-amd64-v1.6.2.tgz +-rw-r--r--. 1 root 36M Feb 28 14:09 containerd-2.0.3-linux-amd64.tar.gz +-rw-r--r--. 1 root 19M Dec 9 04:16 crictl-v1.32.0-linux-amd64.tar.gz +-rw-r--r--. 1 root 17M Feb 25 14:19 etcd-v3.4.36-linux-amd64.tar.gz +-rw-r--r--. 1 root 89M Dec 11 16:12 kube-apiserver +-rw-r--r--. 1 root 82M Dec 11 16:12 kube-controller-manager +-rw-r--r--. 1 root 55M Dec 11 16:12 kubectl +-rw-r--r--. 1 root 74M Dec 11 16:12 kubelet +-rw-r--r--. 1 root 64M Dec 11 16:12 kube-proxy +-rw-r--r--. 1 root 63M Dec 11 16:12 kube-scheduler +-rw-r--r--. 1 root 11M Feb 13 20:19 runc.amd64 +``` + +## Installare `kubectl` + +In questa sezione si installerà `kubectl`, lo strumento a riga di comando ufficiale del client Kubernetes, sulla macchina `jumpbox`. Si userà `kubectl` per interagire con il piano di controllo di Kubernetes dopo il completamento del provisioning del cluster, più avanti in questo tutorial. + +Usare il comando `chmod` per rendere eseguibile il binario `kubectl` e spostarlo nella directory `/usr/local/bin/`: + +```bash + chmod +x downloads/kubectl + cp downloads/kubectl /usr/local/bin/ +``` + +Poiché l'installazione di `kubectl` è completa, è possibile verificarla eseguendo il comando `kubectl`: + +```bash +kubectl version --client +``` + +```text +Client Version: v1.32.0 +Kustomize Version: v5.5.0 +``` + +A questo punto, avete configurato una `jumpbox` con tutti gli strumenti e le utilità a riga di comando necessari per completare i laboratori di questa esercitazione. + +Successivo: [Provisioning delle risorse di calcolo](lab3-compute-resources.md) diff --git a/docs/labs/kubernetes-the-hard-way/lab3-compute-resources.it.md b/docs/labs/kubernetes-the-hard-way/lab3-compute-resources.it.md new file mode 100644 index 0000000000..ce399a0e2b --- /dev/null +++ b/docs/labs/kubernetes-the-hard-way/lab3-compute-resources.it.md @@ -0,0 +1,236 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer +tags: + - kubernetes + - k8s + - lab exercise +--- + +# Laboratorio 3: Provisioning delle risorse di calcolo + +!!! info + + Si tratta di un fork dell'originale ["Kubernetes the hard way"](https://github.com/kelseyhightower/kubernetes-the-hard-way) scritto originariamente da Kelsey Hightower (GitHub: kelseyhightower). A differenza dell'originale, che si basa su distribuzioni simili a Debian per l'architettura ARM64, questo fork si rivolge a distribuzioni Enterprise Linux come Rocky Linux, che gira su architettura x86_64. + +Kubernetes richiede un insieme di macchine per ospitare il piano di controllo di Kubernetes e i nodi worker dove vengono eseguiti i container. In questo laboratorio, si forniranno le macchine necessarie per configurare un cluster Kubernetes. + +## Database macchine + +Questa esercitazione sfrutterà un file di testo, che servirà come database delle macchine, per memorizzare i vari attributi delle macchine che verranno utilizzati durante la configurazione del piano di controllo e dei nodi worker di Kubernetes. Il seguente schema rappresenta le voci del database delle macchine, una voce per riga: + +```text +IPV4_ADDRESS FQDN HOSTNAME POD_SUBNET +``` + +Ogni colonna corrisponde a un indirizzo IP della macchina `IPV4_ADDRESS`, a un nome di dominio completamente qualificato `FQDN`, a un nome host `HOSTNAME` e alla sottorete IP `POD_SUBNET`. Kubernetes assegna un indirizzo IP per `pod` e il `POD_SUBNET` rappresenta l'intervallo di indirizzi IP unico assegnato a ciascuna macchina del cluster. + +Ecco un esempio di database macchina simile a quello utilizzato per creare questa esercitazione. Date un'occhiata agli indirizzi IP nascosti. È possibile assegnare qualsiasi indirizzo IP alle macchine, purché siano raggiungibili tra loro e dalla `jumpbox`. + +```bash +cat machines.txt +``` + +```text +XXX.XXX.XXX.XXX server.kubernetes.local server +XXX.XXX.XXX.XXX node-0.kubernetes.local node-0 10.200.0.0/24 +XXX.XXX.XXX.XXX node-1.kubernetes.local node-1 10.200.1.0/24 +``` + +Ora tocca a voi creare un file `machines.txt` con i dettagli delle tre macchine che userete per creare il cluster Kubernetes. È possibile utilizzare l'esempio di database delle macchine di cui sopra per aggiungere i dettagli delle proprie macchine. + +## Configurazione dell'accesso SSH + +Si utilizzerà SSH per configurare le macchine del cluster. Verificare di avere accesso SSH `root` a ogni macchina elencata nel database. Potrebbe essere necessario abilitare l'accesso SSH root su ogni nodo aggiornando il file `sshd_config` e riavviando il server SSH. + +### Abilitare l'accesso SSH di root + +È possibile saltare questa sezione se si dispone di un accesso SSH `root` per ogni macchina. + +Una nuova installazione di `Rocky Linux` disabilita l'accesso SSH per l'utente `root` per impostazione predefinita. Questo per ragioni di sicurezza, dato che l'utente `root' ha il controllo amministrativo totale dei sistemi Unix-like. Le password deboli sono terribili per le macchine connesse a Internet. Come accennato in precedenza, si abiliterà l'accesso `root\` su SSH per semplificare i passaggi di questa esercitazione. La sicurezza è un compromesso; in questo caso, si sta ottimizzando la convenienza. + +Accedere a ogni macchina utilizzando SSH e il proprio account utente, quindi passare all'utente `root` con il comando `su`: + +```bash +su - root +``` + +Modificare il file di configurazione del demone SSH `/etc/ssh/sshd_config` e impostare l'opzione `PermitRootLogin` su `yes`: + +```bash +sed -i \ + 's/^#PermitRootLogin.*/PermitRootLogin yes/' \ + /etc/ssh/sshd_config +``` + +Riavviare il server SSH `sshd` per caricare il file di configurazione aggiornato: + +```bash +systemctl restart sshd +``` + +### Generare e distribuire le chiavi SSH + +Qui si genererà e distribuirà una coppia di chiavi SSH alle macchine `server`, `node-0` e `node-1`, che verranno utilizzate per eseguire comandi su tali macchine nel corso di questa esercitazione. Eseguite i seguenti comandi dalla macchina `jumpbox`. + +Generare una nuova chiave SSH: + +```bash +ssh-keygen +``` + +Premete ++enter++ per accettare tutti i valori predefiniti delle richieste: + +```text +Generating public/private rsa key pair. +Enter file in which to save the key (/root/.ssh/id_rsa): +Enter passphrase (empty for no passphrase): +Enter same passphrase again: +Your identification has been saved in /root/.ssh/id_rsa +Your public key has been saved in /root/.ssh/id_rsa.pub +``` + +Copiare la chiave pubblica SSH su ogni macchina: + +```bash +while read IP FQDN HOST SUBNET; do + ssh-copy-id root@${IP} +done < machines.txt +``` + +Una volta aggiunta ogni chiave, verificare che l'accesso alla chiave pubblica SSH funzioni: + +```bash +while read IP FQDN HOST SUBNET; do + ssh -n root@${IP} uname -o -m +done < machines.txt +``` + +```text +x86_64 GNU/Linux +x86_64 GNU/Linux +x86_64 GNU/Linux +``` + +## Hostnames + +In questa sezione, si assegneranno i nomi host alle macchine `server`, `node-0` e `node-1`. Si utilizzerà il nome dell'host quando si eseguiranno i comandi dalla `jumpbox` a ogni macchina. Anche il nome dell'host svolge un ruolo importante all'interno del cluster. Invece di utilizzare un indirizzo IP per inviare comandi al server API Kubernetes, i client Kubernetes utilizzeranno il nome host `server`. I nomi di host sono utilizzati anche da ogni macchina worker, `node-0` e `node-1`, quando si registra con un determinato cluster Kubernetes. + +Per configurare l'hostname di ogni macchina, eseguire i seguenti comandi su `jumpbox`. + +Impostare il nome host di ogni macchina elencata nel file `machines.txt`: + +```bash +while read IP FQDN HOST SUBNET; do + ssh -n root@${IP} cp /etc/hosts /etc/hosts.bak + CMD="sed -i 's/^127.0.0.1.*/127.0.0.1\t${FQDN} ${HOST}/' /etc/hosts" + ssh -n root@${IP} "$CMD" + ssh -n root@${IP} hostnamectl hostname ${HOST} +done < machines.txt +``` + +Verificare l'hostname impostato su ogni macchina: + +```bash +while read IP FQDN HOST SUBNET; do + ssh -n root@${IP} hostname --fqdn +done < machines.txt +``` + +```text +server.kubernetes.local +node-0.kubernetes.local +node-1.kubernetes.local +``` + +## Tabella di ricerca host + +In questa sezione, si genererà un file `hosts` e lo si aggiungerà al file `/etc/hosts` su `jumpbox` e ai file `/etc/hosts` su tutti e tre i membri del cluster utilizzati per questa esercitazione. In questo modo ogni macchina sarà raggiungibile con un nome di host come `server`, `node-0` o `node-1`. + +Creare un nuovo file `hosts` e aggiungere un'intestazione per identificare le macchine da aggiungere: + +```bash +echo "" > hosts +echo "# Kubernetes The Hard Way" >> hosts +``` + +Generare una voce di host per ogni macchina nel file `machines.txt` e aggiungerla al file `hosts`: + +```bash +while read IP FQDN HOST SUBNET; do + ENTRY="${IP} ${FQDN} ${HOST}" + echo $ENTRY >> hosts +done < machines.txt +``` + +Esaminare le voci degli host nel file `hosts`: + +```bash +cat hosts +``` + +```text + +# Kubernetes The Hard Way +XXX.XXX.XXX.XXX server.kubernetes.local server +XXX.XXX.XXX.XXX node-0.kubernetes.local node-0 +XXX.XXX.XXX.XXX node-1.kubernetes.local node-1 +``` + +## Aggiunta di voci `/etc/hosts` a una macchina locale + +In questa sezione, si aggiungeranno le voci DNS dal file `hosts` al file locale `/etc/hosts` sulla macchina `jumpbox`. + +Aggiungere le voci DNS da `hosts` a `/etc/hosts`: + +```bash +cat hosts >> /etc/hosts +``` + +Verificare l'aggiornamento del file `/etc/hosts`: + +```bash +cat /etc/hosts +``` + +```text +127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 +::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 + +# Kubernetes The Hard Way +XXX.XXX.XXX.XXX server.kubernetes.local server +XXX.XXX.XXX.XXX node-0.kubernetes.local node-0 +XXX.XXX.XXX.XXX node-1.kubernetes.local node-1 +``` + +Dovresti essere in grado di collegarti tramite SSH a ciascuna macchina elencata nel file `machines.txt` utilizzando un nome host. + +```bash +for host in server node-0 node-1 + do ssh root@${host} uname -o -m -n +done +``` + +```text +server x86_64 GNU/Linux +node-0 x86_64 GNU/Linux +node-1 x86_64 GNU/Linux +``` + +## Aggiunta di voci `/etc/hosts` alle macchine remote + +In questa sezione, si aggiungeranno le voci di host da `hosts` a `/etc/hosts` su ogni macchina elencata nel file di testo `machines.txt`. + +Copiare il file `hosts` su ogni macchina e aggiungerne il contenuto a `/etc/hosts`: + +```bash +while read IP FQDN HOST SUBNET; do + scp hosts root@${HOST}:~/ + ssh -n \ + root@${HOST} "cat hosts >> /etc/hosts" +done < machines.txt +``` + +È possibile utilizzare i nomi host quando ci si connette alle macchine dalla propria macchina `jumpbox` o da una qualsiasi delle tre macchine del cluster Kubernetes. Invece di usare gli indirizzi IP, è ora possibile connettersi alle macchine usando un nome di host come `server`, `node-0` o `node-1`. + +Successivo: [Provisioning di una CA e generazione di certificati TLS](lab4-certificate-authority.md) From 61cf552766e8aebe22ace5addb1820909619f4df Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Fri, 1 Aug 2025 15:37:15 -0500 Subject: [PATCH 092/164] editing again `lab4-advanced-system-process-monitoring.md` (#2815) * translator found a few issues while translating * fixes for some missing code blocks * fixes for some contractions * fixes for some variable use inconsistencies --- ...lab4-advanced_system_process_monitoring.md | 59 +++++++++---------- 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/docs/labs/systems_administration_II/lab4-advanced_system_process_monitoring.md b/docs/labs/systems_administration_II/lab4-advanced_system_process_monitoring.md index e89fb87419..37966d90c8 100644 --- a/docs/labs/systems_administration_II/lab4-advanced_system_process_monitoring.md +++ b/docs/labs/systems_administration_II/lab4-advanced_system_process_monitoring.md @@ -1,5 +1,5 @@ --- -author: Wale Soyinka +author: Wale Soyinka contributors: Steven Spencer, Ganna Zhrynova tested on: All Versions tags: @@ -17,7 +17,6 @@ tags: - cgroups --- - # Lab 4: Advanced System and process monitoring ## Objectives @@ -52,7 +51,7 @@ The `fuser` command in Linux is used to identify processes using files or socket touch ~/testfile.txt ``` -2. Create the script that we will use to simulate access to testfile.txt. Type: +2. Create the script that we will use to simulate access to `testfile.txt`. Type: ```bash cat > ~/simulate_file_usage.sh << EOF @@ -87,7 +86,7 @@ The `fuser` command in Linux is used to identify processes using files or socket fuser -v ~/testfile.txt ``` -3. All done with testfile.txt and simulate_file_usage.sh. You can now remove the files. Type: +3. All done with `testfile.txt` and `simulate_file_usage.sh`. You can now remove the files. Type: ```bash kill %1 @@ -145,11 +144,11 @@ The `fuser` command in Linux is used to identify processes using files or socket !!! tip - The generate_cpu_load.sh script is a simple tool for generating CPU load by calculating Pi (π) to high precision. The same calculation is done 10 times. The script accepts an integer as the parameter for specifying the number of decimal places for calculating Pi. + The `generate_cpu_load.sh` script is a simple tool for generating CPU load by calculating Pi (π) to high precision. The same calculation is done 10 times. The script accepts an integer as the parameter for specifying the number of decimal places for calculating Pi. #### To simulate extra CPU load -1. Let's run a simple test and calculate Pi to 50 decimal places. Run the Script by typing: +1. Run a simple test and calculate Pi to 50 decimal places. Run the Script by typing: ```bash ~/generate_cpu_load.sh 50 & @@ -197,7 +196,7 @@ The `fuser` command in Linux is used to identify processes using files or socket sudo perf stat -e cycles find /proc ``` -3. Do the same thing but with the ./generate_cpu_load.sh script. Count specific events like CPU cycles to evaluate the performance of the ./generate_cpu_load.sh script. Type: +3. Do the same thing but with the `generate_cpu_load.sh` script. Count specific events like CPU cycles to evaluate the performance of the `generate_cpu_load.sh` script. Type: ```bash sudo perf stat -e cycles ./generate_cpu_load.sh 500 @@ -222,7 +221,7 @@ The `fuser` command in Linux is used to identify processes using files or socket !!! note - Here's the breakdown of the final sample output of the `perf stat` command: + Here is the breakdown of the final sample output of the `perf stat` command: *1,670,638,886 cycles*: This indicates the total number of CPU cycles consumed during the execution of the script. Each cycle represents a single step in the CPU's instruction execution. @@ -267,7 +266,7 @@ The `fuser` command in Linux is used to identify processes using files or socket ~/strace_script.sh & ``` -2. Find the PID for the `strace_script.sh` process in a separate terminal. Store the PID in a variable named MYPID. We'll use the `pgrep` command for this by running: +2. Find the PID for the `strace_script.sh` process in a separate terminal. Store the PID in a variable named MYPID. Use the `pgrep` command for this by running: ```bash export MYPID=$(pgrep strace_script) ; echo $MYPID @@ -309,7 +308,7 @@ The `fuser` command in Linux is used to identify processes using files or socket sudo timeout 10 strace -c -p $MYPID ``` - Our sample system shows a summary report output like this: + Your sample system shows a summary report output like this: OUTPUT: @@ -538,7 +537,7 @@ This exercise demonstrates direct interaction with the `cgroup` v2 filesystem. #### To set a new memory resource limit -1. Let's set a memory resource limit to limit memory usage to 4096 bytes (4kB). To restrict processes in the `cgroup` to use a maximum of 4kB of memory type: +1. Set a memory resource limit to limit memory usage to 4096 bytes (4kB). To restrict processes in the `cgroup` to use a maximum of 4kB of memory type: ```bash echo 4096 | sudo tee /sys/fs/cgroup/exercise_group/memory.max @@ -564,14 +563,14 @@ This exercise demonstrates direct interaction with the `cgroup` v2 filesystem. #### To run and add process/script to the memory `cgroup` -1. Launch the memory_stress.sh, capture its PID and add the PID to cgroup.procs. Type: +1. Launch the `memory_stress.sh` script, capture its PID, and add the PID to `cgroup.procs`. Type: ```bash ~/memory_stress.sh & echo $! | sudo tee /sys/fs/cgroup/exercise_group/cgroup.procs ``` - The /sys/fs/cgroup/exercise_group/cgroup.procs file can be used for adding or viewing the PIDs (Process IDs) of processes that are members of a given `cgroup`. Writing a PID to this file assigns the ~/memory_stress.sh script process to the exercise_group `cgroup`. + Use /sys/fs/cgroup/exercise_group/cgroup.procs file for adding or viewing the PIDs (Process IDs) of processes that are members of a given `cgroup`. Writing a PID to this file assigns the `memory_stress.sh` script process to the `exercise_group` `cgroup`. 2. The previous command will end very quickly before completion because it has exceeded the memory limits of the `cgroup`. You can run the following `journalctl` command in another terminal to view the error as it happens. Type: @@ -597,7 +596,7 @@ This exercise demonstrates direct interaction with the `cgroup` v2 filesystem. echo 10000 | sudo tee /sys/fs/cgroup/exercise_group/cpu.max ``` - 10000 represents the CPU bandwidth limit. It's set to 10% of a single CPU core's total capacity. + 10000 represents the CPU bandwidth limit. It is set to 10% of a single CPU core's total capacity. 2. Confirm CPU Limit has been set. Type: @@ -646,14 +645,14 @@ This exercise demonstrates direct interaction with the `cgroup` v2 filesystem. The primary storage device can be a target for setting I/O resource limits. Storage devices on Linux systems have major and minor device numbers that can be used to identify them uniquely. -1. First, let's create a set of helper variables to detect and store the device number for the primary storage device on the server. Type: +1. First, create a set of helper variables to detect and store the device number for the primary storage device on the server. Type: ```bash primary_device=$(lsblk | grep disk | awk '{print $1}' | head -n 1) primary_device_num=$(ls -l /dev/$primary_device | awk '{print $5, $6}' | sed 's/,/:/') ``` -2. Display the value of the $primary_device_num variable. Type: +2. Display the value of the `$primary_device_num` variable. Type: ```bash echo "Primary Storage Device Number: $primary_device_num" @@ -682,7 +681,7 @@ The primary storage device can be a target for setting I/O resource limits. Stor #### To create the I/O stress test process -1. Start a `dd` process to create a large file named /tmp/io_stress. Also, capture and store the PID of the `dd` process in a variable named `MYPID`. Type: +1. Start a `dd` process to create a large file named `/tmp/io_stress`. Also, capture and store the PID of the `dd` process in a variable named `MYPID`. Type: ```bash dd if=/dev/zero of=/tmp/io_stress bs=10M count=500 oflag=dsync \ @@ -705,7 +704,7 @@ The primary storage device can be a target for setting I/O resource limits. Stor iotop -p $MYPID ``` - The output will display I/O read/write speeds for the io_stress.sh process, which should not exceed 1 MB/s as per the limit. + The output will display I/O read/write speeds for the io_stress.sh process, which should not exceed 1 MB/s as per the limit. #### To remove `cgroups` @@ -731,7 +730,7 @@ CPU affinity binds specific processes or threads to particular CPU cores in a mu lscpu | grep "On-line" ``` -2. Let's create a sample process using the dd utility and store its PID in a MYPID variable. Type: +2. Create a sample process using the `dd` utility and store its PID in a `MYPID` variable. Type: ```bash dd if=/dev/zero of=/dev/null & export MYPID="$!" @@ -750,7 +749,7 @@ CPU affinity binds specific processes or threads to particular CPU cores in a mu pid 1211483's current affinity mask: f ``` - The output shows the CPU affinity mask of the process with a PID of 1211483 ($MYPID), represented in hexadecimal format. On our sample system, the affinity mask displayed is "f", which typically means that the process can run on any CPU core. + The output shows the CPU affinity mask of the process with a PID of 1211483 (`$MYPID`), represented in hexadecimal format. On our sample system, the affinity mask displayed is "f", which typically means that the process can run on any CPU core. !!! note @@ -765,7 +764,7 @@ CPU affinity binds specific processes or threads to particular CPU cores in a mu ### To set/change CPU affinity -1. Set the CPU affinity of the dd process to a single CPU (CPU 0). Type: +1. Set the CPU affinity of the `dd` process to a single CPU (CPU 0). Type: ```bash taskset -p 0x1 $MYPID @@ -784,9 +783,9 @@ CPU affinity binds specific processes or threads to particular CPU cores in a mu taskset -p $MYPID ``` - The output indicates the CPU affinity mask of the process with PID $MYPID. The affinity mask is "1" in decimal, which translates to "1" in binary. This means that the process is currently bound to CPU core 0. + The output indicates the CPU affinity mask of the process with PID `$MYPID`. The affinity mask is "1" in decimal, which translates to "1" in binary. This means that the process is currently bound to CPU core 0. -3. Now, set the CPU affinity of the dd process to multiple CPUs (CPUs 0 and 1). Type: +3. Now, set the CPU affinity of the `dd` process to multiple CPUs (CPUs 0 and 1). Type: ```bash taskset -p 0x3 $MYPID @@ -809,7 +808,7 @@ CPU affinity binds specific processes or threads to particular CPU cores in a mu 5. Launch either the `top` or `htop` utility in a separate terminal and observe if you see anything of interest as you experiment with different `taskset` configurations for a process. -6. All done. Use its PID ($MYPID) to kill the `dd` process. +6. All done. Use its PID (`$MYPID`) to kill the `dd` process. ## Exercise 9 @@ -849,18 +848,18 @@ This exercise shows how to use `systemd-run` for creating transient service unit !!! tip - `systemd.resource-control` is a configuration or management entity (concept) within the `systemd` framework designed for controlling and allocating system resources to processes and services. And `systemd.exec` is a `systemd` component responsible for defining the execution environment in which commands are executed. To view the various settings (properties) you can tweak when using systemd-run consult the `systemd.resource-control` and `systemd.exec` manual pages. This is where you will find documentation for properties like MemoryMax, CPUAccounting, IOWeight, etc. + `systemd.resource-control` is a configuration or management entity (concept) within the `systemd` framework designed for controlling and allocating system resources to processes and services. And `systemd.exec` is a `systemd` component responsible for defining the execution environment in which commands are run. To view the various settings (properties) you can tweak when using `systemd-run` consult the `systemd.resource-control` and `systemd.exec` manual pages. This is where you will find documentation for properties like MemoryMax, CPUAccounting, IOWeight, etc. #### To set CPU resource limit for a transient service -1. Let's create a transient `systemd` unit called "myrealtime.service". Run myrealtime.service with a specific round robin (rr) scheduling policy and priority. Type: +1. Create a transient `systemd` unit called "myrealtime.service". Run `myrealtime.service` with a specific round robin (rr) scheduling policy and priority. Type: ```bash systemd-run --unit=myrealtime.service \ --property=CPUSchedulingPolicy=rr --property=CPUSchedulingPriority=50 sleep 300 ``` -2. View the status for myrealtime.service. Also, capture/store the main [sleep] PID in a MYPID variable. Type: +2. View the status for `myrealtime.service`. Also, capture/store the main [sleep] PID in a MYPID variable. Type: ```bash MYPID=$(systemctl status myrealtime.service | awk '/Main PID/ {print $3}') @@ -906,7 +905,7 @@ This exercise shows how to use `systemd-run` for creating transient service unit ### `schedtool` -This exercise demonstrates the use of `schedtool` to understand and manipulate process scheduling in Rocky Linux. We will also create a script to simulate a process for this purpose. +This exercise demonstrates the use of `schedtool` to understand and manipulate process scheduling in Rocky Linux. You will also create a script to simulate a process for this purpose. #### To install `schedtool` @@ -938,7 +937,7 @@ This exercise demonstrates the use of `schedtool` to understand and manipulate p ~/cpu_load_generator.sh & echo $! ``` -3. Capture the PID for the main `openssl` process launched within the cpu_load_generator.sh script. Store the PID in a variable named MYPID. Type: +3. Capture the PID for the main `openssl` process launched within the `cpu_load_generator.sh` script. Store the PID in a variable named `$MYPID`. Type: ```bash export MYPID=$(pidof openssl) ; echo $MYPID @@ -946,7 +945,7 @@ This exercise demonstrates the use of `schedtool` to understand and manipulate p #### To use `schedtool` to check the current scheduling policy -1. Use the `schedtool` command to display the scheduling information of the process with PID $MYPID. Type: +1. Use the `schedtool` command to display the scheduling information of the process with PID `$MYPID`. Type: ```bash schedtool $MYPID From 4451c066cf1beb01aaf72635ed9547f213753fe7 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Sun, 3 Aug 2025 14:10:13 -0700 Subject: [PATCH 093/164] New Crowdin updates (#2816) * New translations marksman.md (Italian) * New translations 8_9.md (German) --- docs/books/nvchad/marksman.it.md | 2 +- docs/release_notes/8_9.de.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/books/nvchad/marksman.it.md b/docs/books/nvchad/marksman.it.md index ba6d670708..658e119799 100644 --- a/docs/books/nvchad/marksman.it.md +++ b/docs/books/nvchad/marksman.it.md @@ -1,6 +1,6 @@ --- title: Marksman -author: Fanco Colussi +author: Franco Colussi contributors: Steven Spencer, Ganna Zhyrnova tested with: 8.8, 9.2 tags: diff --git a/docs/release_notes/8_9.de.md b/docs/release_notes/8_9.de.md index 58d98540c2..658fb746b0 100644 --- a/docs/release_notes/8_9.de.md +++ b/docs/release_notes/8_9.de.md @@ -76,7 +76,7 @@ Eine detaillierte Liste der Änderungen in dieser Kategorie finden Sie unter dem #### Aktualisierte Compiler-Toolsets -- GCC Toolset 13 (new) +- GCC Toolset 13 (neu) - LLVM Toolset 16.0.6 - Rust Toolset 1.71.1 - Go Toolset 1.20.6 From 0b61b4e57964244fc798949ae2eea5baa8a76ca4 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 4 Aug 2025 07:31:22 -0700 Subject: [PATCH 094/164] New Crowdin updates (#2817) * New translations 04-advanced-commands.md (Ukrainian) * New translations 06-users.md (Ukrainian) * New translations 07-file-systems.md (Ukrainian) --- .../admin_guide/04-advanced-commands.uk.md | 2 +- docs/books/admin_guide/06-users.uk.md | 12 +++++------ docs/books/admin_guide/07-file-systems.uk.md | 20 +++++++++---------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/books/admin_guide/04-advanced-commands.uk.md b/docs/books/admin_guide/04-advanced-commands.uk.md index d07aea44dc..be18eb81a5 100644 --- a/docs/books/admin_guide/04-advanced-commands.uk.md +++ b/docs/books/admin_guide/04-advanced-commands.uk.md @@ -377,7 +377,7 @@ install -t directory source [...] install -d directory ``` -Опції: +Параметри: | Опції | Зауваження                           | | ---------------------------- | ---------------------------------------------------------------- | diff --git a/docs/books/admin_guide/06-users.uk.md b/docs/books/admin_guide/06-users.uk.md index 35c4f75eff..27badc0708 100644 --- a/docs/books/admin_guide/06-users.uk.md +++ b/docs/books/admin_guide/06-users.uk.md @@ -7,7 +7,7 @@ title: Керування користувачами У цьому розділі ви дізнаєтесь, як керувати користувачами. **** -**Цілі**: у цьому розділі майбутні адміністратори Linux дізнаються, як: +**Цілі**: у цьому розділі майбутні адміністратори Linux дізнаються як: :heavy_check_mark: додати, видалити або змінити **групу**; :heavy_check_mark: додати, видалити або змінити **користувача**; @@ -353,7 +353,7 @@ test1:!:: sudo useradd -u 1000 -g GroupA -G GroupP,GroupC albert ``` -!!! Note "Примітка" +!!! Важливо У **Debian** вам доведеться вказати опцію `-m`, щоб примусово створити каталог входу, або встановити змінну `CREATE_HOME` у файлі `/etc/login.defs`. У всіх випадках адміністратор повинен використовувати команди `adduser` і `deluser`, як зазначено в `man`, за винятком сценаріїв, призначених для переносу на всі дистрибутиви Linux: @@ -609,7 +609,7 @@ sudo chgrp group1 file | `-R` | Повторно змінюйте групи каталогу та всі файли під каталогом. | | `-v` | Відображає виконані зміни. | -!!! Note "Примітка" +!!! Важливо До файлу можна застосувати власника та групу власників, взявши за посилання інші файли: @@ -766,7 +766,7 @@ sudo passwd -n 60 -x 90 -w 80 -i 10 patrick sudo passwd alain ``` -!!! Note "Примітка" +!!! Важливо Користувачі, які ввійшли в систему, можуть використовувати команду `passwd`, щоб змінити свої паролі (цей процес вимагає запиту старого пароля користувача). Користувач root(uid=0) може змінити пароль будь-якого користувача. @@ -830,7 +830,7 @@ $ sudo chage -d 0 philippe * `/etc/login.defs` * `/etc/skel` -!!! Note "Примітка" +!!! Важливо Редагування файлу `/etc/default/useradd` виконується командою `useradd`. @@ -982,7 +982,7 @@ $ sudo su - alain 0 ``` -Увага, будь ласка! `su` і `su -` відрізняються, як показано в наступному прикладі: +Attention please! `su` і `su -` відрізняються, як показано в наступному прикладі: ```bash $ whoami diff --git a/docs/books/admin_guide/07-file-systems.uk.md b/docs/books/admin_guide/07-file-systems.uk.md index 5624dad616..4aff66d46c 100644 --- a/docs/books/admin_guide/07-file-systems.uk.md +++ b/docs/books/admin_guide/07-file-systems.uk.md @@ -29,7 +29,7 @@ tags: **Знання**: :star: :star: **Складність**: :star: :star: -**Час читання**: 20 хвилин +**Час для читання**: 20 хвилин --- @@ -128,7 +128,7 @@ parted [-l] [device] cfdisk device ``` -Приклад: +Наприклад: ```bash $ sudo cfdisk /dev/sda @@ -233,7 +233,7 @@ $ sudo cfdisk /dev/sda pvcreate [-options] partition ``` -Приклад: +Наприклад: ```bash [root]# pvcreate /dev/hdb1 @@ -263,7 +263,7 @@ pvcreate -- physical volume « /dev/hdb » successfully created vgcreate [option] ``` -Приклад: +Наприклад: ```bash [root]# vgcreate volume1 /dev/hdb1 @@ -282,7 +282,7 @@ vgcreate – volume group « volume1 » successfully created and activated lvcreate -L size [-n name] VG_name ``` -Приклад: +Наприклад: ```bash [root]# lvcreate –L 600M –n VolLog1 volume1 @@ -337,7 +337,7 @@ vgdisplay VG_name lvdisplay /dev/VG_name/LV_name ``` -Приклад: +Наприклад: ```bash [root]# lvdisplay /dev/volume1/VolLog1 @@ -375,7 +375,7 @@ lvdisplay /dev/VG_name/LV_name mkfs [-t fstype] filesys ``` -Приклад: +Наприклад: ```bash [root]# mkfs -t ext4 /dev/sda1 @@ -608,7 +608,7 @@ proc /proc proc defaults 0 0 mount [-option] [device] [directory] ``` -Приклад: +Наприклад: ```bash [root]# mount /dev/sda7 /home @@ -635,7 +635,7 @@ mount [-option] [device] [directory] umount [-option] [device] [directory] ``` -Приклад: +Наприклад: ```bash [root]# umount /home @@ -988,7 +988,7 @@ chmod [option] mode file umask [option] [mode] ``` -Приклад: +Наприклад: ```bash $ umask 033 From f944bac410b1ceab389bc47a7106541801ac9c4a Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Tue, 5 Aug 2025 08:29:05 -0700 Subject: [PATCH 095/164] New Crowdin updates (#2818) * New translations 03_rsync_demo02.md (French) * New translations 06_rsync_inotify.md (French) * New translations 07_rsync_unison_use.md (French) * New translations htop.md (French) * New translations nmtui.md (French) * New translations perl_search_replace.md (French) * New translations anacron.md (French) * New translations cron_jobs_howto.md (French) * New translations templates-automation-packer-vsphere.md (French) * New translations private_dns_server_using_bind.md (French) * New translations iftop.md (French) * New translations markdown-demo-v2.md (German) * New translations 06_rsync_inotify.md (French) * New translations 03_rsync_demo02.md (German) * New translations lab4-advanced_system_process_monitoring.md (Italian) * New translations 03_rsync_demo02.md (German) * New translations lab10-configuring-kubectl.md (Italian) * New translations lab6-the_file_system.md (Italian) * New translations lab4-certificate-authority.md (Italian) --- .../learning_rsync/03_rsync_demo02.de.md | 130 +++ .../learning_rsync/03_rsync_demo02.fr.md | 2 +- .../learning_rsync/06_rsync_inotify.fr.md | 4 +- .../learning_rsync/07_rsync_unison_use.fr.md | 8 +- docs/gemstones/htop.fr.md | 8 +- docs/gemstones/markdown-demo-v2.de.md | 91 ++ docs/gemstones/network/iftop.fr.md | 6 +- docs/gemstones/network/nmtui.fr.md | 2 +- docs/gemstones/perl_search_replace.fr.md | 2 +- docs/guides/automation/anacron.fr.md | 2 +- docs/guides/automation/cron_jobs_howto.fr.md | 2 +- .../templates-automation-packer-vsphere.fr.md | 2 +- .../dns/private_dns_server_using_bind.fr.md | 2 +- .../lab10-configuring-kubectl.it.md | 96 ++ .../lab4-certificate-authority.it.md | 131 +++ ...4-advanced_system_process_monitoring.it.md | 1026 +++++++++++++++++ .../lab6-the_file_system.it.md | 2 +- 17 files changed, 1495 insertions(+), 21 deletions(-) create mode 100644 docs/books/learning_rsync/03_rsync_demo02.de.md create mode 100644 docs/gemstones/markdown-demo-v2.de.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab10-configuring-kubectl.it.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab4-certificate-authority.it.md create mode 100644 docs/labs/systems_administration_II/lab4-advanced_system_process_monitoring.it.md diff --git a/docs/books/learning_rsync/03_rsync_demo02.de.md b/docs/books/learning_rsync/03_rsync_demo02.de.md new file mode 100644 index 0000000000..d6cb0f6705 --- /dev/null +++ b/docs/books/learning_rsync/03_rsync_demo02.de.md @@ -0,0 +1,130 @@ +--- +title: rsync – Demo 02 +author: tianci li +contributors: Steven Spencer, Ganna Zhyrnova +update: 2021-11-04 +--- + +# Demo basierend auf dem rsync-Protokoll + +In `vsftpd` gibt es virtuelle Benutzer (durch den Administrator angepasste Benutzer), weil es nicht sicher ist, anonyme Benutzer und lokale Benutzer zu verwenden. Wir wissen, dass ein Server, der auf dem `SSH`-Protokoll basiert, sicherstellen muss, dass es ein System von Benutzern gibt. Wenn es viele Synchronisationsanforderungen gibt, kann es notwendig sein, viele Benutzer zu erstellen. Dies entspricht natürlich nicht den GNU/Linux-Betriebssystem- und Wartungsstandards (je mehr Benutzer Je unsicherer). In `rsync`, aus Sicherheitsgründen gibt es eine Anmeldemethode für `rsync`-Protokollauthentifizierung. + +**Wie macht man das?** + +Geben Sie einfach die entsprechenden Parameter und Werte in die Konfigurationsdatei ein. In Rocky Linux 8 müssen Sie die Datei /etc/rsyncd.conf manuell erstellen. + +```bash +[root@Rocky ~]# touch /etc/rsyncd.conf +[root@Rocky ~]# vim /etc/rsyncd.conf +``` + +Einige Parameter und Werte dieser Datei lauten wie folgt, [hier](04_rsync_configure.md) finden Sie weitere Parameterinfos: + +| Item | Beschreibung | +| ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| address = 192.168.100.4 | Die IP-Adresse, auf die rsync default-mäßig lauscht | +| port = 873 | Standardmäßig lauscht der `rsync`-Daemon auf diesem Port | +| pid file = /var/run/rsyncd.pid | Datei-Speicherort der Prozess-PID | +| log file = /var/log/rsyncd.log | Speicherort des Log-Protokolls | +| [share] | Freigabename | +| comment = rsync | Hinweise oder Beschreibungsinformationen | +| path = /rsync/ | Der Systempfad dort, wo er sich befindet | +| read only = yes | yes bedeutet nur lesen, kein schreiben | +| dont compress = \*.gz \*.gz2 \*.zip | Welche Dateitypen werden nicht komprimiert | +| auth users = li | Virtuelle Benutzer aktivieren und definieren, wie ein virtueller Benutzer genannt wird. Sie sollten es selbst erstellen | +| secrets file = /etc/rsyncd_users.db | Wird verwendet, um den Speicherort der Passwortdatei des virtuellen Benutzers anzugeben, die mit `.db` enden muss. Das Inhaltsformat der Datei ist "Benutzername: Passwort" für jede Zeile | + +!!! tip "Tip" + + Die Berechtigung für die Passwortdatei muss 600 sein. + +Schreiben Sie einen Teil des Dateiinhalts in /etc/rsyncd.conf und schreiben Sie den Benutzernamen und das Passwort in /etc/rsyncd_users.db. Die Berechtigung beträgt 600 + +```bash +[root@Rocky ~]# cat /etc/rsyncd.conf +address = 192.168.100.4 +port = 873 +pid file = /var/run/rsyncd.pid +log file = /var/log/rsyncd.log +[share] +comment = rsync +path = /rsync/ +read only = yes +dont compress = *.gz *.bz2 *.zip +auth users = li +secrets file = /etc/rsyncd_users.db +[root@Rocky ~]# ll /etc/rsyncd_users.db +-rw------- 1 root root 9 November 2 16:16 /etc/rsyncd_users.db +[root@Rocky ~]# cat /etc/rsyncd_users.db +li:13579 +``` + +Sie müssen möglicherweise `dnf -y rsync-daemon install` ausführen bevor Sie den Dienst starten können: `systemctl start rsyncd.service` + +```bash +[root@Rocky ~]# systemctl start rsyncd.service +[root@Rocky ~]# netstat -tulnp +Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name +tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 691/sshd +tcp 0 0 192.168.100.4:873 0.0.0.0:* LISTEN 4607/rsync +tcp6 0 0 :::22 :::* LISTEN 691/sshd +udp 0 0 127.0.0.1:323 0.0.0.0:* 671/chronyd +udp6 0 0 ::1:323 :::* 671/chronyd +``` + +## pull/download + +Eine Datei auf dem Server zur Verifikation erstellen: `[root@Rocky]# touch /rsync/rsynctest.txt` + +Der Client macht folgendes: + +```bash +[root@fedora ~]# rsync -avz li@192.168.100.4::share /root +Password: +receiving incremental file list +./ +rsynctest.txt +sent 52 bytes received 195 bytes 7.16 bytes/sec +total size is 883 speedup is 3.57 +[root@fedora ~]# ls +aabbcc anaconda-ks.cfg fedora rsynctest.txt +``` + +success! Zusätzlich zum obigen Schreiben basierend auf dem rsync-Protokoll können Sie folgendermaßen schreiben: `rsync://li@10.1.2.84/share` + +## push/upload + +```bash +[root@fedora ~]# touch /root/fedora.txt +[root@fedora ~]# rsync -avz /root/* li@192.168.100.4::share +Password: +sending incremental file list +rsync: [sender] read error: Connection reset by peer (104) +rsync error: error in socket IO (code 10) at io.c(784) [sender = 3.2.3] +``` + +Sie erhalten den Hinweis, dass der Lesefehler mit der Einstellung `read only = yes` des Servers zusammenhängt. Ändern Sie es auf `no` und starten Sie den Dienst neu:
    `[root@Rocky ~]# systemctl restart rsyncd.service` + +Versuchen Sie es noch einmal und Sie erhalten die Meldung, dass die Berechtigung verweigert wurde: + +```bash +[root@fedora ~]# rsync -avz /root/* li@192.168.100.4::share +Password: +sending incremental file list +fedora.txt +rsync: mkstemp " /.fedora.txt.hxzBIQ " (in share) failed: Permission denied (13) +sent 206 bytes received 118 bytes 92.57 bytes/sec +total size is 883 speedup is 2.73 +rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1330) [sender = 3.2.3] +``` + +Unser virtueller Benutzer hier ist li, der standardmäßig dem Systembenutzer nobody zugeordnet ist. Natürlich können Sie dies auf andere Systembenutzer umstellen. Mit anderen Worten, `nobody` hat keine Schreibberechtigung in das Verzeichnis `/rsync/`. Natürlich können Sie `[root@Rocky ~]# setfacl -mu:nobody:rwx /rsync/` verwenden, und es erneut versuchen. + +```bash +[root@fedora ~]# rsync -avz /root/* li@192.168.100.4::share +Password: +sending incremental file list +fedora.txt +sent 206 bytes received 35 bytes 96.40 bytes/sec +total size is 883 speedup is 3.66 +``` diff --git a/docs/books/learning_rsync/03_rsync_demo02.fr.md b/docs/books/learning_rsync/03_rsync_demo02.fr.md index 8e1cc47fdc..0c23b8e54d 100644 --- a/docs/books/learning_rsync/03_rsync_demo02.fr.md +++ b/docs/books/learning_rsync/03_rsync_demo02.fr.md @@ -20,7 +20,7 @@ Il suffit d'écrire les paramètres et valeurs correspondants dans le fichier de Certains paramètres de ce fichier et leurs valeurs sont présentés ci-dessous, [ici](04_rsync_configure.md) vous trouverez des descriptions de paramètres supplémentaires : -| Élément | Observation | +| Élément | Description | | ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | address = 192.168.100.4 | L'adresse IP sur laquelle rsync écoute par défaut | | port = 873 | port d'écoute par défaut de rsync | diff --git a/docs/books/learning_rsync/06_rsync_inotify.fr.md b/docs/books/learning_rsync/06_rsync_inotify.fr.md index a8c37f470a..4c767c0ceb 100644 --- a/docs/books/learning_rsync/06_rsync_inotify.fr.md +++ b/docs/books/learning_rsync/06_rsync_inotify.fr.md @@ -78,10 +78,10 @@ L'outil inotify-tools a deux commandes, à savoir : Les types d'événements sont les suivants : -| Type d'événement | Observation | +| Type d'événement | Description | | ---------------- | ----------------------------------------------------------------------------------------------- | | access | Accès au contenu d'un fichier ou d'un répertoire | -| modifier | Le contenu du fichier ou du répertoire est enregistré | +| modify | Le contenu du fichier ou du répertoire est enregistré | | attrib | Les attributs du fichier ou du répertoire sont modifiés | | close_write | Le fichier ou le répertoire est ouvert en mode écriture puis fermé | | close_nowrite | Le fichier ou le répertoire est fermé après avoir été ouvert en mode lecture seule | diff --git a/docs/books/learning_rsync/07_rsync_unison_use.fr.md b/docs/books/learning_rsync/07_rsync_unison_use.fr.md index 151c93cd47..ce601950aa 100644 --- a/docs/books/learning_rsync/07_rsync_unison_use.fr.md +++ b/docs/books/learning_rsync/07_rsync_unison_use.fr.md @@ -33,7 +33,7 @@ Last login: Wed Nov 3 22:07:18 2021 from 192.168.100.5 [testrsync@Rocky ~]$ ``` -!!! tip "Astuce" +!!! tip "Tip" Les fichiers de configuration des deux machines **/etc/ssh/sshd_config** doivent être ouverts PubkeyAuthentication yes @@ -132,16 +132,16 @@ done [root@fedora ~]# jobs -l ``` -!!! tip "Astuce" +!!! tip "Tip" Pour la synchronisation bidirectionnelle, les scripts des deux machines doivent être démarrés, sinon une erreur sera signalée. -!!! tip "Astuce" +!!! tip "Tip" If you want to start this script at boot `[root@Rocky ~]# echo "bash /root/unison1.sh &" >> /etc/rc.local` `[root@Rocky ~]# chmod +x /etc/rc.local` -!!! tip "Astuce" +!!! tip "Tip" Si vous voulez arrêter le processus correspondant à ce script, vous pouvez le trouver dans la commande `htop` puis **kill** diff --git a/docs/gemstones/htop.fr.md b/docs/gemstones/htop.fr.md index 112f5f47d4..bb1adbe0e1 100644 --- a/docs/gemstones/htop.fr.md +++ b/docs/gemstones/htop.fr.md @@ -43,7 +43,7 @@ PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command(mer * Les 0 et 1 indiquent le numéro des cœurs de la CPU et le pourcentage indique le taux d'occupation d'un seul cœur (le taux d'occupation total de la CPU peut également être affiché) * Les différentes couleurs de la barre de progression indiquent le pourcentage de différents types de processus : - | Couleur | Observation | Noms affichés avec d'autres styles | + | Couleur | Description | Noms affichés avec d'autres styles | | ------- | ------------------------------------------------------------------------- | ---------------------------------- | | Bleu | Pourcentage de CPU utilisé par les processus de faible priorité | low | | Vert | Pourcentage de CPU du processus appartenant à des utilisateurs ordinaires | | @@ -53,7 +53,7 @@ PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command(mer * Tasks: 22, 46thr, 174 kthr 1 running. Dans notre exemple, cela signifie que notre machine actuelle a 24 tâches, qui sont divisés en 14 threads, dont un seul processus est en cours d'exécution, "kthr" indique le nombre de kernel-threads. * Mem décrit la charge de mémoire. Les couleurs permettent de distinguer le type d'occupation de la mémoire : - | Couleur | Observation | Noms affichés | + | Couleur | Description | Noms affichés | | ------------ | -------------------------------------------------------------- | ------------- | | Bleu | Pourcentage de mémoire consommée par le tampon | buffers | | Vert | Pourcentage de mémoire consommée par la zone mémoire | used | @@ -62,7 +62,7 @@ PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command(mer * Swap information. - | Couleur | Observation | Noms affichés | + | Couleur | Description | Noms affichés | | ------------ | ------------------------------------------ | ------------- | | Vert | Pourcentage de cache utilisé sur le disque | used | | Jaune/Orange | Pourcentage de cache - swap - utilisé | cache | @@ -96,7 +96,7 @@ Dans l'interface interactive, appuyez sur le bouton ++f1++ pour voir la descript Pour gérer le processus, utilisez le bouton ++f9++ et lui envoyer différents signaux. La liste des signaux peut être affichée avec la commande `kill -l`. Les plus couramment utilisées sont : -| Signal | Observation | +| Signal | Description | | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 1 | Arrête immédiatement le processus qui redémarre après avoir relu le fichier de configuration | | 9 | Utilisé pour mettre fin immédiatement à l'exécution du programme, pour terminer le processus de force, similaire à la fin forcée dans la barre des tâches de la fenêtre | diff --git a/docs/gemstones/markdown-demo-v2.de.md b/docs/gemstones/markdown-demo-v2.de.md new file mode 100644 index 0000000000..b77c61a164 --- /dev/null +++ b/docs/gemstones/markdown-demo-v2.de.md @@ -0,0 +1,91 @@ +--- +title: Markdown Demo +author: Steven Spencer +contributors: Wale Soyinka, Tony Guntharp +tested_with: 8.5 +tags: + - Beispiel + - crowdin + - markdown +--- + +# Übersicht + +## Hintergrund + +- Verwendung von [Markdown](https://daringfireball.net/projects/markdown). +- 'markdown'-Kenntnisse. + +Diese Anleitung demonstriert gängige Markdown-Auszeichnungselemente, die wir auf den Seiten [https://docs.rockylinux.org](https://docs.rockylinux.org) verwenden, sowie das Admonitions-Element, das nicht im Standard-Markdown enthalten ist. + +## Die Demo + +> Dies ist ein Beispiel für ein Zitat. Hübsch formatiert. + +Manchmal verwenden wir Dinge wie _dieses_. + +Wie wäre es mit **bold face** + +Meistens handelt es sich um normalen Text wie dieser. + +Manchmal wird ein `Befehl` hervorgehoben + +Oder mehrere Befehle: + +```bash +dnf install my_stapler +dnf update my_pencil +dnf remove my_notepad +systemctl enable my_stapler +``` + +In manchen Fällen benötigen wir Aufzählungen oder nummerierte Listen: + +- Kugelschreiber +- Kompass +- Bleistift +- Heft + +1. Mathematik +2. Physik +3. Chemie + +Sie werden auch das Admonition-Auszeichnungselement benötigen: + +### Admonitions + +Die ebenfalls erwähnten Admonitions eignen sich hervorragend zum Einfügen zusätzlicher Inhalte, ohne den Fluss des Dokuments wesentlich zu unterbrechen. Material für MkDocs bietet mehrere Arten von Admonitions und ermöglicht die Einbindung und Verschachtelung beliebiger Inhalte. + +!!! tip "Tip" + + Pencils and staplers are old-school. + +#### Verwendung + +Admonitions folgen einer einfachen Syntax: Ein Block beginnt mit `!!!`, gefolgt von einem **Schlüsselwort**, das als Typ-Qualifizierend verwendet wird. Der Inhalt des Blocks folgt in der nächsten Zeile, mit vier Leerzeichen eingerückt: + +!!! note "Notiz" + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +#### Den Titel ändern + +Standardmäßig entspricht der Titel dem Typ-Qualifizierenden in der Titelschreibweise. Sie können dies jedoch ändern, indem Sie nach dem Typ-Qualifizierenden eine in Anführungszeichen gesetzte Zeichenfolge mit gültigem Markdown (einschließlich Links, Formatierung usw.) hinzufügen: + +!!! note "Phasellus posuere in sem ut cursus" + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +Wenn ein Befehl mehrere Optionen hat oder Sie bestimmte Optionen auflisten müssen, können Sie zur Identifizierung häufig eine Tabelle verwenden: + +| Tool | Verwendung | Zusätzliche Informationen | +| -------------- | ------------------------------------------- | ----------------------------------------------- | +| Stift | Schreiben. | kann durch einen Kugelschreiber ersetzt werden | +| Kugelschreiber | Schreiben oder drucken | kann durch ein Bleistift ersetzt werden | +| Stylus | writing or printing on an electronic device | wird manchmal durch eine Tastatur ersetzt | +| Tastatur | writing or printing on an electronic device | never replaced - used until full of food crumbs | +| notepad | Notizen verfassen | bei zunehmender Vergesslichkeit unverzichtbar. | diff --git a/docs/gemstones/network/iftop.fr.md b/docs/gemstones/network/iftop.fr.md index 04ffa2f549..78fe26c2e7 100644 --- a/docs/gemstones/network/iftop.fr.md +++ b/docs/gemstones/network/iftop.fr.md @@ -18,9 +18,9 @@ dnf -y install iftop Les options de la commande `iftop` sont les suivantes. -| Options | Observation | +| Options | Description | | -------------- | ------------------------------------------------------------------------------------------------------------------------------- | -| -R | Évite les recherches de nom d'hôte | +| -n | Évite les recherches de nom d'hôte | | -N | Évite de résoudre les numéros de port en noms de service | | -p | Fonctionne en mode promiscuité, de sorte que tout le trafic est compté | | -P | Affiche les numéros de port pour les connexions | @@ -52,7 +52,7 @@ Les unités pour l'indicateur **-u** sont les suivantes : | octets | octets par seconde | | paquets | paquets par seconde | -Un exemple de sortie du serveur home de l'auteur exécutant un [relais](https://community.torproject.org/relay/types-of-relays/) [Tor](https://www.torproject.org/) : +Un exemple de résultat du serveur home de l'auteur exécutant un [relais](https://community.torproject.org/relay/types-of-relays/) [Tor](https://www.torproject.org/) : ```bash Listening on bridge b 25.0Kb 37.5Kb 50.0Kb 62.5Kb diff --git a/docs/gemstones/network/nmtui.fr.md b/docs/gemstones/network/nmtui.fr.md index fe0403836e..66d8361b0d 100644 --- a/docs/gemstones/network/nmtui.fr.md +++ b/docs/gemstones/network/nmtui.fr.md @@ -36,7 +36,7 @@ Pour IPv4, s'il s'agit d'obtenir des informations réseau avec DHCP, sélectionn Si vous voulez corriger manuellement toutes les informations du réseau IPv4, vous devez sélectionner **<Manual>** après *CONFIGURATION IPv4* et les jouter ligne par ligne. Par exemple, l'auteur utilise ceci : -| Élément | Valeur | +| Item | Valeur | | ------------ | ---------------- | | Adresses | 192.168.100.4/24 | | Passerelle | 192.168.100.1 | diff --git a/docs/gemstones/perl_search_replace.fr.md b/docs/gemstones/perl_search_replace.fr.md index f90b2fd583..b8aad702a2 100644 --- a/docs/gemstones/perl_search_replace.fr.md +++ b/docs/gemstones/perl_search_replace.fr.md @@ -3,7 +3,7 @@ title: perl - Rechercher et Remplacer author: Steven Spencer tags: - perl - - search + - recherche --- # `perl` - Rechercher et Remplacer diff --git a/docs/guides/automation/anacron.fr.md b/docs/guides/automation/anacron.fr.md index 416623f067..0f938a0b6e 100644 --- a/docs/guides/automation/anacron.fr.md +++ b/docs/guides/automation/anacron.fr.md @@ -106,7 +106,7 @@ Utilisons cron.daily pour illustrer le processus d'exécution de /etc/anacrontab Utilisation de la commande `anacron`, les options couramment utilisées sont : -| Options | Observation | +| Options | Description | | ------- | -------------------------------------------------------------------------- | | -t | Exécuter toutes les tâches, ignorer les horodatages | | -u | Mettre à jour l'horodatage à l'heure actuelle sans effectuer aucune action | diff --git a/docs/guides/automation/cron_jobs_howto.fr.md b/docs/guides/automation/cron_jobs_howto.fr.md index 063c44e0d2..3f022e8bee 100644 --- a/docs/guides/automation/cron_jobs_howto.fr.md +++ b/docs/guides/automation/cron_jobs_howto.fr.md @@ -85,7 +85,7 @@ Donc pourvu que vous ayez tout à fait raison de laisser le système exécuter a ### Créer votre propre `cron` -Si les horaires automatisés et aléatoires ne fonctionnent pas bien dans [Pour les postes de travail ci-dessus](#for-workstations) et les horaires planifiés dans [Pour les serveurs ci-dessus](#for-servers), vous pouvez créer les vôtres. Dans cet exemple, nous supposons que vous faites cela en tant que root. [voir les hypothèses](#assumptions) Pour cela, tapez ce qui suit : +Si les horaires automatisés et aléatoires ne fonctionnent pas bien pour les postes de travail, ou les horaires prévus pour les serveurs, vous pouvez créer vos propres horaires. Dans cet exemple, nous supposons que vous faites cela en tant que root. Pour ce faire, tapez ce qui suit : `crontab -e` diff --git a/docs/guides/automation/templates-automation-packer-vsphere.fr.md b/docs/guides/automation/templates-automation-packer-vsphere.fr.md index fa11817b9c..9e2be3532f 100644 --- a/docs/guides/automation/templates-automation-packer-vsphere.fr.md +++ b/docs/guides/automation/templates-automation-packer-vsphere.fr.md @@ -747,7 +747,7 @@ ansible-playbook -i ./inventory/hosts -e '{"comments":"my comments","cluster_na C'est à ce stade que vous pouvez lancer la configuration finale de votre machine virtuelle en utilisant 'Ansible'. N'oubliez pas de changer le mot de passe root, de sécuriser SSH, d'enregistrer la nouvelle machine virtuelle dans votre outil de surveillance et dans votre inventaire informatique, etc. -## En résumé +## En Résumé Comme nous l'avons vu, il y a maintenant des solutions DevOps entièrement automatisées pour créer et déployer des machines virtuelles. diff --git a/docs/guides/dns/private_dns_server_using_bind.fr.md b/docs/guides/dns/private_dns_server_using_bind.fr.md index 9acd036d28..ef9dc9f33a 100644 --- a/docs/guides/dns/private_dns_server_using_bind.fr.md +++ b/docs/guides/dns/private_dns_server_using_bind.fr.md @@ -510,7 +510,7 @@ public Ces règles vous permettront d'obtenir une résolution DNS sur votre serveur DNS privé à partir des hôtes du réseau 192.168.1.0/24. De plus, vous pourrez vous connecter en SSH depuis n'importe lequel de ces hôtes à votre serveur DNS privé. -## Conclusion +## Conclusions La modification de */etc/hosts* sur un poste de travail individuel vous donnera accès à une machine sur votre réseau interne, mais vous ne pourrez l'utiliser que sur cette seule machine. Un serveur DNS privé qui utilise *bind* vous permettra d'ajouter des hôtes au DNS et, à condition que les postes de travail aient accès à ce serveur DNS privé, ils pourront accéder à ces serveurs locaux. diff --git a/docs/labs/kubernetes-the-hard-way/lab10-configuring-kubectl.it.md b/docs/labs/kubernetes-the-hard-way/lab10-configuring-kubectl.it.md new file mode 100644 index 0000000000..c584f83d70 --- /dev/null +++ b/docs/labs/kubernetes-the-hard-way/lab10-configuring-kubectl.it.md @@ -0,0 +1,96 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer +tags: + - kubernetes + - k8s + - lab exercise + - runc + - containerd + - etcd + - kubectl +--- + +# Laboratorio 10: Configurazione di `kubectl` per l'accesso remoto + +!!! info + + Si tratta di un fork dell'originale ["Kubernetes the hard way"](https://github.com/kelseyhightower/kubernetes-the-hard-way) scritto originariamente da Kelsey Hightower (GitHub: kelseyhightower). A differenza dell'originale, che si basa su distribuzioni simili a Debian per l'architettura ARM64, questo fork si rivolge a distribuzioni Enterprise Linux come Rocky Linux, che gira su architettura x86_64. + +In questo laboratorio si genererà un file kubeconfig per l'utilità a riga di comando `kubectl` basato sulle credenziali dell'utente `admin`. + +> Eseguite i comandi di questo laboratorio dalla macchina `jumpbox`. + +## Il file di configurazione Admin Kubernetes + +Ogni kubeconfig richiede un Kubernetes API Server a cui connettersi. + +In base alla voce DNS `/etc/hosts` di un laboratorio precedente, si dovrebbe essere in grado di eseguire il ping`server.kubernetes.local`. + +```bash +curl -k --cacert ca.crt \ + https://server.kubernetes.local:6443/version +``` + +```text +{ + "major": "1", + "minor": "32", + "gitVersion": "v1.32.0", + "gitCommit": "70d3cc986aa8221cd1dfb1121852688902d3bf53", + "gitTreeState": "clean", + "buildDate": "2024-12-11T17:59:15Z", + "goVersion": "go1.23.3", + "compiler": "gc", + "platform": "linux/amd64" +} +``` + +Generare un file kubeconfig adatto all'autenticazione come utente `admin`: + +```bash + kubectl config set-cluster kubernetes-the-hard-way \ + --certificate-authority=ca.crt \ + --embed-certs=true \ + --server=https://server.kubernetes.local:6443 + + kubectl config set-credentials admin \ + --client-certificate=admin.crt \ + --client-key=admin.key + + kubectl config set-context kubernetes-the-hard-way \ + --cluster=kubernetes-the-hard-way \ + --user=admin + + kubectl config use-context kubernetes-the-hard-way +``` + +L'esecuzione del comando sopra riportato dovrebbe creare un file kubeconfig nella posizione predefinita `~/.kube/config` utilizzata dallo strumento da riga di comando `kubectl`. Questo significa anche che è possibile eseguire il comando `kubectl` senza specificare una configurazione. + +## Verifica + +Controllare la versione del cluster Kubernetes remoto: + +```bash +kubectl version +``` + +```text +Client Version: v1.32.0 +Kustomize Version: v5.5.0 +Server Version: v1.32.0 +``` + +Elencare i nodi del cluster Kubernetes remoto: + +```bash +kubectl get nodes +``` + +```text +NAME STATUS ROLES AGE VERSION +node-0 Ready 30m v1.31.2 +node-1 Ready 35m v1.31.2 +``` + +Successivo: [Provisioning Pod Network Routes](lab11-pod-network-routes.md) diff --git a/docs/labs/kubernetes-the-hard-way/lab4-certificate-authority.it.md b/docs/labs/kubernetes-the-hard-way/lab4-certificate-authority.it.md new file mode 100644 index 0000000000..d7fe9726da --- /dev/null +++ b/docs/labs/kubernetes-the-hard-way/lab4-certificate-authority.it.md @@ -0,0 +1,131 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +tags: + - kubernetes + - k8s + - lab exercise +--- + +# Laboratorio 4: Provisioning di una CA e generazione di certificati TLS + +!!! info + + Si tratta di un fork dell'originale ["Kubernetes the hard way"](https://github.com/kelseyhightower/kubernetes-the-hard-way) scritto originariamente da Kelsey Hightower (GitHub: kelseyhightower). A differenza dell'originale, che si basa su distribuzioni simili a Debian per l'architettura ARM64, questo fork si rivolge a distribuzioni Enterprise Linux come Rocky Linux, che gira su architettura x86_64. + +In questo laboratorio, si provvederà alla fornitura di un'[infrastruttura PKI](https://en.wikipedia.org/wiki/Public_key_infrastructure) utilizzando OpenSSL per avviare un'autorità di certificazione e generare certificati TLS per i seguenti componenti: + +- kube-apiserver +- kube-controller-manager +- kube-scheduler +- kubelet +- kube-proxy + +Eseguire i comandi di questa sezione dalla `jumpbox`. + +## Autorità di certificazione + +In questa sezione, si provvederà al provisioning di un'autorità di certificazione che verrà utilizzata per generare ulteriori certificati TLS per gli altri componenti di Kubernetes. L'impostazione della CA e la generazione dei certificati con `openssl` possono richiedere molto tempo, soprattutto se si tratta della prima volta. Per ottimizzare questo laboratorio, è necessario includere un file di configurazione `openssl`, `ca.conf`, che definisce tutti i dettagli necessari per generare certificati per ciascun componente Kubernetes. + +Prendetevi un momento per rivedere il file di configurazione `ca.conf`: + +```bash +cat ca.conf +``` + +Per completare questa esercitazione, non è necessario comprendere tutto ciò che è contenuto nel file `ca.conf`. Tuttavia, dovreste considerarlo come un punto di partenza per imparare a usare `openssl` e la configurazione necessaria per gestire i certificati di alto livello. + +Ogni autorità di certificazione inizia con una chiave privata e un certificato radice. In questa sezione, si creerà un'autorità di certificazione autofirmata, che è tutto ciò che serve per questa esercitazione, ma che non dovrebbe essere presa in considerazione in un ambiente di produzione reale. + +Generare il file di configurazione della CA, il certificato e la chiave privata: + +```bash + openssl genrsa -out ca.key 4096 + openssl req -x509 -new -sha512 -noenc \ + -key ca.key -days 3653 \ + -config ca.conf \ + -out ca.crt +``` + +Risultati: + +```txt +ca.crt ca.key +``` + +!!! tip "Suggerimento" + + Per visualizzare i dettagli codificati nel file del certificato generato (ca.crt), è possibile utilizzare il comando OpenSSL `openssl x509 -in ca.crt -text -noout | less`. + +## Creazione dei certificati client e server + +In questa sezione, si genereranno i certificati client e server per ogni componente Kubernetes e un certificato client per l'utente Kubernetes `admin`. + +Generare i certificati e le chiavi private: + +```bash +certs=( + "admin" "node-0" "node-1" + "kube-proxy" "kube-scheduler" + "kube-controller-manager" + "kube-api-server" + "service-accounts" +) +``` + +```bash +for i in ${certs[*]}; do + openssl genrsa -out "${i}.key" 4096 + + openssl req -new -key "${i}.key" -sha256 \ + -config "ca.conf" -section ${i} \ + -out "${i}.csr" + + openssl x509 -req -days 3653 -in "${i}.csr" \ + -copy_extensions copyall \ + -sha256 -CA "ca.crt" \ + -CAkey "ca.key" \ + -CAcreateserial \ + -out "${i}.crt" +done +``` + +I risultati del comando di cui sopra genereranno una chiave privata, una richiesta di certificato e un certificato SSL firmato per ogni componente di Kubernetes. È possibile elencare i file generati con il seguente comando: + +```bash +ls -1 *.crt *.key *.csr +``` + +## Distribuzione dei certificati del client e del server + +In questa sezione, si copieranno i vari certificati su ogni macchina utilizzando un percorso in cui ogni componente Kubernetes cercherà la propria coppia di certificati. In un ambiente reale, questi certificati verrebbero trattati come un insieme di segreti sensibili, perché Kubernetes utilizza questi componenti come credenziali per l'autenticazione reciproca. + +Copiare i certificati e le chiavi private appropriate sulle macchine `node-0` e `node-1`: + +```bash +for host in node-0 node-1; do + ssh root@$host mkdir /var/lib/kubelet/ + + scp ca.crt root@$host:/var/lib/kubelet/ + + scp $host.crt \ + root@$host:/var/lib/kubelet/kubelet.crt + + scp $host.key \ + root@$host:/var/lib/kubelet/kubelet.key +done +``` + +Copiare i certificati e le chiavi private appropriate sul computer `server`: + +```bash +scp \ + ca.key ca.crt \ + kube-api-server.key kube-api-server.crt \ + service-accounts.key service-accounts.crt \ + root@server:~/ +``` + +Nel prossimo laboratorio, si utilizzeranno i certificati client `kube-proxy`, `kube-controller-manager`, `kube-scheduler` e `kubelet` per generare i file di configurazione dell'autenticazione client. + +Successivo: [Generazione dei file di configurazione di Kubernetes per l'autenticazione](lab5-kubernetes-configuration-files.md) diff --git a/docs/labs/systems_administration_II/lab4-advanced_system_process_monitoring.it.md b/docs/labs/systems_administration_II/lab4-advanced_system_process_monitoring.it.md new file mode 100644 index 0000000000..85526a8f33 --- /dev/null +++ b/docs/labs/systems_administration_II/lab4-advanced_system_process_monitoring.it.md @@ -0,0 +1,1026 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhrynova +tested on: All Versions +tags: + - system monitoring + - process monitoring + - fuser + - numactl + - perf + - chrt + - schedtool + - atop + - strace + - systemd-run + - taskset + - cgroups +--- + +# Laboratorio 4: Monitoraggio avanzato del sistema e dei processi + +## Obiettivi + +Dopo aver completato questo laboratorio, sarete in grado di + +- visualizzare e gestire i processi utilizzando strumenti avanzati +- diagnosticare ed eseguire il debug delle chiamate di sistema +- visualizzare e impostare la priorità dei processi utilizzando strumenti avanzati della CLI +- visualizzare e impostare politiche di pianificazione personalizzate per i processi +- analizzare le prestazioni di sistemi e applicazioni + +Tempo stimato per completare questo laboratorio: 90 minuti + +## Introduzione + +I comandi di questo Laboratorio coprono una gamma più ampia di gestione dei processi, monitoraggio del sistema e controllo delle risorse in Linux. Aggiungono maggiore profondità e varietà al vostro repertorio di amministratori di sistema. + +Questi esercizi coprono i comandi e i concetti aggiuntivi di Linux, fornendo esperienza pratica per la gestione dei processi, il monitoraggio delle risorse e il controllo avanzato. + +## Esercizio 1 + +### fuser + +Il comando `fuser` in Linux è utilizzato per identificare i processi che utilizzano file o socket. Può essere un utile aiuto nella gestione dei processi relativi ai file e nella risoluzione dei conflitti. + +#### Per creare uno script per simulare l'utilizzo dei file + +1. Per prima cosa, creare un file di prova vuoto a cui si vuole accedere. Digitare: + + ```bash + touch ~/testfile.txt + ``` + +2. Creare lo script che verrà utilizzato per simulare l'accesso a `testfile.txt`. Digitare: + + ```bash + cat > ~/simulate_file_usage.sh << EOF + #!/bin/bash + tail -f ~/testfile.txt + EOF + ``` + +3. Rendere lo script eseguibile. Digitare: + + ```bash + chmod +x ~/simulate_file_usage.sh + ``` + +4. Avviare lo script. Digitare: + + ```bash + ~/simulate_file_usage.sh & + ``` + +#### Identificazione dei processi che accedono a un file + +1. Identificare i processi che utilizzano o accedono a `testfile.txt`, eseguire: + + ```bash + fuser ~/testfile.txt + ``` + +2. Esplorare altre opzioni `fuser` usando l'opzione `-v`. Digitare: + + ```bash + fuser -v ~/testfile.txt + ``` + +3. Il tutto è stato fatto con `testfile.txt` e `simulate_file_usage.sh`. Ora è possibile rimuovere i file. Digitare: + + ```bash + kill %1 + rm ~/testfile.txt ~/simulate_file_usage.sh + ``` + +#### Identificazione di un processo che accede a una porta TCP/UDP + +1. Utilizzare il comando `fuser` per identificare il processo di accesso alla porta TCP 22 del server. Digitare: + + ```bash + sudo fuser 22/tcp + ``` + +## Esercizio 2 + +### `perf` + +`perf` è uno strumento versatile per analizzare le prestazioni del sistema e delle applicazioni in Linux. Può offrire ulteriori approfondimenti che possono aiutare la messa a punto delle prestazioni. + +#### Installazione di `perf` + +1. Installare l'applicazione `perf` se non è installata sul server. Digitare: + + ```bash + sudo dnf -y install perf + ``` + +2. L'applicazione `bc` è una calcolatrice di precisione a riga di comando. In questo esercizio verrà utilizzato `bc` per simulare un elevato carico della CPU. Se `bc` non è già installato sul server, installarlo con: + + ```bash + sudo dnf -y install bc + ``` + +#### Per creare uno script per generare il carico della CPU + +1. Creare uno script di carico della CPU e renderlo eseguibile eseguendo: + + ```bash + cat > ~/generate_cpu_load.sh << EOF + #!/bin/bash + + # Check if the number of decimal places is passed as an argument + if [ "$#" -ne 1 ]; then + echo "Usage: $0 " + exit 1 + fi + + # Calculate Pi to the specified number of decimal places + for i in {1..10}; do echo "scale=$1; 4*a(1)" | bc -l; done + + EOF + chmod +x ~/generate_cpu_load.sh + ``` + + !!! tip "Suggerimento" + + ``` + Lo script `generate_cpu_load.sh` è un semplice strumento per generare il carico della CPU calcolando il Pi greco (π) ad alta precisione. Lo stesso calcolo viene eseguito 10 volte. Lo script accetta un intero come parametro per specificare il numero di cifre decimali per il calcolo del Pi greco. + ``` + +#### Simulazione del carico supplementare della CPU + +1. Eseguire un semplice test e calcolare il Pi greco con 50 cifre decimali. Eseguite lo script digitando: + + ```bash + ~/generate_cpu_load.sh 50 & + ``` + +2. Eseguire nuovamente lo script, ma utilizzare `perf` per registrare le prestazioni dello script e analizzare l'utilizzo della CPU e altre metriche. Digitare: + + ```bash + + ./generate_cpu_load.sh 1000 & perf record -p $! sleep 5 + ``` + + !!! tip "Suggerimento" + + ``` + L'opzione `sleep 5` con il comando `perf record` definisce la finestra temporale in cui `perf` raccoglie i dati sulle prestazioni del carico della CPU generato dallo script generate_cpu_load.sh. Consente a `perf di registrare le metriche delle prestazioni del sistema per 5 secondi prima di fermarsi automaticamente. + ``` + +#### Per analizzare i dati sulle prestazioni e monitorare gli eventi in tempo reale + +1. Usare il comando `perf report` per esaminare il report dei dati sulle prestazioni e capire i modelli di utilizzo della CPU e della memoria. Digitare: + + ```bash + sudo perf report + ``` + + È possibile utilizzare vari tasti della tastiera per esplorare ulteriormente il rapporto. + Digitare ++"q"++ per uscire dall'interfaccia di visualizzazione dei rapporti `perf`. + +2. Osservare/capire gli eventi della cache della CPU in tempo reale per 40 secondi per identificare potenziali colli di bottiglia delle prestazioni. Digitare: + + ```bash + sudo perf stat -e cache-references,cache-misses sleep 40 + ``` + +#### Per registrare le prestazioni complete del sistema + +1. Acquisizione di dati sulle prestazioni dell'intero sistema che possono essere utilizzati per ulteriori analisi. Digitare: + + ```bash + sudo perf record -a sleep 10 + ``` + +2. Esplorare i contatori di eventi specifici. Contare eventi specifici come i cicli della CPU per valutare le prestazioni di un determinato script o applicazione. Eseguiamo un test con un comando `find` di base, digitando: + + ```bash + sudo perf stat -e cycles find /proc + ``` + +3. Fare la stessa cosa ma con lo script `generate_cpu_load.sh`. Acquisire eventi specifici come i cicli della CPU per valutare le prestazioni dello script `generate_cpu_load.sh`. Digitare: + + ```bash + sudo perf stat -e cycles ./generate_cpu_load.sh 500 + ``` + + OUTPUT: + + ```bash + ...... + 3.141592653589793238462643383279502884197169399375105820974944592307\ + 81640628620899862803482534211..... + + Performance counter stats for './generate_cpu_load.sh 500': + + 1,670,638,886 cycles + + 0.530479014 seconds time elapsed + + 0.488580000 seconds user + 0.034628000 seconds sys + ``` + + !!! note "Nota" + + ``` + Ecco la ripartizione dell'output finale del comando `perf stat`: + + *1,670,638,886 cycles*: Indica il numero totale di cicli della CPU consumati durante l'esecuzione dello script. Ogni ciclo rappresenta un singolo passo nell'esecuzione delle istruzioni della CPU. + + *0.530479014 seconds time elapsed*: È il tempo totale trascorso nel mondo reale (o tempo wall-clock) dall'inizio alla fine dell'esecuzione dello script. Questa durata include tutti i tipi di attesa (come l'attesa di I/O su disco o le chiamate di sistema). + + *0.488580000 seconds user*: È il tempo di CPU trascorso in modalità utente. Questo tempo esclude esplicitamente il tempo dedicato alle attività a livello di sistema. + + *0.034628000 seconds sys*: È il tempo trascorso dalla CPU in modalità kernel o di sistema. Include il tempo che la CPU trascorre eseguendo chiamate di sistema o eseguendo altre attività a livello di sistema per conto dello script. + ``` + +4. Tutto fatto con lo strumento `perf`. Assicurarsi che tutti gli script in background garantiscano un ambiente di lavoro pulito. + + ```bash + kill %1 + ``` + +## Esercizio 3 + +### `strace` + +`strace` è utilizzato per la diagnosi e il debug delle interazioni delle chiamate di sistema in Linux. + +#### Per creare uno script per l'esplorazione di `strace` + +1. Creare un semplice script chiamato `strace_script.sh` e renderlo eseguibile. Digitare: + + ```bash + cat > ~/strace_script.sh << EOF + #!/bin/bash + while true; do + date + sleep 1 + done + EOF + chmod +x ~/strace_script.sh + ``` + +#### Per usare `strace` sui processi in esecuzione + +1. Eseguire lo script e allegare `strace`. Digitare: + + ```bash + ~/strace_script.sh & + ``` + +2. Trovare il PID del processo `strace_script.sh` in un terminale separato. Memorizzare il PID in una variabile denominata MYPID. A tale scopo, utilizzare il comando `pgrep` eseguendo: + + ```bash + export MYPID=$(pgrep strace_script) ; echo $MYPID + ``` + + OUTPUT: + + ```bash + 4006301 + ``` + +3. Iniziate a tracciare le chiamate di sistema dello script per capire come interagisce con il kernel. Collegare `strace` al processo di script in esecuzione digitando: + + ```bash + sudo strace -p $MYPID + ``` + +4. Interrompi o arresta il processo `strace` digitando ++ctrl+c++ + +5. L'output di `strace` può essere filtrato concentrandosi su specifiche chiamate di sistema come `open` e `read` per analizzarne il comportamento. Provate a farlo per le chiamate di sistema `open` e `read`. Digitare: + + ```bash + sudo strace -e trace=open,read -p $MYPID + ``` + + Una volta terminato il tentativo di decifrare l'output di `strace`, interrompere il processo `strace` digitando ++ctrl+c++ + +6. Reindirizzare l'output in un file per un'analisi successiva, che può aiutare a diagnosticare i problemi. Salvare l'output di `strace` in un file eseguendo: + + ```bash + sudo strace -o strace_output.txt -p $MYPID + ``` + +#### Per analizzare la frequenza delle chiamate di sistema + +1. Riassumere il conteggio delle chiamate di sistema per identificare le chiamate di sistema più frequentemente utilizzate dal processo. Eseguire questa operazione per soli 10 secondi, aggiungendo il comando `timeout`. Digitare: + + ```bash + sudo timeout 10 strace -c -p $MYPID + ``` + + Il sistema di esempio mostra un report di riepilogo come questo: + + OUTPUT: + + ```bash + strace: Process 4006301 attached + strace: Process 4006301 detached + % time seconds usecs/call calls errors syscall + ------ ----------- ----------- --------- --------- ---------------- + 89.59 0.042553 1182 36 18 wait4 + 7.68 0.003648 202 18 clone + 1.67 0.000794 5 144 rt_sigprocmask + 0.45 0.000215 5 36 rt_sigaction + 0.36 0.000169 9 18 ioctl + 0.25 0.000119 6 18 rt_sigreturn + ------ ----------- ----------- --------- --------- ---------------- + 100.00 0.047498 175 270 18 total + ``` + +2. Terminare lo script e rimuovere i file creati. + + ```bash + kill $MYPID + rm ~/strace_script.sh ~/strace_output.txt + ``` + +## Esercizio 4 + +### `atop` + +`atop` fornisce una visione completa delle prestazioni del sistema, coprendo varie metriche delle risorse. + +#### Per lanciare ed esplorare `atop` + +1. Installare l'applicazione `atop` se non è installata sul server. Digitare: + + ```bash + sudo dnf -y install atop + ``` + +2. Eseguire `atop` digitando: + + ```bash + sudo atop + ``` + +3. All'interno dell'interfaccia `atop`, è possibile esplorare varie metriche `atop` premendo tasti specifici sulla tastiera. + + È possibile utilizzare i tasti 'm', 'd' o 'n' per passare dalla visualizzazione della memoria a quella del disco o della rete. Osservare l'utilizzo delle risorse in tempo reale. + +4. Monitorare le prestazioni del sistema a un intervallo personalizzato di 2 secondi, consentendo una visione più granulare dell'attività del sistema. Digitare: + + ```bash + sudo atop 2 + ``` + +5. Passare da una visualizzazione all'altra delle risorse per concentrarsi su aspetti specifici delle prestazioni del sistema. + +6. Generare un report su file di registro per l'attività del sistema, acquisendo i dati ogni 60 secondi, per tre volte. Digitare: + + ```bash + sudo atop -w /tmp/atop_log 60 3 + ``` + +7. Una volta completato il comando precedente, è possibile esaminare con calma il file binario in cui sono stati salvati i registri. Per rileggere il file di registro salvato, digitare: + + ```bash + sudo atop -r /tmp/atop_log + ``` + +8. Pulire rimuovendo i log o i file generati. + + ```bash + sudo rm /tmp/atop_log + ``` + +## Esercizio 5 + +### `numactl` + +È una struttura/architettura di memoria per computer utilizzata nel multiprocessing che migliora la velocità di accesso alla memoria considerando la posizione fisica della memoria rispetto ai processori. +Nei sistemi basati su NUMA, più processori (o core di CPU) sono fisicamente raggruppati e ogni gruppo ha la sua memoria locale. + +L'applicazione `numactl` gestisce la politica NUMA, ottimizzando le prestazioni sui sistemi basati su NUMA. + +#### Installazione di `numactl` + +1. Installare l'applicazione `numactl` se non è installata sul server. Digitare: + + ```bash + sudo dnf -y install numactl + ``` + +#### Per creare uno script ad alta intensità di memoria + +1. Create un semplice script per simulare un carico di lavoro ad alta intensità di memoria sul vostro server. Digitare: + + ```bash + cat > ~/memory_intensive.sh << EOF + #!/bin/bash + + awk 'BEGIN{for(i=0;i<1000000;i++)for(j=0;j<1000;j++);}{}' + EOF + chmod +x ~/memory_intensive.sh + ``` + +#### Utilizzo di `numactl` + +1. Eseguire lo script con `numactl`, digitare: + + ```bash + numactl --membind=0 ~/memory_intensive.sh + ``` + +2. Se il sistema dispone di più di un nodo NUMA, è possibile eseguire lo script su più nodi NUMA tramite: + + ```bash + numactl --cpunodebind=0,1 --membind=0,1 ~/memory_intensive.sh + ``` + +3. Visualizzare l'allocazione della memoria sui nodi NUMA + + ```bash + numactl --show + ``` + +4. Legare la memoria a un nodo specifico eseguendo: + + ```bash + numactl --membind=0 ~/memory_intensive.sh + ``` + +5. Pulite l'ambiente di lavoro rimuovendo lo script. + + ```bash + rm ~/memory_intensive.sh + ``` + +## Esercizio 6 + +### `iotop` + +Il comando `iotop` monitora l'utilizzo dell'I/O (input/output) del disco da parte di processi e thread. Fornisce informazioni in tempo reale simili al comando `top`, in particolare per l'I/O del disco. Ciò lo rende essenziale per diagnosticare i rallentamenti del sistema causati dall'attività del disco. + +#### Installazione di `iotop` + +1. Installare l'utilità `iotop` se non è installata. Digitare: + + ```bash + sudo dnf -y install iotop + ``` + +#### Per usare `iotop` per monitorare l'I/O del disco + +1. Eseguire il comando \`iotop' senza alcuna opzione per utilizzarlo nella sua modalità interattiva predefinita. Digitare: + + ```bash + sudo iotop + ``` + + Osservare l'utilizzo del disco live I/O da parte dei vari processi. Si usa per identificare i processi che stanno leggendo o scrivendo sul disco. + +2. Digitare ++"q"++ per uscire da `iotop`. + +#### Per usare `iotop` in modalità non interattiva + +1. Eseguire `iotop` in modalità batch (-b) per ottenere una visione non interattiva e immediata dell'utilizzo dell'I/O. L'opzione `-n 10` indica a `iotop` di prelevare 10 campioni prima di uscire. + + ```bash + sudo iotop -b -n 10 + ``` + +2. `iotop` può filtrare l'I/O per processi specifici. Identificare l'ID di un processo (PID) dal sistema utilizzando il comando ps o la visualizzazione `iotop`. Quindi, filtrare l'uscita `iotop` per quel PID specifico. Ad esempio, filtrare il PID del processo `sshd`, eseguendo: + + ```bash + sudo iotop -p $(pgrep sshd | head -1) + ``` + +3. L'opzione -`o` con `iotop` può essere usata per mostrare i processi o i thread che eseguono l'I/O effettivo, invece di visualizzare tutti i processi o i thread. Visualizzare solo i processi di I/O in esecuzione: + + ```bash + sudo iotop -o + ``` + + !!! Question "Discussione" + + ``` + Discutere l'impatto dell'I/O del disco sulle prestazioni complessive del sistema e come strumenti come `iotop` possono aiutare nell'ottimizzazione del sistema. + ``` + +## Esercizio 7 + +### `cgroups` + +I gruppi di controllo (`cgroups`) forniscono un meccanismo in Linux per organizzare, limitare e dare priorità all'uso delle risorse da parte dei processi. + +Questo esercizio dimostra l'interazione diretta con il filesystem `cgroup` v2. + +### Per esplorare il filesystem `cgroup` + +1. Usare il comando `ls` per esplorare il contenuto e la struttura del filesystem `cgroup`. Digitare: + + ```bash + ls /sys/fs/cgroup/ + ``` + +2. Usare di nuovo il comando `ls` per elencare le cartelle \*.slice sotto il filesystem `cgroup`. Digitare: + + ```bash + ls -d /sys/fs/cgroup/*.slice + ``` + + Le cartelle con estensione .slice sono solitamente utilizzate in `systemd` per rappresentare una porzione delle risorse di sistema. Si tratta di `cgroups` standard gestiti da `systemd` per organizzare e gestire i processi di sistema. + +### Per creare un `cgroup` personalizzato + +1. Creare una directory denominata "exercise_group" nel file system /sys/fs/cgroup. Questa nuova cartella ospiterà le strutture dei gruppi di controllo necessarie per il resto dell'esercizio. Utilizzare il comando `mkdir` digitando: + + ```bash + sudo mkdir -p /sys/fs/cgroup/exercise_group + ``` + +2. Elenca i file e le directory sotto la struttura /sys/fs/cgroup/exercise_group. Digitare: + + ```bash + sudo ls /sys/fs/cgroup/exercise_group/ + ``` + + L'output mostra i file e le directory creati automaticamente dal sottosistema `cgroup` per gestire e monitorare le risorse del `cgroup`. + +#### Per impostare un nuovo limite di risorse di memoria + +1. Impostare un limite di risorse di memoria per limitare l'uso della memoria a 4096 byte (4kB). Per limitare i processi nel `cgroup` affinché utilizzino un massimo di 4 kB di memoria, digitare: + + ```bash + echo 4096 | sudo tee /sys/fs/cgroup/exercise_group/memory.max + ``` + +2. Confermare l'impostazione del limite di memoria. Digitare: + + ```bash + cat /sys/fs/cgroup/exercise_group/memory.max + ``` + +#### Per creare lo script di test memory_stress + +1. Creare un semplice script eseguibile usando il comando `dd` per testare il limite delle risorse di memoria. Digitare: + + ```bash + cat > ~/memory_stress.sh << EOF + #!/bin/bash + dd if=/dev/zero of=/tmp/stress_test bs=10M count=2000 + EOF + chmod +x ~/memory_stress.sh + ``` + +#### Per eseguire e aggiungere processi/script alla memoria `cgroup` + +1. Avviare lo script `memory_stress.sh`, catturare il suo PID e aggiungere il PID a `cgroup.procs`. Digitare: + + ```bash + ~/memory_stress.sh & + echo $! | sudo tee /sys/fs/cgroup/exercise_group/cgroup.procs + ``` + + Utilizzare il file /sys/fs/cgroup/exercise_group/cgroup.procs per aggiungere o visualizzare i PID (Process ID) dei processi che sono membri di un determinato `cgroup`. La scrittura di un PID in questo file assegna il processo di script `memory_stress.sh` al `cgroup`. + +2. Il comando precedente terminerà molto rapidamente prima del completamento, perché ha superato i limiti di memoria di `cgroup`. È possibile eseguire il seguente comando `journalctl` in un altro terminale per visualizzare l'errore mentre si verifica. Digitare: + + ```bash + journalctl -xe -f | grep -i memory + ``` + + !!! tip "Suggerimento" + + ```` + È possibile utilizzare rapidamente il comando ps per verificare l'utilizzo approssimativo della memoria di un processo se si conosce il PID del processo in esecuzione: + + ```bash + pidof | xargs ps -o pid,comm,rss + ``` + + Questo output dovrebbe mostrare il Resident Set Size (RSS) in KB, che indica la memoria utilizzata dal processo specificato in un determinato momento. Ogni volta che il valore RSS di un processo supera il limite di memoria specificato nel valore memory.max di `cgroup`, il processo può essere soggetto alle politiche di gestione della memoria applicate dal kernel o dallo stesso `cgroup`. A seconda della configurazione del sistema, il sistema può intraprendere azioni quali la limitazione dell'uso della memoria del processo, l'arresto del processo o l'attivazione di un evento OOM (Out-of-Memory). + ```` + +#### Per impostare un nuovo limite di risorse della CPU + +1. Limitare l'uso dello script solo al 10% di un core della CPU. Digitare: + + ```bash + echo 10000 | sudo tee /sys/fs/cgroup/exercise_group/cpu.max + ``` + + 10000 rappresenta il limite di larghezza di banda della CPU. È impostato sul 10% della capacità totale di un singolo core della CPU. + +2. Confermare che è stato impostato il limite della CPU. Digitare: + + ```bash + cat /sys/fs/cgroup/exercise_group/cpu.max + ``` + +#### Per creare lo script del test di stress della CPU + +1. Creare e impostare le autorizzazioni di esecuzione per uno script che genera un elevato utilizzo della CPU. Digitare: + + ```bash + cat > ~/cpu_stress.sh << EOF + #!/bin/bash + exec yes > /dev/null + EOF + chmod +x ~/cpu_stress.sh + ``` + + !!! note "Nota" + + ``` + `yes > /dev/null` è un comando semplice che genera un elevato carico di CPU. + ``` + +#### Per eseguire e aggiungere un processo/script al `cgroup` della CPU + +1. Eseguire lo script e aggiungere contemporaneamente il suo PID al `cgroup`, digitando: + + ```bash + ~/cpu_stress.sh & + echo $! | sudo tee /sys/fs/cgroup/exercise_group/cgroup.procs + ``` + +#### Per confermare il controllo dell'utilizzo della CPU del processo + +1. Controllare l'utilizzo della CPU del processo. + + ```bash + pidof yes | xargs top -b -n 1 -p + ``` + + L'output dovrebbe mostrare l'utilizzo della CPU in tempo reale del processo yes. La %CPU per yes dovrebbe essere limitata in base alla configurazione di `cgroup` (ad esempio, circa il 10% se il limite è impostato a 10000). + +2. Impostate e sperimentate altri valori per cpu.max per il gruppo di esercizio `cgroup` e poi osservate l'effetto ogni volta che rieseguite lo script ~/cpu_stress.sh nel gruppo di controllo. + +#### Per identificare e selezionare il dispositivo di archiviazione primario + +Il dispositivo di archiviazione primario può essere un obiettivo per impostare i limiti delle risorse di I/O. I dispositivi di archiviazione sui sistemi Linux hanno numeri di dispositivo maggiori e minori che possono essere utilizzati per identificarli in modo univoco. + +1. Per prima cosa, creare una serie di variabili ausiliarie per rilevare e memorizzare il numero di dispositivo del dispositivo di archiviazione primario sul server. Digitare: + + ```bash + primary_device=$(lsblk | grep disk | awk '{print $1}' | head -n 1) + primary_device_num=$(ls -l /dev/$primary_device | awk '{print $5, $6}' | sed 's/,/:/') + ``` + +2. Visualizzare il valore della variabile `$primary_device_num`. Digitare: + + ```bash + echo "Primary Storage Device Number: $primary_device_num" + ``` + +3. I numeri di dispositivo maggiore e minore dovrebbero corrispondere a quelli visualizzati nell'output di ls: + + ```bash + ls -l /dev/$primary_device + ``` + +#### Per impostare un nuovo limite di risorse di I/O + +1. Impostare le operazioni di I/O a 1 MB/s per i processi di lettura e scrittura sotto il gruppo di esercizio `cgroup`. Digitare: + + ```bash + echo "$primary_device_num rbps=1048576 wbps=1048576" | \ + sudo tee /sys/fs/cgroup/exercise_group/io.max + ``` + +2. Confermare i limiti di I/O impostati. Digitare: + + ```bash + cat /sys/fs/cgroup/exercise_group/io.max + ``` + +#### Per creare il processo di stress test I/O + +1. Avviare un processo `dd` per creare un file di grandi dimensioni chiamato `/tmp/io_stress`. Inoltre, catturare e memorizzare il PID del processo `dd` in una variabile chiamata `MYPID`. Digitare: + + ```bash + dd if=/dev/zero of=/tmp/io_stress bs=10M count=500 oflag=dsync \ + & export MYPID=$! + ``` + +#### Per aggiungere un processo/script al `cgroup` di I/O + +1. Aggiungere il PID del processo `dd` precedente al controllo `cgroup` di exercise_group. Digitare: + + ```bash + echo $MYPID | sudo tee /sys/fs/cgroup/exercise_group/cgroup.procs + ``` + +#### Per confermare il controllo delle risorse di utilizzo dell'I/O del processo + +1. Controllare l'utilizzo dell'I/O del processo eseguendo: + + ```bash + iotop -p $MYPID + ``` + + L'output mostrerà la velocità di I/O in lettura/scrittura del processo io_stress.sh, che non dovrebbe superare 1 MB/s come da limite. + +#### Eliminazione di `cgroups` + +1. Digitare i seguenti comandi per terminare qualsiasi processo in background, eliminare il `cgroup` non più necessario e rimuovere il file /tmp/io_stress. + + ```bash + kill %1 + sudo rmdir /sys/fs/cgroup/exercise_group/ + sudo rm -rf /tmp/io_stress + ``` + +## Esercizio 8 + +### `taskset` + +L'affinità della CPU associa processi o thread specifici a particolari core della CPU in un sistema multi-core. Questo esercizio dimostra l'uso di `taskset` per impostare o recuperare l'affinità della CPU di un processo in Linux. + +### Esplorazione dell'affinità della CPU con `taskset` + +1. Utilizzare `lscpu` per elencare le CPU disponibili sul sistema. Digitare: + + ```bash + lscpu | grep "On-line" + ``` + +2. Creare un processo campione utilizzando l'utilità `dd` e memorizzare il suo PID in una variabile `MYPID`. Digitare: + + ```bash + dd if=/dev/zero of=/dev/null & export MYPID="$!" + echo $MYPID + ``` + +3. Recupera l'affinità corrente per il processo `dd`. Digitare: + + ```bash + taskset -p $MYPID + ``` + + OUTPUT: + + ```bash + pid 1211483's current affinity mask: f + ``` + + L'output mostra la maschera di affinità della CPU del processo con PID 1211483 (`$MYPID`), rappresentata in formato esadecimale. Nel nostro sistema campione, la maschera di affinità visualizzata è "f", che in genere significa che il processo può essere eseguito su qualsiasi core della CPU. + + !!! note "Nota" + + ``` + La maschera di affinità della CPU "f" rappresenta una configurazione in cui tutti i core della CPU sono abilitati. In notazione esadecimale, "f" corrisponde al valore binario "1111". Ogni bit nella rappresentazione binaria corrisponde a un core della CPU, con "1" che indica che il core è abilitato e disponibile per l'esecuzione del processo. + + Pertanto, su una CPU a quattro core, con la maschera "f": + + Core 0: Enabled + Core 1: Enabled + Core 2: Enabled + Core 3: Enabled + ``` + +### Impostazione/modifica dell'affinità della CPU + +1. Imposta l'affinità della CPU del processo `dd` su una sola CPU (CPU 0). Digitare: + + ```bash + taskset -p 0x1 $MYPID + ``` + + OUTPUT + + ```bash + pid 1211483's current affinity mask: f + pid 1211483's new affinity mask: 1 + ``` + +2. Verificate la modifica eseguendo il seguente comando: + + ```bash + taskset -p $MYPID + ``` + + L'output indica la maschera di affinità della CPU del processo con PID `$MYPID`. La maschera di affinità è "1" in decimale, che si traduce in "1" in binario. Ciò significa che il processo è attualmente legato al core 0 della CPU. + +3. Ora, impostare l'affinità della CPU del processo `dd` su più CPU (CPU 0 e 1). Digitare: + + ```bash + taskset -p 0x3 $MYPID + ``` + +4. Eseguire il comando `tasksel` corretto per verificare l'ultima modifica. + + ```bash + taskset -p $MYPID + ``` + + Sul nostro server demo a 4 core, l'output mostra che la maschera di affinità della CPU del processo è "3" (in decimale). Ciò si traduce in "11" in binario. + + !!! tip "Suggerimento" + + ``` + Il "3" decimale corrisponde a "11" (o 0011) in binario. + Ogni cifra binaria corrisponde a un core della CPU: core 0, core 1, core 2, core 3 (da destra a sinistra). + La cifra "1" nella quarta e terza posizione (da destra) indica che il processo può essere eseguito sui core 0 e 1. + Pertanto, "3" indica che il processo è legato ai core 0 e 1 della CPU. + ``` + +5. Lanciate l'utilità `top` o `htop` in un terminale separato e osservate se vedete qualcosa di interessante mentre sperimentate diverse configurazioni di `taskset` per un processo. + +6. Tutto fatto. Utilizzare il suo PID (`$MYPID`) per uccidere il processo `dd`. + +## Esercizio 9 + +### `systemd-run` + +Il comando `systemd-run` crea e avvia unità di servizio transitorie per comandi o processi in esecuzione. Può anche eseguire programmi in unità di scopo transitorie, unità di servizio con percorso, socket o timer. + +Questo esercizio mostra come usare `systemd-run` per creare unità di servizio transitorie in `systemd`. + +#### Esecuzione di un comando come servizio transitorio + +1. Eseguire il semplice comando sleep 300 come servizio transitorio `systemd` usando `systemd-run`. Digitare: + + ```bash + systemd-run --unit=mytransient.service --description="Example Service" sleep 300 + ``` + +2. Controllare lo stato del servizio transitorio usando `systemctl status`. Digitare: + + ```bash + systemctl status mytransient.service + ``` + +#### Impostazione di un limite di risorse di memoria per un servizio transitorio + +1. Usare il parametro `--property` con `systemd-run` per limitare l'uso massimo della memoria per il processo transitorio a 200M. Digitare: + + ```bash + systemd-run --unit=mylimited.service --property=MemoryMax=200M sleep 300 + ``` + +2. Cercare il processo nel file system `cgroup` corrispondente per verificare l'impostazione. Digitare: + + ```bash + sudo cat /sys/fs/cgroup/system.slice/mytransient.service/memory.max + ``` + + !!! tip "Suggerimento" + + ``` + `systemd.resource-control` è un'entità di configurazione o di gestione (concetto) all'interno del framework `systemd`, progettata per controllare e allocare le risorse del sistema ai processi e ai servizi. E `systemd.exec` è un componente di `systemd` responsabile della definizione dell'ambiente di esecuzione in cui vengono eseguiti i comandi. Per visualizzare le varie impostazioni (proprietà) che si possono modificare quando si usa `systemd-run`, consultare le pagine di manuale di `systemd.resource-control` e `systemd.exec`. Qui si trova la documentazione delle proprietà come MemoryMax, CPUAccounting, IOWeight, ecc. + ``` + +#### Impostazione del limite delle risorse della CPU per un servizio transitorio + +1. Creare un'unità transitoria `systemd` chiamata "myrealtime.service". Eseguire `myrealtime.service` con una specifica politica di schedulazione round robin (rr) e priorità. Digitare: + + ```bash + systemd-run --unit=myrealtime.service \ + --property=CPUSchedulingPolicy=rr --property=CPUSchedulingPriority=50 sleep 300 + ``` + +2. Visualizzare lo stato di `myrealtime.service`. Inoltre, catturare/memorizzare il PID principale [sleep] in una variabile MYPID. Digitare: + + ```bash + MYPID=$(systemctl status myrealtime.service | awk '/Main PID/ {print $3}') + ``` + +3. Verificare la politica di programmazione della CPU mentre il servizio è ancora in esecuzione. Digitare: + + ```bash + chrt -p $MYPID + pid 2553792's current scheduling policy: SCHED_RR + pid 2553792's current scheduling priority: 50 + ``` + +### Creazione di una unità timer transitoria + +1. Creare una semplice unità timer che esegua un semplice comando di eco. L'opzione `--on-active=2m` imposta l'attivazione del timer 2 minuti dopo l'attivazione dell'unità timer. Digitare: + + ```bash + systemd-run --on-active=2m --unit=mytimer.timer \ + --description="Example Timer" echo "Timer triggered" + ``` + + Il timer inizia il conto alla rovescia dal momento in cui l'unità viene attivata e, dopo 2 minuti, attiva l'azione specificata. + +2. Visualizza i dettagli/stato dell'unità timer appena creata. Digitare: + + ```bash + systemctl status mytimer.timer + ``` + +#### Arresto e pulizia delle unità transitorie di `systemd` + +1. Digitare i seguenti comandi per assicurarsi che i vari servizi/processi transitori avviati per questa esercitazione siano correttamente arrestati e rimossi dal sistema. Digitare: + + ```bash + systemctl stop mytransient.service + systemctl stop mylimited.service + systemctl stop myrealtime.service + systemctl stop mytimer.timer + ``` + +## Esercizio 10 + +### `schedtool` + +Questo esercizio dimostra l'uso di `schedtool` per comprendere e manipolare la schedulazione dei processi in Rocky Linux. A tal fine, si creerà anche uno script per simulare un processo. + +#### Installazione di `schedtool` + +1. Installare l'applicazione `schedtool` se non è installata sul server. Digitare: + + ```bash + sudo dnf -y install schedtool + ``` + +#### Creazione di uno script di processo simulato + +1. Creare uno script che generi il carico della CPU a scopo di test. Digitare: + + ```bash + cat > ~/cpu_load_generator.sh << EOF + #!/bin/bash + while true; do + openssl speed > /dev/null 2>&1 + openssl speed > /dev/null 2>&1 + + done + EOF + chmod +x ~/cpu_load_generator.sh + ``` + +2. Avviare lo script in background. Digitare: + + ```bash + ~/cpu_load_generator.sh & echo $! + ``` + +3. Acquisire il PID del processo principale `openssl` avviato all'interno dello script `cpu_load_generator.sh`. Memorizzare il PID in una variabile denominata `$MYPID`. Digitare: + + ```bash + export MYPID=$(pidof openssl) ; echo $MYPID + ``` + +#### Utilizzo di `schedtool` per controllare la politica di schedulazione corrente + +1. Usare il comando `schedtool` per visualizzare le informazioni di pianificazione del processo con PID `$MYPID`. Digitare: + + ```bash + schedtool $MYPID + ``` + + OUTPUT: + + ```bash + PID 2565081: PRIO 0, POLICY N: SCHED_NORMAL , NICE 0, AFFINITY 0xf + ``` + +#### Utilizzo di `schedtool` per modificare la politica di scheduling + +1. Modificare la politica di schedulazione e la priorità dei processi FIFO e 10, rispettivamente. Digitare: + + ```bash + sudo schedtool -F -p 10 $! + ``` + +2. Visualizzare l'effetto delle modifiche. Digitare: + + ```bash + schedtool $MYPID + ``` + +3. Modificare la politica di schedulazione e la priorità del processo in round robin o SCHED_RR (RR) e 50, rispettivamente. Digitare: + + ```bash + sudo schedtool -R -p 50 $MYPID + ``` + +4. Visualizzare l'effetto delle modifiche. Digitare: + + ```bash + schedtool $MYPID + ``` + +5. Modificare la politica di pianificazione del processo in Idle o SCHED_IDLEPRIO (D). Digitare: + + ```bash + sudo schedtool -D $MYPID + ``` + +6. Visualizzare l'effetto delle modifiche. + +7. Infine, ripristinare la politica di schedulazione del processo al valore predefinito originale SCHED_NORMAL (N o altro). Digitare: + + ```bash + sudo schedtool -N $MYPID + ``` + +#### Arresto e puliza del processo `cpu_load_generator.sh` + +1. Tutto fatto. Terminare lo script e cancellare lo script `cpu_load_generator.sh`. + + ```bash + kill $MYPID + rm ~/cpu_load_generator.sh + ``` diff --git a/docs/labs/systems_administration_II/lab6-the_file_system.it.md b/docs/labs/systems_administration_II/lab6-the_file_system.it.md index 1a4aca7d31..29afb607b5 100644 --- a/docs/labs/systems_administration_II/lab6-the_file_system.it.md +++ b/docs/labs/systems_administration_II/lab6-the_file_system.it.md @@ -341,7 +341,7 @@ Si utilizzerà l'utilità `fdisk` Il risultato potrebbe essere diverso se si dispone di un disco di dimensioni diverse o se non si è seguito lo schema di partizionamento utilizzato durante l'installazione del sistema operativo. -#### Per creare un dispositivo di blocco [fake] +#### Creazione di un dispositivo di blocco [fake] Non vogliamo che il disco rigido locale del sistema venga accidentalmente alterato e reso inutilizzabile, quindi completeremo i seguenti esercizi su uno pseudo-dispositivo che si comporta come un vero e proprio dispositivo a blocchi. Per farlo, si crea un file [sparse] di dimensioni adeguate e lo si associa a uno pseudo-dispositivo. Nei sistemi Linux, questi pseudo-dispositivi sono chiamati dispositivi di loop. Un dispositivo di loop è uno pseudo-dispositivo che consente di trattare [e accedere] a un normale file di dati come se fosse un dispositivo a blocchi. From 3e9b6a651276f14ff22774731b909538cdc13057 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Tue, 5 Aug 2025 17:52:17 -0400 Subject: [PATCH 096/164] New Crowdin updates (#2819) * New translations setup_local_repo.md (German) * New translations nosleep.md (German) * New translations nload.md (German) --- docs/gemstones/network/nload.de.md | 86 +++++++++++++++++++++++++++ docs/gemstones/scripts/NoSleep.de.md | 38 ++++++++++++ docs/gemstones/setup_local_repo.de.md | 51 ++++++++++++++++ 3 files changed, 175 insertions(+) create mode 100644 docs/gemstones/network/nload.de.md create mode 100644 docs/gemstones/scripts/NoSleep.de.md create mode 100644 docs/gemstones/setup_local_repo.de.md diff --git a/docs/gemstones/network/nload.de.md b/docs/gemstones/network/nload.de.md new file mode 100644 index 0000000000..84ff6e7239 --- /dev/null +++ b/docs/gemstones/network/nload.de.md @@ -0,0 +1,86 @@ +--- +title: nload – Bandbreitenstatistik +author: Neel Chauhan +contributors: Steven Spencer, Ganna Zhyrnova +date: 2024-01-16 +--- + +# `nload` - Einleitung + +`nload` ist ein textkonsolenbasierter Netzwerk-Traffic-Monitor. Es zeigt die Traffics- und Bandbreiten-Statistiken Ihres Servers. + +## `nload`-Verwendung + +```bash +dnf -y install epel-release +dnf -y install nload +``` + +Im Folgenden finden Sie allgemeine Optionen für den Befehl `nload`, die unter normalen Umständen keine weiteren Schritte erfordern. Die Optionen stehen vor der zu überwachenden Schnittstelle: + +| Optionen | Beschreibung | +| ----------- | ------------------------------------------------------------------------------------------------------- | +| -a PERIOD | Dauer des Berechnungszeitfensters in Sekunden (Standard: 300) | +| -m | Zeigt mehrere Geräte an und zeigt kein Traffic-Diagramm | +| -t INTERVAL | Aktualisierungsintervall in Millisekunden (Standard: 500) | +| -u UNIT | Einbuchstaben-Einheit zur Anzeige der Bandbreite (Standard: k) | +| -U UNIT | Einbuchstaben-Einheit zur Anzeige der Datenübertragung (Standard: M) | + +Die Einheiten für diese letzten beiden Optionen sind wie folgt: + +| Einheit | Bedeutung | +| ------- | --------- | +| b | bit | +| B | Byte | +| k | Kilobit | +| K | Kilobyte | +| m | Megabit | +| M | Megabyte | +| g | Gigabit | +| G | Gigabyte | + +Ein Beispiel für die Ausgabe vom Heimserver des Autors, auf dem ein [Tor](https://www.torproject.org/) [Relay](https://community.torproject.org/relay/types-of-relays/)-Programm ausgeführt wird: + +```bash +Device bridge0 [172.20.0.3] (1/8): +================================================================================ +Incoming: + ######## + ######## + ######## + ######## + ######## + ######## Curr: 79.13 MBit/s + ######## Avg: 84.99 MBit/s + ######## Min: 79.13 MBit/s + ######## Max: 87.81 MBit/s + ######## Ttl: 1732.95 GByte +Outgoing: + ######## + ######## + ######## + ######## + ######## + ######## Curr: 81.30 MBit/s + ######## Avg: 88.05 MBit/s + ######## Min: 81.30 MBit/s + ######## Max: 91.36 MBit/s + ######## Ttl: 1790.74 GByte +``` + +Aufschlüsselung der obigen Zeilen: + +- Curr - aktuell gemessene Bandbreitennutzung +- Avg – durchschnittliche Bandbreitennutzung im Zeitraum +- Min - minimale gemessene Bandbreitennutzung +- Max – maximal gemessene Bandbreitennutzung +- Ttl – in der `nload`-Sitzung übertragene Daten + +## Tastaturkürzel + +- \++page-down++, ++down++ – Eine Schnittstelle nach unten gehen +- \++page-up++, ++up++ – Eine Schnittstelle nach oben gehen +- \++f2++ – Zeigt das Optionsfenster an +- \++f5++ - Optionen speichern +- \++f6++ – Einstellungen aus der Konfigurationsdatei neu laden +- \++q++, ++Strg+C++ – `nload` beenden diff --git a/docs/gemstones/scripts/NoSleep.de.md b/docs/gemstones/scripts/NoSleep.de.md new file mode 100644 index 0000000000..3d38f74aa8 --- /dev/null +++ b/docs/gemstones/scripts/NoSleep.de.md @@ -0,0 +1,38 @@ +--- +title: NoSleep.sh – Ein einfaches Konfigurationsskript +author: Andrew Thiesen +tags: + - Konfiguration + - Server + - Workstation +--- + +# NoSleep.sh + +## Bash Script editieren `/etc/systemd/logind.conf` + +Dieses Bash-Skript dient zum Ändern der Konfigurationsdatei `/etc/systemd/logind.conf` auf einem Rocky Linux-Server oder einer Rocky Linux-Workstation. Insbesondere ändert es die Option `HandleLidSwitch` und setzt sie auf `ignore`. Diese Konfigurationsänderung wird häufig verwendet, um zu verhindern, dass das System in den Ruhezustand versetzt wird oder eine Aktion ausführt, wenn der Laptopdeckel geschlossen ist. + +### Verwendung + +Um das Skript zu verwenden, führen Sie die folgenden Schritte aus: + +1. Öffnen Sie ein Terminal auf Ihrem Linux-System. +2. `cd` in Ihr bevorzugtes Verzeichnis. +3. Laden Sie das Skript NoSleep.sh über `curl` herunter: `curl -O https://github.com/andrewthiesen/NoSleep.sh/blob/main/NoSleep.sh` +4. Machen Sie das NoSleep-Skript ausführbar, indem Sie den Befehl `chmod +x NoSleep.sh` ausführen. +5. Führen Sie das Skript als Root mit dem Befehl `sudo ./NoSleep.sh` aus. +6. Das Skript aktualisiert die Option `HandleLidSwitch` in der Datei `logind.conf` auf `ignore`. +7. Optional werden Sie aufgefordert, das System neu zu starten, damit die Änderungen endgültig wirksam werden. + +### Wichtige Hinweise + +* Dieses Skript **muss** als Root oder mit Superuser-Berechtigungen ausgeführt werden, um Systemdateien zu ändern. +* Es wird davon ausgegangen, dass sich die Datei `logind.conf` unter `/etc/systemd/logind.conf` befindet. Wenn Ihr System einen anderen Speicherort verwendet, ändern Sie das Skript bitte entsprechend. +* Das Ändern von Systemkonfigurationsdateien kann unbeabsichtigte Folgen haben. Bitte überprüfen Sie die vom Skript vorgenommenen Änderungen und stellen Sie sicher, dass sie Ihren Anforderungen entsprechen. +* Es wird empfohlen, vor der Ausführung des Skripts entsprechende Vorsichtsmaßnahmen zu treffen, z. B. eine Sicherungskopie der ursprünglichen Konfigurationsdatei zu erstellen. +* Ein Neustart Ihres Systems ist optional, kann aber sicherstellen, dass die Änderungen sofort wirksam werden. Nach der Ausführung des Skripts werden Sie zum Neustart aufgefordert. + +--- + +Sie können das Skript gerne Ihren Anforderungen entsprechend anpassen und verwenden. Stellen Sie sicher, dass Sie das Skript und seine Auswirkungen verstehen, bevor Sie es auf Ihrem System ausführen. diff --git a/docs/gemstones/setup_local_repo.de.md b/docs/gemstones/setup_local_repo.de.md new file mode 100644 index 0000000000..65c0fd6c37 --- /dev/null +++ b/docs/gemstones/setup_local_repo.de.md @@ -0,0 +1,51 @@ +--- +title: Lokale Rocky-Repositories einrichten +author: codedude +contributors: Steven Spencer +update: 09-Dec-2021 +--- + +# Einleitung + +Manchmal müssen Sie Rocky Repositories lokal einrichten, um virtuelle Maschinen, Laborumgebungen usw. zu erstellen. Es kann auch helfen, Bandbreite zu sparen, wenn das ein Anliegen ist. Dieser Artikel wird Sie mit `rsync` begleiten, um Rocky Repositories auf einen lokalen Webserver zu kopieren. Der Aufbau eines Webservers geht über den Rahmen dieses kurzen Artikels hinaus. + +## Voraussetzung + +* Ein Webserver + +## Code + +```bash +#!/bin/bash +repos_base_dir="/web/path" + +# Start sync if base repo directory exist +if [[ -d "$repos_base_dir" ]] ; then + # Start Sync + rsync -avSHP --progress --delete --exclude-from=/opt/scripts/excludes.txt rsync://ord.mirror.rackspace.com/rocky "$repos_base_dir" --delete-excluded + # Download Rocky 8 repository key + if [[ -e /web/path/RPM-GPG-KEY-rockyofficial ]]; then + exit + else + wget -P $repos_base_dir https://dl.rockylinux.org/pub/rocky/RPM-GPG-KEY-rockyofficial + fi +fi +``` + +## Breakdown + +Dieses einfache Shell-Skript verwendet `rsync`, um die Repository-Dateien vom nächstgelegenen Spiegel abzurufen. Es nutzt auch die `exclude`-Option, die in einer Textdatei in Form von Schlüsselwörtern definiert ist, die nicht enthalten sein sollten. `Excludes` sind nützlich, wenn Sie nur begrenzten Speicherplatz haben oder wenn Sie aus irgendeinem Grund nicht alles möchten. Sie können `*` als Platzhalter verwenden. Seien Sie vorsichtig bei der Verwendung von `*/ng`, da dadurch alles ausgeschlossen wird, was diesen Zeichen entspricht. Hier ein Beispiel: + +```bash +*/source* +*/debug* +*/images* +*/Devel* +8/* +8.4-RC1/* +8.4-RC1 +``` + +## Zusammenfassung + +Ein einfaches Skript, das dazu beitragen sollte, Bandbreite zu sparen oder das Erstellen einer Laborumgebung ein wenig zu vereinfachen. From 2ef9ce6f7a27e0ffb13ee6609e8438a21e70ab0a Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Thu, 7 Aug 2025 10:28:36 -0500 Subject: [PATCH 097/164] edit `05-vi.md` (#2822) * fix case of command letters to lower-case --- docs/books/admin_guide/05-vi.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/books/admin_guide/05-vi.md b/docs/books/admin_guide/05-vi.md index aeed3e36ae..aec9b35ba5 100644 --- a/docs/books/admin_guide/05-vi.md +++ b/docs/books/admin_guide/05-vi.md @@ -296,7 +296,7 @@ These operations are done in *command* mode. * Replace one word: -++c+w+"word"+escape++ +++"c"+"w"+"word"+escape++ !!! Tip From d07fe2683d202e8e1854bc57882d58c2bdec0b88 Mon Sep 17 00:00:00 2001 From: Neil Hanlon Date: Sat, 9 Aug 2025 18:54:34 -0400 Subject: [PATCH 098/164] use new deploy --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 0ba3bb6726..81fc18dca8 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -15,4 +15,4 @@ jobs: with: token: ${{ secrets.CROSS_REPO_PAT }} repository: rocky-linux/docs.rockylinux.org - event-type: deploy + event-type: deploy-staging From a7def61fcc02e26c0e04096d75c6ae19ff871097 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 10 Aug 2025 18:10:34 -0500 Subject: [PATCH 099/164] add bps86 as a contributor for content (#2824) * update README.md [skip ci] * update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 15 ++++++++------- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index c2c0201631..094a4c9e47 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1070,6 +1070,15 @@ "contributions": [ "content" ] + }, + { + "login": "bps86", + "name": "Bayu Putra S", + "avatar_url": "https://avatars.githubusercontent.com/u/59677031?v=4", + "profile": "https://github.com/bps86", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index fe38724286..dccca1078f 100644 --- a/README.md +++ b/README.md @@ -288,68 +288,69 @@ Welcome aboard! Meet the rest of our awesome contributors below: ([emoji key](ht
    alikates
    alikates

    🖋 hopnux
    hopnux

    🌍 Pedro Garcia Rodriguez
    Pedro Garcia Rodriguez

    🌍 + Lau
    Lau

    🖋 - Lau
    Lau

    🖋 Serge Croisé
    Serge Croisé

    🖋 bamtests
    bamtests

    🖋 jahway603
    jahway603

    🖋 Nejc Bertoncelj
    Nejc Bertoncelj

    🖋 Dan Baker
    Dan Baker

    🖋 Laura Hild
    Laura Hild

    🖋 + Grammaresque
    Grammaresque

    🖋 - Grammaresque
    Grammaresque

    🖋 Rawk Akani
    Rawk Akani

    🖋 nm583
    nm583

    🖋 MrPaulAR
    MrPaulAR

    🖋 cybernet
    cybernet

    🖋 Jan Kytka
    Jan Kytka

    🖋 Mario
    Mario

    🖋 + Ganna Zhyrnova
    Ganna Zhyrnova

    🌍 - Ganna Zhyrnova
    Ganna Zhyrnova

    🌍 Travis W
    Travis W

    🖋 Tej Singh Rana
    Tej Singh Rana

    🖋 Aditya Roshan Dash
    Aditya Roshan Dash

    🖋 Matt
    Matt

    🖋 zdover23
    zdover23

    🖋 Mani Yadla
    Mani Yadla

    🖋 + Dave_Barnabas
    Dave_Barnabas

    🖋 - Dave_Barnabas
    Dave_Barnabas

    🖋 Neel Chauhan
    Neel Chauhan

    🖋 Joey
    Joey

    🖋 Emre Çamalan
    Emre Çamalan

    🖋 Yash Pandey
    Yash Pandey

    🖋 Stephen Simpson
    Stephen Simpson

    🖋 Srinivas Nishant Viswanadha
    Srinivas Nishant Viswanadha

    🖋 + Stein Arne Storslett
    Stein Arne Storslett

    🖋 - Stein Arne Storslett
    Stein Arne Storslett

    🖋 Chris Pepper
    Chris Pepper

    🖋 Sasheeny Hubbard
    Sasheeny Hubbard

    🖋 Christian Steinert
    Christian Steinert

    🖋 hs303
    hs303

    🖋 MarlonJMejia
    MarlonJMejia

    🖋 Atroskelis
    Atroskelis

    🖋 + Christine Belzie
    Christine Belzie

    🖋 - Christine Belzie
    Christine Belzie

    🖋 cyril
    cyril

    🖋 Andreas Singraber
    Andreas Singraber

    🖋 Andrew Scott
    Andrew Scott

    🖋 CracktheDom
    CracktheDom

    🖋 Alex Zolotarov
    Alex Zolotarov

    🖋 Petr Budai
    Petr Budai

    🖋 + Howard
    Howard

    🖋 - Howard
    Howard

    🖋 rjys365
    rjys365

    🖋 David Gomez
    David Gomez

    🖋 Jamil Halabi
    Jamil Halabi

    🖋 huangsen365
    huangsen365

    🖋 npezzotti
    npezzotti

    🖋 + Bayu Putra S
    Bayu Putra S

    🖋 From 9e2f8289719f09e11374b9bb8c2659aa092a1191 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Sun, 10 Aug 2025 19:11:05 -0400 Subject: [PATCH 100/164] New Crowdin updates (#2820) * New translations lab5-kubernetes-configuration-files.md (Italian) * New translations lab7-bootstrapping-etcd.md (Italian) * New translations lab8-bootstrapping-kubernetes-controllers.md (Italian) * New translations lab6-data-encryption-keys.md (German) * New translations lab6-data-encryption-keys.md (Italian) * New translations lab9-bootstrapping-kubernetes-workers.md (Italian) * New translations lab11-pod-network-routes.md (Italian) * New translations lab12-smoke-test.md (Italian) * New translations lab13-cleanup.md (Italian) * New translations 05-vi.md (French) * New translations 05-vi.md (Italian) * New translations lab3-system_utilities.md (Italian) * New translations 08-process.md (Chinese Simplified) * New translations 09-backups.md (Chinese Simplified) * New translations 11-tasks.md (Chinese Simplified) * New translations 06-users.md (Chinese Simplified) * New translations 03-commands.md (Chinese Simplified) * New translations 07-file-systems.md (Chinese Simplified) * New translations 10_0.md (Chinese Simplified) * New translations 05-vi.md (Chinese Simplified) * New translations lab5-networking.md (Italian) * New translations 05-vi.md (German) * New translations lab6-user_and_group_management.md (Italian) * New translations 04-advanced-commands.md (German) * New translations 05-vi.md (German) * New translations 05-vi.md (German) * New translations 01-presentation.md (German) * New translations 02-advanced.md (German) * New translations index.md (German) * New translations 08-process.md (Ukrainian) * New translations 09-backups.md (Ukrainian) * New translations 10-boot.md (Ukrainian) * New translations 11-tasks.md (Ukrainian) * New translations 12-network.md (Ukrainian) * New translations 13-softwares.md (Ukrainian) * New translations 00-toc.md (Ukrainian) * New translations 01-install.md (Ukrainian) * New translations 08-process.md (German) * New translations 00-toc.md (German) * New translations 05-deployments.md (German) * New translations 05-vi.md (Ukrainian) * New translations 01-basic.md (Ukrainian) * New translations 03-working-with-files.md (Ukrainian) * New translations 04-ansible-galaxy.md (Ukrainian) * New translations 05-deployments.md (Ukrainian) * New translations 06-large-scale-infrastructure.md (Ukrainian) * New translations 00-toc.md (Ukrainian) * New translations 01-first-script.md (Ukrainian) * New translations 02-using-variables.md (Ukrainian) * New translations 03-data-entry-and-manipulations.md (Ukrainian) * New translations 04-check-your-knowledge.md (Ukrainian) * New translations 05-tests.md (Ukrainian) * New translations 06-profiles.md (Ukrainian) * New translations 07-configurations.md (Ukrainian) * New translations 06-conditional-structures.md (Ukrainian) * New translations 02-gh_cli_edit_pr_title.md (German) --- docs/books/admin_guide/00-toc.de.md | 2 +- docs/books/admin_guide/01-presentation.de.md | 2 +- docs/books/admin_guide/03-commands.zh.md | 4 +- .../admin_guide/04-advanced-commands.de.md | 2 +- docs/books/admin_guide/05-vi.de.md | 12 +- docs/books/admin_guide/05-vi.fr.md | 2 +- docs/books/admin_guide/05-vi.it.md | 2 +- docs/books/admin_guide/05-vi.uk.md | 2 +- docs/books/admin_guide/05-vi.zh.md | 2 +- docs/books/admin_guide/06-users.zh.md | 12 +- docs/books/admin_guide/07-file-systems.zh.md | 22 +- docs/books/admin_guide/08-process.de.md | 16 +- docs/books/admin_guide/08-process.uk.md | 8 +- docs/books/admin_guide/08-process.zh.md | 6 +- docs/books/admin_guide/09-backups.uk.md | 34 +- docs/books/admin_guide/09-backups.zh.md | 42 +- docs/books/admin_guide/10-boot.uk.md | 2 +- docs/books/admin_guide/11-tasks.uk.md | 4 +- docs/books/admin_guide/11-tasks.zh.md | 4 +- docs/books/admin_guide/12-network.uk.md | 18 +- docs/books/admin_guide/13-softwares.uk.md | 2 +- docs/books/incus_server/00-toc.uk.md | 6 +- docs/books/incus_server/01-install.uk.md | 2 +- docs/books/incus_server/06-profiles.uk.md | 4 +- .../incus_server/07-configurations.uk.md | 2 +- docs/books/learning_ansible/01-basic.uk.md | 6 +- docs/books/learning_ansible/02-advanced.de.md | 2 +- .../03-working-with-files.uk.md | 2 +- .../learning_ansible/04-ansible-galaxy.uk.md | 20 +- .../learning_ansible/05-deployments.de.md | 6 +- .../learning_ansible/05-deployments.uk.md | 4 +- .../06-large-scale-infrastructure.uk.md | 2 +- docs/books/learning_bash/00-toc.uk.md | 2 +- .../books/learning_bash/01-first-script.uk.md | 4 +- .../learning_bash/02-using-variables.uk.md | 2 +- .../03-data-entry-and-manipulations.uk.md | 12 +- .../04-check-your-knowledge.uk.md | 2 +- docs/books/learning_bash/05-tests.uk.md | 6 +- .../06-conditional-structures.uk.md | 4 +- .../git/02-gh_cli_edit_pr_title.de.md | 52 + docs/index.de.md | 2 +- .../lab11-pod-network-routes.it.md | 94 ++ .../lab12-smoke-test.it.md | 206 ++++ .../lab13-cleanup.it.md | 24 + .../lab5-kubernetes-configuration-files.it.md | 214 ++++ .../lab6-data-encryption-keys.de.md | 43 + .../lab6-data-encryption-keys.it.md | 43 + .../lab7-bootstrapping-etcd.it.md | 96 ++ ...bootstrapping-kubernetes-controllers.it.md | 187 ++++ ...ab9-bootstrapping-kubernetes-workers.it.md | 203 ++++ .../lab3-system_utilities.it.md | 983 ++++++++++++++++++ .../lab5-networking.it.md | 611 +++++++++++ .../lab6-user_and_group_management.it.md | 446 ++++++++ docs/release_notes/10_0.zh.md | 282 +++++ 54 files changed, 3629 insertions(+), 145 deletions(-) create mode 100644 docs/gemstones/git/02-gh_cli_edit_pr_title.de.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab11-pod-network-routes.it.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab12-smoke-test.it.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab13-cleanup.it.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab5-kubernetes-configuration-files.it.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab6-data-encryption-keys.de.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab6-data-encryption-keys.it.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab7-bootstrapping-etcd.it.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab8-bootstrapping-kubernetes-controllers.it.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab9-bootstrapping-kubernetes-workers.it.md create mode 100644 docs/labs/systems_administration_I/lab3-system_utilities.it.md create mode 100644 docs/labs/systems_administration_I/lab5-networking.it.md create mode 100644 docs/labs/systems_administration_I/lab6-user_and_group_management.it.md create mode 100644 docs/release_notes/10_0.zh.md diff --git a/docs/books/admin_guide/00-toc.de.md b/docs/books/admin_guide/00-toc.de.md index 356954a646..84fa40a831 100644 --- a/docs/books/admin_guide/00-toc.de.md +++ b/docs/books/admin_guide/00-toc.de.md @@ -12,7 +12,7 @@ Zunächst werden wir GNU/Linux, Distributionen und das gesamte Ökosystem rund u Wir werden uns dann die Benutzerbefehle ansehen, die für den Einstieg in GNU/Linux unerlässlich sind. Erfahrene Benutzer sollten das Kapitel über erweiterte Befehle besuchen. -Im nächsten Kapitel wird der vi-Editor behandelt. Während GNU/Linux mit vielen Editoren geliefert wird, ist der vi einer der leistungsstärksten. Einige Befehle verwenden manchmal eine identische Syntax wie der vi (`sed` sei erwähnt). Daher ist es sinnvoll, einiges über vi zu wissen oder zumindest seine wesentlichen Funktionen kennen zu lernen (wie man eine Datei öffnet, speichert, vi beendet oder ohne Speichern beendet). Bei regelmäßiger Verwendung von vi, kann sich der Benutzer nach und nach mit weiterenen Funktionen vertraut machen. Eine Alternative wäre die Verwendung von nano, das standardmäßig mit Rocky Linux installiert wird. Obwohl es nicht so vielseitig ist, ist es einfach zu bedienen, unkompliziert und erledigt die Arbeit. +Im nächsten Kapitel wird der VI-Editor behandelt. Während GNU/Linux mit vielen Editoren geliefert wird, ist der vi einer der leistungsstärksten. Einige Befehle verwenden manchmal eine identische Syntax wie der vi (`sed` sei erwähnt). Daher ist es sinnvoll, einiges über vi zu wissen oder zumindest seine wesentlichen Funktionen kennen zu lernen (wie man eine Datei öffnet, speichert, vi beendet oder ohne Speichern beendet). Bei regelmäßiger Verwendung von vi, kann sich der Benutzer nach und nach mit weiterenen Funktionen vertraut machen. Eine Alternative wäre die Verwendung von nano, das standardmäßig mit Rocky Linux installiert wird. Obwohl es nicht so vielseitig ist, ist es einfach zu bedienen, unkompliziert und erledigt die Arbeit. Wir können dann tiefer in die Funktionsweise von Linux einsteigen: diff --git a/docs/books/admin_guide/01-presentation.de.md b/docs/books/admin_guide/01-presentation.de.md index a50d829fb2..daaeb93952 100644 --- a/docs/books/admin_guide/01-presentation.de.md +++ b/docs/books/admin_guide/01-presentation.de.md @@ -206,7 +206,7 @@ In der Welt **GNU/Linux**-Welt bietet die Bewegung der Freien Software überwieg **Frei** ist gemeint im Sinne von Freiheit nicht von Freibier! -**Open Source**: die Quellen sind verfügbar, es ist möglich, sie einzusehen und verändern, aber nur unter bestimmte Bedingungen. +**Open Source**: die Quellen sind verfügbar, es ist möglich, sie einzusehen und zu verändern, aber nur unter bestimmte Bedingungen. Eine freie Software – im Sinne von Freiheit – ist notwendigerweise Open Source, aber das Gegenteil ist nicht der Fall, da sich Open-Source-Software von der Freiheit unterscheidet, die die GPL-Lizenz bietet. diff --git a/docs/books/admin_guide/03-commands.zh.md b/docs/books/admin_guide/03-commands.zh.md index bfd0d56e50..89e88eae22 100644 --- a/docs/books/admin_guide/03-commands.zh.md +++ b/docs/books/admin_guide/03-commands.zh.md @@ -11,13 +11,13 @@ contributors: Steven Spencer, Aditya Putta, tianci li, Grammaresque, Ganna Zhyrn **** -**目标**: 在本章中,未来的 Linux 管理员们将学习如何: +**目标**: 在本章中,未来的 Linux 管理员们将学习如何: :heavy_check_mark: 在系统树中 **移动**。 :heavy_check_mark: **创建** 一个文本文件, **显示** 其内容并对其 **修改**。 :heavy_check_mark: **使用** 最实用的Linux命令。 -:checkered_flag: **用户命令**,**linux** +:checkered_flag: **用户命令**,**linux**** **知识性**: :star: **复杂度**: :star: diff --git a/docs/books/admin_guide/04-advanced-commands.de.md b/docs/books/admin_guide/04-advanced-commands.de.md index 842b09028d..d81891992a 100644 --- a/docs/books/admin_guide/04-advanced-commands.de.md +++ b/docs/books/admin_guide/04-advanced-commands.de.md @@ -41,7 +41,7 @@ steven !!! note "Hinweis" - `uniq` erfordert, dass die Eingabedatei sortiert wird, da sie nur aufeinander folgende Zeilen vergleicht. + `uniq` erfordert, dass die Eingabedatei sortiert ist, da sie nur aufeinander folgende Zeilen vergleicht. Ohne Argument wird der `uniq` Befehl die gleichen Zeilen nicht anzeigen, die einander in der `firstnames.txt` Datei folgen: diff --git a/docs/books/admin_guide/05-vi.de.md b/docs/books/admin_guide/05-vi.de.md index df508529a1..9c23c379e7 100644 --- a/docs/books/admin_guide/05-vi.de.md +++ b/docs/books/admin_guide/05-vi.de.md @@ -4,7 +4,7 @@ title: VI-Texteditor # VI-Texteditor -In diesem Kapitel erfahren Sie, wie Sie mit dem VIsual-Editor arbeiten. +In diesem Kapitel erfahren Sie, wie Sie mit dem `VI`sual-Editor arbeiten. **** @@ -15,8 +15,8 @@ In diesem Kapitel erfahren Sie, wie Sie mit dem VIsual-Editor arbeiten. :checkered_flag: **Benutzerbefehle**, **Linux** -**Vorwissen**: :star: -**Komplexität**: :star: :star: +**Vorkenntnisse**: :star: +**Schwierigkeitsgrad**: :star::star: **Lesezeit**: 23 Minuten @@ -156,7 +156,7 @@ Der Cursor befindet sich unter dem gewünschten Zeichen. * Zum Anfang der Zeile verschieben: -++0++ oder ++"POS1"++ +++0++ oder ++home++ ### Vom ersten Zeichen eines Wortes @@ -296,7 +296,7 @@ Diese Operationen werden im *Befehls*-Modus durchgeführt. * Ein Wort ersetzen: -++c+w+"word"+escape++ +++"c"+"w"+"word"+escape++ !!! tip "Hinweis" @@ -533,7 +533,7 @@ Es gibt ein Tutorial zum Erlernen der Verwendung von `VI`. Es ist mit dem Befehl vimtutor ``` -### Visualizations-Modus +### Visualisierungs-Modus Dieser Modus ist ein Unterpunkt des Befehlsmodus. Sie können es vervollständigen, indem Sie ++"v"++ oder ++v++ eingeben. Der Operationsinhalt des ersteren befindet sich auf Zeichenebene und der Operationsinhalt des letzteren auf Zeilenebene. diff --git a/docs/books/admin_guide/05-vi.fr.md b/docs/books/admin_guide/05-vi.fr.md index 06f2055c2f..909182618d 100644 --- a/docs/books/admin_guide/05-vi.fr.md +++ b/docs/books/admin_guide/05-vi.fr.md @@ -296,7 +296,7 @@ Ces opérations se font en mode *command*. * Remplacer un mot : -++c+w+"mot"+escape++ +++"c"+"w"+"word"+escape++ !!! tip "Astuce" diff --git a/docs/books/admin_guide/05-vi.it.md b/docs/books/admin_guide/05-vi.it.md index d265ad3db2..a8d2473eb7 100644 --- a/docs/books/admin_guide/05-vi.it.md +++ b/docs/books/admin_guide/05-vi.it.md @@ -296,7 +296,7 @@ Queste operazioni vengono eseguite in modalità *comando*. * Sostituire una parola: -++c+w+"word"+escape++ +++"c"+"w"+"word"+escape++ !!! Tip "Suggerimento" diff --git a/docs/books/admin_guide/05-vi.uk.md b/docs/books/admin_guide/05-vi.uk.md index 4d12c02f9b..f1b1dde12a 100644 --- a/docs/books/admin_guide/05-vi.uk.md +++ b/docs/books/admin_guide/05-vi.uk.md @@ -296,7 +296,7 @@ VI дозволяє редагувати текст, керуючи: * Замінити одне слово: -++c+w+"слово"+escape++ +++"c"+"w"+"word"+escape++ !!! tip "Порада" diff --git a/docs/books/admin_guide/05-vi.zh.md b/docs/books/admin_guide/05-vi.zh.md index 37861c241e..1fdd4a48f8 100644 --- a/docs/books/admin_guide/05-vi.zh.md +++ b/docs/books/admin_guide/05-vi.zh.md @@ -296,7 +296,7 @@ VI允许通过管理以下内容进行文本编辑: * 替换一个单词: -++c+w+"word"+escape++ +++"c"+"w"+"word"+escape++ !!! Tip "提示" diff --git a/docs/books/admin_guide/06-users.zh.md b/docs/books/admin_guide/06-users.zh.md index bcab9aeb85..2376f4c797 100644 --- a/docs/books/admin_guide/06-users.zh.md +++ b/docs/books/admin_guide/06-users.zh.md @@ -21,7 +21,7 @@ title: 用户管理 **知识性**: :star: :star: **复杂度**: :star: :star: -**阅读时间**:30 分钟 +**阅读时间**: 30 分钟 **** ## 常规信息 @@ -353,7 +353,7 @@ test1:!:: sudo useradd -u 1000 -g GroupA -G GroupP,GroupC albert ``` -!!! note "说明" +!!! Note "说明" 在 **Debian** 下,您需要指定 `-m` 选项强制创建登录目录,或者在 `/etc/login.defs` 文件中设置 `CREATE_HOME` 变量。 在所有情况下,管理员都应该使用 `man` 中指定的 `adduser` 和 `deluser` 命令,但在可移植到所有 Linux 发行版的脚本中除外: @@ -609,7 +609,7 @@ sudo chgrp group1 file | `-R` | 递归地更改目录和目录下所有文件的所属组。 | | `-v` | 显示变更。 | -!!! note "说明" +!!! Note "说明" 通过参考另一个文件的所有者和所属组,可以向另一个文件应用所有者和所属组: @@ -766,7 +766,7 @@ sudo passwd -n 60 -x 90 -w 80 -i 10 patrick sudo passwd alain ``` -!!! note "说明" +!!! Note "说明" 可登录的用户可以使用 `passwd` 命令更改自己的密码(此过程需要请求用户的旧密码)。 root(uid=0)用户可以更改任何用户的密码。 @@ -830,7 +830,7 @@ $ sudo chage -d 0 philippe * `/etc/login.defs` * `/etc/skel` -!!! note "说明" +!!! Note "说明" 使用 `useradd` 命令编辑 `/etc/default/useradd` 文件。 @@ -982,7 +982,7 @@ $ sudo su - alain 0 ``` -请注意! `su` 和 `su -` 是不同的,如以下示例所示: +Attention please! `su` 和 `su -` 是不同的,如以下示例所示: ```bash $ whoami diff --git a/docs/books/admin_guide/07-file-systems.zh.md b/docs/books/admin_guide/07-file-systems.zh.md index b09f8bc031..d893a5c738 100644 --- a/docs/books/admin_guide/07-file-systems.zh.md +++ b/docs/books/admin_guide/07-file-systems.zh.md @@ -391,7 +391,7 @@ mkfs [-t fstype] filesys 每个文件系统的结构在每个分区上都是相同的。 **Boot Sector** 和 **Super block** 由系统初始化完成,**Inode table** 和 **Data block** 由管理员初始化完成。 -!!! note "说明" +!!! Note "说明" 唯一例外的是 **swap** 分区。 @@ -433,7 +433,7 @@ Boot sector 是可引导存储介质的第一个扇区,即 0 柱面、0 磁道 **inode table** 的大小在创建时定义,并存储在分区中。 它由称为 inode 的记录组成,这些记录与创建的文件相对应。 每条记录都包含组成文件的 data block 的地址。 -!!! note "说明" +!!! Note "说明" inode 编号在文件系统中是唯一的。 @@ -443,7 +443,7 @@ Boot sector 是可引导存储介质的第一个扇区,即 0 柱面、0 磁道 文件由其 inode 编号管理。 -!!! note "说明" +!!! Note "说明" inode table 的大小决定了 FS 可以包含的最大文件数量。 @@ -511,7 +511,7 @@ or ![文件系统的组织](images/07-file-systems-008.png) -!!! note "说明" +!!! Note "说明" 在 Linux 中,一切都是一个文件。 @@ -552,7 +552,7 @@ Linux 符合 **FHS**(_Filesystems Hierarchy Standard_)(参阅 `man hier`), `/etc/fstab` 文件是在随系统启动时被读取的,其中包含要执行的挂载。 每个要挂载的文件系统都在一行上说明,字段由空格或制表符分隔。 -!!! note "说明" +!!! Note "说明" 相关的命令按照顺序读取行(如 `fsck`、`mount`、`umount`)。 @@ -623,7 +623,7 @@ mount [-option] [device] [directory] | `-w` | 默认情况下以读/写方式挂载文件系统(等同于 `-o rw`) | | `-o opts` | opts 参数是逗号分隔的列表(如 `remount`、`ro` 等)。 | -!!! note "说明" +!!! Note "说明" 仅使用 `mount` 命令即可显示所有已挂载的文件系统。 如果挂载参数为 `-o defaults` ,则表示等同于 ` -o rw,suid,dev,exec,auto,nouser,async`,且这些参数与文件系统无关。 如果您需要浏览与文件系统相关的特殊挂载选项,请阅读 `man 8 mount` 中的 "Mount options FS-TYPE" 部分(将 FS-TYPE 类型替换为相应的文件系统,如ntfs、vfat、ufs 等)。 @@ -649,7 +649,7 @@ umount [-option] [device] [directory] | `-f` | 强制卸载。 | | `-a` | 删除 `/etc/fstab` 文件中提到的所有文件系统的挂载。 | -!!! note "说明" +!!! Note "说明" 卸载时,您必须不能停留在挂载点中。 否则将显示以下错误消息:`device is busy`。 @@ -668,11 +668,11 @@ umount [-option] [device] [directory] [root]# mkdir "working dir" ``` -!!! note "说明" +!!! Note "说明" 虽然在技术上创建包含空格的文件或目录并无不妥,但通常应该避免这种情况并用下划线替换任何空格是一种「最佳做法」。 -!!! note "说明" +!!! Note "说明" 以 **.** 开头的文件表示这是隐藏文件,它不能被简单的 `ls` 看到。 @@ -913,7 +913,7 @@ Mode 指示可以用八进制表示(例如 `744`)或符号表示([`ugoa`] | 1 | x | | 0 | - | -将这三个数字加在一起即可获得一个用户类型的权限。 例如: **755=rwxr-xr-x**。 +将这三个数字加在一起即可获得一个用户类型的权限。 例如 **755=rwxr-xr-x**。 ![八进制表示](images/07-file-systems-011.png) @@ -1015,7 +1015,7 @@ $ ls -la umask_025 `umask` 并不会影响现有文件。 `umask -S` 显示将要创建文件的文件权限(没有执行权限)。 所以,它不是用减去最大值的掩码来显示的。 -!!! note "说明" +!!! Note "说明" 在上面的示例中,使用命令修改掩码仅适用于当前连接的会话。 diff --git a/docs/books/admin_guide/08-process.de.md b/docs/books/admin_guide/08-process.de.md index 323a125fb8..058ba5cfaa 100644 --- a/docs/books/admin_guide/08-process.de.md +++ b/docs/books/admin_guide/08-process.de.md @@ -200,13 +200,13 @@ Beispiel: kill -9 1664 ``` -| Code | Signal | Beschreibung | -| ---- | --------- | ------------------------------------------------------------------------------------------------------------ | -| `2` | *SIGINT* | Sofortige Beendigung des Prozesses | -| `9` | *SIGKILL* | Den Prozess unterbrechen (++control+"d"++) | -| `15` | *SIGTERM* | Bereinigung und Beenden des Prozesses | -| `18` | *SIGCONT* | Prozess fortsetzen. Prozesse, die durch das Signal SIGSTOP gestoppt wurden, können dank SIGCONT weiterlaufen | -| `19` | *SIGSTOP* | Prozess unterbrechen (Stop process). Die Wirkung dieses Signals entspricht ++ctrl+"z"++ | +| Code | Signal | Beschreibung | +| ---- | --------- | ---------------------------------------------------------------------------------------------------------------- | +| `2` | *SIGINT* | Sofortige Beendigung des Prozesses | +| `9` | *SIGKILL* | Den Prozess unterbrechen (++control+"d"++) | +| `15` | *SIGTERM* | Bereinigung und Beenden des Prozesses | +| `18` | *SIGCONT* | Setzt den Prozess fort. Prozesse, die durch das Signal SIGSTOP gestoppt wurden, können dank SIGCONT weiterlaufen | +| `19` | *SIGSTOP* | Prozess unterbrechen (Stop process). Die Wirkung dieses Signals entspricht ++ctrl+"z"++ | Signale sind das Mittel der Kommunikation zwischen den Prozessen. Der `kill` Befehl sendet ein Signal an einen Prozess. @@ -296,7 +296,7 @@ Die Spalten repräsentieren: 1. Jobnummer 2. die Reihenfolge in der die Prozesse ausgeführt werden: - * ein `+` : Dieser Prozess ist der nächste Prozess, der standardmäßig mit `fg` oder `bg` ausgeführt wird; + * a `+` : Der Prozess, der standardmäßig für die Befehle `fg` und `bg` ausgewählt wird, wenn keine Job-Nummer angegeben ist * ein `-` : Dieser Prozess ist der nächste Prozess, der die `+` übernimmt `+` 3. *Running* (laufender Prozess) oder *Stopped* (abgebrochener Prozess) diff --git a/docs/books/admin_guide/08-process.uk.md b/docs/books/admin_guide/08-process.uk.md index bddf7fe426..914c14e1b3 100644 --- a/docs/books/admin_guide/08-process.uk.md +++ b/docs/books/admin_guide/08-process.uk.md @@ -8,7 +8,7 @@ title: Менеджер процесів **** -**Цілі**: у цьому розділі майбутні адміністратори Linux дізнаються, як: +**Цілі**: у цьому розділі майбутні адміністратори Linux дізнаються як: :heavy_check_mark: Розпізнавати `PID` і `PPID` процесу; :heavy_check_mark: Перегляд і пошук процесів; @@ -210,7 +210,7 @@ kill -9 1664 Сигнали є засобами зв'язку між процесами. Команда `kill` надсилає сигнал процесу. -!!! tip "Порада" +!!! Tip "Порада" Повний список сигналів, які враховує команда kill, становиться доступним після введення команди: @@ -328,7 +328,7 @@ nice find / -name "file" Як показано у прикладі вище, перші три команди вказують на встановлення значення Nice на "-5", тоді як друга команда є нашим рекомендованим використанням. Четверта команда вказує на встановлення значення Nice на «5». Для п’ятої команди відсутність параметрів означає, що значення Nice встановлено на «10». -!!! tip "Порада" +!!! Tip "Порада" «Nice» - це абревіатура від «niceness». @@ -356,7 +356,7 @@ renice -n 15 -p 1664 Команда `renice` діє на вже запущені процеси. Таким чином, можна змінити пріоритет певного процесу та кількох процесів, що належать користувачеві чи групі. -!!! tip "Порада" +!!! Tip "Порада" Команда `pidof` у поєднанні з командою `xargs` (див. курс Advanced Commands) дозволяє застосувати новий пріоритет в одній команді: diff --git a/docs/books/admin_guide/08-process.zh.md b/docs/books/admin_guide/08-process.zh.md index a8bd1a1b6f..04772b57ef 100644 --- a/docs/books/admin_guide/08-process.zh.md +++ b/docs/books/admin_guide/08-process.zh.md @@ -210,7 +210,7 @@ kill -9 1664 信号是进程之间的通信手段。 `kill` 命令的作用就是向进程发送信号。 -!!! Tip "提示" +!!! Tip "小提示" `kill` 命令所考虑到的完整信号列表可通过键入以下命令获得: @@ -328,7 +328,7 @@ nice find / -name "file" 如上例所示,前三个命令表示将 Nice 值设置为 "-5",而第二个命令是我们推荐的用法。 第四个命令指示将 Nice 值设置为 "5"。 对于第五个命令,不键入任何选项意味着 Nice 值设置为 "10"。 -!!! Tip "提示" +!!! Tip "小提示" "Nice" 是 "niceness" 的缩写。 @@ -356,7 +356,7 @@ renice -n 15 -p 1664 `renice` 命令作用于现有进程。 因此,我们可以改变一个特定进程的优先级,也可以改变属于一个用户或一个组的几个进程的优先级。 -!!! Tip "提示" +!!! Tip "小提示" `pidof` 命令与 `xargs` 命令相结合(请参阅 "高级命令" 课程),可允许在单个命令中应用新的优先级: diff --git a/docs/books/admin_guide/09-backups.uk.md b/docs/books/admin_guide/09-backups.uk.md index 686d863db7..a436e83f36 100644 --- a/docs/books/admin_guide/09-backups.uk.md +++ b/docs/books/admin_guide/09-backups.uk.md @@ -8,7 +8,7 @@ title: Резервне копіювання і відновлення **** -**Цілі**: у цьому розділі майбутні адміністратори Linux дізнаються, як: +**Цілі**: у цьому розділі майбутні адміністратори Linux дізнаються як: :heavy_check_mark: використовувати команди `tar` і `cpio`, для створення резервної копії; :heavy_check_mark: перевіряти резервні копії та відновлювати дані; @@ -82,7 +82,7 @@ title: Резервне копіювання і відновлення * **Періодичне**: резервне копіювання протягом певного періоду перед великим оновленням системи (зазвичай у непікові години) * **Циклічне**: резервне копіювання в днях, тижнях, місяцях тощо -!!! tip "Порада" +!!! Tip "Порада" Перед зміною системи може бути корисно зробити резервну копію. Однак немає сенсу щодня створювати резервні копії даних, які змінюються лише щомісяця. @@ -138,7 +138,7 @@ title: Резервне копіювання і відновлення * використовувані опції; * дата. -!!! tip "Порада" +!!! Tip "Порада" Ім’я резервної копії має бути чітким. @@ -231,7 +231,7 @@ $ tar cjf - /directory/to/backup/ | wc -c tar c[vf] [device] [file(s)] ``` -Приклад: +Приклади: ```bash [root]# tar cvf /backups/home.133.tar /home/ @@ -243,7 +243,7 @@ tar c[vf] [device] [file(s)] | `v` | Відображає назву оброблених файлів. | | `f` | Дозволяє вказати назву резервної копії (носій). | -!!! tip "Порада" +!!! Tip "Порада" Дефіс (`-`) перед `tar` не потрібен! @@ -255,7 +255,7 @@ tar c[vf] [device] [file(s)] tar c[vf]P [device] [file(s)] ``` -Приклад: +Приклади: ```bash [root]# tar cvfP /backups/home.133.P.tar /home/ @@ -406,7 +406,7 @@ tar cvfW file_name.tar dir/ tar vfd file_name.tar dir/ ``` -!!! tip "Порада" +!!! Tip "Порада" Додавши другий `v` до попереднього ключа, ви отримаєте список заархівованих файлів, а також відмінності між заархівованими файлами та файлами, присутніми у файловій системі. @@ -483,7 +483,7 @@ tar xvfz backup.tar.gz tar xvfj backup.tar.bz2 ``` -!!! tip "Порада" +!!! Tip "Порада" Щоб видобути або отримати список вмісту резервної копії, немає необхідності згадувати алгоритм стиснення, який використовується для створення резервної копії. Тобто `tar xvf` еквівалентний `tar xvfj`, щоб витягнути вміст, а `tar tvf` еквівалентний `tar tvfj`, щоб отримати список. @@ -589,7 +589,7 @@ tar xvf backup.tar --wildcards '*.conf' [files command |] cpio {-o| --create} [-options] [< file-list] [> device] ``` -Приклад: +Приклади: З перенаправленням виводу `cpio`: @@ -649,7 +649,7 @@ find /etc | cpio -o > /backups/etc.A.cpio [files command |] cpio {-o| --create} -A [-options] [< fic-list] {F| > device} ``` -Приклад: +Приклади: ```bash find /etc/shadow | cpio -o -AF SystemFiles.A.cpio @@ -693,7 +693,7 @@ find /etc | cpio –o | gzip > /backups/etc.A.cpio.gz cpio -t [-options] [< fic-list] ``` -Приклад: +Приклади: ```bash cpio -tv < /backups/etc.152.cpio | less @@ -716,7 +716,7 @@ cpio -tv < /backups/etc.152.cpio | less cpio {-i| --extract} [-E file] [-options] [< device] ``` -Приклад: +Приклади: ```bash cpio -iv < /backups/etc.152.cpio | less @@ -760,7 +760,7 @@ cpio –iuvF home.A.cpio cpio --no-absolute-filenames -divuF home.A.cpio ``` -!!! tip "Порада" +!!! Tip "Порада" Створення каталогів, можливо, необхідне, тому використовується опція `d` @@ -801,7 +801,7 @@ rm -f tmp gzip [options] [file ...] ``` -Приклад: +Приклади: ```bash $ gzip usr.tar @@ -823,7 +823,7 @@ usr.tar.gz bzip2 [options] [file ...] ``` -Приклад: +Приклади: ```bash $ bzip2 usr.cpio @@ -845,7 +845,7 @@ usr.cpio.bz2 gunzip [options] [file ...] ``` -Приклад: +Приклади: ```bash $ gunzip usr.tar.gz @@ -872,7 +872,7 @@ usr.tar bzip2 [options] [file ...] ``` -Приклад: +Приклади: ```bash $ bunzip2 usr.cpio.bz2 diff --git a/docs/books/admin_guide/09-backups.zh.md b/docs/books/admin_guide/09-backups.zh.md index ce68c551da..990cb26599 100644 --- a/docs/books/admin_guide/09-backups.zh.md +++ b/docs/books/admin_guide/09-backups.zh.md @@ -8,7 +8,7 @@ title: 备份和还原 **** -**目标**: 在本章中,未来的 Linux 管理员们将学习如何: +**目标**: 在本章中,未来的 Linux 管理员们将学习如何: :heavy_check_mark: 使用 `tar` 和 `cpio` 命令进行备份; :heavy_check_mark: 检查他们的备份并恢复数据。 @@ -23,7 +23,7 @@ title: 备份和还原 **** -!!! note "说明" +!!! Note "说明" 在本章中,命令结构通过使用 "device" 来指定备份的目标位置以及还原时的源位置。 该设备可以是外部介质,也可以是本地文件。 随着本章的展开,你应该对这一点有所了解,但如果你需要的话,可以随时参考这篇笔记以获得解释。 @@ -82,7 +82,7 @@ title: 备份和还原 * **定期**:在主要系统更新之前的特定时间段内进行备份(通常在非高峰时段) * **循环**:以天、周、月等为单位进行备份 -!!! Tip "提示" +!!! Tip "小提示" 在系统更改之前,进行备份可能很有用。 然而,每天备份每月都会变更的数据是没有意义的。 @@ -97,7 +97,7 @@ title: 备份和还原 我们不建议在执行恢复操作之前直接删除当前活动操作系统中的目录或文件(除非您知道删除后会发生什么)。 如果你不知道会发生什么,你可以在当前操作系统上执行 "快照" 操作。 -!!! Tip "提示" +!!! Tip "小提示" 出于安全原因,建议您在执行恢复操作之前将还原的目录或文件存储在 /tmp 目录中,以避免旧文件(旧目录)覆盖新文件(新目录)的情况。 @@ -123,7 +123,7 @@ title: 备份和还原 3. 跳过损坏的文件; 4. 可对整个文件系统使用。 -!!! note "说明" +!!! Note "说明" 这些命令以专有的和标准化的格式保存。 @@ -138,11 +138,11 @@ title: 备份和还原 * 所使用的选项; * 日期。 -!!! Tip "提示" +!!! Tip "小提示" 备份的名称必须是一目了然的。 -!!! note "说明" +!!! Note "说明" 在 Linux 系统中,除了图形用户界面(GUI)环境中的少数例外情况(如 .jpg、.mp4、.gif)外,大多数文件都没有扩展名的概念。 换句话说,大多数文件不需要扩展名。 人为添加后缀的原因是为了方便人类用户识别。 例如,如果系统管理员看到 `.tar.gz` 或 `.tgz` 文件扩展名,那么他就知道如何处理该文件。 @@ -243,7 +243,7 @@ tar c[vf] [device] [file(s)] | `v` | 显示已处理文件的名称。 | | `f` | 允许您指定备份(介质)的名称。 | -!!! Tip "提示" +!!! Tip "小提示" `tar` 键前的连字符(`-`)是可选的! @@ -281,11 +281,11 @@ tar cvzf backup.tar.gz dirname/ | --- | -------------- | | `z` | 用 *gzip* 压缩备份。 | -!!! note "说明" +!!! Note "说明" `.tgz` 扩展名等效于 `.tar.gz`。 -!!! note "说明" +!!! Note "说明" 对于所有备份操作,保持 `cvf`(`tvf` 或 `xvf`)键不变,只需在键的末尾添加压缩键,即可使命令更容易理解(例如:`cvfz` 或 `cvfj` 等)。 @@ -301,7 +301,7 @@ tar cvfj backup.tar.bz2 dirname/ | --- | --------------- | | `j` | 用 *bzip2* 压缩备份。 | -!!! note "说明" +!!! Note "说明" `.tbz` 和 `.tb2` 扩展名等同于 `.tar.bz2` 扩展名。 @@ -342,7 +342,7 @@ tar rvf backup_name.tar dirtoadd | `r` | 将文件或目录追加到归档的末尾。 | | `A` | 将一个归档中的所有文件追加到另一个归档的末尾。 | -!!! note "说明" +!!! Note "说明" 无法将文件或文件夹添加到压缩备份中。 @@ -352,7 +352,7 @@ tar rvf backup_name.tar dirtoadd Try `tar --help' or `tar --usage' for more information. ``` -!!! note "说明" +!!! Note "说明" 如果备份是在相对模式下执行的,请以相对模式添加文件。 如果备份是以绝对模式完成的,请以绝对模式添加文件。 @@ -384,11 +384,11 @@ tar tvfj backup.tar.bz2 tar tvf backup.tar | less ``` -!!! Tip "提示" +!!! Tip "小提示" 要列出或检索备份的内容,不必提及创建备份时使用的压缩算法。 也就是说,读取内容时,`tar tvf` 等同于 `tar tvfj`。 仅在创建压缩备份时才 **必须** 选择压缩类型或算法。 -!!! Tip "提示" +!!! Tip "小提示" 在执行还原操作之前,您应该始终检查和查看备份文件的内容。 @@ -406,7 +406,7 @@ tar cvfW file_name.tar dir/ tar vfd file_name.tar dir/ ``` -!!! Tip "提示" +!!! Tip "小提示" 通过在前一个键中添加第二个 `v`,您将得到归档文件的列表以及归档文件与文件系统中已存在文件之间的差异。 @@ -483,7 +483,7 @@ tar xvfz backup.tar.gz tar xvfj backup.tar.bz2 ``` -!!! Tip "提示" +!!! Tip "小提示" 要提取或列出备份的内容,不需要提及用于创建备份的压缩算法。 也就是说,`tar xvf` 相当于 `tar xvfj`,用于提取内容,`tar tvf` 相当于 `tar tvfj`,用于列出。 @@ -561,7 +561,7 @@ tar xvf backup.tar --wildcards '*.conf' * `ls`:列出一个目录(无论是否递归); * `cat`:读取包含要保存的树或文件的文件。 - !!! note "说明" + !!! Note "说明" `ls` 不能与 `-l`(细节)或 `-R`(递归)一起使用。 @@ -577,7 +577,7 @@ tar xvf backup.tar --wildcards '*.conf' 1. `-t` - 打印输入的内容表。 2. `-A` - 追加到现有归档。 仅工作在 copy-in 模式。 -!!! note "注意" +!!! Note "说明" `cpio` 的一些选项需要与正确的操作模式相结合才能正常工作。 参阅 `man 1 cpio` @@ -760,7 +760,7 @@ cpio –iuvF home.A.cpio cpio --no-absolute-filenames -divuF home.A.cpio ``` -!!! Tip "提示" +!!! Tip "小提示" 创建目录可能是必要的,因此需要使用 `d` 选项 @@ -787,7 +787,7 @@ rm -f tmp * 延长了备份时间和恢复时间。 * 这使得无法将文件添加到备份中。 -!!! note "说明" +!!! Note "说明" 因此,最好进行备份并压缩它,而不是在备份过程中压缩它。 diff --git a/docs/books/admin_guide/10-boot.uk.md b/docs/books/admin_guide/10-boot.uk.md index 27c55bfc24..2696800b14 100644 --- a/docs/books/admin_guide/10-boot.uk.md +++ b/docs/books/admin_guide/10-boot.uk.md @@ -357,7 +357,7 @@ timers.target loaded active active Timers systemctl set-default name.target ``` -Приклад: +Приклади: ```bash # systemctl set-default multi-user.target diff --git a/docs/books/admin_guide/11-tasks.uk.md b/docs/books/admin_guide/11-tasks.uk.md index abc12325f6..15b83f556d 100644 --- a/docs/books/admin_guide/11-tasks.uk.md +++ b/docs/books/admin_guide/11-tasks.uk.md @@ -8,7 +8,7 @@ title: Управління задачами **** -**Цілі**: у цьому розділі майбутні адміністратори Linux дізнаються, як: +**Цілі**: у цьому розділі майбутні адміністратори Linux дізнаються як: :heavy_check_mark: Linux займається плануванням завдань; :heavy_check_mark: обмежує використання **`cron`** певними користувачами; @@ -52,7 +52,7 @@ title: Управління задачами [root] # systemctl status crond ``` -!!! tip "Порада" +!!! Tip "Порада" Якщо демон `crond` не працює, вам доведеться ініціалізувати його вручну та/або автоматично під час запуску. Дійсно, навіть якщо задачі заплановані, вони не будуть запущені. diff --git a/docs/books/admin_guide/11-tasks.zh.md b/docs/books/admin_guide/11-tasks.zh.md index 6708704c20..c9da18f87f 100644 --- a/docs/books/admin_guide/11-tasks.zh.md +++ b/docs/books/admin_guide/11-tasks.zh.md @@ -8,7 +8,7 @@ title: 任务管理 **** -**目标**: 在本章中,未来的 Linux 管理员们将学习如何: +**目标**: 在本章中,未来的 Linux 管理员们将学习如何: :heavy_check_mark: 使用 Linux 处理计划任务; :heavy_check_mark: 将 **`cron`** 的使用限制为某些用户; @@ -52,7 +52,7 @@ title: 任务管理 [root] # systemctl status crond ``` -!!! Tip "提示" +!!! Tip "小提示" 如果 `crond` 守护程序未运行,则必须在启动时手动 和/或 自动对其进行初始化。 即使任务被安排了,它们也不会被启动。 diff --git a/docs/books/admin_guide/12-network.uk.md b/docs/books/admin_guide/12-network.uk.md index a06db75653..64b25de269 100644 --- a/docs/books/admin_guide/12-network.uk.md +++ b/docs/books/admin_guide/12-network.uk.md @@ -169,7 +169,7 @@ hostname [-f] [hostname] | `-f` | Відображає FQDN | | `-i` | Відображає IP-адреси системи | -!!! tip "Порада" +!!! Tip "Порада" Ця команда використовується різними мережевими програмами для ідентифікації машини. @@ -190,7 +190,7 @@ HOSTNAME=pc-rocky.mondomaine.lan Тому важливо заповнити ці два файли перед будь-яким налаштуванням мережевих служб. -!!! tip "Порада" +!!! Tip "Порада" Щоб дізнатися, чи правильно виконано цю конфігурацію, команди `hostname` і `hostname -f` мають відповідати очікуваними значеннями. @@ -212,7 +212,7 @@ HOSTNAME=pc-rocky.mondomaine.lan Файл `/etc/hosts` все ще використовується системою, особливо під час завантаження, коли визначається FQDN системи. -!!! tip "Порада" +!!! Tip "Порада" RedHat рекомендує заповнити принаймні один рядок із назвою системи. @@ -251,7 +251,7 @@ search mondomaine.lan nameserver 192.168.1.254 ``` -!!! tip "Порада" +!!! Tip "Порада" Цей файл є історичним. Він більше не заповнюється безпосередньо! @@ -328,7 +328,7 @@ BOOTPROTO=dhcp HWADDR=00:0c:29:96:32:e3 ``` -!!! tip "Порада" +!!! Tip "Порада" Якщо встановлено NetworkManager, зміни враховуються автоматично. Якщо ні, потрібно перезапустити службу мережі. @@ -473,7 +473,7 @@ ping [-c numerical] destination [root]# ping –c 4 localhost ``` -!!! tip "Порада" +!!! Tip "Порада" Перевірте підключення від близького до далекого @@ -575,7 +575,7 @@ ipcalc [options] IP BROADCAST=172.16.79.255 ``` -!!! tip "Порада" +!!! Tip "Порада" Цікава ця команда, після якої слідує перенаправлення для автоматичного заповнення конфігураційних файлів ваших інтерфейсів: @@ -622,7 +622,7 @@ tcp LISTEN 0 128 *:22 *:* ### Команда `netstat` -!!! Warning "Важливо" +!!! Warning "Увага" Команда `netstat` тепер застаріла та більше не встановлюється за замовчуванням у Rocky Linux. Ви все ще можете знайти деякі версії Linux, у яких він встановлений, але найкраще переходити до використання `ss` для всього, для чого ви використовували `netstat`. @@ -667,7 +667,7 @@ $ arp-scan -I eth0 -l 172.16.1.232 88:51:fb:5e:fa:b3 (Unknown) (DUP: 2) ``` -!!! tip "Порада" +!!! Tip "Порада" Як показує наведений вище приклад, конфлікти MAC-адрес можливі! Технології віртуалізації та копіювання віртуальних машин викликають ці проблеми. diff --git a/docs/books/admin_guide/13-softwares.uk.md b/docs/books/admin_guide/13-softwares.uk.md index 5908adf9cf..19e6d24fd2 100644 --- a/docs/books/admin_guide/13-softwares.uk.md +++ b/docs/books/admin_guide/13-softwares.uk.md @@ -94,7 +94,7 @@ rpm -qf /path/to/file Після параметра "-q" ім'я пакета має бути точним. Метасимволи (знаки підстановки) не підтримуються. -!!! tip "Порада" +!!! Tip "Порада" Однак можна переглянути список усіх встановлених пакетів і відфільтрувати їх за допомогою команди grep. diff --git a/docs/books/incus_server/00-toc.uk.md b/docs/books/incus_server/00-toc.uk.md index 27e4c6bfb9..05eb0c8db3 100644 --- a/docs/books/incus_server/00-toc.uk.md +++ b/docs/books/incus_server/00-toc.uk.md @@ -48,13 +48,13 @@ Incus найкраще описано на [офіційному веб-сайт ## Передумови та припущення - Один сервер Rocky Linux 9, гарно налаштований. Розгляньте окремий жорсткий диск для дискового простору ZFS у робочому середовищі (це потрібно зробити, якщо ви використовуєте ZFS). І так, ми припускаємо, що це чистий сервер, а не VPS. -- Це слід вважати розширеною темою, але ми зробили все можливе, щоб зробити її максимально зрозумілою для всіх. Тим не менш, знання кількох основних речей про керування контейнерами займе у вас довгий шлях. Знання кількох базових речей про керування контейнерами значно допоможе. +- Це слід вважати розширеною темою, але ми зробили все можливе, щоб зробити її максимально зрозумілою для всіх. Тим не менш, знання кількох основних речей про керування контейнерами займе у вас довгий шлях. Тим не менш, знання кількох основних речей про управління контейнерами буде дуже корисним. - Ви маєте добре володіти командним рядком на своїй машині (машинах) і вільно володіти редактором командного рядка. (Використовуємо _vi_ в цих прикладах, але ви можете використовувати свій улюблений редактор.) - Для більшості цих процесів вам потрібно буде бути непривілейованим користувачем. Для початкових кроків налаштування вам потрібно буде бути користувачем root або вміти `sudo`, щоб стати ним. У цих розділах ми припускаємо, що ваш непривілейований користувач є "incusadmin". Вам доведеться створити цей обліковий запис користувача пізніше в процесі. - Для ZFS переконайтеся, що безпечне завантаження UEFI НЕ ввімкнено. В іншому випадку вам доведеться підписати модуль ZFS, щоб змусити його завантажити. -- Здебільшого ми використовуємо контейнери на основі Rocky Linux. +- Здебільшого ми використовуємо контейнери на основі Rocky Linux -!!! info +!!! info "примітка" ``` Автор включає методологію використання файлової системи ZFS. Зверніть увагу, що проект Incus рекомендує BTRFS як файлову систему для сервера Incus. (ZFS все ще є опцією файлової системи.) Проте BTRFS взагалі недоступний у Rocky Linux 9.4. Поки він не буде санкціонований апстрімом і не буде випущено там, ваш єдиний вихід — використовувати ZFS або іншу включену файлову систему. Щоб дізнатися більше про параметри файлової системи Incus, перегляньте [офіційний документ проекту тут.](https://linuxcontainers.org/incus/docs/main/reference/storage_dir/) diff --git a/docs/books/incus_server/01-install.uk.md b/docs/books/incus_server/01-install.uk.md index 935ca60f2a..1d50cc9ebf 100644 --- a/docs/books/incus_server/01-install.uk.md +++ b/docs/books/incus_server/01-install.uk.md @@ -69,7 +69,7 @@ dnf install zfs ## Налаштування середовища -Для запуску багатьох контейнерів потрібно більше, ніж більшість налаштувань ядра сервера. Якщо ми з самого початку припустимо, що будемо використовувати наш сервер у робочому стані, тоді нам потрібно внести ці зміни заздалегідь, щоб уникнути таких помилок, як «Забагато відкритих файлів». +Для запуску багатьох контейнерів потрібно більше, ніж більшість налаштувань ядра сервера. Якщо ви з самого початку припускаєте, що будете використовувати свій сервер у виробничому середовищі, вам потрібно заздалегідь внести ці зміни, щоб уникнути таких помилок, як «Занадто багато відкритих файлів». На щастя, налаштувати параметри для Incus неважко за допомогою кількох змін файлів і перезавантаження. diff --git a/docs/books/incus_server/06-profiles.uk.md b/docs/books/incus_server/06-profiles.uk.md index 10e34359be..89769eaa43 100644 --- a/docs/books/incus_server/06-profiles.uk.md +++ b/docs/books/incus_server/06-profiles.uk.md @@ -104,7 +104,7 @@ incus profile assign rockylinux-test-9 default,macvlan Якщо ви хочете запустити контейнери Rocky Linux і використовувати `macvlan` для призначення IP-адреси з вашої мережі LAN або WAN, процес буде відрізнятися залежно від версії контейнера операційної системи (8.x або 9.x). -### Rocky Linux 9.0 macvlan – виправлення DHCP +### Rocky Linux 9.x macvlan - the DHCP fix Спочатку давайте проілюструємо, що відбувається під час зупинки та перезапуску двох контейнерів після призначення профілю `macvlan`. @@ -169,7 +169,7 @@ incus shell rockylinux-test-9 dnf install which ``` -А потім запустіть: +Потім запустіть: ```bash which dhclient diff --git a/docs/books/incus_server/07-configurations.uk.md b/docs/books/incus_server/07-configurations.uk.md index 0607b2448f..5153e5aa39 100644 --- a/docs/books/incus_server/07-configurations.uk.md +++ b/docs/books/incus_server/07-configurations.uk.md @@ -126,7 +126,7 @@ locations: - none ``` -Це показує, що всі наші контейнери використовують наш пул сховищ dir. Під час використання ZFS ви також можете встановити дискову квоту для контейнера. Ось як це виглядатиме встановлення дискової квоти розміром 2 Гб для контейнера ubuntu-test. +Це показує, що всі наші контейнери використовують наш пул сховищ dir. Під час використання ZFS ви також можете встановити дискову квоту для контейнера. Ось як це виглядатиме встановлення дискової квоти розміром 2 Гб для контейнера ubuntu-test: ```bash incus config device override ubuntu-test root size=2GB diff --git a/docs/books/learning_ansible/01-basic.uk.md b/docs/books/learning_ansible/01-basic.uk.md index 7a397bafac..9ff7631bfd 100644 --- a/docs/books/learning_ansible/01-basic.uk.md +++ b/docs/books/learning_ansible/01-basic.uk.md @@ -11,7 +11,7 @@ update: 15 грудня 2021 р **** -**Цілі**: В цьому розділі ви дізнаєтеся як: +**Цілі**: В цьому розділі ви дізнаєтеся про: :heavy_check_mark: Реалізувати Ansible; :heavy_check_mark: Застосувати зміни конфігурації на сервері; @@ -360,7 +360,7 @@ ansible rocky8 -i ./local-inventory -m command -a 'date' Як у цьому прикладі, іноді простіше розділити декларацію керованих пристроїв на кілька файлів (наприклад, за хмарним проектом) і надати Ansible шлях до цих файлів, а не підтримувати довгий файл інвентаризації. -| Опція | Опис | +| Опція | Інформація | | ------------------------ | -------------------------------------------------------------------------------------------------- | | `-a 'arguments'` | Аргументи для передачі в модуль. | | `-b -K` | Запитує пароль і виконує команду з вищими привілегіями. | @@ -783,7 +783,7 @@ PLAY RECAP ********************************************************************* ... ``` -!!! tip "Порада" +!!! Tip "Порада" `dnf` — це один із модулів, який дозволяє надати йому список як аргумент. diff --git a/docs/books/learning_ansible/02-advanced.de.md b/docs/books/learning_ansible/02-advanced.de.md index b8d937f6ad..1db70735d5 100644 --- a/docs/books/learning_ansible/02-advanced.de.md +++ b/docs/books/learning_ansible/02-advanced.de.md @@ -8,7 +8,7 @@ In diesem Kapitel lernen Sie weitere Themen über die Arbeit mit Ansible. **** -**Ziele**: In diesem Kapitel wird Folgendes behandelt: +**Ziele**: In diesem Kapitel lernen Sie Folgendes: :heavy_check_mark: arbeiten mit Variablen; :heavy_check_mark: Verwendung von Schleifen; diff --git a/docs/books/learning_ansible/03-working-with-files.uk.md b/docs/books/learning_ansible/03-working-with-files.uk.md index d2d1b3aa67..6cfb118d63 100644 --- a/docs/books/learning_ansible/03-working-with-files.uk.md +++ b/docs/books/learning_ansible/03-working-with-files.uk.md @@ -8,7 +8,7 @@ title: Керування файлами **** -**Цілі**: В цьому розділі ви дізнаєтеся як: +**Цілі**: В цьому розділі ви дізнаєтеся про: :heavy_check_mark: змінити вміст файлу; :heavy_check_mark: завантажити файли на цільові сервери; diff --git a/docs/books/learning_ansible/04-ansible-galaxy.uk.md b/docs/books/learning_ansible/04-ansible-galaxy.uk.md index d00055901c..579febb32b 100644 --- a/docs/books/learning_ansible/04-ansible-galaxy.uk.md +++ b/docs/books/learning_ansible/04-ansible-galaxy.uk.md @@ -8,7 +8,7 @@ title: Ansible Galaxy **** -**Цілі**: В цьому розділі ви дізнаєтеся як: +**Цілі**: В цьому розділі ви дізнаєтеся про: :heavy_check_mark: встановлювати та керувати колекціями. :heavy_check_mark: встановлювати ролі та керувати ними. @@ -18,7 +18,7 @@ title: Ansible Galaxy **Знання**: :star: :star: **Складність**: :star: :star: :star: -**Час для читання**: 40 хвилин +**Час читання**: 40 хвилин **** @@ -36,14 +36,14 @@ title: Ansible Galaxy ansible-galaxy role [import|init|install|login|remove|...] ``` -| Підкоманди | Функціональність | -| ---------- | ------------------------------------------------- | -| `install` | встановлює роль. | -| `remove` | видаляє одну або кілька ролей. | -| `list` | відображає назву та версію встановлених ролей. | -| `info` | відображає інформацію про роль. | -| `init` | створює скелет нової ролі. | -| `import` | імпортує ролі з веб-сайту galaxy. Потрібен логін. | +| Підкоманди | Функціональність | +| ----------------- | ------------------------------------------------- | +| `install` | встановлює роль. | +| `remove` | видаляє одну або кілька ролей. | +| `list` | відображає назву та версію встановлених ролей. | +| `info "примітка"` | відображає інформацію про роль. | +| `init` | створює скелет нової ролі. | +| `import` | імпортує ролі з веб-сайту galaxy. Потрібен логін. | * Щоб керувати колекціями: diff --git a/docs/books/learning_ansible/05-deployments.de.md b/docs/books/learning_ansible/05-deployments.de.md index c241b8b3fa..89c53f453a 100644 --- a/docs/books/learning_ansible/05-deployments.de.md +++ b/docs/books/learning_ansible/05-deployments.de.md @@ -12,9 +12,9 @@ In diesem Kapitel erfahren Sie, wie Sie Anwendungen mit der Ansible-Rolle [Ansis :heavy_check_mark: Ansistrano implementieren; :heavy_check_mark: Ansistrano konfigurieren; -:heavy_check_mark: freigegebene Ordner und Dateien zwischen bereitgestellten Versionen verwenden; -:heavy_check_mark: verschiedene Versionen einer Website über git bereitstellen; -bereit :heavy_check_mark: zwischen Bereitstellungsschritten reagieren. +:heavy_check_mark: Gemeinsame Ordner und Dateien zwischen bereitgestellten Versionen verwenden; +:heavy_check_mark: Verschiedene Versionen einer Site aus Git bereitstellen; +:heavy_check_mark: Zwischen den Bereitstellungsschritten handeln. :checkered_flag: **ansible**, **ansistrano**, **Rollen**, **Bereitstellung** diff --git a/docs/books/learning_ansible/05-deployments.uk.md b/docs/books/learning_ansible/05-deployments.uk.md index 7afe27e0b0..98bbcd3532 100644 --- a/docs/books/learning_ansible/05-deployments.uk.md +++ b/docs/books/learning_ansible/05-deployments.uk.md @@ -8,7 +8,7 @@ title: Розгортання за допомогою Ansistrano **** -**Цілі**: В цьому розділі ви дізнаєтеся як: +**Цілі**: В цьому розділі ви дізнаєтеся про: :heavy_check_mark: Запровадити Ansistrano; :heavy_check_mark: Налаштувати Ansistrano; @@ -21,7 +21,7 @@ title: Розгортання за допомогою Ansistrano **Знання**: :star: :star: **Складність**: :star: :star: :star: -**Час для читання**: 40 хвилин +**Час читання**: 40 хвилин **** diff --git a/docs/books/learning_ansible/06-large-scale-infrastructure.uk.md b/docs/books/learning_ansible/06-large-scale-infrastructure.uk.md index 782b10f6cc..6c5339a06d 100644 --- a/docs/books/learning_ansible/06-large-scale-infrastructure.uk.md +++ b/docs/books/learning_ansible/06-large-scale-infrastructure.uk.md @@ -8,7 +8,7 @@ title: Великомасштабна інфраструктура **** -**Цілі**: В цьому розділі ви дізнаєтеся як: +**Цілі**: В цьому розділі ви дізнаєтеся про: :heavy_check_mark: Організувати свій код для великої інфраструктури; :heavy_check_mark: Застосувати все або частину вашого керування конфігурацією до групи вузлів; diff --git a/docs/books/learning_bash/00-toc.uk.md b/docs/books/learning_bash/00-toc.uk.md index b6a38e00e9..cb404d41cb 100644 --- a/docs/books/learning_bash/00-toc.uk.md +++ b/docs/books/learning_bash/00-toc.uk.md @@ -4,7 +4,7 @@ author: Antoine Le Morvan contributors: Steven Spencer, Ganna Zhyrnova tested_with: 8.5 tags: - - освіта + - education - сценарій bash - bash --- diff --git a/docs/books/learning_bash/01-first-script.uk.md b/docs/books/learning_bash/01-first-script.uk.md index 70fec14384..65e4fe8ae6 100644 --- a/docs/books/learning_bash/01-first-script.uk.md +++ b/docs/books/learning_bash/01-first-script.uk.md @@ -4,7 +4,7 @@ author: Antoine Le Morvan contributors: Steven Spencer, Ganna Zhyrnova tested_with: 8.5 tags: - - освіта + - education - сценарій bash - bash --- @@ -15,7 +15,7 @@ tags: **** -**Цілі**: В цьому розділі ви дізнаєтеся як: +**Цілі**: В цьому розділі ви дізнаєтеся про: :heavy_check_mark: Написати свій перший сценарій у bash; :heavy_check_mark: Виконати свій перший сценарій; diff --git a/docs/books/learning_bash/02-using-variables.uk.md b/docs/books/learning_bash/02-using-variables.uk.md index 961f2d089b..a151a36375 100644 --- a/docs/books/learning_bash/02-using-variables.uk.md +++ b/docs/books/learning_bash/02-using-variables.uk.md @@ -4,7 +4,7 @@ author: Antoine Le Morvan contributors: Steven Spencer, Ganna Zhyrnova tested_with: 8.5 tags: - - освіта + - education - сценарій bash - bash --- diff --git a/docs/books/learning_bash/03-data-entry-and-manipulations.uk.md b/docs/books/learning_bash/03-data-entry-and-manipulations.uk.md index 8c3803ad64..8e51d196e2 100644 --- a/docs/books/learning_bash/03-data-entry-and-manipulations.uk.md +++ b/docs/books/learning_bash/03-data-entry-and-manipulations.uk.md @@ -4,7 +4,7 @@ author: Antoine Le Morvan contributors: Steven Spencer, Ganna Zhyrnova tested_with: 8.5 tags: - - освіта + - education - сценарій bash - bash --- @@ -15,14 +15,14 @@ tags: **** -**Цілі**: В цьому розділі ви дізнаєтеся як: +**Цілі**: В цьому розділі ви дізнаєтеся про: :heavy_check_mark: прочитати введені дані від користувача; :heavy_check_mark: маніпулювати записами даних; :heavy_check_mark: використовувати аргументи в сценарії; :heavy_check_mark: керувати позиційними змінними; -:checkered_flag: **linux**, **сценарій**, **bash**, **змінна** +:checkered_flag: **linux**, **script**, **bash**, **variable** **Знання**: :star: :star: **Складність**: :star: :star: @@ -113,7 +113,7 @@ cut -d: -f1 /etc/passwd * Команда `grep` працює "по вертикалі" (ізоляція одного рядка від усіх рядків у файлі). * Комбінація двох команд дозволяє **ізолювати конкретне поле у файлі**. -Приклад: +Приклади: ```bash grep "^root:" /etc/passwd | cut -d: -f3 @@ -218,7 +218,7 @@ dirname $FILE | `$#` | містить кількість переданих аргументів. | | `$*` або `$@` | містить в одній змінній усі передані аргументи. | -Приклад: +Приклади: ```bash #!/usr/bin/env bash @@ -340,7 +340,7 @@ All without separation ($@) = tree four set [value] [$variable] ``` -Приклад: +Приклади: ```bash $ set one two three diff --git a/docs/books/learning_bash/04-check-your-knowledge.uk.md b/docs/books/learning_bash/04-check-your-knowledge.uk.md index a30665ae2e..1d00743e21 100644 --- a/docs/books/learning_bash/04-check-your-knowledge.uk.md +++ b/docs/books/learning_bash/04-check-your-knowledge.uk.md @@ -4,7 +4,7 @@ author: Antoine Le Morvan contributors: Steven Spencer, Ganna Zhyrnova tested_with: 8.5 tags: - - освіта + - education - сценарій bash - bash --- diff --git a/docs/books/learning_bash/05-tests.uk.md b/docs/books/learning_bash/05-tests.uk.md index de5bbb9c4c..edbd26e626 100644 --- a/docs/books/learning_bash/05-tests.uk.md +++ b/docs/books/learning_bash/05-tests.uk.md @@ -4,7 +4,7 @@ author: Antoine Le Morvan contributors: Steven Spencer, Ganna Zhyrnova tested_with: 8.5 tags: - - освіта + - education - сценарій bash - bash --- @@ -13,14 +13,14 @@ tags: **** -**Цілі**: В цьому розділі ви дізнаєтеся як: +**Цілі**: В цьому розділі ви дізнаєтеся про: :heavy_check_mark: працювати з кодом повернення; :heavy_check_mark: перевірити та порівняти файли; :heavy_check_mark: перевірити змінні, рядки та цілі числа; :heavy_check_mark: виконати операцію з цілими числами; -:checkered_flag: **linux**, **сценарій**, **bash**, **змінна** +:checkered_flag: **linux**, **script**, **bash**, **variable** **Знання**: :star: :star: **Складність**: :star: :star: :star: diff --git a/docs/books/learning_bash/06-conditional-structures.uk.md b/docs/books/learning_bash/06-conditional-structures.uk.md index 8d87858220..98c1b3b487 100644 --- a/docs/books/learning_bash/06-conditional-structures.uk.md +++ b/docs/books/learning_bash/06-conditional-structures.uk.md @@ -4,7 +4,7 @@ author: Antoine Le Morvan contributors: Steven Spencer, Ganna Zhyrnova tested_with: 8.5 tags: - - освіта + - education - сценарій bash - bash --- @@ -13,7 +13,7 @@ tags: **** -**Цілі**: В цьому розділі ви дізнаєтеся як: +**Цілі**: В цьому розділі ви дізнаєтеся про: :heavy_check_mark: використовувати умовний синтаксис `if`; :heavy_check_mark: використовувати умовний синтаксис `case`; diff --git a/docs/gemstones/git/02-gh_cli_edit_pr_title.de.md b/docs/gemstones/git/02-gh_cli_edit_pr_title.de.md new file mode 100644 index 0000000000..26eedcec20 --- /dev/null +++ b/docs/gemstones/git/02-gh_cli_edit_pr_title.de.md @@ -0,0 +1,52 @@ +--- +title: Bearbeiten des Titels eines vorhandenen Pull Requests über die CLI +author: Wale Soyinka +contributors: Ganna Zhyrnova +tags: + - GitHub + - Pull-Request + - Dokumentation + - CLI +--- + +## Einleitung + +In diesem Gemstone wird erklärt, wie Sie den Titel eines vorhandenen Pull Requests (PR) in einem GitHub-Repository mithilfe der GitHub-Weboberfläche und der CLI bearbeiten. + +## Problembeschreibung + +Manchmal muss der Titel eines PR nach seiner Erstellung angepasst werden, um die aktuellen Änderungen oder Diskussionen besser widerzuspiegeln. + +## Voraussetzungen + +- Ein vorhandener GitHub-Pull-Request. +- Zugriff auf die GitHub-Weboberfläche oder CLI mit den erforderlichen Berechtigungen. + +## Prozedur + +### GitHub CLI – Verwendung + +1. **Checken Sie den entsprechenden Zweig aus**: + - Stellen Sie sicher, dass Sie sich auf dem mit dem PR verknüpften Branch befinden. + + ```bash + git checkout branch-name + ``` + +2. **Bearbeiten Sie den PR mithilfe der CLI**: + - Verwenden Sie den folgenden Befehl, um den PR zu bearbeiten: + + ```bash + gh pr edit PR_NUMBER --title "New PR Title" + ``` + + - Ersetzen Sie `PR_NUMBER` durch die Nummer Ihres Pull Requests und `"New PR Title"` durch den gewünschten Titel. + +## Zusätzliche Informationen (optional) + +- Das Bearbeiten eines PR-Titels hat keine Auswirkungen auf den Diskussionsthread oder Codeänderungen. +- Es gilt als gute Praxis, Mitwirkende zu informieren, wenn an einem PR-Titel wesentliche Änderungen vorgenommen werden. + +## Zusammenfassung + +Mit diesen Schritten können Sie den Titel einer vorhandenen Pull-Anfrage in einem GitHub-Repository ganz einfach über das GitHub-CLI-Tool (gh) ändern. diff --git a/docs/index.de.md b/docs/index.de.md index d10c7c4aec..9d52e3f04f 100644 --- a/docs/index.de.md +++ b/docs/index.de.md @@ -24,7 +24,7 @@ Die Hauptbereiche der Dokumentationseite sind: * **Anleitungen**: die bestimmte Themen zum Einrichten und Benutzen von Rocky Linux abdecken. * **Bücher**: enthalten detailliertere Informationen rund um einen bestimmten Bereich. -* **Labs**: Sie werden Spaß an diese Tutorials haben! +* **Labors**: Sie werden Spaß an diese Tutorials haben! * **Gems**: Hier werden nützliche Skripte und Tipps zur Verwendung von Befehlen vorgestellt. * **Release Notes**: enthalten Rocky Linux Release Notes und Versionsupdate Informationen. * **Rocky Linux**: Link zur Offiziellen Homepage. diff --git a/docs/labs/kubernetes-the-hard-way/lab11-pod-network-routes.it.md b/docs/labs/kubernetes-the-hard-way/lab11-pod-network-routes.it.md new file mode 100644 index 0000000000..3ee616d2da --- /dev/null +++ b/docs/labs/kubernetes-the-hard-way/lab11-pod-network-routes.it.md @@ -0,0 +1,94 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +tags: + - kubernetes + - k8s + - lab exercise + - runc + - containerd + - etcd + - kubectl +--- + +# Laboratorio 11: Provisioning delle rotte di rete dei Pod + +!!! info + + Si tratta di un fork dell'originale ["Kubernetes the hard way"](https://github.com/kelseyhightower/kubernetes-the-hard-way) scritto originariamente da Kelsey Hightower (GitHub: kelseyhightower). A differenza dell'originale, che si basa su distribuzioni simili a Debian per l'architettura ARM64, questo fork si rivolge a distribuzioni Enterprise Linux come Rocky Linux, che gira su architettura x86_64. + +I pod assegnati a un nodo ricevono un indirizzo IP dall'intervallo CIDR dei pod del nodo. Attualmente, i pod non possono comunicare con altri pod in esecuzione su nodi diversi a causa della mancanza dei [percorsi di rete] (https://cloud.google.com/compute/docs/vpc/routes). + +In questo laboratorio si creerà un percorso per ciascun nodo di lavoro che mappa l'intervallo CIDR del pod del nodo all'indirizzo IP interno del nodo. + +> Esistono [altri modi](https://kubernetes.io/docs/concepts/cluster-administration/networking/#how-to-achieve-this) per implementare il modello di rete Kubernetes. + +## La tabella di instradamento + +In questa sezione si raccoglieranno le informazioni necessarie per creare percorsi nella rete VPC `kubernetes-the-hard-way`. + +Stampare l'indirizzo IP interno e l'intervallo CIDR del pod per ogni istanza di lavoro: + +```bash +{ + SERVER_IP=$(grep server machines.txt | cut -d " " -f 1) + NODE_0_IP=$(grep node-0 machines.txt | cut -d " " -f 1) + NODE_0_SUBNET=$(grep node-0 machines.txt | cut -d " " -f 5) + NODE_1_IP=$(grep node-1 machines.txt | cut -d " " -f 1) + NODE_1_SUBNET=$(grep node-1 machines.txt | cut -d " " -f 5) +} +``` + +```bash +ssh root@server <U>.| +00000150 80 3a 39 d5 08 f9 6c de 6b 0a |.:9...l.k.| +0000015a +``` + +È necessario anteporre alla chiave `etcd` il prefisso `k8s:enc:aescbc:v1:key1`, che indica l'utilizzo del provider `aescbc` per crittografare i dati con la chiave di crittografia `key1`. + +## Implementazioni + +In questa sezione verranno verificate le capacità di creare e gestire [Distribuzioni](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/). + +Creare una distribuzione per il server web [nginx](https://nginx.org/en/): + +```bash +kubectl create deployment nginx \ + --image=nginx:latest +``` + +Elencare il pod creato dalla distribuzione `nginx`: + +```bash +kubectl get pods -l app=nginx +``` + +```bash +NAME READY STATUS RESTARTS AGE +nginx-54c98b4f84-dfwl9 1/1 Running 0 71s +``` + +### Port Forwarding + +In questa sezione verranno verificate le capacità di accedere alle applicazioni in remoto utilizzando il [port forwarding](https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/). + +Recuperare il nome completo del pod `nginx`: + +```bash +POD_NAME=$(kubectl get pods -l app=nginx \ + -o jsonpath="{.items[0].metadata.name}") +``` + +Inoltrare la porta `8080` sul tuo computer locale alla porta `80` del pod `nginx`: + +```bash +kubectl port-forward $POD_NAME 8080:80 +``` + +```text +Forwarding from 127.0.0.1:8080 -> 80 +Forwarding from [::1]:8080 -> 80 +``` + +In un nuovo terminale, inviare una richiesta HTTP con l'indirizzo di inoltro: + +```bash +curl --head http://127.0.0.1:8080 +``` + +```text +HTTP/1.1 200 OK +Server: nginx/1.27.4 +Date: Tue, 04 Mar 2025 01:30:20 GMT +Content-Type: text/html +Content-Length: 615 +Last-Modified: Wed, 05 Feb 2025 11:06:32 GMT +Connection: keep-alive +ETag: "67a34638-267" +Accept-Ranges: bytes +``` + +Torna al terminale precedente e interrompere il port forwarding al pod `nginx` digitando ++ctrl+c++: + +```text +Forwarding from 127.0.0.1:8080 -> 80 +Forwarding from [::1]:8080 -> 80 +Handling connection for 8080 +^C +``` + +### Registri + +In questa sezione verranno verificate le capacità di [recuperare i log dei container](https://kubernetes.io/docs/concepts/cluster-administration/logging/). + +Stampare i log del pod `nginx`: + +```bash +kubectl logs $POD_NAME +``` + +```text +...... +127.0.0.1 - - [04/Mar/2025:01:30:20 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.76.1" "-" +``` + +### Exec + +In questa sezione verranno verificate le capacità di [eseguire comandi in un container](https://kubernetes.io/docs/tasks/debug-application-cluster/get-shell-running-container/#running-individual-commands-in-a-container). + +Stampare la versione di `nginx` eseguendo il comando `nginx -v` nel container `nginx`: + +```bash +kubectl exec -ti $POD_NAME -- nginx -v +``` + +```text +nginx version: nginx/1.27.4 +``` + +## Servizi + +In questa sezione, verranno verificate le capacità di esporre le applicazioni con un [Servizio](https://kubernetes.io/docs/concepts/services-networking/service/). + +Esporre la distribuzione `nginx` utilizzando un servizio [NodePort](https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport): + +```bash +kubectl expose deployment nginx \ + --port 80 --type NodePort +``` + +> Non è possibile utilizzare il tipo di servizio LoadBalancer perché il cluster non è configurato con l'[integrazione del provider cloud](https://kubernetes.io/docs/getting-started-guides/scratch/#cloud-provider). Questo tutorial non tratta la configurazione dell'integrazione con i provider cloud. + +Recuperare la porta del nodo assegnata al servizio `nginx`: + +```bash +NODE_PORT=$(kubectl get svc nginx \ + --output=jsonpath='{range .spec.ports[0]}{.nodePort}') +``` + +Effettuare una richiesta HTTP con l'indirizzo IP e la porta del nodo `nginx`: + +```bash +curl -I http://node-0:${NODE_PORT} +``` + +```text +HTTP/1.1 200 OK +Server: nginx/1.27.4 +Date: Tue, 04 Mar 2025 01:40:20 GMT +Content-Type: text/html +Content-Length: 615 +Last-Modified: Wed, 05 Feb 2025 11:06:32 GMT +Connection: keep-alive +ETag: "67a34638-267" +Accept-Ranges: bytes +``` + +Successivo: [Pulizia](lab13-cleanup.md) diff --git a/docs/labs/kubernetes-the-hard-way/lab13-cleanup.it.md b/docs/labs/kubernetes-the-hard-way/lab13-cleanup.it.md new file mode 100644 index 0000000000..9c6ff312a4 --- /dev/null +++ b/docs/labs/kubernetes-the-hard-way/lab13-cleanup.it.md @@ -0,0 +1,24 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +tags: + - kubernetes + - k8s + - lab exercise +--- + +# Laboratorio 13: Pulizia + +!!! info + + Si tratta di un fork dell'originale ["Kubernetes the hard way"](https://github.com/kelseyhightower/kubernetes-the-hard-way) scritto originariamente da Kelsey Hightower (GitHub: kelseyhightower). A differenza dell'originale, che si basa su distribuzioni simili a Debian per l'architettura ARM64, questo fork si rivolge a distribuzioni Enterprise Linux come Rocky Linux, che gira su architettura x86_64. + +In questo laboratorio si elimineranno le risorse di calcolo create durante questo tutorial. + +## Istanze di calcolo + +Le versioni precedenti di questa guida utilizzavano risorse GCP per vari aspetti dell'elaborazione dati e della rete. La versione attuale è agnostica; tutte le configurazioni vengono eseguite su `jumpbox`, `server` o nodi. + +Per ripulire il sistema è sufficiente eliminare tutte le macchine virtuali create per questo esercizio. + +Successivo: [Ricomincia da capo](lab0-README.md) diff --git a/docs/labs/kubernetes-the-hard-way/lab5-kubernetes-configuration-files.it.md b/docs/labs/kubernetes-the-hard-way/lab5-kubernetes-configuration-files.it.md new file mode 100644 index 0000000000..5fbd86fc58 --- /dev/null +++ b/docs/labs/kubernetes-the-hard-way/lab5-kubernetes-configuration-files.it.md @@ -0,0 +1,214 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +tags: + - kubernetes + - k8s + - lab exercise +--- + +# Laboratorio 5: Generazione dei file di configurazione di Kubernetes per l'autenticazione + +!!! info + + Si tratta di un fork dell'originale ["Kubernetes the hard way"](https://github.com/kelseyhightower/kubernetes-the-hard-way) scritto originariamente da Kelsey Hightower (GitHub: kelseyhightower). A differenza dell'originale, che si basa su distribuzioni simili a Debian per l'architettura ARM64, questo fork si rivolge a distribuzioni Enterprise Linux come Rocky Linux, che gira su architettura x86_64. + +In questo laboratorio, si genereranno i [file di configurazione client Kubernetes](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/), che vengono solitamente chiamati kubeconfig. Questi file configurano i client Kubernetes per connettersi e autenticarsi con i server API Kubernetes. + +## Configurazioni di autenticazione del client + +In questa sezione si generano i file kubeconfig per `kubelet` e per l'utente `admin`. + +### Il file di configurazione kubelet Kubernetes + +Quando si generano i file kubeconfig per i Kubelet, è necessario far corrispondere il certificato del client al nome del nodo del Kubelet. Questo assicura che i Kubelets siano autorizzati correttamente dal [Node Authorizer] di Kubernetes (https://kubernetes.io/docs/reference/access-authn-authz/node/). + +> I comandi seguenti devono essere eseguiti nella stessa directory utilizzata per generare i certificati SSL durante il laboratorio [Generazione di certificati TLS](lab4-certificate-authority.md). + +Generare un file kubeconfig per i nodi di lavoro node-0 e node-1: + +```bash +for host in node-0 node-1; do + kubectl config set-cluster kubernetes-the-hard-way \ + --certificate-authority=ca.crt \ + --embed-certs=true \ + --server=https://server.kubernetes.local:6443 \ + --kubeconfig=${host}.kubeconfig + + kubectl config set-credentials system:node:${host} \ + --client-certificate=${host}.crt \ + --client-key=${host}.key \ + --embed-certs=true \ + --kubeconfig=${host}.kubeconfig + + kubectl config set-context default \ + --cluster=kubernetes-the-hard-way \ + --user=system:node:${host} \ + --kubeconfig=${host}.kubeconfig + + kubectl config use-context default \ + --kubeconfig=${host}.kubeconfig +done +``` + +Risultati: + +```text +node-0.kubeconfig +node-1.kubeconfig +``` + +### Il file di configurazione di Kubernetes kube-proxy + +Generare un file kubeconfig per il servizio `kube-proxy`: + +```bash + kubectl config set-cluster kubernetes-the-hard-way \ + --certificate-authority=ca.crt \ + --embed-certs=true \ + --server=https://server.kubernetes.local:6443 \ + --kubeconfig=kube-proxy.kubeconfig + + kubectl config set-credentials system:kube-proxy \ + --client-certificate=kube-proxy.crt \ + --client-key=kube-proxy.key \ + --embed-certs=true \ + --kubeconfig=kube-proxy.kubeconfig + + kubectl config set-context default \ + --cluster=kubernetes-the-hard-way \ + --user=system:kube-proxy \ + --kubeconfig=kube-proxy.kubeconfig + + kubectl config use-context default \ + --kubeconfig=kube-proxy.kubeconfig +``` + +Risultati: + +```text +kube-proxy.kubeconfig +``` + +### Il file di configurazione di Kubernetes di kube-controller-manager + +Generare un file kubeconfig per il servizio `kube-controller-manager`: + +```bash + kubectl config set-cluster kubernetes-the-hard-way \ + --certificate-authority=ca.crt \ + --embed-certs=true \ + --server=https://server.kubernetes.local:6443 \ + --kubeconfig=kube-controller-manager.kubeconfig + + kubectl config set-credentials system:kube-controller-manager \ + --client-certificate=kube-controller-manager.crt \ + --client-key=kube-controller-manager.key \ + --embed-certs=true \ + --kubeconfig=kube-controller-manager.kubeconfig + + kubectl config set-context default \ + --cluster=kubernetes-the-hard-way \ + --user=system:kube-controller-manager \ + --kubeconfig=kube-controller-manager.kubeconfig + + kubectl config use-context default \ + --kubeconfig=kube-controller-manager.kubeconfig +``` + +Risultati: + +```text +kube-controller-manager.kubeconfig +``` + +### Il file di configurazione di kube-scheduler Kubernetes + +Generare un file kubeconfig per il servizio `kube-scheduler`: + +```bash + kubectl config set-cluster kubernetes-the-hard-way \ + --certificate-authority=ca.crt \ + --embed-certs=true \ + --server=https://server.kubernetes.local:6443 \ + --kubeconfig=kube-scheduler.kubeconfig + + kubectl config set-credentials system:kube-scheduler \ + --client-certificate=kube-scheduler.crt \ + --client-key=kube-scheduler.key \ + --embed-certs=true \ + --kubeconfig=kube-scheduler.kubeconfig + + kubectl config set-context default \ + --cluster=kubernetes-the-hard-way \ + --user=system:kube-scheduler \ + --kubeconfig=kube-scheduler.kubeconfig + + kubectl config use-context default \ + --kubeconfig=kube-scheduler.kubeconfig +``` + +Risultati: + +```text +kube-scheduler.kubeconfig +``` + +### Il file di configurazione Kubernetes dell'amministratore + +Generare un file kubeconfig per l'utente `admin`: + +```bash + kubectl config set-cluster kubernetes-the-hard-way \ + --certificate-authority=ca.crt \ + --embed-certs=true \ + --server=https://127.0.0.1:6443 \ + --kubeconfig=admin.kubeconfig + + kubectl config set-credentials admin \ + --client-certificate=admin.crt \ + --client-key=admin.key \ + --embed-certs=true \ + --kubeconfig=admin.kubeconfig + + kubectl config set-context default \ + --cluster=kubernetes-the-hard-way \ + --user=admin \ + --kubeconfig=admin.kubeconfig + + kubectl config use-context default \ + --kubeconfig=admin.kubeconfig +``` + +Risultati: + +```text +admin.kubeconfig +``` + +## Distribuire i file di configurazione di Kubernetes + +Copiare i file `kubelet` e `kube-proxy` nelle istanze `node-0` e `node-1`: + +```bash +for host in node-0 node-1; do + ssh root@$host "mkdir /var/lib/{kube-proxy,kubelet}" + + scp kube-proxy.kubeconfig \ + root@$host:/var/lib/kube-proxy/kubeconfig \ + + scp ${host}.kubeconfig \ + root@$host:/var/lib/kubelet/kubeconfig +done +``` + +Copiare i file kubeconfig `kube-controller-manager` e `kube-scheduler` nell'istanza del controller: + +```bash +scp admin.kubeconfig \ + kube-controller-manager.kubeconfig \ + kube-scheduler.kubeconfig \ + root@server:~/ +``` + +Successivo: [Generazione della configurazione e della chiave di crittografia dei dati](lab6-data-encryption-keys.md) diff --git a/docs/labs/kubernetes-the-hard-way/lab6-data-encryption-keys.de.md b/docs/labs/kubernetes-the-hard-way/lab6-data-encryption-keys.de.md new file mode 100644 index 0000000000..2761023c4c --- /dev/null +++ b/docs/labs/kubernetes-the-hard-way/lab6-data-encryption-keys.de.md @@ -0,0 +1,43 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +tags: + - kubernetes + - k8s + - Laborübung +--- + +# Übung 6: Generieren der Datenverschlüsselungskonfiguration und des Schlüssels + +!!! info + + Dies ist ein Fork des ursprünglichen ["Kubernetes the hard way"](https://github.com/kelseyhightower/kubernetes-the-hard-way), das ursprünglich von Kelsey Hightower geschrieben wurde (GitHub: kelseyhightower). Im Gegensatz zum Original, das auf Debian-ähnlichen Distributionen für die ARM64-Architektur basiert, zielt dieser Fork auf Enterprise-Linux-Distributionen wie Rocky Linux ab, das auf der x86_64-Architektur läuft. + +Kubernetes speichert verschiedene Daten, darunter Clusterstatus, Anwendungskonfigurationen und Secrets. Kubernetes ermöglicht die [Verschlüsselung](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data) ruhender Clusterdaten. + +In diesem Labor generieren Sie einen Verschlüsselungsschlüssel und eine [Verschlüsselungskonfiguration](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/#understanding-the-encryption-at-rest-configuration), die zum Verschlüsseln von Kubernetes-Secrets geeignet sind. + +## Der Chiffrierschlüssel + +Generieren Sie einen Verschlüsselungsschlüssel: + +```bash +export ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64) +``` + +## Die Verschlüsselungs-Konfigurations-Datei + +Erstellen Sie die Verschlüsselungskonfigurationsdatei `encryption-config.yaml`: + +```bash +envsubst < configs/encryption-config.yaml \ + > encryption-config.yaml +``` + +Kopieren Sie die Verschlüsselungskonfigurationsdatei `encryption-config.yaml` in jede Controller-Instanz: + +```bash +scp encryption-config.yaml root@server:~/ +``` + +Fortsetzung folgt: [Bootstrapping vom etcd-Cluster](lab7-bootstrapping-etcd.md) diff --git a/docs/labs/kubernetes-the-hard-way/lab6-data-encryption-keys.it.md b/docs/labs/kubernetes-the-hard-way/lab6-data-encryption-keys.it.md new file mode 100644 index 0000000000..d36808783a --- /dev/null +++ b/docs/labs/kubernetes-the-hard-way/lab6-data-encryption-keys.it.md @@ -0,0 +1,43 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +tags: + - kubernetes + - k8s + - lab exercise +--- + +# Laboratorio 6: Generazione della configurazione e della chiave di crittografia dei dati + +!!! info + + Si tratta di un fork dell'originale ["Kubernetes the hard way"](https://github.com/kelseyhightower/kubernetes-the-hard-way) scritto originariamente da Kelsey Hightower (GitHub: kelseyhightower). A differenza dell'originale, che si basa su distribuzioni simili a Debian per l'architettura ARM64, questo fork si rivolge a distribuzioni Enterprise Linux come Rocky Linux, che gira su architettura x86_64. + +Kubernetes memorizza vari dati, tra cui lo stato del cluster, le configurazioni delle applicazioni e i dati segreti. Kubernetes consente di [crittografare](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data) i dati del cluster inattivi. + +In questo laboratorio, genererai una chiave di crittografia e una [configurazione di crittografia](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/#understanding-the-encryption-at-rest-configuration) adatta alla crittografia dei dati segreti Kubernetes. + +## La chiave di crittografia + +Generare una chiave di crittografia: + +```bash +export ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64) +``` + +## Il file di configurazione della crittografia + +Creare il file di configurazione della crittografia `encryption-config.yaml`: + +```bash +envsubst < configs/encryption-config.yaml \ + > encryption-config.yaml +``` + +Copiare il file di configurazione della crittografia `encryption-config.yaml` su ciascuna istanza del controller: + +```bash +scp encryption-config.yaml root@server:~/ +``` + +Successivo: [Avvio del cluster etcd](lab7-bootstrapping-etcd.md) diff --git a/docs/labs/kubernetes-the-hard-way/lab7-bootstrapping-etcd.it.md b/docs/labs/kubernetes-the-hard-way/lab7-bootstrapping-etcd.it.md new file mode 100644 index 0000000000..57d10c6c30 --- /dev/null +++ b/docs/labs/kubernetes-the-hard-way/lab7-bootstrapping-etcd.it.md @@ -0,0 +1,96 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +tags: + - kubernetes + - k8s + - lab exercise +--- + +# Laboratorio 7: Avvio del cluster `etcd` + +!!! info + + Si tratta di un fork dell'originale ["Kubernetes the hard way"](https://github.com/kelseyhightower/kubernetes-the-hard-way) scritto originariamente da Kelsey Hightower (GitHub: kelseyhightower). A differenza dell'originale, che si basa su distribuzioni simili a Debian per l'architettura ARM64, questo fork si rivolge a distribuzioni Enterprise Linux come Rocky Linux, che gira su architettura x86_64. + +I componenti di Kubernetes sono stateless e memorizzano lo stato del cluster in [etcd](https://github.com/etcd-io/etcd). In questo laboratorio si avvierà un cluster a tre nodi `etcd` e lo si configurerà per l'alta disponibilità e l'accesso remoto sicuro. + +## Prerequisiti + +Copiare i binari di `etcd` e i file dell'unità `systemd` nell'istanza `server`: + +```bash +scp \ + downloads/etcd-v3.4.36-linux-amd64.tar.gz \ + units/etcd.service \ + root@server:~/ +``` + +Eseguire i comandi nelle sezioni seguenti di questo laboratorio sul computer `server`. Accedere alla macchina `server` con il comando `ssh`. Esempio: + +```bash +ssh root@server +``` + +## Avvio di un Cluster etcd + +### Installare i binari di etcd + +Se non è già installato, installare prima l'utilità `tar` con `dnf`. Quindi, estrarre e installare il server `etcd` e l'utilità a riga di comando `etcdctl`: + +```bash + dnf -y install tar + tar -xvf etcd-v3.4.36-linux-amd64.tar.gz + mv etcd-v3.4.36-linux-amd64/etcd* /usr/local/bin/ +``` + +### Configurare il Server etcd + +```bash + mkdir -p /etc/etcd /var/lib/etcd + chmod 700 /var/lib/etcd + cp ca.crt kube-api-server.key kube-api-server.crt \ + /etc/etcd/ +``` + +Ogni membro di `etcd` deve avere un nome unico all'interno di un cluster `etcd`. Impostare il nome `etcd` in modo che corrisponda al nome host dell'istanza di calcolo corrente: + +Crea il file dell'unità `systemd` `etcd.service`: + +```bash +mv etcd.service /etc/systemd/system/ +chmod 644 /etc/systemd/system/etcd.service +``` + +!!! note "Nota" + + Sebbene sia considerata una forma di sicurezza inadeguata, potrebbe essere necessario disabilitare temporaneamente o permanentemente SELinux se si riscontrano problemi nell'avvio del servizio `etcd` `systemd`. La soluzione corretta consiste nell'analizzare e creare i file di policy necessari con strumenti quali `ausearch`, `audit2allow` e altri.\ + + I comandi eliminano SELinux e lo disabilitano eseguendo quanto segue: + + ```bash + sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config + setenforce 0 + ``` + +### Avviare il Server `etcd` + +```bash + systemctl daemon-reload + systemctl enable etcd + systemctl start etcd +``` + +## Verifica + +Elencare i membri del cluster `etcd`: + +```bash +etcdctl member list +``` + +```text +6702b0a34e2cfd39, started, controller, http://127.0.0.1:2380, http://127.0.0.1:2379, false +``` + +Successivo: [Avvio del piano di controllo Kubernetes](lab8-bootstrapping-kubernetes-controllers.md) diff --git a/docs/labs/kubernetes-the-hard-way/lab8-bootstrapping-kubernetes-controllers.it.md b/docs/labs/kubernetes-the-hard-way/lab8-bootstrapping-kubernetes-controllers.it.md new file mode 100644 index 0000000000..f112a00ccf --- /dev/null +++ b/docs/labs/kubernetes-the-hard-way/lab8-bootstrapping-kubernetes-controllers.it.md @@ -0,0 +1,187 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +tags: + - kubernetes + - k8s + - lab exercise + - kubectl + - etcd + - runc +--- + +# Laboratorio 8: Avvio del piano di controllo Kubernetes + +!!! info + + Si tratta di un fork dell'originale ["Kubernetes the hard way"](https://github.com/kelseyhightower/kubernetes-the-hard-way) scritto originariamente da Kelsey Hightower (GitHub: kelseyhightower). A differenza dell'originale, che si basa su distribuzioni simili a Debian per l'architettura ARM64, questo fork si rivolge a distribuzioni Enterprise Linux come Rocky Linux, che gira su architettura x86_64. + +In questo laboratorio, verrà avviato il piano di controllo Kubernetes. Sulla macchina controller verranno installati i seguenti componenti: Kubernetes API Server, Scheduler e Controller Manager. + +## Prerequisiti + +Connettersi alla `jumpbox` e copiare i file binari di Kubernetes e i file di unità `systemd` sull'istanza `server`: + +```bash +scp \ + downloads/kube-apiserver \ + downloads/kube-controller-manager \ + downloads/kube-scheduler \ + downloads/kubectl \ + units/kube-apiserver.service \ + units/kube-controller-manager.service \ + units/kube-scheduler.service \ + configs/kube-scheduler.yaml \ + configs/kube-apiserver-to-kubelet.yaml \ + root@server:~/ +``` + +È necessario eseguire i comandi riportati nelle sezioni seguenti di questo laboratorio sul computer `server`. Accedi all'istanza del controller con il comando `ssh`. Esempio: + +```bash +ssh root@server +``` + +## Fornitura del piano di controllo Kubernetes + +Crea la directory di configurazione di Kubernetes: + +```bash +mkdir -p /etc/kubernetes/config +``` + +### Installazione dei binari del controller Kubernetes + +Installare i binari Kubernetes: + +```bash + chmod +x kube-apiserver \ + kube-controller-manager \ + kube-scheduler kubectl + + mv kube-apiserver \ + kube-controller-manager \ + kube-scheduler kubectl \ + /usr/local/bin/ +``` + +### Configurazione del server API Kubernetes + +```bash + mkdir -p /var/lib/kubernetes/ + + mv ca.crt ca.key \ + kube-api-server.key kube-api-server.crt \ + service-accounts.key service-accounts.crt \ + encryption-config.yaml \ + /var/lib/kubernetes/ +``` + +Creare il file dell'unità `systemd` `kube-apiserver.service`: + +```bash +mv kube-apiserver.service /etc/systemd/system/kube-apiserver.service +``` + +### Configurazione del Kubernetes Controller Manager + +Spostare il kubeconfig `kube-controller-manager` nella posizione corretta: + +```bash +mv kube-controller-manager.kubeconfig /var/lib/kubernetes/ +``` + +Creare il file dell'unità `systemd` `kube-controller-manager.service`: + +```bash +mv kube-controller-manager.service /etc/systemd/system/ +``` + +### Configurazione del scheduler Kubernetes + +Spostare il kubeconfig `kube-scheduler` nella posizione corretta: + +```bash +mv kube-scheduler.kubeconfig /var/lib/kubernetes/ +``` + +Creare il file di configurazione `kube-scheduler.yaml`: + +```bash +mv kube-scheduler.yaml /etc/kubernetes/config/ +``` + +Creare il file dell'unità systemd `kube-scheduler.service`: + +```bash +mv kube-scheduler.service /etc/systemd/system/ +``` + +### Avvio dei servizi del controller + +```bash + systemctl daemon-reload + + systemctl enable kube-apiserver \ + kube-controller-manager kube-scheduler + + systemctl start kube-apiserver \ + kube-controller-manager kube-scheduler +``` + +> Attendere fino a 10 secondi affinché il server API Kubernetes completi l'inizializzazione. + +### Verifica + +```bash +kubectl cluster-info --kubeconfig admin.kubeconfig +``` + +```text +Kubernetes control plane is running at https://127.0.0.1:6443 +``` + +## RBAC per l'autorizzazione Kubelet + +In questa sezione si configurano le autorizzazioni RBAC per consentire al server API Kubernetes di accedere all'API Kubelet su ciascun nodo di lavoro. È necessario accedere all'API Kubelet per recuperare metriche e log ed eseguire comandi nei pod. + +> Questo tutorial imposta il flag Kubelet `--authorization-mode` su `Webhook`. La modalità `Webhook` utilizza l'API [SubjectAccessReview](https://kubernetes.io/docs/reference/kubernetes-api/authorization-resources/subject-access-review-v1/) per determinare l'autorizzazione. + +Eseguire i comandi riportati in questa sezione sul nodo controller, che interessano l'intero cluster. + +```bash +ssh root@server +``` + +Creare il `system:kube-apiserver-to-kubelet` [ClusterRole](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#role-and-clusterrole) con le autorizzazioni per accedere all'API Kubelet ed eseguire le attività più comuni associate alla gestione dei pod: + +```bash +kubectl apply -f kube-apiserver-to-kubelet.yaml \ + --kubeconfig admin.kubeconfig +``` + +### Verifica RBAC + +A questo punto, il piano di controllo Kubernetes è attivo e funzionante. Eseguire i seguenti comandi dalla macchina `jumpbox` per verificare che funzioni: + +Effettuare una richiesta HTTP per ottenere le informazioni sulla versione di Kubernetes: + +```bash +curl -k --cacert ca.crt https://server.kubernetes.local:6443/version +``` + +```text +{ + "major": "1", + "minor": "32", + "gitVersion": "v1.32.0", + "gitCommit": "70d3cc986aa8221cd1dfb1121852688902d3bf53", + "gitTreeState": "clean", + "buildDate": "2024-12-11T17:59:15Z", + "goVersion": "go1.23.3", + "compiler": "gc", + "platform": "linux/amd64" +} +``` + +Successivo: [Avvio dei nodi worker di Kubernetes](lab9-bootstrapping-kubernetes-workers.md) diff --git a/docs/labs/kubernetes-the-hard-way/lab9-bootstrapping-kubernetes-workers.it.md b/docs/labs/kubernetes-the-hard-way/lab9-bootstrapping-kubernetes-workers.it.md new file mode 100644 index 0000000000..4843fc7206 --- /dev/null +++ b/docs/labs/kubernetes-the-hard-way/lab9-bootstrapping-kubernetes-workers.it.md @@ -0,0 +1,203 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +tags: + - kubernetes + - k8s + - lab exercise + - runc + - containerd + - etcd + - kubectl +--- + +# Laboratorio 9: Avvio dei nodi di lavoro Kubernetes + +!!! info + + Si tratta di un fork dell'originale ["Kubernetes the hard way"](https://github.com/kelseyhightower/kubernetes-the-hard-way) scritto originariamente da Kelsey Hightower (GitHub: kelseyhightower). A differenza dell'originale, che si basa su distribuzioni simili a Debian per l'architettura ARM64, questo fork si rivolge a distribuzioni Enterprise Linux come Rocky Linux, che gira su architettura x86_64. + +In questo laboratorio, si avvierà il bootstrap di due nodi di lavoro Kubernetes. Si installeranno i seguenti componenti: [runc](https://github.com/opencontainers/runc), [plugin di rete per container](https://github.com/containernetworking/cni), [containerd](https://github.com/containerd/containerd), [kubelet](https://kubernetes.io/docs/ reference/command-line-tools-reference/kubelet/), e [kube-proxy](https://kubernetes.io/docs/concepts/cluster-administration/proxies). + +## Prerequisiti + +Dal `jumpbox`, copiare i file binari di Kubernetes e i file unit di `systemd` su ciascuna istanza di lavoro: + +```bash +for host in node-0 node-1; do + SUBNET=$(grep $host machines.txt | cut -d " " -f 5) + sed "s|SUBNET|$SUBNET|g" \ + configs/10-bridge.conf > 10-bridge.conf + + sed "s|SUBNET|$SUBNET|g" \ + configs/kubelet-config.yaml > kubelet-config.yaml + + scp 10-bridge.conf kubelet-config.yaml \ + root@$host:~/ +done +``` + +```bash +for host in node-0 node-1; do + scp \ + downloads/runc.amd64 \ + downloads/crictl-v1.32.0-linux-amd64.tar.gz \ + downloads/cni-plugins-linux-amd64-v1.6.2.tgz \ + downloads/containerd-2.0.3-linux-amd64.tar.gz \ + downloads/kubectl \ + downloads/kubelet \ + downloads/kube-proxy \ + configs/99-loopback.conf \ + configs/containerd-config.toml \ + configs/kubelet-config.yaml \ + configs/kube-proxy-config.yaml \ + units/containerd.service \ + units/kubelet.service \ + units/kube-proxy.service \ + root@$host:~/ +done +``` + +I comandi in questo laboratorio devono essere eseguiti separatamente su ciascuna istanza di lavoro: `node-0` e `node-1`. Vengono mostrati solo i passaggi relativi a `node-0`. È necessario ripetere esattamente gli stessi passaggi e comandi su `node-1`. + +Accedere all'istanza di lavoro `node-0` con il comando `ssh`. + +```bash +ssh root@node-0 +``` + +## Fornitura ad un nodo di lavoro Kubernetes + +Installare le dipendenze del sistema operativo: + +```bash + dnf -y update + dnf -y install socat conntrack ipset tar +``` + +> Il binario `socat` supporta il comando `kubectl port-forward`. + +### Disattivazione della swap + +Se hai abilitato la [swap](https://help.ubuntu.com/community/SwapFaq), il kubelet non riuscirà ad avviarsi. Si [consiglia di disabilitare lo swap](https://github.com/kubernetes/kubernetes/issues/7294) per garantire che Kubernetes fornisca una corretta allocazione delle risorse e una qualità del servizio adeguata. + +Verificare se la swap è attiva: + +```bash +swapon --show +``` + +Se l'output è vuoto, la swap non è abilitata. Se l'output non è vuoto, eseguire il seguente comando per disabilitare immediatamente la swap: + +```bash +swapoff -a +``` + +Per garantire che la swap rimanga disattivata dopo il riavvio, commentare la riga che monta automaticamente il volume di swap nel file `/etc/fstab`. Digitare: + +```bash +sudo sed -i '/swap/s/^/#/' /etc/fstab +``` + +Creare le directory di installazione: + +```bash +mkdir -p \ + /etc/cni/net.d \ + /opt/cni/bin \ + /var/lib/kubelet \ + /var/lib/kube-proxy \ + /var/lib/kubernetes \ + /var/run/kubernetes +``` + +Installare i binari di lavoro: + +```bash + mkdir -p containerd + tar -xvf crictl-v1.32.0-linux-amd64.tar.gz + tar -xvf containerd-2.0.3-linux-amd64.tar.gz -C containerd + tar -xvf cni-plugins-linux-amd64-v1.6.2.tgz -C /opt/cni/bin/ + mv runc.amd64 runc + chmod +x crictl kubectl kube-proxy kubelet runc + mv crictl kubectl kube-proxy kubelet runc /usr/local/bin/ + mv containerd/bin/* /bin/ +``` + +### Configurazione della rete CNI + +Creare il file di configurazione di rete `bridge`: + +```bash +mv 10-bridge.conf 99-loopback.conf /etc/cni/net.d/ +``` + +### Configurazione di `containerd` + +Installare i file di configurazione `containerd`: + +```bash + mkdir -p /etc/containerd/ + mv containerd-config.toml /etc/containerd/config.toml + mv containerd.service /etc/systemd/system/ +``` + +### Configurazione di Kubelet + +Creare il file di configurazione `kubelet-config.yaml`: + +```bash + mv kubelet-config.yaml /var/lib/kubelet/ + mv kubelet.service /etc/systemd/system/ +``` + +### Configurazione del proxy Kubernetes + +```bash + mv kube-proxy-config.yaml /var/lib/kube-proxy/ + mv kube-proxy.service /etc/systemd/system/ +``` + +!!! note "Nota" + + Sebbene questa sia considerata una forma di sicurezza inadeguata, potrebbe essere necessario disabilitare temporaneamente o permanentemente SELinux se si riscontrano problemi nell'avvio dei servizi systemd necessari. La soluzione corretta consiste nell'analizzare e creare i file di policy richiesti utilizzando strumenti quali ausearch, audit2allow, ecc.\ + + Per rimuovere SELinux e disabilitarlo, eseguire quanto segue: + + ```bash + sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config + setenforce 0 + ``` + +### Avvio dei servizi di lavoro + +```bash + systemctl daemon-reload + systemctl enable containerd kubelet kube-proxy + systemctl start containerd kubelet kube-proxy +``` + +## Verifica + +Le istanze di calcolo create in questo tutorial non avranno l'autorizzazione per completare questa sezione di verifica. Eseguire i seguenti comandi dalla macchina `jumpbox`. + +Elencare i nodi Kubernetes registrati: + +```bash +ssh root@server "kubectl get nodes --kubeconfig admin.kubeconfig" +``` + +```text +NAME STATUS ROLES AGE VERSION +node-0 Ready 1m v1.32.0 +``` + +Dopo aver completato tutti i passaggi precedenti in questo laboratorio sia su `node-0` che su `node-1`, l'output del comando `kubectl get nodes` dovrebbe mostrare: + +```text +NAME STATUS ROLES AGE VERSION +node-0 Ready 1m v1.32.0 +node-1 Ready 10s v1.32.0 +``` + +Successivo: [Configurazione di kubectl per l'accesso remoto](lab10-configuring-kubectl.md) diff --git a/docs/labs/systems_administration_I/lab3-system_utilities.it.md b/docs/labs/systems_administration_I/lab3-system_utilities.it.md new file mode 100644 index 0000000000..a7d2456d94 --- /dev/null +++ b/docs/labs/systems_administration_I/lab3-system_utilities.it.md @@ -0,0 +1,983 @@ +- - - +author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: All Versions tags: + - lab exercise + - system utilities + - cli +- - - + +# Laboratorio 3: Utilità di sistema comuni + +## Obiettivi + +Dopo aver completato questo laboratorio, sarete in grado di + +- Utilizzare le utilità di sistema comuni presenti sulla maggior parte dei sistemi Linux + +Tempo stimato per completare questo laboratorio: 70 minuti + +## Utilità di sistema comuni presenti nei sistemi Linux + +Gli esercizi di questo laboratorio riguardano l'utilizzo di alcune utilità di sistema di base che sia gli utenti che gli amministratori devono conoscere bene. La maggior parte dei comandi viene utilizzata per navigare e manipolare il file system. Il file system è costituito da file e directory. + +Gli esercizi tratteranno l'utilizzo delle utilità –`pwd`, `cd`, `ls`, `rm`, `mv`, `ftp`, `cp`, `touch`, `mkdir`, `file`, `cat`, `find`, e `locate`. + +## Esercizio 1 + +### `cd` + +Il comando `cd` sta per cambia directory. Inizierete questi laboratori passando ad altre directory sul file system. + +#### Per utilizzare `cd` + +1. Accedere al computer come root + +2. Passare dalla directory corrente alla directory /etc. + + ```bash + [root@localhost root]# cd /etc + ``` + +3. Si noti che il prompt è cambiato da "[root@localhost root]#" a: "[root@localhost etc]#" + +4. Passare alla directory `/usr/local/` + + ```bash + [root@localhost etc]# cd /usr/local + + [root@localhost local]# + ``` + + !!! question "Domanda" + + Cosa è cambiato nel tuo prompt? + +5. Tornare alla directory home di root + + ```bash + [root@localhost local]# cd /root + ``` + +6. Passare nuovamente alla directory /usr/local/. Digitare: + + ```bash + [root@localhost root]# cd /usr/local + ``` + +7. Per passare alla directory principale della directory locale, digitare "cd ..". + + ```bash + [root@localhost local]# cd .. + ``` + + !!! question "Domanda" + + Qual è la directory principale della directory /usr/local/? + +8. Per tornare rapidamente alla directory home di root, digitare "cd" senza alcun argomento. + + ```bash + [root@localhost usr]# cd + + [root@localhost root]# + ``` + +## Esercizio 2 + +### `pwd` + +Il comando `pwd` sta per "directory di lavoro corrente". Mostra la posizione in cui ti trovi nel file system. + +#### Per utilizzare `pwd` + +1. Per scoprire la vostra directory di lavoro attuale, digitare: + + ```bash + [root@localhost root]# pwd + /root + ``` + +2. Passare alla directory /usr/local/ utilizzando il comando "cd": + + ```bash + [root@localhost root]# cd /usr/local + ``` + +3. Utilizzare `pwd` per trovare la vostra directory di lavoro attuale: + + ```bash + [root@localhost local]# pwd + /usr/local + ``` + +4. Tornare alla directory home di root: + + ```bash + [root@localhost root]# cd + ``` + +## Esercizio 3 + +### `mkdir` + +Il comando `mkdir` viene utilizzato per creare directory. Si creeranno due directory chiamate "folder1" e "folder2". + +#### Per utilizzare `mkdir` + +1. Digitare: + + ```bash + [root@localhost root]# mkdir folder1 + ``` + +2. Crea una seconda directory chiamata folder2 + + ```bash + [root@localhost root]# mkdir folder2 + ``` + +3. Ora cambiate la vostra directory di lavoro nella directory “folder1” che avete creato sopra. + + ```bash + [root@localhost root]# cd folder1 + ``` + +4. Visualizzare la directory di lavoro corrente. + + ```bash + [root@localhost folder1]# pwd + /root/folder1 + ``` + + !!! question "Domanda" + + Senza uscire dalla directory corrente, passare alla directory “folder2”. Qual è il comando per farlo? + +5. Tornare alla directory home di root. + +## Esercizio 4 + +### `touch` + +Il comando `touch` può essere utilizzato per creare file ordinari. Verranno creati i file “file11, file12, file21 e file22” nelle cartelle create sopra. + +#### Per utilizzare `touch` + +1. Cambiare directory, ovvero `cd` alla folder1 e creare il "file11:" + + ```bash + [root@localhost folder1]# touch file11 + ``` + +2. Mentre si è ancora nella folder1, creare “file12:” + + ```bash + [root@localhost folder1]# touch file12 + ``` + +3. Ora ritornare alla directory home di root. + +4. `cd` nella folder2 e creare "file21" e "file22" + + ```bash + [root@localhost folder2]# Touch file21 file22 + ``` + +5. Tornare alla directory home di root. + +## Esercizio 5 + +### `ls` + +Il comando `ls` sta per lista. Elenca il contenuto di una directory. + +#### Per utilizzare `ls` + +1. Digitare `ls` nella directory home di root: + + ```bash + [root@localhost root]# ls + ``` + + !!! question "Domanda" + + Elenca il contenuto della directory + +2. Passare alla directory "folder1" + +3. Elencare il contenuto della directory "folder1". Digitare `ls` + + ```bash + [root@localhost folder1]# ls + file11 file12 + ``` + +4. Passare alla directory "folder2" ed elencare il suo contenuto: + +5. Tornare alla directory home ed elencare "tutti" i file e le cartelle nascosti: + + ```bash + [root@localhost folder2]# cd + + [root@localhost root]# ls –a + .. .bash_history .bash_logout .bash_profile .bashrc folder1 folder2 .gtkrc .kde screenrc + ``` + +6. Per ottenere un elenco lungo o dettagliato di tutti i file e le cartelle presenti nella directory home, digitare: + + ```bash + [root@localhost root]# ls –al + total 44 + + drwx------ 5 root root 4096 May 8 10:15 . + + drwxr-xr-x 8 root root 4096 May 8 09:44 .. + + -rw------- 1 root root 43 May 8 09:48 .bash_history + + -rw-r--r-- 1 root root 24 May 8 09:44 .bash_logout + + -rw-r--r-- 1 root root 191 May 8 09:44 .bash_profile + + -rw-r--r-- 1 root root 124 May 8 09:44 .bashrc + + drwxrwxr-x 2 root root 4096 May 8 10:17 folder1 + + drwxrwxr-x 2 root root 4096 May 8 10:18 folder2 + + ……………………….. + ``` + +## Esercizio 6 + +### `mv` + +Il comando `mv` sta per muovere. Rinomina file o directory. Può anche spostare i file. + +#### Per utilizzare `mv` + +1. Passare alla directory "folder1" ed elencare il suo contenuto: + + ```bash + [root@localhost root]# cd folder1 + [root@localhost folder1] ls + + file11 file12 + ``` + +2. Si rinomineranno i file file11 e file12 nella directory “folder1” rispettivamente in temp_file11 e temp_file12: + + ```bash + [root@localhost folder1]# mv file11 temp_file11 + ``` + +3. Elencare nuovamente il contenuto della folder1. + + ```bash + [root@localhost folder1]# ls + ``` + + !!! question "Domanda" + + Annotare i contenuti: + +4. Rinominare il file12 in temp_file12: + + ```bash + [root@localhost folder1]# mv file12 temp_file12 + ``` + +5. Senza cambiare directory, rinominare il file21 e il file22 nella "folder2" rispettivamente in temp_file21 e temp_file22: + + ```bash + [root@localhost folder1]# mv /root/folder2/file21 /root/folder2/temp_file21 + + [root@localhost folder1]# mv /root/folder2/file22 /root/folder2/temp_file22 + ``` + +6. Senza cambiare la directory corrente, elencare il contenuto della folder2. + + !!! question "Domanda" + + Qual è il comando per farlo? Elencare anche l'output del comando? + +## Esercizio 7 + +### `cp` + +Il comando `cp` sta per copia. Crea copie di file o cartelle. + +1. Cambiare la vostra directory nella directory "folder2". + +2. Copiare il contenuto della "folder2" (temp_file21 e temp_file22) nella "folder1:" + + ```bash + [root@localhost folder2]# cp temp_file21 temp_file22 ../folder1 + ``` + +3. Elencare il contenuto della folder1. + + ```bash + [root@localhost folder2]# ls ../folder1 + temp_file11 temp_file12 temp_file21 temp_file22 + ``` + +4. Elencare il contenuto della folder2. Si noti che le copie originali di temp_file21 e temp_file22 rimangono nella folder2. + + ```bash + [root@localhost folder2]# ls + temp_file21 temp_file22 + ``` + +## Esercizio 8 + +### `file` + +L'utilità `file` viene utilizzata per determinare i tipi di file o directory. + +#### Per utilizzare `file` + +1. Tornare alla directory home. + +2. Per vedere se "folder1" è un file o una directory, digitare: + + ```bash + [root@localhost root]# file folder1 + folder1: directory + ``` + +3. Passare alla folder1 + +4. Utilizzare l'utilità `file` per determinare il tipo di file per temp_file11: + + ```bash + [root@localhost folder1]# file temp_file11 + temp_file11: empty + ``` + +5. Utilizzare l'utilità `file` per scoprire il tipo di file di tutti i file presenti nella folder1. Elenco qui: + +6. Passare alla cartella /etc: + + ```bash + [root@localhost folder1]# cd /etc + ``` + +7. Utilizzare l'utilità `file` per scoprire il tipo di file del file "passwd". + + ```bash + [root@localhost etc]# file passwd + ``` + + !!! question "Domanda" + + Di che tipo di file si tratta? + +## Esercizio 9 + +### `cat` + +Il comando `cat` è l'abbreviazione di concatenate, cioè mettere insieme i file. Il comando `cat` visualizza anche il contenuto di un intero file sullo schermo. Si utilizzerà `cat` insieme al simbolo di reindirizzamento ">" per creare un file. + +#### Per usare `cat` per creare un file + +1. Passare alla directory /root/folder1 + +2. Creare un nuovo file di testo chiamato "first.txt" + + ```bash + [root@localhost folder1]# cat > first.txt + ``` + +3. Digitare la frase seguente nel prompt vuoto e premere ++enter++. + + ```bash + Questa è una riga di first.txt !! + ``` + +4. Premere contemporaneamente i tasti ++ctrl+c++. + +5. Digitare "cat first.txt" per leggere il testo appena digitato: + + ```bash + [root@localhost folder1]# cat first.txt + Questa è una riga di first.txt !! + ``` + +6. Creare un altro file chiamato "second.txt" utilizzando `cat`. Digitare il seguente testo nel file – “Questa è una riga di second.txt !!” + + !!! question "Domanda" + + Qual è il comando per farlo? + +#### Per usare `cat` per concatenare insieme i file + +1. Si concatenaneranno i file "first.txt" e "second.txt". Digitare: + + ```bash + [root@localhost folder1]# cat first.txt second.txt + ``` + + !!! question "Domanda" + + Qual è il vostro risultato? + +## Esercizio 10 + +### `ftp` + +`ftp` è un programma client per l'utilizzo e la connessione ai servizi FTP tramite il File Transfer Protocol. Il programma consente agli utenti di trasferire file da e verso un sito di rete remoto. Si tratta di un'utility che potrebbe essere utilizzata spesso. + +In questo esercizio imparerete ad accedere in modo anonimo a un server FTP e a scaricare un file dal server utilizzando un programma client `ftp`. + +!!! note "Nota" + + Per poter seguire questo esercizio specifico, che richiede un server FTP disponibile e raggiungibile, è necessario aver completato gli esercizi del laboratorio precedente. + +#### Per utilizzare `ftp` + +1. Accedere al computer come root + +2. Passare alla directory "/usr/local/src/" + +3. Creare una nuova directory chiamata "downloads" nella directory "/usr/local/src/". + + !!! question "Domanda" + + Qual è il comando per farlo? + +4. Passa alla directory "downloads" appena creata + + ```bash + [root@localhost src]# cd downloads + ``` + +5. Digitare "ftp" per avviare il client `ftp`: + + ```bash + [root@localhost downloads]# ftp + ftp> + ``` + +6. Per connettersi al server FTP, digitare: + + ```bash + ftp> open < server-address> (Obtain the from your instructor) + ……… + + 220 localhost.localdomain FTP server (Version wu-2.6.2-5) ready. + ……….. + ``` + +7. Accedere come utente anonimo. Digitare "anonymous" al prompt: + + ```bash + Name (10.4.51.29:root): anonymous + ``` + +8. Digitare un indirizzo e-mail qualsiasi alla richiesta della password e premere Invio + + ```bash + Password: *************** + + 230 Guest login ok, access restrictions apply. + + Remote system type is UNIX. + + Using binary mode to transfer files. + + ftp> + ``` + +9. Passare alla modalità binaria. Digitare: + + ```bash + ftp> binary + ``` + + !!! question "Domanda" + + Qual è l'output del comando binario e cos'è la modalità binaria “modalità binaria”? + +10. Elencare le directory correnti sul server ftp. Digitare "ls" al prompt ftp. (ftp>): + + ```bash + ftp> ls + 227 Entering Passive Mode (10,0,4,5,16,103). + 125 Data connection already open; Transfer starting. + 11-23-43 10:23PM

    images + 11-02-43 02:20PM pub + 226 Transfer complete. + ``` + +11. Passare alla directory "pub". Digitare: + + ```bash + ftp> cd pub + ``` + +12. Utilizzare il comando "ls" per elencare i file e le directory presenti nella directory "pub" + + !!! question "Domanda" + + Quanti file e directory ci sono adesso? + +13. Scaricare il file denominato "hello-2.1.1.tar.gz" nella directory locale. Digitare "yes" quando richiesto. + + ```bash + ftp> mget hello-2.1.1.tar.gz + mget hello-2.1.1.tar.gz? yes + + 227 Entering Passive Mode (10,0,4,5,16,252). + + 125 Data connection already open; Transfer starting. + + 226 Transfer complete. + + 389363 bytes received in 0.0745 secs (5.1e+03 Kbytes/sec) + ``` + +14. Disconnettersi dal server FTP e chiudere il client `ftp`. Digitare: + + ```bash + ftp> bye + ``` + +15. Verrai reindirizzato alla tua shell locale. + +16. Assicurati di trovarti ancora nella directory "download" del tuo computer locale. + + !!! question "Domanda" + + Elencare i file nella cartella dei downloads. + +## Esercizio 11 + +### Utilizzo del reindirizzamento + +La maggior parte delle utility e dei comandi utilizzati in Linux inviano il loro output allo schermo. Lo schermo è chiamato output standard (stdout). Il reindirizzamento consente di inviare l'output altrove – ad esempio in un file. + +Ogni programma avviato su un sistema Linux ha tre descrittori di file aperti: stdin (0), stdout (1) e stderr (2). È possibile reindirizzarli o convogliarli individualmente tramite "pipe". I simboli di reindirizzamento sono ">, < " + +#### Per utilizzare il reindirizzamento + +1. Assicurarsi di essere ancora nella directory folder1. + +2. Si utilizzerà il reindirizzamento dell'output per reindirizzare l'output del comando ls (elenco) a un file di testo denominato myredirects: + + ```bash + [root@localhost folder1]# ls > myredirects + ``` + +3. Esaminare il contenuto del nuovo file (myredirects) creato nella directory folder1. + + ```bash + [root@localhost folder1] # cat myredirects + temp_file11 temp_file12 temp_file21 temp_file22 myredirects + ``` + +4. Ora il risultato del comando file verrà reindirizzato nello stesso file. Si vuole scoprire il tipo di file per temp_file11 nella directory folder1 e inviare l'output al file myredirects: + + ```bash + [root@localhost folder1]# file temp_file11 > myredirects + ``` + +5. Esaminare il contenuto del file myredirects. + + !!! question "Domanda" + + È cambiato. Cos'è successo? + +6. Se si vuole evitare che si verifichi quanto sopra, si utilizzerà il doppio simbolo di reindirizzamento “>>”. Questo aggiungerà (appenderà) il nuovo output al file invece di sostituirlo. Fate una prova: + + ```bash + [root@localhost folder1]# ls >> myredirects + ``` + +7. Ora esaminare nuovamente il contenuto del file myredirects utilizzando `cat`. + + !!! question "Domanda" + + Scrivi qui il suo contenuto: + +### Utilizzo del reindirizzamento per sopprimere l'output di un comando + +I concetti trattati in questa sezione saranno molto utili in Linux, quindi ti invitiamo a prestare particolare attenzione. Può essere un po' complicato. + +Ci saranno momenti in cui non vorrai che l'utente veda l'output di un comando, ad esempio un messaggio di errore. Questo accade solitamente perché i messaggi di errore strani spesso spaventano gli utenti abituali. In questo esercizio si invierà l'output tuoi comandi al dispositivo nullo ( /dev/null/ ). Il dispositivo nullo è come un "bit bucket". Tutto ciò che metti dentro scompare per sempre. È anche possibile inviare (o reindirizzare) l'output regolare dei comandi al dispositivo nullo "null device". + +Utilizzare le linee guida riportate di seguito: + +```bash +|Redirector|

    Function

    | +| :- | :- | +|> file|Indirizza l'output standard su un file| +|< file|Prende l'input standard dal file| +|Cmd1 | cmd2|Pipe; prende lo standard out da cmd1 come input standard per cmd2| +|n> file|Descritore di file n a file| +|N< file|Imposta il file come descrittore di file n| +|>&n|Duplica l'output standard nel descrittore di file n| +|<&n|Duplica l'input standard dal descrittore di file n| +|&>file|Indirizza l'output standard e l'errore standard al file| + +``` + +1. Assicurarsi di essere ancora nella directory folder1. Utilizzare l'opzione di elenco esteso del comando ls su temp_file11: + + ```bash + [root@localhost folder1]# ls –l temp_file11 + -rw-r--r-- 1 root root 0 Jul 26 18:26 temp_file11 + ``` + +2. Reindirizzare l'output dello stesso comando sopra riportato (ls –l temp_file11) al dispositivo nullo. + + ```bash + [root@localhost folder1]# ls –l temp_file11 > /dev/null + ``` + + Non si dovrebbe ottenere alcun risultato. + +3. Ora, se per sbaglio viene digitato in modo errato il nome del file di cui si desidera visualizzare le informazioni, verrà visualizzato il seguente messaggio: + + ```bash + [root@localhost folder1]# ls –l te_file1 + ls: te_file1: No such file or directory + ``` + + Quanto sopra è il risultato del tipo di errore che il comando `ls` ha programmato di restituire. + +4. Eseguire lo stesso comando di cui sopra con un nome file scritto in modo errato e reindirizzarlo a /dev/null + + ```bash + [root@localhost folder1]# ls -l te_file1 > /dev/null + + ls: te_file1: No such file or directory + ``` + + !!! question "Domanda" + + Cosa è successo qui? Perché l'output continuava a essere visualizzato sullo schermo (stdout)? + +5. Per vari motivi potresti voler sopprimere messaggi di errore come quello sopra riportato. Per farlo, digitare: + + ```bash + [root@localhost folder1]# ls –l te_file1 > /dev/null 2>&1 + ``` + + Non otterrete alcun risultato. + + Questa volta vengono soppressi sia l'output standard che l'errore standard. + + L'ordine di reindirizzamento è IMPORTANTE!! + + Il reindirizzamento viene letto da sinistra a destra sulla riga di comando. + + La parte più a sinistra del simbolo di reindirizzamento - “>”: invierà l'output standard (stdout) a /dev/null. Quindi la parte più a destra del reindirizzamento - “2>&1 ”: duplicherà l'errore standard (2) nell'output standard (1). + + Quindi il comando sopra riportato può essere letto come: reindirizza stdout(1) a “/dev/null” e poi copia stderr (2) su stdout + +6. Per dimostrare ulteriormente l'importanza dell'ordine di reindirizzamento, prova: + + ```bash + [root@localhost folder1]# ls –l tem_file 2>&1 > order.txt + ``` + + Utilizzare il comando `cat` per esaminare il contenuto del file "order.txt" + + La parte più a sinistra – “2>&1” copierà l'errore standard nell'output standard. Quindi, la parte più a destra di quanto sopra – “ > order.txt” reindirizza stdout al file order.txt. + +7. Provare questa variante del passaggio precedente: + + ```bash + [root@localhost folder1]# ls –l hgh_ghz 2> order2.txt > order2.txt + ``` + + !!! question "Domanda" + + Esamina il file "order2.txt" e spiega cosa è successo? + +8. Per inviare l'output standard e l'errore standard a file separati; Digitare: + + ```bash + [root@localhost folder1]# ls –l tep_f > standard_out 2> standard_err + ``` + + !!! question "Domanda" + + Sono stati creati due nuovi file. Quali sono i nomi dei file e qual è il loro contenuto? + +9. È possibile reindirizzare sia stdout che stderr allo stesso file utilizzando: + + ```bash + [root@localhost folder1]# ls –l te_fil &> standard_both + ``` + +## Esercizio 12 + +### `rm` + +Il comando `rm` viene utilizzato per eliminare file o directory. Si utilizzerà il comando `rm` per eliminare alcuni dei file creati negli esercizi precedenti. + +#### Per utilizzare `rm` + +1. Mentre si è ancora nella directory "folder1", eliminare il file standard_err. Digitare "y" alla richiesta di conferma: + + ```bash + [root@localhost folder1]# rm standard_err + rm: remove `standard_err'? y + ``` + +2. Eliminare il file "standard_out". Per evitare che venga richiesta la conferma prima di eliminare un file, utilizzare l'opzione "–f " con il comando `rm`: + + ```bash + [root@localhost folder1]# rm -f standard_out + ``` + +3. Ritornare alla directory home (/root) ed eliminare la directory "folder2". Se si vuole usare `rm` per eliminare una cartella, bisogna usare l'opzione “–r”: + + ```bash + [root@localhost root]# rm -r folder2 + + rm: descend into directory `folder2'? y + + rm: remove `folder2/temp_file21'? y + + rm: remove `folder2/temp_file22'? y + + rm: remove directory `folder2'? y + ``` + + !!! question "Domanda" + + Vi è stato nuovamente chiesto di confermare la rimozione di ogni singolo file nella directory e della directory stessa. Quale opzione si utilizzerà con il comando `rm –r` per evitare che ciò accada? + +## Esercizio 13 + +### Imparare `vi` + +`vi` è un editor di testo. Può essere utilizzato per modificare tutti i tipi di testo semplice. È particolarmente utile per i programmi di editing. + +`vi` è un mostro enorme che può fare praticamente tutto, compreso prepararti il caffè o la cioccolata calda!! + +Invece di cercare di insegnarvi `vi`, questo esercizio vi indicherà uno strumento che vi consentirà di familiarizzare meglio con `vi`. + +Vi invitiamo a dedicare un po' di tempo alla lettura del tutorial online su `vi` (più precisamente su `vim`). Basta seguire le istruzioni. + +#### Per imparare `vi` + +1. Una volta effettuato l'accesso al sistema, digitare: + + [root@localhost root]# vimtutor + +## Esercizio 14 + +### Ricerca di file: (`find` e `locate`) + +Questo esercizio tratterà due delle utility più diffuse utilizzate per la ricerca di file e directory nel file system. Si tratta dei comandi `find` e `locate`. + +#### `find` + +L'utilità `find` esiste da molto tempo. Esegue una scansione ricorsiva delle directory per trovare i file che corrispondono a un determinato criterio. + +La sintassi generale per `find` è: + +```bash +find [path] [options] [criterion] [action] +``` + +Se non si specifica alcuna directory o percorso, find cercherà nella directory corrente. Se non si specifica alcun criterio, ciò equivale a "vero", quindi verranno trovati tutti i file. L'utilità `find` offre numerose opzioni per eseguire praticamente qualsiasi tipo di ricerca di un file. Di seguito sono elencate solo alcune delle opzioni, dei criteri e delle azioni disponibili. + +```bash +OPZIONI: + +-xdev: non effettuare ricerche nelle directory situate su altri file system.; + +-mindepth scendere di almeno livelli al di sotto della directory specificata prima della + +ricerca di file; + +-maxdepth : cerca i file che si trovano al massimo a n livelli sotto la directory specificata; + +-follow: segui i collegamenti simbolici se puntano a directory. + +-daystart: quando si utilizzano test relativi al tempo (vedi sotto), prendere l'inizio del giorno corrente come timestamp invece del valore predefinito (24 ore prima dell'ora corrente). +``` + +```bash +CRITERIO + +-type : cerca un determinato tipo di file; può essere uno dei seguenti: f (file regolare), d (directory), + +l (collegamento simbolico), s (socket), b (file in modalità blocco), c (file in modalità carattere) o + +p (pipe con nome); + +-name : trova i file i cui nomi corrispondono al modello specificato ; + +-iname : like -name, but ignore case; + +-atime , -amin : trova i file a cui è stato effettuato l'ultimo accesso giorni fa (-atime) o minuti fa (-amin). È anche possibile specificare + o -, nel qual caso la ricerca verrà effettuata rispettivamente sui file a cui è stato effettuato l'accesso al massimo o al minimo giorni/minuti fa; + +-anewer : trova i file che sono stati aperti più di recente rispetto al file ; + +-ctime , -cmin , -cnewer : come per -atime, -amin e -anewer, ma si applica all'ultima volta in cui il contenuto del file è stato modificato; + +-regex : come per -name, ma il pattern viene trattato come un'espressione regolare; + +-iregex : come per -regex, ma ignora le maiuscole/minuscole. +``` + +```bash +AZIONE: + +-print: stampa semplicemente il nome di ogni file sullo standard output. Questa è l'azione predefinita; + +-ls: stampa sullo standard output l'equivalente di ls -ilds per ogni file trovato; + +-exec : execute command su ogni file trovato. La riga di comando deve terminare con un ;, che deve essere preceduto dal carattere di escape in modo che la shell non lo interpreti; la posizione del file è contrassegnata da {}. + +-ok : come per -exec, ma richiede una conferma per ogni comando. +``` + +#### Per utilizzare `find` + +1. Assicurarsi di trovarsi nella directory home. + +2. Utilizzare il comando find per visualizzare tutti i file nella directory corrente (`pwd`). Digitare: + + ```bash + [root@localhost root]# find + + + ……….. + + ./.bash_profile + + ./.bashrc + + ./.cshrc + + ./.tcshrc + + ./.viminfo + + ./folder1 + + ./folder1/first.txt + + ………… + ``` + + Il risultato mostra il comportamento predefinito di find quando viene utilizzato senza alcuna opzione. + + Visualizza tutti i file e le directory (compresi i file nascosti) nella directory di lavoro in modo ricorsivo. + +3. Ora utilizzare `find` per trovare solo le directory nella tua pwd. Digitare: + + ```bash + [root@localhost root]# find -type d + . + ./folder1 + ./folder2 + ……… + ``` + + !!! question "Domande" + + Dal comando sopra riportato "find –type d"; cos'è l'"opzione", cos'è il "percorso", cos'è il "criterio" e infine cos'è l'"azione"? + +4. Successivamente si cercheranno tutti i file presenti nel sistema che terminano con il suffisso “.txt”: + + ```bash + [root@localhost root]# find / -maxdepth 3 -name "*.txt" -print + /root/folder1/first.txt + /root/folder1/second.txt + /root/folder1/order.txt + /root/folder1/order2.txt + ``` + + !!! question "Domande" + + Sempre dal comando sopra riportato, cosa sono l'"opzione", il "percorso", il "criterio" e infine l'"azione"? (SUGGERIMENTO: L'azione = “- print”) + + La ricerca verrà eseguita solo su 3 directory in basso dalla directory “/”. + + L'asterisco utilizzato nel comando sopra riportato è uno dei caratteri "jolly" in Linux. + + L'uso dei caratteri jolly in Linux è chiamato "globbing". + +5. Utilizzare il comando `find` per trovare tutti i file nella "pwd" che hanno una dimensione "inferiore" a 200 kilobyte. Digitare: + + ```bash + [root@localhost root]# find . –size -200k + ``` + +6. Utilizzare il comando `find` per trovare tutti i file nella directory corrente che sono "più grandi" di 10 kilobyte e visualizzare anche il loro "tipo di file". Digitare: + + ```bash + [root@localhost root]# find . –size +10k –exec file "{ }" ";" + ``` + +#### `locate` + +La sintassi del comando `find` può essere piuttosto difficile da usare in alcuni casi e, a causa della sua ricerca estesa, può essere lenta. Un comando alternativo è `locate`. + +`locate` effettua una ricerca in un database creato in precedenza contenente tutti i file presenti nel file system. + +Si basa sul programma `updatedb`. + +```bash +utilizzo della ricerca: + +locate [-qi] [-d ] [--database=] ... + +locate [-r ] [--regexp=] + +database usage: locate [-qv] [-o ] [--output=] + +locate [-e ] [-f ] [-l ] + +[-c] <[-U ] [-u]> + +general usage: locate [-Vh] [--version] [--help] +``` + +#### Per utilizzare `locate` + +1. Passare alla directory folder1 e creare i file vuoti temp1, temp2 e temp3: + + ```bash + [root@localhost root]# cd folder1; touch temp1 temp2 temp3 + [root@localhost folder1]# + ``` + + Il punto e virgola (;) utilizzato nel comando sopra riportato consente di eseguire più comandi su una singola riga!! + +2. Utilizzare `locate` per cercare tutti i file nella directory corrente che hanno il suffisso "temp" + + ```bash + [root@localhost folder1]# locate temp* + /root/folder1/temp_file11 + /root/folder1/temp_file12 + /root/folder1/temp_file21 + /root/folder1/temp_file22 + ``` + + Si noti che i tre file creati nel passaggio 1 NON sono stati trovati. + +3. Si forzerà un aggiornamento del database utilizzando `updatedb` per consentirgli di rilevare tutti i file appena creati. Digitare: + + ```bash + [root@localhost folder1]# updatedb + ``` + +4. Ora riprovare la ricerca. Digitare: + + ```bash + [root@localhost folder1]# locate temp + ``` + + !!! question "Domanda" + + Cosa è successo questa volta? + +5. Tutto fatto con Lab 3. diff --git a/docs/labs/systems_administration_I/lab5-networking.it.md b/docs/labs/systems_administration_I/lab5-networking.it.md new file mode 100644 index 0000000000..576624f3a8 --- /dev/null +++ b/docs/labs/systems_administration_I/lab5-networking.it.md @@ -0,0 +1,611 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +tested on: All Versions +tags: + - lab exercise + - networking + - nmcli + - ip + - iproute2 + - macvtap +--- + + +# Laboratorio 5: Nozioni di base sulla rete + +## Obiettivi + +Dopo aver completato questo laboratorio, si sarà in grado di: + +- Creare dispositivi di rete virtuali +- Gestire i dispositivi di rete e le impostazioni su un sistema Linux utilizzando il toolkit `iproute2` (`ip`) +- Gestire i dispositivi di rete e le impostazioni su un sistema Linux utilizzando il toolkit NetworkManager (`nmcli`) +- Risolvere i problemi di rete più comuni + +Tempo stimato per completare questo laboratorio: 60 minuti + +## Sommario + +Questo laboratorio Networking Essentials copre vari esercizi di configurazione e risoluzione dei problemi di rete su un server Linux. Potrete gestire e risolvere i problemi relativi alle impostazioni di rete in modo più efficace utilizzando le comuni utility di rete disponibili sui sistemi basati su Linux. + +## Esercizio 1 + +### Cambiare il nome del host + +Esistono molti metodi per identificare o fare riferimento ai computer. Alcuni di questi metodi garantiscono l'unicità [soprattutto su una rete], altri no. Il nome host di un computer può essere considerato come un nome intuitivo. I nomi host dei computer dovrebbero idealmente essere univoci a seconda di come vengono gestiti e assegnati. Tuttavia, poiché chiunque disponga dei privilegi amministrativi su un sistema può assegnare unilateralmente qualsiasi nome host desideri al sistema, l'unicità non è sempre garantita. + +Questo primo esercizio illustra alcuni strumenti comuni per la gestione del nome host del computer. + +#### Per modificare il nome host del sistema + +1. Una volta effettuato l'accesso al sistema, visualizzare il *hostname* corrente utilizzando la popolare utility `hostname`. Digitare: + + ```bash + hostname + ``` + +2. Eseguire nuovamente l'utilità `hostname` con un'opzione diversa per visualizzare l'FQDN del server: + + ```bash + hostname --fqdn + ``` + + !!! question "Domanda" + + Cosa significa FQDN? E perché il risultato del nome host del tuo server è diverso dal suo FQDN? + +3. Utilizzare l'utilità `hostnamectl` per visualizzare il *hostname* corrente. Digitare: + + ```bash + hostnamectl + ``` + + Sono davvero tante informazioni in più! + +4. Aggiungere l'opzione `--static` al comando `hostnamectl` per visualizzare il nome host statico del server. Digitare: + + ```bash + hostnamectl --static + ``` + +5. Aggiungere l'opzione `--transient` al comando `hostnamectl` per visualizzare il nome host transitorio del server. + +6. Ora provare l'opzione `--pretty` del comando `hostnamectl` per visualizzare il nome pretty host del server. + +7. Impostare un nuovo nome host temporaneo per il server. Digitare: + + ```bash + hostnamectl --transient set-hostname my-temp-server1 + ``` + +8. Verificare la modifica temporanea del nome host. Digitare: + + ```bash + hostnamectl --transient + ``` + +9. Impostare un nuovo nome host statico per il server. Digitare: + + ```bash + hostnamectl set-hostname my-static-hostname1 + ``` + +10. Verificare la modifica del nome host statico. + + !!! question "Domanda" + + Consultare la pagina man di `hostnamectl`. Quali sono le differenze tra nomi host pretty, transitori e statici? + +## Esercizio 2 + +Il primo passo fondamentale da completare prima di passare agli altri esercizi di questo laboratorio di rete sarà la creazione di una speciale interfaccia di rete virtuale nota come dispositivo MACVTAP. + +I dispositivi MACVTAP sono dispositivi virtuali che combinano le proprietà di un'interfaccia esclusivamente software nota come dispositivo TAP con quelle del driver MACVLAN. + +La creazione e l'utilizzo di questi dispositivi MACVTAP consentirà di testare, modificare e configurare in modo sicuro varie attività relative alla configurazione di rete. Queste interfacce di rete virtuali saranno utilizzate in varie esercitazioni senza interferire con la configurazione di rete esistente. + +!!! tip "Suggerimento" + + I dispositivi TAP forniscono un'interfaccia esclusivamente software a cui le applicazioni dello spazio utente possono accedere facilmente. I dispositivi TAP inviano e ricevono frame Ethernet non elaborati. + MACVLAN viene utilizzato per creare interfacce di rete virtuali che si collegano alle interfacce di rete fisiche. + I dispositivi MACVTAP hanno un proprio indirizzo MAC unico, distinto dall'indirizzo MAC della scheda di rete fisica sottostante a cui sono associati. + +### Creazione interfacce MACVTAP + +Questo esercizio inizia con la creazione delle interfacce di rete virtuali MACVTAP necessarie. Ciò consentirà di testare, modificare e configurare in modo sicuro varie attività relative alla configurazione di rete. Queste interfacce di rete virtuali saranno utilizzate in varie esercitazioni senza interferire con la configurazione di rete esistente. + +#### Per elencare tutte le interfacce di rete presenti nel sistema + +1. Assicurarsi di aver effettuato l'accesso al server. + +2. Utilizzare il programma `ip` per visualizzare le interfacce di rete esistenti sul sistema. Digitare: + + ```bash + ip link show + ``` + +3. Provare ad utilizzare il comando `nmcli` per elencare tutti i dispositivi di rete. Digitare: + + ```bash + nmcli -f DEVICE device + ``` + +4. Interrogare il file system virtuale di basso livello /sys per enumerare manualmente TUTTE le interfacce di rete disponibili sul server. Digitare: + + ```bash + ls -l /sys/class/net/ | grep -v 'total' | awk '{print $9}' + ``` + +#### Per creare interfacce `macvtap` + +1. Assicurarsi di aver effettuato l'accesso al sistema come utente con privilegi amministrativi. + +2. È necessario interrogare e identificare i tipi di dispositivi di rete appropriati disponibili sul server per poterli associare al dispositivo `macvtap`. Digitare: + + ```bash + ls -l /sys/class/net/ | grep -v 'virtual\|total' | tail -n 1 | awk '{print $9}' + + eno2 + ``` + + L'output sul sistema demo di esempio mostra un'interfaccia adatta denominata eno2. + +3. Eseguire nuovamente il comando per identificare il dispositivo, ma questa volta memorizzare il valore restituito in una variabile denominata $DEVICE1. Controllare nuovamente il valore di $DEVICE1 utilizzando echo. Per eseguire questa operazione, digitare i seguenti 2 comandi separati: + + ```bash + # DEVICE1=$(ls -l /sys/class/net/ | grep -v 'virtual\|total' | tail -n 1 | awk '{print $9}') + + # echo $DEVICE1 + ``` + +4. Ora, creare un'interfaccia MACVTAP denominata - `macvtap1`. La nuova interfaccia sarà associata a $DEVICE1. Digitare: + + ```bash + ip link add link $DEVICE1 name macvtap1 type macvtap mode bridge + ``` + +5. Verificare la creazione dell'interfaccia `macvtap1`. Digitare: + + ```bash + ip --brief link show macvtap1 + ``` + + Notare lo stato DOWN dell'interfaccia `macvtap` nell'output. + +6. Visualizzare le informazioni dettagliate su tutti i dispositivi di rete di tipo MACVTAP presenti nel sistema. Digitare: + + ```bash + ip --detail link show type macvtap + ``` + +7. Eseguire un comando per visualizzare tutte le interfacce di rete sul server e confrontare il risultato con quello ottenuto dal comando simile nella sezione precedente "Per elencare tutte le interfacce di rete sul sistema". + +### Abilitazione/Disabilitazione delle interfacce di rete + +#### Per abilitare o disabilitare un'interfaccia di rete + +1. Controllare lo stato dell'interfaccia di rete `macvtap1`. Digitare: + + ```bash + ip link show macvtap1 + ``` + +2. Abilitare l'interfaccia di rete `macvtap1` (se attualmente disabilitata). Eseguire: + + ```bash + ip link set macvtap1 up + ``` + +3. Verificare le modifiche di stato eseguendo: + + ```bash + ip -br link show macvtap1 + ``` + + !!! tip "Suggerimento" + + Nel caso in cui sia necessario disabilitare un'interfaccia di rete, la sintassi del comando `ip` per farlo è `ip link set down`. Ad esempio, per disabilitare un'interfaccia di rete denominata `macvtap7`, è necessario eseguire: + + ```bash + ip link set macvtap7 down + ``` + +Ora che sono state configurate le interfacce `macvtap`, è possibile eseguire in modo sicuro le varie attività di configurazione della rete e di risoluzione dei problemi negli esercizi rimanenti. + +## Esercizio 3 + +### Assegnazione degli indirizzi IP + +#### Per impostare un indirizzo IP su un'interfaccia di rete + +1. Visualizzare gli indirizzi IP di tutte le interfacce di rete sul server. Digitare: + + ```bash + ip address show + ``` + +2. Assegnare l'indirizzo IP - 172.16.99.100 - a `macvtap1`. Digitare + + ```bash + ip address add 172.16.99.100/24 dev macvtap1 + ``` + +3. Verificare l'assegnazione dell'indirizzo IP per `macvtap1` + + ```bash + ip address show macvtap1 + ``` + +4. Utilizzare il comando `nmcli` per visualizzare gli indirizzi IPv4 di tutte le interfacce presenti nel sistema. Digitare: + + ```bash + nmcli --get-values IP4.ADDRESS,GENERAL.DEVICE device show + ``` + +## Esercizio 4 + +### Configurazione degli indirizzi IPv6 + +#### Per assegnare indirizzi IPv6 alle interfacce `macvtap` + +1. Partendo da `macvtap1`, assegnare l'indirizzo IPv6 2001:db8::1/64 a `macvtap1` eseguendo: + + ```bash + ip -6 address add 2001:db8::1/64 dev macvtap1 + ``` + +3. Verificare le assegnazioni degli indirizzi IPv6, digitare: + + ```bash + ip --brief -6 address show macvtap1 && ip -br -6 address show macvtap1 + ``` + +4. Utilizzare `nmcli` per visualizzare gli indirizzi IPv6 di tutte le interfacce presenti nel sistema. Digitare: + + ```bash + nmcli --get-values IP6.ADDRESS,GENERAL.DEVICE device show + ``` + +## Esercizio 5 + +### Gestione del routing + +#### Visualizzazione della tabella di routing del sistema + +1. Visualizzare la tabella di routing corrente per il sistema. Digitare: + + ```bash + ip route show + default via 192.168.2.1 dev enp1s0 proto dhcp src 192.168.2.121 metric 100 + 10.99.99.0/24 dev tunA proto kernel scope link src 10.99.99.1 metric 450 linkdown + 192.168.2.0/24 dev enp1s0 proto kernel scope link src 192.168.2.121 metric 100 + ``` + +2. Utilizzando una delle reti visualizzate nella colonna più a sinistra dell'output del comando precedente come argomento, visualizzare la voce della tabella di routing per quella rete. Ad esempio, per visualizzare la voce della tabella di routing del kernel per la rete 10.99.99.0/24, digitare: + + ```bash + ip route show 10.99.99.0/24 + ``` + +3. Interrogare il sistema per vedere il percorso che verrà utilizzato per raggiungere una destinazione arbitraria di esempio. Ad esempio, per visualizzare i dettagli del percorso per raggiungere l'indirizzo IP di destinazione 8.8.8.8, digitare: + + ```bash + ip route get 8.8.8.8 + + 8.8.8.8 via 192.168.2.1 dev enp1s0 src 192.168.2.121 uid 0 + cache + ``` + + Ecco una spiegazione dettagliata dei risultati in parole semplici: + + - Indirizzo IP di destinazione: 8.8.8.8 è l'indirizzo IP che stiamo cercando di raggiungere + - Via: 192.168.2.1 è l'indirizzo IP del prossimo hop a cui verrà inviato il pacchetto per raggiungere la destinazione + - Dispositivo: `enp1s0` è l'interfaccia di rete che verrà utilizzata per inviare il pacchetto + - Indirizzo IP di origine: 192.168.2.121 è l'indirizzo IP dell'interfaccia di rete che verrà utilizzato come indirizzo di origine per il pacchetto + - UID: 0 è l'ID utente del processo che ha avviato questo comando + - Cache: questo campo indica se questo percorso è memorizzato nella tabella di routing del kernel + +4. Vediamo ora come il sistema instraderà un pacchetto da un indirizzo IP a un altro indirizzo IP di destinazione. Digitare: + + ```bash + ip route get from 192.168.1.1 to 192.168.1.2 + + local 192.168.1.2 from 192.168.1.1 dev lo uid 0 + cache + ``` + +### Impostazione del gateway predefinito + +#### Per configurare un gateway predefinito per il sistema + +1. Utilizzare `ip` per cercare ed elencare il gateway predefinito corrente sul sistema. Digitare: + + ```bash + ip route show default + ``` + +2. Impostare un gateway predefinito tramite l'interfaccia `macvtap1`. Digitare: + + ```bash + ip route add default via 192.168.1.1 + ``` + +3. Verificare la nuova configurazione del gateway predefinito + + ```bash + ip route show default + ``` + +### Aggiunta di un percorso statico + +#### Per aggiungere una route statica alla tabella di routing + +1. Aggiungere una route statica demo per una rete fittizia 172.16.0.0/16 tramite 192.168.1.2. Digitare: + + ```bash + ip route add 172.16.0.0/16 via 192.168.1.2 + ``` + +2. Verificare l'aggiunta della route statica eseguendo: + + ```bash + ip route show 172.16.0.0/16 + ``` + +### Rimozione del percorso statico + +#### Per rimuovere una route statica dalla tabella di routing + +1. Eliminare la route statica per 10.0.0.0/24 + + ```bash + ip route del 10.0.0.0/24 via 192.168.1.2 + ``` + +2. Verificare la rimozione della route statica + + ```bash + ip route show + ``` + +## Esercizio 6 + +### Rimozione degli indirizzi IP + +Questo esercizio illustra come eliminare gli indirizzi IP configurati (IPv4 e IPv6) sulle interfacce di rete. + +### Eliminare un indirizzo IPv4 + +#### Per rimuovere un indirizzo IP assegnato da un'interfaccia di rete + +1. Eliminare l'indirizzo IP su `macvtap1`. Digitare: + + ```bash + ip address del 172.16.99.100/24 dev macvtap1 + ``` + +2. Verificare la rimozione dell'indirizzo IP eseguendo: + + ```bash + ip address show macvtap1 + ``` + +### Eliminare un indirizzo IPv6 + +#### Per rimuovere un indirizzo IPv6 assegnato da un'interfaccia di rete + +1. Eliminare l'indirizzo IPv6 su `macvtap1` con questo comando: + + ```bash + ip -6 address del 2001:db8::1/64 dev macvtap1 + ``` + +2. Verificare la rimozione dell'indirizzo IPv6 con: + + ```bash + ip -6 address show macvtap1 + ``` + +## Esercizio 7 + +### Configurazione delle interfacce di rete con `nmcli` + +Questo esercizio mostra come configurare le interfacce di rete utilizzando lo strumento NetworkManager. + +!!! note "Nota" + + Per impostazione predefinita, qualsiasi modifica alla configurazione di rete effettuata utilizzando `nmcli` (NetworkManager) rimarrà attiva anche dopo il riavvio del sistema. + Ciò contrasta con le modifiche di configurazione effettuate con l'utilità `ip`. + +#### Per creare un'interfaccia `macvtap` utilizzando `nmcli` + +1. Iniziare elencando tutti i dispositivi di rete disponibili eseguendo: + + ```bash + nmcli device + ``` + +2. Successivamente, identificare un dispositivo di rete sottostante a cui associare la nuova interfaccia MACVTAP. Memorizzare il valore del dispositivo identificato nella variabile $DEVICE2. Digitare: + + ```bash + DEVICE2=$(ls -l /sys/class/net/ | grep -v 'virtual\|total' | tail -n 1 | awk '{print $9}') + ``` + +3. Ora, creare una nuova connessione NetworkManager chiamata `macvtap2` e un'interfaccia MACVTAP associata denominata - `macvtap2`. La nuova interfaccia sarà associata a $DEVICE2. Digitare: + + ```bash + nmcli con add con-name macvtap2 type macvlan mode bridge tap yes dev $DEVICE2 ifname macvtap2 + ``` + +4. Utilizzare `nmcli` per verificare la creazione dell'interfaccia `macvtap2`. Digitare: + + ```bash + nmcli device show macvtap2 + ``` + +5. Utilizzare `nmcli` per verificare la creazione della connessione `macvtap2`. Digitare: + + ```bash + nmcli connection show macvtap2 + ``` + +6. Allo stesso modo, utilizzare `ip` per verificare la creazione dell'interfaccia `macvtap2`. Digitare: + + ```bash + ip --brief link show macvtap2 + ``` + + Notare lo stato UP dell'output dell'interfaccia `macvtap`. + + !!! question "Domanda" + + Qual è la differenza tra il concetto di connessione e quello di dispositivo in NetworkManager? + +#### Modifica della configurazione di rete dell'interfaccia con `nmcli` + +1. Inizia interrogando l'indirizzo IPv4 per la nuova interfaccia `macvtap2` eseguendo: + + ```bash + nmcli -f ipv4.addresses con show macvtap2 + ``` + + Il valore della proprietà ipv4.addresses dovrebbe essere vuoto. + +2. Configurare la connessione `macvtap2` con queste impostazioni: + + - IPv4 Method = manual + - IPv4 Addresses = 172.16.99.200/24 + - Gateway = 172.16.99.1 + - DNS Servers = 8.8.8.8 and 8.8.4.4 + - DNS Search domain = example.com + + Digitare: + + ```bash + nmcli connection modify macvtap2 ipv4.method manual \ + ipv4.addresses 172.16.99.200/24 ipv4.gateway 172.16.99.1 \ + ipv4.dns 8.8.8.8,8.8.4.4 ipv4.dns-search example.com + ``` + +3. Verificare la nuova impostazione dell'indirizzo IPv4 eseguendo: + + ```bash + nmcli -f ipv4.addresses con show macvtap2 + ``` + +4. Eseguire una variante leggermente diversa del comando precedente per includere la configurazione di runtime delle impostazioni specificate. Digitare: + + ```bash + nmcli -f ipv4.addresses,IP4.ADDRESS con show macvtap2 + ``` + + !!! question "Domanda" + + Qual è la differenza tra queste proprietà di NetworkManager: ipv4.addresses e IP4.ADDRESS? + +5. Controllare le modifiche alla connessione di rete utilizzando il comando `ip`. Digitare: + + ```bash + ip -br address show dev macvtap2 + ``` + +6. Per applicare correttamente le nuove impostazioni e renderle i nuovi valori di runtime, utilizzare `nmcli` per spegnere prima la connessione (cioè disattivarla). Digitare: + + ```bash + nmcli connection down macvtap2 + + Connection macvtap2 successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/5) + ``` + +7. Ora attivare la nuova connessione per applicare le nuove impostazioni. Digitare: + + ```bash + nmcli connection up macvtap2 + + Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/6) + ``` + +8. Visualizzare l'impostazione finale utilizzando l'utilità ip. Digitare: + + ```bash + ip -br address show dev macvtap2 + ``` + +## Esercizio 8 + +### Configurazione dei server DNS + +#### Per impostare gli indirizzi dei server DNS per il sistema + +1. Configurare i server DNS per `macvtap1` + + ```bash + nmcli con mod macvtap1 ipv4.dns 8.8.8.8, 8.8.4.4 + ``` + +2. Verificare la configurazione del server DNS + + ```bash + nmcli con show macvtap1 | grep DNS + ``` + +## Esercizio 9 + +### Risoluzione dei problemi di rete + +#### Identificare e risolvere i problemi di rete più comuni + +1. Controllare lo stato delle interfacce di rete + + ```bash + ip link show + ``` + +2. Verificare la connettività di rete a un host remoto (ad esempio, google.com) + + ```bash + ping google.com + ``` + +3. Provare ad eseguire il ping del gateway locale. Digitare: + + ```bash + ping _gateway + ``` + + !!! question "Domanda" + + Attraverso quale meccanismo il sistema è in grado di risolvere correttamente il nome "_gateway" nell'indirizzo IP corretto per il gateway predefinito configurato localmente? + +### Visualizzazione delle connessioni attive + +#### Per elencare tutte le connessioni di rete attive + +1. Elencare tutte le connessioni di rete attive + + ```bash + ss -tuln + ``` + +### Monitoraggio del traffico di rete + +#### Per monitorare il traffico di rete in tempo reale + +1. Catturare il traffico di rete su un'interfaccia specifica (ad esempio, `macvtap1`) + + ```bash + tcpdump -i macvtap1 + ``` + + Analizzare i pacchetti catturati e osservare l'attività di rete. È possibile interrompere l'acquisizione dei pacchetti al termine dell'operazione premendo ++ctrl+c++ + +### Visualizzazione dei registri di rete + +#### Per visualizzare i log relativi al demone NetworkManager per la risoluzione dei problemi + +1. Visualizzare i registri relativi alla rete + + ```bash + journalctl -u NetworkManager + ``` diff --git a/docs/labs/systems_administration_I/lab6-user_and_group_management.it.md b/docs/labs/systems_administration_I/lab6-user_and_group_management.it.md new file mode 100644 index 0000000000..c5ab74b689 --- /dev/null +++ b/docs/labs/systems_administration_I/lab6-user_and_group_management.it.md @@ -0,0 +1,446 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +tested on: Tutte le versioni +tags: + - introduction system administration + - lab exercise + - users + - groups +--- + +# Lab 6: Gestione di utenti e gruppi + +## Obiettivi + +Dopo aver completato questo laboratorio, si sarà in grado di: + +- Aggiungere e rimuovere utenti dal sistema +- Aggiungere e rimuovere gruppi dal sistema +- Modificare utenti e gruppi sul sistema +- Cambiare la password + +Tempo stimato per terminare il laboratorio: 40 minuti + +## Account utente + +La gestione degli utenti è importante in qualsiasi sistema operativo di rete multiutente. Linux è un sistema operativo di rete multiutente. Senza gli utenti, non ci sarebbe bisogno di un sistema operativo di rete multiutente! + +La gestione degli utenti su un sistema è strettamente legata alla sicurezza del sistema stesso. C'è un vecchio proverbio che dice: +> Un sistema è tanto sicuro quanto il suo utente più debole. + +Linux eredita la vecchia tradizione UNIX di governare l'accesso a file, programmi e altre risorse in base ad utente e gruppi. + +Proprio come tutte le altre configurazioni in Linux, la gestione degli utenti può essere effettuata modificando i file di configurazione che possono essere trovati nella gerarchia del file system. Questo laboratorio esplorerà la gestione degli utenti attraverso il metodo manuale e anche con l'uso delle utility di sistema. + +Esamineremo anche in breve la proprietà e i permessi dei file. + +Di seguito i file importanti per la gestione di utenti e gruppi. Vengono discussi anche alcuni campi o voci dei file. + +### /etc/passwd + +- **Scopo:** informazioni sull'account utente +- **Contenuto:** + - username + - password criptata + - id utente (UID) + - id del gruppo (GID) + - nome completo dell'utente + - home directory dell'utente + - shell di default + +### /etc/shadow + +- **Scopo:** proteggere le informazioni dell'account utente +- **Contenuto:** + - nome di login + - hash della password + - numero di giorni relativi all'ultimo cambio password, a partire dal 01/01/1970 + - giorni prima dei quali la password non può essere modificata. Generalmente è pari a zero. + - numero di giorni dopo i quali la password deve essere cambiata + - numero di giorni antecedenti alla scadenza della password in cui l'utente viene avvertito che la password sta per scadere + - numero di giorni successivi alla scadenza della password, in cui l'account è considerato inattivo e disabilitato + - giorni a partire dal 1/01/1970 di quando l'account sarà disabilitato + - riservato + +### /etc/group + +- **Scopo:** informazioni sui gruppi +- **Contenuto:** + - nome del gruppo + - password del gruppo + - id del gruppo (GID) + - elenco degli utenti appartenenti al gruppo + +### /etc/skel + +- **Scopo:** contiene dei template da applicare ai nuovi account + +## Utilità comuni + +Di seguito sono elencate alcune utilità comunemente utilizzate nelle attività quotidiane di gestione degli utenti e dei gruppi: + +### `useradd` + + ```bash + + Utilizzo: useradd [options] LOGIN + useradd -D + useradd -D [options] + + Opzioni: + --badname non controllare i nomi non validi + -b, --base-dir BASE_DIR directory di base per la directory home del nuovo account + --btrfs-subvolume-home utilizza il sottovolume BTRFS per la directory home. + -c, --comment COMMENT Campo GECOS del nuovo account + -d, --home-dir HOME_DIR directory home del nuovo account + -D, --defaults stampa o modifica la configurazione predefinita di useradd + -e, --expiredate EXPIRE_DATE data di scadenza del nuovo account + -g, --gid GROUP nome o ID del gruppo principale del nuovo account + -G, --groups GROUPS elenco dei gruppi supplementari del nuovo account + -h, --help visualizza questo messaggio di aiuto e esci + -k, --skel SKEL_DIR utilizza questa directory scheletro alternativa. + -K, --key KEY=VALUE sovrascrivere le impostazioni predefinite di /etc/login.defs + -l, --no-log-init non aggiungere l'utente ai database lastlog e faillog. + -m, --create-home creare la directory home dell'utente + -M, --no-create-home non creare la directory home dell'utente. + -N, --no-user-group non creare un gruppo con lo stesso nome dell'utente. + -o, --non-unique consenti la creazione di utenti con UID duplicati (non univoci) + -p, --password PASSWORD password crittografata del nuovo account + -r, --system creare un account di sistema + -R, --root CHROOT_DIR directory in cui eseguire il chroot + -P, --prefix PREFIX_DIR directory dei prefissi in cui si trovano i file /etc/* + -s, --shell SHELL shell di accesso del nuovo account + -u, --uid UID ID utente del nuovo account + -U, --user-group creare un gruppo con lo stesso nome dell'utente + -Z, --selinux-user SEUSER utilizzare un SEUSER specifico per la mappatura degli utenti SELinux + ``` + +### `groupadd` + + ```bash + Utilizzo: groupadd [options] GROUP + + Opzioni: + -f, --force esci correttamente se il gruppo esiste già e annulla -g se il GID è già utilizzato. + -g, --gid GID utilizza il GID per il nuovo gruppo + -h, --help visualizza questo messaggio di aiuto e esci + -K, --key KEY=VALUE sovrascrivere le impostazioni predefinite di /etc/login.defs + -o, --non-unique consenti la creazione di gruppi con GID duplicati (non univoci) + -p, --password PASSWORD Utilizza questa password crittografata per il nuovo gruppo. + -r, --system creare un account di sistema + -R, --root CHROOT_DIR directory in cui eseguire il chroot + -P, --prefix PREFIX_DI prefisso della directory + -U, --users USERS elenco degli utenti membri di questo gruppo + ``` + +### `passwd` + + ```bash + Utilizzo: passwd [OPTION...] + -k, --keep-tokens conserva i token di autenticazione non scaduti + -d, --delete elimina la password dell'account specificato (solo root); rimuove anche il blocco della password, se presente. + -l, --lock blocca la password per l'account specificato (solo root) + -u, --unlock sblocca la password per l'account specificato (solo root) + -e, --expire scadenza della password per l'account specificato (solo root) + -f, --force funzionamento forzato + -x, --maximum=DAYS durata massima della password (solo root) + -n, --minimum=DAYS durata minima della password (solo root) + -w, --warning=DAYS numero di giorni di preavviso che gli utenti ricevono prima della scadenza della password (solo root) + -i, --inactive=DAYS numero di giorni dopo la scadenza della password in cui un account viene disabilitato (solo root) + -S, --status segnalare lo stato della password sull'account specificato (solo root) + --stdin leggi nuovi il token da stdin (solo root) + + Opzioni di aiuto: + -?, --help Mostra questo messaggio di aiuto + --usage Visualizza breve messaggio di utilizzo + ``` + +## Esercizio 1 + +### Creazione manuale di un nuovo utente + +Finora, durante i laboratori precedenti, si è utilizzato il sistema come utente con i privilegi più elevati, ovvero l'utente `root`. Questa non è una buona pratica in un sistema di produzione perché rende il sistema vulnerabile dal punto di vista della sicurezza. L'utente root può causare danni illimitati al sistema, sia in modo permanente che temporaneo. + +Ad eccezione del superutente, tutti gli altri utenti hanno un accesso limitato ai file e alle directory. Utilizzare sempre il computer come un utente normale. Due concetti confusi saranno chiariti qui. + +- In primo luogo, la directory home dell'utente root è " /root ". +- In secondo luogo, la directory principale è la directory più alta, nota come directory / (barra). ("/root" è diverso da "/ ") + +In questo laboratorio si creerà un nuovo utente chiamato "Me Mao". Il nome utente per "Me Mao" sarà il nome proprio - "me". Questo nuovo utente apparterrà al gruppo "me". La password sarà “a1b2c3” + +!!! warning "Attenzione" + + Le configurazioni di sistema sono solitamente conformi a un formato specifico. È sempre importante attenersi a questo formato quando si modificano manualmente i file di configurazione. Un modo per farlo è trovare e copiare una voce esistente nel file, quindi modificare la riga/sezione copiata con le nuove modifiche. Questo aiuterà a ridurre le possibilità di commettere errori. + +1. Log in nel computer come root + +2. Utilizzare il comando `tail` per visualizzare le ultime 4 voci nella parte inferiore del file `/etc/passwd`. + + ```bash + [root@localhost root]# tail -n 4 /etc/passwd + apache:x:48:48:Apache:/var/www:/sbin/nologin + xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin + ntp:x:38:38::/etc/ntp:/sbin/nologin + gdm:x:42:42::/var/gdm:/sbin/nologin + ``` + + Si modificherà il file passwd utilizzando il formato sopra indicato. + +#### Creazione dell'utente + +1. Sarà necessario modificare il file `/etc/passwd`. + + Avviare l'editor preferito e aprire il file "/etc/passwd" + + Aggiungere il testo sottostante alla fine del file: + + ```bash + me:x:500:500:me mao:/home/me:/bin/bash + ``` + +2. Salvare le modifiche e chiudere il file passwd. + +3. Successivamente modificheremo il file `/etc/shadow`. Avviare l'editor e aprire il file "/etc/shadow". Aggiungere una nuova voce come quella riportata di seguito alla fine del file, inserendo un asterisco (*) nel campo della password. Digitare: + + ```bash + me:x:11898:11898:99999:7 +::: + ``` + +4. Salvare le modifiche e chiudere il file shadow. + +5. Modificare ora il file `/etc/group`. Avviare l'editor e aprire il file `/etc/group`. Alla fine del file aggiungere una nuova voce: + + ```bash + me:x:1000:me + ``` + +6. Salvare le modifiche e chiudere il file group. + +7. È ora di creare la directory home. + + Copiare l'intero contenuto della directory "/etc/skel" nella directory /home, rinominando la nuova directory con il nome dell'utente, ad esempio "/home/me". Digitare: + + ```bash + [root@localhost root]# cp -r /etc/skel /home/me + ``` + +8. L'utente root è il proprietario della directory che hai appena creato, perché è stato lui a crearla. Affinché l'utente "me mao" possa utilizzare la directory, si dovranno modificare i permessi/proprietà della cartella. Digitare: + + ```bash + [root@localhost root]# chown -R me:me /home/me + ``` + +9. Creare una password per l'utente. Impostare il valore della password su `a!b!c!d!`. Si utilizzerà l'utilità "passwd". Digitare "passwd" e seguire le istruzioni + + ```bash + [root@localhost root]# passwd me + Changing password for user me. + New password: + Retype new password: + passwd: all authentication tokens updated successfully. + ``` + +10. Uscire dal sistema una volta finito. + +## Esercizio 2 + +### Creazione automatica di un nuovo utente + +Esistono numerose utility disponibili per semplificare tutte le attività/passaggi che abbiamo eseguito manualmente nell'esercizio precedente. Abbiamo solo illustrato il processo manuale di creazione di un utente, in modo che si possa vedere cosa succede effettivamente in background. + +In questo esercizio verranno utilizzate alcune utilità comuni per gestire e semplificare il processo. + +Si creerà un altro account utente per l'utente "Ying Yang"; il nome di accesso sarà "ying". + +E la password per "ying" sarà "y@i@n@g@". + +Inoltre, si creerà un gruppo denominato “common” e si aggiungeranno gli utenti “me” e “ying” al gruppo. + +#### Per creare automaticamente un nuovo account + +1. Accedere al sistema come root. + +2. Creare l'utente ying utilizzando tutte le impostazioni predefinite del comando `useradd`. Digitare: + + ```bash + [root@localhost root]# useradd -c "Ying Yang" ying + ``` + +3. Utilizzare il comando `tail` per esaminare l'inserimento appena effettuato al file `/etc/passwd`. Digitare: + + ```bash + flatpak:x:982:982:User for flatpak system helper:/:/sbin/nologin + pesign:x:981:981:Group for the pesign signing daemon:/run/pesign:/sbin/nologin + me:x:1000:1000:99999:7 +::: + ying:x:1001:1001:Ying Yang:/home/ying:/bin/bash + ``` + + !!! question "Domanda" + + Elencare qui la nuova voce? + +4. L'utente ying non potrà accedere al sistema finché non sarà stata creata una password per l'utente. Impostare la password di Ying su `y@i@n@g@`. Digitare: + + ```bash + [root@localhost root]# passwd ying + Changing password for user ying. + New password: ********** + Retype new password: ********** + passwd: all authentication tokens updated successfully. + ``` + +5. Utilizzare l'utilità `id` per visualizzare rapidamente le informazioni relative ai nuovi utenti appena creati. Digitare: + + ```bash + [root@localhost root]# id me + uid=1000(me) gid=1000(me) groups=1000(me) + ``` + +6. Fare la stessa cosa per l'utente ying. Digitare: + + ```bash + [root@localhost root]# id ying + uid=501(ying) gid=501(ying) groups=501(ying) + ``` + +#### Creazione automatica di un nuovo gruppo + +1. Utilizzare il programma `groupadd` per creare il nuovo gruppo "common". + + ```bash + [root@localhost root]# groupadd common + ``` + +2. Esaminare la parte finale del file `/etc/group` per vedere il nuovo inserimento. + + !!! question "Domanda" + + Qual è il comando per farlo? + +3. Utilizzare il comando `usermod` per aggiungere un utente esistente a un gruppo esistente. Si aggiunge l'utente ying al gruppo `common` appena creato nel passaggio 1. Digitare: + + ```bash + [root@localhost root]# usermod -G common -a ying + ``` + +4. Fare le stessa cosa per l'utente me. Digitare: + + ```bash + [root@localhost root]# usermod -G common -a me + ``` + +5. Eseguire nuovamente il comando `id` sugli utenti "ying" e "me". + + !!! question "Domanda" + + Cosa è cambiato? + +6. Utilizzare il comando `grep` per visualizzare le modifiche apportate alla voce del gruppo `common` nel file. Digitare: + + ```bash + [root@localhost root]# grep common /etc/group + common:x:1002:ying,me + ``` + +#### Modifica del profilo di un utente + +1. Utilizzare il comando `usermod` per modificare il campo commento dell'utente "me". Il nuovo commento che si aggiungerà sarà "first last". Digitare: + + ```bash + [root@localhost root]# usermod -c "first last" me + ``` + + Utilizzare il comando `tail` per esaminare le modifiche apportate al file `/etc/passwd`. + + !!! question "Domanda" + + Scrivi la riga modificata qui sotto. + + !!! question "Domanda" + + Qual è la shell di login dell'utente me? + +2. Utilizzare nuovamente il comando `usermod` per modificare la shell di login di me in shell csh. Digitare: + + ```bash + [root@localhost root]# usermod -s /bin/csh me + ``` + +3. Infine, utilizzare il comando `usermod` per annullare tutte le modifiche apportate all'utente "me" sopra. + + Ripristina i valori (shell di login ecc.) ai valori originali. + + !!! question "Domanda" + + Quali sono i comandi per farlo? + +## Esercizio 3 + +### Impostazione dell'utente + +Non sempre è conveniente uscire completamente dal sistema per accedere con un altro utente. Questo potrebbe essere dovuto al fatto che sono in esecuzione determinate attività che non si desidera terminare. Il programma `su` (set user) viene utilizzato per diventare temporaneamente un altro utente. È possibile passare da un account utente normale all'account root o viceversa utilizzando il comando "su". + +Cambia l'utente corrente in modo che abbia i diritti di accesso dell'utente temporaneo. + +Le variabili di ambiente HOME, LOGNAME e USER verranno impostate di default su quelle dell'utente temporaneo. + +#### Per diventare temporaneamente un altro utente + +1. Dopo aver effettuato l'accesso come utente root, passare all'utente "me". Digitare: + + ```bash + [root@localhost root]# su me + + [me@localhost root]$ + ``` + + Il comando `su` non ha richiesto la password dell'utente me perché siete root + +2. Passare alla directory home di me. + + ```bash + [me@localhost root]$ cd + + [me@localhost me]$ cd + ``` + +3. Mentre si è temporaneamente connessi come me, usare `su` per effettuare il login come utente ying. Digitare: + + ```bash + [me@localhost me]$ su ying + password: + [ying@localhost me]$ + ``` + +4. Per uscire dall'account di Ying, digitare: + + ```bash + [ying@localhost me]$ exit + ``` + + Questo vi riporterà all'account me. + +5. Uscire dall'account di me per tornare all'account root. + + !!! question "Domanda" + + Qual è il comando? + +#### Ereditare tutte le variabili ambientali del nuovo utente con `su` + +1. Per forzare `su` a utilizzare tutte le variabili ambientali dell'utente temporaneo. Digitare: + + ```bash + [root@system1 root]# su - me + + [me@system1 me]$ + ``` + + La differenza è immediatamente evidente. Notare la directory di lavoro corrente. + +2. Uscire completamente dal sistema e riavviare il computer. + +3. Tutto fatto con Lab 6! diff --git a/docs/release_notes/10_0.zh.md b/docs/release_notes/10_0.zh.md new file mode 100644 index 0000000000..b9f99489d3 --- /dev/null +++ b/docs/release_notes/10_0.zh.md @@ -0,0 +1,282 @@ +--- +title: 当前发布 10 版本 +tags: + - 10 + - 10.0 release + - Rocky Linux 10 +--- + +## Rocky Linux 10 + +Rocky Linux 10(RL 10)是 Rocky Linux 企业级操作系统发布的最新重大版本。 + +### 升级到 Rocky Linux 10 + +Rocky Linux 不支持任何主要版本的升级。 要从 8.x 或 9.x 迁移到 Rocky Linux 10,您应该重新安装操作系统。 + +### 新特性与变化 + +以下部分将介绍 RL 10 的精选特性。 + +与所有主要的 Rocky Linux 发行版一样,本发布说明涵盖了许多增强功能、变更项和新特性。 + +以下概述重点介绍了以下类别的变化:架构、内核、安装程序、网络、安全、虚拟化、容器、存储和软件包管理。 此处精选的特性最可能与普通用户相关。 + +有关重大变化的完整清单,请参阅 [此处](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/10/html/10.0_release_notes/overview#overview-major-changes) 的上游清单。 + +### 支持的架构 + +!!! warning "请检查 CPU 兼容性" + + 在 x86_64 处理器架构上,RL 10 不再支持 x86-64-v2 微架构级别及更早期的硬件,并将 x86-64-v3 微架构作为发行版的最低要求。 + 更多信息请参阅 [支持的微架构级别部分](#supported-microarchitecture-levels),特别是关于 CPU 兼容性测试的相关说明。 + +!!! info "停止 32 位软件包" + + Rocky Linux 10 已移除对 x86_64 架构的 32 位兼容性支持。请改用 64 位库或包含 32 位依赖项的容器环境。 + +Rocky Linux 10 支持以下处理器架构: + +- 64-bit AMD/Intel x86-64-v3 (x86_64) +- 64-bit RISC-V (riscv64) +- 64-bit ARMv8.0-A (aarch64) +- IBM POWER9, little endian (ppc64le) +- IBM z14 (s390x) + +#### 全新支持 RISC-V 架构 + +经过 Rocky Linux 发布工程团队的长期努力,终于将 Rocky Linux 10 成功适配于特定的 "RISC-V 实现"。 +发布当天支持的平台/子系统包括 - StarFive VisionFive 2 (VF2)、**QEMU** 和 SiFive HiFive Premier P550。 + +有关此里程碑的更多详细信息(包括 RL10 对 RISC-V 的支持),请访问 [此网站](https://rockylinux.org/news/rockylinux-support-for-riscv)。 + +#### 支持的微架构级别 + +x86-64-v3 微架构基于 Intel Haswell 处理器一代的特性集。 少数的英特尔 Atom 处理器(如 Gracemont 系列处理器)支持 x86-64-v3。 而其他处理器(包括英特尔 Atom Parker Ridge 系列处理器 和英特尔 Atom x6416RE Elkhart Lake 系列处理器)则不提供 x86-64-v3 功能特性,因此在 RL 10 中不支持。 若要确认处理器兼容性,请 [使用此过程](https://docs.rockylinux.org/gemstones/test_cpu_compat/) 进行验证。 + +x86-64-v3 微架构级别是 Rocky Linux 10 在 x86_64 平台的最低硬件要求标准,该标准由 AMD 通过其‌ Excavator 微架构‌首次实现。 这意味着基于 Excavator 架构之前的旧处理器可能不被 Rocky Linux 10 完全支持。 + +!!! Note "树莓派镜像差异" + + 10 版本 的 Rocky Linux Pi 镜像与之前版本的主要区别在于——10 版本支持 Pi 4 和 Pi 5,而 9 版本支持 Pi 3、Pi 4、Pi 5 和 Pi Zero 2W。 + +### 安装程序和镜像创建 + +Rocky Linux 安装程序的交互式图形界面 Anaconda 在第 10 版中进行了多项改进。 + +关键变化包括: + +- 默认情况下禁用 root 账户。 系统管理需要创建一个拥有完整 sudo 权限的管理员用户。 如果你选择通过设置密码来启用 root 账户,那么你就可以创建没有管理员权限的标准用户。 +- 远程桌面协议(RDP)在安装过程中取代了 VNC,以进行图形化远程访问。 这一变化会影响相关的内核启动选项。 +- 移除安装程序 "Time & Date" 部分下的时区地图。 +- 图形界面在初始安装时不再支持添加第三方存储库。 使用 `inst.addrepo` 启动选项或 Kickstart 代替。 +- 移除安装时可用的文档。 + +### 内核 + +RL 10 默认的开箱即用内核已经更新到 6.12.0 版本。 + +由于某些内核功能无人维护、不安全或已弃用,现在这些功能已被禁用。 + +如果需要,`rh_waived` 内核命令行参数可以启用这些功能。 最早合格虚拟截止日期优先(Earliest Eligible Virtual Deadline First,EEVDF)取代了 CFS 调度器,它优先处理具有较短时间片的延迟敏感任务,以提高响应速度。 + +### 网络 + +RL 10 中网络功能的增强包括对网络配置、网络接口聚合、DHCP 客户端和服务器的变更以及设备驱动程序的添加与删除。 + +#### NetworkManager 和 Network Script + +旧的 ifcfg-rh 网络脚本在 Rocky Linux 的旧版本(9.x)中已经被弃用。 在 Rocky Linux 10 中,这些脚本已不再可用。 + +现在你必须使用 NetworkManager。 这些工具包括 `nmcli`、`nmtui` 和 `nmstate` 。 这意味着一些较旧的文件和命令将不再起作用,同时存放网络配置文件的位置也发生了变化。 + +- 在 /etc/sysconfig/network-scripts/ 目录下带有 ifcfg- 前缀的文件将不再支持。 +- ifup 和 ifdown 命令不再可用。 +- 不再支持旧版的网络脚本(例如 ifup-local)。 +- 网络配置文件保存在 /etc/NetworkManager/system-connections/ 文件夹中。 + +#### DHCP 客户端与服务器 + +RL 10 中的 DHCP 客户端通过 NetworkManager 的内部子系统来实现。 旧版 dhcp-client 软件包已被移除且上游也不再支持它。 + +在 RL 10 中,Kea DHCP 替换了已到 EOF 的 ISC DHCP 服务器。 + +#### 网络 Bonding 和 Teaming + +Rocky Linux 的旧版本已弃用 NIC teaming 功能。 在 RL 10 中已被完全移除。 作为替代,请配置一个 bond 而不是一个网络 team。 + +### 存储 + +除了以下变更之外,还会从 RL 10 中添加、更新或删除了几个与存储相关的设备驱动程序。 + +#### Global File System 2 (GFS2) + +RL 10 不再支持 GFS2 文件系统。 + +#### Device Mapper Multipath + +RL 10 不支持在 NVMe 设备上启用 Device Mapper (DM) Multipath。 + +#### LUKS2 磁盘加密 + +cryptsetup 软件包为了解决一些问题,已变基到 2.7 版本,并在使用内核转储(kdump)服务时支持 LUKS 加密设备。 + +### 安全功能 + +随着 RL 10 的发布,其引入了许多与安全相关的全新功能。 + +一些更新包括: + +- 系统范围的加密策略(crypto-policies):OpenSSL 和 OpenSSH 现在支持后量子密码学(PQC)。 +- Sequoia PGP:一种内存安全型的 OpenPGP 实现方案。 +- OpenSSH:恢复更严格的 SSH 主机密钥权限管控。 (新权限 = 0600 Vs 旧权限 = 0640)。 +- GnuTLS:客户端与服务器证书现支持压缩传输 +- yescrypt 算法:系统默认账户的密码加密机制已调整为该算法。 + +新的 SELinux 变更包括以下更新: + +- 文件上下文等价关系现在已反转为 /var/run = /run。 +- SELinux 策略新增 libvirt 服务域类型。 + +### 虚拟化 + +虚拟化的主要变化如下: + +- 单一守护进程 libvirtd 已被弃用。 使用模块化和套接字作为替代。 请参阅 [上游文档](https://libvirt.org/daemons.html#monolithic-vs-modular-daemons) 中有关差异的详细文档 +- 弃用 i440fx 虚拟机类型 +- 弃用 Virtual Machine Manage 并打算用 Cockpit 作为替代 + +### 容器 + +RL 10 种的 Podman 5 引入了多项升级特性,其中包括新的默认容器运行时 `crun`,它取代了原有的 `runc`。 Control Groups v2 现在是默认的 cgroup 版本。 + +主要更新包括弃用 slirp4netns 网络模式、新增镜像推送/拉取操作的重试次数与延时配置功能,以及提供对多架构容器镜像的全面支持。 + +此外,Podman 5 继续支持 Podman 4.4 中引入的 Quadlets 功能,该功能允许使用声明式 unit 文件通过 `systemd` 来管理 Podman 容器。 + +### 软件管理 + +RPM 现在是 4.19 版本,其中包含了对打包和构建工具的改进和更新。 还引入了一个新的 `rpmsort` 命令,用于在输出管道中正确排序 RPM 版本字符串。 例如: + +The old `sort`: `rpm -q kernel | sort`\ +kernel-6.12.0-130.el10.x86_64\ +kernel-6.12.0-13.el10.x86_64 + +The new `rpmsort`: `rpm -q kernel | rpmsort`\ +kernel-6.12.0-13.el10.x86_64\ +kernel-6.12.0-130.el10.x86_64 + +#### DNF + +默认情况下,DNF 现在会忽略存储库文件列表元数据的下载,从而增强响应能力并节省磁盘空间。 需要此元数据的 DNF 命令通常会自动完成下载。 + +#### 模块化 + +DNF 模块化已被弃用,Rocky Linux 将在 RL 10 中停止以模块形式提供 AppStream 内容。 未来,RL 10 可能会提供其他应用程序版本,如 RPM 软件包、软件集合 或 Flatpaks 。 + +换言之,由于下一代 DNF 包管理器(`dnf5`)已经统一了 API 并且不再依赖于旧的模块化架构来管理软件的多个版本,因此 `dnf module` 命令在 RL 10 中已经被逐步淘汰。 相关比较如下: + +| 描述 | 旧(`dnf module`) | 新 | +| :------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :---------------------------- | +| 查看可用版本 | `dnf module list ` | `dnf repoquery ` | +| 安装一个特定版本 | `dnf module enable nginx:1.14 && dnf module install nginx:1.14` | `dnf install nginx-1.26.3` | +| 删除某个版本 | `dnf -y module remove --all :` 或者 `dnf -y module remove --all :/` | `dnf remove -` | +| 切换到特定版本 | `dnf -y module remove --all : && dnf module reset && dnf module enable :` | 无需切换 | + +### 桌面环境 + +在 RL 10 中,Wayland 替代了 X.Org Server。 Xwayland 将支持尚未移植到 Wayland 的大多数 X11 客户端。 在 RL 10 中也替换了一些桌面应用程序和组件。 + +#### 桌面组件变更 + +| 已移除 | 替换为 | +| :------------------------ | :------------------------------------------------------- | +| gedit text editor | GNOME Text Editor (gnome-text-editor) | +| Tweaks 应用程序 | 在 GNOME 设置中使用 Tweaks 选项和/或在 Flathub 上使用 Flatpak | +| Festival 语音合成器 | Espeak NG | +| ‌GNOME之眼(eog)图像查看器 | GNOME 图像查看器(Loupe) | +| ‌Cheese 相机程序 | Snapshot 应用程序 | +| GNOME 终端 | ptyxis 终端 | +| PulseAudio 守护程序(不包含客户端接口) | ‌Pipewire(自 RL 9 起已设为默认) | + +几个图形桌面应用程序不再包含在 Rocky Linux 10 发行版中。 在大多数情况下,您可以从上游源或 Flathub 上的 Flatpack 获取这些应用程序。 + +#### 已移除的应用程序 + +| 已移除 | 替换为 | +| :------------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------- | +| LibreOffice 办公生产力软件套件 | 在 Flathub 上作为 Flatpak 正式提供,或者您可以从 [https://www.libreoffice.org/](https://www.libreoffice.org/) 下载上游包。 | +| Evolution 个人信息管理器和电子邮件客户端 | Thunderbird 通过 Appstream 存储库提供。 您还可以从上游或 Flathub 上获取 Flatpak 软件包或原生安装包。 | +| Inkscape 矢量图形编辑器 | RL 10 中没有矢量图形编辑器,但你可以在 Flathub 上找到一个 Flatpak 包。 | +| ‌Totem(GNOME 视频)媒体播放器 | 在 RL 10 中没有默认的桌面媒体播放器。 网页浏览器能播放基于网页的媒体。 用户亦可选择从第三方存储库安装其他媒体播放器,或通过 Flathub 获取 Flatpak。 | + +从 RL 10 中移除了 TigerVNC。 要使用 VNC 客户端功能,请使用 Connections 应用程序。 该系统未提供 VNC 服务器端。\ +‌GNOME 远程桌面(gnome-remote-desktop)采用 RDP 协议并成为 TigerVNC 的替代方案,其支持桌面共享、远程登录及无头会话。 该功能已集成至 GNOME 桌面环境,你可直接在 "设置" 应用程序中配置它。 + +Motif X11 桌面环境和工具包也已经从 RL 10 中移除。 + +### 基础设施服务 + +在 RL 10 的基础设施服务中,替换或移除了部分服务和软件包,包括以下内容。 + +| 已移除 | 替换为 | +| :--------------------------- | :--------------------------------------------- | +| power-profiles-daemon CPU 节流 | tuned-ppd 转译层支持为 power-profiles-daemon 编写的应用程序 | +| redis 内存键值数据库 | valkey[^1] 内存键值数据库 | +| sendmail 邮件传输代理 | Rocky Linux 建议迁移到 Postfix 邮件传输代理。 | +| spamassassin 垃圾邮件过滤器 | spamassassin 垃圾邮件过滤器现在可以在 EPEL 存储库中找到。 | + +[^1]: **valkey**:redis 的一个分叉。 1除了 `valkey` 之外,`valkey-compat-redis` 包也在 Plus 存储库中。 + +### 动态编程语言 + +几个流行编程语言的最新版本都有更新: + +- Python 3.12 +- Ruby 3.3 +- Node.js 22.13 +- Perl 5.40 +- PHP 8.3 + +### Web 服务器和数据库服务器 + +许多流行的服务器守护程序都更新到了最新版本: + +#### Web 服务器 + +- Apache HTTP Server 2.4.63 +- nginx 1.26 + +#### 代理缓存服务器 + +- Varnish Cache 7.6 +- Squid 6.10 + +#### 数据库服务器 + +- MariaDB 10.11 +- MySQL 8.4 +- PostgreSQL 16.8 +- Valkey 8.0 + +### RL 网页控制台(Cockpit) + +Cockpit 是一个基于网页的界面,用于管理和监控您的本地系统。 如果你安装了 `cockpit-files` RPM 包,现在可以在 web 控制台中使用图形文件管理器和文本编辑器。 + +由于安全原因,原本支持多系统同步管理的主机切换器现已弃用,且默认处于禁用状态。 + +Cockpit 现在支持配置 Stratis 文件系统的大小限制。 + +## 已知问题 + +### 虚拟主机上的 SELinux 问题 + +当使用启用了 `passt` 后端和内存类型为 `memfd` 的虚拟主机时,如果启用了 SELinux,则接口将无法启动。 有关更多信息,请参阅 [此上游问题](https://issues.redhat.com/browse/RHEL-80407)。 + +### 安装介质启动后出现灰色屏幕 + +在特定的硬件配置中,例如启用了 3D 图形的虚拟化环境,您可能会在显示设置向导之前遇到 Anaconda 挂起的情况。 这个问题应该可以通过从 tty6 切换到另一个 tty,然后再切换回 tty6 来解决。 例如,切换到 tty1 并返回到 tty6: ++ctrl+alt+f1++,然后 ++ctrl+alt+f6++。 + +## 参与进来和报告 bug + +请向 [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/) 报告您遇到的任何 Bug 。 我们也欢迎您以任何方式加入我们的社区,不管是在我们的 [Forums](https://forums.rockylinux.org)、 [Mattermost](https://chat.rockylinux.org)、[IRC on Libera.Chat](irc://irc.liberachat/rockylinux)、 [Reddit](https://reddit.com/r/rockylinux)、[Mailing Lists](https://lists.resf.org),还是其他任何您希望参与的方式! From 9d942131043229aff904683369a42ffa6f00182f Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Tue, 12 Aug 2025 13:23:28 -0400 Subject: [PATCH 101/164] New Crowdin updates (#2825) * New translations lab7-software_management.md (Italian) * New translations lab8-system_and_process_monitoring-i.md (Italian) * New translations htop.md (French) * New translations mtr.md (French) * New translations string_color.md (French) * New translations rl9_network_manager.md (French) * New translations nload.md (French) * New translations torsocks.md (French) * New translations 00-gh_cli_installation.md (French) * New translations 01-gh_cli_1st_pr.md (French) * New translations 02_github_web_edit_pr_title.md (French) * New translations iftop.md (German) * New translations bash_stub.md (French) --- .../git/00-gh_cli_installation.fr.md | 6 +- docs/gemstones/git/01-gh_cli_1st_pr.fr.md | 6 +- .../git/02_github_web_edit_pr_title.fr.md | 2 +- docs/gemstones/htop.fr.md | 2 +- .../network/RL9_network_manager.fr.md | 12 +- docs/gemstones/network/iftop.de.md | 103 ++ docs/gemstones/network/mtr.fr.md | 2 +- docs/gemstones/network/nload.fr.md | 2 +- docs/gemstones/scripts/bash_stub.fr.md | 2 +- docs/gemstones/string_color.fr.md | 2 +- docs/gemstones/torsocks.fr.md | 4 +- .../lab7-software_management.it.md | 1025 ++++++++-------- ...lab8-system_and_process_monitoring-I.it.md | 1035 +++++++++++++++++ 13 files changed, 1713 insertions(+), 490 deletions(-) create mode 100644 docs/gemstones/network/iftop.de.md create mode 100644 docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.it.md diff --git a/docs/gemstones/git/00-gh_cli_installation.fr.md b/docs/gemstones/git/00-gh_cli_installation.fr.md index e5eea5ab27..ce7cfff9ef 100644 --- a/docs/gemstones/git/00-gh_cli_installation.fr.md +++ b/docs/gemstones/git/00-gh_cli_installation.fr.md @@ -27,7 +27,7 @@ Les utilisateurs ont besoin d’un moyen pratique pour interagir avec GitHub san ## Procédure 1. **Installer le référentiel CLI GitHub à l'aide de curl** : - utilisez la commande curl pour télécharger le fichier du référentiel officiel pour `gh`. Le fichier téléchargé sera enregistré dans le répertoire `/etc/yum.repos.d/`. Après le téléchargement, utilisez la commande `dnf` pour installer `gh` à partir du référentiel. Entrer la commande suivante : + utilisez la commande curl pour télécharger le fichier du référentiel officiel pour `gh`. Le fichier téléchargé sera enregistré dans le répertoire `/etc/yum.repos.d/`. Après le téléchargement, utilisez la commande `dnf` pour installer `gh` à partir du référentiel. Tapez la commande suivante : ```bash curl -fsSL https://cli.github.com/packages/rpm/gh-cli.repo | sudo tee /etc/yum.repos.d/github-cli.repo @@ -35,14 +35,14 @@ Les utilisateurs ont besoin d’un moyen pratique pour interagir avec GitHub san ``` 2. **Vérifier l'installation** : - Assurez-vous que `gh` est correctement installé. Entrer la commande suivante : + Assurez-vous que `gh` est correctement installé. Tapez la commande suivante : ```bash gh --version ``` 3. **Authentification avec GitHub** : - Connectez-vous à votre compte GitHub. Entrer la commande suivante : + Connectez-vous à votre compte GitHub. Tapez la commande suivante : ```bash gh auth login diff --git a/docs/gemstones/git/01-gh_cli_1st_pr.fr.md b/docs/gemstones/git/01-gh_cli_1st_pr.fr.md index 5958ab0a16..da4b58108c 100644 --- a/docs/gemstones/git/01-gh_cli_1st_pr.fr.md +++ b/docs/gemstones/git/01-gh_cli_1st_pr.fr.md @@ -47,7 +47,7 @@ Les contributeurs peuvent préférer ou avoir besoin d'effectuer toutes les acti ``` 4. **Création d'une branche** : - Créez une nouvelle branche pour votre contribution. Entrer la commande suivante : + Créez une nouvelle branche pour votre contribution. Tapez la commande suivante : ```bash git checkout -b new-gemstone @@ -58,7 +58,7 @@ Les contributeurs peuvent préférer ou avoir besoin d'effectuer toutes les acti Pour cet exemple, nous allons créer `gemstome_new_pr.md` et enregistrer ce fichier sous le répertoire `docs/gemstones/`. 6. **Commit des modifications** : - Préparez et validez votre nouveau fichier. Entrer la commande suivante : + Préparez et validez votre nouveau fichier. Tapez la commande suivante : ```bash git add docs/gemstones/gemstome_new_pr.md @@ -66,7 +66,7 @@ Les contributeurs peuvent préférer ou avoir besoin d'effectuer toutes les acti ``` 7. **Push vers le fork** : - Envoyez les modifications vers votre fork/copie du dépôt de documentation Rocky Linux. Entrer la commande suivante : + Envoyez les modifications vers votre fork/copie du dépôt de documentation Rocky Linux. Tapez la commande suivante : ```bash git push origin new-gemstone diff --git a/docs/gemstones/git/02_github_web_edit_pr_title.fr.md b/docs/gemstones/git/02_github_web_edit_pr_title.fr.md index b9718a969e..dbb52a01a0 100644 --- a/docs/gemstones/git/02_github_web_edit_pr_title.fr.md +++ b/docs/gemstones/git/02_github_web_edit_pr_title.fr.md @@ -19,7 +19,7 @@ Parfois, il peut être nécessaire de modifier le titre d'une requête PR après ## Prérequis - Une pull request GitHub en cours de traitement. -- Accès à l'interface Web GitHub ou CLI avec les autorisations nécessaires. +- Accès à l'interface Web de GitHub ou CLI avec les autorisations nécessaires. ## Procédure diff --git a/docs/gemstones/htop.fr.md b/docs/gemstones/htop.fr.md index bb1adbe0e1..698afc4c3b 100644 --- a/docs/gemstones/htop.fr.md +++ b/docs/gemstones/htop.fr.md @@ -1,5 +1,5 @@ --- -title: htop - Gestion des Processus +title: htop – Gestion des Processus author: tianci li contributors: Steven Spencer date: 2021-10-16 diff --git a/docs/gemstones/network/RL9_network_manager.fr.md b/docs/gemstones/network/RL9_network_manager.fr.md index e5d3813b33..f2dc3dafe9 100644 --- a/docs/gemstones/network/RL9_network_manager.fr.md +++ b/docs/gemstones/network/RL9_network_manager.fr.md @@ -22,7 +22,7 @@ shell > dnf -y install NetworkManager NetworkManager-tui shell > nmtui ``` -| NetworkManager TUI (nmtui) | | +| NetworkManager TUI | | | -------------------------------- | -- | | Modifier une connexion | | | Activer une connexion | | @@ -121,7 +121,7 @@ Shell > nmcli connection edit CONNECTION_NAME nmcli > help ``` -Vous pouvez également modifier une ou plusieurs propriétés de la connexion directement à partir de la ligne de commande avec le mot-clé `modify`. Par exemple : +Vous pouvez également modifier une ou plusieurs propriétés de la connexion directement à partir de la ligne de commande avec le mot-clé `modify`. Par exemple : ```bash Shell > nmcli connection modify CONNECTION_NAME autoconnect yes ipv6.method dhcp @@ -151,7 +151,7 @@ Shell > nmcli connection add type bond-slave ifname NIC_DEVICE_NAME2 mas Vous pouvez afficher des informations plus détaillées via `man 5 NetworkManager.conf` et `man 5 nm-settings-nmcli`. -Le contenu du fichier de configuration de la carte réseau NetworkManager est un fichier clé de style init. Par exemple : +Le contenu du fichier de configuration de la carte réseau NetworkManager est un fichier clé de style init. Par exemple : ```bash Shell > cat /etc/NetworkManager/system-connections/ens160.nmconnection @@ -183,7 +183,7 @@ method=disabled Les titres comme nom de **connection** peuvent contenir ces paires de clé-valeur commune : -| nom de la clé | description | +| nom de la clé | Description | | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | id | L'alias de `con-name`, dont la valeur est une chaîne. | | uuid | Identifiant universel unique, dont la valeur est une chaîne de caractères. | @@ -194,7 +194,7 @@ Les titres comme nom de **connection** peuvent contenir ces paires de clé-valeu **les noms de titres** éthernet peuvent contenir ces paires de clés communes : -| nom de la clé | description | +| nom de la clé | Description | | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | mac-address | Adresse MAC physique. | | mtu | Unité de Transmission Maximale. | @@ -204,7 +204,7 @@ Les titres comme nom de **connection** peuvent contenir ces paires de clé-valeu Les titres des noms **ipv4** peuvent contenir ces paires de valeurs clés communes: -| Mot-clé | description | +| Mot-clé | Description | | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | addresses | Adresses IP assignées | | gateway | Passerelle (accès réseau) pour l'interface | diff --git a/docs/gemstones/network/iftop.de.md b/docs/gemstones/network/iftop.de.md new file mode 100644 index 0000000000..c5583bfcc8 --- /dev/null +++ b/docs/gemstones/network/iftop.de.md @@ -0,0 +1,103 @@ +--- +title: iftop - Echtzeit-Bandbreitenstatistik pro Verbindung +author: Neel Chauhan +contributors: Ganna Zhyrnova, Steven Spencer +date: 2024-02-24 +--- + +# `iftop` - Einleitung + +`iftop` ist ein textbasierter Netzwerk-Monitor. Zeigen Sie die Traffic- und Bandbreiten-Statistiken Ihres Servers für jede Verbindung an. + +## `iftop`-Verwendung + +```bash +dnf -y install epel-release +dnf -y install iftop +``` + +Es folgen die Optionen des Befehls `iftop`. + +| Options | Beschreibung | +| -------------- | ---------------------------------------------------------------------------------------------- | +| -n | Vermeidet Hostnamen-Lookups | +| -N | Vermeidet die Auflösung von Port-Nummern in Dienstnamen | +| -p | Es läuft im Promiscuous-Modus, sodass der gesamte Verkehr gezählt wird | +| -P | Zeigt die Portnummern für Verbindungen an | +| -l | Zeigt und zählt den Traffic zu oder von lokalen IPv6-Adressen | +| -b | Zeigt keine Balkendiagramme für den Traffic an | +| -m LIMIT | Legt eine Obergrenze für das Bandbreitendiagramm fest, angegeben als Zahl und Einheiten-Suffix | +| -u UNIT | Zeigt die Traffic-Geschwindigkeiten für die angegebene Maßeinheit an | +| -B UNIT | Synonym für `-u` | +| -i INTERFACE | Gemessene Schnittstelle | +| -f FILTER CODE | Verwendet den folgenden Filtercode | +| -F NET/MASK | Misst nur den Traffic zum angegebenen IPv4-Netzwerk | +| -G NET/MASK | Misst den Traffic nur zum angegebenen IPv6-Netzwerk | +| -c config | Verwendet die angegebene Konfigurationsdatei | +| -t | `non-ncurses`-Modus verwenden | + +Die Einheiten für das Flag **-M** sind folgende: + +| Einheit | Bedeutung | +| ------- | --------- | +| K | Kilo | +| M | Mega | +| G | Giga | + +Die Einheiten für das Flag **-u** sind folgende: + +| Einheit | Bedeutung | +| ------- | ------------------ | +| bit | bits per second | +| bytes | bytes per second | +| packets | packets per second | + +Ein Beispiel für die Ausgabe vom Heimserver des Autors, auf dem ein [Tor](https://www.torproject.org/) [Relay](https://community.torproject.org/relay/types-of-relays/)-Programm ausgeführt wird: + +```bash + Listening on bridge b 25.0Kb 37.5Kb 50.0Kb 62.5Kb +└───────────────┴───────────────┴───────────────┴───────────────┴─────────────── +tt.neelc.org => X.X.X.X 13.5Mb 13.5Mb 13.5Mb + <= 749Kb 749Kb 749Kb +tt.neelc.org => X.X.X.X 6.21Mb 6.21Mb 6.21Mb + <= 317Kb 317Kb 317Kb +tt.neelc.org => X.X.X.X 3.61Mb 3.61Mb 3.61Mb + <= 194Kb 194Kb 194Kb +tt.neelc.org => X.X.X.X 181Kb 181Kb 181Kb + <= 3.36Mb 3.36Mb 3.36Mb +tt.neelc.org => X.X.X.X 151Kb 151Kb 151Kb + <= 3.24Mb 3.24Mb 3.24Mb +tt.neelc.org => X.X.X.X 2.97Mb 2.97Mb 2.97Mb + <= 205Kb 205Kb 205Kb +tt.neelc.org => X.X.X.X 156Kb 156Kb 156Kb + <= 2.97Mb 2.97Mb 2.97Mb +tt.neelc.org => X.X.X.X 2.80Mb 2.80Mb 2.80Mb + <= 145Kb 145Kb 145Kb +tt.neelc.org => X.X.X.X 136Kb 136Kb 136Kb + <= 2.45Mb 2.45Mb 2.45Mb +──────────────────────────────────────────────────────────────────────────────── +TX: cum: 30.1MB peak: 121Mb rates: 121Mb 121Mb 121Mb +RX: 30.4MB 122Mb 122Mb 122Mb 122Mb +TOTAL: 60.5MB 242Mb 242Mb 242Mb 242Mb +``` + +Aufschlüsselung der Zeilen im unteren Bereich: + +- TX – Datennutzung beim Senden/Hochladen +- RX - Datennutzung empfangen/herunterladen +- TOTAL – Kombinierte Upload-/Download-Nutzung + +## Tastaturkürzel + +- \++s++ - aggregiert den gesamten Datenverkehr für jede Quelle +- \++d++ - aggregiert den gesamten Datenverkehr für jedes Ziel +- \++shift+s++ - schaltet die Anzeige des Quellports um +- \++shift+d++ - schaltet die Anzeige des Zielports um +- \++t++ - schaltet zwischen den Anzeigemodi um: Standardmäßige zweizeilige Anzeige mit Sende- und Empfangsverkehr und dreizeilige Anzeige von Sende-, Empfangs- und Gesamt-Traffic +- \++1++, ++2++, ++3++ – Sortieren nach 1., 2. oder 3. Spalte +- \++l++ - geben Sie einen POSIX-regulären Ausdruck ein, um Hostnamen zu filtern +- \++shift+p++ - Pausiert die aktuelle Anzeige +- \++o++ - friert die Gesamtbandbreiten-Auswertung ein +- \++j++ - nach unten scrollen +- \++k++ - nach oben scrollen +- \++f++ – bearbeitet den Filtercode diff --git a/docs/gemstones/network/mtr.fr.md b/docs/gemstones/network/mtr.fr.md index dd7bf72312..f9204aa537 100644 --- a/docs/gemstones/network/mtr.fr.md +++ b/docs/gemstones/network/mtr.fr.md @@ -23,7 +23,7 @@ Les options les plus courantes de la commande `mtr` sont les suivantes. En temps | -4 | # IPv4 seulement | | -6 | # IPv6 seulement | | -c COUNT | # Nombre de pings | -| -n | # pas de résolution du nom de l'hôte | +| -n | # pas de résolution du nom d'hôte | | -z | # Affichage du nombre AS | | -b | # Affichage de l'adresse IP et du nom de l'hôte | | -w | # Output a wide range of reports | diff --git a/docs/gemstones/network/nload.fr.md b/docs/gemstones/network/nload.fr.md index f61119478a..1630b24360 100644 --- a/docs/gemstones/network/nload.fr.md +++ b/docs/gemstones/network/nload.fr.md @@ -18,7 +18,7 @@ dnf -y install nload Voici les options courantes de la commande `nload` qui, dans des circonstances normales, ne nécessitent rien de plus. Les options précèdent l'interface à surveiller : -| Options | Observation | +| Option | Description | | ----------- | --------------------------------------------------------------------------------------------------------------- | | -a PERIOD | Durée de la fenêtre de calcul en secondes (par défaut : 300) | | -m | Affiche plusieurs périphériques et ne présente pas de graphique de trafic | diff --git a/docs/gemstones/scripts/bash_stub.fr.md b/docs/gemstones/scripts/bash_stub.fr.md index eeca0fbc38..a8a4ed9f75 100644 --- a/docs/gemstones/scripts/bash_stub.fr.md +++ b/docs/gemstones/scripts/bash_stub.fr.md @@ -102,4 +102,4 @@ rm -f $LOCKF ## Conclusion -Scripting is a System Administrator's friend. Être capable de faire rapidement certaines tâches dans un script rationalise la réalisation du processus. Bien qu'il ne s'agisse pas d'un ensemble exhaustif de routines de scripts, ce conteneur offre quelques exemples d'utilisation courante. +Scripting is a System Administrator's friend. Être capable de faire rapidement certaines tâches dans un script rationalise la réalisation du processus. Bien qu'il ne s'agisse pas d'un ensemble exhaustif de routines de scripts, ce `stub` offre quelques exemples d'utilisation courante. diff --git a/docs/gemstones/string_color.fr.md b/docs/gemstones/string_color.fr.md index ef65c10580..fa4ecf4bf7 100644 --- a/docs/gemstones/string_color.fr.md +++ b/docs/gemstones/string_color.fr.md @@ -30,7 +30,7 @@ Lorsque nous téléchargeons des scripts bash qui ont été écrits par d'autres | **Code couleur d'arrière-plan** | **description** | |:-------------------------------:|:---------------:| | 40 | noir | -| 41 | crimson | +| 41 | cramoisi | | 42 | vert | | 43 | jaune | | 44 | bleu | diff --git a/docs/gemstones/torsocks.fr.md b/docs/gemstones/torsocks.fr.md index 5c633ae614..1aa938f751 100644 --- a/docs/gemstones/torsocks.fr.md +++ b/docs/gemstones/torsocks.fr.md @@ -17,9 +17,9 @@ dnf -y install tor torsocks systemctl enable --now tor ``` -Les options courantes de la commande `torsocks` suivent et, dans des circonstances normales, ne nécessitent rien de plus. Les options apparaissent avant que l'application ne soit lancée (par exemple, `curl`) : +Les options courantes de la commande `torsocks` suivent et, dans des circonstances normales, ne nécessitent rien de plus. Les options précèdent l'application à exécuter (par exemple, `curl`) : -| Options | Observation | +| Option | Description | | ---------- | ------------------------------------------------------------ | | --shell | Crée un nouveau shell avec LD\_PRELOAD | | -u USER | Indique l'utilisateur de SOCKS5 | diff --git a/docs/labs/systems_administration_I/lab7-software_management.it.md b/docs/labs/systems_administration_I/lab7-software_management.it.md index 7424fdc48b..fb3a078047 100644 --- a/docs/labs/systems_administration_I/lab7-software_management.it.md +++ b/docs/labs/systems_administration_I/lab7-software_management.it.md @@ -1,8 +1,11 @@ -- - - -author: Wale Soyinka contributors: Steven Spencer, tianci li tested on: 8.8 tags: +--- +author: Wale Soyinka +contributors: Steven Spencer, tianci li, Ganna Zhyrnova +tested on: 8.8 +tags: - lab exercise - software management -- - - +--- # Laboratorio 7: Gestione e installazione del software @@ -11,456 +14,474 @@ author: Wale Soyinka contributors: Steven Spencer, tianci li tested on: 8.8 tags Dopo aver completato questo laboratorio, sarete in grado di - Interrogare i pacchetti per ottenere informazioni -- Installare software da pacchetti binari +- Installare il software dai pacchetti binari - Risolvere alcuni problemi di dipendenza di base -- Compilare e installare il software dai sorgenti +- Compilare e installare il software dal codice sorgente Tempo stimato per completare questo laboratorio: 90 minuti ## File binari e file sorgente -Le applicazioni attualmente installate sul sistema dipendono da alcuni fattori. Il fattore principale dipende dai gruppi di pacchetti software selezionati durante l'installazione del sistema operativo. L'altro fattore dipende da ciò che è stato fatto al sistema dal suo utilizzo. +Le applicazioni installate sul sistema dipendono da alcuni fattori. Il fattore principale dipende dai gruppi di pacchetti software selezionati durante l'installazione del sistema operativo. L'altro fattore dipende da cosa è stato fatto al sistema dopo il suo utilizzo. -Uno dei compiti di routine di un amministratore di sistema è la gestione del software. Questo spesso comporta: +Scoprirai che una delle tue attività di routine come amministratore di sistema è la gestione del software. Questo spesso comporta: - installazione di un nuovo software - disinstallazione del software - aggiornamento del software già installato -Il software può essere installato su sistemi basati su Linux utilizzando diversi metodi. È possibile installare dai sorgenti o dai binari precompilati. Quest'ultimo metodo è il più semplice, ma anche il meno personalizzabile. Quando si installa da binari precompilati, la maggior parte del lavoro è già stato fatto per voi, ma anche in questo caso è necessario conoscere il nome e la posizione del software desiderato. +L'installazione di software su sistemi basati su Linux utilizza diversi metodi. È possibile eseguire l'installazione dal codice sorgente o dai binari precompilati. Quest'ultimo metodo è il più semplice, ma è anche il meno personalizzabile. Quando si esegue l'installazione da binari precompilati, la maggior parte del lavoro è già stata fatta per voi. Tuttavia, è necessario conoscere il nome e sapere dove trovare il software specifico che si desidera. -Quasi tutti i software vengono originariamente forniti come file sorgente del linguaggio di programmazione C o C++. I programmi sorgente sono solitamente distribuiti come archivi di file sorgente. Di solito file tar o gzip o bzip2. Ciò significa che sono disponibili compressi o in un unico pacchetto. +Quasi tutti i software sono originariamente disponibili come file sorgente in linguaggio di programmazione C o "C++". I programmi sorgente vengono solitamente distribuiti sotto forma di archivi di file sorgente. Di solito file compressi con tar, gzip o bzip2. Ciò significa che sono compressi o disponibili in un unico pacchetto. -La maggior parte degli sviluppatori ha reso il proprio codice sorgente conforme agli standard GNU, rendendolo più facile da condividere. Significa anche che i pacchetti verranno compilati su qualsiasi sistema UNIX o UNIX-like (ad esempio, Linux). +La maggior parte degli sviluppatori ha reso il proprio codice sorgente conforme agli standard GNU, facilitando la condivisione. Ciò significa anche che i pacchetti potranno essere compilati su qualsiasi sistema UNIX o UNIX-like (ad esempio Linux). -RPM è lo strumento di base per la gestione delle applicazioni (pacchetti) sulle distribuzioni basate su Red Hat come Rocky Linux, Fedora, Red Hat Enterprise Linux (RHEL), openSuSE, Mandrake e così via. +RPM è lo strumento di base per la gestione delle applicazioni (pacchetti) sulle distribuzioni basate su Red Hat, quali Rocky Linux, Fedora, Red Hat Enterprise Linux (RHEL), openSuSE, Mandrake e così via. -Le applicazioni utilizzate per la gestione del software sulle distribuzioni Linux sono chiamate gestori di pacchetti. Esempi sono: +Le applicazioni utilizzate per la gestione del software nelle distribuzioni Linux sono chiamate gestori di pacchetti. Esempi: - Il gestore di pacchetti Red Hat (`rpm`). I pacchetti hanno il suffisso " .rpm" - Il sistema di gestione dei pacchetti Debian (`dpkg`). I pacchetti hanno il suffisso " .deb" -Di seguito sono elencate alcune opzioni della riga di comando e la sintassi del comando RPM: +Di seguito sono elencate alcune opzioni della riga di comando e sintassi popolari per il comando RPM: -**rpm** +### `rpm` Uso: rpm [OPZIONE...] -**INTERROGARE I PACCHETTI** - -``` -Opzioni di interrogazione (con -q o --query): - -c, --configfiles elenca tutti i file di configurazione - -d, --docfiles elenca tutti i file di documentazione - -L, --licensefiles elenca tutti i file di licenza - -A, --artifactfiles elenca tutti i file degli artefatti - --dump elenca le informazioni di base sui file - -l, --list elenca i file del pacchetto - --queryformat=QUERYFORMAT utilizza il seguente formato di query - -s, --state visualizza gli stati dei file elencati +**INTERROGAZIONE DEI PACCHETTI** + +```bash +Query options (with -q or --query): + -c, --configfiles elenca tutti i file di configurazione + -d, --docfiles elenca tutti i file di documentazione + -L, --licensefiles elenca tutti i file di licenza + -A, --artifactfiles elenca tutti i file degli artefatti + --dump scaricare le informazioni di base del file + -l, --list elenca i file nel pacchetto + --queryformat=QUERYFORMAT utilizzare il seguente formato di query + -s, --state visualizza lo stato dei file elencati ``` **VERIFICA DEI PACCHETTI** -``` -Opzioni di verifica (con -V o --verify): - --nofiledigest non verifica il digest dei file - --nofiles non verifica i file del pacchetto - --nodeps non verifica le dipendenze del pacchetto - --noscript non esegue gli script di verifica +```bash +Verify options (with -V or --verify): + --nofiledigest non verificare il digest dei file + --nofiles non verificare i file nel pacchetto + --nodeps non verificare le dipendenze dei pacchetti + --noscript non eseguire gli script di verifica ``` -**INSTALLARE, AGGIORNARE E RIMUOVERE I PACCHETTI** - -``` -Opzioni di installazione/aggiornamento/cancellazione: - --allfiles installa tutti i file, anche le configurazioni che altrimenti potrebbero essere saltate - -e, --erase=+ cancella (disinstalla) il pacchetto - --excludedocs non installa la documentazione - --excludepath= salta i file con il componente principale - --forza abbreviazione di --replacepkgs --replacefiles - -F, --freshen=+ aggiorna i pacchetti se già installati - -h, --hash stampa i segni di hash durante l'installazione dei pacchetti (ottimo con -v) - --noverify abbreviazione di --ignorepayload --ignoresignature - -i, --install installa i pacchetti - --nodeps non verifica le dipendenze dei pacchetti - --noscripts non esegue gli scriptlet dei pacchetti - --percent stampa le percentuali durante l'installazione del pacchetto - --prefix= ricolloca il pacchetto in , se ricollocabile - --relocate== ricollocare i file dal percorso a - --replacefiles ignora i conflitti di file tra i pacchetti - --replacepkgs reinstalla se il pacchetto è già presente - --test non installa, ma dice se funzionerebbe o meno - -U, --upgrade=+ aggiorna i pacchetti - --reinstall=+ reinstallare il/i pacchetto/i +**INSTALLAZIONE, AGGIORNAMENTO E RIMOZIONE DEI PACCHETTI** + +```bash +Opzioni di installazione/aggiornamento/rimozione: + --allfiles installa tutti i file, anche le configurazioni che altrimenti potrebbero essere omesse + -e, --erase=+ elimina (disinstalla) il pacchetto + --excludedocs non installare la documentazione. + --excludepath= salta i file con componente iniziale + --force abbreviazione per --replacepkgs --replacefiles + -F, --freshen=+ aggiornare i pacchetti se già installati + -h, --hash stampa gli hash durante l'installazione dei pacchetti (ottimo con -v) + --noverify abbreviazione per --ignorepayload --ignoresignature + -i, --install installare pacchetto/i + --nodeps non verificare le dipendenze dei pacchetti + --noscripts non eseguire gli scriptlet del pacchetto + --percent stampa le percentuali durante l'installazione del pacchetto + --prefix= spostare il pacchetto in , se spostabile + --relocate== sposta i file dal percorso a + --replacefiles ignora i conflitti tra i file dei pacchetti + --replacepkgs reinstallare se il pacchetto è già presente. + --test non installare, ma provare se funziona + -U, --upgrade=+ aggiornare i pacchetti + --reinstall=+ reinstallare i pacchetti ``` ## Esercizio 1 ### Installazione, interrogazione e disinstallazione dei pacchetti -In questo laboratorio imparerete a usare il sistema RPM e installerete un'applicazione di esempio sul vostro sistema. +In questo laboratorio si imparerà come utilizzare il sistema RPM e installare un'applicazione di esempio. !!! tip "Suggerimento" - Avete molte opzioni per ottenere i pacchetti Rocky Linux. È possibile scaricarli manualmente da repository affidabili [o non affidabili]. È possibile ottenerli dalla ISO di distribuzione. È possibile ottenerli da una posizione condivisa a livello centrale utilizzando protocolli come nfs, git, https, ftp, smb, cifs e così via. Se siete curiosi, potete consultare il seguente sito web ufficiale e sfogliare il repository applicabile per i pacchetti desiderati: - - https://download.rockylinux.org/pub/rocky/8.8/ - -#### Per interrogare i pacchetti per ottenere informazioni. +``` +Sono disponibili numerose opzioni per ottenere i pacchetti Rocky Linux. È possibile scaricarli manualmente da repository affidabili [o non affidabili]. È possibile ottenerli dall'ISO della distribuzione. È possibile ottenerli da una posizione condivisa centralmente utilizzando protocolli quali nfs, git, https, ftp, smb, cifs e così via. Se siete curiosi, potete visitare il sito web ufficiale seguente e consultare il repository appropriato per i pacchetti desiderati: -1. Per visualizzare un elenco di tutti i pacchetti attualmente installati sul sistema locale, digitate: +https://download.rockylinux.org/pub/rocky/8.8/ +``` - ``` - $ rpm -qa - python3-gobject-base-* - NetworkManager-* - rocky-repos-* - ...... - ``` +#### Per richiedere informazioni sui pacchetti - Dovrebbe apparire un lungo elenco. +1. Per visualizzare un elenco di tutti i pacchetti attualmente installati sul sistema locale, digitare: -2. Approfondiamo un po' la questione e scopriamo di più su uno dei pacchetti installati nel sistema. Esamineremo NetworkManager. Utilizzeremo le opzioni --query (-q) e --info (-i) con il comando `rpm`. Digitate: + ```bash + $ rpm -qa + python3-gobject-base-* + NetworkManager-* + rocky-repos-* + ...... + ``` - ``` - $ rpm -qi NetworkManager - Name : NetworkManager - Epoch : 1 - ...... - ``` + Dovresti vedere un lungo elenco. - Si tratta di una grande quantità di informazioni (metadati)! +2. Approfondiamo un po' e scopriamo qualcosa in più su uno dei pacchetti installati sul sistema. Esamineremo NetworkManager. Utilizzeremo le opzioni --query (-q) e --info (-i) con il comando `rpm`. Digitare: -3. Supponiamo di essere interessati solo al campo Riepilogo del comando precedente. Si può usare l'opzione --queryformat di rpm per filtrare le informazioni ottenute dall'opzione query. + ```bash + $ rpm -qi NetworkManager + Name : NetworkManager + Epoch : 1 + ...... + ``` - Ad esempio, per visualizzare solo il campo Riepilogo, digitare: + Si tratta di una grande quantità di informazioni (metadati)! - ``` - $ rpm -q --queryformat '%{summary}\n' NetworkManager - ``` +3. Supponiamo di essere interessati solo al campo Summary del comando precedente. Possiamo utilizzare l'opzione --queryformat di rpm per filtrare le informazioni che otteniamo dall'opzione query. - Il nome del campo è insensibile alle maiuscole e alle minuscole. + Ad esempio, per visualizzare solo il campo Summary, digitare: -4. Per visualizzare i campi Versione e Riepilogo del tipo di pacchetto NetworkManager installato: + ```bash + rpm -q --queryformat '%{summary}\n' NetworkManager + ``` - ``` - $ rpm -q --queryformat '%{version} %{summary}\n' NetworkManager - ``` + Il nome del campo non fa distinzione tra maiuscole e minuscole. -5. Digitare il comando per visualizzare le informazioni sul pacchetto bash installato nel sistema. +4. Per visualizzare sia il campo Version che il campo Summary del pacchetto NetworkManager installato, digitare: - ``` - $ rpm -qi bash - ``` + ```bash + rpm -q --queryformat '%{version} %{summary}\n' NetworkManager + ``` - !!! note "Nota" +5. Digitare il comando per visualizzare le informazioni relative al pacchetto bash installato sul sistema. - Gli esercizi precedenti consistevano nell'interrogare e lavorare con i pacchetti già installati nel sistema. Nei prossimi esercizi inizieremo a lavorare con i pacchetti non ancora installati. Utilizzeremo l'applicazione DNF per scaricare i pacchetti che utilizzeremo nei passi successivi. + ```bash + rpm -qi bash + ``` -6. Innanzitutto assicuratevi che l'applicazione `wget` non sia già installata sul sistema. Digita: + !!! note "Nota" - ``` - $ rpm -q wget - package wget is not installed - ``` + ``` + Gli esercizi precedenti riguardavano la ricerca e l'utilizzo di pacchetti già installati sul sistema. Nei seguenti esercizi inizieremo a lavorare con pacchetti che non sono ancora stati installati. Utilizzeremo l'applicazione DNF per scaricare i pacchetti che useremo nei passaggi successivi. + ``` - Sembra che `wget` non sia installato sul nostro sistema demo. +6. Innanzitutto, assicurarsi che l'applicazione `wget` non sia già installata sul sistema. Digitare: -7. A partire da Rocky Linux 8.x, il comando `dnf download` consente di ottenere l'ultimo pacchetto `rpm` per `wget`. Digita: + ```bash + rpm -q wget + package wget is not installed + ``` - ``` - dnf download wget - ``` + Sembra che `wget` non sia installato sul nostro sistema demo. -8. Usate il comando `ls` per assicurarvi che il pacchetto sia stato scaricato nella vostra directory corrente. Digita: +7. A partire da Rocky Linux 8.x, il comando `dnf download` ti consentirà di ottenere l'ultimo pacchetto `rpm` per `wget`. Digitare: - ``` - $ ls -lh wg* - ``` + ```bash + dnf download wget + ``` -9. Usare il comando `rpm` per cercare informazioni sul file wget-*.rpm scaricato. Digita: +8. Utilizzare il comando `ls` per assicurarsi che il pacchetto sia stato scaricato nella directory corrente. Digitare: - ``` - $ rpm -qip wget-*.rpm - Name : wget - Architecture: x86_64 - Install Date: (not installed) - Group : Applications/Internet - ...... - ``` + ```bash + ls -lh wg* + ``` -10. Dal risultato del passo precedente, qual'è esattamente il pacchetto `wget`? Suggerimento: è possibile utilizzare l'opzione di formato della query rpm per visualizzare il campo della descrizione del pacchetto scaricato. +9. Utilizzare il comando `rpm` per richiedere informazioni sul file wget-\*.rpm scaricato. Digitare: -11. Se siete interessati al pacchetto `wget files-.rpm`, potete elencare tutti i file inclusi nel pacchetto digitando: + ```bash + rpm -qip wget-*.rpm + Name : wget + Architecture: x86_64 + Install Date: (not installed) + Group : Applications/Internet + ...... + ``` - ``` - $ rpm -qlp wget-*.rpm | head - /etc/wgetrc - /usr/bin/wget - ...... - /usr/share/doc/wget/AUTHORS - /usr/share/doc/wget/COPYING - /usr/share/doc/wget/MAILING-LIST - /usr/share/doc/wget/NEWS - ``` + !!! question "Domanda" -12. Vediamo il contenuto del file `/usr/share/doc/wget/AUTHORS` che è elencato come parte del pacchetto `wget`. Utilizzeremo il comando `cat`. Digita: + ``` + Dal risultato ottenuto nel passaggio precedente, che cos'è esattamente il pacchetto `wget`? Suggerimento: è possibile utilizzare l'opzione di formato query `rpm` per visualizzare il campo di descrizione del pacchetto scaricato. + ``` - ``` - $ cat /usr/share/doc/wget/AUTHORS - cat: /usr/share/doc/wget/AUTHORS: No such file or directory - ``` +10. Se siete interessati al pacchetto `wget files-.rpm`, è possibile elencare tutti i file inclusi nel pacchetto digitando: - `wget` non è [ancora] installato sul nostro sistema demo! E quindi non è possibile visualizzare il file AUTHORS che viene fornito con esso! + ```bash + rpm -qlp wget-*.rpm | head + /etc/wgetrc + /usr/bin/wget + ...... + /usr/share/doc/wget/AUTHORS + /usr/share/doc/wget/COPYING + /usr/share/doc/wget/MAILING-LIST + /usr/share/doc/wget/NEWS + ``` -13. Visualizza l'elenco dei file forniti con un altro pacchetto (curl) *già* installato nel sistema. Digita: +11. Visualizziamo il contenuto del file `/usr/share/doc/wget/AUTHORS` elencato come parte del pacchetto `wget`. Useremo il comando `cat`. Digitare: - ``` - $ rpm -ql curl - /usr/bin/curl - /usr/lib/.build-id - /usr/lib/.build-id/fc - ...<>... - ``` + ```bash + cat /usr/share/doc/wget/AUTHORS + cat: /usr/share/doc/wget/AUTHORS: No such file or directory + ``` - !!! note "Nota" + `wget` non è stato [ancora] installato sul nostro sistema demo! E quindi, non possiamo visualizzare il file AUTHORS che è incluso nel pacchetto! - Si noterà che nel comando precedente non è stato necessario fare riferimento al nome completo del pacchetto `curl`. Questo perché `curl` è già installato. +12. Visualizzare l'elenco dei file inclusi in un altro pacchetto (curl) che è _già_ installato sul sistema. Digitare: -#### Conoscenza estesa sul nome del pacchetto + ```bash + $ rpm -ql curl + /usr/bin/curl + /usr/lib/.build-id + /usr/lib/.build-id/fc + ...<>... + ``` -* **Nome completo del pacchetto**: quando si scarica un pacchetto da una fonte affidabile (ad esempio, il sito web del fornitore, il repository dello sviluppatore), il nome del file scaricato è il nome completo del pacchetto, ad esempio -- htop-3.2.1-1.el8.x86_64.rpm. Quando si usa il comando `rpm` per installare/aggiornare questo pacchetto, l'oggetto gestito dal comando deve essere il nome completo (o l'equivalente del carattere jolly) del pacchetto, come ad esempio: + !!! note "Nota" - ``` - $ rpm -ivh htop-3.2.1-1.el8.x86_64.rpm - ``` + ``` + Si noterà che nel comando precedente non è stato necessario fare riferimento al nome completo del pacchetto `curl`. Questo perché `curl` è già installato. + ``` - ``` - $ rpm -Uvh htop-3.2.1-1.*.rpm - ``` +#### Maggiori informazioni sul nome del pacchetto - ``` - $ rpm -qip htop-3.*.rpm - ``` +- **Nome completo del pacchetto**: quando si scarica un pacchetto da una fonte attendibile (ad esempio, il sito web del fornitore o il repository dello sviluppatore), il nome del file scaricato è il nome completo del pacchetto, ad esempio -- htop-3.2.1-1.el8.x86_64.rpm. Quando si utilizza il comando `rpm` per installare/aggiornare questo pacchetto, l'oggetto gestito dal comando deve essere il nome completo (o un carattere jolly equivalente) del pacchetto, ad esempio: - ``` - $ rpm -qlp wget-1.19.5-11.el8.x86_64.rpm - ``` + ```bash + rpm -ivh htop-3.2.1-1.el8.x86_64.rpm + ``` + ```bash + rpm -Uvh htop-3.2.1-1.*.rpm + ``` - Il nome completo del pacchetto segue una convenzione di denominazione simile a questa —— `[Package_Name]-[Version]-[Release].[OS].[Arch].rpm` or `[Package_Name]-[Version]-[Release].[OS].[Arch].src.rpm` + ```bash + rpm -qip htop-3.*.rpm + ``` -* **Nome del pacchetto**: Poiché RPM utilizza un database per gestire il software, una volta completata l'installazione del pacchetto, il database avrà i record corrispondenti. A questo punto, l'oggetto operativo del comando `rpm` deve solo digitare il nome del pacchetto. come ad esempio: + ```bash + rpm -qlp wget-1.19.5-11.el8.x86_64.rpm + ``` - ``` - $ rpm -qi bash - ``` + Il nome completo del pacchetto segue una convenzione di denominazione simile a questa —— `[Package_Name]-[Version]-[Release].[OS].[Arch].rpm` o `[Package_Name]-[Version]-[Release].[OS].[Arch].src.rpm` - ``` - $ rpm -q systemd - ``` +- **Nome del pacchetto**: poiché RPM utilizza un database per gestire il software, una volta completata l'installazione del pacchetto, il database conterrà i record corrispondenti. In questo momento, per usare il comando `rpm` basta solo scrivere il nome del pacchetto. come ad esempio: - ``` - $ rpm -ql chrony - ``` + ```bash + rpm -qi bash + ``` + ```bash + rpm -q systemd + ``` + ```bash + rpm -ql chrony + ``` ## Esercizio 2 ### Integrità del pacchetto -1. È possibile scaricare o ritrovarsi con un file corrotto o contaminato. Verificare l'integrità del pacchetto `wget` scaricato. Digita: +1. È possibile scaricare o ritrovarsi con un file danneggiato o contaminato. Per verificare l'integrità del pacchetto `wget` che avete scaricato. Digitare: - ``` - $ rpm -K wget-*.rpm - wget-1.19.5-10.el8.x86_64.rpm: digests signatures OK - ``` + ```bash + rpm -K wget-*.rpm + wget-1.19.5-10.el8.x86_64.rpm: digests signatures OK + ``` - Il messaggio "digests signatures OK" nell'output mostra che il pacchetto è a posto. + Il messaggio "digests signatures OK" nell'output indica che il pacchetto è corretto. -2. Facciamo finta di essere malintenzionati e alteriamo deliberatamente il pacchetto scaricato. Questo può essere fatto aggiungendo o togliendo qualcosa al pacchetto originale. Qualsiasi cosa che modifichi il pacchetto in un modo che non era nelle intenzioni di chi lo ha confezionato originariamente, corromperà il pacchetto stesso. Modificheremo il file utilizzando il comando echo per aggiungere la stringa "haha" al pacchetto. Digita: +2. Siamo maliziosi e modifichiamo deliberatamente il pacchetto scaricato. Questo può essere fatto aggiungendo o rimuovendo qualcosa dal pacchetto originale. Qualsiasi modifica al pacchetto che non sia stata prevista dai creatori originali danneggerà il pacchetto. Modificheremo il file utilizzando il comando `echo` per aggiungere la stringa "haha" al pacchetto. Digitare: - ``` - $ echo haha >> wget-1.19.5-10.el8.x86_64.rpm - ``` + ```bash + echo haha >> wget-1.19.5-10.el8.x86_64.rpm + ``` -3. Ora provate a verificare nuovamente l'integrità del pacchetto usando l'opzione -K di rpm. +3. Provate ora a verificare nuovamente l'integrità del pacchetto utilizzando l'opzione -K di rpm. - ``` - $ rpm -K wget-*.rpm - wget-1.19.5-10.el8.x86_64.rpm: DIGESTS SIGNATURES NOT OK - ``` + ```bash + $ rpm -K wget-*.rpm + wget-1.19.5-10.el8.x86_64.rpm: DIGESTS SIGNATURES NOT OK + ``` - Ora il messaggio è molto diverso. L'output "DIGESTS SIGNATURES NOT OK" avverte chiaramente che non si deve provare a usare o installare il pacchetto. Non ci si deve più fidare. + Ora il messaggio è molto diverso. Il messaggio "DIGESTS SIGNATURES NOT OK" avverte chiaramente che non si dovrebbe provare a utilizzare o installare il pacchetto. Non ci si dovrebbe più fidare. -4. Usare il comando `rm` per eliminare il file danneggiato del pacchetto `wget` e scaricarne una nuova copia usando `dnf`. Digitare: +4. Utilizzare il comando `rm` per eliminare il file del pacchetto `wget` danneggiato e scaricare una nuova copia utilizzando `dnf`. Digitare: - ``` - $ rm wget-*.rpm && dnf download wget - ``` + ```bash + rm wget-*.rpm && dnf download wget + ``` - Verificare ancora una volta che il pacchetto appena scaricato superi i controlli di integrità di RPM. + Verificare nuovamente che il pacchetto appena scaricato superi i controlli di integrità RPM. ## Esercizio 3 -### Installazione dei Pacchetti - -Mentre si cerca di installare un software sul sistema, può capitare di imbattersi in problemi di "dipendenze fallite". Questo è particolarmente comune quando si usa l'utilità di basso livello RPM per gestire manualmente le applicazioni su un sistema. +### Installazione dei pacchetti -Ad esempio, se si tenta di installare il pacchetto "abc.rpm", il programma di installazione RPM potrebbe lamentarsi di alcune dipendenze non riuscite. Potrebbe dirvi che il pacchetto "abc.rpm" richiede l'installazione di un altro pacchetto "xyz.rpm". Il problema delle dipendenze si pone perché le applicazioni software dipendono quasi sempre da un altro software o da un'altra libreria. Se un programma richiesto o una libreria condivisa non è già presente sul sistema, tale prerequisito deve essere soddisfatto prima di installare l'applicazione di destinazione. +Durante l'installazione del software sul sistema, ci si potrebbe imbattere in problemi di “dipendenze non soddisfatte”. Questo è particolarmente comune quando si utilizza l'utilità RPM di basso livello per gestire manualmente le applicazioni su un sistema. -L'utilità RPM di basso livello spesso conosce le interdipendenze tra le applicazioni. Ma di solito non sa come o dove ottenere l'applicazione o la libreria necessaria per risolvere il problema. In altre parole, l'RPM conosce il *cosa* e il *come*, ma non ha la capacità di rispondere alla domanda sul *dove*. È qui che si distinguono strumenti come `dnf`, `yum` e così via. +Ad esempio, se si prova ad installare il pacchetto "abc.rpm", il programma di installazione RPM potrebbe segnalare alcune dipendenze non soddisfatte. Potrebbe indicarvi che il pacchetto “abc.rpm” richiede l'installazione preliminare di un altro pacchetto, “xyz.rpm”. Il problema delle dipendenze sorge perché le applicazioni software dipendono quasi sempre da un altro software o da una libreria. Se un programma o una libreria condivisa richiesti non sono già presenti nel sistema, tale prerequisito deve essere soddisfatto prima di installare l'applicazione di destinazione. -#### Per installare i pacchetti +L'utilità RPM di basso livello spesso conosce le interdipendenze tra le applicazioni. Ma di solito non sa come o dove ottenere l'applicazione o la libreria necessaria per risolvere il problema. In altre parole, RPM conosce il _cosa_ e il _come_, ma non ha la capacità intrinseca di rispondere alla domanda _dove_. È qui che strumenti come `dnf`, `yum` e così via danno il meglio di sé. -In questo esercizio si cercherà di installare il pacchetto `wget` (wget-*.rpm). +#### Installazione dei pacchetti -1. Provare a installare l'applicazione `wget`. Utilizzare le opzioni della riga di comando -ivh di RPM. Digitare: +In questo esercizio si proverà ad installare il pacchetto `wget` (wget-\*.rpm). - ``` - $ rpm -ivh wget-*.rpm - error: Failed dependencies: - libmetalink.so.3()(64bit) is needed by wget-* - ``` +1. Provare ad installare l'applicazione `wget`. Utilizzare le opzioni della riga di comando -ivh di RPM. Digitare: - Subito - un problema di dipendenza! L'output di esempio mostra che `wget` ha bisogno di un qualche file di libreria chiamato "libmetalink.so.3" + ```bash + rpm -ivh wget-*.rpm + error: Failed dependencies: + libmetalink.so.3()(64bit) is needed by wget-* + ``` - !!! note "Nota" + Subito - un problema di dipendenza! L'output di esempio mostra che `wget` necessita di un file di libreria denominato "libmetalink.so.3" - Secondo l'esito del test precedente, il pacchetto wget-*.rpm richiede l'installazione del pacchetto libmetalink-*.rpm. In altre parole, libmetalink è un prerequisito per installare wget-*.rpm. È possibile installare forzatamente il pacchetto wget-*.rpm utilizzando l'opzione "nodeps" se si sa assolutamente cosa si sta facendo, ma questa è generalmente una CATTIVA pratica. + !!! note "Nota" -2. RPM ci ha dato un suggerimento su ciò che manca. Si ricorderà che gli rpm conoscono il cosa e il come, ma non necessariamente il dove. Utilizziamo l'utilità `dnf` per cercare di capire il nome del pacchetto che fornisce la libreria mancante. Digitare: + ``` + In base al risultato del test sopra riportato, il pacchetto wget-*.rpm richiede l'installazione del pacchetto libmetalink-*.rpm. In altre parole, libmetalink è un prerequisito per l'installazione di wget-*.rpm. È possibile installare forzatamente il pacchetto wget-*.rpm utilizzando l'opzione "nodeps" se si è assolutamente certi di ciò che si sta facendo, ma in genere questa è una pratica SCONSIGLIATA. + ``` - ``` - $ dnf whatprovides libmetalink.so.3 - ...... - libmetalink-* : Metalink library written in C - Repo : baseos - Matched from: - Provide : libmetalink.so.3 - ``` +2. RPM ci ha gentilmente fornito un indizio su ciò che manca. Ricorderete che `rpm` conosce il cosa e il come, ma non necessariamente il dove. Utilizziamo l'utilità `dnf` per cercare di capire il nome del pacchetto che fornisce la libreria mancante. Digitare: -3. Dall'output, dobbiamo scaricare il pacchetto `libmetalink` che fornisce la libreria mancante. In particolare, vogliamo la versione a 64 bit della libreria. Utilizziamo un'utilità separata (`dnf`) per trovare e scaricare il pacchetto per la nostra architettura demo a 64 bit (x86_64). Digitate: + ```bash + $ dnf whatprovides libmetalink.so.3 + ...... + libmetalink-* : Metalink library written in C + Repo : baseos + Matched from: + Provide : libmetalink.so.3 + ``` - ``` - dnf download --arch x86_64 libmetalink - ``` +3. Dal risultato ottenuto, è necessario scaricare il pacchetto `libmetalink` che fornisce la libreria mancante. In particolare, desideriamo la versione a 64 bit della libreria. Richiediamo l'aiuto di un'utilità separata (`dnf`) per trovare e scaricare il pacchetto per la nostra architettura demo a 64 bit (x86_64). Digitare: -4. A questo punto si dovrebbero avere almeno 2 pacchetti rpm nella directory di lavoro. Per confermarlo, utilizzare il comando `ls`. + ```bash + dnf download --arch x86_64 libmetalink + ``` -5. Installare la dipendenza mancante di `libmetalink`. Digitare: +4. Ora si dovrebbero avere almeno 2 pacchetti rpm nella directory di lavoro. Utilizzare il comando `ls` per verificarlo. - ``` - $ sudo rpm -ivh libmetalink-*.rpm - ``` +5. Installare la dipendenza mancante `libmetalink`. Digitare: -6. Con la dipendenza ora installata, possiamo tornare al nostro obiettivo iniziale di installare il pacchetto `wget`. Digitare: + ```bash + sudo rpm -ivh libmetalink-*.rpm + ``` - ``` - $ sudo rpm -ivh wget-*.rpm - ``` +6. Ora che la dipendenza è stata installata, possiamo tornare al nostro obiettivo iniziale, ovvero installare il pacchetto `wget`. Digitare: - !!! note "Nota" + ```bash + sudo rpm -ivh wget-*.rpm + ``` - RPM supporta le transazioni. Negli esercizi precedenti, avremmo potuto eseguire una singola transazione rpm che includeva il pacchetto originale che volevamo installare e tutti i pacchetti e le librerie da cui dipendeva. Sarebbe stato sufficiente un singolo comando come quello riportato di seguito: + !!! note "Nota" - ``` - $ rpm -Uvh wget-*.rpm libmetalink-*.rpm - ``` + ```` + RPM supporta le transazioni. Negli esercizi precedenti, avremmo potuto eseguire una singola transazione rpm che includesse il pacchetto originale che volevamo installare e tutti i pacchetti e le librerie da cui dipendeva. Sarebbe stato sufficiente un singolo comando come quello riportato di seguito: -7. È il momento della verità. Provare a eseguire il programma `wget` senza alcuna opzione per verificare se è installato. Digitare: + ```bash + rpm -Uvh wget-*.rpm libmetalink-*.rpm + ``` + ```` - ``` - $ wget - ``` +7. È arrivato il momento della verità. Provare ad eseguire il programma `wget` senza alcuna opzione per verificare se è installato. Digitare: -8. Vediamo `wget` in azione. Usate `wget` per scaricare un file da Internet dalla riga di comando. Digitare: + ```bash + wget + ``` - ``` - wget https://kernel.org - ``` +8. Vediamo `wget` in azione. Utilizzare `wget` per scaricare un file da Internet dalla riga di comando. Digitare: - Questo scaricherà l'index.html predefinito dal sito web kernel.org! + ```bash + wget https://kernel.org + ``` -9. Utilizzare `rpm` per visualizzare un elenco di tutti i file forniti con l'applicazione `wget`. + Questo scaricherà il file index.html predefinito dal sito web kernel.org! -10. Utilizzate `rpm` per visualizzare la documentazione fornita con `wget`. +9. Utilizzare `rpm` per visualizzare un elenco di tutti i file inclusi nell'applicazione `wget`. -11. Utilizzate `rpm` per visualizzare l'elenco di tutti i binari installati con il pacchetto `wget`. +10. Utilizzare `rpm` per visualizzare la documentazione inclusa nel pacchetto `wget`. -12. È stato necessario installare il pacchetto `libmetalink` per poter installare `wget`. Provate a eseguire `libmetalink` dalla riga di comando. Digitare: +11. Utilizzare `rpm` per visualizzare l'elenco di tutti i file binari installati con il pacchetto `wget`. - ``` - $ libmetalink - -bash: libmetalink: command not found - ``` +12. È necessario installare il pacchetto `libmetalink` per installare `wget`. Prova a eseguire o lanciare `libmetalink` dalla riga di comando. Digitare: - !!! attention "Attenzione" + ```bash + libmetalink + -bash: libmetalink: command not found + ``` - Cosa succede? Perché non è possibile eseguire `libmetalink`? + !!! attention "Attenzione" + ``` + Che succede? Perché non si riescs ad eseguire `libmetalink`? + ``` -#### Per importare una chiave pubblica tramite rpm +#### Importazione di una chiave pubblica tramite `rpm` -!!! tip "Suggerimento" +!!! tip "Suggerimento" - Le chiavi GPG utilizzate per firmare i pacchetti del progetto Rocky Linux possono essere ottenute da varie fonti, come il sito web del progetto, il sito ftp, i supporti di distribuzione, le fonti locali e così via. Nel caso in cui la chiave corretta non sia presente nel portachiavi del vostro sistema RL, potete usare l'opzione `--import` di `rpm` per importare la chiave pubblica di Rocky Linux dal vostro sistema RL locale, eseguendo: `sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial` +``` +Le chiavi GPG utilizzate per firmare i pacchetti utilizzati nel progetto Rocky Linux possono essere ottenute da varie fonti, quali il sito web del progetto, il sito ftp, i supporti di distribuzione, la fonte locale e così via. Nel caso in cui la chiave corretta non fosse presente nel portachiavi del sistema RL, è possibile utilizzare l'opzione `--import` di `rpm` per importare la chiave pubblica di Rocky Linux dal sistema RL locale eseguendo: `sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial` +``` !!! question "Domanda" - Quando si installano i pacchetti, qual è la differenza tra `rpm -Uvh` e `rpm -ivh`. - Consultare la pagina man di `rpm`. +``` +Quando si installano i pacchetti, qual è la differenza tra `rpm -Uvh` e `rpm -ivh`? Consultare la pagina man di `rpm`. +``` ## Esercizio 4 ### Disinstallazione dei pacchetti -Disinstallare i pacchetti è altrettanto facile che installarli, grazie al gestore di pacchetti di Red Hat (RPM). +La disinstallazione dei pacchetti è facile come l'installazione con il gestore di pacchetti Red Hat (RPM). - In questo esercizio si cercherà di usare `rpm` per disinstallare alcuni pacchetti dal sistema. +In questo esercizio si proverà ad utilizzare `rpm` per disinstallare alcuni pacchetti dal sistema. #### Per disinstallare i pacchetti 1. Disinstallare il pacchetto `libmetalink` dal sistema. Digitare: - ``` - $ sudo rpm -e libmetalink - ``` + ```bash + sudo rpm -e libmetalink + ``` - !!! question "Domanda" + !!! question "Domanda" - Spiegare perché non è stato possibile rimuovere il pacchetto? + ``` + Spiegate perché non è stato possibile rimuovere il pacchetto? + ``` +2. Il modo corretto e pulito per rimuovere i pacchetti utilizzando RPM è quello di rimuovere i pacchetti insieme alle loro dipendenze. Per rimuovere il pacchetto `libmetalink` dovremo rimuovere anche il pacchetto `wget` che dipende da esso. Digitare: -2. Il modo pulito e corretto di rimuovere i pacchetti utilizzando RPM è quello di rimuovere i pacchetti insieme alle loro dipendenze. Per rimuovere il pacchetto `libmetalink` dobbiamo rimuovere anche il pacchetto `wget` che dipende da esso. Digitare: + ```bash + sudo rpm -e libmetalink wget + ``` - ``` - $ sudo rpm -e libmetalink wget - ``` + !!! note "Nota" - !!! note "Nota" + ``` + Se si desidera disinstallare il pacchetto che dipende da libmetalink e rimuovere *forzatamente* il pacchetto dal sistema, è possibile utilizzare l'opzione `--nodeps` di rpm come segue: `$ sudo rpm -e --nodeps libmetalink`. - Se si vuole interrompere il pacchetto che si basa su libmetalink e rimuovere *forzatamente* il pacchetto dal sistema, si può usare l'opzione `--nodeps` di rpm in questo modo: `$ sudo rpm -e --nodeps libmetalink`. - - L'opzione "nodeps" significa Nessuna dipendenza. Cioè, ignorare tutte le dipendenze. - **ii.** Quanto sopra serve solo a mostrare come rimuovere un pacchetto dal sistema in modo forzato. A volte è necessario farlo, ma in genere *non è una buona pratica*. - **iii.** La rimozione forzata di un pacchetto "xyz" su cui si basa un altro pacchetto installato "abc" rende di fatto il pacchetto "abc" inutilizzabile o in qualche modo danneggiato. + **i.** L'opzione "nodeps" significa Nessuna dipendenza. Ovvero, ignora tutte le dipendenze. + **ii.** Quanto sopra illustra come rimuovere forzatamente un pacchetto dal sistema. A volte è necessario farlo, ma in genere *non è una buona pratica*. + **iii.** La rimozione forzata di un pacchetto "xyz" da cui dipende un altro pacchetto installato "abc" rende di fatto il pacchetto "abc" inutilizzabile o in qualche modo danneggiato. + ``` ## Esercizio 5 -### DNF - Gestore di pacchetti +### DNF - gestore di pacchetti -DNF è un gestore di pacchetti per distribuzioni Linux basate su RPM. È il successore della popolare utility YUM. DNF mantiene la compatibilità con YUM ed entrambe le utility condividono opzioni e sintassi della riga di comando molto simili. +DNF è un gestore di pacchetti per distribuzioni Linux basate su RPM. È il successore della popolare utility YUM. DNF mantiene la compatibilità con YUM ed entrambe le utility condividono opzioni e sintassi della riga di comando molto simili. Entrambe le utility condividono opzioni e sintassi simili nella riga di comando. -DNF è uno dei tanti strumenti per la gestione del software basato su RPM, come Rocky Linux. Rispetto a `rpm`, questi strumenti di livello superiore aiutano a semplificare l'installazione, la disinstallazione e l'interrogazione dei pacchetti. È importante notare che questi strumenti utilizzano la struttura sottostante fornita dal sistema RPM. Per questo motivo è utile capire come utilizzare RPM. +DNF è uno dei tanti strumenti per la gestione di software basati su RPM come Rocky Linux. Rispetto a `rpm`, questi strumenti di livello superiore aiutano a semplificare l'installazione, la disinstallazione e la ricerca dei pacchetti. È importante notare che questi strumenti utilizzano il framework sottostante fornito dal sistema RPM. Ecco perché è utile capire come utilizzare RPM. -DNF (e altri strumenti simili) agisce come una sorta di involucro attorno a RPM e fornisce funzionalità aggiuntive non offerte da RPM. DNF sa come gestire le dipendenze di pacchetti e librerie e sa anche come utilizzare i repository configurati per risolvere automaticamente la maggior parte dei problemi. +DNF (e altri strumenti simili) opera come una sorta di involucro attorno a RPM e fornisce funzionalità aggiuntive non offerte da RPM. DNF sa come gestire le dipendenze dei pacchetti e delle librerie e sa anche come utilizzare i repository configurati per risolvere automaticamente la maggior parte dei problemi. -Le opzioni più comuni utilizzate con l'utilità `dnf` sono: +Le opzioni comunemente utilizzate con l'utilità `dnf` sono: -``` +```bash uso: dnf [opzioni] COMANDO Elenco dei comandi principali: @@ -497,305 +518,369 @@ Le opzioni più comuni utilizzate con l'utilità `dnf` sono: ``` -#### Per utilizzare `dnf` per l'installazione dei pacchetti +#### Uso di `dnf` per l'installazione dei pacchetti -Supponendo che abbiate già disinstallato l'utilità `wget` da un esercizio, nei passi seguenti useremo DNF per installare il pacchetto. Il processo in 2-3 fasi richiesto in precedenza per l'installazione di `wget` tramite `rpm` dovrebbe essere ridotto a un unico processo utilizzando `dnf`. `dnf` risolverà tranquillamente qualsiasi dipendenza. +Assumendo che sia già stata disinstallata l'utilità `wget` da un esercizio, utilizzeremo DNF per installare il pacchetto nei seguenti passaggi. Il processo in 2-3 passaggi necessario in precedenza quando abbiamo installato `wget` tramite `rpm` è diventato ora un processo in un unico passaggio utilizzando `dnf`. `dnf` risolverà silenziosamente qualsiasi dipendenza. -1. Per prima cosa, assicuriamoci che `wget` e `libmetalink` siano disinstallati dal sistema. Digitare: +1. Per prima cosa, assicurarsi che `wget` e `libmetalink` siano stati disinstallati dal sistema. Digitare: - ``` - $ sudo rpm -e wget libmetalink - ``` + ```bash + sudo rpm -e wget libmetalink + ``` - Dopo la rimozione, se si prova a eseguire `wget` dalla CLI, viene visualizzato un messaggio come *wget: command not found* + Dopo la rimozione, se si prova a eseguire `wget` dalla CLI, viene visualizzato un messaggio simile a _wget: command not found_ -2. Ora usate dnf per installare `wget`. Digitare: +2. Ora usare `dnf` per installare `wget`. Digitare: - ``` - $ sudo dnf -y install wget - Dependencies resolved. - ...... - Installed: - libmetalink-* wget-* - Complete! - ``` + ```bash + sudo dnf -y install wget + Dependencies resolved. + ...... + Installed: + libmetalink-* wget-* + Complete! + ``` - !!! tip "Suggerimento" + !!! tip "Suggerimento" - L'opzione "-y" usata nel comando precedente sopprime il prompt "[y/N]" per confermare l'azione che `dnf` sta per eseguire. Ciò significa che tutte le azioni di conferma (o le risposte interattive) saranno "sì" (y). + ``` + L'opzione "-y" utilizzata nel comando precedente sopprime il prompt "[y/N]" che richiede di confermare l'azione che `dnf` sta per eseguire. Ciò significa che tutte le azioni di conferma (o risposte interattive) saranno "sì" (y). + ``` +3. DNF offre un'opzione "Environment Group" che semplifica l'aggiunta di un nuovo set di funzionalità a un sistema. Per aggiungere la funzionalità, in genere è necessario installare alcuni pacchetti singolarmente, ma utilizzando `dnf`, è sufficiente conoscere il nome o la descrizione della funzionalità desiderata. Utilizzare `dnf` per visualizzare un elenco dei gruppi disponibili. Digitare: -3. DNF offre un'opzione " Environment Group" che semplifica l'aggiunta di un nuovo set di funzioni a un sistema. Per aggiungere la funzionalità, in genere si dovrebbero installare alcuni pacchetti singolarmente, ma usando `dnf`, tutto ciò che occorre sapere è il nome o la descrizione della funzionalità desiderata. Usare `dnf` per visualizzare un elenco di tutti i gruppi disponibili. Digitare: + ```bash + dnf group list + ``` - ``` - $ dnf group list - ``` +4. Il nostro interesse è rivolto al gruppo/funzionalità “ Development Tools”. Cerchiamo di ottenere maggiori informazioni su quel gruppo. Digitare: -4. Siamo interessati al gruppo/caratteristica "Development Tools". Cerchiamo di ottenere maggiori informazioni su questo gruppo. Digitare: + ```bash + dnf group info "Development Tools" + ``` - ``` - $ dnf group info "Development Tools" - ``` +5. Successivamente, avremo bisogno di alcuni programmi del gruppo "Development Tools". Installare il gruppo “Development Tools” utilizzando `dnf` eseguendo: -5. In seguito, avremo bisogno di alcuni programmi del gruppo " Development Tools". Installare il gruppo "Development Tools" utilizzando `dnf`: + ```bash + sudo dnf -y group install "Development Tools" + ``` - ``` - $ sudo dnf -y group install "Development Tools" - ``` +#### Uso di `dnf` per disinstallare i pacchetti -#### Per usare `dnf` per disinstallare i pacchetti +1. Per utilizzare `dnf` per disinstallare il pacchetto `wget`, digitare: + ```bash + sudo dnf -y remove wget + ``` -1. Per usare `dnf` per disinstallare il pacchetto `wget`, digitare: +2. Utilizzare `dnf` per assicurarsi che il pacchetto sia stato effettivamente rimosso dal sistema. Digitare: - ``` - $ sudo dnf -y remove wget - ``` + ```bash + sudo dnf -y remove wget + ``` -2. Usate `dnf` per assicurarsi che il pacchetto sia stato effettivamente rimosso dal sistema. Digitare: +3. Provare ad utilizzare/eseguire `wget`. Digitare: - ``` - $ sudo dnf -y remove wget - ``` + ```bash + wget + ``` -3. Provare a utilizzare/eseguire `wget`. Digitare: +#### Uso di `dnf` per l'aggiornamento dei pacchetti - ``` - $ wget - ``` +DNF può verificare e installare l'ultima versione dei singoli pacchetti disponibili nei repository. Può anche essere utilizzato per installare versioni specifiche dei pacchetti. -#### Per utilizzare `dnf` per l'aggiornamento dei pacchetti +1. Utilizzare l'opzione list con `dnf` per visualizzare le versioni disponibili del programma `wget` sul sistema. Digitare: -DNF può verificare e installare l'ultima versione dei singoli pacchetti disponibili nei repository. Può anche essere usato per installare versioni specifiche di pacchetti. + ```bash + dnf list wget + ``` -1. Usate l'opzione list con `dnf` per visualizzare tutte le versioni del programma `wget` disponibili per il vostro sistema. Digita +2. Se si vuole solo verificare se siano disponibili versioni aggiornate per un pacchetto, utilizzare l'opzione check-update con `dnf`. Ad esempio, per il pacchetto `wget`, digitare: - ``` - $ dnf list wget - ``` + ```bash + dnf check-update wget + ``` -2. Se si vuole solo vedere se sono disponibili versioni aggiornate di un pacchetto, si può usare l'opzione check-update di `dnf`. Ad esempio, per il tipo di pacchetto `wget`: +3. Ora, elencare tutte le versioni disponibili per il pacchetto kernel del sistema. Digitare: - ``` - $ dnf check-update wget - ``` + ```bash + sudo dnf list kernel + ``` -3. Ora elenca tutte le versioni disponibili del pacchetto kernel per il vostro sistema. Digitare: +4. Successivamente, verificare se sono disponibili pacchetti aggiornati per il pacchetto kernel installato. Digitare: - ``` - $ sudo dnf list kernel - ``` + ```bash + dnf check-update kernel + ``` -4. Ora controllate se sono disponibili pacchetti aggiornati per il pacchetto kernel installato. Digitare: +5. Gli aggiornamenti dei pacchetti possono essere dovuti a correzioni di bug, nuove funzionalità o patch di sicurezza. Per verificare se sono disponibili aggiornamenti relativi alla sicurezza per il pacchetto kernel, digitare: - ``` - $ dnf check-update kernel - ``` + ```bash + dnf --security check-update kernel + ``` -5. Gli aggiornamenti dei pacchetti possono essere dovuti a correzioni di bug, nuove funzionalità o patch di sicurezza. Per vedere se ci sono aggiornamenti relativi alla sicurezza per il pacchetto kernel, digitate: +#### Uso di `dnf` per gli aggiornamenti del sistema - ``` - $ dnf --security check-update kernel - ``` +DNF può essere utilizzato per verificare e installare le versioni più recenti di tutti i pacchetti installati su un sistema. Il controllo periodico della disponibilità di aggiornamenti è un aspetto importante dell'amministrazione di sistema. -#### Per utilizzare `dnf` per gli aggiornamenti del sistema +1. Per verificare se sono disponibili aggiornamenti per i pacchetti attualmente installati sul sistema, digitare: -DNF può essere usato per verificare e installare le ultime versioni di tutti i pacchetti installati su un sistema. Il controllo periodico dell'installazione degli aggiornamenti è un aspetto importante dell'amministrazione del sistema. + ```bash + dnf check-update + ``` -1. Per verificare la presenza di aggiornamenti per i pacchetti attualmente installati sul sistema, digitate: +2. Per verificare se sono disponibili aggiornamenti relativi alla sicurezza per tutti i pacchetti installati sul sistema, digitare: - ``` - $ dnf check-update - ``` + ```bash + dnf --security check-update + ``` -2. Per verificare la presenza di aggiornamenti di sicurezza per tutti i pacchetti installati sul sistema, digitate: +3. Per aggiornare tutti i pacchetti installati sul sistema alle versioni più recenti disponibili per la tua distribuzione, eseguire: - ``` - $ dnf --security check-update - ``` + ```bash + dnf -y check-update + ``` -3. Per aggiornare tutti i pacchetti installati sul sistema alle versioni più aggiornate disponibili per la vostra distribuzione, eseguite: +## Esercizio 6 - ``` - $ dnf -y check-update - ``` +### Costruzione del software dai sorgenti -## Esercizio 6 +Tutti i software/applicazioni/pacchetti provengono da semplici file di testo leggibili dall'uomo. I file sono denominati nel loro insieme codice sorgente. I pacchetti RPM che vengono installati sulle distribuzioni Linux nascono dal codice sorgente. -### Costruire il software dai sorgenti +In questo esercizio si scaricherà, compilerà e installerà un programma di esempio dai relativi file sorgente. Per comodità, i file sorgente vengono solitamente distribuiti come un unico file compresso chiamato tar-ball (pronunciato tar-dot-gee-zee). -Tutti i software/applicazioni/pacchetti provengono da semplici file di testo leggibili dall'uomo. I file sono conosciuti collettivamente come codice sorgente. I pacchetti RPM che vengono installati sulle distribuzioni Linux nascono dal codice sorgente. +I seguenti esercizi saranno basati sul venerabile codice sorgente del progetto Hello. `hello` è una semplice applicazione a riga di comando scritta in C++, che non fa altro che stampare "hello" sul terminale. Per ulteriori informazioni sul progetto, consultare [il sito qui](http://www.gnu.org/software/hello/hello.html) -In questo esercizio scaricherete, compilerete e installerete un programma di esempio dai suoi file sorgente originali. Per comodità, i file sorgenti sono solitamente distribuiti come un singolo file compresso chiamato tar-ball (pronuncia tar-dot-gee-zee). +#### Download del file sorgente -I seguenti esercizi si basano sul codice sorgente del venerabile progetto Hello. `hello` è una semplice applicazione a riga di comando scritta in C++, che non fa altro che stampare "hello" sul terminale. Per saperne di più sul [progetto, cliccate qui](http://www.gnu.org/software/hello/hello.html) +1. Utilizzare `curl` per scaricare il codice sorgente più recente dell'applicazione `hello`. Scaricare e salvare il file nella cartella Download. -#### Per scaricare il file sorgente + https://ftp.gnu.org/gnu/hello/hello-2.12.tar.gz -1. Usare `curl` per scaricare l'ultimo codice sorgente dell'applicazione `hello`. Scarichiamo e salviamo il file nella cartella Download. +#### Decomprimere il file - https://ftp.gnu.org/gnu/hello/hello-2.12.tar.gz +1. Passare alla directory sul computer locale dove è stato scaricato il codice sorgente hello. -#### Per decomprimere il file +2. Decomprimere (un-tar) il tarball utilizzando il programma `tar`. Digitare: -1. Passare alla cartella del computer locale in cui è stato scaricato il codice sorgente di hello. + ```bash + tar -xvzf hello-2.12.tar.gz + ``` -2. Decomprimere (un-tar) il tarball usando il programma `tar`. Digitare: + OUTPUT: - ``` - $ tar -xvzf hello-2.12.tar.gz - hello-2.12/ - hello-2.12/NEWS - hello-2.12/AUTHORS - hello-2.12/hello.1 - hello-2.12/THANKS - ...... - ``` + ```bash + $ tar -xvzf hello-2.12.tar.gz + hello-2.12/ + hello-2.12/NEWS + hello-2.12/AUTHORS + hello-2.12/hello.1 + hello-2.12/THANKS + ...... + ``` -3. Usate il comando `ls` per visualizzare il contenuto della vostra pwd. +3. Utilizzare il comando `ls` per visualizzare il contenuto della directory corrente. - Una nuova cartella denominata hello-2.12 dovrebbe essere stata creata durante la decompressione. + Durante la decompressione dovrebbe essere stata creata una nuova directory denominata hello-2.12. -4. Passate a quella directory ed elencatene il contenuto. Digitare: +4. Passare a quella directory ed elencarne il suo contenuto. Digitare: - ``` - $ cd hello-2.12 ; ls - ``` + ```bash + cd hello-2.12 ; ls + ``` -5. È sempre buona norma esaminare tutte le istruzioni di installazione speciali che possono essere fornite con il codice sorgente. Questi file hanno solitamente nomi come: INSTALL, README e così via. +5. È sempre buona norma consultare eventuali istruzioni di installazione speciali fornite insieme al codice sorgente. Questi file hanno solitamente nomi come: INSTALL, README e così via. - Utilizzare un pager per aprire il file INSTALL e leggerlo. Digitare: + Utilizzare un pager per aprire il file INSTALL e leggerlo. Digitare: - ``` - $ less INSTALL - ``` + ```bash + less INSTALL + ``` - Uscire dal pager quando si è finito di esaminare il file. + Uscire dal pager quando si è finito di esaminare il file. -#### Per configurare il pacchetto +#### Configurazione del pacchetto -La maggior parte delle applicazioni ha funzioni che possono essere attivate o disattivate dall'utente. Questo è uno dei vantaggi dell'accesso al codice sorgente e dell'installazione dallo stesso. L'utente ha il controllo sulle caratteristiche configurabili dell'applicazione; questo è in contrasto con l'accettazione di tutto ciò che un gestore di pacchetti installa da binari precompilati. +La maggior parte delle applicazioni dispone di funzioni che possono essere attivate o disattivate dall'utente. Questo è uno dei vantaggi di avere accesso al codice sorgente e di installarlo da lì. Avete il controllo sulle funzionalità configurabili dell'applicazione. Questo è in contrasto con l'accettazione di tutto ciò che un gestore di pacchetti installa dai binari precompilati. -Lo script che di solito permette di configurare il software si chiama "configure" +Lo script che solitamente consente di configurare il software è denominato, in modo appropriato, "configure" + +!!! tip "Suggerimento" + +```` +Assicurarsi di aver installato il pacchetto "Development Tools" prima di provare a completare i seguenti esercizi. + +```bash +sudo dnf -y group install "Development Tools" +``` +```` -1. Usate di nuovo il comando `ls` per assicurarvi di avere un file chiamato *configure* nella vostra pwd. +1. Utilizzare nuovamente il comando `ls` per assicurarti che nella directory corrente sia effettivamente presente un file denominato _configure_. -2. Per visualizzare tutte le opzioni, è possibile attivare o disattivare il tipo di programma `hello`: +2. Per visualizzare tutte le opzioni che si possono attivare o disattivare nel programma `hello`, digitare: - ``` - $ ./configure --help - ``` + ```bash + ./configure --help + ``` - !!! question "Domanda" + !!! question "Domanda" - Dall'output del comando, cosa fa l'opzione "--prefix"? + ``` + Dall'output del comando, cosa fa l'opzione "--prefix"? + ``` 3. Se si è soddisfatti delle opzioni predefinite offerte dallo script di configurazione. Digitare: - ``` - $ ./configure - ``` + ```bash + ./configure + ``` - !!! note "Nota" + !!! note "Nota" - Si spera che la fase di configurazione sia andata bene e che si possa passare alla fase di compilazione. + ``` + Si spera che la fase di configurazione sia andata liscia e che si possa passare alla fase di compilazione. - Se si sono verificati degli errori durante la fase di configurazione, è necessario esaminare attentamente la coda dell'output per individuare la fonte dell'errore. Gli errori sono *talvolta* autoesplicativi e facili da risolvere. Ad esempio, potrebbe essere visualizzato un errore del tipo: + Se durante la fase di configurazione vengono visualizzati degli errori, è necessario esaminare attentamente la parte finale dell'output per individuare la causa dell'errore. Gli errori sono *talvolta* intuitivi e facili da correggere. Ad esempio, potrebbe essere visualizzato un errore simile al seguente: - configure: error: no acceptable C compiler found in $PATH + configure: error: no acceptable C compiler found in $PATH - L'errore di cui sopra significa semplicemente che non avete un compilatore C (ad esempio, gcc) installato sul sistema o che il compilatore è installato da qualche parte che non è nella vostra variabile PATH. + L'errore sopra riportato significa semplicemente che non hai un compilatore C (ad esempio, `gcc`) installato sul sistema o che il compilatore è installato in una posizione che non è inclusa nella variabile PATH. + ``` -#### Per compilare il pacchetto +#### Compilazione del pacchetto -L'applicazione hello verrà realizzata nei seguenti passaggi. A questo punto sono utili alcuni dei programmi del gruppo Development Tools installati in precedenza con DNF. +Nei passaggi seguenti si costruirà l'applicazione hello. È qui che tornano utili alcuni dei programmi inclusi nel gruppo Development Tools installati in precedenza utilizzando DNF. -1. Usate il comando make per compilare il pacchetto dopo aver eseguito lo script "configure". Digitate: +1. Utilizzare il comando make per compilare il pacchetto dopo aver eseguito lo script "configure". Digitare: - ``` - $ make - ...... - gcc -g -O2 -o hello src/hello.o ./lib/libhello.a - make[2]: Leaving directory '/home/rocky/hello-2.12' - make[1]: Leaving directory '/home/rocky/hello-2.12' - ``` + ```bash + make + ``` - Se tutto va bene, questo importante passo di `creazione` è quello che aiuterà a generare il binario finale dell'applicazione `hello`. + OUTPUT: -2. Elencare nuovamente i file nella directory di lavoro corrente. Dovreste vedere alcuni file appena creati, tra cui il programma `hello`. + ```bash + $ make + ...... + gcc -g -O2 -o hello src/hello.o ./lib/libhello.a + make[2]: Leaving directory '/home/rocky/hello-2.12' + make[1]: Leaving directory '/home/rocky/hello-2.12' + ``` -#### Per installare l'applicazione + Se tutto è andato bene, questo importante passaggio “make” è il passo che contribuirà a generare il binario finale dell’applicazione “hello”. -Tra le altre operazioni di pulizia, la fase finale dell'installazione prevede anche la copia dei file binari e delle librerie delle applicazioni nelle cartelle corrette. +2. Elencare nuovamente i file nella directory di lavoro corrente. Si dovrebbero visualizzare alcuni file appena creati, incluso il programma `hello`. + +#### Installazione dell'applicazione + +Oltre ad altre attività di manutenzione, la fase finale dell'installazione prevede anche la copia di tutti i file binari e le librerie dell'applicazione nelle cartelle appropriate. 1. Per installare l'applicazione hello, eseguire il comando make install. Digitare: - ``` - $ sudo make install - ``` + ```bash + sudo make install + ``` + + Questo installerà il pacchetto nella posizione specificata dall'argomento predefinito prefisso (--prefix) che è stato utilizzato in precedenza con lo script “configure”. Se non è stato impostato alcun --prefix, verrà utilizzato il prefisso predefinito `/usr/local/`. + +#### Esecuzione del programma hello + +1. Utilizzare il comando `whereis` per vedere dove si trova il programma `hello` nel sistema. Digitare: + + ```bash + whereis hello + ``` - Questo installerà il pacchetto nel percorso specificato dall'argomento predefinito del prefisso (--prefix), eventualmente usato con lo script "configure" precedente. Se non è stato impostato alcun --prefisso, verrà usato il prefisso predefinito di `/usr/local/`. +2. Provare a eseguire l'applicazione `hello` per verificarne il funzionamento. Digitare: -#### Per eseguire il programma hello + ```bash + hello + ``` -1. Usate il comando `whereis` per vedere dove si trova il programma `hello` sul vostro sistema. Digitare: +3. Eseguire nuovamente `hello` con l'opzione `--help` per vedere le altre funzioni disponibili. - ``` - $ whereis hello - ``` +4. Ora, utilizzando `sudo`, eseguire nuovamente `hello` come superutente. Digitare: -2. Provate a eseguire l'applicazione `hello` per vedere cosa fa. Digitare: + ```bash + sudo hello + ``` - ``` - $ hello - ``` + OUTPUT: -3. Eseguite di nuovo `hello` con l'opzione `--help` per vedere le altre cose che può fare. + ```bash + sudo: hello: comando non trovato + ``` -4. Utilizzando `sudo`, eseguire nuovamente `hello` come superutente. Digitare: + !!! question "Domanda" - ``` - $ sudo hello - ``` + ``` + Individua la causa dell'errore che si verifica quando provi a eseguire `hello` con `sudo`. Risolvi il problema e assicurati che il programma `hello` possa essere utilizzato con `sudo`. + ``` - !!! tip "Suggerimento" + !!! tip "Suggerimento" - È buona norma testare un programma come utente ordinario per assicurarsi che gli utenti ordinari possano effettivamente utilizzare il programma. È possibile che i permessi sul binario siano impostati in modo errato, in modo che solo il superutente possa utilizzare i programmi. Questo ovviamente presuppone che si voglia effettivamente che gli utenti ordinari possano utilizzare il programma. + ``` + È buona norma testare un programma come utente normale per assicurarsi che gli utenti normali possano effettivamente utilizzarlo. È possibile che i permessi sul file binario siano impostati in modo errato, consentendo solo al superutente di utilizzare i programmi. Questo ovviamente presuppone che si desideri effettivamente che gli utenti normali possano utilizzare il programma. + ``` -5. Questo è quanto. Questo laboratorio è completo! +5. Ecco fatto. Questo esercizio è terminato! ## Esercizio 7 ### Verifica dell'integrità dei file dopo l'installazione del pacchetto -Dopo l'installazione di pacchetti rilevanti, in alcuni casi è necessario determinare se i file associati sono stati modificati per evitare modifiche dannose da parte di altri. +Dopo aver installato i pacchetti pertinenti, in alcuni casi è necessario verificare se i file associati sono stati modificati per impedire modifiche dannose da parte di altri. -#### Verifica del file +#### Verifica dei file Utilizzando l'opzione "-V" del comando `rpm`. -Prendiamo come esempio il programma di sincronizzazione temporale chrony per illustrare il significato del suo output. Si presume che sia stato installato chrony e che sia stato modificato il file di configurazione (/etc/chrony.conf) +Prendiamo come esempio il programma di sincronizzazione dell'ora `chrony` per illustrare il significato dei suoi output. -``` -$ rpm -V chrony -S.5....T. c /etc/chrony.conf -``` +1. Per dimostrare come funziona la verifica del pacchetto `rpm`, apportare una modifica al file di configurazione di chrony - `/etc/chrony.conf`. (It is assumed that you have installed chrony). Aggiungiamo 2 innocui simboli di commento `##` alla fine del file. Digitare: + + ```bash + echo -e "##" | sudo tee -a /etc/chrony.conf + ``` + +2. Ora eseguire il comando `rpm` con l'opzione `--verify`. Digitare: + + ```bash + rpm -V chrony + ``` + + OUTPUT: + + ```bash + S.5....T. c /etc/chrony.conf + ``` + + Il risultato è suddiviso in 3 colonne separate. + + - **Prima colonna (S.5.... T.)** + + L'output di esempio - `S.5....T.` indica i 9 campi utilizzati per indicare informazioni utili sulla validità dei file in un pacchetto RPM. Qualsiasi campo o caratteristica che ha superato un determinato controllo/test è indicato da un “.”. + + Di seguito sono descritti questi 9 differenti campi o controlli: + + - S: Se è stata modificata la dimensione del file. + - M: Se il tipo di file o i permessi del file (rwx) sono stati modificati. + - 5: Se il checksum MD5 del file è stato modificato. + - D: Se il numero del dispositivo è stato modificato. + - L: Se il percorso del file è stato modificato. + - U: Se il proprietario del file è stato modificato. + - G: Se il gruppo a cui appartiene il file è stato modificato. + - T: Se l'ora di modifica (mTime) del file è stata modificata. + - P: Se la funzione del programma è stata modificata. + + - **Seconda Colonna (c)** + + - **c**: Indica le modifiche apportate al file di configurazione. Può anche assumere i seguenti valori: + - d: file di documentazione. + - g: file ghost. Se ne vedono pochissimi. + - l: file di licenza. + - r: file readme. + + - **Terza colonna (/etc/chrony.conf)** -* **S.5....T.**: Indica 9 informazioni utili nel contenuto del file di validazione e quelle non modificate sono rappresentate da ".". Le 9 informazioni utili sono: - * S: Se è stata modificata la dimensione del file. - * M: Se il tipo di file o i permessi del file (rwx) sono stati modificati. - * 5: Se la somma di controllo MD5 del file è stata modificata. - * D: Se il numero del dispositivo è stato modificato. - * L: Se il percorso del file è stato modificato. - * U: Se il proprietario del file è stato modificato. - * G: Se il gruppo a cui appartiene il file è stato modificato. - * T: Se il tempo mTime (tempo di modifica) del file è stato modificato. - * P: Se la funzione del programma è stata modificata. - -* **c**: Indica le modifiche apportate al file di configurazione. Può anche essere il seguente valore: - * d: file di documentazione. - * g: file fantasma. Se ne vedono pochissimi. - * l: file di licenza. - * r: file readme. - -* **/etc/chrony.conf**: Rappresenta il percorso del file modificato. + - **/etc/chrony.conf**: Rappresenta il percorso del file modificato. diff --git a/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.it.md b/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.it.md new file mode 100644 index 0000000000..af476e4f1c --- /dev/null +++ b/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.it.md @@ -0,0 +1,1035 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +tested on: All Versions +tags: + - system monitoring + - process monitoring + - ps + - pgrep + - pidof + - cgroups + - pstree + - top + - kill + - lsof + - pkill + - exec +--- + +# Lab 8: Monitoraggio di Sistema e dei processi + +## Obiettivi + +Dopo aver completato questo laboratorio, sarete in grado di: + +- visualizzare e gestire i processi +- terminare i processi anomali +- modificare la priorità di processo + +Tempo stimato per completare questo laboratorio: 60 minuti + +## Introduzione + +Questi esercizi trattano vari argomenti relativi al monitoraggio e alla gestione dei processi su sistemi Linux. Gli argomenti trattati includono l'identificazione e il controllo dei processi, la gestione delle priorità dei processi, la gestione dei segnali, il monitoraggio delle risorse e la gestione dei “cgroup”. + +## Esercizio 1 + +### Esplorazione con `ps` e `/proc` + +#### Esplorare e identificare il primo processo di sistema + +1. Accedere al sistema come un utente qualsiasi. + +2. Trovare il nome del processo con ID 1 utilizzando /proc. + + ```bash + cat /proc/1/comm + ``` + + !!! question "Domanda" + + ``` + Qual è il nome del processo con PID 1? + ``` + +3. Visualizzare il nome e il percorso dell'eseguibile che si trova dietro al processo con PID 1. + + ```bash + ls -l /proc/1/exe + ``` + + !!! question "Domanda" + + ``` + Qual è il percorso dell'eseguibile dietro il PID 1? + ``` + +4. Utilizzare il comando `ps` per scoprire il nome del processo o del programma associato al PID 1. + + ```bash + ps -p 1 -o comm= + ``` + + !!! question "Domanda" + + ``` + Il comando `ps` conferma il nome del processo? + ``` + +5. Utilizzare il comando `ps` per visualizzare il percorso completo e gli eventuali argomenti della riga di comando del processo o del programma associato al PID 1. + + ```bash + ps -p 1 -o args= + ``` + + !!! question "Domanda" + + ``` + Qual è il percorso completo e gli argomenti della riga di comando per il processo con PID 1? + ``` + + !!! question "Domanda" + + ``` + Perché il processo con PID 1 è importante su un sistema Linux? + ``` + +#### Visualizzazione delle informazioni dettagliate sul processo utilizzando `ps` + +I seguenti passaggi mostrano come utilizzare `ps` per visualizzare le informazioni di base sui processi. + +1. Utilizzare il comando `ps` per visualizzare un elenco di tutti i processi in una struttura ad albero. + + ```bash + ps auxf + ``` + + !!! question "Domanda" + + ``` + Qual è la struttura dell'elenco dei processi e quali informazioni vengono visualizzate? + ``` + +2. Filtrare l'elenco in modo da visualizzare solo i processi associati a un utente specifico, ad esempio l'utente “root”. + + ```bash + ps -U root + ``` + + Verificare che vengano visualizzati solo i processi relativi all'utente “root”. + +3. Mostrare i processi in un formato dettagliato, inclusi l'albero dei processi e i thread. Digitare: + + ```bash + ps -eH + ``` + + !!! question "Domanda" + + ``` + Quali ulteriori dettagli vengono mostrati in questo formato? + ``` + +4. Visualizzare i processi ordinati in base all'utilizzo della CPU in ordine decrescente. + + ```bash + ps aux --sort=-%cpu + ``` + + !!! question "Domanda" + + ``` + Quale processo sta consumando più CPU? + ``` + +## Esercizio 2 + +### Gestione dei processi con `kill` + +#### Per terminare un processo utilizzando `kill` + +1. Avviare un processo di sospensione a lungo termine in background e visualizzare il PID sul terminale. Digitare: + + ```bash + (sleep 3600 & MYPROC1=$! && echo PID is: $MYPROC1) 2>/dev/null + ``` + + OUTPUT: + + ```bash + PID is: 1331933 + ``` + + Prendere nota del PID del nuovo processo sul sistema. Il PID viene salvato anche nella variabile $MYPROC1. + +2. Inviare un segnale di chiusura (SIGTERM) al processo `sleep`. + + ```bash + kill $MYPROC1 + ``` + + Sostituire $MYPROC1 con il PID effettivo ottenuto al punto 1. + +3. Verificare se il processo è terminato utilizzando `ps` e `ps aux`. + + ```bash + ps aux | grep -v grep | grep sleep + ``` + +#### Per terminare i processi utilizzando i segnali `kill` + +1. Avviare un nuovo processo in sospeso e prendere nota del suo PID. Digitare: + + ```bash + (sleep 3600 & MYPROC2=$! && echo PID is: $MYPROC2) 2>/dev/null + ``` + + OUTPUT: + + ```bash + PID is: 1333258 + ``` + +2. Inviare un segnale diverso (ad esempio, SIGHUP) al nuovo processo in sospeso. Digitare: + + ```bash + kill -1 $MYPROC2 + ``` + + Verificare che $MYPROC2 non sia più presente nella tabella dei processi. + +3. Avviare un nuovo processo ping e prendere nota del suo PID. Digitare: + + ```bash + { ping localhost > /dev/null 2>&1 & MYPROC3=$!; } \ + 2>/dev/null; echo "PID is: $MYPROC3" + ``` + +4. Utilizzare il comando `kill` per inviare un segnale `SIGTERM` al processo ping. Digitare: + + ```bash + kill -15 $MYPROC3 + ``` + + Sostituire MYPROC3 con il PID effettivo del processo sul vostro sistema. + +5. Avviare un processo di lunga durata utilizzando il comando `cat`. Digitare: + + ```bash + { cat /dev/random > /dev/null 2>&1 & MYPROC4=$!; } \ + 2>/dev/null; echo PID is: $MYPROC4 + ``` + + Prendere nota del PID del processo sul vostro sistema. + +6. Utilizzare `kill` per terminare forzatamente il processo inviando un segnale SIGKILL. + + ```bash + kill -9 $MYPROC4 + ``` + + Verificare che il processo sia terminato. + + !!! question "Domanda" + + ``` + Spiegare lo scopo dell'invio di segnali ai processi utilizzando il comando `kill` e il significato dei diversi tipi di segnale. + ``` + +## Esercizio 3 + +### Monitoraggio delle risorse di sistema con `top` + +#### Monitorare l'utilizzo delle risorse di sistema con `top` + +1. Eseguire il comando top per visualizzare le statistiche di sistema in tempo reale. + + ```bash + top + ``` + + !!! question "Domanda" + + ``` + Quali informazioni vengono visualizzate nell'interfaccia superiore? + ``` + +2. Osservare l'utilizzo della CPU e della memoria dei processi nell'interfaccia superiore. + + !!! question "Domanda" + + ``` + Quali processi consumano più CPU e memoria? + ``` + +3. Ordinare i processi in `top` in base all'utilizzo della CPU (premere P) e all'utilizzo della memoria (premere M). + + !!! question "Domanda" + + ``` + Quali sono i processi che consumano più CPU e memoria dopo l'ordinamento? + ``` + +#### Monitorare l'utilizzo della CPU e della memoria per processi specifici utilizzando `top` + +1. Creare un file di dimensioni arbitrarie pari a 512 Mb contenente dati casuali. + + ```bash + sudo fallocate -l 512M ~/large-file.data + ``` + +2. Avviare un processo che richieda molte risorse, come la compressione di file di grandi dimensioni. + + ```bash + tar -czf archive.tar.gz /path/to/large/directory + ``` + +3. Aprire il comando `top` per monitorare l'utilizzo della CPU e della memoria. + + ```bash + top + ``` + +4. Individuare e selezionare il processo che richiede molte risorse nell'interfaccia superiore. + + !!! question "Domanda" + + ``` + Qual è l'ID del processo e l'utilizzo delle risorse del processo intensivo? + ``` + +5. Modificare l'ordine di ordinamento in `top` per visualizzare i processi che utilizzano più CPU o memoria (premere P o M). + + !!! question "Domanda" + + ``` + Qual è il processo che si trova in cima alla lista dopo l'ordinamento? + ``` + +6. Uscire da `top` premendo `q`. + +#### Monitorare i processi e l'utilizzo delle risorse utilizzando `top` + +1. Avviare il comando `top` in modalità interattiva. + + ```bash + top + ``` + + !!! question "Domanda" + + ``` + Quali informazioni vengono visualizzate nella schermata superiore? + ``` + +2. Utilizzare il tasto 1 per visualizzare un riepilogo dell'utilizzo dei singoli core della CPU. + + !!! question "Domanda" + + ``` + Qual è la ripartizione dell'utilizzo del core della CPU per ciascun core? + ``` + +3. Premere u per visualizzare i processi di un utente specifico. Inserire il vostro nome utente. + + !!! question "Domanda" + + ``` + Quali processi sono attualmente in esecuzione per il vostro utente? + ``` + +4. Ordinare i processi in base all'utilizzo della memoria (premere M) e osservare i processi che consumano più memoria. + + !!! question "Domanda" + + ``` + Quali processi stanno utilizzando più memoria? + ``` + +5. Uscire da top premendo ++"q"++. + + !!! question "Domanda" + + ``` + Spiegare l'importanza del monitoraggio delle risorse di sistema mediante il comando `top` e come questo possa aiutare a risolvere i problemi relativi alle prestazioni. + ``` + +## Esercizio 4 + +### Modifica della priorità di un processo con `nice` e `renice` + +#### Regolare la priorità del processo utilizzando `nice` + +1. Avviare un processo che richieda un uso intensivo della CPU con priorità predefinita/normale. Digitare: + + ```bash + bash -c 'while true; do echo "Default priority: The PID is $$"; done' + ``` + + OUTPUT: + + ```bash + Default priority: The PID is 2185209 + Default priority: The PID is 2185209 + Default priority: The PID is 2185209 + ....... + ``` + + Dall'output, il valore del PID sul nostro sistema di esempio è `2185209`. + + Il valore del PID sarà diverso sul vostro sistema. + + Si noti il valore del PID visualizzato continuamente sullo schermo del vostro sistema. + +2. In un altro terminale, utilizzando il valore PID, controllare la priorità predefinita del processo utilizzando `ps`. Digitare: + + ```bash + ps -p -o ni + ``` + + !!! question "Domanda" + + ``` + Qual è la priorità predefinita del processo in esecuzione (valore `nice`)? + ``` + +3. Utilizzando il PID del processo stampato, terminare il processo utilizzando il comando `kill`. + +4. Utilizzando il comando `nice`, riavviare un processo simile con un valore di niceness inferiore (ovvero più favorevole al processo O con priorità più alta). Utilizzare un valore `nice` pari a `-20`. Digitare: + + ```bash + nice -n -20 bash -c 'while true; do echo "High priority: The PID is $$"; done' + ``` + +5. Utilizzando il valore del PID, controllare la priorità del processo utilizzando `ps`. Digitare: + + ```bash + ps -p -o ni + ``` + + !!! question "Domanda" + + ``` + La priorità del processo è stata impostata correttamente? + ``` + +6. Premendo contemporaneamente i tasti ++ctrl+c++ sulla tastiera `terminare` il nuovo processo ad alta priorità. + +7. Utilizzando nuovamente il comando `nice`, riavviare un altro processo, ma questa volta con un valore di niceness più alto (cioè meno favorevole al processo O con priorità inferiore). Utilizzare un valore `nice` pari a `19` Digitare: + + ```bash + nice -n 19 bash -c 'while true; do echo "Low priority: The PID is $$"; done' + ``` + + OUTPUT: + + ```bash + Low priority: The PID is 2180254 + Low priority: The PID is 2180254 + ...... + ``` + +8. Controllare la priorità personalizzata del processo utilizzando `ps`. Digitare: + + ```bash + ps -p -o ni + ``` + +9. Premere contemporaneamente i tasti ++ctrl+c++ sulla tastiera per terminare il nuovo processo a bassa priorità. + +10. Provare a modificare la priorità dei diversi processi assegnando valori più alti o più bassi e osservare l'impatto sull'utilizzo delle risorse del processo. + +#### Per regolare la priorità di un processo in esecuzione utilizzando `renice` + +1. Avviare un processo che richieda un uso intensivo della CPU, come un calcolo matematico complesso con l'utilità md5sum. Digitare: + + ```bash + find / -path '/proc/*' -prune -o -type f -exec md5sum {} \; > /dev/null + ``` + +2. Utilizzare il comando `ps` per individuare il PID del processo `find/md5sum` precedente. Digitare: + + ```bash + ps -C find -o pid= + ``` + + OUTPUT: + + ```bash + 2577072 + ``` + + Dall'output, il valore del PID sul sistema di esempio è `2577072`. + + Il valore del PID sarà diverso sul vostro sistema. + + Prendere nota del valore del PID sul sistema. + +3. Utilizzare il comando `renice` per impostare la priorità del processo `find/md5sum` in esecuzione su un valore di niceness inferiore (ad esempio, -10, priorità più alta). Digitare: + + ```bash + renice -n -10 -p $(ps -C find -o pid=) + ``` + + OUTPUT: + + ```bash + (process ID) old priority 0, new priority -10 + ``` + + Sostituire `` (sopra) con il PID effettivo del processo in esecuzione. + +4. Monitorare l'utilizzo delle risorse per il processo `find/md5sum`, utilizzando `top` (o `htop`). Digitare: + + ```bash + top -cp $(ps -C find -o pid=) + ``` + + !!! question "Domanda" + + ``` + Il processo ora riceve una quota maggiore di risorse della CPU? + ``` + +5. Modificare la priorità del processo `find/md5sum` impostando un valore `nice` più alto (ad esempio 10, priorità più bassa). Digitare: + + ```bash + renice -n 10 -p + ``` + + OUTPUT: + + ```bash + 2338530 (process ID) old priority -10, new priority 10 + ``` + + Sostituire `` (sopra) con il PID effettivo del processo in esecuzione. + + !!! question "Domanda" + + ``` + Spiegare come viene utilizzato il comando `nice` per regolare le priorità dei processi e come influisce sull'allocazione delle risorse di sistema. + ``` + +6. Premere contemporaneamente i tasti ++ctrl+c++ sulla tastiera per interrompere il processo `find/md5sum` . È anche possibile utilizzare il comando `kill` per ottenere lo stesso risultato. + +## Esercizio 5 + +### Identificazione dei processi con `pgrep` + +#### Trovare i processi in base al nome utilizzando `pgrep` + +1. Utilizzare il comando `pgrep` per identificare tutti i processi associati a un programma o servizio specifico, come ad esempio `sshd`. + + ```bash + pgrep sshd + ``` + + !!! question "Domanda" + + ``` + Quali sono gli ID dei processi `sshd`? + ``` + +2. Verificare l'esistenza dei processi identificati utilizzando il comando `ps`. + + ```bash + ps -p + ``` + + Sostituire “” con gli ID di processo ottenuti al punto 1. + +3. Utilizzare il comando `pgrep` per identificare i processi con un nome specifico, ad esempio “cron”. + + ```bash + pgrep cron + ``` + + !!! question "Domanda" + + ``` + Esistono processi con il nome “cron”? + ``` + + !!! question "Domanda" + + ``` + Spiegare la differenza tra l'uso di `ps` e `pgrep` per identificare e gestire i processi. + ``` + +## Esercizio 6 + +### Processi in foreground e in background + +Questo esercizio riguarda la gestione dei processi con `fg` e `bg`. + +#### Gestire i processi in background e in primo piano utilizzando `bg` e `fg` + +1. Avviare un processo long-running in foreground. Ad esempio, si può usare un comando semplice come `sleep`. Digitare: + + ```bash + sleep 300 + ``` + +2. Sospendere il processo in foreground premendo ++ctrl+z++ sulla tastiera. Questo dovrebbe riportarvi al prompt della shell. + +3. Elencare i processi sospesi utilizzando il comando `jobs`. Digitare: + + ```bash + jobs + ``` + + !!! question "Domanda" + + ``` + Qual è lo stato del lavoro sospeso? + ``` + +4. Riportare il processo sospeso in foreground utilizzando il comando `fg`. + + ```bash + fg + ``` + + !!! question "Domanda" + + ``` + Cosa succede quando si riporta il lavoro in foreground? + ``` + +5. Sospendere nuovamente il processo utilizzando ++ctrl+z++, quindi spostarlo in background utilizzando il comando `bg`. + + ```bash + bg + ``` + + !!! question "Domanda" + + ``` + Qual è lo stato attuale del lavoro? + ``` + + !!! question "Domanda" + + ``` + Spiegare lo scopo dei processi in primo piano e in background e come vengono gestiti utilizzando i comandi `fg` e `bg`. + ``` + +#### Avviare un processo in background + +1. Il simbolo `&` può avviare un processo che viene immediatamente eseguito in background. Ad esempio, per avviare il comando `sleep` in background, digitare: + + ```bash + sleep 300 & + ``` + + Sospendere il processo in esecuzione utilizzando ++ctrl+z++. + +2. Elencare lo stato di tutti i jobs attivi. Digitare: + + ```bash + jobs -l + ``` + + !!! question "Domanda" + + ``` + Qual è lo stato del processo “sleep 300”? + ``` + +3. Riportare il processo in background in primo piano utilizzando il comando `fg`. + + ```bash + fg + ``` + +4. Terminare anticipatamente il processo `sleep` inviandogli il segnale SIGSTOP premendo ++ctrl+c++. + +#### Per gestire i processi interattivi utilizzando `bg` e `fg` + +1. Avviare un processo interattivo come l'editor di testo `vi` per creare e modificare un file di testo di esempio denominato “foobar.txt”. Digitare: + + ```bash + vi foobar1.txt + ``` + + Sospendere il processo in esecuzione utilizzando `Ctrl` + `Z`. + + Utilizzare il comando `bg` per spostare il processo sospeso in background. + + ```bash + bg + ``` + + !!! question "Domanda" + + ``` + Il processo è ora in esecuzione in background? + ``` + +2. Inserire “Hello” all'interno del file `foobar1.txt` nel vostro editor `vi`. + +3. Sospendere la sessione di modifica del testo `vi` in esecuzione premendo ++ctrl+z++. + +4. Avviare un'altra sessione separata dell'editor `vi` per creare un altro file di testo denominato “foobar2.txt”. Digitare: + + ```bash + vi foobar2.txt + ``` + +5. Inserire il testo di esempio “Hi inside foobar2.txt” nella seconda sessione di vi. + +6. Sospendere la seconda sessione vi utilizzando ++ctrl+z++. + +7. Elencare lo stato di tutti i `job` sul terminale corrente. Digitare: + + ```bash + jobs -l + ``` + + OUTPUT: + + ```bash + [1]- 2977364 Stopped vi foobar1.txt + [2]+ 2977612 Stopped vi foobar2.txt + ``` + + Si dovrebbero avere almeno 2 job elencati nell'output. Il numero nella prima colonna dell'output mostra i numeri dei job: [1] e [2]. + +8. Riprendere ==e portare in primo piano== la prima sessione `vi` digitando: + + ```bash + fg %1 + ``` + +9. Sospendere nuovamente la prima sessione `vi` utilizzando ++ctrl+z++. + +10. Riprendere ==e portare in foreground== la seconda sessione `vi` digitando: + + ```bash + fg %2 + ``` + +11. Terminare in modo non corretto entrambe le sessioni di modifica `vi` inviando il segnale KILL a entrambi i processi. Eseguire il comando `kill` seguito dal comando jobs. Digitare: + + ```bash + kill -SIGKILL %1 %2 && jobs + ``` + + OUTPUT: + + ```bash + [1]- Killed vi foobar1.txt + [2]+ Killed vi foobar2.txt + ``` + +## Esercizio 7 + +### Identificazione dei processi con `pidof` + +#### Trovare l'ID di processo di un comando in esecuzione utilizzando `pidof` + +1. Selezioniamo un processo in esecuzione standard/comune di cui vogliamo trovare l'ID. Useremo `systemd` come esempio. + +2. Utilizzare il comando `pidof` per trovare l'ID del processo di `systemd`. Digitare: + + ```bash + pidof systemd + ``` + + Prendere nota del ID di processo di `systemd`. + +3. Verificare l'esistenza del processo identificato utilizzando il comando `ps`. + + ```bash + ps -p + ``` + + Sostituire `` con l'ID del processo ottenuto al punto 2. + + !!! question "Domanda" + + ``` + Spiegare la differenza tra `pgrep` e `pidof` per trovare l'ID di processo di un comando in esecuzione. + ``` + +## Esercizio 8 + +### Esplorazione del filesystem /sys + +#### Esplorare il filesystem /sys + +1. Elencare il contenuto della directory /sys. Digitare: + + ```bash + ls /sys + ``` + + !!! question "Domanda" + + ``` + Che tipo di informazioni sono memorizzate nella directory /sys? + ``` + +2. Passare a una voce specifica di /sys, ad esempio le informazioni sulla CPU. + + ```bash + cd /sys/devices/system/cpu + ``` + +3. Elencare il contenuto della directory corrente per esplorare le informazioni relative alla CPU. + + ```bash + ls + ``` + + !!! question "Domanda" + + ``` + Quali informazioni relative alla CPU sono disponibili nel filesystem /sys? + ``` + + !!! question "Domanda" + + ``` + Spiegare lo scopo del filesystem /sys in Linux e il suo ruolo nella gestione dell'hardware e della configurazione del sistema. + ``` + +## Esercizio 9 + +### Arresto dei processi in base al nome con `pkill` + +#### Terminare i processi in base al nome utilizzando `pkill` + +1. Identificare i processi con un nome specifico, come “firefox”. + + ```bash + pkill firefox + ``` + + !!! question "Domanda" + + ``` + Sono stati terminati tutti i processi con il nome “firefox”? + ``` + +2. Controllare che lo stato dei processi sia terminato utilizzando `ps`. + + ```bash + ps aux | grep firefox + ``` + + !!! question "Domanda" + + ``` + Ci sono processi rimanenti con il nome “firefox”? + ``` + + Utilizza `pkill` per terminare forzatamente tutti i processi con un nome specifico. + + ```bash + pkill -9 firefox + ``` + + Verificare che tutti i processi con il nome “firefox” siano stati terminati. + + !!! question "Domanda" + + ``` + Qual è la differenza tra l'uso di `kill` e `pkill` per terminare i processi in base al nome? + ``` + +## Esercizio 10 + +Questo esercizio riguarda l'uso del potente comando `exec`. + +### Controllo dei processi con `exec` + +#### Rimpiazzare la shell corrente con un altro comando utilizzando `exec` + +1. Avviare una nuova sessione shell. Digitare: + + ```bash + bash + ``` + +2. Lanciare un comando che non esce dalla nuova shell, come un semplice ciclo while. + + ```bash + while true; do echo "Running..."; done + ``` + +3. Nella shell corrente, sostituire il comando in esecuzione con uno diverso utilizzando `exec`. + + ```bash + exec echo "This replaces the previous command." + ``` + + Da notare che il comando precedente è stato chiuso e quello nuovo è in esecuzione. + +4. Verificare che il vecchio comando non sia più in esecuzione utilizzando `ps`. + + ```bash + ps aux | grep "while true" + ``` + + !!! question "Domanda" + + ``` + Il comando precedente è ancora in esecuzione? + ``` + + !!! question "Domanda" + + ``` + Spiega come il comando `exec` può sostituire il processo della shell corrente con un comando diverso. + ``` + +## Esercizio 11 + +### Gestione dei processi con `killall` + +Come `kill`, `killall` è un comando che consente di terminare i processi in base al nome anziché al PID. Si possono osservare alcune somiglianze tra l'uso di `killall` , `kill` e `pkill` nella chiusura dei processi. + +#### Terminare i processi in base al nome utilizzando `killall` + +1. Identificare i processi con un nome specifico, come “chrome”. + + ```bash + killall chrome + ``` + + !!! question "Domanda" + + ``` + Sono stati terminati tutti i processi con il nome “chrome”? + ``` + +2. Controllare che lo stato dei processi sia terminato utilizzando `ps`. + + ```bash + ps aux | grep chrome + ``` + + !!! question "Domanda" + + ``` + Ci sono processi rimanenti con il nome “chrome”? + ``` + +3. Utilizzare `killall` per terminare forzatamente tutti i processi con un nome specifico. + + ```bash + killall -9 chrome + ``` + + Verificare che tutti i processi con il nome “chrome” siano stati chiusi. + + !!! question "Domanda" + + ``` + In che modo `killall` differisce da `pkill` e `kill` quando si terminano i processi in base al nome? + ``` + +## Esercizio 12 + +### Gestione di `cgroups` + +#### Gestire i processi utilizzando `cgroups` + +1. Elencare i `cgroups` esistenti sul vostro sistema. + + ```bash + cat /proc/cgroups + ``` + + !!! question "Domanda" + + ``` + Quali sono i controller `cgroup` disponibili sul vostro sistema? + ``` + +2. Creare un nuovo cgroup utilizzando il controller della CPU. Nominarlo “mygroup”. + + ```bash + sudo mkdir -p /sys/fs/cgroup/cpu/mygroup + ``` + +3. Spostare un processo specifico (ad esempio, un comando sleep in esecuzione) nel `cgroup` “mygroup”. + + ```bash + echo | sudo tee /sys/fs/cgroup/cpu/mygroup/cgroup.procs + ``` + + Sostituire `` con il PID effettivo del processo. + +4. Verificare se il processo è stato spostato nel `cgroup` “mygroup”. + + ```bash + cat /sys/fs/cgroup/cpu/mygroup/cgroup.procs + ``` + + !!! question "Domanda" + + ``` + Il processo è elencato nel cgroup “mygroup”? + ``` + + !!! question "Domanda" + + ``` + Spiegare il concetto di “cgroups” in Linux e come questi possono gestire e controllare l'allocazione delle risorse per i processi. + ``` + +## Esercizio 13 + +### Gestione dei processi con `renice` + +#### Regolare la priorità di un processo in esecuzione utilizzando `renice` + +1. Identificare un processo in esecuzione con un PID e una priorità specifici utilizzando `ps`. + + ```bash + ps -p -o ni + ``` + + !!! question "Domanda" + + ``` + Qual è l'attuale priorità (valore nice) del processo? + ``` + +2. Utilizzare il comando `renice` per modificare la priorità (valore nice) del processo in esecuzione. + + ```bash + renice -p + ``` + + Sostituire `` con il nuovo valore di priorità che si desidera impostare e `` con il PID effettivo del processo. + +3. Verificare che la priorità del processo sia cambiata utilizzando `ps`. + + ```bash + ps -p -o ni + ``` + + !!! question "Domanda" + + ``` + La priorità ora è diversa? + ``` + +4. Provare a modificare la priorità impostando un valore più alto o più basso e osservare l'impatto sull'utilizzo delle risorse del processo. + + !!! question "Domanda" + + ``` + Cosa succede al consumo di risorse del processo con valori nice diversi? + ``` + + !!! question "Domanda" + + ``` + Spiegare come viene utilizzato il comando renice per regolare la priorità dei processi in esecuzione e i suoi effetti sull'utilizzo delle risorse di processo. + ``` From ac8b072c1dc4be9b69c6b6b591da3698a7f0656d Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Wed, 13 Aug 2025 10:29:40 -0400 Subject: [PATCH 102/164] New Crowdin updates (#2826) * New translations 07-loops.md (Ukrainian) * New translations 08-check-your-knowledge.md (Ukrainian) --- docs/books/learning_bash/07-loops.uk.md | 4 ++-- docs/books/learning_bash/08-check-your-knowledge.uk.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/books/learning_bash/07-loops.uk.md b/docs/books/learning_bash/07-loops.uk.md index b896ed9a74..e6c161e225 100644 --- a/docs/books/learning_bash/07-loops.uk.md +++ b/docs/books/learning_bash/07-loops.uk.md @@ -4,7 +4,7 @@ author: Antoine Le Morvan contributors: Steven Spencer, Ganna Zhyrnova tested_with: 8.5 tags: - - освіта + - education - сценарій bash - bash --- @@ -13,7 +13,7 @@ tags: **** -**Цілі**: В цьому розділі ви дізнаєтеся як: +**Цілі**: В цьому розділі ви дізнаєтеся про: :heavy_check_mark: використання циклів; diff --git a/docs/books/learning_bash/08-check-your-knowledge.uk.md b/docs/books/learning_bash/08-check-your-knowledge.uk.md index c49e08ea82..a9b63f0bfb 100644 --- a/docs/books/learning_bash/08-check-your-knowledge.uk.md +++ b/docs/books/learning_bash/08-check-your-knowledge.uk.md @@ -4,7 +4,7 @@ author: Antoine Le Morvan contributors: Steven Spencer, Ganna Zhyrnova tested_with: 8.5 tags: - - освіта + - education - сценарій bash - bash --- From b85cb62b6be14d4c70d4f73202ae77be058a4a0c Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Thu, 14 Aug 2025 08:15:46 -0400 Subject: [PATCH 103/164] New Crowdin updates (#2827) * New translations test_cpu_compat.md (German) * New translations 03_rsync_demo02.md (Ukrainian) * New translations 05_rsync_authentication-free_login.md (Ukrainian) * New translations 06_rsync_inotify.md (Ukrainian) * New translations 07_rsync_unison_use.md (Ukrainian) * New translations install_nvchad.md (Ukrainian) * New translations 4_awk_command.md (Ukrainian) * New translations 01-files-servers.md (Ukrainian) * New translations rdp-server.md (Ukrainian) * New translations 021-web-servers-apache.md (Ukrainian) * New translations 04-database-servers.md (Ukrainian) * New translations 041-database-servers-mariadb.md (Ukrainian) * New translations 051-load-balancer-proxies-haproxy.md (Ukrainian) * New translations 053-load-balancer-proxies-squid.md (Ukrainian) --- .../learning_rsync/03_rsync_demo02.uk.md | 2 +- .../05_rsync_authentication-free_login.uk.md | 4 +-- .../learning_rsync/06_rsync_inotify.uk.md | 6 ++-- .../learning_rsync/07_rsync_unison_use.uk.md | 8 ++--- docs/books/nvchad/install_nvchad.uk.md | 4 +-- docs/books/sed_awk_grep/4_awk_command.uk.md | 12 +++---- .../books/web_services/01-files-servers.uk.md | 2 +- .../web_services/021-web-servers-apache.uk.md | 4 +-- .../web_services/04-database-servers.uk.md | 2 +- .../041-database-servers-mariadb.uk.md | 8 ++--- .../051-load-balancer-proxies-haproxy.uk.md | 2 +- .../053-load-balancer-proxies-squid.uk.md | 4 +-- docs/desktop/gnome/rdp-server.uk.md | 2 +- docs/gemstones/test_cpu_compat.de.md | 35 +++++++++++++++++++ 14 files changed, 65 insertions(+), 30 deletions(-) create mode 100644 docs/gemstones/test_cpu_compat.de.md diff --git a/docs/books/learning_rsync/03_rsync_demo02.uk.md b/docs/books/learning_rsync/03_rsync_demo02.uk.md index 103836d506..618d92d959 100644 --- a/docs/books/learning_rsync/03_rsync_demo02.uk.md +++ b/docs/books/learning_rsync/03_rsync_demo02.uk.md @@ -34,7 +34,7 @@ update: 2021-11-04 | auth users = li | Вмикає віртуальних користувачів і визначає назву віртуального користувача. Його потрібно створити самостійно | | secrets file = /etc/rsyncd_users.db | Використовується для вказівки розташування файлу пароля віртуального користувача, який має закінчуватися на .db. Формат вмісту файлу: «Ім’я користувача: пароль», по одному на рядок | -!!! підказка +!!! tip "Підсказка" Дозвіл доступу до файлу паролів має бути 600. diff --git a/docs/books/learning_rsync/05_rsync_authentication-free_login.uk.md b/docs/books/learning_rsync/05_rsync_authentication-free_login.uk.md index 4c16e79983..635bd02bf8 100644 --- a/docs/books/learning_rsync/05_rsync_authentication-free_login.uk.md +++ b/docs/books/learning_rsync/05_rsync_authentication-free_login.uk.md @@ -59,7 +59,7 @@ Last login: Tue Nov 2 21:42:44 2021 from 192.168.100.5 [testrsync@Rocky ~]$ ``` -!!! підказка +!!! tip "Підсказка" Файл конфігурації сервера **/etc/ssh/sshd_config** має бути відкритий PubkeyAuthentication yes @@ -95,6 +95,6 @@ sent 30 bytes received 193 bytes 148.67 bytes/sec total size is 883 speedup is 3.96 ``` -!!! підказка +!!! tip "Підсказка" Ви можете записати цю змінну в **/etc/profile**, щоб вона стала чинною. Вміст: `export RSYNC_PASSWORD=13579` diff --git a/docs/books/learning_rsync/06_rsync_inotify.uk.md b/docs/books/learning_rsync/06_rsync_inotify.uk.md index 0ee901b3a6..a55a1cea1e 100644 --- a/docs/books/learning_rsync/06_rsync_inotify.uk.md +++ b/docs/books/learning_rsync/06_rsync_inotify.uk.md @@ -123,7 +123,7 @@ fs.inotify.max_user_watches = 1048576 ## Поєднання `inotifywait` і `rsync` -!!! підказка +!!! tip "Підсказка" Ми працюємо на сервері Rocky Linux 8, використовуючи для демонстрації протокол SSH. @@ -144,12 +144,12 @@ $a | while read directory event file [root@Rocky ~]# bash /root/rsync_inotify.sh & ``` -!!! підказка +!!! tip "Підсказка" Під час використання протоколу SSH для передачі даних синхронізації, якщо порт служби SSH цільової машини не 22, ви можете використовувати метод, подібний до цього—— `b="/usr/bin/rsync -avz -e 'ssh -p [port-number]' /rsync/* testfedora@192.168.100.5:/home/testfedora/"` -!!! підказка +!!! tip "Підсказка" Якщо ви хочете запустити цей сценарій під час завантаження `[root@Rocky ~]# echo "bash /root/rsync_inotify.sh &" >> /etc/rc.local` diff --git a/docs/books/learning_rsync/07_rsync_unison_use.uk.md b/docs/books/learning_rsync/07_rsync_unison_use.uk.md index 62e5bf98e4..b464aa1470 100644 --- a/docs/books/learning_rsync/07_rsync_unison_use.uk.md +++ b/docs/books/learning_rsync/07_rsync_unison_use.uk.md @@ -33,7 +33,7 @@ Last login: Wed Nov 3 22:07:18 2021 from 192.168.100.5 [testrsync@Rocky ~]$ ``` -!!! підказка +!!! tip "Підсказка" Конфігураційні файли двох машин **/etc/ssh/sshd_config** мають бути відкриті PubkeyAuthentication yes @@ -132,16 +132,16 @@ done [root@fedora ~]# jobs -l ``` -!!! підказка +!!! tip "Підсказка" Для двосторонньої синхронізації повинні бути запущені сценарії обох машин, інакше буде повідомлено про помилку. -!!! підказка +!!! tip "Підсказка" Якщо ви хочете запустити цей сценарій під час завантаження `[root@Rocky ~]# echo "bash /root/unison1.sh &" >> /etc/rc.local` `[root@Rocky ~]# chmod +x /etc/rc.local` -!!! підказка +!!! tip "Підсказка" Якщо ви хочете зупинити відповідний процес цього сценарію, ви можете знайти його в команді `htop`, а потім **kill** diff --git a/docs/books/nvchad/install_nvchad.uk.md b/docs/books/nvchad/install_nvchad.uk.md index 48f3759980..2585cf6c47 100644 --- a/docs/books/nvchad/install_nvchad.uk.md +++ b/docs/books/nvchad/install_nvchad.uk.md @@ -64,7 +64,7 @@ rm -rf ~/.cache/nvim git clone https://github.com/NvChad/starter ~/.config/nvim && nvim ``` -Команда складається з двох частин. Перший завантажує вміст репозиторію *starter* до `~/.config/nvim/` (тека за замовчуванням для налаштувань Neovim), а другий викликає ==nvim== виконуваний файл, який ініціалізує редактор конфігурацією, яку ви щойно завантажили. Після завершення встановлення плагінів і синтаксичних аналізаторів ви побачите наступний екран. Щоб закрити менеджер плагінів, введіть ++"q "++ : +Команда складається з двох частин. Перший завантажує вміст репозиторію *starter* до `~/.config/nvim/` (тека за замовчуванням для налаштувань Neovim), а другий викликає ==nvim== виконуваний файл, який ініціалізує редактор конфігурацією, яку ви щойно завантажили. Після завершення встановлення плагінів і синтаксичних аналізаторів ви побачите наступний екран. Щоб закрити менеджер плагінів, введіть ++"q"++ : ![NvChad Install](images/install_nvchad_25.png) @@ -217,7 +217,7 @@ end) Це встановлює чотири основні клавіші, за допомогою яких разом з іншими клавішами можна запускати команди. Основні ключі: * C = ++ctrl++ -* leader = ++пробіл++ +* leader = ++space++ * A = ++alt++ * S = ++shift++ diff --git a/docs/books/sed_awk_grep/4_awk_command.uk.md b/docs/books/sed_awk_grep/4_awk_command.uk.md index b754185273..9b7bc95738 100644 --- a/docs/books/sed_awk_grep/4_awk_command.uk.md +++ b/docs/books/sed_awk_grep/4_awk_command.uk.md @@ -471,7 +471,7 @@ ID Name netbios-ns 137/tcp # NETBIOS Name Service ``` - !!! info + !!! info "примітка" ``` Початковий діапазон: припинення збігу, коли знайдено перший збіг. @@ -858,7 +858,7 @@ False 9 ``` - !!! question "Питання" + !!! питання ``` **Чому?** @@ -955,7 +955,7 @@ False 9 ``` - !!! info + !!! info "примітка" ``` Будь ласка, зверніть увагу! Ви повинні взяти подвійні лапки, щоб включити команду. @@ -1213,7 +1213,7 @@ False root ``` - !!! info + !!! info "примітка" ```` Числовий нижній індекс масиву `awk` може бути додатним цілим, від’ємним цілим числом, рядком або 0, тому числовий індекс масиву `awk` не має поняття початкового значення. Це не те саме, що масиви в bash. @@ -1591,7 +1591,7 @@ False 10 admin ``` - !!! info + !!! info "примітка" ``` Правила сортування: @@ -1615,7 +1615,7 @@ False 8 root ``` - !!! info + !!! info "примітка" ``` Правила сортування: diff --git a/docs/books/web_services/01-files-servers.uk.md b/docs/books/web_services/01-files-servers.uk.md index dc40d25aa8..5a27f544d2 100644 --- a/docs/books/web_services/01-files-servers.uk.md +++ b/docs/books/web_services/01-files-servers.uk.md @@ -7,7 +7,7 @@ tags: - sftp --- -!!! info +!!! info "інформація" ``` Вміст цієї сторінки ще не написаний. diff --git a/docs/books/web_services/021-web-servers-apache.uk.md b/docs/books/web_services/021-web-servers-apache.uk.md index 613b9573e0..7c776dd9ec 100644 --- a/docs/books/web_services/021-web-servers-apache.uk.md +++ b/docs/books/web_services/021-web-servers-apache.uk.md @@ -260,7 +260,7 @@ IncludeOptional conf.d/*.conf Директиви, які зустрічаються в розділі 1: -| Опція | Опис | +| Опція | Інформація | | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `ServerTokens` | Ця директива буде в наступному розділі. | | `ServertRoot` | Вказує шлях до каталогу, що містить усі файли, що утворюють сервер Apache. | @@ -343,7 +343,7 @@ LoadModule mpm_event_module modules/mod_mpm_event.so Значення також використовуються як значення за замовчуванням для віртуальних сайтів. -| Опція | Опис | +| Опція | Інформація | | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ServerAdmin` | визначає адресу електронної пошти, яка з’являється на певних автоматично згенерованих сторінках, наприклад на сторінках помилок. | | `ServerName` | визначає ім'я, що ідентифікує сервер. Це може статися автоматично, але рекомендовано вказати це явно (IP-адреса або ім’я DNS). | diff --git a/docs/books/web_services/04-database-servers.uk.md b/docs/books/web_services/04-database-servers.uk.md index a46598b347..c4e7a6ce0e 100644 --- a/docs/books/web_services/04-database-servers.uk.md +++ b/docs/books/web_services/04-database-servers.uk.md @@ -4,7 +4,7 @@ contributors: title: Частина 4. Сервери баз даних --- -!!! info +!!! info "інформація" ``` Треба написати вступ до серверів реляційних баз даних. diff --git a/docs/books/web_services/041-database-servers-mariadb.uk.md b/docs/books/web_services/041-database-servers-mariadb.uk.md index dd44b726f3..757b417cb7 100644 --- a/docs/books/web_services/041-database-servers-mariadb.uk.md +++ b/docs/books/web_services/041-database-servers-mariadb.uk.md @@ -226,7 +226,7 @@ sudo firewall-cmd --reload mysql -u user -p [base] ``` -| Опція | Опис | +| Опція | Інформація | | --------- | ------------------------------------------------------- | | `-u user` | Надає ім’я користувача для підключення. | | `-p` | Запитує пароль. | @@ -274,7 +274,7 @@ MariaDB [(none)]> show databases; mariadb-admin -u user -p command ``` -| Опція | Опис | +| Опція | Інформація | | --------- | ------------------------------------------------------- | | `-u user` | Надає ім’я користувача для підключення. | | `-p` | Запитує пароль. | @@ -328,7 +328,7 @@ long_query_time = 2 mariadb-dumpslow [options] [log_file ...] ``` -| Опція | Опис | +| Опція | Інформація | | -------------- | -------------------------------------------------- | | `-t n` | Відображає лише перші n запитів. | | `-s sort_type` | Сортує за кількістю запитів. | @@ -336,7 +336,7 @@ mariadb-dumpslow [options] [log_file ...] Типи сортування можуть бути: -| Опція | Опис | +| Опція | Інформація | | ------------ | ----------------------------------------------------------------------------------------------------------------- | | `c` | за кількістю звернень. | | `t` або `at` | відповідно до часу виконання або середнього часу виконання (a для середнього). | diff --git a/docs/books/web_services/051-load-balancer-proxies-haproxy.uk.md b/docs/books/web_services/051-load-balancer-proxies-haproxy.uk.md index b519e8024c..678bd35dfb 100644 --- a/docs/books/web_services/051-load-balancer-proxies-haproxy.uk.md +++ b/docs/books/web_services/051-load-balancer-proxies-haproxy.uk.md @@ -4,7 +4,7 @@ contributors: title: Частина 5.1 HAProxy --- -!!! info +!!! info "інформація" ``` Цей вміст ще не написано. diff --git a/docs/books/web_services/053-load-balancer-proxies-squid.uk.md b/docs/books/web_services/053-load-balancer-proxies-squid.uk.md index 94f9105505..6d6063ee15 100644 --- a/docs/books/web_services/053-load-balancer-proxies-squid.uk.md +++ b/docs/books/web_services/053-load-balancer-proxies-squid.uk.md @@ -403,7 +403,7 @@ Squid покладається на зовнішні програми для к Автентифікація також може бути юридичною необхідністю. Не забудьте змусити своїх користувачів підписати статут про використання! -### Tools +### Інструменти #### Команда `squidclient` @@ -425,7 +425,7 @@ squidclient -s -h localhost -p 8080 http://localhost/ | ----- | ------------------------------------------------------------------- | | `-s` | Тихий режим (у консолі нічого не відображається) | | `-h` | Визначає цільовий проксі | -| `-p` | Порт прослуховування (за замовчуванням 3128) | +| `-р` | Порт прослуховування (за замовчуванням 3128) | | `-r` | Змушує сервер перезавантажити об’єкт | #### Проаналізуйте журнали diff --git a/docs/desktop/gnome/rdp-server.uk.md b/docs/desktop/gnome/rdp-server.uk.md index 273b21e98d..0b7bb8c207 100644 --- a/docs/desktop/gnome/rdp-server.uk.md +++ b/docs/desktop/gnome/rdp-server.uk.md @@ -81,7 +81,7 @@ sudo firewall-cmd --reload Ви можете вийти, якщо не хочете перезавантажуватись. RDP використовує облікові дані вашого облікового запису користувача для безпеки. Увійти віддалено, якщо ви вже ввійшли на свій робочий стіл локально, неможливо. Принаймні, не в тому самому обліковому записі користувача. -!!! info +!!! info "примітка" ``` Ви також можете використовувати програму Firewall, щоб керувати `firewalld` і відкривати будь-які порти, які хочете. Слідкуйте за посиланням на мій посібник із встановлення та використання програми Firewall. diff --git a/docs/gemstones/test_cpu_compat.de.md b/docs/gemstones/test_cpu_compat.de.md new file mode 100644 index 0000000000..468417761f --- /dev/null +++ b/docs/gemstones/test_cpu_compat.de.md @@ -0,0 +1,35 @@ +--- +title: Test der CPU-Kompatibilität +author: Steven Spencer +contributors: Louis Abel, Ganna Zhyrnova +tags: + - cpu test +--- + +# Einleitung + +Seit der Veröffentlichung von Rocky Linux 9 sind einige Installationen auf x86-64-Plattformen beim Start mit einer Kernel-Panic-Meldung fehlgeschlagen. In den meisten Fällen ist dies auf die ==Inkompatibilität der CPU mit Rocky Linux 9== zurückzuführen. Mit diesem Verfahren wird die CPU-Kompatibilität vor der Installation überprüft. **Update:** Dieses Verfahren spiegelt nun auch die Mindestprozessorkompatibilität für Rocky Linux 10 wider. + +## Testen + +1. Besorgen Sie sich ein Boot-Image von Rocky Linux 8, Fedora oder anderen. + +2. Booten Sie dieses Live-Image auf dem Computer, auf dem Sie Rocky Linux 9 installieren möchten. + +3. Nachdem der Startvorgang abgeschlossen ist, öffnen Sie ein Terminalfenster und führen Sie dieses Kommando aus: + + ```bash + /lib64/ld-linux-x86-64.so.2 --help | grep x86-64 + ``` + + Sie sollten eine Ausgabe erhalten, die etwa dieser ähnelt: + + ```bash + Usage: /lib64/ld-linux-x86-64.so.2 [OPTION]... EXECUTABLE-FILE [ARGS-FOR-PROGRAM...] + This program interpreter self-identifies as: /lib64/ld-linux-x86-64.so.2 + x86-64-v4 + x86-64-v3 + x86-64-v2 (supported, searched) + ``` + + Diese Ausgabe gibt die minimal erforderliche x86-64-Version (v2) an. In diesem Fall kann die Installation fortgesetzt werden. Wenn Sie neben `x86-64-v2` kein Eintrag (`supported, searched`) sehen, ist Ihre CPU nicht mit Rocky Linux 9.x kompatibel. Wenn der Test anzeigt, dass Ihre Installation fortgesetzt werden kann und x86-64-v3 (erforderlich für Rocky Linux 10) und x86-64-v4 auch als `(supported, searched)` aufgeführt werden, wird Ihre CPU für 9.x und zukünftige Versionen gut unterstützt. From cdcc7e2cfa13a041c650448b4aa88852b7e5c2a4 Mon Sep 17 00:00:00 2001 From: ambaradan <87865413+ambaradan@users.noreply.github.com> Date: Fri, 15 Aug 2025 15:26:55 +0200 Subject: [PATCH 104/164] =?UTF-8?q?revision=20of=20the=20=E2=80=98lab3-sys?= =?UTF-8?q?tem=5Futilities=E2=80=99=20page=20(#2829)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fixed the structure of the headers - added inline codes and italics for paths and file names where missing - fixed the options tables - added some additional descriptions for the exercise commands --- .../lab3-system_utilities.md | 585 ++++++++---------- 1 file changed, 248 insertions(+), 337 deletions(-) diff --git a/docs/labs/systems_administration_I/lab3-system_utilities.md b/docs/labs/systems_administration_I/lab3-system_utilities.md index a686e57e02..13a3e93715 100644 --- a/docs/labs/systems_administration_I/lab3-system_utilities.md +++ b/docs/labs/systems_administration_I/lab3-system_utilities.md @@ -1,6 +1,7 @@ --- -author: Wale Soyinka -contributors: Steven Spencer, Ganna Zhyrnova +title: Lab 3 - Common System Utilities +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova, Franco Colussi tested on: All Versions tags: - lab exercise @@ -8,8 +9,6 @@ tags: - cli --- -# Lab 3: Common System Utilities - ## Objectives After completing this lab, you will be able to @@ -20,21 +19,28 @@ Estimated time to complete this lab: 70 minutes ## Common system utilities found on Linux systems +### What is a System Utility? + +In a Linux environment, *system utilities* are programs and commands that allow you to manage, monitor, and optimize the operation of the operating system. These tools are essential for system administrators, developers, and advanced users, as they simplify tasks such as file management, process control, network configuration, and much more. + +Unlike graphical interfaces, many utilities are accessible via the command line, offering greater flexibility, automation, and control over the system. + The exercises in this lab cover the usage of some basic system utilities that users and administrators alike need to be familiar with. Most of the commands are used in navigating and manipulating the file system. The file system is made up of files and directories. The exercises will cover the usage of –`pwd`, `cd`, `ls`, `rm`, `mv`, `ftp`, `cp`, `touch`, `mkdir`, `file`, `cat`, `find`, and `locate` utilities. -## Exercise 1 +## Exercises -### `cd` +### 1. File system navigation with `cd` -The `cd` command stands for change directory. You will start these labs by changing to other directories on the file system. +The `cd` command (short for ==Change Directory==) is one of the most commonly used commands in Linux and Unix-like systems. It allows you to move between directories in the file system, enabling users to navigate between folders and access the files within them. +The `cd` command is essential for working in the Linux shell, as it allows you to explore and organize the file system efficiently. -#### To Use `cd` +#### How to use `cd` 1. Log in to the computer as root -2. Change from your current directory to the /etc directory. +2. Change from your current directory to the `/etc` directory. ```bash [root@localhost root]# cd /etc @@ -60,13 +66,13 @@ The `cd` command stands for change directory. You will start these labs by chang [root@localhost local]# cd /root ``` -6. Change to the /usr/local/ directory again. Type: +6. Change to the `/usr/local/` directory again. Type: ```bash [root@localhost root]# cd /usr/local ``` -7. To change to the parent directory of the local directory type “cd ..” +7. To change to the parent directory of the local directory type `cd ..` ```bash [root@localhost local]# cd .. @@ -74,23 +80,21 @@ The `cd` command stands for change directory. You will start these labs by chang !!! Question - What is the parent directory of the /usr/local/ directory? + What is the parent directory of the `/usr/local/` directory? -8. To quickly change back to root’s home directory type “cd” without any argument. +8. To quickly change back to root’s home directory type `cd` without any argument. ```bash [root@localhost usr]# cd - [root@localhost root]# ``` -## Exercise 2 +### 2. Display the path with `pwd` -### `pwd` +The `pwd` (==Present Working Directory==) command shows the user the absolute path of the current directory within the file system. It is used to identify the current location when working in a terminal and you want to know exactly where you are. +This command is essential for navigating the file system, especially when working with complex paths or automated scripts. -The `pwd` command stands for “present working directory”. It shows the location you are in on the file system. - -#### To use `pwd` +#### How to use `pwd` 1. To find out your current working directory type: @@ -99,7 +103,7 @@ The `pwd` command stands for “present working directory”. It shows the locat /root ``` -2. Change your directory to the /usr/local/ directory using the “cd” command: +2. Change your directory to the `/usr/local/` directory using the `cd` command: ```bash [root@localhost root]# cd /usr/local @@ -115,30 +119,28 @@ The `pwd` command stands for “present working directory”. It shows the locat 4. Return to root’s home directory: ```bash - [root@localhost root]# cd + [root@localhost root]# cd ``` -## Exercise 3 - -### `mkdir` +### 3. Create folders with `mkdir` -The `mkdir` command is used to create directories. You will create two directories called “folder1” and “folder2.” +The `mkdir` (==Make Directory==) command allows you to create new directories (folders) within the file system. In this exercise, you will create two folders named `folder1` and `folder2`. -#### To use `mkdir` +#### How to use `mkdir` -1. Type: +1. Create the first directory called `folder1` ```bash [root@localhost root]# mkdir folder1 ``` -2. Create a second directory called folder2 +2. Create a second directory called `folder2` ```bash - [root@localhost root]# mkdir folder2 + [root@localhost root]# mkdir folder2 ``` -3. Now change your working directory to the “folder1” directory you created above. +3. Now change your working directory to the `folder1` directory you created above. ```bash [root@localhost root]# cd folder1 @@ -153,25 +155,24 @@ The `mkdir` command is used to create directories. You will create two directori !!! question - Without leaving your present directory, change to the “folder2” directory. What is the command to do this? + Without leaving your present directory, change to the `folder2` directory. What is the command to do this? 5. Return to root’s home directory. -## Exercise 4 +### 4. Modify file metadata with `touch` -### `touch` +The touch command is a tool that allows you to create new empty files or modify the access/modification dates of existing files, as well as advanced uses in scripting and automation. The name ==touch== comes from the idea of “*touching*” the file's metadata without necessarily modifying its content. +The files *file11*, *file12*, *file21*, and *file22* will be created in the folders created above. -The `touch` command can be used to create ordinary files. You will create “ file11, file12, file21, and file22 “ in the folders created above. +#### How to use `touch` -#### To use `touch` - -1. Change directory i.e. `cd` to folder1 and create "file11:" +1. Change directory i.e. `cd` to `folder1` and create *file11*: ```bash [root@localhost folder1]# touch file11 ``` -2. While still in folder1 create "file12:" +2. While still in `folder1` create *file12*: ```bash [root@localhost folder1]# touch file12 @@ -179,19 +180,17 @@ The `touch` command can be used to create ordinary files. You will create “ fi 3. Now return to root’s home directory. -4. `cd` to folder2 and create “file21” and “file22” +4. `cd` to `folder2` and create *file21* and *file22* ```bash - [root@localhost folder2]# Touch file21 file22 + [root@localhost folder2]# touch file21 file22 ``` 5. Return to root’s home directory. -## Exercise 5 - -### `ls` +### 5. List directories with `ls` -The `ls` command stands for list. It lists the contents of a directory. +The ls (==List==) command is one of the most fundamental and widely used commands in Linux and Unix-like systems. It allows you to view the contents of a directory, displaying files and subdirectories with various formatting and sorting options. #### To use `ls` @@ -205,23 +204,22 @@ The `ls` command stands for list. It lists the contents of a directory. List the contents of the directory -2. Change to the "folder1" directory +2. Change to the `folder1` directory -3. List the contents of “folder1” directory. Type `ls` +3. List the contents of `folder1` directory. Type `ls` ```bash [root@localhost folder1]# ls file11 file12 ``` -4. Change to the "folder2" directory and list its contents here: +4. Change to the `folder2` directory and list its contents here: -5. Change back to your home directory and list “all” the hidden files and folders: +5. Change back to your home directory and list **all** the hidden files and folders: ```bash [root@localhost folder2]# cd - - [root@localhost root]# ls –a + [root@localhost root]# ls –a .. .bash_history .bash_logout .bash_profile .bashrc folder1 folder2 .gtkrc .kde screenrc ``` @@ -230,50 +228,38 @@ The `ls` command stands for list. It lists the contents of a directory. ```bash [root@localhost root]# ls –al total 44 - drwx------ 5 root root 4096 May 8 10:15 . - drwxr-xr-x 8 root root 4096 May 8 09:44 .. - -rw------- 1 root root 43 May 8 09:48 .bash_history - -rw-r--r-- 1 root root 24 May 8 09:44 .bash_logout - -rw-r--r-- 1 root root 191 May 8 09:44 .bash_profile - -rw-r--r-- 1 root root 124 May 8 09:44 .bashrc - drwxrwxr-x 2 root root 4096 May 8 10:17 folder1 - drwxrwxr-x 2 root root 4096 May 8 10:18 folder2 - ……………………….. ``` -## Exercise 6 +### 6. Moving files with `mv` -### `mv` +The `mv` (==Move==) command provides a tool for managing files in the system. Its main function is to move or rename files and directories within the file system. This command is particularly useful for reorganizing the directory structure, performing batch operations on groups of files, and managing backups efficiently. -The `mv` command stands for move. It renames files or directories. It can also move files. +#### How too use `mv` -#### To use `mv` - -1. Change directory to the "folder1" directory and list its contents: +1. Change directory to the `folder1` directory and list its contents: ```bash - [root@localhost root]# cd folder1 + [root@localhost root]# cd folder1 [root@localhost folder1] ls - file11 file12 ``` -2. You will rename file11 and file12 in the "folder1" directory to temp_file11 and temp_file12 respectively: +2. You will rename *file11* and *file12* in the `folder1` directory to *temp_file11* and *temp_file12* respectively: ```bash [root@localhost folder1]# mv file11 temp_file11 ``` -3. List the contents of folder1 again. +3. List the contents of `folder1` again. ```bash [root@localhost folder1]# ls @@ -283,89 +269,88 @@ The `mv` command stands for move. It renames files or directories. It can also m Write down the contents: -4. Rename the file12 to temp_file12: +4. Rename the *file12* to *temp_file12*: ```bash [root@localhost folder1]# mv file12 temp_file12 ``` -5. Without changing directory rename the file21 and file22 in "folder2" to temp_file21 and temp_file22 respectively: +5. Without changing directory rename the *file21* and *file22* in `folder2` to *temp_file21* and *temp_file22* respectively: ```bash - [root@localhost folder1]# mv /root/folder2/file21 /root/folder2/temp_file21 - - [root@localhost folder1]# mv /root/folder2/file22 /root/folder2/temp_file22 + [root@localhost folder1]# mv /root/folder2/file21 /root/folder2/temp_file21 + [root@localhost folder1]# mv /root/folder2/file22 /root/folder2/temp_file22 ``` -6. Without changing your current directory list the contents of folder2. +6. Without changing your current directory list the contents of `folder2`. !!! question What is the command to do this? Also list the output of the command? -## Exercise 7 +### 7. Copying files with `cp` -### `cp` +The `cp` (==Copy==) command allows you to duplicate files and directories from one location to another in the file system, keeping the original file intact. Its ease of use and versatility make it indispensable for both everyday operations and more complex system administration tasks. +Among the most useful features of the `cp` command is the ability to preserve the original attributes of files during copying, including *permissions*, *timestamps*, and *owner information*. This feature is particularly important when working with configuration files or when certain document properties need to be kept intact. -The `cp` command stands for copy. It makes copies of files or directories. +#### How to use `cp` -1. Change your directory to the "folder2" directory. +1. Change your directory to the `folder2` directory. -2. Copy the contents of "folder2" (temp_file21 and temp_file22) to "folder1:" +2. Copy the contents of `folder2` (*temp_file21* and *temp_file22*) to `folder1`: ```bash - [root@localhost folder2]# cp temp_file21 temp_file22 ../folder1 + [root@localhost folder2]# cp temp_file21 temp_file22 ../folder1 ``` -3. List the contents of folder1. +3. List the contents of `folder1`. ```bash - [root@localhost folder2]# ls ../folder1 + [root@localhost folder2]# ls ../folder1 temp_file11 temp_file12 temp_file21 temp_file22 ``` -4. List the contents of folder2. Note that the original copies of temp_file21 and temp_file22 remain in folder2. +4. List the contents of `folder2`. Note that the original copies of *temp_file21* and *temp_file22* remain in `folder2`. ```bash [root@localhost folder2]# ls temp_file21 temp_file22 ``` -## Exercise 8 +### 8. Determining the file type with `file` -### `file` +The `file` command is a diagnostic tool that allows you to determine the type of a file by analyzing its contents. Unlike file extensions, which can be modified or misleading, this command examines the actual structure of the data to accurately identify its nature. +One of the most important features of the `file` command is its ability to distinguish between different types of text files, identifying, for example, shell scripts, source code in various programming languages, XML or JSON files. For binary files, it can recognize executables, shared libraries, images in various formats, and many other types of structured data. -The `file` utility is used to determine file or directory types. - -#### To use `file` +#### How to use `file` 1. Change back to your home directory. -2. To see if "folder1" is a file or directory; type: +2. To see if `folder1` is a file or directory; type: ```bash - [root@localhost root]# file folder1 + [root@localhost root]# file folder1 folder1: directory ``` -3. Change to the folder1 directory +3. Change to the `folder1` directory -4. Use the `file` utility to determine the file type for temp_file11: +4. Use the `file` utility to determine the file type for *temp_file11*: ```bash - [root@localhost folder1]# file temp_file11 + [root@localhost folder1]# file temp_file11 temp_file11: empty ``` -5. Use the `file` utility to find out the file type for all the files in the folder1 directory. List here: +5. Use the `file` utility to find out the file type for all the files in the `folder1` directory. List here: -6. Change directory to the /etc directory: +6. Change directory to the `/etc` directory: ```bash [root@localhost folder1]# cd /etc ``` -7. Use the `file` utility to find out the file type for the "passwd" file. +7. Use the `file` utility to find out the file type for the *passwd* file. ```bash [root@localhost etc]# file passwd @@ -375,17 +360,17 @@ The `file` utility is used to determine file or directory types. What type of file is it? -## Exercise 9 - -### `cat` +### 9. List and concatenate files with `cat` -The `cat` command is short for concatenate, meaning it strings files together. The command `cat` will also display the contents of an entire file on the screen. You will use `cat` along with the redirection symbol “>” to create a file. +The `cat` command (short for ==Concatenate==) is an essential tool for managing text files in Linux. Its main function is to display the contents of one or more files directly in the terminal, but it can also be used to create, merge, or copy files. +The cat command is particularly useful in combination with other tools (such as `grep` or `more`) for processing or filtering text directly from the terminal. Despite its simplicity, it is one of the most widely used commands for quick file manipulation. +You will use `cat` along with the redirection symbol “>” to create a file. #### To use `cat` to create a file -1. Change directory to the /root/folder1 directory +1. Change directory to the ``/root/folder1`` directory -2. Create a new text file called “first.txt” +2. Create a new text file called *first.txt* ```bash [root@localhost folder1]# cat > first.txt @@ -399,14 +384,14 @@ The `cat` command is short for concatenate, meaning it strings files together. T 4. Press the ++ctrl+c++ simultaneously. -5. Type “cat first.txt” to read the text you just typed in: +5. Type `cat first.txt` to read the text you just typed in: ```bash - [root@localhost folder1]# cat first.txt + [root@localhost folder1]# cat first.txt This is a line from first.txt !! ``` -6. Create another file called “second.txt” using `cat`. Type the following text into the file – “This is a line from second.txt !!” +6. Create another file called *second.txt* using `cat`. Type the following text into the file – “This is a line from second.txt !!” !!! Question @@ -414,80 +399,74 @@ The `cat` command is short for concatenate, meaning it strings files together. T #### To use `cat` to concatenate files together -1. You will concatenate the files “first.txt” and “second.txt”. Type: +1. You will concatenate the files *first.txt* and *second.txt*. Type: ```bash - [root@localhost folder1]# cat first.txt second.txt + [root@localhost folder1]# cat first.txt second.txt ``` !!! Question What is your output? -## Exercise 10 +### 10. Transferring files with `ftp` -### `ftp` - -`ftp` is a client program for using and connecting to FTP services via the File Transfer Protocol. The program allows users to transfer files to and from a remote network site. It is a utility you might need to use often. - -In this exercise you will learn how to log on anonymously to an FTP server and download a file from the server using an `ftp` client program. +The `ftp` (File Transfer Protocol) command is a command line tool for transferring files between remote and local systems. Although it has been partially replaced by more modern and secure protocols such as *SFTP* and *SCP*, it remains useful in legacy contexts or with servers that only support FTP. +FTP transmits data in **clear text**, including credentials and content, so it is not recommended for sensitive transfers. +Although FTP is still used in some environments, encrypted protocols are preferable for secure operations. +In this exercise you will learn how to log on anonymously to an FTP server and download a file from the server using an *ftp client* program. !!! note You will need to have completed the exercises in a previous lab to be able to follow along in this particular exercise that needs an available FTP server running somewhere reachable. -#### To use `ftp` +#### How to use `ftp` 1. Log on to your machine as root -2. Change directory to the “/usr/local/src/” directory +2. Change directory to the ``/usr/local/src/`` directory -3. Create a new directory called “downloads “ under the “/usr/local/src/” directory. +3. Create a new directory called `downloads` under the `/usr/local/src/` directory. !!! Question What is the command to do this? -4. Change directory to the newly created “downloads” directory +4. Change directory to the newly created `downloads` directory ```bash - [root@localhost src]# cd downloads + [root@localhost src]# cd downloads ``` -5. Type “ftp” to launch your `ftp` client: +5. Type `ftp` to launch your *ftp client*: ```bash - [root@localhost downloads]# ftp + [root@localhost downloads]# ftp ftp> ``` -6. To connect to the FTP server type: +6. To connect to the FTP server type: ```bash - ftp> open < server-address> (Obtain the from your instructor) - ……… - + ftp> open < server-address> (Obtain the from your instructor) + ……… 220 localhost.localdomain FTP server (Version wu-2.6.2-5) ready. ……….. ``` -7. Log in as an anonymous user. Type “anonymous” at the prompt: +7. Log in as an anonymous user. Type “*anonymous*” at the prompt: ```bash Name (10.4.51.29:root): anonymous ``` -8. Type in any e-mail address at the password prompt and press enter +8. Type in any *e-mail address* at the password prompt and press ++enter++ ```bash - Password: *************** - + Password: *************** 230 Guest login ok, access restrictions apply. - Remote system type is UNIX. - Using binary mode to transfer files. - ftp> ``` @@ -499,12 +478,12 @@ In this exercise you will learn how to log on anonymously to an FTP server and d !!! Question - What is the output of the binary command and what is binary mode "binary mode"? + What is the output of the binary command and what is the "binary mode"? -10. List the current directories on the ftp server. Type “ls” at the ftp prompt (ftp>): +10. List the current directories on the ftp server. Type `ls` at the *ftp prompt*: ```bash - ftp> ls + ftp> ls 227 Entering Passive Mode (10,0,4,5,16,103). 125 Data connection already open; Transfer starting. 11-23-43 10:23PM images @@ -512,34 +491,30 @@ In this exercise you will learn how to log on anonymously to an FTP server and d 226 Transfer complete. ``` -11. Change directory to the “pub” directory. Type: +11. Change directory to the `pub` directory. Type: ```bash ftp> cd pub ``` -12. Use the “ls” command to list the files and directories in the “pub” directory +12. Use the `ls` command to list the files and directories in the `pub` directory !!! Question How many files and directories are in there now? -13. Download the file called “hello-2.1.1.tar.gz” to your local directory. Type “yes” at the prompt. +13. Download the file called “*hello-2.1.1.tar.gz*” to your local directory. Type “*yes*” at the prompt. ```bash - ftp> mget hello-2.1.1.tar.gz - mget hello-2.1.1.tar.gz? yes - + ftp> mget hello-2.1.1.tar.gz + mget hello-2.1.1.tar.gz? yes 227 Entering Passive Mode (10,0,4,5,16,252). - 125 Data connection already open; Transfer starting. - 226 Transfer complete. - 389363 bytes received in 0.0745 secs (5.1e+03 Kbytes/sec) ``` -14. Log off the FTP server and exit your `ftp` client. Type: +14. Log off the FTP server and exit your *ftp client*. Type: ```bash ftp> bye @@ -547,41 +522,39 @@ In this exercise you will learn how to log on anonymously to an FTP server and d 15. You will be thrown back into your local shell. -16. Ensure you are still in the local machine's “downloads” directory on your local machine. +16. Ensure you are still in the local machine's `downloads` directory on your local machine. !!! question List the files in the downloads folder. -## Exercise 11 - -### Using redirection +### 11. Using redirection -Most of the utilities and commands you use in Linux send their output to the screen. The screen is called the standard output (stdout). Redirection allows you to send the output somewhere else – maybe a file. +Most of the utilities and commands you use in Linux send their output to the screen. The screen is called the standard output (*stdout*). Redirection allows you to send the output somewhere else – maybe a file. -Every program started on a Linux system has three open file descriptors, stdin (0), stdout (1) and stderr (2). You may redirect or pipe to "pipe" them individually. The redirection symbols are “>, < “ +Every program started on a Linux system has three open file descriptors, *stdin* **(0)**, *stdout* **(1)** and *stderr* **(2)**. You may redirect or "*pipe*" them individually. The redirection symbols are ++greater++ and ++less++. -#### To use redirection +#### How to use redirection -1. Ensure you are still in the folder1 directory. +1. Ensure you are still in the `folder1` directory. -2. You will use output redirection to redirect the out of a the ls (list) command to a text file called myredirects: +2. You will use output redirection to redirect the output to an `ls` (*list*) command to a text file called *myredirects*: ```bash - [root@localhost folder1]# ls > myredirects + [root@localhost folder1]# ls > myredirects ``` -3. Examine the contents of the new file (myredirects) created in the folder1 directory. +3. Examine the contents of the new file (*myredirects*) created in the `folder1` directory. ```bash - [root@localhost folder1] # cat myredirects + [root@localhost folder1] # cat myredirects temp_file11 temp_file12 temp_file21 temp_file22 myredirects ``` -4. Now you will redirect the output of the file command into that same file. You want to find out the file type for the temp_file11 in the folder1 directory and send the output to your myredirects file: +4. Now you will redirect the output of the file command into that same file. You want to find out the file type for the *temp_file11* in the `folder1` directory and send the output to your *myredirects* file: ```bash - [root@localhost folder1]# file temp_file11 > myredirects + [root@localhost folder1]# file temp_file11 > myredirects ``` 5. Examine the contents of the myredirects file. @@ -590,51 +563,48 @@ Every program started on a Linux system has three open file descriptors, stdin ( It has changed. What happened? -6. If you want to prevent what happened above from happening you will use the double redirection symbol “>>”. This will append (add) the new output to the file instead of replacing it. Try it: +6. If you want to prevent what happened above from happening you will use the double redirection symbol ++">"+">"++. This will append (*add*) the new output to the file instead of replacing it. Try it: ```bash - [root@localhost folder1]# ls >> myredirects + [root@localhost folder1]# ls >> myredirects ``` -7. Now examine the contents of the file myredirects again using `cat`. +7. Now examine the contents of the file *myredirects* again using `cat`. !!! Question Write down its contents here: -### Using redirection to suppress the output of a command +#### Using redirection to suppress the output of a command You will be using the concepts covered here a lot in Linux, so please pay particular attention to it. It can be a bit tricky. -There will be times when you do not want the user to see the output of a command- perhaps an error message. This will usually be because strange error messages often scare regular users. In this exercise you will send the output of your commands to the null device ( /dev/null/ ). The null device is like a “bit bucket”. Anything you place inside disappears forever. You can also send (or redirect) regular command output to the null device "null device". +There will be times when you do not want the user to see the output of a command - perhaps an error message. This will usually be because strange error messages often scare regular users. In this exercise you will send the output of your commands to the *null device* ( `/dev/null/` ). The *null device* is like a “*bit bucket*”. Anything you place inside disappears forever. You can also send (or redirect) regular command output to the *null device*. Use the guidelines below: -```bash -|Redirector|

    Function

    | -| :- | :- | -|> file|Direct standard output to file| -|< file|Take standard input from file| -|Cmd1 | cmd2|Pipe; take standard out of cmd1 as standard input to cmd2| -|n> file|Direct file descriptor n to file| -|N< file|Set file as file descriptor n| -|>&n|Duplicate standard output to file descriptor n| -|<&n|Duplicate standard input from file descriptor n| -|&>file|Direct standard output and standard error to file| - -``` +| Redirector | Function | +| ------------ | --------------------------------------------------------- | +| > file | Direct standard output to file | +| < file | Take standard input from file | +| Cmd1 \| cmd2 | Pipe; take standard out of cmd1 as standard input to cmd2 | +| n> file | Direct file descriptor n to file | +| N< file | Set file as file descriptor n | +| >&n | Duplicate standard output to file descriptor n | +| <&n | Duplicate standard input from file descriptor n | +| &>file | Direct standard output and standard error to file | -1. Ensure you are still in the folder1 directory. Use the long listing option of the ls command on temp_file11: +1. Ensure you are still in the `folder1` directory. Use the long listing option of the `ls` command on *temp_file11*: ```bash - [root@localhost folder1]# ls –l temp_file11 - -rw-r--r-- 1 root root 0 Jul 26 18:26 temp_file11 + [root@localhost folder1]# ls –l temp_file11 + -rw-r--r-- 1 root root 0 Jul 26 18:26 temp_file11 ``` -2. You will redirect the output of the same command above (ls –l temp_file11) to the null device. +2. You will redirect the output of the same command above (`ls –l temp_file11`) to the null device. ```bash - [root@localhost folder1]# ls –l temp_file11 > /dev/null + [root@localhost folder1]# ls –l temp_file11 > /dev/null ``` You should have no output. @@ -648,17 +618,16 @@ Use the guidelines below: The above is the result of the type of error the `ls` command was programmed to give. -4. Run the same command as the above with an incorrect spelling of the file name and redirect it to /dev/null +4. Run the same command as the above with an incorrect spelling of the file name and redirect it to `/dev/null` ```bash - [root@localhost folder1]# ls -l te_file1 > /dev/null - + [root@localhost folder1]# ls -l te_file1 > /dev/null ls: te_file1: No such file or directory ``` !!! Question - What happened here? How come the output still showed up on the screen (stdout)? + What happened here? How come the output still showed up on the screen (*stdout*)? 5. For various reasons you may want to suppress error messages such as the one above. To do this type: @@ -666,32 +635,28 @@ Use the guidelines below: [root@localhost folder1]# ls –l te_file1 > /dev/null 2>&1 ``` - You will not get any output. - - This time the standard output as well as the standard error is suppressed. + You will not get any output. This time the standard output as well as the standard error is suppressed. The order of redirection is IMPORTANT!! - Redirection is read from left to right on the command line. + Redirection is read from left to right on the command line. The left-most part of the redirection symbol - ++greater++ will send the standard output (*stdout*) to `/dev/null`. Then the right-most part of the redirection - `2>&1` will duplicate the standard error **(2)** to the standard output **(1)**. - The left-most part of the redirection symbol - “>”: will send the standard output (stdout) to /dev/null. Then the right-most part of the redirection - “2>&1 “: will duplicate the standard error (2) to the standard output (1). - - Hence the above command can be read as: redirect stdout(1) to “/dev/null” and then copy stderr (2) to stdout + Hence the above command can be read as: *redirect stdout(1) to “/dev/null” and then copy stderr (2) to stdout* 6. To further demonstrate the importance of the order of redirection; Try: ```bash - [root@localhost folder1]# ls –l tem_file 2>&1 > order.txt + [root@localhost folder1]# ls –l tem_file 2>&1 > order.txt ``` - Use the `cat` command to examine the contents of the file “order.txt” + Use the `cat` command to examine the contents of the file “*order.txt*” - The left-most part – “2>&1” will copy the standard error to the standard output. Then, the right-most part of the above – “ > order.txt” redirects stdout to the file order.txt. + The left-most part – `2>&1` will copy the standard error to the standard output. Then, the right-most part of the above – `> order.txt` redirects *stdout* to the file *order.txt*. 7. Try this variation of the above step: ```bash - [root@localhost folder1]# ls –l hgh_ghz 2> order2.txt > order2.txt + [root@localhost folder1]# ls –l hgh_ghz 2> order2.txt > order2.txt ``` !!! question @@ -701,69 +666,62 @@ Use the guidelines below: 8. To send the standard output and standard error to separate files; Type: ```bash - [root@localhost folder1]# ls –l tep_f > standard_out 2> standard_err + [root@localhost folder1]# ls –l tep_f > standard_out 2> standard_err ``` !!! question Two new files were created. What are the names of the files and what are their contents? -9. You can similarly redirect both stdout and stderr to the same file by using: +9. You can similarly redirect both *stdout* and *stderr* to the same file by using: ```bash - [root@localhost folder1]# ls –l te_fil &> standard_both + [root@localhost folder1]# ls –l te_fil &> standard_both ``` -## Exercise 12 - -### `rm` +### 12. Deleting files with `rm` -The `rm` command is used to delete files or directories. You are going to use `rm` to delete some of the files you created in the earlier exercises. +The `rm` (Remove) command allows you to permanently delete one or more files, directories, and their contents, with no possibility of recovery unless you use external recovery solutions. It is a powerful command but potentially dangerous if used improperly, as it operates irreversibly. For this reason, it is important to use it with caution, always checking the paths and file names before performing the operation. +You are going to use `rm` to delete some of the files you created in the earlier exercises. -#### To use `rm` +#### How to use `rm` -1. While still in the "folder1" directory, delete the file standard_err. Type “y” at the confirmation prompt: +1. While still in the `folder1` directory, delete the file *standard_err*. Type ++"y"++ at the confirmation prompt: ```bash - [root@localhost folder1]# rm standard_err + [root@localhost folder1]# rm standard_err rm: remove `standard_err'? y ``` -2. Delete the “standard_out” file. To prevent being prompted for confirmation before deleting a file use the “–f “ option with the `rm` command: +2. Delete the *standard_out* file. To prevent being prompted for confirmation before deleting a file use the `–f` option with the `rm` command: ```bash - [root@localhost folder1]# rm -f standard_out + [root@localhost folder1]# rm -f standard_out ``` -3. Change back to your home directory (/root) and delete the “folder2” directory. To use `rm` to delete a folder you need to use the “–r” switch: +3. Change back to your home directory (`/root`) and delete the `folder2` directory. To use `rm` to delete a folder you need to use the `–r` switch: ```bash - [root@localhost root]# rm -r folder2 - - rm: descend into directory `folder2'? y - - rm: remove `folder2/temp_file21'? y - - rm: remove `folder2/temp_file22'? y - - rm: remove directory `folder2'? y + [root@localhost root]# rm -r folder2 + rm: descend into directory 'folder2'? y + rm: remove 'folder2/temp_file21'? y + rm: remove 'folder2/temp_file22'? y + rm: remove directory 'folder2'? y ``` !!! Question You were again prompted to confirm the removal of each file in the directory and the directory itself. What option will you use with the `rm –r` command to prevent this? -## Exercise 13 +### 13. Learning `vi` -### Learning `vi` +The `vi` editor is one of the most powerful and widely used text editors available on Linux and Unix-like systems. It is an essential tool for system administrators and developers thanks to its efficiency and versatility. Unlike many modern editors, `vi` operates primarily in text mode, offering quick commands and key combinations that allow you to edit files with extreme precision and speed. -`vi` is a text editor. It can be used to edit all kinds of plain text. It is especially useful for editing programs. +Its learning curve may be steep at first, but once you master the basic features, it becomes an indispensable tool for editing configuration files, scripts, and source code directly from the terminal. `vi` is a big fat monster that can do almost everything - including make your coffee or cocoa!! -Instead of trying to teach you `vi`, this exercise will point you to a tool that can better familiarize you with `vi`. - -Please take the time to go through the online `vi` (more precisely `vim`) tutorial. Just follow the instructions. +Instead of trying to teach you `vi`, this exercise will point you to a tool that can better familiarize you with `vi`. Please take the time to go through the online `vi` (more precisely `vim`) tutorial. Just follow the instructions. #### To learn `vi` @@ -771,15 +729,14 @@ Please take the time to go through the online `vi` (more precisely `vim`) tutori [root@localhost root]# vimtutor -## Exercise 14 - -### Searching for files: (`find` and `locate`) +### 14. Searching files with `find` and `locate` This exercise will discuss two of the most popular utilities used for searching for files and directories on the file system. They are the `find` command and the `locate` commands. #### `find` -The `find` utility has been around for a long time. It recursively scans directories to find files that match a given criterion. +The `find` command allows you to search for files and directories within the filesystem based on a wide range of criteria, such as name, type, size, modification date, permissions, and much more. +Its ability to perform actions on the results found, such as deleting, moving, or processing files, makes it an indispensable tool for system administrators and advanced users. The general syntax for `find` is: @@ -787,61 +744,35 @@ The general syntax for `find` is: find [path] [options] [criterion] [action] ``` -If you do not specify any directory or path, find will search the current directory. If you do not specify a criterion, this is equivalent to "true", thus all files will be found. The `find` utility has many options for doing just about any type of search for a file. Only a few of the options, criteria and actions are listed below. - -```bash -OPTIONS: - --xdev: do not search on directories located on other filesystems; - --mindepth descend at least levels below the specified directory before - -searching for files; - --maxdepth : search for files located at most n levels below the specified directory; - --follow: follow symbolic links if they link to directories. - --daystart: when using tests related to time (see below), take the beginning of current day as a timestamp instead of the default (24 hours before current time). -``` - -```bash -CRITERION - --type : search for a given type of file; can be one of: f (regular file), d (directory), - -l (symbolic link), s (socket), b (block mode file), c (character mode file) or - -p (named pipe); - --name : find files whose names match the given ; - --iname : like -name, but ignore case; - --atime , -amin :find files which have last been accessed days ago (-atime) or minutes ago (-amin). You can also specify + or -, in which case the search will be done for files accessed respectively at most or at least days/minutes ago; - --anewer : find files which have been accessed more recently than file ; - --ctime , -cmin , -cnewer : same as for -atime, -amin and -anewer, but applies to the last time when the contents of the file have been modified; - --regex : same as -name, but pattern is treated as a regular expression; - --iregex : same as -regex, but ignore case. -``` - -```bash -ACTION: - --print: just prints the name of each file on standard output. This is the default action; - --ls: prints on the standard output the equivalent of ls -ilds for each file found; - --exec : execute command on each file found. The command line must end with a ;, which you must escape so that the shell does not interpret it; the file position is marked with {}. - --ok : same as -exec but asks confirmation for each command. -``` - -#### To use `find` +If you do not specify any directory or path, `find` will search the current directory. If you do not specify a criterion, this is equivalent to "*true*", thus all files will be found. The `find` utility has many options for doing just about any type of search for a file. Only a few of the options, criteria and actions are listed below. + +| OPTIONS | DESCRIPTION | +| -- | -- | +| -xdev | do not search on directories located on other filesystems | +| -mindepth `` | descend at least `` levels below the specified directory before searching for files | +| -maxdepth `` | search for files located at most `` levels below the specified directory | +| -follow | follow symbolic links if they link to directories | +| -daystart | when using tests related to time (see below), take the beginning of current day as a timestamp instead of the default (24 hours before current time) | + +| CRITERION | DESCRIPTION | +| -- | -- | +|-type `` | search for a given type of file; `` can be one of: **f** (*regular file*), **d** (*directory*) **l** (*symbolic link*), **s** (*socket*), **b** (*block mode file*), **c** (*character mode file*) or **p** (*named pipe*) | +| -name `` | find files whose names match the given `` | +| -iname `` | like *-name*, but ignore case | +| -atime ``, -amin `` | find files which have last been accessed `` days ago (*-atime*) or `` minutes ago (*-amin*). You can also specify `+` or `-`, in which case the search will be done for files accessed respectively at *most* or at *least* `` days/minutes ago | +| -anewer `` | find files which have been accessed more recently than file `` | +| -ctime ``, -cmin ``, -cnewer `` | same as for *-atime*, *-amin* and *-anewer*, but applies to the last time when the contents of the file have been modified | +| -regex `` | same as *-name*, but pattern is treated as a regular expression | +| -iregex `` | same as *-regex*, but ignore case | + +| ACTION | DESCRIPTION | +| -- | -- | +| -print | just prints the name of each file on standard output. This is the default action | +| -ls | prints on the standard output the equivalent of `ls -ilds` for each file found | +| -exec `` | execute command `` on each file found. The command line `` must end with a `;`, which you must escape so that the shell does not interpret it; the file position is marked with `{}` | +| -ok `` | same as *-exec* but asks confirmation for each command | + +#### How to use `find` 1. Ensure you are in your home directory. @@ -849,36 +780,24 @@ ACTION: ```bash [root@localhost root]# find - - ……….. - ./.bash_profile - ./.bashrc - ./.cshrc - ./.tcshrc - ./.viminfo - ./folder1 - ./folder1/first.txt - ………… ``` - Your output shows the default behavior of find when used without any option. - - It displays all the files and directories (including hidden files) in the working directory recursively. + Your output shows the default behavior of find when used without any option. + It displays all the files and directories (*including hidden files*) in the working directory recursively. -3. Now use `find` to find only the directories in your pwd. Type: +3. Now use `find` to find only the directories in your *pwd*. Type: ```bash - [root@localhost root]# find -type d - . + [root@localhost root]# find -type d ./folder1 ./folder2 ……… @@ -886,12 +805,12 @@ ACTION: !!! Question "Questions" - From the above command “find –type d”; what is the “option”, what is the “path”, what is the “criterion” and finally what is the “action”? + From the above command `find –type d`; what is the “*option*”, what is the “*path*”, what is the “*criterion*” and finally what is the “*action*”? -4. Next you will search for all the files on your system that end with the suffix “.txt”: +4. Next you will search for all the files on your system that end with the suffix “*.txt*”: ```bash - [root@localhost root]# find / -maxdepth 3 -name "*.txt" -print + [root@localhost root]# find / -maxdepth 3 -name "*.txt" -print /root/folder1/first.txt /root/folder1/second.txt /root/folder1/order.txt @@ -900,65 +819,57 @@ ACTION: !!! Question "Questions" - Again from the above command, what is the “option”, what is the “path”, what is the “criterion” and finally what is the “action”? (HINT: The action = “- print”) - - The search will only be performed 3 directories deep from the “/” directory. - - The asterisk used in the command above is one of the “wild card” characters in Linux. + Again from the above command, what is the “*option*”, what is the “*path*”, what is the “*criterion*” and finally what is the “*action*”? (HINT: The action = “*-print*”) - The use of wild-cards in Linux is called “globbing”. + The search will only be performed 3 directories deep from the `/` directory. The asterisk used in the command above is one of the “*wild card*” characters in Linux. + The use of wild-cards in Linux is called “*globbing*”. -5. Use the `find` command to find all files in your “pwd” that are “smaller” than 200 kilobytes in size. Type: +5. Use the `find` command to find all files in your “*pwd*” that are “smaller” than 200 kilobytes in size. Type: ```bash - [root@localhost root]# find . –size -200k + [root@localhost root]# find . –size -200k ``` -6. Use the `find` command to find all the files in your pwd that are “larger” than 10 kilobytes and display their “file type” as well. Type: +6. Use the `find` command to find all the files in your *pwd* that are “larger” than 10 kilobytes and display their “*file type*” as well. Type: ```bash - [root@localhost root]# find . –size +10k –exec file "{ }" ";" + [root@localhost root]# find . –size +10k –exec file "{ }" ";" ``` #### `locate` -The syntax for the `find` command can be rather difficult to use sometimes; and because of its extensive search, it can be slow. An alternative command is `locate`. +The `locate` command allows you to search for files and directories within the system. Unlike other commands such as `find`, which perform a real-time search, `locate` is based on a precompiled database containing the paths of all files on the system, ensuring almost instant results. This database is usually updated periodically using the `updatedb` command, managed by a *cron job*. Thanks to its efficiency, `locate` is particularly useful for quickly finding files or folders without having to manually scan the entire file system. +However, it is important to remember that the results may not always be up to date if the database has not been recently synchronized with the current state of the system. -`locate` searches through a previously created database of all files on the file system. +| Search usage: | +| ------------- | +| locate [-qi] [-d ``] [--database=``] ``... | +| locate [-r ``] [--regexp=``] | -It relies on the `updatedb` program. +| Database usage: | +| --------------- | +| locate [-qv] [-o ``] [--output=``] | +| locate [-e ``] [-f ``] [-l ``] [-c] [-U ``] [-u] [`pattern...`] | -```bash -search usage: - -locate [-qi] [-d ] [--database=] ... - -locate [-r ] [--regexp=] - -database usage: locate [-qv] [-o ] [--output=] - -locate [-e ] [-f ] [-l ] - -[-c] <[-U ] [-u]> - -general usage: locate [-Vh] [--version] [--help] -``` +| General usage: | +| -------------- | +| locate [-Vh] [--version] [--help] | -#### To use `locate` +#### How to use `locate` -1. Change to the folder1 directory and create empty files temp1, temp2 and temp3: +1. Change to the `folder1` directory and create empty files *temp1*, *temp2* and *temp3*: ```bash - [root@localhost root]# cd folder1; touch temp1 temp2 temp3 + [root@localhost root]# cd folder1; touch temp1 temp2 temp3 [root@localhost folder1]# ``` The semicolon (;) used in the command above, allows you to issue multiple commands on a single line!! -2. Use `locate` to search for all the files in your pwd that have the suffix “temp” +2. Use `locate` to search for all the files in your *pwd* that have the suffix “temp” ```bash - [root@localhost folder1]# locate temp* + [root@localhost folder1]# locate temp* /root/folder1/temp_file11 /root/folder1/temp_file12 /root/folder1/temp_file21 @@ -976,7 +887,7 @@ general usage: locate [-Vh] [--version] [--help] 4. Now try the search again. Type: ```bash - [root@localhost folder1]# locate temp + [root@localhost folder1]# locate temp ``` !!! Question From 644f912d98f0ef9201228669cbd599bcb94e854e Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Fri, 15 Aug 2025 09:34:46 -0400 Subject: [PATCH 105/164] New Crowdin updates (#2828) * New translations test_cpu_compat.md (French) * New translations 03-application-servers.md (Ukrainian) * New translations torsocks.md (German) * New translations 05-load-balancer-proxies.md (German) * New translations templates-automation-packer-vsphere.md (Ukrainian) * New translations mirroring_lsyncd.md (Ukrainian) * New translations xfce_installation.md (Ukrainian) * New translations micro.md (Ukrainian) * New translations rockydocs_formatting.md (Ukrainian) * New translations mkdocs_lsyncd.md (Ukrainian) * New translations olivetin.md (Ukrainian) * New translations rsnapshot_backup.md (Ukrainian) * New translations secure_ftp_server_vsftpd.md (Ukrainian) * New translations style_guide.md (Ukrainian) * New translations nfsserver.md (Ukrainian) * New translations 02-basic-email-system.md (Ukrainian) * New translations podman_guide.md (Ukrainian) * New translations transmission_daemon.md (Ukrainian) * New translations nsd_authoritative_dns.md (Ukrainian) * New translations unbound_recursive_dns.md (Ukrainian) * New translations regenerate_initramfs.md (Ukrainian) * New translations chyrp_lite.md (Ukrainian) * New translations tar.md (Ukrainian) * New translations iso_creation.md (Ukrainian) * New translations aqc_bridge_vlan.md (Ukrainian) * New translations mediawiki.md (Ukrainian) * New translations package_dev_start.md (Ukrainian) * New translations apache-sites-enabled.md (Ukrainian) * New translations caddy.md (Ukrainian) --- .../web_services/03-application-servers.uk.md | 2 +- .../05-load-balancer-proxies.de.md | 9 + docs/gemstones/test_cpu_compat.fr.md | 4 +- docs/gemstones/torsocks.de.md | 2 +- docs/guides/automation/olivetin.uk.md | 2 +- .../templates-automation-packer-vsphere.uk.md | 2 +- docs/guides/backup/mirroring_lsyncd.uk.md | 2 +- docs/guides/backup/rsnapshot_backup.uk.md | 2 +- docs/guides/backup/tar.uk.md | 2 +- docs/guides/cms/chyrp_lite.uk.md | 4 +- docs/guides/cms/mediawiki.uk.md | 253 ++++++++++++++++++ docs/guides/containers/podman_guide.uk.md | 38 +-- .../contribute/localdocs/mkdocs_lsyncd.uk.md | 2 +- .../contribute/rockydocs_formatting.uk.md | 6 +- docs/guides/contribute/style_guide.uk.md | 2 +- docs/guides/desktop/xfce_installation.uk.md | 2 +- docs/guides/dns/nsd_authoritative_dns.uk.md | 2 +- docs/guides/dns/unbound_recursive_dns.uk.md | 2 +- docs/guides/editors/micro.uk.md | 6 +- docs/guides/email/02-basic-email-system.uk.md | 2 +- docs/guides/file_sharing/nfsserver.uk.md | 10 +- .../secure_ftp_server_vsftpd.uk.md | 2 +- .../file_sharing/transmission_daemon.uk.md | 2 +- docs/guides/hardware/aqc_bridge_vlan.uk.md | 29 ++ docs/guides/isos/iso_creation.uk.md | 2 +- docs/guides/kernel/regenerate_initramfs.uk.md | 2 +- .../package_dev_start.uk.md | 4 +- docs/guides/web/apache-sites-enabled.uk.md | 8 +- docs/guides/web/caddy.uk.md | 2 +- 29 files changed, 351 insertions(+), 56 deletions(-) create mode 100644 docs/books/web_services/05-load-balancer-proxies.de.md create mode 100644 docs/guides/cms/mediawiki.uk.md create mode 100644 docs/guides/hardware/aqc_bridge_vlan.uk.md diff --git a/docs/books/web_services/03-application-servers.uk.md b/docs/books/web_services/03-application-servers.uk.md index e554f81307..71ad731b28 100644 --- a/docs/books/web_services/03-application-servers.uk.md +++ b/docs/books/web_services/03-application-servers.uk.md @@ -537,7 +537,7 @@ pm.max_requests = 500 Щоб його налаштувати, необхідно попрацювати над: - Розмір пам’яті, виділеної для opcache, відповідно до коефіцієнта звернення -- кількість скриптів PHP для кешу (кількість ключів + максимальна кількість скриптів) +- Кількість скриптів PHP для кешу (кількість ключів + максимальна кількість скриптів) - кількість рядків для кешу Щоб встановити його: diff --git a/docs/books/web_services/05-load-balancer-proxies.de.md b/docs/books/web_services/05-load-balancer-proxies.de.md new file mode 100644 index 0000000000..ce47265b02 --- /dev/null +++ b/docs/books/web_services/05-load-balancer-proxies.de.md @@ -0,0 +1,9 @@ +--- +author: Antoine Le Morvan +contributors: +title: Kapitel 5 – Load Balancing, Caching und Proxy +--- + +# Kapitel 5 – Load Balancing, Caching und Proxy + +In diesem Abschnitt besprechen wir bestehende Lösungen zur Verbesserung der Traffic-Leistung und zur Bewältigung einer ständig steigenden Anzahl von Client-Verbindungen. diff --git a/docs/gemstones/test_cpu_compat.fr.md b/docs/gemstones/test_cpu_compat.fr.md index 2d830c36d0..2d4435f98b 100644 --- a/docs/gemstones/test_cpu_compat.fr.md +++ b/docs/gemstones/test_cpu_compat.fr.md @@ -8,7 +8,7 @@ tags: # Introduction -Depuis la sortie de Rocky Linux 9, certaines installations sur les plateformes x86-64 échouent au démarrage en indiquant le message `kernel panic`. Dans la plupart des cas ==cela est dû à une incompatibilité CPU== avec Rocky Linux 9. Cette procédure permettra de vérifier la compatibilité du processeur avant l’installation. +Depuis la sortie de Rocky Linux 9, certaines installations sur les plateformes x86-64 échouent au démarrage en indiquant le message `kernel panic`. Dans la plupart des cas ==cela est dû à une incompatibilité CPU== avec Rocky Linux 9. Cette procédure permettra de vérifier la compatibilité du processeur avant l’installation. **Mise à jour :** Cette procédure reflète désormais également la compatibilité minimale du processeur pour Rocky Linux 10. ## Test @@ -32,4 +32,4 @@ Depuis la sortie de Rocky Linux 9, certaines installations sur les plateformes x x86-64-v2 (supported, searched) ``` - Cette sortie indique la version minimale x86-64 (v2) requise. Dans ce cas, l'installation peut continuer. S'il n'y a pas d'indication "(supported, searched)" à côté de l'entrée "x86-64-v2", cela signifie que votre processeur n'est **pas** compatible avec Rocky Linux 9.x. Si le test montre que l'installation peut continuer et qu'il répertorie également x86-64-v3 et x86-64-v4 comme "(supported, searched)", votre processeur est bien pris en charge pour les versions 9.x et futures. + Cette sortie indique la version minimale x86-64 (v2) requise. Dans ce cas, l'installation peut continuer. S'il n'y a pas d'indication "(supported, searched)" à côté de l'entrée "x86-64-v2", cela signifie que votre processeur n'est **pas** compatible avec Rocky Linux 9.x. Si le test indique que votre installation peut continuer et qu'il répertorie également x86-64-v3 (requis pour Rocky Linux 10) et x86-64-v4 comme (`supported, searched`), votre CPU sera bien pris en charge pour 9.x et les versions suivantes. diff --git a/docs/gemstones/torsocks.de.md b/docs/gemstones/torsocks.de.md index c8889a945d..5de529f814 100644 --- a/docs/gemstones/torsocks.de.md +++ b/docs/gemstones/torsocks.de.md @@ -1,5 +1,5 @@ --- -title: torsocks - Route Traffic Via Tor/SOCKS5 +title: torsocks - Routen-Traffic Via Tor/SOCKS5 author: Neel Chauhan contributors: Steven Spencer, Ganna Zhyrnova date: 2024-02-25 diff --git a/docs/guides/automation/olivetin.uk.md b/docs/guides/automation/olivetin.uk.md index dd417f7de2..80af7e0787 100644 --- a/docs/guides/automation/olivetin.uk.md +++ b/docs/guides/automation/olivetin.uk.md @@ -31,7 +31,7 @@ tags: Щоб слідувати цьому посібнику, вам знадобиться: -* Комп’ютер під керуванням Rocky Linux +* Машина під керуванням Rocky Linux * Мінімальний комфорт або досвід роботи з командним рядком. * Кореневий доступ або можливість використовувати `sudo`. * Вивчити основи YAML. Це не важко; ви дізнаєтеся про це нижче. diff --git a/docs/guides/automation/templates-automation-packer-vsphere.uk.md b/docs/guides/automation/templates-automation-packer-vsphere.uk.md index 3cb4d01f12..defe9b60c4 100644 --- a/docs/guides/automation/templates-automation-packer-vsphere.uk.md +++ b/docs/guides/automation/templates-automation-packer-vsphere.uk.md @@ -747,7 +747,7 @@ ansible-playbook -i ./inventory/hosts -e '{"comments":"my comments","cluster_na Саме на цьому етапі ви можете запустити остаточну конфігурацію вашої віртуальної машини за допомогою Ansible. Не забудьте змінити пароль адміністратора, захистити SSH, зареєструвати нову віртуальну машину в інструменті моніторингу та в ІТ-інвентаризації тощо. -## Коротко +## Підсумок Як ми бачили, зараз існують повністю автоматизовані рішення DevOps для створення та розгортання віртуальних машин. diff --git a/docs/guides/backup/mirroring_lsyncd.uk.md b/docs/guides/backup/mirroring_lsyncd.uk.md index 11aaf0de75..56db1618ac 100644 --- a/docs/guides/backup/mirroring_lsyncd.uk.md +++ b/docs/guides/backup/mirroring_lsyncd.uk.md @@ -11,7 +11,7 @@ tags: ## Передумови -- Комп’ютер під керуванням Rocky Linux +- Машина під керуванням Rocky Linux - Комфортний рівень зі зміною файлів конфігурації з командного рядка - Знання того, як користуватися редактором командного рядка (тут `vi`, але використовуйте свій улюблений редактор) - Вам потрібен доступ root або привілеї `sudo` (використання `sudo -s` з самого початку є хорошою ідеєю) diff --git a/docs/guides/backup/rsnapshot_backup.uk.md b/docs/guides/backup/rsnapshot_backup.uk.md index 08060c99d0..e5ad1d2c7d 100644 --- a/docs/guides/backup/rsnapshot_backup.uk.md +++ b/docs/guides/backup/rsnapshot_backup.uk.md @@ -56,7 +56,7 @@ _rsnapshot_ — це потужна утиліта резервного копі ``` dnf install rsnapshot Last metadata expiration check: 0:00:16 ago on Mon Feb 22 00:12:45 2021. - Dependencies resolved. + Залежності вирішені. ======================================================================================================================================== Package Architecture Version Repository Size ======================================================================================================================================== diff --git a/docs/guides/backup/tar.uk.md b/docs/guides/backup/tar.uk.md index 877955a600..f97cbb6682 100644 --- a/docs/guides/backup/tar.uk.md +++ b/docs/guides/backup/tar.uk.md @@ -74,7 +74,7 @@ Shell > tar --show-defaults | `-x` | Виписка з архіву. Дуже часто використовується | | `--delete` | Видаляє файли або каталоги з архіву ".tar". Застосовується лише до архівних нестиснутих файлів типу `.tar` | -!!! tip "Порада" +!!! Tip "Порада" ``` Що стосується типів операцій, автор рекомендує залишити префікс «-» для збереження звичок користувача. Звичайно, це не обов'язково. Операційні параметри тут вказують на вашу основну функцію з tar. Іншими словами, вам потрібно вибрати один з перерахованих вище типів. diff --git a/docs/guides/cms/chyrp_lite.uk.md b/docs/guides/cms/chyrp_lite.uk.md index b7276576ed..1e998d1adf 100644 --- a/docs/guides/cms/chyrp_lite.uk.md +++ b/docs/guides/cms/chyrp_lite.uk.md @@ -16,8 +16,8 @@ tags: Нижче наведено мінімальні вимоги для використання цієї процедури: -- Можливість запускати команди від імені користувача root або використовувати `sudo` для підвищення привілеїв. -- Знайомство з редактором командного рядка. Автор використовує `vi` або `vim` тут, але замініть у вашому улюбленому редакторі. +- Можливість запускати команди від імені користувача root або використовувати `sudo` для підвищення привілеїв +- Знайомство з редактором командного рядка. Автор використовує `vi` або `vim` тут, але замініть у вашому улюбленому редакторі ## Встановлення Caddy diff --git a/docs/guides/cms/mediawiki.uk.md b/docs/guides/cms/mediawiki.uk.md new file mode 100644 index 0000000000..6fd28634a1 --- /dev/null +++ b/docs/guides/cms/mediawiki.uk.md @@ -0,0 +1,253 @@ +--- +title: MediaWiki +author: Neel Chauhan +contributors: Steven Spencer +tested_with: 10.0 +tags: + - cms +--- + +## Вступ + +[MediaWiki](https://www.mediawiki.org/wiki/MediaWiki) — це популярний програмний движок з відкритим кодом для вікі-сайтів, який використовується, зокрема, на таких сайтах, як Вікіпедія, Fandom та wikiHow. + +## Передумови та припущення + +Нижче наведено мінімальні вимоги для використання цієї процедури: + +- Можливість запускати команди від імені користувача root або використовувати `sudo` для підвищення привілеїв +- Знайомство з редактором командного рядка. Автор використовує `vi` або `vim` тут, але замініть у вашому улюбленому редакторі + +## Встановлення Apache + +Apache — це веб-сервер, який ви будете використовувати. Встановіть за допомогою: + +```bash +dnf -y install httpd +``` + +Далі відкрийте відповідні порти брандмауера: + +```bash +sudo firewall-cmd --permanent --zone=public --add-service=http +sudo firewall-cmd --permanent --zone=public --add-service=https +sudo firewall-cmd --reload +``` + +## Встановлення PHP + +!!! note + + Якщо ви використовуєте Rocky Linux 8.x або 9.x, замініть «8» або «9» поруч із версією в рядку інсталяції пакета Remi. + +Щоб встановити PHP, спочатку потрібно встановити EPEL (додаткові пакети для Enterprise Linux): + +```bash +dnf -y install epel-release && dnf -y update +``` + +Вам також знадобиться репозиторій Remi. Встановіть його за допомогою: + +```bash +dnf install https://rpms.remirepo.net/enterprise/remi-release-10.rpm +``` + +Потім встановіть PHP і необхідні модулі: + +```bash +dnf install -y dnf install php84-php-fpm php84-php-intl php84-php-mbstring php84-php-apcu php84-php-curl php84-php-mysql php84-php-xml +``` + +Увімкніть PHP за допомогою: + +```bash +systemctl enable --now php84-php-fpm.service +``` + +## Встановлення MariaDB + +Для бази даних вам потрібна MariaDB. Встановіть за допомогою: + +```bash +dnf install mariadb-server +``` + +Далі увімкніть службу `systemd` і запустіть майстер налаштування: + +```bash +systemctl enable --now mariadb +mysql_secure_installation +``` + +Коли буде запитано пароль root, натисніть ++enter++ : + +```bash +Введіть поточний пароль для root (++enter++ для відсутності пароля): +``` + +Відповідь ++«n»++ на аутентифікацію `unix_socket`: + +```bash +Перейти до автентифікації unix_socket [Y/n] n +``` + +Відповідайте ++«Y»++ на зміну пароля root і введіть необхідний пароль root: + +```bash +Change the root password? [Y/n] Y +New password: +Re-enter new password: +``` + +Видаліть анонімних користувачів і забороніть віддалений вхід під обліковим записом `root`: + +```bash +Remove anonymous users? [Y/n] Y +... +Disallow root login remotely? [Y/n] Y +``` + +Видаліть доступ до тестової бази даних і перезавантажте таблиці привілеїв: + +```bash +Remove test database and access to it? [Y/n] Y +... +Reload privilege tables now? [Y/n] Y +``` + +Увійдіть в MariaDB за допомогою: + +```bash +mysql -u root -p +``` + +Введіть пароль root, який ви створили раніше. + +У консолі MariaDB створіть базу даних для MediaWiki: + +```bash +MariaDB [(none)]> create database mediawiki; +``` + +Далі створіть користувача MediaWiki: + +```bash +MariaDB [(none)]> create user 'mediawiki'@'localhost' identified by 'nchauhan11'; +``` + +Надати привілеї в базі даних MediaWiki: + +```bash +grant all privileges on mediawiki.* to 'mediawiki'@'localhost'; +``` + +Нарешті, скиньте привілеї за допомогою: + +```bash +MariaDB [(none)]> flush privileges; +``` + +## Встановлення MediaWiki + +Перейдіть до каталогу `/var/www/` і завантажте MediaWiki: + +```bash +cd /var/www/ +wget https://releases.wikimedia.org/mediawiki/1.44/mediawiki-1.44.0.zip +``` + +Розпакуйте та перемістіть MediaWiki: + +```bash +unzip mediawiki-1.44.0.zip +mv mediawiki-1.44.0/* html/ +``` + +Встановіть правильні дозволи SELinux: + +```bash +chown -R apache:apache /var/www/html +semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html(/.*)?" +restorecon -Rv /var/www/html +``` + +Увімкнути Apache: + +```bash +systemctl enable --now httpd +``` + +Далі відкрийте браузер і перейдіть за адресою `http://your_ip` (замість `your_ip` вкажіть свою IP-адресу): + +![MediaWiki Initial Setup](../images/mediawiki_1.png) + +Виберіть мову та натисніть **Continue**: + +![MediaWiki Language Page](../images/mediawiki_2.png) + +Перевірте, чи правильна конфігурація PHP, прокрутіть вниз і натисніть **Continue**: + +![MediaWiki PHP Checks](../images/mediawiki_3.png) + +Тепер введіть інформацію про базу даних наступним чином: + +- **Хост бази даних**: `localhost` + +- **Назва бази даних (без дефісів)**: `mediawiki` (або база даних, створена на кроці **MariaDB**) + +- **Ім'я користувача бази даних:**: `mediawiki` (або користувач, створений на кроці **MariaDB**) + +- **Пароль бази даних**: пароль, який ви створили на кроці **MariaDB** + +![MediaWiki Database Information](../images/mediawiki_4.png) + +Натисніть **Continue**: + +![MediaWiki Database Access Settings](../images/mediawiki_5.png) + +На сторінці **Встановлення версії MediaWiki** введіть наступне: + +- **Ім'я хоста URL**: URL, який ви хочете + +- **Назва вікі**: Назва вікі, яку ви хочете + +- **Обліковий запис адміністратора**/**Ваше ім'я користувача**: Ім'я користувача адміністратора, яке ви хочете використовувати + +- **Обліковий запис адміністратора**/**Пароль (ще раз)**: пароль адміністратора, який ви хочете використовувати + +- **Обліковий запис адміністратора**/**Адреса електронної пошти**: Адреса електронної пошти адміністратора + +За бажанням ви також можете вибрати **Запитайте мене більше питань**, щоб налаштувати Wiki. Для простоти виберіть **Мені вже нудно, просто встановіть вікі** і натисніть **Продовжити**: + +![MediaWiki Wiki Information](../images/mediawiki_6.png) + +Натисніть **Продовжити**, щоб встановити Wiki: + +![MediaWiki Install Step Part 1](../images/mediawiki_7.png) + +MediaWiki налаштує бази даних. Коли процес завершиться, натисніть **Продовжити**: + +![MediaWiki Install Step Part 2](../images/mediawiki_8.png) + +Ваш браузер завантажить файл `LocalSettings.php`. Ви завантажите це на свій сервер за допомогою `sftp`. + +Як приклад, автор використає свій ноутбук Fedora 42 для завантаження цього файлу. Для цього: + +```bash +sftp root@your_ip +(Enter password) +cd /var/www/html +put LocalSettings.php +``` + +![MediaWiki LocalSettings.php Step](../images/mediawiki_9.png) + +Нарешті, натисніть **увійдіть у свою вікі**: + +![Fresh MediaWiki Wiki](../images/mediawiki_10.png) + +Тепер у вас є свіжа інсталяція MediaWiki. + +## Висновок + +Хоча MediaWiki найбільш відома як платформа для Вікіпедії, вона також є корисною як система управління контентом, де користувачі мають можливість редагувати сторінки. MediaWiki — це хороша альтернатива SharePoint від Microsoft з відкритим кодом. diff --git a/docs/guides/containers/podman_guide.uk.md b/docs/guides/containers/podman_guide.uk.md index b5813bea7f..327e2a6b16 100644 --- a/docs/guides/containers/podman_guide.uk.md +++ b/docs/guides/containers/podman_guide.uk.md @@ -119,7 +119,7 @@ podman run -d -p 8080:80 nextcloud Щоб стежити за виведенням журналу останнього створеного контейнера, використовуйте `podman logs -lf`. `-l` вказує на використання останнього створеного контейнера, тоді як `-f` вказує на відстеження журналів у міру їх створення. Натисніть Ctrl+C, щоб зупинити виведення журналу. ``` -## Запуск контейнерів як служб systemd +## Запуск контейнерів як служб `systemd` ### Використання `quadlet` @@ -388,24 +388,24 @@ Pods — це спосіб групувати контейнери разом. У Podman ви керуєте контейнерами за допомогою підкоманди `podman pod`, подібної до багатьох команд Podman: -| Команда | Опис | -| ------- | ---------------------------------------------------------------------------------------------------------------------- | -| clone | Створює копію існуючого модуля. | -| create | Створює новий пакет. | -| exists | Перевіряє наявність пакета в локальному сховищі. | -| inspect | Відображає інформацію, що описує контейнер. | -| kill | Вбиває основний процес кожного контейнера в одному або кількох контейнерах. | -| logs | Відображає журнали для модуля з одним або кількома контейнерами. | -| pause | Призупиняє один або кілька модулів. | -| prune | Видаляє всі зупинені стручки та їхні контейнери. | -| ps | Роздруковує інформацію про pods. | -| restart | Перезапускає один або кілька модулів. | -| rm | Видаляє одну або кілька зупинених коробок і контейнерів. | -| start | Запускає один або кілька контейнерів. | -| stats | Відображає прямий потік статистики використання ресурсів для контейнерів в одному або кількох пакетах. | -| stop | Зупиняє один або кілька контейнерів. | -| top | Відображає запущені процеси контейнерів у модулі. | -| unpause | Відновлює паузу одного або кількох модулів. | +| Команда | Опис | +| --------- | ---------------------------------------------------------------------------------------------------------------------- | +| clone | Створює копію існуючого модуля. | +| створення | Створює новий пакет. | +| exists | Перевіряє наявність пакета в локальному сховищі. | +| inspect | Відображає інформацію, що описує контейнер. | +| kill | Вбиває основний процес кожного контейнера в одному або кількох контейнерах. | +| logs | Відображає журнали для модуля з одним або кількома контейнерами. | +| pause | Призупиняє один або кілька модулів. | +| prune | Видаляє всі зупинені стручки та їхні контейнери. | +| ps | Роздруковує інформацію про pods. | +| restart | Перезапускає один або кілька модулів. | +| rm | Видаляє одну або кілька зупинених коробок і контейнерів. | +| start | Запускає один або кілька контейнерів. | +| stats | Відображає прямий потік статистики використання ресурсів для контейнерів в одному або кількох пакетах. | +| stop | Зупиняє один або кілька контейнерів. | +| top | Відображає запущені процеси контейнерів у модулі. | +| unpause | Відновлює паузу одного або кількох модулів. | Контейнери, згруповані в pod, можуть отримувати доступ один до одного за допомогою localhost. Це корисно, наприклад, під час налаштування Nextcloud із спеціальною базою даних, наприклад Postgres. Nextcloud може отримати доступ до бази даних, але база даних не обов’язково має бути доступна поза контейнерами. diff --git a/docs/guides/contribute/localdocs/mkdocs_lsyncd.uk.md b/docs/guides/contribute/localdocs/mkdocs_lsyncd.uk.md index 25d2585175..f18d68decd 100644 --- a/docs/guides/contribute/localdocs/mkdocs_lsyncd.uk.md +++ b/docs/guides/contribute/localdocs/mkdocs_lsyncd.uk.md @@ -11,7 +11,7 @@ tags: # Вступ -!!! info +!!! info "примітка" Процедури тут працюватимуть як з Incus, так і з LXD. diff --git a/docs/guides/contribute/rockydocs_formatting.uk.md b/docs/guides/contribute/rockydocs_formatting.uk.md index fa1a5b4b18..263e097f29 100644 --- a/docs/guides/contribute/rockydocs_formatting.uk.md +++ b/docs/guides/contribute/rockydocs_formatting.uk.md @@ -113,7 +113,7 @@ tags: Ось приклади кожного типу застережень і того, як вони виглядатимуть у вашому документі: -!!! note "Примітка" +!!! note "примітка" текст @@ -349,7 +349,7 @@ sudo dnf install the-kitchen-sink Список прийнятих команд клавіатури [у цьому документі](https://facelessuser.github.io/pymdown-extensions/extensions/keys/#key-map-index). -!!! note "Примітка" +!!! note "примітка" Ці комбінації клавіш завжди вводяться в нижньому регістрі, за винятком випадків, коли в лапках використовується спеціальна клавіатурна команда. @@ -425,7 +425,7 @@ or Документація Rocky пропонує кілька елегантних варіантів форматування при поєднанні кількох елементів в одному елементі. Наприклад, попередження з пронумерованим списком: -!!! note "Примітка" +!!! note "примітка" Усе може стати трохи божевільним, коли ви групуєте речі. Як коли: diff --git a/docs/guides/contribute/style_guide.uk.md b/docs/guides/contribute/style_guide.uk.md index 33d2e49d80..05794fdd11 100644 --- a/docs/guides/contribute/style_guide.uk.md +++ b/docs/guides/contribute/style_guide.uk.md @@ -107,7 +107,7 @@ tags: - **Рівень складності.** 1 зірка для легкого, 2 для середнього тощо. - **Час читання.** Щоб визначити це число, розділіть слова у вашому документі на швидкість читання 75 слів на хвилину. -### Застереження +### Попередження У Markdown попередження — це спосіб помістити інформацію у вікно, щоб виділити її. Вони не є обов'язковими для документування, але можуть бути корисним інструментом. Дізнайтеся більше про застереження в нашому [Rocky Formatting doc](rockydocs_formatting.md). diff --git a/docs/guides/desktop/xfce_installation.uk.md b/docs/guides/desktop/xfce_installation.uk.md index db9149a718..542f0df0c8 100644 --- a/docs/guides/desktop/xfce_installation.uk.md +++ b/docs/guides/desktop/xfce_installation.uk.md @@ -74,7 +74,7 @@ title: XFCE Desktop author: Gerard Arthus, Steven Spencer, Emre Camalan contribu 2. **Time & Date** – переконайтеся, що вона відповідає вашому часовому поясу. 3. **Installation Destination**. Вам потрібно буде натиснути цей параметр, навіть якщо це потрібно для прийняття того, що вже є. 4. **Network & Host Name**. Переконайтеся, що тут є те, що ви хочете. Поки мережа ввімкнена, ви завжди можете змінити це пізніше, якщо знадобиться. - 5. **Root Password** – встановіть пароль адміністратора. Не забудьте зберегти це в безпечному місці (менеджер паролів), головним чином, якщо ви не використовуєте його часто. + 5. **Root Password** – встановіть пароль адміністратора. Не забудьте зберегти це в безпечному місці (менеджер паролів). 6. **User Creation** – обов’язково створіть принаймні одного користувача. Якщо ви хочете, щоб користувач мав права адміністратора, не забудьте встановити цей параметр під час створення користувача. 7. **Begin Installation** – після завершення та перевірки натисніть цю опцію. diff --git a/docs/guides/dns/nsd_authoritative_dns.uk.md b/docs/guides/dns/nsd_authoritative_dns.uk.md index 0c9a5f183f..a4323d52da 100644 --- a/docs/guides/dns/nsd_authoritative_dns.uk.md +++ b/docs/guides/dns/nsd_authoritative_dns.uk.md @@ -9,7 +9,7 @@ tags: Альтернативою BIND, [NSD](https://www.nlnetlabs.nl/projects/nsd/about/) (Name Server Daemon) є сучасний авторитетний сервер DNS, який підтримується [NLnet Labs](https:// www.nlnetlabs.nl/). -## Передумови та припущення +## Передумови і Припущення - Сервер під керуванням Rocky Linux - Можливість використання `firewalld` для створення правил брандмауера diff --git a/docs/guides/dns/unbound_recursive_dns.uk.md b/docs/guides/dns/unbound_recursive_dns.uk.md index c1588e91e8..dec0519979 100644 --- a/docs/guides/dns/unbound_recursive_dns.uk.md +++ b/docs/guides/dns/unbound_recursive_dns.uk.md @@ -9,7 +9,7 @@ tags: Альтернативою BIND, [Unbound](https://www.nlnetlabs.nl/projects/unbound/about/) є сучасний перевіряючий, рекурсивний і кешуючий DNS-сервер, який підтримується [NLnet Labs](https://www. nlnetlabs.nl/). -## Передумови та припущення +## Передумови і Припущення - Сервер під керуванням Rocky Linux - Можливість використання `firewalld` для створення правил брандмауера diff --git a/docs/guides/editors/micro.uk.md b/docs/guides/editors/micro.uk.md index 6b2503e8d5..1d7ccb0d96 100644 --- a/docs/guides/editors/micro.uk.md +++ b/docs/guides/editors/micro.uk.md @@ -13,7 +13,7 @@ tags: ## Вступ -*[micro](https://micro-editor.github.io)* – це фантастичний маленький термінальний текстовий редактор, який знаходиться між *nano* та *vim* з точки зору складності. Він має простий, легко впізнаваний робочий процес із кількома приголомшливими функціями: +*[micro](https://micro-editor.github.io)* це чудовий невеликий текстовий редактор на основі терміналу, який знаходиться між *nano* та *vim* з точки зору складності. Він має простий, легко впізнаваний робочий процес із кількома приголомшливими функціями: - Усі ваші звичайні команди ++control+c++, ++control+v++ та ++control+f++ працюють так само, як і в текстовому редакторі на основі настільного комп’ютера. Звичайно, усі прив’язки клавіш можна перев’язати. - Підтримка миші — клацніть і перетягніть, щоб вибрати текст, двічі клацніть, щоб вибрати слова, та тричі клацніть, щоб вибрати рядки. @@ -60,7 +60,7 @@ sudo mv micro /usr/bin/ ### Дійсно простий спосіб -Я створив неймовірно простий сценарій, який просто запускає всі ці команди. Ви можете знайти його в моїх [Github Gists](https://gist.github.com/EzequielBruni/0e29f2c0a63500baf6fe9e8c51c7b02f) і або скопіювати/вставити текст у файл на своєму комп’ютері, або завантажити його за допомогою `wget`. +Я створив неймовірно простий сценарій, який просто запускає всі ці команди. Ви це можете знайти в моєму [Github](https://gist.github.com/EzequielBruni/0e29f2c0a63500baf6fe9e8c51c7b02f), і скопіюйте/вставте текст у файл на вашому комп'ютері або завантажте його за допомогою `wget`. ## Видалення мікро @@ -78,7 +78,7 @@ rm -rf /home/[username]/.config/micro ## Висновок -Якщо вам потрібен повний посібник із використання *micro*, відвідайте [основний веб-сайт](https://micro-editor.github.io) та документацію в [сховищі Github](https://github.com/zyedidia/micro/tree/master/runtime/help). Ви також можете натиснути «Control-G», щоб відкрити основний файл довідки в самій програмі. +Якщо ви хочете отримати повний посібник з використання *micro*, перевірте [головний сайт](https://micro-editor.github.io), та цю документацію [Github](https://github.com/zyedidia/micro/tree/master/runtime/help). Ви також можете натиснути «Control-G», щоб відкрити основний файл довідки в самій програмі. *micro*, ймовірно, не задовольнить потреби тих, хто присвятив себе *vim* або *emacs*, але він ідеально підходить для таких людей, як я. Мені завжди хотілося мати цей старий досвід Sublime Text у терміналі, і тепер у мене є щось *справді* близьке. diff --git a/docs/guides/email/02-basic-email-system.uk.md b/docs/guides/email/02-basic-email-system.uk.md index ede7e2b740..33a2ba2271 100644 --- a/docs/guides/email/02-basic-email-system.uk.md +++ b/docs/guides/email/02-basic-email-system.uk.md @@ -60,7 +60,7 @@ zone "rockylinux.me" IN { }; ``` -!!! question "Питання" +!!! питання **Що таке зона DNS?** Зона DNS — це частина простору імен DNS, розміщена на сервері DNS. Зона DNS містить записи ресурсів, а сервер DNS відповідає на запити щодо записів у цьому просторі імен. DNS-сервер може мати кілька зон DNS. Простіше кажучи, зона DNS аналогічна каталогу книг. diff --git a/docs/guides/file_sharing/nfsserver.uk.md b/docs/guides/file_sharing/nfsserver.uk.md index 144e876175..866ab7d5ef 100644 --- a/docs/guides/file_sharing/nfsserver.uk.md +++ b/docs/guides/file_sharing/nfsserver.uk.md @@ -123,7 +123,7 @@ sudo firewall-cmd --reload exportfs [-a] [-r] [-u share_name] [-v] ``` -| Опції | Опис | +| Параметри | Опис | | --------------- | ------------------------------------------------- | | `-a` | Вмикає спільний доступ до NFS | | `-r` | Застосовує спільні ресурси з файлу `/etc/exports` | @@ -138,10 +138,10 @@ exportfs [-a] [-r] [-u share_name] [-v] showmount [-a] [-e] [host] ``` -| Опції | Опис | -| ----- | -------------------------------------------------- | -| `-e` | Відображає спільні ресурси на призначеному сервері | -| `-a` | Відображає всі поточні спільні ресурси на сервері | +| Параметри | Опис | +| --------- | -------------------------------------------------- | +| `-e` | Відображає спільні ресурси на призначеному сервері | +| `-a` | Відображає всі поточні спільні ресурси на сервері | Ця команда також визначає, чи може робоча станція клієнта монтувати спільні ресурси. diff --git a/docs/guides/file_sharing/secure_ftp_server_vsftpd.uk.md b/docs/guides/file_sharing/secure_ftp_server_vsftpd.uk.md index d3e96c219d..8b396f8115 100644 --- a/docs/guides/file_sharing/secure_ftp_server_vsftpd.uk.md +++ b/docs/guides/file_sharing/secure_ftp_server_vsftpd.uk.md @@ -200,7 +200,7 @@ cd /etc/vsftpd vi vusers.txt ``` -Користувач і пароль розділені рядками, введіть користувача, натисніть ++enter++ і введіть пароль. Продовжуйте, доки не додасте всіх користувачів, яким наразі потрібно надати доступ до системи. Приклад: +Користувач і пароль розділені рядками, введіть користувача, натисніть ++enter++ і введіть пароль. Продовжуйте, доки не додасте всіх користувачів, яким наразі потрібно надати доступ до системи. Приклади: ```bash user_name_a diff --git a/docs/guides/file_sharing/transmission_daemon.uk.md b/docs/guides/file_sharing/transmission_daemon.uk.md index 5e23b218f6..89c60d7ba8 100644 --- a/docs/guides/file_sharing/transmission_daemon.uk.md +++ b/docs/guides/file_sharing/transmission_daemon.uk.md @@ -15,7 +15,7 @@ Transmission — це популярний клієнт BitTorrent із відк У сучасному світі, орієнтованому на мобільні пристрої, доцільніше запускати Transmission як безголовий сервер, ніж безпосередньо на ноутбуці чи настільному комп’ютері. Таким чином, ви можете завантажувати файли 24 години на добу, 7 днів на тиждень, у той час як акумулятор мобільного пристрою не витрачається під час завантаження. -## Встановлення +## Інсталяція Щоб встановити Transmission, спочатку потрібно встановити EPEL: diff --git a/docs/guides/hardware/aqc_bridge_vlan.uk.md b/docs/guides/hardware/aqc_bridge_vlan.uk.md new file mode 100644 index 0000000000..2baaa1c4ab --- /dev/null +++ b/docs/guides/hardware/aqc_bridge_vlan.uk.md @@ -0,0 +1,29 @@ +--- +title: Увімкнення пропускання VLAN на мережевих картах Marvell серії AQC +author: Neel Chauhan +contributors: Steven Spencer +tested_with: 9.6 +tags: + - hardware +--- + +## Вступ + +Автор використовує мережеву карту (NIC) на базі Marvell AQC107 у своєму домашньому сервері, на якому встановлено віртуальну машину, що використовується для віртуалізованого брандмауера. На жаль, стандартний драйвер Rocky Linux Marvell AQC видаляє VLAN на інтерфейсах моста. Це сталося з віртуальною машиною OPNsense автора. На щастя, це можна виправити. + +## Передумови та припущення + +Нижче наведено мінімальні вимоги для використання цієї процедури: + +- Сервер Rocky Linux з мережевою картою Marvell серії AQC +- Використовуйте NetworkManager для налаштування мережевих підключень + +## Вимкнення фільтрації VLAN + +Ви можете вимкнути фільтрування VLAN за допомогою однієї команди: + + nmcli con modify enp1s0 ethtool.feature-rx-vlan-filter off + +Замініть `enp1s0` на назву вашої мережевої карти на базі AQC. + +Нарешті, вам потрібно буде перезавантажити систему. diff --git a/docs/guides/isos/iso_creation.uk.md b/docs/guides/isos/iso_creation.uk.md index abdc35cb9b..5b532bad83 100644 --- a/docs/guides/isos/iso_creation.uk.md +++ b/docs/guides/isos/iso_creation.uk.md @@ -5,7 +5,7 @@ contributors: Steven Spencer, Ganna Zhyrnova tested with: 9.5 tags: - create - - custom "Власний заголовок" + - custom - ISO --- diff --git a/docs/guides/kernel/regenerate_initramfs.uk.md b/docs/guides/kernel/regenerate_initramfs.uk.md index a2544e7271..6fef7d29fb 100644 --- a/docs/guides/kernel/regenerate_initramfs.uk.md +++ b/docs/guides/kernel/regenerate_initramfs.uk.md @@ -4,7 +4,7 @@ author: Neel Chauhan contributors: Steven Spencer tested_with: 9.4 tags: - - обладнання + - hardware --- ## Вступ diff --git a/docs/guides/package_management/package_dev_start.uk.md b/docs/guides/package_management/package_dev_start.uk.md index 345c1d0dc5..ee71d4bc1b 100644 --- a/docs/guides/package_management/package_dev_start.uk.md +++ b/docs/guides/package_management/package_dev_start.uk.md @@ -89,11 +89,11 @@ rockyget sed └── sed.spec ``` -!!! tip "Порада" +!!! Tip "Порада" Коли ви отримаєте вихідні коди, можливо, буде гарний час переглянути файл SPECs (`~rocky/rpms/sed/SPECS/specs.spec`), щоб знайти потенційні можливості дебрендування в даному пакеті. Дебрендінг може включати заміну зображень/логотипів і так далі. -!!! tip "Порада" +!!! Tip "Порада" Якщо ви шукаєте інші пакети Rocky для створення та експериментів, ви можете переглянути список пакетів, які наразі не працюють у автоматизованому середовищі збирання Rocky [тут](https://kojidev.rockylinux.org/koji/builds?state =3&order=-build_id) diff --git a/docs/guides/web/apache-sites-enabled.uk.md b/docs/guides/web/apache-sites-enabled.uk.md index 197c99f7a6..dcb5e4aa73 100644 --- a/docs/guides/web/apache-sites-enabled.uk.md +++ b/docs/guides/web/apache-sites-enabled.uk.md @@ -197,7 +197,7 @@ cp /root/com.wiki.www.crt /var/www/sub-domains/your-server-hostname/ssl/ssl.crt/ Далі вам потрібно визначити частину `https` файлу конфігурації: -!!! info +!!! info "Інформація" Починаючи з Apache 2.4.8, директива `SSLCertificateChainFile` застаріла. Розширення директиви `SSLCertificateFile` включає сертифікат CA постачальника. @@ -207,7 +207,7 @@ cp /root/com.wiki.www.crt /var/www/sub-domains/your-server-hostname/ssl/ssl.crt/ ServerAdmin username@rockylinux.org Redirect / https://your-server-hostname/ - + ServerName your-server-hostname ServerAdmin username@rockylinux.org DocumentRoot /var/www/sub-domains/your-server-hostname/html @@ -240,6 +240,10 @@ cp /root/com.wiki.www.crt /var/www/sub-domains/your-server-hostname/ssl/ssl.crt/ ``` +!!! warning "Примітка щодо наборів шифрів" + + Цей документ був спочатку написаний для Rocky Linux 8. З того часу **багато що** змінилося. По-перше, ви можете повністю виключити рядки `SSLHonorCipherOrder on` і `SSLCipherSuite` і дозволити серверу вибрати їх за замовчуванням. Якщо ви підтримуєте оновлений сервер (іншими словами, ви регулярно виконуєте команду `dnf upgrade`), то це повинно забезпечити безпеку та оновлення наборів шифрів без окремого втручання в конфігурацію. Таким чином, ви уникнете використання застарілих або небезпечних наборів шифрів у вашій конфігурації. Якщо з якихось причин вам **необхідно** змінити ці параметри у вашій конфігурації, ретельно вивчіть свої записи. + Отже, розбиваючи цю конфігурацію далі, після звичайних частин конфігурації та вниз до розділу SSL/TLS: * SSLEngine on - каже використовувати SSL/TLS diff --git a/docs/guides/web/caddy.uk.md b/docs/guides/web/caddy.uk.md index 26aef3e8b7..2cb82c7c7a 100644 --- a/docs/guides/web/caddy.uk.md +++ b/docs/guides/web/caddy.uk.md @@ -154,7 +154,7 @@ systemctl enable --now caddy Як згадувалося раніше, Caddy підтримує підтримку FastCGI для PHP. Хороша новина полягає в тому, що, на відміну від Apache і Nginx, Caddy автоматично обробляє розширення файлів PHP. -Щоб установити PHP, спочатку додайте репозиторій Remi (примітка: якщо ви використовуєте Rocky Linux 8.x, замініть 8 поруч із «release-» нижче): +Щоб установити PHP, спочатку додайте репозиторій Remi (примітка: якщо ви використовуєте Rocky Linux 8.x або 10.х, замініть 8 або 10 поруч із «release-» нижче): ```bash dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm From 9249a117ae2a609b9f486aac87f6d4d8f0d459e2 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Sat, 16 Aug 2025 09:18:09 -0400 Subject: [PATCH 106/164] New Crowdin updates (#2830) * New translations php.md (Ukrainian) * New translations tor_onion_service.md (Ukrainian) --- docs/guides/web/php.uk.md | 12 ++++++------ docs/guides/web/tor_onion_service.uk.md | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/guides/web/php.uk.md b/docs/guides/web/php.uk.md index c82a3434f9..4aa387ed26 100644 --- a/docs/guides/web/php.uk.md +++ b/docs/guides/web/php.uk.md @@ -52,9 +52,9 @@ Rocky Linux, як і його вихідна версія, пропонує ба ``` - Репозиторій Remi пропонує новіші версії PHP, ніж репозиторій Appstream, включаючи версії 8.2 і 8.3. + Репозиторій Remi пропонує новіші версії PHP, ніж репозиторій Appstream, включаючи версії 8.3 і 8.4. - Щоб установити репозиторій Remi, виконайте таку команду: + Щоб встановити репозиторій Remi, виконайте наступну команду (примітка: якщо ви використовуєте Rocky Linux 8.x або 10.x, замість «release-» нижче вкажіть 8 або 10): ```bash sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm @@ -68,10 +68,10 @@ Rocky Linux, як і його вихідна версія, пропонує ба ``` - Тепер ви можете активувати новіший модуль (PHP 8.3), ввівши таку команду: + Тепер ви можете активувати новіший модуль (PHP 8.4), ввівши таку команду: ```bash - sudo dnf module enable php:remi-8.3 + sudo dnf module enable php:remi-8.4 ``` === "8.9 Список модулів PHP" @@ -159,7 +159,7 @@ Rocky Linux, як і його вихідна версія, пропонує ба Running transaction test Transaction test succeeded. - Complete! + Завершено! ``` === "8.9 встановлення PHP" @@ -228,7 +228,7 @@ phpinfo(); Використовуйте веб-браузер, щоб перевірити, чи сервер працює належним чином, перейшовши на сторінку [http://your-server-ip/info.php ](http://your-server-ip/info.php). -!!! Warning "Важливо" +!!! Warning "Увага" Не залишайте файл info.php на своєму сервері! diff --git a/docs/guides/web/tor_onion_service.uk.md b/docs/guides/web/tor_onion_service.uk.md index a3638a7280..9d5ffa819b 100644 --- a/docs/guides/web/tor_onion_service.uk.md +++ b/docs/guides/web/tor_onion_service.uk.md @@ -21,8 +21,8 @@ tags: Нижче наведено мінімальні вимоги для використання цієї процедури: -- Можливість запускати команди від імені користувача root або використовувати `sudo` для підвищення привілеїв. -- Знайомство з редактором командного рядка. Автор використовує `vi` або `vim` тут, але замініть у вашому улюбленому редакторі. +- Можливість запускати команди від імені користувача root або використовувати `sudo` для підвищення привілеїв +- Знайомство з редактором командного рядка. Автор використовує `vi` або `vim` тут, але замініть у вашому улюбленому редакторі - Веб-сервер, що працює на локальному хості або іншому порту TCP/IP ## Встановлення Tor From bdf0df7c6e7a0a0682d41d58e0b42ef56683a5f5 Mon Sep 17 00:00:00 2001 From: Ganna Zhyrnova <112796922+gannazhyrnova@users.noreply.github.com> Date: Mon, 18 Aug 2025 16:14:18 +0300 Subject: [PATCH 107/164] lab3-system_utilities.md (#2833) minor changes --- .../lab3-system_utilities.md | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/labs/systems_administration_I/lab3-system_utilities.md b/docs/labs/systems_administration_I/lab3-system_utilities.md index 13a3e93715..8312aa6066 100644 --- a/docs/labs/systems_administration_I/lab3-system_utilities.md +++ b/docs/labs/systems_administration_I/lab3-system_utilities.md @@ -585,14 +585,14 @@ Use the guidelines below: | Redirector | Function | | ------------ | --------------------------------------------------------- | -| > file | Direct standard output to file | -| < file | Take standard input from file | -| Cmd1 \| cmd2 | Pipe; take standard out of cmd1 as standard input to cmd2 | -| n> file | Direct file descriptor n to file | -| N< file | Set file as file descriptor n | -| >&n | Duplicate standard output to file descriptor n | -| <&n | Duplicate standard input from file descriptor n | -| &>file | Direct standard output and standard error to file | +| > file | Directs standard output to file | +| < file | Takes standard input from file | +| Cmd1 \| cmd2 | Pipe; takes standard out of cmd1 as standard input to cmd2 | +| n> file | Directs file descriptor n to file | +| N< file | Sets file as file descriptor n | +| >&n | Duplicates standard output to file descriptor n | +| <&n | Duplicates standard input from file descriptor n | +| &>file | Directs standard output and standard error to file | 1. Ensure you are still in the `folder1` directory. Use the long listing option of the `ls` command on *temp_file11*: @@ -748,28 +748,28 @@ If you do not specify any directory or path, `find` will search the current dire | OPTIONS | DESCRIPTION | | -- | -- | -| -xdev | do not search on directories located on other filesystems | -| -mindepth `` | descend at least `` levels below the specified directory before searching for files | -| -maxdepth `` | search for files located at most `` levels below the specified directory | -| -follow | follow symbolic links if they link to directories | -| -daystart | when using tests related to time (see below), take the beginning of current day as a timestamp instead of the default (24 hours before current time) | +| -xdev | does not search on directories located on other filesystems | +| -mindepth `` | descends at least `` levels below the specified directory before searching for files | +| -maxdepth `` | searches for files located at most `` levels below the specified directory | +| -follow | follows symbolic links if they link to directories | +| -daystart | when using tests related to time (see below), it takes the beginning of the current day as a timestamp instead of the default (24 hours before the current time) | | CRITERION | DESCRIPTION | | -- | -- | -|-type `` | search for a given type of file; `` can be one of: **f** (*regular file*), **d** (*directory*) **l** (*symbolic link*), **s** (*socket*), **b** (*block mode file*), **c** (*character mode file*) or **p** (*named pipe*) | -| -name `` | find files whose names match the given `` | -| -iname `` | like *-name*, but ignore case | -| -atime ``, -amin `` | find files which have last been accessed `` days ago (*-atime*) or `` minutes ago (*-amin*). You can also specify `+` or `-`, in which case the search will be done for files accessed respectively at *most* or at *least* `` days/minutes ago | -| -anewer `` | find files which have been accessed more recently than file `` | +|-type `` | searches for a given type of file; `` can be one of: **f** (*regular file*), **d** (*directory*) **l** (*symbolic link*), **s** (*socket*), **b** (*block mode file*), **c** (*character mode file*) or **p** (*named pipe*) | +| -name `` | finds files whose names match the given `` | +| -iname `` | like *-name*, but ignores case | +| -atime ``, -amin `` | finds files which have last been accessed `` days ago (*-atime*) or `` minutes ago (*-amin*). You can also specify `+` or `-`, in which case the search will be done for files accessed respectively at *most* or at *least* `` days/minutes ago | +| -anewer `` | finds files which have been accessed more recently than file `` | | -ctime ``, -cmin ``, -cnewer `` | same as for *-atime*, *-amin* and *-anewer*, but applies to the last time when the contents of the file have been modified | | -regex `` | same as *-name*, but pattern is treated as a regular expression | -| -iregex `` | same as *-regex*, but ignore case | +| -iregex `` | same as *-regex*, but ignores case | | ACTION | DESCRIPTION | | -- | -- | | -print | just prints the name of each file on standard output. This is the default action | | -ls | prints on the standard output the equivalent of `ls -ilds` for each file found | -| -exec `` | execute command `` on each file found. The command line `` must end with a `;`, which you must escape so that the shell does not interpret it; the file position is marked with `{}` | +| -exec `` | executes command `` on each file found. The command line `` must end with a `;`, which you must escape so that the shell does not interpret it; the file position is marked with `{}` | | -ok `` | same as *-exec* but asks confirmation for each command | #### How to use `find` From f1154756e3add2d536a01ab6ff761ed8a4974495 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 18 Aug 2025 09:18:27 -0400 Subject: [PATCH 108/164] New Crowdin updates (#2831) * New translations learning_selinux.md (Ukrainian) * New translations vbox-rocky.md (Ukrainian) * New translations firewalld.md (Ukrainian) * New translations firewalld-beginners.md (Ukrainian) * New translations dnf_automatic.md (Ukrainian) * New translations 8_6_installation.md (Ukrainian) * New translations tailscale_vpn.md (Ukrainian) * New translations kernel_panic.md (Ukrainian) * New translations ssh_ca_key_signing.md (Ukrainian) * New translations wireguard_vpn.md (Ukrainian) * New translations openvpn.md (Ukrainian) * New translations freeradius_radius_server.md (Ukrainian) * New translations 9_6_installation.md (Ukrainian) * New translations sed_search_replace.md (German) * New translations 02_github_web_edit_pr_title.md (German) * New translations migrate2rocky.md (Ukrainian) * New translations custom-linux-kernel.md (Ukrainian) * New translations systemd_hardening.md (Ukrainian) * New translations lab4-certificate-authority.md (Ukrainian) * New translations lab0-readme.md (Ukrainian) * New translations sed_search_replace.md (German) * New translations gemstone_template.md (German) * New translations mtr.md (German) * New translations nmtui.md (German) * New translations perl_search_replace.md (German) * New translations nmcli.md (German) * New translations feature_branch_workflow.md (German) * New translations lab8-iptables.md (Ukrainian) * New translations lab3-auditing_the_system.md (Ukrainian) * New translations lab5-nfs.md (Ukrainian) * New translations lab8-samba.md (Ukrainian) * New translations lab9-bootstrapping-kubernetes-workers.md (Ukrainian) * New translations lab9-cryptography.md (Ukrainian) * New translations rdp-server.md (German) * New translations 04-advanced-commands.md (German) * New translations 8_8.md (Ukrainian) * New translations lab6-user_and_group_management.md (Ukrainian) * New translations lab6-the_file_system.md (Ukrainian) * New translations lab7-the_linux_kernel.md (Ukrainian) * New translations lab5-networking.md (Ukrainian) * New translations 9_3.md (Ukrainian) * New translations 8_9.md (Ukrainian) * New translations 8_10.md (Ukrainian) --- .../admin_guide/04-advanced-commands.de.md | 2 +- docs/desktop/gnome/rdp-server.de.md | 2 +- docs/gemstones/gemstone_template.de.md | 49 +++++++++ .../git/02_github_web_edit_pr_title.de.md | 44 +++++++++ .../git/feature_branch_workflow.de.md | 99 +++++++++++++++++++ docs/gemstones/network/mtr.de.md | 2 +- docs/gemstones/network/nmcli.de.md | 33 +++++++ docs/gemstones/network/nmtui.de.md | 2 +- docs/gemstones/perl_search_replace.de.md | 4 +- docs/gemstones/sed_search_replace.de.md | 75 ++++++++++++++ docs/guides/8_6_installation.uk.md | 4 +- docs/guides/9_6_installation.uk.md | 12 +-- docs/guides/custom-linux-kernel.uk.md | 58 +++++------ docs/guides/migrate2rocky.uk.md | 2 +- docs/guides/security/dnf_automatic.uk.md | 2 +- .../guides/security/firewalld-beginners.uk.md | 18 +++- docs/guides/security/firewalld.uk.md | 2 +- .../security/freeradius_radius_server.uk.md | 2 +- docs/guides/security/learning_selinux.uk.md | 18 ++-- docs/guides/security/openvpn.uk.md | 2 +- docs/guides/security/ssh_ca_key_signing.uk.md | 2 +- docs/guides/security/systemd_hardening.uk.md | 2 +- docs/guides/security/tailscale_vpn.uk.md | 4 +- docs/guides/security/wireguard_vpn.uk.md | 2 +- .../guides/troubleshooting/kernel_panic.uk.md | 2 +- docs/guides/virtualization/vbox-rocky.uk.md | 2 +- .../kubernetes-the-hard-way/lab0-README.uk.md | 2 +- .../lab4-certificate-authority.uk.md | 4 +- ...ab9-bootstrapping-kubernetes-workers.uk.md | 2 +- docs/labs/networking/lab5-nfs.uk.md | 6 +- docs/labs/networking/lab8-samba.uk.md | 8 +- .../security/lab3-auditing_the_system.uk.md | 2 +- docs/labs/security/lab8-iptables.uk.md | 2 +- docs/labs/security/lab9-cryptography.uk.md | 38 ++++--- .../lab5-networking.uk.md | 2 +- .../lab6-user_and_group_management.uk.md | 2 +- .../lab6-the_file_system.uk.md | 30 +++--- .../lab7-the_linux_kernel.uk.md | 8 +- docs/release_notes/8_10.uk.md | 6 +- docs/release_notes/8_8.uk.md | 2 +- docs/release_notes/8_9.uk.md | 6 +- docs/release_notes/9_3.uk.md | 2 +- 42 files changed, 444 insertions(+), 124 deletions(-) create mode 100644 docs/gemstones/gemstone_template.de.md create mode 100644 docs/gemstones/git/02_github_web_edit_pr_title.de.md create mode 100644 docs/gemstones/git/feature_branch_workflow.de.md create mode 100644 docs/gemstones/network/nmcli.de.md create mode 100644 docs/gemstones/sed_search_replace.de.md diff --git a/docs/books/admin_guide/04-advanced-commands.de.md b/docs/books/admin_guide/04-advanced-commands.de.md index d81891992a..66ee410f97 100644 --- a/docs/books/admin_guide/04-advanced-commands.de.md +++ b/docs/books/admin_guide/04-advanced-commands.de.md @@ -384,7 +384,7 @@ Optionen: | `-b` oder `--backup[=suffix]` | ein Backup der Ziel-Datei erstellen. | | `-d`     | Argumente als Directory-Namen behandeln               | | `-D`     | Erstellen aller Hauptkomponenten, bevor QUELLE nach ZIEL kopiert wird | -| `-g` und `-o`     | Eigentümer-Eigenschaft setzen.               | +| `-g` und `-o`     | setzt Eigentümer-Eigenschaft               | | `-m`     | Berechtigungen setzen               | | `-p`     | Datum und Uhrzeit der ursprünglichen Dateien behalten           | | `-t` | kopiert alle Quellargumente in den Ordner | diff --git a/docs/desktop/gnome/rdp-server.de.md b/docs/desktop/gnome/rdp-server.de.md index 53210701b7..8704e0ec8b 100644 --- a/docs/desktop/gnome/rdp-server.de.md +++ b/docs/desktop/gnome/rdp-server.de.md @@ -80,7 +80,7 @@ sudo firewall-cmd --reload Für Anfänger: Diese Befehle öffnen den RDP-Port in Ihrer Firewall, sodass Sie eingehende RDP-Verbindungen akzeptieren können. Starten Sie dann die Firewall neu, um die Änderungen zu übernehmen. Wenn Sie möchten, können Sie Ihren PC sicherheitshalber neu starten. -Wenn Sie keinen Neustart durchführen möchten, sollten Sie sich abmelden. RDP verwendet aus Sicherheitsgründen die Anmeldeinformationen Ihres Benutzerkontos. Eine Remote-Anmeldung ist nicht möglich, wenn Sie bereits lokal bei Ihrem Desktop angemeldet sind. Zumindest nicht mit gleichen Benutzerkonto. +Sie sollten sich abmelden, wenn Sie keinen Neustart durchführen möchten. RDP verwendet aus Sicherheitsgründen die Anmeldeinformationen Ihres Benutzerkontos. Eine Remote-Anmeldung ist nicht möglich, wenn Sie bereits lokal bei Ihrem Desktop angemeldet sind. Zumindest nicht mit gleichen Benutzerkonto. !!! info "Info" diff --git a/docs/gemstones/gemstone_template.de.md b/docs/gemstones/gemstone_template.de.md new file mode 100644 index 0000000000..18c2ffc79a --- /dev/null +++ b/docs/gemstones/gemstone_template.de.md @@ -0,0 +1,49 @@ +--- +title: Einfache Vorlage für ein Gemstone +author: Name des Autors +contributors: [ Durch Kommas getrennte Liste der Mitwirkenden ] +tags: + - Liste + - Of + - Relevant + - Tags +--- + +## Einleitung + +Ein kurzer Überblick über das Thema. Geben Sie die Bedeutung und den Zweck des Gemstone an. + +## Problembeschreibung + +Definieren Sie das Problem oder die Herausforderung, mit der Sie sich befassen. + +## Voraussetzungen + +Liste: + +- Notwendiges Grundwissen +- Benötigte Tools oder Software + +## Prozedur + +Skizzieren Sie die Prozedur bzw. die Lösung mit nummerierten Schritten: + +1. **Erste Etappe**: + + Anleitungen und Kommandobeispiele. + + ```bash + Befehl oder Codeausschnitt + ``` + +2. **Zweite Etappe**: + + Fahren Sie mit den detaillierten Anweisungen fort. + +## Zusätzliche Informationen (optional) + +Fügen Sie Tipps, alternative Methoden oder Erkenntnisse hinzu. + +## Zusammenfassung + +Fassen Sie das Ergebnis zusammen und betonen Sie den Wert des Gemstone. diff --git a/docs/gemstones/git/02_github_web_edit_pr_title.de.md b/docs/gemstones/git/02_github_web_edit_pr_title.de.md new file mode 100644 index 0000000000..cf63d1b7a3 --- /dev/null +++ b/docs/gemstones/git/02_github_web_edit_pr_title.de.md @@ -0,0 +1,44 @@ +--- +title: Bearbeiten oder Ändern des Titels eines vorhandenen Pull Request über github.com +author: Wale Soyinka +contributors: Ganna Zhyrnova +tags: + - GitHub + - Pull-Request + - Dokumentation +--- + +## Einleitung + +Diese Anleitung zeigt Ihnen, wie Sie den Titel eines vorhandenen Pull Requests (PR) in einem GitHub-Repository mithilfe der GitHub-Weboberfläche bearbeiten oder ändern. + +## Problembeschreibung + +Manchmal kann es erforderlich sein, den Titel eines PR nach seiner Erstellung zu ändern, um die aktuellen Änderungen oder Diskussionen besser widerzuspiegeln. + +## Voraussetzungen + +- Ein vorhandener GitHub-Pull-Request. +- Zugriff auf die GitHub-Weboberfläche oder CLI mit den erforderlichen Berechtigungen. + +## Prozedur + +### Verwendung der GitHub-Weboberfläche + +1. **Navigieren Sie zum Pull Request**: + - Gehen Sie zum Repository, in dem sich der PR befindet. + - Klicken Sie auf `Pull Requests` und wählen Sie den PR aus, den Sie bearbeiten möchten. + +2. **PR-Titel Editieren**: + - Klicken Sie auf den Titel der PR. + - Ein editierbares Textfeld wird angezeigt. + - Passen Sie den Titel an, drücken Sie ++enter++ oder klicken Sie außerhalb des Textfelds, um die Änderungen zu speichern. + +## Zusätzliche Informationen (optional) + +- Das Bearbeiten eines PR-Titels hat keine Auswirkungen auf den Diskussionsthread oder Codeänderungen. +- Es gehört zum guten Ton, Mitwirkende zu informieren, wenn an einem PR-Titel wesentliche Änderungen vorgenommen werden. + +## Zusammenfassung + +Wenn Sie diese Schritte befolgen, können Sie den Titel eines vorhandenen `Pull Request` in einem GitHub-Repository ganz einfach über die Weboberfläche ändern. diff --git a/docs/gemstones/git/feature_branch_workflow.de.md b/docs/gemstones/git/feature_branch_workflow.de.md new file mode 100644 index 0000000000..2fe27fb0cf --- /dev/null +++ b/docs/gemstones/git/feature_branch_workflow.de.md @@ -0,0 +1,99 @@ +--- +title: Feature Branch Workflow in Git +author: Wale Soyinka +contributors: Ganna Zhyrnova +tags: + - git + - Feature Branch Workflow + - GitHub + - gh + - git fetch + - git add + - git pull + - git checkout +--- + +## Feature Branch Workflow + +Bei diesem beliebten Git-Workflow werden für jede neue Funktion oder Korrektur direkt im Haupt-Repository neue Zweige erstellt. +Es wird normalerweise in Projekten eingesetzt, bei denen Mitwirkende direkten Push-Zugriff auf das Repository haben. + +Dieses Gemstone beschreibt den Prozess zum Einrichten eines lokalen Repositorys, um mithilfe des Git Feature Branch Workflow am Projekt `rocky-linux/documentation` zu arbeiten und dazu beizutragen. + +Der Benutzer `Rockstar` hat dieses Repository geforkt und wir werden `https://github.com/rockstar/documentation` als Ursprung verwenden. + +## Voraussetzungen + +- Ein GitHub-Konto und ein Fork des Projekts (z. B. `https://github.com/rockstar/documentation`). +- `git` und `GitHub CLI (gh)` bereits installiert. + +## Prozedur + +1. Falls noch nicht geschehen, klonen Sie Ihren Fork: + + ```bash + git clone https://github.com/rockstar/documentation.git + cd documentation + ``` + +2. Fügen Sie das Upstream-Remote hinzu: + + ```bash + git remote add upstream https://github.com/rocky-linux/documentation.git + ``` + +3. Upstream-Änderungen abrufen: + + ```bash + git fetch upstream + ``` + +4. Erstellen Sie einen neuen Feature-Zweig: + + ```bash + git checkout -b feature-branch-name + ``` + +5. Nehmen Sie Änderungen vor, fügen Sie neue Dateien hinzu und committen Sie sie: + + ```bash + git add . + git commit -m "Implementing feature X" + ``` + +6. Halten Sie Ihr Branch auf dem neuesten Stand. Führen Sie regelmäßig Änderungen aus dem Upstream zusammen, um Konflikte zu vermeiden: + + ```bash + git pull upstream main --rebase + ``` + +7. Pushen Sie zu Ihrem Fork indem Sie Folgendes eingeben: + + ```bash + git push origin feature-branch-name + ``` + +8. Pull Request anlegen: + + ```bash + gh pr create --base main --head rockstar:feature-branch-name --title "New Feature X" --body "Long Description of the feature" + ``` + +## Zusammenfassung + +Der `Feature-Branch-Workflow` ist eine gängige Zusammenarbeitstechnik, die es Teams ermöglicht, gleichzeitig an verschiedenen Aspekten eines Projekts zu arbeiten und gleichzeitig eine stabile Hauptcodebasis aufrechtzuerhalten. + +Die wichtigsten Schritte sind: + +1. Haupt-Repository klonen: Klonen Sie das Haupt-Projekt-Repository direkt auf Ihren lokalen Computer. +2. Erstellen Sie einen Feature-Branch: Erstellen Sie für jede neue Aufgabe einen neuen Branch des Haupt-Branchs mit einem aussagekräftigen Namen. +3. Änderungen committen: Arbeiten Sie an dem Feature oder führen Sie Korrekturen in Ihrem Zweig durch und committen Sie die Änderungen. +4. Halten Sie den Zweig auf dem neuesten Stand: Führen Sie regelmäßig Zusammenführungen –Merges– oder Rebases mit dem Hauptzweig durch, um über Änderungen auf dem Laufenden zu bleiben. +5. Öffnen Sie ein Pull-Request: Pushen Sie den Zweig in das Hauptrepository und öffnen Sie einen PR zum Review, sobald Ihre Funktion fertig ist. +6. Codereview und Merge: Der Zweig wird nach Überprüfung und Genehmigung in den Hauptzweig zusammengeführt. + +_Vorteile_: + +- Optimiert Beiträge für regelmäßige Mitwirkende mit direktem Repository-Zugriff. +- Stellt sicher, dass jede Funktion überprüft wird, bevor sie in die Hauptcodebasis integriert wird. +- Hilft, einen sauberen und linearen Projektverlauf aufrechtzuerhalten. diff --git a/docs/gemstones/network/mtr.de.md b/docs/gemstones/network/mtr.de.md index ff70e82621..dc42fe5814 100644 --- a/docs/gemstones/network/mtr.de.md +++ b/docs/gemstones/network/mtr.de.md @@ -1,5 +1,5 @@ --- -title: mtr - Netzwerk-Diagnose +title: mtr – Netzwerk-Diagnose author: tianci li contributors: Steven Spencer, Neel Chauhan date: 2021-10-20 diff --git a/docs/gemstones/network/nmcli.de.md b/docs/gemstones/network/nmcli.de.md new file mode 100644 index 0000000000..73e9fa2318 --- /dev/null +++ b/docs/gemstones/network/nmcli.de.md @@ -0,0 +1,33 @@ +--- +title: nmcli – `Autoconnect` setzen +author: Wale Soyinka +tags: + - nmcli +--- + +# Änderung der Autoconnect-Eigenschaft des NetworkManager-Verbindungsprofils + +Verwenden Sie zunächst `nmcli`, um den aktuellen Wert der `Autoconnect`-Eigenschaft für alle Netzwerkverbindungen auf einem Rocky Linux-System abzufragen und anzuzeigen. Geben Sie bitte Folgendes ein: + +```bash +nmcli -f name,autoconnect connection +``` + +Um den Wert einer Eigenschaft für eine Netzwerkverbindung zu ändern, verwenden Sie den Unterbefehl `modify` mit `nmcli connection`. Um beispielsweise den Wert der Eigenschaft `autoconnect` für das Verbindungsprofil `ens3` von `no` in `yes` zu ändern, geben Sie Folgendes ein: + +```bash +sudo nmcli con mod ens3 connection.autoconnect yes +``` + +## Zu den Befehlen + +```bash +connection (con) : Netzwerk-Manager Connection-Objekt. +modify (mod) : Eine oder mehrere Eigenschaften eines bestimmten Verbindungsprofils ändern. +connection.autoconnect : Einstellung und Eigenschaften (.) +-f, --fields : gibt die auszugebenden Felder an. +``` + +## Anmerkungen + +Dieser Hinweis zeigt, wie man ein bestehendes NetworkManager-Verbindungsprofil ändert. Dies ist nützlich, wenn die Netzwerkschnittstelle nach einer erneuten Rocky Linux Installation oder einem Systemupdate nicht automatisch aktiviert wird. Der Grund dafür liegt oft darin, dass der Wert der Eigenschaft autoconnect auf `o` gesetzt wird. Sie können den `nmcli`-Befehl verwenden, um den Wert schnell auf `yes` zu ändern. diff --git a/docs/gemstones/network/nmtui.de.md b/docs/gemstones/network/nmtui.de.md index 0eb7d4b8cc..9328bfa241 100644 --- a/docs/gemstones/network/nmtui.de.md +++ b/docs/gemstones/network/nmtui.de.md @@ -1,5 +1,5 @@ --- -title: nmtui - Netzwerk-Management-Tool +title: nmtui – Netzwerk-Management-Tool author: tianci li contributors: Steven Spencer, Neil Hanlon update: 2021-10-23 diff --git a/docs/gemstones/perl_search_replace.de.md b/docs/gemstones/perl_search_replace.de.md index a945ee1d91..ba1949506c 100644 --- a/docs/gemstones/perl_search_replace.de.md +++ b/docs/gemstones/perl_search_replace.de.md @@ -1,9 +1,9 @@ --- -title: perl - Suchen und Ersetzen +title: perl – Suchen und Ersetzen author: Steven Spencer tags: - perl - - search + - suche --- # `perl` – Suchen und Ersetzen diff --git a/docs/gemstones/sed_search_replace.de.md b/docs/gemstones/sed_search_replace.de.md new file mode 100644 index 0000000000..967e69be37 --- /dev/null +++ b/docs/gemstones/sed_search_replace.de.md @@ -0,0 +1,75 @@ +--- +title: sed — Suchen und Ersetzen +author: Steven Spencer +--- + +# `sed` - Suchen und Ersetzen + +`sed` ist ein Befehl, der für "stream-editor" steht. + +## Konventionen + +* `path`: Der aktuelle Pfad. Beispiel: `/var/www/html/` +* `Dateiname`: Der aktuelle Dateiname. Beispiel: `index.php` + +## `sed` - Verwendung + +Die Verwendung von `sed` zum Suchen und Ersetzen ist die persönliche Präferenz des Autors, da Sie ein Trennzeichen Ihrer Wahl verwenden können, was das Ersetzen von Dingen wie Weblinks durch „/“ sehr praktisch macht. Die Standardbeispiele für die `in place`-Bearbeitung mit `sed` schlagen solche Dinge vor: + +`sed -i 's/search_for/replace_with/g' /path/filename` + +Was aber, wenn Sie nach Zeichenfolgen suchen, die `/` enthalten? Wenn der Schrägstrich die einzige als Trennzeichen verfügbare Option wäre? Sie müssten jeden Schrägstrich maskieren, bevor Sie ihn in der Suche verwenden könnten. In diesem Punkt ist `sed` anderen Tools überlegen, da das Trennzeichen im laufenden Betrieb geändert werden kann (Sie müssen nicht angeben, dass Sie es irgendwo ändern). Wenn Sie wie gesagt nach Dingen suchen, die „/“ enthalten, können Sie das tun, indem Sie das Trennzeichen in „|“ ändern. Hier ist ein Beispiel für die Suche nach einem Link mit dieser Methode: + +`sed -i 's|search_for/with_slash|replace_string|g' /path/filename` + +Sie können jedes einzelne Byte-Zeichen als Trennzeichen verwenden, mit Ausnahme von Backslash, Newline und "s". Zum Beispiel funktioniert das auch: + +`sed -i 'sasearch_forawith_slashareplace_stringag' /path/filename` where "a" is the delimiter, and the search and replace still works. Aus Sicherheitsgründen können Sie beim Suchen und Ersetzen ein Backup angeben. Dies ist nützlich, um sicherzustellen, dass die Änderungen, die Sie mit `SED` vornehmen, die sind, die Sie _wirklich beabsichtigen. Dies gibt Ihnen eine Wiederherstellungsoption aus der Sicherungsdatei:

    + +`sed -i.bak s|search_for|replacea_with|g /path/filename` + +Das erzeugt eine unbearbeitete Version von `Dateiname` namens `Dateiname.bak` + +Sie können auch vollständige Anführungszeichen anstelle von einfachen Anführungszeichen verwenden: + +`sed -i "s|search_for/with_slash|replace_string|g" /path/filename` + +## Optionen erklärt + +| Option | Erläuterung | +| ------ | --------------------------------------------------------------- | +| i | Datei an Ort bearbeiten | +| i.ext | erstellt ein Backup, passend zur Erweiterung (ext hier) | +| s | spezifiziert die Suche | +| g | Gibt an, dass global oder alle Vorkommen ersetzt werden sollen. | + +## Mehrere Dateien + +Leider hat `sed` keine Inline-Looping-Option wie `perl`. Um mehrere Dateien zu durchlaufen, müssen Sie Ihren `sed`-Befehl in einem Skript kombinieren. Hier ist ein Beispiel dafür. + +Erstellen Sie zunächst eine Liste der Dateien, die das Skript verwenden soll. Tun Sie dies von der Befehlszeile aus mit Folgendem: + +`find /var/www/html -name "*.php" > phpfiles.txt` + +Als Nächstes erstellen Sie ein Skript um die Datei `phpfiles.txt` zu bearbeiten: + +```bash +#!/bin/bash + +for file in `cat phpfiles.txt` +do + sed -i.bak 's|search_for/with_slash|replace_string|g' $file +done +``` + +Das Skript durchläuft alle in `phpfiles.txt` erstellten Dateien, erstellt eine Sicherungskopie jeder Datei und führt die Such- und Ersetzungszeichenfolge global aus. Wenn Sie überprüft haben, dass die Änderungen Ihren Wünschen entsprechen, können Sie alle Sicherungsdateien löschen. + +## Weitere Lektüre und Beispiele + +* `sed` [manual page](https://linux.die.net/man/1/sed) +* `sed` [additional examples](https://www.linuxtechi.com/20-sed-command-examples-linux-users/) +* `sed` & `awk` [O'Reilly Book](https://www.oreilly.com/library/view/sed-awk/1565922255/) + +## Zusammenfassung + +`sed` ist ein leistungsfähiges Werkzeug und funktioniert sehr gut für Such- und Ersetzungs-Funktionen, insbesondere dort, wo der Trenner flexibel sein muss. diff --git a/docs/guides/8_6_installation.uk.md b/docs/guides/8_6_installation.uk.md index 402452ae7f..47b7c0fd4c 100644 --- a/docs/guides/8_6_installation.uk.md +++ b/docs/guides/8_6_installation.uk.md @@ -58,7 +58,7 @@ Rocky-8.9-x86_64-minimal.iso: OK ## Встановлення -!!! tip "Порада" +!!! Tip "Порада" Перед інсталяцією уніфікований розширюваний інтерфейс мікропрограми (UEFI) або базову систему вводу/виводу (BIOS) потрібно попередньо налаштувати для завантаження з правильного носія. @@ -126,7 +126,7 @@ Rocky-8.9-x86_64-minimal.iso: OK Оскільки ми виконуємо нашу інсталяцію, використовуючи повний образ Rocky 8, ви помітите, що *Локальний носій* автоматично вказано в розділі «Джерело інсталяції» на головному екрані *Підсумок інсталяції*. Ми приймемо стандартні налаштування. -!!! tip "Порада" +!!! Tip "Порада" Область «Джерело інсталяції» — це місце, де ви можете вибрати встановлення через мережу. Для мережевої інсталяції вам спочатку потрібно переконатися, що мережевий адаптер у цільовій системі налаштовано правильно та може підключитися до Інтернету. Щоб виконати встановлення через мережу, клацніть «Джерело встановлення» та виберіть перемикач «У мережі». Після вибору виберіть `https` як протокол і введіть наступну URL-адресу в текстове поле `download.rockylinux.org/pub/rocky/8/BaseOS/x86_64/os`. Натисніть `Готово`. diff --git a/docs/guides/9_6_installation.uk.md b/docs/guides/9_6_installation.uk.md index c35735df64..65ddbfb7c0 100644 --- a/docs/guides/9_6_installation.uk.md +++ b/docs/guides/9_6_installation.uk.md @@ -84,7 +84,7 @@ Rocky-.--.iso 6. Виберіть мову, яку ви хочете використовувати для встановлення цього екрана. Для цього посібника ми обрали _English (United States)_. Потім натисніть кнопку ++"continue"++. -## Підсумок Інсталяції +## Підсумок встановлення Екран «Підсумок встановлення» – це універсальна область, де ви приймаєте важливі рішення щодо встановлення системи. @@ -97,7 +97,7 @@ Rocky-.--.iso Далі ми розглянемо кожен із цих розділів і внесемо необхідні зміни. -### Розділ локалізації +### Розділ Localization Цей розділ налаштовує елементи, пов’язані з географічним розташуванням системи. Це включає – клавіатуру, підтримку мови, час і дату. @@ -131,7 +131,7 @@ Rocky-.--.iso Оскільки під час встановлення використовується ISO-образ Rocky Linux 9.6, ви помітите, що _Локальний носій_ автоматично вказується в розділі «Джерело встановлення» на головному екрані _Підсумок встановлення_. Ви можете прийняти стандартні налаштування. -!!! tip "Порада" +!!! Tip "Порада" Розділ «Джерело інсталяції» дозволяє виконати мережеву інсталяцію (наприклад, якщо ви використовуєте завантажувальний ISO-образ Rocky Linux — Rocky-9.6-x86_64-boot.iso). Для мережевої інсталяції переконайтеся, що мережевий адаптер на цільовій системі налаштовано правильно та має доступ до Інтернету. Щоб виконати мережеву інсталяцію, натисніть ++«Джерело інсталяції»++, а потім виберіть перемикач ++«У мережі»++. Після вибору виберіть правильний протокол і введіть URI для джерела інсталяції. Натисніть ++«Готово»++. @@ -257,7 +257,7 @@ Rocky-.--.iso Щойно ви будете задоволені вибором різних завдань встановлення, розпочнеться наступний етап процесу встановлення: власне встановлення. -### Почніть установку +### Початок установки Щойно ви будете задоволені вибраними параметрами для різних завдань встановлення, натисніть кнопку ++"Розпочати встановлення"++ на головному екрані _Підсумок встановлення_. @@ -268,13 +268,13 @@ Rocky-.--.iso Якщо ви не бажаєте продовжувати після натискання кнопки «Почати встановлення», ви можете безпечно вийти з інсталяції без втрати даних. Щоб вийти з інсталятора, скиньте налаштування системи, натиснувши кнопку «Вийти», натиснувши Ctrl-Alt-Delete на клавіатурі або натиснувши кнопку скидання чи вимикач живлення. -### Завершіть установку +### Завершення установки Після завершення програми інсталяції ви побачите екран останнього процесу інсталяції з повним повідомленням. Нарешті завершіть всю процедуру, натиснувши кнопку ++"Reboot System"++. Система перезавантажується. -### Log In +### Вхід Тепер система налаштована та готова до використання. Ви побачите консоль Rocky Linux. diff --git a/docs/guides/custom-linux-kernel.uk.md b/docs/guides/custom-linux-kernel.uk.md index 817cf692d2..bfe2377c94 100644 --- a/docs/guides/custom-linux-kernel.uk.md +++ b/docs/guides/custom-linux-kernel.uk.md @@ -30,7 +30,7 @@ Linux - це ядро. Ядро лежить в основі [операційн ## Вихідний код ядра -Дистрибутив Rocky Linux має вихідний код конкретної версії ядра, який він підтримує, доступний у тій чи іншій формі. Вони можуть бути у формі скомпільованого двійкового файлу (*.src.rpm), вихідного RPM (*.srpm) тощо. +Дистрибутив Rocky Linux має вихідний код конкретної версії ядра, який він підтримує, доступний у тій чи іншій формі. Вони можуть бути у формі скомпільованого двійкового файлу (`*.src.rpm`), вихідного RPM (`*.srpm`) тощо. Якщо вам потрібно завантажити іншу (можливо, новішу) версію, відмінну від тієї, яку надає ваш конкретний дистрибутив Rocky Linux, першим місцем, де потрібно шукати вихідний код, є офіційний веб-сайт ядра: @@ -46,7 +46,7 @@ Linux - це ядро. Ядро лежить в основі [операційн Більшу частину завантаження, налаштування та компіляції ядра Linux, виконаної в наступних розділах, може/повинен виконувати непривілейований користувач. Однак останні кроки, які вимагають фактичного встановлення або зміни системних файлів і двійкових файлів, потрібно виконувати з підвищеними привілеями. - Ми можемо виконувати більшу частину роботи як непривілейований користувач, оскільки ми будемо використовувати спеціальну опцію побудови ядра, яка дозволяє нам вказати спеціальний робочий або вихідний каталог. Зокрема, ми будемо використовувати параметр `O=~/build/kernel` для всіх відповідних викликів. + Ви можете виконувати більшість завдань як користувач без привілеїв, оскільки будете використовувати спеціальну опцію компіляції ядра, яка дозволяє вказати власний робочий або вихідний каталог. Зокрема, ми будемо використовувати параметр `O=~/build/kernel` для всіх відповідних викликів. Де `~/build/kernel` еквівалентно `/home/$USER/build/kernel` або `$HOME/build/kernel` @@ -56,20 +56,14 @@ Linux - це ядро. Ядро лежить в основі [операційн Поточна конвенція полягає в тому, щоб називати та нумерувати основні нові випуски ядра як «Linux 5.x» (також званий мініатюрними або основними ядрами). Таким чином, першою з цієї серії буде версія Linux 5.0 (така ж, як 5.0.0), наступною буде версія Linux 5.1 (така ж, як 5.1.0), за нею буде версія Linux 5.2 і так далі. -Будь-які незначні зміни чи оновлення в кожній основній версії випуску буде відображено з кроком до третьої цифри. Їх зазвичай називають стабільними точковими випусками. Таким чином, наступним стабільним випуском для ядра серії 5.0.0 буде версія Linux 5.0.1, за якою піде версія 5.0.2 і так далі. Інший спосіб сказати це, наприклад, сказати, що версія Linux 5.0.4 є четвертим стабільним випуском на основі серії Linux 5.0.0. +Третя цифра позначає будь-які незначні зміни або оновлення в межах кожної основної версії. Їх зазвичай називають стабільними точковими випусками. Таким чином, наступним стабільним випуском для ядра серії 5.0.0 буде версія Linux 5.0.1, за якою піде версія 5.0.2 і так далі. Інший спосіб сказати це, наприклад, сказати, що версія Linux 5.0.4 є четвертим стабільним випуском на основі серії Linux 5.0.0. ## Встановлення необхідних інструментів і бібліотек -Поширеним джерелом збою, що виникає під час процесу збирання ядра, може бути відсутність усього необхідного програмного забезпечення для компіляції та створення основного ядра Linux. Відсутні інструменти та бібліотеки можна встановити за допомогою менеджера пакетів DNF у дистрибутиві Rocky Linux. Ми подбаємо про це в цьому розділі. +Відсутність усього необхідного програмного забезпечення для компіляції та побудови основного ядра Linux є поширеною причиною невдач, що виникають під час процесу побудови ядра. Ви можете встановити відсутні інструменти та бібліотеки за допомогою менеджера пакетів DNF у дистрибутиві Rocky Linux. Ви можете подбати про це тут. 1. У дистрибутиві Rocky Linux ви можете швидко встановити більшість необхідних інструментів розробки, виконавши цю команду: - ```bash - sudo dnf -y groupinstall 'C Development Tools and Libraries' - ``` - - Якщо ви отримуєте повідомлення «Module or Group 'C Development Tools and Libraries' is not available.». помилка, наведена нижче команда еквівалентна наведеній вище: - ```bash sudo dnf -y groupinstall 'Development Tools' ``` @@ -80,13 +74,13 @@ Linux - це ядро. Ядро лежить в основі [операційн sudo dnf -y install ncurses-devel openssl-devel elfutils-libelf-devel python3 ``` -3. Далі нам потрібні інші утиліти, доступні лише в деяких підтримуваних сторонніх сховищах. Одним із таких сховищ є репозиторій Powertools. Давайте увімкнемо це репо в нашій системі Rocky. Впишіть: +3. Далі нам потрібні інші утиліти, доступні лише в деяких підтримуваних сторонніх сховищах. Одним з таких репозиторіїв є репозиторій CRB (Code Ready Builder). Увімкніть це сховище в нашій системі Rocky за допомогою: ```bash sudo dnf config-manager --set-enabled powertools ``` -4. Нарешті, давайте встановимо один із необхідних пакетів зі сховища Powertool. Впишіть: +4. Нарешті, встановіть один із необхідних пакетів із репозиторію CRB за допомогою команди: ```bash sudo dnf -y install dwarves @@ -111,7 +105,7 @@ Linux - це ядро. Ядро лежить в основі [операційн 2. Вихідний код ядра, який ви завантажуєте з Інтернету, — це файл, стиснутий і збережений у tar. Тому вам потрібно розпакувати та розархівувати вихідний файл, щоб використовувати джерело. - Переконайтеся, що ви перебуваєте в каталозі, куди завантажуєте архів ядра. Використовуйте команду tar, щоб розпакувати та розпакувати файл, виконавши: + Переконайтеся, що ви перебуваєте в каталозі, куди завантажуєте архів ядра. Використовуйте команду `tar`, щоб розпакувати та розпакувати файл, виконавши: ```bash tar xvJf linux-6.*.tar.xz @@ -142,7 +136,7 @@ Linux - це ядро. Ядро лежить в основі [операційн Дерево вихідних кодів ядра Linux містить кілька файлів під назвою Makefile (make-файл — це просто текстовий файл із директивами, який також описує зв’язки між файлами в програмі). -Ці makefiles допомагають склеїти разом тисячі інших файлів, які складають джерело ядра. Для нас тут важливіше те, що make-файли також містять цілі. Цілі — це команди або директиви, які виконує програма make. +Ці makefiles допомагають склеїти разом тисячі інших файлів, які складають джерело ядра. Для нас тут важливіше те, що make-файли також містять цілі. Цілі — це команди або директиви, які виконує програма `make`. !!! warning "попередження: уникайте непотрібних оновлень ядра" @@ -165,7 +159,7 @@ Linux - це ядро. Ядро лежить в основі [операційн `make clean` : -Ця ціль не виконує такої ретельної роботи, як ціль mrproper. Він видаляє лише більшість створених файлів. Він не видаляє файл конфігурації ядра (.config). +Ця ціль не виконує такої ретельної роботи, як ціль `mrproper`. Він видаляє лише більшість створених файлів. Він не видаляє файл конфігурації ядра (`.config`). `make menuconfig` : @@ -185,18 +179,18 @@ Linux - це ядро. Ядро лежить в основі [операційн `make olddefconfig` : -Ця мета використовує наявний файл .config у поточному робочому каталозі, оновлює залежності та автоматично встановлює для нових символів значення за замовчуванням. +Ця мета використовує наявний файл `.config` у поточному робочому каталозі, оновлює залежності та автоматично встановлює для нових символів значення за замовчуванням. `make help` : Ця мета покаже вам усі можливі цілі та слугуватиме системою швидкої онлайн-довідки. -У цьому розділі ми будемо використовувати лише одну з цілей для налаштування ядра. Зокрема, ми будемо використовувати команду make menuconfig. Редактор конфігурації ядра menuconfig — це проста і популярна текстова утиліта налаштування, яка містить меню, списки перемикачів і діалогові вікна. +У цьому розділі ми будемо використовувати лише одну з цілей для налаштування ядра. Зокрема, ми будемо використовувати команду make `menuconfig`. Редактор конфігурації ядра `menuconfig` — це проста і популярна текстова утиліта налаштування, яка містить меню, списки перемикачів і діалогові вікна. Він має простий і зрозумілий інтерфейс, яким можна легко керувати за допомогою клавіатури, і він майже інтуїтивно зрозумілий у використанні. -Нам потрібно змінити (`cd`) у вихідний каталог ядра, після чого ми можемо почати налаштування ядра. Але перед початком фактичної конфігурації ядра вам слід очистити (підготувати) середовище збірки ядра за допомогою команди make mrproper: +Нам потрібно змінити (`cd`) у вихідний каталог ядра, після чого ми можемо почати налаштування ядра. Але перед початком фактичної конфігурації ядра вам слід очистити (підготувати) середовище збірки ядра за допомогою команди `make mrproper`: ```bash cd linux-6.* @@ -205,17 +199,17 @@ make O=~/build/kernel mrproper ### Конфігурація ядра -Далі ми почнемо налаштовувати ядро серії Linux 6.*. Щоб дослідити деякі нутрощі цього процесу, ми ввімкнемо підтримку функції, яку будемо вважати обов’язковою в системі. Коли ви зрозумієте, як це працює, ви можете застосувати ту саму процедуру, щоб додати підтримку будь-якої нової функції ядра, яку ви хочете. Зокрема, ми ввімкнемо підтримку файлової системи NTFS у нашому спеціальному ядрі. +Далі ми почнемо налаштовувати ядро серії Linux 6.*. Щоб дослідити деякі внутрішні аспекти цього процесу, ви увімкнете підтримку певної функції, яку ви будете вважати обов'язковою для системи. Коли ви зрозумієте, як це працює, ви можете застосувати ту саму процедуру, щоб додати підтримку будь-якої нової функції ядра, яку ви хочете. Зокрема, ми ввімкнемо підтримку файлової системи NTFS у нашому спеціальному ядрі. Більшість сучасних дистрибутивів Linux постачаються з файлом конфігурації ядра для запущеного ядра, доступним у локальній файловій системі у вигляді стисненого або звичайного файлу. У нашому прикладі системи Rocky цей файл знаходиться в каталозі `/boot` і зазвичай називається `config-*`. -У файлі конфігурації перелічено параметри та функції, активовані для конкретного ядра, яке він представляє. Конфігураційний файл, подібний до цього, ми прагнемо створити в процесі налаштування ядра. Єдина відмінність між файлом, який ми створимо, і готовим файлом полягає в тому, що ми додамо до нашого незначні налаштування. +The configuration file contains a list of the options and features enabled for the particular kernel it represents. Конфігураційний файл, подібний до цього, ми прагнемо створити в процесі налаштування ядра. Єдина відмінність між файлом, який ми створимо, і готовим файлом полягає в тому, що ми додамо до нашого незначні налаштування. !!! tip "Підказка" Використання відомого попередньо існуючого файлу конфігурації як основи для створення нашого спеціального файлу допомагає гарантувати, що ми не витрачаємо надто багато часу на дублювання зусиль, які інші люди вже доклали, щоб знайти, що працює, а що ні! -Наступні кроки описують, як налаштувати ядро. Ми будемо використовувати текстову утиліту конфігурації ядра, яка дозволить вам слідкувати за вашим терміналом, незалежно від того, використовуєте ви робоче середовище GUI чи ні. +Наступні кроки описують, як налаштувати ядро. Ви будете використовувати текстову утиліту конфігурації ядра. Ви можете стежити за процесом у своєму терміналі незалежно від того, чи використовуєте ви графічне середовище робочого столу чи ні. 1. Для початку ми скопіюємо та перейменуємо існуючий файл конфігурації з каталогу `/boot` у наше середовище збирання ядра: @@ -263,13 +257,13 @@ make O=~/build/kernel mrproper Символ зірочки в кутових дужках, <*>, вказує на те, що підтримка цієї функції буде безпосередньо вбудована в ядро. Зазвичай ви можете перемикати всі можливі параметри за допомогою пробілу на клавіатурі. -5. Поверніться до головного екрана файлових систем, двічі натиснувши клавішу esc на клавіатурі на екрані файлових систем DOS/FAT/NT. Поверніться до головного екрана налаштування ядра, двічі натиснувши esc на клавіатурі. +5. Поверніться до головного екрана файлових систем, двічі натиснувши клавішу ++esc++ на клавіатурі на екрані файлових систем DOS/FAT/NT. Поверніться до головного екрана налаштування ядра, двічі натиснувши ++esc++ на клавіатурі. -6. Зрештою, збережіть ваші зміни у файлі .config у корені дерева вихідних кодів ядра та вийдіть із програми конфігурації ядра після збереження файлу, двічі натиснувши esc на клавіатурі. +6. Зрештою, збережіть ваші зміни у файлі `.config` у корені дерева вихідних кодів ядра та вийдіть із програми конфігурації ядра після збереження файлу, двічі натиснувши ++esc++ на клавіатурі. -7. З’явиться діалогове вікно з пропозицією зберегти нову конфігурацію. Переконайтеся, що вибрано Yes, а потім натисніть enter. +7. З’явиться діалогове вікно з пропозицією зберегти нову конфігурацію. Переконайтеся, що вибрано "Yes", а потім натисніть enter. -8. Після завершення роботи утиліти конфігурації ядра ви повернетеся до своєї оболонки всередині дерева вихідних кодів ядра. Ви майже готові до створення свого ядра! +8. Після завершення роботи утиліти конфігурації ядра ви повернетеся до своєї оболонки всередині дерева вихідних кодів ядра. Ви майже готові до створення свого ядра. 9. Нам потрібно виконати ще кілька налаштувань нашого дистрибутива Rocky. Впишіть: @@ -279,7 +273,7 @@ make O=~/build/kernel mrproper !!! TIP "Підказка" - Щоб переглянути результати деяких змін, внесених за допомогою інструменту menuconfig, скористайтеся утилітою grep, щоб переглянути файл .config, який ви зберегли безпосередньо. Наприклад, щоб переглянути вплив підтримки файлової системи NTFS, яку ми ввімкнули раніше, введіть наступне: + Щоб переглянути результати деяких змін, внесених за допомогою інструменту menuconfig, скористайтеся утилітою grep, щоб переглянути файл `.config`, який ви зберегли безпосередньо. Наприклад, щоб переглянути вплив підтримки файлової системи NTFS, яку ми ввімкнули раніше, введіть наступне: ``` $ grep NTFS ~/build/kernel/.config CONFIG_NTFS_FS=m @@ -297,11 +291,11 @@ make O=~/build/kernel mrproper ### Компіляція ядра -In the preceding section, we walked through the process of creating a configuration file for the custom kernel that we want to build. У цьому розділі ми виконаємо фактичну збірку ядра. Але перш ніж це зробити, ми додамо одну простішу настройку до всього процесу. +In the preceding section, you walked through the process of creating a configuration file for the custom kernel that you want to build. У цьому розділі ми виконаємо фактичну збірку ядра. Але перш ніж це зробити, ми додамо одну простішу настройку до всього процесу. -Останнім налаштуванням буде додавання додаткової інформації, яка використовується в остаточній назві нашого ядра. Це допоможе нам відрізнити це ядро від будь-якого іншого ядра з таким же номером версії. Ми додамо тег «custom» до інформації про версію ядра. Це можна зробити шляхом редагування основного Makefile і додавання потрібного тегу до змінної EXTRAVERSION. +Останнім налаштуванням буде додавання додаткової інформації, яка використовується в остаточній назві нашого ядра. Це допоможе нам відрізнити це ядро від будь-якого іншого ядра з таким же номером версії. Ми додамо тег “custom” до інформації про версію ядра. Це можна зробити шляхом редагування основного Makefile і додавання потрібного тегу до змінної EXTRAVERSION. -Етап компіляції процесу збирання ядра, безумовно, найпростіший, але він також займає найбільше часу. Все, що потрібно на цьому етапі, це просто виконати команду make, яка потім автоматично згенерує та вирішить будь-які проблеми залежностей, скомпілює саме ядро та скомпілює будь-які функції (або драйвери), які були активовані як завантажувані модулі. +Етап компіляції процесу збирання ядра, безумовно, найпростіший, але він також займає найбільше часу. Просто запустіть команду `make`, яка автоматично згенерує та вирішить будь-які проблеми із залежностями, скомпілює саме ядро та скомпілює будь-які функції (або драйвери), увімкнені як завантажувані модулі. Через велику кількість коду, який потрібно скомпілювати, будьте готові почекати щонайменше кілька хвилин, залежно від обчислювальної потужності вашої системи. Давайте розглянемо конкретні кроки, необхідні для компіляції вашого нового ядра. @@ -331,7 +325,7 @@ In the preceding section, we walked through the process of creating a configurat make O=~/build/kernel kernelversion ``` - !!! tip "Порада" + !!! Tip "Порада" Ви можете скористатися всією цією додатковою обчислювальною потужністю (ЦП, ядрами тощо) у більшості сучасних систем і значно пришвидшити інтенсивні ЦП операції, такі як компіляція ядра. Для цього ви можете передати команді make параметр, який визначає кількість завдань, які потрібно виконувати одночасно. Зазначена кількість завдань потім розподіляється та виконується одночасно на кожному ядрі ЦП. Синтаксис команди: @@ -346,7 +340,7 @@ In the preceding section, we walked through the process of creating a configurat make -j 8 ``` -3. Єдина команда, яка потрібна тут для компіляції ядра, це команда make: +3. Єдина команда, яка потрібна тут для компіляції ядра, це команда `make`: ```bash $ make O=~/build/kernel @@ -481,7 +475,7 @@ grub_class kernel sudo reboot ``` -2. Після завантаження системи ви можете скористатися командою uname, щоб дізнатися назву поточного ядра: +2. Після завантаження системи ви можете скористатися командою `uname`, щоб дізнатися назву поточного ядра: ```bash $ uname -r diff --git a/docs/guides/migrate2rocky.uk.md b/docs/guides/migrate2rocky.uk.md index f46b730ca2..72ca6c6144 100644 --- a/docs/guides/migrate2rocky.uk.md +++ b/docs/guides/migrate2rocky.uk.md @@ -9,7 +9,7 @@ update: 23.11.2021 ## Передумови і Припущення -- CentOS Stream, CentOS, AlmaLinux, RHEL або Oracle Linux, які працюють на апаратному сервері або VPS. Non-Stream CentOS завис на версії 8.5. Поточна підтримувана версія інших систем – 8.10 або 9.4. +- CentOS Stream, CentOS, AlmaLinux, RHEL або Oracle Linux з версією 8 або 9 на апаратному сервері або VPS. Non-Stream CentOS завис на версії 8.5. Поточна підтримувана версія інших систем – 8.10 або 9.6. Version 10 is not supported at the moment. - Практичні знання командного рядка. - Практичні знання SSH для віддалених машин. - Помірно ризиковане ставлення. diff --git a/docs/guides/security/dnf_automatic.uk.md b/docs/guides/security/dnf_automatic.uk.md index b14ae9a55b..4a7148a6fe 100644 --- a/docs/guides/security/dnf_automatic.uk.md +++ b/docs/guides/security/dnf_automatic.uk.md @@ -7,7 +7,7 @@ tags: - безпека - dnf - автоматизація - - updates + - оновлення --- # Виправлення серверів за допомогою `dnf-automatic` diff --git a/docs/guides/security/firewalld-beginners.uk.md b/docs/guides/security/firewalld-beginners.uk.md index 2b8a6a9166..66f1c8c5f8 100644 --- a/docs/guides/security/firewalld-beginners.uk.md +++ b/docs/guides/security/firewalld-beginners.uk.md @@ -147,7 +147,23 @@ firewall-cmd --permanent [the rest of your command] Стандартні зони включають наступне (я взяв це пояснення з [посібника DigitalOcean щодо `firewalld`](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-firewalld-on-centos-8), який вам також слід прочитати): -> **drop:** Найнижчий рівень довіри. Усі вхідні з’єднання розриваються без відповіді, і можливі лише вихідні з’єднання. **block:** Подібно до вищезазначеного, але замість того, щоб просто розірвати з’єднання, вхідні запити відхиляються повідомленням icmp-host-prohibited або icmp6-adm-prohibited. **public:** Представляє публічні, ненадійні мережі. Ви не довіряєте іншим комп’ютерам, але можете дозволити вибрані вхідні підключення в кожному конкретному випадку. **external:** Зовнішні мережі, якщо ви використовуєте брандмауер як шлюз. Він налаштований на маскування NAT, щоб ваша внутрішня мережа залишалася приватною, але доступною. **internal:** Інша сторона зовнішньої зони, яка використовується для внутрішньої частини шлюзу. Комп’ютери досить надійні, доступні деякі додаткові послуги. **dmz:** Використовується для комп’ютерів, розташованих у DMZ (ізольовані комп’ютери, які не матимуть доступу до решти вашої мережі). Дозволені лише певні вхідні підключення. **work:** Використовується для робочих машин. Довіряйте більшості комп’ютерів у мережі. Можливо, буде дозволено ще декілька послуг. **home:** Домашнє середовище. Зазвичай це означає, що ви довіряєте більшості інших комп’ютерів і що буде прийнято ще кілька послуг. **trusted:** Довіряє всім машинам у мережі. Найбільш відкритий з доступних варіантів, і його слід використовувати помірковано. +> **drop:** Найнижчий рівень довіри. Усі вхідні з’єднання розриваються без відповіді, і можливі лише вихідні з’єднання. + +> **block:** Подібно до вищезазначеного, але замість того, щоб просто розірвати з’єднання, вхідні запити відхиляються повідомленням icmp-host-prohibited або icmp6-adm-prohibited. + +> **public:** представляє публічні, ненадійні мережі. Ви не довіряєте іншим комп’ютерам, але можете дозволити вибрані вхідні підключення в кожному конкретному випадку. + +> **external:** Зовнішні мережі, якщо ви використовуєте брандмауер як шлюз. Він налаштований на маскування NAT, щоб ваша внутрішня мережа залишалася приватною, але доступною. + +> **internal:** інша сторона зовнішньої зони, яка використовується для внутрішньої частини шлюзу. Комп’ютери досить надійні, доступні деякі додаткові послуги. + +> **dmz:** використовується для комп’ютерів, розташованих у DMZ (ізольовані комп’ютери, які не матимуть доступу до решти вашої мережі). Дозволені лише певні вхідні підключення. + +> **work:** Використовується для робочих машин. Довіряє більшості комп’ютерів у мережі. Можливо, буде дозволено ще декілька послуг. + +> **home:** Домашнє середовище. Загалом це означає, що ви довіряєте більшості інших комп’ютерів і що буде прийнято ще кілька послуг. + +> **trusted:** довіряє всім машинам у мережі. Найбільш відкритий з доступних варіантів, і його слід використовувати помірковано. Гаразд, деякі з цих пояснень стають складнішими, але чесно кажучи? Звичайний початківець може обійтися розумінням понять «довірений», «домашній» і «загальнодоступний», а також те, що використовувати. diff --git a/docs/guides/security/firewalld.uk.md b/docs/guides/security/firewalld.uk.md index 2d7a4317f8..cb574d1d11 100644 --- a/docs/guides/security/firewalld.uk.md +++ b/docs/guides/security/firewalld.uk.md @@ -20,7 +20,7 @@ tags: Цей посібник присвячено застосуванню правил із брандмауера `iptables` до брандмауера `firewalld`. Якщо ви справді лише на початку свого шляху до брандмауера, [цей документ](firewalld-beginners.md) може допомогти вам більше. Прочитайте обидва документи, щоб максимально використати `firewalld`. -## Передумови та припущення +## Передумови і Припущення - У цьому документі припускається, що ви є користувачем root або маєте підвищені привілеї за допомогою `sudo`. - Побіжне знання правил брандмауера, зокрема `iptables`, або, як мінімум, ви хочете дізнатися щось про `firewalld`. diff --git a/docs/guides/security/freeradius_radius_server.uk.md b/docs/guides/security/freeradius_radius_server.uk.md index d316bfb516..c1df2078e5 100644 --- a/docs/guides/security/freeradius_radius_server.uk.md +++ b/docs/guides/security/freeradius_radius_server.uk.md @@ -17,7 +17,7 @@ RADIUS — це протокол AAA (автентифікація, автори Нижче наведено мінімальні вимоги до цієї процедури: -- Можливість запускати команди від імені користувача root або використовувати `sudo` для підвищення привілеїв. +- Можливість запускати команди від імені користувача root або використовувати `sudo` для підвищення привілеїв - Клієнт RADIUS, наприклад маршрутизатор, комутатор або точка доступу Wi-Fi ## Встановлення FreeRADIUS diff --git a/docs/guides/security/learning_selinux.uk.md b/docs/guides/security/learning_selinux.uk.md index 85f5317bbe..07903df739 100644 --- a/docs/guides/security/learning_selinux.uk.md +++ b/docs/guides/security/learning_selinux.uk.md @@ -88,7 +88,7 @@ SELinux використовує для цього набір правил (по semanage [object_type] [options] ``` -Приклад: +Наприклад: ```bash semanage boolean -l @@ -143,7 +143,7 @@ httpd_can_sendmail (off , off) Allow httpd to send mail setsebool [-PV] boolean on|off ``` -Приклад: +Наприклад: ```bash sudo setsebool -P httpd_can_sendmail on @@ -196,7 +196,7 @@ SELinux має три режими роботи: getenforce ``` -Приклад: +Наприклад: ```bash $ getenforce @@ -209,7 +209,7 @@ Enforcing sestatus ``` -Приклад: +Наприклад: ```bash $ sestatus @@ -301,7 +301,7 @@ lsof -Z # for open files matchpathcon directory ``` -Приклад: +Наприклад: ```bash sudo matchpathcon /root @@ -317,7 +317,7 @@ sudo matchpathcon / chcon [-vR] [-u USER] [–r ROLE] [-t TYPE] file ``` -Приклад: +Наприклад: ```bash sudo chcon -vR -t httpd_sys_content_t /data/websites/ @@ -335,7 +335,7 @@ sudo chcon -vR -t httpd_sys_content_t /data/websites/ restorecon [-vR] directory ``` -Приклад: +Наприклад: ```bash sudo restorecon -vR /home/ @@ -356,7 +356,7 @@ semanage fcontext -a options file Якщо ви виконуєте перемикання контексту для папки, яка не є стандартною для системи, гарною практикою є створення правила, а потім застосування контексту, як у прикладі нижче! -Приклад: +Наприклад: ```bash sudo semanage fcontext -a -t httpd_sys_content_t "/data/websites(/.*)?" @@ -390,7 +390,7 @@ sudo cat /var/log/audit/audit.log | grep AVC | grep denied | tail -1 | audit2why audit2allow [-mM] ``` -Приклад: +Наприклад: ```bash sudo cat /var/log/audit/audit.log | grep AVC | grep denied | tail -1 | audit2allow -M mylocalmodule diff --git a/docs/guides/security/openvpn.uk.md b/docs/guides/security/openvpn.uk.md index 4c3cba29f5..1ee3ef7999 100644 --- a/docs/guides/security/openvpn.uk.md +++ b/docs/guides/security/openvpn.uk.md @@ -16,7 +16,7 @@ tags: Мінімальні вимоги до цієї процедури: -- Можливість запускати команди від імені користувача root або використовувати `sudo` для підвищення привілеїв. +- Можливість запускати команди від імені користувача root або використовувати `sudo` для підвищення привілеїв - Система Rocky Linux із загальнодоступною IP-адресою ## Встановлення OpenVPN diff --git a/docs/guides/security/ssh_ca_key_signing.uk.md b/docs/guides/security/ssh_ca_key_signing.uk.md index 4d518997d1..005d0f5d46 100644 --- a/docs/guides/security/ssh_ca_key_signing.uk.md +++ b/docs/guides/security/ssh_ca_key_signing.uk.md @@ -23,7 +23,7 @@ tags: ЦС також можна використовувати для підпису SSH-ключів користувача. Замість розповсюдження ключа кожному віддаленому хосту достатньо одного підпису, щоб авторизувати користувача для входу на декілька серверів. -## Завдання +## Цілі - Покращення безпеки підключень SSH. - Покращення процесу реєстрації та управління ключами. diff --git a/docs/guides/security/systemd_hardening.uk.md b/docs/guides/security/systemd_hardening.uk.md index d15e55ed6f..84a2729c4f 100644 --- a/docs/guides/security/systemd_hardening.uk.md +++ b/docs/guides/security/systemd_hardening.uk.md @@ -18,7 +18,7 @@ tags: Багато служб працюють із привілеями, які їм не потрібні для належної роботи. `systemd` містить багато інструментів, які допомагають мінімізувати ризик, коли процес скомпрометовано, шляхом застосування заходів безпеки та обмеження дозволів. -## Завдання +## Цілі - Покращення безпеки блоків `systemd` diff --git a/docs/guides/security/tailscale_vpn.uk.md b/docs/guides/security/tailscale_vpn.uk.md index 814c1f3b24..5ccd46038d 100644 --- a/docs/guides/security/tailscale_vpn.uk.md +++ b/docs/guides/security/tailscale_vpn.uk.md @@ -20,12 +20,12 @@ tags: Нижче наведено мінімальні вимоги для використання цієї процедури: -- Можливість запускати команди від імені користувача root або використовувати `sudo` для підвищення привілеїв. +- Можливість запускати команди від імені користувача root або використовувати `sudo` для підвищення привілеїв - Обліковий запис Tailscale ## Встановлення Tailscale -Щоб інсталювати Tailscale, спочатку потрібно додати його репозиторій `dnf` (зверніть увагу, якщо ви використовуєте Rocky Linux 8.x, замініть його на 8): +Щоб інсталювати Tailscale, спочатку потрібно додати його репозиторій `dnf` (зверніть увагу, якщо ви використовуєте Rocky Linux 8.x або 10.х, замініть його на 8 або 10 відповідно): ```bash dnf config-manager --add-repo https://pkgs.tailscale.com/stable/rhel/9/tailscale.repo diff --git a/docs/guides/security/wireguard_vpn.uk.md b/docs/guides/security/wireguard_vpn.uk.md index 577b225253..6434efff4f 100644 --- a/docs/guides/security/wireguard_vpn.uk.md +++ b/docs/guides/security/wireguard_vpn.uk.md @@ -16,7 +16,7 @@ tags: Мінімальні вимоги до цієї процедури такі: -- Можливість запускати команди від імені користувача root або використовувати `sudo` для підвищення привілеїв. +- Можливість запускати команди від імені користувача root або використовувати `sudo` для підвищення привілеїв - Система Rocky Linux із загальнодоступною IP-адресою ## Встановлення WireGuard diff --git a/docs/guides/troubleshooting/kernel_panic.uk.md b/docs/guides/troubleshooting/kernel_panic.uk.md index 768448b471..85278662bf 100644 --- a/docs/guides/troubleshooting/kernel_panic.uk.md +++ b/docs/guides/troubleshooting/kernel_panic.uk.md @@ -1,5 +1,5 @@ --- -title: Як впоратися з панікою ядра (kernel panic) +title: Як впоратися з kernel panic author: Antoine Le Morvan contributors: Steven Spencer, Ganna Zhyrnova tested_with: 9.4 diff --git a/docs/guides/virtualization/vbox-rocky.uk.md b/docs/guides/virtualization/vbox-rocky.uk.md index c654ebad15..8355befa58 100644 --- a/docs/guides/virtualization/vbox-rocky.uk.md +++ b/docs/guides/virtualization/vbox-rocky.uk.md @@ -119,7 +119,7 @@ VirtualBox® встановлює 16 МБ пам’яті для викори * На вкладці «Екран» з правого боку ви помітите опцію «Відеопам’ять» із значенням за замовчуванням 16 МБ. * Змініть це значення на потрібне. Ви можете змінити це значення вгору, повернувшись на цей екран будь-коли. У цьому прикладі це 128 МБ. -!!! tip "Порада" +!!! Tip "Порада" Є способи встановити відеопам'ять до 256 Мб. Якщо вам потрібно більше, перегляньте [цей документ](https://docs.oracle.com/en/virtualization/virtualbox/6.0/user/vboxmanage-modifyvm.html) з офіційної документації Oracle. diff --git a/docs/labs/kubernetes-the-hard-way/lab0-README.uk.md b/docs/labs/kubernetes-the-hard-way/lab0-README.uk.md index 825739b0f9..a4fa110ca4 100644 --- a/docs/labs/kubernetes-the-hard-way/lab0-README.uk.md +++ b/docs/labs/kubernetes-the-hard-way/lab0-README.uk.md @@ -35,7 +35,7 @@ Kubernetes The Hard Way проведе вас через завантаженн - [cni](https://github.com/containernetworking/cni) v1.6.x - [etcd](https://github.com/etcd-io/etcd) v3.4.x -## Тестова платформа +## Labs Для цього посібника потрібні чотири (4) віртуальні або фізичні машини на базі x86_64, підключені до однієї мережі. Хоча підручник використовує машини на базі x86_64, ви можете застосувати отримані уроки на інших платформах. diff --git a/docs/labs/kubernetes-the-hard-way/lab4-certificate-authority.uk.md b/docs/labs/kubernetes-the-hard-way/lab4-certificate-authority.uk.md index c9520cdde5..057d2c7132 100644 --- a/docs/labs/kubernetes-the-hard-way/lab4-certificate-authority.uk.md +++ b/docs/labs/kubernetes-the-hard-way/lab4-certificate-authority.uk.md @@ -53,9 +53,9 @@ cat ca.conf ca.crt ca.key ``` -!!! tip "Порада" +!!! Tip "Порада" - Щоб переглянути деталі, закодовані у створеному файлі сертифіката (ca.crt), ви можете скористатися цією командою OpenSSL `openssl x509 -in ca.crt -text -noout | less`. + Щоб переглянути деталі, закодовані у створеному файлі сертифіката (ca.crt), ви можете скористатися цією командою OpenSSL `openssl x509 -in ca.crt -text -noout | less`. ## Створення сертифікатів клієнта та сервера diff --git a/docs/labs/kubernetes-the-hard-way/lab9-bootstrapping-kubernetes-workers.uk.md b/docs/labs/kubernetes-the-hard-way/lab9-bootstrapping-kubernetes-workers.uk.md index 6b82bffd3a..39ec95b499 100644 --- a/docs/labs/kubernetes-the-hard-way/lab9-bootstrapping-kubernetes-workers.uk.md +++ b/docs/labs/kubernetes-the-hard-way/lab9-bootstrapping-kubernetes-workers.uk.md @@ -158,7 +158,7 @@ mv 10-bridge.conf 99-loopback.conf /etc/cni/net.d/ mv kube-proxy.service /etc/systemd/system/ ``` -!!! Note "Примітка" +!!! Примітка Хоча це вважається поганою формою безпеки, вам, можливо, доведеться тимчасово або назавжди вимкнути SELinux, якщо у вас виникнуть проблеми із запуском необхідних служб systemd. Правильним рішенням є дослідження та створення необхідних файлів політики за допомогою таких інструментів, як ausearch, audit2allow тощо. diff --git a/docs/labs/networking/lab5-nfs.uk.md b/docs/labs/networking/lab5-nfs.uk.md index aa466d1cb6..b41bd524b5 100644 --- a/docs/labs/networking/lab5-nfs.uk.md +++ b/docs/labs/networking/lab5-nfs.uk.md @@ -12,7 +12,7 @@ tags: # Лабораторна робота 5: NFS -## Завдання +## Цілі Виконавши цю лабораторну роботу, ви зможете @@ -111,7 +111,7 @@ SYNOPSIS З наведеного вище зразка вихідних даних ми можемо сказати, що служба portmapper зареєстрована на сервері RPC, на якому працює localhost. - !!! question "Питання" + !!! Question "Питання" 1. Що таке portmapper? @@ -369,7 +369,7 @@ OPTIONS 2. Суперкористувач у HQ повинен мати можливість записувати (створювати) нові файли та видаляти файли на вашому спільному ресурсі NFS. - !!! tip "Порада" + !!! Tip "Порада" Вам потрібно вимкнути спеціальну обробку NFS файлів, які належать root. Це робиться шляхом вказівки певного параметра, який «скасує» суперкористувача у файлі «/etc/exports». Спеціальна опція називається `no_root_squash`. Зверніть увагу, що використання параметра `no_root_squash` вважається поганою практикою та ризиком для безпеки. Зразок запису для виконання цього для будь-якого хосту, який відповідає `localhost` в `/etc/exports`, виглядатиме так: diff --git a/docs/labs/networking/lab8-samba.uk.md b/docs/labs/networking/lab8-samba.uk.md index 81fbd07699..74e642368f 100644 --- a/docs/labs/networking/lab8-samba.uk.md +++ b/docs/labs/networking/lab8-samba.uk.md @@ -14,7 +14,7 @@ tags: # Лабораторна робота 8: Samba -## Завдання +## Цілі Виконавши цю лабораторну роботу, ви зможете @@ -151,7 +151,7 @@ _nmbd_: цей демон забезпечує обслуговування ім ```bash mount -t cifs ``` - Вихід + ВИХІД ```bash //localhost/Shared on ~/samba-client type cifs (rw,relatime,vers=3.1.1,cache=strict,username=sambarockstar.... ...... @@ -163,7 +163,7 @@ _nmbd_: цей демон забезпечує обслуговування ім df -t cifs ``` - Вихід + Вихід: ``` Filesystem 1K-blocks Used Available Use% Mounted on @@ -188,7 +188,7 @@ _nmbd_: цей демон забезпечує обслуговування ім #### Щоб налаштувати дозволи на спільний доступ -1. Зробити визначення спільних ресурсів samba «Shared» доступним лише для читання. Це можна зробити, змінивши значення параметра для запису з «так» на «ні» у файлі конфігурації smb.con. Давайте використаємо `sed` onliner, щоб виконати це, виконавши: +1. Зробити визначення спільних ресурсів samba «Shared» доступним лише для читання. Це можна зробити, змінивши значення параметра writable з yes на no у файлі конфігурації smb.conf. Давайте використаємо `sed` onliner, щоб виконати це, виконавши: ```bash sudo sed -i'' -E \ diff --git a/docs/labs/security/lab3-auditing_the_system.uk.md b/docs/labs/security/lab3-auditing_the_system.uk.md index 3f7328fc19..85a43fa255 100644 --- a/docs/labs/security/lab3-auditing_the_system.uk.md +++ b/docs/labs/security/lab3-auditing_the_system.uk.md @@ -4,7 +4,7 @@ Title: Лабораторна робота 3 – Аудит системи auth # Лабораторна робота 3 – Аудит системи -## Завдання +## Цілі Після виконання цієї лабораторної роботи ви зможете: diff --git a/docs/labs/security/lab8-iptables.uk.md b/docs/labs/security/lab8-iptables.uk.md index 4a399388c3..9cd223c9ca 100644 --- a/docs/labs/security/lab8-iptables.uk.md +++ b/docs/labs/security/lab8-iptables.uk.md @@ -5,7 +5,7 @@ Title: Лабораторна робота 8 - iptables author: Wale Soyinka con # Лабораторна робота 8: `iptables` -## Завдання +## Цілі Виконавши цю лабораторну роботу, ви зможете diff --git a/docs/labs/security/lab9-cryptography.uk.md b/docs/labs/security/lab9-cryptography.uk.md index c8b722b5e4..919e463bc5 100644 --- a/docs/labs/security/lab9-cryptography.uk.md +++ b/docs/labs/security/lab9-cryptography.uk.md @@ -900,15 +900,20 @@ usage: scp [-346BCpqrTv] [-c cipher] [-F ssh_config] [-i identity_file] foobar ``` - !!! Question "Питання" + !!! question "Питання" Яка різниця між варіаціями цих двох команд і за яких обставин вони матимуть однаковий результат? - - - scp me@serverPR:/home/me/myexport. - + + ```bash + scp me@serverPR:/home/me/myexport . + ``` + + та - - - scp serverPR:/home/me/myexport. + + ```bash + scp serverPR:/home/me/myexport . + ``` 5. Яка команда скопіює всі файли в “/home/me/.gnugp/” на serverPR? @@ -927,12 +932,17 @@ usage: scp [-346BCpqrTv] [-c cipher] [-F ssh_config] [-i identity_file] !!! Question "Питання" Яка невелика, але суттєва різниця між варіаціями двох попередніх команд? І який результат кожної команди? - - - `scp -r ying@localhost:/home/ying/ ying_home_directory_on_serverPR` - + + ```bash + scp -r ying@localhost:/home/ying/ ying_home_directory_on_serverPR + ``` + + та - - - `scp -r ying@localhost:/home/ying ying_home_directory_on_serverPR` + + ```bash + scp -r ying@localhost:/home/ying ying_home_directory_on_serverPR + ``` 8. Використовуйте команду `ls -alR`, щоб переглянути перелік вмісту двох попередніх кроків. Впишіть: @@ -940,7 +950,7 @@ usage: scp [-346BCpqrTv] [-c cipher] [-F ssh_config] [-i identity_file] [me@localhost ~myimport]# ls -al ying_home_directory_on_serverPR/ ``` - !!! Question "Питання" + !!! question "Питання" Надайте коротке пояснення виводу команди `ls -alR`? Поясніть, наприклад, чому у вас є дублікати цих файлів .bash_history, .bashrc ... @@ -975,7 +985,7 @@ usage: scp [-346BCpqrTv] [-c cipher] [-F ssh_config] [-i identity_file] Created directory '/home/ying/.ssh'. ``` - Вам двічі буде запропоновано ввести парольну фразу. Введіть хорошу парольну фразу, яку досить складно вгадати. Натисніть ENTER після кожного запиту. + Вам двічі буде запропоновано ввести парольну фразу. Введіть хорошу парольну фразу, яку досить складно вгадати. Натисніть ++enter++ після кожного запиту. ```bash Enter passphrase (empty for no passphrase): ***** @@ -1033,7 +1043,7 @@ usage: scp [-346BCpqrTv] [-c cipher] [-F ssh_config] [-i identity_file] Мета попередньої складної на вигляд команди полягає в тому, щоб скопіювати та додати вміст вашого файлу відкритого ключа до “/home/ying/.ssh/authorized_keys” на serverPR і надати йому правильні дозволи. - !!! tip "Порада" + !!! Tip "Порада" Ви можете використовувати утиліту `ssh-copy-id`, щоб легко та більш витончено налаштувати автентифікацію відкритих/приватних ключів між системами. `ssh-copy-id` — це сценарій, який використовує `ssh` для входу на віддалену машину (імовірно, спочатку використовуючи пароль для входу. Він складає список з одного або кількох відбитків пальців (як описано нижче) і намагається ввійти за допомогою кожної клавіші, щоб побачити, чи якийсь із них уже встановлено. Потім він збирає список тих, кому не вдалося ввійти, і за допомогою `ssh` дозволяє ввійти за допомогою цих ключів у віддалену систему. За замовчуванням він додає ключі, додаючи їх до ~/.ssh/authorized_keys віддаленого користувача (створюючи файл і каталог, якщо необхідно). diff --git a/docs/labs/systems_administration_I/lab5-networking.uk.md b/docs/labs/systems_administration_I/lab5-networking.uk.md index c57b6c2d93..e841927e18 100644 --- a/docs/labs/systems_administration_I/lab5-networking.uk.md +++ b/docs/labs/systems_administration_I/lab5-networking.uk.md @@ -14,7 +14,7 @@ tags: # Лабораторна робота 5: Основи роботи в мережі -## Завдання +## Цілі Після виконання цієї лабораторної роботи ви зможете: diff --git a/docs/labs/systems_administration_I/lab6-user_and_group_management.uk.md b/docs/labs/systems_administration_I/lab6-user_and_group_management.uk.md index 8beaa2ce6e..7d6052d16e 100644 --- a/docs/labs/systems_administration_I/lab6-user_and_group_management.uk.md +++ b/docs/labs/systems_administration_I/lab6-user_and_group_management.uk.md @@ -11,7 +11,7 @@ tags: # Лабораторна робота 6: Керування користувачами та групами -## Завдання +## Цілі Виконавши цю лабораторну роботу, ви зможете diff --git a/docs/labs/systems_administration_II/lab6-the_file_system.uk.md b/docs/labs/systems_administration_II/lab6-the_file_system.uk.md index 91e7b4ccf0..bdebd458d3 100644 --- a/docs/labs/systems_administration_II/lab6-the_file_system.uk.md +++ b/docs/labs/systems_administration_II/lab6-the_file_system.uk.md @@ -13,7 +13,7 @@ tags: # Лабораторна робота 6: Файлова система -## Завдання +## Цілі Виконавши цю лабораторну роботу, ви зможете @@ -570,7 +570,7 @@ ext2/ext3/ext4 налагоджувач файлової системи [root@localhost ~]# losetup ``` - **Вихід** + **ВИХІД** ```bash NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC @@ -612,7 +612,7 @@ ext2/ext3/ext4 налагоджувач файлової системи [root@localhost ~]# vgdisplay ``` - **Вихід** + **ВИХІД** ```bash --- Volume group --- @@ -642,7 +642,7 @@ ext2/ext3/ext4 налагоджувач файлової системи [root@localhost ~]# vgextend rl /dev/loop1 ``` - **Вихід** + **ВИХІД** ```bash Volume group "rl" successfully extended @@ -654,7 +654,7 @@ ext2/ext3/ext4 налагоджувач файлової системи [root@localhost ~]# vgdisplay ``` - **Вихід** + **ВИХІД** ```bash --- Volume group --- @@ -682,7 +682,7 @@ ext2/ext3/ext4 налагоджувач файлової системи [root@localhost ~]# vgreduce rl /dev/loop1 ``` - **Вихід** + **ВИХІД** ```bash Removed "/dev/loop0" from volume group "rl" @@ -821,7 +821,7 @@ ext2/ext3/ext4 налагоджувач файлової системи [root@localhost ~]# mkfs.vfat /dev/loop0p1 ``` - **Вихід** + **ВИХІД** ```bash mkfs.fat 4.* @@ -833,7 +833,7 @@ ext2/ext3/ext4 налагоджувач файлової системи [root@localhost ~]# lsblk -f /dev/loop0 ``` - **Вихід** + **ВИХІД** ```bash NAME FSTYPE LABEL UUID MOUNTPOINT @@ -882,7 +882,7 @@ ext2/ext3/ext4 налагоджувач файлової системи [root@localhost ~]# lsblk -f /dev/scratch/scratch3 ``` - **Вихід** + **ВИХІД** ```bash NAME FSTYPE LABEL UUID MOUNTPOINT @@ -1151,7 +1151,7 @@ ext2/ext3/ext4 налагоджувач файлової системи of=/mnt/2gb-scratch2-volume/LARGE-USELESS-FILE.tar bs=10240 ``` - **Вихід** + **ВИХІД** ```bash dd: error writing '/mnt/2gb-scratch2-volume/LARGE-USELESS-FILE.tar': No space left on device @@ -1296,7 +1296,7 @@ quotacheck [-gucbfinvdmMR] [-F ] filesystem|-a [root@localhost ~]# grep scratch2 /etc/fstab ``` - **Вихід** + **ВИХІД** ```bash /dev/scratch/scratch2 /mnt/2gb-scratch2-volume ext4 defaults 0 0 @@ -1340,7 +1340,7 @@ quotacheck [-gucbfinvdmMR] [-F ] filesystem|-a [root@localhost ~]# cat /proc/mounts | grep scratch2 ``` - **Вихід** + **ВИХІД** ```bash /dev/mapper/rl-scratch2 /mnt/2gb-scratch2-volume ext4 rw,relatime,quota,usrquota,grpquota 0 0 @@ -1370,7 +1370,7 @@ quotacheck [-gucbfinvdmMR] [-F ] filesystem|-a [root@localhost ~]# quotacheck -avcug ``` - **Вихід** + **ВИХІД** ```bash .... @@ -1462,7 +1462,7 @@ quotacheck [-gucbfinvdmMR] [-F ] filesystem|-a [root@localhost ~]# repquota /mnt/2gb-scratch2-volume ``` - **Вихід** + **ВИХІД** ```bash *** Report for user quotas on device /dev/mapper/scratch-scratch2 @@ -1496,7 +1496,7 @@ quotacheck [-gucbfinvdmMR] [-F ] filesystem|-a [unreasonable@localhost ~]$ dd if=/dev/zero of=/mnt/2gb-scratch2-volume/LARGE-USELESS-FILE.tar bs=10240 ``` - **Вихід** + **ВИХІД** ```bash ...... diff --git a/docs/labs/systems_administration_II/lab7-the_linux_kernel.uk.md b/docs/labs/systems_administration_II/lab7-the_linux_kernel.uk.md index 0133e06e21..3649e1248c 100644 --- a/docs/labs/systems_administration_II/lab7-the_linux_kernel.uk.md +++ b/docs/labs/systems_administration_II/lab7-the_linux_kernel.uk.md @@ -7,7 +7,7 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В # Лабораторна робота 7: Ядро Linux -## Завдання +## Цілі Після виконання цієї лабораторної роботи ви зможете: @@ -305,7 +305,7 @@ linux-.tar.bz2 (or linux-.tar.gz) 15. З’явиться діалогове вікно з пропозицією зберегти нову конфігурацію. Переконайтеся, що вибрано Yes, потім натисніть ++enter++. 16. Після завершення роботи утиліти конфігурації ядра ви повернетесь до оболонки — у дерево вихідних кодів ядра. - !!! tip "Порада" + !!! Tip "Порада" Щоб переглянути результати деяких змін, які ви внесли за допомогою інструмента `menuconfig`, скористайтеся утилітою grep, щоб переглянути безпосередньо збережений файл .config. Наприклад, щоб переглянути ефект увімкнення підтримки файлової системи `btrfs`, введіть наступне: @@ -341,7 +341,7 @@ linux-.tar.bz2 (or linux-.tar.gz) $ make O=~/build/kernel kernelversion ``` - Вихід + Вихід: ```bash make[1]: Entering directory '/home/rocky/build/kernel' @@ -355,7 +355,7 @@ linux-.tar.bz2 (or linux-.tar.gz) sudo make O=~/build/kernel -j $(nproc) ``` - Вихід + Вихід: ```bash make[1]: Entering directory '/root/build/kernel' diff --git a/docs/release_notes/8_10.uk.md b/docs/release_notes/8_10.uk.md index b4e2405ba5..eaf48cdb4f 100644 --- a/docs/release_notes/8_10.uk.md +++ b/docs/release_notes/8_10.uk.md @@ -44,7 +44,7 @@ tags: - **stunnel 5.7.1** Служба тунелювання TLS/SSL змінює поведінку OpenSSL 1.1 і пізніших версій у режимі FIPS. Окрім цієї зміни, ця версія надає багато нових функцій, таких як підтримка сучасних клієнтів PostgreSQL - **Набір інструментів OpenSSL TLS** тепер містить засоби захисту на рівні API від атак, подібних до Bleichenbacher, на процес дешифрування RSA PKCS #1 v1.5 -### Динамічні мови програмування, сервери веб та бази даних +### Мови динамічного програмування, веб-сервери та сервери баз даних Щоб отримати докладний список змін у цій категорії, перегляньте [посилання вище за посиланням тут](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/8.10_release_notes/new-features#new-features-dynamic-programming-languages-web-and-database-servers). @@ -88,7 +88,7 @@ tags: - Управління програмним забезпеченням - Оболонки та засоби командного рядка - Інфраструктурні послуги -- Мережа +- Мережі - Ядро - Файлові системи та сховище - Мови динамічного програмування, веб-сервери та сервери баз даних @@ -101,7 +101,7 @@ tags: Ознайомтеся з [списком попередніх версій](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/8.10_release_notes/known-issues), щоб отримати повну інформацію про ці проблеми. -!!! info +!!! info "інформація" ``` Деякі потоки програм, які є частиною репозиторіїв Rocky Linux 8.10, не отримуватимуть подальших оновлень. Не забувайте зазначати будь-які потоки додатків, які є EOL або застарілими, і за бажанням оновіть їх до новіших потоків. diff --git a/docs/release_notes/8_8.uk.md b/docs/release_notes/8_8.uk.md index 299ba01927..c60adad3db 100644 --- a/docs/release_notes/8_8.uk.md +++ b/docs/release_notes/8_8.uk.md @@ -141,7 +141,7 @@ tags: * Ядро * Завантажувач * Файлові системи та сховище -* Динамічні мови програмування, сервери веб та бази даних +* Мови динамічного програмування, веб-сервери та сервери баз даних * Управління ідентифікацією * Робочий стіл * Графічна інфраструктура diff --git a/docs/release_notes/8_9.uk.md b/docs/release_notes/8_9.uk.md index 69e06ce828..2ddda7959f 100644 --- a/docs/release_notes/8_9.uk.md +++ b/docs/release_notes/8_9.uk.md @@ -28,7 +28,7 @@ tags: ### Важливі зміни -- Додаткова група «гостьових агентів», яка раніше була доступна як у базовому середовищі _Minimal Install_, так і в _Custom Operating System_ в Anaconda, більше не доступна для вибору як додаткового програмного забезпечення для цих середовищ. Якщо вам потрібна група `guest-agent`, вона доступна в базовому середовищі _Server_ або _Server with GUI_. Якщо ви інсталюєте _Minimal Install_ або _Custom Operating System_ і все ще хочете мати гостьових агентів, ви можете зробити це, встановивши цільовий пакет безпосередньо в Kickstart або встановивши його за допомогою DNF після завершення інсталяції (тобто dnf install @guest-agents). +- Додаткова група «guest-agents», яка раніше була доступна в базових середовищах _Minimal Install_ та _Custom Operating System_ в Anaconda, більше не доступна для вибору як додаткове програмне забезпечення для цих середовищ. Якщо вам потрібна група `guest-agent`, вона доступна в базовому середовищі _Server_ або _Server with GUI_. Якщо ви інсталюєте _Minimal Install_ або _Custom Operating System_ і все ще хочете мати гостьових агентів, ви можете зробити це, встановивши цільовий пакет безпосередньо в Kickstart або встановивши його за допомогою DNF після завершення інсталяції (тобто dnf install @guest-agents). #### Живі образи @@ -42,7 +42,7 @@ tags: ### Інсталятор і створення образу -Удосконалення образу AMI з 64-розрядною архітектурою AWS EC2 AMD або Intel для підтримки завантаження UEFI та старої версії BIOS. +Вдосконалення образу AMI для 64-бітної архітектури AWS EC2 AMD або Intel для підтримки завантаження UEFI на додаток до завантаження за допомогою застарілого BIOS. ### Безпека @@ -89,7 +89,7 @@ tags: - Управління програмним забезпеченням - Оболонки та засоби командного рядка - Інфраструктурні послуги -- Мережа +- Мережі - Ядро - Файлові системи та сховище - Мови динамічного програмування, веб-сервери та сервери баз даних diff --git a/docs/release_notes/9_3.uk.md b/docs/release_notes/9_3.uk.md index 68e4be68fb..a2a8377d30 100644 --- a/docs/release_notes/9_3.uk.md +++ b/docs/release_notes/9_3.uk.md @@ -118,7 +118,7 @@ HTTP-сервер Apache оновлено до версії 2.4.57 - Управління програмним забезпеченням - Оболонки та засоби командного рядка - Інфраструктурні послуги -- Мережа +- Мережі - Ядро - Файлова система та сховище - Мови динамічного програмування, веб-сервери та сервери баз даних From f5bed1a6ef98cd70535db0c3d85ebbb32d45c2e8 Mon Sep 17 00:00:00 2001 From: ambaradan <87865413+ambaradan@users.noreply.github.com> Date: Tue, 19 Aug 2025 15:23:10 +0200 Subject: [PATCH 109/164] revision - 'lab5-networking' and 'lab6-user_and_group_management' (#2836) - moved 'main title' to frontmatter - fixed the structure of the headers - added inline codes and italics for paths and file names where missing - added some additional descriptions for the exercise commands --- .../lab5-networking.md | 247 +++++++++--------- .../lab6-user_and_group_management.md | 239 +++++++++-------- 2 files changed, 243 insertions(+), 243 deletions(-) diff --git a/docs/labs/systems_administration_I/lab5-networking.md b/docs/labs/systems_administration_I/lab5-networking.md index 6c59e77a57..f5cf9fe104 100644 --- a/docs/labs/systems_administration_I/lab5-networking.md +++ b/docs/labs/systems_administration_I/lab5-networking.md @@ -1,6 +1,7 @@ --- -author: Wale Soyinka -contributors: Steven Spencer, Ganna Zhyrnova +author: Wale Soyinka +title: Lab 5 - Networking Essentials +contributors: Steven Spencer, Ganna Zhyrnova, Franco Colussi tested on: All Versions tags: - lab exercise @@ -11,16 +12,13 @@ tags: - macvtap --- - -# Lab 5: Networking Essentials - ## Objectives After completing this lab, you will be able to: - Create virtual network devices - Manage network devices and settings on a Linux system using the `iproute2` (`ip`) toolkit -- Manage network devices and settings on a Linux system using NetworkManager (`nmcli`) toolkit +- Manage network devices and settings on a Linux system using *NetworkManager* (`nmcli`) toolkit - Troubleshoot common network issues Estimated time to complete this lab: 60 minutes @@ -29,15 +27,27 @@ Estimated time to complete this lab: 60 minutes This Networking Essentials lab covers various network configuration and troubleshooting exercises on a Linux server. You will be better equipped to manage and troubleshoot network settings using common networking utilities readily available on Linux based systems. -## Exercise 1 +### Introduction to the commands used + +The `iproute2` command is a suite of advanced utilities for configuring and managing networks on Linux systems, developed to replace the traditional *net-tools* suite (such as *ifconfig*, *route*, and *arp*). +`iproute2` is designed to manage modern Linux kernel features, including namespaces, policy routing, and advanced QoS. It is now the recommended tool for network administration on modern Linux distributions. + +The `ip` command is an essential tool for network management and configuration. It is part of the `iproute2` package and offers advanced control over network interfaces, IP addresses, routing tables, tunnels, and much more. +Thanks to its flexible syntax and options, it allows system administrators to monitor, modify, and resolve connectivity issues efficiently. +Its modular structure allows you to manage different aspects of network configuration in a consistent manner, thus simplifying administration. -### Change Hostname +The `nmcli` command is a powerful and versatile tool included in *NetworkManager*, designed for managing network connections on Linux systems directly from the terminal. Unlike graphical tools, `nmcli` allows you to efficiently configure, monitor, and control network interfaces on both local and remote machines, making it particularly useful for system administrators and advanced users. +It supports a wide range of features, including the configuration of wired, wireless, and VPN connections, mobile network management, and network status debugging. -There are many methods for identifying or referring to computers. Some of these methods guarantee uniqueness [ especially on a network], and others don't. A computer hostname can be regarded as a human-friendly name. Computer hostnames should ideally be unique depending on how they are managed and assigned. But because anyone with the Administrative privileges on a system can unilaterally assign whatever hostname they want to the system - uniqueness is not always guaranteed. +## Exercises + +### 1. Change Hostname + +There are many methods for identifying or referring to computers. Some of these methods guarantee uniqueness (especially on a network), and others don't. A computer hostname can be regarded as a human-friendly name. Computer hostnames should ideally be unique depending on how they are managed and assigned. But because anyone with the administrative privileges on a system can unilaterally assign whatever hostname they want to the system - **uniqueness is not always guaranteed**. This first exercise walks through some common tools for managing the computer hostname. -#### To change the system's hostname +#### Changing the system's hostname 1. While logged into your system, view the current *hostname*, using the popular `hostname` utility. Type: @@ -95,27 +105,27 @@ This first exercise walks through some common tools for managing the computer ho !!! Question - Consult the man page for `hostnamectl`. What are the differences between pretty, transient and static hostnames? + Consult the man page for `hostnamectl`. What are the differences between *pretty*, *transient* and *static* hostnames? -## Exercise 2 +### 2. Creation of a virtual device -The first critical step you need to complete before going on to the other exercises in this network lab will be creating a special virtual network interface known as a MACVTAP device. +The first critical step you need to complete before going on to the other exercises in this network lab will be creating a special virtual network interface known as a *MACVTAP device*. -MACVTAP devices are virtual devices that combine the properties of a software-only interface known as a TAP device as well as the properties of the MACVLAN driver. +MACVTAP devices are virtual devices that combine the properties of a software-only interface known as a *TAP device* as well as the properties of the *MACVLAN driver*. Creating and working with these MACVTAP devices will allow you to safely test, change, and configure various network configuration-related tasks. These virtual network interfaces will be used in various exercises without disrupting the existing network configuration. !!! tip - TAP devices provide a software-only interface that user-space applications can easily access. TAP devices send and receive raw Ethernet frames. - MACVLAN is used for creating virtual network interfaces that attach to physical network interfaces. + TAP devices provide a software-only interface that user-space applications can easily access. TAP devices send and receive raw Ethernet frames. + MACVLAN is used for creating virtual network interfaces that attach to physical network interfaces. The MACVTAP devices have their own unique MAC address distinct from the MAC address of the underlying physical network card they are associated with. -### Create MACVTAP Interfaces +#### Creation of a MACVTAP Interfaces This exercise starts with creating needed MACVTAP virtual network interfaces. This will allow you to safely test, change, and configure various network configuration related tasks. These virtual network interfaces will be used in various exercises without disrupting the existing network configuration. -#### To list all network interfaces on the system +#### Listing all network interfaces on the system 1. Ensure you are logged into the server. @@ -131,13 +141,13 @@ This exercise starts with creating needed MACVTAP virtual network interfaces. Th nmcli -f DEVICE device ``` -4. Query the low-level /sys virtual file-system to enumerate ALL network interfaces available on your server manually. Type: +4. Query the low-level `/sys` virtual file-system to enumerate *ALL* network interfaces available on your server manually. Type: ```bash ls -l /sys/class/net/ | grep -v 'total' | awk '{print $9}' ``` -#### To create `macvtap` interfaces +#### Creating `macvtap` interfaces 1. Ensure you are logged into the system as a user with Administrative privileges. @@ -145,22 +155,19 @@ This exercise starts with creating needed MACVTAP virtual network interfaces. Th ```bash ls -l /sys/class/net/ | grep -v 'virtual\|total' | tail -n 1 | awk '{print $9}' - eno2 ``` - The output on the sample demo system shows one suitable interface named eno2. + The output on the sample demo system shows one suitable interface named `eno2`. -3. Run the command to identify the device again but this time store the returned value in a variable named $DEVICE1. Double check the value of $DEVICE1 using echo. Type the following 2 separate commands to accomplish this: +3. Run the command to identify the device again but this time store the returned value in a variable named `$DEVICE1`. Double check the value of `$DEVICE1` using *echo*. Type the following 2 separate commands to accomplish this: ```bash - # DEVICE1=$(ls -l /sys/class/net/ | grep -v 'virtual\|total' | tail -n 1 | awk '{print $9}') - - # echo $DEVICE1 + DEVICE1=$(ls -l /sys/class/net/ | grep -v 'virtual\|total' | tail -n 1 | awk '{print $9}') + echo $DEVICE1 ``` -4. Now, create a MACVTAP interface named - `macvtap1`. The new interface will be associated with - $DEVICE1. Type: +4. Now, create a MACVTAP interface named - `macvtap1`. The new interface will be associated with `$DEVICE1`. Type: ```bash ip link add link $DEVICE1 name macvtap1 type macvtap mode bridge @@ -172,19 +179,17 @@ This exercise starts with creating needed MACVTAP virtual network interfaces. Th ip --brief link show macvtap1 ``` - Note the DOWN state of the `macvtap` interface in the output. + Note the **DOWN** state of the `macvtap` interface in the output. -6. View detailed information about all the MACVTAP-type network devices on the system. Type: +6. View detailed information about all the *MACVTAP-type* network devices on the system. Type: ```bash ip --detail link show type macvtap ``` -7. Run a command to view all the network interfaces on the server and compare the output to the output of the similar command in the earlier section "To list all network interfaces on the system". - -### Enable/Disable Network Interface +7. Run a command to view all the network interfaces on the server and compare the output to the output of the similar command in the earlier section "Listing all network interfaces on the system". -#### To enable or disable a network interface +#### Enabling/Disabling Network Interfaces 1. Check the status of the `macvtap1` network interface. Type: @@ -201,12 +206,13 @@ This exercise starts with creating needed MACVTAP virtual network interfaces. Th 3. Verify the status changes by running: ```bash - ip -br link show macvtap1 + ip -br link show macvtap1 ``` !!! TIP - If you ever need to disable a network interface, the syntax for `ip` command to do this is `ip link set down`. For example to disable a network interface named `macvtap7`, you would run: + If you ever need to disable a network interface, the syntax for `ip` command to do this is `ip link set down`. + For example to disable a network interface named `macvtap7`, you would run: ```bash ip link set macvtap7 down @@ -214,25 +220,25 @@ This exercise starts with creating needed MACVTAP virtual network interfaces. Th Now that you have set up the `macvtap` interfaces, you safely perform the various network configuration and troubleshooting tasks in the remaining exercises. -## Exercise 3 +### 3. Assign IP Addresses -### Assign IP Addresses +An **IP** (*Internet Protocol*) address is a unique numerical identifier assigned to each device connected to a network that uses the IP protocol for communication. It functions as a digital “*address*” that allows devices to send and receive data across a network, whether local (*LAN*) or global (*Internet*). -#### To set an IP addresses on a network interface +#### Setting an IPv4 address to `macvtap` interfaces 1. View the IP addresses for all network interfaces on your server. Type: ```bash - ip address show + ip address show ``` -2. Assign the IP address - 172.16.99.100 - to `macvtap1`. Type +2. Assign the IPv4 address - **172.16.99.100** - to `macvtap1`. Type ```bash - ip address add 172.16.99.100/24 dev macvtap1 + ip address add 172.16.99.100/24 dev macvtap1 ``` -3. Verify the IP address assignment for `macvtap1` +3. Verify the IPv4 address assignment for `macvtap1` ```bash ip address show macvtap1 @@ -241,16 +247,12 @@ Now that you have set up the `macvtap` interfaces, you safely perform the variou 4. Use the `nmcli` command to view the IPv4 addresses for all interfaces on your system. Type: ```bash - nmcli --get-values IP4.ADDRESS,GENERAL.DEVICE device show + nmcli --get-values IP4.ADDRESS,GENERAL.DEVICE device show ``` -## Exercise 4 - -### Configure IPv6 Addresses - -#### To assign IPv6 addresses to `macvtap` interfaces +#### Setting an IPv6 address to `macvtap` interfaces -1. Starting with `macvtap1`, assign the 2001:db8::1/64 IPv6 address to `macvtap1` by running: +1. Starting with `macvtap1`, assign the **2001:db8::1/64** IPv6 address to `macvtap1` by running: ```bash ip -6 address add 2001:db8::1/64 dev macvtap1 @@ -265,14 +267,15 @@ Now that you have set up the `macvtap` interfaces, you safely perform the variou 4. Use `nmcli` to view the IPv6 addresses for all interfaces on your system. Type: ```bash - nmcli --get-values IP6.ADDRESS,GENERAL.DEVICE device show + nmcli --get-values IP6.ADDRESS,GENERAL.DEVICE device show ``` -## Exercise 5 +### 5. Routing management -### Routing management +Routing in Linux is a mechanism that allows the operating system to manage network traffic by directing data packets to the correct destinations. The Linux kernel uses a routing table to determine the optimal path that packets should follow, based on *IP addresses*, *subnet masks*, and *gateways*. +This functionality is essential in both *home environments* and complex *corporate networks*, where multiple network interfaces and devices need to communicate with each other. -#### To view the system's routing table +#### Viewing the system routing table 1. Display the current routing table for the system. Type: @@ -283,44 +286,43 @@ Now that you have set up the `macvtap` interfaces, you safely perform the variou 192.168.2.0/24 dev enp1s0 proto kernel scope link src 192.168.2.121 metric 100 ``` -2. Using one of the networks displayed in the leftmost column of the previous command's output as the argument, display the route table entry for that network. For example to show the kernel route table entry for the 10.99.99.0/24 network, type: +2. Using one of the networks displayed in the leftmost column of the previous command's output as the argument, display the route table entry for that network. For example to show the kernel route table entry for the **10.99.99.0/24** network, type: ```bash ip route show 10.99.99.0/24 ``` 3. Query the system to see the route that will be used to get to an example arbitrary - destination. For example to view the routing details for getting to the destination IP address - 8.8.8.8, type: + destination. For example to view the routing details for getting to the destination IP address **8.8.8.8**, type: ```bash ip route get 8.8.8.8 - 8.8.8.8 via 192.168.2.1 dev enp1s0 src 192.168.2.121 uid 0 cache ``` Here is a breakdown of the output in plain-speak: - - Destination IP Address: 8.8.8.8 is the IP address that we are trying to reach - - Via: 192.168.2.1 is the next hop IP address that the packet will be sent to reach the destination - - Device: `enp1s0` is the network interface that will be used to send the packet - - Source IP Address: 192.168.2.121 is the IP address of the network interface that will be used as the source address for the packet - - UID: 0 is the user ID of the process that initiated this command - - Cache: This field indicates whether this route is cached in the kernel’s routing table + - *Destination IP Address*: **8.8.8.8** is the IP address that we are trying to reach + - *Via*: **192.168.2.1** is the next hop IP address that the packet will be sent to reach the destination + - *Device*: **enp1s0** is the network interface that will be used to send the packet + - *Source IP Address*: **192.168.2.121** is the IP address of the network interface that will be used as the source address for the packet + - *UID*: **0** is the user ID of the process that initiated this command + - *Cache*: This field indicates whether this route is cached in the kernel’s routing table 4. Now view how the system will route a packet from one IP to another destination IP address. Type: ```bash ip route get from 192.168.1.1 to 192.168.1.2 - + local 192.168.1.2 from 192.168.1.1 dev lo uid 0 cache ``` -### Set Default Gateway +#### Configuring the default gateway for the system -#### To configure a default gateway for the system +In a Linux system, the default gateway represents the default access point through which network traffic is routed to external networks not directly connected to the local interface. +Its correct configuration is essential to ensure a system's connectivity to remote networks and external services. 1. Use `ip` to query for and list the current default gateway on your system. Type: @@ -340,11 +342,9 @@ Now that you have set up the `macvtap` interfaces, you safely perform the variou ip route show default ``` -### Add Static Route +#### Adding a static route to the routing table -#### To add a static route to the routing table - -1. Add a demo static route for a bogus 172.16.0.0/16 network via 192.168.1.2. Type: +1. Add a demo static route for a bogus **172.16.0.0/16** network via **192.168.1.2**. Type: ```bash ip route add 172.16.0.0/16 via 192.168.1.2 @@ -356,11 +356,9 @@ Now that you have set up the `macvtap` interfaces, you safely perform the variou ip route show 172.16.0.0/16 ``` -### Delete Static Route - -#### To Remove a static route from the routing table +#### Removing a static route from the routing table -1. Delete the static route for 10.0.0.0/24 +1. Delete the static route for **10.0.0.0/24** ```bash ip route del 10.0.0.0/24 via 192.168.1.2 @@ -372,15 +370,12 @@ Now that you have set up the `macvtap` interfaces, you safely perform the variou ip route show ``` -## Exercise 6 - -### Deleting IP addresses - -This exercise walks through how to delete configured IP (IPv4 and IPv6) addresses on network interfaces. +### 6. Delete IP addresses -### Delete IPv4 Address +Removing IP addresses from the server is a fundamental operation for managing network security and resources. This procedure may be necessary for several reasons: mitigating DDoS attacks, revoking access to malicious users, freeing up IP addresses that are no longer in use, or complying with corporate security policies. +This exercise walks through how to delete configured IP (*IPv4* and *IPv6*) addresses on network interfaces. -#### To remove an assigned IP address from a network interface +#### Removing an assigned IPv4 address from a network interface 1. Delete the IP address on `macvtap1`. Type: @@ -394,9 +389,7 @@ This exercise walks through how to delete configured IP (IPv4 and IPv6) addresse ip address show macvtap1 ``` -### Delete IPv6 Address - -#### To remove an assigned IPv6 address from a network interface +#### Removing an assigned IPv6 address from a network interface 1. Delete the IPv6 address on `macvtap1` with this command: @@ -410,18 +403,17 @@ This exercise walks through how to delete configured IP (IPv4 and IPv6) addresse ip -6 address show macvtap1 ``` -## Exercise 7 - -### Configure Network Interfaces via `nmcli` +### 7. Configure Network Interfaces via `nmcli` +The `nmcli` (*NetworkManager Command Line Interface*) command is a tool for managing network connections. Designed to interact with *NetworkManager*, it allows you to efficiently control, configure, and monitor networks directly from the terminal, without the need for graphical interfaces. This exercise shows how to configure network interfaces using the NetworkManager tooling. !!! Note - By default, any network configuration changes done using `nmcli` (NetworkManager) will persist between system reboots. + By default, any network configuration changes done using `nmcli` will persist between system reboots. This is in contrast to the configuration changes that are done with the `ip` utility. -#### To create a `macvtap` interface using `nmcli` +#### Creating a `macvtap` interface using `nmcli` 1. Start by listing all available network devices by running: @@ -429,13 +421,13 @@ This exercise shows how to configure network interfaces using the NetworkManager nmcli device ``` -2. Next, identify an underlying network device with which to associate the new MACVTAP interface. Save the value of the identified device in the variable $DEVICE2. Type: +2. Next, identify an underlying network device with which to associate the new *MACVTAP interface*. Save the value of the identified device in the variable `$DEVICE2`. Type: ```bash DEVICE2=$(ls -l /sys/class/net/ | grep -v 'virtual\|total' | tail -n 1 | awk '{print $9}') ``` -3. Now, create a new NetworkManager connection called `macvtap2` and an associated MACVTAP interface named - `macvtap2`. The new interface will be associated with $DEVICE2. Type: +3. Now, create a new *NetworkManager* connection called `macvtap2` and an associated MACVTAP interface named - `macvtap2`. The new interface will be associated with `$DEVICE2`. Type: ```bash nmcli con add con-name macvtap2 type macvlan mode bridge tap yes dev $DEVICE2 ifname macvtap2 @@ -459,29 +451,29 @@ This exercise shows how to configure network interfaces using the NetworkManager ip --brief link show macvtap2 ``` - Note the output's UP state of the `macvtap` interface. + Note the output's **UP** state of the `macvtap` interface. !!! Question - What is the difference between the concept of a connection and that of a device in NetworkManager? + What is the difference between the concept of a *connection* and that of a *device* in NetworkManager? -#### To modify interface network configuration with `nmcli` +#### Modifying the network configuration of the interface with `nmcli` -1. Start by querying for the IPv4 address for the new `macvtap2` interface by running: +1. Start by querying for the *IPv4* address for the new `macvtap2` interface by running: ```bash nmcli -f ipv4.addresses con show macvtap2 ``` - The value of the ipv4.addresses property should be empty. + The value of the **ipv4.addresses** property should be empty. 2. Configure the `macvtap2` connection with these settings: - - IPv4 Method = manual - - IPv4 Addresses = 172.16.99.200/24 - - Gateway = 172.16.99.1 - - DNS Servers = 8.8.8.8 and 8.8.4.4 - - DNS Search domain = example.com + - *IPv4 Method* = **manual** + - *IPv4 Addresses* = **172.16.99.200/24** + - *Gateway* = **172.16.99.1** + - *DNS Servers* = **8.8.8.8 and 8.8.4.4** + - *DNS Search domain* = **example.com** Type: @@ -505,15 +497,15 @@ This exercise shows how to configure network interfaces using the NetworkManager !!! Question - What is the difference between these NetworkManager properties - ipv4.addresses and IP4.ADDRESS? + What is the difference between these NetworkManager properties - *ipv4.addresses* and *IP4.ADDRESS*? 5. Check the changes to the network connection using the `ip` command. Type: ```bash - ip -br address show dev macvtap2 + ip -br address show dev macvtap2 ``` -6. To properly apply the new settings and make them the new runtime values, use `nmcli` to first toggle the connection down (i.e. deactivate it). Type: +6. To properly apply the new settings and make them the new runtime values, use `nmcli` to first toggle the connection **down** (i.e. deactivate it). Type: ```bash nmcli connection down macvtap2 @@ -529,17 +521,17 @@ This exercise shows how to configure network interfaces using the NetworkManager Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/6) ``` -8. View the final setting using the ip utility. Type: +8. View the final setting using the `ip` utility. Type: ```bash ip -br address show dev macvtap2 ``` -## Exercise 8 +### 8. Configure DNS Servers -### Configure DNS Servers +The **DNS** (*Domain Name System*) service is a fundamental component of computer networks, responsible for resolving *domain names* into *IP addresses* and vice versa. This enables communication within local networks and on the Internet. -#### To set DNS server addresses for the system +#### Setting a DNS server addresses for the system 1. Configure DNS servers for `macvtap1` @@ -553,11 +545,13 @@ This exercise shows how to configure network interfaces using the NetworkManager nmcli con show macvtap1 | grep DNS ``` -## Exercise 9 +### 9. Troubleshoot network issues -### Troubleshoot network issues +Computer networks are essential for communication and data exchange, but they often encounter problems that hinder their proper functioning. These malfunctions can be caused by a variety of factors, such as configuration errors, hardware failures, or connection interference. -#### To Identify and troubleshoot common network issues +#### Identify and resolve common network issues + +Monitoring and verifying the status of network interfaces is essential to ensuring the proper functioning of a connected system. 1. Check the status of network interfaces @@ -565,13 +559,17 @@ This exercise shows how to configure network interfaces using the NetworkManager ip link show ``` -2. Test network connectivity to a remote host (e.g., google.com) +This step allows you to verify whether a device can reach another node on the network, be it a server, router, or another client. + +2. Test network connectivity to a remote host (e.g., *google.com*) ```bash ping google.com ``` -3. Try pinging the local gateway. Type: +Pinging the local gateway is an essential test to ensure that the connection between a device and its default router is working properly. The gateway is the access point to external networks, and a malfunction at this stage can prevent access to the Internet or other subnets. + +3. Try pinging the local *gateway*. Type: ```bash ping _gateway @@ -579,11 +577,13 @@ This exercise shows how to configure network interfaces using the NetworkManager !!! Question - Through what mechanism is your system able to correctly resolve the name `_gateway` to the proper IP address for your locally configured default gateway? + Through what mechanism is your system able to correctly resolve the name `_gateway` to the proper *IP address* for your locally configured *default gateway*? -### View Active Connections +#### View Active Connections -#### To List all active network connections +Active network connections represent open communication channels between your computer and other devices or services on the network. These connections can be local (within the same machine) or remote (to external servers or clients). + +#### Listing all active network connections 1. List all active network connections @@ -591,9 +591,12 @@ This exercise shows how to configure network interfaces using the NetworkManager ss -tuln ``` -### Monitor Network Traffic +#### Monitor Network Traffic + +Network traffic in Linux represents the set of data exchanged between a system and the network, both incoming and outgoing. This flow of information is essential for the functioning of services such as the web, email, file transfer, and communication between devices. +Monitoring and managing these informations is critical to ensuring security, debugging, and optimizing network performance. -#### To monitor network traffic in real-time +#### Monitoring network traffic in real-time 1. Capture network traffic on a specific interface (e.g., `macvtap1`) @@ -603,9 +606,11 @@ This exercise shows how to configure network interfaces using the NetworkManager Analyze captured packets and observe network activity. You can stop the packet capture when done by pressing ++ctrl+c++ -### View Network Logs +#### View Network Logs + +Network logs are essential for monitoring, troubleshooting, and system security. Every time a data packet is sent or received over the network, the operating system records detailed information about these activities. These logs help system administrators identify suspicious connections, configuration errors, and potential security threats. -#### To view NetworkManager daemon related logs for troubleshooting +#### Viewing NetworkManager daemon logs for troubleshooting 1. View network-related logs diff --git a/docs/labs/systems_administration_I/lab6-user_and_group_management.md b/docs/labs/systems_administration_I/lab6-user_and_group_management.md index 1f7ed027a4..be93584129 100644 --- a/docs/labs/systems_administration_I/lab6-user_and_group_management.md +++ b/docs/labs/systems_administration_I/lab6-user_and_group_management.md @@ -1,6 +1,7 @@ --- -author: Wale Soyinka -contributors: Steven Spencer, Ganna Zhyrnova +author: Wale Soyinka +title: Lab 6 - User and group management +contributors: Steven Spencer, Ganna Zhyrnova, Franco Colussi tested on: All versions tags: - introduction system administration @@ -9,8 +10,6 @@ tags: - groups --- -# Lab 6: User and group management - ## Objectives After completing this lab, you will be able to @@ -28,7 +27,7 @@ User management is important in any multi-user network operating system. Linux i Managing users on a system is intricately tied to the system's security. There is an old saying that: ->A system is as secure as its weakest user. +> A system is as secure as its weakest user. Linux inherits the old UNIX tradition of governing access to files, programs and other resources on a per-user and per-group basis. @@ -38,7 +37,7 @@ We'll also briefly examine file permissions and ownership. Important user and group management files are below. Some of the fields or entries in the files are also discussed. -### /etc/passwd +### `/etc/passwd` - **Purpose:** user account information - **Content:** @@ -50,7 +49,7 @@ Important user and group management files are below. Some of the fields or entri - user home directory - default shell -### /etc/shadow +### `/etc/shadow` - **Purpose:** secure user account information - **Content:** @@ -64,7 +63,7 @@ Important user and group management files are below. Some of the fields or entri - days since Jan. 1, 1970 when account will be disabled - reserved -### /etc/group +### `/etc/group` - **Purpose:** group information - **Content:** @@ -73,7 +72,7 @@ Important user and group management files are below. Some of the fields or entri - the group id (GID) - list of users belonging to the group -### /etc/skel +### `/etc/skel` - **Purpose:** Stores templates to be applied to new accounts @@ -83,94 +82,101 @@ Some common utilities used in the day-to-day user and group management tasks are ### `useradd` - ```bash +- The `useradd` command is a user management tool that allows system administrators to create new user accounts directly from the command line. + ```bash Usage: useradd [options] LOGIN useradd -D useradd -D [options] Options: --badname do not check for bad names - -b, --base-dir BASE_DIR base directory for the home directory of the new account - --btrfs-subvolume-home use BTRFS subvolume for home directory - -c, --comment COMMENT GECOS field of the new account - -d, --home-dir HOME_DIR home directory of the new account - -D, --defaults print or change default useradd configuration - -e, --expiredate EXPIRE_DATE expiration date of the new account - -g, --gid GROUP name or ID of the primary group of the new account - -G, --groups GROUPS list of supplementary groups of the new account - -h, --help display this help message and exit - -k, --skel SKEL_DIR use this alternative skeleton directory - -K, --key KEY=VALUE override /etc/login.defs defaults - -l, --no-log-init do not add the user to the lastlog and faillog databases - -m, --create-home create the user's home directory - -M, --no-create-home do not create the user's home directory - -N, --no-user-group do not create a group with the same name as the user - -o, --non-unique allow to create users with duplicate (non-unique) UID - -p, --password PASSWORD encrypted password of the new account - -r, --system create a system account - -R, --root CHROOT_DIR directory to chroot into - -P, --prefix PREFIX_DIR prefix directory where are located the /etc/* files - -s, --shell SHELL login shell of the new account - -u, --uid UID user ID of the new account - -U, --user-group create a group with the same name as the user - -Z, --selinux-user SEUSER use a specific SEUSER for the SELinux user mapping + -b, --base-dir BASE_DIR base directory for the home directory of the new account + --btrfs-subvolume-home use BTRFS subvolume for home directory + -c, --comment COMMENT GECOS field of the new account + -d, --home-dir HOME_DIR home directory of the new account + -D, --defaults print or change default useradd configuration + -e, --expiredate EXPIRE_DATE expiration date of the new account + -g, --gid GROUP name or ID of the primary group of the new account + -G, --groups GROUPS list of supplementary groups of the new account + -h, --help display this help message and exit + -k, --skel SKEL_DIR use this alternative skeleton directory + -K, --key KEY=VALUE override /etc/login.defs defaults + -l, --no-log-init do not add the user to the lastlog and faillog databases + -m, --create-home create the user's home directory + -M, --no-create-home do not create the user's home directory + -N, --no-user-group do not create a group with the same name as the user + -o, --non-unique allow to create users with duplicate (non-unique) UID + -p, --password PASSWORD encrypted password of the new account + -r, --system create a system account + -R, --root CHROOT_DIR directory to chroot into + -P, --prefix PREFIX_DIR prefix directory where are located the /etc/* files + -s, --shell SHELL login shell of the new account + -u, --uid UID user ID of the new account + -U, --user-group create a group with the same name as the user + -Z, --selinux-user SEUSER use a specific SEUSER for the SELinux user mapping ``` ### `groupadd` +- The `groupadd` command is a utility for managing user groups on the system. Available in most Linux distributions, this command allows administrators to create new groups, specifying options such as the GID (Group ID), the group name, and other properties. + ```bash Usage: groupadd [options] GROUP - + Options: - -f, --force exit successfully if the group already exists, and cancel -g if the GID is already used - -g, --gid GID use GID for the new group - -h, --help display this help message and exit - -K, --key KEY=VALUE override /etc/login.defs defaults - -o, --non-unique allow to create groups with duplicate (non-unique) GID - -p, --password PASSWORD use this encrypted password for the new group - -r, --system create a system account - -R, --root CHROOT_DIR directory to chroot into - -P, --prefix PREFIX_DI directory prefix - -U, --users USERS list of user members of this group + -f, --force exit successfully if the group already exists, and cancel -g if the GID is already used + -g, --gid GID use GID for the new group + -h, --help display this help message and exit + -K, --key KEY=VALUE override /etc/login.defs defaults + -o, --non-unique allow to create groups with duplicate (non-unique) GID + -p, --password PASSWORD use this encrypted password for the new group + -r, --system create a system account + -R, --root CHROOT_DIR directory to chroot into + -P, --prefix PREFIX_DIR directory prefix + -U, --users USERS list of user members of this group ``` ### `passwd` +- The `passwd` command is a tool for managing user passwords. It allows users to change their own passwords, while administrators (root) can reset other accounts' passwords, manage password expiration, and configure security policies. + ```bash Usage: passwd [OPTION...] - -k, --keep-tokens keep non-expired authentication tokens - -d, --delete delete the password for the named account (root only); also removes password lock if any - -l, --lock lock the password for the named account (root only) - -u, --unlock unlock the password for the named account (root only) - -e, --expire expire the password for the named account (root only) - -f, --force force operation - -x, --maximum=DAYS maximum password lifetime (root only) - -n, --minimum=DAYS minimum password lifetime (root only) - -w, --warning=DAYS number of days warning users receives before password expiration (root only) - -i, --inactive=DAYS number of days after password expiration when an account becomes disabled (root only) - -S, --status report password status on the named account (root only) - --stdin read new tokens from stdin (root only) + + Options: + -k, --keep-tokens keep non-expired authentication tokens + -d, --delete delete the password for the named account (root only); also removes password lock if any + -l, --lock lock the password for the named account (root only) + -u, --unlock unlock the password for the named account (root only) + -e, --expire expire the password for the named account (root only) + -f, --force force operation + -x, --maximum=DAYS maximum password lifetime (root only) + -n, --minimum=DAYS minimum password lifetime (root only) + -w, --warning=DAYS number of days warning users receives before password expiration (root only) + -i, --inactive=DAYS number of days after password expiration when an account becomes disabled (root only) + -S, --status report password status on the named account (root only) + --stdin read new tokens from stdin (root only) Help options: - -?, --help Show this help message - --usage Display brief usage message + -?, --help Show this help message + --usage Display brief usage message ``` -## Exercise 1 +## Exercises -### Manually creating a new user +### 1. Manually create a new user -So far, throughout the previous labs, you have been using the system as the most powerful user on the system – the `root` user. This is not good practice in a production system because it makes the system vulnerable, security-wise. The root user can, do and undo unlimited damage to the system. +So far, throughout the previous labs, you have been using the system as the most powerful user on the system – the **root** user. This is not good practice in a production system because it makes the system vulnerable, security-wise. The root user can, do and undo unlimited damage to the system. Other than the superuser, every other user has limited access to files and directories. Always use your machine as a normal user. Two confusing concepts will be made clear here. -- Firstly the home directory of the root user is “ /root “. -- Secondly the root directory is the topmost directory, known as the / (slash) directory. - (“/root” is different from “/ “) +- Firstly the home directory of the root user is `/root`. +- Secondly the root directory is the topmost directory, known as the `/` (slash) directory. + (`/root` is different from `/` “) -In this lab you will create a new user called “Me Mao”. The user name for “Me Mao" will be the first name - “me”. This new user will belong to the group “me”. The password will be “a1b2c3” +In this lab you will create a new user called “Me Mao”. The user name for “Me Mao" will be the first name - “**me**”. This new user will belong to the group “**me**”. The password will be “**a1b2c3**” !!! Warning @@ -188,13 +194,13 @@ In this lab you will create a new user called “Me Mao”. The user name for gdm:x:42:42::/var/gdm:/sbin/nologin ``` - You will edit the passwd file using the format displayed above. +You will edit the *passwd file* using the format displayed above. -#### To create the user +#### Creating the user 1. We will need to edit the `/etc/passwd` file. - Launch your editor of choice and open up the file “/etc/passwd” + Launch your editor of choice and open up the file `/etc/passwd` Add the text below to the bottom or end of the file: @@ -202,10 +208,10 @@ In this lab you will create a new user called “Me Mao”. The user name for me:x:500:500:me mao:/home/me:/bin/bash ``` -2. Save your changes and close the passwd file. +2. Save your changes and close the `etc/passwd` file. -3. Next we'll edit the `/etc/shadow` file. - Launch your editor and open up the “/etc/shadow” file. +3. Next we'll edit the `/etc/shadow` file. + Launch your editor and open up the `/etc/shadow` file. Add a new entry like the one below to the bottom of the file - put an asterisk (*) in the password field. Type: ```bash @@ -222,25 +228,25 @@ In this lab you will create a new user called “Me Mao”. The user name for me:x:1000:me ``` -6. Save your changes and close the group file. +6. Save your changes and close the *group file*. 7. Time to create the home directory. - Copy the entire contents of the “/etc/skel” directory into /home directory, renaming the new directory to the name of the user i.e. “/home/me”. Type: + Copy the entire contents of the `/etc/skel` directory into `/home` directory, renaming the new directory to the name of the user i.e. `/home/me`. Type: ```bash [root@localhost root]# cp -r /etc/skel /home/me ``` -8. The root user owns the directory you just created, because she created it. In order for the user “me mao” to be able to use the directory you will change the permissions/ownership of the folder. Type: +8. The root user owns the directory you just created, because she created it. In order for the user “Me Mao” to be able to use the directory you will change the permissions/ownership of the folder. Type: ```bash [root@localhost root]# chown -R me:me /home/me ``` -9. Create a password for the user. Set the value of the password to be `a!b!c!d!`. - You will use the “passwd” utility. - Type “passwd” and follow the prompts +9. Create a password for the user. Set the value of the password to be **a!b!c!d!**. + You will use the `passwd` utility. + Type “**passwd me**” and follow the prompts ```bash [root@localhost root]# passwd me @@ -252,25 +258,19 @@ In this lab you will create a new user called “Me Mao”. The user name for 10. Logout of the system when you are done. -## Exercise 2 - -### Automatically creating a new user +### 2. Automatically creating a new user There are loads of utilities available to simplify all the tasks/steps that we manually performed in the previous exercise. We only walked through the manual process of creating a user, so that you can see what actually goes on in the background. -In this exercise we will use some common utilities to manage and simplify the process. - -You will create another user account for the user “Ying Yang” the login name will be “ying”. - -And the password for "ying" will be “y@i@n@g@”. - -You will also create a group called “common” and add the user "me" and "ying" to the group. +In this exercise we will use some common utilities to manage and simplify the process. You will create another user account for the user “**Ying Yang**” the login name will be **ying**. +And the password for **ying** will be **y@i@n@g@**. +You will also create a group called “**common**” and add the user **me** and **ying** to the group. #### To automatically create a new account 1. Login to the system as root. -2. You will create the user ying using all the defaults of the `useradd` command. Type: +2. You will create the user **ying** using all the defaults of the `useradd` command. Type: ```bash [root@localhost root]# useradd -c "Ying Yang" ying @@ -289,7 +289,7 @@ You will also create a group called “common” and add the user "me" and "ying List the new entry here? -4. The user ying will not be able to login to the system until you create a password for the user. Set ying's password to be `y@i@n@g@`. Type: +4. The user **ying** will not be able to login to the system until you create a password for the user. Set ying's password to be **y@i@n@g@**. Type: ```bash [root@localhost root]# passwd ying @@ -306,16 +306,16 @@ You will also create a group called “common” and add the user "me" and "ying uid=1000(me) gid=1000(me) groups=1000(me) ``` -6. Do the same thing for the user ying. Type: +6. Do the same thing for the user **ying**. Type: ```bash [root@localhost root]# id ying - uid=501(ying) gid=501(ying) groups=501(ying) + uid=1001(ying) gid=1001(ying) groups=1001(ying) ``` #### To automatically create a new group -1. Use the `groupadd` program to create the new group “common”. +1. Use the `groupadd` program to create the new group **common**. ```bash [root@localhost root]# groupadd common @@ -327,34 +327,34 @@ You will also create a group called “common” and add the user "me" and "ying What is the command to do this? -3. Use the `usermod` command to add an existing user to an existing group. Let's add the user ying to the `common` group we just created in Step 1. Type: +3. Use the `usermod` command to add an existing user to an existing group. Let's add the user **ying** to the **common** group we just created in Step 1. Type: ```bash [root@localhost root]# usermod -G common -a ying ``` -4. Do the same things for the user me. Type: +4. Do the same things for the user **me**. Type: ```bash [root@localhost root]# usermod -G common -a me ``` -5. Run the `id` command again on the users “ying” and "me". +5. Run the `id` command again on the users **ying** and **me**. !!! Question What has changed? -6. Use the `grep` command to view changes to the `common` group entry in the file. Type: +6. Use the `grep` command to view changes to the **common** group entry in the file. Type: - ```bash + ```bash [root@localhost root]# grep common /etc/group - common:x:1002:ying,me + common:x:1002:ying,me ``` #### To modify a user account -1. Use the `usermod` command to change the comment field for the user “me”. The new comment you will add will be “first last”. Type: +1. Use the `usermod` command to change the comment field for the user **me**. The new comment you will add will be “**first last**”. Type: ```bash [root@localhost root]# usermod -c "first last" me @@ -368,15 +368,15 @@ You will also create a group called “common” and add the user "me" and "ying !!! Question - What is the user me’s login shell? + What is the user **me**’s login shell? -2. Use the `usermod` command again to change me’s login shell to the csh shell. Type: +2. Use the `usermod` command again to change **me**’s login shell to the `csh` shell. Type: ```bash [root@localhost root]# usermod -s /bin/csh me ``` -3. Finally use the `usermod` command to undo all the changes you made to the user “me” above. +3. Finally use the `usermod` command to undo all the changes you made to the user **me** above. Restore the values ( login shell etc..) to their original values. @@ -384,53 +384,49 @@ You will also create a group called “common” and add the user "me" and "ying What are the commands to do this? -## Exercise 3 - -### Set user +### 3. Setting user -It is not always convenient to log completely out of the system completely to log in as another user. This may be because you have certain tasks running and you don’t want to end them. The `su` (set user) program is used to become another user temporarily. You can “su” from a regular user account to the root account or vice-versa. +It is not always convenient to log completely out of the system completely to log in as another user. This may be because you have certain tasks running and you don’t want to end them. The `su` (*set user*) program is used to become another user temporarily. You can “su” from a regular user account to the root account or vice-versa. It changes the current user to have the access rights of the temporary user. -The HOME, LOGNAME, and USER environment variables will be set to those of the temporary user by default. +The *HOME*, *LOGNAME*, and *USER* environment variables will be set to those of the temporary user by default. #### To temporarily become another user -1. While logged in as the root user, switch to the user “me”. Type: +1. While logged in as the root user, switch to the user **me**. Type: ```bash - [root@localhost root]# su me - + [root@localhost root]# su me [me@localhost root]$ ``` - The `su` command did not prompt you for the user me’s password because you are root + The `su` command did not prompt you for the user **me**’s password because you are root -2. Change to me’s home directory. +2. Change to **me**’s home directory. ```bash [me@localhost root]$ cd - [me@localhost me]$ cd ``` -3. While temporarily logged in as me, use `su` to login as the user ying. Type: +3. While temporarily logged in as **me**, use `su` to login as the user **ying**. Type: ```bash - [me@localhost me]$ su ying + [me@localhost me]$ su ying password: [ying@localhost me]$ ``` -4. To logout of ying’s account type: +4. To logout of **ying**’s account type: ```bash [ying@localhost me]$ exit ``` - This will throw you back into me’s account. + This will throw you back into **me**’s account. -5. Logout of me’s account to get back to the root account. +5. Logout of **me**’s account to get back to the root account. !!! question @@ -442,12 +438,11 @@ The HOME, LOGNAME, and USER environment variables will be set to those of the te ```bash [root@system1 root]# su - me - [me@system1 me]$ ``` - The difference is immediately obvious. Notice the current working directory. + The difference is immediately obvious. Notice the current *working directory*. -2. Logout of the system completely and reboot the machine. +2. Logout of the system completely and **reboot** the machine. 3. All done with Lab 6! From 94a1298ab33b0b83fd59eae9a361b2962f314032 Mon Sep 17 00:00:00 2001 From: Ganna Zhyrnova <112796922+gannazhyrnova@users.noreply.github.com> Date: Tue, 19 Aug 2025 16:23:22 +0300 Subject: [PATCH 110/164] good_docs.md (#2835) minor changes --- docs/rocky_insights/blogs/good_docs.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/rocky_insights/blogs/good_docs.md b/docs/rocky_insights/blogs/good_docs.md index e0a0318104..712a235f6b 100644 --- a/docs/rocky_insights/blogs/good_docs.md +++ b/docs/rocky_insights/blogs/good_docs.md @@ -6,7 +6,7 @@ contributors: Steven Spencer ## Introduction -Translator's provide valuable insight into writing clear, concise, documentation. They know what does not translate well and what confuses a reader better than most. This document examines some of those issues and highlights best-practices for document creation. +Translators provide valuable insight into writing clear, concise documentation. They know what does not translate well and what confuses a reader better than most. This document examines some of those issues and highlights best practices for document creation. ### From the author @@ -49,7 +49,7 @@ Example: Note: If you want to use acronyms, always define them the first time: “Customer Relationship Management (CRM) system”. -By eliminating idioms and unnecessary jargon, the meaning of your document becomes more clear. Replacing contractions with the words they represent, means that translation efforts in all languages are easier. Your document is the most understandable to the reader when you replace or define acronyms. +By eliminating idioms and unnecessary jargon, the meaning of your document becomes clearer. Replacing contractions with the words they represent, means that translation efforts in all languages are easier. Your document is the most understandable to the reader when you replace or define acronyms. ## Use active voice From 1e9a8301cf0f4bb0e5dbbece687f97fd6219c70a Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Tue, 19 Aug 2025 09:23:37 -0400 Subject: [PATCH 111/164] New Crowdin updates (#2834) * New translations 9_0.md (Ukrainian) * New translations lab3-system_utilities.md (Ukrainian) * New translations lab3-bootup_and_startup.md (Ukrainian) * New translations lab7-software_management.md (Ukrainian) * New translations lab8-system_and_process_monitoring-i.md (Ukrainian) * New translations lab4-advanced_system_process_monitoring.md (Ukrainian) * New translations 10_0.md (Ukrainian) * New translations good_docs.md (Ukrainian) --- .../lab3-system_utilities.uk.md | 559 ++++++++---------- .../lab7-software_management.uk.md | 4 +- ...lab8-system_and_process_monitoring-I.uk.md | 22 +- .../lab3-bootup_and_startup.uk.md | 4 +- ...4-advanced_system_process_monitoring.uk.md | 42 +- docs/release_notes/10_0.uk.md | 35 +- docs/release_notes/9_0.uk.md | 4 +- docs/rocky_insights/blogs/good_docs.uk.md | 88 +++ 8 files changed, 381 insertions(+), 377 deletions(-) create mode 100644 docs/rocky_insights/blogs/good_docs.uk.md diff --git a/docs/labs/systems_administration_I/lab3-system_utilities.uk.md b/docs/labs/systems_administration_I/lab3-system_utilities.uk.md index 01ec0f44bd..5497c5db4a 100644 --- a/docs/labs/systems_administration_I/lab3-system_utilities.uk.md +++ b/docs/labs/systems_administration_I/lab3-system_utilities.uk.md @@ -5,9 +5,7 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В - cli - - - -# Лабораторна робота 3: Загальні системні утиліти - -## Завдання +## Цілі Виконавши цю лабораторну роботу, ви зможете @@ -17,17 +15,23 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В ## Загальні системні утиліти в системах Linux +### Що таке системна утиліта? + +У середовищі Linux *системні утиліти* — це програми та команди, які дозволяють керувати, контролювати та оптимізувати роботу операційної системи. Ці інструменти є незамінними для системних адміністраторів, розробників та досвідчених користувачів, оскільки вони спрощують такі завдання, як управління файлами, контроль процесів, налаштування мережі та багато іншого. + +На відміну від графічних інтерфейсів, багато утиліт доступні через командний рядок, що забезпечує більшу гнучкість, автоматизацію та контроль над системою. + Вправи в цій лабораторній роботі охоплюють деякі основні системні утиліти, з якими повинні бути знайомі користувачі та адміністратори. Більшість команд використовуються для навігації та керування файловою системою. Файлова система складається з файлів і каталогів. Вправи стосуватимуться використання утиліт – `pwd`, `cd`, `ls`, `rm`, `mv`, `ftp`, `cp`, `touch`, `mkdir`, `file`, `cat`, `find` та `locate`. -## Завдання 1 +## Вправи -### `cd` +### 1. Навігація по файловій системі за допомогою `cd` -"cd" означає змінити каталог. Ви почнете ці лабораторні роботи, перейшовши до інших каталогів у файловій системі. +Команда `cd` (скорочення від ==Change Directory==) є однією з найчастіше використовуваних команд в системах Linux та Unix-подібних системах. Вона дозволяє переміщатися між каталогами в файловій системі, даючи користувачам можливість переходити між папками та отримувати доступ до файлів, що містяться в них. Команда `cd` є необхідною для роботи в оболонці Linux, оскільки вона дозволяє ефективно досліджувати та організовувати файлову систему. -#### Щоб використовувати `cd` +#### Як використовувати `cd` 1. Увійдіть на комп'ютер як root @@ -57,13 +61,13 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В [root@localhost local]# cd /root ``` -6. Знову перейдіть до каталогу /usr/local/. Впишіть: +6. Знову перейдіть до каталогу `/usr/local/`. Впишіть: ```bash [root@localhost root]# cd /usr/local ``` -7. Щоб перейти до батьківського каталогу локального каталогу, введіть «cd ..» +7. Щоб перейти до батьківського каталогу локального каталогу, введіть `cd ..` ```bash [root@localhost local]# cd .. @@ -71,23 +75,21 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В !!! Question "Питання" - Що таке батьківський каталог для каталогу /usr/local/? + Що таке батьківський каталог для каталогу `/usr/local/`? -8. Щоб швидко повернутися до домашнього каталогу root, введіть «cd» без аргументів. +8. Щоб швидко повернутися до домашнього каталогу root, введіть `cd` без аргументів. ```bash [root@localhost usr]# cd - [root@localhost root]# ``` -## Завдання 2 - -### `pwd` +### 2. Відобразити шлях за допомогою `pwd` -"pwd" означає "поточний робочий каталог". Він показує розташування у файловій системі, де ви перебуваєте. +Команда `pwd` (==Поточний робочий каталог (Present Working Directory)==) показує користувачеві абсолютний шлях до поточного каталогу в файловій системі. Вона використовується для визначення поточного розташування під час роботи в терміналі, коли ви хочете точно знати, де ви знаходитесь. +Ця команда є необхідною для навігації по файловій системі, особливо під час роботи зі складними шляхами або автоматизованими скриптами. -#### Щоб використовувати `pwd` +#### Як використовувати `pwd` 1. Щоб дізнатися тип поточного робочого каталогу @@ -96,7 +98,7 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В /root ``` -2. Змініть свій каталог на /usr/local/ за допомогою команди «cd». +2. Перейдіть до каталогу `/usr/local/` за допомогою команди `cd`: ```bash [root@localhost root]# cd /usr/local @@ -112,30 +114,28 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В 4. Повернутися до домашнього каталогу root. ```bash - [root@localhost root]# cd + [root@localhost root]# cd ``` -## Завдання 3 - -### `mkdir` +### 3. Створіть папки за допомогою `mkdir` -Команда «mkdir» використовується для створення каталогів. Ви створите два каталоги під назвою «folder1» і «folder2». +Команда `mkdir` (==Створити каталог==) дозволяє створювати нові каталоги (папки) у файловій системі. У цьому вправі ви створите дві папки з іменами `folder1` та `folder2`. -#### Щоб використовувати `mkdir` +#### Як використовувати `mkdir` -1. Впишіть: +1. Створіть перший каталог під назвою `folder1` ```bash [root@localhost root]# mkdir folder1 ``` -2. Створіть другий каталог під назвою folder2 +2. Створіть другий каталог під назвою `folder2` ```bash - [root@localhost root]# mkdir folder2 + [root@localhost root]# mkdir folder2 ``` -3. Тепер змініть свій робочий каталог на каталог “folder1”, який ви створили вище. +3. Тепер змініть робочу директорію на директорію `folder1`, яку ви створили вище. ```bash [root@localhost root]# cd folder1 @@ -150,25 +150,24 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В !!! question "Питання" - Не виходячи з поточного каталогу, перейдіть до каталогу «folder2». Яка команда для цього? + Не виходячи з поточного каталогу, перейдіть до каталогу `folder2. Яка команда для цього? 5. Поверніться до домашнього каталогу root. -## Завдання 4 +### 4. Змінити метадані файлу за допомогою `touch` -### `touch` +Команда touch — це інструмент, який дозволяє створювати нові порожні файли або змінювати дати доступу/зміни існуючих файлів, а також використовується для складних завдань у скриптах та автоматизації. Назва ==touch== походить від ідеї «*доторкатися*» до метаданих файлу без обов'язкового змінення його вмісту. +Файли *file11*, *file12*, *file21* та *file22* будуть створені у вищезгаданих папках. -Команда «touch» може бути використана для створення звичайних файлів. Ви створите «file11, file12, file21 і file22» у зазначених вище папках. +#### Як використовувати `touch` -#### Щоб використовувати `touch` - -1. Змініть каталог, наприклад «cd», на folder1 і створіть file11 +1. Змініть каталог, наприклад `cd` на `folder1` та створіть *file11*: ```bash [root@localhost folder1]# touch file11 ``` -2. Перебуваючи в folder1, створіть «file12» +2. Перебуваючи в `folder1`, створіть *file12*: ```bash [root@localhost folder1]# touch file12 @@ -176,19 +175,17 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В 3. Тепер поверніться до домашнього каталогу root. -4. `cd` до folder2 та створіть «file21» і «file22» +4. `cd` до `folder2` та створіть *file21* і *file22* ```bash - [root@localhost folder2]# Touch file21 file22 + [root@localhost folder2]# touch file21 file22 ``` 5. Поверніться до домашнього каталогу root. -## Завдання 5 - -### `ls` +### 5. Перелічить каталоги за допомогою `ls` -Команда "ls" означає список. Вона відображає список вмісту каталогу. +Команда ls (==Список==) є однією з найосновніших і найпоширеніших команд в системах Linux та Unix-подібних системах. Він дозволяє переглядати вміст каталогу, відображаючи файли та підкаталоги з різними опціями форматування та сортування. #### Щоб використовувати `ls` @@ -202,23 +199,22 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В Перелічіть вміст каталогу -2. Перейдіть до каталогу folder1 +2. Перейдіть до каталогу `folder1` -3. Виведіть вміст каталогу “folder1”. Впишіть `ls` +3. Виведіть вміст каталогу `folder1`. Впишіть `ls` ```bash [root@localhost folder1]# ls file11 file12 ``` -4. Перейдіть до каталогу folder2 і перелічіть його вміст тут: +4. Перейдіть до каталогу `folder2` і перелічіть його вміст тут: -5. Поверніться до домашнього каталогу та перерахуйте «всі» приховані файли та папки. +5. Поверніться до домашнього каталогу та перерахуйте **всі** приховані файли та папки: ```bash [root@localhost folder2]# cd - - [root@localhost root]# ls –a + [root@localhost root]# ls –a .. .bash_history .bash_logout .bash_profile .bashrc folder1 folder2 .gtkrc .kde screenrc ``` @@ -227,50 +223,38 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В ```bash [root@localhost root]# ls –al total 44 - drwx------ 5 root root 4096 May 8 10:15 . - drwxr-xr-x 8 root root 4096 May 8 09:44 .. - -rw------- 1 root root 43 May 8 09:48 .bash_history - -rw-r--r-- 1 root root 24 May 8 09:44 .bash_logout - -rw-r--r-- 1 root root 191 May 8 09:44 .bash_profile - -rw-r--r-- 1 root root 124 May 8 09:44 .bashrc - drwxrwxr-x 2 root root 4096 May 8 10:17 folder1 - drwxrwxr-x 2 root root 4096 May 8 10:18 folder2 - ……………………….. ``` -## Завдання 6 - -### `mv` +### 6. Переміщення файлів за допомогою `mv` -Команда "mv" означає переміщення. Він перейменовує файли або каталоги. Він також може переміщувати файли. +Команда `mv` (==Move==) надає інструмент для управління файлами в системі. Її основною функцією є переміщення або перейменування файлів і каталогів у файловій системі. Ця команда особливо корисна для реорганізації структури каталогів, виконання пакетних операцій над групами файлів та ефективного управління резервними копіями. -#### Щоб використовувати `mv` +#### Як використовувати `mv` -1. Змініть каталог на каталог folder1 і перегляньте його вміст +1. Змініть каталог на каталог `folder1` і перегляньте його вміст: ```bash - [root@localhost root]# cd folder1 + [root@localhost root]# cd folder1 [root@localhost folder1] ls - file11 file12 ``` -2. Ви перейменуєте file11 і file12 у каталозі folder1 на temp_file11 і temp_file12 відповідно. +2. Ви перейменуєте *file11* і *file12* в каталозі `folder1` відповідно на *temp_file11* і *temp_file12*: ```bash [root@localhost folder1]# mv file11 temp_file11 ``` -3. Знову перерахуйте вміст folder1. +3. Знову перерахуйте вміст `folder1`. ```bash [root@localhost folder1]# ls @@ -280,89 +264,86 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В Запишіть зміст: -4. Перейменуйте file12 на temp_file12: +4. Перейменуйте *file12* на *temp_file12*: ```bash [root@localhost folder1]# mv file12 temp_file12 ``` -5. Не змінюючи каталог, перейменуйте file21 і file22 у folder2 на temp_file21 і temp_file22 відповідно. +5. Не змінюючи каталог, перейменуйте файли *file21* та *file22* у `folder2` відповідно на *temp_file21* та *temp_file22*: ```bash - [root@localhost folder1]# mv /root/folder2/file21 /root/folder2/temp_file21 - - [root@localhost folder1]# mv /root/folder2/file22 /root/folder2/temp_file22 + [root@localhost folder1]# mv /root/folder2/file21 /root/folder2/temp_file21 + [root@localhost folder1]# mv /root/folder2/file22 /root/folder2/temp_file22 ``` -6. Не змінюючи ваш поточний каталог, перегляньте вміст folder2. +6. Не змінюючи ваш поточний каталог, перегляньте вміст `folder2`. !!! question "Питання" Яка команда для цього? Також перелічіть результат команди? -## Завдання 7 +### 7. Копіювання файлів за допомогою `cp` -### `cp` +Команда `cp` (==Copy==) дозволяє дублювати файли та каталоги з одного місця в інше в файловій системі, зберігаючи оригінальний файл без змін. Його простота у використанні та універсальність роблять його незамінним як для повсякденних операцій, так і для більш складних завдань системного адміністрування. Серед найкорисніших функцій команди `cp` є можливість збереження оригінальних атрибутів файлів під час копіювання, включаючи *права доступу*, *мітки часу* та *інформацію про власника*. Ця функція є особливо важливою під час роботи з файлами конфігурації або коли необхідно зберегти певні властивості документа. -Команда "cp" означає копію. Він створює копії файлів або каталогів. +#### Як використовувати `cp` -1. Змініть свій каталог на каталог folder2. +1. Змініть свій каталог на каталог `folder2`. -2. Скопіюйте вміст folder2 (temp_file21 і temp_file22) до folder1 +2. Скопіюйте вміст папки `folder2` (*temp_file21* та *temp_file22*) до папки `folder1`: ```bash - [root@localhost folder2]# cp temp_file21 temp_file22 ../folder1 + [root@localhost folder2]# cp temp_file21 temp_file22 ../folder1 ``` -3. Перелічіть вміст folder1. +3. Перелічіть вміст `folder1`. ```bash - [root@localhost folder2]# ls ../folder1 + [root@localhost folder2]# ls ../folder1 temp_file11 temp_file12 temp_file21 temp_file22 ``` -4. Перелічіть вміст folder2. Зауважте, що оригінальні копії temp_file21 і temp_file22 залишаються в folder2. +4. Перелічіть вміст `folder2`. Зверніть увагу, що оригінальні копії *temp_file21* та *temp_file22* залишаються в `folder2`. ```bash [root@localhost folder2]# ls temp_file21 temp_file22 ``` -## Завдання 8 +### 8. Визначення типу файлу за допомогою `file` -### `file` +Команда `file` є діагностичним інструментом, який дозволяє визначити тип файлу шляхом аналізу його вмісту. На відміну від розширень файлів, які можуть бути змінені або вводити в оману, ця команда перевіряє фактичну структуру даних, щоб точно визначити їх характер. Однією з найважливіших особливостей команди `file` є її здатність розрізняти різні типи текстових файлів, ідентифікуючи, наприклад, скрипти оболонки, вихідний код на різних мовах програмування, файли XML або JSON. Для бінарних файлів він може розпізнавати виконувані файли, спільні бібліотеки, зображення в різних форматах та багато інших типів структурованих даних. -Утиліта `file` використовується для визначення типів файлів або каталогів. - -#### Щоб використовувати `file` +#### Як використовувати `file` 1. Поверніться до домашнього каталогу. -2. Щоб перевірити, чи є "folder1" файлом або каталогом, впишіть: +2. Щоб перевірити, чи є `folder1` файлом або каталогом, впишіть: ```bash - [root@localhost root]# file folder1 + [root@localhost root]# file folder1 folder1: directory ``` -3. Перейдіть до каталогу folder1 +3. Перейдіть до каталогу `folder1` -4. Використовуйте утиліту `file`, щоб визначити тип файлу для temp_file11 +4. Використовуйте утиліту `file`, щоб визначити тип файлу для *temp_file11*: ```bash - [root@localhost folder1]# file temp_file11 + [root@localhost folder1]# file temp_file11 temp_file11: empty ``` -5. Скористайтеся утилітою `file`, щоб дізнатися тип файлу для всіх файлів у каталозі folder1. Перелік тут: +5. Скористайтеся утилітою `file`, щоб дізнатися тип файлу для всіх файлів у каталозі `folder1`. Перелік тут: -6. Змініть каталог на каталог /etc. +6. Змініть каталог на каталог `/etc`: ```bash [root@localhost folder1]# cd /etc ``` -7. Використовуйте утиліту `file`, щоб дізнатися тип файлу для файлу "passwd". +7. Використовуйте утиліту `file`, щоб дізнатися тип файлу для файлу *passwd*. ```bash [root@localhost etc]# file passwd @@ -372,17 +353,17 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В Який це тип файлу? -## Завдання 9 - -### `cat` +### 9. Перелічити та об'єднати файли за допомогою `cat` -`cat` є скороченням від concatenate, що означає, що файли з’єднуються разом. Команда `cat` також відобразить вміст цілого файлу на екрані. Ви будете використовувати `cat` разом із символом переспрямування “>” щоб створити файл. +Команда `cat` (скорочення від ==Concatenate==) є незамінним інструментом для управління текстовими файлами в Linux. Його основною функцією є відображення вмісту одного або декількох файлів безпосередньо в терміналі, але його також можна використовувати для створення, об'єднання або копіювання файлів. +Команда cat особливо корисна в поєднанні з іншими інструментами (такими як `grep` або `more`) для обробки або фільтрації тексту безпосередньо з терміналу. Незважаючи на свою простоту, це одна з найпоширеніших команд для швидкої обробки файлів. +Ви будете використовувати `cat` разом із символом перенаправлення «>» для створення файлу. #### Щоб створити файл за допомогою `cat` -1. Змініть каталог на каталог /root/folder1 +1. Змініть каталог на каталог `/root/folder1` -2. Створіть новий текстовий файл під назвою «first.txt» +2. Створіть новий текстовий файл з назвою *first.txt* ```bash [root@localhost folder1]# cat > first.txt @@ -396,14 +377,14 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В 4. Одночасно натисніть ++ctrl+c++. -5. Введіть «cat first.txt», щоб прочитати щойно введений текст. +5. Введіть `cat first.txt`, щоб прочитати щойно введений текст: ```bash - [root@localhost folder1]# cat first.txt + [root@localhost folder1]# cat first.txt This is a line from first.txt !! ``` -6. Створіть інший файл під назвою “second.txt” за допомогою `cat`. Введіть у файл наступний текст – «This is a line from second.txt!!» +6. Створіть інший файл під назвою *second.txt* за допомогою `cat`. Введіть у файл наступний текст – «This is a line from second.txt!!» !!! Question "Питання" @@ -411,80 +392,74 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В #### Щоб використовувати `cat` для об’єднання файлів -1. Ви об’єднаєте файли “first.txt” і “second.txt”. Впишіть: +1. Ви об’єднаєте файли *first.txt* та *second.txt*. Впишіть: ```bash - [root@localhost folder1]# cat first.txt second.txt + [root@localhost folder1]# cat first.txt second.txt ``` !!! Question "Питання" Який ваш вихід? -## Вправа 10 - -### `ftp` +### 10. Передача файлів за допомогою `ftp` -`ftp` — це програма-клієнт для використання та підключення до служб FTP через протокол передачі файлів. Програма дозволяє користувачам передавати файли на віддалений мережевий сайт і з нього. Це утиліта, яку ви можете часто використовувати. - -У цій вправі ви дізнаєтесь, як анонімно увійти на сервер FTP і завантажити файл із сервера за допомогою клієнтської програми `ftp`. +Команда `ftp` (File Transfer Protocol) — це інструмент командного рядка для передачі файлів між віддаленими та локальними системами. Хоча він був частково замінений більш сучасними та безпечними протоколами, такими як *SFTP* та *SCP*, він залишається корисним у застарілих контекстах або на серверах, які підтримують лише FTP. +FTP передає дані у вигляді **відкритого тексту**, включаючи облікові дані та вміст, тому його не рекомендується використовувати для передачі конфіденційної інформації. +Хоча FTP все ще використовується в деяких середовищах, для безпечних операцій краще використовувати зашифровані протоколи. +У цьому вправі ви дізнаєтеся, як анонімно увійти на FTP-сервер і завантажити файл із сервера за допомогою програми *ftp-клієнт*. !!! note "Примітка" Вам потрібно буде виконати вправи з попередньої лабораторної роботи, щоб продовжувати цю конкретну вправу, для якої потрібен доступний FTP-сервер, який працює десь доступно. -#### Щоб використовувати `ftp` +#### Як використовувати `ftp` 1. Увійдіть на свою машину як root -2. Змініть каталог на “/usr/local/src/”. +2. Змініть каталог на `/usr/local/src/` -3. Створіть новий каталог під назвою «завантаження» в каталозі «/usr/local/src/». +3. Створіть новий каталог під назвою `downloads` в каталозі `/usr/local/src/`. !!! Question "Питання" Яка команда для цього? -4. Змініть каталог на щойно створений каталог «завантажень». +4. Змініть каталог на щойно створений каталог `downloads` ```bash - [root@localhost src]# cd downloads + [root@localhost src]# cd downloads ``` -5. Введіть “ftp”, щоб запустити клієнт `ftp`. +5. Введіть `ftp`, щоб запустити клієнт *ftp client*: ```bash - [root@localhost downloads]# ftp + [root@localhost downloads]# ftp ftp> ``` 6. Для підключення до FTP-сервера введіть: ```bash - ftp> open < server-address> (Obtain the from your instructor) - ……… - + ftp> open < server-address> (Obtain the from your instructor) + ……… 220 localhost.localdomain FTP server (Version wu-2.6.2-5) ready. ……….. ``` -7. Увійдіть як анонімний користувач. Введіть «anonymous» у запиті: +7. Увійдіть як анонімний користувач. Введіть “*anonymous*” у запиті: ```bash Name (10.4.51.29:root): anonymous ``` -8. У вікні запиту пароля введіть будь-яку адресу електронної пошти та натисніть клавішу enter +8. У вікні запиту пароля введіть будь-яку *e-mail address* та натисніть клавішу ++enter++ ```bash - Password: *************** - + Password: *************** 230 Guest login ok, access restrictions apply. - Remote system type is UNIX. - Using binary mode to transfer files. - ftp> ``` @@ -498,10 +473,10 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В Що таке вихід двійкової команди і що таке двійковий режим "двійковий режим"? -10. Перелічіть поточні каталоги на ftp-сервері. Введіть «ls» у запит ftp (ftp>): +10. Перелічіть поточні каталоги на ftp-сервері. Введіть `ls` у запит *ftp prompt*: ```bash - ftp> ls + ftp> ls 227 Entering Passive Mode (10,0,4,5,16,103). 125 Data connection already open; Transfer starting. 11-23-43 10:23PM images @@ -509,34 +484,30 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В 226 Transfer complete. ``` -11. Змініть каталог на каталог «pub». Впишіть: +11. Змініть каталог на каталог `pub`. Впишіть: ```bash ftp> cd pub ``` -12. Використовуйте команду «ls», щоб отримати список файлів і каталогів у каталозі «pub». +12. Використовуйте команду `ls`, щоб отримати список файлів і каталогів у каталозі `pub` !!! Question "Питання" Скільки файлів і каталогів там зараз? -13. Завантажте файл під назвою «hello-2.1.1.tar.gz» у свій локальний каталог. Введіть «yes» у запиті. +13. Завантажте файл під назвою “*hello-2.1.1.tar.gz*” у свій локальний каталог. Введіть “*yes*” у запиті. ```bash - ftp> mget hello-2.1.1.tar.gz - mget hello-2.1.1.tar.gz? yes - + ftp> mget hello-2.1.1.tar.gz + mget hello-2.1.1.tar.gz? yes 227 Entering Passive Mode (10,0,4,5,16,252). - 125 Data connection already open; Transfer starting. - 226 Transfer complete. - 389363 bytes received in 0.0745 secs (5.1e+03 Kbytes/sec) ``` -14. Вийдіть із FTP-сервера та вийдіть із клієнта `ftp`. Впишіть: +14. Вийдіть із FTP-сервера та вийдіть із клієнта *ftp client*. Впишіть: ```bash ftp> bye @@ -544,41 +515,39 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В 15. Ви будете кинуті назад у свою локальну оболонку. -16. Переконайтеся, що ви все ще перебуваєте в каталозі «завантажень» локальної машини. +16. Переконайтеся, що ви все ще перебуваєте в каталозі `downloads` локальної машини. !!! question "Питання" Перелічіть файли в папці завантажень. -## Вправа 11 - -### Використання перенаправлення +### 11. Використання перенаправлення -Більшість утиліт і команд, якими ви користуєтеся в Linux, надсилають вихідні дані на екран. Екран називається стандартним виводом (stdout). Переспрямування дає змогу надіслати результат кудись ще – можливо, файл. +Більшість утиліт і команд, якими ви користуєтеся в Linux, надсилають вихідні дані на екран. Екран називається стандартним виводом (*stdout*). Переспрямування дає змогу надіслати результат кудись ще – можливо, файл. -Кожна програма, запущена в системі Linux, має три дескриптори відкритих файлів: stdin (0), stdout (1) і stderr (2). Ви можете перенаправляти або передавати їх окремо. Символи перенаправлення: “>, < “ +Кожна програма, запущена в системі Linux, має три відкриті дескриптори файлів: *stdin* **(0)**, *stdout* **(1)** та *stderr* **(2)**. Ви можете перенаправляти або «*передавати*» їх окремо. Символами перенаправлення є ++більше++ та ++менше++. -#### Щоб використовувати перенаправлення +#### Як використовувати перенаправлення -1. Переконайтеся, що ви все ще перебуваєте в каталозі folder1. +1. Переконайтеся, що ви все ще перебуваєте в каталозі `folder1`. -2. Ви будете використовувати переспрямування виводу, щоб переспрямувати вихід із команди ls (list) до текстового файлу під назвою myredirects +2. Ви будете використовувати перенаправлення виводу, щоб перенаправити вивід команди `ls` (*list*) у текстовий файл під назвою *myredirects*: ```bash - [root@localhost folder1]# ls > myredirects + [root@localhost folder1]# ls > myredirects ``` -3. Перегляньте новий файл (myredirects), створений у каталозі folder1. +3. Перегляньте вміст нового файлу (*myredirects*), створеного в каталозі `folder1`. ```bash - [root@localhost folder1] # cat myredirects + [root@localhost folder1] # cat myredirects temp_file11 temp_file12 temp_file21 temp_file22 myredirects ``` -4. Тепер ви перенаправите вихід команди file у той самий файл. Ви хочете дізнатися тип файлу для temp_file11 у каталозі folder1 і надіслати результат у свій файл myredirects +4. Тепер ви перенаправите вихід команди file у той самий файл. Ви хочете дізнатися тип файлу *temp_file11* у каталозі `folder1` і надіслати результат у файл *myredirects*: ```bash - [root@localhost folder1]# file temp_file11 > myredirects + [root@localhost folder1]# file temp_file11 > myredirects ``` 5. Перегляньте вміст файлу myredirects. @@ -587,51 +556,48 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В Воно змінилося. Що сталося? -6. Якщо ви хочете запобігти тому, що сталося вище, ви скористаєтеся подвійним символом перенаправлення «>>». Це додасть новий вихід до файлу замість його заміни. Впишіть: +6. Якщо ви хочете запобігти тому, що сталося вище, ви будете використовувати подвійний символ перенаправлення ++«>»+«>»++. Це додасть (*add*) новий вивід до файлу, замість того, щоб замінювати його. Впишіть: ```bash - [root@localhost folder1]# ls >> myredirects + [root@localhost folder1]# ls >> myredirects ``` -7. Тепер ще раз перевірте вміст файлу myredirects за допомогою `cat`. +7. Тепер знову перегляньте вміст файлу *myredirects* за допомогою команди `cat`. !!! Question "Питання" Запишіть його зміст тут: -### Використання перенаправлення для придушення виводу команди +#### Використання перенаправлення для придушення виводу команди Ви будете часто використовувати концепції, розглянуті тут, у Linux, тому, будь ласка, зверніть на це особливу увагу. Це може бути трохи складно. -Бувають випадки, коли ви не хочете, щоб користувач бачив результат команди, можливо, повідомлення про помилку. Зазвичай це відбувається тому, що дивні повідомлення про помилки часто лякають звичайних користувачів. У цих вправах ви надішлете вихід своїх команд на нульовий пристрій ( /dev/null/ ). Нульовий пристрій схожий на «бітове відро». Все, що ви кладете всередину, зникає назавжди. Ви також можете надіслати (або перенаправити) звичайний вихід команди на нульовий пристрій "null device". +Будуть випадки, коли ви не хочете, щоб користувач бачив результат виконання команди - наприклад, повідомлення про помилку. Зазвичай це відбувається тому, що дивні повідомлення про помилки часто лякають звичайних користувачів. У цьому вправі ви будете надсилати вихідні дані ваших команд на *нульовий пристрій* ( `/dev/null/` ). Пристрій *null* схожий на «*bit bucket*». Все, що ви кладете всередину, зникає назавжди. Ви також можете надсилати (або перенаправляти) звичайний вивід команди на *нульовий пристрій*. -Використовуйте наведені нижче вказівки. +Використовуйте наведені нижче вказівки: -```bash -|Redirector|

    Function

    | -| :- | :- | -|> file|Direct standard output to file| -|< file|Take standard input from file| -|Cmd1 | cmd2|Pipe; take standard out of cmd1 as standard input to cmd2| -|n> file|Direct file descriptor n to file| -|N< file|Set file as file descriptor n| -|>&n|Duplicate standard output to file descriptor n| -|<&n|Duplicate standard input from file descriptor n| -|&>file|Direct standard output and standard error to file| +| Перенаправлення | Функція | +| --------------- | ----------------------------------------------------------------- | +| > file | Направляє стандартний вивід у файл | +| < file | Приймає стандартний вхід з файлу | +| Cmd1 \ | cmd2 | Pipe; бере стандартний вивід cmd1 як стандартний ввід cmd2 | +| n> file | Направляє файловий дескриптор n до файлу | +| N< file | Встановлює файл як файловий дескриптор n | +| >&n | Дублює стандартний вивід у файловий дескриптор n | +| <&n | Дублює стандартний ввід з файлового дескриптора n | +| &>file | Направляє стандартний вивід і стандартну помилку у файл | -``` - -1. Переконайтеся, що ви все ще перебуваєте в каталозі folder1. Використовуйте опцію довгого списку команди ls у temp_file11: +1. Переконайтеся, що ви все ще перебуваєте в каталозі `folder1`. Використовуйте опцію довгого переліку команди `ls` для *temp_file11*: ```bash - [root@localhost folder1]# ls –l temp_file11 - -rw-r--r-- 1 root root 0 Jul 26 18:26 temp_file11 + [root@localhost folder1]# ls –l temp_file11 + -rw-r--r-- 1 root root 0 Jul 26 18:26 temp_file11 ``` -2. Ви перенаправите вихід тієї ж команди вище (ls –l temp_file11) на нульовий пристрій. +2. Ви перенаправите вихідні дані тієї ж команди, що наведена вище (`ls –l temp_file11`), на нульовий пристрій. ```bash - [root@localhost folder1]# ls –l temp_file11 > /dev/null + [root@localhost folder1]# ls –l temp_file11 > /dev/null ``` У вас не повинно бути результату. @@ -645,17 +611,16 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В Наведене вище є результатом типу помилки, яку було запрограмовано видати командою `ls`. -4. Виконайте ту саму команду, що й вище, з неправильним написанням імені файлу та перенаправте його до /dev/null +4. Виконайте ту саму команду, що й вище, з неправильним написанням імені файлу та перенаправте її до `/dev/null` ```bash - [root@localhost folder1]# ls -l te_file1 > /dev/null - + [root@localhost folder1]# ls -l te_file1 > /dev/null ls: te_file1: No such file or directory ``` !!! Question "Питання" - Що тут сталося? Чому вихідні дані все ще з’являються на екрані (stdout)? + Що тут сталося? Чому вихідні дані все ще з’являються на екрані (*stdout*)? 5. З різних причин ви можете придушити такі повідомлення про помилки, як наведене вище. Щоб зробити це, впишіть: @@ -663,32 +628,28 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В [root@localhost folder1]# ls –l te_file1 > /dev/null 2>&1 ``` - Ви не отримаєте результату. - - Цього разу стандартний вихід, а також стандартна помилка пригнічуються. + Ви не отримаєте результату. Цього разу стандартний вихід, а також стандартна помилка пригнічуються. Порядок перенаправлення ВАЖЛИВИЙ!! - Переспрямування читається зліва направо в командному рядку. - - Крайня ліва частина символу перенаправлення - «>»: надсилатиме стандартний вихід (stdout) до /dev/null. Тоді крайня права частина переспрямування - "2>&1 ": дублюватиме стандартну помилку (2) у стандартний вихід (1). + Переспрямування читається зліва направо в командному рядку. Найлівіша частина символу перенаправлення - ++greater++ - надсилає стандартний вивід (*stdout*) до `/dev/null`. Тоді права частина перенаправлення - `2>&1` буде дублювати стандартну помилку **(2)** до стандартного виводу **(1)**. - Отже, наведену вище команду можна прочитати так: перенаправити stdout(1) до “/dev/null”, а потім скопіювати stderr (2) до stdout + Отже, вищезазначену команду можна прочитати так: *перенаправити stdout(1) до «/dev/null», а потім скопіювати stderr (2) до stdout* 6. Щоб додатково продемонструвати важливість порядку перенаправлення. Спробуйте: ```bash - [root@localhost folder1]# ls –l tem_file 2>&1 > order.txt + [root@localhost folder1]# ls –l tem_file 2>&1 > order.txt ``` - Використовуйте команду `cat`, щоб перевірити вміст файлу “order.txt” + Використовуйте команду `cat`, щоб перевірити вміст файлу “*order.txt*” - Крайня ліва частина – «2>&1» скопіює стандартну помилку до стандартного виводу. Потім крайня права частина вищезазначеного – “ > order.txt» перенаправляє stdout до файлу order.txt. + Крайня ліва частина – `2>&1` скопіює стандартну помилку до стандартного виводу. Потім крайня права частина вищезазначеного – `> order.txt` перенаправляє *stdout* до файлу *order.txt*. 7. Спробуйте цей варіант описаного вище кроку: ```bash - [root@localhost folder1]# ls –l hgh_ghz 2> order2.txt > order2.txt + [root@localhost folder1]# ls –l hgh_ghz 2> order2.txt > order2.txt ``` !!! question "Питання" @@ -698,69 +659,61 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В 8. Щоб надіслати стандартний вивід і стандартну помилку в окремі файли, впишіть: ```bash - [root@localhost folder1]# ls –l tep_f > standard_out 2> standard_err + [root@localhost folder1]# ls –l tep_f > standard_out 2> standard_err ``` !!! question "Питання" Було створено два нових файли. Як називаються файли і який їх вміст? -9. Ви можете аналогічно переспрямувати як stdout, так і stderr до одного файлу, використовуючи: +9. Ви можете аналогічно перенаправити як *stdout*, так і *stderr* в один і той же файл, використовуючи: ```bash - [root@localhost folder1]# ls –l te_fil &> standard_both + [root@localhost folder1]# ls –l te_fil &> standard_both ``` -## Вправа 12 - -### `rm` +### 12. Видалення файлів за допомогою `rm` -Команда `rm` видаляє файли або каталоги. Ви збираєтеся використати `rm`, щоб видалити деякі з файлів, створених у попередніх вправах. +Команда `rm` (Remove) дозволяє назавжди видалити один або кілька файлів, каталогів та їх вміст без можливості відновлення, якщо не використовувати зовнішні засоби відновлення. Це потужна команда, але вона може бути небезпечною, якщо її використовувати неправильно, оскільки її дії не можна скасувати. З цієї причини важливо використовувати його з обережністю, завжди перевіряючи шляхи та імена файлів перед виконанням операції. Ви будете використовувати `rm` для видалення деяких файлів, які ви створили в попередніх вправах. -#### Щоб використати `rm` +#### Як використовувати `rm` -1. Перебуваючи в каталозі "folder1", видаліть файл standard_err. У запиті підтвердження введіть «y»: +1. Перебуваючи в каталозі `folder1`, видаліть файл *standard_err*. Введіть ++«y»++ у вікні підтвердження: ```bash - [root@localhost folder1]# rm standard_err + [root@localhost folder1]# rm standard_err rm: remove `standard_err'? y ``` -2. Видаліть файл «standard_out». Щоб запобігти запиту підтвердження перед видаленням файлу, скористайтеся параметром “–f “ з командою `rm`. +2. Видаліть файл *standard_out*. Щоб уникнути запиту на підтвердження перед видаленням файлу, використовуйте опцію `–f` разом із командою `rm`: ```bash - [root@localhost folder1]# rm -f standard_out + [root@localhost folder1]# rm -f standard_out ``` -3. Поверніться до домашнього каталогу (/root) і видаліть каталог «folder2». Щоб використати `rm` для видалення папки, потрібно використати перемикач «–r»: +3. Поверніться до свого домашнього каталогу (`/root`) і видаліть каталог `folder2`. Щоб видалити папку за допомогою команди `rm`, потрібно використовувати параметр `–r`: ```bash - [root@localhost root]# rm -r folder2 - - rm: descend into directory `folder2'? y - - rm: remove `folder2/temp_file21'? y - - rm: remove `folder2/temp_file22'? y - - rm: remove directory `folder2'? y + [root@localhost root]# rm -r folder2 + rm: descend into directory 'folder2'? y + rm: remove 'folder2/temp_file21'? y + rm: remove 'folder2/temp_file22'? y + rm: remove directory 'folder2'? y ``` !!! Question "Питання" Вам знову було запропоновано підтвердити видалення кожного файлу в каталозі та самого каталогу. Яку опцію ви використаєте з командою `rm –r`, щоб запобігти цьому? -## Вправа 13 +### 13. Вивчення `vi` -### Вивчення `vi` +Редактор `vi` є одним з найпотужніших і найпоширеніших текстових редакторів, доступних в системах Linux і Unix-подібних системах. Це незамінний інструмент для системних адміністраторів та розробників завдяки своїй ефективності та універсальності. На відміну від багатьох сучасних редакторів, `vi` працює переважно в текстовому режимі, пропонуючи швидкі команди та комбінації клавіш, які дозволяють редагувати файли з надзвичайною точністю та швидкістю. -`vi` — текстовий редактор. Його можна використовувати для редагування всіх видів звичайного тексту. Це особливо корисно для редагування програм. +Спочатку його освоєння може бути складним, але після того, як ви опануєте основні функції, він стане незамінним інструментом для редагування конфігураційних файлів, скриптів і вихідного коду безпосередньо з терміналу. `vi` - це великий товстий монстр, який може робити майже все, включаючи приготування кави чи какао!! -Замість того, щоб намагатися навчити вас `vi`, ця вправа вкаже вам на інструмент, який може краще ознайомити вас з `vi`. - -Будь ласка, знайдіть час, щоб ознайомитися з онлайн-підручником `vi` (точніше `vim`). Просто дотримуйтесь інструкцій. +Замість того, щоб намагатися навчити вас `vi`, ця вправа вкаже вам на інструмент, який може краще ознайомити вас з `vi`. Будь ласка, знайдіть час, щоб ознайомитися з онлайн-підручником `vi` (точніше `vim`). Просто дотримуйтесь інструкцій. #### Для вивчення `vi` @@ -768,15 +721,13 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В [root@localhost root]# vimtutor -## Вправа 14 - -### Пошук файлів: (`find` та `locate`) +### 14. Пошук файлів за допомогою `find` та `locate` У цій вправі буде розглянуто дві найпопулярніші утиліти, які використовуються для пошуку файлів і каталогів у файловій системі. Це команди `find` і `locate`. #### `find` -Утиліта `find` існує вже давно. Вона рекурсивно сканує каталоги, щоб знайти файли, які відповідають заданому критерію. +Команда `find` дозволяє шукати файли та каталоги у файловій системі за широким спектром критеріїв, таких як ім'я, тип, розмір, дата модифікації, права доступу та багато іншого. Його здатність виконувати дії над знайденими результатами, такі як видалення, переміщення або обробка файлів, робить його незамінним інструментом для системних адміністраторів та досвідчених користувачів. Загальний синтаксис `find` має вигляд: @@ -784,59 +735,35 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В find [path] [options] [criterion] [action] ``` -Якщо ви не вкажете жодного каталогу чи шляху, пошук буде здійснюватися в поточному каталозі. Якщо ви не вкажете критерій, це еквівалентно "true", тому всі файли будуть знайдені. Утиліта `find` має багато параметрів для будь-якого типу пошуку файлу. Нижче наведено лише деякі параметри, критерії та дії. - -```bash -ОПЦІЇ: - --xdev: не шукайте в каталогах, розташованих на інших файлових системах; - --mindepth : спуститися принаймні на рівнів нижче зазначеного каталогу раніше пошуку файлів; - --maxdepth : шукати файли, розташовані не більше ніж на n рівнів нижче вказаного каталогу; - --follow: перейдіть за символічними посиланнями, якщо вони посилаються на каталоги. - --daystart: у разі використання тестів, пов’язаних із часом (див. нижче), візьміть початок поточного дня як позначку часу замість типової (за 24 години до поточного часу). -``` - -```bash -КРИТЕРІЇ - --впишіть : пошук заданого типу файлу; може бути одним із: f (звичайний файл), d (каталог), - -l (символічне посилання), s (socket), b (файл режиму блокування), c (файл символьного режиму) або - -p (іменований pipe); - --name : знайти файли, імена яких відповідають заданим ; - --iname : like - назва, але ігнорувати регістр; - --atime , -amin : знайти файли, доступ до яких був останні дні тому (-atime) або хвилини тому (-amin). Ви також можете вказати + або -, у цьому випадку пошук здійснюватиметься для файлів, до яких було відкрито щонайбільше або принаймні днів/хвилин тому; - --anewer : знайти файли, до яких відкривався нещодавно, ніж файл ; - --ctime , -cmin , -cnewer : такий саме як -atime, -amin та -anewer, але застосовується до останнього часу, коли вміст файлу було змінено; - --regex : такий саме як -name, але шаблон розглядається як регулярний вираз; - --iregex : такий саме як -regex, але ігнорувати регістр. -``` - -```bash -ДІЇ: - --print: просто друкує назву кожного файлу на стандартному виводі. Це типова дія; - --ls: виводить на стандартний вивід еквівалент ls -ilds для кожного знайденого файлу; - --exec : виконує команду для кожного знайденого файлу. Командний рядок має закінчуватися символом ;, який потрібно екранувати, щоб оболонка не інтерпретувала його; позиція файлу позначена {}. - --ok : те саме, що -exec, але запитувати підтвердження для кожної команди. -``` - -#### Щоб використовувати `find` +Якщо ви не вказали жодного каталогу або шляху, `find` буде шукати в поточному каталозі. Якщо ви не вкажете критерій, це буде еквівалентно «*true*», отже, будуть знайдені всі файли. Утиліта `find` має багато параметрів для будь-якого типу пошуку файлу. Нижче наведено лише деякі параметри, критерії та дії. + +| Параметр | Опис | +| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| -xdev | не здійснює пошук у каталогах, розташованих в інших файлових системах | +| -mindepth `` | спускається щонайменше на `` рівнів нижче вказаного каталогу перед пошуком файлів | +| -maxdepth `` | шукає файли, розташовані на рівні не більше `` нижче вказаного каталогу | +| -follow | слідує за символічними посиланнями, якщо вони ведуть до каталогів | +| -daystart | при використанні тестів, пов'язаних з часом (див. нижче), бере початок поточного дня як мітку часу замість стандартного значення (24 години до поточного часу) | + +| Критерій | Опис | +| ------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| -type `` | пошук певного типу файлів; `` може бути одним з наступних: **f** (*звичайний файл*), **d** (*каталог*) **l** (*символічне посилання*), **s** (*сокет*), **b** (*файл у блоковому режимі*), **c** (*файл у символьному режимі*) або **p** (*іменований канал*) | +| -name `` | знаходить файли, імена яких відповідають заданим `` | +| -iname `` | як *-name*, але ігнорує регістр | +| -atime ``, -amin `` | знаходить файли, до яких востаннє зверталися `` днів тому (*-atime*) або `` хвилин тому (*-amin*). Ви також можете вказати `+` або `-`, у цьому випадку пошук буде здійснюватися для файлів, до яких було здійснено доступ відповідно *найбільше* або *найменше* `` днів/хвилин тому | +| -anewer `` | знаходить файли, до яких було здійснено доступ пізніше, ніж до файлу `` | +| -ctime ``, -cmin ``, -cnewer `` | так само, як для *-atime*, *-amin* та *-anewer*, але застосовується до останнього часу, коли вміст файлу було змінено | +| -regex `` | те саме, що й *-name*, але шаблон розглядається як регулярний вираз | +| -iregex `` | те саме, що *-regex*, але ігнорує регістр | + +| Дія | Опис | +| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| -print | просто виводить назву кожного файлу на стандартний вивід. Це стандартна дія | +| -ls | виводить на стандартний вивід еквівалент `ls -ilds` для кожного знайденого файлу | +| -exec `` | виконує команду `` для кожного знайденого файлу. Командний рядок `` повинен закінчуватися символом `;`, який необхідно екранувати, щоб оболонка не інтерпретувала його; позиція файлу позначається символами `{}` | +| -ok `` | те саме, що *-exec*, але запитує підтвердження для кожної команди | + +#### Як використовувати `find` 1. Переконайтеся, що ви перебуваєте у своєму домашньому каталозі. @@ -844,36 +771,24 @@ p (іменований pipe); ```bash [root@localhost root]# find - - ……….. - ./.bash_profile - ./.bashrc - ./.cshrc - ./.tcshrc - ./.viminfo - ./folder1 - ./folder1/first.txt - ………… ``` - Ваші результати показують типову поведінку find, коли використовується без жодного параметра. - - Він рекурсивно відображає всі файли та каталоги (включаючи приховані файли) у робочому каталозі. + Ваш результат показує стандартну поведінку команди find при використанні без будь-яких опцій. +Вона відображає всі файли та каталоги (*включно з прихованими файлами*) у робочому каталозі рекурсивно. -3. Тепер використовуйте `find`, щоб знайти лише каталоги у вашому pwd. Впишіть: +3. Тепер використовуйте `find`, щоб знайти лише каталоги у вашому *pwd*. Впишіть: ```bash - [root@localhost root]# find -type d - . + [root@localhost root]# find -type d ./folder1 ./folder2 ……… @@ -881,12 +796,12 @@ p (іменований pipe); !!! question "Питання" - З наведеної вище команди «find –type d»; що таке «option», що таке «path», що таке «criterion» і, нарешті, що таке «action»? + З наведеної вище команди `find –type d`; що таке “*option*”, що таке “*path*”, що таке “*criterion*” і, нарешті, що таке “*action*? -4. Далі ви шукатимете всі файли у вашій системі, які закінчуються суфіксом «.txt». +4. Далі ви шукатимете всі файли у вашій системі, які закінчуються суфіксом “*.txt*”: ```bash - [root@localhost root]# find / -maxdepth 3 -name "*.txt" -print + [root@localhost root]# find / -maxdepth 3 -name "*.txt" -print /root/folder1/first.txt /root/folder1/second.txt /root/folder1/order.txt @@ -895,51 +810,43 @@ p (іменований pipe); !!! question "Питання" - Знову з наведеної вище команди; що таке «option», що таке «path», що таке «criterion» і, нарешті, що таке «action»? (ПІДКАЗКА: дія = “- print”) - - Пошук виконуватиметься лише на 3 каталоги вглиб від каталогу “/”. + Знову з наведеної вище команди; що таке “*option*”, “*path*”, “*criterion*” and “*action*”? (ПІДКАЗКА: дія = “- print”) - Зірочка, яка використовується в наведеній вище команді, є одним із символів підстановки в Linux. + Пошук буде виконуватися тільки в 3 каталогах, розташованих глибше каталогу `/`. Зірочка, використана у вищезазначеній команді, є одним із символів «*wild card*» в Linux. +Використання символів wild-card в Linux називається «*globbing*». - Використання символів підстановки в Linux називається «глоббуванням». - -5. Використовуйте команду `find`, щоб знайти всі файли у вашому “pwd”, які мають розмір “менший” за 200 кілобайт. Впишіть: +5. Використовуйте команду `find`, щоб знайти всі файли у вашому “*pwd*”, які мають розмір “менший” за 200 кілобайт. Впишіть: ```bash - [root@localhost root]# find . –size -200k + [root@localhost root]# find . –size -200k ``` 6. Використовуйте команду `find`, щоб знайти всі файли у вашому pwd, які «більші» за 10 кілобайт, а також відобразити їхній «тип файлу». Впишіть: ```bash - [root@localhost root]# find . –size +10k –exec file "{ }" ";" + [root@localhost root]# find . –size +10k –exec file "{ }" ";" ``` #### `locate` -Синтаксис команди `find` іноді може бути досить складним у використанні; і через інтенсивний пошук він може бути повільним. Альтернативною командою є `locate`. - -`locate` здійснює пошук у попередньо створеній базі даних усіх файлів у файловій системі. - -Він покладається на програму `updatedb`. +Команда `locate` дозволяє шукати файли та каталоги в системі. На відміну від інших команд, таких як `find`, які виконують пошук у реальному часі, `locate` базується на попередньо скомпільованій базі даних, що містить шляхи до всіх файлів у системі, забезпечуючи майже миттєві результати. Ця база даних зазвичай періодично оновлюється за допомогою команди `updatedb`, яка керується *завданням cron*. Завдяки своїй ефективності, `locate` особливо корисний для швидкого пошуку файлів або папок без необхідності вручну сканувати всю файлову систему. +Однак важливо пам'ятати, що результати можуть бути не завжди актуальними, якщо база даних не була нещодавно синхронізована з поточним станом системи. -```bash -search usage: - -locate [-qi] [-d ] [--database=] ... - -locate [-r ] [--regexp=] +| Використання пошуку: | +| --------------------------------------------------------------------------------------- | +| locate [-qi] [-d ``] [--database=``] ``... | +| locate [-r ``] [--regexp=``] | -database usage: locate [-qv] [-o ] [--output=] +| Використання бази даних: | +| --------------------------------------------------------------------------------------------------------------------------------- | +| locate [-qv] [-o ``] [--output=``] | +| locate [-e ``] [-f ``] [-l ``] [-c] [-U ``] [-u] [`pattern...`] | -locate [-e ] [-f ] [-l ] - -[-c] <[-U ] [-u]> - -general usage: locate [-Vh] [--version] [--help] -``` +| Загальне використання: | +| ------------------------------------- | +| locate \[-Vh\] \[--version\] [--help] | -#### Щоб використовувати `locate` +#### Як використовувати `locate` 1. Перейдіть до каталогу folder1 і створіть порожні файли temp1, temp2 і temp3: diff --git a/docs/labs/systems_administration_I/lab7-software_management.uk.md b/docs/labs/systems_administration_I/lab7-software_management.uk.md index 44e75c4ff0..0ce17e4677 100644 --- a/docs/labs/systems_administration_I/lab7-software_management.uk.md +++ b/docs/labs/systems_administration_I/lab7-software_management.uk.md @@ -9,7 +9,7 @@ tags: # Лабораторна робота 7: Керування та інсталяція програмного забезпечення -## Завдання +## Цілі Після виконання цієї лабораторної роботи ви зможете: @@ -704,7 +704,7 @@ DNF можна використовувати для перевірки та в Сценарій, який зазвичай дозволяє налаштувати програмне забезпечення, зазвичай має влучну назву «configure» -!!! tip "Порада" +!!! Tip "Порада" ```` Переконайтеся, що ви встановили групу пакетів «Інструменти розробки» перед виконанням наступних вправ. diff --git a/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.uk.md b/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.uk.md index 9a0cb33ec6..04a559cdc9 100644 --- a/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.uk.md +++ b/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.uk.md @@ -19,7 +19,7 @@ tags: # Лабораторна робота 8: Моніторинг системи та процесів -## Завдання +## Цілі Після виконання цієї лабораторної роботи ви зможете: @@ -155,7 +155,7 @@ tags: (sleep 3600 & MYPROC1=$! && echo PID is: $MYPROC1) 2>/dev/null ``` - Вихід + Вихід: ```bash PID is: 1331933 @@ -185,7 +185,7 @@ tags: (sleep 3600 & MYPROC2=$! && echo PID is: $MYPROC2) 2>/dev/null ``` - Вихід + Вихід: ```bash PID is: 1333258 @@ -367,7 +367,7 @@ tags: bash -c 'while true; do echo "Default priority: The PID is $$"; done' ``` - Вихід + Вихід: ```bash Default priority: The PID is 2185209 @@ -422,7 +422,7 @@ tags: nice -n 19 bash -c 'while true; do echo "Low priority: The PID is $$"; done' ``` - Вихід + Вихід: ```bash Low priority: The PID is 2180254 @@ -454,7 +454,7 @@ tags: ps -C find -o pid= ``` - Вихід + Вихід: ```bash 2577072 @@ -472,10 +472,10 @@ tags: renice -n -10 -p $(ps -C find -o pid=) ``` - Вихід + Вихід: ```bash - (process ID) old priority 0, new priority -10 + (process ID) old priority 0, new priority -10 ``` Замініть "" (вище) фактичним PID запущеного процесу. @@ -498,7 +498,7 @@ tags: renice -n 10 -p ``` - Вихід + Вихід: ```bash 2338530 (process ID) old priority -10, new priority 10 @@ -688,7 +688,7 @@ tags: jobs -l ``` - Вихід + Вихід: ```bash [1]- 2977364 Stopped vi foobar1.txt @@ -717,7 +717,7 @@ tags: kill -SIGKILL %1 %2 && jobs ``` - Вихід + Вихід: ```bash [1]- Killed vi foobar1.txt diff --git a/docs/labs/systems_administration_II/lab3-bootup_and_startup.uk.md b/docs/labs/systems_administration_II/lab3-bootup_and_startup.uk.md index 184e8767f8..2b559d2a6c 100644 --- a/docs/labs/systems_administration_II/lab3-bootup_and_startup.uk.md +++ b/docs/labs/systems_administration_II/lab3-bootup_and_startup.uk.md @@ -11,7 +11,7 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В # Лабораторна робота 3: Процеси завантаження та запуску -## Завдання +## Цілі Після виконання цієї лабораторної роботи ви зможете: @@ -455,7 +455,7 @@ author: Wale Soyinka contributors: Steven Spencer, Ganna Zhyrnova tested on: В Чому, на вашу думку, PID відрізняються кожного разу, коли ви перезапускаєте службу? - !!! tip "Порада" + !!! Tip "Підказка" Функціональність старої доброї класичної команди служби перенесено для бездоганної роботи в керованих системах systemd. Ви можете використовувати такі команди служби, як наведені нижче, щоб зупинити, запустити, перезапустити та переглянути статус служби `smartd`. diff --git a/docs/labs/systems_administration_II/lab4-advanced_system_process_monitoring.uk.md b/docs/labs/systems_administration_II/lab4-advanced_system_process_monitoring.uk.md index a64b9f53a8..7904196497 100644 --- a/docs/labs/systems_administration_II/lab4-advanced_system_process_monitoring.uk.md +++ b/docs/labs/systems_administration_II/lab4-advanced_system_process_monitoring.uk.md @@ -19,7 +19,7 @@ tags: # Лабораторна робота 4: Розширений моніторинг системи та процесів -## Завдання +## Цілі Виконавши цю лабораторну роботу, ви зможете @@ -206,7 +206,7 @@ tags: sudo perf stat -e cycles ./generate_cpu_load.sh 500 ``` - Вихід + Вихід: ```bash ...... @@ -278,7 +278,7 @@ tags: export MYPID=$(pgrep strace_script) ; echo $MYPID ``` - Вихід + Вихід: ```bash 4006301 @@ -316,7 +316,7 @@ tags: Наша зразкова система показує підсумковий звіт таким чином: - Вихід + Вихід: ```bash strace: Process 4006301 attached @@ -587,7 +587,7 @@ NUMA означає "нерівномірний доступ до пам'яті" journalctl -xe -f | grep -i memory ``` - !!! tip "Порада" + !!! Tip "Порада" ```` Ви можете швидко скористатися командою ps, щоб перевірити приблизне використання пам'яті процесом, якщо вам відомий PID процесу, запустивши: @@ -694,7 +694,7 @@ NUMA означає "нерівномірний доступ до пам'яті" #### Щоб створити процес стрес-тесту вводу-виводу -1. Запустіть процес `dd`, щоб створити великий файл з назвою /tmp/io_stress. Також запишіть і збережіть PID процесу dd у змінній під назвою `MYPID`. Впишіть: +1. Запустіть процес `dd`, щоб створити великий файл з назвою `/tmp/io_stress`. Також запишіть і збережіть PID процесу dd у змінній під назвою `MYPID`. Впишіть: ```bash dd if=/dev/zero of=/tmp/io_stress bs=10M count=500 oflag=dsync \ @@ -717,7 +717,7 @@ NUMA означає "нерівномірний доступ до пам'яті" iotop -p $MYPID ``` -Вихідні дані відображатимуть швидкість читання/запису вводу/виводу для процесу io_stress.sh, яка не повинна перевищувати 1 МБ/с відповідно до обмеження. + На виході буде відображено швидкість читання/запису вводу-виводу для процесу io_stress.sh, яка не повинна перевищувати 1 МБ/с відповідно до обмеження. #### Щоб видалити `cgroups` @@ -743,7 +743,7 @@ CPU affinity прив’язує конкретні процеси або пот lscpu | grep "On-line" ``` -2. Давайте створимо зразок процесу за допомогою утиліти dd і збережемо його PID у змінній MYPID. Впишіть: +2. Створіть зразок процесу за допомогою утиліти `dd` і збережіть його PID у змінній `MYPID`. Впишіть: ```bash dd if=/dev/zero of=/dev/null & export MYPID="$!" @@ -756,7 +756,7 @@ CPU affinity прив’язує конкретні процеси або пот taskset -p $MYPID ``` - Вихід + Вихід: ```bash pid 1211483's current affinity mask: f @@ -779,13 +779,13 @@ CPU affinity прив’язує конкретні процеси або пот ### Щоб встановити/змінити схожість ЦП -1. Встановіть приналежність ЦП процесу dd до одного ЦП (ЦП 0). Впишіть: +1. Встановіть афінність процесора для процесу `dd` на один процесор (процесор 0). Впишіть: ```bash taskset -p 0x1 $MYPID ``` - Вихід + ВИХІД ```bash pid 1211483's current affinity mask: f @@ -798,9 +798,9 @@ CPU affinity прив’язує конкретні процеси або пот taskset -p $MYPID ``` - Вихідні дані вказують на маску спорідненості ЦП процесу з PID $MYPID. Маска спорідненості дорівнює «1» у десятковій системі, що перекладається як «1» у двійковій системі. Це означає, що процес наразі прив’язаний до ядра ЦП 0. + Вихідні дані вказують маску афінності процесора процесу з PID `$MYPID`. Маска спорідненості дорівнює «1» у десятковій системі, що перекладається як «1» у двійковій системі. Це означає, що процес наразі прив’язаний до ядра ЦП 0. -3. Тепер встановіть приналежність ЦП процесу dd до кількох ЦП (ЦП 0 і 1). Впишіть: +3. Тепер встановіть афінність процесора для процесу `dd` на кілька процесорів (процесори 0 і 1). Впишіть: ```bash taskset -p 0x3 $MYPID @@ -825,13 +825,13 @@ CPU affinity прив’язує конкретні процеси або пот 5. Запустіть утиліту `top` або `htop` в окремому терміналі та спостерігайте, якщо ви бачите щось цікаве, експериментуючи з різними конфігураціями `taskset` для процесу. -6. Все готово. Використовуйте його PID ($MYPID), щоб припинити процес dd. +6. Все готово. Використовуйте його PID (`$MYPID`) для завершення процесу `dd`. ## Завдання 9 ### `systemd-run` -Команда `systemd-run` створює та запускає тимчасові службові блоки для виконання команд або процесів. Вона також може запускати програми в блоках тимчасової області дії, блоках обслуговування, що запускаються шляхом, сокетом або таймером. +Команда `systemd-run` створює та запускає тимчасові службові блоки для виконання команд або процесів. Він також може запускати програми в одиницях тимчасового обсягу, одиницях обслуговування, що запускаються за допомогою шляху, сокета або таймера. У цій вправі показано, як використовувати `systemd-run` для створення тимчасових службових одиниць у `systemd`. @@ -851,7 +851,7 @@ CPU affinity прив’язує конкретні процеси або пот #### Щоб установити обмеження ресурсу пам’яті для тимчасової служби -1. Використовуйте параметр `--property` разом із `systemd-run`, щоб обмежити максимальне використання пам’яті для тимчасового процесу до 200 МБ. Впишіть: +1. Використовуйте параметр `--property` разом із `systemd-run`, щоб обмежити максимальне використання пам’яті для тимчасового процесу до 200 Мб. Впишіть: ```bash systemd-run --unit=mylimited.service --property=MemoryMax=200M sleep 300 @@ -871,14 +871,14 @@ CPU affinity прив’язує конкретні процеси або пот #### Щоб установити обмеження на ресурс ЦП для тимчасової служби -1. Давайте створимо тимчасовий блок `systemd` під назвою "myrealtime.service". Запустіть myrealtime.service із спеціальною політикою планування циклічного (rr) і пріоритетом. Впишіть: +1. Давайте створимо тимчасовий блок `systemd` під назвою "myrealtime.service". Запустіть `myrealtime.service` із певною політикою планування round robin (rr) та пріоритетом. Впишіть: ```bash systemd-run --unit=myrealtime.service \ --property=CPUSchedulingPolicy=rr --property=CPUSchedulingPriority=50 sleep 300 ``` -2. Перегляньте статус myrealtime.service. Крім того, захопіть/збережіть основний [sleep] PID у змінній під назвою MYPID. Впишіть: +2. Перевірте статус `myrealtime.service`. Крім того, захопіть/збережіть основний [sleep] PID у змінній під назвою MYPID. Впишіть: ```bash MYPID=$(systemctl status myrealtime.service | awk '/Main PID/ {print $3}') @@ -956,7 +956,7 @@ CPU affinity прив’язує конкретні процеси або пот ~/cpu_load_generator.sh & echo $! ``` -3. Зберіть PID для основного процесу `openssl`, запущеного в сценарії cpu_load_generator.sh. Зберігайте PID у змінній з іменем MYPID. Впишіть: +3. Зафіксуйте PID для основного процесу `openssl`, запущеного в скрипті `cpu_load_generator.sh`. Збережіть PID у змінній з іменем `$MYPID`. Впишіть: ```bash export MYPID=$(pidof openssl) ; echo $MYPID @@ -964,13 +964,13 @@ CPU affinity прив’язує конкретні процеси або пот #### Щоб використовувати `schedtool` для перевірки поточної політики планування -1. Використовуйте команду `schedtool`, щоб відобразити інформацію про планування процесу з PID $MYPID. Впишіть: +1. Використовуйте команду `schedtool`, щоб відобразити інформацію про планування процесу з PID `$MYPID`. Впишіть: ```bash schedtool $MYPID ``` - Вихід + Вихід: ```bash PID 2565081: PRIO 0, POLICY N: SCHED_NORMAL , NICE 0, AFFINITY 0xf diff --git a/docs/release_notes/10_0.uk.md b/docs/release_notes/10_0.uk.md index af887d60b3..a207fbf18c 100644 --- a/docs/release_notes/10_0.uk.md +++ b/docs/release_notes/10_0.uk.md @@ -46,7 +46,7 @@ Rocky Linux 10 підтримується на таких архітектура #### Зовсім нова підтримка архітектури RISC-V -Команда розробників релізу Rocky Linux довго та наполегливо працювала над тим, щоб забезпечити підтримку Rocky Linux 10 для певних реалізацій RISC-V.\ +Команда інженерів Rocky Linux Release Engineering довго і наполегливо працювала над тим, щоб Rocky Linux 10 став доступним для певних «реалізацій RISC-V». Платформи/підсистеми, що підтримувалися на день випуску, включають StarFive VisionFive 2 (VF2), **QEMU** та SiFive HiFive Premier P550. Щоб отримати докладнішу інформацію про цю віху, зокрема про підтримку RISC-V у RL10, відвідайте [цей сайт](https://rockylinux.org/news/rockylinux-support-for-riscv). @@ -106,7 +106,7 @@ Kea DHCP замінює DHCP-сервер ISC, термін служби яко У попередніх версіях Rocky Linux функція об'єднання мережевих карт була застарілою. У RL 10 це тепер повністю видалено. Як заміну, налаштуйте зв'язок замість мережевої команди. -### Пам’ять +### Сховище Окрім наступних змін, з RL 10 додано, оновлено або видалено кілька драйверів пристроїв, пов’язаних із сховищем. @@ -175,21 +175,30 @@ kernel-6.12.0-130.el10.x86_64 Модульність DNF застаріла, і Rocky Linux не має наміру надавати контент AppStream як модулі в RL 10. У майбутньому RL 10 може надавати додаткові версії програм у вигляді RPM-пакетів, колекцій програмного забезпечення або Flatpaks. +Іншими словами, команда `dnf module` була вилучена з RL 10, оскільки пакетний менеджер DNF нового покоління (`dnf5`) уніфікував API і більше не використовує стару модульну архітектуру для управління декількома версіями програмного забезпечення. Відповідні порівняння наведені нижче: + +| опис | Старий (`dnf module`) | Новий | +| :------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :---------------------------- | +| Переглянути доступні версії | `dnf module list ` | `dnf repoquery ` | +| Встановити конкретну версію | `dnf module enable nginx:1.14 && dnf module install nginx:1.14` | `dnf install nginx-1.26.3` | +| Видалити конкретну версію | `dnf -y module remove --all :` or `dnf -y module remove --all :/` | `dnf remove -` | +| Переключитися на потрібну версію | `dnf -y module remove --all : && dnf module reset && dnf module enable :` | Не потрібно перемикатися | + ### Середовище робочого столу У RL 10 Wayland замінює сервер X.Org. Xwayland підтримуватиме більшість клієнтів X11, які ще не були портовані на Wayland. Деякі настільні програми та компоненти також замінено в RL 10. #### Зміни компонентів робочого столу -| Видалено | Замінено | -| :------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------- | -| текстовий редактор gedit | GNOME Text Editor (gnome-text-editor) | -| Додаток Tweaks | Використовуйте параметри налаштувань у налаштуваннях GNOME та/або використовуйте Flatpak на Flathub | -| Festival speech synthesizer | Espeak NG | -| Eye of GNOME (eog) image viewer | GNOME Image Viewer (loupe) | -| Cheese camera application | Snapshot application | -| GNOME Terminal | ptyxis terminal | -| PulseAudio daemon (but not the client interfaces) | Pipewire (вже був стандартним у RL 9) | +| Видалено | Замінено | +| :----------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------- | +| текстовий редактор gedit | GNOME Text Editor (gnome-text-editor) | +| Додаток Tweaks | Використовуйте параметри налаштувань у налаштуваннях GNOME та/або використовуйте Flatpak на Flathub | +| Festival speech synthesizer | Espeak NG | +| Eye of GNOME (eog) image viewer | GNOME Image Viewer (loupe) | +| Cheese camera application | Snapshot application | +| GNOME Terminal | ptyxis terminal | +| Демон PulseAudio (але не клієнтські інтерфейси) | Pipewire (вже був стандартним у RL 9) | Кілька графічних програм для робочого столу більше не входять до дистрибутиву Rocky Linux 10. У більшості випадків ви можете отримати ці програми з основних джерел або як Flatpak на Flathub. @@ -214,11 +223,11 @@ gnome-remote-desktop, використовуючи RDP, замінює TigerVNC | Видалено | Замінено | | :--------------------------------- | :---------------------------------------------------------------------------------------------- | | power-profiles-daemon CPU throttle | шар перекладу tuned-ppd, який підтримує програми, написані для демона power-profiles | -| redis in-memory key-value database | valkey (a fork of redis) in-memory key-value database ^1 | +| redis in-memory key-value database | valkey (a fork of redis) in-memory key-value database ^1 | | sendmail mail transfer agent | Rocky Linux рекомендує перейти на агент передачі пошти Postfix. | | spamassassin email spam filter | Фільтр спаму електронної пошти spamassassin тепер доступний у репозиторії EPEL. | -1 Окрім `valkey`, у репозиторії Plus є пакет `valkey-compat-redis`. +[^1]: **valkey**: Форк redis. 1 Окрім `valkey`, у репозиторії Plus є пакет `valkey-compat-redis`. ### Динамічні мови програмування diff --git a/docs/release_notes/9_0.uk.md b/docs/release_notes/9_0.uk.md index c23b3822f5..0eeba011cf 100644 --- a/docs/release_notes/9_0.uk.md +++ b/docs/release_notes/9_0.uk.md @@ -171,6 +171,6 @@ Rocky Linux 9 було з любов’ю створено за допомого * **Обмеження використання мінімальної установки ISO** – більшість пакетів, пов’язаних із безпекою, не працюватимуть. Якщо під час інсталяції вам потрібні профілі та пакети безпеки/SCAP, використовуйте DVD ISO. -## Повідомлення про помилки +## Повідомлення про Проблеми -Будь ласка, повідомляйте про будь-які виявлені помилки в [Відстеження помилок Rocky Linux](https://bugs.rockylinux.org/). Ми також запрошуємо вас приєднатися до нашої спільноти будь-яким способом на наших [форумах](https://forums.rockylinux.org), [Mattermost](https://chat. rockylinux.org), [IRC на Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/ r/rockylinux), [Списки розсилки](https://lists.resf.org) або будь-яким іншим способом, яким ви бажаєте взяти участь! +Будь ласка, повідомляйте про всі виявлені помилки в [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Ми також запрошуємо вас приєднатися до нашої спільноти будь-яким зручним для вас способом, будь то на нашому [Форумі](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC на Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailing Lists](https://lists.resf.org), або як вам буде зручно! diff --git a/docs/rocky_insights/blogs/good_docs.uk.md b/docs/rocky_insights/blogs/good_docs.uk.md new file mode 100644 index 0000000000..b362d9e2b8 --- /dev/null +++ b/docs/rocky_insights/blogs/good_docs.uk.md @@ -0,0 +1,88 @@ +--- +title: Хороший документ — точка зору перекладача +author: Ganna Zhyrnova +contributors: Steven Spencer +--- + +## Вступ + +Перекладачі надають цінні поради щодо написання чіткої та лаконічної документації. Вони краще за інших знають, що не перекладається добре і що заплутує читача. У цьому документі розглядаються деякі з цих питань та висвітлюються найкращі практики створення документів. + +### Від автора + +Документація до програмного забезпечення допомагає користувачам зрозуміти, як ефективно використовувати конкретне програмне забезпечення. Вони повинні розуміти, що вони отримають в результаті і які переваги це їм дасть. Водночас, коли ви створюєте документацію, це означає, що ви створюєте її не тільки для себе, але й для своєї мережі та інших людей, які можуть її прочитати. Інші люди можуть бути не з англомовних країн. Це означає, що для них англійська мова не є основною мовою. З огляду на це, дотримуйтесь цих основних правил, щоб зробити вашу документацію більш зрозумілою для _всіх_ користувачів. + +## Використання простої мови + +Ви не маєте уявлення, хто є вашим користувачем. Незалежно від того, чи знайомий цей користувач з цією сферою, чи є він досвідченим розробником або початківцем. Проста мова — це чітка, лаконічна комунікація, яку цільова аудиторія може легко зрозуміти з першого разу. Вона уникає жаргон, технічні терміни та складні синтаксичні конструкції на користь простішої мови та чіткої структури. Мета полягає в тому, щоб забезпечити доступність і зрозумілість повідомлення для широкої аудиторії, незалежно від її походження або рівня читацької підготовки. Часто це можна зробити, спростивши структуру речень або команд до їх найпростішого формату. + +## Уникайте ідіом, жаргону, акронімів та скорочень + +Ідіоми, жаргон, скорочення та акроніми можуть заплутати читачів, які не знайомі з ними, особливо тих, хто не є носіями мови, нових співробітників або людей, які не належать до вашої конкретної галузі. + +**Ідіоми** часто мають культурну специфіку і можуть бути важкими для розуміння міжнародним читачам.\ +**Жаргон** включає спеціалізовані терміни, які можуть розуміти лише експерти в певній галузі.\ +**Скорочення** замінюють слова в англійській мові скороченими формами, але такі скорочення не завжди існують у всіх мовах, що ускладнює переклад.\ +**Акроніми** можуть бути неоднозначними, особливо якщо вони не визначені при першому використанні. + +Приклад: + +❌ "Once you’ve got the hang of the dashboard, the rest is a piece of cake." Тут автор використовує скорочення, сленг та ідіому. + +✅ "Once you have learned how to use the dashboard, the rest is easy." Замінивши скорочення, сленг та ідіоми словами, пов'язаними з кожним з них, значення стає зрозумілим. + +Фігуративні вирази, такі як ідіоми, часто важко перекласти. Технічні письменники або перекладачі можуть зіткнутися з труднощами при передачі того самого значення іншими мовами. + +Приклад: + +❌ "Let’s touch base next week to circle back on the open tickets." + +✅ "Let us meet next week to review the unresolved support requests." + +Жаргонні слова та абревіатури можуть викликати плутанину — навіть у межах однієї організації — якщо їх значення не є загальновідомими. + +Приклад: + +❌ "Upload the CSV to the CMS and tag it according to SOPs." + +✅ "Upload the CSV (Comma-Separated Values file) to the content management system and label it according to the standard operating procedures." + +Примітка: Якщо ви хочете використовувати акроніми, завжди визначайте їх при першому використанні: «Система управління взаємовідносинами з клієнтами (CRM)». + +Вилучивши ідіоми та непотрібний жаргон, ви зробите зміст вашого документа більш зрозумілим. Заміна скорочень словами, які вони позначають, означає, що переклад на всі мови стає простішим. Ваш документ буде найбільш зрозумілим для читача, якщо ви заміните або поясните абревіатури. + +## Використовуйте Active Voice + +Active voice підкреслює виконавця дії, даючи зрозуміти, хто або що є відповідальним за дію дієслова. + +Приклад: + +The system opens the dialog where you need to complete the form. + +Будь ласка, утримайтеся від використання складної форми, оскільки вона може заплутати читачів. + +Більше інформації про використання активного голосу та важливість його використання див. [цю думку](active_voice.md) та [це зовнішнє джерело](https://developers.google.com/tech-writing/one/active-voice). + +## Опис кроків + +Якщо у документації є конкретні кроки, розділіть їх один від одного. + +Наприклад: + +Step 1 - Go to the section\ +Step 2 - Click the button\ +Step 3 - Complete the form\ +...\ +Step N - save changes + +## Додавайте скріншоти де необхідно + +Використовуйте правильні знімки екрана, де це необхідно. Це означає, що вам не потрібно додавати скріншоти всюди, а лише в тих місцях, де потрібні додаткові пояснення. + +## Використовуйте приклади + +Якщо потрібно заповнити форму, наведіть приклади того, як користувачі можуть її заповнити. Вкажіть обмеження, якщо вони є. + +## Висновок + +Написання хорошої документації – це не тільки забезпечення її технічної точності, але й дуже важливо зробити її зрозумілою для читача з першого погляду. Це особливо важливо, коли технічний документ потрібно перекласти на інші мови. У цьому документі автор мав на меті висвітлити конкретні техніки написання якісної та зрозумілої документації. From 3c16497019144dd246ed17c9f2ea772e32658f28 Mon Sep 17 00:00:00 2001 From: tianci li <86754294+jimcat8@users.noreply.github.com> Date: Tue, 19 Aug 2025 21:26:21 +0800 Subject: [PATCH 112/164] Expand some content (#2823) * Expand some content * Change the capitalization of specific vocabulary --- docs/books/admin_guide/12-network.md | 62 +++++++++++++++++++++++++--- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/docs/books/admin_guide/12-network.md b/docs/books/admin_guide/12-network.md index 6545120ce3..a20ab174e1 100644 --- a/docs/books/admin_guide/12-network.md +++ b/docs/books/admin_guide/12-network.md @@ -53,19 +53,71 @@ The notation called CIDR is more and more frequent: 192.168.1.10/24 IP addresses are used for the proper routing of messages (packets). They are divided into two parts: -* the fixed part, identifying the network; -* the identifier of the host in the network. +* network bits - The part associated with consecutive "1s" in the binary subnet mask +* host bits - The part associated with consecutive "0s" in the binary subnet mask -The subnet mask is a set of **4 bytes** intended to isolate: +``` + |<- host bits ->| + |<-- network bits -->| +192.168.1.10 ==> 11000000.10101000.00000001.00001010 +255.255.255.0 ==> 11111111.11111111.11111111.00000000 +``` + +The subnet mask is used to define the network bits and host bits of an IP address. By using subnet mask, we can determine the current IP address: * the network address (**NetID** or **SubnetID**) by performing a bitwise logical AND between the IP address and the mask; * the host address (**HostID**) by performing a bitwise logical AND between the IP address and the complement of the mask. +``` +192.168.1.10 ==> 11000000.10101000.00000001.00001010 +255.255.255.0 ==> 11111111.11111111.11111111.00000000 + +NetID 11000000.10101000.00000001.00001010 + 192 . 168 . 100 . 0 + +HostID 00000000.00000000.00000000.00001010 + 0 . 0 . 0 . 10 +``` + +**Legitimate subnet mask** - In order from left to right, consecutive 1s can be defined as valid subnet masks. + +``` +legitimate 11111111.11111111.11111111.00000000 + +illegitimate 11001001.11111111.11111111.00000000 +``` + +!!! tip + + The IP address and subnet mask must appear in pairs, which is determined by the basic principles of network communication. + There are also specific addresses within a network, which must be identified. The first address of a range as well as the last one have a particular role: -* The first address of a range is the **network address**. It is used to identify networks and to route information from one network to another. +* The first address of a range is the **network address**. It is used to identify networks and to route information from one network to another. This address can be obtained through Logic and Operations. + + ``` + 192.168.1.10 ==> 11000000.10101000.00000001.00001010 + 255.255.255.0 ==> 11111111.11111111.11111111.00000000 + + network address 11000000.10101000.00000001.00000000 + 192 . 168 . 100 . 0 + ``` + + **Logic and Operations** - When both are true (1), the result is true (1); otherwise, it is false (0) + +* The last address of a range is the **broadcast address**. It is used to broadcast information to all the machines on the network. Keep the network bits unchanged and replace all host bits with 1 to obtain the this address. + + ``` + 192.168.1.10 ==> 11000000.10101000.00000001.00001010 + 255.255.255.0 ==> 11111111.11111111.11111111.00000000 + + broadcast address 11000000.10101000.00000001.11111111 + 192 . 168 . 100 . 255 + ``` + +!!! tip -* The last address of a range is the **broadcast address**. It is used to broadcast information to all the machines on the network. + These two addresses that play special roles **cannot** be assigned to the terminal machine for use. ### MAC address / IP address From e1dae67e9c2456c6bb09bd4db8ba47f95e01610d Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Tue, 19 Aug 2025 08:53:56 -0500 Subject: [PATCH 113/164] fix typo lab 6 (#2837) * UID/GID should be 1000 for first added user in the system. (correct elsewhere) --- .../systems_administration_I/lab6-user_and_group_management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/labs/systems_administration_I/lab6-user_and_group_management.md b/docs/labs/systems_administration_I/lab6-user_and_group_management.md index be93584129..86b304e18b 100644 --- a/docs/labs/systems_administration_I/lab6-user_and_group_management.md +++ b/docs/labs/systems_administration_I/lab6-user_and_group_management.md @@ -205,7 +205,7 @@ You will edit the *passwd file* using the format displayed above. Add the text below to the bottom or end of the file: ```bash - me:x:500:500:me mao:/home/me:/bin/bash + me:x:1000:1000:me mao:/home/me:/bin/bash ``` 2. Save your changes and close the `etc/passwd` file. From 60b8aa05622080e5909cfa8dc7d868238e401817 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BlueT=20-=20Matthew=20Lien=20-=20=E7=B7=B4=E5=96=86?= =?UTF-8?q?=E6=98=8E?= Date: Wed, 20 Aug 2025 21:30:59 +0800 Subject: [PATCH 114/164] fix rsync module name in add_mirror_manager.md (#2838) As in mattermost Infrastructure channel, Louis Abel @label and @NeilHanlon mentioned the rsync module name of rockylinux has been changed to rocky-linux --- docs/guides/mirror_management/add_mirror_manager.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/mirror_management/add_mirror_manager.md b/docs/guides/mirror_management/add_mirror_manager.md index f5c5824415..fef5281f8c 100644 --- a/docs/guides/mirror_management/add_mirror_manager.md +++ b/docs/guides/mirror_management/add_mirror_manager.md @@ -15,7 +15,7 @@ Please note that we cannot accept public mirrors in countries subject to US expo As of this writing (late 2022), storage space requirements for mirroring all current and past Rocky Linux releases is about 2 TB. -Our master mirror is `rsync://msync.rockylinux.org/rocky/mirror/pub/rocky/`. +Our master mirror is `rsync://msync.rockylinux.org/rocky-linux`. For your first synchronization use a mirror near to you. You can find all official mirrors [here](https://mirrors.rockylinux.org). Please note that we might restrict access to the official master mirror to official public mirrors in the future. So please consider `rsyncing` from a public mirror close to you if you are running a private mirror. Also local mirrors might be faster to sync from. From 40af00db3a4eb5d3daf187e9645f6f1898b0c8a6 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Wed, 20 Aug 2025 09:32:31 -0400 Subject: [PATCH 115/164] New Crowdin updates (#2839) * New translations index.md (French) * New translations good_docs.md (German) * New translations index.md (Portuguese) * New translations good_docs.md (German) --- docs/index.fr.md | 2 +- docs/rocky_insights/blogs/good_docs.de.md | 88 ++++++++++++++++++++++ docs/rocky_insights/links/sigs/index.pt.md | 2 +- 3 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 docs/rocky_insights/blogs/good_docs.de.md diff --git a/docs/index.fr.md b/docs/index.fr.md index 292fccc0c8..b7f6dc070e 100644 --- a/docs/index.fr.md +++ b/docs/index.fr.md @@ -52,6 +52,6 @@ Si c'est la première fois que vous visitez le site de documentation de Rocky Li Si vous êtes coincé et que vous avez une question, la communauté Rocky Linux est là pour vous aider. Visitez le [forum de la communauté](https://forums.rockylinux.org) et vous pourrez rechercher des solutions et poster vos propres questions à la communauté. -## Contribuer +## Votre Contribution Avez-vous trouvé quelque chose de manquant ? Avez-vous trouvé une erreur ? Vous vous demandez comment créer votre propre document ou comment en corriger un ? Rappelez-vous lorsque nous avons dit que *vous* étiez la communauté Rocky Linux ? Eh bien, cela signifie que *vous* êtes important pour nous et nous voulons que vous nous rejoigniez, si vous le souhaitez, et aider à améliorer cette documentation. Si cela vous intéresse, rendez-vous sur notre [Guide de Contribution](https://github.com/rocky-linux/documentation/blob/main/README.md) pour savoir comment faire ! diff --git a/docs/rocky_insights/blogs/good_docs.de.md b/docs/rocky_insights/blogs/good_docs.de.md new file mode 100644 index 0000000000..f0ac6dc06b --- /dev/null +++ b/docs/rocky_insights/blogs/good_docs.de.md @@ -0,0 +1,88 @@ +--- +title: Gute Dokumentation – Die Sicht eines Übersetzers +author: Ganna Zhyrnova +contributors: Steven Spencer +--- + +## Einleitung + +Übersetzer bieten wertvolle Einblicke in das Verfassen klarer und prägnanter Dokumentationen. Sie wissen besser als die meisten anderen, was sich nicht gut übersetzen lässt und was einen Leser verwirrt. In diesem Dokument werden einige dieser Probleme untersucht und bewährte Vorgehensweisen für die Dokumentations-Erstellung hervorgehoben. + +### Über den Autor + +Mithilfe der Softwaredokumentation können Benutzer besser verstehen, wie sie eine bestimmte Software effektiv nutzen können. Sie müssen verstehen, was sie am Ende haben und welche Vorteile sie haben werden. Gleichzeitig bedeutet das Erstellen einer Dokumentation, dass Sie diese nicht nur für sich selbst, sondern auch für Ihr Netzwerk und für andere Personen erstellen, die sie möglicherweise lesen. Andere Personen stammen möglicherweise nicht aus englischsprachigen Ländern. Das bedeutet, dass Englisch für sie nicht ihre Muttersprache ist. Befolgen Sie daher diese Grundregeln, um Ihre Dokumentation für _alle_ Benutzer lesbarer zu machen. + +## Verständliche Sprache verwenden + +Es ist grundsätzlich nicht ersichtlich, wer die Nutzer der Dokumentation sind. Ob der Benutzer sich auf diesem Gebiet auskennt oder nicht, ob er ein erfahrener Entwickler oder ein Anfänger ist. Einfache Sprache bedeutet klare, prägnante Kommunikation, die für die Zielgruppe auf den ersten Blick leicht verständlich ist. Vermeiden Sie Fachjargon, übermäßig technische Begriffe und komplexe Satzstrukturen und verwenden Sie stattdessen eine einfachere, klar strukturierte Sprache. Ziel ist es, sicherzustellen, dass die Botschaft für ein breites Publikum zugänglich und verständlich ist, unabhängig von dessen Hintergrund oder Leseniveau. Dies kann häufig durch Vereinfachung der Syntax von Sätzen oder Befehlen auf eine einfachere Form erreicht werden. + +## Vermeiden Sie Redewendungen, Fachjargon, Akronyme und Abkürzungen + +Redewendungen, Fachjargon, Abkürzungen und Akronyme können für Leser, die damit nicht vertraut sind, verwirrend sein. Dies gilt insbesondere für Nicht-Muttersprachler, neue Mitarbeiter oder Personen, die mit Ihrer spezifischen Branche nicht vertraut sind. + +**Redewendungen, Idioms** sind oft kulturspezifisch und können für internationale Leser schwer verständlich sein.\ +**Jargon** umfasst Fachbegriffe, die nur Experten auf einem bestimmten Gebiet verstehen.\ +**Kontraktionen** ersetzen englische Wörter durch Abkürzungen, aber diese gibt es nicht immer in allen Sprachen, was die Übersetzung erschwert.\ +**Akronyme** können mehrdeutig sein, insbesondere wenn sie bei ihrer Verwendung nicht definiert sind. + +Beispiel: + +❌ "Once you’ve got the hang of the dashboard, the rest is a piece of cake." In diesem Fall verwendet der Autor sowohl eine Kontraktion, Slang als auch eine Redewendung. + +✅ "Once you have learned how to use the dashboard, the rest is easy." Durch Ersetzen der Kontraktion, des Slangs und der Redewendung durch die jeweils zugehörigen Wörter wird die Bedeutung klar. + +Bildliche Ausdrücke, wie etwa Redewendungen, sind oft schwer zu übersetzen. Technische Redakteure oder Übersetzer haben möglicherweise Schwierigkeiten, dieselbe Bedeutung in anderen Sprachen wiederzugeben. + +Beispiel: + +❌ "Let’s touch base next week to circle back on the open tickets." + +✅ "Let us meet next week to review the unresolved support requests." + +Fachjargon und Abkürzungen können – sogar innerhalb derselben Organisation – verwirrend sein, wenn ihre Bedeutung nicht allgemein bekannt ist. + +Beispiel: + +❌ "Upload the CSV to the CMS and tag it according to SOPs." + +✅ "Upload the CSV (Comma-Separated Values file) to the content management system and label it according to the standard operating procedures." + +Hinweis: Wenn Sie Akronyme verwenden möchten, definieren Sie diese immer gleich beim ersten Mal: „Customer Relationship Management (CRM)-System“. + +Durch die Vermeidung von Redewendungen und unnötigem Fachjargon wird die Bedeutung Ihres Dokuments klarer. Das Ersetzen von Kontraktionen durch die entsprechende Wörter, die sie darstellen, erleichtert die Übersetzung in alle Sprachen. Ihr Dokument ist für den Leser am verständlichsten, wenn Sie Akronyme ersetzen oder definieren. + +## Tätigkeitsform (Aktiv) verwenden + +Die aktive Form betont, wer die Handlung ausführt, und macht deutlich, wer oder was für die Handlung des Verbs verantwortlich ist. + +Beispiel: + +The system opens the dialog where you need to complete the form. + +Bitte verzichten Sie auf die Verwendung der komplexen Form, da diese für die Leser verwirrend sein kann. + +Weitere Informationen zur Verwendung der Aktivform und ihrer Bedeutung finden Sie in [dieser Meinung](active_voice.md) und [dieser externen Quelle](https://developers.google.com/tech-writing/one/active-voice). + +## Spezifische Schritte + +Wenn die Dokumentation bestimmte Schritte enthält, trennen Sie diese voneinander. + +Zum Beispiel: + +Step 1 - Go to the section\ +Step 2 - Click the button\ +Step 3 - Complete the form\ +...\ +Step N - save changes + +## Screenshots wenn nötig + +Verwenden Sie bei Bedarf geeignete Screenshots. Das bedeutet, dass Sie nicht überall Screenshots hinzufügen müssen, sondern nur an den Stellen, an denen zusätzliche Erklärungen erforderlich sind. + +## Verwenden Sie Beispiele + +Wenn Sie ein Formular ausfüllen müssen, geben Sie Beispiele dafür, wie Benutzer es ausfüllen können. Erwähnen Sie Einschränkungen, falls vorhanden. + +## Zusammenfassung + +Beim Verfassen einer guten Dokumentation geht es nicht nur darum, dass sie technisch korrekt ist, sondern auch darum, dass sie für den Leser sofort verständlich ist. Dies ist besonders wichtig, wenn ein technisches Dokument in andere Sprachen übersetzt werden muss. In diesem Dokument wollte der Autor bestimmte Techniken zum Schreiben guter und klarer Dokumentationen hervorheben. diff --git a/docs/rocky_insights/links/sigs/index.pt.md b/docs/rocky_insights/links/sigs/index.pt.md index 48f433e8b7..1dea24ce9e 100644 --- a/docs/rocky_insights/links/sigs/index.pt.md +++ b/docs/rocky_insights/links/sigs/index.pt.md @@ -1,5 +1,5 @@ --- -title: Grupo de Interesse Especial (SIG) +title: Grupos de Interesse Especial (SIG) author: Steven Spencer contributors: --- From ccedd334117a4b6abbc6439a24cf800e7e58e48d Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Thu, 21 Aug 2025 10:17:33 -0400 Subject: [PATCH 116/164] New Crowdin updates (#2840) * New translations add_mirror_manager.md (French) * New translations add_mirror_manager.md (French) * New translations add_mirror_manager.md (French) * New translations nmcli.md (French) --- docs/gemstones/network/nmcli.fr.md | 6 +++--- .../mirror_management/add_mirror_manager.fr.md | 18 +++++++++--------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/gemstones/network/nmcli.fr.md b/docs/gemstones/network/nmcli.fr.md index 7f1f470b25..9549cdf1d6 100644 --- a/docs/gemstones/network/nmcli.fr.md +++ b/docs/gemstones/network/nmcli.fr.md @@ -1,11 +1,11 @@ --- -title: nmcli - définir la connexion automatique -author: wale soyinka +title: nmcli — Définition de la Connexion Automatique +author: Wale Soyinka tags: - nmcli --- -# Modifier la propriété 'autoconnect' du profil de connexion de NetworkManager +# Modifier la propriété `autoconnect` du profil de connexion de NetworkManager Utilisez d'abord `nmcli` pour lire et afficher la valeur actuelle de la propriété de connexion automatique pour toutes les connexions réseau sur un système Rocky Linux. Entrer la commande suivante : diff --git a/docs/guides/mirror_management/add_mirror_manager.fr.md b/docs/guides/mirror_management/add_mirror_manager.fr.md index be3b19bcf5..5e17fd0358 100644 --- a/docs/guides/mirror_management/add_mirror_manager.fr.md +++ b/docs/guides/mirror_management/add_mirror_manager.fr.md @@ -1,5 +1,5 @@ --- -title: Ajout d'un Rocky Mirror +title: Ajout d'un Miroir Rocky Linux contributors: Amin Vakil, Steven Spencer, Ganna Zhyrnova --- @@ -11,17 +11,17 @@ Nous accueillons volontiers de nouveaux miroirs publics. Mais ils devraient êtr Veuillez ne pas soumettre de miroirs qui sont hébergés dans un Anycast-CDN comme Cloudflare, etc., car cela peut conduire à des performances sous-optimales avec la sélection du miroir le plus rapide dans `dnf`. -Veuillez noter que nous ne sommes pas autorisés à accepter les miroirs publics dans les pays soumis à la réglementation des États-Unis en matière d'exportation. Vous pouvez trouver une liste de ces pays ici : [https://www.bis.doc.gov/index.php/policy-guidance/country-guidance/sanctioned-destinations](https://www.bis.doc.gov/index.php/policy-guidance/country-guidance/sanctioned-destinations) +Veuillez noter que nous ne sommes pas autorisés à accepter les miroirs publics dans les pays soumis à la réglementation des États-Unis en matière d'exportation. Vous trouverez une liste de ces pays ici : À partir de fin 2022 (date de cet article), l'espace de stockage requis pour accueillir toutes les versions actuelles et anciennes de Rocky Linux est d'environ 2 Téraoctets. -Notre miroir principal est `rsync://msync.rockylinux.org/rocky/mirror/pub/rocky/`. Pour votre première synchronisation, utilisez un miroir près de chez vous. Vous trouverez tous les sites miroirs [ici](https://mirrors.rockylinux.org). +Notre miroir principal est `rsync://msync.rockylinux.org/rocky-linux`. Pour votre première synchronisation, utilisez un miroir près de chez vous. Vous trouverez tous les sites miroirs [ici](https://mirrors.rockylinux.org). Veuillez noter que nous pourrions restreindre l'accès au miroir principal officiel aux miroirs publics officiels à l'avenir. Alors s'il vous plaît envisagez `de resynchroniser` depuis un miroir public près de chez vous si vous utilisez un miroir privé. La synchronisation à partir de miroirs locaux devrait également être plus efficace. ## Configuration de votre Miroir -Veuillez configurer une tâche cron pour synchroniser votre miroir périodiquement et le laisser tourner environ 6 fois par jour. Mais assurez-vous de synchroniser l'heure avec un délai aléatoire pour aider à répartir la charge au fil du temps. Si vous ne vérifiez que les modifications de `fullfiletimelist-rocky` et faites une synchronisation complète que si ce fichier a changé, vous pouvez synchroniser toutes les heures. +Veuillez configurer une tâche cron pour synchroniser votre miroir périodiquement et le laisser tourner environ 6 fois par jour. Mais assurez-vous de synchroniser l'heure avec un délai aléatoire pour aider à répartir la charge au fil du temps. Si vous surveillez seulement les modifications apportées à `fullfiletimelist-rocky` et que vous effectuez une synchronisation complète uniquement si ce fichier a changé, vous pouvez effectuer une synchronisation toutes les heures. Voici quelques exemples de crontab pour vous : @@ -63,9 +63,9 @@ Rocky utilise 'Fedora's Mirror Manager' pour organiser des miroirs communautaire Accédez au gestionnaire de miroir de Rocky Linux ici : -Après une connexion réussie, votre profil apparaîtra en haut à droite. Sélectionnez le menu déroulant puis cliquez sur "My sites". +Après une connexion réussie, votre profil apparaîtra en haut à droite. Sélectionnez la liste déroulante puis cliquez sur `My sites`. -Une nouvelle page affichera la liste de tous les sites sous les données du compte. La première fois, elle sera vide. Cliquez sur "Enregistrer un nouveau site". +Une nouvelle page affichera la liste de tous les sites sous les données du compte. La première fois, elle sera vide. Cliqez sur `Register a new site`. Une nouvelle page chargera avec une importante déclaration de conformité d'exportation. Remplissez ensuite les informations suivantes : @@ -77,15 +77,15 @@ Une nouvelle page chargera avec une importante déclaration de conformité d'exp - "All sites can pull from me?" - Permet à tous les sites miroirs de faire un pull du site sans les ajouter explicitement à ma liste. - "Comments for downstream siteadmins. Please include your synchronization source here to avoid dependency loops." -En cliquant sur "Submit", vous serez renvoyé à la page principale du miroir. +En cliquant sur `Submit`, vous serez renvoyé à la page principale du miroir. ## Configuration du Site -À partir de la page principale du miroir, sélectionnez la liste déroulante, puis cliquez sur "Mes sites". +Sélectionnez le menu déroulant de la page miroir principale, puis cliquez sur `My sites`. La page du site du compte se chargera et le site devrait être listé. Cliquez dessus pour accéder au site d'information. -Toutes les options de la dernière section sont listées à nouveau. Au bas de la page se trouvent trois nouvelles options : Admins, Hôtes et Supprimer le site. Cliquez sur "Hosts [add]". +Toutes les options de la dernière section sont listées à nouveau. Au bas de la page se trouvent trois nouvelles options : Admins, Hôtes et Supprimer le site. Cliquez sur `Hosts [add]`. ## Création d'un nouvel Hôte From ba49ddeac9e0e0de5a3b511a9a86561df5b9ad0f Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Fri, 22 Aug 2025 08:32:32 -0400 Subject: [PATCH 117/164] New Crowdin updates (#2842) * New translations add_mirror_manager.md (French) * New translations nmcli.md (French) * New translations index.md (French) * New translations index.md (French) * New translations screenshot.md (French) * New translations flatpak.md (French) * New translations hp-all-in-one.md (French) * New translations x11vnc_plus_ssh_lan.md (French) * New translations decibels.md (French) * New translations decoder.md (French) * New translations file-shredder.md (French) * New translations terminator.md (French) * New translations gnome-extensions.md (French) * New translations ksnip.md (French) * New translations brother-all-in-one.md (French) * New translations ksnip.md (German) * New translations brother-all-in-one.md (German) * New translations dconf.md (German) * New translations businessapps.md (German) * New translations onlineaccounts.md (German) * New translations decoder.md (German) * New translations appimage_pool.md (German) * New translations gnome-extensions.md (German) --- docs/desktop/appimage/appimage_pool.de.md | 2 +- docs/desktop/gnome/dconf.de.md | 6 +- docs/desktop/gnome/decibels.fr.md | 22 +++---- docs/desktop/gnome/decoder.de.md | 34 +++++----- docs/desktop/gnome/decoder.fr.md | 36 +++++----- docs/desktop/gnome/file-shredder.fr.md | 8 +-- docs/desktop/gnome/flatpak.fr.md | 66 +++++++++---------- docs/desktop/gnome/gnome-extensions.de.md | 2 +- docs/desktop/gnome/gnome-extensions.fr.md | 4 +- docs/desktop/gnome/onlineaccounts.de.md | 2 +- docs/desktop/gnome/screenshot.fr.md | 6 +- docs/desktop/gnome/x11vnc_plus_ssh_lan.fr.md | 10 +-- .../desktop/printing/brother-all-in-one.de.md | 14 ++-- .../desktop/printing/brother-all-in-one.fr.md | 14 ++-- docs/desktop/printing/hp-all-in-one.fr.md | 2 +- docs/desktop/tools/businessapps.de.md | 6 +- docs/desktop/tools/ksnip.de.md | 4 +- docs/desktop/tools/ksnip.fr.md | 6 +- docs/desktop/tools/terminator.fr.md | 2 +- docs/gemstones/network/nmcli.fr.md | 2 +- .../add_mirror_manager.fr.md | 2 +- docs/index.fr.md | 10 +-- 22 files changed, 130 insertions(+), 130 deletions(-) diff --git a/docs/desktop/appimage/appimage_pool.de.md b/docs/desktop/appimage/appimage_pool.de.md index 7461f0b733..0e583672ee 100644 --- a/docs/desktop/appimage/appimage_pool.de.md +++ b/docs/desktop/appimage/appimage_pool.de.md @@ -24,7 +24,7 @@ Installieren Sie das Flatpak-Paket für AppImagePool: flatpak install flathub io.github.prateekmedia.appimagepool ``` -## Erkunden von AppImage Launcher +## Erkundung von `AppImage Launcher` Sobald AppImagePool auf Ihrem System installiert ist, starten Sie es und erkunden Sie die verfügbaren AppImages. diff --git a/docs/desktop/gnome/dconf.de.md b/docs/desktop/gnome/dconf.de.md index af26db533d..5fbdc36e00 100644 --- a/docs/desktop/gnome/dconf.de.md +++ b/docs/desktop/gnome/dconf.de.md @@ -1,5 +1,5 @@ --- -title: dconf Config Editor +title: dconf – Config Editor author: Ezequiel Bruni contributors: Steven Spencer, Ganna Zhyrnova --- @@ -28,8 +28,8 @@ Wenn Sie nicht sicher sind, was eine bestimmte Einstellung bewirkt, recherchiere Für diese Anleitung benötigen Sie Folgendes: -- Rocky Linux inklusiv GNOME. -- Berechtigung, Software auf Ihrem System zu installieren (`sudo`-Rechte). + - Rocky Linux inklusiv GNOME. + - Berechtigung, Software auf Ihrem System zu installieren (`sudo`-Rechte). ## `dconf Editor` — Installation diff --git a/docs/desktop/gnome/decibels.fr.md b/docs/desktop/gnome/decibels.fr.md index 3646c2696e..f74fe086f8 100644 --- a/docs/desktop/gnome/decibels.fr.md +++ b/docs/desktop/gnome/decibels.fr.md @@ -12,9 +12,9 @@ contributors: Steven Spencer, Ganna Zhyrnova Ce guide suppose que vous disposez de la configuration suivante : -- Rocky Linux -- Flatpak -- FlatHub + - Rocky Linux + - Flatpak + - FlatHub ## Processus d'Installation @@ -26,15 +26,15 @@ Accédez à [Flathub.org](https://flathub.org), tapez `Decibels` dans la barre d 2. Copiez le script d'installation manuelle et exécutez-le dans un terminal : - ```bash - flatpak install flathub org.gnome.Decibels - ``` + ```bash + flatpak install flathub org.gnome.Decibels + ``` 3. Enfin, copiez la commande à lancer et exécutez-la dans votre terminal : - ```bash - flatpak run org.gnome.Decibels - ``` + ```bash + flatpak run org.gnome.Decibels + ``` ## Mode d'emploi @@ -42,11 +42,11 @@ Pour utiliser le programme `Decibels`, procédez comme suit : 1. Cliquez sur **Open** - ![Screenshot of Decibels' landing page with a red rectangle surrounding the blue open button](images/02_decibels.png) + ![Screenshot of Decibels' landing page with a red rectangle surrounding the blue open button](images/02_decibels.png) 2. Sélectionnez le fichier souhaité et cliquez sur le bouton **Open** qui apparaîtra dans le coin supérieur droit de l'écran - ![Screenshot of Decibels file selection interface with numbered arrows indicating audio file and Open button](images/03_decibels.png) + ![Screenshot of Decibels file selection interface with numbered arrows indicating audio file and Open button](images/03_decibels.png) !!! note "Remarque" diff --git a/docs/desktop/gnome/decoder.de.md b/docs/desktop/gnome/decoder.de.md index 5323f96646..6287d79ce1 100644 --- a/docs/desktop/gnome/decoder.de.md +++ b/docs/desktop/gnome/decoder.de.md @@ -12,34 +12,34 @@ Benötigen Sie einen QR-Code für Ihre Website, Anwendung oder Social-Media-Prof Für diese Anleitung benötigen Sie Folgendes: -- Rocky Linux -- Flatpak -- FlatHub + - Rocky Linux + - Flatpak + - FlatHub ## Installations-Ablauf 1. Gehen Sie zu [Flathub.org] (https://flathub.org), geben Sie `Decoder` in die Suchleiste ein und klicken Sie auf **Install**. ![Screenshot of the install button highlighted by a red rectangle](images/01_decoder.png) - ![manual install script and run script](images/decoder_install.png) + ![manual install script and run script](images/decoder_install.png) 2. Kopieren Sie das manuelle Installationsskript und führen Sie es in einem Terminal aus: - ```bash - flatpak install flathub com.belmoussaoui.Decoder - ``` + ```bash + flatpak install flathub com.belmoussaoui.Decoder + ``` 3. Kopieren Sie abschließend den Ausführungsbefehl und rufen Sie ihn in Ihrem Terminal auf: - ```bash - flatpak run com.belmoussaoui.Decoder - ``` + ```bash + flatpak run com.belmoussaoui.Decoder + ``` ## So erstellen Sie einen QR-Code Es stehen zwei Arten von QR-Codes zur Verfügung. Wählen Sie die Option, die Ihren Anforderungen am besten entspricht: -- [Text](#text) -- [Wifi](#wifi) + - [Text](#text) + - [Wifi](#wifi) ### Text @@ -51,7 +51,7 @@ Es stehen zwei Arten von QR-Codes zur Verfügung. Wählen Sie die Option, die Ih 3. Auf **Create** klicken - ![Screenshot of the Save and Export screen with arrows](images/03_decoder-text.png) + ![Screenshot of the Save and Export screen with arrows](images/03_decoder-text.png) 4. Auf **Save** klicken @@ -71,21 +71,21 @@ Es stehen zwei Arten von QR-Codes zur Verfügung. Wählen Sie die Option, die Ih ### So scannen Sie einen QR-Code -Zusätzlich zum Erstellen und Generieren von QR-Codes können Sie mit Decoder auch QR-Codes scannen, die Sie auf Ihrem Computer gespeichert haben. So funktioniert es: +Zusätzlich zum Erstellen und Generieren von QR-Codes können Sie mit Decoder auch QR-Codes scannen, die Sie auf Ihrem Computer gespeichert haben. Gehen Sie folgendermaßen vor: ![Screenshot of a red circle on a grey button that has the word "Scan" written in black.](images/01_decoder-scan.png) 1. Auf **Scan** klicken - ![Screenshot of the rectangular button with the words "From a Screenshot" written in white.](images/02_decoder-scan.png) + ![Screenshot of the rectangular button with the words "From a Screenshot" written in white.](images/02_decoder-scan.png) 2. Auf **From a Screenshot** klicken - ![Screenshot of grey square surrounding options menu, and red square surrounding the "Take a Screenshot button"](images/03_decoder-scan.png) + ![Screenshot of grey square surrounding options menu, and red square surrounding the "Take a Screenshot button"](images/03_decoder-scan.png) 3. Wählen Sie die gewünschten Effekte aus und klicken Sie auf **Screenshot erstellen** - ![Screenshot of a red arrow pointing at a blue button that has the word "Share" written in white](images/04_decoder-scan.png) + ![Screenshot of a red arrow pointing at a blue button that has the word "Share" written in white](images/04_decoder-scan.png) 4. Auf **Share** klicken diff --git a/docs/desktop/gnome/decoder.fr.md b/docs/desktop/gnome/decoder.fr.md index a08a0f4ea1..6dd0ce6acd 100644 --- a/docs/desktop/gnome/decoder.fr.md +++ b/docs/desktop/gnome/decoder.fr.md @@ -6,40 +6,40 @@ contributors: Steven Spencer, Ganna Zhyrnova ## Introduction -Besoin d'un code QR pour votre site Web, votre application ou vos profils de réseaux sociaux ? Découvrez Decoder ! C'est une application qui permet de créer, d'enregistrer et d'exporter des codes QR. +Besoin d'un code QR pour votre site Web, votre application ou vos profils de réseaux sociaux ? Découvrez `Decoder` ! C'est une application qui permet de créer, d'enregistrer et d'exporter des codes QR. ## Prérequis Ce guide suppose que vous disposez de la configuration suivante : -- Rocky Linux -- Flatpak -- FlatHub + - Rocky Linux + - Flatpak + - FlatHub ## Processus d'Installation 1. Accédez au [site Web Flathub](https://flathub.org/), tapez `Decoder` dans la barre de recherche et cliquez sur **Install**. ![Screenshot of the install button highlighted by a red rectangle](images/01_decoder.png) - ![manual install script and run script](images/decoder_install.png) + ![manual install script and run script](images/decoder_install.png) 2. Copiez le script d'installation manuelle et exécutez-le dans un terminal : - ```bash - flatpak install flathub com.belmoussaoui.Decoder - ``` + ```bash + flatpak install flathub com.belmoussaoui.Decoder + ``` 3. Enfin, copiez la commande à lancer et exécutez-la dans votre terminal : - ```bash - flatpak run com.belmoussaoui.Decoder - ``` + ```bash + flatpak run com.belmoussaoui.Decoder + ``` ## Comment créer un code QR Deux types de codes QR sont disponibles. Choisissez l'option qui correspond le mieux à vos besoins : -- [Text](#text) -- [Wifi](#wifi) + - [Text](#text) + - [Wifi](#wifi) ### Text @@ -51,7 +51,7 @@ Deux types de codes QR sont disponibles. Choisissez l'option qui correspond le m 3. Cliquez sur **Create**. - ![Screenshot of the Save and Export screen with arrows](images/03_decoder-text.png) + ![Screenshot of the Save and Export screen with arrows](images/03_decoder-text.png) 4. Cliquez sur **Save** @@ -71,21 +71,21 @@ Deux types de codes QR sont disponibles. Choisissez l'option qui correspond le m ### Comment scanner un code QR -En plus de créer et de générer des codes QR, vous pouvez utiliser `Decoder` pour scanner les codes QR que vous avez enregistrés sur votre ordinateur. Voici comment : +En plus de créer et de générer des codes QR, vous pouvez utiliser `Decoder` pour scanner les codes QR que vous avez enregistrés sur votre ordinateur. Voici comment procéder : ![Screenshot of a red circle on a grey button that has the word "Scan" written in black.](images/01_decoder-scan.png) 1. Cliquez sur **Scan** - ![Screenshot of the rectangular button with the words "From a Screenshot" written in white.](images/02_decoder-scan.png) + ![Screenshot of the rectangular button with the words "From a Screenshot" written in white.](images/02_decoder-scan.png) 2. Cliquez sur **From a Screenshot** - ![Screenshot of grey square surrounding options menu, and red square surrounding the "Take a Screenshot button"](images/03_decoder-scan.png) + ![Screenshot of grey square surrounding options menu, and red square surrounding the "Take a Screenshot button"](images/03_decoder-scan.png) 3. Choisissez les effets souhaités et cliquez sur **Prendre une capture d'écran** - ![Screenshot of a red arrow pointing at a blue button that has the word "Share" written in white](images/04_decoder-scan.png) + ![Screenshot of a red arrow pointing at a blue button that has the word "Share" written in white](images/04_decoder-scan.png) 4. Cliquez sur **Share** diff --git a/docs/desktop/gnome/file-shredder.fr.md b/docs/desktop/gnome/file-shredder.fr.md index 11502151b1..f5fc9ddc70 100644 --- a/docs/desktop/gnome/file-shredder.fr.md +++ b/docs/desktop/gnome/file-shredder.fr.md @@ -12,9 +12,9 @@ Besoin de supprimer une carte postale ou un fichier PDF contenant des informatio Ce guide suppose que vous disposez de la configuration suivante : -- Rocky Linux -- Flatpak -- FlatHub + - Rocky Linux + - Flatpak + - FlatHub ## Processus d'Installation @@ -50,4 +50,4 @@ Pour utiliser le programme `File Shredder`, procédez comme suit : ## Conclusion -Qu’il s’agisse d’un dossier de sécurité sociale ou d’un relevé bancaire, File Shredder est l’outil qui permet de supprimer définitivement des fichiers sans avoir à acheter un shredder. Vous souhaitez en savoir plus ou avoir plus d'idées pour cette application ? [Soumettez un issue dans le dépôt de File Shredder sur GitHub](https://github.com/ADBeveridge/raider/issues). +Qu’il s’agisse d’un dossier de sécurité sociale ou d’un relevé bancaire, File Shredder est l’outil qui permet de supprimer définitivement des fichiers sans avoir à acheter un shredder. Vous souhaitez en savoir plus ou proposer des idées pour cette application ? [Soumettez un issue dans le dépôt de File Shredder sur GitHub](https://github.com/ADBeveridge/raider/issues). diff --git a/docs/desktop/gnome/flatpak.fr.md b/docs/desktop/gnome/flatpak.fr.md index 503025608f..02d66f1148 100644 --- a/docs/desktop/gnome/flatpak.fr.md +++ b/docs/desktop/gnome/flatpak.fr.md @@ -166,51 +166,51 @@ Pour parcourir `Flathub`, veuillez consulter . Une énorme 3. Cliquez sur la flèche vers le bas à côté du bouton « Install » - ![flathub_install_1](images/01_flatpak.png) + ![flathub_install_1](images/01_flatpak.png) - ![flathub_install_2](images/02_flatpak.png) + ![flathub_install_2](images/02_flatpak.png) 4. Assurez-vous d'avoir rempli toutes les conditions préalables à l'installation de Rocky Linux (numéro 1 dans la deuxième image, qui est déjà complété ci-dessus), puis copiez la commande (numéro 2 dans la deuxième image) et collez-la dans un terminal - ```bash - flatpak install flathub com.obsproject.Studio - Looking for matches… - Required runtime for com.obsproject.Studio/x86_64/stable (runtime/org.kde.Platform/x86_64/6.6) found in remote flathub - Do you want to install it? [Y/n]: Y - ``` + ```bash + flatpak install flathub com.obsproject.Studio + Looking for matches… + Required runtime for com.obsproject.Studio/x86_64/stable (runtime/org.kde.Platform/x86_64/6.6) found in remote flathub + Do you want to install it? [Y/n]: Y + ``` 5. Lorsque vous répondez « Y » et appuyez sur ++enter++, vous verrez ce qui suit : - ```bash - com.obsproject.Studio permissions: - ipc network pulseaudio wayland - x11 devices file access [1] dbus access [2] - system dbus access [3] - - [1] host, xdg-config/kdeglobals:ro, xdg-run/pipewire-0 - [2] com.canonical.AppMenu.Registrar, org.a11y.Bus, org.freedesktop.Flatpak, org.freedesktop.Notifications, - org.kde.KGlobalSettings, org.kde.StatusNotifierWatcher, org.kde.kconfig.notify - [3] org.freedesktop.Avahi - - ID Branch Op Remote Download - 1. com.obsproject.Studio.Locale stable i flathub < 47.0 kB (partial) - 2. org.kde.KStyle.Adwaita 6.6 i flathub < 8.0 MB - 3. org.kde.Platform.Locale 6.6 i flathub < 380.6 MB (partial) - 4. org.kde.PlatformTheme.QGnomePlatform 6.6 i flathub < 9.7 MB - 5. org.kde.WaylandDecoration.QAdwaitaDecorations 6.6 i flathub < 1.2 MB - 6. org.kde.Platform 6.6 i flathub < 325.0 MB - 7. com.obsproject.Studio stable i flathub < 207.7 MB - - Proceed with these changes to the system installation? [Y/n]: - ``` + ```bash + com.obsproject.Studio permissions: + ipc network pulseaudio wayland + x11 devices file access [1] dbus access [2] + system dbus access [3] + + [1] host, xdg-config/kdeglobals:ro, xdg-run/pipewire-0 + [2] com.canonical.AppMenu.Registrar, org.a11y.Bus, org.freedesktop.Flatpak, org.freedesktop.Notifications, + org.kde.KGlobalSettings, org.kde.StatusNotifierWatcher, org.kde.kconfig.notify + [3] org.freedesktop.Avahi + + ID Branch Op Remote Download + 1. com.obsproject.Studio.Locale stable i flathub < 47.0 kB (partial) + 2. org.kde.KStyle.Adwaita 6.6 i flathub < 8.0 MB + 3. org.kde.Platform.Locale 6.6 i flathub < 380.6 MB (partial) + 4. org.kde.PlatformTheme.QGnomePlatform 6.6 i flathub < 9.7 MB + 5. org.kde.WaylandDecoration.QAdwaitaDecorations 6.6 i flathub < 1.2 MB + 6. org.kde.Platform 6.6 i flathub < 325.0 MB + 7. com.obsproject.Studio stable i flathub < 207.7 MB + + Proceed with these changes to the system installation? [Y/n]: + ``` 6. Répondre « Y » et appuyer sur ++enter++ modifiera les autorisations du système comme indiqué et installera l'application. 7. Si tout se passe bien, vous devriez obtenir le message suivant : - ```text - Installation complete. - ``` + ```text + Installation complete. + ``` 8. Depuis le menu « Activities », vous pouvez désormais rechercher et exécuter OBS Studio. diff --git a/docs/desktop/gnome/gnome-extensions.de.md b/docs/desktop/gnome/gnome-extensions.de.md index a1af0c0d14..e2abb0a16a 100644 --- a/docs/desktop/gnome/gnome-extensions.de.md +++ b/docs/desktop/gnome/gnome-extensions.de.md @@ -56,7 +56,7 @@ In diesem Beispiel installieren wir die beliebte Erweiterung `dash-to-dock`. 1. Gehen Sie zur [Webseite der Dash-to-Dock-Erweiterung](https://extensions.gnome.org/extension/307/dash-to-dock/){target="_blank"} 2. Erweiterung von „aus“ auf „ein“ umschalten - ![Erweiterung umschalten](images/gnome_extensions_images/gnome-shell-extensions-toggle-btn.webp) + ![Erweiterung umschalten](images/gnome_extensions_images/gnome-shell-extensions-toggle-btn.webp) 3. Wenn Sie zur Installation der Erweiterung aufgefordert werden, klicken Sie auf `yes`. ## Installierte Erweiterungen verwalten diff --git a/docs/desktop/gnome/gnome-extensions.fr.md b/docs/desktop/gnome/gnome-extensions.fr.md index d17ec2eb41..e4495708b1 100644 --- a/docs/desktop/gnome/gnome-extensions.fr.md +++ b/docs/desktop/gnome/gnome-extensions.fr.md @@ -55,8 +55,8 @@ gnome-shell --version Pour cet exemple, nous installerons l’extension populaire `Dash to Dock`. 1. Rendez-vous sur [page Web de l'extension Dash to Dock](https://extensions.gnome.org/extension/307/dash-to-dock/){target="_blank"} -2. Passer l'extension de "off" à "on" - ![Toggle extension](images/gnome_extensions_images/gnome-shell-extensions-toggle-btn.webp) +2. Passer l'extension de `off` à `on` + ![Toggle extension](images/gnome_extensions_images/gnome-shell-extensions-toggle-btn.webp) 3. Lorsque vous êtes invité à installer l’extension, cliquez sur `yes`. ## Gestion des Extensions Installées diff --git a/docs/desktop/gnome/onlineaccounts.de.md b/docs/desktop/gnome/onlineaccounts.de.md index 337c58ec78..fd0bd017f2 100644 --- a/docs/desktop/gnome/onlineaccounts.de.md +++ b/docs/desktop/gnome/onlineaccounts.de.md @@ -14,7 +14,7 @@ In dieser Kurzanleitung erfahren Sie, wie Sie loslegen können. Für diese Anleitung benötigen Sie Folgendes: -- Eine Rocky Linux-Installation mit der grafischen Desktopumgebung GNOME. + - Eine Rocky Linux-Installation mit der grafischen Desktopumgebung GNOME. ## So fügen Sie Ihre Online-Konten hinzu diff --git a/docs/desktop/gnome/screenshot.fr.md b/docs/desktop/gnome/screenshot.fr.md index ddabadd527..1d1731a54d 100644 --- a/docs/desktop/gnome/screenshot.fr.md +++ b/docs/desktop/gnome/screenshot.fr.md @@ -1,5 +1,5 @@ --- -title: Screenshot +title: Screenshot – Captures d'Écran author: Christine Belzie contributors: Steven Spencer, Ganna Zhyrnova --- @@ -12,7 +12,7 @@ Fatigué d'utiliser votre clavier pour prendre des images sur l'écran de votre Ce guide suppose que vous disposez de la configuration suivante : -- Rocky Linux + - Rocky Linux !!! note "Remarque" @@ -30,7 +30,7 @@ Pour utiliser le programme `Screenshot`, procédez comme suit : 2. Cliquez sur **Take a Screenshot** - ![Screenshot of taken picture of being saved with black arrows pointing at a text box that contains the file name, "Linux.png" as well as Save and Copy buttons](images/screenshot-02.png) + ![Screenshot of taken picture of being saved with black arrows pointing at a text box that contains the file name, "Linux.png" as well as Save and Copy buttons](images/screenshot-02.png) 3. Une fois que vous êtes satisfait de la capture d'écran, renommez le fichier et cliquez sur **Save**. diff --git a/docs/desktop/gnome/x11vnc_plus_ssh_lan.fr.md b/docs/desktop/gnome/x11vnc_plus_ssh_lan.fr.md index 20db3603cb..f30bd0ef04 100644 --- a/docs/desktop/gnome/x11vnc_plus_ssh_lan.fr.md +++ b/docs/desktop/gnome/x11vnc_plus_ssh_lan.fr.md @@ -20,8 +20,8 @@ L’un des principaux avantages de l’utilisation de x11vnc basée sur SSH est Pour ce guide, nous partons du principe que vous disposez déjà de la configuration suivante : -- Poste de travail Rocky Linux -- Droits d'accès `sudo` + - Poste de travail Rocky Linux + - Droits d'accès `sudo` ## Mise en place du serveur VNC @@ -113,7 +113,7 @@ sudo systemctl enable --now x11vnc.service ## Connexion au serveur VNC depuis votre poste de travail Rocky -### Activez le dépôt EPEL : +### Installez le dépôt EPEL : ```bash sudo dnf install epel-release @@ -161,8 +161,8 @@ Félicitations ! Vous pouvez désormais contrôler votre ordinateur à distance Jusqu'à présent, cet article vous a montré comment configurer un serveur x11vnc et vous y connecter à l'aide de VNC communiquant via un tunnel SSH. Il est important de noter que cette méthode ne fonctionnera que pour les ordinateurs sur le même réseau local (LAN). En supposant que vous souhaitiez vous connecter à un ordinateur qui se trouve sur un autre réseau local. Un moyen d’y parvenir est de mettre en place un VPN. Vous trouverez ci-dessous quelques guides sur la façon de configurer un VPN : -- [OpenVPN](https://docs.rockylinux.org/guides/security/openvpn/) -- [Wireguard VPN](https://docs.rockylinux.org/guides/security/wireguard_vpn/) + - [OpenVPN](https://docs.rockylinux.org/guides/security/openvpn/) + - [Wireguard VPN](https://docs.rockylinux.org/guides/security/wireguard_vpn/) ## Conclusion diff --git a/docs/desktop/printing/brother-all-in-one.de.md b/docs/desktop/printing/brother-all-in-one.de.md index fb686d412f..0beb8ab879 100644 --- a/docs/desktop/printing/brother-all-in-one.de.md +++ b/docs/desktop/printing/brother-all-in-one.de.md @@ -50,21 +50,21 @@ Es wird ein Softwarefenster geöffnet, das versucht, Druckertreiber zu finden un 4. Geben Sie diesen Befehl ein, um die heruntergeladene Datei zu entpacken: - ```bash - gunzip linux-brprinter-installer-*.*.*-*.gz - ``` + ```bash + gunzip linux-brprinter-installer-*.*.*-*.gz + ``` 5. Holen Sie sich die Superuser-Autorisierung mit dem Befehl `su` oder `sudo su`. 6. Starten Sie das Tool: - ```bash - bash linux-brprinter-installer-*.*.*-* Brother machine name - ``` + ```bash + bash linux-brprinter-installer-*.*.*-* Brother machine name + ``` 7. Die Treiberinstallation wird gestartet. Befolgen Sie die Anweisungen auf dem Installationsbildschirm. -Der Installationsvorgang kann einige Zeit dauern. Warten Sie, bis es abgeschlossen ist. Wenn Sie fertig sind, können Sie optional einen Testdruck senden. +Der Installationsvorgang kann einige Zeit dauern. Warten Sie, bis er abgeschlossen ist. Wenn Sie fertig sind, können Sie optional einen Testdruck senden. ## Scanner-Support diff --git a/docs/desktop/printing/brother-all-in-one.fr.md b/docs/desktop/printing/brother-all-in-one.fr.md index b861ecd6ec..b1cccb805a 100644 --- a/docs/desktop/printing/brother-all-in-one.fr.md +++ b/docs/desktop/printing/brother-all-in-one.fr.md @@ -30,7 +30,7 @@ Ce guide suppose que votre imprimante est accessible depuis votre poste de trava 1. Ouvrez la fenêtre ++"Settings"++ 2. Dans le menu de gauche cliquez sur ++"Printers"++ -3. Notez la bannière en haut de la fenêtre indiquant "Unlock to Change Settings" +3. Notez la bannière en haut de la fenêtre indiquant `Unlock to Change Settings` 4. Cliquez sur ++"Unlock"++ et saisissez les informations d'identification `sudo`. 5. Cliquez sur ++"Add"++ @@ -50,17 +50,17 @@ Une fenêtre Logiciel s'ouvre pour tenter de localiser et d'installer les pilote 4. Entrez cette commande pour extraire le fichier téléchargé : - ```bash - gunzip linux-brprinter-installer-*.*.*-*.gz - ``` + ```bash + gunzip linux-brprinter-installer-*.*.*-*.gz + ``` 5. Obtenez les privilèges administratifs avec la commande `su` ou la commande `sudo su`. 6. Exécuter la commande suivante : - ```bash - bash linux-brprinter-installer-*.*.*-* Brother machine name - ``` + ```bash + bash linux-brprinter-installer-*.*.*-* Brother machine name + ``` 7. L'installation du pilote va démarrer. Suivez les instructions de l'écran d'installation. diff --git a/docs/desktop/printing/hp-all-in-one.fr.md b/docs/desktop/printing/hp-all-in-one.fr.md index 046810ef2d..5f69043e4c 100644 --- a/docs/desktop/printing/hp-all-in-one.fr.md +++ b/docs/desktop/printing/hp-all-in-one.fr.md @@ -26,7 +26,7 @@ sudo dnf install hplip-common.x86_64 hplip-libs.x86_64 hplip-gui ## Paramétrage de l'Imprimante -Une fois l'installation du pilote d'imprimante terminée, vous devriez pouvoir ajouter votre imprimante HP All-in-One à votre station de travail Rocky. Assurez-vous que l'imprimante est physiquement connectée au même réseau, soit via Wi-Fi, soit par une connexion directe. Accédez aux paramètres Settings +Une fois l'installation du pilote d'imprimante terminée, vous devriez pouvoir ajouter votre imprimante HP All-in-One à votre station de travail Rocky. Assurez-vous que l'imprimante est physiquement connectée au même réseau, soit via Wi-Fi, soit par une connexion directe. Accédez aux paramètres `Settings` 1. Dans le menu de gauche cliquez sur ++"Printers"++ diff --git a/docs/desktop/tools/businessapps.de.md b/docs/desktop/tools/businessapps.de.md index 24afc61a54..f6f911aa94 100644 --- a/docs/desktop/tools/businessapps.de.md +++ b/docs/desktop/tools/businessapps.de.md @@ -14,9 +14,9 @@ Auf Flathub gibt es davon viele. In diesem Leitfaden erfahren Sie, wie Sie die g Für diese Anleitung benötigen Sie Folgendes: -- Eine Rocky Linux-Installation mit einer grafischen Desktopumgebung -- Berechtigung, Software auf Ihrem System zu installieren -- `Flatpak` und `Flathub` sind betriebsbereit + - Eine Rocky Linux-Installation mit einer grafischen Desktopumgebung + - Berechtigung, Software auf Ihrem System zu installieren + - `Flatpak` und `Flathub` sind betriebsbereit ## So installieren Sie gängige Business-Software unter Rocky Linux diff --git a/docs/desktop/tools/ksnip.de.md b/docs/desktop/tools/ksnip.de.md index b728eee277..d125ba3032 100644 --- a/docs/desktop/tools/ksnip.de.md +++ b/docs/desktop/tools/ksnip.de.md @@ -17,7 +17,7 @@ tags: `Ksnip` ist ein Dienstprogramm mit zahlreichen Funktionen und Tools zum Kommentieren von Screenshots. Der Schwerpunkt dieser Anleitung liegt auf der Installation von Ksnip und seinen Beschriftung-Tools. -## Ksnip-Installation +## `Ksnip`-Installation Ksnip erfordert das EPEL-Repository. Wenn Sie EPEL nicht aktiviert haben, können Sie dies folgendermaßen erreichen: @@ -54,7 +54,7 @@ sudo dnf install ksnip -y | Option | Tool | Beschreibung | | ------ | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 1 | `Select` | das Werkzeug wird verwendet, um eine Auswahl zu treffen. Klicken Sie auf ein Element, um es auszuwählen, oder klicken Sie und ziehen Sie, um eine Auswahl zu treffen. | -| 2 | `Duplicate` | das Werkzeug wird zum Duplizieren einer Auswahl verwendet. Klicken und ziehen Sie, um eine Auswahl zu treffen. Dann klicken und ziehen Sie dann die Auswahl, um sie zu verschieben oder weiter zu transformieren. | +| 2 | `Duplicate` | das Tool wird zum Duplizieren einer Auswahl verwendet. Klicken und ziehen Sie, um eine Auswahl zu treffen. Dann klicken und ziehen Sie dann die Auswahl, um sie zu verschieben oder weiter zu transformieren. | | 3a | `Arrow` | das Standard Arrow-Tool, mit dem Sie durch Klicken und Ziehen einen Pfeil erstellen und von einer Position zu einer neuen Position bewegen können | | 3b | `Double Arrow` | die zweite Arrow-Option erreichen Sie, indem Sie auf den Abwärtspfeil neben dem Arrow-Tool klicken. Wie der Werkzeug-Name vermuten lässt, verfügt das Tool an beiden Endpunkten über einen Pfeil. | | 3c | `Line` | die dritte Option erreichen Sie, indem Sie auf den Abwärtspfeil neben dem Arrow-Tool klicken. Es ersetzt Pfeile durch eine einfache Linie. | diff --git a/docs/desktop/tools/ksnip.fr.md b/docs/desktop/tools/ksnip.fr.md index c536c8438f..ded38b9aea 100644 --- a/docs/desktop/tools/ksnip.fr.md +++ b/docs/desktop/tools/ksnip.fr.md @@ -45,7 +45,7 @@ sudo dnf install ksnip -y ![ksnip](images/ksnip.png) -## Annoter une image avec `Ksnip` +## Annotation d'une image avec `Ksnip` `Ksnip` dispose d'outils pratiques et intuitifs pour annoter des captures d'écran. Dans l'image, en bas à gauche se trouvent les options décrites ci-dessous. @@ -53,8 +53,8 @@ sudo dnf install ksnip -y | Option | Outil | Description | | ------ | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| 1 | `Select` | l'outil permet de faire une sélection. Cliquez sur un élément pour le sélectionner ou cliquez et faites glisser pour effectuer une sélection. | -| 2 | `Duplicate` | l’outil permet de dupliquer une sélection. Cliquez et faites glisser pour effectuer une sélection. Cliquez ensuite sur la sélection et faites-la glisser pour la déplacer ou la transformer davantage. | +| 1 | `Select` | permet de faire une sélection. Cliquez sur un élément pour le sélectionner ou cliquez et faites glisser pour effectuer une sélection. | +| 2 | `Duplicate` | permet de dupliquer une sélection. Cliquez et faites glisser pour effectuer une sélection. Cliquez ensuite sur la sélection et faites-la glisser pour la déplacer ou la transformer davantage. | | 3a | `Arrow` | l'outil de flèche par défaut, qui vous permet de cliquer pour créer une flèche et de faire glisser d'un endroit à un autre | | 3b | `Double Arrow` | la deuxième option de flèche est accessible en cliquant sur la flèche vers le bas à côté de l'outil Arrow. Comme le suggère le nom de l'outil, il comporte une flèche aux deux extrémités. | | 3c | `Line` | la troisième option est accessible en cliquant sur la flèche vers le bas à côté de l'outil Arrow. Il remplace les flèches par une simple ligne. | diff --git a/docs/desktop/tools/terminator.fr.md b/docs/desktop/tools/terminator.fr.md index 5996298f51..a44348d435 100644 --- a/docs/desktop/tools/terminator.fr.md +++ b/docs/desktop/tools/terminator.fr.md @@ -78,4 +78,4 @@ Bien que ++ctrl+alt+"T"++ soit un choix traditionnel, n'hésitez pas à choisir ## Conclusion -Terminator est un émulateur de terminal efficace destiné aux utilisateurs réguliers comme aux utilisateurs expérimentés. Ces exemples ne représentent qu'une petite fraction des capacités de Terminator. Bien que ce guide fournisse un aperçu des étapes d'installation de Rocky Linux, vous souhaiterez peut-être examiner la [documentation](https://gnome-terminator.readthedocs.io/en/latest/) pour une explication complète des fonctionnalités de Terminator. +Terminator est un émulateur de terminal efficace destiné aux utilisateurs occasionnels comme aux utilisateurs expérimentés. Ces exemples ne représentent qu'une petite fraction des capacités de Terminator. Bien que ce guide fournisse un aperçu des étapes d'installation de Rocky Linux, vous souhaiterez peut-être examiner la [documentation](https://gnome-terminator.readthedocs.io/en/latest/) pour une explication complète des fonctionnalités de Terminator. diff --git a/docs/gemstones/network/nmcli.fr.md b/docs/gemstones/network/nmcli.fr.md index 9549cdf1d6..dce9d261fb 100644 --- a/docs/gemstones/network/nmcli.fr.md +++ b/docs/gemstones/network/nmcli.fr.md @@ -7,7 +7,7 @@ tags: # Modifier la propriété `autoconnect` du profil de connexion de NetworkManager -Utilisez d'abord `nmcli` pour lire et afficher la valeur actuelle de la propriété de connexion automatique pour toutes les connexions réseau sur un système Rocky Linux. Entrer la commande suivante : +Utilisez d'abord `nmcli` pour lire et afficher la valeur actuelle de la propriété de connexion automatique pour toutes les connexions réseau sur un système Rocky Linux. Entrez la commande suivante : ```bash nmcli -f name,autoconnect connection diff --git a/docs/guides/mirror_management/add_mirror_manager.fr.md b/docs/guides/mirror_management/add_mirror_manager.fr.md index 5e17fd0358..4cafd975a0 100644 --- a/docs/guides/mirror_management/add_mirror_manager.fr.md +++ b/docs/guides/mirror_management/add_mirror_manager.fr.md @@ -65,7 +65,7 @@ Accédez au gestionnaire de miroir de Rocky Linux ici : Date: Fri, 22 Aug 2025 15:24:03 -0400 Subject: [PATCH 118/164] Update README.md Missing actions/workflows/deploy.yml/badge.svg --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index dccca1078f..08eea48bc0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ + # Contribution Guide From 3da963cbde7e52fdc74bbdd4f16491a6500f5685 Mon Sep 17 00:00:00 2001 From: wale soyinka Date: Fri, 22 Aug 2025 18:10:29 -0400 Subject: [PATCH 119/164] Update README.md (#2844) Missing file breaking local builds. File missing because of this change to app repo: https://github.com/rocky-linux/docs.rockylinux.org/commit/9419fc012d1d80c253b1423dc1ef8b9f76596b46 --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 08eea48bc0..6f48dc23a0 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Contribution Guide From e94b0b0032e13b0721f51afa9ddc278e534dcbcc Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Sat, 23 Aug 2025 17:46:41 -0400 Subject: [PATCH 120/164] New Crowdin updates (#2843) * New translations htop.md (French) * New translations htop.md (German) * New translations dnf-swap.md (German) * New translations dnf-swap.md (French) * New translations good_docs.md (German) * New translations index.md (German) * New translations good_docs.md (German) * New translations rpaste.md (German) --- docs/gemstones/dnf-swap.de.md | 8 +-- docs/gemstones/dnf-swap.fr.md | 6 +- docs/gemstones/htop.de.md | 2 +- docs/gemstones/htop.fr.md | 2 +- docs/gemstones/rpaste.de.md | 78 +++++++++++++++++++++++ docs/rocky_insights/blogs/good_docs.de.md | 6 +- docs/rocky_insights/blogs/index.de.md | 8 +-- 7 files changed, 94 insertions(+), 16 deletions(-) create mode 100644 docs/gemstones/rpaste.de.md diff --git a/docs/gemstones/dnf-swap.de.md b/docs/gemstones/dnf-swap.de.md index 728efa77a5..3d2d222629 100644 --- a/docs/gemstones/dnf-swap.de.md +++ b/docs/gemstones/dnf-swap.de.md @@ -1,7 +1,7 @@ - - - -title: dnf - swap command author: wale soyinka contributors: date: 2023-01-24 tags: - - Cloud-Images - - Container +title: DNF — swap-Befehl author: wale soyinka contributors: date: 2023-01-24 tags: + - cloud images + - container - dnf - dnf swap - curl @@ -56,7 +56,7 @@ Das war's! ## Anmerkungen -Das Kommando DNF Swap +Das Kommando `dnf swap` **Syntax:** diff --git a/docs/gemstones/dnf-swap.fr.md b/docs/gemstones/dnf-swap.fr.md index e746f7941d..3ee03029e3 100644 --- a/docs/gemstones/dnf-swap.fr.md +++ b/docs/gemstones/dnf-swap.fr.md @@ -1,5 +1,5 @@ - - - -title: DNF - La commande `swap` author: wale soyinka tags: +title: dnf — la commande swap author: wale soyinka contributors: date: 2023-01-24 tags: - cloud images - conteneurs - dnf @@ -21,7 +21,7 @@ Dans les cas où le package simplifié n'est pas suffisant, vous pouvez utiliser ## Objectif -Ce GEMstone de Rocky Linux montre comment utiliser **dnf** pour échanger – _swap_ – le package `curl-minimal` fourni avec le package `curl` normal. +Cette pépite de Rocky Linux montre comment utiliser **dnf** pour échanger – _swap_ – le package `curl-minimal` fourni avec le paquet `curl` normal. ## Vérifier la variante de `curl` existante @@ -56,7 +56,7 @@ Et c'est un Gemme ! ## Remarques -Commande DNF swap +La commande `dnf swap` **Syntaxe** : diff --git a/docs/gemstones/htop.de.md b/docs/gemstones/htop.de.md index 9c4e3a5775..49c26d7e5e 100644 --- a/docs/gemstones/htop.de.md +++ b/docs/gemstones/htop.de.md @@ -1,5 +1,5 @@ --- -title: htop-Prozessverwaltung +title: htop — Prozessverwaltung author: tianci li contributors: Steven Spencer date: 2021-10-16 diff --git a/docs/gemstones/htop.fr.md b/docs/gemstones/htop.fr.md index 698afc4c3b..9c2a79cb3b 100644 --- a/docs/gemstones/htop.fr.md +++ b/docs/gemstones/htop.fr.md @@ -1,5 +1,5 @@ --- -title: htop – Gestion des Processus +title: htop — Gestion des Processus author: tianci li contributors: Steven Spencer date: 2021-10-16 diff --git a/docs/gemstones/rpaste.de.md b/docs/gemstones/rpaste.de.md new file mode 100644 index 0000000000..c184bddeae --- /dev/null +++ b/docs/gemstones/rpaste.de.md @@ -0,0 +1,78 @@ +--- +title: rpaste — Pastebin Tool +author: Steven Spencer +contributors: +tags: + - rpaste + - Mattermost + - pastebin +--- + +# Einführung in `rpaste` + +`rpaste` ist ein Tool zum Teilen von Code, Protokollausgaben und anderen besonders langen Texten. Es ist ein `Pastebin`, das von den Entwicklern von Rocky Linux erstellt wurde. Dieses Tool ist nützlich, wenn Sie etwas öffentlich teilen müssen, den Feed jedoch nicht mit Ihrem Text überladen möchten. Dies ist insbesondere bei der Verwendung von Mattermost wichtig, das Brücken zu anderen IRC-Diensten bietet. Das `rpaste`-Tool kann auf jedem Rocky Linux System installiert werden. Wenn Ihr Desktop-Computer nicht Rocky Linux ist oder Sie das Tool einfach nicht installieren möchten, können Sie es manuell verwenden, indem Sie auf die [Pinnwand-URL](https://rpa.st) zugreifen und dann die Systemausgabe oder den Text einfügen, den Sie teilen möchten. `rpaste` erlaubt es Ihnen, diese Informationen automatisch anzulegen. + +## Installation + +Installation von `rpaste` auf Rocky Linux: + +```bash +sudo dnf --enablerepo=extras install rpaste +``` + +## Verwendung + +Bei größeren Systemproblemen müssen Sie möglicherweise alle Informationen Ihres Systems senden, damit diese überprüft werden können. Um dies zu erreichen, geben Sie Folgendes ein: + +```bash +rpaste --sysinfo +``` + +Gibt den Link auf die Pinnwand-Seite zurück: + +```bash +Uploading... +Paste URL: https://rpa.st/2GIQ +Raw URL: https://rpa.st/raw/2GIQ +Removal URL: https://rpa.st/remove/YBWRFULDFCGTTJ4ASNLQ6UAQTA +``` + +Sie können die Informationen dann selbst in einem Browser überprüfen und entscheiden, ob Sie sie behalten oder entfernen und neu starten möchten. Wenn Sie es behalten möchten, können Sie die `Paste URL` kopieren und mit wem auch immer teilen oder im Feed auf Mattermost. Zum Entfernen kopieren Sie einfach die `Removal URL` und öffnen Sie diese in Ihrem Browser. + +Sie können Ihrem `Pastebin` Inhalte hinzufügen, indem Sie Inhalte übermitteln. Wenn Sie zum Beispiel Inhalte aus Ihrer `/var/log/messages` Datei vom 10. März hinzufügen wollten, können Sie folgendes tun: + +```bash +sudo more /var/log/messages | grep 'Mar 10' | rpaste +``` + +## Hilfe zu `rpaste` + +Um Hilfe zum Befehl zu erhalten, geben Sie einfach folgendes ein: + +```bash +rpaste --help +``` + +Dies ergibt folgende Ausgabe: + +```bash +rpaste: A paste utility originally made for the Rocky paste service + +Usage: rpaste [options] [filepath] + command | rpaste [options] + +This command can take a file or standard in as input + +Options: +--life value, -x value Sets the life time of a paste (1hour, 1day, 1week) (default: 1hour) +--type value, -t value Sets the syntax highlighting (default: text) +--sysinfo, -s Collects general system information (disables stdin and file input) (default: false) +--dry, -d Turns on dry mode, which doesn't paste the output, but shows the data to stdin (default: false) +--pastebin value, -p value Sets the paste bin service to send to. Current supported: rpaste, fpaste (default: "rpaste") +--help, -h show help (default: false) +--version, -v print the version (default: false) +``` + +## Fazit + +Es ist manchmal wichtig, eine große Menge an Text zu teilen, wenn man an einem Problem, dem Implementieren von Code oder Editieren von Text usw. arbeitet. Durch die Verwendung von `rpaste` müssen andere nicht große Mengen an Textinhalten anzeigen, die für sie nicht wichtig sind. Achten Sie bitte auch auf die Chat-Etikette von Rocky Linux. diff --git a/docs/rocky_insights/blogs/good_docs.de.md b/docs/rocky_insights/blogs/good_docs.de.md index f0ac6dc06b..95945ba48d 100644 --- a/docs/rocky_insights/blogs/good_docs.de.md +++ b/docs/rocky_insights/blogs/good_docs.de.md @@ -1,10 +1,10 @@ --- -title: Gute Dokumentation – Die Sicht eines Übersetzers +title: Gute Dokumentation — die Sicht eines Übersetzers author: Ganna Zhyrnova contributors: Steven Spencer --- -## Einleitung +## Introduktion Übersetzer bieten wertvolle Einblicke in das Verfassen klarer und prägnanter Dokumentationen. Sie wissen besser als die meisten anderen, was sich nicht gut übersetzen lässt und was einen Leser verwirrt. In diesem Dokument werden einige dieser Probleme untersucht und bewährte Vorgehensweisen für die Dokumentations-Erstellung hervorgehoben. @@ -25,7 +25,7 @@ Redewendungen, Fachjargon, Abkürzungen und Akronyme können für Leser, die dam **Kontraktionen** ersetzen englische Wörter durch Abkürzungen, aber diese gibt es nicht immer in allen Sprachen, was die Übersetzung erschwert.\ **Akronyme** können mehrdeutig sein, insbesondere wenn sie bei ihrer Verwendung nicht definiert sind. -Beispiel: +Ein Beispiel: ❌ "Once you’ve got the hang of the dashboard, the rest is a piece of cake." In diesem Fall verwendet der Autor sowohl eine Kontraktion, Slang als auch eine Redewendung. diff --git a/docs/rocky_insights/blogs/index.de.md b/docs/rocky_insights/blogs/index.de.md index f5a99359e6..d8303669b0 100644 --- a/docs/rocky_insights/blogs/index.de.md +++ b/docs/rocky_insights/blogs/index.de.md @@ -1,5 +1,5 @@ --- -title: Einleitung +title: Introduktion author: Steven Spencer contributors: --- @@ -20,9 +20,9 @@ Wenn Sie über keine GitHub-Zugangsdaten verfügen und trotzdem etwas für diese Sie sollten sicherstellen, dass Ihr Dokument die Anforderungen für diesen Abschnitt erfüllt. Zum Beispiel: -- Passt das hierher? Sind es Informationen, die es wert sind, geteilt zu werden? Ist es ein Dokument im Blog-Stil? -- Geht es auf ein für technische Autoren wichtiges Thema ein? -- Wird die Einreichung die Qualität der Rocky Linux-Dokumentation im ganzen verbessern? + - Passt das hierher? Sind es Informationen, die es wert sind, geteilt zu werden? Ist es ein Dokument im Blog-Stil? + - Geht es auf ein für technische Autoren wichtiges Thema ein? + - Wird die Einreichung die Qualität der Rocky Linux-Dokumentation im ganzen verbessern? ## Welche Art von Information? From 8eac61bfc888873cd72c79c0d791f4feddc010e1 Mon Sep 17 00:00:00 2001 From: tianci li <86754294+jimcat8@users.noreply.github.com> Date: Mon, 25 Aug 2025 01:30:55 +0800 Subject: [PATCH 121/164] Minor issue fixes (#2846) --- docs/books/admin_guide/12-network.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/books/admin_guide/12-network.md b/docs/books/admin_guide/12-network.md index a20ab174e1..9323a63ede 100644 --- a/docs/books/admin_guide/12-network.md +++ b/docs/books/admin_guide/12-network.md @@ -72,8 +72,8 @@ The subnet mask is used to define the network bits and host bits of an IP addres 192.168.1.10 ==> 11000000.10101000.00000001.00001010 255.255.255.0 ==> 11111111.11111111.11111111.00000000 -NetID 11000000.10101000.00000001.00001010 - 192 . 168 . 100 . 0 +NetID 11000000.10101000.00000001.00000000 + 192 . 168 . 1 . 0 HostID 00000000.00000000.00000000.00001010 0 . 0 . 0 . 10 @@ -100,7 +100,7 @@ There are also specific addresses within a network, which must be identified. Th 255.255.255.0 ==> 11111111.11111111.11111111.00000000 network address 11000000.10101000.00000001.00000000 - 192 . 168 . 100 . 0 + 192 . 168 . 1 . 0 ``` **Logic and Operations** - When both are true (1), the result is true (1); otherwise, it is false (0) @@ -112,7 +112,7 @@ There are also specific addresses within a network, which must be identified. Th 255.255.255.0 ==> 11111111.11111111.11111111.00000000 broadcast address 11000000.10101000.00000001.11111111 - 192 . 168 . 100 . 255 + 192 . 168 . 1 . 255 ``` !!! tip From 44a8556009903619811a868646a73ce911dad262 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 25 Aug 2025 08:56:05 -0400 Subject: [PATCH 122/164] New Crowdin updates (#2845) * New translations mtr.md (French) * New translations https_rsa_keygen.md (French) * New translations rl9_network_manager.md (French) * New translations feature_branch_workflow.md (French) * New translations fork_and_branch_workflow.md (French) * New translations git_pull_vs_git_fetch.md (French) * New translations git_remote_add.md (French) * New translations tracking_and_nontracking_branch.md (French) * New translations nmcli.md (German) * New translations bash_stub.md (French) * New translations nmtui.md (French) * New translations mtr.md (German) * New translations nmtui.md (German) * New translations mtr.md (French) * New translations 04-database-servers.md (French) * New translations mediawiki.md (German) --- .../web_services/04-database-servers.fr.md | 11 +++ .../git/feature_branch_workflow.fr.md | 52 ++++++------- .../git/fork_and_branch_workflow.fr.md | 76 +++++++++---------- .../gemstones/git/git_pull_vs_git_fetch.fr.md | 32 ++++---- docs/gemstones/git/git_remote_add.fr.md | 48 ++++++------ .../git/tracking_and_nontracking_branch.fr.md | 46 +++++------ docs/gemstones/https_rsa_keygen.fr.md | 2 +- .../network/RL9_network_manager.fr.md | 2 +- docs/gemstones/network/mtr.de.md | 2 +- docs/gemstones/network/mtr.fr.md | 8 +- docs/gemstones/network/nmcli.de.md | 2 +- docs/gemstones/network/nmtui.de.md | 2 +- docs/gemstones/network/nmtui.fr.md | 2 +- docs/gemstones/scripts/bash_stub.fr.md | 2 +- docs/guides/cms/mediawiki.de.md | 2 +- 15 files changed, 150 insertions(+), 139 deletions(-) create mode 100644 docs/books/web_services/04-database-servers.fr.md diff --git a/docs/books/web_services/04-database-servers.fr.md b/docs/books/web_services/04-database-servers.fr.md new file mode 100644 index 0000000000..23b29384a7 --- /dev/null +++ b/docs/books/web_services/04-database-servers.fr.md @@ -0,0 +1,11 @@ +--- +author: +contributors: +title: Chapitre 4. Serveurs de Base de Données +--- + +!!! info "Info" + +``` +Todo : rédiger une introduction aux serveurs de bases de données relationnelles. +``` diff --git a/docs/gemstones/git/feature_branch_workflow.fr.md b/docs/gemstones/git/feature_branch_workflow.fr.md index 63253cbb3b..8c22c26373 100644 --- a/docs/gemstones/git/feature_branch_workflow.fr.md +++ b/docs/gemstones/git/feature_branch_workflow.fr.md @@ -31,53 +31,53 @@ L'utilisateur "rockstar" a créé un fork de ce référentiel et nous utiliseron 1. Si besoin est, clonez votre fork : - ```bash - git clone https://github.com/rockstar/documentation.git - cd documentation - ``` + ```bash + git clone https://github.com/rockstar/documentation.git + cd documentation + ``` 2. Ajoutez `upstream remote` : - ```bash - git remote add upstream https://github.com/rocky-linux/documentation.git - ``` + ```bash + git remote add upstream https://github.com/rocky-linux/documentation.git + ``` 3. Récupérer les modifications en amont : - ```bash - git fetch upstream - ``` + ```bash + git fetch upstream + ``` 4. Créer une nouvelle branche, Feature Branch : - ```bash - git checkout -b feature-branch-name - ``` + ```bash + git checkout -b feature-branch-name + ``` 5. Apportez des modifications, ajoutez de nouveaux fichiers et validez-les avec `commit` : - ```bash - git add . - git commit -m "Implementing feature X" - ``` + ```bash + git add . + git commit -m "Implementing feature X" + ``` 6. Maintenir votre Branche à Jour. Fusionnez régulièrement les modifications en amont avec `pull` pour éviter les conflits : - ```bash - git pull upstream main --rebase - ``` + ```bash + git pull upstream main --rebase + ``` 7. Transmettez vers votre fork en tapant : - ```bash - git push origin feature-branch-name - ``` + ```bash + git push origin feature-branch-name + ``` 8. Créer un Pull Request : - ```bash - gh pr create --base main --head rockstar:feature-branch-name --title "New Feature X" --body "Long Description of the feature" - ``` + ```bash + gh pr create --base main --head rockstar:feature-branch-name --title "New Feature X" --body "Long Description of the feature" + ``` ## Conclusion diff --git a/docs/gemstones/git/fork_and_branch_workflow.fr.md b/docs/gemstones/git/fork_and_branch_workflow.fr.md index 880b2c3b09..4addf13b6b 100644 --- a/docs/gemstones/git/fork_and_branch_workflow.fr.md +++ b/docs/gemstones/git/fork_and_branch_workflow.fr.md @@ -27,72 +27,72 @@ Ce Gemstone explique comment configurer un référentiel local pour contribuer ## Procédure -1. S'il n'existe pas déjà, créez un fork du projet en utilisant l'utilitaire `gh`. Entrer la commande suivante : +1. S'il n'existe pas déjà, créez un fork du projet en utilisant l'utilitaire `gh`. Tapez la commande suivante : - ```bash - gh repo fork rocky-linux/documentation --clone=true --remote=true - ``` + ```bash + gh repo fork rocky-linux/documentation --clone=true --remote=true + ``` - Les options utilisées dans cette commande _gh repo fork_ sont les suivantes : + Les options utilisées dans cette commande _gh repo fork_ sont les suivantes : - - `--clone=true` : Clone le référentiel forké sur votre machine locale. - - `--remote=true` : ajoute le référentiel d'origine en tant que référentiel distant, vous permettant de synchroniser les futures mises à jour. + - `--clone=true` : Clone le référentiel forké sur votre machine locale. + - `--remote=true` : ajoute le référentiel d'origine en tant que référentiel distant, vous permettant de synchroniser les futures mises à jour. -2. Accédez au répertoire du dépôt local. Entrer la commande suivante : +2. Accédez au répertoire du dépôt local. Tapez la commande suivante : - ```bash - cd documentation - ``` + ```bash + cd documentation + ``` 3. Vérifiez que tous les dépôts distants pertinents ont été correctement configurés dans votre dépôt local, tapez : - ```bash - git remote -vv - ``` + ```bash + git remote -vv + ``` 4. Récupérez les dernières modifications avec `fetch` depuis le dépôt distant en amont : - ```bash - git fetch upstream - ``` + ```bash + git fetch upstream + ``` 5. Créez et extrayez avec `checkout` une nouvelle branche de fonctionnalités nommée your-feature-branch : - ```bash - git checkout -b your-feature-branch - ``` + ```bash + git checkout -b your-feature-branch + ``` 6. Apportez des modifications, ajoutez de nouveaux fichiers et validez vos modifications dans votre dépôt local avec `commit` : - ```bash - git add . - git commit -m "Your commit message" - ``` + ```bash + git add . + git commit -m "Your commit message" + ``` 7. Synchronisez avec la branche principale du dépôt distant nommée « upstream » : - ```bash - git pull upstream main - ``` + ```bash + git pull upstream main + ``` 8. Transmission des modifications au Fork : - ```bash - git push origin your-feature-branch - ``` + ```bash + git push origin your-feature-branch + ``` 9. Enfin, créez une Pull Request (PR) à l'aide de l'application CLI `gh` : - ```bash - gh pr create --base main --head your-feature-branch --title "Your PR Title" --body "Description of your changes" - ``` + ```bash + gh pr create --base main --head your-feature-branch --title "Your PR Title" --body "Description of your changes" + ``` - Les options utilisées dans cette commande _gh pr create_ sont les suivantes : + Les options utilisées dans cette commande _gh pr create_ sont les suivantes : - `--base` main : spécifie la branche de base dans le référentiel upstream où les modifications seront fusionnées avec `merge`. - `--head` your-feature-branch : indique la branche principale de votre fork qui contient les modifications. - `--title` "Votre titre PR" : définit le titre de la demande de Pull Request. - `--body` "Description de vos modifications" : Fournit une description détaillée des modifications dans la pull request. + `--base` main : spécifie la branche de base dans le référentiel upstream où les modifications seront fusionnées avec `merge`. + `--head` your-feature-branch : indique la branche principale de votre fork qui contient les modifications. + `--title` "Votre titre PR" : définit le titre de la demande de Pull Request. + `--body` "Description de vos modifications" : Fournit une description détaillée des modifications dans la pull request. ## Conclusion diff --git a/docs/gemstones/git/git_pull_vs_git_fetch.fr.md b/docs/gemstones/git/git_pull_vs_git_fetch.fr.md index f3ef8a3e06..d6cd3bf840 100644 --- a/docs/gemstones/git/git_pull_vs_git_fetch.fr.md +++ b/docs/gemstones/git/git_pull_vs_git_fetch.fr.md @@ -22,21 +22,21 @@ Il est bénéfique de voir ce que les autres ont apporté avec commit sans fusio 1. Lister la branche actuellement extraite - ```bash - git branch - ``` + ```bash + git branch + ``` -2. Récupérer les modifications avec `fetch` depuis la branche principale d'un référentiel distant nommé origin. Entrer la commande suivante : +2. Récupérer les modifications avec `fetch` depuis la branche principale d'un référentiel distant nommé origin. Tapez la commande suivante : - ```bash - git fetch origin main - ``` + ```bash + git fetch origin main + ``` 3. Comparez les modifications entre le HEAD de votre dépôt local et le dépôt `origin/main` distant. - ```bash - git log HEAD..origin/main - ``` + ```bash + git log HEAD..origin/main + ``` ### Git Pull @@ -45,15 +45,15 @@ Il est utile pour mettre à jour rapidement votre branche locale avec les modifi 1. **Extraire et fusionner les modifications** : - ```bash - git pull origin main - ``` + ```bash + git pull origin main + ``` 2. **Vérifiez les modifications fusionnées** : - ```bash - git log - ``` + ```bash + git log + ``` ## Remarques Complémentaires diff --git a/docs/gemstones/git/git_remote_add.fr.md b/docs/gemstones/git/git_remote_add.fr.md index 6343700f85..811a9f1050 100644 --- a/docs/gemstones/git/git_remote_add.fr.md +++ b/docs/gemstones/git/git_remote_add.fr.md @@ -23,46 +23,46 @@ Nous utiliserons le référentiel du projet de documentation Rocky Linux comme e ## Procédure 1. Ouvrez un terminal et changez votre répertoire de travail vers le dossier contenant votre clone local du projet. - Par exemple, si vous avez cloné le dépôt github dans ~/path/to/your/rl-documentation-clone, tapez + Par exemple, si vous avez cloné le dépôt github dans ~/path/to/your/rl-documentation-clone, tapez - ```bash - cd ~/path/to/your/rl-documentation-clone - ``` + ```bash + cd ~/path/to/your/rl-documentation-clone + ``` -2. Avant d’effectuer des modifications, répertoriez les `remote`s que vous avez configurées. Entrer la commande suivante : +2. Avant d’effectuer des modifications, répertoriez les `remote`s que vous avez configurées. Tapez la commande suivante : - ```bash - git remote -vv - ``` + ```bash + git remote -vv + ``` - S'il s'agit d'un dépôt fraîchement cloné, vous verrez probablement une seule branche remote nommée `origin` dans votre affichage de sortie. + S'il s'agit d'un dépôt fraîchement cloné, vous verrez probablement une seule branche remote nommée `origin` dans votre affichage de sortie. -3. Ajoutez le référentiel de documentation Rocky Linux (`https://github.com/rocky-linux/documentation.git`) en tant que nouveau référentiel distant – `remote` – à votre référentiel local. Ici, nous allons attribuer `upstream` comme nom à cette `remote` particulière. Entrer la commande suivante : +3. Ajoutez le référentiel de documentation Rocky Linux (`https://github.com/rocky-linux/documentation.git`) en tant que nouveau référentiel distant – `remote` – à votre référentiel local. Ici, nous allons attribuer `upstream` comme nom à cette `remote` particulière. Tapez la commande suivante : - ```bash - git remote add upstream https://github.com/rocky-linux/documentation.git - ``` + ```bash + git remote add upstream https://github.com/rocky-linux/documentation.git + ``` 4. Pour souligner davantage que les noms attribués aux référentiels distants sont arbitraires, créez un autre référentiel distant nommé rocky-docs qui pointe vers le même référentiel en exécutant la commande suivante : - ```bash - git remote add rocky-docs https://github.com/rocky-linux/documentation.git - ``` + ```bash + git remote add rocky-docs https://github.com/rocky-linux/documentation.git + ``` 5. Vérifiez que le nouveau dépôt distant a été ajouté avec succès : - ```bash - git remote -v - ``` + ```bash + git remote -v + ``` - Vous devriez voir `upstream` répertorié avec son URL. + Vous devriez voir `upstream` répertorié avec son URL. 6. Facultativement, avant de commencer à apporter des modifications à votre dépôt local, vous pouvez récupérer des données à partir de la branche nouvellement ajoutée. - Récupérez les branches et les commits de la `remote` nouvellement ajoutée en exécutant : + Récupérez les branches et les commits de la `remote` nouvellement ajoutée en exécutant : - ```bash - git fetch upstream - ``` + ```bash + git fetch upstream + ``` ## Remarques Complémentaires diff --git a/docs/gemstones/git/tracking_and_nontracking_branch.fr.md b/docs/gemstones/git/tracking_and_nontracking_branch.fr.md index 620d0a4aa0..539b588e2d 100644 --- a/docs/gemstones/git/tracking_and_nontracking_branch.fr.md +++ b/docs/gemstones/git/tracking_and_nontracking_branch.fr.md @@ -17,19 +17,19 @@ Ce Gemstone explore les branches de suivi et de non-suivi dans Git. Il comprend Une branche de suivi est une branche liée à une branche distante. -1. Créez une nouvelle branche en la nommant my-local-branch. Faites en sorte que la nouvelle branche locale suive la branche principale du référentiel distant nommé `origin`. Entrer la commande suivante : +1. Créez une nouvelle branche en la nommant my-local-branch. Faites en sorte que la nouvelle branche locale suive la branche principale du référentiel distant nommé `origin`. Tapez la commande suivante : - ```bash - git checkout -b my-local-branch origin/main - ``` + ```bash + git checkout -b my-local-branch origin/main + ``` 2. Utilisez la commande `git branch -vv` pour vérifier que la branche est une branche de suivi – Tracking –. Entrer la commande suivante : - ```bash - git branch -vv - ``` + ```bash + git branch -vv + ``` - Recherchez les branches avec `[origin/main]` indiquant qu'elles suivent `origin/main`. + Recherchez les branches avec `[origin/main]` indiquant qu'elles suivent `origin/main`. ## Branche sans suivi @@ -37,9 +37,9 @@ Une branche sans suivi – `Non-Tracking` – est une branche qui fonctionne ind 1. Créez une nouvelle branche locale sans suivi nommée my-feature-branch. Entrer la commande suivante : - ```bash - git checkout -b my-feature-branch - ``` + ```bash + git checkout -b my-feature-branch + ``` 2. Les branches sans suivi n’afficheront pas de branche distante à côté d’elles dans la sortie du résultat de la commande `git branch -vv`. Vérifiez si my-feature-branch est une branche sans suivi. @@ -47,26 +47,26 @@ Une branche sans suivi – `Non-Tracking` – est une branche qui fonctionne ind 1. Si vous le souhaitez, assurez-vous d’abord que les dernières modifications de la branche principale sont fusionnées dans la branche cible. Entrer la commande suivante : - ```bash - git checkout my-feature-branch - git merge main - ``` + ```bash + git checkout my-feature-branch + git merge main + ``` 2. Configurer le suivi – tracking – vers une branche distante : - ```bash - git branch --set-upstream-to=origin/main my-feature-branch - ``` + ```bash + git branch --set-upstream-to=origin/main my-feature-branch + ``` - Résultat : `Branch 'my-feature-branch' set up to track remote branch 'main' from 'origin'.` + Résultat : `Branch 'my-feature-branch' set up to track remote branch 'main' from 'origin'.` 3. Vérifier les modifications. Entrer la commande suivante : - ```bash - git branch -vv - ``` + ```bash + git branch -vv + ``` - Maintenant, `my-feature-branch` devrait afficher `[origin/main]` indiquant qu'elle est en cours de suivi – tracking –. + Maintenant, `my-feature-branch` devrait afficher `[origin/main]` indiquant qu'elle est en cours de suivi – tracking –. ## Conclusion diff --git a/docs/gemstones/https_rsa_keygen.fr.md b/docs/gemstones/https_rsa_keygen.fr.md index 49cd2326b4..aa0556ee9f 100644 --- a/docs/gemstones/https_rsa_keygen.fr.md +++ b/docs/gemstones/https_rsa_keygen.fr.md @@ -37,7 +37,7 @@ fi ## Brève Description * Ce script bash nécessite la saisie d'un paramètre ($1) qui est le nom du site sans aucun www, etc. Par exemple, "mywidget". -* Le script crée la clé par défaut avec un mot de passe et une longueur de 2048 bits (cela peut être modifié, comme indiqué ci-dessus pour une longueur de 4096 bits plus longue) +* Le script crée la clé par défaut avec un mot de passe et une longueur de 2048 bits (qui peut être modifiée, comme indiqué ci-dessus, en une longueur de 4096 bits) * Le mot de passe est alors immédiatement supprimé de la clé, la raison est que le redémarrage du serveur web nécessiterait que le mot de passe de la clé soit entré à chaque fois ainsi qu'au redémarrage, ce qui peut être problématique dans la pratique. * Ensuite, le script crée la CSR (Certificate Signing Request), qui peut ensuite être utilisée pour acheter un certificat SSL auprès d'un fournisseur. * Enfin, l'étape de nettoyage supprime la clé précédemment créée avec le mot de passe correspondant. diff --git a/docs/gemstones/network/RL9_network_manager.fr.md b/docs/gemstones/network/RL9_network_manager.fr.md index f2dc3dafe9..7f55a6a20c 100644 --- a/docs/gemstones/network/RL9_network_manager.fr.md +++ b/docs/gemstones/network/RL9_network_manager.fr.md @@ -1,5 +1,5 @@ --- -title: RL9 - Gestionnaire de Réseau +title: RL9 — Gestionnaire de Réseau author: tianci li contributors: Steven Spencer tags: diff --git a/docs/gemstones/network/mtr.de.md b/docs/gemstones/network/mtr.de.md index dc42fe5814..9e0b369bba 100644 --- a/docs/gemstones/network/mtr.de.md +++ b/docs/gemstones/network/mtr.de.md @@ -5,7 +5,7 @@ contributors: Steven Spencer, Neel Chauhan date: 2021-10-20 --- -# `mtr` Einleitung +# Einleitung `mtr` ist ein Netzwerkdiagnosetool, das Netzwerkprobleme untersuchen kann. Es wird verwendet, um die Befehle `ping` und `traceroute` zu ersetzen. In Bezug auf die Leistung ist der Befehl `mtr` performanter. diff --git a/docs/gemstones/network/mtr.fr.md b/docs/gemstones/network/mtr.fr.md index f9204aa537..4b75b714ca 100644 --- a/docs/gemstones/network/mtr.fr.md +++ b/docs/gemstones/network/mtr.fr.md @@ -1,11 +1,11 @@ --- -title: mtr - Logiciel d'Analyse de Réseau +title: mtr — Analyse de Réseau author: tianci li contributors: Steven Spencer, Neel Chauhan date: 2021-10-20 --- -# Présentation de `mtr` +# `mtr` — Introduction `mtr` est un outil d'analyse de réseau qui permet de diagnostiquer certains problèmes. Il peut remplacer les commandes `ping` et `traceroute`. `mtr` est plus performant. @@ -24,9 +24,9 @@ Les options les plus courantes de la commande `mtr` sont les suivantes. En temps | -6 | # IPv6 seulement | | -c COUNT | # Nombre de pings | | -n | # pas de résolution du nom d'hôte | -| -z | # Affichage du nombre AS | +| -z | # Affichage du nombre AS (Autonomous System) | | -b | # Affichage de l'adresse IP et du nom de l'hôte | -| -w | # Output a wide range of reports | +| -w | # Production d'une vaste gamme de rapports | Les informations échangées avec le terminal sont les suivantes : diff --git a/docs/gemstones/network/nmcli.de.md b/docs/gemstones/network/nmcli.de.md index 73e9fa2318..8752c16357 100644 --- a/docs/gemstones/network/nmcli.de.md +++ b/docs/gemstones/network/nmcli.de.md @@ -1,5 +1,5 @@ --- -title: nmcli – `Autoconnect` setzen +title: nmcli — Autoconnect author: Wale Soyinka tags: - nmcli diff --git a/docs/gemstones/network/nmtui.de.md b/docs/gemstones/network/nmtui.de.md index 9328bfa241..c56fe1f085 100644 --- a/docs/gemstones/network/nmtui.de.md +++ b/docs/gemstones/network/nmtui.de.md @@ -1,5 +1,5 @@ --- -title: nmtui – Netzwerk-Management-Tool +title: nmtui — Netzwerk-Management-Tool author: tianci li contributors: Steven Spencer, Neil Hanlon update: 2021-10-23 diff --git a/docs/gemstones/network/nmtui.fr.md b/docs/gemstones/network/nmtui.fr.md index 66d8361b0d..2503ebb009 100644 --- a/docs/gemstones/network/nmtui.fr.md +++ b/docs/gemstones/network/nmtui.fr.md @@ -1,5 +1,5 @@ --- -title: nmtui - Outil de gestion du réseau +title: nmtui — Gestion du réseau author: tianci li contributors: Steven Spencer, Neil Hanlon update: 2021-10-23 diff --git a/docs/gemstones/scripts/bash_stub.fr.md b/docs/gemstones/scripts/bash_stub.fr.md index a8a4ed9f75..60a45ec403 100644 --- a/docs/gemstones/scripts/bash_stub.fr.md +++ b/docs/gemstones/scripts/bash_stub.fr.md @@ -1,5 +1,5 @@ --- -title: bash – Ébauche de Script +title: bash — Ébauche de Script author: Steven Spencer contributors: Ezequiel Bruni --- diff --git a/docs/guides/cms/mediawiki.de.md b/docs/guides/cms/mediawiki.de.md index f48ea73eda..929c8185a5 100644 --- a/docs/guides/cms/mediawiki.de.md +++ b/docs/guides/cms/mediawiki.de.md @@ -58,7 +58,7 @@ Installieren Sie anschließend PHP und die benötigten Module: dnf install -y dnf install php84-php-fpm php84-php-intl php84-php-mbstring php84-php-apcu php84-php-curl php84-php-mysql php84-php-xml ``` -Enable PHP with: +Aktivieren Sie PHP mit: ```bash systemctl enable --now php84-php-fpm.service From c967cbc4d015f8ad2d9de1f07fba37925fa4aab2 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 25 Aug 2025 23:23:42 -0400 Subject: [PATCH 123/164] New Crowdin updates (#2848) * New translations mirroring_lsyncd.md (French) * New translations mirroring_lsyncd.md (French) * New translations htop.md (French) * New translations mtr.md (French) * New translations rsync_ssh.md (French) * New translations view_kernel_conf.md (French) * New translations docker.md (French) * New translations rsync_ssh.md (French) * New translations index.md (German) --- docs/gemstones/containers/docker.fr.md | 2 +- docs/gemstones/core/view_kernel_conf.fr.md | 4 +- docs/gemstones/htop.fr.md | 4 +- docs/gemstones/network/mtr.fr.md | 2 +- docs/guides/backup/mirroring_lsyncd.fr.md | 13 +- docs/guides/backup/rsync_ssh.fr.md | 201 +++++++++++++++++++ docs/guides/contribute/localdocs/index.de.md | 10 +- 7 files changed, 220 insertions(+), 16 deletions(-) create mode 100644 docs/guides/backup/rsync_ssh.fr.md diff --git a/docs/gemstones/containers/docker.fr.md b/docs/gemstones/containers/docker.fr.md index ecd507939b..418879bc2b 100644 --- a/docs/gemstones/containers/docker.fr.md +++ b/docs/gemstones/containers/docker.fr.md @@ -13,7 +13,7 @@ Docker Engine peut être utilisé en exécutant des charges de travail de type D ## Ajouter le dépôt Docker -Utilisez l'utilitaire `dnf` pour ajouter le référentiel docker à votre serveur Rocky Linux. Pour ce faire tapez la commande : +Utilisez l’utilitaire `dnf` pour ajouter le référentiel `Docker` à votre serveur Rocky Linux. Pour ce faire tapez la commande : ```bash sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo diff --git a/docs/gemstones/core/view_kernel_conf.fr.md b/docs/gemstones/core/view_kernel_conf.fr.md index 9e0d1b13b6..1f3ac673f8 100644 --- a/docs/gemstones/core/view_kernel_conf.fr.md +++ b/docs/gemstones/core/view_kernel_conf.fr.md @@ -43,13 +43,13 @@ Voyez ce que vous utilisez actuellement avec la version "kernel release" : `uname -r` et remplacer sa valeur retournée dans les commandes en utilisant `$(uname -r)` -RHEL et distributions dérivées (Fedora, CentOS Stream, Scientific Linux, RockyLinux, Almalinux, et autres) stocke également la configuration utilisée pour amorcer les noyaux installés dans le répertoire `/boot` utilisé par Grub2 comme fichiers ASCII : +RHEL et distributions dérivées (Fedora, CentOS Stream, Scientific Linux, Rocky Linux, AlmaLinux et autres) enregistrez également la configuration utilisée pour démarrer les noyaux installés dans le répertoire `/boot` utilisé par `Grub2` sous forme de fichiers ASCII : ```bash /boot/config- ``` -Pour vérifier la configuration du noyau en cours d'exécution pour une valeur particulière: +Vérification de la configuration actuelle du noyau en cours d'exécution pour une valeur spécifique : ```bash cat /boot/config-$(uname -r) | grep -i diff --git a/docs/gemstones/htop.fr.md b/docs/gemstones/htop.fr.md index 9c2a79cb3b..9fb42f872c 100644 --- a/docs/gemstones/htop.fr.md +++ b/docs/gemstones/htop.fr.md @@ -74,7 +74,7 @@ PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command(mer * **PID - Numéro d'identification du processus** * USER - Le propriétaire du processus -* PRI - la priorité du processus du point de vue du noyau Linux +* PRI – la priorité du processus du point de vue du noyau Linux * NI - la priorité du processus de réinitialisation par l'utilisateur normal ou bien root * VIRT - Mémoire virtuelle consommée par un processus * **RES - Mémoire physique consommée par un processus** @@ -98,7 +98,7 @@ Pour gérer le processus, utilisez le bouton ++f9++ et lui envoyer différents s | Signal | Description | | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 1 | Arrête immédiatement le processus qui redémarre après avoir relu le fichier de configuration | +| 1 | Permet de terminer le processus immédiatement puis de le redémarrer après avoir relu le fichier de configuration | | 9 | Utilisé pour mettre fin immédiatement à l'exécution du programme, pour terminer le processus de force, similaire à la fin forcée dans la barre des tâches de la fenêtre | | 15 | Le signal par défaut pour la commande kill. Parfois, si un problème s'est produit dans le processus et que le processus ne peut pas être terminé normalement avec ce signal, on peut essayer le signal 9 | diff --git a/docs/gemstones/network/mtr.fr.md b/docs/gemstones/network/mtr.fr.md index 4b75b714ca..c1c4a2d3ed 100644 --- a/docs/gemstones/network/mtr.fr.md +++ b/docs/gemstones/network/mtr.fr.md @@ -62,7 +62,7 @@ HOST: li Loss% Snt Last Avg Best Wrst StDev ## Racourcis de clavier -* ++p++ - Pause +* ++p++ – Pause * ++d++ - display - mode d'affichage * ++n++ - Activer/désactiver le DNS * ++r++ - Remettre tous les compteurs à zéro diff --git a/docs/guides/backup/mirroring_lsyncd.fr.md b/docs/guides/backup/mirroring_lsyncd.fr.md index 6493196cdb..c105bae778 100644 --- a/docs/guides/backup/mirroring_lsyncd.fr.md +++ b/docs/guides/backup/mirroring_lsyncd.fr.md @@ -1,5 +1,5 @@ --- -title: Solution Miroir - lsyncd +title: Solution Miroir — lsyncd author: Steven Spencer contributors: Ezequiel Bruni, tianci li, Ganna Zhyrnova tested_with: 8.5, 8.6, 9.0 @@ -12,8 +12,8 @@ tags: ## Prérequis - Une machine tournant sous Rocky Linux -- Pourvoir modifier des fichiers de configuration depuis la ligne de commande -- Connaissance de l'utilisation d'un éditeur de ligne de commande (nous utilisons `vi` ici, mais n'hésitez pas à le remplacer par votre éditeur favori.) +- Une certaine expérience avec la modification des fichiers de configuration à partir de la ligne de commande +- Connaissance de l'utilisation d'un éditeur de ligne de commande (nous utilisons `vi` ici, mais n'hésitez pas à le remplacer par votre éditeur favori) - Vous aurez besoin d'un accès `root` ou de privilèges supplémentaires grâce à `sudo` (utiliser `sudo -s` dès le début est une bonne idée) - Paire de clés SSH publiques et privées - Les dépôts EPEL (Extra Packages for Enterprise Linux) de Fedora @@ -62,7 +62,7 @@ systemctl enable lsyncd L'installation à partir des sources n'est pas difficile. -### Installation les dépendances +### Installation des Dépendances Vous aurez besoin de certaines dépendances pour `lsyncd` et pour créer des packages à partir des sources. Utilisez cette commande sur votre machine Rocky Linux pour vous assurer que vous avez les dépendances nécessaires. Si vous allez construire à partir des sources, c'est une bonne idée d'installer tous les outils de développement : @@ -96,7 +96,10 @@ wget https://github.com/axkibe/lsyncd/archive/master.zip Décompressez le fichier `master.zip` : -`unzip master.zip` +` +``` + unzip master.zip +``` ` Cela créera un répertoire appelé `lsyncd-master`. Vous devez accéder à ce répertoire et créer un répertoire appelé `build` : diff --git a/docs/guides/backup/rsync_ssh.fr.md b/docs/guides/backup/rsync_ssh.fr.md new file mode 100644 index 0000000000..1c0d515d01 --- /dev/null +++ b/docs/guides/backup/rsync_ssh.fr.md @@ -0,0 +1,201 @@ +--- +title: Synchronisation avec `rsync` +author: Steven Spencer +contributors: Ezequiel Bruni, tianci li, Ganna Zhyrnova +tags: + - synchronisation + - rsync +--- + +## Prérequis + +Voici ce dont vous aurez besoin pour comprendre et suivre ce guide : + +- Un ordinateur fonctionnant sous Rocky Linux +- Savoir modifier les fichiers de configuration à partir de la ligne de commande. +- Savoir utiliser un éditeur comme _vi_. +- Vous aurez besoin des droits d'accès `root` ou bien obtenir les privilèges nécessaires grâce à `sudo` +- Les paires de clés SSH publique et privée +- Pouvoir créer un script bash avec `vi` ou votre éditeur préféré et le tester. +- Être capable d'utiliser `crontab` pour automatiser l'exécution du script + +## Introduction + +L'utilisation de `rsync` sur SSH n'est pas aussi efficace que [lsyncd](../backup/mirroring_lsyncd.md) (qui vous permet de surveiller les modifications apportées à un répertoire ou à un fichier et de le maintenir synchronisé en temps réel), ni aussi flexible que [rsnapshot](../backup/rsnapshot_backup.md) (qui offre la possibilité de sauvegarder plusieurs cibles à partir d'un seul ordinateur). Cependant, il fournit la possibilité de tenir deux ordinateurs à jour selon un calendrier que vous pouvez définir vous-même. + +Si vous avez besoin de garder à jour un ensemble de répertoires sur l'ordinateur cible, et vous ne vous souciez pas de la synchronisation en temps réel en tant que fonctionnalité, alors `rsync` par l'intermédiaire de SSH est probablement la meilleure solution. + +Pour cette procédure, vous aurez besoin de l'utilisateur `root`. Connectez-vous en tant qu'utilisateur `root` ou utilisez la commande `sudo -s` pour passer à l'utilisateur `root` dans votre terminal. + +### Installation de `rsync` + +Il est probable que `rsync` soit déjà installé. Pour vous assurer que `rsync` est à jour, procédez comme suit sur les deux ordinateurs : + +```bash +dnf install rsync +``` + +Si le paquet n'est pas installé, `dnf` vous demandera de confirmer l'installation. S'il est déjà installé, `dnf` cherchera une mise à jour et vous demandera de l'installer. + +### Préparation de l’Environnement + +Cet exemple utilisera `rsync` sur l'ordinateur cible pour extraire de la source au lieu de transférer de la source vers la cible. Pour cela vous devez configurer une [paire de clés SSH](../security/ssh_public_private_keys.md). Après avoir créé la paire de clés SSH, vérifiez l’accès sans mot de passe de l’ordinateur cible à l’ordinateur source. + +### `rsync` — Paramètres et Configuration d'un Script + +Avant de poursuivre la configuration du script, vous devez décider quels paramètres vous souhaitez utiliser avec `rsync`. Il existe de nombreuses possibilités. Consultez le [manuel de rsync](https://linux.die.net/man/1/rsync) pour une liste complète. La façon la plus courante d'utiliser `rsync` est d'utiliser l'option `-a`, car `-a`, ou `archive`, combine plusieurs options standard. Qu'est-ce que `-a` inclus ? + +- `-r`, parcoure les sous-répertoires +- `-l`, maintiens les liens symboliques comme tels +- `-p`, préserve les permissions +- `-t`, préserve date et heure de modification +- `-g`, conserve le groupe +- `-o`, préserve le propriétaire +- `-D`, préserve les fichiers de périphérique + +Les seules options supplémentaires dont nous aurons besoin dans cet exemple sont les suivantes : + +- `-e`, précise le shell distant à utiliser +- `--delete`, qui indique que si le répertoire cible contient un fichier qui n'existe pas sur la source, il faut le supprimer + +Ensuite, nous devons configurer un script en créant un fichier pour cela (encore une fois, utilisez votre éditeur préféré si vous n'êtes pas familier avec `vi`). Pour créer le fichier, utilisez la commande suivante : + +```bash +vi /usr/local/sbin/rsync_dirs +``` + +Ajoutez le contenu : + +```bash +#!/usr/bin/env bash +/usr/bin/rsync -ae ssh --delete root@source.domain.com:/home/your_user /home +``` + +Remplacez `source.domain.com` par votre propre nom de domaine, nom d’hôte ou adresse IP. + +Rendez le script exécutable : + +```bash +chmod +x /usr/local/sbin/rsync_dirs +``` + +## Test + +Les scripts vous permettent de tester sans souci. + +!!! warning "Avertissement" + + Dans ce cas, nous partons du principe que votre répertoire personnel n'existe pas sur l'ordinateur cible. **S'il existe déjà, vous devriez faire une copie de sécurité avant de lancer le script !** + +Exécutez le script : + +```bash +/usr/local/sbin/rsync_dirs +``` + +Si tout se passe bien, vous obtiendrez une copie entièrement synchronisée de votre répertoire personnel sur l’ordinateur cible. Vérifiez pour être sûr que c'est bien le cas. + +En supposant que tout a bien marché comme prévu, continuez en créant un nouveau fichier dans votre répertoire personnel sous `/home/` de l'ordinateur source : + +```bash +touch /home/your_user/testfile.txt +``` + +Relancez le script : + +```bash +/usr/local/sbin/rsync_dirs +``` + +Ensuite vérifiez que la cible reçoit bien le nouveau fichier. Si oui, l'étape suivante consiste en la vérification de la bonne marche de l'effacement d'un fichier. Effacez le fichier créé précédemment sur l'ordinateur source : + +```bash +rm -f /home/your_user/testfile.txt +``` + +Relancez le script : + +```bash +/usr/local/sbin/rsync_dirs +``` + +Vérifiez que le fichier n'existe plus sur l'ordinateur cible. + +Finalement créons sur l'ordinateur cible un fichier qui n'existe pas sur l'ordinateur source : + +```bash +touch /home/your_user/a_different_file.txt +``` + +Relancez le script une dernière fois : + +```bash +/usr/local/sbin/rsync_dirs +``` + +Le fichier qui vient d'être créé sur l'ordinateur de destination devrait disparaître, du fait qu'il n'existe pas sur l'ordinateur source. + +En supposant que tout fonctionne correctement, modifiez le script pour synchroniser tous les répertoires requis. + +## Automatisation Complète + +Vous ne souhaiterez probablement pas exécuter ce script chaque fois que vous voulez effectuer une synchronisation manuelle. Utilisez un `crontab` pour effectuer cette opération automatiquement selon un calendrier précis. Supposons que vous désiriez lancer le script à 23: 00 chaque soir : + +```bash +crontab -e +``` + +Cela s'affichera et ressemblera à ceci : + +```bash +# Edit this file to introduce tasks to be run by cron. +# +# Each task to run has to be defined through a single line +# indicating with different fields when the task will be run +# and what command to run for the task +# +# To define the time you can provide concrete values for +# minute (m), hour (h), day of month (dom), month (mon), +# and day of week (dow) or use '*' in these fields (for 'any'). +# +# Notice that tasks will be started based on the cron's system +# daemon's notion of time and timezones. +# +# Output of the crontab jobs (including errors) is sent through +# email to the user the crontab file belongs to (unless redirected). +# +# For example, you can run a backup of all your user accounts +# at 5 a.m every week with: +# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ +# +# For more information see the manual pages of crontab(5) and cron(8) +# +# m h dom mon dow command +``` + +!!! info "Info" + + L'exemple `crontab` montre un fichier vide, mais commenté. Le commentaire n'apparaît pas sur chaque instance d'ordinateur et le fichier en question peut être un fichier vide. Sur un ordinateur en service vous pouvez voir d’autres entrées. + +Le `crontab` correspond à une horloge de 24 heures. Vous devrez insérer la ligne suivante au bas du fichier : + +```crontab +00 23 * * * /usr/local/sbin/rsync_dirs +``` + +Cela indique d'exécuter cette commande à minuit et à 23 h tous les jours, tous les mois et tous les jours de la semaine. Enregistrez votre entrée `crontab` comme suit : + +++shift+colon+"w"+"q"+exclam++ + +## Paramètres facultatifs + +```bash +-n: Dry-Run to see what files would be transferred +-v: list out all the files that are being transferred +-vvv: to provide debug info while transferring files +-z: to enable compression during the transfer +``` + +## Conclusion + +Bien que `rsync` ne sois pas aussi sophistiqué que d'autres outils, il propose une solution simple de synchronisation de fichiers très utile. diff --git a/docs/guides/contribute/localdocs/index.de.md b/docs/guides/contribute/localdocs/index.de.md index 5a0bf8f97b..461b21f196 100644 --- a/docs/guides/contribute/localdocs/index.de.md +++ b/docs/guides/contribute/localdocs/index.de.md @@ -1,7 +1,7 @@ --- -Title: Docs As Code +Title: Einleitung author: Steven Spencer -contributors: null +contributors: Ganna Zhyrnova tags: - local docs - docs as code @@ -10,15 +10,15 @@ tags: # Einleitung -Die Verwendung einer lokalen Kopie der Rocky Linux-Dokumentation ist hilfreich für diejenigen, die häufig Beiträge leisten und genau sehen möchten, wie ein Dokument nach dem Zusammenführen in der Weboberfläche aussieht. Die hier enthaltenen Methoden spiegeln die bisherigen Präferenzen der Mitwirkenden wider. +Die Verwendung einer lokalen Kopie der Rocky Linux-Dokumentation ist hilfreich für diejenigen, die häufig Beiträge leisten und genau sehen möchten, wie ein Dokument nach dem Zusammenführen in der Weboberfläche aussieht. Die hier vorgestellten Methoden spiegeln die bisherigen Präferenzen der Teilnehmer wider. Die Verwendung einer lokalen Kopie der Dokumentation ist ein Schritt im Entwicklungsprozess für diejenigen, die sich der Philosophie von „Dokumenten als Code“ anschließen, einem Workflow für die Dokumentation, der der Codeentwicklung ähnelt. ## Markdown-Linter -Neben Umgebungen zum Speichern und Erstellen der Dokumentation könnte für einige Autoren auch ein Linter für Markdown eine Überlegung wert sein. Markdown-Linters sind in vielen Aspekten der Verfassung von Dokumenten hilfreich, einschließlich der Überprüfung von Grammatik, Rechtschreibung, Formatierung und mehr. Manchmal handelt es sich dabei um separate Tools oder Plugins für Ihren Editor. Ein solches Tool ist [markdownlint](https://github.com/DavidAnson/markdownlint), ein Node.js-Tool. „markdownlint“ ist als Plugin für viele gängige Editoren verfügbar, darunter Visual Studio Code und NVChad. Aus diesem Grund befindet sich im Stammverzeichnis des Dokumentationsverzeichnisses eine Datei „.markdownlint.yml“, die die für das Projekt verfügbaren und aktivierten Regeln anwendet. `markdownlint` ist ein reiner Formatierungs-Linter. Es prüft auf fehlerhafte Leerzeichen, Inline-HTML-Elemente, doppelte Leerzeilen, falsche Tabulatoren und mehr. Für Grammatik, Rechtschreibung, inklusiven Sprachgebrauch und mehr installieren Sie bitte andere Tools. +Neben Umgebungen zum Speichern und Erstellen der Dokumentation könnte für einige Autoren auch ein Linter für Markdown eine Überlegung wert sein. Markdown-Linters sind in vielen Aspekten der Verfassung von Dokumenten hilfreich, einschließlich der Überprüfung von Grammatik, Rechtschreibung, Formatierung und mehr. Manchmal handelt es sich dabei um separate Tools oder Plugins für Ihren Editor. Ein solches Tool ist [markdownlint](https://github.com/DavidAnson/markdownlint), ein Node.js-Tool. `markdownlint` ist als Plugin für viele gängige Editoren verfügbar, darunter Visual Studio Code und NVChad. Aus diesem Grund befindet sich im Stammverzeichnis des Dokumentationsverzeichnisses eine Datei „.markdownlint.yml“, die die für das Projekt verfügbaren und aktivierten Regeln anwendet. `markdownlint` ist ein reiner Formatierungs-Linter. Es prüft auf fehlerhafte Leerzeichen, Inline-HTML-Elemente, doppelte Leerzeilen, falsche Tabulatoren und mehr. Für Grammatik, Rechtschreibung, inklusiven Sprachgebrauch und mehr installieren Sie bitte andere Tools. -!!! info „Haftungsausschluss“ +!!! info "Disclaimer" ``` Bei keinem der Punkte in dieser Kategorie („Lokale Dokumentation“) ist es erforderlich, Dokumente zu verfassen und zur Genehmigung einzureichen. Sie existieren für diejenigen, die der Philosophie von [docs as code](https://www.writethedocs.org/guide/docs-as-code/) folgen möchten, die mindestens eine lokale Kopie der Dokumentation enthalten. From 5b503c4499a9d747be851c48f9d651298a4d6633 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 25 Aug 2025 23:51:19 -0400 Subject: [PATCH 124/164] New translations index.md (German) (#2849) --- docs/guides/contribute/localdocs/index.de.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/contribute/localdocs/index.de.md b/docs/guides/contribute/localdocs/index.de.md index 461b21f196..2d8a1b23f9 100644 --- a/docs/guides/contribute/localdocs/index.de.md +++ b/docs/guides/contribute/localdocs/index.de.md @@ -12,7 +12,7 @@ tags: Die Verwendung einer lokalen Kopie der Rocky Linux-Dokumentation ist hilfreich für diejenigen, die häufig Beiträge leisten und genau sehen möchten, wie ein Dokument nach dem Zusammenführen in der Weboberfläche aussieht. Die hier vorgestellten Methoden spiegeln die bisherigen Präferenzen der Teilnehmer wider. -Die Verwendung einer lokalen Kopie der Dokumentation ist ein Schritt im Entwicklungsprozess für diejenigen, die sich der Philosophie von „Dokumenten als Code“ anschließen, einem Workflow für die Dokumentation, der der Codeentwicklung ähnelt. +Die Verwendung einer lokalen Kopie der Dokumentation ist ein Schritt im Entwicklungsprozess für diejenigen, die sich der Philosophie von „Dokumentation als Code“ anschließen, einem Workflow für die Dokumentation, der der Codeentwicklung ähnelt. ## Markdown-Linter From cc359a0dea31a91704a8e9097baa7e46abeefb2e Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Tue, 26 Aug 2025 09:59:04 -0400 Subject: [PATCH 125/164] New Crowdin updates (#2851) * New translations test_cpu_compat.md (French) * New translations test_cpu_compat.md (German) * New translations 02_github_web_edit_pr_title.md (German) * New translations gemstone_template.md (German) * New translations feature_branch_workflow.md (German) * New translations lab7-software_management.md (Ukrainian) * New translations nload.md (Ukrainian) * New translations 2_grep_command.md (Ukrainian) * New translations 3_sed_command.md (Ukrainian) * New translations 4_awk_command.md (Ukrainian) * New translations lab8-system_and_process_monitoring-i.md (Ukrainian) * New translations lab4-advanced_system_process_monitoring.md (Ukrainian) * New translations iftop.md (Ukrainian) * New translations test_cpu_compat.md (Ukrainian) * New translations 00-gh_cli_installation.md (Ukrainian) * New translations 01-gh_cli_1st_pr.md (Ukrainian) * New translations 02-gh_cli_edit_pr_title.md (Ukrainian) * New translations 02_github_web_edit_pr_title.md (Ukrainian) * New translations gemstone_template.md (Ukrainian) * New translations feature_branch_workflow.md (Ukrainian) * New translations fork_and_branch_workflow.md (Ukrainian) * New translations git_pull_vs_git_fetch.md (Ukrainian) * New translations git_remote_add.md (Ukrainian) * New translations tracking_and_nontracking_branch.md (Ukrainian) * New translations gnome-tweaks.md (Ukrainian) * New translations flatpak.md (Ukrainian) * New translations migration-to-new-azure-images.md (Ukrainian) * New translations lab8-samba.md (Ukrainian) * New translations ssh_ca_key_signing.md (Ukrainian) * New translations gnome-extensions.md (Ukrainian) * New translations rdp-server.md (Ukrainian) * New translations brother-all-in-one.md (Ukrainian) * New translations x11vnc_plus_ssh_lan.md (Ukrainian) * New translations 02-web-servers-intro.md (Ukrainian) * New translations 022-web-servers-nginx.md (Ukrainian) * New translations firewallgui.md (Ukrainian) * New translations dconf.md (Ukrainian) * New translations businessapps.md (Ukrainian) * New translations onlineaccounts.md (Ukrainian) * New translations install_software_with_appimage.md (Ukrainian) * New translations installing_nvidia_gpu_drivers.md (Ukrainian) * New translations decibels.md (Ukrainian) * New translations decoder.md (Ukrainian) * New translations valuta.md (Ukrainian) * New translations file-shredder.md (Ukrainian) * New translations screenshot.md (Ukrainian) * New translations proton.md (Ukrainian) * New translations wordpress-on-lamp.md (Ukrainian) * New translations libvirt-rocky.md (Ukrainian) * New translations tar.md (Ukrainian) * New translations dump_restore.md (Ukrainian) * New translations index.md (Ukrainian) * New translations lab4-certificate-authority.md (Ukrainian) * New translations lab7-bootstrapping-etcd.md (Ukrainian) * New translations lab9-bootstrapping-kubernetes-workers.md (Ukrainian) * New translations lab0-readme.md (Ukrainian) * New translations pulp_fetch_upload.md (Ukrainian) * New translations 9_6.md (Ukrainian) * New translations 10_0.md (Ukrainian) * New translations 9_6_installation.md (Ukrainian) * New translations aqc_bridge_vlan.md (Ukrainian) * New translations rdp-server.md (German) * New translations nload.md (French) * New translations iftop.md (French) * New translations 00-gh_cli_installation.md (French) * New translations 01-gh_cli_1st_pr.md (French) * New translations 02-gh_cli_edit_pr_title.md (French) * New translations 02_github_web_edit_pr_title.md (French) * New translations gemstone_template.md (French) * New translations gnome-tweaks.md (French) * New translations 09-working-with-jinja-template.md (French) * New translations ssh_ca_key_signing.md (French) * New translations rdp-server.md (French) * New translations firewallgui.md (French) * New translations dconf.md (French) * New translations businessapps.md (French) * New translations onlineaccounts.md (French) * New translations install_software_with_appimage.md (French) * New translations installing_nvidia_gpu_drivers.md (French) * New translations valuta.md (French) * New translations proton.md (French) * New translations index.md (French) * New translations lab0-readme.md (French) * New translations aqc_bridge_vlan.md (French) * New translations nload.md (German) * New translations iftop.md (German) * New translations 00-gh_cli_installation.md (German) * New translations 01-gh_cli_1st_pr.md (German) * New translations 02-gh_cli_edit_pr_title.md (German) * New translations gnome-tweaks.md (German) * New translations flatpak.md (German) * New translations x11vnc_plus_ssh_lan.md (German) * New translations firewallgui.md (German) * New translations install_software_with_appimage.md (German) * New translations installing_nvidia_gpu_drivers.md (German) * New translations decibels.md (German) * New translations valuta.md (German) * New translations file-shredder.md (German) * New translations screenshot.md (German) * New translations proton.md (German) * New translations lab0-readme.md (German) * New translations aqc_bridge_vlan.md (German) * New translations lab7-software_management.md (Italian) * New translations nload.md (Italian) * New translations 16-about-sytemd.md (Italian) * New translations 2_grep_command.md (Italian) * New translations 3_sed_command.md (Italian) * New translations 4_awk_command.md (Italian) * New translations lab8-system_and_process_monitoring-i.md (Italian) * New translations lab4-advanced_system_process_monitoring.md (Italian) * New translations iftop.md (Italian) * New translations test_cpu_compat.md (Italian) * New translations 00-gh_cli_installation.md (Italian) * New translations 01-gh_cli_1st_pr.md (Italian) * New translations 02-gh_cli_edit_pr_title.md (Italian) * New translations 02_github_web_edit_pr_title.md (Italian) * New translations gemstone_template.md (Italian) * New translations feature_branch_workflow.md (Italian) * New translations fork_and_branch_workflow.md (Italian) * New translations git_pull_vs_git_fetch.md (Italian) * New translations git_remote_add.md (Italian) * New translations tracking_and_nontracking_branch.md (Italian) * New translations gnome-tweaks.md (Italian) * New translations flatpak.md (Italian) * New translations migration-to-new-azure-images.md (Italian) * New translations lab8-samba.md (Italian) * New translations 09-working-with-jinja-template.md (Italian) * New translations ssh_ca_key_signing.md (Italian) * New translations rdp-server.md (Italian) * New translations brother-all-in-one.md (Italian) * New translations x11vnc_plus_ssh_lan.md (Italian) * New translations 02-web-servers-intro.md (Italian) * New translations 022-web-servers-nginx.md (Italian) * New translations firewallgui.md (Italian) * New translations dconf.md (Italian) * New translations businessapps.md (Italian) * New translations onlineaccounts.md (Italian) * New translations install_software_with_appimage.md (Italian) * New translations installing_nvidia_gpu_drivers.md (Italian) * New translations decibels.md (Italian) * New translations decoder.md (Italian) * New translations valuta.md (Italian) * New translations file-shredder.md (Italian) * New translations screenshot.md (Italian) * New translations proton.md (Italian) * New translations wordpress-on-lamp.md (Italian) * New translations libvirt-rocky.md (Italian) * New translations tar.md (Italian) * New translations dump_restore.md (Italian) * New translations index.md (Italian) * New translations lab0-readme.md (Italian) * New translations pulp_fetch_upload.md (Italian) * New translations 9_6.md (Italian) * New translations 10_0.md (Italian) * New translations 9_6_installation.md (Italian) * New translations aqc_bridge_vlan.md (Italian) * New translations 16-about-sytemd.md (Ukrainian) * New translations 09-working-with-jinja-template.md (Ukrainian) * New translations index.md (Chinese Simplified) * New translations 9_6.md (Chinese Simplified) * New translations 10_0.md (Chinese Simplified) * New translations good_docs.md (Italian) * New translations add_mirror_manager.md (Italian) * New translations rl9_network_manager.md (Italian) * New translations regenerate_initramfs.md (French) * New translations regenerate_initramfs.md (French) * New translations regenerate_initramfs.md (German) --- docs/books/admin_guide/16-about-sytemd.it.md | 186 +- docs/books/admin_guide/16-about-sytemd.uk.md | 186 +- .../09-working-with-jinja-template.fr.md | 24 +- .../09-working-with-jinja-template.it.md | 24 +- .../09-working-with-jinja-template.uk.md | 24 +- docs/books/sed_awk_grep/2_grep_command.it.md | 318 +- docs/books/sed_awk_grep/2_grep_command.uk.md | 318 +- docs/books/sed_awk_grep/3_sed_command.it.md | 1384 ++++---- docs/books/sed_awk_grep/3_sed_command.uk.md | 1384 ++++---- docs/books/sed_awk_grep/4_awk_command.it.md | 2992 ++++++++-------- docs/books/sed_awk_grep/4_awk_command.uk.md | 2994 ++++++++--------- .../web_services/02-web-servers-intro.it.md | 22 +- .../web_services/02-web-servers-intro.uk.md | 22 +- .../web_services/022-web-servers-nginx.it.md | 34 +- .../web_services/022-web-servers-nginx.uk.md | 34 +- .../install_software_with_appimage.de.md | 4 +- .../install_software_with_appimage.fr.md | 4 +- .../install_software_with_appimage.it.md | 4 +- .../install_software_with_appimage.uk.md | 4 +- .../installing_nvidia_gpu_drivers.de.md | 10 +- .../installing_nvidia_gpu_drivers.fr.md | 10 +- .../installing_nvidia_gpu_drivers.it.md | 10 +- .../installing_nvidia_gpu_drivers.uk.md | 10 +- docs/desktop/gaming/proton.de.md | 6 +- docs/desktop/gaming/proton.fr.md | 6 +- docs/desktop/gaming/proton.it.md | 6 +- docs/desktop/gaming/proton.uk.md | 6 +- docs/desktop/gnome/dconf.fr.md | 4 +- docs/desktop/gnome/dconf.it.md | 4 +- docs/desktop/gnome/dconf.uk.md | 4 +- docs/desktop/gnome/decibels.de.md | 22 +- docs/desktop/gnome/decibels.it.md | 22 +- docs/desktop/gnome/decibels.uk.md | 22 +- docs/desktop/gnome/decoder.it.md | 32 +- docs/desktop/gnome/decoder.uk.md | 32 +- docs/desktop/gnome/file-shredder.de.md | 6 +- docs/desktop/gnome/file-shredder.it.md | 6 +- docs/desktop/gnome/file-shredder.uk.md | 6 +- docs/desktop/gnome/flatpak.de.md | 66 +- docs/desktop/gnome/flatpak.it.md | 66 +- docs/desktop/gnome/flatpak.uk.md | 66 +- docs/desktop/gnome/gnome-extensions.uk.md | 2 +- docs/desktop/gnome/gnome-tweaks.de.md | 2 +- docs/desktop/gnome/gnome-tweaks.fr.md | 2 +- docs/desktop/gnome/gnome-tweaks.it.md | 2 +- docs/desktop/gnome/gnome-tweaks.uk.md | 2 +- docs/desktop/gnome/onlineaccounts.fr.md | 2 +- docs/desktop/gnome/onlineaccounts.it.md | 2 +- docs/desktop/gnome/onlineaccounts.uk.md | 2 +- docs/desktop/gnome/rdp-server.de.md | 10 +- docs/desktop/gnome/rdp-server.fr.md | 10 +- docs/desktop/gnome/rdp-server.it.md | 10 +- docs/desktop/gnome/rdp-server.uk.md | 10 +- docs/desktop/gnome/screenshot.de.md | 4 +- docs/desktop/gnome/screenshot.it.md | 4 +- docs/desktop/gnome/screenshot.uk.md | 4 +- docs/desktop/gnome/valuta.de.md | 22 +- docs/desktop/gnome/valuta.fr.md | 22 +- docs/desktop/gnome/valuta.it.md | 22 +- docs/desktop/gnome/valuta.uk.md | 22 +- docs/desktop/gnome/x11vnc_plus_ssh_lan.de.md | 8 +- docs/desktop/gnome/x11vnc_plus_ssh_lan.it.md | 8 +- docs/desktop/gnome/x11vnc_plus_ssh_lan.uk.md | 8 +- .../desktop/printing/brother-all-in-one.it.md | 12 +- .../desktop/printing/brother-all-in-one.uk.md | 12 +- docs/desktop/tools/businessapps.fr.md | 6 +- docs/desktop/tools/businessapps.it.md | 6 +- docs/desktop/tools/businessapps.uk.md | 6 +- docs/desktop/tools/firewallgui.de.md | 6 +- docs/desktop/tools/firewallgui.fr.md | 6 +- docs/desktop/tools/firewallgui.it.md | 6 +- docs/desktop/tools/firewallgui.uk.md | 6 +- docs/gemstones/gemstone_template.de.md | 10 +- docs/gemstones/gemstone_template.fr.md | 10 +- docs/gemstones/gemstone_template.it.md | 10 +- docs/gemstones/gemstone_template.uk.md | 10 +- .../git/00-gh_cli_installation.de.md | 28 +- .../git/00-gh_cli_installation.fr.md | 28 +- .../git/00-gh_cli_installation.it.md | 28 +- .../git/00-gh_cli_installation.uk.md | 28 +- docs/gemstones/git/01-gh_cli_1st_pr.de.md | 58 +- docs/gemstones/git/01-gh_cli_1st_pr.fr.md | 58 +- docs/gemstones/git/01-gh_cli_1st_pr.it.md | 58 +- docs/gemstones/git/01-gh_cli_1st_pr.uk.md | 58 +- .../git/02-gh_cli_edit_pr_title.de.md | 18 +- .../git/02-gh_cli_edit_pr_title.fr.md | 18 +- .../git/02-gh_cli_edit_pr_title.it.md | 18 +- .../git/02-gh_cli_edit_pr_title.uk.md | 18 +- .../git/02_github_web_edit_pr_title.de.md | 10 +- .../git/02_github_web_edit_pr_title.fr.md | 10 +- .../git/02_github_web_edit_pr_title.it.md | 10 +- .../git/02_github_web_edit_pr_title.uk.md | 10 +- .../git/feature_branch_workflow.de.md | 52 +- .../git/feature_branch_workflow.it.md | 52 +- .../git/feature_branch_workflow.uk.md | 52 +- .../git/fork_and_branch_workflow.it.md | 72 +- .../git/fork_and_branch_workflow.uk.md | 72 +- .../gemstones/git/git_pull_vs_git_fetch.it.md | 30 +- .../gemstones/git/git_pull_vs_git_fetch.uk.md | 30 +- docs/gemstones/git/git_remote_add.it.md | 44 +- docs/gemstones/git/git_remote_add.uk.md | 44 +- .../git/tracking_and_nontracking_branch.it.md | 44 +- .../git/tracking_and_nontracking_branch.uk.md | 44 +- .../network/RL9_network_manager.it.md | 2 +- docs/gemstones/network/iftop.de.md | 30 +- docs/gemstones/network/iftop.fr.md | 30 +- docs/gemstones/network/iftop.it.md | 30 +- docs/gemstones/network/iftop.uk.md | 30 +- docs/gemstones/network/nload.de.md | 22 +- docs/gemstones/network/nload.fr.md | 22 +- docs/gemstones/network/nload.it.md | 22 +- docs/gemstones/network/nload.uk.md | 22 +- docs/gemstones/test_cpu_compat.de.md | 24 +- docs/gemstones/test_cpu_compat.fr.md | 24 +- docs/gemstones/test_cpu_compat.it.md | 24 +- docs/gemstones/test_cpu_compat.uk.md | 24 +- docs/guides/9_6_installation.it.md | 90 +- docs/guides/9_6_installation.uk.md | 90 +- docs/guides/backup/dump_restore.it.md | 266 +- docs/guides/backup/dump_restore.uk.md | 266 +- docs/guides/backup/tar.it.md | 192 +- docs/guides/backup/tar.uk.md | 192 +- .../cloud/migration-to-new-azure-images.it.md | 8 +- .../cloud/migration-to-new-azure-images.uk.md | 8 +- docs/guides/cms/wordpress-on-lamp.it.md | 4 +- docs/guides/cms/wordpress-on-lamp.uk.md | 4 +- docs/guides/hardware/aqc_bridge_vlan.de.md | 2 + docs/guides/hardware/aqc_bridge_vlan.fr.md | 2 + docs/guides/hardware/aqc_bridge_vlan.it.md | 2 + docs/guides/hardware/aqc_bridge_vlan.uk.md | 2 + docs/guides/kernel/regenerate_initramfs.de.md | 4 +- docs/guides/kernel/regenerate_initramfs.fr.md | 6 +- .../add_mirror_manager.it.md | 2 +- .../repositories/pulp_fetch_upload.it.md | 4 +- .../repositories/pulp_fetch_upload.uk.md | 4 +- docs/guides/security/ssh_ca_key_signing.fr.md | 34 +- docs/guides/security/ssh_ca_key_signing.it.md | 34 +- docs/guides/security/ssh_ca_key_signing.uk.md | 34 +- .../guides/virtualization/libvirt-rocky.it.md | 50 +- .../guides/virtualization/libvirt-rocky.uk.md | 50 +- .../kubernetes-the-hard-way/lab0-README.de.md | 34 +- .../kubernetes-the-hard-way/lab0-README.fr.md | 34 +- .../kubernetes-the-hard-way/lab0-README.it.md | 34 +- .../kubernetes-the-hard-way/lab0-README.uk.md | 34 +- .../lab4-certificate-authority.uk.md | 2 + .../lab7-bootstrapping-etcd.uk.md | 2 + ...ab9-bootstrapping-kubernetes-workers.uk.md | 2 + docs/labs/networking/lab8-samba.it.md | 204 +- docs/labs/networking/lab8-samba.uk.md | 204 +- .../lab7-software_management.it.md | 656 ++-- .../lab7-software_management.uk.md | 652 ++-- ...lab8-system_and_process_monitoring-I.it.md | 986 +++--- ...lab8-system_and_process_monitoring-I.uk.md | 984 +++--- ...4-advanced_system_process_monitoring.it.md | 928 ++--- ...4-advanced_system_process_monitoring.uk.md | 928 ++--- docs/release_notes/10_0.it.md | 2 + docs/release_notes/10_0.uk.md | 2 + docs/release_notes/10_0.zh.md | 2 + docs/release_notes/9_6.it.md | 2 + docs/release_notes/9_6.uk.md | 2 + docs/release_notes/9_6.zh.md | 2 + docs/rocky_insights/blogs/good_docs.it.md | 2 +- docs/rocky_insights/blogs/index.fr.md | 6 +- docs/rocky_insights/blogs/index.it.md | 6 +- docs/rocky_insights/blogs/index.uk.md | 6 +- docs/rocky_insights/blogs/index.zh.md | 6 +- 166 files changed, 9547 insertions(+), 9493 deletions(-) diff --git a/docs/books/admin_guide/16-about-sytemd.it.md b/docs/books/admin_guide/16-about-sytemd.it.md index dcd3717669..778c25df9c 100644 --- a/docs/books/admin_guide/16-about-sytemd.it.md +++ b/docs/books/admin_guide/16-about-sytemd.it.md @@ -484,113 +484,113 @@ Di solito esistono tre intitolazioni per le unit di tipo ".service": 1. Intitolazione della unit - Sono utilizzabili le seguenti coppie chiave-valore: + Sono utilizzabili le seguenti coppie chiave-valore: - - `Description=OpenSSH server daemon`. La stringa viene utilizzata per descrivere la "unit". - - `Documentation=man:sshd(8) man:sshd_config(5)`. Un elenco separato da spazi di URI che fanno riferimento alla documentazione di questa "unit" o della sua configurazione. Sono accettati solo URI del tipo "http://", "https://", "file:", "info:", "man:". - - `After=network.target sshd-keygen.target`. Definisce la relazione della sequenza di avvio con altre "unit". In questo esempio, "network.target" e "sshd-keygen.target" si avviano per primi e "sshd.service" per ultimo. - - `Before=`. Definisce la relazione della sequenza di avvio con le altre "unit". - - `Requires=`. Configura le dipendenze da altre "unit" I valori possono essere più unit separate da spazi. Se la '"unit" corrente è attivata, si attiveranno anche i valori qui elencati. Se almeno uno dei valori elencati di "unit" non si attiva correttamente, `systemd` non avvia la "unit" corrente. - - `Wants=sshd-keygen.target`. Simile alla chiave `Requires`. La differenza consiste nel fatto che se la unit dipendente non si avvia, ciò non influisce sul normale funzionamento della "unit" corrente. - - `BindsTo=`. Simile alla chiave `Requires`. La differenza è data dal fatto che se una qualsiasi "unit" dipendente non si avvia, l'unità corrente viene arrestata in aggiunta alla "unit" che arresta la dipendenza. - - `PartOf=`. Simile alla chiave `Requires`. La differenza consiste nel fatto che se una qualsiasi "unit" dipendente non si avvia, oltre all'arresto e al riavvio delle unit dipendenti, viene arrestata e riavviata anche la "unit" corrente. - - `Conflicts=`. Il suo valore è un elenco di "unit" separate da spazi. Se la "unit" elencata dal valore è in funzione, la "unit" corrente non può essere eseguita. - - `OnFailure=`. Quando la "unit" corrente viene interrotta, la "unit" o le "unit" (separate da spazi) presenti nel valore si attivano. + - `Description=OpenSSH server daemon`. La stringa viene utilizzata per descrivere la "unit". + - `Documentation=man:sshd(8) man:sshd_config(5)`. Un elenco separato da spazi di URI che fanno riferimento alla documentazione di questa "unit" o della sua configurazione. Sono accettati solo URI del tipo "http://", "https://", "file:", "info:", "man:". + - `After=network.target sshd-keygen.target`. Definisce la relazione della sequenza di avvio con altre "unit". In questo esempio, "network.target" e "sshd-keygen.target" si avviano per primi e "sshd.service" per ultimo. + - `Before=`. Definisce la relazione della sequenza di avvio con le altre "unit". + - `Requires=`. Configura le dipendenze da altre "unit" I valori possono essere più unit separate da spazi. Se la '"unit" corrente è attivata, si attiveranno anche i valori qui elencati. Se almeno uno dei valori elencati di "unit" non si attiva correttamente, `systemd` non avvia la "unit" corrente. + - `Wants=sshd-keygen.target`. Simile alla chiave `Requires`. La differenza consiste nel fatto che se la unit dipendente non si avvia, ciò non influisce sul normale funzionamento della "unit" corrente. + - `BindsTo=`. Simile alla chiave `Requires`. La differenza è data dal fatto che se una qualsiasi "unit" dipendente non si avvia, l'unità corrente viene arrestata in aggiunta alla "unit" che arresta la dipendenza. + - `PartOf=`. Simile alla chiave `Requires`. La differenza consiste nel fatto che se una qualsiasi "unit" dipendente non si avvia, oltre all'arresto e al riavvio delle unit dipendenti, viene arrestata e riavviata anche la "unit" corrente. + - `Conflicts=`. Il suo valore è un elenco di "unit" separate da spazi. Se la "unit" elencata dal valore è in funzione, la "unit" corrente non può essere eseguita. + - `OnFailure=`. Quando la "unit" corrente viene interrotta, la "unit" o le "unit" (separate da spazi) presenti nel valore si attivano. - Per ulteriori informazioni, vedere `man 5 systemd.unit`. + Per ulteriori informazioni, vedere `man 5 systemd.unit`. 2. Intitolazione del Servizio - Sono utilizzabili le seguenti coppie chiave-valore: - - - `Type=notify`. Configurare il tipo di unit ".service", che può essere uno dei seguenti: - - `simple` - Il servizio si avvia come processo principale. Questa è l'impostazione predefinita. - - `forking` - Il servizio richiama processi biforcati e viene eseguito come parte del daemon principale. - - `exec` - Simile a `semplice`. Il gestore del servizio avvierà questa unit subito dopo aver eseguito il binario del servizio principale. Le altre unit successive devono rimanere bloccate fino a questo punto prima di poter proseguire l'avvio. - - `oneshot` - Simile a `simple`, ma il processo deve uscire prima che `systemd` avvii i servizi di follow-up. - - `dbus` - Simile a `simple`, tranne per il fatto che il daemon acquisisce il nome del bus D-Bus. - - `notify` - Simile a `simple`, tranne per il fatto che il daemon invia un messaggio di notifica usando `sd_notify` o una chiamata equivalente dopo l'avvio. - - `idle` - Simile a `simple`, tranne per il fatto che l'esecuzione del servizio viene ritardata fino a quando tutti i lavori attivi non vengono distribuiti. - - `RemainAfterExit=`. Se il servizio corrente deve essere considerato attivo quando tutti i processi del servizio terminano. L'impostazione predefinita è no. - - `GuessMainPID=`. Il valore è di tipo booleano ed è predefinito a yes. In assenza di una posizione definita per il processo principale del servizio, `systemd` deve indovinare il PID del processo principale (che potrebbe non essere corretto). Se si imposta `Type=forking` e non si imposta `PIDFile`, questa coppia di valori chiave diventerà effettiva. Altrimenti, verrà ignorata la coppia chiave-valore. - - `PIDFile=`. Specificare il percorso del file (percorso assoluto) del PID del servizio. Per i servizi `Type=forking`, si raccomanda di usare questa coppia chiave-valore. `systemd` legge il PID del processo principale del daemon dopo l'avvio del servizio. - - `BusName=`. Un nome del bus D-Bus per raggiungere questo servizio. Questa opzione è obbligatoria per i servizi dove viene utilizzato `Type=dbus`. - - `ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY`. I comandi e gli argomenti eseguiti all'avvio del servizio. - - `ExecStartPre=`. Altri comandi che vengono eseguiti prima dei comandi in `ExecStart`. - - `ExecStartPost=`. Gli altri comandi che verranno eseguiti dopo i comandi in `ExecStart`. - - `ExecReload=/bin/kill -HUP $MAINPID`. I comandi e gli argomenti vengono eseguiti quando il servizio viene ricaricato. - - `ExecStop=`. I comandi e gli argomenti che verranno eseguiti all'arresto del servizio. - - `ExecStopPost=`. Comandi aggiuntivi da eseguire dopo l'arresto del servizio. - - `RestartSec=42s`. Il tempo in secondi di sospensione prima di riavviare un servizio. - - `TimeoutStartSec=`. Il tempo in secondi di attesa per l'avvio del servizio. - - `TimeoutStopSec=`. Il tempo in secondi di attesa per l'arresto del servizio. - - `TimeoutSec=`. Un'abbreviazione per configurare contemporaneamente `TimeoutStartSec` e `TimeoutStopSec`. - - `RuntimeMaxSec=`. Tempo massimo in secondi per l'esecuzione del servizio. Passando \`infinity' (il valore predefinito) non si configura alcun limite di tempo di esecuzione. - - `Restart=on-failure`. Configura se riavviare il servizio quando il processo del servizio esce, viene terminato o raggiunge un timeout: - - `no` - Il servizio non verrà riavviato. Questa è l'impostazione predefinita. - - `on-success` - Si riavvia solo quando il processo di servizio esce in modo pulito (codice di uscita 0). - - `on-failure` - Si riavvia solo quando il processo di servizio non esce in modo pulito (codice di uscita non-zero). - - `on-abnormal` - Si riavvia se il processo termina con un segnale o quando si verifica un timeout. - - `on-abort` - Si riavvia se il processo esce a causa di un segnale imprevisto non specificato come condizione di uscita pulita. - - `on-watchdog` - Se impostato su `on-watchdog`, il servizio si riavvia solo se il timeout del watchdog scade. - - `always` - Si riavvia sempre. - - Le condizioni di uscita e l'effetto delle impostazioni di `Restart=` su di esse: - - ![effect](./images/16-effect.png) - - - `KillMode=process`. Specifica il modo in cui i processi di questa unit devono essere arrestati. Il suo valore può essere uno dei seguenti: - - `control-group` - Valore predefinito. Se impostato su `control-group`, tutti i processi rimanenti nel gruppo di controllo di questa unit vengono arrestati all'arresto della stessa. - - `process` - Viene arrestato solo il processo principale. - - `mixed` - Il segnale SIGTERM viene inviato al processo principale, mentre il successivo segnale SIGKILL viene inviato a tutti i processi rimanenti del gruppo di controllo della unit. - - `none` - Non arresta alcun processo. - - `PrivateTmp=`. Utilizzare o meno una directory tmp privata. In base a determinate condizioni di sicurezza, si consiglia di impostare il valore su yes. - - `ProtectHome=`. Proteggere o meno la home directory. Il suo valore può essere uno dei seguenti: - - `yes` - Le tre directory (/root/, /home/, /run/user/) non sono visibili alla unit. - - `no` - Le tre directory sono visibili alla unit. - - `read-only` - Le tre directory sono di sola lettura per la unit. - - `tmpfs` - Il file system temporaneo verrà montato in modalità di sola lettura su queste tre directory. - - `ProtectSystem=`. La directory utilizzata per proteggere il sistema dalla modifica da parte del servizio. Il valore può essere: - - `yes` - Indica che il processo chiamato dalla unit sarà montato in sola lettura sulle directory /usr/ e /boot/. - - `no` - Valore predefinito - - `full` - Indica che le directory /usr/, /boot/, /etc/ sono montate in sola lettura. - - `strict` - Tutti i file system sono montati in sola lettura (escluse le directory dei file system virtuali come /dev/, /proc/ e /sys/). - - `EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config`. Legge le variabili d'ambiente da un file di testo. "-" significa che se il file non esiste, non verrà letto e non verranno registrati errori o avvisi. - - Per ulteriori informazioni, vedere `man 5 systemd.service`. + Sono utilizzabili le seguenti coppie chiave-valore: + + - `Type=notify`. Configurare il tipo di unit ".service", che può essere uno dei seguenti: + - `simple` - Il servizio si avvia come processo principale. Questa è l'impostazione predefinita. + - `forking` - Il servizio richiama processi biforcati e viene eseguito come parte del daemon principale. + - `exec` - Simile a `semplice`. Il gestore del servizio avvierà questa unit subito dopo aver eseguito il binario del servizio principale. Le altre unit successive devono rimanere bloccate fino a questo punto prima di poter proseguire l'avvio. + - `oneshot` - Simile a `simple`, ma il processo deve uscire prima che `systemd` avvii i servizi di follow-up. + - `dbus` - Simile a `simple`, tranne per il fatto che il daemon acquisisce il nome del bus D-Bus. + - `notify` - Simile a `simple`, tranne per il fatto che il daemon invia un messaggio di notifica usando `sd_notify` o una chiamata equivalente dopo l'avvio. + - `idle` - Simile a `simple`, tranne per il fatto che l'esecuzione del servizio viene ritardata fino a quando tutti i lavori attivi non vengono distribuiti. + - `RemainAfterExit=`. Se il servizio corrente deve essere considerato attivo quando tutti i processi del servizio terminano. L'impostazione predefinita è no. + - `GuessMainPID=`. Il valore è di tipo booleano ed è predefinito a yes. In assenza di una posizione definita per il processo principale del servizio, `systemd` deve indovinare il PID del processo principale (che potrebbe non essere corretto). Se si imposta `Type=forking` e non si imposta `PIDFile`, questa coppia di valori chiave diventerà effettiva. Altrimenti, verrà ignorata la coppia chiave-valore. + - `PIDFile=`. Specificare il percorso del file (percorso assoluto) del PID del servizio. Per i servizi `Type=forking`, si raccomanda di usare questa coppia chiave-valore. `systemd` legge il PID del processo principale del daemon dopo l'avvio del servizio. + - `BusName=`. Un nome del bus D-Bus per raggiungere questo servizio. Questa opzione è obbligatoria per i servizi dove viene utilizzato `Type=dbus`. + - `ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY`. I comandi e gli argomenti eseguiti all'avvio del servizio. + - `ExecStartPre=`. Altri comandi che vengono eseguiti prima dei comandi in `ExecStart`. + - `ExecStartPost=`. Gli altri comandi che verranno eseguiti dopo i comandi in `ExecStart`. + - `ExecReload=/bin/kill -HUP $MAINPID`. I comandi e gli argomenti vengono eseguiti quando il servizio viene ricaricato. + - `ExecStop=`. I comandi e gli argomenti che verranno eseguiti all'arresto del servizio. + - `ExecStopPost=`. Comandi aggiuntivi da eseguire dopo l'arresto del servizio. + - `RestartSec=42s`. Il tempo in secondi di sospensione prima di riavviare un servizio. + - `TimeoutStartSec=`. Il tempo in secondi di attesa per l'avvio del servizio. + - `TimeoutStopSec=`. Il tempo in secondi di attesa per l'arresto del servizio. + - `TimeoutSec=`. Un'abbreviazione per configurare contemporaneamente `TimeoutStartSec` e `TimeoutStopSec`. + - `RuntimeMaxSec=`. Tempo massimo in secondi per l'esecuzione del servizio. Passando \`infinity' (il valore predefinito) non si configura alcun limite di tempo di esecuzione. + - `Restart=on-failure`. Configura se riavviare il servizio quando il processo del servizio esce, viene terminato o raggiunge un timeout: + - `no` - Il servizio non verrà riavviato. Questa è l'impostazione predefinita. + - `on-success` - Si riavvia solo quando il processo di servizio esce in modo pulito (codice di uscita 0). + - `on-failure` - Si riavvia solo quando il processo di servizio non esce in modo pulito (codice di uscita non-zero). + - `on-abnormal` - Si riavvia se il processo termina con un segnale o quando si verifica un timeout. + - `on-abort` - Si riavvia se il processo esce a causa di un segnale imprevisto non specificato come condizione di uscita pulita. + - `on-watchdog` - Se impostato su `on-watchdog`, il servizio si riavvia solo se il timeout del watchdog scade. + - `always` - Si riavvia sempre. + + Le condizioni di uscita e l'effetto delle impostazioni di `Restart=` su di esse: + + ![effect](./images/16-effect.png) + + - `KillMode=process`. Specifica il modo in cui i processi di questa unit devono essere arrestati. Il suo valore può essere uno dei seguenti: + - `control-group` - Valore predefinito. Se impostato su `control-group`, tutti i processi rimanenti nel gruppo di controllo di questa unit vengono arrestati all'arresto della stessa. + - `process` - Viene arrestato solo il processo principale. + - `mixed` - Il segnale SIGTERM viene inviato al processo principale, mentre il successivo segnale SIGKILL viene inviato a tutti i processi rimanenti del gruppo di controllo della unit. + - `none` - Non arresta alcun processo. + - `PrivateTmp=`. Utilizzare o meno una directory tmp privata. In base a determinate condizioni di sicurezza, si consiglia di impostare il valore su yes. + - `ProtectHome=`. Proteggere o meno la home directory. Il suo valore può essere uno dei seguenti: + - `yes` - Le tre directory (/root/, /home/, /run/user/) non sono visibili alla unit. + - `no` - Le tre directory sono visibili alla unit. + - `read-only` - Le tre directory sono di sola lettura per la unit. + - `tmpfs` - Il file system temporaneo verrà montato in modalità di sola lettura su queste tre directory. + - `ProtectSystem=`. La directory utilizzata per proteggere il sistema dalla modifica da parte del servizio. Il valore può essere: + - `yes` - Indica che il processo chiamato dalla unit sarà montato in sola lettura sulle directory /usr/ e /boot/. + - `no` - Valore predefinito + - `full` - Indica che le directory /usr/, /boot/, /etc/ sono montate in sola lettura. + - `strict` - Tutti i file system sono montati in sola lettura (escluse le directory dei file system virtuali come /dev/, /proc/ e /sys/). + - `EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config`. Legge le variabili d'ambiente da un file di testo. "-" significa che se il file non esiste, non verrà letto e non verranno registrati errori o avvisi. + + Per ulteriori informazioni, vedere `man 5 systemd.service`. 3. Intitolazione Install - - `Alias=`. Un elenco di nomi aggiuntivi separati da spazi. Attenzione prego! Il nome aggiuntivo deve avere lo stesso tipo (suffisso) della unit corrente. + - `Alias=`. Un elenco di nomi aggiuntivi separati da spazi. Attenzione prego! Il nome aggiuntivo deve avere lo stesso tipo (suffisso) della unit corrente. - - `RequiredBy=` o `WantedBy=multi-user.target`. Definisce la unit dell'operazione corrente come dipendenza della unit nel valore. Una volta completata la definizione, i file pertinenti si trovano nella directory /etc/systemd/systemd/. Ad esempio: + - `RequiredBy=` o `WantedBy=multi-user.target`. Definisce la unit dell'operazione corrente come dipendenza della unit nel valore. Una volta completata la definizione, i file pertinenti si trovano nella directory /etc/systemd/systemd/. Ad esempio: - ```bash - Shell > systemctl is-enabled chronyd.service - enabled + ```bash + Shell > systemctl is-enabled chronyd.service + enabled - Shell > systemctl cat chronyd.service - ... - [Install] - WantedBy=multi-user.target + Shell > systemctl cat chronyd.service + ... + [Install] + WantedBy=multi-user.target - Shell > ls -l /etc/systemd/system/multi-user.target.wants/ - total 0 - lrwxrwxrwx. 1 root root 38 Sep 25 14:03 auditd.service -> /usr/lib/systemd/system/auditd.service - lrwxrwxrwx. 1 root root 39 Sep 25 14:03 chronyd.service -> /usr/lib/systemd/system/chronyd.service ←← - lrwxrwxrwx. 1 root root 37 Sep 25 14:03 crond.service -> /usr/lib/systemd/system/crond.service - lrwxrwxrwx. 1 root root 42 Sep 25 14:03 irqbalance.service -> /usr/lib/systemd/system/irqbalance.service - lrwxrwxrwx. 1 root root 37 Sep 25 14:03 kdump.service -> /usr/lib/systemd/system/kdump.service - lrwxrwxrwx. 1 root root 46 Sep 25 14:03 NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service - lrwxrwxrwx. 1 root root 40 Sep 25 14:03 remote-fs.target -> /usr/lib/systemd/system/remote-fs.target - lrwxrwxrwx. 1 root root 36 Sep 25 14:03 sshd.service -> /usr/lib/systemd/system/sshd.service - lrwxrwxrwx. 1 root root 36 Sep 25 14:03 sssd.service -> /usr/lib/systemd/system/sssd.service - lrwxrwxrwx. 1 root root 37 Sep 25 14:03 tuned.service -> /usr/lib/systemd/system/tuned.service - ``` + Shell > ls -l /etc/systemd/system/multi-user.target.wants/ + total 0 + lrwxrwxrwx. 1 root root 38 Sep 25 14:03 auditd.service -> /usr/lib/systemd/system/auditd.service + lrwxrwxrwx. 1 root root 39 Sep 25 14:03 chronyd.service -> /usr/lib/systemd/system/chronyd.service ←← + lrwxrwxrwx. 1 root root 37 Sep 25 14:03 crond.service -> /usr/lib/systemd/system/crond.service + lrwxrwxrwx. 1 root root 42 Sep 25 14:03 irqbalance.service -> /usr/lib/systemd/system/irqbalance.service + lrwxrwxrwx. 1 root root 37 Sep 25 14:03 kdump.service -> /usr/lib/systemd/system/kdump.service + lrwxrwxrwx. 1 root root 46 Sep 25 14:03 NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service + lrwxrwxrwx. 1 root root 40 Sep 25 14:03 remote-fs.target -> /usr/lib/systemd/system/remote-fs.target + lrwxrwxrwx. 1 root root 36 Sep 25 14:03 sshd.service -> /usr/lib/systemd/system/sshd.service + lrwxrwxrwx. 1 root root 36 Sep 25 14:03 sssd.service -> /usr/lib/systemd/system/sssd.service + lrwxrwxrwx. 1 root root 37 Sep 25 14:03 tuned.service -> /usr/lib/systemd/system/tuned.service + ``` - - `Also=`. Altre unit da installare o disinstallare durante l'installazione o la disinstallazione di questa unit. + - `Also=`. Altre unit da installare o disinstallare durante l'installazione o la disinstallazione di questa unit. - Oltre alle pagine di manuale sopra menzionate, è possibile digitare `man 5 systemd.exec` o `man 5 systemd.kill` per accedere ad altre informazioni. + Oltre alle pagine di manuale sopra menzionate, è possibile digitare `man 5 systemd.exec` o `man 5 systemd.kill` per accedere ad altre informazioni. ## Comando relativo ad altri componenti diff --git a/docs/books/admin_guide/16-about-sytemd.uk.md b/docs/books/admin_guide/16-about-sytemd.uk.md index f7ba9df1c3..f33c0c4d01 100644 --- a/docs/books/admin_guide/16-about-sytemd.uk.md +++ b/docs/books/admin_guide/16-about-sytemd.uk.md @@ -484,113 +484,113 @@ method=disabled 1. Назва підрозділу - Можна використовувати наступні пари ключ-значення: + Можна використовувати наступні пари ключ-значення: - - `Description=OpenSSH server daemon`. Рядок використовується для опису "одиниці". - - `Documentation=man:sshd(8) man:sshd_config(5)`. Відокремлений пробілами список URI, що посилається на документацію для цього «блока» або його конфігурації. Приймаються лише URI типів "http://", "https://", "file:", "info:", "man:". - - `After=network.target sshd-keygen.target`. Визначає зв'язок послідовності запуску з іншими "одиницями". У цьому прикладі "network.target" і "sshd-keygen.target" починаються першими, а "sshd.service" починається останнім. - - `Before=`. Визначте зв’язок послідовності запуску з іншими «одиницями». - - `Requires=`. Налаштувати залежності від інших «одиниць». Значення можуть бути кількома одиницями, розділеними пробілами. Якщо поточна «одиниця» активована, значення, наведені тут, також активуються. Якщо принаймні одне з перелічених значень "одиниці" не вдається успішно активувати, `systemd` не запускає поточний "блок". - - `Wants=sshd-keygen.target`. Подібно до ключа `Requires`. Різниця в тому, що якщо залежний блок не запускається, це не вплине на нормальну роботу поточного «блока». - - `BindsTo=`. Подібно до ключа `Requires`. Різниця полягає в тому, що якщо будь-який залежний "блок" не запускається, поточний блок зупиняється на додаток до "блоку", який зупиняє залежність. - - `PartOf=`. Подібно до ключа `Requires`. Різниця полягає в тому, що якщо будь-який залежний «блок» не запускається, окрім зупинки та перезапуску залежних блоків, поточний «блок» буде зупинено та перезапущено. - - `Conflicts=`. Його значенням є список одиниць, розділених пробілами. Якщо «одиниця», зазначена у значенні, працює, поточна «одиниця» працювати не може. - - `OnFailure=`. Коли поточна «одиниця» виходить з ладу, активується «одиниця» або «одиниці» (відокремлені пробілами) у значенні. + - `Description=OpenSSH server daemon`. Рядок використовується для опису "одиниці". + - `Documentation=man:sshd(8) man:sshd_config(5)`. Відокремлений пробілами список URI, що посилається на документацію для цього «блока» або його конфігурації. Приймаються лише URI типів "http://", "https://", "file:", "info:", "man:". + - `After=network.target sshd-keygen.target`. Визначає зв'язок послідовності запуску з іншими "одиницями". У цьому прикладі "network.target" і "sshd-keygen.target" починаються першими, а "sshd.service" починається останнім. + - `Before=`. Визначте зв’язок послідовності запуску з іншими «одиницями». + - `Requires=`. Налаштувати залежності від інших «одиниць». Значення можуть бути кількома одиницями, розділеними пробілами. Якщо поточна «одиниця» активована, значення, наведені тут, також активуються. Якщо принаймні одне з перелічених значень "одиниці" не вдається успішно активувати, `systemd` не запускає поточний "блок". + - `Wants=sshd-keygen.target`. Подібно до ключа `Requires`. Різниця в тому, що якщо залежний блок не запускається, це не вплине на нормальну роботу поточного «блока». + - `BindsTo=`. Подібно до ключа `Requires`. Різниця полягає в тому, що якщо будь-який залежний "блок" не запускається, поточний блок зупиняється на додаток до "блоку", який зупиняє залежність. + - `PartOf=`. Подібно до ключа `Requires`. Різниця полягає в тому, що якщо будь-який залежний «блок» не запускається, окрім зупинки та перезапуску залежних блоків, поточний «блок» буде зупинено та перезапущено. + - `Conflicts=`. Його значенням є список одиниць, розділених пробілами. Якщо «одиниця», зазначена у значенні, працює, поточна «одиниця» працювати не може. + - `OnFailure=`. Коли поточна «одиниця» виходить з ладу, активується «одиниця» або «одиниці» (відокремлені пробілами) у значенні. - Дивись `man 5 systemd.unit`. + Дивись `man 5 systemd.unit`. 2. Назва служби - Можна використовувати наступні пари ключ-значення: - - - `Type=notify`. Налаштуйте тип цього блоку ".service", який може бути одним із таких: - - `simple` - Сервіс запускається як основний процес. Це значення за умовчанням. - - `forking` - Служба викликає роздвоєні процеси та працює як частина основного демона. - - `exec` - Схожий до `simple`. Менеджер служби запустить цей блок одразу після виконання двійкового файлу основної служби. Інші підрозділи-наступники повинні залишатися заблокованими до цього моменту, перш ніж вони зможуть продовжити роботу. - - `oneshot` - Подібно до `simple`, за винятком того, що процес має завершитися, перш ніж `systemd` запустить наступні служби. - - `dbus` - Подібно до `simple`, за винятком того, що демон отримує назву шини D-Bus. - - `notify` - Подібно до `simple`, за винятком того, що демон надсилає сповіщення за допомогою `sd_notify` або еквівалентного виклику після запуску. - - `idle` - Подібно до «simple», за винятком того, що виконання служби відкладено, доки не буде відправлено всі активні завдання. - - `RemainAfterExit=`. Чи слід вважати поточну службу активною, коли завершуються всі процеси служби. За замовчуванням ні. - - `GuessMainPID=`. Значення має тип boolean і за замовчуванням yes. За відсутності чіткого розташування основного процесу служби, `systemd` має вгадати PID основного процесу (який може бути неправильним). Якщо ви встановите `Type=forking` і не встановите `PIDFile`, ця пара ключ-значення вступить у силу. В іншому випадку ігноруйте пару ключ-значення. - - `PIDFile=`. Вкажіть шлях до файлу (абсолютний шлях) PID служби. Для служб `Type=forking` рекомендується використовувати цю пару ключ-значення. `systemd` зчитує PID основного процесу демона після запуску служби. - - `BusName=`. Назва шини D-Bus, щоб дістатися до цієї служби. Цей параметр є обов’язковим для служб, де використовується `Type=dbus`. - - `ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY`. Команди та аргументи виконуються під час запуску служби. - - `ExecStartPre=`. Інші команди виконуються перед командами в `ExecStart`. - - `ExecStartPost=`. Інші команди виконуються після команд у `ExecStart`. - - `ExecReload=/bin/kill -HUP $MAINPID`. Команди та аргументи запускаються під час перезавантаження служби. - - `ExecStop=`. Команди та аргументи запускаються, коли служба зупиняється. - - `ExecStopPost=`. Додаткові команди для запуску після зупинки служби. - - `RestartSec=42s`. Час у секундах до переходу в режим сну перед перезапуском служби. - - `TimeoutStartSec=`. Час очікування запуску служби в секундах. - - `TimeoutStopSec=`. Час у секундах очікування зупинки служби. - - `TimeoutSec=`. Скорочення для одночасного налаштування `TimeoutStartSec` і `TimeoutStopSec`. - - `RuntimeMaxSec=`. Максимальний час роботи служби в секундах. Передає `infinity` (за замовчуванням), щоб не налаштувати обмеження часу виконання. - - `Restart=on-failure`. Налаштовує, чи потрібно перезапускати службу, коли процес служби завершується, завершується або досягає тайм-ауту: - - `no` - Служба не буде перезапущена. Це значення за умовчанням. - - `on-success` - Перезапускається лише тоді, коли сервісний процес закінчується чисто (код виходу 0). - - `on-failure` - Перезапускається лише тоді, коли процес обслуговування не завершується належним чином (код виходу node-zero). - - `on-abnormal` - Перезапускається, якщо процес завершується сигналом або коли настає тайм-аут. - - `on-abort` - Перезапускається, якщо процес завершується через неперехоплений сигнал, не вказаний як чистий статус виходу. - - `on-watchdog` - Якщо встановлено значення `on-watchdog`, служба перезапуститься лише після закінчення тайм-ауту сторожового таймера. - - `always` - Завжди перезапускається. - - Причини виходу та вплив на них налаштувань `Restart=`: - - ![effect](./images/16-effect.png) - - - `KillMode=process`. Визначає, як процеси цього блоку мають бути припинені. Його значення може бути одним із таких: - - `control-group` - Значення за замовчуванням. Якщо встановлено значення `control-group`, усі решта процесів у групі керування цього блоку припиняються під час зупинки блоку. - - `process` - Знищується лише основний процес. - - `mixed` - Сигнал SIGTERM надсилається головному процесу, тоді як наступний сигнал SIGKILL надсилається всім іншим процесам групи керування блоком. - - `none` - Не вбиває жодних процесів. - - `PrivateTmp=`. Чи використовувати приватний каталог tmp. Виходячи з певної безпеки, рекомендовано встановити значення так. - - `ProtectHome=`. Чи захищати домашній каталог. Його значення може бути одним із таких: - - `yes` - Три каталоги (/root/, /home/, /run/user/) не видимі для пристрою. - - `no` - Три каталоги видимі для пристрою. - - `read-only` - Три каталоги доступні лише для читання. - - `tmpfs` - Тимчасова файлова система буде змонтована в режимі лише для читання в цих трьох каталогах. - - `ProtectSystem=`. Каталог використовується для захисту системи від модифікації службою. Значення може бути: - - `yes` - Вказує, що процес, викликаний модулем, буде змонтовано лише для читання до каталогів /usr/ і /boot/. - - `no` - За замовченням - - `full` - Вказує, що каталоги /usr/, /boot/, /etc/ монтуються лише для читання. - - `strict` - Усі файлові системи монтуються лише для читання (за винятком каталогів віртуальних файлових систем, таких як /dev/, /proc/ і /sys/). - - `EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config`. Читання змінних середовища з текстового файлу. «-» означає, що якщо файл не існує, він не буде прочитаний, а помилки чи попередження не реєструватимуться. - - Дивись `man 5 systemd.service`. + Можна використовувати наступні пари ключ-значення: + + - `Type=notify`. Налаштуйте тип цього блоку ".service", який може бути одним із таких: + - `simple` - Сервіс запускається як основний процес. Це значення за умовчанням. + - `forking` - Служба викликає роздвоєні процеси та працює як частина основного демона. + - `exec` - Схожий до `simple`. Менеджер служби запустить цей блок одразу після виконання двійкового файлу основної служби. Інші підрозділи-наступники повинні залишатися заблокованими до цього моменту, перш ніж вони зможуть продовжити роботу. + - `oneshot` - Подібно до `simple`, за винятком того, що процес має завершитися, перш ніж `systemd` запустить наступні служби. + - `dbus` - Подібно до `simple`, за винятком того, що демон отримує назву шини D-Bus. + - `notify` - Подібно до `simple`, за винятком того, що демон надсилає сповіщення за допомогою `sd_notify` або еквівалентного виклику після запуску. + - `idle` - Подібно до «simple», за винятком того, що виконання служби відкладено, доки не буде відправлено всі активні завдання. + - `RemainAfterExit=`. Чи слід вважати поточну службу активною, коли завершуються всі процеси служби. За замовчуванням ні. + - `GuessMainPID=`. Значення має тип boolean і за замовчуванням yes. За відсутності чіткого розташування основного процесу служби, `systemd` має вгадати PID основного процесу (який може бути неправильним). Якщо ви встановите `Type=forking` і не встановите `PIDFile`, ця пара ключ-значення вступить у силу. В іншому випадку ігноруйте пару ключ-значення. + - `PIDFile=`. Вкажіть шлях до файлу (абсолютний шлях) PID служби. Для служб `Type=forking` рекомендується використовувати цю пару ключ-значення. `systemd` зчитує PID основного процесу демона після запуску служби. + - `BusName=`. Назва шини D-Bus, щоб дістатися до цієї служби. Цей параметр є обов’язковим для служб, де використовується `Type=dbus`. + - `ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY`. Команди та аргументи виконуються під час запуску служби. + - `ExecStartPre=`. Інші команди виконуються перед командами в `ExecStart`. + - `ExecStartPost=`. Інші команди виконуються після команд у `ExecStart`. + - `ExecReload=/bin/kill -HUP $MAINPID`. Команди та аргументи запускаються під час перезавантаження служби. + - `ExecStop=`. Команди та аргументи запускаються, коли служба зупиняється. + - `ExecStopPost=`. Додаткові команди для запуску після зупинки служби. + - `RestartSec=42s`. Час у секундах до переходу в режим сну перед перезапуском служби. + - `TimeoutStartSec=`. Час очікування запуску служби в секундах. + - `TimeoutStopSec=`. Час у секундах очікування зупинки служби. + - `TimeoutSec=`. Скорочення для одночасного налаштування `TimeoutStartSec` і `TimeoutStopSec`. + - `RuntimeMaxSec=`. Максимальний час роботи служби в секундах. Передає `infinity` (за замовчуванням), щоб не налаштувати обмеження часу виконання. + - `Restart=on-failure`. Налаштовує, чи потрібно перезапускати службу, коли процес служби завершується, завершується або досягає тайм-ауту: + - `no` - Служба не буде перезапущена. Це значення за умовчанням. + - `on-success` - Перезапускається лише тоді, коли сервісний процес закінчується чисто (код виходу 0). + - `on-failure` - Перезапускається лише тоді, коли процес обслуговування не завершується належним чином (код виходу node-zero). + - `on-abnormal` - Перезапускається, якщо процес завершується сигналом або коли настає тайм-аут. + - `on-abort` - Перезапускається, якщо процес завершується через неперехоплений сигнал, не вказаний як чистий статус виходу. + - `on-watchdog` - Якщо встановлено значення `on-watchdog`, служба перезапуститься лише після закінчення тайм-ауту сторожового таймера. + - `always` - Завжди перезапускається. + + Причини виходу та вплив на них налаштувань `Restart=`: + + ![effect](./images/16-effect.png) + + - `KillMode=process`. Визначає, як процеси цього блоку мають бути припинені. Його значення може бути одним із таких: + - `control-group` - Значення за замовчуванням. Якщо встановлено значення `control-group`, усі решта процесів у групі керування цього блоку припиняються під час зупинки блоку. + - `process` - Знищується лише основний процес. + - `mixed` - Сигнал SIGTERM надсилається головному процесу, тоді як наступний сигнал SIGKILL надсилається всім іншим процесам групи керування блоком. + - `none` - Не вбиває жодних процесів. + - `PrivateTmp=`. Чи використовувати приватний каталог tmp. Виходячи з певної безпеки, рекомендовано встановити значення так. + - `ProtectHome=`. Чи захищати домашній каталог. Його значення може бути одним із таких: + - `yes` - Три каталоги (/root/, /home/, /run/user/) не видимі для пристрою. + - `no` - Три каталоги видимі для пристрою. + - `read-only` - Три каталоги доступні лише для читання. + - `tmpfs` - Тимчасова файлова система буде змонтована в режимі лише для читання в цих трьох каталогах. + - `ProtectSystem=`. Каталог використовується для захисту системи від модифікації службою. Значення може бути: + - `yes` - Вказує, що процес, викликаний модулем, буде змонтовано лише для читання до каталогів /usr/ і /boot/. + - `no` - За замовченням + - `full` - Вказує, що каталоги /usr/, /boot/, /etc/ монтуються лише для читання. + - `strict` - Усі файлові системи монтуються лише для читання (за винятком каталогів віртуальних файлових систем, таких як /dev/, /proc/ і /sys/). + - `EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config`. Читання змінних середовища з текстового файлу. «-» означає, що якщо файл не існує, він не буде прочитаний, а помилки чи попередження не реєструватимуться. + + Дивись `man 5 systemd.service`. 3. Назва установки - - `Alias=`. Список додаткових імен, розділених пробілами. Увага, будь ласка! Ваша додаткова назва повинна мати той самий тип (суфікс), що й поточна одиниця. + - `Alias=`. Список додаткових імен, розділених пробілами. Увага, будь ласка! Ваша додаткова назва повинна мати той самий тип (суфікс), що й поточна одиниця. - - `RequiredBy=` or `WantedBy=multi-user.target`. Визначте одиницю поточної операції як залежність одиниці від значення. Після завершення визначення ви зможете знайти відповідні файли в каталозі /etc/systemd/systemd/. Наприклад: + - `RequiredBy=` or `WantedBy=multi-user.target`. Визначте одиницю поточної операції як залежність одиниці від значення. Після завершення визначення ви зможете знайти відповідні файли в каталозі /etc/systemd/systemd/. Наприклад: - ```bash - Shell > systemctl is-enabled chronyd.service - enabled + ```bash + Shell > systemctl is-enabled chronyd.service + enabled - Shell > systemctl cat chronyd.service - ... - [Install] - WantedBy=multi-user.target + Shell > systemctl cat chronyd.service + ... + [Install] + WantedBy=multi-user.target - Shell > ls -l /etc/systemd/system/multi-user.target.wants/ - total 0 - lrwxrwxrwx. 1 root root 38 Sep 25 14:03 auditd.service -> /usr/lib/systemd/system/auditd.service - lrwxrwxrwx. 1 root root 39 Sep 25 14:03 chronyd.service -> /usr/lib/systemd/system/chronyd.service ←← - lrwxrwxrwx. 1 root root 37 Sep 25 14:03 crond.service -> /usr/lib/systemd/system/crond.service - lrwxrwxrwx. 1 root root 42 Sep 25 14:03 irqbalance.service -> /usr/lib/systemd/system/irqbalance.service - lrwxrwxrwx. 1 root root 37 Sep 25 14:03 kdump.service -> /usr/lib/systemd/system/kdump.service - lrwxrwxrwx. 1 root root 46 Sep 25 14:03 NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service - lrwxrwxrwx. 1 root root 40 Sep 25 14:03 remote-fs.target -> /usr/lib/systemd/system/remote-fs.target - lrwxrwxrwx. 1 root root 36 Sep 25 14:03 sshd.service -> /usr/lib/systemd/system/sshd.service - lrwxrwxrwx. 1 root root 36 Sep 25 14:03 sssd.service -> /usr/lib/systemd/system/sssd.service - lrwxrwxrwx. 1 root root 37 Sep 25 14:03 tuned.service -> /usr/lib/systemd/system/tuned.service - ``` + Shell > ls -l /etc/systemd/system/multi-user.target.wants/ + total 0 + lrwxrwxrwx. 1 root root 38 Sep 25 14:03 auditd.service -> /usr/lib/systemd/system/auditd.service + lrwxrwxrwx. 1 root root 39 Sep 25 14:03 chronyd.service -> /usr/lib/systemd/system/chronyd.service ←← + lrwxrwxrwx. 1 root root 37 Sep 25 14:03 crond.service -> /usr/lib/systemd/system/crond.service + lrwxrwxrwx. 1 root root 42 Sep 25 14:03 irqbalance.service -> /usr/lib/systemd/system/irqbalance.service + lrwxrwxrwx. 1 root root 37 Sep 25 14:03 kdump.service -> /usr/lib/systemd/system/kdump.service + lrwxrwxrwx. 1 root root 46 Sep 25 14:03 NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service + lrwxrwxrwx. 1 root root 40 Sep 25 14:03 remote-fs.target -> /usr/lib/systemd/system/remote-fs.target + lrwxrwxrwx. 1 root root 36 Sep 25 14:03 sshd.service -> /usr/lib/systemd/system/sshd.service + lrwxrwxrwx. 1 root root 36 Sep 25 14:03 sssd.service -> /usr/lib/systemd/system/sssd.service + lrwxrwxrwx. 1 root root 37 Sep 25 14:03 tuned.service -> /usr/lib/systemd/system/tuned.service + ``` - - `Also=`. Інші пристрої для встановлення або видалення під час встановлення або видалення цього пристрою. + - `Also=`. Інші пристрої для встановлення або видалення під час встановлення або видалення цього пристрою. - На додаток до сторінок посібника, згаданих вище, ви також можете ввести `man 5 systemd.exec` або `man 5 systemd.kill`, щоб отримати доступ до іншої інформації. + На додаток до сторінок посібника, згаданих вище, ви також можете ввести `man 5 systemd.exec` або `man 5 systemd.kill`, щоб отримати доступ до іншої інформації. ## Команда, пов'язана з іншими компонентами diff --git a/docs/books/learning_ansible/09-working-with-jinja-template.fr.md b/docs/books/learning_ansible/09-working-with-jinja-template.fr.md index 06a43a6197..7ca98ca848 100644 --- a/docs/books/learning_ansible/09-working-with-jinja-template.fr.md +++ b/docs/books/learning_ansible/09-working-with-jinja-template.fr.md @@ -108,20 +108,20 @@ Le module Ansible `template` vous permet d'utiliser des modèles Jinja pour gén ### Principales caractéristiques 1. **Rendu de modèle :** - - Le module restitue des modèles Jinja pour créer des fichiers de configuration avec un contenu dynamique. - - Les variables définies dans le playbook ou l'inventaire peuvent être injectées dans des modèles, permettant des configurations dynamiques. + - Le module restitue des modèles Jinja pour créer des fichiers de configuration avec un contenu dynamique. + - Les variables définies dans le playbook ou l'inventaire peuvent être injectées dans des modèles, permettant des configurations dynamiques. 2. **Utilisation de Jinja2 :** - - Le module `template` exploite le moteur de création de modèles Jinja2, fournissant des fonctionnalités puissantes telles que des conditions, des boucles et des filtres pour une manipulation avancée des modèles. + - Le module `template` exploite le moteur de création de modèles Jinja2, fournissant des fonctionnalités puissantes telles que des conditions, des boucles et des filtres pour une manipulation avancée des modèles. 3. **Chemins Source et de Destination :** - - Spécifie le fichier modèle Jinja source et le chemin de destination pour le fichier de configuration généré. + - Spécifie le fichier modèle Jinja source et le chemin de destination pour le fichier de configuration généré. 4. \*\* Passage de variable : \*\* - - Les variables peuvent être transmises directement dans la tâche playbook ou chargées à partir de fichiers externes, permettant une génération de configuration flexible et dynamique. + - Les variables peuvent être transmises directement dans la tâche playbook ou chargées à partir de fichiers externes, permettant une génération de configuration flexible et dynamique. 5. **Exécution Idempotente :** - - Le module `template` d'Ansible prend en charge l'exécution idempotente des modèles, garantissant que le modèle n'est appliqué que si des modifications sont détectées. + - Le module `template` d'Ansible prend en charge l'exécution idempotente des modèles, garantissant que le modèle n'est appliqué que si des modifications sont détectées. ### Exemple de playbook snippet @@ -142,24 +142,24 @@ Le module Ansible `template` vous permet d'utiliser des modèles Jinja pour gén ### Exemples d'utilisation 1. **Gestion de Configuration :** - - Idéal pour gérer les configurations de système en générant dynamiquement des fichiers en fonction de paramètres spécifiques. + - Idéal pour gérer les configurations de système en générant dynamiquement des fichiers en fonction de paramètres spécifiques. 2. **Mise en Place d'Application :** - - Utile pour créer des fichiers de configuration spécifiques à une application avec différents paramètres. + - Utile pour créer des fichiers de configuration spécifiques à une application avec différents paramètres. 3. **Infrastructure sous Forme de Code :** - - Facilite les pratiques d'infrastructure en tant que code en permettant des ajustements dynamiques des configurations en fonction de variables. + - Facilite les pratiques d'infrastructure en tant que code en permettant des ajustements dynamiques des configurations en fonction de variables. ### Les bonnes pratiques 1. **Séparation des Thèmes :** - - Confine la logique de configuration réelle dans les modèles Jinja, en la séparant de la structure principale du playbook. + - Confine la logique de configuration réelle dans les modèles Jinja, en la séparant de la structure principale du playbook. 2. **Contrôle de Version :** - - Stocke les modèles Jinja dans des référentiels contrôlés en version pour un meilleur suivi et une meilleure collaboration. + - Stocke les modèles Jinja dans des référentiels contrôlés en version pour un meilleur suivi et une meilleure collaboration. 3. **Testabilité :** - - Permet de tester les modèles de manière indépendante pour vous assurer qu’ils produisent le résultat de configuration attendu. + - Permet de tester les modèles de manière indépendante pour vous assurer qu’ils produisent le résultat de configuration attendu. En tirant parti du module `template`, les utilisateurs d'Ansible peuvent améliorer la gérabilité et la flexibilité des tâches de configuration, favorisant ainsi une approche plus rationalisée et efficace de la configuration du système et des applications. diff --git a/docs/books/learning_ansible/09-working-with-jinja-template.it.md b/docs/books/learning_ansible/09-working-with-jinja-template.it.md index 24b07d605e..67d5706b41 100644 --- a/docs/books/learning_ansible/09-working-with-jinja-template.it.md +++ b/docs/books/learning_ansible/09-working-with-jinja-template.it.md @@ -108,20 +108,20 @@ Il modulo `template` di Ansible consente di utilizzare i modelli Jinja per gener ### Caratteristiche principali 1. **Rendering del template:** - - Il modulo esegue il rendering dei template Jinja per creare file di configurazione con contenuti dinamici. - - Le variabili definite nel playbook o nell'inventario possono essere inserite nei modelli, consentendo configurazioni dinamiche. + - Il modulo esegue il rendering dei template Jinja per creare file di configurazione con contenuti dinamici. + - Le variabili definite nel playbook o nell'inventario possono essere inserite nei modelli, consentendo configurazioni dinamiche. 2. **Utilizzo di Jinja2:** - - Il modulo `template` sfrutta il motore di creazione di template Jinja2, offrendo potenti funzionalità come istruzioni condizionali, cicli e filtri per la manipolazione avanzata dei template. + - Il modulo `template` sfrutta il motore di creazione di template Jinja2, offrendo potenti funzionalità come istruzioni condizionali, cicli e filtri per la manipolazione avanzata dei template. 3. **Percorsi di origine e destinazione:** - - Specifica il file template Jinja di origine e il percorso di destinazione per il file di configurazione generato. + - Specifica il file template Jinja di origine e il percorso di destinazione per il file di configurazione generato. 4. **Passare le variabili:** - - Le variabili possono essere passate direttamente nel playbook o caricate da file esterni, consentendo la generazione di configurazioni flessibili e dinamiche. + - Le variabili possono essere passate direttamente nel playbook o caricate da file esterni, consentendo la generazione di configurazioni flessibili e dinamiche. 5. **Esecuzione idempotente:** - - Il modulo dei template supporta l'esecuzione idempotente, assicurando che il template venga applicato solo se vengono rilevate delle modifiche. + - Il modulo dei template supporta l'esecuzione idempotente, assicurando che il template venga applicato solo se vengono rilevate delle modifiche. ### Esempio di un playbook @@ -142,24 +142,24 @@ Il modulo `template` di Ansible consente di utilizzare i modelli Jinja per gener ### Casi d'uso 1. **Gestione della configurazione:** - - Ideale per gestire le configurazioni di sistema generando dinamicamente file in base a parametri specifici. + - Ideale per gestire le configurazioni di sistema generando dinamicamente file in base a parametri specifici. 2. **Setup Applicativi:** - - Utile per creare file di configurazione per applicazioni specifiche con impostazioni diverse. + - Utile per creare file di configurazione per applicazioni specifiche con impostazioni diverse. 3. **Infrastruttura come codice:** - - Facilita le pratiche di Infrastruttura come Codice consentendo adattamenti dinamici alle configurazioni in base alle variabili. + - Facilita le pratiche di Infrastruttura come Codice consentendo adattamenti dinamici alle configurazioni in base alle variabili. ### Buone pratiche 1. **Separazione degli interessi:** - - Mantenere la logica di configurazione effettiva nei modelli Jinja, separandola dalla struttura principale del playbook. + - Mantenere la logica di configurazione effettiva nei modelli Jinja, separandola dalla struttura principale del playbook. 2. **Controllo Versione:** - - Salvare i modelli Jinja in repository con controllo delle versioni per un miglior monitoraggio ed una migliore collaborazione. + - Salvare i modelli Jinja in repository con controllo delle versioni per un miglior monitoraggio ed una migliore collaborazione. 3. **Testabilità:** - - Testare i modelli in modo indipendente per assicurarsi che producano l'output di configurazione previsto. + - Testare i modelli in modo indipendente per assicurarsi che producano l'output di configurazione previsto. Sfruttando il modulo `template`, gli utenti Ansible possono migliorare la gestibilità e la flessibilità delle attività di configurazione, promuovendo un approccio più snello ed efficiente alla configurazione del sistema e delle applicazioni. diff --git a/docs/books/learning_ansible/09-working-with-jinja-template.uk.md b/docs/books/learning_ansible/09-working-with-jinja-template.uk.md index c060de5470..1f68236475 100644 --- a/docs/books/learning_ansible/09-working-with-jinja-template.uk.md +++ b/docs/books/learning_ansible/09-working-with-jinja-template.uk.md @@ -108,20 +108,20 @@ ansible-playbook your_playbook.yml ### Ключові особливості 1. **Візуалізація шаблону:** - - Модуль рендерить шаблони Jinja для створення файлів конфігурації з динамічним вмістом. - - Змінні, визначені в посібнику чи інвентарі, можна вставляти в шаблони, уможливлюючи динамічні конфігурації. + - Модуль рендерить шаблони Jinja для створення файлів конфігурації з динамічним вмістом. + - Змінні, визначені в посібнику чи інвентарі, можна вставляти в шаблони, уможливлюючи динамічні конфігурації. 2. **Використання Jinja2:** - - Модуль `template` використовує механізм створення шаблонів Jinja2, надаючи такі потужні функції, як умови, цикли та фільтри для розширеної роботи з шаблонами. + - Модуль `template` використовує механізм створення шаблонів Jinja2, надаючи такі потужні функції, як умови, цикли та фільтри для розширеної роботи з шаблонами. 3. **Шляхи джерела та призначення:** - - Визначає вихідний файл шаблону Jinja та шлях призначення для створеного файлу конфігурації. + - Визначає вихідний файл шаблону Jinja та шлях призначення для створеного файлу конфігурації. 4. **Передача змінних:** - - Змінні можна передати безпосередньо в завданні playbook або завантажити із зовнішніх файлів, що забезпечує гнучку та динамічну генерацію конфігурації. + - Змінні можна передати безпосередньо в завданні playbook або завантажити із зовнішніх файлів, що забезпечує гнучку та динамічну генерацію конфігурації. 5. **Ідемпотентне виконання:** - - Модуль шаблону підтримує ідемпотентне виконання, забезпечуючи застосування шаблону лише у разі виявлення змін. + - Модуль шаблону підтримує ідемпотентне виконання, забезпечуючи застосування шаблону лише у разі виявлення змін. ### Приклад фрагмента playbook @@ -142,24 +142,24 @@ ansible-playbook your_playbook.yml ### Випадки використання 1. **Управління конфігурацією:** - - Ідеально підходить для керування конфігураціями системи шляхом динамічного створення файлів на основі певних параметрів. + - Ідеально підходить для керування конфігураціями системи шляхом динамічного створення файлів на основі певних параметрів. 2. **Налаштування програми:** - - Корисно для створення конфігураційних файлів програми з різними параметрами. + - Корисно для створення конфігураційних файлів програми з різними параметрами. 3. **Інфраструктура як код:** - - Спрощує практику «Інфраструктура як код», дозволяючи динамічно коригувати конфігурації на основі змінних. + - Спрощує практику «Інфраструктура як код», дозволяючи динамічно коригувати конфігурації на основі змінних. ### Кращі практики 1. **Відокремлення інтересів:** - - Зберігайте логіку конфігурації в шаблонах Jinja, відокремлюючи її від основної структури посібника. + - Зберігайте логіку конфігурації в шаблонах Jinja, відокремлюючи її від основної структури посібника. 2. **Контроль версій:** - - Зберігайте шаблони Jinja в репозиторіях з контрольованими версіями для кращого відстеження та співпраці. + - Зберігайте шаблони Jinja в репозиторіях з контрольованими версіями для кращого відстеження та співпраці. 3. **Перевіряемість:** - - Тестуйте шаблони незалежно, щоб переконатися, що вони дають очікуваний результат конфігурації. + - Тестуйте шаблони незалежно, щоб переконатися, що вони дають очікуваний результат конфігурації. Використовуючи модуль `template`, користувачі Ansible можуть підвищити керованість і гнучкість завдань конфігурації, сприяючи більш спрощеному та ефективному підходу до налаштування системи та програм. diff --git a/docs/books/sed_awk_grep/2_grep_command.it.md b/docs/books/sed_awk_grep/2_grep_command.it.md index 8e71ca890f..c3e1575ca2 100644 --- a/docs/books/sed_awk_grep/2_grep_command.it.md +++ b/docs/books/sed_awk_grep/2_grep_command.it.md @@ -74,207 +74,207 @@ gestione dei file o directory: 1. Opzione -f e opzione -o - ```bash - Shell > cat /root/a - abcdef - 123456 - 338922549 - 24680 - hello world - - Shell > cat /root/b - 12345 - test - world - aaaaa - - # Usa ogni riga del file b come un pattern da ricercare nel file a e mostra le corrispondenze. - Shell > grep -f /root/b /root/a - 123456 - hello world - - Shell > grep -f /root/b /root/a -o - 12345 - world - ``` + ```bash + Shell > cat /root/a + abcdef + 123456 + 338922549 + 24680 + hello world + + Shell > cat /root/b + 12345 + test + world + aaaaa + + # Usa ogni riga del file b come un pattern da ricercare nel file a e mostra le corrispondenze. + Shell > grep -f /root/b /root/a + 123456 + hello world + + Shell > grep -f /root/b /root/a -o + 12345 + world + ``` 2. Ricerca di pattern multiplo (usare l'opzione -e) - ```bash - Shell > echo -e "a\nab\nbc\nbcde" | grep -e 'a' -e 'cd' - a - ab - bcde - ``` + ```bash + Shell > echo -e "a\nab\nbc\nbcde" | grep -e 'a' -e 'cd' + a + ab + bcde + ``` - oppure: + oppure: - ```bash - Shell > echo -e "a\nab\nbc\nbcde" | grep -E "a|cd" - a - ab - bcde - ``` + ```bash + Shell > echo -e "a\nab\nbc\nbcde" | grep -E "a|cd" + a + ab + bcde + ``` 3. Rimuove le righe vuote e le righe di commento dal file di configurazione - ```bash - Shell > grep -v -E "^$|^#" /etc/chrony.conf - server ntp1.tencent.com iburst - server ntp2.tencent.com iburst - server ntp3.tencent.com iburst - server ntp4.tencent.com iburst - driftfile /var/lib/chrony/drift - makestep 1.0 3 - rtcsync - keyfile /etc/chrony.keys - leapsectz right/UTC - logdir /var/log/chrony - ``` + ```bash + Shell > grep -v -E "^$|^#" /etc/chrony.conf + server ntp1.tencent.com iburst + server ntp2.tencent.com iburst + server ntp3.tencent.com iburst + server ntp4.tencent.com iburst + driftfile /var/lib/chrony/drift + makestep 1.0 3 + rtcsync + keyfile /etc/chrony.keys + leapsectz right/UTC + logdir /var/log/chrony + ``` 4. Visualizza i primi 5 risultati corrispondenti - ```bash - Shell > seq 1 20 | grep -m 5 -E "[0-9]{2}" - 10 - 11 - 12 - 13 - 14 - ``` - - oppure: - - ```bash - Shell > seq 1 20 | grep -m 5 "[0-9]\{2\}" - 10 - 11 - 12 - 13 - 14 - ``` + ```bash + Shell > seq 1 20 | grep -m 5 -E "[0-9]{2}" + 10 + 11 + 12 + 13 + 14 + ``` + + oppure: + + ```bash + Shell > seq 1 20 | grep -m 5 "[0-9]\{2\}" + 10 + 11 + 12 + 13 + 14 + ``` 5. Opzione -B e opzione -A - ```bash - Shell > seq 1 20 | grep -B 2 -A 3 -m 5 -E "[0-9]{2}" - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - 16 - 17 - ``` + ```bash + Shell > seq 1 20 | grep -B 2 -A 3 -m 5 -E "[0-9]{2}" + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + ``` 6. Opzione -C - ```bash - Shell > seq 1 20 | grep -C 3 -m 5 -E "[0-9]{2}" - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - 16 - 17 - ``` + ```bash + Shell > seq 1 20 | grep -C 3 -m 5 -E "[0-9]{2}" + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + ``` 7. Opzione -c - ```bash - Shell > cat /etc/ssh/sshd_config | grep -n -i -E "port" - 13:# If you want to change the port on a SELinux system, you have to tell - 15:# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER - 17:#Port 22 - 99:# WARNING: 'UsePAM no' is not supported in RHEL and may cause several - 105:#GatewayPorts no + ```bash + Shell > cat /etc/ssh/sshd_config | grep -n -i -E "port" + 13:# If you want to change the port on a SELinux system, you have to tell + 15:# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER + 17:#Port 22 + 99:# WARNING: 'UsePAM no' is not supported in RHEL and may cause several + 105:#GatewayPorts no - Shell > cat /etc/ssh/sshd_config | grep -E -i "port" -c - 5 - ``` + Shell > cat /etc/ssh/sshd_config | grep -E -i "port" -c + 5 + ``` 8. Opzione -v - ```bash - Shell > cat /etc/ssh/sshd_config | grep -i -v -E "port" -c - 140 - ``` + ```bash + Shell > cat /etc/ssh/sshd_config | grep -i -v -E "port" -c + 140 + ``` 9. Filtra i file in una cartella aventi righe corrispondenti alla stringa (Escludi i file nelle cartelle secondarie) - ```bash - Shell > grep -i -E "port" /etc/n*.conf -n - /etc/named.conf:11: listen-on port 53 { 127.0.0.1; }; - /etc/named.conf:12: listen-on-v6 port 53 { ::1; }; - /etc/nsswitch.conf:32:# winbind Use Samba winbind support - /etc/nsswitch.conf:33:# wins Use Samba wins support - ``` + ```bash + Shell > grep -i -E "port" /etc/n*.conf -n + /etc/named.conf:11: listen-on port 53 { 127.0.0.1; }; + /etc/named.conf:12: listen-on-v6 port 53 { ::1; }; + /etc/nsswitch.conf:32:# winbind Use Samba winbind support + /etc/nsswitch.conf:33:# wins Use Samba wins support + ``` 10. Filtra i file di una directory che hanno righe corrispondenti alla stringa (include o esclude i file o le directory nelle sotto directory) - Includere la sintassi per file multipli: + Includere la sintassi per file multipli: - ```bash - Shell > grep -n -i -r -E "port" /etc/ --include={0..20}_* - /etc/grub.d/20_ppc_terminfo:26:export TEXTDOMAIN=grub - /etc/grub.d/20_ppc_terminfo:27:export TEXTDOMAINDIR=/usr/share/locale - /etc/grub.d/20_linux_xen:26:export TEXTDOMAIN=grub - /etc/grub.d/20_linux_xen:27:export TEXTDOMAINDIR="${datarootdir}/locale" - /etc/grub.d/20_linux_xen:46:# Default to disabling partition uuid support to maintian compatibility with - /etc/grub.d/10_linux:26:export TEXTDOMAIN=grub - /etc/grub.d/10_linux:27:export TEXTDOMAINDIR="${datarootdir}/locale" - /etc/grub.d/10_linux:47:# Default to disabling partition uuid support to maintian compatibility with + ```bash + Shell > grep -n -i -r -E "port" /etc/ --include={0..20}_* + /etc/grub.d/20_ppc_terminfo:26:export TEXTDOMAIN=grub + /etc/grub.d/20_ppc_terminfo:27:export TEXTDOMAINDIR=/usr/share/locale + /etc/grub.d/20_linux_xen:26:export TEXTDOMAIN=grub + /etc/grub.d/20_linux_xen:27:export TEXTDOMAINDIR="${datarootdir}/locale" + /etc/grub.d/20_linux_xen:46:# Default to disabling partition uuid support to maintian compatibility with + /etc/grub.d/10_linux:26:export TEXTDOMAIN=grub + /etc/grub.d/10_linux:27:export TEXTDOMAINDIR="${datarootdir}/locale" + /etc/grub.d/10_linux:47:# Default to disabling partition uuid support to maintian compatibility with - Shell > grep -n -i -r -E "port" /etc/ --include={{0..20}_*,sshd_config} -c - /etc/ssh/sshd_config:5 - /etc/grub.d/20_ppc_terminfo:2 - /etc/grub.d/10_reset_boot_success:0 - /etc/grub.d/12_menu_auto_hide:0 - /etc/grub.d/20_linux_xen:3 - /etc/grub.d/10_linux:3 - ``` + Shell > grep -n -i -r -E "port" /etc/ --include={{0..20}_*,sshd_config} -c + /etc/ssh/sshd_config:5 + /etc/grub.d/20_ppc_terminfo:2 + /etc/grub.d/10_reset_boot_success:0 + /etc/grub.d/12_menu_auto_hide:0 + /etc/grub.d/20_linux_xen:3 + /etc/grub.d/10_linux:3 + ``` - Se devi escludere un singola directory, utilizza la seguente sintassi: + Se devi escludere un singola directory, utilizza la seguente sintassi: - ```bash - Shell > grep -n -i -r -E "port" /etc/ --exclude-dir=selin[u]x - ``` + ```bash + Shell > grep -n -i -r -E "port" /etc/ --exclude-dir=selin[u]x + ``` - Se devi escludere più cartelle, utilizza la seguente sintassi: + Se devi escludere più cartelle, utilizza la seguente sintassi: - ```bash - Shell > grep -n -i -r -E "port" /etc/ --exclude-dir={selin[u]x,"profile.d",{a..z}ki,au[a-z]it} - ``` + ```bash + Shell > grep -n -i -r -E "port" /etc/ --exclude-dir={selin[u]x,"profile.d",{a..z}ki,au[a-z]it} + ``` - Se devi escludere un singolo file, utilizza la seguente sintassi: + Se devi escludere un singolo file, utilizza la seguente sintassi: - ```bash - Shell > grep -n -i -r -E "port" /etc/ --exclude=sshd_config - ``` + ```bash + Shell > grep -n -i -r -E "port" /etc/ --exclude=sshd_config + ``` - Se devi escludere più file, utilizza la seguente sintassi: + Se devi escludere più file, utilizza la seguente sintassi: - ```bash - Shell > grep -n -i -r -E "port" /etc/ --exclude={ssh[a-z]_config,*.conf,services} - ``` + ```bash + Shell > grep -n -i -r -E "port" /etc/ --exclude={ssh[a-z]_config,*.conf,services} + ``` - Se devi escludere più file e cartelle in un unico comando, utilizza la seguente sintassi: + Se devi escludere più file e cartelle in un unico comando, utilizza la seguente sintassi: - ```bash - Shell > grep -n -i -r -E "port" /etc/ --exclude-dir={selin[u]x,"profile.d",{a..z}ki,au[a-z]it} --exclude={ssh[a-z]_config,*.conf,services,[0-9][0-9]*} - ``` + ```bash + Shell > grep -n -i -r -E "port" /etc/ --exclude-dir={selin[u]x,"profile.d",{a..z}ki,au[a-z]it} --exclude={ssh[a-z]_config,*.conf,services,[0-9][0-9]*} + ``` 11. Conta tutti gli indirizzi IPv4 di sistema - ```bash - Shell > ip a | grep -o -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | grep -v -E "127|255" - 192.168.100.3 - ``` + ```bash + Shell > ip a | grep -o -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | grep -v -E "127|255" + 192.168.100.3 + ``` diff --git a/docs/books/sed_awk_grep/2_grep_command.uk.md b/docs/books/sed_awk_grep/2_grep_command.uk.md index 2a9dee9943..24c8f74349 100644 --- a/docs/books/sed_awk_grep/2_grep_command.uk.md +++ b/docs/books/sed_awk_grep/2_grep_command.uk.md @@ -74,207 +74,207 @@ directory or file control: 1. опція -f і опція -o - ```bash - Shell > cat /root/a - abcdef - 123456 - 338922549 - 24680 - hello world - - Shell > cat /root/b - 12345 - test - world - aaaaa - - # Treat each line of file b as a matching pattern and output the lines that match file a. - Shell > grep -f /root/b /root/a - 123456 - hello world - - Shell > grep -f /root/b /root/a -o - 12345 - world - ``` + ```bash + Shell > cat /root/a + abcdef + 123456 + 338922549 + 24680 + hello world + + Shell > cat /root/b + 12345 + test + world + aaaaa + + # Treat each line of file b as a matching pattern and output the lines that match file a. + Shell > grep -f /root/b /root/a + 123456 + hello world + + Shell > grep -f /root/b /root/a -o + 12345 + world + ``` 2. Зіставлення кількох шаблонів (за допомогою параметра -e) - ```bash - Shell > echo -e "a\nab\nbc\nbcde" | grep -e 'a' -e 'cd' - a - ab - bcde - ``` + ```bash + Shell > echo -e "a\nab\nbc\nbcde" | grep -e 'a' -e 'cd' + a + ab + bcde + ``` - або: + або: - ```bash - Shell > echo -e "a\nab\nbc\nbcde" | grep -E "a|cd" - a - ab - bcde - ``` + ```bash + Shell > echo -e "a\nab\nbc\nbcde" | grep -E "a|cd" + a + ab + bcde + ``` 3. Видалення порожніх рядків та рядків коментарів із файлу конфігурації - ```bash - Shell > grep -v -E "^$|^#" /etc/chrony.conf - server ntp1.tencent.com iburst - server ntp2.tencent.com iburst - server ntp3.tencent.com iburst - server ntp4.tencent.com iburst - driftfile /var/lib/chrony/drift - makestep 1.0 3 - rtcsync - keyfile /etc/chrony.keys - leapsectz right/UTC - logdir /var/log/chrony - ``` + ```bash + Shell > grep -v -E "^$|^#" /etc/chrony.conf + server ntp1.tencent.com iburst + server ntp2.tencent.com iburst + server ntp3.tencent.com iburst + server ntp4.tencent.com iburst + driftfile /var/lib/chrony/drift + makestep 1.0 3 + rtcsync + keyfile /etc/chrony.keys + leapsectz right/UTC + logdir /var/log/chrony + ``` 4. Друк 5 найкращих результатів, які збігаються - ```bash - Shell > seq 1 20 | grep -m 5 -E "[0-9]{2}" - 10 - 11 - 12 - 13 - 14 - ``` - - або: - - ```bash - Shell > seq 1 20 | grep -m 5 "[0-9]\{2\}" - 10 - 11 - 12 - 13 - 14 - ``` + ```bash + Shell > seq 1 20 | grep -m 5 -E "[0-9]{2}" + 10 + 11 + 12 + 13 + 14 + ``` + + або: + + ```bash + Shell > seq 1 20 | grep -m 5 "[0-9]\{2\}" + 10 + 11 + 12 + 13 + 14 + ``` 5. Опція -B та опція -A - ```bash - Shell > seq 1 20 | grep -B 2 -A 3 -m 5 -E "[0-9]{2}" - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - 16 - 17 - ``` + ```bash + Shell > seq 1 20 | grep -B 2 -A 3 -m 5 -E "[0-9]{2}" + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + ``` 6. Опція -C - ```bash - Shell > seq 1 20 | grep -C 3 -m 5 -E "[0-9]{2}" - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - 16 - 17 - ``` + ```bash + Shell > seq 1 20 | grep -C 3 -m 5 -E "[0-9]{2}" + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + ``` 7. опція -c - ```bash - Shell > cat /etc/ssh/sshd_config | grep -n -i -E "port" - 13:# If you want to change the port on a SELinux system, you have to tell - 15:# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER - 17:#Port 22 - 99:# WARNING: 'UsePAM no' is not supported in RHEL and may cause several - 105:#GatewayPorts no + ```bash + Shell > cat /etc/ssh/sshd_config | grep -n -i -E "port" + 13:# If you want to change the port on a SELinux system, you have to tell + 15:# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER + 17:#Port 22 + 99:# WARNING: 'UsePAM no' is not supported in RHEL and may cause several + 105:#GatewayPorts no - Shell > cat /etc/ssh/sshd_config | grep -E -i "port" -c - 5 - ``` + Shell > cat /etc/ssh/sshd_config | grep -E -i "port" -c + 5 + ``` 8. опція -v - ```bash - Shell > cat /etc/ssh/sshd_config | grep -i -v -E "port" -c - 140 - ``` + ```bash + Shell > cat /etc/ssh/sshd_config | grep -i -v -E "port" -c + 140 + ``` 9. Фільтрувати файли в каталозі, які містять рядки, які відповідають рядку (виключити файли в підкаталогах) - ```bash - Shell > grep -i -E "port" /etc/n*.conf -n - /etc/named.conf:11: listen-on port 53 { 127.0.0.1; }; - /etc/named.conf:12: listen-on-v6 port 53 { ::1; }; - /etc/nsswitch.conf:32:# winbind Use Samba winbind support - /etc/nsswitch.conf:33:# wins Use Samba wins support - ``` + ```bash + Shell > grep -i -E "port" /etc/n*.conf -n + /etc/named.conf:11: listen-on port 53 { 127.0.0.1; }; + /etc/named.conf:12: listen-on-v6 port 53 { ::1; }; + /etc/nsswitch.conf:32:# winbind Use Samba winbind support + /etc/nsswitch.conf:33:# wins Use Samba wins support + ``` 10. Фільтрувати файли в каталозі, які містять рядки, що відповідають рядку (включити або виключити файли або каталоги в підкаталогах) - Включити синтаксис для кількох файлів: + Включити синтаксис для кількох файлів: - ```bash - Shell > grep -n -i -r -E "port" /etc/ --include={0..20}_* - /etc/grub.d/20_ppc_terminfo:26:export TEXTDOMAIN=grub - /etc/grub.d/20_ppc_terminfo:27:export TEXTDOMAINDIR=/usr/share/locale - /etc/grub.d/20_linux_xen:26:export TEXTDOMAIN=grub - /etc/grub.d/20_linux_xen:27:export TEXTDOMAINDIR="${datarootdir}/locale" - /etc/grub.d/20_linux_xen:46:# Default to disabling partition uuid support to maintian compatibility with - /etc/grub.d/10_linux:26:export TEXTDOMAIN=grub - /etc/grub.d/10_linux:27:export TEXTDOMAINDIR="${datarootdir}/locale" - /etc/grub.d/10_linux:47:# Default to disabling partition uuid support to maintian compatibility with + ```bash + Shell > grep -n -i -r -E "port" /etc/ --include={0..20}_* + /etc/grub.d/20_ppc_terminfo:26:export TEXTDOMAIN=grub + /etc/grub.d/20_ppc_terminfo:27:export TEXTDOMAINDIR=/usr/share/locale + /etc/grub.d/20_linux_xen:26:export TEXTDOMAIN=grub + /etc/grub.d/20_linux_xen:27:export TEXTDOMAINDIR="${datarootdir}/locale" + /etc/grub.d/20_linux_xen:46:# Default to disabling partition uuid support to maintian compatibility with + /etc/grub.d/10_linux:26:export TEXTDOMAIN=grub + /etc/grub.d/10_linux:27:export TEXTDOMAINDIR="${datarootdir}/locale" + /etc/grub.d/10_linux:47:# Default to disabling partition uuid support to maintian compatibility with - Shell > grep -n -i -r -E "port" /etc/ --include={{0..20}_*,sshd_config} -c - /etc/ssh/sshd_config:5 - /etc/grub.d/20_ppc_terminfo:2 - /etc/grub.d/10_reset_boot_success:0 - /etc/grub.d/12_menu_auto_hide:0 - /etc/grub.d/20_linux_xen:3 - /etc/grub.d/10_linux:3 - ``` + Shell > grep -n -i -r -E "port" /etc/ --include={{0..20}_*,sshd_config} -c + /etc/ssh/sshd_config:5 + /etc/grub.d/20_ppc_terminfo:2 + /etc/grub.d/10_reset_boot_success:0 + /etc/grub.d/12_menu_auto_hide:0 + /etc/grub.d/20_linux_xen:3 + /etc/grub.d/10_linux:3 + ``` - Якщо вам потрібно виключити один каталог, використовуйте такий синтаксис: + Якщо вам потрібно виключити один каталог, використовуйте такий синтаксис: - ```bash - Shell > grep -n -i -r -E "port" /etc/ --exclude-dir=selin[u]x - ``` + ```bash + Shell > grep -n -i -r -E "port" /etc/ --exclude-dir=selin[u]x + ``` - Якщо вам потрібно виключити кілька каталогів, використовуйте такий синтаксис: + Якщо вам потрібно виключити кілька каталогів, використовуйте такий синтаксис: - ```bash - Shell > grep -n -i -r -E "port" /etc/ --exclude-dir={selin[u]x,"profile.d",{a..z}ki,au[a-z]it} - ``` + ```bash + Shell > grep -n -i -r -E "port" /etc/ --exclude-dir={selin[u]x,"profile.d",{a..z}ki,au[a-z]it} + ``` - Якщо вам потрібно виключити один файл, використовуйте такий синтаксис: + Якщо вам потрібно виключити один файл, використовуйте такий синтаксис: - ```bash - Shell > grep -n -i -r -E "port" /etc/ --exclude=sshd_config - ``` + ```bash + Shell > grep -n -i -r -E "port" /etc/ --exclude=sshd_config + ``` - Якщо вам потрібно виключити кілька файлів, використовуйте такий синтаксис: + Якщо вам потрібно виключити кілька файлів, використовуйте такий синтаксис: - ```bash - Shell > grep -n -i -r -E "port" /etc/ --exclude={ssh[a-z]_config,*.conf,services} - ``` + ```bash + Shell > grep -n -i -r -E "port" /etc/ --exclude={ssh[a-z]_config,*.conf,services} + ``` - Якщо вам потрібно виключити кілька файлів і каталогів одночасно, використовуйте такий синтаксис: + Якщо вам потрібно виключити кілька файлів і каталогів одночасно, використовуйте такий синтаксис: - ```bash - Shell > grep -n -i -r -E "port" /etc/ --exclude-dir={selin[u]x,"profile.d",{a..z}ki,au[a-z]it} --exclude={ssh[a-z]_config,*.conf,services,[0-9][0-9]*} - ``` + ```bash + Shell > grep -n -i -r -E "port" /etc/ --exclude-dir={selin[u]x,"profile.d",{a..z}ki,au[a-z]it} --exclude={ssh[a-z]_config,*.conf,services,[0-9][0-9]*} + ``` 11. Підрахувати всі IPv4-адреси поточної машини - ```bash - Shell > ip a | grep -o -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | grep -v -E "127|255" - 192.168.100.3 - ``` + ```bash + Shell > ip a | grep -o -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | grep -v -E "127|255" + 192.168.100.3 + ``` diff --git a/docs/books/sed_awk_grep/3_sed_command.it.md b/docs/books/sed_awk_grep/3_sed_command.it.md index 4b6fc6b838..fefe5fa10c 100644 --- a/docs/books/sed_awk_grep/3_sed_command.it.md +++ b/docs/books/sed_awk_grep/3_sed_command.it.md @@ -68,769 +68,769 @@ sed [OPTION]... {script-only-if-no-other-script} [input-file]... 1. Associa e visualizza (`p`) - - Visualizza le righe che iniziano con la stringa netbios + - Visualizza le righe che iniziano con la stringa netbios - ```bash - Shell > cat /etc/services | sed -n '/^netbios/p' - netbios-ns 137/tcp # NETBIOS Name Service - netbios-ns 137/udp - netbios-dgm 138/tcp # NETBIOS Datagram Service - netbios-dgm 138/udp - netbios-ssn 139/tcp # NETBIOS session service - netbios-ssn 139/udp - ``` + ```bash + Shell > cat /etc/services | sed -n '/^netbios/p' + netbios-ns 137/tcp # NETBIOS Name Service + netbios-ns 137/udp + netbios-dgm 138/tcp # NETBIOS Datagram Service + netbios-dgm 138/udp + netbios-ssn 139/tcp # NETBIOS session service + netbios-ssn 139/udp + ``` - !!! tip "Suggerimento" + !!! tip "Suggerimento" - ``` - Come sappiamo bene, le virgolette doppie e singole in una shell ricoprono ruoli differenti. I caratteri **$**, **\`** e **\\** tra virgolette doppie hanno un significato speciale. Il consiglio è utilizzare le virgolette singole più spesso con il comando `sed`. - ``` + ``` + Come sappiamo bene, le virgolette doppie e singole in una shell ricoprono ruoli differenti. I caratteri **$**, **\`** e **\\** tra virgolette doppie hanno un significato speciale. Il consiglio è utilizzare le virgolette singole più spesso con il comando `sed`. + ``` - - Visualizza il testo da riga 23 a riga 26 + - Visualizza il testo da riga 23 a riga 26 + + ```bash + Shell > cat -n /etc/services | sed -n '23,26p' + 23 tcpmux 1/tcp # TCP port service multiplexer + 24 tcpmux 1/udp # TCP port service multiplexer + 25 rje 5/tcp # Remote Job Entry + 26 rje 5/udp # Remote Job Entry + ``` + + - Visualizza solo le righe dispari + + ```bash + Shell > cat -n /etc/services | sed -n '1~2p' + 1 # /etc/services: + 3 # + 5 # IANA services version: last updated 2016-07-08 + 7 # Note that it is presently the policy of IANA to assign a single well-known + 9 # even if the protocol doesn't support UDP operations. + 11 # are included, only the more common ones. + 13 # The latest IANA port assignments can be gotten from + 15 # The Well Known Ports are those from 0 through 1023. + 17 # The Dynamic and/or Private Ports are those from 49152 through 65535 + 19 # Each line describes one service, and is of the form: + ... + ``` + + - Visualizza dalla riga 10 fino all'ultima riga + + ```bash + Shell > cat -n /etc/services | sed -n '10,$p' + 10 # Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports + 11 # are included, only the more common ones. + 12 # + 13 # The latest IANA port assignments can be gotten from + 14 # http://www.iana.org/assignments/port-numbers + 15 # The Well Known Ports are those from 0 through 1023. + 16 # The Registered Ports are those from 1024 through 49151 + 17 # The Dynamic and/or Private Ports are those from 49152 through 65535 + ... + ``` + + - Non visualizzare dalla riga 10 in poi + + ```bash + Shell > cat -n /etc/services | sed -n '10,$!p' + 1 # /etc/services: + 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ + 3 # + 4 # Network services, Internet style + 5 # IANA services version: last updated 2016-07-08 + 6 # + 7 # Note that it is presently the policy of IANA to assign a single well-known + 8 # port number for both TCP and UDP; hence, most entries here have two entries + 9 # even if the protocol doesn't support UDP operations. + ``` + + - Visualizza il numero di riga e il contenuto della stringa corrispondente + + ```bash + Shell > sed -n -e '/netbios/=' -e '/netbios/p' /etc/services + 123 + netbios-ns 137/tcp # NETBIOS Name Service + 124 + netbios-ns 137/udp + 125 + netbios-dgm 138/tcp # NETBIOS Datagram Service + 126 + netbios-dgm 138/udp + 127 + netbios-ssn 139/tcp # NETBIOS session service + 128 + netbios-ssn 139/udp + ``` + + - Trova le corrispondenze nell'elenco delle stringhe e lo visualizza + + Utilizzare la virgola per separare l'elenco delle stringhe di ricerca + + ```bash + Shell > cat /etc/services | sed -n '/^netbios/,/^imap/p' + netbios-ns 137/tcp # NETBIOS Name Service + netbios-ns 137/udp + netbios-dgm 138/tcp # NETBIOS Datagram Service + netbios-dgm 138/udp + netbios-ssn 139/tcp # NETBIOS session service + netbios-ssn 139/udp + imap 143/tcp imap2 # Interim Mail Access Proto v2 + ``` + + !!! info "Informazione" - ```bash - Shell > cat -n /etc/services | sed -n '23,26p' - 23 tcpmux 1/tcp # TCP port service multiplexer - 24 tcpmux 1/udp # TCP port service multiplexer - 25 rje 5/tcp # Remote Job Entry - 26 rje 5/udp # Remote Job Entry - ``` - - - Visualizza solo le righe dispari + ``` + **Stringa iniziale**: Abbina la riga in cui si trova la stringa, mostrando solo la prima stringa che compare. + **Stringa finale**: Abbina la riga in cui si trova la stringa, mostrando solo la prima stringa che compare. + ``` - ```bash - Shell > cat -n /etc/services | sed -n '1~2p' - 1 # /etc/services: - 3 # - 5 # IANA services version: last updated 2016-07-08 - 7 # Note that it is presently the policy of IANA to assign a single well-known - 9 # even if the protocol doesn't support UDP operations. - 11 # are included, only the more common ones. - 13 # The latest IANA port assignments can be gotten from - 15 # The Well Known Ports are those from 0 through 1023. - 17 # The Dynamic and/or Private Ports are those from 49152 through 65535 - 19 # Each line describes one service, and is of the form: - ... - ``` + ```bash + Shell > grep -n ^netbios /etc/services + 123:netbios-ns 137/tcp # NETBIOS Name Service + 124:netbios-ns 137/udp + 125:netbios-dgm 138/tcp # NETBIOS Datagram Service + 126:netbios-dgm 138/udp + 127:netbios-ssn 139/tcp # NETBIOS session service + 128:netbios-ssn 139/udp + + Shell > grep -n ^imap /etc/services + 129:imap 143/tcp imap2 # Interim Mail Access Proto v2 + 130:imap 143/udp imap2 + 168:imap3 220/tcp # Interactive Mail Access + 169:imap3 220/udp # Protocol v3 + 260:imaps 993/tcp # IMAP over SSL + 261:imaps 993/udp # IMAP over SSL + ``` - - Visualizza dalla riga 10 fino all'ultima riga + In altre parole, i contenuti sopra visualizzati sono le righe dalla 123 alla 129 - ```bash - Shell > cat -n /etc/services | sed -n '10,$p' - 10 # Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports - 11 # are included, only the more common ones. - 12 # - 13 # The latest IANA port assignments can be gotten from - 14 # http://www.iana.org/assignments/port-numbers - 15 # The Well Known Ports are those from 0 through 1023. - 16 # The Registered Ports are those from 1024 through 49151 - 17 # The Dynamic and/or Private Ports are those from 49152 through 65535 - ... - ``` + - Visualizza dalla riga in cui si trova la stringa fino all'ultima riga - - Non visualizzare dalla riga 10 in poi + ```bash + Shell > cat /etc/services | sed -n '/^netbios/,$p' + ``` - ```bash - Shell > cat -n /etc/services | sed -n '10,$!p' - 1 # /etc/services: - 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ - 3 # - 4 # Network services, Internet style - 5 # IANA services version: last updated 2016-07-08 - 6 # - 7 # Note that it is presently the policy of IANA to assign a single well-known - 8 # port number for both TCP and UDP; hence, most entries here have two entries - 9 # even if the protocol doesn't support UDP operations. - ``` + - Usare le variabili negli script bash - - Visualizza il numero di riga e il contenuto della stringa corrispondente + ```bash + Shell > vim test1.sh + #!/bin/bash + a=10 - ```bash - Shell > sed -n -e '/netbios/=' -e '/netbios/p' /etc/services - 123 - netbios-ns 137/tcp # NETBIOS Name Service - 124 - netbios-ns 137/udp - 125 - netbios-dgm 138/tcp # NETBIOS Datagram Service - 126 - netbios-dgm 138/udp - 127 - netbios-ssn 139/tcp # NETBIOS session service - 128 - netbios-ssn 139/udp - ``` + sed -n ''${a}',$!p' /etc/services + # or + sed -n "${a},\$!p" /etc/services + ``` - - Trova le corrispondenze nell'elenco delle stringhe e lo visualizza + - Espressione regolare - Utilizzare la virgola per separare l'elenco delle stringhe di ricerca + Abbina soltanto Tre "Digits" + "/udp". - ```bash - Shell > cat /etc/services | sed -n '/^netbios/,/^imap/p' - netbios-ns 137/tcp # NETBIOS Name Service - netbios-ns 137/udp - netbios-dgm 138/tcp # NETBIOS Datagram Service - netbios-dgm 138/udp - netbios-ssn 139/tcp # NETBIOS session service - netbios-ssn 139/udp - imap 143/tcp imap2 # Interim Mail Access Proto v2 - ``` + ```bash + Shell > cat /etc/services | sed -r -n '/[^0-9]([1-9]{3}\/udp)/p' + sunrpc 111/udp portmapper rpcbind # RPC 4.0 portmapper UDP + auth 113/udp authentication tap ident + sftp 115/udp + uucp-path 117/udp + nntp 119/udp readnews untp # USENET News Transfer Protocol + ntp 123/udp # Network Time Protocol + netbios-ns 137/udp + netbios-dgm 138/udp + netbios-ssn 139/udp + ... + ``` - !!! info "Informazione" - - ``` - **Stringa iniziale**: Abbina la riga in cui si trova la stringa, mostrando solo la prima stringa che compare. - **Stringa finale**: Abbina la riga in cui si trova la stringa, mostrando solo la prima stringa che compare. - ``` - - ```bash - Shell > grep -n ^netbios /etc/services - 123:netbios-ns 137/tcp # NETBIOS Name Service - 124:netbios-ns 137/udp - 125:netbios-dgm 138/tcp # NETBIOS Datagram Service - 126:netbios-dgm 138/udp - 127:netbios-ssn 139/tcp # NETBIOS session service - 128:netbios-ssn 139/udp +2. Associa ed elimina (`d`) - Shell > grep -n ^imap /etc/services - 129:imap 143/tcp imap2 # Interim Mail Access Proto v2 - 130:imap 143/udp imap2 - 168:imap3 220/tcp # Interactive Mail Access - 169:imap3 220/udp # Protocol v3 - 260:imaps 993/tcp # IMAP over SSL - 261:imaps 993/udp # IMAP over SSL - ``` + È simile alla stampa, tranne per il fatto che il comando operation è sostituito da `d` e l'opzione -n non è richiesta. + + - Elimina tutte le righe corrispondenti alla stringa udp, ed elimina tutte le righe di commento o vuote + + ```bash + Shell > sed -e '/udp/d' -e '/^#/d' -e '/^$/d' /etc/services + tcpmux 1/tcp # TCP port service multiplexer + rje 5/tcp # Remote Job Entry + echo 7/tcp + discard 9/tcp sink null + systat 11/tcp users + daytime 13/tcp + qotd 17/tcp quote + chargen 19/tcp ttytst source + ftp-data 20/tcp + ftp 21/tcp + ssh 22/tcp # The Secure Shell (SSH) Protocol + telnet 23/tcp + ... + ``` + + - Elimina le righe successive a quella specificata + + ```bash + Shell > cat -n /etc/services | sed '10,$d' + 1 # /etc/services: + 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ + 3 # + 4 # Servizi di rete, stile di Internet + 5 # Versione dei servizi di IANA: ultimo aggiornamento 2016-07-08 + 6 # + 7 # Nota che al momento la politica di IANA assegna un singolo ben noto + 8 # numero di porta sia per TCP che UDP; dunque, la maggior parte delle voci, qui, contiene due elementi + 9 # anche se il protocollo non supporta le operazioni UDP. + ``` + + - Espressione regolare + + ```bash + Shell > cat /etc/services | sed -r '/(tcp)|(udp)|(^#)|(^$)/d' + http 80/sctp # HyperText Transfer Protocol + bgp 179/sctp + https 443/sctp # http protocol over TLS/SSL + h323hostcall 1720/sctp # H.323 Call Control + nfs 2049/sctp nfsd shilp # Network File System + rtmp 1/ddp # Routing Table Maintenance Protocol + nbp 2/ddp # Name Binding Protocol + echo 4/ddp # AppleTalk Echo Protocol + zip 6/ddp # Zone Information Protocol + discard 9/sctp # Discard + discard 9/dccp # Discard SC:DISC + ... + ``` - In altre parole, i contenuti sopra visualizzati sono le righe dalla 123 alla 129 +3. Sostituire stringhe (`s///g`) - - Visualizza dalla riga in cui si trova la stringa fino all'ultima riga + | Sintassi | Descrizione della sintassi | + | :---------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | `sed 's/string/replace/g' FILENAME` | **s**: Tutte le righe da considerare nel file. Si può anche specificare un intervallo di righe, ad esempio: `sed '20,200s/netbios/TMP/g' /etc/services. **g** (globale): Se non c'è g, significa che quando più stringhe corrispondenti appaiono su una singola riga, viene sostituita solo la prima stringa corrispondente. **/**: Stile delimitatore. Si possono anche specificare altri stili, ad esempio:`sed '20,200s?netbios?TMP?g' /etc/services\` | - ```bash - Shell > cat /etc/services | sed -n '/^netbios/,$p' - ``` + !!! tip "Suggerimento" - - Usare le variabili negli script bash + ```` + Esempio nello script bash: ```bash - Shell > vim test1.sh + Shell > vim /root/sedReplace.sh #!/bin/bash - a=10 + a="SELINUX=enforcing" + b="SELINUX=disabled" - sed -n ''${a}',$!p' /etc/services + sed -i 's/'${a}'/'${b}'/g' /etc/selinux/config # or - sed -n "${a},\$!p" /etc/services - ``` - - - Espressione regolare - - Abbina soltanto Tre "Digits" + "/udp". - - ```bash - Shell > cat /etc/services | sed -r -n '/[^0-9]([1-9]{3}\/udp)/p' - sunrpc 111/udp portmapper rpcbind # RPC 4.0 portmapper UDP - auth 113/udp authentication tap ident - sftp 115/udp - uucp-path 117/udp - nntp 119/udp readnews untp # USENET News Transfer Protocol - ntp 123/udp # Network Time Protocol - netbios-ns 137/udp - netbios-dgm 138/udp - netbios-ssn 139/udp - ... - ``` - -2. Associa ed elimina (`d`) - - È simile alla stampa, tranne per il fatto che il comando operation è sostituito da `d` e l'opzione -n non è richiesta. - - - Elimina tutte le righe corrispondenti alla stringa udp, ed elimina tutte le righe di commento o vuote - - ```bash - Shell > sed -e '/udp/d' -e '/^#/d' -e '/^$/d' /etc/services - tcpmux 1/tcp # TCP port service multiplexer - rje 5/tcp # Remote Job Entry - echo 7/tcp - discard 9/tcp sink null - systat 11/tcp users - daytime 13/tcp - qotd 17/tcp quote - chargen 19/tcp ttytst source - ftp-data 20/tcp - ftp 21/tcp - ssh 22/tcp # The Secure Shell (SSH) Protocol - telnet 23/tcp - ... - ``` - - - Elimina le righe successive a quella specificata + sed -i "s/${a}/${b}/g" /etc/selinux/config + ``` + ```` + + - Sostituisci e visualizza + + ```bash + Shell > sed -n '44,45s/ssh/SSH/gp' /etc/services + SSH 22/tcp + SSH 22/udp + ``` + + - Si utilizza il simbolo "&" come riferimento a una stringa + + ```bash + Shell > sed -n '44,45s/ssh/&-SSH/gp' /etc/services + ssh-SSH 22/tcp + ssh-SSH 22/udp + ``` + + - Utilizza una stringa per individuare una o più righe e sostituire la stringa specificata entro l'intervallo di righe + + ```bash + Shell > grep ssh /etc/services -n + 44:ssh 22/tcp # The Secure Shell (SSH) Protocol + 45:ssh 22/udp # The Secure Shell (SSH) Protocol + 551:x11-ssh-offset 6010/tcp # SSH X11 forwarding offset + 593:ssh 22/sctp # SSH + 1351:sshell 614/tcp # SSLshell + 1352:sshell 614/udp # SSLshell + 1607:netconf-ssh 830/tcp # NETCONF over SSH + 1608:netconf-ssh 830/udp # NETCONF over SSH + 7178:sdo-ssh 3897/tcp # Simple Distributed Objects over SSH + 7179:sdo-ssh 3897/udp # Simple Distributed Objects over SSH + 7791:netconf-ch-ssh 4334/tcp # NETCONF Call Home (SSH) + 8473:snmpssh 5161/tcp # SNMP over SSH Transport Model + 8474:snmpssh-trap 5162/tcp # SNMP Notification over SSH Transport Model + 9126:tl1-ssh 6252/tcp # TL1 over SSH + 9127:tl1-ssh 6252/udp # TL1 over SSH + 10796:ssh-mgmt 17235/tcp # SSH Tectia Manager + 10797:ssh-mgmt 17235/udp # SSH Tectia Manager + + Shell > sed '/ssh/s/tcp/TCP/gp' -n /etc/services + ssh 22/TCP # The Secure Shell (SSH) Protocol + x11-ssh-offset 6010/TCP # SSH X11 forwarding offset + sshell 614/TCP # SSLshell + netconf-ssh 830/TCP # NETCONF over SSH + sdo-ssh 3897/TCP # Simple Distributed Objects over SSH + netconf-ch-ssh 4334/TCP # NETCONF Call Home (SSH) + snmpssh 5161/TCP # SNMP over SSH Transport Model + snmpssh-trap 5162/TCP # SNMP Notification over SSH Transport Model + tl1-ssh 6252/TCP # TL1 over SSH + ssh-mgmt 17235/TCP # SSH Tectia Manager + ``` + + - Sostituire una stringa per righe consecutive + + ```bash + Shell > sed '10,30s/tcp/TCP/g' /etc/services + ``` + + - Impostare più match e sostituzioni + + ```bash + Shell > cat /etc/services | sed 's/netbios/test1/g ; s/^#//d ; s/dhcp/&t2/g' + ``` + + - Sostituzione di gruppo con espressioni regolari + + Nelle espressioni regolari, ogni "()" è un raggruppamento. \1 rappresenta il riferimento al gruppo 1, \2 rappresenta il riferimento al gruppo 2, e così via. + + ```bash + Shell > cat /etc/services + ... + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + + Shell > cat /etc/services | sed -r 's/([0-9]*\/tcp)/\1\tCONTENT1/g ; s/([0-9]*\/udp)/\1\tADD2/g' + ... + axio-disc 35100/tcp CONTENT1 # Axiomatic discovery protocol + axio-disc 35100/udp ADD2 # Axiomatic discovery protocol + pmwebapi 44323/tcp CONTENT1 # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp ADD2 # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp CONTENT1 # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp CONTENT1 # Capture handwritten signatures + ``` + + **\t**: è il carattere di tabulazione + + - Sostituisce tutte le righe di commento con il carattere blank space + + ```bash + Shell > cat /etc/services | sed -r 's/(^#.*)//g' + ... + chargen 19/udp ttytst source + ftp-data 20/tcp + ftp-data 20/udp + + ftp 21/tcp + ftp 21/udp fsp fspd + ssh 22/tcp # The Secure Shell (SSH) Protocol + ssh 22/udp # The Secure Shell (SSH) Protocol + ... + ``` + + - Sostituire un carattere alfabetico in minuscolo in maiuscolo + + ```bash + Shell > echo -e "hello,world\nPOSIX" | sed -r 's/(.*)w/\1W/g' + hello,World + POSIX + ``` + + - Scambiare di posizione le stringhe + + ```bash + Shell > cat /etc/services + ... + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + Possiamo strutturare le righe del file in cinque parti: + + ```txt + cloudcheck-ping 45514 / udp # ASSIA CloudCheck WiFi Management keepalive + ↓ ↓ ↓ ↓ ↓ + (.*) (\<[0-9]+\>) \/ (tcp|udp) (.*) + ↓ ↓ ↓ ↓ + \1 \2 \3 \4 + ``` + + ```bash + Shell > cat /etc/services | sed -r 's/(.*)(\<[0-9]+\>)\/(tcp|udp)(.*)/\1\3\/\2\4/g' + ... + edi_service udp/34567 # dhanalakshmi.org EDI Service + axio-disc tcp/35100 # Axiomatic discovery protocol + axio-disc udp/35100 # Axiomatic discovery protocol + pmwebapi tcp/44323 # Performance Co-Pilot client HTTP API + cloudcheck-ping udp/45514 # ASSIA CloudCheck WiFi Management keepalive + cloudcheck tcp/45514 # ASSIA CloudCheck WiFi Management System + spremotetablet tcp/46998 # Capture handwritten signatures + ``` + + - Rimuovere tutti i spazi + + ```bash + Shell > echo -e "abcd\t1 2 3 4\tWorld" + abcd 1 2 3 4 World + Shell > echo -e "abcd\t1 2 3 4\tWorld" | sed -r 's/(\s)*//g' + abcd1234World + ``` - ```bash - Shell > cat -n /etc/services | sed '10,$d' - 1 # /etc/services: - 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ - 3 # - 4 # Servizi di rete, stile di Internet - 5 # Versione dei servizi di IANA: ultimo aggiornamento 2016-07-08 - 6 # - 7 # Nota che al momento la politica di IANA assegna un singolo ben noto - 8 # numero di porta sia per TCP che UDP; dunque, la maggior parte delle voci, qui, contiene due elementi - 9 # anche se il protocollo non supporta le operazioni UDP. - ``` - - - Espressione regolare - - ```bash - Shell > cat /etc/services | sed -r '/(tcp)|(udp)|(^#)|(^$)/d' - http 80/sctp # HyperText Transfer Protocol - bgp 179/sctp - https 443/sctp # http protocol over TLS/SSL - h323hostcall 1720/sctp # H.323 Call Control - nfs 2049/sctp nfsd shilp # Network File System - rtmp 1/ddp # Routing Table Maintenance Protocol - nbp 2/ddp # Name Binding Protocol - echo 4/ddp # AppleTalk Echo Protocol - zip 6/ddp # Zone Information Protocol - discard 9/sctp # Discard - discard 9/dccp # Discard SC:DISC - ... - ``` - -3. Sostituire stringhe (`s///g`) - - | Sintassi | Descrizione della sintassi | - | :---------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | `sed 's/string/replace/g' FILENAME` | **s**: Tutte le righe da considerare nel file. Si può anche specificare un intervallo di righe, ad esempio: `sed '20,200s/netbios/TMP/g' /etc/services. **g** (globale): Se non c'è g, significa che quando più stringhe corrispondenti appaiono su una singola riga, viene sostituita solo la prima stringa corrispondente. **/**: Stile delimitatore. Si possono anche specificare altri stili, ad esempio:`sed '20,200s?netbios?TMP?g' /etc/services\` | - - !!! tip "Suggerimento" +4. Eseguire più volte seq utilizzando l'opzione -e - ```` - Esempio nello script bash: + Nell'esempio seguente: ```bash - Shell > vim /root/sedReplace.sh - #!/bin/bash - a="SELINUX=enforcing" - b="SELINUX=disabled" - - sed -i 's/'${a}'/'${b}'/g' /etc/selinux/config + Shell > tail -n 10 /etc/services + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + + Shell > tail -n 10 /etc/services | sed -e '1,3d' -e '/cloud/s/ping/PING/g' # or - sed -i "s/${a}/${b}/g" /etc/selinux/config + Shell > tail -n 10 /etc/services | sed '1,3d ; /cloud/s/ping/PING/g' + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-PING 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures ``` - ```` - - - Sostituisci e visualizza - - ```bash - Shell > sed -n '44,45s/ssh/SSH/gp' /etc/services - SSH 22/tcp - SSH 22/udp - ``` - - - Si utilizza il simbolo "&" come riferimento a una stringa - - ```bash - Shell > sed -n '44,45s/ssh/&-SSH/gp' /etc/services - ssh-SSH 22/tcp - ssh-SSH 22/udp - ``` - - - Utilizza una stringa per individuare una o più righe e sostituire la stringa specificata entro l'intervallo di righe - - ```bash - Shell > grep ssh /etc/services -n - 44:ssh 22/tcp # The Secure Shell (SSH) Protocol - 45:ssh 22/udp # The Secure Shell (SSH) Protocol - 551:x11-ssh-offset 6010/tcp # SSH X11 forwarding offset - 593:ssh 22/sctp # SSH - 1351:sshell 614/tcp # SSLshell - 1352:sshell 614/udp # SSLshell - 1607:netconf-ssh 830/tcp # NETCONF over SSH - 1608:netconf-ssh 830/udp # NETCONF over SSH - 7178:sdo-ssh 3897/tcp # Simple Distributed Objects over SSH - 7179:sdo-ssh 3897/udp # Simple Distributed Objects over SSH - 7791:netconf-ch-ssh 4334/tcp # NETCONF Call Home (SSH) - 8473:snmpssh 5161/tcp # SNMP over SSH Transport Model - 8474:snmpssh-trap 5162/tcp # SNMP Notification over SSH Transport Model - 9126:tl1-ssh 6252/tcp # TL1 over SSH - 9127:tl1-ssh 6252/udp # TL1 over SSH - 10796:ssh-mgmt 17235/tcp # SSH Tectia Manager - 10797:ssh-mgmt 17235/udp # SSH Tectia Manager - - Shell > sed '/ssh/s/tcp/TCP/gp' -n /etc/services - ssh 22/TCP # The Secure Shell (SSH) Protocol - x11-ssh-offset 6010/TCP # SSH X11 forwarding offset - sshell 614/TCP # SSLshell - netconf-ssh 830/TCP # NETCONF over SSH - sdo-ssh 3897/TCP # Simple Distributed Objects over SSH - netconf-ch-ssh 4334/TCP # NETCONF Call Home (SSH) - snmpssh 5161/TCP # SNMP over SSH Transport Model - snmpssh-trap 5162/TCP # SNMP Notification over SSH Transport Model - tl1-ssh 6252/TCP # TL1 over SSH - ssh-mgmt 17235/TCP # SSH Tectia Manager - ``` - - - Sostituire una stringa per righe consecutive - - ```bash - Shell > sed '10,30s/tcp/TCP/g' /etc/services - ``` - - - Impostare più match e sostituzioni - - ```bash - Shell > cat /etc/services | sed 's/netbios/test1/g ; s/^#//d ; s/dhcp/&t2/g' - ``` - - - Sostituzione di gruppo con espressioni regolari - - Nelle espressioni regolari, ogni "()" è un raggruppamento. \1 rappresenta il riferimento al gruppo 1, \2 rappresenta il riferimento al gruppo 2, e così via. - - ```bash - Shell > cat /etc/services - ... - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > cat /etc/services | sed -r 's/([0-9]*\/tcp)/\1\tCONTENT1/g ; s/([0-9]*\/udp)/\1\tADD2/g' - ... - axio-disc 35100/tcp CONTENT1 # Axiomatic discovery protocol - axio-disc 35100/udp ADD2 # Axiomatic discovery protocol - pmwebapi 44323/tcp CONTENT1 # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp ADD2 # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp CONTENT1 # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp CONTENT1 # Capture handwritten signatures - ``` - - **\t**: è il carattere di tabulazione - - - Sostituisce tutte le righe di commento con il carattere blank space - - ```bash - Shell > cat /etc/services | sed -r 's/(^#.*)//g' - ... - chargen 19/udp ttytst source - ftp-data 20/tcp - ftp-data 20/udp - - ftp 21/tcp - ftp 21/udp fsp fspd - ssh 22/tcp # The Secure Shell (SSH) Protocol - ssh 22/udp # The Secure Shell (SSH) Protocol - ... - ``` - - - Sostituire un carattere alfabetico in minuscolo in maiuscolo - - ```bash - Shell > echo -e "hello,world\nPOSIX" | sed -r 's/(.*)w/\1W/g' - hello,World - POSIX - ``` - - - Scambiare di posizione le stringhe - - ```bash - Shell > cat /etc/services - ... - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` - - Possiamo strutturare le righe del file in cinque parti: - - ```txt - cloudcheck-ping 45514 / udp # ASSIA CloudCheck WiFi Management keepalive - ↓ ↓ ↓ ↓ ↓ - (.*) (\<[0-9]+\>) \/ (tcp|udp) (.*) - ↓ ↓ ↓ ↓ - \1 \2 \3 \4 - ``` - - ```bash - Shell > cat /etc/services | sed -r 's/(.*)(\<[0-9]+\>)\/(tcp|udp)(.*)/\1\3\/\2\4/g' - ... - edi_service udp/34567 # dhanalakshmi.org EDI Service - axio-disc tcp/35100 # Axiomatic discovery protocol - axio-disc udp/35100 # Axiomatic discovery protocol - pmwebapi tcp/44323 # Performance Co-Pilot client HTTP API - cloudcheck-ping udp/45514 # ASSIA CloudCheck WiFi Management keepalive - cloudcheck tcp/45514 # ASSIA CloudCheck WiFi Management System - spremotetablet tcp/46998 # Capture handwritten signatures - ``` - - - Rimuovere tutti i spazi - - ```bash - Shell > echo -e "abcd\t1 2 3 4\tWorld" - abcd 1 2 3 4 World - Shell > echo -e "abcd\t1 2 3 4\tWorld" | sed -r 's/(\s)*//g' - abcd1234World - ``` - -4. Eseguire più volte seq utilizzando l'opzione -e - - Nell'esempio seguente: - - ```bash - Shell > tail -n 10 /etc/services - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > tail -n 10 /etc/services | sed -e '1,3d' -e '/cloud/s/ping/PING/g' - # or - Shell > tail -n 10 /etc/services | sed '1,3d ; /cloud/s/ping/PING/g' - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-PING 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` 5. Aggiungere contenuti sopra o sotto una certa riga (`i` e `a`) - - Aggiungi due righe sopra la riga specificata dal numero di riga - - ```bash - Shell > tail -n 10 /etc/services > /root/test.txt - Shell > cat /root/test.txt - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > cat /root/test.txt | sed '3i 123\ - abc' - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - 123 - abc - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` + - Aggiungi due righe sopra la riga specificata dal numero di riga + + ```bash + Shell > tail -n 10 /etc/services > /root/test.txt + Shell > cat /root/test.txt + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + + Shell > cat /root/test.txt | sed '3i 123\ + abc' + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + 123 + abc + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + - Aggiungere tre righe sotto la riga specificata dal numero - - Aggiungere tre righe sotto la riga specificata dal numero - - ```bash - Shell > cat /root/test.txt | sed '5a 123\ - comment yes\ - tcp or udp' - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - 123 - comment yes - tcp or udp - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` - - - Trovare le righe che contengono una stringa e aggiungere 2 righe di testo sopra ognuna + ```bash + Shell > cat /root/test.txt | sed '5a 123\ + comment yes\ + tcp or udp' + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + 123 + comment yes + tcp or udp + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` - ```bash - Shell > cat /root/test.txt | sed '/tcp/iTCP\ - UDP' - TCP - UDP - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - TCP - UDP - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - TCP - UDP - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - TCP - UDP - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - TCP - UDP - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - TCP - UDP - spremotetablet 46998/tcp # Capture handwritten signatures - ``` + - Trovare le righe che contengono una stringa e aggiungere 2 righe di testo sopra ognuna + + ```bash + Shell > cat /root/test.txt | sed '/tcp/iTCP\ + UDP' + TCP + UDP + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + TCP + UDP + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + TCP + UDP + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + TCP + UDP + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + TCP + UDP + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + TCP + UDP + spremotetablet 46998/tcp # Capture handwritten signatures + ``` 6. Sostituire righe (\`c) - - Individua una o più righe contenenti una stringa e sostituire con righe di testo - - ```bash - Shell > cat /root/test.txt | sed '/ser/c\TMP1 \ - TMP2' - TMP1 - TMP2 - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - TMP1 - TMP2 - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` - - - Sostituire una singola riga - - ```bash - Shell > cat /root/test.txt | sed '7c REPLACE' - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - REPLACE - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` - - - Sostituire righe consecutive di testo - - ```bash - Shell > cat /root/test.txt | sed '2,$c REPLACE1 \ - replace2' - aigairserver 21221/tcp # Services for Air Server - REPLACE1 - replace2 - ``` - - - Sostituire tutte le righe di posizione pari - - ```bash - Shell > cat /root/test.txt | sed '2~2c replace' - aigairserver 21221/tcp # Services for Air Server - replace - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - replace - axio-disc 35100/tcp # Axiomatic discovery protocol - replace - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - replace - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - replace - ``` + - Individua una o più righe contenenti una stringa e sostituire con righe di testo + + ```bash + Shell > cat /root/test.txt | sed '/ser/c\TMP1 \ + TMP2' + TMP1 + TMP2 + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + TMP1 + TMP2 + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + - Sostituire una singola riga + + ```bash + Shell > cat /root/test.txt | sed '7c REPLACE' + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + REPLACE + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + - Sostituire righe consecutive di testo + + ```bash + Shell > cat /root/test.txt | sed '2,$c REPLACE1 \ + replace2' + aigairserver 21221/tcp # Services for Air Server + REPLACE1 + replace2 + ``` + + - Sostituire tutte le righe di posizione pari + + ```bash + Shell > cat /root/test.txt | sed '2~2c replace' + aigairserver 21221/tcp # Services for Air Server + replace + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + replace + axio-disc 35100/tcp # Axiomatic discovery protocol + replace + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + replace + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + replace + ``` 7. Leggere le righe del file e aggiungere del testo sotto la riga corrispondente (`r`) - ```bash - Shell > cat /root/app.txt - append1 - POSIX - UNIX - - Shell > cat /root/test.txt | sed '/ping/r /root/app.txt' - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - append1 - POSIX - UNIX - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` + ```bash + Shell > cat /root/app.txt + append1 + POSIX + UNIX + + Shell > cat /root/test.txt | sed '/ping/r /root/app.txt' + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + append1 + POSIX + UNIX + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` 8. Trascrivere le righe con un match in un altro file (`w`) - ```bash - Shell > cat /root/test.txt | sed '/axio/w /root/storage.txt' + ```bash + Shell > cat /root/test.txt | sed '/axio/w /root/storage.txt' - Shell > cat /root/storage.txt - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - ``` + Shell > cat /root/storage.txt + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + ``` 9. Leggere/aggiungere la riga successiva di input nel "pattern space"(`n` e `N`) - - Visualizza la riga successiva alla riga trovata + - Visualizza la riga successiva alla riga trovata - ```bash - Shell > cat /root/test.txt - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > cat /root/test.txt | sed '/ping/{n;p}' -n - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - ``` + ```bash + Shell > cat /root/test.txt + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures - !!! tip "Suggerimento" + Shell > cat /root/test.txt | sed '/ping/{n;p}' -n + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + ``` - ``` - Più comandi `sed` potrebbero influenzarsi a vicenda, per ridurre questa eventualità utilizzare "**{ }**". - ``` + !!! tip "Suggerimento" - - Visualizzare righe di testo pari + ``` + Più comandi `sed` potrebbero influenzarsi a vicenda, per ridurre questa eventualità utilizzare "**{ }**". + ``` - Prima, legge la prima riga, essendo presente un comando `n`, la seconda riga sarà visualizzata, e così via. + - Visualizzare righe di testo pari + + Prima, legge la prima riga, essendo presente un comando `n`, la seconda riga sarà visualizzata, e così via. + + ```bash + Shell > cat -n /root/test.txt | sed -n '{n;p}' + # or + Shell > cat -n /root/test.txt | sed -n '2~2p' + 2 ka-kdp 31016/udp # Kollective Agent Kollective Delivery + 4 edi_service 34567/udp # dhanalakshmi.org EDI Service + 6 axio-disc 35100/udp # Axiomatic discovery protocol + 8 cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + 10 spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + - Visualizza righe di testo dispari + + ```bash + Shell > cat -n /root/test.txt | sed -n '{p;n}' + # or + Shell > cat -n /root/test.txt | sed -n '1~2p' + # or + Shell > cat -n /root/test.txt | sed 'n;d' + 1 aigairserver 21221/tcp # Services for Air Server + 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + 5 axio-disc 35100/tcp # Axiomatic discovery protocol + 7 pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + ``` + + - Visualizza le righe multiple di 3 + + ```bash + Shell > cat -n /root/test.txt | sed -n '{n;n;p}' + # or + Shell > cat -n /root/test.txt | sed -n '3~3p' + 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + 6 axio-disc 35100/udp # Axiomatic discovery protocol + 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + ``` + + - `N` + + Legge la prima riga e aggiungi una riga dopo aver incontrato il comando `N`. In questo esempio, il "pattern space" è "1\n2". Infine, esegue il comando `q` per uscire. + + ```bash + Shell > seq 1 10 | sed 'N;q' + 1 + 2 + ``` + + Poiché non è presente alcuna riga dopo la riga 9, il risultato sarà il seguente: + + ```bash + Shell > seq 1 9 | sed -n 'N;p' + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + ``` + + Quando l'ultima riga viene letta, il comando `N` non viene eseguito e il risultato è il seguente: + + ```bash + Shell > seq 1 9 | sed -n '$!N;p' + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + ``` + + Unire due righe in una. Sostituisce "\n" del "pattern space" con un carattere vuoto. + + ```bash + Shell > seq 1 6 | sed 'N;{s/\n//g}' + 12 + 34 + 56 + ``` - ```bash - Shell > cat -n /root/test.txt | sed -n '{n;p}' - # or - Shell > cat -n /root/test.txt | sed -n '2~2p' - 2 ka-kdp 31016/udp # Kollective Agent Kollective Delivery - 4 edi_service 34567/udp # dhanalakshmi.org EDI Service - 6 axio-disc 35100/udp # Axiomatic discovery protocol - 8 cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - 10 spremotetablet 46998/tcp # Capture handwritten signatures - ``` +10. Ignorare un caso (`I`) - - Visualizza righe di testo dispari + Sembra non esser presente alcuna informazione in merito all'ignorare casi in `man 1 sed`. ```bash - Shell > cat -n /root/test.txt | sed -n '{p;n}' - # or - Shell > cat -n /root/test.txt | sed -n '1~2p' - # or - Shell > cat -n /root/test.txt | sed 'n;d' - 1 aigairserver 21221/tcp # Services for Air Server - 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - 5 axio-disc 35100/tcp # Axiomatic discovery protocol - 7 pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + Shell > echo -e "abc\nAbc" | sed -n 's/a/X/Igp' + Xbc + XBC ``` - - Visualizza le righe multiple di 3 - ```bash - Shell > cat -n /root/test.txt | sed -n '{n;n;p}' - # or - Shell > cat -n /root/test.txt | sed -n '3~3p' - 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - 6 axio-disc 35100/udp # Axiomatic discovery protocol - 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + Shell > cat /etc/services | sed '/OEM/Ip' -n + oem-agent 3872/tcp # OEM Agent + oem-agent 3872/udp # OEM Agent + oemcacao-jmxmp 11172/tcp # OEM cacao JMX-remoting access point + oemcacao-rmi 11174/tcp # OEM cacao rmi registry access point + oemcacao-websvc 11175/tcp # OEM cacao web service access point ``` - - `N` - - Legge la prima riga e aggiungi una riga dopo aver incontrato il comando `N`. In questo esempio, il "pattern space" è "1\n2". Infine, esegue il comando `q` per uscire. - ```bash - Shell > seq 1 10 | sed 'N;q' - 1 - 2 + Shell > cat /etc/services | sed -r '/(TCP)|(UDP)/Id' ``` - Poiché non è presente alcuna riga dopo la riga 9, il risultato sarà il seguente: - ```bash - Shell > seq 1 9 | sed -n 'N;p' - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 + Shell > cat /etc/services | sed -r '/(TCP)|(UDP)/Ic TMP' ``` - Quando l'ultima riga viene letta, il comando `N` non viene eseguito e il risultato è il seguente: +11. Calcola il numero totale di righe in un file ```bash - Shell > seq 1 9 | sed -n '$!N;p' - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - ``` - - Unire due righe in una. Sostituisce "\n" del "pattern space" con un carattere vuoto. + Shell > cat /etc/services | sed -n '$=' + # or + Shell > cat /etc/services | wc -l - ```bash - Shell > seq 1 6 | sed 'N;{s/\n//g}' - 12 - 34 - 56 + 11473 ``` - -10. Ignorare un caso (`I`) - - Sembra non esser presente alcuna informazione in merito all'ignorare casi in `man 1 sed`. - - ```bash - Shell > echo -e "abc\nAbc" | sed -n 's/a/X/Igp' - Xbc - XBC - ``` - - ```bash - Shell > cat /etc/services | sed '/OEM/Ip' -n - oem-agent 3872/tcp # OEM Agent - oem-agent 3872/udp # OEM Agent - oemcacao-jmxmp 11172/tcp # OEM cacao JMX-remoting access point - oemcacao-rmi 11174/tcp # OEM cacao rmi registry access point - oemcacao-websvc 11175/tcp # OEM cacao web service access point - ``` - - ```bash - Shell > cat /etc/services | sed -r '/(TCP)|(UDP)/Id' - ``` - - ```bash - Shell > cat /etc/services | sed -r '/(TCP)|(UDP)/Ic TMP' - ``` - -11. Calcola il numero totale di righe in un file - - ```bash - Shell > cat /etc/services | sed -n '$=' - # or - Shell > cat /etc/services | wc -l - - 11473 - ``` diff --git a/docs/books/sed_awk_grep/3_sed_command.uk.md b/docs/books/sed_awk_grep/3_sed_command.uk.md index 2d0bf46f36..138fc0e67d 100644 --- a/docs/books/sed_awk_grep/3_sed_command.uk.md +++ b/docs/books/sed_awk_grep/3_sed_command.uk.md @@ -68,769 +68,769 @@ sed [OPTION]... {script-only-if-no-other-script} [input-file]... 1. Зіставлення та друк (`p`) - - Надрукуйте рядок, який починається з рядка NetBIOS + - Надрукуйте рядок, який починається з рядка NetBIOS - ```bash - Shell > cat /etc/services | sed -n '/^netbios/p' - netbios-ns 137/tcp # NETBIOS Name Service - netbios-ns 137/udp - netbios-dgm 138/tcp # NETBIOS Datagram Service - netbios-dgm 138/udp - netbios-ssn 139/tcp # NETBIOS session service - netbios-ssn 139/udp - ``` + ```bash + Shell > cat /etc/services | sed -n '/^netbios/p' + netbios-ns 137/tcp # NETBIOS Name Service + netbios-ns 137/udp + netbios-dgm 138/tcp # NETBIOS Datagram Service + netbios-dgm 138/udp + netbios-ssn 139/tcp # NETBIOS session service + netbios-ssn 139/udp + ``` - !!! tip "Підказка" + !!! tip "Підказка" - ``` - Як ми всі знаємо, подвійні та одинарні лапки в оболонці відіграють різну роль. **$**, **\`** і **\\** у подвійних лапках мають особливе значення. Рекомендовано використовувати одинарні лапки частіше під час використання команди `sed`. - ``` + ``` + Як ми всі знаємо, подвійні та одинарні лапки в оболонці відіграють різну роль. **$**, **\`** і **\\** у подвійних лапках мають особливе значення. Рекомендовано використовувати одинарні лапки частіше під час використання команди `sed`. + ``` - - Вивести текст з 23 по 26 рядки + - Вивести текст з 23 по 26 рядки + + ```bash + Shell > cat -n /etc/services | sed -n '23,26p' + 23 tcpmux 1/tcp # TCP port service multiplexer + 24 tcpmux 1/udp # TCP port service multiplexer + 25 rje 5/tcp # Remote Job Entry + 26 rje 5/udp # Remote Job Entry + ``` + + - Друкувати непарні рядки + + ```bash + Shell > cat -n /etc/services | sed -n '1~2p' + 1 # /etc/services: + 3 # + 5 # IANA services version: last updated 2016-07-08 + 7 # Note that it is presently the policy of IANA to assign a single well-known + 9 # even if the protocol doesn't support UDP operations. + 11 # are included, only the more common ones. + 13 # The latest IANA port assignments can be gotten from + 15 # The Well Known Ports are those from 0 through 1023. + 17 # The Dynamic and/or Private Ports are those from 49152 through 65535 + 19 # Each line describes one service, and is of the form: + ... + ``` + + - Вивести рядок 10 до останнього рядка + + ```bash + Shell > cat -n /etc/services | sed -n '10,$p' + 10 # Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports + 11 # are included, only the more common ones. + 12 # + 13 # The latest IANA port assignments can be gotten from + 14 # http://www.iana.org/assignments/port-numbers + 15 # The Well Known Ports are those from 0 through 1023. + 16 # The Registered Ports are those from 1024 through 49151 + 17 # The Dynamic and/or Private Ports are those from 49152 through 65535 + ... + ``` + + - Рядки з 10 до останнього не друкувати + + ```bash + Shell > cat -n /etc/services | sed -n '10,$!p' + 1 # /etc/services: + 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ + 3 # + 4 # Network services, Internet style + 5 # IANA services version: last updated 2016-07-08 + 6 # + 7 # Note that it is presently the policy of IANA to assign a single well-known + 8 # port number for both TCP and UDP; hence, most entries here have two entries + 9 # even if the protocol doesn't support UDP operations. + ``` + + - Надрукуйте номер рядка та вміст відповідного рядка + + ```bash + Shell > sed -n -e '/netbios/=' -e '/netbios/p' /etc/services + 123 + netbios-ns 137/tcp # NETBIOS Name Service + 124 + netbios-ns 137/udp + 125 + netbios-dgm 138/tcp # NETBIOS Datagram Service + 126 + netbios-dgm 138/udp + 127 + netbios-ssn 139/tcp # NETBIOS session service + 128 + netbios-ssn 139/udp + ``` + + - Зіставте діапазон рядків і надрукуйте його + + Використовуйте коми для розділення діапазонів рядків + + ```bash + Shell > cat /etc/services | sed -n '/^netbios/,/^imap/p' + netbios-ns 137/tcp # NETBIOS Name Service + netbios-ns 137/udp + netbios-dgm 138/tcp # NETBIOS Datagram Service + netbios-dgm 138/udp + netbios-ssn 139/tcp # NETBIOS session service + netbios-ssn 139/udp + imap 143/tcp imap2 # Interim Mail Access Proto v2 + ``` + + !!! info "примітка" - ```bash - Shell > cat -n /etc/services | sed -n '23,26p' - 23 tcpmux 1/tcp # TCP port service multiplexer - 24 tcpmux 1/udp # TCP port service multiplexer - 25 rje 5/tcp # Remote Job Entry - 26 rje 5/udp # Remote Job Entry - ``` - - - Друкувати непарні рядки + ``` + **Початок діапазону**: відповідність рядку, де розташований рядок, лише збігання з першим рядком, який з’являється. + **Кінець діапазону**: збігається з рядком, у якому розташований рядок, лише з першим рядком, який з’являється. + ``` - ```bash - Shell > cat -n /etc/services | sed -n '1~2p' - 1 # /etc/services: - 3 # - 5 # IANA services version: last updated 2016-07-08 - 7 # Note that it is presently the policy of IANA to assign a single well-known - 9 # even if the protocol doesn't support UDP operations. - 11 # are included, only the more common ones. - 13 # The latest IANA port assignments can be gotten from - 15 # The Well Known Ports are those from 0 through 1023. - 17 # The Dynamic and/or Private Ports are those from 49152 through 65535 - 19 # Each line describes one service, and is of the form: - ... - ``` + ```bash + Shell > grep -n ^netbios /etc/services + 123:netbios-ns 137/tcp # NETBIOS Name Service + 124:netbios-ns 137/udp + 125:netbios-dgm 138/tcp # NETBIOS Datagram Service + 126:netbios-dgm 138/udp + 127:netbios-ssn 139/tcp # NETBIOS session service + 128:netbios-ssn 139/udp + + Shell > grep -n ^imap /etc/services + 129:imap 143/tcp imap2 # Interim Mail Access Proto v2 + 130:imap 143/udp imap2 + 168:imap3 220/tcp # Interactive Mail Access + 169:imap3 220/udp # Protocol v3 + 260:imaps 993/tcp # IMAP over SSL + 261:imaps 993/udp # IMAP over SSL + ``` - - Вивести рядок 10 до останнього рядка + Іншими словами, вміст, надрукований вище, це рядки з 123 по 129 - ```bash - Shell > cat -n /etc/services | sed -n '10,$p' - 10 # Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports - 11 # are included, only the more common ones. - 12 # - 13 # The latest IANA port assignments can be gotten from - 14 # http://www.iana.org/assignments/port-numbers - 15 # The Well Known Ports are those from 0 through 1023. - 16 # The Registered Ports are those from 1024 through 49151 - 17 # The Dynamic and/or Private Ports are those from 49152 through 65535 - ... - ``` + - Надрукуйте рядок, де знаходиться рядок, і до останнього рядка - - Рядки з 10 до останнього не друкувати + ```bash + Shell > cat /etc/services | sed -n '/^netbios/,$p' + ``` - ```bash - Shell > cat -n /etc/services | sed -n '10,$!p' - 1 # /etc/services: - 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ - 3 # - 4 # Network services, Internet style - 5 # IANA services version: last updated 2016-07-08 - 6 # - 7 # Note that it is presently the policy of IANA to assign a single well-known - 8 # port number for both TCP and UDP; hence, most entries here have two entries - 9 # even if the protocol doesn't support UDP operations. - ``` + - Використання змінних у сценаріях bash - - Надрукуйте номер рядка та вміст відповідного рядка + ```bash + Shell > vim test1.sh + #!/bin/bash + a=10 - ```bash - Shell > sed -n -e '/netbios/=' -e '/netbios/p' /etc/services - 123 - netbios-ns 137/tcp # NETBIOS Name Service - 124 - netbios-ns 137/udp - 125 - netbios-dgm 138/tcp # NETBIOS Datagram Service - 126 - netbios-dgm 138/udp - 127 - netbios-ssn 139/tcp # NETBIOS session service - 128 - netbios-ssn 139/udp - ``` + sed -n ''${a}',$!p' /etc/services + # or + sed -n "${a},\$!p" /etc/services + ``` - - Зіставте діапазон рядків і надрукуйте його + - Регулярний вираз - Використовуйте коми для розділення діапазонів рядків + Відповідає лише "Три цифри" + "/udp". - ```bash - Shell > cat /etc/services | sed -n '/^netbios/,/^imap/p' - netbios-ns 137/tcp # NETBIOS Name Service - netbios-ns 137/udp - netbios-dgm 138/tcp # NETBIOS Datagram Service - netbios-dgm 138/udp - netbios-ssn 139/tcp # NETBIOS session service - netbios-ssn 139/udp - imap 143/tcp imap2 # Interim Mail Access Proto v2 - ``` + ```bash + Shell > cat /etc/services | sed -r -n '/[^0-9]([1-9]{3}\/udp)/p' + sunrpc 111/udp portmapper rpcbind # RPC 4.0 portmapper UDP + auth 113/udp authentication tap ident + sftp 115/udp + uucp-path 117/udp + nntp 119/udp readnews untp # USENET News Transfer Protocol + ntp 123/udp # Network Time Protocol + netbios-ns 137/udp + netbios-dgm 138/udp + netbios-ssn 139/udp + ... + ``` - !!! info "примітка" - - ``` - **Початок діапазону**: відповідність рядку, де розташований рядок, лише збігання з першим рядком, який з’являється. - **Кінець діапазону**: збігається з рядком, у якому розташований рядок, лише з першим рядком, який з’являється. - ``` - - ```bash - Shell > grep -n ^netbios /etc/services - 123:netbios-ns 137/tcp # NETBIOS Name Service - 124:netbios-ns 137/udp - 125:netbios-dgm 138/tcp # NETBIOS Datagram Service - 126:netbios-dgm 138/udp - 127:netbios-ssn 139/tcp # NETBIOS session service - 128:netbios-ssn 139/udp +2. Зіставити та видалити (`d`) - Shell > grep -n ^imap /etc/services - 129:imap 143/tcp imap2 # Interim Mail Access Proto v2 - 130:imap 143/udp imap2 - 168:imap3 220/tcp # Interactive Mail Access - 169:imap3 220/udp # Protocol v3 - 260:imaps 993/tcp # IMAP over SSL - 261:imaps 993/udp # IMAP over SSL - ``` + Це схоже на друк, за винятком того, що команду операції замінено на `d`, а параметр -n не потрібен. + + - Видалити всі рядки, які відповідають рядку udp, видалити всі рядки коментарів і видалити всі порожні рядки + + ```bash + Shell > sed -e '/udp/d' -e '/^#/d' -e '/^$/d' /etc/services + tcpmux 1/tcp # TCP port service multiplexer + rje 5/tcp # Remote Job Entry + echo 7/tcp + discard 9/tcp sink null + systat 11/tcp users + daytime 13/tcp + qotd 17/tcp quote + chargen 19/tcp ttytst source + ftp-data 20/tcp + ftp 21/tcp + ssh 22/tcp # The Secure Shell (SSH) Protocol + telnet 23/tcp + ... + ``` + + - Видалити послідовні рядки тексту + + ```bash + Shell > cat -n /etc/services | sed '10,$d' + 1 # /etc/services: + 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ + 3 # + 4 # Network services, Internet style + 5 # IANA services version: last updated 2016-07-08 + 6 # + 7 # Note that it is presently the policy of IANA to assign a single well-known + 8 # port number for both TCP and UDP; hence, most entries here have two entries + 9 # even if the protocol doesn't support UDP operations. + ``` + + - Регулярний вираз + + ```bash + Shell > cat /etc/services | sed -r '/(tcp)|(udp)|(^#)|(^$)/d' + http 80/sctp # HyperText Transfer Protocol + bgp 179/sctp + https 443/sctp # http protocol over TLS/SSL + h323hostcall 1720/sctp # H.323 Call Control + nfs 2049/sctp nfsd shilp # Network File System + rtmp 1/ddp # Routing Table Maintenance Protocol + nbp 2/ddp # Name Binding Protocol + echo 4/ddp # AppleTalk Echo Protocol + zip 6/ddp # Zone Information Protocol + discard 9/sctp # Discard + discard 9/dccp # Discard SC:DISC + ... + ``` - Іншими словами, вміст, надрукований вище, це рядки з 123 по 129 +3. Замінити рядки (`s///g`) - - Надрукуйте рядок, де знаходиться рядок, і до останнього рядка + | Синтаксис | Опис синтаксису | + | :---------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | + | `sed 's/string/replace/g' FILENAME` | **s**: усі рядки, що представляють вміст файлу. Ви також можете вказати діапазон рядків, наприклад: `sed '20,200s/netbios/TMP/g' /etc/services. **g** (Глобальне): Якщо g відсутнє, це означає, що коли в одному рядку з'являється кілька співпадаючих рядків, буде замінено лише перший співпадаючий рядок. **/**: Стиль роздільника. Ви також можете вказати інші стилі, наприклад: `sed '20,200s?netbios?TMP?g' /etc/services\` | - ```bash - Shell > cat /etc/services | sed -n '/^netbios/,$p' - ``` + !!! tip "Підказка" - - Використання змінних у сценаріях bash + ```` + Example in the bash script: ```bash - Shell > vim test1.sh + Shell > vim /root/sedReplace.sh #!/bin/bash - a=10 + a="SELINUX=enforcing" + b="SELINUX=disabled" - sed -n ''${a}',$!p' /etc/services + sed -i 's/'${a}'/'${b}'/g' /etc/selinux/config # or - sed -n "${a},\$!p" /etc/services - ``` - - - Регулярний вираз - - Відповідає лише "Три цифри" + "/udp". - - ```bash - Shell > cat /etc/services | sed -r -n '/[^0-9]([1-9]{3}\/udp)/p' - sunrpc 111/udp portmapper rpcbind # RPC 4.0 portmapper UDP - auth 113/udp authentication tap ident - sftp 115/udp - uucp-path 117/udp - nntp 119/udp readnews untp # USENET News Transfer Protocol - ntp 123/udp # Network Time Protocol - netbios-ns 137/udp - netbios-dgm 138/udp - netbios-ssn 139/udp - ... - ``` - -2. Зіставити та видалити (`d`) - - Це схоже на друк, за винятком того, що команду операції замінено на `d`, а параметр -n не потрібен. - - - Видалити всі рядки, які відповідають рядку udp, видалити всі рядки коментарів і видалити всі порожні рядки - - ```bash - Shell > sed -e '/udp/d' -e '/^#/d' -e '/^$/d' /etc/services - tcpmux 1/tcp # TCP port service multiplexer - rje 5/tcp # Remote Job Entry - echo 7/tcp - discard 9/tcp sink null - systat 11/tcp users - daytime 13/tcp - qotd 17/tcp quote - chargen 19/tcp ttytst source - ftp-data 20/tcp - ftp 21/tcp - ssh 22/tcp # The Secure Shell (SSH) Protocol - telnet 23/tcp - ... - ``` - - - Видалити послідовні рядки тексту + sed -i "s/${a}/${b}/g" /etc/selinux/config + ``` + ```` + + - Замініть і роздрукуйте + + ```bash + Shell > sed -n '44,45s/ssh/SSH/gp' /etc/services + SSH 22/tcp + SSH 22/udp + ``` + + - Використовуйте символ "&", щоб посилатися на рядок + + ```bash + Shell > sed -n '44,45s/ssh/&-SSH/gp' /etc/services + ssh-SSH 22/tcp + ssh-SSH 22/udp + ``` + + - Використовуйте рядок, щоб знайти один або кілька рядків і замінити вказаний рядок у діапазоні рядків + + ```bash + Shell > grep ssh /etc/services -n + 44:ssh 22/tcp # The Secure Shell (SSH) Protocol + 45:ssh 22/udp # The Secure Shell (SSH) Protocol + 551:x11-ssh-offset 6010/tcp # SSH X11 forwarding offset + 593:ssh 22/sctp # SSH + 1351:sshell 614/tcp # SSLshell + 1352:sshell 614/udp # SSLshell + 1607:netconf-ssh 830/tcp # NETCONF over SSH + 1608:netconf-ssh 830/udp # NETCONF over SSH + 7178:sdo-ssh 3897/tcp # Simple Distributed Objects over SSH + 7179:sdo-ssh 3897/udp # Simple Distributed Objects over SSH + 7791:netconf-ch-ssh 4334/tcp # NETCONF Call Home (SSH) + 8473:snmpssh 5161/tcp # SNMP over SSH Transport Model + 8474:snmpssh-trap 5162/tcp # SNMP Notification over SSH Transport Model + 9126:tl1-ssh 6252/tcp # TL1 over SSH + 9127:tl1-ssh 6252/udp # TL1 over SSH + 10796:ssh-mgmt 17235/tcp # SSH Tectia Manager + 10797:ssh-mgmt 17235/udp # SSH Tectia Manager + + Shell > sed '/ssh/s/tcp/TCP/gp' -n /etc/services + ssh 22/TCP # The Secure Shell (SSH) Protocol + x11-ssh-offset 6010/TCP # SSH X11 forwarding offset + sshell 614/TCP # SSLshell + netconf-ssh 830/TCP # NETCONF over SSH + sdo-ssh 3897/TCP # Simple Distributed Objects over SSH + netconf-ch-ssh 4334/TCP # NETCONF Call Home (SSH) + snmpssh 5161/TCP # SNMP over SSH Transport Model + snmpssh-trap 5162/TCP # SNMP Notification over SSH Transport Model + tl1-ssh 6252/TCP # TL1 over SSH + ssh-mgmt 17235/TCP # SSH Tectia Manager + ``` + + - Заміна рядка для послідовних рядків + + ```bash + Shell > sed '10,30s/tcp/TCP/g' /etc/services + ``` + + - Кілька збігів і замін + + ```bash + Shell > cat /etc/services | sed 's/netbios/test1/g ; s/^#//d ; s/dhcp/&t2/g' + ``` + + - Групова заміна регулярних виразів + + У регулярних виразах "()" є групуванням. \1 представляє референтну групу 1, \2 представляє референтну групу 2 і так далі. + + ```bash + Shell > cat /etc/services + ... + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + + Shell > cat /etc/services | sed -r 's/([0-9]*\/tcp)/\1\tCONTENT1/g ; s/([0-9]*\/udp)/\1\tADD2/g' + ... + axio-disc 35100/tcp CONTENT1 # Axiomatic discovery protocol + axio-disc 35100/udp ADD2 # Axiomatic discovery protocol + pmwebapi 44323/tcp CONTENT1 # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp ADD2 # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp CONTENT1 # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp CONTENT1 # Capture handwritten signatures + ``` + + **\t**: тобто вкладка + + - Замініть усі рядки коментарів порожніми + + ```bash + Shell > cat /etc/services | sed -r 's/(^#.*)//g' + ... + chargen 19/udp ttytst source + ftp-data 20/tcp + ftp-data 20/udp + + ftp 21/tcp + ftp 21/udp fsp fspd + ssh 22/tcp # The Secure Shell (SSH) Protocol + ssh 22/udp # The Secure Shell (SSH) Protocol + ... + ``` + + - Замініть одну з малих літер слова великою + + ```bash + Shell > echo -e "hello,world\nPOSIX" | sed -r 's/(.*)w/\1W/g' + hello,World + POSIX + ``` + + - Зміна позиції рядка + + ```bash + Shell > cat /etc/services + ... + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + Ми можемо розділити цей файл на п'ять частин: + + ```txt + cloudcheck-ping 45514 / udp # ASSIA CloudCheck WiFi Management keepalive + ↓ ↓ ↓ ↓ ↓ + (.*) (\<[0-9]+\>) \/ (tcp|udp) (.*) + ↓ ↓ ↓ ↓ + \1 \2 \3 \4 + ``` + + ```bash + Shell > cat /etc/services | sed -r 's/(.*)(\<[0-9]+\>)\/(tcp|udp)(.*)/\1\3\/\2\4/g' + ... + edi_service udp/34567 # dhanalakshmi.org EDI Service + axio-disc tcp/35100 # Axiomatic discovery protocol + axio-disc udp/35100 # Axiomatic discovery protocol + pmwebapi tcp/44323 # Performance Co-Pilot client HTTP API + cloudcheck-ping udp/45514 # ASSIA CloudCheck WiFi Management keepalive + cloudcheck tcp/45514 # ASSIA CloudCheck WiFi Management System + spremotetablet tcp/46998 # Capture handwritten signatures + ``` + + - Видаліть усі пробіли + + ```bash + Shell > echo -e "abcd\t1 2 3 4\tWorld" + abcd 1 2 3 4 World + Shell > echo -e "abcd\t1 2 3 4\tWorld" | sed -r 's/(\s)*//g' + abcd1234World + ``` - ```bash - Shell > cat -n /etc/services | sed '10,$d' - 1 # /etc/services: - 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ - 3 # - 4 # Network services, Internet style - 5 # IANA services version: last updated 2016-07-08 - 6 # - 7 # Note that it is presently the policy of IANA to assign a single well-known - 8 # port number for both TCP and UDP; hence, most entries here have two entries - 9 # even if the protocol doesn't support UDP operations. - ``` - - - Регулярний вираз - - ```bash - Shell > cat /etc/services | sed -r '/(tcp)|(udp)|(^#)|(^$)/d' - http 80/sctp # HyperText Transfer Protocol - bgp 179/sctp - https 443/sctp # http protocol over TLS/SSL - h323hostcall 1720/sctp # H.323 Call Control - nfs 2049/sctp nfsd shilp # Network File System - rtmp 1/ddp # Routing Table Maintenance Protocol - nbp 2/ddp # Name Binding Protocol - echo 4/ddp # AppleTalk Echo Protocol - zip 6/ddp # Zone Information Protocol - discard 9/sctp # Discard - discard 9/dccp # Discard SC:DISC - ... - ``` - -3. Замінити рядки (`s///g`) - - | Синтаксис | Опис синтаксису | - | :---------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | - | `sed 's/string/replace/g' FILENAME` | **s**: усі рядки, що представляють вміст файлу. Ви також можете вказати діапазон рядків, наприклад: `sed '20,200s/netbios/TMP/g' /etc/services. **g** (Глобальне): Якщо g відсутнє, це означає, що коли в одному рядку з'являється кілька співпадаючих рядків, буде замінено лише перший співпадаючий рядок. **/**: Стиль роздільника. Ви також можете вказати інші стилі, наприклад: `sed '20,200s?netbios?TMP?g' /etc/services\` | - - !!! tip "Підказка" +4. Виконайте кілька разів за допомогою параметра -e - ```` - Example in the bash script: + Наступний приклад: ```bash - Shell > vim /root/sedReplace.sh - #!/bin/bash - a="SELINUX=enforcing" - b="SELINUX=disabled" - - sed -i 's/'${a}'/'${b}'/g' /etc/selinux/config + Shell > tail -n 10 /etc/services + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + + Shell > tail -n 10 /etc/services | sed -e '1,3d' -e '/cloud/s/ping/PING/g' # or - sed -i "s/${a}/${b}/g" /etc/selinux/config + Shell > tail -n 10 /etc/services | sed '1,3d ; /cloud/s/ping/PING/g' + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-PING 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures ``` - ```` - - - Замініть і роздрукуйте - - ```bash - Shell > sed -n '44,45s/ssh/SSH/gp' /etc/services - SSH 22/tcp - SSH 22/udp - ``` - - - Використовуйте символ "&", щоб посилатися на рядок - - ```bash - Shell > sed -n '44,45s/ssh/&-SSH/gp' /etc/services - ssh-SSH 22/tcp - ssh-SSH 22/udp - ``` - - - Використовуйте рядок, щоб знайти один або кілька рядків і замінити вказаний рядок у діапазоні рядків - - ```bash - Shell > grep ssh /etc/services -n - 44:ssh 22/tcp # The Secure Shell (SSH) Protocol - 45:ssh 22/udp # The Secure Shell (SSH) Protocol - 551:x11-ssh-offset 6010/tcp # SSH X11 forwarding offset - 593:ssh 22/sctp # SSH - 1351:sshell 614/tcp # SSLshell - 1352:sshell 614/udp # SSLshell - 1607:netconf-ssh 830/tcp # NETCONF over SSH - 1608:netconf-ssh 830/udp # NETCONF over SSH - 7178:sdo-ssh 3897/tcp # Simple Distributed Objects over SSH - 7179:sdo-ssh 3897/udp # Simple Distributed Objects over SSH - 7791:netconf-ch-ssh 4334/tcp # NETCONF Call Home (SSH) - 8473:snmpssh 5161/tcp # SNMP over SSH Transport Model - 8474:snmpssh-trap 5162/tcp # SNMP Notification over SSH Transport Model - 9126:tl1-ssh 6252/tcp # TL1 over SSH - 9127:tl1-ssh 6252/udp # TL1 over SSH - 10796:ssh-mgmt 17235/tcp # SSH Tectia Manager - 10797:ssh-mgmt 17235/udp # SSH Tectia Manager - - Shell > sed '/ssh/s/tcp/TCP/gp' -n /etc/services - ssh 22/TCP # The Secure Shell (SSH) Protocol - x11-ssh-offset 6010/TCP # SSH X11 forwarding offset - sshell 614/TCP # SSLshell - netconf-ssh 830/TCP # NETCONF over SSH - sdo-ssh 3897/TCP # Simple Distributed Objects over SSH - netconf-ch-ssh 4334/TCP # NETCONF Call Home (SSH) - snmpssh 5161/TCP # SNMP over SSH Transport Model - snmpssh-trap 5162/TCP # SNMP Notification over SSH Transport Model - tl1-ssh 6252/TCP # TL1 over SSH - ssh-mgmt 17235/TCP # SSH Tectia Manager - ``` - - - Заміна рядка для послідовних рядків - - ```bash - Shell > sed '10,30s/tcp/TCP/g' /etc/services - ``` - - - Кілька збігів і замін - - ```bash - Shell > cat /etc/services | sed 's/netbios/test1/g ; s/^#//d ; s/dhcp/&t2/g' - ``` - - - Групова заміна регулярних виразів - - У регулярних виразах "()" є групуванням. \1 представляє референтну групу 1, \2 представляє референтну групу 2 і так далі. - - ```bash - Shell > cat /etc/services - ... - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > cat /etc/services | sed -r 's/([0-9]*\/tcp)/\1\tCONTENT1/g ; s/([0-9]*\/udp)/\1\tADD2/g' - ... - axio-disc 35100/tcp CONTENT1 # Axiomatic discovery protocol - axio-disc 35100/udp ADD2 # Axiomatic discovery protocol - pmwebapi 44323/tcp CONTENT1 # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp ADD2 # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp CONTENT1 # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp CONTENT1 # Capture handwritten signatures - ``` - - **\t**: тобто вкладка - - - Замініть усі рядки коментарів порожніми - - ```bash - Shell > cat /etc/services | sed -r 's/(^#.*)//g' - ... - chargen 19/udp ttytst source - ftp-data 20/tcp - ftp-data 20/udp - - ftp 21/tcp - ftp 21/udp fsp fspd - ssh 22/tcp # The Secure Shell (SSH) Protocol - ssh 22/udp # The Secure Shell (SSH) Protocol - ... - ``` - - - Замініть одну з малих літер слова великою - - ```bash - Shell > echo -e "hello,world\nPOSIX" | sed -r 's/(.*)w/\1W/g' - hello,World - POSIX - ``` - - - Зміна позиції рядка - - ```bash - Shell > cat /etc/services - ... - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` - - Ми можемо розділити цей файл на п'ять частин: - - ```txt - cloudcheck-ping 45514 / udp # ASSIA CloudCheck WiFi Management keepalive - ↓ ↓ ↓ ↓ ↓ - (.*) (\<[0-9]+\>) \/ (tcp|udp) (.*) - ↓ ↓ ↓ ↓ - \1 \2 \3 \4 - ``` - - ```bash - Shell > cat /etc/services | sed -r 's/(.*)(\<[0-9]+\>)\/(tcp|udp)(.*)/\1\3\/\2\4/g' - ... - edi_service udp/34567 # dhanalakshmi.org EDI Service - axio-disc tcp/35100 # Axiomatic discovery protocol - axio-disc udp/35100 # Axiomatic discovery protocol - pmwebapi tcp/44323 # Performance Co-Pilot client HTTP API - cloudcheck-ping udp/45514 # ASSIA CloudCheck WiFi Management keepalive - cloudcheck tcp/45514 # ASSIA CloudCheck WiFi Management System - spremotetablet tcp/46998 # Capture handwritten signatures - ``` - - - Видаліть усі пробіли - - ```bash - Shell > echo -e "abcd\t1 2 3 4\tWorld" - abcd 1 2 3 4 World - Shell > echo -e "abcd\t1 2 3 4\tWorld" | sed -r 's/(\s)*//g' - abcd1234World - ``` - -4. Виконайте кілька разів за допомогою параметра -e - - Наступний приклад: - - ```bash - Shell > tail -n 10 /etc/services - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > tail -n 10 /etc/services | sed -e '1,3d' -e '/cloud/s/ping/PING/g' - # or - Shell > tail -n 10 /etc/services | sed '1,3d ; /cloud/s/ping/PING/g' - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-PING 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` 5. Додайте вміст над або під певним рядком («i» і «a») - - Додайте два рядки вмісту над вказаним номером рядка - - ```bash - Shell > tail -n 10 /etc/services > /root/test.txt - Shell > cat /root/test.txt - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > cat /root/test.txt | sed '3i 123\ - abc' - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - 123 - abc - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` + - Додайте два рядки вмісту над вказаним номером рядка + + ```bash + Shell > tail -n 10 /etc/services > /root/test.txt + Shell > cat /root/test.txt + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + + Shell > cat /root/test.txt | sed '3i 123\ + abc' + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + 123 + abc + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + - Додайте три рядки під вказаним номером рядка - - Додайте три рядки під вказаним номером рядка - - ```bash - Shell > cat /root/test.txt | sed '5a 123\ - comment yes\ - tcp or udp' - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - 123 - comment yes - tcp or udp - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` - - - Зіставте певний рядок на основі рядка та додайте 2 рядки вмісту над ним + ```bash + Shell > cat /root/test.txt | sed '5a 123\ + comment yes\ + tcp or udp' + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + 123 + comment yes + tcp or udp + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` - ```bash - Shell > cat /root/test.txt | sed '/tcp/iTCP\ - UDP' - TCP - UDP - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - TCP - UDP - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - TCP - UDP - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - TCP - UDP - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - TCP - UDP - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - TCP - UDP - spremotetablet 46998/tcp # Capture handwritten signatures - ``` + - Зіставте певний рядок на основі рядка та додайте 2 рядки вмісту над ним + + ```bash + Shell > cat /root/test.txt | sed '/tcp/iTCP\ + UDP' + TCP + UDP + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + TCP + UDP + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + TCP + UDP + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + TCP + UDP + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + TCP + UDP + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + TCP + UDP + spremotetablet 46998/tcp # Capture handwritten signatures + ``` 6. Замінити рядки (`c`) - - Знайдіть один або кілька рядків на основі рядка та замініть ці рядки тексту - - ```bash - Shell > cat /root/test.txt | sed '/ser/c\TMP1 \ - TMP2' - TMP1 - TMP2 - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - TMP1 - TMP2 - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` - - - Заміна однієї лінії - - ```bash - Shell > cat /root/test.txt | sed '7c REPLACE' - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - REPLACE - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` - - - Замінити послідовні рядки тексту - - ```bash - Shell > cat /root/test.txt | sed '2,$c REPLACE1 \ - replace2' - aigairserver 21221/tcp # Services for Air Server - REPLACE1 - replace2 - ``` - - - Замініть парні рядки - - ```bash - Shell > cat /root/test.txt | sed '2~2c replace' - aigairserver 21221/tcp # Services for Air Server - replace - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - replace - axio-disc 35100/tcp # Axiomatic discovery protocol - replace - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - replace - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - replace - ``` + - Знайдіть один або кілька рядків на основі рядка та замініть ці рядки тексту + + ```bash + Shell > cat /root/test.txt | sed '/ser/c\TMP1 \ + TMP2' + TMP1 + TMP2 + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + TMP1 + TMP2 + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + - Заміна однієї лінії + + ```bash + Shell > cat /root/test.txt | sed '7c REPLACE' + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + REPLACE + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + - Замінити послідовні рядки тексту + + ```bash + Shell > cat /root/test.txt | sed '2,$c REPLACE1 \ + replace2' + aigairserver 21221/tcp # Services for Air Server + REPLACE1 + replace2 + ``` + + - Замініть парні рядки + + ```bash + Shell > cat /root/test.txt | sed '2~2c replace' + aigairserver 21221/tcp # Services for Air Server + replace + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + replace + axio-disc 35100/tcp # Axiomatic discovery protocol + replace + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + replace + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + replace + ``` 7. Прочитайте вміст файлу та додайте його вміст під відповідним рядком (`r`) - ```bash - Shell > cat /root/app.txt - append1 - POSIX - UNIX - - Shell > cat /root/test.txt | sed '/ping/r /root/app.txt' - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - append1 - POSIX - UNIX - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` + ```bash + Shell > cat /root/app.txt + append1 + POSIX + UNIX + + Shell > cat /root/test.txt | sed '/ping/r /root/app.txt' + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + append1 + POSIX + UNIX + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` 8. Записати відповідні рядки в інші файли (`w`) - ```bash - Shell > cat /root/test.txt | sed '/axio/w /root/storage.txt' + ```bash + Shell > cat /root/test.txt | sed '/axio/w /root/storage.txt' - Shell > cat /root/storage.txt - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - ``` + Shell > cat /root/storage.txt + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + ``` 9. Читання/додавання наступного рядка введення в "простір шаблону" (`n` і `N`) - - Надрукуйте наступний рядок відповідного рядка + - Надрукуйте наступний рядок відповідного рядка - ```bash - Shell > cat /root/test.txt - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > cat /root/test.txt | sed '/ping/{n;p}' -n - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - ``` + ```bash + Shell > cat /root/test.txt + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures - !!! tip "Підказка" + Shell > cat /root/test.txt | sed '/ping/{n;p}' -n + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + ``` - ``` - Кілька команд операції `sed` можуть впливати одна на одну, і ви можете використовувати "**{ }**", щоб зменшити цей вплив. - ``` + !!! tip "Підказка" - - Друк рівних рядків тексту + ``` + Кілька команд операції `sed` можуть впливати одна на одну, і ви можете використовувати "**{ }**", щоб зменшити цей вплив. + ``` - Спочатку прочитайте перший рядок, оскільки присутня команда `n`; буде роздруковано другий рядок і так далі. + - Друк рівних рядків тексту + + Спочатку прочитайте перший рядок, оскільки присутня команда `n`; буде роздруковано другий рядок і так далі. + + ```bash + Shell > cat -n /root/test.txt | sed -n '{n;p}' + # or + Shell > cat -n /root/test.txt | sed -n '2~2p' + 2 ka-kdp 31016/udp # Kollective Agent Kollective Delivery + 4 edi_service 34567/udp # dhanalakshmi.org EDI Service + 6 axio-disc 35100/udp # Axiomatic discovery protocol + 8 cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + 10 spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + - Друк непарних рядків тексту + + ```bash + Shell > cat -n /root/test.txt | sed -n '{p;n}' + # or + Shell > cat -n /root/test.txt | sed -n '1~2p' + # or + Shell > cat -n /root/test.txt | sed 'n;d' + 1 aigairserver 21221/tcp # Services for Air Server + 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + 5 axio-disc 35100/tcp # Axiomatic discovery protocol + 7 pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + ``` + + - Вивести 3n рядків + + ```bash + Shell > cat -n /root/test.txt | sed -n '{n;n;p}' + # or + Shell > cat -n /root/test.txt | sed -n '3~3p' + 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + 6 axio-disc 35100/udp # Axiomatic discovery protocol + 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + ``` + + - `N` + + Прочитайте перший рядок і додайте один рядок після зустрічі з командою `N`. У цьому прикладі «простір шаблону» — «1\n2». Нарешті, виконайте команду `q`, щоб вийти. + + ```bash + Shell > seq 1 10 | sed 'N;q' + 1 + 2 + ``` + + Оскільки після рядка 9 немає додаткового рядка, результат буде таким: + + ```bash + Shell > seq 1 9 | sed -n 'N;p' + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + ``` + + Коли зчитується останній рядок, команда `N` не виконується, і виводиться наступне: + + ```bash + Shell > seq 1 9 | sed -n '$!N;p' + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + ``` + + Об’єднати два рядки в один. Замініть "\n" у "шаблоні" пробілом. + + ```bash + Shell > seq 1 6 | sed 'N;{s/\n//g}' + 12 + 34 + 56 + ``` - ```bash - Shell > cat -n /root/test.txt | sed -n '{n;p}' - # or - Shell > cat -n /root/test.txt | sed -n '2~2p' - 2 ka-kdp 31016/udp # Kollective Agent Kollective Delivery - 4 edi_service 34567/udp # dhanalakshmi.org EDI Service - 6 axio-disc 35100/udp # Axiomatic discovery protocol - 8 cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - 10 spremotetablet 46998/tcp # Capture handwritten signatures - ``` +10. Ігнорувати регістр ('I') - - Друк непарних рядків тексту + Здається, немає інформації про ігнорування регістру в `man 1 sed`. ```bash - Shell > cat -n /root/test.txt | sed -n '{p;n}' - # or - Shell > cat -n /root/test.txt | sed -n '1~2p' - # or - Shell > cat -n /root/test.txt | sed 'n;d' - 1 aigairserver 21221/tcp # Services for Air Server - 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - 5 axio-disc 35100/tcp # Axiomatic discovery protocol - 7 pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + Shell > echo -e "abc\nAbc" | sed -n 's/a/X/Igp' + Xbc + XBC ``` - - Вивести 3n рядків - ```bash - Shell > cat -n /root/test.txt | sed -n '{n;n;p}' - # or - Shell > cat -n /root/test.txt | sed -n '3~3p' - 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - 6 axio-disc 35100/udp # Axiomatic discovery protocol - 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + Shell > cat /etc/services | sed '/OEM/Ip' -n + oem-agent 3872/tcp # OEM Agent + oem-agent 3872/udp # OEM Agent + oemcacao-jmxmp 11172/tcp # OEM cacao JMX-remoting access point + oemcacao-rmi 11174/tcp # OEM cacao rmi registry access point + oemcacao-websvc 11175/tcp # OEM cacao web service access point ``` - - `N` - - Прочитайте перший рядок і додайте один рядок після зустрічі з командою `N`. У цьому прикладі «простір шаблону» — «1\n2». Нарешті, виконайте команду `q`, щоб вийти. - ```bash - Shell > seq 1 10 | sed 'N;q' - 1 - 2 + Shell > cat /etc/services | sed -r '/(TCP)|(UDP)/Id' ``` - Оскільки після рядка 9 немає додаткового рядка, результат буде таким: - ```bash - Shell > seq 1 9 | sed -n 'N;p' - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 + Shell > cat /etc/services | sed -r '/(TCP)|(UDP)/Ic TMP' ``` - Коли зчитується останній рядок, команда `N` не виконується, і виводиться наступне: +11. Отримує загальну кількість рядків у файлі ```bash - Shell > seq 1 9 | sed -n '$!N;p' - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - ``` - - Об’єднати два рядки в один. Замініть "\n" у "шаблоні" пробілом. + Shell > cat /etc/services | sed -n '$=' + # or + Shell > cat /etc/services | wc -l - ```bash - Shell > seq 1 6 | sed 'N;{s/\n//g}' - 12 - 34 - 56 + 11473 ``` - -10. Ігнорувати регістр ('I') - - Здається, немає інформації про ігнорування регістру в `man 1 sed`. - - ```bash - Shell > echo -e "abc\nAbc" | sed -n 's/a/X/Igp' - Xbc - XBC - ``` - - ```bash - Shell > cat /etc/services | sed '/OEM/Ip' -n - oem-agent 3872/tcp # OEM Agent - oem-agent 3872/udp # OEM Agent - oemcacao-jmxmp 11172/tcp # OEM cacao JMX-remoting access point - oemcacao-rmi 11174/tcp # OEM cacao rmi registry access point - oemcacao-websvc 11175/tcp # OEM cacao web service access point - ``` - - ```bash - Shell > cat /etc/services | sed -r '/(TCP)|(UDP)/Id' - ``` - - ```bash - Shell > cat /etc/services | sed -r '/(TCP)|(UDP)/Ic TMP' - ``` - -11. Отримує загальну кількість рядків у файлі - - ```bash - Shell > cat /etc/services | sed -n '$=' - # or - Shell > cat /etc/services | wc -l - - 11473 - ``` diff --git a/docs/books/sed_awk_grep/4_awk_command.it.md b/docs/books/sed_awk_grep/4_awk_command.it.md index 20c982c9fe..94ce9e7494 100644 --- a/docs/books/sed_awk_grep/4_awk_command.it.md +++ b/docs/books/sed_awk_grep/4_awk_command.it.md @@ -190,293 +190,293 @@ ID Name 1. Lettura dei file sorgente del programma `awk` da file - ```bash - Shell > vim /tmp/read-print.awk - #!/bin/awk - {print $6} - - Shell > df -hT | awk -f /tmp/read-print.awk - Use% - 0% - 0% - 1% - 0% - 6% - 18% - 0% - ``` + ```bash + Shell > vim /tmp/read-print.awk + #!/bin/awk + {print $6} + + Shell > df -hT | awk -f /tmp/read-print.awk + Use% + 0% + 0% + 1% + 0% + 6% + 18% + 0% + ``` 2. Specificare il delimitatore - ```bash - Shell > awk -F ":" '{print $1}' /etc/passwd - root - bin - daemon - adm - lp - sync - ... - - Shell > tail -n 5 /etc/services | awk -F "\/" '{print $2}' - awk: warning: escape sequence `\/' treated as plain `/' - axio-disc 35100 - pmwebapi 44323 - cloudcheck-ping 45514 - cloudcheck 45514 - spremotetablet 46998 - ``` - - Si possono usare anche parole come delimitatori. Le parentesi indicano che si tratta di un delimitatore generale e "|" significa o. - - ```bash - Shell > tail -n 5 /etc/services | awk -F "(tcp)|(udp)" '{print $1}' - axio-disc 35100/ - pmwebapi 44323/ - cloudcheck-ping 45514/ - cloudcheck 45514/ - spremotetablet 46998/ - ``` + ```bash + Shell > awk -F ":" '{print $1}' /etc/passwd + root + bin + daemon + adm + lp + sync + ... + + Shell > tail -n 5 /etc/services | awk -F "\/" '{print $2}' + awk: warning: escape sequence `\/' treated as plain `/' + axio-disc 35100 + pmwebapi 44323 + cloudcheck-ping 45514 + cloudcheck 45514 + spremotetablet 46998 + ``` + + Si possono usare anche parole come delimitatori. Le parentesi indicano che si tratta di un delimitatore generale e "|" significa o. + + ```bash + Shell > tail -n 5 /etc/services | awk -F "(tcp)|(udp)" '{print $1}' + axio-disc 35100/ + pmwebapi 44323/ + cloudcheck-ping 45514/ + cloudcheck 45514/ + spremotetablet 46998/ + ``` 3. Assegnazione delle variabili - ```bash - Shell > tail -n 5 /etc/services | awk -v a=123 'BEGIN{print a}{print $1}' - 123 - axio-disc - pmwebapi - cloudcheck-ping - cloudcheck - spremotetablet - ``` - - Assegna il valore delle variabili definite dall'utente in bash alle variabili di awk. - - ```bash - Shell > ab=123 - Shell > echo ${ab} - 123 - Shell > tail -n 5 /etc/services | awk -v a=${ab} 'BEGIN{print a}{print $1}' - 123 - axio-disc - pmwebapi - cloudcheck-ping - cloudcheck - spremotetablet - ``` + ```bash + Shell > tail -n 5 /etc/services | awk -v a=123 'BEGIN{print a}{print $1}' + 123 + axio-disc + pmwebapi + cloudcheck-ping + cloudcheck + spremotetablet + ``` + + Assegna il valore delle variabili definite dall'utente in bash alle variabili di awk. + + ```bash + Shell > ab=123 + Shell > echo ${ab} + 123 + Shell > tail -n 5 /etc/services | awk -v a=${ab} 'BEGIN{print a}{print $1}' + 123 + axio-disc + pmwebapi + cloudcheck-ping + cloudcheck + spremotetablet + ``` 4. Scrivere le variabili globali di awk in un file - ```bash - Shell > seq 1 6 | awk --dump-variables '{print $0}' - 1 - 2 - 3 - 4 - 5 - 6 - - Shell > cat /root/awkvars.out - ARGC: 1 - ARGIND: 0 - ARGV: array, 1 elements - BINMODE: 0 - CONVFMT: "%.6g" - ENVIRON: array, 27 elements - ERRNO: "" - FIELDWIDTHS: "" - FILENAME: "-" - FNR: 6 - FPAT: "[^[:space:]]+" - FS: " " - FUNCTAB: array, 41 elements - IGNORECASE: 0 - LINT: 0 - NF: 1 - NR: 6 - OFMT: "%.6g" - OFS: " " - ORS: "\n" - PREC: 53 - PROCINFO: array, 20 elements - RLENGTH: 0 - ROUNDMODE: "N" - RS: "\n" - RSTART: 0 - RT: "\n" - SUBSEP: "\034" - SYMTAB: array, 28 elements - TEXTDOMAIN: "messages" - ``` - - In seguito, sarà introdotto il significato di queste variabili. Per rivederli ora, [saltare alle variabili](#VARIABILI). + ```bash + Shell > seq 1 6 | awk --dump-variables '{print $0}' + 1 + 2 + 3 + 4 + 5 + 6 + + Shell > cat /root/awkvars.out + ARGC: 1 + ARGIND: 0 + ARGV: array, 1 elements + BINMODE: 0 + CONVFMT: "%.6g" + ENVIRON: array, 27 elements + ERRNO: "" + FIELDWIDTHS: "" + FILENAME: "-" + FNR: 6 + FPAT: "[^[:space:]]+" + FS: " " + FUNCTAB: array, 41 elements + IGNORECASE: 0 + LINT: 0 + NF: 1 + NR: 6 + OFMT: "%.6g" + OFS: " " + ORS: "\n" + PREC: 53 + PROCINFO: array, 20 elements + RLENGTH: 0 + ROUNDMODE: "N" + RS: "\n" + RSTART: 0 + RT: "\n" + SUBSEP: "\034" + SYMTAB: array, 28 elements + TEXTDOMAIN: "messages" + ``` + + In seguito, sarà introdotto il significato di queste variabili. Per rivederli ora, [saltare alle variabili](#VARIABILI). 5. BEGIN{ } ed END{ } - ```bash - Shell > head -n 5 /etc/passwd | awk 'BEGIN{print "UserName:PasswordIdentification:UID:InitGID"}{print $0}END{print "one\ntwo"}' - UserName:PasswordIdentification:UID:InitGID - root:x:0:0:root:/root:/bin/bash - bin:x:1:1:bin:/bin:/sbin/nologin - daemon:x:2:2:daemon:/sbin:/sbin/nologin - adm:x:3:4:adm:/var/adm:/sbin/nologin - lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin - one - two - ``` + ```bash + Shell > head -n 5 /etc/passwd | awk 'BEGIN{print "UserName:PasswordIdentification:UID:InitGID"}{print $0}END{print "one\ntwo"}' + UserName:PasswordIdentification:UID:InitGID + root:x:0:0:root:/root:/bin/bash + bin:x:1:1:bin:/bin:/sbin/nologin + daemon:x:2:2:daemon:/sbin:/sbin/nologin + adm:x:3:4:adm:/var/adm:/sbin/nologin + lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin + one + two + ``` 6. Opzione --profile - ```bash - Shell > df -hT | awk --profile 'BEGIN{print "start line"}{print $0}END{print "end line"}' - start line - Filesystem Type Size Used Avail Use% Mounted on - devtmpfs devtmpfs 1.8G 0 1.8G 0% /dev - tmpfs tmpfs 1.8G 0 1.8G 0% /dev/shm - tmpfs tmpfs 1.8G 8.9M 1.8G 1% /run - tmpfs tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup - /dev/nvme0n1p2 ext4 47G 2.7G 42G 6% / - /dev/nvme0n1p1 xfs 1014M 181M 834M 18% /boot - tmpfs tmpfs 363M 0 363M 0% /run/user/0 - end line - - Shell > cat /root/awkprof.out - # gawk profile, created Fri Dec 8 15:12:56 2023 - - # BEGIN rule(s) - - BEGIN { - 1 print "start line" - } - - # Rule(s) - - 8 { - 8 print $0 - } - - # END rule(s) - - END { - 1 print "end line" - } - ``` - - Modificare il file awkprof.out. - - ```bash - Shell > vim /root/awkprof.out - BEGIN { - print "start line" - } - - { - print $0 - } - - END { - print "end line" - } - - Shell > df -hT | awk -f /root/awkprof.out - start line - Filesystem Type Size Used Avail Use% Mounted on - devtmpfs devtmpfs 1.8G 0 1.8G 0% /dev - tmpfs tmpfs 1.8G 0 1.8G 0% /dev/shm - tmpfs tmpfs 1.8G 8.9M 1.8G 1% /run - tmpfs tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup - /dev/nvme0n1p2 ext4 47G 2.7G 42G 6% / - /dev/nvme0n1p1 xfs 1014M 181M 834M 18% /boot - tmpfs tmpfs 363M 0 363M 0% /run/user/0 - end line - ``` + ```bash + Shell > df -hT | awk --profile 'BEGIN{print "start line"}{print $0}END{print "end line"}' + start line + Filesystem Type Size Used Avail Use% Mounted on + devtmpfs devtmpfs 1.8G 0 1.8G 0% /dev + tmpfs tmpfs 1.8G 0 1.8G 0% /dev/shm + tmpfs tmpfs 1.8G 8.9M 1.8G 1% /run + tmpfs tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup + /dev/nvme0n1p2 ext4 47G 2.7G 42G 6% / + /dev/nvme0n1p1 xfs 1014M 181M 834M 18% /boot + tmpfs tmpfs 363M 0 363M 0% /run/user/0 + end line + + Shell > cat /root/awkprof.out + # gawk profile, created Fri Dec 8 15:12:56 2023 + + # BEGIN rule(s) + + BEGIN { + 1 print "start line" + } + + # Rule(s) + + 8 { + 8 print $0 + } + + # END rule(s) + + END { + 1 print "end line" + } + ``` + + Modificare il file awkprof.out. + + ```bash + Shell > vim /root/awkprof.out + BEGIN { + print "start line" + } + + { + print $0 + } + + END { + print "end line" + } + + Shell > df -hT | awk -f /root/awkprof.out + start line + Filesystem Type Size Used Avail Use% Mounted on + devtmpfs devtmpfs 1.8G 0 1.8G 0% /dev + tmpfs tmpfs 1.8G 0 1.8G 0% /dev/shm + tmpfs tmpfs 1.8G 8.9M 1.8G 1% /run + tmpfs tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup + /dev/nvme0n1p2 ext4 47G 2.7G 42G 6% / + /dev/nvme0n1p1 xfs 1014M 181M 834M 18% /boot + tmpfs tmpfs 363M 0 363M 0% /run/user/0 + end line + ``` 7. Corrispondenza di righe (record) tramite espressioni regolari - ```bash - Shell > cat /etc/services | awk '/[^0-9a-zA-Z]1[1-9]{2}\/tcp/ {print $0}' - sunrpc 111/tcp portmapper rpcbind # RPC 4.0 portmapper TCP - auth 113/tcp authentication tap ident - sftp 115/tcp - uucp-path 117/tcp - nntp 119/tcp readnews untp # USENET News Transfer Protocol - ntp 123/tcp - netbios-ns 137/tcp # NETBIOS Name Service - netbios-dgm 138/tcp # NETBIOS Datagram Service - netbios-ssn 139/tcp # NETBIOS session service - ... - ``` + ```bash + Shell > cat /etc/services | awk '/[^0-9a-zA-Z]1[1-9]{2}\/tcp/ {print $0}' + sunrpc 111/tcp portmapper rpcbind # RPC 4.0 portmapper TCP + auth 113/tcp authentication tap ident + sftp 115/tcp + uucp-path 117/tcp + nntp 119/tcp readnews untp # USENET News Transfer Protocol + ntp 123/tcp + netbios-ns 137/tcp # NETBIOS Name Service + netbios-dgm 138/tcp # NETBIOS Datagram Service + netbios-ssn 139/tcp # NETBIOS session service + ... + ``` 8. Operazioni logiche (AND, OR, inverso) - logical AND: && - logical OR: || - reverse: ! - - ```bash - Shell > cat /etc/services | awk '/[^0-9a-zA-Z]1[1-9]{2}\/tcp/ && /175/ {print $0}' - vmnet 175/tcp # VMNET - ``` - - ```bash - Shell > cat /etc/services | awk '/[^0-9a-zA-Z]9[1-9]{2}\/tcp/ || /91{2}\/tcp/ {print $0}' - telnets 992/tcp - imaps 993/tcp # IMAP over SSL - pop3s 995/tcp # POP-3 over SSL - mtp 1911/tcp # - rndc 953/tcp # rndc control sockets (BIND 9) - xact-backup 911/tcp # xact-backup - apex-mesh 912/tcp # APEX relay-relay service - apex-edge 913/tcp # APEX endpoint-relay service - ftps-data 989/tcp # ftp protocol, data, over TLS/SSL - nas 991/tcp # Netnews Administration System - vsinet 996/tcp # vsinet - maitrd 997/tcp # - busboy 998/tcp # - garcon 999/tcp # - #puprouter 999/tcp # - blockade 2911/tcp # Blockade - prnstatus 3911/tcp # Printer Status Port - cpdlc 5911/tcp # Controller Pilot Data Link Communication - manyone-xml 8911/tcp # manyone-xml - sype-transport 9911/tcp # SYPECom Transport Protocol - ``` - - ```bash - Shell > cat /etc/services | awk '!/(tcp)|(udp)/ {print $0}' - discard 9/sctp # Discard - discard 9/dccp # Discard SC:DISC - ftp-data 20/sctp # FTP - ftp 21/sctp # FTP - ssh 22/sctp # SSH - exp1 1021/sctp # RFC3692-style Experiment 1 (*) [RFC4727] - exp1 1021/dccp # RFC3692-style Experiment 1 (*) [RFC4727] - exp2 1022/sctp # RFC3692-style Experiment 2 (*) [RFC4727] - exp2 1022/dccp # RFC3692-style Experiment 2 (*) [RFC4727] - ltp-deepspace 1113/dccp # Licklider Transmission Protocol - cisco-ipsla 1167/sctp # Cisco IP SLAs Control Protocol - rcip-itu 2225/sctp # Resource Connection Initiation Protocol - m2ua 2904/sctp # M2UA - m3ua 2905/sctp # M3UA - megaco-h248 2944/sctp # Megaco-H.248 text - ... - ``` + logical AND: && + logical OR: || + reverse: ! + + ```bash + Shell > cat /etc/services | awk '/[^0-9a-zA-Z]1[1-9]{2}\/tcp/ && /175/ {print $0}' + vmnet 175/tcp # VMNET + ``` + + ```bash + Shell > cat /etc/services | awk '/[^0-9a-zA-Z]9[1-9]{2}\/tcp/ || /91{2}\/tcp/ {print $0}' + telnets 992/tcp + imaps 993/tcp # IMAP over SSL + pop3s 995/tcp # POP-3 over SSL + mtp 1911/tcp # + rndc 953/tcp # rndc control sockets (BIND 9) + xact-backup 911/tcp # xact-backup + apex-mesh 912/tcp # APEX relay-relay service + apex-edge 913/tcp # APEX endpoint-relay service + ftps-data 989/tcp # ftp protocol, data, over TLS/SSL + nas 991/tcp # Netnews Administration System + vsinet 996/tcp # vsinet + maitrd 997/tcp # + busboy 998/tcp # + garcon 999/tcp # + #puprouter 999/tcp # + blockade 2911/tcp # Blockade + prnstatus 3911/tcp # Printer Status Port + cpdlc 5911/tcp # Controller Pilot Data Link Communication + manyone-xml 8911/tcp # manyone-xml + sype-transport 9911/tcp # SYPECom Transport Protocol + ``` + + ```bash + Shell > cat /etc/services | awk '!/(tcp)|(udp)/ {print $0}' + discard 9/sctp # Discard + discard 9/dccp # Discard SC:DISC + ftp-data 20/sctp # FTP + ftp 21/sctp # FTP + ssh 22/sctp # SSH + exp1 1021/sctp # RFC3692-style Experiment 1 (*) [RFC4727] + exp1 1021/dccp # RFC3692-style Experiment 1 (*) [RFC4727] + exp2 1022/sctp # RFC3692-style Experiment 2 (*) [RFC4727] + exp2 1022/dccp # RFC3692-style Experiment 2 (*) [RFC4727] + ltp-deepspace 1113/dccp # Licklider Transmission Protocol + cisco-ipsla 1167/sctp # Cisco IP SLAs Control Protocol + rcip-itu 2225/sctp # Resource Connection Initiation Protocol + m2ua 2904/sctp # M2UA + m3ua 2905/sctp # M3UA + megaco-h248 2944/sctp # Megaco-H.248 text + ... + ``` 9. Individua le righe consecutive per stringa e le stampa - ```bash - Shell > cat /etc/services | awk '/^ntp/,/^netbios/ {print $0}' - ntp 123/tcp - ntp 123/udp # Network Time Protocol - netbios-ns 137/tcp # NETBIOS Name Service - ``` + ```bash + Shell > cat /etc/services | awk '/^ntp/,/^netbios/ {print $0}' + ntp 123/tcp + ntp 123/udp # Network Time Protocol + netbios-ns 137/tcp # NETBIOS Name Service + ``` - !!! info "Informazione" + !!! info "Informazione" - ``` - Intervallo iniziale: interrompe l'abbinamento quando la prima corrispondenza è riscontrata. - Intervallo finale: interrompe l'abbinamento quando la prima corrispondenza è riscontrata. - ``` + ``` + Intervallo iniziale: interrompe l'abbinamento quando la prima corrispondenza è riscontrata. + Intervallo finale: interrompe l'abbinamento quando la prima corrispondenza è riscontrata. + ``` ## Variabile incorporata {#VARIABLES} @@ -499,311 +499,311 @@ ID Name 1. FS e OFS - ```bash - Shell > cat /etc/passwd | awk 'BEGIN{FS=":"}{print $1}' - root - bin - daemon - adm - lp - sync - ``` - - Si può anche usare l'opzione -v per assegnare valori alle variabili. - - ```bash - Shell > cat /etc/passwd | awk -v FS=":" '{print $1}' - root - bin - daemon - adm - lp - sync - ``` - - Il delimitatore di output predefinito è uno spazio quando si usano le virgole per fare riferimento a più campi. È tuttavia possibile specificare separatamente il delimitatore di uscita. - - ```bash - Shell > cat /etc/passwd | awk 'BEGIN{FS=":"}{print $1,$2}' - root x - bin x - daemon x - adm x - lp x - ``` - - ```bash - Shell > cat /etc/passwd | awk 'BEGIN{FS=":";OFS="\t"}{print $1,$2}' - # or - Shell > cat /etc/passwd | awk -v FS=":" -v OFS="\t" '{print $1,$2}' - root x - bin x - daemon x - adm x - lp x - ``` + ```bash + Shell > cat /etc/passwd | awk 'BEGIN{FS=":"}{print $1}' + root + bin + daemon + adm + lp + sync + ``` -2. RS e ORS + Si può anche usare l'opzione -v per assegnare valori alle variabili. - Per impostazione predefinita, `awk` utilizza i caratteri di newline per distinguere ogni record di riga + ```bash + Shell > cat /etc/passwd | awk -v FS=":" '{print $1}' + root + bin + daemon + adm + lp + sync + ``` - ```bash - Shell > echo -e "https://example.com/books/index.html\ntitle//tcp" - https://example.com/books/index.html - title//tcp + Il delimitatore di output predefinito è uno spazio quando si usano le virgole per fare riferimento a più campi. È tuttavia possibile specificare separatamente il delimitatore di uscita. - Shell > echo -e "https://example.com/books/index.html\ntitle//tcp" | awk 'BEGIN{RS="\/\/";ORS="%%"}{print $0}' - awk: cmd. line:1: warning: escape sequence `\/' treated as plain `/' - https:%%example.com/books/index.html - title%%tcp - %% ← Why? Because "print" - ``` + ```bash + Shell > cat /etc/passwd | awk 'BEGIN{FS=":"}{print $1,$2}' + root x + bin x + daemon x + adm x + lp x + ``` + + ```bash + Shell > cat /etc/passwd | awk 'BEGIN{FS=":";OFS="\t"}{print $1,$2}' + # or + Shell > cat /etc/passwd | awk -v FS=":" -v OFS="\t" '{print $1,$2}' + root x + bin x + daemon x + adm x + lp x + ``` + +2. RS e ORS + + Per impostazione predefinita, `awk` utilizza i caratteri di newline per distinguere ogni record di riga + + ```bash + Shell > echo -e "https://example.com/books/index.html\ntitle//tcp" + https://example.com/books/index.html + title//tcp + + Shell > echo -e "https://example.com/books/index.html\ntitle//tcp" | awk 'BEGIN{RS="\/\/";ORS="%%"}{print $0}' + awk: cmd. line:1: warning: escape sequence `\/' treated as plain `/' + https:%%example.com/books/index.html + title%%tcp + %% ← Why? Because "print" + ``` 3. NF - Conta il numero di campi per riga nel testo corrente - - ```bash - Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {print NF}' - 7 - 7 - 7 - 7 - 7 - ``` - - Stampa il quinto campo - - ```bash - Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {print $(NF-2)}' - root - bin - daemon - adm - lp - ``` - - Stampa l'ultimo campo - - ```bash - Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {print $NF}' - /bin/bash - /sbin/nologin - /sbin/nologin - /sbin/nologin - /sbin/nologin - ``` - - Escludere gli ultimi due campi - - ```bash - Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {$NF=" ";$(NF-1)=" ";print $0}' - root x 0 0 root - bin x 1 1 bin - daemon x 2 2 daemon - adm x 3 4 adm - lp x 4 7 lp - ``` - - Escludere il primo campo - - ```bash - Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {$1=" ";print $0}' | sed -r 's/(^ )//g' - x 0 0 root /root /bin/bash - x 1 1 bin /bin /sbin/nologin - x 2 2 daemon /sbin /sbin/nologin - x 3 4 adm /var/adm /sbin/nologin - x 4 7 lp /var/spool/lpd /sbin/nologin - ``` + Conta il numero di campi per riga nel testo corrente + + ```bash + Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {print NF}' + 7 + 7 + 7 + 7 + 7 + ``` + + Stampa il quinto campo + + ```bash + Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {print $(NF-2)}' + root + bin + daemon + adm + lp + ``` + + Stampa l'ultimo campo + + ```bash + Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {print $NF}' + /bin/bash + /sbin/nologin + /sbin/nologin + /sbin/nologin + /sbin/nologin + ``` + + Escludere gli ultimi due campi + + ```bash + Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {$NF=" ";$(NF-1)=" ";print $0}' + root x 0 0 root + bin x 1 1 bin + daemon x 2 2 daemon + adm x 3 4 adm + lp x 4 7 lp + ``` + + Escludere il primo campo + + ```bash + Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {$1=" ";print $0}' | sed -r 's/(^ )//g' + x 0 0 root /root /bin/bash + x 1 1 bin /bin /sbin/nologin + x 2 2 daemon /sbin /sbin/nologin + x 3 4 adm /var/adm /sbin/nologin + x 4 7 lp /var/spool/lpd /sbin/nologin + ``` 4. NR e FNR - ```bash - Shell > tail -n 5 /etc/services | awk '{print NR,$0}' - 1 axio-disc 35100/udp # Axiomatic discovery protocol - 2 pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - 3 cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - 4 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - 5 spremotetablet 46998/tcp # Capture handwritten signatures - ``` - - Stampa il numero totale di righe del contenuto del file - - ```bash - Shell > cat /etc/services | awk 'END{print NR}' - 11473 - ``` - - Stampa il contenuto della riga 200 - - ```bash - Shell > cat /etc/services | awk 'NR==200' - microsoft-ds 445/tcp - ``` - - Stampa il secondo campo alla riga 200 - - ```bash - Shell > cat /etc/services | awk 'BEGIN{RS="\n";ORS="\n"} NR==200 {print $2}' - 445/tcp - ``` - - Stampa di contenuti entro un intervallo specifico - - ```bash - Shell > cat /etc/services | awk 'BEGIN{RS="\n";ORS="\n"} NR<=10 {print NR,$0}' - 1 # /etc/services: - 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ - 3 # - 4 # Network services, Internet style - 5 # IANA services version: last updated 2016-07-08 - 6 # - 7 # Note that it is presently the policy of IANA to assign a single well-known - 8 # port number for both TCP and UDP; hence, most entries here have two entries - 9 # even if the protocol doesn't support UDP operations. - 10 # Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports - ``` - - Confronto tra NR e FNR - - ```bash - Shell > head -n 3 /etc/services > /tmp/a.txt - - Shell > cat /tmp/a.txt - # /etc/services: - # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ - # - - Shell > cat /etc/resolv.conf - # Generated by NetworkManager - nameserver 8.8.8.8 - nameserver 114.114.114.114 - - Shell > awk '{print NR,$0}' /tmp/a.txt /etc/resolv.conf - 1 # /etc/services: - 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ - 3 # - 4 # Generated by NetworkManager - 5 nameserver 8.8.8.8 - 6 nameserver 114.114.114.114 - - Shell > awk '{print FNR,$0}' /tmp/a.txt /etc/resolv.conf - 1 # /etc/services: - 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ - 3 # - 1 # Generated by NetworkManager - 2 nameserver 8.8.8.8 - 3 nameserver 114.114.114.114 - ``` + ```bash + Shell > tail -n 5 /etc/services | awk '{print NR,$0}' + 1 axio-disc 35100/udp # Axiomatic discovery protocol + 2 pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + 3 cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + 4 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + 5 spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + Stampa il numero totale di righe del contenuto del file + + ```bash + Shell > cat /etc/services | awk 'END{print NR}' + 11473 + ``` + + Stampa il contenuto della riga 200 + + ```bash + Shell > cat /etc/services | awk 'NR==200' + microsoft-ds 445/tcp + ``` + + Stampa il secondo campo alla riga 200 + + ```bash + Shell > cat /etc/services | awk 'BEGIN{RS="\n";ORS="\n"} NR==200 {print $2}' + 445/tcp + ``` + + Stampa di contenuti entro un intervallo specifico + + ```bash + Shell > cat /etc/services | awk 'BEGIN{RS="\n";ORS="\n"} NR<=10 {print NR,$0}' + 1 # /etc/services: + 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ + 3 # + 4 # Network services, Internet style + 5 # IANA services version: last updated 2016-07-08 + 6 # + 7 # Note that it is presently the policy of IANA to assign a single well-known + 8 # port number for both TCP and UDP; hence, most entries here have two entries + 9 # even if the protocol doesn't support UDP operations. + 10 # Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports + ``` + + Confronto tra NR e FNR + + ```bash + Shell > head -n 3 /etc/services > /tmp/a.txt + + Shell > cat /tmp/a.txt + # /etc/services: + # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ + # + + Shell > cat /etc/resolv.conf + # Generated by NetworkManager + nameserver 8.8.8.8 + nameserver 114.114.114.114 + + Shell > awk '{print NR,$0}' /tmp/a.txt /etc/resolv.conf + 1 # /etc/services: + 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ + 3 # + 4 # Generated by NetworkManager + 5 nameserver 8.8.8.8 + 6 nameserver 114.114.114.114 + + Shell > awk '{print FNR,$0}' /tmp/a.txt /etc/resolv.conf + 1 # /etc/services: + 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ + 3 # + 1 # Generated by NetworkManager + 2 nameserver 8.8.8.8 + 3 nameserver 114.114.114.114 + ``` 5. ARGC e ARGV - ```bash - Shell > awk 'BEGIN{print ARGC}' log dump long - 4 - Shell > awk 'BEGIN{print ARGV[0]}' log dump long - awk - Shell > awk 'BEGIN{print ARGV[1]}' log dump long - log - Shell > awk 'BEGIN{print ARGV[2]}' log dump long - dump - ``` + ```bash + Shell > awk 'BEGIN{print ARGC}' log dump long + 4 + Shell > awk 'BEGIN{print ARGV[0]}' log dump long + awk + Shell > awk 'BEGIN{print ARGV[1]}' log dump long + log + Shell > awk 'BEGIN{print ARGV[2]}' log dump long + dump + ``` 6. ARGIND - Questa variabile è usata principalmente per determinare il file su cui sta lavorando il programma `awk`. + Questa variabile è usata principalmente per determinare il file su cui sta lavorando il programma `awk`. - ```bash - Shell > awk '{print ARGIND,$0}' /etc/hostname /etc/resolv.conf - 1 Master - 2 # Generated by NetworkManager - 2 nameserver 8.8.8.8 - 2 nameserver 114.114.114.114 - ``` + ```bash + Shell > awk '{print ARGIND,$0}' /etc/hostname /etc/resolv.conf + 1 Master + 2 # Generated by NetworkManager + 2 nameserver 8.8.8.8 + 2 nameserver 114.114.114.114 + ``` 7. ENVIRON - Nei programmi `awk` è possibile fare riferimento a sistemi operativi o a variabili definite dall'utente. - - ```bash - Shell > echo ${SSH_CLIENT} - 192.168.100.2 6969 22 - - Shell > awk 'BEGIN{print ENVIRON["SSH_CLIENT"]}' - 192.168.100.2 6969 22 + Nei programmi `awk` è possibile fare riferimento a sistemi operativi o a variabili definite dall'utente. - Shell > export a=123 - Shell > env | grep -w a - a=123 - Shell > awk 'BEGIN{print ENVIRON["a"]}' - 123 - Shell > unset a - ``` + ```bash + Shell > echo ${SSH_CLIENT} + 192.168.100.2 6969 22 + + Shell > awk 'BEGIN{print ENVIRON["SSH_CLIENT"]}' + 192.168.100.2 6969 22 + + Shell > export a=123 + Shell > env | grep -w a + a=123 + Shell > awk 'BEGIN{print ENVIRON["a"]}' + 123 + Shell > unset a + ``` 8. FILENAME - ```bash - Shell > awk 'BEGIN{RS="\n";ORS="\n"} NR=FNR {print ARGIND,FILENAME"---"$0}' /etc/hostname /etc/resolv.conf /etc/rocky-release - 1 /etc/hostname---Master - 2 /etc/resolv.conf---# Generated by NetworkManager - 2 /etc/resolv.conf---nameserver 8.8.8.8 - 2 /etc/resolv.conf---nameserver 114.114.114.114 - 3 /etc/rocky-release---Rocky Linux release 8.9 (Green Obsidian) - ``` + ```bash + Shell > awk 'BEGIN{RS="\n";ORS="\n"} NR=FNR {print ARGIND,FILENAME"---"$0}' /etc/hostname /etc/resolv.conf /etc/rocky-release + 1 /etc/hostname---Master + 2 /etc/resolv.conf---# Generated by NetworkManager + 2 /etc/resolv.conf---nameserver 8.8.8.8 + 2 /etc/resolv.conf---nameserver 114.114.114.114 + 3 /etc/rocky-release---Rocky Linux release 8.9 (Green Obsidian) + ``` 9. IGNORECASE - Questa variabile è utile se si vogliono usare le espressioni regolari in `awk` e ignorare il caso. - - ```bash - Shell > awk 'BEGIN{IGNORECASE=1;RS="\n";ORS="\n"} /^(SSH)|^(ftp)/ {print $0}' /etc/services - ftp-data 20/tcp - ftp-data 20/udp - ftp 21/tcp - ftp 21/udp fsp fspd - ssh 22/tcp # The Secure Shell (SSH) Protocol - ssh 22/udp # The Secure Shell (SSH) Protocol - ftp-data 20/sctp # FTP - ftp 21/sctp # FTP - ssh 22/sctp # SSH - ftp-agent 574/tcp # FTP Software Agent System - ftp-agent 574/udp # FTP Software Agent System - sshell 614/tcp # SSLshell - sshell 614/udp # SSLshell - ftps-data 989/tcp # ftp protocol, data, over TLS/SSL - ftps-data 989/udp # ftp protocol, data, over TLS/SSL - ftps 990/tcp # ftp protocol, control, over TLS/SSL - ftps 990/udp # ftp protocol, control, over TLS/SSL - ssh-mgmt 17235/tcp # SSH Tectia Manager - ssh-mgmt 17235/udp # SSH Tectia Manager - ``` - - ```bash - Shell > awk 'BEGIN{IGNORECASE=1;RS="\n";ORS="\n"} /^(SMTP)\s/,/^(TFTP)\s/ {print $0}' /etc/services - smtp 25/tcp mail - smtp 25/udp mail - time 37/tcp timserver - time 37/udp timserver - rlp 39/tcp resource # resource location - rlp 39/udp resource # resource location - nameserver 42/tcp name # IEN 116 - nameserver 42/udp name # IEN 116 - nicname 43/tcp whois - nicname 43/udp whois - tacacs 49/tcp # Login Host Protocol (TACACS) - tacacs 49/udp # Login Host Protocol (TACACS) - re-mail-ck 50/tcp # Remote Mail Checking Protocol - re-mail-ck 50/udp # Remote Mail Checking Protocol - domain 53/tcp # name-domain server - domain 53/udp - whois++ 63/tcp whoispp - whois++ 63/udp whoispp - bootps 67/tcp # BOOTP server - bootps 67/udp - bootpc 68/tcp dhcpc # BOOTP client - bootpc 68/udp dhcpc - tftp 69/tcp - ``` + Questa variabile è utile se si vogliono usare le espressioni regolari in `awk` e ignorare il caso. + + ```bash + Shell > awk 'BEGIN{IGNORECASE=1;RS="\n";ORS="\n"} /^(SSH)|^(ftp)/ {print $0}' /etc/services + ftp-data 20/tcp + ftp-data 20/udp + ftp 21/tcp + ftp 21/udp fsp fspd + ssh 22/tcp # The Secure Shell (SSH) Protocol + ssh 22/udp # The Secure Shell (SSH) Protocol + ftp-data 20/sctp # FTP + ftp 21/sctp # FTP + ssh 22/sctp # SSH + ftp-agent 574/tcp # FTP Software Agent System + ftp-agent 574/udp # FTP Software Agent System + sshell 614/tcp # SSLshell + sshell 614/udp # SSLshell + ftps-data 989/tcp # ftp protocol, data, over TLS/SSL + ftps-data 989/udp # ftp protocol, data, over TLS/SSL + ftps 990/tcp # ftp protocol, control, over TLS/SSL + ftps 990/udp # ftp protocol, control, over TLS/SSL + ssh-mgmt 17235/tcp # SSH Tectia Manager + ssh-mgmt 17235/udp # SSH Tectia Manager + ``` + + ```bash + Shell > awk 'BEGIN{IGNORECASE=1;RS="\n";ORS="\n"} /^(SMTP)\s/,/^(TFTP)\s/ {print $0}' /etc/services + smtp 25/tcp mail + smtp 25/udp mail + time 37/tcp timserver + time 37/udp timserver + rlp 39/tcp resource # resource location + rlp 39/udp resource # resource location + nameserver 42/tcp name # IEN 116 + nameserver 42/udp name # IEN 116 + nicname 43/tcp whois + nicname 43/udp whois + tacacs 49/tcp # Login Host Protocol (TACACS) + tacacs 49/udp # Login Host Protocol (TACACS) + re-mail-ck 50/tcp # Remote Mail Checking Protocol + re-mail-ck 50/udp # Remote Mail Checking Protocol + domain 53/tcp # name-domain server + domain 53/udp + whois++ 63/tcp whoispp + whois++ 63/udp whoispp + bootps 67/tcp # BOOTP server + bootps 67/udp + bootpc 68/tcp dhcpc # BOOTP client + bootpc 68/udp dhcpc + tftp 69/tcp + ``` ## Operatore @@ -847,336 +847,336 @@ False 1. Punto esclamativo - Stampa le righe dispari: - - ```bash - Shell > seq 1 10 | awk 'i=!i {print $0}' - 1 - 3 - 5 - 7 - 9 - ``` - - !!! domanda - - ``` - **Perché?** - **Leggi la prima riga**: Perché "i" non ha un valore assegnato, quindi "i=!i" indica TRUE. - **Leggi la seconda riga**: A questo punto, "i=!i" indica FALSE. - E così via, la riga stampata finale è un numero dispari. - ``` - - Stampare le righe pari: - - ```bash - Shell > seq 1 10 | awk '!(i=!i)' - # or - Shell > seq 1 10 | awk '!(i=!i) {print $0}' - 2 - 4 - 6 - 8 - 10 - ``` - - !!! note "Nota" - - ``` - Come si può vedere, a volte si può ignorare la sintassi della parte "action", che per impostazione predefinita è equivalente a "{print $0}". - ``` + Stampa le righe dispari: + + ```bash + Shell > seq 1 10 | awk 'i=!i {print $0}' + 1 + 3 + 5 + 7 + 9 + ``` + + !!! domanda + + ``` + **Perché?** + **Leggi la prima riga**: Perché "i" non ha un valore assegnato, quindi "i=!i" indica TRUE. + **Leggi la seconda riga**: A questo punto, "i=!i" indica FALSE. + E così via, la riga stampata finale è un numero dispari. + ``` + + Stampare le righe pari: + + ```bash + Shell > seq 1 10 | awk '!(i=!i)' + # or + Shell > seq 1 10 | awk '!(i=!i) {print $0}' + 2 + 4 + 6 + 8 + 10 + ``` + + !!! note "Nota" + + ``` + Come si può vedere, a volte si può ignorare la sintassi della parte "action", che per impostazione predefinita è equivalente a "{print $0}". + ``` 2. Inversione - ```bash - Shell > cat /etc/services | awk '!/(tcp)|(udp)|(^#)|(^$)/ {print $0}' - http 80/sctp # HyperText Transfer Protocol - bgp 179/sctp - https 443/sctp # http protocol over TLS/SSL - h323hostcall 1720/sctp # H.323 Call Control - nfs 2049/sctp nfsd shilp # Network File System - rtmp 1/ddp # Routing Table Maintenance Protocol - nbp 2/ddp # Name Binding Protocol - echo 4/ddp # AppleTalk Echo Protocol - zip 6/ddp # Zone Information Protocol - discard 9/sctp # Discard - discard 9/dccp # Discard SC:DISC - ... - ``` + ```bash + Shell > cat /etc/services | awk '!/(tcp)|(udp)|(^#)|(^$)/ {print $0}' + http 80/sctp # HyperText Transfer Protocol + bgp 179/sctp + https 443/sctp # http protocol over TLS/SSL + h323hostcall 1720/sctp # H.323 Call Control + nfs 2049/sctp nfsd shilp # Network File System + rtmp 1/ddp # Routing Table Maintenance Protocol + nbp 2/ddp # Name Binding Protocol + echo 4/ddp # AppleTalk Echo Protocol + zip 6/ddp # Zone Information Protocol + discard 9/sctp # Discard + discard 9/dccp # Discard SC:DISC + ... + ``` 3. Operazioni di base in matematica - ```bash - Shell > echo -e "36\n40\n50" | awk '{print $0+1}' - 37 - 41 - - Shell > echo -e "30\t5\t8\n11\t20\t34" - 30 5 8 - 11 20 34 - Shell > echo -e "30\t5\t8\n11\t20\t34" | awk '{print $2*2+1}' - 11 - 41 - ``` - - Può essere utilizzato anche nel "modello": - - ```bash - Shell > cat -n /etc/services | awk '/^[1-9]*/ && $1%2==0 {print $0}' - ... - 24 tcpmux 1/udp # TCP port service multiplexer - 26 rje 5/udp # Remote Job Entry - 28 echo 7/udp - 30 discard 9/udp sink null - 32 systat 11/udp users - 34 daytime 13/udp - 36 qotd 17/udp quote - ... - - Shell > cat -n /etc/services | awk '/^[1-9]*/ && $1%2!=0 {print $0}' - ... - 23 tcpmux 1/tcp # TCP port service multiplexer - 25 rje 5/tcp # Remote Job Entry - 27 echo 7/tcp - 29 discard 9/tcp sink null - 31 systat 11/tcp users - ... - ``` + ```bash + Shell > echo -e "36\n40\n50" | awk '{print $0+1}' + 37 + 41 + + Shell > echo -e "30\t5\t8\n11\t20\t34" + 30 5 8 + 11 20 34 + Shell > echo -e "30\t5\t8\n11\t20\t34" | awk '{print $2*2+1}' + 11 + 41 + ``` + + Può essere utilizzato anche nel "modello": + + ```bash + Shell > cat -n /etc/services | awk '/^[1-9]*/ && $1%2==0 {print $0}' + ... + 24 tcpmux 1/udp # TCP port service multiplexer + 26 rje 5/udp # Remote Job Entry + 28 echo 7/udp + 30 discard 9/udp sink null + 32 systat 11/udp users + 34 daytime 13/udp + 36 qotd 17/udp quote + ... + + Shell > cat -n /etc/services | awk '/^[1-9]*/ && $1%2!=0 {print $0}' + ... + 23 tcpmux 1/tcp # TCP port service multiplexer + 25 rje 5/tcp # Remote Job Entry + 27 echo 7/tcp + 29 discard 9/tcp sink null + 31 systat 11/tcp users + ... + ``` 4. Simbolo pipe - È possibile utilizzare il comando bash nel programma awk, ad esempio: + È possibile utilizzare il comando bash nel programma awk, ad esempio: - ```bash - Shell > echo -e "6\n3\n9\n8" | awk '{print $0 | "sort"}' - 3 - 6 - 8 - 9 - ``` + ```bash + Shell > echo -e "6\n3\n9\n8" | awk '{print $0 | "sort"}' + 3 + 6 + 8 + 9 + ``` - !!! info "Informazione" + !!! info "Informazione" - ``` - Fate attenzione! È necessario utilizzare le doppie virgolette per includere il comando. - ``` + ``` + Fate attenzione! È necessario utilizzare le doppie virgolette per includere il comando. + ``` 5. Espressione regolare - [Qui](#RE), vengono trattati esempi di base di espressioni regolari. È possibile utilizzare le espressioni regolari sui record di riga. - - ```bash - Shell > cat /etc/services | awk '/[^0-9a-zA-Z]1[1-9]{2}\/tcp/ {print $0}' + [Qui](#RE), vengono trattati esempi di base di espressioni regolari. È possibile utilizzare le espressioni regolari sui record di riga. - # Equivalente a: + ```bash + Shell > cat /etc/services | awk '/[^0-9a-zA-Z]1[1-9]{2}\/tcp/ {print $0}' - Shell > cat /etc/services | awk '$0~/[^0-9a-zA-Z]1[1-9]{2}\/tcp/ {print $0}' - ``` + # Equivalente a: - Se il file contiene una grande quantità di testo, è possibile utilizzare le espressioni regolari anche per i campi, per migliorare l'efficienza dell'elaborazione. L'esempio di utilizzo è il seguente: + Shell > cat /etc/services | awk '$0~/[^0-9a-zA-Z]1[1-9]{2}\/tcp/ {print $0}' + ``` - ```bash - Shell > cat /etc/services | awk '$0~/^(ssh)/ && $2~/tcp/ {print $0}' - ssh 22/tcp # The Secure Shell (SSH) Protocol - sshell 614/tcp # SSLshell - ssh-mgmt 17235/tcp # SSH Tectia Manager + Se il file contiene una grande quantità di testo, è possibile utilizzare le espressioni regolari anche per i campi, per migliorare l'efficienza dell'elaborazione. L'esempio di utilizzo è il seguente: - Shell > cat /etc/services | grep -v -E "(^#)|(^$)" | awk '$2!~/(tcp)|(udp)/ {print $0}' - http 80/sctp # HyperText Transfer Protocol - bgp 179/sctp - https 443/sctp # http protocol over TLS/SSL - h323hostcall 1720/sctp # H.323 Call Control - nfs 2049/sctp nfsd shilp # Network File System - rtmp 1/ddp # Routing Table Maintenance Protocol - nbp 2/ddp # Name Binding Protocol - ... - ``` + ```bash + Shell > cat /etc/services | awk '$0~/^(ssh)/ && $2~/tcp/ {print $0}' + ssh 22/tcp # The Secure Shell (SSH) Protocol + sshell 614/tcp # SSLshell + ssh-mgmt 17235/tcp # SSH Tectia Manager + + Shell > cat /etc/services | grep -v -E "(^#)|(^$)" | awk '$2!~/(tcp)|(udp)/ {print $0}' + http 80/sctp # HyperText Transfer Protocol + bgp 179/sctp + https 443/sctp # http protocol over TLS/SSL + h323hostcall 1720/sctp # H.323 Call Control + nfs 2049/sctp nfsd shilp # Network File System + rtmp 1/ddp # Routing Table Maintenance Protocol + nbp 2/ddp # Name Binding Protocol + ... + ``` ## Controllo del flusso 1. Istruzione **if** - Il formato della sintassi di base è: `dichiarazione if (condizione) [ dichiarazione else ]` - - Esempio di utilizzo di un ramo singolo di un'istruzione if: - - ```bash - Shell > cat /etc/services | awk '{if(NR==110) print $0}' - pop3 110/udp pop-3 - ``` - - La condizione viene determinata come espressione regolare: - - ```bash - Shell > cat /etc/services | awk '{if(/^(ftp)\s|^(ssh)\s/) print $0}' - ftp 21/tcp - ftp 21/udp fsp fspd - ssh 22/tcp # The Secure Shell (SSH) Protocol - ssh 22/udp # The Secure Shell (SSH) Protocol - ftp 21/sctp # FTP - ssh 22/sctp # SSH - ``` - - Ramo doppio: - - ```bash - Shell > seq 1 10 | awk '{if($0==10) print $0 ; else print "False"}' - False - False - False - False - False - False - False - False - False - 10 - ``` - - Rami multipli: - - ```bash - Shell > cat /etc/services | awk '{ \ - if($1~/netbios/) - {print $0} - else if($2~/175/) - {print "175"} - else if($2~/137/) - {print "137"} - else {print "no"} - }' - ``` + Il formato della sintassi di base è: `dichiarazione if (condizione) [ dichiarazione else ]` + + Esempio di utilizzo di un ramo singolo di un'istruzione if: + + ```bash + Shell > cat /etc/services | awk '{if(NR==110) print $0}' + pop3 110/udp pop-3 + ``` + + La condizione viene determinata come espressione regolare: + + ```bash + Shell > cat /etc/services | awk '{if(/^(ftp)\s|^(ssh)\s/) print $0}' + ftp 21/tcp + ftp 21/udp fsp fspd + ssh 22/tcp # The Secure Shell (SSH) Protocol + ssh 22/udp # The Secure Shell (SSH) Protocol + ftp 21/sctp # FTP + ssh 22/sctp # SSH + ``` + + Ramo doppio: + + ```bash + Shell > seq 1 10 | awk '{if($0==10) print $0 ; else print "False"}' + False + False + False + False + False + False + False + False + False + 10 + ``` + + Rami multipli: + + ```bash + Shell > cat /etc/services | awk '{ \ + if($1~/netbios/) + {print $0} + else if($2~/175/) + {print "175"} + else if($2~/137/) + {print "137"} + else {print "no"} + }' + ``` 2. Istruzione **while** - Il formato della sintassi di base è - `while (condizione) statement` - - Eseguire l'attraversamento e la stampa dei campi di tutti i record di riga. - - ```bash - Shell > tail -n 2 /etc/services - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > tail -n 2 /etc/services | awk '{ \ - i=1; - while(i<=NF){print $i;i++} - }' - - cloudcheck - 45514/tcp - # - ASSIA - CloudCheck - WiFi - Management - System - spremotetablet - 46998/tcp - # - Capture - handwritten - signatures - ``` + Il formato della sintassi di base è - `while (condizione) statement` + + Eseguire l'attraversamento e la stampa dei campi di tutti i record di riga. + + ```bash + Shell > tail -n 2 /etc/services + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + + Shell > tail -n 2 /etc/services | awk '{ \ + i=1; + while(i<=NF){print $i;i++} + }' + + cloudcheck + 45514/tcp + # + ASSIA + CloudCheck + WiFi + Management + System + spremotetablet + 46998/tcp + # + Capture + handwritten + signatures + ``` 3. Istruzione **for** - Il formato della sintassi di base è - `for (expr1; expr2; expr3) dichiarazione` - - Eseguire l'attraversamento e la stampa dei campi di tutti i record di riga. - - ```bash - Shell > tail -n 2 /etc/services | awk '{ \ - for(i=1;i<=NF;i++) print $i - }' - ``` - - Stampa i campi di ogni riga di record in ordine inverso. - - ```bash - Shell > tail -n 2 /etc/services | awk '{ \ - for(i=NF;i>=1;i--) print $i - }' - - System - Management - WiFi - CloudCheck - ASSIA - # - 45514/tcp - cloudcheck - signatures - handwritten - Capture - # - 46998/tcp - spremotetablet - ``` - - Stampa ogni riga di record in direzione opposta. - - ```bash - Shell > tail -n 2 /etc/services | awk '{ \ - for(i=NF;i>=1;i--) {printf $i" "}; - print "" - }' - - System Management WiFi CloudCheck ASSIA # 45514/tcp cloudcheck - signatures handwritten Capture # 46998/tcp spremotetablet - ``` + Il formato della sintassi di base è - `for (expr1; expr2; expr3) dichiarazione` + + Eseguire l'attraversamento e la stampa dei campi di tutti i record di riga. + + ```bash + Shell > tail -n 2 /etc/services | awk '{ \ + for(i=1;i<=NF;i++) print $i + }' + ``` + + Stampa i campi di ogni riga di record in ordine inverso. + + ```bash + Shell > tail -n 2 /etc/services | awk '{ \ + for(i=NF;i>=1;i--) print $i + }' + + System + Management + WiFi + CloudCheck + ASSIA + # + 45514/tcp + cloudcheck + signatures + handwritten + Capture + # + 46998/tcp + spremotetablet + ``` + + Stampa ogni riga di record in direzione opposta. + + ```bash + Shell > tail -n 2 /etc/services | awk '{ \ + for(i=NF;i>=1;i--) {printf $i" "}; + print "" + }' + + System Management WiFi CloudCheck ASSIA # 45514/tcp cloudcheck + signatures handwritten Capture # 46998/tcp spremotetablet + ``` 4. Dichiarazione **break** e dichiarazione **continue**. - Il confronto tra i due è il seguente: - - ```bash - Shell > awk 'BEGIN{ \ - for(i=1;i<=10;i++) - { - if(i==3) {break}; - print i - } - }' - - 1 - 2 - ``` - - ```bash - Shell > awk 'BEGIN{ \ - for(i=1;i<=10;i++) - { - if(i==3) {continue}; - print i - } - }' - - 1 - 2 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - ``` + Il confronto tra i due è il seguente: + + ```bash + Shell > awk 'BEGIN{ \ + for(i=1;i<=10;i++) + { + if(i==3) {break}; + print i + } + }' + + 1 + 2 + ``` + + ```bash + Shell > awk 'BEGIN{ \ + for(i=1;i<=10;i++) + { + if(i==3) {continue}; + print i + } + }' + + 1 + 2 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + ``` 5. Istruzione **exit** - È possibile specificare un valore di ritorno nell'intervallo [0,255]. + È possibile specificare un valore di ritorno nell'intervallo [0,255]. - Il formato della sintassi di base è - `exit [espressione]` + Il formato della sintassi di base è - `exit [espressione]` - ```bash - Shell > seq 1 10 | awk '{ - if($0~/5/) exit "135" - }' + ```bash + Shell > seq 1 10 | awk '{ + if($0~/5/) exit "135" + }' - Shell > echo $? - 135 - ``` + Shell > echo $? + 135 + ``` ## Array @@ -1190,277 +1190,277 @@ Come la maggior parte dei linguaggi di programmazione, `awk` supporta anche gli 1. Array personalizzato - Formato - \`Nome_array[Indice]=Valore' + Formato - \`Nome_array[Indice]=Valore' - ```bash - Shell > awk 'BEGIN{a1[0]="test0" ; a1[1]="s1"; print a1[0]}' - test0 - ``` + ```bash + Shell > awk 'BEGIN{a1[0]="test0" ; a1[1]="s1"; print a1[0]}' + test0 + ``` - Ottiene la lunghezza dell'array: + Ottiene la lunghezza dell'array: - ```bash - Shell > awk 'BEGIN{name[-1]="jimcat8" ; name[3]="jack" ; print length(name)}' - 2 - ``` + ```bash + Shell > awk 'BEGIN{name[-1]="jimcat8" ; name[3]="jack" ; print length(name)}' + 2 + ``` - Memorizza tutti gli utenti GNU/Linux in un array: + Memorizza tutti gli utenti GNU/Linux in un array: - ```bash - Shell > cat /etc/passwd | awk -F ":" '{username[NR]=$1}END{print username[2]}' - bin - Shell > cat /etc/passwd | awk -F ":" '{username[NR]=$1}END{print username[1]}' - root - ``` + ```bash + Shell > cat /etc/passwd | awk -F ":" '{username[NR]=$1}END{print username[2]}' + bin + Shell > cat /etc/passwd | awk -F ":" '{username[NR]=$1}END{print username[1]}' + root + ``` - !!! info "Informazione" + !!! info "Informazione" - ```` - Il pedice numerico di un array `awk` può essere un intero positivo, un intero negativo, una stringa o 0, quindi il pedice numerico di un array `awk` non ha il concetto di valore iniziale. Non è la stessa cosa degli array in `bash`. + ```` + Il pedice numerico di un array `awk` può essere un intero positivo, un intero negativo, una stringa o 0, quindi il pedice numerico di un array `awk` non ha il concetto di valore iniziale. Non è la stessa cosa degli array in `bash`. - ```bash - Shell > arr1=(2 10 30 string1) - Shell > echo "${arr1[0]}" - 2 - Shell > unset arr1 - ``` - ```` + ```bash + Shell > arr1=(2 10 30 string1) + Shell > echo "${arr1[0]}" + 2 + Shell > unset arr1 + ``` + ```` 2. Eliminare l'array - Formato `delete Array_Name` + Formato `delete Array_Name` 3. Eliminare un elemento da un array - Formato `delete Array_Name[Index]` + Formato `delete Array_Name[Index]` 4. Array di attraversamento - È possibile utilizzare l'istruzione **for**, adatta ai casi in cui il pedice della matrice è sconosciuto: - - ```bash - Shell > head -n 5 /etc/passwd | awk -F ":" ' \ - { - username[NR]=$1 - } - END { - for(i in username) - print username[i],i - } - ' - - root 1 - bin 2 - daemon 3 - adm 4 - lp 5 - ``` - - Se il pedice di una matrice è regolare, è possibile utilizzare questa forma dell'istruzione **for**: - - ```bash - Shell > cat /etc/passwd | awk -F ":" ' \ - { - username[NR]=$1 - } - END{ - for(i=1;i<=NR;i++) - print username[i],i - } - ' - - root 1 - bin 2 - daemon 3 - adm 4 - lp 5 - sync 6 - shutdown 7 - halt 8 - ... - ``` + È possibile utilizzare l'istruzione **for**, adatta ai casi in cui il pedice della matrice è sconosciuto: + + ```bash + Shell > head -n 5 /etc/passwd | awk -F ":" ' \ + { + username[NR]=$1 + } + END { + for(i in username) + print username[i],i + } + ' + + root 1 + bin 2 + daemon 3 + adm 4 + lp 5 + ``` + + Se il pedice di una matrice è regolare, è possibile utilizzare questa forma dell'istruzione **for**: + + ```bash + Shell > cat /etc/passwd | awk -F ":" ' \ + { + username[NR]=$1 + } + END{ + for(i=1;i<=NR;i++) + print username[i],i + } + ' + + root 1 + bin 2 + daemon 3 + adm 4 + lp 5 + sync 6 + shutdown 7 + halt 8 + ... + ``` 5. Utilizzare "++" come pedice della matrice - ```bash - Shell > tail -n 5 /etc/group | awk -F ":" '\ - { - a[x++]=$1 - } - END{ - for(i in a) - print a[i],i - } - ' - - slocate 0 - unbound 1 - docker 2 - cgred 3 - redis 4 - ``` + ```bash + Shell > tail -n 5 /etc/group | awk -F ":" '\ + { + a[x++]=$1 + } + END{ + for(i in a) + print a[i],i + } + ' + + slocate 0 + unbound 1 + docker 2 + cgred 3 + redis 4 + ``` 6. Utilizzare un campo come pedice di un array - ```bash - Shell > tail -n 5 /etc/group | awk -F ":" '\ - { - a[$1]=$3 - } - END{ - for(i in a) - print a[i],i - } - ' - - 991 docker - 21 slocate - 989 redis - 992 unbound - 990 cgred - ``` + ```bash + Shell > tail -n 5 /etc/group | awk -F ":" '\ + { + a[$1]=$3 + } + END{ + for(i in a) + print a[i],i + } + ' + + 991 docker + 21 slocate + 989 redis + 992 unbound + 990 cgred + ``` 7. Conta il numero di occorrenze dello stesso campo - Conta il numero di occorrenze dello stesso indirizzo IPv4. Idea di base: - - - Utilizzare innanzitutto il comando `grep` per filtrare tutti gli indirizzi IPv4 - - Poi lo si consegna al programma `awk` per l'elaborazione + Conta il numero di occorrenze dello stesso indirizzo IPv4. Idea di base: - ```bash - Shell > cat /var/log/secure | egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | awk ' \ - { - a[$1]++ - } - END{ - for(v in a) print a[v],v - } - ' + - Utilizzare innanzitutto il comando `grep` per filtrare tutti gli indirizzi IPv4 + - Poi lo si consegna al programma `awk` per l'elaborazione - 4 0.0.0.0 - 4 192.168.100.2 - ``` + ```bash + Shell > cat /var/log/secure | egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | awk ' \ + { + a[$1]++ + } + END{ + for(v in a) print a[v],v + } + ' + + 4 0.0.0.0 + 4 192.168.100.2 + ``` - !!! info "Informazione" + !!! info "Informazione" - ``` - `a[$1]++` equivale a `a[$1]+=1` - ``` + ``` + `a[$1]++` equivale a `a[$1]+=1` + ``` - Conta il numero di occorrenze delle parole, indipendentemente dal caso. Idea di base: + Conta il numero di occorrenze delle parole, indipendentemente dal caso. Idea di base: - - Dividere tutti i campi in più righe di record - - Poi lo si consegna al programma `awk` per l'elaborazione + - Dividere tutti i campi in più righe di record + - Poi lo si consegna al programma `awk` per l'elaborazione - ```bash - Shell > cat /etc/services | awk -F " " '{for(i=1;i<=NF;i++) print $i}' + ```bash + Shell > cat /etc/services | awk -F " " '{for(i=1;i<=NF;i++) print $i}' - Shell > cat /etc/services | awk -F " " '{for(i=1;i<=NF;i++) print $i}' | awk '\ - BEGIN{IGNORECASE=1;OFS="\t"} /^netbios$/ || /^ftp$/ {a[$1]++} END{for(v in a) print a[v],v} - ' + Shell > cat /etc/services | awk -F " " '{for(i=1;i<=NF;i++) print $i}' | awk '\ + BEGIN{IGNORECASE=1;OFS="\t"} /^netbios$/ || /^ftp$/ {a[$1]++} END{for(v in a) print a[v],v} + ' - 3 NETBIOS - 18 FTP - 7 ftp + 3 NETBIOS + 18 FTP + 7 ftp - Shell > cat /etc/services | awk -F " " '{ for(i=1;i<=NF;i++) print $i }' | awk '\ - BEGIN{IGNORECASE=1;OFS="\t"} /^netbios$/ || /^ftp$/ {a[$1]++} END{for(v in a) \ - if(a[v]>=5) print a[v],v} - ' + Shell > cat /etc/services | awk -F " " '{ for(i=1;i<=NF;i++) print $i }' | awk '\ + BEGIN{IGNORECASE=1;OFS="\t"} /^netbios$/ || /^ftp$/ {a[$1]++} END{for(v in a) \ + if(a[v]>=5) print a[v],v} + ' - 18 FTP - 7 ftp - ``` + 18 FTP + 7 ftp + ``` - È possibile prima filtrare record di riga specifici e poi eseguire statistiche, ad esempio: + È possibile prima filtrare record di riga specifici e poi eseguire statistiche, ad esempio: - ```bash - Shell > ss -tulnp | awk -F " " '/tcp/ {a[$2]++} END{for(i in a) print a[i],i}' - 2 LISTEN - ``` + ```bash + Shell > ss -tulnp | awk -F " " '/tcp/ {a[$2]++} END{for(i in a) print a[i],i}' + 2 LISTEN + ``` 8. Stampa delle righe in base al numero di occorrenze di un campo specifico - ```bash - Shell > tail /etc/services - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > tail /etc/services | awk 'a[$1]++ {print $0}' - axio-disc 35100/udp # Axiomatic discovery protocol - ``` - - Inverso: - - ```bash - Shell > tail /etc/services | awk '!a[$1]++ {print $0}' - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` + ```bash + Shell > tail /etc/services + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + + Shell > tail /etc/services | awk 'a[$1]++ {print $0}' + axio-disc 35100/udp # Axiomatic discovery protocol + ``` + + Inverso: + + ```bash + Shell > tail /etc/services | awk '!a[$1]++ {print $0}' + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` 9. Array multidimensionale - Il programma \`awk' non supporta gli array multidimensionali, ma il supporto per gli array multidimensionali è ottenibile attraverso la simulazione. Per impostazione predefinita, "\034" è il delimitatore per il pedice di una matrice multidimensionale. - - Tenere presente le seguenti differenze quando si utilizzano array multidimensionali: - - ```bash - Shell > awk 'BEGIN{ a["1,0"]=100 ; a[2,0]=200 ; a["3","0"]=300 ; for(i in a) print a[i],i }' - 200 20 - 300 30 - 100 1,0 - ``` - - Ridefinire il delimitatore: - - ```bash - Shell > awk 'BEGIN{ SUBSEP="----" ; a["1,0"]=100 ; a[2,0]=200 ; a["3","0"]=300 ; for(i in a) print a[i],i }' - 300 3----0 - 200 2----0 - 100 1,0 - ``` - - Riordina: - - ```bash - Shell > awk 'BEGIN{ SUBSEP="----" ; a["1,0"]=100 ; a[2,0]=200 ; a["3","0"]=300 ; for(i in a) print a[i],i | "sort" }' - 100 1,0 - 200 2----0 - 300 3----0 - ``` - - Contare il numero di volte in cui il campo appare: - - ```bash - Shell > cat c.txt - A 192.168.1.1 HTTP - B 192.168.1.2 HTTP - B 192.168.1.2 MYSQL - C 192.168.1.1 MYSQL - C 192.168.1.1 MQ - D 192.168.1.4 NGINX - - Shell > cat c.txt | awk 'BEGIN{SUBSEP="----"} {a[$1,$2]++} END{for(i in a) print a[i],i}' - 1 A----192.168.1.1 - 2 B----192.168.1.2 - 2 C----192.168.1.1 - 1 D----192.168.1.4 - ``` + Il programma \`awk' non supporta gli array multidimensionali, ma il supporto per gli array multidimensionali è ottenibile attraverso la simulazione. Per impostazione predefinita, "\034" è il delimitatore per il pedice di una matrice multidimensionale. + + Tenere presente le seguenti differenze quando si utilizzano array multidimensionali: + + ```bash + Shell > awk 'BEGIN{ a["1,0"]=100 ; a[2,0]=200 ; a["3","0"]=300 ; for(i in a) print a[i],i }' + 200 20 + 300 30 + 100 1,0 + ``` + + Ridefinire il delimitatore: + + ```bash + Shell > awk 'BEGIN{ SUBSEP="----" ; a["1,0"]=100 ; a[2,0]=200 ; a["3","0"]=300 ; for(i in a) print a[i],i }' + 300 3----0 + 200 2----0 + 100 1,0 + ``` + + Riordina: + + ```bash + Shell > awk 'BEGIN{ SUBSEP="----" ; a["1,0"]=100 ; a[2,0]=200 ; a["3","0"]=300 ; for(i in a) print a[i],i | "sort" }' + 100 1,0 + 200 2----0 + 300 3----0 + ``` + + Contare il numero di volte in cui il campo appare: + + ```bash + Shell > cat c.txt + A 192.168.1.1 HTTP + B 192.168.1.2 HTTP + B 192.168.1.2 MYSQL + C 192.168.1.1 MYSQL + C 192.168.1.1 MQ + D 192.168.1.4 NGINX + + Shell > cat c.txt | awk 'BEGIN{SUBSEP="----"} {a[$1,$2]++} END{for(i in a) print a[i],i}' + 1 A----192.168.1.1 + 2 B----192.168.1.2 + 2 C----192.168.1.1 + 1 D----192.168.1.4 + ``` ## Funzione integrata @@ -1487,331 +1487,331 @@ Come la maggior parte dei linguaggi di programmazione, `awk` supporta anche gli 1. Funzione **int** - ```bash - Shell > echo -e "qwer123\n123\nabc\n123abc123\n100.55\n-155.27" - qwer123 - 123 - abc - 123abc123 - 100.55 - -155.27 - - Shell > echo -e "qwer123\n123\nabc\n123abc123\n100.55\n-155.27" | awk '{print int($1)}' - 0 - 123 - 0 - 123 - 100 - -155 - ``` - - Come si può notare, la funzione int funziona solo per i numeri e, quando incontra una stringa, la converte a 0. Quando incontra una stringa che inizia con un numero, la tronca. + ```bash + Shell > echo -e "qwer123\n123\nabc\n123abc123\n100.55\n-155.27" + qwer123 + 123 + abc + 123abc123 + 100.55 + -155.27 + + Shell > echo -e "qwer123\n123\nabc\n123abc123\n100.55\n-155.27" | awk '{print int($1)}' + 0 + 123 + 0 + 123 + 100 + -155 + ``` + + Come si può notare, la funzione int funziona solo per i numeri e, quando incontra una stringa, la converte a 0. Quando incontra una stringa che inizia con un numero, la tronca. 2. Funzione **sqrt** - ```bash - Shell > awk 'BEGIN{print sqrt(9)}' - 3 - ``` + ```bash + Shell > awk 'BEGIN{print sqrt(9)}' + 3 + ``` 3. Funzioni **rand** e **srand** - L'esempio di utilizzo della funzione rand è il seguente: - - ```bash - Shell > awk 'BEGIN{print rand()}' - 0.924046 - Shell > awk 'BEGIN{print rand()}' - 0.924046 - Shell > awk 'BEGIN{print rand()}' - 0.924046 - ``` - - L'esempio di utilizzo della funzione srand è il seguente: - - ```bash - Shell > awk 'BEGIN{srand() ; print rand()}' - 0.975495 - Shell > awk 'BEGIN{srand() ; print rand()}' - 0.99187 - Shell > awk 'BEGIN{srand() ; print rand()}' - 0.069002 - ``` - - Genera un numero intero compreso nell'intervallo (0,100): - - ```bash - Shell > awk 'BEGIN{srand() ; print int(rand()*100)}' - 56 - Shell > awk 'BEGIN{srand() ; print int(rand()*100)}' - 33 - Shell > awk 'BEGIN{srand() ; print int(rand()*100)}' - 42 - ``` + L'esempio di utilizzo della funzione rand è il seguente: + + ```bash + Shell > awk 'BEGIN{print rand()}' + 0.924046 + Shell > awk 'BEGIN{print rand()}' + 0.924046 + Shell > awk 'BEGIN{print rand()}' + 0.924046 + ``` + + L'esempio di utilizzo della funzione srand è il seguente: + + ```bash + Shell > awk 'BEGIN{srand() ; print rand()}' + 0.975495 + Shell > awk 'BEGIN{srand() ; print rand()}' + 0.99187 + Shell > awk 'BEGIN{srand() ; print rand()}' + 0.069002 + ``` + + Genera un numero intero compreso nell'intervallo (0,100): + + ```bash + Shell > awk 'BEGIN{srand() ; print int(rand()*100)}' + 56 + Shell > awk 'BEGIN{srand() ; print int(rand()*100)}' + 33 + Shell > awk 'BEGIN{srand() ; print int(rand()*100)}' + 42 + ``` 4. Funzioni **asort** e **asorti** - ```bash - Shell > cat /etc/passwd | awk -F ":" '{a[NR]=$1} END{anu=asort(a,b) ; for(i=1;i<=anu;i++) print i,b[i]}' - 1 adm - 2 bin - 3 chrony - 4 daemon - 5 dbus - 6 ftp - 7 games - 8 halt - 9 lp - 10 mail - 11 nobody - 12 operator - 13 polkitd - 14 redis - 15 root - 16 shutdown - 17 sshd - 18 sssd - 19 sync - 20 systemd-coredump - 21 systemd-resolve - 22 tss - 23 unbound - - Shell > awk 'BEGIN{a[1]=1000 ; a[2]=200 ; a[3]=30 ; a[4]="admin" ; a[5]="Admin" ; \ - a[6]="12string" ; a[7]=-1 ; a[8]=-10 ; a[9]=-20 ; a[10]=-21 ;nu=asort(a,b) ; for(i=1;i<=nu;i++) print i,b[i]}' - 1 -21 - 2 -20 - 3 -10 - 4 -1 - 5 30 - 6 200 - 7 1000 - 8 12string - 9 Admin - 10 admin - ``` - - !!! info "Informazione" - - ``` - Regole di ordinamento: - - * I numeri hanno una priorità maggiore rispetto alle stringhe e sono disposti in ordine crescente. - * Disporre le stringhe in ordine crescente nel dizionario - ``` - - Se si utilizza la funzione **asorti**, l'esempio è il seguente: - - ```bash - Shell > awk 'BEGIN{ a[-11]=1000 ; a[-2]=200 ; a[-10]=30 ; a[-21]="admin" ; a[41]="Admin" ; \ - a[30]="12string" ; a["root"]="rootstr" ; a["Root"]="r1" ; nu=asorti(a,b) ; for(i in b) print i,b[i] }' - 1 -10 - 2 -11 - 3 -2 - 4 -21 - 5 30 - 6 41 - 7 Root - 8 root - ``` - - !!! info "Informazione" - - ``` - Regole di ordinamento: - - * I numeri hanno la priorità sulle stringhe - * Se si incontra un numero negativo, viene confrontata la prima cifra da sinistra. Se è uguale, viene confrontata la seconda cifra e così via. - * Se viene incontrato un numero positivo, verrà disposto in ordine crescente. - * Disporre le stringhe in ordine crescente nel dizionario - ``` + ```bash + Shell > cat /etc/passwd | awk -F ":" '{a[NR]=$1} END{anu=asort(a,b) ; for(i=1;i<=anu;i++) print i,b[i]}' + 1 adm + 2 bin + 3 chrony + 4 daemon + 5 dbus + 6 ftp + 7 games + 8 halt + 9 lp + 10 mail + 11 nobody + 12 operator + 13 polkitd + 14 redis + 15 root + 16 shutdown + 17 sshd + 18 sssd + 19 sync + 20 systemd-coredump + 21 systemd-resolve + 22 tss + 23 unbound + + Shell > awk 'BEGIN{a[1]=1000 ; a[2]=200 ; a[3]=30 ; a[4]="admin" ; a[5]="Admin" ; \ + a[6]="12string" ; a[7]=-1 ; a[8]=-10 ; a[9]=-20 ; a[10]=-21 ;nu=asort(a,b) ; for(i=1;i<=nu;i++) print i,b[i]}' + 1 -21 + 2 -20 + 3 -10 + 4 -1 + 5 30 + 6 200 + 7 1000 + 8 12string + 9 Admin + 10 admin + ``` + + !!! info "Informazione" + + ``` + Regole di ordinamento: + + * I numeri hanno una priorità maggiore rispetto alle stringhe e sono disposti in ordine crescente. + * Disporre le stringhe in ordine crescente nel dizionario + ``` + + Se si utilizza la funzione **asorti**, l'esempio è il seguente: + + ```bash + Shell > awk 'BEGIN{ a[-11]=1000 ; a[-2]=200 ; a[-10]=30 ; a[-21]="admin" ; a[41]="Admin" ; \ + a[30]="12string" ; a["root"]="rootstr" ; a["Root"]="r1" ; nu=asorti(a,b) ; for(i in b) print i,b[i] }' + 1 -10 + 2 -11 + 3 -2 + 4 -21 + 5 30 + 6 41 + 7 Root + 8 root + ``` + + !!! info "Informazione" + + ``` + Regole di ordinamento: + + * I numeri hanno la priorità sulle stringhe + * Se si incontra un numero negativo, viene confrontata la prima cifra da sinistra. Se è uguale, viene confrontata la seconda cifra e così via. + * Se viene incontrato un numero positivo, verrà disposto in ordine crescente. + * Disporre le stringhe in ordine crescente nel dizionario + ``` 5. Funzioni **sub** e **gsub** - ```bash - Shell > cat /etc/services | awk '/netbios/ {sub(/tcp/,"test") ; print $0 }' - netbios-ns 137/test # NETBIOS Name Service - netbios-ns 137/udp - netbios-dgm 138/test # NETBIOS Datagram Service - netbios-dgm 138/udp - netbios-ssn 139/test # NETBIOS session service - netbios-ssn 139/udp - - Shell > cat /etc/services | awk '/^ftp/ && /21\/tcp/ {print $0}' - ftp 21/tcp - ↑ ↑ - Shell > cat /etc/services | awk 'BEGIN{OFS="\t"} /^ftp/ && /21\/tcp/ {gsub(/p/,"P",$2) ; print $0}' - ftp 21/tcP - ↑ - Shell > cat /etc/services | awk 'BEGIN{OFS="\t"} /^ftp/ && /21\/tcp/ {gsub(/p/,"P") ; print $0}' - ftP 21/tcP - ↑ ↑ - ``` - - Come per il comando \`sed', è possibile utilizzare il simbolo "&" per fare riferimento a stringhe già abbinate. - - ```bash - Shell > vim /tmp/tmp-file1.txt - A 192.168.1.1 HTTP - B 192.168.1.2 HTTP - B 192.168.1.2 MYSQL - C 192.168.1.1 MYSQL - C 192.168.1.1 MQ - D 192.168.1.4 NGINX - - # Add a line of text before the second line - Shell > cat /tmp/tmp-file1.txt | awk 'NR==2 {gsub(/.*/,"add a line\n&")} {print $0}' - A 192.168.1.1 HTTP - add a line - B 192.168.1.2 HTTP - B 192.168.1.2 MYSQL - C 192.168.1.1 MYSQL - C 192.168.1.1 MQ - D 192.168.1.4 NGINX - - # Add a string after the IP address in the second line - Shell > cat /tmp/tmp-file1.txt | awk 'NR==2 {gsub(/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/,"&\tSTRING")} {print $0}' - A 192.168.1.1 HTTP - B 192.168.1.2 STRING HTTP - B 192.168.1.2 MYSQL - C 192.168.1.1 MYSQL - C 192.168.1.1 MQ - D 192.168.1.4 NGINX - ``` + ```bash + Shell > cat /etc/services | awk '/netbios/ {sub(/tcp/,"test") ; print $0 }' + netbios-ns 137/test # NETBIOS Name Service + netbios-ns 137/udp + netbios-dgm 138/test # NETBIOS Datagram Service + netbios-dgm 138/udp + netbios-ssn 139/test # NETBIOS session service + netbios-ssn 139/udp + + Shell > cat /etc/services | awk '/^ftp/ && /21\/tcp/ {print $0}' + ftp 21/tcp + ↑ ↑ + Shell > cat /etc/services | awk 'BEGIN{OFS="\t"} /^ftp/ && /21\/tcp/ {gsub(/p/,"P",$2) ; print $0}' + ftp 21/tcP + ↑ + Shell > cat /etc/services | awk 'BEGIN{OFS="\t"} /^ftp/ && /21\/tcp/ {gsub(/p/,"P") ; print $0}' + ftP 21/tcP + ↑ ↑ + ``` + + Come per il comando \`sed', è possibile utilizzare il simbolo "&" per fare riferimento a stringhe già abbinate. + + ```bash + Shell > vim /tmp/tmp-file1.txt + A 192.168.1.1 HTTP + B 192.168.1.2 HTTP + B 192.168.1.2 MYSQL + C 192.168.1.1 MYSQL + C 192.168.1.1 MQ + D 192.168.1.4 NGINX + + # Add a line of text before the second line + Shell > cat /tmp/tmp-file1.txt | awk 'NR==2 {gsub(/.*/,"add a line\n&")} {print $0}' + A 192.168.1.1 HTTP + add a line + B 192.168.1.2 HTTP + B 192.168.1.2 MYSQL + C 192.168.1.1 MYSQL + C 192.168.1.1 MQ + D 192.168.1.4 NGINX + + # Add a string after the IP address in the second line + Shell > cat /tmp/tmp-file1.txt | awk 'NR==2 {gsub(/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/,"&\tSTRING")} {print $0}' + A 192.168.1.1 HTTP + B 192.168.1.2 STRING HTTP + B 192.168.1.2 MYSQL + C 192.168.1.1 MYSQL + C 192.168.1.1 MQ + D 192.168.1.4 NGINX + ``` 6. Funzione **index** - ```bash - Shell > tail -n 5 /etc/services - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > tail -n 5 /etc/services | awk '{print index($2,"tcp")}' - 0 - 7 - 0 - 7 - 7 - ``` + ```bash + Shell > tail -n 5 /etc/services + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + + Shell > tail -n 5 /etc/services | awk '{print index($2,"tcp")}' + 0 + 7 + 0 + 7 + 7 + ``` 7. Funzione **length** - ```bash - # La lunghezza del campo di output - Shell > tail -n 5 /etc/services | awk '{print length($1)}' - 9 - 8 - 15 - 10 - 14 - - # La lunghezza dell'insieme di output - Shell > cat /etc/passwd | awk -F ":" 'a[NR]=$1 END{print length(a)}' - 22 - ``` + ```bash + # La lunghezza del campo di output + Shell > tail -n 5 /etc/services | awk '{print length($1)}' + 9 + 8 + 15 + 10 + 14 + + # La lunghezza dell'insieme di output + Shell > cat /etc/passwd | awk -F ":" 'a[NR]=$1 END{print length(a)}' + 22 + ``` 8. Funzione **match** - ```bash - Shell > echo -e "1592abc144qszd\n144bc\nbn" - 1592abc144qszd - 144bc - bn - - Shell > echo -e "1592abc144qszd\n144bc\nbn" | awk '{print match($1,144)}' - 8 - 1 - 0 - ``` + ```bash + Shell > echo -e "1592abc144qszd\n144bc\nbn" + 1592abc144qszd + 144bc + bn + + Shell > echo -e "1592abc144qszd\n144bc\nbn" | awk '{print match($1,144)}' + 8 + 1 + 0 + ``` 9. Funzione **split** - ```bash - Shell > echo "365%tmp%dir%number" | awk '{split($1,a1,"%") ; for(i in a1) print i,a1[i]}' - 1 365 - 2 tmp - 3 dir - 4 number - ``` + ```bash + Shell > echo "365%tmp%dir%number" | awk '{split($1,a1,"%") ; for(i in a1) print i,a1[i]}' + 1 365 + 2 tmp + 3 dir + 4 number + ``` 10. Funzione **substr** - ```bash - Shell > head -n 5 /etc/passwd - root:x:0:0:root:/root:/bin/bash - bin:x:1:1:bin:/bin:/sbin/nologin - daemon:x:2:2:daemon:/sbin:/sbin/nologin - adm:x:3:4:adm:/var/adm:/sbin/nologin - lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin - - # I need this part of the content - "emon:/sbin:/sbin/nologin" - Shell > head -n 5 /etc/passwd | awk '/daemon/ {print substr($0,16)}' - emon:/sbin:/sbin/nologin - - Shell > tail -n 5 /etc/services - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - # I need this part of the content - "tablet" - Shell > tail -n 5 /etc/services | awk '/^sp/ {print substr($1,9)}' - tablet - ``` + ```bash + Shell > head -n 5 /etc/passwd + root:x:0:0:root:/root:/bin/bash + bin:x:1:1:bin:/bin:/sbin/nologin + daemon:x:2:2:daemon:/sbin:/sbin/nologin + adm:x:3:4:adm:/var/adm:/sbin/nologin + lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin + + # I need this part of the content - "emon:/sbin:/sbin/nologin" + Shell > head -n 5 /etc/passwd | awk '/daemon/ {print substr($0,16)}' + emon:/sbin:/sbin/nologin + + Shell > tail -n 5 /etc/services + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + + # I need this part of the content - "tablet" + Shell > tail -n 5 /etc/services | awk '/^sp/ {print substr($1,9)}' + tablet + ``` 11. Funzioni **tolower** e **toupper** - ```bash - Shell > echo -e "AbcD123\nqweR" | awk '{print tolower($0)}' - abcd123 - qwer + ```bash + Shell > echo -e "AbcD123\nqweR" | awk '{print tolower($0)}' + abcd123 + qwer - Shell > tail -n 5 /etc/services | awk '{print toupper($0)}' - AXIO-DISC 35100/UDP # AXIOMATIC DISCOVERY PROTOCOL - PMWEBAPI 44323/TCP # PERFORMANCE CO-PILOT CLIENT HTTP API - CLOUDCHECK-PING 45514/UDP # ASSIA CLOUDCHECK WIFI MANAGEMENT KEEPALIVE - CLOUDCHECK 45514/TCP # ASSIA CLOUDCHECK WIFI MANAGEMENT SYSTEM - SPREMOTETABLET 46998/TCP # CAPTURE HANDWRITTEN SIGNATURES - ``` + Shell > tail -n 5 /etc/services | awk '{print toupper($0)}' + AXIO-DISC 35100/UDP # AXIOMATIC DISCOVERY PROTOCOL + PMWEBAPI 44323/TCP # PERFORMANCE CO-PILOT CLIENT HTTP API + CLOUDCHECK-PING 45514/UDP # ASSIA CLOUDCHECK WIFI MANAGEMENT KEEPALIVE + CLOUDCHECK 45514/TCP # ASSIA CLOUDCHECK WIFI MANAGEMENT SYSTEM + SPREMOTETABLET 46998/TCP # CAPTURE HANDWRITTEN SIGNATURES + ``` 12. Funzioni che trattano l'ora e la data - \*\*Che cos'è un timestamp UNIX? - Secondo la storia dello sviluppo di GNU/Linux, UNIX V1 è nato nel 1971 e il libro "UNIX Programmer's Manual" è stato pubblicato il 3 novembre dello stesso anno, il che definisce il 1970-01-01 come data di riferimento dell'inizio di UNIX. + \*\*Che cos'è un timestamp UNIX? + Secondo la storia dello sviluppo di GNU/Linux, UNIX V1 è nato nel 1971 e il libro "UNIX Programmer's Manual" è stato pubblicato il 3 novembre dello stesso anno, il che definisce il 1970-01-01 come data di riferimento dell'inizio di UNIX. - La conversione tra un timestamp e una data naturale in giorni: + La conversione tra un timestamp e una data naturale in giorni: - ```bash - Shell > echo "$(( $(date --date="2024/01/06" +%s)/86400 + 1 ))" - 19728 + ```bash + Shell > echo "$(( $(date --date="2024/01/06" +%s)/86400 + 1 ))" + 19728 - Shell > date -d "1970-01-01 19728days" - Sat Jan 6 00:00:00 CST 2024 - ``` + Shell > date -d "1970-01-01 19728days" + Sat Jan 6 00:00:00 CST 2024 + ``` - La conversione tra un timestamp e una data naturale in secondi: + La conversione tra un timestamp e una data naturale in secondi: - ```bash - Shell > echo "$(date --date="2024/01/06 17:12:00" +%s)" - 1704532320 + ```bash + Shell > echo "$(date --date="2024/01/06 17:12:00" +%s)" + 1704532320 - Shell > echo "$(date --date='@1704532320')" - Sat Jan 6 17:12:00 CST 2024 - ``` + Shell > echo "$(date --date='@1704532320')" + Sat Jan 6 17:12:00 CST 2024 + ``` - La conversione tra la data naturale e il timestamp UNIX nel programma `awk`: + La conversione tra la data naturale e il timestamp UNIX nel programma `awk`: - ```bash - Shell > awk 'BEGIN{print systime()}' - 1704532597 + ```bash + Shell > awk 'BEGIN{print systime()}' + 1704532597 - Shell > echo "1704532597" | awk '{print strftime("%Y-%m-%d %H:%M:%S",$0)}' - 2024-01-06 17:16:37 - ``` + Shell > echo "1704532597" | awk '{print strftime("%Y-%m-%d %H:%M:%S",$0)}' + 2024-01-06 17:16:37 + ``` ## Istruzione I/O @@ -1829,204 +1829,204 @@ Come la maggior parte dei linguaggi di programmazione, `awk` supporta anche gli 1. getline - ```bash - Shell > seq 1 10 | awk '/3/ || /6/ {getline ; print $0}' - 4 - 7 - - Shell > seq 1 10 | awk '/3/ || /6/ {print $0 ; getline ; print $0}' - 3 - 4 - 6 - 7 - ``` - - Utilizzando le funzioni che abbiamo imparato in precedenza e il simbolo "&", possiamo: - - ```bash - Shell > tail -n 5 /etc/services | awk '/45514\/tcp/ {getline ; gsub(/.*/ , "&\tSTRING1") ; print $0}' - spremotetablet 46998/tcp # Capture handwritten signatures STRING1 - - Shell > tail -n 5 /etc/services | awk '/45514\/tcp/ {print $0 ; getline; gsub(/.*/,"&\tSTRING2") } {print $0}' - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures STRING2 - ``` - - Stampa le righe pari e dispari: - - ```bash - Shell > tail -n 10 /etc/services | cat -n | awk '{ if( (getline) <= 1) print $0}' - 2 ka-kdp 31016/udp # Kollective Agent Kollective Delivery - 4 edi_service 34567/udp # dhanalakshmi.org EDI Service - 6 axio-disc 35100/udp # Axiomatic discovery protocol - 8 cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - 10 spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > tail -n 10 /etc/services | cat -n | awk '{if(NR==1) print $0} { if(NR%2==0) {if(getline > 0) print $0} }' - 1 aigairserver 21221/tcp # Services for Air Server - 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - 5 axio-disc 35100/tcp # Axiomatic discovery protocol - 7 pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - ``` + ```bash + Shell > seq 1 10 | awk '/3/ || /6/ {getline ; print $0}' + 4 + 7 + + Shell > seq 1 10 | awk '/3/ || /6/ {print $0 ; getline ; print $0}' + 3 + 4 + 6 + 7 + ``` + + Utilizzando le funzioni che abbiamo imparato in precedenza e il simbolo "&", possiamo: + + ```bash + Shell > tail -n 5 /etc/services | awk '/45514\/tcp/ {getline ; gsub(/.*/ , "&\tSTRING1") ; print $0}' + spremotetablet 46998/tcp # Capture handwritten signatures STRING1 + + Shell > tail -n 5 /etc/services | awk '/45514\/tcp/ {print $0 ; getline; gsub(/.*/,"&\tSTRING2") } {print $0}' + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures STRING2 + ``` + + Stampa le righe pari e dispari: + + ```bash + Shell > tail -n 10 /etc/services | cat -n | awk '{ if( (getline) <= 1) print $0}' + 2 ka-kdp 31016/udp # Kollective Agent Kollective Delivery + 4 edi_service 34567/udp # dhanalakshmi.org EDI Service + 6 axio-disc 35100/udp # Axiomatic discovery protocol + 8 cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + 10 spremotetablet 46998/tcp # Capture handwritten signatures + + Shell > tail -n 10 /etc/services | cat -n | awk '{if(NR==1) print $0} { if(NR%2==0) {if(getline > 0) print $0} }' + 1 aigairserver 21221/tcp # Services for Air Server + 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + 5 axio-disc 35100/tcp # Axiomatic discovery protocol + 7 pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + ``` 2. getline var - Aggiungere ogni riga del file b alla fine di ogni riga del file C: - - ```bash - Shell > cat /tmp/b.txt - b1 - b2 - b3 - b4 - b5 - b6 - - Shell > cat /tmp/c.txt - A 192.168.1.1 HTTP - B 192.168.1.2 HTTP - B 192.168.1.2 MYSQL - C 192.168.1.1 MYSQL - C 192.168.1.1 MQ - D 192.168.1.4 NGINX - - Shell > awk '{getline var1 <"/tmp/b.txt" ; print $0 , var1}' /tmp/c.txt - A 192.168.1.1 HTTP b1 - B 192.168.1.2 HTTP b2 - B 192.168.1.2 MYSQL b3 - C 192.168.1.1 MYSQL b4 - C 192.168.1.1 MQ b5 - D 192.168.1.4 NGINX b6 - ``` - - Sostituisce il campo specificato del file c con la riga del contenuto del file b: - - ```bash - Shell > awk '{ getline var2 < "/tmp/b.txt" ; gsub($2 , var2 , $2) ; print $0 }' /tmp/c.txt - A b1 HTTP - B b2 HTTP - B b3 MYSQL - C b4 MYSQL - C b5 MQ - D b6 NGINX - ``` + Aggiungere ogni riga del file b alla fine di ogni riga del file C: + + ```bash + Shell > cat /tmp/b.txt + b1 + b2 + b3 + b4 + b5 + b6 + + Shell > cat /tmp/c.txt + A 192.168.1.1 HTTP + B 192.168.1.2 HTTP + B 192.168.1.2 MYSQL + C 192.168.1.1 MYSQL + C 192.168.1.1 MQ + D 192.168.1.4 NGINX + + Shell > awk '{getline var1 <"/tmp/b.txt" ; print $0 , var1}' /tmp/c.txt + A 192.168.1.1 HTTP b1 + B 192.168.1.2 HTTP b2 + B 192.168.1.2 MYSQL b3 + C 192.168.1.1 MYSQL b4 + C 192.168.1.1 MQ b5 + D 192.168.1.4 NGINX b6 + ``` + + Sostituisce il campo specificato del file c con la riga del contenuto del file b: + + ```bash + Shell > awk '{ getline var2 < "/tmp/b.txt" ; gsub($2 , var2 , $2) ; print $0 }' /tmp/c.txt + A b1 HTTP + B b2 HTTP + B b3 MYSQL + C b4 MYSQL + C b5 MQ + D b6 NGINX + ``` 3. command | getline [var] - ```bash - Shell > awk 'BEGIN{ "date +%Y%m%d" | getline datenow ; print datenow}' - 20240107 - ``` + ```bash + Shell > awk 'BEGIN{ "date +%Y%m%d" | getline datenow ; print datenow}' + 20240107 + ``` - !!! tip "Suggerimento" + !!! tip "Suggerimento" - ``` - Utilizzare le doppie virgolette per includere il comando Shell. - ``` + ``` + Utilizzare le doppie virgolette per includere il comando Shell. + ``` 4. next - In precedenza abbiamo introdotto l'istruzione **break** e l'istruzione **continue**, la prima utilizzata per terminare il ciclo e la seconda per uscire dal ciclo corrente. Vedi [qui](#bc). Per **next**, quando le condizioni sono soddisfatte, interrompe la registrazione dell'ingresso che soddisfa le condizioni e continua con le azioni successive. + In precedenza abbiamo introdotto l'istruzione **break** e l'istruzione **continue**, la prima utilizzata per terminare il ciclo e la seconda per uscire dal ciclo corrente. Vedi [qui](#bc). Per **next**, quando le condizioni sono soddisfatte, interrompe la registrazione dell'ingresso che soddisfa le condizioni e continua con le azioni successive. - ```bash - Shell > seq 1 5 | awk '{if(NR==3) {next} print $0}' - 1 - 2 - 4 - 5 - - # equivalent to - Shell > seq 1 5 | awk '{if($1!=3) print $0}' - ``` + ```bash + Shell > seq 1 5 | awk '{if(NR==3) {next} print $0}' + 1 + 2 + 4 + 5 - Saltare i record di linea ammissibili: + # equivalent to + Shell > seq 1 5 | awk '{if($1!=3) print $0}' + ``` - ```bash - Shell > cat /etc/passwd | awk -F ":" 'NR>5 {next} {print $0}' - root:x:0:0:root:/root:/bin/bash - bin:x:1:1:bin:/bin:/sbin/nologin - daemon:x:2:2:daemon:/sbin:/sbin/nologin - adm:x:3:4:adm:/var/adm:/sbin/nologin - lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin + Saltare i record di linea ammissibili: - # equivalent to - Shell > cat /etc/passwd | awk -F ":" 'NR>=1 && NR<=5 {print $0}' - ``` + ```bash + Shell > cat /etc/passwd | awk -F ":" 'NR>5 {next} {print $0}' + root:x:0:0:root:/root:/bin/bash + bin:x:1:1:bin:/bin:/sbin/nologin + daemon:x:2:2:daemon:/sbin:/sbin/nologin + adm:x:3:4:adm:/var/adm:/sbin/nologin + lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin + + # equivalent to + Shell > cat /etc/passwd | awk -F ":" 'NR>=1 && NR<=5 {print $0}' + ``` - !!! tip "Suggerimento" + !!! tip "Suggerimento" - ``` - "**next**" non può essere usato in "BEGIN{}" e "END{}". - ``` + ``` + "**next**" non può essere usato in "BEGIN{}" e "END{}". + ``` 5. Funzione **system** - Questa funzione può essere utilizzata per richiamare comandi nella shell, come ad esempio: + Questa funzione può essere utilizzata per richiamare comandi nella shell, come ad esempio: - ```bash - Shell > awk 'BEGIN{ system("echo nginx http") }' - nginx http - ``` + ```bash + Shell > awk 'BEGIN{ system("echo nginx http") }' + nginx http + ``` - !!! tip "Suggerimento" + !!! tip "Suggerimento" - ```` - Si noti di aggiungere le doppie virgolette quando si utilizza la funzione **system**. Se non vengono aggiunte, il programma `awk` la considererà una variabile del programma `awk`. + ```` + Si noti di aggiungere le doppie virgolette quando si utilizza la funzione **system**. Se non vengono aggiunte, il programma `awk` la considererà una variabile del programma `awk`. - ```bash - Shell > awk 'BEGIN{ cmd1="date +%Y" ; system(cmd1)}' - 2024 - ``` - ```` + ```bash + Shell > awk 'BEGIN{ cmd1="date +%Y" ; system(cmd1)}' + 2024 + ``` + ```` - \*\*Cosa succede se il comando stesso della shell contiene doppi apici? \*\* Utilizzando i caratteri di escape - "\", come ad esempio: + \*\*Cosa succede se il comando stesso della shell contiene doppi apici? \*\* Utilizzando i caratteri di escape - "\", come ad esempio: - ```bash - Shell > egrep "^root|^nobody" /etc/passwd - Shell > awk 'BEGIN{ system("egrep \"^root|^nobody\" /etc/passwd") }' - root:x:0:0:root:/root:/bin/bash - nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin - ``` + ```bash + Shell > egrep "^root|^nobody" /etc/passwd + Shell > awk 'BEGIN{ system("egrep \"^root|^nobody\" /etc/passwd") }' + root:x:0:0:root:/root:/bin/bash + nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin + ``` - Un altro esempio: + Un altro esempio: - ```bash - Shell > awk 'BEGIN{ if ( system("xmind &> /dev/null") == 0 ) print "True"; else print "False" }' - False - ``` + ```bash + Shell > awk 'BEGIN{ if ( system("xmind &> /dev/null") == 0 ) print "True"; else print "False" }' + False + ``` 6. Scrivere l'output del programma `awk` su un file - ```bash - Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{OFS="\t"} {print $1,$2 > "/tmp/user.txt"}' - Shell > cat /tmp/user.txt - root x - bin x - daemon x - adm x - lp x - ``` + ```bash + Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{OFS="\t"} {print $1,$2 > "/tmp/user.txt"}' + Shell > cat /tmp/user.txt + root x + bin x + daemon x + adm x + lp x + ``` - !!! tip "Suggerimento" + !!! tip "Suggerimento" - ``` - "**>**" indica la scrittura sul file come sovrapposizione. Se si desidera scrivere sul file come append, utilizzare "**>>**". Si ricorda ancora una volta di usare le doppie virgolette per includere il percorso del file. - ``` + ``` + "**>**" indica la scrittura sul file come sovrapposizione. Se si desidera scrivere sul file come append, utilizzare "**>>**". Si ricorda ancora una volta di usare le doppie virgolette per includere il percorso del file. + ``` 7. carattere della pipe 8. Funzioni personalizzate - sintassi - `funzione NOME(elenco di parametri) { corpo della funzione }`. Come ad esempio: + sintassi - `funzione NOME(elenco di parametri) { corpo della funzione }`. Come ad esempio: - ```bash - Shell > awk 'function mysum(a,b) {return a+b} BEGIN{print mysum(1,6)}' - 7 - ``` + ```bash + Shell > awk 'function mysum(a,b) {return a+b} BEGIN{print mysum(1,6)}' + 7 + ``` ## Osservazioni conclusive diff --git a/docs/books/sed_awk_grep/4_awk_command.uk.md b/docs/books/sed_awk_grep/4_awk_command.uk.md index 9b7bc95738..729b6c0f37 100644 --- a/docs/books/sed_awk_grep/4_awk_command.uk.md +++ b/docs/books/sed_awk_grep/4_awk_command.uk.md @@ -190,293 +190,293 @@ ID Name 1. Читання вихідних файлів програми `awk` з файлів - ```bash - Shell > vim /tmp/read-print.awk - #!/bin/awk - {print $6} - - Shell > df -hT | awk -f /tmp/read-print.awk - Use% - 0% - 0% - 1% - 0% - 6% - 18% - 0% - ``` + ```bash + Shell > vim /tmp/read-print.awk + #!/bin/awk + {print $6} + + Shell > df -hT | awk -f /tmp/read-print.awk + Use% + 0% + 0% + 1% + 0% + 6% + 18% + 0% + ``` 2. Вкажіть роздільник - ```bash - Shell > awk -F ":" '{print $1}' /etc/passwd - root - bin - daemon - adm - lp - sync - ... - - Shell > tail -n 5 /etc/services | awk -F "\/" '{print $2}' - awk: warning: escape sequence `\/' treated as plain `/' - axio-disc 35100 - pmwebapi 44323 - cloudcheck-ping 45514 - cloudcheck 45514 - spremotetablet 46998 - ``` - - Ви також можете використовувати слова як роздільники. Дужки вказують, що це загальний роздільник, а "|" означає або. - - ```bash - Shell > tail -n 5 /etc/services | awk -F "(tcp)|(udp)" '{print $1}' - axio-disc 35100/ - pmwebapi 44323/ - cloudcheck-ping 45514/ - cloudcheck 45514/ - spremotetablet 46998/ - ``` + ```bash + Shell > awk -F ":" '{print $1}' /etc/passwd + root + bin + daemon + adm + lp + sync + ... + + Shell > tail -n 5 /etc/services | awk -F "\/" '{print $2}' + awk: warning: escape sequence `\/' treated as plain `/' + axio-disc 35100 + pmwebapi 44323 + cloudcheck-ping 45514 + cloudcheck 45514 + spremotetablet 46998 + ``` + + Ви також можете використовувати слова як роздільники. Дужки вказують, що це загальний роздільник, а "|" означає або. + + ```bash + Shell > tail -n 5 /etc/services | awk -F "(tcp)|(udp)" '{print $1}' + axio-disc 35100/ + pmwebapi 44323/ + cloudcheck-ping 45514/ + cloudcheck 45514/ + spremotetablet 46998/ + ``` 3. Присвоєння змінної - ```bash - Shell > tail -n 5 /etc/services | awk -v a=123 'BEGIN{print a}{print $1}' - 123 - axio-disc - pmwebapi - cloudcheck-ping - cloudcheck - spremotetablet - ``` - - Призначте значення визначених користувачем змінних у bash змінним awk. - - ```bash - Shell > ab=123 - Shell > echo ${ab} - 123 - Shell > tail -n 5 /etc/services | awk -v a=${ab} 'BEGIN{print a}{print $1}' - 123 - axio-disc - pmwebapi - cloudcheck-ping - cloudcheck - spremotetablet - ``` + ```bash + Shell > tail -n 5 /etc/services | awk -v a=123 'BEGIN{print a}{print $1}' + 123 + axio-disc + pmwebapi + cloudcheck-ping + cloudcheck + spremotetablet + ``` + + Призначте значення визначених користувачем змінних у bash змінним awk. + + ```bash + Shell > ab=123 + Shell > echo ${ab} + 123 + Shell > tail -n 5 /etc/services | awk -v a=${ab} 'BEGIN{print a}{print $1}' + 123 + axio-disc + pmwebapi + cloudcheck-ping + cloudcheck + spremotetablet + ``` 4. Записати глобальні змінні awk у файл - ```bash - Shell > seq 1 6 | awk --dump-variables '{print $0}' - 1 - 2 - 3 - 4 - 5 - 6 - - Shell > cat /root/awkvars.out - ARGC: 1 - ARGIND: 0 - ARGV: array, 1 elements - BINMODE: 0 - CONVFMT: "%.6g" - ENVIRON: array, 27 elements - ERRNO: "" - FIELDWIDTHS: "" - FILENAME: "-" - FNR: 6 - FPAT: "[^[:space:]]+" - FS: " " - FUNCTAB: array, 41 elements - IGNORECASE: 0 - LINT: 0 - NF: 1 - NR: 6 - OFMT: "%.6g" - OFS: " " - ORS: "\n" - PREC: 53 - PROCINFO: array, 20 elements - RLENGTH: 0 - ROUNDMODE: "N" - RS: "\n" - RSTART: 0 - RT: "\n" - SUBSEP: "\034" - SYMTAB: array, 28 elements - TEXTDOMAIN: "messages" - ``` - - Пізніше ми розповімо, що означають ці змінні. Щоб переглянути їх зараз, [перейдіть до змінних](#VARIABLES). + ```bash + Shell > seq 1 6 | awk --dump-variables '{print $0}' + 1 + 2 + 3 + 4 + 5 + 6 + + Shell > cat /root/awkvars.out + ARGC: 1 + ARGIND: 0 + ARGV: array, 1 elements + BINMODE: 0 + CONVFMT: "%.6g" + ENVIRON: array, 27 elements + ERRNO: "" + FIELDWIDTHS: "" + FILENAME: "-" + FNR: 6 + FPAT: "[^[:space:]]+" + FS: " " + FUNCTAB: array, 41 elements + IGNORECASE: 0 + LINT: 0 + NF: 1 + NR: 6 + OFMT: "%.6g" + OFS: " " + ORS: "\n" + PREC: 53 + PROCINFO: array, 20 elements + RLENGTH: 0 + ROUNDMODE: "N" + RS: "\n" + RSTART: 0 + RT: "\n" + SUBSEP: "\034" + SYMTAB: array, 28 elements + TEXTDOMAIN: "messages" + ``` + + Пізніше ми розповімо, що означають ці змінні. Щоб переглянути їх зараз, [перейдіть до змінних](#VARIABLES). 5. BEGIN{ } та END{ } - ```bash - Shell > head -n 5 /etc/passwd | awk 'BEGIN{print "UserName:PasswordIdentification:UID:InitGID"}{print $0}END{print "one\ntwo"}' - UserName:PasswordIdentification:UID:InitGID - root:x:0:0:root:/root:/bin/bash - bin:x:1:1:bin:/bin:/sbin/nologin - daemon:x:2:2:daemon:/sbin:/sbin/nologin - adm:x:3:4:adm:/var/adm:/sbin/nologin - lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin - one - two - ``` + ```bash + Shell > head -n 5 /etc/passwd | awk 'BEGIN{print "UserName:PasswordIdentification:UID:InitGID"}{print $0}END{print "one\ntwo"}' + UserName:PasswordIdentification:UID:InitGID + root:x:0:0:root:/root:/bin/bash + bin:x:1:1:bin:/bin:/sbin/nologin + daemon:x:2:2:daemon:/sbin:/sbin/nologin + adm:x:3:4:adm:/var/adm:/sbin/nologin + lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin + one + two + ``` 6. Опція --profile - ```bash - Shell > df -hT | awk --profile 'BEGIN{print "start line"}{print $0}END{print "end line"}' - start line - Filesystem Type Size Used Avail Use% Mounted on - devtmpfs devtmpfs 1.8G 0 1.8G 0% /dev - tmpfs tmpfs 1.8G 0 1.8G 0% /dev/shm - tmpfs tmpfs 1.8G 8.9M 1.8G 1% /run - tmpfs tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup - /dev/nvme0n1p2 ext4 47G 2.7G 42G 6% / - /dev/nvme0n1p1 xfs 1014M 181M 834M 18% /boot - tmpfs tmpfs 363M 0 363M 0% /run/user/0 - end line - - Shell > cat /root/awkprof.out - # gawk profile, created Fri Dec 8 15:12:56 2023 - - # BEGIN rule(s) - - BEGIN { - 1 print "start line" - } - - # Rule(s) - - 8 { - 8 print $0 - } - - # END rule(s) - - END { - 1 print "end line" - } - ``` - - Змініть файл awkprof.out. - - ```bash - Shell > vim /root/awkprof.out - BEGIN { - print "start line" - } - - { - print $0 - } - - END { - print "end line" - } - - Shell > df -hT | awk -f /root/awkprof.out - start line - Filesystem Type Size Used Avail Use% Mounted on - devtmpfs devtmpfs 1.8G 0 1.8G 0% /dev - tmpfs tmpfs 1.8G 0 1.8G 0% /dev/shm - tmpfs tmpfs 1.8G 8.9M 1.8G 1% /run - tmpfs tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup - /dev/nvme0n1p2 ext4 47G 2.7G 42G 6% / - /dev/nvme0n1p1 xfs 1014M 181M 834M 18% /boot - tmpfs tmpfs 363M 0 363M 0% /run/user/0 - end line - ``` + ```bash + Shell > df -hT | awk --profile 'BEGIN{print "start line"}{print $0}END{print "end line"}' + start line + Filesystem Type Size Used Avail Use% Mounted on + devtmpfs devtmpfs 1.8G 0 1.8G 0% /dev + tmpfs tmpfs 1.8G 0 1.8G 0% /dev/shm + tmpfs tmpfs 1.8G 8.9M 1.8G 1% /run + tmpfs tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup + /dev/nvme0n1p2 ext4 47G 2.7G 42G 6% / + /dev/nvme0n1p1 xfs 1014M 181M 834M 18% /boot + tmpfs tmpfs 363M 0 363M 0% /run/user/0 + end line + + Shell > cat /root/awkprof.out + # gawk profile, created Fri Dec 8 15:12:56 2023 + + # BEGIN rule(s) + + BEGIN { + 1 print "start line" + } + + # Rule(s) + + 8 { + 8 print $0 + } + + # END rule(s) + + END { + 1 print "end line" + } + ``` + + Змініть файл awkprof.out. + + ```bash + Shell > vim /root/awkprof.out + BEGIN { + print "start line" + } + + { + print $0 + } + + END { + print "end line" + } + + Shell > df -hT | awk -f /root/awkprof.out + start line + Filesystem Type Size Used Avail Use% Mounted on + devtmpfs devtmpfs 1.8G 0 1.8G 0% /dev + tmpfs tmpfs 1.8G 0 1.8G 0% /dev/shm + tmpfs tmpfs 1.8G 8.9M 1.8G 1% /run + tmpfs tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup + /dev/nvme0n1p2 ext4 47G 2.7G 42G 6% / + /dev/nvme0n1p1 xfs 1014M 181M 834M 18% /boot + tmpfs tmpfs 363M 0 363M 0% /run/user/0 + end line + ``` 7. Зіставте рядки (записи) за допомогою регулярних виразів - ```bash - Shell > cat /etc/services | awk '/[^0-9a-zA-Z]1[1-9]{2}\/tcp/ {print $0}' - sunrpc 111/tcp portmapper rpcbind # RPC 4.0 portmapper TCP - auth 113/tcp authentication tap ident - sftp 115/tcp - uucp-path 117/tcp - nntp 119/tcp readnews untp # USENET News Transfer Protocol - ntp 123/tcp - netbios-ns 137/tcp # NETBIOS Name Service - netbios-dgm 138/tcp # NETBIOS Datagram Service - netbios-ssn 139/tcp # NETBIOS session service - ... - ``` + ```bash + Shell > cat /etc/services | awk '/[^0-9a-zA-Z]1[1-9]{2}\/tcp/ {print $0}' + sunrpc 111/tcp portmapper rpcbind # RPC 4.0 portmapper TCP + auth 113/tcp authentication tap ident + sftp 115/tcp + uucp-path 117/tcp + nntp 119/tcp readnews untp # USENET News Transfer Protocol + ntp 123/tcp + netbios-ns 137/tcp # NETBIOS Name Service + netbios-dgm 138/tcp # NETBIOS Datagram Service + netbios-ssn 139/tcp # NETBIOS session service + ... + ``` 8. Логічні операції (логічне та, логічне АБО, зворотне) - logical and: && - logical OR: || - reverse: ! - - ```bash - Shell > cat /etc/services | awk '/[^0-9a-zA-Z]1[1-9]{2}\/tcp/ && /175/ {print $0}' - vmnet 175/tcp # VMNET - ``` - - ```bash - Shell > cat /etc/services | awk '/[^0-9a-zA-Z]9[1-9]{2}\/tcp/ || /91{2}\/tcp/ {print $0}' - telnets 992/tcp - imaps 993/tcp # IMAP over SSL - pop3s 995/tcp # POP-3 over SSL - mtp 1911/tcp # - rndc 953/tcp # rndc control sockets (BIND 9) - xact-backup 911/tcp # xact-backup - apex-mesh 912/tcp # APEX relay-relay service - apex-edge 913/tcp # APEX endpoint-relay service - ftps-data 989/tcp # ftp protocol, data, over TLS/SSL - nas 991/tcp # Netnews Administration System - vsinet 996/tcp # vsinet - maitrd 997/tcp # - busboy 998/tcp # - garcon 999/tcp # - #puprouter 999/tcp # - blockade 2911/tcp # Blockade - prnstatus 3911/tcp # Printer Status Port - cpdlc 5911/tcp # Controller Pilot Data Link Communication - manyone-xml 8911/tcp # manyone-xml - sype-transport 9911/tcp # SYPECom Transport Protocol - ``` - - ```bash - Shell > cat /etc/services | awk '!/(tcp)|(udp)/ {print $0}' - discard 9/sctp # Discard - discard 9/dccp # Discard SC:DISC - ftp-data 20/sctp # FTP - ftp 21/sctp # FTP - ssh 22/sctp # SSH - exp1 1021/sctp # RFC3692-style Experiment 1 (*) [RFC4727] - exp1 1021/dccp # RFC3692-style Experiment 1 (*) [RFC4727] - exp2 1022/sctp # RFC3692-style Experiment 2 (*) [RFC4727] - exp2 1022/dccp # RFC3692-style Experiment 2 (*) [RFC4727] - ltp-deepspace 1113/dccp # Licklider Transmission Protocol - cisco-ipsla 1167/sctp # Cisco IP SLAs Control Protocol - rcip-itu 2225/sctp # Resource Connection Initiation Protocol - m2ua 2904/sctp # M2UA - m3ua 2905/sctp # M3UA - megaco-h248 2944/sctp # Megaco-H.248 text - ... - ``` + logical and: && + logical OR: || + reverse: ! + + ```bash + Shell > cat /etc/services | awk '/[^0-9a-zA-Z]1[1-9]{2}\/tcp/ && /175/ {print $0}' + vmnet 175/tcp # VMNET + ``` + + ```bash + Shell > cat /etc/services | awk '/[^0-9a-zA-Z]9[1-9]{2}\/tcp/ || /91{2}\/tcp/ {print $0}' + telnets 992/tcp + imaps 993/tcp # IMAP over SSL + pop3s 995/tcp # POP-3 over SSL + mtp 1911/tcp # + rndc 953/tcp # rndc control sockets (BIND 9) + xact-backup 911/tcp # xact-backup + apex-mesh 912/tcp # APEX relay-relay service + apex-edge 913/tcp # APEX endpoint-relay service + ftps-data 989/tcp # ftp protocol, data, over TLS/SSL + nas 991/tcp # Netnews Administration System + vsinet 996/tcp # vsinet + maitrd 997/tcp # + busboy 998/tcp # + garcon 999/tcp # + #puprouter 999/tcp # + blockade 2911/tcp # Blockade + prnstatus 3911/tcp # Printer Status Port + cpdlc 5911/tcp # Controller Pilot Data Link Communication + manyone-xml 8911/tcp # manyone-xml + sype-transport 9911/tcp # SYPECom Transport Protocol + ``` + + ```bash + Shell > cat /etc/services | awk '!/(tcp)|(udp)/ {print $0}' + discard 9/sctp # Discard + discard 9/dccp # Discard SC:DISC + ftp-data 20/sctp # FTP + ftp 21/sctp # FTP + ssh 22/sctp # SSH + exp1 1021/sctp # RFC3692-style Experiment 1 (*) [RFC4727] + exp1 1021/dccp # RFC3692-style Experiment 1 (*) [RFC4727] + exp2 1022/sctp # RFC3692-style Experiment 2 (*) [RFC4727] + exp2 1022/dccp # RFC3692-style Experiment 2 (*) [RFC4727] + ltp-deepspace 1113/dccp # Licklider Transmission Protocol + cisco-ipsla 1167/sctp # Cisco IP SLAs Control Protocol + rcip-itu 2225/sctp # Resource Connection Initiation Protocol + m2ua 2904/sctp # M2UA + m3ua 2905/sctp # M3UA + megaco-h248 2944/sctp # Megaco-H.248 text + ... + ``` 9. Знаходить послідовні рядки за рядком і друкує їх - ```bash - Shell > cat /etc/services | awk '/^ntp/,/^netbios/ {print $0}' - ntp 123/tcp - ntp 123/udp # Network Time Protocol - netbios-ns 137/tcp # NETBIOS Name Service - ``` + ```bash + Shell > cat /etc/services | awk '/^ntp/,/^netbios/ {print $0}' + ntp 123/tcp + ntp 123/udp # Network Time Protocol + netbios-ns 137/tcp # NETBIOS Name Service + ``` - !!! info "примітка" + !!! info "примітка" - ``` - Початковий діапазон: припинення збігу, коли знайдено перший збіг. - Кінцевий діапазон: припинення збігу, коли знайдено перший збіг. - ``` + ``` + Початковий діапазон: припинення збігу, коли знайдено перший збіг. + Кінцевий діапазон: припинення збігу, коли знайдено перший збіг. + ``` ## Вбудована змінна {#VARIABLES} @@ -499,311 +499,311 @@ ID Name 1. FS та OFS - ```bash - Shell > cat /etc/passwd | awk 'BEGIN{FS=":"}{print $1}' - root - bin - daemon - adm - lp - sync - ``` - - Ви також можете використовувати опцію -v, щоб призначити значення змінним. - - ```bash - Shell > cat /etc/passwd | awk -v FS=":" '{print $1}' - root - bin - daemon - adm - lp - sync - ``` - - Роздільником виводу за замовчуванням є пробіл у разі використання ком для посилань на кілька полів. Однак ви можете вказати роздільник виведення окремо. - - ```bash - Shell > cat /etc/passwd | awk 'BEGIN{FS=":"}{print $1,$2}' - root x - bin x - daemon x - adm x - lp x - ``` - - ```bash - Shell > cat /etc/passwd | awk 'BEGIN{FS=":";OFS="\t"}{print $1,$2}' - # or - Shell > cat /etc/passwd | awk -v FS=":" -v OFS="\t" '{print $1,$2}' - root x - bin x - daemon x - adm x - lp x - ``` + ```bash + Shell > cat /etc/passwd | awk 'BEGIN{FS=":"}{print $1}' + root + bin + daemon + adm + lp + sync + ``` + + Ви також можете використовувати опцію -v, щоб призначити значення змінним. -2. RS та ORS + ```bash + Shell > cat /etc/passwd | awk -v FS=":" '{print $1}' + root + bin + daemon + adm + lp + sync + ``` - За замовчуванням `awk` використовує символи нового рядка, щоб розрізняти кожен запис рядка + Роздільником виводу за замовчуванням є пробіл у разі використання ком для посилань на кілька полів. Однак ви можете вказати роздільник виведення окремо. - ```bash - Shell > echo -e "https://example.com/books/index.html\ntitle//tcp" - https://example.com/books/index.html - title//tcp + ```bash + Shell > cat /etc/passwd | awk 'BEGIN{FS=":"}{print $1,$2}' + root x + bin x + daemon x + adm x + lp x + ``` - Shell > echo -e "https://example.com/books/index.html\ntitle//tcp" | awk 'BEGIN{RS="\/\/";ORS="%%"}{print $0}' - awk: cmd. line:1: warning: escape sequence `\/' treated as plain `/' - https:%%example.com/books/index.html - title%%tcp - %% ← Why? Because "print" - ``` + ```bash + Shell > cat /etc/passwd | awk 'BEGIN{FS=":";OFS="\t"}{print $1,$2}' + # or + Shell > cat /etc/passwd | awk -v FS=":" -v OFS="\t" '{print $1,$2}' + root x + bin x + daemon x + adm x + lp x + ``` + +2. RS та ORS + + За замовчуванням `awk` використовує символи нового рядка, щоб розрізняти кожен запис рядка + + ```bash + Shell > echo -e "https://example.com/books/index.html\ntitle//tcp" + https://example.com/books/index.html + title//tcp + + Shell > echo -e "https://example.com/books/index.html\ntitle//tcp" | awk 'BEGIN{RS="\/\/";ORS="%%"}{print $0}' + awk: cmd. line:1: warning: escape sequence `\/' treated as plain `/' + https:%%example.com/books/index.html + title%%tcp + %% ← Why? Because "print" + ``` 3. NF - Підрахувати кількість полів на рядок поточного тексту - - ```bash - Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {print NF}' - 7 - 7 - 7 - 7 - 7 - ``` - - Виведіть п'яте поле - - ```bash - Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {print $(NF-2)}' - root - bin - daemon - adm - lp - ``` - - Роздрукуйте останнє поле - - ```bash - Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {print $NF}' - /bin/bash - /sbin/nologin - /sbin/nologin - /sbin/nologin - /sbin/nologin - ``` - - Виключіть останні два поля - - ```bash - Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {$NF=" ";$(NF-1)=" ";print $0}' - root x 0 0 root - bin x 1 1 bin - daemon x 2 2 daemon - adm x 3 4 adm - lp x 4 7 lp - ``` - - Виключити перше поле - - ```bash - Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {$1=" ";print $0}' | sed -r 's/(^ )//g' - x 0 0 root /root /bin/bash - x 1 1 bin /bin /sbin/nologin - x 2 2 daemon /sbin /sbin/nologin - x 3 4 adm /var/adm /sbin/nologin - x 4 7 lp /var/spool/lpd /sbin/nologin - ``` + Підрахувати кількість полів на рядок поточного тексту + + ```bash + Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {print NF}' + 7 + 7 + 7 + 7 + 7 + ``` + + Виведіть п'яте поле + + ```bash + Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {print $(NF-2)}' + root + bin + daemon + adm + lp + ``` + + Роздрукуйте останнє поле + + ```bash + Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {print $NF}' + /bin/bash + /sbin/nologin + /sbin/nologin + /sbin/nologin + /sbin/nologin + ``` + + Виключіть останні два поля + + ```bash + Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {$NF=" ";$(NF-1)=" ";print $0}' + root x 0 0 root + bin x 1 1 bin + daemon x 2 2 daemon + adm x 3 4 adm + lp x 4 7 lp + ``` + + Виключити перше поле + + ```bash + Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {$1=" ";print $0}' | sed -r 's/(^ )//g' + x 0 0 root /root /bin/bash + x 1 1 bin /bin /sbin/nologin + x 2 2 daemon /sbin /sbin/nologin + x 3 4 adm /var/adm /sbin/nologin + x 4 7 lp /var/spool/lpd /sbin/nologin + ``` 4. NR та FNR - ```bash - Shell > tail -n 5 /etc/services | awk '{print NR,$0}' - 1 axio-disc 35100/udp # Axiomatic discovery protocol - 2 pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - 3 cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - 4 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - 5 spremotetablet 46998/tcp # Capture handwritten signatures - ``` - - Вивести загальну кількість рядків у вмісті файлу - - ```bash - Shell > cat /etc/services | awk 'END{print NR}' - 11473 - ``` - - Вивести вміст рядка 200 - - ```bash - Shell > cat /etc/services | awk 'NR==200' - microsoft-ds 445/tcp - ``` - - Виведіть друге поле в рядку 200 - - ```bash - Shell > cat /etc/services | awk 'BEGIN{RS="\n";ORS="\n"} NR==200 {print $2}' - 445/tcp - ``` - - Друк вмісту в певному діапазоні - - ```bash - Shell > cat /etc/services | awk 'BEGIN{RS="\n";ORS="\n"} NR<=10 {print NR,$0}' - 1 # /etc/services: - 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ - 3 # - 4 # Network services, Internet style - 5 # IANA services version: last updated 2016-07-08 - 6 # - 7 # Note that it is presently the policy of IANA to assign a single well-known - 8 # port number for both TCP and UDP; hence, most entries here have two entries - 9 # even if the protocol doesn't support UDP operations. - 10 # Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports - ``` - - Порівняння між NR і FNR - - ```bash - Shell > head -n 3 /etc/services > /tmp/a.txt - - Shell > cat /tmp/a.txt - # /etc/services: - # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ - # - - Shell > cat /etc/resolv.conf - # Generated by NetworkManager - nameserver 8.8.8.8 - nameserver 114.114.114.114 - - Shell > awk '{print NR,$0}' /tmp/a.txt /etc/resolv.conf - 1 # /etc/services: - 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ - 3 # - 4 # Generated by NetworkManager - 5 nameserver 8.8.8.8 - 6 nameserver 114.114.114.114 - - Shell > awk '{print FNR,$0}' /tmp/a.txt /etc/resolv.conf - 1 # /etc/services: - 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ - 3 # - 1 # Generated by NetworkManager - 2 nameserver 8.8.8.8 - 3 nameserver 114.114.114.114 - ``` + ```bash + Shell > tail -n 5 /etc/services | awk '{print NR,$0}' + 1 axio-disc 35100/udp # Axiomatic discovery protocol + 2 pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + 3 cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + 4 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + 5 spremotetablet 46998/tcp # Capture handwritten signatures + ``` + + Вивести загальну кількість рядків у вмісті файлу + + ```bash + Shell > cat /etc/services | awk 'END{print NR}' + 11473 + ``` + + Вивести вміст рядка 200 + + ```bash + Shell > cat /etc/services | awk 'NR==200' + microsoft-ds 445/tcp + ``` + + Виведіть друге поле в рядку 200 + + ```bash + Shell > cat /etc/services | awk 'BEGIN{RS="\n";ORS="\n"} NR==200 {print $2}' + 445/tcp + ``` + + Друк вмісту в певному діапазоні + + ```bash + Shell > cat /etc/services | awk 'BEGIN{RS="\n";ORS="\n"} NR<=10 {print NR,$0}' + 1 # /etc/services: + 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ + 3 # + 4 # Network services, Internet style + 5 # IANA services version: last updated 2016-07-08 + 6 # + 7 # Note that it is presently the policy of IANA to assign a single well-known + 8 # port number for both TCP and UDP; hence, most entries here have two entries + 9 # even if the protocol doesn't support UDP operations. + 10 # Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports + ``` + + Порівняння між NR і FNR + + ```bash + Shell > head -n 3 /etc/services > /tmp/a.txt + + Shell > cat /tmp/a.txt + # /etc/services: + # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ + # + + Shell > cat /etc/resolv.conf + # Generated by NetworkManager + nameserver 8.8.8.8 + nameserver 114.114.114.114 + + Shell > awk '{print NR,$0}' /tmp/a.txt /etc/resolv.conf + 1 # /etc/services: + 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ + 3 # + 4 # Generated by NetworkManager + 5 nameserver 8.8.8.8 + 6 nameserver 114.114.114.114 + + Shell > awk '{print FNR,$0}' /tmp/a.txt /etc/resolv.conf + 1 # /etc/services: + 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $ + 3 # + 1 # Generated by NetworkManager + 2 nameserver 8.8.8.8 + 3 nameserver 114.114.114.114 + ``` 5. ARGC та ARGV - ```bash - Shell > awk 'BEGIN{print ARGC}' log dump long - 4 - Shell > awk 'BEGIN{print ARGV[0]}' log dump long - awk - Shell > awk 'BEGIN{print ARGV[1]}' log dump long - log - Shell > awk 'BEGIN{print ARGV[2]}' log dump long - dump - ``` + ```bash + Shell > awk 'BEGIN{print ARGC}' log dump long + 4 + Shell > awk 'BEGIN{print ARGV[0]}' log dump long + awk + Shell > awk 'BEGIN{print ARGV[1]}' log dump long + log + Shell > awk 'BEGIN{print ARGV[2]}' log dump long + dump + ``` 6. ARGIND - Ця змінна в основному використовується для визначення файлу, з яким працює програма `awk`. + Ця змінна в основному використовується для визначення файлу, з яким працює програма `awk`. - ```bash - Shell > awk '{print ARGIND,$0}' /etc/hostname /etc/resolv.conf - 1 Master - 2 # Generated by NetworkManager - 2 nameserver 8.8.8.8 - 2 nameserver 114.114.114.114 - ``` + ```bash + Shell > awk '{print ARGIND,$0}' /etc/hostname /etc/resolv.conf + 1 Master + 2 # Generated by NetworkManager + 2 nameserver 8.8.8.8 + 2 nameserver 114.114.114.114 + ``` 7. ENVIRON - Ви можете посилатися на операційні системи або визначені користувачем змінні в програмах `awk`. - - ```bash - Shell > echo ${SSH_CLIENT} - 192.168.100.2 6969 22 + Ви можете посилатися на операційні системи або визначені користувачем змінні в програмах `awk`. - Shell > awk 'BEGIN{print ENVIRON["SSH_CLIENT"]}' - 192.168.100.2 6969 22 - - Shell > export a=123 - Shell > env | grep -w a - a=123 - Shell > awk 'BEGIN{print ENVIRON["a"]}' - 123 - Shell > unset a - ``` + ```bash + Shell > echo ${SSH_CLIENT} + 192.168.100.2 6969 22 + + Shell > awk 'BEGIN{print ENVIRON["SSH_CLIENT"]}' + 192.168.100.2 6969 22 + + Shell > export a=123 + Shell > env | grep -w a + a=123 + Shell > awk 'BEGIN{print ENVIRON["a"]}' + 123 + Shell > unset a + ``` 8. FILENAME - ```bash - Shell > awk 'BEGIN{RS="\n";ORS="\n"} NR=FNR {print ARGIND,FILENAME"---"$0}' /etc/hostname /etc/resolv.conf /etc/rocky-release - 1 /etc/hostname---Master - 2 /etc/resolv.conf---# Generated by NetworkManager - 2 /etc/resolv.conf---nameserver 8.8.8.8 - 2 /etc/resolv.conf---nameserver 114.114.114.114 - 3 /etc/rocky-release---Rocky Linux release 8.9 (Green Obsidian) - ``` + ```bash + Shell > awk 'BEGIN{RS="\n";ORS="\n"} NR=FNR {print ARGIND,FILENAME"---"$0}' /etc/hostname /etc/resolv.conf /etc/rocky-release + 1 /etc/hostname---Master + 2 /etc/resolv.conf---# Generated by NetworkManager + 2 /etc/resolv.conf---nameserver 8.8.8.8 + 2 /etc/resolv.conf---nameserver 114.114.114.114 + 3 /etc/rocky-release---Rocky Linux release 8.9 (Green Obsidian) + ``` 9. IGNORECASE - Ця змінна корисна, якщо ви хочете використовувати регулярні вирази в `awk` і ігнорувати регістр. - - ```bash - Shell > awk 'BEGIN{IGNORECASE=1;RS="\n";ORS="\n"} /^(SSH)|^(ftp)/ {print $0}' /etc/services - ftp-data 20/tcp - ftp-data 20/udp - ftp 21/tcp - ftp 21/udp fsp fspd - ssh 22/tcp # The Secure Shell (SSH) Protocol - ssh 22/udp # The Secure Shell (SSH) Protocol - ftp-data 20/sctp # FTP - ftp 21/sctp # FTP - ssh 22/sctp # SSH - ftp-agent 574/tcp # FTP Software Agent System - ftp-agent 574/udp # FTP Software Agent System - sshell 614/tcp # SSLshell - sshell 614/udp # SSLshell - ftps-data 989/tcp # ftp protocol, data, over TLS/SSL - ftps-data 989/udp # ftp protocol, data, over TLS/SSL - ftps 990/tcp # ftp protocol, control, over TLS/SSL - ftps 990/udp # ftp protocol, control, over TLS/SSL - ssh-mgmt 17235/tcp # SSH Tectia Manager - ssh-mgmt 17235/udp # SSH Tectia Manager - ``` - - ```bash - Shell > awk 'BEGIN{IGNORECASE=1;RS="\n";ORS="\n"} /^(SMTP)\s/,/^(TFTP)\s/ {print $0}' /etc/services - smtp 25/tcp mail - smtp 25/udp mail - time 37/tcp timserver - time 37/udp timserver - rlp 39/tcp resource # resource location - rlp 39/udp resource # resource location - nameserver 42/tcp name # IEN 116 - nameserver 42/udp name # IEN 116 - nicname 43/tcp whois - nicname 43/udp whois - tacacs 49/tcp # Login Host Protocol (TACACS) - tacacs 49/udp # Login Host Protocol (TACACS) - re-mail-ck 50/tcp # Remote Mail Checking Protocol - re-mail-ck 50/udp # Remote Mail Checking Protocol - domain 53/tcp # name-domain server - domain 53/udp - whois++ 63/tcp whoispp - whois++ 63/udp whoispp - bootps 67/tcp # BOOTP server - bootps 67/udp - bootpc 68/tcp dhcpc # BOOTP client - bootpc 68/udp dhcpc - tftp 69/tcp - ``` + Ця змінна корисна, якщо ви хочете використовувати регулярні вирази в `awk` і ігнорувати регістр. + + ```bash + Shell > awk 'BEGIN{IGNORECASE=1;RS="\n";ORS="\n"} /^(SSH)|^(ftp)/ {print $0}' /etc/services + ftp-data 20/tcp + ftp-data 20/udp + ftp 21/tcp + ftp 21/udp fsp fspd + ssh 22/tcp # The Secure Shell (SSH) Protocol + ssh 22/udp # The Secure Shell (SSH) Protocol + ftp-data 20/sctp # FTP + ftp 21/sctp # FTP + ssh 22/sctp # SSH + ftp-agent 574/tcp # FTP Software Agent System + ftp-agent 574/udp # FTP Software Agent System + sshell 614/tcp # SSLshell + sshell 614/udp # SSLshell + ftps-data 989/tcp # ftp protocol, data, over TLS/SSL + ftps-data 989/udp # ftp protocol, data, over TLS/SSL + ftps 990/tcp # ftp protocol, control, over TLS/SSL + ftps 990/udp # ftp protocol, control, over TLS/SSL + ssh-mgmt 17235/tcp # SSH Tectia Manager + ssh-mgmt 17235/udp # SSH Tectia Manager + ``` + + ```bash + Shell > awk 'BEGIN{IGNORECASE=1;RS="\n";ORS="\n"} /^(SMTP)\s/,/^(TFTP)\s/ {print $0}' /etc/services + smtp 25/tcp mail + smtp 25/udp mail + time 37/tcp timserver + time 37/udp timserver + rlp 39/tcp resource # resource location + rlp 39/udp resource # resource location + nameserver 42/tcp name # IEN 116 + nameserver 42/udp name # IEN 116 + nicname 43/tcp whois + nicname 43/udp whois + tacacs 49/tcp # Login Host Protocol (TACACS) + tacacs 49/udp # Login Host Protocol (TACACS) + re-mail-ck 50/tcp # Remote Mail Checking Protocol + re-mail-ck 50/udp # Remote Mail Checking Protocol + domain 53/tcp # name-domain server + domain 53/udp + whois++ 63/tcp whoispp + whois++ 63/udp whoispp + bootps 67/tcp # BOOTP server + bootps 67/udp + bootpc 68/tcp dhcpc # BOOTP client + bootpc 68/udp dhcpc + tftp 69/tcp + ``` ## Оператор @@ -847,336 +847,336 @@ False 1. Знак оклику - Вивести непарні рядки: - - ```bash - Shell > seq 1 10 | awk 'i=!i {print $0}' - 1 - 3 - 5 - 7 - 9 - ``` - - !!! питання - - ``` - **Чому?** - **Прочитайте перший рядок**: оскільки «i» не присвоєно значення, тому «i=!i» означає TRUE. - **Прочитайте другий рядок**: у цьому місці "i=!i" вказує на FALSE. - І так далі, останній надрукований рядок є непарним числом. - ``` - - Вивести парні рядки: - - ```bash - Shell > seq 1 10 | awk '!(i=!i)' - # or - Shell > seq 1 10 | awk '!(i=!i) {print $0}' - 2 - 4 - 6 - 8 - 10 - ``` - - !!! note "Примітка" - - ``` - Як бачите, іноді ви можете ігнорувати синтаксис для частини "action", яка за умовчанням еквівалентна "{print $0}". - ``` + Вивести непарні рядки: + + ```bash + Shell > seq 1 10 | awk 'i=!i {print $0}' + 1 + 3 + 5 + 7 + 9 + ``` + + !!! питання + + ``` + **Чому?** + **Прочитайте перший рядок**: оскільки «i» не присвоєно значення, тому «i=!i» означає TRUE. + **Прочитайте другий рядок**: у цьому місці "i=!i" вказує на FALSE. + І так далі, останній надрукований рядок є непарним числом. + ``` + + Вивести парні рядки: + + ```bash + Shell > seq 1 10 | awk '!(i=!i)' + # or + Shell > seq 1 10 | awk '!(i=!i) {print $0}' + 2 + 4 + 6 + 8 + 10 + ``` + + !!! note "Примітка" + + ``` + Як бачите, іноді ви можете ігнорувати синтаксис для частини "action", яка за умовчанням еквівалентна "{print $0}". + ``` 2. Розворот - ```bash - Shell > cat /etc/services | awk '!/(tcp)|(udp)|(^#)|(^$)/ {print $0}' - http 80/sctp # HyperText Transfer Protocol - bgp 179/sctp - https 443/sctp # http protocol over TLS/SSL - h323hostcall 1720/sctp # H.323 Call Control - nfs 2049/sctp nfsd shilp # Network File System - rtmp 1/ddp # Routing Table Maintenance Protocol - nbp 2/ddp # Name Binding Protocol - echo 4/ddp # AppleTalk Echo Protocol - zip 6/ddp # Zone Information Protocol - discard 9/sctp # Discard - discard 9/dccp # Discard SC:DISC - ... - ``` + ```bash + Shell > cat /etc/services | awk '!/(tcp)|(udp)|(^#)|(^$)/ {print $0}' + http 80/sctp # HyperText Transfer Protocol + bgp 179/sctp + https 443/sctp # http protocol over TLS/SSL + h323hostcall 1720/sctp # H.323 Call Control + nfs 2049/sctp nfsd shilp # Network File System + rtmp 1/ddp # Routing Table Maintenance Protocol + nbp 2/ddp # Name Binding Protocol + echo 4/ddp # AppleTalk Echo Protocol + zip 6/ddp # Zone Information Protocol + discard 9/sctp # Discard + discard 9/dccp # Discard SC:DISC + ... + ``` 3. Основні операції в математиці - ```bash - Shell > echo -e "36\n40\n50" | awk '{print $0+1}' - 37 - 41 - - Shell > echo -e "30\t5\t8\n11\t20\t34" - 30 5 8 - 11 20 34 - Shell > echo -e "30\t5\t8\n11\t20\t34" | awk '{print $2*2+1}' - 11 - 41 - ``` - - Його також можна використовувати в "шаблоні": - - ```bash - Shell > cat -n /etc/services | awk '/^[1-9]*/ && $1%2==0 {print $0}' - ... - 24 tcpmux 1/udp # TCP port service multiplexer - 26 rje 5/udp # Remote Job Entry - 28 echo 7/udp - 30 discard 9/udp sink null - 32 systat 11/udp users - 34 daytime 13/udp - 36 qotd 17/udp quote - ... - - Shell > cat -n /etc/services | awk '/^[1-9]*/ && $1%2!=0 {print $0}' - ... - 23 tcpmux 1/tcp # TCP port service multiplexer - 25 rje 5/tcp # Remote Job Entry - 27 echo 7/tcp - 29 discard 9/tcp sink null - 31 systat 11/tcp users - ... - ``` + ```bash + Shell > echo -e "36\n40\n50" | awk '{print $0+1}' + 37 + 41 + + Shell > echo -e "30\t5\t8\n11\t20\t34" + 30 5 8 + 11 20 34 + Shell > echo -e "30\t5\t8\n11\t20\t34" | awk '{print $2*2+1}' + 11 + 41 + ``` + + Його також можна використовувати в "шаблоні": + + ```bash + Shell > cat -n /etc/services | awk '/^[1-9]*/ && $1%2==0 {print $0}' + ... + 24 tcpmux 1/udp # TCP port service multiplexer + 26 rje 5/udp # Remote Job Entry + 28 echo 7/udp + 30 discard 9/udp sink null + 32 systat 11/udp users + 34 daytime 13/udp + 36 qotd 17/udp quote + ... + + Shell > cat -n /etc/services | awk '/^[1-9]*/ && $1%2!=0 {print $0}' + ... + 23 tcpmux 1/tcp # TCP port service multiplexer + 25 rje 5/tcp # Remote Job Entry + 27 echo 7/tcp + 29 discard 9/tcp sink null + 31 systat 11/tcp users + ... + ``` 4. Символ Pipe - Ви можете використовувати команду bash у програмі awk, наприклад: + Ви можете використовувати команду bash у програмі awk, наприклад: - ```bash - Shell > echo -e "6\n3\n9\n8" | awk '{print $0 | "sort"}' - 3 - 6 - 8 - 9 - ``` + ```bash + Shell > echo -e "6\n3\n9\n8" | awk '{print $0 | "sort"}' + 3 + 6 + 8 + 9 + ``` - !!! info "примітка" + !!! info "примітка" - ``` - Будь ласка, зверніть увагу! Ви повинні взяти подвійні лапки, щоб включити команду. - ``` + ``` + Будь ласка, зверніть увагу! Ви повинні взяти подвійні лапки, щоб включити команду. + ``` 5. Регулярний вираз - [Тут](#RE) ми розглядаємо основні приклади регулярних виразів. Ви можете використовувати регулярні вирази для записів рядків. + [Тут](#RE) ми розглядаємо основні приклади регулярних виразів. Ви можете використовувати регулярні вирази для записів рядків. - ```bash - Shell > cat /etc/services | awk '/[^0-9a-zA-Z]1[1-9]{2}\/tcp/ {print $0}' - - # Be equivalent to: + ```bash + Shell > cat /etc/services | awk '/[^0-9a-zA-Z]1[1-9]{2}\/tcp/ {print $0}' - Shell > cat /etc/services | awk '$0~/[^0-9a-zA-Z]1[1-9]{2}\/tcp/ {print $0}' - ``` + # Be equivalent to: - Якщо файл містить великий обсяг тексту, регулярні вирази також можна використовувати для полів, що допоможе підвищити ефективність обробки. Приклад використання такий: + Shell > cat /etc/services | awk '$0~/[^0-9a-zA-Z]1[1-9]{2}\/tcp/ {print $0}' + ``` - ```bash - Shell > cat /etc/services | awk '$0~/^(ssh)/ && $2~/tcp/ {print $0}' - ssh 22/tcp # The Secure Shell (SSH) Protocol - sshell 614/tcp # SSLshell - ssh-mgmt 17235/tcp # SSH Tectia Manager + Якщо файл містить великий обсяг тексту, регулярні вирази також можна використовувати для полів, що допоможе підвищити ефективність обробки. Приклад використання такий: - Shell > cat /etc/services | grep -v -E "(^#)|(^$)" | awk '$2!~/(tcp)|(udp)/ {print $0}' - http 80/sctp # HyperText Transfer Protocol - bgp 179/sctp - https 443/sctp # http protocol over TLS/SSL - h323hostcall 1720/sctp # H.323 Call Control - nfs 2049/sctp nfsd shilp # Network File System - rtmp 1/ddp # Routing Table Maintenance Protocol - nbp 2/ddp # Name Binding Protocol - ... - ``` + ```bash + Shell > cat /etc/services | awk '$0~/^(ssh)/ && $2~/tcp/ {print $0}' + ssh 22/tcp # The Secure Shell (SSH) Protocol + sshell 614/tcp # SSLshell + ssh-mgmt 17235/tcp # SSH Tectia Manager + + Shell > cat /etc/services | grep -v -E "(^#)|(^$)" | awk '$2!~/(tcp)|(udp)/ {print $0}' + http 80/sctp # HyperText Transfer Protocol + bgp 179/sctp + https 443/sctp # http protocol over TLS/SSL + h323hostcall 1720/sctp # H.323 Call Control + nfs 2049/sctp nfsd shilp # Network File System + rtmp 1/ddp # Routing Table Maintenance Protocol + nbp 2/ddp # Name Binding Protocol + ... + ``` ## Управління потоком 1. оператор **if** - Основний формат синтаксису - `if (condition) statement [ else statement ]` - - Приклад використання однієї гілки оператора if: - - ```bash - Shell > cat /etc/services | awk '{if(NR==110) print $0}' - pop3 110/udp pop-3 - ``` - - Умова визначається як регулярний вираз: - - ```bash - Shell > cat /etc/services | awk '{if(/^(ftp)\s|^(ssh)\s/) print $0}' - ftp 21/tcp - ftp 21/udp fsp fspd - ssh 22/tcp # The Secure Shell (SSH) Protocol - ssh 22/udp # The Secure Shell (SSH) Protocol - ftp 21/sctp # FTP - ssh 22/sctp # SSH - ``` - - Подвійна гілка: - - ```bash - Shell > seq 1 10 | awk '{if($0==10) print $0 ; else print "False"}' - False - False - False - False - False - False - False - False - False - 10 - ``` - - Кілька гілок: - - ```bash - Shell > cat /etc/services | awk '{ \ - if($1~/netbios/) - {print $0} - else if($2~/175/) - {print "175"} - else if($2~/137/) - {print "137"} - else {print "no"} - }' - ``` + Основний формат синтаксису - `if (condition) statement [ else statement ]` + + Приклад використання однієї гілки оператора if: + + ```bash + Shell > cat /etc/services | awk '{if(NR==110) print $0}' + pop3 110/udp pop-3 + ``` + + Умова визначається як регулярний вираз: + + ```bash + Shell > cat /etc/services | awk '{if(/^(ftp)\s|^(ssh)\s/) print $0}' + ftp 21/tcp + ftp 21/udp fsp fspd + ssh 22/tcp # The Secure Shell (SSH) Protocol + ssh 22/udp # The Secure Shell (SSH) Protocol + ftp 21/sctp # FTP + ssh 22/sctp # SSH + ``` + + Подвійна гілка: + + ```bash + Shell > seq 1 10 | awk '{if($0==10) print $0 ; else print "False"}' + False + False + False + False + False + False + False + False + False + 10 + ``` + + Кілька гілок: + + ```bash + Shell > cat /etc/services | awk '{ \ + if($1~/netbios/) + {print $0} + else if($2~/175/) + {print "175"} + else if($2~/137/) + {print "137"} + else {print "no"} + }' + ``` 2. оператор **while** - Основний формат синтаксису - `while (condition) statement` - - Перегляньте та роздрукуйте поля всіх записів рядків. - - ```bash - Shell > tail -n 2 /etc/services - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > tail -n 2 /etc/services | awk '{ \ - i=1; - while(i<=NF){print $i;i++} - }' - - cloudcheck - 45514/tcp - # - ASSIA - CloudCheck - WiFi - Management - System - spremotetablet - 46998/tcp - # - Capture - handwritten - signatures - ``` + Основний формат синтаксису - `while (condition) statement` + + Перегляньте та роздрукуйте поля всіх записів рядків. + + ```bash + Shell > tail -n 2 /etc/services + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + + Shell > tail -n 2 /etc/services | awk '{ \ + i=1; + while(i<=NF){print $i;i++} + }' + + cloudcheck + 45514/tcp + # + ASSIA + CloudCheck + WiFi + Management + System + spremotetablet + 46998/tcp + # + Capture + handwritten + signatures + ``` 3. оператор **for** - Основний формат синтаксису - `for (expr1; expr2; expr3) statement` - - Перегляньте та роздрукуйте поля всіх записів рядків. - - ```bash - Shell > tail -n 2 /etc/services | awk '{ \ - for(i=1;i<=NF;i++) print $i - }' - ``` - - Виведіть поля для кожного рядка записів у зворотному порядку. - - ```bash - Shell > tail -n 2 /etc/services | awk '{ \ - for(i=NF;i>=1;i--) print $i - }' - - System - Management - WiFi - CloudCheck - ASSIA - # - 45514/tcp - cloudcheck - signatures - handwritten - Capture - # - 46998/tcp - spremotetablet - ``` - - Друкуйте кожен рядок записів у зворотному напрямку. - - ```bash - Shell > tail -n 2 /etc/services | awk '{ \ - for(i=NF;i>=1;i--) {printf $i" "}; - print "" - }' - - System Management WiFi CloudCheck ASSIA # 45514/tcp cloudcheck - signatures handwritten Capture # 46998/tcp spremotetablet - ``` + Основний формат синтаксису - `for (expr1; expr2; expr3) statement` + + Перегляньте та роздрукуйте поля всіх записів рядків. + + ```bash + Shell > tail -n 2 /etc/services | awk '{ \ + for(i=1;i<=NF;i++) print $i + }' + ``` + + Виведіть поля для кожного рядка записів у зворотному порядку. + + ```bash + Shell > tail -n 2 /etc/services | awk '{ \ + for(i=NF;i>=1;i--) print $i + }' + + System + Management + WiFi + CloudCheck + ASSIA + # + 45514/tcp + cloudcheck + signatures + handwritten + Capture + # + 46998/tcp + spremotetablet + ``` + + Друкуйте кожен рядок записів у зворотному напрямку. + + ```bash + Shell > tail -n 2 /etc/services | awk '{ \ + for(i=NF;i>=1;i--) {printf $i" "}; + print "" + }' + + System Management WiFi CloudCheck ASSIA # 45514/tcp cloudcheck + signatures handwritten Capture # 46998/tcp spremotetablet + ``` 4. оператор **break** і оператор **continue** - Порівняння між ними виглядає наступним чином: - - ```bash - Shell > awk 'BEGIN{ \ - for(i=1;i<=10;i++) - { - if(i==3) {break}; - print i - } - }' - - 1 - 2 - ``` - - ```bash - Shell > awk 'BEGIN{ \ - for(i=1;i<=10;i++) - { - if(i==3) {continue}; - print i - } - }' - - 1 - 2 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - ``` + Порівняння між ними виглядає наступним чином: + + ```bash + Shell > awk 'BEGIN{ \ + for(i=1;i<=10;i++) + { + if(i==3) {break}; + print i + } + }' + + 1 + 2 + ``` + + ```bash + Shell > awk 'BEGIN{ \ + for(i=1;i<=10;i++) + { + if(i==3) {continue}; + print i + } + }' + + 1 + 2 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + ``` 5. оператор **exit** - Ви можете вказати значення, що повертається, у діапазоні [0,255] + Ви можете вказати значення, що повертається, у діапазоні [0,255] - Основний формат синтаксису - `exit [expression]` + Основний формат синтаксису - `exit [expression]` - ```bash - Shell > seq 1 10 | awk '{ - if($0~/5/) exit "135" - }' + ```bash + Shell > seq 1 10 | awk '{ + if($0~/5/) exit "135" + }' - Shell > echo $? - 135 - ``` + Shell > echo $? + 135 + ``` ## Масив @@ -1190,277 +1190,277 @@ False 1. Спеціальний масив - Формат - `Array_Name[Index]=Value` + Формат - `Array_Name[Index]=Value` - ```bash - Shell > awk 'BEGIN{a1[0]="test0" ; a1[1]="s1"; print a1[0]}' - test0 - ``` + ```bash + Shell > awk 'BEGIN{a1[0]="test0" ; a1[1]="s1"; print a1[0]}' + test0 + ``` - Отримати довжину масиву: + Отримати довжину масиву: - ```bash - Shell > awk 'BEGIN{name[-1]="jimcat8" ; name[3]="jack" ; print length(name)}' - 2 - ``` + ```bash + Shell > awk 'BEGIN{name[-1]="jimcat8" ; name[3]="jack" ; print length(name)}' + 2 + ``` - Зберігти всіх користувачів GNU/Linux у масиві: + Зберігти всіх користувачів GNU/Linux у масиві: - ```bash - Shell > cat /etc/passwd | awk -F ":" '{username[NR]=$1}END{print username[2]}' - bin - Shell > cat /etc/passwd | awk -F ":" '{username[NR]=$1}END{print username[1]}' - root - ``` + ```bash + Shell > cat /etc/passwd | awk -F ":" '{username[NR]=$1}END{print username[2]}' + bin + Shell > cat /etc/passwd | awk -F ":" '{username[NR]=$1}END{print username[1]}' + root + ``` - !!! info "примітка" + !!! info "примітка" - ```` - Числовий нижній індекс масиву `awk` може бути додатним цілим, від’ємним цілим числом, рядком або 0, тому числовий індекс масиву `awk` не має поняття початкового значення. Це не те саме, що масиви в bash. + ```` + Числовий нижній індекс масиву `awk` може бути додатним цілим, від’ємним цілим числом, рядком або 0, тому числовий індекс масиву `awk` не має поняття початкового значення. Це не те саме, що масиви в bash. - ```bash - Shell > arr1=(2 10 30 string1) - Shell > echo "${arr1[0]}" - 2 - Shell > unset arr1 - ``` - ```` + ```bash + Shell > arr1=(2 10 30 string1) + Shell > echo "${arr1[0]}" + 2 + Shell > unset arr1 + ``` + ```` 2. Видалити масив - Формат - `delete Array_Name` + Формат - `delete Array_Name` 3. Видалення елемента з масиву - Формат - `delete Array_Name[Index]` + Формат - `delete Array_Name[Index]` 4. Обхідний масив - Ви можете використовувати оператор **for**, який підходить для випадків, коли індекс масиву невідомий: - - ```bash - Shell > head -n 5 /etc/passwd | awk -F ":" ' \ - { - username[NR]=$1 - } - END { - for(i in username) - print username[i],i - } - ' - - root 1 - bin 2 - daemon 3 - adm 4 - lp 5 - ``` - - Якщо нижній індекс масиву звичайний, ви можете використовувати цю форму оператора **for**: - - ```bash - Shell > cat /etc/passwd | awk -F ":" ' \ - { - username[NR]=$1 - } - END{ - for(i=1;i<=NR;i++) - print username[i],i - } - ' - - root 1 - bin 2 - daemon 3 - adm 4 - lp 5 - sync 6 - shutdown 7 - halt 8 - ... - ``` + Ви можете використовувати оператор **for**, який підходить для випадків, коли індекс масиву невідомий: + + ```bash + Shell > head -n 5 /etc/passwd | awk -F ":" ' \ + { + username[NR]=$1 + } + END { + for(i in username) + print username[i],i + } + ' + + root 1 + bin 2 + daemon 3 + adm 4 + lp 5 + ``` + + Якщо нижній індекс масиву звичайний, ви можете використовувати цю форму оператора **for**: + + ```bash + Shell > cat /etc/passwd | awk -F ":" ' \ + { + username[NR]=$1 + } + END{ + for(i=1;i<=NR;i++) + print username[i],i + } + ' + + root 1 + bin 2 + daemon 3 + adm 4 + lp 5 + sync 6 + shutdown 7 + halt 8 + ... + ``` 5. Використовуйте "++" як нижній індекс масиву - ```bash - Shell > tail -n 5 /etc/group | awk -F ":" '\ - { - a[x++]=$1 - } - END{ - for(i in a) - print a[i],i - } - ' - - slocate 0 - unbound 1 - docker 2 - cgred 3 - redis 4 - ``` + ```bash + Shell > tail -n 5 /etc/group | awk -F ":" '\ + { + a[x++]=$1 + } + END{ + for(i in a) + print a[i],i + } + ' + + slocate 0 + unbound 1 + docker 2 + cgred 3 + redis 4 + ``` 6. Використовуйте поле як нижній індекс масиву - ```bash - Shell > tail -n 5 /etc/group | awk -F ":" '\ - { - a[$1]=$3 - } - END{ - for(i in a) - print a[i],i - } - ' - - 991 docker - 21 slocate - 989 redis - 992 unbound - 990 cgred - ``` + ```bash + Shell > tail -n 5 /etc/group | awk -F ":" '\ + { + a[$1]=$3 + } + END{ + for(i in a) + print a[i],i + } + ' + + 991 docker + 21 slocate + 989 redis + 992 unbound + 990 cgred + ``` 7. Підрахуйте кількість входжень одного поля - Підрахуйте кількість випадків однакової адреси IPv4. Основна ідея: - - - Спочатку скористайтеся командою `grep`, щоб відфільтрувати всі адреси IPv4 - - Потім передайте його програмі `awk` для обробки + Підрахуйте кількість випадків однакової адреси IPv4. Основна ідея: - ```bash - Shell > cat /var/log/secure | egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | awk ' \ - { - a[$1]++ - } - END{ - for(v in a) print a[v],v - } - ' + - Спочатку скористайтеся командою `grep`, щоб відфільтрувати всі адреси IPv4 + - Потім передайте його програмі `awk` для обробки - 4 0.0.0.0 - 4 192.168.100.2 - ``` + ```bash + Shell > cat /var/log/secure | egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | awk ' \ + { + a[$1]++ + } + END{ + for(v in a) print a[v],v + } + ' + + 4 0.0.0.0 + 4 192.168.100.2 + ``` - !!! info "примітка" + !!! info "примітка" - ``` - `a[$1]++` еквівалентно до `a[$1]+=1` - ``` + ``` + `a[$1]++` еквівалентно до `a[$1]+=1` + ``` - Підрахуйте кількість входжень слів незалежно від регістру. Основна ідея: + Підрахуйте кількість входжень слів незалежно від регістру. Основна ідея: - - Розділити всі поля на кілька рядків записів - - Потім передайте його програмі `awk` для обробки + - Розділити всі поля на кілька рядків записів + - Потім передайте його програмі `awk` для обробки - ```bash - Shell > cat /etc/services | awk -F " " '{for(i=1;i<=NF;i++) print $i}' + ```bash + Shell > cat /etc/services | awk -F " " '{for(i=1;i<=NF;i++) print $i}' - Shell > cat /etc/services | awk -F " " '{for(i=1;i<=NF;i++) print $i}' | awk '\ - BEGIN{IGNORECASE=1;OFS="\t"} /^netbios$/ || /^ftp$/ {a[$1]++} END{for(v in a) print a[v],v} - ' + Shell > cat /etc/services | awk -F " " '{for(i=1;i<=NF;i++) print $i}' | awk '\ + BEGIN{IGNORECASE=1;OFS="\t"} /^netbios$/ || /^ftp$/ {a[$1]++} END{for(v in a) print a[v],v} + ' - 3 NETBIOS - 18 FTP - 7 ftp + 3 NETBIOS + 18 FTP + 7 ftp - Shell > cat /etc/services | awk -F " " '{ for(i=1;i<=NF;i++) print $i }' | awk '\ - BEGIN{IGNORECASE=1;OFS="\t"} /^netbios$/ || /^ftp$/ {a[$1]++} END{for(v in a) \ - if(a[v]>=5) print a[v],v} - ' + Shell > cat /etc/services | awk -F " " '{ for(i=1;i<=NF;i++) print $i }' | awk '\ + BEGIN{IGNORECASE=1;OFS="\t"} /^netbios$/ || /^ftp$/ {a[$1]++} END{for(v in a) \ + if(a[v]>=5) print a[v],v} + ' - 18 FTP - 7 ftp - ``` + 18 FTP + 7 ftp + ``` - Ви можете спочатку відфільтрувати певні записи рядків, а потім виконати статистику, наприклад: + Ви можете спочатку відфільтрувати певні записи рядків, а потім виконати статистику, наприклад: - ```bash - Shell > ss -tulnp | awk -F " " '/tcp/ {a[$2]++} END{for(i in a) print a[i],i}' - 2 LISTEN - ``` + ```bash + Shell > ss -tulnp | awk -F " " '/tcp/ {a[$2]++} END{for(i in a) print a[i],i}' + 2 LISTEN + ``` 8. Вивести рядки на основі кількості входжень певного поля - ```bash - Shell > tail /etc/services - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > tail /etc/services | awk 'a[$1]++ {print $0}' - axio-disc 35100/udp # Axiomatic discovery protocol - ``` - - Зворотний: - - ```bash - Shell > tail /etc/services | awk '!a[$1]++ {print $0}' - aigairserver 21221/tcp # Services for Air Server - ka-kdp 31016/udp # Kollective Agent Kollective Delivery - ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - edi_service 34567/udp # dhanalakshmi.org EDI Service - axio-disc 35100/tcp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - ``` + ```bash + Shell > tail /etc/services + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + + Shell > tail /etc/services | awk 'a[$1]++ {print $0}' + axio-disc 35100/udp # Axiomatic discovery protocol + ``` + + Зворотний: + + ```bash + Shell > tail /etc/services | awk '!a[$1]++ {print $0}' + aigairserver 21221/tcp # Services for Air Server + ka-kdp 31016/udp # Kollective Agent Kollective Delivery + ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + edi_service 34567/udp # dhanalakshmi.org EDI Service + axio-disc 35100/tcp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + ``` 9. Багатовимірний масив - Програма `awk` не підтримує багатовимірні масиви, але підтримку багатовимірних масивів можна досягти за допомогою моделювання. За замовчуванням "\034" є роздільником для нижнього індексу багатовимірного масиву. - - Зверніть увагу на наступні відмінності під час використання багатовимірних масивів: - - ```bash - Shell > awk 'BEGIN{ a["1,0"]=100 ; a[2,0]=200 ; a["3","0"]=300 ; for(i in a) print a[i],i }' - 200 20 - 300 30 - 100 1,0 - ``` - - Перевизначте роздільник: - - ```bash - Shell > awk 'BEGIN{ SUBSEP="----" ; a["1,0"]=100 ; a[2,0]=200 ; a["3","0"]=300 ; for(i in a) print a[i],i }' - 300 3----0 - 200 2----0 - 100 1,0 - ``` - - Перезамовлення: - - ```bash - Shell > awk 'BEGIN{ SUBSEP="----" ; a["1,0"]=100 ; a[2,0]=200 ; a["3","0"]=300 ; for(i in a) print a[i],i | "sort" }' - 100 1,0 - 200 2----0 - 300 3----0 - ``` - - Підрахуйте, скільки разів з’являється поле: - - ```bash - Shell > cat c.txt - A 192.168.1.1 HTTP - B 192.168.1.2 HTTP - B 192.168.1.2 MYSQL - C 192.168.1.1 MYSQL - C 192.168.1.1 MQ - D 192.168.1.4 NGINX - - Shell > cat c.txt | awk 'BEGIN{SUBSEP="----"} {a[$1,$2]++} END{for(i in a) print a[i],i}' - 1 A----192.168.1.1 - 2 B----192.168.1.2 - 2 C----192.168.1.1 - 1 D----192.168.1.4 - ``` + Програма `awk` не підтримує багатовимірні масиви, але підтримку багатовимірних масивів можна досягти за допомогою моделювання. За замовчуванням "\034" є роздільником для нижнього індексу багатовимірного масиву. + + Зверніть увагу на наступні відмінності під час використання багатовимірних масивів: + + ```bash + Shell > awk 'BEGIN{ a["1,0"]=100 ; a[2,0]=200 ; a["3","0"]=300 ; for(i in a) print a[i],i }' + 200 20 + 300 30 + 100 1,0 + ``` + + Перевизначте роздільник: + + ```bash + Shell > awk 'BEGIN{ SUBSEP="----" ; a["1,0"]=100 ; a[2,0]=200 ; a["3","0"]=300 ; for(i in a) print a[i],i }' + 300 3----0 + 200 2----0 + 100 1,0 + ``` + + Перезамовлення: + + ```bash + Shell > awk 'BEGIN{ SUBSEP="----" ; a["1,0"]=100 ; a[2,0]=200 ; a["3","0"]=300 ; for(i in a) print a[i],i | "sort" }' + 100 1,0 + 200 2----0 + 300 3----0 + ``` + + Підрахуйте, скільки разів з’являється поле: + + ```bash + Shell > cat c.txt + A 192.168.1.1 HTTP + B 192.168.1.2 HTTP + B 192.168.1.2 MYSQL + C 192.168.1.1 MYSQL + C 192.168.1.1 MQ + D 192.168.1.4 NGINX + + Shell > cat c.txt | awk 'BEGIN{SUBSEP="----"} {a[$1,$2]++} END{for(i in a) print a[i],i}' + 1 A----192.168.1.1 + 2 B----192.168.1.2 + 2 C----192.168.1.1 + 1 D----192.168.1.4 + ``` ## Вбудована функція @@ -1487,331 +1487,331 @@ False 1. Функція **int** - ```bash - Shell > echo -e "qwer123\n123\nabc\n123abc123\n100.55\n-155.27" - qwer123 - 123 - abc - 123abc123 - 100.55 - -155.27 - - Shell > echo -e "qwer123\n123\nabc\n123abc123\n100.55\n-155.27" | awk '{print int($1)}' - 0 - 123 - 0 - 123 - 100 - -155 - ``` - - Як бачите, функція int працює лише для чисел, а коли зустрічається рядок, вона перетворює його на 0. Зустрівши рядок, що починається з числа, скоротіть його. + ```bash + Shell > echo -e "qwer123\n123\nabc\n123abc123\n100.55\n-155.27" + qwer123 + 123 + abc + 123abc123 + 100.55 + -155.27 + + Shell > echo -e "qwer123\n123\nabc\n123abc123\n100.55\n-155.27" | awk '{print int($1)}' + 0 + 123 + 0 + 123 + 100 + -155 + ``` + + Як бачите, функція int працює лише для чисел, а коли зустрічається рядок, вона перетворює його на 0. Зустрівши рядок, що починається з числа, скоротіть його. 2. Функція **sqrt** - ```bash - Shell > awk 'BEGIN{print sqrt(9)}' - 3 - ``` + ```bash + Shell > awk 'BEGIN{print sqrt(9)}' + 3 + ``` 3. Функції **rand** та **srand** - Приклад використання функції rand такий: - - ```bash - Shell > awk 'BEGIN{print rand()}' - 0.924046 - Shell > awk 'BEGIN{print rand()}' - 0.924046 - Shell > awk 'BEGIN{print rand()}' - 0.924046 - ``` - - Приклад використання функції srand такий: - - ```bash - Shell > awk 'BEGIN{srand() ; print rand()}' - 0.975495 - Shell > awk 'BEGIN{srand() ; print rand()}' - 0.99187 - Shell > awk 'BEGIN{srand() ; print rand()}' - 0.069002 - ``` - - Згенеруйте ціле число в діапазоні (0,100): - - ```bash - Shell > awk 'BEGIN{srand() ; print int(rand()*100)}' - 56 - Shell > awk 'BEGIN{srand() ; print int(rand()*100)}' - 33 - Shell > awk 'BEGIN{srand() ; print int(rand()*100)}' - 42 - ``` + Приклад використання функції rand такий: + + ```bash + Shell > awk 'BEGIN{print rand()}' + 0.924046 + Shell > awk 'BEGIN{print rand()}' + 0.924046 + Shell > awk 'BEGIN{print rand()}' + 0.924046 + ``` + + Приклад використання функції srand такий: + + ```bash + Shell > awk 'BEGIN{srand() ; print rand()}' + 0.975495 + Shell > awk 'BEGIN{srand() ; print rand()}' + 0.99187 + Shell > awk 'BEGIN{srand() ; print rand()}' + 0.069002 + ``` + + Згенеруйте ціле число в діапазоні (0,100): + + ```bash + Shell > awk 'BEGIN{srand() ; print int(rand()*100)}' + 56 + Shell > awk 'BEGIN{srand() ; print int(rand()*100)}' + 33 + Shell > awk 'BEGIN{srand() ; print int(rand()*100)}' + 42 + ``` 4. Функції **asort** та **asorti** - ```bash - Shell > cat /etc/passwd | awk -F ":" '{a[NR]=$1} END{anu=asort(a,b) ; for(i=1;i<=anu;i++) print i,b[i]}' - 1 adm - 2 bin - 3 chrony - 4 daemon - 5 dbus - 6 ftp - 7 games - 8 halt - 9 lp - 10 mail - 11 nobody - 12 operator - 13 polkitd - 14 redis - 15 root - 16 shutdown - 17 sshd - 18 sssd - 19 sync - 20 systemd-coredump - 21 systemd-resolve - 22 tss - 23 unbound - - Shell > awk 'BEGIN{a[1]=1000 ; a[2]=200 ; a[3]=30 ; a[4]="admin" ; a[5]="Admin" ; \ - a[6]="12string" ; a[7]=-1 ; a[8]=-10 ; a[9]=-20 ; a[10]=-21 ;nu=asort(a,b) ; for(i=1;i<=nu;i++) print i,b[i]}' - 1 -21 - 2 -20 - 3 -10 - 4 -1 - 5 30 - 6 200 - 7 1000 - 8 12string - 9 Admin - 10 admin - ``` - - !!! info "примітка" - - ``` - Правила сортування: - - * Числа мають вищий пріоритет, ніж рядки, і розташовані в порядку зростання. - * Розташуйте рядки в порядку зростання словника - ``` - - Якщо ви використовуєте функцію **asorti**, приклад такий: - - ```bash - Shell > awk 'BEGIN{ a[-11]=1000 ; a[-2]=200 ; a[-10]=30 ; a[-21]="admin" ; a[41]="Admin" ; \ - a[30]="12string" ; a["root"]="rootstr" ; a["Root"]="r1" ; nu=asorti(a,b) ; for(i in b) print i,b[i] }' - 1 -10 - 2 -11 - 3 -2 - 4 -21 - 5 30 - 6 41 - 7 Root - 8 root - ``` - - !!! info "примітка" - - ``` - Правила сортування: - - * Числа мають пріоритет над рядками - * Якщо зустрічається від’ємне число, порівнюється перша цифра зліва. Якщо воно однакове, буде порівнюватися друга цифра і так далі - * Якщо зустрінеться додатне число, воно буде розташовано в порядку зростання - * Розташуйте рядки в порядку зростання словника - ``` + ```bash + Shell > cat /etc/passwd | awk -F ":" '{a[NR]=$1} END{anu=asort(a,b) ; for(i=1;i<=anu;i++) print i,b[i]}' + 1 adm + 2 bin + 3 chrony + 4 daemon + 5 dbus + 6 ftp + 7 games + 8 halt + 9 lp + 10 mail + 11 nobody + 12 operator + 13 polkitd + 14 redis + 15 root + 16 shutdown + 17 sshd + 18 sssd + 19 sync + 20 systemd-coredump + 21 systemd-resolve + 22 tss + 23 unbound + + Shell > awk 'BEGIN{a[1]=1000 ; a[2]=200 ; a[3]=30 ; a[4]="admin" ; a[5]="Admin" ; \ + a[6]="12string" ; a[7]=-1 ; a[8]=-10 ; a[9]=-20 ; a[10]=-21 ;nu=asort(a,b) ; for(i=1;i<=nu;i++) print i,b[i]}' + 1 -21 + 2 -20 + 3 -10 + 4 -1 + 5 30 + 6 200 + 7 1000 + 8 12string + 9 Admin + 10 admin + ``` + + !!! info "примітка" + + ``` + Правила сортування: + + * Числа мають вищий пріоритет, ніж рядки, і розташовані в порядку зростання. + * Розташуйте рядки в порядку зростання словника + ``` + + Якщо ви використовуєте функцію **asorti**, приклад такий: + + ```bash + Shell > awk 'BEGIN{ a[-11]=1000 ; a[-2]=200 ; a[-10]=30 ; a[-21]="admin" ; a[41]="Admin" ; \ + a[30]="12string" ; a["root"]="rootstr" ; a["Root"]="r1" ; nu=asorti(a,b) ; for(i in b) print i,b[i] }' + 1 -10 + 2 -11 + 3 -2 + 4 -21 + 5 30 + 6 41 + 7 Root + 8 root + ``` + + !!! info "примітка" + + ``` + Правила сортування: + + * Числа мають пріоритет над рядками + * Якщо зустрічається від’ємне число, порівнюється перша цифра зліва. Якщо воно однакове, буде порівнюватися друга цифра і так далі + * Якщо зустрінеться додатне число, воно буде розташовано в порядку зростання + * Розташуйте рядки в порядку зростання словника + ``` 5. Функції **sub** та **gsub** - ```bash - Shell > cat /etc/services | awk '/netbios/ {sub(/tcp/,"test") ; print $0 }' - netbios-ns 137/test # NETBIOS Name Service - netbios-ns 137/udp - netbios-dgm 138/test # NETBIOS Datagram Service - netbios-dgm 138/udp - netbios-ssn 139/test # NETBIOS session service - netbios-ssn 139/udp - - Shell > cat /etc/services | awk '/^ftp/ && /21\/tcp/ {print $0}' - ftp 21/tcp - ↑ ↑ - Shell > cat /etc/services | awk 'BEGIN{OFS="\t"} /^ftp/ && /21\/tcp/ {gsub(/p/,"P",$2) ; print $0}' - ftp 21/tcP - ↑ - Shell > cat /etc/services | awk 'BEGIN{OFS="\t"} /^ftp/ && /21\/tcp/ {gsub(/p/,"P") ; print $0}' - ftP 21/tcP - ↑ ↑ - ``` - - Подібно до команди `sed`, ви також можете використовувати символ "&" для посилання на вже збігені рядки. - - ```bash - Shell > vim /tmp/tmp-file1.txt - A 192.168.1.1 HTTP - B 192.168.1.2 HTTP - B 192.168.1.2 MYSQL - C 192.168.1.1 MYSQL - C 192.168.1.1 MQ - D 192.168.1.4 NGINX - - # Add a line of text before the second line - Shell > cat /tmp/tmp-file1.txt | awk 'NR==2 {gsub(/.*/,"add a line\n&")} {print $0}' - A 192.168.1.1 HTTP - add a line - B 192.168.1.2 HTTP - B 192.168.1.2 MYSQL - C 192.168.1.1 MYSQL - C 192.168.1.1 MQ - D 192.168.1.4 NGINX - - # Add a string after the IP address in the second line - Shell > cat /tmp/tmp-file1.txt | awk 'NR==2 {gsub(/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/,"&\tSTRING")} {print $0}' - A 192.168.1.1 HTTP - B 192.168.1.2 STRING HTTP - B 192.168.1.2 MYSQL - C 192.168.1.1 MYSQL - C 192.168.1.1 MQ - D 192.168.1.4 NGINX - ``` + ```bash + Shell > cat /etc/services | awk '/netbios/ {sub(/tcp/,"test") ; print $0 }' + netbios-ns 137/test # NETBIOS Name Service + netbios-ns 137/udp + netbios-dgm 138/test # NETBIOS Datagram Service + netbios-dgm 138/udp + netbios-ssn 139/test # NETBIOS session service + netbios-ssn 139/udp + + Shell > cat /etc/services | awk '/^ftp/ && /21\/tcp/ {print $0}' + ftp 21/tcp + ↑ ↑ + Shell > cat /etc/services | awk 'BEGIN{OFS="\t"} /^ftp/ && /21\/tcp/ {gsub(/p/,"P",$2) ; print $0}' + ftp 21/tcP + ↑ + Shell > cat /etc/services | awk 'BEGIN{OFS="\t"} /^ftp/ && /21\/tcp/ {gsub(/p/,"P") ; print $0}' + ftP 21/tcP + ↑ ↑ + ``` + + Подібно до команди `sed`, ви також можете використовувати символ "&" для посилання на вже збігені рядки. + + ```bash + Shell > vim /tmp/tmp-file1.txt + A 192.168.1.1 HTTP + B 192.168.1.2 HTTP + B 192.168.1.2 MYSQL + C 192.168.1.1 MYSQL + C 192.168.1.1 MQ + D 192.168.1.4 NGINX + + # Add a line of text before the second line + Shell > cat /tmp/tmp-file1.txt | awk 'NR==2 {gsub(/.*/,"add a line\n&")} {print $0}' + A 192.168.1.1 HTTP + add a line + B 192.168.1.2 HTTP + B 192.168.1.2 MYSQL + C 192.168.1.1 MYSQL + C 192.168.1.1 MQ + D 192.168.1.4 NGINX + + # Add a string after the IP address in the second line + Shell > cat /tmp/tmp-file1.txt | awk 'NR==2 {gsub(/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/,"&\tSTRING")} {print $0}' + A 192.168.1.1 HTTP + B 192.168.1.2 STRING HTTP + B 192.168.1.2 MYSQL + C 192.168.1.1 MYSQL + C 192.168.1.1 MQ + D 192.168.1.4 NGINX + ``` 6. Функція **index** - ```bash - Shell > tail -n 5 /etc/services - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > tail -n 5 /etc/services | awk '{print index($2,"tcp")}' - 0 - 7 - 0 - 7 - 7 - ``` + ```bash + Shell > tail -n 5 /etc/services + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + + Shell > tail -n 5 /etc/services | awk '{print index($2,"tcp")}' + 0 + 7 + 0 + 7 + 7 + ``` 7. Функція **length** - ```bash - # The length of the output field - Shell > tail -n 5 /etc/services | awk '{print length($1)}' - 9 - 8 - 15 - 10 - 14 - - # The length of the output array - Shell > cat /etc/passwd | awk -F ":" 'a[NR]=$1 END{print length(a)}' - 22 - ``` + ```bash + # The length of the output field + Shell > tail -n 5 /etc/services | awk '{print length($1)}' + 9 + 8 + 15 + 10 + 14 + + # The length of the output array + Shell > cat /etc/passwd | awk -F ":" 'a[NR]=$1 END{print length(a)}' + 22 + ``` 8. Функція **match** - ```bash - Shell > echo -e "1592abc144qszd\n144bc\nbn" - 1592abc144qszd - 144bc - bn - - Shell > echo -e "1592abc144qszd\n144bc\nbn" | awk '{print match($1,144)}' - 8 - 1 - 0 - ``` + ```bash + Shell > echo -e "1592abc144qszd\n144bc\nbn" + 1592abc144qszd + 144bc + bn + + Shell > echo -e "1592abc144qszd\n144bc\nbn" | awk '{print match($1,144)}' + 8 + 1 + 0 + ``` 9. Функція **split** - ```bash - Shell > echo "365%tmp%dir%number" | awk '{split($1,a1,"%") ; for(i in a1) print i,a1[i]}' - 1 365 - 2 tmp - 3 dir - 4 number - ``` + ```bash + Shell > echo "365%tmp%dir%number" | awk '{split($1,a1,"%") ; for(i in a1) print i,a1[i]}' + 1 365 + 2 tmp + 3 dir + 4 number + ``` 10. Функція **substr** - ```bash - Shell > head -n 5 /etc/passwd - root:x:0:0:root:/root:/bin/bash - bin:x:1:1:bin:/bin:/sbin/nologin - daemon:x:2:2:daemon:/sbin:/sbin/nologin - adm:x:3:4:adm:/var/adm:/sbin/nologin - lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin - - # I need this part of the content - "emon:/sbin:/sbin/nologin" - Shell > head -n 5 /etc/passwd | awk '/daemon/ {print substr($0,16)}' - emon:/sbin:/sbin/nologin - - Shell > tail -n 5 /etc/services - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures - - # I need this part of the content - "tablet" - Shell > tail -n 5 /etc/services | awk '/^sp/ {print substr($1,9)}' - tablet - ``` + ```bash + Shell > head -n 5 /etc/passwd + root:x:0:0:root:/root:/bin/bash + bin:x:1:1:bin:/bin:/sbin/nologin + daemon:x:2:2:daemon:/sbin:/sbin/nologin + adm:x:3:4:adm:/var/adm:/sbin/nologin + lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin + + # I need this part of the content - "emon:/sbin:/sbin/nologin" + Shell > head -n 5 /etc/passwd | awk '/daemon/ {print substr($0,16)}' + emon:/sbin:/sbin/nologin + + Shell > tail -n 5 /etc/services + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures + + # I need this part of the content - "tablet" + Shell > tail -n 5 /etc/services | awk '/^sp/ {print substr($1,9)}' + tablet + ``` 11. Функції **tolower** та **toupper** - ```bash - Shell > echo -e "AbcD123\nqweR" | awk '{print tolower($0)}' - abcd123 - qwer + ```bash + Shell > echo -e "AbcD123\nqweR" | awk '{print tolower($0)}' + abcd123 + qwer - Shell > tail -n 5 /etc/services | awk '{print toupper($0)}' - AXIO-DISC 35100/UDP # AXIOMATIC DISCOVERY PROTOCOL - PMWEBAPI 44323/TCP # PERFORMANCE CO-PILOT CLIENT HTTP API - CLOUDCHECK-PING 45514/UDP # ASSIA CLOUDCHECK WIFI MANAGEMENT KEEPALIVE - CLOUDCHECK 45514/TCP # ASSIA CLOUDCHECK WIFI MANAGEMENT SYSTEM - SPREMOTETABLET 46998/TCP # CAPTURE HANDWRITTEN SIGNATURES - ``` + Shell > tail -n 5 /etc/services | awk '{print toupper($0)}' + AXIO-DISC 35100/UDP # AXIOMATIC DISCOVERY PROTOCOL + PMWEBAPI 44323/TCP # PERFORMANCE CO-PILOT CLIENT HTTP API + CLOUDCHECK-PING 45514/UDP # ASSIA CLOUDCHECK WIFI MANAGEMENT KEEPALIVE + CLOUDCHECK 45514/TCP # ASSIA CLOUDCHECK WIFI MANAGEMENT SYSTEM + SPREMOTETABLET 46998/TCP # CAPTURE HANDWRITTEN SIGNATURES + ``` 12. Функції, що працюють з часом і датою - **Що таке мітка часу UNIX?** - Згідно з історією розвитку GNU/Linux, UNIX V1 народилася в 1971 році, а книга «Посібник програміста UNIX» була опублікована 3 листопада того ж року, в якій 1970-01-01 є датою початку початку UNIX. + **Що таке мітка часу UNIX?** + Згідно з історією розвитку GNU/Linux, UNIX V1 народилася в 1971 році, а книга «Посібник програміста UNIX» була опублікована 3 листопада того ж року, в якій 1970-01-01 є датою початку початку UNIX. - Перетворення між міткою часу та природною датою та часом у днях: + Перетворення між міткою часу та природною датою та часом у днях: - ```bash - Shell > echo "$(( $(date --date="2024/01/06" +%s)/86400 + 1 ))" - 19728 + ```bash + Shell > echo "$(( $(date --date="2024/01/06" +%s)/86400 + 1 ))" + 19728 - Shell > date -d "1970-01-01 19728days" - Sat Jan 6 00:00:00 CST 2024 - ``` + Shell > date -d "1970-01-01 19728days" + Sat Jan 6 00:00:00 CST 2024 + ``` - Перетворення між міткою часу та природною датою та часом у секундах: + Перетворення між міткою часу та природною датою та часом у секундах: - ```bash - Shell > echo "$(date --date="2024/01/06 17:12:00" +%s)" - 1704532320 + ```bash + Shell > echo "$(date --date="2024/01/06 17:12:00" +%s)" + 1704532320 - Shell > echo "$(date --date='@1704532320')" - Sat Jan 6 17:12:00 CST 2024 - ``` + Shell > echo "$(date --date='@1704532320')" + Sat Jan 6 17:12:00 CST 2024 + ``` - Перетворення між природною датою та часом UNIX у програмі `awk`: + Перетворення між природною датою та часом UNIX у програмі `awk`: - ```bash - Shell > awk 'BEGIN{print systime()}' - 1704532597 + ```bash + Shell > awk 'BEGIN{print systime()}' + 1704532597 - Shell > echo "1704532597" | awk '{print strftime("%Y-%m-%d %H:%M:%S",$0)}' - 2024-01-06 17:16:37 - ``` + Shell > echo "1704532597" | awk '{print strftime("%Y-%m-%d %H:%M:%S",$0)}' + 2024-01-06 17:16:37 + ``` ## Оператор введення/виведення @@ -1829,205 +1829,205 @@ False 1. getline - ```bash - Shell > seq 1 10 | awk '/3/ || /6/ {getline ; print $0}' - 4 - 7 - - Shell > seq 1 10 | awk '/3/ || /6/ {print $0 ; getline ; print $0}' - 3 - 4 - 6 - 7 - ``` - - Використовуючи вивчені раніше функції та символ «&», ми можемо: - - ```bash - Shell > tail -n 5 /etc/services | awk '/45514\/tcp/ {getline ; gsub(/.*/ , "&\tSTRING1") ; print $0}' - spremotetablet 46998/tcp # Capture handwritten signatures STRING1 - - Shell > tail -n 5 /etc/services | awk '/45514\/tcp/ {print $0 ; getline; gsub(/.*/,"&\tSTRING2") } {print $0}' - axio-disc 35100/udp # Axiomatic discovery protocol - pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - spremotetablet 46998/tcp # Capture handwritten signatures STRING2 - ``` - - Вивести парні та непарні рядки: - - ```bash - Shell > tail -n 10 /etc/services | cat -n | awk '{ if( (getline) <= 1) print $0}' - 2 ka-kdp 31016/udp # Kollective Agent Kollective Delivery - 4 edi_service 34567/udp # dhanalakshmi.org EDI Service - 6 axio-disc 35100/udp # Axiomatic discovery protocol - 8 cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive - 10 spremotetablet 46998/tcp # Capture handwritten signatures - - Shell > tail -n 10 /etc/services | cat -n | awk '{if(NR==1) print $0} { if(NR%2==0) {if(getline > 0) print $0} }' - 1 aigairserver 21221/tcp # Services for Air Server - 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery - 5 axio-disc 35100/tcp # Axiomatic discovery protocol - 7 pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API - 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System - ``` + ```bash + Shell > seq 1 10 | awk '/3/ || /6/ {getline ; print $0}' + 4 + 7 + + Shell > seq 1 10 | awk '/3/ || /6/ {print $0 ; getline ; print $0}' + 3 + 4 + 6 + 7 + ``` + + Використовуючи вивчені раніше функції та символ «&», ми можемо: + + ```bash + Shell > tail -n 5 /etc/services | awk '/45514\/tcp/ {getline ; gsub(/.*/ , "&\tSTRING1") ; print $0}' + spremotetablet 46998/tcp # Capture handwritten signatures STRING1 + + Shell > tail -n 5 /etc/services | awk '/45514\/tcp/ {print $0 ; getline; gsub(/.*/,"&\tSTRING2") } {print $0}' + axio-disc 35100/udp # Axiomatic discovery protocol + pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + spremotetablet 46998/tcp # Capture handwritten signatures STRING2 + ``` + + Вивести парні та непарні рядки: + + ```bash + Shell > tail -n 10 /etc/services | cat -n | awk '{ if( (getline) <= 1) print $0}' + 2 ka-kdp 31016/udp # Kollective Agent Kollective Delivery + 4 edi_service 34567/udp # dhanalakshmi.org EDI Service + 6 axio-disc 35100/udp # Axiomatic discovery protocol + 8 cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive + 10 spremotetablet 46998/tcp # Capture handwritten signatures + + Shell > tail -n 10 /etc/services | cat -n | awk '{if(NR==1) print $0} { if(NR%2==0) {if(getline > 0) print $0} }' + 1 aigairserver 21221/tcp # Services for Air Server + 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery + 5 axio-disc 35100/tcp # Axiomatic discovery protocol + 7 pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API + 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System + ``` 2. getline var - Додайте кожен рядок b-файлу в кінець кожного рядка C-файлу: - - ```bash - Shell > cat /tmp/b.txt - b1 - b2 - b3 - b4 - b5 - b6 - - Shell > cat /tmp/c.txt - A 192.168.1.1 HTTP - B 192.168.1.2 HTTP - B 192.168.1.2 MYSQL - C 192.168.1.1 MYSQL - C 192.168.1.1 MQ - D 192.168.1.4 NGINX - - Shell > awk '{getline var1 <"/tmp/b.txt" ; print $0 , var1}' /tmp/c.txt - A 192.168.1.1 HTTP b1 - B 192.168.1.2 HTTP b2 - B 192.168.1.2 MYSQL b3 - C 192.168.1.1 MYSQL b4 - C 192.168.1.1 MQ b5 - D 192.168.1.4 NGINX b6 - ``` - - Замініть вказане поле файлу c на рядок вмісту файлу b: - - ```bash - Shell > awk '{ getline var2 < "/tmp/b.txt" ; gsub($2 , var2 , $2) ; print $0 }' /tmp/c.txt - A b1 HTTP - B b2 HTTP - B b3 MYSQL - C b4 MYSQL - C b5 MQ - D b6 NGINX - ``` + Додайте кожен рядок b-файлу в кінець кожного рядка C-файлу: + + ```bash + Shell > cat /tmp/b.txt + b1 + b2 + b3 + b4 + b5 + b6 + + Shell > cat /tmp/c.txt + A 192.168.1.1 HTTP + B 192.168.1.2 HTTP + B 192.168.1.2 MYSQL + C 192.168.1.1 MYSQL + C 192.168.1.1 MQ + D 192.168.1.4 NGINX + + Shell > awk '{getline var1 <"/tmp/b.txt" ; print $0 , var1}' /tmp/c.txt + A 192.168.1.1 HTTP b1 + B 192.168.1.2 HTTP b2 + B 192.168.1.2 MYSQL b3 + C 192.168.1.1 MYSQL b4 + C 192.168.1.1 MQ b5 + D 192.168.1.4 NGINX b6 + ``` + + Замініть вказане поле файлу c на рядок вмісту файлу b: + + ```bash + Shell > awk '{ getline var2 < "/tmp/b.txt" ; gsub($2 , var2 , $2) ; print $0 }' /tmp/c.txt + A b1 HTTP + B b2 HTTP + B b3 MYSQL + C b4 MYSQL + C b5 MQ + D b6 NGINX + ``` 3. command | getline [var] - ```bash - Shell > awk 'BEGIN{ "date +%Y%m%d" | getline datenow ; print datenow}' - 20240107 - ``` + ```bash + Shell > awk 'BEGIN{ "date +%Y%m%d" | getline datenow ; print datenow}' + 20240107 + ``` - !!! tip "Підказка" + !!! tip "Підказка" - ``` - Використовуйте подвійні лапки, щоб включити команду Shell. - ``` + ``` + Використовуйте подвійні лапки, щоб включити команду Shell. + ``` 4. next - Раніше ми представили оператори **break** і **continue**, перший використовувався для завершення циклу, а другий використовувався для виходу з поточного циклу. Дивись [тут](#bc). Для **наступного**, коли умови виконуються, він зупиняє вхідний запис, який відповідає умовам, і продовжить наступні дії. + Раніше ми представили оператори **break** і **continue**, перший використовувався для завершення циклу, а другий використовувався для виходу з поточного циклу. Дивись [тут](#bc). Для **наступного**, коли умови виконуються, він зупиняє вхідний запис, який відповідає умовам, і продовжить наступні дії. - ```bash - Shell > seq 1 5 | awk '{if(NR==3) {next} print $0}' - 1 - 2 - 4 - 5 - - # equivalent to - Shell > seq 1 5 | awk '{if($1!=3) print $0}' - ``` + ```bash + Shell > seq 1 5 | awk '{if(NR==3) {next} print $0}' + 1 + 2 + 4 + 5 - Пропустити придатні записи рядків: + # equivalent to + Shell > seq 1 5 | awk '{if($1!=3) print $0}' + ``` - ```bash - Shell > cat /etc/passwd | awk -F ":" 'NR>5 {next} {print $0}' - root:x:0:0:root:/root:/bin/bash - bin:x:1:1:bin:/bin:/sbin/nologin - daemon:x:2:2:daemon:/sbin:/sbin/nologin - adm:x:3:4:adm:/var/adm:/sbin/nologin - lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin + Пропустити придатні записи рядків: - # equivalent to - Shell > cat /etc/passwd | awk -F ":" 'NR>=1 && NR<=5 {print $0}' - ``` + ```bash + Shell > cat /etc/passwd | awk -F ":" 'NR>5 {next} {print $0}' + root:x:0:0:root:/root:/bin/bash + bin:x:1:1:bin:/bin:/sbin/nologin + daemon:x:2:2:daemon:/sbin:/sbin/nologin + adm:x:3:4:adm:/var/adm:/sbin/nologin + lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin + + # equivalent to + Shell > cat /etc/passwd | awk -F ":" 'NR>=1 && NR<=5 {print $0}' + ``` - !!! tip "Підказка" + !!! tip "Підказка" - ``` - "**next**" не можна використовувати в "BEGIN{}" і "END{}". - ``` + ``` + "**next**" не можна використовувати в "BEGIN{}" і "END{}". + ``` 5. Функція **system** - Ви можете використовувати цю функцію для виклику команд в Shell, наприклад: + Ви можете використовувати цю функцію для виклику команд в Shell, наприклад: - ```bash - Shell > awk 'BEGIN{ system("echo nginx http") }' - nginx http - ``` + ```bash + Shell > awk 'BEGIN{ system("echo nginx http") }' + nginx http + ``` - !!! tip "Підказка" + !!! tip "Підказка" - ```` - Під час використання функції **system** слід додавати подвійні лапки. Якщо не додати, програма `awk` вважатиме його змінною програми `awk`. + ```` + Під час використання функції **system** слід додавати подвійні лапки. Якщо не додати, програма `awk` вважатиме його змінною програми `awk`. - ```bash - Shell > awk 'BEGIN{ cmd1="date +%Y" ; system(cmd1)}' - 2024 - ``` - ```` + ```bash + Shell > awk 'BEGIN{ cmd1="date +%Y" ; system(cmd1)}' + 2024 + ``` + ```` - **Що робити, якщо сама команда Shell містить подвійні лапки?** - Використовувати символи екранування - "\\", такі як: + **Що робити, якщо сама команда Shell містить подвійні лапки?** + Використовувати символи екранування - "\\", такі як: - ```bash - Shell > egrep "^root|^nobody" /etc/passwd - Shell > awk 'BEGIN{ system("egrep \"^root|^nobody\" /etc/passwd") }' - root:x:0:0:root:/root:/bin/bash - nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin - ``` + ```bash + Shell > egrep "^root|^nobody" /etc/passwd + Shell > awk 'BEGIN{ system("egrep \"^root|^nobody\" /etc/passwd") }' + root:x:0:0:root:/root:/bin/bash + nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin + ``` - Інший приклад: + Інший приклад: - ```bash - Shell > awk 'BEGIN{ if ( system("xmind &> /dev/null") == 0 ) print "True"; else print "False" }' - False - ``` + ```bash + Shell > awk 'BEGIN{ if ( system("xmind &> /dev/null") == 0 ) print "True"; else print "False" }' + False + ``` 6. Запишіть вихідні дані програми `awk` у файл - ```bash - Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{OFS="\t"} {print $1,$2 > "/tmp/user.txt"}' - Shell > cat /tmp/user.txt - root x - bin x - daemon x - adm x - lp x - ``` + ```bash + Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{OFS="\t"} {print $1,$2 > "/tmp/user.txt"}' + Shell > cat /tmp/user.txt + root x + bin x + daemon x + adm x + lp x + ``` - !!! tip "Підказка" + !!! tip "Підказка" - ``` - "**>**" вказує на запис у файл як накладання. Якщо ви хочете писати у файл як додаток, використовуйте "**>>**". Ще раз нагадуємо, що шлях до файлу слід взяти в подвійні лапки. - ``` + ``` + "**>**" вказує на запис у файл як накладання. Якщо ви хочете писати у файл як додаток, використовуйте "**>>**". Ще раз нагадуємо, що шлях до файлу слід взяти в подвійні лапки. + ``` 7. pipe символ 8. Спеціальні функції - синтаксис - `function NAME(parameter list) { function body }`. Як от: + синтаксис - `function NAME(parameter list) { function body }`. Як от: - ```bash - Shell > awk 'function mysum(a,b) {return a+b} BEGIN{print mysum(1,6)}' - 7 - ``` + ```bash + Shell > awk 'function mysum(a,b) {return a+b} BEGIN{print mysum(1,6)}' + 7 + ``` ## Заключні зауваження diff --git a/docs/books/web_services/02-web-servers-intro.it.md b/docs/books/web_services/02-web-servers-intro.it.md index ad5c724812..9943b4ab19 100644 --- a/docs/books/web_services/02-web-servers-intro.it.md +++ b/docs/books/web_services/02-web-servers-intro.it.md @@ -23,14 +23,14 @@ Gli attuali protocolli HTTP sono la versione 1.1, ampiamente utilizzata, e le ve Una responce HTTP è un insieme di righe inviate al browser dal server. Che include: -- Una **status line**: specifica la versione del protocollo e lo stato di elaborazione della richiesta utilizzando un codice e un testo esplicativo. La riga comprende tre elementi separati da uno spazio: - - La versione del protocollo utilizzata - - Lo status code - - Il significato del codice + - Una **status line**: specifica la versione del protocollo e lo stato di elaborazione della richiesta utilizzando un codice e un testo esplicativo. La riga comprende tre elementi separati da uno spazio: + - La versione del protocollo utilizzata + - Lo status code + - Il significato del codice -- **Response header fields**: queste righe opzionali forniscono informazioni aggiuntive sulla risposta e/o sul server. Ogni riga è composta da un nome che qualifica il header type, seguito da due punti (:) e dal header value. + - **Response header fields**: queste righe opzionali forniscono informazioni aggiuntive sulla risposta e/o sul server. Ogni riga è composta da un nome che qualifica il header type, seguito da due punti (:) e dal header value. -- **The response body**: contiene il documento richiesto. + - **The response body**: contiene il documento richiesto. Ecco un esempio di risposta HTTP: @@ -70,15 +70,15 @@ Un URL ha tre parti: ://:/ ``` -- **Protocol name**: si tratta del linguaggio utilizzato per comunicare in rete, come HTTP, HTTPS, FTP, ecc. I protocolli più utilizzati sono l'HTTP (HyperText Transfer Protocol) e la sua versione sicura, l'HTTPS, utilizzata per lo scambio di pagine Web in formato HTML. + - **Protocol name**: si tratta del linguaggio utilizzato per comunicare in rete, come HTTP, HTTPS, FTP, ecc. I protocolli più utilizzati sono l'HTTP (HyperText Transfer Protocol) e la sua versione sicura, l'HTTPS, utilizzata per lo scambio di pagine Web in formato HTML. -- **Login** e **password**: Questa opzione consente di specificare i parametri di accesso a un server sicuro. Non è consigliabile, poiché la password è visibile nell'URL (per motivi di sicurezza). + - **Login** e **password**: Questa opzione consente di specificare i parametri di accesso a un server sicuro. Non è consigliabile, poiché la password è visibile nell'URL (per motivi di sicurezza). -- **Host**: È il nome del computer che ospita la risorsa richiesta. È possibile utilizzare anche l'indirizzo IP del server, ma ciò rende l'URL meno leggibile. + - **Host**: È il nome del computer che ospita la risorsa richiesta. È possibile utilizzare anche l'indirizzo IP del server, ma ciò rende l'URL meno leggibile. -- **Port number**: È associato a un servizio che consente al server di conoscere il tipo di risorsa richiesta. La porta predefinita del protocollo HTTP è la 80 e la 443 per HTTPS. Pertanto, il numero di porta è facoltativo quando il protocollo è HTTP o HTTPS. + - **Port number**: È associato a un servizio che consente al server di conoscere il tipo di risorsa richiesta. La porta predefinita del protocollo HTTP è la 80 e la 443 per HTTPS. Pertanto, il numero di porta è facoltativo quando il protocollo è HTTP o HTTPS. -- **Resource path**: Questa parte consente al server di conoscere la posizione della risorsa. In genere, si tratta della posizione (directory) e del nome del file richiesto. Se l'indirizzo non specifica una posizione, indica la prima pagina dell'host. Altrimenti, indica il percorso della pagina da visualizzare. + - **Resource path**: Questa parte consente al server di conoscere la posizione della risorsa. In genere, si tratta della posizione (directory) e del nome del file richiesto. Se l'indirizzo non specifica una posizione, indica la prima pagina dell'host. Altrimenti, indica il percorso della pagina da visualizzare. ### Porte diff --git a/docs/books/web_services/02-web-servers-intro.uk.md b/docs/books/web_services/02-web-servers-intro.uk.md index b76fc2f781..634d929860 100644 --- a/docs/books/web_services/02-web-servers-intro.uk.md +++ b/docs/books/web_services/02-web-servers-intro.uk.md @@ -23,14 +23,14 @@ HTTP — це протокол «запит-відповідь», що прац Відповідь HTTP – це набір рядків, які сервер надсилає браузеру. Це включає: -- **Рядок стану**: вказує версію протоколу та статус обробки запиту за допомогою коду та пояснювального тексту. Рядок складається з трьох елементів, розділених пробілом: - - Використана версія протоколу - - Код стану - - Значення коду + - **Рядок стану**: вказує версію протоколу та статус обробки запиту за допомогою коду та пояснювального тексту. Рядок складається з трьох елементів, розділених пробілом: + - Використана версія протоколу + - Код стану + - Значення коду -- **Поля заголовка відповіді**: це необов’язкові рядки, які надають додаткову інформацію про відповідь та/або сервер. Кожен рядок складається з назви, яка визначає тип заголовка, за якою йде двокрапка (:) і значення заголовка. + - **Поля заголовка відповіді**: це необов’язкові рядки, які надають додаткову інформацію про відповідь та/або сервер. Кожен рядок складається з назви, яка визначає тип заголовка, за якою йде двокрапка (:) і значення заголовка. -- **Тіло відповіді**: містить запитуваний документ. + - **Тіло відповіді**: містить запитуваний документ. Ось приклад відповіді HTTP: @@ -70,15 +70,15 @@ URL-адреса складається з трьох частин: ://:/ ``` -- **Назва протоколу**: це мова, яка використовується для спілкування через мережу, як-от HTTP, HTTPS, FTP тощо. Найпоширенішими протоколами є HTTP (протокол передачі гіпертексту) і його безпечна версія HTTPS, яка використовується для обміну веб-сторінками у форматі HTML. + - **Назва протоколу**: це мова, яка використовується для спілкування через мережу, як-от HTTP, HTTPS, FTP тощо. Найпоширенішими протоколами є HTTP (протокол передачі гіпертексту) і його безпечна версія HTTPS, яка використовується для обміну веб-сторінками у форматі HTML. -- **Логін** і **пароль**: дозволяє вказати параметри доступу до захищеного сервера. Цей параметр не рекомендується, оскільки пароль відображається в URL-адресі (з міркувань безпеки). + - **Логін** і **пароль**: дозволяє вказати параметри доступу до захищеного сервера. Цей параметр не рекомендується, оскільки пароль відображається в URL-адресі (з міркувань безпеки). -- **Хост**: це ім’я комп’ютера, на якому розміщено запитуваний ресурс. Зауважте, що можливе використання IP-адреси сервера, що робить URL-адресу менш читабельною. + - **Хост**: це ім’я комп’ютера, на якому розміщено запитуваний ресурс. Зауважте, що можливе використання IP-адреси сервера, що робить URL-адресу менш читабельною. -- **Номер порту**: це пов’язано зі службою, яка дозволяє серверу знати запитуваний тип ресурсу. Порт протоколу HTTP за замовчуванням — порт 80 і 443 із HTTPS. Отже, номер порту необов’язковий, якщо протокол HTTP або HTTPS. + - **Номер порту**: це пов’язано зі службою, яка дозволяє серверу знати запитуваний тип ресурсу. Порт протоколу HTTP за замовчуванням — порт 80 і 443 із HTTPS. Отже, номер порту необов’язковий, якщо протокол HTTP або HTTPS. -- **Шлях ресурсу**: ця частина дозволяє серверу знати розташування ресурсу. Як правило, це розташування (каталог) і ім’я запитуваного файлу. Якщо в адресі нічого не вказано місце розташування, це вказує на першу сторінку хоста. В іншому випадку він вказує шлях до сторінки для відображення. + - **Шлях ресурсу**: ця частина дозволяє серверу знати розташування ресурсу. Як правило, це розташування (каталог) і ім’я запитуваного файлу. Якщо в адресі нічого не вказано місце розташування, це вказує на першу сторінку хоста. В іншому випадку він вказує шлях до сторінки для відображення. ### Порти diff --git a/docs/books/web_services/022-web-servers-nginx.it.md b/docs/books/web_services/022-web-servers-nginx.it.md index 81d489f4d7..28472885fe 100644 --- a/docs/books/web_services/022-web-servers-nginx.it.md +++ b/docs/books/web_services/022-web-servers-nginx.it.md @@ -43,24 +43,24 @@ Nginx ha una quota di mercato significativa del 28% sui siti più trafficati, su Nginx offre le seguenti funzioni di base: -- Hosting per pagine web statiche -- Index page generation automatico -- Reverse proxy accelerato con cache -- Bilanciamento del carico -- Tolleranza agli errori -- Supporto cache per FastCGI, uWSGI, SCGI e server cache Memcached -- Vari filtri per gzip, xslt, ssi, trasformazione delle immagini e altro ancora -- Supporto per SSL/TLS e SNI -- Supporto per HPPT/2 + - Hosting per pagine web statiche + - Index page generation automatico + - Reverse proxy accelerato con cache + - Bilanciamento del carico + - Tolleranza agli errori + - Supporto cache per FastCGI, uWSGI, SCGI e server cache Memcached + - Vari filtri per gzip, xslt, ssi, trasformazione delle immagini e altro ancora + - Supporto per SSL/TLS e SNI + - Supporto per HPPT/2 Altre funzionalità: -- Hosting per nome o indirizzo IP -- Supporto del Keepalive delle connessioni client -- Gestione dei log: syslog, rotazione, buffer -- Riscrittura degli URI -- Controllo di accesso: via IP, password, ed altro -- Streaming FLV e MP4 + - Hosting per nome o indirizzo IP + - Supporto del Keepalive delle connessioni client + - Gestione dei log: syslog, rotazione, buffer + - Riscrittura degli URI + - Controllo di accesso: via IP, password, ed altro + - Streaming FLV e MP4 ### Installazione @@ -277,5 +277,5 @@ Esempio di configurazione di base, che distribuisce il carico per 2/3 al primo s La direttiva server accetta molti argomenti: -- `max_fails=numberofattempts`: imposta il numero di tentativi di connessione che devono fallire durante il periodo di tempo definito dal parametro `fail_timeout` affinché il server sia considerato non disponibile. Il valore predefinito è 1; 0 disattiva la funzionalità. -- `fail_timeout=time`: imposta il tempo durante il quale un numero definito di connessioni causerà l'indisponibilità del server e imposta il periodo di tempo durante il quale il server sarà considerato non disponibile. Il valore predefinito è 10 secondi. + - `max_fails=numberofattempts`: imposta il numero di tentativi di connessione che devono fallire durante il periodo di tempo definito dal parametro `fail_timeout` affinché il server sia considerato non disponibile. Il valore predefinito è 1; 0 disattiva la funzionalità. + - `fail_timeout=time`: imposta il tempo durante il quale un numero definito di connessioni causerà l'indisponibilità del server e imposta il periodo di tempo durante il quale il server sarà considerato non disponibile. Il valore predefinito è 10 secondi. diff --git a/docs/books/web_services/022-web-servers-nginx.uk.md b/docs/books/web_services/022-web-servers-nginx.uk.md index ab3b47c027..8dbf966a76 100644 --- a/docs/books/web_services/022-web-servers-nginx.uk.md +++ b/docs/books/web_services/022-web-servers-nginx.uk.md @@ -43,24 +43,24 @@ Nginx має значну частку ринку в 28% на найбільш Nginx пропонує такі основні функції: -- Хостинг статичних веб-сторінок -- Автоматичне створення індексної сторінки -- Прискорений зворотний проксі з кешем -- Балансування навантаження -- Відмовостійкість -- Кешована підтримка для кеш-сервера FastCGI, uWSGI, SCGI та Memcached -- Різні фільтри для gzip, xslt, ssi, трансформації зображень тощо -- Підтримка SSL/TLS і SNI -- Підтримка HTTP/2 + - Хостинг статичних веб-сторінок + - Автоматичне створення індексної сторінки + - Прискорений зворотний проксі з кешем + - Балансування навантаження + - Відмовостійкість + - Кешована підтримка для кеш-сервера FastCGI, uWSGI, SCGI та Memcached + - Різні фільтри для gzip, xslt, ssi, трансформації зображень тощо + - Підтримка SSL/TLS і SNI + - Підтримка HTTP/2 Інші особливості: -- Хостинг по імені або IP-адресі -- Keepalive керування підключеннями клієнтів -- Керування журналами: syslog, ротація, буфер -- Перезапис URI -- Контроль доступу: за IP, паролем та ін -- Потокове передавання FLV і MP4 + - Хостинг по імені або IP-адресі + - Keepalive керування підключеннями клієнтів + - Керування журналами: syslog, ротація, буфер + - Перезапис URI + - Контроль доступу: за IP, паролем та ін + - Потокове передавання FLV і MP4 ### Встановлення @@ -277,5 +277,5 @@ access_log syslog:server=192.168.1.100:5514,tag=nginx debug; Директива сервера приймає багато аргументів: -- `max_fails=numberofattempts`: встановлює кількість спроб з’єднання, які мають бути невдалими протягом періоду часу, визначеного параметром `fail_timeout`, щоб сервер вважався недоступним. Значення за замовчуванням 1; 0 вимикає функціональність. -- `fail_timeout=time`: встановлює час, протягом якого певна кількість підключень призведе до того, що сервер буде недоступний, і встановлює період часу, протягом якого сервер вважатиметься недоступним. Значення за замовчуванням становить 10 секунд. + - `max_fails=numberofattempts`: встановлює кількість спроб з’єднання, які мають бути невдалими протягом періоду часу, визначеного параметром `fail_timeout`, щоб сервер вважався недоступним. Значення за замовчуванням 1; 0 вимикає функціональність. + - `fail_timeout=time`: встановлює час, протягом якого певна кількість підключень призведе до того, що сервер буде недоступний, і встановлює період часу, протягом якого сервер вважатиметься недоступним. Значення за замовчуванням становить 10 секунд. diff --git a/docs/desktop/appimage/install_software_with_appimage.de.md b/docs/desktop/appimage/install_software_with_appimage.de.md index 97e8a23397..2f19668802 100644 --- a/docs/desktop/appimage/install_software_with_appimage.de.md +++ b/docs/desktop/appimage/install_software_with_appimage.de.md @@ -20,8 +20,8 @@ Das in diesem Handbuch verwendete Beispielprogramm heißt `Krita`. Sie werden es Für diese Anleitung benötigen Sie Folgendes: -- Eine Rocky Linux-Installation mit einer grafischen Desktopumgebung -- `sudo`-Berechtigungen + - Eine Rocky Linux-Installation mit einer grafischen Desktopumgebung + - `sudo`-Berechtigungen ## Herunterladen des AppImage eines Programms diff --git a/docs/desktop/appimage/install_software_with_appimage.fr.md b/docs/desktop/appimage/install_software_with_appimage.fr.md index 9ec55cec61..d9bd93eb10 100644 --- a/docs/desktop/appimage/install_software_with_appimage.fr.md +++ b/docs/desktop/appimage/install_software_with_appimage.fr.md @@ -20,8 +20,8 @@ L'exemple d'application utilisé dans ce didacticiel est Krita. Vous le téléch Pour ce guide, vous aurez besoin des conditions suivantes : -- Une installation Rocky Linux avec un environnement de bureau -- Droits d'accès `sudo` + - Une installation Rocky Linux avec un environnement de bureau + - Droits d'accès `sudo` ## Téléchargement de l'AppImage d'une application diff --git a/docs/desktop/appimage/install_software_with_appimage.it.md b/docs/desktop/appimage/install_software_with_appimage.it.md index 14512d8dee..1990633034 100644 --- a/docs/desktop/appimage/install_software_with_appimage.it.md +++ b/docs/desktop/appimage/install_software_with_appimage.it.md @@ -20,8 +20,8 @@ Il programma di esempio utilizzato in questa guida è Krita. Lo si scarica e ins Per questa guida sono necessari i seguenti elementi: -- Rocky Linux con un ambiente desktop installato -- Privilegi `sudo` + - Rocky Linux con un ambiente desktop installato + - Privilegi `sudo` ## Scaricare la AppImage di un programma diff --git a/docs/desktop/appimage/install_software_with_appimage.uk.md b/docs/desktop/appimage/install_software_with_appimage.uk.md index 6508c3bd78..b7ea8b0388 100644 --- a/docs/desktop/appimage/install_software_with_appimage.uk.md +++ b/docs/desktop/appimage/install_software_with_appimage.uk.md @@ -20,8 +20,8 @@ AppImages — це зручний спосіб інсталювати прогр Для цього посібника вам потрібно: -- Rocky Linux із встановленим робочим середовищем -- привілеї `sudo` + - Rocky Linux із встановленим робочим середовищем + - привілеї `sudo` ## Завантаження AppImage програми diff --git a/docs/desktop/display/installing_nvidia_gpu_drivers.de.md b/docs/desktop/display/installing_nvidia_gpu_drivers.de.md index 99f183eef9..e495f36334 100644 --- a/docs/desktop/display/installing_nvidia_gpu_drivers.de.md +++ b/docs/desktop/display/installing_nvidia_gpu_drivers.de.md @@ -16,9 +16,9 @@ Der Link für Vorinstallationsaktionen im offiziellen NVIDIA-Handbuch ist defekt Zu den weiteren Möglichkeiten zum Installieren von NVIDIA-Treibern zählen: -- NVIDIA's `.run` installer -- RPMFusion-Repository eines Drittanbieters -- Third-party ELRepo-Treiber + - NVIDIA's `.run` installer + - RPMFusion-Repository eines Drittanbieters + - Third-party ELRepo-Treiber In den meisten Fällen ist es am besten, NVIDIA-Treiber von der offiziellen Quelle zu installieren. RPMFusion und ELRepo stehen für diejenigen zur Verfügung, die ein Community-basiertes Repository bevorzugen. Für ältere Hardware funktioniert RPMFusion am besten. Es wird empfohlen, die Verwendung des `.run`-Installationsprogramms zu vermeiden. Die Verwendung des „.run“-Installationsprogramms ist zwar praktisch, ist aber dafür berüchtigt, Systemdateien zu überschreiben und Inkompatibilitätsprobleme zu verursachen. @@ -26,8 +26,8 @@ In den meisten Fällen ist es am besten, NVIDIA-Treiber von der offiziellen Quel Für diese Anleitung benötigen Sie Folgendes: -- Rocky Linux Workstation -- `sudo`-Berechtigungen + - Rocky Linux Workstation + - `sudo`-Berechtigungen ## Installieren Sie die erforderlichen Dienstprogramme und Abhängigkeiten diff --git a/docs/desktop/display/installing_nvidia_gpu_drivers.fr.md b/docs/desktop/display/installing_nvidia_gpu_drivers.fr.md index 5353683d55..551c0f1e6d 100644 --- a/docs/desktop/display/installing_nvidia_gpu_drivers.fr.md +++ b/docs/desktop/display/installing_nvidia_gpu_drivers.fr.md @@ -16,9 +16,9 @@ Le lien vers les étapes de pré-installation dans le manuel officiel de NVIDIA Voici d'autres méthodes de substitution pour installer les pilotes NVIDIA : -- NVIDIA's `.run` installer -- Dépôt tiers RPMFusion -- Pilote Third-party ELRepo + - NVIDIA's `.run` installer + - Dépôt tiers RPMFusion + - Pilote Third-party ELRepo Dans la plupart des cas, il est préférable d'installer les pilotes NVIDIA à partir d'une source officielle. RPMFusion et ELRepo sont disponibles pour ceux qui préfèrent un dépôt communautaire. Pour les matériels plus anciens, RPMFusion fonctionne mieux. Il est recommandé d'éviter d'utiliser le programme d'installation `.run`. Bien que pratique, l'utilisation du programme d'installation `.run` est connue pour écraser les fichiers système et présente des problèmes d'incompatibilité. @@ -26,8 +26,8 @@ Dans la plupart des cas, il est préférable d'installer les pilotes NVIDIA à p Pour ce guide, vous aurez besoin des conditions suivantes : -- Poste de travail Rocky Linux -- Droits d'accès `sudo` + - Poste de travail Rocky Linux + - Droits d'accès `sudo` ## Installer les utilitaires et dépendances nécessaires diff --git a/docs/desktop/display/installing_nvidia_gpu_drivers.it.md b/docs/desktop/display/installing_nvidia_gpu_drivers.it.md index e99e0d4f47..024c08d4dc 100644 --- a/docs/desktop/display/installing_nvidia_gpu_drivers.it.md +++ b/docs/desktop/display/installing_nvidia_gpu_drivers.it.md @@ -16,9 +16,9 @@ Il link per le attività di pre-installazione nella guida ufficiale di NVIDIA è Alcuni altri modi alternativi per installare i driver NVIDIA includono: -- L'installer `.run` di NVIDIA -- Repo RPMFusion di terze parti -- Driver ELRepo di terze parti + - L'installer `.run` di NVIDIA + - Repo RPMFusion di terze parti + - Driver ELRepo di terze parti Nella maggior parte dei casi, è meglio installare i driver NVIDIA dalla fonte ufficiale. RPMFusion e ELRepo sono disponibili per chi preferisce un repository più comunity-based. Per l'hardware più vecchio, la soluzione migliore è RPMFusion. È consigliabile evitare di usare il programma di installazione `.run`. Sebbene sia comodo, l'uso del programma di installazione `.run` è noto per la sovrascrittura dei file di sistema e per i problemi di incompatibilità. @@ -26,8 +26,8 @@ Nella maggior parte dei casi, è meglio installare i driver NVIDIA dalla fonte u Per questa guida sono necessari i seguenti elementi: -- Rocky Linux Workstation -- Privilegi `sudo` + - Rocky Linux Workstation + - Privilegi `sudo` ## Installare le utility e le dependencies necessarie diff --git a/docs/desktop/display/installing_nvidia_gpu_drivers.uk.md b/docs/desktop/display/installing_nvidia_gpu_drivers.uk.md index 7d3e556825..cf141a8779 100644 --- a/docs/desktop/display/installing_nvidia_gpu_drivers.uk.md +++ b/docs/desktop/display/installing_nvidia_gpu_drivers.uk.md @@ -16,9 +16,9 @@ Nvidia є одним з найпопулярніших виробників GPU. Деякі інші альтернативні способи встановлення драйверів Nvidia включають: -- Nvidia's `.run` installer -- Сторонній репозиторій RPMFusion -- Сторонній драйвер ELRepo + - Nvidia's `.run` installer + - Сторонній репозиторій RPMFusion + - Сторонній драйвер ELRepo У більшості випадків найкраще встановити драйвери Nvidia з офіційного джерела. RPMFusion і ELRepo доступні для тих, хто віддає перевагу репозиторію на основі спільноти. Для старішого обладнання найкраще працює RPMFusion. Бажано уникати використання інсталятора `.run`. Хоча це зручно, використання інсталятора `.run` відоме тим, що він перезаписує системні файли та має проблеми з несумісністю. @@ -26,8 +26,8 @@ Nvidia є одним з найпопулярніших виробників GPU. Для цього посібника вам потрібно: -- Робоча станція Rocky Linux -- привілеї `sudo` + - Робоча станція Rocky Linux + - привілеї `sudo` ## Встановіть необхідні утиліти та залежності diff --git a/docs/desktop/gaming/proton.de.md b/docs/desktop/gaming/proton.de.md index 5283ef4228..02128043f1 100644 --- a/docs/desktop/gaming/proton.de.md +++ b/docs/desktop/gaming/proton.de.md @@ -14,9 +14,9 @@ Im Gegensatz zu `Wine` erfordert `Proton` normalerweise keine Konfiguration und ## Voraussetzungen -- Eine Rocky Linux-Installation mit einer grafischen Desktopumgebung -- Flatpak -- Steam-Konto + - Eine Rocky Linux-Installation mit einer grafischen Desktopumgebung + - Flatpak + - Steam-Konto ## `Steam`-Installaton diff --git a/docs/desktop/gaming/proton.fr.md b/docs/desktop/gaming/proton.fr.md index 3ae9433501..b31ba35c12 100644 --- a/docs/desktop/gaming/proton.fr.md +++ b/docs/desktop/gaming/proton.fr.md @@ -14,9 +14,9 @@ Contrairement à Wine, Proton ne nécessite généralement aucune configuration ## Prérequis -- Une station de travail Rocky Linux avec un environnement de bureau -- Flatpak -- Un compte Steam + - Une station de travail Rocky Linux avec un environnement de bureau + - Flatpak + - Un compte Steam ## Installation de Steam diff --git a/docs/desktop/gaming/proton.it.md b/docs/desktop/gaming/proton.it.md index b71192c9ba..92e6ef254b 100644 --- a/docs/desktop/gaming/proton.it.md +++ b/docs/desktop/gaming/proton.it.md @@ -14,9 +14,9 @@ A differenza di Wine, Proton non richiede alcuna configurazione ed è rivolto ai ## Presupposti -- Una workstation con ambiente desktop Rocky Linux -- Flatpak -- Account Steam + - Una workstation con ambiente desktop Rocky Linux + - Flatpak + - Account Steam ## Installazione di `Steam` diff --git a/docs/desktop/gaming/proton.uk.md b/docs/desktop/gaming/proton.uk.md index c4c16febe5..44ef1b245c 100644 --- a/docs/desktop/gaming/proton.uk.md +++ b/docs/desktop/gaming/proton.uk.md @@ -14,9 +14,9 @@ Proton — це проект Valve, спрямований на перенесе ## Припущення -- Робоча станція Rocky Linux із робочим середовищем -- Flatpak -- Акаунт Steam + - Робоча станція Rocky Linux із робочим середовищем + - Flatpak + - Акаунт Steam ## Встановлення Steam diff --git a/docs/desktop/gnome/dconf.fr.md b/docs/desktop/gnome/dconf.fr.md index b6b97f102b..168fffa670 100644 --- a/docs/desktop/gnome/dconf.fr.md +++ b/docs/desktop/gnome/dconf.fr.md @@ -28,8 +28,8 @@ Si vous n'êtes pas sûr de la fonction d'un paramètre particulier, faites d'ab Pour ce guide, vous aurez besoin des conditions suivantes : -- Installation de Rocky Linux, GNOME inclus. -- Les droits nécessaires pour l'installation de logiciels sur votre système (privilèges `sudo`). + - Installation de Rocky Linux, GNOME inclus. + - Les droits nécessaires pour l'installation de logiciels sur votre système (privilèges `sudo`). ## `dconf Editor` — Installation diff --git a/docs/desktop/gnome/dconf.it.md b/docs/desktop/gnome/dconf.it.md index 37179e12c1..184f6eb76a 100644 --- a/docs/desktop/gnome/dconf.it.md +++ b/docs/desktop/gnome/dconf.it.md @@ -28,8 +28,8 @@ Se non si è sicuri di cosa faccia una particolare impostazione, è bene fare pr Per questa guida sono necessari i seguenti elementi: -- Rocky Linux con GNOME installato. -- L'autorità di installare il software sul sistema (privilegi `sudo`). + - Rocky Linux con GNOME installato. + - L'autorità di installare il software sul sistema (privilegi `sudo`). ## Installazione di `dconf Editor` diff --git a/docs/desktop/gnome/dconf.uk.md b/docs/desktop/gnome/dconf.uk.md index c9e94385f2..e5231ffb00 100644 --- a/docs/desktop/gnome/dconf.uk.md +++ b/docs/desktop/gnome/dconf.uk.md @@ -28,8 +28,8 @@ GNOME використовує дуже спрощений підхід до с Для цього посібника вам потрібно: -- Rocky Linux із встановленим GNOME. -- Повноваження на встановлення програмного забезпечення у вашій системі (права sudo). + - Rocky Linux із встановленим GNOME. + - Повноваження на встановлення програмного забезпечення у вашій системі (права sudo). ## Встановлення `dconf Editor` diff --git a/docs/desktop/gnome/decibels.de.md b/docs/desktop/gnome/decibels.de.md index 580fe6be38..622471c337 100644 --- a/docs/desktop/gnome/decibels.de.md +++ b/docs/desktop/gnome/decibels.de.md @@ -12,9 +12,9 @@ contributors: Steven Spencer, Ganna Zhyrnova Für diese Anleitung benötigen Sie Folgendes: -- Rocky Linux -- Flatpak -- FlatHub + - Rocky Linux + - Flatpak + - FlatHub ## Installations-Ablauf @@ -26,15 +26,15 @@ Gehen Sie zu [Flathub.org] (https://flathub.org), geben Sie `Decibels` in die Su 2. Kopieren Sie das manuelle Installationsskript und führen Sie es in einem Terminal aus: - ```bash - flatpak install flathub org.gnome.Decibels - ``` + ```bash + flatpak install flathub org.gnome.Decibels + ``` 3. Kopieren Sie abschließend den Ausführungsbefehl und rufen Sie ihn in Ihrem Terminal auf: - ```bash - flatpak run org.gnome.Decibels - ``` + ```bash + flatpak run org.gnome.Decibels + ``` ## Anwendungshinweise @@ -42,11 +42,11 @@ Gehen Sie wie folgt vor, um `Decibels` zu verwenden: 1. Auf **Open** klicken - ![Screenshot of Decibels' landing page with a red rectangle surrounding the blue open button](images/02_decibels.png) + ![Screenshot of Decibels' landing page with a red rectangle surrounding the blue open button](images/02_decibels.png) 2. Wählen Sie Ihre gewünschte Datei aus und klicken Sie auf **Open**, das in der oberen rechten Ecke des Bildschirms erscheint - ![Screenshot of Decibels file selection interface with numbered arrows indicating audio file and Open button](images/03_decibels.png) + ![Screenshot of Decibels file selection interface with numbered arrows indicating audio file and Open button](images/03_decibels.png) !!! note "Anmerkung" diff --git a/docs/desktop/gnome/decibels.it.md b/docs/desktop/gnome/decibels.it.md index f6feaae0cd..eb208757ed 100644 --- a/docs/desktop/gnome/decibels.it.md +++ b/docs/desktop/gnome/decibels.it.md @@ -12,9 +12,9 @@ Decibel è un'applicazione che riproduce file audio. L'interfaccia intuitiva con Questa guida presuppone che si disponga di quanto segue: -- Rocky Linux -- Flatpak -- FlatHub + - Rocky Linux + - Flatpak + - FlatHub ## Processo di installazione @@ -26,15 +26,15 @@ Andate su [Flathub.org](https://flathub.org), digitate "Decibel" nella barra di 2. Copiare lo script di installazione manuale ed eseguirlo in un terminale: - ```bash - flatpak install flathub org.gnome.Decibels - ``` + ```bash + flatpak install flathub org.gnome.Decibels + ``` 3. Infine, copiate il comando run ed eseguitelo nel vostro terminale: - ```bash - flatpak run org.gnome.Decibels - ``` + ```bash + flatpak run org.gnome.Decibels + ``` ## Guida all'uso @@ -42,11 +42,11 @@ Per utilizzare Decibel, procedere come segue: 1. Cliccare su **Open** - ![Screenshot of Decibels' landing page with a red rectangle surrounding the blue open button](images/02_decibels.png) + ![Screenshot of Decibels' landing page with a red rectangle surrounding the blue open button](images/02_decibels.png) 2. Scegliere il file desiderato e fare clic su **Apri** che appare nell'angolo in alto a destra dello schermo - ![Screenshot of Decibels file selection interface with numbered arrows indicating audio file and Open button](images/03_decibels.png) + ![Screenshot of Decibels file selection interface with numbered arrows indicating audio file and Open button](images/03_decibels.png) !!! note "Nota" diff --git a/docs/desktop/gnome/decibels.uk.md b/docs/desktop/gnome/decibels.uk.md index e2dc46cd2e..853f250240 100644 --- a/docs/desktop/gnome/decibels.uk.md +++ b/docs/desktop/gnome/decibels.uk.md @@ -12,9 +12,9 @@ Decibels — програма, яка відтворює аудіофайли. У цьому посібнику передбачається, що ви маєте наступне: -- Rocky Linux -- Flatpak -- FlatHub + - Rocky Linux + - Flatpak + - FlatHub ## Процес встановлення @@ -26,15 +26,15 @@ Decibels — програма, яка відтворює аудіофайли. 2. Скопіюйте сценарій встановлення вручну та запустіть його в терміналі: - ```bash - flatpak install flathub org.gnome.Decibels - ``` + ```bash + flatpak install flathub org.gnome.Decibels + ``` 3. Нарешті, скопіюйте команду запуску та запустіть її у своєму терміналі: - ```bash - flatpak run org.gnome.Decibels - ``` + ```bash + flatpak run org.gnome.Decibels + ``` ## Як використовувати @@ -42,11 +42,11 @@ Decibels — програма, яка відтворює аудіофайли. 1. Натисніть _Open_ - ![Screenshot of Decibels' landing page with a red rectangle surrounding the blue open button](images/02_decibels.png) + ![Screenshot of Decibels' landing page with a red rectangle surrounding the blue open button](images/02_decibels.png) 2. Виберіть потрібний файл і натисніть кнопку **Open**, яка з’явиться у верхньому правому куті екрана - ![Screenshot of Decibels file selection interface with numbered arrows indicating audio file and Open button](images/03_decibels.png) + ![Screenshot of Decibels file selection interface with numbered arrows indicating audio file and Open button](images/03_decibels.png) !!! note "Примітка" diff --git a/docs/desktop/gnome/decoder.it.md b/docs/desktop/gnome/decoder.it.md index a7284513a0..a4fee7b8bd 100644 --- a/docs/desktop/gnome/decoder.it.md +++ b/docs/desktop/gnome/decoder.it.md @@ -12,34 +12,34 @@ Avete bisogno di un codice QR per il vostro sito web, la vostra applicazione o i Questa guida presuppone che si disponga di quanto segue: -- Rocky Linux -- Flatpak -- FlatHub + - Rocky Linux + - Flatpak + - FlatHub ## Processo dell'installazione 1. Andate sul [sito web di Flathub](https://flathub.org/), digitate "Decoder" nella barra di ricerca e fate clic su **Install**. ![Screenshot of the install button highlighted by a red rectangle](images/01_decoder.png) - ![manual install script and run script](images/decoder_install.png) + ![manual install script and run script](images/decoder_install.png) 2. Copiare lo script di installazione manuale ed eseguirlo in un terminale: - ```bash - flatpak install flathub com.belmoussaoui.Decoder - ``` + ```bash + flatpak install flathub com.belmoussaoui.Decoder + ``` 3. Infine, copiate il comando run ed eseguitelo nel vostro terminale: - ```bash - flatpak run com.belmoussaoui.Decoder - ``` + ```bash + flatpak run com.belmoussaoui.Decoder + ``` ## Come creare un codice QR Sono disponibili due tipi di codici QR. Scegliete l'opzione più adatta alle vostre esigenze: -- [Text](#text) -- [Wifi](#wifi) + - [Text](#text) + - [Wifi](#wifi) ### Text @@ -51,7 +51,7 @@ Sono disponibili due tipi di codici QR. Scegliete l'opzione più adatta alle vos 3. Cliccare su **Create** - ![Screenshot of the Save and Export screen with arrows](images/03_decoder-text.png) + ![Screenshot of the Save and Export screen with arrows](images/03_decoder-text.png) 4. Cliccare su **Save** @@ -77,15 +77,15 @@ Oltre a creare e generare codici QR, è possibile utilizzare Decoder per scansio 1. Cliccare su **Scan** - ![Screenshot of the rectangular button with the words "From a Screenshot" written in white.](images/02_decoder-scan.png) + ![Screenshot of the rectangular button with the words "From a Screenshot" written in white.](images/02_decoder-scan.png) 2. Fare clic su **From a Screenshot** - ![Screenshot of grey square surrounding options menu, and red square surrounding the "Take a Screenshot button"](images/03_decoder-scan.png) + ![Screenshot of grey square surrounding options menu, and red square surrounding the "Take a Screenshot button"](images/03_decoder-scan.png) 3. Scegliete gli effetti desiderati e cliccate su **Take a Screenshot** - ![Screenshot of a red arrow pointing at a blue button that has the word "Share" written in white](images/04_decoder-scan.png) + ![Screenshot of a red arrow pointing at a blue button that has the word "Share" written in white](images/04_decoder-scan.png) 4. Cliccare su **Share** diff --git a/docs/desktop/gnome/decoder.uk.md b/docs/desktop/gnome/decoder.uk.md index e50cf77c12..fd0f668e40 100644 --- a/docs/desktop/gnome/decoder.uk.md +++ b/docs/desktop/gnome/decoder.uk.md @@ -12,34 +12,34 @@ contributors: Steven Spencer, Ganna Zhyrnova У цьому посібнику передбачається, що ви маєте наступне: -- Rocky Linux -- Flatpak -- FlatHub + - Rocky Linux + - Flatpak + - FlatHub ## Процес встановлення 1. Перейдіть на [веб-сайт Flathub](https://flathub.org/), введіть «Декодер» у рядку пошуку та натисніть **Встановити**. ![Screenshot of the install button highlighted by a red rectangle](images/01_decoder.png) - ![manual install script and run script](images/decoder_install.png) + ![manual install script and run script](images/decoder_install.png) 2. Скопіюйте сценарій встановлення вручну та запустіть його в терміналі: - ```bash - flatpak install flathub com.belmoussaoui.Decoder - ``` + ```bash + flatpak install flathub com.belmoussaoui.Decoder + ``` 3. Нарешті, скопіюйте команду запуску та запустіть її у своєму терміналі: - ```bash - flatpak run com.belmoussaoui.Decoder - ``` + ```bash + flatpak run com.belmoussaoui.Decoder + ``` ## Як створити QR-код Доступні два типи QR-кодів. Виберіть варіант, який найкраще відповідає вашим потребам: -- [Text](#text) -- [Wifi](#wifi) + - [Text](#text) + - [Wifi](#wifi) ### Text @@ -51,7 +51,7 @@ contributors: Steven Spencer, Ganna Zhyrnova 3. Натисніть **Create** - ![Screenshot of the Save and Export screen with arrows](images/03_decoder-text.png) + ![Screenshot of the Save and Export screen with arrows](images/03_decoder-text.png) 4. Натисніть **Save** @@ -77,15 +77,15 @@ contributors: Steven Spencer, Ganna Zhyrnova 1. Натисніть **Scan** - ![Screenshot of the rectangular button with the words "From a Screenshot" written in white.](images/02_decoder-scan.png) + ![Screenshot of the rectangular button with the words "From a Screenshot" written in white.](images/02_decoder-scan.png) 2. Натисніть **From a Screenshot** - ![Screenshot of grey square surrounding options menu, and red square surrounding the "Take a Screenshot button"](images/03_decoder-scan.png) + ![Screenshot of grey square surrounding options menu, and red square surrounding the "Take a Screenshot button"](images/03_decoder-scan.png) 3. Виберіть потрібні ефекти та натисніть **Take a Screenshot** - ![Screenshot of a red arrow pointing at a blue button that has the word "Share" written in white](images/04_decoder-scan.png) + ![Screenshot of a red arrow pointing at a blue button that has the word "Share" written in white](images/04_decoder-scan.png) 4. Натисніть **Share** diff --git a/docs/desktop/gnome/file-shredder.de.md b/docs/desktop/gnome/file-shredder.de.md index 275a3baa6c..7d9f9b0d1c 100644 --- a/docs/desktop/gnome/file-shredder.de.md +++ b/docs/desktop/gnome/file-shredder.de.md @@ -12,9 +12,9 @@ Möchten Sie eine Postkarte oder eine PDF-Datei mit Informationen wie Ihrem Gebu Für diese Anleitung benötigen Sie Folgendes: -- Rocky Linux -- Flatpak -- FlatHub + - Rocky Linux + - Flatpak + - FlatHub ## Installations-Ablauf diff --git a/docs/desktop/gnome/file-shredder.it.md b/docs/desktop/gnome/file-shredder.it.md index ad99ae2a61..2932dbc300 100644 --- a/docs/desktop/gnome/file-shredder.it.md +++ b/docs/desktop/gnome/file-shredder.it.md @@ -12,9 +12,9 @@ Dovete rimuovere una cartolina o un file PDF contenente informazioni come il vos Questa guida presuppone che si disponga di quanto segue: -- Rocky Linux -- Flatpak -- FlatHub + - Rocky Linux + - Flatpak + - FlatHub ## Processo di installazione diff --git a/docs/desktop/gnome/file-shredder.uk.md b/docs/desktop/gnome/file-shredder.uk.md index af428bf672..fb9688f1ab 100644 --- a/docs/desktop/gnome/file-shredder.uk.md +++ b/docs/desktop/gnome/file-shredder.uk.md @@ -12,9 +12,9 @@ contributors: Steven Spencer, Ganna Zhyrnova У цьому посібнику передбачається, що ви маєте наступне: -- Rocky Linux -- Flatpak -- FlatHub + - Rocky Linux + - Flatpak + - FlatHub ## Процес встановлення diff --git a/docs/desktop/gnome/flatpak.de.md b/docs/desktop/gnome/flatpak.de.md index 8e5296735a..1a1a4ef494 100644 --- a/docs/desktop/gnome/flatpak.de.md +++ b/docs/desktop/gnome/flatpak.de.md @@ -166,51 +166,51 @@ Der Installationsprozess für OBS Studio sieht beispielsweise wie folgt aus: 3. Klicken Sie auf den Abwärtspfeil neben der Schaltfläche „Installieren“ - ![flathub_install_1](images/01_flatpak.png) + ![flathub_install_1](images/01_flatpak.png) - ![flathub_install_2](images/02_flatpak.png) + ![flathub_install_2](images/02_flatpak.png) 4. Stellen Sie sicher, dass Sie alle Installationsvoraussetzungen für Rocky Linux erfüllt haben (Nummer 1 im zweiten Bild, das oben bereits abgeschlossen ist), kopieren Sie dann den Befehl (Nummer 2 im zweiten Bild) und fügen Sie ihn in ein Terminal ein - ```bash - flatpak install flathub com.obsproject.Studio - Looking for matches… - Required runtime for com.obsproject.Studio/x86_64/stable (runtime/org.kde.Platform/x86_64/6.6) found in remote flathub - Do you want to install it? [Y/n]: Y - ``` + ```bash + flatpak install flathub com.obsproject.Studio + Looking for matches… + Required runtime for com.obsproject.Studio/x86_64/stable (runtime/org.kde.Platform/x86_64/6.6) found in remote flathub + Do you want to install it? [Y/n]: Y + ``` 5. Wenn Sie mit „Y“ antworten und ++enter++ drücken, wird Folgendes angezeigt: - ```bash - com.obsproject.Studio permissions: - ipc network pulseaudio wayland - x11 devices file access [1] dbus access [2] - system dbus access [3] - - [1] host, xdg-config/kdeglobals:ro, xdg-run/pipewire-0 - [2] com.canonical.AppMenu.Registrar, org.a11y.Bus, org.freedesktop.Flatpak, org.freedesktop.Notifications, - org.kde.KGlobalSettings, org.kde.StatusNotifierWatcher, org.kde.kconfig.notify - [3] org.freedesktop.Avahi - - ID Branch Op Remote Download - 1. com.obsproject.Studio.Locale stable i flathub < 47.0 kB (partial) - 2. org.kde.KStyle.Adwaita 6.6 i flathub < 8.0 MB - 3. org.kde.Platform.Locale 6.6 i flathub < 380.6 MB (partial) - 4. org.kde.PlatformTheme.QGnomePlatform 6.6 i flathub < 9.7 MB - 5. org.kde.WaylandDecoration.QAdwaitaDecorations 6.6 i flathub < 1.2 MB - 6. org.kde.Platform 6.6 i flathub < 325.0 MB - 7. com.obsproject.Studio stable i flathub < 207.7 MB - - Proceed with these changes to the system installation? [Y/n]: - ``` + ```bash + com.obsproject.Studio permissions: + ipc network pulseaudio wayland + x11 devices file access [1] dbus access [2] + system dbus access [3] + + [1] host, xdg-config/kdeglobals:ro, xdg-run/pipewire-0 + [2] com.canonical.AppMenu.Registrar, org.a11y.Bus, org.freedesktop.Flatpak, org.freedesktop.Notifications, + org.kde.KGlobalSettings, org.kde.StatusNotifierWatcher, org.kde.kconfig.notify + [3] org.freedesktop.Avahi + + ID Branch Op Remote Download + 1. com.obsproject.Studio.Locale stable i flathub < 47.0 kB (partial) + 2. org.kde.KStyle.Adwaita 6.6 i flathub < 8.0 MB + 3. org.kde.Platform.Locale 6.6 i flathub < 380.6 MB (partial) + 4. org.kde.PlatformTheme.QGnomePlatform 6.6 i flathub < 9.7 MB + 5. org.kde.WaylandDecoration.QAdwaitaDecorations 6.6 i flathub < 1.2 MB + 6. org.kde.Platform 6.6 i flathub < 325.0 MB + 7. com.obsproject.Studio stable i flathub < 207.7 MB + + Proceed with these changes to the system installation? [Y/n]: + ``` 6. Wenn Sie mit „Y“ antworten und ++enter++ drücken, werden die Systemberechtigungen wie angegeben geändert und die Anwendung installiert. 7. Wenn alles gut geht, sollten Sie folgende Meldung erhalten: - ```text - Installation complete. - ``` + ```text + Installation complete. + ``` 8. Im Menü „Aktivities“ können Sie nun nach OBS Studio suchen und es ausführen. diff --git a/docs/desktop/gnome/flatpak.it.md b/docs/desktop/gnome/flatpak.it.md index 28bdc60de1..2f8fcfa7f9 100644 --- a/docs/desktop/gnome/flatpak.it.md +++ b/docs/desktop/gnome/flatpak.it.md @@ -166,51 +166,51 @@ A titolo di esempio, il processo di installazione di OBS Studio è il seguente: 3. Cliccare sulla freccia rivolta verso il basso accanto al pulsante "Installa" - ![flathub_install_1](images/01_flatpak.png) + ![flathub_install_1](images/01_flatpak.png) - ![flathub_install_2](images/02_flatpak.png) + ![flathub_install_2](images/02_flatpak.png) 4. Assicuratevi di aver completato tutti i prerequisiti per l'installazione di Rocky Linux (numero 1 nella seconda immagine, che è già stato completato sopra) e poi copiate il comando (numero 2 nella seconda immagine) e incollatelo in un terminale - ```bash - flatpak install flathub com.obsproject.Studio - Looking for matches… - Required runtime for com.obsproject.Studio/x86_64/stable (runtime/org.kde.Platform/x86_64/6.6) found in remote flathub - Do you want to install it? [Y/n]: Y - ``` + ```bash + flatpak install flathub com.obsproject.Studio + Looking for matches… + Required runtime for com.obsproject.Studio/x86_64/stable (runtime/org.kde.Platform/x86_64/6.6) found in remote flathub + Do you want to install it? [Y/n]: Y + ``` 5. Quando si risponde "Y" e si preme ++enter++, viene visualizzato il seguente messaggio: - ```bash - com.obsproject.Studio permissions: - ipc network pulseaudio wayland - x11 devices file access [1] dbus access [2] - system dbus access [3] - - [1] host, xdg-config/kdeglobals:ro, xdg-run/pipewire-0 - [2] com.canonical.AppMenu.Registrar, org.a11y.Bus, org.freedesktop.Flatpak, org.freedesktop.Notifications, - org.kde.KGlobalSettings, org.kde.StatusNotifierWatcher, org.kde.kconfig.notify - [3] org.freedesktop.Avahi - - ID Branch Op Remote Download - 1. com.obsproject.Studio.Locale stable i flathub < 47.0 kB (partial) - 2. org.kde.KStyle.Adwaita 6.6 i flathub < 8.0 MB - 3. org.kde.Platform.Locale 6.6 i flathub < 380.6 MB (partial) - 4. org.kde.PlatformTheme.QGnomePlatform 6.6 i flathub < 9.7 MB - 5. org.kde.WaylandDecoration.QAdwaitaDecorations 6.6 i flathub < 1.2 MB - 6. org.kde.Platform 6.6 i flathub < 325.0 MB - 7. com.obsproject.Studio stable i flathub < 207.7 MB - - Proceed with these changes to the system installation? [Y/n]: - ``` + ```bash + com.obsproject.Studio permissions: + ipc network pulseaudio wayland + x11 devices file access [1] dbus access [2] + system dbus access [3] + + [1] host, xdg-config/kdeglobals:ro, xdg-run/pipewire-0 + [2] com.canonical.AppMenu.Registrar, org.a11y.Bus, org.freedesktop.Flatpak, org.freedesktop.Notifications, + org.kde.KGlobalSettings, org.kde.StatusNotifierWatcher, org.kde.kconfig.notify + [3] org.freedesktop.Avahi + + ID Branch Op Remote Download + 1. com.obsproject.Studio.Locale stable i flathub < 47.0 kB (partial) + 2. org.kde.KStyle.Adwaita 6.6 i flathub < 8.0 MB + 3. org.kde.Platform.Locale 6.6 i flathub < 380.6 MB (partial) + 4. org.kde.PlatformTheme.QGnomePlatform 6.6 i flathub < 9.7 MB + 5. org.kde.WaylandDecoration.QAdwaitaDecorations 6.6 i flathub < 1.2 MB + 6. org.kde.Platform 6.6 i flathub < 325.0 MB + 7. com.obsproject.Studio stable i flathub < 207.7 MB + + Proceed with these changes to the system installation? [Y/n]: + ``` 6. Rispondendo "Y" e premendo ++enter++ si modificheranno i permessi di sistema come indicato e si installerà l'applicazione. 7. Se tutto va bene, dovreste ricevere: - ```text - Installation complete. - ``` + ```text + Installation complete. + ``` 8. Dal menu "Attività" è ora possibile cercare ed eseguire OBS Studio. diff --git a/docs/desktop/gnome/flatpak.uk.md b/docs/desktop/gnome/flatpak.uk.md index 86d9f71753..03909d12f6 100644 --- a/docs/desktop/gnome/flatpak.uk.md +++ b/docs/desktop/gnome/flatpak.uk.md @@ -166,51 +166,51 @@ Flathub — це веб-ресурс для отримання або надси 3. Натисніть стрілку вниз поруч із кнопкою «Встановити» - ![flathub_install_1](images/01_flatpak.png) + ![flathub_install_1](images/01_flatpak.png) - ![flathub_install_2](images/02_flatpak.png) + ![flathub_install_2](images/02_flatpak.png) 4. Переконайтеся, що ви виконали всі передумови встановлення для Rocky Linux (номер 1 на другому зображенні, яке вже виконано вище), а потім скопіюйте команду (номер 2 на другому зображенні) і вставте її в термінал - ```bash - flatpak install flathub com.obsproject.Studio - Looking for matches… - Required runtime for com.obsproject.Studio/x86_64/stable (runtime/org.kde.Platform/x86_64/6.6) found in remote flathub - Do you want to install it? [Y/n]: Y - ``` + ```bash + flatpak install flathub com.obsproject.Studio + Looking for matches… + Required runtime for com.obsproject.Studio/x86_64/stable (runtime/org.kde.Platform/x86_64/6.6) found in remote flathub + Do you want to install it? [Y/n]: Y + ``` 5. Коли ви відповісте «Y» і натиснете ++enter++, ви побачите таке: - ```bash - com.obsproject.Studio permissions: - ipc network pulseaudio wayland - x11 devices file access [1] dbus access [2] - system dbus access [3] - - [1] host, xdg-config/kdeglobals:ro, xdg-run/pipewire-0 - [2] com.canonical.AppMenu.Registrar, org.a11y.Bus, org.freedesktop.Flatpak, org.freedesktop.Notifications, - org.kde.KGlobalSettings, org.kde.StatusNotifierWatcher, org.kde.kconfig.notify - [3] org.freedesktop.Avahi - - ID Branch Op Remote Download - 1. com.obsproject.Studio.Locale stable i flathub < 47.0 kB (partial) - 2. org.kde.KStyle.Adwaita 6.6 i flathub < 8.0 MB - 3. org.kde.Platform.Locale 6.6 i flathub < 380.6 MB (partial) - 4. org.kde.PlatformTheme.QGnomePlatform 6.6 i flathub < 9.7 MB - 5. org.kde.WaylandDecoration.QAdwaitaDecorations 6.6 i flathub < 1.2 MB - 6. org.kde.Platform 6.6 i flathub < 325.0 MB - 7. com.obsproject.Studio stable i flathub < 207.7 MB - - Proceed with these changes to the system installation? [Y/n]: - ``` + ```bash + com.obsproject.Studio permissions: + ipc network pulseaudio wayland + x11 devices file access [1] dbus access [2] + system dbus access [3] + + [1] host, xdg-config/kdeglobals:ro, xdg-run/pipewire-0 + [2] com.canonical.AppMenu.Registrar, org.a11y.Bus, org.freedesktop.Flatpak, org.freedesktop.Notifications, + org.kde.KGlobalSettings, org.kde.StatusNotifierWatcher, org.kde.kconfig.notify + [3] org.freedesktop.Avahi + + ID Branch Op Remote Download + 1. com.obsproject.Studio.Locale stable i flathub < 47.0 kB (partial) + 2. org.kde.KStyle.Adwaita 6.6 i flathub < 8.0 MB + 3. org.kde.Platform.Locale 6.6 i flathub < 380.6 MB (partial) + 4. org.kde.PlatformTheme.QGnomePlatform 6.6 i flathub < 9.7 MB + 5. org.kde.WaylandDecoration.QAdwaitaDecorations 6.6 i flathub < 1.2 MB + 6. org.kde.Platform 6.6 i flathub < 325.0 MB + 7. com.obsproject.Studio stable i flathub < 207.7 MB + + Proceed with these changes to the system installation? [Y/n]: + ``` 6. Якщо відповісти «Y» і натиснути ++enter++, системні дозволи будуть змінені, як зазначено, і встановлено програму. 7. Якщо все піде добре, ви повинні отримати: - ```text - Installation complete. - ``` + ```text + Installation complete. + ``` 8. Тепер у меню «Activities» ви зможете шукати та запускати OBS Studio. diff --git a/docs/desktop/gnome/gnome-extensions.uk.md b/docs/desktop/gnome/gnome-extensions.uk.md index a148c5b363..22f0848e06 100644 --- a/docs/desktop/gnome/gnome-extensions.uk.md +++ b/docs/desktop/gnome/gnome-extensions.uk.md @@ -56,7 +56,7 @@ gnome-shell --version 1. Перейдіть на [веб-сторінку розширення dash to dock](https://extensions.gnome.org/extension/307/dash-to-dock/){target="_blank"} 2. Перемкніть розширення з "вимкнено" на "увімкнено" - ![Увімкнути розширення](images/gnome_extensions_images/gnome-shell-extensions-toggle-btn.webp) + ![Увімкнути розширення](images/gnome_extensions_images/gnome-shell-extensions-toggle-btn.webp) 3. Коли буде запропоновано встановити розширення, натисніть "yes". ## Керування встановленими розширеннями diff --git a/docs/desktop/gnome/gnome-tweaks.de.md b/docs/desktop/gnome/gnome-tweaks.de.md index 97a1d583a1..710dcbc26d 100644 --- a/docs/desktop/gnome/gnome-tweaks.de.md +++ b/docs/desktop/gnome/gnome-tweaks.de.md @@ -10,7 +10,7 @@ GNOME Tweaks ist ein Tool zum Anpassen von Desktop-Eigenschaften, einschließlic ## Voraussetzungen -- Eine Rocky Linux-Workstation oder ein Server mit GUI-Installation, die GNOME verwendet. + - Eine Rocky Linux-Workstation oder ein Server mit GUI-Installation, die GNOME verwendet. ## GNOME tweaks Installation diff --git a/docs/desktop/gnome/gnome-tweaks.fr.md b/docs/desktop/gnome/gnome-tweaks.fr.md index b60a474023..adb3fbb660 100644 --- a/docs/desktop/gnome/gnome-tweaks.fr.md +++ b/docs/desktop/gnome/gnome-tweaks.fr.md @@ -10,7 +10,7 @@ GNOME Tweaks est un outil permettant de personnaliser l'environnement de bureau, ## Prérequis -- Un poste de travail ou un serveur Rocky Linux avec une interface graphique qui utilise GNOME. + - Un poste de travail ou un serveur Rocky Linux avec une interface graphique qui utilise GNOME. ## Installation de GNOME tweaks diff --git a/docs/desktop/gnome/gnome-tweaks.it.md b/docs/desktop/gnome/gnome-tweaks.it.md index 10a6d73126..03799d4002 100644 --- a/docs/desktop/gnome/gnome-tweaks.it.md +++ b/docs/desktop/gnome/gnome-tweaks.it.md @@ -10,7 +10,7 @@ GNOME Tweaks è uno strumento per personalizzare l'esperienza del desktop, compr ## Presupposti -- Una workstation o un server Rocky Linux con installazione dell'interfaccia grafica che utilizza GNOME. + - Una workstation o un server Rocky Linux con installazione dell'interfaccia grafica che utilizza GNOME. ## Installare GNOME tweaks diff --git a/docs/desktop/gnome/gnome-tweaks.uk.md b/docs/desktop/gnome/gnome-tweaks.uk.md index 1d775fe0f2..ca468b32e4 100644 --- a/docs/desktop/gnome/gnome-tweaks.uk.md +++ b/docs/desktop/gnome/gnome-tweaks.uk.md @@ -10,7 +10,7 @@ GNOME Tweaks — це інструмент для налаштування ро ## Припущення -- Робоча станція або сервер Rocky Linux із інсталяцією GNOME. + - Робоча станція або сервер Rocky Linux із інсталяцією GNOME. ## Встановлення GNOME Tweaks diff --git a/docs/desktop/gnome/onlineaccounts.fr.md b/docs/desktop/gnome/onlineaccounts.fr.md index 3e18ce9461..117aab3451 100644 --- a/docs/desktop/gnome/onlineaccounts.fr.md +++ b/docs/desktop/gnome/onlineaccounts.fr.md @@ -14,7 +14,7 @@ Ce guide rapide vous montrera par où commencer. Ce guide suppose que vous disposez de la configuration suivante : -- Une installation Rocky Linux avec un environnement de bureau GNOME. + - Une installation Rocky Linux avec un environnement de bureau GNOME. ## Comment ajouter vos comptes en ligne diff --git a/docs/desktop/gnome/onlineaccounts.it.md b/docs/desktop/gnome/onlineaccounts.it.md index 2af1e1625f..ff9f420377 100644 --- a/docs/desktop/gnome/onlineaccounts.it.md +++ b/docs/desktop/gnome/onlineaccounts.it.md @@ -14,7 +14,7 @@ In questa breve guida vedremo come iniziare. Questa guida presuppone che si disponga di quanto segue: -- Rocky Linux con l'ambiente desktop GNOME installato. + - Rocky Linux con l'ambiente desktop GNOME installato. ## Come aggiungere i vostri account online diff --git a/docs/desktop/gnome/onlineaccounts.uk.md b/docs/desktop/gnome/onlineaccounts.uk.md index 8ce56f06ef..4d4165796c 100644 --- a/docs/desktop/gnome/onlineaccounts.uk.md +++ b/docs/desktop/gnome/onlineaccounts.uk.md @@ -14,7 +14,7 @@ contributors: Steven Spencer У цьому посібнику передбачається, що ви маєте наступне: -- Rocky Linux із встановленим робочим середовищем GNOME. + - Rocky Linux із встановленим робочим середовищем GNOME. ## Як додати облікові записи онлайн diff --git a/docs/desktop/gnome/rdp-server.de.md b/docs/desktop/gnome/rdp-server.de.md index 8704e0ec8b..4863a73d6a 100644 --- a/docs/desktop/gnome/rdp-server.de.md +++ b/docs/desktop/gnome/rdp-server.de.md @@ -20,11 +20,11 @@ Standardmäßig ermöglicht Rocky Linux Ihnen, Ihren Desktop über ein anderes V Für diese Anleitung wird davon ausgegangen, dass Sie Folgendes bereits eingerichtet haben: -- Rocky Linux inklusiv GNOME -- `Flatpak` und `Flathub` sind betriebsbereit -- Ein User-Account ohne root-Rechte -- Administrator- oder `sudo`-Rechte und die Möglichkeit, Befehle in das Terminal einzufügen -- Der X-Server (zum Teilen Ihres Desktops) + - Rocky Linux inklusiv GNOME + - `Flatpak` und `Flathub` sind betriebsbereit + - Ein User-Account ohne root-Rechte + - Administrator- oder `sudo`-Rechte und die Möglichkeit, Befehle in das Terminal einzufügen + - Der X-Server (zum Teilen Ihres Desktops) !!! info "Info" diff --git a/docs/desktop/gnome/rdp-server.fr.md b/docs/desktop/gnome/rdp-server.fr.md index a810f44487..c6853c4bf6 100644 --- a/docs/desktop/gnome/rdp-server.fr.md +++ b/docs/desktop/gnome/rdp-server.fr.md @@ -20,11 +20,11 @@ Par défaut, Rocky Linux vous permet de partager votre bureau via un autre proto Pour ce guide, nous partons du principe que vous disposez déjà de la configuration suivante : -- Rocky Linux et GNOME -- Flatpak et Flathub installés et opérationnels -- Un compte utilisateur non root -- Accès administrateur ou sudo et pouvoir coller des commandes dans le terminal -- Le serveur X (pour partager votre bureau) + - Rocky Linux et GNOME + - Flatpak et Flathub installés et opérationnels + - Un compte utilisateur non root + - Accès administrateur ou sudo et pouvoir coller des commandes dans le terminal + - Le serveur X (pour partager votre bureau) !!! info "Info" diff --git a/docs/desktop/gnome/rdp-server.it.md b/docs/desktop/gnome/rdp-server.it.md index 2d16ef14a1..4e53d228e2 100644 --- a/docs/desktop/gnome/rdp-server.it.md +++ b/docs/desktop/gnome/rdp-server.it.md @@ -20,11 +20,11 @@ Per impostazione predefinita, Rocky Linux consente di condividere il desktop tra In questa guida si presuppone che siano già state configurate le seguenti operazioni: -- Rocky Linux con Gnome -- Flatpak e Flathub installati e funzionanti -- Un account utente non root -- Accesso come amministratore o sudo e disponibilità a incollare comandi nel terminale -- Il server X (per condividere il desktop) + - Rocky Linux con Gnome + - Flatpak e Flathub installati e funzionanti + - Un account utente non root + - Accesso come amministratore o sudo e disponibilità a incollare comandi nel terminale + - Il server X (per condividere il desktop) !!! info "Informazione" diff --git a/docs/desktop/gnome/rdp-server.uk.md b/docs/desktop/gnome/rdp-server.uk.md index 0b7bb8c207..54904c9ea5 100644 --- a/docs/desktop/gnome/rdp-server.uk.md +++ b/docs/desktop/gnome/rdp-server.uk.md @@ -20,11 +20,11 @@ contributors: Steven Spencer, Ganna Zhyrnova, Zhang Zhuyue Для цього посібника припускається, що ви вже налаштували наступне: -- Rocky Linux з Gnome -- Flatpak і Flathub встановлені та працюють -- Обліковий запис некореневого користувача -- Доступ адміністратора або sudo та готовність вставляти команди в термінал -- Сервер X (для спільного використання робочого столу) + - Rocky Linux з Gnome + - Flatpak і Flathub встановлені та працюють + - Обліковий запис некореневого користувача + - Доступ адміністратора або sudo та готовність вставляти команди в термінал + - Сервер X (для спільного використання робочого столу) !!! info "примітка" diff --git a/docs/desktop/gnome/screenshot.de.md b/docs/desktop/gnome/screenshot.de.md index c4f69b8fee..cf872a316b 100644 --- a/docs/desktop/gnome/screenshot.de.md +++ b/docs/desktop/gnome/screenshot.de.md @@ -12,7 +12,7 @@ Sind Sie es leid, mit der Tastatur Bilder auf Ihrem Computerbildschirm aufzunehm Für diese Anleitung benötigen Sie Folgendes: -- Rocky Linux + - Rocky Linux !!! note "Anmerkung" @@ -30,7 +30,7 @@ Gehen Sie wie folgt vor, um `Screenshot` zu verwenden: 2. Auf **Take a Screenshot** klicken - ![Screenshot of taken picture of being saved with black arrows pointing at a text box that contains the file name, "Linux.png" as well as Save and Copy buttons](images/screenshot-02.png) + ![Screenshot of taken picture of being saved with black arrows pointing at a text box that contains the file name, "Linux.png" as well as Save and Copy buttons](images/screenshot-02.png) 3. Wenn Sie mit dem Screenshot zufrieden sind, benennen Sie die Datei um und klicken Sie auf **Save**. diff --git a/docs/desktop/gnome/screenshot.it.md b/docs/desktop/gnome/screenshot.it.md index 1bfa47ba45..a7bacfb8bf 100644 --- a/docs/desktop/gnome/screenshot.it.md +++ b/docs/desktop/gnome/screenshot.it.md @@ -12,7 +12,7 @@ Siete stanchi di usare la tastiera per scattare immagini dello schermo del compu Questa guida presuppone che si disponga di quanto segue: -- Rocky Linux + - Rocky Linux !!! note "Nota" @@ -30,7 +30,7 @@ Per utilizzare Screenshot, procedere come segue: 2. Fare clic su **Fai uno screenshot** - ![Screenshot of taken picture of being saved with black arrows pointing at a text box that contains the file name, "Linux.png" as well as Save and Copy buttons](images/screenshot-02.png) + ![Screenshot of taken picture of being saved with black arrows pointing at a text box that contains the file name, "Linux.png" as well as Save and Copy buttons](images/screenshot-02.png) 3. Una volta soddisfatti della schermata, rinominare il file e fare clic su **Salva**. diff --git a/docs/desktop/gnome/screenshot.uk.md b/docs/desktop/gnome/screenshot.uk.md index b54c3ed5c8..34fce275cf 100644 --- a/docs/desktop/gnome/screenshot.uk.md +++ b/docs/desktop/gnome/screenshot.uk.md @@ -12,7 +12,7 @@ contributors: Steven Spencer, Ganna Zhyrnova У цьому посібнику передбачається, що ви маєте наступне: -- Rocky Linux + - Rocky Linux !!! note "Примітка" @@ -30,7 +30,7 @@ contributors: Steven Spencer, Ganna Zhyrnova 2. Натисніть **Take a Screenshot** - ![Screenshot of taken picture of being saved with black arrows pointing at a text box that contains the file name, "Linux.png" as well as Save and Copy buttons](images/screenshot-02.png) + ![Screenshot of taken picture of being saved with black arrows pointing at a text box that contains the file name, "Linux.png" as well as Save and Copy buttons](images/screenshot-02.png) 3. Коли ви будете задоволені знімком екрана, перейменуйте файл і натисніть **Зберегти**. diff --git a/docs/desktop/gnome/valuta.de.md b/docs/desktop/gnome/valuta.de.md index a08c27e5a7..cb9ce53918 100644 --- a/docs/desktop/gnome/valuta.de.md +++ b/docs/desktop/gnome/valuta.de.md @@ -12,9 +12,9 @@ Wenn Sie häufig reisen oder ins Ausland ziehen, vereinfachen Sie Ihre Finanzpla Für diese Anleitung benötigen Sie Folgendes: -- Rocky Linux -- Flatpak -- FlatHub + - Rocky Linux + - Flatpak + - FlatHub ## Installationsanweisungen @@ -22,19 +22,19 @@ Für diese Anleitung benötigen Sie Folgendes: 1. Gehen Sie zu [Flathub.org] (https://flathub.org), geben Sie `Valuta` in die Suchleiste ein und klicken Sie auf **Install** - ![manual install script and run script](images/valuta-install.png) + ![manual install script and run script](images/valuta-install.png) 2. Kopieren Sie das manuelle Skript in Ihr Terminal: - ```bash - flatpak install flathub io.github.idevecore.Valuta - ``` + ```bash + flatpak install flathub io.github.idevecore.Valuta + ``` 3. Führen Sie anschließend das manuelle Installationsskript in Ihrem Terminal aus: - ```bash - flatpak run flathub io.github.idevecore.Valuta - ``` + ```bash + flatpak run flathub io.github.idevecore.Valuta + ``` ## Wie funktioniert es? @@ -42,7 +42,7 @@ Um `Valuta` zu verwenden, gehen Sie wie folgt vor: 1. Wählen Sie im Dropdown-Menü Ihr Land aus und geben Sie den Betrag ein, den Sie ausgeben möchten. - ![Screenshot of Valuta app showing 1000 USD in the input field, with a grey arrow pointing down to a grey box showing 1000 USD](images/02_valuta.png) + ![Screenshot of Valuta app showing 1000 USD in the input field, with a grey arrow pointing down to a grey box showing 1000 USD](images/02_valuta.png) 2. Wählen Sie aus dem Dropdown-Menü das Land aus, in das Sie reisen. Der umgerechnete Betrag wird automatisch angezeigt. diff --git a/docs/desktop/gnome/valuta.fr.md b/docs/desktop/gnome/valuta.fr.md index 272204d72a..4a543f56f2 100644 --- a/docs/desktop/gnome/valuta.fr.md +++ b/docs/desktop/gnome/valuta.fr.md @@ -12,9 +12,9 @@ Si vous voyagez souvent ou déménagez à l’étranger, facilitez votre planifi Ce guide suppose que vous disposez de la configuration suivante : -- Rocky Linux -- Flatpak -- FlatHub + - Rocky Linux + - Flatpak + - FlatHub ## Processus d'Installation @@ -22,19 +22,19 @@ Ce guide suppose que vous disposez de la configuration suivante : 1. Accédez à [Flathub.org](https://flathub.org), tapez `Valuta` dans la barre de recherche et cliquez sur **Install** - ![manual install script and run script](images/valuta-install.png) + ![manual install script and run script](images/valuta-install.png) 2. Copiez le script d'installation manuelle dans un terminal : - ```bash - flatpak install flathub io.github.idevecore.Valuta - ``` + ```bash + flatpak install flathub io.github.idevecore.Valuta + ``` 3. Enfin, exécutez le script d'installation manuelle dans votre terminal : - ```bash - flatpak run flathub io.github.idevecore.Valuta - ``` + ```bash + flatpak run flathub io.github.idevecore.Valuta + ``` ## Mode d'emploi @@ -42,7 +42,7 @@ Pour utiliser le programme `Valuta`, procédez comme suit : 1. Choisissez votre pays dans le menu déroulant et saisissez le montant en espèces que vous souhaitez dépenser. - ![Screenshot of Valuta app showing 1000 USD in the input field, with a grey arrow pointing down to a grey box showing 1000 USD](images/02_valuta.png) + ![Screenshot of Valuta app showing 1000 USD in the input field, with a grey arrow pointing down to a grey box showing 1000 USD](images/02_valuta.png) 2. Choisissez le pays vers lequel vous voyagez dans le menu déroulant. À partir de là, le montant converti apparaît automatiquement. diff --git a/docs/desktop/gnome/valuta.it.md b/docs/desktop/gnome/valuta.it.md index 18ff6b4f75..ccd8120947 100644 --- a/docs/desktop/gnome/valuta.it.md +++ b/docs/desktop/gnome/valuta.it.md @@ -12,9 +12,9 @@ Se viaggiate o vi trasferite spesso all'estero, semplificate la vostra pianifica Questa guida presuppone che si disponga di quanto segue: -- Rocky Linux -- Flatpak -- FlatHub + - Rocky Linux + - Flatpak + - FlatHub ## Processo di installazione @@ -22,19 +22,19 @@ Questa guida presuppone che si disponga di quanto segue: 1. Andate su [Flathub.org](https://flathub.org), digitate "Valuta" nella barra di ricerca e cliccate su **Installa** - ![manual install script and run script](images/valuta-install.png) + ![manual install script and run script](images/valuta-install.png) 2. Copiare lo script manuale nel terminale: - ```bash - flatpak install flathub io.github.idevecore.Valuta - ``` + ```bash + flatpak install flathub io.github.idevecore.Valuta + ``` 3. Infine, lo script manuale nel terminale: - ```bash - flatpak run flathub io.github.idevecore.Valuta - ``` + ```bash + flatpak run flathub io.github.idevecore.Valuta + ``` ## Come si usa @@ -42,7 +42,7 @@ Per utilizzare Valuta, procedere come segue: 1. Scegliete il vostro Paese dal menu a tendina e digitate il denaro che volete spendere. - ![Screenshot of Valuta app showing 1000 USD in the input field, with a grey arrow pointing down to a grey box showing 1000 USD](images/02_valuta.png) + ![Screenshot of Valuta app showing 1000 USD in the input field, with a grey arrow pointing down to a grey box showing 1000 USD](images/02_valuta.png) 2. Selezionare il Paese in cui si viaggia dal menu a discesa. L'importo convertito apparirà automaticamente. diff --git a/docs/desktop/gnome/valuta.uk.md b/docs/desktop/gnome/valuta.uk.md index 62b5aa4f0a..42ba20a3f6 100644 --- a/docs/desktop/gnome/valuta.uk.md +++ b/docs/desktop/gnome/valuta.uk.md @@ -12,9 +12,9 @@ contributors: Steven Spencer, Ganna Zhyrnova У цьому посібнику передбачається, що ви маєте наступне: -- Rocky Linux -- Flatpak -- FlatHub + - Rocky Linux + - Flatpak + - FlatHub ## Процес встановлення @@ -22,19 +22,19 @@ contributors: Steven Spencer, Ganna Zhyrnova 1. Перейдіть на [Flathub.org](https://flathub.org), введіть «Valuta» в рядку пошуку та натисніть **Install** - ![manual install script and run script](images/valuta-install.png) + ![manual install script and run script](images/valuta-install.png) 2. Скопіюйте скрипт у свій термінал: - ```bash - flatpak install flathub io.github.idevecore.Valuta - ``` + ```bash + flatpak install flathub io.github.idevecore.Valuta + ``` 3. Нарешті, скрипт у вашому терміналі: - ```bash - flatpak run flathub io.github.idevecore.Valuta - ``` + ```bash + flatpak run flathub io.github.idevecore.Valuta + ``` ## Як використовувати @@ -42,7 +42,7 @@ contributors: Steven Spencer, Ganna Zhyrnova 1. Виберіть свою країну зі спадного меню та введіть суму готівки, яку хочете витратити. - ![Screenshot of Valuta app showing 1000 USD in the input field, with a grey arrow pointing down to a grey box showing 1000 USD](images/02_valuta.png) + ![Screenshot of Valuta app showing 1000 USD in the input field, with a grey arrow pointing down to a grey box showing 1000 USD](images/02_valuta.png) 2. Виберіть країну, до якої ви подорожуєте, зі спадного меню. Звідти автоматично з’являється конвертована сума. diff --git a/docs/desktop/gnome/x11vnc_plus_ssh_lan.de.md b/docs/desktop/gnome/x11vnc_plus_ssh_lan.de.md index ca7aea8ce7..f16d599180 100644 --- a/docs/desktop/gnome/x11vnc_plus_ssh_lan.de.md +++ b/docs/desktop/gnome/x11vnc_plus_ssh_lan.de.md @@ -20,8 +20,8 @@ Einer der Hauptvorteile der Verwendung von x11vnc gegenüber SSH besteht darin, Für diese Anleitung wird davon ausgegangen, dass Sie Folgendes bereits eingerichtet haben: -- Rocky Linux Workstation -- `sudo`-Berechtigungen + - Rocky Linux Workstation + - `sudo`-Berechtigungen ## VNC-Server einrichten @@ -161,8 +161,8 @@ Herzlichen Glückwunsch! Jetzt können Sie Ihren Desktop aus der Ferne kontrolli Bisher hat Ihnen dieser Artikel gezeigt, wie Sie einen x11vnc-Server einrichten und mithilfe von VNC, das über einen SSH-Tunnel weitergeleitet wird, eine Verbindung zu ihm herstellen. Bitte beachten Sie, dass diese Methode nur für Computer funktioniert, die sich im gleichen lokalen Netzwerk (LAN) befinden. Angenommen, Sie möchten eine Verbindung zu einem Computer herstellen, der sich in einem anderen LAN befindet. Eine Möglichkeit, dies zu erreichen, besteht darin, ein VPN einzurichten. Nachfolgend finden Sie einige Anleitungen zum Einrichten eines VPN: -- [OpenVPN](https://docs.rockylinux.org/guides/security/openvpn/) -- [Wireguard VPN](https://docs.rockylinux.org/guides/security/wireguard_vpn/) + - [OpenVPN](https://docs.rockylinux.org/guides/security/openvpn/) + - [Wireguard VPN](https://docs.rockylinux.org/guides/security/wireguard_vpn/) ## Zusammenfassung diff --git a/docs/desktop/gnome/x11vnc_plus_ssh_lan.it.md b/docs/desktop/gnome/x11vnc_plus_ssh_lan.it.md index 4adc09f1a5..6109afc959 100644 --- a/docs/desktop/gnome/x11vnc_plus_ssh_lan.it.md +++ b/docs/desktop/gnome/x11vnc_plus_ssh_lan.it.md @@ -20,8 +20,8 @@ Uno dei principali vantaggi dell'utilizzo di x11vnc rispetto a SSH è che elimin Per questa guida, si presuppone che si disponga di quanto segue: -- Rocky Linux Workstation -- Privilegi `sudo` + - Rocky Linux Workstation + - Privilegi `sudo` ## Impostazione del server VNC @@ -161,8 +161,8 @@ Congratulazioni! Ora è possibile controllare il desktop da remoto! Finora questo articolo ha mostrato come impostare un server x11vnc e come connettersi ad esso utilizzando VNC inoltrato attraverso un tunnel SSH. È importante notare che questo metodo funziona solo per i computer della stessa rete locale (LAN). Supponendo di volersi collegare a un computer su un'altra LAN. Un modo per farlo è impostare una VPN. Di seguito sono riportate alcune guide su come impostare una VPN: -- [OpenVPN](https://docs.rockylinux.org/guides/security/openvpn/) -- [Wireguard VPN](https://docs.rockylinux.org/guides/security/wireguard_vpn/) + - [OpenVPN](https://docs.rockylinux.org/guides/security/openvpn/) + - [Wireguard VPN](https://docs.rockylinux.org/guides/security/wireguard_vpn/) ## Conclusione diff --git a/docs/desktop/gnome/x11vnc_plus_ssh_lan.uk.md b/docs/desktop/gnome/x11vnc_plus_ssh_lan.uk.md index 637f35c1df..727963ce2a 100644 --- a/docs/desktop/gnome/x11vnc_plus_ssh_lan.uk.md +++ b/docs/desktop/gnome/x11vnc_plus_ssh_lan.uk.md @@ -20,8 +20,8 @@ x11vnc — потужна програма VNC. Те, що відрізняє x1 Для цього посібника передбачається, що у вас є: -- Робоча станція Rocky Linux -- привілеї `sudo` + - Робоча станція Rocky Linux + - привілеї `sudo` ## Налаштування сервера VNC @@ -161,8 +161,8 @@ vncviewer Поки що ця стаття показала вам, як налаштувати сервер x11vnc і підключитися до нього за допомогою VNC, що пересилається через тунель SSH. Здавалося б, очевидна, але все ж важлива деталь, про яку слід знати, полягає в тому, що цей метод працюватиме лише для комп’ютерів, підключених до мережі. Припустимо, ви хочете підключитися до комп’ютера в іншій локальній мережі. Спосіб досягти цього — налаштувати VPN. Нижче наведено кілька посібників щодо налаштування VPN: -- [OpenVPN](https://docs.rockylinux.org/guides/security/openvpn/) -- [Wireguard VPN](https://docs.rockylinux.org/guides/security/wireguard_vpn/) + - [OpenVPN](https://docs.rockylinux.org/guides/security/openvpn/) + - [Wireguard VPN](https://docs.rockylinux.org/guides/security/wireguard_vpn/) ## Висновок diff --git a/docs/desktop/printing/brother-all-in-one.it.md b/docs/desktop/printing/brother-all-in-one.it.md index 2081d9121f..d8ebbc87b1 100644 --- a/docs/desktop/printing/brother-all-in-one.it.md +++ b/docs/desktop/printing/brother-all-in-one.it.md @@ -50,17 +50,17 @@ Si apre una finestra Software che tenta di individuare ed installare i driver de 4. Eseguire il comando per estrarre il file scaricato: - ```bash - gunzip linux-brprinter-installer-*.*.*-*.gz - ``` + ```bash + gunzip linux-brprinter-installer-*.*.*-*.gz + ``` 5. Ottenere l'autorizzazione di superuser con il comando `su` o `sudo su`. 6. Eseguire il comando: - ```bash - bash linux-brprinter-installer-*.*.*-* Brother machine name - ``` + ```bash + bash linux-brprinter-installer-*.*.*-* Brother machine name + ``` 7. L'installazione del driver viene avviata. Seguire le istruzioni di installazione. diff --git a/docs/desktop/printing/brother-all-in-one.uk.md b/docs/desktop/printing/brother-all-in-one.uk.md index 6a8ceb94c4..3a0a127f0f 100644 --- a/docs/desktop/printing/brother-all-in-one.uk.md +++ b/docs/desktop/printing/brother-all-in-one.uk.md @@ -50,17 +50,17 @@ tags: 4. Введіть цю команду, щоб розпакувати завантажений файл: - ```bash - gunzip linux-brprinter-installer-*.*.*-*.gz - ``` + ```bash + gunzip linux-brprinter-installer-*.*.*-*.gz + ``` 5. Отримайте авторизацію суперкористувача за допомогою команди `su` або `sudo su`. 6. Запустіть інструмент: - ```bash - bash linux-brprinter-installer-*.*.*-* Brother machine name - ``` + ```bash + bash linux-brprinter-installer-*.*.*-* Brother machine name + ``` 7. Розпочнеться установка драйвера. Дотримуйтеся вказівок на екрані встановлення. diff --git a/docs/desktop/tools/businessapps.fr.md b/docs/desktop/tools/businessapps.fr.md index 598b5ce282..11bcbc83b1 100644 --- a/docs/desktop/tools/businessapps.fr.md +++ b/docs/desktop/tools/businessapps.fr.md @@ -14,9 +14,9 @@ La plupart d’entre elles sont sur Flathub. Dans ce guide, vous apprendrez à i Cet article suppose les éléments suivants : -- Une installation Rocky Linux avec un environnement de bureau graphique -- Les droits nécessaires pour l'installation de logiciels sur votre système -- Flatpak et Flathub installés et opérationnels + - Une installation Rocky Linux avec un environnement de bureau graphique + - Les droits nécessaires pour l'installation de logiciels sur votre système + - Flatpak et Flathub installés et opérationnels ## Installation des logiciels professionnels courants sur Rocky Linux diff --git a/docs/desktop/tools/businessapps.it.md b/docs/desktop/tools/businessapps.it.md index b72000713a..44725f1e6f 100644 --- a/docs/desktop/tools/businessapps.it.md +++ b/docs/desktop/tools/businessapps.it.md @@ -14,9 +14,9 @@ Molte di loro sono su Flathub. Questa guida spiega come installare le applicazio Questa guida presuppone quanto segue: -- Rocky Linux con un ambiente desktop grafico -- I permessi per installare software nel sistema -- Flatpak e Flathub installati e funzionanti + - Rocky Linux con un ambiente desktop grafico + - I permessi per installare software nel sistema + - Flatpak e Flathub installati e funzionanti ## Come installare i più comuni software aziendali su Rocky Linux diff --git a/docs/desktop/tools/businessapps.uk.md b/docs/desktop/tools/businessapps.uk.md index c4960a3c8d..ca3e891321 100644 --- a/docs/desktop/tools/businessapps.uk.md +++ b/docs/desktop/tools/businessapps.uk.md @@ -14,9 +14,9 @@ contributors: Steven Spencer, Ganna Zhyrnova Цей посібник передбачає наступне: -- Rocky Linux із графічним середовищем робочого столу -- Повноваження на встановлення програмного забезпечення у вашій системі -- Flatpak і Flathub встановлені та працюють + - Rocky Linux із графічним середовищем робочого столу + - Повноваження на встановлення програмного забезпечення у вашій системі + - Flatpak і Flathub встановлені та працюють ## Як інсталювати звичайне бізнес-програмне забезпечення на Rocky Linux diff --git a/docs/desktop/tools/firewallgui.de.md b/docs/desktop/tools/firewallgui.de.md index 0adac4f148..5b815fd756 100644 --- a/docs/desktop/tools/firewallgui.de.md +++ b/docs/desktop/tools/firewallgui.de.md @@ -14,9 +14,9 @@ Wir werden nicht alles abdecken, was `firewalld` oder die GUI leisten können, a Für diese Anleitung gehen wir davon aus, dass Sie über Folgendes verfügen: -- Eine Rocky Linux-Installation mit einer beliebigen grafischen Desktopumgebung -- `sudo` oder Administratorzugriff -- Ein grundlegendes Verständnis der Arbeitsweise von `firewalld` + - Eine Rocky Linux-Installation mit einer beliebigen grafischen Desktopumgebung + - `sudo` oder Administratorzugriff + - Ein grundlegendes Verständnis der Arbeitsweise von `firewalld` !!! note "Anmerkung" diff --git a/docs/desktop/tools/firewallgui.fr.md b/docs/desktop/tools/firewallgui.fr.md index 4c8dec8327..bed8b33fb2 100644 --- a/docs/desktop/tools/firewallgui.fr.md +++ b/docs/desktop/tools/firewallgui.fr.md @@ -14,9 +14,9 @@ Nous n'aborderons pas tout ce que `firewalld` ou l'interface graphique peuvent a Pour ce guide, nous partons du principe que vous disposez déjà de la configuration suivante : -- Une installation Rocky Linux avec n'importe quel environnement de bureau graphique -- `sudo` ou privilèges administratifs -- Vous possédez aussi une compréhension des bases du fonctionnement de `firewalld` + - Une installation Rocky Linux avec n'importe quel environnement de bureau graphique + - `sudo` ou privilèges administratifs + - Vous possédez aussi une compréhension des bases du fonctionnement de `firewalld` !!! note "Remarque" diff --git a/docs/desktop/tools/firewallgui.it.md b/docs/desktop/tools/firewallgui.it.md index c5629441e8..932ea9fe79 100644 --- a/docs/desktop/tools/firewallgui.it.md +++ b/docs/desktop/tools/firewallgui.it.md @@ -14,9 +14,9 @@ Non tratteremo tutto ciò che `firewalld` o la GUI possono fare, ma dovrebbe ess Per questa guida, si presume che l'utente disponga di quanto segue: -- Un'installazione di Rocky Linux con ambiente desktop grafico -- `sudo` o accesso come admin -- Una comprensione di base di come funziona `firewalld` + - Un'installazione di Rocky Linux con ambiente desktop grafico + - `sudo` o accesso come admin + - Una comprensione di base di come funziona `firewalld` !!! note "Nota" diff --git a/docs/desktop/tools/firewallgui.uk.md b/docs/desktop/tools/firewallgui.uk.md index ee8bf0262a..07ee131f39 100644 --- a/docs/desktop/tools/firewallgui.uk.md +++ b/docs/desktop/tools/firewallgui.uk.md @@ -14,9 +14,9 @@ contributors: Steven Spencer, Ganna Zhyrnova Для цього посібника ми припускаємо, що у вас є: -- Інсталяція Rocky Linux з будь-яким графічним середовищем робочого столу -- `sudo` або доступ адміністратора -- Фундаментальне розуміння того, як працює `firewalld` + - Інсталяція Rocky Linux з будь-яким графічним середовищем робочого столу + - `sudo` або доступ адміністратора + - Фундаментальне розуміння того, як працює `firewalld` !!! note "Примітка" diff --git a/docs/gemstones/gemstone_template.de.md b/docs/gemstones/gemstone_template.de.md index 18c2ffc79a..708d703423 100644 --- a/docs/gemstones/gemstone_template.de.md +++ b/docs/gemstones/gemstone_template.de.md @@ -30,15 +30,15 @@ Skizzieren Sie die Prozedur bzw. die Lösung mit nummerierten Schritten: 1. **Erste Etappe**: - Anleitungen und Kommandobeispiele. + Anleitungen und Kommandobeispiele. - ```bash - Befehl oder Codeausschnitt - ``` + ```bash + Befehl oder Codeausschnitt + ``` 2. **Zweite Etappe**: - Fahren Sie mit den detaillierten Anweisungen fort. + Fahren Sie mit den detaillierten Anweisungen fort. ## Zusätzliche Informationen (optional) diff --git a/docs/gemstones/gemstone_template.fr.md b/docs/gemstones/gemstone_template.fr.md index 2ca2da46e7..78339c0d5f 100644 --- a/docs/gemstones/gemstone_template.fr.md +++ b/docs/gemstones/gemstone_template.fr.md @@ -30,15 +30,15 @@ Décrivez la procédure ou la solution avec des étapes numérotées : 1. **Première Étape** : - Instructions et exemples de commandes. + Instructions et exemples de commandes. - ```bash - Commande ou extrait de code - ``` + ```bash + Commande ou extrait de code + ``` 2. **Étape Suivante** : - Continuez avec des instructions détaillées. + Continuez avec des instructions détaillées. ## Informations Supplémentaires (facultatif) diff --git a/docs/gemstones/gemstone_template.it.md b/docs/gemstones/gemstone_template.it.md index af37a07554..191b2e07a6 100644 --- a/docs/gemstones/gemstone_template.it.md +++ b/docs/gemstones/gemstone_template.it.md @@ -30,15 +30,15 @@ Delineare la procedura o la soluzione con passi numerati: 1. **Primo passo**: - Istruzioni ed esempi di comandi. + Istruzioni ed esempi di comandi. - ```bash - Comando o frammento di codice - ``` + ```bash + Comando o frammento di codice + ``` 2. **Secondo passo**: - Proseguire con le istruzioni dettagliate. + Proseguire con le istruzioni dettagliate. ## Informazioni aggiuntive (facoltative) diff --git a/docs/gemstones/gemstone_template.uk.md b/docs/gemstones/gemstone_template.uk.md index 00e3a3443e..93bd4b7d59 100644 --- a/docs/gemstones/gemstone_template.uk.md +++ b/docs/gemstones/gemstone_template.uk.md @@ -30,15 +30,15 @@ tags: 1. **Перший крок**: - Інструкції та приклади команд. + Інструкції та приклади команд. - ```bash - Команда або фрагмент коду - ``` + ```bash + Команда або фрагмент коду + ``` 2. **Другий крок**: - Продовжуйте з докладними інструкціями. + Продовжуйте з докладними інструкціями. ## Додаткова інформація (необов'язково) diff --git a/docs/gemstones/git/00-gh_cli_installation.de.md b/docs/gemstones/git/00-gh_cli_installation.de.md index 5ce97cd4e8..2626fc0b77 100644 --- a/docs/gemstones/git/00-gh_cli_installation.de.md +++ b/docs/gemstones/git/00-gh_cli_installation.de.md @@ -27,28 +27,28 @@ Benutzer benötigen eine bequeme Möglichkeit zur Interaktion mit GitHub, ohne d ## Prozedur 1. **GitHub CLI-Repository mit curl installieren**: - Verwenden Sie den Befehl curl, um die offizielle Repository-Datei für `gh` herunterzuladen. Die heruntergeladene Datei wird im Verzeichnis `/etc/yum.repos.d/` gespeichert. Verwenden Sie nach dem Herunterladen den Befehl dnf, um `gh` aus dem Repository zu installieren. Geben Sie bitte Folgendes ein: + Verwenden Sie den Befehl curl, um die offizielle Repository-Datei für `gh` herunterzuladen. Die heruntergeladene Datei wird im Verzeichnis `/etc/yum.repos.d/` gespeichert. Verwenden Sie nach dem Herunterladen den Befehl dnf, um `gh` aus dem Repository zu installieren. Geben Sie bitte Folgendes ein: - ```bash - curl -fsSL https://cli.github.com/packages/rpm/gh-cli.repo | sudo tee /etc/yum.repos.d/github-cli.repo - sudo dnf -y install gh - ``` + ```bash + curl -fsSL https://cli.github.com/packages/rpm/gh-cli.repo | sudo tee /etc/yum.repos.d/github-cli.repo + sudo dnf -y install gh + ``` 2. **Verifizierung der Installation**: - Stellen Sie sicher, dass `gh` korrekt installiert ist. Geben Sie bitte Folgendes ein: + Stellen Sie sicher, dass `gh` korrekt installiert ist. Geben Sie bitte Folgendes ein: - ```bash - gh --version - ``` + ```bash + gh --version + ``` 3. **Authentifizierung mit GitHub**: - Loggen Sie sich in Ihr GitHub-Konto ein. Geben Sie bitte Folgendes ein: + Loggen Sie sich in Ihr GitHub-Konto ein. Geben Sie bitte Folgendes ein: - ```bash - gh auth login - ``` + ```bash + gh auth login + ``` - Folgen Sie den Anweisungen zur Authentifizierung. + Folgen Sie den Anweisungen zur Authentifizierung. ## Zusammenfassung diff --git a/docs/gemstones/git/00-gh_cli_installation.fr.md b/docs/gemstones/git/00-gh_cli_installation.fr.md index ce7cfff9ef..a77da72fa6 100644 --- a/docs/gemstones/git/00-gh_cli_installation.fr.md +++ b/docs/gemstones/git/00-gh_cli_installation.fr.md @@ -27,28 +27,28 @@ Les utilisateurs ont besoin d’un moyen pratique pour interagir avec GitHub san ## Procédure 1. **Installer le référentiel CLI GitHub à l'aide de curl** : - utilisez la commande curl pour télécharger le fichier du référentiel officiel pour `gh`. Le fichier téléchargé sera enregistré dans le répertoire `/etc/yum.repos.d/`. Après le téléchargement, utilisez la commande `dnf` pour installer `gh` à partir du référentiel. Tapez la commande suivante : + utilisez la commande curl pour télécharger le fichier du référentiel officiel pour `gh`. Le fichier téléchargé sera enregistré dans le répertoire `/etc/yum.repos.d/`. Après le téléchargement, utilisez la commande `dnf` pour installer `gh` à partir du référentiel. Tapez la commande suivante : - ```bash - curl -fsSL https://cli.github.com/packages/rpm/gh-cli.repo | sudo tee /etc/yum.repos.d/github-cli.repo - sudo dnf -y install gh - ``` + ```bash + curl -fsSL https://cli.github.com/packages/rpm/gh-cli.repo | sudo tee /etc/yum.repos.d/github-cli.repo + sudo dnf -y install gh + ``` 2. **Vérifier l'installation** : - Assurez-vous que `gh` est correctement installé. Tapez la commande suivante : + Assurez-vous que `gh` est correctement installé. Tapez la commande suivante : - ```bash - gh --version - ``` + ```bash + gh --version + ``` 3. **Authentification avec GitHub** : - Connectez-vous à votre compte GitHub. Tapez la commande suivante : + Connectez-vous à votre compte GitHub. Tapez la commande suivante : - ```bash - gh auth login - ``` + ```bash + gh auth login + ``` - Suivez les instructions pour vous authentifier. + Suivez les instructions pour vous authentifier. ## Conclusion diff --git a/docs/gemstones/git/00-gh_cli_installation.it.md b/docs/gemstones/git/00-gh_cli_installation.it.md index 292ce56d7e..4734f413f2 100644 --- a/docs/gemstones/git/00-gh_cli_installation.it.md +++ b/docs/gemstones/git/00-gh_cli_installation.it.md @@ -27,28 +27,28 @@ Gli utenti hanno bisogno di un modo comodo per interagire con GitHub senza lasci ## Procedura 1. **Installare il repo GitHub CLI usando curl**: - Utilizzare il comando curl per scaricare il file del repository ufficiale di `gh`. Il file scaricato deve essere salvato nella directory /etc/yum.repos.d/. Una volta scaricato, usare il comando dnf per installare `gh` dal repository. Digitare: + Utilizzare il comando curl per scaricare il file del repository ufficiale di `gh`. Il file scaricato deve essere salvato nella directory /etc/yum.repos.d/. Una volta scaricato, usare il comando dnf per installare `gh` dal repository. Digitare: - ```bash - curl -fsSL https://cli.github.com/packages/rpm/gh-cli.repo | sudo tee /etc/yum.repos.d/github-cli.repo - sudo dnf -y install gh - ``` + ```bash + curl -fsSL https://cli.github.com/packages/rpm/gh-cli.repo | sudo tee /etc/yum.repos.d/github-cli.repo + sudo dnf -y install gh + ``` 2. **Verificare l'installazione**: - Assicurarsi che `gh` sia installato correttamente. Digitare: + Assicurarsi che `gh` sia installato correttamente. Digitare: - ```bash - gh --version - ``` + ```bash + gh --version + ``` 3. **Autenticazione con GitHub**: - Accedere al proprio account GitHub. Digitare: + Accedere al proprio account GitHub. Digitare: - ```bash - gh auth login - ``` + ```bash + gh auth login + ``` - Seguire le istruzioni per l'autenticazione. + Seguire le istruzioni per l'autenticazione. ## Conclusione diff --git a/docs/gemstones/git/00-gh_cli_installation.uk.md b/docs/gemstones/git/00-gh_cli_installation.uk.md index b7b97ea761..a1dec455f2 100644 --- a/docs/gemstones/git/00-gh_cli_installation.uk.md +++ b/docs/gemstones/git/00-gh_cli_installation.uk.md @@ -27,28 +27,28 @@ tags: ## Процедура 1. **Встановіть репозиторій GitHub CLI за допомогою curl**: - Використовуйте команду curl, щоб завантажити офіційний файл сховища для `gh`. Завантажений файл буде збережено в каталозі /etc/yum.repos.d/. Після завантаження використовуйте команду dnf, щоб установити `gh` зі сховища. Впишіть: + Використовуйте команду curl, щоб завантажити офіційний файл сховища для `gh`. Завантажений файл буде збережено в каталозі /etc/yum.repos.d/. Після завантаження використовуйте команду dnf, щоб установити `gh` зі сховища. Впишіть: - ```bash - curl -fsSL https://cli.github.com/packages/rpm/gh-cli.repo | sudo tee /etc/yum.repos.d/github-cli.repo - sudo dnf -y install gh - ``` + ```bash + curl -fsSL https://cli.github.com/packages/rpm/gh-cli.repo | sudo tee /etc/yum.repos.d/github-cli.repo + sudo dnf -y install gh + ``` 2. **Перевірте встановлення**: - Переконайтеся, що `gh` встановлено правильно. Впишіть: + Переконайтеся, що `gh` встановлено правильно. Впишіть: - ```bash - gh --version - ``` + ```bash + gh --version + ``` 3. **Автентифікація за допомогою GitHub**: - Увійдіть у свій обліковий запис GitHub. Впишіть: + Увійдіть у свій обліковий запис GitHub. Впишіть: - ```bash - gh auth login - ``` + ```bash + gh auth login + ``` - Дотримуйтеся вказівок для автентифікації. + Дотримуйтеся вказівок для автентифікації. ## Висновок diff --git a/docs/gemstones/git/01-gh_cli_1st_pr.de.md b/docs/gemstones/git/01-gh_cli_1st_pr.de.md index 1d770e3675..5d8343a1ed 100644 --- a/docs/gemstones/git/01-gh_cli_1st_pr.de.md +++ b/docs/gemstones/git/01-gh_cli_1st_pr.de.md @@ -28,56 +28,56 @@ Mitwirkende möchten oder müssen möglicherweise alle Aktionen über die CLI au ## Lösung-Etappen 1. **Repository mit GitHub CLI forken**: - Forken Sie das Upstream-Repository zu Ihrem Konto. + Forken Sie das Upstream-Repository zu Ihrem Konto. - ```bash - gh repo fork https://github.com/rocky-linux/documentation --clone - ``` + ```bash + gh repo fork https://github.com/rocky-linux/documentation --clone + ``` 2. **Navigieren zum Repository-Verzeichnis**: - ```bash - cd documentation - ``` + ```bash + cd documentation + ``` 3. **Upstream-Repository hinzufügen**: - ```bash - git remote add upstream https://github.com/rocky-linux/documentation.git - ``` + ```bash + git remote add upstream https://github.com/rocky-linux/documentation.git + ``` 4. **Neuen Zweig erstellen**: - Erstellen Sie einen neuen Zweig für Ihren Beitrag. Geben Sie bitte Folgendes ein: + Erstellen Sie einen neuen Zweig für Ihren Beitrag. Geben Sie bitte Folgendes ein: - ```bash - git checkout -b new-gemstone - ``` + ```bash + git checkout -b new-gemstone + ``` 5. **Neuen Zweig erstellen**: - Erstellen Sie einen neuen Zweig für Ihren Beitrag. - Für dieses Beispiel erstellen Sie eine neue Datei namens `gemstome_new_pr.md` im Verzeichnis „docs/gemstones/“. + Erstellen Sie einen neuen Zweig für Ihren Beitrag. + Für dieses Beispiel erstellen Sie eine neue Datei namens `gemstome_new_pr.md` im Verzeichnis „docs/gemstones/“. 6. **Übernahme der Änderungen mit Commit**: - Stellen Sie Ihre neue Datei bereit mit `commit`. Geben Sie bitte Folgendes ein: + Stellen Sie Ihre neue Datei bereit mit `commit`. Geben Sie bitte Folgendes ein: - ```bash - git add docs/gemstones/gemstome_new_pr.md - git commit -m "Add new Gemstone document" - ``` + ```bash + git add docs/gemstones/gemstome_new_pr.md + git commit -m "Add new Gemstone document" + ``` 7. **Auf Ihren Fork mit Push übertragen**: - Übertragen Sie die Änderungen mit `push` auf Ihren Fork/Kopie des Rocky Linux-Dokumentationsrepos. Geben Sie bitte Folgendes ein: + Übertragen Sie die Änderungen mit `push` auf Ihren Fork/Kopie des Rocky Linux-Dokumentationsrepos. Geben Sie bitte Folgendes ein: - ```bash - git push origin new-gemstone - ``` + ```bash + git push origin new-gemstone + ``` 8. **Pull Request erstellen**: - Erstellen Sie einen Pull Request an das Upstream-Repository. + Erstellen Sie einen Pull Request an das Upstream-Repository. - ```bash - gh pr create --base main --head wsoyinka:new-gemstone --title "New Gemstone: Creating PRs via CLI" --body "Guide on how to contribute to documentation using CLI" - ``` + ```bash + gh pr create --base main --head wsoyinka:new-gemstone --title "New Gemstone: Creating PRs via CLI" --body "Guide on how to contribute to documentation using CLI" + ``` ## Zusätzliche Informationen (optional) diff --git a/docs/gemstones/git/01-gh_cli_1st_pr.fr.md b/docs/gemstones/git/01-gh_cli_1st_pr.fr.md index da4b58108c..5b6e229023 100644 --- a/docs/gemstones/git/01-gh_cli_1st_pr.fr.md +++ b/docs/gemstones/git/01-gh_cli_1st_pr.fr.md @@ -28,56 +28,56 @@ Les contributeurs peuvent préférer ou avoir besoin d'effectuer toutes les acti ## Étapes de la Solution 1. **Fork du référentiel à l'aide de la CLI GitHub** : - Forkez le dépôt en amont sur votre compte. + Forkez le dépôt en amont sur votre compte. - ```bash - gh repo fork https://github.com/rocky-linux/documentation --clone - ``` + ```bash + gh repo fork https://github.com/rocky-linux/documentation --clone + ``` 2. **Accéder au répertoire du référentiel** : - ```bash - cd documentation - ``` + ```bash + cd documentation + ``` 3. **Ajouter le référentiel en amont** : - ```bash - git remote add upstream https://github.com/rocky-linux/documentation.git - ``` + ```bash + git remote add upstream https://github.com/rocky-linux/documentation.git + ``` 4. **Création d'une branche** : - Créez une nouvelle branche pour votre contribution. Tapez la commande suivante : + Créez une nouvelle branche pour votre contribution. Tapez la commande suivante : - ```bash - git checkout -b new-gemstone - ``` + ```bash + git checkout -b new-gemstone + ``` 5. **Ajouter un nouveau document** : - Utilisez votre éditeur de texte préféré pour créer et modifier votre nouveau fichier de contribution. - Pour cet exemple, nous allons créer `gemstome_new_pr.md` et enregistrer ce fichier sous le répertoire `docs/gemstones/`. + Utilisez votre éditeur de texte préféré pour créer et modifier votre nouveau fichier de contribution. + Pour cet exemple, nous allons créer `gemstome_new_pr.md` et enregistrer ce fichier sous le répertoire `docs/gemstones/`. 6. **Commit des modifications** : - Préparez et validez votre nouveau fichier. Tapez la commande suivante : + Préparez et validez votre nouveau fichier. Tapez la commande suivante : - ```bash - git add docs/gemstones/gemstome_new_pr.md - git commit -m "Add new Gemstone document" - ``` + ```bash + git add docs/gemstones/gemstome_new_pr.md + git commit -m "Add new Gemstone document" + ``` 7. **Push vers le fork** : - Envoyez les modifications vers votre fork/copie du dépôt de documentation Rocky Linux. Tapez la commande suivante : + Envoyez les modifications vers votre fork/copie du dépôt de documentation Rocky Linux. Tapez la commande suivante : - ```bash - git push origin new-gemstone - ``` + ```bash + git push origin new-gemstone + ``` 8. **Création d'une Pull Request** : - Créez une requête vers le référentiel en amont. + Créez une requête vers le référentiel en amont. - ```bash - gh pr create --base main --head wsoyinka:new-gemstone --title "New Gemstone: Creating PRs via CLI" --body "Guide on how to contribute to documentation using CLI" - ``` + ```bash + gh pr create --base main --head wsoyinka:new-gemstone --title "New Gemstone: Creating PRs via CLI" --body "Guide on how to contribute to documentation using CLI" + ``` ## Informations Supplémentaires (facultatif) diff --git a/docs/gemstones/git/01-gh_cli_1st_pr.it.md b/docs/gemstones/git/01-gh_cli_1st_pr.it.md index 95d685bcf7..97efa331b1 100644 --- a/docs/gemstones/git/01-gh_cli_1st_pr.it.md +++ b/docs/gemstones/git/01-gh_cli_1st_pr.it.md @@ -28,56 +28,56 @@ I collaboratori possono preferire o avere bisogno di eseguire tutte le azioni tr ## Passi della soluzione 1. **Fork del repository usando GitHub CLI**: - Fare il fork del repository upstream sul proprio account. + Fare il fork del repository upstream sul proprio account. - ```bash - gh repo fork https://github.com/rocky-linux/documentation --clone - ``` + ```bash + gh repo fork https://github.com/rocky-linux/documentation --clone + ``` 2. **Andare alla directory del repository**: - ```bash - cd documentation - ``` + ```bash + cd documentation + ``` 3. **Aggiungere il repository Upstream**: - ```bash - git remote add upstream https://github.com/rocky-linux/documentation.git - ``` + ```bash + git remote add upstream https://github.com/rocky-linux/documentation.git + ``` 4. **Creare un Nuovo Ramo**: - Creare un nuovo ramo per il proprio contributo. Digitare: + Creare un nuovo ramo per il proprio contributo. Digitare: - ```bash - git checkout -b new-gemstone - ``` + ```bash + git checkout -b new-gemstone + ``` 5. **Aggiungere il nuovo documento**: - Utilizzate il vostro editor di testo preferito per creare e modificare il vostro nuovo file di contributo. - Per questo esempio, creeremo un nuovo file chiamato `gemstome_new_pr.md` e lo salveremo nella cartella `docs/gemstones/`. + Utilizzate il vostro editor di testo preferito per creare e modificare il vostro nuovo file di contributo. + Per questo esempio, creeremo un nuovo file chiamato `gemstome_new_pr.md` e lo salveremo nella cartella `docs/gemstones/`. 6. **Effettuare il commit delle modifiche**: - Eseguire il commit del nuovo file. Digitare: + Eseguire il commit del nuovo file. Digitare: - ```bash - git add docs/gemstones/gemstome_new_pr.md - git commit -m "Add new Gemstone document" - ``` + ```bash + git add docs/gemstones/gemstome_new_pr.md + git commit -m "Add new Gemstone document" + ``` 7. **Spingere nel proprio fork**: - Inviare le modifiche al proprio fork/copia del repo della documentazione di Rocky Linux. Digitare: + Inviare le modifiche al proprio fork/copia del repo della documentazione di Rocky Linux. Digitare: - ```bash - git push origin new-gemstone - ``` + ```bash + git push origin new-gemstone + ``` 8. **Creare una richiesta di pull**: - Creare una richiesta di pull al repository upstream. + Creare una richiesta di pull al repository upstream. - ```bash - gh pr create --base main --head wsoyinka:new-gemstone --title "New Gemstone: Creating PRs via CLI" --body "Guide on how to contribute to documentation using CLI" - ``` + ```bash + gh pr create --base main --head wsoyinka:new-gemstone --title "New Gemstone: Creating PRs via CLI" --body "Guide on how to contribute to documentation using CLI" + ``` ## Informazioni aggiuntive (facoltative) diff --git a/docs/gemstones/git/01-gh_cli_1st_pr.uk.md b/docs/gemstones/git/01-gh_cli_1st_pr.uk.md index 850136a294..313336b075 100644 --- a/docs/gemstones/git/01-gh_cli_1st_pr.uk.md +++ b/docs/gemstones/git/01-gh_cli_1st_pr.uk.md @@ -28,56 +28,56 @@ tags: ## Етапи рішення 1. **Розгалужте репозиторій за допомогою GitHub CLI**: - Розгалужте репозиторій вище за течією до свого облікового запису. + Розгалужте репозиторій вище за течією до свого облікового запису. - ```bash - gh repo fork https://github.com/rocky-linux/documentation --clone - ``` + ```bash + gh repo fork https://github.com/rocky-linux/documentation --clone + ``` 2. **Перейдіть до каталогу сховища**: - ```bash - cd documentation - ``` + ```bash + cd documentation + ``` 3. **Додайте репозиторій Upstream**: - ```bash - git remote add upstream https://github.com/rocky-linux/documentation.git - ``` + ```bash + git remote add upstream https://github.com/rocky-linux/documentation.git + ``` 4. **Створіть нову гілку**: - Створіть нову гілку для свого внеску. Впишіть: + Створіть нову гілку для свого внеску. Впишіть: - ```bash - git checkout -b new-gemstone - ``` + ```bash + git checkout -b new-gemstone + ``` 5. **Додайте свій новий документ**: - Використовуйте свій улюблений текстовий редактор, щоб створити та відредагувати новий файл внеску. - Для цього прикладу ми створимо новий файл під назвою `gemstome_new_pr.md` і збережемо його в каталозі `docs/gemstones/`. + Використовуйте свій улюблений текстовий редактор, щоб створити та відредагувати новий файл внеску. + Для цього прикладу ми створимо новий файл під назвою `gemstome_new_pr.md` і збережемо його в каталозі `docs/gemstones/`. 6. **Зафіксуйте свої зміни**: - Створіть і зафіксуйте новий файл. Впишіть: + Створіть і зафіксуйте новий файл. Впишіть: - ```bash - git add docs/gemstones/gemstome_new_pr.md - git commit -m "Add new Gemstone document" - ``` + ```bash + git add docs/gemstones/gemstome_new_pr.md + git commit -m "Add new Gemstone document" + ``` 7. **Натисніть на свою вилку**: - Надішліть зміни у свій форк/копію сховища документації Rocky Linux. Впишіть: + Надішліть зміни у свій форк/копію сховища документації Rocky Linux. Впишіть: - ```bash - git push origin new-gemstone - ``` + ```bash + git push origin new-gemstone + ``` 8. **Створіть запит на отримання**: - Створіть запит на отримання до репозиторію вище за течією. + Створіть запит на отримання до репозиторію вище за течією. - ```bash - gh pr create --base main --head wsoyinka:new-gemstone --title "New Gemstone: Creating PRs via CLI" --body "Guide on how to contribute to documentation using CLI" - ``` + ```bash + gh pr create --base main --head wsoyinka:new-gemstone --title "New Gemstone: Creating PRs via CLI" --body "Guide on how to contribute to documentation using CLI" + ``` ## Додаткова інформація (необов'язково) diff --git a/docs/gemstones/git/02-gh_cli_edit_pr_title.de.md b/docs/gemstones/git/02-gh_cli_edit_pr_title.de.md index 26eedcec20..274db232e5 100644 --- a/docs/gemstones/git/02-gh_cli_edit_pr_title.de.md +++ b/docs/gemstones/git/02-gh_cli_edit_pr_title.de.md @@ -27,20 +27,20 @@ Manchmal muss der Titel eines PR nach seiner Erstellung angepasst werden, um die ### GitHub CLI – Verwendung 1. **Checken Sie den entsprechenden Zweig aus**: - - Stellen Sie sicher, dass Sie sich auf dem mit dem PR verknüpften Branch befinden. + - Stellen Sie sicher, dass Sie sich auf dem mit dem PR verknüpften Branch befinden. - ```bash - git checkout branch-name - ``` + ```bash + git checkout branch-name + ``` 2. **Bearbeiten Sie den PR mithilfe der CLI**: - - Verwenden Sie den folgenden Befehl, um den PR zu bearbeiten: + - Verwenden Sie den folgenden Befehl, um den PR zu bearbeiten: - ```bash - gh pr edit PR_NUMBER --title "New PR Title" - ``` + ```bash + gh pr edit PR_NUMBER --title "New PR Title" + ``` - - Ersetzen Sie `PR_NUMBER` durch die Nummer Ihres Pull Requests und `"New PR Title"` durch den gewünschten Titel. + - Ersetzen Sie `PR_NUMBER` durch die Nummer Ihres Pull Requests und `"New PR Title"` durch den gewünschten Titel. ## Zusätzliche Informationen (optional) diff --git a/docs/gemstones/git/02-gh_cli_edit_pr_title.fr.md b/docs/gemstones/git/02-gh_cli_edit_pr_title.fr.md index c76dc20528..d144152354 100644 --- a/docs/gemstones/git/02-gh_cli_edit_pr_title.fr.md +++ b/docs/gemstones/git/02-gh_cli_edit_pr_title.fr.md @@ -27,20 +27,20 @@ Parfois, le titre d'une PR après sa création peut devoir être modifié pour m ### Utilisation du CLI de GitHub 1. **Check Out de la branche correspondante** : - - Assurez-vous que vous êtes sur la branche associée à la PR. + - Assurez-vous que vous êtes sur la branche associée à la PR. - ```bash - git checkout branch-name - ``` + ```bash + git checkout branch-name + ``` 2. **Modifier le PR à l'aide de la CLI** : - - Utilisez la commande suivante pour modifier la PR : + - Utilisez la commande suivante pour modifier la PR : - ```bash - gh pr edit PR_NUMBER --title "New PR Title" - ``` + ```bash + gh pr edit PR_NUMBER --title "New PR Title" + ``` - - Remplacez `PR_NUMBER` par le numéro de votre pull request et `"New PR Title"` par le titre souhaité. + - Remplacez `PR_NUMBER` par le numéro de votre pull request et `"New PR Title"` par le titre souhaité. ## Informations Supplémentaires (facultatif) diff --git a/docs/gemstones/git/02-gh_cli_edit_pr_title.it.md b/docs/gemstones/git/02-gh_cli_edit_pr_title.it.md index bde44b3691..01d3969884 100644 --- a/docs/gemstones/git/02-gh_cli_edit_pr_title.it.md +++ b/docs/gemstones/git/02-gh_cli_edit_pr_title.it.md @@ -27,20 +27,20 @@ A volte, il titolo di un PR dopo la sua creazione può dover essere modificato p ### Utilizzare la CLI di GitHub 1. **Controllare il ramo corrispondente**: - - Assicurarsi di essere nel ramo associato al PR. + - Assicurarsi di essere nel ramo associato al PR. - ```bash - git checkout branch-name - ``` + ```bash + git checkout branch-name + ``` 2. **Modificare il PR usando la CLI**: - - Utilizzare il seguente comando per modificare il PR: + - Utilizzare il seguente comando per modificare il PR: - ```bash - gh pr edit PR_NUMBER --title "New PR Title" - ``` + ```bash + gh pr edit PR_NUMBER --title "New PR Title" + ``` - - Sostituire `PR_NUMBER` con il numero della richiesta di pull e `"New PR Title"` con il titolo desiderato. + - Sostituire `PR_NUMBER` con il numero della richiesta di pull e `"New PR Title"` con il titolo desiderato. ## Informazioni aggiuntive (facoltative) diff --git a/docs/gemstones/git/02-gh_cli_edit_pr_title.uk.md b/docs/gemstones/git/02-gh_cli_edit_pr_title.uk.md index 20ad797d1f..2a6995b666 100644 --- a/docs/gemstones/git/02-gh_cli_edit_pr_title.uk.md +++ b/docs/gemstones/git/02-gh_cli_edit_pr_title.uk.md @@ -27,20 +27,20 @@ tags: ### Використання GitHub CLI 1. **Перевірте відповідну гілку**: - - Переконайтеся, що ви перебуваєте у гілці, пов’язаній з PR. + - Переконайтеся, що ви перебуваєте у гілці, пов’язаній з PR. - ```bash - git checkout branch-name - ``` + ```bash + git checkout branch-name + ``` 2. **Відредагуйте PR за допомогою CLI**: - - Використовуйте наступну команду для редагування PR: + - Використовуйте наступну команду для редагування PR: - ```bash - gh pr edit PR_NUMBER --title "New PR Title" - ``` + ```bash + gh pr edit PR_NUMBER --title "New PR Title" + ``` - - Замініть `PR_NUMBER` на номер вашого запиту на отримання, а `"New PR Title"` на потрібну назву. + - Замініть `PR_NUMBER` на номер вашого запиту на отримання, а `"New PR Title"` на потрібну назву. ## Додаткова інформація (необов'язково) diff --git a/docs/gemstones/git/02_github_web_edit_pr_title.de.md b/docs/gemstones/git/02_github_web_edit_pr_title.de.md index cf63d1b7a3..12cb7ce0af 100644 --- a/docs/gemstones/git/02_github_web_edit_pr_title.de.md +++ b/docs/gemstones/git/02_github_web_edit_pr_title.de.md @@ -26,13 +26,13 @@ Manchmal kann es erforderlich sein, den Titel eines PR nach seiner Erstellung zu ### Verwendung der GitHub-Weboberfläche 1. **Navigieren Sie zum Pull Request**: - - Gehen Sie zum Repository, in dem sich der PR befindet. - - Klicken Sie auf `Pull Requests` und wählen Sie den PR aus, den Sie bearbeiten möchten. + - Gehen Sie zum Repository, in dem sich der PR befindet. + - Klicken Sie auf `Pull Requests` und wählen Sie den PR aus, den Sie bearbeiten möchten. 2. **PR-Titel Editieren**: - - Klicken Sie auf den Titel der PR. - - Ein editierbares Textfeld wird angezeigt. - - Passen Sie den Titel an, drücken Sie ++enter++ oder klicken Sie außerhalb des Textfelds, um die Änderungen zu speichern. + - Klicken Sie auf den Titel der PR. + - Ein editierbares Textfeld wird angezeigt. + - Passen Sie den Titel an, drücken Sie ++enter++ oder klicken Sie außerhalb des Textfelds, um die Änderungen zu speichern. ## Zusätzliche Informationen (optional) diff --git a/docs/gemstones/git/02_github_web_edit_pr_title.fr.md b/docs/gemstones/git/02_github_web_edit_pr_title.fr.md index dbb52a01a0..651ad18613 100644 --- a/docs/gemstones/git/02_github_web_edit_pr_title.fr.md +++ b/docs/gemstones/git/02_github_web_edit_pr_title.fr.md @@ -26,13 +26,13 @@ Parfois, il peut être nécessaire de modifier le titre d'une requête PR après ### Utilisation de l'interface Web de GitHub 1. **Accéder à la requète Pull Request**: - - Accédez au référentiel où se trouve la requête PR. - - Cliquez sur `Pull requests` et sélectionnez la requête PR que vous souhaitez modifier. + - Accédez au référentiel où se trouve la requête PR. + - Cliquez sur `Pull requests` et sélectionnez la requête PR que vous souhaitez modifier. 2. **Édition du Titre de PR**: - - Cliquez sur le titre de la Pull Request. - - Une boîte de texte modifiable apparaîtra. - - Modifiez le titre, appuyez sur ++enter++ ou cliquez en dehors de la zone de texte pour enregistrer les modifications. + - Cliquez sur le titre de la Pull Request. + - Une boîte de texte modifiable apparaîtra. + - Modifiez le titre, appuyez sur ++enter++ ou cliquez en dehors de la zone de texte pour enregistrer les modifications. ## Informations Supplémentaires (facultatif) diff --git a/docs/gemstones/git/02_github_web_edit_pr_title.it.md b/docs/gemstones/git/02_github_web_edit_pr_title.it.md index 0081e1e13d..7fae014f4f 100644 --- a/docs/gemstones/git/02_github_web_edit_pr_title.it.md +++ b/docs/gemstones/git/02_github_web_edit_pr_title.it.md @@ -26,13 +26,13 @@ A volte può essere necessario modificare il titolo di un PR dopo la sua creazio ### Utilizzare l'interfaccia web di GitHub 1. **Andare alla richiesta di pull**: - - Andare al repository dove si trova il PR. - - Cliccare su "Pull requests" e selezionare il PR che si desidera modificare. + - Andare al repository dove si trova il PR. + - Cliccare su "Pull requests" e selezionare il PR che si desidera modificare. 2. **Modificare il titolo del PR**: - - Cliccare sul titolo del PR. - - Apparirà una casella di testo modificabile. - - Modificare il titolo, premere ++enter++ o cliccare al di fuori della casella di testo per salvare le modifiche. + - Cliccare sul titolo del PR. + - Apparirà una casella di testo modificabile. + - Modificare il titolo, premere ++enter++ o cliccare al di fuori della casella di testo per salvare le modifiche. ## Informazioni aggiuntive (facoltative) diff --git a/docs/gemstones/git/02_github_web_edit_pr_title.uk.md b/docs/gemstones/git/02_github_web_edit_pr_title.uk.md index 238f419d47..4d3a5e0065 100644 --- a/docs/gemstones/git/02_github_web_edit_pr_title.uk.md +++ b/docs/gemstones/git/02_github_web_edit_pr_title.uk.md @@ -26,13 +26,13 @@ tags: ### Використання веб-інтерфейсу GitHub 1. **Перейдіть до запиту**: - - Перейдіть до сховища, де знаходиться PR. - - Натисніть «Pull requests» і виберіть PR, який потрібно змінити. + - Перейдіть до сховища, де знаходиться PR. + - Натисніть «Pull requests» і виберіть PR, який потрібно змінити. 2. **Відредагуйте назву PR**: - - Натисніть на назву PR. - - З’явиться текстове поле, яке можна редагувати. - - Змініть назву, натисніть ++enter++ або клацніть за межами текстового поля, щоб зберегти зміни. + - Натисніть на назву PR. + - З’явиться текстове поле, яке можна редагувати. + - Змініть назву, натисніть ++enter++ або клацніть за межами текстового поля, щоб зберегти зміни. ## Додаткова інформація (необов'язково) diff --git a/docs/gemstones/git/feature_branch_workflow.de.md b/docs/gemstones/git/feature_branch_workflow.de.md index 2fe27fb0cf..5dba0f7fbc 100644 --- a/docs/gemstones/git/feature_branch_workflow.de.md +++ b/docs/gemstones/git/feature_branch_workflow.de.md @@ -31,53 +31,53 @@ Der Benutzer `Rockstar` hat dieses Repository geforkt und wir werden `https://gi 1. Falls noch nicht geschehen, klonen Sie Ihren Fork: - ```bash - git clone https://github.com/rockstar/documentation.git - cd documentation - ``` + ```bash + git clone https://github.com/rockstar/documentation.git + cd documentation + ``` 2. Fügen Sie das Upstream-Remote hinzu: - ```bash - git remote add upstream https://github.com/rocky-linux/documentation.git - ``` + ```bash + git remote add upstream https://github.com/rocky-linux/documentation.git + ``` 3. Upstream-Änderungen abrufen: - ```bash - git fetch upstream - ``` + ```bash + git fetch upstream + ``` 4. Erstellen Sie einen neuen Feature-Zweig: - ```bash - git checkout -b feature-branch-name - ``` + ```bash + git checkout -b feature-branch-name + ``` 5. Nehmen Sie Änderungen vor, fügen Sie neue Dateien hinzu und committen Sie sie: - ```bash - git add . - git commit -m "Implementing feature X" - ``` + ```bash + git add . + git commit -m "Implementing feature X" + ``` 6. Halten Sie Ihr Branch auf dem neuesten Stand. Führen Sie regelmäßig Änderungen aus dem Upstream zusammen, um Konflikte zu vermeiden: - ```bash - git pull upstream main --rebase - ``` + ```bash + git pull upstream main --rebase + ``` 7. Pushen Sie zu Ihrem Fork indem Sie Folgendes eingeben: - ```bash - git push origin feature-branch-name - ``` + ```bash + git push origin feature-branch-name + ``` 8. Pull Request anlegen: - ```bash - gh pr create --base main --head rockstar:feature-branch-name --title "New Feature X" --body "Long Description of the feature" - ``` + ```bash + gh pr create --base main --head rockstar:feature-branch-name --title "New Feature X" --body "Long Description of the feature" + ``` ## Zusammenfassung diff --git a/docs/gemstones/git/feature_branch_workflow.it.md b/docs/gemstones/git/feature_branch_workflow.it.md index 220ee1c23d..95cf3b5332 100644 --- a/docs/gemstones/git/feature_branch_workflow.it.md +++ b/docs/gemstones/git/feature_branch_workflow.it.md @@ -31,53 +31,53 @@ L'utente "rockstar" ha effettuato il fork di questo repository e useremo `https: 1. Se non è stato ancora fatto, clonare il vostro fork: - ```bash - git clone https://github.com/rockstar/documentation.git - cd documentation - ``` + ```bash + git clone https://github.com/rockstar/documentation.git + cd documentation + ``` 2. Aggiungere l'upstream remoto: - ```bash - git remote add upstream https://github.com/rocky-linux/documentation.git - ``` + ```bash + git remote add upstream https://github.com/rocky-linux/documentation.git + ``` 3. Recuperare le modifiche a monte: - ```bash - git fetch upstream - ``` + ```bash + git fetch upstream + ``` 4. Creare una nuova Feature Branch: - ```bash - git checkout -b feature-branch-name - ``` + ```bash + git checkout -b feature-branch-name + ``` 5. Apportare modifiche, aggiungere nuovi file e fare il commit: - ```bash - git add . - git commit -m "Implementing feature X" - ``` + ```bash + git add . + git commit -m "Implementing feature X" + ``` 6. Tenete aggiornata il vostro Ramo. Unire regolarmente le modifiche provenienti dall'upstream per evitare conflitti: - ```bash - git pull upstream main --rebase - ``` + ```bash + git pull upstream main --rebase + ``` 7. Spingere verso il vostro fork, digitare: - ```bash - git push origin feature-branch-name - ``` + ```bash + git push origin feature-branch-name + ``` 8. Creare una Pull Request: - ```bash - gh pr create --base main --head rockstar:feature-branch-name --title "New Feature X" --body "Long Description of the feature" - ``` + ```bash + gh pr create --base main --head rockstar:feature-branch-name --title "New Feature X" --body "Long Description of the feature" + ``` ## Conclusione diff --git a/docs/gemstones/git/feature_branch_workflow.uk.md b/docs/gemstones/git/feature_branch_workflow.uk.md index 9e35839e1a..8868c8b766 100644 --- a/docs/gemstones/git/feature_branch_workflow.uk.md +++ b/docs/gemstones/git/feature_branch_workflow.uk.md @@ -31,53 +31,53 @@ tags: 1. Якщо це ще не зроблено, клонуйте вашу гілку: - ```bash - git clone https://github.com/rockstar/documentation.git - cd documentation - ``` + ```bash + git clone https://github.com/rockstar/documentation.git + cd documentation + ``` 2. Додайте дистанційне керування: - ```bash - git remote add upstream https://github.com/rocky-linux/documentation.git - ``` + ```bash + git remote add upstream https://github.com/rocky-linux/documentation.git + ``` 3. Отримайте зміни: - ```bash - git fetch upstream - ``` + ```bash + git fetch upstream + ``` 4. Створіть нову гілку функції: - ```bash - git checkout -b feature-branch-name - ``` + ```bash + git checkout -b feature-branch-name + ``` 5. Внесіть зміни, додайте нові файли та зафіксуйте їх: - ```bash - git add . - git commit -m "Implementing feature X" - ``` + ```bash + git add . + git commit -m "Implementing feature X" + ``` 6. Тримайте свою гілку оновленою. Регулярно об’єднуйте зміни з висхідного потоку, щоб уникнути конфліктів: - ```bash - git pull upstream main --rebase - ``` + ```bash + git pull upstream main --rebase + ``` 7. Запушіть вилку, введіть: - ```bash - git push origin feature-branch-name - ``` + ```bash + git push origin feature-branch-name + ``` 8. Створіть запит: - ```bash - gh pr create --base main --head rockstar:feature-branch-name --title "New Feature X" --body "Long Description of the feature" - ``` + ```bash + gh pr create --base main --head rockstar:feature-branch-name --title "New Feature X" --body "Long Description of the feature" + ``` ## Висновок diff --git a/docs/gemstones/git/fork_and_branch_workflow.it.md b/docs/gemstones/git/fork_and_branch_workflow.it.md index 58c52fb425..6e40df9390 100644 --- a/docs/gemstones/git/fork_and_branch_workflow.it.md +++ b/docs/gemstones/git/fork_and_branch_workflow.it.md @@ -29,70 +29,70 @@ Questa Gemma spiega come impostare un repository locale per contribuire a un pro 1. Se non esiste già, creare un fork del progetto usando l'utilità gh. Digitare: - ```bash - gh repo fork rocky-linux/documentation --clone=true --remote=true - ``` + ```bash + gh repo fork rocky-linux/documentation --clone=true --remote=true + ``` - Le opzioni utilizzate in questo comando _gh repo fork_ sono: + Le opzioni utilizzate in questo comando _gh repo fork_ sono: - - `--clone=true`: Clona il forked repository sulla macchina locale. - - `--remote=true`: Aggiunge il repository originale come remoto, consentendo di sincronizzare gli aggiornamenti futuri. + - `--clone=true`: Clona il forked repository sulla macchina locale. + - `--remote=true`: Aggiunge il repository originale come remoto, consentendo di sincronizzare gli aggiornamenti futuri. 2. Navigare nella directory del repository locale. Digitare: - ```bash - cd documentation - ``` + ```bash + cd documentation + ``` 3. Verificare che tutti i repo remoti siano stati configurati correttamente nel repo locale, digitare: - ```bash - git remote -vv - ``` + ```bash + git remote -vv + ``` 4. Recuperare le ultime modifiche dal telecomando upstream: - ```bash - git fetch upstream - ``` + ```bash + git fetch upstream + ``` 5. Creare e fare il checkout di un nuovo ramo di funzionalità chiamato your-feature-branch: - ```bash - git checkout -b your-feature-branch - ``` + ```bash + git checkout -b your-feature-branch + ``` 6. Apportare le modifiche, aggiungere nuovi file e fare il commit delle modifiche al repo locale: - ```bash - git add . - git commit -m "Your commit message" - ``` + ```bash + git add . + git commit -m "Your commit message" + ``` 7. Sincronizzare con il ramo principale del repo remoto chiamato `upstream`: - ```bash - git pull upstream main - ``` + ```bash + git pull upstream main + ``` 8. Spingere le modifiche al vostro Fork\*\*: - ```bash - git push origin your-feature-branch - ``` + ```bash + git push origin your-feature-branch + ``` 9. Infine, si può creare una richiesta di pull (PR) usando l'applicazione CLI `gh`: - ```bash - gh pr create --base main --head your-feature-branch --title "Your PR Title" --body "Description of your changes" - ``` + ```bash + gh pr create --base main --head your-feature-branch --title "Your PR Title" --body "Description of your changes" + ``` - Le opzioni utilizzate in questo comando _gh pr create_ sono: + Le opzioni utilizzate in questo comando _gh pr create_ sono: - `--base` main: Specifica il ramo di base del repository upstream in cui verranno unite le modifiche. - `--head` your-feature-branch: Indica il ramo principale del fork che contiene le modifiche. - `--title` "Your PR Title": Imposta il titolo della richiesta di pull. - `--body` "Description of your changes": Fornisce una descrizione dettagliata delle modifiche apportate alla richiesta di pull. + `--base` main: Specifica il ramo di base del repository upstream in cui verranno unite le modifiche. + `--head` your-feature-branch: Indica il ramo principale del fork che contiene le modifiche. + `--title` "Your PR Title": Imposta il titolo della richiesta di pull. + `--body` "Description of your changes": Fornisce una descrizione dettagliata delle modifiche apportate alla richiesta di pull. ## Conclusione diff --git a/docs/gemstones/git/fork_and_branch_workflow.uk.md b/docs/gemstones/git/fork_and_branch_workflow.uk.md index 63b02de2c9..4b65d64b8f 100644 --- a/docs/gemstones/git/fork_and_branch_workflow.uk.md +++ b/docs/gemstones/git/fork_and_branch_workflow.uk.md @@ -29,70 +29,70 @@ tags: 1. Якщо вона ще не існує, створіть гілку проекту за допомогою утиліти gh. Впишіть: - ```bash - gh repo fork rocky-linux/documentation --clone=true --remote=true - ``` + ```bash + gh repo fork rocky-linux/documentation --clone=true --remote=true + ``` - У цій команді _gh repo fork_ використовуються такі параметри: + У цій команді _gh repo fork_ використовуються такі параметри: - - `--clone=true`: Клонує розгалужене сховище на вашу локальну машину. - - `--remote=true`: Додає вихідний репозиторій як віддалений, що дозволяє синхронізувати майбутні оновлення. + - `--clone=true`: Клонує розгалужене сховище на вашу локальну машину. + - `--remote=true`: Додає вихідний репозиторій як віддалений, що дозволяє синхронізувати майбутні оновлення. 2. Перейдіть до каталогу локального сховища. Впишіть: - ```bash - cd documentation - ``` + ```bash + cd documentation + ``` 3. Переконайтеся, що всі відповідні віддалені сховища правильно налаштовано у вашому локальному сховищі, введіть: - ```bash - git remote -vv - ``` + ```bash + git remote -vv + ``` 4. Отримайте останні зміни з дистанційного керування: - ```bash - git fetch upstream - ``` + ```bash + git fetch upstream + ``` 5. Створіть і перевірте нову гілку функції під назвою your-feature-branch: - ```bash - git checkout -b your-feature-branch - ``` + ```bash + git checkout -b your-feature-branch + ``` 6. Внесіть зміни, додайте нові файли та зафіксуйте свої зміни у своєму локальному репозиторії: - ```bash - git add . - git commit -m "Your commit message" - ``` + ```bash + git add . + git commit -m "Your commit message" + ``` 7. Синхронізуйте з головною гілкою віддаленого сховища під назвою `upstream`: - ```bash - git pull upstream main - ``` + ```bash + git pull upstream main + ``` 8. Надішліть зміни до своєї гілки: - ```bash - git push origin your-feature-branch - ``` + ```bash + git push origin your-feature-branch + ``` 9. Нарешті, створіть запит на вилучення (PR) за допомогою програми `gh` CLI: - ```bash - gh pr create --base main --head your-feature-branch --title "Your PR Title" --body "Description of your changes" - ``` + ```bash + gh pr create --base main --head your-feature-branch --title "Your PR Title" --body "Description of your changes" + ``` - У цій команді _gh pr create_ використовуються такі параметри: + У цій команді _gh pr create_ використовуються такі параметри: - `--base` main: Визначає базову гілку у вихідному сховищі, куди буде об’єднано зміни. - `--head` your-feature-branch: Вказує на головну гілку вашого форка, яка містить зміни. - `--title` "Your PR Title": Встановлює назву для запиту. - `--body` "Description of your changes": Надає детальний опис змін у запиті. + `--base` main: Визначає базову гілку у вихідному сховищі, куди буде об’єднано зміни. + `--head` your-feature-branch: Вказує на головну гілку вашого форка, яка містить зміни. + `--title` "Your PR Title": Встановлює назву для запиту. + `--body` "Description of your changes": Надає детальний опис змін у запиті. ## Висновок diff --git a/docs/gemstones/git/git_pull_vs_git_fetch.it.md b/docs/gemstones/git/git_pull_vs_git_fetch.it.md index 53476a9d7e..14982bd047 100644 --- a/docs/gemstones/git/git_pull_vs_git_fetch.it.md +++ b/docs/gemstones/git/git_pull_vs_git_fetch.it.md @@ -22,21 +22,21 @@ Vedere cosa hanno fatto gli altri senza unire le modifiche nel proprio ramo loca 1. Elencare il ramo attualmente controllato - ```bash - git branch - ``` + ```bash + git branch + ``` 2. Recupera le modifiche dal ramo principale di un repo remoto chiamato origin. Digitare: - ```bash - git fetch origin main - ``` + ```bash + git fetch origin main + ``` 3. Confrontare le modifiche tra l'HEAD del repo locale e il repo remoto origin/main. - ```bash - git log HEAD..origin/main - ``` + ```bash + git log HEAD..origin/main + ``` ### Git Pull @@ -45,15 +45,15 @@ Git Pull scarica le modifiche e le unisce al ramo corrente. 1. **Modifiche di Pull e Merge**: - ```bash - git pull origin main - ``` + ```bash + git pull origin main + ``` 2. **Rivedere le modifiche unite**: - ```bash - git log - ``` + ```bash + git log + ``` ## Note Aggiuntive diff --git a/docs/gemstones/git/git_pull_vs_git_fetch.uk.md b/docs/gemstones/git/git_pull_vs_git_fetch.uk.md index 2ef4e28354..26d11f6d55 100644 --- a/docs/gemstones/git/git_pull_vs_git_fetch.uk.md +++ b/docs/gemstones/git/git_pull_vs_git_fetch.uk.md @@ -22,21 +22,21 @@ git fetch завантажує зміни з віддаленого сховищ 1. Перелічіть поточну перевірену гілку - ```bash - git branch - ``` + ```bash + git branch + ``` 2. Отримайте зміни з головної гілки віддаленого репо з іменем origin. Впишіть: - ```bash - git fetch origin main - ``` + ```bash + git fetch origin main + ``` 3. Порівняйте зміни між HEAD вашого локального репо та віддаленим вихідним/основним репо. - ```bash - git log HEAD..origin/main - ``` + ```bash + git log HEAD..origin/main + ``` ### Git Pull @@ -45,15 +45,15 @@ Git Pull завантажує зміни та об’єднує їх у вашу 1. **Витягнути та об’єднати зміни**: - ```bash - git pull origin main - ``` + ```bash + git pull origin main + ``` 2. **Перегляньте об’єднані зміни**: - ```bash - git log - ``` + ```bash + git log + ``` ## Додаткові примітки diff --git a/docs/gemstones/git/git_remote_add.it.md b/docs/gemstones/git/git_remote_add.it.md index 908913717e..c5d9a57844 100644 --- a/docs/gemstones/git/git_remote_add.it.md +++ b/docs/gemstones/git/git_remote_add.it.md @@ -23,46 +23,46 @@ Utilizzeremo il repository del progetto di documentazione Rocky Linux come esemp ## Procedura 1. Aprite un terminale e cambiate la vostra directory di lavoro nella cartella contenente il clone locale del progetto. - Per esempio, se si è clonato il repo github in ~/path/to/your/rl-documentation-clone, digitare + Per esempio, se si è clonato il repo github in ~/path/to/your/rl-documentation-clone, digitare - ```bash - cd ~/path/to/your/rl-documentation-clone - ``` + ```bash + cd ~/path/to/your/rl-documentation-clone + ``` 2. Prima di apportare qualsiasi modifica, elencare i remotes configurati. Digitare: - ```bash - git remote -vv - ``` + ```bash + git remote -vv + ``` - Se si tratta di un repo appena clonato, è probabile che nell'output si veda un solo remote chiamato `origin`. + Se si tratta di un repo appena clonato, è probabile che nell'output si veda un solo remote chiamato `origin`. 3. Aggiungere il Rocky Linux Documentation Repository (`https://github.com/rocky-linux/documentation.git`) come nuovo remote al proprio repository locale. Qui assegneremo upstream come nome per questo particolare remote. Digitare: - ```bash - git remote add upstream https://github.com/rocky-linux/documentation.git - ``` + ```bash + git remote add upstream https://github.com/rocky-linux/documentation.git + ``` 4. Per sottolineare ulteriormente che i nomi assegnati ai repository remoti sono arbitrari, creare un altro remoto chiamato rocky-docs che punta allo stesso repo eseguendo: - ```bash - git remote add rocky-docs https://github.com/rocky-linux/documentation.git - ``` + ```bash + git remote add rocky-docs https://github.com/rocky-linux/documentation.git + ``` 5. Confermare che il nuovo repository remoto è stato aggiunto con successo: - ```bash - git remote -v - ``` + ```bash + git remote -v + ``` - Si dovrebbe vedere `upstream` elencato insieme al suo URL. + Si dovrebbe vedere `upstream` elencato insieme al suo URL. 6. Opzionalmente, prima di iniziare ad apportare modifiche al repo locale, è possibile recuperare i dati dal nuovo remote aggiunto. - Recuperare i rami e i commit del nuovo remoto eseguendo: + Recuperare i rami e i commit del nuovo remoto eseguendo: - ```bash - git fetch upstream - ``` + ```bash + git fetch upstream + ``` ## Note Aggiuntive diff --git a/docs/gemstones/git/git_remote_add.uk.md b/docs/gemstones/git/git_remote_add.uk.md index 1448218a98..586f075bb2 100644 --- a/docs/gemstones/git/git_remote_add.uk.md +++ b/docs/gemstones/git/git_remote_add.uk.md @@ -23,46 +23,46 @@ tags: ## Процедура 1. Відкрийте термінал і змініть свій робочий каталог на папку, що містить ваш локальний клон проекту. - Наприклад, якщо ви клонували репозиторій github до ~/path/to/your/rl-documentation-clone, введіть + Наприклад, якщо ви клонували репозиторій github до ~/path/to/your/rl-documentation-clone, введіть - ```bash - cd ~/path/to/your/rl-documentation-clone - ``` + ```bash + cd ~/path/to/your/rl-documentation-clone + ``` 2. Перш ніж вносити будь-які зміни, перелічіть дистанційне керування, які ви зараз налаштували. Впишіть: - ```bash - git remote -vv - ``` + ```bash + git remote -vv + ``` - Якщо це щойно клоноване репо, ви, ймовірно, побачите у своїх виводах єдиний віддалений файл під назвою `origin`. + Якщо це щойно клоноване репо, ви, ймовірно, побачите у своїх виводах єдиний віддалений файл під назвою `origin`. 3. Додайте сховище документації Rocky Linux (`https://github.com/rocky-linux/documentation.git`) як новий віддалений пристрій до вашого локального сховища. Тут ми призначимо upstream як назву для цього конкретного пульта. Впишіть: - ```bash - git remote add upstream https://github.com/rocky-linux/documentation.git - ``` + ```bash + git remote add upstream https://github.com/rocky-linux/documentation.git + ``` 4. Щоб ще більше підкреслити, що імена, призначені віддаленим сховищам, є довільними, створіть ще один віддалений іменований rocky-docs, який вказує на те саме репо, виконавши: - ```bash - git remote add rocky-docs https://github.com/rocky-linux/documentation.git - ``` + ```bash + git remote add rocky-docs https://github.com/rocky-linux/documentation.git + ``` 5. Переконайтеся, що нове віддалене сховище успішно додано: - ```bash - git remote -v - ``` + ```bash + git remote -v + ``` - Ви повинні побачити `upstream` у списку разом із його URL-адресою. + Ви повинні побачити `upstream` у списку разом із його URL-адресою. 6. За бажанням, перш ніж почати вносити будь-які зміни у своє локальне сховище, ви можете отримати дані з нещодавно доданого віддаленого пристрою. - Отримайте гілки та коміти з нещодавно доданого віддаленого, виконавши: + Отримайте гілки та коміти з нещодавно доданого віддаленого, виконавши: - ```bash - git fetch upstream - ``` + ```bash + git fetch upstream + ``` ## Додаткові примітки diff --git a/docs/gemstones/git/tracking_and_nontracking_branch.it.md b/docs/gemstones/git/tracking_and_nontracking_branch.it.md index c9cbbd8338..1c55cd2f4d 100644 --- a/docs/gemstones/git/tracking_and_nontracking_branch.it.md +++ b/docs/gemstones/git/tracking_and_nontracking_branch.it.md @@ -19,17 +19,17 @@ Un ramo di monitoraggio è un ramo collegato a un ramo remoto. 1. Creare un nuovo ramo chiamato my-local-branch. Il nuovo ramo locale segue il ramo principale del repository remoto chiamato origin. Digitare: - ```bash - git checkout -b my-local-branch origin/main - ``` + ```bash + git checkout -b my-local-branch origin/main + ``` 2. Usare il comando `git branch -vv` per verificare che il ramo sia un ramo di tracciamento. Digitare: - ```bash - git branch -vv - ``` + ```bash + git branch -vv + ``` - Cercare i rami con `[origin/main]` che indicano che stanno seguendo `origin/main`. + Cercare i rami con `[origin/main]` che indicano che stanno seguendo `origin/main`. ## Non-Tracking Branch @@ -37,9 +37,9 @@ Un ramo non tracciante è un ramo che opera indipendentemente dai rami remoti. 1. Creare un nuovo ramo locale non tracciante chiamato my-feature-branch. Digitare: - ```bash - git checkout -b my-feature-branch - ``` + ```bash + git checkout -b my-feature-branch + ``` 2. I rami non tracciati non mostreranno un ramo remoto accanto a loro output di git branch -vv. Controlla se my-feature-branch è un ramo non di tracciamento. @@ -47,26 +47,26 @@ Un ramo non tracciante è un ramo che opera indipendentemente dai rami remoti. 1. Facoltativamente, assicurarsi prima che le ultime modifiche del ramo principale siano unite nel ramo di destinazione. Digitare: - ```bash - git checkout my-feature-branch - git merge main - ``` + ```bash + git checkout my-feature-branch + git merge main + ``` 2. Impostare il monitoraggio di una ramo remoto: - ```bash - git branch --set-upstream-to=origin/main my-feature-branch - ``` + ```bash + git branch --set-upstream-to=origin/main my-feature-branch + ``` - Output: `Branch 'my-feature-branch' set up to track remote branch 'main' from 'origin'.` + Output: `Branch 'my-feature-branch' set up to track remote branch 'main' from 'origin'.` 3. Visualizzare le modifiche. Digitare: - ```bash - git branch -vv - ``` + ```bash + git branch -vv + ``` - Ora, `my-feature-branch` dovrebbe mostrare `[origin/main]`, indicando che è in fase di tracciamento. + Ora, `my-feature-branch` dovrebbe mostrare `[origin/main]`, indicando che è in fase di tracciamento. ## Conclusione diff --git a/docs/gemstones/git/tracking_and_nontracking_branch.uk.md b/docs/gemstones/git/tracking_and_nontracking_branch.uk.md index 7bcad4ad81..b8595fb73f 100644 --- a/docs/gemstones/git/tracking_and_nontracking_branch.uk.md +++ b/docs/gemstones/git/tracking_and_nontracking_branch.uk.md @@ -19,17 +19,17 @@ tags: 1. Створіть нову гілку під назвою my-local-branch. Зробіть так, щоб нова локальна гілка відстежувала основну гілку віддаленого сховища з назвою origin. Впишіть: - ```bash - git checkout -b my-local-branch origin/main - ``` + ```bash + git checkout -b my-local-branch origin/main + ``` 2. Використовуйте команду `git branch -vv`, щоб переконатися, що гілка є гілкою відстеження. Впишіть: - ```bash - git branch -vv - ``` + ```bash + git branch -vv + ``` - Шукайте гілки з `[origin/main]`, що вказує, що вони відстежують `origin/main`. + Шукайте гілки з `[origin/main]`, що вказує, що вони відстежують `origin/main`. ## Non-Tracking Branch @@ -37,9 +37,9 @@ tags: 1. Створіть нову локальну гілку без відстеження під назвою my-feature-branch. Впишіть: - ```bash - git checkout -b my-feature-branch - ``` + ```bash + git checkout -b my-feature-branch + ``` 2. Гілки без відстеження не відображатимуть віддалену гілку поруч із ними у виводі git branch -vv. Перевірте, чи my-feature-branch є гілкою без відстеження. @@ -47,26 +47,26 @@ tags: 1. За бажанням, спочатку переконайтеся, що останні зміни з основної гілки об’єднано в цільову гілку. Впишіть: - ```bash - git checkout my-feature-branch - git merge main - ``` + ```bash + git checkout my-feature-branch + git merge main + ``` 2. Налаштувати відстеження до віддаленого відділення: - ```bash - git branch --set-upstream-to=origin/main my-feature-branch - ``` + ```bash + git branch --set-upstream-to=origin/main my-feature-branch + ``` - Вихід: \`Гілка 'my-feature-branch' налаштована для відстеження віддаленої гілки 'main' від 'origin'.' + Вихід: \`Гілка 'my-feature-branch' налаштована для відстеження віддаленої гілки 'main' від 'origin'.' 3. Перевірте зміну. Впишіть: - ```bash - git branch -vv - ``` + ```bash + git branch -vv + ``` - Тепер `my-feature-branch` має показувати `[origin/main]`, що вказує на відстеження. + Тепер `my-feature-branch` має показувати `[origin/main]`, що вказує на відстеження. ## Висновок diff --git a/docs/gemstones/network/RL9_network_manager.it.md b/docs/gemstones/network/RL9_network_manager.it.md index 48951fbe3f..0cf51a76a7 100644 --- a/docs/gemstones/network/RL9_network_manager.it.md +++ b/docs/gemstones/network/RL9_network_manager.it.md @@ -49,7 +49,7 @@ Shell > cd /etc/NetworkManager/system-connections/ && ls ens160.nmconnection ``` -`Ens160` si riferisce al nome della scheda di rete del sistema. Vi chiederete perché il nome sembra così strano? Questo è dovuto al gestore di dispositivi `udev`. Supporta diversi schemi di denominazione. Per impostazione predefinita, i nomi fissi vengono assegnati in base al firmware, alla topologia e alle informazioni sulla posizione. I suoi vantaggi includono: +`ens160` si riferisce al nome della scheda di rete del sistema. Vi chiederete perché il nome sembra così strano? Questo è dovuto al gestore di dispositivi `udev`. Supporta diversi schemi di denominazione. Per impostazione predefinita, i nomi fissi vengono assegnati in base al firmware, alla topologia e alle informazioni sulla posizione. I suoi vantaggi includono: - I nomi dei dispositivi sono completamente prevedibili. - I nomi dei dispositivi rimangono fissi anche se si aggiunge o si rimuove hardware, perché non avviene una nuova enumerazione. diff --git a/docs/gemstones/network/iftop.de.md b/docs/gemstones/network/iftop.de.md index c5583bfcc8..a7dbc38471 100644 --- a/docs/gemstones/network/iftop.de.md +++ b/docs/gemstones/network/iftop.de.md @@ -83,21 +83,21 @@ TOTAL: 60.5MB 242Mb 242Mb 242Mb 242Mb Aufschlüsselung der Zeilen im unteren Bereich: -- TX – Datennutzung beim Senden/Hochladen -- RX - Datennutzung empfangen/herunterladen -- TOTAL – Kombinierte Upload-/Download-Nutzung + - TX – Datennutzung beim Senden/Hochladen + - RX - Datennutzung empfangen/herunterladen + - TOTAL – Kombinierte Upload-/Download-Nutzung ## Tastaturkürzel -- \++s++ - aggregiert den gesamten Datenverkehr für jede Quelle -- \++d++ - aggregiert den gesamten Datenverkehr für jedes Ziel -- \++shift+s++ - schaltet die Anzeige des Quellports um -- \++shift+d++ - schaltet die Anzeige des Zielports um -- \++t++ - schaltet zwischen den Anzeigemodi um: Standardmäßige zweizeilige Anzeige mit Sende- und Empfangsverkehr und dreizeilige Anzeige von Sende-, Empfangs- und Gesamt-Traffic -- \++1++, ++2++, ++3++ – Sortieren nach 1., 2. oder 3. Spalte -- \++l++ - geben Sie einen POSIX-regulären Ausdruck ein, um Hostnamen zu filtern -- \++shift+p++ - Pausiert die aktuelle Anzeige -- \++o++ - friert die Gesamtbandbreiten-Auswertung ein -- \++j++ - nach unten scrollen -- \++k++ - nach oben scrollen -- \++f++ – bearbeitet den Filtercode + - \++s++ - aggregiert den gesamten Datenverkehr für jede Quelle + - \++d++ - aggregiert den gesamten Datenverkehr für jedes Ziel + - \++shift+s++ - schaltet die Anzeige des Quellports um + - \++shift+d++ - schaltet die Anzeige des Zielports um + - \++t++ - schaltet zwischen den Anzeigemodi um: Standardmäßige zweizeilige Anzeige mit Sende- und Empfangsverkehr und dreizeilige Anzeige von Sende-, Empfangs- und Gesamt-Traffic + - \++1++, ++2++, ++3++ – Sortieren nach 1., 2. oder 3. Spalte + - \++l++ - geben Sie einen POSIX-regulären Ausdruck ein, um Hostnamen zu filtern + - \++shift+p++ - Pausiert die aktuelle Anzeige + - \++o++ - friert die Gesamtbandbreiten-Auswertung ein + - \++j++ - nach unten scrollen + - \++k++ - nach oben scrollen + - \++f++ – bearbeitet den Filtercode diff --git a/docs/gemstones/network/iftop.fr.md b/docs/gemstones/network/iftop.fr.md index 78fe26c2e7..dede4a240c 100644 --- a/docs/gemstones/network/iftop.fr.md +++ b/docs/gemstones/network/iftop.fr.md @@ -83,21 +83,21 @@ TOTAL: 60.5MB 242Mb 242Mb 242Mb 242Mb Analyse des lignes du volet inférieur : -- TX - Utilisation des données de transmission/téléchargement -- RX - Utilisation des données de réception/téléchargement -- TOTAL - Quantité totale de téléchargement/téléchargement + - TX - Utilisation des données de transmission/téléchargement + - RX - Utilisation des données de réception/téléchargement + - TOTAL - Quantité totale de téléchargement/téléchargement ## Racourcis de clavier -- \++s++ - regroupe tout le trafic pour chaque source -- \++d++ - regroupe tout le trafic pour chaque destination -- \++shift+s++ - bascule vers l'affichage du port source -- \++shift+d++ - bascule vers l'affichage du port de destination -- \++t++ - bascule entre les modes d'affichage : affichage par défaut sur deux lignes avec le trafic d'envoi et de réception et affichage sur trois lignes du trafic d'envoi, de réception et total -- \++1++, ++2++, ++3++ - trier par 1ère, 2ème ou 3ème colonne -- \++l++ - entre une expression régulière POSIX pour filtrer les noms d'hôtes -- \++shift+p++ - met en pause l'affichage actuel -- \++o++ - gèle le comptage total de bande passante -- \++j++ - déroulement vers le bas -- \++k++ - déroulement vers le haut -- \++f++ - édite le code du filtre + - \++s++ - regroupe tout le trafic pour chaque source + - \++d++ - regroupe tout le trafic pour chaque destination + - \++shift+s++ - bascule vers l'affichage du port source + - \++shift+d++ - bascule vers l'affichage du port de destination + - \++t++ - bascule entre les modes d'affichage : affichage par défaut sur deux lignes avec le trafic d'envoi et de réception et affichage sur trois lignes du trafic d'envoi, de réception et total + - \++1++, ++2++, ++3++ - trier par 1ère, 2ème ou 3ème colonne + - \++l++ - entre une expression régulière POSIX pour filtrer les noms d'hôtes + - \++shift+p++ - met en pause l'affichage actuel + - \++o++ - gèle le comptage total de bande passante + - \++j++ - déroulement vers le bas + - \++k++ - déroulement vers le haut + - \++f++ - édite le code du filtre diff --git a/docs/gemstones/network/iftop.it.md b/docs/gemstones/network/iftop.it.md index 60b36b57b8..55aa3b61ed 100644 --- a/docs/gemstones/network/iftop.it.md +++ b/docs/gemstones/network/iftop.it.md @@ -83,21 +83,21 @@ TOTAL: 60.5MB 242Mb 242Mb 242Mb 242Mb Sezionando le righe finali del pannello: -- TX - Utilizzo dei dati di trasmissione/caricamento -- RX - Utilizzo dei dati di ricezione/download -- TOTAL - Utilizzo combinato di upload/download + - TX - Utilizzo dei dati di trasmissione/caricamento + - RX - Utilizzo dei dati di ricezione/download + - TOTAL - Utilizzo combinato di upload/download ## Tasti di scelta rapida per l'interazione -- \++s++ - aggrega tutto il traffico per ogni origine -- \++d++ - aggrega tutto il traffico per ogni destinazione -- \++shift+s++ - attiva/disattiva la visualizzazione della porta di origine -- \++shift+d++ - attiva/disattiva la visualizzazione della porta di destinazione -- \++t++ - passa da una modalità di visualizzazione all'altra: visualizzazione predefinita a due righe con traffico in invio e in ricezione e visualizzazione a tre righe con traffico in invio, in ricezione e totale -- \++1++, ++2++, ++3++ - ordina per prima, seconda o terza colonna -- \++l++ - inserisce un'espressione regolare POSIX per filtrare i nomi di host -- \++shift+p++ - mette in pausa la visualizzazione corrente -- \++o++ - blocca il conteggio della larghezza di banda totale -- \++j++ - scorre verso il basso -- \++k++ - scorre verso l'alto -- \++f++ - modifica il codice del filtro + - \++s++ - aggrega tutto il traffico per ogni origine + - \++d++ - aggrega tutto il traffico per ogni destinazione + - \++shift+s++ - attiva/disattiva la visualizzazione della porta di origine + - \++shift+d++ - attiva/disattiva la visualizzazione della porta di destinazione + - \++t++ - passa da una modalità di visualizzazione all'altra: visualizzazione predefinita a due righe con traffico in invio e in ricezione e visualizzazione a tre righe con traffico in invio, in ricezione e totale + - \++1++, ++2++, ++3++ - ordina per prima, seconda o terza colonna + - \++l++ - inserisce un'espressione regolare POSIX per filtrare i nomi di host + - \++shift+p++ - mette in pausa la visualizzazione corrente + - \++o++ - blocca il conteggio della larghezza di banda totale + - \++j++ - scorre verso il basso + - \++k++ - scorre verso l'alto + - \++f++ - modifica il codice del filtro diff --git a/docs/gemstones/network/iftop.uk.md b/docs/gemstones/network/iftop.uk.md index cd7aebb528..f07c25d4d8 100644 --- a/docs/gemstones/network/iftop.uk.md +++ b/docs/gemstones/network/iftop.uk.md @@ -83,21 +83,21 @@ TOTAL: 60.5MB 242Mb 242Mb 242Mb 242Mb Порушення рядків нижньої панелі: -- TX - Використання даних для передачі/завантаження -- RX - Використання даних для отримання/завантаження -- TOTAL - Комбіноване використання завантаження/завантаження + - TX - Використання даних для передачі/завантаження + - RX - Використання даних для отримання/завантаження + - TOTAL - Комбіноване використання завантаження/завантаження ## Комбінації клавіш для взаємодії -- \++s++ - агрегує весь трафік для кожного джерела -- \++d++ - агрегує весь трафік для кожного пункту призначення -- \++shift+s++ - перемикає відображення вихідного порту -- \++shift+d++ - перемикає відображення порту призначення -- \++t++ - перемикається між режимами відображення: дворядковий дисплей за замовчуванням із трафіком надсилання та отримання та трирядковий дисплей надсилання, отримання та загального трафіку -- \++1++, ++2++, ++3++ - сортує за 1-м, 2-м або 3-м стовпцем -- \++l++ - вводить регулярний вираз POSIX для фільтрації імен хостів -- \++shift+p++ - призупиняє поточний дисплей -- \++o++ - заморожує загальну кількість пропускної здатності -- \++j++ - прокручується вниз -- \++k++ - прокручується вгору -- \++f++ - редагує код фільтра + - \++s++ - агрегує весь трафік для кожного джерела + - \++d++ - агрегує весь трафік для кожного пункту призначення + - \++shift+s++ - перемикає відображення вихідного порту + - \++shift+d++ - перемикає відображення порту призначення + - \++t++ - перемикається між режимами відображення: дворядковий дисплей за замовчуванням із трафіком надсилання та отримання та трирядковий дисплей надсилання, отримання та загального трафіку + - \++1++, ++2++, ++3++ - сортує за 1-м, 2-м або 3-м стовпцем + - \++l++ - вводить регулярний вираз POSIX для фільтрації імен хостів + - \++shift+p++ - призупиняє поточний дисплей + - \++o++ - заморожує загальну кількість пропускної здатності + - \++j++ - прокручується вниз + - \++k++ - прокручується вгору + - \++f++ - редагує код фільтра diff --git a/docs/gemstones/network/nload.de.md b/docs/gemstones/network/nload.de.md index 84ff6e7239..30062902f3 100644 --- a/docs/gemstones/network/nload.de.md +++ b/docs/gemstones/network/nload.de.md @@ -70,17 +70,17 @@ Outgoing: Aufschlüsselung der obigen Zeilen: -- Curr - aktuell gemessene Bandbreitennutzung -- Avg – durchschnittliche Bandbreitennutzung im Zeitraum -- Min - minimale gemessene Bandbreitennutzung -- Max – maximal gemessene Bandbreitennutzung -- Ttl – in der `nload`-Sitzung übertragene Daten + - Curr - aktuell gemessene Bandbreitennutzung + - Avg – durchschnittliche Bandbreitennutzung im Zeitraum + - Min - minimale gemessene Bandbreitennutzung + - Max – maximal gemessene Bandbreitennutzung + - Ttl – in der `nload`-Sitzung übertragene Daten ## Tastaturkürzel -- \++page-down++, ++down++ – Eine Schnittstelle nach unten gehen -- \++page-up++, ++up++ – Eine Schnittstelle nach oben gehen -- \++f2++ – Zeigt das Optionsfenster an -- \++f5++ - Optionen speichern -- \++f6++ – Einstellungen aus der Konfigurationsdatei neu laden -- \++q++, ++Strg+C++ – `nload` beenden + - \++page-down++, ++down++ – Eine Schnittstelle nach unten gehen + - \++page-up++, ++up++ – Eine Schnittstelle nach oben gehen + - \++f2++ – Zeigt das Optionsfenster an + - \++f5++ - Optionen speichern + - \++f6++ – Einstellungen aus der Konfigurationsdatei neu laden + - \++q++, ++Strg+C++ – `nload` beenden diff --git a/docs/gemstones/network/nload.fr.md b/docs/gemstones/network/nload.fr.md index 1630b24360..345c05f1d5 100644 --- a/docs/gemstones/network/nload.fr.md +++ b/docs/gemstones/network/nload.fr.md @@ -70,17 +70,17 @@ Outgoing: Décorticage des lignes ci-dessus : -- Curr – utilisation actuelle de la bande passante -- Avg - utilisation moyenne de la bande passante au cours d'une période donnée -- Min - utilisation minimale de la bande passante mesurée -- Max - utilisation maximale de la bande passante mesurée -- Ttl - données transférées lors de la session `nload` + - Curr – utilisation actuelle de la bande passante + - Avg - utilisation moyenne de la bande passante au cours d'une période donnée + - Min - utilisation minimale de la bande passante mesurée + - Max - utilisation maximale de la bande passante mesurée + - Ttl - données transférées lors de la session `nload` ## Racourcis de clavier -- \++page-down++, ++down++ – Descendre d'une interface -- \++page-up++, ++up++ – Remonter d'une interface -- \++f2++ - Affiche la fenêtre des options -- \++f5++ - Enregistrer les options -- \++f6++ – Recharger les paramètres à partir du fichier de configuration -- \++q++, ++ctrl+c++ - Quitter `nload` + - \++page-down++, ++down++ – Descendre d'une interface + - \++page-up++, ++up++ – Remonter d'une interface + - \++f2++ - Affiche la fenêtre des options + - \++f5++ - Enregistrer les options + - \++f6++ – Recharger les paramètres à partir du fichier de configuration + - \++q++, ++ctrl+c++ - Quitter `nload` diff --git a/docs/gemstones/network/nload.it.md b/docs/gemstones/network/nload.it.md index 834c7b78b6..e6b76daef0 100644 --- a/docs/gemstones/network/nload.it.md +++ b/docs/gemstones/network/nload.it.md @@ -70,17 +70,17 @@ Outgoing: Scomponendo le righe precedenti: -- Curr - utilizzo attuale della larghezza di banda misurata -- Avg - utilizzo medio della larghezza di banda nel periodo -- Min - utilizzo minimo della larghezza di banda misurata -- Max - utilizzo massimo della larghezza di banda misurata -- Ttl - dati trasferiti nella sessione \`nload + - Curr - utilizzo attuale della larghezza di banda misurata + - Avg - utilizzo medio della larghezza di banda nel periodo + - Min - utilizzo minimo della larghezza di banda misurata + - Max - utilizzo massimo della larghezza di banda misurata + - Ttl - dati trasferiti nella sessione \`nload ## Tasti di scelta rapida per l'interazione -- \++page-down++, ++down++ - Scendere di un'interfaccia -- \++page-up++, ++up++ - Salire di un'interfaccia -- \++f2++ - Mostra la finestra delle opzioni -- \++f5++ - Salva le opzioni -- \++f6++ - Ricaricare le impostazioni dal file di configurazione -- \++q++, ++ctrl+c++ - Chiude `nload` + - \++page-down++, ++down++ - Scendere di un'interfaccia + - \++page-up++, ++up++ - Salire di un'interfaccia + - \++f2++ - Mostra la finestra delle opzioni + - \++f5++ - Salva le opzioni + - \++f6++ - Ricaricare le impostazioni dal file di configurazione + - \++q++, ++ctrl+c++ - Chiude `nload` diff --git a/docs/gemstones/network/nload.uk.md b/docs/gemstones/network/nload.uk.md index a059e48d95..a6b03189ee 100644 --- a/docs/gemstones/network/nload.uk.md +++ b/docs/gemstones/network/nload.uk.md @@ -70,17 +70,17 @@ Outgoing: Розбиття наведених вище рядків: -- Curr - використання поточної виміряної пропускної здатності -- Avg - середнє використання пропускної здатності за період -- Min - використання мінімальної виміряної пропускної здатності -- Max - використання максимальної виміряної пропускної здатності -- Ttl - дані, передані в сеансі `nload` + - Curr - використання поточної виміряної пропускної здатності + - Avg - середнє використання пропускної здатності за період + - Min - використання мінімальної виміряної пропускної здатності + - Max - використання максимальної виміряної пропускної здатності + - Ttl - дані, передані в сеансі `nload` ## Комбінації клавіш для взаємодії -- \++page-down++, ++down++ - Переходить вниз на один інтерфейс -- \++page-up++, ++up++ - Переходить вверх на один інтерфейс -- \++f2++ - Показує вікно параметрів -- \++f5++ - Зберігає параметри -- \++f6++ - Перезавантажує налаштування з конфігураційного файлу -- \++q++, ++ctrl+c++ - Закриває `nload` + - \++page-down++, ++down++ - Переходить вниз на один інтерфейс + - \++page-up++, ++up++ - Переходить вверх на один інтерфейс + - \++f2++ - Показує вікно параметрів + - \++f5++ - Зберігає параметри + - \++f6++ - Перезавантажує налаштування з конфігураційного файлу + - \++q++, ++ctrl+c++ - Закриває `nload` diff --git a/docs/gemstones/test_cpu_compat.de.md b/docs/gemstones/test_cpu_compat.de.md index 468417761f..e20576bbe6 100644 --- a/docs/gemstones/test_cpu_compat.de.md +++ b/docs/gemstones/test_cpu_compat.de.md @@ -18,18 +18,18 @@ Seit der Veröffentlichung von Rocky Linux 9 sind einige Installationen auf x86- 3. Nachdem der Startvorgang abgeschlossen ist, öffnen Sie ein Terminalfenster und führen Sie dieses Kommando aus: - ```bash - /lib64/ld-linux-x86-64.so.2 --help | grep x86-64 - ``` + ```bash + /lib64/ld-linux-x86-64.so.2 --help | grep x86-64 + ``` - Sie sollten eine Ausgabe erhalten, die etwa dieser ähnelt: + Sie sollten eine Ausgabe erhalten, die etwa dieser ähnelt: - ```bash - Usage: /lib64/ld-linux-x86-64.so.2 [OPTION]... EXECUTABLE-FILE [ARGS-FOR-PROGRAM...] - This program interpreter self-identifies as: /lib64/ld-linux-x86-64.so.2 - x86-64-v4 - x86-64-v3 - x86-64-v2 (supported, searched) - ``` + ```bash + Usage: /lib64/ld-linux-x86-64.so.2 [OPTION]... EXECUTABLE-FILE [ARGS-FOR-PROGRAM...] + This program interpreter self-identifies as: /lib64/ld-linux-x86-64.so.2 + x86-64-v4 + x86-64-v3 + x86-64-v2 (supported, searched) + ``` - Diese Ausgabe gibt die minimal erforderliche x86-64-Version (v2) an. In diesem Fall kann die Installation fortgesetzt werden. Wenn Sie neben `x86-64-v2` kein Eintrag (`supported, searched`) sehen, ist Ihre CPU nicht mit Rocky Linux 9.x kompatibel. Wenn der Test anzeigt, dass Ihre Installation fortgesetzt werden kann und x86-64-v3 (erforderlich für Rocky Linux 10) und x86-64-v4 auch als `(supported, searched)` aufgeführt werden, wird Ihre CPU für 9.x und zukünftige Versionen gut unterstützt. + Diese Ausgabe gibt die minimal erforderliche x86-64-Version (v2) an. In diesem Fall kann die Installation fortgesetzt werden. Wenn Sie neben `x86-64-v2` kein Eintrag (`supported, searched`) sehen, ist Ihre CPU nicht mit Rocky Linux 9.x kompatibel. Wenn der Test anzeigt, dass Ihre Installation fortgesetzt werden kann und x86-64-v3 (erforderlich für Rocky Linux 10) und x86-64-v4 auch als `(supported, searched)` aufgeführt werden, wird Ihre CPU für 9.x und zukünftige Versionen gut unterstützt. diff --git a/docs/gemstones/test_cpu_compat.fr.md b/docs/gemstones/test_cpu_compat.fr.md index 2d4435f98b..501ca3d27f 100644 --- a/docs/gemstones/test_cpu_compat.fr.md +++ b/docs/gemstones/test_cpu_compat.fr.md @@ -18,18 +18,18 @@ Depuis la sortie de Rocky Linux 9, certaines installations sur les plateformes x 3. Une fois le lancement terminé, ouvrez une fenêtre de terminal et procédez comme suit : - ```bash - /lib64/ld-linux-x86-64.so.2 --help | grep x86-64 - ``` + ```bash + /lib64/ld-linux-x86-64.so.2 --help | grep x86-64 + ``` - Vous devriez obtenir une sortie similaire à ceci : + Vous devriez obtenir une sortie similaire à ceci : - ```bash - Usage: /lib64/ld-linux-x86-64.so.2 [OPTION]... EXECUTABLE-FILE [ARGS-FOR-PROGRAM...] - This program interpreter self-identifies as: /lib64/ld-linux-x86-64.so.2 - x86-64-v4 - x86-64-v3 - x86-64-v2 (supported, searched) - ``` + ```bash + Usage: /lib64/ld-linux-x86-64.so.2 [OPTION]... EXECUTABLE-FILE [ARGS-FOR-PROGRAM...] + This program interpreter self-identifies as: /lib64/ld-linux-x86-64.so.2 + x86-64-v4 + x86-64-v3 + x86-64-v2 (supported, searched) + ``` - Cette sortie indique la version minimale x86-64 (v2) requise. Dans ce cas, l'installation peut continuer. S'il n'y a pas d'indication "(supported, searched)" à côté de l'entrée "x86-64-v2", cela signifie que votre processeur n'est **pas** compatible avec Rocky Linux 9.x. Si le test indique que votre installation peut continuer et qu'il répertorie également x86-64-v3 (requis pour Rocky Linux 10) et x86-64-v4 comme (`supported, searched`), votre CPU sera bien pris en charge pour 9.x et les versions suivantes. + Cette sortie indique la version minimale x86-64 (v2) requise. Dans ce cas, l'installation peut continuer. S'il n'y a pas d'indication "(supported, searched)" à côté de l'entrée "x86-64-v2", cela signifie que votre processeur n'est **pas** compatible avec Rocky Linux 9.x. Si le test indique que votre installation peut continuer et qu'il répertorie également x86-64-v3 (requis pour Rocky Linux 10) et x86-64-v4 comme (`supported, searched`), votre CPU sera bien pris en charge pour 9.x et les versions suivantes. diff --git a/docs/gemstones/test_cpu_compat.it.md b/docs/gemstones/test_cpu_compat.it.md index fd1d44feea..29d4c9b14b 100644 --- a/docs/gemstones/test_cpu_compat.it.md +++ b/docs/gemstones/test_cpu_compat.it.md @@ -18,18 +18,18 @@ Dal rilascio di Rocky Linux 9, alcune installazioni su piattaforme x86-64 sono f 3. Al termine dell'avvio, aprire una finestra del terminale ed eseguire questa operazione: - ```bash - /lib64/ld-linux-x86-64.so.2 --help | grep x86-64 - ``` + ```bash + /lib64/ld-linux-x86-64.so.2 --help | grep x86-64 + ``` - Si dovrebbe ottenere un risultato simile a questo: + Si dovrebbe ottenere un risultato simile a questo: - ```bash - Usage: /lib64/ld-linux-x86-64.so.2 [OPTION]... EXECUTABLE-FILE [ARGS-FOR-PROGRAM...] - This program interpreter self-identifies as: /lib64/ld-linux-x86-64.so.2 - x86-64-v4 - x86-64-v3 - x86-64-v2 (supported, searched) - ``` + ```bash + Usage: /lib64/ld-linux-x86-64.so.2 [OPTION]... EXECUTABLE-FILE [ARGS-FOR-PROGRAM...] + This program interpreter self-identifies as: /lib64/ld-linux-x86-64.so.2 + x86-64-v4 + x86-64-v3 + x86-64-v2 (supported, searched) + ``` - Questo output indica la versione minima richiesta per x86-64 (v2). In questo caso, l'installazione può continuare. Se accanto alla voce "x86-64-v2" non compare "(supported, searched)", allora la vostra CPU non è **compatibile** con Rocky Linux 9.x. Se il test indica che l'installazione può procedere e indica anche x86-64-v3 (richiesto per Rocky Linux 10) e x86-64-v4 come "(supported, searched)", la vostra CPU è ben supportata per 9.x e le versioni future. + Questo output indica la versione minima richiesta per x86-64 (v2). In questo caso, l'installazione può continuare. Se accanto alla voce "x86-64-v2" non compare "(supported, searched)", allora la vostra CPU non è **compatibile** con Rocky Linux 9.x. Se il test indica che l'installazione può procedere e indica anche x86-64-v3 (richiesto per Rocky Linux 10) e x86-64-v4 come "(supported, searched)", la vostra CPU è ben supportata per 9.x e le versioni future. diff --git a/docs/gemstones/test_cpu_compat.uk.md b/docs/gemstones/test_cpu_compat.uk.md index d6682240d4..db79425c85 100644 --- a/docs/gemstones/test_cpu_compat.uk.md +++ b/docs/gemstones/test_cpu_compat.uk.md @@ -18,18 +18,18 @@ tags: 3. Після завершення завантаження відкрийте вікно терміналу та виконайте цю процедуру: - ```bash - /lib64/ld-linux-x86-64.so.2 --help | grep x86-64 - ``` + ```bash + /lib64/ld-linux-x86-64.so.2 --help | grep x86-64 + ``` - Ви маєте отримати подібний результат: + Ви маєте отримати подібний результат: - ```bash - Usage: /lib64/ld-linux-x86-64.so.2 [OPTION]... EXECUTABLE-FILE [ARGS-FOR-PROGRAM...] - This program interpreter self-identifies as: /lib64/ld-linux-x86-64.so.2 - x86-64-v4 - x86-64-v3 - x86-64-v2 (supported, searched) - ``` + ```bash + Usage: /lib64/ld-linux-x86-64.so.2 [OPTION]... EXECUTABLE-FILE [ARGS-FOR-PROGRAM...] + This program interpreter self-identifies as: /lib64/ld-linux-x86-64.so.2 + x86-64-v4 + x86-64-v3 + x86-64-v2 (supported, searched) + ``` - Цей вихід вказує на мінімальну необхідну версію x86-64 (v2). У цьому випадку встановлення можна продовжити. Якщо біля запису «x86-64-v2» немає «(підтримується, шукається)», це означає, що ваш ЦП **не** сумісний із Rocky Linux 9.x. Якщо тест показує, що встановлення може продовжитися, а також відображає x86-64-v3 (обов'язкове для Rocky Linux 10) та x86-64-v4 як "(підтримується, знайдено)", ваш процесор добре підтримується для версії 9.x та наступних версій. + Цей вихід вказує на мінімальну необхідну версію x86-64 (v2). У цьому випадку встановлення можна продовжити. Якщо біля запису «x86-64-v2» немає «(підтримується, шукається)», це означає, що ваш ЦП **не** сумісний із Rocky Linux 9.x. Якщо тест показує, що встановлення може продовжитися, а також відображає x86-64-v3 (обов'язкове для Rocky Linux 10) та x86-64-v4 як "(підтримується, знайдено)", ваш процесор добре підтримується для версії 9.x та наступних версій. diff --git a/docs/guides/9_6_installation.it.md b/docs/guides/9_6_installation.it.md index 971b8d8422..e902237943 100644 --- a/docs/guides/9_6_installation.it.md +++ b/docs/guides/9_6_installation.it.md @@ -31,7 +31,9 @@ Per esempio, `Rocky-9.6-x86_64-minimal.iso` !!! Note + ``` Il sito web del Rocky Project elenca diversi mirror situati in tutto il mondo. Selezionate il mirror geograficamente più vicino a voi. L'elenco dei mirror ufficiali è disponibile [qui] (https://mirrors.rockylinux.org/mirrormanager/mirrors). + ``` ## Verifica del file ISO del programma di installazione @@ -41,21 +43,21 @@ Se avete scaricato le ISO di Rocky Linux su una distribuzione Linux esistente, p 2. Mentre ci si trova ancora nella cartella che contiene l'ISO di Rocky Linux scaricata, scaricare il file di checksum dell'ISO, digitare: - ```bash - wget -O CHECKSUM https://download.rockylinux.org/pub/rocky/9/isos/x86_64/CHECKSUM - ``` + ```bash + wget -O CHECKSUM https://download.rockylinux.org/pub/rocky/9/isos/x86_64/CHECKSUM + ``` 3. Utilizzare l'utilità `sha256sum` per verificare l'integrità del file ISO contro la corruzione o la manomissione. - ```bash - sha256sum -c CHECKSUM --ignore-missing - ``` + ```bash + sha256sum -c CHECKSUM --ignore-missing + ``` - Controllerà l'integrità del file ISO scaricato in precedenza, a condizione che si trovi nella stessa directory. Si dovrebbe vedere questo risultato: + Controllerà l'integrità del file ISO scaricato in precedenza, a condizione che si trovi nella stessa directory. Si dovrebbe vedere questo risultato: - ```text - Rocky-9.6-x86_64-minimal.iso: OK - ``` + ```text + Rocky-9.6-x86_64-minimal.iso: OK + ``` ## Installazione @@ -69,16 +71,16 @@ Se il computer è impostato per l'avvio dal supporto che contiene il file ISO, p 2. Dopo l'avvio del computer, viene visualizzata la schermata iniziale di benvenuto di Rocky Linux 9.6. - ![Rocky Linux installation splash screen](images/installation_9_6_F01.png) + ![Rocky Linux installation splash screen](images/installation_9_6_F01.png) 3. Se non si preme alcun tasto, il programma di installazione avvia un conto alla rovescia, al termine del quale il processo di installazione esegue automaticamente l'opzione predefinita, evidenziata: - `Test this media & install Rocky Linux 9.6` + `Test this media & install Rocky Linux 9.6` - È anche possibile premere ++enter++ in qualsiasi momento per avviare immediatamente il processo. + È anche possibile premere ++enter++ in qualsiasi momento per avviare immediatamente il processo. 4. Viene eseguita una rapida fase di verifica dei supporti.\ - Questa fase di verifica del supporto può evitare di avviare l'installazione per poi scoprire a metà strada che il programma di installazione deve essere interrotto a causa di un supporto di installazione difettoso. + Questa fase di verifica del supporto può evitare di avviare l'installazione per poi scoprire a metà strada che il programma di installazione deve essere interrotto a causa di un supporto di installazione difettoso. 5. Una volta completato il controllo del supporto e verificata la sua utilizzabilità, il programma di installazione passa automaticamente alla schermata successiva. @@ -90,10 +92,10 @@ La schermata `Installation Summary` è un'area completa in cui si prendono decis La schermata è suddivisa grossomodo nelle seguenti sezioni: -- _LOCALIZATION_ -- _SOFTWARE_ -- _SYSTEM_ -- _USER SETTINGS_ + - _LOCALIZATION_ + - _SOFTWARE_ + - _SYSTEM_ + - _USER SETTINGS_ Si approfondiranno ciascuna di queste sezioni, apportando le modifiche necessarie. @@ -133,14 +135,16 @@ Poiché l'installazione utilizza un'immagine ISO di Rocky Linux 9.6, si noterà !!! Tip + ``` L'area Source dell'installazione consente di eseguire un'installazione network-based (ad esempio, se si utilizza la ISO di avvio di Rocky Linux - Rocky-9.6-x86_64-boot.iso). Per un'installazione network-based, è necessario innanzitutto assicurarsi che una scheda di rete sul sistema di destinazione sia configurata correttamente e possa accedere a Internet. Per eseguire un'installazione network-based, fare clic su +++"Installation Source"++ e selezionare il pulsante di opzione ++"On the network"++. Una volta selezionato, scegliere il protocollo corretto e digitare l'URI dell'origine dell'installazione. Fare clic su ++"Done"++. + ``` #### Sezione Software Facendo clic sull'opzione ++"Software Selection"++ nella schermata principale _Installation Summary_ si accede alla sezione dell'installazione in cui è possibile selezionare gli esatti pacchetti software installati sul sistema. Esistono due aree di selezione del software: -- **Ambiente di base**: Installazione minima e sistema operativo personalizzato -- **Software aggiuntivo per l'ambiente selezionato**: La selezione di un ambiente di base sul lato sinistro presenta una serie di software aggiuntivi da installare per l'ambiente in questione sul lato destro. + - **Ambiente di base**: Installazione minima e sistema operativo personalizzato + - **Software aggiuntivo per l'ambiente selezionato**: La selezione di un ambiente di base sul lato sinistro presenta una serie di software aggiuntivi da installare per l'ambiente in questione sul lato destro. Selezionare l'opzione _Minimal Install_ (funzionalità di base). @@ -170,25 +174,31 @@ Il seguente importante compito della procedura di installazione, nell'area Siste !!! Note + ``` Dopo aver fatto clic sull'opzione ++"Network & Hostname"++ , tutti i dispositivi di interfaccia di rete correttamente rilevati (come schede di rete Ethernet, wireless, ecc.) saranno elencati nel riquadro sinistro della schermata di configurazione della rete. A seconda della configurazione hardware specifica, i dispositivi Ethernet in Linux hanno nomi simili a `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3` e così via. È possibile configurare ogni interfaccia utilizzando DHCP o impostando manualmente l'indirizzo IP. Se si sceglie di configurare manualmente, assicurarsi di avere pronte tutte le informazioni necessarie, come l'indirizzo IP, la netmask e altri dettagli rilevanti. + ``` Facendo clic sul pulsante ++"Network & Hostname"++ nella schermata principale _Installation Summary_ si apre la schermata di configurazione corrispondente. Tra le altre cose, è possibile configurare l'hostname del sistema. !!! Note + ``` È possibile modificare facilmente l'hostname del sistema in un secondo momento, dopo l'installazione del sistema operativo. + ``` La seguente importante operazione di configurazione riguarda le interfacce di rete del sistema. 1. Verificare che nel riquadro di sinistra sia elencata una scheda Ethernet (o qualsiasi altra scheda di rete) 2. Fare clic su uno qualsiasi dei dispositivi di rete rilevati nel riquadro di sinistra per selezionarlo.\ - Le proprietà configurabili dell'adattatore di rete selezionato appaiono nel riquadro destro della schermata. + Le proprietà configurabili dell'adattatore di rete selezionato appaiono nel riquadro destro della schermata. !!! Note + ``` Nel nostro sistema campione, abbiamo due dispositivi Ethernet (`ens3` e `ens4`), tutti in stato di connessione. Il tipo, il nome, la quantità e lo stato dei dispositivi di rete sul vostro sistema potrebbero essere diversi da quelli del nostro sistema demo. + ``` Verificare che l'interruttore del dispositivo che si desidera configurare sia in posizione `ON` (blu) nel riquadro di destra. In questa sezione verranno accettate tutte le impostazioni predefinite. @@ -197,7 +207,9 @@ Fare clic su ++"done "++ per tornare alla schermata principale _Installation Sum !!! Warning "Attenzione" + ``` Prestare attenzione all'indirizzo IP del server in questa sezione del programma di installazione. Supponiamo che non si disponga di un accesso fisico o facile alla console del sistema. In tal caso, queste informazioni saranno utili in seguito, quando sarà necessario collegarsi al server per continuare a lavorarci dopo il completamento dell'installazione del sistema operativo (OS). + ``` ### Sezione User Settings @@ -207,11 +219,11 @@ Utilizzare questa sezione per creare una password per l'account utente `root` e 1. Fare clic sul campo _Root Password_ in _User Settings_ per avviare la schermata dell'attività _Root Password_. - !!! Warning "Attenzione" + !!! Warning "Attenzione" - ``` - Il superutente root è l'account più privilegiato del sistema. Se si sceglie di utilizzarlo o abilitarlo, è necessario proteggere questo account con una password forte. - ``` + ``` + Il superutente root è l'account più privilegiato del sistema. Se si sceglie di utilizzarlo o abilitarlo, è necessario proteggere questo account con una password forte. + ``` 2. Nella casella di testo _Root Password_, impostare una password forte per l'utente root. @@ -224,30 +236,30 @@ Utilizzare questa sezione per creare una password per l'account utente `root` e Per creare l'utente: 1. Fare clic sul campo _User Creation_ in _User Settings_ per avviare la schermata dell'attività _Create User_.\ - Quest'area operativa consente di creare un account utente privilegiato (amministrativo) o non privilegiato (non amministrativo). + Quest'area operativa consente di creare un account utente privilegiato (amministrativo) o non privilegiato (non amministrativo). - !!! Info + !!! Info - ``` - La creazione e l'uso di un account non privilegiato per le attività quotidiane di un sistema è una pratica ottimale nell'amministrazione del sistema. - ``` + ``` + La creazione e l'uso di un account non privilegiato per le attività quotidiane di un sistema è una pratica ottimale nell'amministrazione del sistema. + ``` - Sarà creato un utente normale che può invocare i poteri di superutente (amministratore) quando necessario. + Sarà creato un utente normale che può invocare i poteri di superutente (amministratore) quando necessario. 2. Completate i campi della schermata _Create User_ con le seguenti informazioni: - **Full name**: - `rockstar` + `rockstar` - **Username**: - `rockstar` + `rockstar` - **Make this user administrator**: - Selezionato + Selezionato - **Require a password to use this account**: - Selezionato + Selezionato - **Password**: - `04302021` + `04302021` - **Confirm password**: - `04302021` + `04302021` 3. Fare clic su ++"done"++. @@ -264,7 +276,9 @@ Dopo l'avvio dell'installazione, vengono eseguite varie attività in background, !!! Note + ``` Se non si desidera continuare dopo aver fatto clic sul pulsante Inizia l'installazione, si può comunque uscire dall'installazione senza perdere i dati. Per uscire dal programma di installazione, è sufficiente resettare il sistema facendo clic sul pulsante Esci, premendo Ctrl-Alt-Canc sulla tastiera o premendo l'interruttore di reset o di alimentazione. + ``` ### Completare l'Installazione @@ -285,6 +299,6 @@ Per accedere al sistema: 2. Al prompt della password, digitate `04302021` (la password di Rockstar) e premete ++invio++ (la password non verrà riecheggiata sullo schermo, è normale). 3. Eseguire il comando `whoami` dopo il login.\ - Questo comando mostra il nome dell'utente attualmente collegato. + Questo comando mostra il nome dell'utente attualmente collegato. ![Login Screen](images/installation_9.0_F03.png) diff --git a/docs/guides/9_6_installation.uk.md b/docs/guides/9_6_installation.uk.md index 65ddbfb7c0..6bacff4ade 100644 --- a/docs/guides/9_6_installation.uk.md +++ b/docs/guides/9_6_installation.uk.md @@ -31,7 +31,9 @@ Rocky-.--.iso !!! Note "Примітка" + ``` На вебсайті Rocky Project перелічено кілька дзеркал, розташованих по всьому світу. Виберіть дзеркало, яке географічно найближче до вас. Список офіційних дзеркал можна знайти [тут](https://mirrors.rockylinux.org/mirrormanager/mirrors). + ``` ## Перевірка файлу ISO програми встановлення @@ -41,21 +43,21 @@ Rocky-.--.iso 2. Перебуваючи в папці, яка містить завантажений ISO Rocky Linux, завантажте файл контрольної суми для ISO, введіть: - ```bash - wget -O CHECKSUM https://download.rockylinux.org/pub/rocky/9/isos/x86_64/CHECKSUM - ``` + ```bash + wget -O CHECKSUM https://download.rockylinux.org/pub/rocky/9/isos/x86_64/CHECKSUM + ``` 3. Використовуйте утиліту `sha256sum` для перевірки цілісності ISO-файлу на предмет пошкодження або несанкціонованого втручання. - ```bash - sha256sum -c CHECKSUM --ignore-missing - ``` + ```bash + sha256sum -c CHECKSUM --ignore-missing + ``` - Це перевіряє цілісність файлу ISO, завантаженого раніше, за умови, що він знаходиться в тому самому каталозі. Ви повинні побачити цей вивід: + Це перевіряє цілісність файлу ISO, завантаженого раніше, за умови, що він знаходиться в тому самому каталозі. Ви повинні побачити цей вивід: - ```text - Rocky-9.6-x86_64-minimal.iso: OK - ``` + ```text + Rocky-9.6-x86_64-minimal.iso: OK + ``` ## Встановлення @@ -69,16 +71,16 @@ Rocky-.--.iso 2. Після завантаження комп'ютера ви побачите вітальний екран Rocky Linux 9.6. - ![Rocky Linux installation splash screen](images/installation_9_6_F01.png) + ![Rocky Linux installation splash screen](images/installation_9_6_F01.png) 3. Якщо ви не натиснете жодної клавіші, програма встановлення почне зворотний відлік, після чого процес встановлення автоматично виконає виділений параметр за замовчуванням: - `Test this media & install Rocky Linux 9.6` + `Test this media & install Rocky Linux 9.6` - Ви також можете будь-коли натиснути ++enter++, щоб негайно розпочати процес. + Ви також можете будь-коли натиснути ++enter++, щоб негайно розпочати процес. 4. Відбувається швидка перевірка медіа.\ - Цей крок перевірки носія може позбавити вас клопоту з початком інсталяції, після якого ви виявляєте, що програма інсталяції має бути зупинена через несправний інсталяційний носій. + Цей крок перевірки носія може позбавити вас клопоту з початком інсталяції, після якого ви виявляєте, що програма інсталяції має бути зупинена через несправний інсталяційний носій. 5. Після завершення перевірки носія та його придатності до використання програма встановлення автоматично переходить до наступного екрана. @@ -90,10 +92,10 @@ Rocky-.--.iso Екран приблизно поділено на такі частини: -- _LOCALIZATION_ -- _SOFTWARE_ -- _SYSTEM_ -- _USER SETTINGS_ + - _LOCALIZATION_ + - _SOFTWARE_ + - _SYSTEM_ + - _USER SETTINGS_ Далі ми розглянемо кожен із цих розділів і внесемо необхідні зміни. @@ -133,14 +135,16 @@ Rocky-.--.iso !!! Tip "Порада" + ``` Розділ «Джерело інсталяції» дозволяє виконати мережеву інсталяцію (наприклад, якщо ви використовуєте завантажувальний ISO-образ Rocky Linux — Rocky-9.6-x86_64-boot.iso). Для мережевої інсталяції переконайтеся, що мережевий адаптер на цільовій системі налаштовано правильно та має доступ до Інтернету. Щоб виконати мережеву інсталяцію, натисніть ++«Джерело інсталяції»++, а потім виберіть перемикач ++«У мережі»++. Після вибору виберіть правильний протокол і введіть URI для джерела інсталяції. Натисніть ++«Готово»++. + ``` #### Вибір програмного забезпечення Натискання опції ++"Вибір програмного забезпечення"++ на головному екрані _Підсумок встановлення_ відкриє розділ встановлення, де ви можете вибрати точні пакети програмного забезпечення, встановлені в системі. Існує дві області вибору програмного забезпечення: -- **Базове середовище**: Мінімальна інсталяція та користувацька операційна система -- **Додаткове програмне забезпечення для вибраного середовища**: Вибір базового середовища ліворуч відображає різноманітне додаткове програмне забезпечення для встановлення для цього середовища праворуч. + - **Базове середовище**: Мінімальна інсталяція та користувацька операційна система + - **Додаткове програмне забезпечення для вибраного середовища**: Вибір базового середовища ліворуч відображає різноманітне додаткове програмне забезпечення для встановлення для цього середовища праворуч. Виберіть опцію _Мінімальна інсталяція_ (базова функціональність). @@ -170,27 +174,33 @@ Rocky-.--.iso !!! Note "Примітка" + ``` Після натискання опції ++"Мережа та ім'я хоста"++ все правильно виявлене обладнання мережевого інтерфейсу (наприклад, Ethernet, бездротові мережеві карти тощо) буде перераховано в лівій панелі екрана конфігурації мережі. Залежно від конкретної конфігурації обладнання, пристрої Ethernet у Linux мають назви, подібні до `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3` тощо. Ви можете налаштувати кожен інтерфейс за допомогою DHCP або вручну встановити IP-адресу. Якщо ви вирішите налаштувати вручну, переконайтеся, що у вас є вся необхідна інформація, така як IP-адреса, маска мережі та інші відповідні дані. + ``` Натискання кнопки ++"Мережа та ім'я хоста"++ на головному екрані _Підсумок встановлення_ відкриває відповідний екран конфігурації. Крім іншого, у вас є можливість налаштувати ім’я хоста системи. !!! Note "Примітка" + ``` Ви можете легко змінити ім’я хоста системи пізніше після встановлення ОС. + ``` Наступне важливе завдання конфігурації стосується мережевих інтерфейсів системи. 1. Переконайтеся, що на лівій панелі зазначено плату Ethernet (або будь-яку мережеву карту). 2. Натисніть будь-який із виявлених мережевих пристроїв на лівій панелі, щоб вибрати його.\ - Налаштовувані властивості вибраного мережевого адаптера відображаються в правій області екрана. + Налаштовувані властивості вибраного мережевого адаптера відображаються в правій області екрана. !!! Note "Примітка" + ``` У нашій зразковій системі є два пристрої Ethernet (`ens3` та `ens4`), всі з яких перебувають у підключеному стані. Тип, назва, кількість та стан мережевих пристроїв у вашій системі можуть відрізнятися від тих, що є в нашій демонстраційній системі. + ``` Переконайтеся, що перемикач пристрою, який ви хочете налаштувати, знаходиться в положенні «УВІМК.» (синій) на правій панелі. Ми приймемо всі значення за замовчуванням у цьому розділі. @@ -199,7 +209,9 @@ Rocky-.--.iso !!! Warning "Важливо" + ``` Зверніть увагу на IP-адресу сервера в цьому розділі інсталятора. Припустимо, у вас немає фізичного або легкого консольного доступу до системи. У такому разі ця інформація стане в пригоді пізніше, коли вам потрібно буде підключитися до сервера, щоб продовжити роботу на ньому після завершення встановлення ОС. + ``` ### Розділ налаштувань користувача @@ -209,11 +221,11 @@ Rocky-.--.iso 1. Клацніть поле _Пароль root_ у розділі _Налаштування користувача_, щоб розпочати екран завдання _Пароль root_. - !!! Warning "Важливо" + !!! Warning "Важливо" - ``` - Суперкористувач root — це обліковий запис із найвищими привілеями в системі. Тому, якщо ви вирішите використовувати або ввімкнути його, вам необхідно захистити цей обліковий запис надійним паролем. - ``` + ``` + Суперкористувач root — це обліковий запис із найвищими привілеями в системі. Тому, якщо ви вирішите використовувати або ввімкнути його, вам необхідно захистити цей обліковий запис надійним паролем. + ``` 2. У текстовому полі _Пароль root_ встановіть надійний пароль для користувача root. @@ -226,30 +238,30 @@ Rocky-.--.iso Щоб створити користувача: 1. Клацніть поле _Створення користувача_ у розділі _Налаштування користувача_, щоб розпочати екран завдання _Створення користувача_.\ - Ця область завдань призначена для створення привілейованого (адміністративного) або непривілейованого (неадміністративного) облікового запису користувача. + Ця область завдань призначена для створення привілейованого (адміністративного) або непривілейованого (неадміністративного) облікового запису користувача. - !!! Info "Інформація" + !!! Info "Інформація" - ``` - Створення та використання непривілейованого облікового запису для щоденних завдань у системі є найкращою практикою системного адміністрування. - ``` + ``` + Створення та використання непривілейованого облікового запису для щоденних завдань у системі є найкращою практикою системного адміністрування. + ``` - Ми створимо звичайного користувача, який за потреби може використовувати повноваження суперкористувача (адміністратора). + Ми створимо звичайного користувача, який за потреби може використовувати повноваження суперкористувача (адміністратора). 2. Заповніть поля на екрані _Створити користувача_, вказавши таку інформацію: - **Full name**: - `rockstar` + `rockstar` - **Username**: - `rockstar` + `rockstar` - **Make this user administrator**: - Checked + Checked - **Require a password to use this account**: - Checked + Checked - **Password**: - `04302021` + `04302021` - **Confirm password**: - `04302021` + `04302021` 3. Натисніть ++"done"++. @@ -266,7 +278,9 @@ Rocky-.--.iso !!! Note "Примітка" + ``` Якщо ви не бажаєте продовжувати після натискання кнопки «Почати встановлення», ви можете безпечно вийти з інсталяції без втрати даних. Щоб вийти з інсталятора, скиньте налаштування системи, натиснувши кнопку «Вийти», натиснувши Ctrl-Alt-Delete на клавіатурі або натиснувши кнопку скидання чи вимикач живлення. + ``` ### Завершення установки @@ -287,6 +301,6 @@ Rocky-.--.iso 2. У запиті пароля введіть `04302021` (пароль Rockstar) і натисніть ++enter++ (пароль _**не**_ відображатиметься на екрані, це нормально). 3. Виконайте команду `whoami` після входу в систему.\ - Ця команда показує ім'я користувача, який наразі ввійшов у систему. + Ця команда показує ім'я користувача, який наразі ввійшов у систему. ![Login Screen](images/installation_9.0_F03.png) diff --git a/docs/guides/backup/dump_restore.it.md b/docs/guides/backup/dump_restore.it.md index 3b9361a7d8..ce40e190ac 100644 --- a/docs/guides/backup/dump_restore.it.md +++ b/docs/guides/backup/dump_restore.it.md @@ -59,133 +59,133 @@ Le opzioni più comuni sono: 1. Eseguire un backup completo della partizione principale: - ```bash - Shell > dump -0u -j3 -f /tmp/root-20241208.bak.bz2 / - DUMP: Date of this level 0 dump: Sun Dec 8 19:04:39 2024 - DUMP: Dumping /dev/nvme0n1p2 (/) to /tmp/root-20241208.bak.bz2 - DUMP: Label: none - DUMP: Writing 10 Kilobyte records - DUMP: Compressing output at transformation level 3 (bzlib) - DUMP: mapping (Pass I) [regular files] - DUMP: mapping (Pass II) [directories] - DUMP: estimated 14693111 blocks. - DUMP: Volume 1 started with block 1 at: Sun Dec 8 19:04:41 2024 - DUMP: dumping (Pass III) [directories] - DUMP: dumping (Pass IV) [regular files] - DUMP: 20.69% done at 10133 kB/s, finished in 0:19 - DUMP: 43.74% done at 10712 kB/s, finished in 0:12 - DUMP: 70.91% done at 11575 kB/s, finished in 0:06 - DUMP: 93.23% done at 11415 kB/s, finished in 0:01 - DUMP: Closing /tmp/root-20241208.bak.bz2 - DUMP: Volume 1 completed at: Sun Dec 8 19:26:08 2024 - DUMP: Volume 1 took 0:21:27 - DUMP: Volume 1 transfer rate: 5133 kB/s - DUMP: Volume 1 14722930kB uncompressed, 6607183kB compressed, 2.229:1 - DUMP: 14722930 blocks (14377.86MB) on 1 volume(s) - DUMP: finished in 1287 seconds, throughput 11439 kBytes/sec - DUMP: Date of this level 0 dump: Sun Dec 8 19:04:39 2024 - DUMP: Date this dump completed: Sun Dec 8 19:26:08 2024 - DUMP: Average transfer rate: 5133 kB/s - DUMP: Wrote 14722930kB uncompressed, 6607183kB compressed, 2.229:1 - DUMP: DUMP IS DONE - - Shell > ls -lh /tmp/root-20241208.bak.bz2 - -rw-r--r-- 1 root root 6.4G Dec 8 19:26 /tmp/root-20241208.bak.bz2 - ``` + ```bash + Shell > dump -0u -j3 -f /tmp/root-20241208.bak.bz2 / + DUMP: Date of this level 0 dump: Sun Dec 8 19:04:39 2024 + DUMP: Dumping /dev/nvme0n1p2 (/) to /tmp/root-20241208.bak.bz2 + DUMP: Label: none + DUMP: Writing 10 Kilobyte records + DUMP: Compressing output at transformation level 3 (bzlib) + DUMP: mapping (Pass I) [regular files] + DUMP: mapping (Pass II) [directories] + DUMP: estimated 14693111 blocks. + DUMP: Volume 1 started with block 1 at: Sun Dec 8 19:04:41 2024 + DUMP: dumping (Pass III) [directories] + DUMP: dumping (Pass IV) [regular files] + DUMP: 20.69% done at 10133 kB/s, finished in 0:19 + DUMP: 43.74% done at 10712 kB/s, finished in 0:12 + DUMP: 70.91% done at 11575 kB/s, finished in 0:06 + DUMP: 93.23% done at 11415 kB/s, finished in 0:01 + DUMP: Closing /tmp/root-20241208.bak.bz2 + DUMP: Volume 1 completed at: Sun Dec 8 19:26:08 2024 + DUMP: Volume 1 took 0:21:27 + DUMP: Volume 1 transfer rate: 5133 kB/s + DUMP: Volume 1 14722930kB uncompressed, 6607183kB compressed, 2.229:1 + DUMP: 14722930 blocks (14377.86MB) on 1 volume(s) + DUMP: finished in 1287 seconds, throughput 11439 kBytes/sec + DUMP: Date of this level 0 dump: Sun Dec 8 19:04:39 2024 + DUMP: Date this dump completed: Sun Dec 8 19:26:08 2024 + DUMP: Average transfer rate: 5133 kB/s + DUMP: Wrote 14722930kB uncompressed, 6607183kB compressed, 2.229:1 + DUMP: DUMP IS DONE + + Shell > ls -lh /tmp/root-20241208.bak.bz2 + -rw-r--r-- 1 root root 6.4G Dec 8 19:26 /tmp/root-20241208.bak.bz2 + ``` 2. Dopo aver effettuato lo scarico, controllare le informazioni pertinenti: - ```bash - Shell > cat /etc/dumpdates - /dev/nvme0n1p2 0 Sun Dec 8 19:04:39 2024 +0800 + ```bash + Shell > cat /etc/dumpdates + /dev/nvme0n1p2 0 Sun Dec 8 19:04:39 2024 +0800 - Shell > dump -W - Last dump(s) done (Dump '>' file systems): - /dev/nvme0n1p2 ( /) Last dump: Level 0, Date Sun Dec 8 19:04:39 2024 - ``` + Shell > dump -W + Last dump(s) done (Dump '>' file systems): + /dev/nvme0n1p2 ( /) Last dump: Level 0, Date Sun Dec 8 19:04:39 2024 + ``` 3. Implementare il backup incrementale sulla base del backup completo: - ```bash - Shell > echo "jack" >> /tmp/tmpfile.txt - - Shell > dump -1u -j4 -f /tmp/root-20241208-LV1.bak.bz2 / - DUMP: Date of this level 1 dump: Sun Dec 8 19:38:51 2024 - DUMP: Date of last level 0 dump: Sun Dec 8 19:04:39 2024 - DUMP: Dumping /dev/nvme0n1p2 (/) to /tmp/root-20241208-LV1.bak.bz2 - DUMP: Label: none - DUMP: Writing 10 Kilobyte records - DUMP: Compressing output at transformation level 4 (bzlib) - DUMP: mapping (Pass I) [regular files] - DUMP: mapping (Pass II) [directories] - DUMP: estimated 6620898 blocks. - DUMP: Volume 1 started with block 1 at: Sun Dec 8 19:38:58 2024 - DUMP: dumping (Pass III) [directories] - DUMP: dumping (Pass IV) [regular files] - DUMP: 38.13% done at 8415 kB/s, finished in 0:08 - DUMP: 75.30% done at 8309 kB/s, finished in 0:03 - DUMP: Closing /tmp/root-20241208-LV1.bak.bz2 - DUMP: Volume 1 completed at: Sun Dec 8 19:52:03 2024 - DUMP: Volume 1 took 0:13:05 - DUMP: Volume 1 transfer rate: 8408 kB/s - DUMP: Volume 1 6620910kB uncompressed, 6600592kB compressed, 1.004:1 - DUMP: 6620910 blocks (6465.73MB) on 1 volume(s) - DUMP: finished in 785 seconds, throughput 8434 kBytes/sec - DUMP: Date of this level 1 dump: Sun Dec 8 19:38:51 2024 - DUMP: Date this dump completed: Sun Dec 8 19:52:03 2024 - DUMP: Average transfer rate: 8408 kB/s - DUMP: Wrote 6620910kB uncompressed, 6600592kB compressed, 1.004:1 - DUMP: DUMP IS DONE - - Shell > cat /etc/dumpdates - /dev/nvme0n1p2 0 Sun Dec 8 19:04:39 2024 +0800 - /dev/nvme0n1p2 1 Sun Dec 8 19:38:51 2024 +0800 - - Shell > dump -W - Last dump(s) done (Dump '>' file systems): - /dev/nvme0n1p2 ( /) Last dump: Level 1, Date Sun Dec 8 19:38:51 2024 - ``` + ```bash + Shell > echo "jack" >> /tmp/tmpfile.txt + + Shell > dump -1u -j4 -f /tmp/root-20241208-LV1.bak.bz2 / + DUMP: Date of this level 1 dump: Sun Dec 8 19:38:51 2024 + DUMP: Date of last level 0 dump: Sun Dec 8 19:04:39 2024 + DUMP: Dumping /dev/nvme0n1p2 (/) to /tmp/root-20241208-LV1.bak.bz2 + DUMP: Label: none + DUMP: Writing 10 Kilobyte records + DUMP: Compressing output at transformation level 4 (bzlib) + DUMP: mapping (Pass I) [regular files] + DUMP: mapping (Pass II) [directories] + DUMP: estimated 6620898 blocks. + DUMP: Volume 1 started with block 1 at: Sun Dec 8 19:38:58 2024 + DUMP: dumping (Pass III) [directories] + DUMP: dumping (Pass IV) [regular files] + DUMP: 38.13% done at 8415 kB/s, finished in 0:08 + DUMP: 75.30% done at 8309 kB/s, finished in 0:03 + DUMP: Closing /tmp/root-20241208-LV1.bak.bz2 + DUMP: Volume 1 completed at: Sun Dec 8 19:52:03 2024 + DUMP: Volume 1 took 0:13:05 + DUMP: Volume 1 transfer rate: 8408 kB/s + DUMP: Volume 1 6620910kB uncompressed, 6600592kB compressed, 1.004:1 + DUMP: 6620910 blocks (6465.73MB) on 1 volume(s) + DUMP: finished in 785 seconds, throughput 8434 kBytes/sec + DUMP: Date of this level 1 dump: Sun Dec 8 19:38:51 2024 + DUMP: Date this dump completed: Sun Dec 8 19:52:03 2024 + DUMP: Average transfer rate: 8408 kB/s + DUMP: Wrote 6620910kB uncompressed, 6600592kB compressed, 1.004:1 + DUMP: DUMP IS DONE + + Shell > cat /etc/dumpdates + /dev/nvme0n1p2 0 Sun Dec 8 19:04:39 2024 +0800 + /dev/nvme0n1p2 1 Sun Dec 8 19:38:51 2024 +0800 + + Shell > dump -W + Last dump(s) done (Dump '>' file systems): + /dev/nvme0n1p2 ( /) Last dump: Level 1, Date Sun Dec 8 19:38:51 2024 + ``` 4. Per le directory non partizionate, è possibile utilizzare solo l'opzione Backup completo (`-0`), non l'opzione `-u`: - ```bash - Shell > dump -0uj -f /tmp/etc-full-20241208.bak.bz2 /etc/ - DUMP: You can't update the dumpdates file when dumping a subdirectory - DUMP: The ENTIRE dump is aborted. - - Shell > dump -0j -f /tmp/etc-full-20241208.bak.bz2 /etc/ - DUMP: Date of this level 0 dump: Sun Dec 8 20:00:38 2024 - DUMP: Dumping /dev/nvme0n1p2 (/ (dir etc)) to /tmp/etc-full-20241208.bak.bz2 - DUMP: Label: none - DUMP: Writing 10 Kilobyte records - DUMP: Compressing output at transformation level 2 (bzlib) - DUMP: mapping (Pass I) [regular files] - DUMP: mapping (Pass II) [directories] - DUMP: estimated 28204 blocks. - DUMP: Volume 1 started with block 1 at: Sun Dec 8 20:00:38 2024 - DUMP: dumping (Pass III) [directories] - DUMP: dumping (Pass IV) [regular files] - DUMP: Closing /tmp/etc-full-20241208.bak.bz2 - DUMP: Volume 1 completed at: Sun Dec 8 20:00:40 2024 - DUMP: Volume 1 took 0:00:02 - DUMP: Volume 1 transfer rate: 3751 kB/s - DUMP: Volume 1 29090kB uncompressed, 7503kB compressed, 3.878:1 - DUMP: 29090 blocks (28.41MB) on 1 volume(s) - DUMP: finished in 2 seconds, throughput 14545 kBytes/sec - DUMP: Date of this level 0 dump: Sun Dec 8 20:00:38 2024 - DUMP: Date this dump completed: Sun Dec 8 20:00:40 2024 - DUMP: Average transfer rate: 3751 kB/s - DUMP: Wrote 29090kB uncompressed, 7503kB compressed, 3.878:1 - DUMP: DUMP IS DONE - ``` - - L'esecuzione di un backup incrementale della directory /etc/ genera un errore: - - ```bash - Shell > dump -1j -f /tmp/etc-incr-20241208.bak.bz2 /etc/ - DUMP: Only level 0 dumps are allowed on a subdirectory - DUMP: The ENTIRE dump is aborted. - ``` + ```bash + Shell > dump -0uj -f /tmp/etc-full-20241208.bak.bz2 /etc/ + DUMP: You can't update the dumpdates file when dumping a subdirectory + DUMP: The ENTIRE dump is aborted. + + Shell > dump -0j -f /tmp/etc-full-20241208.bak.bz2 /etc/ + DUMP: Date of this level 0 dump: Sun Dec 8 20:00:38 2024 + DUMP: Dumping /dev/nvme0n1p2 (/ (dir etc)) to /tmp/etc-full-20241208.bak.bz2 + DUMP: Label: none + DUMP: Writing 10 Kilobyte records + DUMP: Compressing output at transformation level 2 (bzlib) + DUMP: mapping (Pass I) [regular files] + DUMP: mapping (Pass II) [directories] + DUMP: estimated 28204 blocks. + DUMP: Volume 1 started with block 1 at: Sun Dec 8 20:00:38 2024 + DUMP: dumping (Pass III) [directories] + DUMP: dumping (Pass IV) [regular files] + DUMP: Closing /tmp/etc-full-20241208.bak.bz2 + DUMP: Volume 1 completed at: Sun Dec 8 20:00:40 2024 + DUMP: Volume 1 took 0:00:02 + DUMP: Volume 1 transfer rate: 3751 kB/s + DUMP: Volume 1 29090kB uncompressed, 7503kB compressed, 3.878:1 + DUMP: 29090 blocks (28.41MB) on 1 volume(s) + DUMP: finished in 2 seconds, throughput 14545 kBytes/sec + DUMP: Date of this level 0 dump: Sun Dec 8 20:00:38 2024 + DUMP: Date this dump completed: Sun Dec 8 20:00:40 2024 + DUMP: Average transfer rate: 3751 kB/s + DUMP: Wrote 29090kB uncompressed, 7503kB compressed, 3.878:1 + DUMP: DUMP IS DONE + ``` + + L'esecuzione di un backup incrementale della directory /etc/ genera un errore: + + ```bash + Shell > dump -1j -f /tmp/etc-incr-20241208.bak.bz2 /etc/ + DUMP: Only level 0 dumps are allowed on a subdirectory + DUMP: The ENTIRE dump is aborted. + ``` ### Comando `restore` @@ -203,28 +203,28 @@ La modalità (flag) può essere una delle seguenti: 1. Ripristinare i dati da /tmp/etc-full-20241208.bak.bz2 : - ```bash - Shell > mkdir /tmp/data/ + ```bash + Shell > mkdir /tmp/data/ - Shell > restore -t -f /tmp/etc-full-20241208.bak.bz2 + Shell > restore -t -f /tmp/etc-full-20241208.bak.bz2 - Shell > cd /tmp/data/ ; restore -r -f /tmp/etc-full-20241208.bak.bz2 + Shell > cd /tmp/data/ ; restore -r -f /tmp/etc-full-20241208.bak.bz2 - Shell > ls -l /tmp/data/ - total 4992 - drwxr-xr-x. 90 root root 4096 Dec 8 17:13 etc - -rw------- 1 root root 5107632 Dec 8 20:39 restoresymtable - ``` + Shell > ls -l /tmp/data/ + total 4992 + drwxr-xr-x. 90 root root 4096 Dec 8 17:13 etc + -rw------- 1 root root 5107632 Dec 8 20:39 restoresymtable + ``` - Come si può vedere, dopo un ripristino riuscito viene visualizzato un file chiamato `restoresymtable`. Questo file è importante. Serve per le operazioni di ripristino del sistema di backup incrementale. + Come si può vedere, dopo un ripristino riuscito viene visualizzato un file chiamato `restoresymtable`. Questo file è importante. Serve per le operazioni di ripristino del sistema di backup incrementale. 2. Elaborare i file di backup in modalità interattiva: - ```bash - Shell > restore -i -f /tmp/etc-full-20241208.bak.bz2 - Dump tape is compressed. + ```bash + Shell > restore -i -f /tmp/etc-full-20241208.bak.bz2 + Dump tape is compressed. - restore > ? - ``` + restore > ? + ``` - È possibile digitare ++question++ per visualizzare i comandi interattivi disponibili in questa modalità. + È possibile digitare ++question++ per visualizzare i comandi interattivi disponibili in questa modalità. diff --git a/docs/guides/backup/dump_restore.uk.md b/docs/guides/backup/dump_restore.uk.md index df90450a93..04a62f38ff 100644 --- a/docs/guides/backup/dump_restore.uk.md +++ b/docs/guides/backup/dump_restore.uk.md @@ -59,133 +59,133 @@ Shell > dnf -y install dump 1. Виконайте повне резервне копіювання кореневого розділу: - ```bash - Shell > dump -0u -j3 -f /tmp/root-20241208.bak.bz2 / - DUMP: Date of this level 0 dump: Sun Dec 8 19:04:39 2024 - DUMP: Dumping /dev/nvme0n1p2 (/) to /tmp/root-20241208.bak.bz2 - DUMP: Label: none - DUMP: Writing 10 Kilobyte records - DUMP: Compressing output at transformation level 3 (bzlib) - DUMP: mapping (Pass I) [regular files] - DUMP: mapping (Pass II) [directories] - DUMP: estimated 14693111 blocks. - DUMP: Volume 1 started with block 1 at: Sun Dec 8 19:04:41 2024 - DUMP: dumping (Pass III) [directories] - DUMP: dumping (Pass IV) [regular files] - DUMP: 20.69% done at 10133 kB/s, finished in 0:19 - DUMP: 43.74% done at 10712 kB/s, finished in 0:12 - DUMP: 70.91% done at 11575 kB/s, finished in 0:06 - DUMP: 93.23% done at 11415 kB/s, finished in 0:01 - DUMP: Closing /tmp/root-20241208.bak.bz2 - DUMP: Volume 1 completed at: Sun Dec 8 19:26:08 2024 - DUMP: Volume 1 took 0:21:27 - DUMP: Volume 1 transfer rate: 5133 kB/s - DUMP: Volume 1 14722930kB uncompressed, 6607183kB compressed, 2.229:1 - DUMP: 14722930 blocks (14377.86MB) on 1 volume(s) - DUMP: finished in 1287 seconds, throughput 11439 kBytes/sec - DUMP: Date of this level 0 dump: Sun Dec 8 19:04:39 2024 - DUMP: Date this dump completed: Sun Dec 8 19:26:08 2024 - DUMP: Average transfer rate: 5133 kB/s - DUMP: Wrote 14722930kB uncompressed, 6607183kB compressed, 2.229:1 - DUMP: DUMP IS DONE - - Shell > ls -lh /tmp/root-20241208.bak.bz2 - -rw-r--r-- 1 root root 6.4G Dec 8 19:26 /tmp/root-20241208.bak.bz2 - ``` + ```bash + Shell > dump -0u -j3 -f /tmp/root-20241208.bak.bz2 / + DUMP: Date of this level 0 dump: Sun Dec 8 19:04:39 2024 + DUMP: Dumping /dev/nvme0n1p2 (/) to /tmp/root-20241208.bak.bz2 + DUMP: Label: none + DUMP: Writing 10 Kilobyte records + DUMP: Compressing output at transformation level 3 (bzlib) + DUMP: mapping (Pass I) [regular files] + DUMP: mapping (Pass II) [directories] + DUMP: estimated 14693111 blocks. + DUMP: Volume 1 started with block 1 at: Sun Dec 8 19:04:41 2024 + DUMP: dumping (Pass III) [directories] + DUMP: dumping (Pass IV) [regular files] + DUMP: 20.69% done at 10133 kB/s, finished in 0:19 + DUMP: 43.74% done at 10712 kB/s, finished in 0:12 + DUMP: 70.91% done at 11575 kB/s, finished in 0:06 + DUMP: 93.23% done at 11415 kB/s, finished in 0:01 + DUMP: Closing /tmp/root-20241208.bak.bz2 + DUMP: Volume 1 completed at: Sun Dec 8 19:26:08 2024 + DUMP: Volume 1 took 0:21:27 + DUMP: Volume 1 transfer rate: 5133 kB/s + DUMP: Volume 1 14722930kB uncompressed, 6607183kB compressed, 2.229:1 + DUMP: 14722930 blocks (14377.86MB) on 1 volume(s) + DUMP: finished in 1287 seconds, throughput 11439 kBytes/sec + DUMP: Date of this level 0 dump: Sun Dec 8 19:04:39 2024 + DUMP: Date this dump completed: Sun Dec 8 19:26:08 2024 + DUMP: Average transfer rate: 5133 kB/s + DUMP: Wrote 14722930kB uncompressed, 6607183kB compressed, 2.229:1 + DUMP: DUMP IS DONE + + Shell > ls -lh /tmp/root-20241208.bak.bz2 + -rw-r--r-- 1 root root 6.4G Dec 8 19:26 /tmp/root-20241208.bak.bz2 + ``` 2. Після успішного скидання перевірте відповідну інформацію: - ```bash - Shell > cat /etc/dumpdates - /dev/nvme0n1p2 0 Sun Dec 8 19:04:39 2024 +0800 + ```bash + Shell > cat /etc/dumpdates + /dev/nvme0n1p2 0 Sun Dec 8 19:04:39 2024 +0800 - Shell > dump -W - Last dump(s) done (Dump '>' file systems): - /dev/nvme0n1p2 ( /) Last dump: Level 0, Date Sun Dec 8 19:04:39 2024 - ``` + Shell > dump -W + Last dump(s) done (Dump '>' file systems): + /dev/nvme0n1p2 ( /) Last dump: Level 0, Date Sun Dec 8 19:04:39 2024 + ``` 3. Реалізувати інкрементне резервне копіювання на основі повного резервного копіювання: - ```bash - Shell > echo "jack" >> /tmp/tmpfile.txt - - Shell > dump -1u -j4 -f /tmp/root-20241208-LV1.bak.bz2 / - DUMP: Date of this level 1 dump: Sun Dec 8 19:38:51 2024 - DUMP: Date of last level 0 dump: Sun Dec 8 19:04:39 2024 - DUMP: Dumping /dev/nvme0n1p2 (/) to /tmp/root-20241208-LV1.bak.bz2 - DUMP: Label: none - DUMP: Writing 10 Kilobyte records - DUMP: Compressing output at transformation level 4 (bzlib) - DUMP: mapping (Pass I) [regular files] - DUMP: mapping (Pass II) [directories] - DUMP: estimated 6620898 blocks. - DUMP: Volume 1 started with block 1 at: Sun Dec 8 19:38:58 2024 - DUMP: dumping (Pass III) [directories] - DUMP: dumping (Pass IV) [regular files] - DUMP: 38.13% done at 8415 kB/s, finished in 0:08 - DUMP: 75.30% done at 8309 kB/s, finished in 0:03 - DUMP: Closing /tmp/root-20241208-LV1.bak.bz2 - DUMP: Volume 1 completed at: Sun Dec 8 19:52:03 2024 - DUMP: Volume 1 took 0:13:05 - DUMP: Volume 1 transfer rate: 8408 kB/s - DUMP: Volume 1 6620910kB uncompressed, 6600592kB compressed, 1.004:1 - DUMP: 6620910 blocks (6465.73MB) on 1 volume(s) - DUMP: finished in 785 seconds, throughput 8434 kBytes/sec - DUMP: Date of this level 1 dump: Sun Dec 8 19:38:51 2024 - DUMP: Date this dump completed: Sun Dec 8 19:52:03 2024 - DUMP: Average transfer rate: 8408 kB/s - DUMP: Wrote 6620910kB uncompressed, 6600592kB compressed, 1.004:1 - DUMP: DUMP IS DONE - - Shell > cat /etc/dumpdates - /dev/nvme0n1p2 0 Sun Dec 8 19:04:39 2024 +0800 - /dev/nvme0n1p2 1 Sun Dec 8 19:38:51 2024 +0800 - - Shell > dump -W - Last dump(s) done (Dump '>' file systems): - /dev/nvme0n1p2 ( /) Last dump: Level 1, Date Sun Dec 8 19:38:51 2024 - ``` + ```bash + Shell > echo "jack" >> /tmp/tmpfile.txt + + Shell > dump -1u -j4 -f /tmp/root-20241208-LV1.bak.bz2 / + DUMP: Date of this level 1 dump: Sun Dec 8 19:38:51 2024 + DUMP: Date of last level 0 dump: Sun Dec 8 19:04:39 2024 + DUMP: Dumping /dev/nvme0n1p2 (/) to /tmp/root-20241208-LV1.bak.bz2 + DUMP: Label: none + DUMP: Writing 10 Kilobyte records + DUMP: Compressing output at transformation level 4 (bzlib) + DUMP: mapping (Pass I) [regular files] + DUMP: mapping (Pass II) [directories] + DUMP: estimated 6620898 blocks. + DUMP: Volume 1 started with block 1 at: Sun Dec 8 19:38:58 2024 + DUMP: dumping (Pass III) [directories] + DUMP: dumping (Pass IV) [regular files] + DUMP: 38.13% done at 8415 kB/s, finished in 0:08 + DUMP: 75.30% done at 8309 kB/s, finished in 0:03 + DUMP: Closing /tmp/root-20241208-LV1.bak.bz2 + DUMP: Volume 1 completed at: Sun Dec 8 19:52:03 2024 + DUMP: Volume 1 took 0:13:05 + DUMP: Volume 1 transfer rate: 8408 kB/s + DUMP: Volume 1 6620910kB uncompressed, 6600592kB compressed, 1.004:1 + DUMP: 6620910 blocks (6465.73MB) on 1 volume(s) + DUMP: finished in 785 seconds, throughput 8434 kBytes/sec + DUMP: Date of this level 1 dump: Sun Dec 8 19:38:51 2024 + DUMP: Date this dump completed: Sun Dec 8 19:52:03 2024 + DUMP: Average transfer rate: 8408 kB/s + DUMP: Wrote 6620910kB uncompressed, 6600592kB compressed, 1.004:1 + DUMP: DUMP IS DONE + + Shell > cat /etc/dumpdates + /dev/nvme0n1p2 0 Sun Dec 8 19:04:39 2024 +0800 + /dev/nvme0n1p2 1 Sun Dec 8 19:38:51 2024 +0800 + + Shell > dump -W + Last dump(s) done (Dump '>' file systems): + /dev/nvme0n1p2 ( /) Last dump: Level 1, Date Sun Dec 8 19:38:51 2024 + ``` 4. Для нерозділеного каталогу можна використовувати лише параметр «Повна резервна копія» (`-0`), а не параметр `-u`: - ```bash - Shell > dump -0uj -f /tmp/etc-full-20241208.bak.bz2 /etc/ - DUMP: You can't update the dumpdates file when dumping a subdirectory - DUMP: The ENTIRE dump is aborted. - - Shell > dump -0j -f /tmp/etc-full-20241208.bak.bz2 /etc/ - DUMP: Date of this level 0 dump: Sun Dec 8 20:00:38 2024 - DUMP: Dumping /dev/nvme0n1p2 (/ (dir etc)) to /tmp/etc-full-20241208.bak.bz2 - DUMP: Label: none - DUMP: Writing 10 Kilobyte records - DUMP: Compressing output at transformation level 2 (bzlib) - DUMP: mapping (Pass I) [regular files] - DUMP: mapping (Pass II) [directories] - DUMP: estimated 28204 blocks. - DUMP: Volume 1 started with block 1 at: Sun Dec 8 20:00:38 2024 - DUMP: dumping (Pass III) [directories] - DUMP: dumping (Pass IV) [regular files] - DUMP: Closing /tmp/etc-full-20241208.bak.bz2 - DUMP: Volume 1 completed at: Sun Dec 8 20:00:40 2024 - DUMP: Volume 1 took 0:00:02 - DUMP: Volume 1 transfer rate: 3751 kB/s - DUMP: Volume 1 29090kB uncompressed, 7503kB compressed, 3.878:1 - DUMP: 29090 blocks (28.41MB) on 1 volume(s) - DUMP: finished in 2 seconds, throughput 14545 kBytes/sec - DUMP: Date of this level 0 dump: Sun Dec 8 20:00:38 2024 - DUMP: Date this dump completed: Sun Dec 8 20:00:40 2024 - DUMP: Average transfer rate: 3751 kB/s - DUMP: Wrote 29090kB uncompressed, 7503kB compressed, 3.878:1 - DUMP: DUMP IS DONE - ``` - - Виконання інкрементного резервного копіювання каталогу /etc/ призведе до помилки: - - ```bash - Shell > dump -1j -f /tmp/etc-incr-20241208.bak.bz2 /etc/ - DUMP: Only level 0 dumps are allowed on a subdirectory - DUMP: The ENTIRE dump is aborted. - ``` + ```bash + Shell > dump -0uj -f /tmp/etc-full-20241208.bak.bz2 /etc/ + DUMP: You can't update the dumpdates file when dumping a subdirectory + DUMP: The ENTIRE dump is aborted. + + Shell > dump -0j -f /tmp/etc-full-20241208.bak.bz2 /etc/ + DUMP: Date of this level 0 dump: Sun Dec 8 20:00:38 2024 + DUMP: Dumping /dev/nvme0n1p2 (/ (dir etc)) to /tmp/etc-full-20241208.bak.bz2 + DUMP: Label: none + DUMP: Writing 10 Kilobyte records + DUMP: Compressing output at transformation level 2 (bzlib) + DUMP: mapping (Pass I) [regular files] + DUMP: mapping (Pass II) [directories] + DUMP: estimated 28204 blocks. + DUMP: Volume 1 started with block 1 at: Sun Dec 8 20:00:38 2024 + DUMP: dumping (Pass III) [directories] + DUMP: dumping (Pass IV) [regular files] + DUMP: Closing /tmp/etc-full-20241208.bak.bz2 + DUMP: Volume 1 completed at: Sun Dec 8 20:00:40 2024 + DUMP: Volume 1 took 0:00:02 + DUMP: Volume 1 transfer rate: 3751 kB/s + DUMP: Volume 1 29090kB uncompressed, 7503kB compressed, 3.878:1 + DUMP: 29090 blocks (28.41MB) on 1 volume(s) + DUMP: finished in 2 seconds, throughput 14545 kBytes/sec + DUMP: Date of this level 0 dump: Sun Dec 8 20:00:38 2024 + DUMP: Date this dump completed: Sun Dec 8 20:00:40 2024 + DUMP: Average transfer rate: 3751 kB/s + DUMP: Wrote 29090kB uncompressed, 7503kB compressed, 3.878:1 + DUMP: DUMP IS DONE + ``` + + Виконання інкрементного резервного копіювання каталогу /etc/ призведе до помилки: + + ```bash + Shell > dump -1j -f /tmp/etc-incr-20241208.bak.bz2 /etc/ + DUMP: Only level 0 dumps are allowed on a subdirectory + DUMP: The ENTIRE dump is aborted. + ``` ### Команда `restore` @@ -203,28 +203,28 @@ Shell > dnf -y install dump 1. Відновити дані з /tmp/etc-full-20241208.bak.bz2: - ```bash - Shell > mkdir /tmp/data/ + ```bash + Shell > mkdir /tmp/data/ - Shell > restore -t -f /tmp/etc-full-20241208.bak.bz2 + Shell > restore -t -f /tmp/etc-full-20241208.bak.bz2 - Shell > cd /tmp/data/ ; restore -r -f /tmp/etc-full-20241208.bak.bz2 + Shell > cd /tmp/data/ ; restore -r -f /tmp/etc-full-20241208.bak.bz2 - Shell > ls -l /tmp/data/ - total 4992 - drwxr-xr-x. 90 root root 4096 Dec 8 17:13 etc - -rw------- 1 root root 5107632 Dec 8 20:39 restoresymtable - ``` + Shell > ls -l /tmp/data/ + total 4992 + drwxr-xr-x. 90 root root 4096 Dec 8 17:13 etc + -rw------- 1 root root 5107632 Dec 8 20:39 restoresymtable + ``` - Як бачите, після успішного відновлення з’являється файл із назвою `restoresymtable`. Цей файл важливий. Він призначений для операцій відновлення системи поетапного резервного копіювання. + Як бачите, після успішного відновлення з’являється файл із назвою `restoresymtable`. Цей файл важливий. Він призначений для операцій відновлення системи поетапного резервного копіювання. 2. Обробка резервних копій файлів в інтерактивному режимі: - ```bash - Shell > restore -i -f /tmp/etc-full-20241208.bak.bz2 - Dump tape is compressed. + ```bash + Shell > restore -i -f /tmp/etc-full-20241208.bak.bz2 + Dump tape is compressed. - restore > ? - ``` + restore > ? + ``` - Ви можете ввести ++question++, щоб переглянути доступні інтерактивні команди в цьому режимі. + Ви можете ввести ++question++, щоб переглянути доступні інтерактивні команди в цьому режимі. diff --git a/docs/guides/backup/tar.it.md b/docs/guides/backup/tar.it.md index 5bd9f9b28e..69b1af9150 100644 --- a/docs/guides/backup/tar.it.md +++ b/docs/guides/backup/tar.it.md @@ -106,30 +106,30 @@ In alcune vecchie versioni di tar, le opzioni sono indicate come "key", il che s 1. Stile tradizionale: - - `tar {A|c|d|r|t|u|x}[GnSkUWOmpsMBiajJzZhPlRvwo] [ARG...]`. + - `tar {A|c|d|r|t|u|x}[GnSkUWOmpsMBiajJzZhPlRvwo] [ARG...]`. 2. L'uso dello stile breve dei parametri è: - - `tar -A [OPTIONS] ARCHIVE ARCHIVE` - - `tar -c [-f ARCHIVE] [OPTIONS] [FILE...]` - - `tar -d [-f ARCHIVE] [OPTIONS] [FILE...]` - - `tar -t [-f ARCHIVE] [OPTIONS] [MEMBER...]` - - `tar -r [-f ARCHIVE] [OPTIONS] [FILE...]` - - `tar -u [-f ARCHIVE] [OPTIONS] [FILE...]` - - `tar -x [-f ARCHIVE] [OPTIONS] [MEMBER...]` + - `tar -A [OPTIONS] ARCHIVE ARCHIVE` + - `tar -c [-f ARCHIVE] [OPTIONS] [FILE...]` + - `tar -d [-f ARCHIVE] [OPTIONS] [FILE...]` + - `tar -t [-f ARCHIVE] [OPTIONS] [MEMBER...]` + - `tar -r [-f ARCHIVE] [OPTIONS] [FILE...]` + - `tar -u [-f ARCHIVE] [OPTIONS] [FILE...]` + - `tar -x [-f ARCHIVE] [OPTIONS] [MEMBER...]` 3. L'uso dello stile lungo dei parametri è: - - `tar {--catenate|--concatenate} [OPTIONS] ARCHIVE ARCHIVE` - - `tar --create [--file ARCHIVE] [OPTIONS] [FILE...]` - - `tar {--diff|--compare} [--file ARCHIVE] [OPTIONS] [FILE...]` - - `tar --delete [--file ARCHIVE] [OPTIONS] [MEMBER...]` - - `tar --append [-f ARCHIVE] [OPTIONS] [FILE...]` - - `tar --list [-f ARCHIVE] [OPTIONS] [MEMBER...]` - - `tar --test-label [--file ARCHIVE] [OPTIONS] [LABEL...]` - - `tar --update [--file ARCHIVE] [OPTIONS] [FILE...]` - - `tar --update [-f ARCHIVE] [OPTIONS] [FILE...]` - - `tar {--extract|--get} [-f ARCHIVE] [OPTIONS] [MEMBER...]` + - `tar {--catenate|--concatenate} [OPTIONS] ARCHIVE ARCHIVE` + - `tar --create [--file ARCHIVE] [OPTIONS] [FILE...]` + - `tar {--diff|--compare} [--file ARCHIVE] [OPTIONS] [FILE...]` + - `tar --delete [--file ARCHIVE] [OPTIONS] [MEMBER...]` + - `tar --append [-f ARCHIVE] [OPTIONS] [FILE...]` + - `tar --list [-f ARCHIVE] [OPTIONS] [MEMBER...]` + - `tar --test-label [--file ARCHIVE] [OPTIONS] [LABEL...]` + - `tar --update [--file ARCHIVE] [OPTIONS] [FILE...]` + - `tar --update [-f ARCHIVE] [OPTIONS] [FILE...]` + - `tar {--extract|--get} [-f ARCHIVE] [OPTIONS] [MEMBER...]` Il secondo metodo è più comunemente usato ed è in linea con le abitudini della maggior parte degli utenti GNU/Linux. @@ -166,98 +166,98 @@ Ecco alcuni esempi di convenzioni di nomenclatura per gli archivi `tar`: 1. Archivia e comprime **/etc/** in modalità percorso relativo, con un suffisso `.tar.gz`: - ```bash - Shell > tar -czvf /tmp/etc-20241207.tar.gz /etc/ - ``` + ```bash + Shell > tar -czvf /tmp/etc-20241207.tar.gz /etc/ + ``` - Poiché `tar` lavora in modalità percorsi relativi per impostazione predefinita, la prima riga dell'output del comando mostrerà quanto segue: + Poiché `tar` lavora in modalità percorsi relativi per impostazione predefinita, la prima riga dell'output del comando mostrerà quanto segue: - ```bash - tar: Removing leading '/' from member names - ``` + ```bash + tar: Removing leading '/' from member names + ``` 2. Archiviazione di **/var/log/** e selezionare il tipo xz per la compressione: - ```bash - Shell > tar -cJvf /tmp/log-20241207.tar.xz /var/log/ + ```bash + Shell > tar -cJvf /tmp/log-20241207.tar.xz /var/log/ - Shell > du -sh /var/log/ ; ls -lh /tmp/log-20241207.tar.xz - 18M /var/log/ - -rw-r--r-- 1 root root 744K Dec 7 14:40 /tmp/log-20241207.tar.xz - ``` + Shell > du -sh /var/log/ ; ls -lh /tmp/log-20241207.tar.xz + 18M /var/log/ + -rw-r--r-- 1 root root 744K Dec 7 14:40 /tmp/log-20241207.tar.xz + ``` 3. Stima delle dimensioni del file senza generare un archivio: - ```bash - Shell > tar -cJf - /etc | wc -c - tar: Removing leading `/' from member names - 3721884 - ``` + ```bash + Shell > tar -cJf - /etc | wc -c + tar: Removing leading `/' from member names + 3721884 + ``` - L'unità di misura del comando `wc -c` è il byte. + L'unità di misura del comando `wc -c` è il byte. 4. Taglia i file \`.tar.gz' di grandi dimensioni: - ```bash - Shell > cd /tmp/ ; tar -czf - /etc/ | split -d -b 2M - etc-backup20241207.tar.gz. + ```bash + Shell > cd /tmp/ ; tar -czf - /etc/ | split -d -b 2M - etc-backup20241207.tar.gz. - Shell > ls -lh /tmp/ - -rw-r--r-- 1 root root 2.0M Dec 7 20:46 etc-backup20241207.tar.gz.00 - -rw-r--r-- 1 root root 2.0M Dec 7 20:46 etc-backup20241207.tar.gz.01 - -rw-r--r-- 1 root root 2.0M Dec 7 20:46 etc-backup20241207.tar.gz.02 - -rw-r--r-- 1 root root 70K Dec 7 20:46 etc-backup20241207.tar.gz.03 - ``` + Shell > ls -lh /tmp/ + -rw-r--r-- 1 root root 2.0M Dec 7 20:46 etc-backup20241207.tar.gz.00 + -rw-r--r-- 1 root root 2.0M Dec 7 20:46 etc-backup20241207.tar.gz.01 + -rw-r--r-- 1 root root 2.0M Dec 7 20:46 etc-backup20241207.tar.gz.02 + -rw-r--r-- 1 root root 70K Dec 7 20:46 etc-backup20241207.tar.gz.03 + ``` - Il primo “-” rappresenta i parametri di ingresso di `tar`, mentre il secondo “-” indica a `tar` di reindirizzare l'output a `stdout`. + Il primo “-” rappresenta i parametri di ingresso di `tar`, mentre il secondo “-” indica a `tar` di reindirizzare l'output a `stdout`. - Per estrarre questi piccoli file tagliati, si può puntare alla seguente operazione: + Per estrarre questi piccoli file tagliati, si può puntare alla seguente operazione: - ```bash - Shell > cd /tmp/ ; cat etc-backup20241207.tar.gz.* >> /tmp/etc-backup-20241207.tar.gz + ```bash + Shell > cd /tmp/ ; cat etc-backup20241207.tar.gz.* >> /tmp/etc-backup-20241207.tar.gz - Shell > cd /tmp/ ; tar -xvf etc-backup-20241207.tar.gz -C /tmp/dir1/ - ``` + Shell > cd /tmp/ ; tar -xvf etc-backup-20241207.tar.gz -C /tmp/dir1/ + ``` #### Casi con '-x' 1. Scaricate il codice sorgente di Redis ed estrarlo nella directory `/usr/local/src/`: - ```bash - Shell > wget -c https://github.com/redis/redis/archive/refs/tags/7.4.1.tar.gz + ```bash + Shell > wget -c https://github.com/redis/redis/archive/refs/tags/7.4.1.tar.gz - Shell > tar -xvf 7.4.1.tar.gz -C /usr/local/src/ - ``` + Shell > tar -xvf 7.4.1.tar.gz -C /usr/local/src/ + ``` 2. Estrarre solo un file dal file zip dell'archivio: - ```bash - Shell > tar -xvf /tmp/etc-20241207.tar.gz etc/chrony.conf - ``` + ```bash + Shell > tar -xvf /tmp/etc-20241207.tar.gz etc/chrony.conf + ``` #### Casi con '-A' o '-r' 1. Aggiunge un file `.tar' a un altro file `.tar': - ```bash - Shell > tar -cvf /tmp/etc.tar /etc/ + ```bash + Shell > tar -cvf /tmp/etc.tar /etc/ - Shell > tar -cvf /tmp/log.tar /var/log/ + Shell > tar -cvf /tmp/log.tar /var/log/ - Shell > tar -Avf /tmp/etc.tar /tmp/log.tar - ``` + Shell > tar -Avf /tmp/etc.tar /tmp/log.tar + ``` - Ciò significa che tutti i file in “log.tar” saranno aggiunti alla fine di “etc.tar”. + Ciò significa che tutti i file in “log.tar” saranno aggiunti alla fine di “etc.tar”. 2. Aggiunge file o directory a un file `.tar`: - ```bash - Shell > tar -rvf /tmp/log.tar /etc/chrony.conf - tar: Removing leading `/' from member names - /etc/chrony.conf - tar: Removing leading `/' from hard link targets + ```bash + Shell > tar -rvf /tmp/log.tar /etc/chrony.conf + tar: Removing leading `/' from member names + /etc/chrony.conf + tar: Removing leading `/' from hard link targets - Shell > tar -rvf /tmp/log.tar /tmp/dir1 - ``` + Shell > tar -rvf /tmp/log.tar /tmp/dir1 + ``` !!! warning "Attenzione" @@ -275,55 +275,55 @@ Sia che si utilizzi l'opzione `-A` o `-r`, considerare la modalità di salvatagg 1. Esaminare il contenuto dell'archivio: - ```bash - Shell > tar -tvf /tmp/log.tar + ```bash + Shell > tar -tvf /tmp/log.tar - Shell > tar -tvf /tmp/etc-20241207.tar.gz | less - ``` + Shell > tar -tvf /tmp/etc-20241207.tar.gz | less + ``` #### Casi con '-d' 1. Confrontare le differenze: - ```bash - Shell > cd / ; tar -dvf /tmp/etc.tar etc/chrony.conf - etc/chrony.conf + ```bash + Shell > cd / ; tar -dvf /tmp/etc.tar etc/chrony.conf + etc/chrony.conf - Shell > cd / ; tar -dvf /tmp/etc-20241207.tar.gz etc/ - ``` + Shell > cd / ; tar -dvf /tmp/etc-20241207.tar.gz etc/ + ``` - Per i metodi di archiviazione che usano la modalità percorsi relativi, quando si usa il tipo \`-d', cambiare il percorso del file in ‘/’. + Per i metodi di archiviazione che usano la modalità percorsi relativi, quando si usa il tipo \`-d', cambiare il percorso del file in ‘/’. #### Casi con '-u' 1. Se esistono più versioni dello stesso file, si può usare il parametro `-u`: - ```bash - Shell > touch /tmp/tmpfile1 + ```bash + Shell > touch /tmp/tmpfile1 - Shell > tar -rvf /tmp/log.tar /tmp/tmpfile1 + Shell > tar -rvf /tmp/log.tar /tmp/tmpfile1 - Shell > echo "File Name" >> /tmp/tmpfile1 + Shell > echo "File Name" >> /tmp/tmpfile1 - Shell > tar -uvf /tmp/log.tar /tmp/tmpfile1 + Shell > tar -uvf /tmp/log.tar /tmp/tmpfile1 - Shell > tar -tvf /tmp/log.tar - ... - -rw-r--r-- root/root 0 2024-12-07 18:53 tmp/tmpfile1 - -rw-r--r-- root/root 10 2024-12-07 18:54 tmp/tmpfile1 - ``` + Shell > tar -tvf /tmp/log.tar + ... + -rw-r--r-- root/root 0 2024-12-07 18:53 tmp/tmpfile1 + -rw-r--r-- root/root 10 2024-12-07 18:54 tmp/tmpfile1 + ``` #### Casi con '--delete' 1. Si può anche usare `--delete` per cancellare i file all'interno di un file `.tar`. - ```bash - Shell > tar --delete -vf /tmp/log.tar tmp/tmpfile1 + ```bash + Shell > tar --delete -vf /tmp/log.tar tmp/tmpfile1 - Shell > tar --delete -vf /tmp/etc.tar etc/motd.d/ - ``` + Shell > tar --delete -vf /tmp/etc.tar etc/motd.d/ + ``` - Quando si elimina, si eliminano tutti i file con lo stesso nome dall'archivio. + Quando si elimina, si eliminano tutti i file con lo stesso nome dall'archivio. ## Terminologia comune diff --git a/docs/guides/backup/tar.uk.md b/docs/guides/backup/tar.uk.md index f97cbb6682..b5a5ac26e1 100644 --- a/docs/guides/backup/tar.uk.md +++ b/docs/guides/backup/tar.uk.md @@ -106,30 +106,30 @@ Shell > tar --show-defaults 1. Традиційний стиль: - - `tar {A|c|d|r|t|u|x}[GnSkUWOmpsMBiajJzZhPlRvwo] [ARG...]`. + - `tar {A|c|d|r|t|u|x}[GnSkUWOmpsMBiajJzZhPlRvwo] [ARG...]`. 2. Використання стилю короткого варіанту: - - `tar -A [OPTIONS] ARCHIVE ARCHIVE` - - `tar -c [-f ARCHIVE] [OPTIONS] [FILE...]` - - `tar -d [-f ARCHIVE] [OPTIONS] [FILE...]` - - `tar -t [-f ARCHIVE] [OPTIONS] [MEMBER...]` - - `tar -r [-f ARCHIVE] [OPTIONS] [FILE...]` - - `tar -u [-f ARCHIVE] [OPTIONS] [FILE...]` - - `tar -x [-f ARCHIVE] [OPTIONS] [MEMBER...]` + - `tar -A [OPTIONS] ARCHIVE ARCHIVE` + - `tar -c [-f ARCHIVE] [OPTIONS] [FILE...]` + - `tar -d [-f ARCHIVE] [OPTIONS] [FILE...]` + - `tar -t [-f ARCHIVE] [OPTIONS] [MEMBER...]` + - `tar -r [-f ARCHIVE] [OPTIONS] [FILE...]` + - `tar -u [-f ARCHIVE] [OPTIONS] [FILE...]` + - `tar -x [-f ARCHIVE] [OPTIONS] [MEMBER...]` 3. Використання стилю довгого варіанту: - - `tar {--catenate|--concatenate} [OPTIONS] ARCHIVE ARCHIVE` - - `tar --create [--file ARCHIVE] [OPTIONS] [FILE...]` - - `tar {--diff|--compare} [--file ARCHIVE] [OPTIONS] [FILE...]` - - `tar --delete [--file ARCHIVE] [OPTIONS] [MEMBER...]` - - `tar --append [-f ARCHIVE] [OPTIONS] [FILE...]` - - `tar --list [-f ARCHIVE] [OPTIONS] [MEMBER...]` - - `tar --test-label [--file ARCHIVE] [OPTIONS] [LABEL...]` - - `tar --update [--file ARCHIVE] [OPTIONS] [FILE...]` - - `tar --update [-f ARCHIVE] [OPTIONS] [FILE...]` - - `tar {--extract|--get} [-f ARCHIVE] [OPTIONS] [MEMBER...]` + - `tar {--catenate|--concatenate} [OPTIONS] ARCHIVE ARCHIVE` + - `tar --create [--file ARCHIVE] [OPTIONS] [FILE...]` + - `tar {--diff|--compare} [--file ARCHIVE] [OPTIONS] [FILE...]` + - `tar --delete [--file ARCHIVE] [OPTIONS] [MEMBER...]` + - `tar --append [-f ARCHIVE] [OPTIONS] [FILE...]` + - `tar --list [-f ARCHIVE] [OPTIONS] [MEMBER...]` + - `tar --test-label [--file ARCHIVE] [OPTIONS] [LABEL...]` + - `tar --update [--file ARCHIVE] [OPTIONS] [FILE...]` + - `tar --update [-f ARCHIVE] [OPTIONS] [FILE...]` + - `tar {--extract|--get} [-f ARCHIVE] [OPTIONS] [MEMBER...]` Другий метод є більш поширеним і відповідає звичкам більшості користувачів GNU/Linux. @@ -166,98 +166,98 @@ Shell > tar --show-defaults 1. Архівуйте та стискайте **/etc/** у відносному режимі з суфіксом `.tar.gz`: - ```bash - Shell > tar -czvf /tmp/etc-20241207.tar.gz /etc/ - ``` + ```bash + Shell > tar -czvf /tmp/etc-20241207.tar.gz /etc/ + ``` - Через те, що `tar` за замовчуванням працює у відносному режимі, перший рядок виводу команди відображатиме наступне: + Через те, що `tar` за замовчуванням працює у відносному режимі, перший рядок виводу команди відображатиме наступне: - ```bash - tar: Removing leading '/' from member names - ``` + ```bash + tar: Removing leading '/' from member names + ``` 2. Архівуйте **/var/log/** і виберіть тип xz для стиснення: - ```bash - Shell > tar -cJvf /tmp/log-20241207.tar.xz /var/log/ + ```bash + Shell > tar -cJvf /tmp/log-20241207.tar.xz /var/log/ - Shell > du -sh /var/log/ ; ls -lh /tmp/log-20241207.tar.xz - 18M /var/log/ - -rw-r--r-- 1 root root 744K Dec 7 14:40 /tmp/log-20241207.tar.xz - ``` + Shell > du -sh /var/log/ ; ls -lh /tmp/log-20241207.tar.xz + 18M /var/log/ + -rw-r--r-- 1 root root 744K Dec 7 14:40 /tmp/log-20241207.tar.xz + ``` 3. Оцініть розмір файлу без створення архіву: - ```bash - Shell > tar -cJf - /etc | wc -c - tar: Removing leading `/' from member names - 3721884 - ``` + ```bash + Shell > tar -cJf - /etc | wc -c + tar: Removing leading `/' from member names + 3721884 + ``` - Одиницею виведення команди `wc -c` є байти. + Одиницею виведення команди `wc -c` є байти. 4. Виріжте великі файли `.tar.gz`: - ```bash - Shell > cd /tmp/ ; tar -czf - /etc/ | split -d -b 2M - etc-backup20241207.tar.gz. + ```bash + Shell > cd /tmp/ ; tar -czf - /etc/ | split -d -b 2M - etc-backup20241207.tar.gz. - Shell > ls -lh /tmp/ - -rw-r--r-- 1 root root 2.0M Dec 7 20:46 etc-backup20241207.tar.gz.00 - -rw-r--r-- 1 root root 2.0M Dec 7 20:46 etc-backup20241207.tar.gz.01 - -rw-r--r-- 1 root root 2.0M Dec 7 20:46 etc-backup20241207.tar.gz.02 - -rw-r--r-- 1 root root 70K Dec 7 20:46 etc-backup20241207.tar.gz.03 - ``` + Shell > ls -lh /tmp/ + -rw-r--r-- 1 root root 2.0M Dec 7 20:46 etc-backup20241207.tar.gz.00 + -rw-r--r-- 1 root root 2.0M Dec 7 20:46 etc-backup20241207.tar.gz.01 + -rw-r--r-- 1 root root 2.0M Dec 7 20:46 etc-backup20241207.tar.gz.02 + -rw-r--r-- 1 root root 70K Dec 7 20:46 etc-backup20241207.tar.gz.03 + ``` - Перший «-» представляє вхідні параметри `tar`, тоді як другий «-» повідомляє `tar` перенаправити вихід на `stdout`. + Перший «-» представляє вхідні параметри `tar`, тоді як другий «-» повідомляє `tar` перенаправити вихід на `stdout`. - Щоб витягнути ці вирізані невеликі файли, ви можете вказати таку операцію: + Щоб витягнути ці вирізані невеликі файли, ви можете вказати таку операцію: - ```bash - Shell > cd /tmp/ ; cat etc-backup20241207.tar.gz.* >> /tmp/etc-backup-20241207.tar.gz + ```bash + Shell > cd /tmp/ ; cat etc-backup20241207.tar.gz.* >> /tmp/etc-backup-20241207.tar.gz - Shell > cd /tmp/ ; tar -xvf etc-backup-20241207.tar.gz -C /tmp/dir1/ - ``` + Shell > cd /tmp/ ; tar -xvf etc-backup-20241207.tar.gz -C /tmp/dir1/ + ``` #### Тип `-x` 1. Завантажте вихідний код Redis і розпакуйте його в каталог `/usr/local/src/`: - ```bash - Shell > wget -c https://github.com/redis/redis/archive/refs/tags/7.4.1.tar.gz + ```bash + Shell > wget -c https://github.com/redis/redis/archive/refs/tags/7.4.1.tar.gz - Shell > tar -xvf 7.4.1.tar.gz -C /usr/local/src/ - ``` + Shell > tar -xvf 7.4.1.tar.gz -C /usr/local/src/ + ``` 2. Розпакуйте лише один файл із zip-архіву - ```bash - Shell > tar -xvf /tmp/etc-20241207.tar.gz etc/chrony.conf - ``` + ```bash + Shell > tar -xvf /tmp/etc-20241207.tar.gz etc/chrony.conf + ``` #### Тип -A або -r 1. Додайте один файл `.tar` до іншого файлу `.tar`: - ```bash - Shell > tar -cvf /tmp/etc.tar /etc/ + ```bash + Shell > tar -cvf /tmp/etc.tar /etc/ - Shell > tar -cvf /tmp/log.tar /var/log/ + Shell > tar -cvf /tmp/log.tar /var/log/ - Shell > tar -Avf /tmp/etc.tar /tmp/log.tar - ``` + Shell > tar -Avf /tmp/etc.tar /tmp/log.tar + ``` - Це означає, що всі файли в "log.tar" будуть додані в кінець "etc.tar". + Це означає, що всі файли в "log.tar" будуть додані в кінець "etc.tar". 2. Додайте файли або каталоги до файлу `.tar`: - ```bash - Shell > tar -rvf /tmp/log.tar /etc/chrony.conf - tar: Removing leading `/' from member names - /etc/chrony.conf - tar: Removing leading `/' from hard link targets + ```bash + Shell > tar -rvf /tmp/log.tar /etc/chrony.conf + tar: Removing leading `/' from member names + /etc/chrony.conf + tar: Removing leading `/' from hard link targets - Shell > tar -rvf /tmp/log.tar /tmp/dir1 - ``` + Shell > tar -rvf /tmp/log.tar /tmp/dir1 + ``` !!! warning "Важливо" @@ -275,55 +275,55 @@ Shell > tar --show-defaults 1. Перегляньте вміст архіву: - ```bash - Shell > tar -tvf /tmp/log.tar + ```bash + Shell > tar -tvf /tmp/log.tar - Shell > tar -tvf /tmp/etc-20241207.tar.gz | less - ``` + Shell > tar -tvf /tmp/etc-20241207.tar.gz | less + ``` #### тип `-d` 1. Порівняйте відмінності файлів: - ```bash - Shell > cd / ; tar -dvf /tmp/etc.tar etc/chrony.conf - etc/chrony.conf + ```bash + Shell > cd / ; tar -dvf /tmp/etc.tar etc/chrony.conf + etc/chrony.conf - Shell > cd / ; tar -dvf /tmp/etc-20241207.tar.gz etc/ - ``` + Shell > cd / ; tar -dvf /tmp/etc-20241207.tar.gz etc/ + ``` - Для методів зберігання, які використовують відносний режим, при використанні типу `-d` змініть шлях до файлу на '/'. + Для методів зберігання, які використовують відносний режим, при використанні типу `-d` змініть шлях до файлу на '/'. #### тип `-u` 1. Якщо існує кілька версій одного файлу, ви можете використовувати тип `-u`: - ```bash - Shell > touch /tmp/tmpfile1 + ```bash + Shell > touch /tmp/tmpfile1 - Shell > tar -rvf /tmp/log.tar /tmp/tmpfile1 + Shell > tar -rvf /tmp/log.tar /tmp/tmpfile1 - Shell > echo "File Name" >> /tmp/tmpfile1 + Shell > echo "File Name" >> /tmp/tmpfile1 - Shell > tar -uvf /tmp/log.tar /tmp/tmpfile1 + Shell > tar -uvf /tmp/log.tar /tmp/tmpfile1 - Shell > tar -tvf /tmp/log.tar - ... - -rw-r--r-- root/root 0 2024-12-07 18:53 tmp/tmpfile1 - -rw-r--r-- root/root 10 2024-12-07 18:54 tmp/tmpfile1 - ``` + Shell > tar -tvf /tmp/log.tar + ... + -rw-r--r-- root/root 0 2024-12-07 18:53 tmp/tmpfile1 + -rw-r--r-- root/root 10 2024-12-07 18:54 tmp/tmpfile1 + ``` #### Тип `--delete` 1. Ви також можете використовувати `--delete`, щоб видалити файли всередині `.tar` файлу. - ```bash - Shell > tar --delete -vf /tmp/log.tar tmp/tmpfile1 + ```bash + Shell > tar --delete -vf /tmp/log.tar tmp/tmpfile1 - Shell > tar --delete -vf /tmp/etc.tar etc/motd.d/ - ``` + Shell > tar --delete -vf /tmp/etc.tar etc/motd.d/ + ``` - При видаленні ви видаляєте з архіву всі файли з однаковою назвою. + При видаленні ви видаляєте з архіву всі файли з однаковою назвою. ## Загальноприйнята термінологія diff --git a/docs/guides/cloud/migration-to-new-azure-images.it.md b/docs/guides/cloud/migration-to-new-azure-images.it.md index 9d2a775689..06842f0116 100644 --- a/docs/guides/cloud/migration-to-new-azure-images.it.md +++ b/docs/guides/cloud/migration-to-new-azure-images.it.md @@ -25,8 +25,8 @@ Questa guida fornisce i passaggi dettagliati per la migrazione delle macchine vi ## Prima di iniziare -- Assicurarsi di avere un backup aggiornato della macchina virtuale. Anche se il processo di migrazione non dovrebbe avere ripercussioni sui dati, un backup è la prassi migliore per qualsiasi modifica del sistema. -- Verificare di disporre delle autorizzazioni necessarie per creare nuove macchine virtuali e gestire quelle esistenti nel proprio account Azure. + - Assicurarsi di avere un backup aggiornato della macchina virtuale. Anche se il processo di migrazione non dovrebbe avere ripercussioni sui dati, un backup è la prassi migliore per qualsiasi modifica del sistema. + - Verificare di disporre delle autorizzazioni necessarie per creare nuove macchine virtuali e gestire quelle esistenti nel proprio account Azure. ## Passo 1: Individuare le macchine virtuali esistenti @@ -80,8 +80,8 @@ Dopo aver confermato che la nuova macchina virtuale funziona correttamente e ave ## Fasi finali -- Verificare che tutti i servizi della nuova macchina virtuale funzionino come previsto. -- Monitorare le prestazioni e lo stato di salute della nuova macchina virtuale per assicurarsi che soddisfi le proprie esigenze. + - Verificare che tutti i servizi della nuova macchina virtuale funzionino come previsto. + - Monitorare le prestazioni e lo stato di salute della nuova macchina virtuale per assicurarsi che soddisfi le proprie esigenze. ## Supporto diff --git a/docs/guides/cloud/migration-to-new-azure-images.uk.md b/docs/guides/cloud/migration-to-new-azure-images.uk.md index 858cf50ff5..edc0eb36a6 100644 --- a/docs/guides/cloud/migration-to-new-azure-images.uk.md +++ b/docs/guides/cloud/migration-to-new-azure-images.uk.md @@ -25,8 +25,8 @@ RESF надає зображення віртуальної машини Rocky L ## Перш ніж почати -- Переконайтеся, що у вас є поточна резервна копія віртуальної машини. Хоча процес міграції не повинен вплинути на ваші дані, створення резервної копії є найкращою практикою для будь-яких системних змін. -- Переконайтеся, що ви маєте необхідні дозволи для створення нових віртуальних машин і керування існуючими в обліковому записі Azure. + - Переконайтеся, що у вас є поточна резервна копія віртуальної машини. Хоча процес міграції не повинен вплинути на ваші дані, створення резервної копії є найкращою практикою для будь-яких системних змін. + - Переконайтеся, що ви маєте необхідні дозволи для створення нових віртуальних машин і керування існуючими в обліковому записі Azure. ## Крок 1. Знайдіть існуючі віртуальні машини @@ -80,8 +80,8 @@ rsync -avzh /path/to/old_VM_data/ user@new_VM_IP:/path/to/new_VM_destination/ ## Останні кроки -- Перевірте, чи всі служби на новій віртуальній машині працюють належним чином. -- Слідкуйте за продуктивністю та справністю нової віртуальної машини, щоб переконатися, що вона відповідає вашим потребам. + - Перевірте, чи всі служби на новій віртуальній машині працюють належним чином. + - Слідкуйте за продуктивністю та справністю нової віртуальної машини, щоб переконатися, що вона відповідає вашим потребам. ## Підтримка diff --git a/docs/guides/cms/wordpress-on-lamp.it.md b/docs/guides/cms/wordpress-on-lamp.it.md index b09632e017..1ca2126854 100644 --- a/docs/guides/cms/wordpress-on-lamp.it.md +++ b/docs/guides/cms/wordpress-on-lamp.it.md @@ -7,8 +7,8 @@ tested_with: 9.2 ## Prerequisiti -- Un sistema Rocky Linux 9.x -- privilegi sudo + - Un sistema Rocky Linux 9.x + - privilegi sudo ## Introduzione diff --git a/docs/guides/cms/wordpress-on-lamp.uk.md b/docs/guides/cms/wordpress-on-lamp.uk.md index 2ccd975b0a..dabb8a2fb7 100644 --- a/docs/guides/cms/wordpress-on-lamp.uk.md +++ b/docs/guides/cms/wordpress-on-lamp.uk.md @@ -7,8 +7,8 @@ tested_with: 9.2 ## Передумови -- Система Rocky Linux 9.x -- привілеї sudo + - Система Rocky Linux 9.x + - привілеї sudo ## Вступ diff --git a/docs/guides/hardware/aqc_bridge_vlan.de.md b/docs/guides/hardware/aqc_bridge_vlan.de.md index a092b4c5ff..c58386f347 100644 --- a/docs/guides/hardware/aqc_bridge_vlan.de.md +++ b/docs/guides/hardware/aqc_bridge_vlan.de.md @@ -22,7 +22,9 @@ Für die Verwendung dieses Verfahrens sind folgende Mindestanforderungen zu beac Sie können die VLAN-Filterung mit einem Befehl deaktivieren: + ``` nmcli con modify enp1s0 ethtool.feature-rx-vlan-filter off + ``` Ersetzen Sie `enp1s0` durch den Namen Ihrer AQC-basierten Netzwerkkarte. diff --git a/docs/guides/hardware/aqc_bridge_vlan.fr.md b/docs/guides/hardware/aqc_bridge_vlan.fr.md index 0ad061dee0..e29fd22c1b 100644 --- a/docs/guides/hardware/aqc_bridge_vlan.fr.md +++ b/docs/guides/hardware/aqc_bridge_vlan.fr.md @@ -22,7 +22,9 @@ Les conditions suivantes sont indispensables pour utiliser cette procédure : Vous pouvez désactiver le filtrage VLAN avec une seule commande : + ``` nmcli con modify enp1s0 ethtool.feature-rx-vlan-filter off + ``` Remplacez `enp1s0` par le nom de votre adaptateur réseau basé sur AQC. diff --git a/docs/guides/hardware/aqc_bridge_vlan.it.md b/docs/guides/hardware/aqc_bridge_vlan.it.md index 782fcec355..cc1ed94cf9 100644 --- a/docs/guides/hardware/aqc_bridge_vlan.it.md +++ b/docs/guides/hardware/aqc_bridge_vlan.it.md @@ -22,7 +22,9 @@ A seguire i requisiti minimi per seguire questa procedura: È possibile disattivare il filtraggio VLAN con un solo comando: + ``` nmcli con modify enp1s0 ethtool.feature-rx-vlan-filter off + ``` Sostituire `enp1s0` con il nome della NIC basata su AQC. diff --git a/docs/guides/hardware/aqc_bridge_vlan.uk.md b/docs/guides/hardware/aqc_bridge_vlan.uk.md index 2baaa1c4ab..f3daf1c502 100644 --- a/docs/guides/hardware/aqc_bridge_vlan.uk.md +++ b/docs/guides/hardware/aqc_bridge_vlan.uk.md @@ -22,7 +22,9 @@ tags: Ви можете вимкнути фільтрування VLAN за допомогою однієї команди: + ``` nmcli con modify enp1s0 ethtool.feature-rx-vlan-filter off + ``` Замініть `enp1s0` на назву вашої мережевої карти на базі AQC. diff --git a/docs/guides/kernel/regenerate_initramfs.de.md b/docs/guides/kernel/regenerate_initramfs.de.md index 50b2079335..abe73128d5 100644 --- a/docs/guides/kernel/regenerate_initramfs.de.md +++ b/docs/guides/kernel/regenerate_initramfs.de.md @@ -34,7 +34,7 @@ Führen Sie als Nächstes `dracut` aus, um `initramfs` neu zu generieren: dracut -f /boot/initramfs-$(uname -r).img $(uname -r) ``` -Dann neu starten: +Starten Sie dann das System neu: ```bash reboot @@ -42,4 +42,4 @@ reboot ## Zusammenfassung -Der Linux-Kernel ist äußerst leistungsstark und modular. Es ist sinnvoll, dass einige Benutzer bestimmte Module zulassen oder verbieten möchten, und die erneute Generierung des `initramfs` ermöglicht dies. +Der Linux-Kernel ist äußerst leistungsstark und modular. Es ist sinnvoll, dass einige Benutzer bestimmte Module zulassen oder verbieten möchten. Die erneute Generierung des `initramfs` macht dies möglich. diff --git a/docs/guides/kernel/regenerate_initramfs.fr.md b/docs/guides/kernel/regenerate_initramfs.fr.md index 064d757359..4ba344c051 100644 --- a/docs/guides/kernel/regenerate_initramfs.fr.md +++ b/docs/guides/kernel/regenerate_initramfs.fr.md @@ -11,11 +11,11 @@ tags: Un `initramfs` est le système de fichiers `root` à l'intérieur d'un noyau Linux pour aider à démarrer le système. Il contient les modules de base nécessaires au démarrage de Linux. -Parfois, un administrateur Linux peut vouloir régénérer les `initramfs`, par exemple s'il souhaite mettre un pilote sur liste noire ou inclure un module hors bande. L'auteur a fait tout cela pour [activer Intel vPro sur un Minisforum MS-01](https://spaceterran.com/posts/step-by-step-guide-enabling-intel-vpro-on-your-minisforum-ms-01-bios/). +Parfois, un administrateur Linux peut vouloir régénérer `initramfs`, par exemple s'il souhaite mettre un pilote sur liste noire ou inclure un module hors bande —out-of-band—. L'auteur a utilisé cette procédure pour [activer Intel vPro sur un Minisforum MS-01](https://spaceterran.com/posts/step-by-step-guide-enabling-intel-vpro-on-your-minisforum-ms-01-bios/). ## Prérequis -Les conditions suivantes sont indispensables pour utiliser cette procédure : +Les conditions suivantes sont indispensables pour utiliser cette procédure : - Un système Rocky Linux ou une machine virtuelle (mais pas un conteneur) - Modifications apportées à la configuration du noyau, telles que mise sur liste noire ou l'ajout d'un module @@ -42,4 +42,4 @@ reboot ## Conclusion -Le noyau Linux est extrêmement puissant et modulaire. Il est logique que certains utilisateurs souhaitent autoriser ou interdire certains modules, et la régénération de `initramfs` permet que cela se produise. +Le noyau Linux est extrêmement puissant et modulaire. Il est logique que certains utilisateurs souhaitent autoriser ou interdire certains modules, et la reconstruction de `initramfs` leur permet de le faire. diff --git a/docs/guides/mirror_management/add_mirror_manager.it.md b/docs/guides/mirror_management/add_mirror_manager.it.md index 2125b8449b..55c0e250cd 100644 --- a/docs/guides/mirror_management/add_mirror_manager.it.md +++ b/docs/guides/mirror_management/add_mirror_manager.it.md @@ -15,7 +15,7 @@ Si ricorda che non è possibile accettare mirror pubblici in paesi soggetti alle Al momento in cui scriviamo (fine 2022), lo spazio di archiviazione richiesto per il mirroring di tutte le versioni attuali e passate di Rocky Linux è di circa 2 TB. -Il nostro mirror master è `rsync://msync.rockylinux.org/rocky/mirror/pub/rocky/`. Per la prima sincronizzazione utilizzate un mirror vicino a voi. Potete trovare tutti i mirror ufficiali [qui](https://mirrors.rockylinux.org). +Il nostro mirror principale è `rsync://msync.rockylinux.org/rocky-linux`. Per la prima sincronizzazione utilizzate un mirror vicino a voi. Potete trovare tutti i mirror ufficiali [qui](https://mirrors.rockylinux.org). Si noti che in futuro potremmo limitare l'accesso al master mirror ufficiale ai mirror pubblici ufficiali. Per questo motivo, se gestite un mirror privato, prendete in considerazione l'opzione `rsyncing` da un mirror pubblico vicino a voi. Inoltre i mirror locali potrebbero essere più veloci da sincronizzare. diff --git a/docs/guides/repositories/pulp_fetch_upload.it.md b/docs/guides/repositories/pulp_fetch_upload.it.md index 0e409ee26e..e81c6d9748 100644 --- a/docs/guides/repositories/pulp_fetch_upload.it.md +++ b/docs/guides/repositories/pulp_fetch_upload.it.md @@ -17,8 +17,8 @@ Gli sviluppatori che utilizzano Rocky Linux hanno spesso bisogno di diversi repo ## Requisiti -- Un sistema Rocky Linux -- In grado di eseguire container + - Un sistema Rocky Linux + - In grado di eseguire container ## Configurazione - Singolo Container diff --git a/docs/guides/repositories/pulp_fetch_upload.uk.md b/docs/guides/repositories/pulp_fetch_upload.uk.md index b5fab183d2..120c9354b3 100644 --- a/docs/guides/repositories/pulp_fetch_upload.uk.md +++ b/docs/guides/repositories/pulp_fetch_upload.uk.md @@ -17,8 +17,8 @@ tags: ## Вимоги -- Система Rocky Linux -- Вміння запускати контейнери + - Система Rocky Linux + - Вміння запускати контейнери ## Налаштування - один контейнер diff --git a/docs/guides/security/ssh_ca_key_signing.fr.md b/docs/guides/security/ssh_ca_key_signing.fr.md index 895fc49c53..15603a1361 100644 --- a/docs/guides/security/ssh_ca_key_signing.fr.md +++ b/docs/guides/security/ssh_ca_key_signing.fr.md @@ -11,11 +11,11 @@ tags: ## Prérequis -- Savoir utiliser les outils de ligne de commande -- Gestion de contenus à partir de la ligne de commande -- Une certaine expérience des clés SSH est souhaitée mais pas indispensable -- Une connaissance de base de SSH et de l'infrastructure de clés publiques est utile mais bien facultative -- Un serveur qui exécute le daemon `sshd`. + - Savoir utiliser les outils de ligne de commande + - Gestion de contenus à partir de la ligne de commande + - Une certaine expérience des clés SSH est souhaitée mais pas indispensable + - Une connaissance de base de SSH et de l'infrastructure de clés publiques est utile mais bien facultative + - Un serveur qui exécute le daemon `sshd`. ## Introduction @@ -25,13 +25,13 @@ Les autorités de certification peuvent également être utilisées pour signer ## Objectifs -- Amélioration de la sécurité des connexions SSH. -- Consolider le processus d'intégration et la gestion des clés. + - Amélioration de la sécurité des connexions SSH. + - Consolider le processus d'intégration et la gestion des clés. ## Notes -- L'auteur de l'article favorise l'éditeur de texte `vim`. L'utilisation d'éditeurs de texte comme `nano` ou autres est tout à fait acceptable. -- L'utilisation de `sudo` ou `root` implique des privilèges supplémentaires. + - L'auteur de l'article favorise l'éditeur de texte `vim`. L'utilisation d'éditeurs de texte comme `nano` ou autres est tout à fait acceptable. + - L'utilisation de `sudo` ou `root` implique des privilèges supplémentaires. ## Connexion initiale @@ -65,9 +65,9 @@ Créer une autorité de certification (clés privées et publiques) et placer la Où : -- **-b** : bytes, longueur de clé en octets -- **-t** : type de clé ; rsa, ed25519, ecdsa... -- **-f** : fichier d'enregistrement de la clé + - **-b** : bytes, longueur de clé en octets + - **-t** : type de clé ; rsa, ed25519, ecdsa... + - **-f** : fichier d'enregistrement de la clé Vous pouvez aussi spécifier la variable `known_hosts` pour tout le système en éditant le fichier de configuration SSH `/etc/ssh/ssh_config` : @@ -94,11 +94,11 @@ Acquisition de la clé publique du serveur via `scp` et signature : Où : -- **-s** : signature de clé -- **-I** : nom identifiant le certificat à des fins de journalisation -- **-n** : identifie le nom (hôte ou utilisateur, un ou plusieurs) associé au certificat (s'il n'est pas spécifié, les certificats sont valables pour tous les utilisateurs ou hôtes) -- **-h** : définit le certificat comme clé hôte, par opposition à une clé cliente -- **-V** : durée de validité du certificat + - **-s** : signature de clé + - **-I** : nom identifiant le certificat à des fins de journalisation + - **-n** : identifie le nom (hôte ou utilisateur, un ou plusieurs) associé au certificat (s'il n'est pas spécifié, les certificats sont valables pour tous les utilisateurs ou hôtes) + - **-h** : définit le certificat comme clé hôte, par opposition à une clé cliente + - **-V** : durée de validité du certificat ## Établir la confiance diff --git a/docs/guides/security/ssh_ca_key_signing.it.md b/docs/guides/security/ssh_ca_key_signing.it.md index e42bb48409..d4b365cf7a 100644 --- a/docs/guides/security/ssh_ca_key_signing.it.md +++ b/docs/guides/security/ssh_ca_key_signing.it.md @@ -11,11 +11,11 @@ tags: ## Prerequisiti -- Capacità di utilizzare strumenti a riga di comando -- Gestione dei contenuti dalla riga di comando -- L'esperienza precedente con la generazione di chiavi SSH è utile ma non necessaria -- Una conoscenza di base di SSH e dell'infrastruttura a chiave pubblica è utile ma non necessaria -- Un server che esegue il demone sshd. + - Capacità di utilizzare strumenti a riga di comando + - Gestione dei contenuti dalla riga di comando + - L'esperienza precedente con la generazione di chiavi SSH è utile ma non necessaria + - Una conoscenza di base di SSH e dell'infrastruttura a chiave pubblica è utile ma non necessaria + - Un server che esegue il demone sshd. ## Introduzione @@ -25,13 +25,13 @@ Le CA possono essere utilizzate anche per firmare le chiavi SSH degli utenti. In ## Obiettivi -- Migliorare la sicurezza delle connessioni SSH. -- Migliorare il processo di inserimento e della gestione delle chiavi. + - Migliorare la sicurezza delle connessioni SSH. + - Migliorare il processo di inserimento e della gestione delle chiavi. ## Note -- Vim è l'editor di testo scelto dall'autore. L'uso di altri editor di testo, come nano o altri, è perfettamente accettabile. -- L'uso di `sudo` o `root` implica privilegi elevati. + - Vim è l'editor di testo scelto dall'autore. L'uso di altri editor di testo, come nano o altri, è perfettamente accettabile. + - L'uso di `sudo` o `root` implica privilegi elevati. ## Connessione iniziale @@ -65,9 +65,9 @@ Creare una CA (chiave privata e pubblica) e inserire la chiave pubblica nel file Dove: -- **-b**: lunghezza della chiave in byte -- **-t**: tipo di chiave: rsa, ed25519, ecdsa... -- **-f**: file chiave di output + - **-b**: lunghezza della chiave in byte + - **-t**: tipo di chiave: rsa, ed25519, ecdsa... + - **-f**: file chiave di output In alternativa, è possibile specificare il file `known_hosts` a livello di sistema modificando il file di configurazione SSH `/etc/ssh/ssh_config`: @@ -94,11 +94,11 @@ Acquisire la chiave pubblica del server tramite `scp` e firmarla: Dove: -- **-s**: chiave di firma -- **-I**: nome che identifica il certificato a scopo di registrazione -- **-n**: identifica il nome (host o utente, uno o più) associato al certificato (se non viene specificato, i certificati sono validi per tutti gli utenti o host) -- **-h**: definisce il certificato come chiave host, anziché come chiave client -- **-V**: periodo di validità del certificato + - **-s**: chiave di firma + - **-I**: nome che identifica il certificato a scopo di registrazione + - **-n**: identifica il nome (host o utente, uno o più) associato al certificato (se non viene specificato, i certificati sono validi per tutti gli utenti o host) + - **-h**: definisce il certificato come chiave host, anziché come chiave client + - **-V**: periodo di validità del certificato ## Stabilire la fiducia diff --git a/docs/guides/security/ssh_ca_key_signing.uk.md b/docs/guides/security/ssh_ca_key_signing.uk.md index 005d0f5d46..289a62d020 100644 --- a/docs/guides/security/ssh_ca_key_signing.uk.md +++ b/docs/guides/security/ssh_ca_key_signing.uk.md @@ -11,11 +11,11 @@ tags: ## Передумови -- Вміння використовувати засоби командного рядка -- Керування вмістом з командного рядка -- Попередній досвід створення ключів SSH корисний, але не обов’язковий -- Базове розуміння SSH та інфраструктури відкритих ключів корисне, але не обов’язкове -- Сервер, на якому працює демон sshd. + - Вміння використовувати засоби командного рядка + - Керування вмістом з командного рядка + - Попередній досвід створення ключів SSH корисний, але не обов’язковий + - Базове розуміння SSH та інфраструктури відкритих ключів корисне, але не обов’язкове + - Сервер, на якому працює демон sshd. ## Вступ @@ -25,13 +25,13 @@ tags: ## Цілі -- Покращення безпеки підключень SSH. -- Покращення процесу реєстрації та управління ключами. + - Покращення безпеки підключень SSH. + - Покращення процесу реєстрації та управління ключами. ## Примітки -- Vim є текстовим редактором за вибором автора. Допускається використання інших текстових редакторів, наприклад nano або інших. -- Використання `sudo` або `root` передбачає підвищені привілеї. + - Vim є текстовим редактором за вибором автора. Допускається використання інших текстових редакторів, наприклад nano або інших. + - Використання `sudo` або `root` передбачає підвищені привілеї. ## Початкове підключення @@ -65,9 +65,9 @@ Are you sure you want to continue connecting (yes/no/[fingerprint])? Де: -- **-b**: довжина ключа в байтах -- **-t**: тип ключа: rsa, ed25519, ecdsa... -- **-f**: вихідний файл ключа + - **-b**: довжина ключа в байтах + - **-t**: тип ключа: rsa, ed25519, ecdsa... + - **-f**: вихідний файл ключа Крім того, ви можете вказати файл `known_hosts` для всієї системи, відредагувавши файл конфігурації SSH `/etc/ssh/ssh_config`: @@ -94,11 +94,11 @@ Host * Де: -- **-s**: ключ підпису -- **-I**: ім'я, яке ідентифікує сертифікат для цілей реєстрації -- **-n**: ідентифікує ім’я (хост або користувач, один або кілька), пов’язане з сертифікатом (якщо не вказано, сертифікати дійсні для всіх користувачів або хостів) -- **-h**: визначає сертифікат як ключ хоста, на відміну від ключа клієнта -- **-V**: термін дії сертифіката + - **-s**: ключ підпису + - **-I**: ім'я, яке ідентифікує сертифікат для цілей реєстрації + - **-n**: ідентифікує ім’я (хост або користувач, один або кілька), пов’язане з сертифікатом (якщо не вказано, сертифікати дійсні для всіх користувачів або хостів) + - **-h**: визначає сертифікат як ключ хоста, на відміну від ключа клієнта + - **-V**: термін дії сертифіката ## Встановлення довіри diff --git a/docs/guides/virtualization/libvirt-rocky.it.md b/docs/guides/virtualization/libvirt-rocky.it.md index 03b49c6525..01de553cec 100644 --- a/docs/guides/virtualization/libvirt-rocky.it.md +++ b/docs/guides/virtualization/libvirt-rocky.it.md @@ -17,8 +17,8 @@ Questo documento fornisce le istruzioni per l'impostazione di libvirt su Rocky L ## Prerequisiti -- Una macchina a 64 bit con Rocky Linux 9. -- Assicuratevi di aver abilitato la virtualizzazione nelle impostazioni del BIOS. Se il comando seguente restituisce un risultato, significa che l'abilitazione della virtualizzazione è stata completata: + - Una macchina a 64 bit con Rocky Linux 9. + - Assicuratevi di aver abilitato la virtualizzazione nelle impostazioni del BIOS. Se il comando seguente restituisce un risultato, significa che l'abilitazione della virtualizzazione è stata completata: ```bash sudo grep -e 'vmx' /proc/cpuinfo @@ -26,13 +26,13 @@ sudo grep -e 'vmx' /proc/cpuinfo ## Configurazione del repository e installazione dei pacchetti -- Attivare il repository EPEL (Extra Packages for Enterprise Linux): + - Attivare il repository EPEL (Extra Packages for Enterprise Linux): ```bash sudo dnf install -y epel-release ``` -- Installare i pacchetti necessari per `libvirt` (opzionalmente per `virt-manager` se si vuole usare una GUI per gestire le macchine virtuali): + - Installare i pacchetti necessari per `libvirt` (opzionalmente per `virt-manager` se si vuole usare una GUI per gestire le macchine virtuali): ```bash sudo dnf install -y bridge-utils virt-top libguestfs-tools bridge-utils virt-viewer qemu-kvm libvirt virt-manager virt-install @@ -40,19 +40,19 @@ sudo dnf install -y bridge-utils virt-top libguestfs-tools bridge-utils virt-vie ## Configurazione utente libvirt -- Aggiungere il proprio utente al gruppo `libvirt`. Ciò consente di gestire le macchine virtuali e di utilizzare comandi come `virt-install` come utente non root: + - Aggiungere il proprio utente al gruppo `libvirt`. Ciò consente di gestire le macchine virtuali e di utilizzare comandi come `virt-install` come utente non root: ```bash sudo usermod -aG libvirt $USER ``` -- Attivare il gruppo `libvirt` utilizzando il comando `newgrp`: + - Attivare il gruppo `libvirt` utilizzando il comando `newgrp`: ```bash sudo newgrp libvirt ``` -- Abilitare e avviare il servizio `libvirtd`: + - Abilitare e avviare il servizio `libvirtd`: ```bash sudo systemctl enable --now libvirtd @@ -60,13 +60,13 @@ sudo systemctl enable --now libvirtd ## Configurazione dell'interfaccia bridge per l'accesso diretto alle macchine virtuali -- Controllare le interfacce attualmente in uso e annotare l'interfaccia principale con connessione a Internet: + - Controllare le interfacce attualmente in uso e annotare l'interfaccia principale con connessione a Internet: ```bash sudo nmcli connection show ``` -- Eliminare l'interfaccia collegata a Internet e tutte le connessioni virtual bridge attualmente presenti: + - Eliminare l'interfaccia collegata a Internet e tutte le connessioni virtual bridge attualmente presenti: ```bash sudo nmcli connection delete @@ -78,43 +78,43 @@ sudo nmcli connection delete Assicurarsi di avere accesso diretto alla macchina. Se si configura la macchina tramite SSH, la connessione verrà interrotta dopo aver eliminato la connessione all'interfaccia principale. ``` -- Creare la nuova connessione bridge: + - Creare la nuova connessione bridge: ```bash sudo nmcli connection add type bridge autoconnect yes con-name ifname ``` -- Assegnare un indirizzo IP statico: + - Assegnare un indirizzo IP statico: ```bash sudo nmcli connection modify ipv4.addresses ipv4.method manual ``` -- Assegnare un indirizzo gateway: + - Assegnare un indirizzo gateway: ```bash sudo nmcli connection modify ipv4.gateway ``` -- Assegnare l'indirizzo DNS: + - Assegnare l'indirizzo DNS: ```bash sudo nmcli connection modify ipv4.dns ``` -- Aggiungere la connessione bridge slave: + - Aggiungere la connessione bridge slave: ```bash sudo nmcli connection add type bridge-slave autoconnect yes con-name ifname master ``` -- Avviare la connessione bridge: + - Avviare la connessione bridge: ```bash sudo nmcli connection up ``` -- Aggiungere la riga `allow all` a `bridge.conf`: + - Aggiungere la riga `allow all` a `bridge.conf`: ```bash sudo tee -a /etc/qemu-kvm/bridge.conf < ``` -- Per forzare lo spegnimento di una macchina virtuale che non risponde, utilizzare il comando `destroy`: + - Per forzare lo spegnimento di una macchina virtuale che non risponde, utilizzare il comando `destroy`: ```bash virsh destroy --domain @@ -160,14 +160,14 @@ virsh destroy --domain ## Come cancellare una VM -- Utilizzare il comando `undefine`: + - Utilizzare il comando `undefine`: ```bash virsh undefine --domain --nvram ``` -- Per ulteriori comandi `virsh`, consultare le pagine `virsh` `man`. + - Per ulteriori comandi `virsh`, consultare le pagine `virsh` `man`. ## Conclusione -- libvirt offre molte possibilità e permette di installare e gestire le macchine virtuali con facilità. Se si hanno ulteriori integrazioni o modifiche a questo documento che si desidera condividere, l'autore vi invita a farlo. + - libvirt offre molte possibilità e permette di installare e gestire le macchine virtuali con facilità. Se si hanno ulteriori integrazioni o modifiche a questo documento che si desidera condividere, l'autore vi invita a farlo. diff --git a/docs/guides/virtualization/libvirt-rocky.uk.md b/docs/guides/virtualization/libvirt-rocky.uk.md index 386200c95c..1123e03576 100644 --- a/docs/guides/virtualization/libvirt-rocky.uk.md +++ b/docs/guides/virtualization/libvirt-rocky.uk.md @@ -17,8 +17,8 @@ tags: ## Передумови -- 4-бітна машина під керуванням Rocky Linux 9. -- Переконайтеся, що віртуалізація включена в налаштуваннях BIOS. Якщо наступна команда повертає вихідні дані, це означає, що активацію віртуалізації завершено: + - 4-бітна машина під керуванням Rocky Linux 9. + - Переконайтеся, що віртуалізація включена в налаштуваннях BIOS. Якщо наступна команда повертає вихідні дані, це означає, що активацію віртуалізації завершено: ```bash sudo grep -e 'vmx' /proc/cpuinfo @@ -26,13 +26,13 @@ sudo grep -e 'vmx' /proc/cpuinfo ## Налаштування репозиторію та встановлення пакетів -- Увімкніть репозиторій EPEL (додаткові пакети для Enterprise Linux): + - Увімкніть репозиторій EPEL (додаткові пакети для Enterprise Linux): ```bash sudo dnf install -y epel-release ``` -- Встановіть необхідні пакунки для `libvirt` (необов’язково для `virt-manager`, якщо ви бажаєте використовувати GUI для керування своїми віртуальними машинами): + - Встановіть необхідні пакунки для `libvirt` (необов’язково для `virt-manager`, якщо ви бажаєте використовувати GUI для керування своїми віртуальними машинами): ```bash sudo dnf install -y bridge-utils virt-top libguestfs-tools bridge-utils virt-viewer qemu-kvm libvirt virt-manager virt-install @@ -40,19 +40,19 @@ sudo dnf install -y bridge-utils virt-top libguestfs-tools bridge-utils virt-vie ## налаштування користувача libvirt -- Додайте свого користувача до групи `libvirt`. Це дає змогу керувати вашими віртуальними машинами та використовувати такі команди, як `virt-install`, як не-root користувач: + - Додайте свого користувача до групи `libvirt`. Це дає змогу керувати вашими віртуальними машинами та використовувати такі команди, як `virt-install`, як не-root користувач: ```bash sudo usermod -aG libvirt $USER ``` -- Активуйте групу `libvirt` за допомогою команди `newgrp`: + - Активуйте групу `libvirt` за допомогою команди `newgrp`: ```bash sudo newgrp libvirt ``` -- Увімкніть і запустіть службу `libvirtd`: + - Увімкніть і запустіть службу `libvirtd`: ```bash sudo systemctl enable --now libvirtd @@ -60,13 +60,13 @@ sudo systemctl enable --now libvirtd ## Налаштування інтерфейсу Bridge для прямого доступу до віртуальних машин -- Перевірте поточні інтерфейси, які використовуються, і запишіть основний інтерфейс із підключенням до Інтернету: + - Перевірте поточні інтерфейси, які використовуються, і запишіть основний інтерфейс із підключенням до Інтернету: ```bash sudo nmcli connection show ``` -- Видаліть інтерфейс, підключений до Інтернету, і будь-які існуючі віртуальні мостові підключення: + - Видаліть інтерфейс, підключений до Інтернету, і будь-які існуючі віртуальні мостові підключення: ```bash sudo nmcli connection delete @@ -78,43 +78,43 @@ sudo nmcli connection delete Переконайтеся, що у вас є прямий доступ до машини. Якщо ви налаштовуєте машину через SSH, з’єднання буде розірвано після видалення з’єднання основного інтерфейсу. ``` -- Створіть нове з'єднання мосту: + - Створіть нове з'єднання мосту: ```bash sudo nmcli connection add type bridge autoconnect yes con-name ifname ``` -- Призначте статичну IP-адресу: + - Призначте статичну IP-адресу: ```bash sudo nmcli connection modify ipv4.addresses ipv4.method manual ``` -- Призначте адресу шлюзу: + - Призначте адресу шлюзу: ```bash sudo nmcli connection modify ipv4.gateway ``` -- Призначте адресу DNS: + - Призначте адресу DNS: ```bash sudo nmcli connection modify ipv4.dns ``` -- Додайте підпорядковане підключення мосту: + - Додайте підпорядковане підключення мосту: ```bash sudo nmcli connection add type bridge-slave autoconnect yes con-name ifname master ``` -- Запустіть з'єднання мостом: + - Запустіть з'єднання мостом: ```bash sudo nmcli connection up ``` -- Додайте рядок `allow all` до `bridge.conf`: + - Додайте рядок `allow all` до `bridge.conf`: ```bash sudo tee -a /etc/qemu-kvm/bridge.conf < ``` -- Щоб примусово вимкнути віртуальну машину, яка не відповідає, скористайтеся командою `destroy`: + - Щоб примусово вимкнути віртуальну машину, яка не відповідає, скористайтеся командою `destroy`: ```bash virsh destroy --domain @@ -160,14 +160,14 @@ virsh destroy --domain ## Як видалити віртуальну машину -- Використовуйте команду `undefine`: + - Використовуйте команду `undefine`: ```bash virsh undefine --domain --nvram ``` -- Щоб отримати додаткові команди `virsh`, перевірте сторінки `man` `virsh`. + - Щоб отримати додаткові команди `virsh`, перевірте сторінки `man` `virsh`. ## Висновок -- libvirt надає багато можливостей і дозволяє легко встановлювати віртуальні машини та керувати ними. Якщо у вас є додаткові доповнення або зміни до цього документа, якими ви хотіли б поділитися, автор люб’язно запрошує вас це зробити. + - libvirt надає багато можливостей і дозволяє легко встановлювати віртуальні машини та керувати ними. Якщо у вас є додаткові доповнення або зміни до цього документа, якими ви хотіли б поділитися, автор люб’язно запрошує вас це зробити. diff --git a/docs/labs/kubernetes-the-hard-way/lab0-README.de.md b/docs/labs/kubernetes-the-hard-way/lab0-README.de.md index 80de276dc6..81762615f0 100644 --- a/docs/labs/kubernetes-the-hard-way/lab0-README.de.md +++ b/docs/labs/kubernetes-the-hard-way/lab0-README.de.md @@ -30,25 +30,25 @@ Die Zielgruppe dieses Tutorials sind alle, die die Grundlagen von Kubernetes und Komponenten-Versionen: -- [kubernetes](https://github.com/kubernetes/kubernetes) v1.32.x -- [containerd](https://github.com/containerd/containerd) v2.0.x -- [cni](https://github.com/containernetworking/cni) v1.6.x -- [etcd](https://github.com/etcd-io/etcd) v3.4.x + - [kubernetes](https://github.com/kubernetes/kubernetes) v1.32.x + - [containerd](https://github.com/containerd/containerd) v2.0.x + - [cni](https://github.com/containernetworking/cni) v1.6.x + - [etcd](https://github.com/etcd-io/etcd) v3.4.x ## Labs Für dieses Tutorial sind vier (4) x86_64-basierte virtuelle oder physische Maschinen erforderlich, die mit demselben Netzwerk verbunden sind. Während im Tutorial x86_64-basierte Maschinen verwendet werden, können Sie die gewonnenen Erkenntnisse auf andere Plattformen anwenden. -- [Voraussetzungen](lab1-prerequisites.md) -- [Setup der Jumpbox](lab2-jumpbox.md) -- [Provisionierung der Rechner Ressourcen](lab3-compute-resources.md) -- [Provisionierung der CA und Generierung von TLS-Zertifikate](lab4-certificate-authority.md) -- [Generierung der Kubernetes Konfigurationsdateien für die Authentifizierung](lab5-kubernetes-configuration-files.md) -- [Generierung der Data Encryption Konfiguration und Schlüssel](lab6-data-encryption-keys.md) -- [Bootstrapping vom etcd-Cluster](lab7-bootstrapping-etcd.md) -- [Bootstrapping the Kubernetes Control Plane](lab8-bootstrapping-kubernetes-controllers.md) -- [Bootstrapping the Kubernetes Worker Nodes](lab9-bootstrapping-kubernetes-workers.md) -- [Configuring kubectl for Remote Access](lab10-configuring-kubectl.md) -- [Provisioning Pod Network Routes](lab11-pod-network-routes.md) -- [Smoke Test](lab12-smoke-test.md) -- [Cleaning Up](lab13-cleanup.md) + - [Voraussetzungen](lab1-prerequisites.md) + - [Setup der Jumpbox](lab2-jumpbox.md) + - [Provisionierung der Rechner Ressourcen](lab3-compute-resources.md) + - [Provisionierung der CA und Generierung von TLS-Zertifikate](lab4-certificate-authority.md) + - [Generierung der Kubernetes Konfigurationsdateien für die Authentifizierung](lab5-kubernetes-configuration-files.md) + - [Generierung der Data Encryption Konfiguration und Schlüssel](lab6-data-encryption-keys.md) + - [Bootstrapping vom etcd-Cluster](lab7-bootstrapping-etcd.md) + - [Bootstrapping the Kubernetes Control Plane](lab8-bootstrapping-kubernetes-controllers.md) + - [Bootstrapping the Kubernetes Worker Nodes](lab9-bootstrapping-kubernetes-workers.md) + - [Configuring kubectl for Remote Access](lab10-configuring-kubectl.md) + - [Provisioning Pod Network Routes](lab11-pod-network-routes.md) + - [Smoke Test](lab12-smoke-test.md) + - [Cleaning Up](lab13-cleanup.md) diff --git a/docs/labs/kubernetes-the-hard-way/lab0-README.fr.md b/docs/labs/kubernetes-the-hard-way/lab0-README.fr.md index 92cb8e367d..3cfed947c0 100644 --- a/docs/labs/kubernetes-the-hard-way/lab0-README.fr.md +++ b/docs/labs/kubernetes-the-hard-way/lab0-README.fr.md @@ -30,25 +30,25 @@ Le public cible de ce tutoriel est toute personne souhaitant comprendre les prin Version des composantes : -- [kubernetes](https://github.com/kubernetes/kubernetes) v1.32.x -- [containerd](https://github.com/containerd/containerd) v2.0.x -- [cni](https://github.com/containernetworking/cni) v1.6.x -- [etcd](https://github.com/etcd-io/etcd) v3.4.x + - [kubernetes](https://github.com/kubernetes/kubernetes) v1.32.x + - [containerd](https://github.com/containerd/containerd) v2.0.x + - [cni](https://github.com/containernetworking/cni) v1.6.x + - [etcd](https://github.com/etcd-io/etcd) v3.4.x ## Ateliers Ce tutoriel nécessite quatre (4) machines virtuelles ou physiques basées sur x86_64 connectées au même réseau. Bien que le tutoriel utilise des machines basées sur x86_64, vous pouvez appliquer les leçons apprises à d'autres plates-formes. -- [Prérequis](lab1-prerequisites.md) -- [Mise en Place de Jumpbox](lab2-jumpbox.md) -- [Provisioning Compute Resources](lab3-compute-resources.md) -- [Provisioning the CA and Generating TLS Certificates](lab4-certificate-authority.md) -- [Generating Kubernetes Configuration Files for Authentication](lab5-kubernetes-configuration-files.md) -- [Generating the Data Encryption Config and Key](lab6-data-encryption-keys.md) -- [Bootstrapping the etcd Cluster](lab7-bootstrapping-etcd.md) -- [Bootstrapping the Kubernetes Control Plane](lab8-bootstrapping-kubernetes-controllers.md) -- [Bootstrapping the Kubernetes Worker Nodes](lab9-bootstrapping-kubernetes-workers.md) -- [Configuring kubectl for Remote Access](lab10-configuring-kubectl.md) -- [Provisioning Pod Network Routes](lab11-pod-network-routes.md) -- [Smoke Test](lab12-smoke-test.md) -- [Cleaning Up](lab13-cleanup.md) + - [Prérequis](lab1-prerequisites.md) + - [Mise en Place de Jumpbox](lab2-jumpbox.md) + - [Provisioning Compute Resources](lab3-compute-resources.md) + - [Provisioning the CA and Generating TLS Certificates](lab4-certificate-authority.md) + - [Generating Kubernetes Configuration Files for Authentication](lab5-kubernetes-configuration-files.md) + - [Generating the Data Encryption Config and Key](lab6-data-encryption-keys.md) + - [Bootstrapping the etcd Cluster](lab7-bootstrapping-etcd.md) + - [Bootstrapping the Kubernetes Control Plane](lab8-bootstrapping-kubernetes-controllers.md) + - [Bootstrapping the Kubernetes Worker Nodes](lab9-bootstrapping-kubernetes-workers.md) + - [Configuring kubectl for Remote Access](lab10-configuring-kubectl.md) + - [Provisioning Pod Network Routes](lab11-pod-network-routes.md) + - [Smoke Test](lab12-smoke-test.md) + - [Cleaning Up](lab13-cleanup.md) diff --git a/docs/labs/kubernetes-the-hard-way/lab0-README.it.md b/docs/labs/kubernetes-the-hard-way/lab0-README.it.md index 65d4837bc3..fbb29cc44d 100644 --- a/docs/labs/kubernetes-the-hard-way/lab0-README.it.md +++ b/docs/labs/kubernetes-the-hard-way/lab0-README.it.md @@ -32,25 +32,25 @@ Kubernetes The Hard Way vi guiderà nel processo di avvio di un cluster Kubernet Versioni dei componenti: -- [kubernetes](https://github.com/kubernetes/kubernetes) v1.32.x -- [containerd](https://github.com/containerd/containerd) v2.0.x -- [cni](https://github.com/containernetworking/cni) v1.6.x -- [etcd](https://github.com/etcd-io/etcd) v3.4.x + - [kubernetes](https://github.com/kubernetes/kubernetes) v1.32.x + - [containerd](https://github.com/containerd/containerd) v2.0.x + - [cni](https://github.com/containernetworking/cni) v1.6.x + - [etcd](https://github.com/etcd-io/etcd) v3.4.x ## Labs Questo tutorial richiede quattro (4) macchine virtuali o fisiche basate su x86_64 collegate alla stessa rete. Sebbene il tutorial utilizzi macchine basate su x86_64, è possibile applicare le nozioni apprese ad altre piattaforme. -- [Prerequisiti](lab1-prerequisites.md) -- [Configurazione della Jumpbox](lab2-jumpbox.md) -- [Provisioning delle risorse di calcolo](lab3-compute-resources.md) -- [Provisioning della CA e generazione dei certificati TLS](lab4-certificate-authority.md) -- [Generazione dei file di configurazione Kubernetes per l'autenticazione](lab5-kubernetes-configuration-files.md) -- [Generazione della configurazione e della chiave di crittografia dei dati](lab6-data-encryption-keys.md) -- [Avvio del cluster etcd](lab7-bootstrapping-etcd.md) -- [Avvio del Control Plane di Kubernetes](lab8-bootstrapping-kubernetes-controllers.md) -- [Avvio dei nodi Worker di Kubernetes](lab9-bootstrapping-kubernetes-workers.md) -- [Configurazione di kubectl per l'accesso remoto](lab10-configuring-kubectl.md) -- [Provisioning delle rotte di rete dei pod](lab11-pod-network-routes.md) -- [Smoke Test](lab12-smoke-test.md) -- [Cleaning Up](lab13-cleanup.md) + - [Prerequisiti](lab1-prerequisites.md) + - [Configurazione della Jumpbox](lab2-jumpbox.md) + - [Provisioning delle risorse di calcolo](lab3-compute-resources.md) + - [Provisioning della CA e generazione dei certificati TLS](lab4-certificate-authority.md) + - [Generazione dei file di configurazione Kubernetes per l'autenticazione](lab5-kubernetes-configuration-files.md) + - [Generazione della configurazione e della chiave di crittografia dei dati](lab6-data-encryption-keys.md) + - [Avvio del cluster etcd](lab7-bootstrapping-etcd.md) + - [Avvio del Control Plane di Kubernetes](lab8-bootstrapping-kubernetes-controllers.md) + - [Avvio dei nodi Worker di Kubernetes](lab9-bootstrapping-kubernetes-workers.md) + - [Configurazione di kubectl per l'accesso remoto](lab10-configuring-kubectl.md) + - [Provisioning delle rotte di rete dei pod](lab11-pod-network-routes.md) + - [Smoke Test](lab12-smoke-test.md) + - [Cleaning Up](lab13-cleanup.md) diff --git a/docs/labs/kubernetes-the-hard-way/lab0-README.uk.md b/docs/labs/kubernetes-the-hard-way/lab0-README.uk.md index a4fa110ca4..b0bc79b964 100644 --- a/docs/labs/kubernetes-the-hard-way/lab0-README.uk.md +++ b/docs/labs/kubernetes-the-hard-way/lab0-README.uk.md @@ -30,25 +30,25 @@ Kubernetes The Hard Way проведе вас через завантаженн Версії компонентів: -- [kubernetes](https://github.com/kubernetes/kubernetes) v1.32.x -- [containerd](https://github.com/containerd/containerd) v2.0.x -- [cni](https://github.com/containernetworking/cni) v1.6.x -- [etcd](https://github.com/etcd-io/etcd) v3.4.x + - [kubernetes](https://github.com/kubernetes/kubernetes) v1.32.x + - [containerd](https://github.com/containerd/containerd) v2.0.x + - [cni](https://github.com/containernetworking/cni) v1.6.x + - [etcd](https://github.com/etcd-io/etcd) v3.4.x ## Labs Для цього посібника потрібні чотири (4) віртуальні або фізичні машини на базі x86_64, підключені до однієї мережі. Хоча підручник використовує машини на базі x86_64, ви можете застосувати отримані уроки на інших платформах. -- [Вимоги](lab1-prerequisites.md) -- [Налаштування Jumpbox](lab2-jumpbox.md) -- [Надання обчислювальних ресурсів](lab3-compute-resources.md) -- [Надання ЦС і генерація сертифікатів TLS](lab4-certificate-authority.md) -- [Створення файлів конфігурації Kubernetes для автентифікації](lab5-kubernetes-configuration-files.md) -- [Створення конфігурації та ключа шифрування даних](lab6-data-encryption-keys.md) -- [Завантаження кластера etcd](lab7-bootstrapping-etcd.md) -- [Завантаження площини керування Kubernetes](lab8-bootstrapping-kubernetes-controllers.md) -- [Завантаження робочих вузлів Kubernetes](lab9-bootstrapping-kubernetes-workers.md) -- [Налаштування kubectl для віддаленого доступу](lab10-configuring-kubectl.md) -- [Надання мережевих маршрутів Pod](lab11-pod-network-routes.md) -- [Smoke Test](lab12-smoke-test.md) -- [Очищення](lab13-cleanup.md) + - [Вимоги](lab1-prerequisites.md) + - [Налаштування Jumpbox](lab2-jumpbox.md) + - [Надання обчислювальних ресурсів](lab3-compute-resources.md) + - [Надання ЦС і генерація сертифікатів TLS](lab4-certificate-authority.md) + - [Створення файлів конфігурації Kubernetes для автентифікації](lab5-kubernetes-configuration-files.md) + - [Створення конфігурації та ключа шифрування даних](lab6-data-encryption-keys.md) + - [Завантаження кластера etcd](lab7-bootstrapping-etcd.md) + - [Завантаження площини керування Kubernetes](lab8-bootstrapping-kubernetes-controllers.md) + - [Завантаження робочих вузлів Kubernetes](lab9-bootstrapping-kubernetes-workers.md) + - [Налаштування kubectl для віддаленого доступу](lab10-configuring-kubectl.md) + - [Надання мережевих маршрутів Pod](lab11-pod-network-routes.md) + - [Smoke Test](lab12-smoke-test.md) + - [Очищення](lab13-cleanup.md) diff --git a/docs/labs/kubernetes-the-hard-way/lab4-certificate-authority.uk.md b/docs/labs/kubernetes-the-hard-way/lab4-certificate-authority.uk.md index 057d2c7132..7ccc6c430c 100644 --- a/docs/labs/kubernetes-the-hard-way/lab4-certificate-authority.uk.md +++ b/docs/labs/kubernetes-the-hard-way/lab4-certificate-authority.uk.md @@ -55,7 +55,9 @@ ca.crt ca.key !!! Tip "Порада" + ``` Щоб переглянути деталі, закодовані у створеному файлі сертифіката (ca.crt), ви можете скористатися цією командою OpenSSL `openssl x509 -in ca.crt -text -noout | less`. + ``` ## Створення сертифікатів клієнта та сервера diff --git a/docs/labs/kubernetes-the-hard-way/lab7-bootstrapping-etcd.uk.md b/docs/labs/kubernetes-the-hard-way/lab7-bootstrapping-etcd.uk.md index e45ff8dcea..0e872529cf 100644 --- a/docs/labs/kubernetes-the-hard-way/lab7-bootstrapping-etcd.uk.md +++ b/docs/labs/kubernetes-the-hard-way/lab7-bootstrapping-etcd.uk.md @@ -64,9 +64,11 @@ chmod 644 /etc/systemd/system/etcd.service !!! Note "Примітка" + ``` Хоча це вважається поганою формою безпеки, вам, можливо, доведеться тимчасово або назавжди вимкнути SELinux, якщо у вас виникнуть проблеми із запуском служби `etcd` `systemd`. Правильним виправленням є дослідження та створення необхідних файлів політики за допомогою таких інструментів, як `ausearch`, `audit2allow` та інших. Команди усувають SELinux і вимикають його, виконавши наступне: + ``` ```bash sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config diff --git a/docs/labs/kubernetes-the-hard-way/lab9-bootstrapping-kubernetes-workers.uk.md b/docs/labs/kubernetes-the-hard-way/lab9-bootstrapping-kubernetes-workers.uk.md index 39ec95b499..d84cb455a5 100644 --- a/docs/labs/kubernetes-the-hard-way/lab9-bootstrapping-kubernetes-workers.uk.md +++ b/docs/labs/kubernetes-the-hard-way/lab9-bootstrapping-kubernetes-workers.uk.md @@ -160,9 +160,11 @@ mv 10-bridge.conf 99-loopback.conf /etc/cni/net.d/ !!! Примітка + ``` Хоча це вважається поганою формою безпеки, вам, можливо, доведеться тимчасово або назавжди вимкнути SELinux, якщо у вас виникнуть проблеми із запуском необхідних служб systemd. Правильним рішенням є дослідження та створення необхідних файлів політики за допомогою таких інструментів, як ausearch, audit2allow тощо. Щоб виправити SELinux із шляху та вимкнути його, запустіть наступне: + ``` ```bash sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config diff --git a/docs/labs/networking/lab8-samba.it.md b/docs/labs/networking/lab8-samba.it.md index 3af062dce1..44d381bfae 100644 --- a/docs/labs/networking/lab8-samba.it.md +++ b/docs/labs/networking/lab8-samba.it.md @@ -44,45 +44,45 @@ Gli esercizi di questo laboratorio si concentrano sulla configurazione di Samba #### Per installare l'applicazione server Samba 0. Utilizzare l'utilità dnf per installare il pacchetto server e client Samba sul server. - Digitare: - ```bash - sudo dnf install -y samba - ``` + Digitare: + ```bash + sudo dnf install -y samba + ``` #### Configurazione di Samba 1. Creare una directory denominata samba-share sotto la cartella /tmp da condividere. Digitare: - ```bash - mkdir /tmp/samba-share - ``` + ```bash + mkdir /tmp/samba-share + ``` 2. Creiamo una configurazione Samba di base per condividere la cartella /tmp/samba-share. - A questo scopo, creare una nuova definizione di condivisione nel file di configurazione di Samba: + A questo scopo, creare una nuova definizione di condivisione nel file di configurazione di Samba: - ```bash - sudo tee -a /etc/samba/smb.conf << 'EOF' - [Shared] - path = /tmp/samba-share - browsable = yes - writable = yes - EOF - ``` + ```bash + sudo tee -a /etc/samba/smb.conf << 'EOF' + [Shared] + path = /tmp/samba-share + browsable = yes + writable = yes + EOF + ``` #### Per avviare e abilitare il servizio Samba 1. Avviare e abilitare i servizi Samba: - ```bash - sudo systemctl start smb nmb - sudo systemctl enable smb nmb - ``` + ```bash + sudo systemctl start smb nmb + sudo systemctl enable smb nmb + ``` 2. Verificare che i demoni utilizzati dal servizio Samba siano in esecuzione: - ```bash - sudo systemctl status smb nmb - ``` + ```bash + sudo systemctl status smb nmb + ``` ## Esercizio 2 @@ -96,27 +96,27 @@ Questo esercizio mostra come creare utenti Samba e impostare le credenziali di a 1. Per prima cosa, creare un normale utente di sistema chiamato sambarockstar. Digitare: - ```bash - sudo useradd sambarockstar - ``` + ```bash + sudo useradd sambarockstar + ``` 2. Verificare che l'utente sia stato creato correttamente. Digitare: - ```bash - id sambarockstar - ``` + ```bash + id sambarockstar + ``` 3. Aggiungere il nuovo utente di sistema sambarockstar al database degli utenti Samba e contemporaneamente impostare una password per l'utente Samba: - ```bash - sudo smbpasswd -a sambarockstar - ``` + ```bash + sudo smbpasswd -a sambarockstar + ``` - Quando viene richiesto, inserire la password selezionata e premere INVIO dopo ogni inserimento. + Quando viene richiesto, inserire la password selezionata e premere INVIO dopo ogni inserimento. 4. Riavviare i servizi Samba: - ```bash - sudo systemctl restart smb nmb - ``` + ```bash + sudo systemctl restart smb nmb + ``` ## Esercizio 3 @@ -128,59 +128,59 @@ In questo esercizio, proveremo ad accedere alla nuova condivisione Samba dallo s 0. Installare Client Utilities eseguendo: - ```bash - sudo dnf -y install cifs-utils - ``` + ```bash + sudo dnf -y install cifs-utils + ``` #### Per creare un punto di montaggio Samba 0. Creare il punto di montaggio: - ```bash - mkdir ~/samba-client - ``` + ```bash + mkdir ~/samba-client + ``` #### Per montare un file system SMB localmente 1. Montare la condivisione Samba in locale: - ```bash - sudo mount -t cifs //localhost/Shared ~/samba-client -o user=sambarockstar - ``` + ```bash + sudo mount -t cifs //localhost/Shared ~/samba-client -o user=sambarockstar + ``` 2. Usare il comando `mount` per elencare tutti i file system di tipo CIFS montati. Digitare: - ```bash - mount -t cifs - ``` - OUTPUT - ```bash - //localhost/Shared on ~/samba-client type cifs (rw,relatime,vers=3.1.1,cache=strict,username=sambarockstar.... - ...... - ``` + ```bash + mount -t cifs + ``` + OUTPUT + ```bash + //localhost/Shared on ~/samba-client type cifs (rw,relatime,vers=3.1.1,cache=strict,username=sambarockstar.... + ...... + ``` 3. Allo stesso modo, utilizzare il comando `df` per verificare che la condivisione montata sia disponibile. Digitare: - ```bash - df -t cifs - ``` + ```bash + df -t cifs + ``` - OUTPUT: + OUTPUT: - ``` - Filesystem 1K-blocks Used Available Use% Mounted on - //localhost/Shared 73364480 17524224 55840256 24% ~/samba-client - ``` + ``` + Filesystem 1K-blocks Used Available Use% Mounted on + //localhost/Shared 73364480 17524224 55840256 24% ~/samba-client + ``` 4. Quindi, elencare il contenuto della condivisione montata. Digitare: - ```bash - ls ~/samba-client - ``` + ```bash + ls ~/samba-client + ``` 5. Creare un file di prova in Share: - ```bash - touch ~/samba-client/testfile.txt - ``` + ```bash + touch ~/samba-client/testfile.txt + ``` ## Esercizio 4 @@ -190,21 +190,21 @@ In questo esercizio, proveremo ad accedere alla nuova condivisione Samba dallo s 1. Rendere la definizione della condivisione samba "Shared" di sola lettura. Questo può essere fatto cambiando il valore del parametro writable da yes a no nel file di configurazione smb.conf. Usiamo un comando `sed` onliner per ottenere questo risultato eseguendo: - ```bash - sudo sed -i'' -E \ - '/\[Shared\]/,+3 s/writable =.*$/writable = no/' /etc/samba/smb.conf - ``` + ```bash + sudo sed -i'' -E \ + '/\[Shared\]/,+3 s/writable =.*$/writable = no/' /etc/samba/smb.conf + ``` 2. Riavviare i servizi Samba: - ```bash - sudo systemctl restart smb nmb - ``` + ```bash + sudo systemctl restart smb nmb + ``` 3. A questo punto, si può testare la scrittura sulla condivisione provando a creare un file sulla condivisione montata: - ```bash - touch ~/samba-client/testfile2.txt - ``` + ```bash + touch ~/samba-client/testfile2.txt + ``` ## Esercizio 5 @@ -215,24 +215,24 @@ Questo esercizio illustra come limitare l'accesso alle condivisioni Samba tramit #### Per creare un nuovo gruppo per l'utente Samba 1. Usare l'utilità groupadd per creare un nuovo gruppo di sistema chiamato rockstars. Nel nostro esempio utilizzeremo questo gruppo per ospitare gli utenti del sistema che possono accedere a una determinata risorsa. Digitare: - ```bash - sudo groupadd rockstars - ``` + ```bash + sudo groupadd rockstars + ``` 2. Aggiungere al gruppo un utente di sistema/Samba esistente. Digitare: - ```bash - sudo usermod -aG rockstars sambarockstar - ``` + ```bash + sudo usermod -aG rockstars sambarockstar + ``` #### Per configurare gli utenti autorizzati nella configurazione di Samba 1. Utilizzare l'utilità sed per aggiungere nuovi parametri utente validi alla definizione di condivisione nel file di configurazione di Samba. Digitare: - ```bash - sudo sed -i '/\[Shared\]/a valid users = @sambagroup' /etc/samba/smb.conf - ``` + ```bash + sudo sed -i '/\[Shared\]/a valid users = @sambagroup' /etc/samba/smb.conf + ``` 2. Riavviare i servizi Samba: - ```bash - sudo systemctl restart smb nmb - ``` + ```bash + sudo systemctl restart smb nmb + ``` 3. Ora testate l'accesso alla condivisione con sambarockstar e verificate l'accesso. ## Esercizio 6 @@ -249,17 +249,17 @@ Presupposti: Configurate la vostra macchina (serverXY) come client Samba per accedere a una directory condivisa su un host separato (serverHQ). 1. Assicurarsi che le necessarie utilità del client Samba siano installate sul sistema locale. - Se necessario, installarli eseguendo: + Se necessario, installarli eseguendo: - ```bash - sudo dnf install samba-client cifs-utils -y - ``` + ```bash + sudo dnf install samba-client cifs-utils -y + ``` 2. Creare un punto di montaggio sul serverXY: - ```bash - mkdir ~/serverHQ-share - ``` + ```bash + mkdir ~/serverHQ-share + ``` #### Per montare la condivisione Samba dal serverHQ @@ -277,15 +277,15 @@ sudo mount -t cifs //serverHQ/sharedFolder ~/serverHQ-share -o user=yourUsername 1. Verificare se la directory condivisa dal serverHQ è stata montata con successo sul computer: - ```bash - ls ~/serverHQ-share - ``` + ```bash + ls ~/serverHQ-share + ``` 2. Provare ad accedere e modificare i file all'interno della condivisione montata. Ad esempio, per creare un nuovo file: - ```bash - touch ~/serverHQ-share/newfile.txt - ``` + ```bash + touch ~/serverHQ-share/newfile.txt + ``` #### Per smontare la condivisione remota diff --git a/docs/labs/networking/lab8-samba.uk.md b/docs/labs/networking/lab8-samba.uk.md index 74e642368f..7936adf257 100644 --- a/docs/labs/networking/lab8-samba.uk.md +++ b/docs/labs/networking/lab8-samba.uk.md @@ -44,45 +44,45 @@ _nmbd_: цей демон забезпечує обслуговування ім #### Щоб встановити серверну програму Samba 0. Використовуйте утиліту dnf, щоб установити сервер Samba та пакет клієнта на вашому сервері. - Впишіть: - ```bash - sudo dnf install -y samba - ``` + Впишіть: + ```bash + sudo dnf install -y samba + ``` #### Щоб налаштувати Samba 1. Створіть каталог під назвою samba-share у папці /tmp, до якої потрібно надати спільний доступ. Впишіть: - ```bash - mkdir /tmp/samba-share - ``` + ```bash + mkdir /tmp/samba-share + ``` 2. Давайте створимо базову конфігурацію Samba для спільного використання папки /tmp/samba-share. - Зробіть це, створивши нове визначення спільного ресурсу у файлі конфігурації Samba: + Зробіть це, створивши нове визначення спільного ресурсу у файлі конфігурації Samba: - ```bash - sudo tee -a /etc/samba/smb.conf << 'EOF' - [Shared] - path = /tmp/samba-share - browsable = yes - writable = yes - EOF - ``` + ```bash + sudo tee -a /etc/samba/smb.conf << 'EOF' + [Shared] + path = /tmp/samba-share + browsable = yes + writable = yes + EOF + ``` #### Щоб запустити та включити службу Samba 1. Запустіть і ввімкніть служби Samba: - ```bash - sudo systemctl start smb nmb - sudo systemctl enable smb nmb - ``` + ```bash + sudo systemctl start smb nmb + sudo systemctl enable smb nmb + ``` 2. Переконайтеся, що демони, які використовує служба Samba, запущені: - ```bash - sudo systemctl status smb nmb - ``` + ```bash + sudo systemctl status smb nmb + ``` ## Завдання 2 @@ -96,27 +96,27 @@ _nmbd_: цей демон забезпечує обслуговування ім 1. Спочатку створіть звичайного системного користувача з іменем sambarockstar. Впишіть: - ```bash - sudo useradd sambarockstar - ``` + ```bash + sudo useradd sambarockstar + ``` 2. Переконайтеся, що користувача було створено правильно. Впишіть: - ```bash - id sambarockstar - ``` + ```bash + id sambarockstar + ``` 3. Додайте нового користувача системи sambarockstar до бази даних користувачів Samba та одночасно встановіть пароль для користувача Samba: - ```bash - sudo smbpasswd -a sambarockstar - ``` + ```bash + sudo smbpasswd -a sambarockstar + ``` - Коли буде запропоновано, введіть вибраний пароль і натисніть ENTER після кожного введення. + Коли буде запропоновано, введіть вибраний пароль і натисніть ENTER після кожного введення. 4. Перезапустіть служби Samba: - ```bash - sudo systemctl restart smb nmb - ``` + ```bash + sudo systemctl restart smb nmb + ``` ## Завдання 3 @@ -128,59 +128,59 @@ _nmbd_: цей демон забезпечує обслуговування ім 0. Встановіть клієнтські утиліти, запустивши: - ```bash - sudo dnf -y install cifs-utils - ``` + ```bash + sudo dnf -y install cifs-utils + ``` #### Щоб створити точку монтування Samba 0. Створіть точку монтування: - ```bash - mkdir ~/samba-client - ``` + ```bash + mkdir ~/samba-client + ``` #### Для локального монтування файлової системи SMB 1. Встановіть Samba Share локально: - ```bash - sudo mount -t cifs //localhost/Shared ~/samba-client -o user=sambarockstar - ``` + ```bash + sudo mount -t cifs //localhost/Shared ~/samba-client -o user=sambarockstar + ``` 2. Використовуйте команду `mount`, щоб отримати список усіх змонтованих файлових систем типу CIFS. Впишіть: - ```bash - mount -t cifs - ``` - ВИХІД - ```bash - //localhost/Shared on ~/samba-client type cifs (rw,relatime,vers=3.1.1,cache=strict,username=sambarockstar.... - ...... - ``` + ```bash + mount -t cifs + ``` + ВИХІД + ```bash + //localhost/Shared on ~/samba-client type cifs (rw,relatime,vers=3.1.1,cache=strict,username=sambarockstar.... + ...... + ``` 3. Подібним чином скористайтеся командою `df`, щоб переконатися, що змонтований спільний ресурс доступний. Впишіть: - ```bash - df -t cifs - ``` + ```bash + df -t cifs + ``` - Вихід: + Вихід: - ``` - Filesystem 1K-blocks Used Available Use% Mounted on - //localhost/Shared 73364480 17524224 55840256 24% ~/samba-client - ``` + ``` + Filesystem 1K-blocks Used Available Use% Mounted on + //localhost/Shared 73364480 17524224 55840256 24% ~/samba-client + ``` 4. Далі перелічіть вміст підключеного спільного ресурсу. Впишіть: - ```bash - ls ~/samba-client - ``` + ```bash + ls ~/samba-client + ``` 5. Створіть тестовий файл у Share: - ```bash - touch ~/samba-client/testfile.txt - ``` + ```bash + touch ~/samba-client/testfile.txt + ``` ## Завдання 4 @@ -190,21 +190,21 @@ _nmbd_: цей демон забезпечує обслуговування ім 1. Зробити визначення спільних ресурсів samba «Shared» доступним лише для читання. Це можна зробити, змінивши значення параметра writable з yes на no у файлі конфігурації smb.conf. Давайте використаємо `sed` onliner, щоб виконати це, виконавши: - ```bash - sudo sed -i'' -E \ - '/\[Shared\]/,+3 s/writable =.*$/writable = no/' /etc/samba/smb.conf - ``` + ```bash + sudo sed -i'' -E \ + '/\[Shared\]/,+3 s/writable =.*$/writable = no/' /etc/samba/smb.conf + ``` 2. Перезапустіть служби Samba: - ```bash - sudo systemctl restart smb nmb - ``` + ```bash + sudo systemctl restart smb nmb + ``` 3. Тепер перевірте запис до спільного ресурсу, спробувавши створити файл на змонтованому спільному ресурсі: - ```bash - touch ~/samba-client/testfile2.txt - ``` + ```bash + touch ~/samba-client/testfile2.txt + ``` ## Завдання 5 @@ -215,24 +215,24 @@ _nmbd_: цей демон забезпечує обслуговування ім #### Щоб створити нову групу для користувача Samba 1. Скористайтеся утилітою groupadd, щоб створити нову системну групу під назвою rockstars. Ми будемо використовувати цю групу в нашому прикладі для користувачів житлової системи, які мають доступ до певного ресурсу. Впишіть: - ```bash - sudo groupadd rockstars - ``` + ```bash + sudo groupadd rockstars + ``` 2. Додайте існуючого користувача системи/Samba до групи. Впишіть: - ```bash - sudo usermod -aG rockstars sambarockstar - ``` + ```bash + sudo usermod -aG rockstars sambarockstar + ``` #### Щоб налаштувати дійсних користувачів у конфігурації Samba 1. Скористайтеся утилітою sed, щоб додати новий дійсний параметр користувача до визначення спільного доступу у файлі конфігурації Samba. Впишіть: - ```bash - sudo sed -i '/\[Shared\]/a valid users = @sambagroup' /etc/samba/smb.conf - ``` + ```bash + sudo sed -i '/\[Shared\]/a valid users = @sambagroup' /etc/samba/smb.conf + ``` 2. Перезапустіть служби Samba: - ```bash - sudo systemctl restart smb nmb - ``` + ```bash + sudo systemctl restart smb nmb + ``` 3. Тепер протестуйте доступ до спільного ресурсу за допомогою sambarockstar і перевірте доступ. ## Завдання 6 @@ -249,17 +249,17 @@ _nmbd_: цей демон забезпечує обслуговування ім Налаштуйте свою машину (serverXY) як клієнт Samba для доступу до спільного каталогу на окремому хості (serverHQ). 1. Переконайтеся, що необхідні утиліти клієнта Samba встановлені у вашій локальній системі. - За потреби встановіть їх, виконавши: + За потреби встановіть їх, виконавши: - ```bash - sudo dnf install samba-client cifs-utils -y - ``` + ```bash + sudo dnf install samba-client cifs-utils -y + ``` 2. Створіть точку монтування на serverXY: - ```bash - mkdir ~/serverHQ-share - ``` + ```bash + mkdir ~/serverHQ-share + ``` #### Щоб підключити Samba Share із serverHQ @@ -277,15 +277,15 @@ sudo mount -t cifs //serverHQ/sharedFolder ~/serverHQ-share -o user=yourUsername 1. Перевірте, чи спільний каталог із serverHQ успішно змонтовано на вашій машині: - ```bash - ls ~/serverHQ-share - ``` + ```bash + ls ~/serverHQ-share + ``` 2. Спробуйте отримати доступ і змінити файли в підключеному спільному ресурсі. Наприклад, щоб створити новий файл: - ```bash - touch ~/serverHQ-share/newfile.txt - ``` + ```bash + touch ~/serverHQ-share/newfile.txt + ``` #### Щоб відключити віддалений спільний доступ diff --git a/docs/labs/systems_administration_I/lab7-software_management.it.md b/docs/labs/systems_administration_I/lab7-software_management.it.md index fb3a078047..370e89481e 100644 --- a/docs/labs/systems_administration_I/lab7-software_management.it.md +++ b/docs/labs/systems_administration_I/lab7-software_management.it.md @@ -116,130 +116,130 @@ https://download.rockylinux.org/pub/rocky/8.8/ 1. Per visualizzare un elenco di tutti i pacchetti attualmente installati sul sistema locale, digitare: - ```bash - $ rpm -qa - python3-gobject-base-* - NetworkManager-* - rocky-repos-* - ...... - ``` + ```bash + $ rpm -qa + python3-gobject-base-* + NetworkManager-* + rocky-repos-* + ...... + ``` - Dovresti vedere un lungo elenco. + Dovresti vedere un lungo elenco. 2. Approfondiamo un po' e scopriamo qualcosa in più su uno dei pacchetti installati sul sistema. Esamineremo NetworkManager. Utilizzeremo le opzioni --query (-q) e --info (-i) con il comando `rpm`. Digitare: - ```bash - $ rpm -qi NetworkManager - Name : NetworkManager - Epoch : 1 - ...... - ``` + ```bash + $ rpm -qi NetworkManager + Name : NetworkManager + Epoch : 1 + ...... + ``` - Si tratta di una grande quantità di informazioni (metadati)! + Si tratta di una grande quantità di informazioni (metadati)! 3. Supponiamo di essere interessati solo al campo Summary del comando precedente. Possiamo utilizzare l'opzione --queryformat di rpm per filtrare le informazioni che otteniamo dall'opzione query. - Ad esempio, per visualizzare solo il campo Summary, digitare: + Ad esempio, per visualizzare solo il campo Summary, digitare: - ```bash - rpm -q --queryformat '%{summary}\n' NetworkManager - ``` + ```bash + rpm -q --queryformat '%{summary}\n' NetworkManager + ``` - Il nome del campo non fa distinzione tra maiuscole e minuscole. + Il nome del campo non fa distinzione tra maiuscole e minuscole. 4. Per visualizzare sia il campo Version che il campo Summary del pacchetto NetworkManager installato, digitare: - ```bash - rpm -q --queryformat '%{version} %{summary}\n' NetworkManager - ``` + ```bash + rpm -q --queryformat '%{version} %{summary}\n' NetworkManager + ``` 5. Digitare il comando per visualizzare le informazioni relative al pacchetto bash installato sul sistema. - ```bash - rpm -qi bash - ``` + ```bash + rpm -qi bash + ``` - !!! note "Nota" + !!! note "Nota" - ``` - Gli esercizi precedenti riguardavano la ricerca e l'utilizzo di pacchetti già installati sul sistema. Nei seguenti esercizi inizieremo a lavorare con pacchetti che non sono ancora stati installati. Utilizzeremo l'applicazione DNF per scaricare i pacchetti che useremo nei passaggi successivi. - ``` + ``` + Gli esercizi precedenti riguardavano la ricerca e l'utilizzo di pacchetti già installati sul sistema. Nei seguenti esercizi inizieremo a lavorare con pacchetti che non sono ancora stati installati. Utilizzeremo l'applicazione DNF per scaricare i pacchetti che useremo nei passaggi successivi. + ``` 6. Innanzitutto, assicurarsi che l'applicazione `wget` non sia già installata sul sistema. Digitare: - ```bash - rpm -q wget - package wget is not installed - ``` + ```bash + rpm -q wget + package wget is not installed + ``` - Sembra che `wget` non sia installato sul nostro sistema demo. + Sembra che `wget` non sia installato sul nostro sistema demo. 7. A partire da Rocky Linux 8.x, il comando `dnf download` ti consentirà di ottenere l'ultimo pacchetto `rpm` per `wget`. Digitare: - ```bash - dnf download wget - ``` + ```bash + dnf download wget + ``` 8. Utilizzare il comando `ls` per assicurarsi che il pacchetto sia stato scaricato nella directory corrente. Digitare: - ```bash - ls -lh wg* - ``` + ```bash + ls -lh wg* + ``` 9. Utilizzare il comando `rpm` per richiedere informazioni sul file wget-\*.rpm scaricato. Digitare: - ```bash - rpm -qip wget-*.rpm - Name : wget - Architecture: x86_64 - Install Date: (not installed) - Group : Applications/Internet - ...... - ``` + ```bash + rpm -qip wget-*.rpm + Name : wget + Architecture: x86_64 + Install Date: (not installed) + Group : Applications/Internet + ...... + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Dal risultato ottenuto nel passaggio precedente, che cos'è esattamente il pacchetto `wget`? Suggerimento: è possibile utilizzare l'opzione di formato query `rpm` per visualizzare il campo di descrizione del pacchetto scaricato. - ``` + ``` + Dal risultato ottenuto nel passaggio precedente, che cos'è esattamente il pacchetto `wget`? Suggerimento: è possibile utilizzare l'opzione di formato query `rpm` per visualizzare il campo di descrizione del pacchetto scaricato. + ``` 10. Se siete interessati al pacchetto `wget files-.rpm`, è possibile elencare tutti i file inclusi nel pacchetto digitando: - ```bash - rpm -qlp wget-*.rpm | head - /etc/wgetrc - /usr/bin/wget - ...... - /usr/share/doc/wget/AUTHORS - /usr/share/doc/wget/COPYING - /usr/share/doc/wget/MAILING-LIST - /usr/share/doc/wget/NEWS - ``` + ```bash + rpm -qlp wget-*.rpm | head + /etc/wgetrc + /usr/bin/wget + ...... + /usr/share/doc/wget/AUTHORS + /usr/share/doc/wget/COPYING + /usr/share/doc/wget/MAILING-LIST + /usr/share/doc/wget/NEWS + ``` 11. Visualizziamo il contenuto del file `/usr/share/doc/wget/AUTHORS` elencato come parte del pacchetto `wget`. Useremo il comando `cat`. Digitare: - ```bash - cat /usr/share/doc/wget/AUTHORS - cat: /usr/share/doc/wget/AUTHORS: No such file or directory - ``` + ```bash + cat /usr/share/doc/wget/AUTHORS + cat: /usr/share/doc/wget/AUTHORS: No such file or directory + ``` - `wget` non è stato [ancora] installato sul nostro sistema demo! E quindi, non possiamo visualizzare il file AUTHORS che è incluso nel pacchetto! + `wget` non è stato [ancora] installato sul nostro sistema demo! E quindi, non possiamo visualizzare il file AUTHORS che è incluso nel pacchetto! 12. Visualizzare l'elenco dei file inclusi in un altro pacchetto (curl) che è _già_ installato sul sistema. Digitare: - ```bash - $ rpm -ql curl - /usr/bin/curl - /usr/lib/.build-id - /usr/lib/.build-id/fc - ...<>... - ``` + ```bash + $ rpm -ql curl + /usr/bin/curl + /usr/lib/.build-id + /usr/lib/.build-id/fc + ...<>... + ``` - !!! note "Nota" + !!! note "Nota" - ``` - Si noterà che nel comando precedente non è stato necessario fare riferimento al nome completo del pacchetto `curl`. Questo perché `curl` è già installato. - ``` + ``` + Si noterà che nel comando precedente non è stato necessario fare riferimento al nome completo del pacchetto `curl`. Questo perché `curl` è già installato. + ``` #### Maggiori informazioni sul nome del pacchetto @@ -283,35 +283,35 @@ https://download.rockylinux.org/pub/rocky/8.8/ 1. È possibile scaricare o ritrovarsi con un file danneggiato o contaminato. Per verificare l'integrità del pacchetto `wget` che avete scaricato. Digitare: - ```bash - rpm -K wget-*.rpm - wget-1.19.5-10.el8.x86_64.rpm: digests signatures OK - ``` + ```bash + rpm -K wget-*.rpm + wget-1.19.5-10.el8.x86_64.rpm: digests signatures OK + ``` - Il messaggio "digests signatures OK" nell'output indica che il pacchetto è corretto. + Il messaggio "digests signatures OK" nell'output indica che il pacchetto è corretto. 2. Siamo maliziosi e modifichiamo deliberatamente il pacchetto scaricato. Questo può essere fatto aggiungendo o rimuovendo qualcosa dal pacchetto originale. Qualsiasi modifica al pacchetto che non sia stata prevista dai creatori originali danneggerà il pacchetto. Modificheremo il file utilizzando il comando `echo` per aggiungere la stringa "haha" al pacchetto. Digitare: - ```bash - echo haha >> wget-1.19.5-10.el8.x86_64.rpm - ``` + ```bash + echo haha >> wget-1.19.5-10.el8.x86_64.rpm + ``` 3. Provate ora a verificare nuovamente l'integrità del pacchetto utilizzando l'opzione -K di rpm. - ```bash - $ rpm -K wget-*.rpm - wget-1.19.5-10.el8.x86_64.rpm: DIGESTS SIGNATURES NOT OK - ``` + ```bash + $ rpm -K wget-*.rpm + wget-1.19.5-10.el8.x86_64.rpm: DIGESTS SIGNATURES NOT OK + ``` - Ora il messaggio è molto diverso. Il messaggio "DIGESTS SIGNATURES NOT OK" avverte chiaramente che non si dovrebbe provare a utilizzare o installare il pacchetto. Non ci si dovrebbe più fidare. + Ora il messaggio è molto diverso. Il messaggio "DIGESTS SIGNATURES NOT OK" avverte chiaramente che non si dovrebbe provare a utilizzare o installare il pacchetto. Non ci si dovrebbe più fidare. 4. Utilizzare il comando `rm` per eliminare il file del pacchetto `wget` danneggiato e scaricare una nuova copia utilizzando `dnf`. Digitare: - ```bash - rm wget-*.rpm && dnf download wget - ``` + ```bash + rm wget-*.rpm && dnf download wget + ``` - Verificare nuovamente che il pacchetto appena scaricato superi i controlli di integrità RPM. + Verificare nuovamente che il pacchetto appena scaricato superi i controlli di integrità RPM. ## Esercizio 3 @@ -329,74 +329,74 @@ In questo esercizio si proverà ad installare il pacchetto `wget` (wget-\*.rpm). 1. Provare ad installare l'applicazione `wget`. Utilizzare le opzioni della riga di comando -ivh di RPM. Digitare: - ```bash - rpm -ivh wget-*.rpm - error: Failed dependencies: - libmetalink.so.3()(64bit) is needed by wget-* - ``` + ```bash + rpm -ivh wget-*.rpm + error: Failed dependencies: + libmetalink.so.3()(64bit) is needed by wget-* + ``` - Subito - un problema di dipendenza! L'output di esempio mostra che `wget` necessita di un file di libreria denominato "libmetalink.so.3" + Subito - un problema di dipendenza! L'output di esempio mostra che `wget` necessita di un file di libreria denominato "libmetalink.so.3" - !!! note "Nota" + !!! note "Nota" - ``` - In base al risultato del test sopra riportato, il pacchetto wget-*.rpm richiede l'installazione del pacchetto libmetalink-*.rpm. In altre parole, libmetalink è un prerequisito per l'installazione di wget-*.rpm. È possibile installare forzatamente il pacchetto wget-*.rpm utilizzando l'opzione "nodeps" se si è assolutamente certi di ciò che si sta facendo, ma in genere questa è una pratica SCONSIGLIATA. - ``` + ``` + In base al risultato del test sopra riportato, il pacchetto wget-*.rpm richiede l'installazione del pacchetto libmetalink-*.rpm. In altre parole, libmetalink è un prerequisito per l'installazione di wget-*.rpm. È possibile installare forzatamente il pacchetto wget-*.rpm utilizzando l'opzione "nodeps" se si è assolutamente certi di ciò che si sta facendo, ma in genere questa è una pratica SCONSIGLIATA. + ``` 2. RPM ci ha gentilmente fornito un indizio su ciò che manca. Ricorderete che `rpm` conosce il cosa e il come, ma non necessariamente il dove. Utilizziamo l'utilità `dnf` per cercare di capire il nome del pacchetto che fornisce la libreria mancante. Digitare: - ```bash - $ dnf whatprovides libmetalink.so.3 - ...... - libmetalink-* : Metalink library written in C - Repo : baseos - Matched from: - Provide : libmetalink.so.3 - ``` + ```bash + $ dnf whatprovides libmetalink.so.3 + ...... + libmetalink-* : Metalink library written in C + Repo : baseos + Matched from: + Provide : libmetalink.so.3 + ``` 3. Dal risultato ottenuto, è necessario scaricare il pacchetto `libmetalink` che fornisce la libreria mancante. In particolare, desideriamo la versione a 64 bit della libreria. Richiediamo l'aiuto di un'utilità separata (`dnf`) per trovare e scaricare il pacchetto per la nostra architettura demo a 64 bit (x86_64). Digitare: - ```bash - dnf download --arch x86_64 libmetalink - ``` + ```bash + dnf download --arch x86_64 libmetalink + ``` 4. Ora si dovrebbero avere almeno 2 pacchetti rpm nella directory di lavoro. Utilizzare il comando `ls` per verificarlo. 5. Installare la dipendenza mancante `libmetalink`. Digitare: - ```bash - sudo rpm -ivh libmetalink-*.rpm - ``` + ```bash + sudo rpm -ivh libmetalink-*.rpm + ``` 6. Ora che la dipendenza è stata installata, possiamo tornare al nostro obiettivo iniziale, ovvero installare il pacchetto `wget`. Digitare: - ```bash - sudo rpm -ivh wget-*.rpm - ``` + ```bash + sudo rpm -ivh wget-*.rpm + ``` - !!! note "Nota" + !!! note "Nota" - ```` - RPM supporta le transazioni. Negli esercizi precedenti, avremmo potuto eseguire una singola transazione rpm che includesse il pacchetto originale che volevamo installare e tutti i pacchetti e le librerie da cui dipendeva. Sarebbe stato sufficiente un singolo comando come quello riportato di seguito: + ```` + RPM supporta le transazioni. Negli esercizi precedenti, avremmo potuto eseguire una singola transazione rpm che includesse il pacchetto originale che volevamo installare e tutti i pacchetti e le librerie da cui dipendeva. Sarebbe stato sufficiente un singolo comando come quello riportato di seguito: - ```bash - rpm -Uvh wget-*.rpm libmetalink-*.rpm - ``` - ```` + ```bash + rpm -Uvh wget-*.rpm libmetalink-*.rpm + ``` + ```` 7. È arrivato il momento della verità. Provare ad eseguire il programma `wget` senza alcuna opzione per verificare se è installato. Digitare: - ```bash - wget - ``` + ```bash + wget + ``` 8. Vediamo `wget` in azione. Utilizzare `wget` per scaricare un file da Internet dalla riga di comando. Digitare: - ```bash - wget https://kernel.org - ``` + ```bash + wget https://kernel.org + ``` - Questo scaricherà il file index.html predefinito dal sito web kernel.org! + Questo scaricherà il file index.html predefinito dal sito web kernel.org! 9. Utilizzare `rpm` per visualizzare un elenco di tutti i file inclusi nell'applicazione `wget`. @@ -406,16 +406,16 @@ In questo esercizio si proverà ad installare il pacchetto `wget` (wget-\*.rpm). 12. È necessario installare il pacchetto `libmetalink` per installare `wget`. Prova a eseguire o lanciare `libmetalink` dalla riga di comando. Digitare: - ```bash - libmetalink - -bash: libmetalink: command not found - ``` + ```bash + libmetalink + -bash: libmetalink: command not found + ``` - !!! attention "Attenzione" + !!! attention "Attenzione" - ``` - Che succede? Perché non si riescs ad eseguire `libmetalink`? - ``` + ``` + Che succede? Perché non si riescs ad eseguire `libmetalink`? + ``` #### Importazione di una chiave pubblica tramite `rpm` @@ -443,31 +443,31 @@ In questo esercizio si proverà ad utilizzare `rpm` per disinstallare alcuni pac 1. Disinstallare il pacchetto `libmetalink` dal sistema. Digitare: - ```bash - sudo rpm -e libmetalink - ``` + ```bash + sudo rpm -e libmetalink + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Spiegate perché non è stato possibile rimuovere il pacchetto? - ``` + ``` + Spiegate perché non è stato possibile rimuovere il pacchetto? + ``` 2. Il modo corretto e pulito per rimuovere i pacchetti utilizzando RPM è quello di rimuovere i pacchetti insieme alle loro dipendenze. Per rimuovere il pacchetto `libmetalink` dovremo rimuovere anche il pacchetto `wget` che dipende da esso. Digitare: - ```bash - sudo rpm -e libmetalink wget - ``` + ```bash + sudo rpm -e libmetalink wget + ``` - !!! note "Nota" + !!! note "Nota" - ``` - Se si desidera disinstallare il pacchetto che dipende da libmetalink e rimuovere *forzatamente* il pacchetto dal sistema, è possibile utilizzare l'opzione `--nodeps` di rpm come segue: `$ sudo rpm -e --nodeps libmetalink`. + ``` + Se si desidera disinstallare il pacchetto che dipende da libmetalink e rimuovere *forzatamente* il pacchetto dal sistema, è possibile utilizzare l'opzione `--nodeps` di rpm come segue: `$ sudo rpm -e --nodeps libmetalink`. - **i.** L'opzione "nodeps" significa Nessuna dipendenza. Ovvero, ignora tutte le dipendenze. - **ii.** Quanto sopra illustra come rimuovere forzatamente un pacchetto dal sistema. A volte è necessario farlo, ma in genere *non è una buona pratica*. - **iii.** La rimozione forzata di un pacchetto "xyz" da cui dipende un altro pacchetto installato "abc" rende di fatto il pacchetto "abc" inutilizzabile o in qualche modo danneggiato. - ``` + **i.** L'opzione "nodeps" significa Nessuna dipendenza. Ovvero, ignora tutte le dipendenze. + **ii.** Quanto sopra illustra come rimuovere forzatamente un pacchetto dal sistema. A volte è necessario farlo, ma in genere *non è una buona pratica*. + **iii.** La rimozione forzata di un pacchetto "xyz" da cui dipende un altro pacchetto installato "abc" rende di fatto il pacchetto "abc" inutilizzabile o in qualche modo danneggiato. + ``` ## Esercizio 5 @@ -524,66 +524,66 @@ Assumendo che sia già stata disinstallata l'utilità `wget` da un esercizio, ut 1. Per prima cosa, assicurarsi che `wget` e `libmetalink` siano stati disinstallati dal sistema. Digitare: - ```bash - sudo rpm -e wget libmetalink - ``` + ```bash + sudo rpm -e wget libmetalink + ``` - Dopo la rimozione, se si prova a eseguire `wget` dalla CLI, viene visualizzato un messaggio simile a _wget: command not found_ + Dopo la rimozione, se si prova a eseguire `wget` dalla CLI, viene visualizzato un messaggio simile a _wget: command not found_ 2. Ora usare `dnf` per installare `wget`. Digitare: - ```bash - sudo dnf -y install wget - Dependencies resolved. - ...... - Installed: - libmetalink-* wget-* - Complete! - ``` + ```bash + sudo dnf -y install wget + Dependencies resolved. + ...... + Installed: + libmetalink-* wget-* + Complete! + ``` - !!! tip "Suggerimento" + !!! tip "Suggerimento" - ``` - L'opzione "-y" utilizzata nel comando precedente sopprime il prompt "[y/N]" che richiede di confermare l'azione che `dnf` sta per eseguire. Ciò significa che tutte le azioni di conferma (o risposte interattive) saranno "sì" (y). - ``` + ``` + L'opzione "-y" utilizzata nel comando precedente sopprime il prompt "[y/N]" che richiede di confermare l'azione che `dnf` sta per eseguire. Ciò significa che tutte le azioni di conferma (o risposte interattive) saranno "sì" (y). + ``` 3. DNF offre un'opzione "Environment Group" che semplifica l'aggiunta di un nuovo set di funzionalità a un sistema. Per aggiungere la funzionalità, in genere è necessario installare alcuni pacchetti singolarmente, ma utilizzando `dnf`, è sufficiente conoscere il nome o la descrizione della funzionalità desiderata. Utilizzare `dnf` per visualizzare un elenco dei gruppi disponibili. Digitare: - ```bash - dnf group list - ``` + ```bash + dnf group list + ``` 4. Il nostro interesse è rivolto al gruppo/funzionalità “ Development Tools”. Cerchiamo di ottenere maggiori informazioni su quel gruppo. Digitare: - ```bash - dnf group info "Development Tools" - ``` + ```bash + dnf group info "Development Tools" + ``` 5. Successivamente, avremo bisogno di alcuni programmi del gruppo "Development Tools". Installare il gruppo “Development Tools” utilizzando `dnf` eseguendo: - ```bash - sudo dnf -y group install "Development Tools" - ``` + ```bash + sudo dnf -y group install "Development Tools" + ``` #### Uso di `dnf` per disinstallare i pacchetti 1. Per utilizzare `dnf` per disinstallare il pacchetto `wget`, digitare: - ```bash - sudo dnf -y remove wget - ``` + ```bash + sudo dnf -y remove wget + ``` 2. Utilizzare `dnf` per assicurarsi che il pacchetto sia stato effettivamente rimosso dal sistema. Digitare: - ```bash - sudo dnf -y remove wget - ``` + ```bash + sudo dnf -y remove wget + ``` 3. Provare ad utilizzare/eseguire `wget`. Digitare: - ```bash - wget - ``` + ```bash + wget + ``` #### Uso di `dnf` per l'aggiornamento dei pacchetti @@ -591,33 +591,33 @@ DNF può verificare e installare l'ultima versione dei singoli pacchetti disponi 1. Utilizzare l'opzione list con `dnf` per visualizzare le versioni disponibili del programma `wget` sul sistema. Digitare: - ```bash - dnf list wget - ``` + ```bash + dnf list wget + ``` 2. Se si vuole solo verificare se siano disponibili versioni aggiornate per un pacchetto, utilizzare l'opzione check-update con `dnf`. Ad esempio, per il pacchetto `wget`, digitare: - ```bash - dnf check-update wget - ``` + ```bash + dnf check-update wget + ``` 3. Ora, elencare tutte le versioni disponibili per il pacchetto kernel del sistema. Digitare: - ```bash - sudo dnf list kernel - ``` + ```bash + sudo dnf list kernel + ``` 4. Successivamente, verificare se sono disponibili pacchetti aggiornati per il pacchetto kernel installato. Digitare: - ```bash - dnf check-update kernel - ``` + ```bash + dnf check-update kernel + ``` 5. Gli aggiornamenti dei pacchetti possono essere dovuti a correzioni di bug, nuove funzionalità o patch di sicurezza. Per verificare se sono disponibili aggiornamenti relativi alla sicurezza per il pacchetto kernel, digitare: - ```bash - dnf --security check-update kernel - ``` + ```bash + dnf --security check-update kernel + ``` #### Uso di `dnf` per gli aggiornamenti del sistema @@ -625,21 +625,21 @@ DNF può essere utilizzato per verificare e installare le versioni più recenti 1. Per verificare se sono disponibili aggiornamenti per i pacchetti attualmente installati sul sistema, digitare: - ```bash - dnf check-update - ``` + ```bash + dnf check-update + ``` 2. Per verificare se sono disponibili aggiornamenti relativi alla sicurezza per tutti i pacchetti installati sul sistema, digitare: - ```bash - dnf --security check-update - ``` + ```bash + dnf --security check-update + ``` 3. Per aggiornare tutti i pacchetti installati sul sistema alle versioni più recenti disponibili per la tua distribuzione, eseguire: - ```bash - dnf -y check-update - ``` + ```bash + dnf -y check-update + ``` ## Esercizio 6 @@ -655,7 +655,7 @@ I seguenti esercizi saranno basati sul venerabile codice sorgente del progetto H 1. Utilizzare `curl` per scaricare il codice sorgente più recente dell'applicazione `hello`. Scaricare e salvare il file nella cartella Download. - https://ftp.gnu.org/gnu/hello/hello-2.12.tar.gz + https://ftp.gnu.org/gnu/hello/hello-2.12.tar.gz #### Decomprimere il file @@ -663,41 +663,41 @@ I seguenti esercizi saranno basati sul venerabile codice sorgente del progetto H 2. Decomprimere (un-tar) il tarball utilizzando il programma `tar`. Digitare: - ```bash - tar -xvzf hello-2.12.tar.gz - ``` + ```bash + tar -xvzf hello-2.12.tar.gz + ``` - OUTPUT: + OUTPUT: - ```bash - $ tar -xvzf hello-2.12.tar.gz - hello-2.12/ - hello-2.12/NEWS - hello-2.12/AUTHORS - hello-2.12/hello.1 - hello-2.12/THANKS - ...... - ``` + ```bash + $ tar -xvzf hello-2.12.tar.gz + hello-2.12/ + hello-2.12/NEWS + hello-2.12/AUTHORS + hello-2.12/hello.1 + hello-2.12/THANKS + ...... + ``` 3. Utilizzare il comando `ls` per visualizzare il contenuto della directory corrente. - Durante la decompressione dovrebbe essere stata creata una nuova directory denominata hello-2.12. + Durante la decompressione dovrebbe essere stata creata una nuova directory denominata hello-2.12. 4. Passare a quella directory ed elencarne il suo contenuto. Digitare: - ```bash - cd hello-2.12 ; ls - ``` + ```bash + cd hello-2.12 ; ls + ``` 5. È sempre buona norma consultare eventuali istruzioni di installazione speciali fornite insieme al codice sorgente. Questi file hanno solitamente nomi come: INSTALL, README e così via. - Utilizzare un pager per aprire il file INSTALL e leggerlo. Digitare: + Utilizzare un pager per aprire il file INSTALL e leggerlo. Digitare: - ```bash - less INSTALL - ``` + ```bash + less INSTALL + ``` - Uscire dal pager quando si è finito di esaminare il file. + Uscire dal pager quando si è finito di esaminare il file. #### Configurazione del pacchetto @@ -719,33 +719,33 @@ sudo dnf -y group install "Development Tools" 2. Per visualizzare tutte le opzioni che si possono attivare o disattivare nel programma `hello`, digitare: - ```bash - ./configure --help - ``` + ```bash + ./configure --help + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Dall'output del comando, cosa fa l'opzione "--prefix"? - ``` + ``` + Dall'output del comando, cosa fa l'opzione "--prefix"? + ``` 3. Se si è soddisfatti delle opzioni predefinite offerte dallo script di configurazione. Digitare: - ```bash - ./configure - ``` + ```bash + ./configure + ``` - !!! note "Nota" + !!! note "Nota" - ``` - Si spera che la fase di configurazione sia andata liscia e che si possa passare alla fase di compilazione. + ``` + Si spera che la fase di configurazione sia andata liscia e che si possa passare alla fase di compilazione. - Se durante la fase di configurazione vengono visualizzati degli errori, è necessario esaminare attentamente la parte finale dell'output per individuare la causa dell'errore. Gli errori sono *talvolta* intuitivi e facili da correggere. Ad esempio, potrebbe essere visualizzato un errore simile al seguente: + Se durante la fase di configurazione vengono visualizzati degli errori, è necessario esaminare attentamente la parte finale dell'output per individuare la causa dell'errore. Gli errori sono *talvolta* intuitivi e facili da correggere. Ad esempio, potrebbe essere visualizzato un errore simile al seguente: - configure: error: no acceptable C compiler found in $PATH + configure: error: no acceptable C compiler found in $PATH - L'errore sopra riportato significa semplicemente che non hai un compilatore C (ad esempio, `gcc`) installato sul sistema o che il compilatore è installato in una posizione che non è inclusa nella variabile PATH. - ``` + L'errore sopra riportato significa semplicemente che non hai un compilatore C (ad esempio, `gcc`) installato sul sistema o che il compilatore è installato in una posizione che non è inclusa nella variabile PATH. + ``` #### Compilazione del pacchetto @@ -753,21 +753,21 @@ Nei passaggi seguenti si costruirà l'applicazione hello. È qui che tornano uti 1. Utilizzare il comando make per compilare il pacchetto dopo aver eseguito lo script "configure". Digitare: - ```bash - make - ``` + ```bash + make + ``` - OUTPUT: + OUTPUT: - ```bash - $ make - ...... - gcc -g -O2 -o hello src/hello.o ./lib/libhello.a - make[2]: Leaving directory '/home/rocky/hello-2.12' - make[1]: Leaving directory '/home/rocky/hello-2.12' - ``` + ```bash + $ make + ...... + gcc -g -O2 -o hello src/hello.o ./lib/libhello.a + make[2]: Leaving directory '/home/rocky/hello-2.12' + make[1]: Leaving directory '/home/rocky/hello-2.12' + ``` - Se tutto è andato bene, questo importante passaggio “make” è il passo che contribuirà a generare il binario finale dell’applicazione “hello”. + Se tutto è andato bene, questo importante passaggio “make” è il passo che contribuirà a generare il binario finale dell’applicazione “hello”. 2. Elencare nuovamente i file nella directory di lavoro corrente. Si dovrebbero visualizzare alcuni file appena creati, incluso il programma `hello`. @@ -777,51 +777,51 @@ Oltre ad altre attività di manutenzione, la fase finale dell'installazione prev 1. Per installare l'applicazione hello, eseguire il comando make install. Digitare: - ```bash - sudo make install - ``` + ```bash + sudo make install + ``` - Questo installerà il pacchetto nella posizione specificata dall'argomento predefinito prefisso (--prefix) che è stato utilizzato in precedenza con lo script “configure”. Se non è stato impostato alcun --prefix, verrà utilizzato il prefisso predefinito `/usr/local/`. + Questo installerà il pacchetto nella posizione specificata dall'argomento predefinito prefisso (--prefix) che è stato utilizzato in precedenza con lo script “configure”. Se non è stato impostato alcun --prefix, verrà utilizzato il prefisso predefinito `/usr/local/`. #### Esecuzione del programma hello 1. Utilizzare il comando `whereis` per vedere dove si trova il programma `hello` nel sistema. Digitare: - ```bash - whereis hello - ``` + ```bash + whereis hello + ``` 2. Provare a eseguire l'applicazione `hello` per verificarne il funzionamento. Digitare: - ```bash - hello - ``` + ```bash + hello + ``` 3. Eseguire nuovamente `hello` con l'opzione `--help` per vedere le altre funzioni disponibili. 4. Ora, utilizzando `sudo`, eseguire nuovamente `hello` come superutente. Digitare: - ```bash - sudo hello - ``` + ```bash + sudo hello + ``` - OUTPUT: + OUTPUT: - ```bash - sudo: hello: comando non trovato - ``` + ```bash + sudo: hello: comando non trovato + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Individua la causa dell'errore che si verifica quando provi a eseguire `hello` con `sudo`. Risolvi il problema e assicurati che il programma `hello` possa essere utilizzato con `sudo`. - ``` + ``` + Individua la causa dell'errore che si verifica quando provi a eseguire `hello` con `sudo`. Risolvi il problema e assicurati che il programma `hello` possa essere utilizzato con `sudo`. + ``` - !!! tip "Suggerimento" + !!! tip "Suggerimento" - ``` - È buona norma testare un programma come utente normale per assicurarsi che gli utenti normali possano effettivamente utilizzarlo. È possibile che i permessi sul file binario siano impostati in modo errato, consentendo solo al superutente di utilizzare i programmi. Questo ovviamente presuppone che si desideri effettivamente che gli utenti normali possano utilizzare il programma. - ``` + ``` + È buona norma testare un programma come utente normale per assicurarsi che gli utenti normali possano effettivamente utilizzarlo. È possibile che i permessi sul file binario siano impostati in modo errato, consentendo solo al superutente di utilizzare i programmi. Questo ovviamente presuppone che si desideri effettivamente che gli utenti normali possano utilizzare il programma. + ``` 5. Ecco fatto. Questo esercizio è terminato! @@ -839,48 +839,48 @@ Prendiamo come esempio il programma di sincronizzazione dell'ora `chrony` per il 1. Per dimostrare come funziona la verifica del pacchetto `rpm`, apportare una modifica al file di configurazione di chrony - `/etc/chrony.conf`. (It is assumed that you have installed chrony). Aggiungiamo 2 innocui simboli di commento `##` alla fine del file. Digitare: - ```bash - echo -e "##" | sudo tee -a /etc/chrony.conf - ``` + ```bash + echo -e "##" | sudo tee -a /etc/chrony.conf + ``` 2. Ora eseguire il comando `rpm` con l'opzione `--verify`. Digitare: - ```bash - rpm -V chrony - ``` + ```bash + rpm -V chrony + ``` - OUTPUT: + OUTPUT: - ```bash - S.5....T. c /etc/chrony.conf - ``` + ```bash + S.5....T. c /etc/chrony.conf + ``` - Il risultato è suddiviso in 3 colonne separate. + Il risultato è suddiviso in 3 colonne separate. - - **Prima colonna (S.5.... T.)** + - **Prima colonna (S.5.... T.)** - L'output di esempio - `S.5....T.` indica i 9 campi utilizzati per indicare informazioni utili sulla validità dei file in un pacchetto RPM. Qualsiasi campo o caratteristica che ha superato un determinato controllo/test è indicato da un “.”. + L'output di esempio - `S.5....T.` indica i 9 campi utilizzati per indicare informazioni utili sulla validità dei file in un pacchetto RPM. Qualsiasi campo o caratteristica che ha superato un determinato controllo/test è indicato da un “.”. - Di seguito sono descritti questi 9 differenti campi o controlli: + Di seguito sono descritti questi 9 differenti campi o controlli: - - S: Se è stata modificata la dimensione del file. - - M: Se il tipo di file o i permessi del file (rwx) sono stati modificati. - - 5: Se il checksum MD5 del file è stato modificato. - - D: Se il numero del dispositivo è stato modificato. - - L: Se il percorso del file è stato modificato. - - U: Se il proprietario del file è stato modificato. - - G: Se il gruppo a cui appartiene il file è stato modificato. - - T: Se l'ora di modifica (mTime) del file è stata modificata. - - P: Se la funzione del programma è stata modificata. + - S: Se è stata modificata la dimensione del file. + - M: Se il tipo di file o i permessi del file (rwx) sono stati modificati. + - 5: Se il checksum MD5 del file è stato modificato. + - D: Se il numero del dispositivo è stato modificato. + - L: Se il percorso del file è stato modificato. + - U: Se il proprietario del file è stato modificato. + - G: Se il gruppo a cui appartiene il file è stato modificato. + - T: Se l'ora di modifica (mTime) del file è stata modificata. + - P: Se la funzione del programma è stata modificata. - - **Seconda Colonna (c)** + - **Seconda Colonna (c)** - - **c**: Indica le modifiche apportate al file di configurazione. Può anche assumere i seguenti valori: - - d: file di documentazione. - - g: file ghost. Se ne vedono pochissimi. - - l: file di licenza. - - r: file readme. + - **c**: Indica le modifiche apportate al file di configurazione. Può anche assumere i seguenti valori: + - d: file di documentazione. + - g: file ghost. Se ne vedono pochissimi. + - l: file di licenza. + - r: file readme. - - **Terza colonna (/etc/chrony.conf)** + - **Terza colonna (/etc/chrony.conf)** - - **/etc/chrony.conf**: Rappresenta il percorso del file modificato. + - **/etc/chrony.conf**: Rappresenta il percorso del file modificato. diff --git a/docs/labs/systems_administration_I/lab7-software_management.uk.md b/docs/labs/systems_administration_I/lab7-software_management.uk.md index 0ce17e4677..8aea1b2375 100644 --- a/docs/labs/systems_administration_I/lab7-software_management.uk.md +++ b/docs/labs/systems_administration_I/lab7-software_management.uk.md @@ -116,130 +116,130 @@ https://download.rockylinux.org/pub/rocky/8.8/ 1. Щоб переглянути список усіх пакетів, які зараз встановлено у вашій локальній системі, введіть: - ```bash - $ rpm -qa - python3-gobject-base-* - NetworkManager-* - rocky-repos-* - ...... - ``` + ```bash + $ rpm -qa + python3-gobject-base-* + NetworkManager-* + rocky-repos-* + ...... + ``` - Ви повинні побачити довгий список. + Ви повинні побачити довгий список. 2. Давайте заглибимося глибше та дізнаємося більше про один із пакетів, встановлених у системі. Ми розглянемо NetworkManager. Ми будемо використовувати параметри --query (-q) і --info (-i) з командою `rpm`. Впишіть: - ```bash - $ rpm -qi NetworkManager - Name : NetworkManager - Epoch : 1 - ...... - ``` + ```bash + $ rpm -qi NetworkManager + Name : NetworkManager + Epoch : 1 + ...... + ``` - Це величезна кількість інформації (метаданих)! + Це величезна кількість інформації (метаданих)! 3. Скажімо, нас цікавить лише поле «Підсумок» попередньої команди. Ми можемо використовувати опцію --queryformat rpm, щоб фільтрувати інформацію, яку ми отримуємо з опції запиту. - Наприклад, щоб переглянути лише поле Summary, введіть: + Наприклад, щоб переглянути лише поле Summary, введіть: - ```bash - rpm -q --queryformat '%{summary}\n' NetworkManager - ``` + ```bash + rpm -q --queryformat '%{summary}\n' NetworkManager + ``` - Назва поля нечутлива до регістру. + Назва поля нечутлива до регістру. 4. Щоб переглянути поля Version та Summary встановленого типу пакета NetworkManager: - ```bash - rpm -q --queryformat '%{version} %{summary}\n' NetworkManager - ``` + ```bash + rpm -q --queryformat '%{version} %{summary}\n' NetworkManager + ``` 5. Введіть команду, щоб переглянути інформацію про пакет bash, встановлений у системі. - ```bash - rpm -qi bash - ``` + ```bash + rpm -qi bash + ``` - !!! note "Примітка" + !!! note "Примітка" - ``` - Попередні вправи стосувалися запитів і роботи з пакетами, уже встановленими в системі. У наступних вправах ми почнемо працювати з пакетами, які ще не встановлено. Ми будемо використовувати програму DNF для завантаження пакетів, які використовуватимемо в наступних кроках. - ``` + ``` + Попередні вправи стосувалися запитів і роботи з пакетами, уже встановленими в системі. У наступних вправах ми почнемо працювати з пакетами, які ще не встановлено. Ми будемо використовувати програму DNF для завантаження пакетів, які використовуватимемо в наступних кроках. + ``` 6. По-перше, переконайтеся, що програму `wget` ще не встановлено в системі. Впишіть: - ```bash - rpm -q wget - package wget is not installed - ``` + ```bash + rpm -q wget + package wget is not installed + ``` - Схоже, `wget` не встановлено в нашій демонстраційній системі. + Схоже, `wget` не встановлено в нашій демонстраційній системі. 7. Починаючи з Rocky Linux 8.x, команда `dnf download` дозволить вам отримати останній пакет `rpm` для `wget`. Впишіть: - ```bash - dnf download wget - ``` + ```bash + dnf download wget + ``` 8. Використовуйте команду `ls`, щоб переконатися, що пакет завантажено у ваш поточний каталог. Впишіть: - ```bash - ls -lh wg* - ``` + ```bash + ls -lh wg* + ``` 9. Використовуйте команду `rpm`, щоб отримати інформацію про завантажений wget-\*.rpm. Впишіть: - ```bash - rpm -qip wget-*.rpm - Name : wget - Architecture: x86_64 - Install Date: (not installed) - Group : Applications/Internet - ...... - ``` + ```bash + rpm -qip wget-*.rpm + Name : wget + Architecture: x86_64 + Install Date: (not installed) + Group : Applications/Internet + ...... + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Виходячи з результатів попереднього кроку, що саме таке пакет `wget`? Підказка: ви можете використовувати параметр формату запиту `rpm`, щоб переглянути поле опису пакета завантаження. - ``` + ``` + Виходячи з результатів попереднього кроку, що саме таке пакет `wget`? Підказка: ви можете використовувати параметр формату запиту `rpm`, щоб переглянути поле опису пакета завантаження. + ``` 10. Якщо вас цікавить пакет `wget files-.rpm`, ви можете перелічити всі файли, включені до пакета, ввівши: - ```bash - rpm -qlp wget-*.rpm | head - /etc/wgetrc - /usr/bin/wget - ...... - /usr/share/doc/wget/AUTHORS - /usr/share/doc/wget/COPYING - /usr/share/doc/wget/MAILING-LIST - /usr/share/doc/wget/NEWS - ``` + ```bash + rpm -qlp wget-*.rpm | head + /etc/wgetrc + /usr/bin/wget + ...... + /usr/share/doc/wget/AUTHORS + /usr/share/doc/wget/COPYING + /usr/share/doc/wget/MAILING-LIST + /usr/share/doc/wget/NEWS + ``` 11. Давайте переглянемо вміст файлу `/usr/share/doc/wget/AUTHORS`, зазначеного як частину пакета `wget`. Ми будемо використовувати команду `cat`. Впишіть: - ```bash - cat /usr/share/doc/wget/AUTHORS - cat: /usr/share/doc/wget/AUTHORS: No such file or directory - ``` + ```bash + cat /usr/share/doc/wget/AUTHORS + cat: /usr/share/doc/wget/AUTHORS: No such file or directory + ``` - `wget` [ще] не встановлено в нашій демонстраційній системі! Отже, ми не можемо переглянути файл AUTHORS, який запаковано з ним! + `wget` [ще] не встановлено в нашій демонстраційній системі! Отже, ми не можемо переглянути файл AUTHORS, який запаковано з ним! 12. Перегляньте список файлів, які постачаються з іншим пакетом (curl), _вже_ встановленим у системі. Впишіть: - ```bash - $ rpm -ql curl - /usr/bin/curl - /usr/lib/.build-id - /usr/lib/.build-id/fc - ...<>... - ``` + ```bash + $ rpm -ql curl + /usr/bin/curl + /usr/lib/.build-id + /usr/lib/.build-id/fc + ...<>... + ``` - !!! note "Примітка" + !!! note "Примітка" - ``` - Ви помітите, що вам не потрібно було посилатися на повну назву пакета `curl` у попередній команді. Це тому, що `curl` уже встановлено. - ``` + ``` + Ви помітите, що вам не потрібно було посилатися на повну назву пакета `curl` у попередній команді. Це тому, що `curl` уже встановлено. + ``` #### Розширені знання про назву пакета @@ -283,35 +283,35 @@ https://download.rockylinux.org/pub/rocky/8.8/ 1. Можна завантажити або отримати пошкоджений або зіпсований файл. Перевірте цілісність пакета `wget`, який ви завантажили. Впишіть: - ```bash - rpm -K wget-*.rpm - wget-1.19.5-10.el8.x86_64.rpm: digests signatures OK - ``` + ```bash + rpm -K wget-*.rpm + wget-1.19.5-10.el8.x86_64.rpm: digests signatures OK + ``` - Повідомлення «digests signatures OK» у вихідних даних показує, що з пакетом все гаразд. + Повідомлення «digests signatures OK» у вихідних даних показує, що з пакетом все гаразд. 2. Давайте проявимо зловмисність і навмисно змінимо завантажений пакет. Це можна зробити, додавши будь-що до оригінального пакету або вилучивши щось із нього. Будь-що, що змінює пакунок у спосіб, який не передбачали вихідні пакувачі, пошкодить пакунок. Ми змінимо файл за допомогою команди echo, щоб додати рядок «haha» до пакета. Впишіть: - ```bash - echo haha >> wget-1.19.5-10.el8.x86_64.rpm - ``` + ```bash + echo haha >> wget-1.19.5-10.el8.x86_64.rpm + ``` 3. Тепер спробуйте ще раз перевірити цілісність пакета за допомогою параметра -K rpm. - ```bash - $ rpm -K wget-*.rpm - wget-1.19.5-10.el8.x86_64.rpm: DIGESTS SIGNATURES NOT OK - ``` + ```bash + $ rpm -K wget-*.rpm + wget-1.19.5-10.el8.x86_64.rpm: DIGESTS SIGNATURES NOT OK + ``` - Зараз це зовсім інше повідомлення. Висновок «DIGESTS SIGNATURES NOT OK» чітко попереджає, що вам не слід намагатися використовувати або інсталювати пакет. Більше не варто довіряти. + Зараз це зовсім інше повідомлення. Висновок «DIGESTS SIGNATURES NOT OK» чітко попереджає, що вам не слід намагатися використовувати або інсталювати пакет. Більше не варто довіряти. 4. Використовуйте команду `rm`, щоб видалити пошкоджений файл пакета `wget` і завантажити нову копію за допомогою `dnf`. Впишіть: - ```bash - rm wget-*.rpm && dnf download wget - ``` + ```bash + rm wget-*.rpm && dnf download wget + ``` - Ще раз перевірте, чи нещодавно завантажений пакет пройшов перевірку цілісності RPM. + Ще раз перевірте, чи нещодавно завантажений пакет пройшов перевірку цілісності RPM. ## Завдання 3 @@ -329,74 +329,74 @@ https://download.rockylinux.org/pub/rocky/8.8/ 1. Спробуйте встановити програму `wget`. Використовуйте параметри командного рядка RPM -ivh. Впишіть: - ```bash - rpm -ivh wget-*.rpm - error: Failed dependencies: - libmetalink.so.3()(64bit) is needed by wget-* - ``` + ```bash + rpm -ivh wget-*.rpm + error: Failed dependencies: + libmetalink.so.3()(64bit) is needed by wget-* + ``` - Відразу - проблема залежності! Зразок результату показує, що `wget` потребує якогось файлу бібліотеки під назвою "libmetalink.so.3" + Відразу - проблема залежності! Зразок результату показує, що `wget` потребує якогось файлу бібліотеки під назвою "libmetalink.so.3" - !!! note "Примітка" + !!! note "Примітка" - ``` - Відповідно до результатів тесту вище, для пакета wget-*.rpm потрібно встановити пакет libmetalink-*.rpm. Іншими словами, libmetalink є необхідною умовою для встановлення wget-*.rpm. Ви можете примусово встановити пакет wget-*.rpm за допомогою параметра «nodeps», якщо знаєте, що робите, але це, як правило, ПОГАНА практика. - ``` + ``` + Відповідно до результатів тесту вище, для пакета wget-*.rpm потрібно встановити пакет libmetalink-*.rpm. Іншими словами, libmetalink є необхідною умовою для встановлення wget-*.rpm. Ви можете примусово встановити пакет wget-*.rpm за допомогою параметра «nodeps», якщо знаєте, що робите, але це, як правило, ПОГАНА практика. + ``` 2. RPM дав нам підказку про те, чого не вистачає. Ви пам’ятаєте, що `rpm` знає, що і як, але не обов’язково знає, де. Скористаємося утилітою `dnf`, щоб визначити назву пакета, який надає відсутню бібліотеку. Впишіть: - ```bash - $ dnf whatprovides libmetalink.so.3 - ...... - libmetalink-* : Metalink library written in C - Repo : baseos - Matched from: - Provide : libmetalink.so.3 - ``` + ```bash + $ dnf whatprovides libmetalink.so.3 + ...... + libmetalink-* : Metalink library written in C + Repo : baseos + Matched from: + Provide : libmetalink.so.3 + ``` 3. З результату нам потрібно завантажити пакет `libmetalink`, який надає відсутню бібліотеку. Зокрема, нам потрібна 64-розрядна версія бібліотеки. Викличмо окрему утиліту (`dnf`), щоб допомогти нам знайти та завантажити пакет для нашої демонстраційної 64-розрядної (x86_64) архітектури. Впишіть: - ```bash - dnf download --arch x86_64 libmetalink - ``` + ```bash + dnf download --arch x86_64 libmetalink + ``` 4. Тепер у вашому робочому каталозі має бути принаймні 2 пакети rpm. Використовуйте команду `ls`, щоб підтвердити це. 5. Встановіть відсутню залежність `libmetalink`. Впишіть: - ```bash - sudo rpm -ivh libmetalink-*.rpm - ``` + ```bash + sudo rpm -ivh libmetalink-*.rpm + ``` 6. З установленою залежністю ми можемо повернутися до нашої початкової мети встановлення пакета `wget`. Впишіть: - ```bash - sudo rpm -ivh wget-*.rpm - ``` + ```bash + sudo rpm -ivh wget-*.rpm + ``` - !!! note "Примітка" + !!! note "Примітка" - ```` - RPM підтримує транзакції. У попередніх вправах ми могли виконати одну транзакцію rpm, яка включала оригінальний пакет, який ми хотіли встановити, і всі пакети та бібліотеки, від яких він залежав. Було б достатньо однієї такої команди, як наведена нижче: + ```` + RPM підтримує транзакції. У попередніх вправах ми могли виконати одну транзакцію rpm, яка включала оригінальний пакет, який ми хотіли встановити, і всі пакети та бібліотеки, від яких він залежав. Було б достатньо однієї такої команди, як наведена нижче: - ```bash - rpm -Uvh wget-*.rpm libmetalink-*.rpm - ``` - ```` + ```bash + rpm -Uvh wget-*.rpm libmetalink-*.rpm + ``` + ```` 7. Момент істини зараз. Спробуйте запустити програму `wget` без будь-яких опцій, щоб перевірити, чи вона встановлена. Впишіть: - ```bash - wget - ``` + ```bash + wget + ``` 8. Давайте подивимося на `wget` в дії. Використовуйте `wget`, щоб завантажити файл з Інтернету з командного рядка. Впишіть: - ```bash - wget https://kernel.org - ``` + ```bash + wget https://kernel.org + ``` - Це завантажить стандартний index.html з веб-сайту kernel.org! + Це завантажить стандартний index.html з веб-сайту kernel.org! 9. Використовуйте `rpm`, щоб переглянути список усіх файлів у програмі `wget`. @@ -406,16 +406,16 @@ https://download.rockylinux.org/pub/rocky/8.8/ 12. Вам потрібно було встановити пакет `libmetalink`, щоб встановити `wget`. Спробуйте запустити або виконати `libmetalink` з командного рядка. Впишіть: - ```bash - libmetalink - -bash: libmetalink: command not found - ``` + ```bash + libmetalink + -bash: libmetalink: command not found + ``` - !!! attention "Увага" + !!! attention "Увага" - ``` - Що це дає? Чому ви не можете запустити або виконати `libmetalink`? - ``` + ``` + Що це дає? Чому ви не можете запустити або виконати `libmetalink`? + ``` #### Щоб імпортувати відкритий ключ через `rpm` @@ -443,31 +443,31 @@ https://download.rockylinux.org/pub/rocky/8.8/ 1. Видаліть пакет `libmetalink` з вашої системи. Впишіть: - ```bash - sudo rpm -e libmetalink - ``` + ```bash + sudo rpm -e libmetalink + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Поясніть, чому не вдалося зняти пакет? - ``` + ``` + Поясніть, чому не вдалося зняти пакет? + ``` 2. Чистим і правильним способом видалення пакетів за допомогою RPM є видалення пакетів разом із їхніми залежностями. Щоб видалити пакет `libmetalink`, ми також повинні видалити пакет `wget`, який залежить від нього. Впишіть: - ```bash - sudo rpm -e libmetalink wget - ``` + ```bash + sudo rpm -e libmetalink wget + ``` - !!! note "Примітка" + !!! note "Примітка" - ``` - Якщо ви хочете зламати пакунок, який покладається на libmetalink, і *примусово* видалити пакунок із вашої системи, ви можете скористатися параметром rpm `--nodeps` так: `$ sudo rpm -e --nodeps libmetalink`. + ``` + Якщо ви хочете зламати пакунок, який покладається на libmetalink, і *примусово* видалити пакунок із вашої системи, ви можете скористатися параметром rpm `--nodeps` так: `$ sudo rpm -e --nodeps libmetalink`. - **i.** Параметр «nodeps» означає відсутність залежностей. Тобто ігнорувати всі залежності. - **ii.** Вище показано, як примусово видалити пакет із системи. Іноді це потрібно робити, але зазвичай це *не дуже добре*. - **iii.** Примусове видалення пакета «xyz», на який покладається інший встановлений пакет «abc», фактично робить пакет «abc» непридатним для використання або дещо зламаним. - ``` + **i.** Параметр «nodeps» означає відсутність залежностей. Тобто ігнорувати всі залежності. + **ii.** Вище показано, як примусово видалити пакет із системи. Іноді це потрібно робити, але зазвичай це *не дуже добре*. + **iii.** Примусове видалення пакета «xyz», на який покладається інший встановлений пакет «abc», фактично робить пакет «abc» непридатним для використання або дещо зламаним. + ``` ## Завдання 5 @@ -524,66 +524,66 @@ DNF (та інші інструменти, подібні до нього) ді 1. По-перше, давайте переконаємося, що `wget` і `libmetalink` видалено з системи. Впишіть: - ```bash - sudo rpm -e wget libmetalink - ``` + ```bash + sudo rpm -e wget libmetalink + ``` - Після видалення, якщо ви спробуєте запустити `wget` з CLI, ви побачите повідомлення на зразок _wget: command not found_ + Після видалення, якщо ви спробуєте запустити `wget` з CLI, ви побачите повідомлення на зразок _wget: command not found_ 2. Тепер використовуйте `dnf`, щоб встановити `wget`. Впишіть: - ```bash - sudo dnf -y install wget - Dependencies resolved. - ...... - Installed: - libmetalink-* wget-* - Complete! - ``` + ```bash + sudo dnf -y install wget + Dependencies resolved. + ...... + Installed: + libmetalink-* wget-* + Complete! + ``` - !!! tip "Підказка" + !!! tip "Підказка" - ``` - Параметр "-y", використаний у попередній команді, пригнічує підказку "[y/N]" для підтвердження дії, яку збирається виконати `dnf`. Це означає, що всі дії підтвердження (або інтерактивні відповіді) будуть «так» (у). - ``` + ``` + Параметр "-y", використаний у попередній команді, пригнічує підказку "[y/N]" для підтвердження дії, яку збирається виконати `dnf`. Це означає, що всі дії підтвердження (або інтерактивні відповіді) будуть «так» (у). + ``` 3. DNF надає параметр «Група середовища», який спрощує додавання нового набору функцій до системи. Щоб додати цю функцію, зазвичай потрібно інсталювати декілька пакунків окремо, але використовуючи `dnf`, все, що вам потрібно знати, це назва або опис потрібної функції. Використовуйте `dnf`, щоб відобразити список усіх доступних груп. Впишіть: - ```bash - dnf group list - ``` + ```bash + dnf group list + ``` 4. Нас цікавить група/функція "Інструменти розробки". Давайте дізнаємося більше про цю групу. Впишіть: - ```bash - dnf group info "Development Tools" - ``` + ```bash + dnf group info "Development Tools" + ``` 5. Пізніше нам знадобляться деякі програми з групою «Development Tools». Встановіть групу «Development Tools» за допомогою `dnf`, виконавши: - ```bash - sudo dnf -y group install "Development Tools" - ``` + ```bash + sudo dnf -y group install "Development Tools" + ``` #### Щоб використовувати `dnf` для видалення пакетів 1. Щоб використати `dnf` для видалення типу пакета `wget`: - ```bash - sudo dnf -y remove wget - ``` + ```bash + sudo dnf -y remove wget + ``` 2. Використовуйте `dnf`, щоб переконатися, що пакет видалено із системи. Впишіть: - ```bash - sudo dnf -y remove wget - ``` + ```bash + sudo dnf -y remove wget + ``` 3. Спробуйте використати/запустити `wget`. Впишіть: - ```bash - wget - ``` + ```bash + wget + ``` #### Щоб використовувати `dnf` для оновлення пакета @@ -591,33 +591,33 @@ DNF може перевірити та встановити останню ве 1. Використовуйте опцію списку з `dnf`, щоб переглянути доступні у вашій системі версії програми `wget`. Впишіть: - ```bash - dnf list wget - ``` + ```bash + dnf list wget + ``` 2. Якщо ви хочете лише побачити, чи доступні оновлені версії для пакета, скористайтеся опцією перевірки оновлення з `dnf`. Наприклад, для типу пакета `wget`: - ```bash - dnf check-update wget - ``` + ```bash + dnf check-update wget + ``` 3. Тепер перерахуйте всі доступні версії пакета ядра для вашої системи. Впишіть: - ```bash - sudo dnf list kernel - ``` + ```bash + sudo dnf list kernel + ``` 4. Тепер перевірте, чи доступні оновлені пакети для встановленого пакета ядра. Впишіть: - ```bash - dnf check-update kernel - ``` + ```bash + dnf check-update kernel + ``` 5. Оновлення пакетів можуть відбуватися через виправлення помилок, нові функції або виправлення безпеки. Щоб переглянути, чи є будь-які оновлення безпеки для пакета ядра, введіть: - ```bash - dnf --security check-update kernel - ``` + ```bash + dnf --security check-update kernel + ``` #### Щоб використовувати `dnf` для оновлень системи @@ -625,21 +625,21 @@ DNF можна використовувати для перевірки та в 1. Щоб перевірити наявність оновлень для пакетів, які ви зараз інсталювали у своїй системі, введіть: - ```bash - $ sudo dnf -y remove wget - ``` + ```bash + $ sudo dnf -y remove wget + ``` 2. Щоб перевірити наявність оновлень безпеки для всіх пакетів, встановлених у вашій системі, введіть: - ```bash - $ sudo dnf -y remove wget - ``` + ```bash + $ sudo dnf -y remove wget + ``` 3. Щоб оновити всі пакети, встановлені у вашій системі, до найновіших версій, доступних для вашого дистрибутива: - ```bash - $ wget - ``` + ```bash + $ wget + ``` ## Завдання 6 @@ -655,7 +655,7 @@ DNF можна використовувати для перевірки та в 1. Використовуйте `curl`, щоб завантажити останній вихідний код програми `hello`. Давайте завантажимо та збережемо файл у папці Downloads. - https://ftp.gnu.org/gnu/hello/hello-2.12.tar.gz + https://ftp.gnu.org/gnu/hello/hello-2.12.tar.gz #### Щоб розархівувати файл @@ -663,40 +663,40 @@ DNF можна використовувати для перевірки та в 2. Розпакуйте (розпакуйте) архів за допомогою програми tar. Впишіть: - ```bash - tar -xvzf hello-2.12.tar.gz - ``` + ```bash + tar -xvzf hello-2.12.tar.gz + ``` - Вихід + Вихід - ```bash - hello-2.12/ - hello-2.12/NEWS - hello-2.12/AUTHORS - hello-2.12/hello.1 - hello-2.12/THANKS - ...... - ``` + ```bash + hello-2.12/ + hello-2.12/NEWS + hello-2.12/AUTHORS + hello-2.12/hello.1 + hello-2.12/THANKS + ...... + ``` 3. Використовуйте команду `ls`, щоб переглянути вміст вашого pwd. - Новий каталог під назвою hello-2.12 повинен був бути створений для вас під час де-тарування. + Новий каталог під назвою hello-2.12 повинен був бути створений для вас під час де-тарування. 4. Перейдіть до цього каталогу та перегляньте його вміст. Впишіть: - ```bash - cd hello-2.12 ; ls - ``` + ```bash + cd hello-2.12 ; ls + ``` 5. Перегляд будь-яких спеціальних інструкцій зі встановлення, які можуть постачатися з вихідним кодом, завжди є хорошою практикою. Ці файли зазвичай мають такі назви: INSTALL, README тощо. - Використовуйте пейджер, щоб відкрити файл INSTALL і прочитати його. Впишіть: + Використовуйте пейджер, щоб відкрити файл INSTALL і прочитати його. Впишіть: - ```bash - less INSTALL - ``` + ```bash + less INSTALL + ``` - Вийдіть із пейджера, коли завершите перегляд файлу. + Вийдіть із пейджера, коли завершите перегляд файлу. #### Щоб налаштувати пакет @@ -718,33 +718,33 @@ sudo dnf -y group install "Development Tools" 2. Щоб побачити всі параметри, ви можете ввімкнути або вимкнути тип програми `hello`: - ```bash - ./configure --help - ``` + ```bash + ./configure --help + ``` - !!! question "Питання" + !!! question "Питання" - ``` - З результатів команди, що робить параметр «--prefix»? - ``` + ``` + З результатів команди, що робить параметр «--prefix»? + ``` 3. Якщо ви задоволені стандартними параметрами, які пропонує сценарій налаштування. Впишіть: - ```bash - ./configure - ``` + ```bash + ./configure + ``` - !!! note "Примітка" + !!! note "Примітка" - ``` - Сподіваюся, етап налаштування пройшов гладко, і ви можете перейти до етапу компіляції. + ``` + Сподіваюся, етап налаштування пройшов гладко, і ви можете перейти до етапу компіляції. - Якщо ви отримуєте деякі помилки під час етапу налаштування, вам слід уважно переглянути кінцеву частину виводу, щоб побачити джерело помилки. Помилки *іноді* зрозумілі самі за себе, і їх легко виправити. Наприклад, ви можете побачити таку помилку: + Якщо ви отримуєте деякі помилки під час етапу налаштування, вам слід уважно переглянути кінцеву частину виводу, щоб побачити джерело помилки. Помилки *іноді* зрозумілі самі за себе, і їх легко виправити. Наприклад, ви можете побачити таку помилку: - configure: error: no acceptable C compiler found in $PATH + configure: error: no acceptable C compiler found in $PATH - Наведена вище помилка просто означає, що у вас не встановлено компілятор C (наприклад, `gcc`) у системі або компілятор інстальовано десь не у вашій змінній PATH. - ``` + Наведена вище помилка просто означає, що у вас не встановлено компілятор C (наприклад, `gcc`) у системі або компілятор інстальовано десь не у вашій змінній PATH. + ``` #### Скомпілювати пакет @@ -752,20 +752,20 @@ sudo dnf -y group install "Development Tools" 1. Використовуйте команду make, щоб скомпілювати пакет після запуску сценарію “configure”. Впишіть: - ```bash - make - ``` + ```bash + make + ``` - Вихід + Вихід - ```bash - gcc -g -O2 -o hello src/hello.o ./lib/libhello.a - make[2]: Leaving directory '/home/rocky/hello-2.12' - ...... - make[1]: Leaving directory '/home/rocky/hello-2.12' - ``` + ```bash + gcc -g -O2 -o hello src/hello.o ./lib/libhello.a + make[2]: Leaving directory '/home/rocky/hello-2.12' + ...... + make[1]: Leaving directory '/home/rocky/hello-2.12' + ``` - Якщо все піде добре, цей важливий крок `make` допоможе створити остаточний двійковий файл `hello` програми. + Якщо все піде добре, цей важливий крок `make` допоможе створити остаточний двійковий файл `hello` програми. 2. Знову перерахуйте файли у вашому поточному робочому каталозі. Ви повинні побачити кілька новостворених файлів, включаючи програму `hello`. @@ -775,51 +775,51 @@ sudo dnf -y group install "Development Tools" 1. Щоб установити програму hello, виконайте команду make install. Впишіть: - ```bash - sudo make install - ``` + ```bash + sudo make install + ``` - Це встановить пакет у місце, указане аргументом префікса за замовчуванням (--prefix), який раніше використовувався у сценарії «configure». Якщо не було встановлено жодного --prefix, буде використано стандартний префікс `/usr/local/`. + Це встановить пакет у місце, указане аргументом префікса за замовчуванням (--prefix), який раніше використовувався у сценарії «configure». Якщо не було встановлено жодного --prefix, буде використано стандартний префікс `/usr/local/`. #### Щоб запустити програму hello 1. Використовуйте команду `whereis`, щоб побачити, де у вашій системі знаходиться програма `hello`. Впишіть: - ```bash - whereis hello - ``` + ```bash + whereis hello + ``` 2. Спробуйте запустити програму `hello`, щоб побачити, що вона робить. Впишіть: - ```bash - hello - ``` + ```bash + hello + ``` 3. Знову запустіть `hello` з опцією `--help`, щоб побачити інші речі, які він може робити. 4. Тепер за допомогою `sudo` знову запустіть `hello` як суперкористувач. Впишіть: - ```bash - sudo hello - ``` + ```bash + sudo hello + ``` - Вихід + Вихід - ```bash - sudo: hello: command not found - ``` + ```bash + sudo: hello: command not found + ``` - !!! Question "Питання" + !!! Question "Питання" - ``` - Дослідіть, що викликає помилку, коли ви намагаєтесь запустити `hello` за допомогою sudo. Виправте проблему та переконайтеся, що програму `hello` можна використовувати з sudo. - ``` + ``` + Дослідіть, що викликає помилку, коли ви намагаєтесь запустити `hello` за допомогою sudo. Виправте проблему та переконайтеся, що програму `hello` можна використовувати з sudo. + ``` - !!! tip "Підказка" + !!! tip "Підказка" - ``` - Тестування програми як звичайного користувача є хорошою практикою, щоб переконатися, що звичайні користувачі можуть використовувати програму. Дозволи для двійкового файлу можуть бути встановлені неправильно, тому лише суперкористувач може використовувати програми. Це, звичайно, припускає, що ви дійсно хочете, щоб звичайні користувачі могли використовувати програму. - ``` + ``` + Тестування програми як звичайного користувача є хорошою практикою, щоб переконатися, що звичайні користувачі можуть використовувати програму. Дозволи для двійкового файлу можуть бути встановлені неправильно, тому лише суперкористувач може використовувати програми. Це, звичайно, припускає, що ви дійсно хочете, щоб звичайні користувачі могли використовувати програму. + ``` 5. Це все. Завдання завершено! @@ -837,48 +837,48 @@ sudo dnf -y group install "Development Tools" 1. Щоб продемонструвати, як працює перевірка пакету `rpm`, змініть файл конфігурації chrony - `/etc/chrony.conf`. (Передбачається, що ви встановили Chrony). Додайте 2 символи нешкідливого коментаря `##` у кінець файлу. Впишіть: - ```bash - echo -e "##" | sudo tee -a /etc/chrony.conf - ``` + ```bash + echo -e "##" | sudo tee -a /etc/chrony.conf + ``` 2. Тепер запустіть команду `rpm` з опцією `--verify`. Впишіть: - ```bash - rpm -V chrony - ``` + ```bash + rpm -V chrony + ``` - Вихід + Вихід - ```bash - S.5....T. c /etc/chrony.conf - ``` + ```bash + S.5....T. c /etc/chrony.conf + ``` - Результат розбивається на 3 окремі стовпці. + Результат розбивається на 3 окремі стовпці. - - **Перший стовпець (S.5....T.)** + - **Перший стовпець (S.5....T.)** - Зразок вихідних даних - `S.5....T.` вказує на 9 полів, які використовуються для вказівки корисної інформації про дійсність файлів у пакеті RPM. Будь-яке поле чи характеристика, які пройшли певну перевірку/тест, позначається знаком «.». + Зразок вихідних даних - `S.5....T.` вказує на 9 полів, які використовуються для вказівки корисної інформації про дійсність файлів у пакеті RPM. Будь-яке поле чи характеристика, які пройшли певну перевірку/тест, позначається знаком «.». - Ці 9 різних полів або перевірок описано тут: + Ці 9 різних полів або перевірок описано тут: - - S: Чи було змінено розмір файлу. - - M: Чи було змінено тип файлу або права доступу до файлу (rwx). - - 5: Чи змінено контрольну суму файлу MD5. - - D: Чи було змінено номер пристрою. - - L: Чи було змінено шлях до файлу. - - U: Чи було змінено власника файлу. - - G: Чи було змінено групу, до якої належить файл. - - T: Чи було змінено mTime (час зміни) файлу. - - P: Чи була змінена функція програми. + - S: Чи було змінено розмір файлу. + - M: Чи було змінено тип файлу або права доступу до файлу (rwx). + - 5: Чи змінено контрольну суму файлу MD5. + - D: Чи було змінено номер пристрою. + - L: Чи було змінено шлях до файлу. + - U: Чи було змінено власника файлу. + - G: Чи було змінено групу, до якої належить файл. + - T: Чи було змінено mTime (час зміни) файлу. + - P: Чи була змінена функція програми. - - **Друга колонка (c)** + - **Друга колонка (c)** - - **c**: Вказує на зміни у файлі конфігурації. Це також можуть бути такі значення: - - d: файл документації. - - g: файл-привид. Дуже мало можна побачити. - - l: файл ліцензії. - - r: файл readme. + - **c**: Вказує на зміни у файлі конфігурації. Це також можуть бути такі значення: + - d: файл документації. + - g: файл-привид. Дуже мало можна побачити. + - l: файл ліцензії. + - r: файл readme. - - **Третій стовпець (/etc/chrony.conf)** + - **Третій стовпець (/etc/chrony.conf)** - - **/etc/chrony.conf**: Представляє шлях до зміненого файлу. + - **/etc/chrony.conf**: Представляє шлях до зміненого файлу. diff --git a/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.it.md b/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.it.md index af476e4f1c..7ad0f9e6ce 100644 --- a/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.it.md +++ b/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.it.md @@ -43,57 +43,57 @@ Questi esercizi trattano vari argomenti relativi al monitoraggio e alla gestione 2. Trovare il nome del processo con ID 1 utilizzando /proc. - ```bash - cat /proc/1/comm - ``` + ```bash + cat /proc/1/comm + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Qual è il nome del processo con PID 1? - ``` + ``` + Qual è il nome del processo con PID 1? + ``` 3. Visualizzare il nome e il percorso dell'eseguibile che si trova dietro al processo con PID 1. - ```bash - ls -l /proc/1/exe - ``` + ```bash + ls -l /proc/1/exe + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Qual è il percorso dell'eseguibile dietro il PID 1? - ``` + ``` + Qual è il percorso dell'eseguibile dietro il PID 1? + ``` 4. Utilizzare il comando `ps` per scoprire il nome del processo o del programma associato al PID 1. - ```bash - ps -p 1 -o comm= - ``` + ```bash + ps -p 1 -o comm= + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Il comando `ps` conferma il nome del processo? - ``` + ``` + Il comando `ps` conferma il nome del processo? + ``` 5. Utilizzare il comando `ps` per visualizzare il percorso completo e gli eventuali argomenti della riga di comando del processo o del programma associato al PID 1. - ```bash - ps -p 1 -o args= - ``` + ```bash + ps -p 1 -o args= + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Qual è il percorso completo e gli argomenti della riga di comando per il processo con PID 1? - ``` + ``` + Qual è il percorso completo e gli argomenti della riga di comando per il processo con PID 1? + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Perché il processo con PID 1 è importante su un sistema Linux? - ``` + ``` + Perché il processo con PID 1 è importante su un sistema Linux? + ``` #### Visualizzazione delle informazioni dettagliate sul processo utilizzando `ps` @@ -101,47 +101,47 @@ I seguenti passaggi mostrano come utilizzare `ps` per visualizzare le informazio 1. Utilizzare il comando `ps` per visualizzare un elenco di tutti i processi in una struttura ad albero. - ```bash - ps auxf - ``` + ```bash + ps auxf + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Qual è la struttura dell'elenco dei processi e quali informazioni vengono visualizzate? - ``` + ``` + Qual è la struttura dell'elenco dei processi e quali informazioni vengono visualizzate? + ``` 2. Filtrare l'elenco in modo da visualizzare solo i processi associati a un utente specifico, ad esempio l'utente “root”. - ```bash - ps -U root - ``` + ```bash + ps -U root + ``` - Verificare che vengano visualizzati solo i processi relativi all'utente “root”. + Verificare che vengano visualizzati solo i processi relativi all'utente “root”. 3. Mostrare i processi in un formato dettagliato, inclusi l'albero dei processi e i thread. Digitare: - ```bash - ps -eH - ``` + ```bash + ps -eH + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Quali ulteriori dettagli vengono mostrati in questo formato? - ``` + ``` + Quali ulteriori dettagli vengono mostrati in questo formato? + ``` 4. Visualizzare i processi ordinati in base all'utilizzo della CPU in ordine decrescente. - ```bash - ps aux --sort=-%cpu - ``` + ```bash + ps aux --sort=-%cpu + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Quale processo sta consumando più CPU? - ``` + ``` + Quale processo sta consumando più CPU? + ``` ## Esercizio 2 @@ -151,91 +151,91 @@ I seguenti passaggi mostrano come utilizzare `ps` per visualizzare le informazio 1. Avviare un processo di sospensione a lungo termine in background e visualizzare il PID sul terminale. Digitare: - ```bash - (sleep 3600 & MYPROC1=$! && echo PID is: $MYPROC1) 2>/dev/null - ``` + ```bash + (sleep 3600 & MYPROC1=$! && echo PID is: $MYPROC1) 2>/dev/null + ``` - OUTPUT: + OUTPUT: - ```bash - PID is: 1331933 - ``` + ```bash + PID is: 1331933 + ``` - Prendere nota del PID del nuovo processo sul sistema. Il PID viene salvato anche nella variabile $MYPROC1. + Prendere nota del PID del nuovo processo sul sistema. Il PID viene salvato anche nella variabile $MYPROC1. 2. Inviare un segnale di chiusura (SIGTERM) al processo `sleep`. - ```bash - kill $MYPROC1 - ``` + ```bash + kill $MYPROC1 + ``` - Sostituire $MYPROC1 con il PID effettivo ottenuto al punto 1. + Sostituire $MYPROC1 con il PID effettivo ottenuto al punto 1. 3. Verificare se il processo è terminato utilizzando `ps` e `ps aux`. - ```bash - ps aux | grep -v grep | grep sleep - ``` + ```bash + ps aux | grep -v grep | grep sleep + ``` #### Per terminare i processi utilizzando i segnali `kill` 1. Avviare un nuovo processo in sospeso e prendere nota del suo PID. Digitare: - ```bash - (sleep 3600 & MYPROC2=$! && echo PID is: $MYPROC2) 2>/dev/null - ``` + ```bash + (sleep 3600 & MYPROC2=$! && echo PID is: $MYPROC2) 2>/dev/null + ``` - OUTPUT: + OUTPUT: - ```bash - PID is: 1333258 - ``` + ```bash + PID is: 1333258 + ``` 2. Inviare un segnale diverso (ad esempio, SIGHUP) al nuovo processo in sospeso. Digitare: - ```bash - kill -1 $MYPROC2 - ``` + ```bash + kill -1 $MYPROC2 + ``` - Verificare che $MYPROC2 non sia più presente nella tabella dei processi. + Verificare che $MYPROC2 non sia più presente nella tabella dei processi. 3. Avviare un nuovo processo ping e prendere nota del suo PID. Digitare: - ```bash - { ping localhost > /dev/null 2>&1 & MYPROC3=$!; } \ - 2>/dev/null; echo "PID is: $MYPROC3" - ``` + ```bash + { ping localhost > /dev/null 2>&1 & MYPROC3=$!; } \ + 2>/dev/null; echo "PID is: $MYPROC3" + ``` 4. Utilizzare il comando `kill` per inviare un segnale `SIGTERM` al processo ping. Digitare: - ```bash - kill -15 $MYPROC3 - ``` + ```bash + kill -15 $MYPROC3 + ``` - Sostituire MYPROC3 con il PID effettivo del processo sul vostro sistema. + Sostituire MYPROC3 con il PID effettivo del processo sul vostro sistema. 5. Avviare un processo di lunga durata utilizzando il comando `cat`. Digitare: - ```bash - { cat /dev/random > /dev/null 2>&1 & MYPROC4=$!; } \ - 2>/dev/null; echo PID is: $MYPROC4 - ``` + ```bash + { cat /dev/random > /dev/null 2>&1 & MYPROC4=$!; } \ + 2>/dev/null; echo PID is: $MYPROC4 + ``` - Prendere nota del PID del processo sul vostro sistema. + Prendere nota del PID del processo sul vostro sistema. 6. Utilizzare `kill` per terminare forzatamente il processo inviando un segnale SIGKILL. - ```bash - kill -9 $MYPROC4 - ``` + ```bash + kill -9 $MYPROC4 + ``` - Verificare che il processo sia terminato. + Verificare che il processo sia terminato. - !!! question "Domanda" + !!! question "Domanda" - ``` - Spiegare lo scopo dell'invio di segnali ai processi utilizzando il comando `kill` e il significato dei diversi tipi di segnale. - ``` + ``` + Spiegare lo scopo dell'invio di segnali ai processi utilizzando il comando `kill` e il significato dei diversi tipi di segnale. + ``` ## Esercizio 3 @@ -245,67 +245,67 @@ I seguenti passaggi mostrano come utilizzare `ps` per visualizzare le informazio 1. Eseguire il comando top per visualizzare le statistiche di sistema in tempo reale. - ```bash - top - ``` + ```bash + top + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Quali informazioni vengono visualizzate nell'interfaccia superiore? - ``` + ``` + Quali informazioni vengono visualizzate nell'interfaccia superiore? + ``` 2. Osservare l'utilizzo della CPU e della memoria dei processi nell'interfaccia superiore. - !!! question "Domanda" + !!! question "Domanda" - ``` - Quali processi consumano più CPU e memoria? - ``` + ``` + Quali processi consumano più CPU e memoria? + ``` 3. Ordinare i processi in `top` in base all'utilizzo della CPU (premere P) e all'utilizzo della memoria (premere M). - !!! question "Domanda" + !!! question "Domanda" - ``` - Quali sono i processi che consumano più CPU e memoria dopo l'ordinamento? - ``` + ``` + Quali sono i processi che consumano più CPU e memoria dopo l'ordinamento? + ``` #### Monitorare l'utilizzo della CPU e della memoria per processi specifici utilizzando `top` 1. Creare un file di dimensioni arbitrarie pari a 512 Mb contenente dati casuali. - ```bash - sudo fallocate -l 512M ~/large-file.data - ``` + ```bash + sudo fallocate -l 512M ~/large-file.data + ``` 2. Avviare un processo che richieda molte risorse, come la compressione di file di grandi dimensioni. - ```bash - tar -czf archive.tar.gz /path/to/large/directory - ``` + ```bash + tar -czf archive.tar.gz /path/to/large/directory + ``` 3. Aprire il comando `top` per monitorare l'utilizzo della CPU e della memoria. - ```bash - top - ``` + ```bash + top + ``` 4. Individuare e selezionare il processo che richiede molte risorse nell'interfaccia superiore. - !!! question "Domanda" + !!! question "Domanda" - ``` - Qual è l'ID del processo e l'utilizzo delle risorse del processo intensivo? - ``` + ``` + Qual è l'ID del processo e l'utilizzo delle risorse del processo intensivo? + ``` 5. Modificare l'ordine di ordinamento in `top` per visualizzare i processi che utilizzano più CPU o memoria (premere P o M). - !!! question "Domanda" + !!! question "Domanda" - ``` - Qual è il processo che si trova in cima alla lista dopo l'ordinamento? - ``` + ``` + Qual è il processo che si trova in cima alla lista dopo l'ordinamento? + ``` 6. Uscire da `top` premendo `q`. @@ -313,47 +313,47 @@ I seguenti passaggi mostrano come utilizzare `ps` per visualizzare le informazio 1. Avviare il comando `top` in modalità interattiva. - ```bash - top - ``` + ```bash + top + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Quali informazioni vengono visualizzate nella schermata superiore? - ``` + ``` + Quali informazioni vengono visualizzate nella schermata superiore? + ``` 2. Utilizzare il tasto 1 per visualizzare un riepilogo dell'utilizzo dei singoli core della CPU. - !!! question "Domanda" + !!! question "Domanda" - ``` - Qual è la ripartizione dell'utilizzo del core della CPU per ciascun core? - ``` + ``` + Qual è la ripartizione dell'utilizzo del core della CPU per ciascun core? + ``` 3. Premere u per visualizzare i processi di un utente specifico. Inserire il vostro nome utente. - !!! question "Domanda" + !!! question "Domanda" - ``` - Quali processi sono attualmente in esecuzione per il vostro utente? - ``` + ``` + Quali processi sono attualmente in esecuzione per il vostro utente? + ``` 4. Ordinare i processi in base all'utilizzo della memoria (premere M) e osservare i processi che consumano più memoria. - !!! question "Domanda" + !!! question "Domanda" - ``` - Quali processi stanno utilizzando più memoria? - ``` + ``` + Quali processi stanno utilizzando più memoria? + ``` 5. Uscire da top premendo ++"q"++. - !!! question "Domanda" + !!! question "Domanda" - ``` - Spiegare l'importanza del monitoraggio delle risorse di sistema mediante il comando `top` e come questo possa aiutare a risolvere i problemi relativi alle prestazioni. - ``` + ``` + Spiegare l'importanza del monitoraggio delle risorse di sistema mediante il comando `top` e come questo possa aiutare a risolvere i problemi relativi alle prestazioni. + ``` ## Esercizio 4 @@ -363,78 +363,78 @@ I seguenti passaggi mostrano come utilizzare `ps` per visualizzare le informazio 1. Avviare un processo che richieda un uso intensivo della CPU con priorità predefinita/normale. Digitare: - ```bash - bash -c 'while true; do echo "Default priority: The PID is $$"; done' - ``` + ```bash + bash -c 'while true; do echo "Default priority: The PID is $$"; done' + ``` - OUTPUT: + OUTPUT: - ```bash - Default priority: The PID is 2185209 - Default priority: The PID is 2185209 - Default priority: The PID is 2185209 - ....... - ``` + ```bash + Default priority: The PID is 2185209 + Default priority: The PID is 2185209 + Default priority: The PID is 2185209 + ....... + ``` - Dall'output, il valore del PID sul nostro sistema di esempio è `2185209`. + Dall'output, il valore del PID sul nostro sistema di esempio è `2185209`. - Il valore del PID sarà diverso sul vostro sistema. + Il valore del PID sarà diverso sul vostro sistema. - Si noti il valore del PID visualizzato continuamente sullo schermo del vostro sistema. + Si noti il valore del PID visualizzato continuamente sullo schermo del vostro sistema. 2. In un altro terminale, utilizzando il valore PID, controllare la priorità predefinita del processo utilizzando `ps`. Digitare: - ```bash - ps -p -o ni - ``` + ```bash + ps -p -o ni + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Qual è la priorità predefinita del processo in esecuzione (valore `nice`)? - ``` + ``` + Qual è la priorità predefinita del processo in esecuzione (valore `nice`)? + ``` 3. Utilizzando il PID del processo stampato, terminare il processo utilizzando il comando `kill`. 4. Utilizzando il comando `nice`, riavviare un processo simile con un valore di niceness inferiore (ovvero più favorevole al processo O con priorità più alta). Utilizzare un valore `nice` pari a `-20`. Digitare: - ```bash - nice -n -20 bash -c 'while true; do echo "High priority: The PID is $$"; done' - ``` + ```bash + nice -n -20 bash -c 'while true; do echo "High priority: The PID is $$"; done' + ``` 5. Utilizzando il valore del PID, controllare la priorità del processo utilizzando `ps`. Digitare: - ```bash - ps -p -o ni - ``` + ```bash + ps -p -o ni + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - La priorità del processo è stata impostata correttamente? - ``` + ``` + La priorità del processo è stata impostata correttamente? + ``` 6. Premendo contemporaneamente i tasti ++ctrl+c++ sulla tastiera `terminare` il nuovo processo ad alta priorità. 7. Utilizzando nuovamente il comando `nice`, riavviare un altro processo, ma questa volta con un valore di niceness più alto (cioè meno favorevole al processo O con priorità inferiore). Utilizzare un valore `nice` pari a `19` Digitare: - ```bash - nice -n 19 bash -c 'while true; do echo "Low priority: The PID is $$"; done' - ``` + ```bash + nice -n 19 bash -c 'while true; do echo "Low priority: The PID is $$"; done' + ``` - OUTPUT: + OUTPUT: - ```bash - Low priority: The PID is 2180254 - Low priority: The PID is 2180254 - ...... - ``` + ```bash + Low priority: The PID is 2180254 + Low priority: The PID is 2180254 + ...... + ``` 8. Controllare la priorità personalizzata del processo utilizzando `ps`. Digitare: - ```bash - ps -p -o ni - ``` + ```bash + ps -p -o ni + ``` 9. Premere contemporaneamente i tasti ++ctrl+c++ sulla tastiera per terminare il nuovo processo a bassa priorità. @@ -444,73 +444,73 @@ I seguenti passaggi mostrano come utilizzare `ps` per visualizzare le informazio 1. Avviare un processo che richieda un uso intensivo della CPU, come un calcolo matematico complesso con l'utilità md5sum. Digitare: - ```bash - find / -path '/proc/*' -prune -o -type f -exec md5sum {} \; > /dev/null - ``` + ```bash + find / -path '/proc/*' -prune -o -type f -exec md5sum {} \; > /dev/null + ``` 2. Utilizzare il comando `ps` per individuare il PID del processo `find/md5sum` precedente. Digitare: - ```bash - ps -C find -o pid= - ``` + ```bash + ps -C find -o pid= + ``` - OUTPUT: + OUTPUT: - ```bash - 2577072 - ``` + ```bash + 2577072 + ``` - Dall'output, il valore del PID sul sistema di esempio è `2577072`. + Dall'output, il valore del PID sul sistema di esempio è `2577072`. - Il valore del PID sarà diverso sul vostro sistema. + Il valore del PID sarà diverso sul vostro sistema. - Prendere nota del valore del PID sul sistema. + Prendere nota del valore del PID sul sistema. 3. Utilizzare il comando `renice` per impostare la priorità del processo `find/md5sum` in esecuzione su un valore di niceness inferiore (ad esempio, -10, priorità più alta). Digitare: - ```bash - renice -n -10 -p $(ps -C find -o pid=) - ``` + ```bash + renice -n -10 -p $(ps -C find -o pid=) + ``` - OUTPUT: + OUTPUT: - ```bash - (process ID) old priority 0, new priority -10 - ``` + ```bash + (process ID) old priority 0, new priority -10 + ``` - Sostituire `` (sopra) con il PID effettivo del processo in esecuzione. + Sostituire `` (sopra) con il PID effettivo del processo in esecuzione. 4. Monitorare l'utilizzo delle risorse per il processo `find/md5sum`, utilizzando `top` (o `htop`). Digitare: - ```bash - top -cp $(ps -C find -o pid=) - ``` + ```bash + top -cp $(ps -C find -o pid=) + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Il processo ora riceve una quota maggiore di risorse della CPU? - ``` + ``` + Il processo ora riceve una quota maggiore di risorse della CPU? + ``` 5. Modificare la priorità del processo `find/md5sum` impostando un valore `nice` più alto (ad esempio 10, priorità più bassa). Digitare: - ```bash - renice -n 10 -p - ``` + ```bash + renice -n 10 -p + ``` - OUTPUT: + OUTPUT: - ```bash - 2338530 (process ID) old priority -10, new priority 10 - ``` + ```bash + 2338530 (process ID) old priority -10, new priority 10 + ``` - Sostituire `` (sopra) con il PID effettivo del processo in esecuzione. + Sostituire `` (sopra) con il PID effettivo del processo in esecuzione. - !!! question "Domanda" + !!! question "Domanda" - ``` - Spiegare come viene utilizzato il comando `nice` per regolare le priorità dei processi e come influisce sull'allocazione delle risorse di sistema. - ``` + ``` + Spiegare come viene utilizzato il comando `nice` per regolare le priorità dei processi e come influisce sull'allocazione delle risorse di sistema. + ``` 6. Premere contemporaneamente i tasti ++ctrl+c++ sulla tastiera per interrompere il processo `find/md5sum` . È anche possibile utilizzare il comando `kill` per ottenere lo stesso risultato. @@ -522,41 +522,41 @@ I seguenti passaggi mostrano come utilizzare `ps` per visualizzare le informazio 1. Utilizzare il comando `pgrep` per identificare tutti i processi associati a un programma o servizio specifico, come ad esempio `sshd`. - ```bash - pgrep sshd - ``` + ```bash + pgrep sshd + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Quali sono gli ID dei processi `sshd`? - ``` + ``` + Quali sono gli ID dei processi `sshd`? + ``` 2. Verificare l'esistenza dei processi identificati utilizzando il comando `ps`. - ```bash - ps -p - ``` + ```bash + ps -p + ``` - Sostituire “” con gli ID di processo ottenuti al punto 1. + Sostituire “” con gli ID di processo ottenuti al punto 1. 3. Utilizzare il comando `pgrep` per identificare i processi con un nome specifico, ad esempio “cron”. - ```bash - pgrep cron - ``` + ```bash + pgrep cron + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Esistono processi con il nome “cron”? - ``` + ``` + Esistono processi con il nome “cron”? + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Spiegare la differenza tra l'uso di `ps` e `pgrep` per identificare e gestire i processi. - ``` + ``` + Spiegare la differenza tra l'uso di `ps` e `pgrep` per identificare e gestire i processi. + ``` ## Esercizio 6 @@ -568,81 +568,81 @@ Questo esercizio riguarda la gestione dei processi con `fg` e `bg`. 1. Avviare un processo long-running in foreground. Ad esempio, si può usare un comando semplice come `sleep`. Digitare: - ```bash - sleep 300 - ``` + ```bash + sleep 300 + ``` 2. Sospendere il processo in foreground premendo ++ctrl+z++ sulla tastiera. Questo dovrebbe riportarvi al prompt della shell. 3. Elencare i processi sospesi utilizzando il comando `jobs`. Digitare: - ```bash - jobs - ``` + ```bash + jobs + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Qual è lo stato del lavoro sospeso? - ``` + ``` + Qual è lo stato del lavoro sospeso? + ``` 4. Riportare il processo sospeso in foreground utilizzando il comando `fg`. - ```bash - fg - ``` + ```bash + fg + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Cosa succede quando si riporta il lavoro in foreground? - ``` + ``` + Cosa succede quando si riporta il lavoro in foreground? + ``` 5. Sospendere nuovamente il processo utilizzando ++ctrl+z++, quindi spostarlo in background utilizzando il comando `bg`. - ```bash - bg - ``` + ```bash + bg + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Qual è lo stato attuale del lavoro? - ``` + ``` + Qual è lo stato attuale del lavoro? + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Spiegare lo scopo dei processi in primo piano e in background e come vengono gestiti utilizzando i comandi `fg` e `bg`. - ``` + ``` + Spiegare lo scopo dei processi in primo piano e in background e come vengono gestiti utilizzando i comandi `fg` e `bg`. + ``` #### Avviare un processo in background 1. Il simbolo `&` può avviare un processo che viene immediatamente eseguito in background. Ad esempio, per avviare il comando `sleep` in background, digitare: - ```bash - sleep 300 & - ``` + ```bash + sleep 300 & + ``` - Sospendere il processo in esecuzione utilizzando ++ctrl+z++. + Sospendere il processo in esecuzione utilizzando ++ctrl+z++. 2. Elencare lo stato di tutti i jobs attivi. Digitare: - ```bash - jobs -l - ``` + ```bash + jobs -l + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Qual è lo stato del processo “sleep 300”? - ``` + ``` + Qual è lo stato del processo “sleep 300”? + ``` 3. Riportare il processo in background in primo piano utilizzando il comando `fg`. - ```bash - fg - ``` + ```bash + fg + ``` 4. Terminare anticipatamente il processo `sleep` inviandogli il segnale SIGSTOP premendo ++ctrl+c++. @@ -650,23 +650,23 @@ Questo esercizio riguarda la gestione dei processi con `fg` e `bg`. 1. Avviare un processo interattivo come l'editor di testo `vi` per creare e modificare un file di testo di esempio denominato “foobar.txt”. Digitare: - ```bash - vi foobar1.txt - ``` + ```bash + vi foobar1.txt + ``` - Sospendere il processo in esecuzione utilizzando `Ctrl` + `Z`. + Sospendere il processo in esecuzione utilizzando `Ctrl` + `Z`. - Utilizzare il comando `bg` per spostare il processo sospeso in background. + Utilizzare il comando `bg` per spostare il processo sospeso in background. - ```bash - bg - ``` + ```bash + bg + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Il processo è ora in esecuzione in background? - ``` + ``` + Il processo è ora in esecuzione in background? + ``` 2. Inserire “Hello” all'interno del file `foobar1.txt` nel vostro editor `vi`. @@ -674,9 +674,9 @@ Questo esercizio riguarda la gestione dei processi con `fg` e `bg`. 4. Avviare un'altra sessione separata dell'editor `vi` per creare un altro file di testo denominato “foobar2.txt”. Digitare: - ```bash - vi foobar2.txt - ``` + ```bash + vi foobar2.txt + ``` 5. Inserire il testo di esempio “Hi inside foobar2.txt” nella seconda sessione di vi. @@ -684,45 +684,45 @@ Questo esercizio riguarda la gestione dei processi con `fg` e `bg`. 7. Elencare lo stato di tutti i `job` sul terminale corrente. Digitare: - ```bash - jobs -l - ``` + ```bash + jobs -l + ``` - OUTPUT: + OUTPUT: - ```bash - [1]- 2977364 Stopped vi foobar1.txt - [2]+ 2977612 Stopped vi foobar2.txt - ``` + ```bash + [1]- 2977364 Stopped vi foobar1.txt + [2]+ 2977612 Stopped vi foobar2.txt + ``` - Si dovrebbero avere almeno 2 job elencati nell'output. Il numero nella prima colonna dell'output mostra i numeri dei job: [1] e [2]. + Si dovrebbero avere almeno 2 job elencati nell'output. Il numero nella prima colonna dell'output mostra i numeri dei job: [1] e [2]. 8. Riprendere ==e portare in primo piano== la prima sessione `vi` digitando: - ```bash - fg %1 - ``` + ```bash + fg %1 + ``` 9. Sospendere nuovamente la prima sessione `vi` utilizzando ++ctrl+z++. 10. Riprendere ==e portare in foreground== la seconda sessione `vi` digitando: - ```bash - fg %2 - ``` + ```bash + fg %2 + ``` 11. Terminare in modo non corretto entrambe le sessioni di modifica `vi` inviando il segnale KILL a entrambi i processi. Eseguire il comando `kill` seguito dal comando jobs. Digitare: - ```bash - kill -SIGKILL %1 %2 && jobs - ``` + ```bash + kill -SIGKILL %1 %2 && jobs + ``` - OUTPUT: + OUTPUT: - ```bash - [1]- Killed vi foobar1.txt - [2]+ Killed vi foobar2.txt - ``` + ```bash + [1]- Killed vi foobar1.txt + [2]+ Killed vi foobar2.txt + ``` ## Esercizio 7 @@ -734,25 +734,25 @@ Questo esercizio riguarda la gestione dei processi con `fg` e `bg`. 2. Utilizzare il comando `pidof` per trovare l'ID del processo di `systemd`. Digitare: - ```bash - pidof systemd - ``` + ```bash + pidof systemd + ``` - Prendere nota del ID di processo di `systemd`. + Prendere nota del ID di processo di `systemd`. 3. Verificare l'esistenza del processo identificato utilizzando il comando `ps`. - ```bash - ps -p - ``` + ```bash + ps -p + ``` - Sostituire `` con l'ID del processo ottenuto al punto 2. + Sostituire `` con l'ID del processo ottenuto al punto 2. - !!! question "Domanda" + !!! question "Domanda" - ``` - Spiegare la differenza tra `pgrep` e `pidof` per trovare l'ID di processo di un comando in esecuzione. - ``` + ``` + Spiegare la differenza tra `pgrep` e `pidof` per trovare l'ID di processo di un comando in esecuzione. + ``` ## Esercizio 8 @@ -762,39 +762,39 @@ Questo esercizio riguarda la gestione dei processi con `fg` e `bg`. 1. Elencare il contenuto della directory /sys. Digitare: - ```bash - ls /sys - ``` + ```bash + ls /sys + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Che tipo di informazioni sono memorizzate nella directory /sys? - ``` + ``` + Che tipo di informazioni sono memorizzate nella directory /sys? + ``` 2. Passare a una voce specifica di /sys, ad esempio le informazioni sulla CPU. - ```bash - cd /sys/devices/system/cpu - ``` + ```bash + cd /sys/devices/system/cpu + ``` 3. Elencare il contenuto della directory corrente per esplorare le informazioni relative alla CPU. - ```bash - ls - ``` + ```bash + ls + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Quali informazioni relative alla CPU sono disponibili nel filesystem /sys? - ``` + ``` + Quali informazioni relative alla CPU sono disponibili nel filesystem /sys? + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Spiegare lo scopo del filesystem /sys in Linux e il suo ruolo nella gestione dell'hardware e della configurazione del sistema. - ``` + ``` + Spiegare lo scopo del filesystem /sys in Linux e il suo ruolo nella gestione dell'hardware e della configurazione del sistema. + ``` ## Esercizio 9 @@ -804,41 +804,41 @@ Questo esercizio riguarda la gestione dei processi con `fg` e `bg`. 1. Identificare i processi con un nome specifico, come “firefox”. - ```bash - pkill firefox - ``` + ```bash + pkill firefox + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Sono stati terminati tutti i processi con il nome “firefox”? - ``` + ``` + Sono stati terminati tutti i processi con il nome “firefox”? + ``` 2. Controllare che lo stato dei processi sia terminato utilizzando `ps`. - ```bash - ps aux | grep firefox - ``` + ```bash + ps aux | grep firefox + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Ci sono processi rimanenti con il nome “firefox”? - ``` + ``` + Ci sono processi rimanenti con il nome “firefox”? + ``` - Utilizza `pkill` per terminare forzatamente tutti i processi con un nome specifico. + Utilizza `pkill` per terminare forzatamente tutti i processi con un nome specifico. - ```bash - pkill -9 firefox - ``` + ```bash + pkill -9 firefox + ``` - Verificare che tutti i processi con il nome “firefox” siano stati terminati. + Verificare che tutti i processi con il nome “firefox” siano stati terminati. - !!! question "Domanda" + !!! question "Domanda" - ``` - Qual è la differenza tra l'uso di `kill` e `pkill` per terminare i processi in base al nome? - ``` + ``` + Qual è la differenza tra l'uso di `kill` e `pkill` per terminare i processi in base al nome? + ``` ## Esercizio 10 @@ -850,41 +850,41 @@ Questo esercizio riguarda l'uso del potente comando `exec`. 1. Avviare una nuova sessione shell. Digitare: - ```bash - bash - ``` + ```bash + bash + ``` 2. Lanciare un comando che non esce dalla nuova shell, come un semplice ciclo while. - ```bash - while true; do echo "Running..."; done - ``` + ```bash + while true; do echo "Running..."; done + ``` 3. Nella shell corrente, sostituire il comando in esecuzione con uno diverso utilizzando `exec`. - ```bash - exec echo "This replaces the previous command." - ``` + ```bash + exec echo "This replaces the previous command." + ``` - Da notare che il comando precedente è stato chiuso e quello nuovo è in esecuzione. + Da notare che il comando precedente è stato chiuso e quello nuovo è in esecuzione. 4. Verificare che il vecchio comando non sia più in esecuzione utilizzando `ps`. - ```bash - ps aux | grep "while true" - ``` + ```bash + ps aux | grep "while true" + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Il comando precedente è ancora in esecuzione? - ``` + ``` + Il comando precedente è ancora in esecuzione? + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Spiega come il comando `exec` può sostituire il processo della shell corrente con un comando diverso. - ``` + ``` + Spiega come il comando `exec` può sostituire il processo della shell corrente con un comando diverso. + ``` ## Esercizio 11 @@ -896,41 +896,41 @@ Come `kill`, `killall` è un comando che consente di terminare i processi in bas 1. Identificare i processi con un nome specifico, come “chrome”. - ```bash - killall chrome - ``` + ```bash + killall chrome + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Sono stati terminati tutti i processi con il nome “chrome”? - ``` + ``` + Sono stati terminati tutti i processi con il nome “chrome”? + ``` 2. Controllare che lo stato dei processi sia terminato utilizzando `ps`. - ```bash - ps aux | grep chrome - ``` + ```bash + ps aux | grep chrome + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Ci sono processi rimanenti con il nome “chrome”? - ``` + ``` + Ci sono processi rimanenti con il nome “chrome”? + ``` 3. Utilizzare `killall` per terminare forzatamente tutti i processi con un nome specifico. - ```bash - killall -9 chrome - ``` + ```bash + killall -9 chrome + ``` - Verificare che tutti i processi con il nome “chrome” siano stati chiusi. + Verificare che tutti i processi con il nome “chrome” siano stati chiusi. - !!! question "Domanda" + !!! question "Domanda" - ``` - In che modo `killall` differisce da `pkill` e `kill` quando si terminano i processi in base al nome? - ``` + ``` + In che modo `killall` differisce da `pkill` e `kill` quando si terminano i processi in base al nome? + ``` ## Esercizio 12 @@ -940,47 +940,47 @@ Come `kill`, `killall` è un comando che consente di terminare i processi in bas 1. Elencare i `cgroups` esistenti sul vostro sistema. - ```bash - cat /proc/cgroups - ``` + ```bash + cat /proc/cgroups + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Quali sono i controller `cgroup` disponibili sul vostro sistema? - ``` + ``` + Quali sono i controller `cgroup` disponibili sul vostro sistema? + ``` 2. Creare un nuovo cgroup utilizzando il controller della CPU. Nominarlo “mygroup”. - ```bash - sudo mkdir -p /sys/fs/cgroup/cpu/mygroup - ``` + ```bash + sudo mkdir -p /sys/fs/cgroup/cpu/mygroup + ``` 3. Spostare un processo specifico (ad esempio, un comando sleep in esecuzione) nel `cgroup` “mygroup”. - ```bash - echo | sudo tee /sys/fs/cgroup/cpu/mygroup/cgroup.procs - ``` + ```bash + echo | sudo tee /sys/fs/cgroup/cpu/mygroup/cgroup.procs + ``` - Sostituire `` con il PID effettivo del processo. + Sostituire `` con il PID effettivo del processo. 4. Verificare se il processo è stato spostato nel `cgroup` “mygroup”. - ```bash - cat /sys/fs/cgroup/cpu/mygroup/cgroup.procs - ``` + ```bash + cat /sys/fs/cgroup/cpu/mygroup/cgroup.procs + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Il processo è elencato nel cgroup “mygroup”? - ``` + ``` + Il processo è elencato nel cgroup “mygroup”? + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Spiegare il concetto di “cgroups” in Linux e come questi possono gestire e controllare l'allocazione delle risorse per i processi. - ``` + ``` + Spiegare il concetto di “cgroups” in Linux e come questi possono gestire e controllare l'allocazione delle risorse per i processi. + ``` ## Esercizio 13 @@ -990,46 +990,46 @@ Come `kill`, `killall` è un comando che consente di terminare i processi in bas 1. Identificare un processo in esecuzione con un PID e una priorità specifici utilizzando `ps`. - ```bash - ps -p -o ni - ``` + ```bash + ps -p -o ni + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Qual è l'attuale priorità (valore nice) del processo? - ``` + ``` + Qual è l'attuale priorità (valore nice) del processo? + ``` 2. Utilizzare il comando `renice` per modificare la priorità (valore nice) del processo in esecuzione. - ```bash - renice -p - ``` + ```bash + renice -p + ``` - Sostituire `` con il nuovo valore di priorità che si desidera impostare e `` con il PID effettivo del processo. + Sostituire `` con il nuovo valore di priorità che si desidera impostare e `` con il PID effettivo del processo. 3. Verificare che la priorità del processo sia cambiata utilizzando `ps`. - ```bash - ps -p -o ni - ``` + ```bash + ps -p -o ni + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - La priorità ora è diversa? - ``` + ``` + La priorità ora è diversa? + ``` 4. Provare a modificare la priorità impostando un valore più alto o più basso e osservare l'impatto sull'utilizzo delle risorse del processo. - !!! question "Domanda" + !!! question "Domanda" - ``` - Cosa succede al consumo di risorse del processo con valori nice diversi? - ``` + ``` + Cosa succede al consumo di risorse del processo con valori nice diversi? + ``` - !!! question "Domanda" + !!! question "Domanda" - ``` - Spiegare come viene utilizzato il comando renice per regolare la priorità dei processi in esecuzione e i suoi effetti sull'utilizzo delle risorse di processo. - ``` + ``` + Spiegare come viene utilizzato il comando renice per regolare la priorità dei processi in esecuzione e i suoi effetti sull'utilizzo delle risorse di processo. + ``` diff --git a/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.uk.md b/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.uk.md index 04a559cdc9..4402ab40c1 100644 --- a/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.uk.md +++ b/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.uk.md @@ -43,57 +43,57 @@ tags: 2. Знайдіть назву процесу з ідентифікатором процесу 1 за допомогою /proc. - ```bash - cat /proc/1/comm - ``` + ```bash + cat /proc/1/comm + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Як називається процес з PID 1? - ``` + ``` + Як називається процес з PID 1? + ``` 3. Перегляньте ім’я та шлях до виконуваного файлу процесу з PID 1. - ```bash - ls -l /proc/1/exe - ``` + ```bash + ls -l /proc/1/exe + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Який шлях до виконуваного файлу за PID 1? - ``` + ``` + Який шлях до виконуваного файлу за PID 1? + ``` 4. Використовуйте команду `ps`, щоб дізнатися назву процесу або програми, що стоїть за PID 1. - ```bash - ps -p 1 -o comm= - ``` + ```bash + ps -p 1 -o comm= + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Чи підтверджує команда `ps` назву процесу? - ``` + ``` + Чи підтверджує команда `ps` назву процесу? + ``` 5. Використовуйте команду `ps`, щоб переглянути повний шлях і будь-які аргументи командного рядка процесу або програми за PID 1. - ```bash - ps -p 1 -o args= - ``` + ```bash + ps -p 1 -o args= + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Який повний шлях і аргументи командного рядка для процесу з PID 1? - ``` + ``` + Який повний шлях і аргументи командного рядка для процесу з PID 1? + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Чому процес із PID 1 важливий у системі Linux? - ``` + ``` + Чому процес із PID 1 важливий у системі Linux? + ``` #### Щоб відобразити детальну інформацію про процес за допомогою `ps` @@ -101,47 +101,47 @@ tags: 1. Використовуйте команду `ps`, щоб відобразити список усіх процесів у структурі дерева. - ```bash - ps auxf - ``` + ```bash + ps auxf + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Яка структура списку процесів і яка інформація відображається? - ``` + ``` + Яка структура списку процесів і яка інформація відображається? + ``` 2. Відфільтруйте список лише для відображення процесів, пов’язаних із певним користувачем, наприклад, користувачем «root». - ```bash - ps -U root - ``` + ```bash + ps -U root + ``` - Переконайтеся, що відображаються лише процеси для користувача root. + Переконайтеся, що відображаються лише процеси для користувача root. 3. Показуйте процеси в детальному форматі, включаючи дерево процесів і потоки. Впишіть: - ```bash - ps -eH - ``` + ```bash + ps -eH + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Які додаткові деталі відображаються в цьому форматі? - ``` + ``` + Які додаткові деталі відображаються в цьому форматі? + ``` 4. Відображати процеси, відсортовані за використанням ЦП у порядку спадання. - ```bash - ps aux --sort=-%cpu - ``` + ```bash + ps aux --sort=-%cpu + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Який процес споживає найбільше ЦП? - ``` + ``` + Який процес споживає найбільше ЦП? + ``` ## Завдання 2 @@ -151,91 +151,91 @@ tags: 1. Запустіть тривалий процес сну у фоновому режимі та відобразіть PID на своєму терміналі. Впишіть: - ```bash - (sleep 3600 & MYPROC1=$! && echo PID is: $MYPROC1) 2>/dev/null - ``` + ```bash + (sleep 3600 & MYPROC1=$! && echo PID is: $MYPROC1) 2>/dev/null + ``` - Вихід: + Вихід: - ```bash - PID is: 1331933 - ``` + ```bash + PID is: 1331933 + ``` - Занотуйте PID для нового процесу у вашій системі. PID також зберігається в змінній $MYPROC1. + Занотуйте PID для нового процесу у вашій системі. PID також зберігається в змінній $MYPROC1. 2. Надішліть сигнал завершення (SIGTERM) процесу «сплячого режиму». - ```bash - kill $MYPROC1 - ``` + ```bash + kill $MYPROC1 + ``` - Замініть $MYPROC1 фактичним PID з кроку 1. + Замініть $MYPROC1 фактичним PID з кроку 1. 3. Перевірте, чи було завершено процес за допомогою `ps` і `ps aux`. - ```bash - ps aux | grep -v grep | grep sleep - ``` + ```bash + ps aux | grep -v grep | grep sleep + ``` #### Для завершення процесів за допомогою сигналів `kill` 1. Почніть новий процес сну та запишіть його PID. Впишіть: - ```bash - (sleep 3600 & MYPROC2=$! && echo PID is: $MYPROC2) 2>/dev/null - ``` + ```bash + (sleep 3600 & MYPROC2=$! && echo PID is: $MYPROC2) 2>/dev/null + ``` - Вихід: + Вихід: - ```bash - PID is: 1333258 - ``` + ```bash + PID is: 1333258 + ``` 2. Надішліть інший сигнал (наприклад, SIGHUP) до нового процесу сну. Впишіть: - ```bash - kill -1 $MYPROC2 - ``` + ```bash + kill -1 $MYPROC2 + ``` - Переконайтеся, що $MYPROC2 більше не міститься в таблиці процесів. + Переконайтеся, що $MYPROC2 більше не міститься в таблиці процесів. 3. Почніть новий процес ping і запишіть його PID. Впишіть: - ```bash - { ping localhost > /dev/null 2>&1 & MYPROC3=$!; } \ - 2>/dev/null; echo "PID is: $MYPROC3" - ``` + ```bash + { ping localhost > /dev/null 2>&1 & MYPROC3=$!; } \ + 2>/dev/null; echo "PID is: $MYPROC3" + ``` 4. Використовуйте команду `kill`, щоб надіслати сигнал `SIGTERM` процесу ping. Впишіть: - ```bash - kill -15 $MYPROC3 - ``` + ```bash + kill -15 $MYPROC3 + ``` - Замініть MYPROC3 фактичним PID процесу у вашій системі. + Замініть MYPROC3 фактичним PID процесу у вашій системі. 5. Запустіть тривалий процес за допомогою команди `cat`. Впишіть: - ```bash - { cat /dev/random > /dev/null 2>&1 & MYPROC4=$!; } \ - 2>/dev/null; echo PID is: $MYPROC4 - ``` + ```bash + { cat /dev/random > /dev/null 2>&1 & MYPROC4=$!; } \ + 2>/dev/null; echo PID is: $MYPROC4 + ``` - Занотуйте PID для процесу у вашій системі. + Занотуйте PID для процесу у вашій системі. 6. Використовуйте `kill`, щоб примусово завершити процес, надіславши сигнал SIGKILL. - ```bash - kill -9 $MYPROC4 - ``` + ```bash + kill -9 $MYPROC4 + ``` - Підтвердьте, що процес завершено. + Підтвердьте, що процес завершено. - !!! question "Питання" + !!! question "Питання" - ``` - Поясніть мету надсилання сигналів процесам за допомогою команди `kill` і значення різних типів сигналів. - ``` + ``` + Поясніть мету надсилання сигналів процесам за допомогою команди `kill` і значення різних типів сигналів. + ``` ## Завдання 3 @@ -245,67 +245,67 @@ tags: 1. Запустіть верхню команду, щоб переглянути системну статистику в реальному часі. - ```bash - top - ``` + ```bash + top + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Яка інформація відображається у верхньому інтерфейсі? - ``` + ``` + Яка інформація відображається у верхньому інтерфейсі? + ``` 2. Спостерігайте за використанням процесора та пам’яті процесами у верхньому інтерфейсі. - !!! question "Питання" + !!! question "Питання" - ``` - Які процеси споживають найбільше процесора та пам’яті? - ``` + ``` + Які процеси споживають найбільше процесора та пам’яті? + ``` 3. Відсортуйте процеси вгорі за використанням ЦП (натисніть P) і використанням пам’яті (натисніть M). - !!! question "Питання" + !!! question "Питання" - ``` - Які процеси найбільше споживають процесор і пам’ять після сортування? - ``` + ``` + Які процеси найбільше споживають процесор і пам’ять після сортування? + ``` #### Щоб контролювати використання процесора та пам’яті певними процесами, використовуючи `top` 1. Створіть довільно великий файл розміром 512 МБ, який містить випадкові дані. - ```bash - sudo fallocate -l 512M ~/large-file.data - ``` + ```bash + sudo fallocate -l 512M ~/large-file.data + ``` 2. Почніть ресурсомісткий процес, наприклад значне стиснення файлу. - ```bash - tar -czf archive.tar.gz /path/to/large/directory - ``` + ```bash + tar -czf archive.tar.gz /path/to/large/directory + ``` 3. Відкрийте команду `top`, щоб контролювати використання ЦП і пам'яті. - ```bash - top - ``` + ```bash + top + ``` 4. У верхньому інтерфейсі знайдіть і виберіть ресурсомісткий процес. - !!! question "Питання" + !!! question "Питання" - ``` - Який ідентифікатор процесу та використання ресурсів інтенсивного процесу? - ``` + ``` + Який ідентифікатор процесу та використання ресурсів інтенсивного процесу? + ``` 5. Змініть порядок сортування вгорі, щоб відобразити процеси, які використовують найбільше ЦП або пам’яті (натисніть P або M). - !!! question "Питання" + !!! question "Питання" - ``` - Який процес знаходиться у верхній частині списку після сортування? - ``` + ``` + Який процес знаходиться у верхній частині списку після сортування? + ``` 6. Вийдіть із верхньої частини, натиснувши `q`. @@ -313,47 +313,47 @@ tags: 1. Запустіть команду `top` в інтерактивному режимі. - ```bash - top - ``` + ```bash + top + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Яка інформація відображається на верхньому екрані? - ``` + ``` + Яка інформація відображається на верхньому екрані? + ``` 2. Використовуйте одну клавішу, щоб відобразити підсумок використання окремого ядра ЦП. - !!! question "Питання" + !!! question "Питання" - ``` - Яка розбивка використання ядра ЦП для кожного ядра? - ``` + ``` + Яка розбивка використання ядра ЦП для кожного ядра? + ``` 3. Натисніть u, щоб відобразити процеси для певного користувача. Введіть своє ім'я користувача. - !!! question "Питання" + !!! question "Питання" - ``` - Які процеси зараз запущені для вашого користувача? - ``` + ``` + Які процеси зараз запущені для вашого користувача? + ``` 4. Відсортуйте процеси за використанням пам’яті (натисніть M) і спостерігайте за процесами, які споживають найбільше пам’яті. - !!! question "Питання" + !!! question "Питання" - ``` - Які процеси використовують найбільше пам’яті? - ``` + ``` + Які процеси використовують найбільше пам’яті? + ``` 5. Вийдіть із верхньої частини, натиснувши q. - !!! question "Питання" + !!! question "Питання" - ``` - Поясніть значення моніторингу системних ресурсів за допомогою команди top і як це може допомогти у вирішенні проблем продуктивності. - ``` + ``` + Поясніть значення моніторингу системних ресурсів за допомогою команди top і як це може допомогти у вирішенні проблем продуктивності. + ``` ## Завдання 4 @@ -363,78 +363,78 @@ tags: 1. Запустіть процес із інтенсивним використанням процесора, який виконується з пріоритетом за замовчуванням/звичайним. Впишіть: - ```bash - bash -c 'while true; do echo "Default priority: The PID is $$"; done' - ``` + ```bash + bash -c 'while true; do echo "Default priority: The PID is $$"; done' + ``` - Вихід: + Вихід: - ```bash - Default priority: The PID is 2185209 - Default priority: The PID is 2185209 - Default priority: The PID is 2185209 - ....... - ``` + ```bash + Default priority: The PID is 2185209 + Default priority: The PID is 2185209 + Default priority: The PID is 2185209 + ....... + ``` - З виведених даних значення PID у нашій системі зразка становить «2185209». + З виведених даних значення PID у нашій системі зразка становить «2185209». - Значення PID у вашій системі буде іншим. + Значення PID у вашій системі буде іншим. - Зверніть увагу на те, що значення PID постійно відображається на екрані вашої системи. + Зверніть увагу на те, що значення PID постійно відображається на екрані вашої системи. 2. В іншому терміналі, використовуючи значення PID, перевірте пріоритет процесу за замовчуванням за допомогою `ps`. Впишіть: - ```bash - ps -p -o ni - ``` + ```bash + ps -p -o ni + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Який пріоритет процесу за замовчуванням (значення `nice`) запущеного процесу? - ``` + ``` + Який пріоритет процесу за замовчуванням (значення `nice`) запущеного процесу? + ``` 3. Використовуючи надрукований PID процесу, завершіть процес за допомогою команди `kill`. 4. Використовуючи команду `nice`, перезапустіть подібний процес із нижчим значенням якості (тобто більш сприятливим для процесу АБО вищим пріоритетом). Використовуйте `nice` значення «-20». Впишіть: - ```bash - nice -n -20 bash -c 'while true; do echo "High priority: The PID is $$"; done' - ``` + ```bash + nice -n -20 bash -c 'while true; do echo "High priority: The PID is $$"; done' + ``` 5. Використовуючи ваше значення PID, перевірте пріоритет процесу за допомогою `ps.` Впишіть: - ```bash - ps -p -o ni - ``` + ```bash + ps -p -o ni + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Чи успішно встановлено пріоритет процесу? - ``` + ``` + Чи успішно встановлено пріоритет процесу? + ``` 6. Одночасно натисніть клавіші ++ctrl+c++ на клавіатурі, щоб «закрити» новий процес з високим пріоритетом. 7. Знову використовуючи команду `nice`, перезапустіть інший процес, але цього разу з вищим значенням акуратності (тобто найменш сприятливим для процесу АБО нижчим пріоритетом). Використовуйте `nice` значення `19`, впишіть: - ```bash - nice -n 19 bash -c 'while true; do echo "Low priority: The PID is $$"; done' - ``` + ```bash + nice -n 19 bash -c 'while true; do echo "Low priority: The PID is $$"; done' + ``` - Вихід: + Вихід: - ```bash - Low priority: The PID is 2180254 - Low priority: The PID is 2180254 - ...... - ``` + ```bash + Low priority: The PID is 2180254 + Low priority: The PID is 2180254 + ...... + ``` 8. Перевірте настроюваний пріоритет процесу за допомогою `ps`. Впишіть: - ```bash - ps -p -o ni - ``` + ```bash + ps -p -o ni + ``` 9. Одночасно натисніть клавіші ++ctrl+c++ на клавіатурі, щоб припинити новий процес із низьким пріоритетом. @@ -444,73 +444,73 @@ tags: 1. Розпочніть інтенсивний процес, наприклад тривалий математичний розрахунок за допомогою утиліти md5sum. Впишіть: - ```bash - find / -path '/proc/*' -prune -o -type f -exec md5sum {} \; > /dev/null - ``` + ```bash + find / -path '/proc/*' -prune -o -type f -exec md5sum {} \; > /dev/null + ``` 2. Використовуйте команду `ps`, щоб визначити PID попереднього процесу `find/md5sum`. Впишіть: - ```bash - ps -C find -o pid= - ``` + ```bash + ps -C find -o pid= + ``` - Вихід: + Вихід: - ```bash - 2577072 - ``` + ```bash + 2577072 + ``` - Вихідні дані показують, що значення PID у нашій системі зразка становить «2577072». + Вихідні дані показують, що значення PID у нашій системі зразка становить «2577072». - Значення PID у вашій системі буде іншим. + Значення PID у вашій системі буде іншим. - Занотуйте значення PID у вашій системі. + Занотуйте значення PID у вашій системі. 3. Використовуйте команду `renice`, щоб змінити пріоритет запущеного процесу `find/md5sum` на нижче значення точності (наприклад, -10, вищий пріоритет). Впишіть: - ```bash - renice -n -10 -p $(ps -C find -o pid=) - ``` + ```bash + renice -n -10 -p $(ps -C find -o pid=) + ``` - Вихід: + Вихід: - ```bash + ```bash (process ID) old priority 0, new priority -10 - ``` + ``` - Замініть "" (вище) фактичним PID запущеного процесу. + Замініть "" (вище) фактичним PID запущеного процесу. 4. Контролюйте використання ресурсів для процесу `find/md5sum` за допомогою `top` (або `htop`). Впишіть: - ```bash - top -cp $(ps -C find -o pid=) - ``` + ```bash + top -cp $(ps -C find -o pid=) + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Чи отримує процес тепер більшу частку ресурсів ЦП? - ``` + ``` + Чи отримує процес тепер більшу частку ресурсів ЦП? + ``` 5. Змініть пріоритет процесу `find/md5sum` на вище значення `nice` (наприклад, 10, нижчий пріоритет). Впишіть: - ```bash - renice -n 10 -p - ``` + ```bash + renice -n 10 -p + ``` - Вихід: + Вихід: - ```bash - 2338530 (process ID) old priority -10, new priority 10 - ``` + ```bash + 2338530 (process ID) old priority -10, new priority 10 + ``` - Замініть "" (вище) фактичним PID запущеного процесу. + Замініть "" (вище) фактичним PID запущеного процесу. - !!! question "Питання" + !!! question "Питання" - ``` - Поясніть, як команда `nice` використовується для налаштування пріоритетів процесів і як вона впливає на розподіл системних ресурсів. - ``` + ``` + Поясніть, як команда `nice` використовується для налаштування пріоритетів процесів і як вона впливає на розподіл системних ресурсів. + ``` 6. Одночасно натисніть клавіші ++ctrl+c++ на клавіатурі, щоб зупинити процес `find/md5sum`. Ви також можете використати команду `kill`, щоб виконати те ж саме. @@ -522,41 +522,41 @@ tags: 1. Використовуйте команду `pgrep`, щоб визначити всі процеси, пов’язані з певною програмою чи службою, наприклад `sshd`. - ```bash - pgrep sshd - ``` + ```bash + pgrep sshd + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Які ідентифікатори процесів `sshd`? - ``` + ``` + Які ідентифікатори процесів `sshd`? + ``` 2. Перевірте існування ідентифікованих процесів за допомогою команди `ps`. - ```bash - ps -p - ``` + ```bash + ps -p + ``` - Замініть "" ідентифікаторами процесу, отриманими на кроці 1. + Замініть "" ідентифікаторами процесу, отриманими на кроці 1. 3. Використовуйте команду `pgrep`, щоб ідентифікувати процеси з певною назвою, наприклад, "cron". - ```bash - pgrep cron - ``` + ```bash + pgrep cron + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Чи існують процеси з назвою "cron"? - ``` + ``` + Чи існують процеси з назвою "cron"? + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Поясніть різницю між використанням `ps` і `pgrep` для ідентифікації та керування процесами. - ``` + ``` + Поясніть різницю між використанням `ps` і `pgrep` для ідентифікації та керування процесами. + ``` ## Завдання 6 @@ -568,81 +568,81 @@ tags: 1. Почніть довготривалий процес на передньому плані. Наприклад, ви можете використати просту команду на зразок `sleep`. Впишіть: - ```bash - sleep 300 - ``` + ```bash + sleep 300 + ``` 2. Призупиніть процес переднього плану, натиснувши ++ctrl+z++ на клавіатурі. Це повинно повернути вас до командної оболонки. 3. Виведіть список призупинених завдань за допомогою команди `jobs`. Впишіть: - ```bash - jobs - ``` + ```bash + jobs + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Який статус призупиненої роботи? - ``` + ``` + Який статус призупиненої роботи? + ``` 4. Поверніть призупинене завдання на передній план за допомогою команди `fg`. - ```bash - fg - ``` + ```bash + fg + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Що відбувається, коли ви повертаєте роботу на перший план? - ``` + ``` + Що відбувається, коли ви повертаєте роботу на перший план? + ``` 5. Знову призупиніть роботу за допомогою ++ctrl+z++, а потім перемістіть її у фоновий режим за допомогою команди `bg`. - ```bash - bg - ``` + ```bash + bg + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Який зараз статус роботи? - ``` + ``` + Який зараз статус роботи? + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Поясніть призначення активних і фонових процесів і як ними керують за допомогою команд `fg` і `bg`. - ``` + ``` + Поясніть призначення активних і фонових процесів і як ними керують за допомогою команд `fg` і `bg`. + ``` #### Щоб розпочати процес у фоновому режимі 1. Символ `&` може запускати процес, який негайно виконується у фоновому режимі. Наприклад, щоб запустити команду `sleep` у фоновому режимі, введіть: - ```bash - sleep 300 & - ``` + ```bash + sleep 300 & + ``` - Призупиніть запущений процес за допомогою ++ctrl+z++. + Призупиніть запущений процес за допомогою ++ctrl+z++. 2. Список статусів усіх активних завдань. Впишіть: - ```bash - jobs -l - ``` + ```bash + jobs -l + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Який статус процесу `sleep 300`? - ``` + ``` + Який статус процесу `sleep 300`? + ``` 3. Поверніть фоновий процес на передній план за допомогою команди `fg`. - ```bash - fg - ``` + ```bash + fg + ``` 4. Передчасно завершити процес «сплячого режиму», надіславши йому сигнал SIGSTOP, натиснувши ++ctrl+c++. @@ -650,23 +650,23 @@ tags: 1. Запустіть інтерактивний процес, наприклад текстовий редактор `vi`, щоб створити та відредагувати зразок текстового файлу під назвою "foobar.txt". Впишіть: - ```bash - vi foobar1.txt - ``` + ```bash + vi foobar1.txt + ``` - Призупиніть запущений процес за допомогою `Ctrl` + `Z`. + Призупиніть запущений процес за допомогою `Ctrl` + `Z`. - Використовуйте команду `bg`, щоб перевести призупинений процес у фоновий режим. + Використовуйте команду `bg`, щоб перевести призупинений процес у фоновий режим. - ```bash - bg - ``` + ```bash + bg + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Процес зараз працює у фоновому режимі? - ``` + ``` + Процес зараз працює у фоновому режимі? + ``` 2. Введіть «Hello» у `foobar1.txt` у вашому редакторі `vi`. @@ -674,9 +674,9 @@ tags: 4. Запустіть ще один окремий сеанс редактора `vi`, щоб створити інший текстовий файл під назвою "foobar2.txt". Впишіть: - ```bash - vi foobar2.txt - ``` + ```bash + vi foobar2.txt + ``` 5. Введіть зразок тексту «Hi inside foobar2.txt» під час 2-го сеансу vi. @@ -684,45 +684,45 @@ tags: 7. Покажіть статус усіх «задач» на поточному терміналі. Впишіть: - ```bash - jobs -l - ``` + ```bash + jobs -l + ``` - Вихід: + Вихід: - ```bash - [1]- 2977364 Stopped vi foobar1.txt - [2]+ 2977612 Stopped vi foobar2.txt - ``` + ```bash + [1]- 2977364 Stopped vi foobar1.txt + [2]+ 2977612 Stopped vi foobar2.txt + ``` - Ви повинні мати принаймні дві роботи, перелічені у вашому виході. Число в 1-му стовпчику вихідних даних показує номери робіт - [1] і [2]. + Ви повинні мати принаймні дві роботи, перелічені у вашому виході. Число в 1-му стовпчику вихідних даних показує номери робіт - [1] і [2]. 8. Відновіть ==та виведіть на передній план== 1-й сеанс `vi`, ввівши: - ```bash - fg %1 - ``` + ```bash + fg %1 + ``` 9. Знову призупиніть перший сеанс `vi` за допомогою ++ctrl+z++. 10. Відновіть ==та виведіть на передній план== 2-й сеанс `vi`, ввівши: - ```bash - fg %2 - ``` + ```bash + fg %2 + ``` 11. Припиніть обидва сеанси редагування `vi`, надіславши сигнал KILL до обох завдань. Слідкуйте за командою `kill` з командою jobs. Впишіть: - ```bash - kill -SIGKILL %1 %2 && jobs - ``` + ```bash + kill -SIGKILL %1 %2 && jobs + ``` - Вихід: + Вихід: - ```bash - [1]- Killed vi foobar1.txt - [2]+ Killed vi foobar2.txt - ``` + ```bash + [1]- Killed vi foobar1.txt + [2]+ Killed vi foobar2.txt + ``` ## Завдання 7 @@ -734,25 +734,25 @@ tags: 2. Використовуйте команду `pidof`, щоб знайти ідентифікатор процесу `systemd`. Впишіть: - ```bash - pidof systemd - ``` + ```bash + pidof systemd + ``` - Зверніть увагу на ідентифікатор(и) процесу `systemd`. + Зверніть увагу на ідентифікатор(и) процесу `systemd`. 3. Перевірте існування ідентифікованого процесу за допомогою команди `ps`. - ```bash - ps -p - ``` + ```bash + ps -p + ``` - Замініть фактичним ідентифікатором процесу, отриманим на кроці 2. + Замініть фактичним ідентифікатором процесу, отриманим на кроці 2. - !!! question "Питання" + !!! question "Питання" - ``` - Поясніть різницю між `pgrep` і `pidof` для пошуку ідентифікатора процесу запущеної команди. - ``` + ``` + Поясніть різницю між `pgrep` і `pidof` для пошуку ідентифікатора процесу запущеної команди. + ``` ## Завдання 8 @@ -762,39 +762,39 @@ tags: 1. Виведіть вміст каталогу /sys. Впишіть: - ```bash - ls /sys - ``` + ```bash + ls /sys + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Яка інформація зберігається в каталозі /sys? - ``` + ``` + Яка інформація зберігається в каталозі /sys? + ``` 2. Перейдіть до певного запису /sys, наприклад, інформації про ЦП. - ```bash - cd /sys/devices/system/cpu - ``` + ```bash + cd /sys/devices/system/cpu + ``` 3. Виведіть список вмісту поточного каталогу, щоб переглянути інформацію, пов’язану з ЦП. - ```bash - ls - ``` + ```bash + ls + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Яка інформація про ЦП доступна у файловій системі /sys? - ``` + ``` + Яка інформація про ЦП доступна у файловій системі /sys? + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Поясніть призначення файлової системи /sys в Linux і її роль в управлінні обладнанням і конфігурацією системи. - ``` + ``` + Поясніть призначення файлової системи /sys в Linux і її роль в управлінні обладнанням і конфігурацією системи. + ``` ## Завдання 9 @@ -804,41 +804,41 @@ tags: 1. Ідентифікуйте процеси з конкретною назвою, наприклад "firefox". - ```bash - pkill firefox - ``` + ```bash + pkill firefox + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Чи всі процеси з назвою "firefox" були припинені? - ``` + ``` + Чи всі процеси з назвою "firefox" були припинені? + ``` 2. Перевірте стан процесів, які ви зупинили за допомогою `ps`. - ```bash - ps aux | grep firefox - ``` + ```bash + ps aux | grep firefox + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Чи залишилися процеси з назвою "firefox"? - ``` + ``` + Чи залишилися процеси з назвою "firefox"? + ``` - Використовуйте `pkill`, щоб примусово припинити всі процеси з певним іменем. + Використовуйте `pkill`, щоб примусово припинити всі процеси з певним іменем. - ```bash - pkill -9 firefox - ``` + ```bash + pkill -9 firefox + ``` - Переконайтеся, що всі процеси з назвою «firefox» завершено. + Переконайтеся, що всі процеси з назвою «firefox» завершено. - !!! question "Питання" + !!! question "Питання" - ``` - Яка різниця між використанням `kill` і `pkill` для завершення процесів за назвою? - ``` + ``` + Яка різниця між використанням `kill` і `pkill` для завершення процесів за назвою? + ``` ## Вправа 10 @@ -850,41 +850,41 @@ tags: 1. Розпочніть новий сеанс оболонки. Впишіть: - ```bash - bash - ``` + ```bash + bash + ``` 2. Виконайте команду, яка не завершується в новій оболонці, наприклад простий цикл while. - ```bash - while true; do echo "Running..."; done - ``` + ```bash + while true; do echo "Running..."; done + ``` 3. У поточній оболонці замініть запущену команду на іншу за допомогою `exec`. - ```bash - exec echo "This replaces the previous command." - ``` + ```bash + exec echo "This replaces the previous command." + ``` - Зауважте, що попередня команда завершується, та виконується нова команда. + Зауважте, що попередня команда завершується, та виконується нова команда. 4. Переконайтеся, що стара команда більше не виконується за допомогою `ps`. - ```bash - ps aux | grep "while true" - ``` + ```bash + ps aux | grep "while true" + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Попередня команда все ще виконується? - ``` + ``` + Попередня команда все ще виконується? + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Поясніть, як команда `exec` може замінити поточний процес оболонки на іншу команду. - ``` + ``` + Поясніть, як команда `exec` може замінити поточний процес оболонки на іншу команду. + ``` ## Вправа 11 @@ -896,41 +896,41 @@ tags: 1. Ідентифікуйте процеси за допомогою конкретної назви, наприклад «chrome». - ```bash - killall chrome - ``` + ```bash + killall chrome + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Чи всі процеси з назвою "chrome" були припинені? - ``` + ``` + Чи всі процеси з назвою "chrome" були припинені? + ``` 2. Перевірте стан процесів, які ви зупинили за допомогою `ps`. - ```bash - ps aux | grep chrome - ``` + ```bash + ps aux | grep chrome + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Чи залишилися процеси з назвою "chrome"? - ``` + ``` + Чи залишилися процеси з назвою "chrome"? + ``` 3. Використовуйте `killall`, щоб примусово припинити всі процеси з певною назвою. - ```bash - killall -9 chrome - ``` + ```bash + killall -9 chrome + ``` - Переконайтеся, що всі процеси з іменем "chrome" завершено. + Переконайтеся, що всі процеси з іменем "chrome" завершено. - !!! question "Питання" + !!! question "Питання" - ``` - Чим `killall` відрізняється від `pkill` і `kill` при завершенні процесів за назвою? - ``` + ``` + Чим `killall` відрізняється від `pkill` і `kill` при завершенні процесів за назвою? + ``` ## Вправа 12 @@ -940,47 +940,47 @@ tags: 1. Перелічіть існуючі `cgroups` у вашій системі. - ```bash - cat /proc/cgroups - ``` + ```bash + cat /proc/cgroups + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Які контролери `cgroup` доступні у вашій системі? - ``` + ``` + Які контролери `cgroup` доступні у вашій системі? + ``` 2. Створіть нову cgroup за допомогою контролера ЦП. Назвіть її «mygroup». - ```bash - sudo mkdir -p /sys/fs/cgroup/cpu/mygroup - ``` + ```bash + sudo mkdir -p /sys/fs/cgroup/cpu/mygroup + ``` 3. Перемістіть певний процес (наприклад, запущену команду сну) до «mygroup» `cgroup`. - ```bash - echo | sudo tee /sys/fs/cgroup/cpu/mygroup/cgroup.procs - ``` + ```bash + echo | sudo tee /sys/fs/cgroup/cpu/mygroup/cgroup.procs + ``` - Замініть фактичним PID процесу. + Замініть фактичним PID процесу. 4. Перевірте, чи процес перенесено до "mygroup" `cgroup`. - ```bash - cat /sys/fs/cgroup/cpu/mygroup/cgroup.procs - ``` + ```bash + cat /sys/fs/cgroup/cpu/mygroup/cgroup.procs + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Чи вказаний процес у "mygroup" cgroup? - ``` + ``` + Чи вказаний процес у "mygroup" cgroup? + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Поясніть концепцію «cgroups» у Linux і те, як вони можуть керувати та контролювати розподіл ресурсів для процесів. - ``` + ``` + Поясніть концепцію «cgroups» у Linux і те, як вони можуть керувати та контролювати розподіл ресурсів для процесів. + ``` ## Вправа 13 @@ -990,46 +990,46 @@ tags: 1. Визначте запущений процес із певним PID та пріоритетом за допомогою `ps`. - ```bash - ps -p -o ni - ``` + ```bash + ps -p -o ni + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Який поточний пріоритет (значення nice) процесу? - ``` + ``` + Який поточний пріоритет (значення nice) процесу? + ``` 2. Використовуйте команду `renice`, щоб змінити пріоритет запущеного процесу (значення nice). - ```bash - renice -p - ``` + ```bash + renice -p + ``` - Замініть на нове значення пріоритету, яке ви хочете встановити, а на фактичний PID процесу. + Замініть на нове значення пріоритету, яке ви хочете встановити, а на фактичний PID процесу. 3. Переконайтеся, що пріоритет процесу було змінено за допомогою `ps`. - ```bash - ps -p -o ni - ``` + ```bash + ps -p -o ni + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Зараз пріоритет інший? - ``` + ``` + Зараз пріоритет інший? + ``` 4. Поекспериментуйте зі зміною пріоритету на вищі та нижчі значення та спостерігайте за впливом на використання ресурсів процесу. - !!! question "Питання" + !!! question "Питання" - ``` - Що відбувається зі споживанням ресурсів процесом із різними значеннями nice? - ``` + ``` + Що відбувається зі споживанням ресурсів процесом із різними значеннями nice? + ``` - !!! question "Питання" + !!! question "Питання" - ``` - Поясніть, як команда renice використовується для налаштування пріоритету запущених процесів і її вплив на використання ресурсів процесу. - ``` + ``` + Поясніть, як команда renice використовується для налаштування пріоритету запущених процесів і її вплив на використання ресурсів процесу. + ``` diff --git a/docs/labs/systems_administration_II/lab4-advanced_system_process_monitoring.it.md b/docs/labs/systems_administration_II/lab4-advanced_system_process_monitoring.it.md index 85526a8f33..a4103aa23b 100644 --- a/docs/labs/systems_administration_II/lab4-advanced_system_process_monitoring.it.md +++ b/docs/labs/systems_administration_II/lab4-advanced_system_process_monitoring.it.md @@ -47,59 +47,59 @@ Il comando `fuser` in Linux è utilizzato per identificare i processi che utiliz 1. Per prima cosa, creare un file di prova vuoto a cui si vuole accedere. Digitare: - ```bash - touch ~/testfile.txt - ``` + ```bash + touch ~/testfile.txt + ``` 2. Creare lo script che verrà utilizzato per simulare l'accesso a `testfile.txt`. Digitare: - ```bash - cat > ~/simulate_file_usage.sh << EOF - #!/bin/bash - tail -f ~/testfile.txt - EOF - ``` + ```bash + cat > ~/simulate_file_usage.sh << EOF + #!/bin/bash + tail -f ~/testfile.txt + EOF + ``` 3. Rendere lo script eseguibile. Digitare: - ```bash - chmod +x ~/simulate_file_usage.sh - ``` + ```bash + chmod +x ~/simulate_file_usage.sh + ``` 4. Avviare lo script. Digitare: - ```bash - ~/simulate_file_usage.sh & - ``` + ```bash + ~/simulate_file_usage.sh & + ``` #### Identificazione dei processi che accedono a un file 1. Identificare i processi che utilizzano o accedono a `testfile.txt`, eseguire: - ```bash - fuser ~/testfile.txt - ``` + ```bash + fuser ~/testfile.txt + ``` 2. Esplorare altre opzioni `fuser` usando l'opzione `-v`. Digitare: - ```bash - fuser -v ~/testfile.txt - ``` + ```bash + fuser -v ~/testfile.txt + ``` 3. Il tutto è stato fatto con `testfile.txt` e `simulate_file_usage.sh`. Ora è possibile rimuovere i file. Digitare: - ```bash - kill %1 - rm ~/testfile.txt ~/simulate_file_usage.sh - ``` + ```bash + kill %1 + rm ~/testfile.txt ~/simulate_file_usage.sh + ``` #### Identificazione di un processo che accede a una porta TCP/UDP 1. Utilizzare il comando `fuser` per identificare il processo di accesso alla porta TCP 22 del server. Digitare: - ```bash - sudo fuser 22/tcp - ``` + ```bash + sudo fuser 22/tcp + ``` ## Esercizio 2 @@ -111,137 +111,137 @@ Il comando `fuser` in Linux è utilizzato per identificare i processi che utiliz 1. Installare l'applicazione `perf` se non è installata sul server. Digitare: - ```bash - sudo dnf -y install perf - ``` + ```bash + sudo dnf -y install perf + ``` 2. L'applicazione `bc` è una calcolatrice di precisione a riga di comando. In questo esercizio verrà utilizzato `bc` per simulare un elevato carico della CPU. Se `bc` non è già installato sul server, installarlo con: - ```bash - sudo dnf -y install bc - ``` + ```bash + sudo dnf -y install bc + ``` #### Per creare uno script per generare il carico della CPU 1. Creare uno script di carico della CPU e renderlo eseguibile eseguendo: - ```bash - cat > ~/generate_cpu_load.sh << EOF - #!/bin/bash + ```bash + cat > ~/generate_cpu_load.sh << EOF + #!/bin/bash - # Check if the number of decimal places is passed as an argument - if [ "$#" -ne 1 ]; then - echo "Usage: $0 " - exit 1 - fi + # Check if the number of decimal places is passed as an argument + if [ "$#" -ne 1 ]; then + echo "Usage: $0 " + exit 1 + fi - # Calculate Pi to the specified number of decimal places - for i in {1..10}; do echo "scale=$1; 4*a(1)" | bc -l; done + # Calculate Pi to the specified number of decimal places + for i in {1..10}; do echo "scale=$1; 4*a(1)" | bc -l; done - EOF - chmod +x ~/generate_cpu_load.sh - ``` + EOF + chmod +x ~/generate_cpu_load.sh + ``` - !!! tip "Suggerimento" + !!! tip "Suggerimento" - ``` - Lo script `generate_cpu_load.sh` è un semplice strumento per generare il carico della CPU calcolando il Pi greco (π) ad alta precisione. Lo stesso calcolo viene eseguito 10 volte. Lo script accetta un intero come parametro per specificare il numero di cifre decimali per il calcolo del Pi greco. - ``` + ``` + Lo script `generate_cpu_load.sh` è un semplice strumento per generare il carico della CPU calcolando il Pi greco (π) ad alta precisione. Lo stesso calcolo viene eseguito 10 volte. Lo script accetta un intero come parametro per specificare il numero di cifre decimali per il calcolo del Pi greco. + ``` #### Simulazione del carico supplementare della CPU 1. Eseguire un semplice test e calcolare il Pi greco con 50 cifre decimali. Eseguite lo script digitando: - ```bash - ~/generate_cpu_load.sh 50 & - ``` + ```bash + ~/generate_cpu_load.sh 50 & + ``` 2. Eseguire nuovamente lo script, ma utilizzare `perf` per registrare le prestazioni dello script e analizzare l'utilizzo della CPU e altre metriche. Digitare: - ```bash + ```bash - ./generate_cpu_load.sh 1000 & perf record -p $! sleep 5 - ``` + ./generate_cpu_load.sh 1000 & perf record -p $! sleep 5 + ``` - !!! tip "Suggerimento" + !!! tip "Suggerimento" - ``` - L'opzione `sleep 5` con il comando `perf record` definisce la finestra temporale in cui `perf` raccoglie i dati sulle prestazioni del carico della CPU generato dallo script generate_cpu_load.sh. Consente a `perf di registrare le metriche delle prestazioni del sistema per 5 secondi prima di fermarsi automaticamente. - ``` + ``` + L'opzione `sleep 5` con il comando `perf record` definisce la finestra temporale in cui `perf` raccoglie i dati sulle prestazioni del carico della CPU generato dallo script generate_cpu_load.sh. Consente a `perf di registrare le metriche delle prestazioni del sistema per 5 secondi prima di fermarsi automaticamente. + ``` #### Per analizzare i dati sulle prestazioni e monitorare gli eventi in tempo reale 1. Usare il comando `perf report` per esaminare il report dei dati sulle prestazioni e capire i modelli di utilizzo della CPU e della memoria. Digitare: - ```bash - sudo perf report - ``` + ```bash + sudo perf report + ``` - È possibile utilizzare vari tasti della tastiera per esplorare ulteriormente il rapporto. - Digitare ++"q"++ per uscire dall'interfaccia di visualizzazione dei rapporti `perf`. + È possibile utilizzare vari tasti della tastiera per esplorare ulteriormente il rapporto. + Digitare ++"q"++ per uscire dall'interfaccia di visualizzazione dei rapporti `perf`. 2. Osservare/capire gli eventi della cache della CPU in tempo reale per 40 secondi per identificare potenziali colli di bottiglia delle prestazioni. Digitare: - ```bash - sudo perf stat -e cache-references,cache-misses sleep 40 - ``` + ```bash + sudo perf stat -e cache-references,cache-misses sleep 40 + ``` #### Per registrare le prestazioni complete del sistema 1. Acquisizione di dati sulle prestazioni dell'intero sistema che possono essere utilizzati per ulteriori analisi. Digitare: - ```bash - sudo perf record -a sleep 10 - ``` + ```bash + sudo perf record -a sleep 10 + ``` 2. Esplorare i contatori di eventi specifici. Contare eventi specifici come i cicli della CPU per valutare le prestazioni di un determinato script o applicazione. Eseguiamo un test con un comando `find` di base, digitando: - ```bash - sudo perf stat -e cycles find /proc - ``` + ```bash + sudo perf stat -e cycles find /proc + ``` 3. Fare la stessa cosa ma con lo script `generate_cpu_load.sh`. Acquisire eventi specifici come i cicli della CPU per valutare le prestazioni dello script `generate_cpu_load.sh`. Digitare: - ```bash - sudo perf stat -e cycles ./generate_cpu_load.sh 500 - ``` + ```bash + sudo perf stat -e cycles ./generate_cpu_load.sh 500 + ``` - OUTPUT: + OUTPUT: - ```bash - ...... - 3.141592653589793238462643383279502884197169399375105820974944592307\ - 81640628620899862803482534211..... + ```bash + ...... + 3.141592653589793238462643383279502884197169399375105820974944592307\ + 81640628620899862803482534211..... - Performance counter stats for './generate_cpu_load.sh 500': + Performance counter stats for './generate_cpu_load.sh 500': - 1,670,638,886 cycles + 1,670,638,886 cycles - 0.530479014 seconds time elapsed + 0.530479014 seconds time elapsed - 0.488580000 seconds user - 0.034628000 seconds sys - ``` + 0.488580000 seconds user + 0.034628000 seconds sys + ``` - !!! note "Nota" + !!! note "Nota" - ``` - Ecco la ripartizione dell'output finale del comando `perf stat`: - - *1,670,638,886 cycles*: Indica il numero totale di cicli della CPU consumati durante l'esecuzione dello script. Ogni ciclo rappresenta un singolo passo nell'esecuzione delle istruzioni della CPU. + ``` + Ecco la ripartizione dell'output finale del comando `perf stat`: + + *1,670,638,886 cycles*: Indica il numero totale di cicli della CPU consumati durante l'esecuzione dello script. Ogni ciclo rappresenta un singolo passo nell'esecuzione delle istruzioni della CPU. - *0.530479014 seconds time elapsed*: È il tempo totale trascorso nel mondo reale (o tempo wall-clock) dall'inizio alla fine dell'esecuzione dello script. Questa durata include tutti i tipi di attesa (come l'attesa di I/O su disco o le chiamate di sistema). + *0.530479014 seconds time elapsed*: È il tempo totale trascorso nel mondo reale (o tempo wall-clock) dall'inizio alla fine dell'esecuzione dello script. Questa durata include tutti i tipi di attesa (come l'attesa di I/O su disco o le chiamate di sistema). - *0.488580000 seconds user*: È il tempo di CPU trascorso in modalità utente. Questo tempo esclude esplicitamente il tempo dedicato alle attività a livello di sistema. + *0.488580000 seconds user*: È il tempo di CPU trascorso in modalità utente. Questo tempo esclude esplicitamente il tempo dedicato alle attività a livello di sistema. - *0.034628000 seconds sys*: È il tempo trascorso dalla CPU in modalità kernel o di sistema. Include il tempo che la CPU trascorre eseguendo chiamate di sistema o eseguendo altre attività a livello di sistema per conto dello script. - ``` + *0.034628000 seconds sys*: È il tempo trascorso dalla CPU in modalità kernel o di sistema. Include il tempo che la CPU trascorre eseguendo chiamate di sistema o eseguendo altre attività a livello di sistema per conto dello script. + ``` 4. Tutto fatto con lo strumento `perf`. Assicurarsi che tutti gli script in background garantiscano un ambiente di lavoro pulito. - ```bash - kill %1 - ``` + ```bash + kill %1 + ``` ## Esercizio 3 @@ -253,92 +253,92 @@ Il comando `fuser` in Linux è utilizzato per identificare i processi che utiliz 1. Creare un semplice script chiamato `strace_script.sh` e renderlo eseguibile. Digitare: - ```bash - cat > ~/strace_script.sh << EOF - #!/bin/bash - while true; do - date - sleep 1 - done - EOF - chmod +x ~/strace_script.sh - ``` + ```bash + cat > ~/strace_script.sh << EOF + #!/bin/bash + while true; do + date + sleep 1 + done + EOF + chmod +x ~/strace_script.sh + ``` #### Per usare `strace` sui processi in esecuzione 1. Eseguire lo script e allegare `strace`. Digitare: - ```bash - ~/strace_script.sh & - ``` + ```bash + ~/strace_script.sh & + ``` 2. Trovare il PID del processo `strace_script.sh` in un terminale separato. Memorizzare il PID in una variabile denominata MYPID. A tale scopo, utilizzare il comando `pgrep` eseguendo: - ```bash - export MYPID=$(pgrep strace_script) ; echo $MYPID - ``` + ```bash + export MYPID=$(pgrep strace_script) ; echo $MYPID + ``` - OUTPUT: + OUTPUT: - ```bash - 4006301 - ``` + ```bash + 4006301 + ``` 3. Iniziate a tracciare le chiamate di sistema dello script per capire come interagisce con il kernel. Collegare `strace` al processo di script in esecuzione digitando: - ```bash - sudo strace -p $MYPID - ``` + ```bash + sudo strace -p $MYPID + ``` 4. Interrompi o arresta il processo `strace` digitando ++ctrl+c++ 5. L'output di `strace` può essere filtrato concentrandosi su specifiche chiamate di sistema come `open` e `read` per analizzarne il comportamento. Provate a farlo per le chiamate di sistema `open` e `read`. Digitare: - ```bash - sudo strace -e trace=open,read -p $MYPID - ``` + ```bash + sudo strace -e trace=open,read -p $MYPID + ``` - Una volta terminato il tentativo di decifrare l'output di `strace`, interrompere il processo `strace` digitando ++ctrl+c++ + Una volta terminato il tentativo di decifrare l'output di `strace`, interrompere il processo `strace` digitando ++ctrl+c++ 6. Reindirizzare l'output in un file per un'analisi successiva, che può aiutare a diagnosticare i problemi. Salvare l'output di `strace` in un file eseguendo: - ```bash - sudo strace -o strace_output.txt -p $MYPID - ``` + ```bash + sudo strace -o strace_output.txt -p $MYPID + ``` #### Per analizzare la frequenza delle chiamate di sistema 1. Riassumere il conteggio delle chiamate di sistema per identificare le chiamate di sistema più frequentemente utilizzate dal processo. Eseguire questa operazione per soli 10 secondi, aggiungendo il comando `timeout`. Digitare: - ```bash - sudo timeout 10 strace -c -p $MYPID - ``` - - Il sistema di esempio mostra un report di riepilogo come questo: - - OUTPUT: - - ```bash - strace: Process 4006301 attached - strace: Process 4006301 detached - % time seconds usecs/call calls errors syscall - ------ ----------- ----------- --------- --------- ---------------- - 89.59 0.042553 1182 36 18 wait4 - 7.68 0.003648 202 18 clone - 1.67 0.000794 5 144 rt_sigprocmask - 0.45 0.000215 5 36 rt_sigaction - 0.36 0.000169 9 18 ioctl - 0.25 0.000119 6 18 rt_sigreturn - ------ ----------- ----------- --------- --------- ---------------- - 100.00 0.047498 175 270 18 total - ``` + ```bash + sudo timeout 10 strace -c -p $MYPID + ``` + + Il sistema di esempio mostra un report di riepilogo come questo: + + OUTPUT: + + ```bash + strace: Process 4006301 attached + strace: Process 4006301 detached + % time seconds usecs/call calls errors syscall + ------ ----------- ----------- --------- --------- ---------------- + 89.59 0.042553 1182 36 18 wait4 + 7.68 0.003648 202 18 clone + 1.67 0.000794 5 144 rt_sigprocmask + 0.45 0.000215 5 36 rt_sigaction + 0.36 0.000169 9 18 ioctl + 0.25 0.000119 6 18 rt_sigreturn + ------ ----------- ----------- --------- --------- ---------------- + 100.00 0.047498 175 270 18 total + ``` 2. Terminare lo script e rimuovere i file creati. - ```bash - kill $MYPID - rm ~/strace_script.sh ~/strace_output.txt - ``` + ```bash + kill $MYPID + rm ~/strace_script.sh ~/strace_output.txt + ``` ## Esercizio 4 @@ -350,45 +350,45 @@ Il comando `fuser` in Linux è utilizzato per identificare i processi che utiliz 1. Installare l'applicazione `atop` se non è installata sul server. Digitare: - ```bash - sudo dnf -y install atop - ``` + ```bash + sudo dnf -y install atop + ``` 2. Eseguire `atop` digitando: - ```bash - sudo atop - ``` + ```bash + sudo atop + ``` 3. All'interno dell'interfaccia `atop`, è possibile esplorare varie metriche `atop` premendo tasti specifici sulla tastiera. - È possibile utilizzare i tasti 'm', 'd' o 'n' per passare dalla visualizzazione della memoria a quella del disco o della rete. Osservare l'utilizzo delle risorse in tempo reale. + È possibile utilizzare i tasti 'm', 'd' o 'n' per passare dalla visualizzazione della memoria a quella del disco o della rete. Osservare l'utilizzo delle risorse in tempo reale. 4. Monitorare le prestazioni del sistema a un intervallo personalizzato di 2 secondi, consentendo una visione più granulare dell'attività del sistema. Digitare: - ```bash - sudo atop 2 - ``` + ```bash + sudo atop 2 + ``` 5. Passare da una visualizzazione all'altra delle risorse per concentrarsi su aspetti specifici delle prestazioni del sistema. 6. Generare un report su file di registro per l'attività del sistema, acquisendo i dati ogni 60 secondi, per tre volte. Digitare: - ```bash - sudo atop -w /tmp/atop_log 60 3 - ``` + ```bash + sudo atop -w /tmp/atop_log 60 3 + ``` 7. Una volta completato il comando precedente, è possibile esaminare con calma il file binario in cui sono stati salvati i registri. Per rileggere il file di registro salvato, digitare: - ```bash - sudo atop -r /tmp/atop_log - ``` + ```bash + sudo atop -r /tmp/atop_log + ``` 8. Pulire rimuovendo i log o i file generati. - ```bash - sudo rm /tmp/atop_log - ``` + ```bash + sudo rm /tmp/atop_log + ``` ## Esercizio 5 @@ -403,54 +403,54 @@ L'applicazione `numactl` gestisce la politica NUMA, ottimizzando le prestazioni 1. Installare l'applicazione `numactl` se non è installata sul server. Digitare: - ```bash - sudo dnf -y install numactl - ``` + ```bash + sudo dnf -y install numactl + ``` #### Per creare uno script ad alta intensità di memoria 1. Create un semplice script per simulare un carico di lavoro ad alta intensità di memoria sul vostro server. Digitare: - ```bash - cat > ~/memory_intensive.sh << EOF - #!/bin/bash + ```bash + cat > ~/memory_intensive.sh << EOF + #!/bin/bash - awk 'BEGIN{for(i=0;i<1000000;i++)for(j=0;j<1000;j++);}{}' - EOF - chmod +x ~/memory_intensive.sh - ``` + awk 'BEGIN{for(i=0;i<1000000;i++)for(j=0;j<1000;j++);}{}' + EOF + chmod +x ~/memory_intensive.sh + ``` #### Utilizzo di `numactl` 1. Eseguire lo script con `numactl`, digitare: - ```bash - numactl --membind=0 ~/memory_intensive.sh - ``` + ```bash + numactl --membind=0 ~/memory_intensive.sh + ``` 2. Se il sistema dispone di più di un nodo NUMA, è possibile eseguire lo script su più nodi NUMA tramite: - ```bash - numactl --cpunodebind=0,1 --membind=0,1 ~/memory_intensive.sh - ``` + ```bash + numactl --cpunodebind=0,1 --membind=0,1 ~/memory_intensive.sh + ``` 3. Visualizzare l'allocazione della memoria sui nodi NUMA - ```bash - numactl --show - ``` + ```bash + numactl --show + ``` 4. Legare la memoria a un nodo specifico eseguendo: - ```bash - numactl --membind=0 ~/memory_intensive.sh - ``` + ```bash + numactl --membind=0 ~/memory_intensive.sh + ``` 5. Pulite l'ambiente di lavoro rimuovendo lo script. - ```bash - rm ~/memory_intensive.sh - ``` + ```bash + rm ~/memory_intensive.sh + ``` ## Esercizio 6 @@ -462,19 +462,19 @@ Il comando `iotop` monitora l'utilizzo dell'I/O (input/output) del disco da part 1. Installare l'utilità `iotop` se non è installata. Digitare: - ```bash - sudo dnf -y install iotop - ``` + ```bash + sudo dnf -y install iotop + ``` #### Per usare `iotop` per monitorare l'I/O del disco 1. Eseguire il comando \`iotop' senza alcuna opzione per utilizzarlo nella sua modalità interattiva predefinita. Digitare: - ```bash - sudo iotop - ``` + ```bash + sudo iotop + ``` - Osservare l'utilizzo del disco live I/O da parte dei vari processi. Si usa per identificare i processi che stanno leggendo o scrivendo sul disco. + Osservare l'utilizzo del disco live I/O da parte dei vari processi. Si usa per identificare i processi che stanno leggendo o scrivendo sul disco. 2. Digitare ++"q"++ per uscire da `iotop`. @@ -482,27 +482,27 @@ Il comando `iotop` monitora l'utilizzo dell'I/O (input/output) del disco da part 1. Eseguire `iotop` in modalità batch (-b) per ottenere una visione non interattiva e immediata dell'utilizzo dell'I/O. L'opzione `-n 10` indica a `iotop` di prelevare 10 campioni prima di uscire. - ```bash - sudo iotop -b -n 10 - ``` + ```bash + sudo iotop -b -n 10 + ``` 2. `iotop` può filtrare l'I/O per processi specifici. Identificare l'ID di un processo (PID) dal sistema utilizzando il comando ps o la visualizzazione `iotop`. Quindi, filtrare l'uscita `iotop` per quel PID specifico. Ad esempio, filtrare il PID del processo `sshd`, eseguendo: - ```bash - sudo iotop -p $(pgrep sshd | head -1) - ``` + ```bash + sudo iotop -p $(pgrep sshd | head -1) + ``` 3. L'opzione -`o` con `iotop` può essere usata per mostrare i processi o i thread che eseguono l'I/O effettivo, invece di visualizzare tutti i processi o i thread. Visualizzare solo i processi di I/O in esecuzione: - ```bash - sudo iotop -o - ``` + ```bash + sudo iotop -o + ``` - !!! Question "Discussione" + !!! Question "Discussione" - ``` - Discutere l'impatto dell'I/O del disco sulle prestazioni complessive del sistema e come strumenti come `iotop` possono aiutare nell'ottimizzazione del sistema. - ``` + ``` + Discutere l'impatto dell'I/O del disco sulle prestazioni complessive del sistema e come strumenti come `iotop` possono aiutare nell'ottimizzazione del sistema. + ``` ## Esercizio 7 @@ -516,141 +516,141 @@ Questo esercizio dimostra l'interazione diretta con il filesystem `cgroup` v2. 1. Usare il comando `ls` per esplorare il contenuto e la struttura del filesystem `cgroup`. Digitare: - ```bash - ls /sys/fs/cgroup/ - ``` + ```bash + ls /sys/fs/cgroup/ + ``` 2. Usare di nuovo il comando `ls` per elencare le cartelle \*.slice sotto il filesystem `cgroup`. Digitare: - ```bash - ls -d /sys/fs/cgroup/*.slice - ``` + ```bash + ls -d /sys/fs/cgroup/*.slice + ``` - Le cartelle con estensione .slice sono solitamente utilizzate in `systemd` per rappresentare una porzione delle risorse di sistema. Si tratta di `cgroups` standard gestiti da `systemd` per organizzare e gestire i processi di sistema. + Le cartelle con estensione .slice sono solitamente utilizzate in `systemd` per rappresentare una porzione delle risorse di sistema. Si tratta di `cgroups` standard gestiti da `systemd` per organizzare e gestire i processi di sistema. ### Per creare un `cgroup` personalizzato 1. Creare una directory denominata "exercise_group" nel file system /sys/fs/cgroup. Questa nuova cartella ospiterà le strutture dei gruppi di controllo necessarie per il resto dell'esercizio. Utilizzare il comando `mkdir` digitando: - ```bash - sudo mkdir -p /sys/fs/cgroup/exercise_group - ``` + ```bash + sudo mkdir -p /sys/fs/cgroup/exercise_group + ``` 2. Elenca i file e le directory sotto la struttura /sys/fs/cgroup/exercise_group. Digitare: - ```bash - sudo ls /sys/fs/cgroup/exercise_group/ - ``` + ```bash + sudo ls /sys/fs/cgroup/exercise_group/ + ``` - L'output mostra i file e le directory creati automaticamente dal sottosistema `cgroup` per gestire e monitorare le risorse del `cgroup`. + L'output mostra i file e le directory creati automaticamente dal sottosistema `cgroup` per gestire e monitorare le risorse del `cgroup`. #### Per impostare un nuovo limite di risorse di memoria 1. Impostare un limite di risorse di memoria per limitare l'uso della memoria a 4096 byte (4kB). Per limitare i processi nel `cgroup` affinché utilizzino un massimo di 4 kB di memoria, digitare: - ```bash - echo 4096 | sudo tee /sys/fs/cgroup/exercise_group/memory.max - ``` + ```bash + echo 4096 | sudo tee /sys/fs/cgroup/exercise_group/memory.max + ``` 2. Confermare l'impostazione del limite di memoria. Digitare: - ```bash - cat /sys/fs/cgroup/exercise_group/memory.max - ``` + ```bash + cat /sys/fs/cgroup/exercise_group/memory.max + ``` #### Per creare lo script di test memory_stress 1. Creare un semplice script eseguibile usando il comando `dd` per testare il limite delle risorse di memoria. Digitare: - ```bash - cat > ~/memory_stress.sh << EOF - #!/bin/bash - dd if=/dev/zero of=/tmp/stress_test bs=10M count=2000 - EOF - chmod +x ~/memory_stress.sh - ``` + ```bash + cat > ~/memory_stress.sh << EOF + #!/bin/bash + dd if=/dev/zero of=/tmp/stress_test bs=10M count=2000 + EOF + chmod +x ~/memory_stress.sh + ``` #### Per eseguire e aggiungere processi/script alla memoria `cgroup` 1. Avviare lo script `memory_stress.sh`, catturare il suo PID e aggiungere il PID a `cgroup.procs`. Digitare: - ```bash - ~/memory_stress.sh & - echo $! | sudo tee /sys/fs/cgroup/exercise_group/cgroup.procs - ``` + ```bash + ~/memory_stress.sh & + echo $! | sudo tee /sys/fs/cgroup/exercise_group/cgroup.procs + ``` - Utilizzare il file /sys/fs/cgroup/exercise_group/cgroup.procs per aggiungere o visualizzare i PID (Process ID) dei processi che sono membri di un determinato `cgroup`. La scrittura di un PID in questo file assegna il processo di script `memory_stress.sh` al `cgroup`. + Utilizzare il file /sys/fs/cgroup/exercise_group/cgroup.procs per aggiungere o visualizzare i PID (Process ID) dei processi che sono membri di un determinato `cgroup`. La scrittura di un PID in questo file assegna il processo di script `memory_stress.sh` al `cgroup`. 2. Il comando precedente terminerà molto rapidamente prima del completamento, perché ha superato i limiti di memoria di `cgroup`. È possibile eseguire il seguente comando `journalctl` in un altro terminale per visualizzare l'errore mentre si verifica. Digitare: - ```bash - journalctl -xe -f | grep -i memory - ``` + ```bash + journalctl -xe -f | grep -i memory + ``` - !!! tip "Suggerimento" + !!! tip "Suggerimento" - ```` - È possibile utilizzare rapidamente il comando ps per verificare l'utilizzo approssimativo della memoria di un processo se si conosce il PID del processo in esecuzione: + ```` + È possibile utilizzare rapidamente il comando ps per verificare l'utilizzo approssimativo della memoria di un processo se si conosce il PID del processo in esecuzione: - ```bash - pidof | xargs ps -o pid,comm,rss - ``` + ```bash + pidof | xargs ps -o pid,comm,rss + ``` - Questo output dovrebbe mostrare il Resident Set Size (RSS) in KB, che indica la memoria utilizzata dal processo specificato in un determinato momento. Ogni volta che il valore RSS di un processo supera il limite di memoria specificato nel valore memory.max di `cgroup`, il processo può essere soggetto alle politiche di gestione della memoria applicate dal kernel o dallo stesso `cgroup`. A seconda della configurazione del sistema, il sistema può intraprendere azioni quali la limitazione dell'uso della memoria del processo, l'arresto del processo o l'attivazione di un evento OOM (Out-of-Memory). - ```` + Questo output dovrebbe mostrare il Resident Set Size (RSS) in KB, che indica la memoria utilizzata dal processo specificato in un determinato momento. Ogni volta che il valore RSS di un processo supera il limite di memoria specificato nel valore memory.max di `cgroup`, il processo può essere soggetto alle politiche di gestione della memoria applicate dal kernel o dallo stesso `cgroup`. A seconda della configurazione del sistema, il sistema può intraprendere azioni quali la limitazione dell'uso della memoria del processo, l'arresto del processo o l'attivazione di un evento OOM (Out-of-Memory). + ```` #### Per impostare un nuovo limite di risorse della CPU 1. Limitare l'uso dello script solo al 10% di un core della CPU. Digitare: - ```bash - echo 10000 | sudo tee /sys/fs/cgroup/exercise_group/cpu.max - ``` + ```bash + echo 10000 | sudo tee /sys/fs/cgroup/exercise_group/cpu.max + ``` - 10000 rappresenta il limite di larghezza di banda della CPU. È impostato sul 10% della capacità totale di un singolo core della CPU. + 10000 rappresenta il limite di larghezza di banda della CPU. È impostato sul 10% della capacità totale di un singolo core della CPU. 2. Confermare che è stato impostato il limite della CPU. Digitare: - ```bash - cat /sys/fs/cgroup/exercise_group/cpu.max - ``` + ```bash + cat /sys/fs/cgroup/exercise_group/cpu.max + ``` #### Per creare lo script del test di stress della CPU 1. Creare e impostare le autorizzazioni di esecuzione per uno script che genera un elevato utilizzo della CPU. Digitare: - ```bash - cat > ~/cpu_stress.sh << EOF - #!/bin/bash - exec yes > /dev/null - EOF - chmod +x ~/cpu_stress.sh - ``` + ```bash + cat > ~/cpu_stress.sh << EOF + #!/bin/bash + exec yes > /dev/null + EOF + chmod +x ~/cpu_stress.sh + ``` - !!! note "Nota" + !!! note "Nota" - ``` - `yes > /dev/null` è un comando semplice che genera un elevato carico di CPU. - ``` + ``` + `yes > /dev/null` è un comando semplice che genera un elevato carico di CPU. + ``` #### Per eseguire e aggiungere un processo/script al `cgroup` della CPU 1. Eseguire lo script e aggiungere contemporaneamente il suo PID al `cgroup`, digitando: - ```bash - ~/cpu_stress.sh & - echo $! | sudo tee /sys/fs/cgroup/exercise_group/cgroup.procs - ``` + ```bash + ~/cpu_stress.sh & + echo $! | sudo tee /sys/fs/cgroup/exercise_group/cgroup.procs + ``` #### Per confermare il controllo dell'utilizzo della CPU del processo 1. Controllare l'utilizzo della CPU del processo. - ```bash - pidof yes | xargs top -b -n 1 -p - ``` + ```bash + pidof yes | xargs top -b -n 1 -p + ``` - L'output dovrebbe mostrare l'utilizzo della CPU in tempo reale del processo yes. La %CPU per yes dovrebbe essere limitata in base alla configurazione di `cgroup` (ad esempio, circa il 10% se il limite è impostato a 10000). + L'output dovrebbe mostrare l'utilizzo della CPU in tempo reale del processo yes. La %CPU per yes dovrebbe essere limitata in base alla configurazione di `cgroup` (ad esempio, circa il 10% se il limite è impostato a 10000). 2. Impostate e sperimentate altri valori per cpu.max per il gruppo di esercizio `cgroup` e poi osservate l'effetto ogni volta che rieseguite lo script ~/cpu_stress.sh nel gruppo di controllo. @@ -660,74 +660,74 @@ Il dispositivo di archiviazione primario può essere un obiettivo per impostare 1. Per prima cosa, creare una serie di variabili ausiliarie per rilevare e memorizzare il numero di dispositivo del dispositivo di archiviazione primario sul server. Digitare: - ```bash - primary_device=$(lsblk | grep disk | awk '{print $1}' | head -n 1) - primary_device_num=$(ls -l /dev/$primary_device | awk '{print $5, $6}' | sed 's/,/:/') - ``` + ```bash + primary_device=$(lsblk | grep disk | awk '{print $1}' | head -n 1) + primary_device_num=$(ls -l /dev/$primary_device | awk '{print $5, $6}' | sed 's/,/:/') + ``` 2. Visualizzare il valore della variabile `$primary_device_num`. Digitare: - ```bash - echo "Primary Storage Device Number: $primary_device_num" - ``` + ```bash + echo "Primary Storage Device Number: $primary_device_num" + ``` 3. I numeri di dispositivo maggiore e minore dovrebbero corrispondere a quelli visualizzati nell'output di ls: - ```bash - ls -l /dev/$primary_device - ``` + ```bash + ls -l /dev/$primary_device + ``` #### Per impostare un nuovo limite di risorse di I/O 1. Impostare le operazioni di I/O a 1 MB/s per i processi di lettura e scrittura sotto il gruppo di esercizio `cgroup`. Digitare: - ```bash - echo "$primary_device_num rbps=1048576 wbps=1048576" | \ - sudo tee /sys/fs/cgroup/exercise_group/io.max - ``` + ```bash + echo "$primary_device_num rbps=1048576 wbps=1048576" | \ + sudo tee /sys/fs/cgroup/exercise_group/io.max + ``` 2. Confermare i limiti di I/O impostati. Digitare: - ```bash - cat /sys/fs/cgroup/exercise_group/io.max - ``` + ```bash + cat /sys/fs/cgroup/exercise_group/io.max + ``` #### Per creare il processo di stress test I/O 1. Avviare un processo `dd` per creare un file di grandi dimensioni chiamato `/tmp/io_stress`. Inoltre, catturare e memorizzare il PID del processo `dd` in una variabile chiamata `MYPID`. Digitare: - ```bash - dd if=/dev/zero of=/tmp/io_stress bs=10M count=500 oflag=dsync \ - & export MYPID=$! - ``` + ```bash + dd if=/dev/zero of=/tmp/io_stress bs=10M count=500 oflag=dsync \ + & export MYPID=$! + ``` #### Per aggiungere un processo/script al `cgroup` di I/O 1. Aggiungere il PID del processo `dd` precedente al controllo `cgroup` di exercise_group. Digitare: - ```bash - echo $MYPID | sudo tee /sys/fs/cgroup/exercise_group/cgroup.procs - ``` + ```bash + echo $MYPID | sudo tee /sys/fs/cgroup/exercise_group/cgroup.procs + ``` #### Per confermare il controllo delle risorse di utilizzo dell'I/O del processo 1. Controllare l'utilizzo dell'I/O del processo eseguendo: - ```bash - iotop -p $MYPID - ``` + ```bash + iotop -p $MYPID + ``` - L'output mostrerà la velocità di I/O in lettura/scrittura del processo io_stress.sh, che non dovrebbe superare 1 MB/s come da limite. + L'output mostrerà la velocità di I/O in lettura/scrittura del processo io_stress.sh, che non dovrebbe superare 1 MB/s come da limite. #### Eliminazione di `cgroups` 1. Digitare i seguenti comandi per terminare qualsiasi processo in background, eliminare il `cgroup` non più necessario e rimuovere il file /tmp/io_stress. - ```bash - kill %1 - sudo rmdir /sys/fs/cgroup/exercise_group/ - sudo rm -rf /tmp/io_stress - ``` + ```bash + kill %1 + sudo rmdir /sys/fs/cgroup/exercise_group/ + sudo rm -rf /tmp/io_stress + ``` ## Esercizio 8 @@ -739,89 +739,89 @@ L'affinità della CPU associa processi o thread specifici a particolari core del 1. Utilizzare `lscpu` per elencare le CPU disponibili sul sistema. Digitare: - ```bash - lscpu | grep "On-line" - ``` + ```bash + lscpu | grep "On-line" + ``` 2. Creare un processo campione utilizzando l'utilità `dd` e memorizzare il suo PID in una variabile `MYPID`. Digitare: - ```bash - dd if=/dev/zero of=/dev/null & export MYPID="$!" - echo $MYPID - ``` + ```bash + dd if=/dev/zero of=/dev/null & export MYPID="$!" + echo $MYPID + ``` 3. Recupera l'affinità corrente per il processo `dd`. Digitare: - ```bash - taskset -p $MYPID - ``` + ```bash + taskset -p $MYPID + ``` - OUTPUT: + OUTPUT: - ```bash - pid 1211483's current affinity mask: f - ``` + ```bash + pid 1211483's current affinity mask: f + ``` - L'output mostra la maschera di affinità della CPU del processo con PID 1211483 (`$MYPID`), rappresentata in formato esadecimale. Nel nostro sistema campione, la maschera di affinità visualizzata è "f", che in genere significa che il processo può essere eseguito su qualsiasi core della CPU. + L'output mostra la maschera di affinità della CPU del processo con PID 1211483 (`$MYPID`), rappresentata in formato esadecimale. Nel nostro sistema campione, la maschera di affinità visualizzata è "f", che in genere significa che il processo può essere eseguito su qualsiasi core della CPU. - !!! note "Nota" + !!! note "Nota" - ``` - La maschera di affinità della CPU "f" rappresenta una configurazione in cui tutti i core della CPU sono abilitati. In notazione esadecimale, "f" corrisponde al valore binario "1111". Ogni bit nella rappresentazione binaria corrisponde a un core della CPU, con "1" che indica che il core è abilitato e disponibile per l'esecuzione del processo. + ``` + La maschera di affinità della CPU "f" rappresenta una configurazione in cui tutti i core della CPU sono abilitati. In notazione esadecimale, "f" corrisponde al valore binario "1111". Ogni bit nella rappresentazione binaria corrisponde a un core della CPU, con "1" che indica che il core è abilitato e disponibile per l'esecuzione del processo. - Pertanto, su una CPU a quattro core, con la maschera "f": + Pertanto, su una CPU a quattro core, con la maschera "f": - Core 0: Enabled - Core 1: Enabled - Core 2: Enabled - Core 3: Enabled - ``` + Core 0: Enabled + Core 1: Enabled + Core 2: Enabled + Core 3: Enabled + ``` ### Impostazione/modifica dell'affinità della CPU 1. Imposta l'affinità della CPU del processo `dd` su una sola CPU (CPU 0). Digitare: - ```bash - taskset -p 0x1 $MYPID - ``` + ```bash + taskset -p 0x1 $MYPID + ``` - OUTPUT + OUTPUT - ```bash - pid 1211483's current affinity mask: f - pid 1211483's new affinity mask: 1 - ``` + ```bash + pid 1211483's current affinity mask: f + pid 1211483's new affinity mask: 1 + ``` 2. Verificate la modifica eseguendo il seguente comando: - ```bash - taskset -p $MYPID - ``` + ```bash + taskset -p $MYPID + ``` - L'output indica la maschera di affinità della CPU del processo con PID `$MYPID`. La maschera di affinità è "1" in decimale, che si traduce in "1" in binario. Ciò significa che il processo è attualmente legato al core 0 della CPU. + L'output indica la maschera di affinità della CPU del processo con PID `$MYPID`. La maschera di affinità è "1" in decimale, che si traduce in "1" in binario. Ciò significa che il processo è attualmente legato al core 0 della CPU. 3. Ora, impostare l'affinità della CPU del processo `dd` su più CPU (CPU 0 e 1). Digitare: - ```bash - taskset -p 0x3 $MYPID - ``` + ```bash + taskset -p 0x3 $MYPID + ``` 4. Eseguire il comando `tasksel` corretto per verificare l'ultima modifica. - ```bash - taskset -p $MYPID - ``` + ```bash + taskset -p $MYPID + ``` - Sul nostro server demo a 4 core, l'output mostra che la maschera di affinità della CPU del processo è "3" (in decimale). Ciò si traduce in "11" in binario. + Sul nostro server demo a 4 core, l'output mostra che la maschera di affinità della CPU del processo è "3" (in decimale). Ciò si traduce in "11" in binario. - !!! tip "Suggerimento" + !!! tip "Suggerimento" - ``` - Il "3" decimale corrisponde a "11" (o 0011) in binario. - Ogni cifra binaria corrisponde a un core della CPU: core 0, core 1, core 2, core 3 (da destra a sinistra). - La cifra "1" nella quarta e terza posizione (da destra) indica che il processo può essere eseguito sui core 0 e 1. - Pertanto, "3" indica che il processo è legato ai core 0 e 1 della CPU. - ``` + ``` + Il "3" decimale corrisponde a "11" (o 0011) in binario. + Ogni cifra binaria corrisponde a un core della CPU: core 0, core 1, core 2, core 3 (da destra a sinistra). + La cifra "1" nella quarta e terza posizione (da destra) indica che il processo può essere eseguito sui core 0 e 1. + Pertanto, "3" indica che il processo è legato ai core 0 e 1 della CPU. + ``` 5. Lanciate l'utilità `top` o `htop` in un terminale separato e osservate se vedete qualcosa di interessante mentre sperimentate diverse configurazioni di `taskset` per un processo. @@ -839,86 +839,86 @@ Questo esercizio mostra come usare `systemd-run` per creare unità di servizio t 1. Eseguire il semplice comando sleep 300 come servizio transitorio `systemd` usando `systemd-run`. Digitare: - ```bash - systemd-run --unit=mytransient.service --description="Example Service" sleep 300 - ``` + ```bash + systemd-run --unit=mytransient.service --description="Example Service" sleep 300 + ``` 2. Controllare lo stato del servizio transitorio usando `systemctl status`. Digitare: - ```bash - systemctl status mytransient.service - ``` + ```bash + systemctl status mytransient.service + ``` #### Impostazione di un limite di risorse di memoria per un servizio transitorio 1. Usare il parametro `--property` con `systemd-run` per limitare l'uso massimo della memoria per il processo transitorio a 200M. Digitare: - ```bash - systemd-run --unit=mylimited.service --property=MemoryMax=200M sleep 300 - ``` + ```bash + systemd-run --unit=mylimited.service --property=MemoryMax=200M sleep 300 + ``` 2. Cercare il processo nel file system `cgroup` corrispondente per verificare l'impostazione. Digitare: - ```bash - sudo cat /sys/fs/cgroup/system.slice/mytransient.service/memory.max - ``` + ```bash + sudo cat /sys/fs/cgroup/system.slice/mytransient.service/memory.max + ``` - !!! tip "Suggerimento" + !!! tip "Suggerimento" - ``` - `systemd.resource-control` è un'entità di configurazione o di gestione (concetto) all'interno del framework `systemd`, progettata per controllare e allocare le risorse del sistema ai processi e ai servizi. E `systemd.exec` è un componente di `systemd` responsabile della definizione dell'ambiente di esecuzione in cui vengono eseguiti i comandi. Per visualizzare le varie impostazioni (proprietà) che si possono modificare quando si usa `systemd-run`, consultare le pagine di manuale di `systemd.resource-control` e `systemd.exec`. Qui si trova la documentazione delle proprietà come MemoryMax, CPUAccounting, IOWeight, ecc. - ``` + ``` + `systemd.resource-control` è un'entità di configurazione o di gestione (concetto) all'interno del framework `systemd`, progettata per controllare e allocare le risorse del sistema ai processi e ai servizi. E `systemd.exec` è un componente di `systemd` responsabile della definizione dell'ambiente di esecuzione in cui vengono eseguiti i comandi. Per visualizzare le varie impostazioni (proprietà) che si possono modificare quando si usa `systemd-run`, consultare le pagine di manuale di `systemd.resource-control` e `systemd.exec`. Qui si trova la documentazione delle proprietà come MemoryMax, CPUAccounting, IOWeight, ecc. + ``` #### Impostazione del limite delle risorse della CPU per un servizio transitorio 1. Creare un'unità transitoria `systemd` chiamata "myrealtime.service". Eseguire `myrealtime.service` con una specifica politica di schedulazione round robin (rr) e priorità. Digitare: - ```bash - systemd-run --unit=myrealtime.service \ - --property=CPUSchedulingPolicy=rr --property=CPUSchedulingPriority=50 sleep 300 - ``` + ```bash + systemd-run --unit=myrealtime.service \ + --property=CPUSchedulingPolicy=rr --property=CPUSchedulingPriority=50 sleep 300 + ``` 2. Visualizzare lo stato di `myrealtime.service`. Inoltre, catturare/memorizzare il PID principale [sleep] in una variabile MYPID. Digitare: - ```bash - MYPID=$(systemctl status myrealtime.service | awk '/Main PID/ {print $3}') - ``` + ```bash + MYPID=$(systemctl status myrealtime.service | awk '/Main PID/ {print $3}') + ``` 3. Verificare la politica di programmazione della CPU mentre il servizio è ancora in esecuzione. Digitare: - ```bash - chrt -p $MYPID - pid 2553792's current scheduling policy: SCHED_RR - pid 2553792's current scheduling priority: 50 - ``` + ```bash + chrt -p $MYPID + pid 2553792's current scheduling policy: SCHED_RR + pid 2553792's current scheduling priority: 50 + ``` ### Creazione di una unità timer transitoria 1. Creare una semplice unità timer che esegua un semplice comando di eco. L'opzione `--on-active=2m` imposta l'attivazione del timer 2 minuti dopo l'attivazione dell'unità timer. Digitare: - ```bash - systemd-run --on-active=2m --unit=mytimer.timer \ - --description="Example Timer" echo "Timer triggered" - ``` + ```bash + systemd-run --on-active=2m --unit=mytimer.timer \ + --description="Example Timer" echo "Timer triggered" + ``` - Il timer inizia il conto alla rovescia dal momento in cui l'unità viene attivata e, dopo 2 minuti, attiva l'azione specificata. + Il timer inizia il conto alla rovescia dal momento in cui l'unità viene attivata e, dopo 2 minuti, attiva l'azione specificata. 2. Visualizza i dettagli/stato dell'unità timer appena creata. Digitare: - ```bash - systemctl status mytimer.timer - ``` + ```bash + systemctl status mytimer.timer + ``` #### Arresto e pulizia delle unità transitorie di `systemd` 1. Digitare i seguenti comandi per assicurarsi che i vari servizi/processi transitori avviati per questa esercitazione siano correttamente arrestati e rimossi dal sistema. Digitare: - ```bash - systemctl stop mytransient.service - systemctl stop mylimited.service - systemctl stop myrealtime.service - systemctl stop mytimer.timer - ``` + ```bash + systemctl stop mytransient.service + systemctl stop mylimited.service + systemctl stop myrealtime.service + systemctl stop mytimer.timer + ``` ## Esercizio 10 @@ -930,97 +930,97 @@ Questo esercizio dimostra l'uso di `schedtool` per comprendere e manipolare la s 1. Installare l'applicazione `schedtool` se non è installata sul server. Digitare: - ```bash - sudo dnf -y install schedtool - ``` + ```bash + sudo dnf -y install schedtool + ``` #### Creazione di uno script di processo simulato 1. Creare uno script che generi il carico della CPU a scopo di test. Digitare: - ```bash - cat > ~/cpu_load_generator.sh << EOF - #!/bin/bash - while true; do - openssl speed > /dev/null 2>&1 - openssl speed > /dev/null 2>&1 - - done - EOF - chmod +x ~/cpu_load_generator.sh - ``` + ```bash + cat > ~/cpu_load_generator.sh << EOF + #!/bin/bash + while true; do + openssl speed > /dev/null 2>&1 + openssl speed > /dev/null 2>&1 + + done + EOF + chmod +x ~/cpu_load_generator.sh + ``` 2. Avviare lo script in background. Digitare: - ```bash - ~/cpu_load_generator.sh & echo $! - ``` + ```bash + ~/cpu_load_generator.sh & echo $! + ``` 3. Acquisire il PID del processo principale `openssl` avviato all'interno dello script `cpu_load_generator.sh`. Memorizzare il PID in una variabile denominata `$MYPID`. Digitare: - ```bash - export MYPID=$(pidof openssl) ; echo $MYPID - ``` + ```bash + export MYPID=$(pidof openssl) ; echo $MYPID + ``` #### Utilizzo di `schedtool` per controllare la politica di schedulazione corrente 1. Usare il comando `schedtool` per visualizzare le informazioni di pianificazione del processo con PID `$MYPID`. Digitare: - ```bash - schedtool $MYPID - ``` + ```bash + schedtool $MYPID + ``` - OUTPUT: + OUTPUT: - ```bash - PID 2565081: PRIO 0, POLICY N: SCHED_NORMAL , NICE 0, AFFINITY 0xf - ``` + ```bash + PID 2565081: PRIO 0, POLICY N: SCHED_NORMAL , NICE 0, AFFINITY 0xf + ``` #### Utilizzo di `schedtool` per modificare la politica di scheduling 1. Modificare la politica di schedulazione e la priorità dei processi FIFO e 10, rispettivamente. Digitare: - ```bash - sudo schedtool -F -p 10 $! - ``` + ```bash + sudo schedtool -F -p 10 $! + ``` 2. Visualizzare l'effetto delle modifiche. Digitare: - ```bash - schedtool $MYPID - ``` + ```bash + schedtool $MYPID + ``` 3. Modificare la politica di schedulazione e la priorità del processo in round robin o SCHED_RR (RR) e 50, rispettivamente. Digitare: - ```bash - sudo schedtool -R -p 50 $MYPID - ``` + ```bash + sudo schedtool -R -p 50 $MYPID + ``` 4. Visualizzare l'effetto delle modifiche. Digitare: - ```bash - schedtool $MYPID - ``` + ```bash + schedtool $MYPID + ``` 5. Modificare la politica di pianificazione del processo in Idle o SCHED_IDLEPRIO (D). Digitare: - ```bash - sudo schedtool -D $MYPID - ``` + ```bash + sudo schedtool -D $MYPID + ``` 6. Visualizzare l'effetto delle modifiche. 7. Infine, ripristinare la politica di schedulazione del processo al valore predefinito originale SCHED_NORMAL (N o altro). Digitare: - ```bash - sudo schedtool -N $MYPID - ``` + ```bash + sudo schedtool -N $MYPID + ``` #### Arresto e puliza del processo `cpu_load_generator.sh` 1. Tutto fatto. Terminare lo script e cancellare lo script `cpu_load_generator.sh`. - ```bash - kill $MYPID - rm ~/cpu_load_generator.sh - ``` + ```bash + kill $MYPID + rm ~/cpu_load_generator.sh + ``` diff --git a/docs/labs/systems_administration_II/lab4-advanced_system_process_monitoring.uk.md b/docs/labs/systems_administration_II/lab4-advanced_system_process_monitoring.uk.md index 7904196497..8ce8eb7db9 100644 --- a/docs/labs/systems_administration_II/lab4-advanced_system_process_monitoring.uk.md +++ b/docs/labs/systems_administration_II/lab4-advanced_system_process_monitoring.uk.md @@ -47,59 +47,59 @@ tags: 1. Спочатку створіть порожній тестовий файл, до якого ми хочемо отримати доступ. Впишіть: - ```bash - touch ~/testfile.txt - ``` + ```bash + touch ~/testfile.txt + ``` 2. Створіть сценарій, який ми будемо використовувати для імітації доступу до testfile.txt. Впишіть: - ```bash - cat > ~/simulate_file_usage.sh << EOF - #!/bin/bash - tail -f ~/testfile.txt - EOF - ``` + ```bash + cat > ~/simulate_file_usage.sh << EOF + #!/bin/bash + tail -f ~/testfile.txt + EOF + ``` 3. Зробіть сценарій виконуваним. Впишіть: - ```bash - chmod +x ~/simulate_file_usage.sh - ``` + ```bash + chmod +x ~/simulate_file_usage.sh + ``` 4. Запустіть скрипт. Впишіть: - ```bash - ~/simulate_file_usage.sh & - ``` + ```bash + ~/simulate_file_usage.sh & + ``` #### Щоб ідентифікувати процеси, які звертаються до файлу 1. Визначте процеси за допомогою або доступу до `testfile.txt`, запустіть: - ```bash - fuser ~/testfile.txt - ``` + ```bash + fuser ~/testfile.txt + ``` 2. Перегляньте додаткові параметри `fuser` за допомогою параметра `-v`. Впишіть: - ```bash - fuser -v ~/testfile.txt - ``` + ```bash + fuser -v ~/testfile.txt + ``` 3. Перегляньте додаткові параметри `fuser` за допомогою параметра `-v`. Тепер ви можете видалити файли. Впишіть: - ```bash - kill %1 - rm ~/testfile.txt ~/simulate_file_usage.sh - ``` + ```bash + kill %1 + rm ~/testfile.txt ~/simulate_file_usage.sh + ``` #### Щоб ідентифікувати процес, який отримує доступ до порту TCP/UDP 1. Використовуйте команду `fuser`, щоб визначити процес доступу до TCP-порту 22 на вашому сервері. Впишіть: - ```bash - sudo fuser 22/tcp - ``` + ```bash + sudo fuser 22/tcp + ``` ## Завдання 2 @@ -111,137 +111,137 @@ tags: 1. Встановіть програму `perf`, якщо вона не встановлена на вашому сервері. Впишіть: - ```bash - sudo dnf -y install perf - ``` + ```bash + sudo dnf -y install perf + ``` 2. Програма `bc` — це точний калькулятор командного рядка. `bc` буде використовуватися в цій вправі для імітації високого навантаження ЦП. Якщо `bc` ще не встановлено на вашому сервері, встановіть його за допомогою: - ```bash - sudo dnf -y install bc - ``` + ```bash + sudo dnf -y install bc + ``` #### Щоб створити сценарій для генерації навантаження на процесор 1. Створіть сценарій завантаження ЦП і зробіть його виконуваним, виконавши: - ```bash - cat > ~/generate_cpu_load.sh << EOF - #!/bin/bash + ```bash + cat > ~/generate_cpu_load.sh << EOF + #!/bin/bash - # Check if the number of decimal places is passed as an argument - if [ "$#" -ne 1 ]; then - echo "Usage: $0 " - exit 1 - fi + # Check if the number of decimal places is passed as an argument + if [ "$#" -ne 1 ]; then + echo "Usage: $0 " + exit 1 + fi - # Calculate Pi to the specified number of decimal places - for i in {1..10}; do echo "scale=$1; 4*a(1)" | bc -l; done + # Calculate Pi to the specified number of decimal places + for i in {1..10}; do echo "scale=$1; 4*a(1)" | bc -l; done - EOF - chmod +x ~/generate_cpu_load.sh - ``` + EOF + chmod +x ~/generate_cpu_load.sh + ``` - !!! tip "Підказка" + !!! tip "Підказка" - ``` - Сценарій generate_cpu_load.sh — це простий інструмент для генерування навантаження на ЦП шляхом обчислення Пі (π) з високою точністю. Такий же розрахунок проводиться десять разів. Сценарій приймає ціле число як параметр для визначення кількості знаків після коми для обчислення Пі. - ``` + ``` + Сценарій generate_cpu_load.sh — це простий інструмент для генерування навантаження на ЦП шляхом обчислення Пі (π) з високою точністю. Такий же розрахунок проводиться десять разів. Сценарій приймає ціле число як параметр для визначення кількості знаків після коми для обчислення Пі. + ``` #### Для імітації додаткового навантаження на процесор 1. Давайте проведемо простий тест і обчислимо Пі з точністю до 50 знаків після коми. Запустіть сценарій, ввівши: - ```bash - ~/generate_cpu_load.sh 50 & - ``` + ```bash + ~/generate_cpu_load.sh 50 & + ``` 2. Повторно запустіть сценарій, але використовуйте `perf`, щоб записати продуктивність сценарію для аналізу використання ЦП та інших показників. Впишіть: - ```bash + ```bash - ./generate_cpu_load.sh 1000 & perf record -p $! sleep 5 - ``` + ./generate_cpu_load.sh 1000 & perf record -p $! sleep 5 + ``` - !!! tip "Підказка" + !!! tip "Підказка" - ``` - Параметр `sleep 5` з командою `perf record` визначає часове вікно для `perf` для збору даних про продуктивність щодо навантаження ЦП, створених сценарієм generate_cpu_load.sh. Це дозволяє `perf записувати показники продуктивності системи протягом 5 секунд перед автоматичною зупинкою. - ``` + ``` + Параметр `sleep 5` з командою `perf record` визначає часове вікно для `perf` для збору даних про продуктивність щодо навантаження ЦП, створених сценарієм generate_cpu_load.sh. Це дозволяє `perf записувати показники продуктивності системи протягом 5 секунд перед автоматичною зупинкою. + ``` #### Для аналізу даних про ефективність і моніторингу подій у реальному часі 1. Використовуйте команду `perf report`, щоб переглянути звіт про продуктивність, щоб зрозуміти шаблони використання процесора та пам’яті. Впишіть: - ```bash - sudo perf report - ``` + ```bash + sudo perf report + ``` - Ви можете використовувати різні клавіші клавіатури для подальшого вивчення звіту. - Введіть ++"q"++, щоб вийти з інтерфейсу перегляду звітів `perf`. + Ви можете використовувати різні клавіші клавіатури для подальшого вивчення звіту. + Введіть ++"q"++, щоб вийти з інтерфейсу перегляду звітів `perf`. 2. Спостерігайте/фіксуйте події кешу процесора в режимі реального часу протягом 40 секунд, щоб виявити потенційні вузькі місця продуктивності. Впишіть: - ```bash - sudo perf stat -e cache-references,cache-misses sleep 40 - ``` + ```bash + sudo perf stat -e cache-references,cache-misses sleep 40 + ``` #### Щоб записати повну продуктивність системи 1. Збирайте дані про продуктивність усієї системи, які можна використовувати для додаткового аналізу. Впишіть: - ```bash - sudo perf record -a sleep 10 - ``` + ```bash + sudo perf record -a sleep 10 + ``` 2. Досліджуйте лічильники конкретних подій. Підраховуйте конкретні події, як-от цикли процесора, щоб оцінити продуктивність певного сценарію чи програми. Давайте перевіримо за допомогою простої команди `find`, введіть: - ```bash - sudo perf stat -e cycles find /proc - ``` + ```bash + sudo perf stat -e cycles find /proc + ``` 3. Зробіть те саме, але зі сценарієм ./generate_cpu_load.sh. Підраховуйте певні події, як-от цикли ЦП, щоб оцінити продуктивність сценарію ./generate_cpu_load.sh. Впишіть: - ```bash - sudo perf stat -e cycles ./generate_cpu_load.sh 500 - ``` + ```bash + sudo perf stat -e cycles ./generate_cpu_load.sh 500 + ``` - Вихід: + Вихід: - ```bash - ...... - 3.141592653589793238462643383279502884197169399375105820974944592307\ - 81640628620899862803482534211..... + ```bash + ...... + 3.141592653589793238462643383279502884197169399375105820974944592307\ + 81640628620899862803482534211..... - Performance counter stats for './generate_cpu_load.sh 500': + Performance counter stats for './generate_cpu_load.sh 500': - 1,670,638,886 cycles + 1,670,638,886 cycles - 0.530479014 seconds time elapsed + 0.530479014 seconds time elapsed - 0.488580000 seconds user - 0.034628000 seconds sys - ``` + 0.488580000 seconds user + 0.034628000 seconds sys + ``` - !!! note "Примітка" + !!! note "Примітка" - ``` - Ось розбивка кінцевого зразка результату команди `perf stat`: - - *1,670,638,886 cycles*: Це вказує на загальну кількість циклів процесора, споживаних під час виконання сценарію. Кожен цикл являє собою один крок у виконанні інструкцій ЦП. + ``` + Ось розбивка кінцевого зразка результату команди `perf stat`: + + *1,670,638,886 cycles*: Це вказує на загальну кількість циклів процесора, споживаних під час виконання сценарію. Кожен цикл являє собою один крок у виконанні інструкцій ЦП. - *0.530479014 seconds time elapsed*: Це загальний реальний час (або час настінного годинника), що минув від початку до кінця виконання сценарію. Ця тривалість включає всі типи очікувань (наприклад, очікування дискового вводу-виводу або системних викликів). + *0.530479014 seconds time elapsed*: Це загальний реальний час (або час настінного годинника), що минув від початку до кінця виконання сценарію. Ця тривалість включає всі типи очікувань (наприклад, очікування дискового вводу-виводу або системних викликів). - *0.488580000 seconds user*: Це час роботи процесора в режимі користувача. Цей час явно виключає час, витрачений на виконання завдань системного рівня. + *0.488580000 seconds user*: Це час роботи процесора в режимі користувача. Цей час явно виключає час, витрачений на виконання завдань системного рівня. - *0.034628000 seconds sys*: Це час роботи процесора в режимі ядра або системи. Це включає час, який ЦП витрачає на виконання системних викликів або виконання інших завдань системного рівня від імені сценарію. - ``` + *0.034628000 seconds sys*: Це час роботи процесора в режимі ядра або системи. Це включає час, який ЦП витрачає на виконання системних викликів або виконання інших завдань системного рівня від імені сценарію. + ``` 4. Усе зроблено за допомогою інструмента `perf`. Переконайтеся, що фонові сценарії призначені для чистого робочого середовища. - ```bash - kill %1 - ``` + ```bash + kill %1 + ``` ## Завдання 3 @@ -253,92 +253,92 @@ tags: 1. Створіть простий сценарій під назвою `strace_script.sh` і зробіть його виконуваним. Впишіть: - ```bash - cat > ~/strace_script.sh << EOF - #!/bin/bash - while true; do - date - sleep 1 - done - EOF - chmod +x ~/strace_script.sh - ``` + ```bash + cat > ~/strace_script.sh << EOF + #!/bin/bash + while true; do + date + sleep 1 + done + EOF + chmod +x ~/strace_script.sh + ``` #### Щоб використовувати `strace` для запущених процесів 1. Запустіть сценарій і прикріпіть `strace`. Впишіть: - ```bash - ~/strace_script.sh & - ``` + ```bash + ~/strace_script.sh & + ``` 2. Знайдіть PID для процесу `strace_script.sh` в окремому терміналі. Зберігайте PID у змінній з іменем MYPID. Для цього ми використаємо команду `pgrep`, виконавши: - ```bash - export MYPID=$(pgrep strace_script) ; echo $MYPID - ``` + ```bash + export MYPID=$(pgrep strace_script) ; echo $MYPID + ``` - Вихід: + Вихід: - ```bash - 4006301 - ``` + ```bash + 4006301 + ``` 3. Почніть відстежувати системні виклики сценарію, щоб зрозуміти, як він взаємодіє з ядром. Приєднайте `strace` до запущеного процесу сценарію, ввівши: - ```bash - sudo strace -p $MYPID - ``` + ```bash + sudo strace -p $MYPID + ``` 4. Від’єднайте або зупиніть процес `strace`, ввівши ++ctrl+c++ 5. Вихід `strace` можна відфільтрувати, зосередившись на певних системних викликах, таких як `open` і `read`, щоб проаналізувати їх поведінку. Спробуйте зробити це для системних викликів `open` і `read`. Впишіть: - ```bash - sudo strace -e trace=open,read -p $MYPID - ``` + ```bash + sudo strace -e trace=open,read -p $MYPID + ``` - Коли ви завершите спробу розшифрувати вихідні дані `strace`, зупиніть процес `strace`, ввівши ++ctrl+c++ + Коли ви завершите спробу розшифрувати вихідні дані `strace`, зупиніть процес `strace`, ввівши ++ctrl+c++ 6. Перенаправте вихідні дані у файл для подальшого аналізу, який може допомогти діагностувати проблеми. Збережіть вивід `strace` у файл, виконавши: - ```bash - sudo strace -o strace_output.txt -p $MYPID - ``` + ```bash + sudo strace -o strace_output.txt -p $MYPID + ``` #### Для аналізу частоти системних викликів 1. Узагальніть кількість системних викликів, щоб визначити системні виклики, які найчастіше використовуються процесом. Зробіть це лише на 10 секунд, додавши команду `timeout`. Впишіть: - ```bash - sudo timeout 10 strace -c -p $MYPID - ``` - - Наша зразкова система показує підсумковий звіт таким чином: - - Вихід: - - ```bash - strace: Process 4006301 attached - strace: Process 4006301 detached - % time seconds usecs/call calls errors syscall - ------ ----------- ----------- --------- --------- ---------------- - 89.59 0.042553 1182 36 18 wait4 - 7.68 0.003648 202 18 clone - 1.67 0.000794 5 144 rt_sigprocmask - 0.45 0.000215 5 36 rt_sigaction - 0.36 0.000169 9 18 ioctl - 0.25 0.000119 6 18 rt_sigreturn - ------ ----------- ----------- --------- --------- ---------------- - 100.00 0.047498 175 270 18 total - ``` + ```bash + sudo timeout 10 strace -c -p $MYPID + ``` + + Наша зразкова система показує підсумковий звіт таким чином: + + Вихід: + + ```bash + strace: Process 4006301 attached + strace: Process 4006301 detached + % time seconds usecs/call calls errors syscall + ------ ----------- ----------- --------- --------- ---------------- + 89.59 0.042553 1182 36 18 wait4 + 7.68 0.003648 202 18 clone + 1.67 0.000794 5 144 rt_sigprocmask + 0.45 0.000215 5 36 rt_sigaction + 0.36 0.000169 9 18 ioctl + 0.25 0.000119 6 18 rt_sigreturn + ------ ----------- ----------- --------- --------- ---------------- + 100.00 0.047498 175 270 18 total + ``` 2. Припиніть виконання сценарію та видаліть усі створені файли. - ```bash - kill $MYPID - rm ~/strace_script.sh ~/strace_output.txt - ``` + ```bash + kill $MYPID + rm ~/strace_script.sh ~/strace_output.txt + ``` ## Завдання 4 @@ -350,45 +350,45 @@ tags: 1. Встановіть програму `atop`, якщо вона не встановлена на вашому сервері. Впишіть: - ```bash - sudo dnf -y install atop - ``` + ```bash + sudo dnf -y install atop + ``` 2. Запустіть `atop`, ввівши: - ```bash - sudo atop - ``` + ```bash + sudo atop + ``` 3. В інтерфейсі `atop` ви можете досліджувати різні показники `atop`, натискаючи певні клавіші на клавіатурі. - Використовуйте 'm', 'd' або 'n' для перемикання між переглядами пам'яті, диска або мережі. Спостерігайте, як використовуються ресурси в реальному часі. + Використовуйте 'm', 'd' або 'n' для перемикання між переглядами пам'яті, диска або мережі. Спостерігайте, як використовуються ресурси в реальному часі. 4. Відстежуйте продуктивність системи з користувацьким інтервалом у 2 секунди, що дозволяє більш детально переглядати діяльність системи. Впишіть: - ```bash - sudo atop 2 - ``` + ```bash + sudo atop 2 + ``` 5. Перемикайтеся між різними видами ресурсів, щоб зосередитися на конкретних аспектах продуктивності системи. 6. Створіть звіт із файлу журналу про діяльність системи, збираючи дані кожні 60 секунд, тричі. Впишіть: - ```bash - sudo atop -w /tmp/atop_log 60 3 - ``` + ```bash + sudo atop -w /tmp/atop_log 60 3 + ``` 7. Після виконання попередньої команди ви можете не поспішати та переглянути двійковий файл, у якому було збережено журнали. Щоб прочитати збережений файл журналу, введіть: - ```bash - sudo atop -r /tmp/atop_log - ``` + ```bash + sudo atop -r /tmp/atop_log + ``` 8. Очистіть, видаливши всі створені журнали або файли. - ```bash - sudo rm /tmp/atop_log - ``` + ```bash + sudo rm /tmp/atop_log + ``` ## Завдання 5 @@ -403,54 +403,54 @@ NUMA означає "нерівномірний доступ до пам'яті" 1. Встановіть програму `numactl`, якщо вона не встановлена на вашому сервері. Впишіть: - ```bash - sudo dnf -y install numactl - ``` + ```bash + sudo dnf -y install numactl + ``` #### Для створення сценарію, що потребує великої кількості пам’яті 1. Створіть простий сценарій, який допоможе імітувати робоче навантаження з інтенсивним використанням пам’яті на вашому сервері. Впишіть: - ```bash - cat > ~/memory_intensive.sh << EOF - #!/bin/bash + ```bash + cat > ~/memory_intensive.sh << EOF + #!/bin/bash - awk 'BEGIN{for(i=0;i<1000000;i++)for(j=0;j<1000;j++);}{}' - EOF - chmod +x ~/memory_intensive.sh - ``` + awk 'BEGIN{for(i=0;i<1000000;i++)for(j=0;j<1000;j++);}{}' + EOF + chmod +x ~/memory_intensive.sh + ``` #### Щоб використовувати `numactl` 1. Запустіть сценарій за допомогою `numactl`, введіть: - ```bash - numactl --membind=0 ~/memory_intensive.sh - ``` + ```bash + numactl --membind=0 ~/memory_intensive.sh + ``` 2. Якщо ваша система має більше ніж один доступний вузол NUMA, ви можете запустити сценарій на кількох вузлах NUMA за допомогою: - ```bash - numactl --cpunodebind=0,1 --membind=0,1 ~/memory_intensive.sh - ``` + ```bash + numactl --cpunodebind=0,1 --membind=0,1 ~/memory_intensive.sh + ``` 3. Покажіть розподіл пам'яті на вузлах NUMA - ```bash - numactl --show - ``` + ```bash + numactl --show + ``` 4. Прив’яжіть пам’ять до певного вузла, виконавши: - ```bash - numactl --membind=0 ~/memory_intensive.sh - ``` + ```bash + numactl --membind=0 ~/memory_intensive.sh + ``` 5. Очистіть своє робоче середовище, видаливши сценарій. - ```bash - rm ~/memory_intensive.sh - ``` + ```bash + rm ~/memory_intensive.sh + ``` ## Завдання 6 @@ -462,19 +462,19 @@ NUMA означає "нерівномірний доступ до пам'яті" 1. Встановіть утиліту `iotop`, якщо вона не встановлена. Впишіть: - ```bash - sudo dnf -y install iotop - ``` + ```bash + sudo dnf -y install iotop + ``` #### Щоб використовувати `iotop` для моніторингу дискового введення-виведення 1. Запустіть команду `iotop` без будь-яких параметрів, щоб використовувати її в інтерактивному режимі за замовчуванням. Впишіть: - ```bash - sudo iotop - ``` + ```bash + sudo iotop + ``` - Спостерігайте за використанням живого диска вводу-виводу різними процесами. Використовуйте це для визначення процесів, які зараз читають або записують на диск. + Спостерігайте за використанням живого диска вводу-виводу різними процесами. Використовуйте це для визначення процесів, які зараз читають або записують на диск. 2. Введіть ++"q"++, щоб вийти з `iotop`. @@ -482,27 +482,27 @@ NUMA означає "нерівномірний доступ до пам'яті" 1. Запустіть `iotop` у пакетному режимі (-b), щоб отримати неінтерактивний одноразовий перегляд використання введення-виведення. Параметр `-n 10` повідомляє `iotop` взяти 10 зразків перед виходом. - ```bash - sudo iotop -b -n 10 - ``` + ```bash + sudo iotop -b -n 10 + ``` 2. `iotop` може фільтрувати введення/виведення для певних процесів. Визначте ідентифікатор процесу (PID) у вашій системі за допомогою команди ps або дисплея `iotop`. Потім відфільтруйте вихідні дані `iotop` для цього конкретного PID. Наприклад, фільтруйте PID для процесу `sshd`, виконавши: - ```bash - sudo iotop -p $(pgrep sshd | head -1) - ``` + ```bash + sudo iotop -p $(pgrep sshd | head -1) + ``` 3. Опцію -`o` з `iotop` можна використовувати для показу процесів або потоків, які виконують фактичний ввід-вивід, замість відображення всіх процесів або потоків. Відобразити лише процеси вводу-виводу, виконавши: - ```bash - sudo iotop -o - ``` + ```bash + sudo iotop -o + ``` - !!! Question "Обговорення" + !!! Question "Обговорення" - ``` - Обговоріть вплив дискового вводу-виводу на загальну продуктивність системи та як такі інструменти, як `iotop`, можуть допомогти в оптимізації системи. - ``` + ``` + Обговоріть вплив дискового вводу-виводу на загальну продуктивність системи та як такі інструменти, як `iotop`, можуть допомогти в оптимізації системи. + ``` ## Завдання 7 @@ -516,141 +516,141 @@ NUMA означає "нерівномірний доступ до пам'яті" 1. Використовуйте команду `ls`, щоб дослідити вміст і структуру файлової системи `cgroup`. Впишіть: - ```bash - ls /sys/fs/cgroup/ - ``` + ```bash + ls /sys/fs/cgroup/ + ``` 2. Знову скористайтеся командою `ls`, щоб отримати список папок \*.slice у файловій системі `cgroup`. Впишіть: - ```bash - ls -d /sys/fs/cgroup/*.slice - ``` + ```bash + ls -d /sys/fs/cgroup/*.slice + ``` - Папки з суфіксом .slice зазвичай використовуються в `systemd` для представлення фрагмента системних ресурсів. Це стандартні `cgroups`, якими керує `systemd` для організації та керування системними процесами. + Папки з суфіксом .slice зазвичай використовуються в `systemd` для представлення фрагмента системних ресурсів. Це стандартні `cgroups`, якими керує `systemd` для організації та керування системними процесами. ### Щоб створити власну `cgroup` 1. Створіть каталог під назвою "exercise_group" у файловій системі /sys/fs/cgroup. У цій новій папці будуть розміщені структури контрольних груп, необхідні для решти цієї вправи. Використовуйте команду `mkdir`, ввівши: - ```bash - sudo mkdir -p /sys/fs/cgroup/exercise_group - ``` + ```bash + sudo mkdir -p /sys/fs/cgroup/exercise_group + ``` 2. Тепер перелічіть файли та каталоги в структурі /sys/fs/cgroup/exercise_group. Впишіть: - ```bash - sudo ls /sys/fs/cgroup/exercise_group/ - ``` + ```bash + sudo ls /sys/fs/cgroup/exercise_group/ + ``` - Вихідні дані показують файли та каталоги, автоматично створені підсистемою `cgroup` для керування та моніторингу ресурсів для `cgroup`. + Вихідні дані показують файли та каталоги, автоматично створені підсистемою `cgroup` для керування та моніторингу ресурсів для `cgroup`. #### Щоб встановити новий ліміт ресурсу пам'яті 1. Давайте встановимо обмеження ресурсу пам’яті, щоб обмежити використання пам’яті до 4096 байт (4 КБ). Щоб обмежити процеси в `cgroup` використовувати максимум 4 Кб пам'яті типу: - ```bash - echo 4096 | sudo tee /sys/fs/cgroup/exercise_group/memory.max - ``` + ```bash + echo 4096 | sudo tee /sys/fs/cgroup/exercise_group/memory.max + ``` 2. Підтвердьте, що ліміт пам’яті встановлено. Впишіть: - ```bash - cat /sys/fs/cgroup/exercise_group/memory.max - ``` + ```bash + cat /sys/fs/cgroup/exercise_group/memory.max + ``` #### Щоб створити тестовий сценарій memory_stress 1. Створіть простий виконуваний сценарій за допомогою команди `dd`, щоб перевірити обмеження ресурсу пам’яті. Впишіть: - ```bash - cat > ~/memory_stress.sh << EOF - #!/bin/bash - dd if=/dev/zero of=/tmp/stress_test bs=10M count=2000 - EOF - chmod +x ~/memory_stress.sh - ``` + ```bash + cat > ~/memory_stress.sh << EOF + #!/bin/bash + dd if=/dev/zero of=/tmp/stress_test bs=10M count=2000 + EOF + chmod +x ~/memory_stress.sh + ``` #### Щоб запустити та додати процес/сценарій до `cgroup` пам'яті 1. Запустіть memory_stress.sh, запишіть його PID і додайте PID до group.procs. Впишіть: - ```bash - ~/memory_stress.sh & - echo $! | sudo tee /sys/fs/cgroup/exercise_group/cgroup.procs - ``` + ```bash + ~/memory_stress.sh & + echo $! | sudo tee /sys/fs/cgroup/exercise_group/cgroup.procs + ``` - Файл /sys/fs/cgroup/exercise_group/cgroup.procs можна використовувати для додавання або перегляду PID (ідентифікаторів процесів) процесів, які є членами даної `cgroup`. Запис PID до цього файлу призначає процес сценарію ~/memory_stress.sh групі `cgroup`. + Файл /sys/fs/cgroup/exercise_group/cgroup.procs можна використовувати для додавання або перегляду PID (ідентифікаторів процесів) процесів, які є членами даної `cgroup`. Запис PID до цього файлу призначає процес сценарію ~/memory_stress.sh групі `cgroup`. 2. Попередня команда завершиться дуже швидко, тому що вона перевищила обмеження пам’яті `cgroup`. Ви можете запустити таку команду `journalctl` в іншому терміналі, щоб переглянути помилку, як вона відбувається. Впишіть: - ```bash - journalctl -xe -f | grep -i memory - ``` + ```bash + journalctl -xe -f | grep -i memory + ``` - !!! Tip "Порада" + !!! Tip "Порада" - ```` - Ви можете швидко скористатися командою ps, щоб перевірити приблизне використання пам'яті процесом, якщо вам відомий PID процесу, запустивши: + ```` + Ви можете швидко скористатися командою ps, щоб перевірити приблизне використання пам'яті процесом, якщо вам відомий PID процесу, запустивши: - ```bash - pidof | xargs ps -o pid,comm,rss - ``` + ```bash + pidof | xargs ps -o pid,comm,rss + ``` - Цей вихід має відображати розмір резидентного набору (RSS) у КБ, що вказує на пам’ять, яку використовує вказаний процес у певний момент часу. Кожного разу, коли значення RSS процесу перевищує ліміт пам’яті, вказаний у значенні memory.max `cgroup's`, процес може підлягати політикам керування пам’яттю, які застосовуються ядром або самою `cgroup`. Залежно від конфігурації системи, система може виконувати такі дії, як обмеження використання пам’яті процесом, припинення процесу або ініціювання події браку пам’яті (OOM). - ```` + Цей вихід має відображати розмір резидентного набору (RSS) у КБ, що вказує на пам’ять, яку використовує вказаний процес у певний момент часу. Кожного разу, коли значення RSS процесу перевищує ліміт пам’яті, вказаний у значенні memory.max `cgroup's`, процес може підлягати політикам керування пам’яттю, які застосовуються ядром або самою `cgroup`. Залежно від конфігурації системи, система може виконувати такі дії, як обмеження використання пам’яті процесом, припинення процесу або ініціювання події браку пам’яті (OOM). + ```` #### Щоб установити новий ліміт ресурсу ЦП 1. Обмежте використання сценарієм лише 10% ядра ЦП. Впишіть: - ```bash - echo 10000 | sudo tee /sys/fs/cgroup/exercise_group/cpu.max - ``` + ```bash + echo 10000 | sudo tee /sys/fs/cgroup/exercise_group/cpu.max + ``` - 10000 означає обмеження пропускної здатності ЦП. Його встановлено на 10% від загальної потужності одного ядра ЦП. + 10000 означає обмеження пропускної здатності ЦП. Його встановлено на 10% від загальної потужності одного ядра ЦП. 2. Переконайтеся, що встановлено обмеження ЦП. Впишіть: - ```bash - cat /sys/fs/cgroup/exercise_group/cpu.max - ``` + ```bash + cat /sys/fs/cgroup/exercise_group/cpu.max + ``` #### Щоб створити сценарій стрес-тесту ЦП 1. Створюйте та встановлюйте дозволи на виконання для сценарію, щоб генерувати високе використання ЦП. Впишіть: - ```bash - cat > ~/cpu_stress.sh << EOF - #!/bin/bash - exec yes > /dev/null - EOF - chmod +x ~/cpu_stress.sh - ``` + ```bash + cat > ~/cpu_stress.sh << EOF + #!/bin/bash + exec yes > /dev/null + EOF + chmod +x ~/cpu_stress.sh + ``` - !!! note "Примітка" + !!! note "Примітка" - ``` - `yes > /dev/null` — це проста команда, яка створює високе навантаження на ЦП. - ``` + ``` + `yes > /dev/null` — це проста команда, яка створює високе навантаження на ЦП. + ``` #### Щоб запустити та додати процес/сценарій до CPU `cgroup` 1. Запустіть сценарій і негайно додайте його PID до `cgroup`, ввівши: - ```bash - ~/cpu_stress.sh & - echo $! | sudo tee /sys/fs/cgroup/exercise_group/cgroup.procs - ``` + ```bash + ~/cpu_stress.sh & + echo $! | sudo tee /sys/fs/cgroup/exercise_group/cgroup.procs + ``` #### Щоб підтвердити контроль використання ЦП процесу 1. Перевірте використання процесора процесом. - ```bash - pidof yes | xargs top -b -n 1 -p - ``` + ```bash + pidof yes | xargs top -b -n 1 -p + ``` - Вихідні дані мають показувати використання ЦП у реальному часі процесом yes. %CPU для так має бути обмежено конфігурацією `cgroup` (наприклад, близько 10%, якщо обмеження встановлено на 10000). + Вихідні дані мають показувати використання ЦП у реальному часі процесом yes. %CPU для так має бути обмежено конфігурацією `cgroup` (наприклад, близько 10%, якщо обмеження встановлено на 10000). 2. Встановіть та поекспериментуйте з іншими значеннями для cpu.max для `cgroup` групи виконання, а потім спостерігайте за ефектом кожного разу, коли ви повторно запускаєте сценарій ~/cpu_stress.sh у контрольній групі. @@ -660,74 +660,74 @@ NUMA означає "нерівномірний доступ до пам'яті" 1. По-перше, давайте створимо набір допоміжних змінних для визначення та збереження номера пристрою для основного пристрою зберігання на сервері. Впишіть: - ```bash - primary_device=$(lsblk | grep disk | awk '{print $1}' | head -n 1) - primary_device_num=$(ls -l /dev/$primary_device | awk '{print $5, $6}' | sed 's/,/:/') - ``` + ```bash + primary_device=$(lsblk | grep disk | awk '{print $1}' | head -n 1) + primary_device_num=$(ls -l /dev/$primary_device | awk '{print $5, $6}' | sed 's/,/:/') + ``` 2. Далі, відобразимо значення змінної $primary_device_num. Впишіть: - ```bash - echo "Primary Storage Device Number: $primary_device_num" - ``` + ```bash + echo "Primary Storage Device Number: $primary_device_num" + ``` 3. Головний і допоміжний номери пристроїв мають відповідати тому, що ви бачите в цьому виведеному файлі ls: - ```bash - ls -l /dev/$primary_device - ``` + ```bash + ls -l /dev/$primary_device + ``` #### Щоб установити нове обмеження ресурсів введення-виведення 1. Встановіть операції вводу/виводу на 1 МБ/с для процесів читання та запису в `cgroup` групи виконання. Впишіть: - ```bash - echo "$primary_device_num rbps=1048576 wbps=1048576" | \ - sudo tee /sys/fs/cgroup/exercise_group/io.max - ``` + ```bash + echo "$primary_device_num rbps=1048576 wbps=1048576" | \ + sudo tee /sys/fs/cgroup/exercise_group/io.max + ``` 2. Підтвердьте встановлені обмеження введення/виведення. Впишіть: - ```bash - cat /sys/fs/cgroup/exercise_group/io.max - ``` + ```bash + cat /sys/fs/cgroup/exercise_group/io.max + ``` #### Щоб створити процес стрес-тесту вводу-виводу 1. Запустіть процес `dd`, щоб створити великий файл з назвою `/tmp/io_stress`. Також запишіть і збережіть PID процесу dd у змінній під назвою `MYPID`. Впишіть: - ```bash - dd if=/dev/zero of=/tmp/io_stress bs=10M count=500 oflag=dsync \ - & export MYPID=$! - ``` + ```bash + dd if=/dev/zero of=/tmp/io_stress bs=10M count=500 oflag=dsync \ + & export MYPID=$! + ``` #### Щоб додати процес/сценарій до `cgroup` вводу/виводу 1. Додайте PID попереднього процесу dd до елемента керування exercise_group `cgroup`. Впишіть: - ```bash - echo $MYPID | sudo tee /sys/fs/cgroup/exercise_group/cgroup.procs - ``` + ```bash + echo $MYPID | sudo tee /sys/fs/cgroup/exercise_group/cgroup.procs + ``` #### Щоб підтвердити контроль використання ресурсів введення-виведення процесу 1. Перевірте використання вводу-виводу процесом, виконавши: - ```bash - iotop -p $MYPID - ``` + ```bash + iotop -p $MYPID + ``` - На виході буде відображено швидкість читання/запису вводу-виводу для процесу io_stress.sh, яка не повинна перевищувати 1 МБ/с відповідно до обмеження. + На виході буде відображено швидкість читання/запису вводу-виводу для процесу io_stress.sh, яка не повинна перевищувати 1 МБ/с відповідно до обмеження. #### Щоб видалити `cgroups` 1. Введіть наступні команди, щоб завершити будь-який фоновий процес, видалити непотрібну `cgroup` і видалити файл /tmp/io_stress. - ```bash - kill %1 - sudo rmdir /sys/fs/cgroup/exercise_group/ - sudo rm -rf /tmp/io_stress - ``` + ```bash + kill %1 + sudo rmdir /sys/fs/cgroup/exercise_group/ + sudo rm -rf /tmp/io_stress + ``` ## Завдання 8 @@ -739,89 +739,89 @@ CPU affinity прив’язує конкретні процеси або пот 1. Використовуйте `lscpu`, щоб отримати список доступних ЦП у вашій системі. Впишіть: - ```bash - lscpu | grep "On-line" - ``` + ```bash + lscpu | grep "On-line" + ``` 2. Створіть зразок процесу за допомогою утиліти `dd` і збережіть його PID у змінній `MYPID`. Впишіть: - ```bash - dd if=/dev/zero of=/dev/null & export MYPID="$!" - echo $MYPID - ``` + ```bash + dd if=/dev/zero of=/dev/null & export MYPID="$!" + echo $MYPID + ``` 3. Отримайте поточну спорідненість для процесу `dd`. Впишіть: - ```bash - taskset -p $MYPID - ``` + ```bash + taskset -p $MYPID + ``` - Вихід: + Вихід: - ```bash - pid 1211483's current affinity mask: f - ``` + ```bash + pid 1211483's current affinity mask: f + ``` - Вихідні дані показують маску спорідненості ЦП процесу з PID 1211483 ($MYPID), представленим у шістнадцятковому форматі. У нашому прикладі системи відображається маска спорідненості «f», що зазвичай означає, що процес може виконуватися на будь-якому ядрі ЦП. + Вихідні дані показують маску спорідненості ЦП процесу з PID 1211483 ($MYPID), представленим у шістнадцятковому форматі. У нашому прикладі системи відображається маска спорідненості «f», що зазвичай означає, що процес може виконуватися на будь-якому ядрі ЦП. - !!! note "Примітка" + !!! note "Примітка" - ``` - Маска спорідненості ЦП "f" представляє конфігурацію, у якій увімкнено всі ядра ЦП. У шістнадцятковій системі числення «f» відповідає двійковому значенню «1111». Кожен біт у двійковому представленні відповідає ядру ЦП, причому «1» означає, що ядро ввімкнено та доступне для виконання процесу. + ``` + Маска спорідненості ЦП "f" представляє конфігурацію, у якій увімкнено всі ядра ЦП. У шістнадцятковій системі числення «f» відповідає двійковому значенню «1111». Кожен біт у двійковому представленні відповідає ядру ЦП, причому «1» означає, що ядро ввімкнено та доступне для виконання процесу. - Тому на чотириядерному процесорі з маскою "f": + Тому на чотириядерному процесорі з маскою "f": - Core 0: Enabled - Core 1: Enabled - Core 2: Enabled - Core 3: Enabled - ``` + Core 0: Enabled + Core 1: Enabled + Core 2: Enabled + Core 3: Enabled + ``` ### Щоб встановити/змінити схожість ЦП 1. Встановіть афінність процесора для процесу `dd` на один процесор (процесор 0). Впишіть: - ```bash - taskset -p 0x1 $MYPID - ``` + ```bash + taskset -p 0x1 $MYPID + ``` - ВИХІД + ВИХІД - ```bash - pid 1211483's current affinity mask: f - pid 1211483's new affinity mask: 1 - ``` + ```bash + pid 1211483's current affinity mask: f + pid 1211483's new affinity mask: 1 + ``` 2. Перевірте зміни, виконавши: - ```bash - taskset -p $MYPID - ``` + ```bash + taskset -p $MYPID + ``` - Вихідні дані вказують маску афінності процесора процесу з PID `$MYPID`. Маска спорідненості дорівнює «1» у десятковій системі, що перекладається як «1» у двійковій системі. Це означає, що процес наразі прив’язаний до ядра ЦП 0. + Вихідні дані вказують маску афінності процесора процесу з PID `$MYPID`. Маска спорідненості дорівнює «1» у десятковій системі, що перекладається як «1» у двійковій системі. Це означає, що процес наразі прив’язаний до ядра ЦП 0. 3. Тепер встановіть афінність процесора для процесу `dd` на кілька процесорів (процесори 0 і 1). Впишіть: - ```bash - taskset -p 0x3 $MYPID - ``` + ```bash + taskset -p 0x3 $MYPID + ``` 4. Видайте правильну команду `tasksel`, щоб перевірити останню зміну. - ```bash - taskset -p $MYPID - ``` + ```bash + taskset -p $MYPID + ``` - На нашому демонстраційному 4-ядерному сервері ЦП результат показує, що маска спорідненості ЦП процесу дорівнює «3» (у десятковому вигляді). Це означає «11» у двійковій системі. + На нашому демонстраційному 4-ядерному сервері ЦП результат показує, що маска спорідненості ЦП процесу дорівнює «3» (у десятковому вигляді). Це означає «11» у двійковій системі. - !!! tip "Підказка" + !!! tip "Підказка" - ``` - Десятковий "3" дорівнює "11" (або 0011) у двійковій системі. - Кожна двійкова цифра відповідає ядру ЦП: ядро 0, ядро 1, ядро 2, ядро 3 (справа наліво). - Цифра «1» на четвертій і третій позиціях (справа) означає, що процес може працювати на ядрах 0 і 1. - Тому «3» означає, що процес прив’язаний до ядер ЦП 0 і 1. - ``` + ``` + Десятковий "3" дорівнює "11" (або 0011) у двійковій системі. + Кожна двійкова цифра відповідає ядру ЦП: ядро 0, ядро 1, ядро 2, ядро 3 (справа наліво). + Цифра «1» на четвертій і третій позиціях (справа) означає, що процес може працювати на ядрах 0 і 1. + Тому «3» означає, що процес прив’язаний до ядер ЦП 0 і 1. + ``` 5. Запустіть утиліту `top` або `htop` в окремому терміналі та спостерігайте, якщо ви бачите щось цікаве, експериментуючи з різними конфігураціями `taskset` для процесу. @@ -839,86 +839,86 @@ CPU affinity прив’язує конкретні процеси або пот 1. Запустіть просту команду sleep 300 як тимчасову службу `systemd` за допомогою `systemd-run`. Впишіть: - ```bash - systemd-run --unit=mytransient.service --description="Example Service" sleep 300 - ``` + ```bash + systemd-run --unit=mytransient.service --description="Example Service" sleep 300 + ``` 2. Перевірте статус тимчасової служби за допомогою `systemctl status`. Впишіть: - ```bash - systemctl status mytransient.service - ``` + ```bash + systemctl status mytransient.service + ``` #### Щоб установити обмеження ресурсу пам’яті для тимчасової служби 1. Використовуйте параметр `--property` разом із `systemd-run`, щоб обмежити максимальне використання пам’яті для тимчасового процесу до 200 Мб. Впишіть: - ```bash - systemd-run --unit=mylimited.service --property=MemoryMax=200M sleep 300 - ``` + ```bash + systemd-run --unit=mylimited.service --property=MemoryMax=200M sleep 300 + ``` 2. Подивіться у відповідній файловій системі `cgroup` процес перевірки налаштування. Впишіть: - ```bash - sudo cat /sys/fs/cgroup/system.slice/mytransient.service/memory.max - ``` + ```bash + sudo cat /sys/fs/cgroup/system.slice/mytransient.service/memory.max + ``` - !!! tip "Підказка" + !!! tip "Підказка" - ``` - `systemd.resource-control` — це конфігурація або керуюча сутність (концепція) у рамках `systemd`, призначена для керування та розподілу системних ресурсів для процесів і служб. А `systemd.exec` — це компонент `systemd`, який відповідає за визначення середовища виконання, у якому виконуються команди. Щоб переглянути різні параметри (властивості), які ви можете налаштувати під час використання systemd-run, зверніться до сторінок посібника `systemd.resource-control` і `systemd.exec`. Тут ви знайдете документацію для таких властивостей, як MemoryMax, CPUAccounting, IOWeight тощо. - ``` + ``` + `systemd.resource-control` — це конфігурація або керуюча сутність (концепція) у рамках `systemd`, призначена для керування та розподілу системних ресурсів для процесів і служб. А `systemd.exec` — це компонент `systemd`, який відповідає за визначення середовища виконання, у якому виконуються команди. Щоб переглянути різні параметри (властивості), які ви можете налаштувати під час використання systemd-run, зверніться до сторінок посібника `systemd.resource-control` і `systemd.exec`. Тут ви знайдете документацію для таких властивостей, як MemoryMax, CPUAccounting, IOWeight тощо. + ``` #### Щоб установити обмеження на ресурс ЦП для тимчасової служби 1. Давайте створимо тимчасовий блок `systemd` під назвою "myrealtime.service". Запустіть `myrealtime.service` із певною політикою планування round robin (rr) та пріоритетом. Впишіть: - ```bash - systemd-run --unit=myrealtime.service \ - --property=CPUSchedulingPolicy=rr --property=CPUSchedulingPriority=50 sleep 300 - ``` + ```bash + systemd-run --unit=myrealtime.service \ + --property=CPUSchedulingPolicy=rr --property=CPUSchedulingPriority=50 sleep 300 + ``` 2. Перевірте статус `myrealtime.service`. Крім того, захопіть/збережіть основний [sleep] PID у змінній під назвою MYPID. Впишіть: - ```bash - MYPID=$(systemctl status myrealtime.service | awk '/Main PID/ {print $3}') - ``` + ```bash + MYPID=$(systemctl status myrealtime.service | awk '/Main PID/ {print $3}') + ``` 3. Поки служба все ще працює, перевірте її політику планування ЦП. Впишіть: - ```bash - chrt -p $MYPID - pid 2553792's current scheduling policy: SCHED_RR - pid 2553792's current scheduling priority: 50 - ``` + ```bash + chrt -p $MYPID + pid 2553792's current scheduling policy: SCHED_RR + pid 2553792's current scheduling priority: 50 + ``` ### Щоб створити блок перехідного часу 1. Створіть простий таймер, який виконує просту команду echo. Параметр `--on-active=2m` встановлює таймер на спрацьовування через 2 хвилини після того, як блок таймера стане активним. Впишіть: - ```bash - systemd-run --on-active=2m --unit=mytimer.timer \ - --description="Example Timer" echo "Timer triggered" - ``` + ```bash + systemd-run --on-active=2m --unit=mytimer.timer \ + --description="Example Timer" echo "Timer triggered" + ``` - Таймер почне відлік часу з моменту активації пристрою і через 2 хвилини запустить вказану дію. + Таймер почне відлік часу з моменту активації пристрою і через 2 хвилини запустить вказану дію. 2. Переглянути деталі/статус щойно створеного таймера. Впишіть: - ```bash - systemctl status mytimer.timer - ``` + ```bash + systemctl status mytimer.timer + ``` #### Щоб зупинити та очистити тимчасові блоки `systemd` 1. Введіть наступні команди, щоб переконатися, що різні тимчасові служби/процеси, запущені для цієї вправи, належним чином зупинені та видалені з вашої системи. Впишіть: - ```bash - systemctl stop mytransient.service - systemctl stop mylimited.service - systemctl stop myrealtime.service - systemctl stop mytimer.timer - ``` + ```bash + systemctl stop mytransient.service + systemctl stop mylimited.service + systemctl stop myrealtime.service + systemctl stop mytimer.timer + ``` ## Вправа 10 @@ -930,97 +930,97 @@ CPU affinity прив’язує конкретні процеси або пот 1. Встановіть програму `schedtool`, якщо вона не встановлена на вашому сервері. Впишіть: - ```bash - sudo dnf -y install schedtool - ``` + ```bash + sudo dnf -y install schedtool + ``` #### Щоб створити імітований сценарій процесу 1. Створіть сценарій, який генерує навантаження на процесор для цілей тестування. Впишіть: - ```bash - cat > ~/cpu_load_generator.sh << EOF - #!/bin/bash - while true; do - openssl speed > /dev/null 2>&1 - openssl speed > /dev/null 2>&1 - - done - EOF - chmod +x ~/cpu_load_generator.sh - ``` + ```bash + cat > ~/cpu_load_generator.sh << EOF + #!/bin/bash + while true; do + openssl speed > /dev/null 2>&1 + openssl speed > /dev/null 2>&1 + + done + EOF + chmod +x ~/cpu_load_generator.sh + ``` 2. Запустіть сценарій у фоновому режимі. Впишіть: - ```bash - ~/cpu_load_generator.sh & echo $! - ``` + ```bash + ~/cpu_load_generator.sh & echo $! + ``` 3. Зафіксуйте PID для основного процесу `openssl`, запущеного в скрипті `cpu_load_generator.sh`. Збережіть PID у змінній з іменем `$MYPID`. Впишіть: - ```bash - export MYPID=$(pidof openssl) ; echo $MYPID - ``` + ```bash + export MYPID=$(pidof openssl) ; echo $MYPID + ``` #### Щоб використовувати `schedtool` для перевірки поточної політики планування 1. Використовуйте команду `schedtool`, щоб відобразити інформацію про планування процесу з PID `$MYPID`. Впишіть: - ```bash - schedtool $MYPID - ``` + ```bash + schedtool $MYPID + ``` - Вихід: + Вихід: - ```bash - PID 2565081: PRIO 0, POLICY N: SCHED_NORMAL , NICE 0, AFFINITY 0xf - ``` + ```bash + PID 2565081: PRIO 0, POLICY N: SCHED_NORMAL , NICE 0, AFFINITY 0xf + ``` #### Щоб використовувати `schedtool` для зміни політики планування 1. Змініть політику планування та пріоритет процесу FIFO та 10 відповідно. Впишіть: - ```bash - sudo schedtool -F -p 10 $! - ``` + ```bash + sudo schedtool -F -p 10 $! + ``` 2. Перегляньте ефект від змін. Впишіть: - ```bash - schedtool $MYPID - ``` + ```bash + schedtool $MYPID + ``` 3. Змініть політику планування та пріоритет процесу на циклічний або SCHED_RR (RR) і 50 відповідно. Впишіть: - ```bash - sudo schedtool -R -p 50 $MYPID - ``` + ```bash + sudo schedtool -R -p 50 $MYPID + ``` 4. Перегляньте ефект від змін. Впишіть: - ```bash - schedtool $MYPID - ``` + ```bash + schedtool $MYPID + ``` 5. Змініть політику планування процесу на Idle або SCHED_IDLEPRIO (D). Впишіть: - ```bash - sudo schedtool -D $MYPID - ``` + ```bash + sudo schedtool -D $MYPID + ``` 6. Перегляньте ефект від змін. 7. Нарешті, скиньте політику планування процесу назад до початкового стандартного SCHED_NORMAL (N або інше). Впишіть: - ```bash - sudo schedtool -N $MYPID - ``` + ```bash + sudo schedtool -N $MYPID + ``` #### Щоб завершити та очистити процес `cpu_load_generator.sh` 1. Все готово. Завершіть сценарій і видаліть сценарій `cpu_load_generator.sh`. - ```bash - kill $MYPID - rm ~/cpu_load_generator.sh - ``` + ```bash + kill $MYPID + rm ~/cpu_load_generator.sh + ``` diff --git a/docs/release_notes/10_0.it.md b/docs/release_notes/10_0.it.md index fc92086bdc..e965543f2d 100644 --- a/docs/release_notes/10_0.it.md +++ b/docs/release_notes/10_0.it.md @@ -58,7 +58,9 @@ L'implementazione di AMD del livello di microarchitettura x86-64-v3, che serve c !!! Note "Differenze delle immagini di Raspberry Pi" + ``` La differenza principale tra le immagini Rocky Linux Pi per la versione 10 è che la 10 supporta il Pi 4 e il Pi 5, mentre la 9 supporta il Pi 3, il Pi 4, il Pi 5 e il Pi Zero 2W. + ``` ### Creazione di pacchetti di installazione e immagini diff --git a/docs/release_notes/10_0.uk.md b/docs/release_notes/10_0.uk.md index a207fbf18c..77ff39b92c 100644 --- a/docs/release_notes/10_0.uk.md +++ b/docs/release_notes/10_0.uk.md @@ -59,7 +59,9 @@ Rocky Linux 10 підтримується на таких архітектура !!! Note "Відмінності зображень Raspberry Pi" + ``` Ключова відмінність між образами Rocky Linux Pi для версії 10 полягає в тому, що 10 підтримує Pi 4 та Pi 5, тоді як 9 підтримує Pi 3, Pi 4, Pi 5 та Pi Zero 2W. + ``` ### Встановлення та створення зображень diff --git a/docs/release_notes/10_0.zh.md b/docs/release_notes/10_0.zh.md index b9f99489d3..2320baa184 100644 --- a/docs/release_notes/10_0.zh.md +++ b/docs/release_notes/10_0.zh.md @@ -58,7 +58,9 @@ x86-64-v3 微架构级别是 Rocky Linux 10 在 x86_64 平台的最低硬件要 !!! Note "树莓派镜像差异" + ``` 10 版本 的 Rocky Linux Pi 镜像与之前版本的主要区别在于——10 版本支持 Pi 4 和 Pi 5,而 9 版本支持 Pi 3、Pi 4、Pi 5 和 Pi Zero 2W。 + ``` ### 安装程序和镜像创建 diff --git a/docs/release_notes/9_6.it.md b/docs/release_notes/9_6.it.md index a47c0bc23b..6bd64431b0 100644 --- a/docs/release_notes/9_6.it.md +++ b/docs/release_notes/9_6.it.md @@ -16,7 +16,9 @@ L'elenco completo della maggior parte dei cambiamenti è disponibile nelle [note !!! Note + ``` Rocky Linux non offre un percorso di aggiornamento da qualsiasi versione di Rocky Linux 8. Si consiglia di eseguire una nuova installazione del sistema operativo per passare a Rocky Linux 9.6. + ``` ## Immagini diff --git a/docs/release_notes/9_6.uk.md b/docs/release_notes/9_6.uk.md index d6482e1dc3..fdd197602d 100644 --- a/docs/release_notes/9_6.uk.md +++ b/docs/release_notes/9_6.uk.md @@ -16,7 +16,9 @@ tags: !!! Note "Примітка" + ``` Rocky Linux не пропонує шлях оновлення з жодної версії Rocky Linux 8. Ми рекомендуємо виконати чисту інсталяцію ОС для оновлення до Rocky Linux 9.6. + ``` ## Зображення diff --git a/docs/release_notes/9_6.zh.md b/docs/release_notes/9_6.zh.md index c657cedba0..bb0432acc4 100644 --- a/docs/release_notes/9_6.zh.md +++ b/docs/release_notes/9_6.zh.md @@ -16,7 +16,9 @@ tags: !!! Note "说明" + ``` Rocky Linux 不提供任何 Rocky Linux 8 版本的升级途径。我们建议进行全新的操作系统安装以迁移到 Rocky Linux 9.6。 + ``` ## 镜像 diff --git a/docs/rocky_insights/blogs/good_docs.it.md b/docs/rocky_insights/blogs/good_docs.it.md index e056bf9d1f..2a4d3db59d 100644 --- a/docs/rocky_insights/blogs/good_docs.it.md +++ b/docs/rocky_insights/blogs/good_docs.it.md @@ -20,7 +20,7 @@ In linea di principio, non si ha idea di chi siano i fruitori della documentazio Idiomi, gergo, contrazioni e acronimi possono confondere i lettori che non li conoscono, in particolare coloro che non sono madrelingua, i nuovi dipendenti o tutti coloro che estranei al vostro settore specifico. -I **diomi** sono spesso culturalmente specifici e possono essere difficili da capire per i lettori internazionali.\ +Gli **idiomi** sono spesso specifici di una determinata cultura e possono essere difficili da comprendere per i lettori internazionali.\ Il **gergo** comprende termini specialistici che solo gli esperti di un settore possono riconoscere.\ Le **contrazioni** sostituiscono le parole della lingua inglese con scorciatoie, che però non sempre esistono in tutte le lingue, rendendo difficile la traduzione.\ Gli **acronimi** possono essere ambigui, soprattutto se non vengono definiti al momento del loro utilizzo. diff --git a/docs/rocky_insights/blogs/index.fr.md b/docs/rocky_insights/blogs/index.fr.md index e3e8d48eb3..6c086fa44d 100644 --- a/docs/rocky_insights/blogs/index.fr.md +++ b/docs/rocky_insights/blogs/index.fr.md @@ -20,9 +20,9 @@ Si vous n'avez pas d'identifiants GitHub et que vous souhaitez quand même écri Vous devez vous assurer que votre document répond aux exigences de cette section. Par exemple : -- Est-ce que ça convient ici ? Est-ce que cette information mérite d’être partagée ? S'agit-il d'un document de type blog ? -- Est-ce que cela traite d'un sujet important pour les documentaristes ? -- La publication améliorera-t-elle la qualité globale de toute la documentation de Rocky Linux ? + - Est-ce que ça convient ici ? Est-ce que cette information mérite d’être partagée ? S'agit-il d'un document de type blog ? + - Est-ce que cela traite d'un sujet important pour les documentaristes ? + - La publication améliorera-t-elle la qualité globale de toute la documentation de Rocky Linux ? ## Quel genre d'informations ? diff --git a/docs/rocky_insights/blogs/index.it.md b/docs/rocky_insights/blogs/index.it.md index 1569c6304f..c90b5780f1 100644 --- a/docs/rocky_insights/blogs/index.it.md +++ b/docs/rocky_insights/blogs/index.it.md @@ -20,9 +20,9 @@ Se non si ha le credenziali GitHub e si vuole comunque scrivere qualcosa per que Dovete assicurarvi che il vostro documento soddisfi i requisiti di questa sezione. Per esempio: -- E' adatta qui? Sono informazioni che vale la pena condividere? È un documento in stile blog? -- Approfondisce un tema importante per i documentaristi? -- La comunicazione migliorerà la qualità complessiva di tutta la documentazione di Rocky Linux? + - E' adatta qui? Sono informazioni che vale la pena condividere? È un documento in stile blog? + - Approfondisce un tema importante per i documentaristi? + - La comunicazione migliorerà la qualità complessiva di tutta la documentazione di Rocky Linux? ## Che tipo di informazione? diff --git a/docs/rocky_insights/blogs/index.uk.md b/docs/rocky_insights/blogs/index.uk.md index 0bb418b1a0..96adcd775a 100644 --- a/docs/rocky_insights/blogs/index.uk.md +++ b/docs/rocky_insights/blogs/index.uk.md @@ -20,9 +20,9 @@ contributors: Ви повинні переконатися, що ваш документ відповідає вимогам цього розділу. Наприклад: -- Це підходить сюди? Чи варто ділитися цією інформацією? Це документ у стилі блогу? -- Чи розкриває він тему, важливу для документалістів? -- Чи підвищить подання загальну якість документації Rocky Linux? + - Це підходить сюди? Чи варто ділитися цією інформацією? Це документ у стилі блогу? + - Чи розкриває він тему, важливу для документалістів? + - Чи підвищить подання загальну якість документації Rocky Linux? ## Яка інформація? diff --git a/docs/rocky_insights/blogs/index.zh.md b/docs/rocky_insights/blogs/index.zh.md index 91d14e729a..284bfe54a7 100644 --- a/docs/rocky_insights/blogs/index.zh.md +++ b/docs/rocky_insights/blogs/index.zh.md @@ -20,9 +20,9 @@ contributors: 您应该确保您的文档符合本章节的要求。 例如: -- 它适合这里吗? 它是值得共享的信息吗? 它是博客风格的文档吗? -- 它是否扩展了对文档作者很重要的主题? -- 这次提交会提高所有 Rocky Linux 文档的整体质量吗? + - 它适合这里吗? 它是值得共享的信息吗? 它是博客风格的文档吗? + - 它是否扩展了对文档作者很重要的主题? + - 这次提交会提高所有 Rocky Linux 文档的整体质量吗? ## 什么样的信息? From 8fb1aa14129512572d3c2971bb9b839740ccf112 Mon Sep 17 00:00:00 2001 From: Lukas Magauer <42647570+lumarel@users.noreply.github.com> Date: Thu, 28 Aug 2025 16:55:19 +0200 Subject: [PATCH 126/164] Fixes #2803 - Make sure wsl --install --from-file command is correct (#2853) and minor format fix --- docs/guides/interoperability/import_rocky_to_wsl.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guides/interoperability/import_rocky_to_wsl.md b/docs/guides/interoperability/import_rocky_to_wsl.md index 7936d7f71f..5682a3c895 100644 --- a/docs/guides/interoperability/import_rocky_to_wsl.md +++ b/docs/guides/interoperability/import_rocky_to_wsl.md @@ -24,7 +24,7 @@ This feature should be available on every supported version of Windows 10 and 11 !!! tip "WSL version" - Ensure that your WSL version is up to date, as some features were only introduced in later versions. If you are unsure, run `wsl --update`. + Ensure that your WSL version is up to date, as some features were only introduced in later versions. If you are unsure, run `wsl --update`. ## Steps @@ -41,7 +41,7 @@ This feature should be available on every supported version of Windows 10 and 11 - Install the image via command line: ```sh - wsl --install --from-file + wsl --install --from-file --name ``` ### Conventional Container images From 78f08812292cee64d000b43e9555402fb845ee51 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Fri, 29 Aug 2025 09:12:55 -0400 Subject: [PATCH 127/164] New Crowdin updates (#2852) * New translations libvirt-rocky.md (French) * New translations import_rocky_to_wsl.md (Italian) * New translations libvirt-rocky.md (French) * New translations libvirt-rocky.md (French) * New translations vmware_tools.md (French) * New translations import_rocky_to_wsl.md (French) * New translations import_rocky_to_wsl.md (German) * New translations import_rocky_to_wsl.md (German) * New translations import_rocky_to_wsl.md (French) * New translations mtr.md (German) * New translations https_rsa_keygen.md (French) * New translations https_rsa_keygen.md (Spanish) * New translations dnf-swap.md (French) * New translations 00-toc.md (Spanish) * New translations dnf-swap.md (German) * New translations 00-toc.md (Portuguese) * New translations 00-toc.md (Portuguese, Brazilian) --- docs/books/admin_guide/00-toc.es.md | 2 +- docs/books/admin_guide/00-toc.pt-BR.md | 4 +- docs/books/admin_guide/00-toc.pt.md | 6 +- docs/gemstones/dnf-swap.de.md | 2 +- docs/gemstones/dnf-swap.fr.md | 2 +- docs/gemstones/https_rsa_keygen.es.md | 4 +- docs/gemstones/https_rsa_keygen.fr.md | 2 +- docs/gemstones/network/mtr.de.md | 2 +- .../import_rocky_to_wsl.de.md | 57 +++++++++++------ .../import_rocky_to_wsl.fr.md | 62 ++++++++++++------- .../import_rocky_to_wsl.it.md | 4 +- .../guides/virtualization/libvirt-rocky.fr.md | 6 +- docs/guides/virtualization/vmware_tools.fr.md | 2 +- 13 files changed, 96 insertions(+), 59 deletions(-) diff --git a/docs/books/admin_guide/00-toc.es.md b/docs/books/admin_guide/00-toc.es.md index 1026bbd102..2cb1dd30ac 100644 --- a/docs/books/admin_guide/00-toc.es.md +++ b/docs/books/admin_guide/00-toc.es.md @@ -20,7 +20,7 @@ A continuación, podemos adentrarnos en el funcionamiento profundo de Linux para * Sistemas de archivos * Gestión de procesos -A continuación, cubriremos un tema esencial para el administrador de sistemas Linux: El proceso de copia de seguridad. Muchas soluciones de software vienen con Linux para mejorar las copias de seguridad (rsnapshot, lsyncd, etcétera).Es interesante conocer los componentes esenciales de la copia de seguridad que se encuntran dentro del sistema operativo. Para ello, en este capítulo, conoceremos dos nuevas herramientas: `tar` y el menos difundido `cpio`. Para ello, en este capítulo, conoceremos dos nuevas herramientas: `tar` y el menos difundido `cpio`. +A continuación, cubriremos un tema esencial para el administrador de sistemas Linux: El proceso de copia de seguridad. Muchas soluciones de software vienen con Linux para mejorar las copias de seguridad (rsnapshot, lsyncd, etcétera). Es interesante conocer los componentes esenciales de la copia de seguridad que se encuentran dentro del sistema operativo. Para ello, en este capítulo, conoceremos dos nuevas herramientas: `tar` y el menos difundido `cpio`. Para ello, en este capítulo, conoceremos dos nuevas herramientas: `tar` y el menos difundido `cpio`. La gestión del sistema durante el proceso de arranque ha evolucionado significativamente en los últimos años desde la llegada de systemd. diff --git a/docs/books/admin_guide/00-toc.pt-BR.md b/docs/books/admin_guide/00-toc.pt-BR.md index aed88d97d0..710ddbac97 100644 --- a/docs/books/admin_guide/00-toc.pt-BR.md +++ b/docs/books/admin_guide/00-toc.pt-BR.md @@ -10,7 +10,7 @@ O Guia do Administrador é uma coleção de documentos educacionais direcionados Iniciamos com a Introdução ao Linux, que descreve o Linux, as distribuições e todo o ecossistema em torno do nosso sistema operacional. -Comandos de Usuário contém comandos essenciais para se familiarizar com o Linux. Usuários mais experientes devem consultar também o capítulo de Comandos Avançados do Linux. +Comandos de Usuário contém comandos essenciais para se familiarizar com o Linux. Usuários mais experientes devem consultar também o capítulo de Comandos Atacantes do Linux. O Editor de Texto VI merece um capítulo à parte. Embora o Linux venha com muitos editores, VI é um dos mais poderosos. Outros comandos às vezes usam sintaxes idênticas (`sed` ou similares) aos comandos do VI. Então, saber algo sobre o VI, ou pelo menos desmistificar suas funções básicas (como abrir um arquivo, salvar, sair ou sair sem salvar) é muito importante. O usuário ficará mais confortável com as outras funções do VI à medida que usar o editor. Uma alternativa seria utilizar o editor de texto nano, que vem instalado por padrão no Rocky Linux. Mesmo não sendo tão versátil, ele é fácil de utilizar, direto e faz o trabalho. @@ -20,7 +20,7 @@ Em seguida podemos entrar no funcionamento mais profundo do Linux para entender * Sistemas de Arquivos * Gerenciamento de Processos -Backup e Restauração são informações essenciais para o Administrador de Sistemas. O Linux vem com muitas soluções de programas para aprimorar os backups (rsnapshot, lsyncd, etcétera.). É importante conhecer os componentes essenciais de backup que existem no sistema operacional. Nesse capítulo vamos abordar duas ferramentas: `tar` e o menos conhecido `cpio`. +Backup e Restauração são informações essenciais para o Administrador de Sistemas. O Linux vem com muitas soluções de programas para aprimorar os backups (rsnapshot, lsyncd, et cetera). É importante conhecer os componentes essenciais de backup que existem no sistema operacional. Nesse capítulo vamos abordar duas ferramentas: `tar` e o menos conhecido `cpio`. A Inicialização do Sistema também é uma leitura importante porque o gerenciamento do sistema durante o processo de inicialização evoluiu significativamente nos últimos anos, desde a chegada do systemd. diff --git a/docs/books/admin_guide/00-toc.pt.md b/docs/books/admin_guide/00-toc.pt.md index 312404953b..10fbf177c2 100644 --- a/docs/books/admin_guide/00-toc.pt.md +++ b/docs/books/admin_guide/00-toc.pt.md @@ -10,9 +10,9 @@ O Guia da Administração é uma coleção de Documentos de Ensino para Administ Começaremos com uma introdução ao Linux, que envolve Linux, distribuições e todo o ecossistema em torno do nosso sistema operacional. -Comandos de Utilizadores contem comandos essenciais para se atualizar com Linux. Os usuários mais experientes devem também consultar o capítulo dedicado aos "comandos avançados". +Comandos de Utilizadores contem comandos essenciais para se atualizar com Linux. Os utilizadores mais experientes devem também consultar o capítulo dedicado aos "comandos avançados". -O Editor de Texto VI merece seu próprio capítulo. Embora o Linux venha com muitos editores, VI é um dos mais poderosos. Outros comandos às vezes usam sintaxes idênticas(`sed` ou similares) aos comandos do VI . Portanto, saber algo sobre o VI, ou ao menos desmistificar as suas funções essenciais (como abrir um ficheiro, salvar, sair e salvar ou sair sem salvar), é muito importante. O usuário ficará mais confortável com as funções do VI à medida em que usar o editor. Uma alternativa seria usar o editor de texto nano que vem instalado por padrão no Rocky Linux. Embora não seja tão versátil, é simples de usar, direto e supre as necessidade do trabalho a ser feito. +O Editor de Texto VI merece o seu próprio capítulo. Embora o Linux venha com muitos editores, VI é um dos mais poderosos. Outros comandos às vezes usam sintaxes idênticas(`sed` ou similares) aos comandos do VI . Portanto, saber algo sobre o VI, ou ao menos desmistificar as suas funções essenciais (como abrir um ficheiro, salvar, sair e salvar ou sair sem salvar), é muito importante. O utilizador ficará mais confortável com as funções do VI a medida que usa o editor. Uma alternativa seria usar o editor de texto nano que vem instalado por padrão no Rocky Linux. Embora não seja tão versátil, é simples de usar, direto e supre as necessidade do trabalho a ser feito. Em seguida, podemos entrar no funcionamento mais profundo do Linux para compreender como o sistema aborda: @@ -20,7 +20,7 @@ Em seguida, podemos entrar no funcionamento mais profundo do Linux para compreen * Sistemas de Ficheiros * Gestão de Processos -Backup e Restauração são informações essenciais para o Administrador de Sistema. O Linux vem com várias soluções para melhorar os backups (rsnapshot, lsyncd, etc.). É importante conhecer os componentes de backup essenciais que existem no sistema operacional. Neste capítulo vamos estudar duas ferramentas: `tar` e o menos conhecido `cpio`. +Backup e Restauração são informações essenciais para o Administrador de Sistema. O Linux vem com várias soluções para melhorar os backups (rsnapshot, lsyncd, etc.). É importante conhecer os componentes de “backup” essenciais que existem no sistema operativo. Neste capítulo vamos estudar duas ferramentas: `tar` e o menos conhecido `cpio`. A Inicialização do Sistema também é uma leitura importante porque a gestão do sistema durante o processo de inicialização evoluiu significativamente nos últimos anos desde a chegada do systemd. diff --git a/docs/gemstones/dnf-swap.de.md b/docs/gemstones/dnf-swap.de.md index 3d2d222629..1ea54fdfce 100644 --- a/docs/gemstones/dnf-swap.de.md +++ b/docs/gemstones/dnf-swap.de.md @@ -1,5 +1,5 @@ - - - -title: DNF — swap-Befehl author: wale soyinka contributors: date: 2023-01-24 tags: +title: dnf - swap command author: wale soyinka contributors: date: 2023-01-24 tags: - cloud images - container - dnf diff --git a/docs/gemstones/dnf-swap.fr.md b/docs/gemstones/dnf-swap.fr.md index 3ee03029e3..4e19390132 100644 --- a/docs/gemstones/dnf-swap.fr.md +++ b/docs/gemstones/dnf-swap.fr.md @@ -1,5 +1,5 @@ - - - -title: dnf — la commande swap author: wale soyinka contributors: date: 2023-01-24 tags: +title: dnf - swap command author: wale soyinka contributors: date: 2023-01-24 tags: - cloud images - conteneurs - dnf diff --git a/docs/gemstones/https_rsa_keygen.es.md b/docs/gemstones/https_rsa_keygen.es.md index 1ca2661f04..6e3a258973 100644 --- a/docs/gemstones/https_rsa_keygen.es.md +++ b/docs/gemstones/https_rsa_keygen.es.md @@ -12,7 +12,7 @@ He utilizado este script muchas veces. No importa la frecuencia con la que utili Renombre este script como quiera, por ejemplo: `keygen.sh` y hágalo sea ejecutable (`chmod +x scriptname`) y colóquelo en un directorio que esté incluido dentro de su variable de entorno $PATH, por ejemplo: /usr/local/sbin -``` +```bash #!/bin/bash if [ $1 ] then @@ -30,7 +30,7 @@ else fi ``` -!!! Note +!!! note "Nota" Tendrá que introducir tres veces seguidas la contraseña para la clave. diff --git a/docs/gemstones/https_rsa_keygen.fr.md b/docs/gemstones/https_rsa_keygen.fr.md index aa0556ee9f..062d4be128 100644 --- a/docs/gemstones/https_rsa_keygen.fr.md +++ b/docs/gemstones/https_rsa_keygen.fr.md @@ -1,5 +1,5 @@ --- -title: https – Génération de clé RSA +title: https — Génération de clé RSA author: Steven Spencer update: 2022-01-26 --- diff --git a/docs/gemstones/network/mtr.de.md b/docs/gemstones/network/mtr.de.md index 9e0b369bba..5ad2d004ab 100644 --- a/docs/gemstones/network/mtr.de.md +++ b/docs/gemstones/network/mtr.de.md @@ -1,5 +1,5 @@ --- -title: mtr – Netzwerk-Diagnose +title: mtr — Netzwerk–Diagnose author: tianci li contributors: Steven Spencer, Neel Chauhan date: 2021-10-20 diff --git a/docs/guides/interoperability/import_rocky_to_wsl.de.md b/docs/guides/interoperability/import_rocky_to_wsl.de.md index 6cfba66057..b038dd4f99 100644 --- a/docs/guides/interoperability/import_rocky_to_wsl.de.md +++ b/docs/guides/interoperability/import_rocky_to_wsl.de.md @@ -1,7 +1,7 @@ --- title: Rocky Linux nach WSL oder WSL2 Import author: Lukas Magauer -tested_with: 8.6, 9.0 +tested_with: 8.10, 9.6, 10.0 tags: - wsl - wsl2 @@ -13,55 +13,74 @@ tags: ## Voraussetzungen -Das Windows-Subsystem für Linux muss aktiviert werden. Dies ist mit einer dieser Optionen möglich: +Das Windows-Subsystem für Linux muss aktiviert werden. Das ist mit einer dieser Optionen möglich: -- Seit Kurzem gibt eine neue [ WSL Version im Microsoft Store](https://apps.microsoft.com/store/detail/windows-subsystem-for-linux/9P9TQF7MRM4R), die vorzugsweise verwendet werden sollte. +- [Eine neuere WSL-Version mit zusätzlichen Funktionen ist im Microsoft Store verfügbar](https://apps.microsoft.com/store/detail/windows-subsystem-for-linux/9P9TQF7MRM4R). Verwenden Sie nach Möglichkeit diese neuere Version. - Öffnen Sie ein administratives Terminal (entweder PowerShell oder Eingabeaufforderung) und führen Sie `wsl --install` aus ([siehe Link](https://docs.microsoft.com/en-us/windows/wsl/install)) - Gehen Sie zu den Windows-Einstellungen und aktivieren Sie die Option `Windows-Subsystem für Linux` -Diese Funktion sollte auf jeder neuen Windows 10 und 11 Version verfügbar sein. +Diese Funktion sollte derzeit in jeder unterstützten Version von Windows 10 und 11 verfügbar sein. + +!!! tip "WSL-Version" + + Stellen Sie sicher, dass Ihre `WSL`-Version auf dem neuesten Stand ist, da einige Funktionen erst in neueren Versionen eingeführt wurden. Wenn Sie sich nicht sicher sind, führen Sie `wsl --update` aus. ## Einzelne Schritte -1. Sie benötigen das Container `rootfs`. Das ist auf mehrere Arten verfügbar: +### Installierbare WSL-Images (vorzugsweise) + +1. Laden Sie das WSL-Image vom CDN oder einem anderen Mirror in Ihrer Nähe herunter: + + - 9: [x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-WSL-Base.latest.x86_64.wsl) oder [aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-WSL-Base.latest.aarch64.wsl) + - 10: [x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-WSL-Base.latest.x86_64.wsl) or [aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-WSL-Base.latest.aarch64.wsl) - - **Vorzugsweise:** Laden Sie das ISO-Bild vom CDN herunter: +2. Es gibt mehrere Optionen zum Installieren eines `.wsl`-Images: + + - Doppelklicken Sie auf das Image und es wird mit dem Standardnamen des Bildes installiert + - Installieren Sie das Image über die Befehlszeile: + + ```sh + wsl --install --from-file --name + ``` + +### Herkömmliche Container-Images + +1. Sie benötigen den Container `rootfs`. Das ist auf mehrere Arten möglich: + + - Laden Sie das Image vom CDN herunter: - 8: [Base x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-UBI.latest.aarch64.tar.xz) - 9: [Base x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-UBI.latest.aarch64.tar.xz) + - 10: [Base x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-UBI.latest.aarch64.tar.xz) - Entpacken Sie das Image aus `Docker Hub` oder `Quay.io` ([siehe Link](https://docs.microsoft.com/en-us/windows/wsl/use-custom-distro#export-the-tar-from-a-container)) ```sh - export rockylinux:9 > rocky-9-image.tar + export rockylinux:10 > rocky-10-image.tar ``` -2. (optional) Möglicherweise müssen Sie die .tar aus der .tar.xz Datei extrahieren, falls Sie nicht eine der neuesten WSL Versionen verwenden -3. Erstellen Sie das Verzeichnis, in dem das WSL seine Dateien speichert (zum Beispiel irgendwo im Benutzerprofil) -4. Schließlich importieren Sie das Image in WSL ([siehe Link](https://docs.microsoft.com/en-us/windows/wsl/use-custom-distro#import-the-tar-file-into-wsl)): +2. (optional) Sie müssen die `.tar`-Datei aus der `.tar.xz`-Datei extrahieren, wenn Sie eine der neuesten WSL-Versionen verwenden +3. Erstellen Sie das Verzeichnis, in dem das WSL seine Dateien speichert (normalerweise irgendwo im Benutzerprofil) +4. Importieren Sie abschließend das Image in WSL ([Ref.](https://docs.microsoft.com/en-us/windows/wsl/use-custom-distro#import-the-tar-file-into-wsl)): - WSL: ```sh - wsl --import + wsl --import --version 1 ``` - WSL 2: ```sh - wsl --import --version 2 + wsl --import --version 2 ``` !!! tip "WSL vs. WSL 2" - Eigentlich sollte (!) WSL 2 schneller sein als WSL, aber das kann sich von Anwendungsfall zu Anwendungsfall unterscheiden. + Generell sollte WSL 2 schneller sein als WSL, dies kann jedoch je nach Anwendungsfall variieren. !!! tip "Windows Terminal" - Wenn Sie `Windows Terminal` installiert haben, wird der neue WSL Distributionsname als Option im Pull-down-Menü angezeigt, das ist ziemlich praktisch, um Linux in der WSL zu starten. Sie können alles dann mit Farben, Schriftarten etc. verschlimmbessern. + Wenn Sie `Windows Terminal` installiert haben, wird der neue WSL-Distributionsname als Option im Pull-down-Menü angezeigt, was für zukünftige Starts sehr praktisch ist. Sie können alles dann mit Farben, Schriftarten etc. verschlimmbessern. !!! tip "systemd" - Microsoft hat sich auch entschieden, `systemd` in die WSL zu integrieren. Diese Option existiert bereits in der neuesten WSL Version aus dem Microsoft Store. Sie sollten nur die Zeile `systemd=true` im ini-Abschnitt `boot` der Datei `/etc/wsl.conf` hinzufügen! ([ref.](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/#set-the-systemd-flag-set-in-your-wsl-distro-settings)) - -!!! tip "Microsoft Store" - - Derzeit gibt es kein Bild im Microsoft Store, wenn Sie helfen wollen, es dorthin zu bringen, besuchen Sie uns im Mattermost SIG/Containers Channel! Es gab vor langer Zeit [einige Anstrengungen](https://github.com/rocky-linux/WSL-DistroLauncher), die wieder aufgegriffen werden können. + Das WSL-Image ist standardmäßig systemd-fähig. Wenn Sie Container-Images verwenden oder eigene erstellen möchten, fügen Sie einfach `systemd=true` zum Abschnitt `boot` in der Datei `/etc/wsl.conf` hinzu. ([ref.](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/#set-the-systemd-flag-set-in-your-wsl-distro-settings)) diff --git a/docs/guides/interoperability/import_rocky_to_wsl.fr.md b/docs/guides/interoperability/import_rocky_to_wsl.fr.md index 8d34f3be4c..7344fc37a7 100644 --- a/docs/guides/interoperability/import_rocky_to_wsl.fr.md +++ b/docs/guides/interoperability/import_rocky_to_wsl.fr.md @@ -1,7 +1,7 @@ --- title: Importer Rocky Linux vers WSL ou WSL2 author: Lukas Magauer -tested_with: 8.6, 9.0 +tested_with: 8.10, 9.6, 10.0 tags: - wsl - wsl2 @@ -13,56 +13,74 @@ tags: ## Prérequis -La fonctionnalité Windows-Subsystem pour Linux doit être activée. Ceci est possible avec l'une de ces options : +La fonctionnalité `Windows-Subsystem for Linux` doit être activée. Ceci est possible avec l'une de ces options : - [Une version WSL plus récente avec des fonctionnalités supplémentaires est disponible dans Microsoft Store](https://apps.microsoft.com/store/detail/windows-subsystem-for-linux/9P9TQF7MRM4R). Utilisez la nouvelle version tant que possible. - Ouvrez un terminal d'administration (PowerShell ou invite de commande) et exécutez la commande suivante :
    `wsl --install` ([ref.](https://docs.microsoft.com/en-us/windows/wsl/install)) - Accédez aux paramètres graphiques de Windows et activez la fonctionnalité facultative `Windows-Subsystem for Linux` -Cette fonctionnalité devrait être disponible sur toutes les versions Windows 10 et 11 prises en charge actuellement (février 2025). +Cette fonctionnalité devrait être disponible sur toutes les versions actuellement prises en charge de Windows 10 et 11. + +!!! tip "Version WSL" + + Assurez-vous que votre version WSL est à jour, car certaines fonctionnalités ont seulement été introduites dans les versions récentes. If you are unsure, run `wsl --update`. ## Marche à suivre -1. Récupérez `rootfs` du conteneur. Ceci est possible de plusieurs manières : +### Images WSL installables (de préférence) + +1. Téléchargez l'image WSL à partir du CDN ou d'un autre miroir à proximité : + + - 9 : [x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-WSL-Base.latest.x86_64.wsl) ou [aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-WSL-Base.latest.aarch64.wsl) + - 10 : [x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-WSL-Base.latest.x86_64.wsl) ou [aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-WSL-Base.latest.aarch64.wsl) - - **Préférable :** Téléchargez l'image depuis le CDN : +2. Il existe plusieurs options pour installer une image `.wsl` : + + - Un double-clic sur l'image l'installera avec le nom d'image par défaut + - Installez l'image à l'aide de la ligne de commande : + + ```sh + wsl --install --from-file --name + ``` + +### Images de conteneurs classiques + +1. Récupérez `rootfs` du conteneur. Cela est possible de plusieurs manières : + + - Téléchargez l'image depuis le CDN : - 8: [Base x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-UBI.latest.aarch64.tar.xz) - 9: [Base x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-UBI.latest.aarch64.tar.xz) - - Extraire l'image à partir de `Docker Hub` ou de `Quay.io` ([ref.](https://docs.microsoft.com/en-us/windows/wsl/use-custom-distro#export-the-tar-from-a-container)) + - 10: [Base x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-UBI.latest.aarch64.tar.xz) + - Extraction de l'image à partir de `Docker Hub` ou de `Quay.io` ([ref.](https://docs.microsoft.com/en-us/windows/wsl/use-custom-distro#export-the-tar-from-a-container)) ```sh - export rockylinux:9 > rocky-9-image.tar + export rockylinux:10 > rocky-10-image.tar ``` -2. (facultatif) Vous devrez extraire le fichier .tar du fichier .tar.xz si vous n'utilisez pas l'une des dernières versions de WSL -3. Créer le répertoire où le WSL stockera ses fichiers (par exemple quelque part dans le profil utilisateur) -4. Enfin, importer l'image dans WSL ([ref.](https://docs.microsoft.com/en-us/windows/wsl/use-custom-distro#import-the-tar-file-into-wsl)) : +2. (facultatif) Vous devrez extraire le fichier `.tar` du fichier `.tar.xz` si vous utilisez l'une des dernières versions de WSL +3. Créez le répertoire dans lequel le WSL stockera ses fichiers (normalement quelque part dans le profil utilisateur) +4. Enfin, importez l'image dans WSL ([ref.](https://docs.microsoft.com/en-us/windows/wsl/use-custom-distro#import-the-tar-file-into-wsl)) : - WSL : ```sh - wsl --import + wsl --import --version 1 ``` - - WSL 2: + - WSL 2 : ```sh - wsl --import --version 2 + wsl --import --version 2 ``` !!! tip "WSL vs. WSL 2" - En général, le WSL 2 devrait être plus rapide que le WSL, mais cela peut différer d'un cas d'utilisation à l'autre. + En général, WSL 2 devrait être plus rapide que WSL, bien que cela puisse varier selon le cas d'utilisation. -!!! tip "Terminal Windows" +!!! tip "Windows Terminal" - Si `Windows Terminal` est installé, le nouveau nom de la distribution WSL apparaîtra comme une option dans le menu déroulant ce qui est assez pratique pour le lancement de Linux. Vous pouvez ensuite personnaliser le système - avec des couleurs, des polices, etc. + Si vous avez installé Windows Terminal, le nom de votre nouvelle distribution WSL apparaîtra comme une option dans le menu déroulant, ce qui est très utile pour la lancer par la suite. Vous pouvez ensuite le personnaliser avec des couleurs, des polices et d'autres éléments. !!! tip "systemd" - Microsoft a finalement décidé d’intégrer `systemd` dans le WSL. Cette fonctionnalité fait partie de la nouvelle version WSL dans Microsoft Store. Il vous suffit d'ajouter `systemd=true` à la section ini `boot` dans le fichier `/etc/wsl.conf` ! ([ref.](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/#set-the-systemd-flag-set-in-your-wsl-distro-settings)) - -!!! tip "Microsoft Store" - - Il n'y a actuellement aucune image dans le Microsoft Store, si vous voulez aider à l'y amener, rejoignez la conversation dans le canal Mattermost SIG/Containers ! Les [quelques efforts](https://github.com/rocky-linux/WSL-DistroLauncher) fournis il y a longtemps, peuvent être utiles maintenant. + L'image WSL est activée par défaut pour systemd. Si vous souhaitez utiliser les images de conteneur ou créer les vôtres, il vous suffira d'ajouter `systemd=true` à la section `boot` dans le fichier `/etc/wsl.conf`. ([ref.](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/#set-the-systemd-flag-set-in-your-wsl-distro-settings)) diff --git a/docs/guides/interoperability/import_rocky_to_wsl.it.md b/docs/guides/interoperability/import_rocky_to_wsl.it.md index 58428aed4e..9e6c99dfec 100644 --- a/docs/guides/interoperability/import_rocky_to_wsl.it.md +++ b/docs/guides/interoperability/import_rocky_to_wsl.it.md @@ -31,8 +31,8 @@ Questa funzione dovrebbe essere disponibile su tutte le versioni di Windows 10 e 1. Scaricare l'immagine WSL dal CDN o da un altro mirror più vicino: - - 9: [x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-WSL-Base.latest.x86_64.wsl) or [aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-WSL-Base.latest.aarch64.wsl) - - 10: [x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-WSL-Base.latest.x86_64.wsl) or [aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-WSL-Base.latest.aarch64.wsl) + - 9: [x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-WSL-Base.latest.x86_64.wsl) o [aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-WSL-Base.latest.aarch64.wsl) + - 10: [x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-WSL-Base.latest.x86_64.wsl) o [aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-WSL-Base.latest.aarch64.wsl) 2. Esistono diverse opzioni per installare un'immagine `.wsl`: diff --git a/docs/guides/virtualization/libvirt-rocky.fr.md b/docs/guides/virtualization/libvirt-rocky.fr.md index 271a0bb3b8..a8bce8a440 100644 --- a/docs/guides/virtualization/libvirt-rocky.fr.md +++ b/docs/guides/virtualization/libvirt-rocky.fr.md @@ -78,7 +78,7 @@ sudo nmcli connection delete Assurez-vous d'avoir un accès direct à la machine. Si vous configurez la machine via SSH, la connexion sera interrompue après la suppression de la connexion à l'interface principale. ``` -- Créer la nouvelle connexion de pont : +- Créez la nouvelle connexion de pont : ```bash sudo nmcli connection add type bridge autoconnect yes con-name ifname @@ -102,13 +102,13 @@ sudo nmcli connection modify ipv4.gateway sudo nmcli connection modify ipv4.dns ``` -- Ajoutez la connexion esclave du pont : +- Ajoutez la connexion de pont esclave : ```bash sudo nmcli connection add type bridge-slave autoconnect yes con-name ifname master ``` -- Démarrer la connexion du pont : +- Démarrez la connexion de pont : ```bash sudo nmcli connection up diff --git a/docs/guides/virtualization/vmware_tools.fr.md b/docs/guides/virtualization/vmware_tools.fr.md index dddc4e374f..b0654ab323 100644 --- a/docs/guides/virtualization/vmware_tools.fr.md +++ b/docs/guides/virtualization/vmware_tools.fr.md @@ -154,7 +154,7 @@ sudo su !!! warning "Avertissement" ``` -Be careful changing the default init script directory which should be `/etc/init.d/`. +Faites attention lorsque vous modifiez le répertoire de script d'initialisation par défaut qui devrait être `/etc/init.d/`. >What is the directory that contains the init directories (rc0.d/ to rc6.d/)? >[/etc] /etc/init.d From a4555d793b4c8a1dd2759b743fcb8513f5d60a8c Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Sun, 31 Aug 2025 08:17:30 -0500 Subject: [PATCH 128/164] Fix version 10 WSL to be specific for 10 (#2861) * add admonition at top about WSL instructions for other versions * replace some passive voice phrasing with active voice * strip out version 8 and 9 specific instructions and images --- docs/guides/interoperability/import_rocky_to_wsl.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/guides/interoperability/import_rocky_to_wsl.md b/docs/guides/interoperability/import_rocky_to_wsl.md index 5682a3c895..d1e2e00c80 100644 --- a/docs/guides/interoperability/import_rocky_to_wsl.md +++ b/docs/guides/interoperability/import_rocky_to_wsl.md @@ -9,11 +9,13 @@ tags: - interoperability --- -# Import Rocky Linux to WSL +!!! note "Images for other versions" + + If you are looking for WSL instructions for another version of Rocky Linux, select the version you want from the top menu and then refer to the WSL instructions under "Interoperability." ## Prerequisites -The Windows-Subsystem for Linux feature has to be enabled. This is possible with one of these options: +You must enable the Windows-Subsystem for Linux feature. Do this with one of these options: - [A newer WSL version with extra features is available in the Microsoft Store](https://apps.microsoft.com/store/detail/windows-subsystem-for-linux/9P9TQF7MRM4R). Use this newer version whenever possible. - Open an administrative Terminal (either PowerShell or Command-Prompt) and @@ -32,7 +34,6 @@ This feature should be available on every supported version of Windows 10 and 11 1. Download the WSL image from the CDN or another mirror closer to you: - - 9: [x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-WSL-Base.latest.x86_64.wsl) or [aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-WSL-Base.latest.aarch64.wsl) - 10: [x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-WSL-Base.latest.x86_64.wsl) or [aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-WSL-Base.latest.aarch64.wsl) 2. There are multiple options for installing a `.wsl` image: @@ -49,8 +50,6 @@ This feature should be available on every supported version of Windows 10 and 11 1. Get the container rootfs. This is possible in multiple ways: - Download the image from the CDN: - - 8: [Base x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-UBI.latest.aarch64.tar.xz) - - 9: [Base x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-UBI.latest.aarch64.tar.xz) - 10: [Base x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-UBI.latest.aarch64.tar.xz) - Extract the image from either Docker Hub or Quay.io ([ref.](https://docs.microsoft.com/en-us/windows/wsl/use-custom-distro#export-the-tar-from-a-container)) From 70db38d410718d29efcd6b26442a18eaf8652edb Mon Sep 17 00:00:00 2001 From: Ganna Zhyrnova <112796922+gannazhyrnova@users.noreply.github.com> Date: Mon, 1 Sep 2025 17:38:53 +0300 Subject: [PATCH 129/164] lab5-networking.md (#2863) grammar check --- .../lab5-networking.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/labs/systems_administration_I/lab5-networking.md b/docs/labs/systems_administration_I/lab5-networking.md index f5cf9fe104..f9ed6122bd 100644 --- a/docs/labs/systems_administration_I/lab5-networking.md +++ b/docs/labs/systems_administration_I/lab5-networking.md @@ -34,7 +34,7 @@ The `iproute2` command is a suite of advanced utilities for configuring and mana The `ip` command is an essential tool for network management and configuration. It is part of the `iproute2` package and offers advanced control over network interfaces, IP addresses, routing tables, tunnels, and much more. Thanks to its flexible syntax and options, it allows system administrators to monitor, modify, and resolve connectivity issues efficiently. -Its modular structure allows you to manage different aspects of network configuration in a consistent manner, thus simplifying administration. +Its modular structure allows you to manage different aspects of network configuration consistently, thus simplifying administration. The `nmcli` command is a powerful and versatile tool included in *NetworkManager*, designed for managing network connections on Linux systems directly from the terminal. Unlike graphical tools, `nmcli` allows you to efficiently configure, monitor, and control network interfaces on both local and remote machines, making it particularly useful for system administrators and advanced users. It supports a wide range of features, including the configuration of wired, wireless, and VPN connections, mobile network management, and network status debugging. @@ -43,9 +43,9 @@ It supports a wide range of features, including the configuration of wired, wire ### 1. Change Hostname -There are many methods for identifying or referring to computers. Some of these methods guarantee uniqueness (especially on a network), and others don't. A computer hostname can be regarded as a human-friendly name. Computer hostnames should ideally be unique depending on how they are managed and assigned. But because anyone with the administrative privileges on a system can unilaterally assign whatever hostname they want to the system - **uniqueness is not always guaranteed**. +There are many methods for identifying or referring to computers. Some of these methods guarantee uniqueness (especially on a network), and others don't. A computer hostname can be regarded as a human-friendly name. Computer hostnames should be unique, depending on how they are managed and assigned. However, because anyone with administrative privileges on a system can unilaterally assign any hostname they want to the system, **uniqueness is not always guaranteed**. -This first exercise walks through some common tools for managing the computer hostname. +This first exercise walks through some standard tools for managing the computer hostname. #### Changing the system's hostname @@ -109,17 +109,17 @@ This first exercise walks through some common tools for managing the computer ho ### 2. Creation of a virtual device -The first critical step you need to complete before going on to the other exercises in this network lab will be creating a special virtual network interface known as a *MACVTAP device*. +The first critical step you need to complete before proceeding to the other exercises in this network lab is creating a special virtual network interface known as a *MACVTAP device*. -MACVTAP devices are virtual devices that combine the properties of a software-only interface known as a *TAP device* as well as the properties of the *MACVLAN driver*. +MACVTAP devices are virtual devices that combine the properties of a software-only interface, known as a *TAP device*, with those of the *MACVLAN driver*. Creating and working with these MACVTAP devices will allow you to safely test, change, and configure various network configuration-related tasks. These virtual network interfaces will be used in various exercises without disrupting the existing network configuration. !!! tip - TAP devices provide a software-only interface that user-space applications can easily access. TAP devices send and receive raw Ethernet frames. + TAP devices provide a software-only interface that allows user-space applications to access easily. TAP devices send and receive raw Ethernet frames. MACVLAN is used for creating virtual network interfaces that attach to physical network interfaces. - The MACVTAP devices have their own unique MAC address distinct from the MAC address of the underlying physical network card they are associated with. + The MACVTAP devices have their own unique MAC addresses, distinct from the MAC addresses of the underlying physical network cards they are associated with. #### Creation of a MACVTAP Interfaces @@ -272,7 +272,7 @@ An **IP** (*Internet Protocol*) address is a unique numerical identifier assigne ### 5. Routing management -Routing in Linux is a mechanism that allows the operating system to manage network traffic by directing data packets to the correct destinations. The Linux kernel uses a routing table to determine the optimal path that packets should follow, based on *IP addresses*, *subnet masks*, and *gateways*. +Routing in Linux is a mechanism that enables the operating system to manage network traffic by directing data packets to their intended destinations. The Linux kernel uses a routing table to determine the optimal path that packets should follow, based on *IP addresses*, *subnet masks*, and *gateways*. This functionality is essential in both *home environments* and complex *corporate networks*, where multiple network interfaces and devices need to communicate with each other. #### Viewing the system routing table @@ -547,7 +547,7 @@ The **DNS** (*Domain Name System*) service is a fundamental component of compute ### 9. Troubleshoot network issues -Computer networks are essential for communication and data exchange, but they often encounter problems that hinder their proper functioning. These malfunctions can be caused by a variety of factors, such as configuration errors, hardware failures, or connection interference. +Computer networks are essential for communication and data exchange, but they often encounter problems that hinder their proper functioning. Various factors, including configuration errors, hardware failures, or interference with connections, can cause these malfunctions. #### Identify and resolve common network issues From 6be33215e28deda217a3667e2eb1a9175317a960 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Mon, 1 Sep 2025 10:39:28 -0400 Subject: [PATCH 130/164] New Crowdin updates (#2856) * New translations knot_authoritative_dns.md (French) * New translations 04-firewall.md (French) * New translations 08-snapshots.md (French) * New translations 09-snapshot_server.md (French) * New translations 30-appendix_a.md (French) * New translations dnf-swap.md (French) * New translations private_dns_server_using_bind.md (French) * New translations 00-toc.md (French) * New translations xfce_installation.md (French) * New translations mate_installation.md (French) * New translations 02-zfs_setup.md (German) * New translations dnf-swap.md (French) * New translations mediawiki.md (German) * New translations dnf-swap.md (French) * New translations dnf-swap.md (German) * New translations import_rocky_to_wsl.md (French) * New translations import_rocky_to_wsl.md (German) * New translations iso_creation.md (German) * New translations disa_stig_part3.md (Ukrainian) * New translations import_rocky_to_wsl.md (French) * New translations index.md (Spanish) * New translations index.md (French) * New translations index.md (German) * New translations 12-network.md (Ukrainian) * New translations add_mirror_manager.md (Ukrainian) --- docs/books/admin_guide/12-network.uk.md | 68 ++++++++++++++++--- docs/books/disa_stig/disa_stig_part3.uk.md | 4 +- docs/books/incus_server/00-toc.fr.md | 2 +- docs/books/incus_server/02-zfs_setup.de.md | 2 +- docs/books/incus_server/04-firewall.fr.md | 9 +-- docs/books/incus_server/08-snapshots.fr.md | 2 +- .../incus_server/09-snapshot_server.fr.md | 8 +-- docs/books/incus_server/30-appendix_a.fr.md | 10 +-- docs/gemstones/dnf-swap.de.md | 2 +- docs/gemstones/dnf-swap.fr.md | 2 +- docs/guides/cms/mediawiki.de.md | 2 +- docs/guides/desktop/mate_installation.fr.md | 4 +- docs/guides/desktop/xfce_installation.fr.md | 22 +++--- docs/guides/dns/knot_authoritative_dns.fr.md | 2 +- .../dns/private_dns_server_using_bind.fr.md | 2 +- .../import_rocky_to_wsl.de.md | 13 ++-- .../import_rocky_to_wsl.fr.md | 13 ++-- docs/guides/isos/iso_creation.de.md | 8 +-- .../add_mirror_manager.uk.md | 2 +- docs/index.de.md | 2 +- docs/index.es.md | 2 +- docs/index.fr.md | 17 +++-- 22 files changed, 129 insertions(+), 69 deletions(-) diff --git a/docs/books/admin_guide/12-network.uk.md b/docs/books/admin_guide/12-network.uk.md index 64b25de269..7b26962ae4 100644 --- a/docs/books/admin_guide/12-network.uk.md +++ b/docs/books/admin_guide/12-network.uk.md @@ -53,19 +53,71 @@ title: Впровадження мережі IP-адреси використовуються для належної маршрутизації повідомлень (пакетів). Вони поділяються на дві частини: -* фіксована частина, що ідентифікує мережу; -* ідентифікатор хоста в мережі. +* біт мережі - частина, пов'язана з послідовними «1» у двійковій масці підмережі +* біти хоста - частина, пов'язана з послідовними «0» у двійковій масці підмережі -Маска підмережі — це набір із **4 байтів**, призначений для відокремлення: +``` + |<- host bits ->| + |<-- network bits -->| +192.168.1.10 ==> 11000000.10101000.00000001.00001010 +255.255.255.0 ==> 11111111.11111111.11111111.00000000 +``` + +Маска підмережі використовується для визначення мережевих бітів і бітів хоста IP-адреси. Використовуючи маску підмережі, ми можемо визначити поточну IP-адресу: * мережевої адреси (**NetID** або **SubnetID**), виконавши порозрядне логічне І між IP-адресою та маскою; * адреси хоста (**HostID**), виконавши побітове логічне AND між IP-адресою та доповненням до маски. +``` +192.168.1.10 ==> 11000000.10101000.00000001.00001010 +255.255.255.0 ==> 11111111.11111111.11111111.00000000 + +NetID 11000000.10101000.00000001.00000000 + 192 . 168 . 1 . 0 + +HostID 00000000.00000000.00000000.00001010 + 0 . 0 . 0 . 10 +``` + +**Законна маска підмережі** - Зліва направо послідовні 1 можна визначити як дійсні маски підмережі. + +``` +legitimate 11111111.11111111.11111111.00000000 + +illegitimate 11001001.11111111.11111111.00000000 +``` + +!!! tip "Підказка" + + IP-адреса та маска підмережі повинні з'являтися парами, що визначається основними принципами мережевої комунікації. + У мережі також є конкретні адреси, які необхідно ідентифікувати. Перша адреса діапазону, а також остання мають певну роль: -* Перша адреса діапазону – це **адреса мережі**. Вона використовується для ідентифікації мереж і маршрутизації інформації з однієї мережі в іншу. +* Перша адреса діапазону – це **адреса мережі**. Вона використовується для ідентифікації мереж і маршрутизації інформації з однієї мережі в іншу. Цю адресу можна отримати через Logic and Operations. -* Остання адреса діапазону є **широкомовною адресою**. Він використовується для трансляції інформації на всі машини в мережі. + ``` + 192.168.1.10 ==> 11000000.10101000.00000001.00001010 + 255.255.255.0 ==> 11111111.11111111.11111111.00000000 + + network address 11000000.10101000.00000001.00000000 + 192 . 168 . 1 . 0 + ``` + + **Logic and Operations** - Коли обидва значення є істинними (1), результат є істинним (1); в іншому випадку він є хибним (0) + +* Остання адреса діапазону є **широкомовною адресою**. Вона використовується для трансляції інформації на всі машини в мережі. Збережіть біти мережі без змін і замініть всі біти хоста на 1, щоб отримати цю адресу. + + ``` + 192.168.1.10 ==> 11000000.10101000.00000001.00001010 + 255.255.255.0 ==> 11111111.11111111.11111111.00000000 + + broadcast address 11000000.10101000.00000001.11111111 + 192 . 168 . 1 . 255 + ``` + +!!! tip "Підказка" + + Ці дві адреси, які відіграють особливу роль, **не можуть** бути призначені для використання термінальним пристроєм. ### MAC-адреса / IP-адреса @@ -144,7 +196,7 @@ IP та MAC адреси мають бути унікальними в мере Забудьте стару команду `ifconfig`! Є `ip`! -!!! Примітка +!!! Note "Примітка" Коментар для адміністраторів старих систем Linux: @@ -374,7 +426,7 @@ NETMASK=255.255.255.0 PREFIX=24 ``` -!!! warning "Важливо" +!!! Warning "Увага" Ви повинні використовувати МАСКУ МЕРЕЖІ АБО ПРЕФІКС – не обидва! @@ -547,7 +599,7 @@ dig [-t type] [+short] [name] getent hosts name ``` -Приклади: +Приклад: ```bash [root]# getent hosts rockylinux.org diff --git a/docs/books/disa_stig/disa_stig_part3.uk.md b/docs/books/disa_stig/disa_stig_part3.uk.md index e935e53867..40b549eecb 100644 --- a/docs/books/disa_stig/disa_stig_part3.uk.md +++ b/docs/books/disa_stig/disa_stig_part3.uk.md @@ -291,13 +291,13 @@ sed -i "s/proxy_connect_module/#proxy_connect_module/g" /etc/httpd/conf.modules. **Severity:** Cat II Medium **Type:** Operational -**Fix:** Ні, працюйте з адміністратором SIEM, щоб налаштувати сповіщення, коли дані аудиту не надходять від Apache на основі визначеного розкладу підключень. +**Fix:** Немає. працюйте з адміністратором SIEM, щоб налаштувати сповіщення, коли дані аудиту не надходять від Apache на основі визначеного розкладу підключень. **(V-214233)** Веб-сервер Apache за балансувальником навантаження або проксі-сервером повинен створювати записи журналу, що містять інформацію про IP-адресу клієнта як джерела та призначення, а не інформацію про балансувальник навантаження чи проксі-IP для кожної події. **Severity:** Cat II Medium **Type:** Operational -**Fix:** Ні, отримати доступ до проксі-сервера, через який передається вхідний веб-трафік, і налаштувати параметри для прозорої передачі веб-трафіку на веб-сервер Apache. +**Fix:** Немає, отримати доступ до проксі-сервера, через який передається вхідний веб-трафік, і налаштувати параметри для прозорої передачі веб-трафіку на веб-сервер Apache. Зверніться до , щоб отримати додаткову інформацію про параметри журналювання на основі ваших налаштувань проксі/навантаження. diff --git a/docs/books/incus_server/00-toc.fr.md b/docs/books/incus_server/00-toc.fr.md index fd7d8129f5..de6d8ac76d 100644 --- a/docs/books/incus_server/00-toc.fr.md +++ b/docs/books/incus_server/00-toc.fr.md @@ -5,7 +5,7 @@ contributors: Ezequiel Bruni, Ganna Zhyrnova tested_with: 9.4 tags: - lxd - - Incus + - incus - entreprise --- diff --git a/docs/books/incus_server/02-zfs_setup.de.md b/docs/books/incus_server/02-zfs_setup.de.md index 9ae4a25c83..f1fb5908ca 100644 --- a/docs/books/incus_server/02-zfs_setup.de.md +++ b/docs/books/incus_server/02-zfs_setup.de.md @@ -61,4 +61,4 @@ zpool create storage /dev/sdb Dies bedeutet, dass ein Pool mit dem Namen `storage` (ZFS) auf dem Gerät _/dev/sdb_ erstellt werden soll. -Sobald der Pool erstellt wurde, ist es eine gute Idee, den Server an dieser Stelle neu zu starten. +Starten Sie den Server nach dem Erstellen des Pools erneut. diff --git a/docs/books/incus_server/04-firewall.fr.md b/docs/books/incus_server/04-firewall.fr.md index fa5644de45..cf3bc42d50 100644 --- a/docs/books/incus_server/04-firewall.fr.md +++ b/docs/books/incus_server/04-firewall.fr.md @@ -71,14 +71,15 @@ bridge (active) rich rules: ``` -Notez que vous devez également autoriser votre interface locale. Là encore, les zones incluses ne sont pas nommées de manière appropriée. Créez une zone et utilisez la plage d'adresses IP source pour l'interface locale afin de vous assurer que vous y avez accès : +Notez que vous devez également autoriser l'accès +à votre interface locale. Là encore, les zones incluses ne sont pas nommées de manière appropriée. Créez une zone et utilisez la plage d'adresses IP source pour l'interface locale afin de vous assurer que vous y avez accès : ```bash firewall-cmd --new-zone=local --permanent firewall-cmd --reload ``` -Ajoutez les IP source pour l'interface locale, et changez la cible en « ACCEPT » : +Ajoutez les adresses IP source pour l'interface locale, et changez la cible en `ACCEPT` : ```bash firewall-cmd --zone=local --add-source=127.0.0.1/8 --permanent @@ -105,7 +106,7 @@ local (active) rich rules: ``` -Vous souhaitez autoriser SSH à partir de notre réseau de confiance. Pour ce faire, autorisez les adresses IP sources à utiliser la zone `trusted` intégrée. Par défaut, la cible de cette zone est `ACCEPT`. +Vous pouvez autoriser SSH à partir de notre réseau de confiance. Pour ce faire, autorisez les adresses IP sources à utiliser la zone `trusted` intégrée. Par défaut, la cible de cette zone est `ACCEPT`. ```bash firewall-cmd --zone=trusted --add-source=192.168.1.0/24 @@ -143,7 +144,7 @@ trusted (active) rich rules: ``` -La zone `public` est activée par défaut et SSH est autorisé. Pour des raisons de sécurité, vous ne souhaitez pas que SSH soit autorisé pour la zone `public`. Assurez-vous que vos zones sont correctes et que l'accès au serveur se fait par l'une des IP du réseau local (dans le cas de notre exemple). Vous risquez de vous bloquer sur le serveur si vous ne vérifiez pas cela avant de continuer. Lorsque vous êtes sûr d'avoir accès à l'interface correcte, supprimez SSH de la zone « public » : +La zone `public` est activée par défaut et SSH est autorisé. Pour des raisons de sécurité, vous ne souhaitez pas que SSH soit autorisé pour la zone `public`. Assurez-vous que vos zones sont correctes et que l'accès au serveur se fait par l'une des adresses IP du réseau local (dans le cas de cet exemple). Vous risquez de vous bloquer sur le serveur si vous ne vérifiez pas cela avant de continuer. Lorsque vous êtes sûr d'avoir accès à l'interface correcte, supprimez SSH de la zone « public » : ```bash firewall-cmd --zone=public --remove-service=ssh diff --git a/docs/books/incus_server/08-snapshots.fr.md b/docs/books/incus_server/08-snapshots.fr.md index b88df623d9..1f6aa22500 100644 --- a/docs/books/incus_server/08-snapshots.fr.md +++ b/docs/books/incus_server/08-snapshots.fr.md @@ -96,6 +96,6 @@ Supprimez donc toujours les instantanés pendant que le conteneur est en cours d Dans les chapitres qui suivent, vous allez : -- mettre en place un processus de création automatique d'instantanés +- mettre en place un processus de création automatique de snapshots - set up the expiration of a snapshot so that it goes away after a certain length of time - configurer l'actualisation automatique des instantanés – `auto-refreshing` — sur le serveur de Snapshots diff --git a/docs/books/incus_server/09-snapshot_server.fr.md b/docs/books/incus_server/09-snapshot_server.fr.md index 62bb415f99..bdb2c405bd 100644 --- a/docs/books/incus_server/09-snapshot_server.fr.md +++ b/docs/books/incus_server/09-snapshot_server.fr.md @@ -54,7 +54,7 @@ Ensuite, en tant qu’utilisateur non privilégié (incusadmin), vous devez éta incus remote add incus-snapshot ``` -Le certificat à accepter s'affiche. Acceptez-le et le système vous demandera votre mot de passe. Il s’agit du « mot de passe de confiance » que vous avez défini lors de l’étape d’initialisation d’Incus. N'oubliez pas de garder une trace sécurisée de tous ces mots de passe. Lorsque vous entrez le mot de passe, vous verrez ceci : +Le certificat à accepter s'affiche. Confirmez-le et le système vous demandera votre mot de passe. Il s’agit du « mot de passe de confiance » que vous avez défini lors de l’étape d’initialisation d’Incus. N'oubliez pas de garder une trace sécurisée de tous ces mots de passe. Lorsque vous entrez le mot de passe, vous verrez ceci : ```bash Client certificate stored at server: incus-snapshot @@ -62,7 +62,7 @@ Client certificate stored at server: incus-snapshot Il est recommandé de mettre en place aussi l'inverse. Par exemple, la relation de confiance peut également être définie sur le serveur `incus-snapshot`. Si nécessaire, le serveur `incus-snapshot` peut renvoyer des snapshots au serveur `incus-primary`. Répétez les étapes et remplacez `incus-primary` par `incus-snapshot`. -### Migrer votre premier instantané +### Migration du `snapshot` Avant de migrer votre premier snapshot, vous devez créer tous les profils sur le serveur `incus-snapshot` que vous avez créés sur le serveur `incus-primary`. Dans ce cas, il s'agit du profil `macvlan`. @@ -73,7 +73,7 @@ Vous devrez créer ceci pour le serveur `incus-snapshot`. Revenez au [Chapitre 6 incus profile copy macvlan incus-snapshot ``` -Une fois toutes les relations et tous les profils configurés, l’étape suivante consiste à envoyer un snapshot d’`incus-primary` à `incus-snapshot`. Si vous avez suivi exactement, vous avez probablement supprimé tous vos snapshots. Créer un autre instantané : +Une fois toutes les relations et tous les profils configurés, l’étape suivante consiste à envoyer un snapshot d’`incus-primary` à `incus-snapshot`. Si vous avez suivi exactement, vous avez probablement supprimé tous vos snapshots. Créer un autre `snapshot` : ```bash incus snapshot rockylinux-test-9 rockylinux-test-9-snap1 @@ -137,7 +137,7 @@ Faites cela pour chaque snapshot sur le serveur `incus-snapshot`. The "0" in the ## Automatisation du processus de copie des snapshots -C'est excellent de pouvoir créer des instantanés lorsque cela est nécessaire, et parfois vous avez justement besoin de créer un snapshot manuellement. Vous souhaiterez peut-être même le copier manuellement vers le serveur `incus-snapshot`. Mais pour toutes les autres fois, en particulier pour de nombreux conteneurs exécutés sur votre serveur incus-primary, la **dernière** chose que vous voulez faire est de passer un après-midi à supprimer des instantanés sur le serveur d'instantanés, à créer de nouveaux instantanés et à les envoyer au serveur d'instantanés. Pour l'essentiel de vos opérations, vous souhaiterez automatiser le processus. +C'est excellent de pouvoir créer des instantanés lorsque cela est nécessaire, et parfois vous avez justement besoin de créer un snapshot manuellement. Vous souhaiterez peut-être même le copier manuellement vers le serveur `incus-snapshot`. Mais pour toutes les autres fois, en particulier pour de nombreux conteneurs exécutés sur votre serveur incus-primary, la **dernière** chose que vous voulez faire est de passer un après-midi à supprimer des instantanés sur le serveur d'instantanés, à créer de nouveaux instantanés et à les envoyer au serveur d'instantanés. Pour l'essentiel de vos opérations, vous aurez besoin d'automatiser le processus. Vous devrez planifier un processus pour automatiser la création d'instantanés sur `incus-primary`. Vous ferez cela pour chaque conteneur sur le serveur `incus-primary`. Une fois en place, cette tâche s’occupera de cela à l'avenir. Pour ce faire, la syntaxe suivante est utilisée. Notez les similitudes avec une entrée `crontab` pour l'horodatage : diff --git a/docs/books/incus_server/30-appendix_a.fr.md b/docs/books/incus_server/30-appendix_a.fr.md index 84ac25aaee..ac8a4ea79f 100644 --- a/docs/books/incus_server/30-appendix_a.fr.md +++ b/docs/books/incus_server/30-appendix_a.fr.md @@ -1,14 +1,14 @@ --- -title: Annexe A - Configuration du poste de travail +title: Annexe A - Mise en place du poste de travail author: Steven Spencer contributors: Ganna Zhyrnova tested_with: 9.4 tags: - incus - - poste de travail + - workstation --- -# Annexe A - Configuration du poste de travail +# Annexe A - Mise en place du poste de travail Bien que ne faisant pas partie des chapitres relatifs à un serveur `Incus`, cette procédure aidera ceux qui souhaitent disposer d'un environnement de laboratoire ou d'un système d'exploitation et d'une application semi-permanents exécutés sur un poste de travail ou un ordinateur portable Rocky Linux. @@ -100,7 +100,7 @@ Vous pouvez activer cette option si vous souhaitez utiliser IPv6 sur vos contene Would you like the Incus server to be available over the network? (yes/no) [default=no]: yes ``` -Cette opération est nécessaire pour effectuer un instantané de la station de travail. Répondez « oui » ici. +Cette opération est nécessaire pour effectuer un instantané de la station de travail. Répondez `yes` ici. ```text Address to bind Incus to (not including port) [default=all]: @@ -157,7 +157,7 @@ Pour vous assurer que `incus` a démarré et que votre utilisateur dispose des p incus list ``` -Notez que nous n'avons pas utilisé `sudo` ici. Votre utilisateur peut tout à fait exécuter ces commandes. Vous verrez quelque chose comme ceci : +Notez que nous n'avons pas utilisé `sudo` ici. Votre utilisateur peut tout à fait exécuter ces commandes. Vous devriez obtenir quelque chose de similaire à ce qui suit : ```bash +------------+---------+----------------------+------+-----------+-----------+ diff --git a/docs/gemstones/dnf-swap.de.md b/docs/gemstones/dnf-swap.de.md index 1ea54fdfce..372ca2bb9b 100644 --- a/docs/gemstones/dnf-swap.de.md +++ b/docs/gemstones/dnf-swap.de.md @@ -1,5 +1,5 @@ - - - -title: dnf - swap command author: wale soyinka contributors: date: 2023-01-24 tags: +title: title: DNF — swap-Befehl
    author: wale soyinka
    contributors: https://crowdin.com/project/rockydocs/activity-stream
    date: 2025-08-30
    tags: - cloud images - container - dnf diff --git a/docs/gemstones/dnf-swap.fr.md b/docs/gemstones/dnf-swap.fr.md index 4e19390132..cf77e04bdf 100644 --- a/docs/gemstones/dnf-swap.fr.md +++ b/docs/gemstones/dnf-swap.fr.md @@ -1,5 +1,5 @@ - - - -title: dnf - swap command author: wale soyinka contributors: date: 2023-01-24 tags: +--- title: dnf - swap command author: wale soyinka contributors: https://crowdin.com/project/rockydocs/activity-stream date: 2025-08-30 13h12 tags: dnf --- - cloud images - conteneurs - dnf diff --git a/docs/guides/cms/mediawiki.de.md b/docs/guides/cms/mediawiki.de.md index 929c8185a5..d15a28ea66 100644 --- a/docs/guides/cms/mediawiki.de.md +++ b/docs/guides/cms/mediawiki.de.md @@ -207,7 +207,7 @@ Klicken Sie auf **Continue**: Geben Sie auf der Seite **MediaWiki _Version_-Installation** Folgendes ein: -- **URL host name**: The URL you want +- **URL host name**: Die gewünschte URL - **Name of Wiki**: Der gewünschte Wiki-Name diff --git a/docs/guides/desktop/mate_installation.fr.md b/docs/guides/desktop/mate_installation.fr.md index 270d5176d7..ef542d71f6 100644 --- a/docs/guides/desktop/mate_installation.fr.md +++ b/docs/guides/desktop/mate_installation.fr.md @@ -29,13 +29,13 @@ Cette procédure vous permettra d'utiliser MATE sur Rocky Linux. ### 9: obtenir, vérifier et enregistrer la l'image live MATE - Avant l'installation, la première étape consiste à télécharger l'image live et à l'écrire sur un DVD ou une clé USB. Comme indiqué précédemment, l'image autonome sera amorçable, tout comme tout autre support d'installation pour Linux. Vous trouverez la dernière image live pour MATE dans la section `Download` pour Rocky Linux 9 [images live](https://dl.rockylinux.org/pub/rocky/9.5/live/x86_64/). Notez que ce lien particulier suppose que x86_64 est votre architecture, et au moment de la rédaction de cet article, qui est la seule architecture pour laquelle cette image d'installation autonome est disponible. Téléchargez à la fois l'image live et les fichiers de vérification correspondants. + Avant l'installation, la première étape consiste à télécharger l'image live et à l'écrire sur un DVD ou une clé USB. Comme indiqué précédemment, l'image autonome sera amorçable, tout comme tout autre support d'installation pour Linux. Vous trouverez la dernière image live pour MATE dans la section `Download` pour Rocky Linux 9 [images live](https://dl.rockylinux.org/pub/rocky/9.6/live/x86_64/). Notez que ce lien particulier suppose que x86_64 est votre architecture, et au moment de la rédaction de cet article, qui est la seule architecture pour laquelle cette image d'installation autonome est disponible. Téléchargez à la fois l'image live et les fichiers de vérification correspondants. Maintenant vérifiez l'image avec le fichier CHECKSUM en utilisant la commande suivante (notez qu'il s'agit d'un exemple ! Assurez-vous que le nom de votre image et les fichiers CHECKSUM correspondent) : ``` - sha256sum -c CHECKSUM --ignore-missing Rocky-9.5-MATE-x86_64-20221124.0.iso.CHECKSUM + sha256sum -c CHECKSUM --ignore-missing Rocky-9.6-MATE-x86_64-20250530.3.iso.CHECKSUM ``` diff --git a/docs/guides/desktop/xfce_installation.fr.md b/docs/guides/desktop/xfce_installation.fr.md index e8cd3e6df0..a02f532f92 100644 --- a/docs/guides/desktop/xfce_installation.fr.md +++ b/docs/guides/desktop/xfce_installation.fr.md @@ -24,9 +24,9 @@ C'est aussi l'un des environnements de bureau les plus faciles à combiner avec ## 9: Obtenir, vérifier et écrire l'image live XFCE - Avant l'installation, la première étape consiste à télécharger l'image live et à l'écrire sur un DVD ou une clé USB. Comme indiqué précédemment, l'image sera amorçable, tout comme avec tout autre support d'installation pour Linux. Vous pouvez trouver l'image XFCE la plus récente dans la section téléchargement pour Rocky Linux 9 [images live](https://dl.rockylinux.org/pub/rocky/9.5/live/x86_64/). Notez que ce lien particulier suppose que x86_64 est l'architecture de votre processeur. + Avant l'installation, la première étape consiste à télécharger l'image live et à l'écrire sur un DVD ou une clé USB. Comme indiqué précédemment, l'image sera amorçable, tout comme avec tout autre support d'installation pour Linux. Vous pouvez trouver l'image XFCE la plus récente dans la section téléchargement pour Rocky Linux 9 [images live](https://dl.rockylinux.org/pub/rocky/9.6/live/x86_64/). Notez que ce lien particulier suppose que x86_64 est l'architecture de votre processeur. - Au Moment de l'écriture de cet article, vous pouvez utiliser l'architecture x86_64 ou aarch64 pour cette image live. Téléchargez à la fois l'image live et les fichiers de vérification correspondants. + Au Moment de l'écriture de cet article, vous pouvez utiliser l'architecture x86_64 ou aarch64 pour cette image live. Téléchargez l'image live et les fichiers de vérification correspondants. Vérifiez l'image ISO avec le fichier CHECKSUM en utilisant la commande suivante (n'oubliez pas qu'il sagit d'un exemple ! Assurez-vous que le nom de votre image et les fichiers CHECKSUM correspondent) : @@ -43,7 +43,7 @@ C'est aussi l'un des environnements de bureau les plus faciles à combiner avec ``` - Si la somme de contrôle du fichier retourne OK, vous êtes maintenant prêt à enregistrer votre image ISO sur votre support de stockage. Cette procédure est différente selon le système que vous utilisez, le support d'enregistrement et les outils. Nous supposons ici que vous savez enregistrer l'image sur un support adéquat. + Si la somme de contrôle du fichier retourne OK, vous êtes prêt à sauvegarder l'image ISO sur votre support de stockage. Cette procédure est différente selon le système que vous utilisez, le support d'enregistrement et les outils. Nous supposons ici que vous savez enregistrer l'image sur un support adéquat. ## 9: Démarrage @@ -70,12 +70,12 @@ C'est aussi l'un des environnements de bureau les plus faciles à combiner avec ![xfce_install2](images/xfce_install_2.png) - 1. **Clavier** - Jetez un coup d'œil à cette option et assurez-vous qu'elle correspond bien à la disposition du clavier que vous utilisez. + 1. **Keyboard** - Jetez un coup d'œil à cette option et assurez-vous qu'elle correspond bien à la disposition du clavier que vous utilisez. 2. **Heure & Date** - Assurez-vous que cela correspond à votre fuseau horaire. - 3. **Destination d'installation** - Vous devrez cliquer sur cette option, même si c'est juste pour accepter ce qui est déjà indiqué. - 4. **Réseau & Nom d'Hôte** - Vérifiez que vous avez ce dont vous avez besoin ici. Tant que le réseau est activé, vous pouvez toujours modifier plus tard si vous le souhaitez. - 5. **Mot de passe root** - Allez-y et choisissez un mot de passe root. N'oubliez pas de sauvegarder ce mot de passe dans un endroit sûr (gestionnaire de mots de passe par ex.). - 6. **Création d'utilisateur** - Créez au moins un utilisateur. Si vous voulez qu'il dispose de droits d'administration, n'oubliez pas de définir cette option lors de la création de l'utilisateur. + 3. **Installation Destination** - Vous devrez cliquer sur cette option, même si c'est juste pour accepter ce qui est déjà indiqué. + 4. **Network & Host Name** - Vérifiez que vous avez ce dont vous avez besoin ici. À condition que le réseau soit activé ; vous pouvez toujours modifier plus tard si vous le souhaitez. + 5. **Root Password** - Choisissez un mot de passe `root`. N'oubliez pas de sauvegarder ce mot de passe dans un endroit sûr (gestionnaire de mots de passe par ex.). + 6. **User Creation** - Créez au moins un utilisateur. Si vous voulez qu'il dispose de droits d'administration, définissez cette option lors de la création de l'utilisateur. 7. **Begin Installation** - Après vérification, cochez cette option. Une fois que vous avez effectué l'étape 7, le processus d'installation devrait commencer à installer des paquets, comme indiqué dans la capture d'écran ci-dessous : @@ -86,7 +86,7 @@ C'est aussi l'un des environnements de bureau les plus faciles à combiner avec ![xfce_install_final](images/xfce_install_final.png) - Allez-y et cliquez sur **Terminer l'installation**. + Cliquez sur **Finish Installation**. Lorsque vous avez fait cela, il vous ramène à l'écran de l'image live. Redémarrez votre machine et retirez le support de démarrage que vous avez utilisé pour l'installation XFCE. @@ -167,7 +167,7 @@ C'est aussi l'un des environnements de bureau les plus faciles à combiner avec Dans cette section, vous devrez soit être l'utilisateur `root`, soit être en mesure d'exécuter `sudo` pour élever vos privilèges. - Lors de l'installation de Rocky Linux, nous avons utilisé les paquets suivants : + Lors de l'installation de Rocky Linux, nous avons utilisé les ensembles de paquets suivants : * Minimal * Standard @@ -194,7 +194,7 @@ C'est aussi l'un des environnements de bureau les plus faciles à combiner avec Répondez 'Y' pour l'installer. - Vous avez également besoin des Powertools et des dépôts lightdm. Activez-les ainsi : + Vous avez également besoin des Powertools et des dépôts lightdm. Continuez en les activant : ``` dnf config-manager --set-enabled powertools diff --git a/docs/guides/dns/knot_authoritative_dns.fr.md b/docs/guides/dns/knot_authoritative_dns.fr.md index 4d07de1d74..070c27b812 100644 --- a/docs/guides/dns/knot_authoritative_dns.fr.md +++ b/docs/guides/dns/knot_authoritative_dns.fr.md @@ -17,7 +17,7 @@ Une alternative à BIND, [Knot DNS](https://www.knot-dns.cz/) est un serveur DNS ## Introduction -Les serveurs DNS externes ou publics sont utilisés sur Internet pour associer les noms d'hôtes aux adresses IP et, dans le cas des enregistrements PTR (appelés "pointer" ou "reverse") pour faire correspondre l'adresse IP au nom de l'hôte. Il s'agit d'une composante essentielle d'internet. Il fait fonctionner votre serveur de messagerie, serveur web, serveur FTP ou beaucoup d'autres serveurs et services, où que vous soyez. +Les serveurs DNS externes ou publics sont utilisés sur Internet pour associer les noms d'hôtes aux adresses IP et, dans le cas des enregistrements PTR (appelés `pointer` ou `reverse`) pour faire correspondre l'adresse IP au nom de l'hôte. Il s'agit d'une composante essentielle d'internet. Il fait fonctionner votre serveur de messagerie, serveur web, serveur FTP ou beaucoup d'autres serveurs et services, où que vous soyez. ## Installation et Activation de Knot diff --git a/docs/guides/dns/private_dns_server_using_bind.fr.md b/docs/guides/dns/private_dns_server_using_bind.fr.md index ef9dc9f33a..aa2ce8b189 100644 --- a/docs/guides/dns/private_dns_server_using_bind.fr.md +++ b/docs/guides/dns/private_dns_server_using_bind.fr.md @@ -1,5 +1,5 @@ --- -title: bind - Serveur DNS privé +title: bind — Serveur DNS Privé author: Steven Spencer contributors: Ezequiel Bruni, k3ym0, Ganna Zhyrnova tested_with: 8.5, 8.6, 9.0 diff --git a/docs/guides/interoperability/import_rocky_to_wsl.de.md b/docs/guides/interoperability/import_rocky_to_wsl.de.md index b038dd4f99..7ae7e86ea5 100644 --- a/docs/guides/interoperability/import_rocky_to_wsl.de.md +++ b/docs/guides/interoperability/import_rocky_to_wsl.de.md @@ -9,11 +9,13 @@ tags: - Interoperabilität --- -# Rocky Linux nach WSL importieren +!!! note "Images für andere Versionen" + + Wenn Sie nach WSL-Anweisungen für eine andere Version von Rocky Linux suchen, wählen Sie die gewünschte Version aus dem oberen Menü aus und lesen Sie dann die WSL-Anweisungen unter „Interoperabilität“. ## Voraussetzungen -Das Windows-Subsystem für Linux muss aktiviert werden. Das ist mit einer dieser Optionen möglich: +Sie müssen die Funktion `Windows-Subsystem für Linux` aktivieren. Das ist mit einer dieser Optionen möglich: - [Eine neuere WSL-Version mit zusätzlichen Funktionen ist im Microsoft Store verfügbar](https://apps.microsoft.com/store/detail/windows-subsystem-for-linux/9P9TQF7MRM4R). Verwenden Sie nach Möglichkeit diese neuere Version. - Öffnen Sie ein administratives Terminal (entweder PowerShell oder Eingabeaufforderung) und führen Sie `wsl --install` aus ([siehe Link](https://docs.microsoft.com/en-us/windows/wsl/install)) @@ -31,8 +33,7 @@ Diese Funktion sollte derzeit in jeder unterstützten Version von Windows 10 und 1. Laden Sie das WSL-Image vom CDN oder einem anderen Mirror in Ihrer Nähe herunter: - - 9: [x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-WSL-Base.latest.x86_64.wsl) oder [aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-WSL-Base.latest.aarch64.wsl) - - 10: [x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-WSL-Base.latest.x86_64.wsl) or [aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-WSL-Base.latest.aarch64.wsl) + - 10: [x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-WSL-Base.latest.x86_64.wsl) oder [aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-WSL-Base.latest.aarch64.wsl) 2. Es gibt mehrere Optionen zum Installieren eines `.wsl`-Images: @@ -48,8 +49,6 @@ Diese Funktion sollte derzeit in jeder unterstützten Version von Windows 10 und 1. Sie benötigen den Container `rootfs`. Das ist auf mehrere Arten möglich: - Laden Sie das Image vom CDN herunter: - - 8: [Base x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-UBI.latest.aarch64.tar.xz) - - 9: [Base x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-UBI.latest.aarch64.tar.xz) - 10: [Base x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-UBI.latest.aarch64.tar.xz) - Entpacken Sie das Image aus `Docker Hub` oder `Quay.io` ([siehe Link](https://docs.microsoft.com/en-us/windows/wsl/use-custom-distro#export-the-tar-from-a-container)) @@ -83,4 +82,4 @@ Diese Funktion sollte derzeit in jeder unterstützten Version von Windows 10 und !!! tip "systemd" - Das WSL-Image ist standardmäßig systemd-fähig. Wenn Sie Container-Images verwenden oder eigene erstellen möchten, fügen Sie einfach `systemd=true` zum Abschnitt `boot` in der Datei `/etc/wsl.conf` hinzu. ([ref.](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/#set-the-systemd-flag-set-in-your-wsl-distro-settings)) + Das WSL-Image ist standardmäßig `systemd`-fähig. Wenn Sie Container-Images verwenden oder eigene erstellen möchten, fügen Sie einfach `systemd=true` zum Abschnitt `boot` in der Datei `/etc/wsl.conf` hinzu. ([ref.](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/#set-the-systemd-flag-set-in-your-wsl-distro-settings)) diff --git a/docs/guides/interoperability/import_rocky_to_wsl.fr.md b/docs/guides/interoperability/import_rocky_to_wsl.fr.md index 7344fc37a7..af20bbb29f 100644 --- a/docs/guides/interoperability/import_rocky_to_wsl.fr.md +++ b/docs/guides/interoperability/import_rocky_to_wsl.fr.md @@ -1,5 +1,5 @@ --- -title: Importer Rocky Linux vers WSL ou WSL2 +title: Importer Rocky Linux 10 vers WSL ou bien WSL2 author: Lukas Magauer tested_with: 8.10, 9.6, 10.0 tags: @@ -9,11 +9,13 @@ tags: - interopérabilité --- -# Importer Rocky Linux vers WSL +!!! note "Images pour d'autres versions" + + Si vous recherchez des instructions WSL pour une autre version de Rocky Linux, sélectionnez la version souhaitée dans le menu du haut, puis reportez-vous aux instructions WSL sous « Interopérabilité ». ## Prérequis -La fonctionnalité `Windows-Subsystem for Linux` doit être activée. Ceci est possible avec l'une de ces options : +Vous devez activer la fonctionnalité Sous-système Windows pour Linux. Ceci est possible avec l'une des options suivantes : - [Une version WSL plus récente avec des fonctionnalités supplémentaires est disponible dans Microsoft Store](https://apps.microsoft.com/store/detail/windows-subsystem-for-linux/9P9TQF7MRM4R). Utilisez la nouvelle version tant que possible. - Ouvrez un terminal d'administration (PowerShell ou invite de commande) et exécutez la commande suivante :
    `wsl --install` ([ref.](https://docs.microsoft.com/en-us/windows/wsl/install)) @@ -23,7 +25,7 @@ Cette fonctionnalité devrait être disponible sur toutes les versions actuellem !!! tip "Version WSL" - Assurez-vous que votre version WSL est à jour, car certaines fonctionnalités ont seulement été introduites dans les versions récentes. If you are unsure, run `wsl --update`. + Assurez-vous que votre version WSL est à jour, car certaines fonctionnalités ont seulement été introduites dans les versions récentes. Si vous n'êtes pas certain, vérifiez avec la commande `wsl --update`. ## Marche à suivre @@ -31,7 +33,6 @@ Cette fonctionnalité devrait être disponible sur toutes les versions actuellem 1. Téléchargez l'image WSL à partir du CDN ou d'un autre miroir à proximité : - - 9 : [x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-WSL-Base.latest.x86_64.wsl) ou [aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-WSL-Base.latest.aarch64.wsl) - 10 : [x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-WSL-Base.latest.x86_64.wsl) ou [aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-WSL-Base.latest.aarch64.wsl) 2. Il existe plusieurs options pour installer une image `.wsl` : @@ -48,8 +49,6 @@ Cette fonctionnalité devrait être disponible sur toutes les versions actuellem 1. Récupérez `rootfs` du conteneur. Cela est possible de plusieurs manières : - Téléchargez l'image depuis le CDN : - - 8: [Base x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-Container-UBI.latest.aarch64.tar.xz) - - 9: [Base x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Container-UBI.latest.aarch64.tar.xz) - 10: [Base x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-Base.latest.x86_64.tar.xz), [Minimal x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-Minimal.latest.x86_64.tar.xz), [UBI x86_64](https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-UBI.latest.x86_64.tar.xz), [Base aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-Base.latest.aarch64.tar.xz), [Minimal aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-Minimal.latest.aarch64.tar.xz), [UBI aarch64](https://dl.rockylinux.org/pub/rocky/10/images/aarch64/Rocky-10-Container-UBI.latest.aarch64.tar.xz) - Extraction de l'image à partir de `Docker Hub` ou de `Quay.io` ([ref.](https://docs.microsoft.com/en-us/windows/wsl/use-custom-distro#export-the-tar-from-a-container)) diff --git a/docs/guides/isos/iso_creation.de.md b/docs/guides/isos/iso_creation.de.md index 1c532b01f7..b1b840798d 100644 --- a/docs/guides/isos/iso_creation.de.md +++ b/docs/guides/isos/iso_creation.de.md @@ -1,7 +1,7 @@ --- title: Erstellen einer benutzerdefinierten Rocky Linux ISO author: Howard Van Der Wal -contributors: Steven Spencer +contributors: Steven Spencer, Ganna Zhyrnova tested with: 9.5 tags: - create @@ -17,8 +17,8 @@ Diese Anleitung erklärt Ihnen von Anfang bis Ende, wie Sie Ihr eigenes Rocky Li ## Voraussetzungen -- Eine 64-Bit-Maschine mit Rocky Linux 9 zum Erstellen des neuen ISO-Image. -- Ein Rocky Linux 9 DVD-ISO-Image. +- Eine 64-Bit-Maschine mit Rocky Linux 9 +- Ein Rocky Linux 9 DVD-ISO-Image - Eine `kickstart`-Datei, die auf die ISO angewendet werden soll. - Lesen Sie die Lorax-Dokumentation [Quickstart](https://weldr.io/lorax/lorax.html#quickstart) und [mkksiso](https://weldr.io/lorax/mkksiso.html), um sich mit der Erstellung der `Anaconda`-Datei `boot.iso` vertraut zu machen. @@ -118,4 +118,4 @@ mkksiso --add ~/baseos --ks example-ks.cfg ~/Rocky-9.5-x86_64-dvd.iso ~/Rocky-9. ## Zusammenfassung -Was hier besprochen wurde, sind nur einige der verfügbaren Optionen zum Optimieren und Erstellen Ihres eigenen Rocky Linux ISO. Für weitere Möglichkeiten, einschließlich der Änderung der Kernel-Befehlszeilenargumente, empfiehlt der Autor dringend, die [mkksiso](https://weldr.io/lorax/mkksiso.html)-Dokumentation genauer durchzugehen. +Der Autor teilt hier ein paar Optionen zum Optimieren und Erstellen Ihres Rocky Linux ISO. Für weitere Möglichkeiten, einschließlich der Änderung der Kernel-Befehlszeilenargumente, empfiehlt der Autor dringend, die [mkksiso](https://weldr.io/lorax/mkksiso.html)-Dokumentation genauer durchzugehen. diff --git a/docs/guides/mirror_management/add_mirror_manager.uk.md b/docs/guides/mirror_management/add_mirror_manager.uk.md index b9af844a11..838d14d58e 100644 --- a/docs/guides/mirror_management/add_mirror_manager.uk.md +++ b/docs/guides/mirror_management/add_mirror_manager.uk.md @@ -15,7 +15,7 @@ contributors: Amin Vakil, Steven Spencer, Ganna Zhyrnova На момент написання цієї статті (кінець 2022 року) вимоги до пам’яті для віддзеркалення всіх поточних і минулих випусків Rocky Linux становлять близько 2 ТБ. -Наше головне дзеркало — `rsync://msync.rockylinux.org/rocky/mirror/pub/rocky/`. Для першої синхронізації використовуйте дзеркало поблизу. Ви можете знайти всі офіційні дзеркала [тут](https://mirrors.rockylinux.org). +Наше головне дзеркало — `rsync://msync.rockylinux.org/rocky-linux`. Для першої синхронізації використовуйте дзеркало поблизу. Ви можете знайти всі офіційні дзеркала [тут](https://mirrors.rockylinux.org). Будь ласка, зверніть увагу, що ми можемо обмежити доступ до офіційного головного дзеркала офіційними публічними дзеркалами. Тому, якщо ви використовуєте приватне дзеркало, подумайте про `rsyncing` із публічного дзеркала, розташованого поблизу. Крім того, локальні дзеркала можуть швидше синхронізуватися. diff --git a/docs/index.de.md b/docs/index.de.md index 9d52e3f04f..9f37b3985e 100644 --- a/docs/index.de.md +++ b/docs/index.de.md @@ -34,7 +34,7 @@ Die Hauptbereiche der Dokumentationseite sind: Bei Rocky Linux wollen wir die Dokumentationsseite für jeden in seiner Lieblingssprache zugänglich machen — *deshalb sind Übersetzungen in verschiedenen Sprachen wesentlich*. Wenn Sie auf die Sprachauswahl (文A bzw. wén-A Icon) im oberen Menü klicken, sehen Sie die Sprachen, die zurzeit verfügbar sind: Dazu gibt es zwei Teile: 1. Lokalisierung der Webseiten-Schnittstelle: Wenn Sie eine andere Sprache wählen, zum Beispiel Français, werden Sie feststellen, dass die Schnittstelle, zum Beispiel die Navigatoren 'Weiter' und 'Vorheriger' übersetzt werden. -1. Inhalt: Das Übersetzen von Inhalten ist eine [laufende](https://crowdin.com/project/rockydocs/activity-stream) (bedeutende) [Aufgabe](https://crowdin.com/project/rockydocs). Noch nicht alle Inhalte sind in allen Sprachen übersetzt. Alle Seiten, die übersetzt wurden (in der ausgewählten Sprache) werden entsprechend dargestellt, diejenigen, die es noch nicht vollständig sind, werden in Englisch angezeigt. Wenn Sie der Community durch Übersetzungen helfen möchten, sind Sie sehr willkommen — siehe unten für weitere Details zur Vorgehensweise. +1. Inhalt: Das Übersetzen von Inhalten ist eine [laufende](https://crowdin.com/project/rockydocs/activity-stream) (https://crowdin.com/project/rockydocs/activity-stream) [Aufgabe](https://crowdin.com/project/rockydocs). Noch nicht alle Inhalte sind in allen Sprachen übersetzt. Alle Seiten, die übersetzt wurden (in der ausgewählten Sprache) werden entsprechend dargestellt, diejenigen, die es noch nicht vollständig sind, werden in Englisch angezeigt. Wenn Sie der Community durch Übersetzungen helfen möchten, sind Sie sehr willkommen — siehe unten für weitere Details zur Vorgehensweise. !!! note "Anmerkung" diff --git a/docs/index.es.md b/docs/index.es.md index c784cde406..b5f2a25b2f 100644 --- a/docs/index.es.md +++ b/docs/index.es.md @@ -34,7 +34,7 @@ Las secciones principales de la plataforma de documentación son las siguientes: En Rocky Linux queremos hacer el sitio de documentación lo más accesible posible para todas las personas. — *las traducciones a diferentes idiomas son una parte fundamental para lograr este objetivo. *. Si haces clic en el selector de idioma en el menú superior verás todos los idiomas disponibles en este momento. Hay dos partes de esto: 1. Regionalización de la interfaz del sitio web: si se elige otro idioma, observará que los botones de navegación 'Siguiente' y 'Anteriores', estarán en el idioma elegido. -1. Naturalmente la traducción de nuestro sitio es un trabajo en curso y constante. No todo el contenido actual está traducido a todos los idiomas disponibles aun. Así que todas las páginas que han sido traducidas a tu idioma de preferencia se mostrarán en dicho idioma excepto las que aun estén pendientes de traducción que, por defecto, se mostrarán en el idioma inglés. Si desea contribuir a la comunidad a través de las traducciones, al equipo de documentación le encantaría saber de usted — vea abajo para más detalles. +1. Naturalmente la traducción de nuestro sitio es un trabajo en curso y constante (https://crowdin.com/project/rockydocs/activity-stream). No todo el contenido actual está traducido a todos los idiomas disponibles aun. Así que todas las páginas que han sido traducidas a tu idioma de preferencia se mostrarán en dicho idioma excepto las que aun estén pendientes de traducción que, por defecto, se mostrarán en el idioma inglés. Si desea contribuir a la comunidad a través de las traducciones, al equipo de documentación le encantaría saber de usted — vea abajo para más detalles. !!! Observación diff --git a/docs/index.fr.md b/docs/index.fr.md index 18502a2608..c7f6b561d9 100644 --- a/docs/index.fr.md +++ b/docs/index.fr.md @@ -34,11 +34,16 @@ Les sections principales du site de documentation sont : Dans l'équipe Rocky Linux, nous voulons rendre le site de documentation accessible à autant de monde que possible — *la traduction dans différentes langues est importante pour cela*. Si vous cliquez sur le sélecteur de langue (symbole `文A`, wén-A) dans le menu supérieur, vous verrez les langues dans lesquelles le site est disponible. Il y a deux parties à cela : 1. Traduction de l'interface du site web : si vous choisissez une autre langue, par exemple le Français, vous noterez que l'interface, par exemple les boutons de navigation `Suivant` et `Précédent` seront traduits. -1. Contenu : [la traduction du contenu est une tâche](https://crowdin.com/project/rockydocs/activity-stream) (importante) [en cours](https://crowdin.com/project/rockydocs). Tout le contenu n'est pas encore traduit dans toutes les langues. Toutes les pages qui ont été traduites (dans la langue sélectionnée) seront vues dans la langue choisie, celles qui ne le sont pas encore se retrouveront dans la langue anglaise par défaut. Si vous voulez contribuer à la communauté par le biais des traductions, l'équipe de documentation sera ravie de faire votre connaissance, voir ci-dessous pour plus de détails. +1. Contenu : [la traduction du contenu est une tâche](https://crowdin.com/project/rockydocs/activity-stream) (https://crowdin.com/project/rockydocs/activity-stream) [en cours](https://crowdin.com/project/rockydocs). -!!! note "Remarque" - - Toutes les fonctionnalités peuvent ne pas être disponibles dans toutes les langues, c'est une limitation des modules MkDocs sous-jacents. +. Tout le contenu n'est pas encore traduit dans toutes les langues. Toutes les pages qui ont été traduites (dans la langue sélectionnée) seront vues dans la langue choisie, celles qui ne le sont pas encore se retrouveront dans la langue anglaise par défaut. Si vous voulez contribuer à la communauté par le biais des traductions, l'équipe de documentation sera ravie de faire votre connaissance, voir ci-dessous pour plus de détails.
  • + + !!! note "Remarque" + + Toutes les fonctionnalités peuvent ne pas être disponibles dans toutes les langues, c'est une limitation des modules MkDocs sous-jacents. + + + ### Utiliser la recherche @@ -46,12 +51,16 @@ Si vous voulez rapidement trouver des informations/documents spécifiques, le si Pour ouvrir une page parmi les résultats de recherche, cliquez simplement (ou appuyez sur mobile) sur la page désirée dans la liste affichée. + + ## Première fois Si c'est la première fois que vous visitez le site de documentation de Rocky Linux alors probablement vous êtes nouveau sur Rocky Linux et vous avez envie de l'installer ! Pas de problème, passez à la page [Installation de Rocky Linux](guides/installation.md) pour obtenir des instructions détaillées. Si vous êtes coincé et que vous avez une question, la communauté Rocky Linux est là pour vous aider. Visitez le [forum de la communauté](https://forums.rockylinux.org) et vous pourrez rechercher des solutions et poster vos propres questions à la communauté. + + ## Votre Contribution Avez-vous trouvé quelque chose de manquant ? Avez-vous trouvé une erreur ? Vous vous demandez comment créer votre propre document ou comment en corriger un ? Rappelez-vous lorsque nous avons dit que *vous* étiez la communauté Rocky Linux ? Eh bien, cela signifie que *vous* êtes important pour nous et nous voulons que vous nous rejoigniez, si vous le souhaitez, et aider à améliorer cette documentation. Si cela vous intéresse, rendez-vous sur notre [Guide de Contribution](https://github.com/rocky-linux/documentation/blob/main/README.md) pour savoir comment faire ! From d58efd0ac3dabe3e56a578ccab75c60e9bb0195a Mon Sep 17 00:00:00 2001 From: wsoyinka Date: Tue, 2 Sep 2025 13:06:41 -0400 Subject: [PATCH 131/164] rm mate, xfce and 9 and 8 installation guides from RL 10 branch --- docs/guides/8_6_installation.fr.md | 258 ----------------- docs/guides/8_6_installation.it.md | 260 ----------------- docs/guides/8_6_installation.ja.md | 258 ----------------- docs/guides/8_6_installation.ko.md | 264 ----------------- docs/guides/8_6_installation.md | 267 ----------------- docs/guides/8_6_installation.sv.md | 257 ---------------- docs/guides/8_6_installation.uk.md | 260 ----------------- docs/guides/8_6_installation.zh.md | 265 ----------------- docs/guides/9_6_installation.it.md | 304 ------------------- docs/guides/9_6_installation.md | 286 ------------------ docs/guides/9_6_installation.uk.md | 306 -------------------- docs/guides/desktop/mate_installation.es.md | 66 ----- docs/guides/desktop/mate_installation.fr.md | 211 -------------- docs/guides/desktop/mate_installation.it.md | 211 -------------- docs/guides/desktop/mate_installation.ko.md | 212 -------------- docs/guides/desktop/mate_installation.md | 202 ------------- docs/guides/desktop/mate_installation.uk.md | 211 -------------- docs/guides/desktop/xfce_installation.es.md | 113 -------- docs/guides/desktop/xfce_installation.fr.md | 289 ------------------ docs/guides/desktop/xfce_installation.it.md | 290 ------------------- docs/guides/desktop/xfce_installation.ko.md | 226 --------------- docs/guides/desktop/xfce_installation.md | 282 ------------------ docs/guides/desktop/xfce_installation.uk.md | 289 ------------------ 23 files changed, 5587 deletions(-) delete mode 100644 docs/guides/8_6_installation.fr.md delete mode 100644 docs/guides/8_6_installation.it.md delete mode 100644 docs/guides/8_6_installation.ja.md delete mode 100644 docs/guides/8_6_installation.ko.md delete mode 100644 docs/guides/8_6_installation.md delete mode 100644 docs/guides/8_6_installation.sv.md delete mode 100644 docs/guides/8_6_installation.uk.md delete mode 100644 docs/guides/8_6_installation.zh.md delete mode 100644 docs/guides/9_6_installation.it.md delete mode 100644 docs/guides/9_6_installation.md delete mode 100644 docs/guides/9_6_installation.uk.md delete mode 100644 docs/guides/desktop/mate_installation.es.md delete mode 100644 docs/guides/desktop/mate_installation.fr.md delete mode 100644 docs/guides/desktop/mate_installation.it.md delete mode 100644 docs/guides/desktop/mate_installation.ko.md delete mode 100644 docs/guides/desktop/mate_installation.md delete mode 100644 docs/guides/desktop/mate_installation.uk.md delete mode 100644 docs/guides/desktop/xfce_installation.es.md delete mode 100644 docs/guides/desktop/xfce_installation.fr.md delete mode 100644 docs/guides/desktop/xfce_installation.it.md delete mode 100644 docs/guides/desktop/xfce_installation.ko.md delete mode 100644 docs/guides/desktop/xfce_installation.md delete mode 100644 docs/guides/desktop/xfce_installation.uk.md diff --git a/docs/guides/8_6_installation.fr.md b/docs/guides/8_6_installation.fr.md deleted file mode 100644 index 7002a8f7e3..0000000000 --- a/docs/guides/8_6_installation.fr.md +++ /dev/null @@ -1,258 +0,0 @@ ---- -title: Installer Rocky Linux ---- - -# Installer Rocky Linux - -Ce guide passe en revue les étapes détaillées pour installer une version 64 bits de la distribution rocky Linux sur un système autonome. - -**** -Dans ce chapitre, nous allons effectuer une installation de type serveur à l'aide d'une image d'installation du système d'exploitation téléchargée depuis le site Web du projet Rocky. Nous allons aborder les étapes d'installation et de personnalisation dans les sections suivantes. -**** - -## Prérequis à l'installation du système d'exploitation - -Dans un premier temps, vous devez télécharger l'image ISO pour Rocky qui sera installée. - -La dernière image ISO de la version de Rocky qui sera utilisée pour cette installation peut être téléchargée ici : - -``` -https://www.rockylinux.org/download/ - -``` - -Pour télécharger l'ISO directement depuis la ligne de commande, saisir : - -``` -$ wget https://download.rockylinux.org/pub/rocky/8.4/isos/x86_64/Rocky-8.4-x86_64-minimal.iso -``` - -Les ISOs de Rocky sont nommées en suivant cette convention : - -``` -Rocky-..-.iso -``` - -Par exemple `Rocky-8.4-x86_64-minimal.iso` - -!!! Note - La page web du projet Rocky propose une liste de nombreux miroirs situés partout dans le monde. A chaque fois que cela est possible, vous devriez choisir le miroir géographiquement le plus proche de vous. La liste des miroirs officiels peut être consultée [ici](https://mirrors.rockylinux.org) - -## Vérifier l'ISO d'installation - -Si vous avez téléchargé l'ISO(s) Rocky depuis une distribution Linux existante, vous pouvez utiliser l'utilitaire `sha256sum` pour vérifier que le(s) fichier(s) téléchargés ne sont pas corrompus. Nous allons montrer un exemple de la façon de vérifier le sha256sum renvoyé par la commande `sha256sum Rocky-8.4-x86_64-minimal.iso`. - -Tout d'abord téléchargez le fichier contenant les sommes de contrôle officielles pour les ISOs disponibles. Toujours dans le répertoire contenant l'ISO de Rocky qui a été téléchargée, saisir : - -``` -wget http://download.rockylinux.org/pub/rocky/8.4/isos/x86_64/CHECKSUM -``` - -Utilisez l'utilitaire `sha256sum` pour vérifier la somme de contrôle - -``` -sha256sum -c CHECKSUM --ignore-missing Rocky-8.4-x86_64-minimal.iso -``` - -La sortie devrait contenir : - -``` -Rocky-8.4-x86_64-minimal.iso: OK -``` - -!!! Tip "Astuce" - Avant de démarrer l'installation à proprement parler, l'UEFI (Unified Extensible Firmware Interface) ou le BIOS (Basic Input/Output System) du système doit être configuré pour démarrer sur le bon média. - -## L'installation - -Démarrons le processus d'installation. - -Insérez et démarrez le média d'installation (disque optique, clef USB, etc.). - -Une fois démarré, vous verrez apparaître un écran de bienvenue. - -![Welcome screen](images/installation-F01.png) - -Si vous n'appuyez sur aucune touche, l'invite va commencer un compte à rebours, après lequel le processus d'installation va démarrer avec l'option mise en évidence `Test this media & install Rocky Linux 8`. Vous pouvez aussi appuyer sur Entrer pour démarrer le processus immédiatement. - -Une étape de vérification rapide du support aura lieu. Cette étape de vérification du support peut vous éviter de lancer une installation pour vous rendre compte à mi-chemin que le programme d'installation va s'interrompre à cause d'un mauvais support d'installation. - -Une fois la vérification du support terminée et que le support a été validé avec succès, l'installation va automatiquement passer à l'écran suivant. - -Sélectionnez dans cet écran la langue que vous voulez utiliser pour réaliser l'installation. Pour cet exemple, nous choisissons _Français (France)_. Cliquez ensuite sur le bouton Fait. - -# Résumé de l'installation - -L'écran _Résumé de l'installation_ est un espace tout en un dans lequel vous prenez les décisions importantes sur le système d'exploitation à installer. - -L'écran est divisé selon les sections suivantes : - -- _Localisation_ : Clavier, Support Langue et Heure & Date -- _Logiciel_ : Source d'installation et Sélection Logiciel -- _Système_ : Cible de l'installation et Réseau & Nom d'hôte - -Examinons maintenant chacune de ces sections pour apporter des modifications si nécessaires. - -## Localisation - -Cette section permet de personnaliser les éléments liés aux paramètres régionaux du système. Cela inclut : le clavier, le support de la langue, l'heure et la date. - -### Clavier - -Sur le système de démonstration de ce guide, nous acceptons la valeur par défaut _Français (variante)_ sans faire de changement. - -Toutefois, si vous avez besoin de faire des changements ici, depuis l'écran _Résumé de l'installation_, cliquez sur l'option Clavier pour spécifier la disposition du clavier de votre système. Vous pouvez ajouter d'autres dispositions de clavier si besoin dans l'écran suivant et spécifier leur ordre. - -Cliquez sur Fait lorsque vous avez terminé. - -### Support de la langue - -L'option Support langue de l'écran _Résumé de l'installation_ vous permet de spécifier la prise en charge de langues supplémentaires dont vous pourriez avoir besoin sur le système cible. - -Nous acceptons la valeur par défaut _Français (France)_ et n'apportons aucune modification. Cliquez sur Fait. - -### Heure & Date - -Cliquez sur l'option Heure & Date de l'écran principal _Résumé de l'installation_ pour faire apparaître un autre écran qui vous permettra de sélectionner le fuseau horaire dans lequel se trouve la machine. Faites défiler la liste des régions et des villes et sélectionnez la zone la plus proche de vous. - -En fonction de votre source d'installation, l'option _Heure du réseau_ peut être réglée sur _ON_ ou _OFF_ par défaut. Acceptez le paramètre par défaut _ON_ ; cela permet au système de régler automatiquement la bonne heure en utilisant le protocole NTP (Network Time Protocol). Cliquez sur Fait après avoir effectué les modifications. - -## Section Logiciel - -Dans la section _Logiciel_ de l'écran _Résumé de l'installation_, vous pouvez sélectionner la source d'installation ainsi que les paquets supplémentaires (applications) qui seront installés. - -### Source d'installation - -Puisque nous effectuons notre installation à l'aide d'une image Rocky 8 complète, vous remarquerez que le _Média local_ est automatiquement spécifié dans la section _Source d'installation_ de l'écran principal _Résumé de l'installation_. Nous allons accepter les valeurs par défaut. - -### Sélection Logiciel - -En cliquant sur l'option Sélection Logiciel de l'écran principal _Résumé de l'installation_, vous accédez à la section de l'installation où vous pouvez choisir les paquets logiciels qui seront installés sur le système. La zone de sélection des logiciels est divisée en deux parties : - -- _Environnement de base_ : Serveurs, Installation minimale, Système d'exploitation personnalisé -- _Logiciel supplémentaire pour l'environnement sélectionné_ : la sélection d'un environnement de base sur le côté gauche présente une variété de logiciels supplémentaires connexes qui peuvent être installés pour l'environnement donné sur le côté droit. - -Sélectionnez plutôt l'option _Installation minimale_ (Fonctionnalité de base). - -Cliquez sur Fait en haut de l’écran. - -## Section Système - -La section Système de l'écran _Résumé de l'installation_ est utilisée pour personnaliser et modifier le matériel sous-jacent du système cible. C'est ici que vous créez vos partitions ou volumes de disque dur, que vous spécifiez le système de fichiers à utiliser et que vous spécifiez la configuration du réseau. - -### Destination de l'installation - -Depuis l'écran _Résumé de l'installation_, cliquez sur l'option Destination de l'installation. Vous accédez alors à la zone de tâches correspondante. - -Vous verrez un écran affichant tous les disques candidats disponibles sur le système cible. Si vous n'avez qu'un seul disque sur le système, comme sur notre système de démonstration, vous verrez le disque répertorié sous _Disques locaux standards_ avec une case à cocher à côté. En cliquant sur l'icône du disque, vous pourrez activer ou désactiver la coche de sélection du disque. Nous voulons qu'elle soit sélectionnée/cochée ici. - -Dans la section _Configuration du stockage_, sélectionnez l'option Automatique. - -Cliquez ensuite sur Fait en haut de l'écran. - -Une fois que le programme d'installation aura déterminé que votre disque est utilisable, vous serez renvoyé à l'écran _Résumé de l'installation_. - -### Réseau et nom d'hôte - -La dernière tâche de la procédure d'installation concerne la configuration du réseau, où vous pouvez configurer ou modifier les paramètres liés au réseau pour le système. - -!!! Note - Après avoir cliqué sur l'option Réseau et nom d'hôte, tous les matériels de type interface réseau correctement détectés (tels que les cartes réseau Ethernet, sans fil, etc.) seront répertoriés dans le volet gauche de l'écran de configuration du réseau. Selon la distribution Linux et la configuration matérielle spécifique, les périphériques Ethernet sous Linux ont des noms similaires à `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3`, etc. - -Pour chaque interface, vous pouvez soit la configurer en utilisant DHCP, soit définir manuellement l'adresse IP. Si vous choisissez de la configurer manuellement, assurez-vous de disposer de toutes les informations nécessaires, telles que l'adresse IP, le masque de réseau, etc. - -En cliquant sur le bouton Réseau et nom d'hôte dans l'écran principal _Résumé de l'installation_, vous ouvrez l'écran de configuration correspondant. Vous avez entre autres la possibilité de configurer le nom d'hôte du système (le nom par défaut est `localhost.localdomain`). - -!!! Note - Vous pourrez facilement modifier ce nom plus tard, une fois le système d'exploitation installé. Pour le moment, acceptez la valeur par défaut fournie pour le nom d'hôte. - -La prochaine tâche importante de configuration concerne les interfaces réseau du système. Tout d'abord, vérifiez qu'une carte Ethernet (ou toute autre carte réseau) est répertoriée dans le volet de gauche. Cliquez sur l'un des périphériques réseau détectés dans le volet de gauche pour le sélectionner. Les propriétés configurables de la carte réseau sélectionnée apparaissent dans le volet droit de l'écran. - -!!! Note - Sur notre serveur de démonstration, nous avons quatre périphériques Ethernet (`ens3`, `ens4`, `ens5` et `ens6`), qui sont tous dans un état connecté. Le type, le nom, la quantité et l'état des périphériques réseau de votre système peuvent varier de ceux de notre système de démonstration. - -Assurez-vous que l'interrupteur du périphérique que vous souhaitez configurer est activé dans le panneau de droite. -Nous accepterons toutes les valeurs par défaut dans cette section. - -Cliquez sur Fait pour revenir à l'écran principal _Résumé de l'installation_. - -!!! Warning "Attention" - Faites attention à l'adresse IP du serveur dans cette section du programme d'installation. Si vous ne disposez pas d'un accès physique ou d'un accès facile à la console du système, cette information vous sera utile ultérieurement lorsque vous devrez vous connecter au serveur pour continuer à travailler sur celui-ci. - -## L'installation - -Une fois que vous êtes satisfait de vos choix pour les différentes tâches d'installation, l'étape suivante du processus d'installation consiste à commencer l'installation à proprement parler. - -## Section Paramètres utilisateur - -Cette section peut être utilisée pour créer un mot de passe pour le compte administrateur `root` mais également pour créer de nouveaux comptes administrateurs ou simples utilisateurs. - -### Configurer le mot de passe administrateur - -Cliquez sur le champ Mot de passe administrateur (mot de passe de `root`) sous _Paramètres utilisateur_ afin de lancer l'écran de gestion _Mot de passe administrateur_ (mot de passe `root`). Dans la zone de texte _Mot de passe administrateur_, définissez un mot de passe complexe pour l'utilisateur `root`. - -!!! Warning "Attention" - Cet utilisateur est le compte disposant du plus de droits sur le système. Par conséquent, si vous choisissez de l'utiliser ou de l'activer, il est crucial que vous protégiez ce compte avec un très bon mot de passe. - -Saisissez à nouveau le même mot de passe dans la zone de texte _Confirmer_. - -Cliquez sur Fait. - -### Création Utilisateur - -Cliquez ensuite sur l'option Création Utilisateur sous _Paramètres utilisateur_ pour lancer l'écran de gestion _Créer un utilisateur_. Cette zone de gestion vous permet de créer un compte utilisateur privilégié ou non privilégié (non administrateur) sur le système. - -!!! Info - Créer et utiliser un compte sans privilège pour les tâches quotidiennes sur un système est une bonne pratique d'administration du système. - -Nous allons créer un utilisateur ordinaire qui pourra invoquer les pouvoirs du superutilisateur (administrateur) en cas de besoin. - -Remplissez les champs de l'écran _Créer un utilisateur_ avec les informations suivantes, puis cliquez sur Fait : - -_Nom et prénom_ : -`rockstar` - -_Nom d'utilisateur_ : -`rockstar` - -_Faire de cet utilisateur un administrateur_ : -Coché - -_Exiger un mot de passe pour utiliser ce compte_ : -Coché - -_Mot de passe_ : -`04302021` - -_Confirmer le mot de passe_ : -`04302021` - - -### Démarrer l'installation - -Une fois que vous êtes satisfait de vos choix pour les différentes tâches d'installation, cliquez sur le bouton Commencer l'installation de l'écran principal _Résumé de l'installation_. L'installation commencera, et le programme d'installation affichera la progression de l'installation. - -!!! Note - Si vous avez peur après avoir cliqué sur le bouton Commencer l'installation, vous pouvez toujours faire marche arrière en toute sécurité sans perdre vos données (ou votre amour-propre). Pour quitter le programme d'installation, il suffit de réinitialiser votre système en cliquant sur le bouton Quitter, en appuyant sur la touche Ctrl + Alt + Suppr du clavier, ou en appuyant sur le bouton d'alimentation. - -Lorsque l'installation commence, différentes tâches démarrent en arrière-plan, comme le partitionnement du disque, le formatage des partitions ou des volumes LVM, la vérification et la résolution des dépendances logicielles, l'écriture du système d'exploitation sur le disque, etc. - -### Finir l'installation - -Une fois que les sous-tâches obligatoires sont terminées et que le programme d'installation a suivi son cours, un écran final _Progression de l'installation_ est affiché avec un message de fin. - -Enfin, terminez la procédure en cliquant sur le bouton Redémarrer le système. Le système redémarrera de lui-même. - -### Connexion - -Le système est maintenant configuré et prêt à être utilisé. Vous verrez l'adorable console Rocky Linux. - -![Rocky Linux Welcome Screen](images/installation-F04.png) - -Pour se connecter au système, saisissez `rockstar` au prompt de connexion et appuyer sur Entrer. - -Au prompt du mot de passe, saisissez `04302021` (le mot de passe de rockstar) et appuyer sur Entrer. - -Nous lançons la commande `whoami` après la connexion. - -![Login Screen](images/installation-F06.png) diff --git a/docs/guides/8_6_installation.it.md b/docs/guides/8_6_installation.it.md deleted file mode 100644 index ad668d0dc2..0000000000 --- a/docs/guides/8_6_installation.it.md +++ /dev/null @@ -1,260 +0,0 @@ ---- -Title: Installazione Di Rocky Linux 8 -author: wale soyinka -contributors: tianci li, Steven Spencer, Ganna Zhyrnova ---- - -# Installazione di Rocky Linux 8 - -Questa guida mostra nel dettaglio i passaggi per installare una versione a 64 bit della distribuzione Rocky Linux su un sistema stand-alone. Effettueremo un'installazione di categoria server utilizzando un'immagine di installazione del sistema operativo scaricata dal sito web del progetto Rocky Linux. Passeremo attraverso i passaggi di installazione e personalizzazione nelle sezioni seguenti. - -## Prerequisiti per Installazione SO - -Innanzitutto, è necessario scaricare la ISO da utilizzare per questa installazione di Rocky Linux. - -L'ultima immagine ISO per la versione di Rocky Linux che utilizzeremo per questa installazione può essere scaricata da qui: - - - -Per scaricare l'ISO direttamente dalla riga di comando, utilizzare il comando `wget`: - -```bash -wget https://download.rockylinux.org/pub/rocky/8.9/isos/x86_64/Rocky-8.9-x86_64-minimal.iso -``` - -Le ISO di Rocky Linux sono denominate secondo questa convenzione: - -```text -Rocky-.--.iso -``` - -Ad esempio, `Rocky-8.9-x86_64-minimal.iso` - -!!! Note - - La pagina web del progetto Rocky elenca diversi mirror, situati in tutto il mondo. Scegliete il mirror geograficamente più vicino a voi. La lista dei mirror ufficiali può essere trovata [quì](https://mirrors.rockylinux.org/mirrormanager/mirrors). - -## Verifica del file ISO dell'installazione - -Se avete scaricato le ISO di Rocky Linux su una distribuzione Linux esistente, potete usare l'utility `sha256sum` per verificare che i file scaricati non siano corrotti. Mostreremo un esempio di come verificare il file `Rocky-8.5-x86_64-minimal.iso` controllando il suo checksum. - -Per prima cosa scaricate il file che contiene le checksum ufficiali delle ISO disponibili. Mentre ci si trova ancora nella cartella che contiene la ISO di Rocky Linux scaricata, scaricare il file di checksum della ISO, digitando: - -```bash -wget https://download.rockylinux.org/pub/rocky/8.9/isos/x86_64/CHECKSUM -``` - -Utilizzare l'utilità `sha256sum` per verificare l'integrità del file ISO contro la corruzione e/o la manomissione. - -```bash -sha256sum -c CHECKSUM --ignore-missing -``` - -Questo controllerà l'integrità del file ISO scaricato in precedenza, a condizione che si trovi nella stessa directory. L'output dovrebbe mostrare: - -```text -Rocky-8.9-x86_64-minimal.iso: OK -``` - -## L'Installazione - -!!! Tip - - Prima dell'installazione, la Unified Extensible Firmware Interface (UEFI) o il Basic Input/Output System (BIOS) del sistema devono essere preconfigurati per l'avvio dal supporto corretto. - -È possibile iniziare il processo di installazione se il computer è impostato per l'avvio dal supporto che contiene il file ISO. - -Inserire e avviare il supporto di installazione (disco ottico, unità flash USB e così via). - -Una volta avviato il computer, vi verrà presentata la schermata di benvenuto di Rocky Linux 8. - -![Schermata iniziale dell'installazione di Rocky Linux](images/install_8_9_01.png) - -Se non si preme alcun tasto, il programma di installazione inizierà un conto alla rovescia, al termine del quale eseguirà automaticamente l'opzione predefinita, evidenziata: - -`Test this media & install Rocky Linux 8` - -È anche possibile premere ++enter++ in qualsiasi momento per avviare immediatamente il processo. - -Verrà eseguita una rapida fase di verifica del supporto. Questa fase di verifica dei supporti può evitare di avviare l'installazione per poi scoprire a metà strada che il programma di installazione deve interromperla a causa di un supporto di installazione difettoso. - -Dopo che la verifica del supporto è stata completata e il supporto è stato verificato come utilizzabile, il programma di installazione passa automaticamente alla schermata successiva. - -Selezionare la lingua che si desidera utilizzare per l'installazione in questa schermata. Per questa guida, abbiamo scelto l'*Inglese (Stati Uniti)*. Quindi fare clic sul pulsante ++"Continue"++. - -## Riepilogo Installazione - -La schermata _Riepilogo Installazione_ è un'area all-in-one in cui si prendono le decisioni importanti sul sistema operativo da installare. - -Lo schermo è approssimativamente diviso nelle seguenti sezioni: - -- _Localizzazione_: (Supporto linguistico, e Tempo & Data) -- _Software_: (Installazione Sorgente e Selezione Software) -- _Sistema_: (Destinazione installazione e Rete & Nome Host) - -Ci soffermeremo su ciascuna di queste sezioni e apporteremo modifiche ove necessario. - -### Sezione Localizzazione - -Questa sezione è utilizzata per personalizzare le voci relative al locale del sistema. Tra questi: tastiera, supporto della lingua, ora e data. - -#### Tastiera - -Nel nostro sistema demo di questa guida, accettiamo il valore predefinito (*English US*) e non apportiamo alcuna modifica. - -Tuttavia, se è necessario apportare modifiche, dalla schermata *Installation Summary*, fare clic sull'opzione ++"Keyboard"++ per specificare il layout della tastiera del sistema. Se necessario, nella schermata successiva è possibile aggiungere altri layout di tastiera e specificarne l'ordine. - -Fare clic su ++"done "++ al termine di questa schermata. - -#### Supporto Lingue - -L'opzione ++"Supporto lingua"++ della schermata *Riepilogo installazione* consente di specificare il supporto per ulteriori lingue che potrebbero essere necessarie sul sistema finito. - -Accetteremo il valore predefinito (**Inglese - Stati Uniti**) e non apporteremo alcuna modifica, facendo clic su ++"done"++. - -#### Data & Ora - -Fare clic sull'opzione ++"Time & Date"++ nella schermata principale *Installation Summary* per visualizzare un'altra schermata che consente di selezionare il fuso orario in cui si trova la macchina. Scorri l'elenco delle regioni e delle città e seleziona l'area più vicina a te. - -A seconda della fonte di installazione, l'opzione *Ora di rete* può essere impostata di default su *ON* o *OFF*. Accettare l'impostazione predefinita *ON*; ciò consente al sistema di impostare automaticamente l'ora corretta utilizzando il Network Time Protocol (NTP). Fare clic su ++“done ”++ dopo aver apportato le modifiche. - -### Sezione Software - -Nella sezione *Software* della schermata *Riepilogo installazione*, è possibile selezionare l'origine dell'installazione e i pacchetti aggiuntivi (applicazioni) che vengono installati. - -#### Sorgente Installazione - -Poiché stiamo eseguendo l'installazione utilizzando un'immagine completa di Rocky 8, noterete che il *supporto locale* è specificato automaticamente nella sezione Origine dell'installazione della schermata principale di *riepilogo dell'installazione*. Accetteremo le impostazioni predefinite. - -!!! Tip - - Nell'area Origine dell'installazione si può scegliere di eseguire un'installazione basata sulla rete. Per un'installazione basata sulla rete, è necessario innanzitutto assicurarsi che una scheda di rete sul sistema di destinazione sia configurata correttamente e possa raggiungere Internet. Per eseguire un'installazione basata sulla rete, clicca su `Installation Source` e quindi seleziona il pulsante radio `On the network`. Una volta selezionato, scegli il protocollo `https` e digita il seguente URL nel campo di testo `download.rockylinux.org/pub/rocky/8/BaseOS/x86_64/os`. Clicca su `Done`. - -#### Selezione Software - -Facendo clic sull'opzione ++"Selezione software "++ nella schermata principale di *riepilogo dell'installazione*, si accede alla sezione dell'installazione in cui è possibile scegliere i pacchetti software esatti da installare sul sistema. L'area di selezione del software è suddivisa in: - -- _Base Environment_: Server, Installazione minima, Sistema operativo personalizzato -- _Additional software for Selected Environment area_: Selezionando un Base Environment sul lato sinistro si presenta una varietà di software aggiuntivi correlati che possono essere installati per l'ambiente specificato sul lato destro. - -Selezionare invece l'opzione *Installazione minima* (funzionalità di base). - -Fare clic ++"done"++ in alto sullo schermo. - -### Sezione Sistema - -La sezione Sistema della schermata *Riepilogo installazione* viene utilizzata per personalizzare e apportare modifiche all'hardware sottostante del sistema di destinazione. Qui si creano le partizioni o i volumi del disco rigido, si specifica il file system da utilizzare e la configurazione di rete. - -#### Destinazione Installazione - -Dalla schermata *Riepilogo installazione*, fare clic sull'opzione `Destinazione installazione`. Si accede così all'area operativa corrispondente. - -Verrà visualizzata una schermata con tutte le unità disco candidate disponibili sul sistema di destinazione. Se nel sistema è presente una sola unità disco, come nel nostro sistema campione, l'unità viene elencata sotto *Dischi standard locali* con un segno di spunta accanto. Facendo clic sull'icona del disco si attiva o disattiva il segno di spunta della selezione del disco. Vogliamo che sia selezionato/spuntato qui. - -Nella sezione Opzioni di *Configurazione dell'archiviazione*, selezionare il pulsante di opzione ++"Automatic"++. - -Quindi fare clic su ++“done”++ nella parte superiore dello schermo. - -Una volta che il programma di installazione ha stabilito che il disco è utilizzabile, si torna alla schermata di *Riepilogo Installazione*. - -### Rete & Nome Host - -L'ultima operazione della procedura di installazione riguarda la configurazione di rete, dove è possibile configurare o modificare le impostazioni relative alla rete del sistema. - -!!! Note - - Dopo aver fatto clic sull'opzione ++"Network & Hostname"++ , tutti i componenti dell'interfaccia di rete correttamente rilevati (come schede di rete Ethernet, wireless e così via) saranno elencati nel riquadro sinistro della schermata di configurazione della rete. A seconda della distribuzione Linux e della specifica configurazione hardware, i dispositivi Ethernet in Linux hanno nomi simili a `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3` e così via. - -È possibile configurare ogni interfaccia tramite DHCP o impostare manualmente l'indirizzo IP. Se si sceglie di configurare manualmente, assicurarsi di avere pronte tutte le informazioni pertinenti, come l'indirizzo IP, la netmask e così via. - -Facendo clic sul pulsante ++“Network & Hostname”++ nella schermata principale *Installation Summary* si apre la schermata di configurazione corrispondente. Tra le altre cose, è possibile configurare l'hostname del sistema (il nome predefinito è `localhost.localdomain`). - -!!! Note - - È possibile modificare facilmente questo nome in un secondo momento, dopo l'installazione del sistema operativo. Per il momento, accettare il valore predefinito fornito per il nome dell'host. - -La prossima importante operazione di configurazione riguarda le interfacce di rete del sistema. Innanzitutto, verificare che una scheda Ethernet (o qualsiasi altra scheda di rete) sia elencata nel riquadro di sinistra. Fare clic su uno qualsiasi dei dispositivi di rete rilevati nel riquadro di sinistra per selezionarlo. Le proprietà configurabili dell'adattatore di rete selezionato appariranno nel riquadro destro della schermata. - -!!! Note - - Sul nostro sistema di esempio, abbiamo due dispositivi Ethernet (`ens3` e `ens4`), entrambi in stato connesso. Il tipo, il nome, la quantità e lo stato dei dispositivi di rete del vostro sistema possono variare rispetto a quelli del nostro sistema campione. - -Assicurarsi che l'interruttore del dispositivo che si desidera configurare sia posizionato su `ON` nel riquadro di destra. In questa sezione verranno accettate tutte le impostazioni predefinite. - -Fare clic su ++“done”++ per tornare alla schermata principale Installation summary. - -!!! warning "Attenzione" - - Prestare attenzione all'indirizzo IP del server in questa sezione del programma di installazione. Se non si dispone di un accesso fisico o facile alla console del sistema, queste informazioni saranno utili in seguito quando è necessario connettersi al server per continuare a lavorare. - -## Fase di Installazione - -Una volta soddisfatti delle scelte effettuate per le varie attività di installazione, la fase successiva del processo di installazione darà inizio all'installazione vera e propria. - -### Sezione Impostazioni Utente - -Questa sezione può essere utilizzata per creare una password per l'account utente `root` e anche per creare nuovi account amministrativi o non amministrativi. - -### Impostare la password di root - -Fare clic sul campo *Password di root* in *Impostazioni utente* per avviare la schermata dell'attività *Password di root*. Nella casella di testo *Password di root*, impostare una password forte per l'utente root. - -!!! warning "Attenzione" - - Il superutente root è l'account più privilegiato del sistema. Pertanto, se si sceglie di utilizzarlo o di abilitarlo, è fondamentale proteggere questo account con una password forte. - -Immettere nuovamente la stessa password nella casella di testo *Conferma*. - -Fare clic su ++"done"++ - -### Creare un account utente - -Fare quindi clic sul campo *Creazione utente* in *Impostazioni utente* per avviare la schermata dell'attività *Crea utente*. Quest'area operativa consente di creare un account utente privilegiato o non privilegiato (non amministrativo) sul sistema. - -!!! Info - - La creazione e l'uso di un account non privilegiato per le attività quotidiane di un sistema è una buona pratica di amministrazione del sistema. - -Creeremo un utente normale che può invocare i poteri di superutente (amministratore), come l'utente root, quando necessario. - -Completare i campi della schermata *Create User* con le seguenti informazioni e fare clic su ++“done”++: - -*Nome completo*: `rockstar` - -*Nome utente*: `rockstar` - -_Imposta questo utente come amministratore_: Spuntato - -*Richiedi una password per utilizzare questo account*: Spuntato - -*Password*: `04302021` - -*Confermare password*: `04302021` - -### Avviare l'installazione - -Una volta soddisfatti delle scelte effettuate per le varie attività di installazione, fare clic sul pulsante Inizia l'installazione nella schermata principale di *Riepilogo Installazione*. L'installazione avrà inizio e il programma di installazione mostrerà l'avanzamento dell'installazione. Quando inizia l'installazione, iniziano ad essere eseguite varie attività in background, come il partizionamento del disco, la formattazione delle partizioni o dei volumi LVM, la verifica e la risoluzione delle dipendenze software, la scrittura del sistema operativo sul disco e così via. - -!!! Note - - Se non si desidera continuare dopo aver fatto clic sul pulsante Inizia l'installazione, si può comunque uscire dall'installazione senza perdere i dati. Per uscire dal programma di installazione, è sufficiente resettare il sistema facendo clic sul pulsante Esci, premendo ctrl-alt-del sulla tastiera o premendo l'interruttore di reset o di alimentazione. - -### Completare l'installazione - -Dopo aver completato tutte le operazioni secondarie obbligatorie e dopo che il programma di installazione ha fatto il suo corso, verrà presentata una schermata finale di avanzamento dell'installazione con un messaggio di completato. - -Infine, completare l'intera procedura facendo clic sul pulsante ++“Reboot System”++. Il sistema verrà riavviato. - -### Accesso - -Il sistema è ora impostato e pronto per l'uso. Verrà visualizzata la console Rocky Linux. - -![Schermata di benvenuto di Rocky Linux](images/installation_8_F02.png) - -Per accedere al sistema, digitare `rockstar` al prompt di login e premere ++enter++. - -Al prompt della password, digitare `04302021` (la passwrod di rockstar) e premere ++enter++ (la password non verrà riportata sullo schermo, è normale). - -Dopo il login verrà eseguito il comando `whoami`, che mostra il nome dell'utente attualmente connesso. - -![Schermata di accesso](images/installation-F06.png) diff --git a/docs/guides/8_6_installation.ja.md b/docs/guides/8_6_installation.ja.md deleted file mode 100644 index 758b42ea66..0000000000 --- a/docs/guides/8_6_installation.ja.md +++ /dev/null @@ -1,258 +0,0 @@ ---- -title: Rocky Linuxのインストール ---- - -# Rocky Linuxのインストール - -このガイドでは、64ビット版のrocky Linux ディストリビューションをスタンドアロンシステムにインストールするための詳細な手順を説明しています。 - -**** - -この章では、rockyプロジェクトのウェブサイトからダウンロードしたオペレーティングシステムのインストーライメージを使って、サーバークラスのインストールを行います。次のセクションでは、インストールとカスタマイズの手順を説明します。 - -**** - -## OSインストールの前提条件 - -まず、これからインストールするRockyのISOをダウンロードする必要があります。 - -今回のインストールで使用するRockyのバージョンの最新のISOイメージは、こちらからダウンロードできます。 - -``` -https://www.rockylinux.org/download/ -``` - -コマンドラインから直接ISOをダウンロードするには、次のように入力します。 - -``` -$ wget https://download.rockylinux.org/pub/rocky/8.4/isos/x86_64/Rocky-8.4-x86_64-minimal.iso -``` - -Rocky ISOは、この慣例に従って命名されています。 - -``` -Rocky-..-.iso -``` - -例 `Rocky-8.4-x86_64-minimal.iso` - -!!! Note - ロッキープロジェクトのWebページには、世界中にあるいくつかのミラーのリストがあります。可能な限り、地理的に最も近いミラーを選択してください。公式ミラーのリストは [ここ](https://mirrors.rockylinux.org/mirrormanager/mirrors)にあります。 - -## インストーラISOの検証 - -既存の Linux ディストリビューションで Rocky の ISO をダウンロードした場合、`sha256sum` ユーティリティーを使って、ダウンロードしたファイルが壊れていないかどうかを確認することができます。ここでは、`Rocky-8.4-x86_64-minimal.iso`のsha256sumを検証する例を紹介します。 - -まず、利用可能なISOの公式チェックサムを含んだファイルをダウンロードします。ダウンロードしたロッキーのISOが入っているフォルダに入ったまま、次のように入力します。 - -``` -wget http://download.rockylinux.org/pub/rocky/8.4/isos/x86_64/CHECKSUM -``` - -`sha256sum` ユーティリティーを使って、次のように検証します。 - -``` -sha256sum -c CHECKSUM --ignore-missing Rocky-8.4-x86_64-minimal.iso -``` - -出力には以下が含まれるはずです。 - -``` -Rocky-8.4-x86_64-minimal.iso: OK -``` - -!!! Tip - インストールを開始する前に、システムのUEFI(Unified Extensible Firmware Interface)またはBIOS(Basic Input/Output System)が正しいメディアから起動するようにあらかじめ設定しておく必要があります。 - -## インストール - -それでは早速、インストールを始めましょう。 - -インストールメディア(光ディスク、USBメモリーなど)を挿入して起動します。 - -起動すると、歓迎のスプラッシュ画面が表示されます。 - -![Rocky Linuxインストール用スプラッシュスクリーン](images/installation-F01.png) - -何もキーを押さないでいると、プロンプトがカウントダウンを始め、その後、ハイライトされた`Test this media & install Rocky Linux 8` ... オプションを起動することにより、インストールプロセスが開始されます。enterを押してすぐにプロセスを開始することもできます。 - -簡単なメディア検証ステップが行われます。このメディア検証ステップは、インストールを開始したものの、途中でインストールメディアが悪いためにインストーラーが中断することに気づくというトラブルを防ぐことができます。 - -メディアチェックが完了し、メディアが正常に使用できることが確認されると、インストーラーは自動的に次の画面に進みます。 - -この画面では、インストールを行う際に使用する言語を選択します。この例では、_English (United States)_ を選択します。そして、Continueボタンをクリックします。 - -## インストールサマリー - -_Installation Summary_ 画面は、インストールするOSに関する重要な決定を行うためのオールインワンエリアです。 - -この画面は大まかに以下のセクションに分かれています。 - -- _Localization_: (キーボード、言語サポート、時間と日付) -- _Software_: (インストールソースとソフトウェアの選択) -- _System_: (インストール先、ネットワークとホスト名) - -次にそれぞれのセクションを掘り下げ、必要に応じて変更を加えていきます。 - -## ローカライズセクション - -このセクションでは、システムのロケールに関連する項目をカスタマイズします。ここでは、キーボード、言語サポート、時刻と日付などを設定します。 - -### キーボード - -本ガイドのデモシステムでは、デフォルトの値(_English US_)を受け入れ、変更は行いません。 - -しかし、ここに変更を加える必要がある場合は、_Installation Summary_ 画面でKeyboardオプションをクリックし、システムのキーボードレイアウトを指定します。次の画面で必要に応じてキーボードレイアウトを追加し、その順番を指定することができます。 - -完了したら Done をクリックします。 - -### 言語サポート - -_Installation Summary_ 画面のLanguage Supportオプションでは、完成したシステムで必要となる追加の言語のサポートを指定することができます。 - -ここでは、デフォルトの値(__English - United States__)を受け入れ、変更しません。Doneをクリックします。 - -### 時刻と日付 - -メインの _Installation Summary_ 画面で Time & Date オプションをクリックすると、マシンが設置されているタイムゾーンを選択するための別画面が表示されます。地域や都市のリストをスクロールして、最も近い地域を選択してください。 - -インストール元によっては、_Network Time_ オプションがデフォルトで_ON_または_OFF_に設定されている場合があります。これにより、NTP(Network Time Protocol)を使ってシステムが自動的に正しい時刻を設定します。変更したらDoneをクリックします。 - -## ソフトウェアセクション - -インストールの概要」画面の「ソフトウェア」セクションでは、インストール元のほか、追加でインストールされるパッケージ(アプリケーション)を選択できます。 - -### インストールソース - -ここではロッキー8のフルイメージを使ってインストールするので、メインの _Installation Summary_ 画面のInstall Sourceセクションでは、 _Local Media_ が自動的に指定されていることに気づきます。ここでは、あらかじめ設定されているデフォルト値を使用します。 - -### ソフトウェアの選択 - -メインの _Installation Summary_ 画面で Software Selection オプションをクリックすると、システムにインストールされるソフトウェアパッケージを選択できるセクションが表示されます。ソフトウェアの選択エリアは以下のように分かれています。 - -- _基本環境_:サーバー、最小インストール、カスタムOS -- _Additional software for Selected Environment area_ : 左側のBase Environmentを選択すると、右側にその環境にインストール可能な様々な関連追加ソフトウェアが表示されます。 - -_Minimal Install_(基本機能)を選択します。 - -画面上部のDoneをクリックします。 - -##システムセクション - -インストールの概要」画面の「システム」セクションは、ターゲットシステムの基本的なハードウェアをカスタマイズしたり、変更したりするために使用します。ここでは、ハードドライブのパーティションやボリュームの作成、使用するファイルシステムの 指定、ネットワーク構成の指定などを行います。 - -### インストール先 - -インストールの概要」画面で、インストール先のオプションをクリックします。これにより、対応するタスクエリアに移動します。 - -インストール先の候補となるディスクドライブが表示されます。今回のサンプルシステムのように、システム上にディスクドライブが1つしかない場合は、「Local Standard Disks」の下にドライブが表示され、その横にチェックマークが付いています。ディスクのアイコンをクリックすると、ディスク選択のチェックマークのオン/オフが切り替わります。ここではチェックを入れておきましょう。 - -_Storage Configuration_ Options "セクションで、Automaticラジオボタンを選択します。 - -そして、画面上部のDoneをクリックします。 - -インストーラが使用可能なディスクがあると判断すると、_Installation Summary_ 画面に戻ります。 - -### ネットワークとホスト名 - -インストール手順の最後のタスクであるネットワーク設定では、システムのネットワーク関連の設定や調整を行います。 - -!!! Note - ネットワークとホスト名オプションをクリックすると、正しく検出されたすべてのネットワークインターフェースハードウェア(イーサネットやワイヤレスネットワークカードなど)が、ネットワーク設定画面の左ペインに一覧表示されます。Linux ディストリビューションやハードウェアの設定によって、Linux のイーサネットデバイスは、`eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3` などのような名前になります。 - -各インターフェイスには、DHCPを使って設定するか、手動でIPアドレスを設定することができます。手動で設定する場合は、IPアドレスやネットマスクなどの関連情報をすべて用意しておいてください。 - -メインの _Installation Summary_ 画面でNetwork & Hostnameボタンをクリックすると、対応する設定画面が表示されます。とりわけ、システムのホスト名を設定するオプションがあります(名前のデフォルトは `localhost.localdomain` です)。 - -!!! Note - この名前は、OSがインストールされた後で簡単に変更することができます。現時点では、ホスト名に与えられたデフォルト値を受け入れてください。 - -次の重要な設定作業は、システムのネットワークインターフェースに関するものです。まず、左側のペインにイーサネットカード(または任意のネットワークカード)が表示されていることを確認します。左ペインで検出されたネットワークデバイスのいずれかをクリックして選択します。選択したネットワークアダプターの設定可能なプロパティが画面の右ペインに表示されます。 - -!!! Note - サンプルサーバーには、4つのイーサネットデバイス(`ens3`, `ens4`, `ens5`, `ens6`)があり、いずれも接続状態になっています。お使いのシステムのネットワークデバイスの種類、名前、数量、状態は、今回のサンプルシステムのものとは異なる可能性があります。 - -設定したいデバイスのスイッチが右ペインで「ON」の位置に反転していることを確認してください。 -このセクションでは、すべてのデフォルトを受け入れます。 - -Doneをクリックすると、_Installation Summary_ のメイン画面に戻ります。 - -!!! Warning - このインストーラーのこのセクションでは、サーバーのIPアドレスに注意してください。システムに物理的または簡単なコンソールアクセスがない場合、この情報は後でサーバーに接続して作業を続ける必要があるときに便利です。 - -## インストール - -様々なインストール作業の選択に満足したら、次の段階では、インストールが適切に開始されます。 - -## ユーザー設定セクション - -このセクションでは、`root` ユーザーアカウントのパスワードを作成したり、管理者や非管理者のアカウントを新たに作成する際に使用します。 - -### ルートパスワードの設定 - -ユーザー設定の _Root Password_ フィールドをクリックして、_Root Password_ タスク画面を起動します。_Root Password_ のテキストボックスに、ルートユーザーの強力なパスワードを設定します。 - -!!! Warning - このユーザーは、システム上で最も権限のあるアカウントです。そのため、使用する場合、または有効にする場合には、このアカウントを非常に優れたパスワードで保護することが重要です。 - -_Confirm_ のテキストボックスに同じパスワードを再度入力します。 - -Doneをクリックします。 - -### ユーザーアカウントの作成 - -次に、_User Settings_ の _User Creation_ フィールドをクリックすると、 _Create User_ タスク画面が起動します。このタスクエリアでは、システム上に特権的または非特権的(非管理者)なユーザーアカウントを作成することができます。 - -!!! Info - システム上の日常的な作業のために非特権アカウントを作成して使用することは、システム管理の良い習慣です。 - -ここでは、必要に応じてスーパーユーザー(管理者)の権限を呼び出せる一般ユーザーを作成します。 - -_Create User_ 画面のフィールドに以下の情報を入力し、Doneをクリックしてください。 - -_Full name_: -`rockstar` - -_Username_: -`rockstar` - -_Make this user administrator_: -Checked - -_Require a password to use this account_: -Checked - -_Password_: -`04302021` - -_Confirm password_: -`04302021` - -### インストールの開始 - -さまざまなインストール作業の選択に問題がなければ、メインの _Installation Summary_ 画面で Begin Installation ボタンをクリックしてください。インストールが開始され、インストーラーにインストールの進捗状況が表示されます。 - -!!! Note - 「Begin Installation」ボタンをクリックした後に怖気づいてしまった場合でも、データ(または自尊心)を失うことなく、安全にインストールを中止することができます。インストーラを終了するには、Quit ボタンをクリックするか、キーボードの ctrl-alt-del を押すか、リセットスイッチや電源スイッチを押すかして、システムをリセットしてください。 - -インストールが始まると、ディスクのパーティション分割、パーティションや LVM ボリュームのフォーマット、ソフトウェアの依存関係の確認と解決、ディスクへのオペレーティングシステムの書き込みなど、さまざまなタスクがバックグラウンドで実行されます。 - -### インストールの完了 - -必須のサブタスクのいずれかを完了し、インストーラーが一巡すると、完了メッセージを含む最終的なインストールの進行画面が表示されます。 - -最後に、Reboot Systemボタンをクリックして、すべての手順を完了します。システムの再起動が行われます。 - -### ログイン - -これでシステムの設定が完了し、使用できるようになりました。可愛らしいRocky Linuxのコンソールが表示されます。 - -![Rocky Linux Welcome Screen](images/installation-F04.png) - -システムにログインするには、ログインプロンプトで`rockstar`と入力し、enterを押します。 - -Passwordプロンプトで、`04302021`(rockstarのパスワード)と入力し、enterを押します(画面には何も表示されませんが、これは正常です)。 - -ログイン後に`whoami`コマンドを実行します。 - -![ログイン画面](images/installation-F06.png) diff --git a/docs/guides/8_6_installation.ko.md b/docs/guides/8_6_installation.ko.md deleted file mode 100644 index 6707109e87..0000000000 --- a/docs/guides/8_6_installation.ko.md +++ /dev/null @@ -1,264 +0,0 @@ ---- -Title: Rocky Linux 8 설치 -author: wale soyinka -contributors: tianci li, Steven Spencer ---- - -# Rocky Linux 8 설치 - -이 안내서는 독립 시스템에 Rocky Linux 배포판의 64비트 버전을 설치하는 상세한 단계를 안내합니다. Rocky Linux 프로젝트 웹사이트에서 다운로드한 운영 체제 설치 이미지를 사용하여 서버 클래스 설치를 진행할 것입니다. 다음 섹션에서 설치 및 사용자 정의 단계를 따라 진행합니다. - - -## OS 설치 사전 준비 - -먼저, Rocky Linux 설치에 사용할 ISO를 다운로드해야 합니다. - -이 설치에 사용할 Rocky Linux 버전의 최신 ISO 이미지는 다음에서 다운로드할 수 있습니다: - -``` -https://www.rockylinux.org/download/ -``` - -명령 줄에서 직접 ISO를 다운로드하려면 `wget` 명령을 사용하세요: - -``` -wget https://download.rockylinux.org/pub/rocky/8.7/isos/x86_64/Rocky-8.7-x86_64-minimal.iso -``` - -Rocky Linux ISO는 다음과 같은 규칙으로 명명됩니다: - -``` -Rocky-.--.iso -``` - -예를 들어, `Rocky-8.7-x86_64-minimal.iso` 입니다. - -!!! note "참고 사항" - - Rocky 프로젝트 웹 페이지에는 전 세계에 위치한 여러 미러 목록이 있습니다. 가능하면 지리적으로 가장 가까운 미러를 선택해야 합니다. 공식 미러 목록은 [여기](https://mirrors.rockylinux.org/mirrormanager/mirrors)에서 찾을 수 있습니다. - -## 설치 프로그램 ISO 파일 확인 - -이미 기존 Linux 배포판에서 Rocky Linux ISO를 다운로드했다면 `sha256sum` 유틸리티를 사용하여 다운로드한 파일이 손상되지 않았는지 확인할 수 있습니다. `Rocky-8.5-x86_64-minimal.iso` 파일의 체크섬을 확인하는 예를 보여드리겠습니다. - -먼저, 사용 가능한 ISO의 공식 체크섬이 들어있는 파일을 다운로드하세요. 다운로드한 Rocky Linux ISO가 포함된 폴더에 있는 동안 ISO의 체크섬 파일을 다운로드하고 다음을 입력합니다. - -``` -wget https://download.rockylinux.org/pub/rocky/8.7/isos/x86_64/CHECKSUM -``` - -`sha256sum` 유틸리티를 사용하여 ISO 파일의 무결성을 확인하세요. - -``` -sha256sum -c CHECKSUM --ignore-missing -``` - -동일한 디렉토리에 있는 경우 이전에 다운로드한 ISO 파일의 무결성을 검사합니다. 출력은 다음과 같아야 합니다: - -``` -Rocky-8.7-x86_64-minimal.iso: OK -``` - -## 설치 - -!!! !!! - - 설치를 시작하기 전에 시스템의 통합 가능한 확장 펌웨어 인터페이스(Unified Extensible Firmware Interface, UEFI) 또는 베이직 인풋/아웃풋 시스템(Basic Input/Output System, BIOS)을 올바른 미디어로 부팅하도록 사전 설정해야 합니다. - -컴퓨터가 ISO 파일을 가진 미디어로 부팅하도록 설정되어 있다면 설치 프로세스를 시작할 수 있습니다. - -설치 매체(광학 디스크, USB 플래시 드라이브 등)를 삽입하고 부팅하세요. - -컴퓨터가 부팅되면 Rocky Linux 8 환영 화면이 표시됩니다. - -![Rocky Linux 설치 시작 화면](images/installation_8.5_F01.png) - -아무 키도 누르지 않으면 설치 프로그램은 카운트다운을 시작하고 그 이후에 설치 프로세스가 자동으로 기본으로 선택된 옵션을 실행합니다: - -`Test this media & install Rocky Linux 8` - -즉시 프로세스를 시작하려면 언제든지 Enter를 누르면 됩니다. - -빠른 미디어 검증 단계가 진행됩니다. 이 미디어 검증 단계를 통해 설치 미디어의 문제로 인해 설치 프로세스를 중간에 중단해야 하는 번거로움을 피할 수 있습니다. - -미디어 확인이 완료되고 미디어가 사용 가능하다는 것이 성공적으로 확인되면 설치 프로그램은 자동으로 다음 화면으로 진행합니다. - -이 화면에서 설치를 수행할 언어를 선택하세요. 이 가이드에서는 *English (United States)*를 선택합니다. 그런 다음 Continue 버튼을 클릭하세요. - -## 설치 요약 - -*설치 요약* 화면은 설치할 운영 체제에 대한 중요한 결정을 내리는 모든 옵션이 통합된 영역입니다. - -이 화면은 대략적으로 다음 섹션으로 나누어집니다: - -- *Localization*: (키보드, 언어 지원, 시간 & 날짜) -- *Software*: (설치 원본 및 소프트웨어 선택) -- *System*: (설치 대상 및 네트워크 & 호스트 이름) - -다음 각 섹션에 대해 자세히 알아보고 필요한 경우 변경합니다. - -### 로컬화 섹션 - -이 섹션은 시스템의 로케일과 관련된 항목을 사용자 정의하는 데 사용됩니다. 이는 키보드, 언어 지원, 시간 및 날짜를 포함합니다. - -#### 키보드 - -이 가이드의 데모 시스템에서는 기본값인 *English US*을 사용하고 변경하지 않습니다. - -그러나 여기에서 변경 사항을 가할 경우, *설치 요약* 화면에서 Keyboard 옵션을 클릭하여 시스템의 키보드 레이아웃을 지정할 수 있습니다. 필요한 경우 추가적인 키보드 레이아웃을 추가하고 순서를 지정할 수도 있습니다. - -이 화면을 완료하면 Done 버튼을 클릭합니다. - -#### 언어 지원 - -*설치 요약* 화면의 언어 지원 옵션을 사용하면 완료된 시스템에 필요한 추가 언어 지원을 지정할 수 있습니다. - -기본값인 "**English – United States**을 그대로 사용하고 변경하지 않고 Done를 클릭합니다. - -#### 시간 & 날짜 - -*설치 요약* 화면에서 Time & Date 옵션을 클릭하여 기계가 위치한 시간대를 선택할 수 있는 다른 화면을 표시합니다. 지역 및 도시 목록을 스크롤하여 가장 가까운 지역을 선택합니다. - -설치 소스에 따라 *네트워크 시간* 옵션이 기본적으로 *ON* 또는 *OFF*로 설정될 수 있습니다. 기본값인 *ON* 설정을 그대로 사용합니다. 이렇게 하면 시스템이 네트워크 시간 프로토콜(NTP)을 사용하여 올바른 시간을 자동으로 설정합니다. 변경 사항을 저장한 후 Done를 클릭합니다. - -### 소프트웨어 섹션 - -*설치 요약* 화면의 *소프트웨어* 섹션에서 설치할 추가 패키지(애플리케이션)와 설치 소스를 선택할 수 있습니다. - -#### 설치 소스 - -Rocky 8 이미지를 사용하여 설치하는 경우, *설치 요약* 화면의 설치 원본 섹션에는 자동으로 *로컬 미디어*가 지정됩니다. 우리는 미리 설정된 기본값을 사용합니다. - -!!! !!! - - 설치 원본 영역은 네트워크 기반 설치를 수행할 수 있는 옵션입니다. 네트워크 기반 설치를 수행하려면 대상 시스템의 네트워크 어댑터가 올바르게 구성되어 인터넷에 연결되어 있는지 확인해야 합니다. 네트워크 기반 설치를 수행하려면 `Installation Source`을 클릭한 후 `On the network` 라디오 버튼을 선택합니다. 선택한 후에는 `https`를 프로토콜로 선택하고 텍스트 필드에 다음 URL을 입력하면 됩니다: `download.rockylinux.org/pub/rocky/8/BaseOS/x86_64/os`. 그런 다음 `Done`를 클릭합니다. - -#### 소프트웨어 선택 - -*설치 요약* 화면에서 소프트웨어 선택 옵션을 클릭하면 시스템에 설치되는 정확한 소프트웨어 패키지를 선택할 수 있는 설치 섹션으로 이동합니다. 소프트웨어 선택 영역은 다음과 같이 나누어집니다: - -- *기본 환경* : 서버, 최소 설치, 사용자 정의 운영 체제 -- *선택한 환경에 대한 추가 소프트웨어 영역* : 왼쪽 영역에서 기본 환경을 선택하면 오른쪽 영역에서 해당 환경에 대해 설치할 수 있는 여러 관련 추가 소프트웨어가 나열됩니다. - -대신 *최소 설치* (기본 기능) 옵션을 선택합니다. - -화면 상단의 완료를 클릭합니다. - -### 시스템 섹션 - -*설치 요약* 화면의 시스템 섹션은 대상 시스템의 하드웨어를 사용자 정의하고 변경하는 데 사용됩니다. 여기에서 하드 드라이브 파티션 또는 볼륨을 생성하고 사용할 파일 시스템을 지정하고 네트워크 구성을 지정합니다. - -#### 설치 대상 - -*설치 요약* 화면에서 Installation Destination 옵션을 클릭합니다. 이렇게 하면 해당 작업 영역으로 이동합니다. - -대상 시스템에서 사용 가능한 모든 후보 디스크 드라이브가 표시되는 화면이 표시됩니다. 샘플 시스템과 같이 시스템에 하나의 디스크 드라이브만 있는 경우, 해당 드라이브가 *로컬 표준 디스크* 아래에 목록으로 표시되며 옆에 체크 표시가 있습니다. 디스크 아이콘을 클릭하면 디스크 선택 체크 표시를 켜거나 끌 수 있습니다. 여기에서 선택/확인하도록 설정합니다. - -*저장소 구성* 옵션 섹션에서 Automatic 라디오 버튼을 선택합니다. - -화면 상단의 완료를 클릭합니다. - -설치 프로그램이 사용 가능한 디스크를 인식하면 *설치 요약* 화면으로 돌아갑니다. - -### 네트워크 & 호스트 이름 - -설치 절차의 마지막 작업은 시스템의 네트워크 구성을 다루며, 시스템에 대한 네트워크 관련 설정을 구성하거나 조정할 수 있습니다. - -!!! note "참고 사항" - - Network & Hostname 옵션을 클릭한 후, 모든 올바르게 감지된 네트워크 인터페이스 하드웨어 (예: 이더넷, 무선 네트워크 카드 등)가 네트워크 구성 화면의 왼쪽 창에 나열됩니다. 리눅스 배포판 및 구체적인 하드웨어 설정에 따라 이더넷 장치의 이름은 `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3` 등과 유사합니다. - -각 인터페이스에 대해 DHCP를 사용하여 구성하거나 IP 주소를 수동으로 설정할 수 있습니다. 수동으로 구성하려는 경우, IP 주소, 넷마스크 등과 같은 관련 정보를 모두 준비해야 합니다. - -*설치 요약* 화면의 Network & Hostname 버튼을 클릭하면 해당 구성 화면이 열립니다. 다른 사항들 중에서 시스템의 호스트 이름을 구성하는 옵션도 있습니다 (이름은 기본적으로 `localhost.localdomain`으로 설정됩니다). - -!!! note "참고 사항" - - 이 이름은 OS 설치 후에 쉽게 변경할 수 있습니다. 현재는 호스트 이름에 제공된 기본값을 사용합니다. - -다음 중요한 구성 작업은 시스템의 네트워크 인터페이스와 관련됩니다. 먼저, 왼쪽 창에 이더넷 카드 (또는 어떤 네트워크 카드든)가 나열되어 있는지 확인합니다. 왼쪽 창에서 감지된 네트워크 장치 중 하나를 클릭하여 선택합니다. 선택한 네트워크 어댑터의 구성 가능한 속성은 화면의 오른쪽 창에 표시됩니다. - -!!! note "참고 사항" - - 저희 샘플 시스템에서는 두 개의 이더넷 장치 (`ens3` 및 `ens4`)가 모두 연결된 상태입니다. 시스템의 네트워크 장치의 종류, 이름, 수량 및 상태는 저희 샘플 시스템과 다를 수 있습니다. - -구성하려는 장치의 스위치가 오른쪽 창에서 `ON` 위치로 되어 있는지 확인합니다. 이 섹션에서는 모든 기본값을 사용하도록 설정합니다. - -메인 *설치 요약* 화면으로 돌아가려면 Done를 클릭합니다. - -!!! warning "주의" - - 이 설치 프로그램의 이 섹션에서 서버의 IP 주소에 주의하십시오. 시스템에 물리적 또는 쉬운 콘솔 액세스가 없는 경우, 이 정보는 나중에 서버에 연결하여 작업을 계속해야 할 때 유용합니다. - -## 설치 프로그램 단계 - -다양한 설치 작업에 대한 선택 사항에 만족하면, 설치 프로세스의 다음 단계로 설치가 진행됩니다. - -### 사용자 설정 섹션 - -이 섹션에서는 `root` 사용자 계정의 비밀번호를 생성하거나 관리자 또는 비관리자 계정을 만들 수 있습니다. - -### 루트 비밀번호 설정 - -*사용자 설정* 아래의 *루트 비밀번호* 필드를 클릭하여 *루트 비밀번호* 작업 화면을 시작합니다. *루트 비밀번호* 텍스트 상자에 루트 사용자의 강력한 비밀번호를 설정합니다. - -!!! !!! - - 루트 슈퍼 사용자는 시스템에서 가장 권한이 있는 계정입니다. 따라서 사용하거나 활성화하는 경우 강력한 비밀번호로 이 계정을 보호하는 것이 중요합니다. - -*Confirm* 텍스트 상자에 동일한 비밀번호를 다시 입력합니다. - -Done을 클릭합니다. - - -### 사용자 계정 생성 - -다음으로, *User Settings* 아래의 *User Creation* 필드를 클릭하여 *Create User* 작업 화면을 시작합니다. 이 작업 영역에서는 시스템에 특권을 가진 또는 특권이 없는 (관리자가 아닌) 사용자 계정을 생성할 수 있습니다. - -!!! 정보 - - 시스템에서 일상적인 작업을 위해 특권이 없는 계정을 만들고 사용하는 것은 좋은 시스템 관리 관행입니다. - -필요할 때 루트 사용자와 동일한 슈퍼 사용자 (관리자) 권한을 부여할 수 있는 일반 사용자를 생성합니다. - -다음 정보로 *Create User* 화면의 필드를 완성한 다음 Done를 클릭합니다: - -*전체 이름*: `rockstar` - -*사용자 이름*: `rockstar` - -*이 사용자를 관리자로 만듭니다*: 체크 - -*이 계정 사용 시 암호 필요*: 체크 - -*암호*: `04302021` - -*암호 확인*: `04302021` - -### 설치 시작 - -다양한 설치 작업에 대한 선택 사항에 만족하면, 메인 *설치 요약* 화면에서 *설치 시작* 버튼을 클릭합니다. 설치가 시작되며, 설치 프로그램은 설치 진행 상황을 표시합니다. 설치가 시작되면 디스크 파티션 작업, 파티션 또는 LVM 볼륨 포맷팅, 소프트웨어 종속성 확인 및 해결, 운영 체제를 디스크에 기록하는 등의 다양한 작업이 백그라운드에서 실행됩니다. - -!!! note "참고 사항" - - 설치 시작 버튼을 클릭한 후 계속 진행하지 않으려면 데이터 손실 없이 안전하게 설치를 취소할 수 있습니다. 설치 프로그램을 종료하려면, 단순히 시스템을 재설정하면 됩니다. 종료 버튼을 클릭하거나 키보드에서 ctrl-alt-del을 누르거나 리셋 또는 전원 스위치를 누르면 됩니다. - -### 설치 완료 - -모든 필수 하위 작업을 완료하고 설치 프로그램이 진행되면, 완료 메시지가 포함된 최종 설치 진행 화면이 표시됩니다. - -마지막으로, Reboot System 버튼을 클릭하여 전체 절차를 완료합니다. 시스템이 다시 시작됩니다 - -### 로그인 - -시스템이 설정되어 사용할 준비가 되었습니다. Rocky Linux 콘솔이 표시됩니다. - -![Rocky Linux 시작 화면](images/installation_8_F02.png) - -시스템에 로그인하려면, 로그인 프롬프트에서 `rockstar`를 입력하고 Enter를 누릅니다. - -암호 프롬프트에서 `04302021` (rockstar의 암호)를 입력하고 Enter를 누릅니다 (암호는 화면에 **표시되지 않습니다**. 이는 정상적인 동작입니다). - -로그인 후 `whoami` 명령을 실행할 것입니다. 이 명령은 현재 로그인된 사용자의 이름을 보여줍니다. - -![로그인 화면](images/installation-F06.png) diff --git a/docs/guides/8_6_installation.md b/docs/guides/8_6_installation.md deleted file mode 100644 index dec3679575..0000000000 --- a/docs/guides/8_6_installation.md +++ /dev/null @@ -1,267 +0,0 @@ ---- -Title: Installing Rocky Linux 8 -author: wale soyinka -contributors: tianci li, Steven Spencer, Ganna Zhyrnova ---- - -# Installing Rocky Linux 8 - -This guide walks through the detailed steps to install a 64-bit version of the Rocky Linux distribution on a stand-alone system. We will be performing a server class install using an operating system installer image downloaded from the Rocky Linux project website. We will step through the installation and customization steps in the following sections. - -## OS Installation Prerequisites - -First, you need to download the ISO to be used for this installation of Rocky Linux. - -The latest ISO image for the version of Rocky Linux that we will be using for this installation can be downloaded from here: - - - -To download the ISO directly from the command line, use the `wget` command: - -```bash -wget https://download.rockylinux.org/pub/rocky/8.9/isos/x86_64/Rocky-8.9-x86_64-minimal.iso -``` - -Rocky Linux ISOs are named following this convention: - -```text -Rocky-.--.iso -``` - -For example, `Rocky-8.9-x86_64-minimal.iso` - -!!! Note - - The Rocky project web page lists several mirrors, which are located around the globe. Choose the mirror geographically closest to you. The list of official mirrors can be found [here](https://mirrors.rockylinux.org/mirrormanager/mirrors). - -## Verifying the Installer ISO File - -If you've downloaded the Rocky Linux ISO(s) on an existing Linux distribution, you can use the `sha256sum` utility to verify that file(s) you downloaded are not corrupt. We will show an example of how to verify the `Rocky-8.5-x86_64-minimal.iso` file by checking its checksum. - -First download the file that contains the official checksums for the available ISOs. While still in the folder that contains the downloaded Rocky Linux ISO download the checksum file for the ISO, type: - -```bash -wget https://download.rockylinux.org/pub/rocky/8.9/isos/x86_64/CHECKSUM -``` - -Use the `sha256sum` utility to verify the integrity of the ISO file against corruption and/or tampering. - -```bash -sha256sum -c CHECKSUM --ignore-missing -``` - -This will check the integrity of the previously downloaded ISO file, provided it is in the same directory. The output should show: - -```text -Rocky-8.9-x86_64-minimal.iso: OK -``` - -## The Installation - -!!! Tip - - Before installing, the system’s Unified Extensible Firmware Interface (UEFI) or Basic Input/Output System (BIOS) should be preconfigured to boot from the correct medium. - -We can begin the installation process if the computer is set up to boot from the media that has the ISO file. - -Insert and boot from the installation medium (optical disk, USB flash drive, and so on). - -Once the computer has booted you will be presented with the Rocky Linux 8 welcome splash screen. - -![Rocky Linux installation splash screen](images/install_8_9_01.png) - -If you do not press any key the installer will begin a countdown, after which the installation process will automatically execute the default, highlighted, option: - -`Test this media & install Rocky Linux 8` - -You can also press ++enter++ at any time to start the process immediately. - -A quick media verification step will take place. This media verification step can save you the trouble of starting the installation only to find out halfway through that the installer has to abort because of bad installation media. - -After the media check runs to completion and the media is successfully verified to be usable, the installer will automatically continue to the next screen. - -Select the language you want to use for the installation on this screen. For this guide, we select *English (United States)*. Then click the ++"Continue"++ button. - -## Installation Summary - -The *Installation Summary* screen is an all-in-one area where you make the important decisions about the operating system to be installed. - -The screen is roughly divided into the following sections: - -- *Localization*: (Keyboard, Language Support, and Time & Date) -- *Software*: (Installation Source and Software Selection) -- *System*: (Installation Destination and Network & Hostname) - -We will delve into each of these sections next and make changes where necessary. - -### Localization Section - -This section is used for customizing items related to the system's locale. This includes – Keyboard, Language Support, Time and Date. - -#### Keyboard - -On our demo system in this guide, we accept the default value (*English US*) and make no changes. - -However, if you need to make any changes here, from the *Installation Summary* screen, click the ++"Keyboard"++ option to specify the keyboard layout of the system. You can add additional keyboard layouts if you need to in the ensuing screen and specify their order. - -Click ++"done"++ when you are finished with this screen. - -#### Language Support - -The ++"Language Support"++ option on the *Installation Summary* screen enables you to specify support for additional languages that you may need on the finished system. - -We will accept the default value (**English – United States**) and make no change, click ++"done"++. - -#### Time & Date - -Click the ++"Time & Date"++ option on the main *Installation Summary* screen to bring up another screen that will allow you to select the time zone in which the machine is located. Scroll through the list of regions and cities and select the area closest to you. - -Depending on your installation source, the *Network Time* option could be set to *ON* or *OFF* by default. Accept the default *ON* setting; this allows the system to automatically set the correct time using the Network Time Protocol (NTP). Click ++"done"++ after making any changes. - -### Software Section - -Under the *Software* section of the *Installation Summary* screen, you can select the installation source as well as additional packages (applications) that get installed. - -#### Installation Source - -Since we are performing our installation using a full Rocky 8 image, you will notice that *Local Media* is automatically specified under the Installation Source section of the main *Installation Summary* screen. We'll accept the preset defaults. - -!!! Tip - - The installation Source area is where you can opt to perform a network-based installation. For a network-based installation, you need first to ensure that a network adapter on the target system is configured correctly and can reach the internet. To perform a network-based installation, click on `Installation Source` and then select the `On the network` radio button. Once selected, choose `https` as the protocol and type the following URL in the text field `download.rockylinux.org/pub/rocky/8/BaseOS/x86_64/os`. Click `Done`. - -#### Software Selection - -Clicking the ++"Software Selection"++ option on the main *Installation Summary* screen presents you with the section of the installation where you can pick the exact software packages that get installed on the system. The software selection area is divided into: - -- *Base Environment*: Server, Minimal Install, Custom Operating System -- *Additional software for Selected Environment area*: Selecting a Base Environment on the left side presents a variety of related additional software that can be installed for the given environment on the right side. - -Select the *Minimal Install* (Basic functionality) option instead. - -Click ++"done"++ at the top of the screen. - -### System Section - -The System section of the *Installation Summary* screen is used for customizing and making changes to the underlying hardware of the target system. This is where you create your hard drive partitions or volumes, specify the file system to be used, and specify the network configuration. - -#### Installation Destination - -From the *Installation Summary* screen, click the `Installation Destination` option. This takes you to the corresponding task area. - -You will see a screen displaying all the candidate disk drives that you have available on the target system. If you have only one disk drive on the system, as on our sample system, you will see the drive listed under *Local Standard Disks* with a check mark beside it. Clicking the disk icon will toggle on or off the disk selection check mark. We want it selected/checked here. - -Under the *Storage Configuration* Options section, select the ++"Automatic"++ radio button. - -Then click ++"done"++ at the top of the screen. - -Once the installer determines that you have a usable disk, you will be returned to the *Installation Summary* screen. - -### Network & Hostname - -The final task of the installation procedure deals with network configuration, where you can configure or tweak network-related settings for the system. - -!!! Note - - After you click on the ++"Network & Hostname"++ option, all correctly detected network interface hardware (such as Ethernet, wireless network cards, and so on) will be listed in the left pane of the network configuration screen. Depending on the Linux distribution and the specific hardware setup, Ethernet devices in Linux have names similar to `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3`, and so on. - -You can either configure each interface using DHCP or manually set the IP address. If you choose to configure manually, be sure to have all the pertinent information ready, such as the IP address, netmask, and so on. - -Clicking the ++"Network & Hostname"++ button in the main *Installation Summary* screen opens the corresponding configuration screen. Among other things, you have the option to configure the hostname of the system (the name defaults to `localhost.localdomain`). - -!!! Note - - You can easily change this name later on after the OS has been installed. For now, accept the default value supplied for the hostname. - -The next important configuration task is related to the network interfaces on the system. First, verify that an Ethernet card (or any network card) is listed in the left pane. Click any of the detected network devices in the left pane to select it. The configurable properties of the selected network adapter will appear in the right pane of the screen. - -!!! Note - - On our sample system, we have two Ethernet devices (`ens3` and `ens4`), all of which are in a connected state. The type, name, quantity, and state of the network devices on your system may vary from the ones on our sample system. - -Make sure the switch of the device you want to configure is flipped to the `ON` position in the right pane. -We'll accept all the defaults in this section. - -Click ++"done"++ to return to the main *Installation Summary* screen. - -!!! Warning - - Pay attention to the IP address of the server in this section of this installer. If you don’t have physical or easy console access to the system, this information will come in handy later on when you need to connect to the server to continue working on it. - -## Installer Phase - -Once you are satisfied with your choices for the various installation tasks, the next phase of the installation process will begin the installation proper. - -### User Settings Section - -This section can be used for creating a password for the `root` user account and also for creating new administrative or non-administrative accounts. - -### Set the Root Password - -Click the *Root Password* field under *User Settings* to launch the *Root Password* task screen. In the *Root Password* text box, set a strong password for the root user. - -!!! Warning - - The root superuser is the most privileged account on the system. Therefore, if you choose to use or enable it, it is crucial that you protect this account with a strong password. - -Enter the same password again in the *Confirm* text box. - -Click ++"done"++. - -### Create a User Account - -Next click the *User Creation* field under *User Settings* to launch the *Create User* task screen. This task area allows you to create a privileged or non-privileged (non-administrative) user account on the system. - -!!! Info - - Creating and using a non-privileged account for day-to-day tasks on a system is a good system administration practice. - -We’ll create a regular user that can invoke superuser (administrator) powers, the same as the root user, when needed. - -Complete the fields in the *Create User* screen with the following information and then click ++"done"++: - -*Full name*: -`rockstar` - -*Username*: -`rockstar` - -*Make this user administrator*: -Checked - -*Require a password to use this account*: -Checked - -*Password*: -`04302021` - -*Confirm password*: -`04302021` - -### Start the Installation - -Once you are satisfied with your choices for the various installation tasks, click the Begin Installation button on the main *Installation Summary* screen. The installation will begin, and the installer will show the progress of the installation. When the installation begins, various tasks will begin running in the background, such as partitioning the disk, formatting the partitions or LVM volumes, checking for and resolving software dependencies, writing the operating system to the disk, and so on. - -!!! Note - - If you do not wish to continue after clicking the Begin Installation button, you can still safely back out of the installation without any loss of data. To quit the installer, simply reset your system either by clicking the Quit button, pressing ctrl-alt-del on the keyboard, or pushing the reset or power switch. - -### Complete the Installation - -After you have completed all of the mandatory subtasks, and the installer has run its course, you will be presented with a final installation progress screen with a complete message. - -Finally, complete the entire procedure by clicking the ++"Reboot System"++ button. The system will restart. - -### Log In - -The system is now set up and ready for use. You will see the Rocky Linux console. - -![Rocky Linux Welcome Screen](images/installation_8_F02.png) - -To log onto the system, type `rockstar` at the login prompt and press ++enter++. - -At the Password prompt, type `04302021` (rockstar’s password) and press ++enter++ (the password will ***not*** be echoed to the screen, that is normal). - -We will run the `whoami` command after login, this command shows the name of the currently logged in user. - -![Login Screen](images/installation-F06.png) diff --git a/docs/guides/8_6_installation.sv.md b/docs/guides/8_6_installation.sv.md deleted file mode 100644 index 2cdd12f4f3..0000000000 --- a/docs/guides/8_6_installation.sv.md +++ /dev/null @@ -1,257 +0,0 @@ ---- -title: Installera Rocky Linux ---- - -# Installera Rocky Linux - -Denna guide går igenom i detalj stegen för att installera en 64-bitars version av rocky Linux distribution på ett fristående system. - -**** -Vi kommer att utföra en server klass installation i detta kapitel genom att använda en oprativsystems installationsavbild nerladdad från rocky projektets webbplats. Vi kommer att tackla installationen och anpassade steg i följande avsnitt. -**** - -## OS förutsättningar för installation - -Först, så behöver du ladda ner ISO-avbilden för Rocky som vi kommer att installera. - -Den senaste ISO-avbilden för den version av Rocky som vi kommer att använda för denna installation kan laddas ner härifrån: - -``` -https://www.rockylinux.org/download/ - -``` - -För att ladda ner ISO-avbilden direkt från en terminal skriv: - -``` -$ wget https://download.rockylinux.org/pub/rocky/8.4/isos/x86_64/Rocky-8.4-x86_64-minimal.iso -``` - -Rocky ISOs är namngavna efter följande konvention: - -``` -Rocky-..-.iso -``` - -t.ex. `Rocky-8.4-x86_64-minimal.iso` - -!!! Note "Notera" - Rocky projektets webbplats har en lista på flera speglar som ligger över hela världen. När det är möjligt, så ska du välja en spegel som är geografiskt närmast dig. Listan över officella speglar kan hittas [här](https://mirrors.rockylinux.org/mirrormanager/mirrors). - -## Verifiera installations ISO - -Om du har laddat hem Rocky ISO-avbilden/avbilder på en existerande Linux distribution, så kan du använda `sha256sum` verktyget för att verifiera att filen/filerna du har laddat ner inte är skadade på något sätt. Vi visar ett exempel på hur man verifierar sha256sum av `Rocky-8.4-x86_64-minimal.iso`. - -Första ladda ner filen som innehåller dom officiella kontrollsummorna för tillgängliga ISO-avbilder. Medan du fortfarande är i mappen som innehåller den nerladdade Rocky ISO-avbilden, skriv: - -``` -wget http://download.rockylinux.org/pub/rocky/8.4/isos/x86_64/CHECKSUM -``` - -Använd `sha256sum` verktyget för att verifiera - -``` -sha256sum -c CHECKSUM --ignore-missing Rocky-8.4-x86_64-minimal.iso -``` - -Utdatan ska inkludera: - -``` -Rocky-8.4-x86_64-minimal.iso: OK -``` - -!!! Tip - Innan du startar installationen ordentligt, systemets Unified Extensible Firmware Interface (UEFI) eller Basic Input/Output System (BIOS) ska vara förkonfigurerat till att starta från korrekt media. - -# Installationen - -Låt oss börja med installationsprocessen. - -Koppla in och starta från ditt installationmedia (optisk skiva, USB-sticka, och så vidare). - -När du startat, så kommer du bli presenterad med en välkomstskärm. - -![Rocky Linux installation splash screen](images/installation-F01.png) - -Om du inte trycker på någon tangent, efter uppmaningen börjar en nedräkning, varefter installationsprocessen kommer börja med att starta den markerade `Testa detta media & installera Rocky Linux 8` ... alternativ. Du kan också trycka på enter för att starta processen omedelbart. - -Ett snabbt mediaverifieringssteg kommer att äga rum. detta mediaverifieringssteg kan spara dig besväret av att påbörja installationen endast för att upptäcka halvvägs igenom att installationsprogrammet kommer att avbrytas på grund av dåligt installationsmedia. - -Efter att mediekontrollen är klar, och mediat har framgångsrikt verifierats och kommer att vara användbart, så kommer installationsprogrammet automatiskt att fortsätta till nästa sektion. - -Välj vilket språk du vill använda för att utföra installationen i denna del. För detta exempel, så kommer vi välja _Engelska (United States)_. Klicka sedan på knappen Fortsätt. - -## Installationsöversikt - -Installationsöversikts skärmen är ett allt-i-ett-område där du kan göra viktiga val om det operativsystem som ska installeras. - -Denna skärm är ungefär uppdelad i följande sektioner: - -- _Lokalisering_: (Tangentbord, Språkstöd, och Tid & Datum) -- Programvara: (Installationskälla och Programvaruval) -- _System_: (Installationsdestination och Nätverk & Värdnamn) - -Vi fördjupar oss i vart och ett av denna sektion och gör ändringar vid behov. - -## Lokaliseringssektion - -Denna ssektion används för att anpassa objekt relaterade till lokalen ditt system. Detta inkluderar – Tangentbord, Språkstöd, Tid och Datum. - -### Tangentbord - -På vårt demo-system i den här guiden accepterar vi standardvärdet (_Engelska_ US_) och gör inga ändringar. - -Men om du behöver göra några ändringar här, från _Installationsöversikt_ skärmen, klicka på Tangentbords alternativet för att ange tangentbordslayout på ditt system. Du kan lägga till ytterligare tangentbordslayouter om du behöver på den efterföljande skärmen och ange deras ordning. - -Klicka på Klar när du är klar. - -### Språkstöd - -Språkstöd alternativet på _Installationsöversikt_ skärmen tillåter dig att aktivera stöd för ytterligare språk som du kan behöva på det färdiga systemet. - -Vi accepterar standardvärdet (__Engelska – United States__) och gör ingen förändring . Klicka på Klar. - -### Tid & Datum - -Klicka på Tid & Datum alternativet på huvud _Installationsöversikt_ skärmen för att få upp en annan skärm som tillåter dig att välja vilken tidszon där maskinen är placerad. Bläddra igenom listan över regioner och städer och välj det område som ligger närmast dig. - -Beroende på din installationskälla, så kan _Nätverkstid_ alternativet sättas till _PÅ eller _AV som standard. Acceptera standard _PÅ_ inställningen; detta tillåter systemet att automatiskt ställa in rätt tid genom att använda nätverkstid protokollet (NTP). Klicka på Klar efter du gjort några ändringar. - -## Programvaruval - -Under Programvaruval sektionen på _Installationsöversikt_ skärmen, så kan du välja en installationskälla samt ytterligare paket (applikationer) som ska installeras. - -### Installationskälla - -Eftersom vi utför vår installation med en full Rocky 8 avbild, så kommer du notera att _Lokalt media_ är automatiskt valt under installationskälla sektionen av huvud _Installationsöversikt_ skärmen. Vi accepterar de förinställda standardvärdena. - -### Programvaruval - -Klicka på Programvaruval alternativet på huvud _Installationsöversikt_ skärmen presenterar dig med en sektion av installationen där du kan välja dom exakta programvarupaketen som installeras på systemet. Dessa programvaru områden har delats in i dessa: - -- _Basmiljö_ : Server, Minimal installation, Anpassat Operativ system -- _Ytterligare programvara för området Vald miljö : Då du väljer basmiljö på vänster sida presenteras en mängd relaterad ytterligare programvara som kan installeras för den valda miljön på högersida. - -Välj alternativet _Minimal installation_ (grundläggande funktionalitet) istället. - -Klicka på Klar högst upp på skärmen. - -## System Sektion - -Systemsektionen på _Installationsöversikt_ skärmen används för att anpassa och gör ändringar till den underliggande hårdvaran på målsystemet. Detta är vart du skapar dina hårddiskpartitioner eller volymer, specificerar vilket filsystem som ska användas, och anger nätverkskonfigurationen. - -### Installationsdestination - -Från _Installationsöversikt_ skärmen, klicka på Installationsdestination alternativet. Detta tar dig till motsvarande uppgiftsområde. - -Du kommer se en skärm som visar alla dom kandiderande diskar som du har tillgängliga på målsystemet. Om du endast har en diskenhet på systemet, som på vårat exempelsystem, Då kommer du att se enheten listad under _Lokala Standarddiskar_ med en bock bredvid den. Om du klickar på diskikonen växlar du på eller av kryssmarkeringen för diskval. Vi vill ha den vald/ikryssad här. - -Under _Lagringskonfigurations_ Inställningssektionen, Välj den Automatiska knappen. - -Klicka sedan på Klar högst upp på skärmen. - -När installationsprogrammet har kommit fram till att du har en användbar disk, så kommer du att skickas tillbaka till _Installationsöversikt_ skärmen. - -### Nätverk & Värdnamn - -Sista steget av installationsproceduren handlar om nätverkskonfiguration, här kan du kan konfigurera eller justera nätverksrelaterade inställningar för systemet. - -!!! Note "Notera" - Efter du klickat på Nätverk & Värdnamn alternativet, alla korrekt upptäckta hårdvaror för nätverksgränssnitt (t.ex. Ethernet, trådlösa nätverkskort och så vidare) kommer att listas i den vänstra rutan på nätverkskonfigurationsskärmen. Beroende på Linux-distributionen och dom specifika hårdvaruinställningarna, Ethernet enheter i har namn som ungefär som `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3`, och såvidare. - -För varje gränssnitt, så kan du antingen konfigurera det med DHCP eller genom att manuellt ange en IP-adress. Om du väljer att konfigurera manuellt, se till att ha all relevant information redo, som t.ex. IP-adress, nätmask, och såvidare. - -Klicka på Nätverk & Värdnamn knappen på huvud _Installationsöversikt_ skärmen öppnar den motsvarande konfigurationsskärmen. Bland annat, så har du alternativet att konfigurera värdnamnet för systemet (namnet är som standard `localhost.localdomain`). - -!!! Note "Notera" - Du kan enkelt ändra detta namnet senare efter att oprativsystemet har installerats. För nu, acceptera det angivna standardvärdet för värdnamnet. - -Nästa viktiga konfigurationsuppgift är relaterad till nätverksgränssnitten på systemet. Först, verifiera att ett Ethernet-kort (eller annat nätverkskort) är listat i den vänstra rutan. Klicka på någon av dom upptäckta nätverksenheterna i den vänstra rutan för att välja den. De konfigurerbara egenskaperna för den valda nätverks adapter visas i den högra rutan på skärmen. - -!!! Note "Notera" - På våran exempelserver, så har vi fyra Ethernet-enheter (`ens3`, `ens4`, `ens5` och `ens6`), som alla är i ett anslutet tillstånd. Typ, namn, kvantitet, och tillstånd på nätverksenheterna på ditt system kan variera från de som finns i vårt exempelsystem. - -Se till att omkopplaren för enheten som du vill konfigurera ändras till `PÅ` position i den högra rutan. -Vi accepterar alla standardvärden i den här sektionen. - -Klicka på Klar och återgå till huvud _Installationsöversikt_ skärmen. - -!!! Warning "Varning" - Var uppmärksam på serverns IP-adress i denna sektion av installationsprogrammet. Om du inte har fysisk åtkomst eller enkel konsolåtkomst till systemet, Så kommer denna information komma att vara till nytta senare när du behöver ansluta till servern för att fortsätta arbeta med den. - -## Installationen - -När du väl är nöjd med dina val för olika installationsuppgifter, så kommer nästa fas av installationsprocessen att börja installera ordentligt. - -## Användarinställningar Sektion - -Denna sektion kommer att användas för att skapa ett lösenord för `root` användarkontot och också för att skapa nya administrativa eller icke-administrativa konton. - -### Välj ett Root lösenord - -Klicka på _Rootlösenords_ fäletet under _Använderinställningar_ för att starta _Rootlösenords _ uppgiftsskärmen. I _Rootlösenord_ textrutan, ange ett starkt lösenord för rotanvändaren. - -!!! Warning "Varning" - Denna användare är det mest privilegierade kontot på ditt system. Därför, om du väljer att använda det eller aktivera det - så är det mycket viktigt att du skyddar det här kontot med ett mycket bra lösenord. - -Ange samme lösenord igen i _Bekräfta textrutan. - -Klicka på Klar. - - -### Skapa ett användarkonto - -Klicka sedan på fältet _Användarskapande_ under _Användarinställningar_ för att starta _Skapa en användare_ uppgiftsskärmen. Detta aktivitetsområde låter dig skapa ett privilegierat eller icke-privilegierat (icke-administrativt) användarkonto i systemet. - -!!! Info - Att skapa och använda ett icke-privilegierat konto för dagliga uppgifter i ett system är en bra systemadministrationspraxis. - Vi kommer att skapa en vanlig användare som kan åkalla superanvändare (administratörsrättigheter) när det behövs. - -Fyll i fälten på _Skapa en användare_ skärmen med följande information och klicka sedan påKlar: - -_Fullständigt namn_: -`rockstar` - -_Användarnamn_: -`rockstar` - -_Gör den här användaren administratör_: -Ikryssad - -_Kräv ett lösenord för att använda detta konto_: -Ikryssad - -_Lösenord_: -`04302021` - -_Bekräfta lösenord_: -`04302021` - -### Starta installationen - -När du väl är nöjd med dina val för dom olika installationsuppgifterna, klicka på starta Installationsknappen på huvud _Installationsöversikt_ skärmen. installationen kommer att startas, och installationsprogrammet visar hur installationen fortskrider. - -!!! Note - Om du får kalla fötter efter att du har klickat på starta Installationsknappen, så kan du fortfarande säkert komma tillbaka från installationen utan att förlora data (eller självförtroende). För att avsluta installationsprogrammet, Återställ helt enkelt ditt system antingen genom att klicka på Avsluta-knappen, trycka ctrl-alt-del på ditt tangentbord, eller genom att trycka på reset- eller strömknappen. - -När installationen startar, så kommer olika uppgifter börja köras i bakgrunden, som att partitionera disken, formatera partitionerna eller LVM-volymerna, söka efter och lösa programberoenden, skriva operativsystemet till disk och så vidare. - -### Slutför installationen - -Efter du har slutfört alla av de obligatoriska deluppgifterna och installationsprogrammet har gått sin runda, så kommer du att få en slutlig skärm för installationsförloppet med ett slutför meddelande. - -Slutligen slutför hela proceduren genom att klicka på Starta om System knappen. Systemet startar om sig själv. - -### Logga in - -Systemet är nu färdig installerat och klart för användning. Du kommer att se den bedårande Rocky Linux-konsolen. - -![Rocky Linux Välkommenskärm](images/installation-F04.png) - -För att logga in på systemet, skriv `rockstar` vid inloggningsprompten och tryck på enter. - -Vid lösenordsprompten, skriv `04302021` (rockstar’s lösenord) och tryck på enter (ingenting visas på skärmen och detta är normalt). - -Prova att köra `whoami` kommandot efter inloggning. - -![Inloggningsskärm](images/installation-F06.png) diff --git a/docs/guides/8_6_installation.uk.md b/docs/guides/8_6_installation.uk.md deleted file mode 100644 index 47b7c0fd4c..0000000000 --- a/docs/guides/8_6_installation.uk.md +++ /dev/null @@ -1,260 +0,0 @@ ---- -Title: Встановлення Rocky Linux 8 -author: wale soyinka -contributors: tianci li, Steven Spencer, Ganna Zhyrnova ---- - -# Встановлення Rocky Linux 8 - -У цьому посібнику описано детальні кроки для встановлення 64-розрядної версії дистрибутива Rocky Linux на автономній системі. Ми будемо виконувати встановлення класу сервера за допомогою образу інсталятора операційної системи, завантаженого з веб-сайту проекту Rocky Linux. У наступних розділах ми розглянемо кроки встановлення та налаштування. - -## Передумови встановлення ОС - -По-перше, вам потрібно завантажити ISO, який буде використовуватися для цієї інсталяції Rocky Linux. - -Останній образ ISO для версії Rocky Linux, яку ми будемо використовувати для цієї інсталяції, можна завантажити тут: - - - -Щоб завантажити ISO безпосередньо з командного рядка, скористайтеся командою `wget`: - -```bash -wget https://download.rockylinux.org/pub/rocky/8.9/isos/x86_64/Rocky-8.9-x86_64-minimal.iso -``` - -ISO Rocky Linux називаються відповідно до цієї угоди: - -```text -Rocky-.--.iso -``` - -Наприклад, `Rocky-8.9-x86_64-minimal.iso` - -!!! Note "Примітка" - - Веб-сторінка проекту Rocky містить перелік кількох дзеркал, розташованих по всьому світу. По можливості вибирайте дзеркало, територіально найближче до вас. Список офіційних дзеркал можна знайти [тут](https://mirrors.rockylinux.org/mirrormanager/mirrors). - -## Перевірка файлу ISO інсталятора - -Якщо ви завантажили Rocky Linux ISO в існуючий дистрибутив Linux, ви можете скористатися утилітою `sha256sum`, щоб переконатися, що файли, які ви завантажили, не пошкоджені. Перевіривши його контрольну суму, ми покажемо приклад перевірки файлу `Rocky-8.5-x86_64-minimal.iso`. - -Спочатку завантажте файл, який містить офіційні контрольні суми для доступних ISO. Перебуваючи в папці, яка містить завантажений ISO Rocky Linux, завантажте файл контрольної суми для ISO, введіть: - -```bash -wget https://download.rockylinux.org/pub/rocky/8.9/isos/x86_64/CHECKSUM -``` - -Використовуйте утиліту `sha256sum`, щоб перевірити цілісність файлу ISO на пошкодження та/або втручання. - -```bash -sha256sum -c CHECKSUM --ignore-missing -``` - -Це перевірить цілісність раніше завантаженого файлу ISO, якщо він знаходиться в тому самому каталозі. Вихід має показати: - -```text -Rocky-8.9-x86_64-minimal.iso: OK -``` - -## Встановлення - -!!! Tip "Порада" - - Перед інсталяцією уніфікований розширюваний інтерфейс мікропрограми (UEFI) або базову систему вводу/виводу (BIOS) потрібно попередньо налаштувати для завантаження з правильного носія. - -Ми можемо почати процес встановлення, якщо комп’ютер налаштовано на завантаження з носія, який містить файл ISO. - -Вставте та завантажтеся з інсталяційного носія (оптичний диск, флешка тощо). - -Після завантаження комп’ютера ви побачите екран привітання Rocky Linux 8. - -![Заставка встановлення Rocky Linux](images/install_8_9_01.png) - -Якщо ви не натиснете жодну клавішу, інсталятор почне зворотний відлік, після чого процес інсталяції автоматично виконає стандартний, виділений параметр: - -`Перевірте цей носій і встановіть Rocky Linux 8` - -Ви також можете будь-коли натиснути ++enter++, щоб негайно розпочати процес. - -Відбудеться швидка перевірка медіа. Цей етап перевірки носія може позбавити вас від проблем із запуском інсталяції лише на півдорозі, щоб дізнатися, що інсталятор має перервати через неправильний інсталяційний носій. - -Після завершення перевірки носія та його придатності до використання інсталятор автоматично перейде до наступного екрана. - -На цьому екрані виберіть мову, яку ви хочете використовувати для встановлення. Для цього посібника ми вибрали *English (United States)*. Потім натисніть кнопку ++"Continue"++. - -## Підсумок Інсталяції - -Екран *Підсумок інсталяції* — це всеохоплююча область, де ви приймаєте важливі рішення щодо операційної системи, яку потрібно встановити. - -Екран приблизно поділено на такі частини: - -- *Localization*: (Клавіатура, підтримка мови та час і дата) -- *Software*: (Джерело встановлення та вибір програмного забезпечення) -- *System*: (Місце призначення та мережа та ім’я хоста) - -Далі ми розглянемо кожен із цих розділів і внесемо необхідні зміни. - -### Розділ локалізації - -Цей розділ використовується для налаштування елементів, пов’язаних із системою. Це включає – клавіатуру, підтримку мови, час і дату. - -#### Клавіатура - -У нашій демонстраційній системі в цьому посібнику ми приймаємо значення за умовчанням (*English US*) і не вносимо жодних змін. - -Однак, якщо вам потрібно внести будь-які зміни тут, на екрані *Підсумок встановлення* натисніть опцію ++"Клавіатура"++, щоб указати розкладку клавіатури системи. Ви можете додати додаткові розкладки клавіатури, якщо потрібно, на наступному екрані та вказати їх порядок. - -Натисніть ++"done"++, коли ви закінчите з цим екраном. - -#### Підтримка мови - -Параметр ++"Language Support"++ на екрані *Installation Summary* дає змогу вказати підтримку додаткових мов, які можуть знадобитися вам у готовій системі. - -Ми приймемо значення за замовчуванням (**англійська – США**) і не внесемо жодних змін, натисніть ++"done"++. - -#### Час & Дата - -Натисніть опцію ++"Time & Date"++ на головному екрані *Підсумок встановлення*, щоб відкрити інший екран, який дозволить вам вибрати часовий пояс, у якому знаходиться машина. Прокрутіть список регіонів і міст і виберіть найближчу до вас область. - -Залежно від джерела інсталяції для параметра *Мережевий час* можна встановити значення *УВІМК.* або *ВИМКНЕНО* за умовчанням. Прийміть стандартне налаштування *ON*; це дозволяє системі автоматично встановлювати правильний час за допомогою мережевого протоколу часу (NTP). Натисніть ++"done"++ після внесення будь-яких змін. - -### Розділ програмного забезпечення - -У розділі *Програмне забезпечення* на екрані *Підсумок встановлення* ви можете вибрати джерело встановлення, а також додаткові пакети ( програми), які встановлюються. - -#### Джерело встановлення - -Оскільки ми виконуємо нашу інсталяцію, використовуючи повний образ Rocky 8, ви помітите, що *Локальний носій* автоматично вказано в розділі «Джерело інсталяції» на головному екрані *Підсумок інсталяції*. Ми приймемо стандартні налаштування. - -!!! Tip "Порада" - - Область «Джерело інсталяції» — це місце, де ви можете вибрати встановлення через мережу. Для мережевої інсталяції вам спочатку потрібно переконатися, що мережевий адаптер у цільовій системі налаштовано правильно та може підключитися до Інтернету. Щоб виконати встановлення через мережу, клацніть «Джерело встановлення» та виберіть перемикач «У мережі». Після вибору виберіть `https` як протокол і введіть наступну URL-адресу в текстове поле `download.rockylinux.org/pub/rocky/8/BaseOS/x86_64/os`. Натисніть `Готово`. - -#### Вибір програмного забезпечення - -Натиснувши опцію ++"Вибір програмного забезпечення"++ на головному екрані *Підсумок встановлення*, ви побачите розділ встановлення, де ви можете вибрати точні пакети програмного забезпечення, які буде встановлено в системі. Зона вибору програмного забезпечення поділяється на: - -- *Базове середовище*: сервер, мінімальна інсталяція, спеціальна операційна система -- *Додаткове програмне забезпечення для області вибраного середовища*: вибір базового середовища ліворуч представляє різноманітне пов’язане додаткове програмне забезпечення, яке можна встановити для заданого середовища праворуч. - -Натомість виберіть опцію *Мінімальна інсталяція* (базова функція). - -Натисніть ++"done"++ у верхній частині екрана. - -### Системний розділ - -Розділ «Система» на екрані *Підсумок встановлення* використовується для налаштування та внесення змін до апаратного забезпечення цільової системи. Тут ви створюєте розділи або томи жорсткого диска, вказуєте файлову систему, яка буде використовуватися, і вказуєте конфігурацію мережі. - -#### Місце призначення - -На екрані *Підсумок встановлення* клацніть опцію `Місце призначення`. Це приведе вас до відповідної області завдань. - -Ви побачите екран із усіма дисками-кандидатами, доступними у цільовій системі. Якщо у вас є лише один дисковод у системі, як у нашій зразковій системі, ви побачите диск у списку *Локальних стандартних дисків* із позначкою біля нього. Натискання піктограми диска вмикає або вимикає позначку вибору диска. Ми хочемо, щоб це було вибрано/перевірено тут. - -У розділі параметрів *Налаштування сховища* виберіть перемикач ++"Автоматично"++. - -Потім натисніть ++"done"++ у верхній частині екрана. - -Коли інсталятор визначить, що у вас є придатний для використання диск, ви повернетеся до екрана *Підсумок встановлення*. - -### Мережа & Ім'я хоста - -Останнім завданням процедури інсталяції є конфігурація мережі, де ви можете налаштувати або налаштувати параметри, пов’язані з мережею, для системи. - -!!! Note "Примітка" - - Після того, як ви клацнете опцію ++"Network & Hostname"++, усе правильно визначене обладнання мережевого інтерфейсу (наприклад, Ethernet, бездротові мережеві карти тощо) буде перераховано на лівій панелі екрана налаштування мережі. Залежно від дистрибутива Linux і конкретної установки апаратного забезпечення пристрої Ethernet у Linux мають назви, схожі на `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3`, і так далі. - -Ви можете або налаштувати кожен інтерфейс за допомогою DHCP, або вручну встановити IP-адресу. Якщо ви вирішите налаштувати вручну, переконайтеся, що підготували всю відповідну інформацію, наприклад IP-адресу, маску мережі тощо. - -Натискання кнопки ++"Network & Hostname"++ на головному екрані *Підсумок встановлення* відкриває відповідний екран конфігурації. Серед іншого, у вас є можливість налаштувати ім’я хоста системи (типове ім’я `localhost.localdomain`). - -!!! Note "Примітка" - - Ви можете легко змінити цю назву після встановлення ОС. Наразі прийміть значення за замовчуванням, надане для імені хоста. - -Наступне важливе завдання налаштування пов’язане з мережевими інтерфейсами в системі. Спочатку переконайтеся, що Ethernet-карта (або будь-яка мережева карта) указана на лівій панелі. Натисніть будь-який із виявлених мережевих пристроїв на лівій панелі, щоб вибрати його. Властивості вибраного мережевого адаптера, які можна налаштувати, з’являться на правій панелі екрана. - -!!! Note "Примітка" - - У нашому прикладі системи ми маємо два пристрої Ethernet ("ens3" і "ens4"), усі вони знаходяться в підключеному стані. Тип, назва, кількість і стан мережевих пристроїв у вашій системі можуть відрізнятися від пристроїв у нашій зразковій системі. - -Переконайтеся, що перемикач пристрою, який ви хочете налаштувати, переведено в положення `ON` на правій панелі. Ми приймемо всі значення за замовчуванням у цьому розділі. - -Натисніть ++"done"++, щоб повернутися до головного екрана *Підсумок встановлення*. - -!!! Warning "Важливо" - - Зверніть увагу на IP-адресу сервера в цьому розділі інсталятора. Якщо у вас немає фізичного або легкого консольного доступу до системи, ця інформація буде корисною, коли вам потрібно буде підключитися до сервера, щоб продовжити роботу на ньому. - -## Фаза встановлення - -Коли ви задоволені своїм вибором для різних завдань встановлення, наступний етап процесу встановлення розпочне власне встановлення. - -### Розділ налаштувань користувача - -Цей розділ можна використовувати для створення пароля для облікового запису користувача `root`, а також для створення нових адміністративних або неадміністративних облікових записів. - -### Встановіть пароль root - -Натисніть поле *Root Password* у *User Settings*, щоб запустити *Root Пароль* екран завдання. У текстовому полі *Root Password* установіть надійний пароль для користувача root. - -!!! Warning "Важливо" - - Суперкористувач root є найбільш привілейованим обліковим записом у системі. Тому, якщо ви вирішите використовувати або ввімкнути його, дуже важливо захистити цей обліковий запис надійним паролем. - -Знову введіть той самий пароль у текстове поле *Підтвердити*. - -Натисніть ++"done"++. - -### Створіть обліковий запис користувача - -Потім клацніть поле *Створення користувача* в розділі *Параметри користувача*, щоб запустити екран завдань *Створити користувача*. Ця область завдань дозволяє створити привілейований або непривілейований (не адміністративний) обліковий запис користувача в системі. - -!!! Info "Інформація" - - Створення та використання непривілейованого облікового запису для повсякденних завдань у системі є хорошою практикою адміністрування системи. - -Ми створимо звичайного користувача, який може використовувати повноваження суперкористувача (адміністратора), такі ж, як користувач root, коли це необхідно. - -Заповніть поля на екрані *Створити користувача* такою інформацією, а потім натисніть ++"done"++: - -*Full name*: `rockstar` - -*Username*: `rockstar` - -*Make this user administrator*: Checked - -*Require a password to use this account*: Checked - -*Password*: `04302021` - -*Confirm password*: `04302021` - -### Почніть установку - -Коли ви задоволені своїм вибором для різних завдань встановлення, натисніть кнопку «Почати встановлення» на головному екрані *Підсумок встановлення*. Розпочнеться інсталяція, і інсталятор покаже прогрес інсталяції. Коли почнеться інсталяція, у фоновому режимі почнуть виконуватися різноманітні завдання, як-от розділення диска, форматування розділів або томів LVM, перевірка та вирішення програмних залежностей, запис операційної системи на диск тощо. - -!!! Note "Примітка" - - Якщо ви не бажаєте продовжувати після натискання кнопки «Почати інсталяцію», ви все одно можете безпечно завершити інсталяцію без втрати даних. Щоб вийти з інсталятора, скиньте систему, натиснувши кнопку «Вийти», натиснувши ctrl-alt-del на клавіатурі або натиснувши кнопку скидання чи живлення. - -### Завершіть установку - -Після того, як ви виконаєте всі обов’язкові підзавдання та програма встановлення запустить свій курс, вам буде запропоновано остаточний екран перебігу встановлення з повним повідомленням. - -Нарешті завершіть всю процедуру, натиснувши кнопку ++"Reboot System"++. Система перезавантажиться. - -### Log In - -Тепер система налаштована та готова до використання. Ви побачите консоль Rocky Linux. - -![Екран привітання Rocky Linux](images/installation_8_F02.png) - -Щоб увійти в систему, введіть `rockstar` у рядку входу та натисніть ++enter++. - -У вікні запиту пароля введіть `04302021` (пароль rockstar) і натисніть ++enter++ (пароль ***не*** відтворюється на екрані, це нормально). - -Ми запустимо команду `whoami` після входу; ця команда показує ім'я користувача, який зараз увійшов в систему. - -![Екран входу](images/installation-F06.png) diff --git a/docs/guides/8_6_installation.zh.md b/docs/guides/8_6_installation.zh.md deleted file mode 100644 index 536c461a24..0000000000 --- a/docs/guides/8_6_installation.zh.md +++ /dev/null @@ -1,265 +0,0 @@ ---- -Title: 安装 Rocky Linux 8 -author: wale soyinka -contributors: tianci li, Steven Spencer, Ganna Zhyrnova ---- - -# 安装 Rocky Linux 8 - -本指南介绍了在独立系统上安装 64 位 Rocky Linux 发行版的详细步骤。 我们将使用从Rocky Linux项目网站下载的ISO镜像文件执行服务器类安装。 我们将在以下部分逐步完成安装和自定义步骤。 - - -## 操作系统安装前提 - -首先,您需要下载ISO镜像文件以用于安装Rocky Linux。 - -用于此安装的Rocky Linux版本的最新ISO镜像可从以下位置下载: - -``` -https://www.rockylinux.org/download/ -``` - -要直接从命令行下载 ISO,请使用 `wget` 命令: - -``` -wget https://download.rockylinux.org/pub/rocky/8.5/isos/x86_64/Rocky-8.5-x86_64-minimal.iso -``` - -Rocky Linux ISO 的命名遵循以下约定: - -``` -Rocky-<主版本号#>.<次版本号#>-<架构>-<变体>.iso -``` - -例如 `Rocky-8.5-x86_64-minimal.iso` - -!!! note "说明" - - Rocky项目网页列出了几个镜像,它们位于全球各地。 选择地理位置离您最近的镜像。 官方镜像列表可在 [这里](https://mirrors.rockylinux.org/mirrormanager/mirrors) 找到。 - -## 验证安装的 ISO 文件 - -如果您已经在现有的 GNU/Linux 发行版上下载了 Rocky Linux ISO,那么可以使用 sha256sum 程序验证下载的文件没有损坏。 接下来通过一个示例,演示如何验证 `Rocky-8.5-x86_64-minimal.iso`。 - -首先下载包含可用于 ISO 的官方校验和的文件。 在包含已下载的Rocky Linux ISO的文件夹中下载ISO的校验和文件时,键入: - -``` -wget https://download.rockylinux.org/pub/rocky/8.7/isos/x86_64/CHECKSUM -``` - -使用 `sha256sum` 工具来验证ISO文件的完整性,防止损坏或者被篡改。 - -``` -sha256sum -c CHECKSUM --ignore-missing -``` - -这将检查先前下载的ISO文件的完整性,前提是该文件位于同一目录中。 输出应显示: - -``` -Rocky-8.7-x86_64-minimal.iso: OK -``` - -## 安装 - -!!! tip "提示" - - 在开始正确安装之前,系统的统一可扩展固件接口(UEFI)或基本输入/输出系统(BIOS)应配置为从正确的介质引导。 - -如果将计算机设置为从包含ISO文件的介质启动,则可以开始安装过程。 - -插入并从安装介质(光盘、USB闪存驱动器等)引导。 - -启动后,您将看到Rocky Linux的初始安装界面。 - -![Rocky Linux installation splash screen](images/installation_8.5_F01.png) - -如果您不按任何键,提示将开始倒计时,之后安装过程将自动执行默认的突出显示选项: - -`Test this media & install Rocky Linux 8` - -您还可以随时按 Enter 键立即启动该过程。 - -将执行快速介质验证步骤。 此介质验证步骤,可以避免您在中途安装发现安装程序因安装介质损坏导致中止安装的情况出现。 - -介质检查运行完成,并且介质被成功验证为可用后,安装程序将自动跳到下一个界面。 - -在界面中选择要用于执行安装的语言。 在本指南中,我们选择_English (United States)_。 然后单击Continue按钮。 - -## 安装信息摘要 - -_Installation Summary_ 是一个集合多种设置的区域,您可以在其中对要安装的操作系统做出重要决定。 - -界面大致分为以下几部分: - -- _Localization_:(键盘、语言支持以及时间和日期) -- _Software_:(安装源和软件选择) -- _System_:(安装目的地以及网络和主机名) - -接下来将深入研究其中的每一个部分,并在必要时进行更改。 - -### Localization部分 - -此部分用于自定义与系统区域设置相关的项目。 包括 — 键盘、语言支持、时间和日期。 - -#### 分组不同格式类型 - -在本指南的演示系统上,我们选择默认值 (_English US_) ,不做其他更改。 - -但是,如果需要在此处进行任何更改,请从 _Installation Summary_ 界面中单击 Keyboard 选项指定系统的键盘布局。 如果需要,可以在后续界面中添加其他键盘布局并指定其顺序。 - -完成后,单击 Done 。 - -#### Language Support - -安装摘要屏幕上的语言支持选项,使您能够指定对已完成系统上,可能需要的其他语言的支持。 - -此处接受默认值 (__English – United States__) ,不做任何更改。 单击 Done 。 - -#### Time & Date - -点击 Time & Date ,调出另一个界面,您可以通过该界面,选择机器所在的时区。 滚动区域和城市列表,选择离您最近的区域。 - -根据您的安装源,默认情况下可以将 _Network Time_ 选项设置为 _ON_ 或 _OFF_。 接受默认 _ON_ 设置;这允许系统使用网络时间协议 (NTP) 自动设置正确的时间。 进行任何更改后,请单击Done。 - -### Software部分 - -在 _Installation Summary_ 界面的 _Software_ 部分,您可以选择安装源以及要安装的其他软件包(应用程序)。 - -#### Installation Source - -由于我们使用完整的 Rocky 8 镜像进行安装,您会注意到,_安装源_ 部分下会自动指定本地介质。 我们将接受预设的默认设置。 - -!!! Tip "提示" - - 安装源区域是您可以选择执行基于网络安装的区域。 对于基于网络的安装,首先需要确保目标系统上的网络适配器配置正确,并且能够访问internet。 要执行基于网络的安装,请单击`Installation Source`,然后选择`On the network`单选按钮。 选择后,选择`https`作为协议,并在文本字段中键入以下URL `download.rockylinux.org/pub/rocky/8/BaseOS/x86_64/os`, 单击`Done`。 - -#### Software部分 - -单击Software Selection选项,将显示安装部分,从中您可以选择系统上要确定安装的软件包。 软件选择区域被划分为: - -- _Base Environment_ : 服务器、最小安装、自定义操作系统 -- _Additional software for Selected Environment area_ : 在左边选择一个基本环境,在右边呈现出可以为给定环境安装的各种相关附加软件。 - -我们这里选择 _最小安装_(基本功能)。 - -单击界面顶部的Done。 - -### System部分 - -_Installation Summary_界面用于自定义和更改目标系统的底层硬件。 在此处可以创建硬盘分区或LVM、指定要使用的文件系统,以及指定网络配置。 - -#### 安装目的地 - -在 _Installation Summary_ 界面上,点击 Installation Destination 选项。 这会将您带到相应的任务区域。 - -您将看到一个界面,显示目标系统上可用的所有候选磁盘驱动器。 如果系统上只有一个磁盘驱动器,如示例所示,您将看到在 _Local Standard Disks_ 下列出的驱动器,在它旁边有一个复选标记。 单击磁盘图标将打开或关闭磁盘选择复选标记。 我们在这里选择/勾选它。 - -在 _Storage Configuration_ 选项部分下,选择Automatic单选按钮。 - -然后单击界面顶部的 Done 。 - -安装程序确定有可用的磁盘后,将返回到 _Installation Summary_ 界面。 - -### Network & Hostname - -安装过程的最后一项任务是网络配置,您可以在其中配置或调整系统的网络相关设置。 - -!!! Note "说明" - - 单击 Network & Hostname 选项后,所有正确检测到的网络接口硬件(如以太网、无线网卡等)都将列在网络配置界面的左窗格中。 Linux 中以太网设备的名称类似于`eth0`、`eth1`、`ens3`、`ens4`、`em1`、`em2`、`p1p1`、`enp0s3`等,具体取决于 Linux 发行版和特定的硬件设置。 - -对于每个接口,您可以使用 DHCP 或手动配置 IP 地址。 如果您选择手动配置,请确保已准备好所有相关信息,如 IP 地址、子网掩码等。 - -单击 _Installation Summary_下的 Network & Hostname 按钮,将打开相应的配置界面。 此外,您还可以选择配置系统的主机名(默认为 `localhost.localdomain` )。 - -!!! Note "说明" - - 在安装操作系统之后,您可以很容易地更改此名称。 现在此处主机名为默认值。 - -下一个重要的配置任务与系统上的网络接口相关。 首先,验证左窗格中是否列出了以太网卡(或任何网卡)。 单击左窗格中检测到的任何网络设备,将其选中, 所选网络适配器的可配置属性将出现在界面的右窗格中。 - -!!! 在前面的例子中,这些参数与模块相同, 用 `=` 分隔的参数的值。 - - 在我们的示例系统中,我们有两个以太网设备(`ens3`和`ens4`),它们都处于连接状态。 您系统上的网络设备的类型、名称、数量和状态可能与示例系统上的不同。 - -确保要配置设备的开关在右窗格中处于 `ON` 位置。 我们将接受这一部分的所有默认值。 - -单击Done返回 _Installation Summary_ 主界面。 - -!!! Warning "警告" - - 注意此安装程序此部分服务器的 IP 地址。 如果您无法对系统进行物理或轻松的控制台访问,当您需要连接到服务器以继续使用它时,这些信息将在以后派上用场。 - -## 安装阶段 - -一旦您对各种安装任务的选择感到满意,安装过程的下一阶段将开始正确的安装。 - -### User Settings部分 - -此部分可用于为 `root` 用户帐户创建密码,也可用于创建新的管理员或非管理员帐户。 - -### 设置root密码 - -单击 _User Settings_ 下面的_Root Password_ ,启动_Root Password_任务界面。 在 _Root Password_ 文本框中,为 root 用户设置了一个强大的密码。 - -!!! Warning "警告" - - root超级用户是系统中具有最高特权的帐户。 因此,如果您选择使用或启用它,使用强密码保护此帐户就显得非常重要。 - -在 _Confirm_ 文本框中再次输入相同的密码。 - -单击Done。 - - -### 创建用户账户 - -接下来点击 _User Settings_ 下面的 _User Creation_ ,以启动 _Create User_任务界面。 此界面允许您在系统上创建特权或非特权(非管理)用户帐户。 - -!!! info "信息" - - !!! Info "资料" - 在系统上创建和使用非特权帐户执行日常任务是一种很好的系统管理习惯。 - -我们将创建一个常规的普通用户,在需要时可以调用超级用户(管理员)权限。 - -用以下信息填写 _Create User_ 屏幕中的字段,然后单击Done: - -_Full name_: `rockstar` - -_Username_: `rockstar` - -_Make this user administrator_: 选中 - -_Require a password to use this account_: 选中 - -_Password_: `04302021` - -_Confirm password_: `04302021` - -### 开始安装 - -一旦您对各种安装任务的选择感到满意,请单击主界面_Installation Summary_上的"开始安装"按钮。 安装将开始,安装程序将显示安装进度。 安装开始时,各种任务将开始在后台运行,例如对磁盘进行分区、格式化分区或LVM卷、检查并解决软件依赖关系、将操作系统写入磁盘等。 - -!!! Note "说明" - - 如果您不想在单击"开始安装"按钮后继续, 您仍然可以在不丢失数据的情况下安全地返回安装。 要退出安装程序,只需单击"Quit"按钮,按键盘上的ctrl-alt-del组合键,或者按下重置或电源开关,即可重置系统。 - -### 完成安装 - -完成所有必需的子任务且安装程序运行完毕后,您将看到带有安装进度完毕的屏幕信息。 - -最后,单击Reboot System按钮来完成整个过程, 系统将重启。 - -### 登录 - -该系统现在已经设置好且可以使用了。 您将看到Rocky Linux控制台。 - -![Rocky Linux 欢迎界面](images/installation_8.5_F02.png) - -要登录到系统,请在登录提示处键入 `rockstar`,然后按 Enter 键。 - -在密码提示处,键入 `04302021`(rockstar 的密码),然后按 Enter 键(密码将 ***不会*** 显示在屏幕上,这是正常的)。 - -登录后运行`whoami`命令,该命令显示当前登录用户的名称。 - -![Login Screen](images/installation-F06.png) diff --git a/docs/guides/9_6_installation.it.md b/docs/guides/9_6_installation.it.md deleted file mode 100644 index e902237943..0000000000 --- a/docs/guides/9_6_installation.it.md +++ /dev/null @@ -1,304 +0,0 @@ ---- -Title: Installazione di Rocky Linux 9 -author: Wale Soyinka -contributors: Steven Spencer, Ganna Zhyrnova ---- - -# Installazione di Rocky Linux 9 - -Questa è una guida dettagliata per l'installazione di una versione a 64 bit della distribuzione Rocky Linux su un sistema standalone. Verrà eseguita un'installazione server-class e verranno illustrate le opzioni di installazione e personalizzazione. - -## Prerequisiti per l'installazione del sistema operativo - -Scaricate la ISO da utilizzare per questa installazione di Rocky Linux.\ -È possibile scaricare l'ultima immagine ISO della versione di Rocky Linux per questa installazione qui: - - - -Per scaricare l'ISO direttamente dalla riga di comando su un sistema Linux esistente, utilizzare il comando `wget`: - -```bash -wget https://download.rockylinux.org/pub/rocky/9/isos/x86_64/Rocky-9.6-x86_64-minimal.iso -``` - -Le ISO di Rocky Linux seguono questa convenzione di denominazione: - -```text -Rocky-.--.iso -``` - -Per esempio, `Rocky-9.6-x86_64-minimal.iso` - -!!! Note - - ``` - Il sito web del Rocky Project elenca diversi mirror situati in tutto il mondo. Selezionate il mirror geograficamente più vicino a voi. L'elenco dei mirror ufficiali è disponibile [qui] (https://mirrors.rockylinux.org/mirrormanager/mirrors). - ``` - -## Verifica del file ISO del programma di installazione - -Se avete scaricato le ISO di Rocky Linux su una distribuzione Linux esistente, potete usare l'utility `sha256sum` per verificare che i file scaricati non siano corrotti. Dimostreremo come verificare il file `Rocky-9.6-x86_64-minimal.iso` controllando il suo checksum. - -1. Scaricate il file che contiene le checksum ufficiali delle ISO disponibili. - -2. Mentre ci si trova ancora nella cartella che contiene l'ISO di Rocky Linux scaricata, scaricare il file di checksum dell'ISO, digitare: - - ```bash - wget -O CHECKSUM https://download.rockylinux.org/pub/rocky/9/isos/x86_64/CHECKSUM - ``` - -3. Utilizzare l'utilità `sha256sum` per verificare l'integrità del file ISO contro la corruzione o la manomissione. - - ```bash - sha256sum -c CHECKSUM --ignore-missing - ``` - - Controllerà l'integrità del file ISO scaricato in precedenza, a condizione che si trovi nella stessa directory. Si dovrebbe vedere questo risultato: - - ```text - Rocky-9.6-x86_64-minimal.iso: OK - ``` - -## Installazione - -!!! tip - - Prima di iniziare l'installazione vera e propria, la Unified Extensible Firmware Interface (UEFI) o il Basic Input/Output System (BIOS) del sistema devono essere preconfigurati per l'avvio dal supporto corretto. - -Se il computer è impostato per l'avvio dal supporto che contiene il file ISO, possiamo iniziare il processo di installazione. - -1. Inserire e avviare il supporto di installazione (ad esempio, disco ottico, unità flash USB). - -2. Dopo l'avvio del computer, viene visualizzata la schermata iniziale di benvenuto di Rocky Linux 9.6. - - ![Rocky Linux installation splash screen](images/installation_9_6_F01.png) - -3. Se non si preme alcun tasto, il programma di installazione avvia un conto alla rovescia, al termine del quale il processo di installazione esegue automaticamente l'opzione predefinita, evidenziata: - - `Test this media & install Rocky Linux 9.6` - - È anche possibile premere ++enter++ in qualsiasi momento per avviare immediatamente il processo. - -4. Viene eseguita una rapida fase di verifica dei supporti.\ - Questa fase di verifica del supporto può evitare di avviare l'installazione per poi scoprire a metà strada che il programma di installazione deve essere interrotto a causa di un supporto di installazione difettoso. - -5. Una volta completato il controllo del supporto e verificata la sua utilizzabilità, il programma di installazione passa automaticamente alla schermata successiva. - -6. Selezionare la lingua che si desidera utilizzare per l'installazione di questa schermata. Per questa guida, si seleziona _English (United States)_. Quindi fare clic sul pulsante ++“continua ”++. - -## Riepilogo Installazione - -La schermata `Installation Summary` è un'area completa in cui si prendono decisioni importanti sull'installazione del sistema. - -La schermata è suddivisa grossomodo nelle seguenti sezioni: - - - _LOCALIZATION_ - - _SOFTWARE_ - - _SYSTEM_ - - _USER SETTINGS_ - -Si approfondiranno ciascuna di queste sezioni, apportando le modifiche necessarie. - -### Sezione Localization - -Questa sezione consente di personalizzare le voci relative alla posizione geografica del sistema. Tra questi: tastiera, supporto della lingua, ora e data. - -#### Tastiera - -Nel sistema demo di questa guida, si accetta il valore predefinito (_English US_) e non si apporta alcuna modifica. - -Tuttavia, se è necessario apportare modifiche, dalla schermata _Installation Summary_, fare clic sull'opzione ++"keyboard"++ per specificare il layout della tastiera del sistema. Con il pulsante ++plus++ è possibile aggiungere altri layout di tastiera, se necessario, nella schermata successiva e selezionare l'ordine preferito. - -Al termine di questa schermata, fare clic su ++“done ”++. - -#### Supporto Lingua - -L'opzione `Language Support` nella schermata _Installation Summary_ consente di specificare il supporto per altre lingue. - -Si accetterà il valore predefinito, **English (United States)**, e non si apporterà alcuna modifica. Fare clic su "Done". - -#### Time & Date - -Fare clic sull'opzione ++"Time & Date"++ nella schermata principale _Riepilogo installazione_ per visualizzare un'altra schermata che consente di selezionare il fuso orario in cui si trova la macchina. Scorrete l'elenco delle regioni e delle città e selezionate l'area più vicina a voi. - -A seconda dell'origine dell'installazione, l'opzione _Network Time_ potrebbe essere _ON_ o _OFF_ per impostazione predefinita. Accettare l'impostazione predefinita _ON_. Ciò consente al sistema di impostare automaticamente l'ora corretta utilizzando il Network Time Protocol (NTP). - -Fare clic su ++“done ”++ dopo aver apportato le modifiche. - -### Sezione Software - -Nella sezione _Software_ della schermata _Installation Summary_, è possibile selezionare o modificare l'origine dell'installazione e i pacchetti aggiuntivi (applicazioni) che vengono installati. - -#### Origine d'Installazione - -Poiché l'installazione utilizza un'immagine ISO di Rocky Linux 9.6, si noterà che _Local Media_ è specificato automaticamente nella sezione Origine dell'installazione della schermata principale _Installation Summary_. È possibile accettare le impostazioni predefinite. - -!!! Tip - - ``` - L'area Source dell'installazione consente di eseguire un'installazione network-based (ad esempio, se si utilizza la ISO di avvio di Rocky Linux - Rocky-9.6-x86_64-boot.iso). Per un'installazione network-based, è necessario innanzitutto assicurarsi che una scheda di rete sul sistema di destinazione sia configurata correttamente e possa accedere a Internet. Per eseguire un'installazione network-based, fare clic su +++"Installation Source"++ e selezionare il pulsante di opzione ++"On the network"++. Una volta selezionato, scegliere il protocollo corretto e digitare l'URI dell'origine dell'installazione. Fare clic su ++"Done"++. - ``` - -#### Sezione Software - -Facendo clic sull'opzione ++"Software Selection"++ nella schermata principale _Installation Summary_ si accede alla sezione dell'installazione in cui è possibile selezionare gli esatti pacchetti software installati sul sistema. Esistono due aree di selezione del software: - - - **Ambiente di base**: Installazione minima e sistema operativo personalizzato - - **Software aggiuntivo per l'ambiente selezionato**: La selezione di un ambiente di base sul lato sinistro presenta una serie di software aggiuntivi da installare per l'ambiente in questione sul lato destro. - -Selezionare l'opzione _Minimal Install_ (funzionalità di base). - -Fare clic su ++“done ”++ nella parte superiore dello schermo. - -### Sezione di Sistema - -Utilizzare la sezione Sistema della schermata _Installation Summary_ per personalizzare e apportare modifiche all'hardware sottostante del sistema di destinazione. Qui si creano le partizioni o i volumi del disco rigido, si specifica il file system, la configurazione di rete, si attiva o disattiva KDUMP o si seleziona un profilo di sicurezza. - -#### Destinazione d'Installazione - -Nella schermata _Installation Summary_, fare clic sull'opzione ++"Installation Destination"++. Si accede così all'area operativa corrispondente. - -Verrà visualizzata una schermata con tutte le unità disco candidate disponibili sul sistema di destinazione. Se nel sistema è presente una sola unità disco, come nel nostro sistema campione, l'unità viene elencata sotto _Local Standard Disks_ con un segno di spunta accanto. Facendo clic sull'icona del disco si attiva o disattiva il segno di spunta della selezione del disco. Mantenere la spunta per selezionare il disco. - -Nella sezione _Storage Configuration_: - -1. Selezionare il pulsante di opzione ++“Automatic”++. - -2. Fare clic su ++“done ”++ nella parte superiore dello schermo. - -3. Una volta accertato che il disco è utilizzabile, il programma di installazione torna alla schermata _Installation Summary_. - -### Network & Host Name - -Il seguente importante compito della procedura di installazione, nell'area Sistema, riguarda la configurazione di rete, dove è possibile configurare o modificare le impostazioni relative alla rete del sistema. - -!!! Note - - ``` - Dopo aver fatto clic sull'opzione ++"Network & Hostname"++ , tutti i dispositivi di interfaccia di rete correttamente rilevati (come schede di rete Ethernet, wireless, ecc.) saranno elencati nel riquadro sinistro della schermata di configurazione della rete. A seconda della configurazione hardware specifica, i dispositivi Ethernet in Linux hanno nomi simili a `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3` e così via. - È possibile configurare ogni interfaccia utilizzando DHCP o impostando manualmente l'indirizzo IP. - Se si sceglie di configurare manualmente, assicurarsi di avere pronte tutte le informazioni necessarie, come l'indirizzo IP, la netmask e altri dettagli rilevanti. - ``` - -Facendo clic sul pulsante ++"Network & Hostname"++ nella schermata principale _Installation Summary_ si apre la schermata di configurazione corrispondente. Tra le altre cose, è possibile configurare l'hostname del sistema. - -!!! Note - - ``` - È possibile modificare facilmente l'hostname del sistema in un secondo momento, dopo l'installazione del sistema operativo. - ``` - -La seguente importante operazione di configurazione riguarda le interfacce di rete del sistema. - -1. Verificare che nel riquadro di sinistra sia elencata una scheda Ethernet (o qualsiasi altra scheda di rete) -2. Fare clic su uno qualsiasi dei dispositivi di rete rilevati nel riquadro di sinistra per selezionarlo.\ - Le proprietà configurabili dell'adattatore di rete selezionato appaiono nel riquadro destro della schermata. - -!!! Note - - ``` - Nel nostro sistema campione, abbiamo due dispositivi Ethernet (`ens3` e `ens4`), tutti in stato di connessione. Il tipo, il nome, la quantità e lo stato dei dispositivi di rete sul vostro sistema potrebbero essere diversi da quelli del nostro sistema demo. - ``` - -Verificare che l'interruttore del dispositivo che si desidera configurare sia in posizione `ON` (blu) nel riquadro di destra. -In questa sezione verranno accettate tutte le impostazioni predefinite. - -Fare clic su ++"done "++ per tornare alla schermata principale _Installation Summary_. - -!!! Warning "Attenzione" - - ``` - Prestare attenzione all'indirizzo IP del server in questa sezione del programma di installazione. Supponiamo che non si disponga di un accesso fisico o facile alla console del sistema. In tal caso, queste informazioni saranno utili in seguito, quando sarà necessario collegarsi al server per continuare a lavorarci dopo il completamento dell'installazione del sistema operativo (OS). - ``` - -### Sezione User Settings - -Utilizzare questa sezione per creare una password per l'account utente `root` e per creare nuovi account amministrativi o non amministrativi. - -#### Root Password - -1. Fare clic sul campo _Root Password_ in _User Settings_ per avviare la schermata dell'attività _Root Password_. - - !!! Warning "Attenzione" - - ``` - Il superutente root è l'account più privilegiato del sistema. Se si sceglie di utilizzarlo o abilitarlo, è necessario proteggere questo account con una password forte. - ``` - -2. Nella casella di testo _Root Password_, impostare una password forte per l'utente root. - -3. Immettere nuovamente la stessa password nella casella di testo _Confirm_. - -4. Fare clic su ++"done"++. - -#### User Creation - -Per creare l'utente: - -1. Fare clic sul campo _User Creation_ in _User Settings_ per avviare la schermata dell'attività _Create User_.\ - Quest'area operativa consente di creare un account utente privilegiato (amministrativo) o non privilegiato (non amministrativo). - - !!! Info - - ``` - La creazione e l'uso di un account non privilegiato per le attività quotidiane di un sistema è una pratica ottimale nell'amministrazione del sistema. - ``` - - Sarà creato un utente normale che può invocare i poteri di superutente (amministratore) quando necessario. - -2. Completate i campi della schermata _Create User_ con le seguenti informazioni: - - - **Full name**: - `rockstar` - - **Username**: - `rockstar` - - **Make this user administrator**: - Selezionato - - **Require a password to use this account**: - Selezionato - - **Password**: - `04302021` - - **Confirm password**: - `04302021` - -3. Fare clic su ++"done"++. - -## Fase dell'Installer - -Una volta soddisfatti delle scelte fatte per le varie operazioni di installazione, inizierà la fase successiva del processo di installazione: l'installazione vera e propria. - -### Inizio Installazione - -Una volta soddisfatti delle scelte effettuate per le varie operazioni di installazione, fare clic sul pulsante ++"Begin Installation"++ nella schermata principale Installation Summary\*. - -L'installazione avrà inizio e l'installer mostrerà l'avanzamento dell'installazione. -Dopo l'avvio dell'installazione, vengono eseguite varie attività in background, tra cui il partizionamento del disco, la formattazione delle partizioni o dei volumi LVM, la verifica e la risoluzione delle dipendenze software e la scrittura del sistema operativo sul disco. - -!!! Note - - ``` - Se non si desidera continuare dopo aver fatto clic sul pulsante Inizia l'installazione, si può comunque uscire dall'installazione senza perdere i dati. Per uscire dal programma di installazione, è sufficiente resettare il sistema facendo clic sul pulsante Esci, premendo Ctrl-Alt-Canc sulla tastiera o premendo l'interruttore di reset o di alimentazione. - ``` - -### Completare l'Installazione - -Dopo che il programma di installazione ha completato il suo lavoro, verrà visualizzata una schermata finale di avanzamento dell'installazione con un messaggio di completamento. - -Infine, completare l'intera procedura facendo clic sul pulsante ++"Reboot System"++. Il sistema verrà riavviato. - -### Log In - -Il sistema è ora impostato e pronto per l'uso. Verrà visualizzata la console Rocky Linux. - -![Rocky Linux Welcome Screen](images/installation_9_F02.png) - -Per accedere al sistema: - -1. Digitare `rockstar` al prompt di login e premere ++enter++. - -2. Al prompt della password, digitate `04302021` (la password di Rockstar) e premete ++invio++ (la password non verrà riecheggiata sullo schermo, è normale). - -3. Eseguire il comando `whoami` dopo il login.\ - Questo comando mostra il nome dell'utente attualmente collegato. - -![Login Screen](images/installation_9.0_F03.png) diff --git a/docs/guides/9_6_installation.md b/docs/guides/9_6_installation.md deleted file mode 100644 index 56156b5b6f..0000000000 --- a/docs/guides/9_6_installation.md +++ /dev/null @@ -1,286 +0,0 @@ ---- -Title: Installing Rocky Linux 9 -author: Wale Soyinka -contributors: Steven Spencer, Ganna Zhyrnova ---- - -# Installing Rocky Linux 9 - -This is a detailed guide for installing a 64-bit version of the Rocky Linux distribution on a standalone system. We will perform a server-class installation and walk through the installation and customization options. - -## Operating System Installation Prerequisites - -Download the ISO to use for this installation of Rocky Linux. -You can download the latest ISO image for the version of Rocky Linux for this installation here: - - - -To download the ISO directly from the command line on an existing Linux-based system, use the `wget` command: - -```bash -wget https://download.rockylinux.org/pub/rocky/9/isos/x86_64/Rocky-9.6-x86_64-minimal.iso -``` - -Rocky Linux ISOs follow this naming convention: - -```text -Rocky-.--.iso -``` - -For example, `Rocky-9.6-x86_64-minimal.iso` - -!!! Note - - The Rocky Project website lists several mirrors located around the world. Select the mirror that is geographically closest to you. The list of official mirrors can be found [here](https://mirrors.rockylinux.org/mirrormanager/mirrors). - -## Verifying the Installation Program ISO File - -If you've downloaded the Rocky Linux ISO(s) on an existing Linux distribution, you can use the `sha256sum` utility to verify that the file(s) you downloaded are not corrupt. We will demonstrate how to verify the `Rocky-9.6-x86_64-minimal.iso` file by checking its checksum. - -1. Download the file that contains the official checksums for the available ISOs. - -1. While still in the folder that contains the downloaded Rocky Linux ISO, download the checksum file for the ISO, type: - - ```bash - wget -O CHECKSUM https://download.rockylinux.org/pub/rocky/9/isos/x86_64/CHECKSUM - ``` - -1. Use the `sha256sum` utility to verify the integrity of the ISO file against corruption or tampering. - - ```bash - sha256sum -c CHECKSUM --ignore-missing - ``` - - This checks the integrity of the previously downloaded ISO file, provided it is in the same directory. You should see this output: - - ```text - Rocky-9.6-x86_64-minimal.iso: OK - ``` - -## The Installation - -!!! tip - - Before installing, the system’s Unified Extensible Firmware Interface (UEFI) or Basic Input/Output System (BIOS) must be preconfigured to boot from the correct medium. - -If you set the computer up to boot from the media with the ISO file, you can begin the installation. - -1. Insert and boot from the installation medium (e.g., optical disk, USB flash drive). - -2. Once the computer has booted, you see the Rocky Linux 9.6 welcome splash screen. - - ![Rocky Linux installation splash screen](images/installation_9_6_F01.png) - -3. If you do not press any key, the installation program starts a countdown, after which the installation process automatically executes the default, highlighted option: - - `Test this media & install Rocky Linux 9.6` - - You can also press ++enter++ at any time to start the process immediately. - -4. A quick media verification step takes place. -This media verification step can save you the trouble of starting the installation only to discover halfway through that the installation program has to stop due to faulty installation media. - -5. After the media check is completed and the media is successfully verified as usable, the installation program automatically proceeds to the next screen. - -6. Select the language you want to use to install this screen. For this guide, we select *English (United States)*. Then click the ++"continue"++ button. - -## Installation Summary - -The `Installation Summary` screen is an all-in-one area where you make important decisions about installing the system. - -The screen is roughly divided into the following sections: - -- *LOCALIZATION* -- *SOFTWARE* -- *SYSTEM* -- *USER SETTINGS* - -We will delve into each of these sections next and make any necessary changes. - -### Localization Section - -This section customizes items related to the system's geographic location. This includes – Keyboard, Language Support, Time and Date. - -#### Keyboard - -In this guide's demo system, we accept the default value (*English US*) and make no changes. - -However, if you need to make any changes here, from the *Installation Summary* screen, click the ++"keyboard"++ option to specify the system's keyboard layout. Using the ++plus++ button, you can add additional keyboard layouts if you need to in the ensuing screen and even select your preferred order. - -When you finish with this screen, click ++"done"++. - -#### Language Support - -The `Language Support` option on the *Installation Summary* screen lets you specify support for additional languages. - -We will accept the default value, **English (United States)**, and make no changes. Click "Done". - -#### Time & Date - -Click the ++"Time & Date"++ option on the main *Installation Summary* screen to bring up another screen that allows for the selection of the timezone where the machine is. Scroll through the list of regions and cities and select the area closest to you. - -Depending on your installation source, the *Network Time* option might be *ON* or *OFF* by default. Accept the default *ON* setting. This allows the system to automatically set the correct time by using the Network Time Protocol (NTP). - -Click ++"done"++ after making any changes. - -### Software Section - -Under the *Software* section of the *Installation Summary* screen, you can select or change the installation source as well as additional packages (applications) that get installed. - -#### Installation Source - -Because the installation uses a Rocky Linux 9.6 ISO image, you will notice that *Local Media* is automatically specified under the Installation Source section of the main *Installation Summary* screen. You can accept the preset defaults. - -!!! Tip - - The installation Source area allows you to perform a network-based installation (for example, if you use the Rocky Linux boot ISO - Rocky-9.6-x86_64-boot.iso). For a network-based installation, you must first ensure that a network adapter on the target system is configured correctly and can access the internet. To perform a network-based installation, click ++"Installation Source"++ and then select the ++"On the network"++ radio button. Once selected, choose the correct protocol and type in the URI for the installation source. Click ++"Done"++. - -#### Software Selection - -Clicking the ++"Software Selection"++ option on the main *Installation Summary* screen presents you with the installation section where you can select the exact software packages installed on the system. There are two software selection areas: - -- **Base Environment**: Minimal Installation and Custom operating system -- **Additional software for Selected Environment**: Selecting a Base Environment on the left side presents a variety of related additional software to install for the given environment on the right side. - -Select the *Minimal Install* (Basic functionality) option. - -Click ++"done"++ at the top of the screen. - -### System Section - -Use the System section of the *Installation Summary* screen for customizing and making changes to things related to the underlying hardware of the target system. This is where you create your hard disk drive partitions or volumes, specify the file system, specify the network configuration, enable or disable KDUMP, or select a Security Profile. - -#### Installation Destination - -From the *Installation Summary* screen, click the ++"Installation Destination"++ option. This takes you to the corresponding task area. - -You will see a screen displaying all the candidate disk drives available on the target system. If you have only one disk drive on the system, as on our sample system, you see the drive listed under *Local Standard Disks* with a checkmark beside it. Clicking the disk icon toggles the disk selection checkmark on or off. Keep it checked to select the disk. - -Under the *Storage Configuration* section: - -1. Select the ++"Automatic"++ radio button. - -2. Click ++"done"++ at the top of the screen. - -3. Once the installation program determines that you have a usable disk, it returns to the *Installation Summary* screen. - -### Network & Host Name - -The following important task of the installation procedure under the System area deals with network configuration, where you can configure or tweak network-related settings for the system. - -!!! Note - - After you click on the ++"Network & Hostname"++ option, all correctly detected network interface hardware (such as Ethernet, wireless network cards, etc.) will be listed in the left pane of the network configuration screen. Depending on your specific hardware setup, Ethernet devices in Linux have names similar to `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3`, and so on. - You can configure each interface using DHCP or manually set the IP address. - If you choose to configure manually, ensure that you have all the required information ready, such as the IP address, netmask, and other relevant details. - -Clicking the ++"Network & Hostname"++ button in the main *Installation Summary* screen opens the corresponding configuration screen. Here, you can configure the system's hostname. - -!!! Note - - You can easily change the system hostname later on after the OS has been installed. - -The following important configuration task pertains to the system's network interfaces. - -1. Verify that the left pane lists an Ethernet card (or any network card). -2. Click any of the detected network devices in the left pane to select it. -The selected network adapter's configurable properties appear in the right pane of the screen. - -!!! Note - - On our sample system, we have two Ethernet devices (`ens3` and `ens4`), all of which are in a connected state. The type, name, quantity, and state of the network devices on your system may differ from those on our demo system. - -Verify that the switch of the device you want to configure is in the `ON` (blue) position in the right pane. -We will accept all the defaults in this section. - -Click ++"done"++ to return to the main *Installation Summary* screen. - -!!! Warning - - Pay attention to the IP address of the server in this section of the installer. Suppose you do not have physical or easy console access to the system. In that case, this information will be helpful later when you need to connect to the server to continue working on it after the operating system (OS) installation is complete. - -### User Settings Section - -Use this section to create a password for the `root` user account and to create new administrative or non-administrative accounts. - -#### Root Password - -1. Click the *Root Password* field under *User Settings* to start the *Root Password* task screen. - - !!! Warning - - The root superuser is the most privileged account on the system. If you choose to use or enable it, you must protect this account with a strong password. - -2. In the *Root Password* text box, set a strong password for the root user. - -3. Enter the same password again in the *Confirm* text box. - -4. Click ++"done"++. - -#### User Creation - -To create a user: - -1. Click the *User Creation* field under *User Settings* to start the *Create User* task screen. -This task area is for creating a privileged (administrative) or non-privileged (non-administrative) user account. - - !!! Info - - Creating and using a non-privileged account for day-to-day tasks on a system is a best practice in system administration. - - We will create a regular user that can invoke superuser (administrator) powers when needed. - -2. Complete the fields in the *Create User* screen with the following information: - - - **Full name**: - `rockstar` - - **Username**: - `rockstar` - - **Make this user administrator**: - Checked - - **Require a password to use this account**: - Checked - - **Password**: - `04302021` - - **Confirm password**: - `04302021` - -3. Click ++"done"++. - -## Installer Phase - -Once you are satisfied with your choices for the various installation tasks, the next phase of the installation process will begin: the actual installation. - -### Start the Installation - -Once satisfied with your choices for the various installation tasks, click the ++"Begin Installation"++ button on the main *Installation Summary* screen. - -The installation will begin, and the installation program will show the progress of the installation. -After the installation begins, various tasks will run in the background, including partitioning the disk, formatting the partitions or LVM volumes, checking for and resolving software dependencies, and writing the operating system to the disk. - -!!! Note - - If you do not wish to continue after clicking the Begin Installation button, you can still safely exit the installation without losing data. To quit the installer, simply reset your system by clicking the Quit button, pressing Ctrl-Alt-Delete on the keyboard, or pushing the reset or power switch. - -### Complete the Installation - -After the installation program has completed its work, you will see a final installation progress screen with a complete message. - -Finally, complete the entire procedure by clicking the ++"Reboot System"++ button. The system restarts. - -### Log In - -The system is now set up and ready for use. You will see the Rocky Linux console. - -![Rocky Linux Welcome Screen](images/installation_9_F02.png) - -To log onto the system: - -1. Type `rockstar` at the login prompt and press ++enter++. - -2. At the Password prompt, type `04302021` (rockstar’s password) and press ++enter++ (the password will ***not*** be echoed to the screen, that is normal). - -3. Run the `whoami` command after login. -This command shows the name of the currently logged-in user. - -![Login Screen](images/installation_9.0_F03.png) diff --git a/docs/guides/9_6_installation.uk.md b/docs/guides/9_6_installation.uk.md deleted file mode 100644 index 6bacff4ade..0000000000 --- a/docs/guides/9_6_installation.uk.md +++ /dev/null @@ -1,306 +0,0 @@ ---- -Title: Встановлення Rocky Linux 9 -author: Wale Soyinka -contributors: Steven Spencer, Ganna Zhyrnova ---- - -# Встановлення Rocky Linux 9 - -Це детальний посібник із встановлення 64-розрядної версії дистрибутива Rocky Linux в автономній системі. Ми виконаємо інсталяцію серверного класу та розглянемо варіанти інсталяції та налаштування. - -## Необхідні умови для встановлення операційної системи - -Завантажте ISO-файл для цієї установки Rocky Linux.\ -Ви можете завантажити найновіший ISO-образ для версії Rocky Linux для цієї установки тут: - - - -Щоб завантажити ISO-образ безпосередньо з командного рядка на існуючій системі на базі Linux, скористайтеся командою `wget`: - -```bash -wget https://download.rockylinux.org/pub/rocky/9/isos/x86_64/Rocky-9.6-x86_64-minimal.iso -``` - -ISO Rocky Linux дотримується цієї угоди про іменування: - -```text -Rocky-.--.iso -``` - -Наприклад, `Rocky-9.6-x86_64-minimal.iso` - -!!! Note "Примітка" - - ``` - На вебсайті Rocky Project перелічено кілька дзеркал, розташованих по всьому світу. Виберіть дзеркало, яке географічно найближче до вас. Список офіційних дзеркал можна знайти [тут](https://mirrors.rockylinux.org/mirrormanager/mirrors). - ``` - -## Перевірка файлу ISO програми встановлення - -Якщо ви завантажили ISO-образ Rocky Linux на існуючий дистрибутив Linux, ви можете скористатися утилітою `sha256sum`, щоб перевірити, чи завантажені вами файли не пошкоджені. Ми продемонструємо, як перевірити файл `Rocky-9.6-x86_64-minimal.iso`, перевіривши його контрольну суму. - -1. Завантажте файл, який містить офіційні контрольні суми для доступних ISO. - -2. Перебуваючи в папці, яка містить завантажений ISO Rocky Linux, завантажте файл контрольної суми для ISO, введіть: - - ```bash - wget -O CHECKSUM https://download.rockylinux.org/pub/rocky/9/isos/x86_64/CHECKSUM - ``` - -3. Використовуйте утиліту `sha256sum` для перевірки цілісності ISO-файлу на предмет пошкодження або несанкціонованого втручання. - - ```bash - sha256sum -c CHECKSUM --ignore-missing - ``` - - Це перевіряє цілісність файлу ISO, завантаженого раніше, за умови, що він знаходиться в тому самому каталозі. Ви повинні побачити цей вивід: - - ```text - Rocky-9.6-x86_64-minimal.iso: OK - ``` - -## Встановлення - -!!! tip - - Перед належним встановленням уніфікований розширюваний інтерфейс вбудованого програмного забезпечення (UEFI) або базову систему введення/виведення (BIOS) потрібно попередньо налаштувати для завантаження з правильного носія. - -Якщо ви налаштували комп'ютер на завантаження з носія з ISO-файлом, ви можете розпочати встановлення. - -1. Вставте та завантажтеся з інсталяційного носія (оптичний диск, флешка тощо). - -2. Після завантаження комп'ютера ви побачите вітальний екран Rocky Linux 9.6. - - ![Rocky Linux installation splash screen](images/installation_9_6_F01.png) - -3. Якщо ви не натиснете жодної клавіші, програма встановлення почне зворотний відлік, після чого процес встановлення автоматично виконає виділений параметр за замовчуванням: - - `Test this media & install Rocky Linux 9.6` - - Ви також можете будь-коли натиснути ++enter++, щоб негайно розпочати процес. - -4. Відбувається швидка перевірка медіа.\ - Цей крок перевірки носія може позбавити вас клопоту з початком інсталяції, після якого ви виявляєте, що програма інсталяції має бути зупинена через несправний інсталяційний носій. - -5. Після завершення перевірки носія та його придатності до використання програма встановлення автоматично переходить до наступного екрана. - -6. Виберіть мову, яку ви хочете використовувати для встановлення цього екрана. Для цього посібника ми обрали _English (United States)_. Потім натисніть кнопку ++"continue"++. - -## Підсумок встановлення - -Екран «Підсумок встановлення» – це універсальна область, де ви приймаєте важливі рішення щодо встановлення системи. - -Екран приблизно поділено на такі частини: - - - _LOCALIZATION_ - - _SOFTWARE_ - - _SYSTEM_ - - _USER SETTINGS_ - -Далі ми розглянемо кожен із цих розділів і внесемо необхідні зміни. - -### Розділ Localization - -Цей розділ налаштовує елементи, пов’язані з географічним розташуванням системи. Це включає – клавіатуру, підтримку мови, час і дату. - -#### Клавіатура - -У демонстраційній системі цього посібника ми приймаємо значення за замовчуванням (_англійська (США)_) і не вносимо жодних змін. - -Однак, якщо вам потрібно внести будь-які зміни тут, на екрані _Підсумок встановлення_ натисніть опцію ++"клавіатура"++, щоб указати розкладку клавіатури системи. Використовуючи кнопку ++plus++, ви можете додати додаткові розкладки клавіатури, якщо потрібно, на наступному екрані та навіть вказати бажаний порядок. - -Коли ви закінчите з цим екраном, натисніть кнопку ++"готово"++. - -#### Підтримка мови - -Опція «Підтримка мов» на екрані _Підсумок встановлення_ дозволяє вказати підтримку додаткових мов. - -Ми приймемо значення за замовчуванням, **Англійська (Сполучені Штати)**, і не внесемо жодних змін. Натисніть `Готово`. - -#### Час і дата - -Натисніть опцію ++"Час і дата"++ на головному екрані _Підсумок встановлення_, щоб відкрити ще один екран, на якому можна вибрати часовий пояс, у якому знаходиться машина. Прокрутіть список регіонів і міст і виберіть найближчу до вас область. - -Залежно від джерела інсталяції, параметр _Мережевий час_ може бути за замовчуванням _УВІМК._ або _ВИМК._. Прийміть налаштування за замовчуванням _УВІМК._. Це дозволяє системі автоматично встановлювати правильний час за допомогою протоколу мережевого часу (NTP). - -Натисніть ++"done"++ після внесення будь-яких змін. - -### Розділ програмного забезпечення - -У розділі _Програмне забезпечення_ на екрані _Підсумок встановлення_ ви можете вибрати або змінити джерело встановлення, а також додаткові пакети (програми), які встановлюються. - -#### Джерело встановлення - -Оскільки під час встановлення використовується ISO-образ Rocky Linux 9.6, ви помітите, що _Локальний носій_ автоматично вказується в розділі «Джерело встановлення» на головному екрані _Підсумок встановлення_. Ви можете прийняти стандартні налаштування. - -!!! Tip "Порада" - - ``` - Розділ «Джерело інсталяції» дозволяє виконати мережеву інсталяцію (наприклад, якщо ви використовуєте завантажувальний ISO-образ Rocky Linux — Rocky-9.6-x86_64-boot.iso). Для мережевої інсталяції переконайтеся, що мережевий адаптер на цільовій системі налаштовано правильно та має доступ до Інтернету. Щоб виконати мережеву інсталяцію, натисніть ++«Джерело інсталяції»++, а потім виберіть перемикач ++«У мережі»++. Після вибору виберіть правильний протокол і введіть URI для джерела інсталяції. Натисніть ++«Готово»++. - ``` - -#### Вибір програмного забезпечення - -Натискання опції ++"Вибір програмного забезпечення"++ на головному екрані _Підсумок встановлення_ відкриє розділ встановлення, де ви можете вибрати точні пакети програмного забезпечення, встановлені в системі. Існує дві області вибору програмного забезпечення: - - - **Базове середовище**: Мінімальна інсталяція та користувацька операційна система - - **Додаткове програмне забезпечення для вибраного середовища**: Вибір базового середовища ліворуч відображає різноманітне додаткове програмне забезпечення для встановлення для цього середовища праворуч. - -Виберіть опцію _Мінімальна інсталяція_ (базова функціональність). - -Натисніть ++"done"++ у верхній частині екрана. - -### Системний розділ - -Використовуйте розділ «Система» на екрані _Підсумок встановлення_ для налаштування та внесення змін до параметрів, пов’язаних з базовим обладнанням цільової системи. Тут ви створюєте розділи або томи жорсткого диска, вказуєте файлову систему, вказуєте конфігурацію мережі, увімкніть або вимкніть KDUMP або виберіть профіль безпеки. - -#### Місце призначення - -На екрані _Підсумок встановлення_ виберіть опцію ++"Місце призначення встановлення"++. Це приведе вас до відповідної області завдань. - -Ви побачите екран із усіма дисками-кандидатами, доступними у цільовій системі. Якщо у вашій системі лише один дисковод, як у нашій зразковій системі, ви побачите диск у списку _Локальні стандартні диски_ з позначкою поруч із ним. Клацання на значку диска вмикає або вимикає позначку вибору диска. Поставте прапорець, щоб вибрати диск. - -У розділі _Конфігурація сховища_: - -1. Виберіть перемикач ++"Automatic"++. - -2. Натисніть ++"done"++ у верхній частині екрана. - -3. Щойно програма встановлення визначить, що у вас є вільний диск, вона повернеться до екрана _Підсумок встановлення_. - -### Мережа та ім'я хоста - -Наступне важливе завдання процедури встановлення в розділі «Система» стосується конфігурації мережі, де ви можете налаштувати або змінити параметри системи, пов’язані з мережею. - -!!! Note "Примітка" - - ``` - Після натискання опції ++"Мережа та ім'я хоста"++ все правильно виявлене обладнання мережевого інтерфейсу (наприклад, Ethernet, бездротові мережеві карти тощо) буде перераховано в лівій панелі екрана конфігурації мережі. Залежно від конкретної конфігурації обладнання, пристрої Ethernet у Linux мають назви, подібні до `eth0`, `eth1`, `ens3`, `ens4`, `em1`, `em2`, `p1p1`, `enp0s3` тощо. - - Ви можете налаштувати кожен інтерфейс за допомогою DHCP або вручну встановити IP-адресу. - - Якщо ви вирішите налаштувати вручну, переконайтеся, що у вас є вся необхідна інформація, така як IP-адреса, маска мережі та інші відповідні дані. - ``` - -Натискання кнопки ++"Мережа та ім'я хоста"++ на головному екрані _Підсумок встановлення_ відкриває відповідний екран конфігурації. Крім іншого, у вас є можливість налаштувати ім’я хоста системи. - -!!! Note "Примітка" - - ``` - Ви можете легко змінити ім’я хоста системи пізніше після встановлення ОС. - ``` - -Наступне важливе завдання конфігурації стосується мережевих інтерфейсів системи. - -1. Переконайтеся, що на лівій панелі зазначено плату Ethernet (або будь-яку мережеву карту). -2. Натисніть будь-який із виявлених мережевих пристроїв на лівій панелі, щоб вибрати його.\ - Налаштовувані властивості вибраного мережевого адаптера відображаються в правій області екрана. - -!!! Note "Примітка" - - ``` - У нашій зразковій системі є два пристрої Ethernet (`ens3` та `ens4`), всі з яких перебувають у підключеному стані. Тип, назва, кількість та стан мережевих пристроїв у вашій системі можуть відрізнятися від тих, що є в нашій демонстраційній системі. - ``` - -Переконайтеся, що перемикач пристрою, який ви хочете налаштувати, знаходиться в положенні «УВІМК.» (синій) на правій панелі. -Ми приймемо всі значення за замовчуванням у цьому розділі. - -Натисніть кнопку ++"готово"++, щоб повернутися до головного екрана _Підсумок встановлення_. - -!!! Warning "Важливо" - - ``` - Зверніть увагу на IP-адресу сервера в цьому розділі інсталятора. Припустимо, у вас немає фізичного або легкого консольного доступу до системи. У такому разі ця інформація стане в пригоді пізніше, коли вам потрібно буде підключитися до сервера, щоб продовжити роботу на ньому після завершення встановлення ОС. - ``` - -### Розділ налаштувань користувача - -Використовуйте цей розділ для створення пароля для облікового запису користувача `root` та для створення нових облікових записів адміністратора або неадміністратора. - -#### Пароль root - -1. Клацніть поле _Пароль root_ у розділі _Налаштування користувача_, щоб розпочати екран завдання _Пароль root_. - - !!! Warning "Важливо" - - ``` - Суперкористувач root — це обліковий запис із найвищими привілеями в системі. Тому, якщо ви вирішите використовувати або ввімкнути його, вам необхідно захистити цей обліковий запис надійним паролем. - ``` - -2. У текстовому полі _Пароль root_ встановіть надійний пароль для користувача root. - -3. Введіть той самий пароль ще раз у текстове поле _Підтвердити_. - -4. Натисніть ++"done"++. - -#### Створення користувача - -Щоб створити користувача: - -1. Клацніть поле _Створення користувача_ у розділі _Налаштування користувача_, щоб розпочати екран завдання _Створення користувача_.\ - Ця область завдань призначена для створення привілейованого (адміністративного) або непривілейованого (неадміністративного) облікового запису користувача. - - !!! Info "Інформація" - - ``` - Створення та використання непривілейованого облікового запису для щоденних завдань у системі є найкращою практикою системного адміністрування. - ``` - - Ми створимо звичайного користувача, який за потреби може використовувати повноваження суперкористувача (адміністратора). - -2. Заповніть поля на екрані _Створити користувача_, вказавши таку інформацію: - - - **Full name**: - `rockstar` - - **Username**: - `rockstar` - - **Make this user administrator**: - Checked - - **Require a password to use this account**: - Checked - - **Password**: - `04302021` - - **Confirm password**: - `04302021` - -3. Натисніть ++"done"++. - -## Фаза встановлення - -Щойно ви будете задоволені вибором різних завдань встановлення, розпочнеться наступний етап процесу встановлення: власне встановлення. - -### Початок установки - -Щойно ви будете задоволені вибраними параметрами для різних завдань встановлення, натисніть кнопку ++"Розпочати встановлення"++ на головному екрані _Підсумок встановлення_. - -Розпочнеться інсталяція, і програма інсталяції покаже прогрес інсталяції. -Після початку встановлення у фоновому режимі виконуватимуться різні завдання, зокрема розбиття диска на розділи, форматування розділів або томів LVM, перевірка та вирішення програмних залежностей, а також запис операційної системи на диск. - -!!! Note "Примітка" - - ``` - Якщо ви не бажаєте продовжувати після натискання кнопки «Почати встановлення», ви можете безпечно вийти з інсталяції без втрати даних. Щоб вийти з інсталятора, скиньте налаштування системи, натиснувши кнопку «Вийти», натиснувши Ctrl-Alt-Delete на клавіатурі або натиснувши кнопку скидання чи вимикач живлення. - ``` - -### Завершення установки - -Після завершення програми інсталяції ви побачите екран останнього процесу інсталяції з повним повідомленням. - -Нарешті завершіть всю процедуру, натиснувши кнопку ++"Reboot System"++. Система перезавантажується. - -### Вхід - -Тепер система налаштована та готова до використання. Ви побачите консоль Rocky Linux. - -![Rocky Linux Welcome Screen](images/installation_9_F02.png) - -Щоб увійти в систему: - -1. Введіть `rockstar` у запиті для входу та натисніть ++enter++. - -2. У запиті пароля введіть `04302021` (пароль Rockstar) і натисніть ++enter++ (пароль _**не**_ відображатиметься на екрані, це нормально). - -3. Виконайте команду `whoami` після входу в систему.\ - Ця команда показує ім'я користувача, який наразі ввійшов у систему. - -![Login Screen](images/installation_9.0_F03.png) diff --git a/docs/guides/desktop/mate_installation.es.md b/docs/guides/desktop/mate_installation.es.md deleted file mode 100644 index 73e93ee68f..0000000000 --- a/docs/guides/desktop/mate_installation.es.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: Entorno de escritorio MATE -author: lillollo -contributors: Steven Spencer, Pedro Garcia -tested with: 8.5, 8.6 -tags: - - mate - - escritorio ---- - -# Entorno de escritorio MATE - -El entorno de escritorio MATE fue creado como una bifurcación para continuar GNOME2 después de las críticas negativas que recibió GNOME3 tras su presentación. MATE tiene un conjunto leal de seguidores, que lo instalan inmediatamente en su sistema operativo favorito. MATE se puede instalar en muchos de los diferentes sabores de Linux, incluyendo Rocky Linux. - -Este procedimiento está diseñado para que usted pueda trabajar con Rocky Linux utilizando MATE. - -## Requisitos previos - -* Un ordenador con una pantalla y el resto de periféricos necesarios, preferiblemente con Rocky Linux ya instalado. - -## Instalar Rocky Linux Minimal - -Al instalar Rocky Linux, utilizamos los siguientes conjuntos de paquetes: - -* Minimal -* Standard - -## Habilitar los repositorios - -Necesita los repositorio Powertools y EPEL. Continue y activelos mediante el comando: - -`sudo dnf config-manager --set-enabled powertools` - -`sudo dnf install epel-release` - -Y responda 'Y' para instalar EPEL. - -Continue y ejecute el comando `dnf update` para asegurarse de que todos los repositorios habilitados se pueden leer en el sistema. - -## Instalar paquetes - -Lo siguiente que necesitamos son muchos paquetes. Puede instalarlos copiando y pegando el siguiente texto en la línea de comandos de su máquina: - -`sudo dnf install NetworkManager-adsl NetworkManager-bluetooth NetworkManager-libreswan-gnome NetworkManager-openvpn-gnome NetworkManager-ovs NetworkManager-ppp NetworkManager-team NetworkManager-wifi NetworkManager-wwan abrt-desktop abrt-java-connector adwaita-gtk2-theme alsa-plugins-pulseaudio atril atril-caja atril-thumbnailer caja caja-actions caja-image-converter caja-open-terminal caja-sendto caja-wallpaper caja-xattr-tags dconf-editor engrampa eom firewall-config gnome-disk-utility gnome-epub-thumbnailer gstreamer1-plugins-ugly-free gtk2-engines gucharmap gvfs-afc gvfs-afp gvfs-archive gvfs-fuse gvfs-gphoto2 gvfs-mtp gvfs-smb initial-setup-gui libmatekbd libmatemixer libmateweather libsecret lm_sensors marco mate-applets mate-backgrounds mate-calc mate-control-center mate-desktop mate-dictionary mate-disk-usage-analyzer mate-icon-theme mate-media mate-menus mate-menus-preferences-category-menu mate-notification-daemon mate-panel mate-polkit mate-power-manager mate-screensaver mate-screenshot mate-search-tool mate-session-manager mate-settings-daemon mate-system-log mate-system-monitor mate-terminal mate-themes mate-user-admin mate-user-guide mozo network-manager-applet nm-connection-editor p7zip p7zip-plugins pluma seahorse seahorse-caja xdg-user-dirs-gtk` - -Esto instalará los paquetes necesarios además de todas las dependencias requeridas. - -Vamos a instalar lightdm-settings y lightdm también: - -`sudo dnf install lightdm-settings lightdm` - -## Últimos pasos - -Ahora que tenemos todo lo que necesitamos instalado, lo siguiente que necesitamos hacer es establecer la instalación mínima para poder ejecutar la interfaz de usuario gráfica (GUI). Podemos hacer esto tecleando el siguiente comando: - -`sudo systemctl set-default graphical.target` - -Ahora cruce los dedos cruzados y reinicie: - -`sudo reboot` - -A continuación, haga clic en la pantalla sobre su nombre de usuario, pero antes de introducir su contraseña e iniciar la sesión, haga clic sobre el icono con forma de engranaje situado a la izquierda de la opción "Iniciar sesión". Seleccione "MATE" entre las opciones de escritorio disponibles y luego introduzca su contraseña e inicie sesión. Los siguientes inicios de sesión recordarán la elección realizada. - -## Conclusión - -Algunas personas no están satisfechas con las nuevas implementaciones de GNOME o simplemente prefieren el antiguo aspecto de GNOME 2. Para esas personas, instalar MATE en Rocky Linux les proporcionará una agradable y estable alternativa. diff --git a/docs/guides/desktop/mate_installation.fr.md b/docs/guides/desktop/mate_installation.fr.md deleted file mode 100644 index ef542d71f6..0000000000 --- a/docs/guides/desktop/mate_installation.fr.md +++ /dev/null @@ -1,211 +0,0 @@ ---- -title: MATE Desktop -author: lillolollo, Steven Spencer -contributors: Steven Spencer, Ganna Zhyrnova -tested_with: 8.5, 8.6, 9.0 -tags: - - mate - - bureau ---- - -# Environnement de bureau MATE - -Créé comme un fork et une continuation de GNOME2 à la suite de l'accueil plutôt négatif de GNOME3, l'environnement de bureau MATE était né. MATE a un ensemble fidèle de followers, qui l'installent immédiatement sur l'OS de leur choix. MATE peut être installé sur de nombreuses variantes de GNU/Linux, y compris Rocky Linux. - -Cette procédure vous permettra d'utiliser MATE sur Rocky Linux. - -## Prérequis - -* Un ordinateur (ordinateur portable ou station de travail) avec écran et tout. -* Un désir d'exécuter l'environnement de bureau MATE au lieu de GNOME, celui par défaut. - -=== "9" - - ## 9: Introduction - - L'équipe de développement de Rocky Linux 9 a facilité l'installation de MATE et d'autres environnements de bureau populaires, en incluant des images de live CD. Une image d'installation autonome, pour ceux qui ne savent peut-être pas ce que c'est, est une image amorçable qui chargera le système d'exploitation sans installation. Une fois chargée, vous avez la possibilité de l'installer sur le disque dur de votre machine et de l'utiliser. En plus des instructions pour l'image live, nous avons inclus des instructions pour ceux qui souhaitent installer MATE seulement après avoir installé le système d'exploitation. - - ## 9: MATE à partir de l' Image Live - - ### 9: obtenir, vérifier et enregistrer la l'image live MATE - - Avant l'installation, la première étape consiste à télécharger l'image live et à l'écrire sur un DVD ou une clé USB. Comme indiqué précédemment, l'image autonome sera amorçable, tout comme tout autre support d'installation pour Linux. Vous trouverez la dernière image live pour MATE dans la section `Download` pour Rocky Linux 9 [images live](https://dl.rockylinux.org/pub/rocky/9.6/live/x86_64/). Notez que ce lien particulier suppose que x86_64 est votre architecture, et au moment de la rédaction de cet article, qui est la seule architecture pour laquelle cette image d'installation autonome est disponible. Téléchargez à la fois l'image live et les fichiers de vérification correspondants. - - Maintenant vérifiez l'image avec le fichier CHECKSUM en utilisant la commande - suivante (notez qu'il s'agit d'un exemple ! Assurez-vous que le nom de votre image et les fichiers CHECKSUM correspondent) : - - ``` - sha256sum -c CHECKSUM --ignore-missing Rocky-9.6-MATE-x86_64-20250530.3.iso.CHECKSUM - ``` - - - Si tout se passe bien, vous devriez obtenir ce message : - - ``` - Rocky-9.5-MATE-x86_64-20221124.0.iso: OK - ``` - - - Si la somme de contrôle du fichier retourne OK, vous êtes maintenant prêt à enregistrer votre image ISO sur votre support de stockage. Cette procédure est différente suivant l'OS que vous utilisez, les supports de stockage et les outils logiciels. Nous supposons ici que vous savez écrire l'image sur votre support de stockage. - - ### 9: Démarrage - - Ceci est différent suivant le matériel, le BIOS, OS, etc. Vous devez vous assurer que votre machine est configurée pour démarrer avec n'importe quel support (DVD ou USB) comme premier périphérique de démarrage. Si l'opération a réussi, cet écran apparaîtra : - - ![mate_boot](images/mate_boot.png) - - Si c'est le cas, vous êtes sur la bonne voie ! Si vous souhaitez tester la prise en charge, sélectionnez d'abord cette option ou entrez **S** pour **Démarrer Rocky Linux Mate 9.0**. - - N'oubliez pas qu'il s'agit d'une image live. Le lancement jusqu'au premier écran prend un certain temps. Pas de panique, il suffit d'attendre ! Lorsque l'image live est lancée, cet écran apparaît : - - ![mate-live](images/mate_live.png) - - ### 9: Installing MATE - - À ce stade, nous pouvons utiliser l'environnement MATE et voir s'il nous convient. Une fois que vous avez décidé de l'utiliser de manière permanente, double-cliquez sur l'option **Install to hard drive**. - - Cela lancera un processus d'installation assez familier pour ceux qui ont déjà installé Rocky Linux. La capture d'écran suivante met en évidence les éléments que vous *pourriez* vouloir modifier. - - ![mate_install](images/mate_install.png) - - 1. **Clavier** - Jetez un coup d'œil à cette option et assurez-vous qu'elle correspond bien à la disposition du clavier que vous utilisez. - 2. **Heure & Date** - Assurez-vous que cela correspond à votre fuseau horaire. - 3. **Destination d'installation** - Vous devrez cliquer sur cette option, même si c'est juste pour accepter ce qui est déjà indiqué. - 4. **Réseau & Nom d'Hôte** - Vérifiez que vous avez ce dont vous avez besoin ici. Tant que le réseau est activé, vous pouvez toujours modifier plus tard si vous le souhaitez. - 5. **Mot de passe root** - Allez-y et choisissez un mot de passe root. N'oubliez pas de sauvegarder ce mot de passe dans un endroit sûr (gestionnaire de mots de passe par ex.). - 6. **Création d'utilisateur** - Créez au moins un utilisateur. Si vous voulez qu'il dispose de droits d'administration, n'oubliez pas de définir cette option lors de la création de l'utilisateur. - 7. **Commencer l'installation** - Une fois que tous les paramètres ont été définis ou vérifiés, continuez en cliquant sur cette option. - - Une fois que vous avez terminé avec l'étape 7, le processus d'installation devrait commencer à installer des paquets, tout comme le montre la capture d'écran ci-dessous : - - ![mate_install_2](images/mate_install_2.png) - - Une fois l'installation sur le disque dur terminée, vous devriez voir l'écran suivant : - - ![mate_install_final](images/mate_install_final.png) - - Allez-y et cliquez sur **Terminer l'installation**. - - À ce stade, l'OS va redémarrer. Retirez le media de démarrage et lorsque le système d'exploitation démarre pour la première fois, un écran apparaît avec un contrat de licence : - - ![eula](images/eula.png) - - Cliquez sur la case à cocher **J'accepte l'accord de licence** puis cliquez sur **Terminé**. Cela vous mènera à l'écran final en ce qui concerne l'installation. Sur cet écran, cliquez sur **Terminer la configuration**. - - ![mate_finish](images/mate_finish.png) - - Ensuite, vous obtiendrez un écran de connexion avec l'utilisateur que vous avez créé précédemment. Saisissez votre mot de passe, qui vous mènera au bureau MATE : - - ![mate_desktop](images/mate_desktop.png) - - - ## 9: MATE après l'installation du système - - MATE peut également être installé seulement après l'installation du système d'exploitation. Cela nécessite quelques étapes supplémentaires, mais ce n'est pas un processus très difficile. Suivez simplement les instructions qui suivent. - - - ### 9: Activation des dépôts - - Vous aurez besoin des dépôts CRB et EPEL. Activez-les ainsi : - - ``` - sudo dnf config-manager --set-enabled crb - sudo dnf install epel-release - ``` - - Allez-y et exécutez `dnf upgrade` pour vous assurer que tous les dépôts activés sont accessibles dans le système. - - - ### 9: Installation des paquets - - La prochaine chose dont nous avons besoin sont de nombreux paquets. Vous pouvez les installer en copiant et en collant ce qui suit dans la ligne de commande de votre machine : - - ``` - sudo dnf install NetworkManager-adsl NetworkManager-bluetooth NetworkManager-libreswan-gnome NetworkManager-openvpn-gnome NetworkManager-ovs NetworkManager-ppp NetworkManager-team NetworkManager-wifi NetworkManager-wwan adwaita-gtk2-theme alsa-plugins-pulseaudio atril atril-caja atril-thumbnailer caja caja-actions caja-image-converter caja-open-terminal caja-sendto caja-wallpaper caja-xattr-tags dconf-editor engrampa eom firewall-config gnome-disk-utility gnome-epub-thumbnailer gstreamer1-plugins-ugly-free gtk2-engines gucharmap gvfs-fuse gvfs-gphoto2 gvfs-mtp gvfs-smb initial-setup-gui libmatekbd libmatemixer libmateweather libsecret lm_sensors marco mate-applets mate-backgrounds mate-calc mate-control-center mate-desktop mate-dictionary mate-disk-usage-analyzer mate-icon-theme mate-media mate-menus mate-menus-preferences-category-menu mate-notification-daemon mate-panel mate-polkit mate-power-manager mate-screensaver mate-screenshot mate-search-tool mate-session-manager mate-settings-daemon mate-system-log mate-system-monitor mate-terminal mate-themes mate-user-admin mate-user-guide mozo network-manager-applet nm-connection-editor p7zip p7zip-plugins pluma seahorse seahorse-caja xdg-user-dirs-gtk - ``` - - Cela installera ces paquets nécessaires ainsi que tous ceux dont ils dépendent. - - Ensuite installons aussi lightdm-settings et lightdm : - - ``` - sudo dnf install lightdm-settings lightdm - ``` - - - ### 9: Étapes Finales - - Si votre système a été installé avec GNOME ou un autre interface de bureau avant d'installer MATE, vous devriez vous préparer à redémarrer le système. Si aucune interface de bureau n'a été installée, vous devrez utiliser la commande suivante pour définir la cible graphique : - - ``` - sudo systemctl set-default graphical.target - ``` - - Puis redémarrez le système - - ``` - sudo reboot - ``` - - Lorsque le système redémarre, cliquez sur votre nom d'utilisateur, mais avant d'entrer le mot de passe, cliquez sur l'icône d'engrenage en bas à droite de l'écran et sélectionnez MATE dans la liste des interfaces. Ensuite, connectez-vous et vous devriez avoir un environnement de bureau MATE entièrement fonctionnel. Les prochaines connexions devraient utiliser automatiquement la sélection choisie. - -=== "8" - - ## 8: Installez Rocky Linux Minimal - - Lors de l'installation de Rocky Linux, nous avons utilisé les paquets suivants : - - * Minimal - * Standard - - - ## 8: Activation des dépôts - - Vous avez besoin des dépôts EPEL et Powertools. Continuez en les activant : - - ``` - sudo dnf config-manager --set-enabled powertools - sudo dnf install epel-release - ``` - - Et répondez 'Y' pour installer le dépôt EPEL. - - Allez-y et exécutez `dnf update` pour vous assurer que tous les dépôts activés sont accessibles dans le système. - - - ## 8: Installation des Paquets - - La prochaine chose dont nous avons besoin consiste en de nombreux paquets. Vous pouvez les installer en copiant et en collant ce qui suit dans la ligne de commande de votre machine : - - ``` - sudo dnf install NetworkManager-adsl NetworkManager-bluetooth NetworkManager-libreswan-gnome NetworkManager-openvpn-gnome NetworkManager-ovs NetworkManager-ppp NetworkManager-team NetworkManager-wifi NetworkManager-wwan abrt-desktop abrt-java-connector adwaita-gtk2-theme alsa-plugins-pulseaudio atril atril-caja atril-thumbnailer caja caja-actions caja-image-converter caja-open-terminal caja-sendto caja-wallpaper caja-xattr-tags dconf-editor engrampa eom firewall-config gnome-disk-utility gnome-epub-thumbnailer gstreamer1-plugins-ugly-free gtk2-engines gucharmap gvfs-afc gvfs-afp gvfs-archive gvfs-fuse gvfs-gphoto2 gvfs-mtp gvfs-smb initial-setup-gui libmatekbd libmatemixer libmateweather libsecret lm_sensors marco mate-applets mate-backgrounds mate-calc mate-control-center mate-desktop mate-dictionary mate-disk-usage-analyzer mate-icon-theme mate-media mate-menus mate-menus-preferences-category-menu mate-notification-daemon mate-panel mate-polkit mate-power-manager mate-screensaver mate-screenshot mate-search-tool mate-session-manager mate-settings-daemon mate-system-log mate-system-monitor mate-terminal mate-themes mate-user-admin mate-user-guide mozo network-manager-applet nm-connection-editor p7zip p7zip-plugins pluma seahorse seahorse-caja xdg-user-dirs-gtk - ``` - - Cela installera les paquets nécessaires ainsi que toutes leurs dépendances. - - Continuons et installons lightdm-settings ainsi que lightdm : - - ``` - sudo dnf install lightdm-settings lightdm - ``` - - - ## 8: Étapes finales - - Maintenant que nous avons installé tout ce dont nous avons besoin, la prochaine chose que nous devons faire est de définir l'installation minimale pour démarrer avec l'interface graphique (GUI). Nous pouvons le faire en entrant la commande : - - ``` - sudo systemctl set-default graphical.target - ``` - - Maintenant, croisez les doigts et redémarrez le système : - - ``` - sudo reboot - ``` - - Ensuite, cliquez sur votre nom d'utilisateur à l'écran, mais avant d'entrer votre mot de passe et de vous connecter, cliquez sur l’icône d’engrenage à gauche de l’option « Sign in ». Sélectionnez "MATE" dans les choix de desktop disponibles et vous pourrez ensuite entrer votre mot de passe et vous connecter. Les prochaines connexions devraient utiliser automatiquement la sélection choisie. - -## Conclusion - -Certaines personnes ne sont pas satisfaites des nouvelles implémentations de GNOME ou préfèrent tout simplement l'apparence et l'ergonomie de l'ancien MATE GNOME 2. Pour ces personnes, installer MATE dans Rocky Linux offre une alternative stable et agréable. Les développeurs de Rocky Linux 9 ont rendu tout le processus très facile avec l'image live disponible. diff --git a/docs/guides/desktop/mate_installation.it.md b/docs/guides/desktop/mate_installation.it.md deleted file mode 100644 index 4685dc7896..0000000000 --- a/docs/guides/desktop/mate_installation.it.md +++ /dev/null @@ -1,211 +0,0 @@ ---- -title: Desktop MATE -author: lillolollo -contributors: Steven Spencer, Ganna Zhyrnova -tested_with: 8.5, 8.6, 9.0 -tags: - - mate - - desktop ---- - -# Ambiente desktop MATE - -Creato come fork e continuazione di GNOME2 sulla scia dell'accoglienza piuttosto negativa di GNOME3, è nato l'ambiente desktop MATE. MATE ha dei fedeli utilizzatori, che di solito lo installano immediatamente sul loro sistema operativo preferito. L'installazione di MATE è possibile su molte versioni di Linux, tra cui Rocky Linux. - -Questa procedura vi permetterà di utilizzare MATE su Rocky Linux. - -## Prerequisiti - -* Un computer (portatile o workstation) con schermo e tutto il resto. -* Il desiderio di eseguire il desktop MATE invece di quello predefinito di GNOME. - -=== "9" - - ## 9: Introduzione - - Il team di sviluppo di Rocky Linux 9 ha reso semplice l'installazione di MATE e di altri ambienti desktop popolari, includendo immagini live. Per chi non lo sapesse, un'immagine live è un'immagine avviabile che carica il sistema operativo senza installazione. Una volta caricato, è possibile installarlo nell'unità disco del computer e utilizzarlo. Oltre alle istruzioni per l'immagine live, abbiamo incluso le istruzioni per coloro che vogliono installare MATE dopo l'installazione del sistema operativo. - - ## 9: MATE dall'immagine live - - ### 9: Ottenere, verificare e scrivere l'immagine live di MATE - - Prima dell'installazione, il primo passo è scaricare l'immagine live e scriverla su un DVD o una chiavetta USB. Come detto in precedenza, l'immagine sarà avviabile, proprio come qualsiasi altro supporto di installazione per Linux. È possibile trovare l'ultima immagine MATE nella sezione download di Rocky Linux 9 [immagini live](https://dl.rockylinux.org/pub/rocky/9.6/live/x86_64/). Si noti che questo particolare collegamento presuppone che l'architettura sia x86_64 e, al momento in cui scriviamo, questa è l'unica immagine live disponibile. Scaricare sia l'immagine live che i file di checksum. - - Verificare l'immagine con il file CHECKSUM nel modo seguente - (si noti che questo è un esempio! Assicurarsi che il nome dell'immagine e i file CHECKSUM corrispondano): - - ``` - sha256sum -c CHECKSUM --ignore-missing Rocky-9.6-MATE-x86_64-20250530.3.iso.CHECKSUM - ``` - - - Se tutto va bene, riceverete questo messaggio: - - ``` - Rocky-9.5-MATE-x86_64-20221124.0.iso: OK - ``` - - - Se il checksum per il file restituisce OK, ora sei pronto a scrivere la tua immagine ISO sul tuo supporto. Questa procedura varia a seconda del sistema operativo in uso, del supporto e degli strumenti. Si presuppone che sappiate come scrivere l'immagine sul vostro supporto. - - ### 9: Avvio - - Anche in questo caso la procedura è diversa a seconda della macchina, del BIOS, del sistema operativo e così via. È necessario assicurarsi che la macchina sia impostata per l'avvio su qualsiasi supporto (DVD o USB) come primo dispositivo di avvio. Se l'operazione è riuscita, verrà visualizzata questa schermata: - - ![mate_boot](images/mate_boot.png) - - Se è così, siete sulla buona strada! Se si desidera testare il supporto, selezionare prima questa opzione, oppure immettere **S** per **Avviare Rocky Linux Mate 9.0**. - - Ricordate che si tratta di un'immagine dal vivo. L'avvio della prima schermata richiederà un po' di tempo. Non fatevi prendere dal panico, aspettate! Quando l'immagine live si avvia, viene visualizzata questa schermata: - - ![mate-live](images/mate_live.png) - - ### 9: Installazione di MATE - - A questo punto, si può usare l'ambiente MATE e vedere se ci piace. Una volta deciso di utilizzarlo in modo permanente, fare doppio clic sull'opzione **Install to Hard Drive**. - - Si avvia così un processo di installazione abbastanza familiare per chi ha già installato Rocky Linux. Nella schermata seguente sono evidenziate le cose che *potreste* voler modificare. - - ![mate_install](images/mate_install.png) - - 1. **Tastiera** Assicuratevi che corrisponda al layout della tastiera che utilizzate. - 2. **Ora e data** - Assicurarsi che corrisponda al proprio fuso orario. - 3. **Destinazione di installazione** - È necessario fare clic su questa opzione, anche solo per accettare ciò che è già presente. - 4. **Rete e Nome host** - Verificare che sia presente ciò che si desidera. Se la rete è abilitata, è sempre possibile modificarla in seguito, se necessario. - 5. **Password di root** - Impostare una password di root. Ricordate di salvarlo in un luogo sicuro (gestore di password). - 6. **Creazione di un utente** - Creare almeno un utente. Se si desidera che l'utente abbia diritti amministrativi, impostare questa opzione al momento della creazione dell'utente. - 7. **Iniziare l'installazione** - Quando tutte le impostazioni sono state impostate o verificate, fare clic su questa opzione. - - Una volta eseguito il passo 7, il processo di installazione inizierà a installare i pacchetti, come in questa schermata: - - ![mate_install_2](images/mate_install_2.png) - - Al termine dell'installazione sul disco rigido, verrà visualizzata la seguente schermata: - - ![mate_install_final](images/mate_install_final.png) - - Cliccare su **Termina installazione**. - - A questo punto il sistema operativo si riavvia. Rimuovere il supporto di avvio e quando il sistema operativo viene avviato per la prima volta, viene visualizzata una schermata con il contratto di licenza: - - ![eula](images/eula.png) - - Cliccare sulla casella di controllo **Accetto il contratto di licenza** e fare clic su **Fatto**. In questo modo si arriva alla schermata finale dell'installazione. In questa schermata, fare clic su **Fine della configurazione**. - - ![mate_finish](images/mate_finish.png) - - Si aprirà quindi una schermata di accesso con l'utente creato. Immettere la password per accedere al desktop MATE: - - ![mate_desktop](images/mate_desktop.png) - - - ## 9: MATE dopo l'installazione del sistema operativo - - È anche possibile installare MATE dopo l'installazione del sistema operativo. Questo procedimento richiede qualche passo in più, ma non è difficile. Basta seguire queste istruzioni. - - - ### 9: Abilitare i Repository - - Hai bisogno del repository CRB e del repository EPEL. Abilitateli subito: - - ``` - sudo dnf config-manager --set-enabled crb - sudo dnf install epel-release - ``` - - Eseguire `dnf upgrade` per assicurarsi che tutti i repository abilitati vengano letti dal sistema. - - - ### 9: Installazione dei Pacchetti - - La prossima cosa di cui abbiamo bisogno sono un sacco di pacchetti. È possibile installarli copiando e incollando quanto segue nella riga di comando del computer: - - ``` - sudo dnf install NetworkManager-adsl NetworkManager-bluetooth NetworkManager-libreswan-gnome NetworkManager-openvpn-gnome NetworkManager-ovs NetworkManager-ppp NetworkManager-team NetworkManager-wifi NetworkManager-wwan adwaita-gtk2-theme alsa-plugins-pulseaudio atril atril-caja atril-thumbnailer caja caja-actions caja-image-converter caja-open-terminal caja-sendto caja-wallpaper caja-xattr-tags dconf-editor engrampa eom firewall-config gnome-disk-utility gnome-epub-thumbnailer gstreamer1-plugins-ugly-free gtk2-engines gucharmap gvfs-fuse gvfs-gphoto2 gvfs-mtp gvfs-smb initial-setup-gui libmatekbd libmatemixer libmateweather libsecret lm_sensors marco mate-applets mate-backgrounds mate-calc mate-control-center mate-desktop mate-dictionary mate-disk-usage-analyzer mate-icon-theme mate-media mate-menus mate-menus-preferences-category-menu mate-notification-daemon mate-panel mate-polkit mate-power-manager mate-screensaver mate-screenshot mate-search-tool mate-session-manager mate-settings-daemon mate-system-log mate-system-monitor mate-terminal mate-themes mate-user-admin mate-user-guide mozo network-manager-applet nm-connection-editor p7zip p7zip-plugins pluma seahorse seahorse-caja xdg-user-dirs-gtk - ``` - - Questo installerà i pacchetti necessari e tutte le dipendenze. - - Procediamo con l'installazione di lightdm-settings e lightdm: - - ``` - sudo dnf install lightdm-settings lightdm - ``` - - - ### 9: Passi Finali - - Se il sistema aveva installato Gnome o un altro desktop prima dell'installazione di MATE, a questo punto dovrebbe essere pronto per il riavvio. Se non esiste un'installazione desktop, è necessario utilizzare il seguente comando per impostare il target grafico: - - ``` - sudo systemctl set-default graphical.target - ``` - - Quindi riavviare - - ``` - sudo reboot - ``` - - Al riavvio del sistema, fare clic sul proprio nome utente, ma prima di inserire la password, fare clic sull'icona dell'ingranaggio in basso a destra e selezionare MATE dall'elenco dei desktop. Effettuate il login e dovreste avere un desktop MATE completamente funzionante. I futuri accessi dovrebbero ricordare la selezione effettuata. - -=== "8" - - ## 8: Installare Rocky Linux Minimal - - Per l'installazione di Rocky Linux abbiamo utilizzato i seguenti pacchetti: - - * Minimal - * Standard - - - ## 8: Abilitazione dei Repository - - È necessario disporre del repository Powertools e del repository EPEL. Abilitateli subito: - - ``` - sudo dnf config-manager --set-enabled powertools - sudo dnf install epel-release - ``` - - E rispondere 'Y' per installare il repository EPEL. - - Eseguire `dnf update` per assicurarsi che tutti i repository abilitati siano letti dal sistema. - - - ## 8: Installazione dei Pacchetti - - La prossima cosa di cui avete bisogno sono numerosi pacchetti. È possibile installarli copiando e incollando quanto segue nella riga di comando del computer: - - ``` - sudo dnf install NetworkManager-adsl NetworkManager-bluetooth NetworkManager-libreswan-gnome NetworkManager-openvpn-gnome NetworkManager-ovs NetworkManager-ppp NetworkManager-team NetworkManager-wifi NetworkManager-wwan abrt-desktop abrt-java-connector adwaita-gtk2-theme alsa-plugins-pulseaudio atril atril-caja atril-thumbnailer caja caja-actions caja-image-converter caja-open-terminal caja-sendto caja-wallpaper caja-xattr-tags dconf-editor engrampa eom firewall-config gnome-disk-utility gnome-epub-thumbnailer gstreamer1-plugins-ugly-free gtk2-engines gucharmap gvfs-afc gvfs-afp gvfs-archive gvfs-fuse gvfs-gphoto2 gvfs-mtp gvfs-smb initial-setup-gui libmatekbd libmatemixer libmateweather libsecret lm_sensors marco mate-applets mate-backgrounds mate-calc mate-control-center mate-desktop mate-dictionary mate-disk-usage-analyzer mate-icon-theme mate-media mate-menus mate-menus-preferences-category-menu mate-notification-daemon mate-panel mate-polkit mate-power-manager mate-screensaver mate-screenshot mate-search-tool mate-session-manager mate-settings-daemon mate-system-log mate-system-monitor mate-terminal mate-themes mate-user-admin mate-user-guide mozo network-manager-applet nm-connection-editor p7zip p7zip-plugins pluma seahorse seahorse-caja xdg-user-dirs-gtk - ``` - - Questo installerà i pacchetti necessari e tutte le dipendenze. - - Installare anche lightdm-settings e lightdm: - - ``` - sudo dnf install lightdm-settings lightdm - ``` - - - ## 8: Final Steps - - Ora che è stato installato tutto il necessario, è necessario impostare l'installazione minima per l'avvio dell'interfaccia grafica utente (GUI). Possiamo farlo inserendo: - - ``` - sudo systemctl set-default graphical.target - ``` - - Ora basta incrociare le dita e riavviare: - - ``` - sudo reboot - ``` - - Successivamente, cliccate sul vostro nome utente sullo schermo, ma prima di inserire la password e di effettuare il login, cliccate sull'icona dell'ingranaggio a sinistra dell'opzione "Accedi". Selezionare "MATE" tra le opzioni disponibili per il desktop, quindi inserire la password ed effettuare il login. I futuri accessi ricorderanno la selezione effettuata. - -## Conclusione - -Alcune persone non sono soddisfatte delle nuove implementazioni di GNOME o semplicemente preferiscono il vecchio aspetto di MATE GNOME 2. L'installazione di MATE in Rocky Linux fornirà un'alternativa stabile e gradevole. Per Rocky Linux 9.0, gli sviluppatori hanno reso l'intero processo molto semplice grazie all'immagine live disponibile. diff --git a/docs/guides/desktop/mate_installation.ko.md b/docs/guides/desktop/mate_installation.ko.md deleted file mode 100644 index 8258e537a6..0000000000 --- a/docs/guides/desktop/mate_installation.ko.md +++ /dev/null @@ -1,212 +0,0 @@ ---- -title: MATE 데스크톱 -author: lillolollo, Steven Spencer -contributors: Steven Spencer, OSSLAB -tested_with: 8.5, 8.6, 9.0 -tags: - - mate - - desktop ---- - -# MATE 데스크톱 환경 - -MATE 데스크톱 환경은 GNOME3가 도입될 때 상대적으로 부정적인 평가를 받은 뒤 GNOME2를 포크하고 계속해서 발전시키기 위해 만들어졌습니다. MATE에는 일반적으로 선택한 OS에 즉시 설치하는 충실한 추종자들이 있습니다. MATE는 일반적으로 OS에 즉시 설치하는 것이 좋다고 생각하는 충성스러운 팬들을 가지고 있으며, Rocky Linux를 포함한 많은 리눅스 배포판에 설치할 수 있습니다. - -이 절차는 Rocky Linux에서 MATE를 실행하기 위해 구성되어 있습니다. - -## 필요 사항 - -* 화면과 모든 것이 있는 컴퓨터(노트북 또는 워크스테이션). -* 기본 GNOME 대신 MATE 데스크톱을 실행하고자 하는 의지. - -=== "9" - - ## 9: 소개 - - Rocky Linux 9 개발팀은 MATE와 기타 인기 있는 데스크톱 환경을 쉽게 설치할 수 있도록 라이브 이미지를 포함시켰습니다. 라이브 이미지는 설치 없이 OS를 로드하는 부팅 가능한 이미지입니다. 로드되면 기계의 디스크 드라이브에 설치하고 사용할 수 있습니다. 라이브 이미지 사용 설명서 외에도 OS가 이미 설치된 후에 MATE를 설치하고자하는 사용자를 위한 설치 지침이 포함되어 있습니다. - - ## 9: 라이브 이미지에서 MATE - - ### 9: MATE 라이브 이미지 가져오기, 확인 및 쓰기 - - 설치 전에 첫 번째 단계는 라이브 이미지를 다운로드하고 DVD 또는 USB 썸 드라이브에 쓰는 것입니다. 앞서 언급한대로 라이브 이미지는 Linux를 위한 기타 모든 설치 미디어와 마찬가지로 부팅 가능합니다. Rocky Linux 9 [라이브 이미지](https://dl.rockylinux.org/pub/rocky/9.1/live/x86_64/) 다운로드 섹션에서 최신 MATE 이미지를 찾을 수 있습니다. 이 특정 링크는 아키텍처로 x86_64를 가정하고 있으며, 현재 작성 시점에서 이 특정 라이브 이미지는 해당 아키텍처로만 제공됩니다. 라이브 이미지와 체크섬 파일 모두를 다운로드하세요. - - 이제 다음을 사용하여 CHECKSUM 파일로 이미지를 확인하십시오. (참고로 예시입니다! 이미지 이름과 CHECKSUM 파일이 일치하는지 확인하세요.) - - ``` - sha256sum -c CHECKSUM --ignore-missing Rocky-9.1-MATE-x86_64-20221124.0.iso.CHECKSUM - ``` - - - 모두 성공하면 다음과 같은 메시지를 받아야 합니다: - - ``` - Rocky-9.1-MATE-x86_64-20221124.0.iso: OK - ``` - - - 파일의 체크섬이 OK라면 이제 ISO 이미지를 미디어에 쓸 준비가 되었습니다. 이 절차는 사용 중인 OS, 미디어 및 도구에 따라 다르므로 여기에서는 이미지를 미디어에 쓰는 방법을 알고 있다고 가정합니다. 여기서는 이미지를 미디어에 쓰는 방법을 알고 있다고 가정합니다. - - 기계가 미디어(DVD 또는 USB)로 시작하도록 설정해야 합니다. 성공한 경우 다음 화면이 표시됩니다: - - - - ![mate_boot](images/mate_boot.png) - - 성공한 경우, 축하합니다! 미디어를 테스트하려면 먼저 해당 옵션을 선택하거나 **S**를 입력하여 **Start Rocky Linux Mate 9.0**을 시작하세요. - - 라이브 이미지이므로 처음 화면으로 부팅하는 데 시간이 다소 걸릴 수 있습니다. 걱정하지 마시고 기다리세요! 라이브 이미지가 부팅되면 다음과 같은 화면이 표시됩니다: - - - - ![mate-live](images/mate_live.png) - - ### 9: MATE 설치 - - 이 시점에서 MATE 환경을 사용하고 마음에 드는지 확인할 수 있습니다. MATE를 영구적으로 사용하려고 한다면, **Hard Drive에 설치**를 두 번 클릭하세요. - - 이는 이미 Rocky Linux를 설치한 적이 있는 사용자에게는 익숙한 설치 프로세스를 시작합니다. 다음 화면에서 **변경할 수 있는 항목**들을 강조했습니다. - - ![mate_install](images/mate_install.png) - - 1. **키보드** - 사용하는 키보드 레이아웃과 일치하는지 확인하세요. - 2. **시간 & 날짜** - 시간대와 일치하는지 확인하세요. - 3. **설치 대상** - 이미 있는 것을 그대로 받아들이더라도 클릭해야 합니다. - 4. **네트워크 & 호스트 이름** - 원하는 내용을 확인하세요. 네트워크가 활성화된 상태라면 필요에 따라 나중에 변경할 수 있습니다. - 5. **루트 암호** - 루트 비밀번호를 설정하세요. 자주 사용하지 않을 경우에도 안전한 곳(비밀번호 관리자)에 저장하세요. - 6. **사용자 생성** - 적어도 하나의 사용자를 생성하세요. 사용자에게 관리 권한을 부여하려면 사용자를 생성할 때 이 옵션을 설정하세요. - 7. **설치 시작** - 모든 설정이 완료되었거나 확인되었을 때 이 옵션을 클릭하세요. - - 7단계를 수행하면 설치 프로세스가 아래 스크린샷과 같이 패키지를 설치하기 시작합니다: - - ![mate_install_2](images/mate_install_2.png) - - 하드 드라이브에 설치가 완료되면 다음 화면이 표시됩니다. - - ![mate_install_final](images/mate_install_final.png) - - 계속해서 **Finish Installation**를 클릭합니다. - - 이제 OS가 재부팅되고, 부팅 미디어를 제거해야 합니다. OS가 처음으로 시작될 때 라이센스 동의 화면이 표시됩니다: - - ![eula](images/eula.png) - - **I accept the license agreement** 확인란을 클릭한 다음 **Done**을 클릭하세요. 이로써 설치와 관련된 최종 화면에 도달합니다. 이 화면에서 **Finish Configuration**을 클릭하세요. - - ![mate_finish](images/mate_finish.png) - - 그다음으로 사용자를 생성한 로그인 화면이 표시됩니다. 비밀번호를 입력하고 MATE 데스크톱에 접속할 수 있습니다: - - ![mate_desktop](images/mate_desktop.png) - - - ## 9: OS 설치 후 MATE - - MATE는 OS가 설치된 후에도 설치할 수 있습니다. 몇 가지 단계를 거쳐 진행해야 하지만 어려운 과정은 아닙니다. 다음 지침에 따라 진행하세요. - - - ### 9: 리포지토리 활성화 - - CRB 리포지토리와 EPEL 리포지토리가 필요합니다. 이제 다음 명령어를 사용하여 이들을 활성화하세요: - - ``` - sudo dnf config-manager --set-enabled crb - sudo dnf install epel-release - ``` - - 그런 다음 모든 활성화된 리포지토리를 시스템에 읽어들이기 위해 `dnf upgrade`를 실행하세요. - - - ### 9: 패키지 설치 - - 이제 필요한 많은 패키지가 필요합니다. 다음 내용을 기계의 명령줄에 복사하여 설치할 수 있습니다: - - ``` - sudo dnf install NetworkManager-adsl NetworkManager-bluetooth NetworkManager-libreswan-gnome NetworkManager-openvpn-gnome NetworkManager-ovs NetworkManager-ppp NetworkManager-team NetworkManager-wifi NetworkManager-wwan adwaita-gtk2-theme alsa-plugins-pulseaudio atril atril-caja atril-thumbnailer caja caja-actions caja-image-converter caja-open-terminal caja-sendto caja-wallpaper caja-xattr-tags dconf-editor engrampa eom firewall-config gnome-disk-utility gnome-epub-thumbnailer gstreamer1-plugins-ugly-free gtk2-engines gucharmap gvfs-fuse gvfs-gphoto2 gvfs-mtp gvfs-smb initial-setup-gui libmatekbd libmatemixer libmateweather libsecret lm_sensors marco mate-applets mate-backgrounds mate-calc mate-control-center mate-desktop mate-dictionary mate-disk-usage-analyzer mate-icon-theme mate-media mate-menus mate-menus-preferences-category-menu mate-notification-daemon mate-panel mate-polkit mate-power-manager mate-screensaver mate-screenshot mate-search-tool mate-session-manager mate-settings-daemon mate-system-log mate-system-monitor mate-terminal mate-themes mate-user-admin mate-user-guide mozo network-manager-applet nm-connection-editor p7zip p7zip-plugins pluma seahorse seahorse-caja xdg-user-dirs-gtk - ``` - - 이렇게 하면 필요한 패키지와 해당 종속성들이 모두 설치됩니다. - - 계속해서 lightdm-settings 및 lightdm도 설치해 보겠습니다. - - ``` - sudo dnf install lightdm-settings lightdm - ``` - - - ### 9: 최종 단계 - - 이제 시스템에 Gnome 또는 다른 데스크톱이 이미 설치된 경우 이 시점에서 재부팅할 준비가 되었습니다. 데스크톱이 설치되지 않은 경우 다음 명령어를 사용하여 그래픽 타겟을 설정해야 합니다: - - ``` - sudo systemctl set-default graphical.target - ``` - - 그런 다음 재부팅합니다. - - ``` - sudo reboot - ``` - - 시스템이 재부팅되면 사용자 이름을 클릭하지만 비밀번호를 입력하기 전에 화면 오른쪽 아래에 있는 톱니바퀴 아이콘을 클릭하여 데스크톱 목록에서 MATE를 선택하세요. 그런 다음 로그인하면 완전히 작동하는 MATE 데스크톱이 표시됩니다. 미래 로그인에서는 이전 선택이 기억될 것입니다. - -=== "8" - - ## 8: Rocky Linux Minimal 설치 - - Rocky Linux를 설치할 때 다음 패키지 세트를 사용했습니다: - - * Minimal - * Standard - - - ## 8: 리포지토리 활성화 - - Powertools 리포지토리와 EPEL 리포지토리가 필요합니다. 이제 다음 명령어를 사용하여 이들을 활성화하세요: - - ``` - sudo dnf config-manager --set-enabled powertools - sudo dnf install epel-release - ``` - - 그리고 EPEL 리포지토리를 설치하기 위해 'Y'를 입력하세요. - - `dnf update` 명령어를 실행하여 활성화된 모든 리포지토리를 시스템에 적용하세요. - - - ## 9: 패키지 설치 - - 이제 필요한 많은 패키지가 필요합니다. 다음 내용을 단순히 기계의 명령줄에 복사하여 설치할 수 있습니다: - - ``` - sudo dnf install NetworkManager-adsl NetworkManager-bluetooth NetworkManager-libreswan-gnome NetworkManager-openvpn-gnome NetworkManager-ovs NetworkManager-ppp NetworkManager-team NetworkManager-wifi NetworkManager-wwan abrt-desktop abrt-java-connector adwaita-gtk2-theme alsa-plugins-pulseaudio atril atril-caja atril-thumbnailer caja caja-actions caja-image-converter caja-open-terminal caja-sendto caja-wallpaper caja-xattr-tags dconf-editor engrampa eom firewall-config gnome-disk-utility gnome-epub-thumbnailer gstreamer1-plugins-ugly-free gtk2-engines gucharmap gvfs-afc gvfs-afp gvfs-archive gvfs-fuse gvfs-gphoto2 gvfs-mtp gvfs-smb initial-setup-gui libmatekbd libmatemixer libmateweather libsecret lm_sensors marco mate-applets mate-backgrounds mate-calc mate-control-center mate-desktop mate-dictionary mate-disk-usage-analyzer mate-icon-theme mate-media mate-menus mate-menus-preferences-category-menu mate-notification-daemon mate-panel mate-polkit mate-power-manager mate-screensaver mate-screenshot mate-search-tool mate-session-manager mate-settings-daemon mate-system-log mate-system-monitor mate-terminal mate-themes mate-user-admin mate-user-guide mozo network-manager-applet nm-connection-editor p7zip p7zip-plugins pluma seahorse seahorse-caja xdg-user-dirs-gtk - ``` - - 이렇게 하면 필요한 패키지와 해당 종속성들이 모두 설치됩니다. - - 계속해서 lightdm-settings 및 lightdm도 설치해 보겠습니다. - - ``` - sudo dnf install lightdm-settings lightdm - ``` - - - ## 8: 최종 단계 - - 이제 필요한 모든 것들이 설치되었으므로, 최소 설치를 그래픽 사용자 인터페이스(GUI)로 부팅하도록 설정해야 합니다. 다음 명령어를 입력하여 이 작업을 수행할 수 있습니다: - - ``` - sudo systemctl set-default graphical.target - ``` - - 그리고 이제 재부팅해주세요: - - ``` - sudo reboot - ``` - - 그다음으로 화면에서 사용자 이름을 클릭하고, 비밀번호를 입력하여 로그인하기 전에 "로그인" 옵션 왼쪽에 있는 기어 아이콘을 클릭하세요. 사용 가능한 데스크톱 선택에서 "MATE"를 선택한 다음 비밀번호를 입력하고 로그인할 수 있습니다. 미래 로그인에서는 이전 선택이 기억될 것입니다. - -## 결론 - -새로운 GNOME 구현에 만족하지 못하는 사람들이나 오래된 MATE GNOME 2 모양과 느낌을 선호하는 사람들을 위해 Rocky Linux에 MATE를 설치하는 것이 좋은 안정적인 대안을 제공합니다. 그러한 사람들에게는 Rocky Linux에 MATE를 설치하는 것이 멋지고 안정적인 대안이 될 것입니다. Rocky Linux 9.0에서는 사용 가능한 라이브 이미지로 전체 프로세스를 매우 쉽게 만들어냈습니다. diff --git a/docs/guides/desktop/mate_installation.md b/docs/guides/desktop/mate_installation.md deleted file mode 100644 index 6b0ae22e9b..0000000000 --- a/docs/guides/desktop/mate_installation.md +++ /dev/null @@ -1,202 +0,0 @@ ---- -title: MATE Desktop -author: lillolollo, Steven Spencer -contributors: Steven Spencer, Serge, Ganna Zhyrnova -tested_with: 8.5, 8.6, 9.0 -tags: - - mate - - desktop ---- - -# MATE Desktop Environment - -Created to fork and continue GNOME2 in the wake of the somewhat negative reception of GNOME3, the MATE desktop environment was born. MATE has loyal followers, who usually immediately install it on their OS of choice. Installation of MATE is possible on many flavors of Linux, including Rocky Linux. - -This procedure will get you up and running with MATE on Rocky Linux. - -## Prerequisites - -* A computer (notebook or workstation) with a screen and everything. -* A desire to run the MATE desktop instead of the default GNOME one. - -=== "9" - - ## 9: Introduction - - The development team for Rocky Linux 9 has made installing MATE, and other popular desktop environments, uncomplicated by including live images. For those that might not know what that is, a live image is a bootable image that will load the OS without installation. When loaded, you can install it to your machine's disk drive and use it. In addition to the live image instructions, we have included instructions for those of you who want to install MATE after the installation of the OS. - - ## 9: MATE from Live Image - - ### 9: Get, Verify, and Write the MATE Live Image - - Before installation, the first step is to download the live image and write that to a DVD or a USB thumb drive. As stated earlier, the image will be bootable, just like any other installation media for Linux. You can find the latest MATE image in the download section for Rocky Linux 9 [live images](https://dl.rockylinux.org/pub/rocky/9.6/live/x86_64/). Note this particular link assumes x86_64 as your architecture, and as of this writing that is the only architecture live image available. Download the live image and checksum files. - - Verify the image with the CHECKSUM file with the following - (note this is an example! Ensure your image name and CHECKSUM files match): - - ``` - sha256sum -c CHECKSUM --ignore-missing Rocky-9.6-MATE-x86_64-20250530.3.iso.CHECKSUM - ``` - - If all goes well, you will receive this message: - - ``` - Rocky-9.5-MATE-x86_64-20221124.0.iso: OK - ``` - - If the checksum for the file returns OK, you are now ready to write your ISO image to your media. This procedure differs depending on the OS, the media, and the tools. We assume that you know how to write the image to your media. - - ### 9: Booting - - This again is different by machine, BIOS, OS, and so on. You will need to ensure that your machine is set to boot to whatever your media is (DVD or USB) as the first boot device. If you are successful, you will see this screen: - - ![mate_boot](images/mate_boot.png) - - If so, you are on your way! If you want to test the media, select that option first, or enter **S** to **Start Rocky Linux Mate 9.0**. - - Remember, this is a live image. It will take some time to boot to the first screen. Do not panic, just wait! When the live image boots up, you will see this screen: - - ![mate-live](images/mate_live.png) - - ### 9: Installing MATE - - At this point, you can use the MATE environment and see if you like it. When you have decided that you want to use it permanently, double-click the option to **Install to Hard Drive**. - - This will start a pretty familiar installation process for those who have installed Rocky Linux before. In the following screen, we have highlighted things that you *may* want to change. - - ![mate_install](images/mate_install.png) - - 1. **Keyboard** - Ensure that it matches up to the keyboard layout that you use. - 2. **Time & Date** - Ensure this matches up to your time zone. - 3. **Installation Destination** - You will need to click into this option, even if it is just to accept what is already there. - 4. **Network & Host Name** - Verify that you have what you want here. Provided the network is enabled, you can always change this later if you need to. - 5. **Root Password** - Set a root password. Remember to save this somewhere safe (password manager). - 6. **User Creation** - Create at least one user. If you want the user to have administrative rights, set this option when creating the user. - 7. **Begin Installation** - When all of the settings have been set or verified, click this option. - - When you do step 7, the installation process will start installing packages, as in this screenshot: - - ![mate_install_2](images/mate_install_2.png) - - After the installation to the hard disk finishes, you will see the following screen: - - ![mate_install_final](images/mate_install_final.png) - - Click **Finish Installation**. - - At this point the OS will reboot. Remove your boot media and when the OS comes up for the first time, there is a licensing agreement screen: - - ![eula](images/eula.png) - - Click the **I accept the license agreement** check box, and click **Done**. This will get you to the final screen in the installation. On this screen, click **Finish Configuration**. - - ![mate_finish](images/mate_finish.png) - - Next you will get a login screen with the user you created. Enter your password, which will get you to the MATE desktop: - - ![mate_desktop](images/mate_desktop.png) - - ## 9: MATE after OS Install - - Installing MATE after the OS installation is also possible. This takes a few more steps, but is not a difficult process. Just follow these instructions. - - ### 9: Enabling Repositories - - You need the CRB repository and the EPEL repository. Enable those now: - - ``` - sudo dnf config-manager --set-enabled crb - sudo dnf install epel-release - ``` - - Run `dnf upgrade` to ensure all the enabled repositories read into the system. - - ### 9: Installing Packages - - The next thing you need is many packages. You can install these by copying and pasting the following into the command line on your machine: - - ``` - sudo dnf install NetworkManager-adsl NetworkManager-bluetooth NetworkManager-libreswan-gnome NetworkManager-openvpn-gnome NetworkManager-ovs NetworkManager-ppp NetworkManager-team NetworkManager-wifi NetworkManager-wwan adwaita-gtk2-theme alsa-plugins-pulseaudio atril atril-caja atril-thumbnailer caja caja-actions caja-image-converter caja-open-terminal caja-sendto caja-wallpaper caja-xattr-tags dconf-editor engrampa eom firewall-config gnome-disk-utility gnome-epub-thumbnailer gstreamer1-plugins-ugly-free gtk2-engines gucharmap gvfs-fuse gvfs-gphoto2 gvfs-mtp gvfs-smb initial-setup-gui libmatekbd libmatemixer libmateweather libsecret lm_sensors marco mate-applets mate-backgrounds mate-calc mate-control-center mate-desktop mate-dictionary mate-disk-usage-analyzer mate-icon-theme mate-media mate-menus mate-menus-preferences-category-menu mate-notification-daemon mate-panel mate-polkit mate-power-manager mate-screensaver mate-screenshot mate-search-tool mate-session-manager mate-settings-daemon mate-system-log mate-system-monitor mate-terminal mate-themes mate-user-admin mate-user-guide mozo network-manager-applet nm-connection-editor p7zip p7zip-plugins pluma seahorse seahorse-caja xdg-user-dirs-gtk - ``` - - This will install these needed packages plus all of the dependencies. - - Install lightdm-settings and lightdm also: - - ``` - sudo dnf install lightdm-settings lightdm - ``` - - ### 9: Final Steps - - If your system had Gnome or another desktop installed before installing MATE, you should be ready to reboot at this time. If there was no desktop installation in existence, you will need to use the following command to set the graphical target: - - ``` - sudo systemctl set-default graphical.target - ``` - - Then reboot - - ``` - sudo reboot - ``` - - When the system reboots, click on your user name, but before you enter your password, click on the gear icon in the lower right of the screen and select MATE from the desktop list. Login and you should have a fully functional MATE desktop. Future logins should remember your selection. - -=== "8" - - ## 8: Install Rocky Linux Minimal - - When installing Rocky Linux, we used the following sets of packages: - - * Minimal - * Standard - - ## 8: Enabling Repositories - - You need the Powertools repository and the EPEL repository. Enable those now: - - ``` - sudo dnf config-manager --set-enabled powertools - sudo dnf install epel-release - ``` - - And answer 'Y' to install the EPEL repository. - - Run `dnf update` to ensure all of the enabled repositories are read into the system. - - ## 8: Installing Packages - - The next thing you need many packages. You can install these by copying and pasting the following into the command line on your machine: - - ``` - sudo dnf install NetworkManager-adsl NetworkManager-bluetooth NetworkManager-libreswan-gnome NetworkManager-openvpn-gnome NetworkManager-ovs NetworkManager-ppp NetworkManager-team NetworkManager-wifi NetworkManager-wwan abrt-desktop abrt-java-connector adwaita-gtk2-theme alsa-plugins-pulseaudio atril atril-caja atril-thumbnailer caja caja-actions caja-image-converter caja-open-terminal caja-sendto caja-wallpaper caja-xattr-tags dconf-editor engrampa eom firewall-config gnome-disk-utility gnome-epub-thumbnailer gstreamer1-plugins-ugly-free gtk2-engines gucharmap gvfs-afc gvfs-afp gvfs-archive gvfs-fuse gvfs-gphoto2 gvfs-mtp gvfs-smb initial-setup-gui libmatekbd libmatemixer libmateweather libsecret lm_sensors marco mate-applets mate-backgrounds mate-calc mate-control-center mate-desktop mate-dictionary mate-disk-usage-analyzer mate-icon-theme mate-media mate-menus mate-menus-preferences-category-menu mate-notification-daemon mate-panel mate-polkit mate-power-manager mate-screensaver mate-screenshot mate-search-tool mate-session-manager mate-settings-daemon mate-system-log mate-system-monitor mate-terminal mate-themes mate-user-admin mate-user-guide mozo network-manager-applet nm-connection-editor p7zip p7zip-plugins pluma seahorse seahorse-caja xdg-user-dirs-gtk - ``` - - This will install these needed packages plus all of the dependencies. - - Install lightdm-settings and lightdm as well: - - ``` - sudo dnf install lightdm-settings lightdm - ``` - - ## 8: Final Steps - - Now that you have everything you need installed, you next must set the minimal install to boot into the Graphical User Interface (GUI). We can do this by entering: - - ``` - sudo systemctl set-default graphical.target - ``` - - Now just keep your fingers crossed and reboot: - - ``` - sudo reboot - ``` - - Next, click on your username on the screen, but before you enter your password and login, click on the gear icon to the left of the "Sign in" option. Select "MATE" from the available desktop choices and then enter your password and login. Future logins will remember your selection. - -## Conclusion - -Some people are not satisfied with the newer GNOME implementations or just prefer the older MATE GNOME 2 look and feel. Getting MATE installed in Rocky Linux will provide a friendly, stable alternative. For Rocky Linux 9.0, the developers have made the whole process very simplistic with the available live image. diff --git a/docs/guides/desktop/mate_installation.uk.md b/docs/guides/desktop/mate_installation.uk.md deleted file mode 100644 index 5309a3cee0..0000000000 --- a/docs/guides/desktop/mate_installation.uk.md +++ /dev/null @@ -1,211 +0,0 @@ ---- -title: Робочий стіл MATE -author: lillolollo, Steven Spencer -contributors: Steven Spencer, Serge, Ganna Zhyrnova -tested_with: 8.5, 8.6, 9.0 -tags: - - mate - - робочий стіл ---- - -# Середовище робочого столу MATE - -Створене для розгалуження та продовження GNOME2 на хвилі дещо ворожого сприйняття GNOME3, народилося робоче середовище MATE. MATE має лояльних послідовників, які зазвичай негайно встановлюють його на свою ОС. MATE можна встановити на багатьох версіях Linux, включаючи Rocky Linux. - -Ця процедура допоможе вам почати працювати з MATE на Rocky Linux. - -## Передумови - -* Комп’ютер (ноутбук або робоча станція) з екраном і всім необхідним. -* Бажання запустити робочий стіл MATE замість стандартного GNOME. - -=== "9" - - ## 9: Вступ - - Команда розробників Rocky Linux 9 спростила встановлення MATE та інших популярних робочих середовищ, включивши живі образи. Для тих, хто може не знати, що це таке, живий образ – це завантажувальний образ, який завантажує ОС без встановлення. Після завантаження ви можете встановити його на дисковод вашої машини та використовувати. На додаток до інструкцій щодо живого образу, ми включили інструкції для тих із вас, хто хоче встановити MATE після встановлення ОС. - - ## 9: MATE з Live Image - - ### 9: Отримайте, перевірте та запишіть живий образ MATE - - Першим кроком до інсталяції є завантаження живого образу та запис його на DVD або флешку USB. Як було зазначено раніше, образ буде завантажувальний, як і будь-який інший інсталяційний носій для Linux. Ви можете знайти найновіший образ MATE у розділі завантажень для Rocky Linux 9 [live-образи] (https://dl.rockylinux.org/pub/rocky/9.6/live/x86_64/). Зауважте, що це конкретне посилання передбачає x86_64 як вашу архітектуру, і на момент написання цієї статті це єдина архітектура, для якої доступний цей живий образ. Завантажте живий образ і файли контрольної суми. - - Тепер перевірте зображення за допомогою файлу CHECKSUM за допомогою наступного - (зверніть увагу, це приклад! Переконайтеся, що назва вашого зображення та файли CHECKSUM збігаються): - - ``` - sha256sum -c CHECKSUM --ignore-missing Rocky-9.6-MATE-x86_64-20250530.3.iso.CHECKSUM - ``` - - - Якщо все піде добре, ви повинні отримати це повідомлення: - - ``` - Rocky-9.5-MATE-x86_64-20221124.0.iso: OK - ``` - - - Якщо контрольна сума для файлу повертає ОК, тепер ви готові записати образ ISO на носій. Ця процедура відрізняється залежно від вашої ОС, носія та інструментів. Ми припускаємо, що ви знаєте, як записати зображення на свій носій. - - ### 9: Завантаження - - Знову ж таки, це залежить від машини, BIOS, ОС тощо. Ви повинні переконатися, що ваша машина налаштована на завантаження будь-якого носія (DVD або USB) як першого завантажувального пристрою. У разі успіху ви побачите цей екран: - - ![mate_boot](images/mate_boot.png) - - Якщо так, то ви на вірному шляху! Якщо ви хочете протестувати носій, спочатку виберіть цей параметр або введіть **S**, щоб **запустити Rocky Linux Mate 9.0**. - - Пам’ятайте, це живе зображення. Завантаження на перший екран займе деякий час. Не панікуйте, просто почекайте! Коли живий образ завантажиться, ви побачите цей екран: - - ![mate-live](images/mate_live.png) - - ### 9: Встановлення MATE - - На цьому етапі ви можете використовувати середовище MATE і перевірити, чи воно вам подобається. Коли ви вирішите, що хочете використовувати його назавжди, двічі клацніть опцію **Встановити на жорсткий диск**. - - Це почне знайомий процес встановлення для тих, хто встановив Rocky Linux. На наступному екрані ми виділили речі, які ви *можете* захотіти змінити. - - ![mate_install](images/mate_install.png) - - 1. **Keyboard**. Подивіться на цей параметр і переконайтеся, що він відповідає розкладці клавіатури, яку ви використовуєте. - 2. **Time & Date** – переконайтеся, що вона відповідає вашому часовому поясу. - 3. **Installation Destination**. Вам потрібно буде натиснути цей параметр, навіть якщо це потрібно для прийняття того, що вже є. - 4. **Network & Host Name**. Переконайтеся, що тут є те, що ви хочете. Поки мережа ввімкнена, ви завжди можете змінити це пізніше, якщо знадобиться. - 5. **Root Password** – встановіть пароль адміністратора. Не забудьте зберегти це в безпечному місці (менеджер паролів), головним чином, якщо ви не використовуєте його часто. - 6. **User Creation** – обов’язково створіть принаймні одного користувача. Якщо ви хочете, щоб користувач мав права адміністратора, не забудьте встановити цей параметр під час створення користувача. - 7. **Begin Installation** – коли всі параметри встановлено або перевірено, натисніть цю опцію. - - Коли ви виконаєте крок 7, процес інсталяції має почати інсталяцію пакетів, як на знімку екрана нижче: - - ![mate_install_2](images/mate_install_2.png) - - Після завершення інсталяції на жорсткий диск ви побачите такий екран: - - ![mate_install_final](images/mate_install_final.png) - - Натисніть **Finish Installation**. - - У цей момент ОС перезавантажиться. Видаліть завантажувальний носій, і коли ОС з’явиться вперше, з’явиться екран ліцензійної угоди: - - ![eula](images/eula.png) - - Поставте прапорець **Я приймаю ліцензійну угоду**, а потім натисніть **Готово**. Це приведе вас до останнього екрана, що стосується встановлення. На цьому екрані натисніть **Завершити налаштування**. - - ![mate_finish](images/mate_finish.png) - - Далі ви отримаєте екран входу з користувачем, якого ви створили вище. Введіть свій пароль, який переведе вас на робочий стіл MATE: - - ![mate_desktop](images/mate_desktop.png) - - - ## 9: MATE після встановлення ОС - - MATE також можна встановити після встановлення ОС. Це вимагає ще кількох кроків, але це не складний процес. Просто дотримуйтесь цих інструкцій. - - - ### 9: Увімкнення репозиторіїв - - Вам потрібні репозиторій CRB і репозиторій EPEL. Увімкніть їх зараз: - - ``` - sudo dnf config-manager --set-enabled crb - sudo dnf install epel-release - ``` - - Запустіть `dnf upgrade`, щоб переконатися, що всі активовані репозиторії зчитуються в системі. - - - ### 9: Встановлення пакетів - - Наступне, що нам потрібно, це багато пакунків. Ви можете встановити їх, просто скопіювавши та вставивши наступне в командний рядок на вашому комп’ютері: - - ``` - sudo dnf install NetworkManager-adsl NetworkManager-bluetooth NetworkManager-libreswan-gnome NetworkManager-openvpn-gnome NetworkManager-ovs NetworkManager-ppp NetworkManager-team NetworkManager-wifi NetworkManager-wwan adwaita-gtk2-theme alsa-plugins-pulseaudio atril atril-caja atril-thumbnailer caja caja-actions caja-image-converter caja-open-terminal caja-sendto caja-wallpaper caja-xattr-tags dconf-editor engrampa eom firewall-config gnome-disk-utility gnome-epub-thumbnailer gstreamer1-plugins-ugly-free gtk2-engines gucharmap gvfs-fuse gvfs-gphoto2 gvfs-mtp gvfs-smb initial-setup-gui libmatekbd libmatemixer libmateweather libsecret lm_sensors marco mate-applets mate-backgrounds mate-calc mate-control-center mate-desktop mate-dictionary mate-disk-usage-analyzer mate-icon-theme mate-media mate-menus mate-menus-preferences-category-menu mate-notification-daemon mate-panel mate-polkit mate-power-manager mate-screensaver mate-screenshot mate-search-tool mate-session-manager mate-settings-daemon mate-system-log mate-system-monitor mate-terminal mate-themes mate-user-admin mate-user-guide mozo network-manager-applet nm-connection-editor p7zip p7zip-plugins pluma seahorse seahorse-caja xdg-user-dirs-gtk - ``` - - Це встановить необхідні пакунки та всі залежності. - - Також встановіть ligtdm-settings і ligtdm: - - ``` - sudo dnf install lightdm-settings lightdm - ``` - - - ### 9: Останні кроки - - Якщо перед установкою MATE у вашій системі був встановлений Gnome або інший робочий стіл, ви повинні бути готові до перезавантаження зараз. Якщо робочий стіл не встановлено, вам потрібно буде використати таку команду, щоб установити графічну ціль: - - ``` - sudo systemctl set-default graphical.target - ``` - - Потім перезавантажте - - ``` - sudo reboot - ``` - - Коли система перезавантажиться, клацніть своє ім’я користувача, але перш ніж вводити пароль, клацніть значок шестірні в нижньому правому куті екрана та виберіть MATE зі списку робочого столу. Потім увійдіть, і у вас має бути повнофункціональний робочий стіл MATE. Майбутні входи повинні пам'ятати ваш вибір. - -=== "8" - - ## 8: Встановіть Rocky Linux Minimal - - Під час встановлення Rocky Linux ми використовували такі набори пакетів: - - * Minimal - * Standard - - - ## 8: Увімкнення репозиторіїв - - Вам потрібні репозиторій CRB і репозиторій EPEL. Увімкніть їх зараз: - - ``` - sudo dnf config-manager --set-enabled powertools - sudo dnf install epel-release - ``` - - Щоб встановити репозиторій EPEL, дайте відповідь «Y». - - Запустіть `dnf update`, щоб переконатися, що всі активовані репозиторії зчитуються в системі. - - - ## 8: Встановлення пакетів - - Наступне, що нам потрібно, це багато пакунків. Ви можете встановити їх, просто скопіювавши та вставивши наступне в командний рядок на вашому комп’ютері: - - ``` - sudo dnf install NetworkManager-adsl NetworkManager-bluetooth NetworkManager-libreswan-gnome NetworkManager-openvpn-gnome NetworkManager-ovs NetworkManager-ppp NetworkManager-team NetworkManager-wifi NetworkManager-wwan abrt-desktop abrt-java-connector adwaita-gtk2-theme alsa-plugins-pulseaudio atril atril-caja atril-thumbnailer caja caja-actions caja-image-converter caja-open-terminal caja-sendto caja-wallpaper caja-xattr-tags dconf-editor engrampa eom firewall-config gnome-disk-utility gnome-epub-thumbnailer gstreamer1-plugins-ugly-free gtk2-engines gucharmap gvfs-afc gvfs-afp gvfs-archive gvfs-fuse gvfs-gphoto2 gvfs-mtp gvfs-smb initial-setup-gui libmatekbd libmatemixer libmateweather libsecret lm_sensors marco mate-applets mate-backgrounds mate-calc mate-control-center mate-desktop mate-dictionary mate-disk-usage-analyzer mate-icon-theme mate-media mate-menus mate-menus-preferences-category-menu mate-notification-daemon mate-panel mate-polkit mate-power-manager mate-screensaver mate-screenshot mate-search-tool mate-session-manager mate-settings-daemon mate-system-log mate-system-monitor mate-terminal mate-themes mate-user-admin mate-user-guide mozo network-manager-applet nm-connection-editor p7zip p7zip-plugins pluma seahorse seahorse-caja xdg-user-dirs-gtk - ``` - - Це встановить необхідні пакунки та всі залежності. - - Встановіть lightdm-settings і lightdm також: - - ``` - sudo dnf install lightdm-settings lightdm - ``` - - - ## 8: Останні кроки - - Тепер, коли ми встановили все необхідне, ми повинні встановити мінімальну інсталяцію для завантаження в графічний інтерфейс користувача (GUI). Ми можемо зробити це, ввівши: - - ``` - sudo systemctl set-default graphical.target - ``` - - Тепер просто тримайте кулаки та перезавантажте: - - ``` - sudo reboot - ``` - - Далі клацніть своє ім’я користувача на екрані, але перш ніж ввести пароль і увійти, клацніть значок шестірні ліворуч від опції «Увійти». Виберіть «MATE» із доступних варіантів робочого столу, після чого ви зможете ввести свій пароль і увійти. Подальші входи запам'ятають ваш вибір. - -## Висновок - -Деякі люди незадоволені новішими реалізаціями GNOME або віддають перевагу старішому вигляду та роботі MATE GNOME 2. Встановлення MATE у Rocky Linux забезпечить дружню, стабільну альтернативу для цих людей. Для Rocky Linux 9.0 розробники зробили весь процес дуже легким за допомогою доступного живого образу. diff --git a/docs/guides/desktop/xfce_installation.es.md b/docs/guides/desktop/xfce_installation.es.md deleted file mode 100644 index a9c813cf2a..0000000000 --- a/docs/guides/desktop/xfce_installation.es.md +++ /dev/null @@ -1,113 +0,0 @@ -- - - -title: Entorno de escritorio XFCE autor: Gerard Arthus colaboradores: Steven Spencer, Antoine Le Morvan, K.Prasad, Pedro Garcia etiquetas: - - xfce - - desktop -- - - - -# Entorno de escritorio XFCE - -El entorno de escritorio XFCE fue creado como una bifurcación de Common Desktop Environment (CDE). Xfce encarna la filosofía tradicional de Unix en relación a la modularidad y usabilidad. XFCE se puede instalar en casi cualquier versión de Linux, incluyendo Rocky Linux. - -Este procedimiento está diseñado para que pueda trabajar con Rocky Linux utilizando XFCE. - -## Requisitos previos - -* Una estación de trabajo o un servidor, preferiblemente con Rocky Linux ya instalado. -* Debe utilizar el usuario root o escribir `sudo` delante de todos los comandos que introduzca en el terminal. - -## Instalar Rocky Linux Minimal - -Al instalar Rocky Linux, utilizamos los siguientes conjuntos de paquetes: - -* Minimal -* Standard - -## Actualización del sistema - -Primero, ejecute el comando de actualización del servidor para permitir que el sistema reconstruya la caché de los repositorios, de forma que pueda reconocer los paquetes que hay disponibles. Para ello teclee el comando que se muestra a continuación: - -`dnf update` - -## Habilitar los repositorios - -Necesitamos el repositorio no oficial para XFCE en el EPEL, para ejecutarlo en las versiones 8.x. de Rocky Linux. - -Active este repositorio tecleando el siguiente comando: - -`dnf install epel-release` - -Y responda 'Y' para instalar EPEL. - -También necesitará los repositorios Powertools y lightdm. Continue y activelos mediante el comando: - -`sudo dnf config-manager --set-enabled powertools` - -`sudo dnf copr enable stenstorp/lightdm` - -!!! Warning - - El sistema de construcción `copr` crea un repositorio que funciona para instalar `lightdm`, recuerde que estos repositorios no son mantenidos por la comunidad Rocky Linux. ¡Utilícelos bajo su cuenta y riesgo! - -De nuevo, se le mostrará un mensaje de advertencia sobre el repositorio. Puede continuar y responder `Y` a la petición. - -## Compruebe los entornos y herramientas disponibles en el grupo - -Ahora que los repositorios están habilitados, ejecute los siguientes comandos para comprobar todo. - -Primero, compruebe el listado de sus repositorios, para ello ejecute el siguiente comando: - -`dnf repolist` - -Debería poder ver la siguiente información que muestra todos los repositorios habilitados en el sistema: - -``` -appstream Rocky Linux 8 - AppStream -baseos Rocky Linux 8 - BaseOS -copr:copr.fedorainfracloud.org:stenstorp:lightdm Copr repo for lightdm owned by stenstorp -epel Extra Packages for Enterprise Linux 8 - x86_64 -epel-modular Extra Packages for Enterprise Linux Modular 8 - x86_64 -extras Rocky Linux 8 - Extras -powertools Rocky Linux 8 - PowerTools -``` - -Ejecute el siguiente comando para comprobar XFCE: - -`dnf grouplist` - -Debería ver "Xfce" en la parte inferior de la lista. - -Continue y ejecute el comando `dnf update` una vez más para asegurarse de que todos los repositorios habilitados se pueden leer en el sistema. - -## Instalar paquetes - -Para instalar XFCE, ejecute: - -`dnf groupinstall "xfce"` - -Instale también lightdm: - -`dnf install lightdm` - -## Últimos pasos - -Necesitamos desactivar `gdm`, el cúal se añade y activa durante la ejecución de *dnf groupinstall "xfce"*: - -`systemctl disable gdm` - -Ahora podemos habilitar *lightdm*: - -`systemctl enable lightdm` - -Necesitamos indicarle al sistema después de arrancar que utilice solo la interfaz gráfica de usuario, así que para que se establezca como predeterminado a la interfaz GUI, ejecutamos el siguiente comando: - -`systemctl set-default graphical.target` - -Después, reiniciamos el sistema: - -`reboot` - -Debería terminar con un aviso de inicio de sesión en la GUI de XFCE, y cuando inicie sesión, tendrá todo el entorno de XFCE. - -## Conclusión - -XFCE es un entorno ligero con una interfaz sencilla para aquellos a los que no les gustan los entornos con muchos adornos y que estén demasiado sobrecargados. Este tutorial se actualizará con muy pronto con imágenes, incluyendo capturas de pantalla para dar un ejemplo más visual del proceso de instalación. diff --git a/docs/guides/desktop/xfce_installation.fr.md b/docs/guides/desktop/xfce_installation.fr.md deleted file mode 100644 index a02f532f92..0000000000 --- a/docs/guides/desktop/xfce_installation.fr.md +++ /dev/null @@ -1,289 +0,0 @@ -- - - -title: XFCE Desktop author: Gerard Arthus, Steven Spencer, Emre Camalan contributors: Steven Spencer, Antoine Le Morvan, K.Prasad, Ganna Zhyrnova tested_with: 8.9, 9.5 tags: - - xfce - - bureau -- - - - -# Environnement de bureau XFCE - -L'environnement de bureau XFCE, créé en tant que fork du Common Desktop Environment (CDE), incarne la philosophie Unix traditionnelle de Modularité et de Réutilisabilité. Vous pouvez installer XFCE sur la plupart des distributions GNU/Linux, y compris Rocky Linux. - -C'est aussi l'un des environnements de bureau les plus faciles à combiner avec des gestionnaires de fenêtres alternatifs, tels que Awesome ou i3. Cette procédure est cependant conçue pour vous permettre de démarrer avec Rocky Linux en utilisant une installation typique de XFCE. - -## Prérequis - -* Une station de travail ou un notebook -* L'intention d'utiliser l'environnement de bureau XFCE au lieu de GNOME, celui par défaut -* Pour les procédures 9-minimal et 8, la possibilité d'utiliser `sudo` pour élever les privilèges - -=== "9" - - ## 9: Introduction - - L'équipe de développement de Rocky Linux 9 a facilité l'installation de XFCE et d'autres environnements de bureau populaires, en incluant des images de live CD. Une image d'installation autonome, pour ceux qui ne savent peut-être pas ce que c'est, est une image amorçable qui chargera le système d'exploitation sans installation. Une fois chargé, vous pouvez l'installer sur le disque de votre ordinateur et l'utiliser. - - ## 9: Obtenir, vérifier et écrire l'image live XFCE - - Avant l'installation, la première étape consiste à télécharger l'image live et à l'écrire sur un DVD ou une clé USB. Comme indiqué précédemment, l'image sera amorçable, tout comme avec tout autre support d'installation pour Linux. Vous pouvez trouver l'image XFCE la plus récente dans la section téléchargement pour Rocky Linux 9 [images live](https://dl.rockylinux.org/pub/rocky/9.6/live/x86_64/). Notez que ce lien particulier suppose que x86_64 est l'architecture de votre processeur. - - Au Moment de l'écriture de cet article, vous pouvez utiliser l'architecture x86_64 ou aarch64 pour cette image live. Téléchargez l'image live et les fichiers de vérification correspondants. - - Vérifiez l'image ISO avec le fichier CHECKSUM en utilisant la commande suivante - (n'oubliez pas qu'il sagit d'un exemple ! Assurez-vous que le nom de votre image et les fichiers CHECKSUM correspondent) : - - ``` - sha256sum -c CHECKSUM --ignore-missing Rocky-9-XFCE-x86_64-latest.iso.CHECKSUM - ``` - - - Si tout se passe bien, vous devriez voir le message suivant : - - ``` - Rocky-9-XFCE-x86_64-latest.iso: OK - ``` - - - Si la somme de contrôle du fichier retourne OK, vous êtes prêt à sauvegarder l'image ISO sur votre support de stockage. Cette procédure est différente selon le système que vous utilisez, le support d'enregistrement et les outils. Nous supposons ici que vous savez enregistrer l'image sur un support adéquat. - - ## 9: Démarrage - - Ceci est différent selon la machine, BIOS, OS, etc. Vous devez vous assurer que votre machine est configurée pour démarrer avec n'importe quel support (DVD ou USB) comme premier périphérique de démarrage. Si l'opération a réussi, cet écran devrait apparaître : - - ![xfce_boot](images/xfce_boot.png) - - Si c'est le cas, vous êtes sur la bonne voie ! Si vous souhaitez tester la prise en charge, vous pouvez d'abord saisir cette option, ou vous pouvez saisir **S** pour **Démarrer Rocky Linux XFCE 9.0**. - - N'oubliez pas qu'il s'agit d'une image live. Le lancement jusqu'au premier écran prend un certain temps. Pas de panique, il suffit d'attendre ! Lors du démarrage de l'image live, vous devriez voir l'affichage suivant : - - - ![xfce_install](images/xfce_install.png) - - ## 9: Installation de XFCE - - À partir de ce moment, vous pouvez utiliser l'environnement XFCE. Une fois que vous avez décidé de l'utiliser de manière permanente, double-cliquez sur l'option Install to Hard Drive. - - Cela lancera un processus d'installation assez familier pour ceux qui ont déjà installé Rocky Linux par le passé. Le premier écran vous permet de choisir votre langue par défaut : - - ![xfce_language](images/xfce_language.png) - - Sur l'écran suivant vous devrez effectuer des vérifications et les modifications nécessaires. Les options sont numérotées pour référence : - - ![xfce_install2](images/xfce_install_2.png) - - 1. **Keyboard** - Jetez un coup d'œil à cette option et assurez-vous qu'elle correspond bien à la disposition du clavier que vous utilisez. - 2. **Heure & Date** - Assurez-vous que cela correspond à votre fuseau horaire. - 3. **Installation Destination** - Vous devrez cliquer sur cette option, même si c'est juste pour accepter ce qui est déjà indiqué. - 4. **Network & Host Name** - Vérifiez que vous avez ce dont vous avez besoin ici. À condition que le réseau soit activé ; vous pouvez toujours modifier plus tard si vous le souhaitez. - 5. **Root Password** - Choisissez un mot de passe `root`. N'oubliez pas de sauvegarder ce mot de passe dans un endroit sûr (gestionnaire de mots de passe par ex.). - 6. **User Creation** - Créez au moins un utilisateur. Si vous voulez qu'il dispose de droits d'administration, définissez cette option lors de la création de l'utilisateur. - 7. **Begin Installation** - Après vérification, cochez cette option. - - Une fois que vous avez effectué l'étape 7, le processus d'installation devrait commencer à installer des paquets, comme indiqué dans la capture d'écran ci-dessous : - - ![xfce_install3](images/xfce_install_3.png) - - Après l'installation sur le disque dur, vous devriez voir l'affichage suivant : - - ![xfce_install_final](images/xfce_install_final.png) - - Cliquez sur **Finish Installation**. - - Lorsque vous avez fait cela, il vous ramène à l'écran de l'image live. Redémarrez votre machine et retirez le support de démarrage que vous avez utilisé pour l'installation XFCE. - - Ensuite, vous obtiendrez un écran de connexion avec l'utilisateur que vous avez créé précédemment. Saisissez votre mot de passe, qui vous mènera au bureau XFCE : - - ![xfce_desktop](images/xfce_desktop.png) - -=== "9-minimal" - - ## 9 minimal : Introduction - - Si vous avez installé Rocky Linux 9.x et décidez d'installer XFCE par la suite, cette procédure vous guidera. Cette procédure suppose une installation préalable de `Rocky-9.4-x86_64-minimal.iso`. - - ### Mise à jour du système - - Tout d'abord, vérifiez la mise à jour du système : - - ```bash - sudo dnf update -y && dnf upgrade -y - ``` - - - ![9_min1](images/xfce_9_min_1.png) - - Deuxièmement, exécutez la commande ci-dessous pour installer le dépôt epel-release qui contient tous les packages que nous devons installer pour `Xfce Desktop`. - - ```bash - sudo dnf install epel-release -y - ``` - - - ![9_min2](images/xfce_9_min_2.png) - - ### Installation de l'environnement de bureau XFCE - - Installez XFCE en exécutant cette commande : - - ```bash - sudo dnf groupinstall xfce -y - ``` - - - ![9_min3](images/xfce_9_min_3.png) - - ### Démarrage du bureau XFCE - - Vous pouvez lancer le bureau XFCE depuis la ligne de commande si vous voyez le message `Complete!` dans la sortie de commande sans aucune erreur. - - ```bash - sudo systemctl isolate graphical.target - ``` - - - ### Activer le bureau XFCE au démarrage - - À ce stade, vous avez installé le bureau XFCE sur le système et vous vous êtes assuré de son fonctionnement en l'exécutant à partir de la ligne de commande. Si vous souhaitez que votre système démarre toujours avec XFCE au lieu d'utiliser la ligne de commande, vous devez exécuter la commande suivante. Vous devrez d’abord ouvrir le terminal XFCE à partir de l’icône à 9 points : - - ```bash - sudo systemctl set-default graphical.target - ``` - - - ![9_min5](images/xfce_9_min_5.png) - - **REMARQUE :** Vous pouvez vous connecter avec votre nom d'utilisateur et votre mot de passe root. - - ![9_min6](images/xfce_9_min_6.png) - - Maintenant vous pouvez effectuer des tests. Relancez votre système avec la commande `sudo reboot`. Vous verrez votre système s'ouvrir avec l'écran de connexion du bureau XFCE. - - ![9_min7](images/xfce_9_min_7.png) - -=== "8" - - ## 8: Installation de Rocky Linux Minimal - - !!! note - - Dans cette section, vous devrez soit être l'utilisateur `root`, soit être en mesure d'exécuter `sudo` pour élever vos privilèges. - - Lors de l'installation de Rocky Linux, nous avons utilisé les ensembles de paquets suivants : - - * Minimal - * Standard - - - ## 8: Exécuter la mise à jour du système - - D'abord, lancez la commande de mise à jour du serveur. Le système va renouveler le cache des dépôts. Lors de cette opération, le système va reconnaître les paquets disponibles. - - ``` - dnf update - ``` - - - ## 8: Activation des dépôts - - Nous avons besoin du dépôt non officiel pour XFCE dans le référentiel EPEL, pour fonctionner sur les versions de Rocky 8.x. - - Activer ce dépôt en entrant la commande suivante : - - ``` - dnf install epel-release - ``` - - Répondez 'Y' pour l'installer. - - Vous avez également besoin des Powertools et des dépôts lightdm. Continuez en les activant : - - ``` - dnf config-manager --set-enabled powertools - dnf copr enable stenstorp/lightdm - ``` - - !!! warning "Avertissement" - - Le système de compilation `copr` crée un dépôt connu pour installer `lightdm`, mais n'est pas maintenu par la communauté Rocky Linux. Utilisez tout ça à vos risques et périls ! - - Encore une fois, un message d'avertissement concernant le répertoire vous sera présenté. Allez-y et répondez `Y` à l'invite. - - - ## 8.6 : Vérifiez les Environnements et Outils disponibles dans le Groupe - - Maintenant que les dépôts sont activés, exécutez les commandes suivantes pour tout vérifier. - - Tout d'abord, vérifiez votre liste de dépôts avec : - - ``` - dnf repolist - ``` - - Vous devriez récupérer les résultats suivants affichant tous les dépôts activés : - - ```bash - appstream Rocky Linux 8 - AppStream - baseos Rocky Linux 8 - BaseOS - copr:copr.fedorainfracloud.org:stenstorp:lightdm Copr repo for lightdm owned by stenstorp - epel Extra Packages for Enterprise Linux 8 - x86_64 - epel-modular Extra Packages for Enterprise Linux Modular 8 - x86_64 - extras Rocky Linux 8 - Extras - powertools Rocky Linux 8 - PowerTools - ``` - - Exécutez la commande suivante pour vérifier la présence de XFCE: - - ``` - dnf grouplist - ``` - - Vous devriez obtenir "Xfce" en bas de la liste. - - Eexécutez `dnf update` une ou plusieurs fois pour vous assurer que tous les dépôts activés sont inclus dans le système. - - - ## 8: Installation des paquets - - Pour installer XFCE, exécutez la commande suivante : - - ``` - dnf groupinstall "xfce" - ``` - - Installez également 'lightdm' : - - ``` - dnf install lightdm - ``` - - - ## 8: Étapes finales - - Nous devons désactiver le paquet `gdm`, qui est ajouté et activé pendant *dnf groupinstall "xfce"* : - - ``` - systemctl disable gdm - ``` - - Maintenant nous pouvons activer *lightdm* : - - ``` - systemctl enable lightdm - ``` - - Vous devez indiquer au système d'utiliser seulement l'interface graphique après le démarrage. Définissez le système cible par défaut vers l'interface GUI : - - ``` - systemctl set-default graphical.target - ``` - - Puis redémarrez le système : - - ``` - reboot - ``` - - Vous devriez vous retrouver avec une invite de connexion dans l'interface XFCE et, lorsque vous vous connectez, vous aurez tout l'environnement XFCE. - -## Conclusion - -XFCE est un environnement léger avec une interface simple. C'est une alternative à l'environnement GNOME par défaut sur Rocky Linux. Si vous utilisez Rocky Linux 9, les développeurs ont créé une image pratique qui accélère le processus d'installation. diff --git a/docs/guides/desktop/xfce_installation.it.md b/docs/guides/desktop/xfce_installation.it.md deleted file mode 100644 index fb05364bb2..0000000000 --- a/docs/guides/desktop/xfce_installation.it.md +++ /dev/null @@ -1,290 +0,0 @@ -- - - -title: XFCE Desktop author: Gerard Arthus, Steven Spencer, Emre Camalan contributors: Steven Spencer, Antoine Le Morvan, K.Prasad, Ganna Zhyrnova tested_with: 8.9, 9.5 tags: - - xfce - - desktop -- - - - -# Ambiente desktop XFCE - -L'ambiente desktop XFCE, creato come fork del Common Desktop Environment (CDE), incarna la tradizionale filosofia Unix di modularità e riutilizzabilità. È possibile installare XFCE su quasi tutte le versioni di Linux, compresa Rocky Linux. - -È anche uno degli ambienti desktop più facili da combinare con gestori di finestre alternativi, come Awesome o i3. Questa procedura, tuttavia, vi permetterà di essere operativi con Rocky Linux e un'installazione XFCE tradizionale. - -## Prerequisiti - -* Una workstation o un computer portatile -* Desiderio di eseguire XFCE come desktop invece del desktop predefinito GNOME -* Per le procedure 9 minimale e 8, la possibilità di utilizzare `sudo` per elevare i privilegi - -=== "9" - - ## 9: Introduzione - - Il team di sviluppo di Rocky Linux 9 ha reso semplice l'installazione di XFCE e di altri ambienti desktop popolari, includendo immagini live. Per chi non lo sapesse, un'immagine live è un'immagine avviabile che carica il sistema operativo senza installazione. Una volta caricato, è possibile installarlo nell'unità disco del computer e utilizzarlo. - - ## 9: Ottenere, verificare e scrivere l'immagine live di XFCE - - Prima dell'installazione, il primo passo è scaricare l'immagine live e scriverla su un DVD o una chiavetta USB. Come detto in precedenza, l'immagine sarà avviabile, proprio come qualsiasi altro supporto di installazione per Linux. È possibile trovare l'ultima immagine di XFCE nella sezione download di Rocky Linux 9 [immagini live](https://dl.rockylinux.org/pub/rocky/9.6/live/x86_64/). Si noti che questo particolare collegamento presuppone che x86_64 sia l'architettura del vostro processore. - - Al momento è possibile utilizzare architetture x86_64 o aarch64 per questa immagine live. Scaricare l'immagine live e i file di checksum. - - Verificare l'immagine con il file CHECKSUM come segue - - (si noti che questo è un esempio! Assicurarsi che il nome dell'immagine e i file CHECKSUM corrispondano): - - ``` - sha256sum -c CHECKSUM --ignore-missing Rocky-9-XFCE-x86_64-latest.iso.CHECKSUM - ``` - - - Se tutto è andato bene, verrà visualizzato questo messaggio: - - ``` - Rocky-9-XFCE-x86_64-latest.iso: OK - ``` - - - Se il checksum per il file restituisce OK, ora sei pronto a scrivere la tua immagine ISO sul tuo supporto. Questa procedura varia a seconda del sistema operativo, del supporto e degli strumenti. Si presuppone che sappiate come scrivere l'immagine sul vostro supporto. - - ## 9: Avvio - - Anche in questo caso la procedura è diversa a seconda della macchina, del BIOS, del sistema operativo e così via. È necessario assicurarsi che la macchina sia impostata per l'avvio dal vostro supporto (DVD o USB) come primo dispositivo di avvio. Questa schermata mostrerà se l'operazione è riuscita: - - ![xfce_boot](images/xfce_boot.png) - - In caso affermativo, siete sulla buona strada! Se si vuole testare il supporto, si può inserire prima questa opzione, oppure si può inserire **S** per **Avviare Rocky Linux XFCE 9.0**. - - Ricordate che si tratta di un'immagine live. L'avvio della prima schermata richiederà un po' di tempo. Non fatevi prendere dal panico, aspettate! Quando si avvia l'immagine live, viene visualizzata questa schermata: - - - ![xfce_install](images/xfce_install.png) - - ## 9: Installazione di XFCE - - A questo punto, è possibile utilizzare l'ambiente XFCE. Quando si decide di utilizzarlo in modo permanente, fare doppio clic sull'opzione Installa nel Disco Rigido. - - Si avvia così un processo di installazione abbastanza familiare per chi ha già installato Rocky Linux. La prima schermata consente di selezionare la lingua predefinita: - - ![xfce_language](images/xfce_language.png) - - La schermata successiva contiene alcuni elementi da verificare o modificare. Le opzioni sono numerate per riferimento: - - ![xfce_install2](images/xfce_install_2.png) - - 1. **Tastiera** - Assicurarsi che corrisponda al layout della tastiera in uso. - 2. **Ora e Data** - Assicurarsi che corrisponda al proprio fuso orario. - 3. **Destinazione di installazione** - È necessario fare clic su questa opzione, anche solo per accettare ciò che è già presente. - 4. **Rete e Nome Host** - Verificare che sia presente ciò che si desidera. Se la rete è abilitata, è sempre possibile modificarla in seguito, se necessario. - 5. **Password di Root** - Imposta una password di root. Ricordate di salvarla in un luogo sicuro (gestore di password). - 6. **Creazione di un Utente** - Creare almeno un utente. Se si desidera che l'utente abbia diritti amministrativi, impostare questa opzione al momento della creazione dell'utente. - 7. **Iniziare Installazione** - Una volta completata e verificata, fare clic su questa opzione. - - Una volta eseguito il passo 7, il processo di installazione inizierà a installare i pacchetti, come mostrato in questa schermata: - - ![xfce_install3](images/xfce_install_3.png) - - Al termine dell'installazione sul disco rigido, verrà visualizzata la seguente schermata: - - ![xfce_install_final](images/xfce_install_final.png) - - Fare clic su **Fine Installazione**. - - Dopo aver fatto ciò, si tornerà alla schermata dell'immagine live. Riavviare il computer e rimuovere il supporto di avvio utilizzato per l'installazione di XFCE. - - Si aprirà quindi una schermata di accesso con l'utente creato in precedenza. Immettere la password per accedere al desktop XFCE: - - ![xfce_desktop](images/xfce_desktop.png) - -=== "9-minimal" - - ## 9 minimal: Introduzione - - Se avete installato Rocky Linux 9.x e successivamente decidete di installare XFCE, questa procedura vi permetterà di farlo. Questa procedura presuppone l'installazione di `Rocky-9.4-x86_64-minimal.iso`. - - ### Aggiornare il sistema - - Per prima cosa, assicuratevi che il vostro sistema sia aggiornato: - - ```bash - sudo dnf update -y && dnf upgrade -y - ``` - - - ![9_min1](images/xfce_9_min_1.png) - - In secondo luogo, eseguite il comando seguente per installare il repo epel-release, che contiene tutti i pacchetti da installare per il Desktop Xfce. - - ```bash - sudo dnf install epel-release -y - ``` - - - ![9_min2](images/xfce_9_min_2.png) - - ### Installare il desktop XFCE - - Installare XFCE con questo comando: - - ```bash - sudo dnf groupinstall xfce -y - ``` - - - ![9_min3](images/xfce_9_min_3.png) - - ### Avvio del desktop XFCE - - È possibile avviare il desktop XFCE dalla riga di comando se viene visualizzato il messaggio "Complete!" nell'output del comando e se non ci sono errori. - - ```bash - sudo systemctl isolate graphical.target - ``` - - - ### Abilitare il desktop XFCE all'avvio - - A questo punto avete installato il desktop XFCE sul sistema e vi siete assicurati che funzioni eseguendolo dalla riga di comando. Se si desidera che il sistema si avvii sempre con XFCE invece che con la riga di comando, è necessario eseguire il seguente comando. È necessario aprire prima il terminale XFCE dall'icona dei 9 punti: - - ```bash - sudo systemctl set-default graphical.target - ``` - - - ![9_min5](images/xfce_9_min_5.png) - - **NOTA:** È possibile accedere con il nome utente e la password di root. - - ![9_min6](images/xfce_9_min_6.png) - - Ora è possibile testarlo. Riavviare il sistema con il comando `sudo reboot`. Il sistema si aprirà con la schermata di accesso al desktop XFCE. - - ![9_min7](images/xfce_9_min_7.png) - -=== "8" - - ## 8: Installare Rocky Linux minimale - - !!! note "Nota" - - In questa sezione, è necessario essere l'utente root o essere in grado di eseguire `sudo` per elevare i propri privilegi. - - Durante l'installazione di Rocky Linux, abbiamo utilizzato i seguenti pacchetti: - - * Minimal - * Standard - - - ## 8: Eseguire l'aggiornamento del sistema - - Per prima cosa, eseguire il comando di aggiornamento del server. Il sistema ricostruirà la cache del repository. In questo modo, la piattaforma di sistema riconosce i pacchetti disponibili. - - ``` - dnf update - ``` - - - ## 8: Abilitazione dei repository - - È necessario il repository non ufficiale di XFCE del repository EPEL, per poter funzionare sulle versioni Rocky 8.x. - - Abilitare questo repository inserendo: - - ``` - dnf install epel-release - ``` - - Rispondere "Y" per installarlo. - - Sono necessari anche i repository Powertools e lightdm. Abilitateli subito: - - ``` - dnf config-manager --set-enabled powertools - dnf copr enable stenstorp/lightdm - ``` - - !!! Warning "Attenzione" - - Il sistema di compilazione `copr` crea un repository che è noto per funzionare per l'installazione di `lightdm`, ma non è mantenuto dalla comunità Rocky Linux. Utilizzare a proprio rischio e pericolo! - - Anche in questo caso, verrà presentato un messaggio di avvertimento sul repository. Rispondete pure `Y` alla domanda. - - - ## 8: Controllare gli ambienti e gli strumenti disponibili nel gruppo - - Ora che i repository sono abilitati, eseguire i seguenti comandi per verificare il tutto. - - Per prima cosa, controllare l'elenco dei repository con: - - ``` - dnf repolist - ``` - - Si dovrebbe ottenere il seguente risultato che mostra tutti i repository abilitati: - - ```bash - appstream Rocky Linux 8 - AppStream - baseos Rocky Linux 8 - BaseOS - copr:copr.fedorainfracloud.org:stenstorp:lightdm Copr repo for lightdm owned by stenstorp - epel Extra Packages for Enterprise Linux 8 - x86_64 - epel-modular Extra Packages for Enterprise Linux Modular 8 - x86_64 - extras Rocky Linux 8 - Extras - powertools Rocky Linux 8 - PowerTools - ``` - - Eseguire il seguente comando per verificare la presenza di XFCE: - - ``` - dnf grouplist - ``` - - Dovreste vedere "Xfce" in fondo all'elenco. - - Eseguire ancora una volta `dnf update` per assicurarsi che tutti i repository abilitati vengano letti dal sistema. - - - ## 8: Installazione dei pacchetti - - Per installare XFCE, eseguire: - - ``` - dnf groupinstall "xfce" - ``` - - Installare anche lightdm: - - ``` - dnf install lightdm - ``` - - - ## 8: Fasi finali - - È necessario disabilitare `gdm`, che viene installato e abilitato durante *dnf groupinstall "xfce"*: - - ``` - systemctl disable gdm - ``` - - Ora è possibile abilitare *lightdm*: - - ``` - systemctl enable lightdm - ``` - - È necessario indicare al sistema, dopo l'avvio, di utilizzare solo l'interfaccia grafica. Impostare il sistema di destinazione predefinito sull'interfaccia GUI: - - ``` - systemctl set-default graphical.target - ``` - - Quindi riavviare: - - ``` - reboot - ``` - - Dovrebbe apparire un prompt di login nella GUI di XFCE e, una volta effettuato il login, si avrà a disposizione tutto l'ambiente XFCE. - -## Conclusioni - -XFCE è un ambiente leggero con un'interfaccia semplice. È un'alternativa al desktop GNOME predefinito su Rocky Linux. Se si utilizza Rocky Linux 9, gli sviluppatori hanno creato una pratica immagine live che velocizza il processo di installazione. diff --git a/docs/guides/desktop/xfce_installation.ko.md b/docs/guides/desktop/xfce_installation.ko.md deleted file mode 100644 index ac787ed863..0000000000 --- a/docs/guides/desktop/xfce_installation.ko.md +++ /dev/null @@ -1,226 +0,0 @@ -- - - -title: XFCE 데스트탑 author: Gerard Arthus, Steven Spencer contributors: Steven Spencer, Antoine Le Morvan, K.Prasad tested with: 8.5, 8.6, 9.0 tags: - - xfce - - 데스크톱 -- - - - -# XFCE 데스크탑 환경 - -XFCE 데스크탑 환경은 Common Desktop Environment (CDE)의 파생 프로젝트로 만들어졌습니다. XFCE는 모듈성과 재사용성이라는 전통적인 Unix 철학을 추구하고 있습니다. XFCE는 Rocky Linux를 포함하여 거의 모든 리눅스 버전에 설치할 수 있습니다. - -또한 이는 awesome 또는 i3와 같은 대체 창 관리자와 가장 쉽게 결합할 수 있는 데스크탑 환경 중 하나입니다. 하지만 이 절차는 더 일반적인 XFCE 설치를 통해 Rocky Linux를 사용하도록 설계되었습니다. - -## 필요 사항 - -* 워크스테이션 또는 노트북 -* 기본 GNOME 데스크톱 대신 XFCE를 사용하려는 의지 - -=== "9" - - ## 9: 소개 - - Rocky Linux 9의 개발 팀은 XFCE 및 기타 인기있는 데스크탑 환경을 설치하는 것을 쉽게 만들기 위해 라이브 이미지를 포함시켰습니다. 라이브 이미지는 OS를 설치하지 않고도 부팅할 수 있는 부팅 가능한 이미지입니다. 로드된 후, 이를 기기의 디스크 드라이브에 설치하여 사용할 수 있습니다. - - ## 9: XFCE 라이브 이미지 가져오기, 확인 및 쓰기 - - 설치 전에 첫 번째 단계는 라이브 이미지를 다운로드하고 DVD 또는 USB 썸드라이브에 작성하는 것입니다. 이미지는 다른 리눅스 설치 미디어와 마찬가지로 부팅 가능하게 됩니다. Rocky Linux 9 [라이브 이미지](https://dl.rockylinux.org/pub/rocky/9.1/live/x86_64/) 다운로드 섹션에서 최신 XFCE 이미지를 찾을 수 있습니다. - 이 특정 링크는 프로세서 아키텍처로 x86_64를 가정합니다. - - 이 문서 작성 시점에서 이 라이브 이미지에는 x86_64 또는 aarch64 아키텍처를 사용할 수 있습니다. 라이브 이미지와 체크섬 파일을 모두 다운로드하세요. - - 이제 다음을 사용하여 CHECKSUM 파일로 이미지를 확인하세요(주의: 이는 예시입니다! 이미지 이름과 CHECKSUM 파일이 일치하는지 확인하세요): - - ``` - sha256sum -c CHECKSUM --ignore-missing Rocky-9-XFCE-x86_64-latest.iso.CHECKSUM - ``` - - - 모든 것이 정상적으로 진행되면 다음과 같은 메시지가 나타납니다: - - ``` - Rocky-9-XFCE-x86_64-latest.iso: OK - ``` - - - 파일의 체크섬이 OK이면 이제 미디어에 ISO 이미지를 작성할 준비가 되었습니다. 이 프로세스는 사용하는 OS, 미디어 및 도구에 따라 다르므로, 여기서 이미지를 미디어에 작성하는 방법을 알고 있다고 가정합니다. 여기서는 이미지를 미디어에 쓰는 방법을 알고 있다고 가정합니다. - - ## 9: 부팅하기 - - 이는 기계, BIOS, OS 등에 따라 다르므로 자신의 미디어(디비디 또는 USB) 가 첫 번째 부팅 장치로 설정되도록 확인해야 합니다. 성공적으로 설정된 경우 다음과 같은 화면이 표시됩니다: - - ![xfce_boot](images/xfce_boot.png) - - 그렇다면 성공입니다! 미디어를 테스트하려면 해당 옵션을 먼저 선택하거나 **S**를 입력하여 **Start Rocky Linux XFCE 9.0**을 시작할 수 있습니다. - - 라이브 이미지이므로 첫 번째 화면으로 부팅하는 데 시간이 좀 걸릴 수 있습니다. 걱정하지 마시고 기다리세요! 라이브 이미지가 부팅되면 다음 화면을 볼 수 있습니다: - - - - ![xfce_install](images/xfce_install.png) - - ## 9: XFCE 설치 - - 이제 XFCE 환경을 사용하여 어떻게 보이는지 확인할 수 있습니다. 사용을 영구적으로 원한다고 결정하면 "Install to Hard Drive" 옵션을 두 번 클릭하세요. - - 이는 이미 Rocky Linux를 설치한 사용자들에게는 꽤 익숙한 설치 프로세스를 시작할 것입니다. 첫 번째 화면은 기본 언어를 선택하는 화면입니다: - - ![xfce_language](images/xfce_language.png) - - 다음 화면에는 확인하거나 변경해야 할 사항들이 나열됩니다. 옵션은 참고용으로 번호가 매겨져 있습니다: - - - - ![xfce_install2](images/xfce_install_2.png) - - 1. **키보드** - 사용하는 키보드 레이아웃과 일치하는지 확인하세요. - 2. **시간 & 날짜** - 시간대와 일치하는지 확인하세요. - 3. **설치 대상** - 이미 있는 것을 그대로 받아들이더라도 클릭해야 합니다. - 4. **네트워크 & 호스트 이름** - 원하는 내용을 확인하세요. 네트워크가 활성화된 상태라면 필요에 따라 나중에 변경할 수 있습니다. - 5. **루트 암호** - 루트 비밀번호를 설정하세요. 자주 사용하지 않을 경우에도 안전한 곳(비밀번호 관리자)에 저장하세요. - 6. **사용자 생성** - 적어도 하나의 사용자를 생성하세요. 사용자에게 관리 권한을 부여하려면 사용자를 생성할 때 이 옵션을 설정하세요. - 7. **설치 시작** - 모든 설정이 완료되었거나 확인되었을 때 이 옵션을 클릭하세요. - - 7단계를 완료하면 설치 과정이 아래 스크린샷과 같이 패키지를 설치하게 됩니다: - - ![xfce_install3](images/xfce_install_3.png) - - 하드 드라이브에 설치가 완료되면 다음 화면이 나타납니다: - - ![xfce_install_final](images/xfce_install_final.png) - - 계속해서 **Finish Installation**를 클릭합니다. - - 이렇게 하면 라이브 이미지 화면으로 돌아갑니다. 컴퓨터를 재부팅하고 XFCE 설치에 사용한 부팅 미디어를 제거하세요. - - 그런 다음 위에서 생성한 사용자의 로그인 화면이 나타납니다. 비밀번호를 입력하세요. 이렇게 하면 XFCE 데스크톱으로 이동합니다: - - ![xfce_desktop](images/xfce_desktop.png) - -=== "8" - - ## 8: Rocky Linux Minimal 설치 - - !!! note "참고사항" - - 참고: 이 섹션에서는 root 사용자이거나 권한을 상승시키기 위해 sudo를 사용할 수 있어야 합니다. - - Rocky Linux를 설치할 때 다음 패키지 세트를 사용했습니다. - - * Minimal - * Standard - - - ## 8: 시스템 업데이트 실행 - - 먼저 서버 업데이트 명령을 실행하여 시스템이 리포지토리 캐시를 다시 빌드하도록 하여 사용 가능한 패키지를 인식하게 합니다. - - ``` - dnf update - ``` - - - ## 8: 리포지토리 활성화 - - Rocky 8.x 버전에서 실행하려면 EPEL 리포지토리의 비공식 XFCE 리포지토리가 필요합니다. - - 이 리포지토리를 활성화하려면 다음을 입력하세요: - - ``` - dnf install epel-release - ``` - - 그리고 'Y'를 입력하여 설치를 진행하세요. - - Powertools와 lightdm 리포지토리도 필요합니다. 이제 다음을 입력하여 이들을 활성화하세요: - - ``` - dnf config-manager --set-enabled powertools - dnf copr enable stenstorp/lightdm - ``` - - !!! !!! - - `copr` 빌드 시스템은 `lightdm`을 설치하는 데 작동하는 것으로 알려져 있지만 Rocky Linux 커뮤니티에서 유지되지 않는 리포지토리입니다. 본인 책임 하에 사용하세요! - - 다시 한 번 리포지토리에 대한 경고 메시지가 표시됩니다. 'Y'로 응답하세요. - - - ## 8: 그룹에서 사용 가능한 환경 및 도구 확인 - - 이제 리포지토리가 활성화되었으므로 다음 명령으로 모든 것을 확인하세요. - - 먼저 다음 명령으로 리포지토리 목록을 확인하세요: - - ``` - dnf repolist - ``` - - 활성화된 모든 리포지토리가 나열된 것을 확인할 수 있습니다: - - ```bash - appstream Rocky Linux 8 - AppStream - baseos Rocky Linux 8 - BaseOS - copr:copr.fedorainfracloud.org:stenstorp:lightdm Copr repo for lightdm owned by stenstorp - epel Extra Packages for Enterprise Linux 8 - x86_64 - epel-modular Extra Packages for Enterprise Linux Modular 8 - x86_64 - extras Rocky Linux 8 - Extras - powertools Rocky Linux 8 - PowerTools - ``` - - 다음 명령으로 XFCE를 확인하세요: - - ``` - dnf grouplist - ``` - - 목록 하단에 "Xfce"가 표시되어야 합니다. - - 활성화된 모든 리포지토리가 시스템에 읽혀지도록 다시 한 번 `dnf update`를 실행하세요. - - - ## 8: 패키지 설치 - - XFCE를 설치하려면 다음을 실행하세요: - - ``` - dnf groupinstall "xfce" - ``` - - 또한 lightdm을 설치하세요: - - ``` - dnf install lightdm - ``` - - - ## 8: 최종 단계 - - *dnf groupinstall "xfce"*을 실행하면 추가되고 활성화되는 `gdm`을 비활성화해야 합니다: - - ``` - systemctl disable gdm - ``` - - 이제 *lightdm*을 활성화할 수 있습니다. - - ``` - systemctl enable lightdm - ``` - - 부팅 후에는 그래픽 사용자 인터페이스만 사용하도록 시스템에 지정합니다. 이를 위해 기본 대상 시스템을 GUI 인터페이스로 설정하세요: - - ``` - systemctl set-default graphical.target - ``` - - 그런 다음 재부팅하세요. - - ``` - reboot - ``` - - 이제 XFCE GUI에서 로그인 프롬프트가 나타날 것입니다. 로그인하면 모든 XFCE 환경을 사용할 수 있습니다. - -## 결론 - -XFCE는 가벼운 환경으로 간단한 인터페이스를 제공합니다. Rocky Linux의 기본 GNOME 데스크톱 대안입니다. Rocky Linux 9를 실행하는 경우 개발자들은 설치 과정을 빠르게 진행할 수 있는 편리한 라이브 이미지를 만들었습니다. diff --git a/docs/guides/desktop/xfce_installation.md b/docs/guides/desktop/xfce_installation.md deleted file mode 100644 index 4b2731ac3c..0000000000 --- a/docs/guides/desktop/xfce_installation.md +++ /dev/null @@ -1,282 +0,0 @@ ---- -title: XFCE Desktop -author: Gerard Arthus, Steven Spencer, Emre Camalan -contributors: Steven Spencer, Antoine Le Morvan, K.Prasad, Ganna Zhyrnova -tested_with: 8.9, 9.5 -tags: - - xfce - - desktop ---- - -# XFCE desktop environment - -The XFCE desktop environment, created as a fork of the Common Desktop Environment (CDE), embodies the traditional Unix philosophy of modularity and re-usability. You can install XFCE on almost any version of Linux, including Rocky Linux. - -It is also one of the most accessible desktop environments to combine with alternate window managers, such as Awesome or i3. This procedure, however, will get you up and running with Rocky Linux and a more typical XFCE installation. - -## Prerequisites - -* A workstation or notebook -* A desire to run XFCE as your desktop instead of the default GNOME desktop -* For the 9 minimal and 8 procedures, the ability to `sudo` to elevate privileges - -=== "9" - - ## 9: Introduction - - The development team for Rocky Linux 9 has made installing XFCE, and other popular desktop environments, uncomplicated by including live images. For those that might not know what that is, a live image is a bootable image that will load the OS without installation. When loaded, you have the option to install it to your machine's disk drive and use it. - - ## 9: Get, verify, and write the XFCE live image - - Prior to installation, the first step is to download the live image and write that to a DVD or a USB thumb drive. As stated earlier, the image will be bootable, just like any other installation media for Linux. You can find the latest XFCE image in the download section for Rocky Linux 9 [live images](https://dl.rockylinux.org/pub/rocky/9.6/live/x86_64/). Note that this particular link assumes x86_64 is your processor's architecture. - - As of this writing, you can use x86_64 or aarch64 architectures for this live image. Download the live image and checksum files. - - Verify the image with the CHECKSUM file with the following - - (note this is an example! Ensure your image name and CHECKSUM files match): - - ``` - sha256sum -c CHECKSUM --ignore-missing Rocky-9-XFCE-x86_64-latest.iso.CHECKSUM - ``` - - If all goes well, you will see this message: - - ``` - Rocky-9-XFCE-x86_64-latest.iso: OK - ``` - - If the checksum for the file returns OK, you are now ready to write your ISO image to your media. This procedure differs depending on the OS, the media, and the tools. We are assuming here that you know how to write the image to your media. - - ## 9: Booting - - This again is different by machine, BIOS, OS, and so on. You will need to ensure that your machine is set to boot to whatever your media is (DVD or USB) as the first boot device. This screen will show if you are successful: - - ![xfce_boot](images/xfce_boot.png) - - If so, you are on your way! If you want to test the media, you can enter that option first, or you can enter **S** to **Start Rocky Linux XFCE 9.0**. - - Remember, this is a live image. It is going to take some time to boot to the first screen. Do not panic, just wait! When the live image boots, you will see this screen: - - - ![xfce_install](images/xfce_install.png) - - ## 9: Installing XFCE - - At this point, you can use the XFCE environment. When you decide to use it permanently, double-click the option to Install to Hard Drive. - - This will start a pretty familiar installation process for those who have installed Rocky Linux before. The first screen will allow the selection your default language: - - ![xfce_language](images/xfce_language.png) - - The next screen will have some things that you need to verify or change. The options are numbered for reference: - - ![xfce_install2](images/xfce_install_2.png) - - 1. **Keyboard** - Ensure that it matches up to the keyboard layout that you use. - 2. **Time & Date** - Ensure this matches up to your time zone. - 3. **Installation Destination** - You will need to click into this option, even if it is just to accept what is already there. - 4. **Network & Host Name** - Verify that you have what you want here. Provided the network is enabled, you can always change this later if you need to. - 5. **Root Password** - Set a root password. Remember to save this somewhere safe (password manager). - 6. **User Creation** - Create at least one user. If you want the user to have administrative rights, set this option when creating the user. - 7. **Begin Installation** - When completed and verified, click this option. - - When you do step 7, the installation process will start installing packages, shown in this screenshot: - - ![xfce_install3](images/xfce_install_3.png) - - After the installation to the hard drive is complete, you will see the following screen: - - ![xfce_install_final](images/xfce_install_final.png) - - Click **Finish Installation**. - - When you have done this, it will take you back to the live image screen. Reboot your machine and remove the boot media you used for the XFCE install. - - Next you will get a login screen with the user you created above. Enter your password, which will get you to the XFCE desktop: - - ![xfce_desktop](images/xfce_desktop.png) - -=== "9-minimal" - - ## 9 minimal: Introduction - - If you installed Rocky Linux 9.x and decide that you want to install XFCE after, this procedure will get you there. This procedure assumes installation of `Rocky-9.4-x86_64-minimal.iso`. - - ### Update your system - - First, ensure the update of your system: - - ```bash - sudo dnf update -y && dnf upgrade -y - ``` - - ![9_min1](images/xfce_9_min_1.png) - - Secondly, run the command below to install epel-release repo which contains all packages that we need to install for Xfce Desktop. - - ```bash - sudo dnf install epel-release -y - ``` - - ![9_min2](images/xfce_9_min_2.png) - - ### Install XFCE desktop - - Install XFCE by running this command: - - ```bash - sudo dnf groupinstall xfce -y - ``` - - ![9_min3](images/xfce_9_min_3.png) - - ### Starting the XFCE desktop - - You can launch the XFCE desktop from the command line if you see the message "Complete!" in the command output and no errors. - - ```bash - sudo systemctl isolate graphical.target - ``` - - ### Enable XFCE desktop on boot - - At this point you have installed the XFCE desktop on the system and ensured it functions by running it from the command line. If you always want your system to start with XFCE instead of the command line, you need to run the following command. You will need to open the XFCE terminal from the 9 points icon first: - - ```bash - sudo systemctl set-default graphical.target - ``` - - ![9_min5](images/xfce_9_min_5.png) - - **NOTE:** You can log in with your root username and password. - - ![9_min6](images/xfce_9_min_6.png) - - Now you can test it. Reboot your system with the `sudo reboot` command. You will see your system opening with the XFCE desktop login screen. - - ![9_min7](images/xfce_9_min_7.png) - -=== "8" - - ## 8: Install Rocky Linux minimal - - !!! note - - Throughout this section, you will either need to be the root user or be able to `sudo` to elevate your privileges. - - When installing Rocky Linux, we used the following sets of packages: - - * Minimal - * Standard - - ## 8: Run System Update - - First, run the server update command. The system will rebuild the repository cache. In this way, the system cab recognize the packages available. - - ``` - dnf update - ``` - - ## 8: Enabling repositories - - You need the unofficial repository for XFCE in the EPEL repository, to run on Rocky 8.x versions. - - Enable this repository by entering: - - ``` - dnf install epel-release - ``` - - Answer 'Y' to install it. - - You also need the Powertools and lightdm repositories. Enable those now: - - ``` - dnf config-manager --set-enabled powertools - dnf copr enable stenstorp/lightdm - ``` - - !!! Warning - - The `copr` build system creates a repository that is known to work for installing `lightdm`, but is not maintained by the Rocky Linux community. Use at your own risk! - - Again, you will be presented with a warning message about the repository. Go ahead and answer `Y` to the prompt. - - ## 8: Check the available environments and tools in the group - - Now that the repositories are enabled, run the following commands to check everything. - - First, check your repository listing with: - - ``` - dnf repolist - ``` - - You should get the following back showing all of the enabled repositories: - - ```bash - appstream Rocky Linux 8 - AppStream - baseos Rocky Linux 8 - BaseOS - copr:copr.fedorainfracloud.org:stenstorp:lightdm Copr repo for lightdm owned by stenstorp - epel Extra Packages for Enterprise Linux 8 - x86_64 - epel-modular Extra Packages for Enterprise Linux Modular 8 - x86_64 - extras Rocky Linux 8 - Extras - powertools Rocky Linux 8 - PowerTools - ``` - - Run the following command to check for XFCE: - - ``` - dnf grouplist - ``` - - You should see "Xfce" at the bottom of the listing. - - Run `dnf update` one more time to ensure all of the enabled repositories read into the system. - - ## 8: Installing packages - - To install XFCE, run: - - ``` - dnf groupinstall "xfce" - ``` - - Also install lightdm: - - ``` - dnf install lightdm - ``` - - ## 8: Final steps - - You need to disable `gdm`, which gets added and enabled during *dnf groupinstall "xfce"*: - - ``` - systemctl disable gdm - ``` - - Now you can enable *lightdm*: - - ``` - systemctl enable lightdm - ``` - - You need to tell the system after booting to use only the graphical user interface. Set the default target system to the GUI interface: - - ``` - systemctl set-default graphical.target - ``` - - Then reboot: - - ``` - reboot - ``` - - You should end up with a login prompt in the XFCE GUI, and when you login, you will have all of the XFCE environment. - -## Conclusion - -XFCE is a light environment with a simplistic interface. It is an alternative to the default GNOME desktop on Rocky Linux. If you are running Rocky Linux 9, the developers have created a handy live image that speeds up the installation process. diff --git a/docs/guides/desktop/xfce_installation.uk.md b/docs/guides/desktop/xfce_installation.uk.md deleted file mode 100644 index 542f0df0c8..0000000000 --- a/docs/guides/desktop/xfce_installation.uk.md +++ /dev/null @@ -1,289 +0,0 @@ -- - - -title: XFCE Desktop author: Gerard Arthus, Steven Spencer, Emre Camalan contributors: Steven Spencer, Antoine Le Morvan, K.Prasad, Ganna Zhyrnova tested_with: 8.9, 9.5 tags: - - xfce - - робочий стіл -- - - - -# Середовище робочого столу XFCE - -Середовище робочого столу XFCE, створене як розгалуження загального середовища робочого столу (CDE), втілює традиційну філософію Unix модульності та багаторазового використання. Ви можете встановити XFCE практично на будь-яку версію Linux, включаючи Rocky Linux. - -Це також одне з найдоступніших середовищ робочого столу для поєднання з альтернативними менеджерами вікон, такими як Awesome або i3. Ця процедура, однак, призначена для того, щоб ви почали працювати з Rocky Linux за допомогою типовішої інсталяції XFCE. - -## Передумови - -* Робоча станція або ноутбук -* Бажання запустити XFCE як робочий стіл замість стандартного робочого столу GNOME -* Для 9 мінімальних і 8 процедур, можливість `sudo` для підвищення привілеїв - -=== "9" - - ## 9: Вступ - - Команда розробників Rocky Linux 9 спростила встановлення XFCE та інших популярних робочих середовищ, включивши живі образи. Для тих, хто може не знати, що це таке, живий образ – це завантажувальний образ, який завантажує ОС без встановлення. Ви можете встановити його на дисковод вашої машини та використовувати після завантаження. - - ## 9: Отримайте, перевірте та запишіть живий образ XFCE - - Першим кроком до інсталяції є завантаження живого образу та запис його на DVD або флешку USB. Як було зазначено раніше, образ буде завантажувальний, як і будь-який інший інсталяційний носій для Linux. Ви можете знайти найновіший образ XFCE у розділі завантажень для Rocky Linux 9 [live-образи] (https://dl.rockylinux.org/pub/rocky/9.6/live/x86_64/). Зауважте, що це конкретне посилання передбачає, що x86_64 є архітектурою вашого процесора. - - На момент написання цієї статті ви можете використовувати архітектуру x86_64 або aarch64 для цього живого образу. Завантажте живий образ і файли контрольної суми. - - Тепер перевірте зображення за допомогою файлу CHECKSUM за допомогою наступного - (зверніть увагу, це приклад! Переконайтеся, що назва вашого зображення та файли CHECKSUM збігаються): - - ``` - sha256sum -c CHECKSUM --ignore-missing Rocky-9-XFCE-x86_64-latest.iso.CHECKSUM - ``` - - - Якщо все піде добре, ви повинні побачити це повідомлення: - - ``` - Rocky-9-XFCE-x86_64-latest.iso: OK - ``` - - - Якщо контрольна сума для файлу повертає ОК, тепер ви готові записати образ ISO на носій. Ця процедура відрізняється залежно від вашої ОС, носія та інструментів. Ми припускаємо, що ви знаєте, як записати зображення на свій носій. - - ## 9: Завантаження - - Знову ж таки, це залежить від машини, BIOS, ОС тощо. Вам потрібно буде переконатися, що ваша машина налаштована на завантаження будь-якого носія (DVD або USB) як першого завантажувального пристрою. Якщо все добре, з'явиться цей екран: - - ![xfce_boot](images/xfce_boot.png) - - Якщо так, то ви на вірному шляху! Якщо ви хочете протестувати носій, ви можете спочатку ввести цю опцію або ввести **S**, щоб **запустити Rocky Linux XFCE 9.0**. - - Пам’ятайте, це живе зображення. Завантаження на перший екран займе деякий час. Просто зачекайте! Коли живий образ завантажиться, ви побачите цей екран: - - - ![xfce_install](images/xfce_install.png) - - ## 9: Встановлення XFCE - - На цьому етапі ви можете використовувати середовище XFCE. Якщо ви вирішите використовувати його назавжди, двічі клацніть опцію «Встановити на жорсткий диск». - - Це почне знайомий процес встановлення для тих, хто встановив Rocky Linux. Перший екран дозволить вибрати мову за умовчанням: - - ![xfce_language](images/xfce_language.png) - - На наступному екрані буде кілька речей, які вам потрібно перевірити або змінити. Параметри пронумеровані для довідки: - - ![xfce_install2](images/xfce_install_2.png) - - 1. **Keyboard**. Подивіться на цей параметр і переконайтеся, що він відповідає розкладці клавіатури, яку ви використовуєте. - 2. **Time & Date** – переконайтеся, що вона відповідає вашому часовому поясу. - 3. **Installation Destination**. Вам потрібно буде натиснути цей параметр, навіть якщо це потрібно для прийняття того, що вже є. - 4. **Network & Host Name**. Переконайтеся, що тут є те, що ви хочете. Поки мережа ввімкнена, ви завжди можете змінити це пізніше, якщо знадобиться. - 5. **Root Password** – встановіть пароль адміністратора. Не забудьте зберегти це в безпечному місці (менеджер паролів). - 6. **User Creation** – обов’язково створіть принаймні одного користувача. Якщо ви хочете, щоб користувач мав права адміністратора, не забудьте встановити цей параметр під час створення користувача. - 7. **Begin Installation** – після завершення та перевірки натисніть цю опцію. - - Коли ви виконаєте крок 7, процес інсталяції має почати інсталяцію пакетів, як на знімку екрана нижче: - - ![xfce_install3](images/xfce_install_3.png) - - Після завершення інсталяції на жорсткий диск ви побачите такий екран: - - ![xfce_install_final](images/xfce_install_final.png) - - Натисніть **Finish Installation**. - - Коли ви це зробите, ви повернетеся до екрана живого зображення. Перезавантажте машину та видаліть завантажувальний носій, який використовувався для встановлення XFCE. - - Далі ви отримаєте екран входу з користувачем, якого ви створили вище. Введіть свій пароль, який переведе вас на робочий стіл XFCE: - - ![xfce_desktop](images/xfce_desktop.png) - -=== "9-minimal" - - ## 9 minimal: Вступ - - Якщо ви встановили Rocky Linux 9.x і вирішите встановити XFCE після цього, ця процедура допоможе вам це зробити. Ця процедура передбачає встановлення `Rocky-9.4-x86_64-minimal.iso`. - - ### Оновіть свою систему - - Спочатку переконайтеся, що ваша система оновлена: - - ```bash - sudo dnf update -y && dnf upgrade -y - ``` - - - ![9_min1](images/xfce_9_min_1.png) - - По-друге, виконайте наведену нижче команду, щоб установити репозиторій epel-release, який містить усі пакунки, необхідні для встановлення для Xfce Desktop. - - ```bash - sudo dnf install epel-release -y - ``` - - - ![9_min2](images/xfce_9_min_2.png) - - ### Встановіть XFCE desktop - - Встановіть XFCE, виконавши цю команду: - - ```bash - sudo dnf groupinstall xfce -y - ``` - - - ![9_min3](images/xfce_9_min_3.png) - - ### Запуск робочого столу XFCE - - Ви можете запустити робочий стіл XFCE з командного рядка, якщо побачите повідомлення «Complete!» у виведенні команди та без помилок. - - ```bash - sudo systemctl isolate graphical.target - ``` - - - ### Увімкнути робочий стіл XFCE під час завантаження - - На цьому етапі ви встановили робочий стіл XFCE у системі та переконалися, що він працює, запустивши його з командного рядка. Якщо ви хочете, щоб ваша система завжди запускалася з XFCE замість командного рядка, ви повинні виконати таку команду. Вам потрібно буде спочатку відкрити термінал XFCE за допомогою значка 9 точок: - - ```bash - sudo systemctl set-default graphical.target - ``` - - - ![9_min5](images/xfce_9_min_5.png) - - **Важливо:** Ви можете увійти за допомогою свого імені користувача та пароля root. - - ![9_min6](images/xfce_9_min_6.png) - - Тепер ви можете перевірити це. Перезавантажте систему за допомогою команди `sudo reboot`. Ви побачите, що ваша система відкривається на екрані входу на робочий стіл XFCE. - - ![9_min7](images/xfce_9_min_7.png) - -=== "8" - - ## 8: Встановлення Rocky Linux Minimal - - !!! note "Примітка" - - У цьому розділі вам потрібно буде або бути користувачем root, або мати можливість використовувати sudo, щоб підвищити свої привілеї. - - Під час встановлення Rocky Linux ми використовували такі набори пакетів: - - * Minimal - * Standard - - - ## 8: Запуск оновлення системи - - Спочатку запустіть команду оновлення сервера. Система перебудує кеш сховища. Таким чином система може розпізнавати доступні пакети. - - ``` - dnf update - ``` - - - ## 8: Увімкнення репозиторіїв - - Нам потрібен неофіційний репозиторій для XFCE у сховищі EPEL для роботи на версіях Rocky 8.x. - - Увімкніть це сховище, ввівши: - - ``` - dnf install epel-release - ``` - - Щоб установити його, дайте відповідь «Y». - - Вам також потрібні репозиторії Powertools і lightdm. Увімкніть їх зараз: - - ``` - dnf config-manager --set-enabled powertools - dnf copr enable stenstorp/lightdm - ``` - - !!! Warning "Увага" - - Система збірки `copr` створює репозиторій, який, як відомо, працює для встановлення `lightdm`, але не підтримується спільнотою Rocky Linux. Використовуйте на свій страх і ризик! - - Знову вам буде запропоновано попередження про репозиторій. Дайте відповідь `Y` на підказку. - - - ## 8: Перевірте доступні середовища та інструменти в групі - - Тепер, коли репозиторії ввімкнено, виконайте наступні команди, щоб перевірити все. - - Спочатку перевірте свій список сховища за допомогою: - - ``` - dnf repolist - ``` - - Ви повинні отримати наступне, що показує всі ввімкнені сховища: - - ```bash - appstream Rocky Linux 8 - AppStream - baseos Rocky Linux 8 - BaseOS - copr:copr.fedorainfracloud.org:stenstorp:lightdm Copr repo for lightdm owned by stenstorp - epel Extra Packages for Enterprise Linux 8 - x86_64 - epel-modular Extra Packages for Enterprise Linux Modular 8 - x86_64 - extras Rocky Linux 8 - Extras - powertools Rocky Linux 8 - PowerTools - ``` - - Виконайте наступну команду для перевірки XFCE: - - ``` - dnf grouplist - ``` - - Ви повинні побачити «Xfce» у нижній частині списку. - - Запустіть `dnf update` ще раз, щоб переконатися, що всі активовані репозиторії зчитуються в системі. - - - ## 8: Встановлення пакетів - - Щоб встановити XFCE, запустіть: - - ``` - dnf groupinstall "xfce" - ``` - - Також встановіть lightdm: - - ``` - dnf install lightdm - ``` - - - ## 8: Останні кроки - - Вам потрібно вимкнути `gdm`, який додається та вмикається під час *dnf groupinstall "xfce"*: - - ``` - systemctl disable gdm - ``` - - Тепер ви можете ввімкнути *lightdm*: - - ``` - systemctl enable lightdm - ``` - - Вам потрібно повідомити системі після завантаження використовувати лише графічний інтерфейс користувача. Встановіть цільову систему за замовчуванням на інтерфейс GUI: - - ``` - systemctl set-default graphical.target - ``` - - Потім перезавантажте: - - ``` - reboot - ``` - - Ви маєте отримати запит на вхід у графічний інтерфейс XFCE, і коли ви ввійдете, ви матимете все середовище XFCE. - -## Висновок - -XFCE — це легке середовище з простим інтерфейсом. Це альтернатива стандартному робочому столу GNOME у Rocky Linux. Якщо ви використовуєте Rocky Linux 9, розробники створили зручний живий образ, який пришвидшує процес встановлення. From 8e9c3846ccf697d15ba00f5dcd9acda001347133 Mon Sep 17 00:00:00 2001 From: wsoyinka Date: Tue, 2 Sep 2025 15:48:06 -0400 Subject: [PATCH 132/164] rm 8 and 9 install guides from .pages --- docs/guides/.pages | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/guides/.pages b/docs/guides/.pages index 229a289951..4ba9e503a7 100644 --- a/docs/guides/.pages +++ b/docs/guides/.pages @@ -1,8 +1,6 @@ nav: - ... | index*.md - ... | installation*.md - - ... | 9_6_installation*.md - - ... | 8_6_installation*.md - ... | migrate2rocky*.md - ... | update_versions*.md - ... | custom-linux-kernel*.md From 345fe54a0a7a7a7acbb4f60dfa321986f8d95c64 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Fri, 5 Sep 2025 10:22:49 -0400 Subject: [PATCH 133/164] New Crowdin updates (#2864) * New translations import_rocky_to_wsl.md (German) * New translations 9_5.md (French) * New translations disa_stig_part3.md (Ukrainian) * New translations x11vnc_plus_ssh_lan.md (French) * New translations decibels.md (French) * New translations decoder.md (French) * New translations file-shredder.md (French) * New translations screenshot.md (French) * New translations nload.md (Ukrainian) * New translations lab8-system_and_process_monitoring-i.md (Ukrainian) * New translations iftop.md (Ukrainian) * New translations gnome-tweaks.md (Ukrainian) * New translations migration-to-new-azure-images.md (Ukrainian) * New translations ssh_ca_key_signing.md (Ukrainian) * New translations rdp-server.md (Ukrainian) * New translations x11vnc_plus_ssh_lan.md (Ukrainian) * New translations 02-web-servers-intro.md (Ukrainian) * New translations 022-web-servers-nginx.md (Ukrainian) * New translations firewallgui.md (Ukrainian) * New translations dconf.md (Ukrainian) * New translations businessapps.md (Ukrainian) * New translations onlineaccounts.md (Ukrainian) * New translations install_software_with_appimage.md (Ukrainian) * New translations installing_nvidia_gpu_drivers.md (Ukrainian) * New translations decibels.md (Ukrainian) * New translations decoder.md (Ukrainian) * New translations valuta.md (Ukrainian) * New translations file-shredder.md (Ukrainian) * New translations screenshot.md (Ukrainian) * New translations proton.md (Ukrainian) * New translations wordpress-on-lamp.md (Ukrainian) * New translations libvirt-rocky.md (Ukrainian) * New translations index.md (Ukrainian) * New translations lab0-readme.md (Ukrainian) * New translations pulp_fetch_upload.md (Ukrainian) * New translations rdp-server.md (German) * New translations dconf.md (German) * New translations businessapps.md (German) * New translations onlineaccounts.md (German) * New translations decoder.md (German) * New translations index.md (German) * New translations kde_installation.md (French) * New translations nload.md (French) * New translations iftop.md (French) * New translations gnome-tweaks.md (French) * New translations ssh_ca_key_signing.md (French) * New translations rdp-server.md (French) * New translations firewallgui.md (French) * New translations dconf.md (French) * New translations businessapps.md (French) * New translations onlineaccounts.md (French) * New translations install_software_with_appimage.md (French) * New translations installing_nvidia_gpu_drivers.md (French) * New translations valuta.md (French) * New translations proton.md (French) * New translations index.md (French) * New translations lab0-readme.md (French) * New translations nload.md (German) * New translations iftop.md (German) * New translations gnome-tweaks.md (German) * New translations x11vnc_plus_ssh_lan.md (German) * New translations firewallgui.md (German) * New translations install_software_with_appimage.md (German) * New translations installing_nvidia_gpu_drivers.md (German) * New translations decibels.md (German) * New translations valuta.md (German) * New translations file-shredder.md (German) * New translations screenshot.md (German) * New translations proton.md (German) * New translations lab0-readme.md (German) * New translations nload.md (Italian) * New translations lab8-system_and_process_monitoring-i.md (Italian) * New translations iftop.md (Italian) * New translations gnome-tweaks.md (Italian) * New translations migration-to-new-azure-images.md (Italian) * New translations ssh_ca_key_signing.md (Italian) * New translations rdp-server.md (Italian) * New translations x11vnc_plus_ssh_lan.md (Italian) * New translations 02-web-servers-intro.md (Italian) * New translations 022-web-servers-nginx.md (Italian) * New translations firewallgui.md (Italian) * New translations dconf.md (Italian) * New translations businessapps.md (Italian) * New translations onlineaccounts.md (Italian) * New translations install_software_with_appimage.md (Italian) * New translations installing_nvidia_gpu_drivers.md (Italian) * New translations decibels.md (Italian) * New translations decoder.md (Italian) * New translations valuta.md (Italian) * New translations file-shredder.md (Italian) * New translations screenshot.md (Italian) * New translations proton.md (Italian) * New translations wordpress-on-lamp.md (Italian) * New translations libvirt-rocky.md (Italian) * New translations index.md (Italian) * New translations lab0-readme.md (Italian) * New translations pulp_fetch_upload.md (Italian) * New translations index.md (Chinese Simplified) * New translations disa_stig_part3.md (Ukrainian) --- docs/books/disa_stig/disa_stig_part3.uk.md | 4 +- .../web_services/02-web-servers-intro.it.md | 22 ++++---- .../web_services/02-web-servers-intro.uk.md | 22 ++++---- .../web_services/022-web-servers-nginx.it.md | 34 ++++++------- .../web_services/022-web-servers-nginx.uk.md | 34 ++++++------- .../install_software_with_appimage.de.md | 4 +- .../install_software_with_appimage.fr.md | 4 +- .../install_software_with_appimage.it.md | 4 +- .../install_software_with_appimage.uk.md | 4 +- .../installing_nvidia_gpu_drivers.de.md | 10 ++-- .../installing_nvidia_gpu_drivers.fr.md | 10 ++-- .../installing_nvidia_gpu_drivers.it.md | 10 ++-- .../installing_nvidia_gpu_drivers.uk.md | 10 ++-- docs/desktop/gaming/proton.de.md | 6 +-- docs/desktop/gaming/proton.fr.md | 6 +-- docs/desktop/gaming/proton.it.md | 6 +-- docs/desktop/gaming/proton.uk.md | 6 +-- docs/desktop/gnome/dconf.de.md | 4 +- docs/desktop/gnome/dconf.fr.md | 4 +- docs/desktop/gnome/dconf.it.md | 4 +- docs/desktop/gnome/dconf.uk.md | 4 +- docs/desktop/gnome/decibels.de.md | 6 +-- docs/desktop/gnome/decibels.fr.md | 6 +-- docs/desktop/gnome/decibels.it.md | 6 +-- docs/desktop/gnome/decibels.uk.md | 6 +-- docs/desktop/gnome/decoder.de.md | 10 ++-- docs/desktop/gnome/decoder.fr.md | 10 ++-- docs/desktop/gnome/decoder.it.md | 10 ++-- docs/desktop/gnome/decoder.uk.md | 10 ++-- docs/desktop/gnome/file-shredder.de.md | 6 +-- docs/desktop/gnome/file-shredder.fr.md | 6 +-- docs/desktop/gnome/file-shredder.it.md | 6 +-- docs/desktop/gnome/file-shredder.uk.md | 6 +-- docs/desktop/gnome/gnome-tweaks.de.md | 2 +- docs/desktop/gnome/gnome-tweaks.fr.md | 2 +- docs/desktop/gnome/gnome-tweaks.it.md | 2 +- docs/desktop/gnome/gnome-tweaks.uk.md | 2 +- docs/desktop/gnome/onlineaccounts.de.md | 2 +- docs/desktop/gnome/onlineaccounts.fr.md | 2 +- docs/desktop/gnome/onlineaccounts.it.md | 2 +- docs/desktop/gnome/onlineaccounts.uk.md | 2 +- docs/desktop/gnome/rdp-server.de.md | 10 ++-- docs/desktop/gnome/rdp-server.fr.md | 10 ++-- docs/desktop/gnome/rdp-server.it.md | 10 ++-- docs/desktop/gnome/rdp-server.uk.md | 10 ++-- docs/desktop/gnome/screenshot.de.md | 2 +- docs/desktop/gnome/screenshot.fr.md | 2 +- docs/desktop/gnome/screenshot.it.md | 2 +- docs/desktop/gnome/screenshot.uk.md | 2 +- docs/desktop/gnome/valuta.de.md | 6 +-- docs/desktop/gnome/valuta.fr.md | 6 +-- docs/desktop/gnome/valuta.it.md | 6 +-- docs/desktop/gnome/valuta.uk.md | 6 +-- docs/desktop/gnome/x11vnc_plus_ssh_lan.de.md | 8 +-- docs/desktop/gnome/x11vnc_plus_ssh_lan.fr.md | 8 +-- docs/desktop/gnome/x11vnc_plus_ssh_lan.it.md | 8 +-- docs/desktop/gnome/x11vnc_plus_ssh_lan.uk.md | 8 +-- docs/desktop/tools/businessapps.de.md | 6 +-- docs/desktop/tools/businessapps.fr.md | 6 +-- docs/desktop/tools/businessapps.it.md | 6 +-- docs/desktop/tools/businessapps.uk.md | 6 +-- docs/desktop/tools/firewallgui.de.md | 6 +-- docs/desktop/tools/firewallgui.fr.md | 6 +-- docs/desktop/tools/firewallgui.it.md | 6 +-- docs/desktop/tools/firewallgui.uk.md | 6 +-- docs/gemstones/network/iftop.de.md | 30 +++++------ docs/gemstones/network/iftop.fr.md | 30 +++++------ docs/gemstones/network/iftop.it.md | 30 +++++------ docs/gemstones/network/iftop.uk.md | 30 +++++------ docs/gemstones/network/nload.de.md | 22 ++++---- docs/gemstones/network/nload.fr.md | 22 ++++---- docs/gemstones/network/nload.it.md | 22 ++++---- docs/gemstones/network/nload.uk.md | 22 ++++---- .../cloud/migration-to-new-azure-images.it.md | 16 +++--- .../cloud/migration-to-new-azure-images.uk.md | 16 +++--- docs/guides/cms/wordpress-on-lamp.it.md | 4 +- docs/guides/cms/wordpress-on-lamp.uk.md | 4 +- docs/guides/desktop/kde_installation.fr.md | 4 +- .../import_rocky_to_wsl.de.md | 4 +- .../repositories/pulp_fetch_upload.it.md | 4 +- .../repositories/pulp_fetch_upload.uk.md | 4 +- docs/guides/security/ssh_ca_key_signing.fr.md | 34 ++++++------- docs/guides/security/ssh_ca_key_signing.it.md | 34 ++++++------- docs/guides/security/ssh_ca_key_signing.uk.md | 34 ++++++------- .../guides/virtualization/libvirt-rocky.it.md | 50 +++++++++---------- .../guides/virtualization/libvirt-rocky.uk.md | 50 +++++++++---------- .../kubernetes-the-hard-way/lab0-README.de.md | 34 ++++++------- .../kubernetes-the-hard-way/lab0-README.fr.md | 34 ++++++------- .../kubernetes-the-hard-way/lab0-README.it.md | 34 ++++++------- .../kubernetes-the-hard-way/lab0-README.uk.md | 34 ++++++------- ...lab8-system_and_process_monitoring-I.it.md | 2 +- ...lab8-system_and_process_monitoring-I.uk.md | 2 +- docs/release_notes/9_5.fr.md | 2 +- docs/rocky_insights/blogs/index.de.md | 6 +-- docs/rocky_insights/blogs/index.fr.md | 6 +-- docs/rocky_insights/blogs/index.it.md | 6 +-- docs/rocky_insights/blogs/index.uk.md | 6 +-- docs/rocky_insights/blogs/index.zh.md | 6 +-- 98 files changed, 553 insertions(+), 553 deletions(-) diff --git a/docs/books/disa_stig/disa_stig_part3.uk.md b/docs/books/disa_stig/disa_stig_part3.uk.md index 40b549eecb..f8c75c4c01 100644 --- a/docs/books/disa_stig/disa_stig_part3.uk.md +++ b/docs/books/disa_stig/disa_stig_part3.uk.md @@ -208,7 +208,7 @@ echo "SessionCookieName session path=/; HttpOnly; Secure;" >> /etc/httpd/conf.d **Severity:** Cat II Medium **Type:** Operational -**Fix:** Ні, співпрацюйте з адміністратором SIEM, щоб надати можливість записувати вказаний вміст запису журналу на сервер журналу аудиту. +**Fix:** немає, співпрацюйте з адміністратором SIEM, щоб надати можливість записувати вказаний вміст запису журналу на сервер журналу аудиту. **(V-214228)** Веб-сервер Apache має обмежити кількість дозволених одночасних запитів сеансу. @@ -357,7 +357,7 @@ echo "Timeout 10" >> /etc/httpd/conf.d/disa-apache-stig.conf **Severity:** Cat II Medium **Type:** Operational -**Fix:** Ні, підготуйте документацію щодо методів аварійного відновлення для веб-сервера Apache 2.4 у разі необхідності відкоту. +**Fix:** Немає, підготуйте документацію щодо методів аварійного відновлення для веб-сервера Apache 2.4 у разі необхідності відкату. **(V-214257)** Необхідно вимкнути інформацію про налагодження та трасування, яка використовується для діагностики веб-сервера Apache. diff --git a/docs/books/web_services/02-web-servers-intro.it.md b/docs/books/web_services/02-web-servers-intro.it.md index 9943b4ab19..6b4f0fa894 100644 --- a/docs/books/web_services/02-web-servers-intro.it.md +++ b/docs/books/web_services/02-web-servers-intro.it.md @@ -23,14 +23,14 @@ Gli attuali protocolli HTTP sono la versione 1.1, ampiamente utilizzata, e le ve Una responce HTTP è un insieme di righe inviate al browser dal server. Che include: - - Una **status line**: specifica la versione del protocollo e lo stato di elaborazione della richiesta utilizzando un codice e un testo esplicativo. La riga comprende tre elementi separati da uno spazio: - - La versione del protocollo utilizzata - - Lo status code - - Il significato del codice +- Una **status line**: specifica la versione del protocollo e lo stato di elaborazione della richiesta utilizzando un codice e un testo esplicativo. La riga comprende tre elementi separati da uno spazio: + - La versione del protocollo utilizzata + - Lo status code + - Il significato del codice - - **Response header fields**: queste righe opzionali forniscono informazioni aggiuntive sulla risposta e/o sul server. Ogni riga è composta da un nome che qualifica il header type, seguito da due punti (:) e dal header value. +- **Response header fields**: queste righe opzionali forniscono informazioni aggiuntive sulla risposta e/o sul server. Ogni riga è composta da un nome che qualifica il header type, seguito da due punti (:) e dal header value. - - **The response body**: contiene il documento richiesto. +- **The response body**: contiene il documento richiesto. Ecco un esempio di risposta HTTP: @@ -70,15 +70,15 @@ Un URL ha tre parti: ://:/ ``` - - **Protocol name**: si tratta del linguaggio utilizzato per comunicare in rete, come HTTP, HTTPS, FTP, ecc. I protocolli più utilizzati sono l'HTTP (HyperText Transfer Protocol) e la sua versione sicura, l'HTTPS, utilizzata per lo scambio di pagine Web in formato HTML. +- **Protocol name**: si tratta del linguaggio utilizzato per comunicare in rete, come HTTP, HTTPS, FTP, ecc. I protocolli più utilizzati sono l'HTTP (HyperText Transfer Protocol) e la sua versione sicura, l'HTTPS, utilizzata per lo scambio di pagine Web in formato HTML. - - **Login** e **password**: Questa opzione consente di specificare i parametri di accesso a un server sicuro. Non è consigliabile, poiché la password è visibile nell'URL (per motivi di sicurezza). +- **Login** e **password**: Questa opzione consente di specificare i parametri di accesso a un server sicuro. Non è consigliabile, poiché la password è visibile nell'URL (per motivi di sicurezza). - - **Host**: È il nome del computer che ospita la risorsa richiesta. È possibile utilizzare anche l'indirizzo IP del server, ma ciò rende l'URL meno leggibile. +- **Host**: È il nome del computer che ospita la risorsa richiesta. È possibile utilizzare anche l'indirizzo IP del server, ma ciò rende l'URL meno leggibile. - - **Port number**: È associato a un servizio che consente al server di conoscere il tipo di risorsa richiesta. La porta predefinita del protocollo HTTP è la 80 e la 443 per HTTPS. Pertanto, il numero di porta è facoltativo quando il protocollo è HTTP o HTTPS. +- **Port number**: È associato a un servizio che consente al server di conoscere il tipo di risorsa richiesta. La porta predefinita del protocollo HTTP è la 80 e la 443 per HTTPS. Pertanto, il numero di porta è facoltativo quando il protocollo è HTTP o HTTPS. - - **Resource path**: Questa parte consente al server di conoscere la posizione della risorsa. In genere, si tratta della posizione (directory) e del nome del file richiesto. Se l'indirizzo non specifica una posizione, indica la prima pagina dell'host. Altrimenti, indica il percorso della pagina da visualizzare. +- **Resource path**: Questa parte consente al server di conoscere la posizione della risorsa. In genere, si tratta della posizione (directory) e del nome del file richiesto. Se l'indirizzo non specifica una posizione, indica la prima pagina dell'host. Altrimenti, indica il percorso della pagina da visualizzare. ### Porte diff --git a/docs/books/web_services/02-web-servers-intro.uk.md b/docs/books/web_services/02-web-servers-intro.uk.md index 634d929860..b2eee70bc5 100644 --- a/docs/books/web_services/02-web-servers-intro.uk.md +++ b/docs/books/web_services/02-web-servers-intro.uk.md @@ -23,14 +23,14 @@ HTTP — це протокол «запит-відповідь», що прац Відповідь HTTP – це набір рядків, які сервер надсилає браузеру. Це включає: - - **Рядок стану**: вказує версію протоколу та статус обробки запиту за допомогою коду та пояснювального тексту. Рядок складається з трьох елементів, розділених пробілом: - - Використана версія протоколу - - Код стану - - Значення коду +- **Рядок стану**: вказує версію протоколу та статус обробки запиту за допомогою коду та пояснювального тексту. Рядок складається з трьох елементів, розділених пробілом: + - Використана версія протоколу + - Код стану + - Значення коду - - **Поля заголовка відповіді**: це необов’язкові рядки, які надають додаткову інформацію про відповідь та/або сервер. Кожен рядок складається з назви, яка визначає тип заголовка, за якою йде двокрапка (:) і значення заголовка. +- **Поля заголовка відповіді**: це необов’язкові рядки, які надають додаткову інформацію про відповідь та/або сервер. Кожен рядок складається з назви, яка визначає тип заголовка, за якою йде двокрапка (:) і значення заголовка. - - **Тіло відповіді**: містить запитуваний документ. +- **Тіло відповіді**: містить запитуваний документ. Ось приклад відповіді HTTP: @@ -70,15 +70,15 @@ URL-адреса складається з трьох частин: ://:/ ``` - - **Назва протоколу**: це мова, яка використовується для спілкування через мережу, як-от HTTP, HTTPS, FTP тощо. Найпоширенішими протоколами є HTTP (протокол передачі гіпертексту) і його безпечна версія HTTPS, яка використовується для обміну веб-сторінками у форматі HTML. +- **Назва протоколу**: це мова, яка використовується для спілкування через мережу, як-от HTTP, HTTPS, FTP тощо. Найпоширенішими протоколами є HTTP (протокол передачі гіпертексту) і його безпечна версія HTTPS, яка використовується для обміну веб-сторінками у форматі HTML. - - **Логін** і **пароль**: дозволяє вказати параметри доступу до захищеного сервера. Цей параметр не рекомендується, оскільки пароль відображається в URL-адресі (з міркувань безпеки). +- **Логін** і **пароль**: дозволяє вказати параметри доступу до захищеного сервера. Цей параметр не рекомендується, оскільки пароль відображається в URL-адресі (з міркувань безпеки). - - **Хост**: це ім’я комп’ютера, на якому розміщено запитуваний ресурс. Зауважте, що можливе використання IP-адреси сервера, що робить URL-адресу менш читабельною. +- **Хост**: це ім’я комп’ютера, на якому розміщено запитуваний ресурс. Зауважте, що можливе використання IP-адреси сервера, що робить URL-адресу менш читабельною. - - **Номер порту**: це пов’язано зі службою, яка дозволяє серверу знати запитуваний тип ресурсу. Порт протоколу HTTP за замовчуванням — порт 80 і 443 із HTTPS. Отже, номер порту необов’язковий, якщо протокол HTTP або HTTPS. +- **Номер порту**: це пов’язано зі службою, яка дозволяє серверу знати запитуваний тип ресурсу. Порт протоколу HTTP за замовчуванням — порт 80 і 443 із HTTPS. Отже, номер порту необов’язковий, якщо протокол HTTP або HTTPS. - - **Шлях ресурсу**: ця частина дозволяє серверу знати розташування ресурсу. Як правило, це розташування (каталог) і ім’я запитуваного файлу. Якщо в адресі нічого не вказано місце розташування, це вказує на першу сторінку хоста. В іншому випадку він вказує шлях до сторінки для відображення. +- **Шлях ресурсу**: ця частина дозволяє серверу знати розташування ресурсу. Як правило, це розташування (каталог) і ім’я запитуваного файлу. Якщо в адресі нічого не вказано місце розташування, це вказує на першу сторінку хоста. В іншому випадку він вказує шлях до сторінки для відображення. ### Порти diff --git a/docs/books/web_services/022-web-servers-nginx.it.md b/docs/books/web_services/022-web-servers-nginx.it.md index 28472885fe..81d489f4d7 100644 --- a/docs/books/web_services/022-web-servers-nginx.it.md +++ b/docs/books/web_services/022-web-servers-nginx.it.md @@ -43,24 +43,24 @@ Nginx ha una quota di mercato significativa del 28% sui siti più trafficati, su Nginx offre le seguenti funzioni di base: - - Hosting per pagine web statiche - - Index page generation automatico - - Reverse proxy accelerato con cache - - Bilanciamento del carico - - Tolleranza agli errori - - Supporto cache per FastCGI, uWSGI, SCGI e server cache Memcached - - Vari filtri per gzip, xslt, ssi, trasformazione delle immagini e altro ancora - - Supporto per SSL/TLS e SNI - - Supporto per HPPT/2 +- Hosting per pagine web statiche +- Index page generation automatico +- Reverse proxy accelerato con cache +- Bilanciamento del carico +- Tolleranza agli errori +- Supporto cache per FastCGI, uWSGI, SCGI e server cache Memcached +- Vari filtri per gzip, xslt, ssi, trasformazione delle immagini e altro ancora +- Supporto per SSL/TLS e SNI +- Supporto per HPPT/2 Altre funzionalità: - - Hosting per nome o indirizzo IP - - Supporto del Keepalive delle connessioni client - - Gestione dei log: syslog, rotazione, buffer - - Riscrittura degli URI - - Controllo di accesso: via IP, password, ed altro - - Streaming FLV e MP4 +- Hosting per nome o indirizzo IP +- Supporto del Keepalive delle connessioni client +- Gestione dei log: syslog, rotazione, buffer +- Riscrittura degli URI +- Controllo di accesso: via IP, password, ed altro +- Streaming FLV e MP4 ### Installazione @@ -277,5 +277,5 @@ Esempio di configurazione di base, che distribuisce il carico per 2/3 al primo s La direttiva server accetta molti argomenti: - - `max_fails=numberofattempts`: imposta il numero di tentativi di connessione che devono fallire durante il periodo di tempo definito dal parametro `fail_timeout` affinché il server sia considerato non disponibile. Il valore predefinito è 1; 0 disattiva la funzionalità. - - `fail_timeout=time`: imposta il tempo durante il quale un numero definito di connessioni causerà l'indisponibilità del server e imposta il periodo di tempo durante il quale il server sarà considerato non disponibile. Il valore predefinito è 10 secondi. +- `max_fails=numberofattempts`: imposta il numero di tentativi di connessione che devono fallire durante il periodo di tempo definito dal parametro `fail_timeout` affinché il server sia considerato non disponibile. Il valore predefinito è 1; 0 disattiva la funzionalità. +- `fail_timeout=time`: imposta il tempo durante il quale un numero definito di connessioni causerà l'indisponibilità del server e imposta il periodo di tempo durante il quale il server sarà considerato non disponibile. Il valore predefinito è 10 secondi. diff --git a/docs/books/web_services/022-web-servers-nginx.uk.md b/docs/books/web_services/022-web-servers-nginx.uk.md index 8dbf966a76..ab3b47c027 100644 --- a/docs/books/web_services/022-web-servers-nginx.uk.md +++ b/docs/books/web_services/022-web-servers-nginx.uk.md @@ -43,24 +43,24 @@ Nginx має значну частку ринку в 28% на найбільш Nginx пропонує такі основні функції: - - Хостинг статичних веб-сторінок - - Автоматичне створення індексної сторінки - - Прискорений зворотний проксі з кешем - - Балансування навантаження - - Відмовостійкість - - Кешована підтримка для кеш-сервера FastCGI, uWSGI, SCGI та Memcached - - Різні фільтри для gzip, xslt, ssi, трансформації зображень тощо - - Підтримка SSL/TLS і SNI - - Підтримка HTTP/2 +- Хостинг статичних веб-сторінок +- Автоматичне створення індексної сторінки +- Прискорений зворотний проксі з кешем +- Балансування навантаження +- Відмовостійкість +- Кешована підтримка для кеш-сервера FastCGI, uWSGI, SCGI та Memcached +- Різні фільтри для gzip, xslt, ssi, трансформації зображень тощо +- Підтримка SSL/TLS і SNI +- Підтримка HTTP/2 Інші особливості: - - Хостинг по імені або IP-адресі - - Keepalive керування підключеннями клієнтів - - Керування журналами: syslog, ротація, буфер - - Перезапис URI - - Контроль доступу: за IP, паролем та ін - - Потокове передавання FLV і MP4 +- Хостинг по імені або IP-адресі +- Keepalive керування підключеннями клієнтів +- Керування журналами: syslog, ротація, буфер +- Перезапис URI +- Контроль доступу: за IP, паролем та ін +- Потокове передавання FLV і MP4 ### Встановлення @@ -277,5 +277,5 @@ access_log syslog:server=192.168.1.100:5514,tag=nginx debug; Директива сервера приймає багато аргументів: - - `max_fails=numberofattempts`: встановлює кількість спроб з’єднання, які мають бути невдалими протягом періоду часу, визначеного параметром `fail_timeout`, щоб сервер вважався недоступним. Значення за замовчуванням 1; 0 вимикає функціональність. - - `fail_timeout=time`: встановлює час, протягом якого певна кількість підключень призведе до того, що сервер буде недоступний, і встановлює період часу, протягом якого сервер вважатиметься недоступним. Значення за замовчуванням становить 10 секунд. +- `max_fails=numberofattempts`: встановлює кількість спроб з’єднання, які мають бути невдалими протягом періоду часу, визначеного параметром `fail_timeout`, щоб сервер вважався недоступним. Значення за замовчуванням 1; 0 вимикає функціональність. +- `fail_timeout=time`: встановлює час, протягом якого певна кількість підключень призведе до того, що сервер буде недоступний, і встановлює період часу, протягом якого сервер вважатиметься недоступним. Значення за замовчуванням становить 10 секунд. diff --git a/docs/desktop/appimage/install_software_with_appimage.de.md b/docs/desktop/appimage/install_software_with_appimage.de.md index 2f19668802..97e8a23397 100644 --- a/docs/desktop/appimage/install_software_with_appimage.de.md +++ b/docs/desktop/appimage/install_software_with_appimage.de.md @@ -20,8 +20,8 @@ Das in diesem Handbuch verwendete Beispielprogramm heißt `Krita`. Sie werden es Für diese Anleitung benötigen Sie Folgendes: - - Eine Rocky Linux-Installation mit einer grafischen Desktopumgebung - - `sudo`-Berechtigungen +- Eine Rocky Linux-Installation mit einer grafischen Desktopumgebung +- `sudo`-Berechtigungen ## Herunterladen des AppImage eines Programms diff --git a/docs/desktop/appimage/install_software_with_appimage.fr.md b/docs/desktop/appimage/install_software_with_appimage.fr.md index d9bd93eb10..9ec55cec61 100644 --- a/docs/desktop/appimage/install_software_with_appimage.fr.md +++ b/docs/desktop/appimage/install_software_with_appimage.fr.md @@ -20,8 +20,8 @@ L'exemple d'application utilisé dans ce didacticiel est Krita. Vous le téléch Pour ce guide, vous aurez besoin des conditions suivantes : - - Une installation Rocky Linux avec un environnement de bureau - - Droits d'accès `sudo` +- Une installation Rocky Linux avec un environnement de bureau +- Droits d'accès `sudo` ## Téléchargement de l'AppImage d'une application diff --git a/docs/desktop/appimage/install_software_with_appimage.it.md b/docs/desktop/appimage/install_software_with_appimage.it.md index 1990633034..14512d8dee 100644 --- a/docs/desktop/appimage/install_software_with_appimage.it.md +++ b/docs/desktop/appimage/install_software_with_appimage.it.md @@ -20,8 +20,8 @@ Il programma di esempio utilizzato in questa guida è Krita. Lo si scarica e ins Per questa guida sono necessari i seguenti elementi: - - Rocky Linux con un ambiente desktop installato - - Privilegi `sudo` +- Rocky Linux con un ambiente desktop installato +- Privilegi `sudo` ## Scaricare la AppImage di un programma diff --git a/docs/desktop/appimage/install_software_with_appimage.uk.md b/docs/desktop/appimage/install_software_with_appimage.uk.md index b7ea8b0388..6508c3bd78 100644 --- a/docs/desktop/appimage/install_software_with_appimage.uk.md +++ b/docs/desktop/appimage/install_software_with_appimage.uk.md @@ -20,8 +20,8 @@ AppImages — це зручний спосіб інсталювати прогр Для цього посібника вам потрібно: - - Rocky Linux із встановленим робочим середовищем - - привілеї `sudo` +- Rocky Linux із встановленим робочим середовищем +- привілеї `sudo` ## Завантаження AppImage програми diff --git a/docs/desktop/display/installing_nvidia_gpu_drivers.de.md b/docs/desktop/display/installing_nvidia_gpu_drivers.de.md index e495f36334..99f183eef9 100644 --- a/docs/desktop/display/installing_nvidia_gpu_drivers.de.md +++ b/docs/desktop/display/installing_nvidia_gpu_drivers.de.md @@ -16,9 +16,9 @@ Der Link für Vorinstallationsaktionen im offiziellen NVIDIA-Handbuch ist defekt Zu den weiteren Möglichkeiten zum Installieren von NVIDIA-Treibern zählen: - - NVIDIA's `.run` installer - - RPMFusion-Repository eines Drittanbieters - - Third-party ELRepo-Treiber +- NVIDIA's `.run` installer +- RPMFusion-Repository eines Drittanbieters +- Third-party ELRepo-Treiber In den meisten Fällen ist es am besten, NVIDIA-Treiber von der offiziellen Quelle zu installieren. RPMFusion und ELRepo stehen für diejenigen zur Verfügung, die ein Community-basiertes Repository bevorzugen. Für ältere Hardware funktioniert RPMFusion am besten. Es wird empfohlen, die Verwendung des `.run`-Installationsprogramms zu vermeiden. Die Verwendung des „.run“-Installationsprogramms ist zwar praktisch, ist aber dafür berüchtigt, Systemdateien zu überschreiben und Inkompatibilitätsprobleme zu verursachen. @@ -26,8 +26,8 @@ In den meisten Fällen ist es am besten, NVIDIA-Treiber von der offiziellen Quel Für diese Anleitung benötigen Sie Folgendes: - - Rocky Linux Workstation - - `sudo`-Berechtigungen +- Rocky Linux Workstation +- `sudo`-Berechtigungen ## Installieren Sie die erforderlichen Dienstprogramme und Abhängigkeiten diff --git a/docs/desktop/display/installing_nvidia_gpu_drivers.fr.md b/docs/desktop/display/installing_nvidia_gpu_drivers.fr.md index 551c0f1e6d..5353683d55 100644 --- a/docs/desktop/display/installing_nvidia_gpu_drivers.fr.md +++ b/docs/desktop/display/installing_nvidia_gpu_drivers.fr.md @@ -16,9 +16,9 @@ Le lien vers les étapes de pré-installation dans le manuel officiel de NVIDIA Voici d'autres méthodes de substitution pour installer les pilotes NVIDIA : - - NVIDIA's `.run` installer - - Dépôt tiers RPMFusion - - Pilote Third-party ELRepo +- NVIDIA's `.run` installer +- Dépôt tiers RPMFusion +- Pilote Third-party ELRepo Dans la plupart des cas, il est préférable d'installer les pilotes NVIDIA à partir d'une source officielle. RPMFusion et ELRepo sont disponibles pour ceux qui préfèrent un dépôt communautaire. Pour les matériels plus anciens, RPMFusion fonctionne mieux. Il est recommandé d'éviter d'utiliser le programme d'installation `.run`. Bien que pratique, l'utilisation du programme d'installation `.run` est connue pour écraser les fichiers système et présente des problèmes d'incompatibilité. @@ -26,8 +26,8 @@ Dans la plupart des cas, il est préférable d'installer les pilotes NVIDIA à p Pour ce guide, vous aurez besoin des conditions suivantes : - - Poste de travail Rocky Linux - - Droits d'accès `sudo` +- Poste de travail Rocky Linux +- Droits d'accès `sudo` ## Installer les utilitaires et dépendances nécessaires diff --git a/docs/desktop/display/installing_nvidia_gpu_drivers.it.md b/docs/desktop/display/installing_nvidia_gpu_drivers.it.md index 024c08d4dc..e99e0d4f47 100644 --- a/docs/desktop/display/installing_nvidia_gpu_drivers.it.md +++ b/docs/desktop/display/installing_nvidia_gpu_drivers.it.md @@ -16,9 +16,9 @@ Il link per le attività di pre-installazione nella guida ufficiale di NVIDIA è Alcuni altri modi alternativi per installare i driver NVIDIA includono: - - L'installer `.run` di NVIDIA - - Repo RPMFusion di terze parti - - Driver ELRepo di terze parti +- L'installer `.run` di NVIDIA +- Repo RPMFusion di terze parti +- Driver ELRepo di terze parti Nella maggior parte dei casi, è meglio installare i driver NVIDIA dalla fonte ufficiale. RPMFusion e ELRepo sono disponibili per chi preferisce un repository più comunity-based. Per l'hardware più vecchio, la soluzione migliore è RPMFusion. È consigliabile evitare di usare il programma di installazione `.run`. Sebbene sia comodo, l'uso del programma di installazione `.run` è noto per la sovrascrittura dei file di sistema e per i problemi di incompatibilità. @@ -26,8 +26,8 @@ Nella maggior parte dei casi, è meglio installare i driver NVIDIA dalla fonte u Per questa guida sono necessari i seguenti elementi: - - Rocky Linux Workstation - - Privilegi `sudo` +- Rocky Linux Workstation +- Privilegi `sudo` ## Installare le utility e le dependencies necessarie diff --git a/docs/desktop/display/installing_nvidia_gpu_drivers.uk.md b/docs/desktop/display/installing_nvidia_gpu_drivers.uk.md index cf141a8779..7d3e556825 100644 --- a/docs/desktop/display/installing_nvidia_gpu_drivers.uk.md +++ b/docs/desktop/display/installing_nvidia_gpu_drivers.uk.md @@ -16,9 +16,9 @@ Nvidia є одним з найпопулярніших виробників GPU. Деякі інші альтернативні способи встановлення драйверів Nvidia включають: - - Nvidia's `.run` installer - - Сторонній репозиторій RPMFusion - - Сторонній драйвер ELRepo +- Nvidia's `.run` installer +- Сторонній репозиторій RPMFusion +- Сторонній драйвер ELRepo У більшості випадків найкраще встановити драйвери Nvidia з офіційного джерела. RPMFusion і ELRepo доступні для тих, хто віддає перевагу репозиторію на основі спільноти. Для старішого обладнання найкраще працює RPMFusion. Бажано уникати використання інсталятора `.run`. Хоча це зручно, використання інсталятора `.run` відоме тим, що він перезаписує системні файли та має проблеми з несумісністю. @@ -26,8 +26,8 @@ Nvidia є одним з найпопулярніших виробників GPU. Для цього посібника вам потрібно: - - Робоча станція Rocky Linux - - привілеї `sudo` +- Робоча станція Rocky Linux +- привілеї `sudo` ## Встановіть необхідні утиліти та залежності diff --git a/docs/desktop/gaming/proton.de.md b/docs/desktop/gaming/proton.de.md index 02128043f1..5283ef4228 100644 --- a/docs/desktop/gaming/proton.de.md +++ b/docs/desktop/gaming/proton.de.md @@ -14,9 +14,9 @@ Im Gegensatz zu `Wine` erfordert `Proton` normalerweise keine Konfiguration und ## Voraussetzungen - - Eine Rocky Linux-Installation mit einer grafischen Desktopumgebung - - Flatpak - - Steam-Konto +- Eine Rocky Linux-Installation mit einer grafischen Desktopumgebung +- Flatpak +- Steam-Konto ## `Steam`-Installaton diff --git a/docs/desktop/gaming/proton.fr.md b/docs/desktop/gaming/proton.fr.md index b31ba35c12..3ae9433501 100644 --- a/docs/desktop/gaming/proton.fr.md +++ b/docs/desktop/gaming/proton.fr.md @@ -14,9 +14,9 @@ Contrairement à Wine, Proton ne nécessite généralement aucune configuration ## Prérequis - - Une station de travail Rocky Linux avec un environnement de bureau - - Flatpak - - Un compte Steam +- Une station de travail Rocky Linux avec un environnement de bureau +- Flatpak +- Un compte Steam ## Installation de Steam diff --git a/docs/desktop/gaming/proton.it.md b/docs/desktop/gaming/proton.it.md index 92e6ef254b..b71192c9ba 100644 --- a/docs/desktop/gaming/proton.it.md +++ b/docs/desktop/gaming/proton.it.md @@ -14,9 +14,9 @@ A differenza di Wine, Proton non richiede alcuna configurazione ed è rivolto ai ## Presupposti - - Una workstation con ambiente desktop Rocky Linux - - Flatpak - - Account Steam +- Una workstation con ambiente desktop Rocky Linux +- Flatpak +- Account Steam ## Installazione di `Steam` diff --git a/docs/desktop/gaming/proton.uk.md b/docs/desktop/gaming/proton.uk.md index 44ef1b245c..c4c16febe5 100644 --- a/docs/desktop/gaming/proton.uk.md +++ b/docs/desktop/gaming/proton.uk.md @@ -14,9 +14,9 @@ Proton — це проект Valve, спрямований на перенесе ## Припущення - - Робоча станція Rocky Linux із робочим середовищем - - Flatpak - - Акаунт Steam +- Робоча станція Rocky Linux із робочим середовищем +- Flatpak +- Акаунт Steam ## Встановлення Steam diff --git a/docs/desktop/gnome/dconf.de.md b/docs/desktop/gnome/dconf.de.md index 5fbdc36e00..830a1b89ca 100644 --- a/docs/desktop/gnome/dconf.de.md +++ b/docs/desktop/gnome/dconf.de.md @@ -28,8 +28,8 @@ Wenn Sie nicht sicher sind, was eine bestimmte Einstellung bewirkt, recherchiere Für diese Anleitung benötigen Sie Folgendes: - - Rocky Linux inklusiv GNOME. - - Berechtigung, Software auf Ihrem System zu installieren (`sudo`-Rechte). +- Rocky Linux inklusiv GNOME. +- Berechtigung, Software auf Ihrem System zu installieren (`sudo`-Rechte). ## `dconf Editor` — Installation diff --git a/docs/desktop/gnome/dconf.fr.md b/docs/desktop/gnome/dconf.fr.md index 168fffa670..b6b97f102b 100644 --- a/docs/desktop/gnome/dconf.fr.md +++ b/docs/desktop/gnome/dconf.fr.md @@ -28,8 +28,8 @@ Si vous n'êtes pas sûr de la fonction d'un paramètre particulier, faites d'ab Pour ce guide, vous aurez besoin des conditions suivantes : - - Installation de Rocky Linux, GNOME inclus. - - Les droits nécessaires pour l'installation de logiciels sur votre système (privilèges `sudo`). +- Installation de Rocky Linux, GNOME inclus. +- Les droits nécessaires pour l'installation de logiciels sur votre système (privilèges `sudo`). ## `dconf Editor` — Installation diff --git a/docs/desktop/gnome/dconf.it.md b/docs/desktop/gnome/dconf.it.md index 184f6eb76a..37179e12c1 100644 --- a/docs/desktop/gnome/dconf.it.md +++ b/docs/desktop/gnome/dconf.it.md @@ -28,8 +28,8 @@ Se non si è sicuri di cosa faccia una particolare impostazione, è bene fare pr Per questa guida sono necessari i seguenti elementi: - - Rocky Linux con GNOME installato. - - L'autorità di installare il software sul sistema (privilegi `sudo`). +- Rocky Linux con GNOME installato. +- L'autorità di installare il software sul sistema (privilegi `sudo`). ## Installazione di `dconf Editor` diff --git a/docs/desktop/gnome/dconf.uk.md b/docs/desktop/gnome/dconf.uk.md index e5231ffb00..c9e94385f2 100644 --- a/docs/desktop/gnome/dconf.uk.md +++ b/docs/desktop/gnome/dconf.uk.md @@ -28,8 +28,8 @@ GNOME використовує дуже спрощений підхід до с Для цього посібника вам потрібно: - - Rocky Linux із встановленим GNOME. - - Повноваження на встановлення програмного забезпечення у вашій системі (права sudo). +- Rocky Linux із встановленим GNOME. +- Повноваження на встановлення програмного забезпечення у вашій системі (права sudo). ## Встановлення `dconf Editor` diff --git a/docs/desktop/gnome/decibels.de.md b/docs/desktop/gnome/decibels.de.md index 622471c337..ed5cfe6bcd 100644 --- a/docs/desktop/gnome/decibels.de.md +++ b/docs/desktop/gnome/decibels.de.md @@ -12,9 +12,9 @@ contributors: Steven Spencer, Ganna Zhyrnova Für diese Anleitung benötigen Sie Folgendes: - - Rocky Linux - - Flatpak - - FlatHub +- Rocky Linux +- Flatpak +- FlatHub ## Installations-Ablauf diff --git a/docs/desktop/gnome/decibels.fr.md b/docs/desktop/gnome/decibels.fr.md index f74fe086f8..5f8fd393cd 100644 --- a/docs/desktop/gnome/decibels.fr.md +++ b/docs/desktop/gnome/decibels.fr.md @@ -12,9 +12,9 @@ contributors: Steven Spencer, Ganna Zhyrnova Ce guide suppose que vous disposez de la configuration suivante : - - Rocky Linux - - Flatpak - - FlatHub +- Rocky Linux +- Flatpak +- FlatHub ## Processus d'Installation diff --git a/docs/desktop/gnome/decibels.it.md b/docs/desktop/gnome/decibels.it.md index eb208757ed..4090a415c8 100644 --- a/docs/desktop/gnome/decibels.it.md +++ b/docs/desktop/gnome/decibels.it.md @@ -12,9 +12,9 @@ Decibel è un'applicazione che riproduce file audio. L'interfaccia intuitiva con Questa guida presuppone che si disponga di quanto segue: - - Rocky Linux - - Flatpak - - FlatHub +- Rocky Linux +- Flatpak +- FlatHub ## Processo di installazione diff --git a/docs/desktop/gnome/decibels.uk.md b/docs/desktop/gnome/decibels.uk.md index 853f250240..a5d680de37 100644 --- a/docs/desktop/gnome/decibels.uk.md +++ b/docs/desktop/gnome/decibels.uk.md @@ -12,9 +12,9 @@ Decibels — програма, яка відтворює аудіофайли. У цьому посібнику передбачається, що ви маєте наступне: - - Rocky Linux - - Flatpak - - FlatHub +- Rocky Linux +- Flatpak +- FlatHub ## Процес встановлення diff --git a/docs/desktop/gnome/decoder.de.md b/docs/desktop/gnome/decoder.de.md index 6287d79ce1..0f462fea71 100644 --- a/docs/desktop/gnome/decoder.de.md +++ b/docs/desktop/gnome/decoder.de.md @@ -12,9 +12,9 @@ Benötigen Sie einen QR-Code für Ihre Website, Anwendung oder Social-Media-Prof Für diese Anleitung benötigen Sie Folgendes: - - Rocky Linux - - Flatpak - - FlatHub +- Rocky Linux +- Flatpak +- FlatHub ## Installations-Ablauf @@ -38,8 +38,8 @@ Für diese Anleitung benötigen Sie Folgendes: Es stehen zwei Arten von QR-Codes zur Verfügung. Wählen Sie die Option, die Ihren Anforderungen am besten entspricht: - - [Text](#text) - - [Wifi](#wifi) +- [Text](#text) +- [Wifi](#wifi) ### Text diff --git a/docs/desktop/gnome/decoder.fr.md b/docs/desktop/gnome/decoder.fr.md index 6dd0ce6acd..12c01214c0 100644 --- a/docs/desktop/gnome/decoder.fr.md +++ b/docs/desktop/gnome/decoder.fr.md @@ -12,9 +12,9 @@ Besoin d'un code QR pour votre site Web, votre application ou vos profils de ré Ce guide suppose que vous disposez de la configuration suivante : - - Rocky Linux - - Flatpak - - FlatHub +- Rocky Linux +- Flatpak +- FlatHub ## Processus d'Installation @@ -38,8 +38,8 @@ Ce guide suppose que vous disposez de la configuration suivante : Deux types de codes QR sont disponibles. Choisissez l'option qui correspond le mieux à vos besoins : - - [Text](#text) - - [Wifi](#wifi) +- [Text](#text) +- [Wifi](#wifi) ### Text diff --git a/docs/desktop/gnome/decoder.it.md b/docs/desktop/gnome/decoder.it.md index a4fee7b8bd..c0b793f7cb 100644 --- a/docs/desktop/gnome/decoder.it.md +++ b/docs/desktop/gnome/decoder.it.md @@ -12,9 +12,9 @@ Avete bisogno di un codice QR per il vostro sito web, la vostra applicazione o i Questa guida presuppone che si disponga di quanto segue: - - Rocky Linux - - Flatpak - - FlatHub +- Rocky Linux +- Flatpak +- FlatHub ## Processo dell'installazione @@ -38,8 +38,8 @@ Questa guida presuppone che si disponga di quanto segue: Sono disponibili due tipi di codici QR. Scegliete l'opzione più adatta alle vostre esigenze: - - [Text](#text) - - [Wifi](#wifi) +- [Text](#text) +- [Wifi](#wifi) ### Text diff --git a/docs/desktop/gnome/decoder.uk.md b/docs/desktop/gnome/decoder.uk.md index fd0f668e40..e58c5f1349 100644 --- a/docs/desktop/gnome/decoder.uk.md +++ b/docs/desktop/gnome/decoder.uk.md @@ -12,9 +12,9 @@ contributors: Steven Spencer, Ganna Zhyrnova У цьому посібнику передбачається, що ви маєте наступне: - - Rocky Linux - - Flatpak - - FlatHub +- Rocky Linux +- Flatpak +- FlatHub ## Процес встановлення @@ -38,8 +38,8 @@ contributors: Steven Spencer, Ganna Zhyrnova Доступні два типи QR-кодів. Виберіть варіант, який найкраще відповідає вашим потребам: - - [Text](#text) - - [Wifi](#wifi) +- [Text](#text) +- [Wifi](#wifi) ### Text diff --git a/docs/desktop/gnome/file-shredder.de.md b/docs/desktop/gnome/file-shredder.de.md index 7d9f9b0d1c..275a3baa6c 100644 --- a/docs/desktop/gnome/file-shredder.de.md +++ b/docs/desktop/gnome/file-shredder.de.md @@ -12,9 +12,9 @@ Möchten Sie eine Postkarte oder eine PDF-Datei mit Informationen wie Ihrem Gebu Für diese Anleitung benötigen Sie Folgendes: - - Rocky Linux - - Flatpak - - FlatHub +- Rocky Linux +- Flatpak +- FlatHub ## Installations-Ablauf diff --git a/docs/desktop/gnome/file-shredder.fr.md b/docs/desktop/gnome/file-shredder.fr.md index f5fc9ddc70..cdb18c8473 100644 --- a/docs/desktop/gnome/file-shredder.fr.md +++ b/docs/desktop/gnome/file-shredder.fr.md @@ -12,9 +12,9 @@ Besoin de supprimer une carte postale ou un fichier PDF contenant des informatio Ce guide suppose que vous disposez de la configuration suivante : - - Rocky Linux - - Flatpak - - FlatHub +- Rocky Linux +- Flatpak +- FlatHub ## Processus d'Installation diff --git a/docs/desktop/gnome/file-shredder.it.md b/docs/desktop/gnome/file-shredder.it.md index 2932dbc300..ad99ae2a61 100644 --- a/docs/desktop/gnome/file-shredder.it.md +++ b/docs/desktop/gnome/file-shredder.it.md @@ -12,9 +12,9 @@ Dovete rimuovere una cartolina o un file PDF contenente informazioni come il vos Questa guida presuppone che si disponga di quanto segue: - - Rocky Linux - - Flatpak - - FlatHub +- Rocky Linux +- Flatpak +- FlatHub ## Processo di installazione diff --git a/docs/desktop/gnome/file-shredder.uk.md b/docs/desktop/gnome/file-shredder.uk.md index fb9688f1ab..af428bf672 100644 --- a/docs/desktop/gnome/file-shredder.uk.md +++ b/docs/desktop/gnome/file-shredder.uk.md @@ -12,9 +12,9 @@ contributors: Steven Spencer, Ganna Zhyrnova У цьому посібнику передбачається, що ви маєте наступне: - - Rocky Linux - - Flatpak - - FlatHub +- Rocky Linux +- Flatpak +- FlatHub ## Процес встановлення diff --git a/docs/desktop/gnome/gnome-tweaks.de.md b/docs/desktop/gnome/gnome-tweaks.de.md index 710dcbc26d..97a1d583a1 100644 --- a/docs/desktop/gnome/gnome-tweaks.de.md +++ b/docs/desktop/gnome/gnome-tweaks.de.md @@ -10,7 +10,7 @@ GNOME Tweaks ist ein Tool zum Anpassen von Desktop-Eigenschaften, einschließlic ## Voraussetzungen - - Eine Rocky Linux-Workstation oder ein Server mit GUI-Installation, die GNOME verwendet. +- Eine Rocky Linux-Workstation oder ein Server mit GUI-Installation, die GNOME verwendet. ## GNOME tweaks Installation diff --git a/docs/desktop/gnome/gnome-tweaks.fr.md b/docs/desktop/gnome/gnome-tweaks.fr.md index adb3fbb660..b60a474023 100644 --- a/docs/desktop/gnome/gnome-tweaks.fr.md +++ b/docs/desktop/gnome/gnome-tweaks.fr.md @@ -10,7 +10,7 @@ GNOME Tweaks est un outil permettant de personnaliser l'environnement de bureau, ## Prérequis - - Un poste de travail ou un serveur Rocky Linux avec une interface graphique qui utilise GNOME. +- Un poste de travail ou un serveur Rocky Linux avec une interface graphique qui utilise GNOME. ## Installation de GNOME tweaks diff --git a/docs/desktop/gnome/gnome-tweaks.it.md b/docs/desktop/gnome/gnome-tweaks.it.md index 03799d4002..10a6d73126 100644 --- a/docs/desktop/gnome/gnome-tweaks.it.md +++ b/docs/desktop/gnome/gnome-tweaks.it.md @@ -10,7 +10,7 @@ GNOME Tweaks è uno strumento per personalizzare l'esperienza del desktop, compr ## Presupposti - - Una workstation o un server Rocky Linux con installazione dell'interfaccia grafica che utilizza GNOME. +- Una workstation o un server Rocky Linux con installazione dell'interfaccia grafica che utilizza GNOME. ## Installare GNOME tweaks diff --git a/docs/desktop/gnome/gnome-tweaks.uk.md b/docs/desktop/gnome/gnome-tweaks.uk.md index ca468b32e4..1d775fe0f2 100644 --- a/docs/desktop/gnome/gnome-tweaks.uk.md +++ b/docs/desktop/gnome/gnome-tweaks.uk.md @@ -10,7 +10,7 @@ GNOME Tweaks — це інструмент для налаштування ро ## Припущення - - Робоча станція або сервер Rocky Linux із інсталяцією GNOME. +- Робоча станція або сервер Rocky Linux із інсталяцією GNOME. ## Встановлення GNOME Tweaks diff --git a/docs/desktop/gnome/onlineaccounts.de.md b/docs/desktop/gnome/onlineaccounts.de.md index fd0bd017f2..337c58ec78 100644 --- a/docs/desktop/gnome/onlineaccounts.de.md +++ b/docs/desktop/gnome/onlineaccounts.de.md @@ -14,7 +14,7 @@ In dieser Kurzanleitung erfahren Sie, wie Sie loslegen können. Für diese Anleitung benötigen Sie Folgendes: - - Eine Rocky Linux-Installation mit der grafischen Desktopumgebung GNOME. +- Eine Rocky Linux-Installation mit der grafischen Desktopumgebung GNOME. ## So fügen Sie Ihre Online-Konten hinzu diff --git a/docs/desktop/gnome/onlineaccounts.fr.md b/docs/desktop/gnome/onlineaccounts.fr.md index 117aab3451..3e18ce9461 100644 --- a/docs/desktop/gnome/onlineaccounts.fr.md +++ b/docs/desktop/gnome/onlineaccounts.fr.md @@ -14,7 +14,7 @@ Ce guide rapide vous montrera par où commencer. Ce guide suppose que vous disposez de la configuration suivante : - - Une installation Rocky Linux avec un environnement de bureau GNOME. +- Une installation Rocky Linux avec un environnement de bureau GNOME. ## Comment ajouter vos comptes en ligne diff --git a/docs/desktop/gnome/onlineaccounts.it.md b/docs/desktop/gnome/onlineaccounts.it.md index ff9f420377..2af1e1625f 100644 --- a/docs/desktop/gnome/onlineaccounts.it.md +++ b/docs/desktop/gnome/onlineaccounts.it.md @@ -14,7 +14,7 @@ In questa breve guida vedremo come iniziare. Questa guida presuppone che si disponga di quanto segue: - - Rocky Linux con l'ambiente desktop GNOME installato. +- Rocky Linux con l'ambiente desktop GNOME installato. ## Come aggiungere i vostri account online diff --git a/docs/desktop/gnome/onlineaccounts.uk.md b/docs/desktop/gnome/onlineaccounts.uk.md index 4d4165796c..8ce56f06ef 100644 --- a/docs/desktop/gnome/onlineaccounts.uk.md +++ b/docs/desktop/gnome/onlineaccounts.uk.md @@ -14,7 +14,7 @@ contributors: Steven Spencer У цьому посібнику передбачається, що ви маєте наступне: - - Rocky Linux із встановленим робочим середовищем GNOME. +- Rocky Linux із встановленим робочим середовищем GNOME. ## Як додати облікові записи онлайн diff --git a/docs/desktop/gnome/rdp-server.de.md b/docs/desktop/gnome/rdp-server.de.md index 4863a73d6a..8704e0ec8b 100644 --- a/docs/desktop/gnome/rdp-server.de.md +++ b/docs/desktop/gnome/rdp-server.de.md @@ -20,11 +20,11 @@ Standardmäßig ermöglicht Rocky Linux Ihnen, Ihren Desktop über ein anderes V Für diese Anleitung wird davon ausgegangen, dass Sie Folgendes bereits eingerichtet haben: - - Rocky Linux inklusiv GNOME - - `Flatpak` und `Flathub` sind betriebsbereit - - Ein User-Account ohne root-Rechte - - Administrator- oder `sudo`-Rechte und die Möglichkeit, Befehle in das Terminal einzufügen - - Der X-Server (zum Teilen Ihres Desktops) +- Rocky Linux inklusiv GNOME +- `Flatpak` und `Flathub` sind betriebsbereit +- Ein User-Account ohne root-Rechte +- Administrator- oder `sudo`-Rechte und die Möglichkeit, Befehle in das Terminal einzufügen +- Der X-Server (zum Teilen Ihres Desktops) !!! info "Info" diff --git a/docs/desktop/gnome/rdp-server.fr.md b/docs/desktop/gnome/rdp-server.fr.md index c6853c4bf6..a810f44487 100644 --- a/docs/desktop/gnome/rdp-server.fr.md +++ b/docs/desktop/gnome/rdp-server.fr.md @@ -20,11 +20,11 @@ Par défaut, Rocky Linux vous permet de partager votre bureau via un autre proto Pour ce guide, nous partons du principe que vous disposez déjà de la configuration suivante : - - Rocky Linux et GNOME - - Flatpak et Flathub installés et opérationnels - - Un compte utilisateur non root - - Accès administrateur ou sudo et pouvoir coller des commandes dans le terminal - - Le serveur X (pour partager votre bureau) +- Rocky Linux et GNOME +- Flatpak et Flathub installés et opérationnels +- Un compte utilisateur non root +- Accès administrateur ou sudo et pouvoir coller des commandes dans le terminal +- Le serveur X (pour partager votre bureau) !!! info "Info" diff --git a/docs/desktop/gnome/rdp-server.it.md b/docs/desktop/gnome/rdp-server.it.md index 4e53d228e2..2d16ef14a1 100644 --- a/docs/desktop/gnome/rdp-server.it.md +++ b/docs/desktop/gnome/rdp-server.it.md @@ -20,11 +20,11 @@ Per impostazione predefinita, Rocky Linux consente di condividere il desktop tra In questa guida si presuppone che siano già state configurate le seguenti operazioni: - - Rocky Linux con Gnome - - Flatpak e Flathub installati e funzionanti - - Un account utente non root - - Accesso come amministratore o sudo e disponibilità a incollare comandi nel terminale - - Il server X (per condividere il desktop) +- Rocky Linux con Gnome +- Flatpak e Flathub installati e funzionanti +- Un account utente non root +- Accesso come amministratore o sudo e disponibilità a incollare comandi nel terminale +- Il server X (per condividere il desktop) !!! info "Informazione" diff --git a/docs/desktop/gnome/rdp-server.uk.md b/docs/desktop/gnome/rdp-server.uk.md index 54904c9ea5..0b7bb8c207 100644 --- a/docs/desktop/gnome/rdp-server.uk.md +++ b/docs/desktop/gnome/rdp-server.uk.md @@ -20,11 +20,11 @@ contributors: Steven Spencer, Ganna Zhyrnova, Zhang Zhuyue Для цього посібника припускається, що ви вже налаштували наступне: - - Rocky Linux з Gnome - - Flatpak і Flathub встановлені та працюють - - Обліковий запис некореневого користувача - - Доступ адміністратора або sudo та готовність вставляти команди в термінал - - Сервер X (для спільного використання робочого столу) +- Rocky Linux з Gnome +- Flatpak і Flathub встановлені та працюють +- Обліковий запис некореневого користувача +- Доступ адміністратора або sudo та готовність вставляти команди в термінал +- Сервер X (для спільного використання робочого столу) !!! info "примітка" diff --git a/docs/desktop/gnome/screenshot.de.md b/docs/desktop/gnome/screenshot.de.md index cf872a316b..35b943e079 100644 --- a/docs/desktop/gnome/screenshot.de.md +++ b/docs/desktop/gnome/screenshot.de.md @@ -12,7 +12,7 @@ Sind Sie es leid, mit der Tastatur Bilder auf Ihrem Computerbildschirm aufzunehm Für diese Anleitung benötigen Sie Folgendes: - - Rocky Linux +- Rocky Linux !!! note "Anmerkung" diff --git a/docs/desktop/gnome/screenshot.fr.md b/docs/desktop/gnome/screenshot.fr.md index 1d1731a54d..33b74c0560 100644 --- a/docs/desktop/gnome/screenshot.fr.md +++ b/docs/desktop/gnome/screenshot.fr.md @@ -12,7 +12,7 @@ Fatigué d'utiliser votre clavier pour prendre des images sur l'écran de votre Ce guide suppose que vous disposez de la configuration suivante : - - Rocky Linux +- Rocky Linux !!! note "Remarque" diff --git a/docs/desktop/gnome/screenshot.it.md b/docs/desktop/gnome/screenshot.it.md index a7bacfb8bf..a775d69aa1 100644 --- a/docs/desktop/gnome/screenshot.it.md +++ b/docs/desktop/gnome/screenshot.it.md @@ -12,7 +12,7 @@ Siete stanchi di usare la tastiera per scattare immagini dello schermo del compu Questa guida presuppone che si disponga di quanto segue: - - Rocky Linux +- Rocky Linux !!! note "Nota" diff --git a/docs/desktop/gnome/screenshot.uk.md b/docs/desktop/gnome/screenshot.uk.md index 34fce275cf..06260bf8e8 100644 --- a/docs/desktop/gnome/screenshot.uk.md +++ b/docs/desktop/gnome/screenshot.uk.md @@ -12,7 +12,7 @@ contributors: Steven Spencer, Ganna Zhyrnova У цьому посібнику передбачається, що ви маєте наступне: - - Rocky Linux +- Rocky Linux !!! note "Примітка" diff --git a/docs/desktop/gnome/valuta.de.md b/docs/desktop/gnome/valuta.de.md index cb9ce53918..4e14bf67b4 100644 --- a/docs/desktop/gnome/valuta.de.md +++ b/docs/desktop/gnome/valuta.de.md @@ -12,9 +12,9 @@ Wenn Sie häufig reisen oder ins Ausland ziehen, vereinfachen Sie Ihre Finanzpla Für diese Anleitung benötigen Sie Folgendes: - - Rocky Linux - - Flatpak - - FlatHub +- Rocky Linux +- Flatpak +- FlatHub ## Installationsanweisungen diff --git a/docs/desktop/gnome/valuta.fr.md b/docs/desktop/gnome/valuta.fr.md index 4a543f56f2..f6d14719f5 100644 --- a/docs/desktop/gnome/valuta.fr.md +++ b/docs/desktop/gnome/valuta.fr.md @@ -12,9 +12,9 @@ Si vous voyagez souvent ou déménagez à l’étranger, facilitez votre planifi Ce guide suppose que vous disposez de la configuration suivante : - - Rocky Linux - - Flatpak - - FlatHub +- Rocky Linux +- Flatpak +- FlatHub ## Processus d'Installation diff --git a/docs/desktop/gnome/valuta.it.md b/docs/desktop/gnome/valuta.it.md index ccd8120947..c1e0427cc3 100644 --- a/docs/desktop/gnome/valuta.it.md +++ b/docs/desktop/gnome/valuta.it.md @@ -12,9 +12,9 @@ Se viaggiate o vi trasferite spesso all'estero, semplificate la vostra pianifica Questa guida presuppone che si disponga di quanto segue: - - Rocky Linux - - Flatpak - - FlatHub +- Rocky Linux +- Flatpak +- FlatHub ## Processo di installazione diff --git a/docs/desktop/gnome/valuta.uk.md b/docs/desktop/gnome/valuta.uk.md index 42ba20a3f6..44abadab31 100644 --- a/docs/desktop/gnome/valuta.uk.md +++ b/docs/desktop/gnome/valuta.uk.md @@ -12,9 +12,9 @@ contributors: Steven Spencer, Ganna Zhyrnova У цьому посібнику передбачається, що ви маєте наступне: - - Rocky Linux - - Flatpak - - FlatHub +- Rocky Linux +- Flatpak +- FlatHub ## Процес встановлення diff --git a/docs/desktop/gnome/x11vnc_plus_ssh_lan.de.md b/docs/desktop/gnome/x11vnc_plus_ssh_lan.de.md index f16d599180..ca7aea8ce7 100644 --- a/docs/desktop/gnome/x11vnc_plus_ssh_lan.de.md +++ b/docs/desktop/gnome/x11vnc_plus_ssh_lan.de.md @@ -20,8 +20,8 @@ Einer der Hauptvorteile der Verwendung von x11vnc gegenüber SSH besteht darin, Für diese Anleitung wird davon ausgegangen, dass Sie Folgendes bereits eingerichtet haben: - - Rocky Linux Workstation - - `sudo`-Berechtigungen +- Rocky Linux Workstation +- `sudo`-Berechtigungen ## VNC-Server einrichten @@ -161,8 +161,8 @@ Herzlichen Glückwunsch! Jetzt können Sie Ihren Desktop aus der Ferne kontrolli Bisher hat Ihnen dieser Artikel gezeigt, wie Sie einen x11vnc-Server einrichten und mithilfe von VNC, das über einen SSH-Tunnel weitergeleitet wird, eine Verbindung zu ihm herstellen. Bitte beachten Sie, dass diese Methode nur für Computer funktioniert, die sich im gleichen lokalen Netzwerk (LAN) befinden. Angenommen, Sie möchten eine Verbindung zu einem Computer herstellen, der sich in einem anderen LAN befindet. Eine Möglichkeit, dies zu erreichen, besteht darin, ein VPN einzurichten. Nachfolgend finden Sie einige Anleitungen zum Einrichten eines VPN: - - [OpenVPN](https://docs.rockylinux.org/guides/security/openvpn/) - - [Wireguard VPN](https://docs.rockylinux.org/guides/security/wireguard_vpn/) +- [OpenVPN](https://docs.rockylinux.org/guides/security/openvpn/) +- [Wireguard VPN](https://docs.rockylinux.org/guides/security/wireguard_vpn/) ## Zusammenfassung diff --git a/docs/desktop/gnome/x11vnc_plus_ssh_lan.fr.md b/docs/desktop/gnome/x11vnc_plus_ssh_lan.fr.md index f30bd0ef04..93f24aee30 100644 --- a/docs/desktop/gnome/x11vnc_plus_ssh_lan.fr.md +++ b/docs/desktop/gnome/x11vnc_plus_ssh_lan.fr.md @@ -20,8 +20,8 @@ L’un des principaux avantages de l’utilisation de x11vnc basée sur SSH est Pour ce guide, nous partons du principe que vous disposez déjà de la configuration suivante : - - Poste de travail Rocky Linux - - Droits d'accès `sudo` +- Poste de travail Rocky Linux +- Droits d'accès `sudo` ## Mise en place du serveur VNC @@ -161,8 +161,8 @@ Félicitations ! Vous pouvez désormais contrôler votre ordinateur à distance Jusqu'à présent, cet article vous a montré comment configurer un serveur x11vnc et vous y connecter à l'aide de VNC communiquant via un tunnel SSH. Il est important de noter que cette méthode ne fonctionnera que pour les ordinateurs sur le même réseau local (LAN). En supposant que vous souhaitiez vous connecter à un ordinateur qui se trouve sur un autre réseau local. Un moyen d’y parvenir est de mettre en place un VPN. Vous trouverez ci-dessous quelques guides sur la façon de configurer un VPN : - - [OpenVPN](https://docs.rockylinux.org/guides/security/openvpn/) - - [Wireguard VPN](https://docs.rockylinux.org/guides/security/wireguard_vpn/) +- [OpenVPN](https://docs.rockylinux.org/guides/security/openvpn/) +- [Wireguard VPN](https://docs.rockylinux.org/guides/security/wireguard_vpn/) ## Conclusion diff --git a/docs/desktop/gnome/x11vnc_plus_ssh_lan.it.md b/docs/desktop/gnome/x11vnc_plus_ssh_lan.it.md index 6109afc959..4adc09f1a5 100644 --- a/docs/desktop/gnome/x11vnc_plus_ssh_lan.it.md +++ b/docs/desktop/gnome/x11vnc_plus_ssh_lan.it.md @@ -20,8 +20,8 @@ Uno dei principali vantaggi dell'utilizzo di x11vnc rispetto a SSH è che elimin Per questa guida, si presuppone che si disponga di quanto segue: - - Rocky Linux Workstation - - Privilegi `sudo` +- Rocky Linux Workstation +- Privilegi `sudo` ## Impostazione del server VNC @@ -161,8 +161,8 @@ Congratulazioni! Ora è possibile controllare il desktop da remoto! Finora questo articolo ha mostrato come impostare un server x11vnc e come connettersi ad esso utilizzando VNC inoltrato attraverso un tunnel SSH. È importante notare che questo metodo funziona solo per i computer della stessa rete locale (LAN). Supponendo di volersi collegare a un computer su un'altra LAN. Un modo per farlo è impostare una VPN. Di seguito sono riportate alcune guide su come impostare una VPN: - - [OpenVPN](https://docs.rockylinux.org/guides/security/openvpn/) - - [Wireguard VPN](https://docs.rockylinux.org/guides/security/wireguard_vpn/) +- [OpenVPN](https://docs.rockylinux.org/guides/security/openvpn/) +- [Wireguard VPN](https://docs.rockylinux.org/guides/security/wireguard_vpn/) ## Conclusione diff --git a/docs/desktop/gnome/x11vnc_plus_ssh_lan.uk.md b/docs/desktop/gnome/x11vnc_plus_ssh_lan.uk.md index 727963ce2a..637f35c1df 100644 --- a/docs/desktop/gnome/x11vnc_plus_ssh_lan.uk.md +++ b/docs/desktop/gnome/x11vnc_plus_ssh_lan.uk.md @@ -20,8 +20,8 @@ x11vnc — потужна програма VNC. Те, що відрізняє x1 Для цього посібника передбачається, що у вас є: - - Робоча станція Rocky Linux - - привілеї `sudo` +- Робоча станція Rocky Linux +- привілеї `sudo` ## Налаштування сервера VNC @@ -161,8 +161,8 @@ vncviewer Поки що ця стаття показала вам, як налаштувати сервер x11vnc і підключитися до нього за допомогою VNC, що пересилається через тунель SSH. Здавалося б, очевидна, але все ж важлива деталь, про яку слід знати, полягає в тому, що цей метод працюватиме лише для комп’ютерів, підключених до мережі. Припустимо, ви хочете підключитися до комп’ютера в іншій локальній мережі. Спосіб досягти цього — налаштувати VPN. Нижче наведено кілька посібників щодо налаштування VPN: - - [OpenVPN](https://docs.rockylinux.org/guides/security/openvpn/) - - [Wireguard VPN](https://docs.rockylinux.org/guides/security/wireguard_vpn/) +- [OpenVPN](https://docs.rockylinux.org/guides/security/openvpn/) +- [Wireguard VPN](https://docs.rockylinux.org/guides/security/wireguard_vpn/) ## Висновок diff --git a/docs/desktop/tools/businessapps.de.md b/docs/desktop/tools/businessapps.de.md index f6f911aa94..24afc61a54 100644 --- a/docs/desktop/tools/businessapps.de.md +++ b/docs/desktop/tools/businessapps.de.md @@ -14,9 +14,9 @@ Auf Flathub gibt es davon viele. In diesem Leitfaden erfahren Sie, wie Sie die g Für diese Anleitung benötigen Sie Folgendes: - - Eine Rocky Linux-Installation mit einer grafischen Desktopumgebung - - Berechtigung, Software auf Ihrem System zu installieren - - `Flatpak` und `Flathub` sind betriebsbereit +- Eine Rocky Linux-Installation mit einer grafischen Desktopumgebung +- Berechtigung, Software auf Ihrem System zu installieren +- `Flatpak` und `Flathub` sind betriebsbereit ## So installieren Sie gängige Business-Software unter Rocky Linux diff --git a/docs/desktop/tools/businessapps.fr.md b/docs/desktop/tools/businessapps.fr.md index 11bcbc83b1..598b5ce282 100644 --- a/docs/desktop/tools/businessapps.fr.md +++ b/docs/desktop/tools/businessapps.fr.md @@ -14,9 +14,9 @@ La plupart d’entre elles sont sur Flathub. Dans ce guide, vous apprendrez à i Cet article suppose les éléments suivants : - - Une installation Rocky Linux avec un environnement de bureau graphique - - Les droits nécessaires pour l'installation de logiciels sur votre système - - Flatpak et Flathub installés et opérationnels +- Une installation Rocky Linux avec un environnement de bureau graphique +- Les droits nécessaires pour l'installation de logiciels sur votre système +- Flatpak et Flathub installés et opérationnels ## Installation des logiciels professionnels courants sur Rocky Linux diff --git a/docs/desktop/tools/businessapps.it.md b/docs/desktop/tools/businessapps.it.md index 44725f1e6f..b72000713a 100644 --- a/docs/desktop/tools/businessapps.it.md +++ b/docs/desktop/tools/businessapps.it.md @@ -14,9 +14,9 @@ Molte di loro sono su Flathub. Questa guida spiega come installare le applicazio Questa guida presuppone quanto segue: - - Rocky Linux con un ambiente desktop grafico - - I permessi per installare software nel sistema - - Flatpak e Flathub installati e funzionanti +- Rocky Linux con un ambiente desktop grafico +- I permessi per installare software nel sistema +- Flatpak e Flathub installati e funzionanti ## Come installare i più comuni software aziendali su Rocky Linux diff --git a/docs/desktop/tools/businessapps.uk.md b/docs/desktop/tools/businessapps.uk.md index ca3e891321..c4960a3c8d 100644 --- a/docs/desktop/tools/businessapps.uk.md +++ b/docs/desktop/tools/businessapps.uk.md @@ -14,9 +14,9 @@ contributors: Steven Spencer, Ganna Zhyrnova Цей посібник передбачає наступне: - - Rocky Linux із графічним середовищем робочого столу - - Повноваження на встановлення програмного забезпечення у вашій системі - - Flatpak і Flathub встановлені та працюють +- Rocky Linux із графічним середовищем робочого столу +- Повноваження на встановлення програмного забезпечення у вашій системі +- Flatpak і Flathub встановлені та працюють ## Як інсталювати звичайне бізнес-програмне забезпечення на Rocky Linux diff --git a/docs/desktop/tools/firewallgui.de.md b/docs/desktop/tools/firewallgui.de.md index 5b815fd756..0adac4f148 100644 --- a/docs/desktop/tools/firewallgui.de.md +++ b/docs/desktop/tools/firewallgui.de.md @@ -14,9 +14,9 @@ Wir werden nicht alles abdecken, was `firewalld` oder die GUI leisten können, a Für diese Anleitung gehen wir davon aus, dass Sie über Folgendes verfügen: - - Eine Rocky Linux-Installation mit einer beliebigen grafischen Desktopumgebung - - `sudo` oder Administratorzugriff - - Ein grundlegendes Verständnis der Arbeitsweise von `firewalld` +- Eine Rocky Linux-Installation mit einer beliebigen grafischen Desktopumgebung +- `sudo` oder Administratorzugriff +- Ein grundlegendes Verständnis der Arbeitsweise von `firewalld` !!! note "Anmerkung" diff --git a/docs/desktop/tools/firewallgui.fr.md b/docs/desktop/tools/firewallgui.fr.md index bed8b33fb2..4c8dec8327 100644 --- a/docs/desktop/tools/firewallgui.fr.md +++ b/docs/desktop/tools/firewallgui.fr.md @@ -14,9 +14,9 @@ Nous n'aborderons pas tout ce que `firewalld` ou l'interface graphique peuvent a Pour ce guide, nous partons du principe que vous disposez déjà de la configuration suivante : - - Une installation Rocky Linux avec n'importe quel environnement de bureau graphique - - `sudo` ou privilèges administratifs - - Vous possédez aussi une compréhension des bases du fonctionnement de `firewalld` +- Une installation Rocky Linux avec n'importe quel environnement de bureau graphique +- `sudo` ou privilèges administratifs +- Vous possédez aussi une compréhension des bases du fonctionnement de `firewalld` !!! note "Remarque" diff --git a/docs/desktop/tools/firewallgui.it.md b/docs/desktop/tools/firewallgui.it.md index 932ea9fe79..c5629441e8 100644 --- a/docs/desktop/tools/firewallgui.it.md +++ b/docs/desktop/tools/firewallgui.it.md @@ -14,9 +14,9 @@ Non tratteremo tutto ciò che `firewalld` o la GUI possono fare, ma dovrebbe ess Per questa guida, si presume che l'utente disponga di quanto segue: - - Un'installazione di Rocky Linux con ambiente desktop grafico - - `sudo` o accesso come admin - - Una comprensione di base di come funziona `firewalld` +- Un'installazione di Rocky Linux con ambiente desktop grafico +- `sudo` o accesso come admin +- Una comprensione di base di come funziona `firewalld` !!! note "Nota" diff --git a/docs/desktop/tools/firewallgui.uk.md b/docs/desktop/tools/firewallgui.uk.md index 07ee131f39..ee8bf0262a 100644 --- a/docs/desktop/tools/firewallgui.uk.md +++ b/docs/desktop/tools/firewallgui.uk.md @@ -14,9 +14,9 @@ contributors: Steven Spencer, Ganna Zhyrnova Для цього посібника ми припускаємо, що у вас є: - - Інсталяція Rocky Linux з будь-яким графічним середовищем робочого столу - - `sudo` або доступ адміністратора - - Фундаментальне розуміння того, як працює `firewalld` +- Інсталяція Rocky Linux з будь-яким графічним середовищем робочого столу +- `sudo` або доступ адміністратора +- Фундаментальне розуміння того, як працює `firewalld` !!! note "Примітка" diff --git a/docs/gemstones/network/iftop.de.md b/docs/gemstones/network/iftop.de.md index a7dbc38471..c5583bfcc8 100644 --- a/docs/gemstones/network/iftop.de.md +++ b/docs/gemstones/network/iftop.de.md @@ -83,21 +83,21 @@ TOTAL: 60.5MB 242Mb 242Mb 242Mb 242Mb Aufschlüsselung der Zeilen im unteren Bereich: - - TX – Datennutzung beim Senden/Hochladen - - RX - Datennutzung empfangen/herunterladen - - TOTAL – Kombinierte Upload-/Download-Nutzung +- TX – Datennutzung beim Senden/Hochladen +- RX - Datennutzung empfangen/herunterladen +- TOTAL – Kombinierte Upload-/Download-Nutzung ## Tastaturkürzel - - \++s++ - aggregiert den gesamten Datenverkehr für jede Quelle - - \++d++ - aggregiert den gesamten Datenverkehr für jedes Ziel - - \++shift+s++ - schaltet die Anzeige des Quellports um - - \++shift+d++ - schaltet die Anzeige des Zielports um - - \++t++ - schaltet zwischen den Anzeigemodi um: Standardmäßige zweizeilige Anzeige mit Sende- und Empfangsverkehr und dreizeilige Anzeige von Sende-, Empfangs- und Gesamt-Traffic - - \++1++, ++2++, ++3++ – Sortieren nach 1., 2. oder 3. Spalte - - \++l++ - geben Sie einen POSIX-regulären Ausdruck ein, um Hostnamen zu filtern - - \++shift+p++ - Pausiert die aktuelle Anzeige - - \++o++ - friert die Gesamtbandbreiten-Auswertung ein - - \++j++ - nach unten scrollen - - \++k++ - nach oben scrollen - - \++f++ – bearbeitet den Filtercode +- \++s++ - aggregiert den gesamten Datenverkehr für jede Quelle +- \++d++ - aggregiert den gesamten Datenverkehr für jedes Ziel +- \++shift+s++ - schaltet die Anzeige des Quellports um +- \++shift+d++ - schaltet die Anzeige des Zielports um +- \++t++ - schaltet zwischen den Anzeigemodi um: Standardmäßige zweizeilige Anzeige mit Sende- und Empfangsverkehr und dreizeilige Anzeige von Sende-, Empfangs- und Gesamt-Traffic +- \++1++, ++2++, ++3++ – Sortieren nach 1., 2. oder 3. Spalte +- \++l++ - geben Sie einen POSIX-regulären Ausdruck ein, um Hostnamen zu filtern +- \++shift+p++ - Pausiert die aktuelle Anzeige +- \++o++ - friert die Gesamtbandbreiten-Auswertung ein +- \++j++ - nach unten scrollen +- \++k++ - nach oben scrollen +- \++f++ – bearbeitet den Filtercode diff --git a/docs/gemstones/network/iftop.fr.md b/docs/gemstones/network/iftop.fr.md index dede4a240c..78fe26c2e7 100644 --- a/docs/gemstones/network/iftop.fr.md +++ b/docs/gemstones/network/iftop.fr.md @@ -83,21 +83,21 @@ TOTAL: 60.5MB 242Mb 242Mb 242Mb 242Mb Analyse des lignes du volet inférieur : - - TX - Utilisation des données de transmission/téléchargement - - RX - Utilisation des données de réception/téléchargement - - TOTAL - Quantité totale de téléchargement/téléchargement +- TX - Utilisation des données de transmission/téléchargement +- RX - Utilisation des données de réception/téléchargement +- TOTAL - Quantité totale de téléchargement/téléchargement ## Racourcis de clavier - - \++s++ - regroupe tout le trafic pour chaque source - - \++d++ - regroupe tout le trafic pour chaque destination - - \++shift+s++ - bascule vers l'affichage du port source - - \++shift+d++ - bascule vers l'affichage du port de destination - - \++t++ - bascule entre les modes d'affichage : affichage par défaut sur deux lignes avec le trafic d'envoi et de réception et affichage sur trois lignes du trafic d'envoi, de réception et total - - \++1++, ++2++, ++3++ - trier par 1ère, 2ème ou 3ème colonne - - \++l++ - entre une expression régulière POSIX pour filtrer les noms d'hôtes - - \++shift+p++ - met en pause l'affichage actuel - - \++o++ - gèle le comptage total de bande passante - - \++j++ - déroulement vers le bas - - \++k++ - déroulement vers le haut - - \++f++ - édite le code du filtre +- \++s++ - regroupe tout le trafic pour chaque source +- \++d++ - regroupe tout le trafic pour chaque destination +- \++shift+s++ - bascule vers l'affichage du port source +- \++shift+d++ - bascule vers l'affichage du port de destination +- \++t++ - bascule entre les modes d'affichage : affichage par défaut sur deux lignes avec le trafic d'envoi et de réception et affichage sur trois lignes du trafic d'envoi, de réception et total +- \++1++, ++2++, ++3++ - trier par 1ère, 2ème ou 3ème colonne +- \++l++ - entre une expression régulière POSIX pour filtrer les noms d'hôtes +- \++shift+p++ - met en pause l'affichage actuel +- \++o++ - gèle le comptage total de bande passante +- \++j++ - déroulement vers le bas +- \++k++ - déroulement vers le haut +- \++f++ - édite le code du filtre diff --git a/docs/gemstones/network/iftop.it.md b/docs/gemstones/network/iftop.it.md index 55aa3b61ed..60b36b57b8 100644 --- a/docs/gemstones/network/iftop.it.md +++ b/docs/gemstones/network/iftop.it.md @@ -83,21 +83,21 @@ TOTAL: 60.5MB 242Mb 242Mb 242Mb 242Mb Sezionando le righe finali del pannello: - - TX - Utilizzo dei dati di trasmissione/caricamento - - RX - Utilizzo dei dati di ricezione/download - - TOTAL - Utilizzo combinato di upload/download +- TX - Utilizzo dei dati di trasmissione/caricamento +- RX - Utilizzo dei dati di ricezione/download +- TOTAL - Utilizzo combinato di upload/download ## Tasti di scelta rapida per l'interazione - - \++s++ - aggrega tutto il traffico per ogni origine - - \++d++ - aggrega tutto il traffico per ogni destinazione - - \++shift+s++ - attiva/disattiva la visualizzazione della porta di origine - - \++shift+d++ - attiva/disattiva la visualizzazione della porta di destinazione - - \++t++ - passa da una modalità di visualizzazione all'altra: visualizzazione predefinita a due righe con traffico in invio e in ricezione e visualizzazione a tre righe con traffico in invio, in ricezione e totale - - \++1++, ++2++, ++3++ - ordina per prima, seconda o terza colonna - - \++l++ - inserisce un'espressione regolare POSIX per filtrare i nomi di host - - \++shift+p++ - mette in pausa la visualizzazione corrente - - \++o++ - blocca il conteggio della larghezza di banda totale - - \++j++ - scorre verso il basso - - \++k++ - scorre verso l'alto - - \++f++ - modifica il codice del filtro +- \++s++ - aggrega tutto il traffico per ogni origine +- \++d++ - aggrega tutto il traffico per ogni destinazione +- \++shift+s++ - attiva/disattiva la visualizzazione della porta di origine +- \++shift+d++ - attiva/disattiva la visualizzazione della porta di destinazione +- \++t++ - passa da una modalità di visualizzazione all'altra: visualizzazione predefinita a due righe con traffico in invio e in ricezione e visualizzazione a tre righe con traffico in invio, in ricezione e totale +- \++1++, ++2++, ++3++ - ordina per prima, seconda o terza colonna +- \++l++ - inserisce un'espressione regolare POSIX per filtrare i nomi di host +- \++shift+p++ - mette in pausa la visualizzazione corrente +- \++o++ - blocca il conteggio della larghezza di banda totale +- \++j++ - scorre verso il basso +- \++k++ - scorre verso l'alto +- \++f++ - modifica il codice del filtro diff --git a/docs/gemstones/network/iftop.uk.md b/docs/gemstones/network/iftop.uk.md index f07c25d4d8..cd7aebb528 100644 --- a/docs/gemstones/network/iftop.uk.md +++ b/docs/gemstones/network/iftop.uk.md @@ -83,21 +83,21 @@ TOTAL: 60.5MB 242Mb 242Mb 242Mb 242Mb Порушення рядків нижньої панелі: - - TX - Використання даних для передачі/завантаження - - RX - Використання даних для отримання/завантаження - - TOTAL - Комбіноване використання завантаження/завантаження +- TX - Використання даних для передачі/завантаження +- RX - Використання даних для отримання/завантаження +- TOTAL - Комбіноване використання завантаження/завантаження ## Комбінації клавіш для взаємодії - - \++s++ - агрегує весь трафік для кожного джерела - - \++d++ - агрегує весь трафік для кожного пункту призначення - - \++shift+s++ - перемикає відображення вихідного порту - - \++shift+d++ - перемикає відображення порту призначення - - \++t++ - перемикається між режимами відображення: дворядковий дисплей за замовчуванням із трафіком надсилання та отримання та трирядковий дисплей надсилання, отримання та загального трафіку - - \++1++, ++2++, ++3++ - сортує за 1-м, 2-м або 3-м стовпцем - - \++l++ - вводить регулярний вираз POSIX для фільтрації імен хостів - - \++shift+p++ - призупиняє поточний дисплей - - \++o++ - заморожує загальну кількість пропускної здатності - - \++j++ - прокручується вниз - - \++k++ - прокручується вгору - - \++f++ - редагує код фільтра +- \++s++ - агрегує весь трафік для кожного джерела +- \++d++ - агрегує весь трафік для кожного пункту призначення +- \++shift+s++ - перемикає відображення вихідного порту +- \++shift+d++ - перемикає відображення порту призначення +- \++t++ - перемикається між режимами відображення: дворядковий дисплей за замовчуванням із трафіком надсилання та отримання та трирядковий дисплей надсилання, отримання та загального трафіку +- \++1++, ++2++, ++3++ - сортує за 1-м, 2-м або 3-м стовпцем +- \++l++ - вводить регулярний вираз POSIX для фільтрації імен хостів +- \++shift+p++ - призупиняє поточний дисплей +- \++o++ - заморожує загальну кількість пропускної здатності +- \++j++ - прокручується вниз +- \++k++ - прокручується вгору +- \++f++ - редагує код фільтра diff --git a/docs/gemstones/network/nload.de.md b/docs/gemstones/network/nload.de.md index 30062902f3..84ff6e7239 100644 --- a/docs/gemstones/network/nload.de.md +++ b/docs/gemstones/network/nload.de.md @@ -70,17 +70,17 @@ Outgoing: Aufschlüsselung der obigen Zeilen: - - Curr - aktuell gemessene Bandbreitennutzung - - Avg – durchschnittliche Bandbreitennutzung im Zeitraum - - Min - minimale gemessene Bandbreitennutzung - - Max – maximal gemessene Bandbreitennutzung - - Ttl – in der `nload`-Sitzung übertragene Daten +- Curr - aktuell gemessene Bandbreitennutzung +- Avg – durchschnittliche Bandbreitennutzung im Zeitraum +- Min - minimale gemessene Bandbreitennutzung +- Max – maximal gemessene Bandbreitennutzung +- Ttl – in der `nload`-Sitzung übertragene Daten ## Tastaturkürzel - - \++page-down++, ++down++ – Eine Schnittstelle nach unten gehen - - \++page-up++, ++up++ – Eine Schnittstelle nach oben gehen - - \++f2++ – Zeigt das Optionsfenster an - - \++f5++ - Optionen speichern - - \++f6++ – Einstellungen aus der Konfigurationsdatei neu laden - - \++q++, ++Strg+C++ – `nload` beenden +- \++page-down++, ++down++ – Eine Schnittstelle nach unten gehen +- \++page-up++, ++up++ – Eine Schnittstelle nach oben gehen +- \++f2++ – Zeigt das Optionsfenster an +- \++f5++ - Optionen speichern +- \++f6++ – Einstellungen aus der Konfigurationsdatei neu laden +- \++q++, ++Strg+C++ – `nload` beenden diff --git a/docs/gemstones/network/nload.fr.md b/docs/gemstones/network/nload.fr.md index 345c05f1d5..1630b24360 100644 --- a/docs/gemstones/network/nload.fr.md +++ b/docs/gemstones/network/nload.fr.md @@ -70,17 +70,17 @@ Outgoing: Décorticage des lignes ci-dessus : - - Curr – utilisation actuelle de la bande passante - - Avg - utilisation moyenne de la bande passante au cours d'une période donnée - - Min - utilisation minimale de la bande passante mesurée - - Max - utilisation maximale de la bande passante mesurée - - Ttl - données transférées lors de la session `nload` +- Curr – utilisation actuelle de la bande passante +- Avg - utilisation moyenne de la bande passante au cours d'une période donnée +- Min - utilisation minimale de la bande passante mesurée +- Max - utilisation maximale de la bande passante mesurée +- Ttl - données transférées lors de la session `nload` ## Racourcis de clavier - - \++page-down++, ++down++ – Descendre d'une interface - - \++page-up++, ++up++ – Remonter d'une interface - - \++f2++ - Affiche la fenêtre des options - - \++f5++ - Enregistrer les options - - \++f6++ – Recharger les paramètres à partir du fichier de configuration - - \++q++, ++ctrl+c++ - Quitter `nload` +- \++page-down++, ++down++ – Descendre d'une interface +- \++page-up++, ++up++ – Remonter d'une interface +- \++f2++ - Affiche la fenêtre des options +- \++f5++ - Enregistrer les options +- \++f6++ – Recharger les paramètres à partir du fichier de configuration +- \++q++, ++ctrl+c++ - Quitter `nload` diff --git a/docs/gemstones/network/nload.it.md b/docs/gemstones/network/nload.it.md index e6b76daef0..834c7b78b6 100644 --- a/docs/gemstones/network/nload.it.md +++ b/docs/gemstones/network/nload.it.md @@ -70,17 +70,17 @@ Outgoing: Scomponendo le righe precedenti: - - Curr - utilizzo attuale della larghezza di banda misurata - - Avg - utilizzo medio della larghezza di banda nel periodo - - Min - utilizzo minimo della larghezza di banda misurata - - Max - utilizzo massimo della larghezza di banda misurata - - Ttl - dati trasferiti nella sessione \`nload +- Curr - utilizzo attuale della larghezza di banda misurata +- Avg - utilizzo medio della larghezza di banda nel periodo +- Min - utilizzo minimo della larghezza di banda misurata +- Max - utilizzo massimo della larghezza di banda misurata +- Ttl - dati trasferiti nella sessione \`nload ## Tasti di scelta rapida per l'interazione - - \++page-down++, ++down++ - Scendere di un'interfaccia - - \++page-up++, ++up++ - Salire di un'interfaccia - - \++f2++ - Mostra la finestra delle opzioni - - \++f5++ - Salva le opzioni - - \++f6++ - Ricaricare le impostazioni dal file di configurazione - - \++q++, ++ctrl+c++ - Chiude `nload` +- \++page-down++, ++down++ - Scendere di un'interfaccia +- \++page-up++, ++up++ - Salire di un'interfaccia +- \++f2++ - Mostra la finestra delle opzioni +- \++f5++ - Salva le opzioni +- \++f6++ - Ricaricare le impostazioni dal file di configurazione +- \++q++, ++ctrl+c++ - Chiude `nload` diff --git a/docs/gemstones/network/nload.uk.md b/docs/gemstones/network/nload.uk.md index a6b03189ee..a059e48d95 100644 --- a/docs/gemstones/network/nload.uk.md +++ b/docs/gemstones/network/nload.uk.md @@ -70,17 +70,17 @@ Outgoing: Розбиття наведених вище рядків: - - Curr - використання поточної виміряної пропускної здатності - - Avg - середнє використання пропускної здатності за період - - Min - використання мінімальної виміряної пропускної здатності - - Max - використання максимальної виміряної пропускної здатності - - Ttl - дані, передані в сеансі `nload` +- Curr - використання поточної виміряної пропускної здатності +- Avg - середнє використання пропускної здатності за період +- Min - використання мінімальної виміряної пропускної здатності +- Max - використання максимальної виміряної пропускної здатності +- Ttl - дані, передані в сеансі `nload` ## Комбінації клавіш для взаємодії - - \++page-down++, ++down++ - Переходить вниз на один інтерфейс - - \++page-up++, ++up++ - Переходить вверх на один інтерфейс - - \++f2++ - Показує вікно параметрів - - \++f5++ - Зберігає параметри - - \++f6++ - Перезавантажує налаштування з конфігураційного файлу - - \++q++, ++ctrl+c++ - Закриває `nload` +- \++page-down++, ++down++ - Переходить вниз на один інтерфейс +- \++page-up++, ++up++ - Переходить вверх на один інтерфейс +- \++f2++ - Показує вікно параметрів +- \++f5++ - Зберігає параметри +- \++f6++ - Перезавантажує налаштування з конфігураційного файлу +- \++q++, ++ctrl+c++ - Закриває `nload` diff --git a/docs/guides/cloud/migration-to-new-azure-images.it.md b/docs/guides/cloud/migration-to-new-azure-images.it.md index 06842f0116..ea9049bd97 100644 --- a/docs/guides/cloud/migration-to-new-azure-images.it.md +++ b/docs/guides/cloud/migration-to-new-azure-images.it.md @@ -25,8 +25,8 @@ Questa guida fornisce i passaggi dettagliati per la migrazione delle macchine vi ## Prima di iniziare - - Assicurarsi di avere un backup aggiornato della macchina virtuale. Anche se il processo di migrazione non dovrebbe avere ripercussioni sui dati, un backup è la prassi migliore per qualsiasi modifica del sistema. - - Verificare di disporre delle autorizzazioni necessarie per creare nuove macchine virtuali e gestire quelle esistenti nel proprio account Azure. +- Assicurarsi di avere un backup aggiornato della macchina virtuale. Anche se il processo di migrazione non dovrebbe avere ripercussioni sui dati, un backup è la prassi migliore per qualsiasi modifica del sistema. +- Verificare di disporre delle autorizzazioni necessarie per creare nuove macchine virtuali e gestire quelle esistenti nel proprio account Azure. ## Passo 1: Individuare le macchine virtuali esistenti @@ -40,10 +40,10 @@ erockyenterprisesoftwarefoundationinc1653071250513` 1. **Navigare** nel Azure Marketplace. 2. **Cercate** le nuove immagini di Rocky Linux con l'account dell'editore `resf` o accedete alle Community Galleries. - - Attuali Link Marketplace: - - [Rocky Linux x86_64](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/resf.rockylinux-x86_64) - - [Rocky Linux aarch64](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/resf.rockylinux-aarch64) - - Le istruzioni complete per accedere alle immagini della Community Gallery si trovano in questo [post di notizie](https://rockylinux.org/news/rocky-on-azure-community-gallery/). + - Attuali Link Marketplace: + - [Rocky Linux x86_64](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/resf.rockylinux-x86_64) + - [Rocky Linux aarch64](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/resf.rockylinux-aarch64) + - Le istruzioni complete per accedere alle immagini della Community Gallery si trovano in questo [post di notizie](https://rockylinux.org/news/rocky-on-azure-community-gallery/). 3. **Selezionare** la versione di Rocky Linux desiderata e **creare una nuova VM**. Durante la configurazione, è possibile scegliere la stessa dimensione della macchina virtuale e altre configurazioni della macchina virtuale esistente per garantire la compatibilità. ## Fase 3: Trasferimento dei dati @@ -80,8 +80,8 @@ Dopo aver confermato che la nuova macchina virtuale funziona correttamente e ave ## Fasi finali - - Verificare che tutti i servizi della nuova macchina virtuale funzionino come previsto. - - Monitorare le prestazioni e lo stato di salute della nuova macchina virtuale per assicurarsi che soddisfi le proprie esigenze. +- Verificare che tutti i servizi della nuova macchina virtuale funzionino come previsto. +- Monitorare le prestazioni e lo stato di salute della nuova macchina virtuale per assicurarsi che soddisfi le proprie esigenze. ## Supporto diff --git a/docs/guides/cloud/migration-to-new-azure-images.uk.md b/docs/guides/cloud/migration-to-new-azure-images.uk.md index edc0eb36a6..7b1412b145 100644 --- a/docs/guides/cloud/migration-to-new-azure-images.uk.md +++ b/docs/guides/cloud/migration-to-new-azure-images.uk.md @@ -25,8 +25,8 @@ RESF надає зображення віртуальної машини Rocky L ## Перш ніж почати - - Переконайтеся, що у вас є поточна резервна копія віртуальної машини. Хоча процес міграції не повинен вплинути на ваші дані, створення резервної копії є найкращою практикою для будь-яких системних змін. - - Переконайтеся, що ви маєте необхідні дозволи для створення нових віртуальних машин і керування існуючими в обліковому записі Azure. +- Переконайтеся, що у вас є поточна резервна копія віртуальної машини. Хоча процес міграції не повинен вплинути на ваші дані, створення резервної копії є найкращою практикою для будь-яких системних змін. +- Переконайтеся, що ви маєте необхідні дозволи для створення нових віртуальних машин і керування існуючими в обліковому записі Azure. ## Крок 1. Знайдіть існуючі віртуальні машини @@ -40,10 +40,10 @@ erockyenterprisesoftwarefoundationinc1653071250513` 1. **Перейдіть** до Azure Marketplace. 2. **Шукайте** нові зображення Rocky Linux під обліковим записом видавця `resf` або перейдіть до Галереї спільноти. - - Поточні посилання на Marketplace: - - [Rocky Linux x86_64](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/resf.rockylinux-x86_64) - - [Rocky Linux aarch64](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/resf.rockylinux-aarch64) - - Повні інструкції щодо доступу до зображень спільнотної галереї можна знайти в цій [повідомленні новин](https://rockylinux.org/news/rocky-on-azure-community-gallery/) + - Поточні посилання на Marketplace: + - [Rocky Linux x86_64](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/resf.rockylinux-x86_64) + - [Rocky Linux aarch64](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/resf.rockylinux-aarch64) + - Повні інструкції щодо доступу до зображень спільнотної галереї можна знайти в цій [повідомленні новин](https://rockylinux.org/news/rocky-on-azure-community-gallery/) 3. **Виберіть** потрібну версію Rocky Linux і **створіть нову віртуальну машину**. Під час налаштування ви можете вибрати той самий розмір віртуальної машини та інші конфігурації, що й ваша існуюча віртуальна машина, щоб забезпечити сумісність. ## Крок 3: Передайте дані @@ -80,8 +80,8 @@ rsync -avzh /path/to/old_VM_data/ user@new_VM_IP:/path/to/new_VM_destination/ ## Останні кроки - - Перевірте, чи всі служби на новій віртуальній машині працюють належним чином. - - Слідкуйте за продуктивністю та справністю нової віртуальної машини, щоб переконатися, що вона відповідає вашим потребам. +- Перевірте, чи всі служби на новій віртуальній машині працюють належним чином. +- Слідкуйте за продуктивністю та справністю нової віртуальної машини, щоб переконатися, що вона відповідає вашим потребам. ## Підтримка diff --git a/docs/guides/cms/wordpress-on-lamp.it.md b/docs/guides/cms/wordpress-on-lamp.it.md index 1ca2126854..b09632e017 100644 --- a/docs/guides/cms/wordpress-on-lamp.it.md +++ b/docs/guides/cms/wordpress-on-lamp.it.md @@ -7,8 +7,8 @@ tested_with: 9.2 ## Prerequisiti - - Un sistema Rocky Linux 9.x - - privilegi sudo +- Un sistema Rocky Linux 9.x +- privilegi sudo ## Introduzione diff --git a/docs/guides/cms/wordpress-on-lamp.uk.md b/docs/guides/cms/wordpress-on-lamp.uk.md index dabb8a2fb7..2ccd975b0a 100644 --- a/docs/guides/cms/wordpress-on-lamp.uk.md +++ b/docs/guides/cms/wordpress-on-lamp.uk.md @@ -7,8 +7,8 @@ tested_with: 9.2 ## Передумови - - Система Rocky Linux 9.x - - привілеї sudo +- Система Rocky Linux 9.x +- привілеї sudo ## Вступ diff --git a/docs/guides/desktop/kde_installation.fr.md b/docs/guides/desktop/kde_installation.fr.md index b27d50766c..df62676f2b 100644 --- a/docs/guides/desktop/kde_installation.fr.md +++ b/docs/guides/desktop/kde_installation.fr.md @@ -2,7 +2,7 @@ title: Installation de KDE author: Steven Spencer contributors: Ezequiel Bruni, Ganna Zhyrnova -tested_with: 9.0 +tested_with: 10 tags: - desktop - kde @@ -19,7 +19,7 @@ Grâce à l'équipe de développement de Rocky Linux, il y a maintenant des imag ## Prérequis -- Une machine, compatible avec Rocky Linux 9.0, (bureau, ordinateur portable ou serveur) sur laquelle vous voulez utiliser le bureau KDE. +- Une machine, compatible avec Rocky Linux 9 ou 10 (bureau, ordinateur portable ou serveur), sur laquelle vous voulez utiliser le bureau KDE. - Maîtriser la ligne de commande de manière à pouvoir réaliser certaines tâches, par exemple tester les sommes de contrôle de l'image. - La connaissance de la façon d'écrire une image amorçable sur DVD ou une clé USB. diff --git a/docs/guides/interoperability/import_rocky_to_wsl.de.md b/docs/guides/interoperability/import_rocky_to_wsl.de.md index 7ae7e86ea5..a8c482b774 100644 --- a/docs/guides/interoperability/import_rocky_to_wsl.de.md +++ b/docs/guides/interoperability/import_rocky_to_wsl.de.md @@ -1,7 +1,7 @@ --- -title: Rocky Linux nach WSL oder WSL2 Import +title: Rocky Linux 10 nach WSL oder WSL2 Importieren author: Lukas Magauer -tested_with: 8.10, 9.6, 10.0 +tested_with: 10.0 tags: - wsl - wsl2 diff --git a/docs/guides/repositories/pulp_fetch_upload.it.md b/docs/guides/repositories/pulp_fetch_upload.it.md index e81c6d9748..0e409ee26e 100644 --- a/docs/guides/repositories/pulp_fetch_upload.it.md +++ b/docs/guides/repositories/pulp_fetch_upload.it.md @@ -17,8 +17,8 @@ Gli sviluppatori che utilizzano Rocky Linux hanno spesso bisogno di diversi repo ## Requisiti - - Un sistema Rocky Linux - - In grado di eseguire container +- Un sistema Rocky Linux +- In grado di eseguire container ## Configurazione - Singolo Container diff --git a/docs/guides/repositories/pulp_fetch_upload.uk.md b/docs/guides/repositories/pulp_fetch_upload.uk.md index 120c9354b3..b5fab183d2 100644 --- a/docs/guides/repositories/pulp_fetch_upload.uk.md +++ b/docs/guides/repositories/pulp_fetch_upload.uk.md @@ -17,8 +17,8 @@ tags: ## Вимоги - - Система Rocky Linux - - Вміння запускати контейнери +- Система Rocky Linux +- Вміння запускати контейнери ## Налаштування - один контейнер diff --git a/docs/guides/security/ssh_ca_key_signing.fr.md b/docs/guides/security/ssh_ca_key_signing.fr.md index 15603a1361..895fc49c53 100644 --- a/docs/guides/security/ssh_ca_key_signing.fr.md +++ b/docs/guides/security/ssh_ca_key_signing.fr.md @@ -11,11 +11,11 @@ tags: ## Prérequis - - Savoir utiliser les outils de ligne de commande - - Gestion de contenus à partir de la ligne de commande - - Une certaine expérience des clés SSH est souhaitée mais pas indispensable - - Une connaissance de base de SSH et de l'infrastructure de clés publiques est utile mais bien facultative - - Un serveur qui exécute le daemon `sshd`. +- Savoir utiliser les outils de ligne de commande +- Gestion de contenus à partir de la ligne de commande +- Une certaine expérience des clés SSH est souhaitée mais pas indispensable +- Une connaissance de base de SSH et de l'infrastructure de clés publiques est utile mais bien facultative +- Un serveur qui exécute le daemon `sshd`. ## Introduction @@ -25,13 +25,13 @@ Les autorités de certification peuvent également être utilisées pour signer ## Objectifs - - Amélioration de la sécurité des connexions SSH. - - Consolider le processus d'intégration et la gestion des clés. +- Amélioration de la sécurité des connexions SSH. +- Consolider le processus d'intégration et la gestion des clés. ## Notes - - L'auteur de l'article favorise l'éditeur de texte `vim`. L'utilisation d'éditeurs de texte comme `nano` ou autres est tout à fait acceptable. - - L'utilisation de `sudo` ou `root` implique des privilèges supplémentaires. +- L'auteur de l'article favorise l'éditeur de texte `vim`. L'utilisation d'éditeurs de texte comme `nano` ou autres est tout à fait acceptable. +- L'utilisation de `sudo` ou `root` implique des privilèges supplémentaires. ## Connexion initiale @@ -65,9 +65,9 @@ Créer une autorité de certification (clés privées et publiques) et placer la Où : - - **-b** : bytes, longueur de clé en octets - - **-t** : type de clé ; rsa, ed25519, ecdsa... - - **-f** : fichier d'enregistrement de la clé +- **-b** : bytes, longueur de clé en octets +- **-t** : type de clé ; rsa, ed25519, ecdsa... +- **-f** : fichier d'enregistrement de la clé Vous pouvez aussi spécifier la variable `known_hosts` pour tout le système en éditant le fichier de configuration SSH `/etc/ssh/ssh_config` : @@ -94,11 +94,11 @@ Acquisition de la clé publique du serveur via `scp` et signature : Où : - - **-s** : signature de clé - - **-I** : nom identifiant le certificat à des fins de journalisation - - **-n** : identifie le nom (hôte ou utilisateur, un ou plusieurs) associé au certificat (s'il n'est pas spécifié, les certificats sont valables pour tous les utilisateurs ou hôtes) - - **-h** : définit le certificat comme clé hôte, par opposition à une clé cliente - - **-V** : durée de validité du certificat +- **-s** : signature de clé +- **-I** : nom identifiant le certificat à des fins de journalisation +- **-n** : identifie le nom (hôte ou utilisateur, un ou plusieurs) associé au certificat (s'il n'est pas spécifié, les certificats sont valables pour tous les utilisateurs ou hôtes) +- **-h** : définit le certificat comme clé hôte, par opposition à une clé cliente +- **-V** : durée de validité du certificat ## Établir la confiance diff --git a/docs/guides/security/ssh_ca_key_signing.it.md b/docs/guides/security/ssh_ca_key_signing.it.md index d4b365cf7a..e42bb48409 100644 --- a/docs/guides/security/ssh_ca_key_signing.it.md +++ b/docs/guides/security/ssh_ca_key_signing.it.md @@ -11,11 +11,11 @@ tags: ## Prerequisiti - - Capacità di utilizzare strumenti a riga di comando - - Gestione dei contenuti dalla riga di comando - - L'esperienza precedente con la generazione di chiavi SSH è utile ma non necessaria - - Una conoscenza di base di SSH e dell'infrastruttura a chiave pubblica è utile ma non necessaria - - Un server che esegue il demone sshd. +- Capacità di utilizzare strumenti a riga di comando +- Gestione dei contenuti dalla riga di comando +- L'esperienza precedente con la generazione di chiavi SSH è utile ma non necessaria +- Una conoscenza di base di SSH e dell'infrastruttura a chiave pubblica è utile ma non necessaria +- Un server che esegue il demone sshd. ## Introduzione @@ -25,13 +25,13 @@ Le CA possono essere utilizzate anche per firmare le chiavi SSH degli utenti. In ## Obiettivi - - Migliorare la sicurezza delle connessioni SSH. - - Migliorare il processo di inserimento e della gestione delle chiavi. +- Migliorare la sicurezza delle connessioni SSH. +- Migliorare il processo di inserimento e della gestione delle chiavi. ## Note - - Vim è l'editor di testo scelto dall'autore. L'uso di altri editor di testo, come nano o altri, è perfettamente accettabile. - - L'uso di `sudo` o `root` implica privilegi elevati. +- Vim è l'editor di testo scelto dall'autore. L'uso di altri editor di testo, come nano o altri, è perfettamente accettabile. +- L'uso di `sudo` o `root` implica privilegi elevati. ## Connessione iniziale @@ -65,9 +65,9 @@ Creare una CA (chiave privata e pubblica) e inserire la chiave pubblica nel file Dove: - - **-b**: lunghezza della chiave in byte - - **-t**: tipo di chiave: rsa, ed25519, ecdsa... - - **-f**: file chiave di output +- **-b**: lunghezza della chiave in byte +- **-t**: tipo di chiave: rsa, ed25519, ecdsa... +- **-f**: file chiave di output In alternativa, è possibile specificare il file `known_hosts` a livello di sistema modificando il file di configurazione SSH `/etc/ssh/ssh_config`: @@ -94,11 +94,11 @@ Acquisire la chiave pubblica del server tramite `scp` e firmarla: Dove: - - **-s**: chiave di firma - - **-I**: nome che identifica il certificato a scopo di registrazione - - **-n**: identifica il nome (host o utente, uno o più) associato al certificato (se non viene specificato, i certificati sono validi per tutti gli utenti o host) - - **-h**: definisce il certificato come chiave host, anziché come chiave client - - **-V**: periodo di validità del certificato +- **-s**: chiave di firma +- **-I**: nome che identifica il certificato a scopo di registrazione +- **-n**: identifica il nome (host o utente, uno o più) associato al certificato (se non viene specificato, i certificati sono validi per tutti gli utenti o host) +- **-h**: definisce il certificato come chiave host, anziché come chiave client +- **-V**: periodo di validità del certificato ## Stabilire la fiducia diff --git a/docs/guides/security/ssh_ca_key_signing.uk.md b/docs/guides/security/ssh_ca_key_signing.uk.md index 289a62d020..005d0f5d46 100644 --- a/docs/guides/security/ssh_ca_key_signing.uk.md +++ b/docs/guides/security/ssh_ca_key_signing.uk.md @@ -11,11 +11,11 @@ tags: ## Передумови - - Вміння використовувати засоби командного рядка - - Керування вмістом з командного рядка - - Попередній досвід створення ключів SSH корисний, але не обов’язковий - - Базове розуміння SSH та інфраструктури відкритих ключів корисне, але не обов’язкове - - Сервер, на якому працює демон sshd. +- Вміння використовувати засоби командного рядка +- Керування вмістом з командного рядка +- Попередній досвід створення ключів SSH корисний, але не обов’язковий +- Базове розуміння SSH та інфраструктури відкритих ключів корисне, але не обов’язкове +- Сервер, на якому працює демон sshd. ## Вступ @@ -25,13 +25,13 @@ tags: ## Цілі - - Покращення безпеки підключень SSH. - - Покращення процесу реєстрації та управління ключами. +- Покращення безпеки підключень SSH. +- Покращення процесу реєстрації та управління ключами. ## Примітки - - Vim є текстовим редактором за вибором автора. Допускається використання інших текстових редакторів, наприклад nano або інших. - - Використання `sudo` або `root` передбачає підвищені привілеї. +- Vim є текстовим редактором за вибором автора. Допускається використання інших текстових редакторів, наприклад nano або інших. +- Використання `sudo` або `root` передбачає підвищені привілеї. ## Початкове підключення @@ -65,9 +65,9 @@ Are you sure you want to continue connecting (yes/no/[fingerprint])? Де: - - **-b**: довжина ключа в байтах - - **-t**: тип ключа: rsa, ed25519, ecdsa... - - **-f**: вихідний файл ключа +- **-b**: довжина ключа в байтах +- **-t**: тип ключа: rsa, ed25519, ecdsa... +- **-f**: вихідний файл ключа Крім того, ви можете вказати файл `known_hosts` для всієї системи, відредагувавши файл конфігурації SSH `/etc/ssh/ssh_config`: @@ -94,11 +94,11 @@ Host * Де: - - **-s**: ключ підпису - - **-I**: ім'я, яке ідентифікує сертифікат для цілей реєстрації - - **-n**: ідентифікує ім’я (хост або користувач, один або кілька), пов’язане з сертифікатом (якщо не вказано, сертифікати дійсні для всіх користувачів або хостів) - - **-h**: визначає сертифікат як ключ хоста, на відміну від ключа клієнта - - **-V**: термін дії сертифіката +- **-s**: ключ підпису +- **-I**: ім'я, яке ідентифікує сертифікат для цілей реєстрації +- **-n**: ідентифікує ім’я (хост або користувач, один або кілька), пов’язане з сертифікатом (якщо не вказано, сертифікати дійсні для всіх користувачів або хостів) +- **-h**: визначає сертифікат як ключ хоста, на відміну від ключа клієнта +- **-V**: термін дії сертифіката ## Встановлення довіри diff --git a/docs/guides/virtualization/libvirt-rocky.it.md b/docs/guides/virtualization/libvirt-rocky.it.md index 01de553cec..03b49c6525 100644 --- a/docs/guides/virtualization/libvirt-rocky.it.md +++ b/docs/guides/virtualization/libvirt-rocky.it.md @@ -17,8 +17,8 @@ Questo documento fornisce le istruzioni per l'impostazione di libvirt su Rocky L ## Prerequisiti - - Una macchina a 64 bit con Rocky Linux 9. - - Assicuratevi di aver abilitato la virtualizzazione nelle impostazioni del BIOS. Se il comando seguente restituisce un risultato, significa che l'abilitazione della virtualizzazione è stata completata: +- Una macchina a 64 bit con Rocky Linux 9. +- Assicuratevi di aver abilitato la virtualizzazione nelle impostazioni del BIOS. Se il comando seguente restituisce un risultato, significa che l'abilitazione della virtualizzazione è stata completata: ```bash sudo grep -e 'vmx' /proc/cpuinfo @@ -26,13 +26,13 @@ sudo grep -e 'vmx' /proc/cpuinfo ## Configurazione del repository e installazione dei pacchetti - - Attivare il repository EPEL (Extra Packages for Enterprise Linux): +- Attivare il repository EPEL (Extra Packages for Enterprise Linux): ```bash sudo dnf install -y epel-release ``` - - Installare i pacchetti necessari per `libvirt` (opzionalmente per `virt-manager` se si vuole usare una GUI per gestire le macchine virtuali): +- Installare i pacchetti necessari per `libvirt` (opzionalmente per `virt-manager` se si vuole usare una GUI per gestire le macchine virtuali): ```bash sudo dnf install -y bridge-utils virt-top libguestfs-tools bridge-utils virt-viewer qemu-kvm libvirt virt-manager virt-install @@ -40,19 +40,19 @@ sudo dnf install -y bridge-utils virt-top libguestfs-tools bridge-utils virt-vie ## Configurazione utente libvirt - - Aggiungere il proprio utente al gruppo `libvirt`. Ciò consente di gestire le macchine virtuali e di utilizzare comandi come `virt-install` come utente non root: +- Aggiungere il proprio utente al gruppo `libvirt`. Ciò consente di gestire le macchine virtuali e di utilizzare comandi come `virt-install` come utente non root: ```bash sudo usermod -aG libvirt $USER ``` - - Attivare il gruppo `libvirt` utilizzando il comando `newgrp`: +- Attivare il gruppo `libvirt` utilizzando il comando `newgrp`: ```bash sudo newgrp libvirt ``` - - Abilitare e avviare il servizio `libvirtd`: +- Abilitare e avviare il servizio `libvirtd`: ```bash sudo systemctl enable --now libvirtd @@ -60,13 +60,13 @@ sudo systemctl enable --now libvirtd ## Configurazione dell'interfaccia bridge per l'accesso diretto alle macchine virtuali - - Controllare le interfacce attualmente in uso e annotare l'interfaccia principale con connessione a Internet: +- Controllare le interfacce attualmente in uso e annotare l'interfaccia principale con connessione a Internet: ```bash sudo nmcli connection show ``` - - Eliminare l'interfaccia collegata a Internet e tutte le connessioni virtual bridge attualmente presenti: +- Eliminare l'interfaccia collegata a Internet e tutte le connessioni virtual bridge attualmente presenti: ```bash sudo nmcli connection delete @@ -78,43 +78,43 @@ sudo nmcli connection delete Assicurarsi di avere accesso diretto alla macchina. Se si configura la macchina tramite SSH, la connessione verrà interrotta dopo aver eliminato la connessione all'interfaccia principale. ``` - - Creare la nuova connessione bridge: +- Creare la nuova connessione bridge: ```bash sudo nmcli connection add type bridge autoconnect yes con-name ifname ``` - - Assegnare un indirizzo IP statico: +- Assegnare un indirizzo IP statico: ```bash sudo nmcli connection modify ipv4.addresses ipv4.method manual ``` - - Assegnare un indirizzo gateway: +- Assegnare un indirizzo gateway: ```bash sudo nmcli connection modify ipv4.gateway ``` - - Assegnare l'indirizzo DNS: +- Assegnare l'indirizzo DNS: ```bash sudo nmcli connection modify ipv4.dns ``` - - Aggiungere la connessione bridge slave: +- Aggiungere la connessione bridge slave: ```bash sudo nmcli connection add type bridge-slave autoconnect yes con-name ifname master ``` - - Avviare la connessione bridge: +- Avviare la connessione bridge: ```bash sudo nmcli connection up ``` - - Aggiungere la riga `allow all` a `bridge.conf`: +- Aggiungere la riga `allow all` a `bridge.conf`: ```bash sudo tee -a /etc/qemu-kvm/bridge.conf < ``` - - Per forzare lo spegnimento di una macchina virtuale che non risponde, utilizzare il comando `destroy`: +- Per forzare lo spegnimento di una macchina virtuale che non risponde, utilizzare il comando `destroy`: ```bash virsh destroy --domain @@ -160,14 +160,14 @@ virsh destroy --domain ## Come cancellare una VM - - Utilizzare il comando `undefine`: +- Utilizzare il comando `undefine`: ```bash virsh undefine --domain --nvram ``` - - Per ulteriori comandi `virsh`, consultare le pagine `virsh` `man`. +- Per ulteriori comandi `virsh`, consultare le pagine `virsh` `man`. ## Conclusione - - libvirt offre molte possibilità e permette di installare e gestire le macchine virtuali con facilità. Se si hanno ulteriori integrazioni o modifiche a questo documento che si desidera condividere, l'autore vi invita a farlo. +- libvirt offre molte possibilità e permette di installare e gestire le macchine virtuali con facilità. Se si hanno ulteriori integrazioni o modifiche a questo documento che si desidera condividere, l'autore vi invita a farlo. diff --git a/docs/guides/virtualization/libvirt-rocky.uk.md b/docs/guides/virtualization/libvirt-rocky.uk.md index 1123e03576..386200c95c 100644 --- a/docs/guides/virtualization/libvirt-rocky.uk.md +++ b/docs/guides/virtualization/libvirt-rocky.uk.md @@ -17,8 +17,8 @@ tags: ## Передумови - - 4-бітна машина під керуванням Rocky Linux 9. - - Переконайтеся, що віртуалізація включена в налаштуваннях BIOS. Якщо наступна команда повертає вихідні дані, це означає, що активацію віртуалізації завершено: +- 4-бітна машина під керуванням Rocky Linux 9. +- Переконайтеся, що віртуалізація включена в налаштуваннях BIOS. Якщо наступна команда повертає вихідні дані, це означає, що активацію віртуалізації завершено: ```bash sudo grep -e 'vmx' /proc/cpuinfo @@ -26,13 +26,13 @@ sudo grep -e 'vmx' /proc/cpuinfo ## Налаштування репозиторію та встановлення пакетів - - Увімкніть репозиторій EPEL (додаткові пакети для Enterprise Linux): +- Увімкніть репозиторій EPEL (додаткові пакети для Enterprise Linux): ```bash sudo dnf install -y epel-release ``` - - Встановіть необхідні пакунки для `libvirt` (необов’язково для `virt-manager`, якщо ви бажаєте використовувати GUI для керування своїми віртуальними машинами): +- Встановіть необхідні пакунки для `libvirt` (необов’язково для `virt-manager`, якщо ви бажаєте використовувати GUI для керування своїми віртуальними машинами): ```bash sudo dnf install -y bridge-utils virt-top libguestfs-tools bridge-utils virt-viewer qemu-kvm libvirt virt-manager virt-install @@ -40,19 +40,19 @@ sudo dnf install -y bridge-utils virt-top libguestfs-tools bridge-utils virt-vie ## налаштування користувача libvirt - - Додайте свого користувача до групи `libvirt`. Це дає змогу керувати вашими віртуальними машинами та використовувати такі команди, як `virt-install`, як не-root користувач: +- Додайте свого користувача до групи `libvirt`. Це дає змогу керувати вашими віртуальними машинами та використовувати такі команди, як `virt-install`, як не-root користувач: ```bash sudo usermod -aG libvirt $USER ``` - - Активуйте групу `libvirt` за допомогою команди `newgrp`: +- Активуйте групу `libvirt` за допомогою команди `newgrp`: ```bash sudo newgrp libvirt ``` - - Увімкніть і запустіть службу `libvirtd`: +- Увімкніть і запустіть службу `libvirtd`: ```bash sudo systemctl enable --now libvirtd @@ -60,13 +60,13 @@ sudo systemctl enable --now libvirtd ## Налаштування інтерфейсу Bridge для прямого доступу до віртуальних машин - - Перевірте поточні інтерфейси, які використовуються, і запишіть основний інтерфейс із підключенням до Інтернету: +- Перевірте поточні інтерфейси, які використовуються, і запишіть основний інтерфейс із підключенням до Інтернету: ```bash sudo nmcli connection show ``` - - Видаліть інтерфейс, підключений до Інтернету, і будь-які існуючі віртуальні мостові підключення: +- Видаліть інтерфейс, підключений до Інтернету, і будь-які існуючі віртуальні мостові підключення: ```bash sudo nmcli connection delete @@ -78,43 +78,43 @@ sudo nmcli connection delete Переконайтеся, що у вас є прямий доступ до машини. Якщо ви налаштовуєте машину через SSH, з’єднання буде розірвано після видалення з’єднання основного інтерфейсу. ``` - - Створіть нове з'єднання мосту: +- Створіть нове з'єднання мосту: ```bash sudo nmcli connection add type bridge autoconnect yes con-name ifname ``` - - Призначте статичну IP-адресу: +- Призначте статичну IP-адресу: ```bash sudo nmcli connection modify ipv4.addresses ipv4.method manual ``` - - Призначте адресу шлюзу: +- Призначте адресу шлюзу: ```bash sudo nmcli connection modify ipv4.gateway ``` - - Призначте адресу DNS: +- Призначте адресу DNS: ```bash sudo nmcli connection modify ipv4.dns ``` - - Додайте підпорядковане підключення мосту: +- Додайте підпорядковане підключення мосту: ```bash sudo nmcli connection add type bridge-slave autoconnect yes con-name ifname master ``` - - Запустіть з'єднання мостом: +- Запустіть з'єднання мостом: ```bash sudo nmcli connection up ``` - - Додайте рядок `allow all` до `bridge.conf`: +- Додайте рядок `allow all` до `bridge.conf`: ```bash sudo tee -a /etc/qemu-kvm/bridge.conf < ``` - - Щоб примусово вимкнути віртуальну машину, яка не відповідає, скористайтеся командою `destroy`: +- Щоб примусово вимкнути віртуальну машину, яка не відповідає, скористайтеся командою `destroy`: ```bash virsh destroy --domain @@ -160,14 +160,14 @@ virsh destroy --domain ## Як видалити віртуальну машину - - Використовуйте команду `undefine`: +- Використовуйте команду `undefine`: ```bash virsh undefine --domain --nvram ``` - - Щоб отримати додаткові команди `virsh`, перевірте сторінки `man` `virsh`. +- Щоб отримати додаткові команди `virsh`, перевірте сторінки `man` `virsh`. ## Висновок - - libvirt надає багато можливостей і дозволяє легко встановлювати віртуальні машини та керувати ними. Якщо у вас є додаткові доповнення або зміни до цього документа, якими ви хотіли б поділитися, автор люб’язно запрошує вас це зробити. +- libvirt надає багато можливостей і дозволяє легко встановлювати віртуальні машини та керувати ними. Якщо у вас є додаткові доповнення або зміни до цього документа, якими ви хотіли б поділитися, автор люб’язно запрошує вас це зробити. diff --git a/docs/labs/kubernetes-the-hard-way/lab0-README.de.md b/docs/labs/kubernetes-the-hard-way/lab0-README.de.md index 81762615f0..80de276dc6 100644 --- a/docs/labs/kubernetes-the-hard-way/lab0-README.de.md +++ b/docs/labs/kubernetes-the-hard-way/lab0-README.de.md @@ -30,25 +30,25 @@ Die Zielgruppe dieses Tutorials sind alle, die die Grundlagen von Kubernetes und Komponenten-Versionen: - - [kubernetes](https://github.com/kubernetes/kubernetes) v1.32.x - - [containerd](https://github.com/containerd/containerd) v2.0.x - - [cni](https://github.com/containernetworking/cni) v1.6.x - - [etcd](https://github.com/etcd-io/etcd) v3.4.x +- [kubernetes](https://github.com/kubernetes/kubernetes) v1.32.x +- [containerd](https://github.com/containerd/containerd) v2.0.x +- [cni](https://github.com/containernetworking/cni) v1.6.x +- [etcd](https://github.com/etcd-io/etcd) v3.4.x ## Labs Für dieses Tutorial sind vier (4) x86_64-basierte virtuelle oder physische Maschinen erforderlich, die mit demselben Netzwerk verbunden sind. Während im Tutorial x86_64-basierte Maschinen verwendet werden, können Sie die gewonnenen Erkenntnisse auf andere Plattformen anwenden. - - [Voraussetzungen](lab1-prerequisites.md) - - [Setup der Jumpbox](lab2-jumpbox.md) - - [Provisionierung der Rechner Ressourcen](lab3-compute-resources.md) - - [Provisionierung der CA und Generierung von TLS-Zertifikate](lab4-certificate-authority.md) - - [Generierung der Kubernetes Konfigurationsdateien für die Authentifizierung](lab5-kubernetes-configuration-files.md) - - [Generierung der Data Encryption Konfiguration und Schlüssel](lab6-data-encryption-keys.md) - - [Bootstrapping vom etcd-Cluster](lab7-bootstrapping-etcd.md) - - [Bootstrapping the Kubernetes Control Plane](lab8-bootstrapping-kubernetes-controllers.md) - - [Bootstrapping the Kubernetes Worker Nodes](lab9-bootstrapping-kubernetes-workers.md) - - [Configuring kubectl for Remote Access](lab10-configuring-kubectl.md) - - [Provisioning Pod Network Routes](lab11-pod-network-routes.md) - - [Smoke Test](lab12-smoke-test.md) - - [Cleaning Up](lab13-cleanup.md) +- [Voraussetzungen](lab1-prerequisites.md) +- [Setup der Jumpbox](lab2-jumpbox.md) +- [Provisionierung der Rechner Ressourcen](lab3-compute-resources.md) +- [Provisionierung der CA und Generierung von TLS-Zertifikate](lab4-certificate-authority.md) +- [Generierung der Kubernetes Konfigurationsdateien für die Authentifizierung](lab5-kubernetes-configuration-files.md) +- [Generierung der Data Encryption Konfiguration und Schlüssel](lab6-data-encryption-keys.md) +- [Bootstrapping vom etcd-Cluster](lab7-bootstrapping-etcd.md) +- [Bootstrapping the Kubernetes Control Plane](lab8-bootstrapping-kubernetes-controllers.md) +- [Bootstrapping the Kubernetes Worker Nodes](lab9-bootstrapping-kubernetes-workers.md) +- [Configuring kubectl for Remote Access](lab10-configuring-kubectl.md) +- [Provisioning Pod Network Routes](lab11-pod-network-routes.md) +- [Smoke Test](lab12-smoke-test.md) +- [Cleaning Up](lab13-cleanup.md) diff --git a/docs/labs/kubernetes-the-hard-way/lab0-README.fr.md b/docs/labs/kubernetes-the-hard-way/lab0-README.fr.md index 3cfed947c0..92cb8e367d 100644 --- a/docs/labs/kubernetes-the-hard-way/lab0-README.fr.md +++ b/docs/labs/kubernetes-the-hard-way/lab0-README.fr.md @@ -30,25 +30,25 @@ Le public cible de ce tutoriel est toute personne souhaitant comprendre les prin Version des composantes : - - [kubernetes](https://github.com/kubernetes/kubernetes) v1.32.x - - [containerd](https://github.com/containerd/containerd) v2.0.x - - [cni](https://github.com/containernetworking/cni) v1.6.x - - [etcd](https://github.com/etcd-io/etcd) v3.4.x +- [kubernetes](https://github.com/kubernetes/kubernetes) v1.32.x +- [containerd](https://github.com/containerd/containerd) v2.0.x +- [cni](https://github.com/containernetworking/cni) v1.6.x +- [etcd](https://github.com/etcd-io/etcd) v3.4.x ## Ateliers Ce tutoriel nécessite quatre (4) machines virtuelles ou physiques basées sur x86_64 connectées au même réseau. Bien que le tutoriel utilise des machines basées sur x86_64, vous pouvez appliquer les leçons apprises à d'autres plates-formes. - - [Prérequis](lab1-prerequisites.md) - - [Mise en Place de Jumpbox](lab2-jumpbox.md) - - [Provisioning Compute Resources](lab3-compute-resources.md) - - [Provisioning the CA and Generating TLS Certificates](lab4-certificate-authority.md) - - [Generating Kubernetes Configuration Files for Authentication](lab5-kubernetes-configuration-files.md) - - [Generating the Data Encryption Config and Key](lab6-data-encryption-keys.md) - - [Bootstrapping the etcd Cluster](lab7-bootstrapping-etcd.md) - - [Bootstrapping the Kubernetes Control Plane](lab8-bootstrapping-kubernetes-controllers.md) - - [Bootstrapping the Kubernetes Worker Nodes](lab9-bootstrapping-kubernetes-workers.md) - - [Configuring kubectl for Remote Access](lab10-configuring-kubectl.md) - - [Provisioning Pod Network Routes](lab11-pod-network-routes.md) - - [Smoke Test](lab12-smoke-test.md) - - [Cleaning Up](lab13-cleanup.md) +- [Prérequis](lab1-prerequisites.md) +- [Mise en Place de Jumpbox](lab2-jumpbox.md) +- [Provisioning Compute Resources](lab3-compute-resources.md) +- [Provisioning the CA and Generating TLS Certificates](lab4-certificate-authority.md) +- [Generating Kubernetes Configuration Files for Authentication](lab5-kubernetes-configuration-files.md) +- [Generating the Data Encryption Config and Key](lab6-data-encryption-keys.md) +- [Bootstrapping the etcd Cluster](lab7-bootstrapping-etcd.md) +- [Bootstrapping the Kubernetes Control Plane](lab8-bootstrapping-kubernetes-controllers.md) +- [Bootstrapping the Kubernetes Worker Nodes](lab9-bootstrapping-kubernetes-workers.md) +- [Configuring kubectl for Remote Access](lab10-configuring-kubectl.md) +- [Provisioning Pod Network Routes](lab11-pod-network-routes.md) +- [Smoke Test](lab12-smoke-test.md) +- [Cleaning Up](lab13-cleanup.md) diff --git a/docs/labs/kubernetes-the-hard-way/lab0-README.it.md b/docs/labs/kubernetes-the-hard-way/lab0-README.it.md index fbb29cc44d..65d4837bc3 100644 --- a/docs/labs/kubernetes-the-hard-way/lab0-README.it.md +++ b/docs/labs/kubernetes-the-hard-way/lab0-README.it.md @@ -32,25 +32,25 @@ Kubernetes The Hard Way vi guiderà nel processo di avvio di un cluster Kubernet Versioni dei componenti: - - [kubernetes](https://github.com/kubernetes/kubernetes) v1.32.x - - [containerd](https://github.com/containerd/containerd) v2.0.x - - [cni](https://github.com/containernetworking/cni) v1.6.x - - [etcd](https://github.com/etcd-io/etcd) v3.4.x +- [kubernetes](https://github.com/kubernetes/kubernetes) v1.32.x +- [containerd](https://github.com/containerd/containerd) v2.0.x +- [cni](https://github.com/containernetworking/cni) v1.6.x +- [etcd](https://github.com/etcd-io/etcd) v3.4.x ## Labs Questo tutorial richiede quattro (4) macchine virtuali o fisiche basate su x86_64 collegate alla stessa rete. Sebbene il tutorial utilizzi macchine basate su x86_64, è possibile applicare le nozioni apprese ad altre piattaforme. - - [Prerequisiti](lab1-prerequisites.md) - - [Configurazione della Jumpbox](lab2-jumpbox.md) - - [Provisioning delle risorse di calcolo](lab3-compute-resources.md) - - [Provisioning della CA e generazione dei certificati TLS](lab4-certificate-authority.md) - - [Generazione dei file di configurazione Kubernetes per l'autenticazione](lab5-kubernetes-configuration-files.md) - - [Generazione della configurazione e della chiave di crittografia dei dati](lab6-data-encryption-keys.md) - - [Avvio del cluster etcd](lab7-bootstrapping-etcd.md) - - [Avvio del Control Plane di Kubernetes](lab8-bootstrapping-kubernetes-controllers.md) - - [Avvio dei nodi Worker di Kubernetes](lab9-bootstrapping-kubernetes-workers.md) - - [Configurazione di kubectl per l'accesso remoto](lab10-configuring-kubectl.md) - - [Provisioning delle rotte di rete dei pod](lab11-pod-network-routes.md) - - [Smoke Test](lab12-smoke-test.md) - - [Cleaning Up](lab13-cleanup.md) +- [Prerequisiti](lab1-prerequisites.md) +- [Configurazione della Jumpbox](lab2-jumpbox.md) +- [Provisioning delle risorse di calcolo](lab3-compute-resources.md) +- [Provisioning della CA e generazione dei certificati TLS](lab4-certificate-authority.md) +- [Generazione dei file di configurazione Kubernetes per l'autenticazione](lab5-kubernetes-configuration-files.md) +- [Generazione della configurazione e della chiave di crittografia dei dati](lab6-data-encryption-keys.md) +- [Avvio del cluster etcd](lab7-bootstrapping-etcd.md) +- [Avvio del Control Plane di Kubernetes](lab8-bootstrapping-kubernetes-controllers.md) +- [Avvio dei nodi Worker di Kubernetes](lab9-bootstrapping-kubernetes-workers.md) +- [Configurazione di kubectl per l'accesso remoto](lab10-configuring-kubectl.md) +- [Provisioning delle rotte di rete dei pod](lab11-pod-network-routes.md) +- [Smoke Test](lab12-smoke-test.md) +- [Cleaning Up](lab13-cleanup.md) diff --git a/docs/labs/kubernetes-the-hard-way/lab0-README.uk.md b/docs/labs/kubernetes-the-hard-way/lab0-README.uk.md index b0bc79b964..a4fa110ca4 100644 --- a/docs/labs/kubernetes-the-hard-way/lab0-README.uk.md +++ b/docs/labs/kubernetes-the-hard-way/lab0-README.uk.md @@ -30,25 +30,25 @@ Kubernetes The Hard Way проведе вас через завантаженн Версії компонентів: - - [kubernetes](https://github.com/kubernetes/kubernetes) v1.32.x - - [containerd](https://github.com/containerd/containerd) v2.0.x - - [cni](https://github.com/containernetworking/cni) v1.6.x - - [etcd](https://github.com/etcd-io/etcd) v3.4.x +- [kubernetes](https://github.com/kubernetes/kubernetes) v1.32.x +- [containerd](https://github.com/containerd/containerd) v2.0.x +- [cni](https://github.com/containernetworking/cni) v1.6.x +- [etcd](https://github.com/etcd-io/etcd) v3.4.x ## Labs Для цього посібника потрібні чотири (4) віртуальні або фізичні машини на базі x86_64, підключені до однієї мережі. Хоча підручник використовує машини на базі x86_64, ви можете застосувати отримані уроки на інших платформах. - - [Вимоги](lab1-prerequisites.md) - - [Налаштування Jumpbox](lab2-jumpbox.md) - - [Надання обчислювальних ресурсів](lab3-compute-resources.md) - - [Надання ЦС і генерація сертифікатів TLS](lab4-certificate-authority.md) - - [Створення файлів конфігурації Kubernetes для автентифікації](lab5-kubernetes-configuration-files.md) - - [Створення конфігурації та ключа шифрування даних](lab6-data-encryption-keys.md) - - [Завантаження кластера etcd](lab7-bootstrapping-etcd.md) - - [Завантаження площини керування Kubernetes](lab8-bootstrapping-kubernetes-controllers.md) - - [Завантаження робочих вузлів Kubernetes](lab9-bootstrapping-kubernetes-workers.md) - - [Налаштування kubectl для віддаленого доступу](lab10-configuring-kubectl.md) - - [Надання мережевих маршрутів Pod](lab11-pod-network-routes.md) - - [Smoke Test](lab12-smoke-test.md) - - [Очищення](lab13-cleanup.md) +- [Вимоги](lab1-prerequisites.md) +- [Налаштування Jumpbox](lab2-jumpbox.md) +- [Надання обчислювальних ресурсів](lab3-compute-resources.md) +- [Надання ЦС і генерація сертифікатів TLS](lab4-certificate-authority.md) +- [Створення файлів конфігурації Kubernetes для автентифікації](lab5-kubernetes-configuration-files.md) +- [Створення конфігурації та ключа шифрування даних](lab6-data-encryption-keys.md) +- [Завантаження кластера etcd](lab7-bootstrapping-etcd.md) +- [Завантаження площини керування Kubernetes](lab8-bootstrapping-kubernetes-controllers.md) +- [Завантаження робочих вузлів Kubernetes](lab9-bootstrapping-kubernetes-workers.md) +- [Налаштування kubectl для віддаленого доступу](lab10-configuring-kubectl.md) +- [Надання мережевих маршрутів Pod](lab11-pod-network-routes.md) +- [Smoke Test](lab12-smoke-test.md) +- [Очищення](lab13-cleanup.md) diff --git a/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.it.md b/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.it.md index 7ad0f9e6ce..c1ad98d6f4 100644 --- a/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.it.md +++ b/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.it.md @@ -475,7 +475,7 @@ I seguenti passaggi mostrano come utilizzare `ps` per visualizzare le informazio OUTPUT: ```bash - (process ID) old priority 0, new priority -10 + (process ID) old priority 0, new priority -10 ``` Sostituire `` (sopra) con il PID effettivo del processo in esecuzione. diff --git a/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.uk.md b/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.uk.md index 4402ab40c1..bddcf986e0 100644 --- a/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.uk.md +++ b/docs/labs/systems_administration_I/lab8-system_and_process_monitoring-I.uk.md @@ -475,7 +475,7 @@ tags: Вихід: ```bash - (process ID) old priority 0, new priority -10 + (process ID) old priority 0, new priority -10 ``` Замініть "" (вище) фактичним PID запущеного процесу. diff --git a/docs/release_notes/9_5.fr.md b/docs/release_notes/9_5.fr.md index a2b5fac161..ce11a82d23 100644 --- a/docs/release_notes/9_5.fr.md +++ b/docs/release_notes/9_5.fr.md @@ -135,4 +135,4 @@ Certains flux d'applications, qui font partie des dépôts Rocky Linux 9.5, ne r ## Signalement de Bugs -Merci de signaler tous les problèmes que vous rencontrez sur le [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Nous vous invitons également à rejoindre notre communauté de quelque manière que ce soit, que ce soit sur nos [Forums](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC on Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailing Lists](https://lists.resf.org), ou de toute autre manière que vous souhaiteriez utiliser ! +Veuillez signaler tout bug que vous rencontrez sur le site [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Nous vous invitons également à rejoindre notre communauté de quelque manière que ce soit, que ce soit sur nos [Forums](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC on Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailing Lists](https://lists.resf.org) ou de toute autre manière que vous souhaiteriez utiliser ! diff --git a/docs/rocky_insights/blogs/index.de.md b/docs/rocky_insights/blogs/index.de.md index d8303669b0..d266efdd63 100644 --- a/docs/rocky_insights/blogs/index.de.md +++ b/docs/rocky_insights/blogs/index.de.md @@ -20,9 +20,9 @@ Wenn Sie über keine GitHub-Zugangsdaten verfügen und trotzdem etwas für diese Sie sollten sicherstellen, dass Ihr Dokument die Anforderungen für diesen Abschnitt erfüllt. Zum Beispiel: - - Passt das hierher? Sind es Informationen, die es wert sind, geteilt zu werden? Ist es ein Dokument im Blog-Stil? - - Geht es auf ein für technische Autoren wichtiges Thema ein? - - Wird die Einreichung die Qualität der Rocky Linux-Dokumentation im ganzen verbessern? +- Passt das hierher? Sind es Informationen, die es wert sind, geteilt zu werden? Ist es ein Dokument im Blog-Stil? +- Geht es auf ein für technische Autoren wichtiges Thema ein? +- Wird die Einreichung die Qualität der Rocky Linux-Dokumentation im ganzen verbessern? ## Welche Art von Information? diff --git a/docs/rocky_insights/blogs/index.fr.md b/docs/rocky_insights/blogs/index.fr.md index 6c086fa44d..e3e8d48eb3 100644 --- a/docs/rocky_insights/blogs/index.fr.md +++ b/docs/rocky_insights/blogs/index.fr.md @@ -20,9 +20,9 @@ Si vous n'avez pas d'identifiants GitHub et que vous souhaitez quand même écri Vous devez vous assurer que votre document répond aux exigences de cette section. Par exemple : - - Est-ce que ça convient ici ? Est-ce que cette information mérite d’être partagée ? S'agit-il d'un document de type blog ? - - Est-ce que cela traite d'un sujet important pour les documentaristes ? - - La publication améliorera-t-elle la qualité globale de toute la documentation de Rocky Linux ? +- Est-ce que ça convient ici ? Est-ce que cette information mérite d’être partagée ? S'agit-il d'un document de type blog ? +- Est-ce que cela traite d'un sujet important pour les documentaristes ? +- La publication améliorera-t-elle la qualité globale de toute la documentation de Rocky Linux ? ## Quel genre d'informations ? diff --git a/docs/rocky_insights/blogs/index.it.md b/docs/rocky_insights/blogs/index.it.md index c90b5780f1..1569c6304f 100644 --- a/docs/rocky_insights/blogs/index.it.md +++ b/docs/rocky_insights/blogs/index.it.md @@ -20,9 +20,9 @@ Se non si ha le credenziali GitHub e si vuole comunque scrivere qualcosa per que Dovete assicurarvi che il vostro documento soddisfi i requisiti di questa sezione. Per esempio: - - E' adatta qui? Sono informazioni che vale la pena condividere? È un documento in stile blog? - - Approfondisce un tema importante per i documentaristi? - - La comunicazione migliorerà la qualità complessiva di tutta la documentazione di Rocky Linux? +- E' adatta qui? Sono informazioni che vale la pena condividere? È un documento in stile blog? +- Approfondisce un tema importante per i documentaristi? +- La comunicazione migliorerà la qualità complessiva di tutta la documentazione di Rocky Linux? ## Che tipo di informazione? diff --git a/docs/rocky_insights/blogs/index.uk.md b/docs/rocky_insights/blogs/index.uk.md index 96adcd775a..0bb418b1a0 100644 --- a/docs/rocky_insights/blogs/index.uk.md +++ b/docs/rocky_insights/blogs/index.uk.md @@ -20,9 +20,9 @@ contributors: Ви повинні переконатися, що ваш документ відповідає вимогам цього розділу. Наприклад: - - Це підходить сюди? Чи варто ділитися цією інформацією? Це документ у стилі блогу? - - Чи розкриває він тему, важливу для документалістів? - - Чи підвищить подання загальну якість документації Rocky Linux? +- Це підходить сюди? Чи варто ділитися цією інформацією? Це документ у стилі блогу? +- Чи розкриває він тему, важливу для документалістів? +- Чи підвищить подання загальну якість документації Rocky Linux? ## Яка інформація? diff --git a/docs/rocky_insights/blogs/index.zh.md b/docs/rocky_insights/blogs/index.zh.md index 284bfe54a7..91d14e729a 100644 --- a/docs/rocky_insights/blogs/index.zh.md +++ b/docs/rocky_insights/blogs/index.zh.md @@ -20,9 +20,9 @@ contributors: 您应该确保您的文档符合本章节的要求。 例如: - - 它适合这里吗? 它是值得共享的信息吗? 它是博客风格的文档吗? - - 它是否扩展了对文档作者很重要的主题? - - 这次提交会提高所有 Rocky Linux 文档的整体质量吗? +- 它适合这里吗? 它是值得共享的信息吗? 它是博客风格的文档吗? +- 它是否扩展了对文档作者很重要的主题? +- 这次提交会提高所有 Rocky Linux 文档的整体质量吗? ## 什么样的信息? From 19d0f73e3b0f780acf19b8837c304cc73c9548ed Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Tue, 9 Sep 2025 09:43:39 -0400 Subject: [PATCH 134/164] New Crowdin updates (#2869) * New translations migrate2rocky.md (French) * New translations https_rsa_keygen.md (German) * New translations dnf-swap.md (French) * New translations dnf-swap.md (German) * New translations minimum_hardware_requirements.md (French) * New translations minimum_hardware_requirements.md (German) * New translations lab8-bootstrapping-kubernetes-controllers.md (German) * New translations lab4-certificate-authority.md (German) * New translations 8-changelog.md (German) * New translations 8_10.md (French) * New translations 10_0.md (German) * New translations 00-toc.md (German) * New translations 05-vi.md (German) * New translations 01-presentation.md (German) * New translations lab11-pod-network-routes.md (German) --- docs/books/admin_guide/00-toc.de.md | 2 +- docs/books/admin_guide/01-presentation.de.md | 8 +- docs/books/admin_guide/05-vi.de.md | 6 +- docs/gemstones/dnf-swap.de.md | 2 +- docs/gemstones/dnf-swap.fr.md | 2 +- docs/gemstones/https_rsa_keygen.de.md | 45 +++++ docs/guides/migrate2rocky.fr.md | 2 +- .../minimum_hardware_requirements.de.md | 130 ++++++++++++ .../minimum_hardware_requirements.fr.md | 128 ++++++++++++ .../lab11-pod-network-routes.de.md | 94 +++++++++ .../lab4-certificate-authority.de.md | 133 +++++++++++++ ...bootstrapping-kubernetes-controllers.de.md | 188 ++++++++++++++++++ docs/release_notes/10_0.de.md | 4 +- docs/release_notes/8-changelog.de.md | 2 +- docs/release_notes/8_10.fr.md | 22 +- 15 files changed, 743 insertions(+), 25 deletions(-) create mode 100644 docs/gemstones/https_rsa_keygen.de.md create mode 100644 docs/guides/minimum_hardware_requirements.de.md create mode 100644 docs/guides/minimum_hardware_requirements.fr.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab11-pod-network-routes.de.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab4-certificate-authority.de.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab8-bootstrapping-kubernetes-controllers.de.md diff --git a/docs/books/admin_guide/00-toc.de.md b/docs/books/admin_guide/00-toc.de.md index 84fa40a831..ff33d025c4 100644 --- a/docs/books/admin_guide/00-toc.de.md +++ b/docs/books/admin_guide/00-toc.de.md @@ -12,7 +12,7 @@ Zunächst werden wir GNU/Linux, Distributionen und das gesamte Ökosystem rund u Wir werden uns dann die Benutzerbefehle ansehen, die für den Einstieg in GNU/Linux unerlässlich sind. Erfahrene Benutzer sollten das Kapitel über erweiterte Befehle besuchen. -Im nächsten Kapitel wird der VI-Editor behandelt. Während GNU/Linux mit vielen Editoren geliefert wird, ist der vi einer der leistungsstärksten. Einige Befehle verwenden manchmal eine identische Syntax wie der vi (`sed` sei erwähnt). Daher ist es sinnvoll, einiges über vi zu wissen oder zumindest seine wesentlichen Funktionen kennen zu lernen (wie man eine Datei öffnet, speichert, vi beendet oder ohne Speichern beendet). Bei regelmäßiger Verwendung von vi, kann sich der Benutzer nach und nach mit weiterenen Funktionen vertraut machen. Eine Alternative wäre die Verwendung von nano, das standardmäßig mit Rocky Linux installiert wird. Obwohl es nicht so vielseitig ist, ist es einfach zu bedienen, unkompliziert und erledigt die Arbeit. +Im nächsten Kapitel wird der VI-Editor behandelt. Während GNU/Linux mit vielen Editoren geliefert wird, ist der vi einer der leistungsstärksten. Einige Befehle verwenden manchmal eine identische Syntax wie der vi (`sed` sei erwähnt). Daher ist es sinnvoll, einiges über vi zu wissen oder zumindest seine wesentlichen Funktionen kennen zu lernen (wie man eine Datei öffnet, speichert, vi beendet oder ohne Speichern beendet). Bei regelmäßiger Verwendung von `vi`, kann sich der Benutzer nach und nach mit weiteren Funktionen vertraut machen. Eine Alternative wäre die Verwendung von nano, das standardmäßig mit Rocky Linux installiert wird. Obwohl es nicht so vielseitig ist, ist es einfach zu bedienen, unkompliziert und erledigt die Arbeit. Wir können dann tiefer in die Funktionsweise von Linux einsteigen: diff --git a/docs/books/admin_guide/01-presentation.de.md b/docs/books/admin_guide/01-presentation.de.md index daaeb93952..901503b172 100644 --- a/docs/books/admin_guide/01-presentation.de.md +++ b/docs/books/admin_guide/01-presentation.de.md @@ -6,7 +6,7 @@ title: Einführung in GNU/Linux # Einführung in GNU/Linux -In diesem Kapitel werden GNU/Linux Distributionen behandelt. +In diesem Kapitel erfahren Sie mehr über GNU/Linux-Distributionen. **** @@ -63,11 +63,11 @@ Als Teil dieser Ressourcenverwaltung muss das Betriebssystem Folgendes tun: * **1969 – 1971**: Nach dem Rückzug von Bell (1969) und dann von General Electric aus dem Projekt wurden zwei Entwickler, Ken Thompson und Dennis Ritchie (zu denen später Brian Kernighan hinzukam), die MULTICS für zu komplex hielten, mit der Entwicklung von UNIX (UNiplexed Information and Computing Service) betraut. Ursprünglich im Assembler implementiert, entwickelten die Designer von UNIX die B-Sprache und dann die C-Sprache (1971) und schrieben UNIX. Seit 1970 ist das Referenzdatum (epoch) der UNIX/Linux-Systeme noch am 01. Januar 1970 festgelegt. -Die Programmiersprache C ist noch heute eine der beliebtesten Programmiersprachen. Eine Hardware-nahe Sprache, sie ermöglicht die Anpassung des Betriebssystems an jede Maschinenarchitektur. +C ist auch heute noch eine der beliebtesten Programmiersprachen. Eine Hardware-nahe Sprache, sie ermöglicht die Anpassung des Betriebssystems an jede Maschinenarchitektur. -UNIX ist ein offenes und sich entwickelndes Betriebssystem, das eine wichtige Rolle in der Geschichte der Informatik gespielt hat. Es war die Basis für viele andere Systeme: GNU/Linux, BSD, macOS, etc. +UNIX ist ein offenes und sich entwickelndes Betriebssystem, das eine wichtige Rolle in der Geschichte der Informatik gespielt hat. Es bildet die Grundlage für viele andere Systeme wie GNU/Linux, BSD, macOS usw. -UNIX ist noch heute relevant (HP-UX, AIX, Solaris, etc.) +UNIX ist auch heute noch relevant (HP-UX, AIX, Solaris usw.). #### GNU Projekt diff --git a/docs/books/admin_guide/05-vi.de.md b/docs/books/admin_guide/05-vi.de.md index 9c23c379e7..18a96de022 100644 --- a/docs/books/admin_guide/05-vi.de.md +++ b/docs/books/admin_guide/05-vi.de.md @@ -1,5 +1,5 @@ --- -title: VI-Texteditor +title: VI — Texteditor --- # VI-Texteditor @@ -78,7 +78,7 @@ Beim Start ist VI im *Kommandos*-Modus. Drücken Sie das Zeichen ++colon++ aus dem Befehlsmodus um VI zu beenden und geben Sie dann Folgendes ein: -* `q` (beenden ohne zu speichern _quit_); +* `q` beenden ohne zu speichern (*quit*); * `w` um Ihre Arbeit zu speichern (_write_); * `wq` (_write quit_) oder `x` (_eXit_) zum Speichern und Beenden. @@ -375,7 +375,7 @@ Der *Ex*-Modus erlaubt es Ihnen, auf die Datei zu agieren (Speichern, Layout, Op Um zum *Ex*-Modus zu wechseln, geben Sie im *Befehls*-Modus das Zeichen ++colon++ ein. -### Nummerierung der Zeilen +### Zeilennummerierung * Nummerierung der Zeilen ein-/ausblenden: diff --git a/docs/gemstones/dnf-swap.de.md b/docs/gemstones/dnf-swap.de.md index 372ca2bb9b..6ade3016a0 100644 --- a/docs/gemstones/dnf-swap.de.md +++ b/docs/gemstones/dnf-swap.de.md @@ -1,5 +1,5 @@ - - - -title: title: DNF — swap-Befehl
    author: wale soyinka
    contributors: https://crowdin.com/project/rockydocs/activity-stream
    date: 2025-08-30
    tags: +title: DNF — swap-Befehl
    author: wale soyinka
    contributors: https://crowdin.com/project/rockydocs/activity-stream
    date: 2025-09-05 19h22
    tags: - cloud images - container - dnf diff --git a/docs/gemstones/dnf-swap.fr.md b/docs/gemstones/dnf-swap.fr.md index cf77e04bdf..a215a1bb18 100644 --- a/docs/gemstones/dnf-swap.fr.md +++ b/docs/gemstones/dnf-swap.fr.md @@ -1,5 +1,5 @@ - - - ---- title: dnf - swap command author: wale soyinka contributors: https://crowdin.com/project/rockydocs/activity-stream date: 2025-08-30 13h12 tags: dnf --- +title: dnf — swap command
    author: wale soyinka
    translators: [https://crowdin.com/project/rockydocs](https://crowdin.com/project/rockydocs/activity-stream)
    date: 2025-09-05 19h49
    tags:
    - cloud images - conteneurs - dnf diff --git a/docs/gemstones/https_rsa_keygen.de.md b/docs/gemstones/https_rsa_keygen.de.md new file mode 100644 index 0000000000..cf9d8c24d9 --- /dev/null +++ b/docs/gemstones/https_rsa_keygen.de.md @@ -0,0 +1,45 @@ +--- +title: https — RSA-Schlüssel Generierung +author: Steven Spencer +update: 2022-01-26 +--- + +# https - RSA-Schlüssel Generierung + +Dieses Skript wurde mehrfach von uns verwendet. Unabhängig davon, wie oft Sie die OpenSSL-Befehlsstruktur verwenden, müssen Sie manchmal auf das Verfahren zurückgreifen. Dieses Skript hilft Ihnen, die Schlüsselgenerierung für eine Website mithilfe von RSA zu automatisieren. Beachten Sie, dass dieses Skript mit einer Schlüssellänge von 2048 Bits hart-kodiert ist. Wer der Meinung ist, dass die Mindestschlüssellänge 4096 Bit betragen sollte, ändert einfach das entsprechende Teil des Skripts. Denken Sie nur daran, dass Sie den Speicher und die Geschwindigkeit beim Laden einer Website auf einem Gerät gegen die Sicherheit einer längeren Schlüssellänge abwägen müssen. + +## Das Skript + +Geben Sie diesem Skript einen beliebigen Namen, z.B. `keygen.sh`, machen Sie das Skript ausführbar (`chmod +x scriptname`) und platzieren Sie es in einem Verzeichnis, das sich in Ihrem Pfad befindet, z.B. /usr/local/sbin + +```bash +#!/bin/bash +if [ $1 ] +then + echo "generating 2048 bit key - you'll need to enter a pass phrase and verify it" + openssl genrsa -des3 -out $1.key.pass 2048 + echo "now we will create a pass-phrase less key for actual use, but you will need to enter your pass phrase a third time" + openssl rsa -in $1.key.pass -out $1.key + echo "next, we will generate the csr" + openssl req -new -key $1.key -out $1.csr + #cleanup + rm -f $1.key.pass +else + echo "requires keyname parameter" + exit +fi +``` + +!!! note "Anmerkung" + + Sie werden die Passphrase dreimal nacheinander eingeben müssen. + +## Kurze Beschreibung + +* Dieses Bash-Skript setzt voraus, dass ein Parameter ($1) eingegeben wird, der der Name der Site ohne www, etc. entspricht. Zum Beispiel "mywidget". +* Das Skript erstellt den Standardschlüssel mit einem Passwort und einer Länge von 2048 Bit (die, wie oben angegeben, auf eine Länge von 4096 Bit geändert werden kann) +* Das Passwort wird sofort aus dem Schlüssel entfernt, denn bei einem Neustart des Webservers das Passwort jedes Mal neu eingegeben werden müsste, was in der Praxis problematisch sein kann. +* Anschließend erstellt das Skript den `CSR` (Certificate Signing Request), mit dem dann ein SSL-Zertifikat bei einem Anbieter erworben werden kann. +* Schließlich entfernt der Bereinigungsschritt den zuvor erstellten Schlüssel mit dem angefügten Passwort. +* Die Eingabe des Skriptnamens ohne Parameter erzeugt den Fehler: "requires keyname parameter". +* Hier wird die Positionsparameter-Variable $n verwendet. Während $0 das Kommando selbst enthält, repräsentieren $1 bis $9 die ersten bis neunten Parameter. Wenn die Anzahl Parameter größer als 10 ist, müssen Sie Klammern wie `${10}` verwenden. diff --git a/docs/guides/migrate2rocky.fr.md b/docs/guides/migrate2rocky.fr.md index 1b4d050715..a3b7107ec5 100644 --- a/docs/guides/migrate2rocky.fr.md +++ b/docs/guides/migrate2rocky.fr.md @@ -9,7 +9,7 @@ update: 2023-05-19 ## Prérequis -- CentOS Stream, CentOS, Alma Linux, RHEL ou Oracle Linux fonctionnant correctement sur un serveur physique ou virtuel (VPS). Par opposition à CentOS-Stream, CentOS-Linux ne sera sera disponible que jusqu'à la version 8.5. La version actuellement prise en charge pour les autres systèmes est la **8.10** respectivement **9.4**. +- CentOS Stream, CentOS, Alma Linux, RHEL ou Oracle Linux fonctionnant correctement sur un serveur physique ou virtuel (VPS) ; Par opposition à CentOS-Stream, CentOS-Linux ne sera sera disponible que jusqu'à la version 8.5. La version actuellement prise en charge pour les autres systèmes est la **8.10** respectivement **9.6**. La version 10 n'est pas encore prise en charge. - Une bonne connaissance de la ligne de commande - Être à l'aise avec l'usage de SSH dans le cas de machines distantes  - Une capacité à accepter les risques. diff --git a/docs/guides/minimum_hardware_requirements.de.md b/docs/guides/minimum_hardware_requirements.de.md new file mode 100644 index 0000000000..f7ffa37030 --- /dev/null +++ b/docs/guides/minimum_hardware_requirements.de.md @@ -0,0 +1,130 @@ +RL 10 (Red Quarz) — +Mindest-Hardware-Anforderungen +============================== + +Rocky Linux 10 ist auf Stabilität auf Unternehmensniveau mit moderner Hardwarekompatibilität ausgelegt. Diese Mindestspezifikationen gelten für **minimale Serverinstallationen**. Für GUI- oder Produktionsumgebungen werden höhere Spezifikationen empfohlen. + +--- + +## ✅ Supported CPU Architekturen + +Laut den Versionshinweisen zu Rocky Linux 10.0 unterstützt RL10 offiziell die folgenden Architekturen: + +- **x86_64-v3** (Intel/AMD 64-Bit-CPUs mit mindestens Haswell oder gleichwertiger AVX-Unterstützung) +- **aarch64** (ARMv8-A 64-bit) +- **ppc64le** (IBM Power, Little Endian) +- **s390x** (IBM Z Mainframes) +- **riscv64** (RISC‑V 64-bit) + +### ⚠️ CPU Voraussetzungen + +- **x86_64-v3** erfordert AVX, AVX2, BMI1/2 und FMA, entsprechend Intel Haswell oder höher oder AMD Excavator oder neuer. +- Ältere x86_64-Revisionen (v1/v2) werden **nicht unterstützt**, sofern sie nicht von Community-SIGs neu erstellt werden. + +--- + +## 🧠 CPU (Prozessor) + +- **1 GHz 64-Bit (x86_64‑v3)** oder gleichwertig für andere Architekturen +- Für den Einsatz auf Servern, Desktops oder in der Virtualisierung werden Multi-Core-CPUs empfohlen + +--- + +## 💾 Memory (RAM) + +- **2 GB** mindestens (Installation im Textmodus ohne GUI) +- **4 GB+** empfohlen für GUI-Installationen +- **4–8 GB+** für Produktions-Workloads oder Virtualisierung + +--- + +## 💽 Speicher + +- **10 GB** Mindestspeicherplatz +- **20 GB+** empfohlen, um Updates, Protokolle und Anwendungen unterzubringen +- Für GUI: **40 GB+**, um ausreichend Speicherplatz sicherzustellen + +--- + +## 🌐 Netzwerk + +- Mindestens ein funktionsfähiger Ethernet- oder WLAN-Netzwerkadapter +- Unterstützt DHCP oder statische IP-Konfiguration über NetworkManager + +--- + +## 🖥️ Display (für Installationen mit GUI) + +- Mindestauflösung **1024×768** über VGA, HDMI oder DisplayPort +- Für minimale Serverinstallationen nicht erforderlich + +--- + +## 📀 Media Access + +- USB-Anschluss (für Live-USB-Installer) oder DVD-ROM-Laufwerk +- Cloud-Installationen unterstützen ISO- oder PXE-basierte Installationen + +--- + +## 🔒 Firmware + +- UEFI- oder BIOS-Booten wird unterstützt; **UEFI empfohlen** +- Secure Boot wird unterstützt (erfordert möglicherweise eine manuelle Schlüsselregistrierung) + +--- + +## 🗃️ Virtualisierung–Support + +- Virtuelle Umgebungen (KVM, VMware, VirtualBox, Hyper-V) werden unterstützt +- Guest-Tools (z. B. Open-VM-Tools, QEMU-Guest-Agent) werden für eine optimierte Leistung empfohlen + +--- + +## 📝 Zusammenfassung + +| Komponente | Mindestanforderungen | +| ---------------- | ------------------------------------------------------------------------------------------------------------------- | +| **CPU** | 1 GHz 64-Bit (AVX-fähig x86_64-v3) oder gleichwertig für ARM/POWER/Z/RISC-V | +| **RAM** | 1 GB (2 GB mit GUI) | +| **Disk Space** | 10 GB (20 GB+ empfohlen; 40 GB+ für GUI) | +| **Netzwerk** | Ethernet- oder Wireless-Adapter | +| **Display** | 1024×768-fähig (nur für GUI) | +| **Media Access** | USB oder DVD-ROM | +| **Firmware** | UEFI/BIOS (UEFI empfohlen); Secure Boot optional | + +--- + +## 🎯 Empfohlene Spezifikationen nach Anwendungsfall + +### 🏗️ Minimal Server + +- CPU: 1 Kern x86_64-v3 (oder ARM/POWER/Z/RISC‑V) +- RAM: 1 GB +- Speicher: 10–20 GB + +### 🖥️ Desktop mit GUI + +- CPU: 2+ Kerne x86_64-v3 (oder gleichwertig) +- RAM: 2–4 GB +- Speicher: 20–40 GB + +### 🛠️ Entwicklung–/Produktions–Server + +- CPU: 4+ cores +- RAM: 4–8 GB+ +- Speicher: 40 GB+ (je nach Arbeitslastbedarf) + +--- + +## 🧩 Zusätzliche Anmerkungen + +- Weisen Sie Protokollen, Paketaktualisierungen und Sicherungen immer zusätzlichen Speicherplatz zu. +- Wählen Sie für die Cloud oder Virtualisierung Instanz-Typen, die die oben genannten Spezifikationen erfüllen oder übertreffen. +- Upgrades von früheren Rocky-Versionen (z. B. 8 oder 9) auf Rocky 10 werden nicht unterstützt – **Neuinstallation erforderlich**. + +--- + +**Update**: 2025-06-30\ +**Betrifft**: Rocky Linux 10 Release Initial +**Übersetzung**: 2025-09-04 20h25 diff --git a/docs/guides/minimum_hardware_requirements.fr.md b/docs/guides/minimum_hardware_requirements.fr.md new file mode 100644 index 0000000000..e06580e5d6 --- /dev/null +++ b/docs/guides/minimum_hardware_requirements.fr.md @@ -0,0 +1,128 @@ +# RL10 (Red Quartz) — Configuration Minimum + +Rocky Linux 10 est conçu pour une stabilité de niveau entreprise et une compatibilité avec du matériel moderne. Ces spécifications minimum s'appliquent aux **installations minimales de serveur**. Pour les environnements d'interface utilisateur graphique ou de production, des spécifications plus élevées sont recommandées. + +--- + +## Architectures Prises en Charge + +Selon les notes de publication officielles de Rocky Linux 10.0, RL10 prend en charge les architectures suivantes : + +- **x86_64-v3** (processeurs Intel/AMD 64 bits avec au moins la prise en charge Haswell ou équivalente d'AVX) +- **aarch64** (ARMv8-A 64-bit) +- **ppc64le** (IBM Power, Little Endian) +- **s390x** (IBM Z mainframes) +- **riscv64** (RISC‑V 64-bit) + +### ⚠️ Exigences relatives aux fonctionnalités du processeur + +- **x86_64-v3** nécessite AVX, AVX2, BMI1/2 et FMA, correspondant à Intel Haswell ou version ultérieure, ou AMD Excavator ou plus récent. +- Les anciennes révisions x86_64 (v1/v2) ne sont **pas prises en charge**, à moins qu'elles ne soient reconstruites par les SIG de la communauté. + +--- + +## 🧠 CPU (Processeur) + +- **1 GHz 64 bits (x86_64‑v3)** ou équivalent pour d'autres architectures +- Les processeurs multicœurs sont recommandés pour une utilisation sur serveur, sur desktop ou en virtualisation + +--- + +## 💾 Mémoire (RAM) + +- **2 Go** minimum (installation en mode texte, sans GUI) +- **4 Go+** recommandé pour les installations d'interface graphique +- **4–8 Go+** pour les charges de travail de production ou la virtualisation + +--- + +## 💽 Stockage + +- **10 Go** d'espace disque minimum +- **20 Go+** recommandés pour héberger les mises à jour, les journaux et les applications +- Pour l'interface graphique : **40 Go+** pour garantir un espace suffisant + +--- + +## 🌐 Réseau + +- Au moins un adaptateur réseau Ethernet ou sans fil fonctionnel +- Prend en charge la configuration DHCP ou IP statique par l'intermédiaire de NetworkManager + +--- + +## 🖥️ Affichage (pour les installations avec GUI) + +- Résolution minimale **1024×768** via VGA, HDMI ou DisplayPort +- Non requis pour les installations de serveur minimales + +--- + +## 📀 Accès aux Médias + +- Port USB (pour l'installateur USB en direct) ou lecteur de DVD-ROM +- Les installations infonuagiques prennent en charge les installations ISO ou PXE + +--- + +## 🔒 Firmware + +- Le démarrage UEFI ou BIOS est pris en charge ; **UEFI est recommandé** +- Démarrage sécurisé pris en charge (peut nécessiter une inscription manuelle de la clé) + +--- + +## 🗃️ Support de Virtualisation + +- Prise en charge d'environnements virtuels (KVM, VMware, VirtualBox, Hyper-V) +- Outils supplémentaires `guest` (par exemple, open-vm-tools, qemu-guest-agent) recommandés pour des performances optimisées + +--- + +## 📝 Tableau Récapitulatif + +| Composant | Exigences Minimales | +| ----------------- | ------------------------------------------------------------------------------------------------------------------ | +| **CPU** | 1 GHz 64-bit (AVX-capable x86_64-v3) ou équivalent pour ARM/POWER/Z/RISC-V | +| **RAM** | 1 Go (2 Go pour le GUI) | +| **Espace Disque** | 10 Go (20 Go+ recommandés ; 40 Go+ pour l'interface graphique) | +| **Réseau** | Adaptateur Ethernet ou sans fil | +| **Écran** | Compatible 1024×768 (seulement pour l'interface graphique) | +| **Media Access** | USB ou DVD-ROM | +| **Firmware** | UEFI/BIOS (UEFI recommandé) ; démarrage sécurisé en option | + +--- + +## 🎯 Spécifications recommandées par cas d'utilisation + +### 🏗️ Serveur Minimal + +- CPU : 1 core x86_64-v3 (ou ARM/POWER/Z/RISC‑V) +- RAM : 1 Go +- Stockage : 10–20 Go + +### 🖥️ Desktop avec GUI + +- CPU : 2 cœurs ou plus x86_64-v3 (ou équivalent) +- RAM : 2–4 Go +- Stockage : 20–40 Go + +### 🛠️ Serveur de Développement ou Production + +- CPU : 4+ cœurs +- RAM : 4–8 Go + +- Stockage : 40 Go ou plus (selon les besoins de la charge de travail) + +--- + +## 🧩 Notes Supplémentaires + +- Always allocate extra storage for logs, package updates, and backups. +- Pour l'infonuagique ou la virtualisation, choisissez des types d'instances qui répondent ou dépassent les spécifications ci-dessus. +- Les mises à niveau des versions antérieures de Rocky (par exemple, 8 ou 9) vers Rocky 10 ne sont pas prises en charge — **une nouvelle installation est requise**. + +--- + +**Mise à Jour**: 2025-06-30\ +**Concerne**: Rocky Linux 10 Release Initial +**Traductions**: 2025-09-04 20h15 diff --git a/docs/labs/kubernetes-the-hard-way/lab11-pod-network-routes.de.md b/docs/labs/kubernetes-the-hard-way/lab11-pod-network-routes.de.md new file mode 100644 index 0000000000..c8d6b42ce6 --- /dev/null +++ b/docs/labs/kubernetes-the-hard-way/lab11-pod-network-routes.de.md @@ -0,0 +1,94 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +tags: + - kubernetes + - k8s + - Laborübung + - runc + - containerd + - etcd + - kubectl +--- + +# Übung 11: Bereitstellung von Pod-Netzwerkrouten + +!!! info + + Dies ist ein Fork des ursprünglichen ["Kubernetes the hard way"](https://github.com/kelseyhightower/kubernetes-the-hard-way), das ursprünglich von Kelsey Hightower geschrieben wurde (GitHub: kelseyhightower). Im Gegensatz zum Original, das auf Debian-ähnlichen Distributionen für die ARM64-Architektur basiert, zielt dieser Fork auf Enterprise-Linux-Distributionen wie Rocky Linux ab, das auf der x86_64-Architektur läuft. + +Für einen Knoten geplante Pods erhalten eine IP-Adresse aus dem Pod-CIDR-Bereich des Knotens. Derzeit können Pods aufgrund fehlender [Netzwerkrouten] (https://cloud.google.com/compute/docs/vpc/routes) nicht mit anderen Pods kommunizieren, die auf anderen Knoten ausgeführt werden. + +In diesem Labor erstellen Sie für jeden Worker-Knoten eine Route, die den Pod-CIDR-Bereich des Knotens der internen IP-Adresse des Knotens zuordnet. + +> Es gibt auch [andere Möglichkeiten](https://kubernetes.io/docs/concepts/cluster-administration/networking/#how-to-achieve-this), das Kubernetes-Netzwerkmodell zu implementieren. + +## Routing-Tabelle + +In diesem Abschnitt sammeln Sie die erforderlichen Informationen zum Erstellen von Routen im VPC-Netzwerk `kubernetes-the-hard-way`. + +Drucken Sie die interne IP-Adresse und den Pod-CIDR-Bereich für jede Worker-Instanz: + +```bash +{ + SERVER_IP=$(grep server machines.txt | cut -d " " -f 1) + NODE_0_IP=$(grep node-0 machines.txt | cut -d " " -f 1) + NODE_0_SUBNET=$(grep node-0 machines.txt | cut -d " " -f 5) + NODE_1_IP=$(grep node-1 machines.txt | cut -d " " -f 1) + NODE_1_SUBNET=$(grep node-1 machines.txt | cut -d " " -f 5) +} +``` + +```bash +ssh root@server < Warten Sie bis zu 10 Sekunden, bis der Kubernetes-API-Server vollständig initialisiert ist. + +### Verifizierung + +```bash +kubectl cluster-info --kubeconfig admin.kubeconfig +``` + +```text +Die Kubernetes-Steuerebene läuft unter https://127.0.0.1:6443 +``` + +## RBAC für die Kubelet-Autorisierung + +In diesem Abschnitt konfigurieren Sie `RBAC`-Berechtigungen, um dem `Kubernetes`-API-Server den Zugriff auf die `Kubelet`-API auf jedem Worker-Knoten zu ermöglichen. Zum Abrufen von Metriken und Protokollen sowie zum Ausführen von Befehlen in `Pods` ist Zugriff auf die `Kubelet`-API erforderlich. + +> Dieses Tutorial setzt das Kubelet-Flag `--authorization-mode` auf `Webhook`. Der Webhook\`-Modus verwendet die API [SubjectAccessReview](https://kubernetes.io/docs/reference/kubernetes-api/authorization-resources/subject-access-review-v1/), um die Autorisierung zu bestimmen. + +Führen Sie die Befehle in diesem Abschnitt auf dem Controller-Knoten aus, was sich auf den gesamten Cluster auswirkt. + +```bash +ssh root@server +``` + +Erstellen Sie die Clusterrolle `system:kube-apiserver-to-kubelet` [ClusterRole](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#role-and-clusterrole) mit Berechtigungen für den Zugriff auf die Kubelet-API und führen Sie die gängigsten Aufgaben im Zusammenhang mit der Verwaltung von Pods aus: + +```bash +kubectl apply -f kube-apiserver-to-kubelet.yaml \ + --kubeconfig admin.kubeconfig +``` + +### Verifizierung von `RBAC` + +Zu diesem Zeitpunkt ist die Kubernetes-Steuerebene betriebsbereit. Führen Sie die folgenden Befehle von der `jumpbox`-Maschine aus, um zu überprüfen, ob sie funktioniert: + +Stellen Sie eine HTTP-Anfrage für die Kubernetes-Versionsinformationen: + +```bash +curl -k --cacert ca.crt https://server.kubernetes.local:6443/version +``` + +```text +{ + "major": "1", + "minor": "32", + "gitVersion": "v1.32.0", + "gitCommit": "70d3cc986aa8221cd1dfb1121852688902d3bf53", + "gitTreeState": "clean", + "buildDate": "2024-12-11T17:59:15Z", + "goVersion": "go1.23.3", + "compiler": "gc", + "platform": "linux/amd64" +} +``` + +Fortsetzung folgt: [Bootstrapping the Kubernetes Worker Nodes](lab9-bootstrapping-kubernetes-workers.md) diff --git a/docs/release_notes/10_0.de.md b/docs/release_notes/10_0.de.md index a24543d790..79eae05e40 100644 --- a/docs/release_notes/10_0.de.md +++ b/docs/release_notes/10_0.de.md @@ -222,11 +222,11 @@ Der Austausch oder die Entfernung einiger Dienste und Pakete in RL 10 umfasst di | Entfernt | Ersetzt durch | | :--------------------------------- | :----------------------------------------------------------------------------------------------------------------- | | power-profiles-daemon CPU throttle | „tuned-ppd“-Übersetzungsebene, die Anwendungen unterstützt, die für den „Power-Profiles-Daemon“ geschrieben wurden | -| redis in-memory key-value database | `valkey` (ein Fork von Redis) In-Memory-Schlüsselwertdatenbank ^1 | +| redis in-memory key-value database | valkey[^1] In-Memory Schlüssel-Wert-Datenbank | | sendmail mail transfer agent | Rocky Linux empfiehlt die Migration zum Postfix Mail Transfer Agent. | | spamassassin email spam filter | Der E-Mail-Spamfilter `spamassassin` befindet sich jetzt im EPEL-Repository. | -1 Zusätzlich zu `valkey` befindet sich das Paket `valkey-compat-redis` im Plus-Repository. +[^1]: **valkey**: Ein Fork von `redis`. 1 Zusätzlich zu `valkey` befindet sich das Paket `valkey-compat-redis` im Plus-Repository. ### Dynamische Programmiersprachen diff --git a/docs/release_notes/8-changelog.de.md b/docs/release_notes/8-changelog.de.md index c5b2af3721..ec340f85e7 100644 --- a/docs/release_notes/8-changelog.de.md +++ b/docs/release_notes/8-changelog.de.md @@ -1,5 +1,5 @@ --- -title: Changelog 8 +title: Neuerungen 8 author: Louis Abel contributors: Steven Spencer, tianci li tags: diff --git a/docs/release_notes/8_10.fr.md b/docs/release_notes/8_10.fr.md index e72a652df2..28464183aa 100644 --- a/docs/release_notes/8_10.fr.md +++ b/docs/release_notes/8_10.fr.md @@ -70,12 +70,12 @@ Voici les autres changements notables : - La commande `podman build farm` pour la création d'images de conteneurs multiarchitectures est disponible en tant qu'aperçu technologique - Podman supporte maintenant les modules `containers.conf` pour charger un ensemble prédéterminé de configurations -- Le paquet Container Tools est mis à jour -- L'API RESTful de Podman v4.9 affiche maintenant les données de progression lorsque vous tirez ou poussez une image vers le registre -- SQLite est maintenant entièrement supporté comme base de données par défaut pour podman -- `Containerfile` supporte désormais les instructions HereDoc multilignes -- `pasta` comme nom de réseau est maintenant obsolète -- La base de données BoltDB est désormais obsolète +- Le paquet `Container Tools` est mis à jour +- L'API RESTful Podman v4.9 affiche maintenant les données de progression lorsque vous extrayez ou envoyez une image vers le registre +- L'API RESTful Podman v4.9 affiche maintenant les données de progression lorsque vous extrayez ou envoyez une image vers le registre +- `Containerfile` prend maintenant en charge les instructions `HereDoc` multilignes +- `pasta` comme nom de réseau est maintenant désuet +- La base de données `BoltDB` est désormais obsolète - Le module `container-tools:4.0` est maintenant obsolète - La pile réseau Container Network Interface (CNI) est obsolète et sera supprimée dans une prochaine version @@ -83,16 +83,16 @@ Voici les autres changements notables : Plusieurs problèmes connus existent dans la version 8.10, y compris ceux liés à : -- Installateur et création d'images +- Installation et création d'images - Sécurité -- Gestion des logiciels +- Gestion de logiciels - Outils de ligne de commande et shells - Services d'infrastructure - Réseaux - Noyau - Systèmes de fichiers et stockage - Langages de programmation dynamiques, serveurs web et bases de données -- Gestion des identités +- Gestion d'identités - Desktop - Infrastructures graphiques - Virtualisation @@ -101,7 +101,7 @@ Plusieurs problèmes connus existent dans la version 8.10, y compris ceux liés Consultez la [liste upstream](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/8.10_release_notes/known-issues) pour obtenir tous les détails sur ces problèmes. -!!! info +!!! info "Info" ``` Certains flux d'applications, qui font partie des référentiels Rocky Linux 8.10, ne recevront plus de mises à jour. N'oubliez pas de noter tous les flux d'application qui sont EOL ou obsolètes et de les mettre à jour vers des flux plus récents si vous le souhaitez. @@ -109,4 +109,4 @@ Certains flux d'applications, qui font partie des référentiels Rocky Linux 8.1 ## Signaler des problèmes -Merci de signaler tous les problèmes que vous rencontrez sur le [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Nous vous invitons également à rejoindre notre communauté de quelque manière que ce soit, que ce soit sur nos [Forums](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC on Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Mailing Lists](https://lists.resf.org), ou de toute autre manière que vous souhaiteriez utiliser ! +Merci de signaler tous les problèmes que vous rencontrez sur le [Rocky Linux Bug Tracker](https://bugs.rockylinux.org/). Nous vous invitons également à vous joindre à notre communauté de la manière qui vous convient, que ce soit sur nos [Forums](https://forums.rockylinux.org), [Mattermost](https://chat.rockylinux.org), [IRC sur Libera.Chat](irc://irc.liberachat/rockylinux), [Reddit](https://reddit.com/r/rockylinux), [Listes de diffusion](https://lists.resf.org) ou de toute autre manière dont vous souhaitez participer ! From e842e321954e8ccfc741f6871dbc7773361299eb Mon Sep 17 00:00:00 2001 From: Song Minsang <31n5ang@gmail.com> Date: Thu, 11 Sep 2025 01:42:21 +0900 Subject: [PATCH 135/164] Fix vsftpd(en) docs for chroot_local_user typo (#2872) --- docs/guides/file_sharing/secure_ftp_server_vsftpd.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/file_sharing/secure_ftp_server_vsftpd.md b/docs/guides/file_sharing/secure_ftp_server_vsftpd.md index 890b4c43ae..255a525c07 100644 --- a/docs/guides/file_sharing/secure_ftp_server_vsftpd.md +++ b/docs/guides/file_sharing/secure_ftp_server_vsftpd.md @@ -78,7 +78,7 @@ Ensure that "write_enable" is yes also: write_enable=YES ``` -Find the line to "chroot_local_users" and remove the remark. Add two lines after that shown here: +Find the line to "chroot_local_user" and remove the remark. Add two lines after that shown here: ```bash chroot_local_user=YES From d13e779cd20975c07dda883f0a9da0d7dd4170b4 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Thu, 11 Sep 2025 09:29:05 -0400 Subject: [PATCH 136/164] New Crowdin updates (#2870) * New translations 8_9.md (German) * New translations lab2-jumpbox.md (French) * New translations lab1-prerequisites.md (Portuguese, Brazilian) * New translations index.md (German) --- docs/index.de.md | 4 +- .../lab1-prerequisites.pt-BR.md | 43 ++++++ .../lab2-jumpbox.fr.md | 126 ++++++++++++++++++ docs/release_notes/8_9.de.md | 2 +- 4 files changed, 172 insertions(+), 3 deletions(-) create mode 100644 docs/labs/kubernetes-the-hard-way/lab1-prerequisites.pt-BR.md create mode 100644 docs/labs/kubernetes-the-hard-way/lab2-jumpbox.fr.md diff --git a/docs/index.de.md b/docs/index.de.md index 9f37b3985e..a534738714 100644 --- a/docs/index.de.md +++ b/docs/index.de.md @@ -24,14 +24,14 @@ Die Hauptbereiche der Dokumentationseite sind: * **Anleitungen**: die bestimmte Themen zum Einrichten und Benutzen von Rocky Linux abdecken. * **Bücher**: enthalten detailliertere Informationen rund um einen bestimmten Bereich. -* **Labors**: Sie werden Spaß an diese Tutorials haben! +* **Labs**: „Zurück zur Schule“, diese Tutorials werden Ihnen Spaß machen! * **Gems**: Hier werden nützliche Skripte und Tipps zur Verwendung von Befehlen vorgestellt. * **Release Notes**: enthalten Rocky Linux Release Notes und Versionsupdate Informationen. * **Rocky Linux**: Link zur Offiziellen Homepage. ### Multilingual -Bei Rocky Linux wollen wir die Dokumentationsseite für jeden in seiner Lieblingssprache zugänglich machen — *deshalb sind Übersetzungen in verschiedenen Sprachen wesentlich*. Wenn Sie auf die Sprachauswahl (文A bzw. wén-A Icon) im oberen Menü klicken, sehen Sie die Sprachen, die zurzeit verfügbar sind: Dazu gibt es zwei Teile: +Bei Rocky Linux wollen wir die Dokumentationsseite für jeden in seiner Lieblingssprache zugänglich machen — *deshalb sind Übersetzungen in verschiedenen Sprachen wesentlich*. Wenn Sie auf die Sprachauswahl (文A bzw. `wén-A` Icon) im oberen Menü klicken, sehen Sie die Sprachen, die zurzeit verfügbar sind: Dazu gibt es zwei Teile: 1. Lokalisierung der Webseiten-Schnittstelle: Wenn Sie eine andere Sprache wählen, zum Beispiel Français, werden Sie feststellen, dass die Schnittstelle, zum Beispiel die Navigatoren 'Weiter' und 'Vorheriger' übersetzt werden. 1. Inhalt: Das Übersetzen von Inhalten ist eine [laufende](https://crowdin.com/project/rockydocs/activity-stream) (https://crowdin.com/project/rockydocs/activity-stream) [Aufgabe](https://crowdin.com/project/rockydocs). Noch nicht alle Inhalte sind in allen Sprachen übersetzt. Alle Seiten, die übersetzt wurden (in der ausgewählten Sprache) werden entsprechend dargestellt, diejenigen, die es noch nicht vollständig sind, werden in Englisch angezeigt. Wenn Sie der Community durch Übersetzungen helfen möchten, sind Sie sehr willkommen — siehe unten für weitere Details zur Vorgehensweise. diff --git a/docs/labs/kubernetes-the-hard-way/lab1-prerequisites.pt-BR.md b/docs/labs/kubernetes-the-hard-way/lab1-prerequisites.pt-BR.md new file mode 100644 index 0000000000..dd2206bce6 --- /dev/null +++ b/docs/labs/kubernetes-the-hard-way/lab1-prerequisites.pt-BR.md @@ -0,0 +1,43 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +tags: + - kubernetes + - k8s + - exercício do laboratório +--- + +# Lab. 1: Pré-requisitos + +!!! info + + Este é um fork do original ["Kubernetes the hard way"](https://github.com/kelseyhightower/kubernetes-the-hard-way) escrito originalmente por Kelsey Hightower (GitHub: kelseyhightower). Ao contrário do original, que se baseia em distribuições semelhantes ao Debian para a arquitetura ARM64, este fork tem como alvo distribuições Enterprise Linux, como o Rocky Linux, que roda na arquitetura x86_64. + +Neste laboratório, você revisará os requisitos de máquina necessários para seguir este tutorial. + +## Máquinas Virtuais ou Físicas + +Este tutorial requer quatro (4) máquinas virtuais ou físicas x86_64 executando o Rocky Linux 9.5 (os contêineres Incus ou LXD também devem funcionar). A tabela a seguir lista as quatro máquinas e seus requisitos de CPU, memória e armazenamento. + +| Nome | Descrição | CPU | RAM | Armazenamento | +| ------- | ---------------------------- | --- | ------ | ------------- | +| jumpbox | Servidor de administração | 1 | 512 MB | 10GB | +| server | Servidor Kubernetes | 1 | 2GB | 20GB | +| node-0 | Nó de trabalho do Kubernetes | 1 | 2GB | 20GB | +| node-1 | Nó de trabalho do Kubernetes | 1 | 2GB | 20GB | + +A maneira como você provisiona as máquinas fica por sua conta; o único requisito é que cada máquina atenda aos requisitos de sistema acima, incluindo as especificações da máquina e a versão do sistema operacional. Após provisionar todas as quatro máquinas, verifique os requisitos do sistema executando o comando `uname` em cada máquina: + +```bash +uname -mov +``` + +Após executar o comando `uname`, você deverá ver a seguinte saída: + +```text +#1 SMP PREEMPT_DYNAMIC Wed Feb 19 16:28:19 UTC 2025 x86_64 GNU/Linux +``` + +O `x86_64` na saída confirma que o sistema é uma arquitetura x86_64. Este deve ser o caso de vários sistemas baseados em AMD e Intel. + +Next: [setting-up-the-jumpbox](lab2-jumpbox.md) diff --git a/docs/labs/kubernetes-the-hard-way/lab2-jumpbox.fr.md b/docs/labs/kubernetes-the-hard-way/lab2-jumpbox.fr.md new file mode 100644 index 0000000000..229d0a1272 --- /dev/null +++ b/docs/labs/kubernetes-the-hard-way/lab2-jumpbox.fr.md @@ -0,0 +1,126 @@ +--- +author: Wale Soyinka +contributors: Steven Spencer, Ganna Zhyrnova +tags: + - kubernetes + - k8s + - exercice d'atelier +--- + +# Atelier n°2 : Mise en Place de The Jumpbox + +!!! info + + Il s'agit d'un fork de l'original ["Kubernetes the hard way"](https://github.com/kelseyhightower/kubernetes-the-hard-way) écrit à l'origine par Kelsey Hightower (GitHub : kelseyhightower). Contrairement à l'original, qui se base sur des distributions de type Debian pour l'architecture ARM64, ce fork cible les distributions Enterprise Linux telles que Rocky Linux, qui fonctionne sur l'architecture x86_64. + +Dans ce labo, vous allez configurer l'une des quatre machines comme `jumpbox`. Vous utiliserez cette machine pour exécuter des commandes dans ce didacticiel. Bien qu'une machine dédiée soit utilisée pour assurer la cohérence, vous pouvez exécuter ces commandes à partir de n'importe quelle machine, y compris votre poste de travail personnel exécutant macOS ou Linux. + +Considérez la `jumpbox` comme la machine d’administration que vous utiliserez comme base lors de la configuration de votre grappe Kubernetes à partir de zéro. Une chose que vous devez faire avant de commencer est d'installer quelques utilitaires de ligne de commande et de cloner le référentiel git `Kubernetes The Hard Way`, qui contient des fichiers de configuration supplémentaires que vous utiliserez pour configurer divers composants `Kubernetes` tout au long de ce didacticiel. + +Connectez-vous au serveur `jumpbox` : + +```bash +ssh root@jumpbox +``` + +Pour plus de commodité, vous exécuterez toutes les commandes en tant qu'utilisateur `root`, ce qui contribuera à réduire le nombre de commandes nécessaires pour tout configurer. + +## Installation des Utilitaires de Ligne de Commande + +Une fois connecté à la machine `jumpbox` en tant qu'utilisateur `root`, vous installerez les utilitaires de ligne de commande que vous utiliserez pour effectuer diverses tâches tout au long du didacticiel : + +```bash +sudo dnf -y install wget curl vim openssl git +``` + +## Synchronisation du Dépôt GitHub + +Il est maintenant temps de télécharger une copie de ce tutoriel, qui contient les fichiers de configuration et les modèles que vous utiliserez pour créer votre grappe Kubernetes à partir de zéro. Clonez le dépôt git de Kubernetes The Hard Way à l'aide de la commande `git` : + +```bash +git clone --depth 1 \ + https://github.com/wsoyinka/kubernetes-the-hard-way.git +``` + +Accédez au répertoire `kubernetes-the-hard-way` : + +```bash +cd kubernetes-the-hard-way +``` + +Ce sera le répertoire de travail pour le reste du tutoriel. Si jamais vous vous perdez, exécutez la commande `pwd` pour vérifier que vous êtes dans le bon répertoire lors de l'exécution de commandes sur la `jumpbox` : + +```bash +pwd +``` + +```text +/root/kubernetes-the-hard-way +``` + +## Téléchargement des Fichiers Binaires + +Ici, vous téléchargerez les binaires des différents composants Kubernetes. Stockez ces binaires dans le répertoire `downloads` sur la `jumpbox`. Cela réduira la quantité de bande passante Internet requise pour terminer ce tutoriel, car vous éviterez de télécharger les binaires plusieurs fois pour chaque machine de notre grappe Kubernetes. + +Le fichier `download.txt` répertorie les binaires que vous allez télécharger, que vous pouvez consulter à l'aide de la commande `cat` : + +```bash +cat downloads.txt +``` + +Téléchargez les binaires répertoriés dans le fichier `downloads.txt` dans un répertoire appelé `downloads` à l'aide de la commande `wget` : + +```bash +wget -q --show-progress \ + --https-only \ + --timestamping \ + -P downloads \ + -i downloads.txt +``` + +Selon la vitesse de votre connexion Internet, le téléchargement des `584` mégaoctets de binaires peut prendre un certain temps. Une fois le téléchargement terminé, vous pouvez les lister à l'aide de la commande `ls` : + +```bash +ls -loh downloads +``` + +```text +total 557M +-rw-r--r--. 1 root 51M Jan 6 11:13 cni-plugins-linux-amd64-v1.6.2.tgz +-rw-r--r--. 1 root 36M Feb 28 14:09 containerd-2.0.3-linux-amd64.tar.gz +-rw-r--r--. 1 root 19M Dec 9 04:16 crictl-v1.32.0-linux-amd64.tar.gz +-rw-r--r--. 1 root 17M Feb 25 14:19 etcd-v3.4.36-linux-amd64.tar.gz +-rw-r--r--. 1 root 89M Dec 11 16:12 kube-apiserver +-rw-r--r--. 1 root 82M Dec 11 16:12 kube-controller-manager +-rw-r--r--. 1 root 55M Dec 11 16:12 kubectl +-rw-r--r--. 1 root 74M Dec 11 16:12 kubelet +-rw-r--r--. 1 root 64M Dec 11 16:12 kube-proxy +-rw-r--r--. 1 root 63M Dec 11 16:12 kube-scheduler +-rw-r--r--. 1 root 11M Feb 13 20:19 runc.amd64 +``` + +## Installation de `kubectl` + +Dans cette section, vous installerez `kubectl`, l'outil de ligne de commande client officiel Kubernetes, sur la machine `jumpbox`. Vous utiliserez `kubectl` pour interagir avec le plan de contrôle Kubernetes une fois le provisionnement de votre grappe terminé plus tard dans ce didacticiel. + +Utilisez la commande `chmod` pour rendre le binaire `kubectl` exécutable et le déplacer vers le répertoire `/usr/local/bin/` : + +```bash + chmod +x downloads/kubectl + cp downloads/kubectl /usr/local/bin/ +``` + +Étant donné que votre installation de `kubectl` est terminée, vous pouvez la vérifier en exécutant la commande `kubectl` : + +```bash +kubectl version --client +``` + +```text +Client Version: v1.32.0 +Kustomize Version: v5.5.0 +``` + +À ce stade, vous avez configuré une `jumpbox` avec tous les outils et utilitaires de ligne de commande nécessaires pour terminer les travaux pratiques de ce didacticiel. + +Suivant : [Provisionnement des ressources de calcul](lab3-compute-resources.md) diff --git a/docs/release_notes/8_9.de.md b/docs/release_notes/8_9.de.md index 658fb746b0..4014fa56e0 100644 --- a/docs/release_notes/8_9.de.md +++ b/docs/release_notes/8_9.de.md @@ -1,5 +1,5 @@ --- -title: Version 8.9 +title: Release 8.9 tags: - 8.9 - Release 8.9 From ce2a0802449a918dbe1df7864921c8a9e1746ed9 Mon Sep 17 00:00:00 2001 From: wale soyinka Date: Fri, 12 Sep 2025 16:19:00 -0400 Subject: [PATCH 137/164] docs(guide): add new rockydocs tool/contributor guide (#2874) --- .../guides/contribute/rockydocs_tool_guide.md | 460 ++++++++++++++++++ 1 file changed, 460 insertions(+) create mode 100644 docs/guides/contribute/rockydocs_tool_guide.md diff --git a/docs/guides/contribute/rockydocs_tool_guide.md b/docs/guides/contribute/rockydocs_tool_guide.md new file mode 100644 index 0000000000..0d60a1a419 --- /dev/null +++ b/docs/guides/contribute/rockydocs_tool_guide.md @@ -0,0 +1,460 @@ +--- +title: RockyDocs Script Method +author: Wale Soyinka +contributors: +update: 11-Sep-2025 +--- + +# Running a local copy of the docs.rockylinux.org website using the RockyDocs script + +This document walks you through using the automated `rockydocs.sh` script to recreate and run a production-identical copy of the entire docs.rockylinux.org website on your local machine. + +The RockyDocs script provides a modern, automated approach that eliminates the manual setup complexity found in other methods while delivering exact production behavior. + +Running a local copy of the documentation website might be useful in the following scenarios: + +- You are a documentation author and want to preview exactly how your content will appear on the live website +- You want to test your contributions across multiple Rocky Linux versions (8, 9, and 10) locally +- You are interested in learning about or contributing to the documentation infrastructure +- You need to verify that your content renders correctly with the version selector and navigation + +## Prerequisites + +The RockyDocs script automatically handles most dependencies, but you'll need: + +- A Linux or macOS system (Windows with WSL2 should work) +- `git` installed on your system +- Either Python 3.8+ with `pip` OR Docker (the script supports both environments) +- About 2GB of free disk space for the full environment + +The script will automatically check for and install other required tools like `mkdocs`, `mike`, and various plugins. + +## Setup the content environment + +1. Change to a directory where you want to work with Rocky Linux documentation. We'll refer to this as your workspace directory. + + ```bash + mkdir -p ~/rocky-projects + cd ~/rocky-projects + ``` + +2. Clone the official Rocky Linux documentation repository: + + ```bash + git clone https://github.com/rocky-linux/documentation.git + cd documentation + ``` + + You now have the content repository with the automated `rockydocs.sh` script included. + +## Quick start options with the RockyDocs script + +The RockyDocs script provides multiple workflow options to match different contributor needs. Choose the option that best fits your writing and review workflow. + +!!! note "Understanding the Three-Step Process" + **Setup** (one-time): Creates a build environment with Python virtual environment and installs MkDocs tools. Also sets the language configuration (minimal or full) that will be used for all subsequent deployments. This creates a separate workspace directory for build files while keeping your content repository clean. + + **Deploy**: Builds all Rocky Linux versions (8, 9, 10) into a complete versioned website using Mike and the language configuration set during setup. This creates the multi-version structure you see on docs.rockylinux.org. + + **Serve**: Starts a local web server to preview your changes. Static mode serves pre-built files (production-identical), while live mode enables automatic reloading when you edit content. + +## Customizing your workspace location + +By default, the script creates a workspace in `../rockydocs-workspaces/` relative to your content repository. You can customize this location using the `--workspace` option: + +```bash +# Use a custom workspace location +./rockydocs.sh --setup --venv --workspace ~/my-docs-workspace + +# The script remembers your choice for future commands +./rockydocs.sh --deploy +./rockydocs.sh --serve --static +``` + +!!! tip "Workspace Benefits" + - Keeps your content repository clean from build files + - Allows multiple documentation projects to share the same build environment + - Automatically saves your workspace preference for future commands + - Intelligently reuses existing repositories to save disk space and clone time + +The script automatically saves your workspace preference and reuses it for subsequent commands. + +### Option 1: Production-Identical Preview (Recommended for Final Review) + +This option provides the exact same experience as the live docs.rockylinux.org website, perfect for final content review and testing. + +1. **Setup the environment** (one-time setup): + + ```bash + # Basic setup (creates workspace in ../rockydocs-workspaces/) + ./rockydocs.sh --setup --venv + + # Alternative: Custom workspace location + ./rockydocs.sh --setup --venv --workspace ~/my-docs-workspace + ``` + +2. **Build all documentation versions**: + + ```bash + ./rockydocs.sh --deploy + ``` + +3. **Start the production-identical website**: + + ```bash + ./rockydocs.sh --serve --static + ``` + + !!! tip "Static Serving Mode" + This serves pre-built static files exactly like production with no redirects. Perfect for verifying how your content will look on the live site. The root URL (`http://localhost:8000/`) serves the latest content directly, just like docs.rockylinux.org. + + **Note**: You must run `--deploy` again to see content changes, as this serves pre-built files. + + !!! note "Language Support" + By default, the script builds English and Ukrainian language versions for faster setup and builds. For complete testing with all available languages, use the `--full` flag: + + ```bash + # Full language support setup (config set once) + ./rockydocs.sh --setup --venv --full + # Deploy uses setup's language configuration automatically + ./rockydocs.sh --deploy + ``` + +### Option 2: Live Development Mode (Best for Active Writing) + +This option automatically refreshes your browser when you edit content files, ideal for active writing sessions. + +1. **Setup the environment** (one-time setup): + + ```bash + # Basic setup + ./rockydocs.sh --setup --venv + + # Alternative: Custom workspace location + ./rockydocs.sh --setup --venv --workspace ~/my-docs-workspace + ``` + +2. **Build all documentation versions**: + + ```bash + ./rockydocs.sh --deploy + ``` + +3. **Start the live development server**: + + ```bash + ./rockydocs.sh --serve + ``` + + !!! tip "Live Development Mode" + This provides live reloading - edit any markdown file in your `docs/` directory and see changes instantly in your browser. Perfect for active writing and editing content. Changes appear automatically without needing to run `--deploy` again. + + **Note**: May include redirects and behavior that differs slightly from production. Use static mode for final verification. + +### Option 3: Dual Server Mode (Best of Both Worlds) + +This option runs two servers simultaneously, giving you both full site navigation and live content editing capabilities. + +1. **Setup the environment** (one-time setup): + + ```bash + # Basic setup + ./rockydocs.sh --setup --venv + + # Alternative: Custom workspace location + ./rockydocs.sh --setup --venv --workspace ~/my-docs-workspace + ``` + +2. **Build all documentation versions**: + + ```bash + ./rockydocs.sh --deploy + ``` + +3. **Start dual servers**: + + ```bash + ./rockydocs.sh --serve-dual + ``` + + !!! tip "Dual Server Mode" + This runs two servers simultaneously for the best of both worlds: + + - **Port 8000**: Mike serve with full version selector and site navigation + - **Port 8001**: MkDocs live reload for instant content updates + + Switch between ports depending on whether you need live editing (8001) or full site testing (8000). This mode is ideal for contributors who want both immediate content feedback and complete site navigation testing. + +### Option 4: Docker Environment + +If you prefer containerized environments or don't want to install Python dependencies locally, you can use Docker versions of any serving mode. + +!!! note "Docker Environment Benefits" + - **Isolated Environment**: No impact on your local Python installation or system dependencies + - **Consistent Builds**: Same container environment across different machines + - **Easy Cleanup**: Simply remove containers and images when done + - **All Serving Modes**: Supports static, live, and dual server modes in containers + +1. **Setup the Docker environment**: + + ```bash + # Basic Docker setup + ./rockydocs.sh --setup --docker + + # Alternative: Custom workspace location + ./rockydocs.sh --setup --docker --workspace ~/my-docs-workspace + ``` + +2. **Build all versions in containers**: + + ```bash + ./rockydocs.sh --deploy --docker + ``` + +3. **Choose your Docker serving mode**: + + ```bash + # Production-identical (static) + ./rockydocs.sh --serve --docker --static + + # Live development with auto-reload + ./rockydocs.sh --serve --docker + + # Dual servers (containerized) + ./rockydocs.sh --serve-dual --docker + ``` + +## View your local documentation website + +With either method, you can now view your local copy of the website by opening your web browser to: + +**** + +You should see: +- The complete Rocky Linux documentation website +- Full navigation and search functionality +- Version selector in the top navigation +- All content exactly as it appears on the production site +- No redirect behavior - pages load directly + +## Available script commands + +The `rockydocs.sh` script provides several useful commands: + +### Primary workflow commands + +```bash +# Setup commands (run once) +./rockydocs.sh --setup --venv --minimal # Python virtual environment setup +./rockydocs.sh --setup --docker --minimal # Docker containerized setup + +# Deployment commands (build the site) +./rockydocs.sh --deploy --minimal # Build all versions (venv) +./rockydocs.sh --deploy --docker --minimal # Build all versions (Docker) + +# Serving commands (start the local website) +./rockydocs.sh --serve --static # Production-identical static server (venv) +./rockydocs.sh --serve --docker --static # Production-identical static server (Docker) +./rockydocs.sh --serve # Live development server with auto-reload (venv) +./rockydocs.sh --serve --docker # Live development server with auto-reload (Docker) +./rockydocs.sh --serve-dual # Dual servers: mike serve + mkdocs live reload (venv) +./rockydocs.sh --serve-dual --docker # Dual servers: containerized version (Docker) +``` + +### Maintenance and information commands + +```bash +./rockydocs.sh --status # Show environment status and information +./rockydocs.sh --clean # Clean workspace and build artifacts +./rockydocs.sh --reset # Reset saved configuration +./rockydocs.sh --help # Show detailed help information +``` + + +## Working with different Rocky Linux versions + +The script automatically detects which version you're working on based on your git branch: + +```bash +# Switch to different versions in your content repository +git checkout rocky-8 # Work on Rocky Linux 8 documentation +git checkout rocky-9 # Work on Rocky Linux 9 documentation +git checkout main # Work on Rocky Linux 10 documentation + +# Rebuild with your changes +./rockydocs.sh --deploy --minimal +``` + +Your changes will appear in the corresponding version when you view the local website. + + +## Understanding the folder structure + +The RockyDocs script creates a clean separation between your content and the build environment: + +``` +~/rocky-projects/documentation/ # Your content repository (where you edit) +├── docs/ # Your content files (guides, books, etc.) +├── rockydocs.sh # The script +└── .git/ # Your content git repository + +~/rockydocs-workspaces/ # Build workspace (created by script) +├── docs.rockylinux.org/ # Main build environment +│ ├── venv/ # Python virtual environment +│ ├── worktrees/ # Cached copies of doc versions +│ │ ├── main/ # Rocky Linux 10 content cache +│ │ ├── rocky-8/ # Rocky Linux 8 content cache +│ │ └── rocky-9/ # Rocky Linux 9 content cache +│ ├── site-static/ # Static site files (for --static mode) +│ ├── content -> worktrees/main/docs # Symlink to your current version +│ ├── mkdocs.yml # Build configuration +│ └── .git/ # Local build repository +└── app -> docs.rockylinux.org # Compatibility symlink +``` + +**Key points:** +- Your content repository stays clean - no build files or dependencies +- The build workspace is completely separate and can be safely deleted +- The script automatically manages the `content` symlink based on your current git branch +- Cached worktrees avoid repeatedly downloading content for different Rocky versions +- The `--clean` command removes the entire build workspace if needed + +## Updating your environment + +To get the latest changes from the official repositories: + +```bash +# This updates both the build environment and content +./rockydocs.sh --deploy --minimal +``` + +The script automatically fetches updates from all Rocky Linux documentation branches. + +## Troubleshooting + +If you encounter issues: + +1. **Check system status**: + ```bash + ./rockydocs.sh --status + ``` + +2. **Clean and rebuild**: + ```bash + ./rockydocs.sh --clean + ./rockydocs.sh --setup --venv --minimal + ./rockydocs.sh --deploy --minimal + ``` + +3. **Get detailed help**: + ```bash + ./rockydocs.sh --help + ./rockydocs.sh --setup --help + ./rockydocs.sh --serve --help + ``` + +## How Your Edits Flow to the Built Site + +Understanding how the RockyDocs script connects your local editing to the deployed website helps explain why certain design decisions were made and how your changes appear in the built documentation. + +### The Core Challenge + +The script needs to accomplish three things simultaneously: +1. Let you edit in your familiar local repository +2. Build multiple Rocky Linux versions (8, 9, 10) with proper git context +3. Reflect your live edits immediately in builds + +### Directory Structure Overview + +``` +Your editing environment: +~/rocky-projects/documentation/ ← You edit here +├── docs/ ← Your live content +├── .git/ ← Your git repository +└── rockydocs.sh + +Build environment (separate): +../rockydocs-workspaces/docs.rockylinux.org/ +├── content → (symlink target varies) ← MkDocs reads from here +├── mkdocs.yml (docs_dir: "content") ← Always points to symlink +├── worktrees/ ← Cached content for other versions +│ ├── main/docs/ ← Rocky 10 cached content +│ ├── rocky-8/docs/ ← Rocky 8 cached content +│ └── rocky-9/docs/ ← Rocky 9 cached content +└── venv/ +``` + +### The Smart Symlink Strategy + +The key innovation is a dynamic symlink called `content` in the build environment. This symlink changes its target based on what you're currently working on: + +#### When You're Editing Rocky Linux 10 (main branch): +```bash +# Your context: +cd ~/rocky-projects/documentation +git branch # Shows: * main + +# When you run: ./rockydocs.sh --deploy +# Script creates: content → ~/rocky-projects/documentation/docs + +# Result: Your live edits appear immediately in builds +``` + +#### When Building Other Versions: +```bash +# Script builds Rocky 8: +# content → ../worktrees/rocky-8/docs (cached Rocky 8 content) + +# Script builds Rocky 9: +# content → ../worktrees/rocky-9/docs (cached Rocky 9 content) +``` + +### Why This Design? + +**Main Branch → Your Live Files:** +- You're actively editing Rocky Linux 10 content +- Live reload: save file, see changes immediately in browser +- Uses your repo's git history for accurate timestamps + +**Other Branches → Cached Worktrees:** +- You may not have rocky-8/rocky-9 branches locally +- Provides complete git context for each Rocky version +- Enables building all versions without affecting your workflow + +### Complete Build Flow Example + +```bash +# 1. You edit in your repo +cd ~/rocky-projects/documentation +echo "New troubleshooting tip" >> docs/guides/myguide.md + +# 2. You deploy and serve +./rockydocs.sh --deploy +./rockydocs.sh --serve + +# 3. Script creates symlink in build environment +# content → ~/rocky-projects/documentation/docs + +# 4. MkDocs builds from your live files +# Your changes appear immediately in the local website +``` + +### Benefits of This Architecture + +1. **Immediate Edit Reflection**: Your changes appear instantly without rebuilding +2. **Multi-Version Support**: Can build all Rocky versions with proper git context +3. **Clean Separation**: Your git workflow remains completely unaffected +4. **Git History Preservation**: Each version has accurate timestamps and author information +5. **Flexible Development**: Switch branches, script adapts automatically + +The symlink acts as a "smart pointer" that MkDocs follows to find content, while the script dynamically retargets it based on what you're currently working on. This explains why the script needs to clone repositories separately - it creates a clean build environment while keeping your editing environment pristine. + +## Notes + +- The RockyDocs script creates a workspace **outside** your content repository to keep your git workflow clean +- All environments are completely local - nothing is uploaded or published automatically +- The script automatically manages dependencies, port conflicts, and cleanup +- Both Python virtual environment and Docker methods provide identical functionality +- The local website includes the exact same theme, navigation, and features as the production site +- You can safely experiment with content changes - your local environment is completely isolated +- The script automatically preserves git history for accurate document timestamps \ No newline at end of file From f9692245225928e50cb8b0d349c986f448729565 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Fri, 12 Sep 2025 16:21:29 -0400 Subject: [PATCH 138/164] New Crowdin updates (#2873) * New translations index.md (French) * New translations dnf-swap.md (German) * New translations index.md (German) * New translations index.md (French) * New translations index.md (German) * New translations string_color.md (German) * New translations sed_search_replace.md (German) * New translations mtr.md (German) * New translations htop.md (German) * New translations view_kernel_conf.md (German) * New translations markdown-demo-v2.md (German) * New translations docker.md (German) * New translations podman.md (German) * New translations string_color.md (German) * New translations fork_and_branch_workflow.md (German) * New translations index.md (French) * New translations index.md (German) --- docs/gemstones/containers/docker.de.md | 6 +- docs/gemstones/containers/podman.de.md | 2 +- docs/gemstones/core/view_kernel_conf.de.md | 4 +- docs/gemstones/dnf-swap.de.md | 2 +- .../git/fork_and_branch_workflow.de.md | 115 ++++++++++++++++++ docs/gemstones/htop.de.md | 2 +- docs/gemstones/markdown-demo-v2.de.md | 2 +- docs/gemstones/network/mtr.de.md | 2 +- docs/gemstones/sed_search_replace.de.md | 2 +- docs/gemstones/string_color.de.md | 94 ++++++++++++++ docs/index.de.md | 2 +- docs/index.fr.md | 4 +- 12 files changed, 223 insertions(+), 14 deletions(-) create mode 100644 docs/gemstones/git/fork_and_branch_workflow.de.md create mode 100644 docs/gemstones/string_color.de.md diff --git a/docs/gemstones/containers/docker.de.md b/docs/gemstones/containers/docker.de.md index 3f2113db6f..5ee732b304 100644 --- a/docs/gemstones/containers/docker.de.md +++ b/docs/gemstones/containers/docker.de.md @@ -1,5 +1,5 @@ --- -title: Docker - Engine-Installation +title: Docker — Engine-Installation author: Wale Soyinka contributors: Neel Chauhan, Srinivas Nishant Viswanadha, Stein Arne Storslett, Ganna Zhyrnova, Steven Spencer date: 2021-08-04 @@ -9,9 +9,9 @@ tags: # Einleitung -Die Docker-Engine kann zum Ausführen nativer Container-Workloads im Docker-Stil auf Rocky Linux-Servern verwendet werden. Dies wird manchmal dem Ausführen der kompletten Docker Desktop-Umgebung vorgezogen. +Die Docker-Engine kann zum Ausführen nativer Container-Workloads im Docker-Stil auf Rocky Linux-Servern verwendet werden. Dies wird manchmal bevorzugt, wenn die vollständige Docker-Desktopumgebung ausgeführt wird. -## Docker Repository hinzufügen +## Docker-Repository hinzufügen Benutzen Sie das `dnf`-Tool, um das Docker Repository zu Ihrem Rocky Linux Server hinzuzufügen. Geben Sie bitte Folgendes ein: diff --git a/docs/gemstones/containers/podman.de.md b/docs/gemstones/containers/podman.de.md index 7acbc04825..d6cacac8d0 100644 --- a/docs/gemstones/containers/podman.de.md +++ b/docs/gemstones/containers/podman.de.md @@ -53,7 +53,7 @@ während rootless Dateien in einem der folgenden Verzeichnisse abgelegt werden k - `/etc/containers/systemd/users/$(UID)` - `/etc/containers/systemd/users/` -Obwohl einzelne Container, Pods, Images, Netzwerke, Volumes und Kube-Dateien unterstützt werden, konzentrieren wir uns auf unser Nextcloud-Beispiel. Erstellen Sie eine neue Datei `~/.config/containers/systemd/nextcloud.cotainer` mit folgendem Inhalt: +Obwohl einzelne Container, Pods, Images, Netzwerke, Volumes und Kube-Dateien unterstützt werden, konzentrieren wir uns auf unser Nextcloud-Beispiel. Erstellen Sie eine neue Datei `~/.config/containers/systemd/nextcloud.container` mit folgendem Inhalt: ```systemd [Container] diff --git a/docs/gemstones/core/view_kernel_conf.de.md b/docs/gemstones/core/view_kernel_conf.de.md index 3288ed13fb..1edb760649 100644 --- a/docs/gemstones/core/view_kernel_conf.de.md +++ b/docs/gemstones/core/view_kernel_conf.de.md @@ -49,7 +49,7 @@ RHEL und Derivate (Fedora, CentOS Stream, Scientific Linux, RockyLinux, Almalinu /boot/config- ``` -Um die aktuell laufende Kernelkonfiguration auf einen bestimmten Wert zu überprüfen: +So überprüfen Sie die aktuell ausgeführte Kernelkonfiguration auf einen bestimmten Wert: ```bash cat /boot/config-$(uname -r) | grep -i @@ -100,7 +100,7 @@ Diese Datei wird häufiger durch einen symlinked Pfad aufgerufen, der von den `k /lib/modules//build/ -> /usr/src/kernels// ``` -Wenn Sie `kernel-debug-devel` Pakete installiert haben, haben Sie auch dieses Verzeichnis: +Wenn Sie `kernel-debug-devel`-Pakete installiert haben, verfügen Sie auch über dieses Verzeichnis: ```bash /usr/src/kernels/+debug/ diff --git a/docs/gemstones/dnf-swap.de.md b/docs/gemstones/dnf-swap.de.md index 6ade3016a0..fae88fb1d2 100644 --- a/docs/gemstones/dnf-swap.de.md +++ b/docs/gemstones/dnf-swap.de.md @@ -1,5 +1,5 @@ - - - -title: DNF — swap-Befehl
    author: wale soyinka
    contributors: https://crowdin.com/project/rockydocs/activity-stream
    date: 2025-09-05 19h22
    tags: +title: dnf — swap-Befehl
    author: wale soyinka
    Translations: [https://crowdin.com/project/rockydocs](https://crowdin.com/project/rockydocs)
    Translators: [https://crowdin.com/project/rockydocs/activity-stream](https://crowdin.com/project/rockydocs/activity-stream)
    date: 2025-09-11 20h19
    tags:
    - cloud images - container - dnf diff --git a/docs/gemstones/git/fork_and_branch_workflow.de.md b/docs/gemstones/git/fork_and_branch_workflow.de.md new file mode 100644 index 0000000000..eca13b0fd1 --- /dev/null +++ b/docs/gemstones/git/fork_and_branch_workflow.de.md @@ -0,0 +1,115 @@ +--- +title: Git-Workflow für Fork und Branch +author: Wale Soyinka +contributors: Ganna Zhyrnova +tags: + - GitHub + - git + - gh + - git fetch + - git add + - git pull + - git checkout + - gh repo +--- + +## Fork und Branch Workflow + +Bei diesem Workflow-Typ verzweigen Mitwirkende das Haupt-Repository in ihr eigenes GitHub-Konto, erstellen Feature-Branches für ihre Arbeit und übermitteln dann Beiträge über Pull Requests aus diesen Branches. + +Dieses Gemstone führt Sie durch die Einrichtung eines lokalen Repositorys, um zu einem GitHub-Projekt beizutragen. Es beginnt mit der ersten Projektaufspaltung, dem Einrichten eines lokalen und eines Remote-Repositorys, dem Übernehmen von Änderungen und dem Erstellen einer Pull Request (PR) zum Einreichen Ihrer Beiträge. + +## Voraussetzungen + +- Ein Github-Konto. +- `git` und `GitHub CLI (gh)` sind auf Ihrem System installiert. +- Ein persönlicher Fork des Projekts auf GitHub. + +## Prozedur + +1. Falls es noch nicht vorhanden ist, erstellen Sie mit dem Dienstprogramm `gh` einen Fork des Projekts. Geben Sie bitte Folgendes ein: + + ```bash + gh repo fork rocky-linux/documentation --clone=true --remote=true + ``` + + Die in diesem _gh repo fork_-Befehl verwendeten Optionen sind: + + - `--clone=true`: Klont das Fork-Repository auf Ihren lokalen Computer. + - `--remote=true`: Fügt das ursprüngliche Repository als Remote hinzu, sodass Sie zukünftige Updates synchronisieren können. + +2. Navigieren Sie zum lokalen Repository-Verzeichnis. Geben Sie bitte Folgendes ein: + + ```bash + cd documentation + ``` + +3. Überprüfen Sie, ob alle relevanten Remote-Repositorys in Ihrem lokalen Repository ordnungsgemäß konfiguriert wurden. Geben Sie Folgendes ein: + + ```bash + git remote -vv + ``` + +4. Holen Sie sich die neuesten Änderungen vom Upstream-Remote: + + ```bash + git fetch upstream + ``` + +5. Erstellen und checken Sie einen neuen Feature-Branch mit dem Namen `your-feature-branch` aus: + + ```bash + git checkout -b your-feature-branch + ``` + +6. Nehmen Sie Änderungen vor, fügen Sie neue Dateien hinzu und übertragen Sie Ihre Änderungen in Ihr lokales Repository: + + ```bash + git add . + git commit -m "Your commit message" + ``` + +7. Synchronisieren Sie das Repo mit dem Hauptzweig des Remote-Repos mit dem Namen `upstream`: + + ```bash + git pull upstream main + ``` + +8. Übertragen Sie Push-Änderungen an Ihren Fork\*\*: + + ```bash + git push origin your-feature-branch + ``` + +9. Erstellen Sie abschließend einen Pull Request (PR) mit der CLI-Anwendung `gh`: + + ```bash + gh pr create --base main --head your-feature-branch --title "Your PR Title" --body "Description of your changes" + ``` + + Die in diesem `gh pr create`-Befehl verwendeten Optionen sind: + + `--base` main: Gibt den Basiszweig im Upstream-Repository an, in dem die Änderungen mit `merge` zusammengeführt werden. + `--head` your-feature-branch: Gibt den Head-Branch Ihres Forks an, der die Änderungen enthält. + `--title` "Ihr PR-Titel": Legt den Titel für das Pull Request fest. + `--body` "Beschreibung Ihrer Änderungen": Bietet eine detaillierte Beschreibung der Änderungen im Pull Request. + +## Zusammenfassung + +Der Fork-and-Branch-Workflow ist eine weitere gängige Zusammenarbeitstechnik. +Die wichtigsten Schritte sind: + +1. Der Fork-and-Branch-Workflow ist eine weitere gängige Zusammenarbeitstechnik. +2. Den Fork klonen: Klonen Sie Ihren Fork für Entwicklungsarbeiten auf Ihren lokalen Computer. +3. Upstream-Remote festlegen: Um über die Änderungen auf dem Laufenden zu bleiben, fügen Sie das ursprüngliche Projekt-Repository als `upstream`-Remote hinzu. +4. Feature Branch erstellen: Erstellen Sie für jede neue Funktion oder Korrektur einen neuen Branch aus dem aktualisierten Main Branch. Der Name der Branch sollte die Funktion oder den Fix beschreiben. +5. Commit der Änderungen: Nehmen Sie Ihre Änderungen vor und `commit`en Sie sie mit klaren und präzisen `Commit`-Nachrichten fest. +6. Mit Upstream synchronisieren: Synchronisieren Sie Ihren Fork und Feature-Branch regelmäßig mit dem Upstream-Main-Branch, um neue Änderungen zu integrieren und `merge`-Konflikte zu reduzieren. +7. Erstellen Sie einen Pull Request (PR): Pushen Sie Ihren Feature-Branch zu Ihrem Fork auf GitHub und öffnen Sie einen PR für das Hauptprojekt. Ihre PR sollte die Änderungen klar beschreiben und auf alle relevanten Probleme verweisen. +8. Auf Feedback reagieren: Arbeiten Sie gemeinsam an der Überprüfung des Feedbacks, bis der PR zusammengeführt oder geschlossen wird. + +Vorteile: + +- Isoliert die Entwicklungsarbeit auf bestimmte Zweige und hält den Hauptzweig sauber. +- Es erleichtert das Review und die Integration von Änderungen. +- Reduziert das Risiko von Konflikten mit der sich entwickelnden Codebasis des Hauptprojekts. diff --git a/docs/gemstones/htop.de.md b/docs/gemstones/htop.de.md index 49c26d7e5e..9d4bc64ab0 100644 --- a/docs/gemstones/htop.de.md +++ b/docs/gemstones/htop.de.md @@ -94,7 +94,7 @@ Drücken Sie ++f1++ in der interaktiven Schnittstelle, um die entsprechende Tast ### Andere häufige Anwendungsfälle -Um den Prozess zu verwalten, verwenden Sie die F9 Taste, um verschiedene Signale an den Prozess zu senden. Die Liste der Signale finden Sie mit dem Kommando `kill -l`. Die am häufigsten verwendeten sind: +Um den Prozess zu verwalten, verwenden Sie die Taste ++f9++ und so verschiedene Signale an den Prozess zu senden. Die Liste der Signale finden Sie mit dem Kommando `kill -l`. Die am häufigsten verwendeten sind: | Signal | Beschreibung | | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | diff --git a/docs/gemstones/markdown-demo-v2.de.md b/docs/gemstones/markdown-demo-v2.de.md index b77c61a164..959c90ee59 100644 --- a/docs/gemstones/markdown-demo-v2.de.md +++ b/docs/gemstones/markdown-demo-v2.de.md @@ -16,7 +16,7 @@ tags: - Verwendung von [Markdown](https://daringfireball.net/projects/markdown). - 'markdown'-Kenntnisse. -Diese Anleitung demonstriert gängige Markdown-Auszeichnungselemente, die wir auf den Seiten [https://docs.rockylinux.org](https://docs.rockylinux.org) verwenden, sowie das Admonitions-Element, das nicht im Standard-Markdown enthalten ist. +Diese Anleitung demonstriert gängige Markdown-Auszeichnung-Elemente, die wir auf den Seiten [https://docs.rockylinux.org](https://docs.rockylinux.org) verwenden, sowie das `Admonition`-Element, das nicht im Standard-Markdown enthalten ist. ## Die Demo diff --git a/docs/gemstones/network/mtr.de.md b/docs/gemstones/network/mtr.de.md index 5ad2d004ab..1445cfb132 100644 --- a/docs/gemstones/network/mtr.de.md +++ b/docs/gemstones/network/mtr.de.md @@ -1,5 +1,5 @@ --- -title: mtr — Netzwerk–Diagnose +title: mtr — Netzwerk-Diagnose author: tianci li contributors: Steven Spencer, Neel Chauhan date: 2021-10-20 diff --git a/docs/gemstones/sed_search_replace.de.md b/docs/gemstones/sed_search_replace.de.md index 967e69be37..0bee9c7fbd 100644 --- a/docs/gemstones/sed_search_replace.de.md +++ b/docs/gemstones/sed_search_replace.de.md @@ -45,7 +45,7 @@ Sie können auch vollständige Anführungszeichen anstelle von einfachen Anführ ## Mehrere Dateien -Leider hat `sed` keine Inline-Looping-Option wie `perl`. Um mehrere Dateien zu durchlaufen, müssen Sie Ihren `sed`-Befehl in einem Skript kombinieren. Hier ist ein Beispiel dafür. +Leider verfügt `sed` nicht über eine Inline-Schleifenoption wie `perl`. Um mehrere Dateien zu durchlaufen, müssen Sie Ihren `sed`-Befehl in einem Skript kombinieren. Hier ist ein Beispiel dafür. Erstellen Sie zunächst eine Liste der Dateien, die das Skript verwenden soll. Tun Sie dies von der Befehlszeile aus mit Folgendem: diff --git a/docs/gemstones/string_color.de.md b/docs/gemstones/string_color.de.md new file mode 100644 index 0000000000..f034b29b45 --- /dev/null +++ b/docs/gemstones/string_color.de.md @@ -0,0 +1,94 @@ +--- +title: bash — Zeichenketten-Farbe +author: tianci li +contributors: Steven Spencer +tested_with: 8.6, 9.0 +tags: + - bash + - Farben +--- + +# Einleitung + +Wenn wir Bash-Skripte herunterladen, die von anderen geschrieben wurden, werden manchmal einige Zeichenketten mit speziellen Farben gekennzeichnet. Wie kann dieser Effekt in einem bash-Skript erreicht werden? + +## Schriftfarbe + +| **Farbcode** | **Beschreibung** | +|:------------:|:----------------:| +| 30 | schwarz | +| 31 | rot | +| 32 | grün | +| 33 | gelb | +| 34 | blue | +| | lila | +| 36 | dunkelgrün | +| 37 | weiß | + +## Hintergrundfarbe der Schrift + +| **Hintergrundfarbcode** | **Beschreibung** | +|:-----------------------:|:----------------:| +| 40 | schwarz | +| 41 | crimson | +| 42 | grün | +| 43 | gelb | +| 44 | blau | +| 45 | lila | +| 46 | dunkelgrün | +| 47 | weiß | + +## Anzeigemodus + +| **Code** | **Beschreibung** | +|:--------:|:------------------------------:| +| 0 | Terminal-Standardeinstellungen | +| 1 | Hervorhebung | +| 4 | Unterstrichen | +| 5 | Cursor blinkt | +| 7 | Anzeige umkehren | +| 8 | Ausblenden | + +## Ausführungsmodus + +* **\033[1;31;40m** `1` gibt den Anzeigemodus an, der optional ist. „31“ gibt die Schriftfarbe an. `40m` gibt die Hintergrundfarbe der Schrift an + +* **\033[0m** Stellt die Standardfarbe des Terminals wieder her, d. h., hebt die Farbeinstellung auf + +## Skript-Beispiel + +Sie können ein Skript schreiben, um die Farbänderung zu testen, z.B.: + +```bash +#!/bin/bash +# Font color cycle +for color1 in {31..37} + do + echo -e "\033[0;${color1};40m---hello! Rocky---\033[0m" + done + +echo "-------" + +# Background color cycle +for color2 in {40..47} + do + echo -e "\033[30;${color2}m---hello! Rocky---\033[0m" + done + +echo "-------" + +# Cycle of display mode +for color3 in 0 1 4 5 7 8 + do + echo -e "\033[${color3};37;40m---hello! Rocky---\033[0m" + done +``` + +```bash +Shell > chmod a+x color_set.sh +Shell > ./color_set.sh +``` + +So sieht das Ergebnis aus: + +![Bild1](./images/string_color_image1.png) diff --git a/docs/index.de.md b/docs/index.de.md index a534738714..df4238e3c3 100644 --- a/docs/index.de.md +++ b/docs/index.de.md @@ -54,4 +54,4 @@ Wenn Sie nicht weiter kommen oder Fragen haben, ist die Rocky Linux Community da ## Mitwirkung -Haben Sie festgestellt, dass etwas fehlt? Haben Sie einen Fehler gefunden? Sie fragen sich, wie Sie ein eigenes Dokument erstellen oder wie Sie etwas hier reparieren oder anpassen können? Haben wir nicht gesagt, dass *Sie*, wenn Sie möchten, Teil der Rocky Linux Community sind? Nun, das bedeutet, dass *Sie* für uns wichtig sind und wir gern möchten, dass Sie sich uns anschließen und helfen diese Dokumentation zu verbessern. Wenn Sie daran interessiert sind, schauen Sie im [Contribution Guide](https://github.com/rocky-linux/documentation/blob/main/README.md) nach! +Haben Sie festgestellt, dass etwas fehlt? Haben Sie einen Fehler gefunden? Sie fragen sich, wie Sie ein eigenes Dokument erstellen oder wie Sie etwas hier reparieren oder anpassen können? Haben wir nicht gesagt, dass *Sie*, wenn Sie möchten, Teil der Rocky Linux Community sind? Nun, das bedeutet, dass *Sie* für uns wichtig sind und wir gern möchten, dass Sie sich uns anschließen und helfen diese Dokumentation zu verbessern. Wenn Sie daran interessiert sind, schauen Sie im [Contribution Guide](https://github.com/rocky-linux/documentation/blob/main/README.md) nach!

    Translations: crowdin.com/project/rockydocs

    Translators: crowdin.com/project/rockydocs/activity-stream
    diff --git a/docs/index.fr.md b/docs/index.fr.md index c7f6b561d9..4bc3e14d30 100644 --- a/docs/index.fr.md +++ b/docs/index.fr.md @@ -31,7 +31,7 @@ Les sections principales du site de documentation sont : ### Multilingue -Dans l'équipe Rocky Linux, nous voulons rendre le site de documentation accessible à autant de monde que possible — *la traduction dans différentes langues est importante pour cela*. Si vous cliquez sur le sélecteur de langue (symbole `文A`, wén-A) dans le menu supérieur, vous verrez les langues dans lesquelles le site est disponible. Il y a deux parties à cela : +Dans l'équipe Rocky Linux, nous voulons rendre le site de documentation accessible à autant de monde que possible — *la traduction dans différentes langues est importante pour cela*. Si vous cliquez sur le sélecteur de langue (symbole `文A`, `wén-A`) dans le menu supérieur, vous verrez les langues dans lesquelles le site est disponible. Il y a deux parties à cela : 1. Traduction de l'interface du site web : si vous choisissez une autre langue, par exemple le Français, vous noterez que l'interface, par exemple les boutons de navigation `Suivant` et `Précédent` seront traduits. 1. Contenu : [la traduction du contenu est une tâche](https://crowdin.com/project/rockydocs/activity-stream) (https://crowdin.com/project/rockydocs/activity-stream) [en cours](https://crowdin.com/project/rockydocs). @@ -63,4 +63,4 @@ Si vous êtes coincé et que vous avez une question, la communauté Rocky Linux ## Votre Contribution -Avez-vous trouvé quelque chose de manquant ? Avez-vous trouvé une erreur ? Vous vous demandez comment créer votre propre document ou comment en corriger un ? Rappelez-vous lorsque nous avons dit que *vous* étiez la communauté Rocky Linux ? Eh bien, cela signifie que *vous* êtes important pour nous et nous voulons que vous nous rejoigniez, si vous le souhaitez, et aider à améliorer cette documentation. Si cela vous intéresse, rendez-vous sur notre [Guide de Contribution](https://github.com/rocky-linux/documentation/blob/main/README.md) pour savoir comment faire ! +Avez-vous trouvé quelque chose de manquant ? Avez-vous trouvé une erreur ? Vous vous demandez comment créer votre propre document ou comment en corriger un ? Rappelez-vous lorsque nous avons dit que *vous* étiez la communauté Rocky Linux ? Cela signifie que *vous* êtes important pour nous et nous voulons que vous nous rejoigniez, si vous le voulez, et que vous nous aidiez à améliorer cette documentation. Si cela vous intéresse, rendez-vous sur notre [Guide de Contribution](https://github.com/rocky-linux/documentation/blob/main/README.md) pour savoir comment faire !

    Traductions: https://crowdin.com/project/rockydocs

    Traducteurs: https://crowdin.com/project/rockydocs/activity-stream
    From e1b19a7cdbfedc20ad2e658b4db0333690aadf4a Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Fri, 12 Sep 2025 17:01:24 -0500 Subject: [PATCH 139/164] Remove the example for the use of tabbed content for separating out major version instructions. (#2875) * with the release of documentation versioning, this is no-longer necessary or wanted. --- .../guides/contribute/rockydocs_formatting.md | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/docs/guides/contribute/rockydocs_formatting.md b/docs/guides/contribute/rockydocs_formatting.md index 9d4f33083c..aba27d6480 100644 --- a/docs/guides/contribute/rockydocs_formatting.md +++ b/docs/guides/contribute/rockydocs_formatting.md @@ -175,26 +175,28 @@ Which looks like this in your editor: ## Tabbed content within a document -Formatting tabbed content is similar to admonitions. Instead of three exclamation marks or question marks, it begins with three equal signs. All the admonition formatting (4 spaces and so on) applies to this content. For example, a document might need a different procedure for a different Rocky Linux version. When using tabbed content for versions, the most recent release of Rocky Linux should come first. At the time of this writing, it was 9.0: +Formatting tabbed content is similar to admonitions. Instead of three exclamation marks or question marks, it begins with three equal signs. All the admonition formatting (4 spaces and so on) applies to this content. For example, a document might need a different procedure based on how the operating system was installed. With the implementation of documentation versioning, tabbed content formatting should not be necessary to separate out full version content (for instance, 9.6 and 8.10). -=== "9.0" +=== "9" - The procedure for doing this in 9.0 + Use this procedure if your installation was by way of the full operating system, or from a Live image. -=== "8.6" +=== "9-minimal" - The procedure for doing this in 8.6 + Use this procedure if your operating system installation was with the minimal ISO. Which would look like this in your editor: ```text -=== "9.0" +=== "9" - The procedure for doing this in 9.0 -=== "8.6" + Use this procedure if your installation was by way of the full operating system, or from a Live image. - The procedure for doing this in 8.6 +=== "9-minimal" + + Use this procedure if your operating system installation was with the minimal ISO. + ``` Remember that everything that falls inside of the section must continue to use the 4-space indentation until completion of the section. This is a very handy feature! From fa0e41073dbcfae533b76c6120580ead3f1bb5ed Mon Sep 17 00:00:00 2001 From: tianci li <86754294+jimcat8@users.noreply.github.com> Date: Sat, 13 Sep 2025 06:04:03 +0800 Subject: [PATCH 140/164] Expand IP knowledge (#2855) * Expand IP knowledge * Update 12-network.md Fix unneeded capitalization * Update 12-network.md * Add corresponding pictures and append the datagram content * update01 * Complete the content of IPv6 datagrams * update02 * check --------- Co-authored-by: sspencerwire --- docs/books/admin_guide/12-network.md | 186 +++++++++++++++++- docs/books/admin_guide/images/IPv4-packet.png | Bin 0 -> 54630 bytes .../admin_guide/images/IPv6-basic-header.png | Bin 0 -> 50115 bytes .../images/IPv6-extension-header.png | Bin 0 -> 56098 bytes 4 files changed, 176 insertions(+), 10 deletions(-) create mode 100644 docs/books/admin_guide/images/IPv4-packet.png create mode 100644 docs/books/admin_guide/images/IPv6-basic-header.png create mode 100644 docs/books/admin_guide/images/IPv6-extension-header.png diff --git a/docs/books/admin_guide/12-network.md b/docs/books/admin_guide/12-network.md index 9323a63ede..ddfbaaa6b1 100644 --- a/docs/books/admin_guide/12-network.md +++ b/docs/books/admin_guide/12-network.md @@ -119,27 +119,193 @@ There are also specific addresses within a network, which must be identified. Th These two addresses that play special roles **cannot** be assigned to the terminal machine for use. -### MAC address / IP address +### MAC address and IP address A **MAC address** is a physical identifier written in the factory onto the device. This is sometimes referred to as the hardware address. It consists of 6 bytes often given in hexadecimal form (for example 5E:FF:56:A2:AF:15). -It is composed of: 3 bytes of the manufacturer identifier and 3 bytes of the serial number. + +These 6 bytes respectively represent: + +* The first three bytes represent manufacturer identifier . This identifier is called OUI (Organizationally Unique Identifier). +* The last three bytes represent the serial number allocated by the manufacturer. !!! Warning - This last statement is nowadays a little less true with virtualization. There are also software solutions for changing the MAC address. + The MAC address is hardcoded when the hardware leaves the factory. There are two main methods to modify it: + + * Firmware-level modification (permanent): Requires advanced tools that can directly rewrite the MAC address in the network card's ROM. Such tools are typically only available to hardware manufacturers. + * Software-level spoofing (temporary): Modifies how the MAC address appears to the operating system. These changes are usually reset after a system reboot. The MAC address of the virtual network card in the virtual host is also implemented through spoofing. + +An Internet Protocol (**IP**) address is an identification number permanently or temporarily assigned to each device connected to a computer network using the Internet Protocol. The IP address and subnet mask must appear in pairs, which is determined by the basic principles of network communication. Through the subnet mask, we can know the current IP address: + +* network bits and host bits +* NetID or SubnetID +* HostID +* network address +* broadcast address + +IP addresses are classified based on the version field in the packet as follows: + +* **IPv4‌** - (4 bits, 0100). The available quantity of IPv4 is 232 (known from the source and destination address fields in IPv4 packets). Specifically divided into: + + * Class A address. Its range is from **0.0.0.0** to **127.255.255.255** + * Class B address. Its range is from **128.0.0.0** to **191.255.255.255** + * Class C address. Its range is from **192.0.0.0** to **223.255.255.255** + * Class D address. Its range is from **224.0.0.0** to **239.255.255.255** + * Class E address. Its range is from **240.0.0.0** to **255.255.255.255** + + Among them, Class A addresses, Class B addresses, and Class C addresses all have their own private address ranges. 0.0.0.0 is a reserved address and is not assigned to the host. Class D addresses are used for multicast communication and are not assigned to hosts. Class E addresses are reserved and not used for regular networks. + +* **IPv6** - (4 bits, 0110). The available quantity of IPv6 is 2128 (known from the source and destination address fields in IPv6 packets). Specifically divided into: + + * Unicast address. Include Link-local unicast address (LLA), Unique local address (ULA), Global unicast address (GUA), Loopback address, Unspecified address + * Anycast address + * Multicast address + +Description of writing format for 128 bits IPv6: + +* Preferred writing format - **X:X:X:X:X:X:X:X**. In this writing format, 128 bit IPv6 addresses are divided into 8 groups, each represented by 4 hexadecimal values (0-9, A-F), separated by colons (`:`) between groups. Each "X" represents a set of hexadecimal values. For example **2001:0db8:130F:0000:0000:09C0:876A:130B**. + + * Omitting the leading 0 - For the convenience of writing, the leading "0" in each group can be omitted, so the above address can be abbreviated as **2001:db8:130F:0:0:9C0:876A:130B**. + * Use double colon - If the address contains two or more consecutive groups that are both 0, a double colon can be used instead. So the above address can be further abbreviated as **2001:db8:130F::9C0:876A:130B**. Attention! A double colons can only appear once in an IPv6 address. + +* Compatible with writing formats - **X:X:X:X:X:X:d.d.d.d**. In a mixed network environment, this format ensures compatibility between IPv6 nodes and IPv4 nodes. For example **0:0:0:0:0:ffff:192.1.56.10** and **::ffff:192.1.56.10/96**. + +In a web address or URL (Uniform Resource Locator), an IP address can be followed by a colon and the port address (which indicates the application to which the data is destined). Also to avoid confusion in a URL, the IPv6 address is written in square brackets (For example `[2001:db8:130F::9C0:876A:130B]:443`). + +As mentioned earlier, subnet masks divide IPv4 addresses into two parts: network bits and host bits. In IPv6, subnet masks also have the same function, but the name has changed ("n" represents the number of bits occupied by the subnet mask): + +* Network prefix - It is equivalent to the network bits in an IPv4 address. According to the subnet mask, occupy "n" bits. +* Interface ID - It is equivalent to the host bits in an IPv4 address. According to the subnet mask, occupy "128-n" bits. + +For example **2001:0db8:130F:0000:0000:09C0:876A:130B/64**: + +``` + Network prefix +|<- 64 bits ->| + + Interface ID + |<- 64 bits ->| +2001:0db8:130F:0000 : 0000:09C0:876A:130B +``` + +In the same network, IP addresses must be unique, which is a fundamental rule of network communication. In the same LAN (Local Area Network), the MAC address must be unique. + +### IPv4 packet structure + +IPv4 packets contain both header and data parts: + +![](./images/IPv4-packet.png) + +**Version**: Help routers identify protocol versions. For IPv4, the value here is 0100 (Binary 0100 is equivalent to decimal 4) + +**IHL**: A field used to control the length of the header. When the "Options" field is not included, the minimum value is 5 (Namely binary 0101), at this time, the head occupies 20 bytes. The maximum value is 15 (Namely binary 1111), and the length of the header is 60 bytes. + +``` +The actual length of IPv4 header = The value of the IHL field * 4 +``` + +**Type of Service**: This field is used to define the QoS (Quality Of Service) and priority of data packets. This field is now mainly used for DSCP (Differentiated Services Code Point) and ECN (Explicit Congestion Notification). + +**Total Length**: Represents the total length of the entire IPv4 datagram (IPv4 packet) in bytes. + +!!! note + + IP packet and IP datagram are technically different expressions of the same concept, both referring to data units transmitted at the network layer. + +**Identification**: Identifies all fragments of an IPv4 datagram. All fragments from the same original datagram share the same Identification value to enable correct reassembly. + +**Flags**: It is used to control the behavior of IPv4 datagram fragmentation. In order from left to right: + +* The first bit - Not used, value 0 +* The second bit - DF (Don’t Fragment). If DF=1, it means that the IPv4 datagram must be transmitted in its entirety. If it exceeds MTU, it is discarded and an ICMP error is returned (such as "Fragmentation Needed"). If DF=0, the router splits the IPv4 datagram into multiple fragments, each of which carries the same ‌Identification‌ field value +* The third bit - MF (More Fragment). If MF=1, it means that the current fragment is not the last one and there are other fragments; If MF=0, it means this is the last fragment + +**Fragment Offset**: Indicate the relative position of the fragment in the original IPv4 datagram, in units of 8 bytes. This field is mainly used for fragment reassembly. + +**TTL (Time To Live)**: This field is used to limit the maximum survival time or maximum hop count of datagrams in the network. The initial value is determined by the sender, and the TTL decreases by 1 every time it passes through the router. When TTL=0, the datagram is discarded. + +**Protocol**: Indicates the protocol type used by the data carried in this datagram. Its value range is 0-255.For example, the protocol number of TCP is 6, that of UDP is 17, that of ICMP is 1. + +**Header Checksum**: This field will be recalculated every time the datagram passes through the router, mainly due to the decreasing TTL field causing changes in the header. This field only verifies the header (excluding the data part). If other fields remain unchanged and only the TTL changes, the checksum will be updated to a new value (non-zero) to ensure that the header has not been tampered with or damaged during transmission. + +**Source address**: IPv4 address of the datagram sender + +**Destination address**: IPv4 address of the datagram receiver + +**Options**: Optional field, with a length range of 0-40 bytes. It is only used when the IHL is greater than 5. The length of this field must be an integer multiple of 4 bytes (if the length is less than 4 bytes, use the **padding** field for padding). + +!!! tip + + Bit has two meanings. In information theory, it refers to the fundamental unit of information, representing one binary choice (0 or 1). In computer science, it is the smallest unit of data storage, where 8 bits typically equal 1 byte unless specified otherwise. + +### IPv6 packet structure + +IPv6 datagrams consist of three parts: + +* Basic Header +* Extension Header +* Upper Layer Protocol Data Unit + +In some books, the Extended Header and Upper Layer Protocol Data Unit are collectively referred to as the **Payload**. + +![](./images/IPv6-basic-header.png) + +The fixed length of the Basic Header is 40 bytes and it is fixed to 8 fields: + +**Version**: Help routers identify protocol versions. For IPv6, the value here is 0110 (Binary 0110 is equivalent to decimal 6). + +**Traffic Class**: Equivalent to the TOS (Type Of Service) field in IPv4 datagrams. This field is used to define the QOS (Quality Of Service) and priority of data packets. + +**Flow Label**: This IPv6 new field is used to control packet flow. A non-zero value in this field means that the packet should be treated specially; i.e., the packet should not be sent through different routes to reach the destination but rather use the same path. An advantage to this is that the receiving end doesn’t have to reorder the package, thus speeding the process. This field helps avoid reordering data packets and is specifically designed for streaming media/live media. + +**Payload Length**: Indicate the size of the payload. This field can only represent a Payload with a maximum length of 65535 bytes. In case the length of the payload is greater than 65535 bytes, then the payload length field will be set to 0 and the jumbo payload option is used in the Hop-by-Hop Options Extension Header. + +**Next Header**: Used to indicate the type of packet header after the basic header. If there is a first extension header, it represents the type of the first extension header. Otherwise, it represents the protocol type used by the upper layer, such as 6 (TCP) and 17 (UDP). + +**Hop Limit**: This field is equivalent to Time To Live (TTL) in IPv4 datagrams. + +**Source Address**: This field represents the address of the IPv6 datagram sender. + +**Destination Address**: This field represents the address of the IPv6 datagram receiver. + +![](.//images/IPv6-extension-header.png) + +In IPv4 datagrams, the IPv4 header contains optional fields such as Options, which include Security, Timestamp, Record Route, etc. These Options can expand the length of the IPv4 header from 20 bytes to 60 bytes. During the forwarding process, handling IPv4 datagrams carrying these Options can consume a significant amount of device resources, so it is rarely used in practice. + +IPv6 removes these Options from the IPv6 basic header and places them in the extension header, which is placed between the IPv6 Basic Header and the Upper Layer Protocol Data Unit. + +An IPv6 packet can contain 0, 1, or multiple extension headers, which are only added by the sender when special processing is required by the device or destination node. + +Unlike the IPv4 Options field (which can be extended up to 40 bytes and requires continuous storage), the IPv6 Extension Header adopts a chain structure and has no fixed length limit, making it more scalable in the future. Its 8 byte alignment mechanism is implemented through the Next Header field, which ensures processing efficiency and avoids fragmentation overhead. + +**Next Header**: This field has the same function as the Next Header field in the Basic Header. + +**Extension Header Len**: Indicate the length of the extension header (excluding the length of the Next Header). -An Internet Protocol (**IP**) address is an identification number permanently or temporarily assigned to each device connected to a computer network using the Internet Protocol. -One part defines the network address (NetID or SubnetID as the case may be), the other part defines the address of the host in the network (HostID). The relative size of each part varies according to the network (sub)mask. +**Extension Head Data**: The content of the Extension Header is a combination of a series of option fields and padding fields. -An IPv4 address defines an address on 4 bytes. The number of available addresses being close to saturation a new standard was created, the IPv6 defined on 16 bytes. +Currently, RFC defines the following types of Extension Headers: -IPv6 is often represented by 8 groups of 2 bytes separated by a colon. Insignificant zeros can be omitted, one or more groups of 4 consecutive zeros can be replaced by a double colon. +* Hop-by-Hop Options header (Next Header Field Value is 0) - Must be handled by all routers in the path. +* Destination Options header (Next Header Field Value is 60) - Only processed by the destination node. +* Routing header (Next Header Field Value is 43) - This Extension Header is similar to the Loose Source and Record Route options in IPv4. +* Fragment header (Next Header Field Value is 44) - Like IPv4 packets, the length of IPv6 packets to be forwarded cannot exceed the maximum transmission unit (MTU). When the packet length exceeds the MTU, the packet needs to be fragmented. In IPv6, the Fragment header is used by an IPv6 source node to send a packet larger than the MTU. +* Authentication header (Next Header Field Value is 51) - IPSec uses this header to provide data origin authentication, data integrity check, and packet anti-replay functions. It also protects some fields in the IPv6 basic header. +* Encapsulating Security Payload header (Next Header Field Value is 50) - This header provides the same functions as the Authentication header plus IPv6 packet encryption. -Subnet masks have from 0 to 128 bits. (for example 21ac:0000:0000:0611:21e0:00ba:321b:54da/64 or 21ac::611:21e0:ba:321b:54da/64) +RFC specifies that when multiple extension headers are used in the same datagram, it is recommended that these headers appear in the following order: -In a web address or URL (Uniform Resource Locator), an ip address can be followed by a colon and the port address (which indicates the application to which the data is destined). Also to avoid confusion in a URL, the IPv6 address is written in square brackets [ ], colon, port address. +1. IPv6 Basic Header +2. Hop-by-Hop Options header +3. Destination Options header +4. Routing header +5. Fragment header +6. Authentication header +7. Encapsulating Security Payload header +8. Destination Options header +9. Upper-layer protocol header -IP and MAC addresses must be unique on a network! +Except for the Destination Option Header which may appear once or twice (once before the Routing Extension header and once before the Upper-layer protocol header), all other extension headers can only appear once. ### DNS Domain diff --git a/docs/books/admin_guide/images/IPv4-packet.png b/docs/books/admin_guide/images/IPv4-packet.png new file mode 100644 index 0000000000000000000000000000000000000000..d0cf5eeaa16f13a608d8cba9d50e0b9549b41fce GIT binary patch literal 54630 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 Oo~md*Dt=)8`hNffi*^?P literal 0 HcmV?d00001 diff --git a/docs/books/admin_guide/images/IPv6-basic-header.png b/docs/books/admin_guide/images/IPv6-basic-header.png new file mode 100644 index 0000000000000000000000000000000000000000..b365135e8db7c0537e39ef47f465831a1549eaf2 GIT binary patch literal 50115 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

    _G&gZ^w#@rJH6dn-y**|Yv)#-* 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 ob5g(8t0Y5|_nE(I) literal 0 HcmV?d00001 diff --git a/docs/books/admin_guide/images/IPv6-extension-header.png b/docs/books/admin_guide/images/IPv6-extension-header.png new file mode 100644 index 0000000000000000000000000000000000000000..bb43ccdeff2ea007cfd260f0b9066e49ed284e09 GIT binary patch literal 56098 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

    !eDD)wyn`rJbQM5B}pL`$F{F+vz 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 literal 0 HcmV?d00001 From 1ba8cdae3130aef79a4000bc228b6f1fa3ae7392 Mon Sep 17 00:00:00 2001 From: wale soyinka Date: Fri, 12 Sep 2025 23:52:54 -0400 Subject: [PATCH 141/164] rockydocs: start over engineering. add initial rockydocs.sh and changelog tool integration (bump to 1.0.0-13.el10) (#2876) --- rockydocs.sh | 460 +++++++++ tools/CHANGELOG.md | 8 + tools/docker-compose.yml | 127 +++ tools/mkdocs-docker.yml | 110 ++ tools/requirements-dev.txt | 74 ++ tools/rockydocs-changelog.sh | 375 +++++++ tools/rockydocs-functions.sh | 1819 ++++++++++++++++++++++++++++++++++ tools/test_rockydocs.sh | 810 +++++++++++++++ 8 files changed, 3783 insertions(+) create mode 100755 rockydocs.sh create mode 100644 tools/CHANGELOG.md create mode 100644 tools/docker-compose.yml create mode 100644 tools/mkdocs-docker.yml create mode 100644 tools/requirements-dev.txt create mode 100755 tools/rockydocs-changelog.sh create mode 100755 tools/rockydocs-functions.sh create mode 100755 tools/test_rockydocs.sh diff --git a/rockydocs.sh b/rockydocs.sh new file mode 100755 index 0000000000..33a8a08cd8 --- /dev/null +++ b/rockydocs.sh @@ -0,0 +1,460 @@ +#!/bin/bash + +set -e + +# Rocky Linux Documentation - Master Contributor Script +# Production-ready script with NEVRA versioning and modular architecture +# +# Author: Wale Soyinka +# Changelog: tools/CHANGELOG.md +# + +VERSION="1.0.0" +RELEASE="13.el10" +AUTHOR="Wale Soyinka" +FULL_VERSION="rockydocs-${VERSION}-${RELEASE}" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +CONTENT_DIR="$SCRIPT_DIR" +REPO_NAME="$(basename "$CONTENT_DIR")" +INITIAL_PWD="$(pwd)" # Preserve the directory where script was invoked + +# Configuration management +CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/rockydocs" +CONFIG_FILE="$CONFIG_DIR/config" + +# Source function library +source "$(dirname "${BASH_SOURCE[0]}")/tools/rockydocs-functions.sh" + +# Load saved workspace configuration +load_workspace_config + +# Initialize workspace directories +WORKSPACE_BASE_DIR="${SAVED_WORKSPACE_BASE_DIR:-$(dirname "$CONTENT_DIR")/rockydocs-workspaces}" +APP_DIR="$WORKSPACE_BASE_DIR/docs.rockylinux.org" +APP_COMPAT_LINK="$WORKSPACE_BASE_DIR/app" + +# Dependency check (NEW v12) +check_dependencies() { + local missing_deps=() + local required_commands=("git" "python3" "lsof" "pgrep" "jq" "curl") + + for cmd in "${required_commands[@]}"; do + if ! command -v "$cmd" >/dev/null 2>&1; then + missing_deps+=("$cmd") + fi + done + + if [ ${#missing_deps[@]} -gt 0 ]; then + print_error "Missing required dependencies: ${missing_deps[*]}" + print_info "Please install the missing dependencies and try again." + exit 1 + fi +} + +# Consolidated git operations (NEW v12) +update_repositories() { + print_info "Updating all repositories with consolidated git operations..." + + # Update app repository if it exists + if [ -d "$APP_DIR/.git" ]; then + print_info "Updating app repository..." + cd "$APP_DIR" + run_cmd "git fetch origin main" || print_warning "Failed to fetch app repository updates" + run_cmd "git pull origin main" || print_warning "Failed to pull app repository updates" + fi + + # Update cached worktrees if they exist + local worktree_base="$APP_DIR/worktrees" + if [ -d "$worktree_base/main/.git" ]; then + print_info "Updating cached content repositories..." + cd "$worktree_base/main" + run_cmd "git fetch origin rocky-8:rocky-8 rocky-9:rocky-9 main:main" || print_warning "Failed to update cached repositories" + fi + + cd "$CONTENT_DIR" + print_success "Repository updates completed" +} + +# Optimized web root override (NEW v12) +apply_web_root_override_local() { + print_info "Applying optimized local web root override..." + + local original_branch + original_branch=$(git rev-parse --abbrev-ref HEAD) + + # Use low-level git commands to avoid expensive checkouts + if ! git show-ref --verify --quiet refs/heads/gh-pages; then + print_error "No gh-pages branch found for web root override" + return 1 + fi + + # Find the source for web root content (latest symlink or version 10 directory) + local content_source="" + if git ls-tree gh-pages | grep -q "latest"; then + # Check if latest is a symlink and resolve it + local latest_target=$(git show gh-pages:latest 2>/dev/null || echo "") + if [ -n "$latest_target" ] && git ls-tree "gh-pages:$latest_target" >/dev/null 2>&1; then + content_source="$latest_target" + print_info "Found latest symlink pointing to version $latest_target" + elif git ls-tree gh-pages:latest >/dev/null 2>&1; then + content_source="latest" + print_info "Found latest directory" + fi + fi + + # Fallback to version 10 if latest not found + if [ -z "$content_source" ] && git ls-tree gh-pages:10 >/dev/null 2>&1; then + content_source="10" + print_info "Using version 10 as content source" + fi + + if [ -z "$content_source" ]; then + print_error "No suitable content source found (latest or version 10) on gh-pages branch" + return 1 + fi + + print_info "Creating optimized commit for web root override using content from: $content_source" + + # Create a merged tree that preserves versioned directories AND adds root content + local parent_commit=$(git rev-parse gh-pages) + local parent_tree=$(git rev-parse "gh-pages^{tree}") + local source_tree=$(git rev-parse "gh-pages:$content_source") + + # Use a temporary worktree approach to create merged tree + # This preserves existing versioned structure while adding root content + local temp_worktree=".git/temp-merge-$(date +%s)" + run_cmd "git worktree add $temp_worktree gh-pages" + + # In the temporary worktree, copy the latest content to root, preserving versioned dirs + ( + cd "$temp_worktree" + # Remove existing root content (but keep versioned directories and versions.json) + for item in *; do + if [[ "$item" != "8" && "$item" != "9" && "$item" != "10" && "$item" != "latest" && "$item" != "versions.json" && "$item" != ".nojekyll" ]]; then + rm -rf "$item" + fi + done + + # Copy the latest version content to root + if [ -L latest ]; then + local target=$(readlink latest) + cp -r "${target}"/* ./ + elif [ -d "10" ]; then + cp -r 10/* ./ + fi + + # Stage all changes + git add -A + local merged_tree=$(git write-tree) + echo "$merged_tree" > /tmp/merged_tree_sha + ) + + # Clean up the temporary worktree (force removal since it contains our changes) + run_cmd "git worktree remove --force $temp_worktree" + local merged_tree=$(cat /tmp/merged_tree_sha) + rm -f /tmp/merged_tree_sha + + # Create new commit with the merged tree + local new_commit=$(git commit-tree $merged_tree -p $parent_commit -m "feat: Apply optimized local-only web root override from $content_source") + + # Update gh-pages branch to point to new commit + run_cmd "git update-ref refs/heads/gh-pages $new_commit" + + print_success "Optimized web root override applied successfully from $content_source" +} + +# Streamlined static serving (NEW v12) +serve_static() { + + print_info "🔧 STREAMLINED STATIC MODE: Fast static file extraction and serving" + + # Basic validation + if [ ! -d "$APP_DIR" ]; then + print_error "App directory not found: $APP_DIR" + return 1 + fi + + cd "$APP_DIR" + + # Only extract static site if not already done or if deployment is newer + if ! extract_static_site; then + print_error "Failed to extract static site" + return 1 + fi + + # Start static server immediately + print_success "🚀 Starting STREAMLINED static server" + print_info " • Instant startup - no rebuild needed" + print_info " • Production-identical behavior" + print_info " • Access: http://localhost:8000" + + # Check for port conflicts and resolve them + local port=8000 + if ! check_and_resolve_port_conflict $port true; then + print_error "Could not resolve port conflict on port $port" + return 1 + fi + + # Start static server with PID tracking + cd "$APP_DIR/site-static" + python3 -m http.server 8000 & + local server_pid=$! + add_cleanup_resource "pid:$server_pid" + cd - > /dev/null + wait $server_pid +} + +# Docker serving function +serve_docker() { + local static_mode="$1" + + print_info "🐳 DOCKER SERVING MODE: Container-based documentation serving" + + # Validate Docker setup + if [ ! -d "$APP_DIR" ]; then + print_error "App directory not found: $APP_DIR" + print_info "Run setup first: $0 --setup --docker" + return 1 + fi + + # Check if Docker image exists + if ! docker image inspect rockydocs-dev >/dev/null 2>&1; then + print_error "Docker image 'rockydocs-dev' not found" + print_info "Run setup first: $0 --setup --docker" + return 1 + fi + + cd "$APP_DIR" + + # Get container name and manage lifecycle + local container_name=$(get_docker_container_name "serve") + stop_docker_container "$container_name" + + # Find available port + local port=$(find_available_port 8000 8001 8002) + if [ -z "$port" ]; then + print_error "No available ports (8000, 8001, 8002). Kill existing processes." + return 1 + fi + + print_success "🚀 Starting Docker container: $container_name" + print_info " • Port: $port" + print_info " • Access: http://localhost:$port" + print_info " • Static mode: $static_mode" + + # Start container based on mode + if [ "$static_mode" = "true" ]; then + # Static mode: serve pre-built content + print_info " • Mode: Static (production-like)" + docker run -d --name "$container_name" \ + -p "$port:8000" \ + -v "$APP_DIR:/app" \ + -v "$CONTENT_DIR/docs:/app/content" \ + --workdir /app \ + rockydocs-dev \ + python3 -m http.server 8000 -d /app/site-static + else + # Live mode: MkDocs development server with proper environment + print_info " • Mode: Live (development with auto-reload)" + docker run -d --name "$container_name" \ + -p "$port:8000" \ + -v "$APP_DIR:/app" \ + -v "$CONTENT_DIR/docs:/app/content" \ + --workdir /app \ + rockydocs-dev \ + bash -c "source venv/bin/activate && mkdocs serve -a 0.0.0.0:8000" + fi + + # Add container to cleanup + add_cleanup_resource "container:$container_name" + + # Health check with longer timeout for mkdocs build + print_info "Waiting for container to be ready (mkdocs build can take 1-2 minutes)..." + if check_docker_health "$container_name" "$port" 120; then + print_success "✅ Docker container ready!" + print_info "Access your documentation at: http://localhost:$port" + + # Show container logs briefly + print_info "" + print_info "Container logs (last 10 lines):" + docker logs --tail 10 "$container_name" 2>/dev/null || true + print_info "" + print_warning "Press Ctrl+C to stop the container" + + # Follow container logs + docker logs -f "$container_name" + else + print_error "Container failed to start properly" + docker logs "$container_name" 2>/dev/null || true + stop_docker_container "$container_name" + return 1 + fi +} + +# Parse arguments +COMMAND="" +ENVIRONMENT="venv" +BUILD_TYPE="minimal" +STATIC_MODE=false +LIST_MODE=false +CUSTOM_WORKSPACE="" + +while [[ $# -gt 0 ]]; do + case $1 in + --setup) + COMMAND="setup" + shift + ;; + --serve) + COMMAND="serve" + shift + ;; + --serve-dual) + COMMAND="serve-dual" + shift + ;; + --deploy) + COMMAND="deploy" + shift + ;; + --clean) + COMMAND="clean" + shift + ;; + --reset) + COMMAND="reset" + shift + ;; + --status) + COMMAND="status" + shift + ;; + --version) + COMMAND="version" + shift + ;; + --venv|--docker|--podman) + ENVIRONMENT="${1#--}" + shift + ;; + --minimal) + BUILD_TYPE="minimal" + shift + ;; + --full) + BUILD_TYPE="full" + shift + ;; + --static) + STATIC_MODE=true + shift + ;; + --list) + LIST_MODE=true + shift + ;; + --workspace) + if [ -n "$2" ]; then + CUSTOM_WORKSPACE="$2" + # Create directory if it doesn't exist, then get realpath + mkdir -p "$2" + WORKSPACE_BASE_DIR="$(realpath "$2")" + APP_DIR="$WORKSPACE_BASE_DIR/docs.rockylinux.org" + APP_COMPAT_LINK="$WORKSPACE_BASE_DIR/app" + print_info "Using custom workspace: $WORKSPACE_BASE_DIR" + + # Save new workspace configuration + print_info "Saving new workspace configuration..." + save_workspace_config "$WORKSPACE_BASE_DIR" + shift 2 + else + print_error "--workspace requires a path" + exit 1 + fi + ;; + -h|--help) + if [ -n "$COMMAND" ]; then + case "$COMMAND" in + setup) show_setup_help ;; + serve) show_serve_help ;; + serve-dual) show_serve_dual_help ;; + deploy) show_deploy_help ;; + *) show_help ;; + esac + else + show_help + fi + exit 0 + ;; + *) + print_error "Unknown option: $1" + show_help + exit 1 + ;; + esac +done + +# Handle subcommand help +if [[ "$2" == "-h" ]]; then + case "$1" in + --setup) show_setup_help ;; + --serve) show_serve_help ;; + --serve-dual) show_serve_dual_help ;; + --deploy) show_deploy_help ;; + *) show_help ;; + esac + exit 0 +fi + +# Check dependencies before any operation +check_dependencies + +# Execute command +case "$COMMAND" in + setup) + update_repositories + setup_environment "$ENVIRONMENT" "$BUILD_TYPE" + ;; + serve) + if [ "$ENVIRONMENT" = "docker" ]; then + serve_docker "$STATIC_MODE" + elif [ "$STATIC_MODE" = "true" ]; then + serve_static + else + serve_site "" "$STATIC_MODE" + fi + ;; + serve-dual) + serve_dual + ;; + deploy) + if [ "$LIST_MODE" = "true" ]; then + list_versions + elif [ "$ENVIRONMENT" = "docker" ]; then + update_repositories + deploy_docker + else + update_repositories + deploy_site + fi + ;; + clean) + clean_workspace + ;; + reset) + reset_configuration + ;; + status) + show_status + ;; + version) + echo "$FULL_VERSION" + echo "Author: $AUTHOR" + echo "Rocky Linux Documentation Script" + ;; + *) + print_error "No command specified" + show_help + exit 1 + ;; +esac \ No newline at end of file diff --git a/tools/CHANGELOG.md b/tools/CHANGELOG.md new file mode 100644 index 0000000000..38d2f9a4e8 --- /dev/null +++ b/tools/CHANGELOG.md @@ -0,0 +1,8 @@ +# Rocky Linux Documentation Script Changelog + +All notable changes to the `rockydocs.sh` script will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to NEVRA versioning (Name-Version-Release). + +No versioned commits found yet. diff --git a/tools/docker-compose.yml b/tools/docker-compose.yml new file mode 100644 index 0000000000..4b8bff355f --- /dev/null +++ b/tools/docker-compose.yml @@ -0,0 +1,127 @@ +version: '3.8' + +services: + # Rocky Linux Documentation Development Server + rockydocs-dev: + build: + context: . + dockerfile: Dockerfile.dev + container_name: rockydocs-dev-serve + ports: + - "8000:8000" + volumes: + # Mount app directory for live editing + - ./:/app:rw + # Mount content directory for live content editing + - ../content/docs:/app/content:rw + # Persist git data for proper timestamps + - ../.git:/app/.git:ro + working_dir: /app + command: mkdocs serve -a 0.0.0.0:8000 + environment: + - PYTHONPATH=/app + - MKDOCS_CONFIG_FILE=mkdocs.docker.yml + - GIT_AUTHOR_NAME=Rocky Linux Documentation + - GIT_AUTHOR_EMAIL=docs@rockylinux.org + - GIT_COMMITTER_NAME=Rocky Linux Documentation + - GIT_COMMITTER_EMAIL=docs@rockylinux.org + networks: + - rockydocs-network + restart: unless-stopped + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8000"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + + # Static file server for production-like testing + rockydocs-static: + build: + context: . + dockerfile: Dockerfile.dev + container_name: rockydocs-static-serve + ports: + - "8001:8000" + volumes: + - ./site-static:/app/static:ro + working_dir: /app + command: python3 -m http.server 8000 -d /app/static + networks: + - rockydocs-network + restart: unless-stopped + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8000"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 10s + profiles: + - static + + # Build service for deployment testing + rockydocs-build: + build: + context: . + dockerfile: Dockerfile.dev + container_name: rockydocs-build + volumes: + - ./:/app:rw + - ../content/docs:/app/content:rw + - ../.git:/app/.git:ro + working_dir: /app + environment: + - PYTHONPATH=/app + - MKDOCS_CONFIG_FILE=mkdocs.docker.yml + - GIT_AUTHOR_NAME=Rocky Linux Documentation + - GIT_AUTHOR_EMAIL=docs@rockylinux.org + - GIT_COMMITTER_NAME=Rocky Linux Documentation + - GIT_COMMITTER_EMAIL=docs@rockylinux.org + command: /bin/bash -c "echo 'Build service ready. Run: docker-compose exec rockydocs-build mike deploy --push --update-aliases 10 latest'" + networks: + - rockydocs-network + profiles: + - build + + # Database for development analytics (optional) + rockydocs-analytics: + image: postgres:15-alpine + container_name: rockydocs-analytics + environment: + - POSTGRES_DB=rockydocs + - POSTGRES_USER=rockydocs + - POSTGRES_PASSWORD=development + volumes: + - postgres_data:/var/lib/postgresql/data + ports: + - "5432:5432" + networks: + - rockydocs-network + restart: unless-stopped + profiles: + - analytics + + # Redis for caching (optional) + rockydocs-cache: + image: redis:7-alpine + container_name: rockydocs-cache + ports: + - "6379:6379" + volumes: + - redis_data:/data + networks: + - rockydocs-network + restart: unless-stopped + command: redis-server --appendonly yes + profiles: + - cache + +networks: + rockydocs-network: + driver: bridge + +volumes: + postgres_data: + driver: local + redis_data: + driver: local \ No newline at end of file diff --git a/tools/mkdocs-docker.yml b/tools/mkdocs-docker.yml new file mode 100644 index 0000000000..9ee1892111 --- /dev/null +++ b/tools/mkdocs-docker.yml @@ -0,0 +1,110 @@ +--- +site_name: "Documentation" +site_url: "https://docs.rockylinux.org/" +docs_dir: "content" +repo_url: https://github.com/rocky-linux/documentation +repo_name: rocky-linux/documentation +edit_uri: "edit/main/docs/" + +theme: + name: material + custom_dir: theme + icon: + edit: material/pencil + features: + - content.action.edit + - content.code.copy + - navigation.tabs + - navigation.tabs.sticky + - navigation.top + - search.suggest + - search.highlight + - search.share + logo: assets/logo.png + favicon: assets/logo.png + palette: + - scheme: default + media: "(prefers-color-scheme: light)" + toggle: + icon: material/weather-night + name: Switch to dark mode + primary: black + - scheme: slate + media: "(prefers-color-scheme: dark)" + toggle: + icon: material/weather-sunny + name: Switch to light mode + primary: black + +markdown_extensions: + - abbr + - attr_list + - admonition + - toc: + permalink: true + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + - pymdownx.highlight + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format + - pymdownx.keys + - pymdownx.caret + - pymdownx.mark + - pymdownx.tilde + - pymdownx.tabbed: + alternate_style: true + - pymdownx.details + - pymdownx.tasklist + - footnotes + - def_list + - meta + +plugins: + - mike: + version_selector: true + - search + - awesome-pages + - i18n: + docs_structure: suffix + fallback_to_default: true + reconfigure_material: true + reconfigure_search: true + languages: + - build: true + default: true + locale: en + name: English + - build: true + default: false + locale: uk + name: Ukrainian + - git-revision-date-localized: + fallback_to_build_date: true + type: date + - redirects: + redirect_maps: + "guides/add_mirror_manager.md": "guides/mirror_management/add_mirror_manager.md" + - tags + - privacy: + enabled: false + +extra: + version: + provider: mike + default: latest + alias: true + social: + - icon: fontawesome/brands/twitter + link: https://twitter.com/rocky_linux + - icon: fontawesome/brands/github + link: https://github.com/rocky-linux + - icon: fontawesome/brands/gitlab + link: https://git.rockylinux.org + - icon: material/home + link: https://rockylinux.org + +copyright: Copyright © 2026 The Rocky Enterprise Software Foundation \ No newline at end of file diff --git a/tools/requirements-dev.txt b/tools/requirements-dev.txt new file mode 100644 index 0000000000..cc3ed914d8 --- /dev/null +++ b/tools/requirements-dev.txt @@ -0,0 +1,74 @@ +# Rocky Linux Documentation - Development Requirements +# Additional development tools beyond production requirements + +# Core MkDocs and Material theme (production requirements) +mkdocs>=1.5.0 +mkdocs-material>=9.0.0 +mike>=2.0.0 + +# Language and internationalization support +mkdocs-static-i18n>=1.2.0 + +# Content and navigation plugins +mkdocs-awesome-pages-plugin>=2.9.0 +mkdocs-redirects>=1.2.0 + +# Git integration and timestamps +mkdocs-git-revision-date-localized-plugin>=1.2.0 + +# Search and content features +mkdocs-minify-plugin>=0.8.0 +mkdocs-macros-plugin>=1.0.0 + +# Privacy and social features +mkdocs-material[recommended]>=9.0.0 + +# Development and testing tools +pytest>=7.0.0 +pytest-cov>=4.0.0 +black>=23.0.0 +flake8>=6.0.0 +mypy>=1.0.0 + +# Container development support +docker>=6.0.0 +docker-compose>=2.0.0 + +# Git and repository tools +GitPython>=3.1.0 +pre-commit>=3.0.0 + +# JSON and YAML processing +pyyaml>=6.0 +jsonschema>=4.0.0 + +# HTTP and web development +requests>=2.28.0 +httpx>=0.24.0 + +# Build and deployment tools +wheel>=0.40.0 +build>=0.10.0 +twine>=4.0.0 + +# Documentation generation +sphinx>=6.0.0 +sphinx-rtd-theme>=1.2.0 + +# Performance and monitoring +psutil>=5.9.0 +watchdog>=3.0.0 + +# Quality assurance +bandit>=1.7.0 +safety>=2.3.0 +pipreqs>=0.4.0 + +# Development utilities +ipython>=8.0.0 +jupyter>=1.0.0 +notebook>=6.5.0 + +# File and path utilities +pathspec>=0.11.0 +platformdirs>=3.0.0 \ No newline at end of file diff --git a/tools/rockydocs-changelog.sh b/tools/rockydocs-changelog.sh new file mode 100755 index 0000000000..4f641858f4 --- /dev/null +++ b/tools/rockydocs-changelog.sh @@ -0,0 +1,375 @@ +#!/bin/bash + +# rockydocs-changelog.sh - Automated Changelog Management Tool +# Manages tools/CHANGELOG.md using git commit messages and script version parsing +# +# Usage: +# ./tools/rockydocs-changelog.sh [COMMAND] [OPTIONS] +# +# Commands: +# generate - Generate complete changelog from git history +# update - Update changelog with recent commits +# commit - Enhanced git commit with changelog update +# show - Show recent rockydocs commits +# version - Show current script version info +# +# Author: Wale Soyinka +# Contributors: +# Ai-Contributors: Claude (claude-sonnet-4-20250514), Gemini (gemini-2.5-pro) + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(dirname "$SCRIPT_DIR")" +CHANGELOG_FILE="$SCRIPT_DIR/CHANGELOG.md" +ROCKYDOCS_SCRIPT="$REPO_ROOT/rockydocs.sh" + +# Source functions if available +if [ -f "$SCRIPT_DIR/rockydocs-functions.sh" ]; then + source "$SCRIPT_DIR/rockydocs-functions.sh" +else + # Minimal print functions if not available + print_info() { echo "ℹ️ $1"; } + print_success() { echo "✅ $1"; } + print_warning() { echo "⚠️ $1"; } + print_error() { echo "❌ $1"; } +fi + +# Extract current version from script +get_current_version() { + if [ ! -f "$ROCKYDOCS_SCRIPT" ]; then + echo "unknown-unknown" + return + fi + + local version=$(grep '^VERSION=' "$ROCKYDOCS_SCRIPT" | cut -d'"' -f2 2>/dev/null || echo "unknown") + local release=$(grep '^RELEASE=' "$ROCKYDOCS_SCRIPT" | cut -d'"' -f2 2>/dev/null || echo "unknown") + echo "$version-$release" +} + +# Parse commit message for changelog info +parse_commit_message() { + local commit_msg="$1" + local commit_hash="$2" + local commit_date="$3" + + # Extract action and description + # Format: "rockydocs: (bump to )" + if [[ "$commit_msg" =~ ^rockydocs:\ ([^[:space:]]+)\ (.+)\ \(bump\ to\ ([^\)]+)\)$ ]]; then + local action="${BASH_REMATCH[1]}" + local description="${BASH_REMATCH[2]}" + local version="${BASH_REMATCH[3]}" + + # Categorize action + local category="Changed" + case "$action" in + add|new) category="Added" ;; + fix|resolve) category="Fixed" ;; + remove|delete) category="Removed" ;; + update|improve|enhance) category="Changed" ;; + security) category="Security" ;; + deprecate) category="Deprecated" ;; + esac + + echo "$version|$category|$description|$commit_hash|$commit_date" + return 0 + fi + + return 1 +} + +# Generate changelog entry for a version +generate_version_entry() { + local version="$1" + local date="$2" + + echo "" + echo "## [$version] - $date" + echo "" + + # Group changes by category + declare -A categories + categories["Added"]="" + categories["Changed"]="" + categories["Fixed"]="" + categories["Security"]="" + categories["Deprecated"]="" + categories["Removed"]="" + + # Parse commits for this version + while IFS='|' read -r commit_version category description commit_hash commit_date; do + if [ "$commit_version" = "$version" ]; then + if [ -n "${categories[$category]}" ]; then + categories[$category]="${categories[$category]}\n- $description" + else + categories[$category]="- $description" + fi + fi + done < <(get_rockydocs_commits | while read -r hash date message; do + if parse_commit_message "$message" "$hash" "$date"; then + true + fi + done) + + # Output categories with content + for category in "Added" "Changed" "Fixed" "Security" "Deprecated" "Removed"; do + if [ -n "${categories[$category]}" ]; then + echo "### $category" + echo -e "${categories[$category]}" + echo "" + fi + done +} + +# Get rockydocs-related commits +get_rockydocs_commits() { + git log --oneline --grep="^rockydocs:" --format="%H %ci %s" -- rockydocs.sh tools/ 2>/dev/null || true +} + +# Show recent commits +show_commits() { + local since="${1:-1 week ago}" + + print_info "Recent rockydocs commits (since: $since)" + echo "" + + git log --oneline --grep="^rockydocs:" --since="$since" --format="%C(yellow)%h%C(reset) %C(green)%ci%C(reset) %s" -- rockydocs.sh tools/ 2>/dev/null || { + print_warning "No rockydocs commits found since $since" + return + } +} + +# Generate complete changelog +generate_changelog() { + local backup_existing="$1" + + if [ -f "$CHANGELOG_FILE" ] && [ "$backup_existing" = "true" ]; then + cp "$CHANGELOG_FILE" "$CHANGELOG_FILE.backup" + print_info "Existing changelog backed up to: $CHANGELOG_FILE.backup" + fi + + print_info "Generating complete changelog from git history..." + + # Create changelog header + cat > "$CHANGELOG_FILE" << 'EOF' +# Rocky Linux Documentation Script Changelog + +All notable changes to the `rockydocs.sh` script will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to NEVRA versioning (Name-Version-Release). + +EOF + + # Get unique versions from commits, sorted by date (newest first) + local versions=$(get_rockydocs_commits | while read -r hash date message; do + if parse_commit_message "$message" "$hash" "$date"; then + echo "$date|$(parse_commit_message "$message" "$hash" "$date" | cut -d'|' -f1)" + fi + done | sort -r | cut -d'|' -f2 | sort -u -r) + + if [ -z "$versions" ]; then + print_warning "No versioned rockydocs commits found" + echo "No versioned commits found yet." >> "$CHANGELOG_FILE" + return + fi + + # Generate entries for each version + while read -r version; do + if [ -n "$version" ]; then + # Get the date of the first commit for this version + local version_date=$(get_rockydocs_commits | while read -r hash date message; do + if parse_commit_message "$message" "$hash" "$date" >/dev/null; then + local commit_version=$(parse_commit_message "$message" "$hash" "$date" | cut -d'|' -f1) + if [ "$commit_version" = "$version" ]; then + echo "$date" + break + fi + fi + done | head -1 | cut -d' ' -f1) + + generate_version_entry "$version" "$version_date" >> "$CHANGELOG_FILE" + fi + done <<< "$versions" + + print_success "Changelog generated: $CHANGELOG_FILE" +} + +# Update changelog with recent commits +update_changelog() { + local since="${1:-1 week ago}" + + if [ ! -f "$CHANGELOG_FILE" ]; then + print_warning "Changelog doesn't exist. Use 'generate' command first." + return 1 + fi + + print_info "Updating changelog with commits since: $since" + + # Get recent commits + local recent_commits=$(git log --oneline --grep="^rockydocs:" --since="$since" --format="%H %ci %s" -- rockydocs.sh tools/ 2>/dev/null || true) + + if [ -z "$recent_commits" ]; then + print_info "No recent rockydocs commits to add" + return + fi + + # For simplicity, append recent commits to a temporary section + local temp_file=$(mktemp) + + # Add header for recent changes + echo "" >> "$temp_file" + echo "## Recent Changes ($(date +%Y-%m-%d))" >> "$temp_file" + echo "" >> "$temp_file" + echo "### Added" >> "$temp_file" + + # Parse and add recent commits + echo "$recent_commits" | while read -r hash date message; do + if parse_commit_message "$message" "$hash" "$date" >/dev/null; then + local description=$(parse_commit_message "$message" "$hash" "$date" | cut -d'|' -f3) + echo "- $description" >> "$temp_file" + fi + done + + # Prepend to existing changelog (after header) + local header_lines=$(grep -n "^# Rocky Linux" "$CHANGELOG_FILE" | head -1 | cut -d':' -f1) + local insert_line=$((header_lines + 5)) # After header block + + head -$insert_line "$CHANGELOG_FILE" > "${temp_file}.full" + cat "$temp_file" >> "${temp_file}.full" + tail -n +$((insert_line + 1)) "$CHANGELOG_FILE" >> "${temp_file}.full" + + mv "${temp_file}.full" "$CHANGELOG_FILE" + rm -f "$temp_file" + + print_success "Changelog updated with recent commits" +} + +# Enhanced git commit with automatic changelog update +enhanced_commit() { + local message="$1" + + if [ -z "$message" ]; then + print_error "Commit message required" + echo "Usage: $0 commit 'rockydocs: action description (bump to version-release)'" + return 1 + fi + + # Validate commit message format + if [[ ! "$message" =~ ^rockydocs:\ [^[:space:]]+\ .+\ \(bump\ to\ [^\)]+\)$ ]]; then + print_error "Invalid commit message format" + echo "Required format: 'rockydocs: (bump to -)'" + echo "Example: 'rockydocs: add --feature-x option (bump to 1.1.0-1.el10)'" + return 1 + fi + + # Extract version from commit message + local version=$(echo "$message" | grep -o '(bump to [^)]*)' | sed 's/(bump to \(.*\))/\1/') + + # Check if version matches script + local current_version=$(get_current_version) + if [ "$version" != "$current_version" ]; then + print_warning "Version mismatch:" + echo " Commit message: $version" + echo " Script version: $current_version" + echo " Update script version first or fix commit message" + fi + + # Stage rockydocs-related files + git add rockydocs.sh tools/ 2>/dev/null || true + + # Commit with message + git commit -m "$message" + + # Update changelog if it exists + if [ -f "$CHANGELOG_FILE" ]; then + print_info "Updating changelog..." + update_changelog "1 hour ago" + fi + + print_success "Commit completed with changelog update" +} + +# Show current version info +show_version() { + local current_version=$(get_current_version) + local latest_commit=$(git log -1 --oneline --grep="^rockydocs:" --format="%h %s" -- rockydocs.sh tools/ 2>/dev/null || echo "No commits found") + + print_info "Version Information" + echo " Current script version: $current_version" + echo " Latest rockydocs commit: $latest_commit" + echo " Changelog file: $CHANGELOG_FILE" + echo " Repository root: $REPO_ROOT" +} + +# Show help +show_help() { + cat << EOF +rockydocs-changelog.sh - Automated Changelog Management Tool + +USAGE: + $0 COMMAND [OPTIONS] + +COMMANDS: + generate [--backup] Generate complete changelog from git history + update [SINCE] Update changelog with recent commits (default: 1 week ago) + commit MESSAGE Enhanced git commit with changelog update + show [SINCE] Show recent rockydocs commits (default: 1 week ago) + version Show current script version information + help Show this help message + +EXAMPLES: + # Generate complete changelog + $0 generate + + # Update with recent commits + $0 update "2 weeks ago" + + # Enhanced commit (auto-updates changelog) + $0 commit "rockydocs: add --feature-x option (bump to 1.1.0-1.el10)" + + # Show recent commits + $0 show "1 month ago" + +COMMIT MESSAGE FORMAT: + rockydocs: (bump to -) + + Actions: add, fix, update, remove, security, deprecate + Example: rockydocs: add --version option (bump to 1.0.0-13.el10) + +NOTES: + - Requires standardized commit message format + - Automatically categorizes changes based on action keywords + - Updates changelog using git history and version parsing + - Integrates with existing rockydocs-functions.sh if available + +EOF +} + +# Main command processing +case "${1:-help}" in + generate) + generate_changelog "${2:-false}" + ;; + update) + update_changelog "${2:-1 week ago}" + ;; + commit) + enhanced_commit "$2" + ;; + show) + show_commits "${2:-1 week ago}" + ;; + version) + show_version + ;; + help|--help|-h) + show_help + ;; + *) + print_error "Unknown command: $1" + echo "" + show_help + exit 1 + ;; +esac \ No newline at end of file diff --git a/tools/rockydocs-functions.sh b/tools/rockydocs-functions.sh new file mode 100755 index 0000000000..75296e194d --- /dev/null +++ b/tools/rockydocs-functions.sh @@ -0,0 +1,1819 @@ +#!/bin/bash + +# Rocky Linux Documentation - Function Library +# Modular function library for rockydocs.sh +# Contains all utility functions, setup logic, and serving modes +# +# Author: Wale Soyinka +# Contributors: +# Ai-Contributors: Claude (claude-sonnet-4-20250514), Gemini (gemini-2.5-pro) + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +# Print functions +print_success() { echo -e "${GREEN}✅ $1${NC}"; } +print_info() { echo -e "${BLUE}ℹ️ $1${NC}"; } +print_warning() { echo -e "${YELLOW}⚠️ $1${NC}"; } +print_error() { echo -e "${RED}❌ $1${NC}"; } +print_command() { echo -e "${YELLOW}Running: $1${NC}"; } + +# Execute command with echo +run_cmd() { + print_command "$1" + eval "$1" +} + +# === UTILITY FUNCTIONS === + +# Resource cleanup handler +CLEANUP_RESOURCES=() +cleanup_on_exit() { + local exit_code=$? + if [ ${#CLEANUP_RESOURCES[@]} -gt 0 ]; then + print_warning "Cleaning up resources..." + for resource in "${CLEANUP_RESOURCES[@]}"; do + if [[ "$resource" =~ ^pid: ]]; then + local pid="${resource#pid:}" + kill "$pid" 2>/dev/null || true + print_info "Terminated PID $pid" + elif [[ "$resource" =~ ^dir: ]]; then + local dir="${resource#dir:}" + rm -rf "$dir" 2>/dev/null || true + print_info "Cleaned directory $dir" + elif [[ "$resource" =~ ^file: ]]; then + local file="${resource#file:}" + rm -f "$file" 2>/dev/null || true + print_info "Cleaned file $file" + elif [[ "$resource" =~ ^container: ]]; then + local container="${resource#container:}" + stop_docker_container "$container" + print_info "Stopped container $container" + fi + done + fi + exit $exit_code +} +trap cleanup_on_exit EXIT INT TERM + +# Add resource to cleanup list +add_cleanup_resource() { + CLEANUP_RESOURCES+=("$1") +} + +# Load saved workspace configuration +load_workspace_config() { + if [ -f "$CONFIG_FILE" ]; then + source "$CONFIG_FILE" + fi +} + +# Save workspace configuration +save_workspace_config() { + local workspace_path="$1" + mkdir -p "$CONFIG_DIR" + cat > "$CONFIG_FILE" << EOF +# Rocky Linux Documentation Workspace Configuration +# This file is automatically generated and managed +SAVED_WORKSPACE_BASE_DIR="$workspace_path" +EOF + print_success "Workspace configuration saved to: $CONFIG_FILE" +} + +# Setup mkdocs configuration +setup_mkdocs_config() { + local build_type="$1" + local working_dir="${2:-$PWD}" + + cd "$working_dir" + + if [ "$build_type" = "full" ]; then + run_cmd "cp -f configs/mkdocs.full.yml mkdocs.yml" + print_info "Using full config (all languages)" + else + run_cmd "cp -f configs/mkdocs.minimal.yml mkdocs.yml" + print_info "Using minimal config (English + Ukrainian)" + fi +} + +# Manage content symlink with proper cleanup +manage_content_symlink() { + local action="$1" + local target="${2:-$CONTENT_DIR/docs}" + local link_name="${3:-content}" + + case "$action" in + "create") + run_cmd "rm -rf $link_name" + run_cmd "ln -sf $target $link_name" + add_cleanup_resource "file:$PWD/$link_name" + ;; + "backup") + if [ -e "$link_name" ]; then + run_cmd "rm -f ${link_name}-backup-current" + run_cmd "mv $link_name ${link_name}-backup-current" + fi + ;; + "restore") + run_cmd "rm -f $link_name" + if [ -e "${link_name}-backup-current" ]; then + run_cmd "mv ${link_name}-backup-current $link_name" + fi + ;; + "clean") + run_cmd "rm -f $link_name ${link_name}-backup-current" + ;; + esac +} + +# Activate virtual environment with error handling +activate_venv() { + local venv_path="${1:-venv}" + if [ ! -d "$venv_path" ]; then + print_error "Virtual environment not found: $venv_path" + return 1 + fi + source "$venv_path/bin/activate" || { + print_error "Failed to activate virtual environment" + return 1 + } +} + +# Improved error handling for commands +run_cmd_with_rollback() { + local cmd="$1" + local rollback_cmd="$2" + local error_msg="${3:-Command failed}" + + print_command "$cmd" + if ! eval "$cmd"; then + print_error "$error_msg" + if [ -n "$rollback_cmd" ]; then + print_warning "Attempting rollback: $rollback_cmd" + eval "$rollback_cmd" 2>/dev/null || true + fi + return 1 + fi + return 0 +} + +# Check and resolve port conflicts +check_and_resolve_port_conflict() { + local port="$1" + local force_kill="${2:-false}" + + if lsof -i ":$port" >/dev/null 2>&1; then + local process_info=$(lsof -i ":$port" 2>/dev/null | tail -n 1 | awk '{print $1 " (PID " $2 ")"}') + local pid=$(lsof -ti ":$port" 2>/dev/null) + + print_warning "Port $port is already in use by $process_info" + + if [ "$force_kill" = "true" ]; then + print_info "Automatically terminating conflicting process..." + if kill "$pid" 2>/dev/null; then + print_success "Terminated PID $pid (was using port $port)" + sleep 2 + return 0 + else + print_error "Failed to terminate PID $pid" + return 1 + fi + else + print_info "Options:" + print_info " 1. Terminate the conflicting process automatically" + print_info " 2. Use a different port" + print_info " 3. Cancel and resolve manually" + read -p "Choose (1-3): " choice + + case "$choice" in + 1) + if kill "$pid" 2>/dev/null; then + print_success "Terminated PID $pid (was using port $port)" + sleep 2 + return 0 + else + print_error "Failed to terminate PID $pid" + return 1 + fi + ;; + 2) + print_info "Using alternative port 8002" + return 2 # Signal to use alternative port + ;; + 3) + print_info "Please manually terminate the process: kill $pid" + return 1 + ;; + *) + print_error "Invalid choice" + return 1 + ;; + esac + fi + fi + + return 0 # Port is available +} + +# Kill all documentation-related processes +kill_all_doc_processes() { + print_info "Cleaning up all documentation server processes..." + + # Kill mike serve processes + local mike_pids=$(pgrep -f "mike serve" 2>/dev/null || true) + if [ -n "$mike_pids" ]; then + echo "$mike_pids" | xargs kill 2>/dev/null || true + print_info "Terminated mike serve processes: $mike_pids" + fi + + # Kill Python HTTP servers on documentation ports + for port in 8000 8001 8002; do + if lsof -i ":$port" >/dev/null 2>&1; then + local pid=$(lsof -ti ":$port" 2>/dev/null) + local process_name=$(lsof -i ":$port" 2>/dev/null | tail -n 1 | awk '{print $1}') + if [[ "$process_name" == "Python" ]] || [[ "$process_name" == "python"* ]]; then + kill "$pid" 2>/dev/null || true + print_info "Terminated $process_name (PID $pid) on port $port" + fi + fi + done + + # Kill mkdocs serve processes + local mkdocs_pids=$(pgrep -f "mkdocs serve" 2>/dev/null || true) + if [ -n "$mkdocs_pids" ]; then + echo "$mkdocs_pids" | xargs kill 2>/dev/null || true + print_info "Terminated mkdocs serve processes: $mkdocs_pids" + fi + + sleep 2 + print_success "All documentation server processes cleaned up" +} + +# Detect current Rocky version from git branch +detect_version() { + local branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "main") + case "$branch" in + rocky-8) echo "8" ;; + rocky-9) echo "9" ;; + main) echo "10" ;; + *) echo "10" ;; + esac +} + +# Utility function: Find available port with fallback +find_available_port() { + local port + for port in "$@"; do + if ! lsof -i ":$port" >/dev/null 2>&1; then + echo "$port" + return 0 + fi + done + return 1 +} + +# Docker container utility functions +get_docker_container_name() { + local service_type="$1" # serve, deploy, etc. + echo "rockydocs-${service_type}-${USER}" +} + +stop_docker_container() { + local container_name="$1" + if docker ps -q -f name="$container_name" >/dev/null 2>&1; then + print_info "Stopping existing container: $container_name" + docker stop "$container_name" >/dev/null 2>&1 || true + fi + if docker ps -a -q -f name="$container_name" >/dev/null 2>&1; then + docker rm "$container_name" >/dev/null 2>&1 || true + fi +} + +get_docker_container_status() { + local container_name="$1" + if docker ps -q -f name="$container_name" >/dev/null 2>&1; then + echo "running" + elif docker ps -a -q -f name="$container_name" >/dev/null 2>&1; then + echo "stopped" + else + echo "not_found" + fi +} + +check_docker_health() { + local container_name="$1" + local port="$2" + local max_attempts="${3:-30}" + local attempt=0 + + while [ $attempt -lt $max_attempts ]; do + # First check if container is still running + if ! docker ps --format "table {{.Names}}" | grep -q "^$container_name$"; then + print_error "Container $container_name stopped running" + return 1 + fi + + # Then check if service is responding + if curl -s "http://localhost:$port" >/dev/null 2>&1; then + return 0 + fi + sleep 1 + attempt=$((attempt + 1)) + done + return 1 +} + +# Docker volume management functions +create_docker_volumes() { + local workspace_volume="rockydocs-workspace-${USER}" + local content_volume="rockydocs-content-${USER}" + + # Create workspace volume if it doesn't exist + if ! docker volume inspect "$workspace_volume" >/dev/null 2>&1; then + print_info "Creating Docker volume for workspace: $workspace_volume" + docker volume create "$workspace_volume" >/dev/null 2>&1 + fi + + # Create content volume if it doesn't exist + if ! docker volume inspect "$content_volume" >/dev/null 2>&1; then + print_info "Creating Docker volume for content: $content_volume" + docker volume create "$content_volume" >/dev/null 2>&1 + fi + + echo "$workspace_volume $content_volume" +} + +# Docker volume cleanup function +cleanup_docker_volumes() { + local workspace_volume="rockydocs-workspace-${USER}" + local content_volume="rockydocs-content-${USER}" + + print_warning "This will remove Docker volumes containing your workspace data" + read -p "Remove Docker volumes? (y/N): " confirm + if [[ "$confirm" =~ ^[Yy]$ ]]; then + print_info "Removing Docker volumes..." + docker volume rm "$workspace_volume" >/dev/null 2>&1 || true + docker volume rm "$content_volume" >/dev/null 2>&1 || true + print_success "Docker volumes removed" + else + print_info "Docker volume cleanup cancelled" + fi +} + +# Docker volume status check +show_docker_volume_status() { + local workspace_volume="rockydocs-workspace-${USER}" + local content_volume="rockydocs-content-${USER}" + + echo " • Docker volumes:" + + if docker volume inspect "$workspace_volume" >/dev/null 2>&1; then + local volume_size=$(docker system df -v 2>/dev/null | grep "$workspace_volume" | awk '{print $3}' || echo "unknown") + echo " - $workspace_volume (size: $volume_size)" + else + echo " - $workspace_volume (not created)" + fi + + if docker volume inspect "$content_volume" >/dev/null 2>&1; then + local volume_size=$(docker system df -v 2>/dev/null | grep "$content_volume" | awk '{print $3}' || echo "unknown") + echo " - $content_volume (size: $volume_size)" + else + echo " - $content_volume (not created)" + fi +} + +cleanup_docker_containers() { + local user_containers=$(docker ps -a -q -f name="rockydocs-.*-${USER}" 2>/dev/null || true) + if [ -n "$user_containers" ]; then + print_info "Cleaning up Docker containers..." + echo "$user_containers" | xargs docker rm -f >/dev/null 2>&1 || true + fi +} + +# === HELP FUNCTIONS === + +# Main help +show_help() { + cat << EOF +Rocky Linux Documentation - Master Contributor Script v$FULL_VERSION + +DESCRIPTION: + Recreates the exact look and feel of https://docs.rockylinux.org locally + for contributors to preview their changes before pushing. + +USAGE: + $0 [COMMAND] [OPTIONS] + +COMMANDS: + --setup Setup local development environment + --serve Serve existing deployed versions (fast) + --serve-dual Dual server mode: mike serve + mkdocs live reload + --deploy Build and deploy all versions locally (slow) + --clean Clean workspace and build artifacts + --reset Reset saved configuration + --status Show system status + +GLOBAL OPTIONS: + --minimal Use English + Ukrainian only (default, faster) - setup only + --full Use all languages (slower, complete testing) - setup only + --workspace PATH Custom workspace location + --help, -h Show this help + +EXAMPLES: + ./rockydocs-dev-12.sh --setup --venv # Setup Python venv environment + ./rockydocs-dev-12.sh --deploy # Build and deploy versions locally + ./rockydocs-dev-12.sh --serve # Fast serve (after deploy) + ./rockydocs-dev-12.sh --serve --static # Static production-like serve + ./rockydocs-dev-12.sh --serve-dual # Dual server with live reload + ./rockydocs-dev-12.sh --setup --full # Setup with all languages (config set once) + ./rockydocs-dev-12.sh --deploy # Build using setup's language config + +SUBCOMMAND HELP: + ./rockydocs-dev-12.sh --setup -h # Detailed setup help + ./rockydocs-dev-12.sh --serve -h # Detailed serve help + ./rockydocs-dev-12.sh --serve-dual -h # Dual server help + ./rockydocs-dev-12.sh --deploy -h # Detailed deploy help + +WORKFLOW: + 1. git checkout rocky-9 # Choose your target version + 2. ./rockydocs-dev-12.sh --setup --venv # Setup environment (once) + 3. ./rockydocs-dev-12.sh --deploy # Build/deploy versions to local repo + 4. ./rockydocs-dev-12.sh --serve # Fast serve for editing + 5. git add . && git commit && git push # Push your source changes to origin + +Current Rocky Linux version: $(detect_version) (branch: $(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown")) +EOF +} + +# Setup command help +show_setup_help() { + cat << EOF +Rocky Linux Documentation - Setup Environment + +DESCRIPTION: + Sets up local development environment that recreates the exact look and feel + of https://docs.rockylinux.org on your local machine. + +USAGE: + $0 --setup [ENVIRONMENT] [OPTIONS] + +ENVIRONMENTS: + --venv Use Python virtual environment (recommended) + --docker Use Docker container (containerized environment) + --podman Use Podman container + +OPTIONS: + --minimal Setup for English + Ukrainian only (default, faster) + --full Setup for all languages (complete testing) + --workspace PATH Custom workspace location + +THIS COMMAND RUNS: + - mkdir -p $WORKSPACE_BASE_DIR + - Searches for existing docs.rockylinux.org repository to reuse OR + - git clone https://github.com/rocky-linux/docs.rockylinux.org.git $APP_DIR + - ln -sf docs.rockylinux.org $WORKSPACE_BASE_DIR/app (compatibility symlink) + - cd $APP_DIR + + For --venv (default): + - python3 -m venv venv + - source venv/bin/activate + - pip install -r requirements.txt + + For --docker: + - docker build -t rockydocs-dev . + - Creates Docker volumes for data persistence + - ln -sf $CONTENT_DIR/docs $APP_DIR/docs + - cp configs/mkdocs.minimal.yml ./mkdocs.yml (if --minimal) + - cp configs/mkdocs.full.yml ./mkdocs.yml (if --full) + - Saves workspace configuration to ~/.config/rockydocs/config + +MANUAL ALTERNATIVE: + You can run these commands yourself: + mkdir -p $WORKSPACE_BASE_DIR + git clone https://github.com/rocky-linux/docs.rockylinux.org.git $APP_DIR + cd $APP_DIR && python3 -m venv venv && source venv/bin/activate + pip install -r requirements.txt + +AFTER SETUP: + - Content editing happens in: $CONTENT_DIR/docs/ + - App environment located at: $APP_DIR + - You can cd to app directory and run mkdocs commands directly + +WORKSPACE CONFIGURATION: + First run saves your workspace preference to ~/.config/rockydocs/config + Subsequent runs automatically use your saved workspace location + Use --workspace to change location (gets saved for future use) + Script intelligently finds and reuses existing docs.rockylinux.org repositories + +SIMPLIFIED STRUCTURE: + workspace/ + ├── docs.rockylinux.org/ # App repo (build environment) + ├── app -> docs.rockylinux.org # Compatibility symlink + └── (your content repo is wherever you cloned it) + +EOF +} + +# Serve command help +show_serve_help() { + cat << EOF +Rocky Linux Documentation - Fast Serve (No Rebuild) + +DESCRIPTION: + Starts a FAST local development server using previously deployed versions. + Serves existing mike-deployed content from gh-pages branch without rebuilding. + Use --deploy first to create/update versions if needed. + +FEATURES: + - FAST startup (no rebuilding) + - Multi-version support with version selector + - Serves pre-built content from gh-pages branch + - Root + versioned access (/, /8/, /9/, /10/, /latest/) + - Port fallback (8000 → 8001 → 8002 if ports busy) + +USAGE: + $0 --serve [ENVIRONMENT] [OPTIONS] + +ENVIRONMENTS: + (default) Use Python virtual environment setup + --docker Use Docker container for serving + +OPTIONS: + --static Serve static files (exact production behavior) + +NOTE: --minimal/--full options only apply to --setup command. Deploy uses setup's configuration. + Serve modes use whatever content was already deployed to gh-pages. + +THIS COMMAND RUNS: + For default (venv): + - cd $APP_DIR + - source venv/bin/activate + - mike serve -a localhost:PORT --config-file mkdocs.yml (if not --static) + - python3 -m http.server PORT -d site-static (if --static) + + For --docker: + - docker run -d --name rockydocs-serve-$USER -p PORT:8000 \ + -v $APP_DIR:/app -v $CONTENT_DIR/docs:/app/content \ + rockydocs-dev mkdocs serve -a 0.0.0.0:8000 (if not --static) + - docker run -d --name rockydocs-serve-$USER -p PORT:8000 \ + -v $APP_DIR:/app rockydocs-dev \ + python3 -m http.server 8000 -d /app/site-static (if --static) + +PREREQUISITES: + Run --deploy first to build/deploy versions: + $0 --deploy + +MANUAL ALTERNATIVE: + cd $APP_DIR + source venv/bin/activate + mike serve -a localhost:8000 + +ACCESS: + Local site will be available at: http://localhost:8000 (or 8001/8002) + Live reload enabled - changes appear automatically + +Current version being served: Rocky Linux $(detect_version) + +EOF +} + +# Help function for dual server mode +show_serve_dual_help() { + cat << EOF +Rocky Linux Documentation - Dual Server Mode (Live Reload) + +DESCRIPTION: + Starts DUAL servers for optimal development experience: + - Port 8000: Mike serve (multi-version with version selector) + - Port 8001: MkDocs serve (live reload for current content) + +FEATURES: + - Mike serve (8000): Multi-version support, root + versioned access + - MkDocs serve (8001): Live reload, --watch-theme support + - Simultaneous operation for different use cases + - Smart port conflict resolution + - Proper cleanup on exit + +USAGE: + $0 --serve-dual [OPTIONS] + +OPTIONS: + --minimal Use minimal config (English + Ukrainian) + --venv Use Python virtual environment + --workspace DIR Set workspace directory + +ACCESS PATTERNS: + Multi-version (Port 8000): + • http://localhost:8000/ → Rocky Linux 10 (latest) + • http://localhost:8000/10/ → Rocky Linux 10 (versioned) + • http://localhost:8000/9/ → Rocky Linux 9 + • http://localhost:8000/8/ → Rocky Linux 8 + + Live Reload (Port 8001): + • http://localhost:8001/ → Current content with live reload + • File changes automatically refresh browser + • Theme changes supported with --watch-theme + +NOTES: + - Use port 8000 for testing multi-version functionality + - Use port 8001 for active content editing with live reload + - Both servers run simultaneously in background + - Ctrl+C cleanly stops both servers + +EOF +} + +# Deploy command help +show_deploy_help() { + cat << EOF +Rocky Linux Documentation - Build and Deploy All Versions Locally + +DESCRIPTION: + Builds and deploys ALL Rocky Linux versions (8, 9, 10) locally for testing. + This is a ONE-TIME operation that creates the complete versioned site in your + local build repository. It does NOT push to any remote. + +USAGE: + $0 --deploy [ENVIRONMENT] [OPTIONS] + +ENVIRONMENTS: + (default) Use Python virtual environment setup + --docker Use Docker container for deployment + +OPTIONS: + (none) Uses language configuration set during --setup + +THIS COMMAND RUNS: + For default (venv): + - cd $APP_DIR + - Uses existing mkdocs.yml configuration from setup + - Deletes and recreates the local 'gh-pages' branch + - Setup cached repositories for each version + - source venv/bin/activate + - mike deploy 8 --title 'Rocky Linux 8' (from rocky-8 branch) + - mike deploy 9 --title 'Rocky Linux 9' (from rocky-9 branch) + - mike deploy 10 latest --title 'Rocky Linux 10' (from main branch) + - mike set-default latest + - Applies local-only commit to serve 'latest' content from web root + + For --docker: + - Uses existing mkdocs.yml configuration from setup + - Creates temporary deployment script in container + - docker run --name rockydocs-deploy-$USER \ + -v $APP_DIR:/app -v $CONTENT_DIR/docs:/app/content \ + rockydocs-dev bash /app/temp_deploy.sh + - Extracts site-static artifacts from container + - Applies web root override for production-identical serving + +MANUAL ALTERNATIVE: + cd $APP_DIR + source venv/bin/activate + mike deploy 8 9 10 latest + +OUTPUT: + Deployed versions available for serving with --serve + Use $0 --serve to start fast development server + +Current version being deployed: Rocky Linux $(detect_version) + +EOF +} + +# === SETUP FUNCTIONS === + +# Smart repository discovery and reuse +find_existing_app_repo() { + # Check if there's already a docs.rockylinux.org repo at workspace root level + local potential_paths=( + "$WORKSPACE_BASE_DIR/docs.rockylinux.org" + "$WORKSPACE_BASE_DIR/../*/docs.rockylinux.org" # Check sibling workspace directories + ) + + for path in "${potential_paths[@]}"; do + if [ -d "$path/.git" ]; then + local remote_url=$(cd "$path" && git remote get-url origin 2>/dev/null || echo "") + if [[ "$remote_url" == *"docs.rockylinux.org"* ]]; then + echo "$path" + return 0 + fi + fi + done + return 1 +} + +# Setup function +setup_environment() { + local env_type="$1" + local build_type="$2" + + print_info "Setting up Rocky Linux documentation environment..." + print_info "Target: Recreate https://docs.rockylinux.org locally" + print_info "Version: Rocky Linux $(detect_version)" + print_info "Workspace: $WORKSPACE_BASE_DIR" + + # Save workspace configuration if this is first time or different from saved + if [ ! -f "$CONFIG_FILE" ] || [ "$WORKSPACE_BASE_DIR" != "${SAVED_WORKSPACE_BASE_DIR:-}" ]; then + save_workspace_config "$WORKSPACE_BASE_DIR" + fi + + # Create workspace + run_cmd "mkdir -p $WORKSPACE_BASE_DIR" + + # Smart repository handling + if [ ! -d "$APP_DIR" ]; then + # Check if we can reuse an existing repo + local existing_repo=$(find_existing_app_repo) + if [ $? -eq 0 ] && [ -n "$existing_repo" ]; then + print_info "Found existing docs.rockylinux.org repository at: $existing_repo" + print_info "Creating symlink to reuse existing repository..." + run_cmd "ln -sf $existing_repo $APP_DIR" + else + print_info "Cloning fresh docs.rockylinux.org repository..." + run_cmd "git clone https://github.com/rocky-linux/docs.rockylinux.org.git $APP_DIR" + fi + fi + + # Create compatibility symlink for backward compatibility + if [ ! -e "$APP_COMPAT_LINK" ]; then + run_cmd "ln -sf docs.rockylinux.org $APP_COMPAT_LINK" + print_info "Created compatibility symlink: app -> docs.rockylinux.org" + fi + + # Setup environment based on type + case "$env_type" in + "venv") + setup_venv "$build_type" + ;; + "docker") + setup_docker "$build_type" + ;; + "podman") + setup_podman "$build_type" + ;; + *) + print_error "Unknown environment type: $env_type" + exit 1 + ;; + esac + + print_success "Setup complete!" + print_info "Content editing: $CONTENT_DIR/docs/" + print_info "App environment: $APP_DIR" + print_info "Next: $0 --serve" +} + +# Setup Python virtual environment +setup_venv() { + local build_type="$1" + + print_info "Setting up Python virtual environment..." + + run_cmd "cd $APP_DIR" + + if [ ! -d "venv" ]; then + run_cmd_with_rollback "python3 -m venv venv" "rm -rf venv" "Failed to create virtual environment" + fi + + # Install requirements with error handling + if ! run_cmd_with_rollback "source venv/bin/activate && pip install -r requirements.txt" "" "Failed to install requirements"; then + return 1 + fi + + # Setup content symlink using utility function + manage_content_symlink "create" "$CONTENT_DIR/docs" "content" + + # Setup config using utility function + setup_mkdocs_config "$build_type" "$APP_DIR" +} + +# Setup Docker environment +setup_docker() { + local build_type="$1" + + print_info "Setting up Docker environment..." + + # Create Dockerfile if not exists + if [ ! -f "$APP_DIR/Dockerfile.dev" ]; then + cat > "$APP_DIR/Dockerfile.dev" << 'EOF' +FROM python:3.9-slim + +# Install git (required for mkdocs-git-revision-date-localized-plugin) +RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/* + +WORKDIR /app +COPY requirements.txt . +RUN pip install -r requirements.txt + +COPY . . +EXPOSE 8000 + +CMD ["mkdocs", "serve", "-a", "0.0.0.0:8000"] +EOF + fi + + + run_cmd "cd $APP_DIR" + run_cmd "rm -rf content && ln -sf $CONTENT_DIR/docs content" + + if [ "$build_type" = "minimal" ]; then + run_cmd "cp -f configs/mkdocs.minimal.yml mkdocs.yml" + else + run_cmd "cp -f configs/mkdocs.full.yml mkdocs.yml" + fi + + run_cmd "docker build -f Dockerfile.dev -t rockydocs-dev ." + + print_info "Docker image built: rockydocs-dev" + print_info "To run: docker run -p 8000:8000 -v $CONTENT_DIR/docs:/app/content rockydocs-dev" + print_info "Or use: ./rockydocs-dev-12.sh --serve --docker (when implemented)" +} + +# Setup Podman environment +setup_podman() { + local build_type="$1" + + print_info "Setting up Podman environment..." + + # Similar to Docker but using podman commands + setup_docker "$build_type" # Reuse Docker setup logic + + run_cmd "cd $APP_DIR" + run_cmd "podman build -f Dockerfile.dev -t rockydocs-dev ." + + print_info "Podman image built: rockydocs-dev" + print_info "To run: podman run -p 8000:8000 -v $CONTENT_DIR/docs:/app/docs rockydocs-dev" +} + +# === SERVING FUNCTIONS === + +# Setup git worktrees for efficient multi-version deployment +setup_cached_repos() { + local worktree_base="$APP_DIR/worktrees" + local repo_url="https://github.com/rocky-linux/documentation.git" + + print_info "Setting up git worktrees for efficient deployment..." + + # Create worktree base directory if it doesn't exist + if [ ! -d "$worktree_base" ]; then + run_cmd "mkdir -p $worktree_base" + fi + + # Check if we have the main repository + if [ -d "$worktree_base/main/.git" ]; then + print_info "Found existing worktree setup, using cached repositories..." + cd "$worktree_base/main" + cd "$APP_DIR" + else + # Clone main repository if we don't have it + print_info "Creating main repository for git worktrees (one-time setup)..." + cd "$worktree_base" + + # Use --reference optimization if user's content repo exists and has .git + if [ -d "$CONTENT_DIR/.git" ]; then + print_info "Optimizing clone using local repository reference (saves bandwidth)..." + run_cmd "git clone --reference $CONTENT_DIR $repo_url main" + else + run_cmd "git clone $repo_url main" + fi + + cd main + # Fetch all branches we need + run_cmd "git fetch origin rocky-8:rocky-8 rocky-9:rocky-9" 2>/dev/null || true + cd "$APP_DIR" + fi + + # Create worktrees for each version if they don't exist + cd "$worktree_base/main" + + # Rocky Linux 8 worktree + if [ ! -d "$worktree_base/rocky-8" ]; then + print_info "Creating Rocky Linux 8 worktree..." + run_cmd "git worktree add ../rocky-8 rocky-8" + add_cleanup_resource "worktree:$worktree_base/rocky-8" + fi + + # Rocky Linux 9 worktree + if [ ! -d "$worktree_base/rocky-9" ]; then + print_info "Creating Rocky Linux 9 worktree..." + run_cmd "git worktree add ../rocky-9 rocky-9" + add_cleanup_resource "worktree:$worktree_base/rocky-9" + fi + + cd "$APP_DIR" + print_success "Git worktrees ready for efficient deployment" +} + +# Deploy specific version locally +deploy_version_local() { + local version=$1 + local branch=$2 + local alias=$3 + local title=$4 + local worktree_base="$APP_DIR/worktrees" + local current_version=$(detect_version) + + print_info "Deploying Rocky Linux $version (optimized)..." + + if [ "$version" = "$current_version" ]; then + # Deploy current branch content (your edits) + print_info "Using your current content for Rocky Linux $version" + + # Ensure content symlink points to current docs (clean user docs first to avoid loops) + run_cmd "rm -f $CONTENT_DIR/docs/content" # Remove any stale content symlinks from user docs + manage_content_symlink "create" "$CONTENT_DIR/docs" "content" + + if [ -n "$alias" ]; then + run_cmd_with_rollback "source venv/bin/activate && mike deploy $version $alias --title '$title'" "" "Build had warnings for Rocky Linux $version but continuing with deployment" || { + print_warning "Build had warnings for Rocky Linux $version but continuing with deployment" + } + else + run_cmd_with_rollback "source venv/bin/activate && mike deploy $version --title '$title'" "" "Build had warnings for Rocky Linux $version but continuing with deployment" || { + print_warning "Build had warnings for Rocky Linux $version but continuing with deployment" + } + fi + else + # Use git worktrees for efficient deployment + local worktree_path="$worktree_base/$branch" + if [ -d "$worktree_path" ]; then + print_info "Using git worktree for Rocky Linux $version ($branch branch)..." + + # Temporarily backup current docs and use worktree content + manage_content_symlink "backup" "$CONTENT_DIR/docs" "content" + run_cmd "ln -sf $worktree_path/docs content" + + # Deploy this version + if [ -n "$alias" ]; then + run_cmd "source venv/bin/activate && mike deploy $version $alias --title '$title'" + else + run_cmd "source venv/bin/activate && mike deploy $version --title '$title'" + fi + + # Restore current docs + manage_content_symlink "restore" "$CONTENT_DIR/docs" "content" + + print_success "Rocky Linux $version deployed successfully (worktree)" + else + print_warning "No worktree found for $branch branch - skipping Rocky Linux $version" + print_info "Run setup again to create git worktrees" + fi + fi +} + +# Deploy all Rocky Linux versions +deploy_all_versions() { + local current_version="$1" + + # Initialize git repo for mike if not exists + if [ ! -d ".git" ]; then + print_info "Initializing git repository for mike versioning..." + run_cmd "git init" + run_cmd "git config user.name 'Local Dev'" + run_cmd "git config user.email 'dev@local.dev'" + run_cmd "git add mkdocs.yml" + run_cmd "git commit -m 'Initial commit for local development'" + fi + + # Deploy all versions like production + print_info "Building complete multi-version site like production..." + deploy_version_local "8" "rocky-8" "" "Rocky Linux 8" + deploy_version_local "9" "rocky-9" "" "Rocky Linux 9" + deploy_version_local "10" "main" "latest" "Rocky Linux 10" + + # Set default to latest + print_info "Setting latest version as default for root access..." + if ! run_cmd "source venv/bin/activate && mike set-default --allow-empty latest"; then + print_error "Failed to set default version to 'latest'. Aborting." + return 1 + fi +} + +# Live serving mode with mike serve +serve_live() { + + print_info "🚀 FAST SERVE MODE: Using existing deployed versions from gh-pages" + + # Basic validation + if [ ! -d "$APP_DIR" ]; then + print_error "App directory not found: $APP_DIR" + print_info "Run: $0 --setup --venv --minimal first" + return 1 + fi + + if [ ! -d "$APP_DIR/venv" ]; then + print_error "Virtual environment not found. Run: $0 --setup --venv --minimal" + return 1 + fi + + cd "$APP_DIR" + + # Check if mike has been deployed + if ! git show-ref --verify --quiet refs/heads/gh-pages; then + print_error "No mike deployment found on gh-pages branch. Run: $0 --deploy first" + return 1 + fi + + # Mike serve still needs a valid mkdocs.yml, but will serve from gh-pages branch + # We need to ensure there's a valid config file and docs_dir exists + if [ ! -f "mkdocs.yml" ]; then + if [ -f "configs/mkdocs.minimal.yml" ]; then + run_cmd "cp configs/mkdocs.minimal.yml mkdocs.yml" + print_info "Created minimal mkdocs.yml for mike serve" + else + print_error "No mkdocs config files found" + return 1 + fi + fi + + # Ensure the docs_dir referenced in mkdocs.yml exists (mike serve requires it) + local docs_dir=$(grep "^docs_dir:" mkdocs.yml | cut -d'"' -f2 2>/dev/null || echo "content") + if [ ! -d "$docs_dir" ]; then + run_cmd "mkdir -p $docs_dir" + print_info "Created placeholder $docs_dir directory for mike serve" + fi + + # Find available port with fallback + local port=$(find_available_port 8000 8001 8002) + if [ -z "$port" ]; then + print_error "No available ports (8000, 8001, 8002). Kill existing processes or use different ports." + return 1 + fi + + print_success "🚀 Starting FAST server on port $port" + print_info " • Serving pre-built content from gh-pages branch" + print_info " • Version selector available" + print_info " • No rebuilding - content already deployed" + print_info " • Port fallback: 8000 → 8001 → 8002" + print_info "" + print_info "Access: http://localhost:$port" + print_info "" + + # Mike serve reads directly from gh-pages branch, no content symlink needed + print_command "source venv/bin/activate && mike serve -a localhost:$port" + bash -c "cd $APP_DIR && source venv/bin/activate && mike serve -a localhost:$port" +} + +# Extract static site like Vercel +extract_static_site() { + if ! git show-ref --verify --quiet refs/heads/gh-pages; then + print_error "No gh-pages branch found - mike deployment may have failed" + return 1 + fi + + print_info "Extracting static site from gh-pages branch (like Vercel)..." + + # Clean and create site-static directory + run_cmd "rm -rf site-static" + run_cmd "mkdir -p site-static" + add_cleanup_resource "dir:$PWD/site-static" + + # Extract static files from gh-pages using checkout instead of archive to preserve symlinks + print_info "Using git checkout to preserve symlinks..." + local current_branch=$(git rev-parse --abbrev-ref HEAD) + + # Stash any uncommitted changes + git stash push -m "Temporary stash for static extraction" >/dev/null 2>&1 || true + + # Checkout gh-pages branch temporarily + if ! run_cmd "git checkout gh-pages"; then + print_error "Failed to checkout gh-pages branch" + return 1 + fi + + # Copy all files to site-static directory + run_cmd "cp -r * site-static/ 2>/dev/null || true" + run_cmd "cp -r .[^.]* site-static/ 2>/dev/null || true" # Copy hidden files + + # Return to original branch + run_cmd "git checkout $current_branch" + + # Restore any stashed changes + git stash pop >/dev/null 2>&1 || true + + if [ ! -d "site-static" ] || [ "$(ls -A site-static 2>/dev/null | wc -l)" -eq 0 ]; then + print_error "Static extraction produced no content" + return 1 + fi + + print_success "Static site extracted successfully from gh-pages with symlinks preserved!" + + # Apply Vercel-style root deployment + apply_root_deployment + return $? +} + +# Apply root deployment for backward compatibility +apply_root_deployment() { + print_info "Applying Vercel-style root deployment..." + + # First check if root deployment is already applied + if [ -f "site-static/index.html" ] && [ ! -d "site-static/latest" ] && [ ! -d "site-static/10" ]; then + print_info "Root deployment already applied - content is already at web root" + print_success "Root index.html exists (content already deployed to root)" + return 0 + fi + + # Look for latest content to copy to root (handle symlinks) + local root_source="" + + # Check if latest exists (could be directory or symlink) + if [ -e "site-static/latest" ]; then + if [ -L "site-static/latest" ]; then + # Latest is a symlink, resolve it + local latest_target=$(readlink "site-static/latest" 2>/dev/null || echo "") + if [ -n "$latest_target" ] && [ -d "site-static/$latest_target" ]; then + root_source="site-static/$latest_target" + print_info "Found latest symlink pointing to $latest_target, using as root source..." + fi + elif [ -d "site-static/latest" ]; then + # Latest is a directory + root_source="site-static/latest" + print_info "Found latest directory, using as root source..." + fi + fi + + # Fallback to version 10 if latest not resolved + if [ -z "$root_source" ] && [ -d "site-static/10" ]; then + root_source="site-static/10" + print_info "Using version 10 directory as root source..." + fi + + if [ -z "$root_source" ]; then + print_warning "No suitable version directory found for root deployment" + return 1 + fi + + # Backup versions.json if it exists + if [ -f "site-static/versions.json" ]; then + run_cmd "cp site-static/versions.json site-static/versions.json.backup" + print_info "Backed up versions.json" + fi + + # Copy version content to root + print_info "Copying latest content to root for production behavior..." + run_cmd "cp -r $root_source/* site-static/ 2>/dev/null || true" + + # Restore versions.json to maintain version selector functionality + if [ -f "site-static/versions.json.backup" ]; then + run_cmd "cp site-static/versions.json.backup site-static/versions.json" + run_cmd "rm site-static/versions.json.backup" + print_info "Restored versions.json for version selector" + fi + + # Verify root content + if [ -f "site-static/index.html" ]; then + print_success "Root index.html exists (latest content deployed)" + + # Check what URLs will work + print_info "Verifying URL access patterns..." + if [ -d "site-static/8" ]; then print_info " ✅ /8/ → Rocky Linux 8"; fi + if [ -d "site-static/9" ]; then print_info " ✅ /9/ → Rocky Linux 9"; fi + if [ -d "site-static/10" ]; then print_info " ✅ /10/ → Rocky Linux 10"; fi + if [ -d "site-static/latest" ]; then print_info " ✅ /latest/ → Rocky Linux 10"; fi + print_success " ✅ / → Rocky Linux 10 (DIRECT ACCESS)" + + return 0 + else + print_error "Root index.html missing after root deployment!" + return 1 + fi +} + +# Main serve function - routes to appropriate serving mode +serve_site() { + local build_type="$1" # Ignored for serve modes - they use pre-built content + local static_mode="$2" + + # Route to appropriate serving mode + if [ "$static_mode" = "true" ]; then + serve_static + else + serve_live + fi +} + +# Dual server function +serve_dual() { + + print_info "🚀 DUAL SERVER MODE: Starting mike serve + mkdocs live reload" + print_info "Setting up dual server environment..." + + # Validate basic requirements + if [ ! -d "$APP_DIR" ]; then + print_error "App directory not found: $APP_DIR" + print_info "Run setup first: $0 --setup --minimal" + return 1 + fi + + run_cmd "cd $APP_DIR" + + # Validate environment (same as serve_live) + if [ ! -d "$APP_DIR/venv" ]; then + print_error "Virtual environment not found. Run: $0 --setup --venv --minimal" + return 1 + fi + + # Check if mike has been deployed - dual server requires mike versioning + if ! git show-ref --verify --quiet refs/heads/gh-pages; then + print_error "No mike deployment found on 'gh-pages' branch. Dual server requires mike versioning." + print_info "Run: $0 --deploy first to create the local mike deployment." + return 1 + fi + + # NOTE: No mkdocs config needed - serve_dual serves pre-built content from gh-pages + + # Setup content symlink for current content + manage_content_symlink "create" "$CONTENT_DIR/docs" "content" + + # Activate virtual environment if using it + if [ ! -f "venv/bin/activate" ]; then + print_error "Virtual environment not found. Run: $0 --setup --venv first" + return 1 + fi + print_info "Activating virtual environment..." + source venv/bin/activate + + # Find available ports with conflict resolution + local mike_port=$(find_available_port 8000 8010 8020) + local mkdocs_port=$(find_available_port 8001 8011 8021) + + if [ -z "$mike_port" ] || [ -z "$mkdocs_port" ]; then + print_error "Could not find available ports for dual server mode" + return 1 + fi + + print_success "🔧 DUAL SERVER CONFIGURATION:" + print_info " • Mike serve (multi-version): http://localhost:$mike_port" + print_info " • MkDocs serve (live reload): http://localhost:$mkdocs_port" + print_info "" + print_info "🎯 USE CASES:" + print_info " • Port $mike_port: Test multi-version functionality, version selector, and web root." + print_info " • Port $mkdocs_port: Active content editing with live reload." + print_info "" + + # Start mike serve in background + print_info "Starting mike serve in background (port $mike_port)..." + mike serve -a localhost:$mike_port --config-file mkdocs.yml > /tmp/mike-serve-$$.log 2>&1 & + local mike_pid=$! + add_cleanup_resource "pid:$mike_pid" + add_cleanup_resource "file:/tmp/mike-serve-$$.log" + + # Give mike serve time to start + sleep 2 + + # Check if mike serve started successfully + if ! kill -0 $mike_pid 2>/dev/null; then + print_error "Failed to start mike serve. Check log: /tmp/mike-serve-$$.log" + return 1 + fi + + print_success "✅ Mike serve started successfully (PID: $mike_pid)" + + # Start mkdocs serve in foreground with live reload + print_info "Starting mkdocs serve with live reload (port $mkdocs_port)..." + print_info "📝 LIVE RELOAD FEATURES:" + print_info " • File changes auto-refresh browser" + print_info " • Theme changes supported" + print_info " • Current content only (not versioned)" + print_info "" + print_warning "Press Ctrl+C to stop both servers cleanly" + print_info "" + + # Set up signal handler for clean shutdown + trap 'print_warning "Stopping dual servers..."; kill $mike_pid 2>/dev/null; exit 0' INT TERM + + # Start mkdocs serve in foreground + mkdocs serve -a localhost:$mkdocs_port --watch-theme --config-file mkdocs.yml +} + +# Deploy site function +deploy_site() { + local current_version=$(detect_version) + + print_info "🚀 DEPLOY MODE: Building and deploying ALL Rocky Linux versions locally" + print_info "This creates the complete versioned site that --serve uses" + print_info "Current branch: Rocky Linux $current_version (your edits will be in this version)" + + if [ ! -d "$APP_DIR/venv" ]; then + print_error "Environment not setup. Run: $0 --setup --venv first" + return 1 + fi + + run_cmd "cd $APP_DIR" + + # Delete existing gh-pages branch for a clean LOCAL deployment + if git show-ref --verify --quiet refs/heads/gh-pages; then + print_info "Deleting existing local gh-pages branch for a clean deployment..." + run_cmd "git branch -D gh-pages" + fi + + # Use existing mkdocs.yml config set during setup - no need to reconfigure + + # Setup repository caching and deploy all versions + print_info "Setting up cached repositories and deploying versions..." + setup_cached_repos + deploy_all_versions "$current_version" + + # Apply the web root override directly to the local gh-pages branch + apply_web_root_override_local + + print_success "🎉 Local deploy complete! All versions are ready for '--serve'." + print_info "Available versions: Rocky Linux 8, 9, 10 (latest)" + print_info "" + print_info "Next steps:" + print_info " • Use: $0 --serve --minimal # Fast serve (no rebuild)" + print_info " • Use: $0 --serve --static # Static production-like serve" + print_info "" + print_info "Deployed versions ready for fast serving with mike!" +} + +# Docker deployment function +deploy_docker() { + local current_version=$(detect_version) + + print_info "🐳 DOCKER DEPLOY MODE: Container-based multi-version deployment" + print_info "Building and deploying ALL Rocky Linux versions using Docker containers" + print_info "Current branch: Rocky Linux $current_version (your edits will be in this version)" + + # Validate Docker setup + if [ ! -d "$APP_DIR" ]; then + print_error "App directory not found: $APP_DIR" + print_info "Run setup first: $0 --setup --docker" + return 1 + fi + + # Check if Docker image exists + if ! docker image inspect rockydocs-dev >/dev/null 2>&1; then + print_error "Docker image 'rockydocs-dev' not found" + print_info "Run setup first: $0 --setup --docker" + return 1 + fi + + cd "$APP_DIR" + + # Use existing mkdocs.yml config set during setup - no need to reconfigure + print_info "Using existing mkdocs configuration from setup..." + + # Get container name for deployment + local container_name=$(get_docker_container_name "deploy") + stop_docker_container "$container_name" + + print_info "Setting up cached repositories..." + setup_cached_repos + + print_success "🚀 Starting Docker deployment container..." + + # Create deployment script inside container + local deploy_script="/tmp/deploy_all_versions.sh" + cat > "$deploy_script" << 'EOF' +#!/bin/bash +set -e + +current_version="$1" +echo "🐳 Container deployment starting..." +echo "Current version: $current_version" + +# Configure git user for timestamp preservation +git config --global user.name "Rocky Linux Documentation Bot" +git config --global user.email "noreply@rockylinux.org" + +# No virtual environment needed in Docker - packages installed globally + +# Deploy Rocky Linux 8 +if [ -d "worktrees/rocky-8" ]; then + echo "📦 Deploying Rocky Linux 8..." + rm -rf content && ln -sf worktrees/rocky-8/docs content + mike deploy 8 --config-file mkdocs.yml || echo "Warning: Rocky 8 deployment had issues" +fi + +# Deploy Rocky Linux 9 +if [ -d "worktrees/rocky-9" ]; then + echo "📦 Deploying Rocky Linux 9..." + rm -rf content && ln -sf worktrees/rocky-9/docs content + mike deploy 9 --config-file mkdocs.yml || echo "Warning: Rocky 9 deployment had issues" +fi + +# Deploy Rocky Linux 10 (current content with git history) +echo "📦 Deploying Rocky Linux 10 (current)..." +if [ -d "worktrees/main" ]; then + echo "Using worktree main for Rocky Linux 10 (with git history)..." + rm -rf content && ln -sf worktrees/main/docs content +else + echo "Fallback: Using current content directory..." + rm -rf content && ln -sf /app/content-current content +fi +mike deploy 10 latest --config-file mkdocs.yml +mike set-default latest --config-file mkdocs.yml + +echo "✅ Container deployment completed successfully!" +mike list --config-file mkdocs.yml || true +EOF + chmod +x "$deploy_script" + + # Run deployment in container + print_info "Running deployment inside Docker container..." + docker run --rm --name "$container_name" \ + -v "$APP_DIR:/app" \ + -v "$CONTENT_DIR/docs:/app/content-current" \ + -v "$deploy_script:$deploy_script" \ + --workdir /app \ + rockydocs-dev \ + bash "$deploy_script" "$current_version" + + # Clean up temporary script + rm -f "$deploy_script" + + # Apply web root override (same as venv version) + print_info "Applying web root override for production-like behavior..." + apply_web_root_override_local + + print_success "🎉 Docker deployment complete! All versions are ready for '--serve'." + print_info "Available versions: Rocky Linux 8, 9, 10 (latest)" + print_info "" + print_info "Next steps:" + print_info " • Use: $0 --serve --docker # Docker-based serving" + print_info " • Use: $0 --serve --docker --static # Static production-like serve" + print_info "" + print_info "Deployed versions ready for Docker serving!" +} + +# === STATUS FUNCTIONS === + +show_system_info() { + print_success "System Information:" + echo " • Script version: $FULL_VERSION" + echo " • Current directory: $CONTENT_DIR" + echo " • Rocky Linux version: $(detect_version) (branch: $(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown"))" + echo " • Platform: $(uname -s) $(uname -m)" +} + +# Merged environment and configuration info +show_config_env_info() { + print_success "Configuration & Environment:" + echo " • Config file: $CONFIG_FILE" + if [ -f "$CONFIG_FILE" ]; then + echo " • Saved workspace: $SAVED_WORKSPACE_BASE_DIR" + fi + echo " • Current workspace (WORKSPACE_BASE_DIR): $WORKSPACE_BASE_DIR" + echo " • Content directory (CONTENT_DIR): $CONTENT_DIR" + echo " • App directory (APP_DIR): $APP_DIR" +} + + +show_repo_status() { + local repo_type="$1" + local repo_dir="$2" + + if [ -d "$repo_dir/.git" ]; then + cd "$repo_dir" + local remote=$(git remote get-url origin 2>/dev/null || echo "unknown") + local commit=$(git rev-parse HEAD 2>/dev/null || echo "unknown") + local upstream_commit="unknown" + if git ls-remote origin HEAD >/dev/null 2>&1; then + upstream_commit=$(git ls-remote origin HEAD | cut -f1 2>/dev/null || echo "unknown") + fi + echo " • Origin: $remote" + echo " • Local commit: ${commit:0:8}" + echo " • Remote commit: ${upstream_commit:0:8}" + + # Show other remotes if they exist + local other_remotes=$(git remote | grep -v "^origin$" 2>/dev/null || true) + if [ -n "$other_remotes" ]; then + for remote_name in $other_remotes; do + local remote_url=$(git remote get-url "$remote_name" 2>/dev/null || echo "unknown") + echo " • $remote_name: $remote_url" + done + fi + + if [ "$repo_type" = "content" ]; then + local git_status=$(git status --porcelain 2>/dev/null | wc -l | tr -d ' ') + if [ "$git_status" -gt 0 ]; then + print_warning " • $git_status uncommitted changes" + else + echo " • Working tree clean" + fi + fi + cd "$CONTENT_DIR" + else + echo " • Not a git repository" + fi +} + +show_process_status() { + print_success "Active Processes:" + local mike_pids=$(pgrep -f "mike serve" 2>/dev/null || true) + local python_pids=$(pgrep -f "python.*http\.server" 2>/dev/null || true) + local mkdocs_pids=$(pgrep -f "mkdocs serve" 2>/dev/null || true) + + if [ -n "$mike_pids" ]; then + echo " • Mike serve PIDs: $mike_pids" + fi + if [ -n "$python_pids" ]; then + echo " • Python HTTP server PIDs: $python_pids" + fi + if [ -n "$mkdocs_pids" ]; then + echo " • MkDocs serve PIDs: $mkdocs_pids" + fi + if [ -z "$mike_pids" ] && [ -z "$python_pids" ] && [ -z "$mkdocs_pids" ]; then + echo " • No active documentation servers found" + fi +} + +show_port_status() { + print_success "Port Usage:" + for port in 8000 8001 8002; do + if lsof -i :$port >/dev/null 2>&1; then + local process_info=$(lsof -i :$port 2>/dev/null | tail -n 1 | awk '{print $1 " (PID " $2 ")"}') + echo " • Port $port: In use by $process_info" + else + echo " • Port $port: Available" + fi + done +} + +# Enhanced build artifacts with disk usage +show_build_artifacts() { + print_success "Build Artifacts & Disk Usage:" + + # Helper function for fast disk usage + get_disk_usage_fast() { + local path="$1" + if [ -d "$path" ]; then + du -sh "$path" 2>/dev/null | cut -f1 + else + echo "0B" + fi + } + + # Build artifacts status + if [ -d "$APP_DIR/site" ]; then + local site_size=$(get_disk_usage_fast "$APP_DIR/site") + echo " • Site directory: Found ($site_size)" + else + echo " • Site directory: Not found" + fi + + if [ -d "$APP_DIR/site-static" ]; then + local static_size=$(get_disk_usage_fast "$APP_DIR/site-static") + echo " • Static site directory: Found ($static_size)" + else + echo " • Static site directory: Not found" + fi + + if [ -f "$APP_DIR/versions.json" ]; then + echo " • Versions file: Found" + else + echo " • Versions file: Not found" + fi + + # Simple disk usage totals + local workspace_size=$(get_disk_usage_fast "$WORKSPACE_BASE_DIR") + local worktree_size=$(get_disk_usage_fast "$APP_DIR/worktrees") + echo " • Total workspace: $workspace_size" + echo " • Cached worktrees: $worktree_size" +} + +# List deployed versions (mimics mike list behavior) +list_versions() { + print_info "Listing deployed versions..." + + # Check if app directory exists + if [ ! -d "$APP_DIR" ]; then + print_error "App directory not found: $APP_DIR" + print_info "Run --setup first to create the build environment" + return 1 + fi + + cd "$APP_DIR" + + # Check if gh-pages branch exists (indicates deployment has happened) + if ! git show-ref --verify --quiet refs/heads/gh-pages; then + print_warning "No versions deployed yet" + print_info "Run --deploy first to create version deployments" + return 0 + fi + + # Extract version information from gh-pages branch + local current_branch=$(git rev-parse --abbrev-ref HEAD) + + # Check if versions.json exists on gh-pages branch + if git ls-tree gh-pages | grep -q "versions.json"; then + print_success "Deployed versions:" + # Extract version info directly from gh-pages branch without switching + git show gh-pages:versions.json | jq -r '.[] | "\(.version) [\(.title)] \(.aliases // [] | join(", ") | if . == "" then "" else "(" + . + ")" end)"' 2>/dev/null || { + # Fallback if jq fails - simple extraction + git show gh-pages:versions.json 2>/dev/null | grep -E '"version"|"title"|"aliases"' | paste - - - | sed 's/"version": "\([^"]*\)".*"title": "\([^"]*\)".*/\1 [\2]/' + } + else + print_warning "No versions.json found on gh-pages branch" + print_info "Checking for version directories..." + # List version directories directly from gh-pages + git ls-tree gh-pages | grep "^040000 tree" | awk '{print $4}' | grep -E "^[0-9]+$|^latest$" | sort -V || print_warning "No version directories found" + fi +} + +# Docker status display function +show_docker_status() { + print_success "Docker Environment:" + + # Check if Docker is available + if ! command -v docker >/dev/null 2>&1; then + echo " • Docker: Not available" + return + fi + + # Check Docker daemon status + if ! docker info >/dev/null 2>&1; then + echo " • Docker: Available but daemon not running" + return + fi + + echo " • Docker: Available and running" + + # Check for rockydocs-dev image (faster check) + if docker images -q rockydocs-dev 2>/dev/null | grep -q .; then + echo " • Docker image: rockydocs-dev (available)" + else + echo " • Docker image: rockydocs-dev (not found)" + fi + + # Check for active containers (faster) + local serve_container=$(get_docker_container_name "serve") + local deploy_container=$(get_docker_container_name "deploy") + + local serve_running=$(docker ps -q -f name="$serve_container" 2>/dev/null) + local deploy_running=$(docker ps -q -f name="$deploy_container" 2>/dev/null) + + if [ -n "$serve_running" ] || [ -n "$deploy_running" ]; then + echo " • Active containers: Yes" + if [ -n "$serve_running" ]; then + local port=$(docker port "$serve_container" 8000 2>/dev/null | cut -d: -f2) + echo " - Serving on port ${port:-unknown}" + fi + if [ -n "$deploy_running" ]; then + echo " - Deploy container running" + fi + else + echo " • Active containers: None" + fi +} + + +# Main status function - optimized and streamlined +show_status() { + print_info "Rocky Linux Documentation System Status" + echo "" + + show_system_info + echo "" + + show_config_env_info + echo "" + + print_success "Content Repository Status:" + show_repo_status "content" "$CONTENT_DIR" + echo "" + + print_success "App Repository Status:" + if [ -d "$APP_DIR" ]; then + show_repo_status "app" "$APP_DIR" + else + echo " • App directory not found: $APP_DIR" + fi + echo "" + + show_process_status + echo "" + + show_port_status + echo "" + + show_docker_status + echo "" + + show_build_artifacts +} + +# === CLEANUP FUNCTIONS === + +# Reset configuration function +reset_configuration() { + print_info "Resetting saved configuration..." + + if [ -f "$CONFIG_FILE" ]; then + print_warning "This will remove saved workspace configuration: $CONFIG_FILE" + read -p "Continue? (y/N): " confirm + if [[ "$confirm" =~ ^[Yy]$ ]]; then + run_cmd "rm -f $CONFIG_FILE" + print_success "Configuration reset - next setup will use default workspace" + else + print_info "Reset operation cancelled" + fi + else + print_info "No saved configuration found to reset" + fi +} + +# Clean function with enhanced resource management +clean_workspace() { + print_info "Cleaning workspace and build artifacts..." + + if [ -d "$WORKSPACE_BASE_DIR" ]; then + print_warning "This will remove the entire workspace directory: $WORKSPACE_BASE_DIR" + print_warning "This includes the app repository and all build artifacts" + print_info "Repository cache will be preserved for faster subsequent runs" + read -p "Continue? (y/N): " confirm + if [[ "$confirm" =~ ^[Yy]$ ]]; then + # Clean up git worktrees first to avoid permission issues + if [ -d "$APP_DIR" ]; then + print_info "Cleaning up git worktrees..." + cd "$APP_DIR" 2>/dev/null || true + for worktree in rocky-8 rocky-9 main; do + if [ -d "worktrees/$worktree" ]; then + git worktree remove --force "worktrees/$worktree" 2>/dev/null || true + fi + done + cd - >/dev/null 2>&1 || true + fi + + # Preserve cached repos for performance + if [ -d "$APP_DIR/cached-repos" ]; then + print_info "Preserving repository cache for faster startup..." + run_cmd_with_rollback "mv $APP_DIR/cached-repos /tmp/rockydocs-cache-backup" "" "Failed to backup cache" + fi + + # Fix permissions before removal + if [ -d "$WORKSPACE_BASE_DIR" ]; then + chmod -R 755 "$WORKSPACE_BASE_DIR" 2>/dev/null || true + fi + + run_cmd "rm -rf $WORKSPACE_BASE_DIR" + print_success "Workspace cleaned: $WORKSPACE_BASE_DIR" + + # Restore cache if it existed + if [ -d "/tmp/rockydocs-cache-backup" ]; then + run_cmd "mkdir -p $APP_DIR" + run_cmd "mv /tmp/rockydocs-cache-backup $APP_DIR/cached-repos" + print_info "Repository cache restored for next run" + fi + else + print_info "Clean operation cancelled" + fi + else + print_info "No workspace directory found to clean" + fi + + # Also clean any local build artifacts in current directory + if [ -d "site" ]; then + run_cmd "rm -rf site" + print_success "Local build artifacts cleaned" + fi + + # Option to clean cache completely + if [ -d "$APP_DIR/cached-repos" ]; then + print_info "" + print_warning "Repository cache found: $APP_DIR/cached-repos" + print_info "This cache makes subsequent runs much faster" + read -p "Also remove repository cache? (y/N): " clean_cache + if [[ "$clean_cache" =~ ^[Yy]$ ]]; then + run_cmd "rm -rf $APP_DIR/cached-repos" + # Also remove the empty parent directory to avoid setup issues + if [ -d "$APP_DIR" ] && [ "$(ls -A $APP_DIR 2>/dev/null | wc -l)" -eq 0 ]; then + run_cmd "rm -rf $APP_DIR" + print_info "Removed empty app directory" + fi + print_success "Repository cache cleaned (next run will be slower)" + else + print_info "Repository cache preserved for faster startup" + fi + fi + + # Option to clean Docker volumes + if command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1; then + local workspace_volume="rockydocs-workspace-${USER}" + local content_volume="rockydocs-content-${USER}" + + if docker volume inspect "$workspace_volume" >/dev/null 2>&1 || docker volume inspect "$content_volume" >/dev/null 2>&1; then + print_info "" + print_warning "Docker volumes found for Rocky Linux Documentation" + cleanup_docker_volumes + fi + fi + + # Option to clean saved configuration + if [ -f "$CONFIG_FILE" ]; then + print_info "" + print_warning "Saved configuration found: $CONFIG_FILE" + print_info "This contains your workspace preferences" + read -p "Also remove saved configuration? (y/N): " clean_config + if [[ "$clean_config" =~ ^[Yy]$ ]]; then + run_cmd "rm -f $CONFIG_FILE" + print_success "Saved configuration cleared - next setup will use defaults" + else + print_info "Saved configuration preserved" + fi + fi +} \ No newline at end of file diff --git a/tools/test_rockydocs.sh b/tools/test_rockydocs.sh new file mode 100755 index 0000000000..e3b46e9c3b --- /dev/null +++ b/tools/test_rockydocs.sh @@ -0,0 +1,810 @@ +#!/bin/bash + +# Rocky Linux Documentation - Automated Test Harness +# Tests all features of rockydocs-dev-12.sh +# Developer-only tool for validation and regression testing + +set -e + +VERSION="1.0.0" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ROCKYDOCS_SCRIPT="$SCRIPT_DIR/rockydocs-dev-12.sh" +TEST_WORKSPACE="/tmp/rocky_test_harness" +TEST_CONTENT_DIR="$TEST_WORKSPACE/test_documentation" + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +# Print functions +print_success() { echo -e "${GREEN}[PASS]${NC} $1"; } +print_fail() { echo -e "${RED}[FAIL]${NC} $1"; } +print_info() { echo -e "${BLUE}[INFO]${NC} $1"; } +print_warning() { echo -e "${YELLOW}[WARN]${NC} $1"; } + +# Test framework variables +TESTS_RUN=0 +TESTS_PASSED=0 +TESTS_FAILED=0 + +# Test case function +test_case() { + local description="$1" + local command="$2" + local expected_exit_code="${3:-0}" + + TESTS_RUN=$((TESTS_RUN + 1)) + print_info "Running test: $description" + + if eval "$command" >/dev/null 2>&1; then + local actual_exit_code=0 + else + local actual_exit_code=$? + fi + + if [ "$actual_exit_code" -eq "$expected_exit_code" ]; then + print_success "$description" + TESTS_PASSED=$((TESTS_PASSED + 1)) + else + print_fail "$description (exit code: $actual_exit_code, expected: $expected_exit_code)" + TESTS_FAILED=$((TESTS_FAILED + 1)) + return 1 + fi +} + +# Assertion functions +assert_http_status() { + local url="$1" + local expected_status="$2" + local timeout="${3:-5}" + + local actual_status=$(curl -s -o /dev/null -w "%{http_code}" --max-time $timeout "$url" 2>/dev/null || echo "000") + + if [ "$actual_status" = "$expected_status" ]; then + return 0 + else + print_fail "HTTP status mismatch for $url: got $actual_status, expected $expected_status" + return 1 + fi +} + +assert_dir_exists() { + local path="$1" + if [ -d "$path" ]; then + return 0 + else + print_fail "Directory does not exist: $path" + return 1 + fi +} + +assert_file_exists() { + local path="$1" + if [ -f "$path" ]; then + return 0 + else + print_fail "File does not exist: $path" + return 1 + fi +} + +assert_git_branch_exists() { + local repo_path="$1" + local branch="$2" + + cd "$repo_path" + if git show-ref --verify --quiet "refs/heads/$branch"; then + return 0 + else + print_fail "Git branch $branch does not exist in $repo_path" + return 1 + fi +} + +assert_git_commit_message() { + local repo_path="$1" + local branch="$2" + local substring="$3" + + cd "$repo_path" + local commit_msg=$(git log --format=%B -n 1 "$branch" 2>/dev/null || echo "") + + if [[ "$commit_msg" == *"$substring"* ]]; then + return 0 + else + print_fail "Git commit message on $branch does not contain '$substring'" + return 1 + fi +} + +assert_process_running() { + local process_pattern="$1" + if pgrep -f "$process_pattern" >/dev/null; then + return 0 + else + print_fail "Process matching '$process_pattern' is not running" + return 1 + fi +} + +assert_port_available() { + local port="$1" + if ! lsof -Pi :$port -sTCP:LISTEN -t >/dev/null; then + return 0 + else + print_fail "Port $port is not available (already in use)" + return 1 + fi +} + +assert_port_in_use() { + local port="$1" + if lsof -Pi :$port -sTCP:LISTEN -t >/dev/null; then + return 0 + else + print_fail "Port $port is not in use" + return 1 + fi +} + +assert_config_contains() { + local config_file="$1" + local pattern="$2" + + if [ -f "$config_file" ] && grep -q "$pattern" "$config_file"; then + return 0 + else + print_fail "Configuration file $config_file does not contain pattern: $pattern" + return 1 + fi +} + +assert_symlink_target() { + local symlink_path="$1" + local expected_target="$2" + + if [ -L "$symlink_path" ]; then + local actual_target=$(readlink "$symlink_path" 2>/dev/null || echo "") + if [[ "$actual_target" == *"$expected_target"* ]]; then + return 0 + else + print_fail "Symlink $symlink_path points to '$actual_target', expected to contain '$expected_target'" + return 1 + fi + else + print_fail "$symlink_path is not a symlink" + return 1 + fi +} + +# Setup test environment +setup_test_environment() { + print_info "Setting up hermetic test environment..." + + # Clean any existing test workspace + if [ -d "$TEST_WORKSPACE" ]; then + rm -rf "$TEST_WORKSPACE" + fi + + # Create test workspace + mkdir -p "$TEST_WORKSPACE" + cd "$TEST_WORKSPACE" + + # Create minimal mock documentation repository + mkdir -p "$TEST_CONTENT_DIR/docs" + cd "$TEST_CONTENT_DIR" + + # Initialize git repository + git init + git config user.name "Test User" + git config user.email "test@example.com" + + # Create basic content structure + cat > "docs/index.md" << 'EOF' +# Rocky Linux Documentation Test + +This is a test documentation site. + +## Features + +- Test content +- Multiple versions +- Version selector + +EOF + + mkdir -p "docs/guides" + cat > "docs/guides/test-guide.md" << 'EOF' +# Test Guide + +This is a test guide for validation. + +EOF + + # Create mkdocs.yml + cat > "mkdocs.yml" << 'EOF' +site_name: Rocky Linux Documentation Test +docs_dir: docs +site_dir: site + +nav: + - Home: index.md + - Guides: + - Test Guide: guides/test-guide.md + +theme: + name: material + +EOF + + # Commit initial content + git add . + git commit -m "Initial test content" + + # Create test branches + git checkout -b rocky-8 + echo "Rocky Linux 8 specific content" >> docs/index.md + git add docs/index.md + git commit -m "Rocky Linux 8 content" + + git checkout -b rocky-9 + echo "Rocky Linux 9 specific content" >> docs/index.md + git add docs/index.md + git commit -m "Rocky Linux 9 content" + + git checkout main + echo "Rocky Linux 10 specific content" >> docs/index.md + git add docs/index.md + git commit -m "Rocky Linux 10 content" + + print_success "Test environment setup complete" +} + +# Cleanup test environment +cleanup_test_environment() { + print_info "Cleaning up test environment..." + + # Kill any test servers + pkill -f "python.*http\.server" 2>/dev/null || true + pkill -f "mike serve" 2>/dev/null || true + pkill -f "mkdocs serve" 2>/dev/null || true + + # Remove test workspace + if [ -d "$TEST_WORKSPACE" ]; then + rm -rf "$TEST_WORKSPACE" + fi + + # Clean any test configuration + if [ -f "$HOME/.config/rockydocs/config" ]; then + if grep -q "$TEST_WORKSPACE" "$HOME/.config/rockydocs/config" 2>/dev/null; then + rm -f "$HOME/.config/rockydocs/config" + fi + fi + + print_success "Test environment cleaned up" +} + +# Test suite: Setup and Clean +test_setup_and_clean() { + print_info "=== Testing Setup and Clean Operations ===" + + cd "$TEST_CONTENT_DIR" + + # Test setup command + test_case "Setup creates workspace and app repository" \ + "$ROCKYDOCS_SCRIPT --setup --venv --minimal --workspace $TEST_WORKSPACE/workspace" + + # Verify setup results + test_case "App directory exists after setup" \ + "assert_dir_exists $TEST_WORKSPACE/workspace/docs.rockylinux.org" + + test_case "Virtual environment exists after setup" \ + "assert_dir_exists $TEST_WORKSPACE/workspace/docs.rockylinux.org/venv" + + test_case "Compatibility symlink exists" \ + "[ -L $TEST_WORKSPACE/workspace/app ]" + + # Test clean command + test_case "Clean removes workspace" \ + "echo 'y' | $ROCKYDOCS_SCRIPT --clean --workspace $TEST_WORKSPACE/workspace" + + test_case "Workspace removed after clean" \ + "[ ! -d $TEST_WORKSPACE/workspace ]" +} + +# Test suite: Deployment +test_deployment() { + print_info "=== Testing Deployment Operations ===" + + cd "$TEST_CONTENT_DIR" + + # Setup for deployment tests + $ROCKYDOCS_SCRIPT --setup --venv --minimal --workspace "$TEST_WORKSPACE/workspace" >/dev/null 2>&1 + + # Test deploy command + test_case "Deploy creates local gh-pages branch" \ + "$ROCKYDOCS_SCRIPT --deploy --minimal --workspace $TEST_WORKSPACE/workspace" + + # Verify deployment results + local app_dir="$TEST_WORKSPACE/workspace/docs.rockylinux.org" + + test_case "gh-pages branch exists after deploy" \ + "assert_git_branch_exists $app_dir gh-pages" + + test_case "versions.json exists in gh-pages" \ + "cd $app_dir && git show gh-pages:versions.json >/dev/null 2>&1" + + test_case "Version 8 directory exists in gh-pages" \ + "cd $app_dir && git ls-tree gh-pages:8 >/dev/null 2>&1" + + test_case "Version 9 directory exists in gh-pages" \ + "cd $app_dir && git ls-tree gh-pages:9 >/dev/null 2>&1" + + test_case "Version 10 directory exists in gh-pages" \ + "cd $app_dir && git ls-tree gh-pages:10 >/dev/null 2>&1" + + test_case "Latest directory exists in gh-pages" \ + "cd $app_dir && git ls-tree gh-pages:latest >/dev/null 2>&1" + + test_case "Web root override commit exists" \ + "assert_git_commit_message $app_dir gh-pages 'web root override'" +} + +# Test suite: Serving modes +test_serving_modes() { + print_info "=== Testing Serving Modes ===" + + cd "$TEST_CONTENT_DIR" + + # Setup for serving tests + $ROCKYDOCS_SCRIPT --setup --venv --minimal --workspace "$TEST_WORKSPACE/workspace" >/dev/null 2>&1 + $ROCKYDOCS_SCRIPT --deploy --minimal --workspace "$TEST_WORKSPACE/workspace" >/dev/null 2>&1 + + local app_dir="$TEST_WORKSPACE/workspace/docs.rockylinux.org" + + # Test mike serve mode (should not fail with config errors) + print_info "Testing mike serve mode..." + + cd "$app_dir" + # Start mike serve in background and capture output + timeout 5 bash -c "$ROCKYDOCS_SCRIPT --serve --workspace $TEST_WORKSPACE/workspace" > /tmp/serve_test.log 2>&1 & + local serve_pid=$! + + # Give server time to start + sleep 3 + + # Check if mike serve started without config errors + if grep -q "Config value.*docs_dir.*isn't an existing directory" /tmp/serve_test.log; then + test_case "Mike serve starts without config errors" "false" + else + test_case "Mike serve starts without config errors" "true" + fi + + # Clean up server + kill $serve_pid 2>/dev/null || true + pkill -f "mike serve" 2>/dev/null || true + sleep 2 + + # Test static serving mode + print_info "Testing static serving mode..." + + # First test if static extraction works without serving + cd "$app_dir" + test_case "Static extraction completes without errors" \ + "$ROCKYDOCS_SCRIPT --serve --static --workspace $TEST_WORKSPACE/workspace 2>&1 | grep -q 'Static site extracted successfully'" + + # Check if symlinks are preserved in extracted content + if [ -L "site-static/latest" ]; then + test_case "Latest symlink preserved in static extraction" "true" + + # Test if symlink target exists + local latest_target=$(readlink "site-static/latest" 2>/dev/null || echo "") + if [ -n "$latest_target" ] && [ -d "site-static/$latest_target" ]; then + test_case "Latest symlink target directory exists" "true" + else + test_case "Latest symlink target directory exists" "false" + fi + else + test_case "Latest symlink preserved in static extraction" "false" + fi + + # Test actual HTTP serving if extraction succeeded + if [ -d "site-static" ] && [ -f "site-static/index.html" ]; then + timeout 10 bash -c "$ROCKYDOCS_SCRIPT --serve --static --workspace $TEST_WORKSPACE/workspace" > /tmp/static_serve_test.log 2>&1 & + local static_serve_pid=$! + + # Give server time to start + sleep 3 + + # Test HTTP responses + test_case "Static server responds to root URL" \ + "assert_http_status http://localhost:8000/ 200" + + test_case "Static server responds to versioned URL" \ + "assert_http_status http://localhost:8000/9/ 200" + + # Clean up server + kill $static_serve_pid 2>/dev/null || true + sleep 2 + else + print_info "Skipping HTTP tests - static extraction failed" + test_case "Static server responds to root URL" "false" + test_case "Static server responds to versioned URL" "false" + fi + + # Test that static extraction works + test_case "Static site directory exists after serving" \ + "assert_dir_exists $app_dir/site-static" + + test_case "Static site contains index.html" \ + "assert_file_exists $app_dir/site-static/index.html" + + # Cleanup test logs + rm -f /tmp/serve_test.log /tmp/static_serve_test.log +} + +# Test suite: Utilities +test_utilities() { + print_info "=== Testing Utility Functions ===" + + cd "$TEST_CONTENT_DIR" + + # Test status command + test_case "Status command runs without error" \ + "$ROCKYDOCS_SCRIPT --status" + + # Test help commands + test_case "Main help displays correctly" \ + "$ROCKYDOCS_SCRIPT --help" + + test_case "Setup help displays correctly" \ + "$ROCKYDOCS_SCRIPT --setup --help" + + test_case "Serve help displays correctly" \ + "$ROCKYDOCS_SCRIPT --serve --help" + + test_case "Deploy help displays correctly" \ + "$ROCKYDOCS_SCRIPT --deploy --help" + + test_case "Dual server help displays correctly" \ + "$ROCKYDOCS_SCRIPT --serve-dual --help" +} + +# Test dependency checking +test_dependencies() { + print_info "=== Testing Dependency Checking ===" + + cd "$TEST_CONTENT_DIR" + + # Test with all dependencies available (should pass) + test_case "Dependencies check passes with all tools available" \ + "$ROCKYDOCS_SCRIPT --status" + + # This test would require temporarily hiding dependencies, which is complex + # For now, we assume the dependency check works if the script runs + print_info "Dependency checking tested indirectly through script execution" +} + +# Test configuration management +test_configuration_management() { + print_info "=== Testing Configuration Management ===" + + cd "$TEST_CONTENT_DIR" + + # Test workspace configuration persistence + local test_config_dir="$TEST_WORKSPACE/test_config" + mkdir -p "$test_config_dir" + + # Test custom workspace configuration + test_case "Custom workspace configuration is saved" \ + "$ROCKYDOCS_SCRIPT --setup --venv --minimal --workspace $test_config_dir/custom_workspace" + + # Test configuration reset + test_case "Configuration reset removes saved config" \ + "$ROCKYDOCS_SCRIPT --reset" + + # Test default workspace fallback + test_case "Default workspace fallback works after reset" \ + "$ROCKYDOCS_SCRIPT --status" +} + +# Test error handling and edge cases +test_error_handling() { + print_info "=== Testing Error Handling and Edge Cases ===" + + cd "$TEST_CONTENT_DIR" + + # Test invalid workspace path + test_case "Invalid workspace path is handled gracefully" \ + "$ROCKYDOCS_SCRIPT --setup --workspace /nonexistent/invalid/path 2>&1 | grep -q 'Error\\|Failed'" 1 + + # Test missing content directory + local temp_dir=$(mktemp -d) + cd "$temp_dir" + test_case "Missing docs directory is detected" \ + "$ROCKYDOCS_SCRIPT --setup --venv --minimal 2>&1 | grep -q 'docs.*not found\\|No docs directory'" 1 + cd "$TEST_CONTENT_DIR" + rm -rf "$temp_dir" + + # Test serve without deployment + test_case "Serve without deployment shows appropriate message" \ + "$ROCKYDOCS_SCRIPT --serve 2>&1 | grep -q 'No gh-pages branch found\\|deploy first'" 1 +} + +# Test workspace and environment variations +test_environment_variations() { + print_info "=== Testing Environment Variations ===" + + cd "$TEST_CONTENT_DIR" + + # Test different environment types + local env_workspace="$TEST_WORKSPACE/env_test" + + # Test venv environment + test_case "Virtual environment setup completes" \ + "$ROCKYDOCS_SCRIPT --setup --venv --minimal --workspace $env_workspace" + + test_case "Virtual environment directory exists" \ + "assert_dir_exists $env_workspace/docs.rockylinux.org/venv" + + test_case "Virtual environment activation script exists" \ + "assert_file_exists $env_workspace/docs.rockylinux.org/venv/bin/activate" + + # Clean for next test + rm -rf "$env_workspace" + + # Test minimal vs full build types + test_case "Minimal build configuration is applied" \ + "$ROCKYDOCS_SCRIPT --setup --venv --minimal --workspace $env_workspace && \ + grep -q 'minimal\\|en.*uk' $env_workspace/docs.rockylinux.org/configs/mkdocs.yml" + + rm -rf "$env_workspace" + + test_case "Full build configuration is applied" \ + "$ROCKYDOCS_SCRIPT --setup --venv --full --workspace $env_workspace && \ + grep -q 'full\\|languages.*all' $env_workspace/docs.rockylinux.org/configs/mkdocs.yml" +} + +# Test port management and conflict resolution +test_port_management() { + print_info "=== Testing Port Management ===" + + cd "$TEST_CONTENT_DIR" + + # Setup for port tests + $ROCKYDOCS_SCRIPT --setup --venv --minimal --workspace "$TEST_WORKSPACE/port_test" >/dev/null 2>&1 + $ROCKYDOCS_SCRIPT --deploy --minimal --workspace "$TEST_WORKSPACE/port_test" >/dev/null 2>&1 + + # Test port conflict detection + # Start a simple server on port 8000 + python3 -m http.server 8000 >/dev/null 2>&1 & + local blocking_server_pid=$! + sleep 2 + + # Test that port conflict is detected and handled + timeout 10 bash -c "$ROCKYDOCS_SCRIPT --serve --static --workspace $TEST_WORKSPACE/port_test" > /tmp/port_conflict_test.log 2>&1 & + local test_server_pid=$! + sleep 3 + + # Check if alternative port was used or conflict was reported + if grep -q "port.*conflict\\|alternative port\\|8001" /tmp/port_conflict_test.log; then + test_case "Port conflict detection and resolution works" "true" + else + test_case "Port conflict detection and resolution works" "false" + fi + + # Cleanup + kill $blocking_server_pid 2>/dev/null || true + kill $test_server_pid 2>/dev/null || true + sleep 2 + rm -f /tmp/port_conflict_test.log +} + +# Test git operations and versioning +test_git_operations() { + print_info "=== Testing Git Operations and Versioning ===" + + cd "$TEST_CONTENT_DIR" + + # Setup for git tests + local git_workspace="$TEST_WORKSPACE/git_test" + $ROCKYDOCS_SCRIPT --setup --venv --minimal --workspace "$git_workspace" >/dev/null 2>&1 + $ROCKYDOCS_SCRIPT --deploy --minimal --workspace "$git_workspace" >/dev/null 2>&1 + + local app_dir="$git_workspace/docs.rockylinux.org" + + # Test git branch operations + test_case "Git repository is properly initialized" \ + "[ -d $app_dir/.git ]" + + test_case "Worktree directory exists for caching" \ + "assert_dir_exists $app_dir/worktrees" + + # Test version detection on different branches + git checkout rocky-8 >/dev/null 2>&1 + test_case "Version detection works for rocky-8 branch" \ + "$ROCKYDOCS_SCRIPT --status | grep -q 'rocky-8\\|version 8'" + + git checkout rocky-9 >/dev/null 2>&1 + test_case "Version detection works for rocky-9 branch" \ + "$ROCKYDOCS_SCRIPT --status | grep -q 'rocky-9\\|version 9'" + + git checkout main >/dev/null 2>&1 + test_case "Version detection works for main branch" \ + "$ROCKYDOCS_SCRIPT --status | grep -q 'main\\|version 10'" + + # Test git operations in app repository + cd "$app_dir" + test_case "Worktree main cache exists" \ + "assert_dir_exists $app_dir/worktrees/main" + + test_case "Content symlink is properly created" \ + "[ -L content ] && [ -d content ]" + + cd "$TEST_CONTENT_DIR" +} + +# Test performance optimizations +test_performance_features() { + print_info "=== Testing Performance Features ===" + + cd "$TEST_CONTENT_DIR" + + # Setup for performance tests + local perf_workspace="$TEST_WORKSPACE/performance_test" + + # Time the setup process + local start_time=$(date +%s) + test_case "Performance-optimized setup completes efficiently" \ + "$ROCKYDOCS_SCRIPT --setup --venv --minimal --workspace $perf_workspace" + local setup_time=$(($(date +%s) - start_time)) + + print_info "Setup completed in ${setup_time}s" + + # Test cached repository reuse + local app_dir="$perf_workspace/docs.rockylinux.org" + test_case "Repository caching is working" \ + "[ -d $app_dir/worktrees/main/.git ]" + + # Test consolidated git operations + start_time=$(date +%s) + test_case "Performance-optimized deployment completes efficiently" \ + "$ROCKYDOCS_SCRIPT --deploy --minimal --workspace $perf_workspace" + local deploy_time=$(($(date +%s) - start_time)) + + print_info "Deployment completed in ${deploy_time}s" + + # Test optimized web root override + cd "$app_dir" + if git show-ref --verify --quiet refs/heads/gh-pages; then + test_case "Optimized web root override creates commit efficiently" \ + "git log --oneline gh-pages | head -1 | grep -q 'optimized.*web root override'" + else + test_case "Optimized web root override creates commit efficiently" "false" + fi + + cd "$TEST_CONTENT_DIR" +} + +# Main test runner +run_all_tests() { + print_info "Rocky Linux Documentation Test Harness v$VERSION" + print_info "Testing rockydocs-dev-12.sh functionality" + echo "" + + # Verify test script exists + if [ ! -f "$ROCKYDOCS_SCRIPT" ]; then + print_fail "Test subject not found: $ROCKYDOCS_SCRIPT" + exit 1 + fi + + # Setup test environment + setup_test_environment + + # Run test suites + test_dependencies + test_setup_and_clean + test_deployment + test_serving_modes + test_utilities + test_configuration_management + test_error_handling + test_environment_variations + test_port_management + test_git_operations + test_performance_features + + # Cleanup + cleanup_test_environment + + # Report results + echo "" + print_info "=== Test Results ===" + echo "Tests run: $TESTS_RUN" + echo "Passed: $TESTS_PASSED" + echo "Failed: $TESTS_FAILED" + + if [ $TESTS_FAILED -eq 0 ]; then + print_success "All tests passed!" + exit 0 + else + print_fail "$TESTS_FAILED test(s) failed" + exit 1 + fi +} + +# Handle command line arguments +case "${1:-run}" in + --help|-h) + cat << EOF +Rocky Linux Documentation Test Harness v$VERSION + +DESCRIPTION: + Comprehensive automated test suite for rockydocs-dev-12.sh functionality. + Runs extensive tests in hermetic environments with full coverage validation. + +USAGE: + $0 [COMMAND] + +COMMANDS: + run Run all tests (default) + setup Setup test environment only + cleanup Cleanup test environment only + --help, -h Show this help + +ENVIRONMENT: + Test workspace: $TEST_WORKSPACE + Subject script: $ROCKYDOCS_SCRIPT + +TEST COVERAGE: + ✅ Setup and Clean Operations - Workspace management validation + ✅ Deployment Operations - Multi-version deployment testing + ✅ Serving Modes - Live and static serving validation + ✅ Utility Functions - Status, help, and configuration commands + ✅ Configuration Management - Workspace configuration persistence + ✅ Error Handling & Edge Cases - Graceful failure and error detection + ✅ Environment Variations - Virtual environment and build types + ✅ Port Management - Conflict detection and resolution + ✅ Git Operations & Versioning - Repository operations and branch handling + ✅ Performance Features - Optimization validation and timing + +FEATURES: + • Hermetic test environments with no external dependencies + • HTTP response validation with actual server testing + • Git repository and branch validation + • Symlink preservation testing + • Port conflict resolution testing + • Performance timing and optimization validation + • Configuration persistence and workspace management + • Error handling and edge case detection + +NOTES: + - All tests run in isolated temporary directories + - No interference with real workspaces or configurations + - Comprehensive regression detection and validation + - Automatically cleans up after completion + - Developer-only tool, not for end users + +EOF + exit 0 + ;; + setup) + setup_test_environment + exit 0 + ;; + cleanup) + cleanup_test_environment + exit 0 + ;; + run|"") + run_all_tests + ;; + *) + print_fail "Unknown command: $1" + echo "Use --help for usage information" + exit 1 + ;; +esac \ No newline at end of file From 670f7d479b68d9c1de4e238389e4b7ea4a72df66 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Sat, 13 Sep 2025 08:15:20 -0400 Subject: [PATCH 142/164] New Crowdin updates (#2877) * New translations 00-toc.md (German) * New translations readme.md (German) * New translations index.md (German) * New translations 00-toc.md (German) --- docs/books/admin_guide/00-toc.de.md | 2 +- docs/guides/contribute/README.de.md | 2 +- docs/labs/index.de.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/books/admin_guide/00-toc.de.md b/docs/books/admin_guide/00-toc.de.md index ff33d025c4..32fd0b88d1 100644 --- a/docs/books/admin_guide/00-toc.de.md +++ b/docs/books/admin_guide/00-toc.de.md @@ -24,4 +24,4 @@ Die Beschreibung der Sicherung und Wiederherstellung enthält wichtige Informati Die Verwaltung des Systems während des Startvorgangs hat sich in den letzten Jahren seit der Einführung von systemd erheblich verändert. -Die letzten Kapitel behandeln Prozessmanagement, Netzwerkimplementierung und Softwaremanagement, einschließlich Installation. +Die letzten Kapitel behandeln Prozessmanagement, Netzwerkimplementierung und Softwaremanagement, einschließlich Installation.

    🌐 Übersetzungen: crowdin.com/project/rockydocs
    🌍 Übersetzer: crowdin.com/project/rockydocs/activity-stream
    diff --git a/docs/guides/contribute/README.de.md b/docs/guides/contribute/README.de.md index 8a33348c7d..d172653975 100644 --- a/docs/guides/contribute/README.de.md +++ b/docs/guides/contribute/README.de.md @@ -1 +1 @@ -../../../README.md \ No newline at end of file +../../../README.md

    Übersetzungen: crowdin.com/project/rockydocs
    Übersetzer: crowdin.com/project/rockydocs/activity-stream
    \ No newline at end of file diff --git a/docs/labs/index.de.md b/docs/labs/index.de.md index 2753000bb1..dff3646681 100644 --- a/docs/labs/index.de.md +++ b/docs/labs/index.de.md @@ -6,4 +6,4 @@ title: Tutorial Labs Was sind **Labs** und wie unterscheiden sie sich von längeren Dokumentationen wie unter **Books**? Die **Labos** sind Workshops, die es Ihnen ermöglichen, in bestimmten Themen Schritt für Schritt voranzukommen, um den Lernprozess zu optimieren. Dazu gehören Übungen zur Überprüfung des erworbenen Wissens. Diese Workshops dienen ausschließlich Pädagogischen- und Bildunds-Zwecken. Sie sollen Ihnen helfen, bestimmte Themen der Systemadministration zu verstehen, zum Experimentieren anzuregen, die Zusammenarbeit zu fördern, usw. – und das in einer sicheren, simulierten Laborumgebung. -Verfügen Sie über Erfahrungen in einem Fachgebiet, die sich auf ein Labor-Thema übertragen lassen? Großartig! Wir würden uns über Ihre Teilnahme freuen. Die Teilnahme unterscheidet sich nicht von der Teilnahme an der Rocky Linux-Dokumentation – gehen Sie einfach zum Kanal [Mattermost Documentation](https://chat.rockylinux.org/rocky-linux/channels/documentation) und treten Sie bei. Teilen Sie uns mit, was Sie schreiben möchten, und wir begleiten Sie in Ihrem Vorhaben. +Verfügen Sie über Erfahrungen in einem Fachgebiet, die sich auf ein Labor-Thema übertragen lassen? Großartig! Wir würden uns über Ihre Teilnahme freuen. Die Teilnahme unterscheidet sich nicht von der Teilnahme an der Rocky Linux-Dokumentation – gehen Sie einfach zum Kanal [Mattermost Documentation](https://chat.rockylinux.org/rocky-linux/channels/documentation) und treten Sie bei. Teilen Sie uns mit, was Sie schreiben möchten, und wir begleiten Sie in Ihrem Vorhaben.

    Übersetzungen: crowdin.com/project/rockydocs
    Übersetzer: crowdin.com/project/rockydocs/activity-stream
    From eedd00cf5acdf1e07616c26ce612572ea59a6d65 Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Sat, 13 Sep 2025 08:30:45 -0500 Subject: [PATCH 143/164] Fix line length issue (#2878) --- docs/guides/contribute/rockydocs_formatting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/contribute/rockydocs_formatting.md b/docs/guides/contribute/rockydocs_formatting.md index aba27d6480..c4c2d6e2aa 100644 --- a/docs/guides/contribute/rockydocs_formatting.md +++ b/docs/guides/contribute/rockydocs_formatting.md @@ -233,7 +233,7 @@ Here is an example of a multi-line numbered list with a code block thrown in for dnf update ``` -2. Here is our second listed item. Because you used the four (4) space indentation (above), it renders with the next sequence of numbering (2), but if you had entered item 1 without the indentation (in the subsequent paragraph and code), then this would show up as item 1 again, which is not what you want. +2. Here is our second listed item. Because you used the four (4) space indentation (above), it renders with the next sequence of numbering (2). If you had entered item 1 without the indentation (in the subsequent paragraph and code), then this would show up as item 1 again, which is not what you want. And here is how that looks as raw text: From bdf9a6de20d43e0fadace2b12bd6103e8e7b9d7c Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Sun, 14 Sep 2025 09:44:12 -0400 Subject: [PATCH 144/164] New Crowdin updates (#2879) * New translations index.md (French) * New translations index.md (French) * New translations index.md (French) * New translations index.md (French) * New translations index.md (French) * New translations readme.md (French) * New translations readme.md (Spanish) * New translations readme.md (Spanish) --- docs/guides/contribute/README.es.md | 2 +- docs/guides/contribute/README.fr.md | 2 +- docs/index.fr.md | 2 +- docs/labs/index.fr.md | 2 +- docs/release_notes/index.fr.md | 2 +- docs/rocky_insights/links/sigs/index.fr.md | 4 +++- 6 files changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/guides/contribute/README.es.md b/docs/guides/contribute/README.es.md index 27dc19b3ae..1f7b782265 100644 --- a/docs/guides/contribute/README.es.md +++ b/docs/guides/contribute/README.es.md @@ -1 +1 @@ -./../../README.md \ No newline at end of file +./../../README.md

    🌐 Translations: crowdin.com/project/rockydocs
    🌍 Translators: crowdin.com/project/rockydocs/activity-stream
    🖋 Contributors: github.com/rocky-linux/documentation
    \ No newline at end of file diff --git a/docs/guides/contribute/README.fr.md b/docs/guides/contribute/README.fr.md index 8a33348c7d..cedcc52621 100644 --- a/docs/guides/contribute/README.fr.md +++ b/docs/guides/contribute/README.fr.md @@ -1 +1 @@ -../../../README.md \ No newline at end of file +../../../README.md

    🌐 Traductions: crowdin.com/project/rockydocs
    🌍 Traducteurs: crowdin.com/project/rockydocs/activity-stream
    🖋 Contributeurs: github.com/rocky-linux/documentation
    \ No newline at end of file diff --git a/docs/index.fr.md b/docs/index.fr.md index 4bc3e14d30..6c3c4ac32b 100644 --- a/docs/index.fr.md +++ b/docs/index.fr.md @@ -63,4 +63,4 @@ Si vous êtes coincé et que vous avez une question, la communauté Rocky Linux ## Votre Contribution -Avez-vous trouvé quelque chose de manquant ? Avez-vous trouvé une erreur ? Vous vous demandez comment créer votre propre document ou comment en corriger un ? Rappelez-vous lorsque nous avons dit que *vous* étiez la communauté Rocky Linux ? Cela signifie que *vous* êtes important pour nous et nous voulons que vous nous rejoigniez, si vous le voulez, et que vous nous aidiez à améliorer cette documentation. Si cela vous intéresse, rendez-vous sur notre [Guide de Contribution](https://github.com/rocky-linux/documentation/blob/main/README.md) pour savoir comment faire !

    Traductions: https://crowdin.com/project/rockydocs

    Traducteurs: https://crowdin.com/project/rockydocs/activity-stream
    +Avez-vous trouvé quelque chose de manquant ? Avez-vous trouvé une erreur ? Vous vous demandez comment créer votre propre document ou comment en corriger un ? Rappelez-vous lorsque nous avons dit que *vous* étiez la communauté Rocky Linux ? Cela signifie que *vous* êtes important pour nous et nous voulons que vous nous rejoigniez, si vous le voulez, et que vous nous aidiez à améliorer cette documentation. Si cela vous intéresse, rendez-vous sur notre [Guide de Contribution](https://github.com/rocky-linux/documentation/blob/main/README.md) pour savoir comment faire !

    🌐 Traductions: crowdin.com/project/rockydocs
    🌍 Traducteurs: crowdin.com/project/rockydocs/activity-stream
    🖋 Contributeurs: github.com/rocky-linux/documentation
    diff --git a/docs/labs/index.fr.md b/docs/labs/index.fr.md index bb5417eebb..2e463275ab 100644 --- a/docs/labs/index.fr.md +++ b/docs/labs/index.fr.md @@ -6,4 +6,4 @@ title: Tutoriels (Labos) Quels sont ces ateliers **Labos** et quelle est la différence avec la documentation plus détaillée dans la catégorie **Livres** ? Les **Labos** sont des ateliers qui permettent d'évoluer étape par étape dans certains sujets de manière à optimiser le processus d'apprentissage. Ils contiennent des exercices qui permettent de tester vos connaissances. Ces ateliers sont destinés uniquement à des fins pédagogiques. Ils sont conçus pour vous aider à comprendre des sujets particuliers liés à l'administration système, à stimuler l'expérimentation, à encourager la collaboration, etc., dans un environnement de laboratoire simulé et sécurisé. -Vous possédez des connaissances particulières que vous aimeriez intégrer dans ces labos ? C'est super ! Votre participation à Rocky Linux est la bienvenue. Participer aux labos n'est pas très différent de la participation à la documentation Rocky Linux -- allez simplement sur le canal [Mattermost Documentation](https://chat.rockylinux.org/rocky-linux/channels/documentation), rejoignez la conversation, dites-nous ce que vous voulez écrire et nous vous accompagnerons dans votre projet. +Vous possédez des connaissances particulières que vous aimeriez intégrer dans ces ateliers ? C'est super ! Votre participation à Rocky Linux est la bienvenue. Participer aux labos n'est pas très différent de la participation à la documentation Rocky Linux -- allez simplement sur le canal [Mattermost Documentation](https://chat.rockylinux.org/rocky-linux/channels/documentation), rejoignez la conversation, dites-nous ce que vous voulez écrire et nous vous accompagnerons dans votre projet.

    🌐 Traductions: https://crowdin.com/project/rockydocs
    🌍 Traducteurs: https://crowdin.com/project/rockydocs/activity-stream
    diff --git a/docs/release_notes/index.fr.md b/docs/release_notes/index.fr.md index efd32db461..de537b9fc5 100644 --- a/docs/release_notes/index.fr.md +++ b/docs/release_notes/index.fr.md @@ -55,4 +55,4 @@ Rocky 8 (Code Name "Green Obsidian") a un support général jusqu'au 1er mai 202 | 8.9 | 2023-11-22 | 4.18.0-513.5.1 | | 8.10 | 2024-05-31 | 4.18.0-553 | -Si vous avez des questions ou des commentaires, veuillez nous joindre dans le forum de discussion [ici](https://chat.rockylinux.org/rocky-linux/channels/documentation). +Si vous avez des questions ou des commentaires, veuillez nous joindre dans le forum de discussion [ici](https://chat.rockylinux.org/rocky-linux/channels/documentation).

    🌐 Traductions: https://crowdin.com/project/rockydocs
    🌍 Traducteurs: https://crowdin.com/project/rockydocs/activity-stream
    diff --git a/docs/rocky_insights/links/sigs/index.fr.md b/docs/rocky_insights/links/sigs/index.fr.md index 27e540cbcf..2840978d92 100644 --- a/docs/rocky_insights/links/sigs/index.fr.md +++ b/docs/rocky_insights/links/sigs/index.fr.md @@ -7,4 +7,6 @@ contributors: - Architecture Alternative [SIG/AltArch](https://sig-altarch.rocky.page) - Services Cloud [SIG/Cloud](https://sig-cloud.rocky.page/) - Infrastructure [SIG/Infra](https://infra.rocky.page/) -- Ingénierie de Publication [SIG/Core](https://sig-core.rocky.page) +- Ingénierie de Publication [SIG/Core](https://sig-core.rocky.page)

    + 🌐 Traductions: https://crowdin.com/project/rockydocs
    + 🌍 Traducteurs: https://crowdin.com/project/rockydocs/activity-stream
    From b9d224eb058a0776ca0d32b4589249bba8d07925 Mon Sep 17 00:00:00 2001 From: Rocky Linux Automation <75949597+rockylinux-auto@users.noreply.github.com> Date: Sun, 14 Sep 2025 20:50:20 -0400 Subject: [PATCH 145/164] New Crowdin updates (#2880) * New translations readme.md (Portuguese) * New translations readme.md (Portuguese, Brazilian) * New translations readme.md (Spanish) * New translations readme.md (German) --- docs/guides/contribute/README.de.md | 2 +- docs/guides/contribute/README.es.md | 2 +- docs/guides/contribute/README.pt-BR.md | 1 + docs/guides/contribute/README.pt.md | 1 + 4 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 docs/guides/contribute/README.pt-BR.md create mode 100644 docs/guides/contribute/README.pt.md diff --git a/docs/guides/contribute/README.de.md b/docs/guides/contribute/README.de.md index d172653975..3b1e76e98e 100644 --- a/docs/guides/contribute/README.de.md +++ b/docs/guides/contribute/README.de.md @@ -1 +1 @@ -../../../README.md

    Übersetzungen: crowdin.com/project/rockydocs
    Übersetzer: crowdin.com/project/rockydocs/activity-stream
    \ No newline at end of file +

    🌐 Translations: crowdin.com/project/rockydocs
    🌍 Translators: rockydocs/activity-stream , rockylinux.org
    🖋 Contributors: github.com/rocky-linux/documentation
    \ No newline at end of file diff --git a/docs/guides/contribute/README.es.md b/docs/guides/contribute/README.es.md index 1f7b782265..0fcb823f6e 100644 --- a/docs/guides/contribute/README.es.md +++ b/docs/guides/contribute/README.es.md @@ -1 +1 @@ -./../../README.md

    🌐 Translations: crowdin.com/project/rockydocs
    🌍 Translators: crowdin.com/project/rockydocs/activity-stream
    🖋 Contributors: github.com/rocky-linux/documentation
    \ No newline at end of file +./../../README.md

    🌐 Translations: crowdin.com/project/rockydocs
    🌍 Translators: crowdin.com/project/rockydocs/activity-stream
    🖋 Contributors: github.com/rocky-linux/documentation
    \ No newline at end of file diff --git a/docs/guides/contribute/README.pt-BR.md b/docs/guides/contribute/README.pt-BR.md new file mode 100644 index 0000000000..147f61595a --- /dev/null +++ b/docs/guides/contribute/README.pt-BR.md @@ -0,0 +1 @@ +./../../README.md

    🌐 Translations: crowdin.com/project/rockydocs
    🌍 Translators: crowdin.com/project/rockydocs/activity-stream
    🖋 Contributors: github.com/rocky-linux/documentation
    \ No newline at end of file diff --git a/docs/guides/contribute/README.pt.md b/docs/guides/contribute/README.pt.md new file mode 100644 index 0000000000..ca3bd2bf05 --- /dev/null +++ b/docs/guides/contribute/README.pt.md @@ -0,0 +1 @@ +./../../README.md

    🌐 Translations: crowdin.com/project/rockydocs
    🌍 Translators: crowdin.com/project/rockydocs/activity-stream
    🖋 Contributors: github.com/rocky-linux/documentation
    \ No newline at end of file From 56792c1da0fc86e36efd29ffbbffd8ad0f3f8cf3 Mon Sep 17 00:00:00 2001 From: wale soyinka Date: Sun, 14 Sep 2025 21:26:51 -0400 Subject: [PATCH 146/164] Create trigger_vercel_deploy.yml --- .github/workflows/trigger_vercel_deploy.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .github/workflows/trigger_vercel_deploy.yml diff --git a/.github/workflows/trigger_vercel_deploy.yml b/.github/workflows/trigger_vercel_deploy.yml new file mode 100644 index 0000000000..38336efc2d --- /dev/null +++ b/.github/workflows/trigger_vercel_deploy.yml @@ -0,0 +1,13 @@ +name: Trigger Vercel Deploy + +on: + push: + branches: + - main + +jobs: + trigger-deploy: + runs-on: ubuntu-latest + steps: + - name: Trigger Vercel Deploy Hook + run: curl -X POST "${{ secrets.VERCEL_DEPLOY_HOOK_URL }} From fb3020de19e76287f6e43952250ff6de3cd97d8a Mon Sep 17 00:00:00 2001 From: wale soyinka Date: Sun, 14 Sep 2025 21:29:39 -0400 Subject: [PATCH 147/164] Update CHANGELOG.md --- tools/CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/CHANGELOG.md b/tools/CHANGELOG.md index 38d2f9a4e8..eaaa1dd194 100644 --- a/tools/CHANGELOG.md +++ b/tools/CHANGELOG.md @@ -2,7 +2,6 @@ All notable changes to the `rockydocs.sh` script will be documented in this file. -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to NEVRA versioning (Name-Version-Release). +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). No versioned commits found yet. From efaf9130d921f48cdb56db46e28e1627d8a84d22 Mon Sep 17 00:00:00 2001 From: wale soyinka Date: Sun, 14 Sep 2025 21:32:02 -0400 Subject: [PATCH 148/164] Update trigger_vercel_deploy.yml Missing " --- .github/workflows/trigger_vercel_deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/trigger_vercel_deploy.yml b/.github/workflows/trigger_vercel_deploy.yml index 38336efc2d..8e39d3e672 100644 --- a/.github/workflows/trigger_vercel_deploy.yml +++ b/.github/workflows/trigger_vercel_deploy.yml @@ -10,4 +10,4 @@ jobs: runs-on: ubuntu-latest steps: - name: Trigger Vercel Deploy Hook - run: curl -X POST "${{ secrets.VERCEL_DEPLOY_HOOK_URL }} + run: curl -X POST "${{ secrets.VERCEL_DEPLOY_HOOK_URL }}" From 7dee7496668d04209b65b57b5d8edc3493157e7d Mon Sep 17 00:00:00 2001 From: wale soyinka Date: Sun, 14 Sep 2025 21:48:08 -0400 Subject: [PATCH 149/164] Update trigger_vercel_deploy.yml --- .github/workflows/trigger_vercel_deploy.yml | 26 +++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/.github/workflows/trigger_vercel_deploy.yml b/.github/workflows/trigger_vercel_deploy.yml index 8e39d3e672..3f096b109f 100644 --- a/.github/workflows/trigger_vercel_deploy.yml +++ b/.github/workflows/trigger_vercel_deploy.yml @@ -4,10 +4,32 @@ on: push: branches: - main + - rocky-8 + - rocky-9 jobs: trigger-deploy: runs-on: ubuntu-latest steps: - - name: Trigger Vercel Deploy Hook - run: curl -X POST "${{ secrets.VERCEL_DEPLOY_HOOK_URL }}" + - name: Trigger Vercel Deploy with Metadata + run: | + # Safely escape the commit message for JSON. This handles newlines, quotes, and backslashes. + MESSAGE=$(echo "${{ github.event.head_commit.message }}" | awk 'NR==1{printf "%s", $0; next} {printf "\\n%s", $0}' | sed -e 's/\\/\\\\/g' -e 's/"/\\"/g') + + # Trigger the deployment by calling the Vercel API + curl -X POST "https://api.vercel.com/v13/deployments?teamId=${{ secrets.VERCEL_TEAM_ID }}&projectId=${{ secrets.VERCEL_PROJECT_ID }}" \ + -H "Authorization: Bearer ${{ secrets.VERCEL_TOKEN }}" \ + -H "Content-Type: application/json" \ + -d @- < Date: Sun, 14 Sep 2025 22:05:19 -0400 Subject: [PATCH 150/164] Update trigger_vercel_deploy.yml --- .github/workflows/trigger_vercel_deploy.yml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/trigger_vercel_deploy.yml b/.github/workflows/trigger_vercel_deploy.yml index 3f096b109f..6e12370516 100644 --- a/.github/workflows/trigger_vercel_deploy.yml +++ b/.github/workflows/trigger_vercel_deploy.yml @@ -13,14 +13,11 @@ jobs: steps: - name: Trigger Vercel Deploy with Metadata run: | - # Safely escape the commit message for JSON. This handles newlines, quotes, and backslashes. + # Safely escape the commit message for JSON. MESSAGE=$(echo "${{ github.event.head_commit.message }}" | awk 'NR==1{printf "%s", $0; next} {printf "\\n%s", $0}' | sed -e 's/\\/\\\\/g' -e 's/"/\\"/g') - # Trigger the deployment by calling the Vercel API - curl -X POST "https://api.vercel.com/v13/deployments?teamId=${{ secrets.VERCEL_TEAM_ID }}&projectId=${{ secrets.VERCEL_PROJECT_ID }}" \ - -H "Authorization: Bearer ${{ secrets.VERCEL_TOKEN }}" \ - -H "Content-Type: application/json" \ - -d @- < Date: Sun, 14 Sep 2025 22:10:37 -0400 Subject: [PATCH 151/164] Update trigger_vercel_deploy.yml --- .github/workflows/trigger_vercel_deploy.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/trigger_vercel_deploy.yml b/.github/workflows/trigger_vercel_deploy.yml index 6e12370516..c8d9700109 100644 --- a/.github/workflows/trigger_vercel_deploy.yml +++ b/.github/workflows/trigger_vercel_deploy.yml @@ -14,12 +14,18 @@ jobs: - name: Trigger Vercel Deploy with Metadata run: | # Safely escape the commit message for JSON. - MESSAGE=$(echo "${{ github.event.head_commit.message }}" | awk 'NR==1{printf "%s", $0; next} {printf "\\n%s", $0}' | sed -e 's/\\/\\\\/g' -e 's/"/\\"/g') + MESSAGE=$(echo "${{ github.event.head_commit.message }}" | awk 'NR==1{printf "%s", $0; next} {printf "\\n%s", $0}' | sed -e 's/\\/\\\\/g' -e 's/"/\"/g') - # Prepare the JSON payload using a Heredoc into a variable + # Prepare the JSON payload, including the gitSource to specify what to build. JSON_PAYLOAD=$(cat < Date: Sun, 14 Sep 2025 22:16:15 -0400 Subject: [PATCH 152/164] Update trigger_vercel_deploy.yml --- .github/workflows/trigger_vercel_deploy.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/trigger_vercel_deploy.yml b/.github/workflows/trigger_vercel_deploy.yml index c8d9700109..90d21da1df 100644 --- a/.github/workflows/trigger_vercel_deploy.yml +++ b/.github/workflows/trigger_vercel_deploy.yml @@ -22,8 +22,7 @@ jobs: "name": "docs.rockylinux.org", "gitSource": { "type": "github", - "repo": "docs.rockylinux.org", - "owner": "rocky-linux", + "repoId": "${{ secrets.VERCEL_APP_REPO_ID }}", "ref": "main" }, "target": "production", From 58fd4a85df4e1b70c134d4ef379e1e666d8b4069 Mon Sep 17 00:00:00 2001 From: wale soyinka Date: Sun, 14 Sep 2025 22:44:51 -0400 Subject: [PATCH 153/164] Update and rename trigger_vercel_deploy.yml to trigger_vercel_deploy_v1_simple_hook.yml --- .github/workflows/trigger_vercel_deploy.yml | 44 ------------------- .../trigger_vercel_deploy_v1_simple_hook.yml | 18 ++++++++ 2 files changed, 18 insertions(+), 44 deletions(-) delete mode 100644 .github/workflows/trigger_vercel_deploy.yml create mode 100644 .github/workflows/trigger_vercel_deploy_v1_simple_hook.yml diff --git a/.github/workflows/trigger_vercel_deploy.yml b/.github/workflows/trigger_vercel_deploy.yml deleted file mode 100644 index 90d21da1df..0000000000 --- a/.github/workflows/trigger_vercel_deploy.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: Trigger Vercel Deploy - -on: - push: - branches: - - main - - rocky-8 - - rocky-9 - -jobs: - trigger-deploy: - runs-on: ubuntu-latest - steps: - - name: Trigger Vercel Deploy with Metadata - run: | - # Safely escape the commit message for JSON. - MESSAGE=$(echo "${{ github.event.head_commit.message }}" | awk 'NR==1{printf "%s", $0; next} {printf "\\n%s", $0}' | sed -e 's/\\/\\\\/g' -e 's/"/\"/g') - - # Prepare the JSON payload, including the gitSource to specify what to build. - JSON_PAYLOAD=$(cat < Date: Wed, 17 Sep 2025 09:44:47 -0400 Subject: [PATCH 154/164] New Crowdin updates (#2881) * New translations readme.md (German) * New translations index.md (German) * New translations 05-load-balancer-proxies.md (German) * New translations index.md (French) * New translations index.md (German) * New translations gemstone_template.md (German) * New translations 04-database-servers.md (German) * New translations index.md (German) * New translations 04-database-servers.md (German) * New translations 01-files-servers.md (German) * New translations 01-files-servers.md (Spanish) * New translations 01-files-servers.md (German) * New translations 04-database-servers.md (German) * New translations 01-files-servers.md (German) * New translations vmware_tools.md (French) * New translations migrate2rocky.md (French) * New translations installation.md (French) * New translations 05-load-balancer-proxies.md (French) * New translations index.md (Spanish) * New translations 05-load-balancer-proxies.md (German) * New translations index.md (German) --- .../books/web_services/01-files-servers.de.md | 16 +- .../books/web_services/01-files-servers.es.md | 120 ++++++++ .../web_services/04-database-servers.de.md | 17 ++ .../05-load-balancer-proxies.de.md | 13 +- .../05-load-balancer-proxies.fr.md | 13 +- docs/gemstones/gemstone_template.de.md | 13 +- docs/gemstones/index.de.md | 2 +- docs/guides/contribute/README.de.md | 2 +- docs/guides/installation.fr.md | 273 ++++++++++++++++++ docs/guides/migrate2rocky.fr.md | 2 +- docs/guides/virtualization/vmware_tools.fr.md | 2 +- docs/index.de.md | 2 +- docs/index.es.md | 4 +- docs/index.fr.md | 2 +- docs/rocky_insights/blogs/index.de.md | 13 +- 15 files changed, 478 insertions(+), 16 deletions(-) create mode 100644 docs/books/web_services/01-files-servers.es.md create mode 100644 docs/books/web_services/04-database-servers.de.md create mode 100644 docs/guides/installation.fr.md diff --git a/docs/books/web_services/01-files-servers.de.md b/docs/books/web_services/01-files-servers.de.md index cdf863e555..d909f6d7f2 100644 --- a/docs/books/web_services/01-files-servers.de.md +++ b/docs/books/web_services/01-files-servers.de.md @@ -1,7 +1,7 @@ --- author: contributors: -title: Erster Teil File-Server +title: Kapitel 1 — Dateisystem-Server tags: - ftp - sftp @@ -9,9 +9,17 @@ tags: !!! info "Info" -``` -The content for this page has yet to be written. -``` +````` +The content has to be written. +```` + +🌐 Translations: crowdin.com/project/rockydocs +🌍 Translators: rockydocs, rockylinux.org +🖋 Contribute: github.com/rocky-linux/documentation + +```` +. +````` diff --git a/docs/books/web_services/04-database-servers.de.md b/docs/books/web_services/04-database-servers.de.md new file mode 100644 index 0000000000..80e288ca53 --- /dev/null +++ b/docs/books/web_services/04-database-servers.de.md @@ -0,0 +1,17 @@ +--- +author: +contributors: +title: Kapitel 4 — Datenbankserver +--- + +!!! info "Info" + +````` +An introduction to relational database servers needs to be written. +```` + +## Einleitung + +```` +. +````` diff --git a/docs/books/web_services/05-load-balancer-proxies.de.md b/docs/books/web_services/05-load-balancer-proxies.de.md index ce47265b02..91ee6d88ba 100644 --- a/docs/books/web_services/05-load-balancer-proxies.de.md +++ b/docs/books/web_services/05-load-balancer-proxies.de.md @@ -6,4 +6,15 @@ title: Kapitel 5 – Load Balancing, Caching und Proxy # Kapitel 5 – Load Balancing, Caching und Proxy -In diesem Abschnitt besprechen wir bestehende Lösungen zur Verbesserung der Traffic-Leistung und zur Bewältigung einer ständig steigenden Anzahl von Client-Verbindungen. +In diesem Abschnitt besprechen wir bestehende Lösungen zur Verbesserung der Traffic-Leistung und zur Bewältigung einer ständig steigenden Anzahl von Client-Verbindungen. +

    +🌐 Translations: +crowdin.com/project/rockydocs +
    +🌍 Translators: +rockydocs/activity-stream +, rockylinux.org +
    +🖋 Contributions: +github.com/rocky-linux +
    diff --git a/docs/books/web_services/05-load-balancer-proxies.fr.md b/docs/books/web_services/05-load-balancer-proxies.fr.md index e962544428..404d99b715 100644 --- a/docs/books/web_services/05-load-balancer-proxies.fr.md +++ b/docs/books/web_services/05-load-balancer-proxies.fr.md @@ -6,4 +6,15 @@ title: Chapitre 5 Équilibrage de charge, mise en cache et proxy # Chapitre 5 Équilibrage de charge, mise en cache et proxy -Dans cette partie, nous discuterons des solutions existantes pour améliorer les performances du trafic et accepter de plus en plus de connexions clients. +Dans cette partie, nous discuterons des solutions existantes pour améliorer les performances du trafic et accepter de plus en plus de connexions clients. +

    +🌐 Translations: +crowdin.com/project/rockydocs +
    +🌍 Translators: +rockydocs/activity-stream +, rockylinux.org +
    +🖋 Contributions: +github.com/rocky-linux +
    diff --git a/docs/gemstones/gemstone_template.de.md b/docs/gemstones/gemstone_template.de.md index 708d703423..15e99438c0 100644 --- a/docs/gemstones/gemstone_template.de.md +++ b/docs/gemstones/gemstone_template.de.md @@ -46,4 +46,15 @@ Fügen Sie Tipps, alternative Methoden oder Erkenntnisse hinzu. ## Zusammenfassung -Fassen Sie das Ergebnis zusammen und betonen Sie den Wert des Gemstone. +Fassen Sie das Ergebnis zusammen und betonen Sie den Wert des Gemstone. +

    +🌐 Translations: +crowdin.com/project/rockydocs +
    +🌍 Translators: +rockydocs/activity-stream +, rockylinux.org +
    +🖋 Contribute: +github.com/rocky-linux/documentation +
    diff --git a/docs/gemstones/index.de.md b/docs/gemstones/index.de.md index ed828e24bd..5fec4b75f6 100644 --- a/docs/gemstones/index.de.md +++ b/docs/gemstones/index.de.md @@ -17,4 +17,4 @@ Der Code, das Skript oder das Beispiel für den Befehl sollte kurz sein. Wenn es ## Mitwirkung -Sie können zu Ihrem **Gemstone** auf die gleiche Weise beitragen, wie Sie zu anderen Dokumentationen beitragen (siehe: [Contribution Guide](../guides/contribute/README.md)). Wenn Sie ein Pull-Request auf GitHub senden, fügen Sie „gemstone“ in die Commit-Nachricht ein. Wenn Sie kein GitHub-Konto haben oder möchten, können Sie es einfach an den Kanal [Mattermost Documentation](https://chat.rockylinux.org/rocky-linux/channels/documentation) senden und wir bearbeiten und bauen Ihren **Gemstone** für Sie ein. Einfacher geht das nicht! +Sie können zu Ihrem **Gemstone** auf die gleiche Weise beitragen, wie Sie zu anderen Dokumentationen beitragen (siehe: [Contribution Guide](../guides/contribute/README.md)). Wenn Sie ein Pull-Request auf GitHub senden, fügen Sie „gemstone“ in die Commit-Nachricht ein. Wenn Sie kein GitHub-Konto haben oder möchten, können Sie es einfach an den Kanal [Mattermost Documentation](https://chat.rockylinux.org/rocky-linux/channels/documentation) senden und wir bearbeiten und bauen Ihren **Gemstone** für Sie ein. Einfacher geht es nicht!

    🌐 Translations: crowdin.com/project/rockydocs
    🌍 Translators: rockydocs/activity-stream , rockylinux.org
    🖋 Contribute: github.com/rocky-linux/documentation
    diff --git a/docs/guides/contribute/README.de.md b/docs/guides/contribute/README.de.md index 3b1e76e98e..3d88fc9377 100644 --- a/docs/guides/contribute/README.de.md +++ b/docs/guides/contribute/README.de.md @@ -1 +1 @@ -

    🌐 Translations: crowdin.com/project/rockydocs
    🌍 Translators: rockydocs/activity-stream , rockylinux.org
    🖋 Contributors: github.com/rocky-linux/documentation
    \ No newline at end of file +

    🌐 Translations: crowdin.com/project/rockydocs
    🌍 Translators: rockydocs/activity-stream , rockylinux.org
    🖋 Contributors: github.com/rocky-linux/documentation
    \ No newline at end of file diff --git a/docs/guides/installation.fr.md b/docs/guides/installation.fr.md new file mode 100644 index 0000000000..0452263b58 --- /dev/null +++ b/docs/guides/installation.fr.md @@ -0,0 +1,273 @@ +--- +Title: Rocky Linux 10 — Installation +author: Wale Soyinka +contributors: +--- + +# Installation de Rocky Linux 10 + +Il s'agit d'un guide détaillé pour l'installation d'une version 64 bits de la distribution Rocky Linux sur un système autonome. Vous allez effectuer une installation de type serveur. Vous allez passer par les étapes d’installation et de personnalisation dans les sections suivantes. + +## Prérequis à l'Installation du Système d'Exploitation + +Téléchargez l'ISO à utiliser pour cette installation de Rocky Linux. +Vous pouvez télécharger la dernière image ISO pour la version de Rocky Linux à installer ici : + + + +Pour télécharger l'image ISO directement depuis la ligne de commande sur un système Linux existant, utilisez la commande `wget` comme suit : + +```bash +wget https://download.rockylinux.org/pub/rocky/10/isos/x86_64/Rocky-10.0-x86_64-minimal.iso +``` + +Les images ISO de Rocky Linux respectent la convention de nommage suivante : + +```text +Rocky-.--.iso +``` + +Par exemple, `Rocky-10.0-x86_64-minimal.iso` + +!!! note "Remarque" + + Le site web du projet Rocky Linux propose une liste de nombreux miroirs situés partout dans le monde. Choisissez le miroir qui est géographiquement le plus proche de vous. La liste des mirroirs officiels pet être consultée [ici](https://mirrors.rockylinux.org/mirrormanager/mirrors). + +## Vérification du fichier ISO d'installation + +Si vous avez téléchargé un des fichiers ISO Rocky Linux, vous pouvez utiliser l'utilitaire `sha256sum` pour vérifier que le fichier téléchargé n'est pas corrompu. Nous allons montrer un exemple de la façon de valider le fichier `Rocky-10.0-x86_64-minimal.iso` en vérifiant sa somme de contrôle. + +1. Téléchargez le fichier qui contient les sommes de contrôle officielles pour les fichiers ISO disponibles. + +1. Alors que vous êtes toujours dans le dossier qui contient l'image ISO Rocky Linux téléchargée, téléchargez le fichier checksum pour l'ISO, tapez : + + ```bash + wget -O CHECKSUM https://download.rockylinux.org/pub/rocky/10/isos/x86_64/CHECKSUM + ``` + +1. Utilisez le programme `sha256sum` pour vérifier l'intégrité du fichier ISO contre la corruption ou la falsification. + + ```bash + sha256sum -c CHECKSUM --ignore-missing + ``` + + Cela vérifie l'intégrité du fichier ISO téléchargé précédemment, à condition qu'il se trouve dans le même répertoire. Le résultat suivant devrait être affiché : + + ```text + Rocky-10.0-x86_64-minimal.iso: OK + ``` + +## L'installation + +!!! tip "Astuce" + + Avant de démarrer l'installation à proprement parler, l'UEFI (Unified Extensible Firmware Interface) ou le BIOS (Basic Input/Output System) du système doit être configuré pour démarrer sur le bon média. + Assurez-vous également de consulter les notes [configuration matérielle minimale requise](minimum_hardware_requirements.md) recommandées pour l'exécution de Rocky Linux 10. + +Une fois le système configuré pour démarrer à partir du média avec le fichier ISO, on peut commencer l'installation. + +1. Insérez et démarrez à partir du support d'installation (par exemple, un disque optique, une clé USB). + +2. Une fois l'ordinateur démarré, vous voyez l'écran de démarrage du programme d'installation de Rocky Linux 10. + + ![Rocky Linux installation splash screen](images/installation_10_0_F01.png) + +3. Sur l'écran d'accueil, vous pouvez utiliser les touches fléchées ++"up"++ ou ++"down"++ pour sélectionner l'une des options, puis appuyer sur ++enter++ pour exécuter l'option sélectionnée. Si vous n'appuyez sur aucune touche, le programme d'installation démarre un compte à rebours, après quoi le processus d'installation exécute automatiquement l'option par défaut en surbrillance : + + `Tester le media & installer Rocky Linux 10` + +4. Une vérification rapide du media sera effectuée.
    Cette vérification peut vous éviter de démarrer l'installation et de découvrir à mi-chemin que le programme d'installation doit s'arrêter en raison d'un support d'installation défectueux. + +1. Une fois la vérification du support terminée et le support vérifié comme utilisable, le programme d'installation passe automatiquement à l'écran suivant. + +2. Sélectionnez dans cet écran la langue à utiliser pour continuer l'installation. Pour cet exemple, nous choisissons *Anglais (US)*. Cliquez ensuite sur le bouton ++"continue"++. + +## Récapitulatif de l'intallation + +L'écran `Installation Summary` est une zone complète dans laquelle vous prenez des décisions clés concernant l'installation du système. + +L'écran est grossièrement divisé en sections suivantes : + +- *LOCALIZATION* +- *SOFTWARE* +- *SYSTEM* +- *USER SETTINGS* + +Nous allons maintenant examiner chacune de ces sections et apporter les modifications nécessaires. + +### Localisation + +Cette rubrique permet de personnaliser les éléments liés à l'emplacement géographique du système. Cela comprend le clavier, la prise en charge des langues, l'heure et la date. + +#### Clavier + +Dans le système de démonstration de ce guide, nous acceptons la valeur par défaut (*English US*) et n'apportons aucune modification. + +Cependant, si vous devez apporter des modifications ici, à partir de l'écran `Installation Summary`, cliquez sur l'option ++"keyboard"++ pour spécifier la disposition du clavier du système. À l'aide du bouton ++plus++, vous pouvez ajouter et commander des dispositions de clavier supplémentaires si nécessaire. + +Cliquez sur ++"done"++ lorsque vous en avez terminé avec cet écran. + +#### Support linguistique + +L'option `Prise en charge des langues` sur l'écran *Résumé de l'installation* permet de spécifier la prise en charge de langues supplémentaires. + +Nous accepterons la valeur par défaut - **English (United States)** et n'effectuerons aucune modification, cliquez sur ++"done"++. + +#### Heure & Date + +Cliquez sur l'option ++"Time & Date"++ sur l'écran principal `Installation Summary `pour faire apparaître un autre écran qui permet de sélectionner le fuseau horaire où se trouve la machine. Utilisez les flèches déroulantes pour sélectionner la région et la ville les plus proches de vous. + +Acceptez la valeur par défaut et activez l'option ++"Automatic date & time"++, qui permet au système de définir automatiquement l'heure et la date correctes à l'aide du protocole NTP (Network Time Protocol). + +Cliquez sur ++"done"++ une fois terminé. + +### Section Logiciel + +Dans la section *Software* de l'écran *Installation Summary*, vous pouvez sélectionner ou modifier la source d'installation ainsi qu'ajouter des logiciels supplémentaires pour l'environnement sélectionné. + +#### Source de l'installation + +Étant donné que nous utilisons une image ISO Rocky Linux 10 pour l'installation, l'option Source détectée automatiquement est sélectionnée par défaut pour nous. Vous pouvez confirmer les valeurs par défaut prédéfinies. + +!!! tip "Astuce" + + La zone Source d'installation vous permet d'effectuer une installation basée sur le réseau (par exemple, si vous utilisez l'ISO de démarrage Rocky Linux - Rocky-10.0-x86_64-boot.iso). Pour une installation basée sur le réseau, vous devez d'abord vous assurer qu'une carte réseau sur le système cible est correctement configurée et peut atteindre la (ou les) source(s) d'installation par le réseau (LAN ou Internet). Pour effectuer une installation basée sur le réseau, cliquez sur `Installation Source`, puis sélectionnez le bouton radio `On the network`. Sélectionnez ensuite le protocole correct et entrez l’URI exact. Cliquez sur `Done`. + +#### Sélection de Logiciel + +En cliquant sur l'option ++"Software Selection"++ sur l'écran principal *Installation Summary*, vous accédez à une zone de sélection de logiciel composée de deux sections : + +- **Environnement de base** : Installation Minimale +- **Logiciels supplémentaires pour l'environnement sélectionné** : La sélection d'un environnement de base sur le côté gauche présente une variété de logiciels supplémentaires associés à installer pour l'environnement donné sur le côté droit. + +Sélectionnez l'option *Minimal Install* (fonctionnalité de base). + +Cliquez sur ++"done"++ en haut de l'écran. + +### Section Système + +Utilisez la section Système de l'écran *Installation Summary* pour personnaliser et apporter des modifications aux éléments liés au matériel sous-jacent du système cible. C'est ici que vous créez vos partitions ou volumes de disque dur, spécifiez le système de fichiers, spécifiez la configuration réseau et activez ou désactivez KDUMP. + +#### Destination de l'Installation + +À partir de l'écran *Installation Summary*, cliquez sur l'option ++"Installation Destination"++. Cela vous amène au domaine de tâches correspondant. + +Vous verrez un écran affichant tous les lecteurs de disque disponibles sur le système cible. Si vous n'avez qu'un seul lecteur de disque sur le système, comme sur notre système d'exemple, vous voyez le lecteur répertorié sous *Local Standard Disks* avec une coche à côté. En cliquant sur l'icône du disque, vous pourrez activer ou désactiver la coche de sélection du disque. Laissez-le coché pour sélectionner le disque. + +Dans la section *Storage Configuration* : + +1. Sélectionnez le bouton radio ++"Automatic"++. + +2. Cliquez sur ++"done"++ en haut de l'écran. + +3. Une fois que le programme d'installation détermine que vous avez un disque utilisable, il retourne à l'écran *Installation Summary*. + +### Réseau & Nom d'Hôte + +La tâche importante suivante dans la procédure d'installation sous la zone Système implique la configuration du réseau, où vous pouvez ajuster les paramètres liés au réseau pour le système. + +!!! note "Remarque" + + Après avoir cliqué sur l'option ++"Network & Hostname"++, tout le matériel d'interface réseau correctement détecté (tel qu'Ethernet, les cartes réseau sans fil, etc.) sera répertorié dans le volet gauche de l'écran de configuration réseau. Selon votre configuration matérielle spécifique, les périphériques Ethernet sous Linux ont des noms similaires à « eth0 », « eth1 », « ens3 », « ens4 », « em1 », « em2 », « p1p1 », « enp0s3 », etc. + Vous pouvez configurer chaque interface à l'aide de DHCP ou définir manuellement l'adresse IP. + Si vous choisissez de configurer manuellement, assurez-vous que vous disposez de toutes les informations requises, comme l'adresse IP, le masque de réseau et d'autres détails pertinents. + +Cliquer sur le bouton ++"Network & Host Name"++ dans l'écran principal *Installation Summary* ouvre l'écran de configuration correspondant. Ici, vous pouvez également configurer le nom d'hôte du système. + +!!! note "Remarque" + + Vous pourrez facilement modifier ce nom plus tard, une fois le système d'exploitation installé. + +La tâche de configuration suivante concerne les interfaces réseau du système. + +1. Vérifiez que le volet de gauche répertorie une carte/adaptateur réseau +2. Cliquez sur l'un des périphériques réseaux détectés dans le volet de gauche pour le sélectionner. + Les propriétés configurables de la carte réseau sélectionnée s'affichent dans le volet de droite de l'écran. + +!!! note "Remarque" + + Dans notre système d'exemple, nous avons deux périphériques Ethernet (`ens3` et `ens4`), tous deux dans un état connecté. Le type, le nom, la quantité et l’état des périphériques réseau de votre système peuvent différer de ceux de notre système de démonstration. + +Verify that the switch of the device you want to configure is in the `ON` (blue) position in the right pane. Dans cette section, vous pouvez confirmer toutes les valeurs par défaut. + +Cliquez sur ++"done"++ pour revenir à l'écran principal *Installation Summary*. + +!!! warning "Avertissement" + + Portez attention à l’adresse IP du serveur dans cette section du programme d’installation. Si vous n'avez pas d'accès physique ou facile à la console du système, ces informations vous seront utiles plus tard lorsque vous devrez vous connecter au serveur une fois l'installation du système d'exploitation terminée. + +### Section Paramètres d'Utilisateur + +Utilisez cette section pour créer un mot de passe pour le compte utilisateur `root` et pour créer de nouveaux comptes administratifs ou non. + +#### Mot de passe `root` + +1. Cliquez sur le champ *Mot de passe root* sous *Paramètres utilisateur* pour démarrer l'écran de tâches *Compte root*. + + !!! warning "Avertissement" + + Le superutilisateur `root` est le compte le plus privilégié du système. Si vous choisissez de l'utiliser ou de l'activer, vous devez protéger ce compte avec un mot de passe fort. + +2. Vous verrez une des deux options : `Disable root account` ou `Enable root account`. Acceptez le choix par défaut. + +3. Cliquez sur ++"done"++. + +#### Création d'un Utilisateur + +Création d'utilisateur : + +1. Cliquez sur le champ *User Creation* sous *User Settings* pour démarrer l'écran de tâche *Create User*. Utilisez cette zone de tâches pour créer un compte utilisateur privilégié (administrateur) ou non (non administratif). + + !!! Mise en garde + + Sur un système Rocky Linux 10, le compte `Root` est désactivé par défaut ; il est donc essentiel de s'assurer que le compte utilisateur créé lors de l'installation du système d'exploitation dispose de privilèges administratifs. Cet utilisateur peut être utilisé de manière non privilégiée pour les tâches quotidiennes sur le système et aura également la possibilité d'élever son rôle pour effectuer des fonctions administratives (`root`) si nécessaire. + + Nous allons créer un utilisateur régulier qui peut invoquer les privilèges `superuser` (administrateur) au besoin. + +2. Remplissez les champs de l'écran *Create User* avec les informations suivantes : + + - **Full name**: `rockstar` + - **Username**: `rockstar` + - **Add administrative privileges to this user account (wheel group membership)**: Checked + - **Require a password to use this account**: Checked + - **Password**: `04302021` + - **Confirm password**: `04302021` + +3. Cliquez sur ++"done"++. + +## L'installation + +Une fois que vous êtes satisfait de vos choix pour les différentes tâches d'installation, la phase suivante du processus d'installation commencera l'installation proprement dite. + +### Lancement de l'Installation + +Une fois satisfait de vos choix pour les différentes tâches d'installation, cliquez sur le bouton ++"Begin Installation"++ sur l'écran principal `Installation Summary`. + +L'installation commencera, et le logiciel d'installation en affichera la progression. Une fois l'installation lancée, diverses tâches commenceront à s'exécuter en arrière-plan, comme le partitionnement du disque, le formatage des partitions ou des volumes LVM, la vérification et la résolution des dépendances logicielles, l'écriture du système d'exploitation sur le disque et d'autres tâches similaires. + +!!! note "Remarque" + + Si vous ne voulez pas continuer après avoir cliqué sur le bouton ++"Begin Installation"++, vous pouvez toujours quitter l'installation en toute sécurité sans perdre de données. Pour quitter le programme d'installation, réinitialisez simplement votre système en cliquant sur le bouton ++"Quit"++, en appuyant sur Ctrl-Alt-Delete sur le clavier ou en appuyant sur l'interrupteur de réinitialisation ou d'alimentation. + +### Terminer l'installation + +Une fois le programme d'installation terminé, vous verrez un écran de progression d'installation final avec un message complet. + +Finalement, terminez toute la procédure en cliquant sur le bouton ++"Reboot System"++. Le système redémarre de lui-même. + +### Se connecter + +Le système est maintenant configuré et prêt à être utilisé. Vous verrez la console Rocky Linux. + +![Rocky Linux Welcome Screen](images/installation_10_0_F02.png) + +La marche à suivre pour se connecter au système est la suivante : + +1. Tapez `rockstar` à l'invite de connexion et appuyez sur ++enter++. + +2. À l'invite du mot de passe, entrez `04302021` (le mot de passe de Rockstar) et appuyez sur ++enter++ (le mot de passe ne sera ***pas*** affiché à l'écran, c'est normal). + +3. Exécutez la commande `whoami` après la connexion. + Cette commande affiche le nom de l'utilisateur présentement connecté. + +![Écran de Connexion](images/installation_9.0_F03.png) diff --git a/docs/guides/migrate2rocky.fr.md b/docs/guides/migrate2rocky.fr.md index a3b7107ec5..3d330860a5 100644 --- a/docs/guides/migrate2rocky.fr.md +++ b/docs/guides/migrate2rocky.fr.md @@ -112,6 +112,6 @@ Si vous voyez un message **Complete!** à la fin, tout va bien et vous pouvez re ![un message de migration du système d'exploitation réussie](images/migrate2rocky-convert-02.png) -Donnez-lui un peu de temps, reconnectez-vous et vous devriez avoir un serveur Rocky Linux tout beau, tout neuf pour jouer avec... Exécutez la commande `hostnamectl` pour vérifier que votre système d'exploitation a été migré correctement et vous voilà prêt à l'utiliser ! +Donnez-lui un peu de temps, reconnectez-vous et vous devriez avoir un serveur Rocky Linux tout beau, tout neuf pour jouer avec... Exécutez la commande `hostnamectl` pour vérifier que votre système d'exploitation a été migré correctement et vous voilà prêt à l'utiliser !

    🌐 Traductions: crowdin.com/project/rockydocs
    🌍 Traducteurs: rockydocs/activity-stream , rockylinux.org
    🖋 Contribution: github.com/rocky-linux
    ![Les résultats de la commande hostnamectl](images/migrate2rocky-convert-03.png) diff --git a/docs/guides/virtualization/vmware_tools.fr.md b/docs/guides/virtualization/vmware_tools.fr.md index b0654ab323..68221e269c 100644 --- a/docs/guides/virtualization/vmware_tools.fr.md +++ b/docs/guides/virtualization/vmware_tools.fr.md @@ -1,5 +1,5 @@ --- -title: Installation de VMware Tools™ +title: VMware Tools™ — Installation author: Emre Çamalan contributors: Steven Spencer, Ganna Zhyrnova tested_with: 8.9, 9.3 diff --git a/docs/index.de.md b/docs/index.de.md index df4238e3c3..3838d411e4 100644 --- a/docs/index.de.md +++ b/docs/index.de.md @@ -54,4 +54,4 @@ Wenn Sie nicht weiter kommen oder Fragen haben, ist die Rocky Linux Community da ## Mitwirkung -Haben Sie festgestellt, dass etwas fehlt? Haben Sie einen Fehler gefunden? Sie fragen sich, wie Sie ein eigenes Dokument erstellen oder wie Sie etwas hier reparieren oder anpassen können? Haben wir nicht gesagt, dass *Sie*, wenn Sie möchten, Teil der Rocky Linux Community sind? Nun, das bedeutet, dass *Sie* für uns wichtig sind und wir gern möchten, dass Sie sich uns anschließen und helfen diese Dokumentation zu verbessern. Wenn Sie daran interessiert sind, schauen Sie im [Contribution Guide](https://github.com/rocky-linux/documentation/blob/main/README.md) nach!

    Translations: crowdin.com/project/rockydocs

    Translators: crowdin.com/project/rockydocs/activity-stream
    +Haben Sie festgestellt, dass etwas fehlt? Haben Sie einen Fehler gefunden? Sie fragen sich, wie Sie ein eigenes Dokument erstellen oder wie Sie etwas hier reparieren oder anpassen können? Haben wir nicht gesagt, dass *Sie*, wenn Sie möchten, Teil der Rocky Linux Community sind? Nun, das bedeutet, dass *Sie* für uns wichtig sind und wir gern möchten, dass Sie sich uns anschließen und helfen diese Dokumentation zu verbessern. Wenn Sie daran interessiert sind, schauen Sie im [Contribution Guide](https://github.com/rocky-linux/documentation/blob/main/README.md) nach!

    🌐 Translations: crowdin.com/project/rockydocs
    🌍 Translators: rockydocs/activity-stream , rockylinux.org
    🖋 Contributors: github.com/rocky-linux
    diff --git a/docs/index.es.md b/docs/index.es.md index b5f2a25b2f..4dfbec39fe 100644 --- a/docs/index.es.md +++ b/docs/index.es.md @@ -31,7 +31,7 @@ Las secciones principales de la plataforma de documentación son las siguientes: ### Idiomas Múltiples -En Rocky Linux queremos hacer el sitio de documentación lo más accesible posible para todas las personas. — *las traducciones a diferentes idiomas son una parte fundamental para lograr este objetivo. *. Si haces clic en el selector de idioma en el menú superior verás todos los idiomas disponibles en este momento. Hay dos partes de esto: +En Rocky Linux queremos hacer el sitio de documentación lo más accesible posible para todas las personas. — *las traducciones a diferentes idiomas son una parte fundamental para lograr este objetivo*. Si haces clic en el selector de idioma en el menú superior verás todos los idiomas disponibles en este momento. Hay dos partes de esto: 1. Regionalización de la interfaz del sitio web: si se elige otro idioma, observará que los botones de navegación 'Siguiente' y 'Anteriores', estarán en el idioma elegido. 1. Naturalmente la traducción de nuestro sitio es un trabajo en curso y constante (https://crowdin.com/project/rockydocs/activity-stream). No todo el contenido actual está traducido a todos los idiomas disponibles aun. Así que todas las páginas que han sido traducidas a tu idioma de preferencia se mostrarán en dicho idioma excepto las que aun estén pendientes de traducción que, por defecto, se mostrarán en el idioma inglés. Si desea contribuir a la comunidad a través de las traducciones, al equipo de documentación le encantaría saber de usted — vea abajo para más detalles. @@ -54,4 +54,4 @@ Pero si le llegan a surgir preguntas que no se encuentran cubiertas, puede acudi ## Como contribuir al proyecto -¿Has encontrado algo que falta? ¿Has encontrado un error? ¿Te estás preguntando cómo crear un documento propio, o cómo arreglar cosas aquí? ¿Recuerda cuando dijimos que *usted* forma parte de la comunidad de Rocky? Bueno, eso significa que *usted* es importante para nosotros y queremos que se una, si lo desea, para, entre todos, mejorar esta documentación. ¡Si le resulta de interés, visite nuestra [Guía Para Contribuciones](https://github.com/rocky-linux/documentation/blob/main/README.md) para aprender como contribuir! +¿Has encontrado algo que falta? ¿Has encontrado un error? ¿Te estás preguntando cómo crear un documento propio, o cómo arreglar cosas aquí? ¿Recuerda cuando dijimos que *usted* forma parte de la comunidad de Rocky? Bueno, eso significa que *usted* es importante para nosotros y queremos que se una, si lo desea, para, entre todos, mejorar esta documentación. ¡Si le resulta de interés, visite nuestra [Guía Para Contribuciones](https://github.com/rocky-linux/documentation/blob/main/README.md) para aprender como contribuir!

    🌐 Translations: crowdin.com/project/rockydocs
    🌍 Translators: rockydocs/activity-stream , rockylinux.org
    🖋 Contribute: github.com/rocky-linux
    diff --git a/docs/index.fr.md b/docs/index.fr.md index 6c3c4ac32b..eaf710ea95 100644 --- a/docs/index.fr.md +++ b/docs/index.fr.md @@ -63,4 +63,4 @@ Si vous êtes coincé et que vous avez une question, la communauté Rocky Linux ## Votre Contribution -Avez-vous trouvé quelque chose de manquant ? Avez-vous trouvé une erreur ? Vous vous demandez comment créer votre propre document ou comment en corriger un ? Rappelez-vous lorsque nous avons dit que *vous* étiez la communauté Rocky Linux ? Cela signifie que *vous* êtes important pour nous et nous voulons que vous nous rejoigniez, si vous le voulez, et que vous nous aidiez à améliorer cette documentation. Si cela vous intéresse, rendez-vous sur notre [Guide de Contribution](https://github.com/rocky-linux/documentation/blob/main/README.md) pour savoir comment faire !

    🌐 Traductions: crowdin.com/project/rockydocs
    🌍 Traducteurs: crowdin.com/project/rockydocs/activity-stream
    🖋 Contributeurs: github.com/rocky-linux/documentation
    +Avez-vous trouvé quelque chose de manquant ? Avez-vous trouvé une erreur ? Vous vous demandez comment créer votre propre document ou comment en corriger un ? Rappelez-vous lorsque nous avons dit que *vous* étiez la communauté Rocky Linux ? Cela signifie que *vous* êtes important pour nous et nous voulons que vous nous rejoigniez, si vous le voulez, et que vous nous aidiez à améliorer cette documentation. Si cela vous intéresse, rendez-vous sur notre [Guide de Contribution](https://github.com/rocky-linux/documentation/blob/main/README.md) pour savoir comment faire !

    🌐 Traductions: crowdin.com/project/rockydocs
    🌍 Traducteurs: rockydocs/activity-stream
    🖋 Contributeurs: github.com/rocky-linux/documentation
    diff --git a/docs/rocky_insights/blogs/index.de.md b/docs/rocky_insights/blogs/index.de.md index d266efdd63..d1b4cb843e 100644 --- a/docs/rocky_insights/blogs/index.de.md +++ b/docs/rocky_insights/blogs/index.de.md @@ -34,4 +34,15 @@ Die Ansammlung von Dokumenten dieser Art wird wahrscheinlich langsamer wachsen a ## Rückmeldungen und Feedback -Wie beim gesamten Dokumentationsprojekt können Sie in unserem [Documentation Mattermost-Kanal](https://chat.rockylinux.org/rocky-linux/channels/documentation) Feedback geben. +Wie beim gesamten Dokumentationsprojekt können Sie in unserem [Documentation Mattermost-Kanal](https://chat.rockylinux.org/rocky-linux/channels/documentation) Feedback geben. +

    +🌐 Translations: +crowdin.com/project/rockydocs +
    +🌍 Translators: +rockydocs/activity-stream +, rockylinux.org +
    +🖋 Contributors: +github.com/rocky-linux/documentation +
    From ac46d84cf5344b4b42cfa458833e7bd28f8917cc Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Wed, 17 Sep 2025 11:16:40 -0500 Subject: [PATCH 155/164] Move `rockydocs_tool_guide.md` to "Local Documentation" menu (#2882) * originally placed in the contribute section directly * moving it groups it correctly with the other local documentation items * modified the `.pages` file in the `localdocs` folder, too, to place this item first in the listing --- docs/guides/contribute/localdocs/.pages | 1 + docs/guides/contribute/{ => localdocs}/rockydocs_tool_guide.md | 0 2 files changed, 1 insertion(+) rename docs/guides/contribute/{ => localdocs}/rockydocs_tool_guide.md (100%) diff --git a/docs/guides/contribute/localdocs/.pages b/docs/guides/contribute/localdocs/.pages index 63cc822bbf..1abde09eca 100644 --- a/docs/guides/contribute/localdocs/.pages +++ b/docs/guides/contribute/localdocs/.pages @@ -1,6 +1,7 @@ --- nav: - ... | index*.md + - ... | rockydocs_tool_guide*.md - ... | rockydocs_web_dev*.md - ... | mkdocs_lsyncd*.md - ... | rockydocs_webdev_v2*.md diff --git a/docs/guides/contribute/rockydocs_tool_guide.md b/docs/guides/contribute/localdocs/rockydocs_tool_guide.md similarity index 100% rename from docs/guides/contribute/rockydocs_tool_guide.md rename to docs/guides/contribute/localdocs/rockydocs_tool_guide.md From 2d94c783c1707c88a62a12fcb91e1eb04a479a2e Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Thu, 18 Sep 2025 10:42:40 -0500 Subject: [PATCH 156/164] Lsyncd procedure rewrite (#2884) * Changes to the `mkdocs_lsyncd.md` document * first commit, change in wording * GitHub procedure wording changes * some grammar and structure changes * add in fenced code block contexts --- .../contribute/localdocs/mkdocs_lsyncd.md | 178 +++++++++++++----- 1 file changed, 129 insertions(+), 49 deletions(-) diff --git a/docs/guides/contribute/localdocs/mkdocs_lsyncd.md b/docs/guides/contribute/localdocs/mkdocs_lsyncd.md index 36572a94e5..450076d19a 100644 --- a/docs/guides/contribute/localdocs/mkdocs_lsyncd.md +++ b/docs/guides/contribute/localdocs/mkdocs_lsyncd.md @@ -1,5 +1,5 @@ --- -title: LXD Method +title: Incus Method author: Steven Spencer contributors: Ezequiel Bruni, Ganna Zhyrnova tested_with: 8.5, 8.6 @@ -9,23 +9,27 @@ tags: - local environment incus --- -# Introduction - !!! info - The procedures here will work with Incus as well as LXD. + While this method still works for LXD, the author prefers Incus instead. The reason is that from a development standpoint, Incus appears to be out in front of LXD, and that includes the images available. With Incus, as of September 2025, there are images for Rocky Linux 10, and other RHEL rebuild 10 images. LXD images only include 9 builds currently. This may be due to the [licensing change](https://stgraber.org/2023/12/12/lxd-now-re-licensed-and-under-a-cla/) announced by Linux Containers project lead, Stéphane Graber, back in December 2023. -There are several ways to run a copy of `mkdocs` to see exactly how your Rocky Linux document will appear when merged on the live system. This particular document deals with using an LXD container on your local workstation to separate python code in `mkdocs` from other projects you might be working on. + In addition, this procedure still works with the current versioning of documentation. If a document is created or edited on any of the version branches (main, rocky-9, and rocky-8), the document synced to the container will show the correct content. This means that you can continue to use this procedure as is. Included are some addtional notes important to versioning. -The recommendation is to keep projects separate to avoid causing problems with your workstation's code. +!!! tip + + If you are using Rocky Linux 10 as your workstation, you need to keep in mind that as of the rewriting of this document, `lsyncd` is not available from the EPEL. You will need to use the install from source method. + +## Introduction -This is also a companion document to the [Docker version here](rockydocs_web_dev.md). +There are several ways to run a copy of `mkdocs` to see exactly how your Rocky Linux document will appear when merged on the live system. This particular document deals with using an `incus` container on your local workstation to separate python code in `mkdocs` from other projects you might be working on. + +The recommendation is to keep projects separate to avoid causing problems with your workstation's code. ## Prerequisites and assumptions - Familiarity and comfort with the command-line - Comfortable using tools for editing, SSH, and synchronization, or willing to follow along and learn -- LXD reference - there is a long document on [building and using LXD on a server here](../../../books/lxd_server/00-toc.md), but you will use just a basic install on our Linux workstation +- Incus reference - there is a long document on [building and using `incus` on a server here](../../../books/incus_server/00-toc.md), but you will use just a basic install on our Linux workstation - Using `lsyncd` for mirroring files. See [documentation on that here](../../backup/mirroring_lsyncd.md) - You will need public keys generated for your user and the "root" user on your local workstation using [this document](../../security/ssh_public_private_keys.md) - Our bridge interface is running on 10.56.233.1 and our container is running on 10.56.233.189 in our examples. However your IPs for the bridge and container will be different. @@ -36,51 +40,35 @@ This is also a companion document to the [Docker version here](rockydocs_web_dev ### Create the container -Our first step is to create the LXD container. Using your container's defaults (bridge interface) is perfectly fine here. +Our first step is to create the `incus` container. Using your container's defaults (bridge interface) is perfectly fine here. You will add a Rocky container to our workstation for `mkdocs`. Just name it "mkdocs": ```bash -lxc launch images:rockylinux/8 mkdocs +incus launch images:rockylinux/10 mkdocs ``` -The container needs to be a proxy. By default, when `mkdocs serve` starts, it runs on 127.0.0.1:8000. That is fine when it is on your local workstation without a container. However, when it is in an LXD **container** on your local workstation, you need to set up the container with a proxy port. Do this with: +The container needs to be a proxy. By default, when `mkdocs serve` starts, it runs on 127.0.0.1:8000. That is fine when it is on your local workstation without a container. However, when it is in an `incus` **container** on your local workstation, you need to set up the container with a proxy port. Do this with: ```bash -lxc config device add mkdocs mkdocsport proxy listen=tcp:0.0.0.0:8000 connect=tcp:127.0.0.1:8000 +incus config device add mkdocs mkdocsport proxy listen=tcp:0.0.0.0:8000 connect=tcp:127.0.0.1:8000 ``` In the line above, "mkdocs" is our container name, "mkdocsport" is an arbitrary name you are giving to the proxy port, the type is "proxy", and you are listening on all TCP interfaces on port 8000 and connecting to the localhost for that container on port 8000. !!! Note - If you are running the lxd instance on another machine in your network, remember to make sure that port 8000 is open in the firewall. + If you are running an `incus` instance on another machine in your network, remember to make sure that port 8000 is open in the firewall. ### Installing packages First, get into the container with: ```bash -lxc exec mkdocs bash +incus shell mkdocs bash ``` -!!! warning "Changes in requirements.txt for 8.x" - - The current `requirements.txt` will require a newer version of Python than what is installed by default in Rocky Linux 8.5 or 8.6. To be able to install all the other dependencies, do the following: - - ``` - sudo dnf module enable python38 - sudo dnf install python38 - ``` - - If you are using Rocky Linux 8.x, use the following for package installation: - - ``` - dnf install git openssh-server rsync - ``` - Do **NOT** install `python3-pip` - -For Rocky Linux 9.x you will need a few packages (see "Changes in requirements.txt for 8.x" for 8.x package installation!): +For Rocky Linux 10 you will need a few packages: ```bash dnf install git openssh-server python3-pip rsync @@ -119,7 +107,7 @@ You should be able to SSH into the container with the root user or your user fro ## SSH for root and your user -In this procedure, the root user (at minimum) needs to be able to SSH into the container without entering a password; this is because of the `lsyncd` process you will be implementing. The assumption here is that you can sudo to the root user on your local workstation: +In this procedure, the root user (at minimum) needs to be able to SSH into the container without entering a password. This is because of the `lsyncd` process you will be implementing. The assumption here is that you can `sudo` to the root user on your local workstation: ```bash sudo -s @@ -136,15 +124,15 @@ drwx------ 14 root root 4096 Feb 25 08:10 .. -rw-r--r-- 1 root root 222 Feb 25 08:06 known_hosts ``` -To get SSH access on our container without having to enter a password, provided the `id_rsa.pub` key exists, as it does above, just run: +To get SSH access on our container without having to enter a password, provided the `id_rsa.pub` key exists, just run: ```bash ssh-copy-id root@10.56.233.189 ``` -For our user, however, you need the entire `.ssh/` directory copied to our container. You will keep everything the same for this user so that our access to GitHub over SSH is the same. +For your user, however, you need the entire `.ssh/` directory copied to your container. You will keep everything the same for this user so that your access to GitHub over SSH is the same. -To copy everything over to our container, you just need to do this as your user, **not** sudo: +To copy everything over to your container, you just need to do this as your user, **not** `sudo`: ```bash scp -r .ssh/ youruser@10.56.233.189:/home/youruser/ @@ -156,7 +144,7 @@ Next, SSH into the container as your user: ssh -l youruser 10.56.233.189 ``` -You need to make things identical. You are doing this with `ssh-add`. To do this, you must ensure that you have the `ssh-agent` available: +You need to ensure things are identical. You will do this with `ssh-add`. You must also ensure that you have the `ssh-agent` available: ```bash eval "$(ssh-agent)" @@ -181,7 +169,7 @@ Next, clone docs.rockylinux.org: git clone git@github.com:rocky-linux/docs.rockylinux.org.git ``` -If you get errors, return to the steps above and ensure that those are all correct before continuing. +If you get errors, return to the earlier steps and ensure that those are all correct before continuing. ## Setting up `mkdocs` @@ -201,7 +189,7 @@ Then run: sudo pip3 install -r requirements.txt ``` -Next you must set up `mkdocs` with an additional directory. `mkdocs` requires the creation of a docs directory and then the documentation/docs directory linked beneath it. Do this with: +Next you must set up `mkdocs` with an additional directory. `mkdocs` requires the creation of a docs directory and then the `documentation/docs` directory linked beneath it. Do this with: ```bash mkdir docs @@ -217,7 +205,7 @@ Now that you have `mkdocs` setup, try starting the server. Remember, this proces mkdocs serve -a 0.0.0.0:8000 ``` -You will see something like this in the console: +You will see this or similar in the console: ```bash INFO - Building documentation... @@ -244,9 +232,9 @@ INFO - Building pt documentation INFO - [14:12:56] Reloading browsers ``` -Now for the moment of truth! If you have done everything correctly, you should be able to open a web browser and go to the IP of your container on port :8000, and see the documentation site. +If you have done everything correctly, you should be able to open a web browser and go to the IP of your container on port :8000, and see the documentation site. -In our example, enter the following in the browser address (**NOTE** To avoid broken URLs, the IP here has been changed to "your-server-ip". You just need to substitute in the IP): +In our example, enter the following in the browser address (**NOTE** To avoid broken URLs, the IP here is "your-server-ip". You just need to substitute in the IP): ```bash http://your-server-ip:8000 @@ -256,21 +244,25 @@ http://your-server-ip:8000 You are almost there if you saw the documentation in the web browser. The last step is to keep the documentation in your container synchronized with the one on your local workstation. -As noted above, you are doing this here with `lsyncd`. +As noted, you are doing this here with `lsyncd`. -Installation of`lsyncd` differs depending on your Linux version. [This document](../../backup/mirroring_lsyncd.md) covers ways to install it on Rocky Linux, and also from source. If you are using other Linux types (Ubuntu for example) they generally have their own packages, but they have nuances. +Installation of `lsyncd` differs depending on your Linux version. [This document](../../backup/mirroring_lsyncd.md) covers ways to install it on Rocky Linux with an RPM from the EPEL (Extra Packages for Enterprise Linux), and from source. If you are using other Linux types (Ubuntu for example), they generally have their own packages, but with nuances. Ubuntu's, for example, names the configuration file differently. Just be aware that if you are using another Linux workstation type other than Rocky Linux, and do not want to install from source, there are probably packages available for your platform. For now, we are assuming that you are using a Rocky Linux workstation and are using the RPM install method from the included document. +!!! note + + As of this writing, `lsyncd` is not available from the EPEL for Rocky Linux 10. You will need to use the source install method if that is your workstation version. + ### Configuration !!! Note The root user must run the daemon, so you must be root to create the configuration files and logs. For this we are assuming `sudo -s`. -You need to have some log files available for `lsyncd` to write to: +You need to have some logs available for `lsyncd` to write to: ```bash touch /var/log/lsyncd-status.log @@ -283,7 +275,7 @@ You also need to have an exclude file created, even though in this case you are touch /etc/lsyncd.exclude ``` -Finally you need to create the configuration file. In this example, we are using `vi` as our editor, but you may use whichever editor you feel comfortable with: +Finally you need to create the configuration file. In this example, we are using `vi` as our editor, but use the editor you feel comfortable with: ```bash vi /etc/lsyncd.conf @@ -322,7 +314,7 @@ Assuming that you enabled `lsyncd` when you installed it, at this point you need systemctl restart lsyncd ``` -To ensure things are working, check the logs-particularly the `lsyncd.log`, which should show you something like this if everything started correctly: +To ensure things are working, check the logs-particularly the `lsyncd.log`, which should show content similar to this if everything started correctly: ```bash Fri Feb 25 08:10:16 2022 Normal: --- Startup, daemonizing --- @@ -331,8 +323,96 @@ Fri Feb 25 08:10:41 2022 Normal: Startup of "/home/youruser/documentation/" fini Fri Feb 25 08:15:14 2022 Normal: Calling rsync with filter-list of new/modified files/dirs ``` -## Conclusion +## Versioning notes + +You need a clone of the documentation repository from [Rocky Linux documentation repository](https://github.com/rocky-linux/documentation). That part is important, because if you have instead cloned your own fork of the repository, then your ability to `git checkout` the `rocky-8` and `rocky-9` branches will not be there. Only the `main` branch will be available. + +### GitHub workstation setup + +These steps are not for your container, but for your workstation's copy of the documentation: + +1. Clone the Rocky Linux documentation repository: + + ```bash + git clone git@github.com:rocky-linux/documentation.git + ``` + +2. The `git remote` name will be "upstream", rather than "origin." Check the remote name with: + + ```bash + git remote -v + ``` + + Immediately after cloning, this shows: + + ```bash + origin git@github.com:rocky-linux/documentation.git (fetch) + origin git@github.com:rocky-linux/documentation.git (push) + ``` + + Rename the remote with: -As you work on your workstation documentation now, whether it is a `git pull` or a branch you create to make a document (like this one!), you will see the changes appear in your documentation on the container, and `mkdocs serve` will show you the content in your web browser. + ```bash + git remote rename origin upstream + ``` + + Run `git remote -v` again and you will see: + + ```bash + upstream git@github.com:rocky-linux/documentation.git (fetch) + upstream git@github.com:rocky-linux/documentation.git (push) + ``` + +3. Add your fork as a remote with the "origin" name. Substitute your actual GitHub username: + + ```bash + git remote add origin git@github.com:[your-github-user-name]/documentation.git + ``` + + Run `git remote -v` again and you will see: + + ```bash + origin git@github.com:[your-github-user-name]/documentation.git (fetch) + origin git@github.com:[your-github-user-name]/documentation.git (push) + upstream git@github.com:rocky-linux/documentation.git (fetch) + upstream git@github.com:rocky-linux/documentation.git (push) + ``` + +4. You need to populate your fork with the version branches (other than `main`). The `main` branch currently holds version 10 information. You want to populate your fork with the `rocky-8` and `rocky-9` branches so that you are ready to edit documents in those older versions. The first step is to `git checkout` these branch names: + + ```bash + git checkout rocky-8 + ``` + + The first time you do this, your will see: + + ```bash + branch 'rocky-8' set up to track 'upstream/rocky-8'. + Switched to a new branch 'rocky-8' + ``` + + Next, push the branch to your fork: + + ```bash + git push origin rocky-8 + ``` + + This acts like it is creating a new pull request, but when you check your fork branch contents, you will see `rocky-8` is now one of the branches. + + Repeat these steps with the `rocky-9` branch. + +### How this applies to this procedure + +With the branches created, if you want to edit the `README.md` for only `rocky-9`, you need to create a new branch based on the `rocky-9` version branch: + +```bash +git checkout -b fixes_for_rocky9_readme rocky-9 +``` + +Then edit the document normally. As you save your work, your container documents will update, and running `mkdocs serve` as described in this document, will show that content. + +Once finished and changes pushed to your fork to create a pull request, you can checkout the `main` branch again. Since all of your work was within the checked out rocky-9 branch, your synced documentation in your container reverts to what it was before starting the process. In this way, you can always track your work regardless of what version you are working with. Your container will remain in sync with your local workstation content. + +## Conclusion -The recommended practice is that all Python must run separately from any other Python code you might be developing. LXD containers can make that easier. Give this method a try and see if it works for you. +You can work on your workstation documentation while seeing changes appear in your synced copy in your container. The recommended practice is that all Python must run separately from any other Python code you might be developing. Using `incus` containers makes that easier. From 587b4a4557813ef63303d682dba1a728d8471b4e Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Fri, 19 Sep 2025 09:39:52 -0500 Subject: [PATCH 157/164] Edit `mirroring_lsyncd.md` for RL 10 (#2886) * remove admonition added for 9 * move enabling the CRB to the install instructions * fix fenced code block context issues * all commands and directories are surrounded by backticks * add admonition note using source-build instructions for 10 * some wording simplification and grammar fixes --- docs/guides/backup/mirroring_lsyncd.md | 68 +++++++++++++------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/docs/guides/backup/mirroring_lsyncd.md b/docs/guides/backup/mirroring_lsyncd.md index efde8d9bd0..f863afd80f 100644 --- a/docs/guides/backup/mirroring_lsyncd.md +++ b/docs/guides/backup/mirroring_lsyncd.md @@ -17,8 +17,8 @@ tags: - You will need root access or `sudo` privileges (using `sudo -s` from the start is a good idea) - Public and Private SSH key pairs - The EPEL (Extra Packages for Enterprise Linux) repositories from Fedora -- You will need to be familiar with *inotify*, an event monitor interface -- Optional: familiarity with *tail* +- You will need to be familiar with `inotify`, an event monitor interface +- Optional: familiarity with `tail` ## Introduction @@ -26,21 +26,25 @@ If you want to synchronize files and folders between computers automatically, `l It is a program worth learning for any system administrator. -The best description of `lsyncd` comes from its man page. Slightly paraphrased, `lsyncd` is a lightweight live mirror solution that is not hard to install. It does not require new file systems or block devices and does not hamper local file system performance. In short, it mirrors files. +The best description of `lsyncd` comes from its man page. Slightly paraphrased, `lsyncd` is a lightweight live mirror solution that is not hard to install. It does not require new file system or block devices and does not hamper local file system performance. In short, it mirrors files. -`lsyncd` watches a local directory tree's event monitor interface (inotify). It aggregates and combines events for a few seconds and spawns one (or more) process(es) to synchronize the changes. By default, this is `rsync`. +`lsyncd` watches a local directory tree's event monitor interface (`inotify`). It aggregates and combines events for a few seconds and spawns one (or more) process(es) to synchronize the changes. By default, this is `rsync`. -For this guide, you will call the system with the original files the "source"; the one you synchronize with will be the "target." Using `lsyncd`, you can completely mirror a server by carefully specifying the directories and files that you want to synchronize. +For this guide, you will call the system with the original files the "source", and the one you synchronize with the "target." Using `lsyncd`, you can completely mirror a server by carefully specifying the directories and files that you want to synchronize. You will also want to set up [Rocky Linux SSH Public Private Key Pairs](../security/ssh_public_private_keys.md) for remote syncing. The examples here use SSH (port 22). ## Installing `lsyncd` -Installing `lsyncd` happens in two ways. Included are descriptions of each method. The RPM tends to lag behind the source packages by a little, but only by a little. The version installed by the RPM method at the time of this writing is 2.2.3-5, whereas the source code version is now 2.3.1. Choose the method you feel the most comfortable with. +!!! info + + As of this date (Septemer 2025), Rocky Linux 10 with the EPEL (Extra Packages for Enterprise Linux) enabled, does not include the `lsyncd` package. To use `lsyncd` on Rocky Linux 10, you will need to use the **Installing `lsyncd` - source method**. The RPM method is retained here, as it is likely that the EPEL will build this package for version 10 in the future. It never hurts to check to see if the package is available prior to building from source. + +You can install `lsyncd` in two ways. Included are descriptions of each method. The RPM tends to lag behind the source packages by a little, but only by a little. The version installed by the RPM method at the time of this writing is 2.2.3-5, whereas the source code version is now 2.3.1. Choose the method you feel the most comfortable with. ## Installing `lsyncd` - RPM method -Installing the RPM version is easy. The only thing you will need to install first is the EPEL software repository from Fedora. Do this with: +The only thing you will need to install first is the EPEL software repository from Fedora. Do this with: ```bash dnf install -y epel-release @@ -64,23 +68,19 @@ Installing from the source is not difficult. ### Install dependencies -You will need some dependencies for `lsyncd` and for building packages from the source. Use this command on your Rocky Linux computer to ensure you have the necessary dependencies. If you are going to be building from source, it is a good idea to have all of the development tools installed: +You will need some dependencies for `lsyncd` and for building packages from the source. Install the "Development Tools" group: ```bash dnf groupinstall 'Development Tools' ``` -!!! warning "For Rocky Linux 9.0" - - `lsyncd` has been fully tested in Rocky Linux 9.0, and will work as expected. To get all of the needed dependencies installed, however, you will need to enable an additional repository: +Enable the code ready builder repository: - ``` - dnf config-manager --enable crb - ``` - - Doing these nine steps before the following steps will allow you to finish the build without backtracking. +```bash +dnf config-manager --enable crb +``` -Here are the dependencies needed for `lsyncd`: +Install the needed dependencies: ```bash dnf install lua lua-libs lua-devel cmake unzip wget rsync @@ -98,7 +98,7 @@ Decompress the `master.zip` file: `unzip master.zip` -This will create a directory called "lsyncd-master". You need to change to this directory and create a directory called build: +This creates a directory called "lsyncd-master". You need to change to this directory and create a directory called "build": ```bash cd lsyncd-master @@ -124,13 +124,13 @@ make make install ``` -When completed, you will have the `lsyncd` binary installed and ready for use in */usr/local/bin* +When completed, you will have the `lsyncd` binary installed and ready for use in `/usr/local/bin` -### `lsyncd` systemd service +### `lsyncd` `systemd` service -With the RPM install method, the systemd service will install for you, but if you install from the source, you will need to create the systemd service. While you can start the binary without the systemd service, you want to ensure that it *does* start on boot. If not, a server reboot will stop your synchronization effort. If you forgot to start it again manually, it would be a problem! +With the RPM install method, the `systemd` service will install for you, but if you install from the source, you need to create the `systemd` service. While you can start the binary without the `systemd` service, you want to ensure that it *does* start on boot. If not, a server reboot will stop your synchronization effort. -Creating the systemd service is relatively easy and will save you time in the long run. +Creating the `systemd` service is not difficult and will save you time in the long run. #### Create the `lsyncd` service file @@ -159,13 +159,13 @@ PIDFile=/run/lsyncd.pid WantedBy=multi-user.target ``` -Install the file you just made to the correct location: +Install this file to the correct location: ```bash install -Dm0644 /root/lsyncd.service /usr/lib/systemd/system/lsyncd.service ``` -Finally, reload the `systemctl` daemon so that systemd will "see" the new service file: +Finally, reload the `systemctl` daemon so that `systemd` will "see" the new service file: ```bash systemctl daemon-reload @@ -173,11 +173,11 @@ systemctl daemon-reload ## `lsyncd` configuration -With either `lsyncd` install method, you need a configuration file: */etc/lsyncd.conf*. The following section will tell you how to build and test a configuration file. +With either `lsyncd` install method, you need a configuration file: `/etc/lsyncd.conf`. The following section will tell you how to build and test a configuration file. ### Sample configuration for testing -Here is an example of a simplistic configuration file synchronizing */home* to another computer. Our target computer is going to be a local IP address: *192.168.1.40* +Here is an example of a configuration file synchronizing `/home` to another computer. The target computer is going to be on local IP address: *192.168.1.40* ```bash settings { @@ -211,7 +211,7 @@ Breaking down this file a bit: - `maxProcesses` is the number of `lsyncd` processes allowed to spawn. Unless you are running this on a busy computer, 1 process is enough. - In the sync section `default.rsyncssh` says to use `rsync` over SSH - The `source=` is the directory path you are syncing from -- The `host=` is our target computer that you are syncing to +- The `host=` is your target computer that you are syncing to - The `excludeFrom=` tells `lsyncd` where the exclusions file is. It must exist but can be empty. - The `targetdir=` is the directory to which you send files. This will usually be equal to the source, but only sometimes. - The `rsync =` section, and the options that you are running `rsync` with @@ -236,9 +236,9 @@ For example, if you were syncing the `/etc` folder on your computer, there would /etc/fstab ``` -## Test And Turn Up +## Test and turn up -With everything set up, you can test it all. Ensure our systemd `lsyncd.service` will start: +With everything set up, you can test it all. Ensure your `systemd` `lsyncd.service` will start: ```bash systemctl start lsyncd @@ -250,14 +250,14 @@ If no errors appear after executing this command, check the status of the servic systemctl status lsyncd ``` -If it shows the service running, use tail to see the ends of the two log files and ensure everything shows up OK: +If it shows the service running, use tail to see the ends of the two log files and ensure everything shows up: ```bash tail /var/log/lsyncd.log tail /var/log/lsyncd-status.log ``` -Assuming that this all looks correct, navigate to the `/home/[user]` directory, where `[user]` is a computer user, and create a file there with *touch*. +Assuming that this all looks correct, go to the `/home/[user]` directory, where `[user]` is a computer user, and create a file there with *touch*. ```bash touch /home/[user]/testfile @@ -271,12 +271,12 @@ systemctl enable lsyncd ## Remember to be careful -Anytime you synchronize a set of files or directories to another computer, think carefully about its effect on the target computer. Suppose you go back to **The lsyncd.exclude File** in our example above, can you imagine what might happen if you failed to exclude */etc/fstab*? +Anytime you synchronize a set of files or directories to another computer, think carefully about its effect on the target computer. Suppose you go back to **The lsyncd.exclude File** example earlier. Can you imagine what might happen if you did not exclude `/etc/fstab`? `fstab` is the file configuring storage drives on any Linux computer. The disks and labels are almost certainly different on different machines. The next reboot of the target computer would likely fail. ## Conclusions and references -`lsyncd` is a powerful tool for directory synchronization between computers. As you have seen, it is not hard to install and will not be complex to maintain. +`lsyncd` is a powerful tool for directory synchronization between computers. It is not hard to install or complex to maintain. -You can find out more about `lsyncd` by going to [The Official Site](https://github.com/axkibe/lsyncd) +You can discover more about `lsyncd` by going to [The Official Site](https://github.com/axkibe/lsyncd) From 4ba08998a516989fb168ba88af0a2d4ac3a533da Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Fri, 19 Sep 2025 13:09:22 -0500 Subject: [PATCH 158/164] Update `rsnapshot_backup.md` for 10 (#2887) * show installation steps and results as in 10 * add tested with 10.0 in meta * some grammar and passive voice cleanup * some sentence simplification * retain source build instructions (works fine with EPEL on 10-but having the source build option there does not hurt) * other minor corrections and updates --- docs/guides/backup/rsnapshot_backup.md | 90 +++++++++++++------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/docs/guides/backup/rsnapshot_backup.md b/docs/guides/backup/rsnapshot_backup.md index f620358431..38f74aa1fb 100644 --- a/docs/guides/backup/rsnapshot_backup.md +++ b/docs/guides/backup/rsnapshot_backup.md @@ -2,7 +2,7 @@ title: Backup Solution - rsnapshot author: Steven Spencer contributors: Ezequiel Bruni, Ganna Zhyrnova -tested_with: 8.5, 8.6, 9.0 +tested_with: 8.5, 8.6, 9.0, 10.0 tags: - backup - rsnapshot @@ -13,15 +13,15 @@ tags: - Know how to install additional repositories and snapshots from the command-line - Know about mounting file systems external to your machine (external drive, remote file system, and so on.) - Know how to use an editor (using `vi` here, but you can use your favorite editor) -- Know a little BASH scripting +- Know a little Bash scripting - Know how to change the `crontab` for the root user - Knowledge of SSH public and private keys (only if you plan to run remote backups from another server) ## Introduction -`rsnapshot` is a powerful backup utility with installation options on any Linux-based machine. It can either back up a machine locally, or you can back up multiple machines, say servers for instance, from a single machine. +`rsnapshot` is a powerful backup utility with installation options on any Linux-based machine. It can either back up a machine locally, or you can back up multiple machines, such as servers, from a single machine. -`rsnapshot` uses `rsync` and is written entirely in Perl with no library dependencies. No unusual requirements exist for installation. In the case of Rocky Linux, you can install `rnapshot` by using the EPEL repository. After the initial release of Rocky Linux 9.0, there was a time when the EPEL did not contain the `rsnapshot` package. That is no longer the case, but these instructions include a method of installing from source just in case this happens again. +Written entirely in Perl `rsnapshot` uses `rsync` and has no library dependencies. No unusual requirements exist for installation. In the case of Rocky Linux, you can install `rnapshot` by using the EPEL (Extra Packages for Enterprise Linux) repository. If you prefer, the source method of installation is here as an option. This documentation covers the installation of `rsnapshot` on Rocky Linux only. @@ -52,24 +52,24 @@ This documentation covers the installation of `rsnapshot` on Rocky Linux only. If there are any missing dependencies, those will show up and you simply need to answer the prompt to continue. For example: ``` - dnf install rsnapshot - Last metadata expiration check: 0:00:16 ago on Mon Feb 22 00:12:45 2021. + dnf install rsnapshot rsync + Last metadata expiration check: 2:03:40 ago on Fri 19 Sep 2025 03:54:16 PM UTC. + Package rsync-3.4.1-2.el10.x86_64 is already installed. Dependencies resolved. - ======================================================================================================================================== - Package Architecture Version Repository Size - ======================================================================================================================================== + ============================================================================================================================== + Package Architecture Version Repository Size + ============================================================================================================================== Installing: - rsnapshot noarch 1.4.3-1.el8 epel 121 k + rsnapshot noarch 1.5.1-1.el10_0 epel 112 k Installing dependencies: - perl-Lchown x86_64 1.01-14.el8 epel 18 k - rsync x86_64 3.1.3-9.el8 baseos 404 k + perl-DirHandle noarch 1.05-512.2.el10_0 appstream 12 k Transaction Summary - ======================================================================================================================================== - Install 3 Packages - - Total download size: 543 k - Installed size: 1.2 M + ============================================================================================================================== + Install 2 Packages + + Total download size: 124 k + Installed size: 388 k Is this ok [y/N]: y ``` @@ -81,7 +81,7 @@ This documentation covers the installation of `rsnapshot` on Rocky Linux only. ### Installing Development Tools and downloading the source - As stated, the first step here is to install the 'Development Tools' group: + The first step here is to install the 'Development Tools' group: ``` dnf groupinstall 'Development Tools' @@ -93,7 +93,7 @@ This documentation covers the installation of `rsnapshot` on Rocky Linux only. dnf install wget unzip rsync openssh-server ``` - Next you will need to download the source files from the GitHub repository. You can do this multiple ways, but the easiest in this case is probably just to download the ZIP file from the repository. + Next, download the source files from the GitHub repository. You can do this multiple ways, but the easiest in this case is probably just to download the ZIP file from the repository. 1. Go to https://github.com/rsnapshot/rsnapshot 2. Click on the Green "Code" button on the right @@ -111,13 +111,13 @@ This documentation covers the installation of `rsnapshot` on Rocky Linux only. ### Building the source - Now that you have got everything on our machine, the next step is to build. When you unzipped the `master.zip` file, you ended up with an `rsnapshot-master` directory. You will need to change into this for our build procedure. Note that your build is using all of the package defaults, so if you want something else, you will need to do a little investigation. Also, these steps are directly taken from the [GitHub Installation](https://github.com/rsnapshot/rsnapshot/blob/master/INSTALL.md) page: + The next step is to build. When you unzipped the `master.zip` file, you ended up with an `rsnapshot-master` directory. Change into that directory for your build procedure. Note that your build is using all of the package defaults, so if you want something else, you will need to do a little investigation. Also, these steps are directly taken from the [GitHub Installation](https://github.com/rsnapshot/rsnapshot/blob/master/INSTALL.md) page: ```bash cd rsnapshot-master ``` - Run the `authogen.sh` script to generate the configure script: + Run the `autogen.sh` script to generate the configure script: ```bash ./autogen.sh @@ -145,7 +145,7 @@ This documentation covers the installation of `rsnapshot` on Rocky Linux only. sudo make install ``` - During all of this, the `rsnapshot.conf` file will be created as `rsnapshot.conf.default`. You need to copy this over to `rsnapshot.conf` and then edit it to fit what you need on our system. + During all of this, the `rsnapshot.conf` file will be created as `rsnapshot.conf.default`. Copy this file over to `rsnapshot.conf` and then edit it to fit what you need on our system. ```bash sudo cp /etc/rsnapshot.conf.default /etc/rsnapshot.conf @@ -157,7 +157,7 @@ This documentation covers the installation of `rsnapshot` on Rocky Linux only. In this step, we show how to mount a drive, such as an external USB drive, used to back up your system. This particular step is only necessary if you are backing up a single machine or server, as seen in our first example. -1. Plugin the USB drive. +1. Attach the USB drive. 2. Type `dmesg | grep sd` which will show you the drive you want to use. In this case, it is _sda1_. Example: `EXT4-fs (sda1): mounting ext2 file system using the ext4 subsystem`. 3. Unfortunately (or fortunately depending on your opinion) most modern Linux desktop operating systems automount the drive if they can. This means that, depending on various factors, `rsnapshot` might lose track of the drive. You want the drive to "mount" or make its files available in the same place every time. @@ -168,15 +168,15 @@ To do that, take the drive information revealed in the `dmesg` command and enter 7. Type `mount | grep sda1` again, and you will see this: `/dev/sda1 on /mnt/backup type ext2 (rw,relatime)` 8. Next create a directory that must exist for the backup to continue on the mounted drive. You use a folder called "storage" for this example: `sudo mkdir /mnt/backup/storage` -Note that for a single machine, you will have to either repeat the `umount` and `mount` steps each time the drive is attached, or each time the system reboots, or automate these commands with a script. +For a single machine, you will have to either repeat the `umount` and `mount` steps each time you attach the drive, or each time the system reboots, or automate these commands with a script. -Automation is recommended. +The recommendation is to use automation. ## Configuring `rsnapshot` This is the most important step. It is possible to make a mistake when making changes to the configuration file. The `rsnapshot` configuration requires tabs for any separation of elements, and a warning to that effect is at the top of the configuration file. -A space character will cause the entire configuration—and your backup—to fail. For instance, near the top of the configuration file is a section for the `# SNAPSHOT ROOT DIRECTORY #`. If you were adding this from scratch, you would type `snapshot_root` then TAB and then type `/whatever_the_path_to_the_snapshot_root_will_be/` +A space character will cause the entire configuration—and your backup—to fail. As an example, near the top of the configuration file is a section for the `# SNAPSHOT ROOT DIRECTORY #`. If you were adding this from scratch, you would type `snapshot_root` then ++tab++ and then type `/whatever_the_path_to_the_snapshot_root_will_be/` The best thing is that the default configuration included with `rsnapshot` only needs minor changes to make it work for a backup of a local machine. It is always a good idea, though, to make a backup copy of the configuration file before you start editing: @@ -200,13 +200,13 @@ You need to change this to your mount point that you created and add in "storage snapshot_root /mnt/backup/storage/` ``` -You also want to tell the backup not to run if the drive is not mounted. To do this, remove the "#" sign (also called a remark, number sign, hash symbol, and so on.) next to `no_create_root` which looks this way: +You also want to tell the backup not to run if the drive is not mounted. To do this, remove the remark ("#" sign) next to `no_create_root` that looks this way: ```text no_create_root 1 ``` -Next go down to the section titled `# EXTERNAL PROGRAM DEPENDENCIES #` and remove the comment (again, the "#" sign) from this line: +Next go down to the section titled `# EXTERNAL PROGRAM DEPENDENCIES #` and remove the remark (again, the "#" sign) from this line: ```text #cmd_cp /usr/bin/cp @@ -255,7 +255,7 @@ Remove the remark: logfile /var/log/rsnapshot ``` -Finally, skip down to the `### BACKUP POINTS / SCRIPTS ###` section and add any directories that you want to add in the `# LOCALHOST` section, remember to use ++tab++ rather than ++space++ between elements! +Finally, skip down to the `### BACKUP POINTS / SCRIPTS ###` section and add any directories that you want to add in the `# LOCALHOST` section, remember to use ++tab++ rather than ++space++ between elements. For now write your changes (++shift+colon+"wq!"++ for `vi`) and exit the configuration file. @@ -283,7 +283,7 @@ Again, to do this you do not necessarily have to specify the configuration in th rsnapshot -c /etc/rsnapshot.conf -t beta ``` -Which will return something similar to this, showing you what will happen when the backup is actually run: +This will return something similar to this, showing you what will happen when the backup is actually run: ```bash echo 1441 > /var/run/rsnapshot.pid @@ -305,17 +305,17 @@ When the test meets your expectations, run it manually the first time without th rsnapshot -c /etc/rsnapshot.conf beta ``` -When the backup finishes, browse to `/mnt/backup` and examine the directory structure that it creates there. There will be a `storage/beta.0/localhost` directory, followed by the directories that you specified to backup. +When the backup finishes, browse to `/mnt/backup` and examine the directory structure that it creates there. There will be a `storage/beta.0/localhost` directory, followed by the backup directories you specified. ### Further explanation Each time the backup runs, it will create another beta increment, 0-6, or 7 days worth of backups. The newest backup will always be beta.0 whereas yesterday's backup will always be beta.1. -The size of each of these backups will appear to take up the same amount (or more) of disk space, but this is because of the hard links used by `rsnapshot`. To restore files from yesterday's backup, you just copy them back from beta.1's directory structure. +The size of each of these backups will appear to take up the same amount (or more) of disk space, but this is because of the hard links used by `rsnapshot`. To restore files from yesterday's backup, you just copy them back from beta.1's directory structure. Each backup is only an incremental backup from the previous run, BUT, because of the use of hard links, each backup directory, contains either the file or the hard-link to the file in whichever directory it was actually backed up in. -To restore files, you do not have to decide the directory or increment to restore them from, just what time stamp of the backup that you are restoring. It is a great system and uses far less disk space than many other backup solutions. +To restore files, you do not have to decide the directory or increment to restore them from, just what timestamp of the backup that you are restoring. It is a great system and uses far less disk space than many other backup solutions. ## Setting the backup to run automatically @@ -325,9 +325,9 @@ With testing completed and secure in the knowledge that things will work without sudo crontab -e ``` -If you have not run this before, choose "vim.basic" as your editor or your own editor preference when the `Select an editor` line comes up. +If you have not run this before, select "vim.basic" as your editor or your own editor preference when the `Select an editor` line comes up. -You are going to set your backup to automatically run at 11 PM, so you will add this to the `crontab`: +To set your backup to automatically run at 11 PM, add this to the `crontab`: ```bash ## Running the backup at 11 PM @@ -336,15 +336,15 @@ You are going to set your backup to automatically run at 11 PM, so you will add ## Multiple machine or multiple server backups -Doing backups of multiple machines from a machine with a RAID array or large storage capacity, on-premise or from on an Internet connection elsewhere works well. +Doing backups of multiple machines from a machine with an RAID array or large storage capacity drive, on-site or from on an Internet connection elsewhere, works well. If running these backups over the Internet, you need to ensure that each location has adequate bandwidth for the backups to occur. You can use `rsnapshot` to synchronize an on-site server with an off-site backup array or backup server to improve data redundancy. ## Assumptions -Running `rsnapshot` from a machine remotely, on-premise. Running this exact configuration is possible remotely off-premise also. +Running `rsnapshot` from a machine remotely, on-site. Running this exact configuration is possible remotely off-site also. -In this case, you will want to install `rsnapshot` on the machine that is doing all of the backups. Other assumptions are: +In this case, you will want to install `rsnapshot` on the machine that is doing the backups. Other assumptions are: - That the servers you will be backing up to, have a firewall rule that allows the remote machine to SSH into it - That each server that you will be backing up has a recent version of `rsync` installed. For Rocky Linux servers, run `dnf install rsync` to update your system's version of `rsync`. @@ -352,9 +352,9 @@ In this case, you will want to install `rsnapshot` on the machine that is doing ## SSH public or private keys -For the server that will be running the backups, you need to generate an SSH key-pair for use during the backups. For our example, you will be creating RSA keys. +For the server that will be running the backups, you need to generate an SSH key-pair for use during the backups. For our example, you will create RSA keys. -If you already have a set of keys generated, you can skip this step. You can find out by doing an `ls -al .ssh` and looking for an `id_rsa` and `id_rsa.pub` key pair. If none exists, use the following link to set up keys for your machine and the server(s) that you want to access: +If you already have a set of keys generated, you can skip this step. You can see this by doing an `ls -al .ssh` and looking for an `id_rsa` and `id_rsa.pub` key pair. If none exists, use the following link to set up keys for your machine and the server(s) that you want to access: [SSH public private key pairs](../security/ssh_public_private_keys.md) @@ -375,22 +375,22 @@ no_create_root 1 #no_create_root 1 ``` -The other difference here is that each machine will have its own configuration. When you get used to this, you will just copy one of your existing configuration files over to a different name and change it to fit any additional machines that you want to backup. +The other difference here is that each machine will have its own configuration. When you get used to this, you will just copy one of your existing configuration files over to a different name and change it to fit any additional machines that you want backups for. -For now, you want to change the configuration file just (as shown above), and save it. Copy that file as a template for our first server: +For now, you want to change the configuration file and save it. Copy that file as a template for our first server: ```bash cp /etc/rsnapshot.conf /etc/rsnapshot_web.conf ``` -You want to change the configuration file and create the log and `lockfile` with the machine's name: +Change the configuration file and create the log and `lockfile` with the machine's name: ```text logfile /var/log/rsnapshot_web.log lockfile /var/run/rsnapshot_web.pid ``` -Next, you want to change `rsnapshot_web.conf` to include the directories you want to back up. The only thing that is different here is the target. +Next change `rsnapshot_web.conf` to include the directories you want to back up. The only thing that is different here is the target. Here is an example of the "web.ourdomain.com" configuration: @@ -462,7 +462,7 @@ To ensure that everything is backing up according to plan, you might want to sen ## Restoring a backup -Restoring a few files or an entire backup involves copying the files you want from the directory with the date that you want to restore from back to your machine. +Restoring a few files or an entire backup involves copying the files you want from the directory with the date (timestamp) that you want to restore from, back to the machine. ## Conclusions and other resources From 7459f4092887f74c74ad0098020a578efe06bed9 Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Sat, 20 Sep 2025 12:55:30 -0500 Subject: [PATCH 159/164] fixes `tar.md` (#2888) * admonition subtitle does not = any logical meaning for the tip - edited and removed subtitle * fix missing comma * fix file name to filename * sentence simplifications * reword a couple of passive voice phrasing issues to active voice --- docs/guides/backup/tar.md | 41 +++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/docs/guides/backup/tar.md b/docs/guides/backup/tar.md index 41bb996cd0..e4807f090c 100644 --- a/docs/guides/backup/tar.md +++ b/docs/guides/backup/tar.md @@ -1,7 +1,7 @@ --- title: tar command author: tianci li -contributors: Ganna Zhyrnova +contributors: Ganna Zhyrnova, Steven Spencer tested_with: 8.10 tags: - tar @@ -32,7 +32,7 @@ The `tar` currently used on modern GNU/Linux initially came from the [GNU Projec When using `tar`, note that it has two saving modes: * **Relative mode** (default): Remove the leading character '/' from the file. Even if you have added the file with an absolute path, `tar` will remove the leading character "/" in this mode. -* **Absolute mode**: Keep the leading character '/' and include it in the file name. You need to use the `-P` option to enable this save mode. In this mode, you must represent all files as absolute paths. For security reasons, you should not use this save mode in most cases unless there are special scenario requirements. +* **Absolute mode**: Keep the leading character '/' and include it in the filename. You need to use the `-P` option to enable this save mode. In this mode, you must represent all files as absolute paths. For security reasons, you should not use this save mode in most cases unless there are special scenario requirements. When you use `tar,` you will encounter suffixes such as `.tar.gz`, `.tar.xz`, and `.tar.bz2`, which indicate that you create an archive first (categorizing related files as a single file) and then compress the file with the relevant compression type or algorithm. @@ -42,16 +42,15 @@ The compression type or algorithm can be gzip, bzip2, xz, zstd, or another. The usage of creating an archive and using compression is: -* `tar [option] [PATH] [DIR1] ... [FILE1] ...`. For example `tar -czvf /tmp/Fullbackup-20241201.tar.gz /etc/ /var/log/` +* `tar [option] [PATH] [DIR1] ... [FILE1] ...`. For example, `tar -czvf /tmp/Fullbackup-20241201.tar.gz /etc/ /var/log/` The usage to extract a file from an archive is: * `tar [option] [PATH] -C [dir]`. For example `tar -xzvf /tmp/Fullbackup-20241201.tar.gz -C /tmp/D1` -!!! tip "antic" +!!! tip - When you extract files from archived files, `tar` automatically selects the compression type based on the manually added suffix. For example, for `.tar.gz` files, you can directly use `tar -vxf` without using `tar -zvxf`. -You **must** select the compression type for creating archive compressed files. + When you extract files from archived files, `tar` automatically selects the compression type based on the manually added suffix. For example, for `.tar.gz` files, you can directly use `tar -vxf` without using `tar -zvxf`. You **must** select the compression type for creating archive compressed files. !!! Note @@ -72,23 +71,23 @@ You **must** select the compression type for creating archive compressed files. !!! Tip - The author recommends keeping the prefix "-" to preserve user habits regarding operation types. Of course, it won't be required. The operational parameters here indicate your primary function with `tar`. In other words, you need to choose one of the above types. + The author recommends keeping the prefix "-" to preserve user habits regarding operation types. It is not required. The operational parameters here indicate your primary function with `tar`. In other words, you need to choose one of the above types. ### Common auxiliary options -| option | description | -| :---: | :--- | -| `-z` | Use `gzip` as its compression type. Both creating archives and extracting from archives are applicable | -| `-v` | Displays detailed processing details | -| `-f` | Specifies the file name for archiving (including file suffix) | -| `-j` | Use `bzip2` as its compression type. Both creating archives and extracting from archives are applicable | -| `-J` | Use `xz` as its compression type. Both creating archives and extracting from archives are applicable | -| `-C` | Saves location after extracting files from the archive | -| `-P` | Saves using the absolute mode | +| option | description | +|--------|---------------------------------------------------------------------------------------------------------| +| `-z` | Use `gzip` as its compression type. Both creating archives and extracting from archives are applicable | +| `-v` | Displays detailed processing details | +| `-f` | Specifies the filename for archiving (including file suffix) | +| `-j` | Use `bzip2` as its compression type. Both creating archives and extracting from archives are applicable | +| `-J` | Use `xz` as its compression type. Both creating archives and extracting from archives are applicable | +| `-C` | Saves location after extracting files from the archive | +| `-P` | Saves using the absolute mode | For other auxiliary options not mentioned, see `man 1 tar` -!!! warning "Version difference" +!!! warning "Version differences" In some older versions of tar, option(s) are referred to as "key(s)", which means that using options with a "-" prefix may cause the `tar` not to work as expected. At this point, you need to remove the "-" prefix to make it work properly. @@ -123,11 +122,11 @@ For other auxiliary options not mentioned, see `man 1 tar` * `tar --update [-f ARCHIVE] [OPTIONS] [FILE...]` * `tar {--extract|--get} [-f ARCHIVE] [OPTIONS] [MEMBER...]` -The second method is more commonly used and is in line with the habits of most GNU/Linux users. +The second method is more commonly used by most GNU/Linux users. ### Compression efficiency and frequency of use -`tar` does not have compression capabilities, so it must be used with other compression tools. Compression and decompression will impact resource consumption. +`tar` does not have compression capabilities, so you must use it with other compression tools. Compression and decompression will impact resource consumption. Here is a ranking of the compression of a set of text files from least to most efficient: @@ -150,7 +149,7 @@ Here are examples of naming conventions for `tar` archives: | `-cvfPz` | `/home` | `home.A.tar.gz` | `/home` in absolute mode, *gzip* compression | | `-cvfPj` | `/home` | `home.A.tar.bz2` | `/home` in absolute mode, *bzip2* compression | -You may also add the date to the filename. +You might also add the date to the filename. ### Example of use @@ -238,7 +237,7 @@ You may also add the date to the filename. Shell > tar -Avf /tmp/etc.tar /tmp/log.tar ``` - This means that all files in "log.tar" will be appended to the end of "etc.tar". + This means that all files in "log.tar" will append to the end of "etc.tar". 2. Append files or directories to a `.tar` file: From f48bde1114a1b53f8bed1fe90ba1d18735bf78fd Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Mon, 22 Sep 2025 09:34:24 -0500 Subject: [PATCH 160/164] 10 fixes not available on epel (#2889) * Add missing from the EPEl to * `transmission-daemon.md` * `tor_releay.md` * `tor_onion_service.md` * `glances_network_monitoring.md` * `caddy.md` Add not tested in 10 to * `modsecurity.md` Add soon to be removed to: * `rkhunter` * Formatting issue on admonition fixed --- docs/guides/file_sharing/transmission_daemon.md | 6 +++++- .../guides/network/glances_network_monitoring.md | 10 +++++++--- docs/guides/proxies/tor_relay.md | 4 +++- .../web/apache_hardened_webserver/modsecurity.md | 16 ++++++++++++++-- .../web/apache_hardened_webserver/rkhunter.md | 4 +++- docs/guides/web/caddy.md | 4 +++- docs/guides/web/tor_onion_service.md | 4 +++- 7 files changed, 38 insertions(+), 10 deletions(-) diff --git a/docs/guides/file_sharing/transmission_daemon.md b/docs/guides/file_sharing/transmission_daemon.md index 5cb836de18..57087fc57e 100644 --- a/docs/guides/file_sharing/transmission_daemon.md +++ b/docs/guides/file_sharing/transmission_daemon.md @@ -7,11 +7,15 @@ tags: - file transfer --- +!!! warning "Temporary Hold" + + `transmission-daemon` is currently missing from the EPEL. It will probably be built. The Docs Team will continue to test availability in the EPEL as time allows. For now, your only option is to build the transmission package from source, and the instructions for doing that are currently missing here. + ## Introduction BitTorrent needs no introduction, but if you are unaware, BitTorrent is a peer-to-peer file-sharing protocol. BitTorrent relies on multiple peers seeding (uploading) the requested file to you, but you also seed back to future downloaders. -Transmission is a popular open-source BitTorrent client with multiple frontends and backends. Here, you will install the headless "daemon" backend. +Transmission is a popular open source BitTorrent client with multiple frontends and backends. Here, you will install the headless "daemon" backend. In today's mobile-centric world, it makes more sense to run Transmission as a headless server than directly on a laptop or a desktop. This way, you can seed files 24/7 while a mobile device's battery life is not consumed when downloading. diff --git a/docs/guides/network/glances_network_monitoring.md b/docs/guides/network/glances_network_monitoring.md index 35ab8393df..d7b1d26954 100644 --- a/docs/guides/network/glances_network_monitoring.md +++ b/docs/guides/network/glances_network_monitoring.md @@ -8,7 +8,11 @@ tags: - network --- -# Introduction +!!! Warning "Temporary Hold" + + `glances` is currently missing from the EPEL. It will probably be built. The Docs Team will continue test availability in the EPEL as time allows. For now, your only option is to build `glances` from source, and the instructions for doing that are missing here. + +## Introduction This guide will show you how to setup decent **network or resource monitoring**, with minimum effort. From the author's perspective, Glances is similar to `vim` in the world of monitoring tools. @@ -154,6 +158,6 @@ In the Glances client browser (accessible through the `--browser` command line a ## Conclusion -While Glances cannot exactly replace tools such as Grafana, it is still a great alternative if you do not have time to set up complicated monitoring dashboards. +While Glances cannot exactly replace tools such as Grafana, it is still a great alternative if you do not have time to set up complicated monitoring dashboards. You can deploy it in seconds and get the same metrics you get in Grafana with Prometheus. -The web interface is not very versatile, like it is in Grafana. If you have the option to use the terminal, you should definitely do so. +The web interface is not very versatile, like it is in Grafana. If you have the option to use the terminal, you should definitely do so. diff --git a/docs/guides/proxies/tor_relay.md b/docs/guides/proxies/tor_relay.md index 8c13dd330b..65d2483e1a 100644 --- a/docs/guides/proxies/tor_relay.md +++ b/docs/guides/proxies/tor_relay.md @@ -8,7 +8,9 @@ tags: - proxies --- -# Tor Relay +!!! warning "Temporary Hold" + + `tor` is currently missing from the EPEL. It will probably be built. The Docs Team will continue to test availability in the EPEL as time allows. For now, your only option is to build `tor` from source, and the instructions for doing that are currently missing here. ## Introduction diff --git a/docs/guides/web/apache_hardened_webserver/modsecurity.md b/docs/guides/web/apache_hardened_webserver/modsecurity.md index dfe03cd918..27a445b67c 100644 --- a/docs/guides/web/apache_hardened_webserver/modsecurity.md +++ b/docs/guides/web/apache_hardened_webserver/modsecurity.md @@ -10,7 +10,9 @@ tags: - nginx --- -# Web-based application firewall (WAF) +!!! Note "Not yet tested" + + This procedure may work as is. Testing on 10 is incomplete as of September 22, 2025. If you use it and find problems, please let us know. ## Prerequisites @@ -26,12 +28,22 @@ tags: If you want to use this and other hardening tools, refer back to the [Apache Hardened Web Server guide](index.md). This document also uses all of the assumptions and conventions outlined in that original document. It is a good idea to review it before continuing. -One thing missing with `mod_security` when installed from the generic Rocky Linux repositories, is that the rules installed are minimal. To get a more extensive package of no cost `mod_security` rules, this procedure uses [OWASP `mod_security` rules found here](https://coreruleset.org/). OWASP stands for the Open Web Application Security Project. You can [find out more about OWASP here](https://owasp.org/). +One thing missing with `mod_security` when installed from the Atomicorp repository, is that the rules installed are minimal. To get a more extensive package of no cost `mod_security` rules, this procedure uses [OWASP `mod_security` rules found here](https://coreruleset.org/). OWASP stands for the Open Web Application Security Project. You can [find out more about OWASP here](https://owasp.org/). !!! tip As stated, this procedure uses the OWASP `mod_security` rules. What is not used is the configuration provided by that site. That site also provides great tutorials on using `mod_security` and other security-related tools. The document you are working through mow does nothing but help you install the tools and rules needed for hardening with `mod_security` on a Rocky Linux web server. Netnea is a team of technical professionals that provides security courses on their website. Much of this content is available at no cost, but they *do* have options for in-house or group training. +## Additional repository + +To install `mod_security` you will need the Atomicorp repository (atomic.repo). Do that with this line and answer yes to all the defaults: + +```bash +wget -q -O - https://www.atomicorp.com/installers/atomic | sh +``` + +Run `dnf upgrade` to read in all the changes. + ## Installing `mod_security` To install the base package, use this command. It will install any missing dependencies. You also need `wget` if you do not have it installed: diff --git a/docs/guides/web/apache_hardened_webserver/rkhunter.md b/docs/guides/web/apache_hardened_webserver/rkhunter.md index 2093677a24..0a31ddf673 100644 --- a/docs/guides/web/apache_hardened_webserver/rkhunter.md +++ b/docs/guides/web/apache_hardened_webserver/rkhunter.md @@ -9,7 +9,9 @@ tags: - rkhunter --- -# Rootkit Hunter +!!! Warning "`rkhunter` appears to be dead" + + This issue requires a little more testing, but it appears that `rkhunter` ceased to exist as a project in 2024. The probability of the package being built for 10 is unlikely. This procedure does not work, and will likely be removed allong with all of its references, soon. ## Introduction diff --git a/docs/guides/web/caddy.md b/docs/guides/web/caddy.md index 21f5e57e84..1dd757917b 100644 --- a/docs/guides/web/caddy.md +++ b/docs/guides/web/caddy.md @@ -7,7 +7,9 @@ tags: - web --- -# How to install the latest Caddy web server on Rocky Linux +!!! Warning "Temporary Hold" + + `caddy` is currently missing from the EPEL. It will probably be built. The Docs Team will continue to test availability in the EPEL as time allows. For now, your only option is to build `caddy` from source, and the instructions for doing that are currently missing here. ## Introduction diff --git a/docs/guides/web/tor_onion_service.md b/docs/guides/web/tor_onion_service.md index b9dfcf6b37..e2b8e4a705 100644 --- a/docs/guides/web/tor_onion_service.md +++ b/docs/guides/web/tor_onion_service.md @@ -9,7 +9,9 @@ tags: - proxies --- -# Tor Onion service +!!! warning "Temporary Hold" + + `tor` is currently missing from the EPEL. It will probably be built. The Docs Team will continue to test availability in the EPEL as time allows. For now, your only option is to build `tor` from source, and the instructions for doing that are currently missing here. ## Introduction From 2f285e76ae78a12026383db415bf031212bed604 Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Mon, 22 Sep 2025 09:50:18 -0500 Subject: [PATCH 161/164] Remove pound proxy server from 10 (#2890) * never built for 9, will not likely be built for 10 --- docs/guides/proxies/pound.it.md | 469 -------------------------------- docs/guides/proxies/pound.ko.md | 467 ------------------------------- docs/guides/proxies/pound.md | 468 ------------------------------- docs/guides/proxies/pound.pl.md | 467 ------------------------------- docs/guides/proxies/pound.uk.md | 469 -------------------------------- 5 files changed, 2340 deletions(-) delete mode 100644 docs/guides/proxies/pound.it.md delete mode 100644 docs/guides/proxies/pound.ko.md delete mode 100644 docs/guides/proxies/pound.md delete mode 100644 docs/guides/proxies/pound.pl.md delete mode 100644 docs/guides/proxies/pound.uk.md diff --git a/docs/guides/proxies/pound.it.md b/docs/guides/proxies/pound.it.md deleted file mode 100644 index d8a9a242a2..0000000000 --- a/docs/guides/proxies/pound.it.md +++ /dev/null @@ -1,469 +0,0 @@ ---- -title: Pound -author: Steven Spencer -contributors: Ganna Zhyrnova -tested_with: 8.5, 8.6 -tags: - - proxy - - proxies ---- - -# Server proxy pound - -!!! warning "Pound mancante in EPEL-9" - - Al momento, su Rocky Linux 9.0, Pound non può essere installato dal repository EPEL. Sebbene esistano fonti per i pacchetti SRPM, non possiamo verificarne l'integrità. Per questo motivo, al momento non è consigliabile installare il server proxy Pound su Rocky Linux 9.0. La situazione potrebbe cambiare se l'EPEL tornasse ad occuparsi di Pound. Utilizzare questa procedura specificamente per le versioni Rocky Linux 8.x. - -## Introduzione - -Pound è un reverse proxy e load balancer indipendente dal server web, semplice da configurare e gestire. Non utilizza un servizio web, ma ascolta le porte del servizio web (http, https). - -Esistono molte opzioni di server proxy, alcune delle quali sono citate in queste pagine di documentazione. Un documento sull'uso di [HAProxy è qui](haproxy_apache_lxd.md) e riferimenti all'applicazione di Nginx come reverse proxy esistono in altri documenti. - -I servizi di bilanciamento del carico sono molto utili in un ambiente di server web molto trafficato. Esistono molti server proxy, tra cui il già citato HAProxy, e vengono utilizzati per molti tipi di servizi. - -Nel caso di Pound, è utilizzabile solo per i servizi web, ma è efficace in ciò che fa. - -## Prerequisiti e presupposti - -I requisiti minimi per l'utilizzo di questa procedura sono i seguenti: - -- Il desiderio di bilanciare il carico tra alcuni siti web o la volontà di imparare un nuovo strumento per fare lo stessa cosa. -- La possibilità di eseguire comandi come utente root o di usare `sudo` per elevare i privilegi. -- Familiarità con un editor a riga di comando. L'autore utilizza `vi` o `vim`, ma potete sostituirlo con il vostro editor preferito. -- La comodità di cambiare le porte di ascolto su alcuni tipi di server web. -- Supponendo l'installazione precedente dei server Nginx e Apache. -- Supponendo che si stiano usando server Rocky Linux o container per ogni cosa. -- Sebbene in questo documento siano presenti tutti i tipi di dichiarazioni relative a `https`, questa guida si occupa solo del servizio `http`. Per utilizzare correttamente l'`https`, è necessario configurare il server pound con un vero certificato di una vera autorità di certificazione. - -!!! tip "Suggerimento" - - Se non avete installato nessuno di questi server, potete farlo su un ambiente di container (LXD o Docker) o su una macchina fisica e metterli in funzione. Per questa procedura, è necessario installarli con i rispettivi pacchetti e abilitare e avviare i servizi. Non li modificheremo in modo significativo. - - ``` - dnf -y install nginx && systemctl enable --now nginx - ``` - - - o - - ``` - dnf -y install httpd && systemctl enable --now httpd - ``` - -## Convenzioni - -Per questa procedura, utilizzeremo due server web (noti come server back end), uno con Nginx (192.168.1.111) e uno con Apache (192.168.1.108). - -Il nostro server Pound (192.168.1.103) è il gateway. - -Le porte di ascolto dei server back end saranno 8080 per il server Nginx e 8081 per il server Apache. (In basso viene presentato tutto.) - -!!! note "Nota" - - Ricordate di cambiare gli IP associati con quelli del vostro ambiente e di sostituirli, se necessario, nel corso di questa procedura. - -## Installazione del server Pound - -Per installare Pound, è necessario installare prima EPEL (Extra Packages for Enterprise Linux) ed eseguire gli aggiornamenti: - -```bash -dnf -y install epel-release && dnf -y update -``` - -Quindi installare Pound. (Sì, è una "P" maiuscola): - -```bash -dnf -y install Pound -``` - -## Configurazione di Pound - -Una volta installati i pacchetti, è necessario configurare Pound. L'autore usa `vi` per aggiornare questo documento, ma se preferite `nano` o qualcos'altro, sostituitelo pure: - -```bash -vi /etc/pound.cfg -``` - -Il file contiene informazioni predefinite, che rendono facile individuare la maggior parte dei componenti predefiniti di Pound: - -```bash -User "pound" -Group "pound" -Control "/var/lib/pound/pound.cfg" - -ListenHTTP - Address 0.0.0.0 - Port 80 -End - -ListenHTTPS - Address 0.0.0.0 - Port 443 - Cert "/etc/pki/tls/certs/pound.pem" -End - -Service - BackEnd - Address 127.0.0.1 - Port 8000 - End - - BackEnd - Address 127.0.0.1 - Port 8001 - End -End -``` - -### Uno sguardo più approfondito - -- Lo "User" e il "Group" - inseriti durante l'installazione -- Il file "Control" non viene utilizzato da nessuna parte -- La sezione "ListenHTTP" rappresenta il servizio `http` (Porta 80) e l'"Address" su cui il proxy ascolterà. Si cambierà questo indirizzo con l'IP effettivo del nostro server Pound. -- La sezione "ListenHTTPS" rappresenta il servizio `https` (Porta 443) e l'"Address" su cui il proxy ascolterà. Si cambierà questo indirizzo con l'IP del server Pound. -- L'opzione "Cert" è il certificato autofirmato fornito dal processo di installazione di Pound. In un ambiente di produzione, si desidera sostituire questo certificato con un certificato reale utilizzando una delle seguenti procedure: [Generazione di chiavi SSL](../security/ssl_keys_https.md) or [Chiavi SSL con Let's Encrypt](../security/generating_ssl_keys_lets_encrypt.md). -- La sezione "Service" configura i server "BackEnd" con le loro porte di ascolto. È possibile avere quanti server "BackEnd" si desiderano. - -### Modifica della configurazione - -- cambiare l'indirizzo IP in ciascuna opzione di ascolto con l'indirizzo IP del nostro server Pound, 192.168.1.103 -- cambiare gli indirizzi IP e le porte nelle sezioni "BackEnd" in modo che corrispondano alla nostra configurazione trovata in "Convenzioni" sopra (IP e porte) - -Una volta terminata la modifica della configurazione, il file avrà un aspetto simile a questo: - -```bash -User "pound" -Group "pound" -Control "/var/lib/pound/pound.cfg" - -ListenHTTP - Address 192.168.1.103 - Port 80 -End - -ListenHTTPS - Address 192.168.1.103 - Port 443 - Cert "/etc/pki/tls/certs/pound.pem" -End - -Service - BackEnd - Address 192.168.1.111 - Port 8080 - End - - BackEnd - Address 192.168.1.108 - Port 8081 - End -End -``` - -## Configurazione di Nginx per l'ascolto su 8080 - -Poiché nella nostra configurazione di Pound la porta di ascolto di Nginx è stata impostata su 8080, è necessario apportare questa modifica anche al server Nginx in uso. Per farlo, modificare il file `nginx.conf`: - -```bash -vi /etc/nginx/nginx.conf -``` - -È sufficiente modificare la riga "listen" con il nuovo numero di porta: - -```bash -listen 8080 default_server; -``` - -Salvare le modifiche e riavviare il servizio nginx: - -```bash -systemctl restart nginx -``` - -## Configurazione di Apache in ascolto su 8081 - -Poiché nella configurazione di Pound è stata impostata la porta di ascolto per Apache a 8081, è necessario apportare questa modifica anche al server Apache in esecuzione. Per farlo, è necessario modificare il file `httpd.conf`: - -```bash -vi /etc/httpd/conf/httpd.conf -``` - -Si desidera modificare la riga "Listen" con il nuovo numero di porta: - -```bash -Listen 8081 -``` - -Salvate le modifiche e riavviate il servizio httpd: - -```bash -systemctl restart httpd -``` - -## Test e avvio - -Una volta che i servizi web sono attivi e funzionanti e in ascolto sulle porte giuste su ciascuno dei server, il passo successivo è quello di attivare il servizio pound sul server Pound: - -```bash -systemctl enable --now pound -``` - -!!! warning "Attenzione" - - Utilizzando Nginx e Apache, come fatto qui a titolo dimostrativo, il server Nginx risponderà quasi sempre per primo. Per questo motivo, per eseguire un test efficace, è necessario assegnare una priorità bassa al server Nginx, in modo da poter vedere entrambe le schermate. Questo la dice lunga sulla velocità di Nginx rispetto ad Apache. Per modificare la priorità del server Nginx, basta aggiungere una priorità (da 1 a 9, dove 9 è la priorità più bassa) nella sezione "BackEnd" del server Nginx, in questo modo: - - ``` - BackEnd - Address 192.168.1.111 - Port 8080 - Priority 9 - End - ``` - -Quando si apre l'IP del server proxy in un browser web, viene visualizzata una di queste due schermate: - -![Pound Nginx](images/pound_nginx.jpg) - -Oppure - -![Pound Apache](images/pound_apache.jpg) - -## Utilizzare Emergency - -Una cosa che potrebbe essere necessario fare quando si utilizza un bilanciatore di carico come Pound, è di mettere fuori linea i server di produzione per la manutenzione o di avere un "BackEnd" di riserva per un'interruzione completa. Questo viene fatto con la dichiarazione "Emergency" nel file `pound.conf`. È possibile avere una sola dichiarazione di "Emergency" per servizio. Nel nostro caso, questo comparirà alla fine della sezione "Service" del nostro file di configurazione: - -```bash -... -Service - BackEnd - Address 192.168.1.117 - Port 8080 - Priority 9 - End - - BackEnd - Address 192.168.1.108 - Port 8081 - End - Emergency - Address 192.168.1.104 - Port 8000 - End -End -``` - -Questo server potrebbe mostrare solo un messaggio che dice "Down for Maintenance". - -## Considerazioni sulla sicurezza - -Un aspetto che la maggior parte dei documenti che trattano il bilanciamento del carico dei server proxy non affronta è quello della sicurezza. Ad esempio, se si tratta di un server web pubblico, è necessario che i servizi `http` e `https` siano aperti al mondo sul proxy di bilanciamento del carico. Ma che dire dei server "BackEnd"? - -È necessario accedere a queste porte solo dal server Pound, ma poiché il server Pound reindirizza a 8080 o 8081 sui server BackEnd e poiché i server BackEnd hanno `http` in ascolto su queste porte successive, è possibile utilizzare i nomi dei servizi per i comandi del firewall su questi server BackEnd. - -Questa sezione si occuperà di questi problemi e dei comandi `firewalld` necessari per bloccare tutto. - -!!! warning "Attenzione" - - Il presupposto è che abbiate accesso diretto ai server in questione e che non siate in remoto. Se siete in remoto, fate molta attenzione quando rimuovete i servizi da una zona `firewalld`! - - Potreste chiudervi accidentalmente fuori dal vostro server. - -### Firewall - server Pound - -Per il server Pound, si desidera consentire `http` e `https` dal mondo. È meglio valutare se è necessario consentire `ssh` dal mondo o meno. Se si lavora in locale sul server, questo probabilmente **NON** è il caso. L'autore ipotizza che il server sia disponibile attraverso la rete locale e che si abbia accesso diretto ad esso, quindi si bloccherà `ssh` agli IP della propria LAN. - -Per farlo, si utilizzerà il firewall integrato di Rocky Linux, `firewalld` e la struttura di comandi `firewall-cmd`. Si utilizzeranno anche due zone integrate, "public" e "trusted", per non complicare le cose. - -Iniziare aggiungendo i nostri IP di origine alla zona "trusted". Questa è la nostra LAN (nel nostro esempio: 192.168.1.0/24): - -```bash -firewall-cmd --zone=trusted --add-source=192.168.1.0/24 --permanent -``` - -Aggiungiamo quindi il servizio `ssh` alla zona: - -```bash -firewall-cmd --zone=trusted --add-service=ssh --permanent -``` - -E ricaricare il firewall con: - -```bash -firewall-cmd --reload -``` - -Elencate la zona in modo da poter vedere tutto con `firewall-cmd --zone=trusted --list-all` che vi darà qualcosa di simile a questo: - -```bash -trusted (active) - target: ACCEPT - icmp-block-inversion: no - interfaces: - sources: 192.168.1.0/24 - services: ssh - ports: - protocols: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - rich rules: - -``` - -Successivamente è necessario apportare le modifiche alla zona "public", che per impostazione predefinita ha il servizio `ssh` abilitato. Questo deve essere accuratamente rimosso (ancora una volta, l'autore presume che **NON** siate in remoto sul server!) con quanto segue: - -```bash -firewall-cmd --zone=public --remove-service=ssh --permanent -``` - -Dobbiamo anche aggiungere i servizi `http` e `https`: - -```bash -firewall-cmd --zone=public --add-service=http --add-service=https --permanent -``` - -Quindi è necessario ricaricare il firewall prima di poter vedere le modifiche: - -```bash -firewall-cmd --reload -``` - -Elencare la zona pubblica con `firewall-cmd --zone=public --list-all` che mostrerà qualcosa di simile a questo: - -```bash -public - target: default - icmp-block-inversion: no - interfaces: - sources: - services: cockpit dhcpv6-client http https - ports: - protocols: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - rich rules: -``` - -Queste sono le uniche modifiche necessarie al nostro bilanciatore di carico del server pound nell'ambiente di laboratorio. - -### Firewall - server di back end - -Per i server "BackEnd", non è necessario consentire l'accesso dal mondo per nessun motivo. È necessario consentire `ssh` dagli IP della LAN e `http` e `https` dal nostro bilanciatore di carico Pound. - -Questo è praticamente tutto. - -Anche in questo caso, si aggiungerà il servizio `ssh` alla zona "trusted", con gli stessi comandi utilizzati per il server pound. Aggiungete quindi una zona chiamata "balance" che userete per i restanti `http` e `https` e impostate gli IP di origine su quelli del bilanciatore di carico. - -Per semplificare le cose, utilizzare tutti i comandi utilizzati per la zona "trusted" in un'unica serie di comandi: - -```bash -firewall-cmd --zone=trusted --add-source=192.168.1.0/24 --permanent -firewall-cmd --zone=trusted --add-service=ssh --permanent -firewall-cmd --reload -firewall-cmd --zone=trusted --list-all -``` - -Dopo, la zona "trusted " avrà il seguente aspetto: - -```bash -trusted (active) - target: ACCEPT - icmp-block-inversion: no - interfaces: - sources: 192.168.1.0/24 - services: ssh - ports: - protocols: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - rich rules: -``` - -Ancora una volta, testate la regola `ssh` da un IP della LAN e poi rimuovete il servizio `ssh` dalla zona "public". **Ricordate l'avvertimento precedente e fatelo solo se avete accesso locale al server!** - -```bash -firewall-cmd --zone=public --remove-service=ssh --permanent -firewall-cmd --reload -firewall-cmd --zone=public --list-all -``` - -La zona pubblica avrà ora il seguente aspetto: - -```bash -public - target: default - icmp-block-inversion: no - interfaces: - sources: - services: cockpit dhcpv6-client - ports: - protocols: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - rich rules: -``` - -Aggiungere una nuova zona per gestire `http` e `https`. Ricordate che l'IP di origine deve essere solo il vostro bilanciatore di carico (nel nostro esempio: 192.168.1.103): - -!!! note "Nota" - - Una nuova zona deve essere aggiunta con l'opzione `--permanent` e non può essere utilizzata finché il firewall non viene ricaricato. Inoltre, non dimenticare di impostare `-set-target=ACCEPT` per questa zona! - -```bash -firewall-cmd --new-zone=balance --permanent -firewall-cmd --reload -firewall-cmd --zone=balance --set-target=ACCEPT -firewall-cmd --zone=balance --add-source=192.168.1.103 --permanent -firewall-cmd --zone=balance --add-service=http --add-service=https --permanent -firewall-cmd --reload -firewall-cmd --zone=balance --list-all -``` - -Il risultato: - -```bash -balance (active) - target: ACCEPT - icmp-block-inversion: no - interfaces: - sources: 192.168.1.103 - services: http https - ports: - protocols: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - rich rules: -``` - -Ripetere questi passaggi sull'altro back end del server web. - -Una volta aggiunte le regole del firewall al tutto, testate nuovamente il vostro server Pound dal browser della vostra workstation. - -## Altre informazioni - -Sono *molte* le opzioni utilizzabili nel file `pound.conf`, tra cui le direttive per i messaggi di errore, le opzioni di registrazione, i valori di time out e altro ancora. Per conoscere la disponibilità si può consultare il sito [guardando qui.](https://linux.die.net/man/8/pound) - -Convenientemente, Pound capisce automaticamente se uno dei server "BackEnd" è off-line e lo disabilita in modo che i servizi web possano continuare senza ritardi. Inoltre, li rivede automaticamente quando tornano in linea. - -## Conclusione - -Pound offre un'altra opzione per chi non vuole usare HAProxy o Nginx per il bilanciamento del carico. - -Pound come server di bilanciamento del carico è molto facile da installare, configurare e utilizzare. Come si è detto, è possibile usare Pound come reverse proxy, ed esistono molte opzioni di proxy e bilanciamento del carico. - -Inoltre, è necessario tenere sempre presente la sicurezza quando si configura qualsiasi servizio, compreso un server proxy di bilanciamento del carico. diff --git a/docs/guides/proxies/pound.ko.md b/docs/guides/proxies/pound.ko.md deleted file mode 100644 index 9b61fee695..0000000000 --- a/docs/guides/proxies/pound.ko.md +++ /dev/null @@ -1,467 +0,0 @@ ---- -title: Pound -author: Steven Spencer -contributors: -tested_with: 8.5, 8.6 -tags: - - proxy - - proxies ---- - -# 파운드 프록시 서버 - -!!! 경고 "EPEL-9에서 파운드 누락" - - 현재 기록된 시점에서 Rocky Linux 9.0에서는 EPEL 저장소에서 Pound를 설치할 수 없습니다. SRPM 패키지에 대한 소스는 다른 곳에서 찾을 수 있지만, 이러한 소스들의 무결성을 검증할 수 없습니다. 따라서 현재는 Rocky Linux 9.0에 Pound 프록시 서버를 설치하는 것을 권장하지 않습니다. EPEL이 다시 Pound를 지원하기 시작하면 상황이 달라질 수 있습니다. 이 프로시저는 특히 Rocky Linux 8.x 버전을 대상으로 합니다. - -## 소개 - -Pound는 웹 서버에 구애받지 않는 리버스 프록시 및 로드 밸런서로서 설정과 관리가 매우 간단합니다. Pound 자체로는 웹 서비스를 사용하지 않지만 웹 서비스 포트 (http, https)에서 수신합니다. - -이제 많은 프록시 서버 옵션이 있으며 일부는 이 설명서 페이지에서 참조됩니다. [HAProxy here](haproxy_apache_lxd.md) 사용에 대한 문서가 있으며 다른 문서에는 리버스 프록시에 Nginx를 사용하는 참조가 있습니다. - -로드 밸런싱 서비스는 활발한 웹 서버 환경에 매우 유용합니다. 이전에 언급한 HAProxy를 비롯한 많은 프록시 서버는 다양한 서비스 유형에 사용될 수 있습니다. - -Pound의 경우 웹 서비스에만 사용할 수 있지만 자신의 역할을 잘 수행합니다. - -## 전제 조건 및 가정 - -이 프로시저를 사용하기 위해 다음이 최소 요구 사항입니다: - -* 일부 웹 사이트 간 로드 밸런싱을 하려는 의도, 또는 새로운 도구를 배우려는 의도 -* root 사용자로 명령을 실행하거나 `sudo`를 사용하여 root 권한 획득할 수 있는 능력 -* 커맨드 라인 에디터에 익숙합니다. 우리는 여기서 `vi` 또는 `vim`을 사용하고 있지만, 원하는 에디터로 대체해도 좋습니다. -* 일부 종류의 웹 서버의 수신 포트를 변경하는 데 편안함 -* Nginx와 Apache 서버가 모두 이미 설치되어 있다고 가정합니다. -* Rocky Linux 서버 또는 컨테이너를 사용하고 있다고 가정합니다. -* 아래에서 설명하는 `https`에 대한 다양한 선언을 기억하세요. 이 가이드는 오로지 `http` 서비스에 대해서만 다룹니다. `https`를 제대로 구성하려면 실제 인증 기관에서 받은 실제 인증서로 Pound 서버를 구성해야 합니다. - -!!! tip "팁" - - 아직 이 두 서버 중 하나도 설치하지 않았다면, 컨테이너 환경(LXD 또는 Docker) 또는 베어 메탈에서 설치하고 실행할 수 있습니다. 이 프로시저에서는 해당 패키지로 설치하고 서비스를 활성화하고 시작하는 것만 필요합니다. 우리는 이들을 현저하게 변경하지 않을 것입니다. - - ``` - dnf -y install nginx && systemctl enable --now nginx - ``` - - - 또는 - - ``` - dnf -y install httpd && systemctl enable --now httpd - ``` - -## 규칙 - -이 프로시저에서는 두 개의 웹 서버(백엔드 서버라고 함)를 사용할 예정이며, 하나는 Nginx(192.168.1.111), 다른 하나는 Apache(192.168.1.108)가 실행됩니다. - -Pound 서버(192.168.1.103)가 게이트웨이 역할을 합니다. - -We will be switching our listen ports on both of the back end servers to 8080 for the Nginx server and 8081 for the Apache server. 아래에서 모두 자세히 설명하니 현재는 걱정할 필요가 없습니다. - -!!! note - - 연관된 IP를 환경에 따라 실제 IP로 변경하고 이를 해당 프로시저 내에서 적용하십시오. - -## 파운드 서버 설치 - -Pound를 설치하려면 먼저 EPEL(Extra Packages for Enterprise Linux)을 설치하고 EPEL에 새로운 사항이 있는 경우에 대비하여 업데이트를 실행해야 합니다: - -``` -dnf -y install epel-release && dnf -y update -``` - -그런 다음 단순히 Pound를 설치합니다. (네, "P"는 대문자로 해야 합니다.): - -``` -dnf -y install Pound -``` - -## 파운드 구성 - -패키지가 설치되면 Pound를 구성해야 합니다. `vi`를 사용하여 업데이트할 것입니다만, `nano` 또는 다른 것을 선호하는 경우 해당 에디터로 대체하세요: - -```bash -vi /etc/pound.cfg -``` - -파일은 기본 정보로 설정되어 있어 Pound의 대부분의 기본 구성 요소를 쉽게 확인할 수 있습니다: - -```bash -User "pound" -Group "pound" -Control "/var/lib/pound/pound.cfg" - -ListenHTTP - Address 0.0.0.0 - Port 80 -End - -ListenHTTPS - Address 0.0.0.0 - Port 443 - Cert "/etc/pki/tls/certs/pound.pem" -End - -Service - BackEnd - Address 127.0.0.1 - Port 8000 - End - - BackEnd - Address 127.0.0.1 - Port 8001 - End -End -``` - -### 자세히 살펴 보기 - -* "User"와 "Group"은 설치할 때 처리되었습니다. -* "Control" 파일은 어디에서도 사용되지 않는 것으로 보입니다. -* "ListenHTTP" 섹션은 서비스 `http` (포트 80)를 나타내며 프록시가 수신 대기할 "Address"입니다. 이를 실제 Pound 서버의 IP로 변경할 것입니다. -* "ListenHTTPS" 섹션은 서비스 `https` (포트 443)를 나타내며 프록시가 수신 대기할 "Address"입니다. 위와 마찬가지로 Pound 서버의 IP로 변경할 것입니다. "Cert" 옵션은 Pound 설치 프로세스에서 제공하는 자체 서명된 인증서입니다. 실제 환경에서는 이를 실제 인증서로 대체해야 합니다. 이를 위해 다음 중 하나의 프로시저를 사용할 수 있습니다: [SSL 키 생성](../security/ssl_keys_https.md) 또는 \[Let's Encrypt를 사용한 SSL 키\](../security/ generation_ssl_keys_lets_encrypt.md). -* "Service" 섹션에서는 "BackEnd" 서버가 구성되고 수신 포트가 설정됩니다. 필요에 따라 여러 "BackEnd" 서버를 가질 수 있습니다. - -### 구성 변경 - -* 두 수신 옵션에서 IP 주소를 파운드 서버 IP인 192.168.1.103으로 변경합니다. -* 위의 "Conventions"(IP 및 포트)에 있는 구성과 일치하도록 "BackEnd" 섹션 아래의 IP 주소 및 포트를 변경합니다. - -구성을 모두 수정한 후 다음과 같은 변경된 파일이 있어야 합니다: - -```bash -User "pound" -Group "pound" -Control "/var/lib/pound/pound.cfg" - -ListenHTTP - Address 192.168.1.103 - Port 80 -End - -ListenHTTPS - Address 192.168.1.103 - Port 443 - Cert "/etc/pki/tls/certs/pound.pem" -End - -Service - BackEnd - Address 192.168.1.111 - Port 8080 - End - - BackEnd - Address 192.168.1.108 - Port 8081 - End -End -``` - -## 8080에서 수신 대기하도록 Nginx 구성 - -Pound 구성에서 Nginx의 수신 포트를 8080으로 설정했으므로 실행 중인 Nginx 서버에서도 해당 변경을 수행해야 합니다. 이를 위해 `nginx.conf`를 수정합니다. - -```bash -vi /etc/nginx/nginx.conf -``` - -"listen" 라인을 새 포트 번호로 변경합니다. - -```bash -listen 8080 default_server; -``` - -변경 사항을 저장한 다음 nginx 서비스를 다시 시작합니다. - -``` -systemctl restart nginx -``` - -## 8081에서 수신 대기하도록 Apache 구성 - -Pound 구성에서 Apache의 수신 포트를 8081로 설정했으므로 실행 중인 Apache 서버에서도 해당 변경을 수행해야 합니다. 이를 위해 `httpd.conf`를 수정합니다. - -```bash -vi /etc/httpd/conf/httpd.conf -``` - -"Listen" 라인을 새 포트 번호로 변경합니다. - -```bash -Listen 8081 -``` - -변경 사항을 저장한 후 httpd 서비스를 다시 시작합니다. - -``` -systemctl restart httpd -``` - -## 테스트 및 켜기 - -각 웹 서비스가 올바른 포트로 실행되고 수신하도록 설정한 후, 다음 단계는 Pound 서버에서 pound 서비스를 시작하는 것입니다. - -``` -systemctl enable --now pound -``` - -!!! 주의 - - 여기서 데모하듯이 Nginx와 Apache를 사용하는 경우 대부분의 경우 Nginx 서버가 항상 먼저 응답할 것입니다. 따라서 효과적으로 테스트하려면 Nginx 서버에 낮은 우선순위를 할당하여 두 개의 화면을 모두 볼 수 있어야 합니다. 이는 Apache에 비해 Nginx의 속도를 보여주는 것입니다. Nginx 서버의 우선순위를 변경하려면 다음과 같이 "BackEnd" 섹션에서 우선순위(1-9, 9가 가장 낮은 우선순위)를 추가하면 됩니다. - - ``` - BackEnd - Address 192.168.1.111 - Port 8080 - Priority 9 - End - ``` - -웹 브라우저에서 프록시 서버 IP를 열면 두 가지 중 하나의 화면을 볼 수 있어야 합니다: - -![Pound Nginx](images/pound_nginx.jpg) - -또는 - -![Pound Apache](images/pound_apache.jpg) - -## 긴급 사용 - -예를 들어, Pound와 같은 로드 밸런서를 사용하는 경우, 프로덕션 서버를 유지 보수하거나 완전한 중단 시 "BackEnd"에 대한 후퇴 백엔드를 가져야 할 수 있습니다. 이를 `pound.conf` 파일의 "Emergency" 선언으로 수행할 수 있습니다. 한 번에 하나의 "Emergency" 선언만 허용됩니다. 우리의 경우, 이것은 구성 파일의 "Service" 섹션의 끝에 나타날 것입니다. - -``` -... -Service - BackEnd - Address 192.168.1.117 - Port 8080 - Priority 9 - End - - BackEnd - Address 192.168.1.108 - Port 8081 - End - Emergency - Address 192.168.1.104 - Port 8000 - End -End -``` - -이 서버는 "Down For Maintenance"라는 메시지만 표시할 수 있습니다. - -## 보안 고려 사항 - -로드 밸런싱 프록시 서버와 관련하여 대부분의 문서에서 다루지 않는 보안 문제도 있습니다. 예를 들어, 이것이 공개적으로 공개되는 웹 서버인 경우, 프록시가 전 세계에서 `http` 및 `https` 서비스를 사용할 필요가 있습니다. 그러나 "BackEnd" 서버는 어떻게 해야 할까요? - -"BackEnd" 서버는 Pound 서버 자체에서만 해당 포트로 액세스해야 하지만, Pound 서버가 BackEnd 서버로 8080 또는 8081로 리디렉션하고 BackEnd 서버가 해당 후속 포트에서 `http`를 수신하기 때문에 방화벽 명령에 서비스 이름을 사용할 수 있습니다. - -이 섹션에서는 이러한 고려 사항과 모든 것을 제한하는 데 필요한 `firewalld` 명령을 다룰 것입니다. - -!!! !!! - - 여기서는 서버에 직접 액세스할 수 있으며 원격에 있지 않다고 가정합니다. 원격으로 접속 중인 경우 `firewalld` 영역에서 서비스를 제거할 때 매우 조심해야 합니다! - - 실수로 서버에 접속할 수 없게 될 수 있습니다. - -### 방화벽 - Pound 서버 - -위에서 언급한 대로 Pound 서버의 경우, 전 세계에서 `http` 와 `https`를 허용하려고 합니다. `ssh`도 전 세계에서 허용해야 할지 고려해야 합니다. 서버에 로컬인 경우에는 아마 **NOT** 일 것입니다. 여기에 있는 서버는 로컬 네트워크를 통해 사용할 수 있고 직접 액세스할 수 있다고 가정하므로 LAN IP에`ssh` 를 잠글 것입니다. - -이를 위해 Rocky Linux에 내장된 방화벽인 `firewalld`와 `firewall-cmd` 명령 구조를 사용합니다. 간단하게 하기 위해 "public" 및 "trusted"라는 두 개의 내장된 zone도 사용합니다. - -먼저 "trusted" zone에 소스 IP를 추가하여 우리의 LAN을 추가합니다. 이것이 우리의 LAN입니다(예: 192.168.1.0/24). - -``` -firewall-cmd --zone=trusted --add-source=192.168.1.0/24 --permanent -``` - -다음으로 `ssh` 서비스를 zone에 추가합니다: - -``` -firewall-cmd --zone=trusted --add-service=ssh --permanent -``` - -모든 작업이 완료되면 방화벽을 다시 로드하고 변경 사항을 확인합니다: - -``` -firewall-cmd --reload -``` - -그런 다음 "trusted" zone을 보려면 `firewall-cmd --zone=trusted --list-all`를 사용하여 다음과 같은 결과를 얻을 수 있습니다: - -```bash -trusted (active) - target: ACCEPT - icmp-block-inversion: no - interfaces: - sources: 192.168.1.0/24 - services: ssh - ports: - protocols: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - rich rules: - -``` - -다음으로 기본적으로 `ssh` 서비스가 활성화된 "public" 영역을 변경해야 합니다. 이를 조심스럽게 제거해야 합니다(다시 말씀드리지만, 여기서는 사용자가 서버에 원격이 **아니라고** 가정합니다!): - -``` -firewall-cmd --zone=public --remove-service=ssh --permanent -``` -또한 `http` 및 `https` 서비스를 추가해야 합니다. - -``` -firewall-cmd --zone=public --add-service=http --add-service=https --permanent -``` - -그런 다음 변경 사항을 확인하려면 방화벽을 다시 로드해야 합니다. - -``` -firewall-cmd --reload -``` - -그런 다음 `firewall-cmd --zone=public --list-all`l을 사용하여 public zone을 확인하면 다음과 같은 결과가 표시됩니다: - -```bash -public - target: default - icmp-block-inversion: no - interfaces: - sources: - services: cockpit dhcpv6-client http https - ports: - protocols: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - rich rules: -``` - -우리의 lab 환경에서는 이것으로 Pound 서버 로드 밸런서를 모두 제한합니다. - -### 방화벽 - 백엔드 서버 - -"백엔드" 서버에 대해선, 전체적으로 세계에서 접근할 필요가 없으며, 리스닝 포트는 로드 밸런서에서 사용할 예정입니다. LAN IP에서 `ssh`를 허용해야 하며, pound 로드 밸런서로부터 `http` 및 `https`를 허용해야 합니다. - -거의 다 됐습니다. - -위의 방법과 거의 동일한 명령어로 "trusted" zone에 `ssh` 서비스를 추가합니다. 그런 다음 "balance"라는 새로운 zone을 추가하고 `http` 및 `https`를 처리할 것입니다. 아직 재밌게 하고 있나요? - -빨리 하기 위해 단일 명령 집합에서 "trusted" 영역에 사용한 모든 명령을 사용하겠습니다. - -``` -firewall-cmd --zone=trusted --add-source=192.168.1.0/24 --permanent -firewall-cmd --zone=trusted --add-service=ssh --permanent -firewall-cmd --reload -firewall-cmd --zone=trusted --list-all -``` - -이후 "trusted" 영역은 다음과 같아야 합니다. - -```bash -trusted (active) - target: ACCEPT - icmp-block-inversion: no - interfaces: - sources: 192.168.1.0/24 - services: ssh - ports: - protocols: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - rich rules: -``` - -다시 LAN의 IP에서 `ssh` 규칙을 테스트한 다음 "public" 영역에서 `ssh`서비스를 제거합니다. **위의 경고를 기억하고 서버에 대한 로컬 액세스 권한이 있는 경우에만 이 작업을 수행하십시오!** - -``` -firewall-cmd --zone=public --remove-service=ssh --permanent -firewall-cmd --reload -firewall-cmd --zone=public --list-all -``` - -public zone은 이제 다음과 같아야 합니다. - -```bash -public - target: default - icmp-block-inversion: no - interfaces: - sources: - services: cockpit dhcpv6-client - ports: - protocols: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - rich rules: -``` - -Now let's add that new zone to deal with `http` and `https`. 이때 소스 IP는 로드 밸런서만 포함해야 합니다 (예: 192.168.1.103). - -!!! 주의 - - 새로운 zone은 반드시 `--permanent` 옵션으로 추가해야 하며, 방화벽이 다시 로드되기 전까지 사용할 수 없습니다. 또한 이 zone에 대해 `--set-target=ACCEPT` 를 사용하는 것을 잊지 마세요! - -``` -firewall-cmd --new-zone=balance --permanent -firewall-cmd --reload -firewall-cmd --zone=balance --set-target=ACCEPT -firewall-cmd --zone=balance --add-source=192.168.1.103 --permanent -firewall-cmd --zone=balance --add-service=http --add-service=https --permanent -firewall-cmd --reload -firewall-cmd --zone=balance --list-all -``` - -결과는 다음과 같아야 합니다: - -```bash -balance (active) - target: ACCEPT - icmp-block-inversion: no - interfaces: - sources: 192.168.1.103 - services: http https - ports: - protocols: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - rich rules: -``` - -다른 웹 서버 백엔드에서도 동일한 단계를 반복합니다. - -모든 서버에 방화벽 규칙을 추가한 후 워크스테이션 브라우저에서 pound 서버를 다시 테스트합니다. - -## 기타 정보 - -`pound.conf` 파일에는 에러 메시지 지시문, 로깅 옵션, 타임아웃 값 등이 포함될 수 있는 *많은* 옵션이 있습니다. 이용 가능한 자세한 정보는 [여기를 참조](https://linux.die.net/man/8/pound)하세요. - -Pound는 자동으로 "BackEnd" 서버 중 하나가 오프라인인 경우 이를 비활성화하여 웹 서비스를 지연 없이 계속 실행합니다. 다시 온라인이 되면 자동으로 인식합니다. - -## 결론 - -Pound는 HAProxy 또는 Nginx를 사용하고 싶지 않은 사용자들을 위해 로드 밸런싱으로 사용할 수 있는 다른 옵션을 제공합니다. - -Pound는 로드 밸런싱 서버로서 매우 쉽게 설치, 설정 및 사용할 수 있습니다. 여기에서 설명한 대로 Pound는 리버스 프록시로서도 사용할 수 있으며, 프록시 및 로드 밸런싱에 대한 다양한 옵션이 있습니다. - -서비스를 설정할 때 보안을 항상 염두에 두는 것이 중요합니다. 로드 밸런싱 프록시 서버를 포함하여 모든 서비스를 설정할 때도 보안에 유의해야 합니다. diff --git a/docs/guides/proxies/pound.md b/docs/guides/proxies/pound.md deleted file mode 100644 index 8164eb237a..0000000000 --- a/docs/guides/proxies/pound.md +++ /dev/null @@ -1,468 +0,0 @@ ---- -title: Pound -author: Steven Spencer -contributors: Ganna Zhyrnova -tested_with: 8.5, 8.6 -tags: - - proxy - - proxies ---- - -# Pound proxy server - -!!! warning "Pound Missing from EPEL-9" - - As of this writing, on Rocky Linux 9.0, Pound cannot be installed from the EPEL repository. While there are sources out there for SRPM packages, we can not verify the integrity of these sources. For this reason, we do not recommend installing the Pound proxy server on Rocky Linux 9.0 at this time. This may change if the EPEL once again picks up Pound. Use this procedure specifically for Rocky Linux 8.x versions. - -## Introduction - -Pound is a web server agnostic reverse proxy and load balancer that is simplistic to setup and manage. It does not use a web service, but does listens on the web service ports (http, https). - -Now, many proxy server options exist, some referenced in these documentation pages. A document on using [HAProxy is here](haproxy_apache_lxd.md) and references to applying Nginx for a reverse proxy exist in other documents. - -Load balancing services are quite useful for a busy web server environment. Many proxy servers exist, including the previously mentioned HAProxy, and have uses for many service types. - -In the case of Pound, it is only usable for web services, but it is good at what it does. - -## Prerequisites and assumptions - -The following are minimum requirements for using this procedure: - -- A desire to load balance between a few websites, or the willingness to learn a new tool to do the same. -- The ability to run commands as the root user or use `sudo` to elevate privileges. -- Familiarity with a command-line editor. The author is using `vi` or `vim` here, but substitute in your favorite editor. -- Comfort with changing the listen ports on a few types of web servers. -- Assuming the earlier installation of the Nginx and Apache servers. -- Assuming that you are using Rocky Linux servers or containers for everything here. -- While all kinds of statements regarding `https` are in this document, this guide only deals with the `http` service. To properly do `https`, you will need to configure your pound server with a real certificate from a real certificate authority. - -!!! tip - - If you do not have either of these servers installed, you can do so on a container environment (LXD or Docker) or on bare metal, and get them up and running. For this procedure, you must install them with their respective packages and enable and start the services. We will not be modifying them significantly in any way. - - ``` - dnf -y install nginx && systemctl enable --now nginx - ``` - - or - - ``` - dnf -y install httpd && systemctl enable --now httpd - ``` - -## Conventions - -For this procedure, we are going to be using two web servers (known as back end servers), one running Nginx (192.168.1.111) and one running Apache (192.168.1.108). - -Our Pound server (192.168.1.103) is the gateway. - -You will be switching your listen ports on the back end servers to 8080 for the Nginx server and 8081 for the Apache server. (Showing everything below.) - -!!! note - - Remember to change the associated IPs to whatever they are in your own environment and substitute them where applicable throughout this procedure. - -## Installing the Pound server - -To install Pound, you need to first install the EPEL (Extra Packages for Enterprise Linux) and run updates: - -```bash -dnf -y install epel-release && dnf -y update -``` - -Then install Pound. (Yes that is a capital "P"): - -```bash -dnf -y install Pound -``` - -## Configuring Pound - -With the packages installed, you need to configure Pound. The author is using `vi` to update this, but if you prefer `nano` or something else, go ahead and substitute that in: - -```bash -vi /etc/pound.cfg -``` - -The file has default information in it, which makes it easy to see most of the default components of Pound: - -```bash -User "pound" -Group "pound" -Control "/var/lib/pound/pound.cfg" - -ListenHTTP - Address 0.0.0.0 - Port 80 -End - -ListenHTTPS - Address 0.0.0.0 - Port 443 - Cert "/etc/pki/tls/certs/pound.pem" -End - -Service - BackEnd - Address 127.0.0.1 - Port 8000 - End - - BackEnd - Address 127.0.0.1 - Port 8001 - End -End -``` - -### Taking a closer look - -- The "User" and "Group" - populated with the installation -- The "Control" file is not used anywhere -- The "ListenHTTP" section represents the service `http` (Port 80) and the "Address" that the proxy will listen on. You will change this to the actual IP of our Pound server. -- The "ListenHTTPS" section represents the service `https` (Port 443) and the "Address" that the proxy will listen on. You will change this to the IP of the Pound server. -- The "Cert" option is the self-signed certificate provided by the Pound install process. You want to replace this in a production environment with a real certificate using one of these procedures: [Generating SSL Keys](../security/ssl_keys_https.md) or [SSL Keys with Let's Encrypt](../security/generating_ssl_keys_lets_encrypt.md). -- The "Service" section configures the "BackEnd" servers with their listening ports. You can have as many "BackEnd" servers as you need. - -### Changing the configuration - -- change the IP Address under each listen option to our Pound server IP, 192.168.1.103 -- change the IP Addresses and ports under the "BackEnd" sections to match our configuration found in "Conventions" above (IPs and Ports) - -When you are all done modifying the configuration, your file will look something like this: - -```bash -User "pound" -Group "pound" -Control "/var/lib/pound/pound.cfg" - -ListenHTTP - Address 192.168.1.103 - Port 80 -End - -ListenHTTPS - Address 192.168.1.103 - Port 443 - Cert "/etc/pki/tls/certs/pound.pem" -End - -Service - BackEnd - Address 192.168.1.111 - Port 8080 - End - - BackEnd - Address 192.168.1.108 - Port 8081 - End -End -``` - -## Configuring Nginx to listen on 8080 - -Since you have set the listen port for Nginx in our Pound configuration to 8080, you need to also make that change on your running Nginx server. You do this by modifying the `nginx.conf`: - -```bash -vi /etc/nginx/nginx.conf -``` - -You just want to change the "listen" line to the new port number: - -```bash -listen 8080 default_server; -``` - -Save your changes and restart the nginx service: - -```bash -systemctl restart nginx -``` - -## Configuring Apache to listen on 8081 - -Since you have set the listen port for Apache in our Pound configuration to 8081, you need to also make that change on our running Apache server. You do this by modifying the `httpd.conf`: - -```bash -vi /etc/httpd/conf/httpd.conf -``` - -You want to change the "Listen" line to the new port number: - -```bash -Listen 8081 -``` - -Save your changes and restart the httpd service: - -```bash -systemctl restart httpd -``` - -## Test and turn up - -Once you have your web services up and running and listening on the right ports on each of your servers, the next step is to turn up the pound service on the Pound server: - -```bash -systemctl enable --now pound -``` - -!!! warning - - Using Nginx and Apache, as done here for demonstration, will mean that the Nginx server will almost always respond first. For this reason, to test effectively, you will need to assign a low priority to the Nginx server so that you will be able to see both screens. This speaks volumes about the speed of Nginx over Apache. To change the priority for the Nginx server, you just need to add a priority (1-9, with 9 being the lowest priority) in the "BackEnd" section for the Nginx server like this: - - ``` - BackEnd - Address 192.168.1.111 - Port 8080 - Priority 9 - End - ``` - -When you open your proxy server IP in a web browser you will see one of these two screens: - -![Pound Nginx](images/pound_nginx.jpg) - -Or - -![Pound Apache](images/pound_apache.jpg) - -## Using "Emergency" - -One thing that you may need to do when using a load balancer such as Pound, is to take the productions servers off-line for maintenance or to have a fall-back "BackEnd" for a complete outage. Do this with the "Emergency" declaration in the `pound.conf` file. You can only have one "Emergency" declaration per service. In our case, this will appear at the end of the "Service" section in our configuration file: - -```bash -... -Service - BackEnd - Address 192.168.1.117 - Port 8080 - Priority 9 - End - - BackEnd - Address 192.168.1.108 - Port 8081 - End - Emergency - Address 192.168.1.104 - Port 8000 - End -End -``` - -This server might only show a message that says, "Down For Maintenance". - -## Security considerations - -Something that most documents dealing with load balancing proxy servers will not deal with are security issues. For instance, if this is a public facing web server, you will need to have `http` and `https` services open to the world on the load balancing proxy. But what about the "BackEnd" servers? - -Those only need accessing by their ports from the Pound server, but since the Pound server is redirecting to 8080 or 8081 on the BackEnd servers, and since the BackEnd servers have `http` listening on those subsequent ports, you can just use the service names for the firewall commands on those BackEnd servers. - -This section will deal with those concerns and the `firewalld` commands needed to lock everything down. - -!!! warning - - The assumption here is that you have direct access to the servers in question and are not remote to them. If you are remote, take extreme caution when removing services from a `firewalld` zone! - - You could lock yourself out of your server by accident. - -### Firewall - Pound server - -For the Pound server, you want to allow `http` and `https` from the world. It is best to consider whether you need to allow `ssh` from the world or not. If you are local to the server, this is probably **NOT** the case. The author assumes here that the server is available via your local network and that you have direct access to it, so you will be locking down `ssh` to your LAN IPs. - -To accomplish this, you will use the built-in firewall for Rocky Linux, `firewalld` and the `firewall-cmd` command structure. You will also use two built-in zones, "public" and "trusted", to keep things uncomplicated. - -Start by adding our source IPs to the "trusted" zone. This is our LAN here (in our example: 192.168.1.0/24): - -```bash -firewall-cmd --zone=trusted --add-source=192.168.1.0/24 --permanent -``` - -Then, add the `ssh` service to the zone: - -```bash -firewall-cmd --zone=trusted --add-service=ssh --permanent -``` - -And reload the firewall with: - -```bash -firewall-cmd --reload -``` - -List out the zone so that you can see everything with `firewall-cmd --zone=trusted --list-all` which will give you something like this: - -```bash -trusted (active) - target: ACCEPT - icmp-block-inversion: no - interfaces: - sources: 192.168.1.0/24 - services: ssh - ports: - protocols: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - rich rules: - -``` - -Next you need to make changes to the "public" zone, which by default has the `ssh` service enabled. This needs to be carefully removed (again, the author assumes that you are **NOT** remote to the server here!) with the following: - -```bash -firewall-cmd --zone=public --remove-service=ssh --permanent -``` - -You also need to add `http` and `https` services: - -```bash -firewall-cmd --zone=public --add-service=http --add-service=https --permanent -``` - -Then reload the firewall before to see the changes: - -```bash -firewall-cmd --reload -``` - -List out the public zone with `firewall-cmd --zone=public --list-all` which will show you something like this: - -```bash -public - target: default - icmp-block-inversion: no - interfaces: - sources: - services: cockpit dhcpv6-client http https - ports: - protocols: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - rich rules: -``` - -Those are the only changes needed to our pound server load balancer within the lab environment. - -### Firewall - back end servers - -For the "BackEnd" servers, you do not need to allow access from the world for anything. You will need to allow `ssh` from the LAN IPs, and `http` and `https` from our Pound load balancer. - -That is pretty much it. - -Again, you are going to add the `ssh` service to your "trusted" zone, with the essentially the same commands used for your pound server. Then add a zone called "balance" that you will use for the remaining `http` and `https`, and set the source IPs to that of the load balancer. - -To simplify things, use all of those commands that you used for the "trusted" zone in a single set of commands: - -```bash -firewall-cmd --zone=trusted --add-source=192.168.1.0/24 --permanent -firewall-cmd --zone=trusted --add-service=ssh --permanent -firewall-cmd --reload -firewall-cmd --zone=trusted --list-all -``` - -After, the "trusted" zone will look like this: - -```bash -trusted (active) - target: ACCEPT - icmp-block-inversion: no - interfaces: - sources: 192.168.1.0/24 - services: ssh - ports: - protocols: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - rich rules: -``` - -Again, test your `ssh` rule from an IP on the LAN, and then remove the `ssh` service from the "public" zone. **Remember our warning earlier, and do this only if you have local access to the server!** - -```bash -firewall-cmd --zone=public --remove-service=ssh --permanent -firewall-cmd --reload -firewall-cmd --zone=public --list-all -``` - -The public zone will now look like this: - -```bash -public - target: default - icmp-block-inversion: no - interfaces: - sources: - services: cockpit dhcpv6-client - ports: - protocols: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - rich rules: -``` - -Add that new zone to deal with `http` and `https`. Remember that the source IP here needs to only be your load balancer (in our example: 192.168.1.103): - -!!! note - - A new zone must be added with the `--permanent` option and cannot be used until the firewall is reloaded. Also, do not forget to `--set-target=ACCEPT` for this zone! - -```bash -firewall-cmd --new-zone=balance --permanent -firewall-cmd --reload -firewall-cmd --zone=balance --set-target=ACCEPT -firewall-cmd --zone=balance --add-source=192.168.1.103 --permanent -firewall-cmd --zone=balance --add-service=http --add-service=https --permanent -firewall-cmd --reload -firewall-cmd --zone=balance --list-all -``` - -The result: - -```bash -balance (active) - target: ACCEPT - icmp-block-inversion: no - interfaces: - sources: 192.168.1.103 - services: http https - ports: - protocols: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - rich rules: -``` - -Repeat those steps on the other web server back end. - -Once you have your firewall rules added to everything, test your Pound server again from your workstation browser. - -## Other information - -*Many* options are usable in your `pound.conf` file, including error message directives, logging options, time out values, and more. You can find what is available by [looking here.](https://linux.die.net/man/8/pound) - -Conveniently, Pound automatically figures out if one of the "BackEnd" servers is off-line and disables it so that web services can continue without delay. It also automatically sees them again when they are back on-line. - -## Conclusion - -Pound offers another option for those who do not want to use HAProxy or Nginx as for load balancing. - -Pound as a load balancing server is very easy to install, set up and use. As noted here, you can use Pound as a reverse proxy, and many proxy and load balancing options exist. - -And you should always remember to keep security in mind when setting up any service, including a load balancing proxy server. diff --git a/docs/guides/proxies/pound.pl.md b/docs/guides/proxies/pound.pl.md deleted file mode 100644 index ecb3a09404..0000000000 --- a/docs/guides/proxies/pound.pl.md +++ /dev/null @@ -1,467 +0,0 @@ ---- -title: Funt -author: Steven Spencer, markooff -contributors: -tested with: 8.5, 8.6 -tags: - - proxy - - proxy ---- - -# Serwer proxy funtów - -!!! ważny "Funt brakujący w EPEL-9" - - Od tego pisania, Rocky Linux 9.0 nie może być zainstalowany z repozytorium EPEL. Chociaż istnieją źródła dla pakietów SRPM, nie możemy zweryfikować integralności tych źródeł. Z tego powodu nie zalecamy instalacji serwera proxy Pound na Rocky Linux 9.0 w tym momencie. Może to ulec zmianie, jeśli EPEL ponownie zabierze funt. Należy użyć tej procedury specjalnie dla Rocky Linux 8.5 lub 8.6. - -## Wstęp - -Funt jest serwerem sieciowym agnostycznym odwróconym proxy i ładuje balancer, który jest bardzo łatwy w konfiguracji i zarządzaniu. Nie korzysta z samej usługi internetowej, ale słucha w portach serwisów internetowych (http, http). - -Teraz jest wiele opcji serwera proxy, niektóre z nich odnoszą się do tych stron dokumentacji. Istnieje dokument dotyczący użycia [HAProxy tutaj](haproxy_apache_lxd.md) i w innych dokumentach pojawiły się odniesienia do używania Nginx dla odwrotnego proxy. - -Usługi równoważenia obciążenia są całkiem użyteczne dla zajętego środowiska serwera internetowego. Wiele serwerów proxy, w tym wspomniany wcześniej HAProxy, może być używanych dla wielu typów usług. - -W przypadku funtu można go użyć tylko do usług sieciowych, ale jest to dobre w tym, co robi. - -## Wymagania i założenia - -Do stosowania tej procedury stosuje się następujące minimalne wymogi: - -* Pragnienie wczytywania równowagi pomiędzy kilkoma stronami internetowymi lub chęć poznania nowego narzędzia robią to samo. -* Możliwość wykonywania poleceń jako główny użytkownik lub użycie `sudo` , aby tam dotrzeć. -* Znajomość edytora wiersza poleceń. Używamy tutaj `vi` lub `vim` , ale możesz zastąpić go w twoim ulubionym edytorze. -* Komfort ze zmianą portów nasłuchiwanych na kilku typach serwerów internetowych. -* Zakładamy, że zarówno serwery Nginx, jak i Apache są już zainstalowane. -* Zakładamy, że używasz serwerów Rocky Linux lub kontenerów dla wszystkich tutaj. -* Podczas gdy tworzymy wszystkie rodzaje instrukcji dotyczących `https` poniżej, ten przewodnik dotyczy tylko usługi `http`. Aby poprawnie wykonać `https`, musisz skonfigurować swój serwer funtowy z prawdziwym certyfikatem autoryzacji certyfikatów. - -!!! Wskazówka - - Jeśli nie masz zainstalowanego żadnego z tych serwerów, możesz to zrobić w środowisku kontenerowskim (LXD lub Docker) lub na nagim metalu, i wciągnąć je i uruchomić. Do celów tej procedury wystarczy zainstalować je wraz z odpowiednimi pakietami oraz włączyć i uruchomić usługi. Nie będziemy w żaden sposób modyfikować ich w znaczący sposób. - - ``` - dnf -y install nginx && system włącz --now nginx - ``` - - - lub - - ``` - dnf -y install httpd && system włącz --now httpd - ``` - -## Konwencje - -Do tej procedury będziemy używać dwóch serwerów internetowych (znanych jako serwery back-end), z których jeden uruchamia Nginx (192. 68.1.111) i jeden biegły Apache (192.168.1.108). - -Nasz serwer funtów (192.168.1.103) będzie uważany za bramę. - -We will be switching our listen ports on both of the back end servers to 8080 for the Nginx server and 8081 for the Apache server. Wszystko zostanie szczegółowo omówione poniżej, więc na chwilę obecną nie trzeba się o nie martwić. - -!!! notatka - - Pamiętaj, aby zmienić powiązane IP na wszystkie istniejące w Państwa otoczeniu i w stosownych przypadkach zastąpić je w trakcie tej procedury. - -## Instalacja serwera funtów - -Aby zainstalować Funt, musimy najpierw zainstalować EPEL (Extra Packages for Enterprise Linux) i uruchomić aktualizacje na wypadek pojawienia się czegoś nowego z EPEL: - -``` -dnf -y install epel-release && dnf -y aktualizacja -``` - -Następnie po prostu zainstaluj Funt. (Tak, to jest kapitał "P"): - -``` -dnf -y instalacja funta -``` - -## Konfigurowanie funta - -Teraz, gdy pakiety są zainstalowane, musimy skonfigurować Funt. Będziemy używać `vi` aby to zaktualizować, ale jeśli wolisz `nano` lub coś innego, idź dalej i zastąp to w: - -```bash -vi /etc/funt.cfg -``` - -Plik jest skonfigurowany z domyślnymi informacjami, co sprawia, że łatwiej jest zobaczyć większość domyślnych składników Funtu: - -```bash -Użytkownik "funt" -Grupa "funt" -Kontrola "/var/lib/pound/pound.cfg" - -ListenHTTP - Adres 0.0.0. - Port 80 -End - -ListenHTTPS - Adres 0. .0.0 - Port 443 - Cert "/etc/pki/tls/certs/funt. em" -End - -Service - BackEnd - Adres 127.0.0. - Port 8000 - Koniec - - BackEnd - Adres 127. .0.1 - Port 8001 - Koniec -Koniec -``` - -### Zdobycie ściślejszego wyglądu - -* "Użytkownik" i "Grupa" zostały zachowane podczas instalacji -* Plik "Kontrola" nie wydaje się nigdzie używany. -* Sekcja "ListenHTTP" reprezentuje usługę `http` (Port 80) i "Adres", na której serwer proxy będzie słuchał. Zmienimy to na rzeczywisty adres IP naszego serwera funtów. -* Sekcja "ListenHTTPS" reprezentuje usługę `https` (Port 443) i "Adres", na której serwer proxy będzie słuchał. Tak jak w przypadku powyższego, zmienimy to na adres IP serwera funtów. Opcją "Certyfikat" jest samopodpisany certyfikat dostarczony przez proces instalacji funtów. Chcesz zastąpić to w środowisku produkcyjnym prawdziwym certyfikatem za pomocą jednej z następujących procedur: [Generowanie kluczy SSL](../security/ssl_keys_https.md) lub [kluczy SSL za pomocą Let's Encrypt](../security/generating_ssl_keys_lets_encrypt.md). -* Sekcja "Usługa" to miejsce, w którym serwery "BackEnd" są skonfigurowane wraz z portami nasłuchiwania. Możesz mieć tyle serwerów "BackEnd" ile potrzebujesz. - -### Zmiana konfiguracji - -* zmień adres IP w obu opcjach nasłuchiwania na adres IP naszego serwera funtów, 192.168.1.103 -* zmień adresy IP i porty w sekcji "BackEnd" w celu dopasowania naszej konfiguracji znajdującej się w "Konwencjach" powyżej (IPs i ports) - -Gdy wszystko skończysz modyfikować konfigurację, powinieneś mieć zmieniony plik, który wygląda tak: - -```bash -Użytkownik "funt" -Grupa "funt" -Kontrola "/var/lib/pound/pound.cfg" - -ListenHTTP - Adres 192.168.1. 03 - Port 80 -End - -ListenHTTPS - Adres 192. 68.1.103 - Port 443 - Cert "/etc/pki/tls/certs/funt. em" -End - -Service - BackEnd - Adres 192.168.1. 11 - Port 8080 - End - - BackEnd - Adres 192. 68.1.108 - Port 8081 - End -End -``` - -## Konfigurowanie Nginx do słuchania na 8080 - -Ponieważ ustawiliśmy port nasłuchiwania Nginx w naszej konfiguracji funta na 8080, musimy również wprowadzić tę zmianę na naszym uruchomionym serwerze Nginx. Robimy to modyfikując `nginx.conf`: - -```bash -vi /etc/nginx/nginx.conf -``` - -Po prostu chcesz zmienić linię "nasłuchuj" na nowy numer portu: - -```bash -nasłuchuj 8080 default_server; -``` - -Zapisz zmiany, a następnie uruchom ponownie usługę nginx: - -``` -systemowy restart nginx -``` - -## Konfigurowanie Apache do nasłuchiwania na 8081 - -Ponieważ ustawiliśmy port nasłuchiwania Apache w naszej konfiguracji do 8081, musimy również wprowadzić tę zmianę na naszym uruchomionym serwerze Apache. Zrobimy to, modyfikując `httpd.conf`: - -```bash -vi /etc/httpd/conf/httpd.conf -``` - -Chcesz zmienić linię "Słuchaj" na nowy numer portu: - -```bash -Słuchaj 8081 -``` - -Zapisz zmiany i uruchom ponownie usługę httpd: - -``` -uruchom ponownie system httpd -``` - -## Testuj i wyłącz - -Gdy masz swoje usługi internetowe, działasz i słuchaj właściwych portów na każdym z naszych serwerów, następnym krokiem jest uruchomienie usługi funta na serwerze funta: - -``` -Systemctl enable --now funt -``` - -!!! uwaga - - Używanie Nginx i Apache, tak jak robimy tutaj w celu demonstracji, będzie oznaczać, że serwer Nginx prawie zawsze będzie odpowiadał najpierw. Z tego względu należy skutecznie przetestować, musisz przypisać niski priorytet do serwera Nginx, abyś mógł zobaczyć oba ekrany. To mówi o szybkości Nginx nad Apache. Aby zmienić priorytet serwera Nginx, wystarczy dodać priorytet (1-9, z 9 najniższym priorytetem) w sekcji "BackEnd" dla serwera Nginx jak ten: - - ``` - BackEnd - Adres 192.168.1.111 - Port 8080 - Priorytet 9 - koniec - ``` - -Kiedy otworzysz IP serwera proxy w przeglądarce internetowej, powinieneś się zmierzyć z jednym z tych dwóch ekranów: - -![Funt Nginx](images/pound_nginx.jpg) - -Lub - -![Aache funtów](images/pound_apache.jpg) - -## Używanie alarmu - -Jedno co trzeba zrobić podczas używania balansu obciążenia, takie jak funt, ma odbierać serwery produkcji w trybie offline w celu konserwacji lub mieć zapasowy "BackEnd" dla całkowitego przerwania. Wykonuje się to z deklaracją "Emergency" w pliku `pound.conf`. Możesz mieć tylko jedną deklarację "Emergency" na jedną usługę. W naszym przypadku pojawiłoby się to na końcu sekcji "Usługi" w naszym pliku konfiguracyjnym: - -``` -... -Usługa - BackEnd - Adres 192.168.1. 17 - Port 8080 - Priorytet 9 - Koniec - - BackEnd - Adres 192. 68.1.108 - Port 8081 - Koniec - Awaria - Adres 192. 68.1.104 - Port 8000 - Koniec -Koniec -``` - -Ten serwer może wyświetlać tylko wiadomość, która mówi, "Down For Maintenance". - -## Kwestie bezpieczeństwa - -Problemy bezpieczeństwa nie będą rozwiązywać większości dokumentów dotyczących równoważenia obciążenia serwerów proxy. Na przykład, jeśli jest to publiczny serwer internetowy, musisz mieć otwarte usługi `http` i `https` na świecie na serwerze proxy równoważenia obciążenia. Ale co z serwerami „BackEnd”? - -Dostęp do nich powinien być zapewniony wyłącznie przez ich porty z samego serwera funtów, ale ponieważ serwer Pound przekierowuje do 8080 lub 8081 na serwerach BackEnd, i ponieważ serwery BackEnd mają `http` słuchając tych kolejnych portów, możesz po prostu użyć nazw usług dla poleceń zapory na tych serwerach BackEnd. - -W tej sekcji zajmiemy się tymi obawami i poleceniami `firewalld` potrzebnymi do zablokowania wszystkiego. - -!!! ostrzeżenie - - Zakładamy, że masz bezpośredni dostęp do danych serwerów i nie jesteś do nich zdalny. Jeśli jesteś zdalny, zachowaj szczególną ostrożność podczas usuwania usług ze strefy `firewalld`! - - Możesz zablokować się z serwera przez przypadek. - -### Zapora - Serwer Funtów - -Dla serwera funtów, jak zauważono powyżej, chcemy zezwolić na `http` i `https` ze świata. Musisz się zastanowić, czy `ssh` musi być dozwolony ze świata, czy nie. Jeśli jesteś lokalny na serwerze, to prawdopodobnie **NIE** przypadek. Zakładamy, że serwer jest dostępny przez Twoją sieć lokalną i że masz bezpośredni dostęp do niej, więc zamkniemy `ssh` na nasze adresy IP LAN. - -Aby osiągnąć powyższe, użyjemy wbudowanej zapory dla Rocky Linux, `firewalld` i `firewall-cmd` struktury poleceń. Dla uproszczenia wykorzystamy również dwie strefy zabudowane – „publiczne” i „zaufane”. - -Zacznijmy od dodania naszych źródłowych adresów IP do strefy „zaufanej”. Jest to nasz łańcuch wartości (przykład: 192.168.1.0/24): - -``` -firewall-cmd --zone=zaufane --add-source=192.168.1.0/24 --permanent -``` - -Następnie dodajmy usługę `ssh` do strefy: - -``` -zapora-cmd --zone=zaufane --add-service=ssh --permanent -``` - -Po zakończeniu tego wszystkiego odświeżyć zaporę poprzez: - -``` -firewall-cmd --reload -``` - -A następnie wylistuj strefę tak, aby zobaczyć wszystko z `zaporą cmd --zone=trusted --list-all` , co powinno dać Ci coś takiego: - -```bash -zaufany (aktywny) cel - ACCEPT - icmp-block-inversion: no - interfejsy: - źródła: 192.168.1. /24 - usługi: ssh - porty: - protokołów: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - bogate reguły: - -``` - -Następnie musimy wprowadzić zmiany w strefie "publicznych", która domyślnie ma włączoną usługę `ssh`. To musi zostać ostrożnie usunięte (ponownie, zakładamy, że jesteś **NIE** zdalny na serwer tutaj!) z następującymi powodami: - -``` -zapora-cmd --zone=publiczna --remove-service=ssh --permanent -``` -Musimy również dodać usługi `http` i `https`: - -``` -zapora-cmd --zone=publiczna --add-service=http --add-service=https --permanent -``` - -Następnie musimy przeładować zaporę zanim zobaczysz zmiany: - -``` -firewall-cmd --reload -``` - -A następnie wylistuj strefę publiczną z `firewall-cmd --zone=public --list-all` , która powinna pokazać Ci coś takiego: - -```bash -cel publiczny - : domyślny - icmp-block-inversion: no - interfejsów: - źródła: - usługi: cockpit dhcpv6-client http - ports: - protokoły: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - bogate reguły: -``` - -W naszym środowisku laboratorium są to jedyne zmiany, które musimy wprowadzić w naszym funcie równowagi obciążenia serwera. - -### Zapora - Serwery z tyłu - -Dla serwerów "BackEnd", nie musimy zezwalać na dostęp ze świata dla wszystkich, a na pewno nie dla naszych nasłuchanych portów, z których będzie korzystał bilans ładunku. Będziemy musieli zezwolić na `ssh` z adresów IP LAN oraz `http` i `https` z naszego balancera obciążenia funtów. - -To całkiem to wszystko. - -Ponownie dodamy usługę `ssh` do naszej strefy "zaufane", z zasadniczo tymi samymi poleceniami, które użyliśmy dla naszego serwera funtów. Następnie dodamy strefę o nazwie "saldo", którą będziemy używać dla pozostałych `http` i `https`, i ustaw źródłowe adresy IP na adresy docelowe balancera. Jesteś już zabawny? - -Aby być szybkim, użyjmy wszystkich tych poleceń, które użyliśmy w strefie "zaufane" w jednym zestawie poleceń: - -``` -zapora-cmd --zone=zaufana --add-source=192.168.1.0/24 --permanent -zapora zapora-cmd --zone=zaufana --add-service=ssh --permanent -zapora cmd --reload -zapora-cmd --zone=zaufana --list-all -``` - -Następnie strefa „zaufana” powinna wyglądać tak: - -```bash -zaufany (aktywny) cel - ACCEPT - icmp-block-inversion: no - interfejsy: - źródła: 192.168.1. /24 - usługi: ssh - porty: - protokołów: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - bogate reguły: -``` - -Ponownie, przetestuj regułę `ssh` z adresu IP w LAN, a następnie usuń usługę `ssh` ze strefy "publiczną". **Zapamiętaj nasze ostrzeżenie z góry i zrób to tylko wtedy, gdy masz lokalny dostęp do serwera!** - -``` -zapora cmd --zone=publiczna --remove-service=ssh --permanent -zapora cmd --reload -zapora cmd --zone=publiczna --list-all -``` - -Strefa publiczna powinna teraz wyglądać tak: - -```bash -cel publiczny - : domyślny - icmp-block-inversion: no - interfejsów: - źródła: - usługi: cockpit dhcpv6-client - porty: - protokoły: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - bogatych reguł: -``` - -Now let's add that new zone to deal with `http` and `https`. Pamiętaj, że tutaj źródłowy IP musi być tylko naszym bilansem obciążenia (w naszym przykładzie: 192.168.1.103): - -!!! notatka - - Nowa strefa musi być dodana z opcją `--permanent` i nie może być używana, dopóki zapora nie zostanie ponownie załadowana. Nie zapomnij również o `--set-target=ACCEPT` dla tej strefy! - -``` -firewall-cmd --new-zone=balance --permanent -firewall-cmd --reload -firewall-cmd --zone=balance --set-target=ACCEPT -firewall-cmd --zone=balance --add-source=192. 68.1.103 --permanent -zapora zapora-cmd --zone=balance --add-service=http --add-service=https --permanent -zapora-cmd --reload -zapora-cmd --zone=balance --list-all -``` - -Wynik: - -```bash -saldo (aktywne) - cel: ACCEPT - icmp-block-inversion: no - interfejsów: - źródła: 192.168.1. Usługi 03 - : http https - porty: - protokołów: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - bogate reguły: -``` - -Teraz powtórz te kroki na drugim serwerze WWW. - -Po dodaniu reguł zapory do wszystkiego, przetestuj serwer funtów ponownie z przeglądarki stacji roboczej. - -## Inne informacje - -Istnieje *LOT* opcji, które mogą być zawarte w Twoim `funcie. onf` plik, w tym dyrektywy w sprawie komunikatów o błędach, opcje logowania, wartości czasu i czasu itp. Więcej informacji na temat tego, co jest dostępne [można znaleźć tutaj.](https://linux.die.net/man/8/pound) - -Wygodnie, funt automatycznie zapisuje, jeśli jeden z serwerów "BackEnd" jest wyłączony i wyłącza go, aby usługi sieciowe mogły być kontynuowane bezzwłocznie. Automatycznie widzi je również ponownie, gdy są one z powrotem w internecie. - -## Konkluzja - -Funt oferuje inną opcję dla tych, którzy nie chcą używać HAProxy lub Nginx jako ładowania. - -Funt jako serwer równoważenia obciążenia jest bardzo łatwy w instalacji, konfiguracji i użytkowaniu. Jak zauważono tutaj, Funt może być również używany jako zastępczy wskaźnik zastępczy i jest wiele dostępnych opcji bilansowania obciążenia. - -I zawsze powinieneś pamiętać o bezpieczeństwie podczas ustawiania dowolnej usługi, w tym serwera proxy równoważącego ładunek. diff --git a/docs/guides/proxies/pound.uk.md b/docs/guides/proxies/pound.uk.md deleted file mode 100644 index a31febdeaa..0000000000 --- a/docs/guides/proxies/pound.uk.md +++ /dev/null @@ -1,469 +0,0 @@ ---- -title: Pound -author: Steven Spencer -contributors: Ganna Zhyrnova -tested_with: 8.5, 8.6 -tags: - - proxy - - proxies ---- - -# Проксі-сервер Pound - -!!! warning "Pound відсутній в EPEL-9" - - На момент написання цієї статті на Rocky Linux 9.0 Pound неможливо встановити зі сховища EPEL. Хоча існують джерела пакетів SRPM, ми не можемо перевірити цілісність цих джерел. З цієї причини ми не рекомендуємо зараз встановлювати проксі-сервер Pound на Rocky Linux 9.0. Це може змінитися, якщо EPEL знову підніме Pound. Використовуйте цю процедуру спеціально для версій Rocky Linux 8.x. - -## Вступ - -Pound — це незалежний від веб-сервера зворотний проксі та балансувальник навантаження, який дуже простий у налаштуванні та керуванні. Він не використовує веб-службу, але прослуховує порти веб-служби (http, https). - -Тепер існує багато параметрів проксі-сервера, деякі з яких згадуються на цих сторінках документації. Існує документ про використання [HAProxy тут](haproxy_apache_lxd.md), а в інших документах є посилання на використання Nginx для зворотного проксі. - -Сервіси балансування навантаження дуже корисні для завантаженого середовища веб-сервера. Існує багато проксі-серверів, у тому числі згаданий раніше HAProxy, які використовують для багатьох типів послуг. - -У випадку Pound його можна використовувати лише для веб-сервісів, але він хороший у тому, що він робить. - -## Передумови та припущення - -Нижче наведено мінімальні вимоги для використання цієї процедури: - -- Бажання збалансувати навантаження між кількома веб-сайтами або готовність вивчити новий інструмент, щоб робити те саме. -- Можливість запускати команди від імені користувача root або використовувати `sudo` для підвищення привілеїв. -- Знайомство з редактором командного рядка. Автор використовує тут `vi` або `vim`, але замініть у вашому улюбленому редакторі. -- Комфорт зі зміною портів прослуховування на кількох типах веб-серверів. -- Я припускаю попередню інсталяцію серверів Nginx і Apache. -- Я припускаю, що ви використовуєте сервери або контейнери Rocky Linux для всього тут. -- Хоча в цьому документі є всілякі твердження щодо `https`, цей посібник стосується лише служби `http`. Щоб правильно виконувати `https`, ви повинні налаштувати ваш pound-сервер за допомогою справжнього сертифіката від справжнього центру сертифікації. - -!!! tip "Підказка" - - Якщо у вас не встановлено жоден із цих серверів, ви можете зробити це в контейнерному середовищі (LXD або Docker) або на голому металі та запустити їх у роботу. Для цієї процедури ви повинні встановити їх разом із відповідними пакетами, увімкнути та запустити служби. Ми не будемо жодним чином їх суттєво змінювати. - - ``` - dnf -y install nginx && systemctl enable --now nginx - ``` - - - або - - ``` - dnf -y install httpd && systemctl enable --now httpd - ``` - -## Умовності - -Для цієї процедури ми будемо використовувати два веб-сервери (відомі як внутрішні сервери), на одному з яких працює Nginx (192.168.1.111), а на другому — Apache (192.168.1.108). - -Наш сервер Pound (192.168.1.103) є шлюзом. - -Ви перемкнете свої порти прослуховування на внутрішніх серверах на 8080 для сервера Nginx і 8081 для сервера Apache. (Все буде відображено нижче.) - -!!! note "Примітка" - - Не забудьте змінити пов’язані IP-адреси на будь-які, які вони є у вашому середовищі, і замінити їх там, де це можливо, протягом цієї процедури. - -## Встановлення сервера Pound - -Щоб інсталювати Pound, вам потрібно спочатку встановити EPEL (додаткові пакети для Enterprise Linux) і запустити оновлення: - -```bash -dnf -y install epel-release && dnf -y update -``` - -Потім встановіть Pound. (Так, це велика "P"): - -```bash -dnf -y install Pound -``` - -## Налаштування Pound - -Тепер, коли пакунки встановлено, нам потрібно налаштувати Pound. Автор використовує `vi`, щоб оновити це, але якщо ви віддаєте перевагу `nano` або щось інше, замініть це в: - -```bash -vi /etc/pound.cfg -``` - -Файл містить інформацію за замовчуванням, що дозволяє легко побачити більшість стандартних компонентів Pound: - -```bash -User "pound" -Group "pound" -Control "/var/lib/pound/pound.cfg" - -ListenHTTP - Address 0.0.0.0 - Port 80 -End - -ListenHTTPS - Address 0.0.0.0 - Port 443 - Cert "/etc/pki/tls/certs/pound.pem" -End - -Service - BackEnd - Address 127.0.0.1 - Port 8000 - End - - BackEnd - Address 127.0.0.1 - Port 8001 - End -End -``` - -### Придивляючись ближче - -- «User» і «Group» - заповнюються під час інсталяції -- Файл "Control" ніде не використовується. -- Розділ «ListenHTTP» представляє службу `http` (порт 80) і «Address», який проксі-сервер слухатиме. Вам необхідно змінити це на фактичну IP-адресу нашого сервера Pound. -- Розділ «ListenHTTPS» представляє службу `https` (порт 443) і «Address», який проксі-сервер слухатиме. Необхідно змінити це на IP-адресу сервера Pound. -- Опція «Cert» — це самопідписаний сертифікат, наданий процесом встановлення Pound. Ви хочете замінити це у робочому середовищі справжнім сертифікатом за допомогою однієї з цих процедур: [Генерація ключів SSL](../security/ssl_keys_https.md) або [ключі SSL із Let's Encrypt](../security/generating_ssl_keys_lets_encrypt.md). -- Розділ «Service» налаштовує «BackEnd» сервери з їх портами прослуховування. Ви можете мати скільки завгодно "BackEnd" серверів. - -### Зміна конфігурації - -- змініть IP-адресу під кожною опцією прослуховування на IP-адресу нашого сервера Pound, 192.168.1.103 -- змініть IP-адреси та порти в розділах «BackEnd» відповідно до нашої конфігурації, знайденої в «Умовних поняттях» вище (IP-адреси та порти) - -Коли ви закінчите змінювати конфігурацію, ви повинні мати змінений файл, який виглядає приблизно так: - -```bash -User "pound" -Group "pound" -Control "/var/lib/pound/pound.cfg" - -ListenHTTP - Address 192.168.1.103 - Port 80 -End - -ListenHTTPS - Address 192.168.1.103 - Port 443 - Cert "/etc/pki/tls/certs/pound.pem" -End - -Service - BackEnd - Address 192.168.1.111 - Port 8080 - End - - BackEnd - Address 192.168.1.108 - Port 8081 - End -End -``` - -## Налаштування Nginx для прослуховування на 8080 - -Оскільки ви встановили порт прослуховування для Nginx у нашій конфігурації Pound на 8080, вам також потрібно внести цю зміну на запущеному сервері Nginx. Це можна зробити, змінивши `nginx.conf`: - -```bash -vi /etc/nginx/nginx.conf -``` - -Ви просто хочете змінити рядок «listen» на новий номер порту: - -```bash -listen 8080 default_server; -``` - -Збережіть зміни та перезапустіть службу nginx: - -```bash -systemctl restart nginx -``` - -## Налаштування Apache для прослуховування 8081 - -Оскільки ми встановили порт прослуховування для Apache у нашій конфігурації Pound на 8081, нам також потрібно зробити цю зміну на нашому запущеному сервері Apache. Для цього необхідно змінити `httpd.conf`: - -```bash -vi /etc/httpd/conf/httpd.conf -``` - -Ви хочете змінити рядок «Listen» на новий номер порту: - -```bash -Listen 8081 -``` - -Збережіть зміни та перезапустіть службу httpd: - -```bash -systemctl restart httpd -``` - -## Перевірка та запуск - -Після того, як ваші веб-служби запущені та прослуховують правильні порти на кожному з наших серверів, наступним кроком буде ввімкнення служби pound на сервері Pound: - -```bash -systemctl enable --now pound -``` - -!!! warning "Важливо" - - Використання Nginx і Apache, як ми робимо тут для демонстрації, означатиме, що сервер Nginx майже завжди відповідатиме першим. З цієї причини для ефективного тестування вам потрібно буде призначити низький пріоритет серверу Nginx, щоб ви могли бачити обидва екрани. Це багато говорить про швидкість Nginx над Apache. Щоб змінити пріоритет для сервера Nginx, вам просто потрібно додати пріоритет (1-9, де 9 є найнижчим пріоритетом) у розділі «BackEnd» для сервера Nginx таким чином: - - ``` - BackEnd - Address 192.168.1.111 - Port 8080 - Priority 9 - End - ``` - -Коли ви відкриваєте IP проксі-сервера у веб-браузері, ви побачите один із цих двох екранів: - -![Pound Nginx](images/pound_nginx.jpg) - -Або - -![Pound Apache](images/pound_apache.jpg) - -## Використання "Emergency" - -Єдине, що вам може знадобитися під час використання балансувальника навантаження, такого як Pound, це відключити виробничі сервери для обслуговування або мати запасний «BackEnd» для повного збою. Це робиться за допомогою оголошення "Emergency" у файлі `pound.conf`. На одну послугу можна мати лише одну «Надзвичайну» декларацію. У нашому випадку це з’явиться в кінці розділу «Service» у файлі конфігурації: - -```bash -... -Service - BackEnd - Address 192.168.1.117 - Port 8080 - Priority 9 - End - - BackEnd - Address 192.168.1.108 - Port 8081 - End - Emergency - Address 192.168.1.104 - Port 8000 - End -End -``` - -Цей сервер може відображати лише повідомлення "Down For Maintenance". - -## Міркування безпеки - -Більшість документів, що стосуються проксі-серверів балансування навантаження, не розглядають питання безпеки. Наприклад, якщо це загальнодоступний веб-сервер, вам потрібно буде мати служби `http` і `https`, відкриті для світу на проксі-сервері балансування навантаження. Але як щодо «BackEnd» серверів? - -Їм потрібен лише доступ через їхні порти з сервера Pound, але оскільки сервер Pound переспрямовує на 8080 або 8081 на серверах BackEnd, і оскільки сервери BackEnd мають `http` прослуховування цих наступних портів, ви можете використовувати назви служб для команд брандмауера на цих серверах BackEnd. - -У цьому розділі буде розглянуто ці проблеми та команди `firewalld`, необхідні для блокування всього. - -!!! warning "Важливо" - - Припускається, що ви маєте прямий доступ до відповідних серверів і не є віддаленим. Якщо ви віддалені, будьте вкрай обережні, видаляючи служби із зони `firewalld`! - - Ви можете випадково заблокувати себе на своєму сервері. - -### Брандмауер - сервер Pound - -Для сервера Pound, як зазначено вище, ми хочемо дозволити `http` і `https` зі світу. Було б найкраще розглянути, чи потрібно дозволити `ssh` зі світу. Якщо ви локально на сервері, це, мабуть, **НІ**. Тут автор припускає, що сервер доступний через вашу локальну мережу і що ви маєте прямий доступ до нього, тому ви заблокуєте `ssh` для своїх IP-адрес локальної мережі. - -Щоб виконати це, ви будете використовувати вбудований брандмауер для Rocky Linux, `firewalld` і структуру команд `firewall-cmd`. Ви також будете використовувати дві вбудовані зони, «загальнодоступну» та «довірену», щоб не було складнощів. - -Почнемо з додавання наших вихідних IP-адрес до «trusted» зони. Ось наша локальна мережа (у нашому прикладі: 192.168.1.0/24): - -```bash -firewall-cmd --zone=trusted --add-source=192.168.1.0/24 --permanent -``` - -Потім додайте службу `ssh` до зони: - -```bash -firewall-cmd --zone=trusted --add-service=ssh --permanent -``` - -Перезавантажте брандмауер за допомогою: - -```bash -firewall-cmd --reload -``` - -Перелічіть зону, щоб ви могли бачити все за допомогою `firewall-cmd --zone=trusted --list-all`, що дасть вам щось на зразок цього: - -```bash -trusted (active) - target: ACCEPT - icmp-block-inversion: no - interfaces: - sources: 192.168.1.0/24 - services: ssh - ports: - protocols: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - rich rules: - -``` - -Далі вам необхідно внести зміни в «публічну» зону, у якій за замовчуванням увімкнено службу `ssh`. Це потрібно обережно видалити (знову ж таки, ми припускаємо, що ви **НЕ** тут віддалені від сервера!) за допомогою наступного: - -```bash -firewall-cmd --zone=public --remove-service=ssh --permanent -``` - -Вам також потрібно додати служби `http` і `https`: - -```bash -firewall-cmd --zone=public --add-service=http --add-service=https --permanent -``` - -Далі перезавантажте брандмауер, перш ніж ви побачите зміни: - -```bash -firewall-cmd --reload -``` - -Перерахуйте загальнодоступну зону за допомогою `firewall-cmd --zone=public --list-all`, яка покаже вам щось на зразок цього: - -```bash -public - target: default - icmp-block-inversion: no - interfaces: - sources: - services: cockpit dhcpv6-client http https - ports: - protocols: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - rich rules: -``` - -Це єдині зміни, які нам потрібно внести в балансувальник навантаження сервера pound у нашому лабораторному середовищі. - -### Брандмауер - внутрішні сервери - -Для серверів "BackEnd" нам не потрібно дозволяти доступ із світу для будь-чого. Вам потрібно буде дозволити `ssh` з IP-адрес локальної мережі та `http` і `https` з нашого балансувальника навантаження Pound. - -Це майже все. - -Знову ж таки, ви збираєтеся додати службу `ssh` до вашої «довіреної» зони з тими самими командами, що використовуються для вашого сервера pound. Потім додайте зону під назвою «баланс», яку ви використовуватимете для решти `http` і `https`, і встановіть IP-адресу джерела на IP-адресу балансувальника навантаження. - -Щоб спростити речі, використовуйте всі ті команди, які ви використовували для «довіреної» зони, в одному наборі команд: - -```bash -firewall-cmd --zone=trusted --add-source=192.168.1.0/24 --permanent -firewall-cmd --zone=trusted --add-service=ssh --permanent -firewall-cmd --reload -firewall-cmd --zone=trusted --list-all -``` - -Після цього «довірена» зона повинна виглядати так: - -```bash -trusted (active) - target: ACCEPT - icmp-block-inversion: no - interfaces: - sources: 192.168.1.0/24 - services: ssh - ports: - protocols: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - rich rules: -``` - -Ще раз перевірте своє правило `ssh` з IP-адреси в локальній мережі, а потім видаліть службу `ssh` із «публічної» зони. **Пам’ятайте наше попередження вище та робіть це, лише якщо у вас є локальний доступ до сервера!** - -```bash -firewall-cmd --zone=public --remove-service=ssh --permanent -firewall-cmd --reload -firewall-cmd --zone=public --list-all -``` - -Тепер публічна зона має виглядати так: - -```bash -public - target: default - icmp-block-inversion: no - interfaces: - sources: - services: cockpit dhcpv6-client - ports: - protocols: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - rich rules: -``` - -Додайте цю нову зону для роботи з `http` і `https`. Пам’ятайте, що IP джерела тут має бути лише нашим балансувальником навантаження (у нашому прикладі: 192.168.1.103): - -!!! note "Примітка" - - Нова зона має бути додана з опцією `--permanent` і не може бути використана до перезавантаження брандмауера. Крім того, не забудьте `--set-target=ACCEPT` для цієї зони! - -```bash -firewall-cmd --new-zone=balance --permanent -firewall-cmd --reload -firewall-cmd --zone=balance --set-target=ACCEPT -firewall-cmd --zone=balance --add-source=192.168.1.103 --permanent -firewall-cmd --zone=balance --add-service=http --add-service=https --permanent -firewall-cmd --reload -firewall-cmd --zone=balance --list-all -``` - -Результат: - -```bash -balance (active) - target: ACCEPT - icmp-block-inversion: no - interfaces: - sources: 192.168.1.103 - services: http https - ports: - protocols: - forward: no - masquerade: no - forward-ports: - source-ports: - icmp-blocks: - rich rules: -``` - -Повторіть ці кроки на сервері іншого веб-сервера. - -Після того, як до всього додано правила брандмауера, знову перевірте свій pound-сервер у браузері робочої станції. - -## Інша інформація - -Є *БАГАТО* параметрів, які можна включити у ваш файл `pound.conf`, включаючи директиви повідомлень про помилки, параметри журналювання, значення часу очікування і т.д. Ви можете знайти те, що доступно, [тут.](https://linux.die.net/man/8/pound) - -Зручно, Pound автоматично визначає, якщо один із «BackEnd» серверів офлайн, і вимикає його, щоб веб-сервіси могли продовжувати працювати без затримки. Він також автоматично бачить їх знову, коли вони знову в мережі. - -## Висновок - -Pound пропонує інший варіант для тих, хто не хоче використовувати HAProxy або Nginx для балансування навантаження. - -Pound, сервер балансування навантаження, дуже простий у встановленні, налаштуванні та використанні. Як зазначено тут, ви можете використовувати Pound як зворотний проксі, і існує багато варіантів проксі та балансування навантаження. - -І ви завжди повинні пам’ятати про безпеку під час налаштування будь-якої служби, включаючи проксі-сервер балансування навантаження. From e65aa14f83a56b7053abd3cd2542b730dc33b0a3 Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Mon, 22 Sep 2025 17:26:32 -0500 Subject: [PATCH 162/164] 10 fixes for `postfix_reporting.md` (#2894) * replace notices for 9 and replace `mailx` with `s-nail` * replace our with your * replace single line command formatting with multi-line backticks (``` instead of `) * replace keyboard entries with markdown specific syntax * other minor changes --- docs/guides/email/postfix_reporting.md | 174 +++++++++++++++---------- 1 file changed, 105 insertions(+), 69 deletions(-) diff --git a/docs/guides/email/postfix_reporting.md b/docs/guides/email/postfix_reporting.md index 27a168c623..2a7ad64056 100644 --- a/docs/guides/email/postfix_reporting.md +++ b/docs/guides/email/postfix_reporting.md @@ -1,5 +1,5 @@ --- -title: Postfix Process Reporting +title: Using `postfix` for Process Reporting author: Steven Spencer contributors: Ezequiel Bruni, Ganna Zhyrnova tested_with: 8.5, 8.6, 9.0 @@ -9,8 +9,6 @@ tags: - tools --- -# Using `postfix` for server process reporting - ## Prerequisites - Complete comfort operating from the command line on a Rocky Linux server @@ -21,9 +19,9 @@ tags: ## Introduction -Many Rocky Linux server administrators write scripts to perform specific tasks, like backups or file synchronization, and many of these scripts generate logs that have useful and sometimes very important information. Just having the logs, though, is not enough. If a process fails and logs that failure, but the busy administrator does not review the log, then a catastrophe could be in the making. +Many Rocky Linux server administrators write scripts to perform specific tasks, such as backups or file synchronization, and many of these scripts generate logs that have useful and sometimes very important information. Just having the logs, though, is not enough. If a process fails and logs that failure, but the busy administrator does not review the log, then a catastrophe could be in the making. -This document shows you how to use the `postfix` MTA (mail transfer agent) to grab log details from a particular process, and send them to you via email. It also touches on date formats in logs, and helps you identify which format you need to use in the reporting procedure. +This document shows you how to use the `postfix` MTA (mail transfer agent) to grab log details from a particular process, and send them to you by email. It also touches on date formats in logs, and helps you identify the format you need to use in the reporting procedure. Remember, this is just the tip of the iceberg regarding what you can do with reporting via `postfix`. Note that it is always a good security move to limit running processes to only those you will need all the time. @@ -31,53 +29,55 @@ This document shows you how to enable postfix only for the reporting you need it ## `postfix` defined -`postfix` is a server daemon used for sending email. It is more secure and simpler than sendmail, another MTA that was the default go-to MTA for years. You can use it as part of a full-featured mail server. +`postfix` is a server daemon used for sending email. It is more secure and simpler than `sendmail`, another MTA that was the default go-to MTA for years. You can use it as part of a full-featured mail server. ## Installing `postfix` -Aside from `postfix`, you will need `mailx` to test your ability to send emails. To install these and any dependencies required, enter the following on the Rocky Linux server command line: - -`dnf install postfix mailx` - -!!! warning "Rocky Linux 9.0 Changes" - - This procedure works perfectly fine in Rocky Linux 9.0. The difference here is where the `mailx` command comes from. While you can install it by name in 8.x, `mailx` comes from the appstream package `s-nail` in 9.0. To install the needed packages, you need to use: +Aside from `postfix`, you will need `s-nail` to test your ability to send emails. To install these and any dependencies required, enter the following on the Rocky Linux server command line: - ``` - dnf install postfix s-nail - ``` +```bash +dnf install postfix s-nail +``` ## Testing and configuring `postfix` ### Testing mail first -Before you configure `postfix`, you need to find out how mail will look when it leaves the server, as you will probably want to change this. To do this, start `postfix`: +Before you configure `postfix`, you need to discover how mail will look when it leaves the server, as you will probably want to change this. To do this, start `postfix`: -`systemctl start postfix` +```bash +systemctl start postfix +``` -Test with the `mail` provided by `mailx` (or `s-nail`): +Test with the `mail` provided by `s-nail`: -`mail -s "Testing from server" myname@mydomain.com` +```bash +mail -s "Testing from server" myname@mydomain.com +``` This will display a blank line. Type your testing message in here: -`testing from the server` - -Hit enter, and enter a single period: +```bash +testing from the server +``` -`.` +Hit ++enter++, and then a single ++period++: The system will respond with the following: -`EOT` +```bash +EOT +``` -The purpose for doing this is to see how our mail looks to the outside world. You can get a feel for this from the _maillog_ that goes active with the starting of `postfix`. +The purpose for doing this is to see how your mail looks to the outside world. You can get a feel for this from the `maillog` that goes active with the starting of `postfix`. Use this command to see the output of the log file: -`tail /var/log/maillog` +```bash +tail /var/log/maillog +``` -You will see something like this, although the log file will have different domains for the email address, and other items: +You will see something similar to this, although the log file will have different domains for the email address, and other items: ```bash Mar 4 16:51:40 hedgehogct postfix/postfix-script[735]: starting the Postfix mail system @@ -93,78 +93,104 @@ Mar 4 16:52:06 hedgehogct postfix/qmgr[739]: C9D42EC0ADD: removed The "somehost.localdomain" shows that you need to make some changes. Stop the `postfix` daemon first: -`systemctl stop postfix` +```bash +systemctl stop postfix +``` ## Configuring `postfix` -Since you are not setting up a complete, fully functional mail server, the configuration options that you will use are not as extensive. The first thing to do is to modify the _main.cf_ file (literally the main configuration file for `postfix`). Make a backup first: +Since you are not setting up a complete, fully functional mail server, the configuration options that you will use are not as extensive. The first thing to do is to change the `main.cf` file (literally the main configuration file for `postfix`). Make a backup first: -`cp /etc/postfix/main.cf /etc/postfix/main.cf.bak` +```bash +cp /etc/postfix/main.cf /etc/postfix/main.cf.bak +``` Edit it: -`vi /etc/postfix/main.cf` +```bash +vi /etc/postfix/main.cf +``` -In our example, our server name is "bruno" and our domain name is "ourdomain.com". Find the line in the file: +In this example, your server name is "bruno" and your domain name is "ourdomain.com". Find the line in the file: -`#myhostname = host.domain.tld` +```bash +#myhostname = host.domain.tld +``` -You can remove the remark (#) or add a line under this line. Based on our example, the line will read: +You can remove the remark (#) or add a line under this line. Based on the example, the line will read: -`myhostname = bruno.ourdomain.com` +```bash +myhostname = bruno.ourdomain.com +``` Next, find the line for the domain name: -`#mydomain = domain.tld` +```bash +#mydomain = domain.tld +``` Again, remove the remark and change it, or add a line under it: -`mydomain = ourdomain.com` +```bash +mydomain = ourdomain.com +``` Finally, go to the bottom of the file and add this line: -`smtp_generic_maps = hash:/etc/postfix/generic` +```bash +smtp_generic_maps = hash:/etc/postfix/generic +``` -Save your changes (in `vi` it is `Shift : wq!`) and exit the file. +Save your changes and exit the file. -Before you continue editing the generic file, you need to see how the email will look. Specifically, you want to create the "generic" file that you referenced in the _main.cf_ file above: +Before you continue editing the generic file, you need to see how the email will look. Specifically, you want to create the "generic" file that you referenced in the `main.cf` file earlier: -`vi /etc/postfix/generic` +```bash +vi /etc/postfix/generic +``` -This file tells `postfix` how any email coming from this server will look. Remember our test email and the log file? This is where we fix all of that: +This file tells `postfix` how any email coming from this server will look. Remember your test email and the log file? This is where you fix all of that: ```bash root@somehost.localdomain root@bruno.ourdomain.com @somehost.localdomain root@bruno.ourdomain.com ``` -Next, you need to tell `postfix` to use all of our changes. Do this with the postmap command: +Next, you need to tell `postfix` to use all of your changes. Do this with the `postmap` command: -`postmap /etc/postfix/generic` +```bash +postmap /etc/postfix/generic +``` -Start `postfix` and test your email again with the same procedure used above. You will now see that all "localdomain" instances are now the actual domain. +Start `postfix` and test your email again with the same procedure used earlier. You will now see that all "localdomain" instances are now the actual domain. ### The `date` command and a variable called today Not every application will use the same logging format for the date. You might have to get creative with any script you write for reporting by date. -Say that you want to see your system log as an example and pull everything that has to do with dbus-daemon for today's date, and email it to yourself. (It is probably not the greatest example, but it will give you an idea of how you might do this.) +Say that you want to see your system log as an example and pull everything that has to do with `dbus-daemon` for today's date, and email it to yourself. (It is probably not the greatest example, but it will give you an idea of how you do this.) -You need to use a variable in your script. Call it "today". You want it to relate to output from the "date" command and format it in a specific way, so that you can get the data you need from our system log (in _/var/log/messages_). To start with, do some investigative work. +You need to use a variable in your script. Call it "today". You want it to relate to output from the "date" command and format it in a specific way, so that you can get the data you need from your system log (in `/var/log/messages`). To start with, do some investigative work. First, enter the date command in the command line: -`date` +```bash +date +``` -This will give you the default system date output, which might be something like this: +This shows you the default system date output, which might be similar to this: -`Thu Mar 4 18:52:28 UTC 2021` +```bash +Thu Mar 4 18:52:28 UTC 2021 +``` -Check our system log and see how it records information. To do this, use the `more` and `grep` commands: +Check your system log and see how it records information. To do this, use the `more` and `grep` commands: -`more /var/log/messages | grep dbus-daemon` +```bash +more /var/log/messages | grep dbus-daemon +``` -Which will give you something like this: +Which will give you something similar to this: ```bash Mar 4 18:23:53 hedgehogct dbus-daemon[60]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher' @@ -172,7 +198,7 @@ Mar 4 18:50:41 hedgehogct dbus-daemon[60]: [system] Activating via systemd: ser Mar 4 18:50:41 hedgehogct dbus-daemon[60]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher ``` -The date and log outputs need to be exactly the same in our script. Let us see how to format the date with a variable called "today". +The date and log outputs need to be exactly the same in your script. Let us see how to format the date with a variable called "today". Examine what you need to do with the date to get the same output as the system log. You can reference the [Linux man page](https://man7.org/linux/man-pages/man1/date.1.html) or type `man date` on the command line to pull up the date manual page to get the information you need. @@ -180,13 +206,15 @@ What you will find is to format the date the same way as _/var/log/messages_ , y ### The script -For our bash script, you can see that you are going to use the `date` command and a variable called "today". (Remember that "today" is arbitrary. You can call this variable anything you like). You will call your script in this example, `test.sh` and place it in _/usr/local/sbin_: +For your bash script, you can see that you are going to use the `date` command and a variable called "today". (Remember that "today" is arbitrary. You can call this variable anything). You will call your script in this example, `test.sh` and place it in `/usr/local/sbin`: -`vi /usr/local/sbin/test.sh` +```bash +vi /usr/local/sbin/test.sh +``` -At the beginning, notice that even though the comment in our file says you are sending these messages to email, for now, you are just sending them to a standard log output to verify that they are correct. +At the beginning, notice that even though the comment in the file says you are sending these messages to email, for now, you are just sending them to a standard log output to verify that they are correct. -Also, in our first run of the script, you are grabbing all of the messages for the current date not just the dbus-daemon messages. You will deal with that shortly. +Also, in your first run of the script, you are grabbing all the messages for the current date not just the `dbus-daemon` messages. You will deal with that shortly. Be aware that the `grep` command will return the filename in the output, which you will not want in this case. To remove this, add the "-h" option to grep. In addition, when you set the variable "today", you need to look for the entire variable as a string, which needs the string within quotes: @@ -200,17 +228,23 @@ today=`date +"%b %e"` grep -h "$today" /var/log/messages ``` -That is it for now. Save your changes and make the script executable: +That is it. Save your changes and make the script executable: -`chmod +x /usr/local/sbin/test.sh` +```bash +chmod +x /usr/local/sbin/test.sh +``` Test it: -`/usr/local/sbin/test.sh` +```bash +/usr/local/sbin/test.sh +``` -If all works correctly, you will get a long list of all of the messages in _/var/log/messages_ from today, including but not limited to the dbus-daemon messages. The next step is to limit the messages to the dbus-daemon messages. Change your script again: +If all works correctly, you will get a long list of all of the messages in `/var/log/messages` from today, including but not limited to the `dbus-daemon` messages. The next step is to limit the messages to the dbus-daemon messages. Change your script again: -`vi /usr/local/sbin/test.sh` +```bash +vi /usr/local/sbin/test.sh +``` ```bash #!/bin/bash @@ -222,11 +256,13 @@ today=`date +"%b %e"` grep -h "$today" /var/log/messages | grep dbus-daemon ``` -Running the script again, will get you only the dbus-daemon messages and only the ones that occurred today. +Running the script again, will get you only the `dbus-daemon` messages and only the ones that occurred today. -One final step remains. Remember, you need to get this emailed to the administrator for review. Because you are only using `postfix` on this server for reporting, you do not want to leave the service running. Start it at the beginning of the script and stop it at the end. Here, the `sleep` command pauses for 20 seconds, ensuring sending the email before shutting `postfix` down again. This final edit, adds the stop, start, and sleep issues just discussed, and also pipes the content to the administrator's email. +There is one final step. Remember, you need to get this emailed to the administrator for review. Because you are only using `postfix` on this server for reporting, you do not want to leave the service running. Start it at the beginning of the script and stop it at the end. Here, the `sleep` command pauses for 20 seconds, ensuring sending the email before shutting `postfix` down again. This final edit, adds the stop, start, and sleep issues just discussed, and also pipes the content to the administrator's email. -`vi /usr/local/sbin/test.sh` +```bash +vi /usr/local/sbin/test.sh +``` Change the script: @@ -249,10 +285,10 @@ sleep 20 /usr/bin/systemctl stop postfix ``` -Run the script again, and you will now have an email from the server with the dbus-daemon message. +Run the script again, and you will now have an email from the server with the `dbus-daemon` message. You can now use [a crontab](../automation/cron_jobs_howto.md) to schedule this to run at a specific time. ## Conclusion -Using `postfix` can help you keep track of process logs that you want to monitor. You can use it along with bash scripting to gain a firm grasp of your system processes and be informed if there is trouble. +Using `postfix` can help you keep track of process logs that you want to monitor. You can use it along with bash scripting to gain a firm grasp of your system processes and have that information emailed to you if there is trouble. From 960630f3631880c2b0853a8c73141cb91d8b9325 Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Tue, 23 Sep 2025 11:00:37 -0500 Subject: [PATCH 163/164] Changes for `cloud_server_using_nextcloud.md` for RL 10 (#2895) * Remove admonition note for 9 and 10 * Update prerequisites * replace instances of "we" and "our" with "you" and "your" throughout * update PHP version * update package installation list * replace passive voice phrasing with active voice throughout * simplify sentences where possible * update the Nextcloud installation of .zip file directions * replace contractions with words * simplify conclusion statement --- .../cms/cloud_server_using_nextcloud.md | 164 ++++++++---------- 1 file changed, 77 insertions(+), 87 deletions(-) diff --git a/docs/guides/cms/cloud_server_using_nextcloud.md b/docs/guides/cms/cloud_server_using_nextcloud.md index 6833a9623a..3e12e6e466 100644 --- a/docs/guides/cms/cloud_server_using_nextcloud.md +++ b/docs/guides/cms/cloud_server_using_nextcloud.md @@ -8,40 +8,35 @@ tags: - nextcloud --- -# Cloud Server Using Nextcloud -!!! note "Regarding Rocky Linux 9.x or 10.x" +## Prerequisites and assumptions - This procedure should work for Rocky Linux 9.x or 10.x. The difference is that you may need to change version references for some of the repositories to update those to version 9 or 10. If you are using Rocky Linux 9.x or 10.x, just be aware that this was tested in both 8.6 and 9.0, but written originally for 8.6. - -## Prerequisites And Assumptions - -- Server running Rocky Linux (you can install Nextcloud on any Linux distribution, but this procedure will assume you're using Rocky). +- Server running Rocky Linux (you can install Nextcloud on any Linux distribution, but this procedure assumes you are using Rocky). - A high degree of comfort operating from the command line for installation and for configuration. -- Knowledge of a command-line editor. For this example, we are using _vi_, but you can use your favorite editor if you have one. -- While Nextcloud can be installed via a snap application, we will be documenting just the .zip file installation. -- We will be applying concepts from the Apache _sites enabled_ document (linked to down below) for directory setup. -- We will also be using the _mariadb-server_ hardening procedure (also linked to later) for database setup. -- Throughout this document we will assume that you are root, or that you can be by using _sudo_. -- We are using an example domain of in the configuration. +- Knowledge of a command-line editor. Using `vi` for this example, but you can use your favorite editor if you have one. +- This procedure covers the `.zip` file installation method. You can also install Nextcloud with a snap application. +- This procedure uses the Apache _sites enabled_ document (linked later) for directory setup. +- This procedure also uses _mariadb-server_ hardening (also linked later) for database setup. +- Throughout this document the assumption is that you are root, or that you can elevate privileges with `sudo`. +- The example domain in use here is "yourdomain.com". ## Introduction -If you are in charge of a server environment for a large (or even a small) company, you may be tempted by cloud applications. Doing things in the cloud can free up your own resources for other things, but there is a downside to this, and that is the loss of control of your company's data. If the cloud application is compromised, your company's data may be compromised too. +If you are in charge of a server environment for a large (or even a small) company, you might consider using cloud applications. Doing things in the cloud can free up your own resources for other things, but there is a downside to this, and that is the loss of control of your company's data. If a compromise occurs in the cloud application, you could risk your company's data too. -Taking the cloud back into your own environment is a way to reclaim security of your data at the expense of your time and energy. Sometimes, that is a cost worth paying. +Taking the cloud back into your own environment is a way to reclaim security of your data at the expense of your time and energy. Sometimes, this is a cost worth paying. Nextcloud offers an open source cloud with security and flexibility in mind. Note that building a Nextcloud server is a good exercise, even if you opt to take your cloud off-site in the end. The following procedure deals with setting up Nextcloud on Rocky Linux. -## Nextcloud Install +## Nextcloud install -### Installing And Configuring Repositories and Modules +### Installing and configuring repositories and modules -For this installation, we will require two repositories. We need to install the EPEL (Extra Packages for Enterprise Linux), and the Remi Repository for PHP 8.3 +For this installation, you need two repositories. You need to install the EPEL (Extra Packages for Enterprise Linux), and the Remi Repository for 10. !!! note - A minimum PHP version 7.3 or 7.4 is required and the Rocky Linux version of 7.4 does not contain all of the packages that Nextcloud needs. We are going to use PHP 8.3 from the Remi repository instead. + While Rocky Linux 10 contains the minimum required PHP version of 8.3, the Remi repository contains other PHP packages necessary for Nextcloud. To install the EPEL run: @@ -49,45 +44,39 @@ To install the EPEL run: dnf install epel-release ``` -To install the Remi repository run (note: if you are using Rocky Linux 9.x or 10.x, substitute in 9 or 10 next to `release-` below): +To install the Remi repository run: ```bash -dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm +dnf install https://rpms.remirepo.net/enterprise/remi-release-10.rpm ``` Then run `dnf upgrade` again. -Run the following to see a list of php modules that can be enabled: +Run the following to see a list of available PHP modules: ```bash dnf module list php ``` -which gives you this output for Rocky Linux 8.x (similar output will show for Rocky Linux 9.x or 10.x): +This gives you this output for Rocky Linux 10: ```bash -Rocky Linux 8 - AppStream -Name Stream Profiles Summary -php 7.2 [d] common [d], devel, minimal PHP scripting language -php 7.3 common [d], devel, minimal PHP scripting language -php 7.4 common [d], devel, minimal PHP scripting language -php 7.4 common [d], devel, minimal PHP scripting language -Remi's Modular repository for Enterprise Linux 8 - x86_64 -Name Stream Profiles Summary -php remi-7.2 common [d], devel, minimal PHP scripting language -php remi-7.3 common [d], devel, minimal PHP scripting language -php remi-7.4 common [d], devel, minimal PHP scripting language -php remi-8.0 common [d], devel, minimal PHP scripting language -php remi-8.1 common [d], devel, minimal PHP scripting language -php remi-8.2 common [d], devel, minimal PHP scripting language -php remi-8.3 common [d], devel, minimal PHP scripting language +Remi's Modular repository for Enterprise Linux 10 - x86_64 +Name Stream Profiles Summary +php remi-7.4 common [d], devel, minimal PHP scripting language +php remi-8.0 common [d], devel, minimal PHP scripting language +php remi-8.1 common [d], devel, minimal PHP scripting language +php remi-8.2 common [d], devel, minimal PHP scripting language +php remi-8.3 common [d], devel, minimal PHP scripting language +php remi-8.4 common [d], devel, minimal PHP scripting language + Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled ``` -We want to grab the newest PHP that Nextcloud is compatible with, which at this moment is 8.3, so we will enable that module by doing: +Use the newest PHP that Nextcloud is compatible with. At this moment this is 8.4. Enable that module with: ```bash -dnf module enable php:remi-8.3 +dnf module enable php:remi-8.4 ``` To see how this changes the output of the module list, run the module list command again and you will see the "[e]" next to 8.3: @@ -96,18 +85,18 @@ To see how this changes the output of the module list, run the module list comma dnf module list php ``` -And the output again is the same except for this line: +The output is the same except for this line: ```bash -php remi-8.3 [e] common [d], devel, minimal PHP scripting language +php remi-8.4 [e] common [d], devel, minimal PHP scripting language ``` -### Installing Packages +### Installing packages -Our example here uses Apache and mariadb, so to install what we need, we simply need to do the following: +The example here uses Apache and mariadb. To install the needed packages, do the following: ```bash -dnf install httpd mariadb-server vim wget zip unzip libxml2 openssl php83-php php83-php-ctype php83-php-curl php83-php-gd php83-php-iconv php83-php-json php83-php-libxml php83-php-mbstring php83-php-openssl php83-php-posix php83-php-session php83-php-xml php83-php-zip php83-php-zlib php83-php-pdo php83-php-mysqlnd php83-php-intl php83-php-bcmath php83-php-gmp +dnf install httpd mariadb-server vim wget zip unzip libxml2 openssl php84-php php84-php-ctype php84-php-curl php84-php-gd php84-php-iconv php84-php-json php84-php-libxml php84-php-mbstring php84-php-openssl php84-php-posix php84-php-session php84-php-xml php84-php-zip php84-php-zlib php84-php-pdo php84-php-mysqlnd php84-php-intl php84-php-bcmath php84-php-gmp ``` ### Configuring @@ -126,17 +115,17 @@ Then start it: systemctl start httpd ``` -#### Create The Configuration +#### Create the configuration -In the _Prerequisites and Assumptions_ section, we mentioned that we will be using the [Apache Sites Enabled](../web/apache-sites-enabled.md) procedure for our configuration. Click over to that procedure and set up the basics there, and then return to this document to continue. +In the _Prerequisites and Assumptions_ section, there was a statement that you will be using the [Apache Sites Enabled](../web/apache-sites-enabled.md) procedure for your configuration. Click over to that procedure and set up the basics there, and then return to this document to continue. -For Nextcloud, we will need to create the following configuration file. +For Nextcloud, you will need to create the following configuration file: ```bash vi /etc/httpd/sites-available/com.yourdomain.nextcloud ``` -Your configuration file should look something like this: +With the content: ```bash @@ -155,28 +144,28 @@ Your configuration file should look something like this: Once done, save your changes (with ++shift+colon+"w"+"q"+exclam++ for _vi_). -Next, create a link to this file in /etc/httpd/sites-enabled: +Next, create a link to this file in `/etc/httpd/sites-enabled`: ```bash ln -s /etc/httpd/sites-available/com.yourdomain.nextcloud /etc/httpd/sites-enabled/ ``` -#### Creating The Directory +#### Creating the directory -As noted in the configuration above, the _DocumentRoot_ needs to be created. This can be done by: +As noted in the configuration earlier, you need to create the _DocumentRoot_. Do this with: ```bash mkdir -p /var/www/sub-domains/com.yourdomain.com/html ``` -This is where our Nextcloud instance will be installed. +This is where you will install your Nextcloud instance. #### Configuring PHP -We need to set the time zone for PHP. To do this, open up php.ini with your text editor of choice: +You need to set the time zone for PHP. To do this, open up `php.ini` with your text editor of choice: ```bash -vi /etc/opt/remi/php83/php.ini +vi /etc/opt/remi/php84/php.ini ``` Then find the line: @@ -185,7 +174,7 @@ Then find the line: ;date.timezone = ``` -We need to remove the remark (++semicolon++) and set our time zone. For our example time zone, we would put in either: +Remove the remark (++semicolon++) and set our time zone. For this example time zone, you can put in either: ```php date.timezone = "America/Chicago" @@ -197,15 +186,15 @@ OR date.timezone = "US/Central" ``` -Then save and exit the php.ini file. +Then save and exit the `php.ini` file. -Note that for the sake of keeping things the same, your time zone in the _php.ini_ file should match up to your machine's time zone setting. You can find out what this is set to by doing the following: +Note that for the sake of keeping things the same, your time zone in the `php.ini` file should match up to your machine's time zone setting. You can discover what this is by doing the following: ```bash ls -al /etc/localtime ``` -Which should show you something like this, assuming you set your time zone when you installed Rocky Linux and are living in the Central time zone: +You should see something such as this, assuming you set your time zone when you installed Rocky Linux and are living in the Central time zone: ```bash /etc/localtime -> /usr/share/zoneinfo/America/Chicago @@ -213,7 +202,7 @@ Which should show you something like this, assuming you set your time zone when #### Configuring mariadb-server -Set _mariadb-server_ to start on boot: +Set `mariadb-server` to start on boot: ```bash systemctl enable mariadb @@ -225,34 +214,35 @@ And then start it: systemctl restart mariadb ``` -Again, as indicated earlier, we will be using the setup procedure for hardening _mariadb-server_ found [here](../database/database_mariadb-server.md) for the initial configuration. +Again, as indicated earlier, use the setup procedure for [hardening `mariadb-server`](../database/database_mariadb-server.md) for the initial configuration. ### Installing .zip -The next few steps assume that you are remotely connected to your Nextcloud server via _ssh_ with a remote console open: +The next few steps assume that you are remotely connected to your Nextcloud server via `ssh` with a remote console open: -- Navigate to the [Nextcloud web site](https://nextcloud.com/). -- Let your mouse hover over `Get Nextcloud` which will bring up a drop-down menu. -- Click on `Server Packages`. -- Right-click on `Download Nextcloud` and copy the link address (the exact syntax of this is different from browser to browser). -- In your remote console on the Nextcloud server, type `wget` and then a space and paste in what you just copied. You should get something like the following: `wget https://download.nextcloud.com/server/releases/nextcloud-21.0.1.zip` (note that the version could be different). -- Once you hit enter, the download of the .zip file will start and will be completed fairly quickly. +- Navigate to the [Nextcloud website](https://nextcloud.com/). +- Let your mouse hover over 'Download' which will open a drop-down menu. +- Click 'Nextcloud server'. +- Click 'Download server archive'. +- Right-click 'Get ZIP file' and copy the link. +- In your remote console on the Nextcloud server, type `wget` and then a space and paste in what you just copied. You should get something similar to the following: `wget https://download.nextcloud.com/server/releases/latest.zip`. +- Once you hit enter, the download of the .zip file will start and complete quickly. -Once the download is complete, unzip the Nextcloud zip file by using the following: +Once the download is complete, extract the Nextcloud .zip file with: ```bash -unzip nextcloud-21.0.1.zip +unzip latest.zip ``` -### Copying Content And Changing Permissions +### Copying content and changing permissions -After completing the unzip step, you should now have a new directory in _/root_ called "nextcloud." Change into this directory: +After completing the .zip file extraction step, you should now have a new directory in `/root` called "nextcloud." Change into this directory: ```bash cd nextcloud ``` -And either copy or move the content to our _DocumentRoot_: +Either copy or move the content to our _DocumentRoot_: ```bash cp -Rf * /var/www/sub-domains/com.yourdomain.nextcloud/html/ @@ -264,13 +254,13 @@ OR mv * /var/www/sub-domains/com.yourdomain.nextcloud/html/ ``` -Now that everything is where it should be, the next step is to make sure that apache owns the directory. To do this, run: +The next step is to make sure that apache owns the directory. Do this with: ```bash chown -Rf apache.apache /var/www/sub-domains/com.yourdomain.nextcloud/html ``` -For security reasons, we also want to move the _data_ folder from inside to outside of the _DocumentRoot_. Do this with the following command: +For security reasons, you also want to move the _data_ folder from inside to outside of the _DocumentRoot_. Do this with the following command: ```bash mv /var/www/sub-domains/com.yourdomain.nextcloud/html/data /var/www/sub-domains/com.yourdomain.nextcloud/ @@ -278,7 +268,7 @@ mv /var/www/sub-domains/com.yourdomain.nextcloud/html/data /var/www/sub-domains/ ### Configuring Nextcloud -Now comes the fun! First, make sure that you have your services running. If you followed the above steps, they should already be running. We have had several steps between those initial service starts, so let's go ahead and restart them, just to be sure: +Ensure that you have your services running. If you followed the earlier steps, they should already be running. You have had several steps between those initial service starts, so restart them just to be sure: ```bash systemctl restart httpd @@ -287,18 +277,18 @@ systemctl restart mariadb If everything restarts and there are no issues, then you are ready to move on. -To do the initial configuration, we want to actually load the site in a web browser: +To do the initial configuration, you want to load the site in a web browser: (replace with your actual hostname) -Assuming that you've done everything correctly so far, you should be presented with a Nextcloud setup screen: +Assuming that you have done everything correctly so far, you should see a Nextcloud setup screen: ![nextcloud login screen](../images/nextcloud_screen.jpg) -There are a couple of things that we want to do differently than the defaults that show up: +There are a couple of things that you want to do differently than the defaults: -- At the top of the web page, where it says `Create an admin account`, set the user and password. For the sake of this document, we are entering `admin` and setting a strong password. Remember to save this somewhere safe (like a password manager) so that you don't lose it! Even though you have typed into this field, don't hit ++enter++ until we have done all of the setup fields! -- Under the `Storage & database` section, change the `Data folder` location from the default document root, to where we moved the data folder earlier: `/var/www/sub-domains/com.yourdomain.nextcloud/data`. +- At the top of the web page, where it says `Create an admin account`, set the user and password. For the sake of this example, enter `admin` and setting a strong password. Remember to save this somewhere safe (such as a password manager) so that you do not lose it. Even though you have typed into this field, ==do not hit== ++enter++ until you complete **all** the fields. +- Under the `Storage & database` section, change the `Data folder` location from the default document root, to where you moved the data folder earlier: `/var/www/sub-domains/com.yourdomain.nextcloud/data`. - Under the `Configure the database` section, change from `SQLite` to `MySQL/MariaDB` by clicking on that button. - Type the MariaDB root user and password that you set earlier into the `Database user` and `Database password` fields. - In the `Database name` field, type `nextcloud`. @@ -306,16 +296,16 @@ There are a couple of things that we want to do differently than the defaults th Once you have all this, click `Finish Setup` and you should be up and running. -The browser window will refresh for a bit and then usually not reload the site. Enter your URL in the browser window again and you should be confronted with the default first pages. +The browser window will refresh for a bit and then usually not reload the site. Enter your URL in the browser window again and you should see the default first pages. -Your administrative user is already (or should be) logged in at this point, and there are several informational pages designed to get you up to speed. The "Dashboard" is what users will see when they first login. The administrative user can now create other users, install other applications and many other tasks. +Your administrative user is already (or should be) logged in at this point, and there are several informational pages designed to get you up to speed. The "Dashboard" is what users will see when they first login. The administrative user can now create other users, install other applications, and many other tasks. -The "Nextcloud Manual.pdf" file is the user manual, so that users can get familiar with what is available. The administrative user should read through or at least scan the high points of the admin manual [On the Nextcloud web site](https://docs.nextcloud.com/server/21/admin_manual/) +The "Nextcloud Manual.pdf" file is the user manual, so that users can get familiar with what is available. The administrative user should read through or at least scan the high points of the admin manual [On the Nextcloud website](https://docs.nextcloud.com/server/21/admin_manual/) -## Next Steps +## Next steps -At this point, don't forget that this is a server that you will be storing company data on. It's important to get it locked down with a firewall, get the [backup set up](../backup/rsnapshot_backup.md), secure the site with an [SSL](../security/generating_ssl_keys_lets_encrypt.md), and any other duties that are required to keep your data safe. +At this point, do not forget that this is a server that you will be storing company data on. It is important to get it locked down with a firewall, get the [backup set up](../backup/rsnapshot_backup.md), secure the site with an [SSL](../security/generating_ssl_keys_lets_encrypt.md), and any other needed tasks to keep your data safe. ## Conclusions -A decision to take the company cloud in house is one that needs to be evaluated carefully. For those that decide that keeping company data locally is preferable over an external cloud host, Nextcloud is a good alternative. +You need to evaluate carefully any decision to take the company cloud in house. For those that decide that keeping company data locally is preferable over an external cloud host, Nextcloud is a good alternative. From d69a3ea14f3393291c8da3ffd113e2f1298d21bc Mon Sep 17 00:00:00 2001 From: sspencerwire Date: Tue, 23 Sep 2025 17:37:20 -0500 Subject: [PATCH 164/164] Update `dokuwiki_server.md` for 10 (#2896) * Removal of specific notes for earlier Rocky Linux versions * Add current system requirements * simplify some sentences * use backticks uniformly for code blocks, commands, and directories --- docs/guides/cms/dokuwiki_server.md | 48 +++++++++++++++--------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/docs/guides/cms/dokuwiki_server.md b/docs/guides/cms/dokuwiki_server.md index fa2b1095f4..79888faa03 100644 --- a/docs/guides/cms/dokuwiki_server.md +++ b/docs/guides/cms/dokuwiki_server.md @@ -11,9 +11,9 @@ tags: ## Prerequisites and assumptions - A Rocky Linux instance installed on a server, container, or virtual machine -- Comfort with modifying configuration files from the command line with an editor (our examples here will use _vi_, but you can substitute your favorite editor) +- Comfort with modifying configuration files from the command line with an editor (the examples here use `vi`, but you can substitute your favorite editor) - Some knowledge about web applications and setup -- Our example will use the [Apache Sites Enabled](../web/apache-sites-enabled.md) for setup. Review that if necessary. +- Uses the [Apache Sites Enabled](../web/apache-sites-enabled.md) for setup. Review that if necessary. - This document will use "example.com" as the domain name throughout - You must be root or able to `sudo` to elevate privileges - Assuming a fresh install of the operating system, however, that is not a requirement @@ -28,7 +28,7 @@ DokuWiki is one of many wikis available, though it is a good one. One big pro is ## Installing dependencies -The minimum PHP version for DokuWiki is now 7.2, which Rocky Linux 8 has by default. Because of the modules, Rocky Linux 8 can install up to version 8.2. Rocky Linux 9.0 has PHP version 8.0 by default and modules that allow up to 8.2. Note that some of the packages listed here might already exist: +The minimum PHP version for DokuWiki is now 8. Rocky Linux 10 has PHP 8.3 by default. Note that some of the packages listed here might already exist: ```bash dnf install tar wget httpd php php-gd php-xml php-json php-mbstring @@ -40,7 +40,7 @@ Accept and install any additional listed dependencies that come with these packa ### Apache configuration -If you have read through the [Apache Sites Enabled](../web/apache-sites-enabled.md) procedure, you know that you need to create a few directories. Start with the _httpd_ configuration directory additions: +If you have read through the [Apache Sites Enabled](../web/apache-sites-enabled.md) procedure, you know that you need to create a few directories. Start with the `httpd` configuration directory additions: ```bash mkdir -p /etc/httpd/{sites-available,sites-enabled} @@ -87,7 +87,7 @@ That configuration file will be similar to this: ``` -Note that the "AllowOverride All" above allows the `.htaccess` (directory-specific security) file to work. +Note that the "AllowOverride All" here allows the `.htaccess` (directory-specific security) file to work. Go ahead and link the configuration file into sites-enabled, but do not start web services as yet: @@ -95,7 +95,7 @@ Go ahead and link the configuration file into sites-enabled, but do not start we ln -s /etc/httpd/sites-available/com.example /etc/httpd/sites-enabled/ ``` -### Apache DocumentRoot +### Apache _DocumentRoot_ You need to create your _DocumentRoot_. Do this with: @@ -111,15 +111,15 @@ In your server, change to the root directory. cd /root ``` -Since your environment is ready to go, get the latest stable version of DokuWiki. You can find this by going to [the download page](https://download.dokuwiki.org/), and on the left side of the page, under "Version," you will see "Stable (Recommended) (direct link)." +Get the latest stable version of DokuWiki. You can find this by going to [the download page](https://download.dokuwiki.org/), and on the left side of the page, under "Version," you will see "Stable (Recommended) (direct link)." -Right-click on the "(direct link)" portion of this and copy the link. In the console of your DokuWiki server, type `wget` and a space and then paste your copied link into the terminal. You should get something similar to this: +Right-click the "(direct link)" and copy the link. In the console of your DokuWiki server, type `wget` and a space and then paste your copied link into the terminal. You should get something similar to this: ```bash wget https://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz ``` -Before we decompress the archive, examine the contents with `tar ztf`: +Before you decompress the archive, examine the contents with `tar ztf`: ```bash tar ztvf dokuwiki-stable.tgz @@ -135,23 +135,23 @@ dokuwiki-2020-07-29/inc/lang/fr/recent.txt ... (more below) ``` -You do not want that leading named directory when decompressing the archive, so you will use some options with `tar` to exclude it. The first option is the "--strip-components=1" that removes the leading directory. The second option is the "-C" option, which tells `tar` where you want the archive decompressed. The decompression will be similar to this: +You do not want that leading named directory when decompressing the archive, so use some options with `tar` to exclude it. The first option is the `--strip-components=1` that removes the leading directory. The second option is the `-C` option, which tells `tar` where you want the archive decompressed. The decompression will be similar to this: ```bash tar xzf dokuwiki-stable.tgz --strip-components=1 -C /var/www/sub-domains/com.example/html/ ``` -Once you have run this command, all of DokuWiki should be in your _DocumentRoot_. +Once you run this command, all of DokuWiki should be in your _DocumentRoot_. -You need to make a copy of the _.htaccess.dist_ file that came with DokuWiki and keep the old one there, in case you need to revert to the original. +You need to make a copy of the `.htaccess.dist` file that came with DokuWiki, and keep the old one in case you need to revert to the original. -In the process, you will change this file's name to _.htaccess_. This is what _apache_ will be looking for. To do this: +In the process, you will change the name to `.htaccess`. This is what _apache_ will be looking for. To do this: ```bash cp /var/www/sub-domains/com.example/html/.htaccess{.dist,} ``` -You need to change ownership of the new directory and its files to the _apache_ user and group: +Change ownership of the new directory and its files to the _apache_ user and group: ```bash chown -Rf apache.apache /var/www/sub-domains/com.example/html @@ -159,15 +159,15 @@ chown -Rf apache.apache /var/www/sub-domains/com.example/html ## Setting up DNS or `/etc/hosts` -Before you can access the DokuWiki interface, you must set the name resolution for this site. You can use your _/etc/hosts_ file for testing purposes. +Before you can access the DokuWiki interface, you must set the name resolution for this site. You can use your `/etc/hosts` file for testing purposes. -In this example, assume that DokuWiki will run on a private IPv4 address of 10.56.233.179. Assume you are also modifying the _/etc/hosts_ file on a Linux workstation. To do this, run: +In this example, assume that DokuWiki will run on a private IPv4 address of 10.56.233.179. Assume you are also modifying the `/etc/hosts` file on a Linux workstation. To do this, run: ```bash sudo vi /etc/hosts ``` -Then change your host file to look similar to this (note the IP address above in the example): +Then change your host file to look similar to this (note the IP address earlier in the example): ```bash 127.0.0.1 localhost @@ -186,7 +186,7 @@ Once you have finished testing and are ready to take things live for everyone, y ## Starting `httpd` -Before you start _httpd_, test to make sure that your configuration is OK: +Before you start `httpd`, test to make sure that your configuration is OK: ```bash httpd -t @@ -198,7 +198,7 @@ You should get: Syntax OK ``` -If so, you should be ready to start _httpd_ and then finish the setup. Start by enabling _httpd_ to start on boot: +If so, you should be ready to start `httpd` and then finish the setup. Start by enabling `httpd` to start on boot: ```bash systemctl enable httpd @@ -218,7 +218,7 @@ The next step is to open up a web browser and type this in the address bar: This will bring you to the setup screen: -- In the "Wiki Name" field, type the name for our wiki. Example "Technical Documentation" +- In the "Wiki Name" field, type the name for your wiki. Example "Technical Documentation" - In the "Superuser" field, type the administrative username. Example "admin" - In the "Real name" field, type the real name of the administrative user - In the "E-Mail" field, type the email address of the administrative user @@ -253,7 +253,7 @@ firewall-cmd --zone=trusted --add-service=http --add-service=https --permanent firewall-cmd --reload ``` -Once you have the above rules added and the `firewalld` service reloaded, list out your zone to make sure that everything is there that you need: +Once you have these rules added and the `firewalld` service reloaded, list out your zone to make sure that everything is there that you need: ```bash firewall-cmd --zone=trusted --list-all @@ -278,10 +278,10 @@ trusted (active) rich rules: ``` -### SSL +### SSL/TLS -You should consider using an SSL for encrypted web traffic for the best security. You can purchase an SSL from an SSL provider or use [Let's Encrypt](../security/generating_ssl_keys_lets_encrypt.md). +You should consider using an SSL/TLS for encrypted web traffic for the best security. You can purchase an SSL/TLS certificate from an SSL/TLS provider or use [Let's Encrypt](../security/generating_ssl_keys_lets_encrypt.md). ## Conclusion -Whether you need to document processes, company policies, program code, or something else, a wiki is a great way to do it. DokuWiki is a secure, flexible, easy-to-use product that is also relatively easy to install and deploy. It is also a stable project that has been around for many years. +Whether you need to document processes, company policies, program code, or something else, a wiki is a great way to do it. DokuWiki is a secure, flexible, easy-to-use product that is also straightforward to install and deploy. It is also a stable project that has been around for many years.