web-dev-qa-db-ja.com

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

以前はフルスクリーンコンソールを使用していました(コンソールは Ctrl+Alt+F1...F6)積極的に、ある種の「壁紙」(もちろん、読みやすさを低下させないように、むしろ暗く単調なもの)でそれを飾ってみたいという考えに至りました、おそらくこれは見た目と感じが良いでしょう(またはそうではないが、試してみる必要がある)。別のコンソールの背景として別の写真を設定できればさらに良いでしょう(1つは Ctrl+Alt+F1、別の Ctrl+Alt+F2 等)。

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

16
Ivan

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

Sudo apt-get install fbterm fbi

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

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

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

(これは数秒間画像を表示してから終了し、結果をファイルnifty-background.fbimgに保存します。もちろんnifty-background.fbimgnifty-background.pngを任意のファイル名に置き換えます。)

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

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

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

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

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

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

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

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

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

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

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

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

参考文献

6
JdeBP

Foogodの答えはうまくいきませんでしたが、解決策の半分を提供することで正しい方向に導きました(つまり、fbiはTTY画面に画像を表示しながら)。したがって、私は彼の答えに賞金を授与しました。

Bellowは、単一のコマンドライン引数としてイメージへの部分パスを使用してfbtermを簡単に起動できるスクリプトです。

使用法

スクリプトは、$PATH変数にリストされているディレクトリに保存する必要があります。できれば、個人の$HOME/binフォルダーにある必要があります。パーソナルbin$PATHに追加する方法の説明については PATHにディレクトリを追加する方法 を参照してください。ただし、binというディレクトリを自宅に作成する再ログイン時にPATHに追加するにはディレクトリで十分です。

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

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

スクリプトソース

my Github repository。 でも利用可能

#!/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/fb0videoグループに属しているため、ユーザーは そのグループに自分を追加する

Sudo usermod -a -G video $USER

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

4