如果你像我很喜歡 Mac 的形態,並不喜歡 OSX 這個作業系統,你有可能裝過另外一個作業系統。最近對我來說,Fedora Linux 就是 Linux 世界最有用的作業系統。我這麼說,當然會有很多人反對這個看法。沒問題,這個文章的原則有好幾個用場。
這個步驟說明有這些腳步:
- 下載與萃取 facetimehd 的韌體
- 利用 DKMS 創造一個核心模組
- 讓這個模組跟着作業系統開始
幸虧,網路已經有一個很方便下載韌體的方法。您必須確定您的電腦已經有這些套裝軟體:curl,xzcat,cpio。您有可能還需要 Fedora 的開發工具軟體。利用 Fedora 的話,我們所說的套裝軟體是這樣裝的:
sudo dnf install curl xzcat cpio
sudo dnf groupinstall "Development Tools"
軟體相依處理了以後,在您的終端仿真器裡,在起始目錄裡執行這個命令:
git clone https://github.com/patjak/facetimehd-firmware.git
就換現行目錄換到剛剛創造的目錄,就執行下面的命令:
make
結果會這樣:
Dowloading the driver, please wait...
Found matching hash from OS X, El Capitan 10.11.5
==> Extracting firmware...
--> Decompressing the firmware using gzip...
--> Deleting temporary files...
--> Extracted firmware version 1.43.0
下一步,換 ROOT 用戶,然後執行這個命令:
make install
結果會這樣:
Copying firmware into '/usr/lib/firmware/facetimehd'
那因為 Fedora 的核心是常常受到更新的,所以我們必須利用 DKMS 確定這個模組每一個更新以後都繼續起作用。為了這樣我們還是利用 ROOT 用戶。我們再要裝幾個套裝軟體:
dnf install kernel-devel dkms
然後,在起始目錄裡要複製驅動器的原始碼:
git clone https://github.com/patjak/bcwc_pcie.git
現在我們要創造 DKMS 會利用的目錄。DKMS 的意思就是 ‘動態核心模組支援 ‘。為了創造剛說的目錄,現換 ROOT 用戶,再執行下面的命令:
mkdir /usr/src/facetimehd-0.1
換目錄換到 bcwc_pcie。(它應該在~/bcwc_pci) 然後,把這個目錄所有的資料剪貼到我們剛創造的目錄:
cp -r * /usr/src/facetimehd-0.1/
再換一次目錄換到/usr/src/facetimehd-0.1/。我們需要一個 dkms.conf 檔案,DKMS 才能夠更新後自動地重裝我們的模組。幸虧,本目錄已經包括着這個檔案。我們有可能要查一下它寫地對不對:
cat ./dkms.conf
PACKAGE_VERSION=0.1
CLEAN="make clean"
BUILT_MODULE_NAME[0]="facetimehd"
BUILT_MODULE_LOCATION[0]="."
DEST_MODULE_LOCATION[0]="/extra"
AUTOINSTALL="yes"
MODULES_CONF[0]="blacklist bdc_pci"
我們可以在一個腳步裡加入與建立這個模組:
dkms build -m facetimehd -v 0.1
建立完後,我們最後要裝它:
dkms install -m facetimehd -v 0.1
要它跟着我們的作業系統開始的話,執行下面的命令:
echo facetimehd | sudo tee /etc/modules-load.d/facetimehd.conf
到這裡,我們才賦能模組:
modprobe facetimehd
那如果您的電腦再啟動以後就能夠拍照,我就應該恭喜您,您做完了!可是,如果你又像我還不能拍照,就繼續看看吧!
我自己再啟動以後,我的攝像頭被電腦還找不到。奇怪就是,如果我這樣做:
lsmod | grep facetimehd
結果會這樣:
facetimehd 102400 0
videobuf2_dma_sg 16384 1 facetimehd
videobuf2_v4l2 28672 1 facetimehd
videobuf2_common 57344 2 videobuf2_v4l2,facetimehd
videodev 270336 3 videobuf2_v4l2,facetimehd,videobuf2_common
這是我們要看到的,可是還不能用攝像頭!正常是,我預期 systemctl 會顯示什麼問題,而是它什麼問題都沒有。我試幾個驗以後才發現,我每一次都必須這樣做:
modprobe -r facetimehd
modprobe facetimehd
越來越奇怪啦!但是這個問題也有一個駭客式的答案!我們就要創造我們自己的 systemctl 服務。
因為 rc.local 最近被姍了,所以我門得這麼做。在/usr/local/bin 裡創造 facetimehd.sh。
sudo nano /usr/local/bin/facetimehd.sh
它的內容該這樣:
#!/bin/bash
modprobe -r facetimehd
modprobe facetimehd
保存它以後,別忘讓它可執行。
接下來我們得創造一個準則的 systemd 服務檔案。在我的情形下,我現需要創造幾個目錄:/usr/local/lib/systemd 與 /usr/local/lib/systemd/system。創造這兩個目錄後,就創造我們的服務檔案:
sudo nano /usr/local/lib/systemd/system/facetimehd.service
它的內容因該這樣:
[Unit]
Description=Runs /usr/local/bin/facetimehd.sh at startup
[Service]
ExecStart=/usr/local/bin/facetimehd.sh
[Install]
WantedBy=multi-user.target
保存它以後,換目錄換到 /etc/systemd/system 與創造一個符號檔案:
ln -s /usr/local/lib/systemd/system/facetimehd.service
到這裡,我們就要試一試 systemd 看得到我們的新服務:
systemctl status facetimehd
成功的話結果會這樣:
● facetimehd.service - Runs /usr/local/bin/facetimehd.sh
Loaded: loaded (/usr/local/lib/systemd/system/facetimehd.service; linked; vendor preset: disabled)
Active: inactive (dead)
意思是 systemd 看得到我們的特別服務。現在我們就能夠賦能這個服務:
sudo systemctl enable facetimehd
結果會這樣:
Created symlink /etc/systemd/system/multi-user.target.wants/facetimehd.service →
/usr/local/lib/systemd/system/facetimehd.service.
在這個設置下,再啟動後我的電腦就能夠拍照。
謝謝您來看看。有問題的話請留下評論!下次間!
Comments