开机提示:卷“文件系统根目录“仅剩0字节磁盘空盘

原因:

我好像也没做什么,只是上次关机前解压了很多大文件,删了很多大文件。

开机提示:卷“文件系统根目录“仅剩0字节磁盘空盘。

Tab提示:无法为立即文档创建临时文件:设备没有空间

使用 磁盘使用情况分析器可以查看每个文档的大小

用 df -h查看磁盘空间,发现46G的系统根目录满了。

可能原因是Ubuntu删除文件的机制有关。

文件删除的原理

这里的原理涉及到文件系统,我对这里也不是很清楚,只说大概的理解,相信探究文件是怎样删除的足够再写一篇很不错的博客了。

当我们使用rm删除文件时,会调用unlink/unlinkat系统调用。 
man如下

The unlink() function shall remove a link to a file. 
………… 
When the file’s link count becomes 0 and no process has the file open, 
the space occupied by the file shall be freed and the file shall no 
longer be accessible. If one or more processes have the file open when 
the last link is removed, the link shall be removed before unlink() 
returns, but the removal of the file contents shall be postponed until 
all references to the file are closed.

大意 unlink是移除一个对目标文件的link,当这个link的计数到0,并且没有进程打开着这个文件,文件占用的空间会被释放,这个文件也不再能被访问了。 
当最后一个link被移除时,如果有一个以上的进程打开着这个文件,那么这个文件内容的移除会直到所有引用(reference)关闭。
 

所以

我们删除大文件之后,还要确保打开它的进程也关闭才行,才能真正的释放磁盘空间。(没错这是个大日志文件)

1. 我们用 du -h -x --max-depth=1 依次查看文件系统

删除较大的日志文件。

2.当删除大量小文件组成的文件夹时用 rm -rf *就不是很好用了,隔一段时间就要这样清理一次。在这种情况之下我们可以使用linux系统命令rsync来巧妙的处理。rsync实际上用的是替换原理,处理数十万个文件也是秒删。

ubuntu系统安装:sudo apt-get install rsync

rsync --help | grep delete

     --del                                an alias for --delete-during

     --delete                          delete extraneous files from destination dirs

     --delete-before             receiver deletes before transfer, not during

     --delete-during             receiver deletes during transfer (default)

     --delete-delay               find deletions during, delete after

     --delete-after                receiver deletes after transfer, not during

     --delete-excluded        also delete excluded files from destination dirs

     --ignore-errors             delete even if there are I/O errors

     --max-delete=NUM    don't delete more than NUM files

其中--delete-before接收者在传输之前进行删除操作

当要清空目录或文件时,先建立一个空目录:

mkdir /data/blank 

然后用rsync删除目标目录 

rsync --delete-before -d -a -H -v --progress --stats /data/blank/ /var/edatacache/

或者

rsync --delete-before -d /data/blank/ /var/edatacache/

这样/var/edatacache目录就被快速的清空了。

 

选项说明:
–delete-before 接收者在传输之前进行删除操作
–progress          在传输时显示传输过程
-a                       归档模式,表示以递归方式传输文件,并保持所有文件属性
-H                      保持硬连接的文件
-v                       详细输出模式
–stats                给出某些文件的传输状态

-d                      transfer directories without recursing

 

 

 

 

 

模拟一个采用多道程序设计方法的单用户操作系统,该操作系统包括进程管理、存 储管理、设备管理、文件管理和用户接口四部分,要求: 1、 文件管理和用户接口 实现的主要是单用户的磁盘文件管理部分,包括文件的逻辑结构、物理结构、目录、磁盘分配回收、文件的保护和用户接口的实现。 支持多级目录结构,支持文件的绝对读路径。 在图形化界面实现目录树结构,以及文件的路径显示查找等。 文件的逻辑结构采用流式结构,物理结构采用链接结构中的显式链接方式。系统中有两种文件,一种是存放任意字符的普通文本文件,一种是可执行文件。 采用文件分配表 FAT。 把磁盘中每一块的指针部分提出来,组织在一起,形成文件分配表(FAT)。建立一个FAT数组作为文件分配表。 实现的命令包括建立目录、列目录、删除空目录、建立文件、删除文件、显示。 实现图形界面的建立目录、列目录、删除空目录、建立文件、删除文件、显示操作,并对后台进行改变。 文件内容、打开文件、读文件、写文件、关闭文件。实现图形界面的显示文件内容、打开文件、读文件、写文件、关闭文件并对后台进行改变。 命令行界面执行这些命令,也可以采用“右击快捷菜单选择”方式执行命令。 2、 存储管理 储管理部分主要实现内存空间的分配和回收、存储保护。用链表模拟内存空间分配表。存储管理采用动态分区存储管理方式,采用首次适配、下次适配、最佳适配均可。 模拟系统中,主存部分分为两部分,一部分是系统区,只存放进程控制块和内存分配表,一部分是用户区,存放可执行文件。系统区包括PCB区域(最多容纳10个PCB)、内存空间分配表;用户区用数组模拟,大小为512字节。 屏幕显示要求包括:内存使用情况示意图,以不同的颜色表示哪些区域未分配或已分配(已分配给哪个进程)。 3、 设备管理 设备管理主要包括设备的分配和回收。 模拟系统中有A、B、C三种独占型设备,A设备2个,B设备3个,C设备3个。(同一种设备的不同实体被认为是相同的) 设备的申请是由于前述可执行文件中的!??指令引起,有空闲设备时分配设备,然后进程阻塞,同时设备使用倒计时至0后释放设备(不考虑设备具体的I/O操作)并唤醒进程继续运行;无空闲设备时阻塞进程,直至其它进程释放设备时才分配设备并使用,设备使用完后唤醒进程。设备使用倒计时期间,本进程阻塞,需要调度另外一个进程去占用CPU执行;假设设备使用完后立即释放该设备,后续指令需再次使用该设备时重新分配。 不考虑死锁。 屏幕显示要求包括:每个设备是否被使用,哪个进程在使用该设备,哪些进程在等待使用该设备。 4、 进程管理主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。 1)硬件工作的模拟 (a)中央处理器的模拟用函数CPU()(该函数没有参数)模拟单个中央处理器。该函数主要负责解释“可执行文件”中的指令。(为简单计,用户命令接口部分实现的命令不必用CPU()解释执行) (b)主要寄存器的模拟用全局变量或数组模拟重要寄存器, (c)中断的模拟I、中断的发现应该是硬件的工作,但在这里,用在函数CPU()中检测PSW的方式来模拟。 (d)时钟的模拟系统时钟和相对时钟用全局变量模拟。系统时钟用来记录开机以后的单位时间,相对时钟用来存放进程可运行的时间片 2)进程控制块PCB进程控制块内容包括进程标识符、主要寄存器、进程状态、阻塞原因等。 3)进程调度随机选择前面创建的10个可执行文件之一,创建进程PCB,分配内存,然后逐条执行其中的指令;然后经过随机时间后,再选择一个可执行文件,创建进程……,如此往复,模拟操作系统中进程随机到达的过程。采用时间片轮转调度算法,时间片长度为6。 4)进程控制建立4个函数模拟进程创建、撤销、阻塞和唤醒四个原语 5)屏幕显示要求包括:显示系统时钟;显示正在运行进程的进程ID、运行的指令、中间结果(x的当前值)、相对时钟(时间片剩余值);显示就绪队列中进程ID;33显示阻塞队列中进程ID。 二、概要设计 2.1 文件操作 模拟磁盘需要先设计一个类Disk存储磁盘里的信息。因为磁盘有256块,每块有64字节,所以用一个二维的byte数组存储磁盘里的信息。磁盘的信息存储在一个文本文件中,当要操作磁盘时便从文本文件读取内容存放到Disk类的数组中,操作完毕便写入文本文件中。 属性为private byte[][] disk; 文件和目录管理需要文件分配表FAT,所以需要一个类FAT来管理文件分配表的改动。因为每个盘块要用一字节表示,而每个盘块有64字节,所以需要disk中的前4个盘块作为文件分配表的内容,所以FAT直接获取Disk中二维数组的引用,操作时直接在数组前四行里操作。 属性为private byte[][] diskBuffer; 需要FileUtil类,用以对磁盘进行各种操作。因为磁盘中存储的都是字节型数据,所以从磁盘中读取内容都是将磁盘中的二进制内容转换为String类型,而写入时则将String型的内容与名字转换为字节型存储到磁盘中。文件或目录的路径是按如下的方法化为二进制的,如路径/ab/cde化为二进制时是转换为数组二进制数组path[][],其中path[0]是 “ab”的Ascii码[97,98],path[1]是”cde”的Ascii码[99,100,101]。属性如下。 private byte[][] diskBuffer; //存储磁盘里的内容 private final int ROOT_DIR = 4; //根目录磁盘中的盘块 private final byte EXE_PROPERTY = 5; //可执行文件属性 private final byte TXT_PROPERTY = 1; //文本文件属性 private final byte DIR_PROPERTY = 3; //目录属性 private FAT fileAllocationTable; //文件分配表类 private Disk disk; //磁盘类,用以从文件中读取内容 private byte[] emptyBlock; //空盘块 private byte[] emptyItem; //空目录项 ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 模拟一个采用多道程序设计方法的单用户操作系统,该操作系统包括进程管理、存 储管理、设备管理、文件管理和用户接口四部分,要求: 1、 文件管理和用户接口 实现的主要是单用户的磁盘文件管理部分,包括文件的逻辑结构、物理结构、目录、磁盘分配回收、文件的保护和用户接口的实现。 支持多级目录结构,支持文件的绝对读路径。 在图形化界面实现目录树结构,以及文件的路径显示查找等。 文件的逻辑结构采用流式结构,物理结构采用链接结构中的显式链接方式。系统中有两种文件,一种是存放任意字符的普通文本文件,一种是可执行文件。 采用文件分配表 FAT。 把磁盘中每一块的指针部分提出来,组织在一起,形成文件分配表(FAT)。建立一个FAT数组作为文件分配表。 实现的命令包括建立目录、列目录、删除空目录、建立文件、删除文件、显示。 实现图形界面的建立目录、列目录、删除空目录、建立文件、删除文件、显示操作,并对后台进行改变。 文件内容、打开文件、读文件、写文件、关闭文件。实现图形界面的显示文件内容、打开文件、读文件、写文件、关闭文件并对后台进行改变。 命令行界面执行这些命令,也可以采用“右击快捷菜单选择”方式执行命令。 2、 存储管理 储管理部分主要实现内存空间的分配和回收、存储保护。用链表模拟内存空间分配表。存储管理采用动态分区存储管理方式,采用首次适配、下次适配、最佳适配均可。 模拟系统中,主存部分分为两部分,一部分是系统区,只存放进程控制块和内存分配表,一部分是用户区,存放可执行文件。系统区包括PCB区域(最多容纳10个PCB)、内存空间分配表;用户区用数组模拟,大小为512字节。 屏幕显示要求包括:内存使用情况示意图,以不同的颜色表示哪些区域未分配或已分配(已分配给哪个进程)。 3、 设备管理 设备管理主要包括设备的分配和回收。 模拟系统中有A、B、C三种独占型设备,A设备2个,B设备3个,C设备3个。(同一种设备的不同实体被认为是相同的) 设备的申请是由于前述可执行文件中的!??指令引起,有空闲设备时分配设备,然后进程阻塞,同时设备使用倒计时至0后释放设备(不考虑设备具体的I/O操作)并唤醒进程继续运行;无空闲设备时阻塞进程,直至其它进程释放设备时才分配设备并使用,设备使用完后唤醒进程。设备使用倒计时期间,本进程阻塞,需要调度另外一个进程去占用CPU执行;假设设备使用完后立即释放该设备,后续指令需再次使用该设备时重新分配。 不考虑死锁。 屏幕显示要求包括:每个设备是否被使用,哪个进程在使用该设备,哪些进程在等待使用该设备。 4、 进程管理主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。 1)硬件工作的模拟 (a)中央处理器的模拟用函数CPU()(该函数没有参数)模拟单个中央处理器。该函数主要负责解释“可执行文件”中的指令。(为简单计,用户命令接口部分实现的命令不必用CPU()解释执行) (b)主要寄存器的模拟用全局变量或数组模拟重要寄存器, (c)中断的模拟I、中断的发现应该是硬件的工作,但在这里,用在函数CPU()中检测PSW的方式来模拟。 (d)时钟的模拟系统时钟和相对时钟用全局变量模拟。系统时钟用来记录开机以后的单位时间,相对时钟用来存放进程可运行的时间片 2)进程控制块PCB进程控制块内容包括进程标识符、主要寄存器、进程状态、阻塞原因等。 3)进程调度随机选择前面创建的10个可执行文件之一,创建进程PCB,分配内存,然后逐条执行其中的指令;然后经过随机时间后,再选择一个可执行文件,创建进程……,如此往复,模拟操作系统中进程随机到达的过程。采用时间片轮转调度算法,时间片长度为6。 4)进程控制建立4个函数模拟进程创建、撤销、阻塞和唤醒四个原语 5)屏幕显示要求包括:显示系统时钟;显示正在运行进程的进程ID、运行的指令、中间结果(x的当前值)、相对时钟(时间片剩余值);显示就绪队列中进程ID;33显示阻塞队列中进程ID。 二、概要设计 2.1 文件操作 模拟磁盘需要先设计一个类Disk存储磁盘里的信息。因为磁盘有256块,每块有64字节,所以用一个二维的byte数组存储磁盘里的信息。磁盘的信息存储在一个文本文件中,当要操作磁盘时便从文本文件读取内容存放到Disk类的数组中,操作完毕便写入文本文件中。 属性为private byte[][] disk; 文件和目录管理需要文件分配表FAT,所以需要一个类FAT来管理文件分配表的改动。因为每个盘块要用一字节表示,而每个盘块有64字节,所以需要disk中的前4个盘块作为文件分配表的内容,所以FAT直接获取Disk中二维数组的引用,操作时直接在数组前四行里操作。 属性为private byte[][] diskBuffer; 需要FileUtil类,用以对磁盘进行各种操作。因为磁盘中存储的都是字节型数据,所以从磁盘中读取内容都是将磁盘中的二进制内容转换为String类型,而写入时则将String型的内容与名字转换为字节型存储到磁盘中。文件或目录的路径是按如下的方法化为二进制的,如路径/ab/cde化为二进制时是转换为数组二进制数组path[][],其中path[0]是 “ab”的Ascii码[97,98],path[1]是”cde”的Ascii码[99,100,101]。属性如下。 private byte[][] diskBuffer; //存储磁盘里的内容 private final int ROOT_DIR = 4; //根目录磁盘中的盘块 private final byte EXE_PROPERTY = 5; //可执行文件属性 private final byte TXT_PROPERTY = 1; //文本文件属性 private final byte DIR_PROPERTY = 3; //目录属性 private FAT fileAllocationTable; //文件分配表类 private Disk disk; //磁盘类,用以从文件中读取内容 private byte[] emptyBlock; //空盘块 private byte[] emptyItem; //空目录项 ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 模拟一个采用多道程序设计方法的单用户操作系统,该操作系统包括进程管理、存 储管理、设备管理、文件管理和用户接口四部分,要求: 1、 文件管理和用户接口 实现的主要是单用户的磁盘文件管理部分,包括文件的逻辑结构、物理结构、目录、磁盘分配回收、文件的保护和用户接口的实现。 支持多级目录结构,支持文件的绝对读路径。 在图形化界面实现目录树结构,以及文件的路径显示查找等。 文件的逻辑结构采用流式结构,物理结构采用链接结构中的显式链接方式。系统中有两种文件,一种是存放任意字符的普通文本文件,一种是可执行文件。 采用文件分配表 FAT。 把磁盘中每一块的指针部分提出来,组织在一起,形成文件分配表(FAT)。建立一个FAT数组作为文件分配表。 实现的命令包括建立目录、列目录、删除空目录、建立文件、删除文件、显示。 实现图形界面的建立目录、列目录、删除空目录、建立文件、删除文件、显示操作,并对后台进行改变。 文件内容、打开文件、读文件、写文件、关闭文件。实现图形界面的显示文件内容、打开文件、读文件、写文件、关闭文件并对后台进行改变。 命令行界面执行这些命令,也可以采用“右击快捷菜单选择”方式执行命令。 2、 存储管理 储管理部分主要实现内存空间的分配和回收、存储保护。用链表模拟内存空间分配表。存储管理采用动态分区存储管理方式,采用首次适配、下次适配、最佳适配均可。 模拟系统中,主存部分分为两部分,一部分是系统区,只存放进程控制块和内存分配表,一部分是用户区,存放可执行文件。系统区包括PCB区域(最多容纳10个PCB)、内存空间分配表;用户区用数组模拟,大小为512字节。 屏幕显示要求包括:内存使用情况示意图,以不同的颜色表示哪些区域未分配或已分配(已分配给哪个进程)。 3、 设备管理 设备管理主要包括设备的分配和回收。 模拟系统中有A、B、C三种独占型设备,A设备2个,B设备3个,C设备3个。(同一种设备的不同实体被认为是相同的) 设备的申请是由于前述可执行文件中的!??指令引起,有空闲设备时分配设备,然后进程阻塞,同时设备使用倒计时至0后释放设备(不考虑设备具体的I/O操作)并唤醒进程继续运行;无空闲设备时阻塞进程,直至其它进程释放设备时才分配设备并使用,设备使用完后唤醒进程。设备使用倒计时期间,本进程阻塞,需要调度另外一个进程去占用CPU执行;假设设备使用完后立即释放该设备,后续指令需再次使用该设备时重新分配。 不考虑死锁。 屏幕显示要求包括:每个设备是否被使用,哪个进程在使用该设备,哪些进程在等待使用该设备。 4、 进程管理主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。 1)硬件工作的模拟 (a)中央处理器的模拟用函数CPU()(该函数没有参数)模拟单个中央处理器。该函数主要负责解释“可执行文件”中的指令。(为简单计,用户命令接口部分实现的命令不必用CPU()解释执行) (b)主要寄存器的模拟用全局变量或数组模拟重要寄存器, (c)中断的模拟I、中断的发现应该是硬件的工作,但在这里,用在函数CPU()中检测PSW的方式来模拟。 (d)时钟的模拟系统时钟和相对时钟用全局变量模拟。系统时钟用来记录开机以后的单位时间,相对时钟用来存放进程可运行的时间片 2)进程控制块PCB进程控制块内容包括进程标识符、主要寄存器、进程状态、阻塞原因等。 3)进程调度随机选择前面创建的10个可执行文件之一,创建进程PCB,分配内存,然后逐条执行其中的指令;然后经过随机时间后,再选择一个可执行文件,创建进程……,如此往复,模拟操作系统中进程随机到达的过程。采用时间片轮转调度算法,时间片长度为6。 4)进程控制建立4个函数模拟进程创建、撤销、阻塞和唤醒四个原语 5)屏幕显示要求包括:显示系统时钟;显示正在运行进程的进程ID、运行的指令、中间结果(x的当前值)、相对时钟(时间片剩余值);显示就绪队列中进程ID;33显示阻塞队列中进程ID。 二、概要设计 2.1 文件操作 模拟磁盘需要先设计一个类Disk存储磁盘里的信息。因为磁盘有256块,每块有64字节,所以用一个二维的byte数组存储磁盘里的信息。磁盘的信息存储在一个文本文件中,当要操作磁盘时便从文本文件读取内容存放到Disk类的数组中,操作完毕便写入文本文件中。 属性为private byte[][] disk; 文件和目录管理需要文件分配表FAT,所以需要一个类FAT来管理文件分配表的改动。因为每个盘块要用一字节表示,而每个盘块有64字节,所以需要disk中的前4个盘块作为文件分配表的内容,所以FAT直接获取Disk中二维数组的引用,操作时直接在数组前四行里操作。 属性为private byte[][] diskBuffer; 需要FileUtil类,用以对磁盘进行各种操作。因为磁盘中存储的都是字节型数据,所以从磁盘中读取内容都是将磁盘中的二进制内容转换为String类型,而写入时则将String型的内容与名字转换为字节型存储到磁盘中。文件或目录的路径是按如下的方法化为二进制的,如路径/ab/cde化为二进制时是转换为数组二进制数组path[][],其中path[0]是 “ab”的Ascii码[97,98],path[1]是”cde”的Ascii码[99,100,101]。属性如下。 private byte[][] diskBuffer; //存储磁盘里的内容 private final int ROOT_DIR = 4; //根目录磁盘中的盘块 private final byte EXE_PROPERTY = 5; //可执行文件属性 private final byte TXT_PROPERTY = 1; //文本文件属性 private final byte DIR_PROPERTY = 3; //目录属性 private FAT fileAllocationTable; //文件分配表类 private Disk disk; //磁盘类,用以从文件中读取内容 private byte[] emptyBlock; //空盘块 private byte[] emptyItem; //空目录项 ———————
07-13
base) cdm@smore:~$ sudo fdisk -l Disk /dev/loop0:290.8 MiB,304898048 字节,595504 个扇区 单元:扇区 / 1 * 512 = 512 字节 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 Disk /dev/loop1:2.2 MiB,2342912 字节,4576 个扇区 单元:扇区 / 1 * 512 = 512 字节 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 Disk /dev/loop2:2.1 MiB,2150400 字节,4200 个扇区 单元:扇区 / 1 * 512 = 512 字节 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 Disk /dev/loop3:63.9 MiB,67014656 字节,130888 个扇区 单元:扇区 / 1 * 512 = 512 字节 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 Disk /dev/loop4:516.2 MiB,541278208 字节,1057184 个扇区 单元:扇区 / 1 * 512 = 512 字节 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 Disk /dev/loop5:55.5 MiB,58183680 字节,113640 个扇区 单元:扇区 / 1 * 512 = 512 字节 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 Disk /dev/loop6:91.7 MiB,96141312 字节,187776 个扇区 单元:扇区 / 1 * 512 = 512 字节 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 Disk /dev/loop7:497 MiB,521121792 字节,1017816 个扇区 单元:扇区 / 1 * 512 = 512 字节 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 Disk /dev/sda:465.8 GiB,500107862016 字节,976773168 个扇区 单元:扇区 / 1 * 512 = 512 字节 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:gpt 磁盘标识符:C17CCEF1-A1DA-403F-BD87-D839DAC86C20 设备 起点 末尾 扇区 大小 类型 /dev/sda1 2048 1050623 1048576 512M EFI 系统 /dev/sda2 1050624 976771071 975720448 465.3G Linux 文件系统 Disk /dev/sdb:1.8 TiB,2000398934016 字节,3907029168 个扇区 单元:扇区 / 1 * 512 = 512 字节 扇区大小(逻辑/物理):512 字节 / 4096 字节 I/O 大小(最小/最佳):4096 字节 / 4096 字节 怎么从1.8t中分出200g
最新发布
10-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值