以前はフルスクリーンコンソールを使用していました(コンソールは Ctrl+Alt+F1...F6)積極的に、ある種の「壁紙」(もちろん、読みやすさを低下させないように、むしろ暗く単調なもの)でそれを飾ってみたいという考えに至りました、おそらくこれは見た目と感じが良いでしょう(またはそうではないが、試してみる必要がある)。別のコンソールの背景として別の写真を設定できればさらに良いでしょう(1つは Ctrl+Alt+F1、別の Ctrl+Alt+F2 等)。
コンソールの解像度がピュアテキストモードよりもはるかに高いということは、コンソールに本格的なグラフィカルモードが使用され、すべてが可能であることを示唆しています。しかし、どのように?
Linuxコンソールドライバーにはこの機能が組み込まれていないと確信していますが、これを実行できるfbterm
というアプリケーションがあります。背景画像を機能させるには、fbi
などのフレームバッファに画像を表示できるユーティリティも必要です。
Sudo apt-get install fbterm fbi
fbterm
は、実際に背景画像自体を読み取ったり表示したりするものではなく、他のプログラムが起動する前に画面に背景画像を設定することを想定しています。 fbterm
manページには、fbv
を使用してこれを行う方法に関する指示があります。これは、現代のUbuntuシステムでコンパイルすることさえできなかった、絶対に時代遅れでサポートされていないユーティリティです。 fbi
は、フレームバッファ用の非常にクリーンで優れた画像ビューアですが、残念ながら、単純なfbv
の「設定して終了」機能がないため、fbterm
に干渉します。直接使用してみてください。しかし、私は機能する代替案を思いつくことができました:
まず、fbi
とcat
を使用して、必要な画像を表示し、それを「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.fbimg
とnifty-background.png
を任意のファイル名に置き換えます。)
コマンドの最初の部分は、フレームバッファーの内容をファイルに取り込む前に1秒間待機します。同時に、2番目の部分(&の後)がfbi
を起動してフレームバッファーに画像を表示します。これにより、catコマンドが実行を開始すると(1秒後)、そこにダンプする画像があります。それらがこの順序である理由は、fbi
がフォアグラウンドで実行されていない場合に問題があることを発見したためです。つまり、リストの最後のコマンドでなければなりません。
それ以降、fbterm
を実行したいときはいつでも、次のように起動できます(小さなラッパースクリプトを作成することもできます)。
export FBTERM_BACKGROUND_IMAGE=1
cat nifty-background.fbimg > /dev/fb0; fbterm
実際のテキストモードとグラフィカルエミュレーションを区別できます。
…これは、10年ほど前にラウンドを行った冗談BSODスクリーンセーバーの動作から、観察者がWindowsで実際のBSODを区別できる方法の1つです。グラフィックモードでディスプレイアダプターハードウェアを使用したブロックグラフィックキャラクターの表示は、テキストモードでディスプレイアダプターハードウェアによって生成された文字とは微妙に異なりました。
はい、ディスプレイアダプタはグラフィックモードです。かなり長い間、このようになっています。 PCディスプレイアダプタハードウェアのないシステムでは、これは常にalwaysでした。初期のLinuxでは、PC互換機では、コンソールにテキストモードのディスプレイアダプターハードウェアが搭載されていました。しかし、この使用は静かに浸食され、ほとんど何もありません。最近のほとんどのユーザーのUnicodeサポートには、テキストモードのハードウェアよりも大きなグリフセットが必要です。 (もちろん)マシンファームウェアは、スプラッシュスクリーン(きれいな写真と会社のロゴ付き)にグラフィックモードを使用し、Linuxローダーとシステム初期化も同様です。
Linuxカーネルにはターミナルエミュレータプログラムが組み込まれています。フレームバッファと入力イベントサブシステムの上に階層化され、内部カーネルインターフェイスを使用してアクセスします。一連のカーネル仮想端末デバイス、/dev/tty1
などとしてアプリケーションモードシステムに提示されます。
このプログラムは、通常のアプリケーションプログラムとしてLinuxカーネルでoutを実行するターミナルエミュレータと比較してかなり制限されています。実際の端末の機能の限られたサブセットのみをエミュレートし、後者の端末エミュレータの追加機能を欠いています。
これを探す必要があるものです。 xterm、lxterminal、gnome-console、konsole、eterm、wtermなど、入出力にXを使用するターミナルエミュレーターに慣れているかもしれません。あまり知られていないのは、フレームバッファデバイスとその入力/出力に入力イベントデバイスを使用するものです。 ユーザー空間仮想端末の提供:
console-terminal-emulator
およびconsole-fb-realizer
これらの後者のいくつかは、あなたが望むことをすることができます。
fbtermは、たとえば、起動時にフレームバッファにあるものをすべて背景画像として使用するように設定できます。したがって、fbtermを実行する前に、Linuxフレームバッファーデバイスに画像を直接表示するためのいくつかの他のユーティリティの1つを使用して、背景画像を設定するだけです。次のようなツールがいくつかあります。
fbvisとfbiは、終了時に画面をクリアし、Foogodの答えで詳細に説明されている畳み込みを必要とします。ただし、dfbgは自動的にクリーンアップしないため、この特定のタスクにより適しています。
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/fb0
はvideo
グループに属しているため、ユーザーは そのグループに自分を追加する
Sudo usermod -a -G video $USER
したがって、上記のスクリプトのルート、特に[ "$(whoami)" != "root" ] ||
部分のチェックは廃止されます。