#!/bin/bash system_identify() { if [[ $VM ]]; then UCODE='' elif grep -q 'AuthenticAMD' /proc/cpuinfo; then UCODE="amd-ucode" export AMD="YES" elif grep -q 'GenuineIntel' /proc/cpuinfo; then UCODE="intel-ucode" export INTEL="YES" fi if grep -qi 'apple' /sys/class/dmi/id/sys_vendor; then modprobe -r -q efivars export MAC="YES" else modprobe -q efivarfs export MAC="NO" fi if [[ -d /sys/firmware/efi/efivars ]]; then export SYS="UEFI" grep -q /sys/firmware/efi/efivars /proc/mounts || mount -t efivarfs efivarfs /sys/firmware/efi/efivars else export SYS="BIOS" fi } system_identify ################################### up=`ping -c 1 -q dev.victor3d.com.br` case $? in 0) echo -en "+ \033[32;1;49mInternet is available \033[0m\n";; *) echo -en "- \033[31;1;49mWarning! \033[0m\033[31;1;5mInternet not available \033[0m\n" exit;; esac local_sum=`mktemp` remote_sum=`mktemp` remote_file=`mktemp` me=`basename "$0"` echo $(md5sum $me) | awk 'BEGIN{FS=" *"}{print $1}' > $local_sum curl https://dev.victor3d.com.br/arch-install/installer > $remote_file echo $(md5sum $remote_file) | awk 'BEGIN{FS=" *"}{print $1}' > $remote_sum if cmp -s $local_sum $remote_sum ; then echo -en "+ \033[32;1;49mInstaller is updated \033[0m\n" else echo -en "- \033[31;1;49mWarning! \033[0m\033[33;1;49mInstaller is outdated \033[0m\n" read -r -p "${1:-Download new version? [Y/n]} " response case "$response" in [nN][тТ]|[nN]) echo "..." ;; *) cat $remote_file > $me rm -f $local_sum rm -f $remote_sum rm -f $remote_file echo "Run installer again..." exit ;; esac fi rm -f $local_sum rm -f $remote_sum rm -f $remote_file echo "Quick and dirty install of awesome Arch Linux" echo "Before you START, do partitioning and mount root filesystem to /mnt" read -p "Let the magic begin..." MOUNTED=$(mount | grep /mnt) if [[ $MOUNTED == '' ]]; then echo "Install root isn't mounted to /mnt" echo "fdisk -l" if [[ $SYS == 'BIOS' ]]; then echo "fdisk /dev/DEVICE" echo echo "USE ext4:" echo "mkfs.ext4 /dev/DEVICE1 - L root" echo "mount /dev/DEVICE1 /mnt" echo echo "USE btrfs:" echo "mkfs.btrfs -n 32k -L arch DEVICE1" echo "mount /dev/DEVICE1 /mnt" else #UEFI echo "cfdisk /dev/DEVICE" echo echo "USE ext4:" echo "mkfs.ext4 /dev/DEVICE1 - L root" echo "mount /dev/DEVICE1 /mnt" echo echo "USE btrfs:" echo "mkfs.btrfs -n 32k -L arch DEVICE1" echo "mount /dev/DEVICE1 /mnt" echo echo "Boot UEFI partition:" echo "mkfs.vfat -F32 -n ESP /dev/DEVICE2" echo "parted DISK set 2 esp on" echo "parted DISK set 2 boot on" echo echo "USE ZFS:" echo "parted -a opt /dev/nvme0n1" echo "print" echo "mklabel gpt" echo "mkpart primary 5MB% 512MB" echo "mkpart primary 512MB 100%" echo" set 1 boot on" echo "set 1 esp on" echo "quit" fi ZFS=$(which zfs | grep /usr/bin/zfs) if [[ $ZFS == '' ]]; then export ZFS="NO" else export ZFS="YES" fi if [[ $ZFS == 'YES' ]]; then echo "zpool create -o ashift=12 -O acltype=posixacl -O canmount=off -O dnodesize=auto -O normalization=formD -O atime=off -O xattr=sa -O mountpoint=none -R /mnt zroot /dev/nvme0n1p2 " echo "zfs create -o canmount=noauto -o mountpoint=/ zroot/rootfs" echo "zpool set bootfs=zroot/rootfs zroot" echo "zfs create zroot/rootfs/home" echo "zfs mount zroot/rootfs" echo echo "mkfs.vfat /dev/nvme0n1p1" echo "mkdir /mnt/boot" echo "mount /dev/nvme0n1p1 /mnt/boot" fi exit fi if [[ $SYS == 'UEFI' ]]; then MOUNTED_boot=$(mount | grep /mnt/boot) if [[ $MOUNTED_boot == '' ]]; then echo echo "UEFI mode, no /boot partition:" echo "mkfs.vfat -F32 -n ESP /dev/DEVICE2" echo "parted /dev/DEVICE set 2 esp on" echo "parted /dev/DEVICE set 2 boot on" echo "mkdir /mnt/boot" echo "mount /dev/DEVICE2 /mnt/boot" exit fi fi echo "System: $SYS" echo "Intel: $INTEL" echo "AMD: $AMD" echo "Macintosh: $MAC" echo "ZFS: $ZFS" DISK=$(mount | grep "/mnt type" | awk '{ print $1}') UUID=$(blkid -o value -s UUID $DISK) PART_ROOT=$(mount |grep "/mnt type" | awk '{print substr($1,6,length($1)-6)}') PART_FS=$(mount |grep "/mnt type" | awk '{print $5}') echo "Root device: $DISK" echo "UUID: $UUID" echo "Install drive: $PART_ROOT" echo "Filesystem: $PART_FS" if [[ $PART_FS == 'btrfs' ]]; then # Create subvolumes btrfs sub create /mnt/@ btrfs sub create /mnt/@home btrfs sub create /mnt/@cache btrfs sub create /mnt/@log btrfs sub create /mnt/@libvirt btrfs sub create /mnt/@home_cache btrfs sub create /mnt/@home_trash btrfs sub create /mnt/@home_downloads if [[ $SYS == 'UEFI' ]]; then BOOT=$(mount | grep "/mnt/boot type vfat" | awk '{ print $1}') umount /mnt/boot fi umount /mnt mount -o compress=zstd:6,subvol=@ $DISK /mnt if [[ $SYS == 'UEFI' ]]; then mount -o x-mount.mkdir,noatime,discard $BOOT /mnt/boot fi mount -o x-mount.mkdir,compress=zstd:6,commit=300,subvol=@home $DISK /mnt/home mount -o x-mount.mkdir,compress=zstd:6,commit=300,subvol=@cache $DISK /mnt/var/cache mount -o x-mount.mkdir,compress=zstd:6,commit=300,subvol=@log $DISK /mnt/var/log mount -o x-mount.mkdir,compress=zstd:6,commit=300,subvol=@libvirt $DISK /mnt/var/lib/libvirt/images chattr +C /mnt/var/lib/libvirt/images btrfs subvolume list -p /mnt fi while [[ $MYHOST1 == '' ]] do read -p "Hostname: " MYHOST1 done MYHOST=$(echo $MYHOST1 | tr -cd [:alnum:]) # Ставим русскую раскладку loadkeys ru # Добавим в консоль шрифт, поддерживающий кириллицу setfont cyr-sun16 #Добавляем русскую локаль sed -i 's/#ru_RU.UTF-8 UTF-8/ru_RU.UTF-8 UTF-8/g' /etc/locale.gen locale-gen export LANG=ru_RU.UTF-8 # Выбираем ближайшее зеркало для pacman sed -i '1 i\Server = http://mirror.yandex.ru/archlinux/$repo/os/$arch' /etc/pacman.d/mirrorlist pacman-key --init pacman-key --populate archlinux # pacman-key --refresh-keys --keyserver hkp://pool.sks-keyservers.net set -xe if [[ $PART_FS == 'zfs' ]]; then mkdir -p /mnt/etc/zfs zpool set cachefile=/etc/zfs/zpool.cache zroot cp /etc/zfs/zpool.cache /mnt/etc/zfs/zpool.cache fi # Установим базовые пакеты системы. pacstrap -i /mnt base base-devel linux-zen linux-firmware linux-zen-headers $UCODE --noconfirm # Дополнительные системные пакеты pacstrap -i /mnt acpi atool autoconf bind-tools cdparanoia cdrkit cmake conky cronie dialog dhcpcd dosfstools duf exfat-utils f2fs-tools fetchmail file-roller git gpart htop imagemagick inetutils links lynx man-db mc mcabber mediainfo mtools mutt namcap nano ncdu net-tools netctl networkmanager newsboat nfs-utils nmap ntfs-3g ntp odt2txt openssh p7zip pass pkgfile poppler pv ranger reflector rpmextract rsync sudo terminus-font udftools unrar w3m weechat whois wget wpa_supplicant yt-dlp zip zsh diffoscope --noconfirm # Xorg X-сервер, WM, DE и программы pacstrap -i /mnt xorg-server xorg-xinit xorg-xkill xf86-input-synaptics mesa xterm lxterminal terminator lightdm lightdm-gtk-greeter lxappearance qt5ct qt6ct geany ttf-liberation ttf-dejavu ttf-bitstream-vera ttf-font-awesome ttf-ubuntu-font-family cbatticon transmission-gtk filezilla i3lock scrot xfce4-screenshooter mpv dmenu pulseaudio pulseaudio-alsa alsa-utils thunderbird tint2 feh gpicview openbox i3-wm i3lock i3blocks i3status pcmanfm gvfs network-manager-applet volumeicon veracrypt keepassxc redshift zathura mupdf picom ffmpegthumbnailer gparted gsimplecal libreoffice-fresh libreoffice-fresh-ru firefox-i18n-ru firefox firefox-adblock-plus papirus-icon-theme udiskie capitaine-cursors xdg-user-dirs --noconfirm # Наверное не нужные # neofetch gtk-engine-murrine obconf nitrogen if [[ $PART_FS == 'btrfs' ]]; then # BTRFS Support pacstrap -i /mnt btrfs-progs snapper snap-pac --noconfirm if [[ $SYS == 'BIOS' ]]; then pacstrap -i /mnt grub-btrfs --noconfirm fi fi if [[ $INTEL == 'YES' ]]; then # PC+Intel видеокарта pacstrap -i /mnt xf86-video-intel libva-intel-driver --noconfirm fi if [[ $AMD == 'YES' ]]; then # AMD GPU pacstrap -i /mnt xf86-video-amdgpu --noconfirm fi set +xe # Работаем в chroot echo "Добавляем русскую локаль" sed -i 's/#ru_RU.UTF-8 UTF-8/ru_RU.UTF-8 UTF-8/g' /mnt/etc/locale.gen sed -i 's/#en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/g' /mnt/etc/locale.gen arch-chroot /mnt locale-gen echo "Сортировка pacman mirrorlist" arch-chroot /mnt /bin/bash -c "reflector --score 120 -l 50 -f 20 --sort rate -c RU --verbose --save /etc/pacman.d/mirrorlist" # Меняем имя компьютера (myhostname меняем на ваше): echo "$MYHOST" > /mnt/etc/hostname echo "Русифицируем нашу систему" curl https://dev.victor3d.com.br/arch-install/etc/locale.conf > /mnt/etc/locale.conf curl https://dev.victor3d.com.br/arch-install/etc/vconsole.conf > /mnt/etc/vconsole.conf echo "ZFS Repo" echo -e ' [archzfs] Server = https://archzfs.com/$repo/x86_64' >> /mnt/etc/pacman.conf arch-chroot /mnt /bin/bash -c "pacman-key -r DDF7DB817396A49B2A2723F7403BD972F75D9D76" arch-chroot /mnt /bin/bash -c "pacman-key --lsign-key DDF7DB817396A49B2A2723F7403BD972F75D9D76" arch-chroot /mnt /bin/bash -c "pacman -Syy" arch-chroot /mnt /bin/bash -c "pacman -S zfs-dkms zfs-utils --noconfirm" arch-chroot /mnt /bin/bash -c "systemctl enable zfs.target zfs-import-cache zfs-mount zfs-import.target" #### echo "Victor3D Repo" arch-chroot /mnt /bin/bash -c "pacman-key --recv-keys A02CAB5DE248D91E862A4188EE39940F4802DE3B" arch-chroot /mnt /bin/bash -c "pacman-key --lsign-key A02CAB5DE248D91E862A4188EE39940F4802DE3B" echo -e ' [victor3d_repo] Server = https://dev.victor3d.com.br/victor3d_repo/$arch' >> /mnt/etc/pacman.conf arch-chroot /mnt /bin/bash -c "pacman -Syy" #### echo "Создание mkinitcpio" #Добавим русскую локаль в консоль sed -i "s/block filesystems/block keymap filesystems/g" /mnt/etc/mkinitcpio.conf # BTRFS if [[ $PART_FS == 'btrfs' ]]; then sed -i "s/block keymap filesystems fsck/block keymap btrfs filesystems/g" /mnt/etc/mkinitcpio.conf fi # ZFS if [[ $PART_FS == 'zfs' ]]; then sed -i "s/block keymap filesystems fsck/block keymap zfs filesystems/g" /mnt/etc/mkinitcpio.conf fi if [[ $INTEL == 'YES' ]]; then # Видеокарта Intel if [[ $PART_FS == 'zfs' ]]; then sed -i "s/MODULES=()/MODULES=(zfs i915)/g" /mnt/etc/mkinitcpio.conf else sed -i "s/MODULES=()/MODULES=(i915)/g" /mnt/etc/mkinitcpio.conf fi fi # Видеокарта Nvidia #sed -i 's/MODULES=() /MODULES=(nouveau)/g' /mnt/etc/mkinitcpio.conf if [[ $AMD == 'YES' ]]; then # Видеокарта AMD if [[ $PART_FS == 'zfs' ]]; then sed -i "s/MODULES=()/MODULES=(zfs amdgpu)/g" /mnt/etc/mkinitcpio.conf else sed -i "s/MODULES=()/MODULES=(amdgpu)/g" /mnt/etc/mkinitcpio.conf fi fi arch-chroot /mnt /bin/bash -c "mkinitcpio -p linux-zen" echo "Установка загрузчика" if [[ $PART_FS == 'zfs' ]]; then arch-chroot /mnt pacman -S grub efibootmgr --noconfirm mkdir /mnt/boot/grub read -p "Добавить значение переменной GRUB_CMDLINE_LINUX_DEFAULT=zfs=zroot/rootfs" nano /mnt/etc/default/grub # GRUB_CMDLINE_LINUX_DEFAULT="zfs=zroot/rootfs" grub-mkconfig -o /mnt/boot/grub/grub.cfg grub-install --target=x86_64-efi --efi-directory=/mnt/boot else if [[ $SYS == 'BIOS' ]]; then arch-chroot /mnt pacman -S grub-bios --noconfirm arch-chroot /mnt /bin/bash -c "grub-install /dev/$PART_ROOT" arch-chroot /mnt /bin/bash -c "grub-mkconfig -o /boot/grub/grub.cfg" fi if [[ $SYS == 'UEFI' ]]; then # SystemD Boot arch-chroot /mnt /bin/bash -c "bootctl install" if [[ $INTEL == 'YES' ]]; then curl https://dev.victor3d.com.br/arch-install/boot/loader/entries/arch-intel.conf > /mnt/boot/loader/entries/arch.conf sed -i "s/\/dev\/sda3/UUID=$UUID/g" /mnt/boot/loader/entries/arch.conf fi if [[ $AMD == 'YES' ]]; then curl https://dev.victor3d.com.br/arch-install/boot/loader/entries/arch-amd.conf > /mnt/boot/loader/entries/arch.conf sed -i "s/\/dev\/sda3/UUID=$UUID/g" /mnt/boot/loader/entries/arch.conf fi if [[ $PART_FS == 'btrfs' ]]; then sed -i "s/rw/rootflags=subvol=@ rw nvme_core.default_ps_max_latency_us=0/g" /mnt/boot/loader/entries/arch.conf fi fi fi #Настраиваем сеть arch-chroot /mnt /bin/bash -c "systemctl enable dhcpcd" echo "!!! Установка пароля для ROOT" arch-chroot /mnt /bin/bash -c "passwd root" # Добавление временного пользователя arch-chroot /mnt /bin/bash -c "useradd -m -k /etc/skel -g users -G audio,games,lp,optical,power,scanner,storage,video,wheel -s /bin/bash installer" # Настраиваем временную зону: arch-chroot /mnt /bin/bash -c "ln -svf /usr/share/zoneinfo/Europe/Moscow /etc/localtime" arch-chroot /mnt /bin/bash -c "pacman -Syy --noconfirm" echo "Настройка sudo на время установки" #sed -i "s/# %wheel ALL=(ALL:ALL) ALL/%wheel ALL=(ALL:ALL) ALL/g" /mnt/etc/sudoers sed -i "s/# %wheel ALL=(ALL:ALL) NOPASSWD: ALL/%wheel ALL=(ALL:ALL) NOPASSWD: ALL/g" /mnt/etc/sudoers # LightDM arch-chroot /mnt /bin/bash -c "systemctl enable lightdm" curl https://dev.victor3d.com.br/arch-install/etc/lightdm/lightdm-gtk-greeter.conf > /mnt/etc/lightdm/lightdm-gtk-greeter.conf curl https://dev.victor3d.com.br/arch-install/etc/oblogout.conf > /mnt/etc/oblogout.conf curl https://dev.victor3d.com.br/arch-install/etc/X11/xorg.conf.d/00-keyboard.conf > /mnt/etc/X11/xorg.conf.d/00-keyboard.conf # Swappiness curl https://dev.victor3d.com.br/arch-install/etc/sysctl.d/99-swappiness.conf > /mnt/etc/sysctl.d/99-swappiness.conf # AUR # Хак чтобы работал pacman в chroot sed -i "s/CheckSpace/#CheckSpace/g" /mnt/etc/pacman.conf echo "Установка yaourt" #arch-chroot -u installer /mnt /bin/bash -c "git clone https://aur.archlinux.org/package-query.git /home/installer/package-query; cd /home/installer/package-query; makepkg" #arch-chroot /mnt /bin/bash -c "pacman -U /home/installer/package-query/package-query*.zst --noconfirm" #rm -dR /mnt/home/installer/package-query/ #arch-chroot -u installer /mnt /bin/bash -c "git clone https://aur.archlinux.org/yaourt.git /home/installer/yaourt; cd /home/installer/yaourt/; makepkg -s --noconfirm" #arch-chroot /mnt /bin/bash -c "pacman -U /home/installer/yaourt/yaourt*.zst --noconfirm" #rm -dR /mnt/home/installer/yaourt/ arch-chroot /mnt /bin/bash -c "pacman -S package-query yaourt --noconfirm" echo "Осталось немножко..." # Вернем взад настройку pacman sed -i "s/#CheckSpace/CheckSpace/g" /mnt/etc/pacman.conf set -xe echo 'export EDITOR="nano"' >> /mnt/etc/skel/.bashrc echo 'QT_QPA_PLATFORMTHEME="qt5ct"' >> /mnt/etc/environment mkdir -p /mnt/etc/skel/.Maildir/{cur,new,tmp} echo "My Themes..." arch-chroot /mnt /bin/bash -c "pacman -S arc-dark-osx-openbox-theme ui-ico ctl-themes victor3d-skel-git highsierra-backgrounds --noconfirm" echo "My Soft (AUR)" ### oblogout-py3-git FAIL arch-chroot /mnt /bin/bash -c "pacman -S oh-my-zsh-git moc-pulse obmenu2-git i3-scrot ttf-paratype ttf-ms-fonts oblogout-py3-git adeos-oblogout-git ttf-mac-fonts ca-certificates-russian-root --noconfirm" # Наверное не нужные # openbox-themes tangerine-icon-theme bunsen-themes-git faenza-icon-theme if [[ $PART_FS == 'btrfs' ]]; then # BTRFS Support arch-chroot /mnt /bin/bash -c "pacman -S btrfs-assistant --noconfirm" fi set +xe # yay install later echo "Окончательная настройка sudo" sed -i "s/# %wheel ALL=(ALL:ALL) ALL/%wheel ALL=(ALL:ALL) ALL/g" /mnt/etc/sudoers sed -i "s/%wheel ALL=(ALL:ALL) NOPASSWD: ALL/# %wheel ALL=(ALL:ALL) NOPASSWD: ALL/g" /mnt/etc/sudoers while [[ $MYUSER1 == '' ]] do read -p "Username: " MYUSER1 done MYUSER=$(echo $MYUSER1 | tr -cd [:alnum:]) echo "Настройка пользователя: $MYUSER" arch-chroot /mnt /bin/bash -c "userdel -r installer" arch-chroot /mnt /bin/bash -c "useradd -m -k /etc/skel -g users -G audio,games,lp,optical,power,scanner,storage,video,wheel -s /bin/zsh $MYUSER" echo "Установим пароль для нашего юзера" arch-chroot /mnt /bin/bash -c "passwd $MYUSER" #Добавим ему информацию GECOS: arch-chroot /mnt /bin/bash -c "chfn $MYUSER" if [[ $PART_FS == 'btrfs' ]]; then # USER subvolumes mount -o x-mount.mkdir,compress=zstd:6,commit=300,subvol=@home_cache $DISK /mnt/home/$MYUSER/.cache mount -o x-mount.mkdir,compress=zstd:6,commit=300,subvol=@home_trash $DISK /mnt/home/$MYUSER/.local/share/Trash mount -o x-mount.mkdir,compress=zstd:6,commit=300,subvol=@home_downloads $DISK /mnt/home/$MYUSER/Downloads arch-chroot /mnt /bin/bash -c "chown -R $MYUSER:users /home/$MYUSER/" fi if [[ $PART_FS == 'zfs' ]]; then umount -R /mnt zfs umount -a zpool export -a else # Генерируем fstab, используя следующую команду: genfstab -U /mnt | sed 's/relatime/noatime/' >> /mnt/etc/fstab fi echo "Все готово! Перезагрузись и кайфуй!"