首页 技术 正文
技术 2022年11月21日
0 收藏 641 点赞 4,657 浏览 13337 个字

1 Linux磁盘管理体系简介

Linux磁盘管理分为五个步骤:首先在服务器上添加相应的硬盘(如/dev/sda、sdb、sdc等),对全新的服务器(即没有操作系统)做硬RAID0、RAID1、RAID5、RAID10或者逻辑卷LVM,然后进行磁盘分区,
创建完分区后进行格式化分区(初始化inode和block),最后就是挂载到linux文件系统中就可以进行安装操作系统或者存放数据

磁盘管理体系图一

Linux系统磁盘管理

1.1 磁盘读写数据的原理

)    磁盘是按照柱面为单位读写数据的,即先读取同一个盘面的某一个磁道,读完之后,如果数据没有读完,磁头也不会切换其他的磁道,而是选择切换磁头,读取下一个盘面的相同半径的磁道,直到所有盘面的相同半径
的磁道读取完成之后,如果数据还没有读写完成,才会切换其他不同半径的磁道,这个切换磁道的过程称为寻道
) 不同磁头间的切换是电子切换,而不同磁道间的切换需要磁头做径向运动,这个径向运动需要步进电机调节,这个动作是机械的切换
) 磁头寻道是机械运动,切换磁头是电子切换

2 Linux磁盘分区类型

2.1 16字节分区表说明

Linux系统磁盘管理

3 Linux磁盘分区重点小结

)    给磁盘分区的实质就是针对上述0磁头0磁道1扇区的前446字节之后的64bytes的分区表进行设置,即主要是划分起始以及结束磁头号、扇区号即柱面号
) 给磁盘分区的工具有fdisk(适合给小于2TB的磁盘分区),parted(擅长给大于2TB的磁盘分区,也可以对小于2TB的磁盘分区),首选fdisk,只有磁盘大于2TB时才去选parted
补充:(企业面试题:一台服务器6块600G的磁盘,raid5后,总大小3TB,此时无法安装系统,请问为什么?)
解决办法:
方法1:做raid5后,不要重启装系统,而是再回到raid界面,继续分1个小的虚拟磁盘vd 200G,用这个200G的虚拟磁盘装系统,装完系统后再把剩余的2.8T分区通过parted
方法2:先拿1块盘做raid0,剩下5块盘做raid5,在raid0上安装操作系统
方法3:装系统时,选择gpt分区格式,即可安装操作系统
) 一块磁盘的分区表仅有64bytes大小,每个分区表要占用16字节,因此一块硬盘仅支持四个分区表信息,即主分区+扩展分区的总量不超过4个
) 磁盘分区是按照柱面(cylinder)来划分的
) 扩展分区不能直接使用,需要在扩展分区的基础上创建逻辑分区才行
) 扩展分区有自己的分区表,因此扩展分区下面的逻辑分区可以有多个
磁盘在使用前一般要进行分区,当然如果不分区直接格式化使用也是没问题的,但这不是常见情况;磁盘分区有主分区、扩展分区和逻辑分区之分;一块硬盘最多可以有4个分区表信息(磁盘本身限制),其中一个主分区的
位置可以用一个扩展分区替换,且一块硬盘只能有一个扩展分区(操作系统限制),在这个扩展分区内可以划分多个逻辑分区(IDE磁盘逻辑分区大概编号可以是5-,SATA编号5-)

4 RAID介绍

4.1 什么是RAID?

RAID是廉价的冗余磁盘阵列(Redundant Array of Inexpensive Disk)的简称,有时也简称磁盘阵列(Disk Array)
RAID是一种把多块独立的物理磁盘按不同的技术方式组合起来形成一个磁盘组,在逻辑上(做完RAID,装系统后)看起来就是一块大的磁盘,可以提供比单个物理磁盘更大的存储容量或更高的存储性能,
同时又能提供不同级别数据冗余备份的一种技术
RAID技术分类:基于硬件的RAID技术和基于软件的RAID技术

4.2 RAID级别对比说明

RAID级别

关键优点

关键缺点

实际应用场景

RAID 0

读写速度最快

没有任何冗余

Mysql Slave,集群节点RS

RAID 1

100%冗余,镜像

读写性能一般,成本高

单独的,数据重要,且不能宕机的业务。监控,系统盘等

RAID 5

具备一定性能和冗余性,可以坏一块盘,读性能不错,奇偶校验

写入性能不高

一般业务都可以用

RAID 0+1

RAID 10

读写速度很快,100%冗余

成本高

性能和冗余要求都很好的业务,数据库主库和存储主节点

4.3 RAID级别定义说明

RAID级别

描述

速度

容错性能

RAID 0

磁盘分段

磁盘并行输入\输出

RAID 1

磁盘镜像

没有提高

有(允许单个磁盘故障)

RAID 2

磁盘分段加海明码纠错

没有提高

有(允许单个磁盘故障)

RAID 3

磁盘分段加专用奇偶校验盘

磁盘并行输入\输出

有(允许单个磁盘故障)

RAID 4

磁盘分段加专用奇偶校验盘需异步磁盘

磁盘并行输入\输出

有(允许单个磁盘故障)

RAID 5

磁盘分段加奇偶校验分布在各个磁盘上

磁盘并行输入\输出,比RAID0稍慢

有(允许单个磁盘故障)

RAID 10

速度快、完全容错,成本高

速度快

有(允许50%个磁盘故障)

4.4 RAID与LVM的区别

4.4.1 什么是LVM?

LVM全称(Logic Volume Management)逻辑卷管理,最大用途是可以灵活的管理磁盘的容量,让磁盘分区可以随意的放大或者缩小,便于更好的应用磁盘的剩余空间
LVM是在硬盘的分区之上,创建一个逻辑层,以方便系统管理整个硬盘分区系统。LVM最先是由IBM开发,在AIX系统上实现,OS/2操作系统与HP-UX也支持这个功能。在1998年,HeinzMauelshagen
根据在HP-UX上的LVM管理器,写出第一个linux版本

4.4.2 RAID与LVM的区别

LVM:灵活的管理磁盘的容量,有一定的冗余和性能功能,但是很弱
RAID:更侧重于性能和数据安全
如果过于强调性能与备份,那么还是应该使用RAID功能,而不是LVM

4.5 RAID好处

)    提升数据安全性
) 提升数据读写性能
) 提供更大的单一逻辑磁盘数据容量存储

4.6 RAID 0级别

以4块硬盘(100G)RAID 0为例说明

关注点

描述

容量

是4块盘加在一起的容量(400G),在raid级别中具备最高的存储性能,原理是把连续的数据分散到多个磁盘上进行存取(并行方式)

性能

理论上磁盘读写速度比单盘提升4倍,磁盘越多倍数越小

冗余

无任何冗余,坏1块盘,整个RAID就都不能使用了,数据全部丢失

场景

适合于大规模高并发读写,但对数据安全性要求不高的情况。如:集群中的RS,做虚拟机的实体机、负载均衡群集下面的多个相同RS节点服务器,如分布式文件存储下面的CHUNK SERVER,以及Mysql主从复制的多个Slave服务器

特点

速度快、无冗余、容量无损失

注意

制作RAID 0至少是1块物理硬盘,不同磁盘大小最好一致(生产环境使用单盘要做成RAID 0,否则可能无法使用)

4.7 RAID 1级别

以2块硬盘(100G)为例说明

关注点

描述

容量

损失50%的数据容量,如:2块100G的盘,做RAID 1后,容量为200G,原理是写入一个硬盘的数据百分之百地自动复制到另一块硬盘上,实现存储双份的数据

性能

RAID 1不能提高存储性能,理论上写性能和单盘相差不大;有人说读取速率是单盘的2倍,有待验证

冗余

在所有RAID级别中,RAID 1提供最高的数据安全保障,冗余度50%

场景

适用于存放重要数据,如服务器系统分区和对性能要求不高的数据库存储等领域

特点

50%冗余,容量损失一半,具有利用备份数据重构RAID 1,即镜像mirror

注意

制作RAID 1至少是两块硬盘,整个RAID大小等于两个磁盘中最小硬盘的容量(最好使用同样大小的硬盘)

4.8 RAID 5级别

关注点

描述

容量

损失一块硬盘的数据容量

性能

RAID 5具有和RAID 0相近似的数据读取速度,只是多个一个奇偶校验信息,写入数据的速度比对单个硬盘进行写入操作稍慢

冗余

可损失一块盘,RAID 5数据安全保障程度比RAID 1低,而磁盘空间利用率要比RAID 1高

场景

适合对性能和冗余都有一定要求,又都不是非常高的情况,如:Mysql的主从库,存储等

特点

容量损失一块盘,写数据通过奇偶检验,RAID 0和RAID 1的折中方案

注意

制作RAID 5需要至少3块物理硬盘,提供热备盘实现故障恢复,采用奇偶校验,可靠性强,且只有同时损坏两块硬盘数据才会损坏,只损坏一块盘时,系统会根据剩下的数据和相应的奇偶校验信息去重建数据;奇偶校验信息和相应的数据分别存储在不同的磁盘上

虚拟文件系统模型图

Linux系统磁盘管理

5 fdisk与parted分区操作

MBR分区方式:无法支持超过2TB的硬盘的分区(或单个分区超过2TB)
GPT分区方式:很好的解决了传统MBR无法逾越2TB的限制,如果大于2TB就用GPT分区
Fdisk命令无法支持gpt分区格式,Parted命令操作是实时的

5.1 fdisk分区操作

[root@cobbler-node1 ~]# fdisk -l /dev/sdb Disk /dev/sdb:  MB,  bytes
heads, sectors/track, cylinders
Units = cylinders of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk identifier: 0x000a3ee6 Device Boot Start End Blocks Id System
[root@cobbler-node1 ~]# fdisk -cu /dev/sdbCommand (m for help): n
Command action
e extended
p primary partition (-)
p
Partition number (-):
First sector (-, default ):
Using default value
Last sector, +sectors or +size{K,M,G} (-, default ): +100MCommand (m for help): n
Command action
e extended
p primary partition (-)
p
Partition number (-):
First sector (-, default ):
Using default value
Last sector, +sectors or +size{K,M,G} (-, default ): +100MCommand (m for help): n
Command action
e extended
p primary partition (-)
p
Partition number (-):
First sector (-, default ):
Using default value
Last sector, +sectors or +size{K,M,G} (-, default ): +100MCommand (m for help): n
Command action
e extended
p primary partition (-)
e
Selected partition
First sector (-, default ):
Using default value
Last sector, +sectors or +size{K,M,G} (-, default ):
Using default value Command (m for help): n
First sector (-, default ):
Using default value
Last sector, +sectors or +size{K,M,G} (-, default ): +100MCommand (m for help): pDisk /dev/sdb: MB, bytes
heads, sectors/track, cylinders, total sectors
Units = sectors of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk identifier: 0x000a3ee6 Device Boot Start End Blocks Id System
/dev/sdb1 Linux
/dev/sdb2 Linux
/dev/sdb3 Linux
/dev/sdb4 Extended
/dev/sdb5 LinuxCommand (m for help): w
The partition table has been altered!Calling ioctl() to re-read partition table.
Syncing disks.
#格式化/dev/sdb5分区文件系统为ext4类型
[root@cobbler-node1 ~]# mkfs.ext4 /dev/sdb5
mke2fs 1.41. (-May-)
Filesystem label=
OS type: Linux
Block size= (log=)
Fragment size= (log=)
Stride= blocks, Stripe width= blocks
inodes, blocks
blocks (5.00%) reserved for the super user
First data block=
Maximum filesystem blocks=
block groups
blocks per group, fragments per group
inodes per group
Superblock backups stored on blocks:
, , , , Writing inode tables: done
Creating journal ( blocks): done
Writing superblocks and filesystem accounting information: doneThis filesystem will be automatically checked every mounts or
days, whichever comes first. Use tune2fs -c or -i to override.
#打印块设备的属性信息
[root@cobbler-node1 ~]# blkid /dev/sdb5
/dev/sdb5: UUID="20cdc54d-f801-4399-9799-f92daac43155" TYPE="ext4"
#创建挂载目录
[root@cobbler-node1 ~]# mkdir /applog
#挂载/dev/sdb5到/applog目录
[root@cobbler-node1 ~]# mount /dev/sdb5 /applog
#验证/dev/sdb5是否挂载成功
[root@cobbler-node1 ~]# df -h | grep "applog"
/dev/sdb5 97M 5.6M 87M % /applog
#加载开机启动自动挂载/dev/sdb5
[root@cobbler-node1 ~]# echo "UUID=20cdc54d-f801-4399-9799-f92daac43155 /applog ext4 defaults 0 0" >> /etc/fstab
[root@cobbler-node1 ~]# tail - /etc/fstab
UUID=20cdc54d-f801---f92daac43155 /applog ext4 defaults
#查看/dev/sdb磁盘的现有分区
[root@cobbler-node1 ~]# fdisk -l /dev/sdbDisk /dev/sdb: MB, bytes
heads, sectors/track, cylinders
Units = cylinders of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk identifier: 0x000a3ee6 Device Boot Start End Blocks Id System
/dev/sdb1 Linux
Partition does not end on cylinder boundary.
/dev/sdb2 Linux
Partition does not end on cylinder boundary.
/dev/sdb3 Linux
Partition does not end on cylinder boundary.
/dev/sdb4 Extended
Partition does not end on cylinder boundary.
/dev/sdb5 Linux
注意:其他分区如:/dev/sdb1、/dev/sdb2、/dev/sdb3格式化创建文件系统、创建挂载目录并挂载到相应的目录、加载开机自启动,请参照/dev/sdb5的操作即可

5.2 parted分区操作

方法一:交互式创建磁盘分区

#parted交互式方式创建磁盘分区(parted操作是实时生效的)
[root@cobbler-node1 ~]# parted /dev/sdb
GNU Parted 2.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt
Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? yes
(parted) mkpart primary
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Ignore
(parted) mkpart primary linux-swap
(parted) mkpart logical ext4
(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 2147MB
Sector size (logical/physical): 512B/512B
Partition Table: gptNumber Start End Size File system Name Flags
.4kB 100MB 100MB primary
101MB 201MB 101MB primary
202MB 302MB .6MB logical(parted) quit
Information: You may need to update /etc/fstab.
#查看分区是否立即生效
[root@cobbler-node1 ~]# ls /dev/sdb*
/dev/sdb /dev/sdb1 /dev/sdb2 /dev/sdb3
[root@cobbler-node1 ~]# cat /proc/partitions | grep -w "sdb[0-3]+"
sdb1
sdb2
sdb3
#格式化分区创建文件系统
[root@cobbler-node1 ~]# mkfs.ext4 /dev/sdb3
mke2fs 1.41. (-May-)
Filesystem label=
OS type: Linux
Block size= (log=)
Fragment size= (log=)
Stride= blocks, Stripe width= blocks
inodes, blocks
blocks (5.00%) reserved for the super user
First data block=
Maximum filesystem blocks=
block groups
blocks per group, fragments per group
inodes per group
Superblock backups stored on blocks:
, , , , Writing inode tables: done
Creating journal ( blocks): done
Writing superblocks and filesystem accounting information: doneThis filesystem will be automatically checked every mounts or
days, whichever comes first. Use tune2fs -c or -i to override.
#查看块设备的属性信息
[root@cobbler-node1 ~]# blkid /dev/sdb3
/dev/sdb3: UUID="95f2058c-385e-484b-9f4a-64d62bdd0a98" TYPE="ext4"
#创建挂载目录
[root@cobbler-node1 ~]# mkdir /applog1
#挂载文件系统到相应的目录
[root@cobbler-node1 ~]# mount /dev/sdb3 /applog1
#验证挂载是否成功
[root@cobbler-node1 ~]# df -h | grep "sdb"
/dev/sdb3 92M 5.6M 82M % /applog1
#加载文件系统随开机自动挂载
[root@cobbler-node1 ~]# echo "UUID=95f2058c-385e-484b-9f4a-64d62bdd0a98 /applog1 ext4 defaults 0 0" >> /etc/fstab
[root@cobbler-node1 ~]# tail - /etc/fstab
UUID=95f2058c-385e-484b-9f4a-64d62bdd0a98 /applog1 ext4 defaults

方法二:非交互式创建磁盘分区

parted /dev/sdb mklabel gpt yes  #设置分区表类型为gpt(类型分为两种:msdos与gpt)
parted /dev/sdb mkpart primary Ignore #创建主分区100M(单位默认为MB)
parted /dev/sdb mkpart primary linux-swap #创建swap分区100M
parted /dev/sdb mkpart logical ext4 #创建逻辑分区100M,文件系统为ext4
parted /dev/sdb p #显示创建的分区
parted /dev/sdb rm #删除创建的1号分区
parted /dev/sdb rm #删除创建的2号分区
parted /dev/sdb rm #删除创建的3号分区

6 SWAP分区构建

6.1 使用物理分区构建swap

#创建分区/dev/sdb1
[root@cobbler-node1 ~]# fdisk -cu /dev/sdbCommand (m for help): n
Command action
e extended
p primary partition (-)
p
Partition number (-):
First sector (-, default ):
Using default value
Last sector, +sectors or +size{K,M,G} (-, default ): +1GCommand (m for help): pDisk /dev/sdb: MB, bytes
heads, sectors/track, cylinders, total sectors
Units = sectors of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk identifier: 0x000a3ee6 Device Boot Start End Blocks Id System
/dev/sdb1 LinuxCommand (m for help): w
The partition table has been altered!Calling ioctl() to re-read partition table.
Syncing disks.
#格式化分区类型为swap
[root@cobbler-node1 ~]# mkswap /dev/sdb1
Setting up swapspace version , size = KiB
no label, UUID=546425d3-0a71-4f5b--10dccee357da
[root@cobbler-node1 ~]# free -m
total used free shared buffers cached
Mem:
-/+ buffers/cache:
Swap:
#启用用于分页和交换的设备和文件
[root@cobbler-node1 ~]# swapon /dev/sdb1
[root@cobbler-node1 ~]# free -m
total used free shared buffers cached
Mem:
-/+ buffers/cache:
Swap:
#追加到/etc/fstab开机随系统启动
[root@cobbler-node1 ~]# echo "/dev/sdb1 swap swap defaults 0 0" >> /etc/fstab
#显示正在使用的虚拟交换空间
[root@cobbler-node1 ~]# swapon -s
Filename Type Size Used Priority
/dev/sda2 partition -
/dev/sdb1 partition -

6.2 使用文件构建swap

[root@cobbler-node1 ~]# dd if=/dev/zero of=/tmp/swap bs=10M count=
+ records in
+ records out
bytes (1.0 GB) copied, 31.7965 s, 33.0 MB/s
[root@cobbler-node1 ~]# ls -ldh /tmp/swap
-rw-r--r-- root root 1000M Jun : /tmp/swap
[root@cobbler-node1 ~]# mkswap /tmp/swap
mkswap: /tmp/swap: warning: don't erase bootbits sectors
on whole disk. Use -f to force.
Setting up swapspace version , size = KiB
no label, UUID=ea3fe1f1-895c--9e42-78cab304efd1
[root@cobbler-node1 ~]# free -m
total used free shared buffers cached
Mem:
-/+ buffers/cache:
Swap:
[root@cobbler-node1 ~]# swapon /tmp/swap
[root@cobbler-node1 ~]# free -m
total used free shared buffers cached
Mem:
-/+ buffers/cache:
Swap:
[root@cobbler-node1 ~]# echo "/tmp/swap swap swap defaults 0 0" >> /etc/fstab
#显示正在使用的虚拟交换空间
[root@cobbler-node1 ~]# swapon -s
Filename Type Size Used Priority
/dev/sda2 partition -
/dev/sdb1 partition -
/tmp/swap file -
企业案例场景:
Swap在工作中,特别是java环境,程序写的有问题,会发生内存泄露,可能会被占用,让开发改程序,临时运维加大swap,重启系统

7 磁盘格式化挂载

7.1 磁盘格式化并挂载的操作步骤

#普通ext4文件系统格式化过程
[root@cobbler-node1 ~]# mkfs -t ext4 -b -I /dev/sdb3
mke2fs 1.41. (-May-)
Filesystem label=
OS type: Linux
Block size= (log=)
Fragment size= (log=)
Stride= blocks, Stripe width= blocks
inodes, blocks
blocks (5.00%) reserved for the super user
First data block=
Maximum filesystem blocks=
block group
blocks per group, fragments per group
inodes per groupWriting inode tables: done
Creating journal ( blocks): done
Writing superblocks and filesystem accounting information: doneThis filesystem will be automatically checked every mounts or
days, whichever comes first. Use tune2fs -c or -i to override.
#防止出现上面的告警信息(标黄)
[root@cobbler-node1 ~]# tune2fs -c - /dev/sdb3
tune2fs 1.41. (-May-)
Setting maximal mount count to -
#挂载到相应目录
[root@cobbler-node1 ~]# mount -t ext4 /dev/sdb3 /applog1
#显示挂载的文件系统
[root@cobbler-node1 ~]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 ext4 .7G .3G .1G % /
tmpfs tmpfs 238M 238M % /dev/shm
/dev/sda1 ext4 194M 29M 155M % /boot
/dev/sr0 iso9660 .2G .2G % /mnt
/dev/sdb3 ext4 90M 4.1M 81M % /applog1

7.2 dumpe2fs查看文件系统内部详细信息

# dumpe2fs - dump ext2/ext3/ext4 filesystem information
[root@cobbler-node1 ~]# dumpe2fs /dev/sdb3
dumpe2fs 1.41. (-May-)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: 23d188bf-7b4c-41c1-a33e-dd908926303f
Filesystem magic number: 0xEF53
Filesystem revision #: (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg
dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: (none)
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count:
Block count:
Reserved block count:
Free blocks:
Free inodes:
First block:
Block size:
Fragment size:
Reserved GDT blocks:
Blocks per group:
Fragments per group:
Inodes per group:
Inode blocks per group:
Flex block group size:
Filesystem created: Sun Jun ::
Last mount time: Sun Jun ::
Last write time: Sun Jun ::
Mount count:
Maximum mount count: -
Last checked: Sun Jun ::
Check interval: ( months)
Next check after: Fri Dec ::
Lifetime writes: MB
Reserved blocks uid: (user root)
Reserved blocks gid: (group root)
First inode:
Inode size:
Required extra isize:
Desired extra isize:
Journal inode:
Default directory hash: half_md4
Directory Hash Seed: 89578f2c-49a6--af1d-bd055875100f
Journal backup: inode blocks
Journal features: (none)
Journal size: 4096k
Journal length:
Journal sequence: 0x00000001
Journal start: Group : (Blocks -) [ITABLE_ZEROED]
Checksum 0xeec2, unused inodes
Primary superblock at , Group descriptors at -
Reserved GDT blocks at -
Block bitmap at (+), Inode bitmap at (+)
Inode table at - (+)
free blocks, free inodes, directories, unused inodes
Free blocks: -
Free inodes: -
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,956
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,480
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,327
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,110
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,741
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,776