赞
踩
文章篇幅较长,建议先收藏,防止迷路
文章 | 跳转 |
---|---|
Linux从入门到精通(八)——Linux磁盘管理 | go |
Linux从入门到精通(九)——Linux编程 | go |
Linux从入门到精通(十)——进程管理 | go |
Linux从入门到精通(十一)——计划任务 | go |
Linux从入门到精通(十二)——shell编程 | go |
Ext( Extended file system) :
是为linux核 心所做的第-一个文件系统。采用Unix文件系统 ( UFS )的元数据结构,以克服MINIX文件系 统性能不佳的问题。它是在linux上,第一个利用 虚拟文件系统实现出的文件系统,在linux核心 0.96c版中首次加入支持。
Ext2 :
GNU/Linux 系统中标准的文件系统, 其特点为存取文件的性能极好,对于中小型的文件 更显示出优势,这主要得利于其簇快取层的优良设 计。
ext3 :中采用了日志式的管理机制,它使文件系统; 具有很强的快速恢复能力,并且由于从ext2 转 换到ext3 无须进行格式化,因此,更加推进了 ext3文件系统的大大推广。
Ext4 :
Ext3的改进版,修改了 Ext3 中部分 重要的数据结构,而不仅仅像 Ext3对 Ext2 那样,只是增加了-一个日志功能而已。Ext4可 以提供更佳的性能和可靠性,还有更为丰富的功能;
Btrfs:
它被称为是下一代Linux文件系统。据说它采用了很多先进的文件系统设计,不仅解决了ext2/3的扩展性问题,还让人们看到了下一代文件系统所具有的许多其他特性。
swap文件系统:
该文件系统是 Linux中作为 交换分区使用的。在安装Linux 的时候,交换 分区是必须建立的,并且它所采用的文件系统类型 必须是 swa p 而没有其他选择。
支持的其他类型:
linux文件颜色的含义:蓝色代表目录 绿色代表可执行文件 红色表示压缩文件 浅蓝色表示链接文件 灰 色表示其他文件 红色闪烁表示链接的文件有问题了 黄色表示设备文件:
列出文件系统的整体磁盘使用情况
[root@localhost ~]# df [选项] [目录或文件名]
-a
显示所有文件系统信息,包括系统特有的 /proc、/sysfs 等文件系统;-m
以 MB 为单位显示容量;-k
以 KB 为单位显示容量,默认以 KB 为单位;-h
使用人们习惯的 KB、MB 或 GB 等单位自行显示容量;-T
显示该分区的文件系统名称;-i
不用硬盘容量显示,而是以含有 inode 的数量来显示。【例1】
不使用任何选项的 df 命令,默认会将系统内所有的文件系统信息,以 KB 为单位显示出来。
[root@VM-24-17-centos ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 28K 1.9G 1% /dev/shm tmpfs 1.9G 540K 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/vda1 79G 15G 61G 20% / tmpfs 374M 0 374M 0% /run/user/
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- Filesystem:表示该文件系统位于哪个分区,因此该列显示的是设备名称;
- 1K-blocks:此列表示文件系统的总大小,默认以 KB 为单位;
- Used:表示用掉的硬盘空间大小;
- Available:表示剩余的硬盘空间大小;
- Use%:硬盘空间使用率。如果使用率高达 90% 以上,就需要额外注意,因为容量不足,会严重影响系统的正常运行;
- Mounted on:文件系统的挂载点,也就是硬盘挂载的目录位置。
【例2】
[root@VM-24-17-centos ~]# df -ahT Filesystem Type Size Used Avail Use% Mounted on sysfs sysfs 0 0 0 - /sys proc proc 0 0 0 - /proc devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev securityfs securityfs 0 0 0 - /sys/kernel/security tmpfs tmpfs 1.9G 28K 1.9G 1% /dev/shm devpts devpts 0 0 0 - /dev/pts tmpfs tmpfs 1.9G 540K 1.9G 1% /run tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup cgroup cgroup 0 0 0 - /sys/fs/cgroup/systemd pstore pstore 0 0 0 - /sys/fs/pstore bpf bpf 0 0 0 - /sys/fs/bpf cgroup cgroup 0 0 0 - /sys/fs/cgroup/blkio ....
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
注意,使用 -a 选项,会将很多特殊的文件系统显示出来,这些文件系统包含的大多是系统数据,存在于内存中,不会占用硬盘空间,因此你会看到,它们所占据的硬盘总容量为 0。
列出目录所占空间。
[root@VM-24-17-centos ~]# ls -lh
total 40K
drwxr-xr-x 5 root root 4.0K Oct 17 21:26 goprojects
-rw-r--r-- 1 root root 25K Nov 18 2021 install.sh
drwxr-xr-x 2 root root 4.0K Nov 7 20:58 linuxstudy
drwxr-xr-x 5 root root 4.0K May 4 2022 mysql
需要注意的是,使用"ls -lh"命令是可以看到文件的大小的。但是大家会发现,在使用"ls -lh"命令査看目录大小时,目录的大小多数是 4KB,这是因为目录下的子目录名和子文件名是保存到父目录的 block(默认大小为 4KB)中的,如果父目录下的子目录和子文件并不多,一个 block 就能放下,那么这个父目录就只占用了一个 block 大小。
大家可以将其想象成图书馆的书籍目录和实际书籍。如果我们用"ls-lh"命令査看,则只能看到这些书籍占用了 1 页纸的书籍目录,但是实际书籍到底有多少是看不到的,哪怕它堆满了几个房间。
但是我们在统计目录时,不是想看父目录下的子目录名和子文件名到底占用了多少空间,而是想看父目录下的子目录和子文件的总磁盘占用量大小,这时就需要使用 du 命令才能统计目录的真正磁盘占用量大小。
du 命令的格式如下:
[root@localhost ~]# du [选项] [目录或文件名]
选项:
【例1】
统计当前目录的总磁盘占用量大小,同时会统计当前目录下所有子目录的磁盘占用量大小,不统计子文件磁盘占用量的大小。默认单位为KB。
[root@VM-24-17-centos linuxstudy]# du -h 4.0K ./a # 统计每个子目录的大小 4.0K ./b 72K . # 统计当前目录总大小
- 1
- 2
- 3
- 4
【例2】
统计当前目录的总大小,同时会统计当前目录下所有子文件和子目录磁盘占用量的大小。默认单位为 KB
[root@VM-24-17-centos linuxstudy]# du -ha 4.0K ./.test.txt.swo 24K ./test1.log 0 ./a/testa.txt 4.0K ./a 24K ./test.log 4.0K ./.test.txt.swp 0 ./b/testb.txt 4.0K ./b 4.0K ./test.txt 72K .
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
【例3】
只统计磁盘占用量总的大小,同时使用习惯单位显示
[root@VM-24-17-centos linuxstudy]# du -sh 72K .
- 1
- 2
给硬盘分区
我们在安装操作系统的过程中已经对系统硬盘进行了分区,但如果新添加了一块硬盘,想要正常使用,难道需要重新安装操作系统才可以分区吗?
当然不是,在 Linux
中有专门的分区命令 fdisk
和 parted
。其中 fdisk 命令较为常用,但不支持大于 2TB 的分区;如果需要支持大于 2TB 的分区,则需要使用 parted
命令,当然 parted
命令也能分配较小的分区。我们先来看看如何使用 fdisk
命令进行分区。
fdisk 命令的格式如下:
[root@localhost ~]# fdisk [~l] 设备文件名
-l
选项会将设备名称对应的设备的所有分区信息,显示后退出,不指定设备时显示系统能够识别的所有设备。
不使用参数时,则进入fdisk命令的交互界面,可按提示进行操作。
注意: fdisk 以设备名称作为参数,而不是文件系统名称。
一直下一步,最后重启虚拟机即可。
注意,千万不要在当前的硬盘上尝试使用 fdisk
,这会完整删除整个系统,一定要再找一块硬盘,或者使用虚拟机。这里给大家举个例子:
# 查询本机可以识别的硬盘和分区
[root@hyy ~]# fdisk -l
Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors # 硬盘文件名和硬盘大小
Units = sectors of 1 * 512 = 512 bytes # 每个柱面的大小
Sector size (logical/physical): 512 bytes / 512 bytes # 每个扇区的大小
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000058a3
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 616447 307200 83 Linux
/dev/sda2 616448 4810751 2097152 82 Linux swap / Solaris
/dev/sda3 4810752 41943039 18566144 83 Linux
# 第二个硬盘识别,这个硬盘的信息
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
如果这个分区并没有占满整块硬盘,就会提示 “Partition 1 does not end on cyl inder boundary”,表示第一个分区没有到硬盘的结束柱面。大家发现了吗?/dev/sda 已经分配完了分区,没有空闲空间了。而第二块硬盘 /dev/sdb 已经可以被识别了,但是没有可分区。
我们以硬盘 /dev/sdb 为例来做练习,命令如下:
对设备实施分区操作,进入交互界面
执行命令 fdisk -l查看是否添加了新设备
[root@hyy ~]# fdisk -l
Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000058a3
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 616447 307200 83 Linux
/dev/sda2 616448 4810751 2097152 82 Linux swap / Solaris
/dev/sda3 4810752 41943039 18566144 83 Linux
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
可以看到刚刚新增的Disk /dev/sdb
执行 fdisk /dev/sdb
fdisk /dev/sdb
在显示出的界面中,“m”查看帮助菜单
d 删除分区
n 添加新分区
p :primary主分区
输入分区号—> 输入起始柱面号—> 输入结束柱面号(或者+size{K,M,G})
e :extend 扩展分区
l :逻辑分区(创建扩展分区之后才出现)
创建了扩展分区之后,再创建分区,提示命令会发生改变,出现逻辑分区(分区号从5):
注意:
- Linux系统主分区最多4个,多数情况下采用3个主分区+扩展分区。
- 扩展分区最多只能有一个(os限制)
- 能够被格式化后作为数据访问的分区为主分区与逻辑分区。扩展分区无法格式化。
- 逻辑分区的数量依据操作系统而不同,在linux 系统中,
IDE硬盘
最多有59个逻辑分区 (5- 63号)SATA硬盘
最多11个逻辑分区( 5- 15 )
p 打印分区表
q 退出而不保存更改
w 将表写入磁盘并退出
格式化分区(为分区写入文件系统)
Mkfs
命令的格式如下:
[root@hyy ~]# mkfs [-t 文件系统格式] 分区设备文件名
我们建立了 /dev/sdb1(主分区)、/dev/sdb2(扩展分区)、/dev/sdb5(逻辑分区)和 /dev/sdb6(逻辑分区)这几个分区,其中 /dev/sdb2 不能被格式化,剩余的三个分区都需要格式化之后使用。
这里我们以格式化 /dev/sdb1 分区作为演示,其余分区的格式化方法一样。
格式化 /dev/sdb1 分区的执行命令如下:
# 初始化分区,为主分区写入ext3的文件系统
[root@hyy ~]# mkfs -t ext3 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label= # 这里指的是卷标名,我们没有设置卷标
OS type: Linux
Block size=4096 (log=2) # block 的大小配置为 4K
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621184 blocks # 由此配置决定的inode/block数量
131059 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2684354560
80 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
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
# 这样就创建起来所需要的 Ext3 文件系统了!简单明了!
挂载命令。
所有的硬件设备必须挂载之后才能使用,只不过,有些硬件设备(比如硬盘分区)在每次系统启动时会自动挂载,而有些(比如 U 盘、光盘)则需要手动进行挂载。
什么叫挂载:
Linux 系统中 “一切皆文件”,所有文件都放置在以根目录为树根的树形目录结构中。在 Linux 看来,任何硬件设备也都是文件,它们各有自己的一套文件系统(文件目录结构)。
因此产生的问题是,当在 Linux 系统中使用这些硬件设备时,只有将Linux本身的文件目录与硬件设备的文件目录合二为一,硬件设备才能为我们所用。合二为一的过程称为“挂载”。
如果不挂载,通过Linux系统中的图形界面系统可以查看找到硬件设备,但命令行方式无法找到。
挂载,指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录(最好是空目录),访问此目录就等同于访问设备文件。
纠正一个误区,并不是根目录下任何一个目录都可以作为挂载点,由于挂载操作会使得原有目录中文件被隐藏,因此根目录以及系统原有目录都不要作为挂载点,会造成系统异常甚至崩溃,挂载点最好是新建的空目录。
举个例子,我们想通过命令行访问某个 U 盘中的数据,图 1 所示为 U 盘文件目录结构和 Linux 系统中的文件目录结构。
图 1 中可以看到,目前 U 盘和 Linux 系统文件分属两个文件系统,还无法使用命令行找到 U 盘文件,需要将两个文件系统进行挂载。
接下来,我们在根目录下新建一个目录 /sdb-u,通过挂载命令将 U 盘文件系统挂载到此目录,挂载效果如图 2 所示。
可以看到,U 盘文件系统已经成为 Linux 文件系统目录的一部分,此时访问 /sdb-u/ 就等同于访问 U 盘。
前面讲过,根目录下的
/dev/
目录文件负责所有的硬件设备文件,事实上,当 U 盘插入 Linux 后,系统也确实会给 U 盘分配一个目录文件(比如 sdb1),就位于 /dev/ 目录下(/dev/sdb1),但无法通过 /dev/sdb1/ 直接访问 U 盘数据,访问此目录只会提供给你此设备的一些基本信息(比如容量)。总之,Linux 系统使用任何硬件设备,都必须将设备文件与已有目录文件进行挂载。
通过学习 Linux 文件系统,我们可以对挂载的含义进行引申,挂载指的是将硬件设备的文件系统和 Linux 系统中的文件系统,通过指定目录(作为挂载点)进行关联。而要将文件系统挂载到 Linux 系统上,就需要使用 mount 挂载命令。
mount 命令的常用格式有以下几种:
root@localhost ~]# mount [-l]
单纯使用 mount 命令,会显示出系统中已挂载的设备信息,使用 -l 选项,会额外显示出卷标名称.
[root@localhost ~]# mount -a
-a
选项的含义是自动检查 /etc/fstab
文件中有无疏漏被挂载的设备文件,如果有,则进行自动挂载操作。
这里简单介绍一下
/etc/fstab
文件,此文件是自动挂载文件,系统开机时会主动读取/etc/fstab
这个文件中的内容,根据该文件的配置,系统会自动挂载指定设备。有关自动挂载(修改此文件)的具体介绍,会在后续文章中讲解。
[root@localhost ~]# mount [-t 系统类型] [-L 卷标名] [-o 特殊选项] [-n] 设备文件名 挂载点
各选项的含义分别是:
【例1】
查看系统中已经挂载的文件系统,注意有虚拟文件系统
[root@localhost ~]# mount /dev/sda3 on / type ext4 (rw) # 含义是,将 /dev/sda3 分区挂载到了 / 目录上,文件系统是 ext4,具有读写权限 proc on /proc type proc (rw) sysfe on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw, gid=5, mode=620) /dev/sda1 on /boot type ext4 (rw) ....
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
【例2】
修改特殊权限。通过例 1 我们查看到,/boot 分区已经被挂载了,而且采用的是 defaults 选项。这里我们重新挂载分区,并采用 noexec 权限禁止执行文件执行,看看会出现什么情况(注意不要用 / 分区做实验,否则系统命令也就不能执行了)。
重新挂载 /boot 分区,并使用 noexec 权限
[root@localhost ~]# mount -o remount noexec /boot [root@localhost sh]# cd /boot #写一个 shell 脚本,看是否会运行 [root@localhost boot]#vi hello.sh #!/bin/bash echo "hello!!" [root@localhost boot]# chmod 755 hello.sh [root@localhost boot]# ./hello.sh -bash:./hello.sh:权限不够 #虽然赋予了hello.sh执行权限,但是仍然无法执行 [root@localhost boot]# mount -o remount exec /boot #记得改回来,否则会影响系统启动
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
对于特殊选项的修改,除非特殊场景下需要,否则不建议大家随意修改,非常容易造成系统出现问题,而且还找不到问题的根源。
【例3】
挂载分区。
# 将刚才创建的三个分区(1主,2逻辑)分别挂载到 /diskstudy目录下的web、bak、test目录下 [root@hyy diskstudy]# mount /dev/sdb1 ./web [root@hyy diskstudy]# mount /dev/sdb5 ./bak [root@hyy diskstudy]# mount /dev/sdb6 ./test
- 1
- 2
- 3
- 4
可能有人会想,为什么使用 Linux 系统的硬盘分区这么麻烦,而不能像 Windows 系统那样,硬盘安装上就可以使用?
其实,硬盘分区(设备)挂载和卸载(使用 umount 命令)的概念源自 UNIX,UNIX 系统一般是作为服务器使用的,系统安全非常重要,特别是在网络上,最简单有效的方法就是“不使用的硬盘分区(设备)不挂载”,因为没有挂载的硬盘分区是无法访问的,这样系统也就更安全了。
另外,这样也可以减少挂载的硬盘分区数量,相应地,也就可以减少系统维护文件的规模,当然也就减少了系统的开销,即提高了系统的效率。
查看是否挂载:
[root@hyy diskstudy]# cat /etc/mtab
....
/dev/sdb1 /diskstudy/web ext3 rw,seclabel,relatime,data=ordered 0 0
/dev/sdb5 /diskstudy/bak ext2 rw,seclabel,relatime 0 0
/dev/sdb6 /diskstudy/test ext2 rw,seclabel,relatime 0 0
那么重新启动虚拟机,这三个分区是否还可以使用?
不可以,系统开机时会自动读取/etc/fstab
这个文件中的内容,根据该文件的配置,系统会自动挂载指定设备。
[root@hyy diskstudy]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Jun 1 00:21:21 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=47a5bc34-1592-4c26-9409-73f14d3770e9 / xfs defaults 0 0
UUID=dffed75c-4132-4782-893a-e282d515e2f7 /boot xfs defaults 0 0
UUID=4b6a9d5f-1029-4c6b-b443-98150efe360c swap swap defaults 0 0
如果你想要实现这三个分区,启动的时候自动挂载,需要修改/etc/fstab
[root@hyy diskstudy]# vi /etc/fstab
....
# 磁盘管理学习
# 设备名 挂载目录 文件系统 选项 备份 检测
/dev/sdb1 /web ext3 defaults 0 0
/dev/sdb5 /bak ext2 defaults 0 0
/dev/sdb6 /test ext2 defaults 0 0
这样启动的 时候就会自动挂载了。
针对某个用户,限制其对某个分区的使用大小,防止用户创建过大的文件,造成空间不足。
usrquota
:针对单个用户进行空间限制grpquota
:针对用户组进行空间限制quotacheck
:自检测并创建用户(组)的磁盘配额文件。
quotaon
:开启限额功能edquota 用户名
: 针对某个用户限额给ls用户和ww用户进行磁盘配额,步骤:
修改要限制使用分区 的挂载选项,使其具备限额功能。
[root@hyy diskstudy]# mount -o remount,usrquota ./web
修改后查看/etc/mtab
,可以看到多了usrquota
:
[root@hyy diskstudy]# cat /etc/mtab
...
/dev/sdb1 /diskstudy/web ext3 rw,seclabel,relatime,quota,usrquota,data=ordered 0 0
...
此时还是临时挂载,上面说了,如果需要自动挂载,需要修改
/etc/fstab
文件:[root@hyy diskstudy]# vi /etc/fstab /dev/sdb1 /web ext3 defaults,usrquota 0 0
- 1
- 2
生成一个磁盘配额文件:
[root@hyy diskstudy]# quotacheck -acuv
/etc/mtab
文件所有挂载的文件系统。执行后发现报错,没有生成成功,需要:
[root@hyy diskstudy]# setenforce 0
[root@hyy diskstudy]# quotacheck -acuv
quotacheck: Your kernel probably supports journaled quota but you are not using it. Consider switching to journaled quota to avoid running quotacheck after an unclean shutdown.
quotacheck: Scanning /dev/sdb1 [/diskstudy/web] done
quotacheck: Old group file name could not been determined. Usage will not be subtracted.
quotacheck: Checked 3 directories and 1 files
[root@hyy diskstudy]# ls web
aquota.user lost+found
开启磁盘限额的功能,第一步是使其具备该功能而非开启。
[root@hyy diskstudy]# quotaon ./web
针对某个用户进行限制:
[root@hyy diskstudy]# edquota #ls #用户名
# 进入一个vi界面,限制ls用户,限额20M
Disk quotas for user ls (uid 1003):
Filesystem blocks soft hard inodes soft hard
/dev/sdb1 0 0 20480 0 0 0
查看用户对应限额:
用户登录之后,使用quota
命令查看限额
或者
使用root用户:
repquota ./web
创建指定大小文件(在./web目录下):
[root@hyy diskstudy]# dd if=/dev/zero of=./test.txt bs=1024 count=51200
+ bs=1024 1K
+ count 多少个bs
如果需要对其他用户实施同样的 限制,无需重新走一遍:
edquota -p 已有限制用户 待限制用户
umount 命令用于卸载已经挂载的硬件设备,该命令的基本格式如下:
[root@localhost ~]# umount 设备文件名或挂载点
注意,卸载命令后面既可以加设备文件名,也可以加挂载点,不过只能二选一,比如:
[root@localhost ~]# umount /dev/sdb6 # 使用设备名卸载
[root@localhost ~]# umount /diskstudy/test # 使用挂载点卸载
另外,我们在卸载时有可能会出现以下情况:
[root@localhost ~]# cd /diskstudy/test # 进入sdb6分区挂载目录
[root@localhost cdrom]# umount /diskstudy/test
umount: /diskstudy/test: device is busy.
#报错,设备正忙
这种报错是因为我们已经进入了挂载点,因此,如果要卸载某硬件设备,在执行 umount 命令之前,用户须退出挂载目录。
卸载硬件设备成功与否,除了执行 umount 命令不报错之外,还可以使用 df 命令或 mount -l
来查看目标设备是否还挂载在系统中。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。