<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Myblog.ru]]></title><description><![CDATA[Myblog.ru]]></description><link>https://myblog.ru</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Apr 2026 08:49:17 GMT</lastBuildDate><atom:link href="https://myblog.ru/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Resident mempalace]]></title><description><![CDATA[The timeline we are living in. Last night Ben Sigman posted that he and Milla Jovovich had released the MemPalace project publicly on GitHub. The project tackles the problem of high-quality recall in ]]></description><link>https://myblog.ru/resident-mempalace</link><guid isPermaLink="true">https://myblog.ru/resident-mempalace</guid><category><![CDATA[AI]]></category><category><![CDATA[recall]]></category><category><![CDATA[llm]]></category><category><![CDATA[RAG ]]></category><dc:creator><![CDATA[Mikhail Kashkin]]></dc:creator><pubDate>Tue, 07 Apr 2026 18:33:30 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/626bb3ef6072cdb96d1495fd/e7271050-3650-4e1e-a03a-c1acf429c62f.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The timeline we are living in. Last night Ben Sigman posted that he and Milla Jovovich had released the MemPalace project publicly on GitHub. The project tackles the problem of high-quality recall in AI/RAG systems.</p>
<p>And yes, on Instagram Milla is now described as "Mother/Actress/Architect of MemPalace free and open source on GitHub" (Mother/Actress/Architect of the free and open MemPalace project on GitHub). If you had any doubts that programming and AI are the future, well, now even a successful actress has moved into tech and is committing on GitHub. All my favorite lorelines are together now.</p>
<p>Now let's break down the idea and the product itself, because I really like it and there is a lot of room to develop it further. The core idea is inspired by the ancient mnemonic technique of the "memory palace" (Memory Palace / Method of Loci). The method also has another name in Russian, "chambers of the mind," but I think that name is so cool it should be saved for something else.</p>
<p>The essence of the method is to visualize in your head the objects you want to remember and build stories between them. You may have <a href="https://www.youtube.com/watch?v=0FSKTndbwVo">seen a visualization of this method in Sherlock</a> with Cumberbatch and Freeman. There it was presented almost like magic and a special ability of the hero. But the method actually works. If you are interested, you can read the book "Moonwalking with Einstein: The Art and Science of Remembering Everything"; it was written by a journalist who studied U.S. memory champions. It turns out such competitions really do exist.</p>
<p>Ben and Milla developed and formalized this idea into an interesting engineering solution. In the repository, AAAK is described as a special compact notation for AI. But an important technical caveat belongs here: the project README promises <em>lossless shorthand</em> and 30x compression, while the actual code in <code>mempalace/dialect.py</code> currently behaves much more modestly. The current <code>Dialect.compress()</code> does not build rich structures like <code>TEAM: ... / PROJ: ... / DECISION: ...</code> for arbitrary text and does not look like a format from which the original paragraph can be reconstructed unambiguously.</p>
<p>In other words, the pretty pseudo-graph notation from the promo materials and from Grok answers does not match what the code actually emits for real input. For ordinary text, the current implementation only keeps a few entities, a few topics, one "key" phrase, and a handful of flags. This is closer to a compact heuristic shorthand than to a real lossless text codec.</p>
<p>Here is an example of AAAK for the first three paragraphs of the text, produced by Grok. This is <strong>not the real output of <code>Dialect.compress()</code></strong>, but rather an illustration of the format the authors seem to want:</p>
<p><code>TIMELINE:2026-04 | EVENT: BEN.SIG+ MILLA.JOV released MEMPALACE(open.source.github) | ★★★★★</code></p>
<p><code>MILLA.IG.bio: Mother/Actress/Architect.of.MemPalace(free+open.source.github)</code>
<code>NOTE: actress→AI.dev | commits.github | all.fav.lores.together | ★★★★</code></p>
<p><code>IDEA: inspired.MemoryPalace(Method.of.Loci) | aka."чертоги.разума"(better.for.other)</code>
<code>CORE: visualize.objects | build.stories.between | ex:SHERLOCK(Cumberbatch) | real.working.method</code></p>
<p><code>BOOK.rec: "Эйнштейн.гуляет.по.Луне"(Joshua.Foer) | author:journalist.studied.US.memory.champs | exists.competitions | ★★★</code></p>
<p>Problems with this example:</p>
<ul>
<li>It is not the output of the actual project code.</li>
<li>This notation does not match the current <code>Dialect.compress()</code> function.</li>
<li>The claim that it can be "unambiguously reconstructed into the original text" is not supported by the current code.</li>
<li>For Russian text, the current implementation works poorly because topic extraction and fallback entity recognition in <code>dialect.py</code> are built around Latin script.</li>
</ul>
<p>I checked the token counts through <a href="https://platform.openai.com/tokenizer">https://platform.openai.com/tokenizer</a> and got much more grounded numbers. Grok says the original text is ~850 tokens and the AAAK version is ~110 tokens, while I got 268 versus 180.</p>
<p>I also checked the example from the documentation using the same tokenizer:</p>
<p><strong>English (~1000 tokens), OpenAI tokenizer counts 66 tokens</strong></p>
<pre><code>Priya manages the Driftwood team: Kai (backend, 3 years), Soren (frontend),

Maya (infrastructure), and Leo (junior, started last month). They're building

a SaaS analytics platform. Current sprint: auth migration to Clerk.

Kai recommended Clerk over Auth0 based on pricing and DX.
</code></pre>
<p><strong>AAAK (~120 tokens), OpenAI counts 73 tokens:</strong></p>
<pre><code>TEAM: PRI(lead) | KAI(backend,3yr) SOR(frontend) MAY(infra) LEO(junior,new)

PROJ: DRIFTWOOD(saas.analytics) | SPRINT: auth.migration→clerk

DECISION: KAI.rec:clerk&gt;auth0(pricing+dx) | ★★★★
</code></pre>
<p>This is an important observation. Symbolic notation does not automatically guarantee fewer tokens. Modern tokenizers pack frequent English words and technical terms very efficiently, while things like <code>→</code>, <code>|</code>, and <code>★★★★</code> can be more expensive than expected. So real "30x" claims need to be checked with the tokenizer of the target model, not by string length and not by <code>split()</code>.</p>
<p>Below are two code examples that actually work and produce valid results on the current version of the project.</p>
<h3>Example 1. What <code>Dialect.compress()</code> actually returns</h3>
<pre><code class="language-python">from mempalace.dialect import Dialect

text = """
The timeline we're living in. Last night, Ben Sigman posted that he and Milla
Jovovich released the MemPalace project publicly on GitHub. The project addresses
high-quality recall in AI/RAG systems.
"""

dialect = Dialect(entities={"Ben": "BEN", "Milla": "MIL"})
aaak = dialect.compress(text)
stats = dialect.compression_stats(text, aaak)

print(aaak)
print(stats)
</code></pre>
<p>On my run this produces roughly the following:</p>
<pre><code class="language-text">0:BEN+MIL|github_mempalace_timeline|"The timeline we're living in"|DECISION
{'original_tokens': 57, 'compressed_tokens': 29, 'ratio': 1.96, ...}
</code></pre>
<p>This already looks like a working minimal format, but not like the "pretty language" from the README. It also shows another important detail: the built-in <code>compression_stats()</code> function in the project estimates token counts very roughly as <code>len(text) // 3</code>, so its numbers should not be treated as exact GPT, Claude, or Gemini token counts.</p>
<h3>Example 2. How to run Russian text through translation and then compress it</h3>
<pre><code class="language-python">from mempalace.dialect import Dialect
from ollama import chat

text = """
Таймлайн в котором мы живем. Вчера вечером Бен Сигман выложил пост про то что
вместе с Милой Йовович они выложили проект MemPalace в открытом виде на Github.
"""

prompt = f"""Translate the following Russian text to English.
Return only the translation.

{text}
"""

response = chat(
    model="translategemma",
    messages=[{"role": "user", "content": prompt}],
)

en_text = response.message.content
dialect = Dialect(entities={"Ben": "BEN", "Milla": "MIL"})
aaak_en = dialect.compress(en_text)

print(en_text)
print(aaak_en)
print(dialect.compression_stats(en_text, aaak_en))
</code></pre>
<p>At the moment this path is more practical than feeding Russian text directly into <code>Dialect.compress()</code>.</p>
<p>In the end, I still find the idea interesting. Even if the current AAAK in code does not yet live up to the marketing description, the basic thought that memory could be converted into a compact pseudo-code instead of an ordinary summary still feels promising. To me this notation sometimes really does look like something between shorthand and a human-readable DSL in the spirit of Neo4j.</p>
]]></content:encoded></item><item><title><![CDATA[25 Years of Built-Up Work]]></title><description><![CDATA[I was talking to someone on HN recently. He told me he has more than 25 years of commercial development experience. Over the years, he’s been building his own library of solutions. It started with ActionScript 3 (yes, the tech that powered Flash back...]]></description><link>https://myblog.ru/25-years-of-built-up-work</link><guid isPermaLink="true">https://myblog.ru/25-years-of-built-up-work</guid><category><![CDATA[AI]]></category><category><![CDATA[craft]]></category><category><![CDATA[Experience ]]></category><category><![CDATA[development]]></category><category><![CDATA[code]]></category><category><![CDATA[codebase]]></category><dc:creator><![CDATA[Mikhail Kashkin]]></dc:creator><pubDate>Fri, 13 Feb 2026 19:39:58 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1771011508983/c66609bd-3904-4533-a887-52486443cc00.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I was talking to someone on HN recently. He told me he has more than 25 years of commercial development experience. Over the years, he’s been building his own library of solutions. It started with ActionScript 3 (yes, the tech that powered Flash back in the day), then he ported it to TypeScript. Along the way — a whole scatter of backend technologies. Bottom line: he has massive experience, and thanks to those old building blocks he can ship projects faster, cheaper, and at a higher quality.</p>
<p>As he puts it himself, quote:</p>
<blockquote>
<p>“It’s very easy for me to launch new applications, services, or websites — ones that actually work and don’t have unknown vulnerabilities or garbage code.”</p>
</blockquote>
<p>A few weeks ago, he decided to run an experiment with Claude. He asked it to write one of the components for his SPA framework from scratch. He spent 10 hours and barely managed to assemble 500 working lines of code. And most of that time was spent fighting over things like, “this component is missing a destructor.” He hated the code. Completely. And after enough complaints, the machine would respond with something like:</p>
<blockquote>
<p>“You’re absolutely right, let’s do it the smart way!”</p>
</blockquote>
<p>He didn’t even get to backend interaction.</p>
<p>Our conversation started when I said I was worried that in a few years even large corporations would start questioning the value of their own solutions. After Anthropic wrote a compiler that managed to build the Linux kernel, maybe their competitive moats aren’t that protected anymore. I suggested that at some point we might be able to assemble software at Photoshop-level complexity using AI tools. Say, modernizing a call-center system or a corporate CRM. Done by a single person who actually understands the problem — at a cost lower than a corporate license.</p>
<p>He had to disagree:</p>
<blockquote>
<p>“Every piece of code I’ve written, I understand and can trust. That’s what allows me to build more and better things on top of it next time. What you’re describing sounds like resignation, laziness, solipsism, a desire to watch the world burn — or something along those lines.”</p>
</blockquote>
<p>At work, I meet a lot of people with similar backgrounds. But the number of people who actually manage to use these new tools keeps growing. I personally spent many hours figuring out how to make them produce working code. And more importantly — I stopped treating transformer-generated code as dumb trash I need to shovel through. I started treating it as something important and new.</p>
<p>So much so that I began looking differently at my own old code — code I have a lot of sentimental attachment to. I admitted to myself that my code can become morally outdated. It’s still very, very valuable. Because the average code AI writes from scratch is disgusting. It really is statistically average garbage stitched together from billions of lines written by mediocre people. But my own code also becomes outdated — in terms of approaches and tooling.</p>
<p>Things that used to be impossible are now doable in much less time. I have more room for creativity and experimentation.</p>
<p>I don’t want to devalue the feelings of people who’ve built large, deeply personal libraries of work. Back in the day, carpenters probably treated their tools the same way. They hung them carefully around the workshop, engraved polished handles earned through hard labor, passed tools down to sons and grandsons. They were heartbroken if a son grew up clumsy and couldn’t carry on the family craft.</p>
<p>But progress kept going. Today you can cut a board with a soulless power tool — and we’ve lost that culture of craftsmen. At the same time, the number of cut boards in the world has increased dramatically.</p>
<p>AI changes how we relate to code. This may sound painful, but old work has less value now. On the other hand, the core goal of developers hasn’t changed. We still solve problems. We don’t write code for the sake of writing code.</p>
<hr />
<p>If you’re interested in how AI can be integrated into your company, I’m happy to talk — just <a target="_blank" href="https://myblog.ru/page/me">send me a message</a>.</p>
]]></content:encoded></item><item><title><![CDATA[The end of licenses.]]></title><description><![CDATA[I have a contract with a large company in my hands (on the screen) in which they're offering to transfer all rights to the development I'm required to do under the contract. I'll upload the project source code to their repository server, and they'll ...]]></description><link>https://myblog.ru/the-end-of-licenses</link><guid isPermaLink="true">https://myblog.ru/the-end-of-licenses</guid><category><![CDATA[IP]]></category><category><![CDATA[copyright]]></category><category><![CDATA[Intellectual Property]]></category><category><![CDATA[License]]></category><category><![CDATA[gpl]]></category><dc:creator><![CDATA[Mikhail Kashkin]]></dc:creator><pubDate>Fri, 13 Feb 2026 09:32:45 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1770975112038/b3254a8b-5cea-40df-8121-e5e1e3d0de0b.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I have a contract with a large company in my hands (on the screen) in which they're offering to transfer all rights to the development I'm required to do under the contract. I'll upload the project source code to their repository server, and they'll pay me.</p>
<p>The problem is, they're hiring me because I know how to do this kind of project. But they want to keep the rights to the resulting work.</p>
<p>So let's imagine a hypothetical situation where the corporation discovers that I've created a similar project for someone else. There are many similar projects out there, but they're downright angry about mine. They start digging around and demanding the source code of the new project from me to prove I've plagiarized it.</p>
<p>Or imagine a similar situation. You need to complete a job, but you discover that the library you need is under a virus license. Like GNU GPL.</p>
<p>I can't obfuscate a project I hand over to a client, even though it's not specified in the contract. By all standards, doing so would be perceived as sabotage. It would also damage my reputation. Plus, there's a chance the client will need some work, and they'll pay me for it, which would extend the contract. And probably can bring me more money. If I ruin my own code I will shot my own leg.</p>
<p>Currently, to rewrite the code for a medium-sized project (I'm developing a solution that indexes your entire website and knowledge base and turns it into a working support tool), I need to develop a few good skills, and I can rewrite my entire project from one framework to another. This would cost me a couple dozen dollars.</p>
<p>The same could be done with an open-source project under an inconvenient license. I'm not saying it's ethical, but I suspect people will do this more and more often. Ideas tend to be reincarnated, and we have no control over that. Even if you're completely lacking in imagination, text transformers will still make the project similar, but not the same. This will be a different project without a stifling license.</p>
<p>For now, this is possible with small projects. But Anthropic created a compiler that built an operating system and ran a game on it for only $25,000, which is a larger project than most libraries that become stumbling blocks for vendors selling routers without disclosing their codebase.</p>
<p>The world of ideas is more real than ever, and we are entering a new phase where licenses and restrictions are becoming more ephemeral and unprovable from a legal perspective.</p>
]]></content:encoded></item><item><title><![CDATA[Internationalization and Localization in the age of agents]]></title><description><![CDATA[Complexity
I have extensive experience and knowledge of how this worked in the pre-agent era. And I have a general idea of ​​the scope and complexity of the work. In very simple terms, you need to find every line of code that is displayed to the user...]]></description><link>https://myblog.ru/internationalization-and-localization-in-the-age-of-agents</link><guid isPermaLink="true">https://myblog.ru/internationalization-and-localization-in-the-age-of-agents</guid><category><![CDATA[i18n]]></category><category><![CDATA[internationalization]]></category><category><![CDATA[localization]]></category><category><![CDATA[l10n]]></category><dc:creator><![CDATA[Mikhail Kashkin]]></dc:creator><pubDate>Sat, 07 Feb 2026 09:23:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1770456062112/68a8c891-92f1-4e35-9c6b-521aaf5f7e14.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-complexity">Complexity</h2>
<p>I have extensive experience and knowledge of how this worked in the pre-agent era. And I have a general idea of ​​the scope and complexity of the work. In very simple terms, you need to find every line of code that is displayed to the user and turn it into a localization function call. For example, <code>"Hello!"</code> becomes <code>_("Hello!")</code>. When the user needs to see a greeting, the <code>_</code> function will look up the corresponding translation in a special dictionary. So, the user will see <code>"Hello!"</code> if they have Russian selected. The same applies to date formats, prices, and number separators. There are also a ton of nuances when there are enumerations such as "You have one message," "You have two new messages," or "You have N new messages." Plural forms can vary in different languages. Imagine languages ​​that are written from right to left (Arabic, Hebrew).</p>
<p>There are many nuances. The same word has different meanings in different contexts and on different screens. My favorite is "Ok," which looks appropriate in an English interface, but in Russian can be translated as "Accept," "Agree," "Yes," or "Confirm." Not to mention that sometimes the interface simply doesn't have room for long text, so you have to find creative ways to accommodate it. This was especially true for older games, where the interface simply couldn't adapt to long messages. You have three lines in English, but in Russian the same text is 100 characters longer.</p>
<p>Telegram uses an interesting approach. They display each localized line in the interface using the translation service <a target="_blank" href="https://translations.telegram.org/en/ios/login/">https://translations.telegram.org/en/ios/login/</a>. This is much clearer, but there is still a chance of making a mistake, because somewhere in the depths of the product there may be some message and you will never guess what it means without understanding the actions that resulted in it.</p>
<p>With a basic list of phrases and a translation tool, the hardest part begins. The painstaking work of localization begins. Even within the same language group, people communicate differently. How many people can be offended by using the wrong "in" or "on" (Ukrainians never use ‘on Ukraine’, Russians never use ‘in Ukraine’)? And how difficult it is to translate jokes and humor. I participated in translating Ubuntu and Facebook into Russian and Ukrainian. I wasn't paid for it, but I was curious to learn how they organized the process. They allowed people to enter their own translation for each available phrase, and then translators could vote for the most correct one. And that translation was then included in the final selection. Commercial products also require payment for translators. You need someone to coordinate the localization work. Just imagine you have a big release coming up in a few hours, and a new interface with hundreds of lines of text and illustrations is added to the final version of the product. The Chinese translator, who charges tens of dollars an hour, has already gone to bed. And then everyone discovers that no one has marked up the lines in the interface at all!</p>
<p>Adding language support to a product could add tens of percent to the development cost. Phrases are fine, but images, interface solutions, sounds, and sometimes videos are important. Localization and translation are not the same thing. Localization can also include casting. Just imagine an ad for ass cream with black actors aimed at people from minority groups, like the Caucasus. They simply don't identify with the people on screen. Add politics, censorship, and accessibility issues, and the process becomes complex and multifaceted. The business collects requirements, the developer implements them in the product, and the localizers race to translate and update everything by the release date.</p>
<p>Therefore, I always recommend adding multilingual support only after fully understanding that the business actually needs this feature and that these initiatives will definitely pay off. It's also advisable to get a clear market fit and go through a couple of pivots to avoid stalling new releases.</p>
<h2 id="heading-process">Process</h2>
<p>On Monday, we found ourselves at a point where we needed to add support for a new language to the product. We'd already triaged and even specified this task. And it was just waiting for its moment and priority.</p>
<p>Using agents, I completed the preliminary work and marked all the strings for translation in the product's backend. Before starting the work, I thought we'd never set a goal to implement translation, but we generally maintained some basic hygiene. I thought we had strings marked up almost everywhere, and I expected it to be a simple and straightforward job. To understand just how wrong I was in my estimates, I now have this week's worth of work: <strong>16,000</strong> (!) lines of code. And that's not including the frontend. And that's not including the translations themselves, they haven't been added yet.</p>
<p>How long would it have taken me to do the same thing manually? Even with autocorrect, I think the productivity increase is 20 times greater. And if you factor in human error, it's even greater. We've wasted so much time because someone forgot to mark up some insignificant phrase, but it popped up like a pimple on the nose right during the first demo. It's become a joke when we show users a registration form, and the very first validation displays a message in a language the client doesn't understand. Are we protected against this situation when using agents? Let me reiterate that I have experience; I know and understand where to look, how to mark up, which rules apply when to use lazy translation strings, and when to use regular ones (<code>gettext</code> and <code>gettext_lazy</code> or similar).</p>
<p>If I had to build the entire mental architecture of the process from scratch, just learning the tutorials and translation technologies would take time. If you want to get an idea, read the Django documentation on internationalization and localization <a target="_blank" href="https://docs.djangoproject.com/en/6.0/topics/i18n/">https://docs.djangoproject.com/en/6.0/topics/i18n/</a> . Keep in mind that this documentation only covers localizing one specific product and does not include documentation on setting up and selecting additional localization tools.</p>
<p>I've been talking about the interface all this time, but it's all just a piece of cake until the question of data localization arises. When we last planned the project, we calculated how many unique strings we had to translate. Last time, without spaces, we came up with about a million characters. This is the data that appears in the user interface in graphs, tables, and when exported to Excel. I've already implemented a database translation infrastructure. It's rudimentary for now, but conceptually, we'll be moving in this direction. There's no industry-standard solution accepted by the community, and there can't be one; every project tackles this issue in its own way.</p>
<h2 id="heading-result">Result</h2>
<p>If you're interested in the technical details, new columns with a language suffix are added at the database level, and the ORM, depending on the locale, decides which field to return to the user based on the locale and whether the translation is available. For example, if you have a table with a 'name' column, it gets a 'name_es' counterpart if it needs to be translated into Spanish or 'name_ru' if it needs to be translated into Russian. This option may not be suitable for you, but it's suitable for us for many reasons.</p>
<p>Furthermore, I built a translation infrastructure using agents. There's a tool that reads a file with interface phrases and translates them into target languages, along with data from the database. Plus, there's TranslatorBrain, a database where we store all completed translations to avoid paying for repeated API calls if a phrase has already been translated. Moreover, our work requires deploying separate instances of our project for different tasks and using different data for calculations.</p>
<p>This is objectively a very large amount of work for a working week. I can't convince you to use AI and agents. But I currently have a well-defined set of skills for internationalization. And if I get a project that needs to be multilingual, I can save it tens of thousands of dollars on codebase preparation compared to the previous approach. As you can imagine, agents don't care whether they need to process a project with 50,000 lines or 1,500,000 lines. Plus, as a bonus, you can get relatively high-quality automatic interface translations. There are trade secrets for that, too. They might not always be as good as those from professional translation agencies, but they certainly won't ruin your budget.</p>
<p><em>Seriously, if you have a project, please contact me; I'd be happy to help. Reach me out by</em> <a target="_blank" href="https://t.me/mkashkin"><em>https://t.me/mkashkin</em></a><em>.</em></p>
]]></content:encoded></item><item><title><![CDATA[Codex для массового редактирования кода]]></title><description><![CDATA[У нас есть большая кодовая база. В какой-то момент появилась задача попасть в закрытый корпоративный контур. А для этого надо проходить проверки безопаности и возможно даже сертификацию. В тот момент мы не достигли соглашения и задача потеряла актуал...]]></description><link>https://myblog.ru/codex-dlya-massovogo-redaktirovaniya-koda</link><guid isPermaLink="true">https://myblog.ru/codex-dlya-massovogo-redaktirovaniya-koda</guid><category><![CDATA[code]]></category><category><![CDATA[codex]]></category><category><![CDATA[Security]]></category><dc:creator><![CDATA[Mikhail Kashkin]]></dc:creator><pubDate>Sun, 21 Sep 2025 13:08:17 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1758460635254/448e6f4a-3143-446f-bf97-88cf1a71c545.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>У нас есть большая кодовая база. В какой-то момент появилась задача попасть в закрытый корпоративный контур. А для этого надо проходить проверки безопаности и возможно даже сертификацию. В тот момент мы не достигли соглашения и задача потеряла актуальность. Но на этапе подготовительной работы я проделал большую работу по оценке объема предостоящих доделок. Поэтому у нас в пайплайне остались шаги с проверкой кода автоматическими инструментами. </p>
<p>Сделаю шаг в сторону и если вы когда-то будете проходить такие проверки, то в целом могу пожаловаться, что вся эта сказочная индустрия безопасности не имеет практически никакого отношения к реальной безопасности. Все что от вас требуют это прохождение формальных проверок людьми которые вообще мало имеют представления о работе операционных систем, баз данных, кода, не слышали про вектора атак и т.д. Представьте себе крючкотвора который добывается к тому что вы расписались непохожей подписью на двух разных документах. Человек с интеллектом этим не занимается, потому что ему стыдно продавать фуфел, поэтому там естественным образом попадают бюрократы. Настолько это фарс.</p>
<p>Но они применяют автоматизацию для проверки кодовой базы. Автоматизация часто это проприетарная "комплексная система", с очень кривым интерфейсом и выдачей бредовых отчетов. И самое главное что ее никому не показывают, потому что продают за большие деньги. Но есть один секрет, все эти сонаркубы и их аналоговнет-сертифицированые корпоративные клоны на самом деле являются обертками вокруг устаревших версий проектов с открытым исходным кодом. Например для python'а есть продукт bandit, ну и pylint конечно. </p>
<p>Pylint это в принципе must have в работе, потому что он очень ускоряет работу с кодом. Кроме того он обязательно должен быть встроен в редактор кода. А вот bandit применяется реже. Но добавить его как шаг в ci/cd это всего-то строка:</p>
<p><code>bandit -r -q SRC/</code></p>
<p>Есть похожие проекты для других языков программирования. </p>
<p>Собственно в пайплайне сборки у меня добавлено несколько шагов и инструментов для проверки кода и они понемногу ругаются, но руки до них не доходят. Есть небольшой технический долг, он копится, но решение его денег в моменте не приносит.</p>
<p>И вот тут начинает сиять <strong>Codex</strong>. Все что вам требуется это натравить его на свой код приблизительно таким промптом:</p>
<pre><code class="lang-plaintext">Выполни команду:

. venv/bin/activate &amp;&amp; bandit -r --severity-level=medium -q SRC/

Этот код вернет множество замечаний по безопасности. 
Пофикси их по всему коду. Повторяй выполнение команды до тех 
пор пока все проблемы не будут исправлены. После выполнения 
этой задачи запусти тесты командой, чтобы убедиться что 
изменения ничего не сломали:

make test
</code></pre>
<p>Конечно команда займет время, но когда она закончится вы получите кучу трешовых изменений на сотни строк кода! Часть из них реально будут полезными и помогут прохождение проверок безопасности.</p>
]]></content:encoded></item><item><title><![CDATA[Домашнее обучение]]></title><description><![CDATA[Вчера было 1 сентября, думаю настало время написать как устроена наша домашняя система образования для детей.
Прежде чем рассказать почему мы пришли к тому, что у нас есть сейчас надо рассказать причины и что влияло.
Пока мы жили в Украине наши дети ...]]></description><link>https://myblog.ru/domashnee-obuchenie</link><guid isPermaLink="true">https://myblog.ru/domashnee-obuchenie</guid><dc:creator><![CDATA[Mikhail Kashkin]]></dc:creator><pubDate>Tue, 02 Sep 2025 12:04:59 GMT</pubDate><content:encoded><![CDATA[<p>Вчера было 1 сентября, думаю настало время написать как устроена наша домашняя система образования для детей.</p>
<p>Прежде чем рассказать почему мы пришли к тому, что у нас есть сейчас надо рассказать причины и что влияло.</p>
<p>Пока мы жили в Украине наши дети ходили в одну из самых хороших школ в Днепре — мы учились в 100-м лицее. Каждое утро я садился в машину и вез их в школу, а Криса завозил в садик. Биби еще была слишком маленькая, поэтому ходила гулять с няней в парк, а точнее никуда не ходила.</p>
<p>После того как мы выехали из Украины мы попали во французскую систему образования. Биби взяли в совсем маленькую группу, Криса в обычный детский сад. Максим и Алиса попали в колеж (это не ошибка, во Франции средняя школа называется колеж):</p>
<ul>
<li><p>Каждое утром мы выезжали из Ниццы, приезжали в Вильфранш-сюр-Мер, проезжали мимо Кап-Ферра, и выгружали детей в Болье-сюр-Мер. Золотой треугольник Ривьеры между Ниццей и Монако привлекающий самых успешных и богатых людей всего мира своей природной красотой</p>
</li>
<li><p>Большинство французских детей у которых родители обладают собственными домами миллионеры, просто по факту стоимости недвижимости в этом районе</p>
</li>
<li><p>Часть уроков по физкультуре у детей проходила на воде, детей катали на яхтах</p>
</li>
<li><p>Марины, яхты, Альпы которые соединяются со Средиземным морем</p>
</li>
<li><p>Почти каждое утро я пил кофе в марине Вильфранша сидя в небольшой кафешке среди яхт и старинных доков</p>
</li>
</ul>
<p>Если ваше детство не такое, то вы не наши дети!</p>
<p>Если вы не в курсе, то все французы одержимы Лазурным Берегом и могут пол жизни собирать деньги на отпуск в этом месте. А мы там жили, и даже в какой-то момент купили кабриолет чтобы возить детей под музыку по узким серпантинам вдоль моря и цветущих дворов Ривьеры. Казалось бы мы очень хорошо устроились, даже не по французским меркам, а по меркам всех богатейших людей мира.</p>
<p>Но школьное образование детей была одна из причин по которой мы уехали из Франции.</p>
<p>Проблем было очень много. Но самая главная, что французы много-много лет строили систему которая уничтожила все человеческое что мы ожидаем в людях. Да, я тоже как и многие слышал истории про "арабов", "сирийцев", "чеченцев" (можете продолжить) которые приехали во Францию, но не хотят принимать местные правила. Проблема в том, что эти правила таковы, что если ты хоть немного обладаешь достоиноством и самоценностью или видел хоть какую-то жизнь вне ментальной французской тюрьмы, то тебе не хочется их соблюдать.</p>
<p>Первый сигнал случился когда нас пригласили в садик по поводу Кристофера. Наш маленький сладкий бублик по понятным причинам не очень любил садик, но у нас не было возможности оставлять его дома. Кроме того мы очень надеялись, что он сможет постепенно разобраться с французским языком. И мы конечно же пришли на встречу. Там были директор, воспитатель и садиковский психолог. И мы 40 минут выслушивали аккуратные намеки на то, что наш ребенок умственно отсталый. Диалог строился приблизительно так:</p>
<p>— Ваш ребенок общительный?<br />— Да, конечно. Он может легко подойти на улице к незнакомым людям и начать им рассказывать про себя, нашу семью и знакомить со всеми нами.<br />— (очень странное выражение лица) А дома ребенок может вам помогать?<br />— Да, конечно. Кристофер может сам приготовить себе завтрак, но мы его не пускаем к горячей плите, но недавно он с моей помощью приготовил яблочный пирог. Очень обожает что-то делать из лего, все время что-то изобретает.<br />— (опять странное выражение лица) А может ли он вас попросить о чем-то?<br />— Конечно, он охотно делится историями, придумывает сказки и шутит...</p>
<p>Спустя время мы узнали, что по французским правилам ребенок к определенному возрасту должен знать нужное количество слов. А Крис только три месяца был в новой стране и еще не знал французский язык. А они недавно провели тестирование и оказалось, что он не обладал достаточным словарным запасом. Но у 90% французов которые мы встречали за время жизни во Франции не хватает интеллекта сопоставить даже такие простые вещи. Не говоря уже о том, что под видом французского снобизма на самом деле скрывается просто очень бедный эмоциональный интеллект. Они буквально не понимают чувств других людей.</p>
<p>В бумажке было написано надо знать 300 слов. Проблема в том, что у Криса, в отличии от других детей в группе словарный запас был тысячи слов, и он очень страдал от невозможности ими пользоваться среди других детей. А в системе нет тех кто умеет думать, их давно выгнали из страны и они не оставили своего потомства. Не удивительно, что "примитивные" арабы как люди просто обладающие базовым набором эмоций не воспринимают эту интеллектуальную и эмоциональную духоту как норму жизни.</p>
<p>Образование старших тоже шло не очень весело. Они откровенно скучали на уроках. Потому что единая школьная программа Франции отставала от Украины на 2-3 года. Там где мои уже решали уравнения французы проходили дроби. Да в целом мы не ждали никаких успехов от детей первый год. Мы давали время на адаптацию в ситуации когда дети потеряли все свое окружение: друзей, бабушек, уклад жизни. Да просто элементарно все игрушки, личные вещи, досуг.</p>
<p>Как эпизод. Мы устроили детям квест длинной почти целый год. На специальных листиках старшие енотики собирали квадраты за разные полезные дела дома и по учебе. И когда вычеркнули все квадраты мы им купили по персональному гироскутеру осенью перед началом войны. Надо ли говорить, что они почти не успели ими воспользоваться потому что начались морозы, а потом мы просто все бросили и уехали подальше от войны.</p>
<p>Конечно преподавание шло на французском языке. Как мы решили финансовые вопросы, то наняли детям репетитора, которая онлайн занималась с ними дважды в неделю.</p>
<p>Алиса в целом чуть больше забила на учебу чем Максим и поэтому с ней не было особых проблем. Потому, что Максим не просто забил, а отстаивал свою точку зрения. Например, отказывался сотрудничать с преподавателем по пению и музыке. Поэтому меня тоже вызывали в школу по его поводу. Меня предупредили, что Максима правильно оставить на второй год, но в качестве исключения его переведут в следующий класс. Я вежливо соглашался и учтиво кивал головой. Диана в этот раз не пошла на встречу, потому что очень злилась за такое вот мудацкое отношение к нам и нашим детям.</p>
<p>Мы с Максом поговорили и я объяснил ему, что школа это симулякр реальной системы, которая не имеет под собой никакой силы, основания и влияния на будущее. И его выбор воевать с этой системой или обыграть ее. И попросил показать успехи по тем предметам которые ему нравятся, чтобы нейтрализовать эффект от его несогласия сотрудничать с преподом по неприятным предметам.</p>
<p>Когда Макс подтянул французский до необходимого уровня, то оказалось, что единственная причина была в том, что он не достаточно хорошо понимал контрольные тесты. И Макс очень быстро вошел список лучших учеников школы по математическим предметам. Он за 10 минут делал лучше всех тесты на которые остальным ученикам выделяли час и занимался своими делами.</p>
<p>Красивое место так же не спасало учебу от того что она страдала от обилия французской пропаганды. Целью французской системы образования является тупой и нищий раб системы, но который не физически к ней привязан, а ментально травмирован до такой степени чтобы считать, что живет в самой прекрасной и свободной стране. А так же довольствуется малым и живет на государственные подачки. Установок так много, что нам как людям, которые вообще-то видели в жизни эту саму свободу было не очень комфортно, что нашим детям промывают мозги.</p>
<p>Один из забавных спектаклей которые подаются как проявление свободы является система забастовок. Будучи сотрудником системы у тебя появляется обязанность ходить на регулярные забастовки. Во всем мире это подается как проявление свободной народной воли. Но по факту это просто обычная повинность, а цели за которые люди должны голосовать вообще никакого отношения не имеют к их реальным потребностям. Как обычно социализм — это власть наглой и маргинальной группы психопатов за счет большой группы людей, заставляя их отказаться от всего под видом общего блага и забирая эти блага лично себе. И все активно участвуют в этом фарсе, но так же этому обучают детей.</p>
<p>Будущее наших детей это наша ответственность, а ожидать, что какая-то система будет заботиться о нашем благе — это инфантильная и детская позиция. Но любая система если перестает получать обратную связь, то хиреет и постепенно вымирает. Франция — это страна которая давно сгнила изнутри и ее система образования является отражением этой агонии. И она враждебна к любому инакомыслию. Но инакомыслием является любое проявление критического мышления, предприимчивости, индивидуальности. Есть много людей которые бы то же самое сказали и о других странах и их образовательных системах. Но во Франции у системы образования нет альтернативы. Даже маленькой, даже номинальной. И, к сожалению, система обладает слишком большой силой, если вы не отдадите детей в сад и школу, то по проторенным рельсам вас лишают родительских прав и можно получить вплоть до уголовной ответственности.</p>
<p>Спустя два года мы очень четко начали чувствовать эту угрозу. И дело не в том, что мы маргиналы или любим спорить ради спора. А в безэмоциональности и трафаретности мышления этих самых французских бюрократов. В момент Крис, абсолютно светлый и прекрасный одаренный ребенок, в руках какой-то жабы с линейкой в руках, слишком тупой чтобы понять, что ребенок не успел выучить за 3 месяца в новой стране, превращается в отсталого ребенка. И эта угроза не фигуральна.</p>
<p>В наш садик пришло горе. Весной перед началом каникул началась обычная эпидемия какого-то гриппа. Кто первым принес заразу в садик я не знаю. Из знакомых сначала заболел Ваничка, светлый солнечный ребенок с которым мы играли на детской площадке и которого приводила играть русская бабушка. Потом Тео, ребенок еще одной нашей русскоязычной подруги по Вильфраншу. А потом Крис. Через день один из детей умер. Мы стояли с Олесей на остановке и рыдали от этой новости, по началу не могли поверить, что умер маленький Ваня. Наш ребенок из нашей тусовки с доброй и тихой бабушкой.</p>
<p>Криса мы оставили дома и до каникул не отправляли в садик пока у него была температура и следили за его состоянием.</p>
<p>Через несколько недель, после каникул нам пришло письмо с уведомлением, что из-за прогулов о прогулах сообщили в учебную комиссию. Мол мы не привели ребенка в садик без уважительной причины.</p>
<p>В этот момент я окончательно решил, что мы больше не будем бороться с этой системой. Нам важнее и ментальное и физическое здоровье наших детей. Собственно за что нам надо было держаться? Образование очень посредстсвенное, система работает идеально настолько, что люди ей не нужны.</p>
<p>Как доказательство моих слов пришла весточка из колежа. Спустя два года после начала войны и массового переезда кто-то из учителей догадался, что приезжие дети плохо учатся потому, что не знают языка и решили организовать дополнительный класс раз в неделю для переселенцев и обучать языку. Всего два года им понадобилось догадаться, очень чуткие и догадливые люди.</p>
<p>Было ли за что быть благодарными этим людям? С точки зрения вежливости и воспитания правильно было бы сказать "да, большое спасибо за вашу попытку". Но были ли вы благодарны человеку который взялся за свое дело и сделал его плохо? Наша знакомая Яната, которая вопреки всему обожает Францию, рассказывала как нанимала на работу француза-строителя. Который намесил ведро цемента, а потом у него начался обеденный перерыв и он оставил это ведро и пошел отдыхать. Цемент застыл, ведро испорчено, работник разводит руками по-французски. Яната уволила этого идиота, но не уверен, что смогла это сделать без потерь для себя.</p>
<p>Уехав из Франции мы потеряли деньгами и временем, но сохранили самое главное. А то что не сохранили, то можно исправить.</p>
<p>Для того чтобы продолжить вернусь еще на некоторое время назад. Когда мы начали жить вместе с Дианой, то поняли, что путешествия это наша общая ценность и обсуждали, что хотели бы сделать кругосветку. Но в каком-то своем режиме, не просто облететь мир за несколько дней на самолете, а неспешно осматриваясь в разных странах. Но еще большей ценностью для нас являются наши дети. И обдумывая как все это совместить, мы поняли, что нам надо придумать какую-то систему образования, чтобы путешествие не прерывало процесс.</p>
<p>Мы пробовали разное, но достаточно быстро сошлись на том, что все вместе правильно мы сделать не сможем. И перестали стремиться к абсолютному идеалу. У наших детей будет шанс исправить какие-то наши ошибки. Мы даем лучшее из того, что можем с той любовью которую мы можем дать. В целом все. Такой подход освобождает и дает право двигаться. А если мы видим что-то что можно улучшить или исправить, то мы это делаем.</p>
<p>Добавлю так же, что мы не пытаемся делать вид, что не существует системы или что мы живем на необитаемой планете. Дети числятся в официальной школе, сдают часть нормативов. Но если есть необходимость соблюсти какую-то формальность, то мы можем и заплатить денег для упрощения процедуры. Наша цель не бороться с мельницами, а будущий успех и счастье наших детей.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756814660075/e6f2a72b-8c0a-446f-9b70-48f1ccd1dd11.png" alt /></p>
<p>Вот статистика с 1 сентября 2024 по 1 сентября 2025 года по времени которое наши дети провели за учебой на Khan Academy. Этот сайт это лучшее, что мы нашли на сегодняшний день в мире для обучения детей математике и естественным наукам.</p>
<p>Если посчитать время в системе, то за последний год Максим провел в системе в среднем по 50 минут в день без каникул и праздников. Если брать стандартный учебный план, то в учебных дней в году около 160-180 дней, но дети могут болеть, поэтому возьму приблизительно 150. Получается почти ровно по 2 часа в день. Плюс еще у нас были оплачены онлайн лекции по биологии, истории на другом онлайн сайте. Наши дети учатся по 4-5 часов каждый день удаленно онлайн. Половину времени на английском языке, половину на русском.</p>
<p>Система обучения в Академии Хана устроена следующим образом. Детям дается теория в формате видео-уроков, а потом интенсивно даются задания на проверку. Если несколько раз выполнил задания по нужной теме (в системе они называются skill'ами), то тема считается выполненной и упражнения по ней вернутся через пару дней, а потом через неделю для закрепления в долгой памяти. Если делаешь с ошибками, то задания будут возвращаться пока не научишься делать по 5 раз без ошибок. Если не понял, то тему можно пересмотреть. Учебные материалы по математике покрывают от детского сада до уровня где-то 2 курса продвинутого технического вуза. Под математикой я имею ввиду и геометрию, тригонометрию, алгебру, статистику, теорию вероятностей, матан и все что рядом.</p>
<p>Помимо этого есть история (американская версия), экономика, информатика, биология, химия, астрономия, в общем вся школьная программа. Еще есть life skills: основы управления личными финансами, как строить карьеру, интернет безопасность. И интересная болтология типа истории искусства, партнерские лекции от NASA или биоразнообразию (что-то типа экологии и эволюции).</p>
<p>Благодаря тому, что нам не надо никуда срочно уезжать мы даже купили детям наборы по химии. К сожалению, современные наборы полное говно, но зато нам, в отличии от наших родителей, не надо переживать что дети что-то взорвут или сожгут. Вроде мет пока не варили, или мы не знаем.</p>
<p>Разница в минутах между Алисой и Максимом объясняется очень просто, есть некоторые предметы которые надо слушать и они их проходят вместе на учетке Макса.</p>
<p>Результатом обучения по болтологиях являются тетради с конспектами. Пока они слушают лекции, то должны писать и рисовать в тетрадях. У нас их уже целая пачка. Со схемами, в цветах и заполненные от руки. Потому что лучше всего мозг запоминает вместе с подключенной моторикой рук.</p>
<p>Курс школьной истории с 5 по 9 класс занимает приблизительно 1.5 месяца времени. Мы не создаем ситуацию когда детям надо перепрыгивать с одного предмета на другой и они проходят подобные предметы блоками с начала и до конца через все классы. Заодно пытаемся подкреплять каким-то близким контентом: фильмы, компьютерные игры, поездки в музеи.</p>
<p>У младших еще есть онлайн занятия с преподавателями. У Криса обучение английскому в Roblox. И совместные с Биби занятия по чтению и письму с женщиной которая обучает их буквам. Раньше был еще дополнительный английский, то девочка придумала какой-то сложный график и постепенно слилась и не продолжила заниматься. За время летнего затишья мы и не пытались что-то исправить.</p>
<p>Через год будем готовить Макса к поступлению и будем сдавать тестовый, а потом и реальный SAT. Это американский аналог единого школьного экзамена. Правда сейчас Макс уже где-то на уровне 2 курса университета и проходит теорию вероятности и статистику. Тестовый экзамен по SAT внутри Khan Academy он вроде сдает без проблем. Но официальных мест где можно сдать SAT много и по всему миру, надеюсь этого хватит чтобы поступить в какой-то вуз. Плюс мы еще планируем сдать ЗНО (зовнішнє незалежне оцінювання). Правда может понадобится дополнительная подготовка. Но даже если там не будут каких-то выдающихся результатов, то мы не будем переживать и давить на детей.</p>
<p>Есть разница между книжными знаниями и житейским опытом (book knowledge vs street knowledge). Поэтому мы с детьми постепенно учимся обсуждать взрослые вопросы. У нас есть некоторый провис по социализации, но мы даем этому время. Алиса уже нашла себе подруг с которыми выезжает встречаться, а Макс общается онлайн с друзьями еще по сотому лицею в Днепре. С другой стороны пацаны в целом так живут нормально, по крайней мере я почти так же социализирован.</p>
<p>Из того, что постепенно хотелось бы им дать — это навыки предпринимательства. Но скорее всего мы тут будем просто оказывать им поддержку по мере их попыток освоить эту стезю.</p>
<p>Из важного и того что у нас уже хорошо получилось — это хозяйственные навыки. Все дети вовлечены в бытовые вопросы, есть домашние обязательства. Плюс в силу некоторого здорового и контролируемого нашего с Дианой раздолбайства все дети умеют хорошо готовить. Включая Кристофера. В какой-то момент мы поняли, что наша задача обеспечить продукты в холодильнике, а дети сами могут обеспечить себя едой по утрам и на обед. Плюс если я и Диана заняты, то мы их можем попросить в чем-то поучаствовать.</p>
<p>Очень хочется обратить внимание, что навык приготовления еды себе является существенно более важным чем кажется. Мы прекрасно справляемся с доставками готовой еды, и понимаем что роль такого способа обеспечить себя пищей растет и будет важной частью. Но человек который умеет готовить всегда будет более физически и ментально здоровее чем, тот кто не умеет это делать. Это один из ключевых навыков для будущего счастья и здоровья детей. А разница между человеком который не умеет готовить и тем, кто умеет готовить только в количестве часов которые он потратил в процессе.</p>
<p>Любая деятельность по началу не получается. Потом получается, но требует внимание. А потом приходит к автоматизму. Когда появляется автоматизм, то перспектива что-то приготовить себе уже не пугает. Поскольку семья большая, то у нас достаточное поле для того, чтобы пройти начальные этапы и дойти до того момент когда это уже не сложно и не пугает.</p>
<p>Наши мальчики не будут питаться вредной едой когда вырастут, а наши девочки смогут обеспечить свои семьи здоровой едой. Плюс накормить кого-то это важный глубинный навык, который очень сильно сказывается на ментальном здоровье людей.</p>
<p>Ну и чтобы добить тему, у людей которые не умеют готовить из базовых продуктов гораздо больше проблем с весом и чаще депрессии. Поэтому мы и сами научились готовить и учим готовить всех детей.</p>
<p>Что у нас не очень получается в обучении детей: контактные и групповые виды спорта. Мы более-менее регулярно ходим в зал на силовые. Диана и остальные еноты регулярно занимаются йогой. После травм старшие перестали ходить на джиу-джитсу. Крис только отзанимался летние месяцы на фигурном катании на льду (да, в Тае) и не хочет возвращаться. Только Биби с удовольствием ходит на балет и каждый раз ждет следующей субботы.</p>
<p>Возможно мы пока не нашли нужный спорт для детей. А может быть оно так и будет продолжаться. В целом за время школы старшие несколько лет ходили на плаванье, большой теннис. Алиса даже выступала пока занималась танцами. Так что сказать, что спорта у них нет нельзя, но наверное могло бы быть лучше.</p>
<p>Вчера у наших детей начался новый учебный год, мы им дали немного подзабить на учебу во время лета. А вчера они вернулись к обучению. Для Биби я сегодня создал учетную запись на Khan Academy, и теперь они с Крисом будут постепенно учиться вместе. Мы пока не ожидаем от них ничего кроме того чтобы они постепенно за пару лет привыкли каждый день понемногу заниматься. Даже если они немого где-то отстанут, то смогут догнать со временем. Правда Крис уже прошел уровень математики первого класса. А он только должен был поступить в первый класс. В общем мы не очень переживаем, поскольку наладили систему.</p>
<p>Еще важный навык — это языки. Наши дети говорят на русском, украинском, английском, французском. Максим знает (или знал) немецкий на уровне B2 еще со времен школы в Днепре. Алиса немного больше любит забивать на это, но учила испанский во французской школе. Недавно в японском ресторане мы узнали, что Макс уже умеет читать по японски, но ему нравятся языки. Предположу, что Крис вероятно забыл французский, но скорее всего ему будет его легче выучить если он вернется к нему. А Биби изначально настолько прекрасный человек, что скорее ее няньки бы выучили русский чем она французский. Из всей нашей семьи плохо с французским только у меня и у нее. Младших мы учим английскому онлайн. Со старшими иногда ходим в кино смотреть фильмы на английском языке. Большой проблемы в языках я не вижу.</p>
<p>Мы не хотим тратить время на хождения в обычную школу в Тае и счастливы, что можем находиться вне местной системы. Да и стоит это в Тае порядка 10-15 тысяч долларов в год на одного ребенка. А в результате получим что-то в районе французской. По крайней мере мы видим, что тайцы повсеместно очень плохо справляются с задачами уровня умножить 20 на 6 чтобы получить сколько надо заплатить за наши напитки.</p>
<p>Мне кажется, у нас получилась достаточно стройная и эффективная система обучения для наших детей.</p>
]]></content:encoded></item><item><title><![CDATA[Конец интернета]]></title><description><![CDATA[В целом интернет каким мы его знали когда-то повсеместно перестал существовать в этом году. Все шло немного постепенно, но именно в этом году сильно ускорилось и безвозвратно прошло границу когда уже нет возврата назад.
Если сидеть только в новостях ...]]></description><link>https://myblog.ru/konec-interneta</link><guid isPermaLink="true">https://myblog.ru/konec-interneta</guid><category><![CDATA[cenzura]]></category><category><![CDATA[internet]]></category><dc:creator><![CDATA[Mikhail Kashkin]]></dc:creator><pubDate>Mon, 01 Sep 2025 06:55:16 GMT</pubDate><content:encoded><![CDATA[<p>В целом интернет каким мы его знали когда-то повсеместно перестал существовать в этом году. Все шло немного постепенно, но именно в этом году сильно ускорилось и безвозвратно прошло границу когда уже нет возврата назад.</p>
<p>Если сидеть только в новостях локальных медиа, то общая картина может и не сложиться. Но интернет по паспортам теперь буквально везде, скорее вопрос в том, где он еще остался без ограничений и насколько сильно и как именно его ограничили.</p>
<p>Государственным системам надо срочно решать свои внутренние задачи поэтому все запрещают, ограничивают, замедляют. Но это совершенно не совпадает с тем образом который себе пытаются присвоить эти же самые системы. Самый сильный контроль традиционно в тех странах которые максимально рассказывают о своей свободе, прежде всего Европа и США.</p>
<p>В США контроль сильно более извращенный в техническом плане чем в других странах. Потому что он строится на почти невидимых системах рекомендаций. Вас может и не интересовать какой-то политически выгодный взгляд на мир, но вам постоянно будут попадаться новости, посты или даже просто комментарии с определенным подтекстом. Если вы используете Youtube только для поиска видео про вязание, то вам все равно подсунут на главную очередного Дудя или похожего блогера. Но никогда не подсунут блогера с противоположным политическим взглядом. Вам будет казаться, что этот автор популярен и что это лично его частное мнение. И таких мнений вокруг вас будет несколько, так что вам будет казаться, что все с одинаковым взглядом на мир, а вы отщепенец если думаете по другому. Так же работает поиск, так же работают ленты социальных сетей.</p>
<p>В Европе несколько другой подход. Европейская пропаганда больше всего любит проталкивать идеи через грязную прачечную "научного обоснования". С псевдо-ученых из академии спрос нулевой, поэтому они могут выпускать бесконечно много исследований о глобальном потеплении, важности гендеров, полезности насекомых как источника белка, вреде атомной энергии. И потом обратные исследования о том же самом, в общем все за что платят деньги. Ведь согласно статистике тех же самых ученых 90% всех грантовых исследований подтверждают то, что нужно заказчику. А иначе не подпишут следующий грант. Думаю специалист который хорошо обосновывает точку зрения заказчика хорошо сможет обосновать и противоположную когда придет время.</p>
<p>Так случайно совпало, что согласно исследованиям опубликованым в Европе самые богатые и счастливые страны именно европейские: Франция, Германия, Нидерланды и т.д. Наверное — это правильно хвалить себя, но еще и хорошо бы хоть иногда видеть правду. А то получается эхо-камера, когда люди слышут только себя. Если прилететь и реально пожить в любую "развитую" европейскую страну, то станет понятно что там свобод меньше, условия жизни хуже, жизнь скучнее и еда очень посредственная. Вообще уровень счастья — это очень персонально и часто счастье — это близкие и друзья, а в большинстве этих стран вообще невозможно построить хоть какие-то добрососедские отношения с местными. Но СМИ вам будут говорить другое и вы не будете верить сами себе.</p>
<p>А еще правда в том, что страны во всем мире мало чем отличаются. Я проехал более чем 50 стран и подолгу жил с целью переезда почти в 10 странах. Плюс набрался неожиданного опыта там где вообще не планировал. Например пока детки были маленькие мы воспользовались медициной огромного количества стран. При этом мы были застрахованы и получали хороший сервис. По документам и рейтингам составленными европейцами считается, что европейская медицина хорошая, а ее стандарты единственно правильные. В реальности медицина в Украине обгоняет французскую, чешскую, итальянскую, испанскую, черногорскую лет на 200. Сопоставимо хорошая была в Турции, гораздо лучше в Тае, правда дорого. А если у вас есть денег на платную медицину в Украине, то считайте что вы получите очень хороший сервис который не факт, что могут себе позволить очень богатые люди из других стран. Кстати, наши знакомы из Ниццы регулярно возят своего ребенка с аутическим спектром именно в Днепр, даже во время войны.</p>
<p>Поэтому я официально предлагаю термин страны ноль-третьего мира, вместо страны первого мира. Если вы так хотите быть впереди планеты всей, то ноль-третья позиция как раз идеально подходит.</p>
<p>Второй способ борьбы с альтернативным официальному мнению в Западной Европе — это массовая, но точечная демонетизация. Гугл и другие платформы платят деньги авторам за показ рекламы в роликах, для многих это и есть основной источник заработка. Тем, кто не понимают кухню социальных сетей может показаться, что это что-то не важное. Но представьте, что вы пол жизни учились на врача, а потом из-за того что вы не понравились лично какому-то чиновнику, то вас лишают возможности вообще куда-либо устроиться по специальности в вашей стране. Да, вроде нет никакого судебного дела, никого не посадили в тюрьму, не убили и не расстреляли. Но чиновник сидит безнаказанный, вы без дохода, без возможности разместить рекламу, без возможности получить оплату за рекламный пост, потому что все деньги в стране учитываются. А если вы получите кэшем, то тут же вас могут посадить за финансовое преступление. Как все в Западной Европе перечень запретных тем всегда немного размыт. Есть темы которые нельзя обсуждать, они вроде логичны: расовая и религиозная ненависть, насилие. Но помимо них запрещено еще очень много всего что просто не нравится.</p>
<p>Еще по поводу Западной Европы есть наивное мнение, что там верховенство закона и нет никакой коррупции. Но хуже чем в странах с высокой коррупцией жить в странах без коррупции. Потому что "был бы человек, а статья найдется". Если вы не понравитесь какому-то чиновнику, то вы будете годами унижаться и ничего сделать не сможете, а он будет наслаждаться своей мелкой властью над вами. Люди которые ходят собирать штрафы, занимаются цензурой и следят за нравственностью никогда не попадут в тюрьму за то, что заблокировали Лолиту Набокова, а асимитрия ответственности порождает очень придирчивых людей, которые считают, что результатом их работы должно быть больше запретов. Особенно ретиво они работают когда цензурой занимаются частные компании зарегистрированные на офшорах и выписывают штрафы.</p>
<p>Забавно, российская система иноагентов на пять лет отстает от Франции, Британии, Германии. Британские ученые опять как-то странно измерили уровни свободы, но зато им все равно ничего за это не будет.</p>
<p>Я не против того, что французские или немецкие частные компании штрафуют или цензурируют интернет, в конечном итоге это их внутреннее дело. Но при чем тут свобода слова? Научились эффективно промывать мозги местному населению, победили свободные медиа, ну так признайте это. Зачем тогда эти рейтинги?</p>
<p>В Украине заблокировали Яндекс, российские СМИ и все с этим согласились. Да это фактически цензура, но ее вполне доходчиво обосновали населению как борьбу с вмешательством во внутренние дела. И теперь украинские СМИ ставят счетчики Gemius, и европейский офис решает что украинцам надо смотреть, о чем думать и кого ненавидеть, а не вражеский московский. А до этого был USAID, которые официально публиковали перечни тем и под каким соусом их надо подавать. Хорошо, что мнение украинских читателей формируют хорошие люди, а не плохие!</p>
<p>Про Китай уже много кто рассказывал. Из интересных вещей в Китае — это публично известный рейтинг благонадежности человека. Внутри своей касты китаец видит уровень своей полезности для правящей касты и даже может знать за какие поступки он может быть ущемлен в правах. В отличии от США и Западной Европы этот рейтинг там обсуждается публично. В США составлением этого рейтинга занимаются частные компании, просто это работает немного по другому.</p>
<p>Рынок серых персональных данных там очень развит. Недавно вышел мини-сериал "Король Талсы" про мафиози провел в тюрьме много лет и вышел в мир новых технологий. Преступника великолепно сыграл Сильвестр Сталлоне. В одной из серий главному герою понадобилось узнать контакты дочки и он просто зашел на сайт, заплатил денег и тут же получил все данные. Продаются банковские данные, содержимое адресных книг, сотовые данные перемещений, перевозки транспортными компаниями, криминальные записи, медицинские анализы, графики месячных, во всех автомобилях стоят десятки датчиков и они гигабайтами отправляют данные в автокомпании и рекламные сети. Данными торгуют все у кого хоть немного есть данные о клиентах.</p>
<p>Когда Обама приходил к власти, то одним из его предвыборных проектов был Obamacare попытка ограничить законодательно работу страховых компаний которые собирали всю возможную информацию о страхующихся и на основе этих данных выставляли размер счета на медицинскую страховку. Компании о клиентах знали все, обрабатывали вплоть до исторических медицинских записей чтобы получить историю болезни твоей семьи.</p>
<p>Эти серые персональные данные объединяют вместе и на основе этого строят рейтинги благонадежности. Хорошая новость, что пока это не влияет на возможность купить оружие или наркотики. Но влияет на системы рекомендаций. В том числе политической. Можно посмотреть и почитать про кейс Кембридж Аналитики, я о нем уже писал.</p>
<p>Более честно и примитивно устроена борьба с интернетом в менее технологически продвинутых странах мира. В целом почти во всех странах мира на сегодняшний день уровень свободы интернета в районе Северной Кореи или стремящийся к нему. Почти везде есть блокировки на уровне страны сайтов, айпи адресов или доменов. Почти во всех странах блокируют СМИ, порно сайты, торрент трекеры. Очень много борьбы идет с контентом который действительно является криминальным, но под этот же нож попадает и нежелательный для властей:</p>
<p>— Посоветуйте как мне пользоваться интернетом, если в нашей стране запрещен даже VPN, — спрашивает пользователь на Hacker News на прошлой неделе.</p>
<p>Можно с легкостью угадать, что это Индонезия... или Иран... Эмираты? Или любая другая страна. Где-то уже перешли на блокировку протоколов шифрования. Где-то еще только готовятся.</p>
<p>Борьба с месенджерами так же идет повсеместно.</p>
<p>Паша "осеменитель" Дуров за право жить в ОАЭ отдал исходный код и инфраструктуру Телеграма властям и они запустили Tawasal. Правда об этом никто официально не говорит, но почему-то приложение выглядит 1 к 1 как Телеграм. В Эмиратах через Телеграм звонить нельзя, а через Tawasal можно. На территории Эмиратов Телеграм не пытается обходить ограничения на звонки. И да, Tawasal со встроенной рекламой, потому что Паша говорил, что не будет рекламы в Телеграме, а не Tawasal'е.</p>
<p>Мессенджеры — это тоже часть интернета, которая мешает и создает альтернативное мнение. Правда часто — это альтернативное мнение не ради личного счастья конкретного человека, а ради личных интересов других людей. Подумайте сами один выстрел из ракеты может обойтись в 300 тысяч долларов США и разрушит только одно здание. А заплатив блогеру несколько тысяч долларов можно получить миллионы просмотров и нанести ущерб гораздо больший. Некоторые даже готовы будут сорваться, бросить все и мечтая переехать в вашу страну третьего мира без медицины, с налогами превращающими человека в раба, с такой же коррупцией, но на иностранном языке. И липовым рейтингом счастья, на который человек будет всю жизнь стоять и смотреть из-за забора, но уже с новым паспортом.</p>
<p>Да, будем немного скучать по старому интернету. На всякий случай может быть имеет смыл скачать локальный архив книг, музыки и порно. Но лучше всего это хранить как-то так чтобы этого нельзя было найти на вашем ноутбуке или телефоне когда вы будете проходить контроль в аэропорту. В крайнем случае можно рассказывать детям сказки про старый интернет. Но тут тоже важно это делать не вслух, потому что ваша стиральная машина скорее всего вас слушает и отправит расшифрованную запись ваших разговоров на сервер и это скажется на вашем социальном рейтинге.</p>
]]></content:encoded></item><item><title><![CDATA[What happen to Ask Solem]]></title><description><![CDATA[Many Python developers know the Celery project. This is an important part of the Python ecosystem, a project that allows you to effectively manage and orchestrate background tasks. For example, you upload a video to a site and click the "convert vide...]]></description><link>https://myblog.ru/what-happen-to-ask-solem</link><guid isPermaLink="true">https://myblog.ru/what-happen-to-ask-solem</guid><category><![CDATA[celery]]></category><category><![CDATA[Python]]></category><category><![CDATA[Open Source]]></category><dc:creator><![CDATA[Mikhail Kashkin]]></dc:creator><pubDate>Wed, 16 Apr 2025 17:54:11 GMT</pubDate><content:encoded><![CDATA[<p>Many Python developers know the <strong>Celery</strong> project. This is an important part of the Python ecosystem, a project that allows you to effectively manage and orchestrate background tasks. For example, you upload a video to a site and click the "convert video" button. It is clear that while you are clicking and releasing the button, a video several gigabytes in size will not be able to be processed so quickly. Therefore, such tasks are usually launched as a separate process, waiting for it to finish. And then a lot of things start:</p>
<ul>
<li><p>what if the task completes with an error, it is often enough to simply restart it after a short time</p>
</li>
<li><p>what if many users upload a lot of videos</p>
</li>
<li><p>are there any important tasks that should always be launched first as soon as there are at least some resources</p>
</li>
<li><p>or maybe you need to run tasks on a schedule, for example, issue invoices once a month</p>
</li>
</ul>
<p>And to manage this entire zoo, the Celery project appeared a long time ago. The first public release was published on <a target="_blank" href="http://Pypi.org">Pypi.org</a> in 2009. The author of this project was a developer with a funny nickname <code>ask</code>. I think I first used this project around 2011, judging by the <strong>Django</strong> versions that were released at that time. I don't remember anything significant about project I was working on, but the approach to using Celery was unusual and that's why the project was memorable. Instead of writing tasks separately, you could mark some functions in the existing code using decorators, and then run a separate script that worked as a separate server, but without Django.</p>
<p>The project gained popularity. But around 2016, <code>ask</code> abandoned it and managed to create another project, Faust, which was somewhat similar. We needed to process a large number of messages, preferably asynchronously, and I was looking for a way to do this. And I found a project that allowed you to connect to <strong>Kafka</strong>, listen for new messages and allow you to run tasks for them. In some ways similar to Celery, but Celery can change brokers and backends for storing task statuses. And what was my surprise that this project was written by the same developer as Celery. I immediately thought that since this developer had already done one project, he most likely understands what he is doing.</p>
<p>I also noticed that the avatar was a woman, but very similar to a photo that I had once seen before. Despite the fact that I am not very good at remembering faces. But I went to see who it was and only after that I remembered the name Ask Solem. It turned out that he had changed his gender and now began to write everywhere that he is now a woman. His new place of work was Robin Hood, a company about which I had heard that they have very aggressive marketing. But I had never heard that they support any open source projects. I thought that Ask must be a good developer, that the employer allowed him to release an internal project on GitHub.</p>
<p>Project I was working on at some point was closed. I no longer used Faust. Also, Kafka is not the technology you choose for every next project. I remembered just fact that Faust exists, but doesn’t care about it. A few years later, the idea of ​​using Kafka arose again, and I went to de-dust my memories about Faust. And what was my surprise when it turned out that it was already abandoned. And other people picked it up and were already developing a fork. I started looking at what happened to the developer, but he (she) disappeared.</p>
<p>A similar story, but much earlier, happened to <strong>Mark Pilgrim</strong>. He wrote several popular books <em>Dive into Python</em>, <em>Dive into HTML5</em>, <em>Dive into Accessibility</em>, <em>Dive into Greasemonkey</em>. He posted them on websites, they became table books for many beginning developers. His popularity grew a lot. He became a very popular author. But on October 4, 2011, all his websites went down. And at the same time, his Twitter, Reddit, GitHub and Google+ accounts were deleted. I don’t know what this can be compared to, probably an episode from Black Mirror. Of course, many began to worry. Because in this situation, nothing was normal. After some time <a target="_blank" href="https://en.wikipedia.org/wiki/Mark_Pilgrim#%22Disappearance%22_from_the_Internet">it was discovered</a> that Mark was alive, but committed <strong>infosuicide</strong>. And he decided to hide from his popularity and just turned everything off. As far as I know, he has not appeared publicly anywhere since then. I hope he is okay.</p>
<p>Mark's disappearance was probably cruel to those who read him. I can definitely say that I kinda went through the loss. But on the other hand, he definitely has the right for his life. Developers are not the most sophisticated people in terms of soft skills. They can live their popularity and success in a completely different way. Not like influencers, stars or popular musicians.</p>
<p>Again, an example is the story of Perl 6 developer Audrey Tan, the developer was developing Perl 6, changed his gender, became a woman and changed his area of ​​interest. Wikipedia says he became Taiwan's Minister of Digital Affairs. Basically, he got involved in politics.</p>
<p>In general, I thought that something similar happened to Ask, and don’t worry much. But every time I returned to Celery or Faust, I did small research and tried to find out what happened to him or how he now called himself "her". But apparently Ask was not so popular that someone would investigate his disappearance. I'm sure there were people who were interested in him as much as I was, but I didn't come across them or their posts. At some point, I stopped reading the mailing lists and blogs of the Python developer community. I think there were such posts, but I couldn't even find them.</p>
<p>So I just checked sometimes and didn't find anything. I am also a person with my own history and sometimes I also feel tired of social networks, I can immerse myself in work for a long time. I had periods when I felt that social networks had too much influence on my mood and blocked them on all my devices.</p>
<p>In short, I realized that Ask could have simply disappeared somewhere, he could have been given some higher position where he no longer had time to write open source code, or he could have simply started living his own life.</p>
<p>Today I sat down to reread the Celery documentation, because I see that the project is actively being updated and developed, and I again made an attempt to find out what happened to Ask.</p>
<p>Unfortunately, I found it by the request "What happened to Ask Sol". Not even on the first page of the Google.</p>
<p>Ask Solem Hoel was born on 11.05.1982, and the date of death is 05.12.2021. There is a website on the Internet with an online cemetery and on which <a target="_blank" href="https://flataas.vareminnesider.no/memorial_page/memorial_page_personal_info.php?order_id=3957458&amp;set_site_id=831&amp;cat=home&amp;sign=bf0ba6c7eb4ed19e97572a293d4d1ef2">Ask's memorial page is located</a>. It is in Norwegian, which is probably why I couldn't find it before. If you dig around, you can find and expand a small block in English:</p>
<blockquote>
<p>Our beloved dad, son and brother Ask’s life took place in London and later in San Francisco. But his roots and his family background was in Trondheim. He created Celery Project and worked as a software engineer at Robin Hood in Palo Alto. You had an amazing ability to concentrate and focus in on whatever fascinated you, such as creating music. You made techno, deep house and hiphop, playing all instruments by yourself. You could be in the same groove for weeks. You perused thick manuals consisting solely of numbers, you loved your work! You built Lego, nursed flowers and read a lot for Robin. Robin was the sunshine of your life, he totally changed your life.</p>
</blockquote>
<p>I think this text was written by his mother, who regularly visits the site and congratulates her son on his birthday, writes that she misses him. It turns out that Ask was the father.</p>
<p>I don’t know the details, I don’t even know what kind of person Ask was. I only know that in almost every project we use what he wrote.</p>
<p>For some reason, it seems to me that the story with the sex change did not end well, that the early death was somehow connected with this. Or there were some other reasons and the attempt to change sex was an attempt to solve them. In any case, mental health is a very important part of life.</p>
<p>Today I revealed to myself the secret of where one of the open source developers disappeared to. True, now I am very sad. I feel very sorry for his mother. One of the biggest fears of a parent is to bury their children.</p>
<p>R.I.P. Ask Solem Hoel.</p>
]]></content:encoded></item><item><title><![CDATA[Оплатил Youtube Premium.]]></title><description><![CDATA[Получился целый квест чтобы оплатить премиум подписку на Youtube. В какой-то момент видеохостер решил, что больше не готов принимать от меня деньги просто так и решил устроить небольшое предновогоднее развлечение. Видимо какой-то ИИ внутри системы оп...]]></description><link>https://myblog.ru/oplatil-youtube-premium</link><guid isPermaLink="true">https://myblog.ru/oplatil-youtube-premium</guid><category><![CDATA[nomad]]></category><category><![CDATA[life]]></category><dc:creator><![CDATA[Mikhail Kashkin]]></dc:creator><pubDate>Sun, 22 Dec 2024 09:32:40 GMT</pubDate><content:encoded><![CDATA[<p>Получился целый квест чтобы оплатить премиум подписку на Youtube. В какой-то момент видеохостер решил, что больше не готов принимать от меня деньги просто так и решил устроить небольшое предновогоднее развлечение. Видимо какой-то ИИ внутри системы оплаты решил, что у меня не хватает своих проблем в жизни и решил помочь.</p>
<p>Причем пользоваться Youtube с рекламой вообще невозможно. Качество жизни падает просто глобально. В нашей жизни постоянными стали виртуальные вещи. Дом — это не там, где твои книги, вещи и инструменты. А дом — это там, где твой Netflix и Youtube. Могло быть по-другому, но пока так.</p>
<p>И привычный уютный Ютуб перестал быть центром стабильности и начал угрожать что его скоро не будет. Ну закончилась подписка, ну так в чем дело? Но он начал настойчиво предлагать оплатить подписку в валюте страны, в которой мы сейчас находимся. В целом я и не против, ну будут баты, или донги. Какая нафиг разница? Но оказалось, что карточка должна быть привязана к стране, в валюте которой выставляется счет. То есть, я своей карточкой не могу оплатить счет в батах. А время стремительно заканчивалось.</p>
<p>И вот в мой домашний ютюб проникла всякая стремная реклама и какое-то дерьмо и интернетов к которому я просто не был готов. Плюс еще моим детям начали показывать рекламные вставки, у нас семейная учетная запись. Премиум ютуба, по каким-то замерам, защищает детей от просмотра от 300 часов рекламы в год. Представьте сколько визуального и нерелевантного мусора показывается детям если не оплатить пару долларов в месяц? Это просто вопрос ментальной безопасности и фундаментального качества жизни. Современный налог на телевизор.</p>
<p>В общем платить надо. Но вопрос как. Можно было бы пойти и открыть счет в тайском банке. Но это требует другой тип визы. И мы даже уже в Хошимине и пытаемся ее получить третью неделю. Но рекламу начали показывать уже сейчас. А сколько займут все эти бюрократические задачи не понятно. Вьетнамский банк звучит привлекательно, но в теории. И как потом пополнять.</p>
<p>Плюс у нас есть привилегия, которой нет в менее развитых европейских странах: счет в лучшем банке мира Приватбанке. Как бы воспользоваться ею?</p>
<p>Мне надо показать Гуглу, что я нахожусь в Украине. А для этого нужно заходить на сайт через украинский IP. Это можно сделать двумя способами. Я попробовал самый простой — найти VPN. Потратил на это время, даже скачивал несколько клиентов на компьютер. Если бы это получилось, то на этом бы история и закончилась.</p>
<p>Мне не нравится сама суть VPN бизнеса. Я понимаю тех, кто вынужден им пользоваться. Это как платить налоги понимая, что они пойдут на то, чтобы убивать граждан твоей же страны. Если у тебя нет специальных знаний и навыков, то безопаснее просто их платить.</p>
<p>Почему VPN это плохо? Модель бизнеса принципиально уязвима. Если ты хорошо выстроил продажи и хорошо умеешь привлекать пользователей, то ты вынужден сотрудничать с властями. И даже нет принципиальной разницы платный VPN или бесплатный. Представьте, что вы годами собираете команду, вкладываетесь в маркетинг, а потом очередной чиновник даже без решения суда просто блокирует весь ваш бизнес в стране. А блокируют все страны. Просто условно передовые тоталитарные страны типа Китай, Франция, Германия, США следят за своими гражданами гораздо больше, чем условный Таиланд. Нет какой-то особой уникальности вокруг блокировки российских сайтов на территории Украины. Просто теперь интернет такой.</p>
<p>Так же нет никакой репутационной ценности у VPN провайдеров. Это не бизнес, в котором победитель получает все. Завтра будет еще новый десяток. Причем от тех же самых людей. Благо зарегистрировать юрлицо не сложно, да и выполняет оно функцию приема платежей. Если ваша компания засветилась случайно в судебной практике, то NewWavePrivate Techology LLC мало кто сопоставит с приложением GlobalVPN в апсторе.</p>
<p>Но даже поиск украинских VPN не увенчался успехом. В целом провайдеры очень мутные, работают плохо, врут про то, что у них есть выходные ноды в Украине. А поскольку ценности они создают немного, то стараются забайтить на оплату сразу за год, и чаще всего предлагают вбивать данные карточки у них на сайте, а не через известные платежные шлюзы, которые хоть как-то дают ощущение защиты.</p>
<p>Для того чтобы сделать свой приватный VPN нужна одна единственная строка в консоли:</p>
<p><code>ssh -D 1080 -C -N пользователь@сервер</code></p>
<p>Это все что надо чтобы сделать защищенный SOCKS прокси. Да, все давным-давно придумано и работает. Весь современный интернет написан в конце прошлого века и до сих пор работает, вопреки.</p>
<p>Пришлось сделать шаг глубже, и я начал искать хоть какой-то сервер в Украине чтобы открыть с ним ssh соединение и перенаправить через него трафик.</p>
<p>Первым делам пошел к пацанам Nic.ua<strong>.</strong> Попытался у них подключить хостинг, но ничего не получилось. Я готов был заплатить им денег, но они предложили бесплатный, а потом он то ли не подключился, то ли успел отключиться пока я готов был его попробовать. В общем пошел искать дальше.</p>
<p>Спросил у своих учеников, вдруг у кого-то есть сервер. У одного был, но там почему-то отключили опцию создания SSH туннелей. Человек и так им платит, почему такое жлобство я не понимаю.</p>
<p>Пошел смотреть еще кучу других сервисов. С сайтами оказалось надо бороться. Даже не буду тратить на это время. Много сайтов, много странного.</p>
<p>В конце концов просто начал покупать и оплачивать доступы. К счастью, тут уже было все не так сложно и не так долго. Хоть админ панели работают просто очень медленно. Посадочная открывается быстро, а админ панель хостера медленно. Экономят что ли на серверах? 20 секунд ждать нажатия кнопки это прямо много. При том, что внутри еще надо кучу действий сделать: дозаполнить анкету, подключить сервер, выбрать какие-то настройки и т.д.</p>
<p>В общем получилось подключить на Server.ua<strong>.</strong> Не рекомендовать их в данной ситуации не могу. Хотя у них админка работает просто мега медленно.</p>
<p>Наконец-то скопировал выделенный айпи адрес, включил настройки SOCKS прокси в настройках сети. И через 30 секунд оплатил приватовской карточкой премиум.</p>
<p>СУКА! Часов 8 на попытки решить вопросы и реальные действия, которые привели к результату это 30 секунд. Обожаю киберпанк, в котором мы трахаемся с системами пока они трахают нас.</p>
<p>Теперь могу послушать музыку в фоне, скачать на телефон и дети могут посмотреть ролики по учебе и для развлечения без рекламы.</p>
]]></content:encoded></item><item><title><![CDATA[Как я настраивал Raspberry Pi 5 для загрузки с SSD]]></title><description><![CDATA[Думаю, без ИИ у меня бы заняло неделю или больше сидения по вечерам и ковыряния с настройками. 
MK:
Мне нужна помощь в переразбитии SSD диска с которого загружается операционная система в Raspbery PI. У меня стоит утилита fdisk. SSD подключен как дис...]]></description><link>https://myblog.ru/raspberry-pi-5-zagruzka-s-ssd</link><guid isPermaLink="true">https://myblog.ru/raspberry-pi-5-zagruzka-s-ssd</guid><category><![CDATA[rpi5]]></category><category><![CDATA[Linux]]></category><category><![CDATA[debian]]></category><category><![CDATA[Raspberry Pi]]></category><category><![CDATA[ssd]]></category><dc:creator><![CDATA[Mikhail Kashkin]]></dc:creator><pubDate>Sat, 26 Oct 2024 15:04:49 GMT</pubDate><content:encoded><![CDATA[<p>Думаю, без ИИ у меня бы заняло неделю или больше сидения по вечерам и ковыряния с настройками. </p>
<h2 id="heading-mk">MK:</h2>
<p>Мне нужна помощь в переразбитии SSD диска с которого загружается операционная система в Raspbery PI. У меня стоит утилита fdisk. SSD подключен как диск /dev/nvme0n1.</p>
<p>Диск разбит на две части: загрузочная под файловой системой FAT32 размером 512M и вторая часть размером 2Tb с файловой системой Linux.</p>
<p>Мне необходимо чтобы все свободное место на диске было доступно для пользователя. С учетом рекомендаций по разбитию дисков для Linux. </p>
<p>Общий размер диска 4Tb. </p>
<p>Задай мне все необходимые диагностические вопросы чтобы помочь мне принять правильное решение по разбитию диска, внесения изменений с помощью fdisk или других необходимых утилит, записи изменений и действий необходимых чтобы я мог правильно воспользоваться свободным пространством. Компьютер будет использоваться для размещения веб сервера с порядка 2 терабайт файлов и медиа сервера с большим количеством видео для оставщейся части. Так же будет работать торрент клиент и бэкенд на python'е. </p>
<p>Компьютер сейчас запущен, работает и я к нему подключен по сети. После выполнения всех операций он должен перезапуститься и продолжить работу. Критических данных на компьютере сейчас нет, есть только операционная система без графической оболочки для raspberry pi debian bookworm</p>
<h2 id="heading-chatgpt">ChatGPT:</h2>
<p>Отвечу как эксперт по управлению файловыми системами и оптимизации хранения данных для серверных приложений на Raspberry Pi, с многолетним опытом работы в Unix-системах.</p>
<p>Для оптимального переразбиения SSD и использования всего объема 4TB нам нужно учесть следующие детали:</p>
<ol>
<li><p><strong>Цель переразбиения</strong> : требуется ли изменить размер загрузочного раздела или оставить его без изменений?</p>
</li>
<li><p><strong>Тип файловой системы</strong> : какой тип файловой системы вы хотите использовать для дополнительных 2TB (например, ext4 для надежности и производительности или xfs, если доступна поддержка)? Это важно для подбора команд и утилит.</p>
</li>
<li><p><strong>Метод доступности диска</strong> : планируете ли вы использовать оставшееся место как один большой раздел или логические группы (например, LVM), чтобы позже гибко перераспределять объемы?</p>
</li>
<li><p><strong>Резервное копирование и отказоустойчивость</strong> : если сервер будет использоваться активно (веб-сервер и торрент-клиент), можно рассмотреть разделение на несколько логических разделов для разных задач и безопасности данных (например, один раздел под веб-контент, другой под медиа и кэш).
На основе ваших ответов можно выбрать оптимальный план и выполнить необходимые команды с помощью <code>fdisk</code>, <code>resize2fs</code> и других утилит.</p>
</li>
</ol>
<h2 id="heading-mk-1">MK:</h2>
<ol>
<li>Я не уверен, что такое возможно. В целом мне бы подошло удалить этот раздел и отдать весь диск одним разделом, но я не знаю правильно ли это. Мне нужно будет поставить дополнительные пакеты на компьютер и я не знаю повлияет ли это на загрузочную область. Если нет, то не получится ли, что в процессе что-то что расположено не на загрузочной области будет удалено после внесения изменений в разбивку диска. Если необходимо провести дополнительные действия чтобы проверить возможно ли это то скажи какие. Возможно этот вопрос не является существенным и можно двигаться с существующим загрузочным разделом. Плюс, я не уверен, что загрузочный раздел может быть 4Тб если переразбить диск и удалить загрузочный раздел.</li>
</ol>
<h2 id="heading-chatgpt-1">ChatGPT:</h2>
<p>Понял. С вашего описания и текущих требований наиболее безопасный путь для вашего использования – сохранить существующий загрузочный раздел (512M) и переразбить остальное пространство, объединяя всё в одном большом разделе. Если мы оставим загрузочный раздел как есть, это позволит избежать риска потери данных в процессе добавления новых пакетов и не повлияет на загрузочную область, где расположены критические данные для запуска системы.</p>
<p>Вот диагностические шаги, которые помогут нам подтвердить безопасный путь, и объяснение процесса:</p>
<h3 id="heading-shagi-dlya-diagnostiki-i-proverki-tekushego-sostoyaniya">Шаги для диагностики и проверки текущего состояния:</h3>
<ol>
<li><p><strong>Проверка таблицы разделов:</strong>  Запустите команду <code>sudo fdisk -l /dev/nvme0n1</code> для вывода текущей таблицы разделов и файловых систем на каждом разделе. Это поможет подтвердить, что на диске действительно только два раздела и место свободно для объединения.</p>
</li>
<li><p><strong>Проверка типа загрузочного раздела:</strong>  Нам нужно убедиться, что загрузочный раздел содержит необходимые файлы и точный объем данных для их сохранности. Выведите содержимое загрузочного раздела, выполнив:</p>
</li>
</ol>
<pre><code class="lang-bash">sudo ls -lah /boot
</code></pre>
<p>и укажите примерный объем используемого пространства. Это поможет понять, хватит ли 512M.</p>
<ol start="3">
<li><strong>Определение текущей точки монтирования для второго раздела:</strong>  С помощью команды <code>df -h</code> или <code>lsblk</code> найдите второй раздел и проверьте его точку монтирования, чтобы подтвердить, что он монтируется правильно и может быть переразбит без угрозы для системы.</li>
</ol>
<h3 id="heading-esli-vsyo-v-poryadke">Если всё в порядке:</h3>
<p>Если при диагностике все параметры подтвердятся, можно будет двигаться к переразбиению с сохранением загрузочного раздела и созданием нового раздела на остальной части диска. Обратитесь, как только проверите текущую таблицу и объем данных загрузочного раздела.</p>
<h2 id="heading-mk-2">MK:</h2>
<pre><code>$ sudo fdisk -l /dev/nvme0n1
Disk /dev/nvme0n1: <span class="hljs-number">3.73</span> TiB, <span class="hljs-number">4096805658624</span> bytes, <span class="hljs-number">8001573552</span> sectors
Disk model: XG7000<span class="hljs-number">-4</span>TB <span class="hljs-number">2280</span>
<span class="hljs-attr">Units</span>: sectors <span class="hljs-keyword">of</span> <span class="hljs-number">1</span> * <span class="hljs-number">512</span> = <span class="hljs-number">512</span> bytes
Sector size (logical/physical): <span class="hljs-number">512</span> bytes / <span class="hljs-number">512</span> bytes
I/O size (minimum/optimal): <span class="hljs-number">512</span> bytes / <span class="hljs-number">512</span> bytes
Disklabel type: dos
Disk identifier: <span class="hljs-number">0xba8090a0</span>

$ sudo ls -lah /boot
total <span class="hljs-number">146</span>M
drwxr-xr-x  <span class="hljs-number">3</span> root root <span class="hljs-number">4.0</span>K Oct <span class="hljs-number">25</span> <span class="hljs-number">19</span>:<span class="hljs-number">25</span> .
drwxr-xr-x <span class="hljs-number">18</span> root root <span class="hljs-number">4.0</span>K Jul  <span class="hljs-number">4</span> <span class="hljs-number">07</span>:<span class="hljs-number">18</span> ..
-rw-r--r--  <span class="hljs-number">1</span> root root   <span class="hljs-number">83</span> May <span class="hljs-number">29</span> <span class="hljs-number">21</span>:<span class="hljs-number">04</span> System.map<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v6
-rw-r--r--  <span class="hljs-number">1</span> root root   <span class="hljs-number">83</span> May <span class="hljs-number">29</span> <span class="hljs-number">21</span>:<span class="hljs-number">04</span> System.map<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v7
-rw-r--r--  <span class="hljs-number">1</span> root root   <span class="hljs-number">83</span> May <span class="hljs-number">29</span> <span class="hljs-number">21</span>:<span class="hljs-number">04</span> System.map<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v7l
-rw-r--r--  <span class="hljs-number">1</span> root root   <span class="hljs-number">83</span> May <span class="hljs-number">29</span> <span class="hljs-number">21</span>:<span class="hljs-number">04</span> System.map<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v8
-rw-r--r--  <span class="hljs-number">1</span> root root   <span class="hljs-number">83</span> Oct  <span class="hljs-number">9</span> <span class="hljs-number">01</span>:<span class="hljs-number">49</span> System.map<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v6
-rw-r--r--  <span class="hljs-number">1</span> root root   <span class="hljs-number">83</span> Oct  <span class="hljs-number">9</span> <span class="hljs-number">01</span>:<span class="hljs-number">49</span> System.map<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v7
-rw-r--r--  <span class="hljs-number">1</span> root root   <span class="hljs-number">83</span> Oct  <span class="hljs-number">9</span> <span class="hljs-number">01</span>:<span class="hljs-number">49</span> System.map<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v7l
-rw-r--r--  <span class="hljs-number">1</span> root root   <span class="hljs-number">83</span> Oct  <span class="hljs-number">9</span> <span class="hljs-number">01</span>:<span class="hljs-number">49</span> System.map<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v8
-rw-r--r--  <span class="hljs-number">1</span> root root   <span class="hljs-number">92</span> Jul  <span class="hljs-number">4</span> <span class="hljs-number">07</span>:<span class="hljs-number">06</span> cmdline.txt
-rw-r--r--  <span class="hljs-number">1</span> root root <span class="hljs-number">200</span>K May <span class="hljs-number">29</span> <span class="hljs-number">21</span>:<span class="hljs-number">04</span> config<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v6
-rw-r--r--  <span class="hljs-number">1</span> root root <span class="hljs-number">206</span>K May <span class="hljs-number">29</span> <span class="hljs-number">21</span>:<span class="hljs-number">04</span> config<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v7
-rw-r--r--  <span class="hljs-number">1</span> root root <span class="hljs-number">224</span>K May <span class="hljs-number">29</span> <span class="hljs-number">21</span>:<span class="hljs-number">04</span> config<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v7l
-rw-r--r--  <span class="hljs-number">1</span> root root <span class="hljs-number">233</span>K May <span class="hljs-number">29</span> <span class="hljs-number">21</span>:<span class="hljs-number">04</span> config<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v8
-rw-r--r--  <span class="hljs-number">1</span> root root <span class="hljs-number">201</span>K Oct  <span class="hljs-number">9</span> <span class="hljs-number">01</span>:<span class="hljs-number">49</span> config<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v6
-rw-r--r--  <span class="hljs-number">1</span> root root <span class="hljs-number">206</span>K Oct  <span class="hljs-number">9</span> <span class="hljs-number">01</span>:<span class="hljs-number">49</span> config<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v7
-rw-r--r--  <span class="hljs-number">1</span> root root <span class="hljs-number">225</span>K Oct  <span class="hljs-number">9</span> <span class="hljs-number">01</span>:<span class="hljs-number">49</span> config<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v7l
-rw-r--r--  <span class="hljs-number">1</span> root root <span class="hljs-number">233</span>K Oct  <span class="hljs-number">9</span> <span class="hljs-number">01</span>:<span class="hljs-number">49</span> config<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v8
-rw-r--r--  <span class="hljs-number">1</span> root root   <span class="hljs-number">91</span> Jul  <span class="hljs-number">4</span> <span class="hljs-number">07</span>:<span class="hljs-number">06</span> config.txt
drwxr-xr-x  <span class="hljs-number">5</span> root root <span class="hljs-number">6.0</span>K Jan  <span class="hljs-number">1</span>  <span class="hljs-number">1970</span> firmware
-rw-r--r--  <span class="hljs-number">1</span> root root  <span class="hljs-number">10</span>M Oct <span class="hljs-number">25</span> <span class="hljs-number">19</span>:<span class="hljs-number">25</span> initrd.img<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v6
-rw-r--r--  <span class="hljs-number">1</span> root root  <span class="hljs-number">11</span>M Oct <span class="hljs-number">25</span> <span class="hljs-number">19</span>:<span class="hljs-number">25</span> initrd.img<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v7
-rw-r--r--  <span class="hljs-number">1</span> root root  <span class="hljs-number">11</span>M Oct <span class="hljs-number">25</span> <span class="hljs-number">19</span>:<span class="hljs-number">25</span> initrd.img<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v7l
-rw-r--r--  <span class="hljs-number">1</span> root root  <span class="hljs-number">11</span>M Oct <span class="hljs-number">25</span> <span class="hljs-number">19</span>:<span class="hljs-number">25</span> initrd.img<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v8
-rw-r--r--  <span class="hljs-number">1</span> root root  <span class="hljs-number">11</span>M Oct <span class="hljs-number">25</span> <span class="hljs-number">19</span>:<span class="hljs-number">25</span> initrd.img<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v6
-rw-r--r--  <span class="hljs-number">1</span> root root  <span class="hljs-number">11</span>M Oct <span class="hljs-number">25</span> <span class="hljs-number">19</span>:<span class="hljs-number">25</span> initrd.img<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v7
-rw-r--r--  <span class="hljs-number">1</span> root root  <span class="hljs-number">11</span>M Oct <span class="hljs-number">25</span> <span class="hljs-number">19</span>:<span class="hljs-number">25</span> initrd.img<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v7l
-rw-r--r--  <span class="hljs-number">1</span> root root  <span class="hljs-number">11</span>M Oct <span class="hljs-number">25</span> <span class="hljs-number">19</span>:<span class="hljs-number">25</span> initrd.img<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v8
lrwxrwxrwx  <span class="hljs-number">1</span> root root   <span class="hljs-number">18</span> Jul  <span class="hljs-number">4</span> <span class="hljs-number">07</span>:<span class="hljs-number">17</span> issue.txt -&gt; firmware/issue.txt
lrwxrwxrwx  <span class="hljs-number">1</span> root root   <span class="hljs-number">17</span> Jul  <span class="hljs-number">4</span> <span class="hljs-number">07</span>:<span class="hljs-number">06</span> overlays -&gt; firmware/overlays
-rw-r--r--  <span class="hljs-number">1</span> root root <span class="hljs-number">6.8</span>M May <span class="hljs-number">29</span> <span class="hljs-number">21</span>:<span class="hljs-number">04</span> vmlinuz<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v6
-rw-r--r--  <span class="hljs-number">1</span> root root <span class="hljs-number">7.1</span>M May <span class="hljs-number">29</span> <span class="hljs-number">21</span>:<span class="hljs-number">04</span> vmlinuz<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v7
-rw-r--r--  <span class="hljs-number">1</span> root root <span class="hljs-number">7.6</span>M May <span class="hljs-number">29</span> <span class="hljs-number">21</span>:<span class="hljs-number">04</span> vmlinuz<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v7l
-rw-r--r--  <span class="hljs-number">1</span> root root <span class="hljs-number">8.9</span>M May <span class="hljs-number">29</span> <span class="hljs-number">21</span>:<span class="hljs-number">04</span> vmlinuz<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v8
-rw-r--r--  <span class="hljs-number">1</span> root root <span class="hljs-number">6.8</span>M Oct  <span class="hljs-number">9</span> <span class="hljs-number">01</span>:<span class="hljs-number">49</span> vmlinuz<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v6
-rw-r--r--  <span class="hljs-number">1</span> root root <span class="hljs-number">7.2</span>M Oct  <span class="hljs-number">9</span> <span class="hljs-number">01</span>:<span class="hljs-number">49</span> vmlinuz<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v7
-rw-r--r--  <span class="hljs-number">1</span> root root <span class="hljs-number">7.6</span>M Oct  <span class="hljs-number">9</span> <span class="hljs-number">01</span>:<span class="hljs-number">49</span> vmlinuz<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v7l
-rw-r--r--  <span class="hljs-number">1</span> root root <span class="hljs-number">8.9</span>M Oct  <span class="hljs-number">9</span> <span class="hljs-number">01</span>:<span class="hljs-number">49</span> vmlinuz<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v8
Device         Boot   Start        End    Sectors  Size Id Type
/dev/nvme0n1p1         <span class="hljs-number">8192</span>    <span class="hljs-number">1056767</span>    <span class="hljs-number">1048576</span>  <span class="hljs-number">512</span>M  c W95 FAT32 (LBA)
/dev/nvme0n1p2      <span class="hljs-number">1056768</span> <span class="hljs-number">4294967295</span> <span class="hljs-number">4293910528</span>    <span class="hljs-number">2</span>T <span class="hljs-number">83</span> Linux


$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
mmcblk0     <span class="hljs-number">179</span>:<span class="hljs-number">0</span>    <span class="hljs-number">0</span> <span class="hljs-number">119.1</span>G  <span class="hljs-number">0</span> disk
|-mmcblk0p1 <span class="hljs-number">179</span>:<span class="hljs-number">1</span>    <span class="hljs-number">0</span>   <span class="hljs-number">512</span>M  <span class="hljs-number">0</span> part
<span class="hljs-string">`-mmcblk0p2 179:2    0 118.6G  0 part
`</span>nvme0n1     <span class="hljs-number">259</span>:<span class="hljs-number">0</span>    <span class="hljs-number">0</span>   <span class="hljs-number">3.7</span>T  <span class="hljs-number">0</span> disk
|-nvme0n1p1 <span class="hljs-number">259</span>:<span class="hljs-number">1</span>    <span class="hljs-number">0</span>   <span class="hljs-number">512</span>M  <span class="hljs-number">0</span> part /boot/firmware
<span class="hljs-string">`-nvme0n1p2 259:2    0     2T  0 part /
`</span>
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            <span class="hljs-number">3.8</span>G     <span class="hljs-number">0</span>  <span class="hljs-number">3.8</span>G   <span class="hljs-number">0</span>% /dev
tmpfs           <span class="hljs-number">795</span>M  <span class="hljs-number">1.3</span>M  <span class="hljs-number">794</span>M   <span class="hljs-number">1</span>% /run
/dev/nvme0n1p2  <span class="hljs-number">2.0</span>T  <span class="hljs-number">2.1</span>G  <span class="hljs-number">1.9</span>T   <span class="hljs-number">1</span>% /
tmpfs           <span class="hljs-number">3.9</span>G     <span class="hljs-number">0</span>  <span class="hljs-number">3.9</span>G   <span class="hljs-number">0</span>% <span class="hljs-regexp">/dev/</span>shm
tmpfs           <span class="hljs-number">5.0</span>M   <span class="hljs-number">12</span>K  <span class="hljs-number">5.0</span>M   <span class="hljs-number">1</span>% <span class="hljs-regexp">/run/</span>lock
/dev/nvme0n1p1  <span class="hljs-number">510</span>M   <span class="hljs-number">98</span>M  <span class="hljs-number">413</span>M  <span class="hljs-number">20</span>% <span class="hljs-regexp">/boot/</span>firmware
tmpfs           <span class="hljs-number">795</span>M     <span class="hljs-number">0</span>  <span class="hljs-number">795</span>M   <span class="hljs-number">0</span>% <span class="hljs-regexp">/run/u</span>ser/<span class="hljs-number">1000</span>
</code></pre><h2 id="heading-chatgpt-2">ChatGPT:</h2>
<p>Судя по предоставленным данным, текущее состояние диска и загрузочной структуры позволяет переразбить SSD с сохранением загрузочного раздела, не рискуя повредить систему или потерять данные. Поскольку загрузочный раздел <code>/dev/nvme0n1p1</code> занимает только 512M, этого объема достаточно для хранения всех необходимых файлов, не влияя на основное пространство для системы. Основной раздел <code>/dev/nvme0n1p2</code>, где монтируется корневая файловая система, занимает 2TB, и его можно переразбить, чтобы использовать всё доступное пространство на SSD.</p>
<h3 id="heading-dejstviya-dlya-pererazbieniya-ssd-na-4tb-s-sohraneniem-zagruzochnogo-razdela">Действия для переразбиения SSD на 4TB с сохранением загрузочного раздела:</h3>
<h4 id="heading-1-udalite-tekushij-vtoroj-razdel">1. Удалите текущий второй раздел</h4>
<p>Запустите <code>fdisk</code> для редактирования разделов:</p>
<pre><code class="lang-bash">sudo fdisk /dev/nvme0n1
</code></pre>
<p>В <code>fdisk</code>: </p>
<ul>
<li><p>Нажмите <code>d</code>, затем выберите <code>2</code>, чтобы удалить второй раздел.</p>
</li>
<li><p>Подтвердите удаление, но <strong>Подтвердите удаление, но не выходите из <code>fdisk</code></strong> .</p>
</li>
</ul>
<h4 id="heading-2-sozdajte-novyj-vtoroj-razdel">2. Создайте новый второй раздел</h4>
<ul>
<li><p>Нажмите <code>n</code>, чтобы создать новый раздел.</p>
</li>
<li><p>Выберите <code>p</code> для создания основного раздела.</p>
</li>
<li><p>Выберите <code>2</code> для номера раздела.</p>
</li>
<li><p>Установите <strong>начальный сектор</strong>  на <code>1056768</code>, чтобы новый раздел начинался там, где завершился загрузочный.</p>
</li>
<li><p>Для <strong>конечного сектора</strong>  нажмите <code>Enter</code>, чтобы использовать всё оставшееся пространство диска.</p>
</li>
</ul>
<h4 id="heading-3-proverte-i-zapishite-izmeneniya">3. Проверьте и запишите изменения</h4>
<ul>
<li>Нажмите <code>w</code>, чтобы записать изменения на диск и выйти из <code>fdisk</code>.</li>
</ul>
<h4 id="heading-4-sozdajte-fajlovuyu-sistemu-na-novom-razdele">4. Создайте файловую систему на новом разделе</h4>
<p>После записи изменений создайте файловую систему ext4:</p>
<pre><code class="lang-bash">sudo mkfs.ext4 /dev/nvme0n1p2
</code></pre>
<h4 id="heading-5-obnovite-tablicu-montirovaniya-i-nastrojte-novyj-razdel">5. Обновите таблицу монтирования и настройте новый раздел</h4>
<p>После создания новой файловой системы:</p>
<ul>
<li>Обновите <code>/etc/fstab</code> для автоматического монтирования нового раздела при загрузке. Выполните:</li>
</ul>
<pre><code class="lang-bash">sudo nano /etc/fstab
</code></pre>
<p>Убедитесь, что строка для <code>/dev/nvme0n1p2</code> указывает на <code>/</code> и содержит корректные параметры для ext4.</p>
<h4 id="heading-6-perezagruzite-sistemu-i-proverte-rezultat">6. Перезагрузите систему и проверьте результат</h4>
<p>Перезагрузите компьютер, чтобы применить изменения:</p>
<pre><code class="lang-bash">sudo reboot
</code></pre>
<p>После перезагрузки проверьте, что новый раздел доступен и монтирован:</p>
<pre><code class="lang-bash">df -h
</code></pre>
<p>Эти действия позволят использовать всё пространство SSD на 4TB с минимальными изменениями текущей структуры.</p>
<h2 id="heading-mk-3">MK:</h2>
<p>перед пунктом 3 спрашивает следующее:</p>
<pre><code>Created a <span class="hljs-keyword">new</span> partition <span class="hljs-number">2</span> <span class="hljs-keyword">of</span> type <span class="hljs-string">'Linux'</span> and <span class="hljs-keyword">of</span> size <span class="hljs-number">2</span> TiB.
Partition #<span class="hljs-number">2</span> contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o:
</code></pre><h2 id="heading-chatgpt-3">ChatGPT:</h2>
<p>На этом этапе <strong>На этом этапе выберите <code>[Y]es</code></strong> , чтобы удалить существующую сигнатуру ext4. Поскольку мы создаём новый раздел, это удаление сигнатуры поможет избежать конфликтов при создании новой файловой системы в следующем шаге.Удаление сигнатуры не повлияет на загрузочный раздел и позволит безопасно создать новый форматированный ext4-раздел, который займёт всё свободное пространство SSD. После выбора <code>[Y]</code> продолжайте со следующим пунктом, чтобы записать изменения.</p>
<h2 id="heading-mk-4">MK:</h2>
<pre><code>$ sudo mkfs.ext4 /dev/nvme0n1p2
mke2fs <span class="hljs-number">1.47</span><span class="hljs-number">.0</span> (<span class="hljs-number">5</span>-Feb<span class="hljs-number">-2023</span>)
/dev/nvme0n1p2 is mounted; will not make a filesystem here!
</code></pre><h2 id="heading-chatgpt-4">ChatGPT:</h2>
<p>Эта ошибка возникает, потому что раздел <code>/dev/nvme0n1p2</code> в данный момент смонтирован в корневую файловую систему (<code>/</code>). Чтобы создать новую файловую систему, необходимо сначала отмонтировать его. Однако, так как этот раздел используется как корневой, отмонтировать его в текущем сеансе невозможно.
Вместо этого потребуется загрузиться с внешнего носителя (например, USB-диск с образом системы Debian или Raspberry Pi OS), а затем выполнить следующие шаги:</p>
<h3 id="heading-shagi-dlya-sozdaniya-fajlovoj-sistemy-na-novom-razdele-zagruzhayas-s-vneshnego-nositelya">Шаги для создания файловой системы на новом разделе, загружаясь с внешнего носителя:</h3>
<ol>
<li><p><strong>Подготовьте загрузочный носитель</strong> :</p>
<ul>
<li>Создайте загрузочный USB с образом Debian или другой совместимой ОС.</li>
</ul>
</li>
<li><p><strong>Загрузитесь с USB</strong> :</p>
<ul>
<li>Подключите USB-диск к Raspberry Pi и загрузитесь с него.</li>
</ul>
</li>
<li><p><strong>Отмонтируйте старый корневой раздел</strong> : </p>
<ul>
<li>После загрузки с USB выполните команду, чтобы убедиться, что <code>/dev/nvme0n1p2</code> больше не смонтирован:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">lsblk
</code></pre>
<ol start="4">
<li><strong>Создайте файловую систему</strong> : <ul>
<li>Теперь, когда раздел <code>/dev/nvme0n1p2</code> не смонтирован, выполните команду для создания файловой системы:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo mkfs.ext4 /dev/nvme0n1p2
</code></pre>
<ol start="5">
<li><strong>Перезагрузите и вернитесь в основную систему</strong> :<ul>
<li>После завершения создания файловой системы перезагрузите Raspberry Pi, отключив USB-диск, и загрузитесь с SSD.</li>
</ul>
</li>
</ol>
<p>После выполнения этих шагов основной раздел на SSD будет форматирован, и система сможет использовать полный объём в 4TB.</p>
<h2 id="heading-mk-5">MK:</h2>
<p>В машину вставлена SD карта на которой находится загрузочная операционная система. Но для этого надо поменять настройку порядка загрузки операционной системы. Знаешь как это сделать?</p>
<h2 id="heading-chatgpt-5">ChatGPT:</h2>
<p>Да, на Raspberry Pi порядок загрузки можно изменить, чтобы система загружалась с SD-карты вместо SSD. Вот как это сделать:</p>
<ol>
<li><p><strong>Загрузитесь в текущую систему</strong>  (например, с SSD) и проверьте, что SD-карта правильно вставлена.</p>
</li>
<li><p><strong>Измените настройки конфигурации EEPROM</strong>  (загрузчика): </p>
<ul>
<li>Выполните команду, чтобы открыть конфигурацию EEPROM:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo raspi-config
</code></pre>
<ul>
<li><p>Перейдите к пункту <strong>"Advanced Options"</strong>  &gt; <strong>"Boot Order"</strong>  или <strong>"Boot ROM Version"</strong> .</p>
</li>
<li><p>Установите загрузку с SD-карты в первую очередь, выбрав <strong>"SD Card Boot"</strong>  или аналогичное значение.</p>
</li>
</ul>
<ol start="3">
<li><strong>Перезагрузите устройство</strong> : <ul>
<li>После изменения настроек, сохраните изменения и перезагрузите Raspberry Pi:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo reboot
</code></pre>
<p>Теперь Raspberry Pi должен загружаться с SD-карты, если она вставлена, что позволит выполнить любые операции с SSD, такие как создание новой файловой системы на разделе.</p>
<h2 id="heading-mk-6">MK:</h2>
<p>перезагрузился с SD карты и вот что вижу:</p>
<pre><code>$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
mmcblk0     <span class="hljs-number">179</span>:<span class="hljs-number">0</span>    <span class="hljs-number">0</span> <span class="hljs-number">119.1</span>G  <span class="hljs-number">0</span> disk
├─mmcblk0p1 <span class="hljs-number">179</span>:<span class="hljs-number">1</span>    <span class="hljs-number">0</span>   <span class="hljs-number">512</span>M  <span class="hljs-number">0</span> part /boot/firmware
└─mmcblk0p2 <span class="hljs-number">179</span>:<span class="hljs-number">2</span>    <span class="hljs-number">0</span> <span class="hljs-number">118.6</span>G  <span class="hljs-number">0</span> part /
nvme0n1     <span class="hljs-number">259</span>:<span class="hljs-number">0</span>    <span class="hljs-number">0</span>   <span class="hljs-number">3.7</span>T  <span class="hljs-number">0</span> disk
├─nvme0n1p1 <span class="hljs-number">259</span>:<span class="hljs-number">1</span>    <span class="hljs-number">0</span>   <span class="hljs-number">512</span>M  <span class="hljs-number">0</span> part
└─nvme0n1p2 <span class="hljs-number">259</span>:<span class="hljs-number">2</span>    <span class="hljs-number">0</span>     <span class="hljs-number">2</span>T  <span class="hljs-number">0</span> part
</code></pre><h2 id="heading-chatgpt-6">ChatGPT:</h2>
<p>Теперь, когда система запущена с SD-карты, разделы на SSD не смонтированы и можно создать новую файловую систему на разделе <code>/dev/nvme0n1p2</code>. Чтобы переразбить SSD, выполните следующие шаги:</p>
<h3 id="heading-shagi-dlya-formatirovaniya-i-rasshireniya-razdela-na-ssd-do-polnogo-obuyoma-4tb">Шаги для форматирования и расширения раздела на SSD до полного объёма 4TB</h3>
<ol>
<li><strong>Удалите существующий раздел <code>/dev/nvme0n1p2</code></strong> : <ul>
<li>Запустите <code>fdisk</code> для SSD:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo fdisk /dev/nvme0n1
</code></pre>
<ul>
<li>Нажмите <code>d</code> и выберите номер раздела <code>2</code> для удаления текущего раздела на 2TB.</li>
</ul>
<ol start="2">
<li><p><strong>Создайте новый раздел на полный объём</strong> : </p>
<ul>
<li><p>В <code>fdisk</code> нажмите <code>n</code> для создания нового раздела и выберите <code>p</code> (primary), а затем укажите его номер как <code>2</code> (так же как удалённый).</p>
</li>
<li><p>Когда <code>fdisk</code> запросит начальный сектор, просто нажмите <code>Enter</code> для использования значения по умолчанию.</p>
</li>
<li><p>Для конечного сектора также нажмите <code>Enter</code>, чтобы создать раздел на всё доступное место, увеличив его до полного объёма в 4TB.</p>
</li>
</ul>
</li>
<li><p><strong>Запишите изменения и выйдите</strong> : </p>
<ul>
<li>Нажмите <code>w</code>, чтобы записать изменения на диск и выйти из <code>fdisk</code>.</li>
</ul>
</li>
<li><p><strong>Создайте файловую систему на новом разделе</strong> : </p>
<ul>
<li>Теперь создайте файловую систему ext4 на новом разделе:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo mkfs.ext4 /dev/nvme0n1p2
</code></pre>
<ol start="5">
<li><strong>Перемонтируйте раздел и проверьте размер</strong> :<ul>
<li>После создания файловой системы можно смонтировать новый раздел и проверить, что его размер теперь составляет 4TB.</li>
</ul>
</li>
</ol>
<p>После этих шагов Raspberry Pi будет иметь доступ к полному объёму SSD, и вы сможете настроить использование свободного места для файлов веб-сервера, медиа и торрентов.</p>
<h2 id="heading-mk-7">MK:</h2>
<p>в прошлый раз ты предлагал использовать 1056768 в качестве начального сектора чтобы не удалить загрузочную область</p>
<h2 id="heading-chatgpt-7">ChatGPT:</h2>
<p>Вы правы, начальный сектор для нового раздела нужно установить вручную, чтобы сохранить загрузочный раздел. В этом случае, при создании нового раздела, в качестве начального сектора следует указать <strong>1056768</strong> . Это значение соответствует началу прежнего второго раздела и обеспечит, что загрузочный раздел <code>/dev/nvme0n1p1</code> останется нетронутым.</p>
<h3 id="heading-obnovlyonnye-shagi-dlya-formatirovaniya-i-rasshireniya-vtorogo-razdela-do-polnogo-obuyoma-4tb">Обновлённые шаги для форматирования и расширения второго раздела до полного объёма 4TB</h3>
<ol>
<li><strong>Удалите существующий второй раздел</strong> : <ul>
<li>Запустите <code>fdisk</code> для SSD:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo fdisk /dev/nvme0n1
</code></pre>
<ul>
<li>Нажмите <code>d</code>, затем выберите раздел <code>2</code>, чтобы удалить его.</li>
</ul>
<ol start="2">
<li><p><strong>Создайте новый второй раздел, начиная с сектора 1056768</strong> : </p>
<ul>
<li><p>Нажмите <code>n</code> для создания нового раздела и выберите <code>p</code> (primary), затем введите номер <code>2</code>.</p>
</li>
<li><p>Когда <code>fdisk</code> запросит начальный сектор, введите <code>1056768</code>.</p>
</li>
<li><p>Для конечного сектора нажмите <code>Enter</code>, чтобы использовать всё доступное место до конца диска, создав раздел на весь оставшийся объём (примерно 3.7TB).</p>
</li>
</ul>
</li>
<li><p><strong>Запишите изменения и выйдите</strong> : </p>
<ul>
<li>Нажмите <code>w</code>, чтобы записать изменения и выйти из <code>fdisk</code>.</li>
</ul>
</li>
<li><p><strong>Создайте файловую систему на новом разделе</strong> : </p>
<ul>
<li>Теперь создайте файловую систему ext4 на новом, расширенном разделе:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo mkfs.ext4 /dev/nvme0n1p2
</code></pre>
<p>После этих действий второй раздел будет расширен до полного объёма SSD, а загрузочный раздел сохранит своё текущее состояние.</p>
<h2 id="heading-mk-8">MK:</h2>
<pre><code>$ sudo mkfs.ext4 /dev/nvme0n1p2
mke2fs <span class="hljs-number">1.47</span><span class="hljs-number">.0</span> (<span class="hljs-number">5</span>-Feb<span class="hljs-number">-2023</span>)
Discarding device blocks: done
Creating filesystem <span class="hljs-keyword">with</span> <span class="hljs-number">536738816</span> <span class="hljs-number">4</span>k blocks and <span class="hljs-number">134184960</span> inodes
Filesystem UUID: dac5c91f-e294<span class="hljs-number">-43</span>b1<span class="hljs-number">-962</span>c<span class="hljs-number">-939</span>c337306f8
Superblock backups stored on blocks:
        <span class="hljs-number">32768</span>, <span class="hljs-number">98304</span>, <span class="hljs-number">163840</span>, <span class="hljs-number">229376</span>, <span class="hljs-number">294912</span>, <span class="hljs-number">819200</span>, <span class="hljs-number">884736</span>, <span class="hljs-number">1605632</span>, <span class="hljs-number">2654208</span>,
        <span class="hljs-number">4096000</span>, <span class="hljs-number">7962624</span>, <span class="hljs-number">11239424</span>, <span class="hljs-number">20480000</span>, <span class="hljs-number">23887872</span>, <span class="hljs-number">71663616</span>, <span class="hljs-number">78675968</span>,
        <span class="hljs-number">102400000</span>, <span class="hljs-number">214990848</span>, <span class="hljs-number">512000000</span>

Allocating group tables: done
Writing inode tables: done
Creating journal (<span class="hljs-number">262144</span> blocks): done
Writing superblocks and filesystem accounting information: done
</code></pre><h2 id="heading-chatgpt-8">ChatGPT:</h2>
<p>Файловая система успешно создана на новом разделе <code>/dev/nvme0n1p2</code> и теперь занимает весь доступный объём.</p>
<h3 id="heading-zaklyuchitelnye-shagi">Заключительные шаги</h3>
<ol>
<li><strong>Создайте точку монтирования и примонтируйте новый раздел</strong> : <ul>
<li>Создайте директорию, если она ещё не существует:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo mkdir -p /mnt/data
</code></pre>
<ul>
<li>Примонтируйте раздел:</li>
</ul>
<pre><code class="lang-bash">sudo mount /dev/nvme0n1p2 /mnt/data
</code></pre>
<ol start="2">
<li><strong>Проверьте доступный объём</strong> : <ul>
<li>Убедитесь, что новый раздел смонтирован и объём отображается правильно:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">df -h /mnt/data
</code></pre>
<ol start="3">
<li><strong>Добавьте запись в <code>/etc/fstab</code> для автоматического монтирования</strong> : <ul>
<li>Получите UUID нового раздела:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo blkid /dev/nvme0n1p2
</code></pre>
<ul>
<li>Отредактируйте файл <code>/etc/fstab</code>:</li>
</ul>
<pre><code class="lang-bash">sudo nano /etc/fstab
</code></pre>
<ul>
<li>Добавьте строку для автоматического монтирования при запуске:</li>
</ul>
<pre><code class="lang-bash">UUID=dac5c91f-e294-43b1-962c-939c337306f8 /mnt/data ext4 defaults 0 2
</code></pre>
<ol start="4">
<li><strong>Проверьте монтирование</strong> : <ul>
<li>Выполните команду:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo mount -a
</code></pre>
<ul>
<li>Убедитесь, что раздел монтируется без ошибок.</li>
</ul>
<p>Теперь пространство на SSD полностью доступно для размещения данных.</p>
<h2 id="heading-mk-9">MK:</h2>
<p>мне не надо сначала перезагрузится с SSD диска прежде чем выполнять эти шаги? Потому что мне кажется мы применим их к операционной системе загруженной с SD карточки. Возможно сейчас надо поменять порядок загрузки и загрузиться с SSD и потом продолжить с монтированием?</p>
<h2 id="heading-chatgpt-9">ChatGPT:</h2>
<p>Да, вы абсолютно правы! Чтобы применить эти действия к операционной системе на SSD, следует сначала перезагрузиться, изменив приоритет загрузки обратно на SSD, а затем выполнить шаги по монтированию.</p>
<h3 id="heading-poryadok-dejstvij">Порядок действий:</h3>
<ol>
<li><p><strong>Измените порядок загрузки</strong> , чтобы система загрузилась с SSD (как вы делали ранее).</p>
</li>
<li><p><strong>Перезагрузитесь</strong>  с SSD.</p>
</li>
<li><p>Подключившись к системе после перезагрузки с SSD, выполните шаги по монтированию:</p>
<ul>
<li>Создайте точку монтирования:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo mkdir -p /mnt/data
</code></pre>
<ul>
<li>Примонтируйте новый раздел и проверьте доступность:</li>
</ul>
<pre><code class="lang-bash">sudo mount /dev/nvme0n1p2 /mnt/data
df -h /mnt/data
</code></pre>
<ul>
<li>Настройте автоматическое монтирование в <code>/etc/fstab</code>.</li>
</ul>
<p>Теперь система будет работать на SSD и корректно использовать новый раздел.</p>
<h2 id="heading-mk-10">MK:</h2>
<pre><code>Current EEPROM version <span class="hljs-number">2024</span><span class="hljs-number">-09</span><span class="hljs-number">-23</span> or newer not found - aborting.   │
                                       │                                                                    │
                                       │ Try updating the rpi-eeprom APT package.
</code></pre><h2 id="heading-chatgpt-10">ChatGPT:</h2>
<p>Сообщение об ошибке указывает на то, что версия EEPROM на вашем Raspberry Pi устарела. Вам необходимо обновить его, чтобы продолжить загрузку с SSD.</p>
<h3 id="heading-shagi-dlya-obnovleniya-eeprom">Шаги для обновления EEPROM:</h3>
<ol>
<li><p><strong>Убедитесь, что ваша система подключена к интернету</strong> .</p>
</li>
<li><p><strong>Обновите список пакетов и установите обновление</strong> :</p>
</li>
</ol>
<pre><code class="lang-bash">sudo apt update
sudo apt upgrade rpi-eeprom
</code></pre>
<ol start="3">
<li><strong>Обновите EEPROM</strong> :</li>
</ol>
<pre><code class="lang-bash">sudo rpi-eeprom-update -d -f
</code></pre>
<ol start="4">
<li><strong>Перезагрузите Raspberry Pi</strong> :</li>
</ol>
<pre><code class="lang-bash">sudo reboot
</code></pre>
<h3 id="heading-posle-perezagruzki">После перезагрузки</h3>
<ol>
<li><p><strong>Затем попробуйте снова загрузиться с SSD</strong> . Если вы правильно настроили порядок загрузки, система должна загрузиться с нового SSD-диска.</p>
</li>
<li><p><strong>После успешной загрузки</strong>  повторите шаги по монтированию нового раздела, как было описано ранее.</p>
</li>
</ol>
<p>Если возникнут проблемы, сообщите мне, и я помогу вам их решить!</p>
<h2 id="heading-mk-11">MK:</h2>
<pre><code>$ sudo rpi-eeprom-update -d -f
No arg <span class="hljs-keyword">for</span> -f option
Unknown argument <span class="hljs-string">"?"</span>
rpi-eeprom-update [options]... [FILE]

Bootloader EEPROM update tool <span class="hljs-keyword">for</span> the Raspberry Pi <span class="hljs-number">4</span> and Raspberry Pi <span class="hljs-number">5.</span>

This script also updates the SPI EEPROM image <span class="hljs-keyword">for</span> the VL805 USB HC
firmware on early Pi4B boards where the USB firmware is stored <span class="hljs-keyword">in</span>
a dedicated SPI EEPROM instead <span class="hljs-keyword">of</span> embedding it <span class="hljs-keyword">in</span> the bootloader
EEPROM. Raspberry Pi <span class="hljs-number">5</span> uses the RP1.

The <span class="hljs-keyword">default</span> update mechanism writes recovery.bin and the EEPROM update
image(s) (pieeprom.upd and vl805.bin (<span class="hljs-keyword">if</span> required)) to the boot partition.
The SHA256 hash <span class="hljs-keyword">of</span> the corresponding images are written to pieeprom.sig
and/or vl805.sig. This guards against file system corruption which could
cause the EEPROM to be flashed <span class="hljs-keyword">with</span> an invalid image. This is not a
security check.

At the next reboot the ROM runs recovery.bin which updates EEPROM(s).
If the update was successful recovery.bin renames itself to recovery<span class="hljs-number">.000</span>
to prevent it <span class="hljs-keyword">from</span> running a second time then resets the system.
The system should then boot normally.

If /boot does not correspond to the boot partition and <span class="hljs-built_in">this</span>
is not a NOOBS system, then the mount point <span class="hljs-keyword">for</span> BOOTFS should be defined
<span class="hljs-keyword">in</span> /etc/<span class="hljs-keyword">default</span>/rpi-eeprom-update by defining the BOOTFS variable.

A backup <span class="hljs-keyword">of</span> the current EEPROM config file is written to /<span class="hljs-keyword">var</span>/lib/raspberrypi/bootloader/backup
before applying the update.

Unless the -d flag is specified, the current bootloader configuration is
retained.

Options:
   -a Automatically install bootloader and USB (VLI) EEPROM updates.
   -A Specify which type <span class="hljs-keyword">of</span> EEPROM to automatically update (vl805 or bootloader)
   -b Outputs the path that pending EEPROM updates will be written to.
   -d Use the <span class="hljs-keyword">default</span> bootloader config, or <span class="hljs-keyword">if</span> a file is specified using the -f
      flag use the config <span class="hljs-keyword">in</span> that file. This option only applies when a
      bootloader EEPROM update is needed; <span class="hljs-keyword">if</span> the bootloader EEPROM is up to date
      then its config will not be changed.
   -f Install the given file instead <span class="hljs-keyword">of</span> the latest applicable update
      Ignores the FREEZE_VERSION flag <span class="hljs-keyword">in</span> bootloader and is intended <span class="hljs-keyword">for</span> manual
      firmware updates.
   -h Display help text and exit
   -j Write status information using <span class="hljs-built_in">JSON</span> notation (requires -m option)
   -l Returns the full path to the latest available EEPROM image file according
      to the FIRMWARE_RELEASE_STATUS and FIRMWARE_IMAGE_DIR settings.
   -m Write status information to the given file when run without -a or -f
   -r Removes temporary EEPROM update files <span class="hljs-keyword">from</span> the boot partition. This also
      cancels a pending update.
   -s Skips silent, automatic upgrades <span class="hljs-keyword">for</span> <span class="hljs-keyword">default</span> releases <span class="hljs-keyword">if</span> the current
      bootloader release is newer than the version specified by
      BOOTLOADER_AUTO_UPDATE_MIN_VERSION
   -u Install the specified VL805 (USB EEPROM) image file.

Environment:
Environment variables should be defined <span class="hljs-keyword">in</span> /etc/<span class="hljs-keyword">default</span>/rpi-eeprom-update

EEPROM_CONFIG_HOOK

Specifies the path <span class="hljs-keyword">of</span> an optional script which post-processes the
configuration file before it is applied to the <span class="hljs-keyword">new</span> image. The modified
output must contain at least <span class="hljs-number">3</span> lines and should contain WAKE_ON_GPIO
and POWER_OFF_ON_HALT settings.

FIRMWARE_RELEASE_STATUS

Specifies the release status <span class="hljs-keyword">of</span> the firmware to apply.

Before selecting a firmware release directory <span class="hljs-built_in">this</span> script checks whether there
is a board revision specific variant e.g. default-c03111. If present then the
board-revision specific version is used <span class="hljs-keyword">in</span> preference.

Release status:
Bootloader releases follow a pipeline where images are released to the <span class="hljs-string">'latest'</span>
directory first. The binaries are then promoted to <span class="hljs-string">'default'</span> once <span class="hljs-built_in">this</span>
becomes the recommended minimum version and has been proven over time
to be stable.

default:
The <span class="hljs-keyword">default</span> bootloader image which supports all current models and hardware
revisions. If there is an important bug fix or hardware change that could
affect most users then the BOOTLOADER_AUTO_UPDATE_MIN_VERSION is updated
causing the update to be applied the next time the rpi-eeprom APT package is
updated.

latest:
Contains <span class="hljs-keyword">new</span> features, bug fixes and performance improvements.

As far <span class="hljs-keyword">as</span> rpi-eeprom-update is concerned FIRMWARE_RELEASE_STATUS is just
the subdirectory mapping under /lib/firmware/raspberrypi/bootloader. Therefore, custom release
directories are supported by creating the relevant directory and changing
the FIRMWARE_RELEASE_STATUS environment variable.

The <span class="hljs-string">'default'</span> and <span class="hljs-string">'latest'</span> release names are symlinks to the old directory
names <span class="hljs-keyword">of</span> <span class="hljs-string">'critical'</span> / <span class="hljs-string">'stable'</span>.

Examples:
To extract the configuration file <span class="hljs-keyword">from</span> an EEPROM image:
   rpi-eeprom-config pieeprom.bin --out bootconf.txt

To update the configuration file <span class="hljs-keyword">in</span> an EEPROM image:
   rpi-eeprom-config pieeprom.bin --config bootconf.txt --out pieeprom-<span class="hljs-keyword">new</span>.bin

To flash the <span class="hljs-keyword">new</span> image:
   sudo rpi-eeprom-update -d -f ./pieeprom-<span class="hljs-keyword">new</span>.bin

The syntax is the same <span class="hljs-keyword">as</span> config.txt See online documentation <span class="hljs-keyword">for</span> the list <span class="hljs-keyword">of</span> parameters.

The official documentation <span class="hljs-keyword">for</span> the Raspberry Pi bootloader EEPROM is available at
   <span class="hljs-attr">https</span>:<span class="hljs-comment">//www.raspberrypi.com/documentation/computers/raspberry-pi.html#raspberry-pi-4-boot-eeprom</span>

Compute Module <span class="hljs-number">4</span> (CM4):

CM4 is designed to support embedded applications where physical access to the CM4
may be limited.  An invalid bootloader configuration or software bug could
cause the system to fail to boot so automatic updates are disabled. We also
recommend write-protecting the SPI EPPROM after flashing it using usbboot.

CM4 bootloader and EEPROM update instructions:
   https:<span class="hljs-comment">//www.raspberrypi.com/documentation/computers/compute-module.html#cm4bootloader</span>

The CM4 ROM does not support running recovery.bin <span class="hljs-keyword">from</span> the EMMC on CM4 so <span class="hljs-built_in">this</span> service
is disabled by <span class="hljs-keyword">default</span>. SELF_UPDATE <span class="hljs-keyword">from</span> USB or Network boot is supported but <span class="hljs-built_in">this</span>
must first be enabled by removing ENABLE_SELF_UPDATE=<span class="hljs-number">0</span> <span class="hljs-keyword">from</span> the EEPROM config
via usbboot.

After enabling self-update set the CM4_ENABLE_RPI_EEPROM_UPDATE=<span class="hljs-number">1</span> environment
variable or define it <span class="hljs-keyword">in</span> /etc/<span class="hljs-keyword">default</span>/rpi-eeprom-update.

N.B. If there is a power failure during SELF_UPDATE the EEPROM write may fail and
usbboot must be used to flash the bootloader EEPROM. SELF_UPDATE is not recommended
<span class="hljs-keyword">for</span> updating the bootloader on remote systems.

FLASHROM:

If the RPI_EEPROM_USE_FLASHROM variable is set to <span class="hljs-number">1</span> then flashrom is used to perform
an immediate update to the SPI flash rather than installing the recovery.bin plus
pieeprom.upd files. The power must not be disconnected during <span class="hljs-built_in">this</span> update otherwise the
EEPROM will need to be re-flashed using the Rasberry Pi Imager bootloader restore feature.

On Raspberry Pi <span class="hljs-number">4</span>, CM4, CM4-S and Pi400 flashrom updates are not enabled by <span class="hljs-keyword">default</span>
because the SPI GPIOs are shared <span class="hljs-keyword">with</span> analog audio. To enable <span class="hljs-built_in">this</span> add the following
entries to config.txt. This moves analog audio to GPIO pins <span class="hljs-number">12</span>,<span class="hljs-number">13</span> and may not be
compatible <span class="hljs-keyword">with</span> some HATS / CM4 IO boards.

dtparam=spi=on
dtoverlay=audremap
dtoverlay=spi-gpio40<span class="hljs-number">-45</span>

xen@pi:~ $
</code></pre><h2 id="heading-chatgpt-11">ChatGPT:</h2>
<p>Извините за путаницу с опциями. Давайте попробуем обновить EEPROM правильным образом.</p>
<h3 id="heading-obnovlenie-eeprom-na-raspberry-pi">Обновление EEPROM на Raspberry Pi</h3>
<ol>
<li><strong>Запустите обновление EEPROM</strong> :
Используйте команду без флага <code>-f</code>:</li>
</ol>
<pre><code class="lang-bash">sudo rpi-eeprom-update -d
</code></pre>
<ol start="2">
<li><strong>Обновление конфигурации</strong> :
Если это не обновляет, вам может понадобиться вручную обновить конфигурацию. Попробуйте запустить:</li>
</ol>
<pre><code class="lang-bash">sudo rpi-eeprom-update -a
</code></pre>
<p>Это установит обновления автоматически.</p>
<ol start="3">
<li><strong>Перезагрузка</strong> :
После выполнения команд обновления перезагрузите Raspberry Pi:</li>
</ol>
<pre><code class="lang-bash">sudo reboot
</code></pre>
<h3 id="heading-dopolnitelnye-shagi">Дополнительные шаги</h3>
<p>Если после этого вы по-прежнему видите сообщение об ошибке при загрузке, вы можете попробовать:</p>
<ol>
<li><strong>Проверить версию EEPROM</strong> :
После перезагрузки проверьте текущую версию EEPROM, чтобы убедиться, что обновление прошло успешно:</li>
</ol>
<pre><code class="lang-bash">vcgencmd bootloader_version
</code></pre>
<ol start="2">
<li><strong>Убедиться, что конфигурация EEPROM актуальна</strong> :
Если у вас есть конкретные требования к конфигурации, проверьте и обновите <code>/etc/default/rpi-eeprom-update</code>, чтобы убедиться, что там указаны правильные значения.</li>
</ol>
<p>Если у вас будут возникать трудности или появятся новые сообщения об ошибках, сообщите мне, и я помогу вам с их решением!</p>
<h2 id="heading-mk-12">MK:</h2>
<pre><code>$ sudo rpi-eeprom-update -d
<span class="hljs-attr">BOOTLOADER</span>: up to date
   <span class="hljs-attr">CURRENT</span>: Mon Sep <span class="hljs-number">23</span> <span class="hljs-number">13</span>:<span class="hljs-number">02</span>:<span class="hljs-number">56</span> UTC <span class="hljs-number">2024</span> (<span class="hljs-number">1727096576</span>)
    <span class="hljs-attr">LATEST</span>: Mon Sep <span class="hljs-number">23</span> <span class="hljs-number">13</span>:<span class="hljs-number">02</span>:<span class="hljs-number">56</span> UTC <span class="hljs-number">2024</span> (<span class="hljs-number">1727096576</span>)
   <span class="hljs-attr">RELEASE</span>: <span class="hljs-keyword">default</span> (<span class="hljs-regexp">/lib/</span>firmware/raspberrypi/bootloader<span class="hljs-number">-2712</span>/<span class="hljs-keyword">default</span>)
            Use raspi-config to change the release.
</code></pre><h2 id="heading-chatgpt-12">ChatGPT:</h2>
<p>Согласно вашему выводу, ваша версия загрузчика EEPROM обновлена и актуальна. Это означает, что проблема не в самой версии EEPROM.</p>
<h3 id="heading-dalnejshie-shagi">Дальнейшие шаги</h3>
<p>Теперь, когда вы убедились, что версия загрузчика актуальна, вы можете продолжить с настройкой порядка загрузки для загрузки с SSD. Вот как это сделать:</p>
<ol>
<li><strong>Измените порядок загрузки</strong> :
Чтобы изменить порядок загрузки, вам нужно использовать <code>raspi-config</code>. Запустите следующую команду:</li>
</ol>
<pre><code class="lang-bash">sudo raspi-config
</code></pre>
<ol start="2">
<li><p><strong>Выберите "Advanced Options"</strong> :
В меню выберите "Advanced Options" (Расширенные параметры).</p>
</li>
<li><p><strong>Настройка загрузки</strong> :
Затем выберите "Boot Order" (Порядок загрузки) и измените его так, чтобы он загружался с вашего SSD. Обычно это включает выбор опции загрузки с USB или SD карты, в зависимости от того, как ваш SSD подключен.</p>
</li>
<li><p><strong>Сохраните и выйдите</strong> :
После изменения порядка загрузки, сохраните настройки и выйдите из <code>raspi-config</code>.</p>
</li>
<li><p><strong>Перезагрузите</strong> :
Выполните команду для перезагрузки:</p>
</li>
</ol>
<pre><code class="lang-bash">sudo reboot
</code></pre>
<h3 id="heading-proverka-zagruzki">Проверка загрузки</h3>
<p>После перезагрузки проверьте, загрузился ли Raspberry Pi с SSD. Это можно сделать, снова запустив команду <code>lsblk</code>, чтобы увидеть, какой диск в данный момент используется для корневой файловой системы.
Если всё прошло успешно, вы должны увидеть, что ваша основная система загружается с SSD. Если возникают проблемы, дайте знать, и я помогу вам с их решением!</p>
<h2 id="heading-mk-13">MK:</h2>
<p>После загрузки вентилятор pi очень активно вращается. Обычно он пару секунд активно вращался и потом переставал</p>
<h2 id="heading-chatgpt-13">ChatGPT:</h2>
<p>Скорее всего, поведение вентилятора связано с активной нагрузкой на систему во время начальной настройки после загрузки с SSD или с изменёнными параметрами управления вентилятором. Проверьте, нет ли изменений в конфигурации, особенно в <code>config.txt</code> на SSD, поскольку могут быть добавлены или изменены параметры, такие как <code>dtoverlay</code> для управления температурой или скоростью вращения вентилятора.
Попробуйте также запустить команду для просмотра текущей температуры и нагрузки:</p>
<pre><code class="lang-bash">vcgencmd measure_temp
</code></pre>
<p>или отследите текущую активность на процессоре:</p>
<pre><code class="lang-bash">top
</code></pre>
<p>Если изменений не видно, но активность вентилятора продолжается, можно попробовать вернуть Pi к стандартной конфигурации вентиляторов или проверить настройки в <code>raspi-config</code> (если доступно управление температурой и вентилятором).</p>
<h2 id="heading-mk-14">MK:</h2>
<p>я не могу подключиться к pi по ssh, стоит ли мне ждать или компьютер надо отключать и перенастраивать заново?</p>
<h2 id="heading-chatgpt-14">ChatGPT:</h2>
<p>Если <strong>долгое вращение вентилятора и отсутствие доступа по SSH</strong>  продолжаются более пары минут, это может означать, что устройство зависло на загрузке или возникли проблемы с новым SSD.</p>
<h3 id="heading-rekomendacii">Рекомендации:</h3>
<ol>
<li><p><strong>Подождите ещё 2-3 минуты</strong> . Иногда, если система выполняет интенсивные операции (например, проверка диска), это может занимать дополнительное время, особенно после обновления загрузочной последовательности.</p>
</li>
<li><p>Если <strong>продолжение ожидания не помогает</strong> : </p>
<ul>
<li><p><strong>Отключите Pi от питания</strong> .</p>
</li>
<li><p>Убедитесь, что SD-карта установлена и попробуйте загрузиться с неё.</p>
</li>
<li><p><strong>Проверьте конфигурацию SSD</strong>  и повторите настройку загрузки, если понадобится.</p>
</li>
</ul>
</li>
</ol>
<p>После загрузки с SD-карты можно также проверить журнал загрузки SSD для диагностики, если проблема повторится.</p>
<h2 id="heading-mk-15">MK:</h2>
<p>как посмотреть журнали загрузки для ssd?</p>
<h2 id="heading-chatgpt-15">ChatGPT:</h2>
<p>Для просмотра журналов загрузки с SSD на Raspberry Pi можно воспользоваться следующими шагами:</p>
<ol>
<li><p><strong>Загрузитесь с SD-карты</strong> , как вы уже делали.</p>
</li>
<li><p><strong>Подключите SSD к системе</strong>  (если он отключён), и убедитесь, что он распознаётся.</p>
</li>
<li><p><strong>Проверьте наличие системных журналов на SSD</strong> . Предполагая, что SSD смонтирован, например, в <code>/mnt</code>, журналы обычно находятся в директории <code>/mnt/var/log</code>.</p>
</li>
<li><p>Откройте журналы загрузки:</p>
<ul>
<li>Для последних сообщений загрузки используйте:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo cat /mnt/var/<span class="hljs-built_in">log</span>/syslog | grep <span class="hljs-string">"boot"</span>
</code></pre>
<ul>
<li>Для системных ошибок, которые могли возникнуть при загрузке:</li>
</ul>
<pre><code class="lang-bash">sudo cat /mnt/var/<span class="hljs-built_in">log</span>/kern.log
</code></pre>
<ul>
<li>В некоторых системах есть файл <code>boot.log</code>, который может также содержать информацию о загрузке:</li>
</ul>
<pre><code class="lang-bash">sudo cat /mnt/var/<span class="hljs-built_in">log</span>/boot.log
</code></pre>
<ol start="5">
<li><strong>Проанализируйте содержимое журналов</strong>  на предмет ошибок, связанных с SSD, файловой системой или устройством <code>/dev/nvme0n1</code>.</li>
</ol>
<blockquote>
<p>Если в логах видны ошибки, связанные с файловой системой (например, <code>EXT4-fs error</code>), может потребоваться проверка целостности файловой системы на SSD с помощью <code>fsck</code>.</p>
</blockquote>
<h2 id="heading-mk-16">MK:</h2>
<p>Перезапустился с SD карточки, выполнил эти команды</p>
<pre><code>sudo mkdir -p /mnt/data
sudo mount /dev/nvme0n1p2 /mnt/data
df -h /mnt/data
</code></pre><p>мне выводит размер 2.0T</p>
<h2 id="heading-chatgpt-16">ChatGPT:</h2>
<p>Отлично! Размер 2.0T подтверждает, что раздел SSD был успешно создан и отформатирован, и теперь доступен для работы в точке монтирования <code>/mnt/data</code>.Если у вас больше нет ошибок и доступ к данным работает корректно, то можно продолжать настройку под ваши задачи на этом разделе SSD. Например, если потребуется, вы можете настроить автоподключение SSD при каждом запуске, добавив его в файл <code>/etc/fstab</code>.</p>
<h2 id="heading-mk-17">MK:</h2>
<p>Это не корректный размер, он должен быть больше</p>
<h2 id="heading-chatgpt-17">ChatGPT:</h2>
<p>Понял! Если общий размер SSD составляет 4TB, то монтирование лишь 2TB указывает на ограничение размера раздела или на некорректное создание второго раздела. Давайте проверим, как система видит разделы, а затем исправим это.</p>
<h3 id="heading-shagi-dlya-proverki-i-ispravleniya-razmera">Шаги для проверки и исправления размера:</h3>
<ol>
<li><strong>Проверьте разделы на диске</strong> :</li>
</ol>
<pre><code class="lang-bash">sudo fdisk -l /dev/nvme0n1
</code></pre>
<p>Убедитесь, что раздел <code>nvme0n1p2</code> действительно занимает 2TB. Если раздел ограничен, он потребует переразметки.</p>
<ol start="2">
<li><strong>Изменение размера раздела</strong> :
Если второй раздел отображается в 2TB, то выполните переразметку, чтобы он использовал оставшиеся 2TB.</li>
</ol>
<h3 id="heading-shagi-dlya-pererazmetki-esli-trebuetsya">Шаги для переразметки (если требуется):</h3>
<ol>
<li><strong>Запустите <code>fdisk</code> для редактирования</strong> :</li>
</ol>
<pre><code class="lang-bash">sudo fdisk /dev/nvme0n1
</code></pre>
<ol start="2">
<li><p><strong>Удалите существующий второй раздел и создайте новый</strong> : </p>
<ul>
<li><p>Нажмите <code>d</code> и выберите второй раздел (<code>nvme0n1p2</code>).</p>
</li>
<li><p>Нажмите <code>n</code>, чтобы создать новый раздел, и выберите <code>2</code>.</p>
</li>
<li><p>Для начального сектора укажите 1056768, а для конечного просто нажмите Enter, чтобы выбрать весь оставшийся объем.</p>
</li>
<li><p>Сохраните изменения, нажав <code>w</code>.</p>
</li>
</ul>
</li>
<li><p><strong>Пересоздайте файловую систему и перезагрузитесь с SD-карты</strong> :</p>
</li>
</ol>
<pre><code class="lang-bash">sudo mkfs.ext4 /dev/nvme0n1p2
sudo mount /dev/nvme0n1p2 /mnt/data
df -h /mnt/data
</code></pre>
<p>Проверьте, отображается ли теперь полный объем в 4TB.</p>
<h2 id="heading-mk-18">MK:</h2>
<p>как отмаунтить раздел?</p>
<h2 id="heading-chatgpt-18">ChatGPT:</h2>
<p>Чтобы отмонтировать раздел, используйте команду <code>umount</code>, указав путь, по которому он смонтирован. В вашем случае это:</p>
<pre><code class="lang-bash">sudo umount /mnt/data
</code></pre>
<p>Эта команда освободит раздел <code>/dev/nvme0n1p2</code> от точки монтирования <code>/mnt/data</code>, и вы сможете безопасно провести дальнейшие операции с разделом.</p>
<h2 id="heading-mk-19">MK:</h2>
<p>я выполнил </p>
<pre><code>sudo mkfs.ext4 /dev/nvme0n1p2
sudo mount /dev/nvme0n1p2 /mnt/data
df -h /mnt/data
</code></pre><p>и все равно размер 2.0T</p>
<h2 id="heading-chatgpt-19">ChatGPT:</h2>
<p>Похоже, что раздел был создан на 2 TB, хотя устройство имеет больший объем. Чтобы изменить это, можно пересоздать раздел с использованием всего доступного пространства на SSD. Следуйте этим шагам:</p>
<ol>
<li><strong>Отмонтируйте раздел:</strong> </li>
</ol>
<pre><code class="lang-bash">sudo umount /mnt/data
</code></pre>
<ol start="2">
<li><strong>Удалите и пересоздайте раздел:</strong> 
Снова используйте <code>fdisk</code>, чтобы удалить старый раздел и создать новый:</li>
</ol>
<pre><code class="lang-bash">sudo fdisk /dev/nvme0n1
</code></pre>
<p>Затем:</p>
<ul>
<li><p>В <code>fdisk</code> выберите <strong>d</strong>  для удаления существующего второго раздела (проверьте, что удаляете именно <code>nvme0n1p2</code>).</p>
</li>
<li><p>Выберите <strong>n</strong>  для создания нового раздела, и на вопрос о размерах выберите все доступное пространство (оставьте значения по умолчанию для первого и последнего сектора).</p>
</li>
<li><p>Убедитесь, что новый раздел занимает весь диск.</p>
</li>
</ul>
<ol start="3">
<li><strong>Форматируйте раздел:</strong> 
После создания нового раздела отформатируйте его как <code>ext4</code>:</li>
</ol>
<pre><code class="lang-bash">sudo mkfs.ext4 /dev/nvme0n1p2
</code></pre>
<ol start="4">
<li><strong>Смонтируйте раздел и проверьте размер:</strong> </li>
</ol>
<pre><code class="lang-bash">sudo mount /dev/nvme0n1p2 /mnt/data
df -h /mnt/data
</code></pre>
<p>Теперь <code>df -h</code> должен показывать полный доступный объем.</p>
<h2 id="heading-mk-20">MK:</h2>
<p>может ли быть что ext4 бывают размером только 2 тб?</p>
<h2 id="heading-chatgpt-20">ChatGPT:</h2>
<p>С файловой системой <code>ext4</code> это не проблема — она поддерживает объемы до 1 эксабайта (EB), и ограничения на раздел 2 TB тут быть не должно. Скорее всего, возникла проблема при создании или конфигурации раздела.
Некоторые возможные причины:</p>
<ol>
<li><p><strong>Таблица разделов MBR:</strong>  Если диск отформатирован с помощью таблицы разделов MBR, максимальный размер раздела будет ограничен 2 TB. Для использования всего объема SSD нужно убедиться, что диск использует таблицу разделов GPT, а не MBR.</p>
</li>
<li><p><strong>Неправильные настройки при создании раздела:</strong>  Если вы указали начальный и конечный секторы раздела вручную, это могло ограничить его размер.</p>
</li>
</ol>
<p>Чтобы проверить и исправить это:</p>
<ol>
<li><strong>Проверьте тип таблицы разделов:</strong> 
Выполните команду:</li>
</ol>
<pre><code class="lang-bash">sudo parted /dev/nvme0n1 <span class="hljs-built_in">print</span>
</code></pre>
<p>Если вывод указывает на <code>msdos</code>, значит диск использует таблицу разделов MBR. Если <code>gpt</code>, таблица разделов поддерживает более 2 TB.</p>
<ol start="2">
<li><strong>Переключение на GPT:</strong>  Если сейчас таблица MBR, необходимо переключиться на GPT, чтобы использовать весь объем SSD. Это можно сделать с помощью <code>parted</code>:</li>
</ol>
<pre><code class="lang-bash">sudo parted /dev/nvme0n1
(parted) mklabel gpt
</code></pre>
<blockquote>
<p>⚠️ <strong>Важно</strong> : Эта команда сотрет все данные на диске. Убедитесь, что никаких данных на этом SSD, которые нужно сохранить, нет.</p>
</blockquote>
<ol start="3">
<li>После смены таблицы разделов повторите шаги для создания и форматирования нового раздела на весь объем диска.</li>
</ol>
<h2 id="heading-mk-21">MK:</h2>
<p>мне выдало сообщение we have been unable to inform the kernel of the change, probably because it/they are in use. ... you should reboot now before making further chages</p>
<h2 id="heading-chatgpt-21">ChatGPT:</h2>
<p>Сообщение указывает на то, что изменения в таблице разделов не были приняты ядром, вероятно, из-за того, что диск или его разделы используются. В таких случаях перезагрузка действительно помогает, так как обновляет таблицу разделов и завершает процессы, удерживающие диск.</p>
<h3 id="heading-dalnejshie-shagi-1">Дальнейшие шаги:</h3>
<ol>
<li><p><strong>Перезагрузите Raspberry Pi</strong> .</p>
</li>
<li><p>После перезагрузки снова выполните команду, чтобы проверить тип таблицы разделов:</p>
</li>
</ol>
<pre><code class="lang-bash">sudo parted /dev/nvme0n1 <span class="hljs-built_in">print</span>
</code></pre>
<p>Убедитесь, что таблица разделов теперь GPT.</p>
<ol start="3">
<li>Если все в порядке, создайте раздел заново и отформатируйте его с использованием <code>ext4</code>.</li>
</ol>
<h2 id="heading-mk-22">MK:</h2>
<p>Пишет, что Partition table gpt</p>
<h2 id="heading-chatgpt-22">ChatGPT:</h2>
<p>Отлично, значит, таблица разделов установлена как GPT, и ограничений на размер нет. Если после перезагрузки раздел по-прежнему отображается как 2 ТБ, вероятно, требуется уточнить размер раздела при его создании.</p>
<h3 id="heading-shagi-dlya-uvelicheniya-razmera-razdela">Шаги для увеличения размера раздела:</h3>
<ol>
<li><strong>Удалите текущий раздел</strong>  (если на нем нет нужных данных):</li>
</ol>
<pre><code class="lang-bash">sudo parted /dev/nvme0n1 rm 2
</code></pre>
<ol start="2">
<li><strong>Создайте новый раздел</strong>  с использованием всего доступного пространства:</li>
</ol>
<pre><code class="lang-bash">sudo parted /dev/nvme0n1 mkpart primary ext4 1056768s 100%
</code></pre>
<p>Здесь <code>1056768s</code> — это начальный сектор, с которого мы начинаем, чтобы избежать удаленной области загрузки. Параметр <code>100%</code> заставляет <code>parted</code> выделить всё оставшееся пространство диска.</p>
<ol start="3">
<li><strong>Форматируйте новый раздел</strong> :</li>
</ol>
<pre><code class="lang-bash">sudo mkfs.ext4 /dev/nvme0n1p2
</code></pre>
<ol start="4">
<li><strong>Проверьте размер</strong> :
Подмонтируйте его снова и убедитесь, что отображается полный размер:</li>
</ol>
<pre><code class="lang-bash">sudo mount /dev/nvme0n1p2 /mnt/data
df -h /mnt/data
</code></pre>
<h3 id="heading-ozhidaemyj-rezultat">Ожидаемый результат</h3>
<p>После этих шагов, при команде <code>df -h /mnt/data</code>, должен отобразиться правильный полный размер раздела, который примерно составляет 3.7 ТБ.</p>
<h2 id="heading-mk-23">MK:</h2>
<p><code>sudo parted /dev/nvme0n1 rm 2</code> пишет что partition doesn't exists</p>
<h2 id="heading-chatgpt-23">ChatGPT:</h2>
<p>Сообщение "partition doesn't exist" указывает, что раздел <code>/dev/nvme0n1p2</code> уже удален или он отсутствует в таблице. Чтобы проверить это и увидеть текущее состояние разделов, выполните:</p>
<pre><code class="lang-bash">sudo parted /dev/nvme0n1 <span class="hljs-built_in">print</span>
</code></pre>
<h3 id="heading-chto-delat-dalshe">Что делать дальше:</h3>
<ol>
<li><p><strong>Проверьте таблицу разделов</strong> :
Посмотрите, какие разделы существуют на <code>nvme0n1</code>. Если второго раздела (<code>/dev/nvme0n1p2</code>) действительно нет, переходите к следующему шагу.</p>
</li>
<li><p><strong>Создайте новый раздел</strong> :
Используйте команду для создания нового раздела, начиная с сектора <code>1056768s</code> и до конца диска:</p>
</li>
</ol>
<pre><code class="lang-bash">sudo parted /dev/nvme0n1 mkpart primary ext4 1056768s 100%
</code></pre>
<ol start="3">
<li><strong>Повторите форматирование и монтирование</strong> :
Если команда создания раздела выполнена успешно, выполните:</li>
</ol>
<pre><code class="lang-bash">sudo mkfs.ext4 /dev/nvme0n1p2
sudo mount /dev/nvme0n1p2 /mnt/data
df -h /mnt/data
</code></pre>
<h3 id="heading-ozhidaemyj-rezultat-1">Ожидаемый результат</h3>
<p>Эти команды должны создать новый раздел на весь доступный объем диска, и после форматирования и монтирования он должен показать корректный размер.</p>
<h2 id="heading-mk-24">MK:</h2>
<p>sudo parted /dev/nvme0n1 print не выводит никаких записей</p>
<h2 id="heading-chatgpt-24">ChatGPT:</h2>
<p>Если <code>sudo parted /dev/nvme0n1 print</code> не показывает никаких записей, это может означать, что таблица разделов повреждена или не создана. Попробуйте следующие шаги, чтобы создать таблицу разделов с нуля: </p>
<ol>
<li><strong>Создайте новую таблицу разделов</strong> :
Создадим GPT таблицу разделов на диске, которая поддерживает объемы больше 2 ТБ:</li>
</ol>
<pre><code class="lang-bash">sudo parted /dev/nvme0n1 mklabel gpt
</code></pre>
<ol start="2">
<li><strong>Создайте новый раздел</strong> :
После создания таблицы создайте новый раздел, который занимает всё пространство на диске:</li>
</ol>
<pre><code class="lang-bash">sudo parted /dev/nvme0n1 mkpart primary ext4 0% 100%
</code></pre>
<ol start="3">
<li><strong>Форматирование раздела</strong> :
После создания раздела отформатируйте его в <code>ext4</code>:</li>
</ol>
<pre><code class="lang-bash">sudo mkfs.ext4 /dev/nvme0n1p1
</code></pre>
<ol start="4">
<li><strong>Монтирование и проверка размера</strong> :
Смонтируйте новый раздел и проверьте его размер:</li>
</ol>
<pre><code class="lang-bash">sudo mount /dev/nvme0n1p1 /mnt/data
df -h /mnt/data
</code></pre>
<p>Эти действия должны создать новый раздел на всём объёме диска и отобразить полный доступный размер после монтирования.</p>
<h2 id="heading-mk-25">MK:</h2>
<p>пишет Size 3.7T</p>
<h2 id="heading-chatgpt-25">ChatGPT:</h2>
<p>Отлично! Если после монтирования вывод <code>df -h /mnt/data</code> показывает размер 3.7 ТБ, значит, раздел успешно создан на весь объем SSD и теперь доступен для использования.Теперь вы можете настроить автоподключение этого раздела при загрузке, добавив его в файл <code>/etc/fstab</code>: </p>
<ol>
<li><strong>Получите UUID нового раздела</strong> :</li>
</ol>
<pre><code class="lang-bash">sudo blkid /dev/nvme0n1p1
</code></pre>
<ol start="2">
<li><strong>Отредактируйте файл <code>/etc/fstab</code></strong> :
Откройте файл для редактирования:</li>
</ol>
<pre><code class="lang-bash">sudo nano /etc/fstab
</code></pre>
<p>Добавьте строку для автоматического монтирования:</p>
<pre><code class="lang-javascript">UUID=&lt;ваш-UUID&gt; <span class="hljs-regexp">/mnt/</span>data ext4 defaults <span class="hljs-number">0</span> <span class="hljs-number">2</span>
</code></pre>
<p>Замените <code>&lt;ваш-UUID&gt;</code> на фактический UUID, который вы получили из команды <code>blkid</code>.</p>
<ol start="3">
<li><strong>Примените изменения</strong> :
Чтобы проверить, всё ли правильно, выполните:</li>
</ol>
<pre><code class="lang-bash">sudo mount -a
</code></pre>
<p>Теперь раздел будет автоматически монтироваться при каждой загрузке, и вы сможете использовать весь доступный объем в 3.7 ТБ.</p>
<h2 id="heading-mk-26">MK:</h2>
<p>как мне теперь из этого раздела сделать загрузочный чтобы Raspberry Pi грузила операционную систему с него, а не с SD карточки и развернуть на нем операционную систему?</p>
<h2 id="heading-chatgpt-26">ChatGPT:</h2>
<p>Чтобы сделать ваш SSD загрузочным и перенести на него операционную систему Raspberry Pi, потребуется выполнить несколько шагов. Основной процесс состоит из копирования системы с SD-карты на SSD, а затем настройки Raspberry Pi для загрузки с SSD.</p>
<h3 id="heading-shagi-dlya-sozdaniya-zagruzochnogo-ssd-s-perenosom-operacionnoj-sistemy">Шаги для создания загрузочного SSD с переносом операционной системы</h3>
<ol>
<li><p><strong>Создайте раздел для загрузочных файлов</strong> : </p>
<ul>
<li><p>Для Raspberry Pi требуется отдельный раздел FAT32 для загрузки. Используйте <code>parted</code> для создания небольшого загрузочного раздела, например, 512 МБ.</p>
</li>
<li><p>После этого основной раздел будет использоваться для корневой файловой системы.</p>
</li>
</ul>
</li>
</ol>
<p>Пример команд:</p>
<pre><code class="lang-bash">sudo parted /dev/nvme0n1
</code></pre>
<ul>
<li>Создайте раздел с файловой системой FAT32:</li>
</ul>
<pre><code class="lang-plaintext">mkpart primary fat32 1MiB 513MiB
set 1 boot on
</code></pre>
<ul>
<li>Создайте основной раздел для корневой системы:</li>
</ul>
<pre><code class="lang-plaintext">mkpart primary ext4 513MiB 100%
quit
</code></pre>
<ol start="2">
<li><strong>Форматируйте новые разделы</strong> :</li>
</ol>
<pre><code class="lang-bash">sudo mkfs.vfat /dev/nvme0n1p1
sudo mkfs.ext4 /dev/nvme0n1p2
</code></pre>
<ol start="3">
<li><strong>Скопируйте систему с SD-карты на SSD</strong> : <ul>
<li>Смонтируйте разделы:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo mount /dev/nvme0n1p2 /mnt/data
sudo mkdir -p /mnt/data/boot
sudo mount /dev/nvme0n1p1 /mnt/data/boot
</code></pre>
<ul>
<li>Используйте <code>rsync</code> для копирования файловой системы с SD-карты на SSD:</li>
</ul>
<pre><code class="lang-bash">sudo rsync -axv / /mnt/data
sudo rsync -axv /boot/ /mnt/data/boot/
</code></pre>
<ol start="4">
<li><p><strong>Обновите файл <code>fstab</code> на SSD</strong> : </p>
<ul>
<li><p>Откройте <code>/mnt/data/etc/fstab</code> и замените UUID разделов на UUID вашего SSD (можно получить с помощью <code>blkid</code>).</p>
</li>
<li><p>Например:</p>
</li>
</ul>
</li>
</ol>
<pre><code class="lang-plaintext">UUID=UUID_SSD_ROOT / ext4 defaults 0 1
UUID=UUID_SSD_BOOT /boot vfat defaults 0 2
</code></pre>
<ol start="5">
<li><strong>Настройка загрузки с SSD</strong> : <ul>
<li>Перезагрузите Raspberry Pi и зайдите в <code>raspi-config</code>:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo raspi-config
</code></pre>
<ul>
<li>В разделе "Advanced Options" выберите "Boot Order" и установите загрузку с USB.</li>
</ul>
<ol start="6">
<li><strong>Перезагрузите Raspberry Pi без SD-карты</strong> .</li>
</ol>
<p>Если всё прошло успешно, Raspberry Pi должна загрузиться с SSD.</p>
<h2 id="heading-mk-27">MK:</h2>
<p>Выполняю команду <code>mkpart primary fat32 1MiB 513MiB</code> и мне пишет Warning: The resulting partition is not properly aligned for best performance 2047s % 2048s != 0s</p>
<h2 id="heading-chatgpt-27">ChatGPT:</h2>
<p>Сообщение предупреждает о том, что начальный сектор не выровнен на 2048 секторов, что может повлиять на производительность. Чтобы избежать этого, используйте выравнивание по 2048 секторам.</p>
<p>Попробуйте изменить начальную позицию, например:</p>
<pre><code class="lang-bash">mkpart primary fat32 2MiB 514MiB
</code></pre>
<p>Здесь начальная позиция установлена на <code>2MiB</code>, что соответствует выравниванию по 2048 секторов и обеспечит оптимальную производительность.</p>
<h2 id="heading-mk-28">MK:</h2>
<p>Вывело и спрашивает
warning: You requested a partition from 2097kB to 539MB (sectors 4096..1052671).
the closes location we can manage is 4097Gb to 4097Gb (sectors 8001572864..8001572864).
is this still acceptable to you?</p>
<h2 id="heading-chatgpt-28">ChatGPT:</h2>
<p>Это предупреждение указывает на то, что диск уже содержит другие данные или разделы, и <code>parted</code> не может создать новый раздел в указанном диапазоне.</p>
<h3 id="heading-rekomendacii-1">Рекомендации</h3>
<ol>
<li><strong>Проверьте текущую разметку диска</strong> :
Выполните следующую команду для проверки всех существующих разделов:</li>
</ol>
<pre><code class="lang-bash">sudo parted /dev/nvme0n1 <span class="hljs-built_in">print</span>
</code></pre>
<ol start="2">
<li><p>Если предыдущие разделы занимают весь доступный объем, то потребуется <strong>удалить ненужные разделы</strong>  и <strong>начать разметку заново</strong> .</p>
</li>
<li><p>После удаления ненужных разделов повторите создание разделов:</p>
<ul>
<li>Создайте первый загрузочный раздел, начиная с 2MB:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo parted /dev/nvme0n1 mkpart primary fat32 2MiB 514MiB
</code></pre>
<ul>
<li>Затем создайте основной раздел для корневой файловой системы:</li>
</ul>
<pre><code class="lang-bash">sudo parted /dev/nvme0n1 mkpart primary ext4 514MiB 100%
</code></pre>
<p>После этого повторите форматирование и копирование данных.</p>
<h2 id="heading-mk-29">MK:</h2>
<p>давай удалим ненужные разделы</p>
<h2 id="heading-chatgpt-29">ChatGPT:</h2>
<p>Хорошо, чтобы удалить ненужные разделы, выполните следующие шаги:</p>
<ol>
<li><strong>Откройте <code>parted</code> для работы с диском</strong> :</li>
</ol>
<pre><code class="lang-bash">sudo parted /dev/nvme0n1
</code></pre>
<ol start="2">
<li><strong>Просмотрите текущие разделы</strong>  (если не сделали этого ранее):</li>
</ol>
<pre><code class="lang-plaintext">(parted) print
</code></pre>
<ol start="3">
<li><strong>Удалите ненужные разделы</strong> :
Для каждого раздела, который нужно удалить, введите команду:</li>
</ol>
<pre><code class="lang-plaintext">rm &lt;номер_раздела&gt;
</code></pre>
<p>Например, чтобы удалить первый и второй разделы, выполните:</p>
<pre><code class="lang-plaintext">rm 1
rm 2
</code></pre>
<ol start="4">
<li><p><strong>Проверьте, что все разделы удалены</strong> :
Выполните команду <code>print</code> снова, чтобы убедиться, что диск теперь не содержит разделов.</p>
</li>
<li><p><strong>Создайте новую таблицу разделов GPT</strong>  (если она ещё не установлена):</p>
</li>
</ol>
<pre><code class="lang-plaintext">mklabel gpt
</code></pre>
<p>После этого можно будет продолжить с созданием новых разделов, как описано ранее.</p>
<h2 id="heading-mk-30">MK:</h2>
<p><code>sudo rsync -axv /boot/ /mnt/data/boot/</code></p>
<p>выдало сообщение rsync: [generator] symlink "/mnt/data/boot/issue.txt -&gt; "firmware/issue.txt" failed: operation not permitted (1)</p>
<p>и то же самое для "/mnt/data/boot/overlays"</p>
<h2 id="heading-chatgpt-30">ChatGPT:</h2>
<p>Эта ошибка возникает из-за того, что файловая система <code>FAT32</code> на загрузочном разделе не поддерживает символические ссылки. Чтобы решить проблему, можно скопировать символические ссылки как обычные файлы или указать <code>rsync</code> игнорировать символические ссылки при копировании.</p>
<h3 id="heading-opcii-resheniya">Опции решения</h3>
<ol>
<li><strong>Копировать символические ссылки как обычные файлы</strong> :
Используйте флаг <code>--copy-links</code> в команде <code>rsync</code>, чтобы символические ссылки копировались как обычные файлы:</li>
</ol>
<pre><code class="lang-bash">sudo rsync -axv --copy-links /boot/ /mnt/data/boot/
</code></pre>
<ol start="2">
<li><strong>Игнорировать ошибки символических ссылок</strong> :
Если символические ссылки не критичны, можно проигнорировать ошибки с помощью <code>--no-links</code>:</li>
</ol>
<pre><code class="lang-bash">sudo rsync -axv --no-links /boot/ /mnt/data/boot/
</code></pre>
<p>Выберите первый вариант, если хотите сохранить содержимое ссылок в виде обычных файлов.</p>
<h2 id="heading-mk-31">MK:</h2>
<p>Как можно проверить подключен ли pi по сети?</p>
<h2 id="heading-chatgpt-31">ChatGPT:</h2>
<p>Чтобы проверить, подключен ли Raspberry Pi к сети, можно воспользоваться несколькими методами:</p>
<ol>
<li><strong>Ping IP-адреса Raspberry Pi</strong> Если вы знаете IP-адрес Pi, можно выполнить команду <code>ping</code> с другого устройства в сети:</li>
</ol>
<pre><code class="lang-bash">ping &lt;IP_адрес_Raspberry_Pi&gt;
</code></pre>
<p>Если устройство подключено, вы увидите ответы от IP-адреса. Если ответа нет, возможно, устройство отключено или IP изменился.</p>
<ol start="2">
<li>**
Чтобы проверить, подключен ли Raspberry Pi к сети, можно воспользоваться несколькими методами:</li>
<li><strong>Ping IP-адреса Raspberry Pi</strong> Если вы знаете IP-адрес Pi, можно выполнить команду <code>ping</code> с другого устройства в сети:</li>
</ol>
<pre><code class="lang-bash">ping &lt;IP_адрес_Raspberry_Pi&gt;
</code></pre>
<p>Если устройство подключено, вы увидите ответы от IP-адреса. Если ответа нет, возможно, устройство отключено или IP изменился.</p>
<ol start="2">
<li><p>Использование команд <code>arp</code> или <code>nmap</code> для поиска устройств в сети** 
Если IP-адрес неизвестен, используйте сканирование сети. На устройстве в той же сети выполните:</p>
</li>
<li><p><strong>С помощью команды <code>arp</code></strong> :</p>
</li>
</ol>
<pre><code class="lang-bash">arp -a
</code></pre>
<p>Это покажет список всех устройств, подключенных к сети, включая их IP и MAC-адреса. Raspberry Pi обычно имеет MAC-адрес, начинающийся с <code>b8:27:eb</code> или <code>dc:a6:32</code> (хотя это зависит от модели).</p>
<ul>
<li><strong>С помощью <code>nmap</code></strong>  (требуется установка):</li>
</ul>
<pre><code class="lang-bash">sudo nmap -sn &lt;ваш_сеть_подсети&gt;  <span class="hljs-comment"># Например, 192.168.1.0/24</span>
</code></pre>
<p>Это покажет все активные устройства в указанной подсети.</p>
<ol start="3">
<li><strong>Используйте роутер для поиска устройств</strong> 
Зайдите в интерфейс вашего роутера и проверьте список подключенных устройств. Там будет отображен IP-адрес и имя устройства Raspberry Pi.</li>
</ol>
<p>Любой из этих методов позволит проверить, подключен ли Raspberry Pi к сети.</p>
<h2 id="heading-mk-32">MK:</h2>
<p>С самого pi</p>
<h2 id="heading-chatgpt-32">ChatGPT:</h2>
<p>Если вы хотите проверить подключение к сети непосредственно с Raspberry Pi, попробуйте следующие команды:</p>
<ol>
<li><strong>Проверка подключения к роутеру (локальной сети)</strong> : </li>
<li>Выполните команду <code>ping</code> на адрес вашего роутера (например, 192.168.1.1):</li>
</ol>
<pre><code class="lang-bash">ping -c 4 192.168.1.1
</code></pre>
<ul>
<li>Если ответ есть, значит Raspberry Pi подключен к локальной сети.</li>
<li><strong>Проверка подключения к интернету</strong> : </li>
<li>Выполните команду <code>ping</code> на общедоступный адрес, например, на Google DNS:</li>
</ul>
<pre><code class="lang-bash">ping -c 4 8.8.8.8
</code></pre>
<ul>
<li>Если видите ответы, значит подключение к интернету активно.</li>
<li><strong>Проверка сетевого интерфейса и IP-адреса</strong> : </li>
<li>Посмотрите состояние сетевых интерфейсов и присвоенные IP-адреса с помощью команды:</li>
</ul>
<pre><code class="lang-bash">ip a
</code></pre>
<ul>
<li>Обратите внимание на интерфейс, например <code>eth0</code> для проводного подключения или <code>wlan0</code> для Wi-Fi, и убедитесь, что у него есть IP-адрес.</li>
<li><strong>Проверка маршрутизации (gateway) и DNS</strong> : </li>
<li>Просмотрите таблицу маршрутизации, чтобы убедиться, что настроен шлюз (gateway):</li>
</ul>
<pre><code class="lang-bash">ip route
</code></pre>
<ul>
<li>Для проверки DNS-серверов выполните:</li>
</ul>
<pre><code class="lang-bash">cat /etc/resolv.conf
</code></pre>
<p>Эти команды помогут вам проверить, подключен ли Raspberry Pi к сети и имеет ли он доступ к интернету.</p>
<h2 id="heading-mk-33">MK:</h2>
<p>пишет network is unreachable</p>
<h2 id="heading-chatgpt-33">ChatGPT:</h2>
<p>Сообщение "network is unreachable" указывает на то, что Raspberry Pi не имеет активного сетевого подключения. Давайте проверим основные моменты для восстановления соединения.</p>
<h3 id="heading-shagi-dlya-diagnostiki-i-vosstanovleniya-podklyucheniya">Шаги для диагностики и восстановления подключения</h3>
<ol>
<li><p><strong>Проверьте кабельное подключение (для проводной сети)</strong> :</p>
<ul>
<li>Убедитесь, что сетевой кабель правильно подключен, и индикаторы на порте мигают.</li>
</ul>
</li>
<li><p><strong>Перезапустите сетевой интерфейс</strong> : </p>
<ul>
<li>Если используете проводное подключение (например, интерфейс <code>eth0</code>), выполните:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo ifconfig eth0 down
sudo ifconfig eth0 up
</code></pre>
<ul>
<li>Если используете Wi-Fi (<code>wlan0</code>), выполните:</li>
</ul>
<pre><code class="lang-bash">sudo ifconfig wlan0 down
sudo ifconfig wlan0 up
</code></pre>
<ol start="3">
<li><strong>Проверка настроек сети</strong> : <ul>
<li>Проверьте конфигурацию сетевого интерфейса с помощью:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">ip a
</code></pre>
<ul>
<li>Если у интерфейса отсутствует IP-адрес, значит он не подключен к сети. Для Wi-Fi убедитесь, что указаны правильные данные сети.</li>
</ul>
<ol start="4">
<li><strong>Проверка файла конфигурации сети</strong>  (если используется <code>dhcpcd</code>): <ul>
<li>Откройте файл конфигурации:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo nano /etc/dhcpcd.conf
</code></pre>
<ul>
<li>Убедитесь, что нет статических настроек, которые могли бы блокировать подключение, или ошибок в IP-адресах шлюза и DNS-серверах.</li>
</ul>
<ol start="5">
<li><strong>Перезапустите службу сети</strong> : <ul>
<li>Для обновления сетевых настроек перезапустите службу:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo systemctl restart networking
</code></pre>
<ol start="6">
<li><strong>Проверка сети роутера (возможно, вручную задать IP)</strong> :<ul>
<li>Иногда Pi не получает IP-адрес от DHCP-сервера. Попробуйте вручную задать IP-адрес в подсети роутера, если знаете её параметры.</li>
</ul>
</li>
</ol>
<p>Если после этих действий сеть всё ещё недоступна, возможно, стоит перезагрузить Raspberry Pi или проверить конфигурацию роутера, к которому он подключен.</p>
<h2 id="heading-mk-34">MK:</h2>
<p>ip a пишет NO-CARRIER для eth0 и wlan0</p>
<h2 id="heading-chatgpt-34">ChatGPT:</h2>
<p>Сообщение <code>NO-CARRIER</code> указывает, что ни проводное, ни беспроводное соединение не установлено, так как Raspberry Pi не обнаруживает физического подключения к сети для <code>eth0</code>, а Wi-Fi интерфейс <code>wlan0</code> не подключен к сети. Рассмотрим шаги для диагностики и устранения проблемы:</p>
<h3 id="heading-shagi-dlya-proverki-provodnogo-podklyucheniya-eth0">Шаги для проверки проводного подключения (eth0)</h3>
<ol>
<li><p><strong>Проверка сетевого кабеля и порта</strong> :</p>
<ul>
<li><p>Убедитесь, что сетевой кабель надежно подключен как к Raspberry Pi, так и к роутеру или коммутатору.</p>
</li>
<li><p>Попробуйте заменить кабель и убедитесь, что порт на роутере активен (попробуйте другой порт на роутере, если есть возможность).</p>
</li>
</ul>
</li>
<li><p><strong>Перезагрузка сетевого интерфейса</strong> : </p>
<ul>
<li>Перезапустите интерфейс <code>eth0</code>:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo ifconfig eth0 down
sudo ifconfig eth0 up
</code></pre>
<ol start="3">
<li><strong>Перезагрузка Raspberry Pi и роутера</strong> :<ul>
<li>Попробуйте перезагрузить Raspberry Pi и роутер, так как иногда сетевое оборудование может не обнаруживать устройство до перезагрузки.</li>
</ul>
</li>
</ol>
<h3 id="heading-shagi-dlya-podklyucheniya-wi-fi-wlan0">Шаги для подключения Wi-Fi (wlan0)</h3>
<ol>
<li><strong>Настройка Wi-Fi</strong> : <ul>
<li>Если требуется Wi-Fi, убедитесь, что он настроен правильно. Откройте файл конфигурации Wi-Fi:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
</code></pre>
<ul>
<li>Убедитесь, что SSID и пароль указаны правильно:</li>
</ul>
<pre><code class="lang-plaintext">network={
    ssid="имя_сети"
    psk="пароль"
}
</code></pre>
<ol start="2">
<li><strong>Перезапустите Wi-Fi</strong> : <ul>
<li>Выполните команды для перезапуска Wi-Fi интерфейса:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo ifconfig wlan0 down
sudo ifconfig wlan0 up
</code></pre>
<ol start="3">
<li><strong>Перезапустите службу Wi-Fi</strong> :</li>
</ol>
<pre><code class="lang-bash">sudo systemctl restart wpa_supplicant
</code></pre>
<p>Если после выполнения этих шагов состояние интерфейсов не изменится и они всё равно будут показывать <code>NO-CARRIER</code>, это может указывать на аппаратную проблему с Raspberry Pi или сетевым оборудованием.</p>
<h2 id="heading-mk-35">MK:</h2>
<p>как посмотреть логи перезапуска systemctl restart networking?</p>
<h2 id="heading-chatgpt-35">ChatGPT:</h2>
<p>Чтобы просмотреть журналы перезапуска службы <code>networking</code> или любой другой службы в <code>systemd</code>, можно использовать команду <code>journalctl</code>. Она позволяет получить доступ к логам, связанным с конкретной службой.Команды для просмотра логов перезапуска службы <code>networking</code> </p>
<ol>
<li><strong>Просмотреть последние сообщения от службы <code>networking</code></strong> :</li>
</ol>
<pre><code class="lang-bash">sudo journalctl -u networking.service
</code></pre>
<ol start="2">
<li><strong>Просмотреть только последние несколько строк логов</strong> :
Если нужно увидеть только последние записи, добавьте флаг <code>-n</code> и укажите количество строк, например:</li>
</ol>
<pre><code class="lang-bash">sudo journalctl -u networking.service -n 20
</code></pre>
<ol start="3">
<li><strong>Проверка логов после конкретного перезапуска</strong> :
Чтобы увидеть логи с момента последнего перезапуска, используйте флаг <code>-b</code>:</li>
</ol>
<pre><code class="lang-bash">sudo journalctl -u networking.service -b
</code></pre>
<ol start="4">
<li><strong>Отслеживание логов в режиме реального времени</strong> :
Для отслеживания логов в реальном времени:</li>
</ol>
<pre><code class="lang-bash">sudo journalctl -u networking.service -f
</code></pre>
<p>Эти команды помогут вам просмотреть детали, касающиеся последнего перезапуска службы <code>networking</code>, и найти возможные ошибки или предупреждения.</p>
<h2 id="heading-mk-36">MK:</h2>
<p>пытаюсь редактировать файл <code>/mnt/data/etc/fstab</code></p>
<p>вижу там строки:</p>
<pre><code>proc    /proc proc defaults <span class="hljs-number">0</span> <span class="hljs-number">0</span>
PARTUUID=...<span class="hljs-number">-01</span> /boot/firmware vfat defaults <span class="hljs-number">0</span> <span class="hljs-number">2</span>
PARTUUID=..<span class="hljs-number">.02</span> / ext4 defaults,noatime <span class="hljs-number">0</span> <span class="hljs-number">1</span>
</code></pre><p>мне надо отредактировать только две последние строки и вставить туда UUID для /dev/nvme0n1o1 и /dev/nvme0n1o2 ?</p>
<h2 id="heading-chatgpt-36">ChatGPT:</h2>
<p>Да, вам нужно заменить <code>PARTUUID</code> на <code>UUID</code> для разделов вашего SSD (<code>/dev/nvme0n1p1</code> и <code>/dev/nvme0n1p2</code>). Для этого сначала получите точные <code>UUID</code> каждого раздела.Шаги для редактирования <code>/etc/fstab</code> </p>
<ol>
<li><strong>Получите UUID для каждого раздела</strong> :
Выполните команду:</li>
</ol>
<pre><code class="lang-bash">sudo blkid
</code></pre>
<p>Найдите <code>UUID</code> для разделов <code>/dev/nvme0n1p1</code> (загрузочный раздел) и <code>/dev/nvme0n1p2</code> (корневой раздел).</p>
<ol start="2">
<li><strong>Редактирование файла <code>/etc/fstab</code></strong> :
Откройте файл <code>/mnt/data/etc/fstab</code> в текстовом редакторе:</li>
</ol>
<pre><code class="lang-bash">sudo nano /mnt/data/etc/fstab
</code></pre>
<ol start="3">
<li><strong>Замените строки с <code>PARTUUID</code> на <code>UUID</code></strong> :
Обновите две последние строки в соответствии с вашими <code>UUID</code>:</li>
</ol>
<pre><code class="lang-plaintext">UUID=&lt;UUID_для_раздела_nvm0n1p1&gt; /boot/firmware vfat defaults 0 2
UUID=&lt;UUID_для_раздела_nvm0n1p2&gt; / ext4 defaults,noatime 0 1
</code></pre>
<p>Убедитесь, что вы заменили <code>&lt;UUID_для_раздела_nvm0n1p1&gt;</code> и <code>&lt;UUID_для_раздела_nvm0n1p2&gt;</code> на соответствующие UUID из команды <code>blkid</code>.</p>
<ol start="4">
<li><strong>Сохраните изменения и выйдите</strong> :
В редакторе <code>nano</code> нажмите <code>Ctrl + O</code>, чтобы сохранить файл, и <code>Ctrl + X</code>, чтобы выйти.
После этого конфигурация <code>/etc/fstab</code> на SSD будет настроена для загрузки с использованием UUID.</li>
</ol>
<h2 id="heading-mk-37">MK:</h2>
<p>sudo blkid почему-то показывает UUID /dev/nvme0n1o1 маленького размера это нормально?</p>
<h2 id="heading-chatgpt-37">ChatGPT:</h2>
<p>Для стандартных устройств на Linux <code>UUID</code> обычно имеет привычный формат, например, строки вида <code>123e4567-e89b-12d3-a456-426614174000</code>. Если UUID для раздела отображается коротким (например, менее 8 символов или в нестандартном формате), это может указывать на ошибку в настройке раздела или быть следствием проблем с таблицей разделов.</p>
<h3 id="heading-vozmozhnye-dejstviya-dlya-proverki">Возможные действия для проверки</h3>
<ol>
<li><strong>Перепроверьте разделы и их UUID</strong> :
Убедитесь, что команда <code>blkid</code> действительно показывает правильные UUID для всех разделов:</li>
</ol>
<pre><code class="lang-bash">sudo blkid /dev/nvme0n1p1
sudo blkid /dev/nvme0n1p2
</code></pre>
<ol start="2">
<li><strong>Пересоздайте UUID, если нужно</strong> :
Если UUID выглядит странно, вы можете пересоздать его вручную. Это делается с помощью команды <code>tune2fs</code> (только для <code>ext4</code>):</li>
</ol>
<pre><code class="lang-bash">sudo tune2fs -U random /dev/nvme0n1p2
</code></pre>
<p>Для файловой системы FAT32 используйте <code>fatlabel</code> для смены метки тома и присвоения нового UUID:</p>
<pre><code class="lang-bash">sudo fatlabel /dev/nvme0n1p1 NEW_LABEL
</code></pre>
<ol start="3">
<li><strong>Перезагрузите и проверьте снова</strong> :
После изменения UUID и перезагрузки снова выполните <code>blkid</code>, чтобы убедиться, что UUID теперь отображаются корректно.</li>
</ol>
<p>Сообщите, если странный UUID сохраняется или если возникают другие ошибки.</p>
<h2 id="heading-mk-38">MK:</h2>
<p><code>sudo fatlabel /dev/nvme0n1o1 BOOT</code></p>
<p>выдало:</p>
<pre><code>There are difference between boot sector and its backup 
This is mostly harmeless. Differences: (offset:original/backup)
    <span class="hljs-number">65</span>:<span class="hljs-number">01</span>/<span class="hljs-number">00</span>
Not automatically fixing <span class="hljs-built_in">this</span>
</code></pre><h2 id="heading-chatgpt-38">ChatGPT:</h2>
<p>Сообщение указывает на несоответствие между основным и резервным загрузочным сектором на разделе FAT32, что обычно не является критической проблемой, но может вызывать некорректное поведение при загрузке. Мы можем выполнить восстановление, чтобы синхронизировать основной и резервный загрузочные секторы.</p>
<h3 id="heading-ispravlenie-nesootvetstviya-v-zagruzochnom-sektore">Исправление несоответствия в загрузочном секторе</h3>
<ol>
<li><strong>Используйте <code>dosfsck</code> для проверки и восстановления файловой системы</strong> :
Воспользуйтесь утилитой <code>dosfsck</code>, чтобы проверить и исправить любые несоответствия на разделе FAT32:</li>
</ol>
<pre><code class="lang-bash">sudo dosfsck -a /dev/nvme0n1p1
</code></pre>
<p>Опция <code>-a</code> автоматически исправит обнаруженные ошибки.</p>
<ol start="2">
<li><strong>Повторная проверка</strong> :
После выполнения <code>dosfsck</code> проверьте раздел ещё раз:</li>
</ol>
<pre><code class="lang-bash">sudo dosfsck /dev/nvme0n1p1
</code></pre>
<p>Это позволит убедиться, что все ошибки исправлены.
После этих действий можно будет повторить установку метки тома и настроить <code>UUID</code>, если потребуется.</p>
<h2 id="heading-mk-39">MK:</h2>
<pre><code>sudo dosfsck /dev/nvme0n1p1 

There are difference between boot sector and its backup 
This is mostly harmeless. Differences: (offset:original/backup)
<span class="hljs-number">65</span>:<span class="hljs-number">01</span>/<span class="hljs-number">00</span>
<span class="hljs-number">1</span>) Copy original to backup
<span class="hljs-number">2</span>) Copy backup to original
<span class="hljs-number">3</span>) no cation
</code></pre><h2 id="heading-chatgpt-39">ChatGPT:</h2>
<p>В данном случае лучше выбрать <strong>первый вариант</strong>  — копировать оригинал в резервную копию (выберите <code>1</code>). Это позволит синхронизировать резервный загрузочный сектор с основным, который сейчас считается актуальным.</p>
<h3 id="heading-dejstviya">Действия:</h3>
<ul>
<li>Введите <code>1</code> и нажмите Enter, чтобы выбрать "Copy original to backup".
После завершения процесса <code>dosfsck</code> снова выполните команду <code>blkid</code>, чтобы убедиться, что UUID теперь корректен, и продолжите настройку.</li>
</ul>
<h2 id="heading-mk-40">MK:</h2>
<p>после этой процедуры blkid все еще маленький. PARTUUID и там и там длинный, может использовать его?</p>
<h2 id="heading-chatgpt-40">ChatGPT:</h2>
<p>Да, вы можете использовать <code>PARTUUID</code> вместо <code>UUID</code> в файле <code>/etc/fstab</code>, особенно если <code>PARTUUID</code> корректно отображается и имеет полный формат. <code>PARTUUID</code> используется для идентификации разделов в GPT и MBR и подходит для случаев, когда <code>UUID</code> может быть нестандартным, как здесь.Изменение <code>/etc/fstab</code> для использования <code>PARTUUID</code> </p>
<ol>
<li>Откройте файл <code>/etc/fstab</code> на вашем SSD:</li>
</ol>
<pre><code class="lang-bash">sudo nano /mnt/data/etc/fstab
</code></pre>
<ol start="2">
<li>Замените строки с <code>UUID</code> на <code>PARTUUID</code>, используя найденные значения:</li>
</ol>
<pre><code class="lang-plaintext">PARTUUID=&lt;PARTUUID_для_boot&gt; /boot/firmware vfat defaults 0 2
PARTUUID=&lt;PARTUUID_для_root&gt; / ext4 defaults,noatime 0 1
</code></pre>
<p>Убедитесь, что <code>&lt;PARTUUID_для_boot&gt;</code> и <code>&lt;PARTUUID_для_root&gt;</code> заменены на соответствующие PARTUUID, которые вы видите в выводе <code>blkid</code>.</p>
<ol start="3">
<li>Сохраните изменения и выйдите, нажав <code>Ctrl + O</code>, затем <code>Enter</code>, и <code>Ctrl + X</code>.
Использование <code>PARTUUID</code> — это обычная практика, и оно должно корректно работать для загрузки с SSD.</li>
</ol>
<h2 id="heading-mk-41">MK:</h2>
<p>как мне в mc/mcedit скопировать строки из одного файла и перенести в другой?</p>
<h2 id="heading-chatgpt-41">ChatGPT:</h2>
<p>В <code>mc</code> или <code>mcedit</code> (Midnight Commander) вы можете копировать и вставлять строки между файлами, используя сочетания клавиш. Вот как это сделать: </p>
<ol>
<li><p><strong>Откройте первый файл</strong>  в <code>mcedit</code> и перейдите к строкам, которые хотите скопировать.</p>
</li>
<li><p><strong>Выделите текст</strong> :</p>
<ul>
<li><p>Перейдите к началу текста, который нужно скопировать.</p>
</li>
<li><p>Нажмите <code>F3</code> (или <code>Shift</code> + стрелка вниз), чтобы начать выделение.</p>
</li>
<li><p>Переместите курсор вниз или вправо, чтобы выделить нужные строки.</p>
</li>
</ul>
</li>
<li><p><strong>Копируйте выделенный текст</strong> : </p>
<ul>
<li>Нажмите <code>F15</code> (обычно это <code>Shift + F5</code>) или используйте <code>Ctrl + Ins</code> (или <code>Ctrl + Insert</code>), чтобы скопировать выделенное в буфер обмена.</li>
</ul>
</li>
<li><p><strong>Откройте второй файл</strong> : </p>
<ul>
<li>Закройте первый файл или откройте второй файл в соседней панели <code>mc</code>, а затем откройте его для редактирования в <code>mcedit</code>.</li>
</ul>
</li>
<li><p><strong>Вставьте текст</strong> :</p>
<ul>
<li><p>Поместите курсор в нужное место.</p>
</li>
<li><p>Нажмите <code>Shift + F4</code> (или <code>Shift + Ins</code>), чтобы вставить текст из буфера.
Эти шаги позволяют копировать текст между файлами в <code>mc</code> или <code>mcedit</code>.</p>
</li>
</ul>
</li>
</ol>
<h2 id="heading-mk-42">MK:</h2>
<p>не вставляет</p>
<h2 id="heading-chatgpt-42">ChatGPT:</h2>
<p>В <code>mc</code> или <code>mcedit</code> нет встроенного буфера обмена для копирования текста между разными файлами так, как это делается в более современных текстовых редакторах. Вместо этого можно использовать выделение мышью и буфер X11 (если работаете в графической среде) или временный файл для вставки. Вот несколько альтернативных методов.</p>
<h3 id="heading-metod-1-ispolzovanie-myshi-i-x11-esli-dostupno">Метод 1: Использование мыши и X11 (если доступно)</h3>
<ol>
<li><p><strong>Откройте первый файл</strong>  в <code>mcedit</code> и выделите текст с помощью мыши (нажмите левую кнопку мыши и протяните).</p>
</li>
<li><p><strong>Копирование в буфер X11</strong> : текст автоматически копируется в буфер обмена.</p>
</li>
<li><p><strong>Откройте второй файл</strong>  в <code>mcedit</code>, установите курсор в нужное место и щелкните <strong>средней кнопкой мыши</strong>  (или колесиком), чтобы вставить.</p>
</li>
</ol>
<h3 id="heading-metod-2-ispolzovanie-vremennogo-fajla">Метод 2: Использование временного файла</h3>
<ol>
<li><p><strong>Откройте первый файл</strong>  в <code>mcedit</code> и выделите нужный текст.</p>
</li>
<li><p><strong>Сохраните выделенный текст во временный файл</strong> : </p>
<ul>
<li>Нажмите <code>F2</code>, чтобы вызвать меню, выберите <strong>Сохранить как</strong> , затем укажите временное имя файла, например <code>/tmp/tempfile.txt</code>.</li>
</ul>
</li>
<li><p><strong>Откройте второй файл</strong>  и вставьте содержимое временного файла:</p>
<ul>
<li><p>Перейдите в нужное место в файле.</p>
</li>
<li><p>Нажмите <code>F9</code> для вызова меню и выберите <strong>Вставить файл</strong> .</p>
</li>
<li><p>Укажите путь к временному файлу <code>/tmp/tempfile.txt</code>.</p>
</li>
</ul>
</li>
</ol>
<p>Этот способ позволит обойти ограничение и вставить текст из одного файла в другой.</p>
<h2 id="heading-mk-43">MK:</h2>
<p>в файле fstab PARTUUID должен быть в кавычках или без?</p>
<h2 id="heading-chatgpt-43">ChatGPT:</h2>
<p>В файле <code>/etc/fstab</code> значение <code>PARTUUID</code> указывается <strong>без кавычек</strong> . Например:</p>
<pre><code class="lang-plaintext">PARTUUID=Your-partuuid-here /boot/firmware vfat defaults 0 2
PARTUUID=Your-partuuid-here / ext4 defaults,noatime 0 1
</code></pre>
<p>Просто замените <code>Your-partuuid-here</code> на фактическое значение <code>PARTUUID</code>, как показано в выводе <code>blkid</code>.</p>
<h2 id="heading-mk-44">MK:</h2>
<p>Перезапустил PI и мне кажется, что он загрузился не с SSD, как мне понять так ли это?</p>
<h2 id="heading-chatgpt-44">ChatGPT:</h2>
<p>Чтобы проверить, загрузился ли Raspberry Pi с SSD, можно выполнить следующие команды:</p>
<ol>
<li><strong>Проверка точки монтирования корневого раздела</strong>  </li>
<li>Выполните команду, чтобы узнать, какой диск используется для корневой файловой системы (<code>/</code>):</li>
</ol>
<pre><code class="lang-bash">df -h /
</code></pre>
<ul>
<li>Эта команда покажет устройство, с которого загружена система. Если вы видите <code>/dev/nvme0n1p2</code> (или аналогичный раздел на SSD), значит, загрузка произошла с SSD. Если отображается <code>/dev/mmcblk0p2</code> или <code>/dev/mmcblk0p1</code>, то система загрузилась с SD-карты.</li>
<li>**
Чтобы проверить, загрузился ли Raspberry Pi с SSD, можно выполнить следующие команды:</li>
<li><strong>Проверка точки монтирования корневого раздела</strong>  </li>
<li>Выполните команду, чтобы узнать, какой диск используется для корневой файловой системы (<code>/</code>):</li>
</ul>
<pre><code class="lang-bash">df -h /
</code></pre>
<ul>
<li>Эта команда покажет устройство, с которого загружена система. Если вы видите <code>/dev/nvme0n1p2</code> (или аналогичный раздел на SSD), значит, загрузка произошла с SSD. Если отображается <code>/dev/mmcblk0p2</code> или <code>/dev/mmcblk0p1</code>, то система загрузилась с SD-карты.</li>
<li>Проверка информации о загрузке через <code>lsblk</code>**  </li>
<li>Команда <code>lsblk</code> покажет все устройства и точки монтирования:</li>
</ul>
<pre><code class="lang-bash">lsblk
</code></pre>
<ul>
<li>Найдите строку с <code>mountpoint</code> для <code>/</code>. Если она соответствует SSD (например, <code>/dev/nvme0n1p2</code>), значит, система работает с него.</li>
<li><strong>Просмотр логов загрузки</strong> 
Вы также можете просмотреть логи, чтобы увидеть, какой раздел был смонтирован как корневой. Выполните:</li>
</ul>
<pre><code class="lang-bash">sudo dmesg | grep <span class="hljs-string">"Mounted root filesystem"</span>
</code></pre>
<p>Это покажет раздел, который был смонтирован как корневая файловая система при загрузке.</p>
<p>Эти команды помогут точно определить, с какого устройства произошла загрузка.</p>
<h2 id="heading-mk-45">MK:</h2>
<p>df -h / выводит</p>
<pre><code>Filesystem      Size  Used Avail Use% Mounted on
/dev/mmcblk0p2  <span class="hljs-number">117</span>G   <span class="hljs-number">82</span>G   <span class="hljs-number">29</span>G  <span class="hljs-number">74</span>% /
</code></pre><h2 id="heading-chatgpt-45">ChatGPT:</h2>
<p>Согласно выводу, система загрузилась с <strong>SD-карты</strong>  (<code>/dev/mmcblk0p2</code>), а не с SSD. Это значит, что настройки загрузки с SSD не применились, и Raspberry Pi по-прежнему использует SD-карту для загрузки.</p>
<h3 id="heading-chto-mozhno-sdelat-dlya-ustraneniya-problemy">Что можно сделать для устранения проблемы</h3>
<ol>
<li><strong>Проверьте настройки загрузки через <code>raspi-config</code></strong> : <ul>
<li>Откройте конфигурацию:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo raspi-config
</code></pre>
<ul>
<li><p>Перейдите в <strong>Advanced Options</strong>  &gt; <strong>Boot Order</strong>  и выберите опцию для загрузки с USB, если доступно.</p>
</li>
<li><p>Сохраните изменения и перезагрузите Raspberry Pi.</p>
</li>
</ul>
<ol start="2">
<li><strong>Обновите загрузочную EEPROM</strong>  (если вы это не делали):
Иногда требуется последняя версия загрузочной прошивки EEPROM для поддержки загрузки с SSD.</li>
</ol>
<pre><code class="lang-bash">sudo apt update
sudo apt full-upgrade
sudo rpi-eeprom-update -d -a
sudo reboot
</code></pre>
<ol start="3">
<li><p><strong>Извлеките SD-карту и попробуйте загрузиться с SSD напрямую</strong> :</p>
<ul>
<li>Попробуйте полностью удалить SD-карту и перезапустить Raspberry Pi, чтобы проверить, будет ли он пытаться загрузиться с SSD.</li>
</ul>
</li>
<li><p><strong>Проверьте корректность копирования загрузочных файлов</strong> :
Убедитесь, что загрузочные файлы корректно скопированы в раздел <code>/boot/firmware</code> на SSD. Возможно, что часть файлов не была скопирована из-за ошибок в пути или структуры каталогов.</p>
</li>
</ol>
<p>После выполнения этих шагов повторно проверьте, загружается ли система с SSD.</p>
<h2 id="heading-mk-46">MK:</h2>
<p><code>sudo apt update</code> выдает </p>
<pre><code>W: http:<span class="hljs-comment">//raspbian.raspberrypi.com/raspbian/dists/bookworm/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.</span>
</code></pre><h2 id="heading-chatgpt-46">ChatGPT:</h2>
<p>Это предупреждение связано с тем, что ключи GPG для проверки репозиториев хранятся в устаревшем файле <code>/etc/apt/trusted.gpg</code>. В новых версиях <code>apt</code> рекомендуется использовать каталог <code>/etc/apt/trusted.gpg.d/</code> для хранения ключей в виде отдельных файлов, а не в одном общем файле.
Чтобы устранить это предупреждение, выполните следующие шаги:</p>
<h3 id="heading-shagi-dlya-perenosa-klyucha-v-novyj-format">Шаги для переноса ключа в новый формат</h3>
<ol>
<li><strong>Сохраните текущие ключи из <code>trusted.gpg</code> в отдельный файл</strong> :</li>
</ol>
<pre><code class="lang-bash">sudo cp /etc/apt/trusted.gpg /etc/apt/trusted.gpg.d/raspbian-archive-keyring.gpg
</code></pre>
<ol start="2">
<li><strong>Проверьте и обновите систему</strong> :
Теперь повторите команду <code>apt update</code>:</li>
</ol>
<pre><code class="lang-bash">sudo apt update
</code></pre>
<p>Эти шаги должны устранить предупреждение, и система будет использовать новый рекомендуемый формат для хранения ключей.</p>
<h2 id="heading-mk-47">MK:</h2>
<p>во время full-upgrade выдало сообщение:</p>
<pre><code>perl: warning: Please check that your locale settings:
        LANGUAGE = (unset),
        LC_ALL = <span class="hljs-string">"en_US.UTF-8"</span>,
        LC_CTYPE = <span class="hljs-string">"en_US.UTF-8"</span>,
        LANG = <span class="hljs-string">"en_GB.UTF-8"</span>
    are supported and installed on your system.
</code></pre><h2 id="heading-chatgpt-47">ChatGPT:</h2>
<p>Это предупреждение указывает, что настройки локали (языка и кодировки) не полностью установлены или настроены. Вот как можно это исправить:</p>
<h3 id="heading-shagi-dlya-nastrojki-lokali">Шаги для настройки локали</h3>
<ol>
<li><strong>Сгенерируйте недостающие локали</strong> :
Выполните команду для запуска конфигурации локали:</li>
</ol>
<pre><code class="lang-bash">sudo dpkg-reconfigure locales
</code></pre>
<p>В открывшемся меню выберите <strong>en_US.UTF-8</strong>  и <strong>en_GB.UTF-8</strong>  (или любую другую нужную локаль), установив галочки, а затем нажмите <strong>OK</strong> . Убедитесь, что <strong>en_US.UTF-8</strong>  или <strong>en_GB.UTF-8</strong>  выбраны как локали по умолчанию.</p>
<ol start="2">
<li><strong>Примените изменения</strong> :
После настройки локали обновите текущую конфигурацию с помощью команд:</li>
</ol>
<pre><code class="lang-bash"><span class="hljs-built_in">export</span> LC_ALL=<span class="hljs-string">"en_US.UTF-8"</span>
<span class="hljs-built_in">export</span> LANG=<span class="hljs-string">"en_GB.UTF-8"</span>
</code></pre>
<ol start="3">
<li><strong>Проверьте изменения</strong> :
Убедитесь, что изменения применились:</li>
</ol>
<pre><code class="lang-bash">locale
</code></pre>
<p>Эти шаги должны устранить предупреждение.</p>
<h2 id="heading-mk-48">MK:</h2>
<pre><code>/usr/bin/locale: Cannot set LC_CTYPE to <span class="hljs-keyword">default</span> locale: No such file or directory
/usr/bin/locale: Cannot set LC_MESSAGES to <span class="hljs-keyword">default</span> locale: No such file or directory
/usr/bin/locale: Cannot set LC_ALL to <span class="hljs-keyword">default</span> locale: No such file or directory
</code></pre><h2 id="heading-chatgpt-48">ChatGPT:</h2>
<p>Эти ошибки указывают на то, что локали, которые вы пытаетесь установить, не были сгенерированы или недоступны в системе. Давайте исправим это, вручную создав нужные локали.</p>
<h3 id="heading-ispravlenie-oshibki-lokali">Исправление ошибки локали</h3>
<ol>
<li><strong>Откройте файл локали</strong>  для редактирования:</li>
</ol>
<pre><code class="lang-bash">sudo nano /etc/locale.gen
</code></pre>
<ol start="2">
<li><strong>Разблокируйте нужные локали</strong> :
Найдите строки для <code>en_US.UTF-8</code> и <code>en_GB.UTF-8</code> и удалите символ <code>#</code> в начале этих строк, чтобы они выглядели так:</li>
</ol>
<pre><code class="lang-plaintext">en_US.UTF-8 UTF-8
en_GB.UTF-8 UTF-8
</code></pre>
<ol start="3">
<li><strong>Сгенерируйте локали</strong> :
После разблокировки локалей выполните команду для их генерации:</li>
</ol>
<pre><code class="lang-bash">sudo locale-gen
</code></pre>
<ol start="4">
<li><strong>Обновите переменные окружения</strong> :
Установите нужные значения для переменных окружения, добавив их в файл <code>/etc/default/locale</code>:</li>
</ol>
<pre><code class="lang-bash">sudo nano /etc/default/locale
</code></pre>
<p>Добавьте или измените следующие строки:</p>
<pre><code class="lang-plaintext">LANG=en_GB.UTF-8
LC_ALL=en_US.UTF-8
</code></pre>
<ol start="5">
<li><strong>Перезагрузите систему</strong> :
Перезагрузите Raspberry Pi, чтобы применить изменения:</li>
</ol>
<pre><code class="lang-bash">sudo reboot
</code></pre>
<p>После перезагрузки ошибки локали должны исчезнуть.</p>
<h2 id="heading-mk-49">MK:</h2>
<p><code>sudo rpi-eeprom-update -d -a</code> выдало </p>
<pre><code>BOOTLOADER: up to date
   <span class="hljs-attr">CURRENT</span>: Mon Sep <span class="hljs-number">23</span> <span class="hljs-number">01</span>:<span class="hljs-number">02</span>:<span class="hljs-number">56</span> PM UTC <span class="hljs-number">2024</span> (<span class="hljs-number">1727096576</span>)
    <span class="hljs-attr">LATEST</span>: Mon Sep <span class="hljs-number">23</span> <span class="hljs-number">01</span>:<span class="hljs-number">02</span>:<span class="hljs-number">56</span> PM UTC <span class="hljs-number">2024</span> (<span class="hljs-number">1727096576</span>)
   <span class="hljs-attr">RELEASE</span>: <span class="hljs-keyword">default</span> (<span class="hljs-regexp">/lib/</span>firmware/raspberrypi/bootloader<span class="hljs-number">-2712</span>/<span class="hljs-keyword">default</span>)
            Use raspi-config to change the release.
</code></pre><h2 id="heading-chatgpt-49">ChatGPT:</h2>
<p>Сообщение указывает, что версия загрузчика EEPROM уже обновлена и является актуальной, поэтому дополнительных действий по обновлению EEPROM не требуется.
Если Raspberry Pi по-прежнему загружается с SD-карты вместо SSD, стоит убедиться, что настройка загрузки с USB (или SSD) выбрана в <code>raspi-config</code>. Проверьте, не откатилась ли конфигурация на загрузку с SD-карты.Проверьте настройки загрузки через <code>raspi-config</code> </p>
<ol>
<li><strong>Откройте <code>raspi-config</code></strong> :</li>
</ol>
<pre><code class="lang-bash">sudo raspi-config
</code></pre>
<ol start="2">
<li><p><strong>Перейдите в "Advanced Options"</strong> : </p>
<ul>
<li><p>Выберите <strong>"Advanced Options"</strong>  &gt; <strong>"Boot Order"</strong> .</p>
</li>
<li><p>Убедитесь, что выбран вариант загрузки с USB, если доступен.</p>
</li>
</ul>
</li>
<li><p><strong>Сохраните и выйдите</strong> :</p>
<ul>
<li>Сохраните изменения и перезагрузите Raspberry Pi.</li>
</ul>
</li>
<li><p><strong>Попробуйте загрузиться без SD-карты</strong> :</p>
<ul>
<li>Извлеките SD-карту и перезапустите Raspberry Pi. Если он загружается с SSD, то настройка применена успешно.</li>
</ul>
</li>
</ol>
<p>Эти шаги помогут настроить загрузку с SSD, если EEPROM и другие настройки уже актуальны. Если устройство по-прежнему не загружается с SSD, это может указывать на проблему с копированием загрузочных файлов на SSD.</p>
<h2 id="heading-mk-50">MK:</h2>
<p>как продиагностировать почему загрузка происходит не с SSD а с SD?</p>
<h2 id="heading-chatgpt-50">ChatGPT:</h2>
<p>Чтобы продиагностировать, почему Raspberry Pi загружается с SD-карты, а не с SSD, можно последовательно проверить несколько ключевых моментов:</p>
<ol>
<li>**
Чтобы продиагностировать, почему Raspberry Pi загружается с SD-карты, а не с SSD, можно последовательно проверить несколько ключевых моментов:</li>
<li>Проверка правильности настройки загрузки с USB в <code>raspi-config</code>**  </li>
<li>Убедитесь, что в <strong>raspi-config</strong>  выбрана опция для загрузки с USB:</li>
</ol>
<pre><code class="lang-bash">sudo raspi-config
</code></pre>
<ul>
<li><p>Перейдите в <strong>Advanced Options</strong>  &gt; <strong>Boot Order</strong>  и выберите загрузку с USB (или аналогичный параметр, если он доступен).</p>
</li>
<li><p>Сохраните изменения и перезагрузите устройство.</p>
</li>
<li><strong>Проверка структуры и содержимого разделов на SSD</strong>  </li>
<li><p>Убедитесь, что на SSD правильно созданы загрузочный и корневой разделы и что оба раздела отформатированы в правильные файловые системы (<code>vfat</code> для загрузочного и <code>ext4</code> для корневого).</p>
</li>
<li><p>Выполните:</p>
</li>
</ul>
<pre><code class="lang-bash">lsblk
</code></pre>
<p>Убедитесь, что SSD (<code>/dev/nvme0n1p1</code> и <code>/dev/nvme0n1p2</code>) правильно разделен.</p>
<ol start="3">
<li><strong>Проверка загрузочных файлов на SSD</strong>  </li>
<li>Убедитесь, что загрузочные файлы находятся в разделе <code>/boot/firmware</code> на SSD. Выполните команду:</li>
</ol>
<pre><code class="lang-bash">ls /mnt/data/boot/firmware
</code></pre>
<ul>
<li>Если загрузочные файлы отсутствуют или папки <code>/boot/firmware</code> нет, это указывает на ошибку в копировании системы на SSD.</li>
<li>**
Чтобы продиагностировать, почему Raspberry Pi загружается с SD-карты, а не с SSD, можно последовательно проверить несколько ключевых моментов:</li>
<li>**
Чтобы продиагностировать, почему Raspberry Pi загружается с SD-карты, а не с SSD, можно последовательно проверить несколько ключевых моментов:</li>
<li>Проверка правильности настройки загрузки с USB в <code>raspi-config</code>**  </li>
<li>Убедитесь, что в <strong>raspi-config</strong>  выбрана опция для загрузки с USB:</li>
</ul>
<pre><code class="lang-bash">sudo raspi-config
</code></pre>
<ul>
<li><p>Перейдите в <strong>Advanced Options</strong>  &gt; <strong>Boot Order</strong>  и выберите загрузку с USB (или аналогичный параметр, если он доступен).</p>
</li>
<li><p>Сохраните изменения и перезагрузите устройство.</p>
</li>
<li><strong>Проверка структуры и содержимого разделов на SSD</strong>  </li>
<li><p>Убедитесь, что на SSD правильно созданы загрузочный и корневой разделы и что оба раздела отформатированы в правильные файловые системы (<code>vfat</code> для загрузочного и <code>ext4</code> для корневого).</p>
</li>
<li><p>Выполните:</p>
</li>
</ul>
<pre><code class="lang-bash">lsblk
</code></pre>
<p>Убедитесь, что SSD (<code>/dev/nvme0n1p1</code> и <code>/dev/nvme0n1p2</code>) правильно разделен.</p>
<ol start="3">
<li><strong>Проверка загрузочных файлов на SSD</strong>  </li>
<li>Убедитесь, что загрузочные файлы находятся в разделе <code>/boot/firmware</code> на SSD. Выполните команду:</li>
</ol>
<pre><code class="lang-bash">ls /mnt/data/boot/firmware
</code></pre>
<ul>
<li>Если загрузочные файлы отсутствуют или папки <code>/boot/firmware</code> нет, это указывает на ошибку в копировании системы на SSD.</li>
<li>Проверка конфигурации <code>fstab</code> на SSD**  </li>
<li><p>Откройте файл <code>/etc/fstab</code> на SSD (например, если SSD смонтирован в <code>/mnt/data</code>, то <code>nano /mnt/data/etc/fstab</code>) и убедитесь, что в нем используются правильные <code>PARTUUID</code> или <code>UUID</code> для разделов <code>/boot/firmware</code> и <code>/</code>.</p>
</li>
<li><p>Пример правильной записи:</p>
</li>
</ul>
<pre><code class="lang-plaintext">PARTUUID=&lt;для загрузочного раздела&gt; /boot/firmware vfat defaults 0 2
PARTUUID=&lt;для корневого раздела&gt; / ext4 defaults,noatime 0 1
</code></pre>
<ol start="5">
<li><strong>Извлечение SD-карты и попытка загрузки с SSD напрямую</strong> </li>
<li><p>Попробуйте полностью удалить SD-карту и перезапустить Raspberry Pi, чтобы он попытался загрузиться с SSD напрямую.</p>
</li>
<li><p>Если Pi не загружается и остается без активности, это может указывать на проблему с конфигурацией SSD.</p>
</li>
<li><strong>Просмотр загрузочных логов на SD-карте</strong>  </li>
<li>Если Raspberry Pi снова загружается с SD-карты, можно просмотреть логи загрузки для обнаружения ошибок:</li>
</ol>
<pre><code class="lang-bash">sudo dmesg | grep -i <span class="hljs-string">"usb"</span>
</code></pre>
<ul>
<li>Это покажет, видит ли система SSD и пытается ли она его использовать при загрузке.</li>
</ul>
<p>Эти шаги помогут обнаружить, почему Raspberry Pi продолжает загружаться с SD-карты.</p>
<h2 id="heading-mk-51">MK:</h2>
<pre><code>$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
mmcblk0     <span class="hljs-number">179</span>:<span class="hljs-number">0</span>    <span class="hljs-number">0</span> <span class="hljs-number">119.1</span>G  <span class="hljs-number">0</span> disk
├─mmcblk0p1 <span class="hljs-number">179</span>:<span class="hljs-number">1</span>    <span class="hljs-number">0</span>   <span class="hljs-number">512</span>M  <span class="hljs-number">0</span> part /boot/firmware
└─mmcblk0p2 <span class="hljs-number">179</span>:<span class="hljs-number">2</span>    <span class="hljs-number">0</span> <span class="hljs-number">118.6</span>G  <span class="hljs-number">0</span> part /
nvme0n1     <span class="hljs-number">259</span>:<span class="hljs-number">0</span>    <span class="hljs-number">0</span>   <span class="hljs-number">3.7</span>T  <span class="hljs-number">0</span> disk
├─nvme0n1p1 <span class="hljs-number">259</span>:<span class="hljs-number">1</span>    <span class="hljs-number">0</span>   <span class="hljs-number">512</span>M  <span class="hljs-number">0</span> part
└─nvme0n1p2 <span class="hljs-number">259</span>:<span class="hljs-number">2</span>    <span class="hljs-number">0</span>   <span class="hljs-number">3.7</span>T  <span class="hljs-number">0</span> part
</code></pre><h2 id="heading-chatgpt-51">ChatGPT:</h2>
<p>Согласно выводу <code>lsblk</code>, SSD (<code>nvme0n1</code>) действительно подключен и разделен на два раздела: </p>
<ul>
<li><p><strong>nvme0n1p1</strong>  — загрузочный раздел (512 MB, без точки монтирования)</p>
</li>
<li><p><strong>nvme0n1p2</strong>  — основной раздел (3.7 TB, также без точки монтирования)</p>
</li>
</ul>
<h3 id="heading-diagnostika-vozmozhnyh-prichin-zagruzki-s-sd-karty-vmesto-ssd">Диагностика возможных причин загрузки с SD-карты вместо SSD</h3>
<ol>
<li><p><strong>Проверьте наличие загрузочных файлов на SSD</strong> : </p>
<ul>
<li><p>Убедитесь, что загрузочные файлы действительно находятся на разделе <code>/dev/nvme0n1p1</code>.</p>
</li>
<li><p>Смонтируйте этот раздел и проверьте его содержимое:</p>
</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo mount /dev/nvme0n1p1 /mnt
ls /mnt
</code></pre>
<ul>
<li>В каталоге <code>/mnt</code> должны быть файлы, такие как <code>config.txt</code>, <code>cmdline.txt</code>, и каталог <code>firmware</code>. Если они отсутствуют, загрузочные файлы, скорее всего, не были корректно скопированы.</li>
</ul>
<ol start="2">
<li><p><strong>Проверьте правильность <code>fstab</code> на SSD</strong> : </p>
<ul>
<li><p>Если загрузочные файлы на месте, откройте файл <code>/etc/fstab</code> на SSD и проверьте, что записи для <code>/boot/firmware</code> и <code>/</code> соответствуют <code>PARTUUID</code> или <code>UUID</code> на SSD.</p>
</li>
<li><p>Сначала смонтируйте корневой раздел SSD:</p>
</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo mount /dev/nvme0n1p2 /mnt
</code></pre>
<ul>
<li>Затем проверьте файл <code>fstab</code>:</li>
</ul>
<pre><code class="lang-bash">sudo nano /mnt/etc/fstab
</code></pre>
<ul>
<li>Убедитесь, что там используются корректные <code>PARTUUID</code> или <code>UUID</code> для разделов SSD, которые вы можете получить с помощью:</li>
</ul>
<pre><code class="lang-bash">sudo blkid
</code></pre>
<ol start="3">
<li><p><strong>Попробуйте загрузиться без SD-карты</strong> :</p>
<ul>
<li>Если все настройки верны, попробуйте удалить SD-карту и перезапустить Pi, чтобы загрузиться с SSD.</li>
</ul>
</li>
<li><p><strong>Проверка поддержки загрузки с USB/SSD в <code>raspi-config</code></strong> : </p>
<ul>
<li>Если Raspberry Pi не загружается с SSD, подключите SD-карту снова и убедитесь, что загрузка с USB включена в <code>raspi-config</code>:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo raspi-config
</code></pre>
<ul>
<li>Перейдите в <strong>Advanced Options</strong>  &gt; <strong>Boot Order</strong>  и установите USB как приоритетный вариант загрузки.</li>
</ul>
<ol start="5">
<li><strong>Просмотр загрузочных логов</strong> :
Если после всех шагов загрузка все еще происходит с SD-карты, просмотрите загрузочные логи, чтобы понять, видит ли Raspberry Pi SSD при загрузке:</li>
</ol>
<pre><code class="lang-bash">dmesg | grep -i <span class="hljs-string">"usb\|nvme"</span>
</code></pre>
<p>Эти шаги помогут найти причину, по которой загрузка происходит с SD-карты, и попытаться устранить ее.</p>
<h2 id="heading-mk-52">MK:</h2>
<pre><code>$ ls /mnt
cmdline.txt                firmware                       overlays                       vmlinuz<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v7
config<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v6   initrd.img<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v6   System.map<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v6   vmlinuz<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v7l
config<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v7   initrd.img<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v7   System.map<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v7   vmlinuz<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v8
config<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v7l  initrd.img<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v7l  System.map<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v7l  vmlinuz<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v6
config<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v8   initrd.img<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v8   System.map<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v8   vmlinuz<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v7
config<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v6   initrd.img<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v6   System.map<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v6   vmlinuz<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v7l
config<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v7   initrd.img<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v7   System.map<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v7
config<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v7l  initrd.img<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v7l  System.map<span class="hljs-number">-6.6</span><span class="hljs-number">.51</span>+rpt-rpi-v7l
config.txt                 issue.txt                      vmlinuz<span class="hljs-number">-6.6</span><span class="hljs-number">.31</span>+rpt-rpi-v6
</code></pre><h2 id="heading-chatgpt-52">ChatGPT:</h2>
<p>Содержимое раздела <code>/mnt</code> на SSD выглядит корректно: здесь присутствуют необходимые загрузочные файлы (<code>cmdline.txt</code>, <code>config.txt</code>, каталоги <code>firmware</code>, <code>overlays</code> и ядро). Это значит, что загрузочная область на SSD настроена правильно.</p>
<h3 id="heading-dalnejshie-shagi-dlya-diagnostiki">Дальнейшие шаги для диагностики</h3>
<ol>
<li><p><strong>Проверьте файл <code>cmdline.txt</code> на SSD</strong> : </p>
<ul>
<li><p>Файл <code>cmdline.txt</code> должен указывать правильный корневой раздел для загрузки (на SSD, а не на SD-карте).</p>
</li>
<li><p>Откройте <code>cmdline.txt</code> и убедитесь, что он указывает на <code>PARTUUID</code> корневого раздела SSD (<code>/dev/nvme0n1p2</code>):</p>
</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo nano /mnt/cmdline.txt
</code></pre>
<ul>
<li>Убедитесь, что строка содержит примерно следующее (заменив <code>PARTUUID</code> на правильный идентификатор SSD):</li>
</ul>
<pre><code class="lang-plaintext">root=PARTUUID=&lt;PARTUUID-SSD-корня&gt; rootfstype=ext4 rootwait
</code></pre>
<ol start="2">
<li><strong>Убедитесь, что <code>fstab</code> на SSD настроен корректно</strong> : <ul>
<li>Проверьте, что файл <code>/etc/fstab</code> на SSD содержит <code>PARTUUID</code> для обоих разделов SSD.</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo nano /mnt/etc/fstab
</code></pre>
<ul>
<li>Например:</li>
</ul>
<pre><code class="lang-plaintext">PARTUUID=&lt;PARTUUID-SSD-загрузочного-раздела&gt; /boot/firmware vfat defaults 0 2
PARTUUID=&lt;PARTUUID-SSD-корня&gt; / ext4 defaults,noatime 0 1
</code></pre>
<ol start="3">
<li><p><strong>Попробуйте загрузиться без SD-карты</strong> :</p>
<ul>
<li>Извлеките SD-карту, чтобы проверить, сможет ли Pi загрузиться с SSD.</li>
</ul>
</li>
<li><p><strong>Проверьте приоритет загрузки в <code>raspi-config</code></strong> : </p>
<ul>
<li>Введите команду:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo raspi-config
</code></pre>
<ul>
<li>Убедитесь, что загрузка с USB установлена как предпочтительная.</li>
</ul>
<ol start="5">
<li><strong>Просмотр загрузочных логов</strong> :
Если загрузка снова происходит с SD-карты, подключите её и просмотрите логи загрузки, чтобы узнать, почему Raspberry Pi не смог загрузиться с SSD:</li>
</ol>
<pre><code class="lang-bash">dmesg | grep -i <span class="hljs-string">"usb\|nvme\|boot"</span>
</code></pre>
<p>Эти шаги помогут окончательно подтвердить, что Raspberry Pi готов к загрузке с SSD, и выявить любые оставшиеся проблемы.</p>
<h2 id="heading-mk-53">MK:</h2>
<p>Вот вывод команд:</p>
<pre><code>$ sudo blkid
/dev/nvme0n1p1: LABEL_FATBOOT=<span class="hljs-string">"BOOT"</span> LABEL=<span class="hljs-string">"BOOT"</span> UUID=<span class="hljs-string">"2F51-0FC4"</span> BLOCK_SIZE=<span class="hljs-string">"512"</span> TYPE=<span class="hljs-string">"vfat"</span> PARTLABEL=<span class="hljs-string">"primary"</span> PARTUUID=<span class="hljs-string">"5bc56100-6604-41d5-bc2c-0b96873b614c"</span>
/dev/nvme0n1p2: UUID=<span class="hljs-string">"fa358c9a-82aa-4130-a985-11d3054e92ca"</span> BLOCK_SIZE=<span class="hljs-string">"4096"</span> TYPE=<span class="hljs-string">"ext4"</span> PARTLABEL=<span class="hljs-string">"primary"</span> PARTUUID=<span class="hljs-string">"7feb6627-f90d-4a8a-bc77-420d559b6dda"</span>
/dev/mmcblk0p1: LABEL_FATBOOT=<span class="hljs-string">"bootfs"</span> LABEL=<span class="hljs-string">"bootfs"</span> UUID=<span class="hljs-string">"9F76-08A2"</span> BLOCK_SIZE=<span class="hljs-string">"512"</span> TYPE=<span class="hljs-string">"vfat"</span> PARTUUID=<span class="hljs-string">"e837c8f2-01"</span>
/dev/mmcblk0p2: LABEL=<span class="hljs-string">"rootfs"</span> UUID=<span class="hljs-string">"4d48c72f-b919-4823-96cc-04d8e6dcc211"</span> BLOCK_SIZE=<span class="hljs-string">"4096"</span> TYPE=<span class="hljs-string">"ext4"</span> PARTUUID=<span class="hljs-string">"e837c8f2-02"</span>

$ cat /mnt/etc/fstab
proc            /proc           proc    defaults          <span class="hljs-number">0</span>       <span class="hljs-number">0</span>
PARTUUID=<span class="hljs-number">5</span>bc56100<span class="hljs-number">-6604</span><span class="hljs-number">-41</span>d5-bc2c<span class="hljs-number">-0</span>b96873b614c  /boot/firmware  vfat    defaults          <span class="hljs-number">0</span>       <span class="hljs-number">2</span>
PARTUUID=<span class="hljs-number">7</span>feb6627-f90d<span class="hljs-number">-4</span>a8a-bc77<span class="hljs-number">-420</span>d559b6dda  /               ext4    defaults,noatime  <span class="hljs-number">0</span>       <span class="hljs-number">1</span>
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  <span class="hljs-keyword">for</span> that
</code></pre><h2 id="heading-chatgpt-53">ChatGPT:</h2>
<p>Судя по выводу команд:</p>
<ol>
<li><p><strong>Разделы и <code>PARTUUID</code> в <code>fstab</code> настроены корректно</strong> : </p>
<ul>
<li><code>PARTUUID</code> для <code>/boot/firmware</code> и <code>/</code> в <code>fstab</code> совпадают с теми, которые указаны для SSD (<code>nvme0n1p1</code> и <code>nvme0n1p2</code>), что должно позволять загрузку с SSD.</li>
</ul>
</li>
<li><p><strong>Дальнейшие шаги для подтверждения настройки</strong> : </p>
<ul>
<li><strong>Проверьте <code>cmdline.txt</code></strong>  на SSD, чтобы убедиться, что он указывает правильный <code>PARTUUID</code> корневого раздела на SSD (<code>7feb6627-f90d-4a8a-bc77-420d559b6dda</code>):</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo nano /mnt/cmdline.txt
</code></pre>
<ul>
<li><code>cmdline.txt</code> должен содержать строку примерно такого вида:</li>
</ul>
<pre><code class="lang-plaintext">root=PARTUUID=7feb6627-f90d-4a8a-bc77-420d559b6dda rootfstype=ext4 rootwait
</code></pre>
<ol start="3">
<li><p><strong>Удалите SD-карту и перезапустите Raspberry Pi</strong> :</p>
<ul>
<li>Попробуйте загрузиться без SD-карты. Если Raspberry Pi загружается с SSD, настройка прошла успешно.</li>
</ul>
</li>
<li><p><strong>Если загрузка с SSD не происходит</strong> , подключите SD-карту и снова проверьте логи загрузки, чтобы определить, почему загрузка не удалась:</p>
</li>
</ol>
<pre><code class="lang-bash">dmesg | grep -i <span class="hljs-string">"usb\|nvme\|boot"</span>
</code></pre>
<p>Эти шаги помогут выявить причину, если Raspberry Pi по-прежнему загружается с SD-карты.</p>
<h2 id="heading-mk-54">MK:</h2>
<p>Сделал</p>
<p>$ sudo mount /dev/nvme0n1p1 /mnt/boot</p>
<p>$ cat /mnt/boot/cmdline.txt
DO NOT EDIT THIS FILE</p>
<p>The file you are looking for has moved to /boot/firmware/cmdline.txt</p>
<h2 id="heading-chatgpt-54">ChatGPT:</h2>
<p>Файл <code>cmdline.txt</code> на вашем Raspberry Pi перенесен в <code>/boot/firmware/cmdline.txt</code>, что объясняет сообщение. Теперь нужно проверить и, при необходимости, отредактировать его именно в этом расположении на SSD.Шаги для редактирования <code>cmdline.txt</code> на SSD </p>
<ol>
<li><strong>Перейдите к нужному файлу <code>cmdline.txt</code></strong> : <ul>
<li>Откройте файл <code>/boot/firmware/cmdline.txt</code> на SSD:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo nano /mnt/boot/firmware/cmdline.txt
</code></pre>
<ol start="2">
<li><strong>Проверьте и отредактируйте строку корневого раздела</strong> : <ul>
<li>Убедитесь, что параметр <code>root=</code> указывает на <code>PARTUUID</code> вашего корневого раздела на SSD (<code>7feb6627-f90d-4a8a-bc77-420d559b6dda</code>):</li>
</ul>
</li>
</ol>
<pre><code class="lang-plaintext">root=PARTUUID=7feb6627-f90d-4a8a-bc77-420d559b6dda rootfstype=ext4 rootwait
</code></pre>
<ol start="3">
<li><p><strong>Сохраните изменения и перезапустите Raspberry Pi без SD-карты</strong> : </p>
<ul>
<li><p>Нажмите <code>Ctrl + O</code>, затем <code>Enter</code>, чтобы сохранить файл, и <code>Ctrl + X</code>, чтобы выйти.</p>
</li>
<li><p>Извлеките SD-карту и перезагрузите Raspberry Pi, чтобы проверить, загрузится ли он с SSD.</p>
</li>
</ul>
</li>
</ol>
<p>Эти изменения должны помочь системе правильно определить корневой раздел на SSD и загрузиться с него.</p>
<h2 id="heading-mk-55">MK:</h2>
<p> <code>$ ls /mnt/boot/firmware/</code> ничего не выдает. Похоже эта директория пустая. Видимо она почему-то не скопировалась</p>
<h2 id="heading-chatgpt-55">ChatGPT:</h2>
<p>Если директория <code>/mnt/boot/firmware/</code> на SSD пуста, это объясняет, почему Raspberry Pi продолжает загружаться с SD-карты — ключевые загрузочные файлы, вероятно, отсутствуют. Нужно скопировать эти файлы с SD-карты на SSD.</p>
<h3 id="heading-shagi-dlya-kopirovaniya-zagruzochnyh-fajlov">Шаги для копирования загрузочных файлов</h3>
<ol>
<li><strong>Создайте точку монтирования и смонтируйте загрузочный раздел SD-карты</strong>  (если он ещё не смонтирован):</li>
</ol>
<pre><code class="lang-bash">sudo mount /dev/mmcblk0p1 /mnt/boot_sd
</code></pre>
<ol start="2">
<li><strong>Скопируйте содержимое загрузочного раздела с SD-карты на SSD</strong> : <ul>
<li>Теперь выполните копирование с помощью <code>rsync</code>, чтобы захватить все файлы и папки:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo rsync -av /mnt/boot_sd/ /mnt/boot/
</code></pre>
<ul>
<li>Эта команда скопирует всё содержимое с загрузочного раздела SD-карты в <code>/boot/firmware</code> на SSD, сохраняя права доступа и структуру каталогов.</li>
</ul>
<ol start="3">
<li><strong>Проверьте наличие файла <code>cmdline.txt</code></strong> : <ul>
<li>После копирования убедитесь, что <code>cmdline.txt</code> и другие файлы, такие как <code>config.txt</code>, присутствуют:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">ls /mnt/boot/firmware
</code></pre>
<ol start="4">
<li><strong>Проверьте, что <code>cmdline.txt</code> настроен правильно</strong> : <ul>
<li>Откройте файл <code>/mnt/boot/firmware/cmdline.txt</code> и проверьте, что параметр <code>root=</code> указывает на <code>PARTUUID</code> корневого раздела на SSD:</li>
</ul>
</li>
</ol>
<pre><code class="lang-plaintext">root=PARTUUID=7feb6627-f90d-4a8a-bc77-420d559b6dda rootfstype=ext4 rootwait
</code></pre>
<ol start="5">
<li><strong>Перезагрузитесь и попробуйте загрузиться без SD-карты</strong> .</li>
</ol>
<p>Эти действия должны обеспечить наличие всех необходимых загрузочных файлов на SSD.</p>
<h2 id="heading-mk-56">MK:</h2>
<p><code>sudo rsync -av /mnt/boot_sd/ /mnt/boot/</code> все равно создает пустую директорию /boot/firmware, мне кажется что из-за невозможности создать симлинки</p>
<h2 id="heading-chatgpt-56">ChatGPT:</h2>
<p>Да, <code>rsync</code> может не работать с символическими ссылками на файловой системе <code>FAT32</code>, которая используется для загрузочного раздела на SSD. Поскольку FAT32 не поддерживает символические ссылки, они будут пропущены или приведут к пустым каталогам.</p>
<h3 id="heading-reshenie-kopirovanie-bez-simvolicheskih-ssylok">Решение: Копирование без символических ссылок</h3>
<p>Чтобы обойти это ограничение, скопируем файлы, игнорируя символические ссылки, или преобразуем ссылки в обычные файлы. Вот как это можно сделать:</p>
<ol>
<li><strong>Использование <code>rsync</code> с опцией <code>--no-links</code></strong> : <ul>
<li>Эта команда скопирует файлы, пропуская символические ссылки, что позволит избежать создания пустых каталогов:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo rsync -av --no-links /mnt/boot_sd/ /mnt/boot/
</code></pre>
<ul>
<li>Так <code>rsync</code> скопирует все файлы и каталоги, игнорируя символические ссылки.</li>
</ul>
<ol start="2">
<li><strong>Или: Использование <code>--copy-links</code> для преобразования символических ссылок в обычные файлы</strong> : <ul>
<li>Если важны содержимое ссылок, можно преобразовать символические ссылки в файлы, используя опцию <code>--copy-links</code>:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo rsync -av --copy-links /mnt/boot_sd/ /mnt/boot/
</code></pre>
<p>После выполнения команды проверьте содержимое <code>/mnt/boot/firmware</code>, чтобы убедиться, что все необходимые файлы скопированы.</p>
<h2 id="heading-mk-57">MK:</h2>
<p>Команда выполняется моментально </p>
<pre><code>$ sudo rsync -av --copy-links /mnt/boot_sd/ <span class="hljs-regexp">/mnt/</span>boot/
sending incremental file list

sent <span class="hljs-number">7</span>,<span class="hljs-number">293</span> bytes  received <span class="hljs-number">13</span> bytes  <span class="hljs-number">14</span>,<span class="hljs-number">612.00</span> bytes/sec
total size is <span class="hljs-number">100</span>,<span class="hljs-number">339</span>,<span class="hljs-number">825</span>  speedup is <span class="hljs-number">13</span>,<span class="hljs-number">733.89</span>
</code></pre><h2 id="heading-chatgpt-57">ChatGPT:</h2>
<p>Судя по выводу, команда <code>rsync</code> не скопировала содержимое, хотя общий размер данных на SD-карте составляет около 100 MB. Похоже, что на SSD данные либо не записываются, либо копируются неправильно. Чтобы исключить возможные причины, попробуйте следующие шаги:1. <strong>Проверьте монтирование разделов</strong> </p>
<ul>
<li><p>Убедитесь, что SD-карта и SSD правильно смонтированы.</p>
</li>
<li><p>Для SD-карты:</p>
</li>
</ul>
<pre><code class="lang-bash">df -h /mnt/boot_sd
</code></pre>
<ul>
<li>Для SSD:</li>
</ul>
<pre><code class="lang-bash">df -h /mnt/boot
</code></pre>
<ul>
<li>Убедитесь, что оба пути смонтированы и не указывают на один и тот же диск.</li>
<li><strong>Судя по выводу, команда <code>rsync</code> не скопировала содержимое, хотя общий размер данных на SD-карте составляет около 100 MB. Похоже, что на SSD данные либо не записываются, либо копируются неправильно. Чтобы исключить возможные причины, попробуйте следующие шаги:1. </strong>Проверьте монтирование разделов** </li>
<li><p>Убедитесь, что SD-карта и SSD правильно смонтированы.</p>
</li>
<li><p>Для SD-карты:</p>
</li>
</ul>
<pre><code class="lang-bash">df -h /mnt/boot_sd
</code></pre>
<ul>
<li>Для SSD:</li>
</ul>
<pre><code class="lang-bash">df -h /mnt/boot
</code></pre>
<ul>
<li>Убедитесь, что оба пути смонтированы и не указывают на один и тот же диск.</li>
<li>Повторите копирование с явным указанием каталога <code>firmware</code>** Иногда помогает указать целевой каталог более явно, чтобы <code>rsync</code> корректно создал все подкаталоги:</li>
</ul>
<pre><code class="lang-bash">sudo rsync -av --copy-links /mnt/boot_sd/ /mnt/boot/firmware/
</code></pre>
<ol start="3">
<li><strong>Судя по выводу, команда <code>rsync</code> не скопировала содержимое, хотя общий размер данных на SD-карте составляет около 100 MB. Похоже, что на SSD данные либо не записываются, либо копируются неправильно. Чтобы исключить возможные причины, попробуйте следующие шаги:1. </strong>Проверьте монтирование разделов** </li>
<li><p>Убедитесь, что SD-карта и SSD правильно смонтированы.</p>
</li>
<li><p>Для SD-карты:</p>
</li>
</ol>
<pre><code class="lang-bash">df -h /mnt/boot_sd
</code></pre>
<ul>
<li>Для SSD:</li>
</ul>
<pre><code class="lang-bash">df -h /mnt/boot
</code></pre>
<ul>
<li>Убедитесь, что оба пути смонтированы и не указывают на один и тот же диск.</li>
<li><strong>Судя по выводу, команда <code>rsync</code> не скопировала содержимое, хотя общий размер данных на SD-карте составляет около 100 MB. Похоже, что на SSD данные либо не записываются, либо копируются неправильно. Чтобы исключить возможные причины, попробуйте следующие шаги:1. </strong>Проверьте монтирование разделов** </li>
<li><p>Убедитесь, что SD-карта и SSD правильно смонтированы.</p>
</li>
<li><p>Для SD-карты:</p>
</li>
</ul>
<pre><code class="lang-bash">df -h /mnt/boot_sd
</code></pre>
<ul>
<li>Для SSD:</li>
</ul>
<pre><code class="lang-bash">df -h /mnt/boot
</code></pre>
<ul>
<li>Убедитесь, что оба пути смонтированы и не указывают на один и тот же диск.</li>
<li>Повторите копирование с явным указанием каталога <code>firmware</code>** Иногда помогает указать целевой каталог более явно, чтобы <code>rsync</code> корректно создал все подкаталоги:</li>
</ul>
<pre><code class="lang-bash">sudo rsync -av --copy-links /mnt/boot_sd/ /mnt/boot/firmware/
</code></pre>
<ol start="3">
<li>Попробуйте команду <code>cp</code> для копирования** Если <code>rsync</code> не работает, используйте <code>cp</code> для рекурсивного копирования без создания символических ссылок:</li>
</ol>
<pre><code class="lang-bash">sudo cp -r /mnt/boot_sd/* /mnt/boot/firmware/
</code></pre>
<p>Проверьте результат с помощью команды <code>ls /mnt/boot/firmware</code>, чтобы убедиться, что все необходимые файлы скопированы.</p>
<h2 id="heading-mk-58">MK:</h2>
<pre><code>total size is <span class="hljs-number">100</span>,<span class="hljs-number">339</span>,<span class="hljs-number">825</span>  speedup is <span class="hljs-number">1.00</span>
xen@pi:~ $ df -h /mnt/boot_sd
Filesystem      Size  Used Avail Use% Mounted on
/dev/mmcblk0p1  <span class="hljs-number">510</span>M   <span class="hljs-number">97</span>M  <span class="hljs-number">414</span>M  <span class="hljs-number">19</span>% <span class="hljs-regexp">/mnt/</span>boot_sd
xen@pi:~ $ df -h /mnt/boot
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p1  <span class="hljs-number">511</span>M  <span class="hljs-number">320</span>M  <span class="hljs-number">192</span>M  <span class="hljs-number">63</span>% <span class="hljs-regexp">/mnt/</span>boot
</code></pre><h2 id="heading-chatgpt-58">ChatGPT:</h2>
<p>Судя по выводу, содержимое действительно скопировано на SSD, так как загрузочный раздел SSD (<code>/dev/nvme0n1p1</code>) теперь использует 320 MB, что близко к использованию на SD-карте (97 MB). Однако различие в размере может объясняться тем, что символические ссылки были преобразованы в файлы, что увеличило общий объем.</p>
<h3 id="heading-zaklyuchitelnye-proverki">Заключительные проверки</h3>
<ol>
<li><strong>Проверьте содержимое директории <code>/mnt/boot/firmware</code></strong> :
Убедитесь, что все нужные файлы действительно на месте:</li>
</ol>
<pre><code class="lang-bash">ls -l /mnt/boot/firmware
</code></pre>
<ol start="2">
<li><strong>Проверьте <code>cmdline.txt</code></strong> :
Откройте файл <code>/mnt/boot/firmware/cmdline.txt</code>, чтобы убедиться, что параметр <code>root=</code> указывает на <code>PARTUUID</code> корневого раздела SSD (<code>7feb6627-f90d-4a8a-bc77-420d559b6dda</code>):</li>
</ol>
<pre><code class="lang-bash">sudo nano /mnt/boot/firmware/cmdline.txt
</code></pre>
<ol start="3">
<li><strong>Извлеките SD-карту и перезагрузите</strong> :
Теперь, когда содержимое загрузочного раздела перенесено на SSD, попробуйте загрузиться без SD-карты, чтобы убедиться, что Raspberry Pi правильно загружается с SSD.</li>
</ol>
<p>Если загрузка все еще происходит с SD-карты, значит, потребуется просмотреть логи загрузки или дополнительные настройки.</p>
<h2 id="heading-mk-59">MK:</h2>
<p>после загрузки без SD выдало много раз сообщение </p>
<p>Begin: Running /scripts/local-block ... done</p>
<h2 id="heading-chatgpt-59">ChatGPT:</h2>
<p>Сообщение <code>Begin: Running /scripts/local-block ... done</code> указывает на то, что Raspberry Pi не может найти корневой файловой системы для загрузки и многократно пытается её обнаружить. Это обычно происходит, если <code>cmdline.txt</code> или <code>fstab</code> на SSD неправильно указывает местоположение корневого раздела.</p>
<h3 id="heading-vozmozhnye-prichiny-i-resheniya">Возможные причины и решения</h3>
<ol>
<li><p><strong>Проверьте <code>cmdline.txt</code></strong> :
Возможно, корневой раздел не был указан правильно. Выполните следующие шаги:</p>
<ul>
<li><p>Подключите SD-карту и загрузитесь в систему.</p>
</li>
<li><p>Смонтируйте SSD:</p>
</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo mount /dev/nvme0n1p1 /mnt/boot
sudo mount /dev/nvme0n1p2 /mnt
</code></pre>
<ul>
<li>Откройте файл <code>cmdline.txt</code>:</li>
</ul>
<pre><code class="lang-bash">sudo nano /mnt/boot/firmware/cmdline.txt
</code></pre>
<ul>
<li>Убедитесь, что строка начинается с:</li>
</ul>
<pre><code class="lang-plaintext">root=PARTUUID=7feb6627-f90d-4a8a-bc77-420d559b6dda rootfstype=ext4 rootwait
</code></pre>
<p>Замените <code>7feb6627-f90d-4a8a-bc77-420d559b6dda</code> на ваш <code>PARTUUID</code>, если он отличается, и убедитесь, что <code>rootwait</code> присутствует в конце строки.</p>
<ol start="2">
<li><strong>Проверьте <code>/etc/fstab</code> на SSD</strong> :
Откройте <code>/etc/fstab</code> на SSD и убедитесь, что записи для корневого и загрузочного разделов используют правильные <code>PARTUUID</code>:</li>
</ol>
<pre><code class="lang-bash">sudo nano /mnt/etc/fstab
</code></pre>
<p>Убедитесь, что <code>/boot/firmware</code> и <code>/</code> используют те же <code>PARTUUID</code>, что и в <code>cmdline.txt</code>.</p>
<ol start="3">
<li><strong>Попробуйте снова загрузиться с SSD</strong> :<ul>
<li>Сохраните изменения, извлеките SD-карту и перезапустите Raspberry Pi.</li>
</ul>
</li>
</ol>
<p>Эти настройки помогут устранить проблему, если она связана с неправильными ссылками на корневой раздел.</p>
<h2 id="heading-mk-60">MK:</h2>
<p>как можно в консоли проскролить без мышки только с клавиатурой подключенной к pi?</p>
<h2 id="heading-chatgpt-60">ChatGPT:</h2>
<p>В консоли Raspberry Pi без мышки можно прокручивать экран с помощью сочетаний клавиш, которые позволяют перемещаться по тексту и журналам:</p>
<ol>
<li><p><strong>Использование <code>Shift + Page Up/Page Down</code></strong> : </p>
<ul>
<li><p>Нажмите <code>Shift + Page Up</code> для прокрутки вверх.</p>
</li>
<li><p>Нажмите <code>Shift + Page Down</code> для прокрутки вниз.</p>
</li>
<li><p>Это позволяет скроллить текст на экране терминала вверх или вниз на одну страницу.</p>
</li>
</ul>
</li>
<li><p><strong>Использование <code>less</code> для просмотра длинного вывода</strong> :
Если вы используете команды с длинным выводом (например, <code>dmesg</code>), можно передавать вывод в <code>less</code>, чтобы прокручивать его по строчкам:</p>
</li>
</ol>
<pre><code class="lang-bash">dmesg | less
</code></pre>
<ul>
<li><p>Нажмите <code>Space</code>, чтобы перейти на следующую страницу.</p>
</li>
<li><p>Нажмите <code>b</code>, чтобы вернуться на страницу вверх.</p>
</li>
<li><p>Используйте клавиши со стрелками для перемещения построчно.</p>
</li>
</ul>
<ol start="3">
<li><strong>Использование <code>screen</code> или <code>tmux</code> для более продвинутого управления</strong> :
Если у вас установлены <code>screen</code> или <code>tmux</code>, они позволяют сохранять буфер вывода, прокручивать и даже открывать несколько окон.</li>
</ol>
<h2 id="heading-mk-61">MK:</h2>
<p>Shift + Page Up/Page Down не работает</p>
<h2 id="heading-chatgpt-61">ChatGPT:</h2>
<p>Если <code>Shift + Page Up/Page Down</code> не работает, возможно, ваш терминал не поддерживает эту функцию. В этом случае можно использовать другие методы для прокрутки вывода:</p>
<h3 id="heading-alternativnye-sposoby-prosmotra-dlinnogo-vyvoda">Альтернативные способы просмотра длинного вывода</h3>
<ol>
<li><strong>Использование команды <code>less</code> или <code>more</code></strong> : <ul>
<li>Если вы хотите просмотреть длинный вывод команды, отправьте его в <code>less</code>, что позволит прокручивать текст:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">dmesg | less
</code></pre>
<ul>
<li><p>Используйте: </p>
<ul>
<li><p>Клавиши <code>стрелка вверх</code> и <code>стрелка вниз</code> для построчного прокручивания.</p>
</li>
<li><p>Клавишу <code>Space</code> для перехода на следующую страницу.</p>
</li>
<li><p>Клавишу <code>b</code> для возвращения на предыдущую страницу.</p>
</li>
<li><p>Для выхода нажмите <code>q</code>.</p>
</li>
</ul>
</li>
</ul>
<ol start="2">
<li><strong>Использование команды <code>dmesg</code> с опцией <code>| tail -n</code> для просмотра последних строк</strong> : <ul>
<li>Если вам нужно увидеть только последние строки:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">dmesg | tail -n 50
</code></pre>
<ul>
<li>Это покажет последние 50 строк. Вы можете изменить <code>50</code> на любое другое количество.</li>
</ul>
<ol start="3">
<li><strong>Запись вывода в файл для дальнейшего просмотра</strong> : <ul>
<li>Запишите вывод команды в файл, чтобы потом его можно было просмотреть с помощью <code>less</code>:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">dmesg &gt; dmesg_output.txt
less dmesg_output.txt
</code></pre>
<p>Эти методы позволят вам прокручивать и просматривать длинный вывод на консоли.</p>
<h2 id="heading-mk-62">MK:</h2>
<p>как мне увидеть лог загрузки pi после того как он ушел вверх?</p>
<h2 id="heading-chatgpt-62">ChatGPT:</h2>
<p>Чтобы увидеть логи загрузки, которые "ушли вверх" и больше не видны на экране, можно воспользоваться командой <code>dmesg</code> или просмотреть системные логи, которые сохраняют информацию о процессе загрузки.1. <strong>Чтобы увидеть логи загрузки, которые "ушли вверх" и больше не видны на экране, можно воспользоваться командой <code>dmesg</code> или просмотреть системные логи, которые сохраняют информацию о процессе загрузки.1. Просмотр лога загрузки с помощью <code>dmesg</code></strong> Команда <code>dmesg</code> показывает системные сообщения, включая процесс загрузки. Вы можете использовать её для просмотра всех сообщений или только последних строк:</p>
<pre><code class="lang-bash">dmesg | less
</code></pre>
<p>Это откроет вывод <code>dmesg</code> в программе <code>less</code>, где можно перемещаться с помощью клавиш <code>стрелка вверх/вниз</code>, <code>Space</code> и <code>b</code> для перехода по страницам.2. <strong>Просмотр системных логов</strong> На Raspberry Pi с системами на базе <code>systemd</code> загрузочные логи также записываются в <code>/var/log</code>. Важно отметить, что файлы могут отличаться в зависимости от конфигурации, но обычно важные логи находятся в следующих файлах: </p>
<ul>
<li><strong>Основной системный лог</strong> :</li>
</ul>
<pre><code class="lang-bash">sudo cat /var/<span class="hljs-built_in">log</span>/syslog | less
</code></pre>
<p><code>syslog</code> содержит общие системные сообщения, включая сообщения, связанные с загрузкой.</p>
<ul>
<li><strong>Журнал ядра</strong> :</li>
</ul>
<pre><code class="lang-bash">sudo cat /var/<span class="hljs-built_in">log</span>/kern.log | less
</code></pre>
<p><code>kern.log</code> содержит сообщения ядра, включая ошибки и предупреждения, возникшие при загрузке.</p>
<ol start="3">
<li><strong>Чтобы увидеть логи загрузки, которые "ушли вверх" и больше не видны на экране, можно воспользоваться командой <code>dmesg</code> или просмотреть системные логи, которые сохраняют информацию о процессе загрузки.1. </strong>Чтобы увидеть логи загрузки, которые "ушли вверх" и больше не видны на экране, можно воспользоваться командой <code>dmesg</code> или просмотреть системные логи, которые сохраняют информацию о процессе загрузки.1. Просмотр лога загрузки с помощью <code>dmesg</code>** Команда <code>dmesg</code> показывает системные сообщения, включая процесс загрузки. Вы можете использовать её для просмотра всех сообщений или только последних строк:</li>
</ol>
<pre><code class="lang-bash">dmesg | less
</code></pre>
<p>Это откроет вывод <code>dmesg</code> в программе <code>less</code>, где можно перемещаться с помощью клавиш <code>стрелка вверх/вниз</code>, <code>Space</code> и <code>b</code> для перехода по страницам.2. <strong>Просмотр системных логов</strong> На Raspberry Pi с системами на базе <code>systemd</code> загрузочные логи также записываются в <code>/var/log</code>. Важно отметить, что файлы могут отличаться в зависимости от конфигурации, но обычно важные логи находятся в следующих файлах: </p>
<ul>
<li><strong>Основной системный лог</strong> :</li>
</ul>
<pre><code class="lang-bash">sudo cat /var/<span class="hljs-built_in">log</span>/syslog | less
</code></pre>
<p><code>syslog</code> содержит общие системные сообщения, включая сообщения, связанные с загрузкой.</p>
<ul>
<li><strong>Журнал ядра</strong> :</li>
</ul>
<pre><code class="lang-bash">sudo cat /var/<span class="hljs-built_in">log</span>/kern.log | less
</code></pre>
<p><code>kern.log</code> содержит сообщения ядра, включая ошибки и предупреждения, возникшие при загрузке.</p>
<ol start="3">
<li>Использование <code>journalctl</code> для логов <code>systemd</code>** Если Raspberry Pi использует <code>systemd</code>, вы можете использовать <code>journalctl</code> для получения журналов: </li>
<li>Полный журнал загрузки:</li>
</ol>
<pre><code class="lang-bash">sudo journalctl -b
</code></pre>
<ul>
<li>Только сообщения об ошибках во время загрузки:</li>
</ul>
<pre><code class="lang-bash">sudo journalctl -p err -b
</code></pre>
<p>Эти команды помогут вам просмотреть подробные логи загрузки Raspberry Pi.</p>
<h2 id="heading-mk-63">MK:</h2>
<p>после загрузки вентилятор Pi работает на полную мощность, до этого он после бута переходил в нормальный режим</p>
<h2 id="heading-chatgpt-63">ChatGPT:</h2>
<p>Если вентилятор продолжает работать на полной мощности после загрузки, это может быть связано с отсутствующими настройками управления вентилятором или с тем, что система не определяет правильную температуру для регулирования его скорости.</p>
<h3 id="heading-shagi-dlya-diagnostiki-i-nastrojki-upravleniya-ventilyatorom">Шаги для диагностики и настройки управления вентилятором</h3>
<ol>
<li><strong>Проверьте конфигурацию <code>config.txt</code></strong> : <ul>
<li>Откройте файл <code>/boot/firmware/config.txt</code> на SSD и проверьте, включено ли управление вентилятором:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo nano /boot/firmware/config.txt
</code></pre>
<ul>
<li>Найдите или добавьте следующие строки, чтобы включить управление вентилятором:</li>
</ul>
<pre><code class="lang-plaintext">dtoverlay=gpio-fan
gpio_pin=14
temp=55000  # Задайте нужную температуру (в миллиградусах Цельсия) для включения вентилятора
</code></pre>
<p><em>Примечание</em>: Параметр <code>gpio_pin=14</code> может варьироваться в зависимости от используемого GPIO, к которому подключен вентилятор. Проверьте документацию вашего вентилятора, если требуется другой GPIO.</p>
<ol start="2">
<li><strong>Проверьте температуру процессора</strong> :
Выполните следующую команду, чтобы увидеть текущую температуру, так как высокая температура может заставить вентилятор работать на полную мощность:</li>
</ol>
<pre><code class="lang-bash">vcgencmd measure_temp
</code></pre>
<ol start="3">
<li><strong>Проверьте установленные пакеты для управления питанием и температурой</strong> :
Возможно, нужные пакеты не установлены, особенно если вы перешли на новую систему или перенесли ОС на SSD:</li>
</ol>
<pre><code class="lang-bash">sudo apt update
sudo apt install raspi-config
</code></pre>
<ol start="4">
<li><strong>Перезагрузите Pi</strong> :
После изменения конфигурации в <code>config.txt</code> перезагрузите Raspberry Pi:</li>
</ol>
<pre><code class="lang-bash">sudo reboot
</code></pre>
<p>Эти действия должны восстановить управление скоростью вентилятора в зависимости от температуры.</p>
<h2 id="heading-mk-64">MK:</h2>
<p>добавил <code>/boot/firmware/config.txt</code> и перезапустил, все равно активно крутит</p>
<h2 id="heading-chatgpt-64">ChatGPT:</h2>
<p>Если вентилятор продолжает активно работать после добавления параметров в <code>config.txt</code>, возможно, настройки не применились, или требуется дополнительная конфигурация. Давайте попробуем проверить и уточнить параметры.</p>
<h3 id="heading-dalnejshie-shagi-dlya-diagnostiki-i-nastrojki">Дальнейшие шаги для диагностики и настройки</h3>
<ol>
<li><strong>Проверьте, что изменения в <code>config.txt</code> применились</strong> : <ul>
<li>Иногда <code>config.txt</code> может не загружаться с SSD. Проверьте, правильно ли установлен параметр <code>dtoverlay=gpio-fan</code>:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">sudo vcgencmd get_config dtoverlay
</code></pre>
<ul>
<li>Если <code>gpio-fan</code> не отображается в выводе, значит, конфигурация не была применена.</li>
</ul>
<ol start="2">
<li><p><strong>Убедитесь, что конфигурация сделана для правильного GPIO</strong> : </p>
<ul>
<li><p>Параметр <code>gpio_pin=14</code> может отличаться в зависимости от модели Raspberry Pi и используемого вентилятора. Проверьте документацию вентилятора и узнайте точный номер GPIO, к которому он подключен.</p>
</li>
<li><p>Если ваш вентилятор подключен к другому GPIO, измените значение <code>gpio_pin</code> в <code>config.txt</code> и перезапустите.</p>
</li>
</ul>
</li>
<li><p><strong>Попробуйте отключить вентилятор вручную для теста</strong> : </p>
<ul>
<li>Если вы знаете GPIO, к которому подключен вентилятор, можно попробовать вручную отключить его через <code>gpio</code> для теста (например, с помощью <code>raspi-gpio set &lt;номер GPIO&gt; op dl</code>), но это требует точной информации о настройках вентилятора.</li>
</ul>
</li>
<li><p><strong>Проверьте установку драйвера <code>gpio-fan</code></strong> : </p>
<ul>
<li>Подтвердите, что драйвер <code>gpio-fan</code> установлен и работает, с помощью:</li>
</ul>
</li>
</ol>
<pre><code class="lang-bash">lsmod | grep gpio_fan
</code></pre>
<ul>
<li>Если <code>gpio_fan</code> не отображается в выводе, возможно, потребуется повторить установку пакета <code>raspi-gpio</code>.</li>
</ul>
<p>Если после этих действий вентилятор по-прежнему работает на полной скорости, сообщите, чтобы мы могли рассмотреть другие варианты настройки.</p>
<h2 id="heading-mk-65">MK:</h2>
<p><code>sudo vcgencmd get_config dtoverlay</code> пишет command not registered</p>
<h2 id="heading-chatgpt-65">ChatGPT:</h2>
<p>Сообщение <code>command not registered</code> указывает на то, что команда <code>vcgencmd</code> не распознаёт параметр <code>dtoverlay</code>, что может означать, что на вашей системе отсутствует поддержка <code>vcgencmd</code> или <code>gpio-fan</code>. Эта проблема иногда возникает на версиях Raspberry Pi OS или Debian, которые не включают все утилиты для управления Raspberry Pi, особенно при загрузке с SSD.</p>
<h3 id="heading-shagi-dlya-resheniya">Шаги для решения</h3>
<ol>
<li><strong>Проверьте установку пакетов <code>raspi-config</code> и <code>raspi-gpio</code></strong> :
Эти пакеты необходимы для управления Raspberry Pi, включая конфигурации <code>vcgencmd</code> и <code>dtoverlay</code>.</li>
</ol>
<pre><code class="lang-bash">sudo apt update
sudo apt install raspi-config raspi-gpio
</code></pre>
<ol start="2">
<li><strong>Перезагрузитесь и повторите попытку</strong> :
После установки пакетов перезапустите Raspberry Pi:</li>
</ol>
<pre><code class="lang-bash">sudo reboot
</code></pre>
<ol start="3">
<li><strong>Повторите команду <code>vcgencmd</code> после перезагрузки</strong> :
Выполните команду снова:</li>
</ol>
<pre><code class="lang-bash">sudo vcgencmd get_config dtoverlay
</code></pre>
<ol start="4">
<li><strong>Проверьте наличие других параметров управления вентилятором</strong> :
Если <code>vcgencmd</code> по-прежнему не работает, это может указывать на отсутствие поддержки в текущей версии прошивки или системы для Raspberry Pi. В этом случае возможно использование скриптов Python или утилиты <code>raspi-gpio</code> для ручного управления GPIO и включения/выключения вентилятора в зависимости от температуры.</li>
</ol>
<p>Сообщите, если после установки пакетов проблема сохраняется, и мы рассмотрим альтернативные подходы для управления вентилятором.</p>
<h2 id="heading-mk-66">MK:</h2>
<pre><code>$ sudo apt install raspi-config raspi-gpio
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
raspi-config is already the newest version (<span class="hljs-number">20240708</span>).
raspi-gpio is already the newest version (<span class="hljs-number">0.20231127</span>).
<span class="hljs-number">0</span> upgraded, <span class="hljs-number">0</span> newly installed, <span class="hljs-number">0</span> to remove and <span class="hljs-number">2</span> not upgraded.
xen@pi:~ $ sudo vcgencmd get_config dtoverlay
dtoverlay is unknown
</code></pre><h2 id="heading-chatgpt-66">ChatGPT:</h2>
<p>Сообщение <code>dtoverlay is unknown</code> указывает на то, что система не распознаёт параметр <code>dtoverlay</code> в команде <code>vcgencmd</code>. Это может означать, что текущая прошивка или версия системы не поддерживает этот параметр, или что Raspberry Pi не загрузил настройки из <code>config.txt</code> на SSD.</p>
<h3 id="heading-vozmozhnye-dejstviya-dlya-diagnostiki-i-resheniya-problemy">Возможные действия для диагностики и решения проблемы</h3>
<ol>
<li><p><strong>Проверьте, загружается ли <code>config.txt</code> с SSD</strong> :
Убедитесь, что Raspberry Pi действительно использует <code>config.txt</code> с SSD, а не с SD-карты (если она подключена). Попробуйте внести изменения в файл и проверить, влияют ли они на систему.</p>
</li>
<li><p><strong>Использование альтернативного метода для управления вентилятором</strong> :
Если <code>dtoverlay=gpio-fan</code> не работает, можно попробовать управлять вентилятором напрямую через GPIO с помощью Python или утилиты <code>raspi-gpio</code>. Пример на Python, который включает вентилятор, когда температура превышает порог:</p>
</li>
</ol>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> RPi.GPIO <span class="hljs-keyword">as</span> GPIO
<span class="hljs-keyword">import</span> time
<span class="hljs-keyword">import</span> os

FAN_PIN = <span class="hljs-number">14</span>  <span class="hljs-comment"># Укажите правильный номер GPIO для вентилятора</span>
TEMP_THRESHOLD = <span class="hljs-number">55</span>  <span class="hljs-comment"># Порог температуры в градусах Цельсия</span>

GPIO.setmode(GPIO.BCM)
GPIO.setup(FAN_PIN, GPIO.OUT)

<span class="hljs-keyword">try</span>:
    <span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:
        temp_output = os.popen(<span class="hljs-string">"vcgencmd measure_temp"</span>).readline()
        temp = float(temp_output.replace(<span class="hljs-string">"temp="</span>, <span class="hljs-string">""</span>).replace(<span class="hljs-string">"'C\n"</span>, <span class="hljs-string">""</span>))
        <span class="hljs-keyword">if</span> temp &gt; TEMP_THRESHOLD:
            GPIO.output(FAN_PIN, GPIO.HIGH)  <span class="hljs-comment"># Включить вентилятор</span>
        <span class="hljs-keyword">else</span>:
            GPIO.output(FAN_PIN, GPIO.LOW)   <span class="hljs-comment"># Выключить вентилятор</span>
        time.sleep(<span class="hljs-number">5</span>)  <span class="hljs-comment"># Проверка каждые 5 секунд</span>
<span class="hljs-keyword">except</span> KeyboardInterrupt:
    GPIO.cleanup()
</code></pre>
<blockquote>
<p><strong>Примечание</strong> : Убедитесь, что вентилятор подключен к указанному GPIO. Этот скрипт включает и выключает вентилятор в зависимости от температуры.</p>
</blockquote>
<ol start="3">
<li><strong>Проверка обновлений прошивки и системы</strong> :
Возможно, проблема связана с версией прошивки. Выполните следующие команды для обновления:</li>
</ol>
<pre><code class="lang-bash">sudo apt update
sudo apt full-upgrade
sudo rpi-update  <span class="hljs-comment"># Это обновит прошивку</span>
</code></pre>
<p>После выполнения этих шагов можно проверить, управляется ли вентилятор корректно. Если проблема сохранится, используйте скрипт на Python для временного контроля, пока мы ищем дополнительные варианты решения.</p>
<h2 id="heading-mk-67">MK:</h2>
<p>sudo rpi-update  # Это обновит прошивку
 <strong><em> Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
 </em></strong> Performing self-update
 <strong><em> Relaunching after update
 </em></strong> Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
FW_REV:15869f639ce259cca9d3857eb86316f963d4b1e9
BOOTLOADER_REV:e9717985d26205a790d5dbc77b8dbadcadb52e05
 <strong><em> We're running for the first time
 </em></strong> Backing up files (this will take a few minutes)
 <em>*</em> Backing up firmware
cp: cannot copy a directory, '/boot/firmware', into itself, '/boot/firmware.bak'</p>
<h2 id="heading-chatgpt-67">ChatGPT:</h2>
<p>Ошибка возникает, потому что <code>rpi-update</code> пытается создать резервную копию прошивки в папке <code>/boot/firmware.bak</code>, но по ошибке направляет её внутрь самой <code>/boot/firmware</code>, что вызывает конфликт. Это может быть связано с тем, что раздел загрузки на SSD отличается от стандартной конфигурации.</p>
<h3 id="heading-reshenie-vremenno-smontirovat-zagruzochnyj-razdel-na-standartnyj-put">Решение: временно смонтировать загрузочный раздел на стандартный путь</h3>
<p>Попробуйте следующее:</p>
<ol>
<li><strong>Отмонтируйте текущий раздел <code>/boot/firmware</code></strong> :</li>
</ol>
<pre><code class="lang-bash">sudo umount /boot/firmware
</code></pre>
<ol start="2">
<li><strong>Создайте временную директорию и смонтируйте загрузочный раздел SSD в <code>/boot</code></strong> :</li>
</ol>
<pre><code class="lang-bash">sudo mount /dev/nvme0n1p1 /boot
</code></pre>
<ol start="3">
<li><strong>Повторите команду <code>rpi-update</code></strong> :
Теперь, с загрузочным разделом, смонтированным в <code>/boot</code>, попробуйте снова:</li>
</ol>
<pre><code class="lang-bash">sudo rpi-update
</code></pre>
<ol start="4">
<li><strong>Перемонтируйте раздел обратно, если это требуется</strong> :
После завершения обновления отмонтируйте <code>/boot</code> и снова смонтируйте раздел, как он был:</li>
</ol>
<pre><code class="lang-bash">sudo umount /boot
sudo mount /dev/nvme0n1p1 /boot/firmware
</code></pre>
<p>Эти действия позволят обновить прошивку, избегая конфликта с резервным копированием.</p>
<h2 id="heading-mk-68">MK:</h2>
<p>$ sudo mount /dev/nvme0n1p1 /boot
mount: /boot: /dev/nvme0n1p1 already mounted on /boot.
       dmesg(1) may have more information after failed mount system call.</p>
<h2 id="heading-chatgpt-68">ChatGPT:</h2>
<p>Сообщение указывает, что раздел <code>/dev/nvme0n1p1</code> уже смонтирован в <code>/boot</code>, но, вероятно, монтированная точка <code>/boot</code> может быть уже перенаправлена на <code>/boot/firmware</code>. Это может вызвать путаницу при обновлении прошивки.</p>
<h3 id="heading-dalnejshie-shagi-2">Дальнейшие шаги</h3>
<ol>
<li><strong>Отмонтируйте все точки, связанные с <code>/boot</code> и <code>/boot/firmware</code></strong> :
Чтобы очистить монтирование, выполните следующие команды:</li>
</ol>
<pre><code class="lang-bash">sudo umount /boot/firmware
sudo umount /boot
</code></pre>
<ol start="2">
<li><strong>Смонтируйте раздел SSD напрямую в <code>/boot</code></strong> :
Теперь попробуйте смонтировать загрузочный раздел SSD в <code>/boot</code> без подкаталогов:</li>
</ol>
<pre><code class="lang-bash">sudo mount /dev/nvme0n1p1 /boot
</code></pre>
<ol start="3">
<li><strong>Запустите <code>rpi-update</code> для обновления прошивки</strong> :
С разделом, смонтированным в <code>/boot</code>, выполните:</li>
</ol>
<pre><code class="lang-bash">sudo rpi-update
</code></pre>
<ol start="4">
<li><strong>Перемонтируйте раздел, если требуется</strong> :
После завершения обновления верните монтирование, если оно было настроено на <code>/boot/firmware</code>:</li>
</ol>
<pre><code class="lang-bash">sudo umount /boot
sudo mount /dev/nvme0n1p1 /boot/firmware
</code></pre>
<p>Эти шаги должны помочь успешно выполнить обновление прошивки.</p>
<h2 id="heading-mk-69">MK:</h2>
<p>Вроде все сделали. Спасибо!</p>
<h2 id="heading-chatgpt-69">ChatGPT:</h2>
<p>Отлично! Рад, что всё получилось! Если понадобятся ещё советы по настройке или другие вопросы, всегда рад помочь. Удачной работы с Raspberry Pi! 😊</p>
]]></content:encoded></item><item><title><![CDATA[Как происходит процесс найма]]></title><description><![CDATA[В статье расскажу про основные этапы и почему отваливаются потенциальные кандидаты.

Опять в поиске сотрудников. Сейчас надо два middle #python бэкенд разработчика, желательно с опытом в крипте, но не принципиально, мы легко доучиваем.

Более 20 лет ...]]></description><link>https://myblog.ru/kak-proishodit-process-najma</link><guid isPermaLink="true">https://myblog.ru/kak-proishodit-process-najma</guid><category><![CDATA[собеседование]]></category><category><![CDATA[работа]]></category><category><![CDATA[IT]]></category><category><![CDATA[Career]]></category><category><![CDATA[interview]]></category><category><![CDATA[Python]]></category><dc:creator><![CDATA[Mikhail Kashkin]]></dc:creator><pubDate>Thu, 07 Dec 2023 16:13:41 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1701965324500/c24c9015-7673-48a3-abe1-ff9cd8cdd9ca.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>В статье расскажу про основные этапы и почему отваливаются потенциальные кандидаты.</p>
<blockquote>
<p>Опять в поиске сотрудников. Сейчас надо два middle #python бэкенд разработчика, желательно с опытом в крипте, но не принципиально, мы легко доучиваем.</p>
</blockquote>
<p>Более 20 лет я нанимаю людей. В стартапы, крупные компании, свои проекты, в аутсорсинг или индивидуально для партнеров. Как отдельных, так и сразу команды. И много раз я получал обратную связь, что получались продуктивные и душевные коллективы людей, которым интересно работать вместе. Поэтому я расскажу о том, как именно я провожу собеседования, и о своем оптимальном сценарии. А заодно, расскажу, как и почему отваливаются люди и не попадают в найм.</p>
<p>Я не рекрутер и не называю себя так, скорее я технический лидер проектов, но постепенно отточил этот свой навык и думаю, что у меня в целом неплохо получается. По внутреннему барометру я провожу до трех собеседований, для того чтобы закрыть одну позицию. Если больше, то значит, что где-то в процессе мы сильно накосячили.</p>
<p>Цикл поиска сотрудников состоит из множества шагов. Они напоминают воронку продаж. На каждом шаге надо сделать одно целевое действие: просто найти тех, кто перейдет на следующий шаг. Воронка наполняется на входе до тех пор, пока не будут приняты офферы и человек не займет свое место в команде.</p>
<p><strong>Предварительный отсев</strong></p>
<p>Первый шаг — это определиться с тем, кто нам нужен в команде. То есть должность, квалификация, хард и софт навыки и вилка по зарплате. Как минимум нужно сформировать это понимание для самих себя. Много раз сталкивался с тем, что команды.</p>
<p>Работа может строиться через публикацию вакансии или путем поиска по базе. Тут большое значение имеет сервис вакансий и его жадность. Есть самые трешовые сервисы для поиска программистов: work.ua и hh.ru. Они устроены так, что вам приходится разгребать очень много мусорных обращений. Плюс еще и ужат поиск по базе соискателей. Хантер дает какие-то рекомендации, а это, по сути, какая-то выжимка из неудобного региона. Для кассира, ищущего работу рядом с домом это хороший вариант. Для айти с удаленкой это сильно мешает.</p>
<p>Джинни и Хабр отлично работают, так что лучше добавляйтесь туда, а не на сайты для линейного персонала.</p>
<p>Обычно моя работа начинается либо с разбора присланных откликов на вакансии, либо с поиска по профайлам людей. Я просматриваю сотни профайлов людей. В процессе обнаруживаю людей, которые потенциально нам подходят и добавляю их на следующий шаг воронки.</p>
<p>Это только кажется, что middle python разработчиков <em>over 9000</em>. Очень много профайлов не в активном поиске, плюс язык, география и т.д. Джунов с ожиданиями в $5000 и месяцем опыта после курсов в спальном районе больше, чем кажется. С фильтрами потенциальная ЦА уменьшается до полутора тысяч. Это результаты поиска по разделу соискателей с нужными фильтрами. Из этих полутора тысяч подробно открывать имеет смысл чуть меньше половины. И это уже сотни резюме в час которые я могу продуктивно просмотреть.</p>
<p><strong>Просмотры резюме</strong></p>
<p>Очень важно правильно и стандартно заполнить и сверстать свое резюме. В целом все сайты пришли к общему формату анкет и взгляд уже автоматом цепляется за нужные пункты в нужном месте. Мне вполне хватает формата LinkedIn если это PDF файл, а еще лучше просто читать хорошо заполненные анкеты на сайте поиска работы.</p>
<blockquote>
<p>Есть люди, которые умудряются прострелить себе ногу и тут. После тысяч просмотренных файлов резюме меня не восхищают креативно оформленные презентации или сайты. Если честно, то вычурные блокбастеры на позицию программиста выглядят несколько подозрительно. Если это по фану, то вопросов нет, просто потом еще пришли стандартный документ для более простого делопроизводства.</p>
</blockquote>
<p><strong>Разбор резюме</strong></p>
<p>Люди пишут о себе гораздо больше, чем самим понимают. Или не пишут, видели бы вы сколько профайлов в которых ноль информации о человеке, его опыте, но зато внезапные ожидания по зп. Уже на этом уровне конкуренция очень сильно уменьшается. Почему?</p>
<ul>
<li><p>Есть разные категории соискателей, например я пропускаю из некоторых стран. Часть чисто юридически, мы не сможем подписать договор и отправлять оплату. Но есть и регионы, которые себя зарекомендовали как ненадежных партнеров.</p>
</li>
<li><p>Просто плохо заполен профайл, хотя, казалось бы, просто пройти по всем полям. Либо профайл вообще не заполнен, либо не подготовлен к позиции в заголовке. Вроде поля заполнены, но в случайном порядке. Из резюме должно быть видно, что человек шел к текущей должности всю жизнь, но даже на айти сайте вполне нормально встретить людей, которые непонятно чем занимались, а потом вдруг решил стать вайтишником. Если человек даже не разобрался как надо заполнять свое резюме, то как он будет выполнять более сложные инструкции? Для джунов ищущих первое место работы это еще бывает простительно.</p>
</li>
<li><p>Текст о себе это просто кладезь удивительных историй. В отдельном посте разберу примеры.</p>
</li>
</ul>
<blockquote>
<p>Можете клеймить меня и причислять к душнилам/плохим людям и прочим, но я понял, что неполиткорректно фильтрую людей из некоторых регионов на определенные позиции. Недавно мне надо было собрать команду с нуля. И я пропустил по воронке до собеседований порядка 10 человек из некоторых стран. Из них 7 соврали мне про свой опыт в резюме и пытались врать во время собеседования. Много пафоса, мало конкретных ответов. Возможно, это просто специфика поиска удаленной работы, люди не очень боятся последствий и активно врут о своем опыте.</p>
</blockquote>
<p>Из десятка просмотренных профайлов в среднем остается 1-2 для того, чтобы их отправить на следующий этап воронки. По ощущениям из тех, кто не проходит дальше: 60% — это просто плохо заполненный профайл. 20% — это нерелевантные люди и еще 20% это какая-то странная драма в "О себе". Не заполнять анкету профайла плохо, и писать лишнее не стоит. А еще лучше потратить 2-3 часа своей жизни на чтения профайлов других людей и разобраться как это все-таки устроено и набраться опыта. Свое резюме я редактировал много раз.</p>
<p><strong>Предварительный созвон</strong></p>
<p>С теми, кто проходит дальше связывается рекрутер для предварительной беседы. Даже 5 минут узнать, как дела это уже фильтр. Странненьких на этом этапе уже меньше, но все же попадаются. Поэтому важно поговорить голосом хотя бы 5-10 минут. Узнать свободен ли, как быстро ищет работу, как дела и что хочется от карьеры. Рассказать о проекте и позиции и узнать подходим ли человеку мы. Это только кажется, что всем лишь бы устроится, но многие не работают с определенными индустриями. Например, я бы не пошел работать с военными, табачными, алкогольными компаниями или политическими партиями. Кому-то не нравится крипта, азартные игры и порно. Бывает не подходят стартапы или крупные компании. Часто девушкам хочется только в офис, если они хотят найти себе мужа. Другим нравится удаленка и зарплата с привязкой к курсу. Есть люди, которые никогда не будут работать с [<em>любая национальность или страновая принадлежность</em>]. Есть люди со знанием или без языка, расписанием позволяющем отвозить детей в школу или так чтобы часовые пояса остальной команды не выпадали на поздний вечер. Вспомним про легаси, PHP, Angular, MySQL, MongoDB и прочих чемпионов по хейту. И так далее.</p>
<p>Честно говоря, мне много раз встречалось, когда эту часть рекрутера делает плохо. Я предпочитаю не работать с такими людьми. Их часть я могу сделать хорошо, но мое время стоит дороже. Плюс банально жалко времени на рутинные задачи. Так или иначе эти вопросы обязательно всплывут. И если твоя бадди по подбору людей халявит, то будет жалко впустую потраченного времени на технические собеседования.</p>
<p>Результатом общения становится обмен контактами и человеку отправляется специальная ссылка, там несколько полей для заполнения и возможность выбрать удобное время из доступных слотов в моем календаре. Приглашение отправляется человеку по почте и попадает в наши календари со ссылкой на видео конференцию.</p>
<p><strong>Запись на встречу</strong></p>
<p>Тут тоже начинается фильтр. Не все люди умеют пользоваться календарем. К сожалению, это автоматом обозначает, что человек еще не готов работать удаленно. Если человек вовремя не пришел, не предупредил и не исправил положение, то опять срабатывает фильтр. Причем не зависимо от статуса и уровня, тимлид, архитектор, C-level. Знаете кто никогда не опаздывает или предупреждает в случае форс-мажора? Владельцы бизнеса, чем выше уровень, тем ценнее время и меньше шансов встретить невыполнение договоренности.</p>
<blockquote>
<p>Инстаграм-звезда может опоздать, политик может опоздать. Представитель более высокой касты может опоздать, чтобы обозначить свое положение. Но если вы на одном уровне или есть разница в уровнях, то опоздание может стать последней встречей. Больше всего опаздывают люди, которым, казалось бы, больше всего надо приходить вовремя. Человек по телефону рассказывает, как у него всего плохо, просит помочь и вопреки всему все-таки пригласить на собеседование. Обещает, что будет стараться и... тут же лажает. <strong>Люди удивительно целеустремленны чтобы в их жизни была полная задница.</strong></p>
</blockquote>
<p>Встречи лучше не затягивать и выбирать ближайшее доступное время и дату. Бывает, что в день рекрутер позвонит и напомнит. Но чаще нужно просто вовремя прийти на встречу из календаря.</p>
<p><strong>Собеседование</strong></p>
<p>В нужное время и нужный день человек приходит на встречу и наконец-то начинается техническое собеседование. Встреча занимает около часа. У меня есть небольшой курс с разбором вопросов для собеседований на позицию Python разработчика. Если вы хотите успешно пройти собеседования на эту позицию, то возможно вам это будет интересно.</p>
<blockquote>
<p>За время моей работы я провел порядка 2000 собеседований. В основном с python разработчиками, но были и с другими смежными должностями, вплоть до C-уровня многомиллионных компаний. Несколько лет назад журналисты взяли у меня и других известных разработчиков интервью и спросили какие бы вы задали вопросы при проведении собеседования. На основе наших ответов они создали статью "150 вопросов для Python разработчиков". И я сделал разбор большей части технических вопросов из этого списка. Это знания, которые необходимы, чтобы устроиться на позицию от junior Python разработчика и выше. По сути, это разборы типичных ошибок студентов и мои правильные ответы как эксперта. Потом на лекциях я разобрал эти вопросы и собрал небольшой курс. Купить можно по <a target="_blank" href="https://secure.wayforpay.com/button/b0aa642bc19d1">ссылке</a>.</p>
</blockquote>
<p>В процессе собеседования становится понятно, что человек может нам подойти. Но это не значит, что подходим ему мы. Бывают люди отказывают по своим причинам. Например, пришел другой оффер или изменились условия на текущем месте работы.</p>
<p><strong>Отказы</strong></p>
<p>При том, что собеседование — это достаточно болезненный процесс, но отказ на этом этапе не надо воспринимать как отвержение. Много работая и зная людей, я часто вижу, что компания и проект не подходят человеку, хотя ему кажется, что ему хотелось бы работать именно тут. Я видел ребят, которые переросли позицию и нет перспектив для роста. Были случаи, когда я понимал, что компания не лучшее место для работы конкретного человека. Бывало и отговаривал, потому что видел компания и проект просто неудачный выбор. Есть скучные должности, на которых лучше сесть человеку с интересами вне работы.</p>
<p>В процессе собеседований еще и собирается конфигурация команды. Вокруг сильного специалиста можно взять несколько послабее. А если проект сложный, то лучше взять парочку более матерых с опытом работы с конкретными технологиями. Бывало, что встречались ребята которых бы с удовольствием взяли через полгода после начала проекта, но не на конкретной фазе. Им бы просто нечего было бы делать. Чем более матерый проект, тем понятнее кто конкретно нужен.</p>
<p><strong>Обратная связь</strong></p>
<p>Некоторые компании практикуют обратную связь при отказе. Я лично не считаю правильным лезть к людям со своим мнением о них. Мы мало друг-друга знаем и неудачно подобранные слова могут сильно задеть человека. Собеседование и так сложно, отказ воспринимается тяжело. И тут еще лезут со своим воспаленным эго. Да и кому нужны советы о том, как поменять свою жизнь чтобы устроится в очередные "Рога и Копыта" (самая мать его лучшая компания в мире).</p>
<p>Да я вижу, понимаю и знаю многое. Но когда я был молодым человеком, то не помню, чтобы адекватно воспринимал обратную связь от старших. Сейчас я уже понимаю, что работают только советы, за которые ты заплатил своими деньгами. Впрочем, если вижу какое-то явное заблуждение, то как человек с эмпатией могу спросить разрешение и обязательно уточняю, что это лично моя иллюзия из небольшого времени, проведенного вместе.</p>
<blockquote>
<p>На позицию фронтенд разработчика в стартап на начальной стадии пришла девушка, и в процессе разговора стало понятно, что она очень интересуется доступностью интерфейсов для людей с ограниченными возможностями. У нее блог, собирает и публикует информацию по этому поводу. Я спросил почему она пришла на собеседование в стартап, ведь эти проекты меньше внимания уделяют таким вещам. Им еще надо вырасти, получить пользователей и начать зарабатывать деньги. Зато стало понятно, что в силу своих убеждений она бы никогда не подалась на позиции в компании, где есть потребность в ее знаниях. Я спросил разрешения дать совет и немного поработал с ее возражениями. Надеюсь, это помогло ей правильно направить свою карьеру.</p>
</blockquote>
<p><strong>Мягкие навыки</strong></p>
<p>На первом месте важна эмоциональная зрелость или психологический возраст. Я знаю, что многим кажется, что новое поколение это в основном снежинки. Но встречал и сорокалетних инфантилов и зрелых мужиков с паспортным возрастом в 21 год. Мне нужен результат и поэтому я беру тех, на кого можно положиться и те, кто сможет создавать ценность пользователям и инвестором. И это никак не коррелирует с "творчеством", быть взрослым — это не значит переставать творить, даже наоборот реально погрузиться в проблему и понять, что на самом деле надо неосознанному пользователю тот, кто понимает, что такое ответственность.</p>
<p>Многие думают, что надо гонять человека по хардовым навыкам, но, честно говоря, в айти вообще все меняется настолько стремительно, что плевать на знания конкретных технологий. Даже наоборот, человек, который с пеной у рта доказывает, что React круче Angular. Или что весь фронт скоро умрет, потому что выходит какой-то новый фреймворк на каком-то изотерическом говне, то скорее всего перед вами просто малолетний пиздюк. Взрослый человек имеет предпочтения, может принять решение не работать с какой-то технологией, потому что она не приближает его к своей мечте, но вполне нормально относится к существованию всего остального в мире.</p>
<p>В целом софты &gt; хардов. Адекватный человек уже умеет самообучаться и дотянет быстро нужные навыки.</p>
<p>Добавлю, что лично для меня есть еще один важный аспект личных качеств человека. Я открыто признаюсь, что всегда стараюсь брать <strong>теплых и душевных людей</strong>. Мне с ними проводить время и получать или не получать комфорт от совместной работы.</p>
<p><strong>Попадание в цель</strong></p>
<p>Как только находится нужный человек то мы прекращаем записывать новых соискателей в календарь. И доделываю встречи на ближайшие дни. В конце на собеседования я честно говорю, что нам надо несколько дней для принятия решения о найме и доделать уже запланированные встречи. Человеку так же говорю, что вы тоже можете продолжать искать.</p>
<p>Бывает проводят еще дополнительные встречи с другими членами команды или руководителями. Если это не большая корпорация, где нужна проверка через службу безопасности, то часто такие встречи, с моей точки зрения, избыточны. Но бывает и хорошая мотивация познакомиться с другими ребятами и понять, насколько им будет комфортно работать с конкретным человеком. Команды, которые собирал я с нуля не уступали в продуктивности командам, где было 3-4 этапов собеседования. Но в сработанных командах, где люди работают годами вместе комфорт уже важнее быстрого закрытия позиции.</p>
<p>Тех, кто понравился мы обсуждаем с командой и делаем оффер. После этого начинается новая глава общения с человеком.</p>
]]></content:encoded></item><item><title><![CDATA[Frostpunk]]></title><description><![CDATA[Вчера вечером прошел основную кампанию Frostpunk. Игра в сеттинге выживания сообщества. В мире, где во времена начальной индустриализации (стимпанк) вся Земля погружается в глобальное похолодание. В сторону севера из Лондона выдвигается группа людей,...]]></description><link>https://myblog.ru/frostpunk</link><guid isPermaLink="true">https://myblog.ru/frostpunk</guid><category><![CDATA[game]]></category><category><![CDATA[letsplay]]></category><dc:creator><![CDATA[Mikhail Kashkin]]></dc:creator><pubDate>Thu, 28 Sep 2023 14:23:34 GMT</pubDate><content:encoded><![CDATA[<p>Вчера вечером прошел основную кампанию Frostpunk. Игра в сеттинге выживания сообщества. В мире, где во времена начальной индустриализации (стимпанк) вся Земля погружается в глобальное похолодание. В сторону севера из Лондона выдвигается группа людей, чтобы обосноваться вокруг генератора. И попытаться выжить. </p>
<p>Очень приятно испытать чувство, когда не хочется обращать внимание на что-то вокруг и хочется нырнуть в произведение. Будь-то книга, сериал или в этот раз игра. Я получил огромное удовольствие от борьбы за выживание этого сообщества.</p>
<p>Внешне управление похоже на симулятор города. Надо накапливать ресурсы, строить здания с разной специализацией и бороться за жизнь в условиях лютого мороза. Во-первых, игра очень хорошо передает атмосферу безысходности. Я несколько раз пытался пройти игру и у меня получилось только заставляя детей работать на безопасных производствах. Во-вторых, в основной кампании есть несколько интересных сюжетных поворотов, когда кажется, что вот-вот наладил худо-бедно существование без болезней, обморожения и смертей, а тут к тебе приходят новые напастья извне. В-третьих, игра хорошо режиссирует тобой лично, твои мягкие решения приводят к смертям, а от принятия жестких кажется, что перегибаешь палку и сомневаешься в том хороший ли ты человек. А спустя время оказывается, что в целом надо было действовать еще жестче и заново проходя компанию, после проигрыша, ты уже не останавливаешься и доводишь линию тирана до конца. А после окончания игры думаешь, можно ли было не делать некоторые шаги на пути к диктатуре?</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1695910948041/3b28d631-3589-47b6-9d15-a9c1a9a8b5ad.jpeg" alt class="image--center mx-auto" /></p>
<p>Игра хорошо проиллюстрирована, много зимних ужасов. Много интересных деталей. Город живет, комментирует, испытывает эмоции, обозляется и редко благодарит. Каждый цикл день и ночь дается ценой усилий. А потом начинается бешеная гонка где точно не получится спасти всех и ты обреченно смотришь как все усилия идут прахом и кто-то из граждан приходит к тебе и говорит "правитель, вот надо делать вот это..." и ты такой "да, не важно сколько погибнет при строительстве, если все останутся в замерзших домах, то все равно утром мы не досчитаемся неизвестно сколько, а так мы хоть попытаемся!" И ты бросаешь людей умирать, но спасать оставшихся. А потом присваиваешь заслугу себе, потому что ты и есть отец этих заблудших во льдах душ.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1695910959656/f6f6fb40-f560-44bd-a38f-47ff7b24ed4c.jpeg" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[Телеграм добавил Wallet в настройках]]></title><description><![CDATA[Телеграм продолжает заигрывать с внедрением крипты в свой клиент. То, что они планировали сделать раньше, а потом им запретили, и они сделали вид, что прекратили. Но все равно мир увидел TON, вокруг которого растет экосистема и даже какое-то количест...]]></description><link>https://myblog.ru/telegram-wallet</link><guid isPermaLink="true">https://myblog.ru/telegram-wallet</guid><category><![CDATA[telegram]]></category><category><![CDATA[wallet]]></category><category><![CDATA[Cryptocurrency]]></category><dc:creator><![CDATA[Mikhail Kashkin]]></dc:creator><pubDate>Wed, 27 Sep 2023 10:02:28 GMT</pubDate><content:encoded><![CDATA[<p>Телеграм продолжает заигрывать с внедрением крипты в свой клиент. То, что они планировали сделать раньше, а потом им запретили, и они сделали вид, что прекратили. Но все равно мир увидел TON, вокруг которого растет экосистема и даже какое-то количество сплетен. </p>
<p>Телеграм находится в интересном положении им приходится воевать сразу на нескольких направлениях:</p>
<ul>
<li><p>TON все еще не появился во многих популярных крипто-кошельках, его не сильно принимают в крипто-сообществе. При том, что TON по факту это один из редких и уникальных проектов который реализовал свой собственный блокчейн, таких буквально единицы. То есть хайпа определенно должно быть больше, но его нет. TON в целом борется за признание внутри крипто сообщества.</p>
</li>
<li><p>SEC, тут все понятно и Телеграму приходится делать вид, что они не имеют никакого отношения к TON. SEC — это бюрократия и тут идет бумажная война, тот случай, когда надо получать справку, что вы не верблюд.</p>
</li>
<li><p>Apple, компания пытается получить свой налог с каждого доллара, потраченного внутри экосистемы, и Павел Дуров много раз по этому поводу писал и говорил. Это действительно так, юнит экономика реальных бизнесов не сходится с налога на оборот в 30%. Поэтому внутри экосистемы Apple хорошо живется скам проектам (псевдоигры без сюжета, псевдосервисы знакомств), но плохо живется SMB, которые могли бы решать свои небольшие задачи с локальными сообществам. </p>
</li>
<li><p>Но это далеко не все. Второй фронт борьбы с Apple идет и еще с другой частью. Apple явно запрещают повторять функционал App Store внутри других приложений. Телеграм мог бы стать приложением, внутри которого запускаются другие приложения, например игры или магазины или что-то еще. Но это запрещено правилами и поэтому, в отличии от Android'а, нельзя запускать мини приложения.</p>
</li>
</ul>
<p>И вот Телеграму надо развивать свою крипто-экосистему и "независимый" TON кошелек. Они сначала реализуют его через несколько лишних нажатий внутри @wallet бота. А теперь добавляют его отдельной кнопкой в настройках, но надо показать свою "независимость" и поэтому реализуют отдельное соглашение <a target="_blank" href="https://telegram.org/tos/mini-apps">ToS для мини приложений</a>. В которых всячески подчеркивают, что мы не имеем никакого отношения к этим неназванным третьим лицам.</p>
<p>Внедрение крипто-кошелька идет давно и небольшими шажками. Видимо никто не дал по рукам. И команда мессенджера действует чуточку наглее, вдруг пройдет не замеченным. Но реакция же будет, кто-то из этих игроков начнет ответную войну и введет ответные запретительные действия? У Телеграма уже блокировали новые релизы в App Store. На SEC, Apple, идет тоже давление, а вдруг на них тоже надавят кто-то еще, будет скандал и им придется изменить свои правила?</p>
<p>Еще замечу, как действует Apple. Компания ведет свою игру с полным осознанием своей силы, но грубо и некрасиво. Они не сразу вводят запреты, а ждут чтобы команда Телеграма сделала как можно больше лишних действий и после этого ретроспективно блокируют то, что уже было "не проверено" раньше. Это как не выдавать запретительные документы на строительство торгового центра, видеть, знать, здороваться при встречах за ручку. А после торжественно открытия прийти с бумажками на закрытие и заставить снести готовое здание. Потому, что могут и никто их не накажет.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1695807556533/b7af587a-e96d-461a-b766-2fb22aa08b33.jpeg" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[Правила именования таблиц и полей в базах данных]]></title><description><![CDATA[Отправил в рабочий чат и понимаю, что это может пригодится и в других случаях. Поэтому вот мой гид.
Таблицы:

название таблицы в единственном числе, кроме таблицы users (потому, что user ключевое слово в SQL), или когда строка таблицы содержит множес...]]></description><link>https://myblog.ru/sql-guide-ru</link><guid isPermaLink="true">https://myblog.ru/sql-guide-ru</guid><category><![CDATA[SQL]]></category><category><![CDATA[guide]]></category><category><![CDATA[guidelines]]></category><dc:creator><![CDATA[Mikhail Kashkin]]></dc:creator><pubDate>Mon, 25 Sep 2023 11:53:15 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1695642886163/327c3add-718f-4e1b-95da-ec7716a99613.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Отправил в рабочий чат и понимаю, что это может пригодится и в других случаях. Поэтому вот мой гид.</p>
<p>Таблицы:</p>
<ul>
<li><p>название таблицы в единственном числе, кроме таблицы users (потому, что user ключевое слово в SQL), или когда строка таблицы содержит множественные значения, например stats и в каком-то свойстве хранится массив данных, но и то лучше избегать</p>
</li>
<li><p>внутри таблицы имена полей просто имена полей без названия таблицы (не делать в таблице <code>users_id</code>, чтобы не было в таблице <code>users_data</code> поля <code>users_users_id</code></p>
</li>
<li><p>родственные таблицы начинаются с общего префикса, чтобы в списке таблиц визуально было видны таблицы рядом, например <code>course</code>, <code>course_author</code>, <code>course_tag_rel.</code></p>
</li>
<li><p>имена таблиц и полей до 30 символов</p>
</li>
<li><p>только латинские буквы, знак <code>_</code> и редко цифры в названии таблиц и полей</p>
</li>
<li><p>не придумывать новые аббревиатуры</p>
</li>
<li><p>для М2М связей использовать название <code>&lt;основная таблица&gt;_&lt;вторая таблица&gt;[_rel]</code>, какая основная определяется по удобству использования, суффикс <code>_rel</code> использовать если так договорилась команда и есть выгоды</p>
</li>
</ul>
<p>Столбцы:</p>
<ul>
<li><p>название в единственном числе</p>
</li>
<li><p><code>id</code> поле для поля, которое будет использоваться в других таблицах как foreign key</p>
</li>
<li><p>ссылка на поле из других таблиц <code>&lt;имя таблицы&gt;_&lt;имя столбца&gt;</code>, по схеме сразу понятно кто на кого ссылается, например <code>course_id</code></p>
</li>
<li><p>индексы и sequence объекты сейчас базы данных и миграции в целом хорошо придумывают по умолчанию, если нет, то <code>&lt;имя таблицы&gt;_&lt;имя поля&gt;[_&lt;имя поля2&gt;]_idx</code> (если 3 и более, то придумать логичное обозначение одним словом) или <code>_seq</code> (для последовательностей)</p>
</li>
<li><p>для boolean полей использовать префикс <code>is_</code>, например <code>is_deleted</code></p>
</li>
<li><p>для записей, которые подразумевают сохранение дату создания и модификации везде использовать <code>created_at</code>, <code>modified_at</code>, <code>deleted_at</code>...</p>
</li>
</ul>
<p>Не делать:</p>
<ul>
<li><p>не использовать незначащие префиксы в названия таблиц, например <s>tbl_user_data</s>, просто <code>user_data</code></p>
</li>
<li><p>не использовать одно и то же название для таблицы и поля в ней </p>
</li>
<li><p>camelCase или PascalCase</p>
</li>
<li><p>не использовать uuid для id поля кроме редких случаев, когда надо скрыть количество данных в таблицах и не допустить протекания данных, но в целом uuid надо использовать в самых редких и особых случаях</p>
</li>
<li><p>не использовать имена полей и таблиц, которые будут подразумевать двойные кавычки (как с user)</p>
</li>
<li><p>длинные имена</p>
</li>
</ul>
<p>Хорошие идеи:</p>
<ul>
<li><p>использовать hashid вместо UUID</p>
</li>
<li><p>использовать хранимые процедуры (да, многие их ругают, но возьмите себя в руки и выучите базы данных, это лучшая инвестиция для программиста)</p>
</li>
<li><p>использовать форматирование SQL кода, когда надо редактировать их руками</p>
</li>
<li><p>стараться использовать совместимый SQL синтаксис, но не рассчитывать на то, что код будет работать с разными базами данных. Они слишком разные</p>
</li>
</ul>
<p>Дополнительные ссылки:</p>
<ul>
<li><a target="_blank" href="https://www.sqlstyle.guide/">https://www.sqlstyle.guide/</a></li>
</ul>
<p>Если вы хотите выучиться программированию и SQL, то записывайтесь на <a target="_blank" href="https://pylot.me/course/free-python/">бесплатный курс по Python</a></p>
]]></content:encoded></item><item><title><![CDATA[В чем мой урок и моя трансформация прямо сейчас?]]></title><description><![CDATA[Я стараюсь уменьшить и сократить по максимуму написание кода. Это может звучать странно, но в этом есть логика.
Мое намеренье построить большой успешный продуктовый бизнес. Но как собственник и как владелец компании, я не могу выполнять все время ту ...]]></description><link>https://myblog.ru/v-chem-moj-urok-i-moya-transformaciya-pryamo-sejchas</link><guid isPermaLink="true">https://myblog.ru/v-chem-moj-urok-i-moya-transformaciya-pryamo-sejchas</guid><category><![CDATA[okumy]]></category><dc:creator><![CDATA[Mikhail Kashkin]]></dc:creator><pubDate>Tue, 02 May 2023 20:42:16 GMT</pubDate><content:encoded><![CDATA[<p>Я стараюсь уменьшить и сократить по максимуму написание кода. Это может звучать странно, но в этом есть логика.</p>
<p>Мое намеренье построить большой успешный продуктовый бизнес. Но как собственник и как владелец компании, я не могу выполнять все время ту работу, которую надо делегировать. Писать код мне нравится, это то, от чего я получаю большое удовольствие, но пока я пишу код увеличивается количество кода, а не компания.</p>
<p>Растить компанию и принимать управленческие решения гораздо сложнее чем писать код. Но компания от этого растет.</p>
<p>Есть такая фраза, которая звучит как закон "Легкие решения — тяжелая жизнь, тяжелые решения — легкая жизнь". Для меня сейчас оказаться от написания кода — это невероятно сложное решение. Но это сложное решение должно фундаментально поменять жизнь меня и моей компании.</p>
<p>Сегодня я буквально все свободные ресурсы трачу на то, чтобы не писать код. Пока надо привыкнуть к тому, чтобы этого не делать. Сергей, выпускник наших курсов и теперь наш сотрудник, сейчас дописывает участок кода, который я начал делать на выходных и, делая который, я осознал, что я мешаю своей компании расти.</p>
<p>У <a target="_blank" href="https://www.okumy.com/">Okumy</a> будет большое будущее тогда, когда я перестану делать то, что мне удобно, и начну делать то, что нужно для бизнеса. И вот сейчас я ищу силы чтобы не открыть редактор и не внести исправления. Мне надо еще раз напомнить себе, что я сильный, что я могу трансформироваться для того, чтобы достигать успеха.</p>
<p>И когда я немного адаптируюсь к своей роли, то у меня будет больше сил делать важные вещи. Принимать решения, встречаться с партнерами, клиентами, инвесторами. Этим всем невозможно заняться пока я пишу код.</p>
]]></content:encoded></item><item><title><![CDATA[Новая версия Okumy 1.9]]></title><description><![CDATA[Мы закрыли новую веху в разработке Okumy. Что это такое и что у нас получилось?
В разработке удобно разбивать работу на какие-то отдельные части. Например, от забора и до обеда. Так проще планировать, ставить приоритеты, распределять задачи. Если вы,...]]></description><link>https://myblog.ru/okumy-19</link><guid isPermaLink="true">https://myblog.ru/okumy-19</guid><category><![CDATA[chatgpt]]></category><category><![CDATA[okumy]]></category><dc:creator><![CDATA[Mikhail Kashkin]]></dc:creator><pubDate>Tue, 18 Apr 2023 11:43:24 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1681818549028/8da563c9-54c8-44c1-bcac-7f026bd95533.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Мы закрыли новую веху в разработке <a target="_blank" href="https://www.okumy.com/">Okumy</a>. Что это такое и что у нас получилось?</p>
<p>В разработке удобно разбивать работу на какие-то отдельные части. Например, от забора и до обеда. Так проще планировать, ставить приоритеты, распределять задачи. Если вы, условно, планируете запустить ракету, то сначала вы делаете так чтобы она хоть как-то взлетела. Пусть даже и взорвется.</p>
<p>Процесс достижения больших целей итеративный. То есть шаг, потом еще и еще. И вот наша задача была выпустить новый редактор вместо старого.</p>
<p>Когда мы начинали разработку, то сделали очень быстро редактор. В каком-то смысле мы попытались поиграться с технологиями и получилось более технологично чем нам надо было. И в какой-то момент из-за технологической перегруженности разработка застопорилась. Для спецов: мы сделали SPA на Vue.js с большим и ветвистым API. И когда дошли до точки, что надо добавить организации (группы или коллективы) для совместной работы, то стало понятно, что мы просто не можем это сделать быстро. Надо переделывать весь интерфейс, очень много всего.</p>
<p>При том что мы сами работали над контентом курса в группе. Я дал всем сотрудникам свой логин и пароль и надеялся, что никто не сделает каких-то ошибок. В общем тот еще сервис.</p>
<p>Стало понятно, что проще сделать шаг назад и переделать с нуля часть того, что уже было. Это действительно оказалось продуктивнее, минимум с эмоциональной точки зрения. Повторяя второй раз работу, она получается быстрее и ощущение прогресса окрыляет.</p>
<p>Мы заново сделали весь редактор курсов. Не доделали буквально несколько кусочков из тех вещей которые были раньше, но и по поводу них есть сомнения. Как минимум их стоит переосмыслить.</p>
<p>Что конкретно мы сделали:</p>
<ul>
<li><p>Добавили понятие организаций и ролей. Теперь вы можете совместно работать над проектом с другими людьми. Можно распределять роли с коллегами и выдавать доступ в зависимости от задач.</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1681817182568/32b94a4f-d73e-4460-80b5-d33557e17154.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Сделали новые карточки студентов. Теперь можно посмотреть прогресс по курсам.</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1681817199452/d8e1689c-47a5-497f-90ee-e9ed1d5877b6.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Сделали более удобное управление контентом курса. Теперь можно перетаскивать уроки между блоками или целые блоки. Если что-то поменялось, то появится кнопка сохранить изменения.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1681817372035/dec7508d-74fd-4afa-b044-dce0caabc869.gif" alt class="image--center mx-auto" /></p>
<ul>
<li><p>Загрузка видео и до этого была хорошо сделана, но сейчас стала еще лучше и удобнее. Информация о видео с удобной карточкой и лучшим загрузчиком, который позволяет даже ставить на паузу загрузку или повторно отправлять файлы в случае ошибки и позволяет сразу 10 видео загружать одновременно.</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1681817679122/d890822d-f15f-44bb-99a1-fde65aff0212.gif" alt class="image--center mx-auto" /></p>
</li>
<li><p>Сделали генерацию контента курса и уроков с помощью ИИ (используем #ChatGPT). Будем еще расширять возможности, уже понятно, что можно еще добавить кучу интересных фишек.</p>
</li>
<li><div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/XOxyvwfqQEQ">https://youtu.be/XOxyvwfqQEQ</a></div>
<p> </p>
</li>
</ul>
<p>Мы сделали сложный выбор в пользу визуального Markdown редактора, а не просто визуального. Специально для того, чтобы в будущем можно было эффективно конвертировать контент уроков под мобильную версию. Но скорее всего мы предоставим выбор какой редактор использовать и добавим поддержку еще одного или придумаем какое-то еще решение.</p>
<p>На самом деле это далеко не все что мы сделали. Но об этом хочется написать еще отдельно. Если вы ищите <a target="_blank" href="https://www.okumy.com/">сайт, на котором можно запустить свои курсы онлайн</a>, то регистрируйтесь у нас на сайте и запускайте свои онлайн курсы.</p>
]]></content:encoded></item></channel></rss>