フルスクリーンのコンソール背景 (TTY) をカスタマイズするにはどうすればよいですか?

フルスクリーンのコンソール背景 (TTY) をカスタマイズするにはどうすればよいですか?

私は以前はフルスクリーン コンソール ( Ctrl+ Alt+ F1...で開くものF6) を積極的に使用していましたが、それを一種の「壁紙」 (もちろん、読みやすさを損なわないように、かなり暗くて単調なもの) で装飾してみようというアイデアに至りました。おそらく、見た目も使い心地も良いでしょう (そうでないかもしれませんが、試してみる必要があります)。異なるコンソールの背景に異なる画像 (1 つはCtrl+ Alt+用F1、もう 1 つはCtrl+ Alt+用F2など) を設定できれば、さらに良いでしょう。

コンソールの解像度が純粋なテキスト モードよりもはるかに高いという事実は、コンソールに本格的なグラフィカル モードが使用され、あらゆることが可能になっていることを示唆しています。しかし、どのようにしてでしょうか?

答え1

Linux コンソール ドライバーにはこの機能が組み込まれていないことは確かですが、fbtermこれを行うことができる というアプリケーションがあります。背景画像を機能させるには、次のようなフレーム バッファーに画像を表示できるユーティリティも必要ですfbi

sudo apt-get install fbterm fbi

fbtermは、実際には背景画像を読み込んだり表示したりしません。起動する前に、他のプログラムが画面上に背景画像をセットアップすることを期待します。 のfbtermマニュアル ページには、 を使用する方法の説明があります。 はfbv完全に時代遅れでサポートされていないユーティリティで、最新の Ubuntu システムではコンパイルすらできませんでした。はfbi、フレーム バッファ用のはるかにクリーンで優れた画像ビューアですが、残念ながら、よりシンプルな の「設定して終了する」機能がないため、直接使用しようとするとfbvが干渉しますfbterm。ただし、私は、動作する代替手段を思い付きました。

fbiまず、とを使用しcatて必要な画像を表示し、それを「フレームバッファ RAW 形式」の画像ファイルにダンプする必要があります。フレームバッファ コンソールで、ルートとして次を実行します。

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

(これにより、画像が数秒間表示され、結果がファイル に保存されて終了しますnifty-background.fbimg。もちろん、 と を任意のファイル名に置き換えてください。nifty-background.fbimg)nifty-background.png

コマンドの最初の部分は、フレームバッファの内容をファイルに cat する前に 1 秒間待機します。同時に、2 番目の部分 (& の後) が起動してfbiフレームバッファに画像を表示します。そのため、cat コマンドが実行される (1 秒後) ときには、ダンプする画像がそこにあります。これらの順序がこのようになっているのは、fbiフォアグラウンドで実行されていない場合に問題が発生することがわかったためです。つまり、このコマンドはリストの最後のコマンドである必要があります。

それ以降は、 を実行したいときはいつでもfbterm、次のように起動できます (小さなラッパー スクリプトを作成することもできます)。

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

答え2

実際のテキスト モードとそのグラフィカル エミュレーションを区別できます。

… これは、Windows 上の実際の BSOD と、10 年ほど前に流行したジョークの BSOD スクリーン セーバーの動作を、注意深い人が区別できる方法の 1 つです。グラフィック モードでディスプレイ アダプター ハードウェアを使用してブロック グラフィック文字を表示すると、テキスト モードでディスプレイ アダプター ハードウェアによって生成される文字とは微妙に異なります。

はい、ディスプレイアダプタはグラフィックモードになっています。これはかなり前からのことです。いつもPC ディスプレイ アダプタ ハードウェアのないシステムでは、この方法を使用します。Linux の初期には、PC 互換機のコンソールにはテキスト モードのディスプレイ アダプタ ハードウェアがありました。しかし、この使用法は静かに衰退し、ほとんど使用されなくなりました。現在、ほとんどのユーザーの Unicode サポートには、テキスト モード ハードウェアが持つよりも大きなグリフ セットが必要です。マシン ファームウェアは (もちろん)、スプラッシュ スクリーン (きれいな画像と会社のロゴ付き) にグラフィック モードを使用します。Linux ローダーとシステム初期化でも同様です。

Linuxカーネルには端末エミュレータプログラムが組み込まれています。これはフレームバッファと入力イベントサブシステムの上に階層化されており、内部カーネルインターフェイスを使用してアクセスします。アプリケーションモードシステムでは、一連のカーネル仮想端末デバイス/dev/tty1など。

このプログラムは、実行する端末エミュレータに比べてかなり制限されています。外でLinux カーネルでは、通常のアプリケーション プログラムと同様に動作します。実際の端末の機能の限られたサブセットのみをエミュレートし、後者の端末エミュレーターの追加機能は備えていません。

この点については、これらに目を向ける必要があります。xterm、lxterminal、gnome-console、konsole、eterm、wterm など、入出力に X を使用するターミナル エミュレータはよく知られているでしょう。あまり知られていないのは、入出力にフレームバッファ デバイスと入力イベント デバイスを使用するものです。ユーザー空間仮想端末:

後者のいくつかはあなたが望むことを行うことができます。

たとえば、fbterm は、起動時にフレームバッファにあるものを背景画像として使用するように設定できます。そのため、fbterm を実行する前に、Linux フレームバッファ デバイスに直接画像を表示するための他のいくつかのユーティリティのいずれかを使用して背景画像をセットアップするだけで済みます。次のようなツールがいくつかあります。

fbvis と fbi は終了時に画面をクリアし、Foogod の回答で詳しく説明されている畳み込みを必要とします。ただし、dfbg は後からクリーンアップを行わないため、この特定のタスクに適しています。

参考文献

答え3

Foogod の回答は私には役に立ちませんでしたが、解決策の半分 (つまり、TTY 画面に画像を表示しながらフレームバッファ データを読み取る) を提供してくれたので、正しい方向に導いてくれましたfbi。そのため、私は彼の回答に賞金を授与しました。

fbterm以下は、画像への部分パスを単一のコマンドライン引数として簡単に起動できるスクリプトです。

使用法

スクリプトは変数にリストされているディレクトリに保存する必要があります$PATH。できれば個人用$HOME/binフォルダに保存してください。PATH にディレクトリを追加するにはどうすればいいですか?binに個人情報を追加する方法については説明していませ$PATHんが、ホーム ディレクトリに というディレクトリを作成すれば、再ログイン時にbinに追加するのに十分です。PATH

スクリプトには実行権限も必要です。これは で設定できますchmod +x /path/to/script.sh

sudo最後に、の読み取りと書き込みのためのルート アクセスを許可するには、で実行する必要があります/dev/fb0

スクリプトソース

こちらでも入手可能私の 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: https://askubuntu.com/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 

追加情報

sudoユーザーは必ずしも;グループ/dev/fb0に属するを使用する必要がないことが判明したのでvideo、ユーザーは単にそのグループに自分を追加する使用して

sudo usermod -a -G video $USER

したがって、上記のスクリプト内のルートのチェックは、具体的には[ "$(whoami)" != "root" ] ||一部が廃止されます。

答え4

回答その上私には効果があった

ただし、指定する必要があるデバイスFBIの場合:

fbi -d /dev/fb0

私の場合、FBI は以下を試みていました:/dev/dri/card0

のために読みやすさimagemagick を使用することが可能です:

convert -fill '#202020' -colorize 80% "$1" /tmp/background

これは、画像を可視性#202020のある色でオーバーレイして変換することで透明な背景を模倣します。80%

関連情報