对未来焦虑 發表於 2023-5-22 00:00:00

动态在线扩容root根分区大小的方法详解

<p>
        <span><strong>前言</strong></span></p>
<p>
        本文主要介绍了关于动态在线扩容root根分区大小的相关内容,分享出来供大家参考学习,下面话不都说了,来一起看看详细的介绍吧。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_840753">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">qemu-img resize yourname.img +10G</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        首先要用命令增加分区大小,针对qemu-kvm使用以上命令</p>
<p>
        <span><strong>LVM</strong></span></p>
<p>
        情境描述:虚拟机用的磁盘 image 已经扩容,或对应于物理机的话,就是磁盘的容量已经增加了。 然后我们希望把扩大的容量用起来,而且不影响现有的文件系统(不格盘)。</p>
<p>
        实际使用过程中,我们有时候需要对虚拟机镜像的硬盘扩容,比如,一开始我们创建虚拟机的时候,以为 20G 的磁盘空间就够了,可某一次我们可能一次性就要拷贝一个 10G+ 的文件进虚拟机,这时候我们就傻了。</p>
<p>
        我们通过 VMware 或者 VirtualBox 的图形界面或者一些命令,我们可以很轻松地扩大虚拟机的磁盘大小,但是,磁盘变大后,系统并不会把它们利用起来。所以这时候,我们就要考虑怎么才能让这些多出来的空间能够被虚拟机里的 Linux 系统用起来。</p>
<p>
        在此之前,先补充一个“磁盘 MBR”的知识:</p>
<blockquote>
        <p>
                1个硬盘分为两个区域,一个是 MBR(主引导分区),一个是数据区域。</p>
        <p>
                MBR 里记录了两个重要信息:引导程序与磁盘分区表。</p>
        <p>
                分区表定义了“第 n 个磁盘块是从第 x 个柱面到第 y 个柱面”,所以,系统每次都取 n 号磁盘块时,就只会读取第 x 到第 y 个扇区之间数据。</p>
        <p>
                由于 MBR 容量有限,设计的时候,只设计成4个分区记录。用起来,可以作4个主分区,或者3个主分区和一个扩展分区。</p>
        <p>
                如果超过四个分区,系统允许在额外的硬盘空间放另一份磁盘分区信息,那就是扩展分区,当硬盘被分出一个扩展分区的时候,实际上扩展分区在 MBR 磁盘分区表中的信息为另外那份分区表的位置。所以,在 扩展分区 里面还要划分 逻辑分区 才能使用。</p>
        <p>
                每个硬盘最多只允许4个主分区,其他的分区只能放在扩展分区中。</p>
</blockquote>
<p>
        这样就明白了,因为主分区的个数有限,而且我们希望增加的容量也只是作为存储使用,所以加在拓展分区 (extended) 就可以了。(而如果你是土豪,总共4个主分区,你还打算这次再用一个主分区的名额,那你可以跳过 Part1,直接看下面的 Part2 了。)</p>
<p>
        <span><strong>PART1</strong></span></p>
<p>
        我们要把增加的容量加在拓展分区(extended)里。要对 extended 分区进行扩容,这个 fdisk 就做不了,需要用 parted 命令(如果系统不自带 parted,那就从源上装一个):</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_203470">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">parted </code><code class="bash plain">/dev/xxx</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        进入交互模式,用 help 查看帮助命令。</p>
<p>
        一些值得特别说明的命令:</p>
<ul>
<li>
                print 查看分区表。留意要操作的分区 ‘Number' 这一项,后面操作要用到。</li>
        <li>
                unit 改变 parted 所用的描述大小的默认单位(比如设为 ‘compact' 就是以 ‘MB' 为单位)。<br>
                值得注意的是,如果用 MB/GB 这样的单位,磁盘 sector 的选取会有误差的。parted 会为你选最近的 sector,但未必精确。比如 unit 为 MB,那么可能产生 +-500KB 的误差;如果是 GB,那就可能 +-500MB 的误差,这就无法容忍了。所以如果是'创建分区'这样的操作,建议用 ‘MiB' 这样的单位,而不是 ‘MB'。'MiB' 会是一个精确值,parted 不会像对待 ‘MB' 那样去找它最近的单元。</li>
        <li>
                resize &lt;minor&gt; &lt;start&gt; &lt;end&gt; 对指定 minor 号(或 Number 号)的分区从 start 位置到 end 位置 这里 start/end 可以是 xxxMB,也可以是负值,表示从磁盘末尾往前多少的位置,比如 -0 就是指到磁盘的末尾。</li>
</ul>
<p>
        更多命令详情请参考: http://www.gnu.org/software/parted/manual/html_chapter/parted_toc.html</p>
<p>
        <strong>实战:</strong></p>
<p>
        操作前,print 结果如下。现有磁盘62.3G,只分给 extended 8G,还有50多G根本没分配。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_302744">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">Number Start End  Size Type  File system Flags</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">1  1049kB 256MB 255MB primary ext2   boot</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash plain">2  257MB 8589MB 8332MB extended</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash plain">5  257MB 8589MB 8332MB logical    lvm</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        我希望把这50多G全部用于扩大extended。</p>
<p>
        用命令:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_250110">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">resize 2 257MB -0</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        其实,只需输入 resize 2 ,回车,剩下的两个参数,parted 会通过交互的方式让你填写的。-0 表示到那个分区的磁盘末尾。</p>
<p>
        现在再 print 看一下,</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_235432">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">Number Start End  Size Type  File system Flags</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">1  1049kB 256MB 255MB primary ext2   boot</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash plain">2  257MB 62.3GB 62.0GB extended</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash plain">5  257MB 8589MB 8332MB logical    lvm</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        extended 区已经扩大成功了。</p>
<p>
        extended 区只是相当于“一块物理硬盘”,想把增加出来的空间用上,还要把 Number 为 5 的 lv 扩大。</p>
<p>
        而 logic volumn 的扩大依赖于它所在的 volumn group 的大小。因为 logic volumn 是从 volumn group 里分出来的,如果 volumn group 不变大,那么 logic volumn 是无法超过 volumn group 的。所以 真正是应该把空间加到 volumn group 上去 。</p>
<p>
        <span><strong>PART2</strong></span></p>
<p>
        要增加 volumn group 的大小,先用 fdisk 在 extended 上,利用刚才增加但还未分配出去的磁盘空间创建出一个新分区。通过 <code>fdisk &lt;disk_dev_name&gt;</code> 进入交互模式,可以通过命令 m 查看帮助。首先,输入 n 创建新分区,然后选择 l 设置新分区为逻辑分区,接下来依次设置分区的起始、终止位置(默认即完全利用这块磁盘上剩余的所有空间,所以默认即可)。创建出的分区,编号为 6。可以用命令 p 看一下。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_119807">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">Device Boot  Start   End  Blocks Id System</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">/dev/vda1</code> <code class="bash plain">*  2048  499711  248832 83 Linux</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash plain">/dev/vda2</code>   <code class="bash plain">501758 121634815 60566529 5 Extended</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash plain">/dev/vda5</code>   <code class="bash plain">501760 16775167  8136704 8e Linux LVM</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="bash plain">/dev/vda6</code>  <code class="bash plain">16777216 121634815 52428800 83 Linux</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        接下来,由于我们要用 LVM 来管理这个新分区,我们需要把新分区的管理系统从 Linux 改为 Linux LVM。在交互模式下,输入命令 t,然后选择刚才创建的 6,输入 8e (Linux LVM 的代号)。最后,我们要把刚才的这些操作真正写入硬盘,输入命令 w。</p>
<p>
        至此,我们通过<code> fdisk -l</code> 已经可以看到 /dev/vda6 被创建出来了。</p>
<p>
        再执行</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_162489">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">vgextend &lt;your_vg_name&gt; </code><code class="bash plain">/dev/vda6</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        把新分区加进 volumn group (VG Name 可通过 vgdisplay 查到)。</p>
<p>
        现在用 vgs 查看 volumn group 的状态,发现 volumn group 已经变大。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_802356">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">VG   </code><code class="bash comments">#PV #LV #SN Attr VSize VFree</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">jiang51-vg 2 2 0 wz--n- 57.75g 50.03g</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        然后把这个 volumn group 里面的 logic volumn 变大。</p>
<p>
        命令(最后那个'Logic Volumn name'可通过 lvdisplay 查到):</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_603518">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">lvresize -l +100%FREE &lt;Logic Volumn name&gt;</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<blockquote>
        <p>
                警告: 如果操作时出现下面这样的 warning,就说明现在 logic volumn 的总大小还不对,resize 不但不增加空间,反而在缩小空间,如果继续操作下去,必将丢失数据。应立即停止!按 n 取消。</p>
</blockquote>
<blockquote>
        <p>
                WARNING: Reducing active and open logical volume to 32.00 MiB<br>
                  THIS MAY DESTROY YOUR DATA (filesystem etc.)<br>
                Do you really want to reduce root? </p>
</blockquote>
<p>
        最后,要更新 logic volumn 上的文件系统,不然从 df 看出文件系统是不知道 logic volumn 变大的。</p>
<p>
        用命令(其中的 file_system_name 通过 df 找到):</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_875714">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">resize2fs -p &lt;file_system_name&gt;</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        这样,磁盘 extended 分区的扩容终于完成了。</p>
<p>
        <span><strong>非LVM</strong></span></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_572664">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash functions">fdisk</code> <code class="bash plain">/dev/sda</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">d</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash plain">n</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash plain">p</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="bash plain">1</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                         </div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="bash plain">w</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="bash plain">resize2fs </code><code class="bash plain">/dev/sda1</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                         </div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="bash functions">df</code> <code class="bash plain">-h</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        最重要的一步:“删除现在的分区,重新分区” 按d删除现在的分区1,注意:删除后千万不要按w保存!直接按n创建新的分区,然后从原有的柱面开始,一直分到最后的尺寸(默认值两次回车即可,如果之前的分区不是从第一柱面开始,则需要记录之前分区的起始柱面),新的分区操作完毕后,按w保存。</p>
<p>
        <span><strong>总结</strong></span></p>
<p>
        以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。</p>
<p>
        原文链接:http://luqitao.github.io/2015/12/08/Resize-Image-Rootpartition/</p>
頁: [1]
查看完整版本: 动态在线扩容root根分区大小的方法详解