مقدمه
در این مقاله ما یک سیستم لینوکس Arch barebones را بر روی سروری که در حال حاضر یک سیستم عامل از RAM یا یک ISO زنده اجرا میکند نصب میکنیم. تا زمانی که دیسک های مورد نظر استفاده نمی شوند، هر توزیع لینوکس کار خواهد کرد. برای این آموزش من از سرور Hetzner Cloud که در Rescue System بوت شده است استفاده خواهم کرد.
اطلاعات مهم
این آموزش به شما نیاز دارد تا دستورات را در chroot های مختلف اجرا کنید. این به ما این امکان را می دهد که دایرکتوری ریشه ظاهری خود را به یک مکان جدید هدایت کنیم و دستورات را طوری اجرا کنیم که گویی سیستم را بوت کرده ایم.
هر زمان که به یک روت جدید تبدیل شدیم به شما اطلاع خواهم داد. من همچنین از متن prompt برای نشان دادن اینکه در حال حاضر در کدام chroot هستیم استفاده خواهم کرد.
- root@rescue ~ # <cmd> فرمانی را نشان میدهد که بدون chroot اجرا میشود
- [root@bootstrap /]# <cmd> داخل محیط بوت استرپ خواهد بود
- [root@chroot /]# <cmd> داخل نصب Arch Linux روی دیسک است
مرحله 1 – راه اندازی محیط بوت استرپ
ما با دریافت تصویر بوت استرپ فعلی از یک آینه Arch Linux قابل اعتماد شروع خواهیم کرد. این ابزار ابزار لازم برای نصب قوس را در اختیار ما قرار می دهد. در حالی که ما در آن هستیم، امضای مربوطه را نیز دریافت می کنیم و قبل از ادامه نصب، تصویر را تأیید می کنیم.
root@rescue ~ # curl -LO 'https://geo.mirror.pkgbuild.com/iso/latest/archlinux-bootstrap-x86_64.tar.zst'
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 164M 100 164M 0 0 115M 0 0:00:01 0:00:01 --:--:-- 115M
root@rescue ~ # curl -LO 'https://archlinux.org/iso/latest/archlinux-bootstrap-x86_64.tar.zst.sig'
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 331 100 331 0 0 4728 0 --:--:-- --:--:-- --:--:-- 4728
root@rescue ~ # gpg --keyserver keyserver.ubuntu.com --keyserver-options auto-key-retrieve --verify archlinux-bootstrap-x86_64.tar.zst.sig
gpg: Signature made Sun 01 Sep 2024 02:43:27 PM CEST
gpg: using EDDSA key 3E80CA1A8B89F69CBA57D98A76A5EF9054449A5C
gpg: issuer "[email protected]"
gpg: key 7F2D434B9741E8AC: public key "Pierre Schmitz <[email protected]>" imported
gpg: key 76A5EF9054449A5C: public key "Pierre Schmitz <[email protected]>" imported
gpg: Total number processed: 2
gpg: imported: 2
gpg: no ultimately trusted keys found
gpg: Good signature from "Pierre Schmitz <[email protected]>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 3E80 CA1A 8B89 F69C BA57 D98A 76A5 EF90 5444 9A5C
هنگامی که خطایی رخ نمی دهد، می توانیم به باز کردن بسته بندی تصویر برویم.
root@rescue ~ # tar xf archlinux-bootstrap-x86_64.tar.zst
tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.security.capability'
tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.security.capability'
پس از استخراج، ما باید دایرکتوری را روی خود متصل کنیم. ما این کار را انجام می دهیم تا پک استرپ فکر نکند فضایی روی این دستگاه باقی نمانده است.
root@rescue ~ # mount --bind root.x86_64 root.x86_64
مرحله 2 – راه اندازی دیسک بوت و راه اندازی آرچ لینوکس
از اینجا به بعد باید از داخل محیط بوت استرپ که به تازگی راه اندازی کردیم کار کنیم. ما این کار را با استفاده از arch-chroot انجام می دهیم
root@rescue ~ # ./root.x86_64/usr/bin/arch-chroot root.x86_64
ابتدا باید دیسک خود را پارتیشن بندی کنیم. من قصد دارم از gdisk در اینجا استفاده کنم، اما شما همچنین می توانید از هر ابزار پارتیشن بندی با قابلیت GPT دیگری استفاده کنید. با این حال gdisk در تصویر بوسترپ نصب نشده است. برای انجام این کار ابتدا باید یک آینه را پیکربندی کنیم و کلید pacman را تنظیم کنیم و سپس gdisk را نصب کنیم:
[root@bootstrap /]# echo 'Server = https://geo.mirror.pkgbuild.com/$repo/os/$arch' > /etc/pacman.d/mirrorlist
[root@bootstrap /]# pacman-key --init
gpg: /etc/pacman.d/gnupg/trustdb.gpg: trustdb created
gpg: no ultimately trusted keys found
gpg: starting migration from earlier GnuPG versions
gpg: porting secret keys from '/etc/pacman.d/gnupg/secring.gpg' to gpg-agent
gpg: migration succeeded
==> Generating pacman master key. This may take some time.
gpg: Generating pacman keyring master key...
gpg: directory '/etc/pacman.d/gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/etc/pacman.d/gnupg/openpgp-revocs.d/AFB2F3A83C28CC51C20E0752282AC1A0C5C2A266.rev'
gpg: Done
==> Updating trust database...
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
[root@bootstrap /]# pacman-key --populate archlinux
==> Appending keys from archlinux.gpg...
==> Locally signing trusted keys in keyring...
-> Locally signed 5 keys.
==> Importing owner trust values...
gpg: setting ownertrust to 4
gpg: setting ownertrust to 4
gpg: setting ownertrust to 4
gpg: inserting ownertrust of 4
gpg: setting ownertrust to 4
==> Disabling revoked keys in keyring...
-> Disabled 45 keys.
==> Updating trust database...
gpg: Note: third-party key signatures using the SHA1 algorithm are rejected
gpg: (use option "--allow-weak-key-signatures" to override)
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 1 signed: 5 trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: depth: 1 valid: 5 signed: 101 trust: 0-, 0q, 0n, 5m, 0f, 0u
gpg: depth: 2 valid: 77 signed: 22 trust: 77-, 0q, 0n, 0m, 0f, 0u
gpg: next trustdb check due at 2024-11-09
[root@bootstrap /]# pacman --noconfirm -Sy gdisk
اکنون می توانیم به پارتیشن بندی دیسک خود ادامه دهیم. سرورهای ابری Hetzner فقط با یک دیسک متصل ارسال می شوند و این دیسک /dev/sda نامیده می شود. نام دیسک شما ممکن است متفاوت باشد، بنابراین مطمئن شوید که دستور را مطابق با آن تنظیم کنید. لطفاً توجه داشته باشید که این کار همه پارتیشنها را حذف میکند و بنابراین دادههای موجود در آنجا را بیفایده میکند.
پارتیشن بندی ما در اینجا بسیار ساده است. حداقل ما به یک پارتیشن بوت (با اندازه 1 مگابایت) و یک پارتیشن ریشه (بقیه درایو در مورد ما) نیاز داریم.
[root@bootstrap /]# gdisk /dev/sda
GPT fdisk (gdisk) version 1.0.10
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): y
Command (? for help): n
Partition number (1-128, default 1):
First sector (34-40001502, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-40001502, default = 39999487) or {+-}size{KMGTP}: +1M
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): ef02
Changed type of partition to 'BIOS boot partition'
Command (? for help): n
Partition number (2-128, default 2):
First sector (34-40001502, default = 4096) or {+-}size{KMGTP}:
Last sector (4096-40001502, default = 39999487) or {+-}size{KMGTP}:
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sda.
The operation has completed successfully.
سپس پارتیشن ریشه خود را با فایل سیستم ext4 فرمت می کنیم:
[root@bootstrap /]# mkfs.ext4 /dev/sda2
mke2fs 1.47.1 (20-May-2024)
/dev/sda2 contains a vfat file system
Proceed anyway? (y,N) y
Discarding device blocks: done
Creating filesystem with 4999424 4k blocks and 1250928 inodes
Filesystem UUID: c14d23b8-5754-49bc-bc27-d1cb48bd76e3
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
سپس آن را به /mnt سوار می کنیم و fstab خود را از آن تولید می کنیم:
[root@bootstrap /]# mount /dev/sda2 /mnt
[root@bootstrap /]# genfstab -U /mnt >> /etc/fstab
اکنون می توانیم Arch Linux را از طریق pacstrap نصب کنیم. ما از این فرصت برای نصب OpenSSH استفاده خواهیم کرد، زیرا بعداً برای اتصال به سرور خود به آن نیاز خواهیم داشت. این ممکن است بسته به سرعت اتصال اینترنت و دیسک شما کمی طول بکشد.
[root@bootstrap /]# pacstrap -G -M /mnt base grub linux linux-firmware openssh
==> Creating install root at /mnt
==> Installing packages to /mnt
:: Synchronizing package databases...
core 117.2 KiB 514 KiB/s 00:00 [########################################] 100% extra 7.4 MiB 37.0 MiB/s 00:00 [########################################] 100%resolving dependencies...
:: There are 2 providers available for libxtables.so=12-64:
:: Repository core
1) iptables 2) iptables-nft
Enter a number (default=1):
:: There are 3 providers available for initramfs:
:: Repository core
1) mkinitcpio
:: Repository extra
2) booster 3) dracut
Enter a number (default=1):
looking for conflicting packages...
[...]
Total Download Size: 520.45 MiB
Total Installed Size: 992.49 MiB
[...]
(13/13) Reloading system bus configuration...
Skipped: Running in chroot.
مرحله 3 – نصب نهایی آرچ لینوکس
اکنون میتوانیم از محیط بوت استرپ خارج شویم و ریشه را به سیستم نصب شده تغییر دهیم تا راهاندازی تمام شود:
[root@bootstrap /]# exit
root@rescue ~ # ./root.x86_64/usr/bin/arch-chroot root.x86_64/mnt
ما دوباره با پیکربندی یک آینه و مقداردهی اولیه کلید pacman شروع می کنیم:
[root@chroot /]# echo 'Server = https://geo.mirror.pkgbuild.com/$repo/os/$arch' > /etc/pacman.d/mirrorlist
[root@chroot /]# pacman-key --init
[root@chroot /]# pacman-key --populate archlinux
اکنون نوبت به نصب بوت لودر در درایو خود رسیده است
[root@chroot /]# grub-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.
[root@chroot /]# grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-linux
Found initrd image: /boot/initramfs-linux.img
Found fallback initrd image(s) in /boot: initramfs-linux-fallback.img
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
Adding boot menu entry for UEFI Firmware Settings ...
done
شبکه توسط systemd-networkd مدیریت خواهد شد. برای فعال کردن باید فایل /etc/systemd/network/ether.network را با محتوای زیر ایجاد کنیم:
cat << EOF > /etc/systemd/network/ether.network
[Match]
Type=ether
[Network]
DHCP=yes
EOF
این همه رابط های شبکه اترنت را برای DHCP پیکربندی می کند.
اکنون خدمات مورد نیاز را فعال می کنیم:
[root@chroot /]# systemctl enable systemd-networkd
Created symlink '/etc/systemd/system/dbus-org.freedesktop.network1.service' → '/usr/lib/systemd/system/systemd-networkd.service'.
Created symlink '/etc/systemd/system/multi-user.target.wants/systemd-networkd.service' → '/usr/lib/systemd/system/systemd-networkd.service'.
Created symlink '/etc/systemd/system/sockets.target.wants/systemd-networkd.socket' → '/usr/lib/systemd/system/systemd-networkd.socket'.
Created symlink '/etc/systemd/system/sysinit.target.wants/systemd-network-generator.service' → '/usr/lib/systemd/system/systemd-network-generator.service'.
Created symlink '/etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service' → '/usr/lib/systemd/system/systemd-networkd-wait-online.service'.
[root@chroot /]# systemctl enable systemd-resolved
Created symlink '/etc/systemd/system/dbus-org.freedesktop.resolve1.service' → '/usr/lib/systemd/system/systemd-resolved.service'.
Created symlink '/etc/systemd/system/sysinit.target.wants/systemd-resolved.service' → '/usr/lib/systemd/system/systemd-resolved.service'.
در نهایت ما می خواهیم از طریق SSH به سیستم خود دسترسی داشته باشیم. برای این کار به سادگی یک فایل کلیدهای مجاز در /root/.ssh/authorized_keys ایجاد کنید و کلید SSH عمومی خود را در آن بنویسید. فراموش نکنید که sshd را فعال کنید در غیر این صورت سرور SSH پس از راه اندازی مجدد راه اندازی نمی شود.
[root@chroot /]# mkdir /root/.ssh
[root@chroot /]# echo "<your-ssh-pub-key>" >> /root/.ssh/authorized_keys
[root@chroot /]# systemctl enable sshd
Created symlink '/etc/systemd/system/multi-user.target.wants/sshd.service' → '/usr/lib/systemd/system/sshd.service'.
اکنون می توانیم از chroot خارج شده و سیستم خود را راه اندازی مجدد کنیم. پس از چند ثانیه سرور شما باید در آرچ لینوکس تازه نصب شده خود راه اندازی شود و از طریق SSH در پورت 22 با استفاده از کلید عمومی شما قابل دسترسی باشد.
نتیجه
تبریک می گویم! اکنون حداقل نصب Arch Linux را روی سرور خود دارید. از اینجا به بعد می توانید شروع به نصب سرویس های اضافی مانند Docker، nginx، K8S و غیره کنید.