- Konu sahibi
- #1
Sembolik bağlantı, hedef dosyanın içeriği değil, hedefe giden yol bilgisidir. Bu nedenle aktarım sırasında bağlantının kendisini korumak istiyorsanız bağlantıyı sembolik bağlantı olarak kopyalamalı; hedef dosyanın içeriğini de taşımak istiyorsanız bağlantıyı çözerek gerçek dosyayı aktarmalısınız. Yanlış seçim, aktarım sonrasında kırık bağlantılara, gereksiz kopyalara veya beklenmeyen dizin içeriğine yol açabilir.
Örneğin
Önce bağlantının amacını belirleyin. Yayın dizinlerinde kullanılan
Bir bağlantının hedefi göreli ise, örneğin
Linux sunucular arasında aktarımda, bağlantıyı korumak için arşivleme davranışıyla birlikte
Bağlantının gösterdiği içeriği kopyalamak istiyorsanız rsync komutuna
Arşiv aracının belgelerindeki varsayılanı kontrol edin. Örneğin GNU tar, normalde sembolik bağlantının kendisini saklar; -h/--dereference verilmesi hedefi izlemesine yol açar. Başka bütün arşiv araçlarının aynı davranacağını varsaymayın. Bağlantıyı çözme seçeneği kullanılırsa arşive bağlantı yerine hedef içeriği girer. Arşivi başka sunucuda açmadan önce içindeki bağlantı hedeflerini listeleyin; özellikle mutlak yolların yeni sunucuda geçerli olduğundan emin olun.
SFTP ve FTP istemcilerinde sembolik bağlantı desteği sunucuya, istemciye ve yapılandırmaya göre değişebilir. İstemci bağlantıyı normal dosya gibi indirebilir, yalnızca bağlantı bilgisini gösterebilir veya bağlantıyı takip edebilir. Sembolik bağlantıların kesin olarak korunması gerekiyorsa aktarım biçiminizin bağlantı meta verisini desteklediğini doğrulayın; aksi durumda arşiv veya rsync gibi davranışı açıkça seçilebilen bir yöntem kullanın.
Bir bağlantı aktarım sonrasında kırık görünüyorsa hemen aynı adlı gerçek bir dizin veya dosya oluşturmayın. Önce
Bağlantıyı koruyarak aktarım yaptıysanız hedef dosya veya dizini ayrıca taşıyın ya da hedefteki yol yapısını oluşturun. İçeriğin tek pakette bulunması gerekiyorsa aktarımı bağlantıyı çözecek şekilde yeniden planlayın.
Örneğin
/var/www/site/current bağlantısı /var/www/site/releases/rev-001 dizinine işaret ediyorsa, bağlantıyı koruyan aktarım hedefte yine current adlı bir bağlantı oluşturur. Bağlantıyı çözen aktarım ise sürüm dizininin içeriğini current altında gerçek dosyalar olarak kopyalar.Hangi davranışı seçmelisiniz?
Önce bağlantının amacını belirleyin. Yayın dizinlerinde kullanılan
current, public veya benzeri sürüm işaretçileri genellikle korunmalıdır. Tek başına taşınacak bir arşiv, yedek veya uygulama paketi hazırlanıyorsa hedef dosyanın içeriğini dahil etmek daha uygun olabilir.| Amaç | Tercih | Sonuç |
|---|---|---|
| Sunucudaki dizin yapısını aynen taşımak | Bağlantıyı koru | Hedefte yine sembolik bağlantı oluşur |
| Bağlantının gösterdiği içeriği pakete dahil etmek | Bağlantıyı çöz | Gerçek dosya veya dizin kopyalanır |
| Yalnızca bağlantı listesini incelemek | Hedefi kopyalama | Bağlantının yolu ayrıca doğrulanır |
Bir bağlantının hedefi göreli ise, örneğin
../releases/current, hedefteki dizin yapısı değiştiğinde bağlantı bozulabilir. Mutlak hedefler de kaynak sunucudaki yolu gösterebilir ve yeni sunucuda aynı yol bulunmayabilir. Bu yüzden aktarım öncesinde bağlantıları ve hedeflerini listeleyin.Rsync ile aktarım
Linux sunucular arasında aktarımda, bağlantıyı korumak için arşivleme davranışıyla birlikte
rsync kullanılabilir:- Kaynak dizindeki bağlantıları ve hedeflerini kontrol edin:
find /var/www/site -type l -printf '%p -> %l\n'. - Önce
rsync -an --itemize-changes source/ [email protected]:/var/www/site/ile yazmadan kapsamı inceleyin. Sonuç doğruysa bağlantıları koruyarak aktarın:rsync -a source/ [email protected]:/var/www/site/. Buradaki sondaki/, kaynak dizinin içeriğinin hedefe aktarılmasını sağlar. - Aktarım sonrasında hedefte aynı listeleme komutunu çalıştırın ve bağlantı yollarını kaynakla karşılaştırın.
- Bağlantının gerçekten çalıştığını, hedefteki ilgili uygulama kullanıcısının yetkileriyle test edin.
Bağlantının gösterdiği içeriği kopyalamak istiyorsanız rsync komutuna
-L seçeneği eklenir: rsync -aL source/ [email protected]:/var/www/site/. Bu seçim, özellikle bağlantı bir dizini gösteriyorsa kaynak ağacının dışındaki dosyaları da aktarabilir. Yetkiniz dışındaki veya gizli içeriğin bu yolla pakete eklenmesine izin vermeyin; önce kuru çalışmanın kapsamını inceleyin. Büyük dizinlerde aktarım öncesi kapsamı kontrol edin.Arşiv veya SFTP kullanırken
Arşiv aracının belgelerindeki varsayılanı kontrol edin. Örneğin GNU tar, normalde sembolik bağlantının kendisini saklar; -h/--dereference verilmesi hedefi izlemesine yol açar. Başka bütün arşiv araçlarının aynı davranacağını varsaymayın. Bağlantıyı çözme seçeneği kullanılırsa arşive bağlantı yerine hedef içeriği girer. Arşivi başka sunucuda açmadan önce içindeki bağlantı hedeflerini listeleyin; özellikle mutlak yolların yeni sunucuda geçerli olduğundan emin olun.
SFTP ve FTP istemcilerinde sembolik bağlantı desteği sunucuya, istemciye ve yapılandırmaya göre değişebilir. İstemci bağlantıyı normal dosya gibi indirebilir, yalnızca bağlantı bilgisini gösterebilir veya bağlantıyı takip edebilir. Sembolik bağlantıların kesin olarak korunması gerekiyorsa aktarım biçiminizin bağlantı meta verisini desteklediğini doğrulayın; aksi durumda arşiv veya rsync gibi davranışı açıkça seçilebilen bir yöntem kullanın.
Aktarım sonrası kontrol ve yaygın hatalar
- Hedefte bağlantı türünü kontrol edin:
test -L /var/www/site/current && readlink /var/www/site/current. Başarılı durumda komut bağlantının hedef yolunu yazdırır. - Hedef yolunun gerçekten var olup olmadığını kontrol edin:
test -e /var/www/site/current. Komut çıktı vermeden başarılı oluyorsa hedef kullanılabilir durumdadır; başarısızsa bağlantı kırık olabilir. - Göreli bağlantıların hedefte aynı dizin bağlamına sahip olduğunu doğrulayın. Kaynakta çalışan bir
../yolu, farklı yerleşimde çalışmayabilir. - Bağlantıyı izleyen kopyalama nedeniyle kaynak dışındaki bir dizinin veya büyük bir sürüm arşivinin aktarılmadığını kontrol edin.
- Hedefte uygulama kullanıcısı, hedef dosyaya ve yol üzerindeki gerekli dizinlere erişebiliyor mu test edin. Linux’ta sıradan sembolik bağlantının kendi izin bitleri çoğunlukla erişim kararını belirlemez; hedef ve dizin geçiş izinleri önemlidir. Dosya var olsa bile dizin geçiş izni yoksa uygulama içeriği okuyamaz.
Bir bağlantı aktarım sonrasında kırık görünüyorsa hemen aynı adlı gerçek bir dizin veya dosya oluşturmayın. Önce
readlink ile kaydedilmiş hedefi, kaynak ve hedef dizin yapısını, ardından izinleri karşılaştırın. Sonraki adım; hedef yolu düzeltmek, eksik hedef içeriğini ayrıca aktarmak veya bağlantıyı bilinçli olarak gerçek dosyalarla değiştirmek olmalıdır.Kaynaklar
Sık sorulan sorular
Sembolik bağlantı ile normal dosya nasıl ayırt edilir?
test -L dosya sembolik bağlantıyı kontrol eder. ls -l çıktısındaki -> işareti de bağlantının hedefini gösterir. Bağlantının hedefi bulunamasa bile bağlantı nesnesi varlığını sürdürebilir.Bağlantının hedefi aktarılmıyorsa ne yapmalıyım?
Bağlantıyı koruyarak aktarım yaptıysanız hedef dosya veya dizini ayrıca taşıyın ya da hedefteki yol yapısını oluşturun. İçeriğin tek pakette bulunması gerekiyorsa aktarımı bağlantıyı çözecek şekilde yeniden planlayın.