Се­год­ня мы с тобой соз­дадим «живой» USB-накопи­тель с уста­новоч­ным обра­зом Arch Linux. «Живой» в том смыс­ле, что во вре­мя исполь­зования мож­но будет уста­нав­ливать и уда­лять прог­раммы, менять любые фай­лы и сох­ранять изме­нения. Я при­гото­вил для тебя мак­сималь­но под­робную инс­трук­цию по основным дей­стви­ям, но даль­ше ты смо­жешь нас­тро­ить всё так, как тебе пон­равит­ся.

У каж­дого линук­соида есть любимая сис­тема. У некото­рых даже нес­коль­ко, каж­дая — для осо­бых задач. Один из таких спе­циаль­ных слу­чаев — это пор­татив­ная сис­тема, которую мож­но заг­рузить на чужой машине или на тво­ей, если основная ОС вдруг перес­тала работать нор­маль­но.

Есть мно­жес­тво готовых раз­работок, пред­назна­чен­ных как раз для решения таких задач. Но мы‑то хотим получить пол­ностью кас­томизи­рован­ное окру­жение — при­выч­ное и с набором нуж­ных прог­рамм!

Ва­риан­та здесь два: сде­лать заг­рузоч­ный образ ISO либо прос­то уста­новить всё на флеш­ку. В пер­вом слу­чае сис­тема будет в разы ком­пак­тнее, во вто­ром мы получим важ­ную воз­можность ста­вить и уда­лять прог­раммы и менять нас­трой­ки во вре­мя работы.

Да, флеш­ка будет изна­шивать­ся, но сто­ят они сей­час недоро­го, и воз­можность работы с пол­ноцен­ной ОС, на мой взгляд, гораз­до важ­нее.

 

Подготовка

Все работы я буду про­водить на Arch Linux для x86-64 и возь­му ори­гиналь­ные archiso, которые исполь­зуют­ся для соз­дания офи­циаль­ных ISO-обра­зов.

По­это­му в сис­тему дол­жны быть уста­нов­лены сле­дующие пакеты: archiso, arch-install-scripts, gptfdisk.

Мож­но как сра­зу уста­новить на USB-накопи­тель, так и соз­дать образ дис­ка, который потом мож­но будет записать на флеш­ку. Далее я опи­шу про­цесс соз­дания обра­за дис­ка.

 

Создаем пустой файл под размер флешки

Пе­рехо­дим в каталог, где будем соз­давать наш образ.

cd ~

Все даль­нейшие дей­ствия будем делать с при­виле­гиями супер­поль­зовате­ля.

su

Что­бы тебе было лег­че ори­енти­ровать­ся, буду показы­вать вывод некото­рых команд.

Уз­нать точ­ный раз­мер устрой­ства мож­но коман­дой

lsblk -bo NAME,SIZE

lsblk -bo NAME,SIZE
NAME SIZE
sda4005527552
├─sda1 10485760
├─sda2 268435456
└─sda3 3725540864
mmcblk0 62226694144
├─mmcblk0p1 209715200
└─mmcblk0p2 62015930368

Она покажет все устрой­ства, сре­ди них тебе нуж­но най­ти свой USB-накопи­тель.

Уз­нав номер устрой­ства, ты можешь сос­тавить коман­ду и задать нуж­ный раз­мер фай­ла. Делим раз­мер на 4096 и получа­ем нуж­ное количес­тво бло­ков.

При­меры:

16 Гб: 16034824192 / 4096 = 3914752
4 Гб: 4005527552 / 4096 = 977912

4096 — это обыч­ный раз­мер сек­тора для фай­ловой сис­темы.

Ко­ман­да для соз­дания фай­ла usb.img раз­мером 4 Гбайт:

dd if=/dev/zero of=usb.img bs=4096 count=977912 status=progress

$ dd if=/dev/zero of=usb.img bs=4096 count=977912 status=progress
3651747840 байт (3,7 GB, 3,4 GiB) ско­пиро­ван, 8 s, 456 MB/s
977912+0 записей получе­но
977912+0 записей отправ­лено
4005527552 байт (4,0 GB, 3,7 GiB) ско­пиро­ван, 8,78378 s, 456 MB/s

Про­веря­ем:

ls -la usb.img

$ ls -la usb.img
-rw-rw-r-- 1 root root 4005527552 апр 25 19:51 usb.img

Ес­ли файл получил­ся боль­ше, мож­но обре­зать до нуж­ной дли­ны с помощью truncate. Нап­ример, до 16 Гбайт:

truncate -s 16034824192 usb.img
 

Создаем разметку диска

Что­бы наша сис­тема мог­ла заг­ружать­ся на компь­юте­рах и с BIOS, и с EFI, нам нуж­но раз­метить диск на три раз­дела:

  • один — 10 Мбайт, без фай­ловой сис­темы, необ­ходим для уста­нов­ки заг­рузчи­ка GRUB в режиме BIOS;
  • вто­рой — 256 Мбайт, будет отформа­тиро­ван в FAT32, здесь соз­дадим раз­дел boot и пос­тавим GRUB в режиме EFI;
  • все оставше­еся мес­то отда­дим кор­невой фай­ловой сис­теме. Отформа­тиру­ем ее в Ext4.

Соз­даем раз­метку GPT и делим диск на три раз­дела:

sgdisk -o -n 1:0:+10M -t 1:EF02 -n 2:0:+256M -t 2:EF00 -n 3:0:0 -t 3:8300 usb.img

$ sgdisk -o -n 1:0:+10M -t 1:EF02 -n 2:0:+256M -t 2:EF00 -n 3:0:0 -t 3:8300 usb.img
Creating new GPT entries in memory.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot or after you
run partprobe(8) or kpartx(8)
The operation has completed successfully.

 

Монтируем в систему созданный образ

Соз­даем связь меж­ду фай­лом обра­за usb.img и устрой­ством loopback. Это поз­воля­ет работать с фай­лом обра­за так, как если бы он был физичес­ким устрой­ством, нап­ример USB-накопи­телем.

losetup --show -Pf usb.img

$ losetup --show -Pf usb.img
/dev/loop0

Ко­ман­да покажет имя соз­данно­го устрой­ства, в дан­ном слу­чае это /dev/loop0.

Про­веря­ем.

ls /dev/loop0*

$ ls /dev/loop0*
/dev/loop0
/dev/loop0p1
/dev/loop0p2
/dev/loop0p3

У нашего обра­за дол­жно быть три раз­дела: loop0p1, loop0p2, loop0p3.

 

Форматируем разделы

По стан­дарту раз­дел EFI дол­жен быть отформа­тиро­ван в FAT32.

mkfs.fat -F32 /dev/loop0p2

$ mkfs.fat -F32 /dev/loop0p2
mkfs.fat 4.2 (2021-01-31)

Тре­тий раз­дел будет основным, для него мож­но выб­рать любую ФС, которую будут под­держи­вать и заг­рузчик, и ядро.

Фор­матиру­ем в Ext4:

mkfs.ext4 /dev/loop0p3

$ mkfs.ext4 /dev/loop0p3
mke2fs 1.46.5 (30-Dec-2021)
...
...
Соз­дание жур­нала (16384 бло­ков): готово
Writing superblocks and filesystem accounting information: готово

 

Монтируем разделы в /mnt/usb

Сна­чала мы смон­тиру­ем раз­дел /dev/loop0p3, это будет наш основной раз­дел, на который уста­новим сис­тему. Затем на этом раз­деле мы соз­дадим каталог /boot, в который смон­тиру­ем раз­дел /dev/loop0p2.

mkdir -p /mnt/usb
mount /dev/loop0p3 /mnt/usb
mkdir /mnt/usb/boot
mount /dev/loop0p2 /mnt/usb/boot
 

Копируем airootfs

Нес­коль­ко слов об Archiso. Это инс­тру­мент, с помощью которо­го соз­дают офи­циаль­ные обра­зы Arch Linux. Он сос­тоит из двух час­тей: скрип­та mkarchiso, который собира­ет образ, и катало­га с нас­трой­ками будуще­го обра­за. Нам нужен будет каталог с кон­фигами. В нем находят­ся:

  • спи­сок пакетов, которые необ­ходимо уста­новить, они хра­нят­ся в фай­ле packages.x86_64;
  • ка­талог airootfs. Его струк­тура иден­тична струк­туре Arch Linux, здесь лежат кон­фиги сис­темы.

Нам три раза при­дет­ся ука­зывать путь до катало­га с нас­трой­ками Archiso. Что­бы было про­ще, вынесем путь к нему в перемен­ную.

export ARCHISO=/usr/share/archiso/configs/releng

Ко­пиру­ем нас­трой­ки офи­циаль­ного обра­за до уста­нов­ки пакетов. Если при уста­нов­ке пакета обна­ружит­ся, что кон­фиг для него уже есть, файл не перепи­сыва­ется, а соз­дает­ся новый с рас­ширени­ем .pacnew. Во вре­мя уста­нов­ки пакетов будут показа­ны пре­дуп­режде­ния об этом.

cp -afv $ARCHISO/airootfs/* /mnt/usb/
 

Перевод некоторых файлов на русский (необязательно)

В сво­ем обра­зе ты можешь поменять при­ветс­твие сис­темы на какое хочешь. Файл при­ветс­твия — /etc/motd. Я сде­лал (ну лад­но, Яндекс сде­лал) прос­той перевод исходно­го фай­ла, ниже — коман­да, которой его мож­но заменить.

wget -O /mnt/usb/etc/motd https://gitflic.ru/project/ksandr/archi/blob/raw?file=airootfs/etc/motd

В уста­новоч­ном обра­зе есть коман­да Installation_guide, откры­вающая в кон­соль­ном тек­сто­вом бра­узе­ре стра­ницу вики по уста­нов­ке сис­темы.

За­меним в ней ссыл­ку, что­бы она ука­зыва­ла на рус­ско­языч­ный ана­лог стра­ницы.

sed -i 's/https:\/\/wiki.archlinux.org\/title\/Installation_guide/https:\/\/wiki.archlinux.org\/title\/Installation_guide\(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)/' /mnt/usb/usr/local/bin/Installation_guide
 

Ставим пакеты

Спи­сок пакетов берем из нас­тро­ек офи­циаль­ного обра­за.

Ко­ман­да уста­нов­ки:

pacstrap -c -G -M -C $ARCHISO/pacman.conf -- /mnt/usb

Для пар­синга спис­ка пакетов подой­дет такая коман­да:

grep -v '^#' $ARCHISO/packages.x86_64 | tr '\n' ' ' | xargs pacstrap -c -G -M -C $ARCHISO/pacman.conf -- /mnt/usb

$ grep -v '^#' packages.x86_64 | tr '\n' ' ' | xargs pacstrap -c -G -M -C pacman.conf -- /mnt/usb
...
...
...
(14/16) Reloading system bus configuration...
Skipped: Running in chroot.
(15/16) Warn about old perl modules
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_MESSAGES = "ru_RU.UTF-8",
LANG = "ru_RU.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
(16/16) Updating the info directory file...

Ес­ли про­цесс закон­чился такими стро­ками, мож­но идти даль­ше. Если нет — пос­мотри, вер­но ли выпол­нил каж­дое дей­ствие.

 

Докручиваем настройки

Ос­новная часть уста­нов­ки сов­пада­ет с тем, что написа­но в офи­циаль­ной вики.

Но что­бы было удоб­нее поль­зовать­ся этой стать­ей, я поз­волю себе пов­торить часть дей­ствий из офи­циаль­ного руководс­тва.

Ге­нери­руем файл /etc/fstab для нашего обра­за — спи­сок фай­ловых сис­тем, мон­тиру­емых при заг­рузке сис­темы.

genfstab -U /mnt/usb > /mnt/usb/etc/fstab

Пе­рехо­дим в chroot. Это поз­волит изо­лиро­вать про­цесс от осталь­ной сис­темы и соз­даст вир­туаль­ную сре­ду, в которой про­цесс может вес­ти себя, как буд­то он работа­ет в отдель­ной сис­теме.

Пос­ле выпол­нения этой коман­ды текущий про­цесс и все его дочер­ние про­цес­сы будут работать в изо­лиро­ван­ной сре­де, кор­невым катало­гом которой будет /mnt/usb.

arch-chroot /mnt/usb

Нам необ­ходимо отре­дак­тировать файл /etc/fstab.

Ес­ли на сис­теме, с которой ты соз­даешь образ, исполь­зует­ся раз­дел swap, то при генера­ции фай­ла /etc/fstab добавит­ся запись о мон­тирова­нии это­го раз­дела.

Не­обхо­димо отклю­чить в fstab раз­дел swap, если он там есть. Уда­ли или заком­менти­руй стро­ку, которая за него отве­чает.

vim /etc/fstab

Так­же рекомен­дую изме­нить парамет­ры мон­тирова­ния с realtime на noatime, это умень­шает количес­тво опе­раций записи на диск.

Ни­же при­мер фай­ла с вне­сен­ными изме­нени­ями, зна­чения UUID в тво­ем фай­ле будут дру­гими.

$ cat /etc/fstab
$ /dev/loop0p3
UUID=d6ef477c-8db7-4b1b-9e55-a28fefbf03c1 / ext4 rw,noatime 0 1

$ /dev/loop0p2
UUID=C963-38B9/boot vfat rw,noatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro0 2

$ /dev/sda1
#UUID=8ac5fbc3-058e-4a18-a084-e68b52c1af46 none swap defaults0 0

Ус­танови свою вре­мен­ную зону.

ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime

Файл /etc/locale.gen содер­жит спис­ки дос­тупных локали­заций сис­темы, рекомен­дую оста­вить эти две:

en_US.UTF-8 UTF-8
ru_RU.UTF-8 UTF-8

Сге­нери­руй фай­лы локали­зации.

locale-gen

Ус­танови обще­сис­темное зна­чение перемен­ной LANG.

echo LANG=ru_RU.UTF-8 > /etc/locale.conf

Ус­танови шрифт и парамет­ры изме­нения рас­клад­ки.

В файл /etc/vconsole.conf запиши:

KEYMAP=ru
FONT=cyr-sun16

info

Не­кото­рые из манипу­ляций, опи­сан­ных в этом раз­деле, мож­но про­делать сра­зу с катало­гом archiso, тог­да при уста­нов­ке будет мень­ше дей­ствий.

 

Ставим загрузчики

На­чать надо с соз­дания на­чаль­ного заг­рузоч­ного дис­ка сис­темы.

От­редак­тируй файл пре­дус­танов­ки /etc/mkinitcpio.d/linux.preset.

Мы будем исполь­зовать стан­дар­тный файл нас­тро­ек mkinitcpio, так что изме­ни стро­ку, ука­зыва­ющую на кон­фиг.

vim /etc/mkinitcpio.d/linux.preset
$ mkinitcpio preset file for the 'linux' package on archiso
PRESETS=('archiso')
ALL_kver='/boot/vmlinuz-linux'
archiso_config='/etc/mkinitcpio.conf'
archiso_image="/boot/initramfs-linux.img"

От­редак­тируй файл нас­тро­ек mkinitcpio. В парамет­ре HOOKS необ­ходимо убрать autodetect.

vim /etc/mkinitcpio.conf
...
HOOKS=(base udev microcode modconf kms keyboard keymap consolefont block filesystems fsck)
...

Пе­ресоз­дай образ initcpio.

info

Об­раз mkinitcpio в Arch Linux — это сге­нери­рован­ный скрип­том mkinitcpio образ, который содер­жит все необ­ходимые для заг­рузки и ини­циали­зации сис­темы фай­лы и скрип­ты. Этот образ исполь­зует­ся в про­цес­се заг­рузки сис­темы, ког­да ядро Linux заг­ружа­ется, но перед тем, как пол­ностью ини­циали­зиро­вать сис­тему и передать управле­ние поль­зователь­ско­му прос­транс­тву.

mkinitcpio -P

$ mkinitcpio -P
==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'archiso'
...
==> Initcpio image generation successful

Ус­танав­лива­ем заг­рузчик для сис­тем с BIOS. Он ста­вит­ся в начало дис­ка, для это­го мы и соз­давали пер­вый раз­дел.

Об­рати вни­мание: в коман­де ука­зан диск, а не раз­дел дис­ка!

grub-install --target=i386-pc --recheck /dev/loop0

$ grub-install --target=i386-pc --recheck /dev/loop0
Вы­пол­няет­ся уста­нов­ка для плат­формы i386-pc.
Ус­танов­ка завер­шена. Оши­бок нет.

Ус­танав­лива­ем заг­рузчик для сис­тем с EFI.

grub-install --target=x86_64-efi --efi-directory /boot --recheck --removable

$ grub-install --target=x86_64-efi --efi-directory /boot --recheck --removable
Вы­пол­няет­ся уста­нов­ка для плат­формы x86_64-efi.
Ус­танов­ка завер­шена. Оши­бок нет.

Соз­даем файл с нас­трой­ками заг­рузчи­ка.

grub-mkconfig -o /boot/grub/grub.cfg

$ grub-mkconfig -o /boot/grub/grub.cfg
Ге­нери­рует­ся файл нас­трой­ки grub …
Най­ден образ linux: /boot/vmlinuz-linux
Най­ден образ initrd: /boot/intel-ucode.img /boot/amd-ucode.img /boot/initramfs-linux.img
Пре­дуп­режде­ние: os-prober не будет запущен для обна­руже­ния дру­гих заг­рузоч­ных раз­делов.
Их сис­темы не будут добав­лены в заг­рузоч­ные нас­трой­ки GRUB.
Проч­тите докумен­тацию на параметр GRUB_DISABLE_OS_PROBER.
До­бав­ляет­ся эле­мент заг­рузоч­ного меню для нас­тро­ек мик­ропрог­раммы UEFI …
Found memtest86+ image: /boot/memtest86+/memtest.bin
/usr/bin/grub-probe: пре­дуп­режде­ние: неиз­вес­тный тип устрой­ства loop0.
Found memtest86+ EFI image: /boot/memtest86+/memtest.efi
/usr/bin/grub-probe: пре­дуп­режде­ние: неиз­вес­тный тип устрой­ства loop0.
за­вер­шено

Как ты уже понял, мы уста­нови­ли два заг­рузчи­ка, и оба они обра­щают­ся к одно­му кон­фигура­цион­ному фай­лу.

В офи­циаль­ном ISO-обра­зе Arch Linux исполь­зует­ся заг­рузчик Syslinux. Мож­но было бы исполь­зовать и его, это дело вку­са. Я выб­рал более прос­той в нас­трой­ке вари­ант.

 

Настраиваем журналирование

Что­бы умень­шить количес­тво обра­щений к дис­ку, нас­тра­иваем жур­налиро­вание в опе­ратив­ную память, а не на диск.

Соз­даем каталог:

mkdir -p /etc/systemd/journald.conf.d

За­писы­ваем нас­трой­ки ниже в файл /etc/systemd/journald.conf.d/10-volatile.conf:

[Journal]
Storage=volatile
SystemMaxUse=16M
RuntimeMaxUse=32M
 

Дополнительное действие

При соз­дании ISO-обра­за дис­ка при помощи mkarchiso часть нас­тро­ек дела­ется при помощи «хуков» (сце­нари­ев коман­дной стро­ки) менед­жера пакетов pacman. Эти хуки уда­ляют­ся при соз­дании ISO.

Так как мы собира­ем образ сами, нам нуж­но уда­лить некото­рые хуки вруч­ную.

rm -v -- $(grep -Frl 'remove from airootfs' /etc/pacman.d/hooks/)
 

Задаем пароль рута (необязательно)

По умол­чанию пароль для root отсутс­тву­ет, ты можешь уста­новить свой. При заг­рузке про­исхо­дит авто­мати­чес­кий вход с логином root.

SSH-дос­туп для root тоже открыт по умол­чанию.

passwd

$ passwd
Но­вый пароль:
Пов­торите ввод нового пароля:
passwd: пароль успешно обновлён

Еще мож­но соз­дать обыч­ного поль­зовате­ля.

 

Образ готов, демонтируем устройства

Вы­ходим из chroot.

exit

Раз­монти­руем раз­делы в обратной пос­ледова­тель­нос­ти.

umount /mnt/usb/boot
umount /mnt/usb

Де­акти­виру­ем при­вяз­ку устрой­ства loop к фай­лу usb.img.

losetup -D
 

Пишем образ на флешку

Вни­мание! Если до это­го момен­та ты еще не сло­мал свою сис­тему, то сей­час будет отличный шанс. Так что будь пре­дель­но осто­рожен.

www

Де­таль­ное опи­сание записи обра­за есть в офи­циаль­ной вики.

Под­клю­чаем USB-носитель к сис­теме и набира­ем коман­ду

lsblk -piaf

Ищем USB-носитель в спис­ке, запоми­наем номер.

И записы­ваем на него образ. В ука­зан­ной ниже коман­де поменяй зна­чение парамет­ра of=/dev/sdX (вмес­то X под­ставь бук­ву тво­его дис­ка).

dd if=usb.img of=/dev/sdX bs=4096 status=progress && sync

Вы­ходи из окру­жения root:

exit
 

Тестируем образ в QEMU (необязательно)

Что­бы про­верить, как работа­ет наш образ, мы можем запус­тить его в эму­лято­ре.

Да­лее в этом раз­деле пред­полага­ется, что у тебя уста­нов­лены эти пакеты:

qemu-base tigervnc openbsd-netcat

За­пус­тить вир­туаль­ную машину из соз­данно­го обра­за ты можешь такой коман­дой:

qemu-system-x86_64 -drive file=usb.img,format=raw -m 1024 -enable-kvm -monitor unix:/tmp/monitor.sock,server,nowait

VNC server running on 127.0.0.1:5901

Под­клю­чить­ся к вир­туаль­ной машине мож­но, исполь­зуя любой кли­ент VNC.

В слу­чае с TigerVNC коман­да под­клю­чения будет сле­дующей:

vncviewer 127.0.0.1:5901

TigerVNC Viewer v1.13.1
Сбор­ка от: 2024-01-20 02:29
Copyright (C) 1999-2022, TigerVNC Team и мно­гие дру­гие (см. README.rst)
Ин­форма­ция о TigerVNC на сай­те https://www.tigervnc.org
...

Для под­клю­чения к кон­соли управле­ния вир­туаль­ной машины можешь исполь­зовать, нап­ример, nc.

nc -U /tmp/monitor.sock

QEMU 9.0.0 monitor - type 'help' for more information
(qemu)

 

Выводы

У нас есть файл с уста­новоч­ным обра­зом сис­темы, который мож­но записать на любые носите­ли. Но самое глав­ное — заг­рузив­шись с него, ты смо­жешь ста­вить в сис­тему допол­нитель­ные пакеты и делать любые нас­трой­ки, нуж­ные для тво­их задач.

Я взял флеш­ку на 4 Гбайт, и пос­ле всех дей­ствий на ней оста­лось 1,2 Гбайт сво­бод­ного мес­та.

 

Бонус

Этот метод соз­дания обра­за дис­ка уни­вер­сален, его мож­но исполь­зовать с раз­ными кон­фигура­циями Archiso. Нап­ример, с Сtlos, одной из оте­чес­твен­ных сбо­рок Arch Linux.

Ав­тор Сtlos исполь­зует собс­твен­ный репози­торий для некото­рых пакетов, на стра­нице про­екта есть инс­трук­ция по его под­клю­чению.

В качес­тве аль­тер­нативы мож­но отре­дак­тировать файл pacman.conf (из катало­га с нас­трой­ками), ука­зав в нем допол­нитель­ный ре­пози­торий и отклю­чив про­вер­ку под­писи пакетов.

Вот в качес­тве при­мера фраг­мент изме­нен­ного фай­ла pacman.conf:

...
[ctlos_repo]
SigLevel = Optional TrustAll
Server = https://github.com/ctlos/$repo/raw/master/$arch
Server = https://osdn.net/projects/ctlos/storage/$repo/$arch
Server = https://cvc.keybase.pub/$repo
#Include = /etc/pacman.d/ctlos-mirrorlist
[ctlos-aur]
SigLevel = Optional TrustAll
Server = https://github.com/ctlos/$repo/raw/master/$arch
Server = https://osdn.net/projects/ctlos/storage/$repo/$arch
Server = https://cvc.keybase.pub/$repo
#Include = /etc/pacman.d/ctlos-mirrorlist

Важ­ный момент: кло­ниро­вать уда­лен­ный репози­торий луч­ше из‑под root, пос­коль­ку все фай­лы в катало­ге с нас­трой­ками дол­жны при­над­лежать руту.

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    5 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии