《信息安全系统设计与实现》第四周学习笔记
第七章
文件操作级别:
硬件级别
fdisk
mkfs
fsck
碎片整理
操作系统内核中的文件系统函数:
系统调用
I/O库函数
用户命令
sh脚本
低级别文件操作:
分区
Command (m for help): m ---输出帮助信息
Command action
a toggle a bootable flag ---设置启动分区
b edit bsd disklabel ---编辑分区标签
c toggle the dos compatibility flag
d delete a partition --删除一个分区
l list known partition types --列出分区类型
m print this menu --帮助
n add a new partition --建立一个新的分区
o create a new empty DOS partition table --创建一个新的空白DOS分区表
p print the partition table ---打印分区表
q quit without saving changes ---退出不保存设置
s create a new empty Sun disklabel ---
t change a partition's system id ---改变分区的ID
u change display/entry units ---改变显示的单位
v verify the partition table ---检查验证分区表
w write table to disk and exit ---保存分区表
x extra functionality (experts only)
格式划分区
挂载分区:
dd if=/dev/zero of =vdisk bs=1024 count=32768
losetup -o $(expr 2048 * 512) --sizelimit $(expr 65535* 512) /dev/loop1 vdisk
第八章
系统调用:
系统调用手册页
man 2 stat
man 2 open
man 2 read
使用系统调用进行文件操作
include<stdio.h>
include<errno.h>
int main()
{
char buf[256],*s;
int r;
r = mkdir("newdir",0766); //mkdir syscall
if(r<0)
printf("error=%d : %s\n",errno,strerror(errno));
r = chdir("newdir"); //cd into newdir
s = getcwd(buf,256); //get CWD string int buf[]
printf("CWD = %s\n",s);
}
常用的系统调用:
open:打开一个文件进行读、写、追加
int open(char *file, int flags, int mode);
close:关闭打开的文件描述符
int close(int fd);
read:读取打开的文件描述符
int read(int fd, char buf[], int count);
write:写入打开的文件描述符
int write(int fd, char buf[], int count);
dup:将文件描述符复制到可用的最小描述符编号中
int dup(int oldfd);
dup2:将oldfd复制到newfd中,如果文件链接数为0,则删除文件
int dup2(int oldfd, int newfd);
link:将新文件硬链接到旧文件
int link(char *oldPath, char *newPath);
unlink:取消某个文件的链接;如果文件链接数为0,则删除文件
int unlink(char *pathname);
symlink:创建一个符号链接
int symlink(char *target, char *newpath);
readlink:读取符号链接文件的内容
int readlink(char *path, char *buf, int bufsize);
umask:设置文件创建掩码;文件权限为(mask & ~umask)
int umask(int umask);
mknod:创建特殊文件
int mknod(char *path,int mode,int device);
链接文件:
硬链接文件
ln oldpath newpath
对应系统调用:link(char *oldpath,char *newpath)
减少文件链接数:unlink(char *pathname)
符号链接文件
ln -s oldpath newpath
创建符号链接或软链接
symlink(char *oldpath,char *newpath)
《信息安全系统设计与实现》第四周学习笔记
第七章
文件操作级别
硬件级别
fdisk
mkfs
fsck
碎片整理
操作系统内核中的文件系统函数
系统调用
I/O库函数
用户命令
sh脚本
文件I/O操作
image
低级别文件操作
分区
主引导记录(MBR):
MBR 是早期使用的一种分区方式,主要用于传统的BIOS系统。
MBR 分区表可以将物理磁盘划分为最多四个主分区或者三个主分区加一个扩展分区。
每个主分区或扩展分区都有一个主引导记录(Master Boot Record,MBR),存放着分区的启动代码和分区表信息。
全局唯一标识符分区表(GUID 分区表,GPT):
GPT 是一种较新的分区方式,主要用于UEFI(统一扩展固件接口)系统。
GPT 分区表支持更大容量的磁盘和更多的分区数量,最多可达到128个分区,且每个分区的大小理论上没有限制。
每个 GPT 分区都有一个全局唯一标识符(GUID),用于标识分区。
格式划分区
挂载分区
dd if=/dev/zero of =vdisk bs=1024 count=32768
losetup -o $(expr 2048 * 512) --sizelimit $(expr 65535* 512) /dev/loop1 vdisk
第八章
系统调用
系统调用手册页
man 2 stat
man 2 open
man 2 read
image
使用系统调用进行文件操作
include<stdio.h>
include<errno.h>
int main()
{
char buf[256],*s;
int r;
r = mkdir("newdir",0766); //mkdir syscall
if(r<0)
printf("error=%d : %s\n",errno,strerror(errno));
r = chdir("newdir"); //cd into newdir
s = getcwd(buf,256); //get CWD string int buf[]
printf("CWD = %s\n",s);
}
常用的系统调用
open:打开一个文件进行读、写、追加
int open(char *file, int flags, int mode);
close:关闭打开的文件描述符
int close(int fd);
read:读取打开的文件描述符
int read(int fd, char buf[], int count);
write:写入打开的文件描述符
int write(int fd, char buf[], int count);
dup:将文件描述符复制到可用的最小描述符编号中
int dup(int oldfd);
dup2:将oldfd复制到newfd中,如果文件链接数为0,则删除文件
int dup2(int oldfd, int newfd);
link:将新文件硬链接到旧文件
int link(char *oldPath, char *newPath);
unlink:取消某个文件的链接;如果文件链接数为0,则删除文件
int unlink(char *pathname);
symlink:创建一个符号链接
int symlink(char *target, char *newpath);
readlink:读取符号链接文件的内容
int readlink(char *path, char *buf, int bufsize);
umask:设置文件创建掩码;文件权限为(mask & ~umask)
int umask(int umask);
mknod:创建特殊文件
int mknod(char *path,int mode,int device)
链接文件:
硬链接文件
ln oldpath newpath
对应系统调用:link(char *oldpath,char *newpath)
减少文件链接数:unlink(char *pathname)
符号链接文件
ln -s oldpath newpath
创建符号链接或软链接
symlink(char *oldpath,char *newpath)
stat系统调用:
stat文件状态
stat结构体
stat与文件索引节点
每个索引节点在存储设备上都有唯一的索引节点编号(ino)。每个设备都由一对设备号标识,例如0x0302表示/dev/hda2等
文件类型和权限
st_mode:第一个字母表示文件类型,后面9个字符基于权限位,如果位是1,每个字符打印为r|w|x;如果位是0,则打印-。x位表示是否允许访问目录。
opendir-readdir函数
头文件:#include<dirent.h>
read()系统调用
将n个字节从打开的文件描述符读入用户空间中的buf[] 返回值是实际读取的字节数,read失败返回-1
write()系统调用
将n个字节从用户空间中的buf[]写入文件描述符,必须打开该文件描述符进行写,读写或追加
实践 8.11系统调用递归复制文件:
代码如下
include <stdio.h>
include <stdlib.h>
include <unistd.h>
include <sys/stat.h>
include <fcntl.h>
include <dirent.h>
include <string.h>
void copy_file(const char* src, const char* dest) {
int src_fd = open(src, O_RDONLY);
int dest_fd = open(dest, O_WRONLY | O_CREAT | O_TRUNC, 0644);
// 设置缓冲区大小,可根据具体情况进行调整
const size_t BUFFER_SIZE = 1024;
char buffer[BUFFER_SIZE];
ssize_t bytes_read, bytes_written;
while ((bytes_read = read(src_fd, buffer, BUFFER_SIZE)) > 0) {
bytes_written = write(dest_fd, buffer, bytes_read);
if (bytes_written != bytes_read) {
perror("write error");
exit(1);
}
}
close(src_fd);
close(dest_fd);
}
void copy_directory(const char* src, const char* dest) {
DIR* dir;
struct dirent* entry;
struct stat statbuf;
char file_src[4096], file_dest[4096];
if ((dir = opendir(src)) == NULL) {
perror("opendir error");
exit(1);
}
// 创建目标目录
mkdir(dest, 0755);
while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
continue;
}
snprintf(file_src, sizeof(file_src), "%s/%s", src, entry->d_name);
snprintf(file_dest, sizeof(file_dest), "%s/%s", dest, entry->d_name);
if (lstat(file_src, &statbuf) < 0) {
perror("lstat error");
exit(1);
}
if (S_ISDIR(statbuf.st_mode)) {
copy_directory(file_src, file_dest);
} else {
copy_file(file_src, file_dest);
}
}
closedir(dir);
}
int main(int argc, char* argv[]) {
if (argc != 3) {
printf("Usage: %s
exit(1);
}
copy_directory(argv[1], argv[2]);
return 0;
}
苏格拉底挑战: