Reconhecimento de palavras em arquivos PDF com OCR

Categoria: Linux Publicado: Quarta, 27 Janeiro 2021 Escrito por Helio Loureiro

Não sei já descrevi isso aqui ao longo desses 20 anos de blog/site, mas a maioria das coisas que publico são pra mim mesmo.  Como tenho certeza que não vou lembrar o que fiz daqui algum tempo (provavelmente dias), eu deixo aqui registrado como bloco de notas pra referência.  E, claro, espero que isso também ajude mais pessoas além de mim.

Como moro fora do Brasil já faz algum tempo, e ainda não domino a língua (na verdade só apanho dela), eu preciso de tempos em tempos pegar documentos e ler.  A forma que encontrei é passar o documento em um scanner, se for papel, mas ter a certeza de ter o documento digitalizado em formato PDF no final.  Esse foi o formato que mais facilitou o uso de outro software pra OCR (Optical Character Recognition), ou reconhecimento ótico de caracter.

Também percebi que o melhor é ter o documento separado em vários PDFs se possível, um pra cada página.  Isso facilita pro software de OCR de reconhecer cada página corretamente.

Pra usar como exemplo aqui vou adotar um documento sobre o imposto de renda sueco.  Ele está disponível na página do que seria equivalente à receita federa: https://www.skatteverket.se

O documento será esse aqui: https://www.skatteverket.se/download/18.7eada0316ed67d7282aedd/1582550479006/dags-att-deklarera-skv325-utgava41.pdf

Pra começar, apenas baixar o documento usando o curl:

curl -o report.pdf https://www.skatteverket.se/download/18.7eada0316ed67d7282aedd/1582550479006/dags-att-deklarera-skv325-utgava41.pdf

Em seguida serão necessários os seguintes pacotes de software (assumindo um sistema ubuntu ou debian): curl, ghostscript, imagemagick, tesseract-ocr e tesseract-<língua>.  Como no caso eu pego os documentos em sueco, uso então tesseract-swe.

sudo apt install curl ghostscript imagemagic tesseract-ocr tesseract-swe

O arquivo então será baixado e salvo como "report.pdf".  Ao abrir o documento eu vejo quantas páginas são, o que poderia ser feito de alguma outra forma mais automática, mas a visualização assim é fácil até pra detectar logo se tem alguma página pra pular com imagens.  Esse documento tem 8 páginas.

Então pra separar o arquivo em PDF baixado em páginas separadas, que depois vai facilitar o trabalho de tradução, eu uso o seguinte comando:

for i in $(seq 1 8)
    do
    gs -sDEVICE=pdfwrite -q -dNOPAUSE -dBATCH -sOutputFile=report-$i.pdf -dFirstPage=$i -dLastPage=$i report.pdf
done

Com as páginas criadas separadamente em formato PDF e com os nomes como report-1.pdf, report-2.pdf, report-3.pdf, etc e o próximo passo é converter cada uma no formato TIFF, que é o formato onde o reconhecimento de caracteres funciona melhor.  O programa "convert" que faz isso é parte do pacote imagemagick

for i in $(seq 1 8)
    do
    convert report-$i.pdf report-$i.tiff
done

Isso gera então as sequências report-1.tiff, report-2.tiff, etc.

Agora finalmente o passo final pra ter os textos em plain text.

for i in (seq 1 8)
do tesseract report-$i.tiff report-$i -l swe done

E isso cria os documentos com extensão "txt".  Esse documento que escolhi não foi muito feliz na detecção de caracteres.  O arquivo que mais foi reproduzido de forma satisfatória foi a página 7:

helio@xps13ubuntu:exemplo$ cat report-7.txt
Har du skatt att betala på din
preliminära skatteuträkning?

    

Tabellen på sidan 6 visar när skatten senast ska vara
betald. Fram till dess kan du göra delbetalningar.
Du kan när som helst betala in pengar till ditt
skattekonto. Du kan betala antingen med Swish
BIS

Om duvill betala med Swish loggar du in på Mina
sidor och följer instruktionerna där, Du kan också
enkelt betala din kvarskatt med Swish i samband
med att du deklarerar med edegitimation i
tjänsten. Du kan betala skatt med maximalt
15.000 kronor per dygn med Swish.

Om du betalar genom att göra en inbetalning till
BARR Sr ehe
angeditt OCR-nummer som du hittar i din preli-
PST RR NAS TT NT
www.skatteverketse/ocr.

Läs mer på wwwskotteverket.se/betalokvarskatt.

O passo seguinte é copiar essas páginas e colocar no google translator.  Eu não automatizo esse passo e uso o simple copy&paste no browser.

E esse seria o resultado do trecho acima:

Você tem imposto a pagar sobre o seu
cálculo preliminar do imposto?

    

A tabela na página 6 mostra quando o imposto deve durar
pago. Até então, você pode parcelar.
Você pode depositar dinheiro no seu a qualquer momento
conta fiscal. Você pode pagar com Swish
BIS

Se você quiser pagar com Swish, faça login no Mina
páginas e siga as instruções lá, você também pode
pague facilmente seu imposto residual com o Swish em conjunto
com isso você declara com edegitimação em
o serviço. Você pode pagar impostos com um máximo
SEK 15.000 por dia com Swish.

Se você pagar fazendo outro pagamento
BARR Sr ehe
número OCR especificado que você encontra na sua
PST RR NAS TT NT
www.skatteverketse / ocr.

Leia mais em wwwskotteverket.se/betalokvarskatt. 

Resolvendo a baleiada do docker com exit code 139

Categoria: Linux Publicado: Segunda, 21 Setembro 2020 Escrito por Helio Loureiro

Esses dias precisei fazer uma migração de uma mediawiki que usamos na empresa de uma máquina que rodava CentOS 6.8 pra um Ubuntu 18.04.

Para garantir seu funcionamento, primeiro eu queria testar os upgrades necessários em minha máquina.  Nada melhor que copiar os arquivos e rodar a versão exata do site remoto com containers em docker.

Mas ao rodar o container... ele simplesmente saia com código de erro 139.  Mais nada.  Sem logs, sem describe, sem nada que pudesse ajudar.

~ > docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS                  NAMES
8ffcdf12d761        centos:6.8          "bash"              52 minutes ago      Up 52 minutes                 0.0.0.0:8080->80/tcp   elated_ganguly
7bd9374248fd        centos:6.8          "bash"              56 minutes ago      Exited (139) 56 minutes ago                          dreamy_fermat
80ff07e9b84e        centos:6.8          "bash"              10 hours ago        Exited (139) 10 hours ago                            romantic_hertz
3db1d6c1f68b        centos:6            "bash"              10 hours ago        Exited (139) 10 hours ago                            bold_kilby

Olhando pela Internet, descobri em alguns sites pessoas relatando o mesmo problema.  É algo relacionado com a versão da glibc do container com a versão do kernel que estou rodando, que é muito mais novo:

 ~ > uname -a
Linux elxa7r5lmh2 5.9.0-rc5-helio #10 SMP Sat Sep 19 12:04:57 CEST 2020 x86_64 x86_64 x86_64 OSI/Linux

A solução é adicionar um parâmetro a mais no grub a opção "vsyscall=emulate":

~ > grep GRUB_CMDLINE_LINUX /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 pcie_aspm=off pci=nomsi vsyscall=emulate" 

e fazer um update no próprio grub.

~ > sudo update-grub2 && sudo reboot -f

Após um reboot os containers funcionaram sem problemas.

~ > docker run -it --rm=true centos:6.8 bash
[root@224aecaba978 /]# hostname
224aecaba978
[root@224aecaba978 /]# exit
exit
 ~ > docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES
ca68add255bd        ubuntu:18.04        "bash"              2 hours ago         Exited (1) 2 hours ago                       festive_galois
 ~ > 

Eu tentei configurar diretamente no kernel através da interface em /sys, mas eu só consegui com isso gerar um kernel panic.  O jeito mais fácil e seguro foi mesmo rebootando meu laptop.

Falhas de segurança em CPU nas distros com linux-libre

Categoria: Linux Publicado: Segunda, 18 Maio 2020 Escrito por Helio Loureiro
By Rafael Bonifaz - Alexandre Oliva, CC BY-SA 2.0, https://commons.wikimedia.org/w/index.php?curid=8939097Desde que assisti a palestra do Alexandre Oliva intitulada "quem tem medo de spectre & meltdown?" onde ele afirma que o kernel GNU Linux Libre está seguro em relação aos ataques de CPU que surgiram por ser software livre, eu sempre tive minhas dúvidas.  Sempre.  Uma vez que a correção de CPU era entregue através de firmware, como poderia estar livre.

 

Esses dias eu dei uma boa arrumada na minha estante e encontrei um laptop que estava parado desde 2014.  Quando liguei, estava ainda com o Ubuntu 14.04 instalado e rodando.  Pensei no mesmo momento que seria perfeito pra verificar o estado da proteção que as distros ditas livres e que são baseadas no GNU Linux Libre possuem.

 

Eu entrei na página da FSF eu fui seguindo as distros recomendadas como 100% livres.  Peguei pra testar as seguintes: Trisquel, Parabola e Guix.  Eu ia tentar também a Gnewsense mas a página principal mostra que depois de anos parada seu desenvolvimento foi simplesmente abandonado.  Mas ainda está listada na página da FSF.

 

(Foto By Rafael Bonifaz - Alexandre Oliva, CC BY-SA 2.0,https://commons.wikimedia.org/w/index.php?curid=8939097)

 

Pra ter alguma comparação eu também testei Debian puro, sem nada a parte de firmwares, e também um Ubuntu.  Vou descrever cada um em separado.

Guix 1.1.0

Esse morreu na praia pra mim.  Como essas distribuições não usam firmwares, não consigo ativar o wifi do laptop.  O Guix exige que a instalação siga por rede pra terminar.  Eu deixei o laptop numa mesa longe da rede cabeada.  Entre mexer o laptop pra minha mesa ou puxar um cabo até o outro quarto eu preferi simplesmente deixar de lado.  Tentei procurar por um livecd ou algo do gênero mas não encontrei.

 Trisquel 8.0

O Trisquel teve a instalação relativamente tranquila.  Uma voz robotizada ficava falando tudo o que eu teclava mas deu tudo certo.  Como esperado não funcionou com o wifi mas teve o touchpad do laptop funcionado desde a instalação.

uname:

Linux triquel 4.4.0-119-generic #143+8.0trisquel2 SMP Thu Apr 5 16:24:48 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

 

cpuinfo:

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 60
model name      : Intel(R) Core(TM) i7-4600M CPU @ 2.90GHz
stepping        : 3
microcode       : 0x16
cpu MHz         : 2222.578
cache size      : 4096 KB
physical id     : 0
siblings        : 4
core id         : 0
cpu cores       : 2
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_
perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movb
e popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm epb invpcid_single retpoline kaiser tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 e
rms invpcid rtm xsaveopt dtherm ida arat pln pts
bugs            : cpu_meltdown spectre_v1 spectre_v2
bogomips        : 5786.73
clflush size    : 64
cache_alignment : 64
address sizes   : 39 bits physical, 48 bits virtual
power management:

 

vulnerabilidades:

/sys/devices/system/cpu/vulnerabilities/meltdown:Mitigation: PTI
/sys/devices/system/cpu/vulnerabilities/spectre_v1:Mitigation: OSB (observable speculation barrier, Intel v6)
/sys/devices/system/cpu/vulnerabilities/spectre_v2:Mitigation: Full generic retpoline

 

Parabola 2019.06

uname:

Linux parabolaiso 5.1.6-gnu-1 #1 SMP PREEMPT Sat Jun 1 21:40:45 UTC 2019 x86_64 GNU/Linux

 

cpuinfo:

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 60
model name      : Intel(R) Core(TM) i7-4600M CPU @ 2.90GHz
stepping        : 3
microcode       : 0x16
cpu MHz         : 1069.269
cache size      : 4096 KB
physical id     : 0
siblings        : 4
core id         : 0
cpu cores       : 2
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_
perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe p
opcnt aes xsave avx f16c rdrand lahf_lm abm cpuid_fault epb invpcid_single pti tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm 
xsaveopt dtherm ida arat pln pts
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds
bogomips        : 5788.69
clflush size    : 64
cache_alignment : 64
address sizes   : 39 bits physical, 48 bits virtual
power management:

 

vulnerabilidades:

/sys/devices/system/cpu/vulnerabilities/l1tf:Mitigation: PTE Inversion; VMX: conditional cache flushes, SMT vulnerable
/sys/devices/system/cpu/vulnerabilities/mds:Vulnerable: Clear CPU buffers attempted, no microcode; SMT vulnerable
/sys/devices/system/cpu/vulnerabilities/meltdown:Mitigation: PTI
/sys/devices/system/cpu/vulnerabilities/spec_store_bypass:Vulnerable
/sys/devices/system/cpu/vulnerabilities/spectre_v1:Mitigation: __user pointer sanitization
/sys/devices/system/cpu/vulnerabilities/spectre_v2:Mitigation: Full generic retpoline, STIBP: disabled, RSB filling

 

Debian Buster

uname:

Linux debian 4.19.0-9-amd64 #1 SMP Debian 4.19.118-2 (2020-04-29) x86_64 GNU/Linux

 

cpuinfo:

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 60
model name      : Intel(R) Core(TM) i7-4600M CPU @ 2.90GHz
stepping        : 3
microcode       : 0x16
cpu MHz         : 1903.637
cache size      : 4096 KB
physical id     : 0
siblings        : 4
core id         : 0
cpu cores       : 2
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_
perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe p
opcnt aes xsave avx f16c rdrand lahf_lm abm cpuid_fault epb invpcid_single pti tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm 
xsaveopt dtherm ida arat pln pts
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs taa itlb_multihit
bogomips        : 5786.32
clflush size    : 64
cache_alignment : 64
address sizes   : 39 bits physical, 48 bits virtual
power management:

 

vulnerabilidades:

/sys/devices/system/cpu/vulnerabilities/itlb_multihit:KVM: Mitigation: Split huge pages
/sys/devices/system/cpu/vulnerabilities/l1tf:Mitigation: PTE Inversion; VMX: conditional cache flushes, SMT vulnerable
/sys/devices/system/cpu/vulnerabilities/mds:Vulnerable: Clear CPU buffers attempted, no microcode; SMT vulnerable
/sys/devices/system/cpu/vulnerabilities/meltdown:Mitigation: PTI
/sys/devices/system/cpu/vulnerabilities/spec_store_bypass:Vulnerable
/sys/devices/system/cpu/vulnerabilities/spectre_v1:Mitigation: usercopy/swapgs barriers and __user pointer sanitization
/sys/devices/system/cpu/vulnerabilities/spectre_v2:Mitigation: Full generic retpoline, STIBP: disabled, RSB filling
/sys/devices/system/cpu/vulnerabilities/tsx_async_abort:Vulnerable: Clear CPU buffers attempted, no microcode; SMT vulnerable

 

Ubuntu 18.04

uname:

Linux ubuntu 4.15.0-29-generic #31-Ubuntu SMP Tue Jul 17 15:39:52 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

 

cpuinfo:

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 60
model name      : Intel(R) Core(TM) i7-4600M CPU @ 2.90GHz
stepping        : 3
microcode       : 0x16
cpu MHz         : 2047.970
cache size      : 4096 KB
physical id     : 0
siblings        : 4
core id         : 0
cpu cores       : 2
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_
perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe p
opcnt aes xsave avx f16c rdrand lahf_lm abm cpuid_fault epb invpcid_single pti tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm xsaveop
t dtherm ida arat pln pts
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass
bogomips        : 5786.49
clflush size    : 64
cache_alignment : 64
address sizes   : 39 bits physical, 48 bits virtual
power management:

 

vulnerabilidades:

/sys/devices/system/cpu/vulnerabilities/meltdown:Mitigation: PTI
/sys/devices/system/cpu/vulnerabilities/spec_store_bypass:Vulnerable
/sys/devices/system/cpu/vulnerabilities/spectre_v1:Mitigation: __user pointer sanitization
/sys/devices/system/cpu/vulnerabilities/spectre_v2:Mitigation: Full generic retpoline

 

Sobre os resultados

A comparação é difícil porque cada um dos sistemas operacionais roda com uma versão de kernel diferente.  Todas baseadas em Linux.

Todas mostram em cpuinfo que detectam as falhas de spectre_v[1,2] e meltdown, além das demais.

Como mostrado pelas distros com kernels mais recentes, várias vulnerabilidades estão ainda abertas.  O sistema continua vulnerável aos ataques de especulação mas não aos spectre v1 e v2, nem meltdown.  Realmente sobre essas duas vulnerabilidades o Oliva está certo.  Só errou que o restante continua vulnerável e inseguro sem as correções de firmware.

Não imagino que possam ser corrigidas em versões mais recentes pois precisam do firmware da Intel pra mudar o microcode direto na CPU.

Quem continuar utilizando algumas dessas distros é interessante ficar de olho qual bug de CPU foi corrigido e qual ainda está pendente.  E ter cuidado ao usar o computador, pois o mesmo continua vulnerável a ataques de especulação mesmo rodando somente software livre.

Trocando HDD com LVM

Categoria: Linux Publicado: Terça, 31 Março 2020 Escrito por Helio Loureiro

Já faz algum tempo que quero escrever sobre meu uso de LVM, mas até agora a procrastinação venceu.   No último artigo Trabalhando de home-office eu descrevei meu ambiente de home-office e um pouco do meu desktop.  Ao entrar no desktop é que percebi que um dos HDDs simplemente parou de funcionar, esse Seagate Firecuda de 2 TB.  Graças ao LVM eu não percebi nada, nem perdi dados.  E vou descrever aqui o cenário e como fiz a troca e re-sincronismo dos dados.

Usando o comando lvm é possível ver o estado dos meu volumes:

root@goosfraba:~# lvs 
 LV       VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
 home     diskspace -wi-ao---- 450.00g                                                     
 root     diskspace -wi-ao----   5.00g                                                     
 steam    diskspace rwi-aor-r- 750.00g                                    100.00           
 swap     diskspace -wi-ao----  15.00g                                                     
 tmp      diskspace -wi-ao----   5.00g                                                     
 usr      diskspace -wi-ao----  95.00g                                                     
 usrlocal diskspace -wi-ao---- 600.00g                                                     
 var      diskspace -wi-ao----  40.00g                                                    

Minhas partições eram todas XFS mas descobri que alguns jogos da Steam simplesmente só rodam com EXT4.  Então precisei criar uma partição EXT4 somente pros jogos.  É o volume com nome de "steam" e que mostra um "100.00".   Esse número representa a cópia no disco que falhou, que estava em RAID1.

Primeiro eu adicionei outro disco de 2 TB que tinha aqui (no passado eu usava 2 HDDs de 2 TB cada com LVM, comprei o HDD novo de 4 TB e removi 1 dos HDDs que estava em bom estado ainda), e particionei da mesma forma que o HDD de 4 TB, com uma partição EFI e outra de boot do mesmo tamanho.  O restante pro LVM.

root@goosfraba:~# fdisk -l /dev/sdb 
Disco /dev/sdb: 1.8 TiB, 2000398934016 bytes, 3907029168 setores
Unidades: setor de 1 * 512 = 512 bytes
Tamanho de setor (lógico/físico): 512 bytes / 512 bytes
Tamanho E/S (mínimo/ótimo): 512 bytes / 512 bytes
Tipo de rótulo do disco: dos
Identificador do disco: 0x18a6e3b6

Dispositivo Inicializar  Início        Fim    Setores Tamanho Id Tipo
/dev/sdb1                  2048    1128447    1126400    550M ef EFI (FAT-12/16/32)
/dev/sdb2               1128448    5322751    4194304      2G 83 Linux
/dev/sdb3               5322752 3907029167 3901706416    1.8T 8e Linux LVM

Tendo a partição sdb3 disponível pro LVM, então o que faltava era adicionar o grupo de volumes que uso.  Ao listar os discos físicos disponíveis, apareceu a informação ainda do disco antigo como "unknown".

root@goosfraba:~# pvdisplay  
 WARNING: Device for PV N26Uhr-VM1o-ocfo-V7FR-26oS-BgFB-t1IA9t not found or rejected by a filter.
 --- Physical volume ---
 PV Name               /dev/sda3
 VG Name               diskspace
 PV Size               <3.64 TiB / not usable <4.82 MiB
 Allocatable           yes  
 PE Size               4.00 MiB
 Total PE              953211
 Free PE               451450
 Allocated PE          501761
 PV UUID               9wmB4t-RyQP-uDc2-2hNO-wn7c-7wq8-GcQV8S
   
 --- Physical volume ---
 PV Name               [unknown]
 VG Name               diskspace
 PV Size               <1.82 TiB / not usable <4.09 MiB
 Allocatable           yes  
 PE Size               4.00 MiB
 Total PE              476931
 Free PE               284930
 Allocated PE          192001
 PV UUID               N26Uhr-VM1o-ocfo-V7FR-26oS-BgFB-t1IA9t
   
 "/dev/sdb3" is a new physical volume of "<1.82 TiB"
 --- NEW Physical volume ---
 PV Name               /dev/sdb3
 VG Name                
 PV Size               <1.82 TiB
 Allocatable           NO
 PE Size               0    
 Total PE              0
 Free PE               0
 Allocated PE          0
 PV UUID               CvlXC4-LiEI-mr0c-vSky-oryk-Khrl-J1dyBa

Isso acontenceu porque o metadado ainda estava lá apesar do disco ter sido removido da máquina.   Enquanto isso a partição sdb3 aparece como "Allocatable NO" pois ainda não está disponível pra uso.

A primeira coisa é remover os dados incosistes do vg (volume group).

root@goosfraba:~# vgreduce diskspace --removemissing --force 
 WARNING: Device for PV N26Uhr-VM1o-ocfo-V7FR-26oS-BgFB-t1IA9t not found or rejected by a filter.
 Wrote out consistent volume group diskspace.

E adicionar a nova partição ao vg.

root@goosfraba:~# vgextend diskspace /dev/sdb3 
 Volume group "diskspace" successfully extended

Com isso o a informação de pv mostra como usado.

root@goosfraba:~# pvdisplay  
 --- Physical volume ---
 PV Name               /dev/sda3
 VG Name               diskspace
 PV Size               <3.64 TiB / not usable <4.82 MiB
 Allocatable           yes  
 PE Size               4.00 MiB
 Total PE              953211
 Free PE               451450
 Allocated PE          501761
 PV UUID               9wmB4t-RyQP-uDc2-2hNO-wn7c-7wq8-GcQV8S
      
 --- Physical volume ---
 PV Name               /dev/sdb3
 VG Name               diskspace
 PV Size               <1.82 TiB / not usable <2.09 MiB
 Allocatable           yes  
 PE Size               4.00 MiB
 Total PE              476282
 Free PE               476282
 Allocated PE          0
 PV UUID               CvlXC4-LiEI-mr0c-vSky-oryk-Khrl-J1dyBa

E a informação de vg mostra com 6 TB disponíveis pra uso.

root@goosfraba:~# vgdisplay  
 --- Volume group ---
 VG Name               diskspace
 System ID              
 Format                lvm2
 Metadata Areas        2
 Metadata Sequence No  217
 VG Access             read/write
 VG Status             resizable
 MAX LV                0
 Cur LV                8
 Open LV               8
 Max PV                0
 Cur PV                2
 Act PV                2
 VG Size               5.45 TiB
 PE Size               4.00 MiB
 Total PE              1429493
 Alloc PE / Size       501761 / 1.91 TiB
 Free  PE / Size       927732 / <3.54 TiB
 VG UUID               f2ufnI-c802-yt6f-2nMG-6BYl-8atu-wbR7vO

Agora a partição já faz parte do lvm.  O que resta é a usar como RAID1 em mirror.  Ou mesmo como uma partição qualquer se eu quisesse.  Mas no caso uso como RAID1 pra ter um pouco mais de desempenho.

Primeiramente removendo as informações de RAID1 que ainda existindo.

root@goosfraba:~# lvconvert -m 0 /dev/diskspace/steam 
Are you sure you want to convert raid1 LV diskspace/steam to type linear losing all resilience? [y/n]: y
 Logical volume diskspace/steam successfully converted.
root@goosfraba:~# lvs
 LV       VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
 home     diskspace -wi-ao---- 450.00g                                                     
 root     diskspace -wi-ao----   5.00g                                                     
 steam    diskspace -wi-ao---- 750.00g                                                     
 swap     diskspace -wi-ao----  15.00g                                                     
 tmp      diskspace -wi-ao----   5.00g                                                     
 usr      diskspace -wi-ao----  95.00g                                                     
 usrlocal diskspace -wi-ao---- 600.00g                                                     
 var      diskspace -wi-ao----  40.00g                                                    

O parâmetro "-m 0" diz que a partição será em RAID0.

Em seguida basta mudar a partição novamente pra RAID1 e o sincronismo iniciará.

root@goosfraba:~# lvconvert -m 1 /dev/diskspace/steam /dev/sdb3 
Are you sure you want to convert linear LV diskspace/steam to raid1 with 2 images enhancing resilience? [y/n]: y
 Logical volume diskspace/steam successfully converted.
root@goosfraba:~# lvs
 LV       VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
 home     diskspace -wi-ao---- 450.00g                                                     
 root     diskspace -wi-ao----   5.00g                                                     
 steam    diskspace rwi-aor--- 750.00g                                    0.00             
 swap     diskspace -wi-ao----  15.00g                                                     
 tmp      diskspace -wi-ao----   5.00g                                                     
 usr      diskspace -wi-ao----  95.00g                                                     
 usrlocal diskspace -wi-ao---- 600.00g                                                     
 var      diskspace -wi-ao----  40.00g                                                     
root@goosfraba:~# lvs
 LV       VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
 home     diskspace -wi-ao---- 450.00g                                                     
 root     diskspace -wi-ao----   5.00g                                                     
 steam    diskspace rwi-aor--- 750.00g                                    34.56            
 swap     diskspace -wi-ao----  15.00g                                                     
 tmp      diskspace -wi-ao----   5.00g                                                     
 usr      diskspace -wi-ao----  95.00g                                                     
 usrlocal diskspace -wi-ao---- 600.00g                                                     
 var      diskspace -wi-ao----  40.00g                                                    

E é isso.  Simples e rápido graças ao LVM.

 

Tentando arrumar a barra de rolagem em aplicativos GTK

Categoria: Linux Publicado: Sexta, 07 Fevereiro 2020 Escrito por Helio Loureiro

Eu tenha plena certeza que um dos círculos do inferno de Dante é feito em GTK e roda Gnome.  Certeza pura.  Estou pra conhecer um widget mais porcaria que GTK.  Não tem jeito de eu gostar dele, nem Gnome.

Eu já tinha escrito aqui sobre o problema com fontes em Fontes de aplicativos em GTK no KDE e também o problema com a mesma barra de rolagem em Corrigindo as teclas de rolagem em GTK.  Mas descobri recentemente que o infeliz do leitor de mails evolution, feito em GTK, tem a maravilhosa barra de rolagem que desaparece.

Image do leitor de mails evolution sem a barra de rolagem.
Cadê a barra de rolagem lateral?

Antes de qualquer manifestação a respeito, sim estou mostrando as partes de mail da Linux Journal, que infelizmente fechou as portas definitivamente.  E por isso as datas de 2018.  Mas é só olhar a image que nota-se a falta das barras de rolagem, tanto pro texto quanto pras mensagens.

Garimpando na Internet achei dois artigos sobre o mesmo problema e como o corrigir:

https://forum.endeavouros.com/t/disable-scrollbar-fading/1488/4

https://techne.alaya.net/?p=19006

Basicamente uma solução sugere que em /etc/environment seja adicionado a variável "GTK_OVERLAY_SCROLLING=0".  É possível já testar pelo terminal essa opção, o que não adiantou nada pra mim.  Mesmo forçando o uso da variável com o comando:

helio@xps13ubuntu:~$ gdbus call \
--session --dest org.freedesktop.DBus \
--object-path /org/freedesktop/DBus \
--method org.freedesktop.DBus.UpdateActivationEnvironment '{"GTK_OVERLAY_SCROLLING": "0"}'

A outra solução sugerida é adicionar em ~/.config/gtk-3.0/settings.ini:  

[Settings]
gtk-primary-button-warps-slider=false

Há outros relatos dizendo pra usar "gtk-primary-button-warps-slider=0" mas também não deu muito certo para mim.

E essa é a parte horrorosa do GTK e Gnome.  Não existe uma configuração simples de fazer.  Tudo são comandos e configurações enfiadas em cantos escuros do sistema.

Como alguém consegue criar algo assim e achar bom?  Eu realmente não entendo.  E continuo procurando uma solução pro evolution, que é o cliente de mail padrão da empresa e não posso trocar por outro (mesmo porque se fosse em thunderbird, também é em GTK).

Por enquanto eu consegui amenizar o uso da barra de rolagem que aparece com o mouse passando sobre ele com uam configuração de estilo no GTK.

helio@xps13ubuntu:~$ cat ~/.config/gtk-3.0/gtk.css  
scrollbar, scrollbar button, scrollbar slider {
   -GtkScrollbar-has-backward-stepper: true;
   -GtkScrollbar-has-forward-stepper: true;
   min-width: 15px;
   min-height: 15px;
   border-radius: 0;
}

Não está bonito, mas funciona melhor que a versão anterior.

E após um reboot indesejado, aparentemente o GTK_OVERLAY_SCROLLING deu certo e as barras apareceram definitivamente.

Ficou meio tosco com meu css mas pelo menos não desaparecem.