Как то вечером, я решил, что стоит лечь по-раньше спать. Подумал, что надо бы выспаться, все дела, но перед этим просто загляну в ноутбук, и тут началось. Для чего то я одновременно запустил rtorrent + emerge -vuDN @world. Стоит ли говорить, что система установлена на шпиндельном hdd, поверх которого работает ssd cache (Bcache). Видимо из-за нагрузки, ноутбук завис и ни на какие действия не реагировал. “Семь бед - один ресет”, подумал я и перезагрузил ноутбук. Система загрузилась быстрее обычного, чем меня смутила. Ввожу логин/пароль и терминал падает обратно с приглашением залогиниться. “Отлично, лег по-раньше…”. Записав на видео процесс загрузки и просмотрев его в замедленном режиме, я заметил, что перед приглашением терминала, вылитают ошибки:
error while loading shared libraries: libgcc_s.so.1: cannot open shared object file: no such file or directory
“Может еще не все потеряно?” - затеплился луч надежды. Начинаю судорожно перебирать все загрузочные флешки, ни одна не подходит, то винда, то не работающая федора. Записал новую, загружаюсь… Теперь нужно вспомнить, как монтировать мои диски, все-таки Luks + BCache. Поиск в интернете, нашел:
modprobe bcache
echo /dev/sdb > /sys/fs/bcache/register #cache device
echo /dev/sda4 > /sys/fs/bcache/register #backed device
cryptsetup luksOpen /dev/bcache0 gentoo
Enter password:
mount /dev/mapper/gentoo /mnt/gentoo
Отлично, устройство работает, смотрим внутрь:
ls -l /
...
-rw-r--r-- 1 root root 0 апр 28 19:37 ????{
-rw-r--r-- 1 root root 0 апр 28 19:37 ?3n?
lrwxrwxrwx 1 root root 5 апр 15 02:23 lib -> lib64/
-rw-r--r-- 1 root root 0 апр 28 19:37 l???j????F?s
-rw-r--r-- 1 root root 0 апр 28 19:37 L????巴?k6?
...
Восхитительно. Все признаки того, что fs была попорчена. Окей, делаем backup самого ценного и скидываем в облако, после чего отмонтируем устройство и прогоняем fsck:
cd /mnt/gentoo
tar czf /home/kron.tar.gz home/kron etc/
cd /
umount -l /mnt/gentoo
xfs_repair /dev/bcache0
Монтируем обратно и смотрим, не исчезли ли файлы:
mount /dev/bcache0 /mnt/gentoo
ls -l /mnt/gentoo
...
-rw-r--r-- 1 root root 0 апр 28 19:37 ????{
-rw-r--r-- 1 root root 0 апр 28 19:37 ?3n?
lrwxrwxrwx 1 root root 5 апр 15 02:23 lib -> lib64/
-rw-r--r-- 1 root root 0 апр 28 19:37 l???j????F?s
-rw-r--r-- 1 root root 0 апр 28 19:37 L????巴?k6?
...
Неа, не исчезли. И ладно, идем дальше. Пробуем сделать chroot:
chroot /mnt/gentoo /bin/bash
error while loading shared libraries: libgcc_s.so.1: cannot open shared object file: no such file or directory
Ожидаемо. Не знаю, зачем я очень хотел во внутрь, ведь все можно было сделать и снаружи, но меня было не остановить.
chroot /mnt/gentoo /bin/sh
error while loading shared libraries: libgcc_s.so.1: cannot open shared object file: no such file or directory
chroot /mnt/gentoo /bin/zsh
error while loading shared libraries: libgcc_s.so.1: cannot open shared object file: no such file or directory
chroot /mnt/gentoo ruby
irb(main):001:0>
О, а это уже не плохо. Идем дальше:
chroot /mnt/gentoo python
Python 2.7.10 (default, Dec 3 2015, 18:09:25)
[GCC 4.8.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
import subprocess
subprocess.check_output(["ls", "/lib/"])
'cpp\ndevice-mapper\ndhcpcd\nfirmware\ngentoo\nld-2.22.so\nld-linux.so.2\nld-linux-x86-64.so.2\nlibacl.so.1\nlibacl.so.1.1.0\nlibaio.so.1\nlibaio.so.1.0.1\nlibanl-2.22.so\nlibanl.so.1\nlibattr.so.1\nlibattr.so.1.1.0\nlibblkid.so.1\nlibblkid.so.1.1.0\nlibBrokenLocale-2.22.so\nlibBrokenLocale.so.1\nlibbz2.so.1\nlibbz2.so.1.0\nlibbz2.so.1.0.6\nlibc-2.22.so\nlibcap.so.2\nlibcap.so.2.24\nlibcidn-2.22.so\nlibcidn.so.1\nlibcom_err.so.2\nlibcom_err.so.2.1\nlibcrack.so.2\nlibcrack.so.2.9.0\nlibcrypt-2.22.so\nlibcrypt.so.1\nlibc.so.6\nlibdevmapper-event-lvm2mirror.so\nlibdevmapper-event-lvm2raid.so\nlibdevmapper-event-lvm2snapshot.so\nlibdevmapper-event-lvm2.so.2.02\nlibdevmapper-event-lvm2thin.so\nlibdevmapper-event.so.1.02\nlibdevmapper.so.1.02\nlibdl-2.22.so\nlibdl.so.2\nlibe2p.so.2\nlibe2p.so.2.3\nlibeinfo.so\nlibeinfo.so.1\nlibext2fs.so.2\nlibext2fs.so.2.4\nlibgcc_s.so.1\nlibhistory.so.6\nlibhistory.so.6.3\nlibip4tc.so.0\nlibip4tc.so.0.1.0\nlibip6tc.so.0\nlibip6tc.so.0.1.0\nlibiptc.so.0\nlibiptc.so.0.0.0\nlibiw.so\nlibiw.so.30\nlibkeyutils.so.1\nlibkeyutils.so.1.5\nlibkmod.so.2\nlibkmod.so.2.2.11\nliblvm2app.so.2.2\nliblvm2cmd.so.2.02\nliblzma.so.5\nliblzma.so.5.2.2\nlibm-2.22.so\nlibmemusage.so\nlibmnl.so.0\nlibmnl.so.0.1.0\nlibmount.so.1\nlibmount.so.1.1.0\nlibm.so.6\nlibmvec-2.22.so\nlibmvec.so.1\nlibncurses.so.5\nlibncurses.so.5.9\nlibncurses.so.6\nlibncurses.so.6.0\nlibncursesw.so.5\nlibncursesw.so.5.9\nlibncursesw.so.6\nlibncursesw.so.6.0\nlibnsl-2.22.so\nlibnsl.so.1\nlibnss_compat-2.22.so\nlibnss_compat.so.2\nlibnss_db-2.22.so\nlibnss_db.so.2\nlibnss_dns-2.22.so\nlibnss_dns.so.2\nlibnss_files-2.22.so\nlibnss_files.so.2\nlibnss_hesiod-2.22.so\nlibnss_hesiod.so.2\nlibnss_nis-2.22.so\nlibnss_nisplus-2.22.so\nlibnss_nisplus.so.2\nlibnss_nis.so.2\nlibpamc.so\nlibpamc.so.0\nlibpamc.so.0.82.1\nlibpam_misc.so\nlibpam_misc.so.0\nlibpam_misc.so.0.82.1\nlibpam.so\nlibpam.so.0\nlibpam.so.0.84.1\nlibpcprofile.so\nlibpcre.so.1\nlibpcre.so.1.2.6\nlibprocps.so.4\nlibprocps.so.4.0.0\nlibpthread-2.22.so\nlibpthread.so.0\nlibrc.so\nlibrc.so.1\nlibreadline.so.6\nlibreadline.so.6.3\nlibresolv-2.22.so\nlibresolv.so.2\nlibrt-2.22.so\nlibrt.so.1\nlibSegFault.so\nlibsmartcols.so.1\nlibsmartcols.so.1.1.0\nlibss.so.2\nlibss.so.2.0\nlibthread_db-1.0.so\nlibthread_db.so.1\nlibudev.so.1\nlibudev.so.1.6.4\nlibusb-0.1.so.4\nlibusb-0.1.so.4.4.4\nlibusb-1.0.so.0\nlibusb-1.0.so.0.1.0\nlibutil-2.22.so\nlibutil.so.1\nlibuuid.so.1\nlibuuid.so.1.3.0\nlibwrap.so.0\nlibwrap.so.0.7.6\nlibxfs.so.0\nlibxfs.so.0.0.0\nlibxlog.so.0\nlibxlog.so.0.0.0\nlibxtables.so.10\nlibxtables.so.10.0.0\nlibz.so.1\nlibz.so.1.2.8\nmodprobe.d\nmodules\nnetifrc\nrc\nsecurity\nsystemd\ntc\nudev\n'
Не, так не понятно ничего. Поищем, есть ли библиотека вообще:
find /mnt/gentoo -iname libgcc_s.so.1
/usr/lib64/gcc/x86_64-pc-linux-gnu/4.8.5/libgcc_s.so.1
О, с этим можно что-то сделать:
import subprocess
lib_orig = "/usr/lib64/gcc/x86_64-pc-linux-gnu/4.8.5/libgcc_s.so.1"
lib_dst = "/lib/libgcc_s.so.1"
print subprocess.check_output(["rm", "-f", lib_dst])
print subprocess.check_output(["ln", "-s", lib_orig, lib_dst])
Запускаем:
chroot /mnt/gentoo python /set_lib.py
chroot /mnt/gentoo /bin/bash
~ #>
О, похоже работает, можно пробовать перезагружаться. Система действительно загрузилась, а вот иксы нет.
grep EE /var/log/Xorg.0.log
[25.504] (EE) AIGLX: reverting to software rendering
[25.517] (EE) AIGLX error: dlopen of /usr/lib64/dri/swrast_dri.so failed (libstdc++.so.6: cannot open shared object file: No such file or directory)
[25.517] (EE) GLX: could not load software renderer
Эта песня хороша, начинай сначала..
equery b libstdc++.so.6 2:40:43
* Searching for libstdc++.so.6 ...
sys-devel/gcc-4.8.5 (/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.5/32/libstdc++.so.6 -> libstdc++.so.6.0.20)
sys-devel/gcc-4.8.5 (/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.5/libstdc++.so.6 -> libstdc++.so.6.0.20)
sys-devel/gcc-4.9.3 (/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/32/libstdc++.so.6 -> libstdc++.so.6.0.20)
sys-devel/gcc-4.9.3 (/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/libstdc++.so.6 -> libstdc++.so.6.0.20)
Похоже система повисла как раз в тот момент, когда старый gcc уже удалялся, а новый еще не установился. Вот так совпадение.. И именно в тот вечер, когда собираешься лечь по-раньше.. Окей, пересоберем gcc, а пока он будет собираться, напишу эту статью..
emerge -av1 gcc
Собирается новый gcc, старый удаляется и вот в момент замены одного gcc на другой (хочу заметить, что замена производится shell скриптом, который зависит от libgcc_s.so.1), все падает, с уже знакомой нам ошибкой:
error while loading shared libraries: libgcc_s.so.1: cannot open shared object file: no such file or directory
Где там наш скрипт по установке симлинка?
python /set_lib.py
Переустанавлиаем профиль gcc вручную.
gcc-config x86_64-pc-linux-gnu-4.9.3
* Switching native-compiler to x86_64-pc-linux-gnu-4.9.3 ...
sh: error while loading shared libraries: libgcc_s.so.1: cannot open shared object file: No such file or directory
>>> Regenerating /etc/ld.so.cache...
sh: error while loading shared libraries: libgcc_s.so.1: cannot open shared object file: No such file or directory [ ok ]
* If you intend to use the gcc from the new profile in an already
* running shell, please remember to do:
* . /etc/profile
Ахаха, что ты делаешь? Прекрати!
python /set_libs.py
gcc-config -l
[1] x86_64-pc-linux-gnu-4.9.3 *
Похоже, на этот раз установилось. Пробуем запустить Иксы:
~$ > startx
И наконец то, все взлетело. Занавес. Вот теперь то можно пойти и лечь спать, по-раньше.. В три ночи..
P.S. Ад на этом не закончился, конечно же. Дальнейшее обновление системы снесло ncurses-5 и заменило его на 6-й. Говорить о том, что вся система была завязана на 5-й и перестала работать, думаю не стоит. Но об этом я уже писать не буду, я же спасть собирался лечь, по-раньше.