【鼎革‧革鼎】︰ Raspbian Stretch 《四‧一》

這個 SD 卡既已不能啟動登入 X Window 系統,那要怎麼開機呢?

還好 linux 上有

chroot

chroot是在unix系統的一個操作,針對正在運作的軟體行程和它的子行程,改變它外顯的根目錄。一個運行在這個環境下,經由chroot設定根目錄的程式,它不能夠對這個指定根目錄之外的檔案進行存取動作,不能讀取,也不能更改它的內容。chroot這一特殊表達可能指chroot(2)系統呼叫或chroot(8)前端程式。

由chroot創造出的那個根目錄,叫做「chroot監獄」(chroot jail,或chroot prison)。

歷史

1979年,在開發Version 7 Unix時,chroot系統呼叫首次問世。1982年3月18日,在4.2BSD發布前17個月,比爾·喬伊(Bill Joy)將chroot機制移植到BSD系統上,主要用於測試安裝和構建系統。

1991年,威廉·齊斯韋克(William Cheswick)開發出第一個蜜罐程式,來監視入侵駭客的行動。他使用了chroot來進行實作,這是chroot最早被用於開發程式的先例,也因此,chroot創造出的根目錄空間,之後被人稱為軟體監獄(chroot jail)。

2000年,FreeBSD團隊,將原本chroot機制,導入虛擬化技術的概念,開發了新的jail系統命令,伴隨著FreeBSD 4.0版一同發布。

2004年,因為駭客開發出許多可以破解chroot機制的方法,出現了jailbreak這個術語。

2005年,昇陽電腦Solaris系統上開發出Solaris Containers,稱它是吃了類固醇的chroot(chroot on steroids)。

2006年,Linux內核中開發出cgroups。2007年,被加到Linux 2.6.24版內核中。2008年,基於cgroups,開發出LXC,以及Docker。2013年被加入Linux 3.8版中。

應用

應用chroot,可以建立並執行一個隔離的虛擬軟體系統拷貝。這對於以下應用是十分有用的:

測試和開發
可以經由chroot建立一個測試環境,用來測試軟體。這可以減少將軟體直接布署到整個生產系統中可能造成的風險。
依賴控制
可以在chroot建立的環境下,進行軟體開發,組建以及測試,只保留這個程式需要的軟體依賴。這可以避免在系統中預先安裝的各種軟體庫,影響到開發,造成軟體開發者在組建軟體時,可能遇到一些連結衝突。
相容性
早期遺留軟體或使用不同應用二進位介面(ABI)的軟體,因為它們提供的軟體庫和宿主機的庫之間,可能發生名稱或連結衝突,可以在chroot環境下執行,以保持系統安全。
修復
當一個系統不能啟動時,可以使用chroot,先從另一個根檔案系統(比如從安裝媒體,或是Live CD)下開機,之後再回到受損的環境中,重新修正系統。
特權分離
將允許開啟檔案描述子(例如檔案,管線或 是網路連線)的程式放到chroot下執行,不用特地將工作所需的檔案,放到chroot路徑底下,這可以簡化軟體監獄的設計。chroot簡化了安全設 計,可以創造出一個沙盒環境,來執行一個有潛在危險的特權程式,以先期防禦可能的安全漏洞。但值得注意的是,chroot沒有足夠能力去防禦一個擁有 root特權的行程造成危害。

 

環境,何不假借可開機者執行 raspi-config 將之改為終端機登錄乎?

pi@raspberrypi:~ umount /media/pi/b4ea8e46-fe87-4ddd-9e94-506c37005ac5  pi@raspberrypi:~ sudo mount /dev/sda2 /mnt
pi@raspberrypi:~ umount /media/pi/boot  pi@raspberrypi:~ sudo mount /dev/sda1 /mnt/boot
pi@raspberrypi:~ cd /mnt pi@raspberrypi:/mnt ls
bin   boot.bak  etc   lib         man    mnt  proc  run   srv  tmp  var
boot  dev       home  lost+found  media  opt  root  sbin  sys  usr
pi@raspberrypi:/mnt cd  pi@raspberrypi:~ sudo mount -o bind /dev /mnt/dev
pi@raspberrypi:~ sudo mount -o bind /sys /mnt/sys pi@raspberrypi:~ sudo mount -o bind /dev/shm /mnt/dev/shm
pi@raspberrypi:~ sudo mount -o bind /proc /mnt/proc/ pi@raspberrypi:~ sudo chroot /mnt /bin/bash

root@raspberrypi:/# ls
bin   boot.bak	etc   lib	  man	 mnt  proc  run   srv  tmp  var
boot  dev	home  lost+found  media  opt  root  sbin  sys  usr

root@raspberrypi:/# raspi-config 
root@raspberrypi:/# 
root@raspberrypi:/# exit
exit

pi@raspberrypi:~ sudo umount --recursive /mnt pi@raspberrypi:~ 

 

果然 OK 耶!

 

初步看來顯示器正常, X 視窗管理程式 lightdm 死也。

pi@raspberrypi:~ tvservice -s state 0x120006 [DVI DMT (87) RGB full 15:9], 1280x800 @ 60.00Hz, progressive pi@raspberrypi:~

 

pi@raspberrypi:~ cat /var/log/Xorg.0.log | grep EE 	(WW) warning, (EE) error, (NI) not implemented, (??) unknown. [    66.363] (EE) AIGLX: reverting to software rendering [    67.879] (**) Option "config_info" "udev:/sys/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/0003:0EEF:0005.0001/input/input2/event2" [    67.879] (II) XINPUT: Adding extended input device "WaveShare WS170120" (type: TOUCHSCREEN, id 6)</pre>   <pre class="lang:default decode:true">pi@raspberrypi:~ ps -ef | grep X
pi         662   640  0 17:08 pts/0    00:00:00 grep --color=auto X
pi@raspberrypi:~ </pre>   <pre class="lang:default decode:true">pi@raspberrypi:~ systemctl status lightdm.service
● lightdm.service - Light Display Manager
   Loaded: loaded (/lib/systemd/system/lightdm.service; enabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:lightdm(1)
pi@raspberrypi:~ $