{"id":14428,"date":"2026-09-01T18:50:11","date_gmt":"2026-09-01T13:20:11","guid":{"rendered":"https:\/\/www.scaler.com\/blog\/?p=14428"},"modified":"2026-09-01T18:51:28","modified_gmt":"2026-09-01T13:21:28","slug":"linux-projects","status":"publish","type":"post","link":"https:\/\/www.scaler.com\/blog\/linux-projects\/","title":{"rendered":"15 Linux Projects to Go From Command-Line Beginner to Confident Power User"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">You can know the most common Linux commands and still be unsure about what to do when something goes wrong. You might know ps for checking processes, grep for finding information in command output, chmod for changing permissions, and systemctl for managing services, but when a script fails or a service stops, you still need to figure out where the problem is and what to check first.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hence, practicing with Linux projects, you\u2019ll have a reason to use those commands together. When you build a backup script, manage a service, or set up a server, the commands start fitting into actual tasks. A script can fail, a service can stop, or a backup can run without saving the file you expected. Each problem gives you a reason to investigate what happened and fix it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Linux project ideas in this guide start with Linux projects for beginners and gradually move into administration, servers, networking, and system-level work. There are 15 projects across four tiers, with each one showing what to build, the concepts involved, the expected time, and where you are likely to run into problems.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"why-building-beats-reading-and-what-%e2%80%9cfluent-in-linux%e2%80%9d-actually-means\"><\/span><strong>Why Building Beats Reading (And What &#8220;Fluent in Linux&#8221; Actually Means)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Learning the basic commands can help you understand where each command can be used while you build your project. When you run into a permissions issue, you can use ls -l to check ownership and access modes, while a failed service gives you a reason to look at journalctl and find out what went wrong. If a disk fills up, you can check mounts, disk usage, and running processes to narrow down the cause, and situations like these help you understand how different Linux commands fit together when you\u2019re solving a problem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">What should you be able to do once you have practised these situations enough? You should be able to look at a problem involving a process, service, filesystem, or network and work out what to check first, which command can give you the information you need, and what that result tells you about the problem. That is what being a confident Linux user looks like: you can investigate what is happening on the system instead of relying on a command list to tell you what to run.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Linux is used for web servers, cloud environments, databases, containers, and networking, so learning to manage processes, services, filesystems, and network connections gives you skills you can use when working with these systems. Linux systems dominate the TOP500 list, and W3Techs reports Linux on 62.1% of websites where the operating system is known. If you want to understand the platform itself, <a href=\"https:\/\/www.scaler.com\/topics\/features-of-linux-operating-system\/\">Features of Linux Operating System<\/a> covers its key features, while <a href=\"https:\/\/www.scaler.com\/topics\/advantage-and-disadvantage-of-linux\/\">Advantages and Disadvantages of Linux<\/a> explains where Linux works well and where you may run into limitations.<\/p>\n\n\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Scaler Carousel<\/title>\n\n<!-- Plus Jakarta Sans Font -->\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700&amp;display=swap\" rel=\"stylesheet\">\n<!-- Swiper CSS -->\n<link rel=\"stylesheet\" href=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.css\">\n\n<style>\n.scaler-carousel {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  max-width: 900px;\n  margin: 24px auto;\n  padding: 0;\n  box-sizing: border-box;\n}\n.scaler-carousel *,\n.scaler-carousel *::before,\n.scaler-carousel *::after {\n  box-sizing: border-box;\n}\n\n\/* Header *\/\n.scaler-header {\n  text-align: center;\n  margin-bottom: 20px;\n}\n.scaler-header-title {\n  font-size: 22px;\n  font-weight: 700;\n  color: #1a1a2e;\n  margin: 0 0 6px;\n  line-height: 1.2;\n}\n.scaler-header-subtitle {\n  font-size: 14px;\n  color: #6b7280;\n  margin: 0;\n  font-weight: 500;\n}\n\n\/* Swiper *\/\n.swiper.scaler-swiper {\n  padding-bottom: 48px;\n}\n.scaler-swiper .swiper-slide {\n  height: auto;\n  display: flex;\n  align-items: stretch;\n}\n\/* Navigation arrows \u2014 styled to match the topics HorizontalScroll controls *\/\n.scaler-swiper .swiper-button-next,\n.scaler-swiper .swiper-button-prev {\n  width: 46px;\n  height: 46px;\n  border-radius: 8px;\n  background: #ffffff;\n  box-shadow: 0 8px 16px 0 rgba(50, 71, 102, 0.16);\n  top: calc(50% - 24px); \/* centre on the cards, ignoring the pagination space below *\/\n  transform: translateY(-50%);\n  margin-top: 0;\n}\n.scaler-swiper .swiper-button-prev { left: 10px; }\n.scaler-swiper .swiper-button-next { right: 10px; }\n\/* hide Swiper's default font-icon arrow and draw the topics chevron via a mask *\/\n.scaler-swiper .swiper-button-next::after,\n.scaler-swiper .swiper-button-prev::after {\n  content: \"\";\n  width: 20px;\n  height: 20px;\n  background-color: #61738e;\n  -webkit-mask: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 32 32'%3E%3Cpath d='M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z'\/%3E%3C\/svg%3E\") no-repeat center \/ contain;\n  mask: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 32 32'%3E%3Cpath d='M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z'\/%3E%3C\/svg%3E\") no-repeat center \/ contain;\n}\n.scaler-swiper .swiper-button-prev::after { transform: rotate(-90deg); }\n.scaler-swiper .swiper-button-next::after { transform: rotate(90deg); }\n.scaler-swiper .swiper-button-disabled {\n  opacity: 0.35;\n  pointer-events: none;\n}\n.scaler-swiper .swiper-pagination-bullet-active {\n  background: #255aad;\n}\n\n\/* Card *\/\n.scaler-card {\n  display: flex;\n  flex-direction: column;\n  gap: 14px;\n  width: 100%;\n  background: #ffffff;\n  border: 1px solid #e5e7eb;\n  border-radius: 16px;\n  padding: 24px;\n  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n  transition: box-shadow 0.2s ease;\n}\n.scaler-card:hover {\n  box-shadow: 0 6px 16px rgba(0, 0, 0, 0.10);\n}\n\n\/* NSDC badge *\/\n.scaler-badge {\n  display: inline-flex;\n  align-items: center;\n  align-self: flex-start;\n  background: #f3f4f6;\n  color: #111827;\n  font-size: 12px;\n  font-weight: 600;\n  padding: 4px 10px;\n  border-radius: 20px;\n  white-space: nowrap;\n  letter-spacing: 0.1px;\n}\n\n\/* Top: icon + title + description *\/\n.scaler-card-top {\n  display: flex;\n  align-items: flex-start;\n  gap: 12px;\n  min-height: 100px;\n}\n.scaler-icon-wrap {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 64px;\n  height: 64px;\n  border-radius: 12px;\n  background: #f3f4f6;\n  color: #374151;\n  flex-shrink: 0;\n}\n.scaler-icon-wrap svg {\n  width: 26px;\n  height: 26px;\n}\n.scaler-card-top-content {\n  flex: 1;\n  min-width: 0;\n  display: flex;\n  flex-direction: column;\n  gap: 5px;\n}\n.scaler-title {\n  font-size: 16px;\n  font-weight: 700;\n  color: #111827;\n  margin: 0;\n  line-height: 1.35;\n}\n.scaler-desc {\n  font-size: 13px;\n  color: #6b7280;\n  margin: 0;\n  line-height: 1.45;\n}\n\n\/* Stats row *\/\n.scaler-stats {\n  display: flex;\n  border-top: 1px solid #e5e7eb;\n  border-bottom: 1px solid #e5e7eb;\n  padding: 12px 0;\n}\n.scaler-stat {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: 2px;\n  flex: 1;\n  min-width: 0;\n  text-align: center;\n}\n.scaler-stat:not(:last-child) {\n  border-right: 1px solid #d1d5db;\n}\n.scaler-stat-value {\n  font-size: 14px;\n  font-weight: 700;\n  color: #111827;\n  white-space: nowrap;\n}\n.scaler-stat-label {\n  font-size: 12px;\n  color: #9ca3af;\n}\n\n\/* Company logos *\/\n.scaler-logos {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  flex-wrap: nowrap;\n}\n.scaler-company-logo {\n  height: 20px !important;\n  width: auto !important;\n  max-width: 70px;\n  object-fit: contain;\n  display: inline-block;\n}\n.scaler-logo-more {\n  font-size: 12px;\n  color: #9ca3af;\n  white-space: nowrap;\n}\n.scaler-logo-strip {\n  display: block;\n  width: 100% !important;\n  max-width: 100%;\n  min-width: 0;\n  height: auto !important;\n  object-fit: contain;\n}\n\n\/* CTA *\/\n.scaler-card-btns {\n  margin-top: auto;\n}\n.scaler-card-btns button {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: 8px;\n  width: 100%;\n  padding: 12px 16px;\n  border: none;\n  border-radius: 10px;\n  background-color: #255aad;\n  color: #ffffff;\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 14px;\n  font-weight: 600;\n  cursor: pointer;\n  text-decoration: none;\n  transition: opacity 0.15s ease;\n}\n.scaler-card-btns button:hover,\n.scaler-card-btns button:focus {\n  opacity: 0.88;\n  color: #ffffff;\n}\n.scaler-card-btns button svg {\n  flex-shrink: 0;\n}\n\n@media (max-width: 1000px) {\n  .scaler-carousel { max-width: 96vw; }\n}\n<\/style>\n\n\n<div class=\"scaler-carousel\">\n  <div class=\"scaler-header\">\n    <h2 class=\"scaler-header-title\"><span class=\"ez-toc-section\" id=\"transform-your-career\"><\/span>Transform Your Career<span class=\"ez-toc-section-end\"><\/span><\/h2>\n    <p class=\"scaler-header-subtitle\">Choose from our industry-leading programs designed for career success<\/p>\n  <\/div>\n\n  <div class=\"swiper scaler-swiper\">\n    <div class=\"swiper-wrapper\">\n\n      <!-- CARD 1 -->\n      <div class=\"swiper-slide\">\n        <div class=\"scaler-card\">\n          <div class=\"scaler-badge\">NSDC Certified<\/div>\n          <div class=\"scaler-card-top\">\n            <div class=\"scaler-icon-wrap\">\n              <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"16 18 22 12 16 6\"\/><polyline points=\"8 6 2 12 8 18\"\/><\/svg>\n            <\/div>\n            <div class=\"scaler-card-top-content\">\n              <h3 class=\"scaler-title\">Modern Software and AI Engineering Program<\/h3>\n              <p class=\"scaler-desc\">Master full-stack development with AI integration<\/p>\n            <\/div>\n          <\/div>\n          <div class=\"scaler-stats\">\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">12 Months<\/span><span class=\"scaler-stat-label\">Duration<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">AI-Led<\/span><span class=\"scaler-stat-label\">Curriculum<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">Career Support<\/span><span class=\"scaler-stat-label\">Support<\/span><\/div>\n          <\/div>\n          <div class=\"scaler-logos\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/2f\/Google_2015_logo.svg\" alt=\"Google\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/a\/a9\/Amazon_logo.svg\" alt=\"Amazon\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/42\/Paytm_logo.png\" alt=\"Paytm\" loading=\"lazy\">\n            <span class=\"scaler-logo-more\">+1000 more<\/span>\n          <\/div>\n          <div class=\"scaler-card-btns\">\n            <button onclick=\"window.open('https:\/\/www.scaler.com\/academy\/', '_blank')\">\n              Go to Program\n              <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><path d=\"M3 8H13M13 8L9 4M13 8L9 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n            <\/button>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- CARD 2 -->\n      <div class=\"swiper-slide\">\n        <div class=\"scaler-card\">\n          <div class=\"scaler-badge\">NSDC Certified<\/div>\n          <div class=\"scaler-card-top\">\n            <div class=\"scaler-icon-wrap\">\n              <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\"\/><path d=\"M3 5v14c0 1.66 4.03 3 9 3s9-1.34 9-3V5\"\/><path d=\"M3 12c0 1.66 4.03 3 9 3s9-1.34 9-3\"\/><\/svg>\n            <\/div>\n            <div class=\"scaler-card-top-content\">\n              <h3 class=\"scaler-title\">Modern Data Science and ML with specialisation in AI<\/h3>\n              <p class=\"scaler-desc\">Advanced data science techniques with AI specialization<\/p>\n            <\/div>\n          <\/div>\n          <div class=\"scaler-stats\">\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">12 Months<\/span><span class=\"scaler-stat-label\">Duration<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">AI-Led<\/span><span class=\"scaler-stat-label\">Curriculum<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">Career Support<\/span><span class=\"scaler-stat-label\">Support<\/span><\/div>\n          <\/div>\n          <div class=\"scaler-logos\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/2f\/Google_2015_logo.svg\" alt=\"Google\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/a\/a9\/Amazon_logo.svg\" alt=\"Amazon\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/42\/Paytm_logo.png\" alt=\"Paytm\" loading=\"lazy\">\n            <span class=\"scaler-logo-more\">+1000 more<\/span>\n          <\/div>\n          <div class=\"scaler-card-btns\">\n            <button onclick=\"window.open('https:\/\/www.scaler.com\/data-science-course\/', '_blank')\">\n              Go to Program\n              <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><path d=\"M3 8H13M13 8L9 4M13 8L9 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n            <\/button>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- CARD 3 -->\n      <div class=\"swiper-slide\">\n        <div class=\"scaler-card\">\n          <div class=\"scaler-badge\">NSDC Certified<\/div>\n          <div class=\"scaler-card-top\">\n            <div class=\"scaler-icon-wrap\">\n              <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 2L13.5 8.5L20 10L13.5 11.5L12 18L10.5 11.5L4 10L10.5 8.5L12 2Z\"\/><\/svg>\n            <\/div>\n            <div class=\"scaler-card-top-content\">\n              <h3 class=\"scaler-title\">Advanced AIML with Specialisation in Agentic AI<\/h3>\n              <p class=\"scaler-desc\">Deep dive into AIML with focus on Agentic systems<\/p>\n            <\/div>\n          <\/div>\n          <div class=\"scaler-stats\">\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">12 Months<\/span><span class=\"scaler-stat-label\">Duration<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">AI-Led<\/span><span class=\"scaler-stat-label\">Curriculum<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">Career Support<\/span><span class=\"scaler-stat-label\">Support<\/span><\/div>\n          <\/div>\n          <div class=\"scaler-logos\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/2f\/Google_2015_logo.svg\" alt=\"Google\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/a\/a9\/Amazon_logo.svg\" alt=\"Amazon\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/42\/Paytm_logo.png\" alt=\"Paytm\" loading=\"lazy\">\n            <span class=\"scaler-logo-more\">+1000 more<\/span>\n          <\/div>\n          <div class=\"scaler-card-btns\">\n            <button onclick=\"window.open('https:\/\/www.scaler.com\/ai-machine-learning-course\/', '_blank')\">\n              Go to Program\n              <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><path d=\"M3 8H13M13 8L9 4M13 8L9 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n            <\/button>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- CARD 4 -->\n      <div class=\"swiper-slide\">\n        <div class=\"scaler-card\">\n          <div class=\"scaler-badge\">NSDC Certified<\/div>\n          <div class=\"scaler-card-top\">\n            <div class=\"scaler-icon-wrap\">\n              <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n                <path d=\"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z\" \/>\n                <path d=\"M9.2 15.2a3 3 0 1 0 4.24-4.24\" \/>\n              <\/svg>\n            <\/div>\n            <div class=\"scaler-card-top-content\">\n              <h3 class=\"scaler-title\">DevOps, Cloud &#038; AI Platform Engineering<\/h3>\n              <p class=\"scaler-desc\">Build and manage AI-powered cloud infrastructure<\/p>\n            <\/div>\n          <\/div>\n          <div class=\"scaler-stats\">\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">12 Months<\/span><span class=\"scaler-stat-label\">Duration<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">AI-Led<\/span><span class=\"scaler-stat-label\">Curriculum<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">Career Support<\/span><span class=\"scaler-stat-label\">Support<\/span><\/div>\n          <\/div>\n          <div class=\"scaler-logos\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/2f\/Google_2015_logo.svg\" alt=\"Google\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/a\/a9\/Amazon_logo.svg\" alt=\"Amazon\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/42\/Paytm_logo.png\" alt=\"Paytm\" loading=\"lazy\">\n            <span class=\"scaler-logo-more\">+1000 more<\/span>\n          <\/div>\n          <div class=\"scaler-card-btns\">\n            <button onclick=\"window.open('https:\/\/www.scaler.com\/devops-course\/', '_blank')\">\n              Go to Program\n              <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><path d=\"M3 8H13M13 8L9 4M13 8L9 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n            <\/button>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- CARD 5 -->\n      <div class=\"swiper-slide\">\n        <div class=\"scaler-card\">\n          <div class=\"scaler-badge\">NSDC Certified<\/div>\n          <div class=\"scaler-card-top\">\n            <div class=\"scaler-icon-wrap\">\n              <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n                <line x1=\"3\" y1=\"22\" x2=\"21\" y2=\"22\" \/>\n                <line x1=\"6\" y1=\"18\" x2=\"6\" y2=\"11\" \/>\n                <line x1=\"10\" y1=\"18\" x2=\"10\" y2=\"11\" \/>\n                <line x1=\"14\" y1=\"18\" x2=\"14\" y2=\"11\" \/>\n                <line x1=\"18\" y1=\"18\" x2=\"18\" y2=\"11\" \/>\n                <polygon points=\"12 2 20 7 4 7\" \/>\n              <\/svg>\n            <\/div>\n            <div class=\"scaler-card-top-content\">\n              <h3 class=\"scaler-title\">AI Engineering Advanced Certification by IIT-Roorkee<\/h3>\n              <p class=\"scaler-desc\">Premier AI engineering certification from IIT-Roorkee<\/p>\n            <\/div>\n          <\/div>\n          <div class=\"scaler-stats\">\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">3 Months<\/span><span class=\"scaler-stat-label\">Duration<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">AI-Led<\/span><span class=\"scaler-stat-label\">Curriculum<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">Career Support<\/span><span class=\"scaler-stat-label\">Support<\/span><\/div>\n          <\/div>\n          <div class=\"scaler-logos\">\n            <img decoding=\"async\" class=\"scaler-logo-strip\" src=\"https:\/\/scaler-blog-prod-wp-content.s3.ap-south-1.amazonaws.com\/wp-content\/uploads\/2026\/07\/08135139\/iitr-icons-strip.png\" alt=\"Program highlights\" loading=\"lazy\">\n          <\/div>\n          <div class=\"scaler-card-btns\">\n            <button onclick=\"window.open('https:\/\/www.scaler.com\/iit-roorkee-advanced-ai-engineering-course\/', '_blank')\">\n              Go to Program\n              <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><path d=\"M3 8H13M13 8L9 4M13 8L9 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n            <\/button>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- Continue for remaining cards (6\u20138) using same pattern -->\n\n    <\/div>\n    <div class=\"swiper-button-next\"><\/div>\n    <div class=\"swiper-button-prev\"><\/div>\n    <div class=\"swiper-pagination\"><\/div>\n  <\/div>\n<\/div>\n\n<!-- Swiper.js -->\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.js\"><\/script>\n<script>\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n  const pathParts = window.location.pathname.split(\"\/\").filter(Boolean);\n  const slug = pathParts[pathParts.length - 1] || \"\";\n  const readableSlug = encodeURIComponent(slug);\n  const buttons = document.querySelectorAll(\".scaler-card-btns button\");\n\n  buttons.forEach((btn) => {\n    const baseURL = btn.getAttribute(\"onclick\").match(\/'(.*?)'\/)[1];\n    if (!baseURL.includes(\"utm_source=\")) {\n      const separator = baseURL.includes(\"?\") ? \"&\" : \"?\";\n      const updatedURL = `${baseURL}${separator}utm_source=blog&utm_medium=program_carousel&utm_content=${readableSlug}`;\n      btn.setAttribute(\"onclick\", `window.open('${updatedURL}', '_blank')`);\n    }\n  });\n\n  new Swiper(\".scaler-swiper\", {\n    slidesPerView: 1,\n    spaceBetween: 28,\n    grabCursor: true,\n    navigation: { nextEl: \".swiper-button-next\", prevEl: \".swiper-button-prev\" },\n    pagination: { el: \".swiper-pagination\", dynamicBullets: true, clickable: true },\n    breakpoints: { 1000: { slidesPerView: 2 } },\n    keyboard: { enabled: true },\n  });\n});\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"set-up-a-linux-environment-for-practice\"><\/span><strong>Set Up a Linux Environment for Practice<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Set up Linux in a virtual machine so you can experiment without affecting your main system. You can take a snapshot before making major changes and restore it if something goes wrong. This gives you room to practise tasks such as changing services, configuring firewall rules, testing networking, and modifying system settings without worrying about breaking your everyday setup.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Where to practise Linux safely<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Option<\/strong><\/td><td><strong>Setup effort<\/strong><\/td><td><strong>Cost<\/strong><\/td><td><strong>Snapshots\/rollback?<\/strong><\/td><td><strong>Best for<\/strong><\/td><td><strong>Limitation<\/strong><\/td><\/tr><tr><td>VirtualBox \/ UTM VM<\/td><td>Low<\/td><td>Free<\/td><td>Yes<\/td><td>Most Linux projects<\/td><td>Uses more RAM and storage<\/td><\/tr><tr><td>WSL2 on Windows<\/td><td>Very low<\/td><td>Free<\/td><td>Limited<\/td><td>Shell and scripting work<\/td><td>No real init system by default; no bootloader<\/td><\/tr><tr><td>Cloud free tier<\/td><td>Medium<\/td><td>Free within current limits<\/td><td>Depends on provider<\/td><td>Server projects<\/td><td>Free-tier limits and pricing can change<\/td><\/tr><tr><td>Docker container<\/td><td>Very low<\/td><td>Free<\/td><td>Disposable<\/td><td>Shell, packages, isolated services<\/td><td>Shares the host kernel<\/td><\/tr><tr><td>Raspberry Pi<\/td><td>Medium<\/td><td>Hardware cost<\/td><td>Depends on setup<\/td><td>Home server projects<\/td><td>Requires hardware and setup<\/td><\/tr><tr><td>Dual boot \/ bare metal<\/td><td>High<\/td><td>Usually free<\/td><td>No<\/td><td>Full Linux environment<\/td><td>Highest risk to your existing system<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A VirtualBox or UTM VM works well for most of the projects in this guide. It gives you enough isolation to experiment while still exposing you to a real Linux installation. WSL2 is convenient if you&#8217;re on Windows and mainly working through shell or scripting projects, but some of the later projects need a proper VM. Docker is more disposable, but its containers share the host kernel, so it isn&#8217;t a replacement for a VM when you&#8217;re working with kernel modules, the boot process, or system-level isolation.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you use a cloud free tier, check the provider&#8217;s current limits before starting. These offers change, and a project that leaves a server running can eventually cost money. A Raspberry Pi is another good option if you want a physical machine for a home server, but you don&#8217;t need one to learn Linux.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;re using Windows, here&#8217;s <a href=\"https:\/\/www.scaler.com\/topics\/linux-terminal-for-windows\/\">how to work with the Linux terminal<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Create a Linux Environment You Can Reset<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Take a snapshot before every Tier 3 or Tier 4 project. If you break the machine, roll it back instead of rebuilding it from scratch.<\/li>\n\n\n\n<li>Keep one clean base VM. Don&#8217;t modify it directly; clone it whenever you need a fresh environment.<\/li>\n\n\n\n<li>Never practise on a machine holding work you can&#8217;t afford to lose. Use a VM or another disposable environment, especially when working with partitions, filesystems, firewall rules, or system configuration.<\/li>\n\n\n\n<li>Treat a broken VM as part of the experiment. Work out what went wrong, why it happened, and how to recover from it.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">For a practical guide to formatting USB drives in Linux: <a href=\"https:\/\/www.scaler.com\/topics\/linux-format-usb\/\">How to Format USB Drive on Linux?<\/a><\/p>\n\n\n<meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n    <!-- Source Sans Pro (topics font) -->\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Source+Sans+3:wght@400;600;700&#038;display=swap\" rel=\"stylesheet\">\n    <link rel=\"stylesheet\" href=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.css\">\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.js\"><\/script>\n\n    <style>\n      :root {\n        \/* topics design tokens (variables.scss) *\/\n        --scaler-primary: #005bb3;          \/* primary-color-80 *\/\n        --scaler-primary-30: #8acaff;       \/* primary-color-30 *\/\n        --scaler-brand-blue: #255aad;\n        --scaler-live: #ee001d;             \/* accent-v5-60 *\/\n        --scaler-live-bg: #ffe6e9;          \/* accent-v5-10 *\/\n        --scaler-card-bg: #ffffff;          \/* neutral-scale-0 *\/\n        --scaler-surface: #f4f6f9;          \/* neutral-scale-2 *\/\n        --scaler-text-primary: #1a2c47;     \/* neutral-scale-12 *\/\n        --scaler-text-secondary: #61738e;   \/* neutral-scale-9 *\/\n        --scaler-border: #d6dee5;           \/* neutral-scale-4 *\/\n        --scaler-radius: 16px;\n        --scaler-radius-sm: 8px;\n        --scaler-shadow: 0 8px 16px 0 rgba(50, 71, 102, 0.16);\n      }\n\n      .scaler-events-carousel * { box-sizing: border-box; }\n\n      .scaler-events-carousel {\n        font-family: \"Source Sans 3\", \"Source Sans Pro\", \"Roboto\", Arial, sans-serif;\n        padding: 24px;\n        position: relative;\n        width: 100%;\n      }\n      .scaler-events-carousel__inner {\n        max-width: 1000px;\n        margin: 0 auto;\n        position: relative;\n        width: 100%;\n      }\n\n      \/* Header \u2014 calendar icon + \"Live Masterclasses\" *\/\n      .scaler-events-header {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        margin-bottom: 8px;\n        padding: 8px 0;\n      }\n      .scaler-events-header__icon { display: inline-flex; color: var(--scaler-text-primary); }\n      .scaler-events-header__icon svg { width: 24px; height: 24px; }\n      .scaler-events-header__title {\n        font-size: 18px;\n        font-weight: 700;\n        color: var(--scaler-text-primary);\n        line-height: 1.3;\n        margin: 0;\n      }\n\n      \/* Swiper wrap (holds side arrows) *\/\n      .scaler-events-swiper-wrap { position: relative; }\n      .scaler-events-carousel .swiper { width: 100%; padding: 4px; }\n      .scaler-event-swiper .swiper-slide {\n        width: 296px;          \/* topics card_container width *\/\n        height: auto;\n        display: flex;\n      }\n\n      \/* Event Card \u2014 matches topics EventCard *\/\n      .scaler-event-card {\n        background: var(--scaler-card-bg);\n        border: 1px solid var(--scaler-border);\n        border-radius: var(--scaler-radius);\n        padding: 16px;\n        display: flex;\n        flex-direction: column;\n        height: 100%;\n        width: 100%;\n        cursor: pointer;\n      }\n\n      \/* Header row: headshot + title\/name *\/\n      .scaler-event-card__header { display: flex; align-items: flex-start; }\n      .scaler-event-card__image-wrapper {\n        position: relative;\n        width: 88px;\n        height: 88px;\n        min-width: 88px;\n        border-radius: var(--scaler-radius-sm);\n        overflow: hidden;\n        background: var(--scaler-primary-30);\n      }\n      .scaler-event-card__image {\n        position: absolute;\n        top: 0; left: 0;\n        width: 100%; height: 100%;\n        object-fit: cover;\n      }\n      \/* attendee-count footer (default) *\/\n      .scaler-event-card__img-footer {\n        position: absolute;\n        left: 0; right: 0; bottom: 0;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        gap: 4px;\n        padding: 1px 8px;\n        background: var(--scaler-surface);\n        color: var(--scaler-text-primary);\n        font-size: 13px;\n        line-height: 22px;\n      }\n      .scaler-event-card__img-footer svg { width: 14px; height: 14px; }\n      \/* live chip (shown when status === current) *\/\n      .scaler-event-card__live-badge {\n        position: absolute;\n        left: 0; right: 0; bottom: 0;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        gap: 5px;\n        padding: 1px 8px;\n        background: var(--scaler-live-bg);\n        color: var(--scaler-live);\n        font-size: 12px;\n        line-height: 22px;\n        text-transform: uppercase;\n        letter-spacing: 0.18em;\n      }\n      .scaler-event-card__live-badge::before {\n        content: \"\";\n        width: 6px; height: 6px;\n        background: var(--scaler-live);\n        border-radius: 50%;\n      }\n      .scaler-event-card__text { margin-left: 16px; min-width: 0; }\n      .scaler-event-card__title {\n        font-size: 20px;\n        font-weight: 600;\n        color: var(--scaler-text-primary);\n        margin: 0;\n        line-height: 1.4;\n        display: -webkit-box;\n        -webkit-line-clamp: 2;\n        -webkit-box-orient: vertical;\n        overflow: hidden;\n      }\n      .scaler-event-card__speaker {\n        margin-top: 8px;\n        font-size: 14px;\n        line-height: 1.4;\n        color: var(--scaler-text-primary);\n      }\n\n      \/* Takeaways *\/\n      .scaler-event-card__takeaways {\n        margin-top: 12px;\n        min-height: 50px;\n        max-height: 50px;\n        overflow: hidden;\n      }\n      .scaler-event-card__takeaway-item {\n        display: flex;\n        align-items: flex-start;\n        gap: 6px;\n      }\n      .scaler-event-card__dot {\n        width: 4px; height: 4px;\n        min-width: 4px;\n        border-radius: 50%;\n        background: var(--scaler-text-secondary);\n        margin-top: 11px;\n      }\n      .scaler-event-card__takeaway-text {\n        flex: 1;\n        min-width: 0;\n        font-size: 14px;\n        line-height: 24px;\n        color: var(--scaler-text-primary);\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n      }\n      .scaler-event-card__knowmore,\n      .scaler-event-card__knowmore:link,\n      .scaler-event-card__knowmore:visited {\n        flex-shrink: 0;\n        font-size: 14px;\n        line-height: 24px;\n        color: var(--scaler-primary) !important;\n        text-decoration: none;\n        white-space: nowrap;\n      }\n      .scaler-event-card__knowmore:hover { text-decoration: underline; }\n\n      \/* Date + duration *\/\n      .scaler-event-card__meta {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        margin-top: 20px;\n        font-size: 13px;\n        line-height: 24px;\n        color: var(--scaler-text-primary);\n      }\n      .scaler-event-card__duration {\n        display: flex;\n        align-items: center;\n        gap: 4px;\n      }\n      .scaler-event-card__duration svg { width: 15px; height: 15px; }\n\n      .scaler-event-card__spacer { flex-grow: 1; min-height: 4px; }\n\n      \/* CTA \u2014 outlined \"Register with 1-Click\" *\/\n      .scaler-event-card__cta,\n      .scaler-event-card__cta:link,\n      .scaler-event-card__cta:visited {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        width: 100%;\n        margin-top: 16px;\n        padding: 8px;\n        background: transparent;\n        color: var(--scaler-primary) !important;\n        font-family: inherit;\n        font-size: 14px;\n        font-weight: 600;\n        line-height: 24px;\n        text-decoration: none;\n        border: 1px solid var(--scaler-primary);\n        border-radius: var(--scaler-radius-sm);\n        cursor: pointer;\n        transition: background 0.2s ease, color 0.2s ease;\n      }\n      .scaler-event-card__cta:hover,\n      .scaler-event-card__cta:focus {\n        background: var(--scaler-primary);\n        color: #fff !important;\n      }\n\n      \/* Side navigation arrows *\/\n      .scaler-events-nav__btn {\n        position: absolute !important;\n        top: 50% !important;\n        transform: translateY(-50%) !important;\n        z-index: 2;\n        width: 46px !important;\n        height: 46px !important;\n        min-width: 46px;\n        display: flex !important;\n        align-items: center;\n        justify-content: center;\n        padding: 0 !important;\n        background: var(--scaler-card-bg) !important;\n        border: none !important;\n        border-radius: var(--scaler-radius-sm) !important;\n        box-shadow: var(--scaler-shadow) !important;\n        color: var(--scaler-text-secondary) !important;\n        cursor: pointer;\n        transition: opacity 0.2s ease, visibility 0.2s ease;\n      }\n      .scaler-nav-prev { left: 8px !important; }\n      .scaler-nav-next { right: 8px !important; }\n      .scaler-events-nav__btn svg {\n        width: 20px !important;\n        height: 20px !important;\n        fill: var(--scaler-text-secondary) !important;\n      }\n      .scaler-events-nav__btn.swiper-button-disabled {\n        opacity: 0;\n        visibility: hidden;\n        pointer-events: none;\n      }\n\n      \/* View All Events *\/\n      .scaler-events-viewall,\n      .scaler-events-viewall:link,\n      .scaler-events-viewall:visited {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        gap: 6px;\n        margin-top: 12px;\n        font-size: 14px;\n        font-weight: 600;\n        color: var(--scaler-brand-blue) !important;\n        text-decoration: none;\n      }\n      .scaler-events-viewall:hover { text-decoration: underline; }\n      .scaler-events-viewall svg { width: 16px; height: 16px; fill: var(--scaler-brand-blue); }\n\n      \/* hide swiper defaults *\/\n      .scaler-events-pagination { display: none; }\n      .scaler-events-carousel .swiper-button-prev,\n      .scaler-events-carousel .swiper-button-next { display: none; }\n\n      \/* Skeleton & Empty States *\/\n      .scaler-event-card--skeleton { pointer-events: none; }\n      .scaler-event-card--skeleton .scaler-event-card__image-wrapper,\n      .scaler-event-card--skeleton .scaler-event-card__title,\n      .scaler-event-card--skeleton .scaler-event-card__speaker,\n      .scaler-event-card--skeleton .scaler-event-card__takeaways,\n      .scaler-event-card--skeleton .scaler-event-card__meta,\n      .scaler-event-card--skeleton .scaler-event-card__cta {\n        background: linear-gradient(90deg, var(--scaler-border) 25%, var(--scaler-surface) 50%, var(--scaler-border) 75%);\n        background-size: 200% 100%;\n        animation: shimmer 1.5s infinite;\n        color: transparent !important;\n        border-color: transparent !important;\n        border-radius: 4px;\n      }\n      .scaler-event-card--skeleton .scaler-event-card__title { min-height: 44px; }\n      .scaler-event-card--skeleton .scaler-event-card__speaker { min-height: 16px; }\n      .scaler-event-card--skeleton .scaler-event-card__meta { min-height: 24px; }\n      .scaler-event-card--skeleton .scaler-event-card__cta { min-height: 40px; }\n      .scaler-event-card--skeleton .scaler-event-card__image,\n      .scaler-event-card--skeleton .scaler-event-card__img-footer,\n      .scaler-event-card--skeleton .scaler-event-card__live-badge { display: none; }\n\n      @keyframes shimmer {\n        0% { background-position: 200% 0; }\n        100% { background-position: -200% 0; }\n      }\n\n      .scaler-events-empty {\n        text-align: center;\n        padding: 40px 20px;\n        color: var(--scaler-text-secondary);\n        font-size: 15px;\n      }\n\n      @media (max-width: 768px) {\n        .scaler-events-carousel { padding: 16px; }\n        .scaler-event-swiper .swiper-slide { width: calc(100vw - 52px); }\n        .scaler-events-nav__btn { display: none; }\n      }\n    <\/style>\n\n\n\n    <div class=\"scaler-events-carousel js-scaler-carousel\">\n\n      <template class=\"js-event-card-template\">\n        <div class=\"swiper-slide\">\n          <article class=\"scaler-event-card\">\n            <div class=\"scaler-event-card__header\">\n              <div class=\"scaler-event-card__image-wrapper\">\n                <img decoding=\"async\" src=\"\" alt=\"\" class=\"scaler-event-card__image\" loading=\"lazy\">\n                <div class=\"scaler-event-card__img-footer\">\n                  <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M11.199 7.957c-3.086 0-5.588 2.502-5.588 5.588s2.502 5.588 5.588 5.588c3.086 0 5.588-2.502 5.588-5.588s-2.502-5.588-5.588-5.588zM3.611 13.545c0-4.191 3.397-7.588 7.588-7.588s7.588 3.397 7.588 7.588c0 4.191-3.397 7.588-7.588 7.588s-7.588-3.397-7.588-7.588z\"\/><path d=\"M21.090 6.369h0.003c1.989 0 3.897 0.79 5.303 2.197s2.197 3.314 2.197 5.303-0.79 3.897-2.197 5.303c-1.406 1.407-3.314 2.197-5.303 2.197-0.552 0-1-0.448-1-1s0.448-1 1-1c1.459 0 2.858-0.579 3.889-1.611s1.611-2.43 1.611-3.889c0-1.459-0.58-2.858-1.611-3.889s-2.429-1.611-3.888-1.611c-0.507 0.002-1.013 0.070-1.502 0.203-0.533 0.145-1.082-0.17-1.227-0.703s0.17-1.082 0.703-1.227c0.659-0.179 1.339-0.27 2.021-0.272z\"\/><path d=\"M10.906 21.364c-1.605 0-3.186 0.386-4.61 1.126s-2.649 1.811-3.572 3.124c-0.318 0.452-0.941 0.561-1.393 0.243s-0.561-0.941-0.243-1.393c1.107-1.576 2.577-2.862 4.286-3.749s3.606-1.351 5.532-1.351 3.823 0.463 5.532 1.351c1.709 0.888 3.179 2.174 4.286 3.749 0.318 0.452 0.209 1.076-0.243 1.393s-1.076 0.209-1.393-0.243c-0.923-1.313-2.148-2.385-3.572-3.124s-3.005-1.126-4.61-1.126z\"\/><\/svg>\n                  <span class=\"js-event-count\"><\/span>\n                <\/div>\n                <div class=\"scaler-event-card__live-badge\" style=\"display: none;\">Live<\/div>\n              <\/div>\n              <div class=\"scaler-event-card__text\">\n                <h3 class=\"scaler-event-card__title\"><\/h3>\n                <div class=\"scaler-event-card__speaker js-event-speaker\"><\/div>\n              <\/div>\n            <\/div>\n\n            <div class=\"scaler-event-card__takeaways js-event-takeaways\"><\/div>\n\n            <div class=\"scaler-event-card__spacer\"><\/div>\n\n            <div class=\"scaler-event-card__meta\">\n              <span class=\"js-event-date\"><\/span>\n              <span class=\"scaler-event-card__duration\">\n                <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M16 6.333c6.443 0 11.667 5.223 11.667 11.667s-5.223 11.667-11.667 11.667c-6.443 0-11.667-5.223-11.667-11.667v0c0.008-6.44 5.226-11.659 11.666-11.667h0.001zM16 28.333c5.707 0 10.333-4.626 10.333-10.333s-4.626-10.333-10.333-10.333c-5.707 0-10.333 4.626-10.333 10.333v0c0.007 5.704 4.629 10.326 10.333 10.333h0.001z\"\/><path d=\"M16 18.667c-0 0-0.001 0-0.001 0-0.184 0-0.35-0.074-0.471-0.195v0c-0.121-0.121-0.195-0.287-0.195-0.471s0.075-0.351 0.195-0.471l4.951-4.952c0.121-0.121 0.287-0.195 0.471-0.195s0.351 0.075 0.471 0.195v0c0.121 0.121 0.195 0.287 0.195 0.471s-0.075 0.351-0.195 0.471l-4.949 4.951c-0.121 0.121-0.288 0.196-0.472 0.196v0z\"\/><path d=\"M19 3.667h-6c-0.368 0-0.667-0.298-0.667-0.667v0c0-0.368 0.298-0.667 0.667-0.667v0h6c0.368 0 0.667 0.298 0.667 0.667v0c0 0.368-0.298 0.667-0.667 0.667v0z\"\/><\/svg>\n                <span class=\"js-event-duration\"><\/span>\n              <\/span>\n            <\/div>\n\n            <a href=\"#\" class=\"scaler-event-card__cta js-event-cta\">Register with 1-Click<\/a>\n          <\/article>\n        <\/div>\n      <\/template>\n\n      <div class=\"scaler-events-carousel__inner\">\n        <header class=\"scaler-events-header\">\n          <span class=\"scaler-events-header__icon\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 33 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M6.406 6.8c-0.11 0-0.2 0.090-0.2 0.2v20c0 0.11 0.090 0.2 0.2 0.2h20c0.11 0 0.2-0.090 0.2-0.2v-20c0-0.11-0.090-0.2-0.2-0.2h-20zM4.606 7c0-0.994 0.806-1.8 1.8-1.8h20c0.994 0 1.8 0.806 1.8 1.8v20c0 0.994-0.806 1.8-1.8 1.8h-20c-0.994 0-1.8-0.806-1.8-1.8v-20z\"\/><path d=\"M22.406 3.2c0.442 0 0.8 0.358 0.8 0.8v4c0 0.442-0.358 0.8-0.8 0.8s-0.8-0.358-0.8-0.8v-4c0-0.442 0.358-0.8 0.8-0.8z\"\/><path d=\"M10.406 3.2c0.442 0 0.8 0.358 0.8 0.8v4c0 0.442-0.358 0.8-0.8 0.8s-0.8-0.358-0.8-0.8v-4c0-0.442 0.358-0.8 0.8-0.8z\"\/><path d=\"M4.606 12c0-0.442 0.358-0.8 0.8-0.8h22c0.442 0 0.8 0.358 0.8 0.8s-0.358 0.8-0.8 0.8h-22c-0.442 0-0.8-0.358-0.8-0.8z\"\/><path d=\"M21.488 16.451c0.303 0.322 0.288 0.828-0.034 1.131l-5.838 5.5c-0.309 0.291-0.791 0.29-1.099-0.002l-3.162-3c-0.321-0.304-0.334-0.81-0.030-1.131s0.81-0.334 1.131-0.030l2.614 2.48 5.287-4.981c0.322-0.303 0.828-0.288 1.131 0.034z\"\/><\/svg>\n          <\/span>\n          <h2 class=\"scaler-events-header__title\"><span class=\"ez-toc-section\" id=\"live-masterclasses\"><\/span>Live Masterclasses<span class=\"ez-toc-section-end\"><\/span><\/h2>\n        <\/header>\n\n        <div class=\"scaler-events-swiper-wrap\">\n          <div class=\"swiper scaler-event-swiper\">\n            <div class=\"swiper-wrapper scaler-events-wrapper\"><\/div>\n            <div class=\"swiper-pagination scaler-events-pagination\"><\/div>\n          <\/div>\n\n          <button class=\"scaler-events-nav__btn scaler-nav-prev\" aria-label=\"Previous slide\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(-90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"\/><\/svg>\n          <\/button>\n          <button class=\"scaler-events-nav__btn scaler-nav-next\" aria-label=\"Next slide\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"\/><\/svg>\n          <\/button>\n        <\/div>\n\n        <a class=\"scaler-events-viewall\" href=\"https:\/\/www.scaler.com\/events\/\">\n          <span>View All Events<\/span>\n          <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"\/><\/svg>\n        <\/a>\n      <\/div>\n    <\/div>\n\n    <script>\n    document.addEventListener(\"DOMContentLoaded\", () => {\n\n      const monthNames = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"];\n\n      function formatTime(st) {\n        const t = new Date(st);\n        const date = t.getDate();\n        const month = monthNames[t.getMonth()];\n        const year = t.getFullYear();\n        const h = t.getHours();\n        const m = String(t.getMinutes()).padStart(2, \"0\");\n        let time;\n        if (h === 0) time = `12:${m} AM`;\n        else if (h === 12) time = `12:${m} PM`;\n        else if (h > 12) time = `${h - 12}:${m} PM`;\n        else time = `${h}:${m} AM`;\n        return `${date} ${month} ${year} | ${time}`;\n      }\n\n      const carouselInstances = document.querySelectorAll('.js-scaler-carousel');\n\n      carouselInstances.forEach(container => {\n\n          if(container.dataset.initialized === \"true\") return;\n          container.dataset.initialized = \"true\";\n\n          const swiperElement = container.querySelector(\".scaler-event-swiper\");\n          const swiperWrapper = container.querySelector(\".scaler-events-wrapper\");\n          const template = container.querySelector(\".js-event-card-template\");\n          const nextBtn = container.querySelector(\".scaler-nav-next\");\n          const prevBtn = container.querySelector(\".scaler-nav-prev\");\n          const paginationEl = container.querySelector(\".scaler-events-pagination\");\n\n          if (!swiperWrapper || !template) {\n             console.error(\"Scaler Carousel: Missing required elements inside container\");\n             return;\n          }\n\n          const swiper = new Swiper(swiperElement, {\n            slidesPerView: \"auto\",\n            spaceBetween: 16,\n            grabCursor: true,\n            observer: true,\n            observeParents: true,\n            pagination: {\n                el: paginationEl,\n                clickable: true,\n                dynamicBullets: true\n            },\n            navigation: {\n                nextEl: nextBtn,\n                prevEl: prevBtn\n            },\n          });\n\n          function showSkeletons(count = 4) {\n            swiperWrapper.innerHTML = \"\";\n            for (let i = 0; i < count; i++) {\n              const clone = template.content.cloneNode(true);\n              const card = clone.querySelector(\".scaler-event-card\");\n              card.classList.add(\"scaler-event-card--skeleton\");\n              swiperWrapper.appendChild(clone);\n            }\n            swiper.update();\n          }\n\n          function renderEvents(events) {\n            swiperWrapper.innerHTML = \"\";\n\n            if (events.length === 0) {\n              swiperWrapper.innerHTML = `<div class=\"scaler-events-empty\">No upcoming masterclasses found.<\/div>`;\n              return;\n            }\n\n            const pathParts = location.pathname.split(\"\/\").filter(Boolean);\n            const currentSlug = pathParts.length > 0 ? pathParts[pathParts.length - 1] : \"homepage\";\n\n            events.forEach(event => {\n              const attr = event.attributes;\n              const cd = attr.custom_data || {};\n              const clone = template.content.cloneNode(true);\n              const joinUrl = `\/event\/${attr.slug}\/?utm_source=blog&utm_medium=master_class&utm_content=${currentSlug}`;\n\n              \/\/ Instructor headshot\n              const instructor = (cd.instructors && cd.instructors[0]) || {};\n              const img = clone.querySelector(\".scaler-event-card__image\");\n              img.src = instructor.media_url || attr.image_url ||\n                \"https:\/\/images.unsplash.com\/photo-1531891437562-4301cf35b7e4?w=200&h=200&fit=crop\";\n              img.alt = instructor.name || attr.instructor_name || attr.title;\n\n              \/\/ Title + speaker\n              clone.querySelector(\".scaler-event-card__title\").textContent = attr.title;\n              clone.querySelector(\".js-event-speaker\").textContent = instructor.name || attr.instructor_name || \"\";\n\n              \/\/ Live chip vs attendee count\n              const isLive = attr.status === \"current\";\n              const footer = clone.querySelector(\".scaler-event-card__img-footer\");\n              const liveBadge = clone.querySelector(\".scaler-event-card__live-badge\");\n              if (isLive) {\n                footer.style.display = \"none\";\n                liveBadge.style.display = \"flex\";\n                liveBadge.textContent = \"Live\";\n              } else if (attr.registration_count) {\n                clone.querySelector(\".js-event-count\").textContent = attr.registration_count;\n              } else {\n                footer.style.display = \"none\";\n              }\n\n              \/\/ Takeaways (up to 2, Know More on the last)\n              const takeaways = (cd.takeaways || []).slice(0, 2);\n              const listEl = clone.querySelector(\".js-event-takeaways\");\n              listEl.innerHTML = \"\";\n              takeaways.forEach((t, idx) => {\n                const item = document.createElement(\"div\");\n                item.className = \"scaler-event-card__takeaway-item\";\n                const dot = document.createElement(\"span\");\n                dot.className = \"scaler-event-card__dot\";\n                const txt = document.createElement(\"span\");\n                txt.className = \"scaler-event-card__takeaway-text\";\n                txt.textContent = t;\n                item.appendChild(dot);\n                item.appendChild(txt);\n                if (idx === takeaways.length - 1) {\n                  const km = document.createElement(\"a\");\n                  km.className = \"scaler-event-card__knowmore\";\n                  km.textContent = \"Know More\";\n                  km.href = joinUrl;\n                  item.appendChild(km);\n                }\n                listEl.appendChild(item);\n              });\n\n              \/\/ Date + duration\n              clone.querySelector(\".js-event-date\").textContent = formatTime(attr.start_time);\n              let hrs = \"\";\n              if (attr.duration) {\n                hrs = (attr.duration \/ 60).toFixed(2);\n              } else if (attr.end_time) {\n                hrs = (Math.abs(new Date(attr.start_time) - new Date(attr.end_time)) \/ 3600000).toFixed(2);\n              }\n              clone.querySelector(\".js-event-duration\").textContent = hrs ? `${hrs} Hrs` : \"\";\n\n              \/\/ CTA\n              clone.querySelector(\".js-event-cta\").href = joinUrl;\n\n              swiperWrapper.appendChild(clone);\n            });\n\n            swiper.update();\n            swiper.slideTo(0);\n          }\n\n          async function fetchEvents() {\n            try {\n              showSkeletons();\n              const res = await fetch(\n                \"https:\/\/www.scaler.com\/api\/v4\/events?event_type[]=company&distributor=scaler&type=upcoming&serializer_mode=L2&limit=8&program[]=software_development&program[]=data_science&program[]=devops&program[]=ai_ml\"\n              );\n              const json = await res.json();\n              const events = json.data || [];\n              renderEvents(events);\n            } catch (error) {\n              console.error(\"Failed to load events:\", error);\n              if(swiperWrapper) swiperWrapper.innerHTML = `<div class=\"scaler-events-empty\">Failed to load events.<\/div>`;\n            }\n          }\n\n          fetchEvents();\n      });\n    });\n    <\/script>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"how-to-use-this-list-tiers-time-and-which-projects-to-actually-do\"><\/span><strong>How to Use This List (Tiers, Time, and Which Projects to Actually Do)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A focused selection of projects is enough to build strong Linux skills. Finish all the Tier 1 projects, pick two or three of Tier 2 projects, do one project of Tier 3, and one project of Tier 4. This gives you experience with the shell, system administration, servers, and Linux internals. Five projects that you can build, troubleshoot, and explain are worth far more than fifteen that you simply followed once.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The full set will take roughly 90 &#8211; 120 focused hours. The recommended selection comes to around 35 &#8211; 45 hours, depending on how much time goes into troubleshooting and documenting the work.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also, Linux projects with source code can help when you get stuck. Build your own version first. Use existing repositories later to compare approaches and see what you missed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When you finish a project, check that it still works after a reboot and store the code in Git. Add a README that explains the important design choices and gives someone else enough information to reproduce the project on their own machine. That gives you a project you can return to, explain, and show when you need to demonstrate your Linux skills.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can also explore: <a href=\"https:\/\/www.scaler.com\/blog\/devops-roadmap\/\">DevOps Roadmap<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"tier-1-foundation-linux-projects-for-beginners\"><\/span><strong>Tier 1: Foundation Linux Projects for Beginners&nbsp;<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Start with these Linux projects for beginners if you want to build your grasp of the command line. The four projects focus on shell configuration, automation, logs, and backups, so the commands quickly become part of something you&#8217;re actually building. These shell scripting projects are small enough to finish, while the skills carry into administration and DevOps work. More advanced bash scripting projects can build on those basics with larger scripts, more complex logic, and tougher failure cases.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1. A Custom Shell Environment (Prompt, Aliases, and Functions)<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Build a custom .bashrc or .zshrc with a prompt that shows your working directory, Git branch, and last exit code. Add 10 &#8211; 15 aliases you actually use, along with 2 to 3 shell functions that take arguments.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What you\u2019ll practise:<\/strong> shell startup files, login vs interactive shells, environment variables, PATH, $?, exit codes, quoting, aliases vs functions, and source vs executing a script.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Beginner&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Time:<\/strong> 3 &#8211; 5 hours&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it proves:<\/strong> You understand that the shell is a configurable program, not just a place where you type commands.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A syntax error in .bashrc can break every new terminal you open. Finding the mistake and recovering the configuration forces you to understand how the shell loads .bashrc instead of simply copying a customised prompt from a tutorial.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Where it gets hard:<\/strong> Break your .bashrc deliberately and recover it from another shell or a clean configuration.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Stretch:<\/strong> Make the prompt change based on the last command&#8217;s exit status. You&#8217;ll be able to see how $? is affected by the commands you run.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Read more:<\/strong> <a href=\"https:\/\/www.scaler.com\/topics\/set-command-in-linux\/\"><strong>set Command in Linux<\/strong><\/a><strong>.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2. A Dotfiles Repository With an Idempotent Setup Script<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Place your shell, editor, Git, and package configurations in a Git repository. Then create an install.sh script that sets everything up on a fresh system and can be run again without breaking the existing setup.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What you\u2019ll practise:<\/strong> symlinks vs copies, idempotency, bash conditionals and existence tests, set -euo pipefail, distro and package-manager detection, and backing up existing files before replacing them.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Beginner &#8211; Intermediate&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Time:<\/strong> 6 &#8211; 8 hours&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it proves:<\/strong> You can write setup automation that another person can run without having to repair their machine afterward.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The first run may be fairly simple. Run the script again, and existing symlinks, configuration files, packages, and backups can cause errors or create duplicates. The script should handle those existing files and leave the system in the same state after every run.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Where it gets hard:<\/strong> Make the second run produce the same final state as the first instead of duplicating files or failing on things that already exist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Test it properly:<\/strong> Clone the repository into a fresh VM and run the setup there. Don&#8217;t count your existing laptop as proof that the script works.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Read more:<\/strong> <a href=\"https:\/\/www.scaler.com\/topics\/chown-command-in-linux\/\"><strong>Chown Command in Linux with Examples<\/strong><\/a><\/p>\n\n\n<meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n    <!-- Source Sans Pro (topics font) -->\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Source+Sans+3:wght@400;600;700&#038;display=swap\" rel=\"stylesheet\">\n    <link rel=\"stylesheet\" href=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.css\">\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.js\"><\/script>\n\n    <style>\n      :root {\n        --cl-primary: #005bb3;\n        --cl-brand-blue: #255aad;\n        --cl-card-bg: #ffffff;\n        --cl-surface: #f6f7f8;\n        --cl-border: #d6dee5;\n        --cl-text-primary: #1a2c47;   \/* neutral-scale-12 *\/\n        --cl-text-secondary: #61738e; \/* neutral-scale-9 *\/\n        --cl-radius: 16px;\n        --cl-radius-sm: 8px;\n        --cl-shadow: 0 8px 16px 0 rgba(50, 71, 102, 0.16);\n      }\n\n      .scaler-courses * { box-sizing: border-box; }\n\n      .scaler-courses {\n        font-family: \"Source Sans 3\", \"Source Sans Pro\", \"Roboto\", Arial, sans-serif;\n        padding: 24px;\n        width: 100%;\n      }\n      .scaler-courses__inner {\n        max-width: 1000px;\n        margin: 0 auto;\n        position: relative;\n        width: 100%;\n      }\n\n      \/* Header *\/\n      .scaler-courses__header {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        margin-bottom: 8px;\n        padding: 8px 0;\n      }\n      .scaler-courses__header-icon { display: inline-flex; color: var(--cl-text-primary); }\n      .scaler-courses__header-icon svg { width: 24px; height: 24px; }\n      .scaler-courses__title {\n        font-size: 18px;\n        font-weight: 700;\n        color: var(--cl-text-primary);\n        line-height: 1.3;\n        margin: 0;\n      }\n\n      \/* Swiper *\/\n      .scaler-courses__swiper-wrap { position: relative; }\n      .scaler-courses .swiper { width: 100%; padding: 4px; }\n      .scaler-courses-swiper .swiper-slide {\n        width: 296px;\n        height: auto;\n        display: flex;\n      }\n\n      \/* Card *\/\n      .scaler-course-card {\n        display: flex;\n        flex-direction: column;\n        width: 100%;\n        height: 100%;\n        min-height: 336px;\n        background: var(--cl-card-bg);\n        border: 1px solid var(--cl-border);\n        border-radius: var(--cl-radius);\n        overflow: hidden;\n        text-decoration: none;\n        cursor: pointer;\n        transition: box-shadow 0.2s ease;\n      }\n      .scaler-course-card:hover { box-shadow: 0 2px 12px rgba(50, 71, 102, 0.12); }\n\n      .scaler-course-card__image {\n        width: 100%;\n        height: 128px;\n        min-height: 128px;\n        object-fit: cover;\n        background: var(--cl-surface);\n        display: block;\n      }\n\n      .scaler-course-card__detail {\n        display: flex;\n        flex-direction: column;\n        flex: 1 1 auto;\n        padding: 16px 16px 8px;\n      }\n      .scaler-course-card__heading,\n      .scaler-course-card__heading:link,\n      .scaler-course-card__heading:visited {\n        font-size: 20px;\n        font-weight: 600;\n        line-height: 1.4;\n        color: var(--cl-text-primary) !important;\n        margin: 0 0 8px;\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n      }\n      .scaler-course-card__instructor {\n        font-size: 14px;\n        line-height: 1.86;\n        color: var(--cl-text-primary);\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n      }\n      .scaler-course-card__instructor b { font-weight: 700; }\n      .scaler-course-card__desc {\n        flex-grow: 1;\n        margin-top: 8px;\n        margin-bottom: 12px;\n        font-size: 16px;\n        line-height: 1.5;\n        color: var(--cl-text-secondary);\n        display: -webkit-box;\n        -webkit-line-clamp: 2;\n        -webkit-box-orient: vertical;\n        overflow: hidden;\n      }\n\n      .scaler-course-card__footer {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        width: 100%;\n      }\n      .scaler-course-card__stat {\n        display: flex;\n        align-items: center;\n        gap: 4px;\n        font-size: 14px;\n        color: var(--cl-text-primary);\n      }\n      .scaler-course-card__stat svg { width: 18px; height: 18px; flex-shrink: 0; }\n      .scaler-course-card__stat img { width: 20px; height: 20px; flex-shrink: 0; }\n\n      \/* Side arrows *\/\n      .scaler-courses__nav {\n        position: absolute !important;\n        top: 50% !important;\n        transform: translateY(-50%) !important;\n        z-index: 2;\n        width: 46px !important; height: 46px !important; min-width: 46px;\n        display: flex !important; align-items: center; justify-content: center;\n        padding: 0 !important;\n        background: var(--cl-card-bg) !important;\n        border: none !important;\n        border-radius: var(--cl-radius-sm) !important;\n        box-shadow: var(--cl-shadow) !important;\n        color: var(--cl-text-secondary) !important;\n        cursor: pointer;\n        transition: opacity 0.2s ease, visibility 0.2s ease;\n      }\n      .scaler-courses__nav--prev { left: 8px !important; }\n      .scaler-courses__nav--next { right: 8px !important; }\n      .scaler-courses__nav svg { width: 20px !important; height: 20px !important; fill: var(--cl-text-secondary) !important; }\n      .scaler-courses__nav.swiper-button-disabled { opacity: 0; visibility: hidden; pointer-events: none; }\n\n      .scaler-courses .swiper-button-prev,\n      .scaler-courses .swiper-button-next,\n      .scaler-courses .swiper-pagination { display: none; }\n\n      \/* Skeleton *\/\n      .scaler-course-card--skeleton { pointer-events: none; }\n      .scaler-course-card--skeleton .scaler-course-card__image,\n      .scaler-course-card--skeleton .scaler-course-card__heading,\n      .scaler-course-card--skeleton .scaler-course-card__instructor,\n      .scaler-course-card--skeleton .scaler-course-card__desc,\n      .scaler-course-card--skeleton .scaler-course-card__footer {\n        background: linear-gradient(90deg, var(--cl-border) 25%, var(--cl-surface) 50%, var(--cl-border) 75%);\n        background-size: 200% 100%;\n        animation: cl-shimmer 1.5s infinite;\n        color: transparent !important;\n        border-radius: 4px;\n      }\n      .scaler-course-card--skeleton .scaler-course-card__heading { height: 24px; margin: 0 0 8px; }\n      .scaler-course-card--skeleton .scaler-course-card__instructor { height: 16px; }\n      .scaler-course-card--skeleton .scaler-course-card__footer { height: 20px; }\n      @keyframes cl-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }\n\n      .scaler-courses__empty { display: none; }\n\n      @media (max-width: 768px) {\n        .scaler-courses { padding: 16px; }\n        .scaler-courses-swiper .swiper-slide { width: 260px; }\n        .scaler-courses__nav { display: none !important; }\n      }\n    <\/style>\n\n\n    <div class=\"scaler-courses js-scaler-courses\">\n\n      <template class=\"js-course-card-template\">\n        <div class=\"swiper-slide\">\n          <a class=\"scaler-course-card js-course-link\" href=\"#\" target=\"_blank\" rel=\"noopener\">\n            <img decoding=\"async\" class=\"scaler-course-card__image js-course-image\" src=\"\" alt=\"\" loading=\"lazy\">\n            <div class=\"scaler-course-card__detail\">\n              <div class=\"scaler-course-card__heading js-course-title\"><\/div>\n              <div class=\"scaler-course-card__instructor js-course-instructor\"><\/div>\n              <div class=\"scaler-course-card__desc js-course-desc\"><\/div>\n              <div class=\"scaler-course-card__footer\">\n                <span class=\"scaler-course-card__stat js-course-star\">\n                  <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M14.83 2.868c0.342-0.239 0.75-0.368 1.168-0.368s0.826 0.128 1.168 0.368c0.338 0.236 0.596 0.569 0.741 0.955l2.759 6.936c0.003 0.007 0.007 0.013 0.013 0.017s0.013 0.007 0.020 0.007l7.402 0.476c0.411 0.036 0.802 0.194 1.124 0.452s0.559 0.607 0.683 1 0.127 0.815 0.011 1.211c-0.116 0.396-0.347 0.748-0.664 1.013l-5.655 4.714c-0.013 0.011-0.022 0.025-0.028 0.040s-0.006 0.032-0.002 0.047l1.821 7.163c0.107 0.395 0.094 0.812-0.037 1.2-0.133 0.391-0.38 0.734-0.71 0.983s-0.727 0.393-1.14 0.413c-0.413 0.020-0.822-0.084-1.175-0.3l-0.015-0.009-6.307-4.005c-0.004-0.003-0.009-0.004-0.014-0.004s-0.009 0.001-0.013 0.004l-5.876 3.721c-0.389 0.235-0.839 0.347-1.292 0.323s-0.889-0.184-1.251-0.459c-0.361-0.275-0.632-0.652-0.777-1.082-0.143-0.426-0.157-0.885-0.038-1.319l1.684-6.629c0.004-0.016 0.003-0.033-0.002-0.049s-0.015-0.030-0.027-0.040l-5.653-4.714c-0.317-0.264-0.548-0.617-0.664-1.013s-0.112-0.817 0.011-1.211c0.124-0.394 0.361-0.742 0.683-1s0.713-0.416 1.124-0.452l0.023-0.002 7.38-0.476c0.007-0 0.014-0.003 0.020-0.007s0.010-0.010 0.013-0.017l0.008-0.020 2.746-6.913c0.145-0.386 0.403-0.719 0.741-0.956z\"\/><\/svg>\n                  <span class=\"js-course-star-val\"><\/span>\n                <\/span>\n                <span class=\"scaler-course-card__stat\">\n                  <img decoding=\"async\" src=\"https:\/\/d19zaobb0foqu6.cloudfront.net\/topics\/images\/user-check-dark.svg\" alt=\"Enrolled\" loading=\"lazy\">\n                  <span class=\"js-course-reg\"><\/span>\n                <\/span>\n              <\/div>\n            <\/div>\n          <\/a>\n        <\/div>\n      <\/template>\n\n      <div class=\"scaler-courses__inner\">\n        <div class=\"scaler-courses__header\">\n          <span class=\"scaler-courses__header-icon\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M26.259 23.289h-20.518c-1.193 0-2.16-0.967-2.16-2.16v0-14.588c0-1.193 0.967-2.16 2.16-2.16v0h20.518c1.193 0 2.16 0.967 2.16 2.16v0 14.588c0 1.193-0.967 2.16-2.16 2.16v0zM5.741 5.501c-0.574 0-1.040 0.466-1.040 1.040v0 14.588c0 0.574 0.466 1.040 1.040 1.040v0h20.518c0.574 0 1.040-0.466 1.040-1.040v0-14.588c0-0.574-0.466-1.040-1.040-1.040v0z\"\/><path d=\"M19.764 27.619h-7.53c-0.309 0-0.56-0.251-0.56-0.56v0c0-0.309 0.251-0.56 0.56-0.56h7.53c0.309 0 0.56 0.251 0.56 0.56v0c0 0.309-0.251 0.56-0.56 0.56v0z\"\/><path d=\"M14.023 9.322c0.116 0 0.223 0.035 0.312 0.096l-0.002-0.001 5.93 3.953c0.151 0.102 0.249 0.272 0.249 0.466s-0.098 0.364-0.247 0.465l-0.002 0.001-5.93 3.953c-0.087 0.059-0.195 0.094-0.31 0.094-0.309 0-0.56-0.25-0.56-0.559v-7.906c0-0.309 0.251-0.56 0.56-0.56v0zM18.943 13.835l-4.36-2.906v5.813z\"\/><\/svg>\n          <\/span>\n          <h2 class=\"scaler-courses__title\"><span class=\"ez-toc-section\" id=\"free-courses-by-top-scaler-instructors\"><\/span>Free Courses by top Scaler instructors<span class=\"ez-toc-section-end\"><\/span><\/h2>\n        <\/div>\n\n        <div class=\"scaler-courses__swiper-wrap\">\n          <div class=\"swiper scaler-courses-swiper\">\n            <div class=\"swiper-wrapper js-courses-wrapper\"><\/div>\n            <div class=\"swiper-pagination\"><\/div>\n          <\/div>\n\n          <button class=\"scaler-courses__nav scaler-courses__nav--prev js-courses-prev\" aria-label=\"Previous\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(-90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"\/><\/svg>\n          <\/button>\n          <button class=\"scaler-courses__nav scaler-courses__nav--next js-courses-next\" aria-label=\"Next\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"\/><\/svg>\n          <\/button>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <script>\n    document.addEventListener(\"DOMContentLoaded\", () => {\n      const EXTRA_COUNT_ADDED = 1000;\n\n      \/\/ Mirrors getInstructorStar(): first token of the headline.\n      function getInstructorStar(headline) {\n        return (headline || \"\").toString().split(\" \")[0] || \"\";\n      }\n\n      document.querySelectorAll(\".js-scaler-courses\").forEach(container => {\n        if (container.dataset.initialized === \"true\") return;\n        container.dataset.initialized = \"true\";\n\n        const swiperElement = container.querySelector(\".scaler-courses-swiper\");\n        const wrapper = container.querySelector(\".js-courses-wrapper\");\n        const template = container.querySelector(\".js-course-card-template\");\n        const nextBtn = container.querySelector(\".js-courses-next\");\n        const prevBtn = container.querySelector(\".js-courses-prev\");\n\n        if (!wrapper || !template) return;\n\n        const swiper = new Swiper(swiperElement, {\n          slidesPerView: \"auto\",\n          spaceBetween: 16,\n          grabCursor: true,\n          observer: true,\n          observeParents: true,\n          navigation: { nextEl: nextBtn, prevEl: prevBtn },\n        });\n\n        const pathParts = location.pathname.split(\"\/\").filter(Boolean);\n        const currentSlug = pathParts.length > 0 ? pathParts[pathParts.length - 1] : \"homepage\";\n\n        function showSkeletons(count = 4) {\n          wrapper.innerHTML = \"\";\n          for (let i = 0; i < count; i++) {\n            const clone = template.content.cloneNode(true);\n            clone.querySelector(\".scaler-course-card\").classList.add(\"scaler-course-card--skeleton\");\n            wrapper.appendChild(clone);\n          }\n          swiper.update();\n        }\n\n        function renderCourses(courses) {\n          wrapper.innerHTML = \"\";\n          if (!courses.length) { container.style.display = \"none\"; return; }\n\n          courses.forEach(item => {\n            const a = item.attributes || {};\n            const clone = template.content.cloneNode(true);\n            const instructor = (a.instructors_data && a.instructors_data[0]) || {};\n\n            clone.querySelector(\".js-course-link\").href =\n              `https:\/\/www.scaler.com\/topics\/course\/${a.slug}\/?utm_source=blog&utm_medium=free_courses&utm_content=${currentSlug}`;\n\n            const img = clone.querySelector(\".js-course-image\");\n            img.src = a.cover_image_thumbnail || a.featured_image || \"\";\n            img.alt = a.title || \"\";\n\n            clone.querySelector(\".js-course-title\").textContent = a.title || \"\";\n\n            const instrEl = clone.querySelector(\".js-course-instructor\");\n            if (instructor.name) {\n              instrEl.innerHTML = \"A Course by <b><\/b>\";\n              instrEl.querySelector(\"b\").textContent = instructor.name;\n            } else {\n              instrEl.style.display = \"none\";\n            }\n\n            clone.querySelector(\".js-course-desc\").textContent = a.description || \"\";\n\n            \/\/ Star\n            const star = getInstructorStar(instructor.star_headline);\n            const starWrap = clone.querySelector(\".js-course-star\");\n            if (star && star !== \"0\") clone.querySelector(\".js-course-star-val\").textContent = star;\n            else starWrap.style.display = \"none\";\n\n            \/\/ Enrolled count (+1000 like topics)\n            clone.querySelector(\".js-course-reg\").textContent =\n              ((a.user_registration_count || 0) + EXTRA_COUNT_ADDED).toLocaleString(\"en-US\");\n\n            wrapper.appendChild(clone);\n          });\n\n          swiper.update();\n          swiper.slideTo(0);\n        }\n\n        async function fetchCourses() {\n          try {\n            showSkeletons();\n            \/\/ Public same-origin endpoint (topics course search). Returns 6 free courses.\n            const res = await fetch(\"\/topics\/api\/v1\/search\/courses\", {\n              method: \"POST\",\n              headers: {\n                \"Content-Type\": \"application\/json\",\n                \"Accept\": \"application\/json\",\n                \"X-Requested-With\": \"XMLHttpRequest\",\n              },\n              body: JSON.stringify({\n                filters: {\n                  q: \"\",\n                  page: { limit: 6, current_page: 1 },\n                  sort: { key: \"user_registration_count\", order: \"desc\" },\n                  filter_type: null,\n                  tags: [],\n                  program: [],\n                  level: [],\n                  category_type: [],\n                },\n              }),\n            });\n            const json = await res.json();\n            const courses = (json && json.data) || [];\n            renderCourses(courses);\n          } catch (error) {\n            console.error(\"Failed to load courses:\", error);\n            container.style.display = \"none\";\n          }\n        }\n\n        fetchCourses();\n      });\n    });\n    <\/script>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3. A Log-Parsing and Reporting Tool<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create a script that reads a real log, such as an Nginx access log, \/var\/log\/auth.log, or journalctl output, and generates a daily report. Start with the top 10 IP addresses, hourly error rates, most-requested paths, and failed login attempts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What you\u2019ll practise:<\/strong> pipes and redirection, grep, awk, cut, sort, uniq -c, wc, regular expressions, stdout vs stderr, large-file handling, and date parsing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Beginner &#8211; Intermediate&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Time:<\/strong> 5 &#8211; 7 hours&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it proves:<\/strong> You can turn raw system data into information that helps you investigate what happened.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Don&#8217;t make the parser depend on one perfect log line. Real logs contain unexpected input, missing fields, and formats you didn&#8217;t account for. Handling those cases is where the project stops being a command exercise and starts resembling actual troubleshooting work.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Where it gets hard:<\/strong> Your assumptions about the log format will eventually be wrong. Handle malformed or unexpected lines without bringing down the whole report.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Stretch:<\/strong> Add a &#8211;since option and allow the script to produce both a human-readable report and CSV output.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Learn more about:<\/strong> <a href=\"https:\/\/www.scaler.com\/topics\/sort-command-in-linux\/\"><strong>sort command in linux<\/strong><\/a><strong>.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>4. An Automated Backup Script With Rotation and a Cron Schedule<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create a script that backs up a selected folder, adds a timestamp to each backup, deletes backups older than a chosen number of days, and logs each run. Schedule it to run automatically with cron.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What you\u2019ll practise:<\/strong> tar and compression, cron and crontab syntax, find -mtime, file retention, logging, exit codes, and disk-space checks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Beginner &#8211; Intermediate&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Time:<\/strong> 5 &#8211; 7 hours&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it proves:<\/strong> You can automate a recurring task and account for what happens when nobody is sitting at the terminal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A script can run flawlessly from your shell and still fail when cron runs it. Cron starts with a much smaller environment, so assumptions about PATH, $HOME, the working directory, or relative paths can cause the job to fail.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Where it gets hard:<\/strong> Make the job observable. Log its output, use absolute paths, check its exit status, and make sure you can tell whether a backup actually succeeded.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Interview note:<\/strong> Be ready to explain why a cron job can work manually but fail when scheduled. That distinction comes up often in operations and DevOps work.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Stretch:<\/strong> Recreate the schedule as a systemd timer and compare the two approaches. That gives you a natural introduction to Project 7.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Learn more about:<\/strong> <a href=\"https:\/\/www.scaler.com\/topics\/backup-commands-in-linux\/\"><strong>Backup<\/strong><\/a> <strong>and<\/strong> <a href=\"https:\/\/www.scaler.com\/topics\/tar-command-in-linux\/\"><strong>tar<\/strong><\/a> <strong>commands.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"tier-2-linux-admin-projects-become-the-person-who-runs-the-machine\"><\/span><strong>Tier: 2 Linux Admin Projects (Become the Person Who Runs the Machine)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once you\u2019re more familiar with the shell, Linux administration projects put you in charge of the machine itself. You&#8217;ll create users, manage permissions, inspect processes, configure services, and control how the system accepts connections. This is where small configuration mistakes start producing problems that you have to diagnose.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>For more on operating system fundamentals, check out:<\/strong> <a href=\"https:\/\/www.scaler.com\/topics\/operating-system\/\"><strong>Operating System(OS) Tutorial<\/strong><\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>5. A User and Group Provisioning Script<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Build a script that onboards a new user: create the account, assign its groups and shell, create the home directory from a skeleton, install an SSH public key, set the correct permissions, and grant only the sudo access that user needs. Add a matching offboarding script that removes access cleanly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For more on granting users elevated access, see <a href=\"https:\/\/www.scaler.com\/topics\/how-to-give-root-privileges-to-a-user-in-linux\/\"><strong>How to Give Root Privileges to a User in Linux?<\/strong><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What you\u2019ll practise:<\/strong> \/etc\/passwd, \/etc\/group, \/etc\/shadow, UIDs and GIDs, primary vs supplementary groups, useradd vs adduser, rwx permissions, umask, \/etc\/sudoers, and visudo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Learn more about <a href=\"https:\/\/www.scaler.com\/topics\/linux-uid\/\">UIDs in Linux<\/a> and how they identify users and relate to permissions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Intermediate&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Time:<\/strong> 6 &#8211; 8 hours&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it proves:<\/strong> You understand how Linux handles identity, permissions, and privilege.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A valid SSH key can still be rejected if ~\/.ssh or authorized_keys has the wrong ownership or permissions. Tracking down that kind of failure forces you to understand how SSH checks access instead of simply memorising troubleshooting commands.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Where it gets hard:<\/strong> Test the provisioning script with different users and groups, then deliberately introduce a permissions mistake and diagnose why SSH refuses the key.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>6. A System Monitoring Dashboard Built From \/proc<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Build a small script or TUI that reads data directly from \/proc and \/sys instead of using top. Display CPU usage, memory usage, disk usage, the processes using the most <a href=\"https:\/\/www.scaler.com\/topics\/memory-management-in-operating-system\/\">memory<\/a>, network-interface statistics, and uptime. Refresh the display at regular intervals.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What you\u2019ll practise:<\/strong> \/proc as a virtual filesystem, \/proc\/stat, \/proc\/meminfo, \/proc\/[pid]\/status, \/sys, cumulative CPU jiffies, sampling, load average vs CPU utilisation, and basic process inspection.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Intermediate&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Time:<\/strong> 8 &#8211; 10 hours&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it proves:<\/strong> You understand where common system metrics actually come from.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The CPU percentage is the important part. There isn&#8217;t a single file containing \u201ccurrent CPU usage\u201d that you can simply print. You need to take two samples, calculate the difference, and use that to estimate utilisation. That forces you to understand what the monitoring tools are doing rather than treating them as black boxes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Where it gets hard:<\/strong> Get your CPU calculation right, then compare your result with top or another monitoring tool and explain any difference.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Stretch:<\/strong> Expose the metrics through a small HTTP endpoint in Prometheus text format.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Also read:<\/strong> <a href=\"https:\/\/www.scaler.com\/topics\/linux-folder-size\/\"><strong>How to Get the Size of a Directory in Linux?<\/strong><\/a><\/p>\n\n\n<style data-wp-block-html=\"css\">\n<style>\n      :root {\n        --sp-brand: #255aad;            \/* brand blue *\/\n        --sp-brand-hover: #19468c;\n        --sp-card-bg: #ffffff;          \/* neutral-scale-0 *\/\n        --sp-surface: #f4f6f9;          \/* neutral-scale-2 *\/\n        --sp-pill-bg: #f8fafc;\n        --sp-border: #d6dee5;           \/* neutral-scale-4 *\/\n        --sp-text-primary: #1a2c47;     \/* neutral-scale-12 *\/\n        --sp-text-secondary: #61738e;   \/* neutral-scale-9 *\/\n      }\n\n      .scaler-placement * { box-sizing: border-box; }\n\n      .scaler-placement {\n        font-family: \"Source Sans 3\", \"Source Sans Pro\", \"Roboto\", Arial, sans-serif;\n        width: 100%;\n        max-width: 100%;\n        margin: 24px auto;\n        display: flex;\n        flex-direction: column;\n      }\n\n      \/* ---- Placement report (OnlineCallout) ---- *\/\n      .scaler-placement__title {\n        font-size: 24px;\n        font-weight: 600;\n        line-height: 1.3;\n        color: var(--sp-text-primary);\n        margin: 0 0 16px;\n      }\n\n      .scaler-placement__card {\n        display: flex;\n        flex-direction: column;\n        width: 100%;\n        background: var(--sp-card-bg);\n        border: 1px solid var(--sp-border);\n        border-radius: 20px;\n        padding: 16px;\n        box-shadow: 0 8px 32px rgba(37, 90, 173, 0.04);\n        overflow: hidden;\n        gap: 5px;\n      }\n\n      .scaler-placement__top {\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        width: 100%;\n        gap: 18px;\n      }\n\n      .scaler-placement__stat-block {\n        display: flex;\n        flex-direction: column;\n        justify-content: center;\n        align-items: center;\n        width: 30%;\n        min-width: 200px;\n        flex-shrink: 0;\n        background: var(--sp-surface);\n        border: 1px solid var(--sp-border);\n        border-radius: 16px;\n        padding: 16px 10px;\n        gap: 8px;\n      }\n      .scaler-placement__stat-number {\n        font-size: 48px;\n        font-weight: 600;\n        line-height: 1;\n        color: var(--sp-brand);\n        text-align: center;\n      }\n      .scaler-placement__stat-label {\n        font-size: 13px;\n        font-weight: 600;\n        line-height: 14px;\n        color: rgba(37, 90, 173, 0.85);\n        text-transform: uppercase;\n        letter-spacing: 0.8px;\n      }\n\n      .scaler-placement__info {\n        display: flex;\n        flex-direction: column;\n        justify-content: center;\n        flex: 1;\n        gap: 10px;\n      }\n      .scaler-placement__proof-header {\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        gap: 8px;\n      }\n      .scaler-placement__proof-header svg { width: 18px; height: 18px; flex-shrink: 0; }\n      .scaler-placement__proof-label {\n        font-size: 12px;\n        font-weight: 600;\n        line-height: 16px;\n        color: var(--sp-brand);\n        text-transform: uppercase;\n        letter-spacing: 1px;\n      }\n      .scaler-placement__body-text {\n        font-size: 16px;\n        font-weight: 400;\n        line-height: 24px;\n        color: var(--sp-text-primary);\n        margin: 0;\n      }\n\n      .scaler-placement__bottom {\n        display: flex;\n        flex-direction: column;\n        align-items: flex-start;\n        margin-left: calc(30% + 18px);\n        width: calc(70% - 18px);\n        gap: 12px;\n      }\n      .scaler-placement__stats-row {\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        gap: 24px;\n      }\n      .scaler-placement__stat-item {\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        gap: 8px;\n      }\n      .scaler-placement__stat-item > svg {\n        color: var(--sp-brand);\n        width: 18px;\n        height: 18px;\n        flex-shrink: 0;\n      }\n      .scaler-placement__stat-text {\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        gap: 4px;\n      }\n      .scaler-placement__stat-value {\n        font-size: 16px;\n        font-weight: 600;\n        line-height: 24px;\n        color: var(--sp-text-primary);\n      }\n      .scaler-placement__stat-desc {\n        font-size: 14px;\n        font-weight: 400;\n        line-height: 20px;\n        color: var(--sp-text-secondary);\n      }\n\n      .scaler-placement__cta,\n      .scaler-placement__cta:link,\n      .scaler-placement__cta:visited {\n        display: inline-flex;\n        align-items: center;\n        align-self: flex-start;\n        font-size: 14px;\n        font-weight: 600;\n        line-height: 20px;\n        color: var(--sp-brand) !important;\n        gap: 6px;\n        text-decoration: none;\n        cursor: pointer;\n        margin-top: 2px;\n        transition: color 0.25s ease;\n      }\n      .scaler-placement__cta:hover,\n      .scaler-placement__cta:focus { color: var(--sp-brand-hover) !important; }\n      .scaler-placement__cta svg {\n        width: 14px;\n        height: 14px;\n        fill: currentColor;\n        transition: transform 0.25s ease;\n      }\n      .scaler-placement__cta:hover svg { transform: translateX(3px); }\n\n      \/* ---- Hiring Partners ---- *\/\n      .scaler-hiring {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        flex-wrap: wrap;\n        gap: 8px 12px;\n        margin: 24px 0 8px;\n        padding-top: 16px;\n        border-top: 1px solid var(--sp-border);\n      }\n      .scaler-hiring__label {\n        font-size: 14px;\n        color: var(--sp-text-secondary);\n        white-space: nowrap;\n      }\n      .scaler-hiring__pills {\n        display: flex;\n        align-items: center;\n        flex-wrap: wrap;\n        gap: 8px;\n      }\n      .scaler-hiring__pill {\n        display: inline-flex;\n        align-items: center;\n        gap: 6px;\n        padding: 5px 12px 5px 5px;\n        background: var(--sp-pill-bg);\n        border-radius: 999px;\n      }\n      .scaler-hiring__badge {\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        flex-shrink: 0;\n        width: 24px;\n        height: 24px;\n        border-radius: 50%;\n        background: #ffffff;\n      }\n      .scaler-hiring__logo {\n        width: 16px !important;\n        height: 16px !important;\n        object-fit: contain;\n        margin: 0 !important;\n        display: block;\n      }\n      .scaler-hiring__name {\n        font-size: 14px;\n        font-weight: 600;\n        color: var(--sp-text-primary);\n      }\n      .scaler-hiring__more {\n        font-size: 14px;\n        color: var(--sp-text-secondary);\n      }\n\n      @media (max-width: 768px) {\n        .scaler-placement__title { font-size: 18px; margin-bottom: 12px; }\n        .scaler-placement__card { gap: 16px; border-radius: 16px; }\n        .scaler-placement__top { gap: 12px; }\n        .scaler-placement__stat-block { width: 35%; min-width: 110px; padding: 12px 8px; gap: 4px; }\n        .scaler-placement__stat-number { font-size: 24px; }\n        .scaler-placement__stat-label { font-size: 10px; }\n        .scaler-placement__body-text { font-size: 14px; line-height: 20px; }\n        .scaler-placement__bottom { margin-left: 0; width: 100%; gap: 16px; }\n        .scaler-placement__stats-row { flex-wrap: wrap; gap: 10px 16px; }\n        .scaler-placement__stat-value { font-size: 14px; line-height: 20px; }\n        .scaler-placement__stat-desc { font-size: 12px; line-height: 16px; }\n      }\n<\/style>\n\n<meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n    <!-- Source Sans Pro (topics font) -->\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Source+Sans+3:wght@400;600;700&#038;display=swap\" rel=\"stylesheet\">\n\n<div class=\"scaler-placement\">\n      <h2 class=\"scaler-placement__title\"><span class=\"ez-toc-section\" id=\"scaler-placement-report-and-statistics\"><\/span>Scaler Placement Report and Statistics<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n      <div class=\"scaler-placement__card\">\n        <div class=\"scaler-placement__top\">\n          <div class=\"scaler-placement__stat-block\">\n            <div class=\"scaler-placement__stat-number\">\u20b923L<\/div>\n            <div class=\"scaler-placement__stat-label\">AVG CTC<\/div>\n          <\/div>\n          <div class=\"scaler-placement__info\">\n            <div class=\"scaler-placement__proof-header\">\n              <svg viewBox=\"0 0 21 21\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M8.64 0 0 8.683V21h12.257l8.64-8.683V0H8.64zm-.11 17.257H3.725v-4.828H8.53v4.828zm7.901-1.88-4.174 4.194V8.684H1.447l4.076-4.14h10.914l-.006 10.83v.004z\" fill=\"#255aad\"><\/path><\/svg>\n              <span class=\"scaler-placement__proof-label\">SCALER PLACEMENT PROOF<\/span>\n            <\/div>\n            <p class=\"scaler-placement__body-text\">\n              Scaler learners achieved 2.5x salary growth with average post-Scaler CTC reaching \u20b923L.\n            <\/p>\n          <\/div>\n        <\/div>\n\n        <div class=\"scaler-placement__bottom\">\n          <div class=\"scaler-placement__stats-row\">\n            <div class=\"scaler-placement__stat-item\">\n              <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M11.199 7.957c-3.086 0-5.588 2.502-5.588 5.588s2.502 5.588 5.588 5.588c3.086 0 5.588-2.502 5.588-5.588s-2.502-5.588-5.588-5.588zM3.611 13.545c0-4.191 3.397-7.588 7.588-7.588s7.588 3.397 7.588 7.588c0 4.191-3.397 7.588-7.588 7.588s-7.588-3.397-7.588-7.588z\"><\/path><path d=\"M21.090 6.369h0.003c1.989 0 3.897 0.79 5.303 2.197s2.197 3.314 2.197 5.303-0.79 3.897-2.197 5.303c-1.406 1.407-3.314 2.197-5.303 2.197-0.552 0-1-0.448-1-1s0.448-1 1-1c1.459 0 2.858-0.579 3.889-1.611s1.611-2.43 1.611-3.889c0-1.459-0.58-2.858-1.611-3.889s-2.429-1.611-3.888-1.611c-0.507 0.002-1.013 0.070-1.502 0.203-0.533 0.145-1.082-0.17-1.227-0.703s0.17-1.082 0.703-1.227c0.659-0.179 1.339-0.27 2.021-0.272z\"><\/path><path d=\"M10.906 21.364c-1.605 0-3.186 0.386-4.61 1.126s-2.649 1.811-3.572 3.124c-0.318 0.452-0.941 0.561-1.393 0.243s-0.561-0.941-0.243-1.393c1.107-1.576 2.577-2.862 4.286-3.749s3.606-1.351 5.532-1.351 3.823 0.463 5.532 1.351c1.709 0.888 3.179 2.174 4.286 3.749 0.318 0.452 0.209 1.076-0.243 1.393s-1.076 0.209-1.393-0.243c-0.923-1.313-2.148-2.385-3.572-3.124s-3.005-1.126-4.61-1.126z\"><\/path><path d=\"M25.704 22.493c-1.424-0.74-3.005-1.125-4.61-1.124-0.552 0-1-0.447-1.001-0.999s0.447-1 0.999-1.001c1.926-0.001 3.824 0.462 5.533 1.349s3.179 2.174 4.286 3.751c0.317 0.452 0.208 1.076-0.244 1.393s-1.076 0.208-1.393-0.244c-0.922-1.313-2.147-2.385-3.571-3.125z\"><\/path><\/svg>\n              <div class=\"scaler-placement__stat-text\">\n                <span class=\"scaler-placement__stat-value\">11,000+<\/span>\n                <span class=\"scaler-placement__stat-desc\">placements<\/span>\n              <\/div>\n            <\/div>\n            <div class=\"scaler-placement__stat-item\">\n              <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M1.2 27.5c0-0.442 0.358-0.8 0.8-0.8h28c0.442 0 0.8 0.358 0.8 0.8s-0.358 0.8-0.8 0.8h-28c-0.442 0-0.8-0.358-0.8-0.8z\"><\/path><path d=\"M3.727 4.227c0.338-0.338 0.795-0.527 1.273-0.527h12c0.477 0 0.935 0.19 1.273 0.527s0.527 0.795 0.527 1.273v22c0 0.442-0.358 0.8-0.8 0.8s-0.8-0.358-0.8-0.8v-22c0-0.053-0.021-0.104-0.059-0.141s-0.088-0.059-0.141-0.059h-12c-0.053 0-0.104 0.021-0.141 0.059s-0.059 0.088-0.059 0.141v22c0 0.442-0.358 0.8-0.8 0.8s-0.8-0.358-0.8-0.8v-22c0-0.477 0.19-0.935 0.527-1.273z\"><\/path><path d=\"M17.2 12.5c0-0.442 0.358-0.8 0.8-0.8h9c0.477 0 0.935 0.19 1.273 0.527s0.527 0.795 0.527 1.273v14c0 0.442-0.358 0.8-0.8 0.8s-0.8-0.358-0.8-0.8v-14c0-0.053-0.021-0.104-0.059-0.141s-0.088-0.059-0.141-0.059h-9c-0.442 0-0.8-0.358-0.8-0.8z\"><\/path><path d=\"M7.2 9.5c0-0.442 0.358-0.8 0.8-0.8h4c0.442 0 0.8 0.358 0.8 0.8s-0.358 0.8-0.8 0.8h-4c-0.442 0-0.8-0.358-0.8-0.8z\"><\/path><path d=\"M9.2 17.5c0-0.442 0.358-0.8 0.8-0.8h4c0.442 0 0.8 0.358 0.8 0.8s-0.358 0.8-0.8 0.8h-4c-0.442 0-0.8-0.358-0.8-0.8z\"><\/path><path d=\"M7.2 22.5c0-0.442 0.358-0.8 0.8-0.8h4c0.442 0 0.8 0.358 0.8 0.8s-0.358 0.8-0.8 0.8h-4c-0.442 0-0.8-0.358-0.8-0.8z\"><\/path><path d=\"M21.2 22.5c0-0.442 0.358-0.8 0.8-0.8h2c0.442 0 0.8 0.358 0.8 0.8s-0.358 0.8-0.8 0.8h-2c-0.442 0-0.8-0.358-0.8-0.8z\"><\/path><path d=\"M21.2 17.5c0-0.442 0.358-0.8 0.8-0.8h2c0.442 0 0.8 0.358 0.8 0.8s-0.358 0.8-0.8 0.8h-2c-0.442 0-0.8-0.358-0.8-0.8z\"><\/path><\/svg>\n              <div class=\"scaler-placement__stat-text\">\n                <span class=\"scaler-placement__stat-value\">650+<\/span>\n                <span class=\"scaler-placement__stat-desc\">companies<\/span>\n              <\/div>\n            <\/div>\n            <div class=\"scaler-placement__stat-item\">\n              <svg viewBox=\"0 0 25 24\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M5.60938 18.8906C4.74688 18.0281 5.31875 16.2188 4.87813 15.1594C4.4375 14.1 2.75 13.1719 2.75 12C2.75 10.8281 4.41875 9.9375 4.87813 8.84063C5.3375 7.74375 4.74688 5.97187 5.60938 5.10938C6.47187 4.24688 8.28125 4.81875 9.34063 4.37813C10.4 3.9375 11.3281 2.25 12.5 2.25C13.6719 2.25 14.5625 3.91875 15.6594 4.37813C16.7562 4.8375 18.5281 4.24688 19.3906 5.10938C20.2531 5.97187 19.6812 7.78125 20.1219 8.84063C20.5625 9.9 22.25 10.8281 22.25 12C22.25 13.1719 20.5813 14.0625 20.1219 15.1594C19.6625 16.2562 20.2531 18.0281 19.3906 18.8906C18.5281 19.7531 16.7188 19.1812 15.6594 19.6219C14.6 20.0625 13.6719 21.75 12.5 21.75C11.3281 21.75 10.4375 20.0813 9.34063 19.6219C8.24375 19.1625 6.47187 19.7531 5.60938 18.8906Z\" fill=\"#ffffff\" stroke=\"#255aad\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><\/path><path d=\"M16.625 9.75L11.1219 15L8.375 12.375\" stroke=\"#255aad\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><\/path><\/svg>\n              <span class=\"scaler-placement__stat-desc\">Verified data<\/span>\n            <\/div>\n          <\/div>\n\n          <a class=\"scaler-placement__cta\" href=\"https:\/\/d2beiqkhq929f0.cloudfront.net\/public_assets\/assets\/000\/195\/869\/original\/Scaler_Career_Report.pdf?1778499863\" target=\"_blank\" rel=\"noopener\">\n            See full placement report\n            <svg viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"><\/path><\/svg>\n          <\/a>\n        <\/div>\n      <\/div>\n\n      <div class=\"scaler-hiring\">\n        <span class=\"scaler-hiring__label\">Hiring Partners:<\/span>\n        <div class=\"scaler-hiring__pills\">\n          <span class=\"scaler-hiring__pill\">\n            <span class=\"scaler-hiring__badge\"><img decoding=\"async\" class=\"scaler-hiring__logo\" src=\"https:\/\/d19zaobb0foqu6.cloudfront.net\/topics\/images\/googleicon_.svg\" alt=\"Google\" loading=\"lazy\"><\/span>\n            <span class=\"scaler-hiring__name\">Google<\/span>\n          <\/span>\n          <span class=\"scaler-hiring__pill\">\n            <span class=\"scaler-hiring__badge\"><img decoding=\"async\" class=\"scaler-hiring__logo\" src=\"https:\/\/d19zaobb0foqu6.cloudfront.net\/topics\/images\/amazonicon_.svg\" alt=\"Amazon\" loading=\"lazy\"><\/span>\n            <span class=\"scaler-hiring__name\">Amazon<\/span>\n          <\/span>\n          <span class=\"scaler-hiring__pill\">\n            <span class=\"scaler-hiring__badge\"><img decoding=\"async\" class=\"scaler-hiring__logo\" src=\"https:\/\/d19zaobb0foqu6.cloudfront.net\/topics\/images\/microsoft.svg\" alt=\"Microsoft\" loading=\"lazy\"><\/span>\n            <span class=\"scaler-hiring__name\">Microsoft<\/span>\n          <\/span>\n          <span class=\"scaler-hiring__pill\">\n            <span class=\"scaler-hiring__badge\"><img decoding=\"async\" class=\"scaler-hiring__logo\" src=\"https:\/\/d19zaobb0foqu6.cloudfront.net\/topics\/images\/flipkarticon_.svg\" alt=\"Flipkart\" loading=\"lazy\"><\/span>\n            <span class=\"scaler-hiring__name\">Flipkart<\/span>\n          <\/span>\n          <span class=\"scaler-hiring__pill\">\n            <span class=\"scaler-hiring__badge\"><img decoding=\"async\" class=\"scaler-hiring__logo\" src=\"https:\/\/d19zaobb0foqu6.cloudfront.net\/topics\/images\/adobeicon_.svg\" alt=\"Adobe\" loading=\"lazy\"><\/span>\n            <span class=\"scaler-hiring__name\">Adobe<\/span>\n          <\/span>\n          <span class=\"scaler-hiring__more\">1200+ more<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n\n\n<h3 class=\"wp-block-heading\"><strong>7. A systemd Service You Write Yourself<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Take the monitoring script from Project 6, or another long-running program, and turn it into a proper systemd service. Write a .service unit that starts at <a href=\"https:\/\/www.scaler.com\/topics\/operating-system\/what-is-booting\/\">boot<\/a>, restarts after a failure, runs under a dedicated unprivileged user, and sends its logs to the journal. Then create a .timer unit to replace the cron job from Project 4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What you\u2019ll practise:<\/strong> systemd as PID 1, unit files, [Unit], [Service] and [Install], Type=simple vs forking, Restart=, systemctl enable vs start, journalctl -u, service isolation, dependencies, and boot ordering.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Intermediate&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Time:<\/strong> 5 - 7 hours&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it proves:<\/strong> You can make a program run reliably without someone sitting at the terminal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Writing the unit file is only part of the project. When the service fails after a reboot, read journalctl, check the working directory and environment, inspect the exit status, and work backwards from the failure.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Where it gets hard:<\/strong> Understand the difference between enabling a service and starting it. Then make the service recover automatically after a controlled failure.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Interview note:<\/strong> If someone asks you how you'd investigate a service that stopped coming back after a reboot, this project gives you a real answer rather than a memorised one.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Check out:<\/strong> <a href=\"https:\/\/www.scaler.com\/topics\/how-to-run-process-in-background-linux\/\"><strong>How To Run a Process in the Background in Linux?<\/strong><\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>8. A Firewall and Server Hardening Exercise<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Start with a fresh VM or cloud instance and work through a written hardening checklist. Configure SSH key-only authentication, disable password login, create a non-root sudo user, use a default-deny firewall with explicit rules, enable automatic security updates, configure fail2ban, and document every change you make.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What you\u2019ll practise:<\/strong> ufw\/nftables, default-deny rules, SSH daemon configuration, listening ports, ss -tlnp, attack-surface reduction, unattended updates, and log-based intrusion detection.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Intermediate&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Time:<\/strong> 6 - 8 hours&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it proves:<\/strong> You can reduce the attack surface of an internet-facing Linux machine and explain why each change matters.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The classic failure is locking yourself out of SSH. Before touching sshd_config or firewall rules, make sure you have a console or snapshot-based recovery path.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Where it gets hard:<\/strong> Don't just apply a hardening checklist. Run ss -tlnp before and after the changes and explain which services disappeared from the exposed surface and why.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Kali Linux note:<\/strong> Kali is built for penetration testing and security work, not as the default distribution for learning Linux administration. Learn the underlying Linux concepts on Ubuntu or Debian first. Use Kali when the <a href=\"https:\/\/www.scaler.com\/topics\/protection-and-security-in-operating-system\/\">security<\/a> work itself is what you're trying to learn.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>See how SSH exposure can be examined with Nmap:<\/strong> <a href=\"https:\/\/www.scaler.com\/topics\/cyber-security\/ssh-nmap\/\"><strong>Enumerating SSH with Nmap<\/strong><\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"tier-3-linux-server-projects-run-something-other-people-depend-on\"><\/span><strong>Tier 3: Linux Server Projects (Run Something Other People Depend On)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The next step is running something other people or systems depend on. These Linux server projects introduce storage, networking, DNS, TLS, certificates, and infrastructure that has to keep working after you log out. A service that works only while you're watching it isn't enough anymore.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>9. A Personal Home Server (File Sharing and Media)<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Set up an always-on server using an old laptop, Raspberry Pi, or spare VM. Serve files over Samba for Windows clients or NFS for Linux clients, add a media server, and mount a dedicated storage disk so it remains available after a reboot.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What you\u2019ll practise:<\/strong> partitioning and filesystems, \/etc\/fstab, persistent mounts, Samba and NFS, network permissions, static IPs, local DNS\/hostname resolution, and the difference between filesystem permissions and share-level permissions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Intermediate - Advanced&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Time:<\/strong> 10 - 14 hours&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it proves:<\/strong> You can provision storage and expose it over a network without accidentally giving everyone access.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The permissions are where most of the learning happens. A file can have the permissions you expect at the Linux filesystem level and still behave differently when accessed through Samba. Work through that difference instead of treating it as a configuration problem to copy from a tutorial.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Where it gets hard:<\/strong> Get the same file-access rules working from both the Linux filesystem and the network share, then test them with different users.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Also read:<\/strong> <a href=\"https:\/\/www.scaler.com\/topics\/how-to-check-the-mount-points-in-linux\/\"><strong>How to Check the Mount Points in Linux?<\/strong><\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>10. A Self-Hosted Web Service Behind nginx With TLS<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Deploy a small application on a cloud instance and put nginx in front of it as a reverse proxy. Give it a real domain, configure HTTPS with a Let's Encrypt certificate, set up automatic renewal, and make sure the application comes back after a reboot.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What you\u2019ll practise:<\/strong> reverse proxies and upstreams, DNS A records, ports 80 and 443, privileged ports, ACME certificate issuance, certificate renewal, HTTP-to-HTTPS redirects, nginx configuration, and nginx -t.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Advanced&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Time:<\/strong> 10 - 12 hours&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it proves:<\/strong> You can take an application from \u201cworks on my laptop\u201d to a service that is reachable, encrypted, and able to recover after a reboot.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The first deployment usually feels straightforward until DNS or certificate issuance fails. A blocked port 80, incorrect DNS record, or wrong webroot can stop the ACME challenge. Learn to read the error output and verify each layer rather than repeatedly changing configuration and hoping it works.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Where it gets hard:<\/strong> Diagnose a failed certificate request by checking DNS, listening ports, firewall rules, and the ACME challenge path.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cost note:<\/strong> A domain adds a yearly cost, while some cloud providers offer always-free or trial infrastructure. Check the provider's current terms before relying on a free tier.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Check out:<\/strong> <a href=\"https:\/\/www.scaler.com\/topics\/how-to-check-tls-version-in-linux\/\"><strong>How to Check the TLS Version in Linux?<\/strong><\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>11. Automated VM Provisioning (Infrastructure You Can Rebuild From a File)<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Write a Vagrantfile or cloud-init configuration and an Ansible playbook, or a well-structured shell script, that takes a blank VM and turns it into a working server with one command. It should create the user, apply the firewall rules, install the required service, configure it, and start it. Then destroy the VM and rebuild it from scratch.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What you\u2019ll practise:<\/strong> declarative vs imperative configuration, idempotency at machine scale, infrastructure as code, provisioning order, secrets management, and the shift from manually maintained servers to reproducible infrastructure.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Advanced&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Time:<\/strong> 10 - 14 hours&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it proves:<\/strong> You can describe infrastructure as code and rebuild a machine from source control instead of relying on undocumented manual changes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Your existing VM probably contains state you forgot you created manually. Destroy it and run the provisioning process again. Every missing dependency or undeclared configuration will show up during that rebuild.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Where it gets hard:<\/strong> Make the second deployment work without touching the machine manually. If you have to SSH in and fix something after provisioning, find out why that step was missing from your configuration.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Explore the skills and tools used in cloud engineering with the<\/strong> <a href=\"https:\/\/www.scaler.com\/blog\/cloud-engineer-roadmap\/\"><strong>Cloud Engineer Roadmap<\/strong><\/a><strong>.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"tier-4-under-the-hood-where-%22power-user%22-becomes-real\"><\/span><strong>Tier 4: Under the Hood (Where \"Power User\" Becomes Real)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tier 4 takes you behind the tools you\u2019ve been using so far. You\u2019ll work with package formats, Linux namespaces and cgroups, kernel modules, and the boot process. These projects are considerably harder than the earlier tiers, but they give you a much clearer picture of what Linux is actually doing underneath.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Choose one Tier 4 project and take the time to finish it properly. Each one is substantial enough to stand on its own.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>12. Build a .deb or .rpm Package<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Take one of your earlier scripts and package it properly. Include metadata, dependencies, the correct installation paths, a man page, and any required pre- or post-install scripts. You should be able to install and remove it cleanly through the system package manager.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What you\u2019ll practise:<\/strong> package metadata, dependency resolution, the Filesystem Hierarchy Standard, maintainer scripts, versioning, repositories, and the difference between distributing software through a package manager and simply copying a binary.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Advanced&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Time:<\/strong> 8 - 12 hours&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it proves:<\/strong> You understand what happens between building software and getting it installed correctly on another Linux machine.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Where it gets hard:<\/strong> Packaging metadata is easy to get slightly wrong. Follow the official Debian or Fedora documentation and inspect the package you create instead of relying on a copied example.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>See how Linux handles tar archives:<\/strong> <a href=\"https:\/\/www.scaler.com\/topics\/untar-command-in-linux\/\"><strong>untar Command in Linux<\/strong><\/a><strong>.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>13. Build a Container From Scratch With Namespaces and cgroups<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Build a small program or script that creates an isolated process using Linux namespaces and cgroups. Give it its own PID, mount, network, and hostname namespaces, apply a memory limit, and provide a root filesystem. Do it without Docker so you can see what the runtime is actually doing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What you\u2019ll practise:<\/strong> Linux namespaces, cgroups v2, chroot vs pivot_root, clone() and unshare(), PID isolation, mount namespaces, resource limits, and why a container is not a virtual machine.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Advanced&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Time:<\/strong> 12 - 16 hours&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it proves:<\/strong> You understand the kernel primitives behind container isolation rather than treating Docker as a black box.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Start with one namespace at a time. Get the PID namespace working, then add the mount and network isolation, and finally introduce cgroups. The project becomes much easier to debug when you know which layer introduced the problem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Where it gets hard:<\/strong> Getting \/proc mounted correctly inside the new mount namespace is a good test. When processes inside your container see their own PID 1, you can see the isolation working rather than just trusting a command's output.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Stretch:<\/strong> Once it works, compare your implementation with what Docker or another container runtime configures for a similar container.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Explore Docker and containerisation:<\/strong> <a href=\"https:\/\/www.scaler.com\/blog\/docker-roadmap\/\"><strong>Docker Roadmap<\/strong><\/a>.<\/p>\n\n\n<meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n    <!-- Source Sans Pro (topics font) -->\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Source+Sans+3:wght@400;600;700&amp;display=swap\" rel=\"stylesheet\">\n    <link rel=\"stylesheet\" href=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.css\">\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.js\"><\/script>\n\n    <style>\n      :root {\n        --ss-primary: #005bb3;        \/* primary-color-80 *\/\n        --ss-card-bg: #ffffff;\n        --ss-border: #e6e6e6;\n        --ss-quote-bg: #f6f6f6;\n        --ss-text-dark: #1c1c1c;\n        --ss-text-mid: #6b6b6b;\n        --ss-text-muted: #9a9a9a;\n        --ss-radius: 12px;\n        --ss-radius-sm: 8px;\n        --ss-shadow: 0 8px 16px 0 rgba(50, 71, 102, 0.16);\n      }\n\n      .scaler-ss * { box-sizing: border-box; }\n\n      .scaler-ss {\n        font-family: \"Source Sans 3\", \"Source Sans Pro\", \"Roboto\", Arial, sans-serif;\n        padding: 24px;\n        width: 100%;\n      }\n      .scaler-ss__inner {\n        max-width: 1000px;\n        margin: 0 auto;\n        position: relative;\n        width: 100%;\n      }\n\n      \/* Heading *\/\n      .scaler-ss__heading {\n        font-size: 26px;\n        line-height: 34px;\n        font-weight: 700;\n        margin: 0 0 16px;\n        text-align: center;\n        color: var(--ss-text-dark);\n      }\n\n      \/* Swiper *\/\n      .scaler-ss__swiper-wrap { position: relative; }\n      .scaler-ss .swiper { width: 100%; padding: 4px; }\n      .scaler-ss-swiper .swiper-slide {\n        width: 300px;          \/* topics card width *\/\n        height: auto;\n        display: flex;\n      }\n\n      \/* Card *\/\n      .scaler-ss-card {\n        display: flex;\n        flex-direction: column;\n        width: 100%;\n        border: 1px solid var(--ss-border);\n        border-radius: var(--ss-radius);\n        overflow: hidden;\n        background: var(--ss-card-bg);\n      }\n\n      .scaler-ss-card__hike {\n        padding: 8px 12px;\n        background: var(--ss-primary);\n        color: #ffffff;\n        font-size: 14px;\n        font-weight: 700;\n        text-align: center;\n        letter-spacing: 0.4px;\n      }\n\n      .scaler-ss-card__body {\n        display: flex;\n        flex: 1 1 auto;\n        flex-direction: column;\n        gap: 12px;\n        padding: 16px;\n      }\n\n      \/* Person *\/\n      .scaler-ss-card__person {\n        display: flex;\n        align-items: center;\n        gap: 10px;\n      }\n      .scaler-ss-card__avatar {\n        width: 44px;\n        height: 44px;\n        min-width: 44px;\n        border-radius: 50%;\n        object-fit: cover;\n        background: var(--ss-quote-bg);\n      }\n      .scaler-ss-card__name {\n        font-size: 16px;\n        font-weight: 700;\n        line-height: 20px;\n        color: var(--ss-text-dark);\n      }\n      .scaler-ss-card__city {\n        font-size: 13px;\n        line-height: 18px;\n        color: var(--ss-text-mid);\n      }\n\n      \/* Before \/ Now transition *\/\n      .scaler-ss-card__transition {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        gap: 8px;\n      }\n      .scaler-ss-card__col {\n        flex: 1;\n        min-width: 0;\n      }\n      .scaler-ss-card__col-label {\n        font-size: 11px;\n        font-weight: 600;\n        letter-spacing: 0.4px;\n        color: var(--ss-text-muted);\n        margin-bottom: 2px;\n      }\n      .scaler-ss-card__col-role {\n        font-size: 13px;\n        line-height: 18px;\n        color: var(--ss-text-mid);\n      }\n      .scaler-ss-card__col-company {\n        font-size: 14px;\n        font-weight: 700;\n        line-height: 20px;\n        color: var(--ss-text-dark);\n      }\n      .scaler-ss-card__company-logo {\n        margin-top: 2px;\n        max-width: 64px;\n        max-height: 20px;\n        width: auto;\n        height: auto;\n        object-fit: contain;\n        display: block;\n      }\n      .scaler-ss-card__arrow {\n        flex-shrink: 0;\n        width: 28px;\n        height: 8px;\n        color: var(--ss-text-mid);\n        fill: currentColor;\n      }\n\n      \/* Quote *\/\n      .scaler-ss-card__quote {\n        font-size: 13px;\n        font-style: italic;\n        line-height: 19px;\n        color: var(--ss-text-mid);\n        background: var(--ss-quote-bg);\n        border-radius: var(--ss-radius-sm);\n        padding: 8px 10px;\n      }\n\n      \/* View Profile *\/\n      .scaler-ss-card__cta,\n      .scaler-ss-card__cta:link,\n      .scaler-ss-card__cta:visited {\n        display: block;\n        margin-top: auto;\n        text-align: center;\n        font-size: 14px;\n        font-weight: 600;\n        color: var(--ss-primary) !important;\n        text-decoration: none;\n        border: 1px solid var(--ss-primary);\n        border-radius: var(--ss-radius-sm);\n        padding: 9px 12px;\n        cursor: pointer;\n        transition: background 0.2s ease, color 0.2s ease;\n      }\n      .scaler-ss-card__cta:hover,\n      .scaler-ss-card__cta:focus {\n        background: var(--ss-primary);\n        color: #ffffff !important;\n      }\n\n      \/* Side navigation arrows *\/\n      .scaler-ss__nav {\n        position: absolute !important;\n        top: 50% !important;\n        transform: translateY(-50%) !important;\n        z-index: 2;\n        width: 46px !important;\n        height: 46px !important;\n        min-width: 46px;\n        display: flex !important;\n        align-items: center;\n        justify-content: center;\n        padding: 0 !important;\n        background: var(--ss-card-bg) !important;\n        border: none !important;\n        border-radius: var(--ss-radius-sm) !important;\n        box-shadow: var(--ss-shadow) !important;\n        color: #61738e !important;\n        cursor: pointer;\n        transition: opacity 0.2s ease, visibility 0.2s ease;\n      }\n      .scaler-ss__nav--prev { left: 8px !important; }\n      .scaler-ss__nav--next { right: 8px !important; }\n      .scaler-ss__nav svg {\n        width: 20px !important;\n        height: 20px !important;\n        fill: #61738e !important;\n      }\n      .scaler-ss__nav.swiper-button-disabled {\n        opacity: 0;\n        visibility: hidden;\n        pointer-events: none;\n      }\n\n      .scaler-ss .swiper-button-prev,\n      .scaler-ss .swiper-button-next,\n      .scaler-ss .swiper-pagination { display: none; }\n\n      \/* Skeleton *\/\n      .scaler-ss-card--skeleton { pointer-events: none; }\n      .scaler-ss-card--skeleton .scaler-ss-card__hike,\n      .scaler-ss-card--skeleton .scaler-ss-card__avatar,\n      .scaler-ss-card--skeleton .scaler-ss-card__person-text,\n      .scaler-ss-card--skeleton .scaler-ss-card__transition,\n      .scaler-ss-card--skeleton .scaler-ss-card__quote,\n      .scaler-ss-card--skeleton .scaler-ss-card__cta {\n        background: linear-gradient(90deg, var(--ss-border) 25%, var(--ss-quote-bg) 50%, var(--ss-border) 75%);\n        background-size: 200% 100%;\n        animation: ss-shimmer 1.5s infinite;\n        color: transparent !important;\n        border-color: transparent !important;\n        border-radius: 4px;\n      }\n      .scaler-ss-card--skeleton .scaler-ss-card__person-text { flex: 1; height: 32px; }\n      .scaler-ss-card--skeleton .scaler-ss-card__transition { height: 56px; }\n      .scaler-ss-card--skeleton .scaler-ss-card__quote { height: 48px; }\n      .scaler-ss-card--skeleton .scaler-ss-card__cta { height: 38px; }\n\n      @keyframes ss-shimmer {\n        0% { background-position: 200% 0; }\n        100% { background-position: -200% 0; }\n      }\n\n      @media (max-width: 768px) {\n        .scaler-ss { padding: 16px; }\n        .scaler-ss__heading { font-size: 22px; line-height: 30px; }\n        .scaler-ss-swiper .swiper-slide { width: 270px; }\n        .scaler-ss__nav { display: none !important; }\n      }\n    <\/style>\n\n\n\n    <div class=\"scaler-ss js-scaler-ss\">\n\n      <template class=\"js-ss-card-template\">\n        <div class=\"swiper-slide\">\n          <article class=\"scaler-ss-card\">\n            <div class=\"scaler-ss-card__hike js-ss-hike\"><\/div>\n            <div class=\"scaler-ss-card__body\">\n              <div class=\"scaler-ss-card__person\">\n                <img decoding=\"async\" class=\"scaler-ss-card__avatar js-ss-avatar\" src=\"\" alt=\"\" loading=\"lazy\">\n                <div class=\"scaler-ss-card__person-text\">\n                  <div class=\"scaler-ss-card__name js-ss-name\"><\/div>\n                  <div class=\"scaler-ss-card__city js-ss-city\"><\/div>\n                <\/div>\n              <\/div>\n\n              <div class=\"scaler-ss-card__transition\">\n                <div class=\"scaler-ss-card__col\">\n                  <div class=\"scaler-ss-card__col-label\">BEFORE:<\/div>\n                  <div class=\"scaler-ss-card__col-role js-ss-before-role\"><\/div>\n                  <div class=\"scaler-ss-card__col-company js-ss-before-company\"><\/div>\n                <\/div>\n                <svg class=\"scaler-ss-card__arrow\" viewBox=\"0 0 32 8\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M31.3882 4.35355C31.5835 4.15829 31.5835 3.84171 31.3882 3.64645L28.2062 0.464466C28.011 0.269204 27.6944 0.269204 27.4991 0.464466C27.3039 0.659728 27.3039 0.976311 27.4991 1.17157L30.3276 4L27.4991 6.82843C27.3039 7.02369 27.3039 7.34027 27.4991 7.53553C27.6944 7.7308 28.011 7.7308 28.2062 7.53553L31.3882 4.35355ZM0.034668 4.5H31.0347V3.5H0.034668V4.5Z\"><\/path><\/svg>\n                <div class=\"scaler-ss-card__col\">\n                  <div class=\"scaler-ss-card__col-label\">NOW:<\/div>\n                  <div class=\"scaler-ss-card__col-role js-ss-now-role\"><\/div>\n                  <div class=\"js-ss-now-company\"><\/div>\n                <\/div>\n              <\/div>\n\n              <div class=\"scaler-ss-card__quote js-ss-quote\"><\/div>\n\n              <a class=\"scaler-ss-card__cta js-ss-cta\" href=\"#\" target=\"_blank\" rel=\"noopener\">View Profile<\/a>\n            <\/div>\n          <\/article>\n        <\/div>\n      <\/template>\n\n      <div class=\"scaler-ss__inner\">\n        <h2 class=\"scaler-ss__heading\"><span class=\"ez-toc-section\" id=\"scaler-alumni-and-their-success-stories\"><\/span>Scaler Alumni and Their Success Stories<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n        <div class=\"scaler-ss__swiper-wrap\">\n          <div class=\"swiper scaler-ss-swiper\">\n            <div class=\"swiper-wrapper js-ss-wrapper\"><\/div>\n          <\/div>\n\n          <button class=\"scaler-ss__nav scaler-ss__nav--prev js-ss-prev\" aria-label=\"Previous\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(-90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"><\/path><\/svg>\n          <\/button>\n          <button class=\"scaler-ss__nav scaler-ss__nav--next js-ss-next\" aria-label=\"Next\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"><\/path><\/svg>\n          <\/button>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <script>\n    document.addEventListener(\"DOMContentLoaded\", () => {\n\n      const ASSET_CDN = \"https:\/\/d2beiqkhq929f0.cloudfront.net\/public_assets\/assets\";\n      const AVATAR_FALLBACK =\n        \"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='44' height='44' viewBox='0 0 44 44'%3E%3Ccircle cx='22' cy='22' r='22' fill='%23e6e6e6'\/%3E%3Ccircle cx='22' cy='17' r='7' fill='%23b9b9b9'\/%3E%3Cpath d='M8 40c0-8 6.3-13 14-13s14 5 14 13' fill='%23b9b9b9'\/%3E%3C\/svg%3E\";\n\n      \/\/ Mirrors buildAssetUrl(): pass through absolute urls, else build the CDN url.\n      function buildAssetUrl(raw) {\n        if (!raw) return \"\";\n        if (String(raw).startsWith(\"http\")) return raw;\n        return `${ASSET_CDN}\/${raw}\/original`;\n      }\n\n      const instances = document.querySelectorAll(\".js-scaler-ss\");\n\n      instances.forEach(container => {\n        if (container.dataset.initialized === \"true\") return;\n        container.dataset.initialized = \"true\";\n\n        const swiperElement = container.querySelector(\".scaler-ss-swiper\");\n        const wrapper = container.querySelector(\".js-ss-wrapper\");\n        const template = container.querySelector(\".js-ss-card-template\");\n        const nextBtn = container.querySelector(\".js-ss-next\");\n        const prevBtn = container.querySelector(\".js-ss-prev\");\n\n        if (!wrapper || !template) {\n          console.error(\"Scaler Success Stories: missing required elements\");\n          return;\n        }\n\n        const swiper = new Swiper(swiperElement, {\n          slidesPerView: \"auto\",\n          spaceBetween: 16,\n          grabCursor: true,\n          observer: true,\n          observeParents: true,\n          navigation: { nextEl: nextBtn, prevEl: prevBtn },\n        });\n\n        const pathParts = location.pathname.split(\"\/\").filter(Boolean);\n        const currentSlug = pathParts.length > 0 ? pathParts[pathParts.length - 1] : \"homepage\";\n        const profileUrl =\n          `https:\/\/www.scaler.com\/review\/?utm_source=blog&utm_medium=success_stories&utm_content=${currentSlug}`;\n\n        function showSkeletons(count = 4) {\n          wrapper.innerHTML = \"\";\n          for (let i = 0; i < count; i++) {\n            const clone = template.content.cloneNode(true);\n            clone.querySelector(\".scaler-ss-card\").classList.add(\"scaler-ss-card--skeleton\");\n            wrapper.appendChild(clone);\n          }\n          swiper.update();\n        }\n\n        function renderStories(stories) {\n          wrapper.innerHTML = \"\";\n          if (!stories.length) {\n            container.style.display = \"none\";   \/\/ match topics: render nothing when empty\n            return;\n          }\n\n          stories.forEach(story => {\n            const a = story.attributes || {};\n            const clone = template.content.cloneNode(true);\n\n            const hike = String(a.growth || \"\").replace(\"%\", \"\").trim() || \"150\";\n            clone.querySelector(\".js-ss-hike\").textContent = `${hike}% HIKE`;\n\n            \/\/ Avatar\n            const avatar = buildAssetUrl(a.image_url) || a.generated_thumbnail_url || \"\";\n            const img = clone.querySelector(\".js-ss-avatar\");\n            img.src = avatar || AVATAR_FALLBACK;\n            img.alt = a.name || \"Scaler alumnus\";\n            img.onerror = function () { this.onerror = null; this.src = AVATAR_FALLBACK; };\n\n            clone.querySelector(\".js-ss-name\").textContent = a.name || \"\";\n            const cityEl = clone.querySelector(\".js-ss-city\");\n            if (a.city) cityEl.textContent = a.city; else cityEl.style.display = \"none\";\n\n            \/\/ BEFORE\n            clone.querySelector(\".js-ss-before-role\").textContent = a.pre_scaler_role || a.pre_academy_company || \"\";\n            const beforeCompany = clone.querySelector(\".js-ss-before-company\");\n            if (a.pre_academy_company) beforeCompany.textContent = a.pre_academy_company;\n            else beforeCompany.style.display = \"none\";\n\n            \/\/ NOW\n            clone.querySelector(\".js-ss-now-role\").textContent = a.role || \"\";\n            const nowCompanyBox = clone.querySelector(\".js-ss-now-company\");\n            const companyLogo = buildAssetUrl(a.company_logo_url);\n            if (companyLogo) {\n              const logo = document.createElement(\"img\");\n              logo.className = \"scaler-ss-card__company-logo\";\n              logo.src = companyLogo;\n              logo.alt = a.post_academy_company || \"company\";\n              logo.loading = \"lazy\";\n              logo.onerror = function () {\n                this.onerror = null;\n                this.replaceWith(Object.assign(document.createElement(\"div\"), {\n                  className: \"scaler-ss-card__col-company\",\n                  textContent: a.post_academy_company || \"\",\n                }));\n              };\n              nowCompanyBox.appendChild(logo);\n            } else if (a.post_academy_company) {\n              nowCompanyBox.className = \"scaler-ss-card__col-company\";\n              nowCompanyBox.textContent = a.post_academy_company;\n            }\n\n            \/\/ Quote (clip to 110 chars like topics)\n            const quoteEl = clone.querySelector(\".js-ss-quote\");\n            quoteEl.textContent = `\u201c${String(a.content).slice(0, 110)}\u2026\u201d`;\n\n            \/\/ View Profile\n            clone.querySelector(\".js-ss-cta\").href = profileUrl;\n\n            wrapper.appendChild(clone);\n          });\n\n          swiper.update();\n          swiper.slideTo(0);\n        }\n\n        async function fetchStories() {\n          try {\n            showSkeletons();\n            \/\/ Same-origin POST on www.scaler.com (the blog canonical host).\n            \/\/ The endpoint only returns JSON when the Referer is a \/topics\/ page\n            \/\/ (a soft anti-hotlinking gate); a \/blog\/ referer gets a Turbolinks\n            \/\/ redirect. Since blog + topics are the same origin, we set the\n            \/\/ fetch referrer to a topics URL so the server serves the data.\n            const res = await fetch(\"\/success-stories\/testimonials\", {\n              method: \"POST\",\n              credentials: \"include\",\n              referrer: \"https:\/\/www.scaler.com\/topics\/\",\n              referrerPolicy: \"unsafe-url\",\n              headers: {\n                \"Content-Type\": \"application\/json\",\n                \"Accept\": \"application\/json\",\n                \"X-Requested-With\": \"XMLHttpRequest\",\n              },\n              \/\/ q:{} => all programs (no program filter)\n              body: JSON.stringify({\n                page_number: 1,\n                per_page: 12,\n                sort_by: \"eligible_for_qna\",\n                new_quick_filters: true,\n                quick_filter: [],\n                q: {},\n              }),\n            });\n            const json = await res.json();\n            const all = (json && json.data && json.data.data) || [];\n            \/\/ Only show stories that carry a testimonial quote (matches topics).\n            const withQuote = all.filter(s => s.attributes && s.attributes.content);\n            renderStories(withQuote);\n          } catch (error) {\n            console.error(\"Failed to load success stories:\", error);\n            container.style.display = \"none\";\n          }\n        }\n\n        fetchStories();\n      });\n    });\n    <\/script>\n\n\n<h3 class=\"wp-block-heading\"><strong>14. Compile and Load a Linux Kernel Module<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Start with a simple loadable kernel module, then extend it into something useful, such as a character device or a module that exposes information through \/proc. Compile it against your VM's kernel, load it with insmod, inspect its output with dmesg, and unload it cleanly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What you\u2019ll practise:<\/strong> kernel space vs user space, kernel headers and the kernel build system, module_init, module_exit, printk, dmesg, system calls, and why kernel code cannot rely on the standard C library.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The key difference is what happens when your code crosses from user space into the kernel. In user space, a bad pointer usually kills your process. In kernel space, a similar mistake can affect the entire system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Advanced&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Time:<\/strong> 10 - 14 hours&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it proves:<\/strong> You understand the basic mechanics of loading code into the kernel and the risks that come with crossing the user\/kernel boundary.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Understand Linux kernel architecture: <a href=\"https:\/\/www.scaler.com\/topics\/linux-kernel-architecture\/\">Kernel Architecture of Linux<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Where it gets hard:<\/strong> A kernel bug can crash the machine. Use a VM only<strong>.<\/strong> Take a snapshot before loading experimental modules so you have a reliable recovery point.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Also check:<\/strong> <a href=\"https:\/\/www.scaler.com\/topics\/operating-system\/system-calls-in-operating-system\/\"><strong>System Calls in OS (Operating System)<\/strong><\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>15. Build a Minimal Linux Distribution (Linux From Scratch Style)<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Build a small bootable Linux system from source. You need a kernel, a minimal userland such as BusyBox or core utilities, an init process, and a root filesystem that boots in a VM and gives you a shell prompt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What you\u2019ll practise:<\/strong> what makes up a Linux distribution, the boot chain, bootloader &gt; kernel &gt; initramfs &gt; init &gt; shell, toolchains, cross-compilation, static vs dynamic linking, and the minimum components required for a usable system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Advanced, hardest on the list&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Time:<\/strong> 20 - 30 hours&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it proves:<\/strong> You understand what a Linux distribution is assembling for you and what happens between turning on a machine and getting a shell.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Expect failed boots and missing dependencies. That is not wasted time here. Each failure tells you something about the boot process, filesystem layout, libraries, or userspace that a normal distribution normally hides from you.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Where it gets hard:<\/strong> Pretty much everywhere. Keep notes on each failure and the change that fixed it. By the end, you should be able to explain the boot process rather than simply say that you built a minimal distribution.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You won\u2019t use this project as often as you\u2019ll use the administration and scripting projects in this list, but it gives you a chance to understand what Linux is doing underneath the commands you normally use. Build it if you want to understand how the operating system handles those operations internally, and treat it as a deeper exploration of Linux rather than a project you need to add just to strengthen your portfolio.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"the-concept-to-project-map-which-project-teaches-what\"><\/span><strong>The Concept-to-Project Map (Which Project Teaches What)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you'd rather work backwards, start with the Linux concept you understand least and choose the project that forces you to use it. The map below also gives you a sensible progression if you want to work through the concepts in order.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Linux concept<\/strong><\/td><td><strong>Projects that force it<\/strong><\/td><td><strong>Why it matters in real work<\/strong><\/td><\/tr><tr><td>Shell scripting &amp; pipelines<\/td><td>1, 2, 3, 4<\/td><td>The universal glue of Linux work<\/td><\/tr><tr><td>File permissions &amp; ownership<\/td><td>2, 5, 8, 9<\/td><td>The most common source of \u201cit works for me\u201d bugs<\/td><\/tr><tr><td>Users, groups &amp; privilege<\/td><td>5, 8<\/td><td>Access control is a daily operational task<\/td><\/tr><tr><td>Processes &amp; signals<\/td><td>6, 7, 13<\/td><td>Debugging anything that's running<\/td><\/tr><tr><td>Filesystems &amp; mounts<\/td><td>9, 15<\/td><td>Storage is where production incidents live<\/td><\/tr><tr><td>Cron &amp; systemd timers<\/td><td>4, 7<\/td><td>All scheduled work<\/td><\/tr><tr><td>systemd &amp; service management<\/td><td>7, 10<\/td><td>Universal on modern Linux; heavily interviewed<\/td><\/tr><tr><td>Logging &amp; journald<\/td><td>3, 7, 8<\/td><td>The first place you look when something breaks<\/td><\/tr><tr><td>Networking &amp; ports<\/td><td>8, 10, 11<\/td><td>Every service is a network service<\/td><\/tr><tr><td>Package management<\/td><td>2, 12<\/td><td>How software gets onto machines<\/td><\/tr><tr><td>Security &amp; hardening<\/td><td>5, 8, 10<\/td><td>Non-negotiable for anything internet-facing<\/td><\/tr><tr><td>Namespaces &amp; cgroups<\/td><td>13<\/td><td>The foundation of every container platform<\/td><\/tr><tr><td>Kernel &amp; modules<\/td><td>14, 15<\/td><td>Systems, embedded, and performance work<\/td><\/tr><tr><td>Boot process<\/td><td>7, 15<\/td><td>\u201cIt didn't come back after reboot\u201d<\/td><\/tr><tr><td>Infrastructure as code<\/td><td>2, 11<\/td><td>The core DevOps competency<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Explore a complete learning path:<\/strong> <a href=\"https:\/\/www.scaler.com\/topics\/course\/free-operating-system-course\/\"><strong>Operating System Course with Certification<\/strong><\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"the-confident-power-user-checklist\"><\/span><strong>The Confident Power User Checklist<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The difference between someone who Googles every command and someone who is genuinely comfortable with Linux isn't the number of commands they have memorised. It is the set of habits they have built through repeated use.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You read man pages instead of immediately searching. The answer is often already on the machine. Know how to use man, --help, and \/ to search within a manual page.<\/li>\n\n\n\n<li>You think in pipes. Instead of looking for one command that does everything, you combine small tools that each do one job well.<\/li>\n\n\n\n<li>You reason about permissions instead of reaching for chmod 777. If you see -rw-r-----, you should be able to work out who can read or modify the file and why.<\/li>\n\n\n\n<li>You can find what is consuming a resource. When disk space disappears, CPU usage spikes, or memory runs low, you have a first diagnostic step. Rebooting isn't the diagnosis.<\/li>\n\n\n\n<li>You manage processes deliberately. You know the difference between SIGTERM and SIGKILL, and you understand why kill -9 should not be your first response.<\/li>\n\n\n\n<li>You use the right debugging tool. journalctl for services, dmesg for kernel and hardware messages, strace when you need to inspect system calls, and lsof or ss when you need to find which process owns a file, socket, or port.<\/li>\n\n\n\n<li>You write idempotent scripts. Running a script twice should not leave the system in a worse state. set -euo pipefail should become familiar rather than something you copy from a template.<\/li>\n\n\n\n<li>You check exit codes. A script producing output does not mean it succeeded. You know how to check its return status and handle failure.<\/li>\n\n\n\n<li>You're comfortable with a terminal editor. Vim or nano is enough. The important thing is being able to edit a configuration file on a server without a GUI.<\/li>\n\n\n\n<li>You use SSH properly. Use keys rather than passwords where appropriate, and keep a ~\/.ssh\/config so you aren't repeatedly typing the same connection details.<\/li>\n\n\n\n<li>You know where things live. \/etc contains configuration, \/var\/log contains logs, \/proc exposes kernel and process state. You navigate Linux by understanding its structure rather than searching blindly.<\/li>\n\n\n\n<li>You read error messages fully. Before opening a search engine, read what the program actually told you. The error often gives you the first useful clue.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Most engineers who use Linux regularly will develop many of these habits naturally. You don't need to check all twelve boxes at once. If you can work through the list and understand why each habit matters, you're moving from memorising commands to actually reasoning about the system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Check out:<\/strong> <a href=\"https:\/\/www.scaler.com\/topics\/wq-command-in-linux\/\"><strong>the wq Command in Linux<\/strong><\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"what-these-projects-prove-in-a-devops-sre-or-backend-interview\"><\/span><strong>What These Projects Prove in a DevOps, SRE or Backend Interview<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When Linux comes up in a <a href=\"https:\/\/www.scaler.com\/blog\/devops-engineer-skills\/\">DevOps<\/a>, SRE, cloud, platform engineering, or backend interview, you may be asked to investigate something that isn't working as expected. The problem could be a service that won't start, a server responding slowly, a deployment that has failed, or a user who cannot access a file. You\u2019ll need to know what to check first, which commands can give you that information, and how to use the results to narrow down the cause.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The projects in this list cover many of those situations. If you build a log parser, for example, you can discuss how you handled unexpected log entries; a user provisioning script gives you a way to discuss permissions, groups, SSH access, and sudo privileges; and a service-management project can help you explain how you investigated a failed service. These are the kinds of details you can bring into an interview when you're asked how you would diagnose a problem instead of simply being asked what a command does.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Project: the interview question it lets you answer<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Project<\/strong><\/td><td><strong>Interview questions you can now answer from experience<\/strong><\/td><\/tr><tr><td>4 <strong>-<\/strong> Backup + cron<\/td><td>\u201cYour cron job runs manually but not on schedule. How would you debug it?\u201d<\/td><\/tr><tr><td>5 - User provisioning<\/td><td>\u201cExplain Linux file permissions.\u201d \/ \u201cHow would you give a user limited sudo access?\u201d<\/td><\/tr><tr><td>6 - \/proc monitoring<\/td><td>\u201cThe server is slow. Walk me through your investigation.\u201d \/ \u201cWhat's the difference between load average and CPU utilisation?\u201d<\/td><\/tr><tr><td>7 - systemd service<\/td><td>\u201cYour service didn't restart after a reboot. What would you check?\u201d<\/td><\/tr><tr><td>8 - Hardening<\/td><td>\u201cHow would you secure a fresh internet-facing Linux server?\u201d<\/td><\/tr><tr><td>10 - nginx + TLS<\/td><td>\u201cWalk me through what happens from DNS to the response when a user visits your site.\u201d<\/td><\/tr><tr><td>11 - VM provisioning<\/td><td>\u201cWhat does infrastructure as code mean to you? Have you used it?\u201d<\/td><\/tr><tr><td>13 - Container from scratch<\/td><td>\u201cWhat is a container, really? How is it different from a VM?\u201d<\/td><\/tr><tr><td>14 - Kernel module<\/td><td>\u201cWhat's the difference between user space and kernel space?\u201d<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">When you talk about a project in an interview, lead with the problem, not the tool. \u201cMy cron backup was silently failing at 2 a.m., so I traced the problem to cron's limited environment and missing PATH\u201d will have more value than saying \u201cI know cron.\u201d The first answer shows that you've actually diagnosed a failure.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The same applies when using Linux projects for DevOps roles or adding Linux projects for resume on your resume. Don't list ten tools and expect the tools themselves to make the project impressive. Pick a few projects you can explain in detail, including what broke, how you investigated it, and what you would change if you built it again.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Linux is a foundation for DevOps and SRE work, but these projects are only the starting point. The next skills to build are networking, cloud infrastructure, containers, CI\/CD, and eventually orchestration. If Kubernetes is the next step you\u2019re considering, <a href=\"https:\/\/www.scaler.com\/blog\/kubernetes-roadmap\/\">the Kubernetes Roadmap<\/a> covers how it fits into that progression.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you're also looking at the career side of DevOps, you can explore <a href=\"https:\/\/www.scaler.com\/blog\/devops-engineer-salary\/\">DevOps Engineer Salaries in India<\/a> to get an idea of how compensation varies across roles and experience levels.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"common-mistakes-that-stall-linux-learners\"><\/span><strong>Common Mistakes That Stall Linux Learners<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A few common habits can make Linux projects harder to learn from than they need to be.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Collecting tutorials without building:<\/strong> Bookmarking videos and guides can quickly turn into a long list of things you plan to try later. Pick a project and use the tutorials you need while building it. That gives you a chance to apply what you\u2019re reading and deal with problems as they come up.<\/li>\n\n\n\n<li><strong>Copying scripts without debugging them:<\/strong> If you find a script online, go through it and understand what each part does before using it. Try writing your own version, introduce an error, and see if you can find the cause. Once you have done that, comparing your solution with an existing implementation can show you other ways to approach the same problem.<\/li>\n\n\n\n<li><strong>Practising on your only machine:<\/strong> Keep experiments that involve system configuration, filesystems, firewall rules, or other risky changes inside a VM or another disposable environment. If something goes wrong, you can restore the environment and continue without affecting your main machine.<\/li>\n\n\n\n<li><strong>Using chmod 777 for every permissions problem:<\/strong> Check who needs access to the file and whether they need read, write, or execute permission, then set the permissions accordingly. This also helps you understand why the original permission setting caused the problem.<\/li>\n\n\n\n<li><strong>Skipping the reboot test:<\/strong> Restart the machine before you consider the project finished and check that your services, mounts, scheduled jobs, networking, and other configuration still work. A setup that depends on something you did manually during development may need additional configuration to start correctly.<\/li>\n\n\n\n<li><strong>Not documenting the project:<\/strong> Keep a README with the setup steps, important decisions, problems you encountered, and the fixes you used. Include enough detail for you or someone else to set it up again later.<\/li>\n\n\n\n<li><strong>Starting with the most advanced projects:<\/strong> Work through the earlier tiers before moving into the Tier 4 projects. The shell, administration, services, and networking skills from the earlier projects will give you the foundation for the more advanced system-level work.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>CONCLUSION&nbsp;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">These projects should leave you with more than a list of commands. You should be able to look at a system, work out what is wrong, decide what to check next, and use the right commands to confirm your diagnosis.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A few well-finished projects, built consistently over three to four months, can take you much further than trying to complete all 15.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open a terminal tonight and start with Project 1. It takes an evening, and the shell environment you build is something you'll keep using afterwards.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the infrastructure side of this list is where you want to end up, Linux fundamentals, containers, CI\/CD, and cloud are covered end-to-end with mentor guidance in <a href=\"https:\/\/www.scaler.com\/devops-course\/\">Scaler's DevOps &amp; Cloud Computing program<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"faqs\"><\/span><strong>FAQs<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1. What projects can I do with Linux?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Start with small projects that you'll actually use, such as your own shell environment, a dotfiles repository, a log analysis utility, or a backup automation script. Once you're able to do these Linux projects for students, move on to user management, systemd services, and server hardening. From there, you can try containers, kernel modules, and even building your own minimal Linux system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2. What jobs can I get if I learn Linux?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Linux is an essential skill for DevOps, Site Reliability Engineering (SRE), cloud engineering, platform engineering, system administration, and many backend roles. You rarely see Linux as a job title on its own. Instead, it is a skill you use when working with servers, services, networking, and troubleshooting.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3. How do I build a project in Linux?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Start with a disposable environment such as a VirtualBox VM that you can snapshot. WSL2 is great for shell and scripting projects, while a cloud VM can come in handy when you need public server access. Pick a single project, keep it in Git with a README, and make sure it still works after a reboot.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>4. How long does it take to get good at Linux?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With regular hands-on practice, three to four months is enough to be familiar with tasks such as scripting, server administration, and service debugging. More advanced work involving kernels, containers, and custom Linux distributions usually takes longer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>5. Do I need to dual-boot Linux to learn it?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No. A virtual machine is a better starting point because you can take snapshots and recover easily when something goes wrong. WSL2 is also useful on Windows for shell and scripting work. Consider dual-boot or bare metal later, once you're comfortable with Linux and understand the risks around partitioning.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>6. Are Linux projects useful on a resume?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Yes, if you can explain what you built and why. \"Secured a Linux internet-facing server with SSH keys only, default-deny firewall, and automatic security updates\" is much more impressive than \"Proficient with Linux.\" Add your project to Git along with a README file discussing the process you went through in setting up your project.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>7. Should I use Linux projects with source code?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use existing codebases when you get genuinely stuck, rather than copying them from the start. Much of the value in a Linux project comes from troubleshooting: fixing a permissions issue, figuring out why a cron job failed silently, or finding out why a service won't start. Copying the solution skips that part of the learning.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>8. Is Kali Linux good for beginners?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you're learning Linux fundamentals, start with a general-purpose distribution such as Ubuntu, Debian, or Fedora. Kali Linux is designed around penetration testing and security work, so you can move to it once security becomes the area you want to focus on.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>You can know the most common Linux commands and still be unsure about what to do when something goes wrong. You might know ps for checking processes, grep for finding information in command output, chmod for changing permissions, and systemctl for managing services, but when a script fails or a service stops, you still need [&hellip;]<\/p>\n","protected":false},"author":242,"featured_media":14429,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[410],"tags":[614],"class_list":["post-14428","post","type-post","status-publish","format-standard","has-post-thumbnail","category-projects","tag-linux-projects"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/posts\/14428","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/users\/242"}],"replies":[{"embeddable":true,"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/comments?post=14428"}],"version-history":[{"count":1,"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/posts\/14428\/revisions"}],"predecessor-version":[{"id":14430,"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/posts\/14428\/revisions\/14430"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/media\/14429"}],"wp:attachment":[{"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/media?parent=14428"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/categories?post=14428"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/tags?post=14428"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}