Windows

abr. 18, 2021·
Julio Batista Silva
Julio Batista Silva
· 33 minutos de leitura
Note
Atualizado em outubro de 2024.

Instalação

Gerar um USB de instalação

Você pode baixar o Windows 10 diretamente do site da Microsoft. Selecione um pendrive de pelo menos 8GB para a ferramenta formatar e gerar um instalador bootável.

Se o erro 715-123130 aparecer, tente trocar de browser ou fazer o download através de uma VPN nos EUA.

Se baixar o ISO, verifique o hash:

PS > Get-FileHash .\Win11_22H2_EnglishInternational_x64v1.iso

Algorithm       Hash
---------       ----
SHA256          F115CD6B31734BC091BC94B964D5AD43984285BF229503481E2F7EF94AB7140E

Recomendo o Rufus para gravar a imagem. Ele tem algumas funcionalidades bem interessantes.

Particionamento

Uma instalação típica do Windows cria 4 partições:

  • EFI: 100 MB
  • MSR: 16 MB
  • Windows
  • Recovery: 500 MB a 650 MB

O valor que você deve digitar no instalador gráfico é a soma de todas essas partições. Se você quiser que seu C: mostre exatamente 250 GB, você deve usar algo um pouco maior que 256616 MB (100 + 16 + 250 * 1024 + 500).

Para ter mais controle sobre os tamanhos, você pode particionar o disco por linha de comando. Pressione Shift + F10 e use o diskpart:

diskpart
list disk
select disk 0
clean
convert gpt
create partition efi size=1024
format quick fs=fat32 label="System"
assign letter="S"
create partition msr size=16
create partition primary size=256000     -> 512000 para 500GB
format quick fs=ntfs label="Windows"
assign letter="W"
create partition primary size=1024
format quick fs=ntfs label="Recovery"
assign letter="R"
set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"
gpt attributes=0x8000000000000001
list volume
exit

Neste exemplo são criadas uma partição EFI com 1 GB e uma Recovery com 1GB.

Uma EFI com pelo menos 300 MB é recomendada para quem faz dual boot. O Linux monta essa partição como /boot e armazena os arquivos utilizados pelo bootloader, incluindo versões comprimidas do kernel e drivers (vmlinuz).

Se você já tiver uma partição EFI formatada em FAT32 antes de iniciar a instalação, o Windows irá utilizá-la em vez de criar uma nova.

Se você perceber que precisa aumentar a partição EFI depois que o Windows já está instalado, dê uma olhada no Partition Expert da Macrorit. A versão gratuita portable é capaz de redimensionar e mover as partições facilmente.

A partição MSR (Microsoft Reserved) de 16MB pode ser restaurada pelo próprio Windows (create partition msr) ou pelo código 0c01 no cgdisk.

Opções de privacidade

Uma tela de privacidade aparece no primeiro boot. Desmarque Find my device, Inking & Typing, Advertising ID, Diagnostic data, Tailored experiences e o que mais tiver para desmarcar durante a instalação.

Após iniciar o sistema, vá em Settings » Privacy. Eu desmarco quase todas as opções. O único app que precisa acessar minha câmera (que fica coberta) é o Skype.

Group Policy Editor

Execute o gpedit.msc.

  • Web search

    Entre em Local Computer Policy » Computer Configuration » Administrative Templates » Windows Components » Search e marque a opção “Do not allow web search” como Enabled.

  • BitLocker com PIN

    Navegue até Computer Configuration » Administrative Templates » Windows Components » BitLocker Drive Encryption » Operating System Drives e ative Require Additional Authentication at Startup e Allow enhanced PINs for startup.

  • Desativar o Meet Now do Skype

    Entre em User Configuration » Administrative templates » Start Menu and Taskbar e ative a policy Remove the Meet Now icon.

Regedit

  • Desativa Cortana e Bing

    Navegue até HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Windows Search e crie uma nova DWORD chamada ConnectedSearchUseWeb e atribua valor 0.

    Navegue até HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Search e crie duas novas DWORDs com valor 0: AllowSearchToUseLocation e BingSearchEnabled.

  • Usar UTC no relógio (útil para dual-booting)

    Navegue até HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation e crie uma nova DWORD chamada RealTimeIsUniversal com valor 1.

  • Mostrar/Esconder ícones no desktop

    Isso pode ser feito pela interface gráfica, portanto não recomendo fazer pelo regedit.

    Computer: {20D04FE0-3AEA-1069-A2D8-08002B30309D}
    User Files: {59031a47-3f72-44a7-89c5-5595fe6b30ee}
    Control Panel: {5399E694-6CE5-4D6C-8FCE-1D8870FDCBA0}
    Network: {F02C1A0D-BE21-4350-88B0-7367FC96EF3C}
    Recycle Bin: {645FF040-5081-101B-9F08-00AA002F954E}
    

    Exemplo:

    reg add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel /V {20D04FE0-3AEA-1069-A2D8-08002B30309D} /T REG_DWORD /D 0x0 /F
    
    reg add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\ClassicStartMenu /V {20D04FE0-3AEA-1069-A2D8-08002B30309D} /T REG_DWORD /D 0x0 /F
    
    reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel /V {20D04FE0-3AEA-1069-A2D8-08002B30309D} /T REG_DWORD /D 0x0 /F
    
    reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\ClassicStartMenu /V {20D04FE0-3AEA-1069-A2D8-08002B30309D} /T REG_DWORD /D 0x0 /F
    
  • Não mostra arquivos recentes

    reg add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer /V ShowRecent /T REG_DWORD /D 0x0 /F
    
  • Mostrar pasta do usuário na navegação do File Explorer (quick access)

    reg add HKCU\SOFTWARE\Classes\CLSID\{59031a47-3f72-44a7-89c5-5595fe6b30ee} /V System.IsPinnedToNameSpaceTree /T REG_DWORD /D 0x1 /F
    

Nome do computador

Navegue até Control Panel\System and Security\System. Na linha com o nome do computador, clique em Change settings e troque o nome do computador.

Windows Update

Atualize tudo e reinicie o computador.

Talvez a última atualização ainda não esteja disponível pelo Windows Update, mas pode ser instalada manualmente: https://www.microsoft.com/en-us/software-download/windows10.

Drivers

  • Kensington Works
  • Nvidia
  • Site do fabricante

Criptografia

  • BitLocker

    Depois de atualizar o Windows. Ative o BitLocker no driver C:/. Salve a chave de recuperação em algum lugar seguro (que não seja o próprio computador, claro).

  • VeraCrypt

    É uma alternativa open source que pode ser usada para criptografar partições inteiras ou criar containers. Mais para frente eu mostro como instalar com o Chocolatey.

Windows Features

Entre em Control Panel\Programs » Turn Windows features on or off.

  • Ative “Virtual Machine Platform”
  • Ative “Windows Hypervisor Platform” (precisa para o Docker).
  • Ative “Windows Sandbox”
  • Ative “Windows Subsystem for Linux”
  • Ative “Hyper-V” (para máquinas virtuais)

Power

Navegue até Control Panel\Hardware and Sound\Power Options\Create a Power Plan e crie um power plan baseado no High Performance com as seguintes opções (em advanced power settings):

  • Turn off hard disk after
    • On battery: 30 Minutes
    • Plugged in: Never
  • Sleep
    • Sleep after
      • On battery: 300 Minutes
      • Plugged in: Never
  • Power buttons and lid
    • Lid close action
      • On battery: Do nothing
      • Plugged in: Do nothing
    • Power button action
      • On battery: Sleep
      • Plugged in: Do nothing
  • Display
    • Turn off display after
      • On battery: 20 Minutes
      • Plugged in: 30 Minutes

Em Control Panel\Hardware and Sound\Power Options\System Settings, desmarque a opção Turn on fast start-up.

Bloqueio por inatividade

  • Screen Saver settings » Blank » 3 min » On resume, display log-on screen

Desinstale programas desnecessários

Em Add or Remove programs, desinstale o que não for usar.

Desative mensagens chatas

Entre em Control Panel\System and Security\Security and Maintenance\Change Security and Maintenance settings.

Desmarque a opção de receber mensagens sobre Windows Backup.

Gerenciadores de pacotes

TODO: https://daftdev.blog/2024/04/01/chocolatey-vs-scoop-vs-winget---which-windows-package-manager-to-use/

Os três gerenciadores de pacotes para Windows mais conhecidos são: Chocolatey, Scoop e Winget.

Winget

Esse é o gerenciador de pacotes oficial da Microsoft. Ele existe desde o final de 2019. Não é possível instalar fontes, scripts.

winget install `
  7zip.7zip `
  Bambulab.Bambustudio `
  DBBrowserForSQLite.DBBrowserForSQLite `
  dbeaver.dbeaver `
  Discord.Discord `
  Ditto.Ditto `
  Elgato.StreamDeck `
  Git.Git `
  Google.Chrome `
  Greenshot.Greenshot `
  Insomnia.Insomnia `
  Kensington.KensingtonWorks `
  MediaArea.MediaInfo.GUI `
  Microsoft.PowerShell `
  Microsoft.PowerToys `
  Microsoft.VisualStudioCode `
  Microsoft.WindowsTerminal `
  Mozilla.Firefox `
  OBSProject.OBSStudio `
  PeterDaveHello.TransmissionRemoteGUI `
  Plex.Plex `
  SlackTechnologies.Slack `
  Spotify.Spotify `
  tailscale.tailscale `
  Telegram.TelegramDesktop `
  Valve.Steam `
  Vivaldi.Vivaldi `
  VB-Audio.Voicemeeter.Banana `
  VideoLAN.VLC `
  WireGuard.WireGuard `
  Zen-Team.Zen-Browser

Winget upgrade

Para atualizar todos os programas:

winget upgrade --all --silent --accept-source-agreements --accept-package-agreements --include-unknown --disable-interactivity --force

Eu rodo uma vez em um prompt como admin e outra como usuário normal.

Como admin você precisa autorizar apenas um pop-up, porém ele apenas atualiza o que for instalado em nível de sistema. Como usuário comum você pode atualizar os programas instalados em nível de usuário.

Limpeza de histórico

Rodar no PowerShell:

# File Explorer Home
Remove-Item -Path "$env:APPDATA\Microsoft\Windows\Recent\*" -Force
Remove-Item -Path "$env:APPDATA\Microsoft\Windows\Recent\AutomaticDestinations\*" -Force
Remove-Item -Path "$env:APPDATA\Microsoft\Windows\Recent\CustomDestinations\*" -Force

# File Explorer address bar
Remove-Item -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\TypedPaths" -Force -ErrorAction SilentlyContinue

# Clear typed history in Run dialog
Remove-Item -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU" -Force -ErrorAction SilentlyContinue

Chocolatey

Update: o Chocolatey contém mais pacotes que o Winget, porém essa diferença vem diminuindo. Hoje em dia eu não uso mais o Chocolatey, portanto não manterei esta sessão atualizada.

Instale conforme as instruções mais atuais em https://chocolatey.org/install.

No PowerShell como Admin:

Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
choco install -y `
  7zip `
  calibre `
  discord `
  ditto `
  Firefox `
  git `
  GoogleChrome `
  greenshot `
  jellyfin-media-player `
  nerd-fonts-Hack `
  obs-studio `
  slack `
  spotify `
  steam `
  telegram `
  transgui `
  vlc `
  vscode `
  wireguard
choco install -y `
  ack `
  bleachbit `
  clonespy `
  Cmder `
  curl `
  darktable `
  dbeaver `
  digikam `
  docker-desktop `
  eartrumpet `
  Everything `
  FreeDownloadManager `
  gimp `
  gnupg `
  google-drive-file-stream `
  imagemagick `
  irfanview `
  jre8 `
  mariadb `
  microsoft-teams `
  miniconda3 `
  neovim `
  nerd-fonts-CascadiaCode `
  nerd-fonts-FiraCode `
  nodejs `
  notepadplusplus `
  okular `
  postman `
  powershell-core `
  powertoys `
  restic `
  rsync `
  sourcetree `
  sql-server-management-studio `
  thunderbird `
  transmission `
  treesizefree `
  vb-cable `
  vcxsrv `
  veracrypt `
  voicemeeter-banana `
  winscp

Atualizar Chocolatey

  • Liste os pacotes desatualizados:

    choco outdated
    
  • Atualize o Chocolatey antes:

    choco upgrade chocolatey
    
  • Atualize todos os pacotes:

    choco upgrade all -y
    

PowerShell

O Windows 10 e 11 vêm com a versão 5.1 instalada, mas a versão mais nova está disponível no GitHub e pode ser instalada pelo Chocolatey ou winget.

Pelo Winget:

winget search Microsoft.PowerShell
winget install --id Microsoft.Powershell --source winget
> $PSVersionTable.PSVersion

Major  Minor  Patch  PreReleaseLabel BuildLabel
-----  -----  -----  --------------- ----------
7      4      1

Execution Policy

O PowerShell possui as seguintes opções para restringir a execução de scripts:

  • Restricted: Não executa scripts. Usa o PowerShell apenas no modo interativo.
  • AllSigned: Executa apenas scripts assinados por um editor confiável.
  • RemoteSigned: Scripts baixados precisam ser assinados.
  • Unrestricted: Todos os scripts podem ser executados.

Vou configurar usando a opção RemoteSigned:

Set-ExecutionPolicy RemoteSigned

Oh My Posh

O Oh My Posh é um tema para o Terminal, que é especialmente bom para o PowerShell.

O jeito mais fácil de instalar é com o Winget:

winget install JanDeDobbeleer.OhMyPosh -s winget

Depois configure o PowerShell para iniciar o Oh My Posh:

notepad $PROFILE

E cole o seguinte:

oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/powerlevel10k_lean.omp.json" | Invoke-Expression
Set-PSReadlineOption -EditMode vi -BellStyle None

Esses comandos irão configurar o PowerShell para usar o tema powerlevel10k_lean em vi mode. Outros temas podem ser previstos com o comando Get-PoshThemes e no site oficial.

O comando notepad $PROFILE edita o $profile.currentusercurrenthost. Se quiser configurar para outros hosts e usuários, edite o arquivo adequado:

$profile.currentusercurrenthost
C:\Users\Julio\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

$profile.currentuserallhosts
C:\Users\Julio\Documents\PowerShell\profile.ps1

$profile.alluserscurrenthost
C:\Program Files\PowerShell\7\Microsoft.PowerShell_profile.ps1

$profile.allusersallhosts
C:\Program Files\PowerShell\7\profile.ps1

Office

Eu divido uma assinatura do Microsoft 365 Family com outras 5 pessoas. Considero que vale muito a pena, porque além do Office cada um também tem 1 TB de OneDrive.
Além disso, frequentemente encontramos promoções de 1 ano pré-pago do Personal, que pode ser convertido em 9 meses do Family.

O instalador com todos os programas do Office 365 pode ser baixado da sua conta Microsoft. Lá você escolhe o idioma e a versão (32 ou 64-bit).

Também é possível instalar cada programa separadamente pela Microsoft Store, porém eu não recomendo.

E-mails

Eu gosto de usar o Thunderbird como cliente de e-mails.

  1. Para economizar espaço, desmarque a opção de sincronizar as pastas. Assim, apenas os headers serão baixados;
  2. Configure para minimizar para o taskbar;
  3. Cadastre sua chave PGP para assinar e-mails;
  4. Use uma master password para proteger as senhas e chaves salvas no Thunderbird (arquivo key4.db): Tools » Options » Privacy & Security » use a master password.

Para configurar e-mails que usam Two-factor authentication, você pode usar uma senha específica para o app ou fazer a configuração inicial sem senha e depois alterá-la para OAuth2.

Calendário

Para a maioria das pessoas, deixar a aba de e-mail aberta no browser e ativar as notificações deve ser o suficiente, mas eu uso múltiplos calendários e gosto de acompanhá-los no mesmo lugar e receber alertas de eventos no desktop.

O aplicativo padrão do Windows é totalmente integrado com o sistema e permite visualizar os eventos direto na barra de tarefas e receber notificações nativas, mas como eu já uso o Thunderbird para e-mails prefiro também configurá-lo para sincronizar meus calendários.

Apenas exibir o calendário (view only)

O link para seu calendário Google pode ser obtido da seguinte forma:

  1. Entre nas configurações do Google Calendar (https://calendar.google.com/calendar/u/0/r/settings);
  2. Settings for my calendars
  3. Selecione o calendário;
  4. Integrate calendar;
  5. Secret address in iCal format

Cole esse link no Thunderbird: File » New » Calendar » On the Network » iCalendar (ICS).

O calendário será marcado como somente leitura.

Para ver os eventos na tela principal: View » Today Pane » Show Today Pane.

Sincronizar bidirecionalmente (view & edit)

Os add-ons Lightning e Provider for Google possuem essa funcionalidade, porém é possível configurar o Thunderbird para usar CalDav da seguinte forma:

  • Google: crie uma senha específica em https://myaccount.google.com/apppasswords.
  • Zoho: 1. Crie uma senha específica em Zoho Accounts » Security » App Passwords » Application-Specific Passwords » Generate New Password. 2. Ative o CalDav em Settings » Calendar » Synchronize » CalDAV. 3. Pegue o Calendar ID em Settings » Calendars » My Calendars No Thunderbird, navegue até File » New » Calendar » On the Network » CalDAV.
  • Username: seu@email.com
  • Location Google: https://www.google.com/calendar/dav/seu@email.com/events
  • Location Zoho: https://calendar.zoho.com/caldav/**Calendar ID**/events

Linguagens

Gosto de deixar meu notebook em inglês, porém é bom adicionar outras linguagens como Português.

Settings » Languages » Preferred Languages » Add a preferred language.

Adicionar/remover linguagens pelo PowerShell

PS > $langs = Get-WinUserLanguageList

PS > $langs
LanguageTag     : en-GB
Autonym         : English (United Kingdom)
EnglishName     : English
LocalizedName   : English (United Kingdom)
ScriptName      : Latin
InputMethodTips : {0809:00020409}
Spellchecking   : True
Handwriting     : False
PS > $langs.Add('de-DE')

PS > $langs
LanguageTag     : en-GB
Autonym         : English (United Kingdom)
EnglishName     : English
LocalizedName   : English (United Kingdom)
ScriptName      : Latin
InputMethodTips : {0809:00020409}
Spellchecking   : True
Handwriting     : False

LanguageTag     : de-DE
Autonym         : Deutsch (Deutschland)
EnglishName     : German
LocalizedName   : German (Germany)
ScriptName      : Latin
InputMethodTips : {0407:00000407}
Spellchecking   : True
Handwriting     : False

PS > Set-WinUserLanguageList $langs -Force
PS > $langs.Remove(($langs | Where-Object LanguageTag -like 'de-DE'))
True

PS > $langs
LanguageTag     : en-GB
Autonym         : English (United Kingdom)
EnglishName     : English
LocalizedName   : English (United Kingdom)
ScriptName      : Latin
InputMethodTips : {0809:00020409}
Spellchecking   : True
Handwriting     : False

PS > Set-WinUserLanguageList $langs -Force

Bug do teclado fantasma

Mesmo na Alemanha eu uso English (United Kingdom) como linguagem do sistema e formatação. Por algum motivo desconhecido, o Windows insiste em adicionar o teclado alemão à lista de teclados.

Para piorar, ele não aparece no Regedit (Computer\HKEY_USERS\.DEFAULT\Keyboard Layout\Preload) nem nas opções de linguagem e região.

É necessário adicionar manualmente só para poder remover o teclado alemão da lista.

Isso também pode ser feito pelo PowerShell:

$langs = Get-WinUserLanguageList
$langs[0].InputMethodTips.Add('0809:00000407')
Set-WinUserLanguageList $langs -Force
$langs[0].InputMethodTips.Remove('0809:00000407')
Set-WinUserLanguageList $langs -Force

Verifique o código no Regedit ( Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Language).

IDTagLinguagemLocal
0x0416pt-BRPortuguêsBrasil
0x0816pt-PTPortuguêsPortugal
0x0409en-USInglêsEstados Unidos
0x0809en-GBInglêsReino Unido
0x0c0Aes-ESEspanholEspanha
0x0407de-DEAlemãoAlemanha
0x1000en-150InglêsEuropa
0x1000en-DEInglêsAlemanha

Tabela completa: https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c

Relógio adicional

Tenho me comunicado bastante com pessoas da Austrália e Noruega. Como o fuso horário é bem diferente, gosto de ter um relógio adicional.

Entre em Date & Time » Add clocks for different time zones e configure o novo relógio.

Personalização

  • Papel de parede

    Em Settings » Personalization, escolha um background. Eu costumo deixar Solid colour preto.

  • Cores

    Default app mode: Dark

  • Lock screen

    Desative mostrar apps na lock screen e background na tela de sign-in.

  • Fontes

    Instale uma Nerd Font.
    Recomendo a Hack NF. Descompacte o pacote, selecione todas as fontes “Windows Compatible”, clique com o botão direito e escolha a opção Install ou Install for all users.

    Alternativamente, instale com o oh-my-posh. Em um PowerShell como admin:

    oh-my-posh font install hack
    

    Outra boa é a JetBrains Mono.

    Instale as Google Noto Fonts para não ter problemas com caracteres indisponíveis (exibidos como retângulos). Prefira a versão hinted.

  • Mostrar/Esconder ícones na área de trabalho

    Temas » Desktop Icon Settings. Eu gosto de deixar Meu computador, Lixeira e pasta do Usuário.

  • Taskbar

    Remova todo o lixo da taskbar. Esconda a search bar.

  • Desative programas que iniciam com o sistema

    Abra o task manager e desative os programas que iniciam com o sistema.

  • File Explorer

    Abra o File Explorer. Selecione View » Options » Change folder and search options. Na tab View, marque/desmarque as opções:

    • Always show menus
    • Display de full path in the title bar
    • Show hidden files, folders, and drives
    • Hide extensions for known file types
    • Hide protected operating system files
  • Remover OneDrive do quick access

    [HKEY_CLASSES_ROOT\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6}]
    "System.IsPinnedToNameSpaceTree"=dword:00000000
    
    [HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6}]
    "System.IsPinnedToNameSpaceTree"=dword:00000000
    
  • Default Apps

    • Music player: VLC
    • Photo viewer: IrfanView
    • Video player: VLC
    • Web browser: Firefox

    Também gosto de associar programas a extensões:

    • .txt → Notepad++
  • Chrome e Firefox

    Sincronize os browsers. Copie as configurações de extensões como o uMatrix, se tiver.

  • Trocar Esc com CapsLock

    É possível fazer pelo Regedit, SharpKeys, PowerToys e muitos outros.

    • Regedit

      Salve o seguinte código como caps_swapescape.reg e o execute:

      Windows Registry Editor Version 5.00
      
      [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
      "Scancode Map"=hex:00,00,00,00,00,00,00,00,03,00,00,00,3a,00,01,00,01,00,3a,00,00,00,00,00
      

      Um mapeamento consiste em um inteiro de 32 bits (dois scancodes de 16 bits cada) no formato little-endian.

      (03,00,00,00) → Indica que virão 3 inteiros (96 bits = 24 dígitos em hex) (01,00) → Escape (3a,00) → CapsLock

      • SharpKeys

        Caps Lock (00_3A) → Escape (00_01) Escape (00_01) → Caps Lock (00_3A)

      • PowerToys Enable Keyboard Manager » remap a key

Desktops

Deslize com quatro dedos para cima no touchpad para aparecer a opção de criar novos desktops. Eu gosto de usar 2 desktops.

Terminal

Eu gosto do Cmder e do Windows Terminal (disponível na Microsoft Store). Eles são bastante customizáveis. Uma mudança importante é definir a fonte. Recomendo a Hack NF.

No Terminal (settings.json):


    "actions": [
        {
            "command": {
                "action": "copy",
                "singleLine": false
            },
            "keys": "ctrl+c"
        },
        {
            "command": "paste",
            "keys": "ctrl+shift+v"
        },
        {
            "command": "find",
            "keys": "ctrl+shift+f"
        },
        {
            "command": {
                "action": "splitPane",
                "split": "auto",
                "splitMode": "duplicate"
            },
            "keys": "alt+shift+d"
        },
        {
            "command": {
                "action": "sendInput",
                "input": "\u001b[13;2u"
            },
            "keys": "shift+enter"
        },
        {
            "command": {
                "action": "sendInput",
                "input": "\u001b[13;5u"
            },
            "keys": "ctrl+enter"
        },
        {
            "command": {
                "action": "sendInput",
                "input": "\u001b[13;6u"
            },
            "keys": "ctrl+shift+enter"
        },
        {
            "command": {
                "action": "sendInput",
                "input": "\u001b[32;2u"
            },
            "keys": "shift+space"
        },
        {
            "command": {
                "action": "sendInput",
                "input": "\u001b[32;5u"
            },
            "keys": "ctrl+space"
        },
        {
            "command": {
                "action": "sendInput",
                "input": "\u001b[32;6u"
            },
            "keys": "ctrl+shift+space"
        }
    ]

"defaultProfile": "{2c4de342-38b7-51cf-b940-2309a097f518}",

    {
        "guid": "{2c4de342-38b7-51cf-b940-2309a097f518}",
        "hidden": false,
        "name": "Ubuntu",
        "fontFace": "Hack NF",
        "source": "Windows.Terminal.Wsl"
    },

    {
        "guid": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
        "hidden": false,
        "name": "PowerShell",
        "fontFace": "Hack NF",
        "source": "Windows.Terminal.PowershellCore"
    }

Eu altero o comando paste de ctrl+v para ctrl+shift+v para não quebrar o visual mode no vim.

Sandbox

Para testes de aplicações, especialmente de origem duvidosa, é recomendável utilizar um sistema isolado: sandboxes ou máquinas virtuais.

Para casos nos quais não é necessário ou desejável persistir instalações e configurações e a versão atual do Windows funciona, uma sandbox é mais prática que VMs. Não precisa baixar imagens, ela abre mais rápido, ocupa menos espaço em disco, etc.

Sandboxing pode ser feito com programas como o Sandboxie, porém o Windows 10 Professional já vem com esse recurso nativamente, basta ativar ser ativado.

A configuração é bem simples e a performance é boa. A Windows Sandbox utiliza tecnologia de Windows Containers que, por usa vez, utiliza Hyper-V.

A Sandbox pode ser ativada nas Windows Features ou com o seguinte comando no PowerShell:

Enable-WindowsOptionalFeature -Online -FeatureName "Containers-DisposableClientVM"

A configuração é feita via arquivos XML com extensão .wsb, como o seguinte:

<Configuration>
  <VGpu>Disable</VGpu>
  <Networking>Disable</Networking>
  <MappedFolders>
    <MappedFolder>
      <HostFolder>C:\Share</HostFolder>
      <SandboxFolder>C:\Share</SandboxFolder>
      <ReadOnly>true</ReadOnly>
    </MappedFolder>
  </MappedFolders>
  <AudioInput>Disable</AudioInput>
  <VideoInput>Disable</VideoInput>
  <ProtectedClient>Enable</ProtectedClient>
  <PrinterRedirection>Disable</PrinterRedirection>
  <ClipboardRedirection>Disable</ClipboardRedirection>
  <MemoryInMB>8192</MemoryInMB>
  <LogonCommand>
    <Command>explorer.exe C:\Share</Command>
  </LogonCommand>
</Configuration>

Esse exemplo inicia uma sandbox em modo protegido, com 8 GB de RAM, acesso de leitura à pasta C:\Share e sem acesso a rede, microfone, webcam, impressora nem área de trabalho.

Virtualização: Hyper-V

O Microsoft Sandbox é ótimo para testes rápidos e para executar aplicativos portáteis, porém ele não cobre o caso de uso em que é necessário persistir modificações no sistema. Nesses casos devemos usar máquinas virtuais.

Se você tiver um servidor potente, pode valer a pena instalar um gerenciador de máquinas virtuais como o Proxmox VE e usar as VMs por acesso remoto. Dependendo do caso, subir uma VM na nuvem também é uma boa ideia.

Para instalações locais no Windows também existem várias opções de hypervisors, que podem ser de dois tipos:

  • Hypervisor tipo 1:
    • Bare-metal, native
    • Acessa o hardware diretamente
    • Melhor performance
    • Exemplos: VMware ESXi (VMware vSphere), Microsoft Hyper-V, Oracle VM, Citrix Hypervisor
  • Hypervisor tipo 2:
    • Hosted
    • Roda sobre o sistema operacional
    • Mais fáceis de gerenciar
    • Exemplos: VMware Fusion, VMware Workstation Pro, Oracle VM VirtualBox

Dizem que o VMware é o que possui mais funcionalidades, porém eu tenho usado o Hyper-V que vem com o Windows Pro principalmente pelo custo.

É possível instalar Linux, FreeBSD e Windows no Hyper-V. Um detalhe é que Windows virtualizado também precisa de licença.

Dicas:

  • Prefira usar a Generation 2.
  • Ativar TPM: Security » Enable Trusted Platform Module
  • Crie checkpoints (snapshots) antes de qualquer mudança
  • Instalação offline (Windows 11):
    • Pressione Shift+F10 para abir o terminal
    • Execute C:\Windows\System32\oobe\BypassNRO.cmd
    • Clique “I don’t have internet”
    • Clique ““Continue with limited setup”
  • Em enhanced session mode é possível copiar e colar arquivos entre host e VM
  • É possível montar discos virtuais “.vhdx” para compartilhar arquivos. Lembre de desmontá-los antes de iniciar as VMs.
  • Ative Guest services

Placa de vídeo Nvidia no Hyper-V

Note
Atualizado em Janeiro de 2023. Usando Windows 11.

Devido a uma falha de segurança, a Microsoft desativou a opção “RemoteFX vGPU” que permitia com que várias VMs compartilhassem uma GPU.

No Windows Server existe a opção de alocar uma GPU completamente para uma VM, o chamado GPU passthrough via Discrete Device Assignment (DDA). Porém apenas Enterprise GPUs como a Nvidia Quadro funcionam.

A única solução atual é GPU Paravirtualization/GPU Partitioning. Veja os seguintes links para mais informações:

WSL2

Note
Última atualização: outubro de 2024.

Depois de ter ativado o “Windows Subsystem for Linux” nas Windows Features, ainda é preciso configurar o ambiente.

Dica: muito do que eu escrevi no artigo sobre Arch também se aplica ao Ubuntu no WSL.

Dica 2: Se quiser aplicar uma configuração a todas as distros, use o arquivo C:\Users\<UserName>\.wslconfig em vez do /etc/wsl.conf.

  1. Instale a atualização do kernel

  2. Atualize o WSL, se necessário

    wsl --update
    
  3. Defina o WSL2 como padrão: wsl --set-default-version 2

  4. Liste distros disponíveis

    wsl --list --online
    
  5. Instale uma distro (Ubuntu 22.04 ou 24.04)

    • Opção 1: wsl --install -d Ubuntu-24.04

    • Opção 2: pela Microsoft Store

    • Opção 3: por linha de comando

      cd ~\Downloads
      curl.exe -L -o ubuntu-2204.appx https://aka.ms/wslubuntu2204
      Add-AppxPackage .\ubuntu-2204.appx
      

      Execute o arquivo ~\Downloads\ubuntu-2204.appx. Vai aparecer uma mensagem dizendo que o Ubuntu já está instalado e um botão escrito launch para iniciar o Ubuntu.

  6. Verifique se a versão do WSL é a 2: wsl --list --verbose

    Se sua versão for a 1, execute wsl --set-version Ubuntu 2.

  7. Defina a distro padrão (caso instale mais de uma)

    wslconfig /setdefault Ubuntu-24.04
    
  8. [Opcional] Mova a imagem de C: para Z:

    As VHDs (virtual hard disk) do WSL2 são salvas em C:\Users\[user]\AppData\Local\Packages\[distro]\LocalState\[distroPackageName].
    Exemplo: C:\Users\Julio\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\ext4.vhdx.

    É possível mover a imagem e reapontar o caminho pelo Regedit, porém existe um jeito mais seguro usando a função de exportar e importar imagens:

    Z:
    mkdir Z:\WSL
    wsl --export Ubuntu Z:\WSL\Ubuntu.tar
    wsl --unregister Ubuntu
    wsl --import Ubuntu Z:\WSL\ Z:\WSL\Ubuntu.tar
    ubuntu.exe config --default-user julio
    rm Z:\WSL\Ubuntu.tar
    

    Update (2024): agora existe a opção wsl --import-in-place:

    wsl --import-in-place Ubuntu-24.04 Z:\WSL\Ubuntu-24.04\ext4.vhdx
    
  9. Verifique a versão do Ubuntu

    $ lsb_release -a
    No LSB modules are available.
    Distributor ID: Ubuntu
    Description:    Ubuntu 24.04.1 LTS
    Release:        24.04
    Codename:       noble
    
  10. Ajuste os locales

    sudo nvim /etc/locale.gen
    sudo locale-gen
    
  11. Não adicione pastas do Windows ao $PATH

    Adicione as seguintes linhas ao arquivo /etc/wsl.conf:

    [interop]
    appendWindowsPath = false
    

    Isso melhora significativamente a performance do autocomplete na linha de comando, pois acessar o sistema de arquivos do Windows é muito demorado.

    Ainda é possível iniciar programas a partir do WSL, basta usar o caminho completo ou adicionar symlinks em alguma pasta que já esteja no $PATH.

    Veja https://learn.microsoft.com/en-us/windows/wsl/wsl-config#interop-settings

  12. Ative o Systemd

Note
Funcionalidade disponível desde a versão 0.67.6 do WSL. Agora já é o default.
Alguns programas ([Snap], [Flatpak], [microk8s]) dependem do Systemd.

[Snap]: https://snapcraft.io/
[Flatpak]: https://flatpak.org/
[microk8s]: https://microk8s.io/

Adicione as seguintes linhas ao arquivo `/etc/wsl.conf`:

```bash
[boot]
systemd=true
```

Reinicie o WSL: `wsl.exe --shutdown`.
  1. Configure a memória

    O WSL2 roda em Hyper-V. Por padrão, metade (ou 80% em novas builds) da memória da máquina é alocada. Esse valor pode ser alterado pelo arquivo C:\Users\julio\.wslconfig:

    wsl --shutdown
    notepad "$env:USERPROFILE/.wslconfig"
    
    [wsl2]
    memory=16GB
    swap=0
    processors=4
    

    Verifique com o comando free no Linux.

    Observações:

    • Não coloque um valor muito alto, pois o que for alocado para o Linux não poderá ser usado pelo Windows.
    • Para liberar memória, rode echo 1 >> /proc/sys/vm/drop_caches como root.
    • O arquivo .wslconfig deve ser salvo como UTF-8 without BOM.
    • A swap é salva em %USERPROFILE%\AppData\Local\Temp\swap.vhdx
  2. Adicione repositórios adicionais (PPAs):

    PPAs (Personal Package Archive) são repositórios adicionais aos repositórios do Ubuntu. Muitos deles são dos mantenedores oficiais.

    • Neovim:
    sudo add-apt-repository ppa:neovim-ppa/unstable
    sudo apt update
    
    • Git
    sudo add-apt-repository ppa:git-core/ppa
    sudo apt update
    
  3. Atualize o sistema

    sudo apt update && sudo apt upgrade
    
  4. Instale programas disponíveis via repositórios:

    Básicos:

    sudo apt install \
      ack \
      curl \
      ffmpeg \
      git \
      gitk\
      jq \
      make \
      neovim \
      p7zip-full \
      renameutils \
      rsync \
      sshfs \
      tree \
      unzip \
      wget \
      xclip \
      zsh \
    

    LaTeX:

    sudo apt install \
      latexmk \
      texlive-lang-portuguese \
      texlive-xetex
    

    Utilitários:

    sudo apt install \
      ripgrep \
      fd-find \
      oathtool
    
  5. Clone os dotfiles (https://github.com/jbsilva/dotfiles) e crie os links para os arquivos de configuração

    cd ~
    ln -s dotfiles/.zsh
    ln -s dotfiles/.zshrc
    ln -s dotfiles/.gitconfig-wsl .gitconfig
    ln -s dotfiles/.p10k.zsh
    ln -s dotfiles/.config
    
  6. Instale programas de outras fontes:

    O repositório do Ubuntu nem sempre tem as versões mais novas dos pacotes.
    Alternativas:

    • PPAs
    • Snap
    • Flatpak
    • Appimage
    • Pacotes .deb
    • Executáveis pré-compilados
    • Asdf
    • Cargo
    • pipx
    • uvx
    • Compilar código fonte

    Asdf

    Update (2025):

    O asdf foi reescrito em Golang na versão v0.16.0. Agora é possível baixar um único binário:

    curl -sL https://api.github.com/repos/asdf-vm/asdf/releases/latest | \
      jq -r '.assets[] | select(.name | test("^asdf-v.*-linux-amd64.tar.gz$")).browser_download_url' | \
      xargs curl -sL | \
      tar xz -C ~/bin/
    

    Os comandos asdf global e asdf local foram substituidos por asdf set.

    Configure seguindo a documentação, meu .zshrc ou o plugin.

    Modo antigo:

    git clone https://github.com/asdf-vm/asdf.git ~/.asdf
    

    uv

    curl -LsSf https://astral.sh/uv/install.sh | sh
    

    Python

    (Atualizado em 2025)

    Existem várias formas de se instalar Python:

    • Repositório oficial do Ubuntu

      sudo apt install python3
      

      Essa é a forma mais fácil, porém você não pode especificar qual versão você quer ou manter múltiplas versões ao mesmo tempo.

    • deadsnakes

      sudo add-apt-repository ppa:deadsnakes/ppa
      sudo apt update
      sudo apt install python3.11
      

      Essa é uma boa alternativa. Permite instalar múltiplas versões sem precisar compilar.

    • Pyenv

      curl https://pyenv.run | bash
      pyenv versions
      pyenv install "3.13"
      

      O Pyenv compila as versões que você escolher. Instale as dependências:

      sudo apt install \
        build-essential \
        libbz2-dev \
        libffi-dev \
        liblzma-dev \
        libncursesw5-dev \
        libreadline-dev \
        libsqlite3-dev \
        libssl-dev \
        libxml2-dev \
        libxmlsec1-dev \
        llvm \
        tk-dev \
        xz-utils \
        zlib1g-dev
      
    • asdf

      asdf install python latest:3.10
      # asdf local python latest:3.10
      asdf set python latest:3.10
      

      O asdf-python é um plugin para asdf que usa o Pyenv para build e instalação. Faz sentido se você também for usar o asdf para outras linguagens como nodejs ou ruby.

    • uv

      uv python install 3.12
      

      O uv permite baixar uma versão pré-compilada do Python do python-build-standalone.

      Esteja ciente de que alguns programas são incompatíveis com essas builds, porque elas não linkam com bibliotecas do sistema.

      Infelizmente o uv ainda não tem um --build para cobrir esses casos, mas para todos os outros é ele que eu uso. As builds são bem otimizadas e não preciso perder tempo compilando.

    • [pixi]

      ???
      

    Mambaforge

    wget https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Linux-x86_64.sh
    bash Mambaforge-Linux-x86_64.sh
    

    Flatpak (ative o Systemd antes):

    sudo apt install flatpak gnome-software-plugin-flatpak gnome-software
    
    flatpak remote-add --if-not-exists --user flathub https://flathub.org/repo/flathub.flatpakrepo
    
    flatpak update
    

    Compiladores e build tools

    Certifique-se de ter alguns compiladores e linkers instalados:

    sudo apt install \
      build-essential \
      cmake \
      ninja-build \
      clang \
      -y
    

    Rust

    Instale com:

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    

    Go

    O jeito mais fácil é usando asdf.

    asdf ...
    

    Mas se só quiser a última versão:

    sudo rm -rf /usr/local/go && \
    wget -qO- "https://go.dev/dl/$(curl -s 'https://go.dev/dl/?mode=json' | \
      jq -r '.[0].files[] | select(.os=="linux" and .arch=="amd64") | .filename')" | \
      sudo tar -C /usr/local -xzf - && \
    go version
    

    Para o usuário local apenas:

    mkdir -p $HOME/.local && \
    wget -qO- "https://go.dev/dl/$(curl -s 'https://go.dev/dl/?mode=json' | \
      jq -r '.[0].files[] | select(.os=="linux" and .arch=="amd64") | .filename')" | \
      tar -C $HOME/.local -xzf - && \
    export PATH=$PATH:$HOME/.local/go/bin && \
    go version
    

    Hugo

    curl -sL https://api.github.com/repos/gohugoio/hugo/releases/latest | \
      jq -r '.assets[] | select(.name | test("^hugo_extended_withdeploy_.*_linux-amd64\\.deb$")).browser_download_url' | \
      xargs wget -q --show-progress -O hugo.deb && \
      sudo dpkg -i --force-overwrite hugo.deb && \
      sudo apt-get install -f && \
      rm -f hugo.deb && \
      hugo version
    

    ou

    CGO_ENABLED=1 go install --tags extended github.com/gohugoio/hugo@latest
    

    ou

    HUGO_LATEST="0.121.1"
    wget -qO- https://github.com/gohugoio/hugo/releases/download/v${HUGO_LATEST}/hugo_extended_${HUGO_LATEST}_linux-amd64.tar.gz | tar xvz hugo -C ~/bin/
    

    ou

    asdf plugin add hugo
    HUGO_LATEST=$(asdf list-all hugo | tail -1)
    asdf install hugo extended_$HUGO_LATEST
    asdf global hugo extended_$HUGO_LATEST
    

    Zellij:

    curl -sL https://api.github.com/repos/zellij-org/zellij/releases/latest | \
      jq -r '.assets[] | select(.name | test("^zellij-x86_64-.*-linux-.*.tar.gz$")).browser_download_url' | \
      xargs curl -sL | \
      tar -xz -C ~/bin/ "zellij"
    

    Yt-dlp:

    uv tool install yt-dlp
    

    ou

    python -m pip install -U --pre yt-dlp
    

    ou

    mkdir -p ~/bin
    wget -O ~/bin/yt-dlp https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux
    yt-dlp --update-to nightly
    

    ExifTool:

    O ExifTool é um programa muito útil para manter minha biblioteca de fotos organizada.

    mkdir -p ~/bin
    EXIFTOOL_LATEST=12.70
    wget -qO- https://exiftool.org/Image-ExifTool-${EXIFTOOL_LATEST}.tar.gz | tar xvzf - -C ~/bin/
    mv ~/bin/Image-ExifTool* ~/bin/ExifTool
    ln -s ~/bin/ExifTool/exiftool ~/bin/exiftool
    

    AWS CLI

    sudo snap install aws-cli --classic
    aws --version
    

    ou

    curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
    unzip awscliv2.zip
    sudo ./aws/install
    

    ou com o asdf:

    asdf plugin add awscli
    asdf install awscli latest
    asdf global awscli latest
    

    git-filter-repo

    uv tool install git-filter-repo
    

    Tailwind

    curl -sL "https://github.com/tailwindlabs/tailwindcss/releases/latest/download/tailwindcss-linux-x64" -o ~/bin/tailwindcss
    chmod +x ~/bin/tailwindcss
    

    Watchman

    See https://facebook.github.io/watchman/docs/install

    curl -sL https://api.github.com/repos/facebook/watchman/releases/latest | \
      jq -r '.assets[] | select(.name | test("^watchman-.*-linux\\.zip$")).browser_download_url'
    
  7. Defina o shell padrão: chsh -s $(which zsh)

GNOME Keyring

Existem vários programas para armazenar senhas, chaves e certificados de forma segura. O GNOME Keyring é um dos mais populares e compatível com outros programas como Docker, Git, Chromium e GnuPG.

Ele foi feito para usar com interface gráfica, porém eu consegui usar no Ubuntu headless.

  1. Instale via apt

    sudo apt install gnome-keyring
    

    O gnome-keyring-daemon será iniciado automaticamente pelo systemd após o login, porém estará bloqueado.

  2. Desbloqueie o gnome-keyring ao iniciar um terminal (uso ZSH)

    echo 'eval $(echo -n db | gnome-keyring-daemon --unlock --replace 2> /dev/null)' >> ~/.zshrc
    
  3. Teste

    uvx keyring set system username
    uvx keyring get system username
    

Alternativas: pass, Hashicorp Vault, kwallet

Compartilhar arquivos entre distros no WSL2

Execute o seguinte comando para criar um arquivo que instrui o systemd a montar a pasta / da distribuição atual em /mnt/wsl/instances/$DISTRO. A pasta /mnt/wsl/ (ou o que estiver configurado em [automount].root) é compartilhada por todas as distribuições em execução.

cat <<EOF | sudo tee /etc/systemd/system/mnt-wsl-instances-${WSL_DISTRO_NAME/-/}.mount
[Unit]
Description=WSL Instances

[Mount]
What=/
Where=/mnt/wsl/instances/${WSL_DISTRO_NAME/-/}
Type=none
Options=defaults,bind,X-mount.mkdir

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable mnt-wsl-instances-${WSL_DISTRO_NAME/-/}.mount --now

Compactar imagem do WSL2

Compactar a imagem pode salvar alguns MBs.

  • No WSL2:

    # apt autoremove && apt autoclean && apt clean
    # fstrim /
    
  • No PowerShell:

     > Get-AppxPackage -Name "*Ubuntu*" | Select PackageFamilyName
       PackageFamilyName
       -----------------
       CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc
    
    > wsl --shutdown
    > optimize-vhd -Path "C:\Users\Julio\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\ext4.vhdx" -Mode full
    

X server

Note
Não é mais necessário nas novas versões do WSL.

Instale o VcXsrv e libere-o no firewall (Windows Defender).
Marque a opção Disable access control.

export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2; exit;}'):0.0
Note
O seguinte trecho não é mais verdade. Instale o xclip.

Obs.: a melhor forma de fazer o clipboard funcionar no Neovim é com o win32yank.exe. Ele é instalado junto com o Neovim para Windows, porém pode ser instalado manualmente:

mkdir ~/bin
export PATH=$HOME/bin:$PATH

wget https://github.com/equalsraf/win32yank/releases/latest/download/win32yank-x64.zip
unzip -p win32yank-x64.zip win32yank.exe > ~/bin/win32yank.exe
chmod +x ~/bin/win32yank.exe
rm -f win32yank-x64.zip

Copie para o registrador + usando "+y. Alternativamente, use :set clipboard=unnamedplus no Neovim.

Docker Desktop com WSL2

Esta opção é a mais simples, porém só é gratuita para uso pessoal, acadêmico, open-source ou em pequenas empresas (menos de 250 empregados E menos de 10 USD milhões de lucro anual).

Baixe o Docker Desktop (pelo Chocolatey, por exemplo).
Marque as opções Use the WSL 2 based engine e Expose daemon on tcp://localhost:2375 without TLS.

Isso já é suficiente para usar o Docker normalmente no terminal do Ubuntu.

Docker com WSL2 sem Docker Desktop

O Docker Desktop é pago para uso em grandes empresas, porém ele não é necessário para rodar o Docker.

Existem múltiplas alternativas:

Docker no WSL2 com Systemd

Em outra parte deste artigo eu explico como ativar o Systemd editando o arquivo /etc/wsl.conf.

O jeito mais simples de instalar o Docker é usando o script seguinte script:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh ./get-docker.sh --dry-run

Ele vai imprimir os comandos a serem executados. Remova o --dry-run para executar de fato.

Se quiser fazer passo-a-passo sem script:

  1. Remova pacotes antigos

    for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
    
    sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
    
    sudo rm -rf /var/lib/docker
    sudo rm -rf /var/lib/containerd
    rm ~/.docker/config.json
    
  2. Adicione o repositório apt oficial da Docker

    # Adiciona a chave GPG oficial do Docker
    sudo apt update
    sudo apt install ca-certificates curl gnupg
    sudo install -m 0755 -d /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    sudo chmod a+r /etc/apt/keyrings/docker.gpg
    
    # Adiciona o repositório apt à lista
    echo \
      "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
      "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
      sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    
  3. Instale o Docker e o docker-compose-plugin

    sudo apt update && \
    sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    

    Update: o docker-compose v1 é a versão antiga em Python, sem atualizações desde maio de 2021. O plugin foi reescrito em Go e seu comando agora é docker compose (com espaço em vez de hífen).

  4. Opcionalmente, adicione seu usuário ao grupo docker para não precisar do sudo:

    sudo usermod -aG docker $USER
    

    Veja possíveis atualizações na documentação oficial.

    Fique atento que isso pode ser uma brecha de segurança. Se quiser uma opção mais segura (porém limitada), procure sobre como executar o daemon em rootless mode.

  5. Teste a instalação

    sudo docker run hello-world
    
  6. Configure onde armezanar as credenciais (Credential Helper)

    É útil caso você faça docker login para gerenciar imagens no Docker Hub ou em um repositório privado. Sem um credential helper, a senha é armazenada em plaintext (base64) no arquivo ~/.docker/config.json.

    • Alternativa 1: Pass

      sudo apt install gnupg2 pass
      sudo apt install golang-docker-credential-helpers
      
      wget -q -O ~/bin/docker-credential-pass $(wget -q -O - https://api.github.com/repos/docker/docker-credential-helpers/releases | \
        jq -r '.[0].assets[] | select(.name | test("^docker-credential-pass-.*linux-amd64$")) | .browser_download_url') && chmod +x ~/bin/docker-credential-pass
      

      Em ~/.docker/config.json:

      {
        "credsStore": "pass"
      }
      
    • Alternativa 2: gnome-keyring

    Instale e configure como explicado em Gnome Keyring.

    wget -q -O ~/bin/docker-credential-secretservice
    $(wget -q -O - https://api.github.com/repos/docker/docker-credential-helpers/releases | \
          jq -r '.[0].assets[] | select(.name | test("^docker-credential-secretservice-.*linux-amd64$"))
    | .browser_download_url') && chmod +x ~/bin/docker-credential-secretservice
    

    Em ~/.docker/config.json:

    {
      "credsStore": "secretservice"
    }
    

Docker com Rancher Deskop

O Rancher substitui bem o Docker Desktop e é especialmente bom para Kubernetes. Ele pode ser instalado pelo Chocolatey:

choco install rancher-desktop

NVIDIA Container Toolkit

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt update && sudo apt install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
$ cat /etc/docker/daemon.json
{
    "runtimes": {
        "nvidia": {
            "args": [],
            "path": "nvidia-container-runtime"
        }
    }
}
sudo systemctl restart docker

Teste com o seguinte comando:

docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark

Visual Studio Code com WSL2

O VS Code instalado no Windows tem integração nativa com o WSL2. Você precisará instalar as extensões no WSL2 também.

GUI para Git

O Git por linha de comando é excelente para quase tudo, mas algumas tarefas são feitas mais facilmente de forma visual.

Ferramentas instaladas no Windows podem sofrer com performance ao acessar o sistema de arquivo do WSL, por isso recomendo instalá-las diretamente no Linux. Isso elimina algumas GUIs como o Sourcetree.

As ferramentas que já testei e gostei são:

  • VS Code

    • Ele já vem com uma boa ferramente da controle de versão. Algumas extensões possuem mais funcionalidades, porém eu não uso.
  • gitk

    • Foi a primeira GUI para Git. Uso bastante para visualizar mudanças em um único arquivo.
  • GitKraken

    • É muito completo e bonito, porém pago.
    sudo apt update
    sudo apt install -y libgbm-dev libnotify4
    wget https://release.gitkraken.com/linux/gitkraken-amd64.deb
    sudo dpkg -i ./gitkraken-amd64.deb
    sudo apt install -f
    
  • Gittyup (fork do GitAhead)

    • Pelo Flatpak:

      $ flatpak search gittyup
      Name    Description          Application ID             Version Branch Remotes
      Gittyup Graphical Git client com.github.Murmele.Gittyup v1.3.0  stable flathub
      
      flatpak install flathub com.github.Murmele.Gittyup
      
      flatpak run --nosocket=fallback-x11 --socket=x11 com.github.Murmele.Gittyup
      
    • AppImage:

      wget -q -O ~/bin/gittyup \
        $(wget -q -O - https://api.github.com/repos/Murmele/Gittyup/releases | \
          jq -r '.[0].assets[] | select(.name | test("^Gittyup.*AppImage$")) | .browser_download_url') && \
      chmod +x ~/bin/gittyup && \
      gittyup --version
      

Acessar por SSH

O WSL2 é uma máquina virtual com seu próprio endereço IP.

Este endereço pode ser encontrado das seguintes formas:

  1. Instale o OpenSSH

    sudo apt install openssh-server
    
  2. Ajuste as configurações em /etc/ssh/sshd_config

    Port 2255
    ListenAddress 0.0.0.0
    PasswordAuthentication yes
    
  3. Descubra o endereço IP da VM

    Usando o iproute2 no WLS2:

    $ ip addr show eth0
        inet 172.21.145.176/20 brd 172.21.159.255 scope global eth0
    

    Ou, pelo PowerShell:

     $wsl_ip = wsl -- ip -o -4 -j addr s eth0 | ConvertFrom-Json | %{ $_.addr_info.local } | ?{ $_ }
     $host_ip = (Get-NetIPAddress).IPAddress | ?{ $_ -match ($wsl_ip -replace '^((\d+\.){2}).*$','^$1') }
     $wsl_ip,$host_ip
      172.30.121.114
      172.30.112.1
    
  4. Verifique se o serviço está rodando

    Leia o trecho acima sobre como ativar o Systemd antes.

    $ sudo systemctl status sshd.service
    ● ssh.service - OpenBSD Secure Shell server
         Loaded: loaded (/lib/systemd/system/ssh.service; enabled)
         Active: active (running) since…
    
  5. Crie um portproxy entre a VM e o Host

    Em um PowerShell como admin:

    netsh interface portproxy add v4tov4 listenport=2255 listenaddress=0.0.0.0 connectport=2255 connectaddress=$wsl_ip
    
  6. Libere a porta 2255 no Firewall

    netsh advfirewall firewall add rule name="Open Port 2255 for WSL2" dir=in action=allow protocol=TCP localport=2255
    
    $ netsh interface portproxy show v4tov4
    
    Listen on ipv4:             Connect to ipv4:
    
    Address         Port        Address         Port
    --------------- ----------  --------------- ----------
    0.0.0.0         2255        172.30.121.114  2255
    
  7. Para desfazer

    Remove a port forwarding rule:

    netsh interface portproxy delete v4tov4 listenport=2255 listenaddress=0.0.0.0
    

    Verifique a mudança:

    netsh interface portproxy show v4tov4
    

    Remover todas as configurações:

    netsh interface portproxy reset
    

    Remove a regra no firewall:

    netsh advfirewall firewall delete rule name="Open Port 2255 for WSL2" protocol=TCP localport=2255
    

    Verificar:

    $ netsh advfirewall firewall show rule name="Open Port 2255 for WSL2"
    No rules match the specified criteria.
    
    netsh advfirewall firewall show rule name=all | Select-String -Pattern "WSL" -Context 0,4
    

Scanner

Existem muitos programas para interagir com o scanner, porém o melhor que conheço é o XSane, que é um frontend para o SANE.

sudo apt install xsane

Eu tenho uma multifuncional Canon Pixma MG5450. O nome completo não aparece na página de dispositivos compatíveis, porém ela faz parte da “PIXMA MG5400 Series”, que está inclusa no backend sane-pixma.

O comando scanimage -L faz um broadcast para detectar scanners conectados. Por padrão, dispositivos da Canon podem ser descobertos com o protocolo BJNP na porta UDP 8612.

Infelizmente esse comando não detectou meu scanner de primeira.

Eu sabia que não era um erro de conexão, pois curl http://192.168.15.7 retorna a página da multifuncional (esse IP é fixado no meu servidor DHCP).

A solução foi explicitar o IP da multifuncional no arquivo pixma.conf:

echo "bjnp://192.168.15.7" | sudo tee -a /etc/sane.d/pixma.conf

O comando funcionou sem problemas depois disso:

$ scanimage -L
device `pixma:MG5400_192.168.15.7' is a CANON Canon PIXMA MG5400 Series multi-function peripheral

O parâmetro --all lista possíveis opções compatíveis com o backend utilizado:

$ scanimage --device "pixma:MG5400_192.168.15.7" --all
Output format is not set, using pnm as a default.

All options specific to device `pixma:MG5400_192.168.15.7':
  Scan mode:
    --resolution auto||75|150|300|600|1200|2400dpi [75]
        Sets the resolution of the scanned image.
    --mode auto|Color|Gray|Lineart [Color]
        Selects the scan mode (e.g., lineart, monochrome, or color).
    --source Flatbed [Flatbed]
        Selects the scan source (such as a document-feeder). Set source before
        mode and resolution. Resets mode and resolution to auto values.

Desta forma, eu poderia escanear um documento em 150 dpi direto da linha de comando usando o scanimage:

scanimage \
  --device "pixma:MG5400_192.168.15.7" \
  --format=png \
  --output-file scan.png \
  --resolution 150 \
  --progress

Porém com o XSane é muito mais fácil.

Áudio

Programas como o Virtual Audio Cable e Voicemeeter são úteis para configurações com múltiplos auto-falantes e para fazer streaming. As versões gratuitas de ambos podem ser instaladas pelo Chocolatey.

  1. Entre em Control Panel\Hardware and Sound » Sound;
  2. Em Playback, defina o VoiceMeeter Input como o dispositivo padrão e o VoiceMeeter Aux Input como o dispositivo padrão de comunicação;
  3. Em Recording, defina o VoiceMeeter Output como o dispositivo padrão e o VoiceMeeter Aux Output como o dispositivo de comunicação padrão;
  4. Entre na aba Advanced nas propriedades de cada dispositivo e defina o sample rate (Ex.: 24 bit, 48000 Hz). O sample rate deve ser configurado para o mesmo valor no Voicemeeter (em Menu » System settings » Preferred Main SampleRate).
  5. Exemplo de configuração do Voicemeeter Banana:
    • Hardware Input 1: Microfone do notebook
    • Hardware Input 2: Microfone do headset
    • Hardware Input 3: CABLE Output (VB-Audio Virtual Cable)
    • Voicemeeter VAIO: Saída Desktop » A1, B1
    • Voicemeeter AUX: Saída Calls » A1
    • A1: WDM: Speakers / Headphones
    • A2: WDM: Headset
    • A3: WDM: TV ligada no HDMI
  • Obs. 1: Eu só configuro o microfone do meu headset bluetooth quando vou utilizá-lo, pois economiza energia e posso utilizar o fone no modo com maior qualidade de som.

  • Obs. 2: Tive problema no Spotify após instalar o Voicemeeter. Resolvi reinstalando o Spotify.

Outro programa bastante útil é o EarTrumpet. Ele permite definir, para cada programa, qual saída de áudio usar e com qual volume.

Streaming

Para chamadas de vídeo nas quais quero compartilhar o som sendo reproduzido no computador além do meu microfone, mas sem o som da própria chamada (voz dos outros participantes):

  • No Meets/Teams/Discord/Skype:
    • Microfone: VoiceMeeter Output
    • Speaker: VoiceMeeter Aux Input
  • No VoiceMeeter:
    • Mic PC: B1
    • Desktop (Voicemeeter VAIO): A1, B1
    • Calls (Voicemeeter AUX): A1

Julio Batista Silva
Authors
Senior Cloud Developer
comments powered by Disqus