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


17

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

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


2
不可能な。仮想コンソールはテキストのみです。
セルギーKolodyazhnyy

5
@Serg Linuxが存在しなかったときからテキストのみのモードを使用していました。信じてください。グラフィカルエミュレーションと実際のテキストモードを区別できます。最近では多くの人がこれを想像することはほとんどできませんが、Linux 2.4日間はXサーバーがまったくインストールされていないコンソールで映画を見ていました。これは実際にこれが不可能であることを疑います。
イヴァン

1
さて、私は自分自身を修正します:framebufferデバイスとして知られている何かのために、コンソールで画像と映画を見ると信じていますが、その画面ではのようなプログラムの出力で占められていますfbi。それ自体はTTYはまだテキストのみのデバイスである
Sergiy Kolodyazhnyy

2
適格になったら、質問に報奨金を付けます。実際に興味を持った
Sergiy Kolodyazhnyy

1
これをチェックしてください:code.google.com/p/fbterm
Sergiy Kolodyazhnyy

回答:


12

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

sudo apt-get install fbterm fbi

fbterm背景画像自体を実際に読み取ったり表示したりするのではなく、他のプログラムが起動する前に画面に背景画像を設定することを想定しています。に指示がありますfbtermを使用してこれを行う方法についてfbvは、現代のUbuntuシステムでコンパイルすることさえできなかった絶対に時代遅れでサポートされていないユーティリティマニュアルページにます。fbiは、フレームバッファ用のよりきれいで優れた画像ビューアですが、残念ながらsimplerの「設定して終了」機能がないため、直接使用しようとするとfbv干渉しfbtermます。しかし、私は機能する代替案を思いつくことができました。

まず、使用する必要があります fbicat画像して表示し、それを「フレームバッファ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あなたはもちろん、希望のファイル名を何でもしています。)

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

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

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

7

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

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

はい、ディスプレイアダプタはグラフィックモードです。かなり長い間、このようになっています。PCディスプレイアダプタハードウェアのないシステムでは、常にこの方法でした。Linuxの初期には、PC互換機では、コンソールにテキストモードのディスプレイアダプターハードウェアが搭載されていました。しかし、この使用は静かに浸食され、ほとんど何もありません。最近のほとんどのユーザーのUnicodeサポートには、テキストモードのハードウェアよりも大きなグリフセットが必要です。(もちろん)マシンファームウェアは、スプラッシュスクリーン(きれいな写真と会社のロゴ付き)にグラフィックモードを使用し、Linuxローダーとシステム初期化も同様です。

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

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

これを探す必要があるものです。xterm、lxterminal、gnome-console、konsole、eterm、wtermなど、入出力にXを使用するターミナルエミュレーターに慣れているかもしれません。あまり知られていないのは、フレームバッファデバイスとその入力/出力に入力イベントデバイスを使用するものです。ユーザー空間仮想端末の提供:

これらの後者のいくつかは、あなたが望むことをすることができます。

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

fbvisとfbiは、終了時に画面をクリアし、Foogodの答えで詳細に説明されている畳み込みを必要とします。ただし、dfbgは自動的にクリーンアップしないため、この特定のタスクにより適しています。

参考文献


質問は、コンソールの背景画像を作成する方法を尋ねました。あなたの答えは、潜在的なソリューションのみをリストしています。したがって、私は他の答えに賞金を授与しますが、あなたが提供した豊富な情報に感謝します。あなたは私の賛成票を持っています。
セルギーKolodyazhnyy

4

Foogodの答えはうまくいきませんでしたが、ソリューションの半分を提供することで(つまり、fbiTTY画面に画像を表示しながら、フレームバッファーデータを読み取ることで)正しい方向に導きました。したがって、私は彼の答えに賞金を授与しました。

Bellowは、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: /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 

追加情報

ユーザーが必ずしも使用する必要はないことがわかりますsudo。グループに/dev/fb0属しているvideoため、ユーザーは、そのグループに自分自身を追加使用して

sudo usermod -a -G video $USER

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.