
我在無法存取的伺服器上使用虛擬機,並以唯讀模式安裝檔案系統:
# dmesg
....
[2.535658] EXT4-fs (vda): Couldn't remount RDWR because of unprocessed orphan inode list. Please umount/remount instead
所以我嘗試運行:
# e2fsck -f /dev/vda
e2fsck 1.42.9 (28-Dec-2013)
/dev/vda has unsupported feature(s): metadata_csum
e2fsck: Get a newer version of e2fsck!
輸出df
:
/dev/root 41022688 37964956 944196 98% /
devtmpfs 4084008 0 4084008 0% /dev
tmpfs 4085752 0 4085752 0% /dev/shm
tmpfs 4085752 397012 3688740 10% /run
tmpfs 4085752 0 4085752 0% /sys/fs/cgroup
tmpfs 817152 0 817152 0% /run/user/0
tmpfs 817152 0 817152 0% /run/user/1000
輸出mount
:
/dev/vda on / type ext4 (ro,relatime,stripe=8191,data=ordered)
devtmpfs on /dev type devtmpfs (rw,relatime,size=4084008k,nr_inodes=1021002,mode=755)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=23,pgrp=1,timeout=300,minproto=5,maxproto=5,direct)
configfs on /sys/kernel/config type configfs (rw,relatime)
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
nfsd on /proc/fs/nfsd type nfsd (rw,relatime)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,pagesize=2M)
mqueue on /dev/mqueue type mqueue (rw,relatime)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,size=817152k,mode=700)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=817152k,mode=700,uid=1000,gid=1000)
當然,我無法更新 e2fsck,因為我有一個唯讀檔案系統。我怎樣才能跳出循環?
答案1
看起來您有一個/run
以讀取/寫入方式安裝的 ramdisk(tmpfs 檔案系統)。你能在那裡下載最新的e2fsck
嗎?然後你應該能夠
e2fsck -f /dev/vda
從/run
根檔案系統運行並修復它。- 重啟。這將清除您新下載的 tmpfs
e2fsck
檔案系統,因為重新啟動時會重新初始化 tmpfs 檔案系統。但你的根檔案系統現在應該是讀/寫的。 - 再次下載
e2fsck
到根檔案系統。
事實上,如果您可以在修復根檔案系統後重新掛載它(無需重新啟動),那麼您應該能夠複製e2fsck
到/sbin
(或它所屬的任何地方)。
答案2
答案取決於這個錯誤是如何產生的?
如果您啟動了一些較新的內核,並且它將您的 ext4 檔案系統升級到了較新的版本,而您的預設內核並不完全支持,則可能會發生這種情況。如果是這樣,解決方案可能就像重新啟動到較新的核心一樣簡單,然後徹底卸載檔案系統。
但是,如果您“什麼也沒做”並且錯誤本身出現,則可能表示隨機硬體損壞。在這種情況下,謹慎的做法是先備份您需要的所有資料(實際上備份內容總是一個好主意)。您可以使用scp
/sftp
將所有重要資料備份到工作站,或者如果您有其他可用伺服器,則進行完整系統備份,例如:
otherserver# nc -l -p 8080 > brokenserver-backup.tar.gz
brokenserver# tar zcf - / | nc otherserver.example.com 8080
在獲得有效的備份後,您需要e2fsck
按照 @G-Man 的建議取得更新的備份。然而,正如您發現的,您需要靜態編譯/連結e2fsck 的版本,否則會拋出缺少動態函式庫的錯誤。以下是具體操作方法。
為此,首先您需要下載靜態版本。這樣做的好處是它可以適用於任何 GNU/Linux 發行版。我更喜歡來自 http://packages.debian.org/e2fsck-static:
su
cd /run
wget http://ftp.de.debian.org/debian/pool/main/e/e2fsprogs/e2fsck-static_1.44.2-1~bpo9+1_amd64.deb
或者,您可以在工作站上下載並使用sftp
客戶端,例如菲萊齊拉將其複製到/run
損壞的伺服器上的目錄。
然後,您需要將其拆包。對於.deb
,您使用ar
和tar
。
brokenserver:/run# ar xv e2fsck-static_1.44.2-1~bpo9+1_amd64.deb
x - debian-binary
x - control.tar.gz
x - data.tar.xz
brokenserver:/run# tar Jxvf data.tar.xz
./
./sbin/
./sbin/e2fsck.static
./usr/
./usr/share/
./usr/share/doc/
./usr/share/doc/e2fsck-static/
./usr/share/doc/e2fsck-static/changelog.Debian.gz
./usr/share/doc/e2fsck-static/copyright
./usr/share/man/
./usr/share/man/man8/
./usr/share/man/man8/e2fsck.static.8.gz
筆記: 如果ar
拆封的話數據.tar.gz廣州代替數據.tar.gzxz,然後你就可以用來tar zxvf data.tar.gz
解壓縮。另外,如果您錯過了某些工具(ar
、tar
、gzip
、xz
)或空間不足,您可以在任何其他 GNU/Linux 伺服器或工作站上解壓縮該工具,然後將檔案複製sbin/e2fsck.static
到損壞的伺服器上。
然後,你終於可以進行 fsck 了:
brokenserver:/run# chmod 755 /run/sbin/e2fsck.static
brokenserver:/run# ./sbin/e2fsck.static /dev/vda
筆記:如果你得到“沒有權限”錯誤,可能是因為您/run
已安裝不執行(不是你的情況,但確實如此,你可以用 修復它mount -oremount,exec /run
,或者因為你下載了錯誤的架構(例如,amd64
舊的二進位檔案i386
- 請參閱拱門(1))。追蹤(1)最後會為您提供更多信息,例如:
execve("/run/sbin/e2fsck.static", ["/run/sbin/e2fsck.static"], [/* 22 vars */]) = -1 ENOEXEC (Exec format error)
或者
execve("/run/sbin/e2fsck.static", ["/run/sbin/e2fsck.static"], [/* 22 vars */]) = -1 EACCES (Permission denied)