Linux磁盘管理进阶-创新互联
Linux磁盘管理进阶
dd命令
循化网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联于2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联。SWAP与移动介质
磁盘配额
RAID
dd命令
dd - convert and copy a file Copy a file, converting and formatting according to the operands.
dd命令基本用法:
ddif=/PATH/FROM/SRC of=/PATH/TO/DEST bs=#:block size, 复制单元大小count=#:复制多少个bs skip=blocks从开头忽略blocks个ibs大小的块 seek=blocks从开头忽略blocks个obs大小的块
常用选项:
conv=conversion[,conversion...] 用指定的参数转换文件。 lcase 把大写字符转换为小写字符 ucase 把小写字符转换为大写字符 swab 交换输入的每对字节 noerror 出错时不停止 notrunc 不截短输出文件 sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐
使用dd命令对磁盘进行操作进,最好使用块设备文件;
使用示例:
创建两个文件:
[root@centos7 ~]#echo {1..9} |tr -d [:space:] > f1 [root@centos7 ~]#echo {a..z} |tr -d [:space:] > f2 [root@centos7 ~]#cat f1 123456789[root@centos7 ~]# [root@centos7 ~]#cat f2 abcdefghijklmnopqrstuvwxyz[root@centos7 ~]# [root@centos7 ~]# [root@centos7 ~]#dd if=f1 of=f2 bs=1 count=3 3+0 records in 3+0 records out 3 bytes (3 B) copied, 0.00136469 s, 2.2 kB/s [root@centos7 ~]#cat f2 123[root@centos7 ~]# # 从f1中复制了3字节的内容覆盖了f2 [root@centos7 ~]#dd if=f1 of=f2 bs=1 count=3 skip=3 seek=3 3+0 records in 3+0 records out 3 bytes (3 B) copied, 0.000396399 s, 7.6 kB/s [root@centos7 ~]#cat f2 abc456[root@centos7 ~]# # 从f1中跳过了3字节并复制其后的3字节插入到f2的3字节后面 [root@centos7 ~]#dd if=f1 of=f2 bs=1 count=3 skip=3 seek=3 conv=notrunc # 不截断f2后面的内容 3+0 records in 3+0 records out3 bytes (3 B) copied, 0.00277328 s, 1.1 kB/s [root@centos7 ~]#cat f2 abc456ghijklmnopqrstuvwxyz[root@centos7 ~]#
备份MBR:
[root@centos7 ~]#dd if=/dev/sda of=/testdir/sda.mbr bs=512 count=1 1+0 records in 1+0 records out 512 bytes (512 B) copied, 0.000380182 s, 1.3 MB/s [root@centos7 ~]#
磁盘拷贝:
[root@centos7 ~]#dd if=/dev/sda of=/dev/sdb
破坏MBR中的bootloader:
[root@centos7 ~]#dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446 1+0 records in 1+0 records out 64 bytes (64 B) copied, 0.00180836 s, 35.4 kB/s [root@centos7 ~]#
破坏MBR中的分区表:
[root@centos7 ~]#dd if=/dev/zero of=/dev/sda bs=1 count=64 skip=446 seek=446 64+0 records in 64+0 records out 64 bytes (64 B) copied, 0.00589307 s, 10.9 kB/s [root@centos7 ~]#
可见,sda的分区已经被破坏!
修复sda分区表:
[root@centos7 ~]#dd if=/testdir/sda.mbr of=/dev/sda bs=512 count=1 1+0 records in 1+0 records out 512 bytes (512 B) copied, 0.000348826 s, 1.5 MB/s [root@centos7 ~]#partprobe # 同步分区表 [root@centos7 ~]#
sda被成功修复!
备份:
dd if=/dev/sdx of=/dev/sdy 将本地的/dev/sdx整盘备份到/dev/sdy dd if=/dev/sdx of=/path/to/p_w_picpath 将/dev/sdx全盘数据备份到指定路径的p_w_picpath文件 dd if=/dev/sdx | gzip >/path/to/p_w_picpath.gz 备份/dev/sdx全盘数据,并利用gzip工具进行压缩,保存到指定路径
[root@centos7 ~]#dd if=/dev/sdb1 |gzip > /testdir/p_w_picpath.gz 409600+0 records in 409600+0 records out 209715200 bytes (210 MB) copied, 9.02236 s, 23.2 MB/s [root@centos7 ~]#ll /testdir/p_w_picpath.gz -rw-r--r--. 1 root root 139129150 Aug 29 08:16 /testdir/p_w_picpath.gz [root@centos7 ~]#
恢复:
dd if=/path/to/p_w_picpath of=/dev/sdx 将备份文件恢复到指定盘 gzip -dc /path/to/p_w_picpath.gz | dd of=/dev/sdx将压缩的备份文件恢复到指定盘
[root@centos7 ~]#gzip -cd /testdir/p_w_picpath.gz |dd of=/dev/sdc 409600+0 records in 409600+0 records out 209715200 bytes (210 MB) copied, 6.16743 s, 34.0 MB/s [root@centos7 ~]#
拷贝内存资料到硬盘 dd if=/dev/mem of=/root/mem.bin bs=1024 将内存里的数据拷贝到root目录下的mem.bin文件 从光盘拷贝iso镜像 dd if=/dev/cdrom of=/root/cd.iso 拷贝光盘数据到root文件夹下,并保存为cd.iso文件 销毁磁盘数据 dd if=/dev/urandom of=/dev/sda1 利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。执行此操作以后,/dev/sda1将无法挂载,创建和拷贝操作无法执行。
得到最恰当的block size: 通过比较dd指令输出中所显示的命令执行时间,即可确定系统最佳的block size大小
测试硬盘读写速度:通过上两个命令输出的执行时间,可以计算出测试硬盘的读/写速度
[root@centos7 ~]#dd if=/root/1Gb.file bs=64k |dd of=/dev/null [root@centos7 ~]#dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
修复磁盘
[root@centos7 ~]#dd if=/dev/sda of=/dev/sda
当硬盘较长时间(比如1,2年)放置不使用后,磁盘上会产生消磁点。当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数据起死回生。且这个过程是安全,高效的。
系统配额
SWAP
交换分区是系统RAM(裸设备)的补充,涉及到的基本命令有:mkswap, swapon, swapoff, 其优先级范围为0-32767,如果用户未指定swap的优先级,内核会给swap指定一个优先级,此值从-1开始,每加一个优先级递减一;用户指定的优先级(是正数)永远高于核心缺省指定的优先级(是负数);swap分区即可以是一个整个硬盘,也可以是一个分区(要指定分区类型)或者是将一个文件创建成swap分区。
mkswap - set up a Linux swap area swapon, swapoff - enable/disable devices and files for paging and swapping
基本设置包括:
创建交换分区或者文件
使用mkswap写入特殊签名
在/etc/fstab文件中添加适当的条目
使用swapon -a 激活交换空间
即:swap分区---> 格式化---> 挂载--> 激活
创建一个swap分区:
[root@centos7 ~]#dd if=/dev/zero of=/swapfile bs=1M count=1024 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB) copied, 1.75694 s, 611 MB/s [root@centos7 ~]#ls
格式化swap分区:
[root@centos7 ~]#mkswap /dev/sdc1Setting up swapspace version 1, size = 10485756 KiB no label, UUID=a0ac8c08-23b9-4672-bee3-449e949cea8c [root@centos7 ~]#mkswap /swapfile Setting up swapspace version 1, size = 1048572 KiB no label, UUID=4659cff5-5718-4119-a70e-6283ca443509 [root@centos7 ~]#
写入/etc/fstab
[root@centos7 /]#swapon -a # 激活/etc/fstab中的swap类型 [root@centos7 /]#swapon -s Filename Type Size Used Priority /dev/sdc1 partition 10485756 0 10 /swapfile file 1048572 0 -1
由此,你当然可以想到,mkfs命令应该把一个文件“做成”普通分区,并且挂载之:
[root@centos7 ~]#dd if=/dev/zero of=/testdir/partfile bs=1M count=1 1+0 records in 1+0 records out 1048576 bytes (1.0 MB) copied, 0.00416736 s, 252 MB/s [root@centos7 ~]#mkfs.ext4 /testdir/partfile # mkfs.xfs不行 [root@centos7 ~]#blkid /testdir/partfile /testdir/partfile: UUID="e925d5a7-6def-430c-99e0-c4dc966caadf" TYPE="ext4" [root@centos7 ~]# [root@centos7 ~]#mkdir /testdir/partfile [root@centos7 ~]#mount -a [root@centos7 ~]#mount |grep /testdir/ /testdir/partfile on /mnt/partfile type ext4 (rw,relatime,seclabel) [root@centos7 ~]# [root@centos7 ~]#cd /mnt/partfile/ [root@centos7 /mnt/partfile]#ls lost+found [root@centos7 /mnt/partfile]#
移动介质
所有的移动介质要想被内核认可,必须得挂载,而挂载意味着使外来的文件系统看起来如同是主目录树的一部分,且必须要遵守:访问前、介质必须被挂载;摘除时,介质必须被卸载。
按照默认设置,非根用户只能挂载某些设备(光盘、DVD、USB等等), 且挂载点通常在/media 或/mnt下。
如何使用光盘:
eject命令卸载或弹出磁盘,刻录光盘可用以下命令:
wodim–v –eject centos.iso
创建IOS文件可用以下命令:
cp/dev/cdrom /root/centos7.isomkisofs -r -o /root/etc.iso /etc
手工挂载
mount /dev/cdrom/mnt/
那如何在/etc/fstab文件里面挂载iso文件呢?如何把普通文件也挂载到一个目录上呢?
磁盘配额
所谓磁盘配额,就是超级用户给普通用户分配一定的磁盘空间,以防止普通用户占用大量的磁盘空间; 磁盘配额是在内核中执行,以文件系统为单位启用,可以做到对不同的组或用户制定不同的策略,且根据块或节点进行限制;另外,磁盘配额的限制分别软限制(soft limit)与硬限制(hatd limit),软限制就是达到一定磁盘额度后给予警告,而硬限制就是非常强硬地限制你的所作所为,除了建立空文件和空目录(提前是你的节点数没达到上限,即还有空留的inode。
磁盘配额的常用命令:
usrquota: 启用用户配额 grpquota:启用组配额 noquota: 不启用配额 quotacheck, quotaon, quotaoff, repquota
实现磁盘配额主要有以下五个步骤:
1.启用配置挂载选项 vim /etc/fstab usrquota,grpquota2. 创建配额数据库 mount -o remount /dev/sdb1 quotacheck -cug /home setenforce 03. 启用数据库 quotaon /home4. 配置配额项 edquota liansir edquota -p liansir shitou setquota tom 100000 150000 0 0 /home5.测试 quota liansir repquota /home
硬盘配额/home目录
在Linux中,磁盘配额是针对分区进行的,而不是硬盘,即磁盘配额是以文件系统为单位,在下面的试验中,我们将对/home目录进行硬盘配额,需要让home独立分区,但是现在home不是独立分区是和根一起的,如果想要实现就需要在根上做磁盘配额,但是这样是不合理的。需要把home独立到一个分区。
所以,此时我们需要完成的一项工作就是把/home迁移到五个独立的文件系统。
分区、格式化、挂载一步不能少:
[root@centos7 ~]#mkfs.ext4 /dev/sdb3 -L /home # 设其卷标为/home [root@centos7 ~]#blkid /dev/sdb3 /dev/sdb3: LABEL="/home" UUID="e18fa7a2-d436-4bd5-bfdb-453d0af53fb6" TYPE="ext4" [root@centos7 ~]# [root@centos7 ~]#mkdir /mnt/home [root@centos7 ~]#mount /dev/sdb3 /mnt/home # 新设备必须挂载才能使用
接下来,还存在一个问题,就是把/home下的数据迁移到新分区/dev/sdb3上面,复制或移动都可以,但要注意权限不要被改变!
挂载到/home目录,注意/home目录下数据的迁移;所以/dev/sdb3不是一次到位挂载到/home,而是先挂载到了一个其它的空目录,待完成数据迁移后再挂载到/home。最后取消之前的挂载。注:在centos 7上只会显示最后一次挂载。
磁盘配额的准备工作至此结束!如果是对一个普通的空目录进行硬盘配额的话也就没有数据迁移这回事了。
下面正式磁盘配额:
初始化:在/etc/fstab配置文件里面写入分区挂载选项:usrquota, grpquota;初始化数据库:checkquota, 注意初始化磁盘配额数据库前可能需要重新挂载
[root@centos7 ~]#mount -o remount /home [root@centos7 ~]#quotacheck -cug /home
[root@centos7 /home]#file aquota.group aquota.user #这两个文件是数据库的二进制文件,而非文本文件 aquota.group: data aquota.user: data [root@centos7 /home]#
注:在centos 6上面会提示权限不允许,需要关闭SELinux,setenforce 0.
启用数据库:
[root@centos7 ~]#quotaon /home [root@centos7 ~]#quotaon -p /home group quota on /home (/dev/sdb3) is on user quota on /home (/dev/sdb3) is on [root@centos7 ~]#
配置用户的磁盘配额
[root@centos7 ~]#edquota liansir
直接原处修改:
切换到普通用户的家目录,测试
测试成功!
用户调查:查看特定用户的磁盘配额情况
[root@centos7 ~]#quota liansir Disk quotas for user liansir (uid 1000): Filesystem blocks quota limit grace files quota limit grace /dev/sdb3 102400* 80000 102400 6days 133 0 0
配额概述:查看指定分区的磁盘配额情况
[root@centos7 ~]#repquota /home*** Report for user quotas on device /dev/sdb3 Block grace time: 7days; Inode grace time: 7days Block limits File limits User used soft hard grace used soft hard grace ---------------------------------------------------------------------- root -- 20 0 0 2 0 0 liansir +- 102400 80000 102400 6days 133 0 0 hacker -- 52 0 0 13 0 0 xue -- 32 0 0 8 0 0 [root@centos7 ~]#
我们看到,liansir用户是有磁盘配额了,现在如果要把hacker用户的磁盘配额设置成与liansir一样,我们此时只是一条命令搞定!edquata -p
[root@centos7 ~]#edquota -p liansir hacker [root@centos7 ~]#
当然,我们还可以在命令行里面直接设置用户的磁盘配额:
[root@centos7 ~]#setquota xue 100000 200000 0 0 /home #注意要指定分区 [root@centos7 ~]#
RAID
RAID (Redundant Arrays of Independent Disks), 即独立冗余磁盘阵列,其重要技术是同位检查(Parity Check), 在多块硬盘组成的阵列中任意一个硬盘故障时,仍可读出数据,在数据重构时,将数据经计算后重新置入新硬盘中。
磁盘阵列其样式有三种,一是外接式磁盘阵列柜、二是内接式磁盘阵列卡,三是利用软件来仿真。外接式磁盘阵列柜最常被使用大型服务器上,具可热交换(Hot Swap)的特性;内接式磁盘阵列卡,价格相对便宜,需要较高的安装技术,硬件阵列能够提供在线扩容、动态修改阵列级别、自动数据恢复、驱动器漫游、超高速缓冲等功能;软件仿真的方式,是指通过操作系统自身提供的磁盘管理功能将连接的普通SCSI卡上的多块硬盘配置成逻辑盘,组成阵列。其中,前两者称为硬RAID,软件仿真称为软RAID.
RAID是有级别的,本文以软RAID为例,且RAID级别之间可以按需组合;配置RAID时的主要命令为mdadm, 且内核中提供有md模块(multi devices),RAID设备可命名为/dev/md0、/dev/md1、/dev/md2、/dev/md3等。
mdadm
mdadm - manage MD devices aka Linux Software RAID mdadm [mode][options] MODES mdadm has several major modes of operation: -A, --assemble Assemble a pre-existing array. -B, --build Build a legacy array without superblocks. -C, --create Create a new array. -F, --follow, --monitor Select Monitor mode. -G, --grow Change the size or shape of an active array. 即: 模式: 创建:-C 装配: -A 监控: -F 管理:-f, -r, -a
接下来看看RAID的主要级别:
RAID 0:条带卷,strip
RAID 0最简单的实现方式就是把N块同样的硬盘用硬件的形式通过智能磁盘控制器或用操作系统中的磁盘驱动程序以软件的方式串联在一起创建一个大的卷集。只需要2块以上的硬盘即可,无冗余或错误修复能力,实现成本是最低,大的缺点在于任何一块硬盘出现故障,整个系统将会受到破坏,可靠性仅为单独一块硬盘的1/N。所以,RAID 0一般只是在那些对数据安全性要求不高的情况下才被人们使用。
RAID 1:镜像卷,mirror
RAID 1称为磁盘镜像,原理是把一个磁盘的数据镜像到另一个磁盘上,也就是说数据在写入一块磁盘的同时,会在另一块闲置的磁盘上生成镜像文件。具备很好的磁盘冗余能力,但磁盘利用率为50%,RAID 1多用在保存关键性的重要数据的场合。
RAID 5: 带奇偶校验的条带机
RAID 5的奇偶校验码存在于所有磁盘上,其中的p0代表第0带区的奇偶校验值,其它亦然,对于RAID 5来说,大部分数据传输只对一块磁盘操作,可进行并行操作。在RAID 5中有“写损失”,即每一次写操作,将产生四个实际的读/写操作,其中两次读旧的数据及奇偶信息,两次写新的数据及奇偶信息。
RAID 01
RAID 01是RAID0与RAID1的结合体,数据除分布在多个盘上外,每个盘都有其物理镜像盘,提供全冗余能力,允许一个以下磁盘故障,而不影响数据可用性,并具有快速读/写能力。RAID 01要在磁盘镜像中建立带区集至少4个硬盘。
RAID 10
RAID 10是一个带区结构加一个镜象结构,可以相互补充,达到既高效又高速的目的。主要用于数据容量不大,但要求速度和差错控制的数据库中。
注:RAID级别图片来自网络。
介绍完RAID的主要级别,我们再来看看mdadm具体的模式命令吧!
-C: 创建模式 -n #: 使用#个块设备来创建此RAID; -l #:指明要创建的RAID的级别; -a {yes|no}:自动创建目标RAID设备的设备文件; -c CHUNK_SIZE: 指明块大小; -x #: 指明空闲盘的个数; -D:显示raid的详细信息; mdadm-D /dev/md# 管理模式: -f: 标记指定磁盘为损坏 -a: 添加磁盘 -r: 移除磁盘观察md的状态: cat /proc/mdstat 停止md设备: mdstat -S DVICE
OK,现在我们来实现一个RAID 5, 4个RAID盘,1个备用盘,总共5个盘。
我们准备四个硬盘,并都创建一个大小为10G的分区:
sdb 8:16 0 20G 0 disk └─sdb1 8:17 0 10G 0 part sdd 8:48 0 20G 0 disk └─sdd1 8:49 0 10G 0 part sdc 8:32 0 20G 0 disk └─sdc1 8:33 0 10G 0 part sde 8:64 0 20G 0 disk └─sde1 8:65 0 10G 0 part sdf 8:80 0 20G 0 disk └─sdf1 8:81 0 10G 0 part [root@centos6 ~]#
创建RAID: /dev/md0
[root@centos6 ~]#mdadm -C /dev/md0 -l 5 -n 4 -x 1 /dev/sd{b,d,c,e,f}1 mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started. [root@centos6 ~]#
查看:
[root@centos6 ~]#ll /dev/md0 brw-rw----. 1 root disk 9, 0 Sep 2 20:17 /dev/md0 [root@centos6 ~]#cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] md0 : active raid5 sde1[5] sdf1[4](S) sdc1[2] sdd1[1] sdb1[0] 31446528 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU] unused devices:[root@centos6 ~]#
格式化RAID
[root@centos6 ~]#mkfs.ext4 /dev/md0
查看:
[root@centos6 ~]#blkid /dev/md0 /dev/md0: UUID="0ea747b9-c98e-47fd-b08d-fd346ecbd654" TYPE="ext4" [root@centos6 ~]#
挂载
[root@centos6 ~]#mkdir /mnt/md0 [root@centos6 ~]#mount -a
查看:
[root@centos6 ~]#mount |grep /dev/md0 /dev/md0 on /mnt/md0 type ext4 (rw) [root@centos6 ~]#
测试
[root@centos6 ~]#cd /mnt/md0 [root@centos6 /mnt/md0]#touch f1 # 可创建文件 [root@centos6 /mnt/md0]# [root@centos6 ~]#mdadm /dev/md0 -f /dev/sdb1 # 损坏 /dev/sd1mdadm: set /dev/sdb1 faulty in /dev/md0 [root@centos6 ~]# [root@centos6 ~]#mdadm /dev/md0 -r /dev/sdb1 # 热移除 mdadm: hot removed /dev/sdb1 from /dev/md0 [root@centos6 ~]#
至此,我们重启系统!
重启系统后我们发现RAID失效了!不过这个跟损坏/dev/sdb1没关系
此时再次重复以上步骤!
在重启系统之前我们必须先备份!
[root@centos6 ~]#mdadm -Ds /dev/md0 > /etc/mdadm.conf # 否则重启系统后RAID失效
然后重启系统:
查看RAID:
[root@centos6 ~]#mdadm -D /dev/md0
再次测试:
[root@centos6 ~]#mdadm /dev/md0 -f /dev/sdb1 mdadm: set /dev/sdb1 faulty in /dev/md0 [root@centos6 ~]#
[root@centos6 ~]#mdadm /dev/md0 -r /dev/sdb1
此时备用盘已经被移除,
在RAID盘里创建一些文件,然后我们再移除一块RAID硬盘。
[root@centos6 /mnt/md0]#dd if=/dev/zero of=/mnt/md0/f2 bs=100M count=1 1+0 records in 1+0 records out 104857600 bytes (105 MB) copied, 0.254593 s, 412 MB/s [root@centos6 /mnt/md0]#ll total 102416 -rw-r--r--. 1 root root 0 Sep 2 21:56 f1 -rw-r--r--. 1 root root 104857600 Sep 2 21:56 f2 drwx------. 2 root root 16384 Sep 2 21:28 lost+found [root@centos6 /mnt/md0]# [root@centos6 ~]#mdadm /dev/md0 -f /dev/sdf1 mdadm: set /dev/sdf1 faulty in /dev/md0 [root@centos6 ~]#mdadm /dev/md0 -r /dev/sdf1 mdadm: hot removed /dev/sdf1 from /dev/md0 [root@centos6 ~]# [root@centos6 ~]#cd /mnt/md0 #查看数据是否正常 [root@centos6 /mnt/md0]#ls f1 f2 lost+found [root@centos6 /mnt/md0]#
测试成功!
RAID管理:添加新的分区与扩展新成员(在硬盘的数量上进行扩展)
[root@centos6 ~]#mdadm /dev/md0 -a /dev/sdg1 # 给RAID添加新分区 mdadm: added /dev/sdg1 [root@centos6 ~]#
[root@centos6 ~]#mdadm -G /dev/md0 -n 6 -a /dev/sdh2 # 扩展 mdadm: added /dev/sdh2
注意,在做RAID时,最好各硬盘的分区一样大,因为会以最小的为标准,多余的空间则会浪费掉;另外,生产环境中无人用软RAID,软RAID仅用途测试与理解RAID用!
本文主要介绍了dd命令的常规用法、如何建立交换分区SWAP、常用RAID的基本特性与RAID 5的配置. 2016.9.3
止战
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
当前题目:Linux磁盘管理进阶-创新互联
URL分享:http://pwwzsj.com/article/decojj.html