Page 111 of 165

Ubuntu i “No init found. Try passing init= bootarg”

Nieprawidłowe wyłączanie komputera może być dość dramatyczne w skutkach. Część z was wie, że jestem właścicielem małego serwera (który tak naprawdę jest zwykłym komputerem ;) ), na którym wykonuję testy aplikacji oraz stawiam wersje developerskie (alfy, bety, itd). Oczywiście robię mu regularne backupy, jednak sami dobrze wiecie, że "pad" jakiegokolwiek komputera to po prostu masa pracy z postawieniem go na nowo. W przypadku serwerka dochodzi konfiguracja na nowo, itd.

Wczoraj w skutek nagłego spadku zasilania - zresetował mi się wspomniany wyżej serwer i niestety... już nie wstał. Dostawałem za to piękną wiadomość:

mount: mounting /dev/disk/uuid/***************************** on /root
failed: Invalid argument
mount: mounting /sys on /root/sys failed: No such file or directory
mount: mounting /dev on /root/dev failed: No such file or directory
mount: mounting /sys on /root/sys failed: No such file or directory
mount: mounting /proc on /root/proc failed: No such file or directory
Target file system doesn't have /sbin/init
No init found. Try passing init= bootarg

Busybox v1.13.3 (Ubuntu 1:1.13.3-1ubuntu7) built-in shell (ash)
Enter 'help' for a list of built-in commands
(initramfs) _

Co się stało? Po prostu "padła" jedna z partycji. Naprawa tego typu problemów nie jest trudna (o ile wysypała się partycja a nie np. padł dysk). Musimy mieć bootowalną wersję Linuksa (na pendrivie lub na płycie CD). Odpalamy takie Live CD a następnie przechodzimy do terminala. Wpisujemy komendę:

sudo fdisk -l 

aby dowiedzieć się jakie partycje mamy na dysku i mamy (przykładowo):

Dysk /dev/sda: 80.0 GB, bajtów: 80026361856
głowic: 255, sektorów/ścieżkę: 63, cylindrów: 9729
Jednostka = cylindrów, czyli 16065 * 512 = 8225280 bajtów
Rozmiar sektora (logiczny/fizyczny) w bajtach: 512 / 512
Rozmiar we/wy (minimalny/optymalny) w bajtach: 512 / 512
Identyfikator dysku: 0x85f285f2

Urządzenie Rozruch   Początek      Koniec   Bloków   ID  System
/dev/sda1               1         125     1004031   82  Linux swap
/dev/sda2   *         126        1993    14999552   83  Linux
/dev/sda3            1993        3860    14999552   83  Linux
/dev/sda4            3860        9730    47145985    5  Rozszerzona
/dev/sda5            3860        5728    14998528   83  Linux
/dev/sda6            5728        9730    32146432   83  Linux

Następnie uruchamiamy program fsck na każdej z partycji (tak dla pewności), wykonując następujące polecenie:

# Zmieniamy kolejno na #sda1, sda2, sda3, itd
sudo fsck /dev/sda2

Po tym zabiegu restartujemy serwer i cieszymy się działającym systemem. Następnie zamawiamy UPSa aby taka sytuacja więcej się nie zdarzyła.

Dla pewności, możemy wymusić autouruchomienie fsck przy starcie systemu, wpisując:

sudo touch /forcefsck

Utworzoenie pliku forcefsck w głównym katalogu - spowoduje, że system wstając wykryje go i wykona jeszcze raz testy na partycjach. Po tych operacjach wszystko powinno wrócić do normy.

Sprawdzanie poprawności URLi z wykorzystaniem Pythona i urllib2

Dzisiaj dla odmiany od Rubiego, krótki poradnik dot. sprawdzania dostępności strony WWW z wykorzystaniem Pythona i biblioteki urllib2.

Wstęp

Zdarza się, że potrzebujemy wiedzieć czy url jaki wprowadza użytkownik jest poprawny i czy taka strona w ogóle istnieje. Może się to przydać chociażby do walidacji pola url w modelu usera. Dzięki temu użytkownik nie będzie mógł wprowadzić przez pomyłkę adresu który nie istnieje.

Metoda

Metoda jest całkiem prosta - wystarczy odpytać żądaniem HEAD nasz url, sprawdzić co zostanie zwrócone i ewentualnie przechwycić wyjątki. Warto zauważyć, że w poniższym kodzie dokonałem pewnego uproszczenia. Mianowicie, przechwytuję część błędów nadając im ręcznie wartość 404. Tak naprawdę te błędy należałoby obsłużyć w inny sposób, ponieważ niekoniecznie oznaczają to, że podana strona nie istnieje. Poniżej opis tego co który wyjątek oznacza:

  • urllib2.HTTPError - błędy z serwera (404, 500, 403, itd)
  • urllib2.URLError - nieprawidłowy URL (nie istnieje taki adres lub błąd w składni)
  • Exception - całe inne zło tego świata :)

Najpierw zaimportujmy sobie co nam potrzeba i ustalmy jaki URL sprawdzamy:

import urllib2
from urllib2 import URLError

uri = "http://onet.pl"

No i sprawdzamy:

def uri_status( uri):
  if len(uri) == 0: return '404'
  try:
      request = urllib2.Request(uri,  None, {'User-agent': 'Mozilla/5.0'})
      request.get_method = lambda : 'HEAD'
      response = urllib2.urlopen(request)
      return '200'
  except urllib2.HTTPError, e:
      return e.code
  except urllib2.URLError, e:
      return '404'
  except Exception, e:
      return '404'

print uri_status(uri)

Kod metody i jej wywołanie:

def uri_status( uri):
  if len(uri) == 0: return False
  try:
      request = urllib2.Request(uri,  None, {'User-agent': 'Mozilla/5.0'})
      request.get_method = lambda : 'HEAD'
      response = urllib2.urlopen(request)
      return '200'
  except urllib2.HTTPError, e:
      return e.code
  except urllib2.URLError, e:
      return '404'
  except Exception, e:
      return '404'

print uri_status(uri)

Podajemy user_agenta (przeglądarkę), ponieważ niektóre serwisy nie chcą (lub robią to błędnie) odpowiadają na żądania.

UPDATE

Warto ustawić także timeout dla połączeń - ponieważ połączenia bez ustalonego timeoutu mogą trwać w nieskończoność. Nie można tego jednak zrobić z poziomu urllib2 a jedynie dla socketów:

import socket
import urllib2

# timeout w sekundach
timeout = 10
socket.setdefaulttimeout(timeout)

Copyright © 2024 Closer to Code

Theme by Anders NorenUp ↑