Kernel panic not syncing: vfs: unable to mount root fs

Что делать с «vfs unable to mount root fs»

1. Загрузка из более старого ядра

После того, как система выдаст эту ошибку, случится Kernel Panic и компьютер перезагрузится. Вы снова окажетесь в меню загрузчика Grub. Здесь, первым делом, надо попытаться загрузиться с помощью более старого ядра. Для этого выберите пункт Дополнительные параметры и выберите одно из более старых ядер.

Если система в этом случае загрузится, то можно сделать вывод, что не работает только новое ядро. Если вы собирали его сами, то, возможно, вы не включили в него все необходимые для работы файловые системы. Если это ядро из репозиториев, и система загрузилась с более старым ядром, то можно предположить, что у вас повреждена initramfs для нового ядра. Это тоже могло произойти из-за недостатка памяти при обновлении системы. Чтобы всё исправить, вам достаточно освободить место в каталоге /boot/ и создать новую initramfs. Проверьте и освободите место в папке /boot, если его там мало:

У меня занято только 30%, если будет 100% — надо освобождать. Для создания initramfs сначала узнаем текущую версию ядра:

Затем вставляем полученную версию в такую команду:

Получится, например:

После завершения этой операции надо обновить конфигурацию Grub:

Если вы думаете, что проблема именно в свободном пространстве и initramfs, но загрузится с помощью более старого ядра не можете, то попробуйте другой LiveCD-дистрибутив и попытайтесь всё исправить в chroot-окружении.

2. Неверное имя корневого раздела Grub

Сейчас, в большинстве дистрибутивов, в конфигурационном файле Grub имя корневого раздела передается ядру в формате UUID. И с этим обстоятельством есть одна проблема. Если вы каким-либо образом измените корневой раздел, например, измените его размер, то UUID изменится. И если вы перезагрузитесь, не обновив конфигурацию Grub, то система больше не загрузится, потому что ядро попросту не сможет найти нужного раздела.

Но попытаться решить проблему можно. Если вы точно знаете, на каком разделе у вас находится корень, то можно прямо в меню Grub исправить конфигурацию. Для этого в меню выберете стрелками вверх и вниз нужный пункт, а затем нажмите кнопку E. Откроется редактор конфигурации. Вам нужно найти строчку, похожую на эту:

В ней надо заменить UUID=9d8d92de-74a6-4e64-8281-b8548c690e0c на обычное имя вашего корневого раздела, например, /dev/sda2. Для начала загрузки нажмите F10. Если система загрузится, значит проблема была именно в этом. В дальнейшем, можно просто обновить конфигурацию Grub:

Или даже попросить Grub больше не использовать UUID для обозначения корневого раздела:

Если ошибка исчезла, но система всё ещё не загружается, обратите внимание, что systemd всё ещё использует файл /etc/fstab для монтирования файловых систем. И если корневая файловая система (и не корневая тоже) там указана неверно, система не загрузится

Для исправления этой проблемы можно использовать режим восстановления Ubuntu. Здесь тоже надо заменить UUID на обычную запись или же на правильный UUID. Такая проблема очень часто становится причиной медленной загрузки Linux.

В этом же режиме можно проверить корневой раздел на ошибки, но для проверки диска лучше использовать LiveCD.

Почему возникает ошибка «vfs unable to mount root fs»

Все ситуации, в которых может появиться сообщение «error: vfs unable to mount root fs» можно разделить на два вида:

  • Загрузка с жёсткого диска — вы загружаете свою основную операционную систему после внесения изменений в таблицу разделов, обновления или других действий, которые могли задеть диски;
  • Вы загружаете LiveCD-систему с оптического диска или флешки.

Второй вариант сразу же отбросим. Здесь исправлять нечего. Ошибка означает, что либо образ был битый, либо он был неверно записан на диск. А вот первый случай интереснее, рассмотрим основные причины, которые могут его вызывать:

  • Корневой раздел был переименован и теперь называется по другому;
  • Повреждена initramfs;
  • Ядро не поддерживает файловую систему корневого раздела;
  • Ошибка в конфигурации загрузчика, например, из-за недостаточного количества свободного места в папке /boot;
  • Файловая система корневого раздела повреждена.

Теперь давайте рассмотрим возможные пути решения проблемы.

Для инстансов EC2 на Ubuntu 14.04 / 16.04 / 18.04 / 20.04

GRUB2 является предустановленным загрузчиком и менеджером для Ubuntu, начиная с версии 9.10. Именно поэтому процесс изменения загрузочных параметров ядра практически такой же, как и для других дистрибутивов Linux с GRUB2, которые мы рассмотрели выше.

В данном случае местоположением файла конфигурации будет /etc/default/grub.d/50-cloudimg-settings.cfg.

Для добавления параметров откройте в редакторе /etc/default/grub.d/50-cloudimg-settings.cfg и измените нужные параметры в GRUB_CMDLINE_LINUX_DEFAULT, как мы делали ранее.

После этого выполните команду update-grub, чтобы повторно сгенерировать уже обновлённую конфигурацию grub:

# update-grub

PS. update-grub — это альтернатива или, так скажем, сокращённая версия команды grub-mkconfig -o /boot/grub/grub.cfg.

Работа с конфигурацией GRUB

Теперь отредактируйте файл конфигурации (/etc/grub.conf) в предпочтительном редакторе и добавьте/измените нужные вам параметры. Я добавил те же параметры “clocksource=tsc tsc=reliable”, что и ранее.

Перезапустите систему, чтобы изменения вступили в силу. Проверить это мы можем тем же способом, что и в опции 1:

# reboot # cat /proc/cmdline root=LABEL=/ console=tty1 console=ttyS0 selinux=0 nvme_core.io_timeout=4294967295 clocksource=tsc tsc=reliable

Несмотря на то, что эта опция работает прекрасно и широко используется, её недостаток в том, что она требует от вас наличия базового понимания конфигурации grub. Кроме того, вам нужно знать, какая запись меню активна и где изменять параметры.

Дистрибутивы Linux с Legacy GRUB

Amazon Linux 1 аналогично RHEL6.X, RHEL5.X и CentOS использует в качестве загрузчика GRUB (также известный как Legacy RUB). Узнать версию в подобных дистрибутивах вы можете так:

# grub-install -v grub-install (GNU GRUB 0.97)

Файл конфигурации GRUB располагается в /boot/grub/grub.conf и содержит две символические ссылки на себя: /etc/grub.conf и /boot/grub/menu.lst. Нам нужно изменить эту конфигурацию grub, добавив дополнительные параметры загрузки ядра. Однако, чтобы сделать это эффективно, давайте сначала разберём основы конфигурации grub. Ниже приведён её пример из инстанса EC2 Amazon Linux 1.

Почему возникает ошибка «vfs unable to mount root fs»

Все ситуации, в которых может появиться сообщение «error: vfs unable to mount root fs» можно разделить на два вида:

  • Загрузка с жёсткого диска — вы загружаете свою основную операционную систему после внесения изменений в таблицу разделов, обновления или других действий, которые могли задеть диски;
  • Вы загружаете LiveCD-систему с оптического диска или флешки.

Второй вариант сразу же отбросим. Здесь исправлять нечего. Ошибка означает, что либо образ был битый, либо он был неверно записан на диск. А вот первый случай интереснее, рассмотрим основные причины, которые могут его вызывать:

  • Корневой раздел был переименован и теперь называется по другому;
  • Повреждена initramfs;
  • Ядро не поддерживает файловую систему корневого раздела;
  • Ошибка в конфигурации загрузчика, например, из-за недостаточного количества свободного места в папке /boot;
  • Файловая система корневого раздела повреждена.

Теперь давайте рассмотрим возможные пути решения проблемы.

Настройка Grub через конфигурационные файлы

Сразу нужно сказать, что существует два способа настройки Grub Ubuntu, через конфигурационные файлы. Первый — через конфигурационный файл утилиты grub-mkconfig, который позволяет задать общие параметры для загрузчика и ручное редактирование /boot/grub/grub.cfg.

Первый — рекомендованный, и с помощью него можно настроить большинство параметров, в этом случае настройки не собьются, когда вы обновите ядро или загрузчик. Второй вариант еще более гибкий, но после любого обновления вы потеряете свои настройки. Так что то что можно настроить через /etc/default/grub настраиваем через него, все остальное — через /boot/grub/grub.cfg. Сначала рассмотрим первый вариант.

Настройка Grub через /etc/default/grub

Как я уже сказал, настройка загрузчика через файл /etc/default/grub, на основе которого будет автоматически создан /boot/grub/grub.cfg более желательна. Давайте рассмотрим параметры, которые вы можете здесь настроить.

  • GRUB_DEFAULT — указывает какой пункт нужно загружать по умолчанию. Может быть указан номер, или полное название или же строка saved, которая значит, что нужно загрузить пункт, указанный с помощью grub-reboot;
  • GRUB_SAVEDEFAULT — загружать последнюю использованную запись по умолчанию;
  • GRUB_HIDDEN_TIMEOUT — сколько секунд ждать перед тем, как вывести меню;
  • GRUB_HIDDEN_TIMEOUT_QUIET — если установлено true, то меню не будет показано;
  • GRUB_TIMEOUT — сколько секунд будет показано меню;
  • GRUB_CMDLINE_LINUX — добавить опции ядра для всех ядер, как обычных, так и режима восстановления;
  • GRUB_CMDLINE_LINUX_DEFAULT — добавить опции ядра только для обычных ядер;
  • GRUB_CMDLINE_LINUX_RECOVERY — опции ядра, только для режима восстановления;
  • GRUB_BADRAM — указать адреса оперативной памяти, которые не нужно использовать;
  • GRUB_TERMINAL — модуль терминала для Grub. Можно использовать console, только для текстового режима или gfxterm с поддержкой графики;
  • GRUB_GFXMODE — разрешение экрана в Grub, лучшие использовать auto, чтобы система выбрала сама то что ей нужно.
  • GRUB_DISABLE_RECOVERY — не включать в меню пункты восстановления;
  • GRUB_DISABLE_OS_PROBER — не искать другие операционные системы;
  • GRUB_BACKGROUND — адрес картинки для фона, должна находиться в той же папке что и файлы grub;
  • GRUB_THEME — устанавливает тему Grub.

Например, можно использовать такую конфигурацию:

Но как вы могли понять, этим способом вы не можете настроить порядок пунктов загрузки, а также некоторые другие параметры, поэтому давайте рассмотрим настройку непосредственно конфигурационного файла Grub.

7 ответов

10

Я нашел, что это проблема.

Проблема заключалась в том, что когда я обновил Ubuntu, установив через liveUSB вместо обычного обновления, он оставил старые файлы ядра в папке /boot.

Теперь, когда я обновил то же самое с 12.10 до 13.04, я столкнулся с такой же ситуацией.

Решение состоит в том, чтобы вручную удалить все файлы, связанные со старыми ядрами в папке /boot, и запустить . Дополнительные записи исчезли.

40

  • Откройте терминал ( Ctrl + Alt + T ).

  • Введите . Это покажет вам ядро, которое вы используете в настоящее время, поэтому вы не хотите удалять это.

  • Выполните следующую команду: . Это покажет все установленные ядра.

  • Запишите имена всех ядер, которые вы хотите удалить.

  • Чтобы удалить ядра, запустите: ( заменить имя ядра соответствующим ).

  • Обновить GRUB:

И все готово.

Бонус: вот маленький однострочный файл, который сделает все это автоматически:

5

Попробуйте эту команду. Это уточненная версия той же команды

Заменив удалить на autoremove , процесс удаления автоматически находит и удаляет другие зависимости, оставшиеся, поэтому вы получите чистую деинсталляцию, вместо того, чтобы идти сюда и там, и удалите остатки.

Повторите этот процесс и для других старых ядер.

После этого запустите

После этого вы увидите только последнее ядро.

3

Обычно я просто запускаю Synaptic (который должен быть установлен отдельно в эти дни), ищите «linux» в категории Installed и отметьте все старые версии ядра и linux-заголовки (то есть все, кроме текущего), чтобы удален. При удалении они удаляются из меню GRUB.

Для этого должна быть отличная однострочная команда, но для нее безопаснее просто делать это вручную

3

Самое slickest решение будет использовать . После установки запустите его, перейдите в , выберите , выберите старые ядра, которые вы намерены удалить, и

Это оно! (Обратите внимание, что в janitor отображаются только старые )

3

Я предлагаю вам ввести это в сеансе терминала ( Alt Ctrl T ):

Эта команда заставляет grub использовать и обновлять меню.

Если у вас есть разделы со старыми выпусками Ubuntu на них, которые использовали grub (кажется, у OP был какой-то natty-релиз, возможно, больше), необходимо также очистить их перед запуском update-grub в текущей системе. находит Windows и другие разделы Linux. Для других разделов Linux он копирует элементы из меню grub, если таковые имеются, вместо того, чтобы смотреть на их файлы ядра.

Если у вас действительно испорченная конфигурация, лучшим решением может быть загрузка вашей системы Ubuntu и повторная установка grub с помощью:

При переустановке grub он воссоздает и на основе установленных ядер в этом разделе и на ядрах, установленных в конфигурациях grub других (предположительно более старых) разделов Ubuntu (для OP не похоже).

1

Для Ubuntu 12.04 LTS (точный) 64-битный (на 32-битном без PAE)

Проверьте, какие версии присутствуют:

Сначала удалите старшую, а не удалите текущую /последнюю версию:

Повторно проверьте, какая версия теперь присутствует. (Необязательно)

Примечание: Этот шаг требуется , если вы удалите все, кроме последней (или оставите только одну) версию.

Для Ubuntu 12.04 LTS (точный) 32bit (PAE)

Проверьте, какие версии присутствуют:

Сначала удалите старшую, а не удалите текущую /последнюю версию:

Повторно проверьте, какая версия теперь присутствует. (Необязательно)

Примечание: Этот шаг требуется , если вы удалите все, кроме последней (или оставите только одну) версию.

Преимущества grubby

Работа с таким инструментом, как grubby, предоставляет множество преимуществ, включая простоту и согласованность во многих дистрибутивах. Для использования grubby вам также не нужно обладать глубокими познаниями об его файлах конфигурации. Например, вы можете получить рабочее ядро при помощи одной команды:

# grubby --default-kernel/boot/vmlinuz-4.14.181-108.257.amzn1.x86_64

Обратите внимание, что это текущая версия ядра. Вы получите её же при помощи команды “uname-r” (текущая версия ядра) или через запись меню “default” в файле конфигурации

Более подробную информацию вы можете получить при помощи опции -info (аналогично использованию файла конфигурации):

# grubby --info /boot/vmlinuz-$(uname -r) index=0kernel=/boot/vmlinuz-4.14.181-108.257.amzn1.x86_64args="console=tty1,ttyS0 selinux=0 nvme_core.io_timeout=4294967295" root=LABEL=/initrd=/boot/initramfs-4.14.181-108.257.amzn1.x86_64.img

Попробуйте также опцию “grubby -info ALL”.

С остальными опциями вы можете ознакомиться при помощи “grubby -help”.

В процессе загрузки загрузчик передаёт параметры ядру Linux в буфер памяти под названием kernel command line (командная строка ядра). Файл /proc/cmdline в псевдо-файловой системе /proc также содержит копию этих параметров. Проверить это мы можем при помощи следующей команды:

# cat /proc/cmdline root=LABEL=/ console=tty1 console=ttyS0 selinux=0 nvme_core.io_timeout=4294967295

Установка вручную Grub2

Если при загрузке не удается выполнить свою магию, тогда традиционная ручная установка grub2 метод, описанный в , должен быть исследован этой вики сообщества .

Поиск на этой веб-странице раздела boot-repair . Замените пример /dev/sdxy с помощью раздела, в который вы установили lubuntu, например /dev/sda3

Если вы не знаете, какой раздел вы установили, вы можете запустить загрузочный info-скрипт, найденный на SourceForge.

В результатах искать типы разделов ext4 или ext3 — это обычные файловые системы Ubuntu, если вы ранее не выбрали использовать что-то вроде btrfs или reiserfs и т. Д.

Загрузочные параметры ядра

В процессе загрузки Linux требуется ряд параметров, посредством которых ядру предоставляется информация об аппаратных средствах. В частности, нам приходится иметь дело с этими параметрами, когда ядро не способно определить конкретный параметр самостоятельно, и мы добавляем его вручную. А иногда мы редактируем параметры для переопределения их значений, обнаруживаемых ядром.

За загрузку и запуск ядра Linux отвечает загрузчик ОС, поэтому, чтобы иметь возможность передать параметры загрузки, мы используем специализированный загрузчик вроде GRUB.

Загрузочные параметры ядра определяются в виде списка строк, разделённых пробелами следующим образом:name….

На данный момент код ядра может обрабатывать максимум 10 отделённых запятыми значений параметров. Тем не менее допускается переиспользование одного и того же ключевого слова.

К примеру, приведу конфигурацию grub для инстанса на Amazon Linux 1. В ней я изменил параметр “console”, определив для него 2 значения (допускается до 10).

kernel /boot/vmlinuz-4.14.77-70.59.amzn1.x86_64 root=LABEL=/ console=ttyS0,tty1 selinux=0

Мы можем также предоставить ядру параметры загрузки, приведённые ниже. Здесь вместо определения значений “console” в виде одного параметра мы повторно использовали console для определения другого значения. При необходимости каждый параметр “console” может содержать до 10 значений, что позволяет выйти за рамки предыдущих ограничений.

kernel /boot/vmlinuz-4.14.77-70.59.amzn1.x86_64 root=LABEL=/ console=ttyS0 console=tty1 selinux=0

Существует несколько способов изменения загрузочных параметров ядра. Кроме того, все дистрибутивы Linux (кроме Ubuntu), упомянутые ранее, используют схожие шаги для изменения этих параметров.

Решить проблему паники ядра, не синхронизирующейся: VFS: невозможно смонтировать корневую файловую систему на unknown-block (179,7)

http-equiv=»Content-Type» content=»text/html;charset=UTF-8″>style=»clear:both;»>

Используя noobs для установки Raspbian и других систем, из-за неправильной работы и по другим причинам файловая система имеет проблемы, которые могут привести к сбою при загрузке.

информация об ошибке

Один,

Сообщение об ошибке, отображаемое при запуске, похоже на следующее: (Цифра «7» здесь не одинакова для всех, каждый должен разбираться с ней в соответствии со своей реальной ситуацией, то же самое ниже)

шаг:
  1. Включение, долгое нажатиеКлюч для входаРежим;
  2. Увидев интерфейс запуска noobs, нажмитес участиемВойдите в режим командной строки;
  3. Введите имя пользователя по умолчаниюИ парольАвторизоваться;
  4. войти, Эта команда просканирует раздел и попытается восстановить поврежденную файловую систему Примечание: автоматический режим fsck не поддерживается (например, используйте fsck вместо fsck.ext4);
  5. После завершения ремонта перезапустите Raspberry Pi.

два,

Если отображается следующее сообщение об ошибке, — разделить загрузочную SD-картувнутренний в Здесь есть много способов справиться с этим, вы можете изменить его непосредственно в win / linux или изменить в gui / cmdline в режиме восстановления в соответствии с описанным выше методом, и мы не будем подробно описывать его.

Примечание: все вышеперечисленное относится к новичкам, устанавливающим единую систему.

Если вы используете noobs для установки настраиваемой мультисистемы, возникшая проблема немного сложнее, но решение в основном такое же, но вам нужно выяснить, что загрузочный / корневой раздел каждой системы соответствует / dev / mmcblk0p, Предыдущий пост упоминался немного в конце:Пользовательский мультисистемный запуск NOOBS

: Я столкнулся с вышеуказанными проблемами, обратитесь к вышеуказанным методам для успешного решения проблемы.

Прочие связанные: noobs (v1.5 и выше) Ситуация с установкой нескольких системных разделов может быть следующей: (фактическая ситуация может быть другой)

Первичный раздел Логический раздел Тип файловой системы этикетка
1 FAT RECOVERY NOOBS boot files & initramfs, OS recovery images
2 extended Any logical partitions
5 ext4 SETTINGS NOOBS settings
6 FAT boot Raspbian boot files
7 ext4 root Raspbian root filesystem
8 FAT boot ArchLinux boot files
9 ext4 root ArchLinux root filesystem

Справочная статья:

  1. https://github.com/raspberrypi/noobs/wiki/NOOBS-partitioning-explained

Интеллектуальная рекомендация

1. Для реальных сигналов (для понимания): A (ω) является соотношением амплитуды выходного сигнала и амплитуды входного сигнала, называемого частотой амплитуды. Φ (ω) — это разница межд…

Один. вести Многие люди задавали некоторые вопросы о создании проекта Flex + LCDS (FDS) в сообщениях и группах. Из-за операции ее трудно четко объяснить, поэтому я написал простой учебник (я обещал эт…

package com.example.phonehttp; import android.os.Bundle; import android.os.Handler; import android.app.Activity; import android.widget.ScrollView; import android.widget.TextView; public class MainActi…

Он предназначен для реализации подкласса того же родительского класса с родительским классом. Полиморфизм Один и тот же ссылочный тип использует разные экземпляры для выполнения разных операций; Идея …

тема: Объедините два упорядоченных слоя в новый заказанный список и возврат. Новый список состоит из всех узлов двух связанных списков, данных сплавным. Пример: Анализ: два связанных списка состоит в …

Вам также может понравиться

D. Самая ценная строка Пример ввода 2 2 aa aaa 2 b c Образец вывода aaa c На самом деле, будучи задетым этим вопросом, вы должны быть осторожны. После инвертирования строки, если две строки имеют один…

Given a 2D integer matrix M representing the gray scale of an image, you need to design a smoother to make the gray scale of each cell becomes the average gray scale (rounding down) of all the 8 surro…

calc () может быть очень незнакомым для всех, и трудно поверить, что calc () является частью CSS. Поскольку он выглядит как функция, почему он появляется в CSS, поскольку это функция? Этот момент такж…

Основываясь на дереве регрессии, сформированном CART, а также на предварительной и последующей обрезке дерева, код выглядит следующим образом:…

Откат Обновление в режиме онлайн с версии Centos (CentOS Linux версии 7.3.1611 (Core) до CentOS Linux версии 7.5.1804 (Core)) # ошибка соединения yum-ssh после обновления yexpected key exchange group …

Алгоритм загрузки linux (UEFI)

Сейчас на смену BIOS пришёл UEFI (Unified Extensible Firmware Interface). UEFI содержит множество преимуществ перед BIOS, одна из которых это поддержка GPT.

Раньше диски разбивались на разделы с помощью MBR, при этом диск не мог быть больше 2 TB, а разделов не могло быть больше четырёх. При этом таблица разделов и первичный загрузчик помещались на первый сектор диска в MBR. А GPT позволяет использовать очень большие диски и помещает загрузчик на специальный раздел, а также позволяет создавать очень много разделов.

Диск разбитый на разделы с помощью таблицы разделов GPT в первом секторе продолжает хранить MBR запись. Это делается для того, чтобы старые системы с BIOS могли использовать GPT диски.

UEFI не использует загрузчик из MBR, вместо этого используется загрузчик со специального раздела на диске, который отформатирован в FAT32 и называется ESP или EFI. Это специальный загрузчик от UEFI. Обычно это файл /efi/boot/bootx64.efi.

Secure Boot

UEFI имеет специальный режим, который называется Secure Boot. Если этот режим включен, то загрузчик без специальной подписи не будет работать. Windows и некоторые системы Linux имеют такие подписи, а для других систем приходится этот режим отключать.

Или можно не отключать Secure Boot, а просто очистить ключи производителя и добавить туда ключи от необходимого загрузчика. Например в Ubuntu – GRUB 2 подписан подписью от Canonical, именно эту подпись и следует добавить в Secure Boot.

Дальнейшая загрузка

А дальше все происходит также как и в системах с BIOS. Загрузчик запускает GRUB 2, хотя может сразу запустить и ядро Linux, но тогда мы теряем гибкость GRUB 2.

GRUB 2 в свою очередь запускает ядро Linux. Дальше ядро запускает систему инициализации. А уже система инициализации запускает все остальные процессы в системе.

Выводы

  1. Очень внимательно относитесь к обновлениям. Не запускайте их в обычном терминале по ssh. Если оборвется связь и обновление ядра не выполнится полностью, можете получить такую же проблему, как я сегодня. Обновляйтесь в screen или tmux.
  2. Не торопитесь перезагружать сервер в случае проблем. Лучше сразу же сделать бэкап свежих данных, пока сервер еще живой. Так у вас как минимум, будут самые актуальные бэкапы, а не ночные. В принципе, я так всегда и делаю, но тут расслабился, так как сервер не сильно критичный и простой допускает.
  3. Перед перезагрузкой убедитесь, что у вас есть доступ к терминалу. Я всегда это делаю.
  4. И самый важный пункт — не занимайтесь обслуживанием сайтов, для которых недопустим простой. Нервы и спокойная жизнь дороже. Пусть это делает кто-то другой :)
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: