zzz's profileMagic 's Forest , ...PhotosBlogListsMore Tools Help

Blog


    November 06

    MySQL主从服务器+读写分离

    花了三天时间,把MySQL的主从数据库+读写分离部署好了。感觉对缓解大数据流量的服务器压力还是很有效果的。

    最近大把时间都花在了数据库上,幸好之前有自己研究过一段时间的数据库,貌似还是上大学的时候。。现在竟然还能回忆起来些

    数据库确实是个值得花费精力的地方,很有用。

     

     

    一、搭Mysql主、从服务器

                       安装Mysql不是很复杂。主从主要是备份、后续读写分布事务处理等用途

     

         useradd mysql –s /sbin/nologin                              #生成一个mysql的用户

         tar zxvf mysql-5.0.22.tar.gz

         cd mysql-5.0.22

         ./configure --prefix=/usr/local/mysql --localstatedir=/opt/data && make && make install

         cp support-files/my-large.cnf /etc/my.cnf               #配置文档
                                                                               #/etc/my.cnf 作为全局设置
                                                                                # mysql-data-dir/my.cnf 作为服务器指定设置                                                                                                                                          # ~/.my.cnf 作为用户设置

         cd /usr/local/mysql

         /usr/local/mysql/bin/mysql_install_db --user=mysql

         chown -R mysql:mysql /opt/data

         chown -R mysql:mysql /usr/local/mysql

    从服务器修改/etc/my.cnf配置文档,server-id=10

         /usr/local/mysql/bin/mysqladmin –p shutdown            #停服务

         /usr/local/mysql/bin/mysqld_safe &                          #起服务,如果没有起来 多数是权限问题

         /usr/local/mysql/bin/mysqladmin –p password’111111’  #修改密码

         /usr/local/mysql/bin/mysql –p                                  #登陆,新安装应该没有密码

     

    主服务器上:

         mysql>grant all privileges on *.* to back@192.168.x.x identified by ‘111111’;

                                                                                   #新建一个给从服务器登陆的账号

         mysql> show master status;

    +------------------+----------+--------------+------------------+
    | File                    | Position    | Binlog_Do_DB | Binlog_Ignore_DB  |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000003 |   235       |                    |                          |
    +------------------+----------+--------------+------------------+

             记下file及position的值,做从服务器操作的时候需要。

     

       配置从服务器

         mysql> change master to master_host='192.168.x.x', master_user='back',
                   master_password='111111', master_log_file='mysql-bin.000003', master_log_pos=235;

         mysql> start slave;                                                 #启用slave

         mysql> show slave status\G                                     #显示当前slave状态

             Slave_IO_Running: Yes
             Slave_SQL_Running: Yes                                     #都为Yes,则为正常

     

    主数据库若有数据:

    mysql> FLUSH TABLES WITH READ LOCK;                #数据库锁表操作,不让数据再进行写入动作。

    mysql> show master status;                   

        把主服务器数据文件复制到从服务器,整个目录一起tar过去即可

     

        或者采用如下备份方法:

         mysqldump -u root -p testdb testtab>d:\testdb_testtab.sql

         恢复命令:

         create database testdb;use testdb;

         mysql>source d:\testdb_testtab.sql

     

    mysql> UNLOCK TABLES;                                     #取消主数据库锁定

     

        配置从服务器,保证主服务器的position位置和备份保持一致即可

     

     

      以上主从服务器操作关键在于 备份数据position对应 以及change master命令。

     

      #关于/mysql-data/master.info文档,看my.cnf配置文档中的说明

    #    Set the variables below. However, in case you choose this method, then
    #    start replication for the first time (even unsuccessfully, for example
    #    if you mistyped the password in master-password and the slave fails to
    #    connect), the slave will create a master.info file, and any later
    #    change in this file to the variables' values below will be ignored and
    #    overridden by the content of the master.info file, unless you shutdown
    #    the slave server, delete master.info and restart the slaver server.
    #    For that reason, you may want to leave the lines below untouched
    #    (commented) and instead use CHANGE MASTER TO (see above)

       也就是说还是推荐用change master to 命令来修改master.info文档。而不要用my.cnf的从服务器配置。
       在start slave前这个master.info一定要配置在一个正确的状态,除非他不存在。因为master.info为首选配置档

     

     

    测试:

        主服务器上

    mysql> create database testdb;
    mysql> create table testtb(id int(3),name char(10));
    mysql> insert into testtb values (001,’1’);
    mysql> use testdb;
    mysql> select * from testtb;

        从服务器上

    mysql> show databases;
    mysql> use testdb;
    mysql> show tables;
    mysql> select * from testtb;

        确认从服务器上有相同的记录即可。

     

     

    二、读写分离

        这部分主要有点是用来给服务器做均衡负载的,其实还是蛮有趣的一个功能。

        搭建Mysql-proxy服务可就没那么简单了,如果能够yum一下就全都搞定那就太开心了!

        无所谓这台代理服务搭在哪里,主、从或者第三方都OK,我推荐可以在从上面做,测试比较清楚

            下面基本就用我history里的命令了,省的一句一句打。

     

         安装 lua      

    628  wget http://www.lua.org/ftp/lua-5.1.4.tar.gz
    638  tar zxvf lua-5.1.4.tar.gz
    639  cd lua-5.1.4
    640  vi Makefile                                            #这里是修改  INSTALL_TOP= /usr/local/lua
    641  make linux
    643  make install

         安装 libevent              

    644  cd ..
    645  wget http://monkey.org/~provos/libevent-1.4.12-stable.tar.gz
    647  tar zxvf libevent-1.4.12-stable.tar.gz
    648  cd libevent-1.4.12-stable
    649  ./configure --prefix=/usr/local/libevent
    650  make
    651  make install

         安装check

    644  cd ..
    652  wget ftp://ftp.eenet.ee/pub/FreeBSD/distfiles/check-0.9.6.tar.gz
    655  tar zxvf check-0.9.6.tar.gz
    656  cd check-0.9.6
    657  ./configure
    658  make
    659  make install

         安装glib2

    681  cd ..
    682  wget http://ftp.gnome.org/pub/gnome/sources/glib/2.22/glib-2.22.1.tar.gz
    683  tar zxvf glib-2.22.1.tar.gz
    684  cd glib-2.22.1
    685  ./configure --prefix=/usr/local/glib2
    686  make
    687  make install

         安装mysql-proxy

    660  cd ..
    662  wget ftp://ftp.swin.edu.au/freebsd/ports/distfiles/mysql-proxy-0.7.1.tar.gz
    664  tar zxvf mysql-proxy-0.7.1.tar.gz
    665  cd mysql-proxy-0.7.1
    ./configure --prefix=/usr/local/mysql-proxy --with-mysql=/usr/local/mysql --with-lua

     

         结果提示glib2版本不对

    772  cp /usr/local/glib2/lib/pkgconfig/glib-2.0.pc /usr/lib/pkgconfig/

         然后提示lua不对,于是我下了一个lua.pc

    # vars from install Makefile

    # grep '^V=' ../Makefile
    V= 5.1
    # grep '^R=' ../Makefile
    R= 5.1.1

    # grep '^INSTALL_.*=' ../Makefile | sed 's/INSTALL_TOP/prefix/'
    prefix= /usr/local/lua
    INSTALL_BIN= ${prefix}/bin
    INSTALL_INC= ${prefix}/include
    INSTALL_LIB= ${prefix}/lib
    INSTALL_MAN= ${prefix}/man/man1
    INSTALL_LMOD= ${prefix}/share/lua/${V}
    INSTALL_CMOD= ${prefix}/lib/lua/${V}

    # canonical vars
    exec_prefix=${prefix}
    libdir=${exec_prefix}/lib
    includedir=${prefix}/include

    Name: Lua
    Description: An Extensible Extension Language
    Version: ${R}
    Requires:
    Libs: -L${libdir} -llua -lm
    Cflags: -I${includedir}

        接着提示libevent错误 研究了半天 直接把安装路径放到/usr/下面

    648  cd ~/libevent-1.4.12-stable
    853  ./configure --prefix=/usr/ && make && make install
    868  cd ..
    869  cd mysql-proxy-0.7.1
    856  ./configure --prefix=/usr/local/mysql-proxy/ --with-mysql=/usr/local/mysql/ --with-lua --with-libevent=/usr/

        这次总算./configure 通过了

            接着make,结果又出错~~提示找不到什么.h的文件
            到make里面去看,原来是编译的时候需要几个库文件,安装路径里面没有~
            这个做的真不好。。

    875  cp ../lua-5.1.4/src/lua*.h .
    876  cp ../lua-5.1.4/src/lauxlib.h .

        总算make && make install通过了

    892  /usr/local/mysql-proxy/sbin/mysql-proxy –V

        测试一把,又出错了。。。

    894  chcon -t texrel_shlib_t /usr/local/mysql-proxy/lib/libmysql-chassis.so.0

        原来是selinux作怪,改了。

    896  /usr/local/mysql-proxy/sbin/mysql-proxy –V

        总算OK了。

     

     

     

    接着来配服务。

          把 rw-splitting.lua 放到/usr/local/mysql-proxy/share/mysql-proxy/下面

     

    rw-splitting.lua:

    --[[ $%BEGINLICENSE%$
    Copyright (C) 2007-2008 MySQL AB, 2008 Sun Microsystems, Inc

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; version 2 of the License.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

    $%ENDLICENSE%$ --]]

    ---
    -- a flexible statement based load balancer with connection pooling
    --
    -- * build a connection pool of min_idle_connections for each backend and maintain
    --   its size
    -- *
    --
    --

    local commands    = require("proxy.commands")
    local tokenizer   = require("proxy.tokenizer")
    local lb          = require("proxy.balance")
    local auto_config = require("proxy.auto-config")

    --- config
    --
    -- connection pool
    if not proxy.global.config.rwsplit then
        proxy.global.config.rwsplit = {
            min_idle_connections = 1,
            max_idle_connections = 1,

            is_debug = false
        }
    end

    ---
    -- read/write splitting sends all non-transactional SELECTs to the slaves
    --
    -- is_in_transaction tracks the state of the transactions
    local is_in_transaction       = false

    -- if this was a SELECT SQL_CALC_FOUND_ROWS ... stay on the same connections
    local is_in_select_calc_found_rows = false

    ---
    -- get a connection to a backend
    --
    -- as long as we don't have enough connections in the pool, create new connections
    --
    function connect_server()
        local is_debug = proxy.global.config.rwsplit.is_debug
        -- make sure that we connect to each backend at least ones to
        -- keep the connections to the servers alive
        --
        -- on read_query we can switch the backends again to another backend

        if is_debug then
            print()
                    print("[connect_server] " .. proxy.connection.client.dst.name)
        end

        local rw_ndx = 0

        -- init all backends
        for i = 1, #proxy.global.backends do
            local s        = proxy.global.backends[i]
            local pool     = s.pool -- we don't have a username yet, try to find a connections which is idling
            local cur_idle = pool.users[""].cur_idle_connections

            pool.min_idle_connections = proxy.global.config.rwsplit.min_idle_connections
            pool.max_idle_connections = proxy.global.config.rwsplit.max_idle_connections
            if is_debug then
                print("  [".. i .."].connected_clients = " .. s.connected_clients)
                print("  [".. i .."].pool.cur_idle     = " .. cur_idle)
                print("  [".. i .."].pool.max_idle     = " .. pool.max_idle_connections)
                print("  [".. i .."].pool.min_idle     = " .. pool.min_idle_connections)
                print("  [".. i .."].type = " .. s.type)
                print("  [".. i .."].state = " .. s.state)
            end

            -- prefer connections to the master
            if s.type == proxy.BACKEND_TYPE_RW and
               s.state ~= proxy.BACKEND_STATE_DOWN and
               cur_idle < pool.min_idle_connections then
                proxy.connection.backend_ndx = i
                break
            elseif s.type == proxy.BACKEND_TYPE_RO and
                   s.state ~= proxy.BACKEND_STATE_DOWN and
                   cur_idle < pool.min_idle_connections then
                proxy.connection.backend_ndx = i
                break
            elseif s.type == proxy.BACKEND_TYPE_RW and
                   s.state ~= proxy.BACKEND_STATE_DOWN and
                   rw_ndx == 0 then
                rw_ndx = i
            end
        end

        if proxy.connection.backend_ndx == 0 then
            if is_debug then
                print("  [" .. rw_ndx .. "] taking master as default")
            end
            proxy.connection.backend_ndx = rw_ndx
        end

        -- pick a random backend
        --
        -- we someone have to skip DOWN backends

        -- ok, did we got a backend ?

        if proxy.connection.server then
            if is_debug then
                print("  using pooled connection from: " .. proxy.connection.backend_ndx)
            end

            -- stay with it
            return proxy.PROXY_IGNORE_RESULT
        end

        if is_debug then
            print("  [" .. proxy.connection.backend_ndx .. "] idle-conns below min-idle")
        end

        -- open a new connection
    end

    ---
    -- put the successfully authed connection into the connection pool
    --
    -- @param auth the context information for the auth
    --
    -- auth.packet is the packet
    function read_auth_result( auth )
        if is_debug then
            print("[read_auth_result] " .. proxy.connection.client.dst.name)
        end
        if auth.packet:byte() == proxy.MYSQLD_PACKET_OK then
            -- auth was fine, disconnect from the server
            proxy.connection.backend_ndx = 0
        elseif auth.packet:byte() == proxy.MYSQLD_PACKET_EOF then
            -- we received either a
            --
            -- * MYSQLD_PACKET_ERR and the auth failed or
            -- * MYSQLD_PACKET_EOF which means a OLD PASSWORD (4.0) was sent
            print("(read_auth_result) ... not ok yet");
        elseif auth.packet:byte() == proxy.MYSQLD_PACKET_ERR then
            -- auth failed
        end
    end

    ---
    -- read/write splitting
    function read_query( packet )
        local is_debug = proxy.global.config.rwsplit.is_debug
        local cmd      = commands.parse(packet)
        local c        = proxy.connection.client

        local r = auto_config.handle(cmd)
        if r then return r end

        local tokens
        local norm_query

        -- looks like we have to forward this statement to a backend
        if is_debug then
            print("[read_query] " .. proxy.connection.client.dst.name)
            print("  current backend   = " .. proxy.connection.backend_ndx)
            print("  client default db = " .. c.default_db)
            print("  client username   = " .. c.username)
            if cmd.type == proxy.COM_QUERY then
                print("  query             = "        .. cmd.query)
            end
        end

        if cmd.type == proxy.COM_QUIT then
            -- don't send COM_QUIT to the backend. We manage the connection
            -- in all aspects.
            proxy.response = {
                type = proxy.MYSQLD_PACKET_OK,
            }
            if is_debug then
                print("  (QUIT) current backend   = " .. proxy.connection.backend_ndx)
            end

            return proxy.PROXY_SEND_RESULT
        end

        proxy.queries:append(1, packet, {resultset_is_needed = true})
        -- read/write splitting
        --
        -- send all non-transactional SELECTs to a slave
        if not is_in_transaction and
           cmd.type == proxy.COM_QUERY then
            tokens     = tokens or assert(tokenizer.tokenize(cmd.query))

            local stmt = tokenizer.first_stmt_token(tokens)

            if stmt.token_name == "TK_SQL_SELECT" then
                is_in_select_calc_found_rows = false
                local is_insert_id = false

                for i = 1, #tokens do
                    local token = tokens[i]
                    -- SQL_CALC_FOUND_ROWS + FOUND_ROWS() have to be executed
                    -- on the same connection
                    -- print("token: " .. token.token_name)
                    -- print("  val: " .. token.text)
                    if not is_in_select_calc_found_rows and token.token_name == "TK_SQL_SQL_CALC_FOUND_ROWS" then
                        is_in_select_calc_found_rows = true
                    elseif not is_insert_id and token.token_name == "TK_LITERAL" then
                        local utext = token.text:upper()

                        if utext == "LAST_INSERT_ID" or
                           utext == "@@INSERT_ID" then
                            is_insert_id = true
                        end
                    end

                    -- we found the two special token, we can't find more
                    if is_insert_id and is_in_select_calc_found_rows then
                        break
                    end
                end

                -- if we ask for the last-insert-id we have to ask it on the original
                -- connection
                if not is_insert_id then
                    local backend_ndx = lb.idle_ro()

                    if backend_ndx > 0 then
                        proxy.connection.backend_ndx = backend_ndx
                    end
                else
                    print("   found a SELECT LAST_INSERT_ID(), staying on the same backend")
                end
            end
        end

        -- no backend selected yet, pick a master
        if proxy.connection.backend_ndx == 0 then
            -- we don't have a backend right now
            --
            -- let's pick a master as a good default
            --
            proxy.connection.backend_ndx = lb.idle_failsafe_rw()
        end

        -- by now we should have a backend
        --
        -- in case the master is down, we have to close the client connections
        -- otherwise we can go on
        if proxy.connection.backend_ndx == 0 then
            return proxy.PROXY_SEND_QUERY
        end

        local s = proxy.connection.server

        -- if client and server db don't match, adjust the server-side
        --
        -- skip it if we send a INIT_DB anyway
        if cmd.type ~= proxy.COM_INIT_DB and
           c.default_db and c.default_db ~= s.default_db then
            print("    server default db: " .. s.default_db)
            print("    client default db: " .. c.default_db)
            print("    syncronizing")
            proxy.queries:prepend(2, string.char(proxy.COM_INIT_DB) .. c.default_db)
        end

        -- send to master
        if is_debug then
            if proxy.connection.backend_ndx > 0 then
                local b = proxy.global.backends[proxy.connection.backend_ndx]
                print("  sending to backend : " .. b.dst.name);
                print("    is_slave         : " .. tostring(b.type == proxy.BACKEND_TYPE_RO));
                print("    server default db: " .. s.default_db)
                print("    server username  : " .. s.username)
            end
            print("    in_trans        : " .. tostring(is_in_transaction))
            print("    in_calc_found   : " .. tostring(is_in_select_calc_found_rows))
            print("    COM_QUERY       : " .. tostring(cmd.type == proxy.COM_QUERY))
        end

        return proxy.PROXY_SEND_QUERY
    end

    ---
    -- as long as we are in a transaction keep the connection
    -- otherwise release it so another client can use it
    function read_query_result( inj )
        local is_debug = proxy.global.config.rwsplit.is_debug
        local res      = assert(inj.resultset)
          local flags    = res.flags

        -- if inj.id ~= 1 then  -- this was causing some misleading errors
            -- ignore the result of the USE <default_db>
            -- the DB might not exist on the backend, what do do ?
            --
            if inj.id == 2 then
                -- the injected INIT_DB failed as the slave doesn't have this DB
                -- or doesn't have permissions to read from it
                if res.query_status == proxy.MYSQLD_PACKET_ERR then
                    proxy.queries:reset()

                    proxy.response = {
                        type = proxy.MYSQLD_PACKET_ERR,
                        errmsg = "can't change DB ".. proxy.connection.client.default_db ..
                            " to on slave " .. proxy.global.backends[proxy.connection.backend_ndx].dst.name
                    }

                    return proxy.PROXY_SEND_RESULT
                end
            end
        --    return proxy.PROXY_IGNORE_RESULT
        -- end

        is_in_transaction = flags.in_trans
        local have_last_insert_id = (res.insert_id and (res.insert_id > 0))

        if not is_in_transaction and
           not is_in_select_calc_found_rows and
           not have_last_insert_id then
            -- release the backend
            proxy.connection.backend_ndx = 0
        elseif is_debug then
            print("(read_query_result) staying on the same backend")
            print("    in_trans        : " .. tostring(is_in_transaction))
            print("    in_calc_found   : " .. tostring(is_in_select_calc_found_rows))
            print("    have_insert_id  : " .. tostring(have_last_insert_id))
        end
    end

    ---
    -- close the connections if we have enough connections in the pool
    --
    -- @return nil - close connection
    --         IGNORE_RESULT - store connection in the pool
    function disconnect_client()
        local is_debug = proxy.global.config.rwsplit.is_debug
        if is_debug then
            print("[disconnect_client] " .. proxy.connection.client.dst.name)
        end

        -- make sure we are disconnection from the connection
        -- to move the connection into the pool
        proxy.connection.backend_ndx = 0
    end

     

        启动mysql-proxy代理

    963 touch /var/log/mysql-proxy/mysql-proxy.log

    965 /usr/local/mysql-proxy/sbin/mysql-proxy --proxy-read-only-backend-addresses=192.168.1.7:3306 --proxy-backend-addresses=192.168.1.9:3306 --proxy-lua-script=share/mysql-proxy/rw-splitting.lua > /var/log/mysql-proxy/mysql-proxy.log &

    968 netstat –antp | grep 4040                              #看看有没有起来

    969 ps –aux | grep mysql                                      #看看进程里面有没有 一些配置的路径里面都可以看到

    985  /usr/local/mysql/bin/mysql -u root -p -P4040 –hlocalhost

                                                                            #登陆一下看看,

      

    读写分离测试

        登陆3306端口,在从服务器testtb上增加几条记录

        客户端做多个连接到mysql-proxy的端口4040。

        insert一条记录,可以看到主服务器也有增加了记录。从服务器是同步过来的数据

        select * from testtb;在一个客户端连接的时候,显示的是主服务器的表内容

                                     而有多个客户端连接之后,就会显示从服务器的testtb表内容

     

     

     

        最后,他是同步所有database的,如果只需要备份指定的数据库,请一定要在my.cnf中加上

         replicate-do-db=dbname 

        不然,他找不到其他数据库,正常的数据库也不会更新了。

     

     

    生成一个/usr/local/bin/mysql-proxy.sh

    #! /bin/bash
    /usr/local/mysql-proxy/sbin/mysql-proxy --proxy-read-only-backend-addresses=192.168.1.7:3306 --proxy-backend-addresses=192.168.1.9:3306 --proxy-lua-script=share/mysql-proxy/rw-splitting.lua > /var/log/mysql-proxy/mysql-proxy.log &

     

    在/etc/rc.local 文档中加入一条

           /usr/local/bin/mysql-proxy.sh &

     

    参考资料:

    http://sery.blog.ccidnet.com/blog-htm-do-showone-uid-3587-itemid-472099-type-blog.html  

                                                                                          MySQL 主从复制读写分离实现

    http://www.yayu.org/look.php?id=136                                   MySQL 主从同步关键句

    http://butian.org/knowledge/develop/DB/20090520/1124.html    MySQL 主从服务器的一些技巧

    http://www.3389hack.com/xueyuan/fuwuqi/MySQL/22601.html  MySQL配置文件my.cnf 例子的最详细翻译

    November 05

    Oracle数据库的灾难恢复(转)


         随着办公自动化和电子商务的飞速发展,企业对信息系统的依赖性越来越高,数据库作为信息系统的核心担当着重要的角色。尤其在一些对数据可靠性要求很高的行业如银行、证券、电信等,如果发生意外停机或数据丢失其损失会十分惨重。为此数据库管理员应针对具体的业务要求制定详细的数据库备份与灾难恢复策略,并通过模拟故障对每种可能的情况进行严格测试,只有这样才能保证数据的高可用性。数据库的备份是一个长期的过程,而恢复只在发生事故后进行,恢复可以看作是备份的逆过程,恢复的程度的好坏很大程度上依赖于备份的情况。此外,数据库管理员在恢复时采取的步骤正确与否也直接影响最终的恢复结果,本文主要针对 Oracle数据库可能遇到的各种故障提供了相应的恢复的方法,仅供大家参考。

     
         要对Oracle数据库备份与恢复有清晰的认识,首先有必要对数据库的几种运行状态有充分的了解。Oracle数据库的运行状态主要分为3种,他们依次为:


    l Nomount(非安装)Oracle只是读取ini文件中的配置信息,并初始化SGA区。
    l Mount(安装)Oracle除了需要读取ini文件还要读取控制文件,并从中获取有关数据库的物理结构等信息。
    l Open(打开)数据库要检查所有文件处于同一时间点,对错误进行恢复对未完成事务回滚,并最终可以允许用户访问。


         数据库的备份主要分为三种类型:冷备份;热备份;逻辑备份;
         数据库的备份不是本文讨论的重点,在这里只作一个概要的介绍,Oracle数据库备份主要有:

     
    l Cold Backup(冷备份) 主要指在关闭数据库的状态下进行的数据库完全备份,备份内容包括所有数据文件、控制文件、联机日志文件、ini文件。
    l Hot Backup(热备份) 指在数据库处于运行状态下,对数据文件和控制文件进行备份,要使用热备份必须将数据库运行在(Archive Log)归档方式下。
    l Export(逻辑备份)这是最简单的备份方法,可按数据库中某个表、某个用户或整个数据库来导出,并且支持全部、累计、增量三种方式。使用这种方法,数据库必须处于打开状态,而且如果数据库不是在restrict状态将不能保证导出数据的一致性。


         数据库的恢复可分为两大类:完全恢复;不完全恢复;


    完全恢复指将数据库恢复到发生故障的时间点,不丢失任何数据。

    不完全恢复指将数据库恢复到发生故障前的某一个时间点,此时间点以后的所有改动将会丢失。如果没有特殊需求,我们建议应尽量使用完全恢复。


         Oracle 数据库的恢复过程分两步进行,首先将把存放在重做日志文件中的所有重做运用到数据文件,之后对重做中所有未提交的事务进行回滚,这样所有数据就恢复到发生灾难那一时刻了。数据库的恢复只能在发生故障之前的数据文件上运用重做,将其恢复到故障时刻,而不能将数据文件反向回滚到之前的某一个时刻。举个例子,我们有一个2001/1/1的数据库备份,当2001/5/1使我们发现数据库中数据发生混乱,希望将数据库恢复到2001/4/30时的状态,我们只能先恢复2001/1/1的数据库备份然后在其上运用重做记录使其前滚到2001/4/30时的状态,而不能将2001/5/1的数据库向后回滚到2001 /4/30。


         为了系统的设计数据库的恢复方案,我们先对可能遇到的错误进行分类,Oracle数据库错误主要分为5大类:


    l SQL语句失败
    l 线程失败
    l 实例失败
    l 用户操作失败
    l 存储设备失败


         如果发生前三种失败,不需要我们人为干涉,Oracle系统会自动进行恢复。对于用户操作型的失败(如误删除数据),我们采取的补救措施主要有导入最新的逻辑备份或进行到某一时间点的不完全恢复。从Oracle 8之后的新版本中引入了基于表空间的时间点恢复(TSPITR),可以单独将包含错误操作的表空间恢复到指定时间,而不必对整个数据库进行不完全恢复。当错误操作发现比较及时而且数据量不大的情况下也可以考虑使用logminer生成反向SQL。

     
         针对存储设备的失败的情况比较复杂也是本文讨论的重点,存储设备的失败必然会使放置在其上的文件变为不可用,我们先将Oracle数据库所涉及到的文件进行一个划分,主要可分为:


    l Oracle的系统文件,指Oracle的运行文件,各种应用程序
    l 数据库控制文件
    l 数据库联机重做日志文件
    l 数据文件
    l 归档日志文件


         避免第一种文件失败主要依赖系统管理员进行操作系统级的备份,当发生事故后只能依靠操作系统备份将其恢复。
         控制文件中记录着整个数据库的结构、每个数据文件的状况、系统SCN、检查点计数器等重要信息,在创建数据库时会让用户指定三个位置来存放控制文件,他们之间互为镜像,当其中任何一个发生故障,只需将其从ini文件中注释掉故障数据文件就可重新将数据启动。当所有控制全部失效时,可以在Nomount模式下执行create controlfile来重新生成控制文件,但必须提供redo log,data file,文件名和地址以及MAXLOGFILES,MAXDATAFILES,MAXINSTANCES等信息。如果失败之前运行过alter database backup controlfile to trace或alter database backup controlfile to ‘xxx’对控制文件作备份,恢复时可使用生成的脚本来重建或用备份文件覆盖,如果使用了旧的控制文件在恢复时要使用recover xxx using backup controlfile选项来进行恢复,并使用resetlogs选项来打开数据库。

     

     


         如果丢失的是联机日志文件,分两种情况处理1、丢失的是非活动的日志文件;2、丢失的是当前激活的日志文件。


         如果是第一种情况,而发生故障的日志文件组又具有多个成员,可以先将数据库shutdown,然后用操作系统命令将损坏日志文件组中好的日志成员文件把损坏的成员文件覆盖(在同一个日志成员组中的所有日志文件的各为镜象的),如果其物理位置不可用可将其拷贝到新的驱动器上,使用alter database rename file ‘xxxx’ to ‘xxxx’改变文件位置,之后启动数据库,如果正常马上进行一个冷备份。如果损坏的日志组中只有一个日志成员,先mount上数据库,将其转换为 noarchivelog模式,执行alter database add logfile member ‘xxx’ to group ‘x’给相关组增加一个成员,再执行alter database drop logfile member ‘bad_file’将损坏的日志文件删除,由于数据库的结构发生变动需要备份控制文件,之后将数据库改回archivelog模式,做一个冷备份。

     


         如果丢失的是当前激活的日志文件,数据库又没有镜像而且当前日志组中所有成员均变为不可用。

         首先将数据库shutdown abort,从最近的一次全备份中恢复所有的数据文件,将数据库启动到mount状态。如果原来的日志文件物理位置不可用,使用alter database rename file ‘xxx’ to ‘xxx’改变文件的存放位置。然后,使用recover database until cancel命令来恢复数据库,直到提示最后一个归档日志运用完之后,输入cancel。之后用alter database open resetlogs打开数据库,如果没有问题,立即进行一个冷备份。注意!所有包含在损坏的redo log中的信息将会丢失,也就是说数据库崩溃前已经提交的数据有可能会丢失。这对于某些要求很高的应用将会损失惨重,因此应尽量使每个日志组具有多个日志成员,并且放置在不同的驱动器上一防止发生介质故障。

     


         数据文件发生故障的情况也分为多种情况,

    1、丢失包含在SYSTEM表空间的数据文件;
    2、丢失没有回滚段的非SYSTEM数据文件;
    3、丢失有回滚段的非SYSTEM数据文件。


         如果损坏的是系统表空间的数据文件。唯一的办法是从上一次备份中恢复受损的数据文件,(如果原位置不可用使用alter database rename命令改变新文件的位置),之后在数据库mount的状态下执行recover database/datafile对数据库进行回复,才能将数据库打开。注意:当SYSTEM表空间或其中的数据文件脱机,数据库是无法被打开的,因此必须在mount状态下将所有的恢复工作完成。


         当丢失的数据文件不属于系统表空间而且也不包含回滚段时,有可选择在数据库的两种状态下进行恢复---在数据库open的状态或者在数据库mount的状态。如果用户急于访问数据库中未受损部分的数据或对损坏的数据文件进行恢复需要很长时间,可以先使受损的数据文件脱机,将数据库打开给用户访问,再恢复受损的数据文件最后将其联机。步骤如下:先在数据库mount时,将相关的数据文件或表空间进行脱机alter database datafile xxx offline,然后将数据库open,这样就能使数据库未受损的部分先供用户访问,之后再进行recover datafile/tablespace,完成后用alter database datafile/tablespace ‘xxx’ online使其恢复联机就可被访问了。 当然用户也可以选择在数据库mount状态下,用recover database/datafile将所有的恢复工作做完,将所有数据文件一起打开供用户访问。


         如果丢失的数据文件是最后一种情况,即包含有回滚段的非系统表空间数据文件。也可以选择是在数据库先open的状态还是在mount状态下恢复。不过与上一种情况不同的是当包含回滚段的数据文件损坏时,如果使其先offline将数据库打开,那么所有数据库崩溃前未提交的事务涉及到的表将无法访问,也就是说在回滚段恢复前其中涉及的对象都不允许被访问。而且当所有包含回滚段的数据文件都在offline状态时,数据库无法进行任何DML操作,因此在数据库open状态恢复包含回滚段的数据文件时,可以先创建几个临时回滚段供数据使用create rollback segment temp1 tablespace system; alter rollback segment temp1 online;,当数据文件恢复后再将他们删除alter rollback segment temp1 offline; drop rollback segment temp1;。注意:当用这种方法使恢复的数据文件online之后,所有的原有回滚段将处于offline状态,必须手工使用alter rollback segment RBSxx online;使他们恢复联机状态,这样才能被数据库正常使用。如果在数据库mount状态下完成所有恢复,则不需要上述步骤。


         如果丢失数据文件后,用户发现没有故障前的数据文件的备份,而且自从丢失的数据文件最早建立之后一直没有使用过resetlogs选项打开过数据库。也就是说用户的控制文件是在损坏的数据文件建立前创建的,归档日志中包括对损坏数据文件的所有重做记录。用户就还有一种恢复方法,用户可以先将损坏的数据文件或表空间脱机 alter database datafile / tablespace xxx offline,之后执行alter database create datafile ‘new/xxx.dbf’ as ‘old/xxx.dbf’,数据库会根据保存在控制文件中的信息重建一个空的数据文件,之后再执行recover tablespace / datafile将所有重做记录运用到数据文件,使其完全恢复到当前状态,之后便可再将其恢复联机。

     


         如果丢失的是最后一种文件---归档文件或归档文件所处的物理位置不可用,首先shutdown数据库,立即作一个冷备份。然后修改ini文件中的归档日志文件目的路径,重新启动数据库。以后再发生灾难只需从最新的备份中将相关文件恢复,数据库作recover时就不需要备份之前丢失的归档文件了。在Oracle 8之后的新版本中提供了log_archive_duplex_dest和log_archive_dest_1...5等参数允许保留多份归档文件到不同位置,甚至到远端服务器从而保证归档文件的可靠性。

     


    最后再说几点数据库恢复时的注意事项:


    1.本文讨论所有情况的默认前提是数据库运行在归档(ARCHIVELOG)方式下,并只涉及到一般常见的情况和最基本的恢复方法。使用Oracle提供的恢复管理器RMAN也能完成上述任务,如果运行环境比较复杂建议使用RMAN来做备份和恢复。


    2.一旦数据库发生灾难,最好在进行恢复之前做一次完全的冷备份,以便在进行恢复时产生差错还可以进行补救。很大一部分数据丢失是由于不正确的恢复操作所引起的。


    3. 当数据库完成恢复之后,尤其是使用resetlogs选项打开数据库之后,要马上关闭数据库进行一次完全的冷备份。因为,为防止放弃的重做日志被下次恢复时再次运用,resetlogs选项会重新创建redo log文件并将其的计数清零,这将使之前做的所有备份将变为不可用(一般情况下)。


    4.要特别注意当进行数据库完全恢复,从发生故障的时间点前的备份中恢复损坏文件时,一定不要使备份中的redo log文件覆盖了当前的redo log文件,否则就只能进行不完全恢复并且要丢失一部分数据了。


    原作者:吴悦

    November 03

    对不起。

    本来想写影评的,明天再写吧

     

    实在是有些受不了。

       一个28岁的人 还要寄人于篱下 被迫离开自己最亲的人,去受人照顾

       怎么也接受不了。我宁愿一个人漂泊流离 也要靠自己的能力来换取生活

        总是想不依靠别人的力量 总是想独立 而且更应该去帮助身边的人

         可是似乎很失败 28岁的自己 才刚能勉强让自己一个人生活起来 更别提拿出精力来为别人付出

     

        可是 即使如此 我也不愿意再无端受人照顾了  这是耻辱。

     

     

        谢谢你们。其实我也知道你们是好意。非常对不起。

    November 02

    It’s love

    We shall always save a place for ourselves, only for ourselves. And then begin to love.

    Have no idea of what it is, who he is, how to love or how long it will be. Just wait for one love.

    Maybe no one will come out, but this kind of waiting is the love itself. 

     

    刚才在朋友的blog里看到的一句话,突然觉得很有feeling。也许这样子的爱情才是真正的爱情, 态度

       可是 等待 似乎又不是一个 最好的途径

    谢国忠:有效市场是个神话

     

      最好的办法,是限制货币增长与名义GDP增长率间的偏差

      货币需求是有效的吗?这个问题的答案关系到怎样的货币政策称得上最好。随着金融机构杠杆率的提高,对货币需求不断增大,这个问题就相当于在问金融体系是否有效。我认为,答案是否定的。货币当局或中央银行有责任考虑到这一点。最好的办法,是限制货币增长与名义GDP增长率间的偏差。特别是,当经济基本面可能在短期受损时,持续的偏差仍应予以纠正。

    神话破灭

      这是一个严肃的学术课题。我为什么要在这里和普通读者讨论这个问题?

      首先,这与每个人都息息相关。中国的散户投资者主导着资产市场。他们做出投资或投机决定时,大多认为“政府不会让资产价格下跌”。政府支出一旦有了限制,那这种期望还有几分可信?关于对货币扩张限制的讨论,能够帮助中国投资者评估投资决策的风险。

      其次,从世界范围来看,货币供应量增速都远远高于名义GDP的增速。也就是说,货币增长被用来支撑高杠杆率,这在金融部门尤其明显。当然,原因是央行通过降低利率来应对金融危机,有时甚至是强行增加银行的流动性,以期他们能够增加贷款,刺激经济。不过,这些钱却流入了资产市场,导致资产市场繁荣兴旺。活跃的资产价格稳定了全球经济。尽管大多数分析家认为,活跃的资产市场反映了他们对全球经济蓬勃发展的正确预期。但是,我认为这不是事实。像过去的十年一样,资产市场的繁荣支持了经济增长,而不是倒过来——由于强大的经济增长导致资产市场繁荣——因此,一切只不过是个泡沫。

      尽管全球经济正温和复苏,整体经济形势仍困难重重。经合组织国家的失业率都处于历史高位。资产市场的繁荣与真实的经济困难之间的对比,在近代可谓绝无仅有。尽管工人和企业都在努力挣扎,资产玩家却重新收获了账面利润。资产繁荣的背后,是央行的货币政策。我们不禁要问,政策实现了其帮助实体经济的目标了吗?还是说,政策帮助的只是那些投机者,希望他们能给实体经济留点残羹冷炙?

      金融机构从中央银行获取大量货币,但当前的金融危机暴露了货币运行存在的严重低效。对那些引发了危机的人提供如此多的钱,理由恰恰是因为他们引发了危机,这是什么道理?好比说,当房子着火了,你必须扑灭大火并找到罪魁祸首。可问题是,纵火者被要求去救火。那么,如何可以肯定,他们不会引起另一场大火?

      大部分人认为改革金融体制,而非限制货币供应,是解决这一问题的办法。一旦如此,未来对货币的需求将是有效的。到目前为止,金融危机中发现的问题仍没有得到纠正。过去十年,全球金融体系已变得相当庞大,将中央银行、立法者和政府困在其中。行将推进的改革,不会触碰到那些引发当前危机的主要因素。即使最好的改革能够实行,核心问题仍然难以解决:金融从业人员用别人的钱来赌博,当下对注的时候,他们将得到巨大的回报;下错注,他们也不会赔偿。这个激励问题表明,现行的全球金融体系,鼓励了风险冒进的偏好,有效市场并非如此。中央银行限制货币供给,是解决这一问题的惟一办法。过去十年的资产价格通胀,以及破灭后的灾难,都证明了这一论点是可信的。

      上世纪70年代的滞胀,促使经济学家研究为何货币刺激并没有增加需求,却直接转为通胀。这一研究促进了理性预期理论的发展,解释了大众对货币政策的反应。它的结论显而易见,即决策者可以反复愚弄普通人。多人因此获得诺贝尔奖。米尔顿·弗里德曼主张将以货币供给增长为目标,作为中央银行的指导原则。这一做法将使中央银行以货币增长为目标,“自动驾驶”,并让市场决定利率。

      理性预期理论被进一步用来解释投资者的行为,并引出了有效市场理论:在一定条件下,理智的投资者将带来有效的资产价格,这种价格能够正确反映未来预期。用学术术语来说,有效资产价格,就是包含了所有有关未来的有用信息的价格。这为拆除那些源自“大萧条”时期得到的教训而建立起来的监管架构,奠定了基础。

      上世纪70年代的滞胀,使得中央银行疲于应付短期通胀。依据有效市场理论,中央银行决定完全满足金融机构的货币需求,以支持他们的杠杆率。这种组合为过去十年间出现的巨大泡沫奠定了基础。由于全球化通胀保持在较低水平,华尔街可以无限量地从中央银行获得流动性,制造泡沫。

      在西方金融市场中,机构投资者占主导地位,散户或个人投资者则主导了东方金融市场。多数机构投资者是以季度市场指数为基准,同时,他们持有的现金量还有限制。这些制约因素使他们处于不利地位,很难跑赢大盘。这就是为什么大多数机构投资者都是指数追随者。额外的管理成本,使得大多数机构投资者表现比指数差,这并不会增加市场的效率。

    改革的困境

      过去十年,金融市场最显著的发展是绝对表现基金(Absolute performance funds)和对冲基金的增加。但是,他们只是放大了市场的波动性,并未提高市场效率。由于对冲基金经理的薪酬是旱涝保收,因此,他们自然乐于见到长期波动。这是一个委婉的“正面算我赢,反面算你输”的掷硬币游戏。对冲基金业让其管理人员,而不是投资人收益颇丰。

      无论怎样尝试去改善机构投资者的激励结构,“管理别人的钱”带来的激励扭曲难以改变。制度化一度被誉为提高市场效率的一大进步,已被证明使无效状况更甚。面临着变幻莫测市场的发展中国家,一直寻求以制度化来稳定市场。他们应该三思。制度化或能减少短期波动,但会变成大崩溃。

      散户或者个人投资者经常错误地将短时期波动当做趋势。“羊群行为”产生了自我实现的趋势,而这大都只是暂时的。但是,这种羊群行为有时也会持续很长一段时间,引发巨大的泡沫。这种泡沫会导致资源配置严重失当。

      为了尽量减少今后出现金融危机的可能,人们可以改革金融体系,以减少出现危机的倾向;或者在制定货币政策时,同时考虑资产价格以及消费物价。一年前,危机爆发时,世界各地的决策者发誓要改革金融体系,消除腐败和过度杠杆化。在政府花费数万亿美元救助金融机构之后,改革的动力已经减弱。美国国会改革法案已经淡化,因此,他们并无力阻止另一次重大危机。

      资本充足率要求以及透明度,是有效的金融改革的关键。例如,场外交易的衍生品的名义价值达到数万亿美元。它们在一个不透明的环境中蓬勃发展。做市商可以通过欺骗买家和监管机构获取高额利润:向他们收取超高费用,但他们并未为提供这种高风险产品投入大量资金。如果市场是透明的,而且资本要求合理,那么这项业务也不会开展得这样大。在理论上,衍生工具能够帮助买家降低风险;而在实践中,由于复杂的结构可以隐藏杠杆率,衍生工具会带来更大的风险。除非能够看到旨在针对衍生产品市场的问题的改革,否则,所谓的金融改革很难称之为“有效”。

    谁又将声名扫地?

      天下没有不散的宴席,现在也是如此。有两个情形预示着另一场危机的爆发。首先,每个交易者借入美元购买东西。华尔街多数交易商是美国人、英国人,还有澳大利亚人。他们都很了解美国。美联储维持着零利率政策,美国政府也支持弱势美元,以刺激美国的出口。除非是傻瓜,人人都能看出,美国政府正在“ 帮助”你借美元去投机。但是,这些交易员对其他国家并不熟悉,特别是新兴经济体。他们一年也就去那里一两次,即使这一两次,还是和美国的投行一起去的:这些投行可是很想要卖东西给他们的。他们愿意相信任何事,除了美元会升值。当然,华尔街的银行也会这么告诉他们。由于这些人为数众多,他们的行动在短期内会自我实现。举例来说,澳元从底部算起,已经升值了35%。现在,这些家伙坐在巨大的账面利润上,感觉自己是如此聪明。当然,华尔街的交易商们在付给投资人之前,已经先喂饱了自己。

      一旦交易规模过大,就像现在这样,只需要一个小冲击就能引发飓风,而你永远不知道这个冲击会是什么。一旦有事发生,所有这些交易商就会迅速退出,这可能会导致另一场危机。

      石油价格的飙升,可能是宴会中另一个不速之客。它可能引发通胀预期回升,并引发债券市场大崩溃。由此产生的极高债券收益率可能迫使央行提高利率,以减少对通货膨胀的担心。另一轮资产价格大下滑,将再度激起对于全球主要金融机构资产负债表的恐惧,再次造成混乱。

      石油是制造泡沫的完美材料:石油供应不能及时回应油价上涨,它需要很长的时间来扩大生产能力,而且由于生活方式和生产方式的粘性,石油需求也不能迅速减少。无论是需求还是供应方面,石油的价格敏感度都较低,很适合用来制造泡沫。当流动性既便宜又易得的时候,石油投机者随处可见。

      石油投机商不再只是那些偷偷摸摸的对冲基金。普通百姓也可以通过购买交易所交易基金拥有石油或其他任何东西。而且,没有道理不去这么做。中央银行已明确表示,将保持尽可能充足的货币供给,使纸币贬值,帮助债务人。如果你赌得很大,当你下错注的时候,政府会帮你摆脱困境,并且降低利率以使你能够下更大的赌注。所以,在这个世界上,最好做个投机者,当权者永远与你同在。

      对于那些想成为投机分子的人,我有一言相劝:一旦债券市场大幅下跌,尽快逃命去吧。石油泡沫来得容易,去得也快,因为它会刺破其他泡沫。一旦这些泡沫破灭,供石油泡沫生存的氧气也就消失了。

      2010年出现二次探底的情况已经很明显。目前的经济复苏得益于企业补充库存以及财政刺激。明年,西方消费者在囊中羞涩之后迅速恢复的几率微乎其微。高失业率将使他们的收入难以支撑其消费。他们不太可能再去借钱消费。

      许多分析家都认为,只要失业率依旧居高不下,那么,就应当不断采取刺激政策。正如我刚才所说,供求不匹配——而不是需求疲软本身——是高失业率的主要原因。更多的刺激只会引发通货膨胀和金融不稳定。

      上世纪70年代的滞胀,让一批认为可以“用一点通胀换得经济大幅增长”的银行家声名狼藉。当前的这场危机,将会使那些忽略资产价格通胀,甚至创造通胀去刺激经济增长的这一代中央银行家们声名扫地。玩火者,必自焚。■

    October 31

    工作第一周

         hoho上班一周

         公司出乎意料的好相处,老总依旧是那么滴帅。

            认识的同事也越来越多 原来都是很好的人呐

         老总的眼光确实有些合我的口味 所以手下的人似乎都能很顺利地沟通

         整个团队的方向感很明确 领导者功不可没,除了老总以外 技术部和营业部的领导也都很赞 有特点。

     

            不过公司的业务实在是有些出乎意料。

            整天看到测评部的几个同事在打WOW。。而且还是美服的。。真是羡慕啊  工作的任务就是打游戏~~貌似有些辛苦。

              有一天的下午整个公司同仁被召集起来打新开发的一个游戏作压力测试。。

     

          工作方面 公司的计算机管理水准还处在一个开荒阶段。。

             我发现每次我去交接工作 都只有很短的时间。这次只有3天 上一份工作也就一个礼拜。

             最难以接受的是 交接的方式是通过即兴创作的文档+探寻式反馈 几乎没有成型的文档

                我上份工作走的时候 自己工作涉及的每个方面、曾经碰到的难点问题 都有归纳文档 很容易接任者的工作继续

             不过怎么说呢 这样子也算是对自己的挑战吧 一个全都管理得井井有条没有破绽的计算机系统

                对自我价值的实现而言也就没什么意义了。根本体现不出我的能力嘛 哈哈。

             最大的问题在于开发部分。领导准备把公司所有涉及公网服务器的部分全都交给我来处理~

                包括服务器的均衡负载、热切换、Mysql的读写分离、镜像服务器备份、测试等。

                 以前的工作内容几乎不涉及公网的服务器以及数据库部分的深入操作,所以接触不多。。

                 还好闲情逸志时曾经研究过一段时间数据库 命令什么的还有大致的印象~~

                 所以前几天已经临时上阵过了。。还好没有什么大的问题。就是反应要点时间、迟钝了些,哈哈

     

            

          下周开始要正式打仗了 服务器和公司系统管理的东西全都特意留着等我来发挥呢 任务计划已经有2页了

     

          来吧。老子斗志昂扬着呢

     

     

     

          这次找工作算是比较满意了吧     公司内部很团结、融洽 也有一些自己公司文化的味道

                                                      能学到些重要的东西 后台数据库和服务器应用方面 是很值得花费精力去研究的

                                                      收入么也符合我的想象

             它的问题就是远了些、小了些 发展的未知性很大, 但游戏公司么 发展的空间也是无限的

             总之拖开对老总个人崇拜之情不讲。把自己托付给这样子的公司、那样的几位领导,我心里觉得 机会还是存在的。

     

     

     

              另外 RHCE考试的时间终于定下来了。。11月30号 这个考试就是今年最后一个没有完成的目标了 加油加油

                     今天收到一个快递 原来是8级的证书 哈哈 真是开心 哈哈。

     

                  那篇文章写的蛮赞呢:)

    即兴高手

    今天闲来无事在网上找歌听 结果真的找到一个即兴高手。  感觉像专业的

    听了几首 绝对可以和张崇德的那张专辑相提并论了,感情、力度都很到位。放在这里收藏

    他为什么不去出张专辑什么的,肯定受欢迎。

    挑几首放在这边。

     

    早期的 速度稍快 不过太熟了就快很正常,到后来慢慢的就很有感觉了

    《冬季恋歌》

     

    《遇见》

     

    《天黑黑》 非常喜欢听这首

     

    《死了都要爱》 原来 钢琴也能把这首歌如此表达。。有小瑕疵 瑕不掩瑜

     

    《青花瓷》 后半段即兴和弦发挥的淋漓尽致

     

     

    《彩虹》  琴从立式的YAMAHA换成三角斯坦威了。。。看来出道了。。呵呵

     

     

    《珊瑚海》

     

    《红豆》

     

     

    个人主页里面一共有38首~就不全贴出来了

    http://u.youku.com/user_video/id_UMTkzMTQ0NDA=_order_1_type_1_page_1.html

    October 30

    一帘幽梦

    我有一帘幽梦       不知与谁能共
    多少秘密在其中    欲诉无人能懂
    窗外更深露重       今夜落花成塚
    春来春去俱无踪    徒留一帘幽梦

    谁能解我情衷       谁将柔情深种
    若能相知又相逢     共此一帘幽梦
    窗外更深露重       今夜落花成塚
    春来春去俱无踪     徒留一帘幽梦

     

    我有一帘幽梦,梦里掬水见月,梦枕流云而眠。
    我有一帘幽梦,梦里琴瑟合谐,梦拥飞鸟入梦。
    我有一帘幽梦,春去春来俱无踪,幽梦徒留与谁共。

     

    清晨时分 日薄朦胧 一缕清香 飘入耳际 心中感触无边

    October 26

    《帕格尼尼24首随想曲》+ 3个版本的《钟》

     

     

    杨一村推荐收藏版 呵呵 帕格尼尼24首随想曲 小提琴独奏 亚历山大·马科夫(Alexander Markov)

     

     

     

    叶夫根尼·基辛

    噢  欧洲人和亚洲人的感觉到底是不一样,颗粒哈清晰~!

    这个技巧已经好到无以复加了。。。崇拜之情如滔滔江水阿。。。。

     

    李云迪的感觉就明显更加优雅而柔娴 绝对东方人的味道~哪个好呢?

    不过从技巧的角度 还是前面一位大师更胜李云迪一筹的。

     

     

    这一段倒是钟的原版 帕格尼尼小提琴版的 演奏者 阿卡多。    有点长10分钟。

    不过怎么说呢 改编的钢琴版比之原版较老的小提琴版更加紧凑吧。现代和古代的音乐欣赏风格不同。

    October 25

    韩寒经典语录

    韩寒:开奔驰宝马的女大学生都是好样

        1.她们没有选择混吧消沉野炮卖淫,选择了长期一对一性关系,干净安全,对社会无害。    

        2.他们没有选择日本车,爱国之心彰显。当然,如果当年德国把苏联拿下了,势必也要侵略到中国.这事太长,又没发生,就不说了.    

        3.从原则上,她们只是交了个男朋友而已。男朋友愿意送她们什么,别人管不着.    

        4.对很多工作十年没车没房的男人来说,的确不公平,但是,这世界上就没公平.    

        5.她们的男朋友肯定是有钱人,我们不能因为这点指责她们。尤其是男人,你们难道不愿意找个有钱的女朋友吗。矛盾就在于,有钱的女朋友之所以有钱是因为找了个有钱的男朋友,而你不是。   

        6.漂亮姑娘难道一定要跟穷人在一起,世界才好看?   

        7.那些开好车的姑娘,肯定不止漂亮,还聪明。他们配了没有上进心只会抱怨的诸多男大学生,那才叫浪费。   

        8.有钱人的素质,至少表面上的整体素质要比没钱的强。我们要看到,人穷志短,穷山恶水出刁民,穷凶极恶是普遍存在的。我们至少没听说过,某巨富打老婆虐待孩子,某巨富搓麻将搓的把女儿都抵押给别人了,某巨富以划别人的汽车或拔别人自行车气门嘴为乐趣,某巨富喜欢拿硫酸泼熊或则挖猫眼睛(这事严重啊,合起来说就是拿硫酸泼熊猫还被挖眼睛),某巨富动不动就把人肚子搞大了等等。   

        9.她们生活的挺幸福,往往男朋友还假装挺有品位,也不时刻缠着她们,有品位而不腻味,多么难得。最怕就是被一没趣味的成天腻着。  


      10.不是所有的姑娘都觉得荡自行车浪漫。当然,如果开腻了奔驰,和有钱男朋友再荡荡自行车,似乎更加浪漫。我们要明白,韩剧日剧里的女演员在美丽的乡村坐完男演员的自行车后,他们都是开奔驰宝马回城里的,不是骑自行车回去的。当然,浪漫的我们应该称之为单车。    

        11.那些心理不平衡的人,你们难道觉得有钱人都是笨蛋吗,一个光脸蛋好话都说不利索的姑娘能开奔驰吗。有钱人的选择,不一定对,但一定不错。不错的姑娘的选择,不一定对,但一定不错。   

        12.她们小小年纪就知道用自己的资本去得到更好的生活,无可厚非。贪官污吏才是我们指责的对象。如果她们傍了贪官污吏,势必加速了他们的暴露,对社会也是好事。男人最容易栽在这方面。   

       13.归根结底,我们不能要求聪明的美女一定要配个辛勤的工人或者不上进的大学生,故事才圆满。平凡的我们,不能因为看到美女和有钱人在一起,而觉得她们都不是好东西(我这是真心话),或者说,和穷鬼在一起,就是好姑娘。这两者间没有联系。大家要控制自己的妒忌心,因为无论漂亮姑娘和谁在一起了,都没和你在一起。所以,我们要祝福她们,下雨不再淋雨,购物随心所欲。  
      但是,姑娘们要注意几点:  
      1:这奔驰是不是奔驰?国产的某几款吉利和奔驰长的就有点像,一定要分清楚。最好的办法就是油门到底,能开到两百的就是奔驰。  
      2:要确定这奔驰究竟是送给你的,还是让你帮忙磨缸的。  
      3:确定是送给你的奔驰以后,看看是不是新款。  
      4:如果是老款,那索性要最老的奔驰,最有范儿。  
      5:最老的奔驰没气囊,还不好修,开慢点。  
      6:要确定,对方真是一有钱人。建议大学开这课程。  
      7:如果对方是一贪官,一定要不知道他是干嘛的  
      8:如果对方是一富商,一定要知道他是干嘛的。   
      9:如果不知道对方是干嘛的,一定要知道自己要干嘛。  
      10:如果连自己要干嘛都不知道,一定不要嘛都被干。  
      幸福生活和不给社会造成负担是正道。姑娘们车技一定要好,你们已经给很多心理不平衡的人添堵了,千万不能再给道路添堵啊

     

     

     

    1.我到现在都一直在庆幸自己没去上大学,而且我觉得高考是一定要改革的。我将继续不遗余力的说高考和大学的坏话。我很早前就说过,现如今的大学像妓女一样,只要有钱,全国所有大学都乖乖排成一排随便你点,想上哪个上哪个,愿意多花点钱甚至可以几个一起上。

    2.作文的看法是,作文就是很傻的东西。高考作文肯定是集所有大傻于一身的。我们的作文讲究的是培养狗奴才,而不是真性情。

    3.世界上根本就不存在早恋或者偷食禁果。无论什么样的年龄,只要双方喜欢,心甘情愿,任何的感情或者性行为,都是天赋人权,那是人类最大的权利,是不能被别人干涉阻止的。

    4.刘翔,居然有人觉得他应该谦虚点.已经是世界记录保持者了,如果非要在那说,不行不行,我跑的还不行.可能某些人听着心里舒服,但这样的谦虚其实是对别人更大的侮辱,这都叫不行,那你们都是残废了.

    5.文坛是个屁谁都别装逼。部分前辈们应该认真写点东西,别非黄既暴,其实内心比年轻人还骚动,别凑一起搞些什么东西假装什么坛什么圈的,什么坛到最后也都是祭坛,什么圈到最后也都是花圈。

    6.所谓脚痛踢脚,头痛踢头,另一个外援在国内联赛里眼睛又被踢残了。的确不太文明,弄不好国际社会对中国队的印象就是在原始森林海边踢椰子的一群狒狒。

    7.我几年前在电视上看到过一个广告,大意是这样的,在公共汽车上,一个老者垂头丧气,人家问,你怎么了。老头说,我得了癌。车上的售票员说,没事,我几年前也得了癌,在前面某站的一个医院治疗了,现在好了。司机接着说,是的,我的癌也是那里治好的。然后一车的乘客纷纷说,我们的癌,都是在那里治好的。

    9.上海也没什么不好,和别的城市差不多,治安很不错,经过多年发展,终于在国内出轨,和国际接轨。当然,唯一接轨的就是房价。

    10.以前老听说,做艺术搞文化就要去北京,我就给骗去了几年,可能沙尘暴堵住了鼻孔,也没嗅到有什么文化气息。

    11.不管80后是多么的粗俗,多么的幼稚,写的多么的差,以后的文学界是属于他们的,因为他们要活的更长一点,别人都死了,还剩下他们活着。这些人更加应该清高一点,一个写作的人必须要更加的清高。为什么现在的那些作家写的东西,不管是80后、70后、60后他们写的东西,没有梁实秋、鲁迅那批人写得好,是因为他们更贱,没有那些人清高。

    12.进入娱乐圈并不是长的帅就可以,你不觉得现在娱乐圈得人长得很怪吗?我觉得现在写东西的圈子是比娱乐圈更娱乐圈的圈子,总是吵来吵去的。

    13.不漂亮的女孩子撒娇成功率其实比漂亮女孩子要高,因为漂亮女孩子撒娇时男的会忍不住要多看一会儿,再在心里表决是否值得;不漂亮的女孩子撒的娇,则像我国文人学成的西方作家写作手法,总有走样的感觉;看她们撒娇,会有一种罪恶感,所以男的都会忙不迭答应,以制止其撒娇不止。

    14.其实,这世上最可畏的男人是自称不近女色的,他们只是未遇理想中的女色罢了,一旦遇上,凭着中国汉字的博大精深,"不近女色"马上会变成"不禁女色",所以,历史学科无须再追究汉字是不是仓颉所创,总之,汉字定是男人造的,而且是风流男人造的。在人看来,占着茅坑不拉屎是可恶的,其实,最可恨的却是拉完了屎还要占着等坑。

    15.有精神的人死后,精神不死;同种道理,有钱人死后,钱不死;沈万三的钱引得中外游人如织,沈厅里的人口密度正教人认识计划生育的重要性。

    16.据一个古老传说,上帝造人时,第一批出炉的人都有两个头四只手四条腿,就是现今生物学里的雌雄共体,可上帝觉得他们太聪明了,就把"火'一劈为二,成为现在的样子,于是,男人便有了搜寻靠近另一半--女人的本能。当然也不乏找错的,就是同性恋了。

    17.和女性争辩是不明智的。无论这个女性是不是明智。


    18.现在言情电视连续剧里都有这种台词"我俩单独在一起吃饭",其实从形式逻辑学来说,此话不通,两人何谓"单独"。但从神学来说,便豁然通了--两个人才能被真正意义上拼成一个人,所以"单独"。倘若一个人吃饭,充其量只是半个人。

    19.得出这么一个规律,踩着中国人的脚,不能说"对不起",要说"sorry",被害者才会原谅你,可见外文比中文值钱。你说一个sorry可抵上十声"对不起",与人民币兑美元英镑的汇率相符,足以证明语言与经济的亲密关系;而踩上外国人的脚大可不必担心,他们的脚趾和他们的财气一样粗壮,断然没有一脚踩伤的后患,说不准自己的脚底还隐隐生癌呢。

    20.街上美女很少,因为这年头,每天上一次床的美女比每天上一次街的美女多。举凡女孩子,略有姿色,都在大酒店里站着;很有姿色,都在大酒店里睡着;极有姿色,都在大酒店经理怀里躺着。偶有几个清秀脱俗的,漫步走过,极其文静。

    21.一个男子失恋以后,要么自杀,要么再恋一次爱,而第二次找对象的要求往往相近于第一个,这种心理是微妙的,比如一样东西吃得正香,突然被人抢掉,自然要千方百计再想找口味相近的--这个逻辑只适用于女方背叛或对其追求未果。若两人彼此再无感情,便不存在这种"影子恋爱",越吃越臭的东西是不必再吃一遍的。


    23.不是所有的姑娘都觉得荡自行车浪漫。当然,如果开腻了奔驰,和有钱男朋友再荡荡自行车,似乎更加浪漫。我们要明白,韩剧日剧里的女演员在美丽的乡村坐完男演员的自行车后,他们都是开奔驰宝马回城里的,不是骑自行车回去的。当然,浪漫的我们应该称之为单车。

    24.上海的美女走在街上向来目不斜视,高傲地只看前方,穿马路也不例外;上海的男人却大多目不正视,竭力搜索美女,脸上的肌肉已经被培训得可以不受大脑控制而独立行动,见到美女就会调出个笑,因为如此的关注,所以,在上海只听到车子撞老太婆,鲜闻有车子撞上美女。

    看来名气就仿佛后脑勺的头发,本人是看不见的,旁人却一目了然。

    25.男人挑女友绝不会像买菜那么随便,恨世上没有人汇集了西施的面容,梦露的身材,林激因的气质,雅典娜的智慧--不对,雅典娜的智慧是要不得的,哪个女孩子有了这种智慧,男人耍的一切花招都没用了。

    26.所谓的正书,乃是过了七月份就没用的书,所谓闲书,乃是~辈子都受用的书。"

    27.教师不吃香而家教却十分热火,可见求授知识这东西就像谈恋爱,一拖几十的就是低贱,而一对一的便是珍贵。珍贵的东西当然真贵,一个小时几十元,基本上与妓女开的是一个价。同是赚钱,教师就比妓女厉害多了。妓女赚钱,是因为妓女给了对方快乐;而教师给了对方痛苦,却照样收钱,这就是家教的伟大之处。

    28.我们当初和一群青年飙车的时候,觉得只有高速让人清醒。当时我们初涉文坛,读了很多废品,包括无数名著,神情恍惚,心里常常思考诸如"我为什么要活着","人生的意义是什么",思考得一片颓废,除了街头的烟贩子看见我们顿时精神抖擞以外,其他人看见我们都面露厌恶。我们当时觉得我们的世界完蛋了。哲学的东西看多了就是这德行,没办法。在后期我们开始觉得这个世界虚幻。其实是因为没有什么事情可以做,睡多了自然虚幻。一个人在床上的时间多了,必然觉得这个世界不真实。妓女也是一个性质的。我们像妓女一样地生活,有事没事离开不了床。在上面看天花板,觉得妈的这个世界完了,我们完了,人类完了。至于为什么完了,答案是:不知道。

    29.思想品德不及格,总比没思想好。

    30.小学偶像是比赛的对手,中学的偶像还说要起诉我。

    31.我很期待,有个实力相当的人,好好来骂我。

    32.你身在江湖,但江湖上一直没有你的传说,这也挺惨的。

    33.其实高考的压力是完全的经济压力,如果高考前一天,忽然告诉你你爹妈都死了,但是居然卖烧饼的爹妈有几个亿的遗产,我想绝大部分的人会以居高临下的姿态参加考试,并且在碰到一个诸如叫你分析"居然"和"竟然"两词除了笔画不一样多以外有什么区别之类的题目的时候高呼一声:爷不考了!


    34.叛逆的最高级就不能拿F4来说事了,看出去什么都是反的了,就算学校提倡多走楼梯有益健康都觉得不顺耳非得跳楼才满意。

    35.如果世界上所有国家的外汇储备都拿人民币来衡量,那我们就不用学习英语了,至少不用学习到那么辛苦了。

    36.真理往往是在少数人手里,而少数人必须服从多数人,到头来真理还是在多数人手里,人云亦云就是这样堆积起来的。第一个人说一番话,被第二个人听见,和他一起说,此时第三个人反对,而第四个人一看,一边有两个人而一边只有一个人,便跟着那两个人一起说。可见人多口杂的那一方不一定都有自己的想法,许多是冲着那里人多去的。

    37.我这辈子说得最让人无从反驳的话就是被子不用叠--本来就是要摊开睡的--然而这也是第一个被人反驳掉的。懂么,这就是规矩。我们之所以悲哀,是因为我们有太多规矩。

    38.如果现在这个时代能出全才,那便是应试教育的幸运和这个时代的不幸。如果有,他便是人中之王,可惜没有,所以我们只好把"全"字人下的"王"给拿掉。时代需要的只是人才。

    现在教育问题是没有人会一丝不挂去洗澡,但太多人正穿着棉袄洗澡。

    39.潮流是只能等不能追的,这和在火车站等候火车是一个道理,乖乖留在站上,总会有车来,至于刚开走的车,我们泛泛之辈是追不上的。

    40.中国看不起说大话的人。而在我看来大话并无甚,好比古代妇女缠惯了小脚,碰上正常的脚就称"大脚";中国人说惯了"小话",碰上正常的话,理所当然就叫"大话"了。敢说大话的人得不到好下场,吓得后人从不说大话变成不说话。  

    41.痛恨一个人四年比喜欢一个人四年更加厉害。喜欢只是一种惯性,痛恨却需要不断地鞭策自己才行。

    42.我生性不爱受困,常常违反班规,班主任常罚我抄班规20遍,我只好三支笔一起握。我常对人说,我的一手好字就是这么练出来的。

    43.数理化语文英语全很好,音乐体育计算机都零分,连开机都不会,我还是一个优等生。但如果我音乐体育计算机好得让人发指,葡萄牙语说得跟母语似的,但是数学英语和化学全不及格,我也是个差生。

    44.语文,"秘诀"有二:一是不看语文书;二是不看作文书
    我看书有我的原则,我不喜欢语文书、作文课,因为我仇恨这些东西赚人的钱又扼杀人的个性和创造力。我更喜欢王朔,这小子很聪明,而且很真诚。我的写作特点更像钱钟书的《围城》,因为我很欣赏他骂人骂得深刻又不露骨。

    我的小说主人公基本上没干什么事,就这么混混沌沌过着。这就是生活。为什么一定要高于生活?

    45.数学,我想我只要上到初二就够了。一个人全面发展当然好,但可能越全面发展越是个庸才。说一个人学习高等数学是为了培养逻辑能力,我觉得逻辑能力是与生俱来的东西,并不是培养出来的东西。古人不学高等数学,难道就没有逻辑能力吗?

    46.我们有理由相信,建立在爱情上的爱情是短暂的,因为爱情本身是短暂的;而建立在金钱上的爱情是永远的,因为金钱是永远的。

    47.答非所问;没有一个问题能在二十句话内解决;不论什么东西最后都要引到自己研究的领域中去,哪怕嫖娼之类的问题也是;喜欢打断别人话,不喜欢别人打断他的话;对无论什么东西都要分成几个方面去说,哪怕说的是一个道理;在否定一样东西前一定要肯定一下;在他们回答问题回答到一半的时候问他们记不记得刚才的问题是什么他们八成不记得了;偏胖;说话的时候手一定要挥舞;被逼到没辙的时候总拿自己经历过文化大革命作为比别人强的本钱,但不能解释像他这样的学术权威为什么没有被打倒;被打倒的一定要让人知道自己曾经被打倒;总结性的话都能在死掉的人写的书里找到。

    48.将一句话谨献给所有正春风得意或秋风不得意的人们,非常平凡,但你一定要坚信自己:我是金子,我要闪光的。

    49.到今年我发现转眼已经四年过去,而在序言里我也没有什么好说的,因为要说的都在正文里,只是四年来不管至今还是喜欢我的,或者痛恨我的,我觉得都很不容易。四年的执著是很大的执著,尤其是痛恨一个人四年我觉得比喜欢一个人四年更加厉害。喜欢只是一种惯性,痛恨却需要不断地鞭策自己才行。无论怎么样,我都谢谢大家能够与我一起安静或者飞驰。

    我发现我喜欢在书里感叹"多少多少年过去了"。因为我有一个丝毫没有新意的发现,时间的过去真的是很快。在我参加赛车的三年以及之前准备的两年,在我记忆只是一个拼命想往前跑的一个过程。所有能叫被叫做过程的,都是短暂的。


    50.我是很不喜欢被人拍的,就喜欢自己拍,但又不喜欢拍自己。虽然自己了解自己,但总是拍不好看,要不就是笑的特猥琐,要不就是严肃的特装逼。

    51.记得以前有一次,一记者劈头就问我一句,您是如何理解"宽容和生命"的。我就楞了半钟头。今天的采访说着说着就拧上了,开始兜圈圈,大概兜了半小时圈圈,他突然深情的望着我,说,您可真像徐静蕾。我一口水差点喷他脸上。他继续回忆,说,1999年的时候做过徐静蕾一个采访,当时就感觉不能沟通,完全是两个世界的人。我想,您怎么连25岁的徐静蕾都搞不定.

    52.郑渊洁说,他要写搏客20年,点击量上亿。这志向很远大,而且很难,需要多方面配合,20年,就算郑渊洁健在,新浪也不一定健在。

    53.还有一阵子觉得如果学会一乐器,那多么牛逼,能边演奏边唱,不幸,我鬼使神差,大脑抽筋加上经济限制,居然选择了口琴,学了半天才发现,这玩意根本不能就边吹边唱,一度情绪低落。

    54.一个钢琴弹的不错的朋友说,教我弹钢琴,我说算了。朋友说没关系,可以强行记一两个歌就行了,比如两只老虎和两只蝴蝶什么的,我想了想,觉得还是算了,一件事,弄得一知半解最没意思,要么就做一出场别人就全歇了的那种,要么还是观赏别的强人得了。如果搞半天,让人知道我会弹钢琴,但只会弹四只动物,那也太难为情了。

    55.我们要承认,有些事情,某些领域,的确不适合自己做,并且要有"老婆,和牛魔王出来看上帝"的谦逊认输品格。  

    56.我本人喜欢的是一个电影说一个情绪,哪怕它再小。某些大导演,自不量力,老企图在电影里探讨深刻的哲学问题,什么命运啊信任啊,还要扩及到全人类,乃至挖掘到远古时代。其实,人类的问题都是因人而异。这世界上存在肤浅,但不存在深刻。

    你觉得他是这样,结果他是那样,你觉得自己是那样,结果自己不是那样,这样,生活有点异样,但是没有变样,自己还那么小样,没忘记人家的模样,结果都是一样。

    在想,我们的大导演,是不是很多时候没有爱情了,很多时候没有被感动了。多年没有被感动的人,如何能拍出一个感动别人的片子呢?除了片子里的演员互相"我被你感动了"以外,我看的一头雾水。还是没有想象力啊。


    57.奇怪的大才子张洪量,写的歌好听极度好听,难听的绝对难听。有朋友说,丫的声音整个一纵欲过度。我另外一个朋友说,莫文蔚的声音绝对也是纵欲过度。终于,这两个纵欲过度的声音凑一起了,唱了一首反映都市男女纵欲过度的歌,广岛之恋。女声部很不好唱。男声部很简单。我就没见到一个能唱好女声的。就像这歌词要表达的内容一样,男人的舒坦,女人的悲惨。

    58.我从来觉得,喜欢和爱是相同的感情,就如同爸爸和爹是相同的一样。没有理由觉得喜欢是浅而爱是深。

    59.如果隔岸观火,说不定还感觉温暖,如果烧的是你仇人家,那更加温暖。如果飞蛾扑火,八成就是不好结果,扑准了,给烧死,扑大发了,把火灭了。

    60.爱情这东西,死活是个死,生活这东西,死活都得活,这两个东西一凑合,只能折腾的半死不活。

    61.我身边有朋友说,此人过气了。我想,对于音乐,对于文学,对于电影,难道一直在蹦哒又不自己做事情的家伙就叫当红,而安心做自己的事情的人就叫过气?

    62.警察很多时候是圈养的土匪,打个比方,坏蛋是狼,警察就是雪橇犬,上司就是主人,法律就是北京市宠物管理条例,括弧还是草案。

    63.善恶到头终有报,报应全是死翘翘.

    64.以前我录傻呼呼的电视节目,大家观点不同,鸡一嘴鸭一嘴的。我也说了不少话,但可能过于激烈,最后编辑的时候都被剪了,所以出来的电视节目里,大家都觉得我很酷,不说话,任凭风吹雨打,其实不是这样的。几次以后我就明白了,言多必失,说太多了肯定要被剪掉不少。所以从那以后定了个规矩,就是只录专访,录前问清楚对方节目的时间,比如节目半个小时,我就给你们半个小时时间,让你们剪。不幸的是,那样还能剪,有时候甚至再填点别的内容也能剪。于是我就再不做什么电视节目了。

    65.科技凝固了瞬间,快门凝固了狗脸。

    66.低级趣味也是趣味,娱乐自己始终不易。

    67.我们的导演,图个自己开心。

         我们的编剧,写死不能出名。

         我们的电影,最高这个水平。

         我们的观众,也就这个操行。

         我们的资方,收益基本是零。

         我们的人民,永远不能脱贫。

    68.世界上逻辑分两种,一种是逻辑,一种是中国逻辑。

    70.权力高于你尽全力捍卫的权利。

    71.大部分的现代诗其实就是把一篇三流散文拆成一句一行写,而所谓比较大师的或者先锋的就是把一篇三流散文每句句子的顺序捣乱了再拆成一句一行写

    72.所谓压力大,学习苦,名额少,全是老百姓的事情,有钱有权的人,从没有说过教育有什么不好,因为这完全是他们所不能体会的东西。

    73.现在的考试好比中国的足球,往往当事人还没发愁,旁人却替他们忧心忡忡惶蘧不已。该努力的没努力,不该努力的却拼了命的努力。  

    74.这种发行量大的报纸又没人看,还是上头强要摊牌订阅的,为官的只有在上厕所时看,然后草纸省下许多--不过正好,狗屁报纸擦狗屁股,也算门当户对。

    75.九十年代女中学生的文章仿佛是个马厮,里面尽是黑马王子和无尽的青梅竹马。

    典型不是一万个人里面一个代表,而是一万个人里面只有那么一个。

    76.前几年考重点高中成风,现在已经成疯。

    77.规矩其实是温饱以后的消遣,温饱都不能了,还要规矩吗。

    78.《圣经*所罗门之歌》中说:如果有人想用自己的所有家产换取别人的爱情,那必定受鄙夷。《圣经》显然过于神圣了,其实上面的情况不仅不应受鄙夷,还应受表扬,真正要鄙夷的应该是想用自己的爱情换取别人所有家产的人。


    79.一个医生可能一辈子称不上医学家,但一进医院就意味着你是书法家。

    82.任何失恋的女人一样,要么一生不嫁,要么嫁得飞快。

    87.有句话说"爱情是女人最好的化妆品",这话其实不对,爱情没这威力,爱情只是促使女人去买最好的化妆品,仅此而已。

    运动无极限

     

    身轻如燕阿 看来腿上也要把沙袋绑起来。

     

    腿法

     

    武当太极十三式 太极可以去研究一下

     

    这身形动作~

     

    貌似前几年就看过这个武当道长的视频 可那时候对人类身体的理解还完全没有概念 四肢、柔韧性、爆发力等等~

      几年滚打下来 对于移动、旋转时身体重心之类的才刚刚有了初步的心得 动静结合的体会也逐渐丰富起来

       现在再仔细看了道长的每个动作 真是觉得受益匪浅 尤其是一些对外界的反应变换 爆发时机的判断 身体呼吸的节奏控制等

       把自己想象成道长所处的位置 做出同样的动作 心里比之几年前 就有了可以理解的框架

       理解之下 则更为感叹此人的行云流水

         收获颇丰。

     

       收藏在这里。

     

    http://www.wdgf.cn/?action=text|wdgf|361|cn|490|423

     

    是不是有机会去武当山看一下呢 起码比少林寺那个胖主持来得真材实料些。

    一个人的生活2

    中央新闻台新闻。

    呼和浩特监狱逃了4个人 结果监狱长几天之后被免职

    台湾进口美国牛肉 引起群众不满 台湾卫生部长接受参访说 你们如果觉得不满意 那我愿意辞职

     

     

    MSN网站新闻。

    落差高达百余米

      经国家相关部门批复,三峡工程175米试验性蓄水于9月15日凌晨启动,起蓄水位为145.87米。经过39天的蓄水进程,坝前水位顺利突破170米大关。站在坝顶遥看坝上,高峡平湖美不胜收,转眼坝下,泄洪闸汹涌澎湃。

      据介绍,目前大坝上下游的水位落差已高达105米,新增库容已近160亿立方米,总库容已超过300亿立方米,已超过我国最大淡水湖鄱阳湖的汛期水量。

    加大下泄为下游“解渴”

      记者了解到,冬季枯水期为长江中下游补水是三峡工程四大综合性功能之一。自今年8月以来,长江中下游不少地区连续高温,部分地区严重伏秋连旱。湘江和赣江及境内各大河流相继出现历史最低水位,洞庭湖、鄱阳湖因境内河流来水偏少,水位一路下跌,比往年提前40天进入枯水期。

      为确保下游航道安全,缓解沿江旱情,根据长江防总19日下达的调度令,三峡集团公司逐步加大发电出力,增大下泄流量,比往年提前一个多月为下游补水。

      昨晚8时,长江上游来水入库流量为11400立方米/秒,出库下泄流量7970立方米/秒,下泄流量已远远大于原蓄水计划的6500立方米/秒。

      目前,三峡工程的生态补水效益已经显现,长江水文局昨日上午8时发布水位公告显示上看到,宜昌、沙市、城陵矶及武汉关水位均已开始转涨。其中洞庭湖水位出现了70多天来的首次上涨。

    明明就是这个大坝截了水才导致下游地区水位下跌的,还说得这么好听正好造了这个大坝这次可以为中下游补水。。

    我看着新闻真是觉得受不了了。

    竟然还说为了缓解沿江旱情~今年第一次实验性蓄水 哪里来的比往年提前一个多月?往年哪里蓄过水来?

           生态补水效益已经显现。。你明知道70多天干旱。。还蓄了39天水。。还让不让下游的老百姓活了?

    真是太无语了

    这则新闻简直白吃到顶。

     

     

     

     

     

     

     

     

    唉 突然就上班 今年整个计划都被打乱了。现在都没心思看书~~~我郁闷。。

    可是早点上班也算是件好事情吧。。只能看自己能力了,是不是能一边上班一边把试考出来。

         已经到关键时刻拉~还有半个月。加油!加油!

    今年的目标看来要打折扣了~ MCSE不知道还有没有兴趣去考。RHCE一定要搞出来!

     

     

     

    上班倒计时中

       之前要求我找工作来热身的爸爸又提出一个想法。让我一个人先住出去。

       。。一个人住就一个人住吧。都听爸爸的。其实还蛮自由 想听音乐想练琴想看书想发呆的时候 都很安静

          我要去个走出门就是淮海中路南京西路衡山路的地方 哈哈

     

       买瓶12年的Chivas、再弄瓶Baileys放在家里

       找个高点的玻璃台 上面吊个暗点的长射灯 没事就把灯全关了留这一个 坐在上面看看窗外夜景 喝喝酒也蛮开心的

             冬天 就快来了。

       弄点天然的精油 找个小炉子熏一熏 不知道能熏蚊子伐。。对了 冬天蚊子比我先去睡觉去了

       房间不大的话正好5.1可以放到房间4个角落 争取把喇叭吊起来 这个环绕效果肯定赞 哈哈

       墙上去找2幅画挂上 其余空档全敲上书架搁板 地方小~老子的书就都给我架起来 拿起来也方便 看心情随便取

       这个练琴就麻烦了 地方小估计会影响到别人~~唉 看来以后要勤于打理邻里关系了。。

             搬过去问候人家先~要问好人家的作息时间 呵呵

       马上把CPU换了 半年前还在看AM2+的接口 现在都AM3拉 价格还和之前的差不多 赚到了 :)

             弄个双核的545看看能不能把屏蔽的4核开开来

       得要找个1.5TB的硬盘换上,冬天了 准备一个人在家里捂被子 打持久战拉。片子这东西必不可少 哈哈,

             准备这个冬天把星际之门的9个季全搞定。

       恩,说到看片子 看来得自己准备个42的等离子电视~~小房子一般不会提供这样子的设备吧。。。阿~这个只能先问妈咪贷款了。。

              。。汗。。松下的等离子貌似不错,弄个120Hz刷新率的 再去配一副Nvidia的3D眼镜打WOW  噢~~太赞了

       大沙袋估计没地方挂 挂了也施展不开 算了~看看是不是有地方可以挤进一个弧形仰卧板 这个冬天就给自己定唯一个目标 六块腹肌

     

     

       额~琴、音乐、书、片子、运动、游戏、酒、香熏   恩 差不多了 这个冬天就这么对付吧。 

         

     

     

       之前在算桶装水的费用 结果发现2个月会喝掉我50个大洋~~白开水也要花这么多钱么。。疯特。看来要准备个电水壶

       想想一个人开货仓实在是不合算,烧顿饭累么累死 烧多了一个菜还要吃上好几顿 实在是不值得。

             看来这个冬天要与外卖为伍了。孤独的厨师没有前途。  或是找朋友、同事一起?

       洗衣机。。我就不换新的了吧。。到超市去买袋清洁洗衣机的东西 先给我浸上几次。。内衣内裤还是手洗一下算了。。

             有点想哭。。呵呵

       微波炉还是要准备一个

       冰箱要不要开呢~ 酒应该不用放冰箱的 反正快要入冬 只要避免阳光就好~而且也不通风  其他好像也没东西了~

             噢 对了 酸奶。。靠阿 是不是要弄个小冰柜。。

       墙不知道要不要刷一下 如果太旧或是颜色不喜欢的话就刷一下吧 反正应该不会很大的地方。

       还要布一下线  喇叭线、网线这种小房间里肯定没有的;

                         要弄几个电源开关 把几套用电的设备归一下类。灯啊、电脑、电视、功放之类的

                         以后只要一个开关就能控制一套电器。出门什么的也方便 一个开关统统报销

       要不要申请IPTV呢 还是申请数字电视? IPTV不要钱 频道还超级多 可是要签2年合约。。看不满2年要赔钱。。

                                                      数字电视明显效果好很多 可是我喜欢的游戏风云竟然算在收费套餐内打包价的。。。

                                                      算了 钱不多的话 还是数字电视吧。

       转椅和床要弄个舒服点的~唉 还得自己买个好点的枕头。

     

    恩。

     

     

       自己 安排自己的生活其实也蛮开心的     也是一定要习惯的。    

                                                                                  以后的日子

           终究还是要 一个人过。

     

        我其实还是会想你们的,休息天我会来看你们。

     

     

        明年 就给自己放个半年假吧。。暂时不给自己定其他目标了。今年实在是发生了太多事   有点累。

     

        工作的时候等休息  休息了一段时间呢 又想工作了。 就像市区住久了想去郊区陶冶陶冶 郊区住了段时间呢 又开始想念市区的繁华。

     

           人  就是这么折腾。

           活着的意义么? ~~  算了 不提也罢。 

           能够有条件这样子折腾 想怎么折腾就怎么折腾 也算是自己的幸运了吧。 可以了。

     

                                           0023547ae9c00c0170d00b

    October 21

    第一次面试

       周四奉爸爸旨意 投了几分简历。

       周五竟然接到了一个面试通知,出乎意料。

       周一去面试,恩 面试的技术经理感觉满谈得来 可惜公司太小了,应该不会考虑吧。

       周二通知复试。

       周三原来是老总来复试。

     

            和我聊了很多。

     

              说公司初期目标很宏伟 要上市 有几千万风投

              前几年突然经济不好 钱都亏光了 后来还欠了别人几百万,可还是有一个团队愿意跟着他 虽然几个月发不出工资。

              人人都说他倒闭了 可是他不信邪。带着他的团队 现在又开始恢复了。钱也还清了 公司慢慢重又走上正轨

     

              老总问我,你喜欢写作? 我在我的兴趣爱好一栏上写着。      

                 我也喜欢阿 我以前可是文学系毕业的噢 专业写作的阿。

                 。。。

              老总问我,你喜欢弹琴? 我在我的兴趣爱好一栏上写着。

                 我也喜欢弹琴阿,我以前也有学,可是经济不好那段日子实在是太忙了。

                。。。

              老总问我,女朋友有了没啊?没有啊 不错啊 一个人挺自由的 我也没结婚呢   是没结过婚阿。可不是结了又离的那种。

                 。。。。。。

              老总问我,你82年啊 属狗吧 我也属狗 比你正好大一圈噢。

                 。。。。。。

     

     

              这个老总 与众不同。

                 很酷 很帅 有魄力 有感染力

                 很感性 有艺术气息

                 坚毅下隐藏着激情 有冲劲

     

                 气场貌似很对

     

     

             老总说,“不错 我觉得你适合我这个团队。  我就冒昧帮你做个决定 来这里上班了”

     

                 脑子有些混乱,似乎完全被他吸引了。

                 可我还是说 请给我一天时间考虑吧。

                  还要理一下思路。

     

     

     

            这样子的性格肯定比我更适合作老总,可是太感性的人能把他自己的事业做到完美吗

                  我一直自认 自己不会是曹操 孙权也未必。

                    我觉得自己像陆逊。

     

     

            和他在一起工作 应该会开心吧 会和以前的朝九晚六死鱼趟水不太一样吧。

              活着么 工作也是生活的一部分      要开心

                这对我来说 就是最好的理由了

     

            好吧 人家既然给出了他觉得值得的价格 我也应该要有相应的证明给予。

                  让他相信,他的眼光没有错。

     

     

              为了开心     我冲动了   拼一枪。。  即使和想象的不一样 可是能给我这种感受 也值了。

     

     

     

            他难道是天平的?

    October 19

    鳥哥的 Linux 私房菜(转)

    地址:http://linux.vbird.org/linux_basic/0420quota.php

    这个鸟哥写的貌似很入门 收藏

     

    首页 http://linux.vbird.org/

     


     

    第十五章、磁碟配額(Quota)與進階檔案系統管理

     

    如果您的 Linux 伺服器有多個用戶經常存取資料時,為了維護所有使用者在硬碟容量的公平使用,磁碟配額 (Quota) 就是一項非常有用的工具!另外,如果你的用戶常常抱怨磁碟容量不夠用,那麼更進階的檔案系統就得要學習學習。 本章我們會介紹磁碟陣列 (RAID) 及邏輯捲軸檔案系統 (LVM),這些工具都可以幫助你管理與維護使用者可用的磁碟容量喔!

    1. 磁碟配額 (Quota) 的應用與實作
      1.1 什麼是 Quota一般用途, 限制, 規範 (inode/block, soft/hard, grace time)
      1.2 一個 Quota 的實作範例
      1.3 實作 Quota 流程-1:檔案系統支援 (/etc/fstab, /etc/mtab)
      1.4 實作 Quota 流程-2:建立 quota 記錄檔 (quotacheck)
      1.5 實作 Quota 流程-3:啟動、關閉與限制值設定 (quotaon, quotaoff, edquota)
      1.6 實作 Quota 流程-4:Quota 限制值的報表 (quota, repquota)
      1.7 實作 Quota 流程-5:測試與管理 (測試, warnquota, setquota)
      1.8 不更動既有系統的 Quota 實例
    2. 軟體磁碟陣列 (Software RAID)
      2.1 什麼是 RAIDRAID-0, RAID-1, RAID0+1, RAID-5, Spare disk
      2.2 software, hardware RAID
      2.3 軟體磁碟陣列的設定mdadm --create
      2.4 模擬 RAID 錯誤的救援模式mdadm --manage
      2.5 開機自動啟動 RAID 並自動掛載
      2.6 關閉軟體 RAID(重要!)
    3. 邏輯捲軸管理員 (Logical Volume Manager)
      3.1 什麼是 LVM: PV, PE, VG, LV 的意義
      3.2 LVM 實作流程PV 階段, VG 階段, LV 階段, 檔案系統階段
      3.3 放大 LV 容量resize2fs
      3.4 縮小 LV 容量
      3.5 LVM 的系統快照建立, 還原, 用於測試環境
      3.6 LVM 相關指令彙整與 LVM 的關閉
    4. 重點回顧
    5. 本章習題
    6. 參考資料與延伸閱讀
    7. 針對本文的建議:http://phorum.vbird.org/viewtopic.php?t=23888


    大標題的圖示磁碟配額 (Quota) 的應用與實作

    Quota 這個玩意兒就字面上的意思來看,就是有多少『限額』的意思啦!如果是用在零用錢上面, 就是類似『有多少零用錢一個月』的意思之類的。如果是在電腦主機的磁碟使用量上呢?以 Linux 來說,就是有多少容量限制的意思囉。我們可以使用 quota 來讓磁碟的容量使用較為公平, 底下我們會介紹什麼是 quota ,然後以一個完整的範例來介紹 quota 的實作喔!


    小標題的圖示什麼是 Quota

    在 Linux 系統中,由於是多人多工的環境,所以會有多人共同使用一個硬碟空間的情況發生, 如果其中有少數幾個使用者大量的佔掉了硬碟空間的話,那勢必壓縮其他使用者的使用權力! 因此管理員應該適當的限制硬碟的容量給使用者,以妥善的分配系統資源!避免有人抗議呀!

    舉例來說,我們使用者的預設家目錄都是在 /home 底下,如果 /home 是個獨立的 partition , 假設這個分割槽有 10G 好了,而 /home 底下共有 30 個帳號,也就是說,每個使用者平均應該會有 333MB 的空間才對。 偏偏有個使用者在他的家目錄底下塞了好多隻影片,佔掉了 8GB 的空間,想想看,是否造成其他正常使用者的不便呢? 如果想要讓磁碟的容量公平的分配,這個時候就得要靠 quota 的幫忙囉!


    • Quota 的一般用途

    quota 比較常使用的幾個情況是:

    • 針對 WWW server ,例如:每個人的網頁空間的容量限制!
    • 針對 mail server,例如:每個人的郵件空間限制。
    • 針對 file server,例如:每個人最大的可用網路硬碟空間 (教學環境中最常見!)

    上頭講的是針對網路服務的設計,如果是針對 Linux 系統主機上面的設定那麼使用的方向有底下這一些:

    • 限制某一群組所能使用的最大磁碟配額 (使用群組限制):
      你可以將你的主機上的使用者分門別類,有點像是目前很流行的付費與免付費會員制的情況, 你比較喜好的那一群的使用配額就可以給高一些!呵呵! ^_^...
    • 限制某一使用者的最大磁碟配額 (使用使用者限制):
      在限制了群組之後,你也可以再繼續針對個人來進行限制,使得同一群組之下還可以有更公平的分配!
    • 以 Link 的方式,來使郵件可以作為限制的配額 (更改 /var/spool/mail 這個路徑):
      如果是分為付費與免付費會員的『郵件主機系統』,是否需要重新再規劃一個硬碟呢? 也不需要啦!直接使用 Link 的方式指向 /home (或者其他已經做好的 quota 磁碟) 就可以啦! 這通常是用在原本磁碟分割的規劃不好,但是卻又不想要更動原有主機架構的情況中啊!

    大概有這些實際的用途啦!


    • Quota 的使用限制

    雖然 quota 很好用,但是使用上還是有些限制要先瞭解的:

    • 僅能針對整個 filesystem:
      quota 實際在運作的時候,是針對『整個 filesystem』進行限制的, 例如:如果你的 /dev/sda5 是掛載在 /home 底下,那麼在 /home 底下的所有目錄都會受到限制!
    • 核心必須支援 quota :
      Linux 核心必須有支援 quota 這個功能才行:如果你是使用 CentOS 5.x 的預設核心, 嘿嘿!那恭喜你了,你的系統已經預設有支援 quota 這個功能囉!如果你是自行編譯核心的, 那麼請特別留意你是否已經『真的』開啟了 quota 這個功能?否則底下的功夫將全部都視為『白工』。
    • Quota 的記錄檔:
      目前新版的 Linux distributions 使用的是 Kernel 2.6.xx 的核心版本,這個核心版本支援新的 quota 模組,使用的預設檔案 (aquota.user, aquota.group )將不同於舊版本的 quota.user, quota.group ! (多了一個 a 呦!) 而由舊版本的 quota 可以藉由 convertquota 這個程式來轉換呢!
    • 只對一般身份使用者有效:
      這就有趣了!並不是所有在 Linux 上面的帳號都可以設定 quota 呢,例如 root 就不能設定 quota , 因為整個系統所有的資料幾乎都是他的啊! ^_^

    所以囉,你不能針對『某個目錄』來進行 Quota 的設計,但你可以針對『某個檔案系統 (filesystem) 』來設定。 如果不明白目錄與掛載點還有檔案系統的關係,請回到第八章去瞧瞧再回來!


    • Quota 的規範設定項目:

    quota 這玩意兒針對整個 filesystem 的限制項目主要分為底下幾個部分:

    • 容量限制或檔案數量限制 (block 或 inode):
      我們在第八章談到檔案系統中,說到檔案系統主要規劃為存放屬性的 inode 與實際檔案資料的 block 區塊,Quota 既然是管理檔案系統,所以當然也可以管理 inode 或 block 囉! 這兩個管理的功能為:
      • 限制 inode 用量:可以管理使用者可以建立的『檔案數量』;
      • 限制 block 用量:管理使用者磁碟容量的限制,較常見為這種方式。
    • 柔性勸導與硬性規定 (soft/hard):
      既然是規範,當然就有限制值。不管是 inode/block ,限制值都有兩個,分別是 soft 與 hard。 通常 hard 限制值要比 soft 還要高。舉例來說,若限制項目為 block ,可以限制 hard 為 500MBytes 而 soft 為 400MBytes。這兩個限值的意義為:
      • hard:表示使用者的用量絕對不會超過這個限制值,以上面的設定為例, 使用者所能使用的磁碟容量絕對不會超過 500Mbytes ,若超過這個值則系統會鎖住該用戶的磁碟使用權;
      • soft:表示使用者在低於 soft 限值時 (此例中為 400Mbytes),可以正常使用磁碟,但若超過 soft 且低於 hard 的限值 (介於 400~500Mbytes 之間時),每次使用者登入系統時,系統會主動發出磁碟即將爆滿的警告訊息, 且會給予一個寬限時間 (grace time)。不過,若使用者在寬限時間倒數期間就將容量再次降低於 soft 限值之下, 則寬限時間會停止。
    • 會倒數計時的寬限時間 (grace time):
      剛剛上面就談到寬限時間了!這個寬限時間只有在使用者的磁碟用量介於 soft 到 hard 之間時,才會出現且會倒數的一個咚咚! 由於達到 hard 限值時,使用者的磁碟使用權可能會被鎖住。為了擔心使用者沒有注意到這個磁碟配額的問題, 因此設計了 soft 。當你的磁碟用量即將到達 hard 且超過 soft 時,系統會給予警告,但也會給一段時間讓使用者自行管理磁碟。 一般預設的寬限時間為七天,如果七天內你都不進行任何磁碟管理,那麼 soft 限制值會即刻取代 hard 限值來作為 quota 的限制。
      以上面設定的例子來說,假設你的容量高達 450MBytes 了,那七天的寬限時間就會開始倒數, 若七天內你都不進行任何刪除檔案的動作來替你的磁碟用量瘦身, 那麼七天後你的磁碟最大用量將變成 400MBytes (那個 soft 的限制值),此時你的磁碟使用權就會被鎖住而無法新增檔案了。

    整個 soft, hard, grace time 的相關性我們可以用底下的圖示來說明:

    soft, hard, grace time 的相關性
    圖 1.1.1、soft, hard, grace time 的相關性

    圖中的長條圖為使用者的磁碟容量,soft/hard 分別是限制值。只要小於 400M 就一切 OK , 若高於 soft 就出現 grace time 並倒數且等待使用者自行處理,若到達 hard 的限制值, 那我們就搬張小板凳等著看好戲啦!嘿嘿!^_^!這樣圖示有清楚一點了嗎?


    小標題的圖示一個 Quota 實作範例

    坐而言不如起而行啊,所以這裡我們使用一個範例來設計一下如何處理 Quota 的設定流程。

    • 目的與帳號:現在我想要讓我的專題生五個為一組,這五個人的帳號分別是 myquota1, myquota2, myquota3, myquota4, myquota5,這五個用戶的密碼都是 password ,且這五個用戶所屬的初始群組都是 myquotagrp 。 其他的帳號屬性則使用預設值。
    • 帳號的磁碟容量限制值:我想讓這五個用戶都能夠取得 300MBytes 的磁碟使用量(hard),檔案數量則不予限制。 此外,只要容量使用率超過 250MBytes ,就予以警告 (soft)。
    • 群組的限額:由於我的系統裡面還有其他用戶存在,因此我僅承認 myquotagrp 這個群組最多僅能使用 1GBytes 的容量。 這也就是說,如果 myquota1, myquota2, myquota3 都用了 280MBytes 的容量了,那麼其他兩人最多只能使用 (1000MB - 280x3 = 160MB) 的磁碟容量囉!這就是使用者與群組同時設定時會產生的後果。
    • 寬限時間的限制:最後,我希望每個使用者在超過 soft 限制值之後,都還能夠有 14 天的寬限時間。

    好了,那你怎麼規範帳號以及相關的 Quota 設定呢?首先,在這個小節我們先來將帳號相關的屬性與參數搞定再說吧!

    # 製作帳號環境時,由於有五個帳號,因此鳥哥使用 script 來建立環境!
    [root@www ~]# vi addaccount.sh
    #!/bin/bash
    # 使用 script 來建立實驗 quota 所需的環境
    groupadd myquotagrp
    for username in myquota1 myquota2 myquota3 myquota4 myquota5
    do
    	useradd -g myquotagrp $username
    	echo "password" | passwd --stdin $username
    done
    
    [root@www ~]# sh addaccount.sh
    

    接下來,就讓我們來實作 Quota 的練習吧!


    小標題的圖示實作 Quota 流程-1:檔案系統支援

    前面我們就談到,要使用 Quota 必須要核心與檔案系統支援才行!假設你已經使用了預設支援 Quota 的核心, 那麼接下來就是要啟動檔案系統的支援啦!不過,由於 Quota 僅針對整個檔案系統來進行規劃,所以我們得先查一下, /home 是否是個獨立的 filesystem 呢?

    [root@www ~]# df -h /home
    Filesystem     Size  Used Avail Use% Mounted on
    /dev/hda3      4.8G  740M  3.8G  17% /home  <==鳥哥主機的 /home 確實是獨立的!
    
    [root@www ~]# mount | grep home
    /dev/hda3 on /home type ext3 (rw)
    

    從上面的資料來看,鳥哥這部主機的 /home 確實是獨立的 filesystem,因此可以直接限制 /dev/hda3 。 如果你的系統的 /home 並非獨立的檔案系統,那麼可能就得要針對根目錄 (/) 來規範了!不過,不太建議在根目錄設定 Quota。 此外,由於 VFAT 檔案系統並不支援 Linux Quota 功能,所以我們得要使用 mount 查詢一下 /home 的檔案系統為何? 看起來是 Linux 傳統的 ext2/ext3 ,這種檔案系統肯定有支援 Quota 啦!沒問題!

    如果只是想要在這次開機中實驗 Quota ,那麼可以使用如下的方式來手動加入 quota 的支援:

    [root@www ~]# mount -o remount,usrquota,grpquota /home
    [root@www ~]# mount | grep home
    /dev/hda3 on /home type ext3 (rw,usrquota,grpquota)
    # 重點就在於 usrquota, grpquota !注意寫法!
    

    事實上,當你重新掛載時,系統會同步更新 /etc/mtab 這個檔案, 所以你必須要確定 /etc/mtab 已經加入 usrquota, grpquota 的支援到你所想要設定的檔案系統中。 另外也要特別強調,使用者與群組的 quota 檔案系統支援參數分別是:usrquota, grpquota !千萬不要寫錯了!這一點非常多初接觸 Quota 的朋友常常搞錯。

    不過手動掛載的資料在下次重新掛載就會消失,因此最好寫入設定檔中啊!在鳥哥這部主機的案例中, 我可以直接修改 /etc/fstab 成為底下這個樣子:

    [root@www ~]# vi /etc/fstab
    LABEL=/home   /home  ext3   defaults,usrquota,grpquota  1 2
    # 其他項目鳥哥並沒有列出來!重點在於第四欄位!於 default 後面加上兩個參數!
    
    [root@www ~]# umount /home
    [root@www ~]# mount -a
    [root@www ~]# mount | grep home
    /dev/hda3 on /home type ext3 (rw,usrquota,grpquota)
    

    還是要再次的強調,修改完 /etc/fstab 後,務必要測試一下!若有發生錯誤得要趕緊處理! 因為這個檔案如果修改錯誤,是會造成無法開機完全的情況啊!切記切記!最好使用 vim 來修改啦! 因為會有語法的檢驗,就不會讓你寫錯字了!啟動檔案系統的支援後,接下來讓我們建立起 quota 的記錄檔吧!


    小標題的圖示實作 Quota 流程-2:建立 quota 記錄檔

    其實 Quota 是透過分析整個檔案系統中,每個使用者(群組)擁有的檔案總數與總容量, 再將這些資料記錄在該檔案系統的最頂層目錄,然後在該記錄檔中再使用每個帳號(或群組)的限制值去規範磁碟使用量的。 所以啦,建置這個 Quota 記錄檔就顯的非常的重要。掃瞄有支援 Quota 參數 (usrquota, grpquota) 的檔案系統, 就使用 quotacheck 這個指令!這個指令的語法如下:


    • quotacheck :掃瞄檔案系統並建立 Quota 的記錄檔
    [root@www ~]# quotacheck [-avugfM] [/mount_point]
    選項與參數:
    -a  :掃瞄所有在 /etc/mtab 內,含有 quota 支援的 filesystem,加上此參數後, 
          /mount_point 可不必寫,因為掃瞄所有的 filesystem 了嘛!
    -u  :針對使用者掃瞄檔案與目錄的使用情況,會建立 aquota.user
    -g  :針對群組掃瞄檔案與目錄的使用情況,會建立 aquota.group
    -v  :顯示掃瞄過程的資訊;
    -f  :強制掃瞄檔案系統,並寫入新的 quota 設定檔 (危險)
    -M  :強制以讀寫的方式掃瞄檔案系統,只有在特殊情況下才會使用。
    

    quotacheck 的選項你只要記得『 -avug 』一起下達即可!那個 -f 與 -M 是在檔案系統可能已經啟動 quota 了, 但是你還想要重新掃瞄檔案系統時,系統會要求你加入那兩個選項啦 (擔心有其他人已經使用 quota 中)!平時沒必要不要加上那兩個項目。好了,那就讓我們來處理我們的任務吧!

    # 針對整個系統含有 usrquota, grpquota 參數的檔案系統進行 quotacheck 掃瞄
    [root@www ~]# quotacheck -avug
    quotacheck: Scanning /dev/hda3 [/home] quotacheck: Cannot stat old user quota
    file: No such file or directory <==有找到檔案系統,但尚未製作記錄檔!
    quotacheck: Cannot stat old group quota file: No such file or directory
    quotacheck: Cannot stat old user quota file: No such file or directory
    quotacheck: Cannot stat old group quota file: No such file or directory
    done  <==上面三個錯誤只是說明記錄檔尚未建立而已,可以忽略不理!
    quotacheck: Checked 130 directories and 107 files <==實際搜尋結果
    quotacheck: Old file not found.
    quotacheck: Old file not found.
    # 若執行這個指令卻出現如下的錯誤訊息,表示你沒有任何檔案系統有啟動 quota 支援!
    # quotacheck: Can't find filesystem to check or filesystem not mounted with 
    # quota option.
    
    [root@www ~]# ll -d /home/a*
    -rw------- 1 root root 8192 Mar  6 11:58 /home/aquota.group
    -rw------- 1 root root 9216 Mar  6 11:58 /home/aquota.user
    # 在鳥哥的案例中,/home 獨立的檔案系統,因此搜尋結果會將兩個記錄檔放在 
    # /home 底下。這兩個檔案就是 Quota 最重要的資訊了!
    

    這個指令只要進行到這裡就夠了,不要反覆的進行!因為等一下我們會啟動 quota 功能,若啟動後你還要進行 quotacheck , 系統會擔心破壞原有的記錄檔,所以會產生一些錯誤訊息警告你。如果你確定沒有任何人在使用 quota 時, 可以強制重新進行 quotacheck 的動作。強制執行的情況可以使用如下的選項功能:

    # 如果因為特殊需求需要強制掃瞄已掛載的檔案系統時
    [root@www ~]# quotacheck -avug -mf
    quotacheck: Scanning /dev/hda3 [/home] done
    quotacheck: Checked 130 directories and 109 files
    # 資料要簡潔很多!因為有記錄檔存在嘛!所以警告訊息不會出現!
    

    這樣記錄檔就建立起來了!你不用手動去編輯那兩個檔案~因為那兩個檔案是 quota 自己的資料檔,並不是純文字檔啦! 且該檔案會一直變動,這是因為當你對 /home 這個檔案系統進行操作時,你操作的結果會影響磁碟吧! 所以當然會同步記載到那兩個檔案中啦!所以要建立 aquota.user, aquota.group,記得使用的是 quotacheck 指令! 不是手動編輯的喔!


    小標題的圖示實作 Quota 流程-3:Quota 啟動、 關閉與限制值設定

    製作好 Quota 設定檔之後,接下來就是要啟動 quota 了!啟動的方式很簡單!使用 quotaon ,至於關閉就用 quotaoff 即可


    • quotaon :啟動 quota 的服務
    [root@www ~]# quotaon [-avug]
    [root@www ~]# quotaon [-vug] [/mount_point]
    選項與參數:
    -u  :針對使用者啟動 quota (aquota.user)
    -g  :針對群組啟動 quota (aquota.group)
    -v  :顯示啟動過程的相關訊息;
    -a  :根據 /etc/mtab 內的 filesystem 設定啟動有關的 quota ,若不加 -a 的話,
          則後面就需要加上特定的那個 filesystem 喔!
    
    # 由於我們要啟動 user/group 的 quota ,所以使用底下的語法即可
    [root@www ~]# quotaon -auvg
    /dev/hda3 [/home]: group quotas turned on
    /dev/hda3 [/home]: user quotas turned on
    
    # 特殊用法,假如你的啟動 /var 的 quota 支援,那麼僅啟動 user quota 時
    [root@www ~]# quotaon -uv /var
    

    這個『 quotaon -auvg 』的指令幾乎只在第一次啟動 quota 時才需要進行!因為下次等你重新啟動系統時, 系統的 /etc/rc.d/rc.sysinit 這個初始化腳本就會自動的下達這個指令了!因此你只要在這次實例中進行一次即可, 未來都不需要自行啟動 quota ,因為 CentOS 5.x 系統會自動幫你搞定他!


    • quotaoff :關閉 quota 的服務
    [root@www ~]# quotaoff [-a]
    [root@www ~]# quotaoff [-ug] [/mount_point]
    選項與參數:
    -a  :全部的 filesystem 的 quota 都關閉 (根據 /etc/mtab)
    -u  :僅針對後面接的那個 /mount_point 關閉 user quota
    -g  :僅針對後面接的那個 /mount_point 關閉 group quota
    

    這個指令就是關閉了 quota 的支援!我們這裡需要練習 quota 實作,所以這裡請不要關閉他喔! 接下來讓我們開始來設定使用者與群組的 quota 限額吧!


    • edquota :編輯帳號/群組的限值與寬限時間

    edquota 是 edit quota 的縮寫,所以就是用來編輯使用者或者是群組限額的指令囉。我們先來看看 edquota 的語法吧, 看完後再來實際操作一下。

    [root@www ~]# edquota [-u username] [-g groupname]
    [root@www ~]# edquota -t  <==修改寬限時間
    [root@www ~]# edquota -p 範本帳號 -u 新帳號
    選項與參數:
    -u  :後面接帳號名稱。可以進入 quota 的編輯畫面 (vi) 去設定 username 的限制值;
    -g  :後面接群組名稱。可以進入 quota 的編輯畫面 (vi) 去設定 groupname 的限制值;
    -t  :可以修改寬限時間。
    -p  :複製範本。那個 範本帳號 為已經存在並且已設定好 quota 的使用者,
          意義為『將 範本帳號 這個人的 quota 限制值複製給 新帳號 』!
    

    好了,先讓我們來看看當進入 myquota1 的限額設定時,會出現什麼畫面:

    範例一:設定 dmtsai 這個使用者的 quota 限制值
    [root@www ~]# edquota -u myquota1
    Disk quotas for user myquota1 (uid 710):
      Filesystem    blocks  soft   hard  inodes  soft  hard
      /dev/hda3         80     0      0      10     0     0
    

    上頭第一行在說明針對哪個帳號 (myquota1) 進行 quota 的限額設定,第二行則是標頭行,裡面共分為七個欄位, 七個欄位分別的意義為:

    1. 檔案系統 (filesystem):說明該限制值是針對哪個檔案系統 (或 partition);
    2. 磁碟容量 (blocks):這個數值是 quota 自己算出來的,單位為 Kbytes,請不要更動他;
    3. soft:磁碟容量 (block) 的 soft 限制值,單位亦為 KB
    4. hard:block 的 hard 限制值,單位 KB;
    5. 檔案數量 (inodes):這是 quota 自己算出來的,單位為個數,請不要更動他;
    6. soft:inode 的 soft 限制值;
    7. hard:inode 的 hard 限制值;

    當 soft/hard 為 0 時,表示沒有限制的意思。好,依據我們的範例說明,我們需要設定的是 blocks 的 soft/hard ,至於 inode 則不要去更動他!因此上述的畫面我們將他改成如下的模樣:

    Tips:
    在 edquota 的畫面中,每一行只要保持七個欄位就可以了,並不需要排列整齊的!
    鳥哥的圖示

    Disk quotas for user myquota1 (uid 710):
      Filesystem    blocks    soft    hard  inodes  soft  hard
      /dev/hda3         80  250000  300000      10     0     0
    # 鳥哥使用 1000 去近似 1024 的倍數!比較好算啦!然後就可以儲存後離開囉!
    

    設定完成之後,我們還有其他 5 個用戶要設定,由於設定值都一樣,此時可以使用 quota 複製喔!

    # 將 myquota1 的限制值複製給其他四個帳號
    [root@www ~]# edquota -p myquota1 -u myquota2
    [root@www ~]# edquota -p myquota1 -u myquota3
    [root@www ~]# edquota -p myquota1 -u myquota4
    [root@www ~]# edquota -p myquota1 -u myquota5
    

    這樣就方便多了!然後,趕緊更改一下群組的 quota 限額吧!

    [root@www ~]# edquota -g myquotagrp
    Disk quotas for group myquotagrp (gid 713):
      Filesystem    blocks    soft     hard  inodes  soft  hard
      /dev/hda3        400  900000  1000000      50     0     0
    # 記得,單位為 KB 喔!
    

    最後,將寬限時間給他改成 14 天吧!

    # 寬限時間原本為 7 天,將他改成 14 天吧!
    [root@www ~]# edquota -t
    Grace period before enforcing soft limits for users:
    Time units may be: days, hours, minutes, or seconds
      Filesystem         Block grace period     Inode grace period
      /dev/hda3                14days                  7days
    # 原本是 7days ,我們將他給改為 14days 喔!
    

    透過這個簡單的小步驟,我們已經將使用者/群組/寬限時間都設定妥當!接下來就是觀察到底設定有沒有生效啦!


    小標題的圖示實作 Quota 流程-4:Quota 限制值的報表

    quota 的報表主要有兩種模式,一種是針對每個個人或群組的 quota 指令,一個是針對整個檔案系統的 repquota 指令。 我們先從較簡單的 quota 來介紹!你也可以順道看看你的設定值對不對啊!


    • quota :單一用戶的 quota 報表
    [root@www ~]# quota [-uvs] [username]
    [root@www ~]# quota [-gvs] [groupname]
    選項與參數:
    -u  :後面可以接 username ,表示顯示出該使用者的 quota 限制值。若不接 username 
          ,表示顯示出執行者的 quota 限制值。
    -g  :後面可接 groupname ,表示顯示出該群組的 quota 限制值。
    -v  :顯示每個用戶在 filesystem 的 quota 值;
    -s  :使用 1024 為倍數來指定單位,會顯示如 M 之類的單位!
    
    # 直接使用 quota 去顯示出 myquota1 與 myquota2 的限額
    [root@www ~]# quota -uvs myquota1 myquota2
    Disk quotas for user myquota1 (uid 710):
       Filesystem  blocks  quota  limit   grace   files   quota   limit   grace
        /dev/hda3      80   245M   293M              10       0       0
    Disk quotas for user myquota2 (uid 711):
       Filesystem  blocks  quota  limit   grace   files   quota   limit   grace
        /dev/hda3      80   245M   293M              10       0       0
    # 這個指令顯示出來的資料跟 edquota 幾乎是一模一樣的!只是多了個 grace 項目。
    # 你會發現 grace 底下沒有任何資料,這是因為我們的使用量 (80) 尚未超過 soft
    
    # 顯示出 myquotagrp 的群組限額
    [root@www ~]# quota -gvs myquotagrp
    Disk quotas for group myquotagrp (gid 713):
       Filesystem  blocks  quota  limit   grace   files   quota   limit   grace
        /dev/hda3     400   879M   977M              50       0       0
    

    由於使用常見的 K, M, G 等單位比較好算,因此上頭我們使用了『 -s 』的選項,就能夠以 M 為單位顯示了。 不過由於我們使用 edquota 設定限額時,使用的是近似值 (1000) 而不是實際的 1024 倍數, 所以看起來會有點不太一樣喔!由於 quota 僅能針對某些用戶顯示報表,如果要針對整個 filesystem 列出報表時, 那個可愛的 repquota 就派上用場啦!


    • repquota :針對檔案系統的限額做報表
    [root@www ~]# repquota -a [-vugs]
    選項與參數:
    -a  :直接到 /etc/mtab 搜尋具有 quota 標誌的 filesystem ,並報告 quota 的結果;
    -v  :輸出的資料將含有 filesystem 相關的細部資訊;
    -u  :顯示出使用者的 quota 限值 (這是預設值);
    -g  :顯示出個別群組的 quota 限值。
    -s  :使用 M, G 為單位顯示結果
    
    # 查詢本案例中所有使用者的 quota 限制情況:
    [root@www ~]# repquota -auvs
    *** Report for user quotas on device /dev/hda3    <==針對 /dev/hda3
    Block grace time: 14days; Inode grace time: 7days <==block 寬限時間為 14 天
                            Block limits                File limits
    User            used    soft    hard  grace    used  soft  hard  grace
    ----------------------------------------------------------------------
    root      --    651M       0       0              5     0     0
    myquota1  --      80    245M    293M             10     0     0
    myquota2  --      80    245M    293M             10     0     0
    myquota3  --      80    245M    293M             10     0     0
    myquota4  --      80    245M    293M             10     0     0
    myquota5  --      80    245M    293M             10     0     0
    
    Statistics:  <==這是所謂的系統相關資訊,用 -v 才會顯示
    Total blocks: 9
    Data blocks: 2
    Entries: 22
    Used average: 11.000000
    

    根據這些資訊,您就可以知道目前的限制情況囉! ^_^!怎樣, Quota 很簡單吧!你可以趕緊針對你的系統設定一下磁碟使用的規則,讓你的用戶不會抱怨磁碟怎麼老是被耗光!


    小標題的圖示實作 Quota 流程-5:測試與管理

    Quota 到底有沒有效果?測試看看不就知道了?讓我們使用 myquota1 去測試看看,如果建立一個大檔案時, 整個系統會便怎樣呢?

    # 測試一:利用 myquota1 的身份,建置一個 270MB 的大檔案,並觀察 quota 結果!
    [myquota1@www ~]# dd if=/dev/zero of=bigfile bs=1M count=270
    hda3: warning, user block quota exceeded.
    270+0 records in
    270+0 records out
    283115520 bytes (283 MB) copied, 3.20282 seconds, 88.4 MB/s
    # 注意看,我是使用 myquota1 的帳號去進行 dd 指令的喔!不要惡搞啊!
    # 然後你可以發現出現一個 warning 的訊息喔!接下來看看報表。
    
    [root@www ~]# repquota -auv 
    *** Report for user quotas on device /dev/hda3
    Block grace time: 14days; Inode grace time: 7days
                            Block limits                File limits
    User            used    soft    hard  grace    used  soft  hard  grace
    ----------------------------------------------------------------------
    myquota1  +-  276840  250000  300000 13days      11     0     0
    # 這個指令則是利用 root 去查閱的!
    # 你可以發現 myquota1 的 grace 出現!並且開始倒數了!
    
    # 測試二:再建立另外一個大檔案,讓總容量超過 300M !
    [myquota1@www ~]# dd if=/dev/zero of=bigfile2 bs=1M count=300
    hda3: write failed, user block limit reached.
    dd: writing `bigfile2': Disk quota exceeded <==看!錯誤訊息不一樣了!
    23+0 records in  <==沒辦法寫入了!所以只記錄 23 筆
    22+0 records out
    23683072 bytes (24 MB) copied, 0.260081 seconds, 91.1 MB/s
    
    [myquota1@www ~]# du -sk
    300000  .  <==果然是到極限了!
    

    此時 myquota1 可以開始處理他的檔案系統了!如果不處理的話,最後寬限時間會歸零,然後出現如下的畫面:

    [root@www ~]# repquota -au
    *** Report for user quotas on device /dev/hda3
    Block grace time: 00:01; Inode grace time: 7days
                            Block limits                File limits
    User            used    soft    hard  grace    used  soft  hard  grace
    ----------------------------------------------------------------------
    myquota1  +-  300000  250000  300000   none      11     0     0
    # 倒數整個歸零,所以 grace 的部分就會變成 none 啦!不繼續倒數
    

    其實倒數歸零也不會有什麼特殊的意外啦!別擔心!只是如果你的磁碟使用量介於 soft/hard 之間時, 當倒數歸零那麼 soft 的值會變成嚴格限制,此時你就沒有多餘的容量可以使用了。如何解決? 就登入系統去刪除檔案即可啦!沒有想像中那麼可怕啦!問題是,使用者通常傻傻分不清楚到底系統出了什麼問題, 所以我們可能需要寄送一些警告信 (email) 給用戶比較妥當。那麼如何處理呢?透過 warnquota 來處置即可。


    • warnquota :對超過限額者發出警告信

    warnquota字面上的意義就是 quota 的警告 (warn) 嘛!那麼這東西有什麼用呢?他可以依據 /etc/warnquota.conf 的設定,然後找出目前系統上面 quota 用量超過 soft (就是有 grace time 出現的那些傢伙) 的帳號,透過 email 的功能將警告信件發送到使用者的電子郵件信箱。 warnquota 並不會自動執行,所以我們需要手動去執行他。單純執行『 warnquota 』之後,他會發送兩封信出去, 一封給 myquota1 一封給 root !

    [root@www ~]# warnquota
    # 完全不會出現任何訊息!沒有訊息就是『好訊息』! ^_^
    
    [root@www ~]# mail
     N329 root@www.vbird.tsai   Fri Mar  6 16:10  27/1007  "NOTE: ....
    & 329   <==因為新信件在第 329 封之故
    From root@www.vbird.tsai  Fri Mar  6 16:10:18 2009
    Date: Fri, 6 Mar 2009 16:10:17 +0800
    From: root <root@www.vbird.tsai>
    Reply-To: root@myhost.com
    Subject: NOTE: You are exceeding your allocated disk space limits
    To: myquota1@www.vbird.tsai
    Cc: root@www.vbird.tsai   <==注意這三行,分別是標題、收件者與副本 (CC)。
    
    Your disk usage has exceeded the agreed limits on this server <==問題說明
    Please delete any unnecessary files on following filesystems:
    
    /dev/hda3  <==底下這幾行為發生磁碟『爆表』的資訊啦!
                            Block limits               File limits
    Filesystem           used    soft    hard  grace    used  soft  hard  grace
    /dev/hda3      +-  300000  250000  300000 13days      12     0     0
    
    root@localhost  <==這個是警告訊息發送者的『簽名資料』啦!
    
    & exit  <==離開 mail 程式!
    

    執行 warnquota 可能也不會產生任何訊息以及信件,因為只有當使用者的 quota 有超過 soft 時, warnquota 才會發送警告信啦!那麼上表的內容中,包括標題、資訊內容說明、簽名檔等資料放在哪裡呢? 剛剛不是講過嗎? /etc/warnquota 啦!因為上述的資料是英文,不好理解嗎?沒關係,你可以自己轉成中文喔! 所以你可以這樣處理的:

    [root@www ~]# vi /etc/warnquota.conf
    # 先找到底下這幾行的設定值:
    SUBJECT   = NOTE: You are exceeding your allocated disk space limits <==第10行
    CC_TO     = "root@localhost"                                         <==第11行
    MESSAGE   = Your disk usage has exceeded the agreed limits\          <==第21行
     on this server|Please delete any unnecessary files on following filesystems:|
    SIGNATURE = root@localhost                                           <==第25行
    
    # 可以將他改成如下的模樣啊!
    SUBJECT   = 注意:你在本系統上擁有的檔案容量已經超過最大容許限額
    CC_TO     = "root@localhost"  <==除非你要寄給其他人,否則這個項目可以不改
    MESSAGE   = 你的磁碟容量已經超過本機的容許限額,|\
      請在如下的檔案系統中,刪除不必要的檔案:|
    SIGNATURE = 你的系統管理員 (root@localhost)
    # 在 MESSAGE 內的 | 代表斷行的意思,反斜線則代表連接下一行;
    

    如果你重複執行 warnquota ,那麼 myquota1 就會收到類似如下的信件內容:

    Subject: 注意:你在本系統上擁有的檔案容量已經超過最大容許限額
    To: myquota1@www.vbird.tsai
    Cc: root@www.vbird.tsai
    
    你的磁碟容量已經超過本機的容許限額,
      請在如下的檔案系統中,刪除不必要的檔案:
    
    /dev/hda3
    
    Filesystem           used    soft    hard  grace    used  soft  hard  grace
    /dev/hda3      +-  300000  250000  300000   none      11     0     0
    
    你的系統管理員 (root@localhost)
    

    不過這個方法並不適用在 /var/spool/mail 也爆表的 quota 控管中,因為如果使用者在這個 filesystem 的容量已經爆表,那麼新的信件當然就收不下來啦!此時就只能等待使用者自己發現並跑來這裡刪除資料, 或者是請求 root 幫忙處理囉!知道了這玩意兒這麼好用,那麼我們怎麼讓系統自動的執行 warnquota 呢? 你可以這樣做:

    [root@www ~]# vi /etc/cron.daily/warnquota
    /usr/sbin/warnquota
    # 你沒有看錯!只要這一行,且將執行檔以絕對路徑的方式寫入即可!
    
    [root@www ~]# chmod 755 /etc/cron.daily/warnquota
    

    那麼未來每天早上 4:02am 時,這個檔案就會主動被執行,那麼系統就能夠主動的通知磁碟配額爆表的用戶囉! 您瞧瞧!這玩意兒是否很好用啊!至於為何要寫入上述的檔案呢?留待下一章工作排程時我們再來加強介紹囉!


    • setquota :直接於指令中設定 quota 限額

    如果你想要使用 script 的方法來建立大量的帳號,並且所有的帳號都在建立時就給予 quota ,那該如何是好? 其實有兩個方法可以考慮:

    • 先建立一個原始 quota 帳號,再以『 edquota -p old -u new 』寫入 script 中;
    • 直接以 setquota 建立用戶的 quota 設定值。

    不同於 edquota 是呼叫 vi 來進行設定,setquota 直接由指令輸入所必須要的各項限制值。 他的語法有點像這樣:

    [root@www ~]# setquota [-u|-g] 名稱 block(soft) block(hard) \
    >  inode(soft) inode(hard) 檔案系統
    
    # 觀察原始的 myquota5 限值,並給予 soft/hard 分別為 100000/200000
    [root@www ~]# quota -uv myquota5
    Disk quotas for user myquota5 (uid 714): 
       Filesystem blocks  quota  limit  grace files  quota  limit  grace
        /dev/hda3     80 250000 300000           10      0      0
    
    [root@www ~]# setquota -u myquota5 100000 200000 0 0 /home
    
    [root@www ~]# quota -uv myquota5
    Disk quotas for user myquota5 (uid 714): 
       Filesystem blocks  quota  limit  grace files  quota  limit  grace
        /dev/hda3     80 100000 200000           10      0      0
    # 看吧!真的有改變過來!這就是 quota 的簡單腳本設定語法!
    

    小標題的圖示不更動既有系統的 quota 實例

    想一想,如果你的主機原先沒有想到要設定成為郵件主機,所以並沒有規劃將郵件信箱所在的 /var/spool/mail/ 目錄獨立成為一個 partition ,然後目前你的主機已經沒有辦法新增或分割出任何新的分割槽了。那我們知道 quota 是針對整個 filesystem 進行設計的,因此,你是否就無法針對 mail 的使用量給予 quota 的限制呢?

    此外,如果你想要讓使用者的郵件信箱與家目錄的總體磁碟使用量為固定,那又該如何是好? 由於 /home 及 /var/spool/mail 根本不可能是同一個 filesystem (除非是都不分割,使用根目錄,才有可能整合在一起), 所以,該如何進行這樣的 quota 限制呢?

    其實沒有那麼難啦!既然 quota 是針對整個 filesystem 來進行限制,假設你又已經有 /home 這個獨立的分割槽了, 那麼你只要:

    1. 將 /var/spool/mail 這個目錄完整的移動到 /home 底下;
    2. 利用 ln -s /home/mail /var/spool/mail 來建立連結資料;
    3. 將 /home 進行 quota 限額設定

    只要這樣的一個小步驟,嘿嘿!您家主機的郵件就有一定的限額囉!當然囉!您也可以依據不同的使用者與群組來設定 quota 然後同樣的以上面的方式來進行 link 的動作!嘿嘿嘿!就有不同的限額針對不同的使用者提出囉!很方便吧! ^_^

    Tips:
    朋友們需要注意的是,由於目前新的 distributions 大多有使用 SELinux 的機制, 因此你要進行如同上面的目錄搬移時,在許多情況下可能會有使用上的限制喔!或許你得要先暫時關閉 SELinux 才能測試, 也或許你得要自行修改 SELinux 的規則才行喔!
    鳥哥的圖示

    Linux RAID(下)


    大標題的圖示軟體磁碟陣列 (Software RAID)

    在過去鳥哥還年輕的時代,我們能使用的硬碟容量都不大,幾十 GB 的容量就是大硬碟了!但是某些情況下,我們需要很大容量的儲存空間, 例如鳥哥在跑的空氣品質模式所輸出的資料檔案一個案例通常需要好幾 GB ,連續跑個幾個案例,磁碟容量就不夠用了。 此時我該如何是好?其實可以透過一種儲存機制,稱為磁碟陣列 (RAID) 的就是了。這種機制的功能是什麼?他有哪些等級?什麼是硬體、軟體磁碟陣列?Linux 支援什麼樣的軟體磁碟陣列? 底下就讓我們來談談!


    小標題的圖示什麼是 RAID

    磁碟陣列全名是『 Redundant Arrays of Inexpensive Disks, RAID 』,英翻中的意思是:容錯式廉價磁碟陣列。 RAID 可以透過一個技術(軟體或硬體),將多個較小的磁碟整合成為一個較大的磁碟裝置; 而這個較大的磁碟功能可不止是儲存而已,他還具有資料保護的功能呢。整個 RAID 由於選擇的等級 (level) 不同,而使得整合後的磁碟具有不同的功能, 基本常見的 level 有這幾種(註1):

    • RAID-0 (等量模式, stripe):效能最佳

    這種模式如果使用相同型號與容量的磁碟來組成時,效果較佳。這種模式的 RAID 會將磁碟先切出等量的區塊 (舉例來說, 4KB), 然後當一個檔案要寫入 RAID 時,該檔案會依據區塊的大小切割好,之後再依序放到各個磁碟裡面去。由於每個磁碟會交錯的存放資料, 因此當你的資料要寫入 RAID 時,資料會被等量的放置在各個磁碟上面。舉例來說,你有兩顆磁碟組成 RAID-0 , 當你有 100MB 的資料要寫入時,每個磁碟會各被分配到 50MB 的儲存量。RAID-0 的示意圖如下所示:

     RAID-0 的磁碟寫入示意圖
    圖 2.1.1、 RAID-0 的磁碟寫入示意圖

    上圖的意思是,在組成 RAID-0 時,每顆磁碟 (Disk A 與 Disk B) 都會先被區隔成為小區塊 (chunk)。 當有資料要寫入 RAID 時,資料會先被切割成符合小區塊的大小,然後再依序一個一個的放置到不同的磁碟去。 由於資料已經先被切割並且依序放置到不同的磁碟上面,因此每顆磁碟所負責的資料量都降低了!照這樣的情況來看, 越多顆磁碟組成的 RAID-0 效能會越好,因為每顆負責的資料量就更低了! 這表示我的資料可以分散讓多顆磁碟來儲存,當然效能會變的更好啊!此外,磁碟總容量也變大了! 因為每顆磁碟的容量最終會加總成為 RAID-0 的總容量喔!

    只是使用此等級你必須要自行負擔資料損毀的風險,由上圖我們知道檔案是被切割成為適合每顆磁碟分割區塊的大小, 然後再依序放置到各個磁碟中。想一想,如果某一顆磁碟損毀了,那麼檔案資料將缺一塊,此時這個檔案就損毀了。 由於每個檔案都是這樣存放的,因此 RAID-0 只要有任何一顆磁碟損毀,在 RAID 上面的所有資料都會遺失而無法讀取。

    另外,如果使用不同容量的磁碟來組成 RAID-0 時,由於資料是一直等量的依序放置到不同磁碟中,當小容量磁碟的區塊被用完了, 那麼所有的資料都將被寫入到最大的那顆磁碟去。舉例來說,我用 200G 與 500G 組成 RAID-0 , 那麼最初的 400GB 資料可同時寫入兩顆磁碟 (各消耗 200G 的容量),後來再加入的資料就只能寫入 500G 的那顆磁碟中了。 此時的效能就變差了,因為只剩下一顆可以存放資料嘛!

    • RAID-1 (映射模式, mirror):完整備份

    這種模式也是需要相同的磁碟容量的,最好是一模一樣的磁碟啦!如果是不同容量的磁碟組成 RAID-1 時,那麼總容量將以最小的那一顆磁碟為主!這種模式主要是『讓同一份資料,完整的保存在兩顆磁碟上頭』。舉例來說,如果我有一個 100MB 的檔案,且我僅有兩顆磁碟組成 RAID-1 時, 那麼這兩顆磁碟將會同步寫入 100MB 到他們的儲存空間去。 因此,整體 RAID 的容量幾乎少了 50%。由於兩顆硬碟內容一模一樣,好像鏡子映照出來一樣, 所以我們也稱他為 mirror 模式囉~

     RAID-1 的磁碟寫入示意圖
    圖 2.1.2、 RAID-1 的磁碟寫入示意圖

    如上圖所示,一份資料傳送到 RAID-1 之後會被分為兩股,並分別寫入到各個磁碟裡頭去。 由於同一份資料會被分別寫入到其他不同磁碟,因此如果要寫入 100MB 時,資料傳送到 I/O 匯流排後會被複製多份到各個磁碟, 結果就是資料量感覺變大了!因此在大量寫入 RAID-1 的情況下,寫入的效能可能會變的非常差 (因為我們只有一個南橋啊!)。 好在如果你使用的是硬體 RAID (磁碟陣列卡) 時,磁碟陣列卡會主動的複製一份而不使用系統的 I/O 匯流排,效能方面則還可以。 如果使用軟體磁碟陣列,可能效能就不好了。

    由於兩顆磁碟內的資料一模一樣,所以任何一顆硬碟損毀時,你的資料還是可以完整的保留下來的! 所以我們可以說, RAID-1 最大的優點大概就在於資料的備份吧!不過由於磁碟容量有一半用在備份, 因此總容量會是全部磁碟容量的一半而已。雖然 RAID-1 的寫入效能不佳,不過讀取的效能則還可以啦!這是因為資料有兩份在不同的磁碟上面,如果多個 processes 在讀取同一筆資料時, RAID 會自行取得最佳的讀取平衡。

    • RAID 0+1,RAID 1+0

    RAID-0 的效能佳但是資料不安全,RAID-1 的資料安全但是效能不佳,那麼能不能將這兩者整合起來設定 RAID 呢? 可以啊!那就是 RAID 0+1 或 RAID 1+0。所謂的 RAID 0+1 就是: (1)先讓兩顆磁碟組成 RAID 0,並且這樣的設定共有兩組; (2)將這兩組 RAID 0 再組成一組 RAID 1。這就是 RAID 0+1 囉!反過來說,RAID 1+0 就是先組成 RAID-1 再組成 RAID-0 的意思。

     RAID-0+1 的磁碟寫入示意圖
    圖 2.1.3、 RAID-0+1 的磁碟寫入示意圖

    如上圖所示,Disk A + Disk B 組成第一組 RAID 0,Disk C + Disk D 組成第二組 RAID 0, 然後這兩組再整合成為一組 RAID 1。如果我有 100MB 的資料要寫入,則由於 RAID 1 的關係, 兩組 RAID 0 都會寫入 100MB,但由於 RAID 0 的關係,因此每顆磁碟僅會寫入 50MB 而已。 如此一來不論哪一組 RAID 0 的磁碟損毀,只要另外一組 RAID 0 還存在,那麼就能夠透過 RAID 1 的機制來回復資料。

    由於具有 RAID 0 的優點,所以效能得以提升,由於具有 RAID 1 的優點,所以資料得以備份。 但是也由於 RAID 1 的缺點,所以總容量會少一半用來做為備份喔!

    • RAID 5:效能與資料備份的均衡考量

    RAID-5 至少需要三顆以上的磁碟才能夠組成這種類型的磁碟陣列。這種磁碟陣列的資料寫入有點類似 RAID-0 , 不過每個循環的寫入過程中,在每顆磁碟還加入一個同位檢查資料 (Parity) ,這個資料會記錄其他磁碟的備份資料, 用於當有磁碟損毀時的救援。RAID-5 讀寫的情況有點像底下這樣:

     RAID-5 的磁碟寫入示意圖
    圖 2.1.4、 RAID-5 的磁碟寫入示意圖

    如上圖所示,每個循環寫入時,都會有部分的同位檢查碼 (parity) 被記錄起來,並且記錄的同位檢查碼每次都記錄在不同的磁碟, 因此,任何一個磁碟損毀時都能夠藉由其他磁碟的檢查碼來重建原本磁碟內的資料喔!不過需要注意的是, 由於有同位檢查碼,因此 RAID 5 的總容量會是整體磁碟數量減一顆。以上圖為例, 原本的 3 顆磁碟只會剩下 (3-1)=2 顆磁碟的容量。而且當損毀的磁碟數量大於等於兩顆時,這整組 RAID 5 的資料就損毀了。 因為 RAID 5 預設僅能支援一顆磁碟的損毀情況。

    在讀寫效能的比較上,讀取的效能還不賴!與 RAID-0 有的比!不過寫的效能就不見得能夠增加很多! 這是因為要寫入 RAID 5 的資料還得要經過計算同位檢查碼 (parity) 的關係。由於加上這個計算的動作, 所以寫入的效能與系統的硬體關係較大!尤其當使用軟體磁碟陣列時,同位檢查碼是透過 CPU 去計算而非專職的磁碟陣列卡, 因此效能方面還需要評估。

    另外,由於 RAID 5 僅能支援一顆磁碟的損毀,因此近來還有發展出另外一種等級,就是 RAID 6 ,這個 RAID 6 則使用兩顆磁碟的容量作為 parity 的儲存,因此整體的磁碟容量就會少兩顆,但是允許出錯的磁碟數量就可以達到兩顆了! 也就是在 RAID 6 的情況下,同時兩顆磁碟損毀時,資料還是可以救回來!

    • Spare Disk:預備磁碟的功能:

    當磁碟陣列的磁碟損毀時,就得要將壞掉的磁碟拔除,然後換一顆新的磁碟。換成新磁碟並且順利啟動磁碟陣列後, 磁碟陣列就會開始主動的重建 (rebuild) 原本壞掉的那顆磁碟資料到新的磁碟上!然後你磁碟陣列上面的資料就復原了! 這就是磁碟陣列的優點。不過,我們還是得要動手拔插硬碟,此時通常得要關機才能這麼做。

    為了讓系統可以即時的在壞掉硬碟時主動的重建,因此就需要預備磁碟 (spare disk) 的輔助。 所謂的 spare disk 就是一顆或多顆沒有包含在原本磁碟陣列等級中的磁碟,這顆磁碟平時並不會被磁碟陣列所使用, 當磁碟陣列有任何磁碟損毀時,則這顆 spare disk 會被主動的拉進磁碟陣列中,並將壞掉的那顆硬碟移出磁碟陣列! 然後立即重建資料系統。如此你的系統則可以永保安康啊!若你的磁碟陣列有支援熱拔插那就更完美了! 直接將壞掉的那顆磁碟拔除換一顆新的,再將那顆新的設定成為 spare disk ,就完成了!

    舉例來說,鳥哥之前所待的研究室有一個磁碟陣列可允許 16 顆磁碟的數量,不過我們只安裝了 10 顆磁碟作為 RAID 5。 每顆磁碟的容量為 250GB,我們用了一顆磁碟作為 spare disk ,並將其他的 9 顆設定為一個 RAID 5, 因此這個磁碟陣列的總容量為: (9-1)*250G=2000G。運作了一兩年後真的有一顆磁碟壞掉了,我們後來看燈號才發現! 不過對系統沒有影響呢!因為 spare disk 主動的加入支援,壞掉的那顆拔掉換顆新的,並重新設定成為 spare 後, 系統內的資料還是完整無缺的!嘿嘿!真不錯!

    • 磁碟陣列的優點

    說的口沫橫飛,重點在哪裡呢?其實你的系統如果需要磁碟陣列的話,其實重點在於:

    • 資料安全與可靠性:指的並非資訊安全,而是當硬體 (指磁碟) 損毀時,資料是否還能夠安全的救援或使用之意;
    • 讀寫效能:例如 RAID 0 可以加強讀寫效能,讓你的系統 I/O 部分得以改善;
    • 容量:可以讓多顆磁碟組合起來,故單一檔案系統可以有相當大的容量。

    尤其資料的可靠性與完整性更是使用 RAID 的考量重點!畢竟硬體壞掉換掉就好了,軟體資料損毀那可不是鬧著玩的! 所以企業界為何需要大量的 RAID 來做為檔案系統的硬體基準,現在您有點瞭解了吧?


    小標題的圖示software, hardware RAID

    為何磁碟陣列又分為硬體與軟體呢?所謂的硬體磁碟陣列 (hardware RAID) 是透過磁碟陣列卡來達成陣列的目的。 磁碟陣列卡上面有一塊專門的晶片在處理 RAID 的任務,因此在效能方面會比較好。在很多任務 (例如 RAID 5 的同位檢查碼計算) 磁碟陣列並不會重複消耗原本系統的 I/O 匯流排,理論上效能會較佳。此外目前一般的中高階磁碟陣列卡都支援熱拔插, 亦即在不關機的情況下抽換損壞的磁碟,對於系統的復原與資料的可靠性方面非常的好用。

    不過一塊好的磁碟陣列卡動不動就上萬元台幣,便宜的在主機板上面『附贈』的磁碟陣列功能可能又不支援某些高階功能, 例如低階主機板若有磁碟陣列晶片,通常僅支援到 RAID0 與 RAID1 ,鳥哥喜歡的 RAID 5 並沒有支援。 此外,作業系統也必須要擁有磁碟陣列卡的驅動程式,才能夠正確的捉到磁碟陣列所產生的磁碟機!

    由於磁碟陣列有很多優秀的功能,然而硬體磁碟陣列卡偏偏又貴的很~因此就有發展出利用軟體來模擬磁碟陣列的功能, 這就是所謂的軟體磁碟陣列 (software RAID)。軟體磁碟陣列主要是透過軟體來模擬陣列的任務, 因此會損耗較多的系統資源,比如說 CPU 的運算與 I/O 匯流排的資源等。不過目前我們的個人電腦實在已經非常快速了, 因此以前的速度限制現在已經不存在!所以我們可以來玩一玩軟體磁碟陣列!

    我們的 CentOS 提供的軟體磁碟陣列為 mdadm 這套軟體,這套軟體會以 partition 或 disk 為磁碟的單位,也就是說,你不需要兩顆以上的磁碟,只要有兩個以上的分割槽 (partition) 就能夠設計你的磁碟陣列了。此外, mdadm 支援剛剛我們前面提到的 RAID0/RAID1/RAID5/spare disk 等! 而且提供的管理機制還可以達到類似熱拔插的功能,可以線上 (檔案系統正常使用) 進行分割槽的抽換! 使用上也非常的方便呢!

    另外你必須要知道的是,硬體磁碟陣列在 Linux 底下看起來就是一顆實際的大磁碟,因此硬體磁碟陣列的裝置檔名為 /dev/sd[a-p] ,因為使用到 SCSI 的模組之故。至於軟體磁碟陣列則是系統模擬的,因此使用的裝置檔名是系統的裝置檔, 檔名為 /dev/md0, /dev/md1...,兩者的裝置檔名並不相同!不要搞混了喔!因為很多朋友常常覺得奇怪, 怎麼他的 RAID 檔名跟我們這裡測試的軟體 RAID 檔名不同,所以這裡特別強調說明喔!


    小標題的圖示軟體磁碟陣列的設定

    軟體磁碟陣列的設定很簡單呢!簡單到讓你很想笑喔!因為你只要使用一個指令即可!那就是 mdadm 這個指令。 這個指令在建立 RAID 的語法有點像這樣:

    [root@www ~]# mdadm --detail /dev/md0
    [root@www ~]# mdadm --create --auto=yes /dev/md[0-9] --raid-devices=N \
    > --level=[015] --spare-devices=N /dev/sdx /dev/hdx...
    選項與參數:
    --create :為建立 RAID 的選項;
    --auto=yes :決定建立後面接的軟體磁碟陣列裝置,亦即 /dev/md0, /dev/md1...
    --raid-devices=N :使用幾個磁碟 (partition) 作為磁碟陣列的裝置
    --spare-devices=N :使用幾個磁碟作為備用 (spare) 裝置
    --level=[015] :設定這組磁碟陣列的等級。支援很多,不過建議只要用 0, 1, 5 即可
    --detail :後面所接的那個磁碟陣列裝置的詳細資訊
    

    上面的語法中,最後面會接許多的裝置檔名,這些裝置檔名可以是整顆磁碟,例如 /dev/sdb , 也可以是分割槽,例如 /dev/sdb1 之類。不過,這些裝置檔名的總數必須要等於 --raid-devices 與 --spare-devices 的個數總和才行!鳥哥利用我的測試機來建置一個 RAID 5 的軟體磁碟陣列給您瞧瞧! 首先,將系統裡面過去練習過而目前用不到的分割槽通通刪除掉:

    [root@www ~]# fdisk -l
    Disk /dev/hda: 41.1 GB, 41174138880 bytes
    255 heads, 63 sectors/track, 5005 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/hda1   *           1          13      104391   83  Linux
    /dev/hda2              14        1288    10241437+  83  Linux
    /dev/hda3            1289        1925     5116702+  83  Linux
    /dev/hda4            1926        5005    24740100    5  Extended
    /dev/hda5            1926        2052     1020096   82  Linux swap / Solaris
    /dev/hda6            2053        2302     2008093+  83  Linux
    /dev/hda7            2303        2334      257008+  82  Linux swap / Solaris
    /dev/hda8            2335        2353      152586   83  Linux
    /dev/hda9            2354        2366      104391   83  Linux
    
    [root@www ~]# df
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/hda2              9920624   3858800   5549756  42% /
    /dev/hda1               101086     21408     74459  23% /boot
    tmpfs                   371332         0    371332   0% /dev/shm
    /dev/hda3              4956316   1056996   3643488  23% /home
    # 從上面可以發現,我的 /dev/hda6~/dev/hda9 沒有用到!將他刪除看看!
    
    [root@www ~]# fdisk /dev/hda
    Command (m for help): d
    Partition number (1-9): 9
    
    Command (m for help): d
    Partition number (1-8): 8
    
    Command (m for help): d
    Partition number (1-7): 7
    
    Command (m for help): d
    Partition number (1-6): 6
    
    Command (m for help): p
    
    Disk /dev/hda: 41.1 GB, 41174138880 bytes
    255 heads, 63 sectors/track, 5005 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/hda1   *           1          13      104391   83  Linux
    /dev/hda2              14        1288    10241437+  83  Linux
    /dev/hda3            1289        1925     5116702+  83  Linux
    /dev/hda4            1926        5005    24740100    5  Extended
    /dev/hda5            1926        2052     1020096   82  Linux swap / Solaris
    
    Command (m for help): w
    
    [root@www ~]# partprobe
    # 這個動作很重要!還記得吧!將核心的 partition table 更新!
    

    底下是鳥哥希望做成的 RAID 5 環境:

    • 利用 4 個 partition 組成 RAID 5;
    • 每個 partition 約為 1GB 大小,需確定每個 partition 一樣大較佳;
    • 利用 1 個 partition 設定為 spare disk
    • 這個 spare disk 的大小與其他 RAID 所需 partition 一樣大!
    • 將此 RAID 5 裝置掛載到 /mnt/raid 目錄下

    最終我需要 5 個 1GB 的 partition 。由於鳥哥的系統僅有一顆磁碟,這顆磁碟剩餘容量約 20GB 是夠用的, 分割槽代號僅使用到 5 號,所以要製作成 RAID 5 應該是不成問題!接下來就是連續的建置流程囉!


    • 建置所需的磁碟裝置

    如前所述,我需要 5 個 1GB 的分割槽,請利用 fdisk 來建置吧!

    [root@www ~]# fdisk /dev/hda
    Command (m for help): n
    First cylinder (2053-5005, default 2053): <==直接按下 [enter]
    Using default value 2053
    Last cylinder or +size or +sizeM or +sizeK (2053-5005, default 5005): +1000M
    # 上述的動作請作五次!
    
    Command (m for help): p
    
    Disk /dev/hda: 41.1 GB, 41174138880 bytes
    255 heads, 63 sectors/track, 5005 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/hda1   *           1          13      104391   83  Linux
    /dev/hda2              14        1288    10241437+  83  Linux
    /dev/hda3            1289        1925     5116702+  83  Linux
    /dev/hda4            1926        5005    24740100    5  Extended
    /dev/hda5            1926        2052     1020096   82  Linux swap / Solaris
    /dev/hda6            2053        2175      987966   83  Linux
    /dev/hda7            2176        2298      987966   83  Linux
    /dev/hda8            2299        2421      987966   83  Linux
    /dev/hda9            2422        2544      987966   83  Linux
    /dev/hda10           2545        2667      987966   83  Linux
    # 上面的 6~10 號,就是我們需要的 partition 囉!
    
    Command (m for help): w
    
    [root@www ~]# partprobe
    

    • 以 mdadm 建置 RAID

    接下來就簡單啦!透過 mdadm 來建立磁碟陣列先!

    [root@www ~]# mdadm --create --auto=yes /dev/md0 --level=5 \
    > --raid-devices=4 --spare-devices=1 /dev/hda{6,7,8,9,10}
    # 詳細的參數說明請回去前面看看囉!這裡我透過 {} 將重複的項目簡化!
    
    [root@www ~]# mdadm --detail /dev/md0
    /dev/md0:                                        <==RAID 裝置檔名
            Version : 00.90.03
      Creation Time : Tue Mar 10 17:47:51 2009       <==RAID 被建立的時間
         Raid Level : raid5                          <==RAID 等級為 RAID 5
         Array Size : 2963520 (2.83 GiB 3.03 GB)     <==此 RAID 的可用磁碟容量
      Used Dev Size : 987840 (964.85 MiB 1011.55 MB) <==每個裝置的可用容量
       Raid Devices : 4                              <==用作 RAID 的裝置數量
      Total Devices : 5                              <==全部的裝置數量
    Preferred Minor : 0
        Persistence : Superblock is persistent
    
        Update Time : Tue Mar 10 17:52:23 2009
              State : clean
     Active Devices : 4                              <==啟動的(active)裝置數量
    Working Devices : 5                              <==可動作的裝置數量
     Failed Devices : 0                              <==出現錯誤的裝置數量
      Spare Devices : 1                              <==預備磁碟的數量
    
             Layout : left-symmetric
         Chunk Size : 64K      <==就是圖2.1.4內的小區塊
    
               UUID : 7c60c049:57d60814:bd9a77f1:57e49c5b <==此裝置(RAID)識別碼
             Events : 0.2
    
        Number   Major   Minor   RaidDevice State
           0       3        6        0      active sync   /dev/hda6
           1       3        7        1      active sync   /dev/hda7
           2       3        8        2      active sync   /dev/hda8
           3       3        9        3      active sync   /dev/hda9
    
           4       3       10        -      spare   /dev/hda10
    # 最後五行就是這五個裝置目前的情況,包括四個 active sync 一個 spare !
    # 至於 RaidDevice  指的則是此 RAID 內的磁碟順序
    

    由於磁碟陣列的建置需要一些時間,所以你最好等待數分鐘後再使用『 mdadm --detail /dev/md0 』去查閱你的磁碟陣列詳細資訊! 否則有可能看到某些磁碟正在『spare rebuilding』之類的建置字樣!透過上面的指令, 你就能夠建立一個 RAID5 且含有一顆 spare disk 的磁碟陣列囉!非常簡單吧! 除了指令之外,你也可以查閱如下的檔案來看看系統軟體磁碟陣列的情況:

    [root@www ~]# cat /proc/mdstat
    Personalities : [raid6] [raid5] [raid4]
    md0 : active raid5 hda9[3] hda10[4](S) hda8[2] hda7[1] hda6[0]    <==第一行
          2963520 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU] <==第二行
    
    unused devices: <none>
    

    上述的資料比較重要的在特別指出的第一行與第二行部分(註2):

    • 第一行部分:指出 md0 為 raid5 ,且使用了 hda9, hda8, hda7, hda6 等四顆磁碟裝置。每個裝置後面的中括號 [] 內的數字為此磁碟在 RAID 中的順序 (RaidDevice);至於 hda10 後面的 [S] 則代表 hda10 為 spare 之意。
    • 第二行:此磁碟陣列擁有 2963520 個block(每個 block 單位為 1K),所以總容量約為 3GB, 使用 RAID 5 等級,寫入磁碟的小區塊 (chunk) 大小為 64K,使用 algorithm 2 磁碟陣列演算法。 [m/n] 代表此陣列需要 m 個裝置,且 n 個裝置正常運作。因此本 md0 需要 4 個裝置且這 4 個裝置均正常運作。 後面的 [UUUU] 代表的是四個所需的裝置 (就是 [m/n] 裡面的 m) 的啟動情況,U 代表正常運作,若為 _ 則代表不正常。

    這兩種方法都可以知道目前的磁碟陣列狀態啦!


    • 格式化與掛載使用 RAID

    接下來就是開始使用格式化工具啦!這部分就簡單到爆!不多說了,直接進行吧!

    [root@www ~]# mkfs -t ext3 /dev/md0
    # 有趣吧!是 /dev/md0 做為裝置被格式化呢!
    
    [root@www ~]# mkdir /mnt/raid
    [root@www ~]# mount /dev/md0 /mnt/raid
    [root@www ~]# df
    Filesystem     1K-blocks      Used Available Use% Mounted on
    /dev/hda2        9920624   3858820   5549736  42% /
    /dev/hda1         101086     21408     74459  23% /boot
    tmpfs             371332         0    371332   0% /dev/shm
    /dev/hda3        4956316   1056996   3643488  23% /home
    /dev/md0         2916920     69952   2698792   3% /mnt/raid
    # 看吧!多了一個 /dev/md0 的裝置,而且真的可以讓你使用呢!還不賴!
    

    小標題的圖示模擬 RAID 錯誤的救援模式

    俗話說『天有不測風雲、人有旦夕禍福』,誰也不知道你的磁碟陣列內的裝置啥時會出差錯,因此, 瞭解一下軟體磁碟陣列的救援還是必須的!底下我們就來玩一玩救援的機制吧!首先來瞭解一下 mdadm 這方面的語法:

    [root@www ~]# mdadm --manage /dev/md[0-9] [--add 裝置] [--remove 裝置] \
    > [--fail 裝置] 
    選項與參數:
    --add :會將後面的裝置加入到這個 md 中!
    --remove :會將後面的裝置由這個 md 中移除
    --fail :會將後面的裝置設定成為出錯的狀態
    

    • 設定磁碟為錯誤 (fault)

    首先,我們來處理一下,該如何讓一個磁碟變成錯誤,然後讓 spare disk 自動的開始重建系統呢?

    # 0. 先複製一些東西到 /mnt/raid 去,假設這個 RAID 已經在使用了
    [root@www ~]# cp -a /etc /var/log /mnt/raid
    [root@www ~]# df /mnt/raid ; du -sm /mnt/raid/*
    Filesystem   1K-blocks      Used Available Use% Mounted on
    /dev/md0       2916920    188464   2580280   7% /mnt/raid
    118     /mnt/raid/etc <==看吧!確實有資料在裡面喔!
    8       /mnt/raid/log
    1       /mnt/raid/lost+found
    
    # 1. 假設 /dev/hda8 這個裝置出錯了!實際模擬的方式:
    [root@www ~]# mdadm --manage /dev/md0 --fail /dev/hda8
    mdadm: set /dev/hda8 faulty in /dev/md0
    
    [root@www ~]# mdadm --detail /dev/md0
    ....(前面省略)....
              State : clean, degraded, recovering
     Active Devices : 3
    Working Devices : 4
     Failed Devices : 1  <==出錯的磁碟有一個!
      Spare Devices : 1
    ....(中間省略)....
        Number   Major   Minor   RaidDevice State
           0       3        6        0      active sync   /dev/hda6
           1       3        7        1      active sync   /dev/hda7
           4       3       10        2      spare rebuilding   /dev/hda10
           3       3        9        3      active sync   /dev/hda9
    
           5       3        8        -      faulty spare   /dev/hda8
    # 看到沒!這的動作要快做才會看到! /dev/hda10 啟動了而 /dev/hda8 死掉了
    
    [root@www ~]# cat /proc/mdstat
    Personalities : [raid6] [raid5] [raid4]
    md0 : active raid5 hda9[3] hda10[4] hda8[5](F) hda7[1] hda6[0]
          2963520 blocks level 5, 64k chunk, algorithm 2 [4/3] [UU_U]
          [>.......]  recovery =  0.8% (9088/987840) finish=14.3min speed=1136K/sec
    

    上面的畫面你得要快速的連續輸入那些 mdadm 的指令才看的到!因為你的 RAID 5 正在重建系統! 若你等待一段時間再輸入後面的觀察指令,則會看到如下的畫面了:

    # 2. 已經藉由 spare disk 重建完畢的 RAID 5 情況
    [root@www ~]# mdadm --detail /dev/md0
    ....(前面省略)....
        Number   Major   Minor   RaidDevice State
           0       3        6        0      active sync   /dev/hda6
           1       3        7        1      active sync   /dev/hda7
           2       3       10        2      active sync   /dev/hda10
           3       3        9        3      active sync   /dev/hda9
    
           4       3        8        -      faulty spare   /dev/hda8
    
    [root@www ~]# cat /proc/mdstat
    Personalities : [raid6] [raid5] [raid4]
    md0 : active raid5 hda9[3] hda10[2] hda8[4](F) hda7[1] hda6[0]
          2963520 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU]
    

    看吧!又恢復正常了!真好!我們的 /mnt/raid 檔案系統是完整的!並不需要卸載!很棒吧!


    • 將出錯的磁碟移除並加入新磁碟

    首先,我們再建立一個新的分割槽,這個分割槽要與其他分割槽一樣大才好!然後再利用 mdadm 移除錯誤的並加入新的!

    # 3. 建立新的分割槽
    [root@www ~]# fdisk /dev/hda
    Command (m for help): n
    First cylinder (2668-5005, default 2668): <==這裡按 [enter]
    Using default value 2668
    Last cylinder or +size or +sizeM or +sizeK (2668-5005, default 5005): +1000M
    
    Command (m for help): w
    
    [root@www ~]# partprobe
    # 此時系統會多一個 /dev/hda11 的分割槽喔!
    
    # 4. 加入新的拔除有問題的磁碟
    [root@www ~]# mdadm --manage /dev/md0 --add /dev/hda11 --remove /dev/hda8
    mdadm: added /dev/hda11
    mdadm: hot removed /dev/hda8
    
    [root@www ~]# mdadm --detail /dev/md0
    ....(前面省略)....
           0       3        6        0      active sync   /dev/hda6
           1       3        7        1      active sync   /dev/hda7
           2       3       10        2      active sync   /dev/hda10
           3       3        9        3      active sync   /dev/hda9
    
           4       3       11        -      spare   /dev/hda11
    

    嘿嘿!你的磁碟陣列內的資料不但一直存在,而且你可以一直順利的運作 /mnt/raid 內的資料,即使 /dev/hda8 損毀了!然後透過管理的功能就能夠加入新磁碟且拔除壞掉的磁碟!注意,這一切都是在上線 (on-line) 的情況下進行! 所以,您說這樣的咚咚好不好用啊! ^_^


    小標題的圖示開機自動啟動 RAID 並自動掛載

    新的 distribution 大多會自己搜尋 /dev/md[0-9] 然後在開機的時候給予設定好所需要的功能。不過鳥哥還是建議你, 修改一下設定檔吧! ^_^。software RAID 也是有設定檔的,這個設定檔在 /etc/mdadm.conf !這個設定檔內容很簡單, 你只要知道 /dev/md0 的 UUID 就能夠設定這個檔案啦!這裡鳥哥僅介紹他最簡單的語法:

    [root@www ~]# mdadm --detail /dev/md0 | grep -i uuid
            UUID : 7c60c049:57d60814:bd9a77f1:57e49c5b
    # 後面那一串資料,就是這個裝置向系統註冊的 UUID 識別碼!
    
    # 開始設定 mdadm.conf
    [root@www ~]# vi /etc/mdadm.conf
    ARRAY /dev/md0 UUID=7c60c049:57d60814:bd9a77f1:57e49c5b
    #     RAID裝置      識別碼內容
    
    # 開始設定開機自動掛載並測試
    [root@www ~]# vi /etc/fstab
    /dev/md0    /mnt/raid    ext3    defaults     1 2
    
    [root@www ~]# umount /dev/md0; mount -a
    [root@www ~]# df /mnt/raid
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/md0               2916920    188464   2580280   7% /mnt/raid
    # 你得確定可以順利掛載,並且沒有發生任何錯誤!
    

    如果到這裡都沒有出現任何問題!接下來就請 reboot 你的系統並等待看看能否順利的啟動吧! ^_^


    小標題的圖示關閉軟體 RAID(重要!)

    除非你未來就是要使用這顆 software RAID (/dev/md0),否則你勢必要跟鳥哥一樣,將這個 /dev/md0 關閉! 因為他畢竟是我們在這個測試機上面的練習裝置啊!為什麼要關掉他呢?因為這個 /dev/md0 其實還是使用到我們系統的磁碟分割槽, 在鳥哥的例子裡面就是 /dev/hda{6,7,8,9,10,11},如果你只是將 /dev/md0 卸載,然後忘記將 RAID 關閉, 結果就是....未來你在重新分割 /dev/hdaX 時可能會出現一些莫名的錯誤狀況啦!所以才需要關閉 software RAID 的步驟! 那如何關閉呢?也是簡單到爆炸!(請注意,確認你的 /dev/md0 確實不要用且要關閉了才進行底下的玩意兒)

    # 1. 先卸載且刪除設定檔內與這個 /dev/md0 有關的設定:
    [root@www ~]# umount /dev/md0
    [root@www ~]# vi /etc/fstab
    /dev/md0    /mnt/raid     ext3    defaults      1 2
    # 將這一行刪除掉!或者是註解掉也可以!
    
    # 2. 直接關閉 /dev/md0 的方法!
    [root@www ~]# mdadm --stop /dev/md0
    mdadm: stopped /dev/md0  <==不囉唆!這樣就關閉了!
    
    [root@www ~]# cat /proc/mdstat
    Personalities : [raid6] [raid5] [raid4]
    unused devices: <none>  <==看吧!確實不存在任何陣列裝置!
    
    [root@www ~]# vi /etc/mdadm.conf
    ARRAY /dev/md0 UUID=7c60c049:57d60814:bd9a77f1:57e49c5b
    # 一樣啦!刪除他或是註解他!
    

    Tips:
    在這個練習中,鳥哥使用同一顆磁碟進行軟體 RAID 的實驗。不過朋友們要注意的是,如果真的要實作軟體磁碟陣列, 最好是由多顆不同的磁碟來組成較佳!因為這樣才能夠使用到不同磁碟的讀寫,效能才會好! 而資料分配在不同的磁碟,當某顆磁碟損毀時資料才能夠藉由其他磁碟挽救回來!這點得特別留意呢!
    鳥哥的圖示


    大標題的圖示邏輯捲軸管理員 (Logical Volume Manager)

    想像一個情況,你在當初規劃主機的時候將 /home 只給他 50G ,等到使用者眾多之後導致這個 filesystem 不夠大, 此時你能怎麼作?多數的朋友都是這樣:再加一顆新硬碟,然後重新分割、格式化,將 /home 的資料完整的複製過來, 然後將原本的 partition 卸載重新掛載新的 partition 。啊!好忙碌啊!若是第二次分割卻給的容量太多!導致很多磁碟容量被浪費了! 你想要將這個 partition 縮小時,又該如何作?將上述的流程再搞一遍!唉~煩死了,尤其複製很花時間ㄟ~有沒有更簡單的方法呢? 有的!那就是我們這個小節要介紹的 LVM 這玩意兒!

    LVM 的重點在於『可以彈性的調整 filesystem 的容量!』而並非在於效能與資料保全上面。 需要檔案的讀寫效能或者是資料的可靠性,請參考前面的 RAID 小節。 LVM 可以整合多個實體 partition 在一起, 讓這些 partitions 看起來就像是一個磁碟一樣!而且,還可以在未來新增或移除其他的實體 partition 到這個 LVM 管理的磁碟當中。 如此一來,整個磁碟空間的使用上,實在是相當的具有彈性啊! 既然 LVM 這麼好用,那就讓我們來瞧瞧這玩意吧!


    小標題的圖示什麼是 LVM: PV, PE, VG, LV 的意義

    LVM 的全名是 Logical Volume Manager,中文可以翻譯作邏輯捲軸管理員。之所以稱為『捲軸』可能是因為可以將 filesystem 像捲軸一樣伸長或縮短之故吧!LVM 的作法是將幾個實體的 partitions (或 disk) 透過軟體組合成為一塊看起來是獨立的大磁碟 (VG) ,然後將這塊大磁碟再經過分割成為可使用分割槽 (LV), 最終就能夠掛載使用了。但是為什麼這樣的系統可以進行 filesystem 的擴充或縮小呢?其實與一個稱為 PE 的項目有關! 底下我們就得要針對這幾個項目來好好聊聊!

    • Physical Volume, PV, 實體捲軸

    我們實際的 partition 需要調整系統識別碼 (system ID) 成為 8e (LVM 的識別碼),然後再經過 pvcreate 的指令將他轉成 LVM 最底層的實體捲軸 (PV) ,之後才能夠將這些 PV 加以利用! 調整 system ID 的方是就是透過 fdisk 啦!

    • Volume Group, VG, 捲軸群組

    所謂的 LVM 大磁碟就是將許多 PV 整合成這個 VG 的東西就是啦!所以 VG 就是 LVM 組合起來的大磁碟!這麼想就好了。 那麼這個大磁碟最大可以到多少容量呢?這與底下要說明的 PE 有關喔~因為每個 VG 最多僅能包含 65534 個 PE 而已。 如果使用 LVM 預設的參數,則一個 VG 最大可達 256GB 的容量啊!(參考底下的 PE 說明)

    • Physical Extend, PE, 實體延伸區塊

    LVM 預設使用 4MB 的 PE 區塊,而 LVM 的 VG 最多僅能含有 65534 個 PE ,因此預設的 LVM VG 會有 4M*65534/(1024M/G)=256G。 這個 PE 很有趣喔!他是整個 LVM 最小的儲存區塊,也就是說,其實我們的檔案資料都是藉由寫入 PE 來處理的。 簡單的說,這個 PE 就有點像檔案系統裡面的 block 大小啦。 這樣說應該就比較好理解了吧?所以調整 PE 會影響到 VG 的最大容量喔!

    • Logical Volume, LV, 邏輯捲軸

    最終的 VG 還會被切成 LV,這個 LV 就是最後可以被格式化使用的類似分割槽的咚咚了!那麼 LV 是否可以隨意指定大小呢? 當然不可以!既然 PE 是整個 LVM 的最小儲存單位,那麼 LV 的大小就與在此 LV 內的 PE 總數有關。 為了方便使用者利用 LVM 來管理其系統,因此 LV 的裝置檔名通常指定為『 /dev/vgname/lvname 』的樣式!

    此外,我們剛剛有談到 LVM 可彈性的變更 filesystem 的容量,那是如何辦到的?其實他就是透過『交換 PE 』來進行資料轉換, 將原本 LV 內的 PE 移轉到其他裝置中以降低 LV 容量,或將其他裝置的 PE 加到此 LV 中以加大容量! VG、LV 與 PE 的關係有點像下圖:

    PE 與 VG 的相關性圖示
    圖 3.1.1、PE 與 VG 的相關性圖示

    如上圖所示,VG 內的 PE 會分給虛線部分的 LV,如果未來這個 VG 要擴充的話,加上其他的 PV 即可。 而最重要的 LV 如果要擴充的話,也是透過加入 VG 內沒有使用到的 PE 來擴充的!

    • 實作流程

    透過 PV, VG, LV 的規劃之後,再利用 mkfs 就可以將你的 LV 格式化成為可以利用的檔案系統了!而且這個檔案系統的容量在未來還能夠進行擴充或減少, 而且裡面的資料還不會被影響!實在是很『福氣啦!』那實作方面要如何進行呢?很簡單呢! 整個流程由基礎到最終的結果可以這樣看:

    LVM 各元件的實現流程圖示
    圖 3.1.2、 LVM 各元件的實現流程圖示

    如此一來,我們就可以利用 LV 這個玩意兒來進行系統的掛載了。不過,你應該要覺得奇怪的是,那麼我的資料寫入這個 LV 時,到底他是怎麼寫入硬碟當中的? 呵呵!好問題~其實,依據寫入機制的不同,而有兩種方式:

    • 線性模式 (linear):假如我將 /dev/hda1, /dev/hdb1 這兩個 partition 加入到 VG 當中,並且整個 VG 只有一個 LV 時,那麼所謂的線性模式就是:當 /dev/hda1 的容量用完之後,/dev/hdb1 的硬碟才會被使用到, 這也是我們所建議的模式。
    • 交錯模式 (triped):那什麼是交錯模式?很簡單啊,就是我將一筆資料拆成兩部分,分別寫入 /dev/hda1 與 /dev/hdb1 的意思,感覺上有點像 RAID 0 啦!如此一來,一份資料用兩顆硬碟來寫入,理論上,讀寫的效能會比較好。

    基本上,LVM 最主要的用處是在實現一個可以彈性調整容量的檔案系統上, 而不是在建立一個效能為主的磁碟上,所以,我們應該利用的是 LVM 可以彈性管理整個 partition 大小的用途上,而不是著眼在效能上的。因此, LVM 預設的讀寫模式是線性模式啦! 如果你使用 triped 模式,要注意,當任何一個 partition 『歸天』時,所有的資料都會『損毀』的! 所以啦,不是很適合使用這種模式啦!如果要強調效能與備份,那麼就直接使用 RAID 即可, 不需要用到 LVM 啊!


    小標題的圖示LVM 實作流程

    LVM 必需要核心有支援且需要安裝 lvm2 這個軟體,好佳在的是, CentOS 與其他較新的 distributions 已經預設將 lvm 的支援與軟體都安裝妥當了!所以你不需要擔心這方面的問題!用就對了!

    鳥哥使用的測試機又要出動了喔!剛剛我們才練習過 RAID,必須要將一堆目前沒有用到的分割槽先殺掉, 然後再重建新的分割槽。並且由於鳥哥僅有一個 40GB 的磁碟,所以底下的練習都僅針對同一顆磁碟來作的。 我的要求有點像這樣:

    • 先分割出 4 個 partition ,每個 partition 的容量均為 1.5GB 左右,且 system ID 需要為 8e;
    • 全部的 partition 整合成為一個 VG,VG 名稱設定為 vbirdvg;且 PE 的大小為 16MB;
    • 全部的 VG 容量都丟給 LV ,LV 的名稱設定為 vbirdlv;
    • 最終這個 LV 格式化為 ext3 的檔案系統,且掛載在 /mnt/lvm 中

    鳥哥就不仔細的介紹實體分割了,請您自行參考第八章的 fdisk 來達成底下的範例:(注意:修改系統識別碼請使用 t 這個 fdisk 內的指令來處理即可)

    [root@www ~]# fdisk /dev/hda  <==其他流程請自行參考第八章處理
    [root@www ~]# partprobe       <==別忘記這個動作了!粉重要!
    [root@www ~]# fdisk -l
    Disk /dev/hda: 41.1 GB, 41174138880 bytes
    255 heads, 63 sectors/track, 5005 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/hda1   *           1          13      104391   83  Linux
    /dev/hda2              14        1288    10241437+  83  Linux
    /dev/hda3            1289        1925     5116702+  83  Linux
    /dev/hda4            1926        5005    24740100    5  Extended
    /dev/hda5            1926        2052     1020096   82  Linux swap / Solaris
    /dev/hda6            2053        2235     1469916   8e  Linux LVM
    /dev/hda7            2236        2418     1469916   8e  Linux LVM
    /dev/hda8            2419        2601     1469916   8e  Linux LVM
    /dev/hda9            2602        2784     1469916   8e  Linux LVM
    

    上面的 /dev/hda{6,7,8,9} 這四個分割槽就是我們的實體分割槽!也就是底下會實際用到的資訊! 注意看,那個 8e 的出現會導致 system 變成『 Linux LVM 』哩!其實沒有設定成為 8e 也沒關係, 不過某些 LVM 的偵測指令可能會偵測不到該 partition 就是了!接下來,就一個一個的處理各流程吧!


    • PV 階段

    要建立 PV 其實很簡單,只要直接使用 pvcreate 即可!我們來談一談與 PV 有關的指令吧!

    • pvcreate :將實體 partition 建立成為 PV ;
    • pvscan :搜尋目前系統裡面任何具有 PV 的磁碟;
    • pvdisplay :顯示出目前系統上面的 PV 狀態;
    • pvremove :將 PV 屬性移除,讓該 partition 不具有 PV 屬性。

    那就直接來瞧一瞧吧!

    # 1. 檢查有無 PV 在系統上,然後將 /dev/hda6~/dev/hda9 建立成為 PV 格式
    [root@www ~]# pvscan
      No matching physical volumes found <==找不到任何的 PV 存在喔!
    
    [root@www ~]# pvcreate /dev/hda{6,7,8,9}
      Physical volume "/dev/hda6" successfully created
      Physical volume "/dev/hda7" successfully created
      Physical volume "/dev/hda8" successfully created
      Physical volume "/dev/hda9" successfully created
    # 這個指令可以一口氣建立這四個 partition 成為 PV 啦!注意大括號的用途
    
    [root@www ~]# pvscan
      PV /dev/hda6         lvm2 [1.40 GB]
      PV /dev/hda7         lvm2 [1.40 GB]
      PV /dev/hda8         lvm2 [1.40 GB]
      PV /dev/hda9         lvm2 [1.40 GB]
      Total: 4 [5.61 GB] / in use: 0 [0   ] / in no VG: 4 [5.61 GB]
    # 這就分別顯示每個 PV 的資訊與系統所有 PV 的資訊。尤其最後一行,顯示的是:
    # 整體 PV 的量 / 已經被使用到 VG 的 PV 量 / 剩餘的 PV 量
    
    # 2. 更詳細的列示出系統上面每個 PV 的個別資訊:
    [root@www ~]# pvdisplay
      "/dev/hda6" is a new physical volume of "1.40 GB"
      --- NEW Physical volume ---
      PV Name               /dev/hda6  <==實際的 partition 裝置名稱
      VG Name                          <==因為尚未分配出去,所以空白!
      PV Size               1.40 GB    <==就是容量說明
      Allocatable           NO         <==是否已被分配,結果是 NO
      PE Size (KByte)       0          <==在此 PV 內的 PE 大小
      Total PE              0          <==共分割出幾個 PE
      Free PE               0          <==沒被 LV 用掉的 PE
      Allocated PE          0          <==尚可分配出去的 PE 數量
      PV UUID               Z13Jk5-RCls-UJ8B-HzDa-Gesn-atku-rf2biN
    ....(底下省略)....
    # 由於 PE 是在建立 VG 時才給予的參數,因此在這裡看到的 PV 裡頭的 PE 都會是 0
    # 而且也沒有多餘的 PE 可供分配 (allocatable)。
    

    講是很難,作是很簡單!這樣就將 PV 建立了兩個囉!簡單到不行吧! ^_^!繼續來玩 VG 去!


    • VG 階段

    建立 VG 及 VG 相關的指令也不少,我們來看看:

    • vgcreate :就是主要建立 VG 的指令啦!他的參數比較多,等一下介紹。
    • vgscan :搜尋系統上面是否有 VG 存在?
    • vgdisplay :顯示目前系統上面的 VG 狀態;
    • vgextend :在 VG 內增加額外的 PV ;
    • vgreduce :在 VG 內移除 PV;
    • vgchange :設定 VG 是否啟動 (active);
    • vgremove :刪除一個 VG 啊!

    與 PV 不同的是, VG 的名稱是自訂的!我們知道 PV 的名稱其實就是 partition 的裝置代號, 但是這個 VG 名稱則可以隨便你自己取啊!在底下的例子當中,我將 VG 名稱取名為 vbirdvg 。建立這個 VG 的流程是這樣的:

    [root@www ~]# vgcreate [-s N[mgt]] VG名稱 PV名稱
    選項與參數:
    -s :後面接 PE 的大小 (size) ,單位可以是 m, g, t (大小寫均可)
    
    # 1. 將 /dev/hda6-8 建立成為一個 VG,且指定 PE 為 16MB 喔!
    [root@www ~]# vgcreate -s 16M vbirdvg /dev/hda{6,7,8}
      Volume group "vbirdvg" successfully created
    
    [root@www ~]# vgscan
      Reading all physical volumes.  This may take a while...
      Found volume group "vbirdvg" using metadata type lvm2
    # 確實存在這個 vbirdvg 的 VG 啦!
    
    [root@www ~]# pvscan
      PV /dev/hda6   VG vbirdvg   lvm2 [1.39 GB / 1.39 GB free]
      PV /dev/hda7   VG vbirdvg   lvm2 [1.39 GB / 1.39 GB free]
      PV /dev/hda8   VG vbirdvg   lvm2 [1.39 GB / 1.39 GB free]
      PV /dev/hda9                lvm2 [1.40 GB]
      Total: 4 [5.57 GB] / in use: 3 [4.17 GB] / in no VG: 1 [1.40 GB]
    # 嘿嘿!發現沒!有三個 PV 被用去,剩下一個 /dev/hda9 的 PV 沒被用掉!
    
    [root@www ~]# vgdisplay
      --- Volume group ---
      VG Name               vbirdvg
      System ID
      Format                lvm2
      Metadata Areas        3
      Metadata Sequence No  1
      VG Access             read/write
      VG Status             resizable
      MAX LV                0
      Cur LV                0
      Open LV               0
      Max PV                0
      Cur PV                3
      Act PV                3
      VG Size               4.17 GB   <==整體的 VG 容量有這麼大
      PE Size               16.00 MB  <==內部每個 PE 的大小
      Total PE              267       <==總共的 PE 數量共有這麼多!
      Alloc PE / Size       0 / 0
      Free  PE / Size       267 / 4.17 GB
      VG UUID               4VU5Jr-gwOq-jkga-sUPx-vWPu-PmYm-dZH9EO
    # 最後那三行指的就是 PE 能夠使用的情況!由於尚未切出 LV,因此所有的 PE 
    # 均可自由使用。
    

    這樣就建立一個 VG 了!假設我們要增加這個 VG 的容量,因為我們還有 /dev/hda9 嘛!此時你可以這樣做:

    # 2. 將剩餘的 PV (/dev/hda9) 丟給 vbirdvg 吧!
    [root@www ~]# vgextend vbirdvg /dev/hda9
      Volume group "vbirdvg" successfully extended
    
    [root@www ~]# vgdisplay
    ....(前面省略)....
      VG Size               5.56 GB
      PE Size               16.00 MB
      Total PE              356
      Alloc PE / Size       0 / 0
      Free  PE / Size       356 / 5.56 GB
      VG UUID               4VU5Jr-gwOq-jkga-sUPx-vWPu-PmYm-dZH9EO
    # 基本上,不難吧!這樣就可以抽換整個 VG 的大小啊!
    

    我們多了一個裝置喔!接下來為這個 vbirdvg 進行分割吧!透過 LV 功能來處理!


    • LV 階段

    創造出 VG 這個大磁碟之後,再來就是要建立分割區啦!這個分割區就是所謂的 LV 囉!假設我要將剛剛那個 vbirdvg 磁碟,分割成為 vbirdlv ,整個 VG 的容量都被分配到 vbirdlv 裡面去!先來看看能使用的指令後,就直接工作了先!

    • lvcreate :建立 LV 啦!
    • lvscan :查詢系統上面的 LV ;
    • lvdisplay :顯示系統上面的 LV 狀態啊!
    • lvextend :在 LV 裡面增加容量!
    • lvreduce :在 LV 裡面減少容量;
    • lvremove :刪除一個 LV !
    • lvresize :對 LV 進行容量大小的調整!
    [root@www ~]# lvcreate [-L N[mgt]] [-n LV名稱] VG名稱
    [root@www ~]# lvcreate [-l N] [-n LV名稱] VG名稱
    選項與參數:
    -L  :後面接容量,容量的單位可以是 M,G,T 等,要注意的是,最小單位為 PE,
          因此這個數量必須要是 PE 的倍數,若不相符,系統會自行計算最相近的容量。
    -l  :後面可以接 PE 的『個數』,而不是數量。若要這麼做,得要自行計算 PE 數。
    -n  :後面接的就是 LV 的名稱啦!
    更多的說明應該可以自行查閱吧! man lvcreate 
    
    # 1. 將整個 vbirdvg 通通分配給 vbirdlv 啊,要注意, PE 共有 356 個。
    [root@www ~]# lvcreate -l 356 -n vbirdlv vbirdvg
      Logical volume "vbirdlv" created
    # 由於本案例中每個 PE 為 16M ,因此上述的指令也可以使用如下的方式來建立:
    # lvcreate -L 5.56G -n vbirdlv vbirdvg
    
    [root@www ~]# ll /dev/vbirdvg/vbirdlv
    lrwxrwxrwx 1 root root 27 Mar 11 16:49 /dev/vbirdvg/vbirdlv ->
    /dev/mapper/vbirdvg-vbirdlv
    # 看見了沒有啊!這就是我們最重要的一個玩意兒了!
    
    [root@www ~]# lvdisplay
      --- Logical volume ---
      LV Name                /dev/vbirdvg/vbirdlv  <==這個才是 LV 的全名!
      VG Name                vbirdvg
      LV UUID                8vFOPG-Jrw0-Runh-ug24-t2j7-i3nA-rPEyq0
      LV Write Access        read/write
      LV Status              available
      # open                 0
      LV Size                5.56 GB               <==這個 LV 的容量這麼大!
      Current LE             356
      Segments               4
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     256
      Block device           253:0
    

    如此一來,整個 partition 也準備好啦!接下來,就是針對這個 LV 來處理啦!要特別注意的是, VG 的名稱為 vbirdvg , 但是 LV 的名稱必須使用全名!亦即是 /dev/vbirdvg/vbirdlv 才對喔! 後續的處理都是這樣的!這點初次接觸 LVM 的朋友很容易搞錯!


    • 檔案系統階段

    這個部分鳥哥我就不再多加解釋了!直接來進行吧!

    # 1. 格式化、掛載與觀察我們的 LV 吧!
    [root@www ~]# mkfs -t ext3 /dev/vbirdvg/vbirdlv <==注意 LV 全名!
    [root@www ~]# mkdir /mnt/lvm
    [root@www ~]# mount /dev/vbirdvg/vbirdlv /mnt/lvm
    [root@www ~]# df
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/hda2              9920624   3858984   5549572  42% /
    /dev/hda3              4956316   1056996   3643488  23% /home
    /dev/hda1               101086     21408     74459  23% /boot
    tmpfs                   371332         0    371332   0% /dev/shm
    /dev/mapper/vbirdvg-vbirdlv
                           5741020    142592   5306796   3% /mnt/lvm
    [root@www ~]# cp -a /etc /var/log /mnt/lvm
    

    其實 LV 的名稱建置成為 /dev/vbirdvg/vbirdlv 是為了讓使用者直覺式的找到我們所需要的資料, 實際上 LVM 使用的裝置是放置到 /dev/mapper/ 目錄下的!所以你才會看到上表當中的特殊字體部分。 透過這樣的功能,我們現在已經建置好一個 LV 了!你可以自由的應用 /mnt/lvm 內的所有資源!


    小標題的圖示放大 LV 容量

    我們不是說 LVM 最大的特色就是彈性調整磁碟容量嗎?好!那我們就來處理一下,如果要放大 LV 的容量時, 該如何進行完整的步驟呢?其實一點都不難喔!你只要這樣做即可:

    1. 用 fdisk 設定新的具有 8e system ID 的 partition
    2. 利用 pvcreate 建置 PV
    3. 利用 vgextend 將 PV 加入我們的 vbirdvg
    4. 利用 lvresize 將新加入的 PV 內的 PE 加入 vbirdlv 中
    5. 透過 resize2fs 將檔案系統的容量確實增加!

    其中最後一個步驟最重要!我們在第八章當中知道, 整個檔案系統在最初格式化的時候就建立了 inode/block/superblock 等資訊,要改變這些資訊是很難的! 不過因為檔案系統格式化的時候建置的是多個 block group ,因此我們可以透過在檔案系統當中增加 block group 的方式來增減檔案系統的量!而增減 block group 就是利用 resize2fs 啦!所以最後一步是針對檔案系統來處理的, 前面幾步則是針對 LVM 的實際容量大小!

    # 1. 處理出一個 3GB 的新的 partition ,在鳥哥的系統中應該是 /dev/hda10
    [root@www ~]# fdisk /dev/hda <==其他的動作請自行處理
    [root@www ~]# partprobe
    [root@www ~]# fdisk -l
       Device Boot      Start         End      Blocks   Id  System
    ....(中間省略)....
    /dev/hda10           2785        3150     2939863+  8e  Linux LVM
    # 這個就是我們要的新的 partition 囉!
    
    # 2. 建立新的 PV:
    [root@www ~]# pvcreate /dev/hda10
      Physical volume "/dev/hda10" successfully created
    [root@www ~]# pvscan
      PV /dev/hda6    VG vbirdvg   lvm2 [1.39 GB / 0    free]
      PV /dev/hda7    VG vbirdvg   lvm2 [1.39 GB / 0    free]
      PV /dev/hda8    VG vbirdvg   lvm2 [1.39 GB / 0    free]
      PV /dev/hda9    VG vbirdvg   lvm2 [1.39 GB / 0    free]
      PV /dev/hda10                lvm2 [2.80 GB]
      Total: 5 [8.37 GB] / in use: 4 [5.56 GB] / in no VG: 1 [2.80 GB]
    # 可以看到 /dev/hda10 是新加入並且尚未被使用的喔!
    
    # 3. 加大 VG ,利用 vgextend 功能!
    [root@www ~]# vgextend vbirdvg /dev/hda10
      Volume group "vbirdvg" successfully extended
    [root@www ~]# vgdisplay
      --- Volume group ---
      VG Name               vbirdvg
      System ID
      Format                lvm2
      Metadata Areas        5
      Metadata Sequence No  4
      VG Access             read/write
      VG Status             resizable
      MAX LV                0
      Cur LV                1
      Open LV               1
      Max PV                0
      Cur PV                5
      Act PV                5
      VG Size               8.36 GB
      PE Size               16.00 MB
      Total PE              535
      Alloc PE / Size       356 / 5.56 GB
      Free  PE / Size       179 / 2.80 GB
      VG UUID               4VU5Jr-gwOq-jkga-sUPx-vWPu-PmYm-dZH9EO
    # 不但整體 VG 變大了!而且剩餘的 PE 共有 179 個,容量則為 2.80G
    
    # 4. 放大 LV 吧!利用 lvresize 的功能來增加!
    [root@www ~]# lvresize -l +179 /dev/vbirdvg/vbirdlv
      Extending logical volume vbirdlv to 8.36 GB
      Logical volume vbirdlv successfully resized
    # 這樣就增加了 LV 了喔!lvresize 的語法很簡單,基本上同樣透過 -l 或 -L 來增加!
    # 若要增加則使用 + ,若要減少則使用 - !詳細的選項請參考 man lvresize 囉!
    
    [root@www ~]# lvdisplay
      --- Logical volume ---
      LV Name                /dev/vbirdvg/vbirdlv
      VG Name                vbirdvg
      LV UUID                8vFOPG-Jrw0-Runh-ug24-t2j7-i3nA-rPEyq0
      LV Write Access        read/write
      LV Status              available
      # open                 1
      LV Size                8.36 GB
      Current LE             535
      Segments               5
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     256
      Block device           253:0
    
    [root@www ~]# df /mnt/lvm
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/mapper/vbirdvg-vbirdlv
                           5741020    261212   5188176   5% /mnt/lvm
    

    看到了吧?最終的結果中 LV 真的有放大到 8.36GB 喔!但是檔案系統卻沒有相對增加! 而且,我們的 LVM 可以線上直接處理,並不需要特別給他 umount 哩!真是人性化! 但是還是得要處理一下檔案系統的容量啦!開始觀察一下檔案系統,然後使用 resize2fs 來處理一下吧!

    # 5.1 先看一下原本的檔案系統內的 superblock 記錄情況吧!
    [root@www ~]# dumpe2fs /dev/vbirdvg/vbirdlv
    dumpe2fs 1.39 (29-May-2006)
    ....(中間省略)....
    Block count:              1458176    <==這個filesystem的 block 總數
    ....(中間省略)....
    Blocks per group:         32768      <==多少個 block 設定成為一個 block group
    Group 0: (Blocks 0-32767)            <==括號內為 block 的號碼
    ....(中間省略)....
    Group 44: (Blocks 1441792-1458175)   <==這是本系統中最後一個 group
    ....(後面省略)....
    
    # 5.2 resize2fs 的語法
    [root@www ~]# resize2fs [-f] [device] [size]
    選項與參數:
    -f      :強制進行 resize 的動作!
    [device]:裝置的檔案名稱;
    [size]  :可以加也可以不加。如果加上 size 的話,那麼就必須要給予一個單位,
              譬如 M, G 等等。如果沒有 size 的話,那麼預設使用『整個 partition』
              的容量來處理!
    
    # 5.3 完整的將 LV 的容量擴充到整個 filesystem 吧!
    [root@www ~]# resize2fs /dev/vbirdvg/vbirdlv
    resize2fs 1.39 (29-May-2006)
    Filesystem at /dev/vbirdvg/vbirdlv is mounted on /mnt/lvm; on-line resizing 
    Performing an on-line resize of /dev/vbirdvg/vbirdlv to 2191360 (4k) blocks.
    The filesystem on /dev/vbirdvg/vbirdlv is now 2191360 blocks long.
    # 可怕吧!這一版的 lvm 竟然還可以線上進行 resize 的功能哩!真好!
    
    [root@www ~]# df /mnt/lvm
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/mapper/vbirdvg-vbirdlv
                           8628956    262632   7931368   4% /mnt/lvm
    [root@www ~]# ll /mnt/lvm
    drwxr-xr-x 105 root root 12288 Mar 11 16:59 etc
    drwxr-xr-x  17 root root  4096 Mar 11 14:17 log
    drwx------   2 root root 16384 Mar 11 16:59 lost+found
    # 剛剛複製進去的資料可還是存在的喔!並沒有消失不見!
    

    嘿嘿!真的放大了吧!而且如果你已經有填資料在 LVM 磁區當中的話!這個資料是不會死掉的喔!還是繼續存在原本的磁區當中啦! 整個動作竟然這麼簡單就完成了!原本的資料還是一直存在而不會消失~您說, LVM 好不好用啊!

    此外,如果你再以 dumpe2fs 來檢查 /dev/vbirdvg/vbirdlv 時,就會發現後續的 Group 增加了! 如果還是搞不清楚什麼是 block group 時,請回到第八章看一下該章內圖1.3.1的介紹吧!


    小標題的圖示縮小 LV 容量

    上一小節我們談到的是放大容量,現在來談到的是縮小容量喔!假設我們想將 /dev/hda6 抽離出來! 那該如何處理啊?就讓上一小節的流程倒轉過來即可啊!我們就直接來玩吧!

    # 1. 先找出 /dev/hda6 的容量大小,並嘗試計算檔案系統需縮小到多少
    [root@www ~]# pvdisplay
      --- Physical volume ---
      PV Name               /dev/hda6
      VG Name               vbirdvg
      PV Size               1.40 GB / not usable 11.46 MB
      Allocatable           yes (but full)
      PE Size (KByte)       16384
      Total PE              89
      Free PE               0
      Allocated PE          89
      PV UUID               Z13Jk5-RCls-UJ8B-HzDa-Gesn-atku-rf2biN
    # 從這裡可以看出 /dev/hda6 有多大,而且含有 89 個 PE 的量喔!
    # 那如果要使用 resize2fs 時,則總量減去 1.40GB 就對了!
    
    [root@www ~]# pvscan
      PV /dev/hda6    VG vbirdvg   lvm2 [1.39 GB / 0    free]
      PV /dev/hda7    VG vbirdvg   lvm2 [1.39 GB / 0    free]
      PV /dev/hda8    VG vbirdvg   lvm2 [1.39 GB / 0    free]
      PV /dev/hda9    VG vbirdvg   lvm2 [1.39 GB / 0    free]
      PV /dev/hda10   VG vbirdvg   lvm2 [2.80 GB / 0    free]
      Total: 5 [8.36 GB] / in use: 5 [8.36 GB] / in no VG: 0 [0   ]
    # 從上面可以發現如果扣除 /dev/hda6 則剩餘容量有:1.39*3+2.8=6.97
    
    # 2. 就直接降低檔案系統的容量吧!
    [root@www ~]# resize2fs /dev/vbirdvg/vbirdlv 6900M
    resize2fs 1.39 (29-May-2006)
    Filesystem at /dev/vbirdvg/vbirdlv is mounted on /mnt/lvm; on-line resizing
    On-line shrinking from 2191360 to 1766400 not supported.
    # 容量好像不能夠寫小數點位數,因此 6.9G 是錯誤的,鳥哥就使用 6900M 了。
    # 此外,放大可以線上直接進行,縮小檔案系統似乎無法支援!所以要這樣做:
    
    [root@www ~]# umount /mnt/lvm
    [root@www ~]# resize2fs /dev/vbirdvg/vbirdlv 6900M
    resize2fs 1.39 (29-May-2006)
    Please run 'e2fsck -f /dev/vbirdvg/vbirdlv' first.
    # 他要我們先進行磁碟檢查!不囉唆!那就直接進行吧!
    
    [root@www ~]# e2fsck -f /dev/vbirdvg/vbirdlv
    e2fsck 1.39 (29-May-2006)
    Pass 1: Checking inodes, blocks, and sizes
    Pass 2: Checking directory structure
    Pass 3: Checking directory connectivity
    Pass 4: Checking reference counts
    Pass 5: Checking group summary information
    /dev/vbirdvg/vbirdlv: 2438/1087008 files (0.1% non-contiguous), 
    
    [root@www ~]# resize2fs /dev/vbirdvg/vbirdlv 6900M
    resize2fs 1.39 (29-May-2006)
    Resizing the filesystem on /dev/vbirdvg/vbirdlv to 1766400 (4k) blocks.
    The filesystem on /dev/vbirdvg/vbirdlv is now 1766400 blocks long.
    # 再來 resize2fs 一次就能夠成功了!如上所示啊!
    
    [root@www ~]# mount /dev/vbirdvg/vbirdlv /mnt/lvm
    [root@www ~]# df /mnt/lvm
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/mapper/vbirdvg-vbirdlv
                           6955584    262632   6410328   4% /mnt/lvm
    

    然後再來就是將 LV 的容量降低!要注意的是,我們想要抽離的是 /dev/hda6,這個 PV 有 89 個 PE (上面的 pvdisplay 查詢到的結果)。所以要這樣進行:

    # 3. 降低 LV 的容量,同時我們知道 /dev/hda6 有 89 個 PE
    [root@www ~]# lvresize -l -89 /dev/vbirdvg/vbirdlv
      WARNING: Reducing active and open logical volume to 6.97 GB
      THIS MAY DESTROY YOUR DATA (filesystem etc.)
    Do you really want to reduce vbirdlv? [y/n]: y
      Reducing logical volume vbirdlv to 6.97 GB
      Logical volume vbirdlv successfully resized
    # 會有警告訊息!但是我們的實際資料量還是比 6.97G 小,所以就 y 下去吧!
    
    [root@www ~]# lvdisplay
      --- Logical volume ---
      LV Name                /dev/vbirdvg/vbirdlv
      VG Name                vbirdvg
      LV UUID                8vFOPG-Jrw0-Runh-ug24-t2j7-i3nA-rPEyq0
      LV Write Access        read/write
      LV Status              available
      # open                 1
      LV Size                6.97 GB
      Current LE             446
      Segments               5
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     256
      Block device           253:0
    

    很簡單吧!這樣就將 LV 縮小了!接下來就要將 /dev/hda6 移出 vbirdvg 這個 VG 之外囉! 我們得要先確定 /dev/hda6 裡面的 PE 完全不被使用後,才能夠將 /dev/hda6 抽離! 所以得要這樣進行:

    # 4.1 先確認 /dev/hda6 是否將 PE 都移除了!
    [root@www ~]# pvdisplay
      --- Physical volume ---
      PV Name               /dev/hda6
      VG Name               vbirdvg
      PV Size               1.40 GB / not usable 11.46 MB
      Allocatable           yes (but full)
      PE Size (KByte)       16384
      Total PE              89
      Free PE               0
      Allocated PE          89
      PV UUID               Z13Jk5-RCls-UJ8B-HzDa-Gesn-atku-rf2biN
    ....(中間省略)....
    
      --- Physical volume ---
      PV Name               /dev/hda10
      VG Name               vbirdvg
      PV Size               2.80 GB / not usable 6.96 MB
      Allocatable           yes
      PE Size (KByte)       16384
      Total PE              179
      Free PE               89
      Allocated PE          90
      PV UUID               7MfcG7-y9or-0Jmb-H7RO-5Pa5-D3qB-G426Vq
    # 搞了老半天,沒有被使用的 PE 竟然在 /dev/hda10 !此時得要搬移 PE 囉!
    
    [root@www ~]# pvmove /dev/hda6 /dev/hda10
    # pvmove 來源PV 目標PV ,可以將 /dev/hda6 內的 PE 通通移動到 /dev/hda10
    # 尚未被使用的 PE 去 (Free PE)。
    
    # 4.2 將 /dev/hda6 移出 vbirdvg 中!
    [root@www ~]# vgreduce vbirdvg /dev/hda6
      Removed "/dev/hda6" from volume group "vbirdvg"
    
    [root@www ~]# pvscan
      PV /dev/hda7    VG vbirdvg   lvm2 [1.39 GB / 0    free]
      PV /dev/hda8    VG vbirdvg   lvm2 [1.39 GB / 0    free]
      PV /dev/hda9    VG vbirdvg   lvm2 [1.39 GB / 0    free]
      PV /dev/hda10   VG vbirdvg   lvm2 [2.80 GB / 0    free]
      PV /dev/hda6                 lvm2 [1.40 GB]
      Total: 5 [8.37 GB] / in use: 4 [6.97 GB] / in no VG: 1 [1.40 GB]
    
    [root@www ~]# pvremove /dev/hda6
      Labels on physical volume "/dev/hda6" successfully wiped
    

    很有趣吧!這樣你的檔案系統以及實際的 LV 與 VG 通通變小了,而且那個 /dev/hda6 還真的可以拿出來! 可以進行其他的用途啦!非常簡單吧!


    小標題的圖示LVM 的系統快照

    現在你知道 LVM 的好處咯,未來如果你有想要增加某個 LVM 的容量時,就可以透過這個放大、縮小的功能來處理。 那麼 LVM 除了這些功能之外,還有什麼能力呢?其實他還有一個重要的能力,那就是系統快照 (snapshot)。 什麼是系統快照啊?快照就是將當時的系統資訊記錄下來,就好像照相記錄一般! 未來若有任何資料更動了,則原始資料會被搬移到快照區,沒有被更動的區域則由快照區與檔案系統共享。 用講的好像很難懂,我們用圖解說明一下好了:

    LVM 系統快照區域的備份示意圖
    圖 3.5.1、LVM 系統快照區域的備份示意圖(虛線為檔案系統,長虛線為快照區)

    左圖為最初建置系統快照區的狀況,LVM 會預留一個區域 (左圖的左側三個 PE 區塊) 作為資料存放處。 此時快照區內並沒有任何資料,而快照區與系統區共享所有的 PE 資料, 因此你會看到快照區的內容與檔案系統是一模一樣的。 等到系統運作一陣子後,假設 A 區域的資料被更動了 (上面右圖所示),則更動前系統會將該區域的資料移動到快照區, 所以在右圖的快照區被佔用了一塊 PE 成為 A,而其他 B 到 I 的區塊則還是與檔案系統共用!

    照這樣的情況來看,LVM 的系統快照是非常棒的『備份工具』,因為他只有備份有被更動到的資料, 檔案系統內沒有被變更的資料依舊保持在原本的區塊內,但是 LVM 快照功能會知道那些資料放置在哪裡, 因此『快照』當時的檔案系統就得以『備份』下來,且快照所佔用的容量又非常小!所以您說,這不是很棒的工具又是什麼?

    那麼快照區要如何建立與使用呢?首先,由於快照區與原本的 LV 共用很多 PE 區塊,因此快照區與被快照的 LV 必須要在同一個 VG 上頭。但是我們剛剛將 /dev/hda6 移除 vbirdvg 了,目前 vbirdvg 剩下的容量為 0 !因此,在這個小節裡面我們得要再加入 /dev/hda6 到我們的 VG 後, 才能繼續建立快照區囉!底下的動作趕緊再來玩玩看!


    • 快照區的建立

    底下的動作主要再增加需要的 VG 容量,然後再透過 lvcreate -s 的功能建立快照區

    # 1. 先觀察 VG 還剩下多少剩餘容量
    [root@www ~]# vgdisplay
      --- Volume group ---
      VG Name               vbirdvg
    ....(其他省略)....
      VG Size               6.97 GB
      PE Size               16.00 MB
      Total PE              446
      Alloc PE / Size       446 / 6.97 GB
      Free  PE / Size       0 / 0  <==沒有多餘的 PE 可用!
    
    # 2. 將剛剛移除的 /dev/hda6 加入這個 VG 吧!
    [root@www ~]# pvcreate /dev/hda6
      Physical volume "/dev/hda6" successfully created
    [root@www ~]# vgextend vbirdvg /dev/hda6
      Volume group "vbirdvg" successfully extended
    [root@www ~]# vgdisplay
      --- Volume group ---
      VG Name               vbirdvg
    ....(其他省略)....
      VG Size               8.36 GB
      PE Size               16.00 MB
      Total PE              535
      Alloc PE / Size       446 / 6.97 GB
      Free  PE / Size       89 / 1.39 GB  <==多出了 89 個 PE 可用囉!
    
    # 3. 利用 lvcreate 建立系統快照區,我們取名為 vbirdss,且給予 60 個 PE
    [root@www ~]# lvcreate -l 60 -s -n vbirdss /dev/vbirdvg/vbirdlv
      Logical volume "vbirdss" created
    # 上述的指令中最重要的是那個 -s 的選項!代表是 snapshot 快照功能之意!
    # -n 後面接快照區的裝置名稱, /dev/.... 則是要被快照的 LV 完整檔名。
    # -l 後面則是接使用多少個 PE 來作為這個快照區使用。
    
    [root@www ~]# lvdisplay
      --- Logical volume ---
      LV Name                /dev/vbirdvg/vbirdss
      VG Name                vbirdvg
      LV UUID                K2tJ5E-e9mI-89Gw-hKFd-4tRU-tRKF-oeB03a
      LV Write Access        read/write
      LV snapshot status     active destination for /dev/vbirdvg/vbirdlv
      LV Status              available
      # open                 0
      LV Size                6.97 GB    <==被快照的原 LV 磁碟容量
      Current LE             446
      COW-table size         960.00 MB  <==快照區的實際容量
      COW-table LE           60         <==快照區佔用的 PE 數量
      Allocated to snapshot  0.00%
      Snapshot chunk size    4.00 KB
      Segments               1
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     256
      Block device           253:1
    

    您看看!這個 /dev/vbirdvg/vbirdss 快照區就被建立起來了!而且他的 VG 量竟然與原本的 /dev/vbirdvg/vbirdlv 相同!也就是說,如果你真的掛載這個裝置時,看到的資料會跟原本的 vbirdlv 相同喔!我們就來測試看看:

    [root@www ~]# mkdir /mnt/snapshot
    [root@www ~]# mount /dev/vbirdvg/vbirdss /mnt/snapshot
    [root@www ~]# df
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/hda2              9920624   3859032   5549524  42% /
    /dev/hda3              4956316   1056996   3643488  23% /home
    /dev/hda1               101086     21408     74459  23% /boot
    tmpfs                   371332         0    371332   0% /dev/shm
    /dev/mapper/vbirdvg-vbirdlv
                           6955584    262632   6410328   4% /mnt/lvm
    /dev/mapper/vbirdvg-vbirdss
                           6955584    262632   6410328   4% /mnt/snapshot
    # 有沒有看到!這兩個咚咚竟然是一模一樣喔!我們根本沒有動過
    # /dev/vbirdvg/vbirdss 對吧!不過這裡面會主動記錄原 vbirdlv 的內容!
    
    [root@www ~]# umount /mnt/snapshot
    # 最後將他卸載!我們準備來玩玩有趣的東西!
    


    • 利用快照區復原系統

    首先,我們來玩一下,如何利用快照區復原系統吧!不過你要注意的是,你要復原的資料量不能夠高於快照區所能負載的實際容量。由於原始資料會被搬移到快照區, 如果你的快照區不夠大,若原始資料被更動的實際資料量比快照區大,那麼快照區當然容納不了,這時候快照功能會失效喔! 所以上面的案例中鳥哥才給予 60 個 PE (共 900MB) 作為快照區存放資料用。

    我們的 /mnt/lvm 已經有 /mnt/lvm/etc, /mnt/lvm/log 等目錄了,接下來我們將這個檔案系統的內容作個變更, 然後再以快照區資料還原看看:

    # 1. 先將原本的 /dev/vbirdvg/vbirdlv 內容作些變更,增增減減一些目錄吧!
    [root@www ~]# df /mnt/lvm
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/mapper/vbirdvg-vbirdlv
                           6955584    262632   6410328   4% /mnt/lvm
    
    [root@www ~]# ll /mnt/lvm
    drwxr-xr-x 105 root root 12288 Mar 11 16:59 etc
    drwxr-xr-x  17 root root  4096 Mar 11 14:17 log
    drwx------   2 root root 16384 Mar 11 16:59 lost+found
    
    [root@www ~]# rm -r /mnt/lvm/log
    [root@www ~]# cp -a /boot /lib /sbin /mnt/lvm
    [root@www ~]# ll /mnt/lvm
    drwxr-xr-x   4 root root  4096 Dec 15 16:28 boot
    drwxr-xr-x 105 root root 12288 Mar 11 16:59 etc
    drwxr-xr-x  14 root root  4096 Sep  5  2008 lib
    drwx------   2 root root 16384 Mar 11 16:59 lost+found
    drwxr-xr-x   2 root root 12288 Sep  5  2008 sbin
    # 看起來資料已經不一樣了!
    
    [root@www ~]# lvdisplay /dev/vbirdvg/vbirdss
      --- Logical volume ---
      LV Name                /dev/vbirdvg/vbirdss
      VG Name                vbirdvg
    ....(中間省略)....
      Allocated to snapshot  12.22%
    ....(底下省略)....
    # 從這裡也看得出來,快照區已經被使用了 12.22% !因為原始的檔案系統有異動過!
    
    # 2. 利用快照區將原本的 filesystem 備份
    [root@www ~]# mount /dev/vbirdvg/vbirdss /mnt/snapshot
    [root@www ~]# df
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/mapper/vbirdvg-vbirdlv
                           6955584    370472   6302488   6% /mnt/lvm
    /dev/mapper/vbirdvg-vbirdss
                           6955584    262632   6410328   4% /mnt/snapshot
    # 看吧!兩者確實不一樣了!開始將快照區內容複製出來吧!
    
    [root@www ~]# mkdir -p /backups <==確認真的有這個目錄!
    [root@www ~]# cd /mnt/snapshot
    [root@www snapshot]# tar -jcv -f /backups/lvm.tar.bz2 *
    # 此時你就會有一個備份資料,亦即是 /backups/lvm.tar.bz2 了!
    

    為什麼要備份呢?為什麼不可以直接格式化 /dev/vbirdvg/vbirdlv 然後將 /dev/vbirdvg/vbirdss 直接複製給 vbirdlv 呢? 要知道 vbirdss 其實是 vbirdlv 的快照,因此如果你格式化整個 vbirdlv 時,原本的檔案系統所有資料都會被搬移到 vbirdss。 那如果 vbirdss 的容量不夠大 (通常也真的不夠大),那麼部分資料將無法複製到 vbirdss 內,資料當然無法全部還原啊! 所以才要在上面表格中製作出一個備份檔案的!瞭解乎?

    而快照還有另外一個功能,就是你可以比對 /mnt/lvm 與 /mnt/snapshot 的內容,就能夠發現到最近你到底改了啥咚咚! 這樣也是很不賴啊!您說是吧! ^_^!接下來讓我們準備還原 vbirdlv 的內容吧!

    # 3. 將 vbirdss 卸載並移除 (因為裡面的內容已經備份起來了)
    [root@www ~]# umount /mnt/snapshot
    [root@www ~]# lvremove /dev/vbirdvg/vbirdss
    Do you really want to remove active logical volume "vbirdss"? [y/n]: y
      Logical volume "vbirdss" successfully removed
    
    [root@www ~]# umount /mnt/lvm
    [root@www ~]# mkfs -t ext3 /dev/vbirdvg/vbirdlv
    [root@www ~]# mount /dev/vbirdvg/vbirdlv /mnt/lvm
    [root@www ~]# tar -jxv -f /backups/lvm.tar.bz2 -C /mnt/lvm
    [root@www ~]# ll /mnt/lvm
    drwxr-xr-x 105 root root 12288 Mar 11 16:59 etc
    drwxr-xr-x  17 root root  4096 Mar 11 14:17 log
    drwx------   2 root root 16384 Mar 11 16:59 lost+found
    # 是否與最初的內容相同啊!這就是透過快照來還原的一個簡單的方法囉!
    


    • 利用快照區進行各項練習與測試的任務,再以原系統還原快照

    換個角度來想想,我們將原本的 vbirdlv 當作備份資料,然後將 vbirdss 當作實際在運作中的資料, 任何測試的動作都在 vbirdss 這個快照區當中測試,那麼當測試完畢要將測試的資料刪除時,只要將快照區刪去即可! 而要複製一個 vbirdlv 的系統,再作另外一個快照區即可!這樣是否非常方便啊? 這對於教學環境中每年都要幫學生製作一個練習環境主機的測試,非常有幫助呢!

    Tips:
    以前鳥哥老是覺得使用 LVM 的快照來進行備份不太合理,因為還要製作一個備份檔!後來仔細研究並參考徐秉義老師的教材(註3)後,才發現 LVM 的快照實在是一個棒到不行的工具!尤其是在虛擬機器當中建置多份給同學使用的測試環境, 你只要有一個基礎的環境保持住,其他的環境使用快照來提供即可。即時同學將系統搞爛了,你只要將快照區刪除, 再重建一個快照區!這樣環境就恢復了!天吶!實在是太棒了! ^_^
    鳥哥的圖示

    # 1. 建立一個大一些的快照區,讓我們將 /dev/hda6 的 PE 全部給快照區!
    [root@www ~]# lvcreate -s -l 89 -n vbirdss /dev/vbirdvg/vbirdlv
      Logical volume "vbirdss" created
    
    [root@www ~]# lvdisplay /dev/vbirdvg/vbirdss
      --- Logical volume ---
      LV Name                /dev/vbirdvg/vbirdss
      VG Name                vbirdvg
      LV UUID                as0ocQ-KjRS-Bu7y-fYoD-1CHC-0V3Y-JYsjj1
      LV Write Access        read/write
      LV snapshot status     active destination for /dev/vbirdvg/vbirdlv
      LV Status              available
      # open                 0
      LV Size                6.97 GB
      Current LE             446
      COW-table size         1.39 GB
      COW-table LE           89
      Allocated to snapshot  0.00%
      Snapshot chunk size    4.00 KB
      Segments               1
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     256
      Block device           253:1
    # 如何!這個快照區不小吧!
    
    # 2. 隱藏 vbirdlv 掛載 vbirdss
    [root@www ~]# umount /mnt/lvm
    [root@www ~]# mount /dev/vbirdvg/vbirdss /mnt/snapshot
    [root@www ~]# df /mnt/snapshot
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/mapper/vbirdvg-vbirdss
                           7192504    265804   6561340   4% /mnt/snapshot
    
    # 3. 開始惡搞!
    [root@www ~]# rm -r /mnt/snapshot/etc /mnt/snapshot/log
    [root@www ~]# cp -a /boot /lib /sbin /mnt/snapshot/
    [root@www ~]# ll /mnt/snapshot
    drwxr-xr-x  4 root root  4096 Dec 15 16:28 boot
    drwxr-xr-x 14 root root  4096 Sep  5  2008 lib
    drwx------  2 root root 16384 Mar 11 16:59 lost+found
    drwxr-xr-x  2 root root 12288 Sep  5  2008 sbin  <==與原本資料有差異了
    
    [root@www ~]# mount /dev/vbirdvg/vbirdlv /mnt/lvm
    [root@www ~]# ll /mnt/lvm
    drwxr-xr-x 105 root root 12288 Mar 11 16:59 etc
    drwxr-xr-x  17 root root  4096 Mar 11 14:17 log
    drwx------   2 root root 16384 Mar 11 16:59 lost+found
    # 不論你在快照區惡搞啥咚咚,原本的 vbirdlv 裡面的資料安好如初啊!
    # 假設你將 vbirdss 搞爛了!裡面的資料不再需要!那該如何是好?
    
    # 4. 還原原本快照區的資料,回到與原檔案系統相同的資訊
    [root@www ~]# umount /mnt/snapshot
    [root@www ~]# lvremove /dev/vbirdvg/vbirdss
    Do you really want to remove active logical volume "vbirdss"? [y/n]: y
      Logical volume "vbirdss" successfully removed
    
    [root@www ~]# lvcreate -s -l 89 -n vbirdss /dev/vbirdvg/vbirdlv
    [root@www ~]# mount /dev/vbirdvg/vbirdss /mnt/snapshot
    [root@www ~]# ll /mnt/snapshot
    drwxr-xr-x 105 root root 12288 Mar 11 16:59 etc
    drwxr-xr-x  17 root root  4096 Mar 11 14:17 log
    drwx------   2 root root 16384 Mar 11 16:59 lost+found
    # 資料這樣就復原了!
    

    老實說,上面的測試有點無厘頭~因為快照區損毀了就刪除再建一個就好啦!何必還要測試呢? 不過,為了讓您瞭解到快照區也能夠這樣使用,上面的測試還是需要存在的啦!未來如果你有接觸到虛擬機器, 再回到這裡來溫習一下肯定會有收穫的!


    小標題的圖示LVM 相關指令彙整與 LVM 的關閉

    好了,我們將上述用過的一些指令給他彙整一下,提供給您參考參考:

    任務
    PV 階段
    VG 階段
    LV 階段

    搜尋(scan)
    pvscan
    vgscan
    lvscan

    建立(create)
    pvcreate
    vgcreate
    lvcreate

    列出(display)
    pvdisplay
    vgdisplay
    lvdisplay

    增加(extend)
    vgextend
    lvextend (lvresize)

    減少(reduce)
    vgreduce
    lvreduce (lvresize)

    刪除(remove)
    pvremove
    vgremove
    lvremove

    改變容量(resize)
    lvresize

    改變屬性(attribute)
    pvchange
    vgchange
    lvchange

    至於檔案系統階段 (filesystem 的格式化處理) 部分,還需要以 resize2fs 來修訂檔案系統實際的大小才行啊! ^_^ 。至於雖然 LVM 可以彈性的管理你的磁碟容量,但是要注意,如果你想要使用 LVM 管理您的硬碟時,那麼在安裝的時候就得要做好 LVM 的規劃了, 否則未來還是需要先以傳統的磁碟增加方式來增加後,移動資料後,才能夠進行 LVM 的使用啊!

    會玩 LVM 還不行!你必須要會移除系統內的 LVM 喔!因為你的實體 partition 已經被使用到 LVM 去, 如果你還沒有將 LVM 關閉就直接將那些 partition 刪除或轉為其他用途的話,系統是會發生很大的問題的! 所以囉,你必須要知道如何將 LVM 的裝置關閉並移除才行!會不會很難呢?其實不會啦! 依據以下的流程來處理即可:

    1. 先卸載系統上面的 LVM 檔案系統 (包括快照與所有 LV);
    2. 使用 lvremove 移除 LV ;
    3. 使用 vgchange -a n VGname 讓 VGname 這個 VG 不具有 Active 的標誌;
    4. 使用 vgremove 移除 VG:
    5. 使用 pvremove 移除 PV;
    6. 最後,使用 fdisk 修改 ID 回來啊!

    好吧!那就實際的將我們之前建立的所有 LVM 資料給刪除吧!

    [root@www ~]# umount /mnt/lvm
    [root@www ~]# umount /mnt/snapshot
    [root@www ~]# lvremove /dev/vbirdvg/vbirdss  <==先處理快照
    Do you really want to remove active logical volume "vbirdss"? [y/n]: y
      Logical volume "vbirdss" successfully removed
    [root@www ~]# lvremove /dev/vbirdvg/vbirdlv  <==再處理原系統
    Do you really want to remove active logical volume "vbirdlv"? [y/n]: y
      Logical volume "vbirdlv" successfully removed
    
    [root@www ~]# vgchange -a n vbirdvg
      0 logical volume(s) in volume group "vbirdvg" now active
    
    [root@www ~]# vgremove vbirdvg
      Volume group "vbirdvg" successfully removed
    
    [root@www ~]# pvremove /dev/hda{6,7,8,9,10}
      Labels on physical volume "/dev/hda6" successfully wiped
      Labels on physical volume "/dev/hda7" successfully wiped
      Labels on physical volume "/dev/hda8" successfully wiped
      Labels on physical volume "/dev/hda9" successfully wiped
      Labels on physical volume "/dev/hda10" successfully wiped
    

    最後再用 fdisk 將磁碟的 ID 給他改回來 82 就好啦!整個過程就這樣的啦! ^_^


    大標題的圖示重點回顧
    • Quota 可公平的分配系統上面的磁碟容量給使用者;分配的資源可以是磁碟容量(block)或可建立檔案數量(inode);
    • Quota 的限制可以有 soft/hard/grace time 等重要項目;
    • Quota 僅能針對整個 filesystem 進行限制,不是針對目錄喔!
    • Quota 的使用必須要核心與檔案系統均支援。檔案系統的參數必須含有 usrquota, grpquota
    • Quota 實作的指令有 quotacheck, quotaon, edquota, repquota 等指令;
    • 磁碟陣列 (RAID) 有硬體與軟體之分,Linux 作業系統可支援軟體磁碟陣列,透過 mdadm 套件來達成;
    • 磁碟陣列建置的考量依據為『容量』、『效能』、『資料可靠性』等;
    • 磁碟陣列所建置的等級常見有的 raid0, raid1, raid0+1, raid5 及 raid6
    • 硬體磁碟陣列的裝置檔名與 SCSI 相同,至於 software RAID 則為 /dev/md[0-9]
    • 軟體磁碟陣列的狀態可藉由 /proc/mdstat 檔案來瞭解;
    • LVM 強調的是『彈性的變化檔案系統的容量』;
    • 與 LVM 有關的元件有: PV/VG/PE/LV 等元件,可以被格式化者為 LV
    • LVM 擁有快照功能,快照可以記錄 LV 的資料內容,並與原有的 LV 共享未更動的資料,備份與還原就變的很簡單;
    • Ext3 透過 resize2fs 指令,可以彈性的調整檔案系統的大小

    大標題的圖示本章習題
    ( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )
    • 情境模擬題一:由於 LVM 可以彈性調整 filesystem 的大小,但是缺點是可能沒有加速與硬體備份(與快照不同)的功能。 而磁碟陣列則具有效能與備份的功能,但是無法提供類似 LVM 的優點。在此情境中,我們想利用『在 RAID 上面建置 LVM』的功能,以達到兩者兼顧的能力。
      • 目標:測試在 RAID 磁碟上面架構 LVM 系統;
      • 需求:需要具有磁碟管理的能力,包括 RAID 與 LVM;
      • 前提:將本章與之前章節練習所製作的分割槽全部刪除,剩下預設的分割槽即可。

      那要如何處理呢?如下的流程一個步驟一個步驟的實施看看吧:
      1. 復原系統時,你必須要:
        • 利用 umount 先卸載之前掛載的檔案系統;
        • 修改 /etc/fstab 裡面的資料,讓開機不會自動掛載;
        • 利用 fdisk 將該分割槽刪除。

        最終你的系統應該會只剩下如下的模樣:
        [root@www ~]# fdisk -l
           Device Boot      Start         End      Blocks   Id  System
        /dev/hda1   *           1          13      104391   83  Linux
        /dev/hda2              14        1288    10241437+  83  Linux
        /dev/hda3            1289        1925     5116702+  83  Linux
        /dev/hda4            1926        9382    59898352+   5  Extended
        /dev/hda5            1926        2052     1020096   82  Linux swap / Solaris
        
      2. 建立 RAID ,假設我們利用五個 1GB 的分割槽建立 RAID-5 ,且具有一個 spare disk , 那麼你應該要如何進行?首先,請自行使用 fdisk 建置好如下的分割槽狀態:
        [root@www ~]# fdisk -l
        ....(前面省略)....
        /dev/hda6            2053        2175      987966   83  Linux
        /dev/hda7            2176        2298      987966   83  Linux
        /dev/hda8            2299        2421      987966   83  Linux
        /dev/hda9            2422        2544      987966   83  Linux
        /dev/hda10           2545        2667      987966   83  Linux
        

        接下來開始建立 RAID 吧!建立的方法可以如下簡單處理即可:

        [root@www ~]# mdadm --create --auto=yes /dev/md0 --level=5  \
        > --raid-devices=4 --spare-devices=1 /dev/hda{6,7,8,9,10}
        

        若無出現任何錯誤訊息,此時你已經具有 /dev/md0 這個磁碟陣列裝置了!接下來讓我們處理 LVM 吧!

      3. 開始處理 LVM ,現在我們假設所有的參數都使用預設值,包括 PE ,然後 VG 名為 raidvg ,LV 名為 raidlv ,底下為基本的流程:
        [root@www ~]# pvcreate /dev/md0                  <==建立 PV
        [root@www ~]# vgcreate raidvg /dev/md0           <==建立 VG
        [root@www ~]# lvcreate -L 2.82G -n raidlv raidvg <==建立 LM
        [root@www ~]# lvdisplay
          --- Logical volume ---
          LV Name                /dev/raidvg/raidlv
          VG Name                raidvg
          LV UUID                zQsKqW-8Bt2-kpJF-8rCI-Cql1-XQYT-jw1mfH
          LV Write Access        read/write
          LV Status              available
          # open                 0
          LV Size                2.82 GB
          Current LE             722
          Segments               1
          Allocation             inherit
          Read ahead sectors     auto
          - currently set to     256
          Block device           253:0
        

        這樣就搞定了 LVM 了!而且這個 LVM 是架構在 /dev/md0 上面的喔!然後就是檔案系統的建立與掛載了!

      4. 嘗試建立成為 Ext3 檔案系統,且掛載到 /mnt/raidlvm 目錄下:
        [root@www ~]# mkfs -t ext3 /dev/raidvg/raidlv
        [root@www ~]# mkdir /mnt/raidlvm
        [root@www ~]# mount /dev/raidvg/raidlv /mnt/raidlvm
        
      5. 上述就是 LVM 架構在 RAID 上面的技巧,之後的動作都能夠使用本章的其他管理方式來管理, 包括 RAID 熱拔插機制、LVM 放大縮小機制等等。測試完畢之後請務必要關閉本題所建立的各項資訊。
        [root@www ~]# umount /mnt/raidlvm         <==卸載檔案系統
        [root@www ~]# lvremove /dev/raidvg/raidlv <==移除 LV
        [root@www ~]# vgchange -a n raidvg        <==讓 VG 不活動
        [root@www ~]# vgremove raidvg             <==移除 VG
        [root@www ~]# pvremove /dev/md0           <==移除 PV
        [root@www ~]# mdadm --stop /dev/md0       <==關閉 /dev/md0 RAID
        [root@www ~]# fdisk /dev/hda              <==還原原本的分割槽
        

    簡答題部分:
    • 在前一章的第一個大量新增帳號範例中, 如果我想要讓每個用戶均具有 soft/hard 各為 40MB/50MB 的容量時,應該如何修改這個 script ?

      你得先要依據本章的作法,先將 /home 製作好 quota 的環境然後, 你可以在 do...done 內的最後一行,新增一行內容為:
      setquota -u $username 40000 50000 0 0 /home
      這樣就可以在製作用戶時,指定更新密碼且給予 quota 的限制!

    • 如果我想要讓 RAID 具有保護資料的功能,防止因為硬體損毀而導致資料的遺失,那我應該要選擇的 RAID 等級可能有哪些? (請以本章談到的等級來思考即可)

      具有備份資料的有: RAID-1, RAID-5, RAID-6

    • 在預設的 LVM 設定中,請問 LVM 能否具有『備份』的功能?

      是有的,就是那個快照 (snopshot) 的功能,此功能即可進行資料的備份!

    • LVM 內的 LV 據說僅能達到 256 GB 的容量,請問如何克服此一容量問題?

      LV 的容量與 PE 這個資料有關,由於預設 PE 為 4MB ,所以才會有此限制。 若要修改這個限制值,則需要在建置 VG 時就給予 -s 的選項來進行 PE 數值的設定。 若給到 PE = 16MB 時,則 LV 的最大總量就能夠達到 1TB 的容量了。

    • 如果你的電腦主機有提供 RAID 0 的功能,你將你的三顆硬碟全部在 BIOS 階段使用 RAID 晶片整合成為一顆大磁碟, 則此磁碟在 Linux 系統當中的檔名為何?

      由於硬體磁碟陣列是在 BIOS 階段完成的,因此 Linux 系統會捉到一個完整的大的 RAID 磁碟, 此磁碟的檔名就會是『 /dev/sda 』!


    大標題的圖示參考資料與延伸閱讀
    2002/07/14:第一次完成
    2003/02/10:重新編排與加入 FAQ
    2003/09/02:加入 quotacheck 發生錯誤時的解決方法。
    2005/09/06:將舊的文章移動到 此處
    2005/09/06:進行版面風格的轉換,並且進行資料的查詢,加入 repquota 的簡單說明而已!
    2009/03/04:將原本舊的基於 FC4 的文件移動到 此處
    2009/03/06:加入 warnquota 這玩意兒!挺有趣的哩!
    2009/03/12:加入了 software RAID 與 LVM 的加強說明,尤其是 LVM 的快照 (snapshot) 的說明!
    2009/09/10:修改一些字樣之外,增加情境模擬,以及後續的簡答題部分題目。

    October 18

    如何在 Active Directory 中还原已删除的用户帐户及其组成员身份(转)

     

    转贴地址 http://support.microsoft.com/kb/840001/zh-cn

    本页

    展开全部 | 关闭全部

    概要

    您可以使用三种方法还原已删除的用户帐户、计算机帐户和安全组。这些对象统称为安全主体。在所有这三种方法中,都是先对已删除的对象执行授权还原,然后再还原已删除安全主体的组成员身份信息。还原已删除对象时,您必须还原受影响安全主体先前的 membermemberOf 属性值。这三种方法如下:

    • 方法 1:还原已删除的用户帐户,然后使用 Ntdsutil.exe 命令行工具将已还原的用户添加到原来的组中(仅限 Microsoft Windows Server 2003 Service Pack 1 [SP1])
    • 方法 2:还原已删除的用户帐户,然后将已还原用户添加至原来的组中
    • 方法 3:对已删除的用户帐户和已删除的用户所在的安全组执行两次授权还原

    方法 1 和 2 可为域用户和管理员提供更好的体验,因为它们会保留自上次备份系统状态到发生删除这段时间内向安全组中添加的用户。方法 3 不对安全主体进行个别调整,而是将安全组成员身份回滚到上次备份时的状态。
    如果您不具有有效的系统状态备份,而且发生删除的域包含基于 Windows Server 2003 的域控制器,您可以手动或以编程方式恢复已删除的对象。您也可以使用 Repadmin 实用工具来确定删除用户的时间和位置。
    多数大规模删除都是意外发生的。Microsoft 建议您采取一些措施,以防他人批量删除对象。

    注意:要避免意外删除或移动对象,可以向每个对象的安全描述符中添加两个 Deny 访问控制项 (ACE)。
    要在 Windows 2000 Server 和 Windows Server 2003 中执行此操作,请使用“Active Directory 用户和计算机”、ADSIEdit、LDP 或 DSACLS 命令行工具。在 Windows Server 2008 中,“Active Directory 用户和计算机”管理单元的“对象”选项卡上包括一个“防止对象被意外删除”复选框。在使用 Windows Server 2008 中的“Active Directory 用户和计算机”创建组织单位 (OU) 时,将出现“防止对象被意外删除”复选框。默认情况下,该复选框处于选中状态。
    虽然可以使用这些 ACE 配置 Active Directory 中的每个对象,但 OU 才是其最佳适用对象。删除或移动所有叶对象都会产生重大影响。此配置可防止发生这类删除或移动。要使用这样的配置真正删除或移动对象,必须先删除 Deny ACE。

    回到顶端

    更多信息

    本文分步介绍如何在从 Active Directory 中删除之后还原用户帐户、计算机帐户及其组成员身份。这一情况又可以分为多种情形,用户帐户、计算机帐户或安全组可能已被单个删除,也可能组合在一起删除。无论是哪种情况,初始步骤都是一样的 — 授权还原(或者使用 auth restore 还原)意外删除的对象。有些已删除的对象还需要其他一些操作才能被还原。这些对象包括用户帐户等对象,它们包含用作其他对象属性的反向链接的属性。其中的两个属性是 managedBymemberOf
    在向安全组中添加用户帐户、安全组或计算机帐户等安全主体时,将在 Active Directory 中执行下列更改:

    1. 将安全主体的名称添加到每个安全组的 member 属性中。
    2. 对于每个用户、计算机或安全组所属的安全组,都将向安全主体的 memberOf 属性中添加反向链接。
    同样,从 Active Directory 中删除用户、计算机或组时,将进行以下操作:
    1. 已删除的安全主体移至已删除对象容器中。
    2. 从已删除的安全主体中去除大量属性值,包括 memberOf 属性。
    3. 从所有所属的安全组中删除已删除的安全主体。也就是说,从每个安全组的 member 属性中删除已删除的安全主体。
    在恢复已删除的安全主体并还原其组成员身份时,需要记住一点,即每个安全主体都必须存在于 Active Directory 中,才能还原其组成员身份。(该成员可能是用户、计算机或其他安全组。)从广义上讲,此规则要求属性值为反向链接的对象必须存在于 Active Directory 中,才能还原或修改包含正向链接的对象。
    虽然本文重点介绍如何恢复已删除的用户帐户及其在安全组中的成员身份,但其概念同样适用于其他对象删除操作。这些概念还适用于 Active Directory 中其属性值使用到其他对象的正向链接和反向链接的已删除对象。
    您可以使用上述三种方法当中的任意一种来恢复安全主体。使用方法 1 时,您可以将添加到林中任一安全组的所有安全主体保留在原位置,并且只将从各自域中删除的安全主体添加至原来的安全组中。例如,您可以做一个系统状态备份,将用户添加到安全组中,然后还原系统状态备份。使用方法 1 或 2 时,将保留自创建系统状态备份到还原备份这段时间内向包含已删除用户的安全组中添加的所有用户。使用方法 3 时,会将包含已删除用户的所有安全组的安全组成员身份回滚到创建系统状态备份时的状态。

    回到顶端

    方法 1:还原已删除的用户帐户,然后使用 Ntdsutil.exe 命令行工具将已还原的用户添加到原来的组中(仅限 Microsoft Windows Server 2003 Service Pack 1 [SP1])
    注意:此方法仅在运行 Windows Server 2003 SP1 的域控制器上有效。如果用于恢复的域控制器上未安装 Windows Server 2003 SP1,请使用方法 2。
    在 Windows Server 2003 SP1 中,Ntdsutil.exe 命令行工具增加了一项新功能,有助于管理员更轻松地还原已删除对象的反向链接。每次授权还原操作都会生成两个文件。其中一个文件包含授权还原的对象的列表。另一个文件则是由 Ldifde.exe 实用工具使用的 .ldf 文件。此文件用于为授权还原的对象还原反向链接。在 Windows Server 2003 SP1 中,授权还原用户对象还会生成包含组成员身份信息的 LDIF 文件。此方法可避免双重还原。
    使用此方法时,需执行下列高级步骤:
    1. 查看用户域中是否存在未在删除中复制的全局编录,如果存在,则阻止对该全局编录进行复制。如果不存在潜在的全局编录,请在已删除用户所在的主域中查找全局编录域控制器的最新系统状态备份。
    2. 对所有已删除的用户帐户执行授权还原,然后允许对这些用户帐户进行端到端复制。
    3. 将所有已还原用户重新添加到这些用户帐户在被删除之前所属的各个域的所有组中。
    要使用方法 1,请按照以下步骤操作:
    1. 查看已删除的用户所在的主域中是否存在未复制任何删除部分的全局编录域控制器。
      注意:请重点关注复制计划次数最少的全局编录。
      如果存在一个或多个这样的全局编录,应使用 Repadmin.exe 命令行工具立即禁用入站复制。为此,请按照下列步骤操作:
      1. 单击“开始”,然后单击“运行”。
      2. 在“打开”框中键入 cmd,然后单击“确定”。
      3. 在命令提示符处键入以下命令,然后按 Enter:

        repadmin /options <recovery dc name> +DISABLE_INBOUND_REPL

        注意:如果无法立即发出 Repadmin 命令,请从潜在的全局编录中删除所有网络连接,直至可以使用 Repadmin 禁用入站复制,然后立即恢复网络连接。

      此域控制器将称为恢复域控制器。如果不存在这样的全局编录,请转到步骤 2。
    2. 如果符合下列所有条件,最好停止对林中安全组的更改:
      • 您正使用方法 1 按可分辨名称 (dn) 路径对已删除的用户帐户或计算机帐户执行授权还原。
      • 除了潜在的恢复域控制器外,已向林中的所有域控制器复制了删除。
      • 您当前未对安全组或其父容器执行授权还原。
      如果您正在对安全组或承载安全组或用户帐户的组织单位 (OU) 容器执行授权还原,请暂时停止所有这些更改。
      通知适当域中的管理员和技术支持管理员以及发生删除的域中的域用户停止这些更改。
    3. 在发生删除的域中,创建新的系统状态备份。如果必须回滚所做的更改,您可以使用此备份。
      注意:如果系统状态备份是删除时的最新状态,请跳过此步骤并转到步骤 4。
      如果在步骤 1 中确定了恢复域控制器,现在请备份它的系统状态。
      如果删除中复制了发生删除的域中的所有全局编录,请备份该域中全局编录的系统状态。
      如果创建了备份,则可将恢复域控制器还原为它当前的状态,并可以在首次尝试失败时再次执行恢复计划。
    4. 如果无法在删除了用户的域中找到潜在的全局编录域控制器,可在该域中查找全局编录域控制器的最新系统状态备份。此系统状态备份应包含已删除的对象。请将此域控制器用作恢复域控制器。
      只有用户域中全局编录域控制器的还原操作包含位于外部域中的安全组的全局和通用组成员身份信息。如果删除了用户的域中不存在全局编录域控制器的系统状态备份,您将无法使用还原的用户帐户的memberOf 属性来确定全局或通用组成员身份,或恢复外部域中的成员身份。此外,建议您查找非全局编录域控制器的最新系统状态备份。
    5. 如果您知道脱机管理员帐户的密码,请在 Dsrepair 模式下启动恢复域控制器。如果您不知道脱机管理员帐户的密码,请在恢复域控制器仍处于正常 Active Directory 模式下时重置密码。
      当运行 Microsoft Windows 2000 Service Pack 2 (SP2) 和更高版本的域控制器处于联机 Active Directory 模式下时,您可以使用 setpwd 命令行工具重置其密码。
      注意:Microsoft 不再支持 Windows 2000 SP2。安装最新的 Windows 2000 Service Pack 可获得此功能。
      有关更改恢复控制台管理员密码的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

      239803 如何在域控制器上更改恢复控制台的管理员密码

      Windows Server 2003 域控制器的管理员可以使用 Ntdsutil 命令行工具中的 set dsrm password 命令重置脱机管理员帐户的密码。
      有关如何重置目录服务还原模式管理员帐户的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

      322672 如何在 Windows Server 2003 中重置目录服务还原模式的管理员帐户密码

    6. 启动过程中按 F8 可以在 Dsrepair 模式下启动恢复域控制器。使用脱机管理员帐户登录到恢复域控制器的控制台。如果在步骤 5 中重置了密码,请使用新密码。
      如果恢复域控制器是一个潜在的全局编录域控制器,请不要还原系统状态。转到步骤 7。
      如果您要通过使用系统状态备份来创建恢复域控制器,请立即还原在该恢复域控制器上创建的最新系统状态备份。
    7. 对已删除的用户帐户、计算机帐户或安全组执行授权还原。
      注意授权还原这一术语是指使用 Ntdsutil 命令行工具中的 authoritative restore 命令增加特定对象或特定容器及其所有从属对象的版本号的过程。一旦发生端到端复制,恢复域控制器本地 Active Directory 副本中的目标对象就会在所有共享该分区的域控制器上变得具有授权。授权还原不同于系统状态还原。系统状态还原使用创建系统状态备份时的对象版本填充已还原的域控制器的 Active Directory 本地副本。
      有关对域控制器执行授权还原的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

      241594 如何在 Windows 2000 中对域控制器执行授权还原

      授权还原使用 Ntdsutil 命令行工具执行并引用已删除用户或承载已删除用户的容器的域名 (dn) 路径。
      执行授权还原时,应尽量使用在域树中处于最底层的域名 (dn) 路径,以避免还原与删除操作无关的对象。这些对象可能包括创建了系统状态备份后修改的对象。
      按照以下顺序对已删除的用户执行授权还原:

      1. 对每个已删除的用户帐户、计算机帐户或安全组的域名 (dn) 路径执行授权还原。
        与对整个子树执行授权还原相比,对特定的对象执行授权还原花费的时间更长,但是破坏性较小。对保存已删除对象的最不通用的父容器执行授权还原。
        Ntdsutil 使用以下语法:

        ntdsutil "authoritative restore" "restore object <object DN path>" q q

        例如,要对 Contoso.com 域的 Mayberry OU 中已删除的用户 JohnDoe 执行授权还原,请使用以下命令:

        ntdsutil "authoritative restore" "restore object cn=JohnDoe,ou=Mayberry,dc=contoso,dc=com" q q

        要对 Contoso.com 域的 Mayberry OU 中已删除的安全组 ContosoPrintAccess 执行授权还原,请使用以下命令:

        ntdsutil "authoritative restore" "restore object cn=ContosoPrintAccess,ou=Mayberry,dc=contoso,dc=com" q q

        重要说明:要求使用引号。
        对于还原的每个用户,至少会生成两个文件。这些文件的格式如下:
        ar_YYYYMMDD-HHMMSS_objects.txt
        此文件包含授权还原的对象的列表。在已还原用户属于“本地域”组成员的林中的任何其他域中,请将此文件与 ntdsutil authoritatative restore "create ldif file from" 命令结合使用。
        ar_YYYYMMDD-HHMMSS_links_usn.loc.ldf
        如果对全局编录执行授权还原,将为林中的每个域生成上述文件之一。此文件包含一个可在 Ldifde.exe 实用工具中使用的脚本。该脚本可还原已还原的对象的反向链接。在用户的主域中,该脚本可还原已还原的用户的所有组成员身份。在用户具有组成员身份的林中的所有其他域中,该脚本只能还原通用组和全局组的成员身份,而不能还原任何“本地域”组的成员身份。全局编录不跟踪这些成员身份。

      2. 只对承载已删除用户帐户或组的 OU 或公用名 (CN) 容器执行授权还原。
        ntdsutil "authoritative restore" 命令指向的 OU 包含您试图授权还原的绝大多数对象时,可以对整个子树执行授权还原。最好是目标 OU 包含您试图授权还原的所有对象。
        对 OU 子树执行授权还原时,将还原驻留在容器中的所有属性和对象。还原系统状态备份之前所进行的任何更改都会回滚到备份完成时的值。对于用户帐户、计算机帐户和安全组,这种回滚可能意味着要丢失对密码、主目录、配置文件路径、位置、联系人信息、组成员身份以及这些对象和属性上定义的任何安全描述符所做的最新更改。
        Ntdsutil 使用以下语法:

        ntdsutil "authoritative restore" "restore subtree <container DN path>" q q

        例如,要对 Contoso.com 域的 Mayberry OU 执行授权还原,请使用以下命令:

        ntdsutil "authoritative restore" "restore subtree ou=Mayberry, dc=contoso,dc=com" q q

      注意:请对承载已删除的用户或组的每个对等 OU 重复此步骤。
      重要说明:在还原 OU 的从属对象时,必须以显式方式授权还原已删除的从属对象的所有已删除父容器。
      对于还原的每个组织单位,至少会生成两个文件。这些文件的格式如下:
      ar_YYYYMMDD-HHMMSS_objects.txt
      此文件包含授权还原的对象的列表。在已还原的用户属于“本地域”组成员的林中的任何其他域中,请将此文件与 ntdsutil authoritatative restore "create ldif file from" 命令结合使用。
      有关更多信息,请访问下面的 Microsoft 网站:

      http://technet2.microsoft.com/WindowsServer/en/library/5ec3a3b1-c4b2-4c74-9d8a-61f7cb555f821033.mspx?mfr=true

      ar_YYYYMMDD-HHMMSS_links_usn.loc.ldf
      此文件包含一个可在 Ldifde.exe 实用工具中使用的脚本。该脚本可还原已还原的对象的反向链接。在用户的主域中,该脚本可还原已还原的用户的所有组成员身份。

    8. 如果通过系统状态还原在恢复域控制器上恢复了已删除的对象,请拔掉为林中的所有其他域控制器提供网络连接的所有网络电缆。
    9. 在正常 Active Directory 模式下重新启动恢复域控制器。
    10. 键入以下命令,以禁用对恢复域控制器的入站复制:

      repadmin /options <recovery dc name> +DISABLE_INBOUND_REPL

      重新启用到已还原系统状态的恢复域控制器的网络连接。

    11. 将已授权还原的对象从恢复域控制器出站复制到域和林中的域控制器上。
      在禁用对恢复域控制器的入站复制的同时,键入以下命令,以便将已授权还原的对象推入域中所有的跨站点复制域控制器以及林中所有的全局编录:

      repadmin /syncall /d /e /P <recovery dc> <Naming Context>

      如果符合下列所有条件,将在还原和复制已删除的用户帐户时重建组成员身份链接。请转到步骤 14。
      注意:如果不符合以下条件中的一个或多个,请转到步骤 12。

      • 您的林正在以 Windows Server 2003 林功能级别或 Windows Server 2003 过渡版林功能级别运行。
      • 只删除了用户帐户或计算机帐户,而没有删除安全组。
      • 在林转换到 Windows Server 2003 林功能级别后,将已删除的用户添加到了林中所有域中的安全组内。
    12. 在恢复域控制器的控制台上,请使用 Ldifde.exe 实用工具和 ar_YYYYMMDD-HHMMSS_links_usn.loc.ldf 文件还原用户的组成员身份。为此,请按照下列步骤操作:
      • 依次单击“开始”和“运行”,在“打开”框中键入 cmd,然后单击“确定”。
      • 在命令提示符处,键入以下命令并按 Enter:

        ldifde -i -f ar_YYYYMMDD-HHMMSS_links_usn.loc.ldf

    13. 使用以下命令启用对恢复域控制器的入站复制:

      repadmin /options <recovery dc name> -DISABLE_INBOUND_REPL

    14. 如果将已删除用户添加到了外部域的本地组中,请执行下列操作之一:
      • 将已删除用户手动添回这些组中。
      • 还原系统状态,并对包含已删除用户的每个本地安全组执行授权还原。
    15. 验证恢复域控制器所在的域及其他域中全局编录中的组成员身份。
    16. 为恢复域控制器所在域中的域控制器创建新的系统状态备份。
    17. 通知林中的所有林管理员、受委托的管理员、技术支持管理员以及域中的用户,用户还原已完成。
      对于授权还原的用户帐户和计算机帐户,如果其域密码在系统还原后发生了更改,技术支持管理员就可能需要重置这些密码。
      在创建了系统状态备份之后更改密码的用户将会发现他们的新密码不再有效了。如果这些用户知道旧密码,可以让他们尝试使用旧密码进行登录。否则,技术支持管理员必须重置密码并选中“用户下次登录时须更改密码”复选框,此操作最好是在用户所在的 Active Directory 站点中的域控制器上执行。

    回到顶端

    方法 2:还原已删除的用户帐户,然后将已还原用户添加至原来的组中
    使用此方法时,需执行下列高级步骤:
    1. 查看用户域中是否存在未在删除中复制的全局编录,如果存在,则阻止对该全局编录进行复制。如果不存在潜在的全局编录,请在已删除用户所在的主域中查找全局编录域控制器的最新系统状态备份。
    2. 对所有已删除的用户帐户执行授权还原,然后允许对这些用户帐户进行端到端复制。
    3. 将所有已还原用户重新添加到这些用户帐户在被删除之前所属的各个域的所有组中。
    要使用方法 2,请执行以下操作:
    1. 查看已删除的用户所在的主域中是否存在未复制任何删除部分的全局编录域控制器。
      注意:请重点关注复制计划次数最少的全局编录。
      如果存在一个或多个这样的全局编录,应使用 Repadmin.exe 命令行工具立即禁用入站复制。为此,请按照下列步骤操作:
      1. 单击“开始”,然后单击“运行”。
      2. 在“打开”框中键入 cmd,然后单击“确定”。
      3. 在命令提示符处键入以下命令,然后按 Enter:

        repadmin /options <recovery dc name> +DISABLE_INBOUND_REPL

        注意:如果无法立即发出 Repadmin 命令,请从潜在的全局编录中删除所有网络连接,直至可以使用 Repadmin 禁用入站复制,然后立即恢复网络连接。

      此域控制器将称为恢复域控制器。如果不存在这样的全局编录,请转到步骤 2。
    2. 确定是否必须暂时停止添加、删除和更改用户帐户、计算机帐户和安全组的操作,直到完成所有的恢复步骤。
      为了保持最灵活的恢复路径,请暂时停止对以下项目的更改。这些更改包括域用户、技术支持管理员和发生删除的域中的管理员进行的密码重置,以及已删除用户的组中进行的组成员身份更改。请停止对以下项目的添加、删除和修改操作:
      1. 用户帐户及其属性
      2. 计算机帐户及其属性
      3. 服务帐户
      4. 安全组
      如果符合下列所有条件,最好停止对林中安全组的更改:
      • 您正使用方法 2 按域名 (dn) 路径对已删除的用户帐户或计算机帐户执行授权还原。
      • 除了潜在的恢复域控制器外,已向林中的所有域控制器复制了删除。
      • 您当前未对安全组或其父容器执行授权还原。
      如果您正在对安全组或承载安全组或用户帐户的组织单位 (OU) 容器执行授权还原,请暂时停止所有这些更改。
      通知适当域中的管理员和技术支持管理员以及发生删除的域中的域用户停止这些更改。
    3. 在发生删除的域中,创建新的系统状态备份。如果必须回滚所做的更改,您可以使用此备份。
      注意:如果系统状态备份是删除时的最新状态,请跳过此步骤并转到步骤 4。
      如果在步骤 1 中确定了恢复域控制器,现在请备份它的系统状态。
      如果删除中复制了发生删除的域中的所有全局编录,请备份该域中全局编录的系统状态。
      如果创建了备份,则可将恢复域控制器还原为它当前的状态,并可以在首次尝试失败时再次执行恢复计划。
    4. 如果无法在删除了用户的域中找到潜在的全局编录域控制器,可在该域中查找全局编录域控制器的最新系统状态备份。此系统状态备份应包含已删除的对象。请将此域控制器用作恢复域控制器。
      只有用户域中全局编录域控制器的还原操作包含位于外部域中的安全组的全局和通用组成员身份信息。如果删除了用户的域中不存在全局编录域控制器的系统状态备份,您将无法使用还原的用户帐户的memberOf 属性来确定全局或通用组成员身份,或恢复外部域中的成员身份。此外,建议您查找非全局编录域控制器的最新系统状态备份。
    5. 如果您知道脱机管理员帐户的密码,请在 Dsrepair 模式下启动恢复域控制器。如果您不知道脱机管理员帐户的密码,请在恢复域控制器仍处于正常 Active Directory 模式下时重置密码。
      当运行 Microsoft Windows 2000 Service Pack 2 (SP2) 和更高版本的域控制器处于联机 Active Directory 模式下时,您可以使用 setpwd 命令行工具重置其密码。
      注意:Microsoft 不再支持 Windows 2000 SP2。安装最新的 Windows 2000 Service Pack 可获得此功能。
      有关更改恢复控制台管理员密码的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

      239803 如何在域控制器上更改恢复控制台的管理员密码

      Windows Server 2003 域控制器的管理员可以使用 Ntdsutil 命令行工具中的 set dsrm password 命令重置脱机管理员帐户的密码。
      有关如何重置目录服务还原模式管理员帐户的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

      322672 如何在 Windows Server 2003 中重置目录服务还原模式的管理员帐户密码

    6. 启动过程中按 F8 可以在 Dsrepair 模式下启动恢复域控制器。使用脱机管理员帐户登录到恢复域控制器的控制台。如果在步骤 5 中重置了密码,请使用新密码。
      如果恢复域控制器是一个潜在的全局编录域控制器,请不要还原系统状态。转到步骤 7。
      如果您要通过使用系统状态备份来创建恢复域控制器,请立即还原在该恢复域控制器上创建的最新系统状态备份。
    7. 对已删除的用户帐户、计算机帐户或安全组执行授权还原。
      注意授权还原这一术语是指使用 Ntdsutil 命令行工具中的 authoritative restore 命令增加特定对象或特定容器及其所有从属对象的版本号的过程。一旦发生端到端复制,恢复域控制器本地 Active Directory 副本中的目标对象就会在所有共享该分区的域控制器上变得具有授权。授权还原不同于系统状态还原。系统状态还原使用创建系统状态备份时的对象版本填充已还原的域控制器的 Active Directory 本地副本。
      有关对域控制器执行授权还原的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

      241594 如何在 Windows 2000 中对域控制器执行授权还原

      授权还原使用 Ntdsutil 命令行工具执行并引用已删除用户或承载已删除用户的容器的域名 (dn) 路径。
      执行授权还原时,应尽量使用在域树中处于最底层的域名 (dn) 路径,以避免还原与删除操作无关的对象。这些对象可能包括创建了系统状态备份后修改的对象。
      按照以下顺序对已删除的用户执行授权还原:

      1. 对每个已删除的用户帐户、计算机帐户或安全组的域名 (dn) 路径执行授权还原。
        与对整个子树执行授权还原相比,对特定的对象执行授权还原花费的时间更长,但是破坏性较小。对保存已删除对象的最不通用的父容器执行授权还原。
        Ntdsutil 使用以下语法:

        ntdsutil "authoritative restore" "restore object <object DN path>" q q

        例如,要对 Contoso.com 域的 Mayberry OU 中已删除的用户 JohnDoe 执行授权还原,请使用以下命令:

        ntdsutil "authoritative restore" "restore object cn=JohnDoe,ou=Mayberry,dc=contoso,dc=com" q q

        要对 Contoso.com 域的 Mayberry OU 中已删除的安全组 ContosoPrintAccess 执行授权还原,请使用以下命令:

        ntdsutil "authoritative restore" "restore object cn=ContosoPrintAccess,ou=Mayberry,dc=contoso,dc=com" q q

        重要说明:要求使用引号。
        注意:此语法只适用于 Windows Server 2003。在 Windows 2000 中只能使用以下语法:

        ntdsutil "authoritative restore" "restore subtree object DN path"

        注意:如果可分辨名称 (dn) 路径中包含扩展字符或空格,Ntdsutil 授权还原操作将失败。为了使该脚本式还原获得成功,必须将“restore object <DN path>”命令作为一个完整的字符串传递。
        要解决此问题,请使用反斜杠-双引号转义序列封装包含扩展字符和空格的 DN。下面是一个示例:
        ntdsutil "authoritative restore" "restore object \"CN=John Doe,OU=Mayberry NC,DC=contoso,DC=com\"" q q
        注意:如果要还原的对象的 DN 包含逗号,则必须进一步修改该命令。请参见以下示例:
        ntdsutil "authoritative restore" "restore object \"CN=Doe\, John,OU=Mayberry NC,DC=contoso,DC=com\"" q q
        注意:从磁带还原对象时,如果在将这些对象标记为具有授权后,还原未按预期进行,则当使用同一磁带再次还原 NTDS 数据库时,必须增大要执行授权还原的对象的 USN 版本,以使其超过默认值 100000,否则在第二次还原后将无法复制出这些对象。要通过编写脚本的方式使版本号超过 100000(默认值),需要使用以下语法:ntdsutil "authoritative restore" "restore object \"CN=Doe\, John,OU=Mayberry NC,DC=contoso,DC=com\" verinc 150000\"" q q
        注意:如果脚本对每个要还原的对象都发出确认提示,可以关闭这些提示。关闭提示的语法如下:ntdsutil "popups off" "authoritative restore" "restore object \"CN=John Doe,OU=Mayberry NC,DC=contoso,DC=com\" verinc 150000\"" q q

      2. 只对承载已删除用户帐户或组的 OU 或公用名 (CN) 容器执行授权还原。
        ntdsutil "authoritative restore" 命令指向的 OU 包含您试图授权还原的绝大多数对象时,可以对整个子树执行授权还原。最好是目标 OU 包含您试图授权还原的所有对象。
        对 OU 子树执行授权还原时,将还原驻留在容器中的所有属性和对象。还原系统状态备份之前所进行的任何更改都会回滚到备份完成时的值。对于用户帐户、计算机帐户和安全组,这种回滚可能意味着要丢失对密码、主目录、配置文件路径、位置、联系人信息、组成员身份以及这些对象和属性上定义的任何安全描述符所做的最新更改。
        Ntdsutil 使用以下语法:

        ntdsutil "authoritative restore" "restore subtree <container DN path>" q q

        例如,要对 Contoso.com 域的 Mayberry OU 执行授权还原,请使用以下命令:

        ntdsutil "authoritative restore" "restore subtree ou=Mayberry, dc=contoso,dc=com" q q

      注意:请对承载已删除的用户或组的每个对等 OU 重复此步骤。
      重要说明:在还原 OU 的从属对象时,必须以显式方式授权还原已删除的从属对象的所有已删除父容器。
    8. 如果通过系统状态还原在恢复域控制器上恢复了已删除的对象,请拔掉为林中的所有其他域控制器提供网络连接的所有网络电缆。
    9. 在正常 Active Directory 模式下重新启动恢复域控制器。
    10. 键入以下命令,以禁用对恢复域控制器的入站复制:

      repadmin /options <recovery dc name> +DISABLE_INBOUND_REPL

      重新启用到已还原系统状态的恢复域控制器的网络连接。

    11. 将已授权还原的对象从恢复域控制器出站复制到域和林中的域控制器上。
      在禁用对恢复域控制器的入站复制的同时,键入以下命令,以便将已授权还原的对象推入域中所有的跨站点复制域控制器以及林中所有的全局编录:

      repadmin /syncall /d /e /P <recovery dc> <Naming Context>

      如果符合下列所有条件,将在还原和复制已删除的用户帐户时重建组成员身份链接。请转到步骤 14。
      注意:如果不符合以下条件中的一个或多个,请转到步骤 12。

      • 您的林正在以 Windows Server 2003 林功能级别或 Windows Server 2003 过渡版林功能级别运行。
      • 只删除了用户帐户或计算机帐户,而没有删除安全组。
      • 在林转换到 Windows Server 2003 林功能级别后,将已删除的用户添加到了林中所有域中的安全组内。
    12. 确定已删除用户所属的安全组,然后将其添加到这些组中。
      注意:在向这些组中添加用户之前,必须先将您在步骤 7 中授权还原的用户以及您在步骤 11 中出站复制的用户,复制到引用的域控制器所在域的域控制器以及林中的所有全局编录域控制器上。
      如果部署了使用组提供实用工具来重新填充安全组的成员身份,请立即使用该实用工具将已删除用户还原到他们被删除之前所在的安全组中。在林的域和全局编录服务器中的所有直接和中间域控制器都已入站复制了授权还原的用户和所有已还原容器后,再执行此操作。
      如果您没有此类实用工具,在恢复域控制器上运行时,Ldifde.exe 命令行工具和 Groupadd.exe 命令行工具可以自动完成此这项任务。这些工具可以通过 Microsoft 产品支持服务获得。在此情况下,Ldifde.exe 将从管理员指定的 OU 容器开始,创建包含用户帐户及其安全组的名称的 LDAP 数据交换格式 (LDIF) 信息文件。然后,Groupadd.exe 将读取 .ldf 文件中列出的每个用户帐户的memberOf 属性,并为林中每个域生成独立的、唯一的 LDIF 信息。此 LDIF 信息包括需要将已删除用户添回其中以便恢复用户组成员身份的安全组的名称。在此恢复阶段,请按照以下步骤操作。
      1. 通过使用域管理员安全组中的用户帐户登录到恢复域控制器的控制台。
      2. 使用 Ldifde 命令转储先前删除的用户帐户名称及其 memberOf 属性,首先从发生删除的最顶端 OU 容器开始。Ldifde 命令使用下面的语法:

        ldifde -d <dn path of container that hosts deleted users> -r "(objectClass=user)" -l memberof -p subtree -f user_membership_after_restore.ldf

        如果将已删除的计算机帐户添加到了安全组中,请使用下面的语法:

        ldifde -d <dn path of container that hosts deleted users> -r "(objectClass=computer)" -l memberof -p subtree -f computer_membership_after_restore.ldf

      3. 运行 Groupadd 命令,构建其他包含已删除用户所属的域及全局和通用安全组的名称的 .ldf 文件。Groupadd 命令使用下面的语法:

        Groupadd /after_restore users_membership_after_restore.ldf

        如果将已删除的计算机帐户添加到了安全组中,请重复此命令。

      4. 将您在步骤 12c 中创建的每个 Groupadd_fully.qualified.domainname.ldf 文件导入到与每个域的 .ldf 文件相对应的单个全局编录域控制器中。使用以下 Ldifde 语法:

        Ldifde –i –k –f Groupadd_<fully.qualified.domain.name>.ldf

        为所有域控制器(恢复域控制器除外)上、已从其中删除用户的域运行 .ldf 文件。

      5. 在用于为特定域导入 Groupadd_<fully.qualified.domain.name>.ldf 文件的每个域控制器的控制台上,请使用以下命令将添加的组成员身份出站复制到域中的其他域控制器或林中的全局编录域控制器上:

        repadmin /syncall /d /e /P <recovery dc> <Naming Context>

    13. 要禁用出站复制,请键入以下文本,然后按 Enter:

      repadmin /options +DISABLE_OUTBOUND_REPL

      注意:要重新启用出站复制,请键入以下文本,然后按 Enter:

      repadmin /options -DISABLE_OUTBOUND_REPL

    14. 如果将已删除用户添加到了外部域的本地组中,请执行下列操作之一:
      • 将已删除用户手动添回这些组中。
      • 还原系统状态,并对包含已删除用户的每个本地安全组执行授权还原。
    15. 验证恢复域控制器所在的域及其他域中全局编录中的组成员身份。
    16. 为恢复域控制器所在域中的域控制器创建新的系统状态备份。
    17. 通知林中的所有林管理员、受委托的管理员、技术支持管理员以及域中的用户,用户还原已完成。
      对于授权还原的用户帐户和计算机帐户,如果其域密码在系统还原后发生了更改,技术支持管理员就可能需要重置这些密码。
      在创建了系统状态备份之后更改密码的用户将会发现他们的新密码不再有效了。如果这些用户知道旧密码,可以让他们尝试使用旧密码进行登录。否则,技术支持管理员必须重置密码并选中“用户下次登录时须更改密码”复选框,此操作最好是在用户所在的 Active Directory 站点中的域控制器上执行。

    回到顶端

    方法 3:授权还原两次已删除的用户和已删除用户的安全组
    使用此方法时,需执行下列高级步骤:
    1. 查看用户域中的全局编录是否未在删除中复制,如果尚未复制,则阻止域控制器入站复制该删除。如果不存在潜在的全局编录,请在已删除用户所在的主域中查找全局编录域控制器的最新系统状态备份。
    2. 授权还原所有已删除的用户帐户和已删除用户的域中的所有安全组。
    3. 等待将已还原用户和安全组端到端复制到已删除用户的域中的所有域控制器中和林的全局编录域控制器中。
    4. 重复步骤 2 和步骤 3 以对已删除的用户和安全组执行授权还原。(只能进行一次系统状态还原。)
    5. 如果已删除用户是其他域中的安全组的成员,则对这些域中包含已删除用户的所有安全组执行授权还原。或者,如果系统状态备份是最新的,则对这些域中的所有安全组执行授权还原。
    为了满足必须在安全组之前还原已删除的组成员以便修复组成员身份链接这一要求,在此方法中您需要将这两种对象类型还原两次。第一次还原将所有用户帐户和组帐户放置在适当的位置上,第二次还原将还原已删除的组并修复组成员身份信息,包括嵌套组的成员身份信息。
    要使用方法 3,请按照以下过程操作:
    1. 查看已删除的用户所在的主域中是否存在未在任何删除部分中复制的全局编录域控制器。
      注意:重点关注复制计划次数最少的域中的全局编录。如果存在这些域控制器,应使用 Repadmin.exe 命令行工具立即禁用入站复制。为此,请按照下列步骤操作:
      1. 单击“开始”,然后单击“运行”。
      2. 在“打开”框中键入 command,然后单击“确定”。
      3. 在命令提示符下键入 repadmin /options <recovery dc name>+DISABLE_INBOUND_REPL,然后按 Enter。
        注意:如果您无法立即运行 Repadmin 命令,则断开所有到域控制器的网络连接,直到您可以使用 Repadmin 禁用入站复制,然后立即恢复网络连接。
      此域控制器将称为恢复域控制器。
    2. 在完成所有恢复步骤之前,避免对以下项目进行任何添加、删除和更改操作。这些更改包括域用户、技术支持管理员和发生删除的域中的管理员进行的密码重置,以及已删除用户的组中进行的组成员身份更改。
      1. 用户帐户及其属性
      2. 计算机帐户及其属性
      3. 服务帐户
      4. 安全组
        注意:尤其应避免更改发生删除的林中的用户、计算机、组和服务帐户的组成员身份。
      5. 向林中的所有林管理员、受委托的管理员和技术支持管理员通知临时停机。
      方法 2 中要求临时停机,这是因为您要对所有已删除用户的安全组执行授权还原。因此,系统状态备份之后对组进行的任何更改都将丢失。
    3. 在发生删除的域中,创建新的系统状态备份。如果必须回滚所做的更改,您可以使用此备份。
      注意:如果系统状态备份是发生删除时的状态,跳过此步骤,转到步骤 4。
      如果在步骤 1 中确定了恢复域控制器,现在请备份它的系统状态。
      如果删除中复制了位于发生删除的域中的所有全局编录,请备份该域中全局编录的系统状态。
      如果创建了备份,则可将恢复域控制器还原为它当前的状态,并可以在首次尝试失败时再次执行恢复计划。
    4. 如果无法在删除了用户的域中找到潜在的全局编录域控制器,可在该域中查找全局编录域控制器的最新系统状态备份。此系统状态备份应包含已删除的对象。请将此域控制器用作恢复域控制器。
      只有用户域中的全局编录域控制器的数据库包含林中外部域的组成员身份信息。如果删除了用户的域中不存在全局编录域控制器的系统状态备份,您将无法使用还原的用户帐户的 memberOf 属性来确定全局或通用组成员身份,或恢复外部域中的成员身份。转到下一个步骤。如果外部域中存在组成员身份的外部记录,请在还原用户帐户之后,将已还原用户添加到这些域中的安全组中。
    5. 如果您知道脱机管理员帐户的密码,请在 Dsrepair 模式下启动恢复域控制器。如果您不知道脱机管理员帐户的密码,请在恢复域控制器仍处于正常 Active Directory 模式下时重置密码。
      当运行 Microsoft Windows 2000 Service Pack 2 (SP2) 和更高版本的域控制器处于联机 Active Directory 模式下时,您可以使用 setpwd 命令行工具重置其密码。
      注意:Microsoft 不再支持 Windows 2000 SP2。安装最新的 Windows 2000 Service Pack 可获得此功能。
      有关更改恢复控制台管理员密码的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

      239803 如何在域控制器上更改恢复控制台的管理员密码

      Windows Server 2003 域控制器的管理员可以使用 Ntdsutil 命令行工具中的 set dsrm password 命令重置脱机管理员帐户的密码。
      有关如何重置目录服务还原模式管理员帐户的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

      322672 如何在 Windows Server 2003 中重置目录服务还原模式的管理员帐户密码

    6. 启动过程中按 F8 可以在 Dsrepair 模式下启动恢复域控制器。使用脱机管理员帐户登录到恢复域控制器的控制台。如果在步骤 5 中重置了密码,请使用新密码。
      如果恢复域控制器是一个潜在的全局编录域控制器,请不要还原系统状态。直接转到步骤 7。
      如果您要通过使用系统状态备份来创建恢复域控制器,现在请还原在包含已删除的对象的恢复域控制器上创建的最新系统状态备份。
    7. 对已删除的用户帐户、计算机帐户或安全组执行授权还原。
      注意授权还原这一术语是指使用 Ntdsutil 命令行工具中的 authoritative restore 命令增加特定对象或特定容器及其所有从属对象的版本号的过程。一旦发生端到端复制,恢复域控制器本地 Active Directory 副本中的目标对象就会在所有共享该分区的域控制器上变得具有授权。授权还原不同于系统状态还原。系统状态还原使用创建系统状态备份时的对象版本填充已还原的域控制器的 Active Directory 本地副本。
      有关对域控制器执行授权还原的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

      241594 如何在 Windows 2000 中对域控制器执行授权还原

      授权还原是通过引用已删除用户或承载已删除用户的容器的域名 (dn) 路径,使用 Ntdsutil 命令行工具执行的。
      执行授权还原时,应尽量使用在域树中处于最底层的域名 (dn) 路径,以避免还原与删除操作无关的对象。这些对象可能包括创建了系统状态备份后修改的对象。
      按照以下顺序对已删除的用户执行授权还原:

      1. 授权还原每个已删除用户帐户、计算机帐户或已删除安全组的域名 (dn) 路径。
        与对整个子树执行授权还原相比,对特定的对象执行授权还原花费的时间更长,但是破坏性较小。对保存已删除对象的最不通用的父容器执行授权还原。
        Ntdsutil 使用以下语法:

        ntdsutil "authoritative restore" "restore object <object DN path>" q q

        例如,要对 Contoso.com 域的 Mayberry OU 中已删除的用户 JohnDoe 执行授权还原,请使用以下命令:

        ntdsutil "authoritative restore" "restore object cn=JohnDoe,ou=Mayberry,dc=contoso,dc=com" q q

        要对 Contoso.com 域的 Mayberry OU 中已删除的安全组 ContosoPrintAccess 执行授权还原,请使用以下命令:

        ntdsutil "authoritative restore" "restore object cn=ContosoPrintAccess,ou=Mayberry,dc=contoso,dc=com" q q

        重要说明:要求使用引号。
        使用此 Ntdsutil 格式,您还可以为批处理文件或脚本中的许多对象执行自动授权还原。
        注意:此语法只适用于 Windows Server 2003。在 Windows 2000 中只能使用以下语法:ntdsutil "authoritative restore" "restore subtree object DN path"。

      2. 只对承载已删除用户帐户或组的 OU 或公用名 (CN) 容器执行授权还原。
        Ntdsutil Authoritative restore 命令指向的 OU 包含您试图授权还原的绝大多数对象时,可以对整个子树执行授权还原。最好是目标 OU 包含您试图授权还原的所有对象。
        OU 子树上的授权还原将还原容器中的所有属性和对象。还原系统状态备份之前所进行的任何更改都会回滚到备份完成时的值。对于用户帐户、计算机帐户和安全组,这种回滚可能意味着要丢失对密码、主目录、配置文件路径、位置、联系人信息、组成员身份以及这些对象和属性上定义的任何安全描述符所做的最新更改。
        Ntdsutil 使用以下语法:

        ntdsutil "authoritative restore" "restore subtree <container DN path>" q q

        例如,要对 Contoso.com 域的 Mayberry OU 执行授权还原,请使用以下命令:

        ntdsutil "authoritative restore" "restore subtree ou=Mayberry,dc=contoso,dc=com" q q

      注意:请对承载已删除的用户或组的每个对等 OU 重复此步骤。
      重要说明:还原 OU 的从属对象时,必须以显式方式,对已删除从属对象的所有父容器执行授权还原。
    8. 在正常 Active Directory 模式下重新启动恢复域控制器。
    9. 将已授权还原的对象从恢复域控制器出站复制到域中及林中的域控制器。
      在禁用对恢复域控制器的入站复制的同时,键入以下命令,以便将已授权还原的对象推入域中所有的跨站点复制域控制器以及林中的全局编录:

      repadmin /syncall /d /e /P <recovery dc> <Naming Context>

      在林的域和全局编录服务器中的所有直接和中间域控制器都已入站复制了授权还原的用户和所有已还原容器后,转到步骤 11。
      如果符合下列所有条件,将使用已删除用户帐户的还原重新建立组成员身份链接。转到步骤 13。

      • 您的林正在以 Windows Server 2003 林功能级别或 Windows Server 2003 过渡版林功能级别运行。
      • 只有安全组未被删除。
      • 所有已删除的用户都被添加到了林中所有域的所有安全组中。
      考虑使用 Repadmin 命令来加快从已还原域控制器中出站复制用户的速度。
      如果这些组也已经被删除,或者您无法保证在转换到 Windows Server 2003 过渡版或林功能级别后已将所有已删除的用户添加到了所有安全组中,请转到步骤 12。
    10. 无须还原系统状态,重复步骤 7、8 和 9,然后转到步骤 11。
    11. 如果将已删除用户添加到了外部域的本地组中,请执行下列操作之一:
      • 将已删除用户手动添回这些组中。
      • 还原系统状态,并对包含已删除用户的每个本地安全组执行授权还原。
    12. 验证恢复域控制器所在的域及其他域中全局编录中的组成员身份。
    13. 使用以下命令启用对恢复域控制器的入站复制:

      repadmin /options recovery dc name -DISABLE_INBOUND_REPL

    14. 为处于恢复域控制器所在的域中及林中其他域的全局编录中的域控制器创建新的系统状态备份。
    15. 通知林中的所有林管理员、受委托的管理员、技术支持管理员以及域中的用户,用户还原已完成。
      技术支持管理员可能必须重置那些系统还原后域密码发生更改的已授权还原的用户帐户和计算机帐户的密码。
      在创建了系统状态备份之后更改密码的用户将会发现他们的新密码不再有效了。如果这些用户知道旧密码,可以让他们尝试使用旧密码进行登录。否则,技术支持管理员必须重置密码并选中“用户下次登录时须更改密码”复选框,此操作最好是在用户所在的 Active Directory 站点中的域控制器上执行。

    回到顶端

    如果没有有效的系统状态备份,如何在 Windows Server 2003 域控制器上恢复已删除的用户
    如果您没有删除了用户帐户或安全组的域中的当前系统状态备份,并且该删除发生在包含 Windows Server 2003 域控制器的域中,请按照以下步骤从已删除的对象容器中手动重新加进已删除对象:
    1. 请按照“如何在已删除对象的容器中手动撤消删除对象”部分中介绍的步骤重新加进已删除的用户、计算机、组或所有这些对象。
    2. 使用“Active Directory 用户和计算机”管理单元将帐户从禁用状态更改为启用状态。(帐户出现在原始 OU 中。)
    3. 使用 Windows Server 2003 版的“Active Directory 用户和计算机”中的批量重置功能,根据需要批量重置已删除帐户的“下次登录时须更改密码”策略设置、主目录、配置文件路径和组成员身份。您也可以通过编程方式实现这些功能。
    4. 如果使用了 Microsoft Exchange 2000 或更高版本,请修复已删除用户的 Exchange 邮箱。
    5. 如果使用 Exchange 2000 或更高版本,请重新关联已删除用户和 Exchange 邮箱。
    6. 验证已恢复用户是否可以登录并访问本地目录、共享目录和文件。
    您可以使用以下方法自动完成部分或全部恢复步骤:
    • 编写一个自动完成步骤 1 中列出的手动恢复步骤的脚本。编写此类脚本时,请考虑按日期、时间和上次已知的父容器界定已删除对象的范围,然后自动完成对已删除对象的恢复。要自动执行恢复,请将isDeleted 属性从 TRUE 更改为 FALSE,并将相关可分辨名称更改为在 lastKnownParent 属性中或者在新 OU 或由管理员指定的公用名 (CN) 中定义的值。(相关可分辨名称也称为 RDN。)
    • 获取一个支持在 Windows Server 2003 域控制器上恢复已删除对象的非 Microsoft 程序。AdRestore 就是一种实用工具。AdRestore 使用 Windows Server 2003 撤消删除基元逐个撤消对象删除操作。Aelita Software Corporation 和 Commvault Systems 提供的产品也在基于 Windows Server 2003 的域控制器上支持撤消删除功能。
      要获取 AdRestore,请访问下面的网站:

      http://www.microsoft.com/china/technet/sysinternals/Networking/AdRestore.mspx

    Microsoft 提供了第三方联系信息以便于您寻求技术支持。这些联系信息如有更改,恕不另行通知。Microsoft 不保证这些第三方联系信息的准确性。

    回到顶端

    如何在已删除对象的容器中手动撤消删除对象
    要在已删除对象的容器中手动恢复对象,请按照以下步骤操作:
    1. 单击“开始”,单击“运行”,然后键入 ldp.exe。
      注意:如果未安装 Ldp 实用工具,请安装 Windows Server 2003 安装 CD 中的支持工具。
    2. 使用 Ldp 中的“连接”菜单执行到 Windows Server 2003 域控制器的连接和绑定操作。
      在绑定操作期间指定域管理员凭据。
    3. 在“选项”菜单上,单击“控件”。
    4. 在“预定义加载”列表中,单击“返回已删除对象”。
      注意1.2.840.113556.1.4.417 控件移到了“活动控件”窗口。
    5. 在“控件类型”下,单击“服务器”,然后单击“确定”。
    6. 在“视图”菜单上,单击“树”,键入发生删除的域中的已删除对象容器的可分辨名称路径,然后单击“确定”。
      注意:可分辨名路径也称为 DN 路径。例如,如果删除发生在 contoso.com 域中,DN 路径应为以下路径:

      cn=deleted Objects,dc=contoso,dc=com

    7. 在窗口的左窗格中,双击“已删除对象的容器”。
      注意:默认情况下,Idap 查询的搜索结果中只会返回 1000 个对象。例如,如果已删除对象的容器中存在的对象超过 1000 个,此容器中并不会显示所有这些对象。如果未显示您的目标对象,请使用ntdsutil,然后使用 maxpagesize 设置最大数目,以得到所需的搜索结果。
    8. 双击您要恢复或重新加进的对象。
    9. 右键单击要重新加进的对象,然后单击“修改”。
      在一次轻型目录访问协议 (LDAP) 修改操作中更改 isDeleted 属性的值和 DN 路径。要配置“修改”对话框,请按照下列步骤操作:
      1. 在“编辑条目属性”框中,键入 isDeleted。
        让“值”框保留为空。
      2. 单击“删除”选项按钮,然后单击“输入”,以便在“条目列表”对话框中创建两个条目中的第一个条目。
        重要说明:不要单击“运行”。
      3. 在“属性”框中,键入 distinguishedName。
      4. 在“值”框中,键入重新加进对象的新 DN 路径。
        例如,要将 JohnDoe 用户帐户重新加进 Mayberry OU 中,请使用以下 DN 路径:

        cn=JohnDoe,ou=Mayberry,dc=contoso,dc=com

        注意:如果要将已删除对象重新加进其原始容器中,请在已删除对象的 CN 值后附加其lastKnownParent 属性的值,然后将完整 DN 路径粘贴到“值”框中。

      5. 在“操作”框中,单击“替换”。
      6. 单击“输入”。
      7. 单击以选中“同步”复选框。
      8. 单击以选中“扩展”复选框。
      9. 单击“运行”。
    10. 重新加进对象后,请单击“选项”菜单上的“控件”,然后单击“签出”按钮,以便从“活动控件”列表框中删除 (1.2.840.113556.1.4.417)。
    11. 重置已删除用户的用户帐户密码、配置文件、主目录和组成员身份。
      删除对象后,将去除除 SIDObjectGUIDLastKnownParentSAMAccountName 之外的所有属性值。
    12. 在“Active Directory 用户和计算机”中启用此重新加进的帐户。
      注意:重新加进的对象的主 SID 与删除前相同,但是必须将该对象重新添加到同一安全组中,它才能具有相同的资源访问级别。第一版的 Windows Server 2003 不保留重新加进的用户帐户、计算机帐户和安全组的 sIDHistory 属性。Windows Server 2003 Service Pack 1 保留已删除对象的sIDHistory 属性。
    13. 删除 Microsoft Exchange 属性,将用户重新连接到 Exchange 邮箱。
      注意:如果删除发生在 Windows Server 2003 域控制器上,则支持重新加进已删除的对象。如果删除发生在 Windows 2000 域控制器上,而该控制器后来又升级至 Windows Server 2003,则不支持重新加进已删除的对象。
      注意:如果删除发生在域的 Windows 2000 域控制器上,lastParentOf 属性将不会填充到 Windows Server 2003 域控制器上。

    回到顶端

    如何确定删除发生的时间和位置
    如果用户是由于批量删除而被删除的,您可能想了解删除发生的位置。为此,请按照下列步骤操作:
    1. 如果正确配置了审核来跟踪组织单位 (OU) 容器或从属对象的删除,请使用用于搜索发生删除的域中的域控制器的安全事件日志的实用工具。EventCombMT 就是一种这样的实用工具,它用于搜索域控制器的作用域集合上的事件日志。EventCombMT 包含在 Windows Server 2003 Resource Kit Tools 工具集中。
      有关如何获取 Windows Server 2003 资源工具包工具这一工具集的更多信息,请访问下面的 Microsoft 网页:

      http://technet.microsoft.com/zh-cn/windowsserver/bb693323(en-us).aspx

    2. 请按照“如何在已删除对象的容器中手动撤消删除对象”部分中的步骤 1 到步骤 7 查找已删除的安全主体。如果删除了树,请按照以下步骤查找已删除对象的父容器。
    3. objectGUID 属性的值复制到 Windows 剪贴板上。
      在步骤 4 中输入 Repadmin 命令时,可以粘贴此值。
    4. 键入下面的命令:

      repadmin /showmeta GUID=<objectGUID> <FQDN>

      例如,如果已删除对象或容器的 objectGUID 是 791273b2-eba7-4285-a117-aa804ea76e95,并且完全限定域名 (FQDN) 是 dc.contoso.com,请键入以下命令:

      repadmin /showmeta GUID=791273b2-eba7-4285-a117-aa804ea76e95 dc.contoso.com

      此命令的语法必须包括已删除对象或容器的 GUID 以及要将其作为获取源的服务器的 FQDN。

    5. 在 Repadmin 命令输出中,查找 isDeleted 属性的原始日期、时间和域控制器。例如,isDeleted属性的信息将显示在以下样本输出的第五行中:
      Loc.USN  Originating DC                  Org.USN  Org.Time/Date       Ver  Attribute
      -----------------------------------------------------------------------------------------------
      134759  Default-First-Site-Name\NA-DC1   134759  2004-03-15 17:41:20   1  objectClass
      134760  Default-First-Site-Name\NA-DC1   134760  2004-03-15 17:41:22   2  ou
      134759  Default-First-Site-Name\NA-DC1   134759  2004-03-15 17:41:20   1  instanceType
      134759  Default-First-Site-Name\NA-DC1   134759  2004-03-15 17:41:20   1  whenCreated
      134760  Default-First-Site-Name\NA-DC1   134760  2004-03-15 17:41:22   1  isDeleted
      134759  Default-First-Site-Name\NA-DC1   134759  2004-03-15 17:41:20   1  nTSecurityDescriptor
      134760  Default-First-Site-Name\NA-DC1   134760  2004-03-15 17:41:22   2  name
      134760  Default-First-Site-Name\NA-DC1   134760  2004-03-15 17:41:22   1  lastKnownParent
      134760  Default-First-Site-Name\NA-DC1   134760  2004-03-15 17:41:22   2  objectCategory
    6. 如果输出的第二列中原始域控制器的名称显示为包含 32 个字符的字母数字 GUID,请使用 Ping 命令将该 GUID 解析为发生删除的域控制器的 IP 地址和名称。Ping 命令使用下面的语法:

      ping –a <originating DC GUID>._msdomain controllers.<<林根域的完全限定路径>>

      注意:“-a”选项区分大小写。使用林根域的完全限定域名,而不考虑原始域控制器所在的域。
      例如,如果原始域控制器位于 Contoso.com 林中的任意一个域内,且其 GUID 为 644eb7e7-1566-4f29-a778-4b487637564b,请键入以下命令:

      ping –a 644eb7e7-1566-4f29-a778-4b487637564b._msdomain controllers.contoso.com

      命令返回的输出类似于以下内容:

      Pinging na-dc1.contoso.com [65.53.65.101] with 32 bytes of data:
      
      Reply from 65.53.65.101:bytes=32 time<1ms TTL=128
      Reply from 65.53.65.101:bytes=32 time<1ms TTL=128
      Reply from 65.53.65.101:bytes=32 time<1ms TTL=128
      Reply from 65.53.65.101:bytes=32 time<1ms TTL=128
    7. 查看发生删除的域控制器的安全日志或步骤 5 中 Repadmin 命令的输出中显示的时间。
      考虑用于到达该点的计算机之间的时差和时区更改。如果为 OU 容器或已删除对象启用了删除审核,请注意相关的审核事件。如果未启用审核,请注意有权删除 OU 容器或其中的从属对象且在执行删除之前已在原始域控制器中通过身份验证的用户。

    回到顶端

    将来如何尽可能减小批量删除的影响
    要尽可能降低批量删除用户、计算机和安全组所造成的影响,关键是要做到以下几点:确保您拥有最新的系统状态备份;严格控制对特权用户帐户的访问以及这些帐户可以执行的操作;最后是要练习如何从批量删除中进行恢复。
    系统状态每天都会发生更改。这些更改可能包括用户帐户和计算机帐户上的密码重置、组成员身份更改以及用户帐户、计算机帐户和安全组上的其他属性更改。如果发生硬件故障、软件故障或站点遇到其他灾难,则需要在林中的每个 Active Directory 域和站点中还原在每次进行一系列重大更改后创建的备份。如果您没有保留当前备份,则可能会丢失数据或必须回滚已还原的对象。
    Microsoft 建议您执行以下步骤以避免批量删除:
    1. 不要共享内置管理员帐户的密码或允许共享通用管理用户帐户。如果泄漏了内置管理员帐户密码,更改该密码并定义一个防止使用该密码的内部进程。共享用户帐户的审核事件使得我们无法确定在 Active Directory 中进行更改的用户的身份。因此,必须阻止使用共享用户帐户。
    2. 很少会出现用户帐户、计算机帐户和安全组被有意删除的情况,而有意删除树的情况则尤为稀少。解除服务和受委托的管理员的关联,以便禁用这些对象创建和管理用户帐户、计算机帐户、安全组、OU 容器及其属性的功能。仅授予最高特权用户帐户或安全组执行树删除的权限。这些特权用户帐户可能包括企业管理员。
    3. 仅授予那些被允许管理受委托的管理员的对象访问已授权管理员的权限。例如,如果某位技术支持管理员的主要工作是修改用户帐户的属性,则最好不要向其授予创建和删除计算机帐户、安全组或 OU 容器的权限。此限制同样适用于其他特定对象类别的管理员的删除权限。
    4. 使用审核设置来跟踪实验室域中的删除操作。得到所需结果之后,在生产域中应用您的最佳解决方案。
    5. 对于拥有成千上万个对象的容器,大规模的访问控制和审核更改可能会导致 Active Directory 数据库显著增长,尤其在 Windows 2000 域中。您可以使用镜像生产域的测试域来评估潜在更改,以释放磁盘空间。在为生产域中的域控制器承载 Ntds.dit 文件和日志文件的硬盘驱动器卷中查看是否有可用的磁盘空间。避免在域网络控制器顶部设置访问控制和审核更改。这些更改无须应用到该分区中所有容器中的全部类别的对象。例如,应避免更改域分区的 CN=SYSTEM 文件夹中的域名系统 (DNS) 和分布式链接跟踪 (DLT) 记录注册。
    6. 使用最佳 OU 结构在它们各自的组织单元中分离用户帐户、计算机帐户和服务帐户。使用此类结构时,您可以将随机访问控制列表 (DACL) 应用到委托管理这一类对象中,并在需要时根据对象类别还原对象。Best Practice Active Directory Design for Managing Windows Networks(用于管理 Windows 网络的最佳 Active Directory 设计)白皮书的“Creating an Organizational Unit Design”(创建组织单位设计)部分中讨论了最佳 OU 结构。要获取此白皮书,请访问下面的 Microsoft 网站:

      http://technet.microsoft.com/zh-cn/library/bb727085(en-us).aspx

    7. 在镜像生产域的实验室环境中检验批量删除。选择有效的恢复方法,然后根据您的组织自定义该方法。您可能需要确定以下信息:
      • 每个定期备份的域中的域控制器的名称
      • 存储备份映像的位置
        最好是这些映像存储在其他硬盘中,该硬盘对于林中每个域中的全局编录来说是本地硬盘。
      • 技术支持管理要联系的成员
      • 联系的最佳方式
    8. Microsoft 发现的大多数对用户帐户、计算机帐户和安全组的批量删除都是意外发生的。与您的 IT 员工讨论这种情况并制定一个内部操作计划。最初的重点是早期检测以及尽快恢复域用户和业务的功能。

    回到顶端

    可帮助您从批量删除中恢复的工具和脚本
    Groupadd.exe 命令行实用工具读取 OU 中用户集合的 memberOf 属性并创建将每个已还原用户帐户添加到林中每个域中的安全组中的 .ldf 文件。
    Groupadd.exe 自动发现已删除用户所属的域和安全组并将它们添回这些组中。方法 1 的步骤 11 中详细说明了此过程。
    Groupadd.exe 在以下域控制器上运行:
    • Windows Server 2003 域控制器
    • 安装了 .NET Framework 1.1 的 Windows 2000 域控制器
    Groupadd.exe 使用以下语法:

    groupadd /after_restore ldf_file [/before_restore ldf_file]

    此处,ldf_file 表示要与原来的参数一起使用的 .ldf 文件的名称,after_restore 表示用户文件数据源,before_restore 表示产品环境中的用户数据。(用户文件数据源是正确的用户数据。)
    要获得 Groupadd.exe,请与“Microsoft 产品支持服务”联系。
    本文中提到的第三方产品由 Microsoft 以外的其他公司提供。对于这些产品的性能或可靠性,Microsoft 不作任何暗示保证或其他形式的保证。

    回到顶端

    参考

    有关如何还原包含扩展字符的对象的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

    886689 在 Windows Server 2003 和 Windows 2000 中,如果可分辨名称路径包含扩展字符,Ntdsutil 授权还原操作将失败

    有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

    824684 有关用于描述 Microsoft 软件更新标准术语的介绍

    910823 尝试在运行 Windows Server 2003 Service Pack 1 的计算机上导入 .ldf 文件时收到错误消息:“Add error on line LineNumber: No such object”(在 LineNumber 行添加出错: 无此对象)

    937855 通过在基于 Windows Server 2003 的域控制器上执行授权还原来还原已删除的对象后,某些对象的链接属性未复制到其他域控制器中

    回到顶端


    这篇文章中的信息适用于:
    • Microsoft Windows Server 2003 Standard Edition
    • Microsoft Windows Server 2003, 64-Bit Datacenter Edition
    • Microsoft Windows Server 2003, Enterprise x64 Edition
    • Microsoft Windows Server 2003 Datacenter Edition
    • Microsoft Windows Server 2003 Enterprise Edition
    • Microsoft Windows Server 2003 Web Edition
    • Microsoft Windows 2000 Advanced Server
    • Microsoft Windows 2000 Datacenter Server
    • Microsoft Windows 2000 Professional Edition
    • Microsoft Windows 2000 Server
    • Microsoft Internet Explorer 6.0 当用于
      • Microsoft Windows XP Professional x64 Edition

     


    kbhowto kbactivedirectory kbwinservds KB840001

    回到顶端

     

     

    October 08

    感恩国庆 祝福你 姐姐。

      看着朋友们全国天南地北的玩 上至北京下至台湾。。 还是很为他们高兴的。。终于能玩痛快了~当年我也如此盼望着 之后我也马上又要回归了。。

      当然 自己的这个国庆还是有特别的意义的~

      2号开始就去杭州给姐姐婚礼打下手,其实基本没啥事 带着厚厚的RHCE书半本也没看掉

      今天好不得半天看书的时间 做了几个实验,明天后天又要出去一整天。

     

             时间总是比想象的更少。

     

     

     

     

     

      这几天总觉得 什么事情牵涉到感觉上 这事情真的就很难说清楚。

     

     

       我一直信奉做人要本色 对亲人、对朋友、对上司 该怎样就怎样一人   我就是我

             好的地方不刻意 自然有人会发觉会喜欢, 不好地方不掩盖 会遇到早晚会遇到 藏得了一时藏不了一世又何必 刘备不是人人能当。

             我想要的你能给 我就会问你要 你不给我也觉得很正常;你想要的我一定尽全力满足 满足不了我也不会愧疚

             当然想要说的话就说一遍 听不听任随君便 不强加自己的想法于别人头上 也不会轻易让别人左右自己的内心

     

      平时一直让自己走的理智路线 总希望什么都能客观再客观 即使是自己攸关的事情 也要从第三者的角度去考虑

     

     

     

       可是就前几天 我突然发觉 如果一旦那感觉不知从哪里冒出来 似乎平时再怎么习惯冷静和思考 也还是会变得一塌胡涂 

         浮躁 思维短路 一点不冷静 完全把思考和克制扔到了脑后 行为言谈举止一下子就变得不像自己了

         现在想想真是有些受不了 自己咋还那么不成熟呢 唉

         冲动是魔鬼阿

     

     

        感觉 这事情真的很难说清楚。

     

     

        几年前的一面之缘 似乎已经很遥远了 现在仔细回想 才依稀记得当年的心情

        几年后重新认识 当时的心情难以形容 慢慢回想起来 竟与之前几无差别

        这是多么奇妙的一件事情~~

        唯一最大的不同就是觉得自己老了。。老了很多 而她却没有自己老去的这么快 似乎彼此之间贴近了许多  但是仍旧 远远超过一个手臂的距离

        这样子的动力 现在的我 很喜欢

           谢谢你 让我如此开心

     

     

     

     

     

     

        姐姐婚礼当天 我突然被委派为现场调音师

     

        很突然 总觉得这应该是专业化的职业吧 什么时候切换何种音乐 音量的大小 现场的气氛 一整套环节不能有一丝的纰漏 尤其是开头的那一段关键场景

           “调音师不能来了”就这样一个理由 让我坐上了一个晚上吃不到几口菜的座位上:)

     

        司仪简单和我说了一遍流程 然后就开始彩排

         唯一的一次彩排却跳过了不少的环节~父母、小天使、交换戒指、倒香槟 甚至男方上台迎接新娘的一段也很快就过了~

           整遍下来几乎没有什么概念 每个人似乎都不怎么担心我坐在这样子一个座位 或许是不想给我压力么?呵呵

             彩排之后就再也没有人来关心过管理着整场现场音乐的我来了~~ 每个人都有他们忙碌的事情啊

        反复听直到强记下每段音乐。

           调音师是如何工作的?我只能自己想象 要观察现场 观察主角的移动、变化 事件流程 把自己觉得应该适合的片断配合上这样一个现场

            音乐围绕着现场 但现场又脱离不了音乐 他们是一体的 这是我的理解

        于是我把所有的音乐都记熟到能哼为止。然后拉来了司仪详细地了解他的过场词、每个环节的扣节点 场面上会发生的一切 我全都要了解~~

       

        脑海中终于有了一整场婚礼的流程概念。算准每个时间的精确点 这个是一秒都不能差的阿。。婚礼可不能在我手上变得尴尬不堪~

     

     

     

        整场婚礼  是由我按下第一个 司仪进场曲的键开始的。

     

          黑暗的场景 只有聚光灯在转换  我的心却随着音乐起伏 我的手指随着我心中的歌声起伏

          随着司仪一句一句话音的落下 音乐就要适时地出现

     

           开场独白 爸爸拉着女儿的手进场 ……

     

          姐夫慢慢走上舞台 唱着I'm sure you are mine 缓缓而温柔 每个人都能听到姐夫的心跳声

     

          当姐夫站在姐姐面前 大声说出“老婆我爱你”的那一瞬间   整个的音量推到最高 然后一下放出音乐

     

            嚄 和我想象中的完全一样 感动 这时的我已经完全出离了时间的概念 现场就是时间!我觉得用心去感受气氛 音乐就能随心而响起!

          后面的过程就更加放松了 拉起手往回走、走到最前台转身、小天使缓缓走上来、交换戒指、拥抱 每一个片断 我觉得音乐真的得心应手!

            和宾客们看着姐姐姐夫走完全程 我几乎不觉得音乐出自我手~而是就那么原本自然而然地出现了。

     

           谢谢姐姐。过去一直用心地对我 对我们大家。

           谢谢姐姐 这二十多年的照顾 每次都是你带领着我们 给与我们帮助 也是时候让我们一起来为你付出了。

           谢谢姐姐。

     

                     ……不过 姐姐阿。。 那个龙虾阿。。我一口都没吃到阿…… 5555~~

         

     

     

     

     

     

    朋友大喜的日子 总会觉得发自内心地为其高兴

    最亲的人婚礼之后      却不知道为何有些酸楚    似血肉被拉扯分离一般

        虽然明知道她还是在那里 还是一样地上班 一样地生活 一样可以聊天 一样可以勾肩搭背一样可以打打闹闹

     

    可是为其祝福之余 还是有觉到哪里隐隐的伤感。。。 伤感。。 伤感。

       脑海中儿童时代的各种回忆 总是会在这样不适时宜的时机出现。有一件事是我一辈子的愧疚

     

          听着这么些歌 没来由的  不争气地。。

     

    很喜欢那个kiss的镜头 很喜欢

     

     

    这个不会停止。。还会自动播放 有些麻烦。。呵呵 开心上看到的。

    October 04

    一些视频集~

    噢 国外的国庆录像 拍得真不错~

     

     

    China's 60th Anniversary national day - timelapse and slow motion - 7D and 5DmkII from Dan Chung on Vimeo.

     

     

    超级搞笑 笑到肚子痛!挣扎~~再挣扎

     

     

    噢 第一次觉得原来吉他也这么难的啊。。。我觉得这个难度比小提琴都有夸张

     

     

     

    September 28

    王羽佳

    王羽佳~~很厉害啊…

     

    野蜂飞舞 - the Flight of the Bumble-Bee

     

     

    土耳其进行曲  个结尾噢

     

     

     

    独奏音乐会  108分钟 开头就很赞 后面还没听下去~

      

    LX3 2.0 理解

    呵呵 最近忙着看书 其他什么都不管不顾了~ 不过这个东东还是值得花个把时间来探讨一下的~虽然真是件很奢侈花费时间的~事情

     

    前几天某村同学新换了相机 —— LX3。   于是拖上我出去扫街,我自然也是很有兴趣滴对这2.0光圈的神机咯  2.0哇 神机哇~~

     

       先放一点自己喜欢的吧 嘎嘎~稍后讨论技术问题

             下面几张是自己拍的,     主要还是给某村练手 所以我就随意拍了几张

     

    P1010233

    色彩稍显不足 2.0光圈这种景深感还是很强烈的 可惜对焦总有些小问题  操作不娴熟的关系吧~~

     

    P1010239 

    为了抓拍表情于是构图就没那么专业了 往右边去点是不是会好点~

    P1010242

     

                           P1010243

     

     

           P1010258        P1010259

     

     

     

              P1010363

     

    下面都是某村的成果,蛮好的~

     

     

    P1010250     P1010245     P1010246      

     

     

       P1010249

     

     

                                      P1010260

     

                  P1010282

     

     

     

     

            P1010315

    这张光影过渡的超好~看了就觉得舒服 照相机有点小威力~

     

      P1010317   

    这一张可惜用了2.8的光圈~       如果有 主题的物件+准确的对焦 那就赞了

     

     

     

         P1010318

    还是蛮有立体感的

     

    P1010353     P1010347 

     

    P1010350  P1010349

     

                P1010354

    路上随意遇见一个小餐厅 于是提议进去小歇一记~

     

     

     

    她说 给自己拍照最好找熟人来干。一点没错

       了解对方 熟悉对方 接触的更多 心里自然会产生一种思维 会认为哪种形式的格局比较适合对方

     

       其实拍摄拍摄 虽说摄影师的能力很重要 但是说穿了 毕竟照片的主题是照片内的这个人

         所以 不管摄影师如何 关键要这整张照片的构格要适合里面的人 不管色彩阿 框架阿 内容阿 所有的一切都要符合贴切

          这样子的照片才是美的 才是能够令人留连忘返的

     

       给一般不熟悉的人拍就会让人有一种这样的感觉

           背景很美 人也很美 拍的也很好 可是不知为何内容里面就是欠缺了点融洽、沟通~

              总觉得 他们是分开的 景是景 人是人 似乎都很美 可是又在哪里有说不出的一丝异样

                 就像现在看了很多婚纱照 P完后画面确实都很赞,构图、色彩都完全没有问题

                     可是让人觉得有灵性的 能产生共鸣的 到底有多少呢?

                            不多 还是有的。

     

        好的摄影师 不光要技术能力佳 更要有热情能投入思想和感情

            肯花时间去了解熟悉、理解关切所拍的主题    他的曾经 他的存在感 他所能产生的 他所需要的

        要做到用心去感受、并且要理解 对方那边的理想、当时的状态

             让他与身边的一切融为一体 身与心走到一起之后 再去谈拍摄

                而不是光用眼睛、光用相机。

     

        这样子    或许 才是理想中的 纪念和表达

     

     

     

     

    好了 感性完了 再来谈理性~~来说点技术的东西吧~

    一、先看看这相机在不同ISO下面的表现好了, 快门全都是1/15  我手持情况下不太抖动的阀值   光圈f/2.0

    P1010086

                                                                  3200             (这张对焦没对好~手工的还是有点不适应 )

    P1010087

                                                                   1600

    P1010088

                                                                     800

    P1010089

                                                                     400

     P1010080

                                                                     200

     P1010079

                                                                     100

    仔细看来 400以上才开始有明显的噪点

         比我家的ixus860那200以上就明显 800以上几乎不能入眼是好很多了

    800、1600、3200 似乎3档的噪点情况都差不多~

    所以说即使是3200的感光度 仍旧有实际应用的可能

         在灯光极其昏暗的情况下 也能比较完好还原场景所要表达的东西

     

      另外发觉一个有趣的现象

    P1010335

    P1010336

    大白天对着天拍摄的时候即使是200感光度的照片 仍旧能够找到明显的噪点 而下面一张80的就完全没有~

    所以说 一个感光度的数值并不能代表一切 还是要看当时的情况 比较极端的情况并不是不可能

     

    二、关于景深

    P1010130 

    P1010116

    P1010269 P1010271

     

     

    P1010367

                         P1010368

                                                    P1010372

     

    其实2.0对景深的影响没有想象中的那么夸张 0.9米差不多是个界限了

    但是很明显的一点

    P1010325

    P1010317

    这2张都是f/2.8 一眼看上去 总觉得一块地方特别清楚 而一块地方就有些没那么清楚

    这些快门都是1/150左右的感觉应该不至于抖掉~而且也有地方是很清晰的咯~

    或许是我的心理作用~ 而f/4以上的 应该再远的范围都差不多了

    所以拍大范围的风景 没有什么重点的希望所有地方都照顾到 还是最好用小光圈来解决

     

    P1010328

    而一旦有了主题 这种吸引人目光的方式 就会有到特别的效果~ 

     

    三、关于快门

       原本没觉得快门会有很大的影响到什么效果

     

    P1010304

    P1010305

    但是看了多了这几张片子后 总是发觉 有好几张很有立体感、突兀感而有些却没有

    似乎和快门有关系 1/300以下的就会有这种感觉

    P1010171

    P1010175

    而这种1/800、1/1000的就没这种感觉~

     

    感觉上1/300以下的照片有厚度 色彩扎实 而高速快门总觉得颜色上会有些虚 立体感也没有那么强烈

    当然这些差距不是很明显 或许也是心理作用也说不定~

    反正我觉得1/30-1/150是个不错的快门速度范围~

     

     

    四、夜景

      还算不错的吧~大光圈到底不是盖的 不过似乎还没有达到完美 不知道是不是镜头的关系~

    P1010080

    P1010391

    P1010394

    P1010396

     P1010398

     P1010404

    P1010406

     P1010408

     

     

    这些都是手持的 稍许的抖动无可避免~快门在1/10-1/20之间 光圈么锁定2.0的

      看下来觉得色彩都还原的比较好 就是边缘部分有少许的曝光导致的奇怪~

        似乎这方面GX200做的稍好 不知道是不是镜头的关系