Bagaimana saya bisa menyesuaikan latar belakang konsol layar penuh (TTY)?

17

Saya biasa menggunakan konsol layar penuh (yang dibuka dengan Ctrl+ Alt+ F1... F6) secara aktif dan mendapat ide bahwa saya ingin mencoba menghiasinya dengan "wallpaper" sejenis (yang agak gelap dan monoton tentu saja agar tidak mengurangi keterbacaan), mungkin ini bisa terlihat dan terasa menyenangkan (atau tidak, tapi saya perlu mencoba). Akan lebih baik jika saya dapat mengatur gambar yang berbeda sebagai latar belakang konsol yang berbeda (satu untuk Ctrl+ Alt+ F1, yang lain untuk Ctrl+ Alt+ F2dll).

Fakta bahwa konsol memiliki resolusi lebih tinggi yang disediakan mode teks murni menunjukkan bahwa mode grafis lengkap digunakan untuk mereka dan semuanya mungkin. Tapi bagaimana caranya?

Ivan
sumber
2
Mustahil. Konsol Virtual hanya teks.
Sergiy Kolodyazhnyy
5
@Serg Saya telah menggunakan mode hanya teks sejak waktu Linux bahkan tidak ada - percayalah, saya dapat membedakan mode teks nyata dari emulasi grafisnya. Banyak orang hampir tidak dapat membayangkan ini saat ini tetapi saya bahkan telah menonton film di konsol tanpa X server yang diinstal sama sekali selama Linux 2.4 hari. Ini membuat saya ragu ini sebenarnya tidak mungkin.
Ivan,
1
OK, baiklah saya perbaiki sendiri: Saya percaya melihat gambar dan film di konsol, karena sesuatu yang dikenal sebagai framebufferperangkat, tetapi dengan layar yang ditempati dengan output dari beberapa program, seperti fbi. TTY dalam dan dari dirinya sendiri masih merupakan perangkat teks saja
Sergiy Kolodyazhnyy
2
Saya akan memberi hadiah pada pertanyaan Anda setelah memenuhi syarat. Saya tertarik sebenarnya
Sergiy Kolodyazhnyy
1
Lihat ini: code.google.com/p/fbterm
Sergiy Kolodyazhnyy

Jawaban:

12

Saya cukup yakin bahwa driver konsol Linux tidak memiliki kemampuan ini, namun ada aplikasi yang disebut fbtermyang dapat melakukan ini. Untuk membuat gambar latar belakang berfungsi, Anda juga memerlukan utilitas yang dapat menampilkan gambar pada framebuffer seperti fbi:

sudo apt-get install fbterm fbi

fbtermtidak benar-benar membaca atau menampilkan gambar latar belakang itu sendiri, ia mengharapkan beberapa program lain untuk mengatur gambar latar belakang pada layar sebelum dimulai. Ada instruksi di fbtermhalaman manual tentang cara melakukan ini menggunakan fbv, utilitas yang benar-benar kuno dan tidak didukung saya bahkan tidak bisa mengkompilasi pada sistem Ubuntu modern. fbiadalah penampil gambar yang jauh lebih bersih dan lebih bagus untuk framebuffer, tetapi sayangnya tidak memiliki fungsi "atur dan keluar" yang lebih sederhana fbv, dan dengan demikian mengganggu fbtermjika Anda mencoba menggunakannya secara langsung. Namun, saya dapat menemukan alternatif yang berfungsi:

Pertama, Anda harus menggunakan fbidan catmenampilkan gambar yang Anda inginkan dan kemudian membuangnya ke file gambar "framebuffer raw format". Sebagai root, di konsol framebuffer, jalankan:

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

(Ini akan menampilkan gambar selama beberapa detik dan kemudian keluar, setelah menyimpan hasilnya dalam file nifty-background.fbimg. Ganti nifty-background.fbimgdan nifty-background.pngdengan nama file apa pun yang Anda inginkan, tentu saja.)

Bagian pertama dari perintah menunggu selama 1 detik sebelum men-capping konten framebuffer ke file. Pada saat yang sama, bagian kedua (setelah &) diluncurkan fbiuntuk menampilkan gambar pada framebuffer, sehingga ketika perintah cat berkeliling untuk mengeksekusi (1 detik kemudian), ada gambar di sana untuk dibuang. Alasan mereka berada dalam urutan itu adalah karena saya menemukan fbiada masalah jika tidak berjalan di latar depan, yang berarti itu harus menjadi perintah terakhir dalam daftar.

Sejak saat itu, kapan pun Anda ingin menjalankan fbterm, Anda dapat memulainya seperti itu (Anda mungkin ingin membuat skrip pembungkus kecil):

export FBTERM_BACKGROUND_IMAGE=1
cat nifty-background.fbimg > /dev/fb0; fbterm
Foogod
sumber
7

Saya dapat membedakan mode teks nyata dari emulasi grafisnya.

... yang merupakan salah satu cara di mana pengamat dapat membedakan BSOD nyata pada Windows dari tindakan screen-saver BSOD lelucon yang melakukan putaran satu dekade yang lalu. Tampilan karakter blok grafik yang menggunakan perangkat keras adaptor layar dalam mode grafis agak berbeda dari karakter yang dihasilkan oleh perangkat keras adaptor layar dalam mode teks.

Ya, adaptor layar dalam mode grafis. Sudah seperti ini selama beberapa waktu, sekarang. Itu selalu seperti ini pada sistem tanpa hardware layar PC adapter. Pada tahun-tahun awal Linux, pada PC yang kompatibel konsol akan memiliki perangkat keras adaptor layar dalam mode teks. Tetapi penggunaan ini diam-diam telah terkikis menjadi hampir tidak ada. Dukungan Unicode untuk sebagian besar pengguna saat ini membutuhkan set mesin terbang yang lebih besar daripada perangkat keras mode teks. Firmware mesin (tentu saja) menggunakan mode grafis untuk layar splash (dengan gambar-gambar cantik dan logo perusahaan), seperti halnya loader Linux dan inisialisasi sistem.

Ada program emulator terminal yang dibangun ke dalam kernel Linux. Itu berlapis di atas framebuffer dan subsistem acara masukan, yang menggunakan antarmuka kernel internal untuk mengakses. Ia menghadirkan dirinya ke sistem mode aplikasi sebagai serangkaian perangkat terminal virtual kernel , /dev/tty1dan sebagainya.

Program ini cukup terbatas dibandingkan dengan emulator terminal yang dijalankan dengan kernel Linux, seperti program aplikasi biasa. Ini hanya mengemulasi subset terbatas dari fungsionalitas terminal nyata, dan tidak memiliki fitur tambahan dari emulator terminal terakhir.

Itu yang harus Anda perhatikan. Anda mungkin akrab dengan emulator terminal yang menggunakan X untuk input / output mereka, seperti xterm, lxterminal, gnome-console, konsole, eterm, wterm, dan sisanya. Yang kurang dikenal adalah yang menggunakan perangkat framebuffer dan perangkat acara masukan untuk input / output mereka. menyediakan terminal virtual ruang pengguna :

Beberapa yang terakhir ini dapat melakukan apa yang Anda inginkan.

fbterm dapat dikonfigurasi untuk menggunakan apa pun yang ada di framebuffer saat startup sebagai gambar latar, misalnya. Jadi semua yang perlu dilakukan adalah menggunakan salah satu dari beberapa utilitas lain untuk menampilkan gambar langsung ke perangkat Linux framebuffer untuk mengatur gambar latar belakang sebelum menjalankan fbterm. Ada beberapa alat seperti itu, termasuk:

fbvis dan fbi menghapus layar saat keluar, dan membutuhkan konvolusi yang dijelaskan secara lebih rinci dalam jawaban Foogod. dfbg, bagaimanapun, tidak membersihkan setelah itu sendiri, membuatnya lebih cocok untuk tugas khusus ini.

Bacaan lebih lanjut

JdeBP
sumber
Pertanyaannya adalah bagaimana cara membuat gambar latar belakang untuk konsol. Jawaban Anda hanya mencantumkan solusi potensial. Karenanya saya memberikan hadiah untuk jawaban yang lain, namun, saya berterima kasih atas banyak informasi yang Anda berikan. Anda memiliki upvote saya.
Sergiy Kolodyazhnyy
4

Meskipun jawaban Foogod tidak bekerja untuk saya, itu memang membawa saya ke arah yang benar, dengan memberikan setengah dari solusi (yaitu, membaca data framebuffer, sambil fbimenunjukkan gambar pada layar TTY). Karena itu saya telah memberikan jawabannya sebagai hadiah.

Di bawah ini adalah skrip yang membuatnya mudah diluncurkan fbtermdengan jalur parsial ke gambar sebagai argumen baris perintah tunggal

Pemakaian

Script harus disimpan dalam direktori yang tercantum dalam $PATHvariabel Anda . Lebih disukai itu harus di $HOME/binfolder pribadi Anda . Lihat Cara menambahkan direktori ke PATH? penjelasan cara menambahkan pribadi Anda binuntuk $PATH, tetapi menciptakan direktori yang disebut bindalam direktori rumah Anda cukup untuk menambahkannya ke PATHpada re-login.

Skrip juga harus memiliki izin yang dapat dieksekusi; Anda dapat mengaturnya dengan chmod +x /path/to/script.sh.

Akhirnya, harus dijalankan dengan sudo, untuk memungkinkan akses root untuk membaca dan menulis /dev/fb0.

Sumber Skrip

Juga tersedia di repositori Github saya.

#!/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 

informasi tambahan

Ternyata pengguna tidak perlu menggunakan sudo; /dev/fb0milik videogrup, jadi pengguna bisa menambahkan diri mereka ke grup itu menggunakan

sudo usermod -a -G video $USER

Dengan demikian, pemeriksaan untuk root dalam skrip di atas menjadi usang, khususnya [ "$(whoami)" != "root" ] ||bagian.

Sergiy Kolodyazhnyy
sumber