removido
(usa Nenhuma)
Enviado em 31/01/2017 - 21:28h
-- Usa nix package manager, um package manager com configuração declarativa
--> Nix ( package manager ) pode ser instalado em varias distribuições e ate MacOS e ser um package manager para o usuario especifico em vez do sistema inteiro como no NixOS
-- Troca a hirearquia do FHS ( /bin /usr/bin /lib /usr/lib /usr/local/* , etcetera) por uma configuração em /nix/store (que é uma partição montada como read-only, pra evitar mudanças nos pacotes )
-- Pacotes são prefixados em /nix/store/$hashDoPacote-$pacote-$versão, voce pode ter quantos pacotes iguais (tipo firefox), em quantas versões quiser (36, 49, 51, 52, nightly, aurora), dentro de cada diretorio pro pacote ele tem uma estrutura normal com (/bin /lib /share) que tem symlink pra varios lugares que estão na _PATH_ do usuario, dependendo da configuração.
-- Configuração declarativa, em vez de ir instalando, voce configura arquivos dentro do dir /etc/nixos linguagem especifica do Nix como voce quer seu sistema, Networking, Partições pra montar, pacotes no sistema, variaveis do sistema, serviços do systemd, ativar programas, voce simplesmente da
nixos-rebuild switch e voce vai estar na nova configuração.
-- Upgrades atomicos, a mudança de configuração acontece ou não, não existe um estado que fica no meio com seu sistema mal-formado, ou o seu sistema sai na nova versão ou ele da erro e fica na versão anterior.
-- Facil retornar pra versões anteriores, caso voce consiga quebrar algo ( e vamos ser honestos voce vai conseguir quebrar algo ), simplesmente dando reboot e escolhendo uma configuração anterior no menu do Grub e voce tem seu sistema em estado funcional denovo, tambem pode rodar
nixos-rebuild switch --rollback # Volte para a configuração anterior
-- Como Nix é uma linguagem e não uma representação de Dados como em outros pacotes, é facil fazer mudanças a pacotes e criar seus propios.
Exemplos da configuração declarativa:
Tirado do website do Nix
{
boot.loader.grub.device = "/dev/sda";
fileSystems."/".device = "/dev/sda1";
services.sshd.enable = true;
}
^ Instala grub em /dev/sda, monta / (rootfs) como um device, e ativa sshd.
pequeno snippet do meu hardware-configuration.nix
boot.initrd.availableKernelModules = [ "ehci_pci" "ata_piix" "usbhid" "sd_mod" "sr_mod" ];
boot.kernelModules = [ "kvm-intel" ];
boot.extraModulePackages = [ ];
fileSystems."/" =
{ device = "/dev/disk/by-uuid/de83991b-e266-4fa2-a9e8-77007a0bf538";
fsType = "ext4";
};
^ Indica os modulos disponiveis durante a initramfs, indica os modulos (kvm-intel só nesse caso) disponiveis durante boot, e monta rootfs por uuid (pra confiança) em ext4
{ config, ... }:
{
#
# Users configuration, users on
# the system go here
#
users.extraUsers.leon = {
isNormalUser = true;
uid = 1000;
home = "/home/leon";
description = "Leon's main account";
group = "users";
extraGroups = [ "wheel" "input" "video" "disk" "audio" ];
shell = "/run/current-system/sw/bin/dash";
};
}
Isso cria um usuario chamado leon, com uid 1000, com shell dash como default, com home em /home/leon, nos grupos wheel,input,video,disk e audio.
security = {
# Enable sudo and disable password
sudo.enable = true;
sudo.wheelNeedsPassword = false;
# Hide processes from user
hideProcessInformation = true;
pam.loginLimits =
[ { domain = "@users";
type = "-";
item = "maxlogins";
value = "3";
}
];
};
}
^ Ativa sudo, esconde informação dos processos pro usuario (ele não ve processos que não são dele), e define uma regra em pam pra não deixar fazer login caso erre a senha 3 vezes pra qualquer pessoas no grupo users (leon esta nesse grupo)
nixpkgs.config.packageOverrides = pkgs: rec {
termite = pkgs.termite.override {
configFile = ./conf/termite/termite.conf;
};
rofi = pkgs.stdenv.lib.overrideDerivation pkgs.rofi (Attrs: {
nativeBuildInputs = Attrs.nativeBuildInputs ++ [ pkgs.makeWrapper ];
postInstall = ''
wrapProgram $out/bin/rofi \
--add-flags "-config /etc/nixos/conf/rofi/rofi.conf"
'';
});
neovim = pkgs.neovim.override {
vimAlias = true;
configure = {
customRC = ''
source /etc/nixos/conf/neovim/neovim.conf
'';
vam = {
pluginDictionaries = [
{ name = "vim-gitgutter"; }
{ name = "goyo"; }
{ name = "syntastic"; }
{ name = "vim-airline"; }
{ name = "vim-airline-themes"; }
{ name = "rust-vim"; }
];
};
};
};
};
}
esse é mais complicado, ele primeiro faz a função do pacote termite ( o terminal) chamar um arquivo de configuração em /etc/nixos/conf/termite.conf, depois ele muda atributos do pacote rofi e faz um wrapper ( um programa que é executado antes e faz com que o programa original inicie do jeito certo ) pra ele rodar a configuração em /etc/nixos/conf/rofi/rofi.conf, depois ele passa um .vimrc custom que esta em /etc/nixos/conf/neovim/neovim.conf e depois define varios plugins pro usuario.
services."dunst" = {
description = "Dunst notification daemon";
wantedBy = [ "default.target" ];
serviceConfig = {
ExecStart = "${pkgs.dunst}/bin/dunst";
Restart = "always";
RestartSec = "3";
};
};
};
services = {
chrony.enable = true; # Synchronize machine time
openssh.enable = false; # no ssh
udisks2.enable = false; # Security problem
printing.enable = false; # No printer
locate.enable = false;
dbus.socketActivated = true;
timesyncd.enable = false; # We use chrony
transmission.enable = true; # Our torrent
mpd.enable = true; # Enable music player daemon
compton.enable = true;
};
bem simples, ele declara um serviço pra usuario no systemd pro programa dunst (daemon de notificações), e depois eu ativo (true) e desativo (false) varios programas que eu quero ou não
enable = true; # Enable xserver
videoDrivers = [ "intel" ];
videoDriver = "i965";
useGlamor = true;
layout = "br"; # Use brazillian layout
desktopManager.xterm.enable = false; # disable xterm, we use i3
startDbusSession = true;
displayManager = {
sessionCommands = with pkgs; lib.mkAfter ''
${hsetroot}/bin/hsetroot -fill ~/share/wallpapers/AstralisLake.png &
~/.cargo/bin/rendy -m 256 -f /var/lib/mpd/music notify-send "New music placed on Music Dir" &
xrandr --output VGA1 --brightness 0.5 &
sh /etc/nixos/conf/yabar/revive.sh &
exec /run/current-system/sw/bin/2bwm
'';
slim = {
enable = true; # enable slim as our display manager
defaultUser = "leon"; # just ask for my password
theme = pkgs.fetchurl {
url = "https://github.com/edwtjo/nixos-black-theme/archive/v1.0.tar.gz";
sha256 = "13bm7k3p6k7yq47nba08bn48cfv536k4ipnwwp1q1l2ydlp85r9d";
};
};
};
};
Ativa o Xorg, com drivers da intel, na versão intel-965, com GlamorEGL, com layout br, desativa sessão do xterm e roda dbus (pra daemon de notificação), depois ele define uma corrente de comandos pra rodar durante a inicialização do usuario do >> sessionCommands >> ao >> ''; <<, e depois define leon como usuario default do SLiM (display manager) e um tema custom pra ele que é baixado da internet
ssh.startAgent = false;
# Big fish config
fish = {
enable = true;
shellAliases = {}; # Remove aliases from fish, they conflict with users
interactiveShellInit = ''
source (/run/current-system/sw/bin/autojump-share)/autojump.fish
# It's ok to hardcode here since
# it's on the same git repo and is
# expected that NixOS configuration
# is held on /etc/nixos, if not then
# it's a bug in the distribution.
for conf in /etc/nixos/conf/fish/*;
source $conf;
end
'';
shellInit = ''
set -x PATH $HOME/.cargo/bin $PATH
'';
};
};
desativa ssh e as aliases da shell FISH, ele tambem roda aquele bloco de comandos toda vez que uma sessão interativa do FISH é iniciada
environment.systemPackages = with pkgs; [
#
# Packages here are considered base system
#
# Main utilities
coreutils
# For downloads
wget
curl
# find the executable and docs
which
# Disk control
gptfdisk
parted
# manpages
man
manpages
];
Simples declaração de pacotes do sistema, como GNU Coreutils, manpages, parted, wget, etcetc
fonts = {
enableCoreFonts = true;
enableFontDir = true;
enableGhostscriptFonts = false;
fonts = with pkgs; [
tewi-font
gohufont
powerline-fonts
profont
proggyfonts
hack-font
];
};
Configura fontes e depois lista as fontes disponiveis no meu sistema
# Configuration on the system
./hardware-configuration.nix
./conf-network.nix
./conf-services.nix
./conf-users.nix
./conf-fonts.nix
./conf-environment.nix
./conf-boot.nix
./conf-nix.nix
./conf-programs.nix
./conf-security.nix
./conf-xserver.nix
./conf-pkgs.nix
# pkgs on the system
./pkgs-base.nix
./pkgs-x11.nix
./pkgs-sound.nix
./pkgs-dev.nix
./pkgs-util.nix
];
# Select internationalisation properties.
i18n = {
consoleFont = "Lat2-Terminus16";
consoleKeyMap = "br-abnt2";
defaultLocale = "en_US.UTF-8";
};
# Set your time zone.
time.timeZone = "Brazil/East";
Importa varios arquivos (imagine isso como a função main() de um programa,chamando varias funções), coloca LANG em UTF8, keymap das ttys em br-abtn2 e timezone pro brazil
with import <nixpkgs> {};
stdenv.mkDerivation {
name = "2bwm";
version = "git";
src = fetchFromGitHub {
owner = "venam";
repo = "2bwm";
rev = "222525a2c0b5535036e6eb307b60a5725b71a650";
sha256 = "1prigx7bd7jrh567qyvlm3xfkz4znlvkks0m4y8vqs8iyqzzkn94";
};
buildInputs = [ xlibs.libX11 xorg.xcbutilkeysyms xorg.xcbutilwm xcbutilxrm ];
patches = [ patches/maxwell-patches.patch ];
installFlags = "PREFIX=$(out)";
meta = {
description = "A fast floating WM written over the XCB library and derived from mcwm";
homepage = https://github.com/venam/2bwm ;
license = "isc";
};
}
Uma pequena declaração de um pacote, descreve varias coisas, nome, versão, Pegar do github, do usuario venam no repositorio 2bwm, a git revision atual (tem que atualizar quando derem update) sha256 (tem que atualizar manualmente, pra garantir integridade do pacote), buildInputs são as dependencias do pacote, se usar nativeBuildInputs as dependencias continuarão instaladas no sistema depois de compilar, patches defines (uhh) patches pro programa, installFlags muda flags durante o make, nesse caso ele muda o PREFIX pra $out, que é o local em /nix/store que o programa vai ficar, e meta define varias coisas como Homepage, uma descrição e a licença que esta o programa.
variables.GIT_EDITOR = lib.mkForce "nvim";
variables.EDITOR = lib.mkForce "nvim";
# XDG support
variables.XDG_CACHE_HOME = "$HOME/var/cache";
variables.XDG_CONFIG_HOME = "$HOME/etc";
variables.XDG_DATA_HOME = "$HOME/share";
variables.XDG_CURRENT_DESKTOP = "2bwm";
# Applications support
variables.PASSWORD_STORE_DIR = "$HOME/share/pass";
variables.WEECHAT_HOME = "$HOME/etc/weechat";
variables.GNUPGHOME = "$HOME/etc/gnupg";
# Remove polution
variables.LESSHISTFILE = "-";
variables.BROWSER = lib.mkForce "chromium";
};
seta varias variaveis do sistema.
nix = {
package = pkgs.nixUnstable;
binaryCaches = [ "http://cache.nixos.org" ];
trustedBinaryCaches = [ "http://cache.nixos.org" ];
useSandbox = true;
extraOptions = ''
auto-optimise-store = true
'';
};
nixpkgs.config = {
allowUnfree = true;
};
Define configurações do nix, usa Unstable (Rolling release), monta pacotes em uma Sandbox, optimiza a store automaticamente fazendo hardlinks entre coisas dentro de pacotes que são parecidas e no final permite usar pacotes que não tem uma licença livre.