Mac i problemy z locale w terminalu – HOWTO

Jak pisałem, częściowo siedzę na macu. Zrozumiałem ludzi, którzy narzekali na obsługę systemu klawiaturą w macach. Wiele skomplikowanych combo na trzy palce. Ale to mogła by być kwestia przyzwyczajenia, zwłaszcza w trybie graficznym. Jeśli jednak ktoś korzysta głównie z terminala, to „fun” jest na zupełnie innym poziomie. Otóż funkcję klawisza Ctrl w macOS „normalnie” (czyli w GUI) spełnia lewy klawisz command, umieszczony tam, gdzie normalnie jest alt. Jeśli jednak przejdziemy do terminala, to w aplikacjach uruchomionych w konsoli żeby zrobić ctrl-c należy wcisnąć… control-c. Tak, jest też osobny klawisz control, którego należy używać w terminalu.

Jeśli jednak korzystamy z VirtualBox i uruchomimy tam Linuksa, to żeby utworzyć nową zakładkę w przeglądarce należy użyć… control-t. W GUI. W tej samej przeglądarce pod macOS używamy command-t. IMO totalna porażka UXowa i coś do czego nie sposób się przyzwyczaić, jeśli ktoś używa systemów na przemian. Można najwyżej nieustannie pamiętać, ale u mnie kończy się to masą missclicków. Zobaczę jeszcze co będzie po podłączeniu zewnętrznej, pecetowej klawiatury, choć to raczej z ciekawości – w końcu to nie stacjonarka. Ew. poszukam jakiegoś software’owego rozwiązania, choć staram się unikać przemapowywania klawiszy jak mogę – ciężko się później korzysta z instrukcji w necie.

Z pozytywów – doceniam działające kopiowanie i wklejanie w terminalu przy pomocy command-c i command-v. Pod Linuksem są na to osobne skróty, choć do tego akurat używałem myszy i zaznacz (i automatycznie skopiuj) i środkowego przycisku do wklejania. Domyślnie działa też – analogicznie jak pod Linuksem – wklejanie zaznaczonego w terminalu tekstu przy pomocy środkowego klawisza myszy. Niestety, jest ograniczone do konsoli, aby skopiować jakieś polecenie z przeglądarki trzeba już używać skrótów klawiszowych.

Wracając do tematu z topica. Po zmianie systemu na macOS i logowaniu przy pomocy ssh na serwery witał mnie komunikat w stylu:

-bash: warning: setlocale: LC_ALL: cannot change locale (pl_PL.UTF-8)
-bash: warning: setlocale: LC_ALL: cannot change locale (pl_PL.UTF-8)
-bash: warning: setlocale: LC_ALL: cannot change locale (pl_PL.UTF-8)

Sprawa jasna, problem ustawieniami locales, tyle, że nigdy mi się nie zdarzał, w systemie (macOS) niby są ustawione. Na chwilę odpuściłem temat, bo mało estetyczny komunikat przy logowaniu to nie dramat, ale szybko okazało się, że potrafi to wpływać – rzecz jasna ujemnie – na działanie poleceń i skryptów. Gdy tylko siadłem do szukania rozwiązania okazało się, że problem jest popularny, wręcz powszechny.

Pierwsze rozwiązanie, które znalazłem, wyglądało elegancko i nawet tłumaczyłoby, czemu nie działa skoro locales są ustawione. Niestety, po włączeniu i otwarciu nowych zakładek w terminalu, a nawet restarcie terminala okazało się, że… nie działa. Teraz widzę, że rozwiązanie jest stare, z 2012, wtedy mi umknęło.

Dopiero tu znalazłem faktyczne rozwiązanie problemu z locale w terminalu pod macOS. Jest proste i sprowadza się do dodania dwóch linii w pliku ~/.bash_profile:

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

Powinno działać także z wersją polską, ale nie testowałem – w moim przypadku powyższa wersja jest OK, przynajmniej po pobieżnym sprawdzeniu nie zauważyłem problemów. Ustawienie z pierwszego rozwiązania również zostawiłem.

Aktualizacja Debiana do Buster

Parę dni temu Debian ogłosił wydanie nowego stabilnego wydania o nazwie kodowej Buster. Skoro aktualizacja do Buster stała się możliwa, zacząłem ją natychmiast, ale dopiero teraz mogę nieco o niej napisać.

Przede wszystkim, pospieszyłem się. Szóstego lipca tylko zerknąłem na newsy i… pomyliłem poprzedniego newsa, dotyczącego wydania wersji 9.9 z wydaniem Bustera. Co prawda rzecz działa się już w trakcie wydawania (co widać było na Twitterze), ale zrobiłem lekki falstart.

Lekko zdziwił mnie brak release notes (zasługa falstartu). Ale większość rzeczy mam odseparowanych w kontenerach LXC, więc aktualizacje powinny proste, poza tym, który to już raz? Wziąłem na warsztat przy kawie jedną maszynkę fizyczną i kontenery LXC na niej. Kontenery poszły od kopa w stylu apt-get update && apt-get upgrade && apt-get update && apt-get dist-upgrade. Nie jest to zalecany sposób – w release notes jest napisane, by korzystać z apt. Nie wiedziałem o tym i… nie miało to znaczenia.

Aktualizacja hypervisora również gładka, kontrolny reboot i… kontenery się nie podnoszą. Co prawda apt-listchanges (polecam!) pisał, że LXC 3 got some significant changes from LXC 2, ale pozwoliłem zmienić konfigurację do nowej wersji, stosowane brakujące linie też były dodane. Wyszukiwarka nie pomagała, ludzie na kanale też nie. Z szybkiego upgrade od kawy zrobiła się godzinna walka z debugiem. Okazało się, że czyste, nowe kontenery z Busterem z minimalnym konfigiem także nie startują (error w loglevel INFO, hmm…):

# create
lxc-create -n test3 -t download -- -d debian -r buster -a amd64

# run
lxc-start -n test3 -l debug -o /tmp/debuuug.txt

# logs
tail -n 8 /tmp/debuuug.txt
lxc-start test3 20190706132233.984 NOTICE   start - start.c:start:2037 - Exec'ing "/sbin/init"
lxc-start test3 20190706132233.985 NOTICE   start - start.c:post_start:2048 - Started "/sbin/init" with pid "8584"
lxc-start test3 20190706132233.985 NOTICE   start - start.c:signal_handler:430 - Received 17 from pid 8582 instead of container init 8584
lxc-start test3 20190706132233.985 DEBUG    lxccontainer - lxccontainer.c:wait_on_daemonized_start:830 - First child 8580 exited
lxc-start test3 20190706132233.999 DEBUG    start - start.c:signal_handler:447 - Container init process 8584 exited
lxc-start test3 20190706132233.999 INFO     error - error.c:lxc_error_set_and_log:49 - Child <8584> ended on error (255)
lxc-start test3 20190706132233.999 DEBUG    network - network.c:lxc_delete_network:3180 - Deleted network devices
lxc-start test3 20190706132234.152 INFO     conf - conf.c:run_script_argv:356 - Executing script "/usr/share/lxcfs/lxc.reboot.hook" for container "test3", config section "lxc"

O dziwo kontenery w wersji ze Squeeze startowały. Doraźnie wróciłem w kontenerach do Squeeze (z backupu, nie downgrade) i na pewien czas zostawiłem sprawę. Mimo, że okazało się, że startują dość kulawo. Nie podnosiła się sieć ani nie uruchamiały usługi, trzeba to było robić ręcznie po każdym restarcie kontenera. Niefajne, ale do czasu znalezienia rozwiązania docelowego można wytrzymać, tym bardziej, że restarty są rzadkością.

Ostatecznie właśnie problemy ze startem i porównanie działania LXC na innym, świeżym hypervisorze z Buster, gdzie wszystko działało bez problemu naprowadziły mnie na rozwiązanie. Przy diagnostyce przy pomocy systemctl status otrzymywałem komunikat:

System has not been booted with systemd as init system (PID 1). Can't operate

Rozwiązaniem okazało się przejście na systemd i odinstalowanie pakietów związanych ze starym systemem init (niestety nie zapisałem nazw). IIRC na hypervisorze i w kontenerach. Po tym zabiegu wszystko działa poprawnie i startuje automatycznie, zarówno ze Squeeze w kontenerach, jak i po aktualizacji do Bustera.

Nie zaktualizowałem jeszcze wszystkich maszyn[1], ale z godnych odnotowania zmian – kontener generujący Planetę Joggera dostał aktualzację do Bustera bezpośrednio z Jessie zresztą[2]. Z działaniem na Squeeze był problem, na wersji testowej czy unstable także wtedy nie działało. Na szczęście jest już poprawione, co oznacza, że planeta ma szansę istnieć kolejne parę lat.

Ogólnie póki co aktualizacja całkiem przyjemna i prosta, o ile się ma systemd.

UPDATE: Na ostatnim serwerze napotkałem kolejny problem – skrypty w Pythonie korzystające z virtualenv przestały działać. Rozwiązanie łatwe do znalezienia po wpisaniu komunikatu – trzeba usunąć i utworzyć virtualenv na nowo. Dotyczyło zarówno Pythona 2 jak i Pythona 3.

[1] Został jeden serwer i jakieś desktopy na których akurat nie mam unstable i RPi robiące za router. Trochę boję się go zdalnie aktualizować, bo to zdalny system i nie mam żadnej alternatywnej łączności.

[2] Aktualizacja z przeskokiem wersji nie jest zalecanym sposobem. Jednak skoro to tylko okrojony kontener, który mogę w każdej chwili przywrócić z backupu, to czemu by nie spróbować?

Pierwszy mac

Drugi raz wpis o podobnym tytule. Poprzedni był primaaprilisowym żartem, ten jest jak najbardziej na serio. Przesiadka z Linuksa nie do końca z własnej woli. Ot, korporacyjne standardy, czyli jedzie walec i równa, ale mniejsza o powody. Ludzie z Linuksami na pokładzie otrzymali propozycję nie do odrzucenia zmiany systemu i/lub sprzętu na coś należycie korporacyjnego. Znaczy Windows lub macOS, co kto lubi. Oddając sprawiedliwość – firma poszła na rękę i zapewniła okres przejściowy i możliwość szybkiego pomacania nowego sprzętu. Przynajmniej w teorii, bo to grubsza zmiana, dostosowanie komputera trochę trwa, a na nadmiar czasu nikt nie narzeka.

Tak czy inaczej – stało się. Wybrałem macOS na laptopie 13″ (co to dokładnie – uzupełnię wkrótce, nie mam go chwilowo pod ręką) z amerykańską klawiaturą (szeroki Enter). Powodów kilka – większość ludzi z którymi mam styczność w firmie korzysta, od Linuksa do Uniksa niby niedaleko (choć już wcześniej wiedziałem, że niektóre specyficzne dla macOS problemy są z commandline’owymi narzędziami są bohatersko rozwiązywane), no i last but not least będzie okazja poznać coś nowego. Wcześniej upewniłem się tylko, że ludzie, którzy się przesiadają jakoś żyją (mapowanie klawiszy, konfiguracja przewijania, soft) i że mysz (zwykły bezprzewodowy Logitech) działa normalnie, bo fanem gładzików nie jestem, delikatnie rzecz ujmując, a brak przycisków myszy zwyczajnie mnie drażni. Tak, wiem, gładzik w macach jest lepszy. Przelotnie korzystałem i nadal nie jestem fanem, lubię pewność sterowania i kliknięć, jaką daje mysz.

Wybrałem słabszą wersję 13″ – niestety 15″, choć ma mocniejsze komponenty, jest dla mnie odrobinę za duży. Już jakiś czas temu stwierdziłem, że optymalny dla mnie rozmiar ekranu w lapku to 14″, jeśli mam korzystać mobilnie. Nie do końca rozumiem, czemu robią właśnie 13″ – porównywałem z Dellem 14″ i mac jest jedynie minimalnie mniejszy.

Trochę żałowałem wyboru jeszcze nim odebrałem sprzęt, bo wkrótce po nim okazało się, że Windows jeszcze mocniej integruje się z Linuksem (WSL2). Nie chciałem ryzykować WSL, z którego wcześniej nie korzystałem, tym bardziej, że znajomi generalnie są z maców zadowoleni. Znaczy z macOS, bo na wbudowane klawiatury klną wszyscy, posiłkując się dołączanymi bezprzewodowymi.

Na wstępie dostałem… przejściówkę z USB-C na USB-A, żebym mógł podłączyć czy to dysk, czy pendrive czy – w moim przypadku – mysz. Pierwsze wrażenie – mieszane. Sprzęt wygląda na bardzo delikatny, ale w dotyku jest solidny i… zaskakująco ciężki. Zdjęć z unboxingu nie mam, zresztą chyba nie podszedłem do niego z należytym szacunkiem. W stosunku do Della, którego miałem wcześniej – po obrysie jak pisałem podobny, różnicę widać gdy się je położy obok siebie, zamknie i spojrzy od frontu. Mac jest znacznie cieńszy, niemal o połowę, choć Dell również z tych cieńszych, z ruchomym elementem dla gniazda ethernet. Trochę sztuka dla sztuki jak dla mnie – pewnie utrudnia to upchanie gratów w środku, chłodzenie, odbija się na solidności itp., a korzyść dla mnie żadna.

Jak widać założyłem kategorię, więc planuję trochę wpisów w temacie, pewnie z czasem pojawi się trochę howto dla przesiadających się. Są pierwsze pozytywy z godzinnego obcowania i podstawowej konfiguracji – o dziwo mimo braku przemapowania klawiszy nie zauważyłem trudności z klawiaturą. Poza brakiem klawiszy funkcyjnych, PgUp/PgDn, backspace i fizycznego Esc, oczywiście. I dopóki nie zacząłem próbować pisać z pl-znakami. Aplikacje umiem instalować, choć o instalacji będzie następnym razem.

Taki nieco zaległy wpis, w zasadzie powinienem już pisać o instalacji, ale ponieważ to mój pierwszy mac…