Источник: qqqqqqqqqqq.ru
Введение
Данный материал будет полезен вам, независимо от того, какую профессию вы выбрали: системный администратор, специалист по информационной безопасности или программист.
Linux — известная серверная операционная система. Большинство веб-сайтов и веб-сервисов работают именно на ней. Независимо от того, какой язык используется для реализации сервиса — PHP, Python или Java — скорее всего, система работает под управлением Linux. Если вы планируете разрабатывать решения на одном из вышеперечисленных языков, надо понимать, что для успешной разработки среда, в которой вы разрабатываете, должна совпадать со средой, где ваш продукт будет работать. Поэтому, если вы используете Windows, хорошим решением будет установить не веб-сервер на вашей ОС, а виртуальную машину и в ней выбрать и настроить такую же операционную систему, как та, что будет работать в production. Для production скорее всего, понадобится сервер. Для решения большинства задач надо использовать не shared-хостинг, а полноценную ОС, пусть и виртуализированную. Обычно хостинг-провайдеры продают такие решения под названием VDS — Virtual Dedicated Server или VPS — Virtual Private Server. Чтобы суметь настроить систему для своего проекта, все это надо знать.
В крупной компании настройкой занимаются системные администраторы, но вам нужно в общих чертах понимать, как это делается, и суметь настроить для домашнего использования.
Специалист по информационной безопасности сможет найти изъяны в системе, кроме того, для использования профессиональных инструментов, которые предназначены для работы в Linux, необходимо знакомство с операционной системой.
Есть облачные решения Linux и для Data Science. В основном они базируются как раз на Linux-машинах, благодаря стабильности и надежности операционной системы.
Отдельно стоит упомянуть разработчиков iOS. Система Mac OS основана на UNIX, как и GNU/Linux. Многое, что есть в Linux, есть и в MAC OS X. Кроме того, Mac OS непосредственно содержит компоненты GNU (bash и утилиты). Для работы с Xcode необходимо знакомство с системой.
Если вы работаете с Mac, мы рекомендуем установить VirtualBox (VMWare работает только для Windows/Linux) и в нем запускать Ubuntu 16.0. Вы вскоре сами поймете, что многие вещи можно делать и непосредственно в Mac и его терминале.
Также вы познакомитесь с регулярными выражениями, которые полезны для любой профессии, будь то сисадмин, тестировщик или программист.
Особо отметим, что на последнем занятии мы разберем Git и Docker. Git — инструмент контроля версий, используемый большинством программистов для совместной работы. Он дружит с Linux не случайно, ведь его тоже разработал легендарный Линус Торвальдс. А завершит наше знакомство с Linux экскурс в Docker.
Ничего страшного, если до этого вы не имели опыта с Linux. Курс ориентирован на начинающих пользователей Linux. Он даст основы работы с операционной системой и навыки взаимодействия с командной строкой, а также представление об автоматизации и написании скриптов. Курс рассчитан на изучение Unix-подобной архитектуры с нуля. Но все же будьте готовы к совершенно неожиданным и непривычным методам работы. Концепция администрирования Linux сильно отличается от концепции «администрирования мышкой» Windows.
Что такое Linux
Linux или GNU/Linux — популярная операционная система (ОС), которая распространена как серверная ОС, но имеет и другие области применения. Более точно — это целое семейство операционных систем. Они базируются на двух китах:
- GNU — UNIX-подобное операционное окружение, которое состоит из утилит, операционной оболочки и ее команд, а также средств разработки, прежде всего, ‒ коллекции компиляторов gcc;
- Linux — ядро операционной системы, по имени которого часто называется и вся ОС.
Если в ОС Linux используется графический режим, появляется еще одна особенность:
- X Windows System — оконная система, реализующая клиент-серверную модель.
Одно из главных свойств и достоинств операционной системы — открытость. Поэтому часто применяются и другие компоненты, разработанные независимыми людьми и группами разработчиков.
Вокруг наименования ОС существует спор. Наиболее распространенные варианты:
- Linux. Подразумевается, что не только ядро носит такое название, но и вся ОС целиком;
- GNU/Linux. На этом варианте настаивает Ричард Столлман, основатель проекта GNU. Он подчеркивает, что операционная система — не только ядро Linux, но и многие важные компоненты, которые в ней используются, в частности, проект GNU.
У каждого из подходов есть аргументы как за, так и против. Существуют операционные системы на ядре Linux, в которых нет GNU: Android или Open webOS. Кроме того, ОС — не только ядро Linux и окружение GNU, но и множество других компонентов: X Windows System, Systemd и т.д. Полное их перечисление сделало бы название слишком громоздким.
Мы будем считать наименования Linux и GNU/Linux синонимами. Когда будет идти речь о ядре Linux, укажем на это отдельно.
Достоинства Linux
GNU/Linux как операционная система — это:
- UNIX-подобная ОС. Это значит, что архитектура, идеология и удобство работы напрямую исходят из истории и архитектуры UNIX-систем. Усвоив архитектуру Linux, просто перейти к работе с другими UNIX-подобными ОС: FreeBSD, OpenBSD, OpenSolaris, Mac OS X.
- Многопользовательская операционная система с удачной реализацией управления пользователями и правами, благодаря подобию UNIX.
- Многозадачная операционная система, которая использует механизмы защиты процессора. Ядро Linux изначально было написано под процессор Intel 80386. Поэтому, в отличие от DOS и Windows 9x, в GNU/Linux не нужно было обеспечивать совместимость в ущерб надежности. В процессоре Intel 80386 уже стала классической полноценная поддержка колец защиты процессора. Это система впервые появилась в процессоре 80286 и позволяла отделить код ядра операционной системы от кода приложений. До этого весь код выполнялся в одном режиме, имея доступ ко всем ресурсам. Поэтому, например, DOS мог напрочь зависнуть в результате ошибки в прикладной программе. Очень долго Microsoft в целях совместимости приходилось поддерживать выполнение определенных фрагментов пользовательского кода на уровне ядра и в Windows. Это приводило к появлению синего экрана смерти и необходимости перезагрузки. В Linux не было необходимости поддерживать старый код, потому что операционная система сразу использовала механизмы защиты процессора и сейчас является довольно устойчивой и надежной. Kernel panic — сообщение-аналог синего экрана смерти в WIndows, которое говорит о крахе ядра, в Linux можно увидеть очень редко. Разве что в процессе отладки драйверов для Linux, работающих как модули ядра.
- Сетевая операционная система, реализующая стек TCP/IP на уровне ядра и обладающая широким набором сетевого программного обеспечения: веб-сервера, почтовые сервера, системы мониторинга и т.д. и т.п.
- Свободная операционная система. Linux распространяется по лицензии GNU GPL, которая, с одной стороны, позволяет распространять ОС бесплатно, а с другой — обязывает предоставлять исходные коды. Это делает разработку, поиск ошибок и их исправление прозрачными и надежными. Поэтому многие решения для Linux являются опробованными и надежными, а найденные уязвимости быстро закрываются сообществом. Далеко не всегда то же самое можно сказать о проприетарном (собственническом) программном обеспечении. Но есть и Enterprise-решения — коммерческие решения, созданные на базе свободного Linux. Самый известный пример — Red Hat. Основа остается бесплатной, но производитель может добавлять дополнительные услуги и решения, платную поддержку. Иногда встречается и откровенное нарушение лицензии GPL, когда ОС полностью продается без поставки исходного кода, например Linux XP и, возможно, МСВС. Тем не менее, большая часть операционных систем Linux остается открытой, и даже у коммерческих версий есть функциональные аналоги, например Centos для Red Hat. Но в таком случае система используется на свой страх и риск — поддержки от производителя нет.
- Надежная операционная система. В Linux продуманная система прав, наследуемая из UNIX. Linux не отягощена наследием неверного использования модели безопасности, как Windows, где система безопасности не используется в полную меру из соображений совместимости. Наконец, Linux — прозрачная система, где быстро закрываются все уязвимости. Все вместе это дает надежную систему, на которую всегда можно положиться.
- Операционная система, дающая полный контроль пользователю. Linux позволяет системному администратору или разработчику полностью управлять операционной системой: разрабатывать скрипты и автоматизировать рутинные действия. Здесь и возможности командной строки, и использование конвейеров и виртуальных файловых систем с доступом ко всем параметрам ядра ОС, процессов и устройств.
- Опробованная система с широким опытом внедрения. Linux лидирует в мире серверного программного обеспечения, а также используется на десктопах, в т.ч., во встраиваемом программном обеспечении. Это дает огромный пользовательский опыт в технологическом и специализированном программном обеспечении, сформированные пользовательские сообщества. Благодаря этому, во-первых, есть уверенность, что решение испытано, а во-вторых, можно обращаться к пользовательскому опыту в случае возникновения сложностей.
- Операционная система с возможностью работы в графическом оконном режиме. Механизм X Windows Server в Linux вместе с SSH позволяет реализовать даже удаленное выполнение оконных приложений. Это удобнее, чем, например, механизм RDP. Кроме того, он включает набор сред рабочего стола, например, Gnome, KDE, и позволяет выбрать систему рабочего стола по вкусу. При этом приложения выполняются независимо от используемой среды. И, наконец, проект Wine в Linux реализует трансляцию вызовов WinAPI в системные вызовы ядра и тем самым позволяет запускать в оконной среде Linux приложения Windows.
- Операционная система с возможностью виртуализации. Набор механизмов Linux позволяет как изолировать пользователей и процессы (как cgroups и chroot), так и запускать гостевые ОС на хост-системе. Для этого используются механизмы виртуализации на уровне ядра, например kvm (в том числе и для Windows-машин), либо контейнерная виртуализация, то есть на уровне ОС, когда запускаются в гостевом режиме другие экземпляры Linux. Например, это LXC или OpenVZ.
Инструменты
Нам понадобятся:
- виртуальная машина VirtualBox или VMWare Player;
- образ диска с Ubuntu 16.0;
- дополнительные инструменты для Windows, которые перечислены в разделе «Ресурсы».
Сносить Windows и устанавливать вместо него Ubuntu лучше не стоит. Могут возникнуть сложности в работе с вебинаром, а чтобы корректно настроить систему, может не хватить опыта. Потому настоятельно рекомендуем незнакомые операционные системы ставить на виртуальной машине и изучать их, прежде чем переходить к использованию на десктопах или ноутбуках.
История Linux
Финский студент Линус Торвальдс создал ядро Linux в 1991 году. Архитектура Linux как Unix-подобной системы имеет еще более давнюю историю.
1957 — Besys
В 1957 году (60 лет назад!) компания Bell Labs, которая изначально была подразделением компании AT&T, разработала операционную систему Besys (Bell Operating System) для компьютеров IBM 704. Система не предназначалась для широкого выпуска и использовалась для собственных нужд в подразделениях Bell Labs. Руководителем проекта по созданию BESYS был Виктор Высотский. Он также принял участие в следующем проекте MULTICS, для создания которого опыт разработки BESYS стал отправной точкой. В 1964 году появились компьютеры третьего поколения, для которых возможности BESYS уже не подходили.
1964 — Multics
В 1964 году Массачусетский Технологический Институт (MIT), General Electric (GE) и Bell Labs принялись за разработку операционной системы, названной Multics (Multiplexed Information and Computing Service). Система работала на 36-битных вычислительных машинах GE-600. Это была передовая для своего времени операционная система. В Multics были впервые реализованы идеи, которые теперь используются в операционных системах повсеместно:
- динамическое связывание исполняемой программы с библиотеками (dynamic linking);
- процессы-демоны (daemon);
- возможность осуществления горячей замены оборудования;
- поддержка привилегий пользователя;
- символические ссылки (symlink) для директорий;
- использование стеков для каждого из процессов с отдельным стеком для каждого из уровней безопасности ядра.
Такой подход с использованием стеков применяется в современных ОС и процессорах, когда ядро работает в одном уровне безопасности, а пользовательские программы — в другом. Переключение контекста реализуется в том числе и с подобным использованием стеков.
Компьютер IBM 704 в NASA в 1957 году. Для таких компьютеров была создана BESYS.
1969 — Unics
В 1969 году компания Bell Labs, не увидев коммерческого потенциала у системы Multics, вышла из проекта. Многие участники Multics перешли в команду Unics. Название «Unics» было связано с названием предшественника — «Multics». Буква U означала «Uniplexed» («односложная») в противоположность слову «Multiplexed» («комплексная»), лежавшему в основе названия системы Multics. Это подчеркивало попытку отойти от сложностей системы Multics для выработки более простого и работоспособного подхода. Первая версия была написана Кеном Томпсоном для более скромной в плане аппаратного обеспечения машины — DEC PDP-7. Эта версия, написанная на языке ассемблера, является первой официально выпущенной версией UNIX, как впоследствии стали называть операционную систему.
1970 — UNIX
Наступила эпоха UNIX. И сейчас время в UNIX-подобных системах исчисляется в количестве секунд, прошедших с полуночи (00:00:00 UTC) 1 января 1970 года. Запомните это.
Создатели UNIX ‒ Кен Томпсон и Деннис Ритчи.
В 1969 году Кен Томпсон и Деннис Ритчи разработали язык B — упрощенный вариант разработанного ранее интерпретируемого языка BCPL. В 1972 году UNIX был переписан на B, а к 1973 году уже был разработан компилируемый язык C. Он был создан на основе B, что позволило встроить компилятор C в состав UNIX, а в дальнейшем уже переписать на C и ядро операционной системы. В 1975 году UNIX был полностью переписан на C — так называемая пятая редакция.
1978 — BSD UNIX
UNIX распространяется по университетам. В 1973 году Университет Беркли получил код UNIX от компании AT&T. Из-за антимонопольной политики государства AT&T не может развивать UNIX как коммерческий продукт и в попытке обойти это ограничение распространяет код по университетам, среди которых и Беркли.
В 1978 году в университете создана версия BSD UNIX.
В 1980 годах в BSD реализован механизм Сокетов Беркли для поддержки стека TCP/IP, являющийся классическим решением.
1983 — AT&T UNIX System V
AT&T прекрасно понимала коммерческий потенциал UNIX. В 1983 году выходит коммерческая версия System V, основанная на наработках Bell Labs. Система включала редактор vi и curses из BSD UNIX, работала на машинах DEC VAX. В противовес BSD UNIX, вставшего на путь реализации стека TCP/IP, в System V попытались реализовать интерфейс транспортного уровня TLI, ориентированный на модель OSI/ISO. В дальнейшем пришлось включить поддержку TCP/IP.
Компании лицензируют у AT&T UNIX System V, создавая свои ОС: AIX, HP-UX, Solaris, IRIX.
1983 — проект GNU
В 1983 году Ричард Столлман объявляет о создании проекта GNU — свободной реализации UNIX-подобной операционной системы. Первыми программами среды стали редактор Emacs и коллекция компиляторов GCC. В 1990 году была начата разработка ядра для GNU — GNU/Hurd. Но судьба распорядилась по-другому. Есть сборки ОС GNU на этом ядре, например Debian GNU/Hurd и Arch Hurd, но они представляют скорее исследовательский интерес, чем практический. Появление ядра Linux сделало разработку ядра Hurd низкоприоритетной и малоинтересной.
1985 — NextStep
Примечательным событием, породнившим в дальнейшем UNIX и Apple, стало создание Стивом Джобсом, на тот момент бывшим сотрудником Apple, операционной системы NextStep. Она была разработана как UNIX-подобная ОС и имела определенного родство с BSD UNIX. Эта система потом легла в основу MAC OS X. Благодаря этому многие инструменты, которые мы изучим, будут применимы и в MAC OS X.
1987 — MINIX
В 1987 году Эндрю Таненбаум, преподаватель Амстердамского свободного университета, разработал учебную операционную систему MINIX как иллюстрацию к книге «Операционные системы: Разработка и реализация». Чтобы оставить код ОС доступным для изучения в течение семестра, Эндрю Таненбаум отвергал предложения усовершенствовать MINIX или принять патчи, которые поступали от читателей его учебника. Это послужило одной из причин появления ядра Linux.
Отметим, что MINIX обладала микроядерной архитектурой и при этом была UNIX-подобной операционной системой.
1991 — Linux
Финский студент Линус Торвальдс всерьез заинтересовался книгой Таненбаума «Операционные системы: разработка и реализация». Он купил компьютер с процессором Intel 80386 и поставил MINIX. Обнаружив недостатки, Линус принялся их исправлять и реализовал переключатель задач для терминала. В итоге у него получилось нечто большее, чем MINIX. Он обратился к сообществу с вопросом, какие функции они хотели бы видеть в MINIX, и реализовал их в новом, тогда еще не названном ядре. Исходный код Линус выложил на всеобщее обозрение. Ядро требовало имени, и его назвали в честь Торвальдса. Так появилось ядро Linux.
Эндрю Таненбаум раскритиковал ядро. Он считал, что монолитная архитектура, каковой и была архитектура Linux, ненадежна, а также предрекал скорую кончину процессорам архитектуры x86. Таненбаум ошибся дважды, Linux начал победное шествие по планете.
Сам Линус Торвальдс утверждал, что если бы в 1991 году было бы доступно ядро GNU либо ядро BSD, которое тогда еще не было опубликовано из-за юридических проблем, он, скорее всего, не написал бы Linux.
Наши дни — GNU/Linux
Первоначально Торвальдс использовал окружение и утилиты MINIX, благодаря UNIX-подобной архитектуре. Но чтобы в дальнейшем иметь возможность использовать Linux как полноценную операционную систему, Линус стал использовать лицензию GPL. Это позволило воспользоваться утилитами и инструментами GNU. Для работы над ядром Линус Торвальдс также создал Git.
GNU/Linux — уникальное явление, поскольку над ядром и над операционным окружением работали разные, не связанные между собой, команды. Тем не менее многие дистрибутивы свободной операционной системы базируются как раз на наработках этих двух команд.
В настоящее время существует большое число Linux-дистрибутивов, и не все из них полностью свободные. Несмотря на лицензию GPL, существуют определенные лазейки, которые позволяют получать деньги с пользователей за дополнительные возможности. А есть и случаи, когда разработчики создавали полностью платные дистрибутивы, например Linux XP, требующие активации по аналогии с Windows.
Частично дерево развития UNIX-подобных систем можно увидеть здесь.
Популярные операционные системы Linux
Большинство (но не все) дистрибутивы происходят от двух известных китов — Debian и Red Hat. Есть независимые от них операционные системы — SUSE. Различия операционных систем не всегда основываются на том, от какой системы кто произошел. Так, Ubuntu 14 и CentOS 6 используют систему инициализации Upstart, а Ubuntu 16 и CentOS 7 — Systemd, которые мы рассмотрим на пятом уроке. Тем не менее, файлы конфигурации сетевых интерфейсов, например, в Ubuntu одни, в CentOS — другие (схожие с аналогичными в Red Hat и Mandrake).
В таких условиях наиболее важным механизмом, разграничивающим операционные системы, является система управления пакетами. Учитывая, что основных предков дистрибутивов два, наиболее популярные системы управления пакетами тоже исчисляются числом два.
Это:
- dpkg (расширение файлов .deb, для удобства работы используется apt) — в основанных на Debian дистрибутивах (но не обязательно, система может быть привнесена и в дистрибутивы иного происхождения);
- rpm (расширение файлов .rpm, для удобства работы используется yum) — в основанных на Red Hat дистрибутивах.
Итак, классификация:
- deb-пакеты
- Debian
- Ubuntu — один из популярных дистрибутивов.
- Kubuntu.
- Lubuntu, Xubuntu — благодаря легковесной графической оболочке используются на слабой/морально устаревшей технике.
- Xandros, ✝ — для ноутбуков Asus Eee.
- Идеологические версии, отличающиеся обоями и прикладными программами.
- Христианский Linux.
- Мусульманский Linux.
- Научный Linux.
- много…
- Linux Mint.
- Kali Linux — дистрибутив, ориентированный на проведение тестов на безопасность сети.
- rpm-пакеты.
- Red Hat, $.
- Centos — один из популярных дистрибутивов.
- Mandrake, ✝.
- Mandriva.
- Fedora.
- LinuxXP, $✝.
- Pidora — Fedora для Raspberry — одноплатного компьютера, в том числе пригодного и для встраиваемых систем.
- МСВС (Мобильные системы вооруженных сил), $.
- Заря, $.
- SLS — одна из первых операционных систем на базе ядра Linux, в первой версии используемой файловой системой была MINIX.
- Slackware (дистрибутивы распространяются тарболлами .tar.gz).
- SUSE Linux.
- Open SUSE (добавилась возможность использовать rpm).
- ArchLinux (с собственной системой packman) — один из популярных дистрибутивов.
- Gentoo (популярна благодаря оптимизации под конкретное аппаратное обеспечение).
- OpenWrt — Linux для маршрутизаторов и встраиваемого оборудования, прежде всего от Lincsys (поддерживает пакетные менеджеры ipkg/opkg).
- X-Wrt — развитие, ориентированное на конечного пользователя.
- DebWrt — проект запуска Debian на роутерах, поддерживающих OpenWrt.
- и т.д.
Примечания:
- $ — проприетарный или коммерческий Enterprise-дистрибутив;
- ✝ — система мертва и не развивается.
Сетевые возможности
Спор между IBM и Microsoft привел к рождению двух ветвей изначально одной операционной системы — OS/2 и Windows NT. Спор об архитектуре (микроядерная или монолитная) между Эндрю Таненбаумом и Линусом Торвальдсом решило само время. Спор между System V и BSD, в частности, касался используемого сетевого стека, TCP/IP или OSI/ISO.
Что нужно знать начинающему пользователю Linux?
Компьютеры, работающие в сети, взаимодействуют благодаря IP-адресам. IP-адрес позволяет глобально идентифицировать ЭВМ в сети, где бы компьютер ни находился. Если вы в Москве, ваш компьютер с IP-адресом 1.2.3.4 подключен к Интернету, вы можете установить связь с компьютером, находящимся, скажем, в Лос-Анджелесе, и имеющим IP-адрес 130.140.105.1
IPv4-адрес (как правило, используются адреса IP версии 4, хотя постепенно и осуществляется переход на IPv6) состоит из 4-х чисел (байт), именуемых октетами, и записываемых, как правило, в десятичной системе счисления. Есть специальные IP-адреса (адреса сетей и широковещательные адреса), но большинство IP-адресов служат для идентификации хостов, то есть неких машин (не важно, в роли клиентов или серверов они выступают). Машина, которая предоставляет некие услуги, обычно именуется сервером, машина, которая запрашивает эти услуги, выступает клиентом. Терминология клиент-сервер применяется как к аппаратному обеспечению (ваш ноутбук будет выступать клиентом, а компьютер-сервер в серверной стойке в дата-центре, соответственно, сервером), так и к программному (например, если веб-сервером выступает Apache или Nginx, роль клиента на вашем компьютере будет играть Google Chrome или, например, Mozilla Firefox).
Для подключения к серверу используется IP-адрес. Но на практике часто в качестве адреса сервера используются доменные имена: geekbrains.ru, yandex.ru, google.com, linkedin.com. Доменные имена благодаря распределенной системе DNS преобразуются в IP-адреса. То есть, когда вы в браузере вбиваете имя geekbrains.ru, ваш компьютер, выступая в роли DNS-клиента, обращается к DNS-серверу (предоставленному провайдером или настроенному вами вручную), чтобы узнать, на какой IP-адрес должен подключиться браузер в роли http-клиента. Выяснив, что IP-адрес, соответствующий доменному имени geekbrains.ru — 5.61.239.22, браузер подключится к серверу, обращаясь к машине с IP 5.61.239.22. Сообщения, которыми будут обмениваться клиент и сервер, адресуемые на IP-адреса отправителя и получателя (похоже на телеграммы, не правда ли?), именуются IP-пакетами (и иногда IP-дейтаграммами). IP-пакеты могут проходить несколько маршрутизаторов, компьютеров или устройств, определяющих дальнейший путь в соответствии с таблицами маршрутизации. Это обеспечивается, в частности, тем, что часть IP-адреса составляет адрес сети, а часть — идентификатор хоста. Например, для некоего условного адреса IP 199.20.30.5 — 199.20.30 — компонент, который указывает на сеть, а 5 — на конкретную машину в данной сети.
Не все адреса могут маршрутизироваться. Например, пакет, направленный на адрес 127.0.0.1, никогда не покинет машину. Он будет доставлен другому приложению, находящемуся на данной машине. Стоит отметить, что это тоже нормальный способ использования, например, PHP-скрипт, выполняемый на сервере, может обращаться к приложению MySQL, находящемуся на той же машине, используя адрес 127.0.0.1. Такой адрес называется локальная петля. Для таких целей может использоваться любой IP-адрес, начинающийся с 127.
Есть адреса, которые используются для локальных сетей. Вы можете объединить несколько машин в локальную сеть и использовать адреса из диапазонов таких сетей, например 192.168.1.X или 10.X.X.X — и машины смогут обмениваться между собой информацией. Но нельзя обратиться на машину с адресом 192.168.1.1 из сети Интернет. Более того, и обратное не было бы верным без специальных средств. Если вы посмотрите настройки TCP/IP-соединения, то обнаружите, что, скорее всего, у вас тоже используется адрес из такого диапазона. Но как тогда осуществляется выход в сеть?
Если вы зайдете на сайт вроде myip.ru, то увидите, что адрес, под которым вы видны указанному серверу, не совпадает с вашим собственным IP-адресом, указанном в настройках TCP/IP-соединения. Это означает, что ваш провайдер маскирует адреса, подменяя их своим внешним IP-адресом, запоминая, с какого компьютера был осуществлен какой запрос, и заменяя IP-адрес получателя со своего на ваш при прохождении ответа. Обладая «серым» IP-адресом при использовании механизма трансляции адресов (NAT), вы можете обращаться к другим серверам, но внешние машины не смогут инициировать соединение к вашей машине как к серверу.
Следующий вопрос — как сервисы определяют, какое приложение на какой запрос должно реагировать. Ведь один и тот же сервер может отдавать и веб-страницы, и файлы по протоколу http, и почту по протоколу SMTP. Более того, если вы администрируете сервер, наверняка вам понадобится доступ к нему по протоколу VNC или ssh.
Соответственно, протокол — некий набор правил, который определяет, как то или иное приложение (сервер или клиент) будет взаимодействовать с аналогичным (клиентом или сервером) по сети. Для веб-содержимого используются протоколы HTTP и HTTPS (шифрованный HTTP), для работы с файлами — FTP и FTPS (шифрованный FTP), для администрирования — шифрованный SSH и SFTP (надстройка над SSH, реализующая схожий с FTP доступ к файлам).
Теперь осталось понять, каким образом сервер понимает, какому приложению следует отдать тот или иной пакет. Для этого используются порты. Порт — число от 0 до 65535, которое используется для идентификации приложения. Существует 65535 TCP-портов, служащих для надежных соединений, и 65535 UDP-портов, для которых надежное соединение не требуется. Одно приложение может использовать несколько портов. Например, веб-сервер обычно использует 80 TCP-порт для установки незашифрованного соединения по протоколу HTTP и 443 TCP-порт для установки шифрованного соединения по протоколу HTTPS. Для удаленного администрирования по протоколу SSH (и его составной части SFTP) используется 22 TCP-порт. Соответственно, если вы купите VDS-сервер и будете его администрировать (с помощью клиента ssh в Linux или Mac OS X, либо с помощью PuTTY в Windows) вам понадобится указать: доменное имя (или IP-адрес) вашего сервера, номер порта, по которому запущен сервер ssh (обычно 22), ваши логин и пароль от операционной системы. Кстати, система DNS для преобразования доменных имен в IP-адреса (и не только) использует UDP-порт с номером 53.
Мы рассмотрели упрощенно модель TCP/IP.
Она состоит всего из четырех уровней:
- 4 уровень — прикладные протоколы (DNS — 53 UDP-порт, HTTP — 80 TCP-порт, HTTPS — 443 TCP-порт, SSH и SFTP — 22 TCP-порт). Реализуют набор правил взаимодействия приложения-клиента и приложения-сервера.
- 3 уровень — транспортные протоколы (UDP — протоколы без подтверждений, TCP — протоколы с установкой соединения и надежной доставкой). Именно транспортные протоколы в заголовках содержат номера портов, позволяя идентифицировать приложения.
- 2 уровень — сетевой — протокол IP. Заголовок содержит IP-адреса отправителя и получателя, позволяя идентифицировать машину-отправителя и машину-получателя.
- 1 уровень — межсетевые протоколы — реализуют доступ к физической среде передачи информации. В качестве примеров можно привести Ethernet и Wi-Fi.
Модель OSI/ISO более сложная, состоит из 7 уровней и не имеет однозначной трактовки применительно к используемым в сети Интернет-протоколам.
Знакомству с моделями TCP/IP и OSI/ISO посвящен курс «Введение в TCP/IP», а использованию сетевых возможностей Linux — «Linux: серверное ПО».
Виртуализация
Виртуализация — механизм, который позволяет гибко использовать аппаратные возможности машины. Например, у вас имеется два приложения, одно активно использует диск, другое — процессор. Друг другу не мешают, так как не конкурируют за аппаратные возможности. Но еще более гибко можно работать, если запускать на одной машине не два процесса, а две или более операционных систем. Такую возможность дает виртуализация. Виртуализацию не следует путать с эмуляцией, код виртуализированной (гостевой) операционной системы выполняется на процессоре исходной машины (в операционной системе-хосте). При этом виртуализация позволяет гибко управлять виртуальными машинами, добавляя дополнительную безопасность (изолируя процессы и ресурсы внутри виртуальных машин), позволяя гибко перемещать виртуальные машины между машинами-хостами.
Виртуализация позволяет запускать на одном компьютере несколько параллельно исполняющихся операционных систем, более того, в работе несколько виртуальных машин выглядят аналогично, как если бы работали несколько аппаратных машин. Это достигается, в частности, благодаря предоставлению гипервизором (компонентом или программой операционной системы хоста, управляющей виртуальными машинами) интерфейса доступа к оборудованию, создавая внутри виртуальной машины «виртуальное оборудование», определенным образом связанное с реальным. Как правило, виртуальные машины наделяются IP-адресами («серыми» или «белыми», в зависимости от задач), что позволяет взаимодействовать виртуальным машинам между собой, хостам и виртуальным машинам, виртуальным машинам и любым другим, в локальной сети или интернете, если туда есть доступ. Обращаясь к удаленному компьютеру по адресу 5.61.239.22, вы даже не знаете, это адрес на физическом сетевом интерфейсе или виртуальный сетевой интерфейс в виртуальной машине.
Существует несколько подходов по организации виртуализации.
Технологии виртуализации
Трансляция вызовов
В данном случае код гостевой операционной системы выполняется процессором так же, как и код операционной системы-хоста, но при этом происходит определенное управление исполняемым кодом. Одни операции (например арифметика) отправляются процессору на выполнение непосредственно, другие (трансляция системных вызовов или обращение к оборудованию) подменяются гипервизором на иные инструкции.
Аппаратная виртуализация
В данном случае процессор позволяет гипервизору задавать контекст виртуальных машин, что упрощает переключение кода между гостевым кодом и кодом хоста. Существует несколько неродственных систем виртуализации — Intel VT и AMD-V.
Паравиртуализация
Тот случай, когда для упрощения работы в виртуальной машине запускается не оригинальная операционная система, а слегка измененная. Как правило, речь идет о модификации ядра. Таким образом, операционная система «знает», что она выполняется не на аппаратной платформе, а в условиях виртуальной машины, что позволяет добиться еще лучшей производительности и интеграции с операционной системой-хостом. Не всегда такое представляется возможным, например, для виртуализации Windows. Тем не менее, и при запуске неизмененного ядра операционной системы доступна частичная виртуализация за счет установки специальных утилит, демонов и драйверов, которые рассчитаны на работу с виртуальным оборудованием.
Контейнерная виртуализация
Очень сильно отличающаяся от всего вышесказанного технология. Если используется одна и та же операционная система для виртуализации (либо родственные системы), можно изолировать процессы, пользователей, создать изолированные разделы на дисках, отдельные виртуальные сетевые интерфейсы. В этом случае каждая из таких «групп» представляет своего рода изолированный клон виртуальной системы. Такой механизм называется контейнерной виртуализацией. Все экземпляры виртуальных машин используют одно и то же ядро операционной системы хоста, но операционное окружение каждой из них изолированно, обладает своими пользователями, настройками, IP-адресами, операционными системами. Такой подход позволяет, например, на одном ядре Linux запускать разные операционные системы (Debian и Red Hat например). Таким образом достигается наилучшая производительность, но, с другой стороны, виртуальные машины могут в большей степени конкурировать за аппаратные ресурсы (которые при контейнерной виртуализации превращаются в своего рода коммунальные ресурсы, а не сразу выделяются, как у вышестоящих способов).
Примеры виртуализирующих технологий
Популярные и часто упоминаемые системы виртуализации:
- KVM — механизм, реализованный в ядре Linux, позволяющий запускать немодифицированные ядра ОС Linux, Windows, FreeBSD и т.д. Используется аппаратная виртуализация, Intel VT или AMD-V. Так как KVM — механизм ядра, для удобной работы требуется менеджер виртуальных машин, например, Virtual Machine Manager или ProxMox. KVM-виртуализация часто применяется хостинг-провайдерами для организации услуги VDS/VPS (Virtual Dedicated Server/Virtual Private Server).
- XEN позволяет запускать операционные системы с немодифицированным ядром (требуется аппаратная виртуализация Intel VT или AMD-V) либо с модифицированным ядром (паравиртуализация). Что интересно, возможен запуск виртуальной машины в режиме паравиртуализации внутри виртуальной машины, использующей аппаратную виртуализацию.
- OpenVZ — технология контейнерной виртуализации, по которой могут виртуализироваться только Linux-операционные системы. Как и KVM, также часто используется хостинг-провайдерами для организации услуги VDS/VPS. Стоит отметить, что в отличие от KVM или XEN, как и в другой контейнерной виртуализации, пользователь VDS не имеет возможности установить нестандартные модули ядра.
- LXC (Linux container) — технология контейнерной виртуализации, сходная с OpenVZ. ProxMox позволял работать с OpenVZ. C 4-й версии поддерживает LXC.
- Docker — также технология контейнерной виртуализации. Изначально использовалась LXC, теперь применяет собственную библиотеку виртуализации.
Серверная и клиентская виртуализация
Cерверная виртуализация применяется для более гибкой настройки веб-узлов, возможности их перемещения между физическим оборудованием (миграция), надежности, предоставления услуг VDS/VPS.
Но виртуализация возможна не только на серверной, но и на клиентской стороне. На стороне клиента виртуализация позволяет использовать возможности других операционных систем, не эмулируя и не транслируя системные вызовы (как это происходит с Wine в Linux, или в Linux-подсистеме в Windows 10), а запуская в качестве гостевой операционной системы. Это позволяет осуществлять разработку программных средств в одной системе, работая при этом в другой, использовать виртуальную машину в качестве песочницы для анализа вредоносного программного кода либо в целях обучения, не отказываясь от основной операционной системы. Мы будем применять виртуализацию для последней цели.
В Windows и Linux доступны VMWare Workstation/VMWare Player, для Windows, Linux и также в Mac OS X доступна система Oracle VirtualBox.
Крайне не рекомендуется для изучения Linux сносить вашу операционную систему (так как можно не суметь ее полноценно настроить, удалить по ошибке важные данные, а также не суметь прослушать вебинар из-за отсутствия поддержки Flash в браузере Chromium). Установите VMWare Player или VirtualBox. Также можете купить VDS c установленной ОС (Ubuntu) для параллельного изучения. Но такой способ рекомендуется как дополнительный, полноценная работа с ОС невозможна без понимания механизмов ее установки, запуска и работы с ядром (например, установка и удаление модуля ядра, что невозможно для контейнерной виртуализации).
Диски, дисковые устройства, разметка
Чтобы с диска можно было загружаться и хранить на нем программы и данные, он должен быть соответствующим образом подготовлен.
В дисковых операционных системах (CP/M, DOS, OS/2, Windows) диски и разделы на дисках именуются буквами (C: D: E:), файлы отсчитывают свой путь от буквы диска (C:\Windows\System32\Drivers\etc\hosts, D:\backup). В UNIX-подобных системах это не так. Есть виртуальная файловая система, к которой подключаются дисковые устройства, в одной иерархии. Скажем / — корень — это точка подключения (монтирования) виртуальной файловой системы, к ней подключается дисковой раздел, используемый файловой системой. CDROM здесь будет уже не E:, а /cdrom или /mnt/cdrom. Таким образом, файл, который в Windows выглядит как E:\autorun.inf, в Linux будет выглядеть как /cdrom/autorun.inf
Но /cdrom — это не имя устройства, равно как и E: — не имя и не тип устройства. Если в Windows E: может быть как CD-диском, так и разделом на жестком диске, так и в Linux CDROM может быть подключен (смонтирован) в /cdrom, /mnt/cdrom или /mnt/disk. Более того, в /mnt/disk может быть подключен (смонтирован) не обязательно CDROM, но и флеш-диск, и раздел на жестком диске, или даже сетевое хранилище.
В UNIX-подобных архитектурах имеется концепция, согласно которой все есть файл. Впрочем, подобная особенность была частично реализована и в DOS. В DOS имелись особые файлы устройств, не привязанные к файловой системе. Так как нельзя было создать файл с таким именем, они присутствовали в любой директории — con nul prn. Копирование файла в con выводило его на экран, в nul — не делало ничего, в prn — выводило на принтер. Попытка скопировать con в файл заставляла набирать строчки с клавиатуры, а команда copy nul file создавала в текущей директории пустой файл). Если вы работаете в windows, вы и сейчас можете выполнить команду:
c:\Users\Пользователь\> copy file1 c:\con
Строка 1
Строка 2
Строка 3
Вывод завершается комбинацией Ctrl-Z
^Z
c:\Users\Пользователь\> copy file1 c:\con
Кстати, обратите внимание, что в c:\ никакого con (как и nul, как и prn) нет. С тем же успехом можно было бы писать d:\con или просто con.
Ctrl-Z (^Z) в Windows посылает спецсимвол конец файла (EOF), после чего управление вновь возвращается в командную оболочку. В Linux Ctrl-Z имеет другое назначение, а чтобы послать EOF, используется комбинация Ctrl-D (^D). Запомните это.
Итак, мы узнали, что в DOS и WINDOWS есть специальные файлы устройств, которые якобы присутствуют в любой директории. Аналогичные устройства есть и в Linux, только, чтобы не замусоривать другие директории, для устройств в Linux есть специальная директория /dev.
Там аналогом con будет файл /dev/tty, аналогом nul — файл /dev/null, аналогом com1 — /dev/ttyS1.
Эта аналогия неспроста. Файлы устройств, как и многие утилиты для DOS, Билл Гейтс подглядел как раз в UNIX.
Все устройства, с которыми предполагается работа, в Linux (и других UNIX-подобных системах) находятся в директории /dev, в том числе и дисковые устройства. Например, /dev/hda, /dev/hda1, /dev/hdb, /dev/sda, /dev/sda1.
Что это такое, мы разберемся чуть позже. Кстати, в Windows тоже присутствует скрытый, не привязанный к диску, раздел \Devices, в котором тоже присутствуют аналогичные дисковые устройства. Во внутреннем представлении путь к файлу может выглядеть так \Devices\Harddisk0\Partition1\Windows\system32\imageres.dll.
Итак, если имеется диск, его можно задействовать под систему полностью. В DOS или Windows он будет выглядеть как диск C:
Что делать, если мы хотим установить две операционные системы? Даже две Windows себя не будут комфортно чувствовать в одном C:, что уж говорить о Windows и Linux, которые даже файловые системы используют разные. В Windows это, как правило, NTFS, в Linux, как правило, ext4.
Таким образом, нам надо сделать на одном диске два раздела. Если оба будут использоваться в Windows, на одном физическом диске будут присутствовать C: и D:. Если мы используем Linux, Windows будет видеть файлы в разделе C: и все, а Linux — файлы в своем разделе, смонтированные в корень /.
Каким образом осуществляется разбиение диска на разделы?
Все зависит от того, какая таблица разделов используется: GPT или содержащая MBR. Ранее все диски использовали MBR, сейчас все большее распространение получает GPT.
Диск с MBR — Main Boot Record (главная загрузочная запись) содержит исполняемый код, необходимый для передачи управления, загрузчик и таблицу разделов (partition table). Может содержать только 4 первичных (primary) раздела, а при необходимости большего количества разделов вместо одного из первичных можно создать расширенный раздел (extended partition). Такой раздел будет содержать внутри себя еще несколько (до 16) разделов, называемых логическими (logical). Есть определенные ограничения, связанные с созданием разделов и установленными на нем ОС. Например, Windows необходимо обязательно устанавливать в первичный раздел, помеченный как активный (загрузочный). Для разделов GNU/Linux таких ограничений сейчас нет.
MBR может работать только с дисками емкостью до 2 Тб, для больших дисков следует использовать GPT. GPT — более современный стандарт, который, кроме того, можно использовать и с дисками меньшей емкости.
Диски с GPT (GUID Partition Table) в отличие от MBR, больше не содержат загружаемый код в самом начале, эти функции отнесены к UEFI. Более того, GPT является частью стандарта UEFI. Блок MBR все равно присутствует в начале для совместимости и защиты от повреждения утилитами, не умеющими работать с GPT, но понимающими MBR. В совместимом MBR указан один раздел, охватывающий весь диск. Это сделано для предотвращения ошибочной разметки и форматирования диска программами, не распознающими GPT.
GPT не накладывает ограничений на разделы, поэтому понятия расширенных и первичных разделов не используются.
fdisk не будет работать с gpt, вместо него следует использовать gdisk. Можно использовать и gparted, но надо учитывать, что parted и gparted не могут увеличить размер раздела, если в его конец добавить неразмеченные блоки для расширения.
Если в Windows разделы именуются С:, D:, E: и т.д., в Linux диски именуются в формате /dev/hdX (для ATA) или /dev/sdX (для SATA), где X – буква. Но если в Windows принята нумерация с буквы C, так как A и B использовались для дисковода, здесь диски нумеруются с А. Для дисковода имеется устройство /dev/fd0. Первый HDD-диск будет иметь наименование /dev/sda, второй — /dev/sdb, третий — /dev/sdc.
Разделы обозначаются цифрами. Если два HDD будут в Windows иметь разделы с именами C:, D:, E:, вне зависимости от их местоположения, в Linux будут разделы /dev/sda1, /dev/sda2, /dev/sdb1, /dev/sdb2 и т.д. При этом имена с /dev/sda1 по /dev/sda4 предназначены для первичных разделов, логические разделы именуются /dev/sda5, /dev/sda6 и т.д.
Это не единственный подход именования в UNIX-подобных системах. Например, /dev/da0s1a, dev/da1s1b и т.д.
В загрузчике GRUB применяется свое именование разделов. Первый раздел /dev/sda1 будет иметь вид (hd0,msdos1), /dev/sda5 будет иметь вид (hd0,msdos5), /dev/sdb1 — (hd1, msdos1).
Пример разметки (система используется в Windows, тем не менее, даны наименования разделов и для Linux)