Windows

Atualizado em Dezembro de 2023.

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
format quick fs=ntfs label="Windows"
assign letter="W"
create partition primary size=700
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 700 MB.

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, 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.

Chocolatey

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

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

Estou na Alemanha, mas uso English (United Kingdom) como linguagem do sistema e formatação. Por album 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).

ID Tag Linguagem Local
0x0416 pt-BR Português Brasil
0x0816 pt-PT Português Portugal
0x0409 en-US Inglês Estados Unidos
0x0809 en-GB Inglês Reino Unido
0x0c0A es-ES Espanhol Espanha
0x0407 de-DE Alemão Alemanha
0x1000 en-150 Inglês Europa
0x1000 en-DE Inglês Alemanha

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.

    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 perfomance é 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

Atualizado em Jan/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

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.

  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. Instale o Ubuntu

    • Opção 1: pela Microsoft Store

    • Opção 2: 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.

  5. 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.

  6. [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
    
  7. Ajuste os locales

    sudo nvim /etc/locale.gen
    sudo locale-gen
    
  8. 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

  9. Ative o Systemd

Funcionalidade disponível desde a versão 0.67.6 do WSL.

Alguns programas (Snap, Flatpak, microk8s) dependem do Systemd.

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

[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 \
      wget \
      zsh \
      oathtool
    

    LaTeX:

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

    Dependências para compilar o Python:

    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
    
  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-global
    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
    • Compilar código fonte

    Asdf:

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

    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
    

    Hugo:

    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:

    ZELLIJ_LATEST=0.39.2
    wget -qO- https://github.com/zellij-org/zellij/releases/download/v${ZELLIJ_LATEST}/zellij-x86_64-unknown-linux-musl.tar.gz | tar xvz zellij -C ~/bin/
    

    Yt-dlp:

    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
    
  7. Defina o shell padrão: chsh -s $(which zsh)

X server

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

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 milhões de lucro anual).

Baixe o Docker Desktop (eu baixo pelo Chocolatey).
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.

  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

    # Add Docker's official GPG key:
    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
    
    # Add the repository to Apt sources:
    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 docker-compose

    sudo apt update && \
    sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    
  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.

  5. Teste a instalação

    sudo docker run hello-world
    

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

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
      

AWS CLI

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

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 -o -4 -j addr s eth0 | ConvertFrom-Json | %{ $_.addr_info.local } | ?{ $_ }
    172.21.145.176
    

    Obs: o valor em /etc/resolv.conf é o endereço do host, não o da VM.

    $wsl    = wsl -- ip -o -4 -j addr s eth0 | ConvertFrom-Json | %{ $_.addr_info.local } | ?{ $_ }
    $host = (Get-NetIPAddress).IPAddress | ?{ $_ -match ($wsl -replace '^((\d+\.){2}).*$','^$1') }
    $wsl,$host
    
  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=172.21.145.176
    
  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.21.145.176  2255
    

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
Julio Batista Silva
Engenheiro de Dados

Eu sou um engenheiro de computação apaixonado por ciência, tecnologia, fotografia e idiomas. Atualmente trabalhando como Engenheiro de Dados na Alemanha.

comments powered by Disqus