ฉันจะกำหนดพื้นหลังคอนโซลแบบเต็มหน้าจอ (TTY) ได้อย่างไร


17

ฉันเคยใช้คอนโซลแบบเต็มหน้าจอ (ที่เปิดด้วยCtrl+ Alt+ F1... F6) อย่างแข็งขันและมีความคิดว่าฉันต้องการลองตกแต่งด้วย "วอลเปเปอร์" ของการเรียงลำดับ (แน่นอนค่อนข้างมืดและน่าเบื่อ เพื่อที่จะไม่ลดความสามารถในการอ่าน) บางทีนี่อาจเป็นรูปลักษณ์และความรู้สึกดี (หรือไม่ แต่ฉันต้องลอง) มันจะดียิ่งขึ้นถ้าฉันสามารถตั้งค่ารูปภาพที่แตกต่างกันเป็นพื้นหลังของคอนโซลที่แตกต่างกัน (อันสำหรับCtrl+ Alt+ F1, อีกอันสำหรับCtrl+ Alt+ F2ฯลฯ )

ความจริงแล้วคอนโซลมีความละเอียดสูงกว่ามากที่โหมดข้อความล้วนแสดงให้เห็นว่าใช้โหมดกราฟิกเต็มรูปแบบสำหรับพวกเขาและทุกอย่างเป็นไปได้ แต่อย่างไร


2
เป็นไปไม่ได้ คอนโซลเสมือนเป็นข้อความเท่านั้น
Sergiy Kolodyazhnyy

5
@Serg ฉันได้ใช้โหมดข้อความอย่างเดียวตั้งแต่เวลาที่ Linux ไม่ได้มีอยู่ - เชื่อฉันฉันสามารถแยกโหมดข้อความจริงจากการจำลองแบบกราฟิก หลายคนแทบจินตนาการไม่ออกเลยว่าทุกวันนี้ แต่ฉันก็ยังดูหนังในคอนโซลที่ไม่มี X server ติดตั้งเลยในช่วง Linux 2.4 วัน นี่ทำให้ฉันสงสัยว่านี่เป็นไปไม่ได้จริง
อีวาน

1
ตกลงกันให้ฉันแก้ไขด้วยตัวเอง: ผมไม่เชื่อในการดูภาพและภาพยนตร์ในคอนโซล, เพราะสิ่งที่รู้ว่าเป็นframebufferอุปกรณ์ที่มีหน้าจอ fbiแต่ที่ยุ่งอยู่กับการส่งออกของโปรแกรมบางอย่างเช่น TTY ในและของตัวเองยังคงเป็นอุปกรณ์ข้อความอย่างเดียว
Sergiy Kolodyazhnyy

2
ฉันจะให้เงินกับคำถามของคุณเมื่อมีสิทธิ์ ฉันสนใจจริงๆ
Sergiy Kolodyazhnyy

1

คำตอบ:


12

ฉันค่อนข้างมั่นใจว่าไดรเวอร์คอนโซล Linux ไม่มีความสามารถนี้ในตัว แต่มีแอปพลิเคชันที่เรียกว่าfbtermสามารถทำได้ ในการทำให้ภาพพื้นหลังใช้งานได้คุณจะต้องมียูทิลิตีซึ่งสามารถแสดงภาพใน framebuffer เช่นfbi:

sudo apt-get install fbterm fbi

fbtermไม่ได้อ่านหรือแสดงภาพพื้นหลังจริง ๆ แล้วมันคาดว่าโปรแกรมอื่นจะตั้งค่าภาพพื้นหลังบนหน้าจอก่อนที่จะเริ่ม มีคำแนะนำในfbtermman page เกี่ยวกับวิธีการใช้fbvยูทิลิตี้ที่เก่าแก่และไม่ได้รับการสนับสนุนซึ่งฉันไม่สามารถรวบรวมบนระบบ Ubuntu ที่ทันสมัยได้ fbiเป็นโปรแกรมดูรูปภาพที่สะอาดและดีกว่าสำหรับ framebuffer แต่น่าเสียดายที่ไม่มีฟังก์ชั่น "ตั้งค่าและออก" ของตัวที่เรียบง่ายกว่าfbvดังนั้นจึงรบกวนfbtermหากคุณพยายามใช้งานโดยตรง อย่างไรก็ตามฉันสามารถหาทางเลือกที่ใช้งานได้:

ก่อนอื่นคุณจะต้องใช้fbiและcatแสดงภาพที่คุณต้องการแล้วถ่ายโอนไปยังไฟล์ภาพ "framebuffer raw format" ในฐานะ root ในคอนโซล framebuffer ให้รัน:

( 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 วินาทีก่อนที่จะกำหนดเนื้อหา framebuffer ให้เป็นไฟล์ ในขณะเดียวกันส่วนที่สอง (หลังจาก &) fbiจะเปิดขึ้นเพื่อแสดงภาพบน framebuffer ดังนั้นเมื่อคำสั่ง cat เข้าใกล้การดำเนินการ (1 วินาทีต่อมา) จะมีภาพที่จะทิ้ง เหตุผลที่พวกเขาอยู่ในลำดับนั้นก็เพราะฉันพบว่าfbiมีปัญหาถ้ามันไม่ได้ทำงานในเบื้องหน้าซึ่งหมายความว่ามันจะต้องเป็นคำสั่งสุดท้ายในรายการ

จากนั้นเมื่อใดก็ตามที่คุณต้องการเรียกใช้fbtermคุณสามารถเริ่มต้นได้เช่นนั้น (คุณอาจต้องการสร้างสคริปต์ตัวตัดคำเล็กน้อย):

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

7

ฉันสามารถแยกแยะโหมดข้อความจริงจากการจำลองกราฟิก

... ซึ่งเป็นหนึ่งในวิธีที่ผู้สังเกตการณ์สามารถแยกแยะ BSOD จริงบน Windows จากการกระทำของโปรแกรมรักษาหน้าจอ BSOD เรื่องตลกที่ทำรอบหนึ่งทศวรรษหรือมากกว่านั้น การแสดงอักขระกราฟิกบล็อกโดยใช้ฮาร์ดแวร์การ์ดแสดงผลในโหมดกราฟิกนั้นแตกต่างจากอักขระที่สร้างโดยฮาร์ดแวร์การ์ดแสดงผลในโหมดข้อความอย่างละเอียด

ใช่การ์ดแสดงผลอยู่ในโหมดกราฟิก มันเป็นเช่นนี้มาระยะหนึ่งแล้ว มันเป็นเช่นนี้เสมอในระบบที่ไม่มีฮาร์ดแวร์อะแดปเตอร์จอแสดงผลของพีซี ในช่วงปีแรก ๆ ของ Linux บนพีซีที่ใช้งานร่วมกันได้คอนโซลจะมีฮาร์ดแวร์การ์ดแสดงผลในโหมดข้อความ แต่การใช้งานนี้ได้กัดเซาะอย่างเงียบ ๆ เพื่ออะไรมาก การสนับสนุน Unicode สำหรับผู้ใช้ส่วนใหญ่ในปัจจุบันต้องการการตั้งค่า glyph ที่ใหญ่กว่าฮาร์ดแวร์โหมดข้อความ เฟิร์มแวร์เครื่อง (แน่นอน) ใช้โหมดกราฟิกสำหรับหน้าจอสแปลช (พร้อมรูปภาพสวย ๆ และโลโก้ บริษัท ) เช่นเดียวกับตัวโหลด Linux และการเริ่มต้นระบบ

มีโปรแกรมเทอร์มินัลอีมูเลเตอร์ติดตั้งอยู่ในเคอร์เนล Linux มันอยู่ด้านบนของ framebuffer และระบบย่อยเหตุการณ์อินพุตซึ่งใช้อินเตอร์เฟสเคอร์เนลภายในเพื่อเข้าถึง มันนำเสนอตัวเองให้กับระบบโหมดแอปพลิเคชันเป็นชุดของอุปกรณ์เทอร์มินัลเสมือนเคอร์เนล/dev/tty1และอื่น ๆ

โปรแกรมนี้จะค่อนข้าง จำกัด เมื่อเทียบกับการเลียนแบบขั้วที่ทำงานยื่นเคอร์เนลเป็นโปรแกรมการใช้งานธรรมดา เพียงจำลองเซ็ตย่อยที่ จำกัด ของฟังก์ชันการทำงานของเทอร์มินัลจริงและขาดคุณสมบัติเพิ่มเติมของเทอร์มินัลอีมูเลเตอร์หลัง

มันคือสิ่งที่คุณต้องมองหา คุณอาจคุ้นเคยกับเทอร์มินัลอีมูเลเตอร์ที่ใช้ X สำหรับอินพุต / เอาต์พุตเช่น xterm, lxterminal, gnome-console, konsole, eterm, wterm และส่วนที่เหลือ ที่รู้จักกันดีคือคนที่ใช้อุปกรณ์ framebuffer และอุปกรณ์เหตุการณ์อินพุตสำหรับอินพุต / เอาท์พุต การจัดเตรียมเทอร์มินัลเสมือนพื้นที่ผู้ใช้ :

บางส่วนของสิ่งเหล่านี้สามารถทำสิ่งที่คุณต้องการ

fbterm สามารถกำหนดค่าให้ใช้สิ่งที่อยู่ใน framebuffer เมื่อเริ่มต้นเป็นรูปภาพพื้นหลังเป็นต้น ดังนั้นสิ่งที่เราต้องทำคือใช้ยูทิลิตี้อื่น ๆ เพื่อแสดงภาพโดยตรงไปยัง Linux framebuffer deviceto ตั้งค่าภาพพื้นหลังก่อนที่จะเรียกใช้ fbterm มีเครื่องมือหลายอย่างเช่น:

fbvis และ fbi ล้างหน้าจอที่ทางออกและต้องการความสะดวกสบายที่อธิบายรายละเอียดเพิ่มเติมในคำตอบของ Foogod แม้ว่า dfbg จะไม่ล้างข้อมูลในตัวเองทำให้มันเหมาะสำหรับงานนี้โดยเฉพาะ

อ่านเพิ่มเติม


คำถามที่ถามเกี่ยวกับวิธีการสร้างภาพพื้นหลังสำหรับคอนโซล คำตอบของคุณจะแสดงวิธีแก้ไขที่เป็นไปได้เท่านั้น ดังนั้นฉันจึงให้รางวัลแก่คำตอบอื่น ๆ อย่างไรก็ตามฉันขอขอบคุณสำหรับความมั่งคั่งของข้อมูลที่คุณให้ไว้ คุณมี upvote ของฉัน
Sergiy Kolodyazhnyy

4

แม้ว่าคำตอบของ Foogod ไม่ได้ผลสำหรับฉัน แต่มันก็นำฉันไปในทิศทางที่ถูกต้องโดยให้วิธีแก้ปัญหาครึ่งหนึ่ง (กล่าวคือการอ่านข้อมูล framebuffer ขณะที่fbiกำลังแสดงภาพบนหน้าจอ TTY) ดังนั้นฉันได้รับรางวัลคำตอบของเขา

ร้องเป็นสคริปต์ที่ทำให้ง่ายต่อการเปิดตัว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.