Linux中的LVM和軟RAID

来源:https://www.cnblogs.com/surpassme/archive/2018/11/14/9959935.html
-Advertisement-
Play Games

    在實際工作中,會經常碰到所給的伺服器硬碟容量太小,而實際的應用軟體中卻需要一個容量較大的分區進行數據存儲等,除了通過硬體RAID卡來實現合併多硬碟外,其實我們也可以通過軟體的方式來實現。 實驗環境 虛擬機:CentOS 6.6 x64 硬碟1:/dev/sdb 硬碟2:/ ...


    在實際工作中,會經常碰到所給的伺服器硬碟容量太小,而實際的應用軟體中卻需要一個容量較大的分區進行數據存儲等,除了通過硬體RAID卡來實現合併多硬碟外,其實我們也可以通過軟體的方式來實現。

實驗環境

  • 虛擬機:CentOS 6.6 x64
  • 硬碟1:/dev/sdb
  • 硬碟2:/dev/sdc
  • 硬碟3:/dev/sdd

  詳細硬碟列表信息如下所示:
01硬碟列表.jpg

使用LVM合併硬碟

使用LVM目的如下所示:

將多塊獨立的硬碟合併為邏輯上的一塊,並掛載到指定的掛載點中,達到在一個目錄中使用多塊硬碟所有空間的效果

LVM相關概念

  • PV(Physical Volume):物理捲

硬碟分區後但還未格式化為文件系統,可使用pvcreate命令將分區創建為PV,其對應的system ID為8e即LVM格式所對應的系統標識符。

  • VG(Volume Group):捲組

將多個PV組合起來,使用vgcreate創建捲組,這樣捲組就可以包含多個PV,相當於重新組合多個分區後所得到的磁碟。雖然VG是組合了多個PV,但創建VG時會將VG所有的空間根據指定的PE大小劃分為多個PE,在LVM模式中存儲都是以PE為單元,類似於文件系統中的BLOCK。

  • PE(Physical Extend):物理擴展

PE是VG的存儲單元,實際的數據都是存儲在PE中

  • LV(Logical Volume):邏輯捲

VG相當於組合的多個硬碟,則LV相當於分區,只不過該分區是通過VG進行劃分的。VG中存在很多PE,可以指定將多少個PE劃分給一個LV,也可以直接指定大小來劃分。劃分為LV後就相當於劃分了分區,僅需要對LV進行格式化文件系統即可。

  • LE(Logical Extend):邏輯擴展

PE是物理存儲單元,而LE則是邏輯存儲單元,即LE為LV中的邏輯存儲單元,與PE大小一致。從VG中劃分LV,實際上就是從VG中劃分PE,而劃分LV後稱之為LE,而不是PE了。

LVM之所以能夠伸縮容量,其實現方法就是將LV中的PE進行刪除或增加
  • LVM的存儲機制

    LV是從VG中劃分出來的,因此LV中的PE可能來自於多個PV。因此向LV存儲數據時,主要有兩種機制:

  • [ ] 線性模式(Linear):先將數據存儲在屬於同一個PV的PE,然後再向下一個PV中的PE
  • [ ] 條帶模式(Striped):將一份數據拆分為多份,分別寫入該LV對應的每個PV中,類似於RAID 0,因此讀寫性能會優於線性模式。
儘管條帶模式讀寫性能會比較好,但LVM的重點是擴展容量而非性能,如果要實現讀寫性能還是推薦採用RAID方式實現。
  • LVM示意圖

02LVM示意圖.png

創建LVM操作步驟

1、創建PV(Physical Volume)

[root@Wine ~]# pvcreate /dev/sdb /dev/sdc /dev/sdd
  Physical volume "/dev/sdb" successfully created
  Physical volume "/dev/sdc" successfully created
  Physical volume "/dev/sdd" successfully created

2、查看創建的PV列表

[root@Wine ~]# pvs # 查看列表
  PV         VG   Fmt  Attr PSize  PFree
  /dev/sdb        lvm2 ---  40.00g 40.00g
  /dev/sdc        lvm2 ---  50.00g 50.00g
  /dev/sdd        lvm2 ---  30.00g 30.00g
或
[root@Wine ~]# pvscan
  PV /dev/sdb         lvm2 [40.00 GiB]
  PV /dev/sdc         lvm2 [50.00 GiB]
  PV /dev/sdd         lvm2 [30.00 GiB]
  Total: 3 [120.00 GiB] / in use: 0 [0   ] / in no VG: 3 [120.00 GiB]
[root@Wine ~]# pvdisplay # 查看PV詳細信息
  "/dev/sdb" is a new physical volume of "40.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb
  VG Name               
  PV Size               40.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               9vAxyC-FsAc-S2HA-aCze-MZe5-em24-7th27s
  "/dev/sdc" is a new physical volume of "50.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc
  VG Name               
  PV Size               50.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               HdbCuK-hFkP-QQbr-Naaa-PNzz-WFNw-78uXs3
  "/dev/sdd" is a new physical volume of "30.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdd
  VG Name               
  PV Size               30.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               EpPdAf-ku4b-zIMm-V2Np-gnuC-59nj-L0Zd9G

3、創建VG(Volume Group)
  創建的VG的使用方法如下

vgcreate [自定義LVM名稱] [設備]

[root@Wine ~]# vgcreate TestLVM /dev/sdb # 創建主要捲組
  Volume group "TestLVM" successfully created
[root@Wine ~]# vgdisplay # 顯示捲組詳細信息
  --- Volume group ---
  VG Name               TestLVM
  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               40.00 GiB
  PE Size               4.00 MiB
  Total PE              10239
  Alloc PE / Size       0 / 0   
  Free  PE / Size       10239 / 40.00 GiB
  VG UUID               s0gVkf-FScU-7x9v-HIx3-cinR-Sc60-IHgKmn

4、創建擴展VG(Volume Group)
  創建的擴展VG的使用方法如下

vgextend [自定義LVM名稱] [設備]

[root@Wine ~]# vgextend TestLVM /dev/sdc /dev/sdd # 創建擴展卷組,並使合併到一個捲組中
  Volume group "TestLVM" successfully extended # 查看擴展卷組
[root@Wine ~]# vgdisplay
  --- Volume group ---
  VG Name               TestLVM
  System ID             
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  2
  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               119.99 GiB # 註意這裡與前面的區別
  PE Size               4.00 MiB
  Total PE              30717
  Alloc PE / Size       0 / 0   
  Free  PE / Size       30717 / 119.99 GiB
  VG UUID               s0gVkf-FScU-7x9v-HIx3-cinR-Sc60-IHgKmn

5、創建LV(Logical Volume)

  創建的LV的使用方法如下

lvcreate -L[自定義分區大小] -n[自定義分區名稱] [VG名稱]

lvcreate -l[%{ VG | FREE | ORIGIN }] -n[自定義分區名稱] [VG名稱]

[root@Wine ~]# lvcreate -l 100%VG -nTestData TestLVM # 創建LV
  Logical volume "TestData" created
[root@Wine ~]# lvscan # 查看創建的LV列表
  ACTIVE            '/dev/TestLVM/TestData' [119.99 GiB] inherit
[root@Wine ~]# lvdisplay # 查看創建的LV詳細信息
  --- Logical volume ---
  LV Path                /dev/TestLVM/TestData
  LV Name                TestData
  VG Name                TestLVM
  LV UUID                2zvNe9-dtlv-pcWc-oTnJ-6INz-e2dI-vRQ7Vq
  LV Write Access        read/write
  LV Creation host, time Wine, 2018-11-14 11:01:56 +0800
  LV Status              available
  # open                 0
  LV Size                119.99 GiB
  Current LE             30717
  Segments               3
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

6、格式化分區

[root@Wine ~]# mkfs -t ext4 /dev/TestLVM/TestData # 格式化分區
mke2fs 1.41.12 (17-May-2010)
文件系統標簽=
操作系統:Linux
塊大小=4096 (log=2)
分塊大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
7864320 inodes, 31454208 blocks
1572710 blocks (5.00%) reserved for the super user
第一個數據塊=0
Maximum filesystem blocks=4294967296
960 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624, 11239424, 20480000, 23887872

正在寫入inode表: 完成                            
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

This filesystem will be automatically checked every 29 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

7、創建掛載點併進行掛載

[root@Wine ~]# mkdir /LVM
[root@Wine ~]# mount /dev/TestLVM/TestData /LVM/
[root@Wine ~]# df -Th
Filesystem           Type   Size  Used Avail Use% Mounted on
/dev/sda2            ext4    79G  9.6G   65G  13% /
tmpfs                tmpfs  7.8G   72K  7.8G   1% /dev/shm
/dev/sda1            ext4   190M   32M  149M  18% /boot
/dev/mapper/TestLVM-TestData  ext4   118G   60M  112G   1% /LVM # 創建的LVM掛載點

8、添加開機自動掛載

[root@Wine ~]# echo '/dev/TestLVM/TestData  /LVM ext4 defaults 0 0 ' >> /etc/fstab

刪除LVM操作步驟

1、在備份LVM數據後,先卸載掛載點並刪除/etc/fstab中的掛載記錄

[root@Wine ~]# umount /LVM/;df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        79G  9.6G   65G  13% /
tmpfs           7.8G   72K  7.8G   1% /dev/shm
/dev/sda1       190M   32M  149M  18% /boot

2、刪除LV

[root@Wine ~]# lvremove /dev/TestLVM/TestData
Do you really want to remove active logical volume TestData? [y/n]: y
  Logical volume "TestData" successfully removed

3、刪除VG

[root@Wine ~]# vgremove TestLVM
  Volume group "TestLVM" successfully removed

4、刪除PV

[root@Wine ~]# pvremove /dev/sdb /dev/sdc /dev/sdd
  Labels on physical volume "/dev/sdb" successfully wiped
  Labels on physical volume "/dev/sdc" successfully wiped
  Labels on physical volume "/dev/sdd" successfully wiped

使用軟RAID

創建軟RAID

    RAID通過分為兩種:

  • 硬體RAID:通過RAID卡連接多個硬碟或伺服器主板集成RAID控制器從而實現RAID相關功能
  • 軟體RAID:通過軟體層面來模擬實現RAID的相關功能,從而達到與硬體RAID相同的功能

在Linux中通常是使用md模塊來實現軟體RAID

1、確認操作系統是否安裝mdadm包

[root@Wine ~]# rpm -q mdadm
mdadm-3.3-6.el6.x86_64

2、對進行需要創建軟體的硬碟進行分區並設置分區類型為RAID

[root@Wine ~]# lsblk # 顯示硬碟和分區信息
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1 1024M  0 rom  
sdb      8:16   0   40G  0 disk 
sdd      8:48   0   30G  0 disk 
sdc      8:32   0   50G  0 disk 
sda      8:0    0   80G  0 disk 
├─sda1   8:1    0  200M  0 part /boot
└─sda2   8:2    0 79.8G  0 part /
# 創建分區
[root@Wine ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x7bfec905.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

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

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n # 添加新分區
Command action
   e   extended
   p   primary partition (1-4)
p # 選擇分區類型
Partition number (1-4): 1 # 設置分區號
First cylinder (1-5221, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-5221, default 5221): 
Using default value 5221

Command (m for help): l # 列印支持的分區格式類型

 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris        
 1  FAT12           39  Plan 9          82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      3c  PartitionMagic  83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       40  Venix 80286     84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      41  PPC PReP Boot   85  Linux extended  c7  Syrinx         
 5  Extended        42  SFS             86  NTFS volume set da  Non-FS data    
 6  FAT16           4d  QNX4.x          87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS       4e  QNX4.x 2nd part 88  Linux plaintext de  Dell Utility   
 8  AIX             4f  QNX4.x 3rd part 8e  Linux LVM       df  BootIt         
 9  AIX bootable    50  OnTrack DM      93  Amoeba          e1  DOS access     
 a  OS/2 Boot Manag 51  OnTrack DM6 Aux 94  Amoeba BBT      e3  DOS R/O        
 b  W95 FAT32       52  CP/M            9f  BSD/OS          e4  SpeedStor      
 c  W95 FAT32 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad hi eb  BeOS fs        
 e  W95 FAT16 (LBA) 54  OnTrackDM6      a5  FreeBSD         ee  GPT            
 f  W95 Ext'd (LBA) 55  EZ-Drive        a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            56  Golden Bow      a7  NeXTSTEP        f0  Linux/PA-RISC b
11  Hidden FAT12    5c  Priam Edisk     a8  Darwin UFS      f1  SpeedStor      
12  Compaq diagnost 61  SpeedStor       a9  NetBSD          f4  SpeedStor      
14  Hidden FAT16 <3 63  GNU HURD or Sys ab  Darwin boot     f2  DOS secondary  
16  Hidden FAT16    64  Novell Netware  af  HFS / HFS+      fb  VMware VMFS    
17  Hidden HPFS/NTF 65  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE 
18  AST SmartSleep  70  DiskSecure Mult b8  BSDI swap       fd  Linux raid auto
1b  Hidden W95 FAT3 75  PC/IX           bb  Boot Wizard hid fe  LANstep        
1c  Hidden W95 FAT3 80  Old Minix       be  Solaris boot    ff  BBT            
1e  Hidden W95 FAT1

Command (m for help): t # 更改分區類型
Selected partition 1
Hex code (type L to list codes): fd # 設置分區類型為RAID
Changed system type of partition 1 to fd (Linux raid autodetect)

Command (m for help): p # 列印信息

Disk /dev/sdb: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x7bfec905

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        5221    41937651   fd  Linux raid autodetect

Command (m for help): w # 保存分區信息
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

fdisk命令只適合小於2T的硬碟,如大於2T則需要使用parted。

  使用parted命令創建RAID的如下所示:

[root@Wine ~]# parted /dev/sdc
GNU Parted 2.1
使用 /dev/sdc
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt                                                   
警告: The existing disk label on /dev/sdc will be destroyed and all data on this disk will be lost. Do you want to continue?
是/Yes/否/No? y
(parted) mkpart primary 1 -1
(parted) set 1 raid   # 關鍵步驟在這裡
新狀態?  [開]/on/關/off? on
(parted) print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 53.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name     標誌
 1      1049kB  53.7GB  53.7GB               primary  raid

3、使用mdadm創建RAID

[root@Wine ~]# mdadm --create /dev/md0 --auto yes --level 0 -n3 /dev/sd{b,c,d}1 
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@Wine ~]# lsblk
NAME    MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sr0      11:0    1  1024M  0 rom   
sdb       8:16   0    40G  0 disk  
└─sdb1    8:17   0    40G  0 part  
  └─md0   9:0    0 119.9G  0 raid0 
sdd       8:48   0    30G  0 disk  
└─sdd1    8:49   0    30G  0 part  
  └─md0   9:0    0 119.9G  0 raid0 
sdc       8:32   0    50G  0 disk  
└─sdc1    8:33   0    50G  0 part  
  └─md0   9:0    0 119.9G  0 raid0 
sda       8:0    0    80G  0 disk  
├─sda1    8:1    0   200M  0 part  /boot
└─sda2    8:2    0  79.8G  0 part  /

 該命令中各參數說明:

  • -C/--create:新建陣列
  • -a/--auto:允許mdadm創建設備文件,一般常用參數-a yes一次性創建
  • -l/--levle:RAID模式,支持RAID0/1/4/5/6/10等
  • -n/--raid-devices=:創建陣列中活動磁碟的數量
  • /dev/md0:陣列的設備名稱
  • /dev/sd{b,c,d}1:創建陣列中的物理磁碟分區信息

更多mdadm幫助,可使用mdadm -h 或 man mdadm

  創建完成後,查看陣列狀態:

[root@Wine ~]# cat /proc/mdstat 
Personalities : [raid0] 
md0 : active raid0 sdd1[2] sdc1[1] sdb1[0]
      125722624 blocks super 1.2 512k chunks      
unused devices: <none>
或使用
[root@Wine ~]# mdadm -D /dev/md0 # 查看軟體RAID信息
/dev/md0:
        Version : 1.2
  Creation Time : Wed Nov 14 14:36:11 2018
     Raid Level : raid0
     Array Size : 125722624 (119.90 GiB 128.74 GB)
   Raid Devices : 3
  Total Devices : 3
    Persistence : Superblock is persistent

    Update Time : Wed Nov 14 14:36:11 2018
          State : clean 
 Active Devices : 3
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 0

     Chunk Size : 512K

           Name : Wine:0  (local to host Wine)
           UUID : 2c8da2fd:7729efbd:5e414dd0:9cfb9f5f
         Events : 0

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1
       2       8       49        2      active sync   /dev/sdd1

4、創建md0配置文件

[root@Wine ~]# echo DEVICE /dev/sd{b,c,d}1 >> /etc/mdadm.conf
[root@Wine ~]# mdadm -Evs >> /etc/mdadm.conf 
[root@Wine ~]# cat /etc/mdadm.conf 
DEVICE /dev/sdb1 /dev/sdc1 /dev/sdd1
ARRAY /dev/md/0  level=raid0 metadata=1.2 num-devices=3 UUID=2c8da2fd:7729efbd:5e414dd0:9cfb9f5f name=Wine:0
   devices=/dev/sdb1,/dev/sdc1,/dev/sdd1

5、格式化RAID分區

[root@Wine ~]# mkfs -t ext4 /dev/md0
mke2fs 1.41.12 (17-May-2010)
文件系統標簽=
操作系統:Linux
塊大小=4096 (log=2)
分塊大小=4096 (log=2)
Stride=128 blocks, Stripe width=384 blocks
7864320 inodes, 31430656 blocks
1571532 blocks (5.00%) reserved for the super user
第一個數據塊=0
Maximum filesystem blocks=4294967296
960 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624, 11239424, 20480000, 23887872

正在寫入inode表: 完成                            
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

6、添加開機自動掛載

[root@Wine ~]# blkid | grep /dev/md # 這裡推薦使用UUID進行掛載
/dev/md0: UUID="40829115-a1c5-4d5a-af4a-07225a4619fc" TYPE="ext4"
[root@Wine ~]# echo "UUID=40829115-a1c5-4d5a-af4a-07225a4619fc /SoftRAID ext4 defaults 0 0" >> /etc/fstab# 添加掛載信息到/etc/fstab中
[root@Wine ~]# mount -a;df -h # 查看系統掛載信息
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        79G  9.6G   65G  13% /
tmpfs           7.8G   72K  7.8G   1% /dev/shm
/dev/sda1       190M   32M  149M  18% /boot
/dev/md0      118G   60M  112G   1% /SoftRAID

刪除軟RAID

1、卸載掛載點

[root@Wine ~]# umount /dev/md0

2、停止軟體RAID設備

[root@Wine ~]# mdadm -S /dev/md0
mdadm: stopped /dev/md0

3、刪除RAID中的磁碟

[root@Wine ~]# mdadm --misc --zero-superblock /dev/sd{b,c,d}1

4、刪除mdadm配置文件

[root@Wine ~]# rm -f /etc/mdadm.conf

5、刪除/etc/fstab中的掛載信息

    以上即是在Linux常見的兩種將多個硬碟合併容量的方法,僅作為參考。在現實環境中還是推薦使用硬體RAID,數據無價。

本文同步在微信訂閱號上發佈,如各位小伙伴們喜歡我的文章,也可以關註我的微信訂閱號:woaitest,或掃描下麵的二維碼添加關註:
MyQRCode.jpg


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

-Advertisement-
Play Games
更多相關文章
  • using System.Collections.Generic; namespace Oyang.Tool { public interface IPagination { int PageIndex { get; set; } int PageSize { get; set; } int Tot... ...
  • VS2015中使用T4模板,根據EF生成的實體模型,生成相應的文件 ...
  • using System; using System.Linq; using System.Linq.Expressions; namespace Oyang.Tool { public static class PredicateBuilder { public static Expression... ...
  • 有時候,需要檢查構建的dll是否針對正確的平臺 可以使用CorFlags.exe(它是.NET Framework SDK的一部分)從dll中查找此信息。運行CorFlags.exe將產生以下輸出: 我們需要關註的兩個參數是“PE”和“32BITREQ”​​ 要以編程方式確定目標平臺,我們可以使用M ...
  • 遞歸,迴圈,尾遞歸 概念 方法遞歸,簡而言之就是方法本身自己調用自己; 咬文嚼字的分析就是兩個過程:“遞“過程和”歸“過程,所有的遞歸問題都能用地推公式標識.例如斐波拉契數列就能用遞推公式表示: $$ f(n) = f(n 1) +f(n 2)其中fn(0)=1,f(1)=1 $$ 轉換成代碼就是 ...
  • 1,LoaderForm窗體中添加PictureBox,然後添加Loading圖片 2,窗體內屬性設置 StartPosition :CenterScreen在屏幕中心顯示 TopMost:True置頂顯示 ShowInTaskbar:False不在任務欄顯示 FormBorderStyle:Non ...
  • 1、簡介 經過前面兩篇博客的掃盲,大家多多少少對docker有了一個基本的瞭解,也接觸了docker的常用命令。在這篇博客中,我將介紹進入docker容器的幾種方式。 2、進入docker中的幾種方式 2.1、使用docker attach命令進入docker Docker提供了attach命令來進 ...
  • 本篇為linux常用命令的第二篇,第一篇主要是目錄相關的命令操作,本篇主要是講解關於文件的常用命令操作。 關於文件的命令按照增刪改查為主線進行講解。 一、創建文件 命令: touch + 文件名 創建一個空文件 以在usr文件夾下建立test.txt文件為例。 這裡需要註意,在linux中是不分尾碼 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...