Перейти к содержимому
Калькуляторы

Обновление размера физического диска

Есть внешняя система хранения данных. Расширяем физический диск (т.е. добавляем новый винт потом RAID Expand, затем Volume Expand). Все зашибись физический размер увеличился но система естественно этого не видит, как ее заставить увидеь новый размер? Без перезагрузки естественно.

 

Система CentOS 5.4

Изменено пользователем SokolovS

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если используемая на этом томе ФС позволяет изменение размеров без размонтирования - то соответствующими утилитами. Если не позволяет - то никак.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

кстати, да сам с таким столкнулся

EvilShadow, SokolovS говорит про увеличение размера физического диска, а не фс, с фс то всё понятно и так

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

кстати, да сам с таким столкнулся

EvilShadow, SokolovS говорит про увеличение размера физического диска, а не фс, с фс то всё понятно и так

Вот именно! Физического диска, с ФС все понятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот именно! Физического диска, с ФС все понятно.
Тогда я чего-то не понимаю. Потому что
Все зашибись физический размер увеличился
Так увеличился или не увеличился? И если увеличился, как Вы это определили?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

мне тут скриптик scsi_rescan.sh попадался. На виртуалках помогает - видит добавление\удаление диска, изменение раздела...

Могу запостить, если что...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

martin74, было бы замечательно

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

echo '- - -' > /sys/class/scsi_host/${host_number}/scan

 

Но всё-таки, как определили, что он увеличился?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

#!/bin/bash
# Skript to rescan SCSI bus, using the
# scsi add-single-device mechanism
# (w) 1998-03-19 Kurt Garloff <kurt@garloff.de> (c) GNU GPL
# (w) 2003-07-16 Kurt Garloff <garloff@suse.de> (c) GNU GPL
# $Id: rescan-scsi-bus.sh,v 1.15 2004/05/08 14:47:13 garloff Exp $

setcolor ()
{
  red="\e[0;31m"
  green="\e[0;32m"
  yellow="\e[0;33m"
  norm="\e[0;0m"
}

unsetcolor ()
{
  red=""; green=""
  yellow=""; norm=""
}

# Return hosts. sysfs must be mounted
findhosts_26 ()
{
  hosts=
  if ! ls /sys/class/scsi_host/host* >/dev/null 2>&1; then
    echo "No SCSI host adapters found in sysfs"
    exit 1;
    #hosts=" 0"
    #return
  fi
  for hostdir in /sys/class/scsi_host/host*; do
    hostno=${hostdir#/sys/class/scsi_host/host}
    hostname=`cat $hostdir/proc_name`
    hosts="$hosts $hostno"
    echo "Host adapter $hostno ($hostname) found."
  done
}

# Return hosts. /proc/scsi/HOSTADAPTER/? must exist
findhosts ()
{
  hosts=
  for driverdir in /proc/scsi/*; do
    driver=${driverdir#/proc/scsi/}
    if test $driver = scsi -o $driver = sg -o $driver = dummy -o $driver = device_info; then continue; fi
    for hostdir in $driverdir/*; do
      name=${hostdir#/proc/scsi/*/}
      if test $name = add_map -o $name = map -o $name = mod_parm; then continue; fi
      num=$name
      driverinfo=$driver
      if test -r $hostdir/status; then
        num=$(printf '%d\n' `sed -n 's/SCSI host number://p' $hostdir/status`)
        driverinfo="$driver:$name"
      fi
      hosts="$hosts $num"
      echo "Host adapter $num ($driverinfo) found."
    done
  done
}

# Test if SCSI device $host $channen $id $lun exists
# Outputs description from /proc/scsi/scsi, returns new
testexist ()
{
  grepstr="scsi$host Channel: 0*$channel Id: 0*$id Lun: 0*$lun"
  new=`cat /proc/scsi/scsi | grep -e"$grepstr"`
  if test ! -z "$new"; then
    cat /proc/scsi/scsi | grep -e"$grepstr"
    cat /proc/scsi/scsi | grep -A2 -e"$grepstr" | tail -n2 | pr -o4 -l1
  fi
}

# Perform search (scan $host)
dosearch ()
{
  for channel in $channelsearch; do
    for id in $idsearch; do
      for lun in $lunsearch; do
        new=
        devnr="$host $channel $id $lun"
        echo "Scanning for device $devnr ..."
        printf "${yellow}OLD: $norm"
        testexist
        if test ! -z "$remove" -a ! -z "$new"; then
          # Device exists and we're in remove mode, so remove and readd
          echo "scsi remove-single-device $devnr" >/proc/scsi/scsi
          echo "scsi add-single-device $devnr" >/proc/scsi/scsi
          printf "\r\x1b[A\x1b[A\x1b[A${yellow}OLD: $norm"
          testexist
          if test -z "$new"; then
            printf "\r${red}DEL: $norm\r\n\n\n\n"; let rmvd+=1;
          fi
        fi
        if test -z "$new"; then
          # Device does not exist, try to add
          printf "\r${green}NEW: $norm"
          echo "scsi add-single-device $devnr" >/proc/scsi/scsi
          testexist
          if test -z "$new"; then
            # Device not present
            printf "\r\x1b[A";
            # Optimization: if lun==0, stop here (only if in non-remove mode)
            if test $lun = 0 -a -z "$remove" -a $optscan = 1; then
              break;
            fi
          else
            let found+=1;
          fi
        fi
      done
    done
  done
}

# main
if test @$1 = @--help -o @$1 = @-h -o @$1 = @-?; then
    echo "Usage: rescan-scsi-bus.sh [options] [host [host ...]]"
    echo "Options:"
    echo " -l activates scanning for LUNs 0-7    [default: 0]"
    echo " -w scan for target device IDs 0 .. 15 [default: 0-7]"
    echo " -c enables scanning of channels 0 1   [default: 0]"
    echo " -r enables removing of devices        [default: disabled]"
    echo "--remove:        same as -r"
    echo "--nooptscan:     don't stop looking for LUNs is 0 is not found"
    echo "--color:         use coloured prefixes OLD/NEW/DEL"
    echo "--hosts=LIST:    Scan only host(s) in LIST"
    echo "--channels=LIST: Scan only channel(s) in LIST"
    echo "--ids=LIST:      Scan only target ID(s) in LIST"
    echo "--luns=LIST:     Scan only lun(s) in LIST"
    echo " Host numbers may thus be specified either directly on cmd line (deprecated) or"
    echo " or with the --hosts=LIST parameter (recommended)."
    echo "LIST: A[-B][,C[-D]]... is a comma separated list of single values and ranges"
    echo " (No spaces allowed.)"
    exit 0
fi

expandlist ()
{
    list=$1
    result=""
    first=${list%%,*}
    rest=${list#*,}
    while test ! -z "$first"; do
        beg=${first%%-*};
        if test "$beg" = "$first"; then
            result="$result $beg";
        else
            end=${first#*-}
            result="$result `seq $beg $end`"
        fi
        test "$rest" = "$first" && rest=""
        first=${rest%%,*}
        rest=${rest#*,}
    done
    echo $result
}

if test ! -d /proc/scsi/; then
  echo "Error: SCSI subsystem not active"
  exit 1
fi

# defaults
unsetcolor
lunsearch="0"
idsearch=`seq 0 7`
channelsearch="0"
remove=""
optscan=1
if test -d /sys/class/scsi_host; then
  findhosts_26
else
  findhosts
fi

# Scan options
opt="$1"
while test ! -z "$opt" -a -z "${opt##-*}"; do
  opt=${opt#-}
  case "$opt" in
    l) lunsearch=`seq 0 7`;;
    w) idsearch=`seq 0 15`;;
    c) channelsearch="0 1";;
    r) remove=1;;
    -remove)      remove=1;;
    -hosts=*)     arg=${opt#-hosts=};   hosts=`expandlist $arg`;;
    -channels=*)  arg=${opt#-channels=};channelsearch=`expandlist $arg`;;
    -ids=*)   arg=${opt#-ids=};         idsearch=`expandlist $arg`;;
    -luns=*)  arg=${opt#-luns=};        lunsearch=`expandlist $arg`;;
    -color) setcolor;;
    -nooptscan) optscan=0;;
    *) echo "Unknown option -$opt !";;
  esac
  shift
  opt="$1"
done

# Hosts given ?
if test "@$1" != "@"; then
  hosts=$*;
fi

echo "Scanning hosts $hosts channels $channelsearch for "
echo " SCSI target IDs " $idsearch ", LUNs " $lunsearch
test -z "$remove" || echo " and remove devices that have disappeared"
declare -i found=0
declare -i rmvd=0
for host in $hosts; do
  dosearch;
done
echo "$found new device(s) found.               "
echo "$rmvd device(s) removed.                 "

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

echo '- - -' > /sys/class/scsi_host/${host_number}/scan
Попробую.
Но всё-таки, как определили, что он увеличился?
Очень просто, у внешних систем хранения данных есть интерфейс управления (RS232, Telnet, Web и.т.д) там видно что размер увеличился. Но, система сканирует размеры физических носителей только в момент загрузки и потом это значение не меняется. Вобщем так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если у Вас всё построено на LVM, то расширяться на ходу можно добавляя, например 2 новых винта в RAID1 и сказать рейд-контроллеру, чтобы представлял их одним логическим устройством, после этого выполняем команду из сообщения #8, затем создаём из нового устройства PV, добавляем PV в LG, расширяем LV за счёт нового пространства LG, а дальше уже в рамках LV расширяем конкретную точку монтирования или создаём новую

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Но всё-таки, как определили, что он увеличился?
Очень просто, у внешних систем хранения данных есть интерфейс управления (RS232, Telnet, Web и.т.д) там видно что размер увеличился. Но, система сканирует размеры физических носителей только в момент загрузки и потом это значение не меняется. Вобщем так.

Понял, спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

SokolovS, если удастся отпишите, а то тестового сервера сейчас у меня нет, а на боевом железе экспериментировать как-то не хорошо :)

да, есть ещё /usr/bin/rescan-scsi-bus.sh и /usr/bin/scsi-rescan в пакете sg3_utils, может это то самое

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

2f13: данный скрипт действительно идет в sg3-utils и нужен для того чтобы добавить или удалить SCSI устройство без перезагрузки, размер уже подключенного устройства при этом не изменяется, т.е. он просто сканирует шину.

Реальнг для рескана размера в режиме онлайн нужно выполнить команду echo 1 > /sys/block/sdX/device/rescan

Найдено тут: http://www.redhat.com/docs/en-US/Red_Hat_E...i-resizing.html

 

Это работает.

 

Если что, вот скрипт рескана размера для всех блочных устройств

#!/bin/sh

block_dir=/sys/block

echo "Rescan block device SIZE:"
for dir in `ls $block_dir`; do
    root_path=$block_dir/$dir
    dev_path=$block_dir/$dir/device
    rescan_fpath=$dev_path/rescan

    if [ -e $rescan_fpath ]; then
        rev=`cat $dev_path/rev`
        vendor=`cat $dev_path/vendor`
        model=`cat $dev_path/model`
        old_sectr=`cat $root_path/size`
        echo -n "Rescan size for '$vendor $model rev. $rev': "
        echo 1 >$rescan_fpath
        [ "$?" = "0" ] && echo -n "OK!" || echo -n "FAIL!!!"

        new_sectr=`cat $root_path/size`
        echo " (OLD sectors '$old_sectr', NEW sectors '$new_sectr')"
    fi
done

Изменено пользователем SokolovS

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть одна проблема, на большие устройства ругается таким сообщением:

kernel: sda : very big device. try to use READ CAPACITY(16).
kernel: SCSI device sda: 17578119168 512-byte hdwr sectors (8999997 MB)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Похоже это все таки не ошибка, просто т.к. размер больше 2Тб, используется READ CAPACITY(16). Подсчитывается правильный размер, но почему то fdisk -l в упор не видит этого нового размера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

fdisk не умеет работать с дисками большими, чем 2T. Используйте LVM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это все понятно, работать не умеет, но размер по fdisk -l покажет. Работаю с помощью parted.

В общем вопрос не решен, новый размер не записывается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

невозможно создать раздел более 2Т. Просто нет места в mbr для его размера.

[root@files ~]# fdisk -l

Диск /dev/sda: 320.0 ГБ, 320072933376 байт
255 heads, 63 sectors/track, 38913 cylinders
Единицы = цилиндры по 16065 * 512 = 8225280 байт

  Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sda1   *           1          13      104391   83  Linux
/dev/sda2              14       38913   312464250   8e  Linux LVM

Диск /dev/sdb: 3495.0 ГБ, 3495019151360 байт
255 heads, 63 sectors/track, 424911 cylinders
Единицы = цилиндры по 16065 * 512 = 8225280 байт

На диске /dev/sdb отсутствует верная таблица разделов

Диск /dev/sdc: 3495.0 ГБ, 3495019151360 байт
255 heads, 63 sectors/track, 424911 cylinders
Единицы = цилиндры по 16065 * 512 = 8225280 байт

На диске /dev/sdc отсутствует верная таблица разделов

Диск /dev/sdd: 3495.0 ГБ, 3495019151360 байт
255 heads, 63 sectors/track, 424911 cylinders
Единицы = цилиндры по 16065 * 512 = 8225280 байт

На диске /dev/sdd отсутствует верная таблица разделов
[root@files ~]# pvs
  PV         VG         Fmt  Attr PSize   PFree
  /dev/sda2  VolGroup00 lvm2 a-   297,97G    0
  /dev/sdb   files0     lvm2 a-     3,18T    0
  /dev/sdc   files1     lvm2 a-     3,18T    0
  /dev/sdd   files2     lvm2 a-     3,18T    0
[root@files ~]#

 

Вот только что parted, что fdisk при попытке на том самом sdb создать раздел на весь том создавали раздел на 250Г.....

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

На больших дисках parted'ом надо создавать таблицу разделов не MBR, а GPT. Но загрузится с такой штуки скорее всего не выйдет, поэтому делают маленькое блочное устройство для /boot или системы, а остальное - на GPT.

 

Использование блочного устройства целиком без MBR/GPT может быть чревато - можно ненароком ошибиться и что-нибудь затереть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

На больших дисках parted'ом надо создавать таблицу разделов не MBR, а GPT. Но загрузится с такой штуки скорее всего не выйдет, поэтому делают маленькое блочное устройство для /boot или системы, а остальное - на GPT.

 

Использование блочного устройства целиком без MBR/GPT может быть чревато - можно ненароком ошибиться и что-нибудь затереть.

Абсолютно плюсуюсь. Насчёт перечитывания системой изменившегося физического объёма (подцепили вторую корзину на 10TiB, итого стало 20TiB) - мне так и не удалось, пришлось перезагрузать. Пытался сделать и hdparm -w, hdparm -w (опасно!), partprobe, и долго мучал Dell'овскую утилиту MegaCLI64. После перезагрузки - без проблем, система увидела новый объём.

 

Да, и ещё - мой parted не смог ни resize ни move (собирал самый новый - пофиг), поэтому пришлось тупо запомнить начало расширяемой паритиции, потом удалить её, а потом создать заново с тем же началом и другим концом. После монтирования (именно так) выполнил xfs_growfs - вуаля, всё ок. За что люблю xfs - никогда проблем с ним не было ни на больших нагруженных серверах, ни на десктопах, и даже на нетбуке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да, и ещё - мой parted не смог ни resize ни move (собирал самый новый - пофиг), поэтому пришлось тупо запомнить начало расширяемой паритиции, потом удалить её, а потом создать заново с тем же началом и другим концом. После монтирования (именно так) выполнил xfs_growfs - вуаля, всё ок. За что люблю xfs - никогда проблем с ним не было ни на больших нагруженных серверах, ни на десктопах, и даже на нетбуке.

Поступаю точно так же. Запоминаю границы, удаляю, создаю заново с новым концом. Потом mount -o remount,resize (у меня jfs). parted действительно может ресйзить только ext3.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.