Jak mogę dostosować tło konsoli pełnoekranowej (TTY)?

17

Kiedyś aktywnie korzystałem z konsol pełnoekranowych (otwartych za pomocą Ctrl+ Alt+ F1... F6) i wpadłem na pomysł, że chciałbym spróbować ozdobić ją pewnego rodzaju „tapetą” (oczywiście ciemną i monotonna) aby nie zmniejszało to czytelności), być może mogłoby to wyglądać i czuć się ładnie (lub nie, ale muszę spróbować). Byłoby jeszcze lepiej, gdybym mógł ustawić różne obrazy jako różne tła konsoli (jeden dla Ctrl+ Alt+ F1, inny dla Ctrl+ Alt+ F2itd.).

Fakt, że konsole mają znacznie wyższą rozdzielczość niż tryb czystego tekstu, sugeruje, że używany jest dla nich pełnoprawny tryb graficzny i wszystko jest możliwe. Ale jak?

Ivan
źródło
2
Niemożliwy. Konsole wirtualne są tylko tekstowe.
Sergiy Kolodyazhnyy
5
@Serg Używam trybów tekstowych od czasu, gdy Linux nawet nie istniał - uwierz mi, potrafię odróżnić tryb tekstowy od emulacji graficznej. Wiele osób nie wyobraża sobie tego obecnie, ale nawet oglądałem filmy w konsolach bez zainstalowanego serwera X podczas Linuksa 2.4. To sprawia, że ​​wątpię, czy to w rzeczywistości niemożliwe.
Ivan
1
OK, pozwólcie, że się poprawię: wierzę w oglądanie obrazów i filmów w konsoli z powodu czegoś znanego jako framebufferurządzenie, ale z tym ekranem jest zajęty wyjście jakiegoś programu, takiego jak fbi. TTY sam w sobie jest nadal urządzeniem tekstowym
Sergiy Kolodyazhnyy
2
Obliczysz nagrodę za twoje pytanie, gdy tylko się spełni. Zainteresowałem się
Sergiy Kolodyazhnyy
1
Sprawdź to: code.google.com/p/fbterm
Sergiy Kolodyazhnyy

Odpowiedzi:

12

Jestem prawie pewien, że sterownik konsoli Linux nie ma wbudowanej tej możliwości, jednak istnieje wywoływana aplikacja, fbtermktóra może to zrobić. Aby obrazy w tle działały, potrzebujesz również narzędzia, które może wyświetlać obraz w buforze ramki, takiego jak fbi:

sudo apt-get install fbterm fbi

fbtermtak naprawdę nie czyta ani nie wyświetla obrazów tła, oczekuje, że jakiś inny program skonfiguruje obraz tła na ekranie przed jego uruchomieniem. Na stronie podręcznika znajdują się instrukcje, fbtermjak to zrobić za fbvpomocą absolutnie przestarzałego i nieobsługiwanego narzędzia, którego nie mogłem nawet skompilować na nowoczesnym systemie Ubuntu. fbijest znacznie czystszą i ładniejszą przeglądarką obrazów dla bufora ramki, ale niestety nie ma funkcji „ustaw i wyjdź” prostszej fbv, a zatem przeszkadza, fbtermjeśli spróbujesz użyć go bezpośrednio. Udało mi się jednak wymyślić alternatywę, która działa:

Najpierw musisz użyć fbii catwyświetlić żądany obraz, a następnie zrzucić go do pliku obrazu „raw framebuffer”. Jako root w konsoli bufora ramki uruchom:

( sleep 1; cat /dev/fb0 > nifty-background.fbimg ) & fbi -t 2 -1 --noverbose -a nifty-background.png

(To będzie wyświetlać obraz na kilka sekund, a następnie zjazd, po zapisany wynik w pliku nifty-background.fbimg. Wymień nifty-background.fbimgi nifty-background.pngze cokolwiek jest nazewnictwo chcesz, oczywiście).

Pierwsza część polecenia czeka 1 sekundę przed umieszczeniem zawartości bufora ramki w pliku. W tym samym czasie uruchamia fbisię druga część (po &), aby wyświetlić obraz w buforze ramki, dzięki czemu gdy komenda cat zabierze się do wykonania (1 sekunda później), jest tam obraz do zrzucenia. Powodem, dla którego są w tej kolejności, jest to, że znalazłem fbiproblemy, jeśli nie były uruchomione na pierwszym planie, co oznacza, że ​​musi to być ostatnie polecenie na liście.

Odtąd, za każdym razem, gdy chcesz uruchomić fbterm, możesz uruchomić go w ten sposób (możesz utworzyć mały skrypt otoki):

export FBTERM_BACKGROUND_IMAGE=1
cat nifty-background.fbimg > /dev/fb0; fbterm
Foogod
źródło
7

Potrafię odróżnić tryb prawdziwego tekstu od jego emulacji graficznej.

… Co jest jednym ze sposobów, w jaki spostrzegawczy mógł odróżnić prawdziwy BSOD w systemie Windows od działań żartu wygaszacza ekranu BSOD, który robił obchody dziesięć lat temu. Wyświetlanie blokowych znaków graficznych przy użyciu sprzętu karty graficznej w trybie graficznym było nieznacznie różne od znaków generowanych przez sprzęt karty graficznej w trybie tekstowym.

Tak, karta graficzna jest w trybie graficznym. Tak było już od dłuższego czasu. Tak było zawsze w systemach bez sprzętu karty graficznej. We wczesnych latach Linuksa na konsolach PC konsola miała sprzęt w postaci karty graficznej w trybie tekstowym. Ale to zastosowanie cicho zanikło prawie do zera. Obsługa Unicode dla większości użytkowników wymaga obecnie większego zestawu glifów niż sprzęt w trybie tekstowym. Oprogramowanie wewnętrzne maszyny (oczywiście) używa trybu graficznego do ekranów powitalnych (z ładnymi zdjęciami i logo firmy), podobnie jak moduł ładujący Linux i inicjalizacja systemu.

W jądrze Linuksa znajduje się emulator terminala. Jest ułożony warstwowo na buforze ramki i podsystemie zdarzeń wejściowych, do którego dostępu używa wewnętrznych interfejsów jądra. Przedstawia się systemom w trybie aplikacji jako seria wirtualnych urządzeń końcowych jądra/dev/tty1 i tak dalej.

Ten program jest dość ograniczony w porównaniu do emulatorów terminali, które działają poza jądrem Linuksa, jak zwykłe aplikacje. Emuluje tylko ograniczony podzbiór prawdziwego terminalu i brakuje mu dodatkowych funkcji tego ostatniego emulatora terminala.

To są te, na które musisz poszukać. Możesz być zaznajomiony z emulatorami terminali, które używają X do ich wejścia / wyjścia, takie jak xterm, lxterminal, konsola gnome, konsola, eterm, wterm i inne. Mniej znane są te, które używają urządzeń bufora ramki i urządzeń zdarzeń wejściowych do ich wejścia / wyjścia. udostępnianie wirtualnych terminali w przestrzeni użytkownika :

Niektóre z tych ostatnich mogą robić, co chcesz.

fbterm można skonfigurować tak, aby używał na przykład wszystkiego, co jest w buforze ramek podczas uruchamiania, jako obrazu tła. Wszystko, co należy zrobić, to użyć jednego z kilku innych narzędzi do wyświetlania obrazów bezpośrednio w buforze ramek Linux, aby skonfigurować obraz tła przed uruchomieniem fbterm. Istnieje kilka takich narzędzi, w tym:

fbvis i fbi usuwają ekran przy wyjściu i wymagają zwojów wyjaśnionych bardziej szczegółowo w odpowiedzi Foogod. dfbg jednak nie oczyszcza się po sobie, co czyni go bardziej odpowiednim do tego konkretnego zadania.

Dalsza lektura

JdeBP
źródło
Pytanie, jak utworzyć obraz tła dla konsoli. Twoja odpowiedź zawiera tylko potencjalne rozwiązania. Dlatego przyznam nagrodę za drugą odpowiedź, ale dziękuję za bogactwo dostarczonych informacji. Masz moje poparcie.
Sergiy Kolodyazhnyy,
4

Chociaż odpowiedź Foogod nie działała dla mnie, doprowadziła mnie we właściwym kierunku, dostarczając połowę rozwiązania (a mianowicie odczyt danych bufora ramki, podczas gdy fbiwyświetla obraz na ekranie TTY). Dlatego nagrodziłem jego odpowiedź nagrodą.

Poniżej znajduje się skrypt, który ułatwia uruchomienie fbtermz częściową ścieżką do obrazu jako pojedynczym argumentem wiersza poleceń

Stosowanie

Skrypt należy zapisać w katalogu wymienionym w $PATHzmiennej. Najlepiej, aby znajdował się w $HOME/binfolderze osobistym . Zobacz Jak dodać katalog do ŚCIEŻKI? o wyjaśnienie w jaki sposób dodać swoją osobistą binTO $PATH, ale tworząc katalog o nazwie binw katalogu domowym jest wystarczająca, aby dodać go do PATHdnia ponownego logowania.

Skrypt musi także mieć uprawnienia do wykonywania; możesz to ustawić za pomocą chmod +x /path/to/script.sh.

Na koniec należy go uruchomić sudo, aby umożliwić rootowi dostęp do odczytu i zapisu /dev/fb0.

Źródło skryptu

Dostępne również w moim repozytorium Github.

#!/bin/bash
# Author : Serg Kolo
# Date: Dec 5, 2015
# Description: Script to render image and set it as background
# in conjunction with fbterm
# Depends: fbterm,fbi, awk
# Written for: /ubuntu//q/701874/295286

function printUsage
{
  echo "<<< Script to set background image in TTY console"
  echo "<<< Written by Serg Kolo, Dec 5 , 2015"
  echo "<<< Usage: scriptName.sh /path/to/image"
  echo "<<< Must be ran with root privileges, in TTY only"
  echo "exiting"

}

# check if we're root, if there's at least one ARG, and it is a TTY

if [ "$(whoami)" != "root"   ] || [ "$#" -eq 0  ] ||  [ "$( tty | awk '{gsub(/[[:digit:]]/,""); gsub(/\/dev\//,"");print}' )" != "tty"  ] ;then

   printUsage
   exit 1
fi



# read the full path of the image

IMAGE="$( readlink -f "$@" )"

# Launch fbi with whatever image was supplied as command line arg
# then take out whatever is the data in framebuffer;
# Store that data to /tmp folder

( sleep 1; cat /dev/fb0 > /tmp/BACKGROUND.fbimg ; sleep 1; pkill fbi ) & fbi -t 2 -1 --noverbose -a  "$IMAGE"

# This portion is really optional; you can comment it out 
# if you choose so

echo "LAUNCH FBTERM ?(y/n)"
read ANSWER

if [ "$ANSWER" != "y"  ] ; then
   echo exiting
   exit 1
fi

# The man page states that fbterm takes screenshot of 
# what is currently in framebuffer and sets it as background
# if FBTERM_BACKGROUND_IMAGE is set to 1
# Therefore the trick is to send the framebuffer data captured
# in the last step (which will display the image on screen)
# and then launch fbterm. Note, that I send output from the command
# send to background in order to avoid the extra text displayed on 
# screen. That way we have clear image in framebuffer, without 
# the shell text, when we launch fbterm

export FBTERM_BACKGROUND_IMAGE=1 
clear
( cat /tmp/BACKGROUND.fbimg  > /dev/fb0 &) > /dev/null; sleep 0.25; fbterm 

dodatkowe informacje

Okazuje się, że użytkownik niekoniecznie musi korzystać sudo; /dev/fb0należy do videogrupy, więc użytkownicy mogą po prostu dodać się do tej grupy za pomocą

sudo usermod -a -G video $USER

W ten sposób kontrole roota w powyższym skrypcie stają się nieaktualne, a konkretnie [ "$(whoami)" != "root" ] ||część.

Sergiy Kolodyazhnyy
źródło