Linux運維-磁碟存儲---3.LVM

来源:https://www.cnblogs.com/shiyw/archive/2020/02/27/12372543.html
-Advertisement-
Play Games

1. LVM的工作原理 LVM( Logical Volume Manager)邏輯捲管理,是在磁碟分區和文件系統之間添加的一個邏輯層,來為文件系統屏蔽下層磁碟分區佈局,提供一個抽象的盤捲,在盤捲上建立文件系統。管理員利用LVM可以在磁碟不用重新分區的情況下動態調整文件系統的大小,並且利用LVM管理 ...


  1. LVM的工作原理

     LVM( Logical Volume Manager)邏輯捲管理,是在磁碟分區和文件系統之間添加的一個邏輯層,來為文件系統屏蔽下層磁碟分區佈局,提供一個抽象的盤捲,在盤捲上建立文件系統。管理員利用LVM可以在磁碟不用重新分區的情況下動態調整文件系統的大小,並且利用LVM管理的文件系統可以跨越磁碟,當伺服器添加了新的磁碟後,管理員不必將原有的文件移動到新的磁碟上,而是通過LVM可以直接擴展文件系統跨越磁碟。

    它就是通過將底層的物理硬碟封裝起來,然後以邏輯捲的方式呈現給上層應用。在LVM中,其通過對底層的硬碟進行封裝,當我們對底層的物理硬碟進行操作時,其不再是針對於分區進行操作,而是通過一個叫做邏輯捲的東西來對其進行底層的磁碟管理操作。
    1.1 LVM常用的術語

物理存儲介質(The physical media):LVM存儲介質可以是磁碟分區,整個磁碟,RAID陣列或SAN磁碟,設備必須初始化為LVM物理捲,才能與LVM結合使用。

物理捲PV(physical volume) :物理捲就是LVM的基本存儲邏輯塊,但和基本的物理存儲介質(如分區、磁碟等)比較,卻包含有與LVM相關的管理參數,創建物理捲它可以用硬碟分區,也可以用硬碟本身;

捲組VG(Volume Group) :一個LVM捲組由一個或多個物理捲組成 

邏輯捲LV(logical volume) :LV建立在VG之上,可以在LV之上建立文件系統

PE(physical extents) :PV物理捲中可以分配的最小存儲單元,PE的大小是可以指定的,預設為4MB

LE(logical extent) : LV邏輯捲中可以分配的最小存儲單元,在同一個捲組中,LE的大小和PE是相同的,並且一一對應

最小存儲單位總結:

名稱 最小存儲單位

硬碟 扇區(512位元組)

文件系統 block(1K或4K )# mkfs.ext4 -b 2048 /dev/sdb1 ,最大支持到4096

raid chunk (512K) #mdadm -C -v /dev/md5 -l 5 -n 3 -c 512 -x 1 /dev/sde{1,2,3,5}

LVM PE (4M) # vgcreate -s 4M vg1 /dev/sdb{1,2}

LVM主要元素構成:

總結:多個磁碟/分區/raid-》多個物理捲PV-》合成捲組VG-》從VG划出邏輯捲LV-》格式化LV掛載使用
1.2 LVM優點

使用捲組,使多個硬碟空間看起來像是一個大的硬碟

使用邏輯捲,可以跨多個硬碟空間的分區 sdb1 sdb2 sdc1 sdd2 sdf

在使用邏輯捲時,它可以在空間不足時動態調整它的大小

在調整邏輯捲大小時,不需要考慮邏輯捲在硬碟上的位置,不用擔心沒有可用的連續空間

可以線上對LV,VG 進行創建,刪除,調整大小等操作。LVM上的文件系統也需要重新調整大小。

允許創建快照,可以用來保存文件系統的備份。

RAID+LVM一起用:LVM是軟體的捲管理方式,而RAID是磁碟管理的方法。對於重要的數據,使用RAID來保護物理的磁碟不會因為故障而中斷業務,再用LVM用來實現對捲的良性的管理,更好的利用磁碟資源。
2 創建LVM的基本步驟

1) 物理磁碟被格式化為PV,(空間被劃分為一個個的PE) #PV包含PE

2) 不同的PV加入到同一個VG中,(不同PV的PE全部進入到了VG的PE池內) #VG包含PV

3) 在VG中創建LV邏輯捲,基於PE創建,(組成LV的PE可能來自不同的物理磁碟) #LV基於PE創建

4) LV直接可以格式化後掛載使用 #格式化掛載使用

5) LV的擴充縮減實際上就是增加或減少組成該LV的PE數量,其過程不會丟失原始數據
2.1 lvm常用的命令

功能

PV管理命令

VG管理命令

LV管理命令

scan 掃描

pvscan

vgscan

lvscan

create 創建

pvcreate

vgcreate

lvcreate

display顯示

pvdisplay

vgdisplay

lvdisplay

remove 移除

pvremove

vgremove

lvremove

extend 擴展

vgextend

lvextend

reduce減少

vgreduce

lvreduce

下麵的操作會用的一些查看命令:

查看捲名

簡單對應捲信息的查看

掃描相關的所有的對應捲

詳細對應捲信息的查看

物理捲

pvs

pvscan

pvdisplay

捲組

vgs

vgscan

vgdisplay

邏輯捲

lvs

lvscan

lvdisplay
2.2 創建並使用LVM邏輯捲
創建PV

添加一個sdb磁碟 
[root@xuegod63 ~]# fdisk /dev/sdb    #創建4個主分區,每個分區1G  
[root@xuegod63 ~]# ls /dev/sdb*
/dev/sdb  /dev/sdb1  /dev/sdb2  /dev/sdb3  /dev/sdb4
設定分區類型代碼:fdisk /dev/sdb ===> t ===> 選擇分區號 ====> 8e ====> w 
註:現在系統已經很智能了, 直接使用預設的 83  Linux分區,也可以創建pv的。
 
[root@xuegod63 ~]# pvcreate /dev/sdb{1,2,3,4}   #創建pv
  Physical volume "/dev/sdb1" successfully created.
  Physical volume "/dev/sdb2" successfully created.
  Physical volume "/dev/sdb3" successfully created.
  Physical volume "/dev/sdb4" successfully created.
 
[root@xuegod63 ~]# pvdisplay /dev/sdb1    #查看物理捲信息
  "/dev/sdb1" is a new physical volume of "1.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name               
  PV Size               1.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               SHKFwf-WsLr-kkox-wlee-dAXc-5eL0-hyhaTV​

創建vg捲組:

語法:      vgcreate  vg名字  pv的名字   可以跟多個pv
[root@xuegod63 ~]#  vgcreate vg01 /dev/sdb1
  Volume group "vg01" successfully created 
[root@xuegod63 ~]#  vgs
  VG   #PV #LV #SN Attr   VSize    VFree   
  vg01   1   0   0 wz--n- 1020.00m 1020.00m
[root@xuegod63 ~]#  vgdisplay vg01
  --- Volume group ---
  VG Name               vg01
  System ID             
  Format                lvm2
  Metadata Areas        1
  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                1
  Act PV                1
  VG Size               1020.00 MiB
  PE Size               4.00 MiB
  Total PE              255
  Alloc PE / Size       0 / 0  ​

創建LV

lvcreate -n 指定新邏輯捲的名稱  -L指定lv大小的SIZE(M,G) (-l:小l 指定LE的數量) vgname
[root@xuegod63 ~]#  lvcreate -n lv01 -L 16M vg01
  Logical volume "lv01" created.
[root@xuegod63 ~]#  lvcreate -n lv02 -l 4 vg01
  Logical volume "lv02" created.
[root@xuegod63 ~]# lvs
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv01 vg01 -wi-a----- 16.00m                                                    
  lv02 vg01 -wi-a----- 16.00m                                          
 
[root@xuegod63 ~]# pvdisplay /dev/sdb1
  --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               vg01
  PV Size               1.00 GiB / not usable 4.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              255
  Free PE               247
  Allocated PE          8   # Allocated    ['æləkeɪtɪd]  分配  ,已經使用了8個PE
[root@xuegod63 ~]# vgdisplay vg01
 
  Alloc PE / Size       8 / 32.00 MiB   #已經使用8個PE,32MB
  Free  PE / Size       247 / 988.00 MiB​

2.3 文件系統格式與掛載

[root@xuegod63 ~]# mkdir /lv01
[root@xuegod63 ~]# ls  /dev/vg01/   #查看邏輯捲
lv01  lv02
[root@xuegod63 ~]# ll  /dev/vg01/lv01  #其實lv01是dm-0的軟鏈接
lrwxrwxrwx 1 root root 7 5月  18 19:02 /dev/vg01/lv01 -> ../dm-0
 
[root@xuegod63 ~]# mkfs.ext4 /dev/vg01/lv01
[root@xuegod63 ~]# mount /dev/vg01/lv01  /lv01
[root@xuegod63 ~]# df -Th /lv01
文件系統              類型  容量  已用  可用 已用% 掛載點
/dev/mapper/vg01-lv01 ext4   15M  268K   14M    2% /lv01 
[root@xuegod63 ~]#echo  "/dev/vg01/lv01 /lv01 ext4 defaults 0 0"  >> /etc/fstab​

2.3 指定PE大小用

指定PE大小用的參數: -s       ,如果存儲的數據都是大文件,那麼PE儘量調大,讀取速度快
[root@xuegod63 ~]#  vgcreate -s 16M vg02 /dev/sdb2
  Volume group "vg02" successfully created
PE的大小隻有為2的冪數,且最大為512M
[root@xuegod63 ~]#  vgdisplay vg02
  --- Volume group ---
  VG Name               vg02
  System ID             
  Format                lvm2
  Metadata Areas        1
  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                1
  Act PV                1
  VG Size               1008.00 MiB
  PE Size               16.00 MiB    #已經是16MB​

2.4 LV擴容

首先,確定一下是否有可用的擴容空間,因為空間是從VG裡面創建的,並且LV不能跨VG擴容
 [root@xuegod63 ~]# vgs
  VG   #PV #LV #SN Attr   VSize    VFree   
  vg01   1   2   0 wz--n- 1020.00m  988.00m
  vg02   1   0   0 wz--n- 1008.00m 1008.00m
用的命令如下:
 
 
擴容邏輯捲
[root@xuegod63 ~]# lvextend -L +30m /dev/vg01/lv01    
說明:在指定大小的時候,擴容30m和擴容到30m是不一樣的寫法
擴容30m ====> -L +30M
擴容到30m =====> -L 30M
[root@xuegod63 ~]#  lvextend -L +30m /dev/vg01/lv01    
  Rounding size to boundary between physical extents: 32.00 MiB.
  Size of logical volume vg01/lv01 changed from 16.00 MiB (4 extents) to 48.00 MiB (12 extents).
  Logical volume vg01/lv01 successfully resized.
 
[root@xuegod63 ~]# lvs
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv01 vg01 -wi-ao---- 48.00m    #LV已經擴容成功                                                
  lv02 vg01 -wi-a----- 16.00m   
 
[root@xuegod63 ~]#  df -Th /lv01
文件系統              類型  容量  已用  可用 已用% 掛載點
/dev/mapper/vg01-lv01 ext4   15M  268K   14M    2% /lv01​

註:可以看到LV雖然擴展了,但是文件系統大小還是原來的,下麵開始擴容文件系統

ext4文件系統擴容使用命令語法: resize2fs 邏輯捲名稱

xfs文件系統擴容使用命令語法: xfs_growfs 掛載點

resize2fs和xfs_growfs 兩者的區別是傳遞的參數不一樣的,xfs_growfs是採用的掛載點;resize2fs是邏輯捲名稱,而且resize2fs命令不能對xfs類型文件系統使用

[root@xuegod63 ~]#  resize2fs /dev/vg01/lv01
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/vg01/lv01 is mounted on /lv01; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/vg01/lv01 is now 49152 blocks long.
[root@xuegod63 ~]#  df -Th /lv01
文件系統              類型  容量  已用  可用 已用% 掛載點
/dev/mapper/vg01-lv01 ext4   46M  (擴容成功)522K   43M    2% /lv01
[root@xuegod63 ~]# lvextend -L 80M -r /dev/vg01/lv01  #直接擴容到80M空間,一步到位,不用再擴文件系統了
[root@xuegod63 ~]# df -T /lv01/
文件系統              類型 1K-塊  已用  可用 已用% 掛載點
/dev/mapper/vg01-lv01 ext4 78303   776 73761    2% /lv01
[root@xuegod63 ~]# df -Th /lv01/
文件系統              類型  容量  已用  可用 已用% 掛載點
/dev/mapper/vg01-lv01 ext4   77M  776K   73M    2% /lv01​

2.5 VG擴容

[root@xuegod63 ~]# vgs
  VG   #PV #LV #SN Attr   VSize    VFree   
  vg01   1   2   0 wz--n- 1020.00m  924.00m
  vg02   1   0   0 wz--n- 1008.00m 1008.00m 
vg擴容的場景:vg捲組中的空間不了夠,需要添加新的硬碟進來
[root@xuegod63 ~]# pvcreate /dev/sdb3  # 創建pv
[root@xuegod63 ~]#  vgextend vg01 /dev/sdb3  #擴容成功
  Volume group "vg01" successfully extended
[root@xuegod63 ~]# vgs
  VG   #PV #LV #SN Attr   VSize    VFree   
  vg01   2   2   0 wz--n-    1.99g   <1.90g
  vg02   1   0   0 wz--n- 1008.00m 1008.00m​

2.6 LVM縮小

LVM可以動態增加,可以動態縮小嗎?

答:LVM可以動態增加,也可以動態縮小,但是XFS不支持動態縮小,所以我們無法實現基於xfs的動態縮小。btrfs文件系統支持線上縮小。

 [root@xuegod63 ~]#  lvreduce -L -20m /dev/vg01/lv01
  WARNING: Reducing active and open logical volume to 60.00 MiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg01/lv01? [y/n]: y
  Size of logical volume vg01/lv01 changed from 80.00 MiB (20 extents) to 60.00 MiB (15 extents).
  Logical volume vg01/lv01 successfully resized.   #縮小成功
但是文件系統沒有縮小成功:
[root@xuegod63 ~]# df -h /lv01/
文件系統                    容量  已用  可用 已用% 掛載點
/dev/mapper/vg01-lv01   77M  776K   73M    2% /lv01   #發現文件系統上空間沒有變
 
[root@xuegod63 ~]# lvextend -L 10M -r /dev/vg01/lv01  #這兩個命令也是不能執行成功的
[root@xuegod63 ~]#  resize2fs /dev/vg01/lv01   #這兩個命令也是不能執行成功的
 ​

備註:VG的縮減,要保證你的物理捲是否被使用,是因為它無法縮減一個正在使用的PV

[root@xuegod63 ~]#  vgs
  VG   #PV #LV #SN Attr   VSize    VFree   
  vg01   2   2   0 wz--n-    1.99g   <1.92g
  vg02   1   0   0 wz--n- 1008.00m 1008.00m 
[root@xuegod63 ~]# pvs
  PV         VG   Fmt  Attr PSize    PFree   
  /dev/sdb1  vg01 lvm2 a--  1020.00m  944.00m
  /dev/sdb2  vg02 lvm2 a--  1008.00m 1008.00m
  /dev/sdb3  vg01 lvm2 a--  1020.00m 1020.00m
  /dev/sdb4       lvm2 ---     1.00g    1.00g
[root@xuegod63 ~]# cp -r /boot/grub /lv01/   #複製一些測試數據
[root@xuegod63 ~]# vgreduce vg01 /dev/sdb1   #將sdb1移出失敗,因sdb1正在被使用
  Physical volume "/dev/sdb1" still in use​

擴展:如果sdb1是一個磁碟陣列,而這個磁碟陣列使用年代太久,我們必須移出怎麼辦?

移動數據:
[root@xuegod63 ~]# pvmove  /dev/sdb1  /dev/sdb3  #將sdb1上數據移到新增加sdb3 pv 上
  /dev/sdb1: Moved: 23.53%
  /dev/sdb1: Moved: 76.47%
  /dev/sdb1: Moved: 100.00%
[root@xuegod63 ~]#  vgreduce vg01 /dev/sdb1  #移完數據再移出
  Removed "/dev/sdb1" from volume group "vg01"
[root@xuegod63 ~]# pvs
  PV         VG   Fmt  Attr PSize    PFree   
  /dev/sdb1       lvm2 ---     1.00g    1.00g
  /dev/sdb2  vg02 lvm2 a--  1008.00m 1008.00m
  /dev/sdb3  vg01 lvm2 a--  1020.00m  952.00m  #vg01中只有sdb3了​

2.7 LVM刪除

創建LVM流程:

pvcreate創建pv -> vgcreate創建捲組 -> lvcreate創建邏輯捲 -> mkfs.xfs lv 格式化-> mount掛載

刪除LVM流程:

umount卸載 -> lvremove lv移出捲組中所有邏輯捲-> vgremove vg移出捲組-> pvremove 移出pv

[root@xuegod63 ~]# umount /lv01
[root@xuegod63 ~]#  lvremove /dev/vg01/lv01
Do you really want to remove active logical volume vg01/lv01? [y/n]: y
  Logical volume "lv01" successfully removed
[root@xuegod63 ~]# lvs
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv02 vg01 -wi-a----- 16.00m        #已經看不到lv01                                           
[root@xuegod63 ~]#  vgremove vg01   #直接移出捲組
Do you really want to remove volume group "vg01" containing 1 logical volumes? [y/n]: y
Do you really want to remove active logical volume vg01/lv02? [y/n]: y  
#如果捲組中還有lv,移出時,會提示,是否也移出,咱們這裡直接移出
  Logical volume "lv02" successfully removed
  Volume group "vg01" successfully removed
[root@xuegod63 ~]# vgs
  VG   #PV #LV #SN Attr   VSize    VFree   
  vg02   1   0   0 wz--n- 1008.00m 1008.00m    #沒有vg01 
 
移出pv  sdb1
[root@xuegod63 ~]# pvs
  PV         VG   Fmt  Attr PSize    PFree   
  /dev/sdb1       lvm2 ---     1.00g    1.00g
  /dev/sdb2  vg02 lvm2 a--  1008.00m 1008.00m
  /dev/sdb3       lvm2 ---     1.00g    1.00g
  /dev/sdb4       lvm2 ---     1.00g    1.00g
[root@xuegod63 ~]# pvremove /dev/sdb1   #已經移出
  Labels on physical volume "/dev/sdb1" successfully wiped.
[root@xuegod63 ~]# pvs
  PV         VG   Fmt  Attr PSize    PFree   
  /dev/sdb2  vg02 lvm2 a--  1008.00m 1008.00m
  /dev/sdb3       lvm2 ---     1.00g    1.00g
  /dev/sdb4       lvm2 ---     1.00g    1.00g​

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 該方式是直接對屏幕進行截圖操作UserControl chartContainPanel = new UserControl();Graphics graph = chartContainPanel.CreateGraphics();Size s = chartContainPanel.Size;B... ...
  • 3.github與git同步 3.1 配置公私鑰 3.2 github上建立個人倉庫 3.3 本地倉庫同步到github 往遠端推送叫做 push 從遠端拉取叫做 fetch 需要先git pull命令拉取下來 瞭解更多技術文章,歡迎關註我的個人公眾號 ...
  • Ceph理論 1. Ceph 簡介 Ceph 是一個開源項目,它提供軟體定義的、統一的存儲解決方案 。Ceph 是一個具有高性能、高度可伸縮性、可大規模擴展並且無單點故障的分散式存儲系統 。 Ceph 是軟體定義存儲解決方案 Ceph 是統一存儲解決方案 Ceph 是雲存儲解決方案 Ceph 官方文 ...
  • 1. 安裝mysql yum install http://dev.mysql.com/get/mysql57 community release el7 9.noarch.rpm yum remove mariadb libs yum install mysql community server ...
  • 一.導入文件內容 :r 解釋 示例 :! 解釋 示例 :r !命令 解釋 示例 二.定義快捷鍵 定義添加行首添加註釋 的快捷建ctrl+p 定義刪除行首首個字元的快捷鍵ctrl+b 定義插入郵箱的快捷鍵ctrl+h 三.連續行註釋 將n1到n2行全部註釋掉 將n1到n2行行首的註釋全部去掉 將n1行 ...
  • 三種模式 插入命令 命令 | 作用 | a | 在游標所在字元後插入 A | 在游標所在行尾插入 i | 在游標所在字元前插入 I | 在游標所在行首插入 o | 在游標下插入新行 O | 在游標上插入新行 設置行號 定位首行和末行的行首 跳到指定的行首 在某一行下,移動游標到行首或行尾 刪除命令 ...
  • 目錄 locate which whereis grep locate 解釋 語法 提示locate命令找不到 locate缺陷 示例 which 解釋 語法 示例 whereis 解釋 語法 示例 grep 解釋 語法 示例 ...
  • redis 3.2 鏡像製作及驗證 鏡像製作 1.安裝redis yum install redis yum install epl release yum install python pip git gcc pip2 install redis pip2 install hiredis vim ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...