Skip to content

Instantly share code, notes, and snippets.

@antoniordo
Last active May 3, 2021 20:39
Show Gist options
  • Save antoniordo/78d5abb2426fba5f61faca345d5f00c7 to your computer and use it in GitHub Desktop.
Save antoniordo/78d5abb2426fba5f61faca345d5f00c7 to your computer and use it in GitHub Desktop.
RemovidoOpera, adicionado iotop, configurado limite máximo de área de memória virtual.
#!/usr/bin/env bash
#-----------------------------------------------------------------------------------------------------------------------
# Este script configura e instala um Arch Linux voltado para desenvolvimento com ambiente gráfico com Xorg e Gnome,
# incluíndo suporte a: Java, Python, NodeJs, entre outras.
#-----------------------------------------------------------------------------------------------------------------------
# Baixando o script:
# curl -L -o /root/arch-configurar.sh 'http://bit.ly/arch-configurar'
#-----------------------------------------------------------------------------------------------------------------------
# Ele é dividido e deve ser executado em três etapas que seguem:
# * Primeira etapa (configuração)
# Editar o script baixado e configurar as variáveis de ambiente na seção Configurações da instalação e salvar:
# vim /root/arch-configurar.sh
# * Segunda Etapa (instalação do sistema base):
# bash /root/arch-configurar.sh
# * Terceira Etapa (instalação dos pacotes e configurações):
# O script termina a etapa anterior fazendo chroot do Archiso, etão basta executá-lo novamente com o comando:
# bash /root/arch-configurar.sh
# Ao final basta reiniciar a máquina.
#-----------------------------------------------------------------------------------------------------------------------
set -e
#=======================================================================================================================
# Configurações da instalação
#=======================================================================================================================
# Nome do host do pc na rede (equerido)
NOME_HOST=""
# Usuário principal a ser criado e configurado durante a instação
USUARIO_PRINCIPAL=""
# Lingua principal e codigicação "pt_BR.UTF-8" (Brasil) "en_US.UTF-8" (Estados Unidos)
LINGUA_PRINCIPAL="pt_BR.UTF-8"
# Mapa de teclado "us-acentos" (Americano) ou "br-abnt2" (Brasileiro)
KEYMAP_TECLADO="us-acentos"
# Partição raiz do sistema (udev), ex: /dev/sda2
PARTICAO_RAIZ=""
# Partição swap do sistema (udev), ex: /dev/sda3
PARTICAO_SWAP=""
# Se a cpu do computador é intel definir true, caso contrário false
TIPO_CPU_INTEL=true
# Se a cpu do computador é intel definir true, caso contrário false
TIPO_CPU_AMD=false
# Instalar Drivers da Nvidia
USAR_NVIDA=true
# Configurar Nvidia Optmus (para notebooks com placa de vídeo híbrida)
USAR_NVIDA_OPTMUS=true
# Configurar vídeo integrado da Intel
USAR_INTEL_GRAPHICS=true
# Hbilitar bluetooth
HABILITAR_BLUETOOTH=true
# Habilitar caso esteja instalando o sistema em uma máquina virtual do VirtualBox
APLICAR_CONFIGURACOES_CONVIDADO_VIRTUALBOX=false
REGIAO_HORARIO="America/Maceio"
# Valores possíveis: arch, arch-lts
KERNEL_DEFAULT="arch"
#=======================================================================================================================
function validar_necessidade_root() {
if [[ $EUID -ne 0 ]]; then
echo "Esse script deve ser executado como root!"
exit 1
fi
}
function falhar_validacao_configuracao() {
local nomeParametro=$1
echo "ATENÇÃO"
echo "Antes de prosseguir é necessário configurar o parâmetro ${nomeParametro} neste script"
echo "O script foi interrompido"
echo "Edite o script com o comando: nano $0"
exit 2
}
function validar_configuracoes_script() {
if [[ -z ${NOME_HOST} ]]; then
falhar_validacao_configuracao "NOME_HOST"
fi
if [[ -z ${USUARIO_PRINCIPAL} ]]; then
falhar_validacao_configuracao "USUARIO_PRINCIPAL"
fi
if [[ -z ${PARTICAO_RAIZ} ]]; then
falhar_validacao_configuracao "PARTICAO_RAIZ"
fi
if [[ ! -b ${PARTICAO_RAIZ} ]]; then
echo "A partição raiz ${PARTICAO_RAIZ} não existe!"
echo "O script foi interrompido"
exit 2
fi
if [[ ! -b ${PARTICAO_SWAP} ]]; then
echo "A partição swap ${PARTICAO_SWAP} não existe!"
echo "O script foi interrompido"
exit 2
fi
if ${TIPO_CPU_INTEL} && ${TIPO_CPU_AMD}; then
echo "O tipo de CPU não pode ser ao mesmo tempo TIPO_CPU_INTEL e TIPO_CPU_AMD"
echo "O script foi interrompido"
exit 2
fi
}
function validar_conectiviade_internet() {
if ping -q -c 1 -W 1 8.8.8.8 >/dev/null; then
echo "Link de internet funcionando."
else
echo "Não foi detectado contectividade de internet."
echo "O script foi interrompido."
exit 3
fi
}
function is_ambiente_archiso() {
if [[ "archiso" == "$(cat /proc/sys/kernel/hostname)" ]]; then
return 0
else
return 1
fi
}
function is_ambiente_chroot() {
if [[ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]]; then
return 0
else
return 1
fi
}
function mostrar_painel_confirmacao_configuracoes() {
clear
printf "\n==========================================================================================="
printf "\nConfiguração do Arch Linux"
printf "\n==========================================================================================="
printf "\nEste script deve ser executado após o passo chroot no guia de instalação."
printf "\n\nConfira as configurações do script antes de prosseguir:"
printf "\n--------------------------------------------------------------------------------------------"
printf "\n Descrição da configuração | Nome da variável |Valor "
printf "\n--------------------------------------------------------------------------------------------"
printf "\n Nome do host | NOME_HOST | %s" "${NOME_HOST}"
printf "\n Usuário a ser criado | USUARIO_PRINCIPAL | %s" "${USUARIO_PRINCIPAL}"
printf "\n Língua principal | LINGUA_PRINCIPAL | %s" "${LINGUA_PRINCIPAL}"
printf "\n Partição raiz | PARTICAO_RAIZ | %s" "${PARTICAO_RAIZ}"
printf "\n Partição Swap | PARTICAO_SWAP | %s" "${PARTICAO_SWAP}"
printf "\n CPU Intel? | TIPO_CPU_INTEL | %s" "${TIPO_CPU_INTEL}"
printf "\n CPU AMD? | TIPO_CPU_AMD | %s" "${TIPO_CPU_AMD}"
printf "\n Drivers Nvidia? | USAR_NVIDA | %s" "${USAR_NVIDA}"
printf "\n Configurar Nvidia Optmus? | USAR_NVIDA_OPTMUS | %s" "${USAR_NVIDA_OPTMUS}"
printf "\n Drivers gráficos Intel? | USAR_INTEL_GRAPHICS | %s" "${USAR_INTEL_GRAPHICS}"
printf "\n Habilitar Bluetooth? | HABILITAR_BLUETOOTH | %s" "${HABILITAR_BLUETOOTH}"
printf "\n----------------------------------------------------------------------------------------------"
printf "\n\nSe estiver tudo certo pressione enter para continuar"
printf "\nPara abortar agora pressione ctrl + c\n"
read -p ""
}
configurar_pre_chroot() {
echo "[ Preparação ] ================================================================================================"
loadkeys ${KEYMAP_TECLADO}
timedatectl set-ntp true
mv /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.backup
curl 'https://www.archlinux.org/mirrorlist/?country=BR&country=US&protocol=http&protocol=https&ip_version=4' \
| sed 's/#Server/Server/g' | tee /etc/pacman.d/mirrorlist
echo "[ Sistema Base ] =============================================================================================="
pacstrap /mnt base base-devel linux linux-firmware
echo "[ Fstab ] ====================================================================================================="
genfstab -U /mnt >> /mnt/etc/fstab
sed --in-place=.bak -e 's/relatime/noatime/g' /mnt/etc/fstab
echo "[ Chroot ] ===================================================================================================="
SOURCE="${BASH_SOURCE[0]}"
while [[ -h "$SOURCE" ]]; do
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ ${SOURCE} != /* ]] && SOURCE="$DIR/$SOURCE"
done
NOME_ESTE_ARQUIVO=$(basename "$0")
CAMINHO_COMPLETO_ESTE_SCRIPT="$( cd -P "$( dirname "$SOURCE" )" && pwd )/${NOME_ESTE_ARQUIVO}"
cp "$CAMINHO_COMPLETO_ESTE_SCRIPT" "/mnt/root/${NOME_ESTE_ARQUIVO}"
printf "\n\nATENÇÃO: CHROOT"
printf "\nAgora serã feito o Chroot, após este processo será necessário executar o script novamente para continuar"
printf "\nExecute o script com o comando: bash /root/%s" "${NOME_ESTE_ARQUIVO}"
printf "\nPressione Enter para continuar para o ambiente chrooteado...\n"
read -p ""
arch-chroot /mnt
}
configurar_pos_chroot() {
echo "[ Horário ] ==================================================================================================="
ln -sf "/usr/share/zoneinfo/${REGIAO_HORARIO}" /etc/localtime
hwclock --systohc
echo "[ Locale ] ===================================================================================================="
echo "Arquivo /etc/locale.gen"
sed -i 's/#pt_BR.UTF-8/pt_BR.UTF-8/g' /etc/locale.gen
sed -i 's/#en_US.UTF-8/en_US.UTF-8/g' /etc/locale.gen
echo "Gerar Locales"
locale-gen
echo "Arquivo /etc/locale.conf"
echo "LANG=${LINGUA_PRINCIPAL}" | tee /etc/locale.conf
echo "Arquivo /etc/vconsole.conf"
echo "KEYMAP=${KEYMAP_TECLADO}" | tee /etc/vconsole.conf
echo "[ Rede ] ======================================================================================================"
echo "Arquivo /etc/hostname"
echo "${NOME_HOST}" | tee /etc/hostname
echo "Arquivo /etc/hosts"
echo "127.0.0.1 localhost.localdomain localhost" > /etc/hosts
echo "::1 localhost.localdomain localhost" >> /etc/hosts
echo "127.0.0.1 ${NOME_HOST}.localdomain ${NOME_HOST}" >> /etc/hosts
echo "[ Inicialização/Boot ] ========================================================================================"
echo "Instalar pré-requisitos"
pacman -S --noconfirm xfsprogs
echo "Criar ramdisk do kernel"
mkinitcpio -p linux
echo "Defina uma senha para o usuário root"
passwd
if ${TIPO_CPU_INTEL}; then
echo "Instalar suporte a microde Intel"
pacman -S --noconfirm intel-ucode
fi
if ${TIPO_CPU_AMD}; then
echo "Instalar suporte a microde AMD"
pacman -S --noconfirm amd-ucode
fi
echo "Instalar bootloader"
bootctl install
echo "Arquivo /boot/loader/loader.conf"
echo "timeout 3" > /boot/loader/loader.conf
echo "default ${KERNEL_DEFAULT}" >> /boot/loader/loader.conf
echo "Arquivo /boot/loader/entries/arch.conf"
UUID_PARTICAO_RAIZ=$(blkid -o value -s UUID ${PARTICAO_RAIZ})
UUID_PARTICAO_SWAP=$(blkid -o value -s UUID ${PARTICAO_SWAP})
OPTION_PARTICAO_ROOT="resume=UUID=${UUID_PARTICAO_SWAP} root=UUID=${UUID_PARTICAO_RAIZ} rw"
OPTION_NVIDIA="nvidia nvidia-drm.modeset=1 ${OPTION_PARTICAO_ROOT}"
OPTION_NVIDIA_OPTMUS="nvidia NVreg_Mobile=1 nvidia-drm.modeset=1 ${OPTION_PARTICAO_ROOT}"
OPTIONS="${OPTION_PARTICAO_ROOT}"
if ${USAR_NVIDA}; then
OPTIONS=${OPTION_NVIDIA}
if ${USAR_NVIDA_OPTMUS}; then
OPTIONS=${OPTION_NVIDIA_OPTMUS}
fi
fi
if ${APLICAR_CONFIGURACOES_CONVIDADO_VIRTUALBOX}; then
pacman -S --noconfirm virtualbox-guest-utils virtualbox-guest-modules-arch
fi
#Arquivo de boot principal
entradaInitrdMicrocode=""
if ${TIPO_CPU_INTEL}; then
entradaInitrdMicrocode="initrd /intel-ucode.img"
elif ${TIPO_CPU_AMD}; then
entradaInitrdMicrocode="initrd /amd-ucode.img"
fi
echo "title Arch Linux" > /boot/loader/entries/arch.conf
echo "linux /vmlinuz-linux" >> /boot/loader/entries/arch.conf
echo "${entradaInitrdMicrocode}" >> /boot/loader/entries/arch.conf
echo "initrd /initramfs-linux.img" >> /boot/loader/entries/arch.conf
echo "options ${OPTIONS}" >> /boot/loader/entries/arch.conf
#Arquivo de boot kernel LTS
echo "title Arch Linux LTS Kernel" > /boot/loader/entries/arch-lts.conf
echo "linux /vmlinuz-linux-lts" >> /boot/loader/entries/arch-lts.conf
echo "${entradaInitrdMicrocode}" >> /boot/loader/entries/arch-lts.conf
echo "initrd /initramfs-linux-lts.img" >> /boot/loader/entries/arch-lts.conf
echo "options ${OPTIONS}" >> /boot/loader/entries/arch-lts.conf
echo "[ NetworkManager ] ============================================================================================"
pacman -S --noconfirm networkmanager
systemctl enable NetworkManager.service
echo "[ Criação do usuário principal ] =============================================================================="
echo "Criando usuário ${USUARIO_PRINCIPAL}"
groupadd sudo --force
useradd -m -g users -G wheel,sudo,adm,log,sys,disk,input,kvm,storage,games,audio,video,network \
-s /bin/bash ${USUARIO_PRINCIPAL}
echo "Configure a senha do usuário ${USUARIO_PRINCIPAL}"
passwd ${USUARIO_PRINCIPAL}
echo "Habilitação do sudo"
sed -i 's/#.%sudo/%sudo/g' /etc/sudoers
echo "[ Instalando pacotes base (gerais) ] =========================================================================="
pacman -S --noconfirm openssh vi vim jq wget extra/tree ntfs-3g linux-headers core/linux-lts core/linux-lts-headers \
pacman-contrib gnu-netcat exfat-utils community/bat
echo "[ Instalação do Xorg e Drivers ] =============================================================================="
echo "Xorg"
pacman -S --noconfirm xorg-server xorg-xinit
#Faz backup do xorg.conf caso exista
if [[ -f /etc/X11/xorg.conf ]]; then
mv /etc/X11/xorg.conf /etc/X11/xorg.conf.backup_instalacao
fi
if ${USAR_NVIDA}; then
echo "Driver da Nvidia"
pacman -S --noconfirm nvidia
if ! ${USAR_NVIDA_OPTMUS}; then
nvidia-xconfig
fi
fi
if ${USAR_INTEL_GRAPHICS}; then
echo "Driver Intel Graphics"
pacman -S --noconfirm xf86-video-intel
pacman -S --noconfirm mesa vulkan-intel
# Arquivo /etc/X11/xorg.conf-intel
echo 'Section "Device"' > /etc/X11/xorg.conf-intel
echo ' Identifier "Intel Graphics"' >> /etc/X11/xorg.conf-intel
echo ' Driver "intel"' >> /etc/X11/xorg.conf-intel
echo ' Option "DRI" "3" # usar DRI 2 caso tenha problemas' >> /etc/X11/xorg.conf-intel
echo ' Option "AccelMethod" "sna" # default comentar se necessário' >> /etc/X11/xorg.conf-intel
echo ' #Option "AccelMethod" "uxa" # fallback descomentar se necessário' >> /etc/X11/xorg.conf-intel
echo 'EndSection' >> /etc/X11/xorg.conf-intel
# Link colocando Intel como dispositivo de vídeo primário no xorg
ln -sf /etc/X11/xorg.conf-intel /etc/X11/xorg.conf
echo "options i915 enable_guc=2 enable_fbc=1 i915.fastboot=1" | tee /etc/modprobe.d/i915.conf
fi
if ${USAR_NVIDA_OPTMUS}; then
echo "Usando Intel e Nvidia em placas híbridas"
echo "" | tee /etc/X11/xorg.conf-nvidia
fi
echo "[ Fonts adicionais ] =========================================================================================="
pacman -S --noconfirm ttf-dejavu ttf-inconsolata ttf-fira-mono ttf-fira-sans ttf-font-awesome noto-fonts-emoji \
ttf-bitstream-vera community/ttf-jetbrains-mono
echo "[ Instalação Gnome ] =========================================================================================="
pacman -S --noconfirm gnome gnome-software
echo "Network Manager"
pacman -S --noconfirm dhclient networkmanager-openvpn networkmanager-openconnect network-manager-applet
echo "Pacotes adicionais"
pacman -S --noconfirm arc-gtk-theme firefox chromium tilix fish zsh rdesktop libxss arc-icon-theme breeze-icons \
oxygen-icons papirus-icon-theme elementary-icon-theme gnome-tweaks extra/xclip remmina \
extra/xorg-xkill gimp gthumb uget ncdu hardinfo sysbench core/krb5 hdparm fwupd \
extra/mesa-demos community/obs-studio extra/htop community/iotop
echo "Adição do comando de execução default do Gnome no startx"
echo "exec gnome-session" | tee ~/.xinitrc
echo "exec gnome-session" | tee /home/${USUARIO_PRINCIPAL}/.xinitrc
chown "${USUARIO_PRINCIPAL}" /home/${USUARIO_PRINCIPAL}/.xinitrc
echo "Habilitação do GDM"
systemctl enable gdm.service
echo "Configuração do GDM para usar o Xorg ao invés do Wayland"
sed -i 's/#WaylandEnable=false/WaylandEnable=false/g' /etc/gdm/custom.conf
echo "[ Sistema de impressão (CUPS) ] ==============================================================================="
sudo pacman -S --noconfirm cups
systemctl enable org.cups.cupsd.service
echo "[ Gerenciamento de energia ] =================================================================================="
echo "Ferramentas de gerenciamento de energia e do Gnome"
pacman -S --noconfirm acpid gnome-power-manager
echo "Habilitar o serviço de gerenciamento ACPI"
systemctl enable acpid
echo "[ Pacotes desenvolvimento ] ==================================================================================="
echo "Git"
pacman -S --noconfirm git
echo "Nodejs LTS e ferramentas"
pacman -S --noconfirm nodejs-lts-erbium yarn npm
echo "Java JDK 11 LTS"
pacman -S --noconfirm jdk11-openjdk openjdk11-src
echo "Java JDK 8 LTS"
pacman -S --noconfirm jdk8-openjdk openjdk8-src
echo "Ferramentas Java"
pacman -S --noconfirm scala community/sbt maven gradle extra/visualvm
echo "DBeaver"
pacman -S --noconfirm community/dbeaver
echo "Docker e compose"
pacman -S --noconfirm docker
pacman -S --noconfirm docker-compose
usermod -aG docker ${USUARIO_PRINCIPAL}
systemctl enable docker
echo "Vault"
pacman -S --noconfirm community/vault
echo "Ansible"
pacman -S --noconfirm community/ansible
echo "AWS CLI"
pacman -S --noconfirm aws-cli
echo "Kubernetes Ferramentas"
pacman -S --noconfirm kubectl minikube
echo "Python e ferramentas"
pacman -S --noconfirm python extra/python-pip python-virtualenv python-virtualenvwrapper
echo "Outras linguagens"
pacman -S --noconfirm go
echo "Virtualbox"
pacman -S --noconfirm virtualbox
echo "Ferramentas para virtualização"
pacman -S --noconfirm community/vagrant community/packer community/terraform
echo "VS Code"
pacman -S --noconfirm community/code
echo "[ Pacotes diversos ] =========================================================================================="
pacman -S --noconfirm psensor cpupower extra/vlc
echo "[ Configurando serviço SSH ] =================================================================================="
systemctl enable sshd
COMENTARIO_CHAVE_SSH="${USUARIO_PRINCIPAL}@$(hostname)-$(date -I)"
sudo -u ${USUARIO_PRINCIPAL} ssh-keygen -N '' -C "${COMENTARIO_CHAVE_SSH}" -f /home/${USUARIO_PRINCIPAL}/.ssh/id_rsa
echo "[ Configurando diretórios padrão de desenvolvimento ] ========================================================="
sudo -u ${USUARIO_PRINCIPAL} mkdir -p /home/${USUARIO_PRINCIPAL}/dev
sudo -u ${USUARIO_PRINCIPAL} mkdir -p /home/${USUARIO_PRINCIPAL}/dev/apps
sudo -u ${USUARIO_PRINCIPAL} mkdir -p /home/${USUARIO_PRINCIPAL}/dev/projects
sudo -u ${USUARIO_PRINCIPAL} mkdir -p /home/${USUARIO_PRINCIPAL}/dev/projects/${USUARIO_PRINCIPAL}
echo "[ Habilitar Bluetooth ] ======================================================================================="
if ${HABILITAR_BLUETOOTH}; then
sudo pacman -S --noconfirm bluez bluez-utils
systemctl enable bluetooth.service
fi
echo "[ Yay instalação ] ============================================================================================"
TEMP_DOWNLOAD_DIRECTORY=$(sudo -u $USUARIO_PRINCIPAL mktemp -d)
chmod 777 "$TEMP_DOWNLOAD_DIRECTORY"
cd "$TEMP_DOWNLOAD_DIRECTORY"
sudo -u $USUARIO_PRINCIPAL git clone https://aur.archlinux.org/yay.git
cd yay
sudo -u $USUARIO_PRINCIPAL makepkg -si
cd
rm -rf "$TEMP_DOWNLOAD_DIRECTORY"
echo "[ Configurações diversas ] ===================================================================================="
echo "Aumentar a quantidade de arquivos simultâneos abertos"
echo "fs.inotify.max_user_watches = 524288" | tee /etc/sysctl.d/max_watches.conf
echo "* soft nofile 128000" | tee -a /etc/security/limits.d/nofile.conf
echo "* hard nofile 128000" | tee -a /etc/security/limits.d/nofile.conf
echo "Aumentar limite máximo de área de memória virtual"
sudo sysctl -w vm.max_map_count=262144
echo "Configuração do Tilix para o bash"
BASH_RC_USUARIO_PRINCIPAL="/home/$USUARIO_PRINCIPAL/.bashrc"
sudo -u $USUARIO_PRINCIPAL touch $BASH_RC_USUARIO_PRINCIPAL
echo 'if [ $TILIX_ID ] || [ $VTE_VERSION ]; then' >> $BASH_RC_USUARIO_PRINCIPAL
echo ' source /etc/profile.d/vte.sh' >> $BASH_RC_USUARIO_PRINCIPAL
echo 'fi' >> $BASH_RC_USUARIO_PRINCIPAL
echo "Instalação do Oh My ZSH para o usuário $USUARIO_PRINCIPAL"
URL_SCRIPT_OHMYZSH='https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh'
CHSH='no' RUNZSH='no' sudo -u $USUARIO_PRINCIPAL sh -c "$(curl -fsSL ${URL_SCRIPT_OHMYZSH})"
echo "Configuração do Tilix para o zsh"
ZSH_RC_USUARIO_PRINCIPAL="/home/$USUARIO_PRINCIPAL/.zshrc"
sudo -u $USUARIO_PRINCIPAL touch $ZSH_RC_USUARIO_PRINCIPAL
echo 'if [ $TILIX_ID ] || [ $VTE_VERSION ]; then' >> $ZSH_RC_USUARIO_PRINCIPAL
echo ' source /etc/profile.d/vte.sh' >> $ZSH_RC_USUARIO_PRINCIPAL
echo 'fi' >> $ZSH_RC_USUARIO_PRINCIPAL
echo "==============================================================================================================="
echo "Concluído pós chroot."
echo "Reinicie o sistema."
echo "==============================================================================================================="
}
function main() {
validar_necessidade_root
validar_configuracoes_script
validar_conectiviade_internet
mostrar_painel_confirmacao_configuracoes
if ! is_ambiente_chroot; then
configurar_pre_chroot
else
configurar_pos_chroot
fi
echo "Concluído."
}
# [ Execução ] =========================================================================================================
main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment