1. 程式人生 > >實戰:CentOS不重啟,線上新增硬碟

實戰:CentOS不重啟,線上新增硬碟

轉載自:http://blog.51cto.com/skypegnu1/1429375

大綱

1、通過VMware Workstation為虛擬機器新增硬碟

2、強制Linux掃描SCSI裝置

 

系統版本

 

OS    
CentOS 6.4_64 (VMware虛擬機器)    

 

一、前言

    作為系統管理員,可能有需求在現有的基礎上,新增磁碟以提供更大的儲存空間。我們知道 SATA介面以及SAS,SCSI 都是支援熱插拔的特性。下面簡單介紹一個方法,實現不重新啟動Linux,新增磁碟。

    我們通過 VMware 虛擬機器來演示整個過程。

 

二、為VMware主機新增一塊磁碟

1、線上為CentOS新增磁碟,首先點選 VM > Settings

wKioL1bSPLCCPVMKAACDYyxkpdo078.png

2、在彈出的Virtual Machine Settings視窗中,選擇下方的 "Add" 按鈕。

wKiom1bSPLqyZUaCAAEK6hRIf6k968.png

3、然後進入"Add Hardware Wizard"新增硬體嚮導,  選擇 "Hard Disk", 然後 "Next"

wKioL1OlYICRoPd6AAEh_OS5Vyw501.jpg

4、接下來選擇“Disk Type”,我們選擇 SCSI(Small Computer System Interface),即小型計算機系統介面 , 不能選擇IDE,VMware也非常友好的提示"Cannot be added while the VM is powerd on"。為什麼呢? 因為IDE介面的硬碟是不支援熱插拔的裝置,所以我們必須選擇SCSI或者SATA型別的介面,支援熱插拔

的型別才行。

wKiom1bSPWqizE91AACVs8s7VrA488.png

5、下一步,我們直接選擇"Create a new virtual disk",建立一個新的虛擬磁碟,如果你想新增已經存在的虛擬磁碟,請選擇第2項,這裡不建議選擇第3項"Use a physical disk"

wKiom1OlYrTzzAIhAAES-_iaTK0189.jpg

6、選擇磁碟大小,根據自己的需要合理指定大小即可。

  • Allocate all disk space now. 選擇它,那麼會立刻在我們物理磁碟上申請並分配我們指定的大小空間,可以提高虛擬機器的效能,但是會佔用更多的空間。相反,如果不勾選它,預設情況下,消耗的空間根據實際虛擬機器中佔用的磁碟空間大小動態分配。

  • Store virtual disk as a single file. 把虛擬磁碟儲存為單個檔案,如果宿主機檔案系統是NTFS,那麼建議選擇它。

  • Split virtual disk into multiple files. 把虛擬磁碟切割為多塊儲存在多個檔案中,這樣可以更容易移動到其他計算機上,但是可能降低效能。其實我認為最主要的原因是某些檔案系統,如FAT的單個檔案最大限制為4G,所以切分為多個檔案進行儲存,可以避免單個檔案過大而無法儲存的問題。

wKiom1bSPhGRVwi8AACkOPIhOBo327.png

7、然後點選"Finish", 即新增成功。

 

 

三、重新檢測 SATA/SCSI bus

通常,磁碟新增完成後,需要重啟一下計算機,核心會自動檢測到這個新的裝置。我們可以使用

<span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:slategray"># ls /dev/sd*</span></code></span></span>

來檢視,一般是以/dev/sd[a-z]命名的裝置檔案。

但是,在生產環境中,是不允許我們隨意重啟伺服器的,我們會盡可能的選擇不重啟系統的方式來解決,現在我們就來探討一種不重啟而讓核心檢測到SCSI磁碟的方法。

<span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:slategray">## A rescan can be issued by typing the followingcommand:</span>
<span style="color:#999999">[</span>[email protected] ~<span style="color:#999999">]</span><span style="color:slategray"># echo "- - -" > /sys/class/scsi_host/host#/scan     </span>

<span style="color:slategray">## Replace host#</span>
Replace host<span style="color:slategray"># with actual value such as host0. You can find scsi_host value using the following command:</span>
<span style="color:#999999">[</span>[email protected] ~<span style="color:#999999">]</span><span style="color:slategray"># ls /sys/class/scsi_host</span>
Output: host0 

Now <span style="color:#dd4a68">type</span> the following to send a rescan request:
<span style="color:slategray"># echo "- - -" > /sys/class/scsi_host/host0/scan</span>
<span style="color:slategray"># fdisk -l</span>
<span style="color:slategray"># tail -f /var/log/message</span></code></span></span>

 

以root使用者執行下面的命令,強制核心再次檢測PCI裝置:

<span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>[email protected] ~<span style="color:#999999">]</span><span style="color:slategray"># ls /dev/sd*</span>
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3

<span style="color:#999999">[</span>[email protected] ~<span style="color:#999999">]</span><span style="color:slategray"># echo '- - -' > /sys/class/scsi_host/host0/scan</span>

<span style="color:#999999">[</span>[email protected] ~<span style="color:#999999">]</span><span style="color:slategray"># ls /dev/sd*</span>
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3  /dev/sdb

<span style="color:#999999">[</span>[email protected] ~<span style="color:#999999">]</span><span style="color:slategray"># fdisk -l</span>
<span style="color:#999999">[</span>[email protected] ~<span style="color:#999999">]</span><span style="color:slategray"># tail -f /var/log/message</span></code></span></span>

最關鍵的是這一行命令:

wKioL1OlfjaB9RYoAAAsZ9ClOL4483.jpg

注意:三個"- - -"號之間有空格。執行完這條命令後,檢視系統日誌/var/log/messages,發現對SCSI裝置進行了一次重新掃描。

OK,至此我們已經順利新增了一塊磁碟,那麼接下來可以進行fdisk分割槽,mkfs格式化等操作了。

 

四、第二種方式: 新增單個裝置

How Do I Delete a Single Device Called /dev/sdc?

In addition to re-scanning the entire bus, a specific device can be added or existing device deleted using the following command:

<span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:slategray"># echo 1 > /sys/block/devName/device/delete    # devName</span>
<span style="color:slategray"># echo 1 > /sys/block/sdc/device/delete        # sdc</span></code></span></span>

 

How Do I Add a Single Device Called /dev/sdc?

To add a single device explicitly, use the following syntax:

<span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:slategray"># echo "scsi add-single-device <H> <B> <T> <L>" > /proc/scsi/scsi</span>
Where,
<span style="color:#9a6e3a"><</span>H<span style="color:#9a6e3a">></span> <span style="color:#0077aa">:</span> Host
<span style="color:#9a6e3a"><</span>B<span style="color:#9a6e3a">></span> <span style="color:#0077aa">:</span> Bus <span style="color:#999999">(</span>Channel<span style="color:#999999">)</span>
<span style="color:#9a6e3a"><</span>T<span style="color:#9a6e3a">></span> <span style="color:#0077aa">:</span> Target <span style="color:#999999">(</span>Id<span style="color:#999999">)</span>
<span style="color:#9a6e3a"><</span>L<span style="color:#9a6e3a">></span> <span style="color:#0077aa">:</span> LUN numbers<span style="color:#999999">(</span>LUN<span style="color:#999999">)</span></code></span></span>

For e.g. add /dev/sdc with host # 0, bus # 0, target # 2, and LUN # 0, enter:

<span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:slategray"># echo "scsi add-single-device 0 0 2 0">/proc/scsi/scsi</span>
<span style="color:slategray"># fdisk -l</span>
<span style="color:slategray"># cat /proc/scsi/scsi</span></code></span></span>

1、如何確定 <H>、<B>、<T>、<L> 這幾個資訊呢?

檢查 /proc/scsi/scsi 檔案, 確定新磁碟的 Id

<span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>[email protected] ~<span style="color:#999999">]</span><span style="color:slategray"># cat /proc/scsi/scsi </span>
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: VMware,  Model: VMware Virtual S Rev: 1.0 
  Type:   Direct-Access                    ANSI  SCSI revision: 02
Host: scsi2 Channel: 00 Id: 00 Lun: 00
  Vendor: NECVMWar Model: VMware IDE CDR10 Rev: 1.00
  Type:   CD-ROM                           ANSI  SCSI revision: 05</code></span></span>

可以看到, 最大的 【Id】號為:00 , 那麼新增的磁碟 Id 就為 1

2、使用 fdisk -l 命令列出當前系統的磁碟資訊

<span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>[email protected] ~<span style="color:#999999">]</span><span style="color:slategray"># fdisk -l</span>

Disk /dev/sda: 16.1 GB, 16106127360 bytes
255 heads, 63 sectors/track, 1958 cylinders
Units <span style="color:#9a6e3a">=</span> cylinders of 16065 * 512 <span style="color:#9a6e3a">=</span> 8225280 bytes
Sector size <span style="color:#999999">(</span>logical/physical<span style="color:#999999">)</span>: 512 bytes / 512 bytes
I/O size <span style="color:#999999">(</span>minimum/optimal<span style="color:#999999">)</span>: 512 bytes / 512 bytes
Disk identifier: 0x000d691c

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26         157     1048576   82  Linux swap / Solaris
Partition 2 does not end on cylinder boundary.
/dev/sda3             157        1959    14474240   83  Linux</code></span></span>

3、執行命令, re-scan  SCSI 匯流排

<span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>[email protected] ~<span style="color:#999999">]</span><span style="color:slategray"># echo "scsi add-single-device 0 0 1 0" > /proc/scsi/scsi</span></code></span></span>

4、再次使用 fdisk -l 命令列出當前系統的磁碟資訊

<span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>[email protected] ~<span style="color:#999999">]</span><span style="color:slategray"># fdisk -l</span>

Disk /dev/sda: 16.1 GB, 16106127360 bytes
255 heads, 63 sectors/track, 1958 cylinders
Units <span style="color:#9a6e3a">=</span> cylinders of 16065 * 512 <span style="color:#9a6e3a">=</span> 8225280 bytes
Sector size <span style="color:#999999">(</span>logical/physical<span style="color:#999999">)</span>: 512 bytes / 512 bytes
I/O size <span style="color:#999999">(</span>minimum/optimal<span style="color:#999999">)</span>: 512 bytes / 512 bytes
Disk identifier: 0x000d691c

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26         157     1048576   82  Linux swap / Solaris
Partition 2 does not end on cylinder boundary.
/dev/sda3             157        1959    14474240   83  Linux

Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units <span style="color:#9a6e3a">=</span> cylinders of 16065 * 512 <span style="color:#9a6e3a">=</span> 8225280 bytes
Sector size <span style="color:#999999">(</span>logical/physical<span style="color:#999999">)</span>: 512 bytes / 512 bytes
I/O size <span style="color:#999999">(</span>minimum/optimal<span style="color:#999999">)</span>: 512 bytes / 512 bytes
Disk identifier: 0x00000000</code></span></span>

好了,我們可以看到系統已經識別到了新增裝置, /dev/sdb。接下來我們就可以使用它了,建立分割槽和格式化。

 

 

五、建立分割槽、格式化、掛載

一、建立分割槽

<span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>[email protected] ~<span style="color:#999999">]</span><span style="color:slategray"># fdisk /dev/sdb</span>
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x2445d233.
Changes will remain <span style="color:#0077aa">in</span> memory only, <span style="color:#0077aa">until</span> you decide to <span style="color:#dd4a68">write</span> them.
After that, of course, the previous content won<span style="color:#669900">'t be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It'</span>s strongly recommended to
         switch off the mode <span style="color:#999999">(</span>command <span style="color:#669900">'c'</span><span style="color:#999999">)</span> and change display <span style="color:#dd4a68">units</span> to
         sectors <span style="color:#999999">(</span>command <span style="color:#669900">'u'</span><span style="color:#999999">)</span>.

Command <span style="color:#999999">(</span>m <span style="color:#0077aa">for</span> help<span style="color:#999999">)</span>: n                        <span style="color:slategray">## 建立新分割槽</span>
Command action
   e   extended
   p   primary partition <span style="color:#999999">(</span>1-4<span style="color:#999999">)</span>
p                                              <span style="color:slategray">## 主分割槽</span>
Partition number <span style="color:#999999">(</span>1-4<span style="color:#999999">)</span>: 1                      <span style="color:slategray">## 主分割槽編號</span>
First cylinder <span style="color:#999999">(</span>1-1305, default 1<span style="color:#999999">)</span>: 
Using default value 1
Last cylinder, +cylinders or +size<span style="color:#999999">{</span>K,M,G<span style="color:#999999">}</span> <span style="color:#999999">(</span>1-1305, default 1305<span style="color:#999999">)</span>: +5G     <span style="color:slategray">## 主分割槽大小</span>

Command <span style="color:#999999">(</span>m <span style="color:#0077aa">for</span> help<span style="color:#999999">)</span>: p

Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units <span style="color:#9a6e3a">=</span> cylinders of 16065 * 512 <span style="color:#9a6e3a">=</span> 8225280 bytes
Sector size <span style="color:#999999">(</span>logical/physical<span style="color:#999999">)</span>: 512 bytes / 512 bytes
I/O size <span style="color:#999999">(</span>minimum/optimal<span style="color:#999999">)</span>: 512 bytes / 512 bytes
Disk identifier: 0x2445d233

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         654     5253223+  83  Linux

Command <span style="color:#999999">(</span>m <span style="color:#0077aa">for</span> help<span style="color:#999999">)</span>: w                         <span style="color:slategray">## 儲存</span></code></span></span>

    在寫入分割槽表後,可能會導致 kernel 無法重新獲取新分割槽表資訊,此時可以直接通過 reboot 來處理。 當然,我們可不能隨隨便便的 reboot, 我們可以使用 partprobe 命令來強制 kernel 讀取新的分割槽表資訊。

    partprobe 命令是包含在 parted 包中的, 如果系統提示: command not found。 我們安裝 parted 即可。

<span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:slategray">## install parted</span>
<span style="color:#999999">[</span>[email protected] ~<span style="color:#999999">]</span><span style="color:slategray"># yum -y install parted</span>

<span style="color:slategray">## reload partition table</span>
<span style="color:#999999">[</span>[email protected] ~<span style="color:#999999">]</span><span style="color:slategray"># partprobe</span></code></span></span>

 

二、格式化

<span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>[email protected] ~<span style="color:#999999">]</span><span style="color:slategray"># fdisk -l</span>

Disk /dev/sda: 16.1 GB, 16106127360 bytes
255 heads, 63 sectors/track, 1958 cylinders
Units <span style="color:#9a6e3a">=</span> cylinders of 16065 * 512 <span style="color:#9a6e3a">=</span> 8225280 bytes
Sector size <span style="color:#999999">(</span>logical/physical<span style="color:#999999">)</span>: 512 bytes / 512 bytes
I/O size <span style="color:#999999">(</span>minimum/optimal<span style="color:#999999">)</span>: 512 bytes / 512 bytes
Disk identifier: 0x000d691c

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26         157     1048576   82  Linux swap / Solaris
Partition 2 does not end on cylinder boundary.
/dev/sda3             157        1959    14474240   83  Linux

Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units <span style="color:#9a6e3a">=</span> cylinders of 16065 * 512 <span style="color:#9a6e3a">=</span> 8225280 bytes
Sector size <span style="color:#999999">(</span>logical/physical<span style="color:#999999">)</span>: 512 bytes / 512 bytes
I/O size <span style="color:#999999">(</span>minimum/optimal<span style="color:#999999">)</span>: 512 bytes / 512 bytes
Disk identifier: 0x2445d233

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         654     5253223+  83  Linux

<span style="color:slategray">## 我們可以清晰的看到  /dev/sdb1 , 格式化</span>
<span style="color:#999999">[</span>[email protected] ~<span style="color:#999999">]</span><span style="color:slategray"># mkfs.ext4 /dev/sdb1</span></code></span></span>

三、建立掛載點並更新 /etc/fstab

<span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:slategray">## Create a Mount Point</span>
<span style="color:#999999">[</span>[email protected] ~<span style="color:#999999">]</span><span style="color:slategray"># mkdir /data</span>

<span style="color:slategray">## Mount  /dev/sdb1 to /data</span>
<span style="color:#999999">[</span>[email protected] ~<span style="color:#999999">]</span><span style="color:slategray"># mount /dev/sdb1 /data</span>

<span style="color:slategray">## Update /etc/fstab</span>
<span style="color:slategray"># vi /etc/fstab</span>

Append as follows:
/dev/sdb1       /data      ext4     defaults    1  2

Optional Task: Label the partition 
You can label the partition using e2label. For example, <span style="color:#0077aa">if</span> you want to label the new partition /backupDisk, enter
<span style="color:slategray"># e2label /dev/sdb1 /backupDisk</span></code></span></span>

 

系統掛載的一些限制:

  • 根目錄 / 是必須掛載的,而且一定要先於其他 mount point 被掛載

  • 其他 mount point 必須為已建立的目錄

  • 所有 mount point 在同一時間之內,只能掛載一次

  • 所有 partition 在同一時間之內,只能掛載一次

  • 如若進行解除安裝(umount), 必須先將工作目錄切換到 mount point(及其子目錄)之外

 

    Linux環境中每個Block Device都有一個全域性唯一的UUID,可以標識這個裝置,我們可以在fstab中使用UUID替換裝置名稱(/dev/sd#)的方式。

<span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>[email protected] ~<span style="color:#999999">]</span><span style="color:slategray"># cat /etc/fstab </span>

<span style="color:slategray">#</span>
<span style="color:slategray"># /etc/fstab</span>
<span style="color:slategray"># Created by anaconda on Sun Jul 26 23:00:18 2015</span>
<span style="color:slategray">#</span>
<span style="color:slategray"># Accessible filesystems, by reference, are maintained under '/dev/disk'</span>
<span style="color:slategray"># See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info</span>
<span style="color:slategray">#</span>
UUID<span style="color:#9a6e3a">=</span>d1fde868-a435-4c70-b4a6-1ab336eab4ea /                       ext4    defaults        1 1
UUID<span style="color:#9a6e3a">=</span>848acf4f-4e8a-4a5a-a834-97335d66514a /boot                   ext4    defaults        1 2
UUID<span style="color:#9a6e3a">=</span>ac49dbf5-a20e-42c1-b915-a1632378dd6b swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid<span style="color:#9a6e3a">=</span>5,mode<span style="color:#9a6e3a">=</span>620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/sdb1		/data			ext4	defaults	1 2</code></span></span>

    我們可以看到, 利用 UUID 也是可以進行掛載的。那麼如何檢視 Block Device 的UUID呢? 塊裝置(block device)

1、首先使用lsblk命令可以清晰的獲取全域性的塊裝置佈局。

<span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>[email protected] ~<span style="color:#999999">]</span><span style="color:slategray"># lsblk</span>
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1 1024M  0 rom  
sda      8:0    0   15G  0 disk 
├─sda1   8:1    0  200M  0 part /boot
├─sda2   8:2    0    1G  0 part <span style="color:#999999">[</span>SWAP<span style="color:#999999">]</span>
└─sda3   8:3    0 13.8G  0 part /
sdb      8:16   0   10G  0 disk 
└─sdb1   8:17   0    5G  0 part /data</code></span></span>

2、使用blkid命令可以獲取裝置的UUID。或者  ls -l  /dev/disk/by-uuid

<span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>[email protected] ~<span style="color:#999999">]</span><span style="color:slategray"># blkid</span>
/dev/sda1: UUID<span style="color:#9a6e3a">=</span><span style="color:#669900">"848acf4f-4e8a-4a5a-a834-97335d66514a"</span> TYPE<span style="color:#9a6e3a">=</span><span style="color:#669900">"ext4"</span> 
/dev/sda2: UUID<span style="color:#9a6e3a">=</span><span style="color:#669900">"ac49dbf5-a20e-42c1-b915-a1632378dd6b"</span> TYPE<span style="color:#9a6e3a">=</span><span style="color:#669900">"swap"</span> 
/dev/sda3: UUID<span style="color:#9a6e3a">=</span><span style="color:#669900">"d1fde868-a435-4c70-b4a6-1ab336eab4ea"</span> TYPE<span style="color:#9a6e3a">=</span><span style="color:#669900">"ext4"</span> 
/dev/sdb1: UUID<span style="color:#9a6e3a">=</span><span style="color:#669900">"a02ef65b-2174-451f-800f-c4335cba5e61"</span> TYPE<span style="color:#9a6e3a">=</span><span style="color:#669900">"ext4"</span></code></span></span>

3、然後就可以複製UUID, 進行掛載操作了