Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Санкт-Петербургский Государственный Политехнический Университет
Факультет Технической Кибернетики
Кафедра Компьютерных Систем и Программных Технологий
ОТЧЁТ О ЛАБОРАТОРНОЙ РАБОТЕ №2
Дисциплина: Системное программное обеспечение
Тема: Файловые системы
Д.А. Киселёв Е.В. Душутина
Выполнил студент гр. 4081/10
Преподаватель
Санкт-Петербург
2012
Цель работы:
Изучение файловой системы ОС QNX.
Программа работы:
А) организовать пустой каталог
Б) скопировать в него файл
В) переименовать
Г) удалить
Д) создать подкаталог
Е)создать в нем файл
Последовательность выполнения операций над файлами и каталогами, а также сравнение результатов в файле-каталоге задать в виде командного файла, позволяющего автоматизировать процесс анализа информации в файле-каталоге при внесении в него изменений при любой операции.
1. Типы файлов
Скрипт, записывающий в выходной файл информацию о всех возможных типах файлов:
#! /bin/sh
filetypes=`ls -lRa / | cut -c 1 | grep -v / | grep -v t | sort | uniq | tr '\n' ' '`
echo Existing types of files on this computer: $filetypes>filetypes.txt
Результат:
# ./script1
# cat filetypes.txt
Existing types of files on this computer: - b c d l n s
Найденные типы файлов:
2. Жёсткие ссылки
Скрипт, записывающий в выходной файл все жёсткие ссылки на заданный файл, находящиеся в разных каталогах пользовательского пространства:
#! /bin/sh
if [ $# -lt 1 ]
then
echo $0: error: File not specified
else
filename=$1
inode=`ls -i $filename | cut -c 1-8`
ls -lRi / | grep $inode > hardlinks.txt
fi
Создадим в разных каталогах 2 жёсткие ссылки на файл отчёта и запустим скрипт:
# ln otchet2.txt /link1
# ln otchet2.txt /home/SPO/link2
# ./script2 otchet2.txt
# cat hardlinks.txt
951363 -rw-rw-r-- 3 root root 90 Nov 04 19:46 link1
951363 -rw-rw-r-- 3 root root 90 Nov 04 19:46 link2
951363 -rw-rw-r-- 3 root root 90 Nov 04 19:46 otchet2.txt
Команда ln создаёт жёсткую ссылку.
3. Команда find
Предназначена для рекурсивного поиска файлов в заданном каталоге по заданным критериям. Основные опции команды:
Получим расширенную информацию о типах файлов, используя команду find:
# for i in b c d p f l n s
> do
> find / -type $i -ls | head -n 1
> done
brw------- 1 root root 2880 Nov 03 17:30 /dev/fd0
crw-rw---- 1 root root 0 Nov 04 03:20 /dev/devi/ig1
drwxr-xr-x 15 root root 1024 Nov 04 20:46 /
-rw-rw-r-- 1 root root 1366048 Oct 18 00:24 /.boot/qnxbase.ifs
lrwxrwxrwx 1 root root 2 Oct 18 00:23 /bin/aps
nrw------- 1 root root 0 Nov 04 03:20 /proc/dumper
srw-rw-rw- 1 root root 0 Nov 05 00:35 /dev/socket/1
Команда head с опцией n 1 выводит только первую строку из входных данных.
4. Команда od
Скрипт, позволяющий проанализировать содержимое файла-каталога с помощью команды od при выполнении различных операций над файлами и каталогами, а также выявить изменения, вносимые в него при любой операции:
#! /bin/sh
mkdir testdir
echo 'Create new directory'>output4.txt
od -t c testdir>f1
cat f1>>output4.txt
cp /home/SPO/Lab2/otchet2.txt ./testdir/testfile
echo '\nCopy a file to directory'>>output4.txt
./pat1
mv ./testdir/testfile ./testdir/myfile.txt
echo '\nRename file in directory'>>output4.txt
./pat2
rm ./testdir/myfile.txt
echo '\nRemove file from directory'>>output4.txt
./pat1
mkdir ./testdir/subdir
echo '\nCreate subdirectory in directory'>>output4.txt
./pat2
> ./testdir/subdir/newfile
echo '\nCreate new file in subdirectory'>>output4.txt
./pat1
rm f1 f2 ./testdir/subdir/newfile
rmdir ./testdir/subdir
rmdir ./testdir
Файл pat1:
#! /bin/sh
od -t c testdir>f2
cat f2>>output4.txt
echo '\nWhat have been changed in dump:'>>output4.txt
diff f1 f2 >> output4.txt
Файл pat2:
#! /bin/sh
od -t c testdir>f1
cat f1>>output4.txt
echo '\nWhat have been changed in dump:'>>output4.txt
diff f2 f1 >> output4.txt
Команда od с опцией t c выводит дамп памяти, ассоциированный с указанным файлом, побайтно в восьмеричном коде, заменяя код на символы там, где это возможно.
Файл output4.txt после выполнения скрипта:
Create new directory
0000000000 \b \0 016 \0 \0 \0 \0 \0 040 \0 \0 \0 \0 \0 \0 \0
0000000020 030 \0 001 \0 . \0 \0 \0 @ 004 016 \0 \0 \0 \0 \0
0000000040 @ \0 \0 \0 \0 \0 \0 \0 030 \0 002 \0 . . \0 \0
0000000060
Copy a file to directory
0000000000 \b \0 016 \0 \0 \0 \0 \0 040 \0 \0 \0 \0 \0 \0 \0
0000000020 030 \0 001 \0 . \0 \0 \0 @ 004 016 \0 \0 \0 \0 \0
0000000040 @ \0 \0 \0 \0 \0 \0 \0 030 \0 002 \0 . . \0 \0
0000000060 016 \0 016 \0 \0 \0 \0 \0 ` \0 \0 \0 \0 \0 \0 \0
0000000100 040 \0 \b \0 t e s t f i l e \0 t \0 \0
0000000120
What have been changed in dump:
4c4,6
< 0000000060
---
> 0000000060 016 \0 016 \0 \0 \0 \0 \0 ` \0 \0 \0 \0 \0 \0 \0
> 0000000100 040 \0 \b \0 t e s t f i l e \0 t \0 \0
> 0000000120
Rename file in directory
0000000000 \b \0 016 \0 \0 \0 \0 \0 040 \0 \0 \0 \0 \0 \0 \0
0000000020 030 \0 001 \0 . \0 \0 \0 @ 004 016 \0 \0 \0 \0 \0
0000000040 @ \0 \0 \0 \0 \0 \0 \0 030 \0 002 \0 . . \0 \0
0000000060 016 \0 016 \0 \0 \0 \0 \0 ` \0 \0 \0 \0 \0 \0 \0
0000000100 040 \0 \n \0 m y f i l e . t x t \0 \0
0000000120
What have been changed in dump:
5c5
< 0000000100 040 \0 \b \0 t e s t f i l e \0 t \0 \0
---
> 0000000100 040 \0 \n \0 m y f i l e . t x t \0 \0
Remove file from directory
0000000000 \b \0 016 \0 \0 \0 \0 \0 040 \0 \0 \0 \0 \0 \0 \0
0000000020 030 \0 001 \0 . \0 \0 \0 @ 004 016 \0 \0 \0 \0 \0
0000000040 @ \0 \0 \0 \0 \0 \0 \0 030 \0 002 \0 . . \0 \0
0000000060
What have been changed in dump:
4,6c4
< 0000000060 016 \0 016 \0 \0 \0 \0 \0 ` \0 \0 \0 \0 \0 \0 \0
< 0000000100 040 \0 \n \0 m y f i l e . t x t \0 \0
< 0000000120
---
> 0000000060
Create subdirectory in directory
0000000000 \b \0 016 \0 \0 \0 \0 \0 040 \0 \0 \0 \0 \0 \0 \0
0000000020 030 \0 001 \0 . \0 \0 \0 @ 004 016 \0 \0 \0 \0 \0
0000000040 @ \0 \0 \0 \0 \0 \0 \0 030 \0 002 \0 . . \0 \0
0000000060 > 001 \r \0 \0 \0 \0 \0 ` \0 \0 \0 \0 \0 \0 \0
0000000100 040 \0 006 \0 s u b d i r \0 t x t \0 \0
0000000120
What have been changed in dump:
4c4,6
< 0000000060
---
> 0000000060 > 001 \r \0 \0 \0 \0 \0 ` \0 \0 \0 \0 \0 \0 \0
> 0000000100 040 \0 006 \0 s u b d i r \0 t x t \0 \0
> 0000000120
Create new file in subdirectory
0000000000 \b \0 016 \0 \0 \0 \0 \0 040 \0 \0 \0 \0 \0 \0 \0
0000000020 030 \0 001 \0 . \0 \0 \0 @ 004 016 \0 \0 \0 \0 \0
0000000040 @ \0 \0 \0 \0 \0 \0 \0 030 \0 002 \0 . . \0 \0
0000000060 > 001 \r \0 \0 \0 \0 \0 ` \0 \0 \0 \0 \0 \0 \0
0000000100 040 \0 006 \0 s u b d i r \0 e \0 t \0 \0
0000000120
What have been changed in dump:
5c5
< 0000000100 040 \0 006 \0 s u b d i r \0 t x t \0 \0
---
> 0000000100 040 \0 006 \0 s u b d i r \0 e \0 t \0 \0
Пустой каталог занимает 48 байт в памяти. В дампе каталога можно заметить точку и две точки, перед ними расположены серийные номера (inode) соответственно самого каталога и вышележащего. После копирования в каталог файла в конец дампа каталога добавилось некоторое количество байт, в которых содержится inode файла и его имя. При переименовании файла дамп конечно же изменился. При удалении файла дамп каталога вернулся к первоначальному виду. При создании подкаталога дамп увеличился, и теперь в нём можно прочитать имя подкаталога. Кстати, когда мы удалили файл, байты, в которых было записано его расширение, не были очищены, и они до сих пор могут быть прочитаны, хотя к дампу нашего каталога они, видимо, уже не относятся. При создании нового файла в подкаталоге были изменены 2 байта в конце дампа.
5. Файлы /etc/passwd, /etc/shadow и утилита /usr/bin/passwd
Содержимое файла /etc/passwd:
root:x:0:0:Superuser:/root:/bin/sh
bin:x:1:1:Binaries Commands and Source:/bin:
daemon:x:2:2:System Services:/daemon:
mail:x:8:40:User Mail:/var/spool/mail:
news:x:9:50:Network News:/var/spool/news:
uucp:x:12:60:Network News:/var/spool/news:
ftp:x:14:80:FTP User:/home/ftp:
sshd:x:15:6:sshd:/var/chroot/sshd:/bin/false
nobody:x:99:99:Nobody:/:
gr40812:x:100:100::/home/gr40812:/bin/sh
gr40811:x:101:100::/home/gr40811:/bin/sh
Здесь записана информация о пользователях в следующем формате:
<Имя пользователя>:<пароль>:<UID>:<GID>:<комментарии>:<домашний каталог>:<интерпретатор shell>
Он доступен для чтения всем пользователям, на запись только администратору. В целях безопасности пароли в нём не хранятся, для них есть отдельный зашифрованный файл /etc/shadow, который доступен для чтения и записи только администратору. Для того, чтобы обычный пользователь мог изменить свой пароль, существует утилита /usr/bin/passwd, которая доступна администратору и группе root на чтение, запись и исполнение, а всем остальным на чтение и исполнение. Эта программа может выполнять действия от имени администратора, независимо от того, кто её запустил.
6. Изменение прав доступа и владельца
Для изменения прав доступа к файлу предназначена утилита chmod. Синтаксис:
chmod [-Rv] mode file...
Опция R используется для изменения прав доступа ко всем файлам в указанном каталоге и в подкаталогах. mode записывается в следующем виде:
[who]operator[permissions][,symbolic_mode]
Здесь who указывает для кого необходимо изменить права доступа, и может принимать одно из следующих значений: u (для владельца файла), g (для группы-владельца), o (для всех остальных) или a (для всех). Operator указывает действие: + (добавить право), - (удалить право) или = (задать права на чтение, запись и выполнение). Permissions указывает собственно права, которые должны быть изменены: r (чтение), w (запись), x (выполнение), s (право на выполнение файла от имени его владельца, то есть SUID (если в поле who содержится или подразумевается u), или от имени группы-владельца, то есть SGID (если в поле who содержится или подразумевается g)) и другие.
Пример записи команды chmod:
chmod a+x,og-r myfile file2 zzz
Существует и более короткий формат записи данной команды:
chmod 754 myfile
Здесь каждый разряд восьмеричного числа, состоящий из трёх бит, определяет права на чтение запись и выполнение для владельца, группы-владельца и всех остальных.
Если права на использование файла для владельца и для группы, в которую он входит различны, то для самого владельца файла права определяются исключительно его правами, независимо от прав группы-владельца, а для всех остальных членов этой группы права определяются правами группы.
Для изменения владельца файла предназначена утилита chown. Синтаксис:
chown [-Rv] owner[:group] file...
Опция R используется для изменения владельца всех файлов в указанном каталоге и в подкаталогах. owner имя пользователя или его ID. group имя группы или ID группы.
Пример записи команды chown:
chown 101 myfile
Несмотря на то, что утилита chown может быть выполнена любым пользователем, она позволяет изменить владельца файла только администратору. Обычным пользователям запрещено изменять владельца даже своих собственных файлов.
7. Программа-шлюз
Текст программы:
#include <stdio.h>
main ( int argc, char *argv [] )
{
if (argc>1) {
FILE *f;
f=fopen(argv[1],"r");
if (f) {
char str[64];
while ( fgets(str, sizeof(str), f) ) {
printf("%s", str);
}
fclose(f);
}
else printf("%s: File %s couldn't be open\n", argv[0], argv[1]);
}
else printf("%s: File was not specified\n", argv[0]);
}
Скомпилируем её стандартным компилятором в исполняемый файл gateway, сделаем администратора владельцем этого файла и установим атрибут SUID:
$ login root
Wed Dec 26 17:05:42 2012 on /dev/ttyp0
Last login: Wed Dec 26 16:52:50 2012 on /dev/ttyp0
edit the file .profile if you want to change your environment.
To start the Photon windowing environment, type "ph".
# cd /home/dm/SPO/40811/Lab2
# cc gateway.c -o gateway
# chmod u+s gateway
# ls -l ./gateway
-rwsrwxr-x 1 root root 4520 Dec 26 17:07 ./gateway
Создадим текстовый файл, доступ к которому имеет только администратор:
# echo qwerty98765432 > /root/myfile.txt
# chmod 600 /root/myfile.txt
# ls -l /root/myfile.txt
-rw------- 1 root root 15 Dec 26 17:14 /root/myfile.txt
Попробуем прочесть /root/myfile.txt от имени обычного пользователя:
# login dm
Wed Dec 26 17:18:33 2012 on /dev/tty
Wed Dec 26 17:18:33 2012 on /dev/tty
Last login: Wed Dec 26 17:18:33 2012
$ cat /root/myfile.txt
/root/myfile.txt: Permission denied
Теперь прочитаем его с помощью программы-шлюза gateway:
$ cd ./SPO/40811/Lab2
$ ./gateway /root/myfile.txt
qwerty98765432
8. Утилита df
Предназначена для получения информации о свободном дисковом пространстве. Синтаксис:
df [-ghknP] [device|directory|file]
По умолчанию дисковое пространство измеряется в количестве 512-байтных блоков. Опция k используется для измерения пространства количеством 1024-байтных блоков. Опция h используется для измерения пространства в единицах, удобных для чтения человеком (байты, килобайты и т.д.). Опция P используется для отображения заголовков столбцов таблицы. Опция g используется для отображения более подробной информации:
# df -ghP
Filesystem Size Used Available Capacity Mounted on
/dev/hd0t179 7.9G 1.5G 6.4G 20% /
/dev/umass0t11 7.4G 6.5G 927M 88% /fs/usb0/
/dev/cd0 1.4G 1.4G 0 100% /fs/cd0/
/dev/umass0 7.4G 7.4G 0 100%
/dev/fd0 1.4M 1.4M 0 100%
/dev/hd0 8.0G 8.0G 0 100%
# df -g
/dev/hd0t179 /
Blocks: 8385880 total 6746489 avail [1024-byte blocks]
Files : 1048240 total 1025173 avail
Type : qnx6
Flags : 00000000 []
Option: sync=optional
/dev/umass0t11 /fs/usb0/
Blocks: 1956336 total 237239 avail [4096-byte blocks]
Files : 0 total 0 avail
Type : dos (fat32)
Flags : 00000020 [noatime]
Option: fsi=use
/dev/cd0 /fs/cd0/
Blocks: 740464 total 0 avail [2048-byte blocks]
Files : 0 total 0 avail
Type : cd (joliet)
Flags : 00000001 [rdonly]
Option:
/dev/umass0
Blocks: 15687680 total 0 avail [512-byte blocks]
Files : 0 total 0 avail
Type : blk-umass
Flags : 00000020 [noatime]
Option:
/dev/fd0
Blocks: 2880 total 0 avail [512-byte blocks]
Files : 0 total 0 avail
Type : blk-fd
Flags : 00000001 [rdonly]
Option:
/dev/hd0
Blocks: 16777216 total 0 avail [512-byte blocks]
Files : 0 total 0 avail
Type : blk-hd
Flags : 00000000 []
Option:
Рассмотрим первые 2 устройства:
9. Способы формирования ссылок
Скрипт, подсчитывающий и перечисляющий все символические ссылки на файл в разных каталогах:
#! /bin/sh
if [ $# -lt 1 ]
then
echo $0: error: File not specified
else
filename=$1
ls -lRa / | grep $filename$ | grep ^l > symlinks.txt
echo -n total >> symlinks.txt
wc -l symlinks.txt | cut -c1-9 >> symlinks.txt
fi
Команда wc подсчитывает число слов, байт или строк в файле.
Создадим несколько символических ссылок на файл отчёта и запустим скрипт:
# ln -s /home/SPO/Lab2/otchet2.txt /symlink1
# ln -s /home/SPO/Lab2/otchet2.txt /home/SPO/symlink2
# ln -s /home/SPO/Lab2/otchet2.txt /root/symlink3
# ./script9 otchet2.txt
# cat symlinks.txt
lrwxrwxrwx 1 root root 26 Dec 26 20:39 symlink1 -> /home/SPO/Lab2/otchet2.txt
lrwxrwxrwx 1 root root 26 Dec 26 20:39 symlink2 -> /home/SPO/Lab2/otchet2.txt
lrwxrwxrwx 1 root root 26 Dec 26 20:40 symlink3 -> /home/SPO/Lab2/otchet2.txt
total 3
10. Утилита file
Определяет тип файла. Для этого она выполняет разные тесты, которые можно разделить на 3 группы:
Первый тест, который завершится успешно, выводит тип файла. Типы файлов можно разделить на 3 основные группы:
Синтаксис:
file [-bcLnvz] [-f namefile] [-m magicfile] file ...
Опции:
Посмотрим, как выглядят дампы памяти файлов разных типов:
# file gateway
gateway: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
# od -t c gateway | head -n 2
0000000000 177 E L F 001 001 001 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000000020 002 \0 003 \0 001 \0 \0 \0 \0 004 004 \b 4 \0 \0 \0
# file ../Lab1/prog1
../Lab1/prog1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
# od -t c ../Lab1/prog1 | head -n 2
0000000000 177 E L F 001 001 001 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000000020 002 \0 003 \0 001 \0 \0 \0 130 003 004 \b 4 \0 \0 \0
# file filetypes.txt
filetypes.txt: ASCII text
# od -t c filetypes.txt
0000000000 E x i s t i n g 040 t y p e s 040 o
0000000020 f 040 f i l e s 040 o n 040 t h i s 040
0000000040 c o m p u t e r : 040 - 040 b 040 c 040
0000000060 d 040 l 040 n 040 s \n
0000000070
Если сравнить дампы памяти двух разных исполняемых файлов, то можно увидеть, что первые байты в них совпадают. Именно в них и записано магическое число. В дампе памяти обычного текстового файла содержится только ASCII текст, и никаких магических чисел там нет.
11. Минимальные права доступа необходимые для выполнения наиболее часто используемых операций:
Команда |
Необходимые права доступа |
|
Для обычного файла |
Для каталога, содержащего файл |
|
cd /home/dm |
- |
x |
ls /home/dm |
- |
r |
ls -l /home/dm |
- |
rx |
cat myfile.txt |
r |
x |
cat>>myfile.txt |
w |
x |
./script1 |
rx |
X |
./prog1.out |
x |
X |
rm myfile |
- |
wx |
сp ./file1 ./copy1 |
r |
wx |
mv ./file1 ./file2 |
- |
Wx |
Выводы:
При выполнении данной лабораторной работы были изучены принципы организации файловой системы ОС QNX и получены навыки работы с ней.
Существует 6 типов файлов: обычный файл, каталог, специальный файл устройства, именованный канал (FIFO), символическая ссылка и сокет.
Каждый файл имеет уникальный индексный дескриптор, указывающий на метаданные этого файла, в которых содержится служебная информация о файле (расположение данных файла на диске, владелец файла и права доступа к файлу).
Утилита od позволяет просмотреть дамп памяти файла в разных форматах.
Были рассмотрены все возможные способы формирования ссылок.
Утилита find позволяет искать файлы по заданным критериям и производить заданные действия с найденными файлами.
Атрибут SUID, установленный на исполняемом файле, позволяет любому пользователю, который запустил этот файл, совершать действия от имени владельца файла. Это может быть использовано, например, когда обычный пользователь желает изменить свой пароль.
Утилита df позволяет получить информацию о файловой системе, а утилита file определить тип файла.