2011年11月11日 星期五

2011年10月25日 星期二

[Javascript]語法基礎

  • 變數宣告  
    『Javascript』的變數是『弱型別』,使用時只需要用『var』宣告這是一個變數,不用宣告型別。

    變數命名規則 :
     a.首字要是『英文大、小寫字母』、『"_"(底線)』或『$』。

var VariableName[ = "Value"];  





    事實上就算是沒有作任何宣告也可以。
  • Case sensitive
    不管變數、函式名稱......都區分大小寫
  • 程式碼區塊要用『{.......}』包住

if (<Boolean Expression>) {                            
 
.........;
.........;
}  











  • 註解符號
    分成單行跟多行註解兩種符號。

// 單行註解                                            
/*
   多 行 註 解
*/









  • 程式碼包在『<script>.....</script>』之間

<head> 
<script language="javascript">                         
    ...............;
    ...............;
</script>
</head> 











  • 每行結尾用『;』隔開

    也可以不用,但是用比較好。

2011年10月19日 星期三

[Learning Python] Reference

  • Reference :






  •              1. Programming in Python 3: A Complete Introduction to the Python Language 
                   2. Learning Python: Powerful Object-Oriented Programming (4th Edition)    
                   3. Learning Python,3rd Edition 
                   4. Python for Unix and Linux System Administration 
                   5. Python Cookbook (2nd Editiom)
                   6. Python Testing Cookbook
                   7. The Python Standard Library by Example (Developer's Library)
                   8. Programming Python(4th Edition)
                   9. A Byte of Python v1.92 (for Python 3.0 
                 10. Python Documentation 
                 11. The Python Standard Library 
                 12. PyPI - the Python Package Index
                 13. Python 3 技術手冊
                 14. Beginning Python: Using Python 2.6 and Python 3.1 

    [Learning Python] Collection Data Type -- List(列表)

    1.Collection Data Type and Sequence Data Type

        由於『List』中的元素可以是不同的資料型別物件,所以與『Tuple』都是屬於『Collection Data Type』; 同時,『List』中的各元素的存放方式與『String』一樣都是以循序的方式存放,所以『List』也是屬於『Sequence Data Type』的一種,因此只要是『Sequence Data Type』可以用的操作方法,如『Index』、『Slice』...等,都可以用在『List』上面。


    2.可直接變更內容

        『String』與『Tuple』是屬於不可變的資料型別,所有看起來像是變更內容的操作其實是變成一個新物件再將原變數參照到新物件。

         而『List』就可以直接變更原『List Object』的內容,所以有一些『List』專用的內容原地變更用操作並不能用在同為『Sequence Data Type』的『String』與『Tuple』身上。


    3.每一個元素都是『Reference(參照)』

        與『Tuple』一樣,『List』中各元素的值實際上是存放在『List』中各元素所『Reference』過去的物件那邊,而『List』這邊存放的是各元素的『Reference』。

    4.建立『 List』的語法

        建立『 List』的語法如下,

    ListName=[Item1,Item2,Item3....]       




        事實上用『[....]』 括起來,其中的元素用『,』隔開,Python就知道這個物件是『List』。

    [Item1,Item2,Item3....]                

    2011年10月18日 星期二

    [Linux]...... 應該是超完整版的Unix 發展大系

    http://www.levenez.com/unix/unix_a4.pdf

    @@~~好在考試不考這個.........

    『1977年之後 UNIX Fork 出那些支系........』 ~~~~~~ 神經病才記得住!!!!!!!!

    [Learning Python] Sequence Data Type - String - 字串輸出格式控制

        Python 提供兩種字串輸出格式控制的方式,第一種與『C Language』"printf" 的輸出格式控制方法相類似;第二種則需要 call 字串輸出格式的 method。

        a. 像『C Language』"printf" 的 String formatting expressions

            這個方式需要用到下列資料型別的代碼

    Code                                  Meaning
    -------------------------------------------
    s                            String (or any object’s str(X) string)
    r                            s, but uses repr, not str
    c                           Character
    d                          Decimal (integer)
    i                            Integer
    u                          Same as d (obsolete: no longer unsigned)                                  
    o                         Octal integer
    x                          Hex integer
    X                          x, but prints uppercase
    e                          Floating-point exponent, lowercase
    E                          Same as e, but prints uppercase
    f                          Floating-point decimal
    F                         Floating-point decimal
    g                         Floating-point e or f
    G                         Floating-point E or F
    %                        Literal %




















        語法如下,

    '%[flags][width][.precision]typecode'    %(Value)                   



        整數的輸出格式控制大概會遇到下列幾種狀況,


    #整數
    >>> '%d' %(77)
    '77'

    #%+<typecode >   :  加正負號
    >>> '%+d  %+d' %(100,-100)
    '+100  -100'

    #%<Width><typecode >   :   控制輸出位數
    >>> '%4d %6d %2d' %(100,100,100)
    ' 100    100 100'

    #%<0Width><typecode >   :   控制輸出位數,不足位補'0'                                                 
    >>> '%04d %06d %02d' %(100,100,100)
    '0100 000100 100'

    #%<-Width><typecode >   :   控制輸出位數,向左靠攏
    >>> '%4d %6d %2d' %(100,100,100)
    ' 100    100 100'
    >>> '%-4d %-6d %-2d' %(100,100,100)
    '100  100    100'








     

        浮點數的輸出格式控制大概會遇到下列幾種狀況,

    #浮點數
    >>> '%f' %(100.123)
    '100.123000'

    #%+<typecode >   :  加正負號
    >>> '%+f  %+f' %(100.123,-100.123 )
    '+100.123000  -100.123000'

    #%<Width.Precidion><typecode >   :   控制輸出位數
    >>> '%6.3f  %2.2f' %(100.123,100.123 )
    '100.123  100.12'


    #%<0Width.Precidion><typecode >   :   控制輸出位數,不足位補'0'                                                 

    >>> '%07.3f  %08.3f' %(100.123,100.123 )
    '100.123  0100.123'


    #%<-Width.Precidion><typecode >   :   控制輸出位數,向左靠攏

    >>> '%08.3f  %-8.3f' %(100.123,100.123 )
    '0100.123  100.123 '
























        『Width』: 總寬度。
        『Precidion』: 小數部份的位數。

        位數超過所設定的總寬度時,整數部份不會被截斷 ; 小數部份所設定的位數若比實際位數少,則超過的部份會被截斷。

    >>> '%2.2f' %(100.125)                                               
    '100.12'             



    • 配合字典控制輸出
             語法如下,

    '%(key)[flags][width][.precision]typecode'    %{key:Value}         




        後面Key所對應的值會被送到前面key的位置,


    >>> '%(key1)d  %(key2)f' %{"key1":123,"key2":123.321}                 
    '123  123.321000'    




        b. call method 來控制字串輸出的格式

        語法如下,

    '{FieldName}'.format(Value)              



          『FieldName』可以使用『位置代號』或『keyword (其實跟剛剛配合字典的方法差不多)』的對應來控制輸出。


    '{Position} {Keyword}}'.format(PValue,,Keyword=KValue)




        使用『位置代號』會依序到後面取用對應的值,使用『keyword 』則取與『Keyword』所對應的值。

    >>> '{0} {1}'.format('string',1.23)
    'string 1.23'
    >>> '{Keyword1} {Keyword2}'.format(Keyword1=3.21,Keyword2='KValue')
    '3.21 KValue'
    >>> '{0} {Keyword}'.format('String',Keyword='KValue')
    'String KValue'









        『位置代號』可以與字典搭配使用

    >>> 'Dic&Pos {0[Key]}'.format({"Key":'Value'})
    'Dic&Pos Value'





        還可以使用『keyword 對應』搭配字典

    >>> 'Dic&Keyword {Keyword[Key]}'.format(Keyword={"Key":'KValue'})
    'Dic&Keyword KValue'




            不過新的語法可以直接省略掉『FiledName』

    >>> '{} {}'.format('string',1.23)                    
    'string 1.23'






          如果是序列型別的資料,可以使用索引或『Slice』的方式取用序列內的元素。

    >>> List=('LVaule1','LVakue2')
    >>> List
    ('LVaule1', 'LVakue2')
    
    >>> Tuple=['TVaule1','TVakue2']
    >>> Tuple
    ['TVaule1', 'TVakue2']
    
    >>> String='AString'
    >>> String
    'AString'
    
    >>> 'String={2[2]} Tuple={1[1]} List={0[0]}'.format\                                       
    ... (List,Tuple,String)
    'String=t Tuple=TVakue2 List=LVaule1'

















        『slice』的話要先在後面處理掉

    >>> 'String={2} Tuple={1} List={0}'.format \
    ... (List[0:1],Tuple[1:2],String[2:3])
    "String=t Tuple=['TVakue2'] List=('LVaule1',)"
     
    #在輸出的位置『Slice』會發生『ValueErroe』的例外
    >>> 'String={2[2:3]} Tuple={1[1:2]} List={0[0:1]}'.format \
    ... (List,Tuple,String)
    Traceback (most recent call last):
      File "", line 2, in 
    ValueError: Missing ']' in format string
    















        如果要進一步控制輸出的位數及表示方式語法如下,


    '{FieldName!ConverFlag:FormatSpec}'.foramt(<Value>)
    





        『ConverFlag』則用『r』、『s』、『a』表示要同時 call 『repr()』、『str()』、『ascii()』進行格式轉換。
       
        『FormatSpec』則是用來進行輸出位數、對齊方式.....等控制,語法如下,

    [Align][0][Width][.Precidion][TypeCode]    
    


       


      『Align』用來控制向左對齊(<)、至中(^)或向右對齊(>)。

        需要不足位補『0』的話就在整數位數前加上『0』。

    #只設定總寬度,預設會靠右對齊 
    >>> '{0:10}.format(100.123)                     
    '   100.123'
     
    #未指定『TypeCode』浮點數會以指數形表示
    >>> '{0:10.2}'.format(100.123)
    '     1e+02'
     
    #加上『TypeCode』
    >>> '{0:10.2f}'.format(100.123)
    '    100.12'
     
    #未設定小數部份位數,浮點數的小數部份會補『0』
    >>> '{0:10f}'.format(100.123)
    '100.123000'
    >>> '{0:010f}'.format(100.123)
    '100.123000'
    #要在整數部份補『0』要設定小數的位數 
    >>> '{0:010.2f}'.format(100.123)
    '0000100.12'
    #整數的三種對齊方式 
    >>> '{0:<10} {1:^10} {2:>10}'.format(66,77,88)
    '66             77             88'
    >>> '{0:<010} {1:^010} {2:>010}'.format(66,77,88)
    '6600000000 0000770000 0000000088'
    #浮點數的三種對齊方式 
    >>> '{0:<10.2f} {1:^10.2f} {2:>10.2f}'.format(12.3,12.3,12.3)
    '12.30        12.30         12.30'
    >>> '{0:<010.2f} {1:^010.2f} {2:>010.2f}'.format(12.3,12.3,12.3)
    '12.3000000 0012.30000 0000012.30'
     
    #thousand-separator syntax for numbers
    >>> '{0:,d}'.format(12345678)
    '12,345,678'
    >>> '{0:15,f}'.format(12345678.9123)
    '12,345,678.912300'
    >>> '{0:15,.4f}'.format(12345678.9123)
    '12,345,678.9123'
     

    2011年10月11日 星期二

    [Learning Python] Collection Data Type -- Tuple(元組)

    A. Tuple

        1. Tuple 是個可以將不同資料型別的 Object  Reference 放到一個單一序列的集合,而 Tuple 一旦被建立其內容就無法被改變。

        2. 建立 Tuple 的語法如下,

    (Item1 , Item2 , Item3,....)                             




    tupleName = (Item1 , Item2 , Item3,....)                             



        3. 可以用索引的方式取用 Tuple 中的元素

    定義Tuple
    >>> demoTuple=(1,2,3,'a','B','Ayana','satomi')                                         

    印出整個Tuple
    >>> print demoTuple
    (1, 2, 3, 'a', 'B', 'Ayana', 'satomi')

    印出第二個元素
    >>> print demoTuple[1]
    2

    印出最後一個元素
    >>> print demoTuple[-1]         
    satomi
    >>>
                     


















         4. 與其他 Object 合併結合成為新的 Tuple

    定義整數物件
    >>> x=123

    定義另一個 Tuple
    >>> otherTuple=(1,2,3,4)

    合併
    >>> demoTuple+(x,otherTuple)
    (1, 2, 3, 'a', 'B', 'Ayana', 'satomi', 123, (1, 2, 3, 4))                                                     











        5. 要變更 Tuple 的資料項有兩個方法

            a. list()

            b. Temp Tuple 

        6. tupleName.count(Target)

            計算 Target 在 Tuple 中出現的次數。

        7.  tupleName.index(Target)

            回傳 Target 在  Tuple 中首次出現的位置,若 Target 不存在於 Tuple 中則拋出『ValueError』Exception。

       8. Tuple 可使用的運算 :
                a. concatenation : 『+』。
                b.replication :『*』。
                c. slice : 『[]』。
               d. membership operation : 『in』、『not in』。
              e. augmented assignment operation : 『+=』、『-=』。
              f. binary comparison operation : 『<』、『<=』、『==』、『!=』、『>=』、『>』。



        

    2011年10月10日 星期一

    [Learning Python] Control Flow

    1. Conditional Branching

        毫無意外的 Python 的 conditional branching還是由 if  來提供。

        if 的一般語法如下,

    if <Boolean Expression 1>:
        suite_1
    elif <Boolean Expression 2>:                                                         
        suite_2
    elif <Boolean Expression 3>:
        suite_3
        ................
        ................
        ................
    else:
        Default_suite 













    2. Ternary  Expression

        實作 Ternary Expression 的 if 語法。

    <Var = Value_A> if <Boolean Expression> else <Value_B>                 




         或

    <Var = Value_A> if not <Boolean Expression> else <Value_B>                 



    3.Multiway  Branching

        Multiway Branching 也可以用字典來實作

    check = Value
    print({Value1:OutputInfo1,
                 Value2:OutputInfo2,
                 Value3:OutputInfo3,
                  ...................
                  ...................   

                 ValueN:OutputInfoN}[check])                                               













    2. while loops

        while loops 的語法如下,

    while <Boolean Expression>:                     
         while suite
    else:
        else suite                                 








    3.for loops

        for loops  的語法如下,

    for <Target> in <Object>:                     

        for suite
    else:
        else suite                                 








    • Iteration(迭代)
            所謂『Iteration』是指重複進行同一項作業,直到所有可處理的對象都被處理完畢為止,其實也就是『重複操作』的意思,不過,用『迭代』稱呼,光看就覺得.....『 好厲害啊...迭代耶~~~』,所以後面還是稱『Iteration』為『迭代』。

        『Sequence Data Type』類的資料型別,如『String』、『List』、『Tuple』都可以利用『for loops』執行『迭代』 重複對其中的所有元素執行相同的操作。

        『for loops』的『迭代』語法如下,

        for loops  的『迭代』語法如下,

    for <ControlVariable> in <Object>:          
        suite



     
     
        或

    for <ControlVariable> in <Object>: suite   



        以『迭代』的方式列印字串

    >>> for I in 'Iteration': print I        
    ... 
    I
    t
    e
    r
    a
    t
    i
    o
    n
       



       






     
             以『迭代』的方式列印『List』


    >>> for I in ['Iteration1','Iteration2','Iteration3']: print I
    ... 
    Iteration1
    Iteration2
    Iteration3
    



       

      

             以『迭代』的方式列印『Tuple』


    >>> for I in ('Iteration1','Iteration2','Iteration3'): print I
    ... 
    Iteration1
    Iteration2
    Iteration3
    



       



        可以用『迭代』的方式一一將序列中的元素印出來,當然也可以作別的事情。










    以『迭代』的方式列印字串


            將『String』

    [Learning Python] Programming in Python

                  String

                      建立字串
                      不同型態的引號
                     字串輸出格式控制 
               
                  List
    •  Collection Data Type
                   List

    2011年10月6日 星期四

    [Learning Python] 基本預備知識

        在開始動手寫之前,先整理一下需要知道的預備知識。


    1. Python2 & Python3  together

        我的實驗環境是『Ubuntu 11.04』上面已經裝好了『Python 2.7.1+』,『Python 2』直譯器的所在位置是『/usr/bin/python』。

    $ python -V
    Python 2.7.1+
     
    $ which python
    /usr/bin/python                                         
    






        




        如果直接從『 Ubuntu』的套件庫安裝『Python 3』,雖然『Python 3』直譯器也是會被安裝在『/usr/bin』目錄中,但是名稱會變成『python3』因此同時並存並不會發生衝突,所以就直接安裝啦~~~


    $ sudo apt-get install python3                          
     
    $ python -V
    Python 2.7.1+
    $ python3 -V
    Python 3.2
     
    $ which python
    /usr/bin/python
    $ which python3
    /usr/bin/python3              
    







     











    2.誰要來解釋Script 的內容?

        當妳在『Linux』作業系統執行一支 『可執行檔』時,妳所使用的『Shell』會先讀取 『可執行檔』最開頭的兩個『Byte』。

        如果最開頭的兩個『Byte』是『#!』,也就是整支程式第一行最開頭的兩個『Byte』是『#!』,『Shell』會假設這是一支『Script』,這支 『Script』第二行起以後的內容『Shell』就會交由『#!』這一行所標示的直譯器來解釋。

        所以如果所撰寫的『Script』是 for『Python 2』,『Script』的第一行就是,

    #!/usr/bin/python                                                




    #!/usr/bin/env python                                   



        如果所撰寫的『Script』是 for『Python 3』,『Script』的第一行就是,

    #!/usr/bin/python3                                                




    #!/usr/bin/env python3                                   



        當然,如果要讓一支『 Script』變成『可執行檔』需要賦予這支『Script』可執行屬性,

    chmod  +x  <ScriptName>                                  



    3.副檔名

        雖然在『Linux』作業系統中『副檔名』並不具檔案類型關聯的功能,不過為了方便識別,習慣上我們會以『.py』做為『Python』程式的副檔名,以『.pyw』做為『Python GUI』程式的副檔名。

    4.如何執行

        如果『Python』Script 已經被賦予了『可執行屬性』可以直接以完整路徑來執行這支 Script,

    $ /PATH/.../<ScriptName>                              


     
        或切換工作目錄到 Script 所在目錄再執行它,
     
    $ ./<ScriptName>                              


     
        如果『Python』Script未被賦予『可執行屬性』,可以把它當成『Python』直譯器的參數"喂"給『Python』直譯器
     
    $ python   <ScriptName>                            


                          
    $ python3   <ScriptName>                          


     
    5.註解

        『 Python』有兩種註解符號,單行註解符號是『#』,多行註解則是以『'''』開頭『'''』結尾或『"""』開頭『"""』結尾。


    #!/usr/bin/python3  
    #
    #『 #』之後的文字都會被視為註解文字
    #
    '''   從這一行開始
       
        之間所有的文字都會被視為註解文字                                          
        
    '''   到這一行結束

    """ 這樣
          也是
          多行
          註解
    """          
















        

    6. 中文註解

        如果是使用『Python 2』直譯器,要在 Script 加中文註解,需先作如下宣告 ,
           
    #-*- coding: utf-8 -*                       



        否則會出現如下錯誤,
           
    $ python notest.py
      File "notest.py", line 3
    SyntaxError: Non-ASCII character '\xe4' in file notest.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details


    $ python3 notest.py
    中文註解測試
                   




        

        『Python 3』就不需要了。

    7.  資料型別(Data Type) / 物件型別(Object Type)

       由於 Python 將所有的資料(Data)都當成物件(Object),所以之後無論是 Data Type 或 Object Type 其實都是指同一件事,不過之後都一律統一稱為『 Data Type』。

        另外 Python  並不需要對變數的『 Data Type』作宣告, Python 會依照變數賦值時所用的語法來決定變數的『 Data Type』。

    8. 變數(variable)與變數賦值

        雖然行為是一樣的,但 Python 其實並沒有『變數』這種東西,她是用『Object reference(物件參照)』的方法處理『變數賦值』這個行為。

        與多數程式語言一樣,在進行所謂『變數賦值』這個行為時 Python會用到『=』這個符號,,例如,

          
    String1 = 'String Object'                     



        由於給定的值被『'』刮起來,所以 Python會建立一個『str』物件 -- 'String Object',及一個指向這個物件的  『Object reference(物件參照)』-- String1  。

       值給定後 Python 會建立一個物件及指向這個物件的『Object reference(物件參照)』,也就是...
           
    變數賦值......

    VariableName = <Vaule>                                                 


    其實就是建立『Object reference(物件參照)』


    Object reference = <Vaule>               


      


     



        所以有『 Data Type』的是物件本身而非『Object reference(物件參照)』。

    9. Identifier (識別字)

        變數名稱也就是『Object reference(物件參照)』的名稱稱為『 Identifiers (識別字)』或是『name』,命名時需依據下列規則,

        a. 首字要是一個英文字母(其實可以是任何Unicode中各種語系的字母,不過如果沒有特殊的嗜好,最好就限定只用英文大小寫字母會)或『_ (under line)』。
        b. 第二個字元起可以使用所有 Unicode 所定義的字元符號,但空白字元符號除外。
        c. 大小寫有別(Case Sensitive),沒有長度限制。
        d. 不能與 Python 的關鍵字(Keywords)撞名。

    10. Compound statement (複合敘述)and 縮排

        每個 Compound statement 的首行會以『:』結尾,而 Python 是以縮排來決定 Block(程式區塊)的邊界,同時也是以縮排與否來判定 suite 是不是屬於某個 Compound statement ,所以屬於 if 、while 這一類Compound statement的 suite 一定要作縮排。

         可以用『tab』或『space』來縮排,不過習慣上每一層級縮排會用四個『space』。


    Compound Statement:                    
    
        suite                              





    11.Logical Operation(邏輯運算)

        a. Identity  Operator : 『is』、『is not』。
        b. Binary Comparison Operator : 『<』、『<=』、『==』、『!=』、『>=』、『>』。
        c. Membership Operator : 『in』、『not in』。
        d. Logical Operator : 『and』、『not』、『or』。

    2011年9月30日 星期五

    [KVM]在 TUI 環境下建置 Virtualized guest

       如果妳有 X Window,不管是在 VM Server 也就是 『Host』 或是另一台『Desktop』,妳都可以利用『Virt-Manager』進行相當完整且深入的管理,基本上除非有特別的嗜好,否則並沒有非得在 TUI 環境下建置 VM guest 的必要,而且,只能使用 TUI 的環境來建置 VM guest 的狀況在實務上幾乎是不存在的。

        不過,如果要談在 TUI 環境下來管理妳的 VM ,不從建置開始談好像有點不完整,所以這邊還是從如何建置一台全新的  VM guest 開始談起。

       以下都是從我的筆電使用 ssh 遠端連線到 VM Server 進行實作,使用到的工具有『virsh』、『virt-install』及『vinagre』。

        妳可以選擇進到『virsh』或是在 TUI 使用 Command 來建置 VM guest ,不過事實上是同一件事,這邊是選擇 進到『virsh』。

        所要建置的VM guest 規劃如下,

            a.OS : Ubuntu 10.04.3 Server
            b.Architecture : X86_64
            c.CPU *1 / RAM : 1024 MB
            d.HD : Format : qcow2 size: 8G
            e.Network : Bridge:br0
            
        1. 建立虛擬硬碟

            如果不需要指定虛擬硬碟的格式可以跳過這一步。

            a. 列出現有 Storage Pool 清單

                主要是要確認一下 Storage Pool 的名稱,因為我打算將虛擬硬碟的映像放在『VM-Image』這個 Storage Pool 中。


    virsh # pool-list --all

    名稱               狀態                    自動啟動
    -----------------------------------------                                                    
    default                啟用                yes     
    image                 啟用                yes     
    VM-Image           啟用                yes
    Iso                     非啟用中           yes    





        



            b. 產生虛擬硬碟     

    virsh # vol-create-as --format qcow2 VM-Image test.qcow2.img 8G
    Vol test.qcow2.img created




            也可以使用『kvm-image』來產生虛擬硬碟,不過要到使用『virt-install 』建置 VM quest 之後 『virsh』才能管理這顆虛擬硬碟。

    max@riyu:~$ kvm-img create -f qcow2 /media/SDA3/VmImage/disk.qcow2.img 8G    
    Formatting '/media/SDA3/VmImage/disk.qcow2.img', fmt=qcow2 size=8589934592 encryption=off cluster_size=0





            確認一下

    virsh # vol-list VM-Image
    名稱                                    Path                                  
    -----------------------------------------
    test.qcow2.img       /media/SDA3/VmImage/test.qcow2.img    




           

        2. 建置 VM guest

          依照規劃需要下一串又臭又長的命令來作這件事。

           退出『virsh』後,使用如下命令來建置一台 VM guest

    max@riyu:~$ virt-install \
    > --connect qemu:///system \
    > --name=Test \
    > --vcpus=1 \
    > --arch=x86_64 \
    > --ram=1024 \
    > --os-type=linux \
    > --virt-type=kvm \
    > --cdrom=/media/SDC7/001.LinuxISO/ubuntu-10.04.3-server-amd64.iso \
    > --disk path=/media/SDA3/VmImage/test.qcow2.img,size=8 \
    > --force \
    > --network bridge=br0,model=virtio \
    > --vnc  --vncport=5900
    Traceback (most recent call last):
      File "/usr/lib/python2.6/logging/handlers.py", line 71, in emit
        if self.shouldRollover(record):
      File "/usr/lib/python2.6/logging/handlers.py", line 144, in shouldRollover
        msg = "%s\n" % self.format(record)
      File "/usr/lib/python2.6/logging/__init__.py", line 648, in format
        return fmt.format(record)
      File "/usr/lib/python2.6/logging/__init__.py", line 439, in format
        s = self._fmt % record.__dict__
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 1: ordinal not in range(128)



    Starting install...
    Creating domain... 0 B 00:00
    Unable to connect to graphical console: virt-viewer not installed. Please install the 'virt-viewer' package.
    Domain installation still in progress. You can reconnect to
    the console to complete the installation process.





           
        接下來要透過 VNC 進到剛出生的 VM quest 來進行作業系統的安裝,不過要從遠端主機透過VNC 連到 VM quest 還需要動一些手腳而且有點安全上的疑慮,所以這邊就直接利用 ssh 的『X11Forwarding』將從 VM Server 透過 VNC 連到 VM quest 的畫面送到我的筆電。

        3. 重新連線到 VM Server

             要記得開啟 『X11Forwarding』。

    max@minako:~$ ssh -X max@10.0.0.100                    





        4. 從 VM Server 端啟動『vinagre』       

    max@riyu:~$ vinagre localhost:5900                   


       


        由於這次連線已經啟動了『X11Forwarding』,所以『vinagre』的執行畫面會送回筆電。



            之後就跟一般安裝作業系統的程序一樣,作業系統安裝完畢,妳就有一台  VM 可以用啦。     


    virsh # list 
     Id 名稱                  狀態
    ----------------------------------
      6 Test                 執行中
                       

    2011年9月21日 星期三

    [Bash Script]將筆電中的資料備份到備份主機 (V201109210305)

    前一版邏輯有嚴重錯誤而且寫得太囉唆了,全部重寫~~~~~~~
    ChangeLog
    1. if 條件判斷改用設檢查旗標的方式同時用了『複合條件判斷』以濃縮長度。
    2.『全變數化』以方便維護跟新增備份標的。

    筆電中放著不少重要資料,還是備份一下比較安心。

    條件一樣是,
    1.筆電在家且連得到備份主機才進行備份
    2.自動砍掉三天以前的備份

    Script 內容如下,

    #!/bin/bash
    #DailyBackUpV201109210305.sh
    #備份筆電中的重要資料
    #Verio:3.0
    #Time:201109210305
    #Max Lin max@mpsstudio.org

    #定義變數
    LogFile="$HOME/BackUpLog/DailyBackUp.log"
    RemoteHost="10.128.0.100"
    TEMPDir="/tmp/DocBack"
    LXDETEMPDir=""$TEMPDir"/LXDE"
    ScriptTEMPDir=""$TEMPDir"/Script"
    DocTEMPDir=""$TEMPDir"/Doc"
    MyPassWord="1979576"
    MyAccount="亞利安人"
    MountHomeDir='/home/max/sharedir'
    LocalMountDir=""$MountHomeDir"/100DocBackup"
    RemoteHostMountOption="rw,noperm,nosuid,username="$MyAccount",password="$MyPassWord",iocharset=utf8,codepage=cp950"
    LXDEBackDir="/home/max/.config/lxpanel/LXDE/"
    ScriptBackDir="/home/max/Script"
    DocMountPoint="/media/DATABack"
    DocBackDir=""$DocMountPoint"/002.文件/"

    #Start

    #確認遠端備份主機連線狀態
    ping -c 2 $RemoteHost > /dev/null
    ConnectCheck=$?

    #確認備份儲存目錄是否已掛載
    mount | grep "100DocBackup" > /dev/null
    RemoteHostMountCheck=$?
    if [ $RemoteHostMountCheck -ne '0' ] ; then

    #掛載遠端文件備份掛載目錄
    echo "$MyPassWord" | sudo -S mount -t cifs //"$RemoteHost"/DocBackup "$LocalMountDir" -o "$RemoteHostMountOption"
    RemoteHostMountCheck=$?
    else
    RemoteHostMountCheck=0
    fi


    if [ $ConnectCheck -eq '0' -a $RemoteHostMountCheck -eq '0' ]; then

    echo "`date '+%Y%m%d'` ---- 備份作業開始 --------" >> $LogFile
    echo "`date '+%Y%m%d'` ==== 備份開始時間`date '+%H:%M:%S'`" >> $LogFile

    #備份LXDE設定檔
    mkdir -p "$LXDETEMPDir"
    tar jcvf "$LXDETEMPDir"/LXDEConfigBackUp`date '+%Y%m%d'`.tar.bz2 "$LXDEBackDir"
    LXDETar=$?
    cp -r "$LXDETEMPDir"/* "$LocalMountDir"
    LXDECpCheck=$?

    if [ $LXDETar -eq '0' -a $LXDECpCheck -eq '0' ] ; then
    echo "`date '+%Y%m%d'` LXDE設定檔備份作業完成~~~" >> $LogFile
    else
    echo "`date '+%Y%m%d'` LXDE設定檔備份作業未完成!!!!" >> $LogFile
    fi


    #備份Script
    mkdir -p "$ScriptTEMPDir"
    tar jcvf "$ScriptTEMPDir"/ScriptBackUp`date '+%Y%m%d'`.tar.bz2 "$ScriptBackDir"
    ScriptTar=$?
    cp -r "$ScriptTEMPDir"/* "$LocalMountDir"
    ScriptCpCheck=$?
    if [ $ScriptTar -eq '0' -a $ScriptCpCheck -eq '0' ] ; then
    echo "`date '+%Y%m%d'` Script備份作業完成~~~" >> $LogFile
    else
    echo "`date '+%Y%m%d'` ScriptCpCheck備份作業未完成!!!!" >> $LogFile
    fi

    #文件備份
    mkdir -p "$DocTEMPDir"
    mount | grep "$DocMountPoint"
    DocMountPointCheck=$?
    if [ $DocMountPointCheck -eq '0' ] ; then
    tar jcvf "$DocTEMPDir"/DocBackUp`date '+%Y%m%d'`.tar.bz2 "$DocBackDir"
    DocTar=$?
    cp -r "$DocTEMPDir"/* "$LocalMountDir"
    DocCpCheck=$?
    else
    echo "$MyPassWord" | sudo -S mount -t ext4 /dev/sda4 "$DocMountPoint"
    ReMountCheck=$?
    if [ $ReMountCheck -eq '0' ] ; then
    tar jcvf "$DocTEMPDir"/DocBackUp`date '+%Y%m%d'`.tar.bz2 "$DocBackDir"
    DocTar=$?
    cp -r "$DocTEMPDir"/* "$LocalMountDir"
    DocCpCheck=$?
    DocMountPointCheck=0
    else
    DocMountPointCheck=1
    fi

    fi
    if [ $DocMountPointCheck -eq '0' -a $DocTar -eq '0' -a $DocCpCheck -eq '0' ]; then

    echo "`date '+%Y%m%d'` Doc備份作業完成~~~" >> $LogFile
    else
    echo "`date '+%Y%m%d'` Doc備份作業未完成!!!!" >> $LogFile
    fi

    #刪除暫存目錄
    rm -rf $TEMPDir
    #刪除遠端備份目錄中三天前的備份檔
    find ""$LocalMountDir"/" -type f -mtime +3 -exec rm -f {} \;
    #確認文件備份目錄是否還掛載著
    mount="$DocMountPoint"
    DocMountPointCheck=$?
    if [ $DocMountPointCheck -eq '0' ] ; then
    #卸載遠端備份目錄
    echo "$MyPassWord" | sudo -S umount "$DocMountPoint"
    fi
    #確認備份儲存目錄是否仍掛載
    mount | grep "$LocalMountDir" > /dev/null
    RemoteHostMountCheck=$?
    if [ $RemoteHostMountCheck -eq '0' ] ; then
    #卸載遠端備份目錄
    echo "$MyPassWord" | sudo -S umount "$LocalMountDir"
    fi
    echo "`date '+%Y%m%d'` ==== 備份結束時間`date '+%H:%M:%S'`" >> $LogFile
    echo "`date '+%Y%m%d'` >>>> 備份作業完成 <<<<<<<<" >> $LogFile
    else

    echo "`date '+%Y%m%d'` 遠端備份目錄離線中或無法掛載遠端儲存設備,備份作業未開始!!!!"

    fi                         

    2011年9月19日 星期一

    [Bash Script]如果Routing Table 出現兩筆 Default Gateway 怎麼辦?

        因為家裡的動物機群跟一般主機分屬於兩個不同網段同時分別透過兩台IP分享器連網,我在家時為了方便筆電會用有線連『動物機群網段』,同時用無線網卡連到『一般主機網段』。

        可是每次開機時因為同時有兩張網卡(有線+無線)所以就會得到兩個 『DefaultGateway』,有兩個『DefaultGateway』基本上就跟沒有『DefaultGateway』是一樣的,會無法連線,所以老是要手動刪掉『動物機群網段』的『DefaultGateway』,有點煩了所以寫隻簡單的Script讓他自動處理這個問題。

        想法很簡單~~~~

        1. 先檢查看看對接到『動物機群網段』的有線網卡『eth0』是不是『DefaultGateway』,如果是就刪掉。

        2. 接著再檢查對接到『一般主機網段』的無線網卡是不是『DefaultGateway』,如果是,那就....... 沒事~~~,如果不是就加上這個『DefaultGateway』。

        Scritp 如下,

    #!/bin/bash 
    #
    # DefaultGatewayCheck.sh
    # 自動設定我要的 Default Gateway
    # Version:2.0
    # 201109190237
    # Max Lin max@mpsstudio.org
    # 
     
    #!/bin/bash
    #
    Checketh0=`route -n | grep "UG"| grep "eth0"`
    Checkwlan0=`route -n | grep "UG"| grep "wlan0"`

    if [ "$Checketh0" ] ; then

        echo '28825252' | sudo -S route del default gw 10.128.0.1                        
    fi

    if [ ! "$Checkwlan0" ] ; then

        echo '28825252' | sudo -S route add default gw 10.0.0.1

    fi




































        測試:

    1.檢視現有 Routing Table
    
    max@minako:~$ route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
    169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
    10.0.0.0        0.0.0.0         255.128.0.0     U     2      0        0 wlan0
    10.128.0.0      0.0.0.0         255.128.0.0     U     1      0        0 eth0
    0.0.0.0         10.0.0.1        0.0.0.0         UG    0      0        0 wlan0 
     
        沒有『動物機群網段』的『DefaultGateway』
     
    2.加上『動物機群網段』的『DefaultGateway』到 Routing Table
     
    max@minako:~$ sudo route add default gw 10.128.0.1 
     
    3.確認一下
     
    max@minako:~$ route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
    169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
    10.0.0.0        0.0.0.0         255.128.0.0     U     2      0        0 wlan0
    10.128.0.0      0.0.0.0         255.128.0.0     U     1      0        0 eth0
    0.0.0.0         10.128.0.1      0.0.0.0         UG    0      0        0 eth0
    0.0.0.0         10.0.0.1        0.0.0.0         UG    0      0        0 wlan0 
     
      
      『動物機群網段』的『DefaultGateway』在 Routing Table 中 
     
    4.執行 Script
     
    max@minako:~$ ./CheckGw.sh 
     
    5.看一下Routing Table
     
    max@minako:~$ route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
    169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
    10.0.0.0        0.0.0.0         255.128.0.0     U     2      0        0 wlan0
    10.128.0.0      0.0.0.0         255.128.0.0     U     1      0        0 eth0
    0.0.0.0         10.0.0.1        0.0.0.0         UG    0      0        0 wlan0
     
     『動物機群網段』的『Default Gateway』沒了
     
    6.刪掉『一般主機網段』的『Default Gateway』
    max@minako:~$ sudo route del default gw 10.0.0.1
     
    max@minako:~$ route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
    169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
    10.0.0.0        0.0.0.0         255.128.0.0     U     2      0        0 wlan0
    10.128.0.0      0.0.0.0         255.128.0.0     U     1      0        0 eth0
     
    一筆『Default Gateway』都沒有
     
    7.再跑一下Script 
     
    max@minako:~$ ./CheckGw.sh 
    max@minako:~$ route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
    169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
    10.0.0.0        0.0.0.0         255.128.0.0     U     2      0        0 wlan0
    10.128.0.0      0.0.0.0         255.128.0.0     U     1      0        0 eth0
    0.0.0.0         10.0.0.1        0.0.0.0         UG    0      0        0 wlan0
     
     
    嗯.....有效
     

    2011年9月18日 星期日

    [Misc]關於 LVM(Logical Volume Manager)的基本概念(無LAB)

          簡單整理一下Linux LVM的一些基本概念。

         首先先複習一下使用一顆實體硬碟的流程~~~

        當妳要加裝一顆硬碟時妳會怎麼做?打開電話簿翻到『好人&馱獸』那一區??

         那妳後面應該都看不懂~~~~~

        使用一顆實體硬碟的流程是....

         1. 首先要有一顆硬碟。
         2. 接著將這顆硬碟裝到電腦上。
         3. 開Power。
         4. 劃分分割區。
         5. 格式化。
         6. 掛載。

         除開不關電源直接裝硬碟、連接線接錯或裝反、硬碟電源線沒裝或是買到籤王等意外,妳現在可以開始用硬碟了。

         我的學生應該都要記得吧?!?!第一堂課的東西.....

         雖然說的跟講義不大相同,不過意思是一樣的。

          接著進入主題.............

    1.『Partition』 是建置『Linux LVM』的基本成員,要參加『 LVM』 的『Parition』首先要變身為『PV(Physical Volume)』。

        怎麼變身呢?

        用『 fdisk』 跟他說「你是LVM」......就好了嗎?還早..........

        喔.....前面的意思是所有要參加『LVM』的『Partitiom』都要一一使用『fdisk』指定其『Partition Type』為『8e』。

        接著再用『pvcreate』跟那些『 Partition』 說「你是PV」....這樣就變身完畢了。

    2.當所有參加『LVM』的成員都知道自己是『PV』後再使用『vgcreate』將他們群組成一個『VG(Volume Group)』。

        這個時候基本上妳就可以把一個『VG』當成一顆大硬碟。

        其實到這邊還蠻像是在生一個『Raid 0』的感覺,『Raid 0』是將一堆大小不同的實體硬碟合體成一個邏輯大硬碟的技術,所不同的是『Raid 0』只要有一個成員脫團,整個 『Raid 0』就GG 了,『LVM』的話,一個『PV』也就是『Partition』壞掉,換掉就好了。

      到這邊是建置『Linux LVM』的前置作業。

    3. 當『VG』合體完畢後你就有了一顆大硬碟,回到一開始提到的實體硬碟使用流程....

         1. 首先要有一顆硬碟。
         2. 接著將這顆硬碟裝到電腦上。
         3. 開Power。
         4. 劃分分割區。
         5. 格式化。
         6. 掛載。

        當然,前三點就不需了,接下來就直接到『 4.劃分分割區』 這個動作。

        接著就是使用『lvcreate』來''劃分''出 『LV(Logical Volume)』了。

        從『VG』中切割出『LV』來用,這一步就像是在切『Partition』一樣。

        現在妳可以將切出來的『LV』掛載到掛載點開始使用他了。

        所以整個『LVM』的建置流程就是,『PV』→『VG』→『LV』。

        LAB的部份....看哪天有空再說。

    2011年9月16日 星期五

    [JAVA]Install JDK 6.0 & JRE 6.0 on Ubuntu 11.04

    雖然Ubuntu 11.04 已經有了『OpenJDK 6.0』,不過還是想換成『SUN』的『JDK』。

    1. 打開『synaptic』,點選[設定] => [套件庫],點選「其他軟體」頁籤

    將『Canonical 夥伴』及『Canonical 夥伴 (源碼)』勾選起來。
    (※  『Canonical 夥伴 (源碼)』可以不用勾,我是順便)


        [關閉]之後記得『重新載入』一下

     
    2.在『快速過濾』填入「sun-java-6」,然後選取『sun-java6-jre』、『sun-java6-jdk』、『sun-java6-plugin』
    (※ 其他需不需要裝看個人嗜好) 


    3.可是系統中還有一個『Openjdk』怎麼辦?

        使用切換程式切換過來,

         切換前:

    $ java -version
    java version "1.6.0_22"
    OpenJDK Runtime Environment (IcedTea6 1.10.2) (6b22-1.10.2-0ubuntu1~11.04.1)
    OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode) 







    切換後:

    $ sudo update-java-alternatives -s java-6-sun 
    [sudo] password for max: 
    max@minako:~$ java -version 
    java version "1.6.0_26" 
    Java(TM) SE Runtime Environment (build 1.6.0_26-b03) 
    Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)









    4.設定環境變數

         修改『/etc/environment』

        修改前:

    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"



    修改後:

    JAVA_HOME="/usr/lib/jvm/java-6-sun"
    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/lib/jvm/java-6-sun/bin"
    CLASSPATH=".:/usr/lib/jvm/java-6-sun/lib:/usr/lib/jvm/java-6-sun/lib/dt.jar:/usr/lib/jvm/java-6-sun/lib/tools.jar"



     

        重登入以後測試一下環境變數,


    $ echo $CLASSPATH
    .:/usr/lib/jvm/java-6-sun/lib:/usr/lib/jvm/java-6-sun/lib/dt.jar:/usr/lib/jvm/java-6-sun/lib/tools.jar
    max@minako:~$ echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/lib/jvm/java-6-sun/bin
    max@minako:~$ echo $JAVA_HOME
    /usr/lib/jvm/java-6-sun


     
         完工~~~~

    [XOOPS]換掉整個 Banner

        預設的Banner我不是很喜歡所以想換掉......

        先打開所使用的版型的『theme.html』,找到下面這一段程式碼,

    <!-- customized header contents -->
        <{$xoops_module_header}>
    </head>
    <body id="<{$xoops_dirname}>" class="<{$xoops_langcode}>">

    <!-- Start Header -->
    <table cellspacing="0">
        <tr id="header">
            <td id="headerlogo"><a href="<{xoAppUrl /}>" title="<{$xoops_sitename}>"><img src="<{xoImgUrl xoops-logo.png}>" alt="<{$xoops_sitename}>" /></a></td>
            <td id="headerbanner"><{$xoops_banner}></td>
        </tr>
        <tr>
            <td id="headerbar" colspan="2">&nbsp;</td>
        </tr>
    </table>
    <!-- End header -->















    接著就妳高興怎麼改就怎麼改啦~~~

    當然前提是要看得懂 html 跟那些 XOOPS 變數的意義......

    [XOOPS]特定使用者登入後才出現的物件

        如果希望某個連結是在特定帳號登入後才出現,可以透過下列程式碼來達成這個效果,

    <{if $xoops_uname == '特定帳號' }>
      <a href="<{xoAppUrl 想要出現的連結}>" style="text-decoration:none"
         target="_self"><font color="#3367FF">[ 連結顯示名稱 ]</font></a>
    <{/if}>








    特定帳號登入前:


    特定帳號登入後:

    [XOOPS] 使用者登入後才顯示歡迎詞

    如果要在使用者登入後才顯示歡迎詞可以在 Theme 的『theme.html』中加上下列程式碼在要出現歡迎詞的地方。

     <{if $xoops_uname }>
              歡迎詞 !!!
    <{/if}>
                                           








    登入前:


    登入後:

    2011年9月14日 星期三

    [KVM]使用『Virt-manager』管理KVM - 建立 VM

        由於我是在 Ubuntu 11.04 Desktop 上安裝『Virt-manager』,Ubuntu 11.04所收錄的『Virt-manager』是 0.8.6,其他版本的『Virt-manager』在版面上或有不同但是設定的次序是大同小異。

        我主要用過 0.8.2 及 0.8.6 兩個版本 的『Virt-manager』,在這邊主要以 0.8.6 來進行示範。

    1. 啟動『Virt-manager』

        我的 Ubuntu 11.04 Desktop 所使用的桌面環境是 LXDE,在畫面左下方的[選單]=>[系統工具]中看到虛擬機器管理員。


        若是Gnome則是畫面左上角的[應用程式]=>[系統工具] 中可以看到。


        下面是開啟『Virt-manager』的畫面,


    2.新增連線

        接著要連線到 KVM 所在的主機

        a.單擊 [檔案] => [Add Connection]


        會出現一個新增連線的設定視窗,


        b. 將『Connect to remote host』勾選起來


        c. 設定連線資訊

            接著就填入連線所需的資訊,然後單擊 [連接( n )]。




        如果是『Virt-manager』0.8.2 就只能用 root 連線到遠端主機。

        d.啟動連線

          雙擊剛剛建立的連線,連線成功會出現密碼輸入視窗。


         
        登入完畢後會列出現有的VM清單。


    3.設定 Storage Pool

        這邊規劃將之後建立的VM  image 檔 及 OS 的iso檔分開存放, VM  image 檔放在『/media/SDA3/VmImage』, OS iso檔放在『/media/SDC7/001.LinuxISO』。

        a. 以KVM管理帳號的身份透過 SSH 連到KVM主機

    $ ssh max@192.168.1.100                     



    b. 新增存放目錄

    $ mkdir -p /media/SDA3/VmImage
    $ mkdir -p /media/SDA3/Iso                    




    c.使用『virsh』定義VM  image 檔 及 OS 的iso檔的存放目錄

            語法如下,

    virsh pool-define-as <Name> <Format> - - - - "Path"          

       

             (1). 定義VM  image 檔存放目錄


    $virsh pool-define-as VM-Image dir - - - - "/media/SDA3/VmImage"     





            (2). 定義iso 檔存放目錄


    $virsh pool-define-as Iso dir - - - - "/media/SDC7/001.LinuxISO/"         




            (3). 列出 Stroage Pool


    $ virsh pool-list --all
    名稱                  狀態     自動啟動
    -----------------------------------------
    default              啟用     yes       
    image                啟用     yes       
    TcViewLite           啟用     yes       
    Iso                  非啟用中 no        
    VM-Image             非啟用中 no   





       






             (4).啟動新增的Storage Pool 並設為自動啟動


    $ virsh pool-start VM-Image                                 
    Pool VM-Image started
    
    $ virsh pool-start Iso
    Pool Iso started
    
    $ virsh pool-autostart VM-Image
    Pool VM-Image marked as autostarted
    
    $ virsh pool-autostart Iso
    Pool Iso marked as autostarted
     
    $ virsh pool-list --all
    名稱               狀態     自動啟動
    -----------------------------------------
    default              啟用     yes       
    image                啟用     yes       
    Iso                  啟用     yes       
    TcViewLite           啟用     yes       
    VM-Image             啟用     yes       

























    4.建立VM

        接著我們就使用『Virt-manager』來建立一台VM。

        a.對著剛剛建立的連線單擊右鍵,點擊 [新增]



         輸入 VM 的名稱及選擇安裝方式。


        b.設定OS Type 及 Version


        c. 選取 OS iso 檔





        d.設定 RAM及CPU數量

            設定值最大均不能超過Host所擁有的實體記憶體大小及CPU數量,若是多核心CPU 則不能超過總核心數。


        e. 產生虛擬硬碟

            因為要將VM存在『/media/SDC7/001.LinuxISO/』所以這邊另外選擇存放位置


        f. 點選要存放的 Storage Pool 然後單擊[New Volume]


        g. 新增儲存卷冊

            預設的儲存卷冊名稱會與 VM 同名,副檔名會是『img』,因為這邊所選擇的儲存卷冊格式為『qcow 2』所以在副檔名前再加上『.qemu』以為標示。

            記得要設定儲存卷冊容量的最大值,這邊是設定為約6Gb的大小。


        點選剛剛新增的儲存卷冊


        f. 設定網路卡

            我們可以選擇使用『NAT』虛擬網路,若 Host有建立橋接網路卡也可以選擇『Specify shared device name』。

            由於網路卡相關設定可以在VM建立之後再變更設定,所以這邊先選用『NAT』虛擬網路。

         另外,Virt-type 選擇『kvm』,Architecture選擇『x86_64』。


        單擊『完成』就產生一台VM,之後會直接進入OS安裝畫面。

    Powered By Blogger